[med-svn] [easel] 01/02: New upstream version 0.43
Michael Crusoe
misterc-guest at moszumanska.debian.org
Wed Apr 19 19:42:41 UTC 2017
This is an automated email from the git hooks/post-receive script.
misterc-guest pushed a commit to branch master
in repository easel.
commit 18ea3e89b19362bc3cbe95577169b120c459b020
Author: Michael R. Crusoe <michael.crusoe at gmail.com>
Date: Wed Apr 19 04:28:37 2017 -0700
New upstream version 0.43
---
00CHECKLIST | 197 +
00README | 32 +
BUGTRAX | 205 +
INSTALL | 31 +
LICENSE | 54 +
LICENSE.sh.in | 5 +
LICENSE.tag | 7 +
Makefile.in | 594 +
aclocal.m4 | 867 ++
config.guess | 1459 ++
config.sub | 1549 ++
configure.ac | 565 +
demotic/00README | 101 +
demotic/blast2profmark | 10 +
demotic/blast2tbl | 10 +
demotic/demotic_blast.pm | 286 +
demotic/demotic_fasta.pm | 384 +
demotic/demotic_h2.pm | 190 +
demotic/demotic_hmmer.pm | 218 +
demotic/demotic_infernal_tab.pm | 177 +
demotic/examples/example-single-psiquery.fa | 7 +
demotic/examples/example-single.asnt | 9215 ++++++++++++
demotic/examples/example-single.fa | 1159 ++
demotic/examples/example-single.fa.phr | Bin 0 -> 14371 bytes
demotic/examples/example-single.fa.pin | Bin 0 -> 1344 bytes
demotic/examples/example-single.fa.psq | Bin 0 -> 56196 bytes
demotic/examples/example-single.pbl | 1748 +++
demotic/examples/example-single.sto | 344 +
demotic/examples/example.fa | 12 +
demotic/examples/example.fasta.out | 5870 ++++++++
demotic/examples/example.h2.out | 4234 ++++++
demotic/examples/example.hmm | 845 ++
demotic/examples/example.hmm2 | 1469 ++
demotic/examples/example.hmmsearch.out | 17949 +++++++++++++++++++++++
demotic/examples/example.ncbi-blastp.out | 437 +
demotic/examples/example.phmmer.out | 3477 +++++
demotic/examples/example.psiblast.out | 4544 ++++++
demotic/examples/example.ssearch.out | 5812 ++++++++
demotic/examples/example.sto | 552 +
demotic/examples/example.wu-blastp.out | 7086 +++++++++
demotic/fasta2profmark | 11 +
demotic/fasta2tbl | 10 +
demotic/h22profmark | 10 +
demotic/h22tbl | 10 +
demotic/hmmer2profmark | 10 +
demotic/hmmer2tbl | 10 +
demotic/infernal_tab2gff.pl | 269 +
demotic/regress/fasta-profmark.out | 180 +
demotic/regress/fasta-tbl.out | 180 +
demotic/regress/h2-profmark.out | 170 +
demotic/regress/h2-tbl.out | 170 +
demotic/regress/hmmsearch-profmark.out | 930 ++
demotic/regress/hmmsearch-tbl.out | 972 ++
demotic/regress/ncbi-blastp-profmark.out | 19 +
demotic/regress/ncbi-blastp-tbl.out | 19 +
demotic/regress/phmmer-profmark.out | 221 +
demotic/regress/phmmer-tbl.out | 261 +
demotic/regress/psiblast-profmark.out | 139 +
demotic/regress/psiblast-tbl.out | 139 +
demotic/regress/ssearch-profmark.out | 165 +
demotic/regress/ssearch-tbl.out | 165 +
demotic/regress/wu-blastp-profmark.out | 506 +
demotic/regress/wu-blastp-tbl.out | 369 +
demotic/test.pl | 15 +
devkit/00README | 5 +
devkit/autodoc | 315 +
devkit/c2optlist | 58 +
devkit/cexcerpt | 100 +
devkit/cexcerpt.man | 73 +
devkit/ctags-fix | 25 +
devkit/esl-dependencies | 155 +
devkit/man2optlist | 41 +
devkit/rmanprocess.pl | 77 +
devkit/sedition | 67 +
devkit/sedition-pp | 89 +
devkit/sqc | 701 +
documentation/Makefile.in | 205 +
documentation/codestyle.tex | 1872 +++
documentation/copyright.tex | 20 +
documentation/doctricks.tex | 49 +
documentation/figures/evd_basic.pdf | Bin 0 -> 32077 bytes
documentation/figures/evd_location.pdf | Bin 0 -> 32436 bytes
documentation/figures/evd_scale.pdf | Bin 0 -> 31829 bytes
documentation/figures/gev_density.pdf | Bin 0 -> 10631 bytes
documentation/figures/gev_logdensity.pdf | Bin 0 -> 15656 bytes
documentation/figures/rna_elements.ai | 851 ++
documentation/figures/rna_elements.eps | 6594 +++++++++
documentation/figures/rna_elements.pdf | Bin 0 -> 15711 bytes
documentation/figures/rnaseP-bsu-alignment.ai | 592 +
documentation/figures/rnaseP-bsu-alignment.eps | 11407 ++++++++++++++
documentation/figures/rnaseP-bsu-alignment.pdf | Bin 0 -> 23150 bytes
documentation/figures/rnaseP-ecoli.ai | 958 ++
documentation/figures/rnaseP-ecoli.eps | 12990 ++++++++++++++++
documentation/figures/rnaseP-ecoli.pdf | Bin 0 -> 21786 bytes
documentation/format_a2m.tex | 110 +
documentation/format_ncbi.tex | 271 +
documentation/format_stockholm.tex | 252 +
documentation/format_wuss.tex | 216 +
documentation/install.tex | 18 +
documentation/installation.tex | 5 +
documentation/intro.tex | 416 +
documentation/macros.tex | 70 +
documentation/main.tex | 614 +
documentation/statistics.tex | 103 +
documentation/titlepage.tex | 31 +
documentation/typography.tex | 31 +
easel.c | 2338 +++
easel.h | 498 +
easel.tex | 413 +
esl_alphabet.c | 2553 ++++
esl_alphabet.h | 129 +
esl_alphabet.tex | 501 +
esl_avx.c | 24 +
esl_avx.h | 107 +
esl_buffer.c | 3227 ++++
esl_buffer.h | 111 +
esl_buffer.tex | 456 +
esl_cluster.c | 345 +
esl_cluster.h | 16 +
esl_cluster.tex | 53 +
esl_composition.c | 150 +
esl_composition.h | 4 +
esl_config.h.in | 155 +
esl_dirichlet.c | 1684 +++
esl_dirichlet.h | 78 +
esl_dirichlet.tex | 63 +
esl_distance.c | 1648 +++
esl_distance.h | 77 +
esl_distance.tex | 149 +
esl_dmatrix.c | 1593 ++
esl_dmatrix.h | 89 +
esl_dmatrix.tex | 187 +
esl_dsqdata.c | 1700 +++
esl_dsqdata.h | 141 +
esl_dsqdata.tex | 332 +
esl_exponential.c | 699 +
esl_exponential.h | 52 +
esl_exponential.tex | 41 +
esl_fileparser.c | 805 +
esl_fileparser.h | 41 +
esl_fileparser.tex | 97 +
esl_gamma.c | 839 ++
esl_gamma.h | 48 +
esl_gamma.tex | 53 +
esl_gencode.c | 1182 ++
esl_gencode.h | 88 +
esl_getopts.c | 2170 +++
esl_getopts.h | 121 +
esl_getopts.tex | 668 +
esl_gev.c | 996 ++
esl_gev.h | 50 +
esl_gev.tex | 205 +
esl_gumbel.c | 1420 ++
esl_gumbel.h | 50 +
esl_gumbel.tex | 624 +
esl_heap.c | 343 +
esl_heap.h | 44 +
esl_histogram.c | 2070 +++
esl_histogram.h | 130 +
esl_histogram.tex | 299 +
esl_hmm.c | 812 +
esl_hmm.h | 58 +
esl_hyperexp.c | 1418 ++
esl_hyperexp.h | 75 +
esl_hyperexp.tex | 37 +
esl_keyhash.c | 853 ++
esl_keyhash.h | 64 +
esl_keyhash.tex | 89 +
esl_mem.c | 825 ++
esl_mem.h | 27 +
esl_minimizer.c | 654 +
esl_minimizer.h | 29 +
esl_minimizer.tex | 13 +
esl_mixgev.c | 834 ++
esl_mixgev.h | 63 +
esl_mpi.c | 1238 ++
esl_mpi.h | 74 +
esl_mpi.tex | 24 +
esl_msa.c | 3740 +++++
esl_msa.h | 211 +
esl_msa.tex | 282 +
esl_msa_testfiles/a2m/a2m.good.1 | 16 +
esl_msa_testfiles/a2m/a2m.good.2 | 15 +
esl_msa_testfiles/afa/afa.good.1 | 16 +
esl_msa_testfiles/afa/afa.good.2 | 15 +
esl_msa_testfiles/afa/afa.good.3 | 24 +
esl_msa_testfiles/clustal/clustal.good.1 | 20 +
esl_msa_testfiles/clustal/clustal.good.2 | 15 +
esl_msa_testfiles/phylip/phylip.ambig.1 | 9 +
esl_msa_testfiles/phylip/phylip.bad.1 | 3 +
esl_msa_testfiles/phylip/phylip.bad.10 | 6 +
esl_msa_testfiles/phylip/phylip.bad.11 | 7 +
esl_msa_testfiles/phylip/phylip.bad.2 | 3 +
esl_msa_testfiles/phylip/phylip.bad.3 | 3 +
esl_msa_testfiles/phylip/phylip.bad.4 | 3 +
esl_msa_testfiles/phylip/phylip.bad.5 | 2 +
esl_msa_testfiles/phylip/phylip.bad.6 | 3 +
esl_msa_testfiles/phylip/phylip.bad.7 | 3 +
esl_msa_testfiles/phylip/phylip.bad.8 | 3 +
esl_msa_testfiles/phylip/phylip.bad.9 | 3 +
esl_msa_testfiles/phylip/phylip.good.1 | 12 +
esl_msa_testfiles/phylip/phylip.good.2 | 8 +
esl_msa_testfiles/phylip/phylip.good.3 | 28 +
esl_msa_testfiles/phylips/phylips.good.1 | 11 +
esl_msa_testfiles/phylips/phylips.good.2 | 17 +
esl_msa_testfiles/psiblast/psiblast.good.1 | 14 +
esl_msa_testfiles/psiblast/psiblast.good.2 | 11 +
esl_msa_testfiles/selex/00MANIFEST | 24 +
esl_msa_testfiles/selex/selex.bad.1 | 4 +
esl_msa_testfiles/selex/selex.bad.10 | 16 +
esl_msa_testfiles/selex/selex.bad.11 | 15 +
esl_msa_testfiles/selex/selex.bad.12 | 15 +
esl_msa_testfiles/selex/selex.bad.13 | 15 +
esl_msa_testfiles/selex/selex.bad.14 | 14 +
esl_msa_testfiles/selex/selex.bad.2 | 10 +
esl_msa_testfiles/selex/selex.bad.3 | 7 +
esl_msa_testfiles/selex/selex.bad.4 | 10 +
esl_msa_testfiles/selex/selex.bad.5 | 11 +
esl_msa_testfiles/selex/selex.bad.6 | 8 +
esl_msa_testfiles/selex/selex.bad.7 | 12 +
esl_msa_testfiles/selex/selex.bad.8 | 8 +
esl_msa_testfiles/selex/selex.bad.9 | 14 +
esl_msa_testfiles/selex/selex.good.1 | 5 +
esl_msa_testfiles/selex/selex.good.2 | 37 +
esl_msa_testfiles/selex/selex.good.3 | 27 +
esl_msa_testfiles/selex/selex.good.4 | 19 +
esl_msa_testfiles/stockholm/stockholm.bad.1 | 1 +
esl_msa_testfiles/stockholm/stockholm.bad.2 | 7 +
esl_msa_testfiles/stockholm/stockholm.bad.3 | 7 +
esl_msa_testfiles/stockholm/stockholm.bad.4 | 4 +
esl_msa_testfiles/stockholm/stockholm.bad.5 | 4 +
esl_msa_testfiles/stockholm/stockholm.bad.6 | 7 +
esl_msa_testfiles/stockholm/stockholm.bad.7 | 7 +
esl_msa_testfiles/stockholm/stockholm.bad.8 | 5 +
esl_msa_testfiles/stockholm/stockholm.good.1 | 96 +
esl_msacluster.c | 430 +
esl_msacluster.h | 18 +
esl_msacluster.tex | 33 +
esl_msafile.c | 1492 ++
esl_msafile.h | 145 +
esl_msafile.md | 181 +
esl_msafile2.c | 1481 ++
esl_msafile2.h | 86 +
esl_msafile_a2m.c | 1049 ++
esl_msafile_a2m.h | 18 +
esl_msafile_afa.c | 732 +
esl_msafile_afa.h | 18 +
esl_msafile_clustal.c | 1075 ++
esl_msafile_clustal.h | 18 +
esl_msafile_phylip.c | 1914 +++
esl_msafile_phylip.h | 19 +
esl_msafile_psiblast.c | 819 ++
esl_msafile_psiblast.h | 17 +
esl_msafile_selex.c | 1254 ++
esl_msafile_selex.h | 18 +
esl_msafile_stockholm.c | 2749 ++++
esl_msafile_stockholm.h | 15 +
esl_msashuffle.c | 514 +
esl_msashuffle.h | 31 +
esl_msaweight.c | 1120 ++
esl_msaweight.h | 21 +
esl_msaweight.tex | 53 +
esl_normal.c | 348 +
esl_normal.h | 22 +
esl_normal.tex | 24 +
esl_paml.c | 184 +
esl_paml.h | 25 +
esl_paml.tex | 4 +
esl_random.c | 1279 ++
esl_random.h | 61 +
esl_random.tex | 127 +
esl_randomseq.c | 2118 +++
esl_randomseq.h | 65 +
esl_randomseq.tex | 79 +
esl_ratematrix.c | 822 ++
esl_ratematrix.h | 31 +
esl_ratematrix.tex | 3 +
esl_recorder.c | 1141 ++
esl_recorder.h | 88 +
esl_regexp.c | 1912 +++
esl_regexp.h | 73 +
esl_regexp.tex | 386 +
esl_rootfinder.c | 542 +
esl_rootfinder.h | 54 +
esl_rootfinder.tex | 43 +
esl_scorematrix.c | 2299 +++
esl_scorematrix.h | 77 +
esl_scorematrix.tex | 51 +
esl_sq.c | 2815 ++++
esl_sq.h | 211 +
esl_sq.tex | 304 +
esl_sqio.c | 2438 +++
esl_sqio.h | 189 +
esl_sqio.tex | 281 +
esl_sqio_ascii.c | 3411 +++++
esl_sqio_ascii.h | 102 +
esl_sqio_ncbi.c | 3295 +++++
esl_sqio_ncbi.h | 110 +
esl_sse.c | 623 +
esl_sse.h | 241 +
esl_sse.tex | 39 +
esl_ssi.c | 2050 +++
esl_ssi.h | 163 +
esl_ssi.tex | 451 +
esl_stack.c | 1170 ++
esl_stack.h | 74 +
esl_stack.tex | 89 +
esl_stats.c | 1171 ++
esl_stats.h | 142 +
esl_stats.tex | 43 +
esl_stopwatch.c | 420 +
esl_stopwatch.h | 61 +
esl_stopwatch.tex | 117 +
esl_stretchexp.c | 693 +
esl_stretchexp.h | 52 +
esl_stretchexp.tex | 41 +
esl_swat.c | 225 +
esl_swat.tex | 1 +
esl_threads.c | 434 +
esl_threads.h | 41 +
esl_tree.c | 2191 +++
esl_tree.h | 123 +
esl_tree.tex | 31 +
esl_vectorops.c | 1460 ++
esl_vectorops.h | 128 +
esl_vectorops.tex | 55 +
esl_vmx.c | 568 +
esl_vmx.h | 171 +
esl_weibull.c | 743 +
esl_weibull.h | 53 +
esl_weibull.tex | 47 +
esl_workqueue.c | 564 +
esl_workqueue.h | 44 +
esl_wuss.c | 872 ++
esl_wuss.h | 19 +
esl_wuss.tex | 34 +
formats/BLOSUM62 | 31 +
formats/embl | 118 +
formats/fasta | 13 +
formats/fasta.2 | 19 +
formats/fasta.bad.1 | 2 +
formats/fasta.bad.2 | 1 +
formats/fasta.bad.3 | 1 +
formats/fasta.odd.1 | 2 +
formats/genbank | 55 +
formats/genbank.2 | 52 +
formats/genbank.bad.1 | 55 +
formats/stockholm.1 | 5 +
formats/uniprot | 192 +
formats/wag.dat | 43 +
install-sh | 295 +
interface_gsl.c | 60 +
interface_gsl.h | 24 +
interface_lapack.c | 91 +
interface_lapack.h | 24 +
makeTAGS.sh | 15 +
miniapps/Makefile.in | 152 +
miniapps/esl-afetch.c | 373 +
miniapps/esl-afetch.itest.pl | 147 +
miniapps/esl-afetch.man | 128 +
miniapps/esl-alimanip.c | 3328 +++++
miniapps/esl-alimanip.itest.pl | 354 +
miniapps/esl-alimanip.man | 344 +
miniapps/esl-alimap.c | 687 +
miniapps/esl-alimap.itest.pl | 143 +
miniapps/esl-alimap.man | 193 +
miniapps/esl-alimask.c | 1212 ++
miniapps/esl-alimask.itest.pl | 322 +
miniapps/esl-alimask.man | 580 +
miniapps/esl-alimerge.c | 1810 +++
miniapps/esl-alimerge.itest.pl | 211 +
miniapps/esl-alimerge.man | 179 +
miniapps/esl-alipid.c | 92 +
miniapps/esl-alipid.man | 106 +
miniapps/esl-alirev.c | 87 +
miniapps/esl-alirev.man | 127 +
miniapps/esl-alistat.c | 1153 ++
miniapps/esl-alistat.itest.pl | 233 +
miniapps/esl-alistat.man | 234 +
miniapps/esl-cluster.c | 212 +
miniapps/esl-compalign.c | 581 +
miniapps/esl-compalign.itest.pl | 110 +
miniapps/esl-compalign.man | 147 +
miniapps/esl-compstruct.c | 337 +
miniapps/esl-compstruct.man | 122 +
miniapps/esl-construct.c | 709 +
miniapps/esl-construct.itest.pl | 160 +
miniapps/esl-construct.man | 179 +
miniapps/esl-histplot.c | 284 +
miniapps/esl-histplot.man | 80 +
miniapps/esl-mask.c | 225 +
miniapps/esl-mask.itest.pl | 93 +
miniapps/esl-mask.man | 173 +
miniapps/esl-reformat.c | 948 ++
miniapps/esl-reformat.man | 224 +
miniapps/esl-selectn.c | 117 +
miniapps/esl-selectn.man | 76 +
miniapps/esl-seqrange.c | 165 +
miniapps/esl-seqrange.itest.pl | 143 +
miniapps/esl-seqrange.man | 67 +
miniapps/esl-seqstat.c | 258 +
miniapps/esl-seqstat.man | 113 +
miniapps/esl-sfetch.c | 489 +
miniapps/esl-sfetch.man | 290 +
miniapps/esl-shuffle.c | 394 +
miniapps/esl-shuffle.itest.pl | 54 +
miniapps/esl-shuffle.man | 231 +
miniapps/esl-ssdraw.c | 7485 ++++++++++
miniapps/esl-ssdraw.itest.pl | 644 +
miniapps/esl-ssdraw.man | 830 ++
miniapps/esl-translate.c | 215 +
miniapps/esl-translate.itest.pl | 149 +
miniapps/esl-translate.man | 293 +
miniapps/esl-weight.c | 139 +
miniapps/esl-weight.man | 111 +
testsuite/Makefile.in | 70 +
testsuite/coverage_report.pl | 134 +
testsuite/e2.sh | 37 +
testsuite/i1-degen-residues.pl | 99 +
testsuite/i2-ncbi-indices.pl | 147 +
testsuite/i3-blank-gf.pl | 95 +
testsuite/testsuite.sqc | 151 +
testsuite/trna-5.stk | 16 +
testsuite/trna-ssdraw.ps | 181 +
testsuite/valgrind_report.pl | 107 +
425 files changed, 247042 insertions(+)
diff --git a/00CHECKLIST b/00CHECKLIST
new file mode 100644
index 0000000..0cb0235
--- /dev/null
+++ b/00CHECKLIST
@@ -0,0 +1,197 @@
+THIS CHECKLIST IS OUT OF DATE
+UPDATE TO NEW GIT FLOW BEFORE USING!
+SRE, Mon May 2 17:10:01 2016
+
+
+Checklist for an Easel release
+SRE, Mon Mar 24 10:39:52 2008
+-------------------------------------------------
+When editing this 00CHECKLIST, edit it in the trunk, not in a release
+branch; it isn't included in releases anyway.
+
+Subversion repository: https://svn.janelia.org/eddylab/eddys/easel
+Trunk: https://svn.janelia.org/eddylab/eddys/easel/trunk/
+
+
+Easel follows an 'unstable trunk' policy.
+Each major release goes onto a stable branch.
+Every release (even minor ones) is tagged.
+
+Release types: major releases, minor releases, and snapshots. A major
+release gets its own branch. A minor release puts bug fixes into a
+major branch. A snapshot is from the development trunk.
+
+Version naming: example
+major <lineage>.<major-release> 2.1
+minor <lineage>.<major-release>.<minor-release> 2.1.1
+alpha <lineage>.<major-release>a<n> 2.1a1
+beta <lineage>.<major-release>b<n> 2.1b1
+snapshot <lineage>.<major-release>.snap<yyyymmdd> 2.1.snap20080325
+
+When Easel is bundled into part of a larger release, it gets the
+version of the larger release with a one-letter prefix indicating
+which package bundled it: for example, for HMMER 3.0a1, Easel would be
+versioned as version "h3.0a1".
+
+
+1. Announce intent to release to all developers.
+ Commit working copies on all machines.
+ Check for stray uncommitted files:
+ ./configure
+ make distclean
+ svn update
+ svn status
+ Clean up any stray files identified by 'svn status'.
+ 'svn add' and 'svn commit' as needed to commit new or modified files.
+
+
+2. For a major release (where we're about to create a new branch):
+ First test the development trunk.
+ Compile should be entirely clean when compiled -Wall.
+ 'make check' should be clean.
+ '(cd documentation; make)' should work
+ 'make REPOSITORY=https://svn.janelia.org/eddylab/eddys/easel/trunk RELEASE=snapxxx dist' should work.
+
+ When trunk is clean,
+ svn commit
+ We're (usually) next going to move out of the trunk to the release branch.
+
+
+3. For a major release, create stable release branch from the trunk.
+ All subsequent bugfix releases will happen in this branch, while trunk keeps moving.
+
+ svn copy https://svn.janelia.org/eddylab/eddys/easel/trunk\
+ https://svn.janelia.org/eddylab/eddys/easel/branches/0.1\
+ -m "created 0.1 release branch"
+
+
+4. Move into working copy of the release.
+
+ For a dev snapshot, this is the normal working copy.
+ For a major or minor release, this is a working copy of the appropriate branch:
+ cd ~/releases
+ svn checkout https://svn.janelia.org/eddylab/eddys/easel/branches/0.1 easel
+
+ Don't call this working directory "easel-xx"; just call it "easel",
+ because later "make dist" is going to try to create "easel-xx" as
+ the actual release directory.
+
+5. Test.
+
+
+6. Write the release notes.
+ For the first time on a new release branch, it's handy to look
+ at the svn log. Replace "1534" below with the last release's SVN rev.
+ svn log -r 1534:HEAD | more
+ emacs documentation/release-notes/RELEASE-${RELEASE}
+ svn add documentation/release-notes/RELEASE-${RELEASE}
+
+ These release notes will be merged back into the trunk later, if
+ we're in a branch.
+
+
+7. Update the copyright, year stamps
+ - configure.ac (release, relcode, date)
+ - COPYRIGHT (year only)
+
+
+8. Commit to SVN; include release number in the log message
+ svn commit
+
+
+9. Tag.
+ We don't bother to tag snapshots.
+ For a new major release, or a bugfix minor release,
+ this tag is from the relevant branch:
+ svn copy https://svn.janelia.org/eddylab/eddys/easel/branches/0.1\
+ https://svn.janelia.org/eddylab/eddys/easel/tags/0.1\
+ -m "tagged Easel 0.1 release, from 0.1 stable branch"
+
+
+10. Make the distribution tarball.
+ (Remaking configure scripts w/ autoconf is needed)
+ make distclean
+ autoconf
+ ./configure <-- makes a Makefile (needed for "make dist")
+
+ major or minor:
+ make REPOSITORY=https://svn.janelia.org/eddylab/eddys/easel/tags/0.1 dist
+ snapshot:
+ make REPOSITORY=https://svn.janelia.org/eddylab/eddys/easel/trunk RELEASE=snap20080325 dist
+
+ Alternatively, make -n dist' and execute commands yourself one at a
+ time, under a Bourne shell like 'bash' so the for loops work.
+
+ This exports into a easel-$RELEASE directory, alongside the
+ easel working directory in ~/releases/. The tarball is also
+ left in ~/releases/.
+
+ Go into easel-$RELEASE and make sure it looks good from the
+ perspective of a new user: start by reading the README's.
+
+
+
+11. Build and test the release copy (on login-eddy)
+ ssh login-eddy
+ cd releases/easel-xx
+ env CFLAGS="-O3" ./configure
+ make
+ make check
+
+
+12. Put on the FTP site. (on selab)
+ scp 00README selab:/opt/www/ftp/pub/software/easel/
+ scp COPYRIGHT selab:/opt/www/ftp/pub/software/easel/
+ scp Userguide.pdf selab:/opt/www/ftp/pub/software/easel/
+ scp ../easel-0.1.tar.gz selab:/opt/www/ftp/pub/software/easel/
+ ssh selab rm -f /opt/www/ftp/pub/software/easel/easel.tar.gz
+ ssh selab "(cd /opt/www/ftp/pub/software/easel; ln -s easel-0.1.tar.gz easel.tar.gz)"
+
+13. Update the web site
+ cd ~/web/easel/
+ emacs index.html
+ make
+ texclean
+ svn commit
+
+
+14. Clean up.
+ Don't remove the old directory though,
+ we will (should) use it for regression testing at the next release.
+ cd ~/releases
+ mv easel-0.1.tar.gz ~/Archive/
+ cd easel
+ make distclean
+
+
+15. Merge the changes from the "stabilized" release branch back into the trunk.
+
+ If you're doing a minor bugfix release on a stable branch, you know the
+ revs that introduced the bugfixes; merge them explicitly. For example:
+ cd ~/src/easel
+ svn update
+ svn merge -r 1990:1992 https://svn.janelia.org/eddylab/eddys/easel/branches/0.1
+
+ If you're doing a major release on a new stable branch:
+ First identify the rev #'s for when we made the release branch.
+ In the release working copy:
+ svn log --verbose --stop-on-copy
+
+ Go back to working copies of the trunks, and merge the release branches into it.
+ cd ../easel
+ svn update
+ svn merge -r 173:HEAD https://svn.janelia.org/eddylab/eddys/easel/branches/0.8
+
+ Now, the merge will always screw up the svn:externals. Reset them.
+ cd ..
+ svn propedit svn:externals .
+ easel https://svn.janelia.org/eddylab/eddys/easel/trunk
+
+ Commit.
+ svn commit
+
+
+Release history
+Version Date SVN revision
+-------- ---------------------------------- -------------
+
diff --git a/00README b/00README
new file mode 100644
index 0000000..f0f5f60
--- /dev/null
+++ b/00README
@@ -0,0 +1,32 @@
+Easel - a library of C functions for biological sequence analysis
+Version @EASEL_VERSION@; @EASEL_DATE@
+ at EASEL_COPYRIGHT@
+------------------------------------------------------------------
+
+Easel is an ANSI C code library for computational analysis of
+biological sequences using probabilistic models. Easel is used by
+HMMER, the profile hidden Markov model software that underlies the
+Pfam protein families database, and by Infernal, the profile
+stochastic context-free grammar software that underlies the Rfam RNA
+family database. Easel aims to make similar applications more robust
+and easier to develop, by providing a set of reusable, documented, and
+well-tested functions.
+
+Other files to read in the top-level source directory:
+
+ INSTALL Brief installation instructions.
+ Userguide.pdf The Easel User's Guide.
+ RELEASE-NOTES Notes for this release.
+ LICENSE Copyright, contributors, and license information
+
+To get started after installation, see the Easel User's Guide
+(Userguide.pdf).
+
+------------------------------------------------------------------
+Sean Eddy | HHMI | Harvard University | http://eddylab.org
+
+
+
+
+
+
diff --git a/BUGTRAX b/BUGTRAX
new file mode 100644
index 0000000..3fe71de
--- /dev/null
+++ b/BUGTRAX
@@ -0,0 +1,205 @@
+ID e11
+TITLE Unicode characters in MSA files crash MSA parsers
+AFFECTS -
+FIXED_IN -
+STATUS CLOSED
+XREF -
+REPORTED_BY Jody Clements
+OPENED_DATE SRE, Thu Jan 22 14:22:54 2015
+CLOSED_DATE SRE, Thu Jan 22 14:22:56 2015
+DESCRIPTION
+ MSA file parsers require ASCII input because they use an
+ inmap[0..127], but were not validating user input. Unicode
+ characters result in out of bounds accesses and corruption.
+ (Unaligned file parsers do validate.)
+
+ Fix is to have esl_abc_dsqcat_noalloc() (for digital mode) and
+ esl_strmapcat_noalloc() (for text mode) validate that each char
+ is ASCII.
+//
+ID e10
+TITLE Clustal format allows optional trailing coords
+AFFECTS -
+FIXED_IN -
+STATUS CLOSED
+XREF -
+REPORTED_BY sumudu <sumudu at fiserlab.org>, 27 Jan 2014
+OPENED_DATE 28 Jan 2014
+CLOSED_DATE 28 Jan 2014
+DESCRIPTION
+ Clustal format allows an optional trailing seq coord number
+ on each line, but we weren't allowing for that.
+//
+ID e9
+TITLE Segmentation fault in esl-stranslate
+AFFECTS H3.1b1
+FIXED_IN -
+STATUS CLOSED
+XREF -
+REPORTED_BY Jaina Mistry <jaina at ebi.ac.uk>
+OPENED_DATE TJW, Tue Sep 24 04:57:08 2013
+CLOSED_DATE TJW, Tue Sep 24 04:57:08 2013
+DESCRIPTION
+ esl-stranslate crashed with seg fault if any of the 6 frames
+ ended with a stop codon. An extra sequence object was
+ created to hold the "next" ORF, but no ORF followed; the
+ result was a sequence object with no name or sequence,
+ and a resulting seg fault when that sequence's information
+ was printed.
+//
+ID e8
+TITLE esl_threads fails to compile
+AFFECTS -
+FIXED_IN -
+STATUS CLOSED
+XREF -
+REPORTED_BY "Campbell, Christopher D" <christopher-campbell at uiowa.edu>
+OPENED_DATE SRE, Thu Mar 8 23:04:52 2012
+CLOSED_DATE SRE, Thu Mar 8 23:04:53 2012
+DESCRIPTION
+ HMMER3.0 failed to build for him with MPI support; he traced
+ problem to esl_threads.h, which was missing an #include <pthread.h>.
+//
+ID e7
+TITLE with icc v12, esl_random() sequence is changed
+AFFECTS -
+FIXED_IN -
+STATUS CLOSED
+XREF SRE:notebook/1213-icc12-random/
+REPORTED_BY detected in unit tests when we switched to icc v12
+OPENED_DATE SRE, Thu Dec 15 11:32:35 2011
+CLOSED_DATE SRE, Thu Dec 15 11:58:08 2011
+DESCRIPTION
+ When we upgraded to Intel icc version 12, in HMMER, the
+ nhmmer_generic unit test failed. Travis traced it to esl-shuffle
+ generating a different sequence, despite fixed RNG seed. The
+ problem only occurs with icc -O -fPIC.
+
+ In esl_random.c::mersenne_fill_table(), the MT incantation is
+ y = (r->mt[z] & 0x80000000) | (r->mt[z+1] & 0x7fffffff);
+ r->mt[z] = r->mt[z-227] ^ (y>>1) ^ mag01[y & 0x1];
+ with y declared as an unsigned 32-bit int.
+
+ The problem is mag01[y & 0x1]. I think icc12 *may* (depending on
+ optimization and other flags) be casting y to a signed int before
+ it does the binary AND. The result of casting a large unsigned y to
+ a signed int is implementation-defined and unsafe, so if the
+ compiler does indeed try to cast y to signed int we're in trouble.
+
+ The fix is to dictate the cast explicitly:
+ r->mt[z] = r->mt[z-227] ^ (y>>1) ^ mag01[(int)(y & 0x1)];
+ and this should be guaranteed to work, because we know that the
+ result of (y & 0x1) is 0 or 1, and C99 guarantees that we can
+ safely cast it to signed int 0 or 1.
+
+ Arguably this is a compiler bug. The C99 standard says that an
+ array index may be any integer type; it does not specify signed or
+ unsigned.
+
+ [note added 8 Mar 2012: Intel support confirmed, compiler bug.]
+//
+ID e6
+TITLE Running out of disk space corrupts outputs
+AFFECTS HMMER 3.0 and earlier
+FIXED_IN -
+STATUS CLOSED
+XREF SRE:J8/118-119
+REPORTED_BY Maarten Hekkelman <m.hekkelman at cmbi.ru.nl>
+OPENED_DATE SRE, 13 Oct 2011
+CLOSED_DATE SRE, Mon Oct 24 13:03:45 2011
+DESCRIPTION
+ jackhmmer corrupted an output file. Tracked to the user's disk
+ filling up. Return status of fprintf(), fputs(), etc. calls was not
+ being checked, so Easel/HMMER were not detecting the problem.
+
+ Systematically added error return status checking to most printing
+ calls, using ESL_{X}EXCEPTION_SYS(), returning eslEWRITE Easel error
+ codes. Easel _Write() interface is now documented to require such
+ checking.
+//
+ID e5
+TITLE Blank text line following #=GF <tag> handled improperly.
+AFFECTS HMMER 3.0 and earlier
+FIXED_IN -
+STATUS CLOSED
+XREF J6/92
+REPORTED_BY Sean Powell <spowell at embl.de>
+OPENED_DATE SRE, Tue Jul 13 09:25:29 2010
+CLOSED_DATE -
+DESCRIPTION
+ Easel Stockholm parser allows blank lines for #=GF DE annotation, but
+ HMMER strictly requires DESC <s> format in save files. Thus hmmbuild
+ can generate a file that other HMMER programs won't parse.
+
+ Stockholm parser does need to allow blank lines on #=GF CC, for
+ legacy reasons (human-readable spacing in CC comments). All other
+ #=GF <tag> lines rigorously enforce the presence of text.
+
+ Revised esl_msa.c::parse_gf().
+ Added i3-blank-gf.pl in testsuite.
+//
+ID e4
+TITLE Long options called ambiguous abbreviation, if a prefix of another option
+AFFECTS HMMER 3.0b3 (and earlier)
+FIXED_IN -
+STATUS CLOSED
+XREF J5/116
+REPORTED_BY Maufrais Corinne <maufrais at pasteur.fr>; 27 Nov 2009
+OPENED_DATE SRE, Tue Dec 1 11:24:43 2009
+CLOSED_DATE SRE, Tue Dec 1 11:24:46 2009
+DESCRIPTION
+ hmmsim --s gives
+ "Failed to parse command line: Abbreviated option "--s" is ambiguous"
+ because esl_getopts thinks --s is an abbreviation for --seed or --stall.
+
+ get_optidx_abbrev() revised to allow exact matches to long options.
+ esl_getopts unit test revised to catch this bug.
+//
+ID e3
+TITLE esl-sfetch should allow simpler fetching from small files
+AFFECTS -
+FIXED_IN -
+STATUS OPEN
+XREF J4/81
+REPORTED_BY SRE
+OPENED_DATE 13 Feb 2009
+CLOSED_DATE -
+DESCRIPTION
+ esl-sfetch should allow simpler fetching from a small seqfile of one
+ or a few sequences. It should not require an SSI index. It should allow
+ a . argument to mean "from first sequence in file". (Or perhaps it should
+ allow seqs to be fetched by number, as well as name.)
+//
+ID e2
+TITLE esl-seqstat can't read alignment file from stdin
+AFFECTS -
+FIXED_IN -
+STATUS CLOSED
+XREF J4/84
+REPORTED_BY SRE
+OPENED_DATE 16 Feb 2009
+CLOSED_DATE 16 Feb 2009
+DESCRIPTION
+ sqfile_open tries to guess file format; then when msafile_open is called
+ in GuessAlphabet, stdin is already feof(). Using current design, MSA can't
+ be read sequentially (through sqio interface) unless format is known.
+ SQFILE has a recording buffer mechanism, but it only works in sqio proper,
+ not through interface to esl_msa. Added e2.sh to test for the bug.
+//
+ID e1
+TITLE esl-alistat fails to read Pfam seed in MUL format
+AFFECTS -
+FIXED_IN -
+STATUS CLOSED
+XREF J4/81; J4/93
+REPORTED_BY Rob Finn
+OPENED_DATE 13 Feb 2009
+CLOSED_DATE 13 Feb 2009
+DESCRIPTION
+ SELEX/MUL format parser was present, but not hooked up to anything.
+
+ Added --informat to several esl miniapps, to allow --informat selex.
+//
+#
+# Started Easel BUGTRAX file: SRE, Tue Dec 1 11:08:31 2009
+# xref J5/116
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..4d991fe
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,31 @@
+Brief installation instructions
+Easel @EASEL_VERSION@; @EASEL_DATE@
+SRE, Mon Mar 24 09:05:20 2008
+-------------------------------------------------------------
+
+Starting from a source distribution, easel- at EASEL_VERSION@.tar.gz:
+ Uncompress: uncompress easel- at EASEL_VERSION@.tar.gz
+ Unpack: tar xf easel- at EASEL_VERSION@.tar
+ Move into new directory: cd easel- at EASEL_VERSION@
+ Configure: ./configure
+ Build: make
+ Automated tests: make check
+ Automated install: make install
+
+
+For information on more expert customization options available to you
+in the configuration and the Makefiles, see the Installation chapter
+in the Easel User's Guide (Userguide.pdf).
+
+Easel is developed on Linux, and tested on a variety of UNIX and
+UNIX-like operating systems, including Apple OS/X. It is written in
+ANSI C99 and should build cleanly on any system with an ANSI C99
+compiler, including Microsoft Windows.
+
+-------------------------------------------------------------
+
+
+
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a626cf1
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,54 @@
+Easel - a library of C functions for biological sequence analysis
+
+ at EASEL_COPYRIGHT@
+Copyright (C) 2004-2016 Sean R. Eddy
+Copyright (C) 2004-2016 Howard Hughes Medical Institute
+Copyright (C) 2015-2016 President and Fellows of Harvard College
+Copyright (C) 2004-2006 Washington University School of Medicine
+
+Easel also includes copyrighted and licensed code from a variety of
+sources and contributors, as noted in the appropriate places in
+individual files. Copyright holders and contributors include:
+
+ Free Software Foundation, Inc. configure
+ Matteo Frigo aclocal.m4
+ Steven G. Johnson aclocal.m4
+ Stephen Moshier esl_sse.c,esl_vmx.c
+ Julien Pommier esl_sse.c,esl_vmx.c
+ Sun Microsystems, Inc. esl_stats.c::esl_erfc()
+ David Robert Nadeau esl_stopwatch.c
+ Henry Spencer, U. of Toronto esl_regexp.c
+ Christophe Tournayre aclocal.m4
+ David Wheeler easel.c::esl_tmpfile()
+
+The Easel library is open source, freely distributed under the terms of a
+standard BSD (Berkeley Software Distribution) license:
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. Neither the name of the copyright holder 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/LICENSE.sh.in b/LICENSE.sh.in
new file mode 100644
index 0000000..029e371
--- /dev/null
+++ b/LICENSE.sh.in
@@ -0,0 +1,5 @@
+export EASEL_VERSION=@EASEL_VERSION@
+export EASEL_DATE="@EASEL_DATE@"
+export EASEL_COPYRIGHT="@EASEL_COPYRIGHT@"
+export EASEL_LICENSE="@EASEL_LICENSE@"
+
diff --git a/LICENSE.tag b/LICENSE.tag
new file mode 100644
index 0000000..82a5274
--- /dev/null
+++ b/LICENSE.tag
@@ -0,0 +1,7 @@
+Easel - a library of C functions for biological sequence analysis
+Version @EASEL_VERSION@; @EASEL_DATE@
+ at EASEL_COPYRIGHT@
+Other copyrights also apply. See the LICENSE file for a full list.
+
+Easel is open source software, distributed under the BSD license. See
+the LICENSE file for more details.
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..4914fc5
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,594 @@
+# Top level Makefile for Easel
+#
+# On most systems, to build Easel you should only need:
+# % ./configure; make
+#
+# Optionally, you can run a test suite:
+# % make check
+#
+# And optionally, you can install everything more permanently:
+# % make install
+#
+# For more information, see the Installation chapter of the Easel Guide.
+#
+
+# VPATH and shell configuration
+#
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+SHELL = /bin/sh
+
+# Package information
+#
+PACKAGE = @PACKAGE_NAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+BASENAME = @PACKAGE_TARNAME@
+RELEASE = @EASEL_VERSION@
+RELEASEDATE = "@EASEL_DATE@"
+COPYRIGHT = "@EASEL_COPYRIGHT@"
+LICENSELINE = "@EASEL_LICENSE@"
+
+# Installation targets
+#
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+mandir = @mandir@
+docdir = @docdir@
+pdfdir = @pdfdir@
+mandir = @mandir@
+man1dir = ${mandir}/man1
+man1ext = .1
+
+# Compiler configuration
+#
+CC = @CC@
+CFLAGS = @CFLAGS@ @PTHREAD_CFLAGS@ @PIC_FLAGS@
+SIMDFLAGS= @SIMD_CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBGSL = @LIBGSL@
+LIBS = @LIBS@ @PTHREAD_LIBS@
+
+# Other tools
+#
+COMPRESS = gzip
+AR = @AR@
+RANLIB = @RANLIB@
+INSTALL = @INSTALL@
+
+# beautification magic stolen from git
+#
+QUIET_SUBDIR0 = +${MAKE} -C #space separator after -c
+QUIET_SUBDIR1 =
+ifndef V
+ QUIET_CC = @echo ' ' CC $@;
+ QUIET_GEN = @echo ' ' GEN $@;
+ QUIET_AR = @echo ' ' AR $@;
+ QUIET_SUBDIR0 = + at subdir=
+ QUIET_SUBDIR1 = ; echo ' ' SUBDIR $$subdir; \
+ ${MAKE} -C $$subdir
+endif
+
+
+# Code manifests
+#
+HDRS = easel.h\
+ esl_alphabet.h\
+ esl_avx.h\
+ esl_buffer.h\
+ esl_cluster.h\
+ esl_composition.h\
+ esl_dirichlet.h\
+ esl_distance.h\
+ esl_dmatrix.h\
+ esl_dsqdata.h\
+ esl_exponential.h\
+ esl_fileparser.h\
+ esl_gamma.h\
+ esl_gencode.h\
+ esl_getopts.h\
+ esl_gev.h\
+ esl_gumbel.h\
+ esl_heap.h\
+ esl_histogram.h\
+ esl_hmm.h\
+ esl_hyperexp.h\
+ esl_keyhash.h\
+ esl_mem.h\
+ esl_minimizer.h\
+ esl_mixgev.h\
+ esl_mpi.h\
+ esl_msa.h\
+ esl_msacluster.h\
+ esl_msafile.h\
+ esl_msafile2.h\
+ esl_msafile_a2m.h\
+ esl_msafile_afa.h\
+ esl_msafile_clustal.h\
+ esl_msafile_phylip.h\
+ esl_msafile_psiblast.h\
+ esl_msafile_selex.h\
+ esl_msafile_stockholm.h\
+ esl_msashuffle.h\
+ esl_msaweight.h\
+ esl_normal.h\
+ esl_paml.h\
+ esl_random.h\
+ esl_randomseq.h\
+ esl_ratematrix.h\
+ esl_recorder.h\
+ esl_regexp.h\
+ esl_rootfinder.h\
+ esl_scorematrix.h\
+ esl_sq.h\
+ esl_sqio.h\
+ esl_sqio_ascii.h\
+ esl_sqio_ncbi.h\
+ esl_sse.h\
+ esl_ssi.h\
+ esl_stack.h\
+ esl_stats.h\
+ esl_stopwatch.h\
+ esl_stretchexp.h\
+ esl_threads.h\
+ esl_tree.h\
+ esl_vectorops.h\
+ esl_vmx.h\
+ esl_weibull.h\
+ esl_workqueue.h\
+ esl_wuss.h
+
+OBJS = easel.o\
+ esl_alphabet.o\
+ esl_avx.o\
+ esl_buffer.o\
+ esl_cluster.o\
+ esl_composition.o\
+ esl_dirichlet.o\
+ esl_distance.o\
+ esl_dmatrix.o\
+ esl_dsqdata.o\
+ esl_exponential.o\
+ esl_fileparser.o\
+ esl_gamma.o\
+ esl_gencode.o\
+ esl_getopts.o\
+ esl_gev.o\
+ esl_gumbel.o\
+ esl_heap.o\
+ esl_histogram.o\
+ esl_hmm.o\
+ esl_hyperexp.o\
+ esl_keyhash.o\
+ esl_mem.o\
+ esl_minimizer.o\
+ esl_mixgev.o\
+ esl_mpi.o\
+ esl_msa.o\
+ esl_msacluster.o\
+ esl_msafile.o\
+ esl_msafile2.o\
+ esl_msafile_a2m.o\
+ esl_msafile_afa.o\
+ esl_msafile_clustal.o\
+ esl_msafile_phylip.o\
+ esl_msafile_psiblast.o\
+ esl_msafile_selex.o\
+ esl_msafile_stockholm.o\
+ esl_msashuffle.o\
+ esl_msaweight.o\
+ esl_normal.o\
+ esl_paml.o\
+ esl_random.o\
+ esl_randomseq.o\
+ esl_ratematrix.o\
+ esl_recorder.o\
+ esl_regexp.o\
+ esl_rootfinder.o\
+ esl_scorematrix.o\
+ esl_sq.o\
+ esl_sqio.o\
+ esl_sqio_ascii.o\
+ esl_sqio_ncbi.o\
+ esl_sse.o\
+ esl_ssi.o\
+ esl_stack.o\
+ esl_stats.o\
+ esl_stopwatch.o\
+ esl_stretchexp.o\
+ esl_threads.o\
+ esl_tree.o\
+ esl_vectorops.o\
+ esl_vmx.o\
+ esl_weibull.o\
+ esl_workqueue.o\
+ esl_wuss.o
+# esl_swat.o
+
+
+BENCHMARKS =\
+ esl_buffer_benchmark\
+ esl_keyhash_benchmark\
+ esl_mem_benchmark\
+ esl_sse_benchmark\
+ esl_random_benchmark
+
+EXPERIMENTS = \
+ esl_scorematrix_experiment
+
+UTESTS =\
+ easel_utest\
+ esl_alphabet_utest\
+ esl_buffer_utest\
+ esl_cluster_utest\
+ esl_dirichlet_utest\
+ esl_distance_utest\
+ esl_dmatrix_utest\
+ esl_dsqdata_utest\
+ esl_exponential_utest\
+ esl_fileparser_utest\
+ esl_gamma_utest\
+ esl_gencode_utest\
+ esl_getopts_utest\
+ esl_gumbel_utest\
+ esl_heap_utest\
+ esl_histogram_utest\
+ esl_hmm_utest\
+ esl_hyperexp_utest\
+ esl_keyhash_utest\
+ esl_mem_utest\
+ esl_msa_utest\
+ esl_msacluster_utest\
+ esl_msafile_utest\
+ esl_msafile2_utest\
+ esl_msafile_a2m_utest\
+ esl_msafile_afa_utest\
+ esl_msafile_clustal_utest\
+ esl_msafile_phylip_utest\
+ esl_msafile_psiblast_utest\
+ esl_msafile_selex_utest\
+ esl_msafile_stockholm_utest\
+ esl_msaweight_utest\
+ esl_normal_utest\
+ esl_random_utest\
+ esl_randomseq_utest\
+ esl_ratematrix_utest\
+ esl_recorder_utest\
+ esl_regexp_utest\
+ esl_rootfinder_utest\
+ esl_scorematrix_utest\
+ esl_sq_utest\
+ esl_sqio_utest\
+ esl_sse_utest\
+ esl_ssi_utest\
+ esl_stack_utest\
+ esl_stats_utest\
+ esl_stretchexp_utest\
+ esl_tree_utest\
+ esl_vectorops_utest\
+ esl_weibull_utest\
+ esl_wuss_utest
+# gev_utest\
+# minimizer_utest\
+# mixgev_utest\
+# mpi_utest\
+# paml_utest\
+# stopwatch_utest\
+# swat_utest\
+
+EXAMPLES = \
+ easel_example\
+ esl_alphabet_example\
+ esl_alphabet_example2\
+ esl_alphabet_example3\
+ esl_buffer_example\
+ esl_buffer_example2\
+ esl_buffer_example3\
+ esl_buffer_example4\
+ esl_buffer_example5\
+ esl_buffer_example6\
+ esl_cluster_example\
+ esl_dirichlet_example\
+ esl_dmatrix_example\
+ esl_dsqdata_example\
+ esl_dsqdata_example2\
+ esl_exponential_example\
+ esl_fileparser_example\
+ esl_fileparser_example2\
+ esl_gamma_example\
+ esl_gencode_example\
+ esl_gencode_example2\
+ esl_getopts_example\
+ esl_getopts_example2\
+ esl_gev_example\
+ esl_gumbel_example\
+ esl_histogram_example\
+ esl_histogram_example2\
+ esl_histogram_example3\
+ esl_histogram_example4\
+ esl_histogram_example5\
+ esl_hmm_example\
+ esl_hyperexp_example\
+ esl_keyhash_example\
+ esl_minimizer_example\
+ esl_mixgev_example\
+ esl_msafile_example\
+ esl_msafile_a2m_example\
+ esl_msafile_a2m_example2\
+ esl_msafile_afa_example\
+ esl_msafile_afa_example2\
+ esl_msafile_clustal_example\
+ esl_msafile_clustal_example2\
+ esl_msafile_phylip_example\
+ esl_msafile_phylip_example2\
+ esl_msafile_psiblast_example\
+ esl_msafile_psiblast_example2\
+ esl_msafile_selex_example\
+ esl_msafile_selex_example2\
+ esl_msafile_stockholm_example\
+ esl_msafile_stockholm_example2\
+ esl_msacluster_example\
+ esl_msashuffle_example\
+ esl_msaweight_example\
+ esl_normal_example\
+ esl_random_example\
+ esl_regexp_example\
+ esl_regexp_example2\
+ esl_regexp_example3\
+ esl_rootfinder_example\
+ esl_rootfinder_example2\
+ esl_scorematrix_example\
+ esl_sq_example\
+ esl_sq_example2\
+ esl_sqio_example\
+ esl_sqio_example2\
+ esl_sqio_example3\
+ esl_sse_example\
+ esl_ssi_example\
+ esl_ssi_example2\
+ esl_stack_example\
+ esl_stats_example\
+ esl_stats_example2\
+ esl_stopwatch_example\
+ esl_stretchexp_example\
+ esl_threads_example\
+ esl_threads_example2\
+ esl_tree_example\
+ esl_tree_example2\
+ esl_vectorops_example\
+ esl_vmx_example\
+ esl_weibull_example\
+ esl_workqueue_example
+# esl_distance_example\
+# esl_hmm_example\
+# esl_msafile_clustal_example\
+# esl_randomseq_example\
+# esl_msa_example2\
+
+.PHONY: all dev tests check pdf install uninstall clean distclean dist implode TAGS
+
+all: libeasel.a .FORCE
+ ${QUIET_SUBDIR0}miniapps ${QUIET_SUBDIR1} all
+
+dev: libeasel.a ${UTESTS} ${BENCHMARKS} ${EXPERIMENTS} ${EXAMPLES} .FORCE
+ ${QUIET_SUBDIR0}miniapps ${QUIET_SUBDIR1} dev
+
+tests: ${UTESTS}
+ ${QUIET_SUBDIR0}miniapps ${QUIET_SUBDIR1} tests
+
+check: ${UTESTS} .FORCE
+ ${QUIET_SUBDIR0}miniapps ${QUIET_SUBDIR1} check
+ ${QUIET_SUBDIR0}testsuite ${QUIET_SUBDIR1} check
+
+pdf:
+ ${QUIET_SUBDIR0}documentation ${QUIET_SUBDIR1} pdf
+
+libeasel.a: ${OBJS}
+ ${QUIET_AR}${AR} -r libeasel.a $(OBJS) > /dev/null 2>&1
+ @${RANLIB} libeasel.a
+
+.FORCE:
+
+${OBJS}: ${HDRS} esl_config.h
+
+.c.o:
+ ${QUIET_CC}${CC} -I. -I${srcdir} ${CFLAGS} ${SIMDFLAGS} ${DEFS} -o $@ -c $<
+
+# Unit test compilation:
+#
+# To compile unit tests, we need to construct a command line
+# from module basename, module's testdriver flag, and module's
+# C file. This is accomplished via a complex-looking shell scripture;
+# xref J1/81.
+# $@ = driver name esl_msa_utest easel_utest
+# $${BASENAME} = base module name msa easel
+# $${DFLAG} = driver flag eslMSA_TESTDRIVE eslEASEL_TESTDRIVE
+# $${DFILE} = driver's C file esl_msa.c easel.c
+#
+${UTESTS}: libeasel.a
+ @BASENAME=`echo $@ | sed -e 's/_utest//'| sed -e 's/^esl_//'` ;\
+ DFLAG=`echo $${BASENAME} | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`;\
+ DFLAG=esl$${DFLAG}_TESTDRIVE ;\
+ if test $@ = "easel_utest" ;\
+ then DFILE=${srcdir}/easel.c ;\
+ else DFILE=${srcdir}/esl_$${BASENAME}.c ;\
+ fi;\
+ if test ${V} ;\
+ then echo "${CC} ${CFLAGS} ${SIMDFLAGS} ${DEFS} ${LDFLAGS} -o $@ -I. -I${srcdir} -L. -D$${DFLAG} $${DFILE} -leasel -lm ${LIBS}" ;\
+ else echo ' ' GEN $@ ;\
+ fi ;\
+ ${CC} ${CFLAGS} ${SIMDFLAGS} ${DEFS} ${LDFLAGS} -o $@ -I. -I${srcdir} -L. -D$${DFLAG} $${DFILE} -leasel -lm ${LIBS}
+
+# Benchmark compilation:
+# Name construction much like unit tests.
+# $@ = driver name esl_msa_benchmark easel_benchmark
+# $${BASENAME} = base module name msa easel
+# $${DFLAG} = driver flag eslMSA_BENCHMARK eslEASEL_BENCHMARK
+# $${DFILE} = driver's C file esl_msa.c easel.c
+#
+${BENCHMARKS}: libeasel.a
+ @BASENAME=`echo $@ | sed -e 's/_benchmark//'| sed -e 's/^esl_//'` ;\
+ DFLAG=`echo $${BASENAME} | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`;\
+ DFLAG=esl$${DFLAG}_BENCHMARK ;\
+ if test $@ = "easel_benchmark" ;\
+ then DFILE=${srcdir}/easel.c ;\
+ else DFILE=${srcdir}/esl_$${BASENAME}.c ;\
+ fi;\
+ if test ${V} ;\
+ then echo "${CC} ${CFLAGS} ${SIMDFLAGS} ${DEFS} ${LDFLAGS} -o $@ -I. -I${srcdir} -L. -D$${DFLAG} $${DFILE} -leasel -lm ${LIBS}" ;\
+ else echo ' ' GEN $@ ;\
+ fi ;\
+ ${CC} ${CFLAGS} ${SIMDFLAGS} ${DEFS} ${LDFLAGS} -o $@ -I. -I${srcdir} -L. -D$${DFLAG} $${DFILE} -leasel -lm ${LIBS}
+
+${EXPERIMENTS}: libeasel.a
+ @BASENAME=`echo $@ | sed -e 's/_experiment//'| sed -e 's/^esl_//'` ;\
+ DFLAG=`echo $${BASENAME} | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`;\
+ DFLAG=esl$${DFLAG}_EXPERIMENT ;\
+ if test $@ = "easel_experiment" ;\
+ then DFILE=${srcdir}/easel.c ;\
+ else DFILE=${srcdir}/esl_$${BASENAME}.c ;\
+ fi;\
+ if test ${V} ;\
+ then echo "${CC} ${CFLAGS} ${SIMDFLAGS} ${DEFS} ${LDFLAGS} -o $@ -I. -I${srcdir} -L. -D$${DFLAG} $${DFILE} -leasel -lm ${LIBS}" ;\
+ else echo ' ' GEN $@ ;\
+ fi ;\
+ ${CC} ${CFLAGS} ${SIMDFLAGS} ${DEFS} ${LDFLAGS} -o $@ -I. -I${srcdir} -L. -D$${DFLAG} $${DFILE} -leasel -lm ${LIBS}
+
+
+${EXAMPLES}: libeasel.a
+ @BASENAME=`echo $@ | sed -e 's/_example[0-9]*//'| sed -e 's/^esl_//'` ;\
+ DFLAG=esl`echo $@ | sed -e 's/^esl_//' | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`;\
+ if test $@ = "easel_example"; \
+ then DFILE=${srcdir}/easel.c ;\
+ else DFILE=${srcdir}/esl_$${BASENAME}.c ;\
+ fi ;\
+ if test ${V}; \
+ then echo "${CC} ${CFLAGS} ${SIMDFLAGS} ${DEFS} ${LDFLAGS} -o $@ -I. -I${srcdir} -L. -D$${DFLAG} $${DFILE} -leasel -lm ${LIBS}" ;\
+ else echo ' ' GEN $@ ;\
+ fi ;\
+ ${CC} ${CFLAGS} ${SIMDFLAGS} ${DEFS} ${LDFLAGS} -o $@ -I. -I${srcdir} -L. -D$${DFLAG} $${DFILE} -leasel -lm ${LIBS}
+
+# install: installs libeasel.a in ${libdir}/
+# installs Easel headers in ${includedir}/
+# installs miniapp binaries in ${bindir}/
+#
+install:
+ ${INSTALL} -d ${DESTDIR}${bindir}
+ ${INSTALL} -d ${DESTDIR}${libdir}
+ ${INSTALL} -d ${DESTDIR}${includedir}
+ ${INSTALL} -m 0644 libeasel.a ${DESTDIR}${libdir}/
+ for file in ${HDRS}; do\
+ ${INSTALL} -m 0644 ${srcdir}/$$file ${DESTDIR}${includedir}/ ;\
+ done
+ ${INSTALL} -m 0644 esl_config.h ${DESTDIR}${includedir}/
+ ${QUIET_SUBDIR0}miniapps ${QUIET_SUBDIR1} install
+
+# "make uninstall" reverses the steps of "make install"
+#
+uninstall:
+ -rm -f ${DESTDIR}${libdir}/libeasel.a
+ for file in ${HDRS}; do\
+ rm -f ${DESTDIR}${includedir}/$$file;\
+ done
+ rm -f ${DESTDIR}${includedir}/esl_config.h
+ ${QUIET_SUBDIR0}miniapps ${QUIET_SUBDIR1} uninstall
+
+# "make clean" removes almost everything except configuration files
+#
+clean:
+#Use 'ifneq' instead of 'test -e' because the '+@' in QUIET_SUBDIR0 can't
+#be passed to the shell. Note that ifneq breaks if indented.
+ifneq (,$(wildcard ./documentation/.))
+ ${QUIET_SUBDIR0}documentation ${QUIET_SUBDIR1} clean
+endif
+ ${QUIET_SUBDIR0}testsuite ${QUIET_SUBDIR1} clean
+ ${QUIET_SUBDIR0}miniapps ${QUIET_SUBDIR1} clean
+ -rm -f ${OBJS} libeasel.a
+ -rm -f ${UTESTS} ${BENCHMARKS} ${EXAMPLES} ${EXPERIMENTS}
+ -rm -f *~ TAGS
+ -rm -f *.gcno *.gcda *.gcov
+ -rm -f cscope.out
+ -rm -f core.[0-9]*
+ -rm -f esltmp??????
+ -rm -f config.log config.status
+ for prog in ${UTESTS} ${BENCHMARKS} ${EXAMPLES} ${EXPERIMENTS}; do\
+ if test -d $$prog.dSYM; then rm -rf $$prog.dSYM; fi;\
+ done
+
+
+distclean: clean
+#See above for explanation of 'ifneq' usage
+ifneq (,$(wildcard ./documentation/.))
+ ${QUIET_SUBDIR0}documentation ${QUIET_SUBDIR1} distclean
+endif
+ ${QUIET_SUBDIR0}testsuite ${QUIET_SUBDIR1} distclean
+ ${QUIET_SUBDIR0}miniapps ${QUIET_SUBDIR1} distclean
+ -rm esl_config.h
+ -rm -rf autom4te.cache
+ -rm LICENSE.sh
+ -rm Makefile
+
+gitclean: distclean
+ -rm configure
+
+
+# 'make REPOSITORY=... dist' : create a new distribution tarball
+#
+dist:
+# Make sure we pointed the make dist to a subversion repository
+ @if test x${REPOSITORY} = 'x'; then\
+ echo "REPOSITORY isn't set; use make REPOSITORY=... dist";\
+ exit 1;\
+ fi
+# Delete any old versions of the same release
+ @if test -d ../${BASENAME}-${RELEASE}; then rm -rf ../${BASENAME}-${RELEASE}; fi
+ @if test -e ../${BASENAME}-${RELEASE}.tar; then rm -f ../${BASENAME}-${RELEASE}.tar; fi
+ @if test -e ../${BASENAME}-${RELEASE}.tar.Z; then rm -f ../${BASENAME}-${RELEASE}.tar.Z; fi
+ @if test -e ../${BASENAME}-${RELEASE}.tar.gz; then rm -f ../${BASENAME}-${RELEASE}.tar.gz; fi
+# Export the release from Subversion control
+ svn export ${REPOSITORY} ../${BASENAME}-${RELEASE}
+# Make the configure script from configure.ac
+ (cd ../${BASENAME}-${RELEASE}; autoconf)
+# We'll need some basic Makefiles
+ (cd ../${BASENAME}-${RELEASE}/; ./configure)
+# Set file permissions.
+ find ../${BASENAME}-${RELEASE} -type f -exec chmod +r {} \;
+# Compile the PDF documentation and move it to top level dir
+ (cd ../${BASENAME}-${RELEASE}/documentation/; make pdf)
+ mv ../${BASENAME}-${RELEASE}/documentation/current.pdf ../${BASENAME}-${RELEASE}/Userguide.pdf
+# Attach license stamps by replacing LICENSE keyword everywhere
+ find ../${BASENAME}-${RELEASE} -type f -exec devkit/sedition-pp LICENSE LICENSE.tag {} \;
+# Other keyword replacements
+ devkit/sedition RELEASE ${RELEASE} RELEASEDATE ${RELEASEDATE} COPYRIGHT ${COPYRIGHT} ../${BASENAME}-${RELEASE}/00README
+ devkit/sedition RELEASE ${RELEASE} ../${BASENAME}-${RELEASE}/INSTALL
+# Cleanup
+ (cd ../${BASENAME}-${RELEASE}/; make implode)
+ (cd ../${BASENAME}-${RELEASE}/; make distclean)
+# Packaging
+ (cd ..; tar cvf ${BASENAME}-${RELEASE}.tar ${BASENAME}-${RELEASE})
+ (cd ..; ${COMPRESS} ${BASENAME}-${RELEASE}.tar)
+
+
+
+# `make dcheck`: run developer testsuite, save output in testsuite/dcheck.report
+dcheck:
+ ${QUIET_SUBDIR0}testsuite ${QUIET_SUBDIR1} dcheck
+
+# The "implode" target is used when we've got Easel as a subdirectory
+# of a larger project, like Infernal or HMMER, and we're building a
+# distribution for that larger project. We remove any "personal
+# information" from Easel. Eventually that'd include our bug tracking,
+# for instance, but right now there's nothing to do.
+implode:
+ -rm -f 00CHECKLIST
+ -rm -f LICENSE.tag
+
+TAGS:
+ ./makeTAGS.sh
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..b4e48c5
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,867 @@
+# aclocal.m4 contains custom macros used for creating configuration scripts.
+#
+# The aclocal.m4 in Easel is the master copy. HMMER and other projects
+# that depend on Easel create a symlink to the Easel aclocal.m4.
+#
+# Contents:
+# 1. CHECK_GNU_MAKE Sets EXEC_DEPENDENCY to $$@.o vs. %: %.o for sysv vs. GNU make.
+# 2. ACX_MPI Detects MPI installation
+# 3. ACX_PTHREAD Detects POSIX threads
+# 4. AX_COMPILER_VENDOR Sets $ax_cv_c_compiler_vendor to gnu, intel, etc.
+# 5. AX_CHECK_COMPILER_FLAGS Checks for support of a compiler flag. Example: -msse2
+# 6. AX_GCC_FUNC_ATTRIBUTE Checks for gcc-like support of function __attribute() tags
+# 7. ESL_PIC_FLAGS Detects whether/how to build PIC (position independent code)
+# 8. Copyright, license info
+#
+# The autoconf macro archive is at:
+# http://www.gnu.org/software/ac-archive/
+#
+
+#################################################################
+# Macro: CHECK_GNU_MAKE
+# Usage: CHECK_GNU_MAKE
+# Author: John Darrington <j.darrington at elvis.murdoch.edu.au>
+# Modified from the original.
+#
+# Sets the format of makefile dependency lines for executables.
+#
+# We need this because GNU make and SYSV make use different systems
+# specifying variables for dependencies: $$@ in sysv, %: %.o in GNU.
+# Would love to hear a better way of doing this.
+#
+# I use two different conventions in my Makefiles. Sometimes
+# executable "foo" has a file "foo.c" - this is the HMMER, Easel, Infernal convention.
+# Sometimes executable "foo" has a file "foo_main.c" - this is
+# my older SQUID convention. The configure script sets the
+# EXEC_DEPENDENCY appropriately: here, HMMER style.
+#
+# Then we can write one Makefile line for all programs in ${PROGS} like so:
+# ${PROGS}: @EXEC_DEPENDENCY@
+#
+# Sets an output variable EXEC_DEPENDENCY.
+#
+AC_DEFUN(CHECK_GNU_MAKE,[
+ AC_MSG_CHECKING(whether you have a GNU make)
+ foundGNUmake='nope, so we assume you will use a sysv-compatible make.' ;
+ EXEC_DEPENDENCY=[\$\$\@.o] ;
+ for a in "$MAKE" make gmake gnumake ; do
+ if test -z "$a" ; then continue ; fi ;
+ if ( sh -c "$a --version" 2> /dev/null | grep GNU 2>&1 > /dev/null ) ; then
+ foundGNUmake='yes, you do; and we assume you will use it!' ;
+ EXEC_DEPENDENCY='%: %.o' ;
+ fi
+ done
+ AC_MSG_RESULT($foundGNUmake)
+ AC_SUBST(EXEC_DEPENDENCY)
+])
+
+
+################################################################
+# Macro: ACX_MPI
+# Usage: ACX_MPI([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+# Authors: Steven G. Johnson and Julian C. Cummings
+# Version: 2006-10-22
+# Unmodified from the original; can be replaced with new version.
+#
+# xref http://autoconf-archive.cryp.to/acx_mpi.html
+# Sets MPICC, MPILIBS output variable.
+# If ACTION-IF-FOUND is not specified, default action defines HAVE_MPI.
+#
+AC_DEFUN([ACX_MPI], [
+AC_PREREQ(2.50) dnl for AC_LANG_CASE
+
+AC_LANG_CASE([C], [
+ AC_REQUIRE([AC_PROG_CC])
+ AC_ARG_VAR(MPICC,[MPI C compiler command])
+ AC_CHECK_PROGS(MPICC, mpicc hcc mpxlc_r mpxlc mpcc cmpicc, $CC)
+ acx_mpi_save_CC="$CC"
+ CC="$MPICC"
+ AC_SUBST(MPICC)
+],
+[C++], [
+ AC_REQUIRE([AC_PROG_CXX])
+ AC_ARG_VAR(MPICXX,[MPI C++ compiler command])
+ AC_CHECK_PROGS(MPICXX, mpic++ mpicxx mpiCC hcp mpxlC_r mpxlC mpCC cmpic++, $CXX)
+ acx_mpi_save_CXX="$CXX"
+ CXX="$MPICXX"
+ AC_SUBST(MPICXX)
+],
+[Fortran 77], [
+ AC_REQUIRE([AC_PROG_F77])
+ AC_ARG_VAR(MPIF77,[MPI Fortran 77 compiler command])
+ AC_CHECK_PROGS(MPIF77, mpif77 hf77 mpxlf_r mpxlf mpf77 cmpifc, $F77)
+ acx_mpi_save_F77="$F77"
+ F77="$MPIF77"
+ AC_SUBST(MPIF77)
+],
+[Fortran], [
+ AC_REQUIRE([AC_PROG_FC])
+ AC_ARG_VAR(MPIFC,[MPI Fortran compiler command])
+ AC_CHECK_PROGS(MPIFC, mpif90 mpxlf95_r mpxlf90_r mpxlf95 mpxlf90 mpf90 cmpif90c, $FC)
+ acx_mpi_save_FC="$FC"
+ FC="$MPIFC"
+ AC_SUBST(MPIFC)
+])
+
+if test x = x"$MPILIBS"; then
+ AC_LANG_CASE([C], [AC_CHECK_FUNC(MPI_Init, [MPILIBS=" "])],
+ [C++], [AC_CHECK_FUNC(MPI_Init, [MPILIBS=" "])],
+ [Fortran 77], [AC_MSG_CHECKING([for MPI_Init])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[ call MPI_Init])],[MPILIBS=" "
+ AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)])],
+ [Fortran], [AC_MSG_CHECKING([for MPI_Init])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[ call MPI_Init])],[MPILIBS=" "
+ AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)])])
+fi
+AC_LANG_CASE([Fortran 77], [
+ if test x = x"$MPILIBS"; then
+ AC_CHECK_LIB(fmpi, MPI_Init, [MPILIBS="-lfmpi"])
+ fi
+ if test x = x"$MPILIBS"; then
+ AC_CHECK_LIB(fmpich, MPI_Init, [MPILIBS="-lfmpich"])
+ fi
+],
+[Fortran], [
+ if test x = x"$MPILIBS"; then
+ AC_CHECK_LIB(fmpi, MPI_Init, [MPILIBS="-lfmpi"])
+ fi
+ if test x = x"$MPILIBS"; then
+ AC_CHECK_LIB(mpichf90, MPI_Init, [MPILIBS="-lmpichf90"])
+ fi
+])
+if test x = x"$MPILIBS"; then
+ AC_CHECK_LIB(mpi, MPI_Init, [MPILIBS="-lmpi"])
+fi
+if test x = x"$MPILIBS"; then
+ AC_CHECK_LIB(mpich, MPI_Init, [MPILIBS="-lmpich"])
+fi
+
+dnl We have to use AC_TRY_COMPILE and not AC_CHECK_HEADER because the
+dnl latter uses $CPP, not $CC (which may be mpicc).
+AC_LANG_CASE([C], [if test x != x"$MPILIBS"; then
+ AC_MSG_CHECKING([for mpi.h])
+ AC_TRY_COMPILE([#include <mpi.h>],[],[AC_MSG_RESULT(yes)], [MPILIBS=""
+ AC_MSG_RESULT(no)])
+fi],
+[C++], [if test x != x"$MPILIBS"; then
+ AC_MSG_CHECKING([for mpi.h])
+ AC_TRY_COMPILE([#include <mpi.h>],[],[AC_MSG_RESULT(yes)], [MPILIBS=""
+ AC_MSG_RESULT(no)])
+fi],
+[Fortran 77], [if test x != x"$MPILIBS"; then
+ AC_MSG_CHECKING([for mpif.h])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[ include 'mpif.h'])],[AC_MSG_RESULT(yes)], [MPILIBS=""
+ AC_MSG_RESULT(no)])
+fi],
+[Fortran], [if test x != x"$MPILIBS"; then
+ AC_MSG_CHECKING([for mpif.h])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[ include 'mpif.h'])],[AC_MSG_RESULT(yes)], [MPILIBS=""
+ AC_MSG_RESULT(no)])
+fi])
+
+AC_LANG_CASE([C], [CC="$acx_mpi_save_CC"],
+ [C++], [CXX="$acx_mpi_save_CXX"],
+ [Fortran 77], [F77="$acx_mpi_save_F77"],
+ [Fortran], [FC="$acx_mpi_save_FC"])
+
+AC_SUBST(MPILIBS)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x = x"$MPILIBS"; then
+ $2
+ :
+else
+ ifelse([$1],,[AC_DEFINE(HAVE_MPI,1,[Define if you have the MPI library.])],[$1])
+ :
+fi
+])dnl ACX_MPI
+
+
+
+#################################################################
+# Macro: ACX_PTHREAD
+# Usage: ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+# Authors: Steven G. Johnson <stevenj at alum.mit.edu>
+# Alejandro Forero Cuervo <bachue at bachue.com>
+# Version: 1.9 (2004/02/23)
+# Source: http://www.gnu.org/software/ac-archive/htmldoc/acx_pthread.html
+#
+# SRE: I have modified this source; search for SRE to see where.
+# Solaris needs -D_POSIX_PTHREAD_SEMANTICS or ctime_r() calls will choke.
+#
+dnl Available from the GNU Autoconf Macro Archive at:
+dnl http://www.gnu.org/software/ac-archive/htmldoc/acx_pthread.html
+dnl
+AC_DEFUN([ACX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_SAVE
+AC_LANG_C
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
+ AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
+ AC_MSG_RESULT($acx_pthread_ok)
+ if test x"$acx_pthread_ok" = xno; then
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+ fi
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try. Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important. Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+# other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+# doesn't hurt to check since this sometimes defines pthreads too;
+# also defines -D_REENTRANT)
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+ *solaris*)
+
+ # On Solaris (at least, for some versions), libc contains stubbed
+ # (non-functional) versions of the pthreads routines, so link-based
+ # tests will erroneously succeed. (We need to link with -pthread or
+ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
+ # a function called by this macro, so we could check for that, but
+ # who knows whether they'll stub that too in a future libc.) So,
+ # we'll just look for -pthreads and -lpthread first:
+
+ acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags"
+ ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+ case $flag in
+ none)
+ AC_MSG_CHECKING([whether pthreads work without any flags])
+ ;;
+
+ -*)
+ AC_MSG_CHECKING([whether pthreads work with $flag])
+ PTHREAD_CFLAGS="$flag"
+ ;;
+
+ pthread-config)
+ AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
+ if test x"$acx_pthread_config" = xno; then continue; fi
+ PTHREAD_CFLAGS="`pthread-config --cflags`"
+ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+ ;;
+
+ *)
+ AC_MSG_CHECKING([for the pthreads library -l$flag])
+ PTHREAD_LIBS="-l$flag"
+ ;;
+ esac
+
+ save_LIBS="$LIBS"
+ save_CFLAGS="$CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+ # Check for various functions. We must include pthread.h,
+ # since some functions may be macros. (On the Sequent, we
+ # need a special flag -Kthread to make this header compile.)
+ # We check for pthread_join because it is in -lpthread on IRIX
+ # while pthread_create is in libc. We check for pthread_attr_init
+ # due to DEC craziness with -lpthreads. We check for
+ # pthread_cleanup_push because it is one of the few pthread
+ # functions on Solaris that doesn't have a non-functional libc stub.
+ # We try pthread_create on general principles.
+ AC_TRY_LINK([#include <pthread.h>],
+ [pthread_t th; pthread_join(th, 0);
+ pthread_attr_init(0); pthread_cleanup_push(0, 0);
+ pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+ [acx_pthread_ok=yes])
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ AC_MSG_RESULT($acx_pthread_ok)
+ if test "x$acx_pthread_ok" = xyes; then
+ break;
+ fi
+
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+ # Detect AIX lossage: threads are created detached by default
+ # and the JOINABLE attribute has a nonstandard name (UNDETACHED).
+ AC_MSG_CHECKING([for joinable pthread attribute])
+ AC_TRY_LINK([#include <pthread.h>],
+ [int attr=PTHREAD_CREATE_JOINABLE;],
+ ok=PTHREAD_CREATE_JOINABLE, ok=unknown)
+ if test x"$ok" = xunknown; then
+ AC_TRY_LINK([#include <pthread.h>],
+ [int attr=PTHREAD_CREATE_UNDETACHED;],
+ ok=PTHREAD_CREATE_UNDETACHED, ok=unknown)
+ fi
+ if test x"$ok" != xPTHREAD_CREATE_JOINABLE; then
+ AC_DEFINE(PTHREAD_CREATE_JOINABLE, $ok,
+ [Define to the necessary symbol if this constant
+ uses a non-standard name on your system.])
+ fi
+ AC_MSG_RESULT(${ok})
+ if test x"$ok" = xunknown; then
+ AC_MSG_WARN([we do not know how to create joinable pthreads])
+ fi
+
+ AC_MSG_CHECKING([if more special flags are required for pthreads])
+ flag=no
+# Added _POSIX_PTHREAD_SEMANTICS for solaris. Needed for ctime_r() compliance.
+# SRE, Fri Oct 29 10:03:36 2010 [J7/3]
+ case "${host_cpu}-${host_os}" in
+ *-aix* | *-freebsd*) flag="-D_THREAD_SAFE";;
+ *solaris*) flag="-D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS";;
+ *-osf* | *-hpux*) flag="-D_REENTRANT";;
+ esac
+ AC_MSG_RESULT(${flag})
+ if test "x$flag" != xno; then
+ PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+ fi
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ # More AIX lossage: must compile with cc_r
+ AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC})
+else
+ PTHREAD_CC="$CC"
+fi
+
+AC_SUBST(PTHREAD_LIBS)
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_CC)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+ ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
+ :
+else
+ acx_pthread_ok=no
+ $2
+fi
+AC_LANG_RESTORE
+])dnl ACX_PTHREAD
+#
+# ACX_PTHREAD macro end.
+# ****************************************************************
+# ****************************************************************
+
+
+
+#################################################################
+# Macro: AX_COMPILER_VENDOR
+# Usage: AX_COMPILER_VENDOR
+# Authors: Copyright (C) 2007 Steven G. Johnson <stevenj at alum.mit.edu>
+# Copyright (C) 2007 Matteo Frigo
+# Version: 2007-08-01
+# Source: http://autoconf-archive.cryp.to/ax_compiler_vendor.html
+#
+# Sets $ax_cv_c_compiler_vendor to gnu, intel, ibm, sun, hp, borland,
+# comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft, watcom, etc.
+#
+# Everything below is verbatim from the archive. DO NOT MODIFY IT.
+AC_DEFUN([AX_COMPILER_VENDOR],
+[
+AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
+ [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
+ # note: don't check for gcc first since some other compilers define __GNUC__
+ for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
+ vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
+#if !($vencpp)
+ thisisanerror;
+#endif
+])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
+ done
+ ])
+])
+#
+# AX_COMPILER_VENDOR macro end.
+# ****************************************************************
+# ****************************************************************
+
+
+
+
+#################################################################
+# Macro: AX_CHECK_COMPILER_FLAGS
+# Usage: AX_CHECK_COMPILER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE])
+# Authors: Copyright (C) 2007 Steven G. Johnson <stevenj at alum.mit.edu>
+# Copyright (C) 2007 Matteo Frigo.
+# Version: 2007-07-29
+# Source: http://autoconf-archive.cryp.to/ax_check_compiler_flags.html
+#
+# Check whether the given compiler FLAGS work with the current language's compiler,
+# or whether they give an error. (Warnings, however, are ignored.)
+# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on success/failure.
+#
+# Everything below is verbatim from the archive. DO NOT MODIFY IT.
+#
+AC_DEFUN([AX_CHECK_COMPILER_FLAGS],
+[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
+AC_MSG_CHECKING([whether _AC_LANG compiler accepts $1])
+dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname:
+AS_LITERAL_IF([$1],
+ [AC_CACHE_VAL(AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1), [
+ ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
+ _AC_LANG_PREFIX[]FLAGS="$1"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
+ AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=yes,
+ AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=no)
+ _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])],
+ [ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
+ _AC_LANG_PREFIX[]FLAGS="$1"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
+ eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=yes,
+ eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=no)
+ _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])
+eval ax_check_compiler_flags=$AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)
+AC_MSG_RESULT($ax_check_compiler_flags)
+if test "x$ax_check_compiler_flags" = xyes; then
+ m4_default([$2], :)
+else
+ m4_default([$3], :)
+fi
+])dnl AX_CHECK_COMPILER_FLAGS
+#
+# AX_CHECK_COMPILER_FLAGS macro end.
+# ****************************************************************
+# ****************************************************************
+
+
+
+
+
+
+
+#################################################################
+# Macro: AX_GCC_FUNC_ATTRIBUTE
+# Usage: AX_GCC_FUNC_ATTRIBUTE(noreturn), for example
+# Author: Gabriele Svelto <gabriele.svelto at gmail.com>
+# Version: 3?
+# Source: http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html
+# Unmodified from the original; can be replaced by a new version.
+#
+# Defines HAVE_FUNC_ATTRIBUTE_NORETURN (for example).
+#
+################################################################
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE)
+#
+# DESCRIPTION
+#
+# This macro checks if the compiler supports one of GCC's function
+# attributes; many other compilers also provide function attributes with
+# the same syntax. Compiler warnings are used to detect supported
+# attributes as unsupported ones are ignored by default so quieting
+# warnings when using this macro will yield false positives.
+#
+# The ATTRIBUTE parameter holds the name of the attribute to be checked.
+#
+# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>.
+#
+# The macro caches its result in the ax_cv_have_func_attribute_<attribute>
+# variable.
+#
+# The macro currently supports the following function attributes:
+#
+# alias
+# aligned
+# alloc_size
+# always_inline
+# artificial
+# cold
+# const
+# constructor
+# constructor_priority for constructor attribute with priority
+# deprecated
+# destructor
+# dllexport
+# dllimport
+# error
+# externally_visible
+# flatten
+# format
+# format_arg
+# gnu_inline
+# hot
+# ifunc
+# leaf
+# malloc
+# noclone
+# noinline
+# nonnull
+# noreturn
+# nothrow
+# optimize
+# pure
+# unused
+# used
+# visibility
+# warning
+# warn_unused_result
+# weak
+# weakref
+#
+# Unsuppored function attributes will be tested with a prototype returning
+# an int and not accepting any arguments and the result of the check might
+# be wrong or meaningless so use with care.
+#
+# LICENSE
+#
+# Copyright (c) 2013 Gabriele Svelto <gabriele.svelto at gmail.com>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 3
+
+AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
+ AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
+
+ AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([
+ m4_case([$1],
+ [alias], [
+ int foo( void ) { return 0; }
+ int bar( void ) __attribute__(($1("foo")));
+ ],
+ [aligned], [
+ int foo( void ) __attribute__(($1(32)));
+ ],
+ [alloc_size], [
+ void *foo(int a) __attribute__(($1(1)));
+ ],
+ [always_inline], [
+ inline __attribute__(($1)) int foo( void ) { return 0; }
+ ],
+ [artificial], [
+ inline __attribute__(($1)) int foo( void ) { return 0; }
+ ],
+ [cold], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [const], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [constructor_priority], [
+ int foo( void ) __attribute__((__constructor__(65535/2)));
+ ],
+ [constructor], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [deprecated], [
+ int foo( void ) __attribute__(($1("")));
+ ],
+ [destructor], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [dllexport], [
+ __attribute__(($1)) int foo( void ) { return 0; }
+ ],
+ [dllimport], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [error], [
+ int foo( void ) __attribute__(($1("")));
+ ],
+ [externally_visible], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [flatten], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [format], [
+ int foo(const char *p, ...) __attribute__(($1(printf, 1, 2)));
+ ],
+ [format_arg], [
+ char *foo(const char *p) __attribute__(($1(1)));
+ ],
+ [gnu_inline], [
+ inline __attribute__(($1)) int foo( void ) { return 0; }
+ ],
+ [hot], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [ifunc], [
+ int my_foo( void ) { return 0; }
+ static int (*resolve_foo(void))(void) { return my_foo; }
+ int foo( void ) __attribute__(($1("resolve_foo")));
+ ],
+ [leaf], [
+ __attribute__(($1)) int foo( void ) { return 0; }
+ ],
+ [malloc], [
+ void *foo( void ) __attribute__(($1));
+ ],
+ [noclone], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [noinline], [
+ __attribute__(($1)) int foo( void ) { return 0; }
+ ],
+ [nonnull], [
+ int foo(char *p) __attribute__(($1(1)));
+ ],
+ [noreturn], [
+ void foo( void ) __attribute__(($1));
+ ],
+ [nothrow], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [optimize], [
+ __attribute__(($1(3))) int foo( void ) { return 0; }
+ ],
+ [pure], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [unused], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [used], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [visibility], [
+ int foo_def( void ) __attribute__(($1("default")));
+ int foo_hid( void ) __attribute__(($1("hidden")));
+ int foo_int( void ) __attribute__(($1("internal")));
+ int foo_pro( void ) __attribute__(($1("protected")));
+ ],
+ [warning], [
+ int foo( void ) __attribute__(($1("")));
+ ],
+ [warn_unused_result], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [weak], [
+ int foo( void ) __attribute__(($1));
+ ],
+ [weakref], [
+ static int foo( void ) { return 0; }
+ static int bar( void ) __attribute__(($1("foo")));
+ ],
+ [
+ m4_warn([syntax], [Unsupported attribute $1, the test may fail])
+ int foo( void ) __attribute__(($1));
+ ]
+ )], [])
+ ],
+ dnl GCC doesn't exit with an error if an unknown attribute is
+ dnl provided but only outputs a warning, so accept the attribute
+ dnl only if no warning were issued.
+ [AS_IF([test -s conftest.err],
+ [AS_VAR_SET([ac_var], [no])],
+ [AS_VAR_SET([ac_var], [yes])])],
+ [AS_VAR_SET([ac_var], [no])])
+ ])
+
+ AS_IF([test yes = AS_VAR_GET([ac_var])],
+ [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1,
+ [Define to 1 if the system has the `$1' function attribute])], [])
+
+ AS_VAR_POPDEF([ac_var])
+])
+#
+# AX_GCC_FUNC_ATTRIBUTE macro end
+# ****************************************************************
+# ****************************************************************
+
+
+
+
+################################################################
+# Macro: ESL_PIC_FLAGS
+# Usage: ESL_PIC_FLAGS
+# Author: Dan Nicholson, Mesa3D project
+# References: http://www.mesa3d.org/
+# http://www.mail-archive.com/mesa3d-dev@lists.sourceforge.net/msg04938.html
+#
+# Derived (essentially verbatim) from MESA_PIC_FLAGS, in the Mesa
+# project's acinclude.m4 file. From the Mesa file's header:
+# "Find out whether to build PIC code using the option --enable-pic and
+# the configure enable_static/enable_shared settings. If PIC is needed,
+# figure out the necessary flags for the platform and compiler.
+#
+# The platform checks have been shamelessly taken from libtool and
+# stripped down to just what's needed for Mesa. See _LT_COMPILER_PIC in
+# /usr/share/aclocal/libtool.m4 or
+# http://git.savannah.gnu.org/gitweb/?p=libtool.git;a=blob;f=libltdl/m4/libtool.m4;hb=HEAD
+#
+# Sets an output variable @PIC_FLAGS@ which should be added to
+# CFLAGS lines.
+#
+AC_DEFUN([ESL_PIC_FLAGS],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_ARG_VAR([PIC_FLAGS], [compiler flags for PIC code])
+AC_ARG_ENABLE([pic],
+ [AS_HELP_STRING([--disable-pic],
+ [compile PIC objects @<:@default=enabled for shared builds
+ on supported platforms@:>@])],
+ [enable_pic="$enableval"
+ test "x$enable_pic" = x && enable_pic=auto],
+ [enable_pic=auto])
+# disable PIC by default for static builds
+if test "$enable_pic" = auto && test "$enable_static" = yes; then
+ enable_pic=no
+fi
+# if PIC hasn't been explicitly disabled, try to figure out the flags
+if test "$enable_pic" != no; then
+ AC_MSG_CHECKING([for $CC option to produce PIC])
+ # allow the user's flags to override
+ if test "x$PIC_FLAGS" = x; then
+ # see if we're using GCC
+ if test "x$GCC" = xyes; then
+ case "$host_os" in
+ aix*|beos*|cygwin*|irix5*|irix6*|osf3*|osf4*|osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw*|os2*|pw32*)
+ # This hack is so that the source file can tell whether
+ # it is being built for inclusion in a dll (and should
+ # export symbols for example).
+ PIC_FLAGS="-DDLL_EXPORT"
+ ;;
+ darwin*|rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ PIC_FLAGS="-fno-common"
+ ;;
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX,
+ # but not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ PIC_FLAGS="-fPIC"
+ ;;
+ esac
+ ;;
+ *)
+ # Everyone else on GCC uses -fPIC
+ PIC_FLAGS="-fPIC"
+ ;;
+ esac
+ else # !GCC
+ case "$host_os" in
+ hpux9*|hpux10*|hpux11*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX,
+ # but not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ PIC_FLAGS="+Z"
+ ;;
+ esac
+ ;;
+ linux*|k*bsd*-gnu)
+ case `basename "$CC"` in
+ icc*|ecc*|ifort*)
+ PIC_FLAGS="-KPIC"
+ ;;
+ pgcc*|pgf77*|pgf90*|pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc
+ # compiler, which looks to be a dead project)
+ PIC_FLAGS="-fpic"
+ ;;
+ ccc*)
+ # All Alpha code is PIC.
+ ;;
+ xl*)
+ # IBM XL C 8.0/Fortran 10.1 on PPC
+ PIC_FLAGS="-qpic"
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*|*Sun\ F*)
+ # Sun C 5.9 or Sun Fortran
+ PIC_FLAGS="-KPIC"
+ ;;
+ esac
+ esac
+ ;;
+ solaris*)
+ PIC_FLAGS="-KPIC"
+ ;;
+ sunos4*)
+ PIC_FLAGS="-PIC"
+ ;;
+ esac
+ fi # GCC
+ fi # PIC_FLAGS
+ AC_MSG_RESULT([$PIC_FLAGS])
+fi
+AC_SUBST([PIC_FLAGS])
+])
+#
+# ESL_PIC_FLAGS macro end.
+# ****************************************************************
+# ****************************************************************
+
+
+
+#################################################################
+# @LICENSE@
+#
+# SVN $Id$
+# SVN $URL$
+#################################################################
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..dd1688b
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1459 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2004-06-11'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Per Bothner <per at bothner.com>.
+# Please send patches to <config-patches at gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit 0 ;;
+ --version | -v )
+ echo "$version" ; exit 0 ;;
+ --help | --h* | -h )
+ echo "$usage"; exit 0 ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit 0 ;;
+ amd64:OpenBSD:*:*)
+ echo x86_64-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ cats:OpenBSD:*:*)
+ echo arm-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ luna88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:OpenBSD:*:*)
+ echo powerpc-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvmeppc:OpenBSD:*:*)
+ echo powerpc-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ pmax:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mipseb-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ wgrisc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:MirBSD:*:*)
+ echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit 0 ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit 0 ;;
+ Alpha*:OpenVMS:*:*)
+ echo alpha-hp-vms
+ exit 0 ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit 0;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit 0 ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit 0 ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit 0 ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit 0;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit 0 ;;
+ DRS?6000:UNIX_SV:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7 && exit 0 ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit 0 ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit 0 ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit 0 ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c \
+ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && exit 0
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit 0 ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit 0 ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ # avoid double evaluation of $set_cc_for_build
+ test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ *:UNICOS/mp:*:*)
+ echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ # Determine whether the default compiler uses glibc.
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #if __GLIBC__ >= 2
+ LIBC=gnu
+ #else
+ LIBC=
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ # GNU/KFreeBSD systems have a "k" prefix to indicate we are using
+ # FreeBSD's kernel, but not the complete OS.
+ case ${LIBC} in gnu) kernel_only='k' ;; esac
+ echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit 0 ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit 0 ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit 0 ;;
+ x86:Interix*:[34]*)
+ echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+ exit 0 ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit 0 ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit 0 ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit 0 ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit 0 ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit 0 ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+ ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit 0 ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit 0 ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit 0 ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit 0 ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit 0 ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit 0 ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit 0 ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit 0 ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit 0 ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit 0 ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #ifdef __INTEL_COMPILER
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+ test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit 0 ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit 0 ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit 0 ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit 0 ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit 0 ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit 0 ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit 0 ;;
+ i*86:*:5:[78]*)
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit 0 ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit 0 ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit 0 ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel at ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes at openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf at swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ *:VOS:*:*)
+ # From Paul.Green at stratus.com.
+ echo hppa1.1-stratus-vos
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit 0 ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit 0 ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit 0 ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit 0 ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Darwin:*:*)
+ case `uname -p` in
+ *86) UNAME_PROCESSOR=i686 ;;
+ powerpc) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit 0 ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit 0 ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit 0 ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit 0 ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit 0 ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit 0 ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit 0 ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit 0 ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit 0 ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit 0 ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit 0 ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit 0 ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit 0 ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit 0 ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit 0 ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..ba33103
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1549 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2004-03-12'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Please send patches to <config-patches at gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit 0 ;;
+ --version | -v )
+ echo "$version" ; exit 0 ;;
+ --help | --h* | -h )
+ echo "$usage"; exit 0 ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit 0;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | msp430 \
+ | ns16k | ns32k \
+ | openrisc | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | msp430-* \
+ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+ | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ cr16c)
+ basic_machine=cr16c-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ mmix*)
+ basic_machine=mmix-knuth
+ os=-mmixware
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nv1)
+ basic_machine=nv1-cray
+ os=-unicosmp
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ or32 | or32-*)
+ basic_machine=or32-unknown
+ os=-coff
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..fcd4ed4
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,565 @@
+# Process this file with autoconf to produce the Easel configuration script.
+#
+# reminders to save re-reading autoconf manual for the n'th time:
+# output variables:
+# - are defined here as normal shell variables, e.g. FOO="my string"
+# - are made into output variables by calling AC_SUBST(FOO)
+# - any occurrence of @FOO@ in an output file is then substituted
+# This only happens in files we assign w/ AC_CONFIG_FILES;
+# such as our Makefile.in's, for example.
+#
+# C preprocessor symbols:
+# - are defined here by calling AC_DEFINE(FOO) or AC_DEFINE(FOO, [42])
+# - then #undef FOO lines in easel.h.in become #define FOO or #define FOO 42
+# This only happens in header files that we assign
+# w/ AC_CONFIG_HEADERS, such as easel.h.in
+#
+# Contents:
+# 1. autoconf requirements
+# 2. AC_INIT
+# 3. info on the package
+# 4. process ./configure commandline options
+# 5. checks for programs, including ${CC}, ${CFLAGS}
+# 6. checks for libraries
+# 7. checks for header files
+# 8. checks for types
+# 9. checks for structures
+# 10. checks for compiler characteristics
+# 11. checks for library functions
+# 11. checks for system services
+# 12. AC_CONFIG_FILES
+# 13. AC_OUTPUT
+#
+# Order obeys autoconf manual, "standard configure.ac layout".
+
+
+
+################################################################
+# 1. autoconf requirements
+################################################################
+# autoconf 2.61 has a bug in AC_FUNC_FSEEKO; make sure we don't use it.
+AC_PREREQ(2.63)
+
+
+
+################################################################
+# 2. AC_INIT
+################################################################
+AC_INIT(Easel, 0.43, sean at eddylab.org, easel)
+AC_MSG_NOTICE([Configuring the Easel library for your system.])
+
+# remember if the user is overriding CFLAGS
+if test x"$CFLAGS" = x; then
+ sre_cflags_env_set=no
+else
+ sre_cflags_env_set=yes
+fi
+
+################################################################
+# 3. Info on the package
+################################################################
+#
+# The four AC_INIT args above set the following output variables and preprocessor
+# symbols:
+# PACKAGE_NAME <package> e.g. "Easel"
+# PACKAGE_VERSION <version> e.g. "0.43"
+# PACKAGE_BUGREPORT <bug-report> e.g. "sean at eddylab.org"
+# PACKAGE_TARNAME <tarname> e.g. "easel"
+# From them, AC_INIT automatically derives one more:
+# PACKAGE_STRING <package> <version>, e.g. "Easel 0.43"
+# Then we define some of our own:
+# EASEL_DATE release date: e.g. "July 2016"
+# EASEL_COPYRIGHT one-line copyright string
+# EASEL_LICENSE one-line license string
+# EASEL_LICENSETAG which license to bundle from Licenses/ subdirectory.
+# EASEL_URL URL home for Easel.
+#
+# Because Easel is designed to be a library and must coexist with
+# packages that include it as a subdirectory (HMMER, Infernal...),
+# we don't want to use AC_INIT's PACKAGE_ variables as preprocessor
+# symbols to put version info into executables; we'll get name clashes,
+# plus we might want to have both Easel version info and main package
+# version info. So, we use the PACKAGE_ stuff to make a
+# new preprocessor symbol of our own:
+# EASEL_VERSION e.g. "1.9a"
+#
+
+EASEL_DATE="July 2016"
+EASEL_COPYRIGHT="Copyright (C) 2016 Howard Hughes Medical Institute"
+EASEL_LICENSE="Freely distributed under the BSD open source license."
+EASEL_VERSION=$PACKAGE_VERSION
+EASEL_URL="http://bioeasel.org/"
+
+# Output variables.
+# (AC_OUTPUT replaces instances of @var@ in input files.)
+AC_SUBST(EASEL_DATE)
+AC_SUBST(EASEL_COPYRIGHT)
+AC_SUBST(EASEL_LICENSE)
+AC_SUBST(EASEL_VERSION)
+AC_SUBST(EASEL_URL)
+
+# Preprocessor symbols.
+# adds a -Dvar=value to @DEFS@;
+# replace #undef's in easel.h.in
+AC_DEFINE_UNQUOTED(EASEL_DATE, "$EASEL_DATE")
+AC_DEFINE_UNQUOTED(EASEL_COPYRIGHT, "$EASEL_COPYRIGHT")
+AC_DEFINE_UNQUOTED(EASEL_LICENSE, "$EASEL_LICENSE")
+AC_DEFINE_UNQUOTED(EASEL_VERSION, "$EASEL_VERSION")
+
+# Figure out what host we're compiling on.
+# Three GNU scripts must be included in the distro:
+# install.sh, config.guess, config.sub
+# This sets four shell variables:
+# host example: i686-pc-linux-gnu
+# host_cpu example: i686
+# host_vendor example: pc
+# host_os example: linux-gnu
+AC_CANONICAL_HOST
+
+
+################################################################
+# 4. Process ./configure command line options
+################################################################
+
+# --enable-modular - configure for use of standalone modules
+#
+# Default is to enable all augmentations and compile entire library.
+# With --enable-modular, any desired augmentations must be set
+# at compile-time by the user.
+#
+AC_ARG_ENABLE(modular,[AS_HELP_STRING([--enable-modular],[compile and prepare modules for standalone use])],
+ [
+ AC_MSG_NOTICE([Compiling for standalone (independent) use of modules.])
+ ],
+ [
+ AC_MSG_NOTICE([Compiling the full Easel library, with all augmentations.])
+ AC_DEFINE(eslAUGMENT_ALPHABET)
+ AC_DEFINE(eslAUGMENT_NCBI)
+ AC_DEFINE(eslAUGMENT_DMATRIX)
+ AC_DEFINE(eslAUGMENT_FILEPARSER)
+ AC_DEFINE(eslAUGMENT_GEV)
+ AC_DEFINE(eslAUGMENT_GUMBEL)
+ AC_DEFINE(eslAUGMENT_HISTOGRAM)
+ AC_DEFINE(eslAUGMENT_KEYHASH)
+ AC_DEFINE(eslAUGMENT_MINIMIZER)
+ AC_DEFINE(eslAUGMENT_MSA)
+ AC_DEFINE(eslAUGMENT_RANDOM)
+ AC_DEFINE(eslAUGMENT_SSI)
+ AC_DEFINE(eslAUGMENT_STATS)
+ AC_DEFINE(eslLIBRARY)
+ ])
+
+# --enable-debugging - enable basic debugging code (level 1)
+# --enable-debugging=x - also set verbosity level to <x> (1-3)
+#
+# At all levels, replaces CFLAGS w/ "-g -Wall" (so it assumes gcc).
+# Sets the eslDEBUGLEVEL preprocessor symbol to <x>
+#
+AC_ARG_ENABLE(debugging,
+[AS_HELP_STRING([--enable-debugging],[include debugging code])
+AS_HELP_STRING([--enable-debugging=x],[also set diagnostics verbosity level to <x> (1-3)])],
+enable_debugging=$enableval, enable_debugging=no)
+
+case $enable_debugging in
+ yes) AC_DEFINE(eslDEBUGLEVEL, 1);;
+ 1) AC_DEFINE(eslDEBUGLEVEL, 1);;
+ 2) AC_DEFINE(eslDEBUGLEVEL, 2);;
+ 3) AC_DEFINE(eslDEBUGLEVEL, 3);;
+ no) AC_DEFINE(eslDEBUGLEVEL, 0);;
+ *) AC_MSG_ERROR([Unknown argument to --enable-debugging: $enable_debugging]);;
+esac
+
+# --enable-threads Enable POSIX multithreading
+#
+# Uses ACX_PTHREAD macro from the GNU macro archive.
+# Back to my code to finish enabling pthreads...
+# Define these preprocessor variables:
+# HAVE_PTHREAD
+# HAVE_PTHREAD_SETCONCURRENCY
+# HAVE_PTHREAD_ATTR_SETSCOPE
+#
+AC_ARG_ENABLE([threads],
+ [AS_HELP_STRING([--enable-threads],
+ [enable POSIX multithreading support (default is check)])],
+ [],
+ [enable_threads=check])
+
+case $enable_threads in
+ yes) check_threads=yes
+ ;;
+ no) check_threads=no
+ ;;
+ check) check_threads=yes
+ ;;
+ *) check_threads=no
+ AC_MSG_NOTICE([Ignoring unknown argument to --enable-threads: $enable_threads])
+ ;;
+esac
+
+AS_IF([test "x$check_threads" != xno],
+ [ACX_PTHREAD([AC_DEFINE(HAVE_PTHREAD)
+ AC_SUBST(PTHREAD_LIBS)
+ AC_SUBST(PTHREAD_CFLAGS)],
+ [if test "x$enable_threads" != xcheck; then
+ AC_MSG_FAILURE([POSIX multithreading failed])
+ fi])])
+
+AC_ARG_ENABLE(gcov,[AS_HELP_STRING([--enable-gcov],[compile for code coverage testing])], enable_gcov=$enableval, enable_gcov=no)
+AC_ARG_ENABLE(gprof,[AS_HELP_STRING([--enable-gprof],[compile for gcc code profiling])], enable_gprof=$enableval, enable_gprof=no)
+AC_ARG_ENABLE(sse,[AS_HELP_STRING([--enable-sse],[enable SSE optimizations])] , enable_sse=$enableval, enable_sse=check)
+AC_ARG_ENABLE(vmx,[AS_HELP_STRING([--enable-vmx],[enable Altivec/VMX optimizations])], enable_vmx=$enableval, enable_vmx=check)
+AC_ARG_WITH(gsl,[AS_HELP_STRING([--with-gsl],[use the GSL, GNU Scientific Library])], with_gsl=$withval, with_gsl=no)
+AC_ARG_ENABLE(mpi,[AS_HELP_STRING([--enable-mpi],[enable MPI parallelization])], enable_mpi=$enableval, enable_mpi=no)
+
+
+
+################################################################
+# 5. Checks for programs, including ${CC} and its ${CFLAGS}
+################################################################
+
+AC_PROG_CC
+AC_PROG_INSTALL
+# MPI : set @CC@ to mpicc;
+# set @MPILIBS@ if needed (usually not; mpicc deals w/ it);
+# defines HAVE_MPI.
+if test "$enable_mpi" = "yes"; then
+ ACX_MPI(,AC_MSG_ERROR([MPI library not found for --enable-mpi]))
+ CC=$MPICC
+fi
+AC_PROG_CPP
+
+# AC_PROG_CC_STDC wants to append -c99 to icc; icc doesn't like this.
+# To autodetect icc, we use the AX_COMPILER_VENDOR macro.
+AX_COMPILER_VENDOR
+if test "$ax_cv_c_compiler_vendor" != "intel"; then
+ AC_PROG_CC_STDC
+fi
+
+AC_PROG_RANLIB
+AC_PATH_PROG([AR], [ar], [:], [$PATH:/usr/ccs/bin:/usr/xpg4/bin])
+
+# CHECK_GNU_MAKE sets EXEC_DEPENDENCY for SYSV vs. GNU make,
+# to support Makefile lines of ${PROGS}: ${EXEC_DEPENDENCY}
+CHECK_GNU_MAKE
+
+# --enable-xlc-arch Set the code generation for a particular architecture
+#
+# The xlc compiler on AIX seems to need the -qarch flag to be set for a processor
+# that is VMX enabled. Otherwise a warning is issued that states the -qenablevmx
+# and -qaltivec flags are ignored.
+if test "${ax_cv_c_compiler_vendor}" = "ibm"; then
+ AC_ARG_WITH(xlc-arch,
+ [AC_HELP_STRING([--with-xlc-arch=<arch>], [specify architecture <arch> for xlc -qarch])],
+ XLC_ARCH=$withval,
+ XLC_ARCH=no)
+fi
+
+# Select our default optimization flags in CFLAGS.
+# --enable-gcov, --enable-gprof, and --enable-debugging are mutually exclusive.
+#
+if test "$enable_gcov" = "yes"; then
+ if test "$sre_cflags_env_set" = "yes"; then
+ AC_MSG_ERROR([--enable-gcov overrides CFLAGS, so don't set CFLAGS])
+ fi
+ CFLAGS="-g -Wall -fprofile-arcs -ftest-coverage"
+elif test "$enable_gprof" = "yes"; then
+ if test "$sre_cflags_env_set" = "yes"; then
+ AC_MSG_ERROR([--enable-gprof overrides CFLAGS, so don't set CFLAGS])
+ fi
+ CFLAGS="-O -g -pg"
+elif test "$enable_debugging" != "no"; then
+ if test "$GCC" = "yes"; then
+ CFLAGS="-g -Wall"
+ fi
+else
+ CFLAGS="-O3"
+fi
+
+
+# Figure out how to generate PIC code for shared libraries
+# This sets @PIC_FLAGS@ output variable
+ESL_PIC_FLAGS
+
+
+# SSE: figure out our @SIMD_CFLAGS@, define HAVE_SSE2
+# The AC_RUN_IFELSE() is there because it's possible to have
+# hardware that doesn't support SSE2 instructions, yet the
+# compiler can generate them: example AMD Athlons with gcc.
+# So we need to test that an SSE2 program actually runs without
+# generating an "illegal instruction" error. The program
+# here is sufficient [xref J3/127].
+# Note: some platforms (Ubuntu 32-bit for example) absolutely
+# must have the -msse2 cflag on in order to detect a working
+# emmintrin.h, so we set SIMD_CFLAGS before running the test.
+if test "$enable_sse" = "yes" || test "$enable_sse" = "check"; then
+ if test "x$SIMD_CFLAGS" = x; then
+ case $ax_cv_c_compiler_vendor in
+ gnu) AX_CHECK_COMPILER_FLAGS(-msse2,[SIMD_CFLAGS="-msse2"],[]);;
+ *) ;;
+ esac
+ fi
+fi
+if test "$enable_sse" = "check" && test "$enable_vmx" != "yes"; then
+ sre_save_CFLAGS="$CFLAGS"
+ sre_save_CPPFLAGS="$CPPFLAGS"
+ CFLAGS="$CFLAGS $SIMD_CFLAGS"
+ CPPFLAGS="$CPPFLAGS $SIMD_CFLAGS"
+ AC_CHECK_HEADER([emmintrin.h],[
+ AC_MSG_CHECKING([if platform can run SSE/SSE2 instructions])
+ AC_RUN_IFELSE([AC_LANG_PROGRAM( [[#include <emmintrin.h>]],
+ [[__m128i v = _mm_set1_epi8(0);]])],
+ [AC_MSG_RESULT([yes])
+ enable_sse=yes],
+ [AC_MSG_RESULT([no])])])
+ CFLAGS="$sre_save_CFLAGS"
+ CPPFLAGS="$sre_save_CPPFLAGS"
+fi
+if test "$enable_sse" = "yes"; then
+ AC_DEFINE(HAVE_SSE2,1,[Support SSE2 (Streaming SIMD Extensions 2) instructions])
+fi
+
+
+# VMX/Altivec (not autodetected yet; must use --enable-vmx to enable)
+if test "$enable_sse" != "yes"; then
+ if test "x$SIMD_CFLAGS" = x; then
+ VMX_SIMD_CFLAGS=""
+ if test "$GCC" = "yes"; then
+ AX_CHECK_COMPILER_FLAGS(-faltivec, [VMX_SIMD_CFLAGS="-faltivec"],
+ [AX_CHECK_COMPILER_FLAGS(-maltivec -mabi=altivec,
+ [VMX_SIMD_CFLAGS="-maltivec -mabi=altivec"],
+ [AX_CHECK_COMPILER_FLAGS(-fvec, [VMX_SIMD_CFLAGS="-fvec"],
+ [AC_MSG_ERROR([Need a version of gcc with -maltivec])])])])
+ elif test "${ax_cv_c_compiler_vendor}" = "ibm"; then
+ AX_CHECK_COMPILER_FLAGS(-qenablevmx, [VMX_SIMD_CFLAGS="$VMX_SIMD_CFLAGS -qenablevmx"],[])
+ AX_CHECK_COMPILER_FLAGS(-qaltivec, [VMX_SIMD_CFLAGS="$VMX_SIMD_CFLAGS -qaltivec"],[])
+ else
+ AX_CHECK_COMPILER_FLAGS(-faltivec, [VMX_SIMD_CFLAGS="-faltivec"],[])
+ fi
+ else
+ VMX_SIMD_CFLAGS="$SIMD_CFLAGS"
+ fi
+ if test "$enable_vmx" = "check"; then
+ sre_save_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS $VMX_SIMD_CFLAGS"
+ AC_MSG_CHECKING([if platform can run Altivec/VMX instructions])
+ AC_RUN_IFELSE([AC_LANG_PROGRAM( [[#include <altivec.h>]],
+ [[vector unsigned char zerov;
+ vector unsigned char onev;
+ zerov = vec_splat_u8(0);
+ onev = vec_splat_u8(1);
+ onev = vec_adds(onev, zerov);
+ ]])],
+ [AC_MSG_RESULT([yes])
+ enable_vmx=yes],
+ [AC_MSG_RESULT([no])
+ if test "${ax_cv_c_compiler_vendor}" = "ibm"; then
+ echo "******************************************************"
+ echo "* You seem to have the IBM C compiler. If your *"
+ echo "* processor supports vector instructions it is *"
+ echo "* possible specifying an architecture would enable *"
+ echo "* vector support, i.e. *"
+ echo "* *"
+ echo "* --with-xlc-arch=XXX *"
+ echo "* *"
+ echo "* where XXX is pwr6, auto or whatever kind of CPU *"
+ echo "* you have. *"
+ echo "******************************************************"
+ fi
+ ])
+ CFLAGS="$sre_save_cflags"
+ fi
+ if test "$enable_vmx" = "yes"; then
+ SIMD_CFLAGS="$VMX_SIMD_CFLAGS"
+ AC_DEFINE(HAVE_VMX,1,[Support Altivec/VMX vector instructions])
+ fi
+fi
+
+AC_SUBST(SIMD_CFLAGS)
+
+# Define HAVE_GZIP if gzip is in $PATH (or if HAVE_GZIP is already set)
+AC_PATH_PROG(HAVE_GZIP, "gzip", "no")
+if test "${HAVE_GZIP}" = "no"; then
+ AC_MSG_WARN([gzip not found])
+else
+ AC_DEFINE(HAVE_GZIP)
+fi
+
+
+################################################################
+# 6. Checks for libraries
+#################################################################
+LIBGSL=
+AS_IF([test "x$with_gsl" != xno],
+ [AC_CHECK_LIB([gsl], [gsl_expm1],
+ [AC_SUBST([LIBGSL], ["-lgsl -lgslcblas"])
+ AC_DEFINE([HAVE_LIBGSL], [1], [Define if you have libgsl])
+ ],
+ [if test "x$with_gsl" != xcheck; then
+ AC_MSG_FAILURE(
+ [--with-gsl was given, but GSL library was not found])
+ fi
+ ],
+ [-lgslcblas]
+ )])
+
+
+# Easel stopwatch high-res timer may try to use clock_gettime,
+# which may be in librt
+AC_SEARCH_LIBS(clock_gettime, [rt posix4])
+
+
+################################################################
+# 7. Checks for headers
+################################################################
+# Defines preprocessor symbols like HAVE_UNISTD_H
+AC_CHECK_HEADERS([\
+ endian.h \
+ inttypes.h \
+ stdint.h \
+ unistd.h \
+ sys/types.h \
+ strings.h \
+])
+
+# Check for sysctl.h separately. On OpenBSD, it requires
+# <sys/param.h> and autoconf needs special logic to deal w. this as
+# follows.
+AC_CHECK_HEADERS([sys/param.h])
+AC_CHECK_HEADERS([sys/sysctl.h], [], [],
+[[#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+]])
+
+# Vector-specific headers.
+# Separated, because we may want to implement
+# other vector languages besides SSE
+# For SSE:
+# xmmintrin.h = SSE
+# emmintrin.h = SSE2
+# pmmintrin.h = SSE3
+AC_CHECK_HEADERS([\
+ emmintrin.h\
+ pmmintrin.h\
+ xmmintrin.h
+])
+
+# altivec.h requires the simd cflags
+# For reasons I don't understand, this needs to come after any other CHECK_HEADERS().
+if test "$enable_vmx" = "yes"; then
+ sre_save_CFLAGS="$CFLAGS"
+ sre_save_CPPFLAGS="$CPPFLAGS"
+ CFLAGS="$CFLAGS $SIMD_CFLAGS"
+ CPPFLAGS="$CPPFLAGS $SIMD_CFLAGS"
+ AC_CHECK_HEADERS([altivec.h])
+ CFLAGS="$sre_save_CFLAGS"
+ CPPFLAGS="$sre_save_CPPFLAGS"
+fi
+
+
+################################################################
+# 8. Checks for types
+################################################################
+# - Define WORDS_BIGENDIAN on bigendian platforms.
+# - Make sure we have C99 exact-size integer types;
+# ssi uses 16, 32, and 64-bit ints, and we
+# use 8-bit unsigned chars for digitized sequence.
+# - Make sure we have off_t.
+#
+AC_C_BIGENDIAN
+AC_TYPE_INT8_T
+AC_TYPE_INT16_T
+AC_TYPE_INT32_T
+AC_TYPE_INT64_T
+AC_TYPE_UINT8_T
+AC_TYPE_UINT16_T
+AC_TYPE_UINT32_T
+AC_TYPE_UINT64_T
+AC_TYPE_OFF_T
+
+################################################################
+# 9. Checks for structures - currently none
+#################################################################
+
+
+################################################################
+# 10. Checks for compiler characteristics
+#################################################################
+
+# __attribute__() tags on function declarations
+# HAVE_FUNC_ATTRIBUTE_NORETURN
+#
+# The clang static analyzer can't figure out that some of our
+# varargs-dependent fatal error handlers (esl_fatal(), for example)
+# cannot return. To tell it so, we take advantage of __attribute__
+# tags on function declarations, a non-ISO gcc extension, when
+# available. gcc, clang, and other gcc-like compilers support this.
+#
+AX_GCC_FUNC_ATTRIBUTE(noreturn)
+
+
+
+################################################################
+# 11. Checks for library functions: define HAVE_FOO
+################################################################
+
+AC_CHECK_FUNCS(mkstemp)
+AC_CHECK_FUNCS(popen)
+AC_CHECK_FUNCS(putenv)
+AC_CHECK_FUNCS(strcasecmp)
+AC_CHECK_FUNCS(times)
+AC_CHECK_FUNCS(getpid)
+AC_CHECK_FUNCS(sysctl)
+AC_CHECK_FUNCS(sysconf)
+AC_CHECK_FUNCS(getcwd)
+AC_CHECK_FUNCS(chmod)
+AC_CHECK_FUNCS(stat)
+AC_CHECK_FUNCS(fstat)
+AC_CHECK_FUNCS(erfc)
+
+AC_CHECK_FUNCS(ntohs, , AC_CHECK_LIB(socket, ntohs))
+AC_CHECK_FUNCS(ntohl, , AC_CHECK_LIB(socket, ntohl))
+AC_CHECK_FUNCS(htons, , AC_CHECK_LIB(socket, htons))
+AC_CHECK_FUNCS(htonl, , AC_CHECK_LIB(socket, htonl))
+AC_FUNC_FSEEKO
+
+#################################################################
+# 12. System services
+#################################################################
+AC_SYS_LARGEFILE
+
+#################################################################
+# 13. Write out esl_config.h header and the Makefiles
+#################################################################
+AC_CONFIG_HEADERS([esl_config.h])
+AC_CONFIG_FILES([miniapps/Makefile])
+AC_CONFIG_FILES([testsuite/Makefile])
+AC_CONFIG_FILES([Makefile])
+if test -e "LICENSE.sh.in"; then
+ AC_CONFIG_FILES(LICENSE.sh)
+fi
+AC_CONFIG_FILES([documentation/Makefile])
+
+
+#################################################################
+# 14. et voila!
+#################################################################
+AC_OUTPUT
+
+
+echo "
+
+Easel configuration:
+
+ compiler: ${CC} ${CFLAGS} ${SIMD_CFLAGS} ${PTHREAD_CFLAGS} ${PIC_FLAGS}
+ host: $host
+ libraries: ${LIBS} ${LIBGSL} ${PTHREAD_LIBS}
+"
+
+
+#################################################################
+# @LICENSE@
+#
+# SVN $Id$
+# SVN $URL$
+#################################################################
diff --git a/demotic/00README b/demotic/00README
new file mode 100644
index 0000000..f844d2e
--- /dev/null
+++ b/demotic/00README
@@ -0,0 +1,101 @@
+demotic is a set of Perl modules for interfacing the hieroglyphic
+output of one program with the greek input of another program.
+
+original: SRE, Wed Oct 25 16:32:09 2000
+into Easel: SRE, Fri Apr 16 16:10:25 2010
+SVN $Id$
+
+ demotic_blast.pm NCBI blastp; NCBI blastpgp; WU blastp
+ demotic_fasta.pm fasta; ssearch
+ demotic_hmmer.pm hmmsearch, phmmer
+ demotic_h2.pm HMMER 2.0 hmmsearch
+
+ blast2profmark
+ fasta2profmark
+ hmmer2profmark
+ h22profmark
+
+ blast2tbl
+ fasta2tbl
+ hmmer2tbl
+ h22tbl
+
+ test.pl : example of using demotic_blast "in line" in a perl script.
+
+################################################################
+# Generating the example outputs
+
+# Config that's already in my .bashrc:
+ export SWISS=/misc/data0/databases/Uniprot/uniprot_sprot.fasta
+ export SWISS-WU=/misc/data0/databases/Uniprot/uniprot_sprot_wu.fasta
+ export PFAM_HMM=/misc/data0/databases/Pfam/Pfam-A.hmm
+ export PFAM_SEED=/misc/data0/databases/Pfam/Pfam-A.seed
+ export PFAM_FULL=/misc/data0/databases/Pfam/Pfam-A.full
+ export PERLLIB=.:${HOME}/sw/scripts
+
+# Most examples
+ esl-seqstat -a $SWISS | awk '{print $2}' | esl-selectn 2 - | esl-sfetch -f $SWISS - > examples/example.fa
+ grep -v "^#" /misc/data0/databases/pfam/pfam-24.0/Pfam-A.hmm.stat | awk '{print $2}' | esl-selectn 2 - | hmmfetch -f /misc/data0/databases/pfam/pfam-24.0/Pfam-A.hmm - > examples/example.hmm
+
+# PSIBLAST example takes some massaging, because of the way we convert Stockholm to a checkpoint .asnt file.
+ grep -v "^#" /misc/data0/databases/pfam/pfam-24.0/Pfam-A.seed.stat | awk '{print $2}' | esl-selectn 1 - | esl-afetch -f /misc/data0/databases/pfam/pfam-24.0/Pfam-A.seed - > examples/example-single.sto
+ esl-reformat -o examples/example-single.pbl psiblast examples/example-single.sto
+ esl-seqstat -a examples/example-single.sto | grep "^=" | awk '{print $2}' | esl-selectn 1 - | esl-sfetch -f examples/example-single.sto -
+ esl-seqstat -a examples/example-single.sto | grep "^=" | awk '{print $2}' | esl-selectn 1 - | esl-sfetch -f examples/example-single.sto - > examples/example-single-psiquery.fa
+ esl-reformat -o examples/example-single.fa fasta examples/example-single.sto
+ formatdb -i examples/example-single.fa
+ blastpgp -v 9999 -F T -u 1 -j 5 -J TRUE -d examples/example-single.fasta -i examples/example-single-psiquery.fa -C examples/example-single.asnt
+
+# H2 example also is a little special; build new from Stockholm, plus H2 hmmsearch can only do a single query.
+ grep -v "^#" /misc/data0/databases/pfam/pfam-24.0/Pfam-A.seed.stat | awk '{print $2}' | esl-selectn 1 - | esl-afetch -f /misc/data0/databases/pfam/pfam-24.0/Pfam-A.seed - > examples/example.sto
+ ~/releases/hmmer-2.3.2/src/hmmbuild examples/example.hmm2 examples/example.sto
+ ~/releases/hmmer-2.3.2/src/hmmcalibrate examples/example.hmm2
+
+ blastp $SWISS_WU examples/example.fa > examples/example.wu-blastp.out
+ blastall -p blastp -i examples/example.fa -d $SWISS > examples/example.ncbi-blastp.out
+ /usr/local/fasta-36x2/bin/ssearch36_t -q examples/example.fa $SWISS > examples/example.ssearch.out
+ /usr/local/fasta-36x2/bin/fasta36_t -q examples/example.fa $SWISS > examples/example.fasta.out
+ phmmer examples/example.fa $SWISS > examples/example.phmmer.out
+ hmmsearch examples/example.hmm $SWISS > examples/example.hmmsearch.out
+ ~/releases/hmmer-2.3.2/src/hmmsearch examples/example.hmm2 $SWISS > examples/example.h2.out
+ blastpgp -v 9999 -F F -q 1 -t 1 -d $SWISS -R examples/example-single.asnt > examples/example.psiblast.out
+
+################################################################
+# Save outputs for regression
+
+ pfx=regress
+ mkdir $pfx
+ cat examples/example.wu-blastp.out | ./blast2profmark > $pfx/wu-blastp-profmark.out
+ cat examples/example.ncbi-blastp.out | ./blast2profmark > $pfx/ncbi-blastp-profmark.out
+ cat examples/example.psiblast.out | ./blast2profmark > $pfx/psiblast-profmark.out
+ cat examples/example.ssearch.out | ./fasta2profmark > $pfx/ssearch-profmark.out
+ cat examples/example.fasta.out | ./fasta2profmark > $pfx/fasta-profmark.out
+ cat examples/example.phmmer.out | ./hmmer2profmark > $pfx/phmmer-profmark.out
+ cat examples/example.hmmsearch.out | ./hmmer2profmark > $pfx/hmmsearch-profmark.out
+ cat examples/example.h2.out | ./h22profmark > $pfx/h2-profmark.out
+
+ cat examples/example.wu-blastp.out | ./blast2tbl > $pfx/wu-blastp-tbl.out
+ cat examples/example.ncbi-blastp.out | ./blast2tbl > $pfx/ncbi-blastp-tbl.out
+ cat examples/example.psiblast.out | ./blast2tbl > $pfx/psiblast-tbl.out
+ cat examples/example.ssearch.out | ./fasta2tbl > $pfx/ssearch-tbl.out
+ cat examples/example.fasta.out | ./fasta2tbl > $pfx/fasta-tbl.out
+ cat examples/example.phmmer.out | ./hmmer2tbl > $pfx/phmmer-tbl.out
+ cat examples/example.hmmsearch.out | ./hmmer2tbl > $pfx/hmmsearch-tbl.out
+ cat examples/example.h2.out | ./h22tbl > $pfx/h2-tbl.out
+
+################################################################
+# Regression test of outputs
+
+ pfx=tmp
+ mkdir $pfx
+# Run the same stuff as above
+
+ for prg in wu-blastp ncbi-blastp psiblast ssearch fasta phmmer hmmsearch h2 ; do
+ diff --brief regress/$prg-profmark.out tmp/$prg-profmark.out
+ diff --brief regress/$prg-tbl.out tmp/$prg-tbl.out
+ done
+
+ rm -rf tmp
+
+
+
\ No newline at end of file
diff --git a/demotic/blast2profmark b/demotic/blast2profmark
new file mode 100755
index 0000000..c4a087f
--- /dev/null
+++ b/demotic/blast2profmark
@@ -0,0 +1,10 @@
+#! /usr/bin/perl
+
+use demotic_blast;
+
+while (&demotic_blast::parse(\*STDIN))
+{
+ &demotic_blast::profmarkout(\*STDOUT);
+}
+
+
diff --git a/demotic/blast2tbl b/demotic/blast2tbl
new file mode 100755
index 0000000..eaea1e9
--- /dev/null
+++ b/demotic/blast2tbl
@@ -0,0 +1,10 @@
+#! /usr/bin/perl
+
+use demotic_blast;
+
+while (&demotic_blast::parse(\*STDIN))
+{
+ &demotic_blast::tblout(\*STDOUT);
+}
+
+
diff --git a/demotic/demotic_blast.pm b/demotic/demotic_blast.pm
new file mode 100644
index 0000000..b4a0a5c
--- /dev/null
+++ b/demotic/demotic_blast.pm
@@ -0,0 +1,286 @@
+############################################################################
+# demotic_blast package
+# Parses blast output, stores extracted information in convenient vars.
+# Works for both WU-BLAST and NCBI BLAST output files,
+# and for PSIBLAST runs from checkpoint files (as I use in profmark).
+# (SRE originated, 10/2000)
+#
+# SVN $Id$
+############################################################################
+
+package demotic_blast;
+
+# parse(\*STDIN) would parse BLAST output
+# coming in via stdin.
+#
+sub parse (*) {
+ my $fh = shift;
+ my $parsing_header = 1;
+ my $parsing_hitlist = 0;
+ my $parsing_alilist = 0;
+ my $is_wublast = 0;
+ my $target;
+ my $firstchunk;
+
+ # Initialize everything... so we can call the parser
+ # repeatedly, one call per BLAST output.
+ #
+ # This section also documents what's available in
+ # variables within the package.
+ #
+ # Arrays are indexed [0..nhits-1] or [0..nali-1]
+ #
+ $queryname = ""; # Name of the query sequence
+ $querydesc = ""; # Description line for the query (or "")
+ $querylen = 0; # Length of the query in residues
+ $db = ""; # Name of the target database file
+ $db_nseq = 0; # Number of sequences in the target database
+ $db_nletters = ""; # Number of residues in the target database
+ # (stored as a string so we can have large #'s)
+
+ # The top hit list (still in rank order)
+ $nhits = 0; # Number of entries in the hit list
+ @hit_target = (); # Target sequence name (by rank)
+ %target_desc = (); # Target sequence description (by targ name)
+ @hit_bitscore = (); # Raw score (by rank)
+ @hit_Eval = (); # E-val (by rank)
+
+ # The alignment output (in order it came in)
+ # all indexed by # of alignment [0..nali-1]
+ $nali = 0; # Number of alignments
+ @ali_target = (); # Target sequence name
+ @ali_score = (); # Raw score of alignment
+ @ali_bitscore = (); # bit score
+ @ali_evalue = (); # E-value
+ @ali_pvalue = (); # P-value
+ @ali_nident = (); # Number of identical residues
+ @ali_alen = (); # Length of alignment
+ @ali_identity = (); # Percent identity
+ @ali_npos = (); # Number of positives (similar positions)
+ @ali_positive = (); # Percent of positions matched or similar
+ @ali_qstart = (); # Start position on query
+ @ali_qend = (); # End position on query
+ @ali_tstart = (); # Start position on target
+ @ali_tend = (); # End position on target
+ @ali_qali = (); # Aligned string from query
+ @ali_tali = (); # Aligned string from target (subject)
+ @ali_hitidx = (); # index of hit
+ $hitidx = -1;
+
+ # Now, loop over the lines of our input, and parse 'em.
+ #
+ while (<$fh>) {
+ if ($parsing_header) {
+ if (/^\s*\*+ No hits found \*+\s*$/) { return 1; }
+
+ if (/^Sequences producing /) { # wu and ncbi share this
+ $parsing_header = 0;
+ $parsing_hitlist = 1;
+ <$fh>; # This discards the next (blank) line (ncbi, wu)
+ next;
+ } elsif (/^Query=\s*(\S*)\s*(.*)\s*$/) { # allows blank query
+ $queryname = $1;
+ $querydesc = $2; chomp $querydesc;
+ if ($queryname eq "") {
+ $queryname = "unnamed_query";
+ }
+ while (1) {
+ $_ = <$fh>; # perl quirk: unless part of a while()
+ # loop, line must be explicitly assigned
+ # to $_ or else it will be lost.
+ if (/^\s+\((\S+) letters/) { $querylen = $1; last; }
+ elsif (/^Length=(\d+)/) { $querylen = $1; last; } # NCBI
+ elsif (/^\s*( .+)\s*$/) { $querydesc .= $1; chomp $querydesc; }
+ }
+ } elsif (/^Database:\s*(.+)\s*$/) {
+ $db = $1;
+ $_ = <$fh>;
+ if (/^\s+(\S+) sequences; (\S+) total letters/) {
+ $db_nseq = $1;
+ $db_nletters = $2;
+ $db_nseq =~ s/,//g;
+ $db_nletters =~ s/,//g;
+ }
+ } elsif (/^Copyright.+Washington University/) {
+ $is_wublast = 1;
+ }
+ }
+ elsif ($parsing_hitlist) {
+ # WUBLAST: Sequences producing High-scoring Segment Pairs: Score P(N) N
+ # 2-Hacid_dh/1/17-338/439-757 domains: PTXD_PSEST/5-326 O28... 299 4.7e-27 1
+ # NCBI+: Sequences producing significant alignments: (Bits) Value
+ # 2-Hacid_dh/4/753-1076/1224-1507 domains: Q20595_CAEEL/181-504 P... 95.1 4e-20
+ # NCBI: Sequences producing significant alignments: (bits) Value
+ # 2-Hacid_dh/4/753-1076/1224-1507 domains: Q20595_CAEEL/181-504 PD... 95 4e-20
+ # In NCBI E-values, beware "e-xxx" without any leading number.
+ # In NCBI+, beware bit scores can now be real numbers, not just integers.
+ #
+ if (/^\s*$/) {
+ $parsing_hitlist = 0;
+ $parsing_alilist = 1;
+ next;
+ }
+ elsif (( $is_wublast && /^\s*(\S+)\s+(.+)\s+(\d+)\s+(\S+)\s+\d+\s*$/) ||
+ (! $is_wublast && /^\s*(\S+)\s+(.+)\s+(\S+)\s+(\S+)\s*$/))
+ {
+ $hit_target[$nhits] = $1;
+ $target_desc{$1} = $2;
+ $hit_bitscore[$nhits] = $3;
+
+ if ($is_wublast) { $hit_Eval[$nhits] = $4; } # actually WU reports P-value
+ else { $hit_Eval[$nhits] = &repair_evalue($4); }
+
+ $nhits++;
+ }
+ }
+ elsif ($parsing_alilist) {
+ if (/^>\s*(\S+)\s*(.*)$/) {
+ $target = $1;
+ $hitidx ++;
+ $target_desc{$target} = $2;
+
+ $_ = <$fh>;
+ if (/^\s+Length = (\S+)/) {
+ $target_len{$target} = $1;
+ }
+ }
+ elsif (/^ Score =\s+(\d+) \((\S+) bits\), Expect\s+=\s+(\S+), /) { # WU
+ $nali++;
+ $ali_target[$nali-1] = $target;
+ $ali_score[$nali-1] = $1;
+ $ali_bitscore[$nali-1] = $2;
+ $ali_evalue[$nali-1] = $3;
+ $ali_hitidx[$nali-1] = $hitidx;
+ }
+ elsif (/^ Score =\s+(\S+) bits \((\S+)\),\s*Expect\s+=\s+(\S+), /) { # NCBI
+ $nali++;
+ $ali_target[$nali-1] = $target;
+ $ali_bitscore[$nali-1] = $1;
+ $ali_score[$nali-1] = $2;
+ $ali_evalue[$nali-1] = &repair_evalue($3);
+ $ali_hitidx[$nali-1] = $hitidx;
+ }
+ elsif (/^ Identities = (\d+)\/(\d+) \((\d+)%\).+Positives = (\d+).+\((\d+)%/) { # NCBI or WU
+ $ali_nident[$nali-1] = $1;
+ $ali_alen[$nali-1] = $2;
+ $ali_identity[$nali-1] = $3;
+ $ali_npos[$nali-1] = $4;
+ $ali_positive[$nali-1] = $5;
+ $ali_hitidx[$nali-1] = $hitidx;
+ $firstchunk = 1;
+ }
+ elsif (/^ Identities = (\d+)\/(\d+) \((\d+)%\).+/) { # NCBI megablast : no Positives
+ $ali_nident[$nali-1] = $1;
+ $ali_alen[$nali-1] = $2;
+ $ali_identity[$nali-1] = $3;
+ $ali_npos[$nali-1] = $1;
+ $ali_positive[$nali-1] = $3;
+ $ali_hitidx[$nali-1] = $hitidx;
+ $firstchunk = 1;
+ }
+ elsif (/^Query:?\s+(\d+)\s+(\S+)\s+(\d+)\s*$/) {
+ if ($firstchunk) { $ali_qstart[$nali-1] = $1; }
+ $ali_qali[$nali-1] .= $2;
+ $ali_qend[$nali-1] = $3;
+ }
+ elsif (/^Sbjct:?\s+(\d+)\s+(\S+)\s+(\d+)\s*$/) {
+ if ($firstchunk) { $ali_tstart[$nali-1] = $1; }
+ $ali_tali[$nali-1] .= $2;
+ $ali_tend[$nali-1] = $3;
+ $firstchunk = 0;
+ }
+
+ elsif (/^BLAST/) { return 1; } # normal return; output from a new query is starting
+ elsif (/^Effective search space used:/) { return 1; } #normal end of query for NCBI BLAST+
+
+ }
+ } # this closes the loop over lines in the input stream.
+
+ if ($parsing_alilist) { return 1; } else { return 0; }
+}
+
+
+# NCBI BLAST now has a nasty habit of abbreviating
+# 1e-100 as e-100, which isn't a number format.
+
+sub repair_evalue
+{
+ my $value = shift;
+ if ($value =~ /^e-\d+$/) { $value = "1$value"; }
+ $value;
+}
+
+
+sub exblxout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ printf $ofh "%s\t%d\t%d\t%d\t%s\t%d\t%d\t%s\n",
+ $ali_evalue[$i],
+ $ali_identity[$i],
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_target[$i],
+ $ali_qstart[$i],
+ $ali_qend[$i],
+ $queryname;
+ }
+
+}
+
+
+sub tblout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ printf $ofh "%s\t%d\t%d\t%d\t%s\t%d\t%d\t%s\t%s\n",
+ $ali_evalue[$i],
+ $ali_identity[$i],
+ $ali_qstart[$i],
+ $ali_qend[$i],
+ $queryname,
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_target[$i],
+ $target_desc{$ali_target[$i]};
+ }
+}
+
+
+sub gffout {
+ my $ofh = shift;
+ my $source = shift;
+ my $feature = shift;
+ my $i;
+ my $strand;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ if ($ali_qstart[$i] > $ali_qend[$i]) { $strand = "-"; }
+ else { $strand = "+"; }
+
+ printf $ofh "%s\t%s\t%s\t%d\t%d\t%.1f\t%s\t.\tgene \"%s\"\n",
+ $ali_target[$i],
+ $source,
+ $feature,
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_bitscore[$i],
+ $strand,
+ $queryname;
+ }
+}
+
+sub profmarkout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i < $nhits; $i++) {
+ printf $ofh "%g\t%.1f\t%s\t%s\n", $hit_Eval[$i], $hit_bitscore[$i], $hit_target[$i], $queryname;
+ }
+}
+
+
+1;
+__END__
diff --git a/demotic/demotic_fasta.pm b/demotic/demotic_fasta.pm
new file mode 100644
index 0000000..f3f5b3d
--- /dev/null
+++ b/demotic/demotic_fasta.pm
@@ -0,0 +1,384 @@
+############################################################################
+# demotic_fasta package
+# Parses fasta or ssearch output, stores extracted information in convenient vars.
+# SRE, Wed Jun 25 13:41:41 2003
+#
+# SVN $Id$
+############################################################################
+
+package demotic_fasta;
+
+# parse(\*STDIN) would parse ssearch output
+# coming in via stdin.
+#
+sub parse (*) {
+ my $fh = shift;
+ my $parsing_header = 1;
+ my $parsing_hitlist = 0;
+ my $parsing_alilist = 0;
+ my $target;
+ my $alilinecount = 0;
+ my $prvaliline_isquery = 0;
+ my $ali_qline;
+ my $ali_tline;
+ my $ali_qasq;
+ my $ali_tasq;
+ my $margin;
+
+ # Initialize everything... so we can call the parser
+ # repeatedly, one call per ssearch output.
+ #
+ # This section also documents what's available in
+ # variables within the package.
+ #
+ # Arrays are indexed [0..nhits-1] or [0..nali-1]
+ #
+ $queryname = ""; # Name of the query sequence
+ $querydesc = ""; # Description line for the query (or "")
+ $querylen = 0; # Length of the query in residues
+ $db = ""; # Name of the target database file
+ $db_nseq = 0; # Number of sequences in the target database
+ $db_nletters = ""; # Number of residues in the target database
+ # (stored as a string so we can have large #'s)
+
+ # The top hit list (still in rank order)
+ $nhits = 0; # Number of entries in the hit list
+ @hit_target = (); # Target sequence name (by rank)
+ %target_desc = (); # Target sequence description (by targ name)
+ %target_len = (); # Length of target sequence
+ @hit_score = (); # Raw score (by rank)
+ @hit_bitscore = (); # Bit score (by rank)
+ @hit_Eval = (); # E-value (by rank)
+
+ # The alignment output (in order it came in)
+ # all indexed by # of alignment [0..nali-1]
+ $nali = 0; # Number of alignments
+ @ali_target = (); # Target sequence name
+ @ali_score = (); # Smith/Waterman raw score of alignment
+ @ali_bitscore = (); # bit score
+ @ali_evalue = (); # E-value
+ @ali_nident = (); # Number of identical residues
+ @ali_alen = (); # Length of alignment (overlap)
+ @ali_identity = (); # Percent identity
+# @ali_npos = (); # Number of positives (similar positions)
+# @ali_positive = (); # Percent of positions matched or similar
+ @ali_qstart = (); # Start position on query
+ @ali_qend = (); # End position on query
+ @ali_tstart = (); # Start position on target
+ @ali_tend = (); # End position on target
+ @ali_qali = (); # Aligned string from query
+ @ali_tali = (); # Aligned string from target (subject)
+ @ali_qmask = (); # line in between the two aligned strings
+ @ali_tmask = (); # line in between the two aligned strings
+ @ali_hitidx = (); # index of hit
+ $hitidx = -1;
+
+ if (defined($save_querycount) && $save_querycount > 1) { # on subsequent queries, we had to use the >>> start line to detect
+ # the end of the prev query; we socked the necessary info away in tmp vars.
+ $querycount = $save_querycount;
+ $queryname = $save_queryname;
+ $querydesc = $save_querydesc;
+ $querylen = $save_querylen;
+ }
+
+ # Now, loop over the lines of our input, and parse 'em.
+ #
+ my $line;
+ my $prvline;
+ while (<$fh>) {
+ $line = $_;
+ if ($parsing_header) {
+ if (/^The best scores are:/) { # start of hit list
+ $parsing_header = 0;
+ $parsing_hitlist = 1;
+ next;
+ } elsif (/^!! No sequences/) { # no hit list: no hits; just return
+ return 1; # return "success"
+ } elsif (/^\s+(\d+)>>>\s*(\S*)\s*(.*)\s*-\s*(\d+) \S\S$/) { # allows blank query. \S\S is "nt" or "aa"
+ $querycount = $1;
+ $queryname = $2;
+ $querydesc = $3;
+ $querylen = $4;
+ if ($queryname eq "") {
+ $queryname = "unnamed_query";
+ }
+ } elsif (/^\s+(\d+)\s+residues in\s+(\d+)\s+sequences\s*$/) {
+ $db_nletters = $1;
+ $db_nseq = $2;
+ }
+ }
+ elsif ($parsing_hitlist) {
+ if (/^\s*$/) { # blank line marks end of hit list, start of alignments
+ $parsing_hitlist = 0;
+ $parsing_alilist = 1;
+ next;
+ } elsif (/^(\S+)\s*(.*\S?)\s*\(\s*(\d+)\)\s+(\d+)\s+(\S+)\s+(\S+)\s*$/) {
+ $hit_target[$nhits] = $1;
+ $target_desc{$1} = $2;
+ $target_len{$1} = $3;
+ $hit_score[$nhits] = $4;
+ $hit_bitscore[$nhits] = $5;
+ $hit_Eval[$nhits] = $6;
+ $nhits++;
+ }
+ }
+ elsif ($parsing_alilist) {
+ if (/^>>(\S+)\s*(.*)\s+\((\d+) \S\S\)\s*$/) { # the \S\S is either nt or aa
+ $target = $1;
+ $hitidx ++;
+ $target_desc{$target} = $2;
+ if ($3 != $target_len{$target}) { die "can't happen.", "1)", $3, "2)", $target_len{$target}; }
+ }
+ elsif (/^ s-w opt:\s+(\d+)\s+Z-score:\s*(\S+)\s+bits:\s+(\S+)\s+E\(\d*\):\s+(\S+)\s*$/) { # SSEARCH
+ $nali++;
+ $ali_target[$nali-1] = $target;
+ $ali_score[$nali-1] = $1;
+ $ali_bitscore[$nali-1] = $3;
+ $ali_evalue[$nali-1] = $4;
+ $ali_hitidx[$nali-1] = $hitidx;
+ }
+ elsif (/^ initn:\s*\d+\s*init1:\s*\d+\s*opt:\s*(\d+)\s*Z-score:\s*(\S+)\s*bits:\s*(\S+)\s*E\(\d*\):\s*(\S+)\s*$/) { # FASTA
+ $nali++;
+ $ali_target[$nali-1] = $target;
+ $ali_score[$nali-1] = $1;
+ $ali_bitscore[$nali-1] = $3;
+ $ali_evalue[$nali-1] = $4;
+ $ali_hitidx[$nali-1] = $hitidx;
+ }
+ elsif (/^Smith-Waterman score:\s+(\d+);\s+(\S+)% identity .* in (\d+) \S\S overlap \((\d+)-(\d+):(\d+)-(\d+)\)\s*/) {
+ $ali_identity[$nali-1] = $2;
+ $ali_alen[$nali-1] = $3;
+ $ali_qstart[$nali-1] = $4;
+ $ali_qend[$nali-1] = $5;
+ $ali_tstart[$nali-1] = $6;
+ $ali_tend[$nali-1] = $7;
+# $ali_nident[$nali-1] = $1;
+# $ali_npos[$nali-1] = $4;
+# $ali_positive[$nali-1] = $5;
+ $alilinecount = 0;
+ $ali_qali[$nali-1] = "";
+ $ali_tali[$nali-1] = "";
+ $ali_qmask[$nali-1] = "";
+ $ali_tmask[$nali-1] = "";
+ }
+ elsif (/^(\S+)\s+(\S+)\s*$/) { # only ali lines are right-flushed
+ # the usual alignment display is
+ # ali_query_line
+ # mask
+ # ali_target_line
+ #
+ # (1) ends are not flushed, and they can have "extra stuff"
+ # function calculate_flushedmask() corrects that
+ #
+ # (2) alingments do not need to be complete. (particularly using option -a )
+ # Meaning at the end AND at the beginning as well, you can end up with one single query line
+ # or one single target line.
+ #
+ # ali_query_line
+ # (no mask)
+ # (no ali_target_line)
+ #
+ # or
+ #
+ # (no ali_query_line)
+ # (no mask)
+ # ali_target_line
+ #
+ # or even
+ #
+ # aliq_query_line
+ # (no mask)
+ # ali_target_Line
+ #
+ # why? oh! why? check for that and fix it.
+
+ my $name = $1;
+ my $asq = $2;
+
+ #carefull, the alignment part, truncates the names of the query and targets
+ # this is a problem specially if the query and target names start similarly.
+ # it appears that querynames have been truncated to 5 characters and targetnames to 6
+ # also check for a prvline with numbers, but if len < 10 those do not show up either
+ if ($queryname =~ /^$name/ && (length($name) <= 5 || $prvline =~ /\s+(\d+)\s*/)) {
+ $prvaliline_isquery = 1;
+ $ali_qline = $_; $ali_qline =~ s/\n//;
+ $ali_qasq = $asq;
+ $mask = "";
+ }
+ elsif ($ali_target[$nali-1] =~ /^$name/) {
+ $talilinecount ++;
+ $ali_tline = $_; $ali_tline =~ s/\n//;
+ $ali_tasq = $asq;
+ if ($prvaliline_isquery) {
+ $ali_qali[$nali-1] .= $ali_qasq;
+ $ali_tali[$nali-1] .= $ali_tasq;
+ $ali_qmask[$nali-1] .= calculate_flushedmask($ali_qline, $mask);
+ $ali_tmask[$nali-1] .= calculate_flushedmask($ali_tline, $mask);
+ }
+ $prvaliline_isquery = 0;
+ }
+ $alilinecount++;
+ }
+ elsif (/^(\s*[\.\:][\s\.\:]*)$/) {
+ $mask .= $1;
+ }
+
+ elsif (/^\s+(\d+)>>>\s*(\S*)\s*(.*)\s*-\s*(\d+) \S\S$/) { # next query is starting. \S\S is "nt" or "aa"
+ $save_querycount = $1;
+ $save_queryname = $2;
+ $save_querydesc = $3;
+ $save_querylen = $4;
+ if ($save_queryname eq "") { $save_queryname = "unnamed_query"; }
+ return 1; # normal return. We've finished output for a query, and stored some info about the next one.
+ }
+ }
+ $prvline = $line;
+ } # this closes the loop over lines in the input stream: at EOF.
+
+ if ($parsing_alilist) {
+ for (my $ali = 0; $ali < $nali; $ali ++) {
+ # the ali lines come along with more residues that are not part of the alignment. Why? oh! why?. REMOVE
+ # you cannot remove using ali_{q,t}start and $ali_{q,t}end because those are
+ # relative to the full sequence. Need to do it by parsing also the line in between (what I call the "mask")
+ # and finding the first and last ":" or "."
+ $ali_qali[$ali] = ali_removeflanking($ali_qali[$ali], $ali_qmask[$ali], $ali_qstart[$ali], $ali_qend[$ali]);
+ $ali_tali[$ali] = ali_removeflanking($ali_tali[$ali], $ali_tmask[$ali], $ali_tstart[$ali], $ali_tend[$ali]);
+ }
+ return 1;
+ }
+ else { return 0; } # at EOF: normal return if we were in the alignment section.
+}
+
+
+
+sub exblxout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ printf $ofh "%s\t%d\t%d\t%d\t%s\t%d\t%d\t%s\n",
+ $ali_evalue[$i],
+ $ali_identity[$i],
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_target[$i],
+ $ali_qstart[$i],
+ $ali_qend[$i],
+ $queryname;
+ }
+}
+
+sub tblout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ printf $ofh "%s\t%d\t%d\t%d\t%s\t%d\t%d\t%s\t%s\n",
+ $ali_evalue[$i],
+ $ali_identity[$i],
+ $ali_qstart[$i],
+ $ali_qend[$i],
+ $queryname,
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_target[$i],
+ $target_desc{$ali_target[$i]};
+ }
+}
+
+
+sub gffout {
+ my $ofh = shift;
+ my $source = shift;
+ my $feature = shift;
+ my $i;
+ my $strand;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ if ($ali_qstart[$i] > $ali_qend[$i]) { $strand = "-"; }
+ else { $strand = "+"; }
+
+ printf $ofh "%s\t%s\t%s\t%d\t%d\t%.1f\t%s\t.\tgene \"%s\"\n",
+ $ali_target[$i],
+ $source,
+ $feature,
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_bitscore[$i],
+ $strand,
+ $queryname;
+ }
+}
+
+sub profmarkout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i < $nhits; $i++) {
+ printf $ofh "%g\t%.1f\t%s\t%s\n", $hit_Eval[$i], $hit_bitscore[$i], $hit_target[$i], $queryname;
+ }
+}
+
+sub calculate_flushedmask {
+ my ($asq, $mask) = @_;
+
+ my $lremove = -1;
+ my $flushedasq;
+
+ if ($asq =~ /^(\S+\s+)(\S+)\s*$/) {
+ $lremove = length($1);
+ $flushedasq = $2;
+ }
+
+ my $flushedmask = $mask;
+ $flushedmask =~ s/^(.{$lremove})//;
+ $flushedmask =~ s/\n//;
+
+ if (length($flushedmask) > length($flushedasq)) {
+ while (length($flushedmask) > length($flushedasq)) {
+ if ($flushedmask =~ /(\s)$/) { $flushedmask =~ s/(\s)$//; }
+ }
+ }
+ if (length($flushedmask) < length($flushedasq)) {
+ while (length($flushedmask) < length($flushedasq)) { $flushedmask .= " "; }
+ }
+
+ #printf("\naseq|$asq|\nmask|$mask|\n");
+ #printf("^^aseq|$flushedasq|\n^^mask|$flushedmask|\n");
+
+ return $flushedmask;
+}
+
+
+sub ali_removeflanking {
+ my ($aseq, $mask) = @_;
+
+ my $taseq = "";
+
+ my $alen = length($aseq);
+
+ my $apos_start = 0;
+ while ($apos_start < $alen) {
+ my $mval = substr($mask, $apos_start, 1);
+ if ($mval =~ /[\.\:]/) { last; }
+ $apos_start ++;
+ }
+
+ my $apos_end = $alen-1;
+ while ($apos_end >= 0) {
+ my $mval = substr($mask, $apos_end, 1);
+ if ($mval =~ /[\.\:]/) { last; }
+ $apos_end --;
+ }
+
+ for (my $apos = $apos_start; $apos <= $apos_end; $apos++) {
+ $taseq .= substr($aseq, $apos, 1);
+ }
+ #print "B:$aseq\nM:$mask\nA:$taseq\n";
+
+ return $taseq;
+}
+
+
+1;
+__END__
diff --git a/demotic/demotic_h2.pm b/demotic/demotic_h2.pm
new file mode 100644
index 0000000..cbf8d71
--- /dev/null
+++ b/demotic/demotic_h2.pm
@@ -0,0 +1,190 @@
+# Demotic parser for H2 hmmsearch output
+#
+# Does not parse alignment section yet. But suitable for profmark use.
+# H2's hmmsearch can only search a single query model, not multiples.
+#
+# SVN $Id$
+# SRE, Fri Apr 16 11:07:34 2010
+
+package demotic_h2;
+
+sub parse (*) {
+ my $fh = shift;
+ my $parsing_header = 1;
+ my $parsing_seqs = 0;
+ my $parsing_domains = 0;
+ my $parsing_alis = 0;
+
+ # Initialize everything... so we can call the parser
+ # repeatedly, one call per hmmsearch output.
+ #
+ # This section also documents what's available in
+ # variables within the package.
+ #
+ # Arrays are indexed [0..nhits-1] or [0..nali-1]
+ #
+ $queryname = ""; # Name of the query sequence
+ $querydesc = ""; # Description line for the query (or "")
+ $querylen = 0; # Length of the query in residues
+ $db = ""; # Name of the target database file
+ $db_nseq = 0; # Number of sequences in the target database
+ $db_nletters = ""; # Number of residues in the target database
+ # (stored as a string so we can have large #'s)
+
+ # The top hit list (still in rank order)
+ $nhits = 0; # Number of entries in the hit list
+ @hit_target = (); # Target sequence name (by rank)
+ %target_desc = (); # Target sequence description (by targ name)
+ @hit_bitscore = (); # Raw score (by rank)
+ @hit_Eval = (); # P-val or E-val (by rank)
+
+ # The alignment output (in order it came in)
+ # all indexed by # of alignment [0..nali-1]
+ $nali = 0; # Number of alignments
+ @ali_target = (); # Target sequence name
+ @ali_bitscore = (); # bit score
+ @ali_evalue = (); # E-value
+ @ali_qstart = (); # Start position on query
+ @ali_qend = (); # End position on query
+ @ali_tstart = (); # Start position on target
+ @ali_tend = (); # End position on target
+ @ali_qali = (); # Aligned string from query
+ @ali_tali = (); # Aligned string from target (subject)
+
+ # Now, loop over the lines of our input, and parse 'em.
+ #
+ while (<$fh>) {
+
+ if ($parsing_header) {
+ if (/^Scores for complete sequences /) { # seq section starts with this line
+ $parsing_header = 0;
+ $parsing_seqs = 1;
+ <$fh>; # This discards the next line: Sequence Description Score E-value N
+ <$fh>; # and discard another line: -------- ----------- ----- ------- ---
+ next;
+ }
+ elsif (/Query HMM:\s*(\S+)/) { $queryname = $1; }
+ elsif (/Description:\s*(\.*)$/) { $querydesc = $1; }
+ }
+
+ elsif ($parsing_seqs) {
+ if (/^\s*$/) { # seq section ends with a blank line
+ $parsing_seqs = 0;
+ $parsing_domains = 1;
+ <$fh>; # Discard: Parsed for domains:
+ <$fh>; # Discard: Sequence Domain seq-f seq-t hmm-f hmm-t score E-value
+ <$fh>; # Discard: -------- ------- ----- ----- ----- ----- ----- -------
+ next;
+ }
+ elsif (/^(\S+)\s+(.+)\s+(-?\d+\.\d*)\s+(\S+)\s+\d+\s*$/) {
+ # Target Description Score Evalue N
+ #
+ $hit_target[$nhits] = $1;
+ $target_desc{$1} = $2;
+ $hit_bitscore[$nhits] = $3;
+ $hit_Eval[$nhits] = $4;
+ $nhits++;
+ }
+ }
+
+ elsif ($parsing_domains) {
+ if (/^\s*$/) { # domain section ends with a blank line
+ $parsing_domains = 0;
+ $parsing_alis = 1;
+ <$fh>; # Discard: Alignments of top-scoring domains:
+ }
+
+ if (/^(\S+)\s+\d+\/\d+\s+(\d+)\s+(\d+)\s+\S\S\s+(\d+)\s+(\d+)\s+\S\S\s+(-?\d+\.\d*)\s+(\S+)\s*$/)
+ # Sequence Domain seq-f seq-t hmm-f hmm-t score E-value
+ # 1 2 3 4 5 6 7
+ {
+ $ali_target[$nali] = $1;
+ $ali_bitscore[$nali] = $6;
+ $ali_evalue[$nali] = $7;
+ $ali_qstart[$nali] = $4;
+ $ali_qend[$nali] = $5;
+ $ali_tstart[$nali] = $2;
+ $ali_tend[$nali] = $3;
+ $nali++;
+ }
+ }
+ }
+
+ if ($parsing_alis) { return 1; } else { return 0; }
+}
+
+sub exblxout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ printf $ofh "%s\t%d\t%d\t%d\t%s\t%d\t%d\t%s\n",
+ $ali_evalue[$i],
+ $ali_identity[$i],
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_target[$i],
+ $ali_qstart[$i],
+ $ali_qend[$i],
+ $queryname;
+ }
+
+}
+
+
+sub tblout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ printf $ofh "%s\t%d\t%d\t%d\t%s\t%d\t%d\t%s\t%s\n",
+ $ali_evalue[$i],
+ $ali_identity[$i],
+ $ali_qstart[$i],
+ $ali_qend[$i],
+ $queryname,
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_target[$i],
+ $target_desc{$ali_target[$i]};
+ }
+}
+
+
+sub gffout {
+ my $ofh = shift;
+ my $source = shift;
+ my $feature = shift;
+ my $i;
+ my $strand;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ if ($ali_qstart[$i] > $ali_qend[$i]) { $strand = "-"; }
+ else { $strand = "+"; }
+
+ printf $ofh "%s\t%s\t%s\t%d\t%d\t%.1f\t%s\t.\tgene \"%s\"\n",
+ $ali_target[$i],
+ $source,
+ $feature,
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_bitscore[$i],
+ $strand,
+ $queryname;
+ }
+}
+
+
+sub profmarkout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i < $nhits; $i++) {
+ printf $ofh "%g\t%.1f\t%s\t%s\n", $hit_Eval[$i], $hit_bitscore[$i], $hit_target[$i], $queryname;
+ }
+}
+1;
+__END__
+
+ |more
+
diff --git a/demotic/demotic_hmmer.pm b/demotic/demotic_hmmer.pm
new file mode 100644
index 0000000..e901189
--- /dev/null
+++ b/demotic/demotic_hmmer.pm
@@ -0,0 +1,218 @@
+# Demotic parser for HMMER3 output
+#
+# Works for phmmer, hmmsearch output
+# Does not parse env coords nor alignments yet,
+# but is suitable for use in profmark.
+#
+# SVN $Id: demotic_hmmer.pm 2720 2009-01-20 12:03:54Z eddys $
+# SRE, Tue Apr 22 13:13:51 2008
+
+package demotic_hmmer;
+
+# parse(\*STDIN) would parse HMMER output
+# coming in via stdin.
+#
+sub parse (*) {
+ my $fh = shift;
+ my $parsing_header = 1;
+ my $parsing_seqs = 0;
+ my $parsing_domains = 0;
+ my $parsing_alis = 0;
+
+ # Initialize everything... so we can call the parser
+ # repeatedly, one call per hmmsearch output.
+ #
+ # This section also documents what's available in
+ # variables within the package.
+ #
+ # Arrays are indexed [0..nhits-1] or [0..nali-1]
+ #
+ $queryname = ""; # Name of the query sequence
+ $querydesc = ""; # Description line for the query (or "")
+ $querylen = 0; # Length of the query in residues
+ $db = ""; # Name of the target database file
+ $db_nseq = 0; # Number of sequences in the target database
+ $db_nletters = ""; # Number of residues in the target database
+ # (stored as a string so we can have large #'s)
+
+ # The top hit list (still in rank order)
+ $nhits = 0; # Number of entries in the hit list
+ @hit_target = (); # Target sequence name (by rank)
+ %target_desc = (); # Target sequence description (by targ name)
+ @hit_bitscore = (); # Raw score (by rank)
+ @hit_Eval = (); # P-val or E-val (by rank)
+
+ # The alignment output (in order it came in)
+ # all indexed by # of alignment [0..nali-1]
+ $nali = 0; # Number of alignments
+ @ali_target = (); # Target sequence name
+ @ali_bitscore = (); # bit score
+ @ali_evalue = (); # E-value
+ @ali_qstart = (); # Start position on query
+ @ali_qend = (); # End position on query
+ @ali_tstart = (); # Start position on target
+ @ali_tend = (); # End position on target
+ @ali_qali = (); # Aligned string from query
+ @ali_tali = (); # Aligned string from target (subject)
+ @ali_hitidx = (); # index of hit
+
+ # Now, loop over the lines of our input, and parse 'em.
+ #
+ while (<$fh>) {
+ if ($parsing_header) {
+ if (/^Scores for complete sequences /) { # seq section starts with this line
+ $parsing_header = 0;
+ $parsing_seqs = 1;
+ <$fh>; # This discards the next line: --- full sequence ---- ---- single best dom ----
+ <$fh>; # and discard another line: E-value score bias score bias
+ <$fh>; # and discard another line: ------- ------- ------ ------- ------ ----------
+ next;
+ }
+ elsif (/Query:\s*(\S+)\s*\[[LM]=(\d+)\]\s*$/) {
+ $queryname = $1;
+ $querylen = $2;
+ }
+ elsif (/Description:\s*(.*)$/) {
+ $querydesc = $1;
+ }
+ }
+
+ elsif ($parsing_seqs) {
+ if (/^\s*$/) { # seq section ends with a blank line
+ $parsing_seqs = 0;
+ $parsing_domains = 1;
+ next;
+ } elsif (/^\s*(\S+)\s+(\S+)\s+(\S+)\s+\S+\s+\S+\s+\S+\s+(\S+)\s+(\d+)\s+(\S+)\s+(.+)$/) {
+ # evalue score bias evalue score bias exp N target desc
+ # 1 2 3 4 5 6 7
+ $hit_target[$nhits] = $6;
+ $target_desc{$6} = $7;
+ $hit_bitscore[$nhits] = $2;
+ $hit_Eval[$nhits] = $1;
+ $nhits++;
+ }
+ }
+
+ elsif ($parsing_domains) {
+ if (/^\s*$/) { }
+
+ elsif (/^\s*Domain annotation/) { }
+
+ elsif (/^\>\>\s*(\S+)\s*/) { $curr_ali_target = $1; }
+
+ elsif (/^\s*\d+\s+\S\s+(\S+)\s+\S+\s+(\S+)\s+\S+\s+(\d+)\s+(\d+)\s+\S\S\s+(\d+)\s+(\d+)\s+\S\S\s+(\d+)\s+(\d+)\s+\S\S\s+\S+\s*$/)
+ # # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ # --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ # 1 ! 387.6 1.4 7.5e-120 2.1e-115 1 181 [] 1 181 [] 1 181 [] 1.00
+ {
+ $ali_target[$nali] = $curr_ali_target;
+ $ali_bitscore[$nali] = $1;
+ $ali_evalue[$nali] = $2;
+ $ali_qstart[$nali] = $3;
+ $ali_qend[$nali] = $4;
+ $ali_tstart[$nali] = $5;
+ $ali_tend[$nali] = $6;
+ $ali_hitidx[$nali] = $nhits-1;
+ $nali ++;
+ }
+ elsif (/^\s+Alignments for each domain/) {
+ $parsing_domains = 0;
+ $parsing_alis = 1;
+ }
+ }
+
+ elsif ($parsing_alis) {
+ if (/^\s*$/) { }
+
+ elsif (/^\s*\=\=\s+domain\s+(\d+)\s+/) {
+ $whichali = $1-1;
+ }
+ elsif (/^\s+$queryname\s+\d+\s+(\S+)\s+\d+\s*$/) {
+ $ali_qali[$whichali] .= $1;
+ }
+ elsif (/^\s+$ali_target[$whichali]\s+\d+\s+(\S+)\s+\d+\s*$/) {
+ $ali_tali[$whichali] .= $1;
+ }
+ elsif (/\/\//) { return 1; } # normal return after each query.
+ else { next; }
+ }
+ }
+
+ if ($parsing_alis) { return 1; } else { return 0; }
+}
+
+sub exblxout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ printf $ofh "%s\t%d\t%d\t%d\t%s\t%d\t%d\t%s\n",
+ $ali_evalue[$i],
+ $ali_identity[$i],
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_target[$i],
+ $ali_qstart[$i],
+ $ali_qend[$i],
+ $queryname;
+ }
+
+}
+
+
+sub tblout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ printf $ofh "%s\t%d\t%d\t%d\t%s\t%d\t%d\t%s\t%s\n",
+ $ali_evalue[$i],
+ $ali_identity[$i],
+ $ali_qstart[$i],
+ $ali_qend[$i],
+ $queryname,
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_target[$i],
+ $target_desc{$ali_target[$i]};
+ }
+}
+
+
+sub gffout {
+ my $ofh = shift;
+ my $source = shift;
+ my $feature = shift;
+ my $i;
+ my $strand;
+
+ for ($i = 0; $i <= $nali-1; $i++) {
+ if ($ali_qstart[$i] > $ali_qend[$i]) { $strand = "-"; }
+ else { $strand = "+"; }
+
+ printf $ofh "%s\t%s\t%s\t%d\t%d\t%.1f\t%s\t.\tgene \"%s\"\n",
+ $ali_target[$i],
+ $source,
+ $feature,
+ $ali_tstart[$i],
+ $ali_tend[$i],
+ $ali_bitscore[$i],
+ $strand,
+ $queryname;
+ }
+}
+
+
+sub profmarkout {
+ my $ofh = shift;
+ my $i;
+
+ for ($i = 0; $i < $nhits; $i++) {
+ printf $ofh "%g\t%.1f\t%s\t%s\n", $hit_Eval[$i], $hit_bitscore[$i], $hit_target[$i], $queryname;
+ }
+}
+1;
+__END__
+
+ |more
+
diff --git a/demotic/demotic_infernal_tab.pm b/demotic/demotic_infernal_tab.pm
new file mode 100644
index 0000000..f2f5691
--- /dev/null
+++ b/demotic/demotic_infernal_tab.pm
@@ -0,0 +1,177 @@
+############################################################################
+# demotic_infernal_tab package
+# Parses "tabfile" output generated by cmsearch rc1.0
+# (TAJ 6/2008) based on demotic_search3.pm; itself based on SRE demotic_wublast.pm
+############################################################################
+
+#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
+# TODO List:
+# (1) Parse "Post-search" number of hits (expected, actual) and surv fraction (expected, actual)
+# (2) Possibly offload gff output functionality from calling script to this pm.
+#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
+
+# Example output line (ignoring the leading "#"):
+# ////////////////////////////////////////////////////////////////////////////////////////////
+## target name start stop start stop bit sc E-value GC%
+## ----------------------- ---------- ---------- ----- ----- -------- -------- ---
+# Contig10/506498-506590 1 65 1 80 35.79 1.00e-08 40
+# ////////////////////////////////////////////////////////////////////////////////////////////
+#
+# Example "post_search" content:
+# ////////////////////////////////////////////////////////////////////////////////////////////
+# Post-search info for CM 1: SmY
+#
+# number of hits surv fraction
+# ------------------- -----------------
+# rnd mod alg cfg beta expected actual expected actual
+# --- --- --- --- ----- ---------- ------- -------- -------
+# 1 cm ins glc 1e-15 1.000 15 0.0601 0.7829
+#
+# expected time actual time
+# ------------- -------------
+# 00:00:01.04 00:00:06.00
+# ////////////////////////////////////////////////////////////////////////////////////////////
+
+
+package demotic_infernal_tab;
+# Don't have "parse(\*STDIN)" option, since "tabfile" output always written to file
+
+sub parse (*) {
+ my $fh = shift; # if this isn't a file handle to a tabfile, some ass needs kickin'
+ my $parsing_header = 1;
+ my $parsing_presearch = 0;
+ my $parsing_hits = 0;
+ my $post_search = 0;
+ my $nhits = 0; # temp counter for number of hits in current model; (tabulated)
+ my $index = 0; # indexes CM number; ie 1st model is index 0
+
+### NOTE:
+### Some arrays (0..(N-1)) contain values from each search (1..N). Recall there is 1 search per model.
+### Ex: @cm_name # lists names of all CMs used, say: (SmY.1, SmY.2, SmY.3)
+###
+### Other arrays are a "list of lists" (see LoL note below). In these cases, the Nth position
+### in the array, will be an anonymous reference to a list of features for _all_ hits to model (N+1).
+###
+### Ex: @t_name # position N in the list corresponds to one model (N+1) in the search,
+### # which is an anonymous ref to a list of ctgs for all hits from that model.
+### Ex: @{$t_name[1]} # lists ctgs for all hits to the 2nd query model; eg (ChrI, ChrI, ChrIII, ChrV)
+
+
+# Document all the variables available in the package; initialize everything
+#
+# =========== Header details (once/report) ================================
+ $command = ""; # command line used to run search
+ $date = ""; # date search was run
+ $db_recs = ""; # number of records in target DB
+ $db_size = ""; # DB size (in MB)
+
+# =========== Pre-search details (once/CM) =================================
+# Note: details of the "pre-search" filtering rounds not captured currently
+ @cm_name = (); # Covariation Model(s) name; 1st model is 0th in array
+
+# =========== Details from each *hit* (0-many/CM) ==========================
+########################################################################################################
+# NOTE: (LoL) == List of Lists; the (N)th position in the following arrays contains a list #
+# of that feature for all hits from the (N+1)th CM in the report. The order of #
+# features in the anonymous array @{$foo[$i]} corresponds to the order in the report. #
+# EXAMPLE: #
+# @GC # list of anonymous refs, one per CM; refs list all GCs in search #
+# @{$GC[0]} # contains the list of GC values for all hits to the 1st CM #
+# ${$GC[1]}->[3] # GC value of 4th (3+1) hit in the 2nd (1+1) search #
+########################################################################################################
+ @t_name = (); # (LoL); target fasta record name
+ @t_start = (); # (LoL); start location in fasta target
+ @t_stop = (); # (LoL); stop location in fasta target
+ @q_start = (); # (LoL); start location in CM query
+ @q_stop = (); # (LoL); stop location in CM query
+ @bitscore = (); # (LoL); bit score
+ @Eval = (); # (LoL); E-value // can be in scientific notation
+ @GC = (); # (LoL); %GC
+
+# ===================== "Post-search info" (each CM report) ==================
+# NOTE: I'm not capturing all available information here, because I believe it can
+# be quite variable. I'm not expert on all possible output that can be generated
+ @time_expect = (); # expected run time (quoted, not converting into hr:min)
+ @time_actual = (); # actual run time (quoted, not converting into hr:min)
+ @num_hits = (); # tracks number of hits for each model
+
+# ====================== Cumulative Data (all query outputs) ================
+ $model_num = 0; # number of CM's used in the search
+
+
+ # Loop over tabfile input, and parse it (there can be >1 CM/report in each tabfile)
+ while (<$fh>) {
+ if ($parsing_header) { # only one header section, even if multiple CM's in search
+ if (/^\#\sPre\-search\sinfo\sfor\sCM/) { # NB: model name here is picked up later
+ $parsing_header = 0;
+ $parsing_presearch = 1;
+ next;
+ }
+ elsif (/^\#\scommand\:\s+(\S.+)$/) {
+ $command = $1;
+ }
+ elsif (/^\#\sdate:\s+(\S.+)$/) {
+ $date = $1;
+ }
+ elsif (/^\#\snum\sseqs:\s+(\d+)/) { # could get fucked if commas appear in the number
+ $db_recs = $1;
+ }
+ elsif (/^\#\sdbsize\S+:\s+(\S+)/) { # $1 has a decimal; \d just don't cut it
+ $db_size = $1;
+ }
+ }
+ elsif ($parsing_presearch) { # Each CM has it's own "pre-search"
+ if (/^\#\starget\sname/) { # signals end of "Pre-search"; occurs once per CM
+ $parsing_presearch = 0;
+ $parsing_hits = 1;
+ <$fh>; # Discard next line (composed of dashes); then hitlist begins
+ next;
+ }
+ elsif (/^\#\sCM:\s(\S+)/) { # If multiple models/CM; format is "CM-NAME.n" (1..n)
+ $model_num++; # NB: correctly tallys models; use $index for array indices!
+ push (@cm_name, $1);
+ }
+ }
+ elsif ($parsing_hits) { # every line not starting with "#" should be a "hit"
+# Example hit [sans leading "#"]:
+# Contig10 1001 1065 1 80 35.79 1.00e-08 40
+ if (/^\s*(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(\S+)\s+(\d+)\s*$/) {
+ push (@{$t_name[$index]} , $1);
+ push (@{$t_start[$index]} , $2);
+ push (@{$t_stop[$index]} , $3);
+ push (@{$q_start[$index]} , $4);
+ push (@{$q_stop[$index]} , $5);
+ push (@{$bitscore[$index]}, $6);
+ push (@{$Eval[$index]} , $7);
+ push (@{$GC[$index]} , $8);
+ $nhits++;
+ }
+ elsif (/^\#/) { # end of "hitlist" for this CM
+ $parsing_hits = 0;
+ $post_search = 1;
+ push (@num_hits, $nhits);
+ $nhits = 0; # clear hit counter for next model
+ next;
+ }
+ else { die "Parsing 'hitlist' -- should never get here! Current line is:\n$_"; }
+ }
+ elsif ($post_search) { # Each CM has it's own "post-search"
+ if (/^\#\sexpected\stime/) { # Effectively marking the end of a single query's report
+ <$fh>; # discard next line of dashes
+ $_ = <$fh>; # get next line listing the times
+ if (/^\#\s+(\S+)\s+(\S+)\s*$/) {
+ push (@time_expect, $1); # \__ not going to try parsing hours/minutes/seconds
+ push (@time_actual, $2); # /
+ $post_search = 0; # \__ if looping over multiple query CMs, next up is
+ $parsing_presearch = 1; # / "pre-search" for next model, or soon: EOF
+ $index++; # LoL index; end of report i, prepare for report i+1
+ }
+ }
+ }
+ else { die "Should never get here! Dropped through WHILE loop, parsing line:\n$_"; }
+ } # this closes the loop over lines in the input stream.
+}
+
+1;
+__END__
+
diff --git a/demotic/examples/example-single-psiquery.fa b/demotic/examples/example-single-psiquery.fa
new file mode 100644
index 0000000..4803c21
--- /dev/null
+++ b/demotic/examples/example-single-psiquery.fa
@@ -0,0 +1,7 @@
+>A3CM55_STRSV/64-391 A3CM55.1
+SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRMLLTLVIALIQSVALVLNLP
+LQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMASMIAYIPQDIWN
+SIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPA
+GGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWFILYLLTIFILALA
+FAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLILISGLPMMV
+VLVDIRYLRLSMIPGIFMIFIGMVFSIK
diff --git a/demotic/examples/example-single.asnt b/demotic/examples/example-single.asnt
new file mode 100644
index 0000000..74edbd7
--- /dev/null
+++ b/demotic/examples/example-single.asnt
@@ -0,0 +1,9215 @@
+PssmWithParameters ::= {
+ pssm {
+ isProtein TRUE ,
+ numRows 28 ,
+ numColumns 328 ,
+ byRow FALSE ,
+ query
+ seq {
+ id {
+ local
+ str "A3CM55_STRSV/64-391" } ,
+ descr {
+ title "A3CM55.1" } ,
+ inst {
+ repr raw ,
+ mol aa ,
+ length 328 ,
+ seq-data
+ ncbieaa "SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRMLLTLVIALIQSVALVL
+NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMASMIAYIPQDIWNSIQELKISSLWLALM
+LVFSLVFLYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIE
+QWIEALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLI
+LISGLPMMVVLVDIRYLRLSMIPGIFMIFIGMVFSIK" } } ,
+ intermediateData {
+ freqRatios {
+ { 0, 10, 0 } ,
+ { 517881877, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 714899082, 10, -11 } ,
+ { 228880836, 10, -10 } ,
+ { 268767292, 10, -10 } ,
+ { 926243646, 10, -11 } ,
+ { 177664277, 10, -9 } ,
+ { 750670798, 10, -11 } ,
+ { 151849534, 10, -10 } ,
+ { 256189057, 10, -10 } ,
+ { 241985116, 10, -10 } ,
+ { 779851038, 10, -11 } ,
+ { 262995653, 10, -10 } ,
+ { 193119177, 10, -10 } ,
+ { 190809756, 10, -10 } ,
+ { 188907569, 10, -10 } ,
+ { 278285975, 10, -9 } ,
+ { 252640924, 10, -9 } ,
+ { 239733259, 10, -10 } ,
+ { 301431543, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 922884276, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 309934003, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 761463694, 10, -11 } ,
+ { 102434459, 10, -10 } ,
+ { 136310089, 10, -10 } ,
+ { 370679606, 10, -10 } ,
+ { 128089526, 10, -10 } ,
+ { 470654848, 10, -11 } ,
+ { 269738853, 10, -9 } ,
+ { 143356703, 10, -10 } ,
+ { 279228195, 10, -9 } ,
+ { 219154764, 10, -10 } ,
+ { 883310202, 10, -11 } ,
+ { 120484249, 10, -10 } ,
+ { 109846992, 10, -10 } ,
+ { 126030556, 10, -10 } ,
+ { 194750028, 10, -10 } ,
+ { 265561434, 10, -10 } ,
+ { 14184185, 10, -8 } ,
+ { 388859764, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 137166057, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 480691169, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 371625208, 10, -10 } ,
+ { 97373281, 10, -10 } ,
+ { 138789891, 10, -10 } ,
+ { 277587347, 10, -9 } ,
+ { 154229191, 10, -10 } ,
+ { 679239895, 10, -11 } ,
+ { 769688451, 10, -10 } ,
+ { 143752343, 10, -10 } ,
+ { 170383067, 10, -9 } ,
+ { 123393878, 10, -9 } ,
+ { 970797801, 10, -11 } ,
+ { 106990917, 10, -10 } ,
+ { 120008149, 10, -10 } ,
+ { 131851268, 10, -10 } ,
+ { 212793063, 10, -10 } ,
+ { 21134561, 10, -9 } ,
+ { 404227857, 10, -10 } ,
+ { 682154343, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 287824526, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 273381473, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 793699125, 10, -11 } ,
+ { 285083707, 10, -10 } ,
+ { 152041089, 10, -9 } ,
+ { 107433403, 10, -10 } ,
+ { 356813034, 10, -10 } ,
+ { 960120934, 10, -11 } ,
+ { 324819475, 10, -10 } ,
+ { 33836615, 10, -9 } ,
+ { 330877985, 10, -10 } ,
+ { 178294009, 10, -10 } ,
+ { 21991971, 10, -9 } ,
+ { 226825182, 10, -10 } ,
+ { 675526885, 10, -10 } ,
+ { 242426951, 10, -10 } ,
+ { 101397213, 10, -9 } ,
+ { 105859297, 10, -9 } ,
+ { 324821235, 10, -10 } ,
+ { 343454612, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 109353832, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 279029956, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 690582591, 10, -11 } ,
+ { 915515151, 10, -11 } ,
+ { 137969549, 10, -10 } ,
+ { 407323651, 10, -10 } ,
+ { 125373864, 10, -10 } ,
+ { 492239741, 10, -11 } ,
+ { 537970465, 10, -10 } ,
+ { 143908894, 10, -10 } ,
+ { 513958028, 10, -9 } ,
+ { 560468512, 10, -10 } ,
+ { 864034937, 10, -11 } ,
+ { 111873436, 10, -10 } ,
+ { 119726049, 10, -10 } ,
+ { 137034531, 10, -10 } ,
+ { 19221067, 10, -9 } ,
+ { 395565848, 10, -10 } ,
+ { 884935061, 10, -10 } ,
+ { 42315088, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 133349611, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 521043011, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 395647073, 10, -11 } ,
+ { 165085958, 10, -10 } ,
+ { 149149131, 10, -10 } ,
+ { 629041473, 10, -11 } ,
+ { 728081838, 10, -9 } ,
+ { 529836444, 10, -11 } ,
+ { 69541992, 10, -10 } ,
+ { 163975886, 10, -10 } ,
+ { 125317218, 10, -10 } ,
+ { 431478644, 10, -11 } ,
+ { 282753926, 10, -10 } ,
+ { 120080208, 10, -10 } ,
+ { 112367134, 10, -10 } ,
+ { 112732303, 10, -10 } ,
+ { 418475414, 10, -10 } ,
+ { 168886274, 10, -10 } ,
+ { 107718011, 10, -10 } ,
+ { 263254928, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 544827325, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 269123114, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 662177844, 10, -11 } ,
+ { 924567497, 10, -11 } ,
+ { 113055886, 10, -10 } ,
+ { 188272808, 10, -10 } ,
+ { 10825489, 10, -9 } ,
+ { 3797244, 10, -9 } ,
+ { 466658624, 10, -9 } ,
+ { 121011005, 10, -10 } ,
+ { 139010418, 10, -9 } ,
+ { 174964519, 10, -10 } ,
+ { 768618973, 10, -11 } ,
+ { 105094923, 10, -10 } ,
+ { 889797122, 10, -11 } ,
+ { 996523231, 10, -11 } ,
+ { 16820564, 10, -9 } ,
+ { 239260116, 10, -10 } ,
+ { 14079382, 10, -8 } ,
+ { 290212908, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 106564555, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 651836045, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 781024537, 10, -11 } ,
+ { 19095696, 10, -9 } ,
+ { 238724803, 10, -10 } ,
+ { 400185161, 10, -10 } ,
+ { 171606437, 10, -9 } ,
+ { 780789604, 10, -11 } ,
+ { 444159947, 10, -10 } ,
+ { 239987176, 10, -10 } ,
+ { 78305675, 10, -9 } ,
+ { 110857434, 10, -9 } ,
+ { 209535046, 10, -10 } ,
+ { 176368235, 10, -10 } ,
+ { 192807775, 10, -10 } ,
+ { 187586848, 10, -10 } ,
+ { 145120995, 10, -9 } ,
+ { 541169244, 10, -10 } ,
+ { 107052161, 10, -9 } ,
+ { 42829021, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 138758435, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 235486802, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 292325478, 10, -11 } ,
+ { 128488024, 10, -10 } ,
+ { 171059612, 10, -10 } ,
+ { 443449159, 10, -11 } ,
+ { 140896898, 10, -10 } ,
+ { 41603363, 10, -10 } ,
+ { 791342966, 10, -11 } ,
+ { 16173364, 10, -9 } ,
+ { 133914369, 10, -10 } ,
+ { 380402256, 10, -11 } ,
+ { 897470434, 10, -11 } ,
+ { 867146688, 10, -9 } ,
+ { 109400097, 10, -10 } ,
+ { 988127282, 10, -11 } ,
+ { 215213125, 10, -10 } ,
+ { 160988181, 10, -10 } ,
+ { 114180197, 10, -10 } ,
+ { 149967155, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 4677331, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 231868293, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 515627476, 10, -11 } ,
+ { 103128978, 10, -10 } ,
+ { 140849126, 10, -10 } ,
+ { 857300965, 10, -10 } ,
+ { 129438707, 10, -10 } ,
+ { 125724605, 10, -10 } ,
+ { 218663544, 10, -9 } ,
+ { 141202503, 10, -10 } ,
+ { 50321186, 10, -9 } ,
+ { 116478414, 10, -10 } ,
+ { 281882452, 10, -10 } ,
+ { 991475365, 10, -11 } ,
+ { 113551595, 10, -10 } ,
+ { 125513926, 10, -10 } ,
+ { 192719506, 10, -10 } ,
+ { 197983872, 10, -10 } ,
+ { 547083935, 10, -10 } ,
+ { 302290459, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 326422403, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 299375543, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 693821672, 10, -11 } ,
+ { 979999378, 10, -11 } ,
+ { 125734011, 10, -10 } ,
+ { 317157013, 10, -10 } ,
+ { 119861446, 10, -10 } ,
+ { 466807251, 10, -11 } ,
+ { 385988613, 10, -9 } ,
+ { 132441562, 10, -10 } ,
+ { 765620744, 10, -10 } ,
+ { 437383702, 10, -10 } ,
+ { 85172182, 10, -10 } ,
+ { 112242639, 10, -10 } ,
+ { 100281139, 10, -10 } ,
+ { 108615005, 10, -10 } ,
+ { 186997969, 10, -10 } ,
+ { 258986195, 10, -10 } ,
+ { 209667772, 10, -9 } ,
+ { 34458904, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 302059153, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 444446573, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 704389127, 10, -11 } ,
+ { 25917194, 10, -9 } ,
+ { 280341533, 10, -10 } ,
+ { 109040543, 10, -10 } ,
+ { 286424736, 10, -10 } ,
+ { 895690046, 10, -11 } ,
+ { 174602797, 10, -10 } ,
+ { 263898432, 10, -10 } ,
+ { 440952802, 10, -10 } ,
+ { 87128392, 10, -10 } ,
+ { 12749547, 10, -8 } ,
+ { 187144692, 10, -10 } ,
+ { 20126867, 10, -9 } ,
+ { 203045715, 10, -10 } ,
+ { 22419357, 10, -8 } ,
+ { 309183627, 10, -9 } ,
+ { 26381826, 10, -9 } ,
+ { 313791685, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 238214666, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 461839243, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 811554263, 10, -11 } ,
+ { 180415238, 10, -10 } ,
+ { 258756231, 10, -10 } ,
+ { 898054422, 10, -11 } ,
+ { 379210866, 10, -10 } ,
+ { 696657891, 10, -11 } ,
+ { 150176551, 10, -10 } ,
+ { 24127792, 10, -9 } ,
+ { 251716116, 10, -10 } ,
+ { 78187254, 10, -10 } ,
+ { 180547292, 10, -10 } ,
+ { 20003569, 10, -9 } ,
+ { 17862483, 10, -9 } ,
+ { 172759128, 10, -10 } ,
+ { 233917091, 10, -9 } ,
+ { 351634851, 10, -10 } ,
+ { 269180962, 10, -10 } ,
+ { 275650271, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 896786212, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 531551186, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 643117558, 10, -11 } ,
+ { 23519724, 10, -9 } ,
+ { 302119961, 10, -10 } ,
+ { 869147403, 10, -11 } ,
+ { 195476593, 10, -9 } ,
+ { 82637662, 10, -10 } ,
+ { 118842469, 10, -10 } ,
+ { 272157511, 10, -10 } ,
+ { 214810812, 10, -10 } ,
+ { 222772154, 10, -10 } ,
+ { 261807917, 10, -10 } ,
+ { 185078955, 10, -10 } ,
+ { 691177601, 10, -10 } ,
+ { 201748549, 10, -10 } ,
+ { 403685572, 10, -9 } ,
+ { 516753071, 10, -10 } ,
+ { 182059045, 10, -10 } ,
+ { 290200838, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 884172288, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 266488645, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 665676921, 10, -11 } ,
+ { 956393937, 10, -11 } ,
+ { 122199829, 10, -10 } ,
+ { 527788382, 10, -10 } ,
+ { 117668351, 10, -10 } ,
+ { 456326758, 10, -11 } ,
+ { 383522354, 10, -9 } ,
+ { 132566515, 10, -10 } ,
+ { 190234248, 10, -9 } ,
+ { 741110664, 10, -10 } ,
+ { 833890928, 10, -11 } ,
+ { 107903749, 10, -10 } ,
+ { 104355901, 10, -10 } ,
+ { 113726173, 10, -10 } ,
+ { 176993185, 10, -10 } ,
+ { 236063966, 10, -10 } ,
+ { 699475415, 10, -10 } ,
+ { 370304842, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 133558046, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 423832036, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 731611618, 10, -11 } ,
+ { 104024718, 10, -10 } ,
+ { 132303252, 10, -10 } ,
+ { 32987985, 10, -9 } ,
+ { 130177131, 10, -10 } ,
+ { 434031478, 10, -11 } ,
+ { 369971686, 10, -9 } ,
+ { 138251238, 10, -10 } ,
+ { 109103697, 10, -9 } ,
+ { 228025578, 10, -10 } ,
+ { 899620835, 10, -11 } ,
+ { 119473472, 10, -10 } ,
+ { 1022835, 10, -8 } ,
+ { 112766782, 10, -10 } ,
+ { 206685905, 10, -10 } ,
+ { 38817477, 10, -9 } ,
+ { 198570254, 10, -9 } ,
+ { 323785145, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 123957787, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 325551474, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 740015777, 10, -11 } ,
+ { 105952164, 10, -10 } ,
+ { 156901421, 10, -10 } ,
+ { 966005858, 10, -10 } ,
+ { 151583051, 10, -10 } ,
+ { 6180454, 10, -9 } ,
+ { 128868906, 10, -9 } ,
+ { 16553765, 10, -9 } ,
+ { 198853845, 10, -9 } ,
+ { 142202165, 10, -9 } ,
+ { 103071831, 10, -10 } ,
+ { 124046684, 10, -10 } ,
+ { 143265505, 10, -10 } ,
+ { 148285744, 10, -10 } ,
+ { 220129648, 10, -10 } ,
+ { 267885994, 10, -10 } ,
+ { 142167228, 10, -9 } ,
+ { 248428934, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 196996274, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 25090378, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 31882391, 10, -10 } ,
+ { 20457712, 10, -9 } ,
+ { 583375855, 10, -10 } ,
+ { 592488738, 10, -11 } ,
+ { 173401061, 10, -10 } ,
+ { 10598314, 10, -9 } ,
+ { 887873796, 10, -11 } ,
+ { 364593317, 10, -10 } ,
+ { 189255904, 10, -10 } ,
+ { 810071482, 10, -11 } ,
+ { 187197245, 10, -10 } ,
+ { 144439597, 10, -10 } ,
+ { 679384397, 10, -9 } ,
+ { 294879652, 10, -10 } ,
+ { 28777719, 10, -9 } ,
+ { 195695312, 10, -10 } ,
+ { 132730528, 10, -10 } ,
+ { 296468067, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 845437503, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 296773197, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 738145482, 10, -11 } ,
+ { 109216628, 10, -10 } ,
+ { 163468778, 10, -10 } ,
+ { 567404848, 10, -10 } ,
+ { 144716284, 10, -10 } ,
+ { 573227216, 10, -11 } ,
+ { 977193432, 10, -10 } ,
+ { 163638065, 10, -10 } ,
+ { 464328074, 10, -9 } ,
+ { 373940435, 10, -10 } ,
+ { 982774434, 10, -11 } ,
+ { 127293769, 10, -10 } ,
+ { 252991746, 10, -10 } ,
+ { 153717282, 10, -10 } ,
+ { 203885521, 10, -10 } ,
+ { 243630006, 10, -10 } ,
+ { 761529559, 10, -10 } ,
+ { 480392105, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 155118482, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 236259247, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 614892777, 10, -11 } ,
+ { 781567161, 10, -11 } ,
+ { 119070646, 10, -10 } ,
+ { 472639881, 10, -10 } ,
+ { 10791564, 10, -9 } ,
+ { 440833714, 10, -11 } ,
+ { 430092618, 10, -10 } ,
+ { 12482028, 10, -9 } ,
+ { 626735587, 10, -9 } ,
+ { 385036295, 10, -10 } ,
+ { 716754079, 10, -11 } ,
+ { 969378634, 10, -11 } ,
+ { 103931837, 10, -10 } ,
+ { 122798316, 10, -10 } ,
+ { 156000485, 10, -10 } ,
+ { 193633056, 10, -10 } ,
+ { 419204473, 10, -10 } ,
+ { 403218374, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 125620884, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 169512228, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 955945729, 10, -11 } ,
+ { 241578395, 10, -10 } ,
+ { 375887958, 10, -10 } ,
+ { 144888312, 10, -10 } ,
+ { 659472757, 10, -10 } ,
+ { 98124845, 10, -10 } ,
+ { 342868702, 10, -10 } ,
+ { 3418672, 10, -8 } ,
+ { 615930922, 10, -10 } ,
+ { 137214689, 10, -10 } ,
+ { 245101154, 10, -10 } ,
+ { 240348348, 10, -10 } ,
+ { 841844023, 10, -10 } ,
+ { 333807113, 10, -10 } ,
+ { 109121203, 10, -9 } ,
+ { 13073363, 10, -8 } ,
+ { 115358738, 10, -9 } ,
+ { 422154202, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 134286717, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 546747566, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 876887126, 10, -11 } ,
+ { 236936025, 10, -10 } ,
+ { 286274781, 10, -10 } ,
+ { 189546075, 10, -10 } ,
+ { 264733833, 10, -9 } ,
+ { 956429268, 10, -11 } ,
+ { 476198935, 10, -10 } ,
+ { 280184339, 10, -10 } ,
+ { 690557708, 10, -10 } ,
+ { 394589655, 10, -10 } ,
+ { 242416733, 10, -10 } ,
+ { 222283036, 10, -10 } ,
+ { 338423903, 10, -10 } ,
+ { 222164001, 10, -10 } ,
+ { 579838693, 10, -10 } ,
+ { 754818233, 10, -10 } ,
+ { 131275917, 10, -9 } ,
+ { 544843315, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 282371854, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 137693756, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 915286543, 10, -11 } ,
+ { 876606444, 10, -10 } ,
+ { 416009718, 10, -10 } ,
+ { 287136173, 10, -10 } ,
+ { 465460418, 10, -10 } ,
+ { 991533718, 10, -11 } ,
+ { 365393835, 10, -10 } ,
+ { 801928542, 10, -10 } ,
+ { 56845064, 10, -9 } ,
+ { 129405428, 10, -10 } ,
+ { 342324122, 10, -10 } ,
+ { 324296019, 10, -10 } ,
+ { 304615419, 10, -10 } ,
+ { 294494159, 10, -10 } ,
+ { 138111028, 10, -9 } ,
+ { 857308478, 10, -10 } ,
+ { 962959782, 10, -10 } ,
+ { 402392678, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 145663262, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 650172246, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 865486837, 10, -11 } ,
+ { 432182586, 10, -10 } ,
+ { 663221617, 10, -10 } ,
+ { 312456713, 10, -10 } ,
+ { 491507032, 10, -10 } ,
+ { 316430512, 10, -10 } ,
+ { 612228974, 10, -10 } ,
+ { 132554075, 10, -9 } ,
+ { 976781104, 10, -10 } ,
+ { 260486017, 10, -10 } ,
+ { 349858955, 10, -10 } ,
+ { 270814954, 10, -10 } ,
+ { 603890567, 10, -10 } ,
+ { 452036674, 10, -10 } ,
+ { 613175604, 10, -10 } ,
+ { 449244246, 10, -10 } ,
+ { 602342031, 10, -10 } ,
+ { 663358449, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 43964771, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 388658924, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 854161777, 10, -11 } ,
+ { 163427558, 10, -10 } ,
+ { 227504954, 10, -10 } ,
+ { 429604054, 10, -10 } ,
+ { 201784066, 10, -10 } ,
+ { 779013644, 10, -11 } ,
+ { 188721627, 10, -9 } ,
+ { 459215178, 10, -10 } ,
+ { 199343851, 10, -9 } ,
+ { 251909307, 10, -10 } ,
+ { 144116159, 10, -10 } ,
+ { 74888628, 10, -9 } ,
+ { 177391, 10, -7 } ,
+ { 350428975, 10, -10 } ,
+ { 326156756, 10, -10 } ,
+ { 320803095, 10, -10 } ,
+ { 109129193, 10, -9 } ,
+ { 530039074, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 311517884, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 37312112, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 548121663, 10, -11 } ,
+ { 147421063, 10, -10 } ,
+ { 199810079, 10, -10 } ,
+ { 129884375, 10, -10 } ,
+ { 168169875, 10, -10 } ,
+ { 53685634, 10, -10 } ,
+ { 182181612, 10, -9 } ,
+ { 352744611, 10, -10 } ,
+ { 117583498, 10, -9 } ,
+ { 120219293, 10, -10 } ,
+ { 115669917, 10, -10 } ,
+ { 400259469, 10, -9 } ,
+ { 199191915, 10, -10 } ,
+ { 144474498, 10, -10 } ,
+ { 355745468, 10, -10 } ,
+ { 353264503, 10, -10 } ,
+ { 417987056, 10, -10 } ,
+ { 271028385, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 89696021, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 943358527, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 814541561, 10, -11 } ,
+ { 595733415, 10, -10 } ,
+ { 789663739, 10, -10 } ,
+ { 167936737, 10, -10 } ,
+ { 85217137, 10, -9 } ,
+ { 232942096, 10, -10 } ,
+ { 245342656, 10, -10 } ,
+ { 109509138, 10, -9 } ,
+ { 667224249, 10, -10 } ,
+ { 137301873, 10, -10 } ,
+ { 563208029, 10, -10 } ,
+ { 521687235, 10, -10 } ,
+ { 583153009, 10, -10 } ,
+ { 725816483, 10, -10 } ,
+ { 860817319, 10, -10 } ,
+ { 509489304, 10, -10 } ,
+ { 376718553, 10, -10 } ,
+ { 50602371, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 24594851, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 328263016, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 744796729, 10, -11 } ,
+ { 116441556, 10, -10 } ,
+ { 191797323, 10, -10 } ,
+ { 978088583, 10, -10 } ,
+ { 15020654, 10, -9 } ,
+ { 637485084, 10, -11 } ,
+ { 68577667, 10, -9 } ,
+ { 268738641, 10, -10 } ,
+ { 337188711, 10, -9 } ,
+ { 283836687, 10, -10 } ,
+ { 10781794, 10, -9 } ,
+ { 129817603, 10, -10 } ,
+ { 440295399, 10, -10 } ,
+ { 170305253, 10, -10 } ,
+ { 224560937, 10, -10 } ,
+ { 264230682, 10, -10 } ,
+ { 152188749, 10, -9 } ,
+ { 518855602, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 19285881, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 707083393, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 597700701, 10, -11 } ,
+ { 17401882, 10, -8 } ,
+ { 164431194, 10, -9 } ,
+ { 999640867, 10, -11 } ,
+ { 571850348, 10, -10 } ,
+ { 124711194, 10, -10 } ,
+ { 195597559, 10, -10 } ,
+ { 57458904, 10, -9 } ,
+ { 25940193, 10, -9 } ,
+ { 842209858, 10, -11 } ,
+ { 901614039, 10, -10 } ,
+ { 230814388, 10, -10 } ,
+ { 481714288, 10, -10 } ,
+ { 44783385, 10, -9 } ,
+ { 115241171, 10, -9 } ,
+ { 603176471, 10, -10 } ,
+ { 28286973, 10, -9 } ,
+ { 317383426, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 107495161, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 563015015, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 671702416, 10, -11 } ,
+ { 668371862, 10, -10 } ,
+ { 133477273, 10, -9 } ,
+ { 166209675, 10, -10 } ,
+ { 291133515, 10, -10 } ,
+ { 122008397, 10, -10 } ,
+ { 394302067, 10, -10 } ,
+ { 139574725, 10, -9 } ,
+ { 128011275, 10, -9 } ,
+ { 372265172, 10, -10 } ,
+ { 471647729, 10, -10 } ,
+ { 233043546, 10, -10 } ,
+ { 570937259, 10, -10 } ,
+ { 644397248, 10, -10 } ,
+ { 457956524, 10, -10 } ,
+ { 506827552, 10, -10 } ,
+ { 363593347, 10, -10 } ,
+ { 439852729, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 138739339, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 695782429, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 844365786, 10, -11 } ,
+ { 389018854, 10, -10 } ,
+ { 43175918, 10, -9 } ,
+ { 481963505, 10, -10 } ,
+ { 346634629, 10, -10 } ,
+ { 93700982, 10, -10 } ,
+ { 608639048, 10, -10 } ,
+ { 328596973, 10, -10 } ,
+ { 210354553, 10, -9 } ,
+ { 393504201, 10, -10 } ,
+ { 277421119, 10, -10 } ,
+ { 188195337, 10, -10 } ,
+ { 592007664, 10, -10 } ,
+ { 240463587, 10, -10 } ,
+ { 662246753, 10, -10 } ,
+ { 670117892, 10, -10 } ,
+ { 512820844, 10, -10 } ,
+ { 568873052, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 204207793, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 683512837, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 613553154, 10, -11 } ,
+ { 10086215, 10, -8 } ,
+ { 694010276, 10, -10 } ,
+ { 110216759, 10, -10 } ,
+ { 334854578, 10, -10 } ,
+ { 200748677, 10, -10 } ,
+ { 239161486, 10, -10 } ,
+ { 139274301, 10, -9 } ,
+ { 381482052, 10, -10 } ,
+ { 108521641, 10, -10 } ,
+ { 779393614, 10, -10 } ,
+ { 715303659, 10, -10 } ,
+ { 108120842, 10, -9 } ,
+ { 713212067, 10, -10 } ,
+ { 745209854, 10, -10 } ,
+ { 517140677, 10, -10 } ,
+ { 379509887, 10, -10 } ,
+ { 361156185, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 126239317, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 357644638, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 441649283, 10, -11 } ,
+ { 422458537, 10, -10 } ,
+ { 602823978, 10, -10 } ,
+ { 906290493, 10, -11 } ,
+ { 443462846, 10, -10 } ,
+ { 184482299, 10, -10 } ,
+ { 278383083, 10, -10 } ,
+ { 321147719, 10, -9 } ,
+ { 409985848, 10, -10 } ,
+ { 884730144, 10, -11 } ,
+ { 548219086, 10, -10 } ,
+ { 105364821, 10, -9 } ,
+ { 520310956, 10, -10 } ,
+ { 878601371, 10, -10 } ,
+ { 492423312, 10, -10 } ,
+ { 278208526, 10, -10 } ,
+ { 204918521, 10, -10 } ,
+ { 293028117, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 10388996, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 451002078, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 390520652, 10, -11 } ,
+ { 923048756, 10, -10 } ,
+ { 417478676, 10, -9 } ,
+ { 764498911, 10, -11 } ,
+ { 221795301, 10, -10 } ,
+ { 10800431, 10, -9 } ,
+ { 121742315, 10, -10 } ,
+ { 375608834, 10, -10 } ,
+ { 214631714, 10, -10 } ,
+ { 130893466, 10, -10 } ,
+ { 292864928, 10, -10 } ,
+ { 50377521, 10, -9 } ,
+ { 892375566, 10, -10 } ,
+ { 256847553, 10, -10 } ,
+ { 862026856, 10, -10 } ,
+ { 267907914, 10, -10 } ,
+ { 329118681, 10, -10 } ,
+ { 275475359, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 892738056, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 514227909, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 562346657, 10, -11 } ,
+ { 105656107, 10, -9 } ,
+ { 950878489, 10, -10 } ,
+ { 109420142, 10, -10 } ,
+ { 283742381, 10, -9 } ,
+ { 992413077, 10, -11 } ,
+ { 170687918, 10, -10 } ,
+ { 355852654, 10, -10 } ,
+ { 574276037, 10, -10 } ,
+ { 911953255, 10, -11 } ,
+ { 41617785, 10, -9 } ,
+ { 341236873, 10, -10 } ,
+ { 367314029, 10, -10 } ,
+ { 757417822, 10, -10 } ,
+ { 617199419, 10, -10 } ,
+ { 383165135, 10, -10 } ,
+ { 333370859, 10, -10 } ,
+ { 358569543, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 987263141, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 610431247, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 476963122, 10, -11 } ,
+ { 101746549, 10, -9 } ,
+ { 183350925, 10, -9 } ,
+ { 459139222, 10, -10 } ,
+ { 129064916, 10, -9 } ,
+ { 124134623, 10, -10 } ,
+ { 138778066, 10, -10 } ,
+ { 690723178, 10, -10 } ,
+ { 275017555, 10, -10 } ,
+ { 875727939, 10, -11 } ,
+ { 281735548, 10, -10 } ,
+ { 202707847, 10, -10 } ,
+ { 760859366, 10, -10 } ,
+ { 120607096, 10, -9 } ,
+ { 431495355, 10, -10 } ,
+ { 277131879, 10, -10 } ,
+ { 199804033, 10, -10 } ,
+ { 435261503, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 230696441, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 120279138, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 655013019, 10, -11 } ,
+ { 326994242, 10, -10 } ,
+ { 14416255, 10, -8 } ,
+ { 113417356, 10, -10 } ,
+ { 397067487, 10, -10 } ,
+ { 126176073, 10, -10 } ,
+ { 280330811, 10, -10 } ,
+ { 474707015, 10, -10 } ,
+ { 413610216, 10, -10 } ,
+ { 147308615, 10, -10 } ,
+ { 489097726, 10, -10 } ,
+ { 217095492, 10, -10 } ,
+ { 141362352, 10, -9 } ,
+ { 106623778, 10, -9 } ,
+ { 851229774, 10, -10 } ,
+ { 350811058, 10, -10 } ,
+ { 701099256, 10, -10 } ,
+ { 375416475, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 122555783, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 63000171, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 578949141, 10, -11 } ,
+ { 244517534, 10, -10 } ,
+ { 5610681, 10, -8 } ,
+ { 275715069, 10, -10 } ,
+ { 35143833, 10, -8 } ,
+ { 87350744, 10, -10 } ,
+ { 34693054, 10, -9 } ,
+ { 940084526, 10, -10 } ,
+ { 549718693, 10, -10 } ,
+ { 215111853, 10, -10 } ,
+ { 391584121, 10, -10 } ,
+ { 180215961, 10, -10 } ,
+ { 231165651, 10, -10 } ,
+ { 510641048, 10, -10 } ,
+ { 425057729, 10, -10 } ,
+ { 494150865, 10, -10 } ,
+ { 249797484, 10, -10 } ,
+ { 393108608, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 11185898, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 126498353, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 143925783, 10, -10 } ,
+ { 183773659, 10, -10 } ,
+ { 322872504, 10, -10 } ,
+ { 364886468, 10, -10 } ,
+ { 69865455, 10, -9 } ,
+ { 13562522, 10, -9 } ,
+ { 304771922, 10, -10 } ,
+ { 699416379, 10, -10 } ,
+ { 848127968, 10, -10 } ,
+ { 123024095, 10, -10 } ,
+ { 19839534, 10, -9 } ,
+ { 178703578, 10, -10 } ,
+ { 486263334, 10, -10 } ,
+ { 165753965, 10, -9 } ,
+ { 40034077, 10, -9 } ,
+ { 281269012, 10, -10 } ,
+ { 304682628, 10, -10 } ,
+ { 223200969, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 116631344, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 3279151, 10, -8 } ,
+ { 0, 10, 0 } ,
+ { 462382531, 10, -11 } ,
+ { 215484058, 10, -10 } ,
+ { 434277571, 10, -10 } ,
+ { 261483794, 10, -10 } ,
+ { 213477755, 10, -10 } ,
+ { 172231653, 10, -10 } ,
+ { 137260424, 10, -10 } ,
+ { 103392278, 10, -9 } ,
+ { 266905912, 10, -10 } ,
+ { 938826416, 10, -11 } ,
+ { 232806908, 10, -10 } ,
+ { 172990152, 10, -10 } ,
+ { 211320261, 10, -9 } ,
+ { 222860369, 10, -9 } ,
+ { 406950698, 10, -10 } ,
+ { 149904204, 10, -9 } ,
+ { 205099762, 10, -10 } ,
+ { 345719866, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 117217896, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 297088208, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 358026551, 10, -11 } ,
+ { 197005575, 10, -10 } ,
+ { 391178337, 10, -10 } ,
+ { 774685382, 10, -11 } ,
+ { 205448968, 10, -10 } ,
+ { 949963603, 10, -11 } ,
+ { 124866705, 10, -10 } ,
+ { 386596539, 10, -9 } ,
+ { 24157251, 10, -9 } ,
+ { 232172358, 10, -10 } ,
+ { 209269679, 10, -10 } ,
+ { 168309251, 10, -10 } ,
+ { 621558626, 10, -10 } ,
+ { 237523579, 10, -9 } ,
+ { 322281722, 10, -10 } ,
+ { 233105452, 10, -10 } ,
+ { 302884934, 10, -10 } ,
+ { 268375534, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 929185091, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 298915619, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 638880908, 10, -11 } ,
+ { 116925705, 10, -10 } ,
+ { 174170506, 10, -10 } ,
+ { 633544475, 10, -10 } ,
+ { 276157577, 10, -10 } ,
+ { 133806383, 10, -10 } ,
+ { 627954666, 10, -10 } ,
+ { 172047941, 10, -10 } ,
+ { 217395927, 10, -9 } ,
+ { 15733418, 10, -9 } ,
+ { 120369539, 10, -10 } ,
+ { 125865975, 10, -10 } ,
+ { 140160277, 10, -10 } ,
+ { 157307562, 10, -10 } ,
+ { 386051993, 10, -10 } ,
+ { 237369782, 10, -10 } ,
+ { 875369654, 10, -10 } ,
+ { 978720354, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 276129227, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 948353356, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 237161571, 10, -10 } ,
+ { 124941807, 10, -10 } ,
+ { 178570506, 10, -10 } ,
+ { 125387121, 10, -9 } ,
+ { 410491814, 10, -10 } ,
+ { 68099301, 10, -10 } ,
+ { 765357665, 10, -10 } ,
+ { 186186761, 10, -10 } ,
+ { 290449395, 10, -9 } ,
+ { 215165697, 10, -10 } ,
+ { 118314161, 10, -10 } ,
+ { 144801388, 10, -10 } ,
+ { 140233658, 10, -10 } ,
+ { 234913738, 10, -10 } ,
+ { 291566022, 10, -10 } ,
+ { 334351582, 10, -10 } ,
+ { 770501498, 10, -10 } ,
+ { 597037063, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 226316403, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 167109947, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 861586638, 10, -11 } ,
+ { 222140424, 10, -10 } ,
+ { 401868467, 10, -10 } ,
+ { 117174383, 10, -10 } ,
+ { 798695427, 10, -10 } ,
+ { 774765283, 10, -11 } ,
+ { 241399438, 10, -10 } ,
+ { 273077468, 10, -10 } ,
+ { 488813533, 10, -10 } ,
+ { 18325079, 10, -9 } ,
+ { 237817015, 10, -10 } ,
+ { 214191498, 10, -10 } ,
+ { 206674005, 10, -10 } ,
+ { 203058194, 10, -10 } ,
+ { 135421973, 10, -9 } ,
+ { 268920674, 10, -9 } ,
+ { 592068329, 10, -10 } ,
+ { 343448839, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 109281132, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 644479047, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 869183592, 10, -11 } ,
+ { 135548155, 10, -10 } ,
+ { 196257078, 10, -10 } ,
+ { 529260225, 10, -10 } ,
+ { 352756255, 10, -10 } ,
+ { 635988147, 10, -11 } ,
+ { 159082671, 10, -9 } ,
+ { 423712329, 10, -10 } ,
+ { 212148498, 10, -9 } ,
+ { 396186944, 10, -10 } ,
+ { 124723874, 10, -10 } ,
+ { 15521052, 10, -9 } ,
+ { 157513265, 10, -10 } ,
+ { 185704758, 10, -10 } ,
+ { 280460531, 10, -10 } ,
+ { 317481833, 10, -10 } ,
+ { 158635363, 10, -9 } ,
+ { 471470581, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 171250108, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 917941468, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 203074754, 10, -10 } ,
+ { 156673822, 10, -10 } ,
+ { 206290511, 10, -10 } ,
+ { 577839787, 10, -10 } ,
+ { 926646531, 10, -10 } ,
+ { 678048028, 10, -11 } ,
+ { 117312157, 10, -9 } ,
+ { 208518583, 10, -10 } ,
+ { 149897962, 10, -9 } ,
+ { 196115921, 10, -10 } ,
+ { 145951979, 10, -10 } ,
+ { 557617925, 10, -10 } ,
+ { 154159664, 10, -10 } ,
+ { 166281036, 10, -10 } ,
+ { 37839221, 10, -9 } ,
+ { 337629283, 10, -10 } ,
+ { 160314634, 10, -9 } ,
+ { 485957133, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 177556942, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 502147261, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 688742734, 10, -11 } ,
+ { 100715551, 10, -10 } ,
+ { 150058922, 10, -10 } ,
+ { 143114297, 10, -9 } ,
+ { 161415366, 10, -10 } ,
+ { 632170761, 10, -11 } ,
+ { 951472415, 10, -10 } ,
+ { 152930879, 10, -10 } ,
+ { 273835537, 10, -9 } ,
+ { 698424712, 10, -10 } ,
+ { 956016412, 10, -11 } ,
+ { 116838231, 10, -10 } ,
+ { 129004042, 10, -10 } ,
+ { 142060415, 10, -10 } ,
+ { 214292656, 10, -10 } ,
+ { 228877031, 10, -10 } ,
+ { 515921535, 10, -10 } ,
+ { 907165489, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 254763647, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 388558643, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 677290258, 10, -10 } ,
+ { 165825272, 10, -10 } ,
+ { 241531359, 10, -10 } ,
+ { 125540035, 10, -10 } ,
+ { 556273732, 10, -10 } ,
+ { 726690111, 10, -11 } ,
+ { 524739051, 10, -10 } ,
+ { 233879044, 10, -10 } ,
+ { 353820367, 10, -10 } ,
+ { 988092546, 10, -11 } ,
+ { 162226818, 10, -10 } ,
+ { 200456717, 10, -10 } ,
+ { 171488161, 10, -10 } ,
+ { 170015533, 10, -10 } ,
+ { 748632202, 10, -10 } ,
+ { 907261705, 10, -10 } ,
+ { 437589872, 10, -10 } ,
+ { 361296514, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 275920502, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 542169101, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 336587569, 10, -10 } ,
+ { 132512753, 10, -10 } ,
+ { 178407895, 10, -10 } ,
+ { 124184765, 10, -9 } ,
+ { 188943476, 10, -10 } ,
+ { 682647252, 10, -11 } ,
+ { 134699989, 10, -9 } ,
+ { 180372913, 10, -10 } ,
+ { 222434946, 10, -9 } ,
+ { 268305362, 10, -10 } ,
+ { 126745556, 10, -10 } ,
+ { 146816764, 10, -10 } ,
+ { 138562558, 10, -10 } ,
+ { 157594266, 10, -10 } ,
+ { 441439826, 10, -10 } ,
+ { 511759563, 10, -10 } ,
+ { 101562268, 10, -9 } ,
+ { 601660311, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 237002469, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 468376173, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 810433708, 10, -11 } ,
+ { 150452747, 10, -10 } ,
+ { 301852741, 10, -10 } ,
+ { 629587254, 10, -10 } ,
+ { 117890319, 10, -9 } ,
+ { 627160437, 10, -11 } ,
+ { 172836329, 10, -9 } ,
+ { 186613302, 10, -10 } ,
+ { 161455142, 10, -9 } ,
+ { 262759529, 10, -10 } ,
+ { 135815013, 10, -10 } ,
+ { 148194607, 10, -10 } ,
+ { 143458029, 10, -10 } ,
+ { 151828348, 10, -10 } ,
+ { 278158032, 10, -10 } ,
+ { 300352892, 10, -10 } ,
+ { 155434371, 10, -9 } ,
+ { 469395111, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 171207309, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 532499116, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 370136212, 10, -11 } ,
+ { 248103056, 10, -10 } ,
+ { 14886055, 10, -8 } ,
+ { 211292574, 10, -10 } ,
+ { 191124532, 10, -10 } ,
+ { 110573166, 10, -10 } ,
+ { 11211082, 10, -9 } ,
+ { 382798789, 10, -10 } ,
+ { 408156991, 10, -10 } ,
+ { 89878358, 10, -10 } ,
+ { 20129265, 10, -9 } ,
+ { 159240994, 10, -10 } ,
+ { 466214282, 10, -9 } ,
+ { 300386696, 10, -10 } ,
+ { 337037917, 10, -10 } ,
+ { 52433255, 10, -9 } ,
+ { 165304847, 10, -10 } ,
+ { 31980049, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 983416644, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 28784064, 10, -8 } ,
+ { 0, 10, 0 } ,
+ { 842371073, 10, -11 } ,
+ { 213498044, 10, -10 } ,
+ { 285454515, 10, -10 } ,
+ { 119311466, 10, -10 } ,
+ { 111699358, 10, -9 } ,
+ { 845619225, 10, -11 } ,
+ { 280966326, 10, -10 } ,
+ { 27353614, 10, -9 } ,
+ { 289471494, 10, -10 } ,
+ { 883669215, 10, -11 } ,
+ { 223603919, 10, -10 } ,
+ { 212464243, 10, -10 } ,
+ { 200971524, 10, -10 } ,
+ { 279393576, 10, -10 } ,
+ { 245756208, 10, -9 } ,
+ { 396691974, 10, -10 } ,
+ { 411929282, 10, -10 } ,
+ { 354936624, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 272772182, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 809362258, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 931807104, 10, -11 } ,
+ { 167074327, 10, -10 } ,
+ { 297327699, 10, -10 } ,
+ { 607524451, 10, -10 } ,
+ { 340129192, 10, -10 } ,
+ { 785289737, 10, -11 } ,
+ { 147065439, 10, -9 } ,
+ { 220066525, 10, -10 } ,
+ { 157525597, 10, -9 } ,
+ { 206503714, 10, -10 } ,
+ { 157900464, 10, -10 } ,
+ { 177575297, 10, -10 } ,
+ { 168649277, 10, -10 } ,
+ { 179608751, 10, -10 } ,
+ { 429973494, 10, -10 } ,
+ { 955828482, 10, -10 } ,
+ { 131215929, 10, -9 } ,
+ { 554921369, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 369400078, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 141989963, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 879115799, 10, -11 } ,
+ { 212707027, 10, -10 } ,
+ { 258292101, 10, -10 } ,
+ { 271732886, 10, -10 } ,
+ { 232456275, 10, -9 } ,
+ { 792928621, 10, -11 } ,
+ { 588456915, 10, -10 } ,
+ { 258216143, 10, -10 } ,
+ { 61654873, 10, -9 } ,
+ { 173644605, 10, -10 } ,
+ { 215214244, 10, -10 } ,
+ { 586187844, 10, -10 } ,
+ { 18716428, 10, -9 } ,
+ { 190395099, 10, -10 } ,
+ { 759075243, 10, -10 } ,
+ { 487186763, 10, -10 } ,
+ { 11269974, 10, -8 } ,
+ { 428688931, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 132592013, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 453818167, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 826188057, 10, -11 } ,
+ { 1662583, 10, -8 } ,
+ { 353313126, 10, -10 } ,
+ { 596225113, 10, -10 } ,
+ { 203514156, 10, -10 } ,
+ { 11052454, 10, -9 } ,
+ { 135330496, 10, -9 } ,
+ { 239555808, 10, -10 } ,
+ { 128255171, 10, -9 } ,
+ { 606191893, 10, -10 } ,
+ { 155459033, 10, -10 } ,
+ { 16675846, 10, -9 } ,
+ { 456757586, 10, -10 } ,
+ { 203451267, 10, -10 } ,
+ { 321502439, 10, -10 } ,
+ { 581369968, 10, -10 } ,
+ { 11374046, 10, -8 } ,
+ { 271551723, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 943992843, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 117293343, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 89796754, 10, -10 } ,
+ { 166043642, 10, -10 } ,
+ { 227878798, 10, -10 } ,
+ { 265791906, 10, -10 } ,
+ { 365167521, 10, -10 } ,
+ { 645442047, 10, -11 } ,
+ { 883015516, 10, -10 } ,
+ { 221387151, 10, -10 } ,
+ { 659951075, 10, -10 } ,
+ { 148994327, 10, -10 } ,
+ { 167331269, 10, -10 } ,
+ { 178534307, 10, -10 } ,
+ { 164411363, 10, -10 } ,
+ { 224517385, 10, -10 } ,
+ { 124711873, 10, -9 } ,
+ { 651774535, 10, -10 } ,
+ { 277942631, 10, -9 } ,
+ { 34449301, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 132461859, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 787123668, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 932770191, 10, -11 } ,
+ { 190030999, 10, -10 } ,
+ { 261844901, 10, -10 } ,
+ { 939065809, 10, -10 } ,
+ { 417170378, 10, -10 } ,
+ { 100573089, 10, -10 } ,
+ { 682407598, 10, -10 } ,
+ { 253595197, 10, -10 } ,
+ { 198347823, 10, -9 } ,
+ { 454775753, 10, -10 } ,
+ { 30743301, 10, -9 } ,
+ { 189891439, 10, -10 } ,
+ { 291169904, 10, -10 } ,
+ { 218164516, 10, -10 } ,
+ { 580791179, 10, -10 } ,
+ { 533436176, 10, -10 } ,
+ { 749475231, 10, -10 } ,
+ { 265355113, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 410584331, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 627626284, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 845687316, 10, -11 } ,
+ { 250654304, 10, -10 } ,
+ { 305418526, 10, -10 } ,
+ { 353255126, 10, -10 } ,
+ { 155940026, 10, -9 } ,
+ { 107226614, 10, -10 } ,
+ { 536558568, 10, -10 } ,
+ { 30298977, 10, -9 } ,
+ { 723639465, 10, -10 } ,
+ { 13374127, 10, -9 } ,
+ { 434389792, 10, -10 } ,
+ { 363823357, 10, -10 } ,
+ { 321283969, 10, -10 } ,
+ { 32945286, 10, -9 } ,
+ { 971661868, 10, -10 } ,
+ { 121429313, 10, -9 } ,
+ { 450009705, 10, -10 } ,
+ { 590683351, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 420264541, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 875499356, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 249450085, 10, -10 } ,
+ { 207579851, 10, -10 } ,
+ { 247447495, 10, -10 } ,
+ { 772007782, 10, -10 } ,
+ { 195622845, 10, -9 } ,
+ { 903860133, 10, -11 } ,
+ { 519823376, 10, -10 } ,
+ { 259082186, 10, -10 } ,
+ { 182483754, 10, -9 } ,
+ { 179325519, 10, -10 } ,
+ { 292609429, 10, -10 } ,
+ { 199210789, 10, -10 } ,
+ { 188885957, 10, -10 } ,
+ { 325533864, 10, -10 } ,
+ { 405158773, 10, -10 } ,
+ { 353501663, 10, -10 } ,
+ { 427878582, 10, -10 } ,
+ { 209698708, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 208361406, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 81023738, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 995636507, 10, -11 } ,
+ { 374355846, 10, -10 } ,
+ { 415889305, 10, -10 } ,
+ { 232018716, 10, -10 } ,
+ { 945455314, 10, -10 } ,
+ { 153801072, 10, -10 } ,
+ { 428354206, 10, -10 } ,
+ { 403816011, 10, -10 } ,
+ { 61700549, 10, -9 } ,
+ { 469665525, 10, -10 } ,
+ { 109109639, 10, -9 } ,
+ { 963476791, 10, -10 } ,
+ { 357596045, 10, -10 } ,
+ { 437573361, 10, -10 } ,
+ { 878610961, 10, -10 } ,
+ { 571006382, 10, -10 } ,
+ { 450347187, 10, -10 } ,
+ { 692907471, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 413825864, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 548772585, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 863563903, 10, -11 } ,
+ { 264075933, 10, -10 } ,
+ { 301951615, 10, -10 } ,
+ { 794953646, 10, -10 } ,
+ { 523415056, 10, -10 } ,
+ { 25895084, 10, -9 } ,
+ { 555181526, 10, -10 } ,
+ { 294360001, 10, -10 } ,
+ { 117512632, 10, -9 } ,
+ { 212743253, 10, -10 } ,
+ { 870231993, 10, -10 } ,
+ { 206438621, 10, -10 } ,
+ { 230704893, 10, -10 } ,
+ { 326479576, 10, -10 } ,
+ { 58767462, 10, -9 } ,
+ { 445092952, 10, -10 } ,
+ { 718555335, 10, -10 } ,
+ { 246896566, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 115538652, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 95443967, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 819241333, 10, -11 } ,
+ { 284172591, 10, -10 } ,
+ { 412708844, 10, -10 } ,
+ { 206932117, 10, -10 } ,
+ { 203440602, 10, -9 } ,
+ { 122764696, 10, -10 } ,
+ { 264058084, 10, -10 } ,
+ { 600603144, 10, -10 } ,
+ { 643817218, 10, -10 } ,
+ { 3013838, 10, -8 } ,
+ { 401242387, 10, -10 } ,
+ { 443156603, 10, -10 } ,
+ { 737085999, 10, -10 } ,
+ { 804556337, 10, -10 } ,
+ { 648969052, 10, -10 } ,
+ { 465006386, 10, -10 } ,
+ { 49091918, 10, -9 } ,
+ { 531674125, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 186769874, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 702297703, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 63864632, 10, -10 } ,
+ { 649478032, 10, -10 } ,
+ { 524264241, 10, -10 } ,
+ { 263402928, 10, -10 } ,
+ { 18883427, 10, -8 } ,
+ { 105923991, 10, -10 } ,
+ { 162096513, 10, -10 } ,
+ { 523058412, 10, -10 } ,
+ { 331006061, 10, -10 } ,
+ { 904825727, 10, -11 } ,
+ { 348600049, 10, -10 } ,
+ { 170861288, 10, -9 } ,
+ { 460316263, 10, -10 } ,
+ { 889000991, 10, -10 } ,
+ { 919409733, 10, -10 } ,
+ { 335917458, 10, -10 } ,
+ { 269223383, 10, -10 } ,
+ { 405493524, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 124582174, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 102878322, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 873383302, 10, -11 } ,
+ { 217225573, 10, -10 } ,
+ { 308324483, 10, -10 } ,
+ { 4934614, 10, -8 } ,
+ { 376139774, 10, -10 } ,
+ { 122035165, 10, -10 } ,
+ { 583511529, 10, -10 } ,
+ { 371655136, 10, -10 } ,
+ { 997024128, 10, -10 } ,
+ { 157115476, 10, -10 } ,
+ { 290954548, 10, -10 } ,
+ { 157739587, 10, -9 } ,
+ { 32764144, 10, -9 } ,
+ { 234097214, 10, -10 } ,
+ { 601782826, 10, -10 } ,
+ { 665655617, 10, -10 } ,
+ { 789690333, 10, -10 } ,
+ { 721833528, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 839993595, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 118118121, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 108038857, 10, -10 } ,
+ { 235259286, 10, -10 } ,
+ { 322972114, 10, -10 } ,
+ { 469814606, 10, -10 } ,
+ { 834315523, 10, -10 } ,
+ { 107390784, 10, -10 } ,
+ { 848389372, 10, -10 } ,
+ { 367352813, 10, -10 } ,
+ { 106948137, 10, -9 } ,
+ { 191976539, 10, -10 } ,
+ { 229203365, 10, -10 } ,
+ { 373994336, 10, -10 } ,
+ { 285542857, 10, -10 } ,
+ { 340049575, 10, -10 } ,
+ { 842549149, 10, -10 } ,
+ { 49889583, 10, -9 } ,
+ { 112974786, 10, -9 } ,
+ { 63770888, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 357321341, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 770063694, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 963609815, 10, -11 } ,
+ { 592850378, 10, -10 } ,
+ { 509044829, 10, -10 } ,
+ { 709769097, 10, -10 } ,
+ { 100125996, 10, -9 } ,
+ { 112673606, 10, -10 } ,
+ { 785832223, 10, -10 } ,
+ { 360999504, 10, -10 } ,
+ { 838159689, 10, -10 } ,
+ { 253494419, 10, -10 } ,
+ { 398299623, 10, -10 } ,
+ { 356620403, 10, -10 } ,
+ { 302374535, 10, -10 } ,
+ { 31330105, 10, -9 } ,
+ { 822237596, 10, -10 } ,
+ { 516707361, 10, -10 } ,
+ { 840543137, 10, -10 } ,
+ { 630020129, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 234274602, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 399311635, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 700036583, 10, -11 } ,
+ { 156551217, 10, -9 } ,
+ { 663639197, 10, -10 } ,
+ { 15973473, 10, -9 } ,
+ { 452183879, 10, -10 } ,
+ { 181699133, 10, -10 } ,
+ { 658795214, 10, -10 } ,
+ { 324789214, 10, -10 } ,
+ { 941469382, 10, -10 } ,
+ { 26600902, 10, -9 } ,
+ { 142957929, 10, -9 } ,
+ { 526347685, 10, -10 } ,
+ { 326171459, 10, -10 } ,
+ { 250000722, 10, -10 } ,
+ { 602029271, 10, -10 } ,
+ { 490877723, 10, -10 } ,
+ { 5808101, 10, -8 } ,
+ { 377421393, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 12970601, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 615588591, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 688980103, 10, -11 } ,
+ { 993777358, 10, -10 } ,
+ { 3514122, 10, -8 } ,
+ { 218081211, 10, -10 } ,
+ { 15837724, 10, -8 } ,
+ { 909478705, 10, -11 } ,
+ { 242186277, 10, -10 } ,
+ { 358576822, 10, -10 } ,
+ { 706339539, 10, -10 } ,
+ { 11036233, 10, -9 } ,
+ { 291167416, 10, -10 } ,
+ { 149383843, 10, -9 } ,
+ { 316051325, 10, -10 } ,
+ { 267497936, 10, -10 } ,
+ { 587993043, 10, -10 } ,
+ { 34763248, 10, -9 } ,
+ { 56059589, 10, -9 } ,
+ { 835825853, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 207548261, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 84555073, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 845712612, 10, -11 } ,
+ { 709077402, 10, -10 } ,
+ { 386517033, 10, -10 } ,
+ { 41358786, 10, -9 } ,
+ { 147052687, 10, -9 } ,
+ { 126086541, 10, -10 } ,
+ { 425447413, 10, -10 } ,
+ { 335932813, 10, -10 } ,
+ { 580829899, 10, -10 } ,
+ { 283711632, 10, -10 } ,
+ { 904361176, 10, -10 } ,
+ { 461378269, 10, -10 } ,
+ { 341282271, 10, -10 } ,
+ { 256442992, 10, -10 } ,
+ { 972947147, 10, -10 } ,
+ { 747590437, 10, -10 } ,
+ { 410777355, 10, -10 } ,
+ { 543114095, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 305392348, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 681761127, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 869534854, 10, -11 } ,
+ { 206029268, 10, -10 } ,
+ { 267437095, 10, -10 } ,
+ { 954948155, 10, -10 } ,
+ { 905185627, 10, -10 } ,
+ { 999702588, 10, -11 } ,
+ { 834661613, 10, -10 } ,
+ { 258077973, 10, -10 } ,
+ { 105869698, 10, -9 } ,
+ { 169772214, 10, -10 } ,
+ { 206796146, 10, -10 } ,
+ { 828068176, 10, -10 } ,
+ { 245575008, 10, -10 } ,
+ { 203470463, 10, -10 } ,
+ { 903673649, 10, -10 } ,
+ { 598823053, 10, -10 } ,
+ { 68412671, 10, -9 } ,
+ { 275525433, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 458713398, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 76796074, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 989507477, 10, -11 } ,
+ { 242129072, 10, -10 } ,
+ { 363128663, 10, -10 } ,
+ { 654570175, 10, -10 } ,
+ { 758209589, 10, -10 } ,
+ { 117209582, 10, -10 } ,
+ { 802880209, 10, -10 } ,
+ { 338548839, 10, -10 } ,
+ { 123031009, 10, -9 } ,
+ { 280403791, 10, -10 } ,
+ { 358848414, 10, -10 } ,
+ { 282415128, 10, -10 } ,
+ { 377494326, 10, -10 } ,
+ { 43689719, 10, -9 } ,
+ { 63747989, 10, -9 } ,
+ { 730902237, 10, -10 } ,
+ { 859959532, 10, -10 } ,
+ { 699684667, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 394663205, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 383986496, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 526023391, 10, -10 } ,
+ { 372243315, 10, -10 } ,
+ { 422315063, 10, -10 } ,
+ { 18721268, 10, -8 } ,
+ { 218318129, 10, -10 } ,
+ { 266052717, 10, -10 } ,
+ { 83729054, 10, -9 } ,
+ { 210375495, 10, -10 } ,
+ { 103597878, 10, -9 } ,
+ { 162332772, 10, -10 } ,
+ { 175801838, 10, -10 } ,
+ { 158771309, 10, -10 } ,
+ { 170839935, 10, -10 } ,
+ { 177859263, 10, -10 } ,
+ { 605989075, 10, -10 } ,
+ { 563908638, 10, -10 } ,
+ { 84322066, 10, -9 } ,
+ { 140315944, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 482927266, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 857406209, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 224932609, 10, -10 } ,
+ { 210212225, 10, -10 } ,
+ { 380025934, 10, -10 } ,
+ { 3547043, 10, -8 } ,
+ { 426823409, 10, -10 } ,
+ { 144126143, 10, -10 } ,
+ { 675185466, 10, -10 } ,
+ { 390576473, 10, -10 } ,
+ { 107397742, 10, -9 } ,
+ { 307770315, 10, -10 } ,
+ { 205127408, 10, -10 } ,
+ { 365643127, 10, -10 } ,
+ { 44906807, 10, -9 } ,
+ { 302101931, 10, -10 } ,
+ { 620434566, 10, -10 } ,
+ { 559788132, 10, -10 } ,
+ { 819106823, 10, -10 } ,
+ { 324840959, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 119225732, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 775103898, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 18952567, 10, -9 } ,
+ { 126976767, 10, -10 } ,
+ { 17672127, 10, -9 } ,
+ { 116718769, 10, -9 } ,
+ { 339768466, 10, -10 } ,
+ { 667085091, 10, -11 } ,
+ { 124046461, 10, -9 } ,
+ { 178141643, 10, -10 } ,
+ { 213118879, 10, -9 } ,
+ { 213694161, 10, -10 } ,
+ { 117384793, 10, -10 } ,
+ { 147303732, 10, -10 } ,
+ { 136280472, 10, -10 } ,
+ { 154873381, 10, -10 } ,
+ { 284874102, 10, -10 } ,
+ { 344603897, 10, -10 } ,
+ { 128557811, 10, -9 } ,
+ { 239325663, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 239926138, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 447887764, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 850057957, 10, -11 } ,
+ { 182000089, 10, -10 } ,
+ { 527455375, 10, -10 } ,
+ { 460447954, 10, -10 } ,
+ { 195136523, 10, -10 } ,
+ { 776412189, 10, -11 } ,
+ { 105511322, 10, -9 } ,
+ { 347565293, 10, -10 } ,
+ { 251888105, 10, -9 } ,
+ { 388042742, 10, -10 } ,
+ { 158135932, 10, -10 } ,
+ { 170771115, 10, -10 } ,
+ { 430019461, 10, -10 } ,
+ { 216303457, 10, -10 } ,
+ { 341385272, 10, -10 } ,
+ { 834170783, 10, -10 } ,
+ { 105868747, 10, -9 } ,
+ { 498094091, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 169948958, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 822881267, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 963933856, 10, -11 } ,
+ { 331036797, 10, -10 } ,
+ { 254418557, 10, -10 } ,
+ { 244522667, 10, -10 } ,
+ { 252682085, 10, -10 } ,
+ { 821878605, 10, -11 } ,
+ { 144858389, 10, -9 } ,
+ { 242035178, 10, -10 } ,
+ { 146030435, 10, -9 } ,
+ { 51990153, 10, -9 } ,
+ { 185485996, 10, -10 } ,
+ { 193192776, 10, -10 } ,
+ { 190245617, 10, -10 } ,
+ { 195806648, 10, -10 } ,
+ { 698761524, 10, -10 } ,
+ { 93740337, 10, -9 } ,
+ { 121383489, 10, -9 } ,
+ { 499370555, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 321675752, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 889692638, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 219418166, 10, -10 } ,
+ { 16977821, 10, -9 } ,
+ { 213438452, 10, -10 } ,
+ { 450010219, 10, -10 } ,
+ { 318586932, 10, -10 } ,
+ { 674345107, 10, -11 } ,
+ { 17803841, 10, -8 } ,
+ { 210885806, 10, -10 } ,
+ { 845784353, 10, -10 } ,
+ { 176968544, 10, -10 } ,
+ { 301500665, 10, -10 } ,
+ { 299089689, 10, -10 } ,
+ { 156619814, 10, -10 } ,
+ { 165703756, 10, -10 } ,
+ { 653934419, 10, -10 } ,
+ { 697107107, 10, -10 } ,
+ { 188543445, 10, -9 } ,
+ { 409656664, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 158253602, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 844600323, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 864636458, 10, -11 } ,
+ { 137310275, 10, -10 } ,
+ { 217097575, 10, -10 } ,
+ { 634901115, 10, -10 } ,
+ { 197426071, 10, -10 } ,
+ { 678452194, 10, -11 } ,
+ { 137370339, 10, -9 } ,
+ { 20684299, 10, -9 } ,
+ { 243537695, 10, -9 } ,
+ { 224820427, 10, -10 } ,
+ { 124042576, 10, -10 } ,
+ { 155945231, 10, -10 } ,
+ { 432817744, 10, -10 } ,
+ { 17676484, 10, -9 } ,
+ { 294725333, 10, -10 } ,
+ { 353213888, 10, -10 } ,
+ { 142768226, 10, -9 } ,
+ { 493118025, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 179566707, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 110226833, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 170312709, 10, -10 } ,
+ { 223675963, 10, -10 } ,
+ { 424631306, 10, -10 } ,
+ { 137585409, 10, -10 } ,
+ { 274663115, 10, -10 } ,
+ { 102127392, 10, -10 } ,
+ { 457440649, 10, -10 } ,
+ { 351916125, 10, -10 } ,
+ { 909773281, 10, -10 } ,
+ { 142716509, 10, -10 } ,
+ { 221089275, 10, -10 } ,
+ { 200965948, 10, -10 } ,
+ { 191737494, 10, -9 } ,
+ { 279674306, 10, -10 } ,
+ { 883697376, 10, -10 } ,
+ { 103862118, 10, -9 } ,
+ { 101666132, 10, -9 } ,
+ { 14141079, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 12964501, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 370520143, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 707880302, 10, -11 } ,
+ { 952136071, 10, -11 } ,
+ { 14432869, 10, -9 } ,
+ { 506201841, 10, -10 } ,
+ { 135825923, 10, -10 } ,
+ { 538363909, 10, -11 } ,
+ { 872863881, 10, -10 } ,
+ { 153068843, 10, -10 } ,
+ { 43114469, 10, -8 } ,
+ { 105540347, 10, -9 } ,
+ { 901697854, 10, -11 } ,
+ { 11599677, 10, -9 } ,
+ { 131056077, 10, -10 } ,
+ { 1435768, 10, -8 } ,
+ { 197675288, 10, -10 } ,
+ { 237236506, 10, -10 } ,
+ { 742467529, 10, -10 } ,
+ { 451681455, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 145032976, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 922650515, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 8460038, 10, -9 } ,
+ { 166805175, 10, -10 } ,
+ { 223148536, 10, -10 } ,
+ { 77200332, 10, -9 } ,
+ { 230835797, 10, -10 } ,
+ { 681903293, 10, -11 } ,
+ { 851087327, 10, -10 } ,
+ { 219955611, 10, -10 } ,
+ { 736710051, 10, -10 } ,
+ { 355039342, 10, -10 } ,
+ { 179101517, 10, -10 } ,
+ { 177786297, 10, -10 } ,
+ { 165911261, 10, -10 } ,
+ { 174234379, 10, -10 } ,
+ { 468452352, 10, -10 } ,
+ { 244452791, 10, -9 } ,
+ { 144390883, 10, -9 } ,
+ { 44195878, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 169783134, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 17270701, 10, -8 } ,
+ { 0, 10, 0 } ,
+ { 953884894, 10, -11 } ,
+ { 19008654, 10, -9 } ,
+ { 258254222, 10, -10 } ,
+ { 615864909, 10, -10 } ,
+ { 753694381, 10, -10 } ,
+ { 79009225, 10, -10 } ,
+ { 598901281, 10, -10 } ,
+ { 254337044, 10, -10 } ,
+ { 127284497, 10, -9 } ,
+ { 20132914, 10, -9 } ,
+ { 196250554, 10, -10 } ,
+ { 20812842, 10, -9 } ,
+ { 189083516, 10, -10 } ,
+ { 197925582, 10, -10 } ,
+ { 626100067, 10, -10 } ,
+ { 148423901, 10, -9 } ,
+ { 770189159, 10, -10 } ,
+ { 492291309, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 17457472, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 132837522, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 519854851, 10, -11 } ,
+ { 182023883, 10, -10 } ,
+ { 186863815, 10, -10 } ,
+ { 746280747, 10, -11 } ,
+ { 562585923, 10, -9 } ,
+ { 608031437, 10, -11 } ,
+ { 938179963, 10, -11 } ,
+ { 196458175, 10, -10 } ,
+ { 165087272, 10, -10 } ,
+ { 547377854, 10, -11 } ,
+ { 199422357, 10, -10 } ,
+ { 388551301, 10, -10 } ,
+ { 136818038, 10, -10 } ,
+ { 135485852, 10, -10 } ,
+ { 784368922, 10, -10 } ,
+ { 222156441, 10, -10 } ,
+ { 152535022, 10, -10 } ,
+ { 292266743, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 67074614, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 126693159, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 170876107, 10, -10 } ,
+ { 23451555, 10, -9 } ,
+ { 285848496, 10, -10 } ,
+ { 116283943, 10, -10 } ,
+ { 163388638, 10, -9 } ,
+ { 809982504, 10, -11 } ,
+ { 199527748, 10, -10 } ,
+ { 275458071, 10, -10 } ,
+ { 579738839, 10, -10 } ,
+ { 100618847, 10, -10 } ,
+ { 260906252, 10, -10 } ,
+ { 215050099, 10, -10 } ,
+ { 204272073, 10, -10 } ,
+ { 204679639, 10, -10 } ,
+ { 187890417, 10, -9 } ,
+ { 206030937, 10, -9 } ,
+ { 303812514, 10, -10 } ,
+ { 35876244, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 106996218, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 730982369, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 172835711, 10, -10 } ,
+ { 123602314, 10, -10 } ,
+ { 181894203, 10, -10 } ,
+ { 595858997, 10, -10 } ,
+ { 187731839, 10, -10 } ,
+ { 845738263, 10, -11 } ,
+ { 153697334, 10, -9 } ,
+ { 190494384, 10, -10 } ,
+ { 136635042, 10, -9 } ,
+ { 125405603, 10, -9 } ,
+ { 121154569, 10, -10 } ,
+ { 216062402, 10, -10 } ,
+ { 160501822, 10, -10 } ,
+ { 162757547, 10, -10 } ,
+ { 280099006, 10, -10 } ,
+ { 351965056, 10, -10 } ,
+ { 113368865, 10, -9 } ,
+ { 609917078, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 719025941, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 313884373, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 741057529, 10, -11 } ,
+ { 108397039, 10, -10 } ,
+ { 146571433, 10, -10 } ,
+ { 168397873, 10, -9 } ,
+ { 145542501, 10, -10 } ,
+ { 608801436, 10, -11 } ,
+ { 166015154, 10, -9 } ,
+ { 149271339, 10, -10 } ,
+ { 219607236, 10, -9 } ,
+ { 253478787, 10, -10 } ,
+ { 983238283, 10, -11 } ,
+ { 19476054, 10, -9 } ,
+ { 113845078, 10, -10 } ,
+ { 134124266, 10, -10 } ,
+ { 21365314, 10, -9 } ,
+ { 304888094, 10, -10 } ,
+ { 135392859, 10, -9 } ,
+ { 59564317, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 248955156, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 570365499, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 259054574, 10, -10 } ,
+ { 130705152, 10, -10 } ,
+ { 183468541, 10, -10 } ,
+ { 227874728, 10, -10 } ,
+ { 259587117, 10, -10 } ,
+ { 576728761, 10, -11 } ,
+ { 114906954, 10, -9 } ,
+ { 186286692, 10, -10 } ,
+ { 252795853, 10, -9 } ,
+ { 32692735, 10, -9 } ,
+ { 125590291, 10, -10 } ,
+ { 153600173, 10, -10 } ,
+ { 145466134, 10, -10 } ,
+ { 159653642, 10, -10 } ,
+ { 356973572, 10, -10 } ,
+ { 698173806, 10, -10 } ,
+ { 192137988, 10, -9 } ,
+ { 414713528, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 139266996, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 313961632, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 705290302, 10, -11 } ,
+ { 109888753, 10, -10 } ,
+ { 159566122, 10, -10 } ,
+ { 208344654, 10, -10 } ,
+ { 147980635, 10, -10 } ,
+ { 57046724, 10, -10 } ,
+ { 168138507, 10, -9 } ,
+ { 172420092, 10, -10 } ,
+ { 201565919, 10, -9 } ,
+ { 212572448, 10, -9 } ,
+ { 112290394, 10, -10 } ,
+ { 125811686, 10, -10 } ,
+ { 152125014, 10, -10 } ,
+ { 149809328, 10, -10 } ,
+ { 247132249, 10, -10 } ,
+ { 774514307, 10, -10 } ,
+ { 895356451, 10, -10 } ,
+ { 390686658, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 121633918, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 190267055, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 145089381, 10, -10 } ,
+ { 709021186, 10, -11 } ,
+ { 117269755, 10, -10 } ,
+ { 974390201, 10, -10 } ,
+ { 132439102, 10, -10 } ,
+ { 652612244, 10, -11 } ,
+ { 404356947, 10, -10 } ,
+ { 110797501, 10, -10 } ,
+ { 168931582, 10, -9 } ,
+ { 109256919, 10, -10 } ,
+ { 706761165, 10, -11 } ,
+ { 809273311, 10, -11 } ,
+ { 101495356, 10, -10 } ,
+ { 10682736, 10, -9 } ,
+ { 149806634, 10, -10 } ,
+ { 150620771, 10, -10 } ,
+ { 351399858, 10, -10 } ,
+ { 376754321, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 104153065, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 284491042, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 701554362, 10, -11 } ,
+ { 420124764, 10, -10 } ,
+ { 16794166, 10, -9 } ,
+ { 833412309, 10, -10 } ,
+ { 141463754, 10, -10 } ,
+ { 576659823, 10, -11 } ,
+ { 1192066, 10, -7 } ,
+ { 156451674, 10, -10 } ,
+ { 387871277, 10, -9 } ,
+ { 646569569, 10, -10 } ,
+ { 107560679, 10, -10 } ,
+ { 11991648, 10, -9 } ,
+ { 129889736, 10, -10 } ,
+ { 143719666, 10, -10 } ,
+ { 203775614, 10, -10 } ,
+ { 23877503, 10, -9 } ,
+ { 579916173, 10, -10 } ,
+ { 49240717, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 171713789, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 969245945, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 235540132, 10, -10 } ,
+ { 198426905, 10, -9 } ,
+ { 654776057, 10, -10 } ,
+ { 868694928, 10, -11 } ,
+ { 283779054, 10, -9 } ,
+ { 834998585, 10, -11 } ,
+ { 121862761, 10, -10 } ,
+ { 26691894, 10, -9 } ,
+ { 203591, 10, -7 } ,
+ { 648963379, 10, -11 } ,
+ { 301933163, 10, -10 } ,
+ { 191553753, 10, -10 } ,
+ { 21068795, 10, -9 } ,
+ { 182867205, 10, -10 } ,
+ { 103721521, 10, -9 } ,
+ { 440064946, 10, -10 } ,
+ { 185610506, 10, -10 } ,
+ { 30059546, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 824180589, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 26391883, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 281201179, 10, -11 } ,
+ { 126988884, 10, -9 } ,
+ { 570974993, 10, -9 } ,
+ { 678805808, 10, -11 } ,
+ { 172672527, 10, -10 } ,
+ { 937901914, 10, -11 } ,
+ { 985450028, 10, -11 } ,
+ { 327647739, 10, -10 } ,
+ { 500581397, 10, -10 } ,
+ { 596470039, 10, -11 } ,
+ { 206018187, 10, -10 } ,
+ { 162068028, 10, -10 } ,
+ { 345719689, 10, -10 } ,
+ { 216784854, 10, -10 } ,
+ { 312034975, 10, -10 } ,
+ { 203737931, 10, -10 } ,
+ { 14214102, 10, -9 } ,
+ { 232226561, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 747394905, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 351851123, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 693289511, 10, -11 } ,
+ { 178226017, 10, -10 } ,
+ { 340290199, 10, -10 } ,
+ { 192312381, 10, -10 } ,
+ { 184721698, 10, -10 } ,
+ { 902255581, 10, -11 } ,
+ { 939003773, 10, -10 } ,
+ { 315636521, 10, -10 } ,
+ { 242423242, 10, -9 } ,
+ { 291846982, 10, -10 } ,
+ { 276693419, 10, -10 } ,
+ { 157858256, 10, -10 } ,
+ { 151831679, 10, -9 } ,
+ { 590248666, 10, -10 } ,
+ { 302161985, 10, -10 } ,
+ { 406191215, 10, -10 } ,
+ { 104744093, 10, -9 } ,
+ { 418954121, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 133105924, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 28526482, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 675253362, 10, -11 } ,
+ { 116982176, 10, -10 } ,
+ { 153994887, 10, -10 } ,
+ { 190543845, 10, -10 } ,
+ { 127634535, 10, -10 } ,
+ { 492627354, 10, -11 } ,
+ { 409506742, 10, -9 } ,
+ { 153235037, 10, -10 } ,
+ { 13134465, 10, -8 } ,
+ { 304979714, 10, -10 } ,
+ { 266972282, 10, -10 } ,
+ { 116072211, 10, -10 } ,
+ { 403246314, 10, -10 } ,
+ { 12603739, 10, -9 } ,
+ { 198013276, 10, -10 } ,
+ { 254631357, 10, -10 } ,
+ { 122160085, 10, -9 } ,
+ { 312127908, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 11225809, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 639525303, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 720407369, 10, -11 } ,
+ { 448893787, 10, -10 } ,
+ { 553757831, 10, -10 } ,
+ { 974136245, 10, -11 } ,
+ { 300499622, 10, -10 } ,
+ { 961843476, 10, -11 } ,
+ { 170873966, 10, -10 } ,
+ { 651950613, 10, -10 } ,
+ { 278881433, 10, -10 } ,
+ { 93185288, 10, -10 } ,
+ { 456351064, 10, -10 } ,
+ { 213964042, 10, -10 } ,
+ { 961022284, 10, -10 } ,
+ { 27096822, 10, -9 } ,
+ { 205477479, 10, -9 } ,
+ { 254881713, 10, -9 } ,
+ { 268542977, 10, -10 } ,
+ { 323225065, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 106194656, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 575785978, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 440373424, 10, -11 } ,
+ { 952703384, 10, -10 } ,
+ { 206243759, 10, -9 } ,
+ { 972580191, 10, -11 } ,
+ { 664536119, 10, -10 } ,
+ { 115791342, 10, -10 } ,
+ { 203419113, 10, -10 } ,
+ { 223999651, 10, -9 } ,
+ { 241226457, 10, -10 } ,
+ { 821125256, 10, -11 } ,
+ { 271511999, 10, -10 } ,
+ { 213682277, 10, -10 } ,
+ { 764995066, 10, -10 } ,
+ { 482917431, 10, -10 } ,
+ { 509916601, 10, -10 } ,
+ { 282245055, 10, -10 } ,
+ { 19656967, 10, -9 } ,
+ { 338747633, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 218556982, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 282885515, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 482224581, 10, -11 } ,
+ { 159210337, 10, -10 } ,
+ { 280908509, 10, -10 } ,
+ { 537161451, 10, -10 } ,
+ { 284313487, 10, -10 } ,
+ { 39557397, 10, -9 } ,
+ { 291440222, 10, -10 } ,
+ { 137332545, 10, -9 } ,
+ { 621445487, 10, -10 } ,
+ { 23547641, 10, -9 } ,
+ { 255297013, 10, -10 } ,
+ { 141562295, 10, -10 } ,
+ { 243843327, 10, -10 } ,
+ { 130597405, 10, -9 } ,
+ { 282173526, 10, -10 } ,
+ { 223313692, 10, -10 } ,
+ { 234337752, 10, -10 } ,
+ { 11799637, 10, -8 } ,
+ { 0, 10, 0 } ,
+ { 155567674, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 384864865, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 387518846, 10, -11 } ,
+ { 162479871, 10, -10 } ,
+ { 155574763, 10, -10 } ,
+ { 651337362, 10, -11 } ,
+ { 712148222, 10, -9 } ,
+ { 527771923, 10, -11 } ,
+ { 204323506, 10, -10 } ,
+ { 470071619, 10, -10 } ,
+ { 138763538, 10, -10 } ,
+ { 460581645, 10, -11 } ,
+ { 1831109, 10, -8 } ,
+ { 120694474, 10, -10 } ,
+ { 118893978, 10, -10 } ,
+ { 128917109, 10, -10 } ,
+ { 303881214, 10, -10 } ,
+ { 16550754, 10, -9 } ,
+ { 119393439, 10, -10 } ,
+ { 26539012, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 558106358, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 331078382, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 77950251, 10, -10 } ,
+ { 108403054, 10, -10 } ,
+ { 143338712, 10, -10 } ,
+ { 54544928, 10, -9 } ,
+ { 284960173, 10, -10 } ,
+ { 502444055, 10, -11 } ,
+ { 237290414, 10, -9 } ,
+ { 149537232, 10, -10 } ,
+ { 24529484, 10, -8 } ,
+ { 215305607, 10, -10 } ,
+ { 956531139, 10, -11 } ,
+ { 12535923, 10, -9 } ,
+ { 113821412, 10, -10 } ,
+ { 130201887, 10, -10 } ,
+ { 208933223, 10, -10 } ,
+ { 275589267, 10, -10 } ,
+ { 164533339, 10, -9 } ,
+ { 418927966, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 153909268, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 395527768, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 402936448, 10, -11 } ,
+ { 17079349, 10, -9 } ,
+ { 154066688, 10, -10 } ,
+ { 641687282, 10, -11 } ,
+ { 708995878, 10, -9 } ,
+ { 545751878, 10, -11 } ,
+ { 721729202, 10, -11 } ,
+ { 168359523, 10, -10 } ,
+ { 128844642, 10, -10 } ,
+ { 443452921, 10, -11 } ,
+ { 333019354, 10, -10 } ,
+ { 122455849, 10, -10 } ,
+ { 115945244, 10, -10 } ,
+ { 116442954, 10, -10 } ,
+ { 498368908, 10, -10 } ,
+ { 321038769, 10, -10 } ,
+ { 11092915, 10, -9 } ,
+ { 266316797, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 559749432, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 390998052, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 534907894, 10, -11 } ,
+ { 333195395, 10, -10 } ,
+ { 288284386, 10, -10 } ,
+ { 766912508, 10, -11 } ,
+ { 690298608, 10, -10 } ,
+ { 108264079, 10, -10 } ,
+ { 998470938, 10, -11 } ,
+ { 266997788, 10, -10 } ,
+ { 167285093, 10, -10 } ,
+ { 601936058, 10, -11 } ,
+ { 349016827, 10, -9 } ,
+ { 16078009, 10, -9 } ,
+ { 207419192, 10, -10 } ,
+ { 207300771, 10, -10 } ,
+ { 287576409, 10, -9 } ,
+ { 490468452, 10, -10 } ,
+ { 150930562, 10, -10 } ,
+ { 224729386, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 833486638, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 485150568, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 416815834, 10, -11 } ,
+ { 163071365, 10, -10 } ,
+ { 149907956, 10, -10 } ,
+ { 69816007, 10, -10 } ,
+ { 694977777, 10, -9 } ,
+ { 525713748, 10, -11 } ,
+ { 355323482, 10, -10 } ,
+ { 164911043, 10, -10 } ,
+ { 156965591, 10, -10 } ,
+ { 496352602, 10, -11 } ,
+ { 183836442, 10, -10 } ,
+ { 122294064, 10, -10 } ,
+ { 112982666, 10, -10 } ,
+ { 113588316, 10, -10 } ,
+ { 483167467, 10, -10 } ,
+ { 176645715, 10, -10 } ,
+ { 140259811, 10, -10 } ,
+ { 27075158, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 577700772, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 660115047, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 730879651, 10, -11 } ,
+ { 201520181, 10, -10 } ,
+ { 247641729, 10, -10 } ,
+ { 124359779, 10, -10 } ,
+ { 272135489, 10, -10 } ,
+ { 695087419, 10, -11 } ,
+ { 177368481, 10, -9 } ,
+ { 229658864, 10, -10 } ,
+ { 411277805, 10, -10 } ,
+ { 15635298, 10, -9 } ,
+ { 21423146, 10, -9 } ,
+ { 413725367, 10, -10 } ,
+ { 174299917, 10, -10 } ,
+ { 170840622, 10, -10 } ,
+ { 375959812, 10, -9 } ,
+ { 406188492, 10, -10 } ,
+ { 608086052, 10, -10 } ,
+ { 279996692, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 998722727, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 398252423, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 79476113, 10, -10 } ,
+ { 144474647, 10, -10 } ,
+ { 19498236, 10, -9 } ,
+ { 22493043, 10, -9 } ,
+ { 385279483, 10, -10 } ,
+ { 629549274, 10, -11 } ,
+ { 940311396, 10, -10 } ,
+ { 194609209, 10, -10 } ,
+ { 34561557, 10, -8 } ,
+ { 514742142, 10, -10 } ,
+ { 146228243, 10, -10 } ,
+ { 148997799, 10, -10 } ,
+ { 156940143, 10, -10 } ,
+ { 167909892, 10, -10 } ,
+ { 123155571, 10, -9 } ,
+ { 323086683, 10, -10 } ,
+ { 806158035, 10, -10 } ,
+ { 416914087, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 130255027, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 263475188, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 673778568, 10, -11 } ,
+ { 944055358, 10, -11 } ,
+ { 128518502, 10, -10 } ,
+ { 141249863, 10, -9 } ,
+ { 125294318, 10, -10 } ,
+ { 53544866, 10, -10 } ,
+ { 183374563, 10, -9 } ,
+ { 133841084, 10, -10 } ,
+ { 356916017, 10, -9 } ,
+ { 21421745, 10, -9 } ,
+ { 842201913, 10, -11 } ,
+ { 107890594, 10, -10 } ,
+ { 104179607, 10, -10 } ,
+ { 125252547, 10, -10 } ,
+ { 179469224, 10, -10 } ,
+ { 222531925, 10, -10 } ,
+ { 562932937, 10, -10 } ,
+ { 529016942, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 204080174, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 249599794, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 615277365, 10, -11 } ,
+ { 908229752, 10, -11 } ,
+ { 108967791, 10, -10 } ,
+ { 981436084, 10, -10 } ,
+ { 108668783, 10, -10 } ,
+ { 419691357, 10, -11 } ,
+ { 477520959, 10, -9 } ,
+ { 1166323, 10, -8 } ,
+ { 738471988, 10, -10 } ,
+ { 341638759, 10, -10 } ,
+ { 769442881, 10, -11 } ,
+ { 993897759, 10, -11 } ,
+ { 858505211, 10, -11 } ,
+ { 962977926, 10, -11 } ,
+ { 164035667, 10, -10 } ,
+ { 223124956, 10, -10 } ,
+ { 100032111, 10, -9 } ,
+ { 360845376, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 147351361, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 831365868, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 693390004, 10, -11 } ,
+ { 131923219, 10, -10 } ,
+ { 170961273, 10, -10 } ,
+ { 25852507, 10, -8 } ,
+ { 198339817, 10, -10 } ,
+ { 795567299, 10, -11 } ,
+ { 105562221, 10, -9 } ,
+ { 17005086, 10, -9 } ,
+ { 138391651, 10, -9 } ,
+ { 426074341, 10, -10 } ,
+ { 281103958, 10, -10 } ,
+ { 13127284, 10, -9 } ,
+ { 13037029, 10, -9 } ,
+ { 14858387, 10, -9 } ,
+ { 289439678, 10, -10 } ,
+ { 541401192, 10, -10 } ,
+ { 521329569, 10, -10 } ,
+ { 73761913, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 397565836, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 257770491, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 934362192, 10, -11 } ,
+ { 196659859, 10, -10 } ,
+ { 286951221, 10, -10 } ,
+ { 332439504, 10, -10 } ,
+ { 605539967, 10, -10 } ,
+ { 793067928, 10, -11 } ,
+ { 874418633, 10, -10 } ,
+ { 271292821, 10, -10 } ,
+ { 512463735, 10, -10 } ,
+ { 128606798, 10, -10 } ,
+ { 196799248, 10, -10 } ,
+ { 216305598, 10, -10 } ,
+ { 396971107, 10, -10 } ,
+ { 202466341, 10, -10 } ,
+ { 809289457, 10, -10 } ,
+ { 136842443, 10, -9 } ,
+ { 727664458, 10, -10 } ,
+ { 39422397, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 135440536, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 6912437, 10, -8 } ,
+ { 0, 10, 0 } ,
+ { 596050362, 10, -11 } ,
+ { 295051725, 10, -10 } ,
+ { 259891781, 10, -10 } ,
+ { 934440719, 10, -11 } ,
+ { 324434481, 10, -9 } ,
+ { 965248242, 10, -11 } ,
+ { 263927092, 10, -10 } ,
+ { 258165709, 10, -10 } ,
+ { 227952916, 10, -10 } ,
+ { 732601291, 10, -11 } ,
+ { 180177725, 10, -9 } ,
+ { 170617077, 10, -10 } ,
+ { 19111878, 10, -9 } ,
+ { 193253934, 10, -10 } ,
+ { 105393607, 10, -9 } ,
+ { 692877822, 10, -10 } ,
+ { 348843886, 10, -10 } ,
+ { 303768701, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 883054655, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 295763488, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 662025611, 10, -11 } ,
+ { 135820678, 10, -10 } ,
+ { 141051513, 10, -10 } ,
+ { 175825776, 10, -10 } ,
+ { 50372681, 10, -9 } ,
+ { 513097131, 10, -11 } ,
+ { 399483723, 10, -9 } ,
+ { 148019298, 10, -10 } ,
+ { 716453627, 10, -10 } ,
+ { 358793887, 10, -10 } ,
+ { 653178444, 10, -10 } ,
+ { 116130725, 10, -10 } ,
+ { 110905974, 10, -10 } ,
+ { 118757852, 10, -10 } ,
+ { 217740458, 10, -10 } ,
+ { 259931863, 10, -10 } ,
+ { 141075707, 10, -9 } ,
+ { 290617049, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 106925505, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 116736915, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 579852557, 10, -10 } ,
+ { 141924581, 10, -10 } ,
+ { 197403767, 10, -10 } ,
+ { 200169286, 10, -10 } ,
+ { 22759913, 10, -9 } ,
+ { 596552057, 10, -11 } ,
+ { 171819262, 10, -9 } ,
+ { 265754392, 10, -10 } ,
+ { 139599596, 10, -9 } ,
+ { 188855993, 10, -10 } ,
+ { 131362158, 10, -10 } ,
+ { 167354145, 10, -10 } ,
+ { 149193718, 10, -10 } ,
+ { 162402765, 10, -10 } ,
+ { 516495866, 10, -10 } ,
+ { 403283542, 10, -10 } ,
+ { 178468895, 10, -9 } ,
+ { 381059719, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 132439648, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 246177573, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 848651592, 10, -11 } ,
+ { 263293449, 10, -10 } ,
+ { 81277277, 10, -9 } ,
+ { 110477696, 10, -10 } ,
+ { 842773775, 10, -10 } ,
+ { 942319167, 10, -11 } ,
+ { 314939102, 10, -10 } ,
+ { 323706152, 10, -10 } ,
+ { 319248413, 10, -10 } ,
+ { 992294119, 10, -11 } ,
+ { 24209425, 10, -9 } ,
+ { 228935966, 10, -10 } ,
+ { 628216518, 10, -10 } ,
+ { 23493531, 10, -9 } ,
+ { 20495524, 10, -8 } ,
+ { 466366896, 10, -10 } ,
+ { 526630599, 10, -10 } ,
+ { 343734681, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 110479955, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 824788704, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 732017958, 10, -11 } ,
+ { 242934111, 10, -10 } ,
+ { 325313361, 10, -10 } ,
+ { 582626297, 10, -10 } ,
+ { 183641416, 10, -9 } ,
+ { 117100578, 10, -10 } ,
+ { 260484941, 10, -10 } ,
+ { 364038043, 10, -10 } ,
+ { 356793093, 10, -10 } ,
+ { 105877077, 10, -10 } ,
+ { 380747438, 10, -10 } ,
+ { 202728379, 10, -10 } ,
+ { 472847977, 10, -10 } ,
+ { 872162432, 10, -10 } ,
+ { 950683495, 10, -10 } ,
+ { 124968637, 10, -9 } ,
+ { 293349147, 10, -10 } ,
+ { 58905999, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 546882448, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 62580618, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 790511178, 10, -11 } ,
+ { 117836983, 10, -10 } ,
+ { 161404226, 10, -10 } ,
+ { 127906333, 10, -9 } ,
+ { 172030786, 10, -10 } ,
+ { 63289156, 10, -10 } ,
+ { 178382571, 10, -9 } ,
+ { 165634363, 10, -10 } ,
+ { 234634225, 10, -9 } ,
+ { 393525986, 10, -10 } ,
+ { 107370266, 10, -10 } ,
+ { 134402814, 10, -10 } ,
+ { 12841042, 10, -9 } ,
+ { 145898163, 10, -10 } ,
+ { 314714856, 10, -10 } ,
+ { 276621355, 10, -10 } ,
+ { 955945125, 10, -10 } ,
+ { 56981154, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 225074442, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 688995197, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 389559763, 10, -11 } ,
+ { 163655854, 10, -10 } ,
+ { 302824648, 10, -10 } ,
+ { 587709919, 10, -11 } ,
+ { 18403777, 10, -9 } ,
+ { 568286015, 10, -11 } ,
+ { 111720094, 10, -10 } ,
+ { 213632772, 10, -10 } ,
+ { 180471438, 10, -10 } ,
+ { 532030304, 10, -11 } ,
+ { 298275424, 10, -10 } ,
+ { 660196017, 10, -9 } ,
+ { 437323099, 10, -10 } ,
+ { 266537865, 10, -10 } ,
+ { 285060568, 10, -10 } ,
+ { 373925285, 10, -10 } ,
+ { 303305896, 10, -10 } ,
+ { 195732457, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 621949976, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 114589326, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 869637685, 10, -11 } ,
+ { 375987527, 10, -10 } ,
+ { 545942068, 10, -10 } ,
+ { 377203577, 10, -10 } ,
+ { 867964613, 10, -10 } ,
+ { 126555898, 10, -10 } ,
+ { 213058815, 10, -10 } ,
+ { 78953449, 10, -9 } ,
+ { 456098658, 10, -10 } ,
+ { 118377111, 10, -10 } ,
+ { 531619436, 10, -10 } ,
+ { 562500309, 10, -10 } ,
+ { 527397356, 10, -10 } ,
+ { 414188223, 10, -10 } ,
+ { 141110862, 10, -9 } ,
+ { 914208183, 10, -10 } ,
+ { 317402028, 10, -10 } ,
+ { 202460825, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 307690064, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 142434017, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 921723057, 10, -11 } ,
+ { 482250622, 10, -10 } ,
+ { 407809508, 10, -10 } ,
+ { 593487752, 10, -10 } ,
+ { 118640926, 10, -9 } ,
+ { 108330162, 10, -10 } ,
+ { 281976883, 10, -10 } ,
+ { 311162551, 10, -10 } ,
+ { 841148199, 10, -10 } ,
+ { 136067742, 10, -10 } ,
+ { 66298862, 10, -9 } ,
+ { 231242613, 10, -10 } ,
+ { 236835049, 10, -10 } ,
+ { 23640548, 10, -9 } ,
+ { 115253412, 10, -9 } ,
+ { 931347207, 10, -10 } ,
+ { 478115172, 10, -10 } ,
+ { 525059837, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 236192384, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 334035996, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 772232432, 10, -11 } ,
+ { 120426857, 10, -10 } ,
+ { 166964839, 10, -10 } ,
+ { 991884208, 10, -10 } ,
+ { 323484776, 10, -10 } ,
+ { 646869935, 10, -11 } ,
+ { 184292569, 10, -9 } ,
+ { 281846083, 10, -10 } ,
+ { 242343381, 10, -9 } ,
+ { 219354195, 10, -10 } ,
+ { 111206347, 10, -10 } ,
+ { 132499674, 10, -10 } ,
+ { 134815481, 10, -10 } ,
+ { 302335211, 10, -10 } ,
+ { 228736726, 10, -10 } ,
+ { 274610839, 10, -10 } ,
+ { 115890211, 10, -9 } ,
+ { 545723941, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 281056192, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 534318453, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 711993566, 10, -11 } ,
+ { 245797183, 10, -10 } ,
+ { 473555147, 10, -10 } ,
+ { 674072656, 10, -10 } ,
+ { 195275938, 10, -9 } ,
+ { 104767147, 10, -10 } ,
+ { 696113685, 10, -10 } ,
+ { 521328764, 10, -10 } ,
+ { 656247505, 10, -10 } ,
+ { 172334835, 10, -10 } ,
+ { 355701609, 10, -10 } ,
+ { 191684304, 10, -10 } ,
+ { 668259089, 10, -10 } ,
+ { 25858868, 10, -9 } ,
+ { 616623723, 10, -10 } ,
+ { 464626629, 10, -10 } ,
+ { 422560059, 10, -10 } ,
+ { 606965808, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 282751505, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 822525338, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 698899707, 10, -11 } ,
+ { 501544985, 10, -10 } ,
+ { 496045553, 10, -10 } ,
+ { 132235334, 10, -10 } ,
+ { 684378865, 10, -10 } ,
+ { 426505363, 10, -10 } ,
+ { 187781537, 10, -10 } ,
+ { 657971887, 10, -10 } ,
+ { 383283771, 10, -10 } ,
+ { 142374677, 10, -10 } ,
+ { 119169513, 10, -9 } ,
+ { 292506653, 10, -10 } ,
+ { 121142463, 10, -9 } ,
+ { 586845206, 10, -10 } ,
+ { 11183035, 10, -8 } ,
+ { 685775087, 10, -10 } ,
+ { 364942801, 10, -10 } ,
+ { 420413942, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 248793192, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 568737448, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 859301236, 10, -11 } ,
+ { 271642858, 10, -10 } ,
+ { 919353019, 10, -10 } ,
+ { 618508386, 10, -10 } ,
+ { 265835345, 10, -10 } ,
+ { 103453536, 10, -10 } ,
+ { 937955778, 10, -10 } ,
+ { 376998402, 10, -10 } ,
+ { 110989181, 10, -9 } ,
+ { 285389058, 10, -10 } ,
+ { 234158898, 10, -10 } ,
+ { 212058015, 10, -10 } ,
+ { 45768555, 10, -9 } ,
+ { 252136058, 10, -10 } ,
+ { 891832327, 10, -10 } ,
+ { 133046691, 10, -9 } ,
+ { 68539574, 10, -9 } ,
+ { 554382973, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 297639048, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 471711216, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 73356874, 10, -10 } ,
+ { 15364971, 10, -9 } ,
+ { 273328779, 10, -10 } ,
+ { 186370256, 10, -9 } ,
+ { 490933557, 10, -10 } ,
+ { 964636274, 10, -11 } ,
+ { 11198912, 10, -8 } ,
+ { 481983438, 10, -10 } ,
+ { 12346622, 10, -8 } ,
+ { 174695807, 10, -10 } ,
+ { 148570252, 10, -10 } ,
+ { 149419417, 10, -10 } ,
+ { 161866046, 10, -10 } ,
+ { 196263654, 10, -10 } ,
+ { 367466269, 10, -10 } ,
+ { 52170341, 10, -9 } ,
+ { 771782576, 10, -10 } ,
+ { 160885679, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 710307492, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 598584014, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 563850495, 10, -11 } ,
+ { 652120476, 10, -10 } ,
+ { 204582571, 10, -9 } ,
+ { 426632295, 10, -10 } ,
+ { 398735313, 10, -10 } ,
+ { 138253756, 10, -10 } ,
+ { 265482595, 10, -10 } ,
+ { 589838568, 10, -10 } ,
+ { 30140396, 10, -9 } ,
+ { 96512974, 10, -10 } ,
+ { 119537123, 10, -9 } ,
+ { 406344275, 10, -10 } ,
+ { 942005502, 10, -10 } ,
+ { 395418667, 10, -10 } ,
+ { 888524612, 10, -10 } ,
+ { 472340999, 10, -10 } ,
+ { 240956307, 10, -10 } ,
+ { 404649127, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 145991214, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 718614915, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 721430806, 10, -11 } ,
+ { 413143846, 10, -10 } ,
+ { 765119325, 10, -10 } ,
+ { 138999919, 10, -10 } ,
+ { 219411509, 10, -9 } ,
+ { 195425417, 10, -10 } ,
+ { 262472375, 10, -10 } ,
+ { 741762912, 10, -10 } ,
+ { 52225466, 10, -9 } ,
+ { 114811721, 10, -10 } ,
+ { 403771037, 10, -10 } ,
+ { 320163892, 10, -10 } ,
+ { 809951629, 10, -10 } ,
+ { 322952151, 10, -10 } ,
+ { 990618169, 10, -10 } ,
+ { 499341146, 10, -10 } ,
+ { 467762462, 10, -10 } ,
+ { 453273914, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 206023857, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 159881733, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 106710073, 10, -10 } ,
+ { 380841091, 10, -10 } ,
+ { 345578667, 10, -10 } ,
+ { 337367134, 10, -10 } ,
+ { 770672061, 10, -10 } ,
+ { 187118451, 10, -10 } ,
+ { 676630477, 10, -10 } ,
+ { 326227419, 10, -10 } ,
+ { 125540963, 10, -9 } ,
+ { 271312508, 10, -10 } ,
+ { 241158102, 10, -10 } ,
+ { 246951174, 10, -10 } ,
+ { 327849827, 10, -10 } ,
+ { 341252516, 10, -10 } ,
+ { 80213553, 10, -9 } ,
+ { 730290953, 10, -10 } ,
+ { 757648406, 10, -10 } ,
+ { 526771759, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 177648734, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 586564423, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 83834414, 10, -10 } ,
+ { 410263771, 10, -10 } ,
+ { 47355341, 10, -9 } ,
+ { 827021742, 10, -10 } ,
+ { 5227787, 10, -8 } ,
+ { 132838447, 10, -10 } ,
+ { 526713066, 10, -10 } ,
+ { 639916954, 10, -10 } ,
+ { 872708479, 10, -10 } ,
+ { 165127143, 10, -10 } ,
+ { 683668869, 10, -10 } ,
+ { 316978507, 10, -10 } ,
+ { 325110307, 10, -10 } ,
+ { 914554162, 10, -10 } ,
+ { 808910053, 10, -10 } ,
+ { 435353531, 10, -10 } ,
+ { 779221237, 10, -10 } ,
+ { 65671579, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 337368836, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 472146268, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 832499358, 10, -11 } ,
+ { 225725759, 10, -10 } ,
+ { 394623346, 10, -10 } ,
+ { 267539749, 10, -10 } ,
+ { 251513127, 10, -10 } ,
+ { 106206734, 10, -10 } ,
+ { 965211921, 10, -10 } ,
+ { 529285948, 10, -10 } ,
+ { 123246193, 10, -9 } ,
+ { 231817554, 10, -10 } ,
+ { 223731553, 10, -10 } ,
+ { 480102305, 10, -10 } ,
+ { 104915322, 10, -9 } ,
+ { 504435633, 10, -10 } ,
+ { 772966062, 10, -10 } ,
+ { 790556068, 10, -10 } ,
+ { 103904212, 10, -9 } ,
+ { 113121001, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 246382406, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 139281041, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 779265033, 10, -11 } ,
+ { 657134318, 10, -10 } ,
+ { 529232844, 10, -10 } ,
+ { 122003107, 10, -10 } ,
+ { 230686805, 10, -9 } ,
+ { 103597717, 10, -10 } ,
+ { 180727443, 10, -10 } ,
+ { 542515632, 10, -10 } ,
+ { 393403922, 10, -10 } ,
+ { 228911011, 10, -10 } ,
+ { 543377497, 10, -10 } ,
+ { 340505955, 10, -10 } ,
+ { 388242251, 10, -10 } ,
+ { 261434568, 10, -10 } ,
+ { 105459639, 10, -9 } ,
+ { 584005354, 10, -10 } ,
+ { 273743325, 10, -10 } ,
+ { 121876355, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 116380152, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 88959382, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 906288354, 10, -11 } ,
+ { 626877256, 10, -10 } ,
+ { 583545225, 10, -10 } ,
+ { 573738181, 10, -10 } ,
+ { 874915371, 10, -10 } ,
+ { 238432921, 10, -10 } ,
+ { 531968356, 10, -10 } ,
+ { 340558057, 10, -10 } ,
+ { 922432844, 10, -10 } ,
+ { 193596517, 10, -10 } ,
+ { 554770269, 10, -10 } ,
+ { 419322315, 10, -10 } ,
+ { 348812259, 10, -10 } ,
+ { 265294275, 10, -10 } ,
+ { 837422744, 10, -10 } ,
+ { 413195912, 10, -10 } ,
+ { 541481523, 10, -10 } ,
+ { 357329532, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 384071524, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 563126867, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 884871179, 10, -11 } ,
+ { 206339656, 10, -10 } ,
+ { 272258505, 10, -10 } ,
+ { 751790055, 10, -10 } ,
+ { 885242732, 10, -10 } ,
+ { 922484687, 10, -11 } ,
+ { 94251744, 10, -9 } ,
+ { 376954449, 10, -10 } ,
+ { 182121335, 10, -9 } ,
+ { 24787267, 10, -9 } ,
+ { 393665225, 10, -10 } ,
+ { 282090414, 10, -10 } ,
+ { 350467162, 10, -10 } ,
+ { 294091623, 10, -10 } ,
+ { 461356196, 10, -10 } ,
+ { 469740498, 10, -10 } ,
+ { 923619124, 10, -10 } ,
+ { 595661568, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 218640818, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 52273974, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 741997327, 10, -11 } ,
+ { 357029867, 10, -10 } ,
+ { 397440036, 10, -10 } ,
+ { 472853465, 10, -10 } ,
+ { 491996872, 10, -10 } ,
+ { 997372186, 10, -10 } ,
+ { 382468063, 10, -10 } ,
+ { 511387394, 10, -10 } ,
+ { 825051734, 10, -10 } ,
+ { 137378008, 10, -10 } ,
+ { 567538768, 10, -10 } ,
+ { 191181304, 10, -10 } ,
+ { 291450552, 10, -10 } ,
+ { 274749922, 10, -10 } ,
+ { 872950617, 10, -10 } ,
+ { 573928005, 10, -10 } ,
+ { 661513347, 10, -10 } ,
+ { 454147267, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 850007034, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 369027452, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 821398972, 10, -11 } ,
+ { 13095585, 10, -9 } ,
+ { 183310067, 10, -10 } ,
+ { 109524034, 10, -9 } ,
+ { 173606426, 10, -10 } ,
+ { 7063137, 10, -9 } ,
+ { 132425666, 10, -9 } ,
+ { 196539836, 10, -10 } ,
+ { 223060336, 10, -9 } ,
+ { 219030372, 10, -10 } ,
+ { 123886233, 10, -10 } ,
+ { 298950852, 10, -10 } ,
+ { 144546132, 10, -10 } ,
+ { 31695408, 10, -9 } ,
+ { 389862599, 10, -10 } ,
+ { 409756737, 10, -10 } ,
+ { 13595029, 10, -8 } ,
+ { 157405724, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 304181871, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 100699248, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 919926721, 10, -11 } ,
+ { 265364326, 10, -10 } ,
+ { 504327248, 10, -10 } ,
+ { 514272156, 10, -10 } ,
+ { 840231317, 10, -10 } ,
+ { 858350752, 10, -11 } ,
+ { 797342012, 10, -10 } ,
+ { 264417576, 10, -10 } ,
+ { 216464221, 10, -9 } ,
+ { 319309419, 10, -10 } ,
+ { 181984641, 10, -10 } ,
+ { 464967781, 10, -10 } ,
+ { 257044591, 10, -10 } ,
+ { 212339343, 10, -10 } ,
+ { 531191558, 10, -10 } ,
+ { 376491417, 10, -10 } ,
+ { 696827549, 10, -10 } ,
+ { 552074955, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 182616482, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 985199564, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 899174678, 10, -11 } ,
+ { 156764357, 10, -10 } ,
+ { 20904632, 10, -9 } ,
+ { 487151465, 10, -10 } ,
+ { 994335213, 10, -10 } ,
+ { 770870806, 10, -11 } ,
+ { 105217336, 10, -9 } ,
+ { 212994285, 10, -10 } ,
+ { 234792007, 10, -9 } ,
+ { 250641103, 10, -10 } ,
+ { 152221611, 10, -10 } ,
+ { 171055935, 10, -10 } ,
+ { 162542094, 10, -10 } ,
+ { 177472749, 10, -10 } ,
+ { 503959352, 10, -10 } ,
+ { 325350805, 10, -10 } ,
+ { 941073191, 10, -10 } ,
+ { 553751286, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 329490628, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 584749798, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 931725949, 10, -11 } ,
+ { 198357179, 10, -10 } ,
+ { 265937028, 10, -10 } ,
+ { 597962618, 10, -10 } ,
+ { 868825991, 10, -10 } ,
+ { 101015277, 10, -10 } ,
+ { 11211988, 10, -8 } ,
+ { 259411836, 10, -10 } ,
+ { 121216983, 10, -9 } ,
+ { 281596266, 10, -10 } ,
+ { 20158591, 10, -9 } ,
+ { 383552119, 10, -10 } ,
+ { 305036363, 10, -10 } ,
+ { 208961617, 10, -10 } ,
+ { 704448925, 10, -10 } ,
+ { 717512264, 10, -10 } ,
+ { 108298969, 10, -9 } ,
+ { 661745711, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 517683637, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 591155724, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 400011462, 10, -10 } ,
+ { 124467492, 10, -10 } ,
+ { 174500683, 10, -10 } ,
+ { 750937242, 10, -10 } ,
+ { 272501947, 10, -10 } ,
+ { 620578693, 10, -11 } ,
+ { 16559424, 10, -8 } ,
+ { 177285323, 10, -10 } ,
+ { 226547478, 10, -9 } ,
+ { 314467324, 10, -10 } ,
+ { 113407333, 10, -10 } ,
+ { 14367223, 10, -9 } ,
+ { 20057301, 10, -9 } ,
+ { 153543147, 10, -10 } ,
+ { 263665475, 10, -10 } ,
+ { 299952379, 10, -10 } ,
+ { 13113381, 10, -8 } ,
+ { 510135178, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 187950816, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 944780354, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 163452061, 10, -10 } ,
+ { 155520109, 10, -10 } ,
+ { 214103047, 10, -10 } ,
+ { 699720789, 10, -10 } ,
+ { 329246809, 10, -10 } ,
+ { 717864552, 10, -11 } ,
+ { 116568134, 10, -9 } ,
+ { 212738303, 10, -10 } ,
+ { 222545368, 10, -9 } ,
+ { 267653337, 10, -10 } ,
+ { 149172799, 10, -10 } ,
+ { 173284157, 10, -10 } ,
+ { 163422514, 10, -10 } ,
+ { 17844249, 10, -9 } ,
+ { 714846783, 10, -10 } ,
+ { 400801526, 10, -10 } ,
+ { 116863525, 10, -9 } ,
+ { 531483135, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 195079858, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 180432311, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 102568917, 10, -10 } ,
+ { 203625027, 10, -10 } ,
+ { 279702745, 10, -10 } ,
+ { 425528443, 10, -10 } ,
+ { 54443571, 10, -9 } ,
+ { 823297982, 10, -11 } ,
+ { 798863011, 10, -10 } ,
+ { 269826109, 10, -10 } ,
+ { 953341849, 10, -10 } ,
+ { 247466273, 10, -10 } ,
+ { 205680619, 10, -10 } ,
+ { 22087169, 10, -9 } ,
+ { 202600374, 10, -10 } ,
+ { 206446683, 10, -10 } ,
+ { 114540398, 10, -9 } ,
+ { 842119318, 10, -10 } ,
+ { 119050773, 10, -9 } ,
+ { 454691905, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 163601549, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 835279187, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 251663934, 10, -10 } ,
+ { 190488951, 10, -10 } ,
+ { 241267264, 10, -10 } ,
+ { 115678951, 10, -9 } ,
+ { 772294124, 10, -10 } ,
+ { 807933197, 10, -11 } ,
+ { 642606891, 10, -10 } ,
+ { 237255752, 10, -10 } ,
+ { 10526351, 10, -8 } ,
+ { 154267894, 10, -10 } ,
+ { 205545688, 10, -10 } ,
+ { 188901692, 10, -10 } ,
+ { 176009494, 10, -10 } ,
+ { 188805038, 10, -10 } ,
+ { 773451727, 10, -10 } ,
+ { 17306344, 10, -8 } ,
+ { 715619241, 10, -10 } ,
+ { 575073756, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 224050387, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 339290822, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 79583713, 10, -10 } ,
+ { 109321068, 10, -10 } ,
+ { 150178394, 10, -10 } ,
+ { 889924022, 10, -10 } ,
+ { 143465022, 10, -10 } ,
+ { 545389072, 10, -11 } ,
+ { 178444611, 10, -9 } ,
+ { 153806229, 10, -10 } ,
+ { 249639207, 10, -9 } ,
+ { 217957213, 10, -10 } ,
+ { 982704823, 10, -11 } ,
+ { 128042057, 10, -10 } ,
+ { 118006201, 10, -10 } ,
+ { 136491932, 10, -10 } ,
+ { 219616177, 10, -10 } ,
+ { 353102447, 10, -10 } ,
+ { 181322191, 10, -9 } ,
+ { 481945764, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 187136765, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 151754187, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 940785823, 10, -11 } ,
+ { 15640759, 10, -9 } ,
+ { 221115284, 10, -10 } ,
+ { 965668744, 10, -10 } ,
+ { 464866848, 10, -10 } ,
+ { 745350129, 10, -11 } ,
+ { 956863625, 10, -10 } ,
+ { 217589037, 10, -10 } ,
+ { 168460066, 10, -9 } ,
+ { 195555514, 10, -10 } ,
+ { 147764534, 10, -10 } ,
+ { 18127361, 10, -9 } ,
+ { 162990442, 10, -10 } ,
+ { 176840663, 10, -10 } ,
+ { 573929085, 10, -10 } ,
+ { 399143572, 10, -10 } ,
+ { 124134966, 10, -9 } ,
+ { 558533214, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 216952726, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 605681628, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 89125737, 10, -10 } ,
+ { 132132144, 10, -10 } ,
+ { 186334147, 10, -10 } ,
+ { 369195331, 10, -10 } ,
+ { 184386987, 10, -10 } ,
+ { 596340697, 10, -11 } ,
+ { 146976446, 10, -9 } ,
+ { 18921436, 10, -9 } ,
+ { 173995293, 10, -9 } ,
+ { 58247965, 10, -9 } ,
+ { 126374632, 10, -10 } ,
+ { 154380157, 10, -10 } ,
+ { 149485686, 10, -10 } ,
+ { 158985836, 10, -10 } ,
+ { 393344016, 10, -10 } ,
+ { 623760686, 10, -10 } ,
+ { 220353757, 10, -9 } ,
+ { 420564651, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 152760364, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 474893503, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 758688524, 10, -11 } ,
+ { 122244963, 10, -10 } ,
+ { 164417037, 10, -10 } ,
+ { 189129729, 10, -9 } ,
+ { 171005503, 10, -10 } ,
+ { 737691358, 10, -11 } ,
+ { 155732844, 10, -9 } ,
+ { 166131365, 10, -10 } ,
+ { 152085023, 10, -9 } ,
+ { 347599727, 10, -10 } ,
+ { 117128603, 10, -10 } ,
+ { 133194972, 10, -10 } ,
+ { 126868823, 10, -10 } ,
+ { 145615388, 10, -10 } ,
+ { 265584563, 10, -10 } ,
+ { 584833211, 10, -10 } ,
+ { 110744187, 10, -9 } ,
+ { 688236466, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 428507068, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 109551852, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 905594296, 10, -11 } ,
+ { 226273428, 10, -10 } ,
+ { 217413616, 10, -10 } ,
+ { 895973439, 10, -10 } ,
+ { 520824354, 10, -10 } ,
+ { 903051715, 10, -11 } ,
+ { 121456174, 10, -9 } ,
+ { 212955886, 10, -10 } ,
+ { 167445732, 10, -9 } ,
+ { 330870373, 10, -10 } ,
+ { 146630147, 10, -10 } ,
+ { 171336885, 10, -10 } ,
+ { 163944446, 10, -10 } ,
+ { 177473949, 10, -10 } ,
+ { 392652879, 10, -10 } ,
+ { 325884158, 10, -10 } ,
+ { 104256039, 10, -9 } ,
+ { 685985591, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 566846079, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 963027328, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 202087952, 10, -10 } ,
+ { 181346978, 10, -10 } ,
+ { 229371908, 10, -10 } ,
+ { 580817131, 10, -10 } ,
+ { 133196975, 10, -9 } ,
+ { 768209099, 10, -11 } ,
+ { 95661432, 10, -9 } ,
+ { 232996531, 10, -10 } ,
+ { 147701457, 10, -9 } ,
+ { 240535494, 10, -10 } ,
+ { 182053852, 10, -10 } ,
+ { 188789908, 10, -10 } ,
+ { 173692523, 10, -10 } ,
+ { 185801217, 10, -10 } ,
+ { 559890411, 10, -10 } ,
+ { 521483567, 10, -10 } ,
+ { 118545331, 10, -9 } ,
+ { 531892003, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 186605966, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 683257077, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 850200091, 10, -11 } ,
+ { 143083657, 10, -10 } ,
+ { 188523369, 10, -10 } ,
+ { 342100518, 10, -10 } ,
+ { 188547501, 10, -10 } ,
+ { 574473755, 10, -11 } ,
+ { 168284793, 10, -9 } ,
+ { 191728601, 10, -10 } ,
+ { 826384525, 10, -10 } ,
+ { 169263891, 10, -10 } ,
+ { 257292419, 10, -10 } ,
+ { 153765326, 10, -10 } ,
+ { 140676588, 10, -10 } ,
+ { 229533498, 10, -10 } ,
+ { 416908278, 10, -10 } ,
+ { 901468425, 10, -10 } ,
+ { 285298227, 10, -9 } ,
+ { 351940536, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 138843868, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 379665756, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 264137216, 10, -10 } ,
+ { 113244646, 10, -10 } ,
+ { 15411474, 10, -9 } ,
+ { 218769002, 10, -10 } ,
+ { 147157091, 10, -10 } ,
+ { 46724423, 10, -10 } ,
+ { 200981614, 10, -9 } ,
+ { 155504806, 10, -10 } ,
+ { 922386128, 10, -10 } ,
+ { 313569526, 10, -10 } ,
+ { 105806245, 10, -10 } ,
+ { 132905274, 10, -10 } ,
+ { 118216134, 10, -10 } ,
+ { 126990551, 10, -10 } ,
+ { 31229026, 10, -9 } ,
+ { 616551584, 10, -10 } ,
+ { 331609034, 10, -9 } ,
+ { 318825169, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 122811485, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 220466199, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 111775856, 10, -10 } ,
+ { 937507874, 10, -11 } ,
+ { 139618998, 10, -10 } ,
+ { 243129852, 10, -9 } ,
+ { 300647357, 10, -10 } ,
+ { 134368851, 10, -10 } ,
+ { 31331539, 10, -9 } ,
+ { 137100221, 10, -10 } ,
+ { 948695741, 10, -10 } ,
+ { 106363688, 10, -10 } ,
+ { 102670717, 10, -10 } ,
+ { 937131026, 10, -11 } ,
+ { 11043864, 10, -9 } ,
+ { 127807056, 10, -10 } ,
+ { 198971363, 10, -10 } ,
+ { 341895399, 10, -10 } ,
+ { 256177336, 10, -10 } ,
+ { 109077705, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 345303564, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 724848539, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 897277316, 10, -11 } ,
+ { 142397738, 10, -10 } ,
+ { 280223092, 10, -10 } ,
+ { 838346979, 10, -10 } ,
+ { 198974631, 10, -10 } ,
+ { 664887019, 10, -11 } ,
+ { 122773174, 10, -9 } ,
+ { 195375824, 10, -10 } ,
+ { 185352319, 10, -9 } ,
+ { 339186262, 10, -10 } ,
+ { 128248764, 10, -10 } ,
+ { 158206602, 10, -10 } ,
+ { 153545005, 10, -10 } ,
+ { 16471336, 10, -9 } ,
+ { 388424232, 10, -10 } ,
+ { 468409541, 10, -10 } ,
+ { 191727905, 10, -9 } ,
+ { 518522047, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 203175169, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 315013663, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 4059237, 10, -9 } ,
+ { 319579162, 10, -10 } ,
+ { 248245345, 10, -9 } ,
+ { 952224327, 10, -11 } ,
+ { 200650922, 10, -10 } ,
+ { 119296319, 10, -10 } ,
+ { 310361183, 10, -10 } ,
+ { 404417411, 10, -10 } ,
+ { 578392083, 10, -10 } ,
+ { 989314126, 10, -11 } ,
+ { 391707328, 10, -10 } ,
+ { 174932503, 10, -10 } ,
+ { 294489288, 10, -9 } ,
+ { 391710773, 10, -10 } ,
+ { 360627628, 10, -10 } ,
+ { 480902548, 10, -10 } ,
+ { 325554497, 10, -10 } ,
+ { 34572455, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 207441721, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 59002966, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 133734748, 10, -10 } ,
+ { 551457155, 10, -10 } ,
+ { 18776457, 10, -8 } ,
+ { 997504965, 10, -11 } ,
+ { 127650423, 10, -9 } ,
+ { 129094422, 10, -10 } ,
+ { 138581429, 10, -10 } ,
+ { 637621879, 10, -10 } ,
+ { 324560033, 10, -10 } ,
+ { 919185583, 10, -11 } ,
+ { 551158474, 10, -10 } ,
+ { 22262234, 10, -9 } ,
+ { 968867591, 10, -10 } ,
+ { 846336619, 10, -10 } ,
+ { 108978486, 10, -9 } ,
+ { 426174387, 10, -10 } ,
+ { 210953449, 10, -10 } ,
+ { 368634218, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 112553396, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 168690226, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 847740818, 10, -11 } ,
+ { 202111557, 10, -10 } ,
+ { 319823545, 10, -10 } ,
+ { 941894548, 10, -10 } ,
+ { 166195129, 10, -9 } ,
+ { 873039456, 10, -11 } ,
+ { 459563361, 10, -10 } ,
+ { 263630385, 10, -10 } ,
+ { 526520364, 10, -10 } ,
+ { 512044294, 10, -10 } ,
+ { 206586617, 10, -10 } ,
+ { 198155839, 10, -10 } ,
+ { 198173184, 10, -10 } ,
+ { 268086964, 10, -10 } ,
+ { 915682172, 10, -10 } ,
+ { 498016117, 10, -10 } ,
+ { 662255532, 10, -10 } ,
+ { 540126686, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 198304064, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 466079878, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 516824629, 10, -11 } ,
+ { 271271603, 10, -10 } ,
+ { 110620211, 10, -9 } ,
+ { 107334544, 10, -10 } ,
+ { 386766925, 10, -10 } ,
+ { 121369524, 10, -10 } ,
+ { 33744965, 10, -9 } ,
+ { 71348119, 10, -9 } ,
+ { 399598238, 10, -10 } ,
+ { 216403248, 10, -10 } ,
+ { 35827761, 10, -9 } ,
+ { 187579441, 10, -10 } ,
+ { 133038744, 10, -9 } ,
+ { 230818237, 10, -9 } ,
+ { 41448278, 10, -9 } ,
+ { 733808641, 10, -10 } ,
+ { 511842609, 10, -10 } ,
+ { 359748502, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 116804878, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 302812396, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 508688773, 10, -11 } ,
+ { 139254418, 10, -10 } ,
+ { 25083531, 10, -9 } ,
+ { 160173351, 10, -10 } ,
+ { 162173277, 10, -10 } ,
+ { 951908971, 10, -11 } ,
+ { 760989346, 10, -10 } ,
+ { 485295888, 10, -10 } ,
+ { 426973159, 10, -10 } ,
+ { 199427128, 10, -10 } ,
+ { 159945808, 10, -10 } ,
+ { 131106807, 10, -10 } ,
+ { 233474923, 10, -10 } ,
+ { 340919706, 10, -9 } ,
+ { 262846582, 10, -10 } ,
+ { 24718796, 10, -9 } ,
+ { 172954096, 10, -9 } ,
+ { 401905125, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 639956107, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 321601226, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 364306934, 10, -11 } ,
+ { 825235611, 10, -10 } ,
+ { 212394439, 10, -9 } ,
+ { 981655827, 10, -11 } ,
+ { 224695348, 10, -10 } ,
+ { 115305256, 10, -10 } ,
+ { 112399421, 10, -10 } ,
+ { 214530979, 10, -9 } ,
+ { 223447125, 10, -10 } ,
+ { 745669643, 10, -11 } ,
+ { 248156889, 10, -10 } ,
+ { 371724753, 10, -10 } ,
+ { 380779095, 10, -10 } ,
+ { 180471958, 10, -9 } ,
+ { 369352617, 10, -10 } ,
+ { 252263893, 10, -10 } ,
+ { 166047703, 10, -10 } ,
+ { 33217369, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 306433402, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 274395641, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 678362655, 10, -11 } ,
+ { 940726075, 10, -11 } ,
+ { 116631988, 10, -10 } ,
+ { 196323809, 10, -10 } ,
+ { 111163551, 10, -10 } ,
+ { 393631339, 10, -11 } ,
+ { 431792677, 10, -9 } ,
+ { 124682023, 10, -10 } ,
+ { 174022203, 10, -9 } ,
+ { 183615315, 10, -10 } ,
+ { 78588587, 10, -10 } ,
+ { 107553236, 10, -10 } ,
+ { 924735175, 10, -11 } ,
+ { 104108348, 10, -10 } ,
+ { 171974234, 10, -10 } ,
+ { 24289841, 10, -9 } ,
+ { 133971463, 10, -9 } ,
+ { 305012437, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 110027972, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 661333412, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 416404065, 10, -11 } ,
+ { 152381201, 10, -10 } ,
+ { 207744923, 10, -10 } ,
+ { 738863221, 10, -11 } ,
+ { 183736003, 10, -10 } ,
+ { 545709995, 10, -11 } ,
+ { 206304992, 10, -10 } ,
+ { 315503203, 10, -10 } ,
+ { 338019772, 10, -10 } ,
+ { 584999878, 10, -11 } ,
+ { 114498919, 10, -10 } ,
+ { 677391445, 10, -9 } ,
+ { 137877497, 10, -10 } ,
+ { 195521459, 10, -10 } ,
+ { 330948008, 10, -10 } ,
+ { 27208368, 10, -9 } ,
+ { 367747681, 10, -10 } ,
+ { 225041634, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 166124856, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 334066103, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 767531833, 10, -11 } ,
+ { 10258428, 10, -9 } ,
+ { 137432759, 10, -10 } ,
+ { 203633019, 10, -10 } ,
+ { 12894651, 10, -9 } ,
+ { 440902943, 10, -11 } ,
+ { 281132375, 10, -9 } ,
+ { 142657799, 10, -10 } ,
+ { 169666455, 10, -9 } ,
+ { 298515666, 10, -10 } ,
+ { 89242538, 10, -10 } ,
+ { 121989191, 10, -10 } ,
+ { 108572043, 10, -10 } ,
+ { 120094914, 10, -10 } ,
+ { 201455062, 10, -10 } ,
+ { 28196711, 10, -9 } ,
+ { 24908352, 10, -8 } ,
+ { 32977256, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 121690771, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 627638263, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 656818479, 10, -11 } ,
+ { 325931903, 10, -10 } ,
+ { 588863415, 10, -10 } ,
+ { 123001913, 10, -10 } ,
+ { 527867714, 10, -10 } ,
+ { 388450398, 10, -10 } ,
+ { 286788505, 10, -10 } ,
+ { 116117287, 10, -9 } ,
+ { 343759289, 10, -10 } ,
+ { 117120892, 10, -10 } ,
+ { 803917198, 10, -10 } ,
+ { 238466909, 10, -10 } ,
+ { 168544817, 10, -9 } ,
+ { 101411654, 10, -9 } ,
+ { 844782868, 10, -10 } ,
+ { 507998087, 10, -10 } ,
+ { 384401914, 10, -10 } ,
+ { 4374826, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 148306631, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 41631797, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 643911313, 10, -11 } ,
+ { 233530786, 10, -10 } ,
+ { 486010745, 10, -10 } ,
+ { 306065891, 10, -10 } ,
+ { 274452002, 10, -10 } ,
+ { 640383982, 10, -10 } ,
+ { 177404346, 10, -10 } ,
+ { 458418506, 10, -10 } ,
+ { 336877623, 10, -10 } ,
+ { 214608478, 10, -10 } ,
+ { 316151749, 10, -10 } ,
+ { 303853783, 10, -10 } ,
+ { 921550753, 10, -10 } ,
+ { 264418792, 10, -10 } ,
+ { 171924128, 10, -9 } ,
+ { 409481636, 10, -10 } ,
+ { 244021968, 10, -10 } ,
+ { 86148596, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 223117311, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 274469117, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 101669367, 10, -10 } ,
+ { 231048049, 10, -10 } ,
+ { 328729374, 10, -10 } ,
+ { 150560145, 10, -10 } ,
+ { 675522928, 10, -10 } ,
+ { 923679695, 10, -11 } ,
+ { 429238647, 10, -10 } ,
+ { 3229533, 10, -8 } ,
+ { 791861051, 10, -10 } ,
+ { 131914262, 10, -10 } ,
+ { 225894387, 10, -10 } ,
+ { 486673994, 10, -10 } ,
+ { 310565242, 10, -10 } ,
+ { 395162613, 10, -10 } ,
+ { 997364351, 10, -10 } ,
+ { 109169175, 10, -9 } ,
+ { 481008575, 10, -10 } ,
+ { 437360143, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 131713968, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 418718737, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 488177149, 10, -11 } ,
+ { 371402915, 10, -10 } ,
+ { 498159524, 10, -10 } ,
+ { 909019925, 10, -11 } ,
+ { 2132793, 10, -7 } ,
+ { 1049765, 10, -8 } ,
+ { 128048875, 10, -10 } ,
+ { 160637961, 10, -9 } ,
+ { 240297759, 10, -10 } ,
+ { 814317579, 10, -11 } ,
+ { 416294009, 10, -10 } ,
+ { 188183272, 10, -10 } ,
+ { 416295557, 10, -10 } ,
+ { 192269611, 10, -9 } ,
+ { 608479705, 10, -10 } ,
+ { 511111551, 10, -10 } ,
+ { 237238232, 10, -10 } ,
+ { 333339274, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 100504694, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 723741616, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 707159894, 10, -11 } ,
+ { 244312615, 10, -10 } ,
+ { 485717323, 10, -10 } ,
+ { 148382712, 10, -10 } ,
+ { 399153322, 10, -10 } ,
+ { 120610452, 10, -10 } ,
+ { 453045789, 10, -10 } ,
+ { 101867892, 10, -9 } ,
+ { 57671641, 10, -9 } ,
+ { 133039565, 10, -10 } ,
+ { 256264645, 10, -10 } ,
+ { 214774223, 10, -10 } ,
+ { 792377585, 10, -10 } ,
+ { 190879324, 10, -9 } ,
+ { 834113265, 10, -10 } ,
+ { 540098501, 10, -10 } ,
+ { 893587621, 10, -10 } ,
+ { 431792653, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 223677819, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 412182625, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 571497231, 10, -11 } ,
+ { 276233746, 10, -10 } ,
+ { 595379974, 10, -10 } ,
+ { 131017907, 10, -10 } ,
+ { 5778022, 10, -8 } ,
+ { 355793275, 10, -10 } ,
+ { 26079994, 10, -9 } ,
+ { 903963315, 10, -10 } ,
+ { 415257412, 10, -10 } ,
+ { 109715223, 10, -10 } ,
+ { 494107087, 10, -10 } ,
+ { 206046771, 10, -10 } ,
+ { 128639373, 10, -9 } ,
+ { 199535005, 10, -9 } ,
+ { 7787849, 10, -8 } ,
+ { 756289854, 10, -10 } ,
+ { 247991411, 10, -10 } ,
+ { 437729989, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 288708934, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 563678841, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 750492906, 10, -11 } ,
+ { 401406762, 10, -10 } ,
+ { 641869029, 10, -10 } ,
+ { 139883589, 10, -10 } ,
+ { 227229386, 10, -9 } ,
+ { 115114201, 10, -10 } ,
+ { 431544878, 10, -10 } ,
+ { 49599519, 10, -9 } ,
+ { 515954677, 10, -10 } ,
+ { 21310287, 10, -9 } ,
+ { 532266405, 10, -10 } ,
+ { 301534958, 10, -10 } ,
+ { 69286931, 10, -9 } ,
+ { 50401923, 10, -9 } ,
+ { 109367295, 10, -9 } ,
+ { 460514697, 10, -10 } ,
+ { 533081907, 10, -10 } ,
+ { 441138379, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 126211354, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 886316676, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 865214795, 10, -11 } ,
+ { 375392026, 10, -10 } ,
+ { 530926666, 10, -10 } ,
+ { 500887864, 10, -10 } ,
+ { 105957733, 10, -9 } ,
+ { 15268532, 10, -9 } ,
+ { 427885271, 10, -10 } ,
+ { 418897884, 10, -10 } ,
+ { 613111357, 10, -10 } ,
+ { 2130466, 10, -8 } ,
+ { 451381196, 10, -10 } ,
+ { 439377928, 10, -10 } ,
+ { 528422303, 10, -10 } ,
+ { 693184911, 10, -10 } ,
+ { 686487733, 10, -10 } ,
+ { 521886516, 10, -10 } ,
+ { 677294367, 10, -10 } ,
+ { 777490743, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 699500346, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 562930432, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 141464023, 10, -10 } ,
+ { 293612587, 10, -10 } ,
+ { 331632706, 10, -10 } ,
+ { 328744097, 10, -10 } ,
+ { 151873267, 10, -9 } ,
+ { 125491738, 10, -10 } ,
+ { 325487856, 10, -10 } ,
+ { 60954491, 10, -9 } ,
+ { 834815866, 10, -10 } ,
+ { 160315735, 10, -10 } ,
+ { 500402812, 10, -10 } ,
+ { 265990251, 10, -10 } ,
+ { 31345967, 10, -9 } ,
+ { 166338324, 10, -9 } ,
+ { 561633002, 10, -10 } ,
+ { 369534066, 10, -10 } ,
+ { 513097703, 10, -10 } ,
+ { 56306161, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 510946052, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 51733824, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 53951966, 10, -10 } ,
+ { 400571138, 10, -10 } ,
+ { 719126098, 10, -10 } ,
+ { 95981844, 10, -10 } ,
+ { 320461723, 10, -9 } ,
+ { 105539971, 10, -10 } ,
+ { 126987624, 10, -10 } ,
+ { 803747121, 10, -10 } ,
+ { 245110374, 10, -10 } ,
+ { 201934343, 10, -10 } ,
+ { 689809264, 10, -10 } ,
+ { 292996977, 10, -10 } ,
+ { 591611705, 10, -10 } ,
+ { 74783601, 10, -9 } ,
+ { 705362844, 10, -10 } ,
+ { 374683035, 10, -10 } ,
+ { 186241207, 10, -10 } ,
+ { 358508197, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 972802962, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 574154129, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 806541555, 10, -11 } ,
+ { 371796099, 10, -10 } ,
+ { 535269827, 10, -10 } ,
+ { 165049704, 10, -10 } ,
+ { 516584402, 10, -10 } ,
+ { 347132766, 10, -10 } ,
+ { 555347165, 10, -10 } ,
+ { 87751087, 10, -9 } ,
+ { 539828222, 10, -10 } ,
+ { 143039462, 10, -10 } ,
+ { 607352157, 10, -10 } ,
+ { 382720265, 10, -10 } ,
+ { 858641386, 10, -10 } ,
+ { 904158369, 10, -10 } ,
+ { 88358768, 10, -9 } ,
+ { 950587259, 10, -10 } ,
+ { 582810917, 10, -10 } ,
+ { 48115734, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 229329717, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 660834142, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 789208453, 10, -11 } ,
+ { 364080469, 10, -10 } ,
+ { 351283421, 10, -10 } ,
+ { 790879737, 10, -10 } ,
+ { 61296661, 10, -9 } ,
+ { 150111323, 10, -10 } ,
+ { 235757462, 10, -10 } ,
+ { 495479867, 10, -10 } ,
+ { 530800459, 10, -10 } ,
+ { 17302876, 10, -9 } ,
+ { 3596655, 10, -8 } ,
+ { 216844191, 10, -10 } ,
+ { 358667502, 10, -10 } ,
+ { 674745115, 10, -10 } ,
+ { 16197213, 10, -8 } ,
+ { 672348759, 10, -10 } ,
+ { 36690965, 10, -9 } ,
+ { 851393735, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 126523263, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 985971282, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 119970789, 10, -10 } ,
+ { 359302645, 10, -10 } ,
+ { 443742712, 10, -10 } ,
+ { 226955252, 10, -10 } ,
+ { 576054833, 10, -10 } ,
+ { 14189215, 10, -9 } ,
+ { 309687925, 10, -10 } ,
+ { 406422049, 10, -10 } ,
+ { 510606291, 10, -10 } ,
+ { 142090846, 10, -10 } ,
+ { 414745974, 10, -10 } ,
+ { 73730186, 10, -9 } ,
+ { 307932394, 10, -10 } ,
+ { 327143879, 10, -10 } ,
+ { 166664295, 10, -9 } ,
+ { 158457399, 10, -9 } ,
+ { 517524026, 10, -10 } ,
+ { 740033326, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 429257909, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 444460898, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 9185375, 10, -9 } ,
+ { 270429247, 10, -10 } ,
+ { 368011326, 10, -10 } ,
+ { 555553973, 10, -10 } ,
+ { 35591103, 10, -9 } ,
+ { 824349999, 10, -10 } ,
+ { 387446977, 10, -10 } ,
+ { 414728118, 10, -10 } ,
+ { 521415579, 10, -10 } ,
+ { 13547524, 10, -9 } ,
+ { 267342074, 10, -10 } ,
+ { 270339279, 10, -10 } ,
+ { 273514976, 10, -10 } ,
+ { 443239352, 10, -10 } ,
+ { 525164282, 10, -10 } ,
+ { 531917379, 10, -10 } ,
+ { 373143505, 10, -10 } ,
+ { 127426935, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 272380917, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 467128874, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 110573422, 10, -10 } ,
+ { 230842398, 10, -10 } ,
+ { 300737523, 10, -10 } ,
+ { 524346197, 10, -10 } ,
+ { 31161235, 10, -9 } ,
+ { 115930781, 10, -10 } ,
+ { 105690272, 10, -9 } ,
+ { 286376361, 10, -10 } ,
+ { 277178451, 10, -9 } ,
+ { 332276008, 10, -10 } ,
+ { 200626202, 10, -10 } ,
+ { 257725676, 10, -10 } ,
+ { 225329068, 10, -10 } ,
+ { 260428812, 10, -10 } ,
+ { 368935449, 10, -10 } ,
+ { 373331012, 10, -10 } ,
+ { 832701024, 10, -10 } ,
+ { 847774796, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 529655696, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 244074662, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 313790238, 10, -11 } ,
+ { 341410522, 10, -10 } ,
+ { 184839898, 10, -10 } ,
+ { 213043468, 10, -10 } ,
+ { 148265205, 10, -10 } ,
+ { 447998341, 10, -11 } ,
+ { 928535264, 10, -11 } ,
+ { 16830234, 10, -9 } ,
+ { 308875898, 10, -10 } ,
+ { 447532985, 10, -11 } ,
+ { 993080777, 10, -11 } ,
+ { 796055452, 10, -9 } ,
+ { 115228599, 10, -10 } ,
+ { 104678862, 10, -10 } ,
+ { 224852364, 10, -10 } ,
+ { 169201052, 10, -10 } ,
+ { 127420138, 10, -10 } ,
+ { 17593733, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 580661331, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 289917427, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 730306723, 10, -11 } ,
+ { 98653337, 10, -10 } ,
+ { 133768816, 10, -10 } ,
+ { 646464007, 10, -10 } ,
+ { 126316072, 10, -10 } ,
+ { 492359506, 10, -11 } ,
+ { 225721104, 10, -9 } ,
+ { 140557326, 10, -10 } ,
+ { 344045687, 10, -9 } ,
+ { 224190464, 10, -10 } ,
+ { 86181637, 10, -10 } ,
+ { 115737082, 10, -10 } ,
+ { 109232974, 10, -10 } ,
+ { 127794949, 10, -10 } ,
+ { 18762611, 10, -9 } ,
+ { 247080892, 10, -10 } ,
+ { 981598774, 10, -10 } ,
+ { 437465972, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 155709039, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 289213462, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 333495109, 10, -11 } ,
+ { 210206692, 10, -10 } ,
+ { 397566998, 10, -10 } ,
+ { 681756245, 10, -11 } ,
+ { 211797014, 10, -10 } ,
+ { 931691641, 10, -11 } ,
+ { 997082734, 10, -11 } ,
+ { 471400266, 10, -9 } ,
+ { 19755142, 10, -9 } ,
+ { 712137302, 10, -11 } ,
+ { 45332193, 10, -9 } ,
+ { 170286532, 10, -10 } ,
+ { 608593975, 10, -10 } ,
+ { 170847728, 10, -9 } ,
+ { 327407306, 10, -10 } ,
+ { 228811658, 10, -10 } ,
+ { 144868843, 10, -10 } ,
+ { 247846753, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 872650727, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 317954268, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 745612419, 10, -11 } ,
+ { 992122832, 10, -11 } ,
+ { 144272853, 10, -10 } ,
+ { 118078982, 10, -9 } ,
+ { 137456778, 10, -10 } ,
+ { 54795992, 10, -10 } ,
+ { 830504353, 10, -10 } ,
+ { 145977454, 10, -10 } ,
+ { 333816417, 10, -9 } ,
+ { 216579937, 10, -10 } ,
+ { 909348225, 10, -11 } ,
+ { 118928447, 10, -10 } ,
+ { 114709387, 10, -10 } ,
+ { 135369563, 10, -10 } ,
+ { 202216377, 10, -10 } ,
+ { 256633366, 10, -10 } ,
+ { 184915107, 10, -9 } ,
+ { 515881495, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 200339234, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 25532143, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 506513688, 10, -11 } ,
+ { 298389525, 10, -10 } ,
+ { 231457103, 10, -10 } ,
+ { 99193508, 10, -9 } ,
+ { 390534803, 10, -10 } ,
+ { 107419366, 10, -10 } ,
+ { 754069658, 10, -10 } ,
+ { 22268733, 10, -9 } ,
+ { 132138965, 10, -9 } ,
+ { 11339777, 10, -9 } ,
+ { 350257789, 10, -9 } ,
+ { 125255265, 10, -10 } ,
+ { 174331856, 10, -10 } ,
+ { 187548191, 10, -10 } ,
+ { 350222966, 10, -10 } ,
+ { 268122374, 10, -10 } ,
+ { 35892657, 10, -9 } ,
+ { 367727817, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 153039222, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 505399813, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 508305668, 10, -11 } ,
+ { 166984721, 10, -10 } ,
+ { 29616023, 10, -9 } ,
+ { 312072651, 10, -10 } ,
+ { 198426998, 10, -10 } ,
+ { 1493128, 10, -8 } ,
+ { 177399726, 10, -10 } ,
+ { 258184898, 10, -10 } ,
+ { 430906099, 10, -10 } ,
+ { 548999827, 10, -10 } ,
+ { 266412543, 10, -10 } ,
+ { 102810516, 10, -9 } ,
+ { 13174635, 10, -8 } ,
+ { 211717047, 10, -10 } ,
+ { 775891571, 10, -10 } ,
+ { 365844905, 10, -10 } ,
+ { 235223166, 10, -10 } ,
+ { 854783234, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 274957188, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 295459922, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 90913897, 10, -10 } ,
+ { 1966725, 10, -8 } ,
+ { 270235588, 10, -10 } ,
+ { 11512459, 10, -9 } ,
+ { 995451773, 10, -10 } ,
+ { 739727583, 10, -11 } ,
+ { 259464442, 10, -10 } ,
+ { 260133439, 10, -10 } ,
+ { 359886652, 10, -10 } ,
+ { 104337525, 10, -10 } ,
+ { 203368233, 10, -10 } ,
+ { 215624329, 10, -10 } ,
+ { 190755175, 10, -10 } ,
+ { 18979991, 10, -9 } ,
+ { 109461055, 10, -9 } ,
+ { 149859998, 10, -9 } ,
+ { 92864049, 10, -9 } ,
+ { 335317623, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 107554876, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 492478459, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 550242687, 10, -11 } ,
+ { 215003161, 10, -10 } ,
+ { 220951005, 10, -10 } ,
+ { 776033331, 10, -11 } ,
+ { 459631856, 10, -9 } ,
+ { 696788255, 10, -11 } ,
+ { 948015653, 10, -11 } ,
+ { 220080215, 10, -10 } ,
+ { 165034174, 10, -10 } ,
+ { 569103497, 10, -11 } ,
+ { 38446691, 10, -9 } ,
+ { 160197332, 10, -10 } ,
+ { 159470525, 10, -10 } ,
+ { 156773249, 10, -10 } ,
+ { 236626674, 10, -9 } ,
+ { 442666445, 10, -10 } ,
+ { 148089217, 10, -10 } ,
+ { 286654986, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 734534227, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 367712401, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 25933985, 10, -9 } ,
+ { 197974533, 10, -10 } ,
+ { 194759484, 10, -10 } ,
+ { 130841413, 10, -10 } ,
+ { 403378123, 10, -10 } ,
+ { 701084881, 10, -11 } ,
+ { 631058166, 10, -10 } ,
+ { 187321795, 10, -10 } ,
+ { 48790463, 10, -9 } ,
+ { 123266231, 10, -10 } ,
+ { 166684222, 10, -9 } ,
+ { 132904189, 10, -10 } ,
+ { 144110287, 10, -10 } ,
+ { 151572753, 10, -10 } ,
+ { 512992294, 10, -10 } ,
+ { 313674838, 10, -10 } ,
+ { 36911522, 10, -8 } ,
+ { 258376384, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 10460469, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 287733822, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 676264517, 10, -11 } ,
+ { 103503636, 10, -10 } ,
+ { 139019235, 10, -10 } ,
+ { 199536719, 10, -10 } ,
+ { 131055744, 10, -10 } ,
+ { 495644069, 10, -11 } ,
+ { 323881868, 10, -9 } ,
+ { 15140205, 10, -9 } ,
+ { 14955705, 10, -8 } ,
+ { 157098919, 10, -9 } ,
+ { 984983561, 10, -11 } ,
+ { 116438104, 10, -10 } ,
+ { 126885377, 10, -10 } ,
+ { 128193512, 10, -10 } ,
+ { 214277832, 10, -10 } ,
+ { 593756558, 10, -10 } ,
+ { 759576899, 10, -10 } ,
+ { 347693344, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 114311683, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 247364235, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 307011628, 10, -11 } ,
+ { 133329175, 10, -10 } ,
+ { 17685685, 10, -9 } ,
+ { 460221957, 10, -11 } ,
+ { 147753446, 10, -10 } ,
+ { 432109816, 10, -11 } ,
+ { 812307921, 10, -11 } ,
+ { 1668515, 10, -8 } ,
+ { 137476518, 10, -10 } ,
+ { 393440005, 10, -11 } ,
+ { 956471933, 10, -11 } ,
+ { 839390282, 10, -9 } ,
+ { 113456228, 10, -10 } ,
+ { 10273511, 10, -9 } ,
+ { 419394758, 10, -10 } ,
+ { 170990605, 10, -10 } ,
+ { 117627495, 10, -10 } ,
+ { 154905509, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 485466809, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 760616652, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 80083637, 10, -10 } ,
+ { 116433979, 10, -10 } ,
+ { 159104072, 10, -10 } ,
+ { 319501405, 10, -10 } ,
+ { 164829899, 10, -10 } ,
+ { 4987426, 10, -9 } ,
+ { 251586121, 10, -9 } ,
+ { 162267808, 10, -10 } ,
+ { 928206512, 10, -10 } ,
+ { 414043646, 10, -10 } ,
+ { 101647468, 10, -10 } ,
+ { 40969229, 10, -9 } ,
+ { 122520398, 10, -10 } ,
+ { 129872004, 10, -10 } ,
+ { 25007116, 10, -9 } ,
+ { 301544365, 10, -10 } ,
+ { 247675312, 10, -9 } ,
+ { 343955589, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 131646299, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 209760498, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 515464336, 10, -11 } ,
+ { 743255067, 10, -11 } ,
+ { 916828074, 10, -11 } ,
+ { 150161413, 10, -10 } ,
+ { 881632097, 10, -11 } ,
+ { 322040346, 10, -11 } ,
+ { 553227329, 10, -9 } ,
+ { 100206867, 10, -10 } ,
+ { 85324405, 10, -9 } ,
+ { 840237215, 10, -10 } ,
+ { 63547853, 10, -10 } ,
+ { 834566247, 10, -11 } ,
+ { 774725335, 10, -11 } ,
+ { 822892069, 10, -11 } ,
+ { 135883968, 10, -10 } ,
+ { 188384475, 10, -10 } ,
+ { 883336338, 10, -10 } ,
+ { 237095334, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 846884577, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 167578968, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 406019507, 10, -11 } ,
+ { 669594661, 10, -11 } ,
+ { 929309908, 10, -11 } ,
+ { 464468497, 10, -9 } ,
+ { 100208699, 10, -10 } ,
+ { 572618569, 10, -11 } ,
+ { 251575049, 10, -10 } ,
+ { 914258357, 10, -11 } ,
+ { 255368039, 10, -9 } ,
+ { 122442153, 10, -10 } ,
+ { 652974287, 10, -11 } ,
+ { 692817331, 10, -11 } ,
+ { 701077239, 10, -11 } ,
+ { 900130719, 10, -11 } ,
+ { 132135178, 10, -10 } ,
+ { 132872687, 10, -10 } ,
+ { 248530992, 10, -10 } ,
+ { 645879538, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 597925785, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 376092863, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 732795953, 10, -11 } ,
+ { 170875845, 10, -10 } ,
+ { 37729046, 10, -9 } ,
+ { 264936885, 10, -10 } ,
+ { 314430469, 10, -10 } ,
+ { 724675061, 10, -11 } ,
+ { 205360624, 10, -10 } ,
+ { 250473603, 10, -10 } ,
+ { 302568161, 10, -10 } ,
+ { 908571268, 10, -11 } ,
+ { 161473119, 10, -10 } ,
+ { 182165725, 10, -10 } ,
+ { 967466752, 10, -10 } ,
+ { 186609403, 10, -10 } ,
+ { 104568913, 10, -9 } ,
+ { 679287999, 10, -10 } ,
+ { 89507819, 10, -9 } ,
+ { 302437535, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 102474427, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 736431238, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 637685179, 10, -11 } ,
+ { 195772728, 10, -10 } ,
+ { 255284569, 10, -10 } ,
+ { 333417481, 10, -10 } ,
+ { 365352457, 10, -10 } ,
+ { 812374769, 10, -11 } ,
+ { 157472272, 10, -10 } ,
+ { 247706601, 10, -10 } ,
+ { 386827051, 10, -10 } ,
+ { 345715074, 10, -10 } ,
+ { 219668506, 10, -10 } ,
+ { 167433375, 10, -10 } ,
+ { 250765732, 10, -10 } ,
+ { 477366638, 10, -10 } ,
+ { 412865364, 10, -9 } ,
+ { 854900808, 10, -10 } ,
+ { 389801876, 10, -10 } ,
+ { 350382196, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 494768976, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 335982687, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 727686234, 10, -11 } ,
+ { 381162623, 10, -10 } ,
+ { 252010543, 10, -10 } ,
+ { 861750909, 10, -11 } ,
+ { 324020801, 10, -10 } ,
+ { 659218147, 10, -11 } ,
+ { 1601993, 10, -8 } ,
+ { 226586595, 10, -10 } ,
+ { 245071376, 10, -10 } ,
+ { 750456636, 10, -11 } ,
+ { 189922967, 10, -10 } ,
+ { 182503561, 10, -10 } ,
+ { 169790249, 10, -10 } ,
+ { 164106255, 10, -10 } ,
+ { 275834339, 10, -9 } ,
+ { 841784063, 10, -10 } ,
+ { 528216527, 10, -10 } ,
+ { 254600237, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 850303156, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 291873775, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 672426009, 10, -11 } ,
+ { 100626138, 10, -10 } ,
+ { 137086838, 10, -10 } ,
+ { 557184266, 10, -10 } ,
+ { 132249553, 10, -10 } ,
+ { 475346272, 10, -11 } ,
+ { 17849905, 10, -8 } ,
+ { 139713848, 10, -10 } ,
+ { 366041265, 10, -9 } ,
+ { 196274099, 10, -10 } ,
+ { 933935033, 10, -11 } ,
+ { 112734667, 10, -10 } ,
+ { 109374527, 10, -10 } ,
+ { 12467092, 10, -9 } ,
+ { 591855634, 10, -10 } ,
+ { 24439165, 10, -9 } ,
+ { 108365902, 10, -9 } ,
+ { 385588758, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 13483249, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 436254621, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 773445072, 10, -11 } ,
+ { 134796204, 10, -10 } ,
+ { 202354185, 10, -10 } ,
+ { 766916669, 10, -10 } ,
+ { 388530614, 10, -10 } ,
+ { 730084574, 10, -11 } ,
+ { 95790632, 10, -9 } ,
+ { 196685072, 10, -10 } ,
+ { 266546449, 10, -9 } ,
+ { 417938962, 10, -10 } ,
+ { 132418503, 10, -10 } ,
+ { 143596479, 10, -10 } ,
+ { 374825632, 10, -10 } ,
+ { 171526587, 10, -10 } ,
+ { 391498444, 10, -10 } ,
+ { 613716473, 10, -10 } ,
+ { 112522694, 10, -9 } ,
+ { 543838148, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 356624402, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 146230451, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 887259116, 10, -11 } ,
+ { 361516655, 10, -10 } ,
+ { 283803909, 10, -10 } ,
+ { 38924009, 10, -9 } ,
+ { 319262063, 10, -10 } ,
+ { 955825082, 10, -11 } ,
+ { 532001569, 10, -10 } ,
+ { 259298723, 10, -10 } ,
+ { 146564043, 10, -9 } ,
+ { 300341079, 10, -10 } ,
+ { 212277367, 10, -10 } ,
+ { 204381729, 10, -10 } ,
+ { 201504961, 10, -10 } ,
+ { 205165487, 10, -10 } ,
+ { 170634194, 10, -9 } ,
+ { 612796383, 10, -10 } ,
+ { 695316048, 10, -10 } ,
+ { 534203578, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 540881929, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 380362625, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 668304104, 10, -11 } ,
+ { 428051151, 10, -10 } ,
+ { 242077233, 10, -10 } ,
+ { 106644179, 10, -9 } ,
+ { 324848435, 10, -10 } ,
+ { 248179955, 10, -10 } ,
+ { 958705023, 10, -10 } ,
+ { 222117899, 10, -10 } ,
+ { 171856635, 10, -9 } ,
+ { 2227858, 10, -8 } ,
+ { 152293724, 10, -9 } ,
+ { 149946827, 10, -10 } ,
+ { 176432921, 10, -10 } ,
+ { 191142425, 10, -10 } ,
+ { 342699135, 10, -10 } ,
+ { 515831942, 10, -10 } ,
+ { 555636486, 10, -10 } ,
+ { 540184637, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 383396133, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 464405663, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 51527533, 10, -10 } ,
+ { 144840575, 10, -10 } ,
+ { 19696003, 10, -9 } ,
+ { 184110872, 10, -10 } ,
+ { 173065839, 10, -10 } ,
+ { 540801441, 10, -11 } ,
+ { 148727575, 10, -9 } ,
+ { 185912513, 10, -10 } ,
+ { 970744466, 10, -10 } ,
+ { 99579945, 10, -10 } ,
+ { 111359609, 10, -10 } ,
+ { 453600341, 10, -9 } ,
+ { 314469844, 10, -10 } ,
+ { 133701911, 10, -10 } ,
+ { 24651181, 10, -9 } ,
+ { 219033694, 10, -10 } ,
+ { 635616708, 10, -10 } ,
+ { 277792214, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 880331525, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 133190523, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 866960922, 10, -11 } ,
+ { 357081802, 10, -10 } ,
+ { 424088301, 10, -10 } ,
+ { 680379652, 10, -10 } ,
+ { 705900366, 10, -10 } ,
+ { 380251692, 10, -10 } ,
+ { 38820561, 10, -9 } ,
+ { 40139465, 10, -9 } ,
+ { 60898167, 10, -9 } ,
+ { 141059413, 10, -10 } ,
+ { 257732942, 10, -10 } ,
+ { 386396599, 10, -10 } ,
+ { 917518129, 10, -10 } ,
+ { 723072342, 10, -10 } ,
+ { 690962807, 10, -10 } ,
+ { 363476545, 10, -10 } ,
+ { 635535905, 10, -10 } ,
+ { 684716867, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 489214514, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 491830504, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 857505703, 10, -11 } ,
+ { 187143081, 10, -10 } ,
+ { 243579326, 10, -10 } ,
+ { 551820307, 10, -10 } ,
+ { 241454114, 10, -10 } ,
+ { 902792063, 10, -11 } ,
+ { 817071464, 10, -10 } ,
+ { 235482366, 10, -10 } ,
+ { 184524721, 10, -9 } ,
+ { 167880033, 10, -10 } ,
+ { 19106057, 10, -9 } ,
+ { 194588588, 10, -10 } ,
+ { 180186429, 10, -10 } ,
+ { 198453615, 10, -10 } ,
+ { 583509553, 10, -10 } ,
+ { 20942313, 10, -8 } ,
+ { 801255372, 10, -10 } ,
+ { 600810165, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 627077053, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 354455573, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 709581677, 10, -11 } ,
+ { 112077621, 10, -10 } ,
+ { 14905161, 10, -9 } ,
+ { 101595903, 10, -9 } ,
+ { 153475215, 10, -10 } ,
+ { 561105769, 10, -11 } ,
+ { 214999972, 10, -9 } ,
+ { 149743557, 10, -10 } ,
+ { 262281299, 10, -9 } ,
+ { 189892055, 10, -10 } ,
+ { 987064738, 10, -11 } ,
+ { 126558628, 10, -10 } ,
+ { 116330301, 10, -10 } ,
+ { 13439241, 10, -9 } ,
+ { 207762678, 10, -10 } ,
+ { 297393345, 10, -10 } ,
+ { 950929284, 10, -10 } ,
+ { 46270388, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 190799203, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 250491606, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 843179813, 10, -11 } ,
+ { 194291222, 10, -10 } ,
+ { 26158172, 10, -9 } ,
+ { 12747579, 10, -9 } ,
+ { 105171401, 10, -9 } ,
+ { 216342378, 10, -10 } ,
+ { 614724562, 10, -10 } ,
+ { 250164153, 10, -10 } ,
+ { 752824569, 10, -10 } ,
+ { 1129484, 10, -8 } ,
+ { 200433165, 10, -10 } ,
+ { 416192018, 10, -10 } ,
+ { 18674278, 10, -9 } ,
+ { 185683117, 10, -10 } ,
+ { 136408673, 10, -9 } ,
+ { 926752453, 10, -10 } ,
+ { 515767643, 10, -10 } ,
+ { 338205233, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 112383809, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 501081709, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 487069923, 10, -11 } ,
+ { 41590466, 10, -9 } ,
+ { 492689581, 10, -10 } ,
+ { 317319405, 10, -10 } ,
+ { 461282187, 10, -10 } ,
+ { 115593392, 10, -10 } ,
+ { 14997429, 10, -9 } ,
+ { 390709292, 10, -10 } ,
+ { 578515032, 10, -10 } ,
+ { 203699589, 10, -10 } ,
+ { 48170401, 10, -9 } ,
+ { 166489924, 10, -10 } ,
+ { 253144344, 10, -9 } ,
+ { 108845436, 10, -9 } ,
+ { 941065525, 10, -10 } ,
+ { 660808344, 10, -10 } ,
+ { 206445243, 10, -10 } ,
+ { 409837059, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 406401617, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 508579416, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 633795566, 10, -11 } ,
+ { 114330698, 10, -10 } ,
+ { 154487271, 10, -10 } ,
+ { 229100355, 10, -9 } ,
+ { 170159128, 10, -10 } ,
+ { 757250691, 10, -11 } ,
+ { 971205076, 10, -10 } ,
+ { 152221678, 10, -10 } ,
+ { 139918699, 10, -9 } ,
+ { 524616956, 10, -10 } ,
+ { 227285675, 10, -10 } ,
+ { 116826449, 10, -10 } ,
+ { 122081573, 10, -10 } ,
+ { 13675456, 10, -9 } ,
+ { 320348898, 10, -10 } ,
+ { 22852614, 10, -9 } ,
+ { 911269587, 10, -10 } ,
+ { 594048016, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 565477021, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 679235976, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 88851867, 10, -10 } ,
+ { 179231623, 10, -10 } ,
+ { 232104207, 10, -10 } ,
+ { 980487937, 10, -10 } ,
+ { 248548166, 10, -10 } ,
+ { 813218675, 10, -11 } ,
+ { 875576477, 10, -10 } ,
+ { 224351388, 10, -10 } ,
+ { 277363297, 10, -9 } ,
+ { 209659672, 10, -10 } ,
+ { 251606934, 10, -10 } ,
+ { 188526689, 10, -10 } ,
+ { 173054681, 10, -10 } ,
+ { 196713746, 10, -10 } ,
+ { 580982788, 10, -10 } ,
+ { 744615048, 10, -10 } ,
+ { 746115406, 10, -10 } ,
+ { 609885167, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 210663633, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 569965637, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 800343379, 10, -11 } ,
+ { 322844431, 10, -10 } ,
+ { 520226428, 10, -10 } ,
+ { 663574292, 10, -10 } ,
+ { 188822372, 10, -9 } ,
+ { 311358877, 10, -10 } ,
+ { 351472647, 10, -10 } ,
+ { 445619719, 10, -10 } ,
+ { 474367631, 10, -10 } ,
+ { 121747284, 10, -10 } ,
+ { 741451044, 10, -10 } ,
+ { 245079222, 10, -10 } ,
+ { 538076525, 10, -10 } ,
+ { 48785796, 10, -9 } ,
+ { 817256868, 10, -10 } ,
+ { 48313695, 10, -9 } ,
+ { 31628613, 10, -9 } ,
+ { 736447345, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 59141803, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 684094234, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 102434134, 10, -10 } ,
+ { 342073411, 10, -10 } ,
+ { 465270197, 10, -10 } ,
+ { 562684642, 10, -10 } ,
+ { 939359156, 10, -10 } ,
+ { 1457997, 10, -8 } ,
+ { 566950798, 10, -10 } ,
+ { 512305741, 10, -10 } ,
+ { 848935625, 10, -10 } ,
+ { 216173837, 10, -10 } ,
+ { 546008168, 10, -10 } ,
+ { 412870883, 10, -10 } ,
+ { 737361667, 10, -10 } ,
+ { 437778684, 10, -10 } ,
+ { 103548061, 10, -9 } ,
+ { 499251336, 10, -10 } ,
+ { 605532434, 10, -10 } ,
+ { 74634781, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 311252939, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 557912643, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 153168321, 10, -10 } ,
+ { 757273289, 10, -10 } ,
+ { 746418083, 10, -10 } ,
+ { 271380768, 10, -10 } ,
+ { 770494763, 10, -10 } ,
+ { 199914921, 10, -10 } ,
+ { 344402897, 10, -10 } ,
+ { 600332891, 10, -10 } ,
+ { 116390449, 10, -9 } ,
+ { 173140872, 10, -10 } ,
+ { 477438749, 10, -10 } ,
+ { 296364582, 10, -10 } ,
+ { 530536545, 10, -10 } ,
+ { 886274679, 10, -10 } ,
+ { 863171564, 10, -10 } ,
+ { 510009838, 10, -10 } ,
+ { 510431275, 10, -10 } ,
+ { 630627378, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 187694104, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 787085934, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 225325589, 10, -10 } ,
+ { 485053063, 10, -10 } ,
+ { 487021205, 10, -10 } ,
+ { 786817851, 10, -10 } ,
+ { 63693075, 10, -9 } ,
+ { 23115476, 10, -9 } ,
+ { 279343914, 10, -10 } ,
+ { 436918322, 10, -10 } ,
+ { 595788499, 10, -10 } ,
+ { 139568044, 10, -10 } ,
+ { 635901071, 10, -10 } ,
+ { 625559109, 10, -10 } ,
+ { 696345291, 10, -10 } ,
+ { 407089174, 10, -10 } ,
+ { 100834398, 10, -9 } ,
+ { 4667553, 10, -8 } ,
+ { 459921892, 10, -10 } ,
+ { 219004152, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 493891932, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 671976171, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 787742893, 10, -11 } ,
+ { 396890775, 10, -10 } ,
+ { 508095395, 10, -10 } ,
+ { 140713444, 10, -10 } ,
+ { 112128842, 10, -9 } ,
+ { 104492837, 10, -10 } ,
+ { 339479609, 10, -10 } ,
+ { 354583023, 10, -10 } ,
+ { 605415423, 10, -10 } ,
+ { 115436459, 10, -10 } ,
+ { 471909969, 10, -10 } ,
+ { 210355127, 10, -9 } ,
+ { 415354059, 10, -10 } ,
+ { 528916744, 10, -10 } ,
+ { 109319691, 10, -9 } ,
+ { 541670056, 10, -10 } ,
+ { 629824472, 10, -10 } ,
+ { 434240883, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 12714666, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 766360947, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 829447551, 10, -11 } ,
+ { 598790684, 10, -10 } ,
+ { 692105775, 10, -10 } ,
+ { 223070273, 10, -10 } ,
+ { 713308287, 10, -10 } ,
+ { 174176915, 10, -10 } ,
+ { 234574197, 10, -10 } ,
+ { 789825972, 10, -10 } ,
+ { 563630711, 10, -10 } ,
+ { 121990003, 10, -10 } ,
+ { 930966942, 10, -10 } ,
+ { 256251308, 10, -10 } ,
+ { 549420045, 10, -10 } ,
+ { 412097425, 10, -10 } ,
+ { 10165779, 10, -8 } ,
+ { 113544901, 10, -9 } ,
+ { 390434099, 10, -10 } ,
+ { 383680291, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 168928528, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 985219787, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 140053741, 10, -10 } ,
+ { 31299573, 10, -9 } ,
+ { 290773631, 10, -10 } ,
+ { 273700886, 10, -10 } ,
+ { 152915299, 10, -9 } ,
+ { 184578495, 10, -10 } ,
+ { 140783195, 10, -10 } ,
+ { 381270421, 10, -10 } ,
+ { 241531511, 10, -10 } ,
+ { 764246021, 10, -11 } ,
+ { 24349809, 10, -8 } ,
+ { 181754535, 10, -10 } ,
+ { 21199314, 10, -9 } ,
+ { 221809476, 10, -10 } ,
+ { 119495231, 10, -9 } ,
+ { 800699283, 10, -10 } ,
+ { 208839155, 10, -10 } ,
+ { 366880095, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 288391086, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 70033696, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 824200241, 10, -11 } ,
+ { 488650806, 10, -10 } ,
+ { 107607971, 10, -9 } ,
+ { 28818636, 10, -9 } ,
+ { 814804898, 10, -10 } ,
+ { 136440828, 10, -10 } ,
+ { 378189589, 10, -10 } ,
+ { 601178031, 10, -10 } ,
+ { 671987353, 10, -10 } ,
+ { 135214585, 10, -10 } ,
+ { 543327327, 10, -10 } ,
+ { 951416679, 10, -10 } ,
+ { 58531557, 10, -9 } ,
+ { 395289952, 10, -10 } ,
+ { 973419194, 10, -10 } ,
+ { 571590255, 10, -10 } ,
+ { 383221997, 10, -10 } ,
+ { 25294006, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 275095126, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 897508997, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 678012206, 10, -11 } ,
+ { 14471769, 10, -9 } ,
+ { 207251043, 10, -10 } ,
+ { 731442344, 10, -10 } ,
+ { 223500362, 10, -10 } ,
+ { 69207369, 10, -10 } ,
+ { 979169725, 10, -10 } ,
+ { 33060957, 10, -9 } ,
+ { 125274838, 10, -9 } ,
+ { 133369157, 10, -10 } ,
+ { 244934641, 10, -10 } ,
+ { 759247875, 10, -10 } ,
+ { 256122677, 10, -10 } ,
+ { 168805896, 10, -10 } ,
+ { 383289831, 10, -10 } ,
+ { 420263899, 10, -10 } ,
+ { 569953075, 10, -10 } ,
+ { 18716898, 10, -8 } ,
+ { 0, 10, 0 } ,
+ { 22485912, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 700729545, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 874550282, 10, -11 } ,
+ { 257086728, 10, -10 } ,
+ { 225218664, 10, -10 } ,
+ { 403203148, 10, -10 } ,
+ { 384983026, 10, -10 } ,
+ { 74418784, 10, -10 } ,
+ { 133012972, 10, -9 } ,
+ { 227153562, 10, -10 } ,
+ { 172026616, 10, -9 } ,
+ { 31755828, 10, -9 } ,
+ { 153078219, 10, -10 } ,
+ { 169184671, 10, -10 } ,
+ { 234714859, 10, -10 } ,
+ { 325205665, 10, -10 } ,
+ { 340882252, 10, -10 } ,
+ { 754876707, 10, -10 } ,
+ { 162470155, 10, -9 } ,
+ { 489765638, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 308830613, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 504424396, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 77372658, 10, -10 } ,
+ { 409184584, 10, -10 } ,
+ { 566092563, 10, -10 } ,
+ { 190186525, 10, -10 } ,
+ { 791607775, 10, -10 } ,
+ { 127494579, 10, -10 } ,
+ { 314725982, 10, -10 } ,
+ { 105111735, 10, -9 } ,
+ { 721904257, 10, -10 } ,
+ { 132590932, 10, -10 } ,
+ { 372931345, 10, -10 } ,
+ { 238567965, 10, -10 } ,
+ { 607094682, 10, -10 } ,
+ { 854376398, 10, -10 } ,
+ { 99322688, 10, -9 } ,
+ { 103829817, 10, -9 } ,
+ { 494108169, 10, -10 } ,
+ { 232785035, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 426935999, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 494565827, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 676856904, 10, -11 } ,
+ { 522738155, 10, -10 } ,
+ { 404810894, 10, -10 } ,
+ { 743130149, 10, -10 } ,
+ { 141407128, 10, -9 } ,
+ { 196013952, 10, -10 } ,
+ { 241613123, 10, -10 } ,
+ { 650500031, 10, -10 } ,
+ { 716628084, 10, -10 } ,
+ { 18421703, 10, -9 } ,
+ { 595334048, 10, -10 } ,
+ { 202219548, 10, -10 } ,
+ { 899013742, 10, -10 } ,
+ { 427144467, 10, -10 } ,
+ { 567158794, 10, -10 } ,
+ { 555335667, 10, -10 } ,
+ { 398117454, 10, -10 } ,
+ { 355118246, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 398415765, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 505790873, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 809071876, 10, -11 } ,
+ { 146592675, 10, -10 } ,
+ { 189723609, 10, -10 } ,
+ { 654512456, 10, -10 } ,
+ { 194919988, 10, -10 } ,
+ { 654261985, 10, -11 } ,
+ { 190872508, 10, -9 } ,
+ { 18789781, 10, -9 } ,
+ { 221515197, 10, -9 } ,
+ { 198166923, 10, -10 } ,
+ { 188202219, 10, -10 } ,
+ { 576803228, 10, -10 } ,
+ { 143375509, 10, -10 } ,
+ { 160834929, 10, -10 } ,
+ { 273459496, 10, -10 } ,
+ { 470146091, 10, -10 } ,
+ { 106015536, 10, -9 } ,
+ { 296391691, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 179939606, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 170089416, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 159833939, 10, -10 } ,
+ { 219006202, 10, -10 } ,
+ { 443607598, 10, -10 } ,
+ { 320122923, 10, -10 } ,
+ { 533387714, 10, -10 } ,
+ { 894746059, 10, -11 } ,
+ { 888692635, 10, -10 } ,
+ { 29696391, 10, -9 } ,
+ { 114308551, 10, -9 } ,
+ { 229097409, 10, -10 } ,
+ { 201114734, 10, -10 } ,
+ { 224848945, 10, -10 } ,
+ { 408445031, 10, -10 } ,
+ { 301652772, 10, -10 } ,
+ { 912410348, 10, -10 } ,
+ { 500483114, 10, -10 } ,
+ { 113450643, 10, -9 } ,
+ { 4707379, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 156523395, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 500835302, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 605480884, 10, -11 } ,
+ { 934504313, 10, -10 } ,
+ { 5570461, 10, -8 } ,
+ { 678596013, 10, -10 } ,
+ { 274755885, 10, -10 } ,
+ { 149320025, 10, -10 } ,
+ { 301157646, 10, -10 } ,
+ { 507432352, 10, -10 } ,
+ { 638371214, 10, -10 } ,
+ { 150140401, 10, -10 } ,
+ { 103126815, 10, -9 } ,
+ { 406126165, 10, -10 } ,
+ { 413280188, 10, -10 } ,
+ { 334064352, 10, -10 } ,
+ { 726264731, 10, -10 } ,
+ { 546868354, 10, -10 } ,
+ { 323257718, 10, -10 } ,
+ { 75891721, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 143356192, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 109590036, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 588253425, 10, -11 } ,
+ { 252535878, 10, -10 } ,
+ { 194531023, 10, -10 } ,
+ { 561513567, 10, -10 } ,
+ { 448234969, 10, -10 } ,
+ { 217351957, 10, -10 } ,
+ { 389863593, 10, -10 } ,
+ { 183573559, 10, -10 } ,
+ { 115638542, 10, -9 } ,
+ { 229235375, 10, -10 } ,
+ { 220983772, 10, -10 } ,
+ { 131672338, 10, -10 } ,
+ { 148083674, 10, -10 } ,
+ { 155712321, 10, -10 } ,
+ { 608658689, 10, -10 } ,
+ { 546956324, 10, -10 } ,
+ { 408809297, 10, -10 } ,
+ { 861056626, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 279672252, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 60110593, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 788702236, 10, -11 } ,
+ { 125415635, 10, -10 } ,
+ { 19219017, 10, -9 } ,
+ { 12082476, 10, -8 } ,
+ { 179122526, 10, -10 } ,
+ { 733540818, 10, -11 } ,
+ { 923120058, 10, -10 } ,
+ { 275533877, 10, -10 } ,
+ { 301920038, 10, -9 } ,
+ { 296734561, 10, -10 } ,
+ { 117662822, 10, -10 } ,
+ { 141104787, 10, -10 } ,
+ { 269618322, 10, -10 } ,
+ { 175580998, 10, -10 } ,
+ { 265181511, 10, -10 } ,
+ { 3811833, 10, -8 } ,
+ { 871953912, 10, -10 } ,
+ { 62522016, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 33952123, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 783628076, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 188989773, 10, -10 } ,
+ { 671308228, 10, -10 } ,
+ { 43363908, 10, -9 } ,
+ { 289661133, 10, -10 } ,
+ { 533785068, 10, -10 } ,
+ { 114184207, 10, -10 } ,
+ { 321490447, 10, -10 } ,
+ { 40950666, 10, -9 } ,
+ { 506091284, 10, -10 } ,
+ { 10747873, 10, -9 } ,
+ { 706917586, 10, -10 } ,
+ { 422533078, 10, -10 } ,
+ { 955629341, 10, -10 } ,
+ { 396898742, 10, -10 } ,
+ { 23330393, 10, -8 } ,
+ { 651052703, 10, -10 } ,
+ { 278296759, 10, -10 } ,
+ { 383411438, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 132540831, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 29057592, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 41881421, 10, -10 } ,
+ { 159542285, 10, -10 } ,
+ { 213546736, 10, -10 } ,
+ { 575186448, 10, -10 } ,
+ { 415445764, 10, -10 } ,
+ { 436634816, 10, -10 } ,
+ { 148855173, 10, -10 } ,
+ { 209914109, 10, -10 } ,
+ { 569849809, 10, -10 } ,
+ { 309905274, 10, -10 } ,
+ { 274326799, 10, -10 } ,
+ { 520603216, 10, -9 } ,
+ { 151924402, 10, -10 } ,
+ { 307196126, 10, -10 } ,
+ { 27104116, 10, -9 } ,
+ { 268819851, 10, -10 } ,
+ { 187216784, 10, -10 } ,
+ { 355861681, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 449845494, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 935686877, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 770567019, 10, -11 } ,
+ { 489170331, 10, -10 } ,
+ { 36057588, 10, -9 } ,
+ { 412706495, 10, -10 } ,
+ { 166031817, 10, -9 } ,
+ { 204254959, 10, -10 } ,
+ { 197126322, 10, -10 } ,
+ { 33392146, 10, -9 } ,
+ { 329068979, 10, -10 } ,
+ { 100225594, 10, -10 } ,
+ { 103103547, 10, -9 } ,
+ { 973812714, 10, -10 } ,
+ { 373542804, 10, -10 } ,
+ { 313471097, 10, -10 } ,
+ { 903444369, 10, -10 } ,
+ { 104151383, 10, -9 } ,
+ { 340222724, 10, -10 } ,
+ { 443135844, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 153980184, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 9516375, 10, -8 } ,
+ { 0, 10, 0 } ,
+ { 871207913, 10, -11 } ,
+ { 487555818, 10, -10 } ,
+ { 599853125, 10, -10 } ,
+ { 151289934, 10, -10 } ,
+ { 924320107, 10, -10 } ,
+ { 395534123, 10, -10 } ,
+ { 456509443, 10, -10 } ,
+ { 775427491, 10, -10 } ,
+ { 51272209, 10, -9 } ,
+ { 136523451, 10, -10 } ,
+ { 374143063, 10, -10 } ,
+ { 393588781, 10, -10 } ,
+ { 695265415, 10, -10 } ,
+ { 595344472, 10, -10 } ,
+ { 112695726, 10, -9 } ,
+ { 806524815, 10, -10 } ,
+ { 521511679, 10, -10 } ,
+ { 444569509, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 163916688, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 491689425, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 706344366, 10, -11 } ,
+ { 19018089, 10, -9 } ,
+ { 235469558, 10, -10 } ,
+ { 530694799, 10, -10 } ,
+ { 237465731, 10, -10 } ,
+ { 772763071, 10, -11 } ,
+ { 97181791, 10, -9 } ,
+ { 223749458, 10, -10 } ,
+ { 842944202, 10, -10 } ,
+ { 132260089, 10, -10 } ,
+ { 444839273, 10, -10 } ,
+ { 218988217, 10, -9 } ,
+ { 168787777, 10, -10 } ,
+ { 169531761, 10, -10 } ,
+ { 934809099, 10, -10 } ,
+ { 323284706, 10, -10 } ,
+ { 941270553, 10, -10 } ,
+ { 742321906, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 249716522, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 71152131, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 799285832, 10, -11 } ,
+ { 134335103, 10, -10 } ,
+ { 204739687, 10, -10 } ,
+ { 110687298, 10, -9 } ,
+ { 202836927, 10, -10 } ,
+ { 114730764, 10, -10 } ,
+ { 869354867, 10, -10 } ,
+ { 20171091, 10, -9 } ,
+ { 159474738, 10, -9 } ,
+ { 400488418, 10, -10 } ,
+ { 132020626, 10, -10 } ,
+ { 268252022, 10, -10 } ,
+ { 221558298, 10, -10 } ,
+ { 176428415, 10, -10 } ,
+ { 30109307, 10, -9 } ,
+ { 386552812, 10, -10 } ,
+ { 110363106, 10, -9 } ,
+ { 183431516, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 126377352, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 480857065, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 562579054, 10, -11 } ,
+ { 131288096, 10, -10 } ,
+ { 184310708, 10, -10 } ,
+ { 102807627, 10, -9 } ,
+ { 109321832, 10, -9 } ,
+ { 196419967, 10, -10 } ,
+ { 692431881, 10, -10 } ,
+ { 319251466, 10, -10 } ,
+ { 433306833, 10, -10 } ,
+ { 183743393, 10, -10 } ,
+ { 196349668, 10, -10 } ,
+ { 124607925, 10, -10 } ,
+ { 147867844, 10, -10 } ,
+ { 163972676, 10, -10 } ,
+ { 27175447, 10, -9 } ,
+ { 348716742, 10, -10 } ,
+ { 501222098, 10, -10 } ,
+ { 741191537, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 252005064, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 560381467, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 642332059, 10, -11 } ,
+ { 145358002, 10, -9 } ,
+ { 472351243, 10, -10 } ,
+ { 101846963, 10, -10 } ,
+ { 612908209, 10, -10 } ,
+ { 234749224, 10, -10 } ,
+ { 133185201, 10, -10 } ,
+ { 463246277, 10, -10 } ,
+ { 222462424, 10, -10 } ,
+ { 782822158, 10, -11 } ,
+ { 255736499, 10, -9 } ,
+ { 217278192, 10, -10 } ,
+ { 294869513, 10, -10 } ,
+ { 403238711, 10, -10 } ,
+ { 161398341, 10, -9 } ,
+ { 435790168, 10, -10 } ,
+ { 194176268, 10, -10 } ,
+ { 292647989, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 114031584, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 136229247, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 248670085, 10, -10 } ,
+ { 202497396, 10, -10 } ,
+ { 273632602, 10, -10 } ,
+ { 824449074, 10, -11 } ,
+ { 480672838, 10, -10 } ,
+ { 697682382, 10, -11 } ,
+ { 145882471, 10, -10 } ,
+ { 260311416, 10, -10 } ,
+ { 245494007, 10, -10 } ,
+ { 710894442, 10, -11 } ,
+ { 159704513, 10, -10 } ,
+ { 557030933, 10, -9 } ,
+ { 180520154, 10, -10 } ,
+ { 167571154, 10, -10 } ,
+ { 588555187, 10, -10 } ,
+ { 391978106, 10, -10 } ,
+ { 228082396, 10, -10 } ,
+ { 273312959, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 838134055, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 562580236, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 556005289, 10, -11 } ,
+ { 971883363, 10, -10 } ,
+ { 16553628, 10, -8 } ,
+ { 253724712, 10, -10 } ,
+ { 316367965, 10, -10 } ,
+ { 143022392, 10, -10 } ,
+ { 187260829, 10, -10 } ,
+ { 134340247, 10, -9 } ,
+ { 330298351, 10, -10 } ,
+ { 104229769, 10, -10 } ,
+ { 458881912, 10, -10 } ,
+ { 245041509, 10, -10 } ,
+ { 460525558, 10, -10 } ,
+ { 15730517, 10, -8 } ,
+ { 65665076, 10, -9 } ,
+ { 35728984, 10, -9 } ,
+ { 377735792, 10, -10 } ,
+ { 405661556, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 146426802, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 56254212, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 582439, 10, -8 } ,
+ { 24322843, 10, -8 } ,
+ { 155376007, 10, -9 } ,
+ { 103446998, 10, -10 } ,
+ { 341785283, 10, -10 } ,
+ { 238379721, 10, -10 } ,
+ { 156321091, 10, -10 } ,
+ { 629480599, 10, -10 } ,
+ { 267916992, 10, -10 } ,
+ { 899148713, 10, -11 } ,
+ { 41012435, 10, -9 } ,
+ { 253342519, 10, -10 } ,
+ { 806494439, 10, -10 } ,
+ { 463643925, 10, -10 } ,
+ { 853051564, 10, -10 } ,
+ { 736300728, 10, -10 } ,
+ { 229533128, 10, -10 } ,
+ { 343133576, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 120671764, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 479467818, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 100033415, 10, -10 } ,
+ { 174403753, 10, -10 } ,
+ { 273863931, 10, -10 } ,
+ { 245813503, 10, -10 } ,
+ { 211446385, 10, -10 } ,
+ { 800781349, 10, -11 } ,
+ { 13667358, 10, -8 } ,
+ { 274739025, 10, -10 } ,
+ { 14985226, 10, -8 } ,
+ { 570196002, 10, -10 } ,
+ { 170934385, 10, -10 } ,
+ { 18749468, 10, -9 } ,
+ { 46147312, 10, -9 } ,
+ { 329497383, 10, -10 } ,
+ { 373854954, 10, -10 } ,
+ { 815774557, 10, -10 } ,
+ { 180477963, 10, -9 } ,
+ { 471847133, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 163517944, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 459942482, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 104638787, 10, -10 } ,
+ { 212846605, 10, -10 } ,
+ { 317148714, 10, -10 } ,
+ { 114387393, 10, -10 } ,
+ { 48866886, 10, -9 } ,
+ { 852803317, 10, -11 } ,
+ { 19762792, 10, -9 } ,
+ { 298288228, 10, -10 } ,
+ { 330697497, 10, -10 } ,
+ { 10111737, 10, -9 } ,
+ { 205931078, 10, -10 } ,
+ { 253063499, 10, -10 } ,
+ { 21907889, 10, -9 } ,
+ { 212420418, 10, -10 } ,
+ { 156709745, 10, -9 } ,
+ { 416247081, 10, -10 } ,
+ { 359278648, 10, -10 } ,
+ { 352044044, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 113102598, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 453425367, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 559612711, 10, -11 } ,
+ { 129476362, 10, -9 } ,
+ { 157554455, 10, -9 } ,
+ { 115302726, 10, -10 } ,
+ { 33794224, 10, -9 } ,
+ { 144767677, 10, -10 } ,
+ { 210699199, 10, -10 } ,
+ { 16370499, 10, -8 } ,
+ { 456484229, 10, -10 } ,
+ { 108251433, 10, -10 } ,
+ { 638306278, 10, -10 } ,
+ { 26051178, 10, -9 } ,
+ { 668481371, 10, -10 } ,
+ { 771003253, 10, -10 } ,
+ { 733671842, 10, -10 } ,
+ { 418458708, 10, -10 } ,
+ { 24774792, 10, -9 } ,
+ { 373144746, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 127478204, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 352641768, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 473395974, 10, -11 } ,
+ { 451563226, 10, -10 } ,
+ { 115815706, 10, -9 } ,
+ { 898033891, 10, -11 } ,
+ { 331968986, 10, -10 } ,
+ { 168023472, 10, -10 } ,
+ { 121442499, 10, -10 } ,
+ { 648091157, 10, -10 } ,
+ { 236608989, 10, -10 } ,
+ { 943496434, 10, -11 } ,
+ { 252625931, 10, -9 } ,
+ { 201137788, 10, -10 } ,
+ { 194885956, 10, -9 } ,
+ { 7602439, 10, -8 } ,
+ { 509841939, 10, -10 } ,
+ { 338477012, 10, -10 } ,
+ { 180208275, 10, -10 } ,
+ { 33903801, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 11601413, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 336850167, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 834984234, 10, -11 } ,
+ { 116347474, 10, -10 } ,
+ { 172622778, 10, -10 } ,
+ { 104863061, 10, -9 } ,
+ { 163916017, 10, -10 } ,
+ { 709986854, 10, -11 } ,
+ { 91121094, 10, -9 } ,
+ { 182706551, 10, -10 } ,
+ { 353370315, 10, -9 } ,
+ { 878164167, 10, -10 } ,
+ { 110961483, 10, -10 } ,
+ { 136957332, 10, -10 } ,
+ { 155592805, 10, -10 } ,
+ { 173461013, 10, -10 } ,
+ { 234224623, 10, -10 } ,
+ { 278079036, 10, -10 } ,
+ { 608412278, 10, -10 } ,
+ { 652126107, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 232786557, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 498797866, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 532662737, 10, -11 } ,
+ { 303721833, 10, -10 } ,
+ { 654018275, 10, -10 } ,
+ { 123230737, 10, -10 } ,
+ { 634360504, 10, -10 } ,
+ { 256332306, 10, -10 } ,
+ { 314130805, 10, -10 } ,
+ { 294854335, 10, -9 } ,
+ { 323633143, 10, -10 } ,
+ { 110329234, 10, -10 } ,
+ { 47199233, 10, -9 } ,
+ { 237273939, 10, -10 } ,
+ { 940262894, 10, -10 } ,
+ { 882783027, 10, -10 } ,
+ { 465471209, 10, -10 } ,
+ { 327091869, 10, -10 } ,
+ { 333370969, 10, -10 } ,
+ { 409867176, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 248255009, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 426527295, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 504828712, 10, -11 } ,
+ { 877861561, 10, -10 } ,
+ { 103369678, 10, -9 } ,
+ { 98400955, 10, -10 } ,
+ { 327849051, 10, -10 } ,
+ { 137505967, 10, -10 } ,
+ { 141049335, 10, -10 } ,
+ { 265499168, 10, -9 } ,
+ { 267089464, 10, -10 } ,
+ { 944793578, 10, -11 } ,
+ { 784513918, 10, -10 } ,
+ { 245799467, 10, -10 } ,
+ { 54152399, 10, -9 } ,
+ { 115159226, 10, -9 } ,
+ { 703353893, 10, -10 } ,
+ { 352508278, 10, -10 } ,
+ { 205138445, 10, -10 } ,
+ { 340479354, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 120608907, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 89158293, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 793935098, 10, -11 } ,
+ { 292815566, 10, -10 } ,
+ { 496348838, 10, -10 } ,
+ { 320482177, 10, -10 } ,
+ { 470384157, 10, -10 } ,
+ { 149879759, 10, -10 } ,
+ { 265318772, 10, -10 } ,
+ { 420308795, 10, -10 } ,
+ { 757232715, 10, -10 } ,
+ { 692466663, 10, -10 } ,
+ { 585710069, 10, -10 } ,
+ { 226712473, 10, -10 } ,
+ { 154932244, 10, -9 } ,
+ { 338066638, 10, -10 } ,
+ { 13159674, 10, -8 } ,
+ { 417419553, 10, -10 } ,
+ { 344214742, 10, -10 } ,
+ { 61299565, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 506840071, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 619512453, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 575760418, 10, -11 } ,
+ { 455832669, 10, -10 } ,
+ { 452471333, 10, -10 } ,
+ { 940333263, 10, -11 } ,
+ { 491538657, 10, -9 } ,
+ { 188870005, 10, -10 } ,
+ { 108607514, 10, -10 } ,
+ { 289077578, 10, -10 } ,
+ { 198272273, 10, -10 } ,
+ { 706493025, 10, -11 } ,
+ { 472430393, 10, -10 } ,
+ { 187467081, 10, -10 } ,
+ { 545074646, 10, -10 } ,
+ { 207586676, 10, -10 } ,
+ { 729330963, 10, -10 } ,
+ { 277266781, 10, -10 } ,
+ { 166503905, 10, -10 } ,
+ { 379856465, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 935354912, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 132173817, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 101164895, 10, -10 } ,
+ { 23721452, 10, -9 } ,
+ { 435962091, 10, -10 } ,
+ { 215521593, 10, -10 } ,
+ { 121307367, 10, -9 } ,
+ { 99250212, 10, -10 } ,
+ { 633136039, 10, -10 } ,
+ { 396180858, 10, -10 } ,
+ { 118056408, 10, -9 } ,
+ { 786207804, 10, -10 } ,
+ { 234439376, 10, -10 } ,
+ { 231565709, 10, -10 } ,
+ { 265237957, 10, -10 } ,
+ { 350051463, 10, -10 } ,
+ { 870512457, 10, -10 } ,
+ { 458911987, 10, -10 } ,
+ { 682872187, 10, -10 } ,
+ { 510490698, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 152624729, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 796578517, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 891504666, 10, -11 } ,
+ { 237850702, 10, -10 } ,
+ { 515174853, 10, -10 } ,
+ { 133071382, 10, -9 } ,
+ { 300884054, 10, -10 } ,
+ { 139152427, 10, -10 } ,
+ { 415776583, 10, -10 } ,
+ { 320853709, 10, -10 } ,
+ { 689426113, 10, -10 } ,
+ { 163628341, 10, -10 } ,
+ { 22927759, 10, -9 } ,
+ { 209821143, 10, -10 } ,
+ { 651604859, 10, -10 } ,
+ { 259822622, 10, -10 } ,
+ { 924698942, 10, -10 } ,
+ { 658759036, 10, -10 } ,
+ { 103201988, 10, -9 } ,
+ { 911762979, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 820983252, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 329989386, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 813063161, 10, -11 } ,
+ { 116671814, 10, -10 } ,
+ { 142627711, 10, -10 } ,
+ { 235287072, 10, -10 } ,
+ { 137265286, 10, -10 } ,
+ { 49618091, 10, -10 } ,
+ { 412830738, 10, -9 } ,
+ { 155356283, 10, -10 } ,
+ { 11641287, 10, -8 } ,
+ { 564612174, 10, -10 } ,
+ { 987730942, 10, -11 } ,
+ { 130996172, 10, -10 } ,
+ { 118316454, 10, -10 } ,
+ { 127188268, 10, -10 } ,
+ { 212112975, 10, -10 } ,
+ { 29659707, 10, -9 } ,
+ { 118030121, 10, -9 } ,
+ { 36794212, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 132766978, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 633755849, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 526522469, 10, -11 } ,
+ { 238779739, 10, -10 } ,
+ { 485241445, 10, -10 } ,
+ { 988929924, 10, -11 } ,
+ { 258044378, 10, -10 } ,
+ { 886957975, 10, -11 } ,
+ { 153505769, 10, -10 } ,
+ { 69582759, 10, -9 } ,
+ { 32276217, 10, -9 } ,
+ { 233204112, 10, -10 } ,
+ { 357286757, 10, -10 } ,
+ { 524161361, 10, -9 } ,
+ { 370867377, 10, -10 } ,
+ { 447653748, 10, -10 } ,
+ { 451587316, 10, -10 } ,
+ { 286530343, 10, -10 } ,
+ { 217376377, 10, -10 } ,
+ { 312701312, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 180167782, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 634950597, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 576811117, 10, -11 } ,
+ { 40948123, 10, -9 } ,
+ { 236493195, 10, -10 } ,
+ { 983703044, 10, -11 } ,
+ { 547250341, 10, -9 } ,
+ { 806226181, 10, -11 } ,
+ { 122073492, 10, -10 } ,
+ { 240673195, 10, -10 } ,
+ { 411036737, 10, -10 } ,
+ { 723172056, 10, -11 } ,
+ { 567777232, 10, -10 } ,
+ { 17229413, 10, -9 } ,
+ { 1699609, 10, -8 } ,
+ { 16989614, 10, -9 } ,
+ { 633996758, 10, -10 } ,
+ { 258597512, 10, -10 } ,
+ { 173574912, 10, -10 } ,
+ { 366454254, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 826184002, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 446110155, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 930689747, 10, -11 } ,
+ { 188955383, 10, -10 } ,
+ { 26650192, 10, -9 } ,
+ { 101818937, 10, -9 } ,
+ { 234628481, 10, -10 } ,
+ { 437050198, 10, -10 } ,
+ { 155959121, 10, -9 } ,
+ { 432602632, 10, -10 } ,
+ { 951758931, 10, -10 } ,
+ { 319775229, 10, -10 } ,
+ { 190916813, 10, -10 } ,
+ { 190386542, 10, -10 } ,
+ { 208535777, 10, -10 } ,
+ { 358423145, 10, -10 } ,
+ { 4244424, 10, -8 } ,
+ { 475893109, 10, -10 } ,
+ { 136531535, 10, -9 } ,
+ { 651806569, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 288773346, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 402495463, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 355021417, 10, -11 } ,
+ { 1740439, 10, -8 } ,
+ { 339893453, 10, -10 } ,
+ { 999248233, 10, -11 } ,
+ { 194200016, 10, -10 } ,
+ { 115099321, 10, -10 } ,
+ { 10774056, 10, -9 } ,
+ { 947432376, 10, -10 } ,
+ { 244166135, 10, -10 } ,
+ { 791893043, 10, -11 } ,
+ { 213109015, 10, -10 } ,
+ { 145249708, 10, -10 } ,
+ { 329188612, 10, -10 } ,
+ { 562650852, 10, -9 } ,
+ { 314428467, 10, -10 } ,
+ { 22586983, 10, -9 } ,
+ { 159985565, 10, -10 } ,
+ { 337414822, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 30402675, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 639417278, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 651842218, 10, -11 } ,
+ { 362562412, 10, -10 } ,
+ { 69310141, 10, -9 } ,
+ { 109027649, 10, -10 } ,
+ { 317854018, 10, -10 } ,
+ { 106397607, 10, -10 } ,
+ { 169454658, 10, -10 } ,
+ { 715448119, 10, -10 } ,
+ { 30143295, 10, -9 } ,
+ { 906166826, 10, -11 } ,
+ { 344763191, 10, -10 } ,
+ { 411650197, 10, -9 } ,
+ { 502209474, 10, -10 } ,
+ { 656866496, 10, -10 } ,
+ { 725481559, 10, -10 } ,
+ { 456380647, 10, -10 } ,
+ { 245838984, 10, -10 } ,
+ { 383606033, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 114912675, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 675568272, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 732155053, 10, -11 } ,
+ { 764583795, 10, -10 } ,
+ { 48933922, 10, -9 } ,
+ { 121645422, 10, -10 } ,
+ { 388166104, 10, -9 } ,
+ { 108347846, 10, -10 } ,
+ { 153903493, 10, -10 } ,
+ { 317357609, 10, -10 } ,
+ { 26811706, 10, -9 } ,
+ { 842808073, 10, -11 } ,
+ { 750329481, 10, -10 } ,
+ { 235037816, 10, -10 } ,
+ { 238508977, 10, -10 } ,
+ { 233494927, 10, -10 } ,
+ { 908408828, 10, -10 } ,
+ { 489900933, 10, -10 } ,
+ { 224141678, 10, -10 } ,
+ { 453221022, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 111891809, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 54419974, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 731847209, 10, -11 } ,
+ { 379193751, 10, -10 } ,
+ { 103596747, 10, -9 } ,
+ { 139868859, 10, -10 } ,
+ { 682011584, 10, -10 } ,
+ { 145241076, 10, -10 } ,
+ { 237970094, 10, -10 } ,
+ { 156056625, 10, -9 } ,
+ { 456706345, 10, -10 } ,
+ { 128068098, 10, -10 } ,
+ { 382875221, 10, -10 } ,
+ { 819024421, 10, -10 } ,
+ { 833005001, 10, -10 } ,
+ { 978256502, 10, -10 } ,
+ { 817264777, 10, -10 } ,
+ { 452853998, 10, -10 } ,
+ { 473911567, 10, -10 } ,
+ { 488005358, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 150668047, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 101015904, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 827676807, 10, -11 } ,
+ { 738504245, 10, -10 } ,
+ { 923531919, 10, -10 } ,
+ { 1510221, 10, -8 } ,
+ { 726533601, 10, -10 } ,
+ { 140537362, 10, -10 } ,
+ { 367195445, 10, -10 } ,
+ { 613736483, 10, -10 } ,
+ { 483313954, 10, -10 } ,
+ { 347223868, 10, -10 } ,
+ { 534709093, 10, -10 } ,
+ { 105179944, 10, -9 } ,
+ { 735388448, 10, -10 } ,
+ { 603516286, 10, -10 } ,
+ { 870648698, 10, -10 } ,
+ { 430620662, 10, -10 } ,
+ { 371667063, 10, -10 } ,
+ { 466215159, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 144494214, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 464617825, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 877799726, 10, -11 } ,
+ { 201733248, 10, -10 } ,
+ { 259478762, 10, -10 } ,
+ { 25741826, 10, -9 } ,
+ { 241315031, 10, -10 } ,
+ { 751196232, 10, -11 } ,
+ { 650633229, 10, -10 } ,
+ { 254928552, 10, -10 } ,
+ { 516840166, 10, -10 } ,
+ { 387282712, 10, -10 } ,
+ { 230441962, 10, -10 } ,
+ { 20029912, 10, -9 } ,
+ { 193445635, 10, -10 } ,
+ { 198728648, 10, -10 } ,
+ { 735992464, 10, -10 } ,
+ { 372164094, 10, -9 } ,
+ { 113612272, 10, -9 } ,
+ { 399802135, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 215112688, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 12358072, 10, -8 } ,
+ { 0, 10, 0 } ,
+ { 743164023, 10, -11 } ,
+ { 431217323, 10, -10 } ,
+ { 207860361, 10, -9 } ,
+ { 133732115, 10, -10 } ,
+ { 36005288, 10, -9 } ,
+ { 284013242, 10, -10 } ,
+ { 386013116, 10, -10 } ,
+ { 791656799, 10, -10 } ,
+ { 370736774, 10, -10 } ,
+ { 115861264, 10, -10 } ,
+ { 34317587, 10, -9 } ,
+ { 264870901, 10, -10 } ,
+ { 717020208, 10, -10 } ,
+ { 523683173, 10, -10 } ,
+ { 991926941, 10, -10 } ,
+ { 596947924, 10, -10 } ,
+ { 380112108, 10, -10 } ,
+ { 425320649, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 191747045, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 667411204, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 660947351, 10, -11 } ,
+ { 75710136, 10, -9 } ,
+ { 101887943, 10, -9 } ,
+ { 204140758, 10, -10 } ,
+ { 593896607, 10, -10 } ,
+ { 313237958, 10, -10 } ,
+ { 271027524, 10, -10 } ,
+ { 157103198, 10, -9 } ,
+ { 427631922, 10, -10 } ,
+ { 122973386, 10, -10 } ,
+ { 33326555, 10, -9 } ,
+ { 255438591, 10, -10 } ,
+ { 601491988, 10, -10 } ,
+ { 111675713, 10, -9 } ,
+ { 620250448, 10, -10 } ,
+ { 467599523, 10, -10 } ,
+ { 549123548, 10, -10 } ,
+ { 427640215, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 161696209, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 33292574, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 639626643, 10, -11 } ,
+ { 184827558, 10, -10 } ,
+ { 645201551, 10, -10 } ,
+ { 84206791, 10, -9 } ,
+ { 203324463, 10, -10 } ,
+ { 410500332, 10, -10 } ,
+ { 579346098, 10, -10 } ,
+ { 265706777, 10, -10 } ,
+ { 497049464, 10, -10 } ,
+ { 124567492, 10, -10 } ,
+ { 173068214, 10, -10 } ,
+ { 159066889, 10, -10 } ,
+ { 215893228, 10, -10 } ,
+ { 516467441, 10, -10 } ,
+ { 298620628, 10, -10 } ,
+ { 262854868, 10, -10 } ,
+ { 81302133, 10, -9 } ,
+ { 125358613, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 308334045, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 340443744, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 847881865, 10, -11 } ,
+ { 116369929, 10, -10 } ,
+ { 163654085, 10, -10 } ,
+ { 499771957, 10, -10 } ,
+ { 15319688, 10, -9 } ,
+ { 591665838, 10, -11 } ,
+ { 1514963, 10, -7 } ,
+ { 171313283, 10, -10 } ,
+ { 38618659, 10, -8 } ,
+ { 38157175, 10, -9 } ,
+ { 105331457, 10, -10 } ,
+ { 136726062, 10, -10 } ,
+ { 137607715, 10, -10 } ,
+ { 158800545, 10, -10 } ,
+ { 314334194, 10, -10 } ,
+ { 286603908, 10, -10 } ,
+ { 803365262, 10, -10 } ,
+ { 509323507, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 168928713, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 67472008, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 66130248, 10, -10 } ,
+ { 781541653, 10, -10 } ,
+ { 106723829, 10, -9 } ,
+ { 111381922, 10, -10 } ,
+ { 454817891, 10, -10 } ,
+ { 152801604, 10, -10 } ,
+ { 167964618, 10, -10 } ,
+ { 142424053, 10, -9 } ,
+ { 301103403, 10, -10 } ,
+ { 106090713, 10, -10 } ,
+ { 113943874, 10, -9 } ,
+ { 260990032, 10, -10 } ,
+ { 802762208, 10, -10 } ,
+ { 737366097, 10, -10 } ,
+ { 890271225, 10, -10 } ,
+ { 759751663, 10, -10 } ,
+ { 2550525, 10, -8 } ,
+ { 382439098, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 131228715, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 494902123, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 560153655, 10, -11 } ,
+ { 381944956, 10, -10 } ,
+ { 557443858, 10, -10 } ,
+ { 257885603, 10, -10 } ,
+ { 698637192, 10, -10 } ,
+ { 150650105, 10, -10 } ,
+ { 179916164, 10, -10 } ,
+ { 157417415, 10, -9 } ,
+ { 337826218, 10, -10 } ,
+ { 106715575, 10, -10 } ,
+ { 278043356, 10, -10 } ,
+ { 210482544, 10, -10 } ,
+ { 529426392, 10, -10 } ,
+ { 207175211, 10, -9 } ,
+ { 507161761, 10, -10 } ,
+ { 556640825, 10, -10 } ,
+ { 323500068, 10, -10 } ,
+ { 617822907, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 783770519, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 400119588, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 845748697, 10, -11 } ,
+ { 138757456, 10, -10 } ,
+ { 200435548, 10, -10 } ,
+ { 488363248, 10, -10 } ,
+ { 178999363, 10, -10 } ,
+ { 121012204, 10, -10 } ,
+ { 138425801, 10, -9 } ,
+ { 204935223, 10, -10 } ,
+ { 104388034, 10, -9 } ,
+ { 183287682, 10, -10 } ,
+ { 140160734, 10, -10 } ,
+ { 154060345, 10, -10 } ,
+ { 157425042, 10, -10 } ,
+ { 229266121, 10, -10 } ,
+ { 305959128, 10, -10 } ,
+ { 676643114, 10, -10 } ,
+ { 188257777, 10, -9 } ,
+ { 854713942, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 156270882, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 435061358, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 855804798, 10, -11 } ,
+ { 119611609, 10, -10 } ,
+ { 16157666, 10, -9 } ,
+ { 261583075, 10, -10 } ,
+ { 155863278, 10, -10 } ,
+ { 569557961, 10, -11 } ,
+ { 26056838, 10, -8 } ,
+ { 173936604, 10, -10 } ,
+ { 238783592, 10, -9 } ,
+ { 753998803, 10, -10 } ,
+ { 106248897, 10, -10 } ,
+ { 139869946, 10, -10 } ,
+ { 140374552, 10, -10 } ,
+ { 151002568, 10, -10 } ,
+ { 23419196, 10, -9 } ,
+ { 3016624, 10, -8 } ,
+ { 102206782, 10, -9 } ,
+ { 435112384, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 144078064, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 446197771, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 685411011, 10, -11 } ,
+ { 436446557, 10, -10 } ,
+ { 356257133, 10, -10 } ,
+ { 199202915, 10, -10 } ,
+ { 38173639, 10, -9 } ,
+ { 269643008, 10, -10 } ,
+ { 290005248, 10, -10 } ,
+ { 49133914, 10, -9 } ,
+ { 536797424, 10, -10 } ,
+ { 21007669, 10, -9 } ,
+ { 113921258, 10, -9 } ,
+ { 244893338, 10, -9 } ,
+ { 253501871, 10, -10 } ,
+ { 261582797, 10, -10 } ,
+ { 835013316, 10, -10 } ,
+ { 782247752, 10, -10 } ,
+ { 342464805, 10, -10 } ,
+ { 533299288, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 655441055, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 503009036, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 584666544, 10, -11 } ,
+ { 240274446, 10, -10 } ,
+ { 406715284, 10, -10 } ,
+ { 150737437, 10, -10 } ,
+ { 260869955, 10, -10 } ,
+ { 132919059, 10, -10 } ,
+ { 326747259, 10, -10 } ,
+ { 821159837, 10, -10 } ,
+ { 349556615, 10, -10 } ,
+ { 108079644, 10, -10 } ,
+ { 422917542, 10, -10 } ,
+ { 811090272, 10, -10 } ,
+ { 629142224, 10, -10 } ,
+ { 266703508, 10, -9 } ,
+ { 470821585, 10, -10 } ,
+ { 110169845, 10, -9 } ,
+ { 282413248, 10, -10 } ,
+ { 468238884, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 440924797, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 133131887, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 103202822, 10, -10 } ,
+ { 150727304, 10, -10 } ,
+ { 21971692, 10, -9 } ,
+ { 409658489, 10, -10 } ,
+ { 260895448, 10, -10 } ,
+ { 697625684, 10, -11 } ,
+ { 124732517, 10, -9 } ,
+ { 221068513, 10, -10 } ,
+ { 23918394, 10, -8 } ,
+ { 246801835, 10, -10 } ,
+ { 136176289, 10, -10 } ,
+ { 186434085, 10, -10 } ,
+ { 168373032, 10, -10 } ,
+ { 184615253, 10, -10 } ,
+ { 381161154, 10, -10 } ,
+ { 45173742, 10, -9 } ,
+ { 123563607, 10, -9 } ,
+ { 504022704, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 173424012, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 175563748, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 963367693, 10, -11 } ,
+ { 254770856, 10, -10 } ,
+ { 315224652, 10, -10 } ,
+ { 131358091, 10, -10 } ,
+ { 521769643, 10, -10 } ,
+ { 899345116, 10, -11 } ,
+ { 303737935, 10, -10 } ,
+ { 303886769, 10, -10 } ,
+ { 633276719, 10, -10 } ,
+ { 121583447, 10, -10 } ,
+ { 579052761, 10, -10 } ,
+ { 237864273, 10, -10 } ,
+ { 226147155, 10, -10 } ,
+ { 229323795, 10, -10 } ,
+ { 104673204, 10, -9 } ,
+ { 281718206, 10, -9 } ,
+ { 400221093, 10, -10 } ,
+ { 379167663, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 122053448, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 102599249, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 881525461, 10, -11 } ,
+ { 136265594, 10, -10 } ,
+ { 198516728, 10, -10 } ,
+ { 186702654, 10, -9 } ,
+ { 238146344, 10, -10 } ,
+ { 806665943, 10, -11 } ,
+ { 665429111, 10, -10 } ,
+ { 193930247, 10, -10 } ,
+ { 160069155, 10, -9 } ,
+ { 234356256, 10, -10 } ,
+ { 128279141, 10, -10 } ,
+ { 158944393, 10, -10 } ,
+ { 148158492, 10, -10 } ,
+ { 168785666, 10, -10 } ,
+ { 330446771, 10, -10 } ,
+ { 364074471, 10, -10 } ,
+ { 127195326, 10, -9 } ,
+ { 33349052, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 339507015, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 440393015, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 895316324, 10, -11 } ,
+ { 145063658, 10, -10 } ,
+ { 201478438, 10, -10 } ,
+ { 135814793, 10, -9 } ,
+ { 203460497, 10, -10 } ,
+ { 78886449, 10, -10 } ,
+ { 10432399, 10, -8 } ,
+ { 200630628, 10, -10 } ,
+ { 177097472, 10, -9 } ,
+ { 360479594, 10, -10 } ,
+ { 13619281, 10, -9 } ,
+ { 476546796, 10, -10 } ,
+ { 156783511, 10, -10 } ,
+ { 175116758, 10, -10 } ,
+ { 383466867, 10, -10 } ,
+ { 44221352, 10, -9 } ,
+ { 124499443, 10, -9 } ,
+ { 359506593, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 307754124, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 502084946, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 509524518, 10, -11 } ,
+ { 208020997, 10, -10 } ,
+ { 194560553, 10, -10 } ,
+ { 791829163, 10, -11 } ,
+ { 645137055, 10, -9 } ,
+ { 666167553, 10, -11 } ,
+ { 878534549, 10, -11 } ,
+ { 209579158, 10, -10 } ,
+ { 157876633, 10, -10 } ,
+ { 546102974, 10, -11 } ,
+ { 236625291, 10, -10 } ,
+ { 153899574, 10, -10 } ,
+ { 145090173, 10, -10 } ,
+ { 144629305, 10, -10 } ,
+ { 904768869, 10, -10 } ,
+ { 233114311, 10, -10 } ,
+ { 135660914, 10, -10 } ,
+ { 325883275, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 695911891, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 200664177, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 88610363, 10, -10 } ,
+ { 26289662, 10, -9 } ,
+ { 32196175, 10, -9 } ,
+ { 10805005, 10, -9 } ,
+ { 211225909, 10, -9 } ,
+ { 915763852, 10, -11 } ,
+ { 154857352, 10, -10 } ,
+ { 305046147, 10, -10 } ,
+ { 264042218, 10, -10 } ,
+ { 866609035, 10, -11 } ,
+ { 284862375, 10, -10 } ,
+ { 236261889, 10, -10 } ,
+ { 225569263, 10, -10 } ,
+ { 218648448, 10, -10 } ,
+ { 26621877, 10, -8 } ,
+ { 45295706, 10, -9 } ,
+ { 261538137, 10, -10 } ,
+ { 357396914, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 106726788, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 145485943, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 162446051, 10, -10 } ,
+ { 182755519, 10, -10 } ,
+ { 258086715, 10, -10 } ,
+ { 473782424, 10, -10 } ,
+ { 504974503, 10, -10 } ,
+ { 818947174, 10, -11 } ,
+ { 983230998, 10, -10 } ,
+ { 257340409, 10, -10 } ,
+ { 194912805, 10, -9 } ,
+ { 293403206, 10, -10 } ,
+ { 169685589, 10, -10 } ,
+ { 51115137, 10, -9 } ,
+ { 194757326, 10, -10 } ,
+ { 206241542, 10, -10 } ,
+ { 59051652, 10, -9 } ,
+ { 455868215, 10, -10 } ,
+ { 803570624, 10, -10 } ,
+ { 547830328, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 186604024, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 34427866, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 509481138, 10, -10 } ,
+ { 133110177, 10, -10 } ,
+ { 183763566, 10, -10 } ,
+ { 221129487, 10, -9 } ,
+ { 189695962, 10, -10 } ,
+ { 124460146, 10, -10 } ,
+ { 681100254, 10, -10 } ,
+ { 18165551, 10, -9 } ,
+ { 963924059, 10, -10 } ,
+ { 225263726, 10, -10 } ,
+ { 139807479, 10, -10 } ,
+ { 137130833, 10, -10 } ,
+ { 14143175, 10, -9 } ,
+ { 163059771, 10, -10 } ,
+ { 347448586, 10, -10 } ,
+ { 613481972, 10, -10 } ,
+ { 7370224, 10, -8 } ,
+ { 108898224, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 14182971, 10, -8 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 378738645, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 915103653, 10, -11 } ,
+ { 117903863, 10, -10 } ,
+ { 170146776, 10, -10 } ,
+ { 28109302, 10, -9 } ,
+ { 155701178, 10, -10 } ,
+ { 573577291, 10, -11 } ,
+ { 139357991, 10, -9 } ,
+ { 177016215, 10, -10 } ,
+ { 345632627, 10, -9 } ,
+ { 365200633, 10, -10 } ,
+ { 105408359, 10, -10 } ,
+ { 144556191, 10, -10 } ,
+ { 141536732, 10, -10 } ,
+ { 161802307, 10, -10 } ,
+ { 235515853, 10, -10 } ,
+ { 313757106, 10, -10 } ,
+ { 154050666, 10, -9 } ,
+ { 470920991, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 154167303, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 205251157, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 896378365, 10, -11 } ,
+ { 241665372, 10, -10 } ,
+ { 288900344, 10, -10 } ,
+ { 302898696, 10, -10 } ,
+ { 290058157, 10, -9 } ,
+ { 884332549, 10, -11 } ,
+ { 325805086, 10, -10 } ,
+ { 288707099, 10, -10 } ,
+ { 340287893, 10, -10 } ,
+ { 101171712, 10, -10 } ,
+ { 256592036, 10, -10 } ,
+ { 230186464, 10, -10 } ,
+ { 206858164, 10, -10 } ,
+ { 20606356, 10, -9 } ,
+ { 105538193, 10, -9 } ,
+ { 665158049, 10, -10 } ,
+ { 328540547, 10, -10 } ,
+ { 438833448, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 130047398, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 133989191, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 10418721, 10, -9 } ,
+ { 161844381, 10, -10 } ,
+ { 234523362, 10, -10 } ,
+ { 923019708, 10, -10 } ,
+ { 361266907, 10, -10 } ,
+ { 804256444, 10, -11 } ,
+ { 886877367, 10, -10 } ,
+ { 232659075, 10, -10 } ,
+ { 194533855, 10, -9 } ,
+ { 233196772, 10, -10 } ,
+ { 15087379, 10, -9 } ,
+ { 194510196, 10, -10 } ,
+ { 175527261, 10, -10 } ,
+ { 193859298, 10, -10 } ,
+ { 418678349, 10, -10 } ,
+ { 506963755, 10, -10 } ,
+ { 117704206, 10, -9 } ,
+ { 636579305, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 245185901, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 365896003, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 896888356, 10, -11 } ,
+ { 119580265, 10, -10 } ,
+ { 159774073, 10, -10 } ,
+ { 268123299, 10, -10 } ,
+ { 149031387, 10, -10 } ,
+ { 537551728, 10, -11 } ,
+ { 239541538, 10, -9 } ,
+ { 168170863, 10, -10 } ,
+ { 269044351, 10, -9 } ,
+ { 257797304, 10, -10 } ,
+ { 102914367, 10, -10 } ,
+ { 141619603, 10, -10 } ,
+ { 129120915, 10, -10 } ,
+ { 147534888, 10, -10 } ,
+ { 227926768, 10, -10 } ,
+ { 313331268, 10, -10 } ,
+ { 147581679, 10, -9 } ,
+ { 432255393, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 148220639, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 299638054, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 751752729, 10, -10 } ,
+ { 223098572, 10, -10 } ,
+ { 312914894, 10, -10 } ,
+ { 1295922, 10, -8 } ,
+ { 446064267, 10, -10 } ,
+ { 868305974, 10, -11 } ,
+ { 351136401, 10, -10 } ,
+ { 29647722, 10, -9 } ,
+ { 396182672, 10, -10 } ,
+ { 114139633, 10, -10 } ,
+ { 226203041, 10, -10 } ,
+ { 248468153, 10, -10 } ,
+ { 220022215, 10, -10 } ,
+ { 215550592, 10, -10 } ,
+ { 161084586, 10, -9 } ,
+ { 752569776, 10, -10 } ,
+ { 571237983, 10, -10 } ,
+ { 382835407, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 121798133, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 7531428, 10, -8 } ,
+ { 0, 10, 0 } ,
+ { 10424355, 10, -9 } ,
+ { 155597893, 10, -10 } ,
+ { 214943315, 10, -10 } ,
+ { 342189343, 10, -10 } ,
+ { 432528084, 10, -10 } ,
+ { 673747717, 10, -11 } ,
+ { 135011525, 10, -9 } ,
+ { 217913289, 10, -10 } ,
+ { 179446427, 10, -9 } ,
+ { 313554644, 10, -10 } ,
+ { 146767517, 10, -10 } ,
+ { 182038315, 10, -10 } ,
+ { 166503887, 10, -10 } ,
+ { 181115286, 10, -10 } ,
+ { 357941887, 10, -10 } ,
+ { 618649579, 10, -10 } ,
+ { 194345112, 10, -9 } ,
+ { 477040785, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 170830749, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 779754187, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 100800507, 10, -10 } ,
+ { 155672513, 10, -10 } ,
+ { 209193531, 10, -10 } ,
+ { 422752051, 10, -10 } ,
+ { 71492891, 10, -9 } ,
+ { 708062479, 10, -11 } ,
+ { 143990221, 10, -9 } ,
+ { 217344648, 10, -10 } ,
+ { 202195154, 10, -9 } ,
+ { 415151633, 10, -10 } ,
+ { 145267349, 10, -10 } ,
+ { 177665267, 10, -10 } ,
+ { 167954319, 10, -10 } ,
+ { 182231377, 10, -10 } ,
+ { 337034028, 10, -10 } ,
+ { 360039832, 10, -10 } ,
+ { 137859312, 10, -9 } ,
+ { 524425378, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 180135767, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 194386925, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 675594674, 10, -11 } ,
+ { 207061379, 10, -10 } ,
+ { 287247603, 10, -10 } ,
+ { 861397362, 10, -11 } ,
+ { 319827064, 10, -10 } ,
+ { 72942949, 10, -10 } ,
+ { 15065738, 10, -9 } ,
+ { 270728224, 10, -10 } ,
+ { 253620914, 10, -10 } ,
+ { 748556931, 10, -11 } ,
+ { 167209337, 10, -10 } ,
+ { 498745357, 10, -9 } ,
+ { 189816204, 10, -10 } ,
+ { 176870804, 10, -10 } ,
+ { 868646774, 10, -10 } ,
+ { 316259966, 10, -10 } ,
+ { 244295783, 10, -10 } ,
+ { 278238773, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 881542719, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 576809889, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 793677668, 10, -11 } ,
+ { 155493596, 10, -9 } ,
+ { 570770648, 10, -10 } ,
+ { 599038993, 10, -10 } ,
+ { 369895459, 10, -10 } ,
+ { 141602743, 10, -10 } ,
+ { 444434311, 10, -10 } ,
+ { 342840845, 10, -10 } ,
+ { 626455728, 10, -10 } ,
+ { 240068081, 10, -10 } ,
+ { 998889999, 10, -10 } ,
+ { 230846118, 10, -10 } ,
+ { 279616785, 10, -10 } ,
+ { 262435365, 10, -10 } ,
+ { 909504185, 10, -10 } ,
+ { 764512186, 10, -10 } ,
+ { 424715386, 10, -10 } ,
+ { 172307064, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 454205512, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 427342761, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 880594859, 10, -11 } ,
+ { 134145756, 10, -10 } ,
+ { 186472017, 10, -10 } ,
+ { 133665336, 10, -9 } ,
+ { 188481036, 10, -10 } ,
+ { 784768683, 10, -11 } ,
+ { 149245212, 10, -9 } ,
+ { 19511124, 10, -9 } ,
+ { 20264351, 10, -8 } ,
+ { 837888349, 10, -10 } ,
+ { 125826852, 10, -10 } ,
+ { 151377208, 10, -10 } ,
+ { 160568408, 10, -10 } ,
+ { 175580504, 10, -10 } ,
+ { 266377614, 10, -10 } ,
+ { 309409014, 10, -10 } ,
+ { 90946517, 10, -9 } ,
+ { 712898624, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 27965938, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 691466612, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 102564379, 10, -10 } ,
+ { 153529962, 10, -10 } ,
+ { 227696588, 10, -10 } ,
+ { 547982995, 10, -10 } ,
+ { 223080251, 10, -10 } ,
+ { 777905076, 10, -11 } ,
+ { 106918701, 10, -9 } ,
+ { 251140216, 10, -10 } ,
+ { 235002996, 10, -9 } ,
+ { 474990904, 10, -10 } ,
+ { 14746425, 10, -9 } ,
+ { 180391406, 10, -10 } ,
+ { 189251494, 10, -10 } ,
+ { 36846651, 10, -9 } ,
+ { 345793211, 10, -10 } ,
+ { 516558998, 10, -10 } ,
+ { 135630533, 10, -9 } ,
+ { 580025196, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 20570262, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 692030134, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 789790153, 10, -11 } ,
+ { 391853281, 10, -10 } ,
+ { 10740184, 10, -8 } ,
+ { 383417495, 10, -10 } ,
+ { 231060635, 10, -9 } ,
+ { 116319741, 10, -10 } ,
+ { 358366619, 10, -10 } ,
+ { 360401515, 10, -10 } ,
+ { 71005069, 10, -9 } ,
+ { 203911596, 10, -10 } ,
+ { 287814116, 10, -10 } ,
+ { 228811847, 10, -10 } ,
+ { 44997154, 10, -9 } ,
+ { 262451869, 10, -10 } ,
+ { 829499932, 10, -10 } ,
+ { 419631724, 10, -10 } ,
+ { 634035178, 10, -10 } ,
+ { 548710918, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 236434127, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 250484066, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 101567397, 10, -10 } ,
+ { 336093334, 10, -10 } ,
+ { 413926269, 10, -10 } ,
+ { 499496721, 10, -10 } ,
+ { 448052935, 10, -10 } ,
+ { 120563198, 10, -10 } ,
+ { 276682197, 10, -10 } ,
+ { 568802795, 10, -10 } ,
+ { 694375352, 10, -10 } ,
+ { 142138613, 10, -10 } ,
+ { 451198751, 10, -10 } ,
+ { 259157841, 10, -10 } ,
+ { 665143468, 10, -10 } ,
+ { 30112052, 10, -9 } ,
+ { 749318419, 10, -10 } ,
+ { 742937998, 10, -10 } ,
+ { 466035791, 10, -10 } ,
+ { 564012253, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 334130431, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 49763193, 10, -9 } ,
+ { 0, 10, 0 } ,
+ { 100521213, 10, -10 } ,
+ { 144940084, 10, -10 } ,
+ { 202652473, 10, -10 } ,
+ { 314243883, 10, -10 } ,
+ { 198746562, 10, -10 } ,
+ { 75375228, 10, -10 } ,
+ { 176413994, 10, -9 } ,
+ { 209671347, 10, -10 } ,
+ { 205176295, 10, -9 } ,
+ { 551833452, 10, -10 } ,
+ { 130751131, 10, -10 } ,
+ { 170983665, 10, -10 } ,
+ { 169779837, 10, -10 } ,
+ { 183037487, 10, -10 } ,
+ { 287272293, 10, -10 } ,
+ { 357946515, 10, -10 } ,
+ { 142487681, 10, -9 } ,
+ { 322892354, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 309659031, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 552057147, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 640358765, 10, -11 } ,
+ { 840814826, 10, -10 } ,
+ { 398842876, 10, -10 } ,
+ { 113358289, 10, -10 } ,
+ { 386530703, 10, -9 } ,
+ { 230267981, 10, -10 } ,
+ { 133328747, 10, -10 } ,
+ { 415962743, 10, -10 } ,
+ { 23790003, 10, -9 } ,
+ { 821997491, 10, -11 } ,
+ { 106217542, 10, -9 } ,
+ { 22020376, 10, -9 } ,
+ { 466897864, 10, -10 } ,
+ { 263494367, 10, -10 } ,
+ { 543349144, 10, -10 } ,
+ { 319792265, 10, -10 } ,
+ { 192708719, 10, -10 } ,
+ { 430024744, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 114961691, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 571474729, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 124858836, 10, -10 } ,
+ { 182647338, 10, -10 } ,
+ { 248937234, 10, -10 } ,
+ { 29919864, 10, -9 } ,
+ { 239559384, 10, -10 } ,
+ { 762497216, 10, -11 } ,
+ { 149618198, 10, -9 } ,
+ { 245964803, 10, -10 } ,
+ { 155489128, 10, -9 } ,
+ { 281402789, 10, -10 } ,
+ { 159780681, 10, -10 } ,
+ { 218967719, 10, -10 } ,
+ { 187023633, 10, -10 } ,
+ { 208419881, 10, -10 } ,
+ { 351038384, 10, -10 } ,
+ { 464719172, 10, -10 } ,
+ { 223098719, 10, -9 } ,
+ { 542482148, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 195355515, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 726595248, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 742304868, 10, -11 } ,
+ { 314639743, 10, -10 } ,
+ { 506268244, 10, -10 } ,
+ { 125936823, 10, -10 } ,
+ { 365750734, 10, -10 } ,
+ { 130423437, 10, -10 } ,
+ { 198586921, 10, -10 } ,
+ { 675956533, 10, -10 } ,
+ { 36581224, 10, -9 } ,
+ { 112691748, 10, -10 } ,
+ { 266841789, 10, -10 } ,
+ { 41407322, 10, -8 } ,
+ { 664434392, 10, -10 } ,
+ { 947045795, 10, -10 } ,
+ { 536725292, 10, -10 } ,
+ { 385587257, 10, -10 } ,
+ { 290906322, 10, -10 } ,
+ { 459113237, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 137798607, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 367059742, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 71768412, 10, -10 } ,
+ { 284116161, 10, -10 } ,
+ { 315598564, 10, -10 } ,
+ { 240642075, 10, -9 } ,
+ { 306150486, 10, -10 } ,
+ { 179739563, 10, -10 } ,
+ { 331656268, 10, -10 } ,
+ { 599438781, 10, -10 } ,
+ { 683615963, 10, -10 } ,
+ { 163710597, 10, -10 } ,
+ { 911025421, 10, -10 } ,
+ { 175856056, 10, -10 } ,
+ { 236247247, 10, -10 } ,
+ { 305379173, 10, -10 } ,
+ { 415740809, 10, -10 } ,
+ { 322247622, 10, -10 } ,
+ { 359930937, 10, -10 } ,
+ { 135586338, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 1003281, 10, -7 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 452237831, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 118277096, 10, -10 } ,
+ { 151606937, 10, -10 } ,
+ { 2190649, 10, -8 } ,
+ { 410170897, 10, -10 } ,
+ { 198878133, 10, -10 } ,
+ { 776888604, 10, -11 } ,
+ { 112882516, 10, -9 } ,
+ { 231302027, 10, -10 } ,
+ { 330483969, 10, -9 } ,
+ { 40588069, 10, -9 } ,
+ { 134083658, 10, -10 } ,
+ { 18537867, 10, -9 } ,
+ { 186899652, 10, -10 } ,
+ { 22088258, 10, -9 } ,
+ { 292994754, 10, -10 } ,
+ { 380219255, 10, -10 } ,
+ { 933853353, 10, -10 } ,
+ { 68264763, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 208689164, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 481121339, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 591678373, 10, -11 } ,
+ { 331477542, 10, -10 } ,
+ { 706766732, 10, -10 } ,
+ { 136226568, 10, -10 } ,
+ { 331207861, 10, -10 } ,
+ { 20457819, 10, -9 } ,
+ { 177320457, 10, -10 } ,
+ { 107339605, 10, -9 } ,
+ { 408750748, 10, -10 } ,
+ { 145165748, 10, -10 } ,
+ { 381734657, 10, -10 } ,
+ { 257348378, 10, -10 } ,
+ { 112627103, 10, -9 } ,
+ { 302416226, 10, -9 } ,
+ { 552336855, 10, -10 } ,
+ { 392439666, 10, -10 } ,
+ { 264889191, 10, -10 } ,
+ { 534877679, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 174575927, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 471021698, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 122597719, 10, -10 } ,
+ { 160823261, 10, -10 } ,
+ { 222620352, 10, -10 } ,
+ { 412387035, 10, -10 } ,
+ { 204601584, 10, -10 } ,
+ { 78586271, 10, -10 } ,
+ { 129641174, 10, -9 } ,
+ { 236482048, 10, -10 } ,
+ { 284537785, 10, -9 } ,
+ { 402823826, 10, -10 } ,
+ { 139792429, 10, -10 } ,
+ { 192683208, 10, -10 } ,
+ { 187393607, 10, -10 } ,
+ { 219499311, 10, -10 } ,
+ { 304398201, 10, -10 } ,
+ { 403231276, 10, -10 } ,
+ { 106861144, 10, -9 } ,
+ { 675065982, 10, -11 } ,
+ { 0, 10, 0 } ,
+ { 212883567, 10, -10 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } ,
+ { 0, 10, 0 } } } } ,
+ params {
+ pseudocount 0 ,
+ rpsdbparams {
+ matrixName "BLOSUM62" ,
+ gapOpen 11 ,
+ gapExtend 1 } } }
diff --git a/demotic/examples/example-single.fa b/demotic/examples/example-single.fa
new file mode 100644
index 0000000..2bca26a
--- /dev/null
+++ b/demotic/examples/example-single.fa
@@ -0,0 +1,1159 @@
+>A9B431_HERA2/73-422 A9B431.1
+SVAAMGVYPYITAQIIMQLLIPLIPALEQLSKEGEQGRNRIQRYQYFLTVPLAYLQGYGQ
+IKSLINSGINLFGTLNFSITENFFQTFSILTIMVSGSMFLVWMGELIDERGIGNGLSMII
+FGGIVTALPSMVYQAITTSSSGNNVIGGILLLIVTLATVVGIVLITEGQRRIPVQYAKRV
+RGNKVYGGQSSHLPLKVNMAGMIPLIFAQSILIFPSTVASYFWNPNGSGFFNGVANFFVN
+SFGPNGLAFTLAMFVLVLLFTYFYALVMFNQQNLPEMLQRNGGFIPGIRPGRNTEVYLTK
+VLNRITLIGAVGLAVVAALPYFVQQITGLQIGFSSTGLLIVVGVAVDTMR
+>A8CRX1_9CHLR/78-422 A8CRX1.1
+SVAALGVYPYITASIIMTLLTPVIPKLTALSKEGEAGRNKINTITHWLAVPTAALAGYSQ
+LLLLQREGAVAQTEPLAAVAIVLSIVAGTMFMVWLGEQITSYGIGNGISLIIFAGIVAGL
+PDMIGRGLMASDQFAGLAVYAFMALLTTVLIVIFTEAHRRIPVQYAQTVIRSGKMYRRGG
+ESHIPLRVNSAGMIPLIFASALVMLPGLVASYFMAGSTEDPNFWNTIYNIFNSGASMPGG
+LVYWGLYFFMTIIFAFFYTMVTFEQQDIPGTLQRQGGFVPGIRPGKMTDQYLSGVIGRIT
+WAGALFLGFVAIMPFIAREVTGIQVIQLSSFGMLIVVGVALDTMK
+>A2Y4E5_ORYSI/132-498 A2Y4E5.1
+SFFQLGISHQISASIVMQVLFYPLFGPALLFSNGNVLCHVLPSLEKLRKEGLDGHEKIKG
+YIWWLSLGFALVAAFTVSCYSLQYSIYAASYRVKHVMITSLFLVLGAMTMTWICDTISES
+GFGHGSSLIICVGILTGYTDTLHKMLTQFSGNWYSCWHYILGIAGTFILVTMGAVLVTEG
+CRKIKLQYYGFKLASGARSESSPVTEVEPYIPFNINPTGMQPLLTTSYLLAFPSIMASIF
+GTQFWESLKETLNPKTSVGGGPWAYYLTYAFLVFVFNIFDIANLPKEISDYLNKMSARVP
+KIKPGRATVEYLTKIQTSTRFWGGILLSLLATSSLLLDRYLRQINEGFSIGFTSVLIIVG
+SIIELRR
+>Q7UZW2_PROMP/80-422 Q7UZW2.1
+GIFALGILPFINASIIIQLLTASLPVLEDLQKNEGEAGRRKIAQITRYVSLGWGFLQSII
+FSLILRQYAIEGISETAFVLQTSIALVTGSMIVMWFSEIITEKGIGQGASLVIFLNIVAT
+LPKALSSTIEKAQTGDRGDVLGIAVLLGVFLLTIVGIIFVQEGARRIPIVSAKRQIGNSS
+LLPTRQSYLPLKLNAGGVMPIIFASALIFLPITVANVTGNPILIKIAGSLNPGSSNPWPY
+ALTFFALILGFSYFYASLTINPVDVASNLKKGGVAIPGVRPGSNTANYLSGIQNRLTLLG
+GLFLGSVAIIPAAVERATNVQTFQGLGATSLLILVGVAIDTAK
+>Q7NKT4_GLOVI/79-416 Q7NKT4.1
+GVFMLGILPYINASIIMQLLVPVFPKLEDLQKNEGEQGRRQIAQYTRYLALGWAIIQSIG
+VAIYIKPFVADWSPLFVIQTTLALTAGAIFVMWLGELITEKGIGNGASLLIFVSIVSSLP
+TAFSQTFQLLQADSSRVAGVVVLLLVFLAMIVGIVFVQEGTRRIPIISARRQVGPRRQQY
+QQQQTSYLPLRVNQGGVMPIIFASSLLYLPLTFAQFARNATVDQVVNAISSGWIHNILYL
+VLILFFSFFYATLIINPEDVSKNLKRMGSSIPGVRPGTATSEYIAKVMNRLTFLGAIFLS
+AVAIIPTFVEQGTGITTFNGLGATSLLILVGVAIDTVR
+>SECY_GUITH/68-404 P28527.2
+GVFALGIVPYINASIIVQLATNSIPSLEKLQKEEGELGRQKIVQLTRYVALVWALIQSIG
+VSFWVRPYVFNWDLNFVFAMSLTLTIGSMLIMWFSEQITEKGIGNGPSLLIFINIISGLP
+KLLQSQIQSTRLNIQALDIFVLVFIFSVMIIGIIFIQEGIKRIPIISARQLGKGQMDNKT
+SYLPLKLNQSGVMPIIFASAVLVLPAYLAQLVSNEQLRTVLHLFDGTSNNKLLYLLFYFT
+LILFFSYFYTSLILNPNDVSKNLKKMESSIYGVRPGKATTEYLQKTLNRLTFLGALFLAF
+IAIVPNIIETLTNLSVFKGLGGTSLLIIVGVQVDTSK
+>SECY_CYACA/62-394 P46249.2
+SVFALGIIPYINATITIQILSSAFPALKKLQSEEGEIGKKKLNKITKYLSFCFAFIESLA
+IVLRLQKYAFDWNLYFIVQTTLILISGAMLVMWLADNISYKGIGTGASVIIFVNIASAFA
+KFLLNQLFVHSIKFLDFASYFALIVFSIACIVFVQEAIRKVPIISAKQLDSTSFYSNDYF
+LPLRINQGGVMPIILASSLLALVDYVIRYGLSTLQAVYFINDILPFKILFLLLYSAFIIF
+FNYLYCSLVLNCFELSNNLKKASVVIPSIRPGKMTEKFFKDTLDNLTLFGSGFLAFIVLA
+PNFLEFVFHIRVFKGLAVSSLLIVVGVAIDLIK
+>Q85FU6_CYAME/42-325 Q85FU6.1
+GWFVLGIIPTINASIVMQILISIVPALTRLQKEEGEMGQKQIQKYTRYLTFFLAGIQAFT
+LSQQWCTWLLIVSGAMLVMWLAEQMTHKGIGNGTSIFVCSNIAANFLHHPIEAPWSLAMV
+VLIFTMLGMIALQEAVRAIPILSAKQLIQSIAQVYLLPMRLNQGGVMPIIFASSTLALLH
+TWSIWWLYVACIIFFSHFYNLVIANPKELSENLNKMAVVIPSIRPGAETQQYLNRTLNRM
+SWIGGIALSLIALLPWLFSSLKIFSGFGATSLLIVIGVSIDTMR
+>A0T0J6_PHATR/72-407 A0T0J6.1
+GLFTLNIFPYINASILVQLILGFSPKLSKLQKEGDLEGRRSINRLTRLITLMFALIQSVS
+LALYLKQILFNWNYSLAIEIGLWLTTGAMIVLWLSELITDYGLGNGASLLIYTNIISSLP
+NLSKTILSENSQNFTLGSEIGIVLLIFTSLYGIVFLQEGVRIIPLISSKQLNQSSLQDSV
+TSNNYIPLRFNQAGVMPIILTTTILVVPNYVNNLGLLPKIDLPINFESLNFVYWIGYFVL
+ILVFSSFYSTIVLNPKDISDQLQKMAVTIPGIRPGIQTTFYLKQVMKRITLLGTTMLATL
+ATIPNFVESTLSITSLNGLSTTSLLILAGVVLDLVR
+>SECY_CYAPA/109-459 P25014.2
+GFFTLGILPYMNASFFLQVLTKILPSLERFQKEQEEIAQREFKKWTRYLTVIWAFIQSIV
+ISWIWIRPYALNWDFFLGLKVVVALTLGAVIVMIIAEQITEIGLTNGSSLLIFINIIARI
+PNSIEQLFNSNINWTFPMISSLILSLSLSFITMFVIIGLQESGRPVPVLIARQEAERQKF
+NEPITEAERRKTQAYIFFQLLPAGIMPVIFASTIFDLALPAFTNFLLQQGNWGYQLIKSF
+PFNSLFKDFCYLITIMLFSSNYALTIMINPKTLAENLNSMNALIPGVRPGSETKVYSEQL
+IHRLNFIGSFVLALVCILPSIVERSLGLPKLQILSPVSISIALGVAVDTTR
+>Q4G351_EMIHU/63-407 Q4G351.1
+GIGSLGILPYINASIIIQLLTPLFPNLERLQKEEGELGRQQISRYTRYLTCIWAIVLSSA
+IAFFLIKPITFGWSLKLGLEIVLSLTVGSILSMWFAELITEESLGNGSSMIIFINIVGGI
+PNNLSSLSKTFSAANLASAIPLLLTGLGIYLGIVLIIIFFQESYKKITIVSAKQLNLTTS
+AQTQSERLANNSFIPLKLNQGGIMPLVFSSTIAVVFMYPAQILLSSALLTNAAGLASKLL
+TIYSFGINFVLVIFFSCFYVSLVLKPKDMSENLGKMAYSIPGIRQGKETTKYLEKVINRL
+AFIGGLFLAFLAFFPLFVGNFIQFGLFKNLTSLLILIGVITDTTS
+>SECY_PAVLU/66-404 P28540.2
+SILTLGLGPFFSASLAVQFLVKLYPAFEKLQNEEGEEGRKTIVRYTRILTVLFCIIESFF
+LSNSLRSFVFNWNSISYFVVAAAVTTGSLVLVWLSEVITERGIGNGSSLLILIGNLSRFR
+FLINKDDFDSLNVSSQSNLYIIYIIITLVSMLIFSTLSQEGARKIPVVSAKQLIDGVEDD
+MRRSYIPIRFGQAGVVPIIFSSSILLFLTTSIKQLPNANIATRVILDSVNLQQIFYFFTF
+LVLIIFFSFFYTLIILSPSDIAKNLKKMSSVIQDTKPGVATKVYIRKFILQASFVGSILL
+SALILIPSILAAALGVHPLSISGITSLILSFSIINDTVR
+>Q6B8X0_GRATL/62-395 Q6B8X0.1
+GIFALGIVPYINASIMMQLLTKLIPELENLQKEEGESGRQKIGQLTRYFTLIWSILQSIG
+ISLWIKPYVFNWNYYFILDSIIALGTGSLIIMWFAEIITEYGIGNGASLLIFQNIISGIP
+KNIQNYKINIYDKQTIINGSFLFLLFVLILIINILIQECKRKIMIVSAKQLSKFTTSNPR
+SYIPLKLNQGGVMPIVFASATMALPIYFSNNIEVPNINNVINLFLPGRILYFPAYGSLII
+AFSYFYTSLVLNPDDIAENLNKMGASIPSIRPGSDTIRYISKILDKMTFMGGVFLFIIAL
+IPSLIAYITHTSLLQGLGTTSLLILVGVAIDTAK
+>SECY_ANTSP/62-390 Q37143.1
+GIFALGIVPYIYASIIIQLLIKLIPYLENLQKEEGEIGRQKINQLTRYLTLLWALIQSLS
+IAIWINHMYLIHLFELCASLTTSSMIAMWFSEIISEYGVGNGPSLLIFQNIISSIPKNLQ
+NYTFNIGTTNTVLNGSLILSFGIIILIINILIQEGERKIAILSAKQLGKINELNHKVIFL
+LKLNQGGVMPFVFASAVVHTFLFISNNTNSKITQFINLFLPNQFLYLPLYLIFIITFSYV
+YTSLILNPEDIAKNLKKMGASIPNIRPGSETIKYLNTRINRLTLIGACFLFTITLFPTIT
+YYIFKINTLKGLGATSLLILVGVAIDTAK
+>A4RW47_OSTLU/65-398 A4RW47.1
+GIFSLGIVPYINSSIIFQLLGSVFPELKKLQKEEGEAGRRKFQQYQRYGALGFAIVQAVG
+QCLYVRPFVEDFTPIWLFEQSCALTAGAMILMYIGELLNEIKLGNGTSLLIFANIVSALP
+SSVGQTVSMAQEKGDSSVLAVFFGAFALTTLGIVYVQEAERKIPMNYSTRFNAGGLAKSS
+YLPFKVNSAGVMPIIFASSLLALPATLTRFTDNGAVLGVARFLSPGGGAGYVPVNVAMIC
+FFNYFYTFLQLEPKDVADQLKRQGASIPGVRPGAATRDYITRVLERLSVLGSVFLGALAL
+TPGAVEQITGLQTFRGFAGTSLLILVGVATDSAR
+>A7PFA4_VITVI/131-465 A7PFA4.1
+GICSLGIVPFINAQIVFQLLTQIYPKLQDLQKREGETGRKKVLQYTRYASVGFALVQAIG
+QVLFLRPYVNDFSTQWVLSSVTLLTLGSVLTTYIGERISDLKLGNGTSLLIFTSIISYLP
+ASFGRTVAQAFQDGNYIGLVIIIISFFLLVLGIVYVQEAERKIPLNYASRYTNKSGGLQK
+STYLPFKVNSSGVMPIIFSTSSLALPGTVSRFTGLAALKKAALALNPGGSLYLPTNILLI
+AFFNYYYTFLQLDPDDVSEQLKRQGASIPLVRPGKSTAAFIKMVLSRISVLGSGFLAILA
+AGPSLVEQTTHLTAFRGFAGTSVLILVGCATDTAR
+>A7HM32_FERNB/75-404 A7HM32.1
+SVFSMSVTPYINASIIMQLLASIIPSLKELLKEGEEGRKKFQHYTKNLTLGLAALQSFVV
+SFGLARSYQGIIAINTWLFSFVSTVSLVAGTMFLLWIGDRITEKGIGNGVSIMIFAGIVS
+RYPAYFRSAVLGNLNIFGWIFLIAVAIFMVVAIIYVQQAERRIKIEYATRMVGRRIYGGT
+STYLPIKVNHSGVIPIIFAWAIISIPEAIAQITGAQWAIKLFSMQSPLMMIIYALLIFFF
+TYFYSVVVIDPKDISENIKRYGGFIPGIRAGKPTEEYITFVLNRVTFLGAIFLVGISLLP
+YLVEGITRVNIWLGGTSALIAVGVALDIAQ
+>A3CK84_STRSV/69-416 A3CK84.1
+SVFALGVSPYITASIVVQLLQMDLLPKFVEWGKQGEVGRRKLNQATRYIALVLAFVQAIG
+ITAGFDTLSRANLVANPNVQTYALICVLLATGSMIVTWLGEQITDKGYGNGVSMIIFAGI
+VSAIPDMIKGIYEDYFVNIPSERLTSSFIFVGILIVAVLLIIYFTTFVQQAEYKIPIQYT
+KVAKGAPSSSYLPLKVNPAGVIPVIFASSITAAPAAIFQVVSALGYDADWVKTAQSLLAT
+TTISGMFMYAFLIVLFTFFYTFVQINPEKTAENLQKSGAYIPGVRPGKGTEDYMSKLLRR
+LATVGSLFLGFISILPILAKDVFGLTDAVALGGTSLLIIISTGIEGMK
+>Q5FM71_LACAC/68-415 Q5FM71.1
+SIFSLGVSPYITAQIVIQLLQMDIVPTLVEWGKQGEVGRRKTNQVTRYLTLVVAFVQSIG
+ITLGFNALTQMGLVKNQTPQTYVEIAIIMTAGTMLLTWLGDEITDKGLGNGVSVIIFAGI
+IARLPSGLWQIYKEEIINNSASDRWQGILFFIAVIVAILIVTQLVTWVEQADRRIPIQYT
+RRATISGSESFLPLKVNVSGVIPVIFASSFIITPATILMAFQRTQGDQQWFKVLNQIFSL
+QTTPGVIIYTLLIILFTFFYAFVQVNPEKLAENLQKQGAYIPSVWPGKDTQNYISKMLIK
+LSTVGSIFLGLVALLPQLATNFWNLPSSIGLGGTSLLIVIGVVLELSR
+>Q03ZM6_LEUMM/68-416 Q03ZM6.1
+SLFAMGVSPYVTAQIIVQLLQLDIVPRFVEWSKQGEVGRRKLNNATRWLTLVLAFVQSVG
+ITAGFNSLSSYGLVSQTNSVMSFVVIGSVMTIGTFFAMWLGEMITEKGLGNGVSMIIFAG
+IIAQAPEGFYEIFKENILQADSSDMLNGWIFVVVLVIAMILVVAFTTWSYEGTRRLQMQY
+TRSATSYGSEAYLPLKVNVSGVIPVIFASSFISTPQTVMLAFQDKYSSAQWYQIMQQIFS
+MTTLPGAILYTALIVVFTYFYAFVQVNPDKLSENLQKQGAYIVGVRPGAETKAFVSKLLL
+NLSFVGSIFLGVVALVPLIASDVWGLNEKIGLGGTSLLISIGVALDLIR
+>SECY_STAA8/69-413 O08387.2
+SIFAMGIVPYITASIVMQLLQMDIVPKFSEWAKQGEVGRRKLNNVTRYLAISLAFIQSIG
+MAFQFNNYLKGALIINQSIMSYLLIALVLTAGTAFLIWLGDQITQFGVGNGISIIIFAGI
+LSTLPASLIQFGQTAFVGQEDTSLAWLKVLGLLVSLILLTVGAIYVLEAVRKIPIQYAKK
+QTAQRLGSQATYLPLKVNSAGVIPVIFAMAFFLLPRTLTLFYPDKEWAQNIANAANPSSN
+VGMVVYIVLIILFTYFYAFVQVNPEKMADNLKKQGSYVPGIRPGEQTKKYITKVLYRLTF
+VGSIFLAVISILPILATKFMGLPQSIQIGGTSLLIVIGVAIETMK
+>Q4MG72_BACCE/68-415 Q4MG72.1
+SIFAVGITPYITASIIVQLLQMDVIPKFSEWAKQGEMGRKKSAQFTRYFTIILAFIQAIG
+MSYGFNNIAGGQLITDQSWTTYLFIATVLTAGTAFLLWLGEQITANGVGNGISMIIFAGL
+VAAIPNVANQIYLQQFQNAGDQLFMHIIKMLLIGLVILAIVVGVIYIQQAVRKIPIQYAK
+AVSGNNQYQGAKNTHLPLKVNSAGVIPVIFASAFLMTPRTIAQLFPDSSISKWLVANLDF
+AHPIGMTLYVGLIVAFTYFYAFIQVNPEQMAENLKKQNGYVPGIRPGKSTEQYVTKILYR
+LTFIGAIFLGAISILPLVFTKIATLPPSAQIGGTSLLIIVGVALETMK
+>Q6F1X5_MESFL/92-454 Q6F1X5.1
+SILALGVSPYITASIIVQLLSTDVVPILTRWNKSGERGRKKLDKLTKVLMIPFALMQGIA
+TIFTLQQQGVIEPGWSSDNVLASPAFYYVLVPLVMLAGSYFMLWIADQITIKGVGNGISI
+VIFIGIIVQLPNQIKATYDFWIPSNESINVFFDGIIKFSIYMLVFFVVIFSVVLMNEAER
+KVPIQQTGSGLIDSKDHTPYLPLKLNNAGVIPVIFASALISTPITIAQIIDPTASTSTVD
+SANAFVRFTQHYLSFNTWWGIGIFAVMIVLFTFLYAQVQINPEKISENFQKSGTFIPGIK
+PGKDTTNFLKGTINRLSLFGAIFLAAIAALPYVISKLTNLPSQLAIGGTGLIICISVAIQ
+TTQ
+>Q6KI36_MYCMO/87-436 Q6KI36.1
+SIVALGISPFITASLVMQILQTKLFPPIYRLSQSGPIGRRKINIITRAITIFLGVVQSMT
+IVSALSAQNSFISLTNEFNVFWYQFIILPVILIAGTVFSIFIGDQITDKGVGNGTTLLIF
+TGIVITLPTQFTATFNALVGEQQRVSSLSNGIVTFISYVFGFIILMYIIGFVYNAERRIP
+IQQVGAGRAKNEKELSYLPIKINPGGISPIIFALIIISFPQLFASVFPISNPFRIWVESN
+LRPNNTIGFILFISITFIFAIFFGLQQSKVDKIAEDFAKNSTFIPGIKPGQETETYLTGI
+VLRLCFFSAFYLIIIGGMQFAQQLAGVPENISFGGTSVIILVTASYETIT
+>Q4A5I3_MYCS5/83-437 Q4A5I3.1
+SIFALGISPFINASLIMMILQSRLFPMIYKLTQSGPQGRRKLNIATRILTFIIAYPQAVF
+LTKSLTAGERNSSFITLVSIDGFSVDLLVYFLLPMILISASLFALFLSEQITNKGVGNGT
+SIIIMTGIAARLPFQMQNAFKIFVGDLSQSGTLVGILNFVTYIFIYLACLMVIGIFYNAE
+RRIPIQQTGAGRSKALKEIGSLPIKLNPAGIMPIIFAMLVLSLPTLIANILPNDNYSKQW
+INENLQFYKPLGFSLLIIITFVFSLLMGIQQSKVDKIAEDFAKNGTFIPKVTPGEETQNY
+LVAIVFRLSFFSAFYLVIIAGMQYVQIMTGILQPSIAFGGTSLMILVSVSIETIS
+>Q98Q01_MYCPU/90-438 Q98Q01.1
+SIVSLGINPFITASLIMTILQSKLFPPIQKMSQSGPLGRKKINVITRLLTLVFAFPQAIV
+LTQTLSRENGFISIDQEFKTIANIYVLLPLILVAGSLFTLFLSEQITDKGIGNGTSLIIF
+SGISLSLPSQFRAAFNVLVGTNKTTLFTGLIHFLLYLFGYLLLIVIIVFVYLAERRIPIQ
+QTGAGLSKNIKEMGSLPIKVNPAGIMPVIFSMIVISFPLLIAGLLDRSTSLVRLWIERHL
+AFTHPIGFSLLIIITFIFSIFMGLQQSKIDKISEDFNKSGTFIPGLRPGDQTENYLIDVV
+LRLSTFSAFYLSILVSIQYIMQMAGMPAAISFGGTSMMILVSVSLETID
+>Q4AAF9_MYCHJ/85-434 Q4AAF9.1
+SVVALGISPFITASLFMLIAQTKLFPPIHRLSQSGPAGRRKINIITRFLTLLVAVIQAVV
+LIRTVILNPDYGFVRLEINTPVFIWLVLPLVLVAGSLFSLFLAEQITDKGVGNGTSLLIF
+SGIVVGLPRRFQHAFEYLVDLSFSSSLISQVLSFILYIFGFLLILLIAIYVYLAERKIPI
+QQTGSGMSKNIKEISILPLKLNPAGIMPVIFALIIVSLPTLFSGFLDRNTSAVRNWIDNN
+MQIYHPIGLIIFIVFNVSFSIIMSLQQSRVDKIAQDFAKNSTFIPGIRPGEQTEDYLISV
+VLRLSVFSAIYLTFLGILQPVEIMLGLPSAITISGTSIIILATTTLETIS
+>Q9PQP1_UREPA/76-434 Q9PQP1.1
+SLFAIGIGPYITAQIIMQLLSSELVPPLAKLSKSGERGRKKIEVITRIITLPLAVMQAVI
+IINLMTRANGFISIVSNAPFAIGSPLFYVTYIFLMVGGTYISLFLADLISKKGVGNGITL
+LILTGIVASLFNHFIAIFSNLGSLTSSKVSQIIGFILYILFYIMILIGVVFVNNSTRKIP
+VQQTGQALILDHEKLPFLPIKIMTAGVMPVIFASSVLAIPAQVAEFLDKQSMGYYVIHNY
+FIVDSWTGLAIYVVLILLFTFFFSYVQLNPPKMAEDIKKAGRFIPGVQVGMDTEKHITKV
+IYRVNWIGAPILAFLACLPHLVALVAKTINHGIPVIQPSTIFGGTSIIIMVTATLELWN
+>SECY_MYCGE/81-430 P47416.1
+SLFAVGISPYISAQIIMQLLSTDLIPPLSKLVNSGEVGRRKIEMITRIITLPFALVQAFA
+VIQIATNAGTGSSPISLANSGSEFIAFYIIAMTAGTYMAVFLGDTISKKGVGNGITLLIL
+SGILSQLPQGFIAAYNVLSGIVITLTPQLTAAISFFIYFLAFLVLLFATTFITQATRKIP
+IQQSGQGLVSEVKTLPYLPIKVNAAGVIPVIFASSIMSIPVTIAQFQPQTESRWFVEDYL
+SLSTPVGIFLYAVLVILFSFFYSYIQINPERLAKNFEKSGRFIPGIRPGNDTEKHIARVL
+IRINFIGAPFLTVIAIIPYIVSYFIRLPNSLSLGGTGIIIIVTAVVEFIS
+>Q8EUD2_MYCPE/81-433 Q8EUD2.1
+SFMAIGVSPYITAQIIVQLLSSDLIKPLTRLSKAGERGKRKLEIITRLITIPFAIMQAYA
+VLSLAGTQGLVSSFFGQSALSSVPAGQIILLLLGMTAGTYLTIFISDIISKRGVGNGVTL
+IILSGIVASIYPNFTSVFQVLTGSSQISNQLLRYFSFAVYLVFFFLILLATTFVNGSVRK
+IPIQQIGQGLSKEVDEMPYLPIKLNAAGVIPVIFASSIMTIAPTISQFLPSGSAGSEFIN
+EYLSIERPVGLVIYTVLIVLFGFFYSHIQVNSEKLAENFQKSGKFIPGVKMGEETQKYIS
+KTLNRVNCIGVPFLACLAIVPYLITMTTGIPNGIAIGGTGVIIMVTGSLDFWS
+>Q7X4E3_9MOLU/69-399 Q7X4E3.1
+CILSLGVIPYVTASIVIQLSQKVFTFMKEWQEQGEKGKRKINIVTRVLTIFLSLGHGWAL
+CQTEKLVLGPYLLFSTLFFLTVGVFISIWLADLITSKGLGNGISILIAVGMVDKLFKTFK
+YLLSNSNGFETQRILILVSYFVLLILTIILSSAYLKIPINYAXNRNNDKIDKYIPIKLNT
+SGILPIILADTLLNVIQQISMLFSKNGKVNEYIGIFVESRSELGIYFFVYILLIMLFSFF
+SSFMTINPKDVAEHLSKQNAYLKDVQPGLPTVKKIVREMFKITFLGSCFLTLLASTPDII
+NYLAGIKISQNIPFSGTSLLIIVGVALESIQ
+>Q5Q069_ASTYP/59-398 Q5Q069.1
+TLFGLGITPYITASIVVQFLQKLLPICREWKDQGQMGKRKLNLLTRSLALFFAFGQSFAF
+LNSYSKLLVTSISTRQLFLLALIATAGVAILIWFADLINSKGIGNGTSILIVVSMSHSLI
+NLFANLNKSYLSKNTFLTLKTFNFACIVLLLLLFLIFTVVVQITSLKIPINYARNQSQGK
+SYIPLKINSAGVMPVILAFALLQPFQILAGVIGNDKLTKYVNLFTNTNSSNNQINFFAIG
+FLVLLVIVLSFFSAFMNVNPEDISEHLSKQDAYIAGLRPGEQTTRYLANTLFKITVLGTV
+FITALVVTPILMEHFLSLKDMKLGGTSLLIIVSVALETIQ
+>O21257_RECAM/57-372 O21257.1
+SLFALNITPIITYLFLEQLYYIYSIPLISKKKNLNKDLIKKYSVYIFLMISYLEGFIYLN
+HLYNTTSSSFLIFYLDNTINYLLCLNFLVIGSCFLYFFAKLINIYGIGKGLSFIIFINIV
+GSFIDIFYKYLIQIETLNVKYLVFLLFVQCLFCGIIYFYIDFLFLKIPIIKLNFVGNEND
+NYNYLNYFQKYQTSSLNLLGILPFILVYSIIYMLKLNLNSFLDLVFNIFLEMLCMMFIYL
+FLSRFLKKYLKFIYNINKNNIYIEHINKNIYSIFFISHLYYLGILRDYCLFCFLFIFSKL
+FFIISYLFIEIDFSFF
+>Q74NB9_NANEQ/69-457 Q74NB9.1
+SIVSLGIGPIIIGYLLAELFIGSGELNIDITTEEGKRKFENLARFFMIVFGLFESIVMAT
+IGWFKPSQFLISLFAMPFSFLGSNAFLIGYILAVLFIVAQLMLGVILAYLLDDLSQKWGF
+TSGINLFILATVSRELFVQLFNPLTQIPGTPTPPIGKIPQIFYFISQGLYTEAIVVGLQL
+LVIVLVILLSVYFYMVKIPIPTSFGKIPEKSLRYEVRLIYTGNIPVIFAFAFLHQILLIA
+WVLQQLGIPLLGTIENGHPINGLVAYIYPDTGFLISLILGNLTLDNLIRTITSSLFFLGS
+SILFSIYFVLATGQDSEGLAKQLSKMFGRIGLKRDYRIIKHYLDKIIPCVTVLGGFIVGF
+LALLSYWVSIPIGGTSILLATMISYMVYE
+>Q2EMT2_METVO/30-379 Q2EMT2.1
+TLITLGIGPIVTAGIIMQLLIGSELVKLDMSKPDNRALFQGLQKAFGIFLCFLEAGMFVL
+AGAFGALTPMMSLALILQLAIGAILLIYLDEIVSRYGIGSGIGLFIAAGVSQTIFVGALG
+PQGYLWKFFSALVSGSMGPALEYILPILATIAVFFVVVYAESIRVEIPLAHGRVKGAVGK
+YPIKFIYVSNLPVILAAALFANFQLWGLVLYKIGFPLLGTYSNGRAIDGIAYYFSTPYGL
+SSVISDPIHAIVYTLFLIGFCVLFGLFWVETSGLDAKSMAQRLGGLNMAIKGFRKSNKSI
+ENRLKRYIKPITVMGSAFVGLLAALADFTGALGGGTGVLLTVSIVYRFYE
+>A5UL65_METS3/72-433 A5UL65.1
+SILTLGIGPIVTASIVLQLLVGSKLLDLDLSSPEDKSQYQATQKILSIVFTMFEAGVLVL
+TGSLVPIDNSYLGVLFLQLVIGAILIIYLDEVISKWGFGSGIGLFIAAGVCEAIIVGTFS
+FIPGPGGVYGGAIPAFIQSFWSSSIDFSVLIPLIATAAVFFVVVYGESMRVEIPISHGSV
+RGHGRIRGSVGKYPLKFVYASNMPVILTSALLVNVSLLASVFQKIGFPILGEIVNGKAVS
+GIALYLSTPNDVSLLVTDPVRVIVYAFFFLLCAVLFSYLWVEISGLNAKKISEQLYKSGI
+QIPGFRSSKRQLYKILKKYIPALTIISGLYVGIIAFCADLTGALGGGTGVLLTVGIIHKI
+YE
+>SECY_METTH/73-436 O26134.1
+SILTLGIGPIVSASIILQLLVGGKILKLDLSRHEDKAFFQGLQKLLAIVFTFFEALIFVL
+TGSLAPSAPQFVWVLILQLTIGGILIIFLDEVVSKWGFGSGVGLFIAAGVSQEIIVGAFN
+PLSAPTQPGVPAGRITGFLYLLFTGQSPDFQYYVLPVLALIAVFLVVVYAESMRVEIPIS
+MGGGKRLSRGAVGKYPLRFIYASNMPVILTSALLLNVQLLANVFQKLGYPILGTVSNGQA
+VDGLAYLLTAPRSIDALILDPFRVVFYAVVFIGLCVLFAWLWVEISNIGPRHVARQLYQM
+GMQIPGFRSSRGQFEKILKRYIPTITILGGAFVGLLAFVADLTGSLGGGTGVLLTVGIVY
+RLYE
+>SECY_PYRAB/72-448 Q9V1V8.1
+SILTLGIGPIVTAGIILQLLVGSEIIKLDLANPEDRRFYQALQRVFSVFMCFLEAAIWVL
+GGAFGRVGVDVTYAIAALMILQLAFGGIILIVLDELVSKWGIGSGISLFIAAGVSQRILT
+RSLNPLTDPNIIDPLTGKPAIVGAIPYFIQHILKGDLKGALYRGGTAPDMMAVIATIIVF
+LVVVYFESMRVEIPLGYRGVTIRGRYPIRFLYVSNIPIILTFALYANIQLWARVLDRLGH
+PWLGTFDPTTGNPVGGFVLYVIPPRSIFTVIDNPVRALVYLILTVISSLIFGFLWVELTG
+LDARTIARQLQRAGLQIPGFRRDPRTLERVLQKYIPYVTFWGSLTVALIAVLADFLGALG
+TGTGILLTVGILYRFYE
+>Q8TZA9_METKA/75-435 Q8TZA9.1
+SILTLGIGPIVTASILLQLLVGGDLIKLDLTNPEDRRLFQGLQKLLAIVLCFFEGVMMVF
+SGAAPPAEPSILLEILLILQLALGGILVIFLDEVVSKWGIGSGVGLFIVAGVSSQIIIGA
+FNPLPSPQQPGRPAGAVWAFLYSAMQGTPDWTLLAPVIGAIITFLIVLYVEGMRVEIPIA
+FAGIRGARGRFPVRLLYTSNIPVILASALFMNVRLWALAFQRMGVPILGKLDPRGQPISG
+LVYYLSPPNSIVKTLSDPLQALGYMMAMVIASVFFAVLWVELTGMGPREIARHLHRAGLH
+IPGFRRDIRVLEKRLQKYIYPVTVMGGAFVGFLAAGADLMGALGGGTGVLLTVSILYNMY
+E
+>Q9HIT0_THEAC/82-514 Q9HIT0.1
+SLMDLGIGPIVTASIVMQLFVGAKIFNLDLQNAEDKAIYQGVQKLLVIIMIFVEAIPQAF
+GYLVPDTKVVNSINAVFPGYGEFLAQTIIILQLFFGSYLVFLMDEVVSKYGIGSGISLFI
+AADVSEQLFIGAFNWQALNNALTYSLTNPPAGAFPKMFYIIMHSSSSYLLTNGVVQILFS
+PPNPMIAVLGTLLIFFLVAYFQSSKIELPISHERVRGARGRYPLQLLYASNIPVILATAL
+LANVSMWTLLFWSSPVLSKVPILGHNPLLGSYPTTAQATALNISATTPTGGLAYYLFSPN
+GLSDWLFPILQPSGYQNILLGHTPLQEAIHIIVFTAFMVGFSVLFAIFWIETTNMGASAV
+AKQIQASGMQIPGFRRDPRVMERVLKKYIPAITIFSGAVVGLLAAGANLIGTVGDTSGTG
+LLLAVGIIIQFYE
+>Q2QAQ7_9EURY/161-583 Q2QAQ7.1
+SIMHLGIGPIVTGSIIMQLFAGAKIIKLDLGDSDDKQLYQGVQKILVLIMIPVESIPQVY
+GFLDASPALVSDFGQGWANAIIVSQLFIGSLLVFLLDELVSKWGIGSGISLFIAAGVAQS
+TFVGTLSPLAVNPGAYGLQNPPAGTLPMIFYTLRTATFSEMVTANGFESILLGDAAHPNA
+VVALFSSVVVFLVVAYAESSKLELPLTHGKVRGHRGQYPIRLVYASNIPVILMAALLANL
+NMFTLLFWSHPTMSTVPILGSQGAWSIAPYLGSYDVGQTQATDGFAWYASMVNGVGDWLL
+PLLNQSPDPYGHSLWQVVLHVITYVTVMTLGSMMFAKFWIETTNMGAKDVAKQIENTGMQ
+IPGFRKNPKVLERILMRYIPPVTLFSGAFVGLLAAGADLLGTVGNATGTGLLLAVGIILR
+TYE
+>Q0W1W5_UNCMA/75-487 Q0W1W5.1
+SIILLGIGPIVMASIVLQLLVGAELIPLDTTDPKDQAIFQGLQKLMVFVMIVVEALPQIY
+GGFLLPDPAIAATLGVSTGIIQLLIFAQVALGGVLILYMDEIVSKWGIGSGVSLFIVAGI
+AQALVGGIFNWNPPYPGQAMGLNVDIAGLGARENLPIGIIFRWEWLLNNIGLSQLLTGEN
+LIVLLYQGEILALLATIIIFLLIVYVESTRIEIPLAHAAVRGARGKFPVKLIYASVLPMI
+LVRSLQATLEMVGLLLYRNGITFLGTFNQYNQPVDGLMFYINPINGLSDWVPQLAALNYP
+GIQLWQIALHVFTDAFILIAGGILFAIFWVETTGMGASRVARQIQKSGMQIPGFRRNEQV
+IEKVVSRYIPKVTVIGGAFVGFLTLLSSLFGILGAVSGTGMLLAVSITYQLYE
+>SECY_ARCFU/73-471 O28377.1
+SIIALGIGPIVTASIILQLLVGAGIIKLDLTNPEDRAAYQDFQRFLVFVMIAVEAIPQIA
+GGLLKPDLNLAAQLGVSPGIISFLIFIQLFIGGVLIVYMDEVVSKWGIGSGVSLFILAGI
+AQSIVVGLFNWVIPPNSAMPAGIIPRWIWIAQNYPLDQLFTGSGLAFLLIQGGILALITT
+AAIILLVVFFEGTRVEIPLAHAVARGARGRFPIKLIYASVLPMIFVRALQANVVALGQVL
+HARGVTIFGEFVNGKAVSGLMFFLQPVSSPYDWIPSLVKSQGAAFAAIPDWMIYLHLLID
+ALILVVGGIIFAWFWVETSGMDARTVASQIAKSGMQVPGFRKSPQVLERVLSRYIPKVTI
+LGGAIIGILTLVANMLGTIGNVSGTGLLLAVSIAYRFYE
+>Q8TRS4_METAC/72-470 Q8TRS4.1
+SLVLLGIGPIVTASIVLQLLVGADIIKMDLSDPKDQAFFQGAQKFLVFVMIILEALPQLL
+GGYIQPDPGLAATLNVGLGVITLLLLVQIFIGGTLILFMDEVVSKWGIGSGVGLFIVAGI
+SQQIVTGIFNWEFEEGLPVGLIPKWIYIAQNTGADYLFSGEGLMFLLVRGGILALLSTVA
+IFLLVVYVESTRIEIPLAHSAVRGARGRFPVKLIYASVLPMILVRALQANIQMVGIILAS
+RGITFLGEFSGSKPLNGIMYYLAPIHSPYDWIPSLVRESFASYGATAPAIWQIGLHVLAD
+AIMLIGGGIIFALFWIETTGMGAKPTAQKIFNSGMQIPGFRRNIGSIEKVMQRYIPKVTV
+IGGAFIGILTLVASLLGTLGSAGGTGLLLTVSIVYRLYE
+>A0B9U7_METTP/75-515 A0B9U7.1
+SLMLLGIGPIVTASIVLQLLVGAEIIKLNLRDPRDQAIFQGTQKALVFVMIVVEALPQIT
+GGYLLPDQALATSLGVSLSIISLIIFLQVCLGGVLILYMDEVVSKWGIGSGVGLFIVAGV
+SQQLVTGLFNWATGDGGLPIGIVPKWISIIRLGLIGLDEIFTAEGLKFIFVTGGLLALIS
+TVGIILLVVLVESTRIEIPLAHSRVRGARGRFPVKLVYASVLPMILVRALQANIEMLGAL
+LTAKLGTVTTAETTAEGVRIVYTGYQSWLGTFLSSAKFDAATGAPISATSPQPVSGLMYY
+LSPIHGPSDWIPSMVSQSTPGLVELGINPIAGWQIWLHLLTDTAFLIIGGIIFAIFWIET
+TGMGAKSIAAKIHASGLQIPGYRRSPVSIERLMERYIPKVTVIGGAIIGLLTVIASLLGT
+LGGAGGTGLLLAVSIMYRLYE
+>SECY_HALMA/73-468 P28542.2
+SIMQLGIGPIVTASIVLQLLGGADLLGLNTQDDPRDQILYQGLQKLLVLVMICLTGLPMV
+FAGGFLPADTAVANSLGIGTAGVQWLIFAQMFVGGVLILFMDEVISKWGVGSGIGLFIVA
+GVSQRLVGGLLTAPFLGNSEGIIYTWYLFITGERGTGPVLAADGLQTVLLQGELLGLFTT
+VLIFAVVVYAESVRVEIPLSNARVKGARGRFPVKLIYASVLPMILVRALQANIQFLGRIL
+NAQLGSMPAFLGTYANGQPTGGLFYFLAPIQSRGDWMWWLEGTAQPVWQILTRVGIDLFV
+MLVGGAVFAVFWVETTDMGPEATAKQIHNSGMQIPGFRQNVGVIEKVLERYIPQVTVIGG
+ALVGLLAVMANMLGTIGGVSGTGLLLTVSITYKLYE
+>Q2FSG8_METHJ/73-458 Q2FSG8.1
+SIVHLGIGPIVTASIVLQLLKGADLIHIDTSEIRGQIQYMGLQKLMIFIMIVVEALPMIV
+GGFLKPDPAIASALFGGNSGVLAILIFIQICIGGVLIFLMDEVVTKWGIGSGVGLFIIAG
+ISEAIINGFINWAPVNDMYPVGFFPRLFAVVLDGANFIQYFGTDLIAFITTIAIFILIVY
+VESTRVEIPLAHTQVRGARARFPVKLIYASVLPMILVRVLQANVQMIGLFLNNIGITIFG
+TFEGQTPTGGLMWYLAPINHPSDWMWWMPSYVGGHAPWEVLIRLGIDTTIMVVGGAIFAL
+FWVKTAGLDSKAVARQIQLSGMSIPGYRRNPAVLEKVLDRYIPRVTVIGGVFIGIMSVVA
+NLFGVIGAVSGTGLLLTVSITYRLYE
+>A2SPM5_METLZ/73-458 A2SPM5.1
+TILHLGIGPIVTASIVLQLLRGADLIKINTSDQRGQVLYMGLQKVLIFVMIILEALPNVL
+GGWMSADPAVSAFFGGNAGFVMLLIFLQICIGGVLVMFMDEVVSKWGIGSGVGLFIVAGV
+AQGLINGFFNWEATTDQFAVGFFPRLFQVIADGSNFIEYFGLQLLALVTTVGLFFIIVYV
+ESTRIEIPLAHANVRGARSRFPVKLVYASVLPMILVRVLQANVQMIGMFLSSIGFTALGE
+YNGSTPINGLMWYLAPINQPQDWMWWLSSFTGTGHAVWEVILRVGIDCTVMILGGALFAI
+FWVKTAGLDSKHVARQIQNSGMQIPGYRRSPAVLERYLDRYIPRVTVIGGVFIGLLSVMA
+NMLGIIGFVGGTGLLLTVSIIYRLYE
+>A0RUE4_CENSY/79-457 A0RUE4.1
+TLVELGIGPIVTAGLLMQLLRGSEILKFDFKKPEERGIFQTATKMVSYVVIVVESSIYGI
+AVYGPGIADPSVLYILIGQLMASSIIIMFLDELIQKGWGLGSGISLFIMAGVAQQILWSL
+FSPLPAGDGFAVGIFPFIGQWASVGMGNFEDIFFRYNQLPSIFGLLLTGGVLLILVYTQG
+MKIEIPIVSTKYRGFSATYPIKLMYVSNIPVILASALTANAIFIGQMFWSNFNPRNDNIF
+LNVLAQFDLTNPSTPIGGIVYYITPPRGLDIAALDPMRAVGYVLFMIGIVVVFGKLWVEL
+GGLSPKSAAKNLLDADVQIPGFRRSNQPIEVLLNKYIPSVTIIGSMILGALAGASDVLGV
+FGSGIGILLMVDILINYYN
+>A8ME75_CALMQ/77-461 A8ME75.1
+TLAQLGIGPIIIAGIIMELVAFSELMDVDLNDPKDQARFTALTKLVAVIIAMFEGAFIMS
+THQLTVANAGLAFIVWLQMLFGAVIVILLDDLISKGWGIGSGISLFILISIIRSIFQSTF
+MPVTVGAGELLGIIPALVAAVYSAAVSHTLAPLLSIVYRFNLPGLIGLIATIVLGGFIAY
+VELMEVRIPLSFVQYGGYKMSYPFKVMYVSVLPIIFTAYTVALIYNGLYFIWTTYNPHNA
+NALLNSIACIRVITTAKFGTINEPCPSSLIYYFTVVPYNITPQYVVVHILMYVVLSVVFA
+YLWVNLAGLSAEDQARTMVSSGLSIPGFRASARSLAVHLKRYVNSLTFTSGLLAGFIAAL
+GDVLGVYGTGIGLILMVEIIIQYYT
+>A3MUZ2_PYRCJ/70-435 A3MUZ2.1
+TLAHLGIGPIVIAGILMEVFAFSGVLNLDLNKREDRLKFTLMLKWAALGIAALEATAYVL
+GGQFGTVTPLGGVLIVLQLLLATVIILLLDDLMSKGWGIGSAISLIIFLGVSRQIFLSLF
+SWDTVQDSNGNTQVFGLLPALGVALYDLFTSGNANTLLGLVNRPLTVNTYLPDFVGLVAT
+ILLGYIILYLEMMKVNIPVASAQYRGIKFTIPLRFVYVSVLPIIFTTYSLLLVGQLLQPF
+AANNPALITVLNVIFLPHRYFDPLLIILNFALYVALAIAFAWIWVQLAGLSAEDQARQFT
+QSQLHVPGFRQSERVLAKILERPINALTIISGFIAGTFASLGNVLGVWGGGVGLILLVEI
+ALQYYA
+>SECY_SULSO/73-449 Q9UX84.1
+TLAQLGIGPIITAGLIMQILAGSKLISIDLNDPDDRVKFTEAQKGLAFIFILVESALFGY
+VLARTSTTINASILFIAGIVIAQLIVATYLILLLDELIQKGWGLGSGVSLFILAGVMKIM
+FWDMFGIASVSSQNLPIGFFPALFTALASHSDVLNLIVNTSTKNLFQPDLVGLVTTIALI
+IITIYLTTMTIEIPVTSQKLRGIRRTIPLNFLYVSSIPVIFVAVLGSDIQLFASLASYVS
+PSASNILNTVSGVFFFPPPNSAIPHSIYAVVLDPLGALEYAVVFIVLSILFGILWVDVAG
+LDPATQAQQLVEAGIEIPGVRNNPKIIEGILARYIYPLAFFSSIIVGLIAVFATLLGAYG
+TGIGILLAVTIAIQYYS
+>SECY_SULAC/74-443 P49978.1
+TLAQLGIGPVITSGLIMQILVGSKLINVDLTTQEGKSKFTQAEKALALIFIIVESSLFGY
+VFTRATSNILLPIIVVVQLIIASYIILLLDEMIQKGWGLGSGVSLFIMAGIMKVIFWNMF
+GIVSVQSQNLPVGFFPLLVSYITSGRNLQEIVLNTSSTTPYQPDLIGLIATVGLTILIVY
+LVNTNIYIPVTTQRLRGIRTTVPLNFLYVSSIPVIFVSVLGADIQLFASLANSISNSASG
+ILTDIANAFFFPPQGVPHSVYALVVDPVGAAIYAAVFIVLSIVFGMLWIDVAGLDPKTQA
+EQMIRSGIEIPGMRTNPRIIEGILSKYIYALGFFSSLIVGLIAVVATFLGTYGTGVGLLL
+AITIAMQYYN
+>A2BME2_HYPBU/73-444 A2BME2.1
+TLMTLGIGPIVTAGIVLEVLVGGKLIELDLTKPRDRKIFMGAQRTLALLFALLEAAAYVI
+GCRFWISAFASSPEVCPPISTAVKIIVVLQLVFATLVLMWFDEMIRNGWGIGSALSLFIV
+ASVVKGLFWQLAGSTKVATPEGQPVYYGWLAHVVSTGDLGVLRRGMPDMVGFLATIAIIM
+VLIYFQLMRVYIPVTSPRYGSIKTRIPLNFIYVTNIPILFVAIAVSDIKVFEIVIASLLG
+ADNPLVRGMDVLYNYVSPPRGLLAAVADPLRTLTFALAWLALGLLFGFIWVEIAGLSPRQ
+QAENLIKSGMELPGIRKNVKLLERILARYIYPLTVISSLLVTTMAILADVFGAYGTGSGL
+VLLVGIIYNFYQ
+>SECY_AERPE/73-434 Q9YDD0.2
+TLMELGIGPIVTASLIIQVLVGAKIIKLDLADPEGRRKFTSAQKVLALAFAALEAVAFTV
+GGRYWVGTAIEPGPLDYALVSLQLFLGALLVIYFDEVMQKGWGIGSAISLFILAGVAQGV
+VWSIFGTIPGVAQDYGLVPAIISNPDLTLLARPNGFPDLTGFFTTLAAIILLVYLQAMRV
+EIPITSERFKGIRSRVPLQFIYVTNIPILLVGILVSDLLLVQRLLADYLGVESRAYQIYS
+SIVYYLSPPRGVVQSIADPVKTAVFIASWTVLSIVFGYMWVEIAGLNPREQAERLIKGGL
+AIPGMRSDPRVLERVLRRYIYPLTFLSSLIVAALVIVADIFGAYGTGTGLLLAVGIINQY
+YA
+>A1RWR3_THEPD/75-456 A1RWR3.1
+TLIELGIGPIVTSGIVWELLVGSRIVNLDLTTPEGRRTFAGLQKLTAFLFAALEAAAYIL
+GGVYGALTQQQQIIVFVQLFVASTFVILMNDMLEKGWGIGSAVSLFIAAGVAQQIFWELF
+SPIGPLGDGLYYGLFPSLFSALVSGNSTLLMHVVVRPSGYPDLVGFVGMVVMLLLLTYME
+SMKITIPVSSVRFGGAKTRIPLKFLYVSVMPVILVGALYANVVMFTQALWPRVNPGNQNP
+WLNVIAKYNYTEYGPVPLPGSFVYYISPPRSLASALADPVHLVVYSLLYIGFAVLFGVAW
+ILTSGMDPETQAEQLAKAQLQIPGFRKSEKVIASMLKRYIWGLTILSSIIIGVIAVVSDI
+FRVMGGGTGILLLVGIIVQYYS
+>SC61A_SCHPO/76-459 P79088.1
+TLMELGISPIVTSSMLVQLLVGSQLIEVNMELKSDREMYQLVQKFLAIIIAFGQATAYVL
+TGMYGRPQDLGAGICLLLILQLAAASLIVLLLDELLQKGYGLGSGISLFIATINCENIFW
+KAFSPTTYHIANGVQFEGAVINFVYVMFTWDNKAAALYQAFFRSGLTSSQIQLPNLWNFF
+ATLLVFGVVIYLQDFRVEIPIRSQKFRGYRSTFPVKLLYTSNTPIMLQSALTSNLFFASR
+LLFNRFSSNFLVRFLGVWEQTATSGLSYYLSPPASFQDALIDPIHTLVYVFFTMFACALF
+SKLWIEVSGASPRDVAKQLKSQQLVMAGHREGSMYKELKRIIPTAAWLSGAVVGALAVAS
+DLLGALGSGTAVLLCTTTIYGYYE
+>A7E5Q2_SCLS1/76-459 A7E5Q2.1
+TLMELGITPIISSGMVFQLLAGTHLIDVNLDLKADRELYQTAQKLFAIILSMGQATVYVF
+TGLYGQPSDLGAGVVCLLILQLVVAGLIVILLDELLQKGYGLGSGISLFIATNICESIIW
+KAFSPTTINTGRGPEFEGAVIALFHLLLTWPNKQRALQEAFYRQSLPNIMNLLATIVVFA
+AVIYLQGFRVEIPVKSSRQRGARGSYPVRLFYTSNMPIMLQSALSSNIFLISQMLYSRFS
+ENLLVQLFGVWEPKEGSAQLFATSGIAYYMSPPLNFTDALLDPIHTAVYITYMLVACAIF
+SKTWIEVSGSSPRDVAKQLKDQGLVMAGHREQSMYKELKRIIPTAAAFGGACIGALSVGS
+DLLGALGSGTGILLAVTIIYGYFE
+>Q5KC69_CRYNE/75-459 Q5KC69.1
+TLMELGITPIVTSGMIMQLLAGAQLIDVDFSLKDDRALFGAAQKLFAMIISLGQATVYVL
+TGLYGSPSSLGAGVCLLLILQLVSASLIVILLDELLTKGYGLGSGISLFIATNICESIVW
+KAFSPNTVNTGRGPEFEGAIIALIHLLFTWNDKTRALKEAFYRDRLPNIMNLLATVAVFA
+AVIYLQGFRIEIPIKSSKMRGQRGTYPVKLFYTSNMPIMLQSALTSNVFLVSQMLAGRFP
+DNLLVRLLGVWEPMENNPTQLGAVSGIAYYMSAPHSLTSALKDPFHTVIYIAFIVTACAL
+FSKTWIEVSGSGPRDVAKQLKDQNMTLAGHRDASIYKELKRIIPTAAAFGGATLGLLSVV
+ADMMGALGSGTGILMATTIIYGYFE
+>SC61A_ASHGO/75-460 Q752H7.1
+TLMELGVSPIITSSMIFQFLQGTQLLQVNLESKQDRELFQIAQKVCAIVLTLGQAIVVVL
+TGNYGSVSNLGIAISLLLILQLVFASFIVLLLDELLIKGYGLGSGISLFTATNIAEQIFW
+KAFAPTTVNNGRGTEFEGAVVALFHLLSVRKDKKRALVEAFYRDYLPNMFQVLSTVFVFL
+FVLYLQGFRYELPVRSTRTRGQVGSYPIKLFYTSNTPIMLQSALTSNIFLTSQLLYQKFP
+NNPIVKMLGVWGTRSDAPYSPNAAISGLSYYIQPPFSFTEALLDPIKTVVYVTFVLGACA
+MFSRTWIDVSGTSPRDVSKQFKEQGLVINGRRETSVYRELKKVIPTAAAFGGATIGALSV
+GSDLLGTLGSGTSILMATTTIYGYYE
+>Q59MJ6_CANAL/76-459 Q59MJ6.1
+TLMELGISPIVSSGMLFQLLQGTKIIHVDMQNKNDRETFQTAQKLLAILLAVGQATVYVL
+TGMYGPPSSLGVGVCSLLILQLVFASTIVILLDELLQKGYGLGSGVSLFTATNTCEQVFW
+KAFAPTTSTSAKGTEFDGAVVAMFHLLGSRKDKKRALIESFYRPNLPNMFQLLATLLVFF
+AVVYLQGFRIELPMKSTRQRGPYGSYPIRLFYTSNIPIMLESALASNIFIISQLLFMRWP
+NNLFVKLLGTWDARAGSSQLYANGGLAYYIQPPFNFTDALLDPIKTTIYIAFVLGSCAVF
+STTWIEISGTSPRDVAKQFKEQGLVIAGHRDTSAYKELKKIIPIAAAFGGATIGALSVVC
+DLMGTLGSGTSILLAVTTIYGYYE
+>A7SJW4_NEMVE/75-458 A7SJW4.1
+TLMELGISPIVTSGLIMQLLAGSKIIEVGDTPKDRALFNGAQKLFGIIITIGQAVVYVMT
+GMYGDPSDLGPGICLLIIIQLFCAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK
+AFSPATINTGRGTEFEGAVIALFHLLATRTDKVRGLREAFYRQNLPNLTNLIATIFVFGI
+VIYFQGFRVDLPIKSARYRGQYSSYPIKLFYTSNIPIILQSALVSNIYVISQMMSAKFAG
+NFFVNLLGTWEEAGGGPARSYPVGGLCYYMSPPETVSHIIEDPVHACIYIFFMLGSCAFF
+SKTWIDVSGSSAKDVAKQLKDQQMVMRGHRDKSMVHELNRYIPTAAAFGGLCIGALSVLA
+DFLGAIGSGTGILLAVTIIYQYFE
+>A0CFY2_PARTE/73-456 A0CFY2.1
+TLMELGISPIVTSGMILQFLSGVGFIEVNHSVREDKVLFNAAQKLLSFIMAIAEGMAYIW
+SGAYGDINQIGAGNAILILLQLTFAGVIVTMLDEMLQKGYGLGSGISLFIATNVSENILW
+KSFSPITLSTEAGTQFEGAIINFFHLLFTKQNTLQALYYAFFRESAPNLNNLLATLFVIS
+LVIYLQGFRVEVPLASQKIRGLVSSHGIKLFYTSNIPMIIQSTLVQNVYFLSQLLYRRFK
+TNFFVKLLGTWQEAEFGGQSVPIGGLAYYMSPLRDVKDIINDPIHAVVYVLFVVFMCGFF
+AKFWIQISGESAKDVARKFKDEQIKIKGLREESMVKYLSGYIPVAAFCGGVCIGLLTIVA
+DILGAIGSGTGILLAVTIIYGYFE
+>Q22MG2_TETTH/151-538 Q22MG2.2
+TIMELGISPTVTAGMVMQLLVGAQILNIDQNDPVQRSLYEGSQKLLGLIIAFFEAVAYVW
+SGMYGDIEKVGYGNALLIVLQLTFAGIIVILLDDLLSKGHGLGNSAISVFIAINICETII
+WKSFSPITYPIPGFEKEQYEGAILNLFHSLFAIDNKFVALQNAFYRSHLPNLASLISTAL
+IFIVVVYFQGFKVDIALKNDRVRGAIQSYPIKLFYTSNMPIILQSALISNLYFFSQILYR
+NFNGNFIVGLLGKWSIPEAGGSHMVPVGGLVYYLSPPHGMIEVISDPLHTILYVVFILTT
+CALFSKTWIQVSGSSVKDVAKQLKEQGMGLVGSRDSGLKSHLKRYIPIAATFGGLCIGAL
+SVVADFIGVIGSGTGILLAVNIVYGYFE
+>A0CU87_PARTE/77-460 A0CU87.1
+TLMELGISPMVTASMIMQLLAGAKLIDVDQNVKEDKQLYSGAQKLLGILIAFGEAFAYVW
+SGMYGDLDKLGAGNAILIIIQLVFSAIVMIMIDELLSKGYGIGNSGTSLFIAINICENIM
+WKAFSPITHKTELGLEYEGAIIALLHGLFVQSDKISALQSAILRDSLPNLTNLLATVLVF
+LIVIYFQGFKVDIPIKNNKVRGGLTSYPIKLFYTSNIPIILQTALVSNLYFLSQILYRNF
+KGNFLIRLLGYYQELENGQTVPIGGLVYYVSPPRSISEAIFDPIHTILYTAFILGTCAVF
+SKTWIDVSGSSPKDVAKQLKEQDMQIVGYRDSSMKDVLKRYIPIAASFGGMCIGALTILA
+DFLGAIGSGTGILLSVTIIYGYFE
+>Q7RLN0_PLAYO/121-506 Q7RLN0.1
+TLMELGISPIVTSGMVMQLLAGSKIIDVDQSLKEDRTLFQGAQKLLGLLITLGEAIAYVV
+SGIYGNLSEIGTGHAILIILQLFFAGVVVILLDELLQKGYGLGSGISLFIATNICETIMW
+KSFSPTTINTDKGIEFEGAIISLIYCLFTEFNKISALKKSFYRTHAPNVTNLLATILVFL
+IVIYLQGFRVDLSVKYQTVRGQQGTYPIKLFYTSNIPIILQTALVSNLYFFSQILYKRFS
+NSILVNILGQWQEIESNGTAVPIGGIAYYISPPNSFADITNDPFHTLIYISFVLVSCAFF
+SKTWIEVSGSSAKDVAKQLRDQHIGMRGHRDTPTSLTRVFNRYIPTAAAFGGMCIGALTI
+LADFLGALGSGTGILLAVTIIYQFYE
+>Q4QGX4_LEIMA/77-467 Q4QGX4.1
+TLMELGISPIVSASLILELLAGVRILTYDQNNREERAVFEGFQKMMGLVITAVEAVAYVS
+SGMYGDPSRIGVVMCGLIVLQLMVATMICILLDELLQKGWGIGSGTSLFIATNVCDTIIW
+KAFSPSTINTGRGAEFEGAIIAFFHLLVSRTDKVRALREAFYRPQLPNLTNIFSTAVVFA
+VVVFFQGFRVPLMTKSKFNGNDRQPYMIKLFYTSNMPIILQTSVVSNISFFSQILSRRFG
+NRNFLINLLGRWEERGYNGGGSGQLFPVGGLAYYLVPPATFYDLLADPIHAIFYVVFVLT
+SCAVFSRLWITISHTAPRDVAKQLASQGRWLVQARESEDDMTRLLEKYIPVAASFGGLCV
+GALTIFADFLGAIGSGTGILLSVTMINQYYE
+>A5JEK2_NOSBO/75-457 A5JEK2.1
+TLMDLGISPVVTASMIMQFLGMLELVKVDYNVKEDKILHGAANRLISLIMTVGSAIVQVL
+TGFYGDPKALGWTYCILLMVQLIFSGVIIILLDELLQKGYGLGNGVNLFIASNVCESIMW
+RAFSPKVFFTGRGIEFEGSLIAFFHLLIVRKNKFAALYEAFFRQNLPNMFSLVSTVVLFA
+FVIYLQGLRVELKTESTQVRGQTGMYPVKLLYSSTMPIIVQSYVISHICTISRFLYKRFP
+TYFLVRALGVWSSEGSSKYQPIKGLCYYILPPESIFDFKLRPFYFLFYVLFTIISCSMLS
+RAWVEVSDNTPTQVASQMKKNKMTLKGVREVNCASVLSKYIPTAALLGGCFTSLVVLISN
+LFDTIGSGTNIFLATSIVHQYLE
+>A2DH65_TRIVA/75-462 A2DH65.1
+SLMEFGISPIVTSGMILQFLCSFGLINRNPSDPEASALFDAAQKLAGIIMTAFQAGNAIW
+SGEYGIRGEIGFVNAALIMTQLVSSAIVVILLDELCQNGYGIGSGISLFICTNICEMIMW
+RLFSFNHYSMGRGTEYEGLVIAFFHYLFTRKNKLRALRDIVFRPQLPNLCQLFSTVIVFG
+ACVYFDQIKINIGLETTVNRARPEPFEIKLFYCSNTPPIIQSTILSQLAGFSRTIYFHWP
+ESLATQIFGVWRSHNGMSYDYSTPVSGLIYYLTAPQSIQQTIHDPLHTIIYLIFSLSSAG
+FISYYYLRFSNQAPADVAEALKKQHLTLKGHREDQKRLEKTLSRYIPTAAALGGILVALL
+SFVADFLSAFGSGTGIILAVSIINQFTA
+>Q2QM98_ORYSJ/88-448 Q2QM98.2
+TVMELGVAPVVTSWVVVRLLAALLFDSDSSTTVASCELLARCLAYVTNASRLVIGIAAAL
+GMCGSGGAGNAALVVLQLFAGGVVVVLADLLHETGYGVEGVSAASLLIATNACERAVSHL
+FSPVKLRLAGAGPEFEGPVFAVTHRVAAAPPSWRHKAGALLFTLLRLDLPNLSNYMTTCV
+MFVLAVRLDETHLRRLYRSRPRRGTDEFVPIKLLYTSAMPIMLHASAVSAFCVDAGGGAA
+YPVGGLVYYVTPPSKLLVDPGLIHELLIHSVFVVASCTLLSMAWAEASRSSAREFRTRVI
+GTGYFVWDETSRRIDRVIAAAAAVGGFAVGGLAVYAGAVGAIGEAGPELLFAVLVIKNLA
+E
+>Q6AV46_ORYSJ/86-471 Q6AV46.1
+TVMELGITPVVTAGTLVQLLVGSNLVRADSSNPDDRALLSAAQKLLSIVITAGEATAYVL
+SGAYGSVGVLGAGNAVLVVLQLVLGGMVAIFLDELLQKGYGFGSGISLFTAANTCEGVVT
+RALSPATMDRGRGAEFVGAVTAAAHLLATRARKLSAVREAFFRGGGGGSLPDLRGLAATC
+AVFLAAVYLQGVRVALPVRPRNAPRSHRGGAYSVRLLYTSGMPVVLLSSAVSSLYVVSQA
+LYRRFGGSLLVDLLGKWTPDAAVPVGGIAYYVTAPASAASAAANPLHAAMYVAFVLAACA
+ALSRAWVVVSGSSSRDVARRLREQQMVMPGMREASMQRELERYIPAAAALGGVCVGALTV
+AADLMGAVGSGAGMLLAVTTVYQCYE
+>Q6C854_YARLI/70-454 Q6C854.2
+TLMELGVGPMVTSGIIFQILGGFQALNVNFDIRADRELFQSGQKIFALLLTFFHAIFLVF
+FAQTYGTISTDSAVSELSLGAAVLIVAQLTAAGLVLILLGEIVDKGYSFGSGSGLFTALS
+VSQNFMWQNLALLKVHQEFVGSIPALLMGLWKNGLFNFGGSYRYVIENSFFRQNLPNLLQ
+LYMSVAVFMLTIYLNTFRVDIPIKSSRVRSLATAFPVKLLYTGSMCLFLLSAFSQNVLIY
+SQSLYVQFPDNLMVQVLGSWGADGSPVGGIAYYISPNNFGYDVIKMVLYSVYTIVGCTLF
+SKYWAEISGSAPKDVAKQFQAQSIVIVGQRAQSAPRELAKVIPVAAAVGGAVVGAIVAFC
+DIFGGLGASAAPMIVAVTSMNNYFE
+>SSH1_YEAST/78-465 P38353.1
+TLLEFGLFPNISSGLILQLLAGLKVIKVNFKIQSDRELFQSLTKVFAIVQYVILTNIFIF
+AGYFGDDLSVVQIGLINFQLVGAGIFTTLLAEVIDKGFGFSSGAMIINTVVIATNLVADT
+FGVSQIKVGEDDQTEAQGALINLIQGLRSKHKTFIGGIISAFNRDYLPNLTTTIIVLAIA
+IIVCYLQSVRVELPIRSTRARGTNNVYPIKLLYTGCLSVLFSYTILFYIHIFAFVLIQLV
+AKNEPTHIICKIMGHYENANNLLAVPTFPLSLLAPPTSFFKGVTQQPLTFITYSAFILVT
+GIWFADKWQAISGSSARDVALEFKDQGITLMGRREQNVAKELNKVIPIAAVTGASVLSLI
+TVIGESLGLKGKAAGIVVGIAGGFSLLE
+>Q6BT20_DEBHA/78-475 Q6BT20.2
+TLLELGLLPVLTSAFIWQLSAGFRFINVNLNLRSDRELYQSGQKLTSFIFAIVYGAGYIF
+SGYYNNVIKGYNPFNGDSVPVTTLVLIFLQIVTMSFVTTLMVEIFDKGYCFGSGVLCFVA
+LQVATNLIRDVVGLELVSLPNSNKFESYGAAMNFIKNFRINFKSLNYNVLNSFTRSQLPN
+LSQFYIVLVTVLVLIGVQNYRIELPIRSTKVRGMNNVYPIRLFYTGALPILFAFTVLTNL
+QVFGYFTSTLLNNYSQLAASIIGTWSLDTKSFNLNLTSGILYFLTPSKSLAQSLLSPIRS
+VTYGLAIITLSTWFAYRWSRISGSSPKDISKQFKEQGISISGKRDISITKELSRVIPVAS
+VSGAFVLAALAIAGELLGGLGKGVAAIIGVCGAFGILE
+>A5DE75_PICGU/20-414 A5DE75.1
+TLLELGLLPVMTSAFLWQLAAGLRLVKVNLSLRSERELFQTGQKLTSFILGIVYTAGLIA
+SGYFAPALRNQTGFEDSFPVTTYVFIFLQVFVMSAVMTLLVEVFDKGYGFGSGILCFIAL
+QAASDLVKNIIGLEVVKLANSNKFESVGALMNLIRSFSFKTLGKNIYNSFNREHLPNLTQ
+VYITIVTLLVVVALQNFRIELPIRSTRARGMNNVFPIRLLYTGALPLAFAYTVLTNLQVL
+GYIASQLLESYSPVASSVIGKWTIDYRSSNLKVSSGILYFLSPPTSILNTLVSPLKTAAF
+TFVVIVLSAWFANIWSSISGSSPKDISKQFKEQGISIAGKRDISITKELSRVIPVASVSG
+ATVLGLIAVAGEVLGGAGKGVGTIIGVSAAFGVLE
+>A3GFV9_PICST/78-476 A3GFV9.2
+TLFELGVLPVVTAAFFWQLAVGLKLVNVNLGLRSDRELFQTGQKLTSFVLAIVYGVGLIY
+SGYYDNAIRGYDPLSDSTPYGWYGLILFQFLSWSFIITLIVEVFDKGYAFGSGALSFLAL
+QTATNLIAELVGLEIFPINNSNKFESYGALINFTRNFSFDISKIGTNVYNSFTRLQLPNF
+TSFYITVATTLAVVYLQNLRIELPIRSTRARGMNNVFPIRLLYTGALPVLFAYTVIANIQ
+YFGYLAYVVLQKANVSSFALSIIASFNLDSYSNRLNLTSGALYFFSSSPSLLSTILSPIR
+TVVYSATVIVLATWFAEKWSYISGSAPKDISKQFKDQGISISGKRDISITKELSRVIPVA
+AVSGGFILAAIAVAGDLLGGLGKSAATIVGVSAAFSVLE
+>A5DWJ5_LODEL/34-436 A5DWJ5.1
+SLLELGFLPIITSAFLWQLAAGLKLININLGLRYDRELFQLGQKLTAWGLALIFSVGLIY
+SGYYDNVIRGYKVVGGSGGVPIWSYLIIFTQIFTWQIVLTLIVEIFDKGYGFGSGILSFL
+ALQNATSFIAELVGLEMFPVVNNTLKFESLGALLNLVRNFSIFSPTTTINQIWHAFTRVQ
+LPNLTQFYITLATILAVVLLQNFRTEISIRSTKVRGMNQMFPIRLLYTGGLPVLFAYTVI
+ANLQVFGFIFEAALVKLTASPIVSTLFANYVVEPYSNRLVIKSGVLYFFTASQTLLQSII
+SPLRVVIYSSTVVGLATWFAYKWSYIAGSSPKDISKQFKEQGISIAGKRDISITKEFAKI
+IPTAAVTGAFILSALAVTGDYLGGLGRNVASIVGVSSAFGILE
+>Q5A2C9_CANAL/5-404 Q5A2C9.1
+TLLELGLLPIITSAFIWQIAAGLRLINVNFKLRIDRELFQTGQKLTSFIFSLIFAIGLIY
+SGYYDNAIRGYNPLQDGIPYGSYALILLQITAWSWIVTLLVEIFDKGYSFGSGILCFLAI
+QSSTNFIANLLGLENFPVVNSNKFESYGALMNLIKNFSIFNPKQTVYQIWHSFFRIQLPN
+LTQFYISLASILIVVALQNFRIELPIRSTKVRGMNNVFPIRLLYTGGLPVLFAFTVVANI
+QVVGYLIHSVLSKLGTSPIVISIIGNYVYNPSSNELDLNSGILNYFTSSSSLVESIISPI
+KTTVYSITIIVLAVWFANKWSYISGSSPKDISKQFKDQGISLAGKRDISITKELSRVIPV
+ASVSGAFILSVVALIGDFFGGLGYGVASIIGVTASFAVLE
+>Q74L41_LACJO/64-372 Q74L41.1
+SIFSIGLNPLMFSMLIIQLLSFTHSFGFDALSPKQVQYLMQFLTMIITIIQAALLVFAFT
+NRRNGLEDFEMILILSAGSCLVVWLCYRNMKYGVGASAPVILTSILNGAIPNIISNVKLL
+LTMKYAWIWLAALAIFILLLIKFWLAFTKAYYPLKVVNPSLPASSNLMTVPLGLNMAAMM
+MYMVGMAILTLPLMVGRYFSSSSLINNWVFQASFSAVMGILIFYFFTFVNFDPKEQAKSF
+RNNHYYIPNIAPGRPTQRYLNRLIWIIAFPGAVLNAFQLVFGLYGGNFLGNYAGFAIIPM
+NVVMITMFM
+>B3XPQ8_LACRE/65-377 B3XPQ8.1
+SLFMVGLNPLMIAMLIIQLLTMLRLFYFDTLSMNQLMKIQQWLTLGFAIIQSTAVTLGLK
+ITTGTLDSLAVILMLTAGSMFVVWLGNMNMKFGIGGTITLILFNIISGSIPTLLRSIKML
+AKQSYGPLWLFLAAIAGCIVLVFWVSFNRAYYPLKMINTSMSSHDRPIILPIGLNMGAMM
+TYMVGMSLLMVPTLLANVLGPGSLFANPYFNMVVSGILAFVLFYFFTFVQFDPKAQAKAM
+LQGNNYILGVRPGEPTRKYLRQILLHVSFLGALLNAIQLSFGLLGGQVLGNFAGLAIIPM
+NMIMIVMFMQGIK
+>A1C3L4_STRPA/70-403 A1C3L4.1
+TLFSLGIGPTMTMMILWRFLITFKLIGSWTSNKVNRLQFLLTLAIALLQSFGITNDSKFL
+LIFGYSHSTLRIITIILLTTGTFILNWLCKINSERGIGGMTVVILVNMILTFQSNIIRYF
+SVQQFKFSSLIQYGLVFFVALSILIWFNILLYKGEYRIPIQRVGLNTPYHASSYLPIRVT
+PAGAMPFMYGMTLMMLPPYIFVVLLHIFPGNQILEYLSVHIGLSQLPGVICYIFLLYFLS
+IGFAYYNYDPYEISKNMRNNGDYISGKKPGEETIKYIQYVVNSFAQFGAFTVIIFGGLPM
+LAVLLQGQGKNSVSIALLISNAYIIVSLLLGVIE
+>Q3DVD6_STRAG/65-395 Q3DVD6.1
+GVFSLGIGPMMTTMILLRLFTIGKYSSGVSQKVQQFRQNVVMLVIAIIQGLAITISFQYH
+NGFSLTKLLLATMILVTGAYIISWIGNLNAEYGFGGMTILVVVGMLVGQFNNIPLIFELF
+QDGYQLAIILFLLWTLVAMYLMITFERSEYRIPVMRTSIHNRLVDDAYMPIKVNASGGMA
+FMYVYTLLMFPQYIIILLRSIFPTNPDITSYNDYFSLSSIQGVVIYMILMLVLSVAFTFV
+NIDPTKISEAMRESGDFIPNYRPGKETQSYLSKICYLFGTFSGFFMAFLGGVPLLFALGN
+DDLRTVSSMTGIFMMITGMSFMILDEFQVIR
+>A5LN99_STRPN/64-389 A5LN99.1
+SIFSVGLSPWMSAMILWQMFSFSKRLGLTSTSIEIQDRRKMYLTLMIAVIQSLAVSLRLP
+VQSSYSAILVVLMNTILLIAGTFFLVWLSDLNASMGIGGSIVILLSSMVLNIPQDVLETF
+QTVHIPTGIIVLLALLTLVFSYLLALMYRARYLVPVNKIGLHNRFKRYSYLEIMLNPAGG
+MPYMYVMSFLSVPAYLFILLGFIFPNHSGLAALSKEFMIGKPLWVYVYISVLFLFSIIFA
+FVTMNGEEIADRMKKSGEYIYGIYPGADTSLFINRLVLRFSVIGGLFNVVMAGGPMLFVL
+FDEKLLRLAMIPGLFMMFGGMIFTIR
+>A3CM55_STRSV/64-391 A3CM55.1
+SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRMLLTLVIALIQSVALVLNLP
+LQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMASMIAYIPQDIWN
+SIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPA
+GGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWFILYLLTIFILALA
+FAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLILISGLPMMV
+VLVDIRYLRLSMIPGIFMIFIGMVFSIK
+>Q03HZ8_PEDPA/65-396 Q03HZ8.1
+SLFSVGLGPYMTGMILFQAIQLLDIDELNKINDYKRGMIQRWISFVIALLQTLQFIYTIR
+EHINFSGIKVWGIDYNLIVAFFVLVAGAMIVAWMSDMITKYGIGGSGVLILPGMIDSIPR
+VLLYGQGLGSGAVFFTPKLWLVLIISVAVVVIFTIFINKAELRIPLQRPFVQNDFSESYL
+PIRVLAAGSMPFMFTTTVFMIPSYIGSFVPEGEFNRFVQNYVAFDNPVGILIYCSIIVFL
+GYVFSFMNFQTERLTKNLKKSGDYIFNVVPGTATRHYLNQRLFHLSTVANIFFLIIVGTP
+LIVGLYLPEITNFAFVFANILILITIIDTTMD
+>A5IW80_STAA9/64-384 A5IW80.1
+NIFTLGLVPWLTSMIILMLISYRNMDKYMKQTSLEKHYKERILTLILSVIQSYFVIHEYV
+SKERVHQDNIYLTILILVTGTMLLVWLADKNSRYGIAGPMPIVMVSIIKSMMHQKMEYID
+ASHIVIALLIILVIITLFILLFIELVEVRIPYIDLMNVSATNMKSYLSWKVNPAGSITLM
+MSISAFVFLKSGIHFILSMFNKSISDDMPMLTFDSPVGISVYLVIQMLLGYFLSRFLINT
+KQKSKDFLKSGNYFSGVKPGKDTERYLNYQARRVCWFGSALVTVIIGIPLYFTLFVPHLS
+TEIYFSVQLIVLVYISINIAE
+>Q4L9N9_STAHJ/61-383 Q4L9N9.1
+NVFSLGLGPWLTSLVIIMLLNYRNLDQATKQTRSEKHYKERIITIVFAIFQSYFVISTYI
+HNNFIKDSNIILLMLILVAGTMLLVWLADQNITYGICGPMPIVLTSLIKSLFNNQHFFKL
+SVSVLLLILVIVTLVIALLILLFIELSEYRLNYKDIMNNSTNKTPTYLAWKLNPAGSISI
+MISLSVYVLLNNMINLIATLLGSNANFEFLSFANPIGIMFYIVLQIVLSYLLSRFLINTK
+KKADEFLKNGNYFDPIRPGRETERYLNSKARRVCWTGAILVALILAVPLYSTLLVPNLST
+EIYFSMQLIILVYISINIGETIR
+>Q5HKR3_STAEQ/61-380 Q5HKR3.1
+NIFSLGLGPWLSSMIILTLINHKSNDKVKTQTRRERHFKERALTLIISAAQGFYIIHSYI
+NKHAIKDSNMLILLLVLITGTLLMVWLADQNTTYGISGPMPIVLMSLVKSIFNTHFPKLN
+SSASLITMIIVLLVLALFILFFIELTEYRIEYNDIMNISAKDIPSYLSWKLNPAGSISIM
+VSLSLFMLTNNIVNFIGRFIVNHNFETHVFNFTNPVGITIYLLLQMILGYFLSRLLINTK
+RKSKEFLKNGNYFEGIQPGQQTEKFLGSKARRICWFGSIVVAIVLAIPMYSALLVPHLLK
+EVYFTTQMIVFVYIGINIAE
+>Q9RSK8_DEIRA/68-413 Q9RSK8.1
+SIFALGVLPYITASIVIQLLTTTIPSLEKLSKEGEEGRKKINQYTRYAAIALGAVQALFF
+SLYITSNPSFIAVGWDPGLFTVLVMVLTQVAGIAFTMWIGERITEVGIGNGISLIITAGI
+IAVYPREIAATAQLLRSEQTTLLSILAFIAVILVTIAGIVYIYQAERRVPVTYARARGGA
+AGQARGAGQATWLPIKVNQAGVIPVIFASAMLIIPNLIASATATRAPEVNAWINSNLTFG
+QPLYLALESLLIFGFTYLYNSVQFDPKRIAEQLREAGGFIPGVRPGGPTADFLGRISGRL
+SLWGAIFLVILTILPQLVQKATGITTFQFSGTGLLIIVGVALETLK
+>Q5SHQ8_THET8/71-413 Q5SHQ8.1
+SIFALGIMPYITAAIIMQILVTVVPALEKLSKEGEEGRRIINQYTRIGGIALGAFQGFFL
+ATAFLGAEGGRFLLPGWSPGPFFWFVVVVTQVAGIALLLWMAERITEYGIGNGTSLIIFA
+GIVVEWLPQILRTIGLIRTGEVNLVAFLFFLAFIVLAFAGMAAVQQAERRIPVQYARKVV
+GRRVYGGQATYIPIKLNAAGVIPIIFAAAILQIPIFLAAPFQDNPVLQGIANFFNPTRPS
+GLFIEVLLVILFTYVYTAVQFDPKRIAESLREYGGFIPGIRPGEPTVKFLEHIVSRLTLW
+GALFLGLVTLLPQIIQNLTGIHSIAFSGIGLLIVVGVALDTLR
+>SECY_CORGL/73-424 P38376.1
+SIFAIGIMPYITASIIVQLLTVVIPHFEELKKEGQSGQAKMMQYTRYLTVALALLQSSGI
+VALADREQLLGAGIRVLSADRNFFDLIVLVITMTAGAVLVMWMGELITEKGVGNGMSLLI
+FAGIATRLPTDGMNILGNSGGVVFAVVLASVLILVIGVVFVEQGQRRIPVQYAKRMVGRR
+QYGGSSTYLPLKVNQAGVIPVIFASSLIYMPVLITQIVNSGSLEVSDNWWQRNIIAHLQT
+PSSWQYIVLYFALTIFFSYFYVSVQYDPAEQAENMKKYGGFIPGIRPGRPTAEYLGFVMN
+RLLFVGSLYLAVIAVLPNIMLDLGVDAGSAGATPFGGTAILILVSVALTTVK
+>A8LB12_FRASN/74-414 A8LB12.1
+SVFALGIMPYITSSIIIQLLVVVIPRLEQLKKEGSSGEQKLTQYTRYLTVALGILQATGI
+VALARSGRLFPGCSAQIIPDTSLFRIVTIVITMTAGTAVIMWMGELITARGVGNGMSLLI
+FTSIAAALPSQGGRILQVAGGVVFGLVILLGLAIVVFVVFVEQSQRRIPVQYAKRLIGRR
+MYGGTSTYLPIKVNQAGIIPVIFASSLLQLPQLVGQVWSNQTFQDFEQRYLSRGDHPLYL
+VAYGALIIFFTYFYVAITFNPTEVADNMRKYGGFIPGIRPGRPTAEYLDHVLSRITLPGS
+LFLGVITVLPLALLNLTKDQPFPFAGTSVLIMVGVGLETVK
+>Q83NQ1_TROW8/73-424 Q83NQ1.1
+SVFALGVMPYITSSIIIQLLRVVVPRFEQLYKQGQEGQAKLIQYTRYLTIGLAVLQSTTL
+ITVARSGALFAASNSPACSSLLTDDSWYSTIIIVIVMTAGTGLIMWLGELITERGIGNGM
+SILIFTSIAAGFPGVLVGVYQTRGFGMFSTVVITSLVVMVGVVFVEQSQRRVPVQYAKRV
+VGRRILGGGSTYLPIKLNMAGVVPVIFASAILRVPSIIAQFSQPAPGQPPAAWVVWINEN
+FTTGNSPFYIALYFFMIVGFTYFYVAVTFNPTEIADNMKNYGGFISGIRPGVPTANYLSY
+IIKRITLPGSLYLGIVSLIPLIAFALFGLSADIPLGGTSVLIMVGVGLDTVK
+>Q8G3Z9_BIFLO/74-421 Q8G3Z9.1
+SIFALGVMPYITASIVVQLLRVVIPRFEALHKEGQSGEAKLTQYTRYLTIGLAVLQSTTI
+LVTARSGALFNYQCDQVIPDGSVFNLVVMVLIMTGGTGLIMWMAELVTDKGIGQGMSILI
+FMSICSGFLPQLWEIGYGTNGTDGDWLKFGIVVGVLVVILIFVDFVELCQRRVPVQYTRR
+MIGRKMYGGSSTYLPLKINMSGVIPPIFASSILAIPTLIAQFGKSDQSWVKWINANLANT
+TSVWYIALYALMIVFFCFFYTSITFNPDETADNMKQYGGFIPGIRAGNATSRYLTYVMNR
+LNTVGAVYLLFVALIPTVLIMALGLNAKLPFGGTTILIIAGVGLDTLR
+>A7B9M4_9ACTO/72-414 A7B9M4.1
+SIFALGIMPYITASIIIQLLRVVIPRFDDLHKEGQTGQAKLTQYTRYLTIFLGILQATTT
+ISLARSGQLFQSCNHDIIKDRSVMTFIMMIIVMMAGTGVIMWLGELITERGIGNGMSLLI
+FTSIAARLPEQLLSIGQAGKWGSVAAIVALLLLVAIAVVYVEQAQRRIPVQYAKRMIGRR
+QYGGTTTYIPLKINMSGVIPVIFASSILALPPMAAQFGSPNDKWVQWISAHFTQGSSFYL
+TIYALMTLFFTFFYTAITFNPDEVADNMKKYGGFIPGYRAGRPTAEYLRYVINRITSAGA
+LYLVIIALLPSLAIIPLQLSSSQMPFGGTTLLIIIGVGLQTVK
+>SECY_CHLTR/73-433 P28539.3
+TVIALGVVPYISASIIVQLLVVFMPTLQREMRESPDQGKRKLGRMTRLFTLVLACVQSLL
+FAKFALRMNLVVPGIVLPAMLSLKLFGVPWVFYLTTVVVMITGTLLLMWVGEQISDKGIG
+NGISLIITLGILASFPSVLGSIFNKLNLGSQDPSEFGIVSLLILCAVFVFVLMATVLIIE
+GMRKIPVQHARRIIGRREVVGGGSYLPLKVNYAGVIPVIFASSLLMFPATIGQFLSSESS
+WLKRIATMLSPGSVAYSIFYVLLIIFFTYFWTATQFRPEQIASEMKKNGAFIPGIRQGKP
+TQTYLEYTMNRVTLLGAVFLAVVAILPSILGRILRVDANVSYFLGGTAMLIVVGVILDTM
+K
+>Q1AU49_RUBXD/70-408 Q1AU49.1
+SVFALGIMPYITAAIVMQLMTVAIPRLQELAREGEVGQQKITQYTRVFTLALSFIQSVAM
+VLFLRSGQFGPVLAGAGALDLFLVVVTLTTGVMVTMWFGELITQRGLGNGISLIITASIL
+SQAPNAVRTLIEDGSVLTMVILGIIAVMIVAAIVFVNEGQRRIPITYAKRQVGRRMSQGG
+TTYLPLKVNMAGVIPIIFASSLLIFPVVITQFAAGGDQSSWLFRLAQIFAPPSAPYLILY
+ALLIVMFTYFYTAVQFNPIEHADNLKKSGGYIPGIRPGQPTALYLNSVLTRITLFGAVFL
+AVIAVLPYLITGALNLPNSIYLGGTSMLIVVGVSLDTVR
+>Q8RIH6_FUSNN/75-411 Q8RIH6.1
+SIFSLGIIPYINASIVVSLLVSIIPQLEEIQKEGESGRNRITQWTRYLTIALAIIQGTGV
+CLWLQSVGLIYNPGISFFVRTITTLTAGTVFLMWVGEQISIKGIGNGVSLIIFLNVISRA
+PSSVIQTIQTMQGNKFLIPLLVLVAFLGTVTIAGIVLFQLGQRKIPIHYVGKGFSSKGGI
+GEKSFIPLRLNTAGVMPVIFASVFMLIPGVIVNALPSTLSIKTTLSIIFGQNHPVYMILY
+ALVIMFFSFFYTALVFDPEKVAENLKQGGGTIPGIRPGEETVEYLEGVASRITWGGGIFL
+AIISILPYVIFTSMGLPVYFGGTGIIIVVGVALDTIQ
+>A6DRC9_9BACT/79-428 A6DRC9.1
+GVLGIMPYITASIIMQLMTPVFPNLEKLQKDGSHGRQKLNQYTRYMTIVICAVQSAMMAV
+AMHTPSKLLGVPGFEDLVINKGSAFVIQTTIIVTASAILIMWLGEQITDKGLGNGASIII
+TINVLSSMPQAFAAVYSKYQEGEWNLVQILVVVGILFIVTAATVALVQGMRKIPLKYARD
+ASSRNAMIEKTSYLPLKVNHAGVMPIIFASALMMFPPMIINKIGGDFARTVAPYFDFGST
+SYLIIQGVMILVFTFFWVATQFNPIQIADDLNRSGAFVPGHRPGEPTSTFLNDTMTRITV
+AGAIFLVILALLPYVLMNAMGSGSTDFIITQFFGGTSLLIMVGVVLQTMQ
+>C0ACZ0_9BACT/94-454 C0ACZ0.1
+AVCALGIMPYISASIIFQLMTAVVPSLARLQQEGDVGRQKLSQYTRYATVLICLIQGALL
+ILALENPTQLFGEGYDIARYGEIVLVDRTWFLISSVIFMTAGTMLLTWLGEQITQRGIGN
+GISLLITIGIISDLPGAMGTLWTLLRAPVGTQGISMISLTFMVILFFAVTMGIIMVVQGQ
+RKIPVQYAKRVVGNKVMGGQNSFLPLKVNYSGVMPVIFASAILLFPQQIFRYLGAAFNLP
+FLIEFSNNLMRGHWVYYVTMTLLILFFSYFWVSVMFKPIQIAEDLKKYGGYIPGVRPGEP
+TAKFLDFVMTRITLAGAIFLTIIAVFPDFLNAELNVPQRISSFFGGTGMLITVGVILDTM
+K
+>Q1Q157_9BACT/75-434 Q1Q157.1
+AIFGLGVMPYISASIIFQLLVGVVPYLERLQKEGEVGRKKINQYTRIATVGLCLFQAFVM
+TRTLYTVEFNGVPVIPVYLQGVSFQLMAAILLTTGTMILMWIGEQIEEHGIGSGISIVIM
+VGIIERLPWAFNQIVQNFTFSVAPAEHQIGIVKLLILLGMFFAIVGGVVYITQGQRRIPI
+QQAKHTRGRRVYGGQRHFLPLRVNQAGVMPIIFAQSLLIFPAAIMQGIQIRFEPGSVGYW
+ITSRLSGILQEGVLYVMLYILLITFFCYFWTAIQFNPREMSNNMKDYGSFIPGIRPGHRT
+AEYLESIMGKITLAGAAFLSLIAILPKLVAGGFELNRAIAGFYGGTGLLIIVGVALDMVQ
+>A6CGP8_9PLAN/77-435 A6CGP8.1
+TIFGLGIMPYISASIIFQLMGTVYPPLERLQKEGEAGRKKINEYTRYATVVICLVQSFFW
+IRTLAGGFGSGTSLILDGYQGLYFQIVATITMTTGTVFLMWIGEQIDAYGIGNGISLLIM
+AGILARMPQAGWSLIEPAFEKGIALGTDTGIDRLLILALVFVFVVVWVIAITQGQRRIPI
+QSAKHVRGRRVSGGQRQSLPLRVNQAGVMPIIFASSLLMFPYFLFHGLSQYFSTSAFWAM
+LDEAFQPMSRGFVYTMSYVVLIYFFCYFWTAITFNPKDMAENLKDYGSFIPGYRPGARTA
+AYLEQVMVRITYVGAAFLSLVAIIPTLVSTWLGVDFLVASFYGGTGLLIVVSVVLDLVN
+>B4S5A8_PROA2/73-417 B4S5A8.1
+SIFSLGIMPYISASIIVQLLGAVTPYVQKLQKEGEEGRQKINQYTRYGTVLIAALQAWGV
+SVSLASPSSFGTIVVPDPGFFFMMTTVLILTASTVFVMWLGEKITERGIGNGISLIIMIG
+ILARFPQSVIAEFQSVSLGSKNWIIEFIILALMVLIVAAVVVLTVGTRRIPVQHAKRVVG
+RKMYGGSTQYIPMRVNTAGVMPIIFAQSIMFLPNTFLSFFPESEVMQNVATIFSYDSWWY
+ALMFGTMIVFFTYFYTAIAFNPKEVADTMRRQGGFIPGVRPGKSTADFIDNILTRITLPG
+AISLAFIAVLPTFLTKFANVTPGFAQFFGGTSLLIIVGVGLDTLQ
+>Q2S3P5_SALRD/75-414 Q2S3P5.1
+GIFALGIMPYITASIIIQLMGAVVPYFQKLQREGEEGRRRITQLTRYGTIGITALQSIGY
+SINLLAGATGRAVVINSTLFTITTVVVLTSGTAFVMWLGERISEDGIGNGISLIITIGII
+AFLPQALYNEIGLIGDNFFILLVEIGVWVLVAGAVVLVSQGMRRIPVQYAKRVVGKKVQG
+GTTQYLPLRVNAAGVMPIIFAQSIMFIPSTIASFFPNNATMQRVGGWFSDISSMSYSAVF
+FVVVVFFTYFYTAITVNPQEMADTMKRQGGFIPGIRPGKQTSEFIDTVLTRITLPGSIFL
+GLVAIFPAFAMQAGVSQGFAMFYGGTSLLILVQVTLDTLQ
+>A1ZGT4_9SPHI/72-404 A1ZGT4.1
+SIFALGIMPYISASIVIQLMEVAVPYFQKLKKEGESGFKKKTQITRYLTIVITAAQAIGY
+IQATIPSNAIMVSQLSFTISTVIILTAGTVFTMWLGEKIDDRGIGQGISLLIMIGIISRL
+PQSLVEEVVARSTGSQVLILILEMVVLFFVVMSVVMLTEATRRIPIQYAKQVVGNRVYGG
+QRQYLPLKVNAAGVMPIIFAQALMFVPALITPYVGGASSAFSDITTWQYNLVFGLLIIIF
+TYFYTAISVNPKQIADDLKRNGGFIAGVKPGSDTSEYIDKIMSKITLPGSIWLAIVAILP
+AIAVKFGIQNSFAQFYGGTSLLIMVGVVLNTLQ
+>A6EHP4_9SPHI/71-408 A6EHP4.1
+SILALGVMPYISASIVVQLLGIAVPSFQKMQKEGESGRKKLNQITRYLTVAITAVQAVGY
+VKTQVPMEAIVIDHTLFFVMATFVLAAGTLFVMWLGEKITDKGIGNGISLIIMVGIIARL
+PIALYQEITSRIVSDGGLIALVLEIVALFAVVMFTIMIVQGVRKVPVQYAKRIVGNRQFG
+GVRQYIPLKVNAAGVMPIIFAQALMFIPATLTQFFPSLQNTWLVQFSDYTSLAYSLTFAF
+LIIAFTFFYTAITVNPTQMSDDMKKNGGFIPGIKPGFATSSFIDDVISKITFPGAVFLAI
+IAILPSVAVKFGIKSEFAHFYGGTSLLILVGVVLDTLQ
+>Q11QD2_CYTH3/72-411 Q11QD2.1
+SVFGLGIMPYISASIVLQLLTFAVPYFQRLQKDGESGRKTINQYTRILTIFITVAQSIGY
+LAATLDEGMIYEGMNTPFMNVVRIVTLISGTMFCMWIGERITEKGIGNGISMLIMIGIVS
+RLPFALMAEVSSKNLEGALPLLIEFAALFAVIMLVVLVQQATRRIPIQYTKQIAGGKQVI
+GQRQYLPLKLIAAGVMPIIFAQSVMFLPAIIGSSFPDSEFATTIGSTMSDFTSWQYNVAF
+ATMIILFTYFYTAITVNPNSIAEDLRRNGGFIPSVKPGLATSEYIDDVLTKITLPGSIFL
+ALLAILPAFASMTGIEKEFAYFYGGTSLLIMIGVVLDTLQ
+>Q1VTY0_9FLAO/73-421 Q1VTY0.1
+SVFALGIMPYISASIVVQLMTIAIPYLQKLQKEGDSGRKKITQITRWLTIAITLVQGPGY
+IINLYNILPSSAFLMDSTFTFVVSSVIILTTGCIFAMWLGEKITDKGIGNGISLLIMVGI
+IATLPQAFIQEFISRVTESNGGLILILIELVIWFVIILAAVMLVRAVRQIPVQYARKNAS
+GKFEKASVGGARQFIPLRLNASGVMPIIFAQAIMFIPAAVAGLSDSEMAQGITAAFQNMF
+GFWYSLVFGILIIVFTYFYTAITVPTNKMADDLKRSGGFIPGIRPGSETSEYLDRVMSQI
+TLPGSIFLALIAVFPAVIVSLLNVQQGWGLFFGGTSLLIMVGVAIDTIQ
+>Q1NYZ7_9FLAO/72-422 Q1NYZ7.1
+SILSLGIMPYISASILTQLMCYMFPSLYKIQQDGEIGIKKINNITKVLTILISLIQAPVY
+ITILISSNIKENPYNLILIHCKKIFIITSIICITTGTFFTMWLGEKINDKGIGNGNSLII
+ISGILSRFIYSIISEIFNRLKNNNKLLGIIILLFELFIWLLIIGISIIIINFVKKIHIQY
+VNKFYLKNYSSNEIYLRNEMKFLPLKVVYPGVMPIIFSQGILLIFITIFNKINNLQLSNN
+GIWYNILYSILIIIITFFYTFLSIPVNKISDDLKINGVYIPNRKPGKDTCFFLKKIVSQI
+YLTGSLLLVIIALLPSIFISLGGDKNFSLFFGGTTIIIIVGGLLDIKYTIN
+>A5KHP6_CAMJE/62-402 A5KHP6.1
+SIISLGIMPYITASIIMELLAATFPNIGKMKKERDSMQKYMQIIRYATIVITLVQSIGVA
+IGLQSLHGRGGAGVIMVEDLNMFIALCAISMLAGTMLLMWLGEQITQRGIGNGISLIIFA
+GIVSGIPRAISGTVGQINSGEMNFLTAFAIFALILITIGVIIYVELGERRIPISYSRKVV
+MQNQNKRIMNYIPIKLNLSGVIPPIFASAILMFPTTILQTSTNPYLQAINDFLNPNGYLF
+HVLTFLFVIFFAYFYASIVFNAKDIAENLKKQGGFIPGIRPGEGTSSYLNEVASRLTLSG
+SIYLGLVATLPWVLVKFMGVPFHFGGTSVLIVVQVALDTMR
+>A4EA78_9ACTN/52-389 A4EA78.1
+SVFSLGIMPYITSSIILQMLQAVVPSLHELAREGEVGQTKITQYSRYLTLALAILNSVGY
+LFLFKSFGISFNGAGAPEIIFDLMIVGTLTAGAMLIMWIGELITQRGIGNGMSLIIFANI
+MAGLPQAIFSSTEGNAGGIITMVIICAIILLVIPLIVFLERGQRRIPVSYAKRVVGRRMM
+GGQTTYLPIKVNTAGVVPIIFASALLYFPAQIAVFFPGIGWIQAVASALSTGWLNWVLNV
+VLIVFFAYFYTSMVFNPDDTADNLKKQGGFIPGVRPGRATAAYIKNALNKITLPSAVFLA
+LIAIVPSIIFSFTGNHLIQAFGGTSILIMVGVVLDTVD
+>Q2GEC0_NEOSM/73-411 Q2GEC0.1
+TLFALNVMPYIVSSIVVQIFFSMLKSEGKVSAEFMNESRLSFYSKLVALFLAFFQGFIIV
+AGLERTKAFVGGNEEFYSLLKYTSVLTLVCGTFSLIWLGQQINSRGIGNGMSLIIFAGIV
+AEMPAIFGNLFSGIGSPGSGILGIFVSLSLLVFVVFLVVLVERASKNIPVHYPRRRTWGS
+THGDAASNIPVKINVSGVIPPIFANALILFPLTLANFSAESHLGEFIIRYFSVGQPLYFL
+LHSCLLVFFCFFYSDFVFNTTEISDSLKKGEAIVAGRRPGISTKRHLDYVLRRITVVGAA
+YLVCICVVPEIFRNYFGFDAIISGTSLLIIVNVITDLLS
+>Q3YRM8_EHRCJ/72-412 Q3YRM8.1
+TVFALNVMPYIVSSIIIQLLSVTVPRLNELRQNGELGRMKINNYIRYMTIFFCIVQGSVI
+LLGLEKMNSENSIVVIDPGLLFRIVGISSLLGGTMFLLWLGERINKNGIGNGVSMIIFTG
+IVAELPGSFSSMFLLGKNGNVPIFVILLMVLIFFALLLLIIFVEKSYRKILVQYPKRQVK
+NKLYGSSSTYIPLKINISGVIPPIFANALLLSPITVANFHQGSPWSDFILMYFSSGKLLY
+IVCYALLIIFFAFFYTAFVFDAKETSEILKKNGGFVPGKRPGNATCEYFNYVIKRLTVLG
+SIYLTVICIIPELIRYNYSVSFTLGGTSFLIIVNVIIDTFS
+>Q5GSW3_WOLTR/77-416 Q5GSW3.1
+TILVLNVMPYIVASIVMQLLSSAVKGINEVKNDGELGRRRMNSYIRYMTIVFCIFQSVTI
+LIGLERMNREGTLVVIEPGVMFRTVGIFSLLGGTMFLIWLGEQISASGIGNGISLIIFTG
+IISELHNAFSFLLTLNKNGSMSLLIILFVFVLFFLLLLLIIFVESSYRKVTVQYPKKQFK
+RLHSDDFTYIPLKINLSGVIPTIFANAILLTPVSIANFYKGHAFSDFILNYFMANKVVYI
+AAYLALIVFFNFFYTNFIFNPEENADFLKKNGGFIPGRRPGKHTSDYLQDIVFKLTFIGS
+AYLVVICTVPEVMRYYYDMPFIFGGTSLLIIVNVTTDTIM
+>Q0ANS0_MARMM/83-421 Q0ANS0.1
+AIFVLNVMPYISASIIMQLMSATIPSLEKLKKEGGEQGRQQINQYTRYLTVLLATGQAFA
+IAIGMNTPNSEGVALALNPGPFFLASTVITLVGATMLLLWLGEQITARGVGNGVSLIIFA
+GIISAVPGVIGGALSQASSTGDGTVLVVGGVLILVGLLLVVFVERSQRRLLVQYPKRQQG
+NRMVGGDTSFLPLKLNTAGVIPPIFASSLLLLPATAASFQAQSGPGWLQSAVAILGPGSP
+WFMMAYAAMIIFFCFFYTSVVSNPDDMAENLRKYGGFLPGIRPGKRTAEYIDFVMSRLTF
+IGALYLVLICMVPMMMNPNTALGGTSLLIVVSVTMDTVS
+>A7IPQ0_XANP2/80-418 A7IPQ0.1
+AIFALNIMPYISASIIIQLLTSVSPTLEALKKEGEAGRKQLNQYTRYLTVVLAVFQAYGI
+AVGLEGSGSVVADPGWFFRITTVITLTGGTMFLMWLGEQITSRGIGNGTSLIIFGGIVAE
+LPGAFVRTLQLGREGAISTPLILAALVLAVVVIAFIVFMERAQRRLLIQYPKRQVGNRIY
+EGQSSHLPLKLNTSGVIPPIFASSLLLIPTTIASFLQGSGPEWLQTITTHIGHGRPAYMV
+LYVLLIVFFCFFYTAIVFNPVETADNLKKHGGFIPGIRPGERTAEYIDYVLTRITVVGAA
+YIAAVCLFPELLISYASLPFYFGGTSLLIVVSVTMDTVS
+>SECY_RICCN/70-411 Q92GY6.1
+SIFALAIMPYITASIIIQLMSVAYKPLENLKKEGEVGKRKVNQLSRYLTVLLASFQAYGV
+AISLESIVTNTGPVVILAGFFFRITTVITLVVGTMLLMWLGEQITQRGIGNGTSLIIFIG
+IISGVPSAIISMFELSRKGALSPLIAIAVCIGVVVLIAIIIFFERAQRKLLVQYPKRQVG
+NKIYGGEATHMPLKLNTSGVIPPIFASSILLFPATLANFSNSNSETMGMLTYYLGHGKPV
+YILLYVALIMFFSFFYTAIVFNSEETANNLRKYGAYIPGKRPGKNTSDYFDYILTRLTVI
+GGIYLSVICVIPELLMNKYVISLSLGGTSFLIVVNVVLDTMT
+>Q2G8W0_NOVAD/80-430 Q2G8W0.1
+SLIALGVMPYITASIVVQLAASLHPALAAMKKEGESGRKKLNQYTRYGAVLLTAIQGWVL
+ASGLEAYGASSGLQAVVNPGLLFRVGAVISLIGGTMFLLWLGEQITSRGIGNGVSLIIMA
+GIVAQMPKFFGNLFEGGRTGSISPFLIFGIVIMLIALVIGICFLERATRRLLIQYPKRAT
+QRGMMAADRSHLPLKINTAGVIPPIFASSLLLLPLTITQFAGNSISPDTKMGQAIVTLNQ
+YLGHGKPLYMLFYALGIIFFSFFYTAVVFNPEETAENLKKNGGFIPGIRPGKNTANYLDY
+VLTRITVLGAAYITVVCVVPEFIMAETGMGTLFFGGTSLLIVVNVTVDTIT
+>A6E0Q6_9RHOB/73-411 A6E0Q6.1
+GIFALGIMPYISASIIVQLMTAMVPALEQLKKEGEQGRKKINQYTRYGTVALATLQSYGL
+AVSLQSGDMVSNPGMFFIASCMITLIGGTMFLMWLGEQITARGVGNGISLIIFVGIIAEV
+PAALAQFFASGRSGAVSPAVIVGVMLMVVAVIAFVVFMERSLRKIHIQYPRRQVGMKIYD
+GGSSHLPVKVNPAGVIPAIFASSLLLLPATITTFSGNTTNPVLSTVMAYFGPGQPLYLLF
+FTIMIVFFAYFYTFNVAFKTDDVAENLKNQNGFIPGIRPGKRTAEYLDFVVNRVLVIGSA
+YLAAVCLLPEILRNQFAIPFYFGGTSVLIVVSVTMDTIQ
+>Q1UZE8_9RICK/67-404 Q1UZE8.1
+AIFALGIMPYISSSIIVQLLTGVSDYFKNLKAQGETGRAKITQITRYGTVILATIQGYGL
+SIGLQSSADLVINPGLFFTITAVSTIVAGTMFLMWLGEQITQRGIGNGISLIIFAGIVAE
+IPRALVTTFELGRTGAVSTIMIIGIFVLLVATIMFIVFMERALRKILINYPKRQMGNKMY
+GGESSHLPLKINQAGVIPAIFASALLLLPVTFSNFSFSDNDTFLNLSSYFTQGQPLYMLL
+YASGIIFFTFFYTSITFNPTETADNLRKYGGFVPGIRPGENTALYIEKIVTKLTTIGALY
+LTIVCLMPEFLIANYPIPFYLGGTSILIVVVVAIDTVT
+>Q3R245_XYLFA/76-424 Q3R245.1
+SIFALNVMPYISASIVVQLATHIFPSLKAMQKEGESGRRKITQYSRIGAVILAVIQGGSI
+ALALQNQTAPGGAAVVYAPGAAFVMTAIVALTAGTVFLMWVGEQVTERGIGNGVSMIIFA
+GIVAGLPGSVLQTIDAFRSDALSLISLLIIVFIVLSFTFFVVFVERGLRRIAVNYARRVE
+GRNSYMNKSSFLPLKLNMAGVIPPIFASSILAFPVTLSIWSGQASSNTLFGAWLQRVSSA
+LGPGEPLHMILFAVLIIGFAFFYTALVFSSQETADILKKSGALIPGIRPGKATSDYVDGV
+LTRLTAVGSLYLVIVCLLPEFMQSRIGASFHFGGTSLLIAVVVVMDFIS
+>A4NK90_HAEIN/76-416 A4NK90.1
+SILALGIMPYISASIVIQLLATVSPALAELKKEGAAGQRKISKYTRYATVVFATIQAVAI
+STGLPNMLSGLVPNVGFSFYFTSVVSLVTGTMFLMWLGEQITERGIGNGISILVFGGIVA
+GLPSAILQTIEQARQGQMHPLVLLLIAAIVFAVTYFVVFVERGQRRIRVEYAKRQQGRQI
+LGGHSTHLPLKVNMANVMPAIFASSIILFPATLTQWFGQNDKFEWLNNLSMLLNPGQPLY
+LLVYAVAIIFFSFFYTAMQYNPRDTADNLKKSGAFIPGIRPGEQTSRYIDKVMTRLTLIG
+GLYVTFVCLVPYIMTSAWDVKFYFGGTSLLIVVVVIMDFIV
+>Q057C4_BUCCC/64-407 Q057C4.1
+SIFALGVMPYISSSIIVQLLTLISSYLRNLKKEGDIGKKTINQYTKYITFFLSIIQSIGV
+VISLPFLPGMKNIIVFADCYFYIIAVVSLVTGTIFLMWLGELITTKGVGNGVSLIIFSGI
+ISGLPASVIRTYKLIKIKNFSFLYVFFLLLIIFFVIFIVVFIEKSQRKIIVCYARRQQGR
+RMYTAHHSYLPLKLNMAGVIPVIFSSSLIVFPSILLTYLRYVFNDYKKIIYFFDFLKFKH
+SIYLIVNIILIIFFCFFYTNIIFNVQDTANNLKKSGAFLPGIRPGLKTAEYIKNIVFKLT
+TIGSIYTVFICLIPDIVRYFFKVPFNFGGTSLLIVVVVLIEFIT
+>Q8D1Z2_WIGBR/82-424 Q8D1Z2.1
+SIFSLGIMPHISASIIIQLLTIIHPKLSEIKKDGEFGRRKINKYTRYGTLFLAIIQSISI
+SISLPNMPGMQELIINKGIEFYITTITSLVTGTIFLMWLGEQITSRGIGNGISILIFSGI
+IAGLPIEVIKSIEQARQGNLNIITVLISIILVFVITYFVVFIERGQRRVIVNYAMRQKGR
+KIYAAQITHLPLKVNMSGVIPAIFASSLILFPATIASWFGEGIGVKWMSKIPYYLEPGTF
+SYSILYASAIMFFCFFYTSLVFNSKDTADNLKKSGAFISGIRPGIKTSQYINKIMMNLTL
+IGATYIALICLMPDFFRVFIKSPFHFGGTSLLIVVVVTIDFMT
+>Q6F7T2_ACIAD/83-426 Q6F7T2.1
+SILALGIMPYISASIIVQLMSTVVPSLEALKKEGEQGKRKINQYTRYGTLLLALVQGVGM
+CAGLISQGITLTSGLAFYIPAVTSLVAGTMFLMWLGEQITERGIGNGISMIIFAGIVAGL
+PNQVIQAFTSVQNGQGSLIGIVVFALLSLAVLAAIVFIEKAQRRIPVNYAQKQQGRRIFT
+AQQTHLPLKINMAGVIPAIFASSLLLFPASLGQWLGSADPNAGIVKRSLQDLALVLSPGQ
+PLYLMLFGTLIIFFCYFYTALVFSPKEVSENLKRSGAYVPGIRPGEQTARYLDHILNRLT
+FIGAIYITVVCLMPMILQNSFGIPFHLGGTSLLIVVVVVMDFMA
+>Q6Q8W8_9GAMM/67-407 Q6Q8W8.1
+SIFALNVVPYISSAIIMQLFSNSIPYLQELKKDGQAGRNKITQYTRYGTAILAFIQASAL
+AVTLSASGLAYVPGPTFFVSAVFSVVAGTMFLMWLGEQVSDRGIGNGISIIIATSILTGI
+PGAIGQALEQSRQGDLSILLLIGIGLLSMAVIAVVVFIERGQRRITVNYAQRQQGRRMMQ
+AQQSHLPFKVNMAGVIPAIFASTFLLFPASLSTWFGENESLSFLQSFSLALNPGQPLYIL
+VFAGLIISFCFIWLALTFNTKDVSDNLKRSGAYIAGIRPGEQTANYIDNVLARLTVFGAI
+YLTLICLLPLALINFAGISPTISIGGTSVLIIVVVLMDFMS
+>A9BRX1_DELAS/74-413 A9BRX1.1
+TVFALGIMPYISASIIMQLMTYVVPTFEQLKKEGESGRRKITQYTRYGTLGLAIFQSLGI
+AVALESSAGLVLSPGFGFRLTAVVSLTAGTMFLMWLGEQITERGLGNGISILIFGGIAAG
+LPSSIGGLLELVRTGAMSILAAIFIVLVVAAVTYFVVFVERGQRKILVNYARRQVGNKVY
+GGQSSHLPLKLNMAGVIPPIFASSIILLPATVVNWFSAGESMRWLKDIASTLTPGQPIYV
+MLYATAIIFFCFFYTALVFNSRETADNLKKSGAFIPGIRPGDQTARYIDKILVRLTLAGA
+VYITFVCLLPEFLILKYNVPFYFGGTSLLIIVVVTMDFMA
+>Q7DDS8_NEIMB/73-410 Q7DDS8.1
+SIFAIGIMPYISASIIVQLASEILPSLKALKKEGEAGRKVITKYTRYGTVLLAILQSLGV
+ASFVFQQGIVVTSSFEFHVSTVVSLVTGTMFLMWLGEQITERGIGNGISLIITAGIASGI
+PSGIAKLVTLTNQGSMSMLTALFIVFGALLLIYLVVYFESAQRKIPIHYAKRQFNGRAGS
+QNTHMPFKLNMAGVIPPIFASSIILFPSTLLGWFGSADTNSVLHKIAGLLQHGQLLYMAL
+FAATVIFFCYFYTALVFSPKEMAENLKKSGAFVPGIRPGEQTSRYLEKVVLRLTLFGALY
+ITTICLIPEFLTTVLNVPFYLGGTSLLILVVVTMDFST
+>Q5NHU8_FRATT/74-416 Q5NHU8.1
+SIFALGVMPYISASIIFQMLSAVYPKFIELKKEGESGQKKITQYTRYLTLALAIVQSFGI
+VAFVLHQDGLVTTNNMALFYLTTIVSVTTGSMFLMWLGEQITERGVGNGISLLIFSGIVA
+NLPFEISNTLSQANQHVISYLSVWVLLILLLLVIAFVVFMESAQRKITVNYAKRQQGRKM
+FAAQTSHLPLKLNMAGVIPAIFASSILMVPGVLLGWLSNYNSLSWLADVAEMLQPGSIVY
+TVVFAATIIFFCFFYTSLVLNPKETADNLKKSGAYISGVRPGEQTAKYIDAVMTRLTLVG
+SLYITAICLLPIFVVKFFAQGLSFTFGGTSLLIVVVVMMDFMA
+>Q7WZR8_9GAMM/64-388 Q7WZR8.1
+SIFSIGLMPYISASIIMQVITGMFLDVEVSKHKLTSYLRYLTFMLSVIHSLVVSILFLEK
+SVVYYKKSVVYLTIILTFVTGAIFLMWLGEQITDKGIGNGISLIILSGLVSVIPNALGRT
+LFLTIKDSSWMYIQIFKVVSLVLITIILVVVIESGQIRIKVSYPRRLIGKKLYATQSSYL
+PLKLNMAGVIPAIFASSSLIITASVGQWINRSILPQLSPGQPLYIMFFVLSVIFYSFFYT
+AIVLNAKEVSINFKKSGAFIHGMRPGKQTAGFISKVSSRLNWFGAIYIVFFSLIPQLIMV
+YCKIPFCGGGISILIMVVVVLDFLS
+>A5EX98_DICNV/69-412 A5EX98.1
+SLLALGVAPYISASIVMQLLTHMLPALKDLRQEGSAGQKKITQYTRYFTLFLAIMQGFAI
+SRTVMAAGMTISAGSGFLLTATIGLTAGALFMMWLGEQITERGIGNGISMLIFGGIAVNM
+PSGILGLFNQAKIGEIGYGRFFLLLGIIVSLFALIVYVERAQRRIKIHYAKRQQFGTSAM
+GERFYLPLKINMAGVIPAIFASAIITLLVSGLTLASSLPGAAGRYLSDLAAGFHQGAWLY
+IATFVLLIILFSFFYTSIMFENRELADSLKKSSAFIQGFRPGRQTADYIDTVQERLTFVG
+AFYVAFVCVLPSLVNMGSASGQVLFLFGGTSLLIAVVVAMDLMS
+>Q6MJ32_BDEBA/70-415 Q6MJ32.1
+SIFALGIMPYISSSIIFQLLTSAIPYLEALKKEGEQGRRKINQYTRYATVALAIIQGYGI
+STWLMNSTSPDGHPLVIAPTVAFLPFQIMTIITLTAGTCFIMWLGEQITERGIGNGTSLI
+IFTGIAAAIPGGAQQLWELVRTGEMRFALVLLLVAFMVAIIAAVIYMEVAQRRITVQYSQ
+RQGGGGMQSMQTPTSHLPIKLNISGVIPPIFASSLLMFPATMAQFVNTPWLKALQDSLNP
+SGAIFNIMFVALIVFFSFFYTEIVFNPNDVAENLKKYGGFVPGVRAGKSTADYIQRVLER
+VNVVGCIYLCTICILPGIMVSQFNVPFQFGGTSLLILVGVALDTAQ
+>B5EFS0_GEOBB/71-411 B5EFS0.1
+TVFALGIMPYISSSIIFQLLTVVLPAVEKLSKEGDAGRKKIIQYTRYGTIVLAVVQAFGI
+SIGLEAMRGPAGELVVPNPGWGFRLMTVITLTAGTAFIMWLGEQMSEKGIGNGISLIIFA
+GIVARIPTAIGNSFRLIKTGELSLFVLLLIAAVMFAVIAAVVFMERGQRRIPIHYAKRVV
+GLKTVGAQSSHLPLKVNMAGVIPPIFASSIIMFPATVGNFIDVPWVQAASKQLAPGKLLY
+EVLFVAFIVFFCYFYTAVTFNPVDVADNVKKQGGYVPGIRPGKETSDFLDAVLTKLTFAG
+AIYISAVCVLPSILIGKFNLPFYFGGTSLLIAVGVGMDTLS
+>A3EVQ1_9BACT/75-412 A3EVQ1.1
+TIFALGIMPYISASIILQLLTVVHPTLQAMAKEGERGRKIITRYTRYLTVLIALVQSFGI
+ALGLEGMNNGQFVPHPGWSFRFIVVITLTAATTFVMWIGEQITERGVGNGISLIIFSGII
+ARLPAAIINTYKLYNQGEISGFLILALVVMVFLIVSSIVFIETARRKIPIQYAKRLVGNK
+MMGGQSTHIPFKINTAGVIPPIFASSLISFPAIIAGFVSVPWIQSFGKSLSPGSFSYTGL
+YVLLIVFFCFFYTAVVLNPTDIAENMQKYGGYIPGVRPGQKTVEYLYRVMNRITFVGALY
+LSIVCVIPELLIYQLHVPFYFGGTSLLIVIGVSLDTAQ
+>Q1MPP6_LAWIP/71-412 Q1MPP6.1
+SVFALGIMPYISASIIMQLLQVIIPDFKRMAKEEGAAGRYKITQYTRYGTVIITLIQGIG
+IAIGLESMYSPTNIPIVLEPGWVFRIVTVLTLTAGTVLIMWLGEQISEKGIGNGISLIIF
+SGIVVGIPGAIVKTYQLIILGDMNILIALVLMLFMFAVLTGVVFMERAQRRIPIQYAKRQ
+LGRKVYGGQSTHLPLRVNTAGVIPPIFASSLLLFPATMASFDISDWLKDIAVWFSPSTIL
+YNCIFLVLIFFFCYFYTAIIFDSKDISENLKKAGGFIPGIRPGEKTCEYLDGVLSRLTLW
+GGVYISIISILPMMLISQFNVPFYFGGTSILILVGVAMDFMS
+>SECY_AQUAE/71-412 O66491.1
+TVFALGVMPYISASIMMQLLTVAIPSLQRLAKEEGDYGRYKINEYTKYLTLFVATVQSLG
+IAFWIRGQVSPKGIPVVENPGISFILITVLTLVAGTMFLVWIADRITEKGIGNGASLIIF
+AGIVANFPNAVIQFYEKVKTGDIGPLTLLLIIALIIAIIVGIVYVQEAERRIPIQYPGRQ
+VGRQLYAGRKTYLPIKINPAGVIPIIFAQALLLIPSTLLNFVQNPFIKVIADMFQPGAIF
+YNFLYVTFIVFFTYFYTAVLINPVELAENLHKAGAFIPGVRPGQDTVKYLERIINRLIFF
+GALFLSVIALIPILISVWFNIPFYFGGTTALIVVGVALDTFR
+>Q01WB2_SOLUE/74-438 Q01WB2.1
+TVFALGIMPYITASIILQLLTVVVPTLEKLQKEGELGRRKITQWTRYLTIILSILQSFGI
+SQGLMGMQQGIVINPGIGFVFLTILSLTTGTAFIMWLGEQISERGVGNGMSLIIFTGIVV
+GLPNAIANIYQHVFTIHDWGAITLIVLMALMVAVVAFIVLVERGERRIPVQYAKRVVGRR
+VMGGQSTHMPLKVNAGGVIPVIFASSILAFPQTLAQFGWVKNLPWLSKTLATIQHGEPMY
+YVLFVAGIIFFCFFYVSIIFNPNEAADNMRKYGGFIPGIRPGRNTADYMNNILTKITVVG
+GIYLAILCLIPDIMISGIKLHHLWLVGDWIDRVAPRFILEGLGVNFYFGGTSLLIVVGVA
+MDTIN
+>Q08ZH8_STIAU/26-370 Q08ZH8.1
+SIFGLGIMPYVSASIIMQLLAVVVPSLERLQKEGASGRQKINQYTRYGSIVLSVVQGIGI
+SRWLASLGRSDAGQSGFNQIVVPDDSAWFTFMTVISLTAGTAFIMWLGERITERGIGNGI
+SLIIFAGIVAGLLPNGKTLLDMTAQGAIEAAALVGLAVFMLFIIAVVVYVERGMRRIPVQ
+YAKRMAGRRMFAGQATYFPMKVNTSGVIPPIFAGALLSFPATLGTWFPFLQTFRQGLEGN
+PWLYNGLFVLLVIFFAYFYTALTFRPDDVADNIKKQGGYIPGIRPGRQTADFIERVLNRI
+TFGGAIYLATICVIPTILTQWLQVPFAFGGTALLIVVGVALDTVQ
+>A6GCG0_9DELT/70-411 A6GCG0.1
+SVFALGIMPYISASIIMQLMTVVIPKLEQLQKEGETGRRKINQYSRYGTVGLALVQGYFM
+ASWLEGQNTPGQTLVLETGLPFKLMTMLSLTAGTCFLMWLGEQITERGIGNGISLIIFAG
+IIADMPTASYQLAQKAIDDPENFGPLPLAMLLVVVLVVIAFVVIMERGQRRIPVIYAKRV
+VGKRMFGGSQNYLPLRINNAGVIPPIFASSIIMFPAQIAGMTGNPYLQRFAAAFSYGNWL
+YLTVYVALCIFFCYFYTQIQFNPVDLADNLKKQNASIPGVRPGKRTAEHIEAILGRLTFA
+GSWYISAVCVLPVFLQTEFNVPFYYGGTSLLIVVGVALDTAQ
+>Q04PV8_LEPBJ/72-436 Q04PV8.1
+SIFALGIMPYISSSIVMQLFMVLVPSLQKLQKEGEEGRKKIGQYTKYGTVILCAIQSLAV
+IQLAKGWSTGTELEPARYPGLINSSVVPYFYLIGILSITTGTVLLIWLGEQITERGIGNG
+ISLLIFAGIIGRLPESMVQLFSTDTMDALNVLILLILLILLISLTVLLTQGVRKVPLQYG
+KQMVGRKMVQAKSQSIPFKVNGANVMPIIFASSLILFPQTIIQWLSSSSEQWAGWAIIMD
+FFNPFSQIWYHALFYYIIYTSLIIFFAYFYTAIQFNPAELAENLKKYGGFIPGIRPGSHT
+KEYIEKVLNRITLPGAMFLAGLALAPYIIIKFLDLSSNSGGGSLVYTFGGTSLLIMVGVA
+LETLK
+>SECY_BORBU/72-409 O51451.1
+SIFMLSIGPYISASIIVQLLVYSFPSLKKMQEGDGGRQKTKKYTKYLTIVAAVVQGYATS
+LYAKGIPGAVTIPFYRYIFVAILTVTTGTFILLWFGEQINQRGVGNGTSLIIFSGIVVRL
+QAALFNLFQSMQDPSQNVNPVFVILIISIFILVVILIIYEYKAQMRIAIHYARANSNNTV
+SSYLPIKLNPSGVLPVIFASVLITLPLQILSGFAETSSIARQILSYLRPNGFYYTFLNVI
+LIIGFTYFYSKIQLSPKDISNNIRKNGGTIPGIKSDEMEKYLDEIMNKTLFSGSIFLSII
+AIIPFLVQNIFRFPHDVSRIMGGSSLLIMVGVALDTLI
+>Q73PL2_TREDE/73-413 Q73PL2.1
+SVFMLGVMPYISTQILMQLAMIIFPRLKKIAEEDGGRKKIQVWTRIVTVFVALLQSSAVG
+TWARAIPGAVVISSPVLHLFITMVTVTTGTMITVWMGEQITARGIGNGISMLIFAGIVAR
+LPQAVWELIKLVSNNELNLVFVIIAFAMFVGIIALVVYEQQGQRKIPVHYAKRVIGRKMY
+GGQNTYIPFKINPSGVIPIIFASSFLTFPLMLSQMWGSNVSWLASVARFLRSDGWGYNVL
+YVVLIIFFAYFYTQVALNPTEIAKQIRENGGSIPGIRTDKTEEYLQKILNRLILPGSLYL
+AAIAVLPTVIQWAFSFPRNISMLMGGTSLLILVGVDLDTMS
+>Q67JW3_SYMTH/69-405 Q67JW3.1
+AIVAMGVTPYINSSIIMQLLTVVIPRLEELQKEGEEGRKKIQQYTRYGAVVLGLVQAFGI
+GYALRSYGAFYSNSWTTLFVIMVSLTAGTALVMWIGEEITEKGIGNGISLIIFANIVSRL
+PYSIYNEILLLRAGQRNIFQPLLVAVVALLMVVFVVIINEAVRKIPVEYAKRVVGRRVVG
+GQRTHLPIRINQAGVIPLIFASSLMYFPITIAGFFPNSDFAVFVGRYLDTRSWWFMLINA
+LLIVFFTYFYTAITFNPENVADNIKKNGGFIPGYRPGRPTAEYLERVSSRLTLVGGLFLA
+AVTILPITIMSLAGVQNAYIGGSSLLIVVSVALETTK
+>A7FQ38_CLOB1/69-409 A7FQ38.1
+SIFAMGVVPYINSSIIMQLLTIALPSLESLSKEGEEGRKKIQQYTRYGAVILAVIQAFST
+YAIIARAGALRDGSKLNLFIIIITVTTASTFLMWFGDKITEKGIGNGISLIIFVNIVSRF
+PSTIYSIVGLQKAETVNFVEVIVFIVIALALFLLVVIMNLGERRIPVQYAGRAVGNKIYK
+GQSTHIPINVNSSAVIGIIFAISVMQFPITIGQFWPESAFYKFITLNQYSPFRDKSIAYI
+VLYFLLTVFFTWFYTVVTFKPDEMAENMHKSSGFIPGIRPGEPTAEYIERVITKSSIIGG
+TFAAIIAVFPIIMAAYSKFQGISFGGTSMLIMVGFALDTIR
+>A6LPT1_CLOB8/69-416 A6LPT1.1
+SILALGVMPYINASIIIQLLTVAIPQLEQLSKEGDTGRKKIQNATRYVSLGIAFILAYGI
+FATISSSGATVGLTAIQKTIVVFALVVGTTFCMWLGDQLTVKGIGNGTSILIFVNIISRV
+PATIASMMTLQQAGSASIVEIVLFGVFTVFLLATILYFSLSERRIPVQYAGKFASGNSNM
+VKSQSTHIPLSIIGSAVLAIIFSMSVMDFPKTIATLFGGVGESQKEWAKWVLNNPTSIFN
+NKSWMYMVLYAVLTIFFNWFYTQITFKPDEMSENLHKSAGFVPGVRPGEETTTYFERVLN
+RLSFIGGILAAVLAVTPVMIQNYTQFQNIAFSGTGLLIVINVALDFTR
+>Q0SQG4_CLOPS/69-409 Q0SQG4.1
+SIFALGVVPYINASIIMQLLTVAIPKLEQLSKEGDDGRKKIQKITRYASIVIGAITAYGS
+YVIIHNVGALKSNSPVSMFLILLTLVVGSTFLMWLGDQITVKGVGNGTSLIIFANILSSL
+PMTGYQIYNLSKIGKINVVEIALFIFFTLALLAGVIYLSLAERRITVQYAGKAVGNKMMK
+GQSTHIPLSIIGTTVIAIIFAMSVMSFPTTIAQFFPEAGWSQWITGSSYSPFNAKTWMYP
+VLYALLTIFFTWFYTQITFKPDEMAENMHKSSGFIPGIRPGKPTEIYLEKVLNRISMFGG
+CFAAIIAVVPILVANYTPFQGIQFGGTSLLILVSVSLEIMR
+>A9KJH4_CLOPH/71-425 A9KJH4.1
+SLFALGIGPYITSSIIMQLLTIAIPKLEEMQKDGESGRKKIAEISRYVTIGLSIIESVAM
+VIGFSGSGALEGGLTFTNIVVITASFTAGSAILMWLGERITEKGVGNGISVILLINIVAN
+MPRDIYGLIEKFVLGESVVKGVTAAIIIVAVILLSVVLIILLNAAQRKIAVQYAKKVQGR
+KMVGGQSSHIPLKVNTAGVIPVIFAVSIMQFPIIIASFFGVQPARAYFWPKVLHMLNSQS
+WFNIKNGEFKYTVGVLIYMALIVFFAYFYTSITFNPMEVANNMKKQGGFIPGIRPGKPTT
+EYLTKVLNYIIFIGAIGLMIVAIIPIFFSGMFDAHVSFSGTSLIIVVSVVLETMK
+>A7VH89_9CLOT/71-420 A7VH89.1
+SIFALNVTPYITASIIIQLLTIAIPALEEMQKDGEDGRKKITAITRFLTIGLAILESAGL
+AINFGRKGFMDSYNFWTVLTMIVILTGGSAFVMWLGERVTDRGVGNGISIILLINIVSTM
+PNDFKNIYTQFIKDKDPVRMCLIALLVVAIVVCVTILVCMLQGAERKIPVQYAKKVQGRK
+QMGGQSSNIPLKVNTAGVIPVIFASSLMAIPSIITSLFGKSPSGVGAKILQGMSQSYWFN
+ANYPWGFLGLAVYILLVFFFAYFYTAITFNPMEIANNMKKSGGFVPGIRPGKPTQDYLNK
+ILNYIIFIGAVGLLIVAMIPMFFNGFFSVNVSFGGTSIIIVVGVVIETMK
+>A6BIS2_9FIRM/71-421 A6BIS2.1
+SVFALSITPYITSSIIVQLLTIAIPQLEEMQRDGETGRKKIVAITRYLTVGLALIESGAM
+AVGFGRQGLLVKYNFVNAAIVVLTLTAGSAFLMWIGERITEKGVGNGISIVLVINIISRI
+PSDMKTLFDQFVKGKAIASACLAVCVIIAIILALVVFTVILQDGERRIAVQYSQKIVGRR
+SYGGQSTNIPLKVNTAGVIPIIFSSSLMQFPIVIASFLGKDNGSGIGSEILRGLNQSNWC
+NPEQIKYSWGLVLYIVLTVFFAYFYTSITFNPLEIANNMKKSGGFIPGIRPGRPTVEYLT
+KILNYIIFVGACGLILVQIVPILFNGWLGAKVSFGGTSLIIIVSVILETLK
+>A7VR33_9CLOT/71-423 A7VR33.1
+TLFAMSVTPYINSSIIMQLLTVAIPPLERMAKEGEEGRKKIGAITRYVAVVLGLVQGLAY
+YLYLRGSSYEGTPIVTYTEGAAGVFTAIVIVLVFTAGTAMMMWLGEQINQKGIGNGISIL
+LFAGIVARLPDTVNILVQALQAAWQAPDSFGQYYFFVPLFVIIFLAIIWVIVFMNDAERR
+IPVQYAKRVVGRKMYGGQSTHLPIKVNMSGVMPIIFASSILTIPSTIQLFVTPTGFWKTV
+LDALSTTGWVYALIYFLLILMFAYFYVAIQYNPIEMANNLRQNNGTIPGIRPGKPTSDYI
+QKILSKITLIGALFLAVIALLPIAFSAFTGMHNLMMGGTSVIILVGVALDTMK
+>A6NXF0_9BACE/71-437 A6NXF0.1
+TVFALGVQPYINSSIIIQLLTVAIPALERLQKEGGEEGRKKIAAITRYTTVAIALLQGFG
+YFTLINANGLVGSDLPTWLAGIIIVLTFTAGSAFVMWLGEQITEFGIGNGISIILFAGIV
+SRFPSMLMNMVQGVQRWSMHLSDEEISAMSNGEAFRNSLVHPAMIPLIIIGILALVVFIV
+FINDSERRIPVQYAKRVVGRKMYGGQSSHIPLKVNMSGVMPIIFAQAIASLPATIAAFIP
+GGMDSTFMKVFDSNGLVYAIVYFLLILGFSYFYATMQFNPIEVANNLKKNGGFVPGFRPG
+KPTADFIYKVLNKITLFGAIYLAVIALLPIITSNIINLASGSQMGRSLSIGGTSIIIVVG
+VALETVK
+>Q250L2_DESHY/70-413 Q250L2.1
+SVFALSITPYITASIILQLLTIVIPSLERLAKEGEFGRKKITQYTRYGTVILGFIQGFGM
+TFGLRGALIIPKPGMEWAIYLLVALILTAGTAFLMWLGERITENGIGNGISLIIFAGIVA
+GVPDAIKRIAGLLSVGEINVFSVFGLIVIGLGIIAGVVFIQEGQRRIQVQYAKRVVGRRV
+YGGQSSHIPMKVNQAGVIPIIFAISLLAFPSTIATWMDPASAYVRFVNTWFVMNGSLTSI
+PYLIVYAVLIIFFTYFYTAVSFNPVDVADNLKKYGGFIPGLRPGRATSDYLSKILSRLTL
+AGGTFLAMIAVLPSLVIGLTGIPNITLGGTSLLIVVSVALETMK
+>Q8R7X3_THETN/69-402 Q8R7X3.1
+TIFAMSIVPYINASIIMQLLTIAIPSLEQLAKEGEEGRKKIAQYTRYLTVVLALIQAIGM
+TIGLRSAVINPTFFRLTVIVITLTAGTTFLMWLGERITENGLGNGSSLIIFAGIISRIPN
+MIYLTHEYIKAGTSNIFGAIAFVVAELIMIVLIILATEGQRRIPVQYAKRVVGRRVYGGQ
+STHIPIRINMAGVIPIIFAISLLQFPQQLATFFPHSSFYNFVQKWLSTNGLIYNLLDIFL
+IIGFTYFYTAVIFNPQDISDNLKKYGGFIPGIRPGKPTTEYLTKVLNRIVFVGALFLAFI
+ATMPVVLMNVTGLQLYFGGTALLIAVGVALDTMK
+>A4XLR1_CALS8/69-419 A4XLR1.1
+SIFAMSVTPYINSSIIMQLLTIAIPALEELAKQGEEGRKKLAEWTRYGTAILAFLQAVGI
+YFGLKNAQGLTGGVPVITTQGQGFLGFITITLALTAGTVFLMWIGEQITENGIGNGISLL
+IFAGIISRIPNGAVSLWNYVAKLNEFSLTSIIGVLLFLVMALAIIVFIIVIQEGERRIPV
+QYAKRIVGRRVYGGQSTHIPIKVNIAGVIPIIFAISLVMLPTTIAQFFPNSGFYKFVKAY
+FSSGSFWYTFFYALFIIGFTYFYTAIVFNPVEIANNLKNNGGFIPGIRPGKPTVDFITRV
+LSKVTFAGALFLAFIAILPTLVGLMFRHQLNIYFGGTSLLIVVGVALETIR
+>A3DJJ2_CLOTH/71-411 A3DJJ2.1
+TIFAMSITPYINASIIIQLLTVAIPKLEALAKEGEEGRKAIAEYTRYGAVVLGFLQATAF
+YFGLAQAVNERNVLSFITITLTFTAGTAFLMWLGEQITEYGIGNGISLLIFAGIVSRGPR
+GILYLWDLYRLERLGKGILGIFGVLGVLLLFVVIIASVVWVDQAERRIPVQYAKRVVGRK
+MYGGQSTHIPIKVNMAGVLPIIFATSFVALPATIVGFFFPNSTHPVAEYFRSFQSRIEVA
+ILTGLLIIFFTFFYTFIQFNPVEVANNLKKNGGFIPGIRPGKPTSDYIYKVVSRISWFSA
+LFLAIIQILPSLLQAITGIRGIWFAGTSVLILVGVALETVK
+>A8MLG0_ALKOO/69-408 A8MLG0.1
+TIFALSISPYITSSIIMQLLTIAIPSLEALAKEGEEGSKKIAQYQRYATIILALIQATGI
+SVGLFRGALINQDTFSIIVVILTLTAGTAFLMWLGEQITEKGIGNGISLLIFAGIIASLP
+SSLFTTFALTKAGQINPLAIILFIVIAIAMIVAVVAIEAGTRKIPVQYAKRVVGRKMYGG
+QSSHIPLKVNQSGVMPVIFAMSLLQFPHTIAYFIGSEGGFAKFLNTWLSPTGMPGVFIYN
+LLSAVLIIFFTYFYTAITFNPVEISNNMKQNGGFIPGIRPGKPTADYINKILTRITLSGA
+VFLAIITIVPTIVLGITHIPISFGGTTIIIIVGVALETMK
+>Q18CH6_CLOD6/69-406 Q18CH6.1
+SLFALGISPYITASIIIQLLTVGFESLAELQKSGEEGKKKINKYTKYTALALAVVQALGI
+TLGIVRSALISNSVFFITTVVITLVSASMLVMWIGDKITEKGIGNGSSVIIFAGIISRIP
+TDVIKISQQVKSGEVAPWVIVILAVVILLTVTGVTFIQEATRKIPVQYAKRVVGRKMYGG
+QSSHIPMKVNQSGVMPIIFASSLLAFPQTIAMFMGPNAQAFVQKYLSMATEQGFWTYRSI
+EILLIIFFSYFYTTVSFNTEDISKNMKNNGGFIPGIRPGEPTMDYLNRILTRLTLAGATF
+LAIIAMVPALTTHYMKVNMSLAGTSLLIVVGVALELKR
+>B8D0S8_HALOH/72-406 B8D0S8.1
+TIFAMSITPYITASIILQLLTGVIPRLEELQKQGVEGRKKLTQYTRYGTVVLAIIQAFGI
+TMLIGRHNVIVNPNLFNLMLIVISLTAGTAFLMWLGEQITDKGIGNGISIIIFTSIISRF
+PSYIHRNWELYKTGDITALNILFFLVLAVVIIAGVIFIQQGERRIPVQYSKRVVGRKVYG
+GRSTHIPMRINQAGVIPVIFAQAVLQFPTVIAAVLPYGWAQDIATALEPGKPVHLVLYAA
+MIFFFTYFWTAFTFNPEEVADNMRKSGAFIPGIRPGKATENFLTRILVRVTLAGAIFLTV
+IAIMPYFISDITRVRISFGGTSLLIMTGVALQTMQ
diff --git a/demotic/examples/example-single.fa.phr b/demotic/examples/example-single.fa.phr
new file mode 100644
index 0000000..65bc105
Binary files /dev/null and b/demotic/examples/example-single.fa.phr differ
diff --git a/demotic/examples/example-single.fa.pin b/demotic/examples/example-single.fa.pin
new file mode 100644
index 0000000..3a5061c
Binary files /dev/null and b/demotic/examples/example-single.fa.pin differ
diff --git a/demotic/examples/example-single.fa.psq b/demotic/examples/example-single.fa.psq
new file mode 100644
index 0000000..c0c4ce6
Binary files /dev/null and b/demotic/examples/example-single.fa.psq differ
diff --git a/demotic/examples/example-single.pbl b/demotic/examples/example-single.pbl
new file mode 100644
index 0000000..3a1838b
--- /dev/null
+++ b/demotic/examples/example-single.pbl
@@ -0,0 +1,1748 @@
+A9B431_HERA2/73-422 SVAAMGVYPYITAQIIMQLL----------------IP-LIPALEQLSKE-GEQGRNRIQ
+A8CRX1_9CHLR/78-422 SVAALGVYPYITASIIMTLL----------------TP-VIPKLTALSKE-GEAGRNKIN
+A2Y4E5_ORYSI/132-498 SFFQLGISHQISASIVMQVLfyplfgpallfsngnvLChVLPSLEKLRKE-GLDGHEKIK
+Q7UZW2_PROMP/80-422 GIFALGILPFINASIIIQLL----------------TA-SLPVLEDLQKNeGEAGRRKIA
+Q7NKT4_GLOVI/79-416 GVFMLGILPYINASIIMQLL----------------VP-VFPKLEDLQKNeGEQGRRQIA
+SECY_GUITH/68-404 GVFALGIVPYINASIIVQLA----------------TN-SIPSLEKLQKEeGELGRQKIV
+SECY_CYACA/62-394 SVFALGIIPYINATITIQIL----------------SS-AFPALKKLQSEeGEIGKKKLN
+Q85FU6_CYAME/42-325 GWFVLGIIPTINASIVMQIL----------------IS-IVPALTRLQKEeGEMGQKQIQ
+A0T0J6_PHATR/72-407 GLFTLNIFPYINASILVQLI----------------LG-FSPKLSKLQKEgDLEGRRSIN
+SECY_CYAPA/109-459 GFFTLGILPYMNASFFLQVL----------------TK-ILPSLERFQKEqEEIAQREFK
+Q4G351_EMIHU/63-407 GIGSLGILPYINASIIIQLL----------------TP-LFPNLERLQKEeGELGRQQIS
+SECY_PAVLU/66-404 SILTLGLGPFFSASLAVQFL----------------VK-LYPAFEKLQNEeGEEGRKTIV
+Q6B8X0_GRATL/62-395 GIFALGIVPYINASIMMQLL----------------TK-LIPELENLQKEeGESGRQKIG
+SECY_ANTSP/62-390 GIFALGIVPYIYASIIIQLL----------------IK-LIPYLENLQKEeGEIGRQKIN
+A4RW47_OSTLU/65-398 GIFSLGIVPYINSSIIFQLL----------------GS-VFPELKKLQKEeGEAGRRKFQ
+A7PFA4_VITVI/131-465 GICSLGIVPFINAQIVFQLL----------------TQ-IYPKLQDLQKReGETGRKKVL
+A7HM32_FERNB/75-404 SVFSMSVTPYINASIIMQLL----------------AS-IIPSLKELLKE-GEEGRKKFQ
+A3CK84_STRSV/69-416 SVFALGVSPYITASIVVQLL----------------QMdLLPKFVEWGKQ-GEVGRRKLN
+Q5FM71_LACAC/68-415 SIFSLGVSPYITAQIVIQLL----------------QMdIVPTLVEWGKQ-GEVGRRKTN
+Q03ZM6_LEUMM/68-416 SLFAMGVSPYVTAQIIVQLL----------------QLdIVPRFVEWSKQ-GEVGRRKLN
+SECY_STAA8/69-413 SIFAMGIVPYITASIVMQLL----------------QMdIVPKFSEWAKQ-GEVGRRKLN
+Q4MG72_BACCE/68-415 SIFAVGITPYITASIIVQLL----------------QMdVIPKFSEWAKQ-GEMGRKKSA
+Q6F1X5_MESFL/92-454 SILALGVSPYITASIIVQLL----------------STdVVPILTRWNKS-GERGRKKLD
+Q6KI36_MYCMO/87-436 SIVALGISPFITASLVMQIL----------------QTkLFPPIYRLSQS-GPIGRRKIN
+Q4A5I3_MYCS5/83-437 SIFALGISPFINASLIMMIL----------------QSrLFPMIYKLTQS-GPQGRRKLN
+Q98Q01_MYCPU/90-438 SIVSLGINPFITASLIMTIL----------------QSkLFPPIQKMSQS-GPLGRKKIN
+Q4AAF9_MYCHJ/85-434 SVVALGISPFITASLFMLIA----------------QTkLFPPIHRLSQS-GPAGRRKIN
+Q9PQP1_UREPA/76-434 SLFAIGIGPYITAQIIMQLL----------------SSeLVPPLAKLSKS-GERGRKKIE
+SECY_MYCGE/81-430 SLFAVGISPYISAQIIMQLL----------------STdLIPPLSKLVNS-GEVGRRKIE
+Q8EUD2_MYCPE/81-433 SFMAIGVSPYITAQIIVQLL----------------SSdLIKPLTRLSKA-GERGKRKLE
+Q7X4E3_9MOLU/69-399 CILSLGVIPYVTASIVIQLS----------------QK-VFTFMKEWQEQ-GEKGKRKIN
+Q5Q069_ASTYP/59-398 TLFGLGITPYITASIVVQFL----------------QK-LLPICREWKDQ-GQMGKRKLN
+O21257_RECAM/57-372 SLFALNITPIITYLFLEQLY-------------------YIYSIPLISKK-KNLNKDLIK
+Q74NB9_NANEQ/69-457 SIVSLGIGPIIIGYLLAELF-------------------IGSGELNIDIT-TEEGKRKFE
+Q2EMT2_METVO/30-379 TLITLGIGPIVTAGIIMQLL-------------------IGSELVKLDMS-KPDNRALFQ
+A5UL65_METS3/72-433 SILTLGIGPIVTASIVLQLL-------------------VGSKLLDLDLS-SPEDKSQYQ
+SECY_METTH/73-436 SILTLGIGPIVSASIILQLL-------------------VGGKILKLDLS-RHEDKAFFQ
+SECY_PYRAB/72-448 SILTLGIGPIVTAGIILQLL-------------------VGSEIIKLDLA-NPEDRRFYQ
+Q8TZA9_METKA/75-435 SILTLGIGPIVTASILLQLL-------------------VGGDLIKLDLT-NPEDRRLFQ
+Q9HIT0_THEAC/82-514 SLMDLGIGPIVTASIVMQLF-------------------VGAKIFNLDLQ-NAEDKAIYQ
+Q2QAQ7_9EURY/161-583 SIMHLGIGPIVTGSIIMQLF-------------------AGAKIIKLDLG-DSDDKQLYQ
+Q0W1W5_UNCMA/75-487 SIILLGIGPIVMASIVLQLL-------------------VGAELIPLDTT-DPKDQAIFQ
+SECY_ARCFU/73-471 SIIALGIGPIVTASIILQLL-------------------VGAGIIKLDLT-NPEDRAAYQ
+Q8TRS4_METAC/72-470 SLVLLGIGPIVTASIVLQLL-------------------VGADIIKMDLS-DPKDQAFFQ
+A0B9U7_METTP/75-515 SLMLLGIGPIVTASIVLQLL-------------------VGAEIIKLNLR-DPRDQAIFQ
+SECY_HALMA/73-468 SIMQLGIGPIVTASIVLQLL-------------------GGADLLGLNTQdDPRDQILYQ
+Q2FSG8_METHJ/73-458 SIVHLGIGPIVTASIVLQLL-------------------KGADLIHIDTS-EIRGQIQYM
+A2SPM5_METLZ/73-458 TILHLGIGPIVTASIVLQLL-------------------RGADLIKINTS-DQRGQVLYM
+A0RUE4_CENSY/79-457 TLVELGIGPIVTAGLLMQLL-------------------RGSEILKFDFK-KPEERGIFQ
+A8ME75_CALMQ/77-461 TLAQLGIGPIIIAGIIMELV-------------------AFSELMDVDLN-DPKDQARFT
+A3MUZ2_PYRCJ/70-435 TLAHLGIGPIVIAGILMEVF-------------------AFSGVLNLDLN-KREDRLKFT
+SECY_SULSO/73-449 TLAQLGIGPIITAGLIMQIL-------------------AGSKLISIDLN-DPDDRVKFT
+SECY_SULAC/74-443 TLAQLGIGPVITSGLIMQIL-------------------VGSKLINVDLT-TQEGKSKFT
+A2BME2_HYPBU/73-444 TLMTLGIGPIVTAGIVLEVL-------------------VGGKLIELDLT-KPRDRKIFM
+SECY_AERPE/73-434 TLMELGIGPIVTASLIIQVL-------------------VGAKIIKLDLA-DPEGRRKFT
+A1RWR3_THEPD/75-456 TLIELGIGPIVTSGIVWELL-------------------VGSRIVNLDLT-TPEGRRTFA
+SC61A_SCHPO/76-459 TLMELGISPIVTSSMLVQLL-------------------VGSQLIEVNME-LKSDREMYQ
+A7E5Q2_SCLS1/76-459 TLMELGITPIISSGMVFQLL-------------------AGTHLIDVNLD-LKADRELYQ
+Q5KC69_CRYNE/75-459 TLMELGITPIVTSGMIMQLL-------------------AGAQLIDVDFS-LKDDRALFG
+SC61A_ASHGO/75-460 TLMELGVSPIITSSMIFQFL-------------------QGTQLLQVNLE-SKQDRELFQ
+Q59MJ6_CANAL/76-459 TLMELGISPIVSSGMLFQLL-------------------QGTKIIHVDMQ-NKNDRETFQ
+A7SJW4_NEMVE/75-458 TLMELGISPIVTSGLIMQLL-------------------AGSKIIEVGDT-PK-DRALFN
+A0CFY2_PARTE/73-456 TLMELGISPIVTSGMILQFL-------------------SGVGFIEVNHS-VREDKVLFN
+Q22MG2_TETTH/151-538 TIMELGISPTVTAGMVMQLL-------------------VGAQILNIDQN-DPVQRSLYE
+A0CU87_PARTE/77-460 TLMELGISPMVTASMIMQLL-------------------AGAKLIDVDQN-VKEDKQLYS
+Q7RLN0_PLAYO/121-506 TLMELGISPIVTSGMVMQLL-------------------AGSKIIDVDQS-LKEDRTLFQ
+Q4QGX4_LEIMA/77-467 TLMELGISPIVSASLILELL-------------------AGVRILTYDQN-NREERAVFE
+A5JEK2_NOSBO/75-457 TLMDLGISPVVTASMIMQFL-------------------GMLELVKVDYN-VKEDKILHG
+A2DH65_TRIVA/75-462 SLMEFGISPIVTSGMILQFL-------------------CSFGLINRNPS-DPEASALFD
+Q2QM98_ORYSJ/88-448 TVMELGVAPVVTSWVVVRLL-------------------AALL--------FDSDSSTTV
+Q6AV46_ORYSJ/86-471 TVMELGITPVVTAGTLVQLL-------------------VGSNLVRADSS-NPDDRALLS
+Q6C854_YARLI/70-454 TLMELGVGPMVTSGIIFQIL-------------------GGFQALNVNFD-IRADRELFQ
+SSH1_YEAST/78-465 TLLEFGLFPNISSGLILQLL-------------------AGLKVIKVNFK-IQSDRELFQ
+Q6BT20_DEBHA/78-475 TLLELGLLPVLTSAFIWQLS-------------------AGFRFINVNLN-LRSDRELYQ
+A5DE75_PICGU/20-414 TLLELGLLPVMTSAFLWQLA-------------------AGLRLVKVNLS-LRSERELFQ
+A3GFV9_PICST/78-476 TLFELGVLPVVTAAFFWQLA-------------------VGLKLVNVNLG-LRSDRELFQ
+A5DWJ5_LODEL/34-436 SLLELGFLPIITSAFLWQLA-------------------AGLKLININLG-LRYDRELFQ
+Q5A2C9_CANAL/5-404 TLLELGLLPIITSAFIWQIA-------------------AGLRLINVNFK-LRIDRELFQ
+Q74L41_LACJO/64-372 SIFSIGLNPLMFSMLIIQLL-------------------SFTHSFGFDA----LSPKQVQ
+B3XPQ8_LACRE/65-377 SLFMVGLNPLMIAMLIIQLL-------------------TMLRLFYFDT----LSMNQLM
+A1C3L4_STRPA/70-403 TLFSLGIGPTMTMMILWRFL-------------------ITFKLI------GSWTSNKVN
+Q3DVD6_STRAG/65-395 GVFSLGIGPMMTTMILLRLF-------------------------TIGKYsSGVSQKVQQ
+A5LN99_STRPN/64-389 SIFSVGLSPWMSAMILWQMF-------------------SFSKRLGLTST----SIEIQD
+A3CM55_STRSV/64-391 SLFSVGLSPWMSSMLIWQMF-------------------AVSKRLGLSKL----PLEVQE
+Q03HZ8_PEDPA/65-396 SLFSVGLGPYMTGMILFQAI-------------------QLLDIDELNKI----NDYKRG
+A5IW80_STAA9/64-384 NIFTLGLVPWLTSMIILMLI-------------------SYRNMDKYMKQ----TSLEKH
+Q4L9N9_STAHJ/61-383 NVFSLGLGPWLTSLVIIMLL-------------------NYRNLDQATKQ----TRSEKH
+Q5HKR3_STAEQ/61-380 NIFSLGLGPWLSSMIILTLI-------------------NHKSNDKVKTQ----TRRERH
+Q9RSK8_DEIRA/68-413 SIFALGVLPYITASIVIQLL----------------TT-TIPSLEKLSKE-GEEGRKKIN
+Q5SHQ8_THET8/71-413 SIFALGIMPYITAAIIMQIL----------------VT-VVPALEKLSKE-GEEGRRIIN
+SECY_CORGL/73-424 SIFAIGIMPYITASIIVQLL----------------TV-VIPHFEELKKE-GQSGQAKMM
+A8LB12_FRASN/74-414 SVFALGIMPYITSSIIIQLL----------------VV-VIPRLEQLKKE-GSSGEQKLT
+Q83NQ1_TROW8/73-424 SVFALGVMPYITSSIIIQLL----------------RV-VVPRFEQLYKQ-GQEGQAKLI
+Q8G3Z9_BIFLO/74-421 SIFALGVMPYITASIVVQLL----------------RV-VIPRFEALHKE-GQSGEAKLT
+A7B9M4_9ACTO/72-414 SIFALGIMPYITASIIIQLL----------------RV-VIPRFDDLHKE-GQTGQAKLT
+SECY_CHLTR/73-433 TVIALGVVPYISASIIVQLL----------------VV-FMPTLQREMREsPDQGKRKLG
+Q1AU49_RUBXD/70-408 SVFALGIMPYITAAIVMQLM----------------TV-AIPRLQELARE-GEVGQQKIT
+Q8RIH6_FUSNN/75-411 SIFSLGIIPYINASIVVSLL----------------VS-IIPQLEEIQKE-GESGRNRIT
+A6DRC9_9BACT/79-428 GV--LGIMPYITASIIMQLM----------------TP-VFPNLEKLQKD-GSHGRQKLN
+C0ACZ0_9BACT/94-454 AVCALGIMPYISASIIFQLM----------------TA-VVPSLARLQQE-GDVGRQKLS
+Q1Q157_9BACT/75-434 AIFGLGVMPYISASIIFQLL----------------VG-VVPYLERLQKE-GEVGRKKIN
+A6CGP8_9PLAN/77-435 TIFGLGIMPYISASIIFQLM----------------GT-VYPPLERLQKE-GEAGRKKIN
+B4S5A8_PROA2/73-417 SIFSLGIMPYISASIIVQLL----------------GA-VTPYVQKLQKE-GEEGRQKIN
+Q2S3P5_SALRD/75-414 GIFALGIMPYITASIIIQLM----------------GA-VVPYFQKLQRE-GEEGRRRIT
+A1ZGT4_9SPHI/72-404 SIFALGIMPYISASIVIQLM----------------EV-AVPYFQKLKKE-GESGFKKKT
+A6EHP4_9SPHI/71-408 SILALGVMPYISASIVVQLL----------------GI-AVPSFQKMQKE-GESGRKKLN
+Q11QD2_CYTH3/72-411 SVFGLGIMPYISASIVLQLL----------------TF-AVPYFQRLQKD-GESGRKTIN
+Q1VTY0_9FLAO/73-421 SVFALGIMPYISASIVVQLM----------------TI-AIPYLQKLQKE-GDSGRKKIT
+Q1NYZ7_9FLAO/72-422 SILSLGIMPYISASILTQLM----------------CY-MFPSLYKIQQD-GEIGIKKIN
+A5KHP6_CAMJE/62-402 SIISLGIMPYITASIIMELL----------------AA-TFPNIGKMKKE--RDSMQKYM
+A4EA78_9ACTN/52-389 SVFSLGIMPYITSSIILQML----------------QA-VVPSLHELARE-GEVGQTKIT
+Q2GEC0_NEOSM/73-411 TLFALNVMPYIVSSIVVQIF----------------FS-MLKSEGKVSAE--FMNESRLS
+Q3YRM8_EHRCJ/72-412 TVFALNVMPYIVSSIIIQLL----------------SV-TVPRLNELRQN-GELGRMKIN
+Q5GSW3_WOLTR/77-416 TILVLNVMPYIVASIVMQLL----------------SS-AVKGINEVKND-GELGRRRMN
+Q0ANS0_MARMM/83-421 AIFVLNVMPYISASIIMQLM----------------SA-TIPSLEKLKKEgGEQGRQQIN
+A7IPQ0_XANP2/80-418 AIFALNIMPYISASIIIQLL----------------TS-VSPTLEALKKE-GEAGRKQLN
+SECY_RICCN/70-411 SIFALAIMPYITASIIIQLM----------------SV-AYKPLENLKKE-GEVGKRKVN
+Q2G8W0_NOVAD/80-430 SLIALGVMPYITASIVVQLA----------------AS-LHPALAAMKKE-GESGRKKLN
+A6E0Q6_9RHOB/73-411 GIFALGIMPYISASIIVQLM----------------TA-MVPALEQLKKE-GEQGRKKIN
+Q1UZE8_9RICK/67-404 AIFALGIMPYISSSIIVQLL----------------TG-VSDYFKNLKAQ-GETGRAKIT
+Q3R245_XYLFA/76-424 SIFALNVMPYISASIVVQLA----------------TH-IFPSLKAMQKE-GESGRRKIT
+A4NK90_HAEIN/76-416 SILALGIMPYISASIVIQLL----------------AT-VSPALAELKKE-GAAGQRKIS
+Q057C4_BUCCC/64-407 SIFALGVMPYISSSIIVQLL----------------TL-ISSYLRNLKKE-GDIGKKTIN
+Q8D1Z2_WIGBR/82-424 SIFSLGIMPHISASIIIQLL----------------TI-IHPKLSEIKKD-GEFGRRKIN
+Q6F7T2_ACIAD/83-426 SILALGIMPYISASIIVQLM----------------ST-VVPSLEALKKE-GEQGKRKIN
+Q6Q8W8_9GAMM/67-407 SIFALNVVPYISSAIIMQLF----------------SN-SIPYLQELKKD-GQAGRNKIT
+A9BRX1_DELAS/74-413 TVFALGIMPYISASIIMQLM----------------TY-VVPTFEQLKKE-GESGRRKIT
+Q7DDS8_NEIMB/73-410 SIFAIGIMPYISASIIVQLA----------------SE-ILPSLKALKKE-GEAGRKVIT
+Q5NHU8_FRATT/74-416 SIFALGVMPYISASIIFQML----------------SA-VYPKFIELKKE-GESGQKKIT
+Q7WZR8_9GAMM/64-388 SIFSIGLMPYISASIIMQVI----------------TG-MFLDVE--------VSKHKLT
+A5EX98_DICNV/69-412 SLLALGVAPYISASIVMQLL----------------TH-MLPALKDLRQE-GSAGQKKIT
+Q6MJ32_BDEBA/70-415 SIFALGIMPYISSSIIFQLL----------------TS-AIPYLEALKKE-GEQGRRKIN
+B5EFS0_GEOBB/71-411 TVFALGIMPYISSSIIFQLL----------------TV-VLPAVEKLSKE-GDAGRKKII
+A3EVQ1_9BACT/75-412 TIFALGIMPYISASIILQLL----------------TV-VHPTLQAMAKE-GERGRKIIT
+Q1MPP6_LAWIP/71-412 SVFALGIMPYISASIIMQLL----------------QV-IIPDFKRMAKEeGAAGRYKIT
+SECY_AQUAE/71-412 TVFALGVMPYISASIMMQLL----------------TV-AIPSLQRLAKEeGDYGRYKIN
+Q01WB2_SOLUE/74-438 TVFALGIMPYITASIILQLL----------------TV-VVPTLEKLQKE-GELGRRKIT
+Q08ZH8_STIAU/26-370 SIFGLGIMPYVSASIIMQLL----------------AV-VVPSLERLQKE-GASGRQKIN
+A6GCG0_9DELT/70-411 SVFALGIMPYISASIIMQLM----------------TV-VIPKLEQLQKE-GETGRRKIN
+Q04PV8_LEPBJ/72-436 SIFALGIMPYISSSIVMQLF----------------MV-LVPSLQKLQKE-GEEGRKKIG
+SECY_BORBU/72-409 SIFMLSIGPYISASIIVQLL----------------VY-SFPSLKKMQE--GDGGRQKTK
+Q73PL2_TREDE/73-413 SVFMLGVMPYISTQILMQLA----------------MI-IFPRLKKIAEE--DGGRKKIQ
+Q67JW3_SYMTH/69-405 AIVAMGVTPYINSSIIMQLL----------------TV-VIPRLEELQKE-GEEGRKKIQ
+A7FQ38_CLOB1/69-409 SIFAMGVVPYINSSIIMQLL----------------TI-ALPSLESLSKE-GEEGRKKIQ
+A6LPT1_CLOB8/69-416 SILALGVMPYINASIIIQLL----------------TV-AIPQLEQLSKE-GDTGRKKIQ
+Q0SQG4_CLOPS/69-409 SIFALGVVPYINASIIMQLL----------------TV-AIPKLEQLSKE-GDDGRKKIQ
+A9KJH4_CLOPH/71-425 SLFALGIGPYITSSIIMQLL----------------TI-AIPKLEEMQKD-GESGRKKIA
+A7VH89_9CLOT/71-420 SIFALNVTPYITASIIIQLL----------------TI-AIPALEEMQKD-GEDGRKKIT
+A6BIS2_9FIRM/71-421 SVFALSITPYITSSIIVQLL----------------TI-AIPQLEEMQRD-GETGRKKIV
+A7VR33_9CLOT/71-423 TLFAMSVTPYINSSIIMQLL----------------TV-AIPPLERMAKE-GEEGRKKIG
+A6NXF0_9BACE/71-437 TVFALGVQPYINSSIIIQLL----------------TV-AIPALERLQKEgGEEGRKKIA
+Q250L2_DESHY/70-413 SVFALSITPYITASIILQLL----------------TI-VIPSLERLAKE-GEFGRKKIT
+Q8R7X3_THETN/69-402 TIFAMSIVPYINASIIMQLL----------------TI-AIPSLEQLAKE-GEEGRKKIA
+A4XLR1_CALS8/69-419 SIFAMSVTPYINSSIIMQLL----------------TI-AIPALEELAKQ-GEEGRKKLA
+A3DJJ2_CLOTH/71-411 TIFAMSITPYINASIIIQLL----------------TV-AIPKLEALAKE-GEEGRKAIA
+A8MLG0_ALKOO/69-408 TIFALSISPYITSSIIMQLL----------------TI-AIPSLEALAKE-GEEGSKKIA
+Q18CH6_CLOD6/69-406 SLFALGISPYITASIIIQLL----------------TV-GFESLAELQKS-GEEGKKKIN
+B8D0S8_HALOH/72-406 TIFAMSITPYITASIILQLL----------------TG-VIPRLEELQKQ-GVEGRKKLT
+
+A9B431_HERA2/73-422 RYQYFLTVPLAYLQGYGQIKSLINSGINLFGTLNFs-----------iTENFFQTFSILT
+A8CRX1_9CHLR/78-422 TITHWLAVPTAALAGYSQLLLLQREGAVAQTE-------------------PLAAVAIVL
+A2Y4E5_ORYSI/132-498 GYIWWLSLGFALVAAFTVSCYSLQYSIYAASY------------------RVKHVMITSL
+Q7UZW2_PROMP/80-422 QITRYVSLGWGFLQSIIFSLILRQYAIEGISET-----------------AFV--LQTSI
+Q7NKT4_GLOVI/79-416 QYTRYLALGWAIIQSIGVAIYIKPFVADWSPL-------------------FV--IQTTL
+SECY_GUITH/68-404 QLTRYVALVWALIQSIGVSFWVRPYVFNWDLN-------------------FV--FAMSL
+SECY_CYACA/62-394 KITKYLSFCFAFIESLAIVLRLQKYAFDWN---------------------LYFIVQTTL
+Q85FU6_CYAME/42-325 KYTRYLTFFLAGIQAFTLSQQ----------------------------------WCTWL
+A0T0J6_PHATR/72-407 RLTRLITLMFALIQSVSLALYLKQILFNWN---------------------YSLAIEIGL
+SECY_CYAPA/109-459 KWTRYLTVIWAFIQSIVISWIWIRPYALNWD--------------------FFLGLKVVV
+Q4G351_EMIHU/63-407 RYTRYLTCIWAIVLSSAIAFFLIKPITFGWS--------------------LKLGLEIVL
+SECY_PAVLU/66-404 RYTRILTVLFCIIESFFLSNSLRSFVFNWN---------------------SISYFVVAA
+Q6B8X0_GRATL/62-395 QLTRYFTLIWSILQSIGISLWIKPYVFNWNYY-------------------FI--LDSII
+SECY_ANTSP/62-390 QLTRYLTLLWALIQSLSIAIWINHMY-------------------------LIHLFELCA
+A4RW47_OSTLU/65-398 QYQRYGALGFAIVQAVGQCLYVRPFVEDFTPI-------------------WL--FEQSC
+A7PFA4_VITVI/131-465 QYTRYASVGFALVQAIGQVLFLRPYVNDFSTQ-------------------WV--LSSVT
+A7HM32_FERNB/75-404 HYTKNLTLGLAALQSFVVSFGLARSYQGIIAIN-----------------TWLFSFVSTV
+A3CK84_STRSV/69-416 QATRYIALVLAFVQAIGITAGFDTLSRANLVAN----------------PNVQTYALICV
+Q5FM71_LACAC/68-415 QVTRYLTLVVAFVQSIGITLGFNALTQMGLVKNQ--------------TPQTY--VEIAI
+Q03ZM6_LEUMM/68-416 NATRWLTLVLAFVQSVGITAGFNSLSSYGLVSQT---------------NSVM--SFVVI
+SECY_STAA8/69-413 NVTRYLAISLAFIQSIGMAFQFNNYLKGALIIN----------------QSIMSYLLIAL
+Q4MG72_BACCE/68-415 QFTRYFTIILAFIQAIGMSYGFNNIAGGQLITD----------------QSWTTYLFIAT
+Q6F1X5_MESFL/92-454 KLTKVLMIPFALMQGIATIFTLQQQGV-----IEPgwssd---nvlasPAFYY--VLVPL
+Q6KI36_MYCMO/87-436 IITRAITIFLGVVQSMTIVSALSAQNSFISLTNEF-------------NVFWYQFIILPV
+Q4A5I3_MYCS5/83-437 IATRILTFIIAYPQAVFLTKSLTAGERNSSFITLVsi--------dgfSVDLLVYFLLPM
+Q98Q01_MYCPU/90-438 VITRLLTLVFAFPQAIVLTQTLSRENGFISIDQEF-------------KTIANIYVLLPL
+Q4AAF9_MYCHJ/85-434 IITRFLTLLVAVIQAVVLIRTVILNPDYGFVRLEI-------------NTPVFIWLVLPL
+Q9PQP1_UREPA/76-434 VITRIITLPLAVMQAVIIINLMTRANG-----FISivsna---pfaigSPLFY--VTYIF
+SECY_MYCGE/81-430 MITRIITLPFALVQAFAVIQIATNAGT-----GSSpis------lansGSEFI--AFYII
+Q8EUD2_MYCPE/81-433 IITRLITIPFAIMQAYAVLSLAGTQGLVSSFFGQSa----------lsSVPAGQIILLLL
+Q7X4E3_9MOLU/69-399 IVTRVLTIFLSLGHGWALCQTEKLVLG------------------------PYLLFSTLF
+Q5Q069_ASTYP/59-398 LLTRSLALFFAFGQSFAFLNSYSKLLVTSIS--------------------TRQLFLLAL
+O21257_RECAM/57-372 KYSVYIFLMISYLEGFIYLNHLYNTTSSSFLIFY--------------LDNTINYLLCLN
+Q74NB9_NANEQ/69-457 NLARFFMIVFGLFESIVMA-TIGWFKPSQFLISLFampfsflgsnaflIGYILAVLFIVA
+Q2EMT2_METVO/30-379 GLQKAFGIFLCFLEAGMFV-LAGAFGALT----------------------PMMSLALIL
+A5UL65_METS3/72-433 ATQKILSIVFTMFEAGVLV-LTGSLVPIDNS--------------------YL--GVLFL
+SECY_METTH/73-436 GLQKLLAIVFTFFEALIFV-LTGSLAPSAPQF------------------V----WVLIL
+SECY_PYRAB/72-448 ALQRVFSVFMCFLEAAIWV-LGGAFGRVGVDV------------------TYAIAALMIL
+Q8TZA9_METKA/75-435 GLQKLLAIVLCFFEGVMMV-FSGAAPPAEPS--------------------ILLEILLIL
+Q9HIT0_THEAC/82-514 GVQKLLVIIMIFVEAIPQA---FGYLVPDTKVVNSina------vfpgYGEFLAQTIIIL
+Q2QAQ7_9EURY/161-583 GVQKILVLIMIPVESIPQV---YGFLDASPALVSD-------------FGQGWANAIIVS
+Q0W1W5_UNCMA/75-487 GLQKLMVFVMIVVEALPQI--YGGFLLPDPAIAATl-----------gVSTGIIQLLIFA
+SECY_ARCFU/73-471 DFQRFLVFVMIAVEAIPQI--AGGLLKPDLNLAAQl-----------gVSPGIISFLIFI
+Q8TRS4_METAC/72-470 GAQKFLVFVMIILEALPQL--LGGYIQPDPGLAATl-----------nVGLGVITLLLLV
+A0B9U7_METTP/75-515 GTQKALVFVMIVVEALPQI--TGGYLLPDQALATSl-----------gVSLSIISLIIFL
+SECY_HALMA/73-468 GLQKLLVLVMICLTGLPMV-FAGGFLPADTAVANSl-----------gIGTAGVQWLIFA
+Q2FSG8_METHJ/73-458 GLQKLMIFIMIVVEALPMI--VGGFLKPDPAIASAl----------fgGNSGVLAILIFI
+A2SPM5_METLZ/73-458 GLQKVLIFVMIILEALPNV--LGGWMSADPAVSAFf-----------gGNAGFVMLLIFL
+A0RUE4_CENSY/79-457 TATKMVSYVVIVVESSIYGIAVYGPGIADPS------------------------VLYIL
+A8ME75_CALMQ/77-461 ALTKLVAVIIAMFEGAFIM-STHQLTVAN----------------------AGLAFIVWL
+A3MUZ2_PYRCJ/70-435 LMLKWAALGIAALEATAYV-LGGQFGTVT----------------------PLGGVLIVL
+SECY_SULSO/73-449 EAQKGLAFIFILVESALFGYVLARTSTTINASIL--------------FIA----GIVIA
+SECY_SULAC/74-443 QAEKALALIFIIVESSLFGYVFTRATSNILLP-----------------------IIVVV
+A2BME2_HYPBU/73-444 GAQRTLALLFALLEAAAYV-IGCRFWISAFASSPEv----------cpPISTAVKIIVVL
+SECY_AERPE/73-434 SAQKVLALAFAALEAVAFT-VGGRYWVGTAIEP-----------------GPLDYALVSL
+A1RWR3_THEPD/75-456 GLQKLTAFLFAALEAAAYI-LGGVYGALT----------------------QQQQIIVFV
+SC61A_SCHPO/76-459 LVQKFLAIIIAFGQATAYV-LTGMYG------RPQd-----------lGAGIC--LLLIL
+A7E5Q2_SCLS1/76-459 TAQKLFAIILSMGQATVYV-FTGLYG------QPSd-----------lGAGVV--CLLIL
+Q5KC69_CRYNE/75-459 AAQKLFAMIISLGQATVYV-LTGLYG------SPSs-----------lGAGVC--LLLIL
+SC61A_ASHGO/75-460 IAQKVCAIVLTLGQAIVVV-LTGNYG------SVSn-----------lGIAIS--LLLIL
+Q59MJ6_CANAL/76-459 TAQKLLAILLAVGQATVYV-LTGMYG------PPSs-----------lGVGVC--SLLIL
+A7SJW4_NEMVE/75-458 GAQKLFGIIITIGQAVVYV-MTGMYG------DPSd-----------lGPGIC--LLIII
+A0CFY2_PARTE/73-456 AAQKLLSFIMAIAEGMAYI-WSGAYG------DINq-----------iGAGNA--ILILL
+Q22MG2_TETTH/151-538 GSQKLLGLIIAFFEAVAYV-WSGMYG------DIEk-----------vGYGNA--LLIVL
+A0CU87_PARTE/77-460 GAQKLLGILIAFGEAFAYV-WSGMYG------DLDk-----------lGAGNA--ILIII
+Q7RLN0_PLAYO/121-506 GAQKLLGLLITLGEAIAYV-VSGIYG------NLSe-----------iGTGHA--ILIIL
+Q4QGX4_LEIMA/77-467 GFQKMMGLVITAVEAVAYV-SSGMYG------DPSr-----------iGVVMC--GLIVL
+A5JEK2_NOSBO/75-457 AANRLISLIMTVGSAIVQV-LTGFYG------DPKa-----------lGWTYC--ILLMV
+A2DH65_TRIVA/75-462 AAQKLAGIIMTAFQAGNAI-WSGEYG------IRGe-----------iGFVNA--ALIMT
+Q2QM98_ORYSJ/88-448 ASCELLARCLAYVTNASRL-VIG---------IAAalgm-----cgsgGAGNA--ALVVL
+Q6AV46_ORYSJ/86-471 AAQKLLSIVITAGEATAYV-LSGAYG------SVGv-----------lGAGNA--VLVVL
+Q6C854_YARLI/70-454 SGQKIFALLLTFFHAIFLVFFAQTYGTISTDSAVS-------------ELSLGAAVLIVA
+SSH1_YEAST/78-465 SLTKVFAIVQYVILTNIFI-FAGYF-------GDD------------lSVVQI--GLINF
+Q6BT20_DEBHA/78-475 SGQKLTSFIFAIVYGAGYI-FSGYYNNVIKGYNPFn----------gdSVPVTTLVLIFL
+A5DE75_PICGU/20-414 TGQKLTSFILGIVYTAGLI-ASGYFAPALR--NQTgfe-------dsfPVTTY--VFIFL
+A3GFV9_PICST/78-476 TGQKLTSFVLAIVYGVGLI-YSGYYDNAIRGYDPLsd---------stPYGWY--GLILF
+A5DWJ5_LODEL/34-436 LGQKLTAWGLALIFSVGLI-YSGYYDNVIR--GYKvvgg-----sggvPIWSY--LIIFT
+Q5A2C9_CANAL/5-404 TGQKLTSFIFSLIFAIGLI-YSGYYDNAIR--GYNplq-------dgiPYGSY--ALILL
+Q74L41_LACJO/64-372 YLMQFLTMIITIIQAALLVFAFTNRRN------------------------GLEDFEMIL
+B3XPQ8_LACRE/65-377 KIQQWLTLGFAIIQSTAVTLGLKITTG------------------------TLDSLAVIL
+A1C3L4_STRPA/70-403 RLQFLLTLAIALLQSFGITNDSKFLLIFGYSH-------------------STLRIITII
+Q3DVD6_STRAG/65-395 FRQNVVMLVIAIIQGLAITISFQYHNGFS----------------------LTKLLLATM
+A5LN99_STRPN/64-389 RRKMYLTLMIAVIQSLAVSLRLPVQSSYSA---------------------ILVVLMNTI
+A3CM55_STRSV/64-391 RRRMLLTLVIALIQSVALVLNLPLQEAAGVDM-------------------TTIMVLDTL
+Q03HZ8_PEDPA/65-396 MIQRWISFVIALLQTLQFIYTIREHINFSGIKVW---------------GIDYNLIVAFF
+A5IW80_STAA9/64-384 YKERILTLILSVIQSYFVIHEYVSKERVH----------------------QDNIYLTIL
+Q4L9N9_STAHJ/61-383 YKERIITIVFAIFQSYFVISTYIHNNFIK----------------------DSNIILLML
+Q5HKR3_STAEQ/61-380 FKERALTLIISAAQGFYIIHSYINKHAIK----------------------DSNMLILLL
+Q9RSK8_DEIRA/68-413 QYTRYAAIALGAVQALFFSLYI--TSNPSFIAVGW-------------DPGLFTVLVMVL
+Q5SHQ8_THET8/71-413 QYTRIGGIALGAFQGFFLATAFLGAEGGRFLLPGW-------------SPGPFFWFVVVV
+SECY_CORGL/73-424 QYTRYLTVALALLQSSGIVALADREQLLGAGIRVLs-----------aDRNFFDLIVLVI
+A8LB12_FRASN/74-414 QYTRYLTVALGILQATGIVALARSGRL-----FPGcsa------qiipDTSLFRIVTIVI
+Q83NQ1_TROW8/73-424 QYTRYLTIGLAVLQSTTLITVARSGAL--FAASNSpacs-----slltDDSWYSTIIIVI
+Q8G3Z9_BIFLO/74-421 QYTRYLTIGLAVLQSTTILVTARSGAL-----FNYqcd------qvipDGSVFNLVVMVL
+A7B9M4_9ACTO/72-414 QYTRYLTIFLGILQATTTISLARSGQL-----FQScnh------diikDRSVMTFIMMII
+SECY_CHLTR/73-433 RMTRLFTLVLACVQSLLFAKFALRMNL--VVPGIVlpamls-lklfgvPWVFY--LTTVV
+Q1AU49_RUBXD/70-408 QYTRVFTLALSFIQSVAMVLFLRSGQFGPVLAG----------------AGALDLFLVVV
+Q8RIH6_FUSNN/75-411 QWTRYLTIALAIIQGTGVCLWLQSVGLIYNPGI-----------------SFF--VRTIT
+A6DRC9_9BACT/79-428 QYTRYMTIVICAVQSAMMAVAMHTPSK----LLGVpgfed---lvinkGSAFV--IQTTI
+C0ACZ0_9BACT/94-454 QYTRYATVLICLIQGALLILALENPTQLFGEGYDIaryge---ivlvdRTWFL--ISSVI
+Q1Q157_9BACT/75-434 QYTRIATVGLCLFQAFVMTRTLYTVEF-----NGVpvip-----vylqGVSFQ--LMAAI
+A6CGP8_9PLAN/77-435 EYTRYATVVICLVQSFFWIRTLAGGFG-----SGTslil-----dgyqGLYFQ--IVATI
+B4S5A8_PROA2/73-417 QYTRYGTVLIAALQAWGVSVSLASPSSFGTIVVP--------------DPGFFFMMTTVL
+Q2S3P5_SALRD/75-414 QLTRYGTIGITALQSIGYSINLLAGATGRAVVIN--------------STLFT--ITTVV
+A1ZGT4_9SPHI/72-404 QITRYLTIVITAAQAIGYIQATIPSNAIMVSQL-----------------SFT--ISTVI
+A6EHP4_9SPHI/71-408 QITRYLTVAITAVQAVGYVKTQVPMEAIVIDHT-----------------LFF--VMATF
+Q11QD2_CYTH3/72-411 QYTRILTIFITVAQSIGYLAATLDEGMIYEGMN-----------------TPFMNVVRIV
+Q1VTY0_9FLAO/73-421 QITRWLTIAITLVQGPGYIINLYNILPSSAFLMD---------------STFTFVVSSVI
+Q1NYZ7_9FLAO/72-422 NITKVLTILISLIQAPVYITILISSNIKENPYNLIli---------hcKKIFI--ITSII
+A5KHP6_CAMJE/62-402 QIIRYATIVITLVQSIGVAIGLQSLHG--RGGAGVim--------vedLNMFI--ALCAI
+A4EA78_9ACTN/52-389 QYSRYLTLALAILNSVGYLFLFKSFGISFNGAGA---------------PEIIFDLMIVG
+Q2GEC0_NEOSM/73-411 FYSKLVALFLAFFQGFIIVAGLERTKAFVGGNEE---------------FYSLLKYTSVL
+Q3YRM8_EHRCJ/72-412 NYIRYMTIFFCIVQGSVILLGLEKMNS-----ENSivv-------idpGLLFR--IVGIS
+Q5GSW3_WOLTR/77-416 SYIRYMTIVFCIFQSVTILIGLERM-------NREgtlv-----viepGVMFR--TVGIF
+Q0ANS0_MARMM/83-421 QYTRYLTVLLATGQAFAIAIGMNTPNS---EGVALal---------npGPFFL--ASTVI
+A7IPQ0_XANP2/80-418 QYTRYLTVVLAVFQAYGIAVGLEG-------SGSVva---------dpGWFFR--ITTVI
+SECY_RICCN/70-411 QLSRYLTVLLASFQAYGVAISLESIVT---NTGPVvi---------laGFFFR--ITTVI
+Q2G8W0_NOVAD/80-430 QYTRYGAVLLTAIQGWVLASGLEAYGA--SSGLQAvv---------npGLLFR--VGAVI
+A6E0Q6_9RHOB/73-411 QYTRYGTVALATLQSYGLAVSLQSGD------MVSn-----------pGMFFI--ASCMI
+Q1UZE8_9RICK/67-404 QITRYGTVILATIQGYGLSIGLQSSAD-----LVIn-----------pGLFFT--ITAVS
+Q3R245_XYLFA/76-424 QYSRIGAVILAVIQGGSIALALQNQTA--PGGAAVvy---------apGAAFV--MTAIV
+A4NK90_HAEIN/76-416 KYTRYATVVFATIQAVAISTGLPNM-----LSGLVp----------nvGFSFY--FTSVV
+Q057C4_BUCCC/64-407 QYTKYITFFLSIIQSIGVVISLPFLPGMKNIIVF---------------ADCYFYIIAVV
+Q8D1Z2_WIGBR/82-424 KYTRYGTLFLAIIQSISISISLPNMPG---MQELIi----------nkGIEFY--ITTIT
+Q6F7T2_ACIAD/83-426 QYTRYGTLLLALVQGVGMCAGLIS-------QGITl----------tsGLAFY--IPAVT
+Q6Q8W8_9GAMM/67-407 QYTRYGTAILAFIQASALAVTLSA-------SGLAy----------vpGPTFF--VSAVF
+A9BRX1_DELAS/74-413 QYTRYGTLGLAIFQSLGIAVALESSAG-----LVLs-----------pGFGFR--LTAVV
+Q7DDS8_NEIMB/73-410 KYTRYGTVLLAILQSLGVASFVFQ-------QGIVv----------tsSFEFH--VSTVV
+Q5NHU8_FRATT/74-416 QYTRYLTLALAIVQSFGIVAFVLHQ------DGLVtt---------nnMALFY--LTTIV
+Q7WZR8_9GAMM/64-388 SYLRYLTFMLSVIHSLVVSILFLEKSV-----VYY------------kKSVVY--LTIIL
+A5EX98_DICNV/69-412 QYTRYFTLFLAIMQGFAISRTVMAAGMTISAGS-----------------GFL--LTATI
+Q6MJ32_BDEBA/70-415 QYTRYATVALAIIQGYGISTWLMNSTS--PDGHPLvia------ptvaFLPFQ--IMTII
+B5EFS0_GEOBB/71-411 QYTRYGTIVLAVVQAFGISIGLEAMRG--PAGELVvp---------npGWGFR--LMTVI
+A3EVQ1_9BACT/75-412 RYTRYLTVLIALVQSFGIALGLEGMNNGQ---FVPh-----------pGWSFR--FIVVI
+Q1MPP6_LAWIP/71-412 QYTRYGTVIITLIQGIGIAIGLESMYS--PTNIPIvl---------epGWVFR--IVTVL
+SECY_AQUAE/71-412 EYTKYLTLFVATVQSLGIAFWIRGQVS--PKGIPVve---------npGISFI--LITVL
+Q01WB2_SOLUE/74-438 QWTRYLTIILSILQSFGISQGLMGM------QQGIvi---------npGIGFV--FLTIL
+Q08ZH8_STIAU/26-370 QYTRYGSIVLSVVQGIGISRWLASLGR--SDAGQSgfnqi---vvpddSAWFT--FMTVI
+A6GCG0_9DELT/70-411 QYSRYGTVGLALVQGYFMASWLEGQNT-----PGQtlv-------letGLPFK--LMTML
+Q04PV8_LEPBJ/72-436 QYTKYGTVILCAIQSLAVIQLAKGWST--GTELEParypg--linssvVPYFY--LIGIL
+SECY_BORBU/72-409 KYTKYLTIVAAVVQGYATSLYAKGIPG-----AVTi-----------pFYRYI--FVAIL
+Q73PL2_TREDE/73-413 VWTRIVTVFVALLQSSAVGTWARAIPGAVVISS-----------------PVLHLFITMV
+Q67JW3_SYMTH/69-405 QYTRYGAVVLGLVQAFGIGYALRSYGAFYSNS-------------------WTTLFVIMV
+A7FQ38_CLOB1/69-409 QYTRYGAVILAVIQAFSTYAIIARAGALRDGS-------------------KLNLFIIII
+A6LPT1_CLOB8/69-416 NATRYVSLGIAFILAYGIFATISSSGATVGLT-------------------AIQKTIVVF
+Q0SQG4_CLOPS/69-409 KITRYASIVIGAITAYGSYVIIHNVGALKSNS-------------------PVSMFLILL
+A9KJH4_CLOPH/71-425 EISRYVTIGLSIIESVAMVIGFSGSGALEGGL------------------TFTNIVVITA
+A7VH89_9CLOT/71-420 AITRFLTIGLAILESAGLAINFGRKGFMDSYN-------------------FWTVLTMIV
+A6BIS2_9FIRM/71-421 AITRYLTVGLALIESGAMAVGFGRQGLLVKYN-------------------FVNAAIVVL
+A7VR33_9CLOT/71-423 AITRYVAVVLGLVQGLAYYLYLRGSSY-----EGTpivty---tegaaGVFTA--IVIVL
+A6NXF0_9BACE/71-437 AITRYTTVAIALLQGFGYFTLINANGLVGSDLP-----------------TWLAGIIIVL
+Q250L2_DESHY/70-413 QYTRYGTVILGFIQGFGMTFGLRGALIIPKPGM-----------------EWAIYLLVAL
+Q8R7X3_THETN/69-402 QYTRYLTVVLALIQAIGMTIGLRSAVINPT---------------------FFRLTVIVI
+A4XLR1_CALS8/69-419 EWTRYGTAILAFLQAVGIYFGLKNAQGLTGGVPVIt----------tqGQGFLGFITITL
+A3DJJ2_CLOTH/71-411 EYTRYGAVVLGFLQATAFYFGLAQAVNERN---------------------VLSFITITL
+A8MLG0_ALKOO/69-408 QYQRYATIILALIQATGISVGLFRGALINQD--------------------TFSIIVVIL
+Q18CH6_CLOD6/69-406 KYTKYTALALAVVQALGITLGIVRSALISNS--------------------VFFITTVVI
+B8D0S8_HALOH/72-406 QYTRYGTVVLAIIQAFGITMLIGRHNVIVNPN-------------------LFNLMLIVI
+
+A9B431_HERA2/73-422 --IMVSGSMFLVWMGELIDE-RGI-G-NGLSMIIFGGIV-TALPSM--------------
+A8CRX1_9CHLR/78-422 --SIVAGTMFMVWLGEQITS-YGI-G-NGISLIIFAGIV-AGLPDM--------------
+A2Y4E5_ORYSI/132-498 --FLVLGAMTMTWICDTISE-SGF-G-HGSSLIICVGIL-TGYTDT--------------
+Q7UZW2_PROMP/80-422 --ALVTGSMIVMWFSEIITE-KGI-G-QGASLVIFLNIV-ATLPKA--------------
+Q7NKT4_GLOVI/79-416 --ALTAGAIFVMWLGELITE-KGI-G-NGASLLIFVSIV-SSLPTA--------------
+SECY_GUITH/68-404 --TLTIGSMLIMWFSEQITE-KGI-G-NGPSLLIFINII-SGLPKL--------------
+SECY_CYACA/62-394 --ILISGAMLVMWLADNISY-KGI-G-TGASVIIFVNIA-SAFAKF--------------
+Q85FU6_CYAME/42-325 --LIVSGAMLVMWLAEQMTH-KGI-G-NGTSIFVCSNIA-ANF-----------------
+A0T0J6_PHATR/72-407 --WLTTGAMIVLWLSELITD-YGL-G-NGASLLIYTNII-SSLPNL--------------
+SECY_CYAPA/109-459 --ALTLGAVIVMIIAEQITE-IGL-T-NGSSLLIFINII-ARIPNS--------------
+Q4G351_EMIHU/63-407 --SLTVGSILSMWFAELITE-ESL-G-NGSSMIIFINIV-GGIPNN--------------
+SECY_PAVLU/66-404 --AVTTGSLVLVWLSEVITE-RGI-G-NGSSLLILIGNL-SRFRFLin------------
+Q6B8X0_GRATL/62-395 --ALGTGSLIIMWFAEIITE-YGI-G-NGASLLIFQNII-SGIPKN--------------
+SECY_ANTSP/62-390 --SLTTSSMIAMWFSEIISE-YGV-G-NGPSLLIFQNII-SSIPKN--------------
+A4RW47_OSTLU/65-398 --ALTAGAMILMYIGELLNE-IKL-G-NGTSLLIFANIV-SALPSS--------------
+A7PFA4_VITVI/131-465 --LLTLGSVLTTYIGERISD-LKL-G-NGTSLLIFTSII-SYLPAS--------------
+A7HM32_FERNB/75-404 --SLVAGTMFLLWIGDRITE-KGI-G-NGVSIMIFAGIV-SRYPAY--------------
+A3CK84_STRSV/69-416 --LLATGSMIVTWLGEQITD-KGY-G-NGVSMIIFAGIV-SAIPDMik------------
+Q5FM71_LACAC/68-415 --IMTAGTMLLTWLGDEITD-KGL-G-NGVSVIIFAGII-ARLPSGlw------------
+Q03ZM6_LEUMM/68-416 gsVMTIGTFFAMWLGEMITE-KGL-G-NGVSMIIFAGII-AQAPEGfy------------
+SECY_STAA8/69-413 --VLTAGTAFLIWLGDQITQ-FGV-G-NGISIIIFAGIL-STLPAS--------------
+Q4MG72_BACCE/68-415 --VLTAGTAFLLWLGEQITA-NGV-G-NGISMIIFAGLV-AAIPNVan------------
+Q6F1X5_MESFL/92-454 --VMLAGSYFMLWIADQITI-KGV-G-NGISIVIFIGII-VQLPNQik------------
+Q6KI36_MYCMO/87-436 --ILIAGTVFSIFIGDQITD-KGV-G-NGTTLLIFTGIV-ITLPTQft------------
+Q4A5I3_MYCS5/83-437 --ILISASLFALFLSEQITN-KGV-G-NGTSIIIMTGIA-ARLPFQmq------------
+Q98Q01_MYCPU/90-438 --ILVAGSLFTLFLSEQITD-KGI-G-NGTSLIIFSGIS-LSLPSQfr------------
+Q4AAF9_MYCHJ/85-434 --VLVAGSLFSLFLAEQITD-KGV-G-NGTSLLIFSGIV-VGLPRRfq------------
+Q9PQP1_UREPA/76-434 --LMVGGTYISLFLADLISK-KGV-G-NGITLLILTGIV-ASLFNHfi------------
+SECY_MYCGE/81-430 --AMTAGTYMAVFLGDTISK-KGV-G-NGITLLILSGIL-SQLPQGfi------------
+Q8EUD2_MYCPE/81-433 --GMTAGTYLTIFISDIISK-RGV-G-NGVTLIILSGIV-ASIYPNft------------
+Q7X4E3_9MOLU/69-399 --FLTVGVFISIWLADLITS-KGL-G-NGISILIAVGMV-DKLFKT--------------
+Q5Q069_ASTYP/59-398 --IATAGVAILIWFADLINS-KGI-G-NGTSILIVVSMS-HSLINLfa------------
+O21257_RECAM/57-372 --FLVIGSCFLYFFAKLINI-YGI-G-KGLSFIIFINIV-GSFIDI--------------
+Q74NB9_NANEQ/69-457 --QLMLGVILAYLLDDLSQK-WGF-T-SGINLFILATVS-RELFVQlfnpltqip-----
+Q2EMT2_METVO/30-379 --QLAIGAILLIYLDEIVSR-YGI-G-SGIGLFIAAGVS-QTIFVGalg-----------
+A5UL65_METS3/72-433 --QLVIGAILIIYLDEVISK-WGF-G-SGIGLFIAAGVC-EAIIVGtfsfipg-------
+SECY_METTH/73-436 --QLTIGGILIIFLDEVVSK-WGF-G-SGVGLFIAAGVS-QEIIVGafnplsap------
+SECY_PYRAB/72-448 --QLAFGGIILIVLDELVSK-WGI-G-SGISLFIAAGVS-QRILTRslnpltdpnii---
+Q8TZA9_METKA/75-435 --QLALGGILVIFLDEVVSK-WGI-G-SGVGLFIVAGVS-SQIIIGafnplpsp------
+Q9HIT0_THEAC/82-514 --QLFFGSYLVFLMDEVVSK-YGI-G-SGISLFIAADVS-EQLFIGafnwqalnnal---
+Q2QAQ7_9EURY/161-583 --QLFIGSLLVFLLDELVSK-WGI-G-SGISLFIAAGVA-QSTFVGtlsplavnpg----
+Q0W1W5_UNCMA/75-487 --QVALGGVLILYMDEIVSK-WGI-G-SGVSLFIVAGIA-QALVGGifnwnppypgqamg
+SECY_ARCFU/73-471 --QLFIGGVLIVYMDEVVSK-WGI-G-SGVSLFILAGIA-QSIVVGlfnwvipp------
+Q8TRS4_METAC/72-470 --QIFIGGTLILFMDEVVSK-WGI-G-SGVGLFIVAGIS-QQIVTGifnwefe-------
+A0B9U7_METTP/75-515 --QVCLGGVLILYMDEVVSK-WGI-G-SGVGLFIVAGVS-QQLVTGlfnwatg-------
+SECY_HALMA/73-468 --QMFVGGVLILFMDEVISK-WGV-G-SGIGLFIVAGVS-QRLVGGlltapf--------
+Q2FSG8_METHJ/73-458 --QICIGGVLIFLMDEVVTK-WGI-G-SGVGLFIIAGIS-EAIINGfinwapv-------
+A2SPM5_METLZ/73-458 --QICIGGVLVMFMDEVVSK-WGI-G-SGVGLFIVAGVA-QGLINGffnweat-------
+A0RUE4_CENSY/79-457 igQLMASSIIIMFLDELIQKgWGL-G-SGISLFIMAGVA-QQILWSlfsplpa-------
+A8ME75_CALMQ/77-461 --QMLFGAVIVILLDDLISKgWGI-G-SGISLFILISII-RSIFQStfmpvtv-------
+A3MUZ2_PYRCJ/70-435 --QLLLATVIILLLDDLMSKgWGI-G-SAISLIIFLGVS-RQIFLSlfswdtvqd-----
+SECY_SULSO/73-449 --QLIVATYLILLLDELIQKgWGL-G-SGVSLFILAGVM-KIMFWDmfgiasvs------
+SECY_SULAC/74-443 --QLIIASYIILLLDEMIQKgWGL-G-SGVSLFIMAGIM-KVIFWNmfgivsvq------
+A2BME2_HYPBU/73-444 --QLVFATLVLMWFDEMIRNgWGI-G-SALSLFIVASVV-KGLFWQlagstkvat-----
+SECY_AERPE/73-434 --QLFLGALLVIYFDEVMQKgWGI-G-SAISLFILAGVA-QGVVWSifgtipg-------
+A1RWR3_THEPD/75-456 --QLFVASTFVILMNDMLEKgWGI-G-SAVSLFIAAGVA-QQIFWElfspigpl------
+SC61A_SCHPO/76-459 --QLAAASLIVLLLDELLQKgYGL-G-SGISLFIATINC-ENIFWKafspttyhi-----
+A7E5Q2_SCLS1/76-459 --QLVVAGLIVILLDELLQKgYGL-G-SGISLFIATNIC-ESIIWKafspttint-----
+Q5KC69_CRYNE/75-459 --QLVSASLIVILLDELLTKgYGL-G-SGISLFIATNIC-ESIVWKafspntvnt-----
+SC61A_ASHGO/75-460 --QLVFASFIVLLLDELLIKgYGL-G-SGISLFTATNIA-EQIFWKafapttvnn-----
+Q59MJ6_CANAL/76-459 --QLVFASTIVILLDELLQKgYGL-G-SGVSLFTATNTC-EQVFWKafapttsts-----
+A7SJW4_NEMVE/75-458 --QLFCAGLIVLLLDELLQKgYGL-G-SGISLFIATNIC-ETIVWKafspatint-----
+A0CFY2_PARTE/73-456 --QLTFAGVIVTMLDEMLQKgYGL-G-SGISLFIATNVS-ENILWKsfspitlst-----
+Q22MG2_TETTH/151-538 --QLTFAGIIVILLDDLLSKgHGL-GnSAISVFIAINIC-ETIIWKsfspitypip----
+A0CU87_PARTE/77-460 --QLVFSAIVMIMIDELLSKgYGI-GnSGTSLFIAINIC-ENIMWKafspithkt-----
+Q7RLN0_PLAYO/121-506 --QLFFAGVVVILLDELLQKgYGL-G-SGISLFIATNIC-ETIMWKsfspttint-----
+Q4QGX4_LEIMA/77-467 --QLMVATMICILLDELLQKgWGI-G-SGTSLFIATNVC-DTIIWKafspstint-----
+A5JEK2_NOSBO/75-457 --QLIFSGVIIILLDELLQKgYGL-G-NGVNLFIASNVC-ESIMWRafspkvfft-----
+A2DH65_TRIVA/75-462 --QLVSSAIVVILLDELCQNgYGI-G-SGISLFICTNIC-EMIMWRlfsfnhysm-----
+Q2QM98_ORYSJ/88-448 --QLFAGGVVVVLADLLHETgYGVeGvSAASLLIATNAC-ERAVSHlfspvklrl-----
+Q6AV46_ORYSJ/86-471 --QLVLGGMVAIFLDELLQKgYGF-G-SGISLFTAANTC-EGVVTRalspatmdr-----
+Q6C854_YARLI/70-454 --QLTAAGLVLILLGEIVDKgYSF-G-SGSGLFTALSVS-QNFMWQnlallkvhqefvgs
+SSH1_YEAST/78-465 --QLVGAGIFTTLLAEVIDKgFGF-S-SGAMIINTVVIA-TNLVADtfgvsqikvg----
+Q6BT20_DEBHA/78-475 --QIVTMSFVTTLMVEIFDKgYCF-G-SGVLCFVALQVA-TNLIRDvvglelvslp----
+A5DE75_PICGU/20-414 --QVFVMSAVMTLLVEVFDKgYGF-G-SGILCFIALQAA-SDLVKNiiglevvkla----
+A3GFV9_PICST/78-476 --QFLSWSFIITLIVEVFDKgYAF-G-SGALSFLALQTA-TNLIAElvgleifpin----
+A5DWJ5_LODEL/34-436 --QIFTWQIVLTLIVEIFDKgYGF-G-SGILSFLALQNA-TSFIAElvglemfpvv----
+Q5A2C9_CANAL/5-404 --QITAWSWIVTLLVEIFDKgYSF-G-SGILCFLAIQSS-TNFIANllglenfpvv----
+Q74L41_LACJO/64-372 --ILSAGSCLVVWLCYRNMK-YGV-G-ASAPVILTSILN-GAIP----------------
+B3XPQ8_LACRE/65-377 --MLTAGSMFVVWLGNMNMK-FGI-G-GTITLILFNIIS-GSIP----------------
+A1C3L4_STRPA/70-403 --LLTTGTFILNWLCKINSE-RGI-G--GMTVVILVNMI-LTFQSN--------------
+Q3DVD6_STRAG/65-395 --ILVTGAYIISWIGNLNAE-YGF-G--GMTILVVVGML-VGQFNN--------------
+A5LN99_STRPN/64-389 --LLIAGTFFLVWLSDLNAS-MGI-G--GSIVILLSSMV-LNIPQD--------------
+A3CM55_STRSV/64-391 --VLMAGTYFLIWLTDLNAA-MGL-G--GSIMIVMASMI-AYIPQD--------------
+Q03HZ8_PEDPA/65-396 --VLVAGAMIVAWMSDMITK-YGI-G--GSGVLILPGMI-DSIPRV--------------
+A5IW80_STAA9/64-384 --ILVTGTMLLVWLADKNSR-YGI---AGPMPIVMVSII-KSMMH---------------
+Q4L9N9_STAHJ/61-383 --ILVAGTMLLVWLADQNIT-YGI---CGPMPIVLTSLI-KSLFNN--------------
+Q5HKR3_STAEQ/61-380 --VLITGTLLMVWLADQNTT-YGI---SGPMPIVLMSLV-KSIFN---------------
+Q9RSK8_DEIRA/68-413 --TQVAGIAFTMWIGERITE-VGI-G-NGISLIITAGII-AVYPRE--------------
+Q5SHQ8_THET8/71-413 --TQVAGIALLLWMAERITE-YGI-G-NGTSLIIFAGIVvEWLPQ---------------
+SECY_CORGL/73-424 --TMTAGAVLVMWMGELITE-KGV-G-NGMSLLIFAGIA-TRLPTDgm------------
+A8LB12_FRASN/74-414 --TMTAGTAVIMWMGELITA-RGV-G-NGMSLLIFTSIA-AALPSQgg------------
+Q83NQ1_TROW8/73-424 --VMTAGTGLIMWLGELITE-RGI-G-NGMSILIFTSIA-AGFPGV--------------
+Q8G3Z9_BIFLO/74-421 --IMTGGTGLIMWMAELVTD-KGI-G-QGMSILIFMSIC-SGF-----------------
+A7B9M4_9ACTO/72-414 --VMMAGTGVIMWLGELITE-RGI-G-NGMSLLIFTSIA-ARLPEQ--------------
+SECY_CHLTR/73-433 --VMITGTLLLMWVGEQISD-KGI-G-NGISLIITLGIL-ASFPSV--------------
+Q1AU49_RUBXD/70-408 --TLTTGVMVTMWFGELITQ-RGL-G-NGISLIITASIL-SQAPNA--------------
+Q8RIH6_FUSNN/75-411 --TLTAGTVFLMWVGEQISI-KGI-G-NGVSLIIFLNVI-SRAPSS--------------
+A6DRC9_9BACT/79-428 --IVTASAILIMWLGEQITD-KGL-G-NGASIIITINVL-SSMPQA--------------
+C0ACZ0_9BACT/94-454 --FMTAGTMLLTWLGEQITQ-RGI-G-NGISLLITIGII-SDLPGA--------------
+Q1Q157_9BACT/75-434 --LLTTGTMILMWIGEQIEE-HGI-G-SGISIVIMVGII-ERLPWAf-------------
+A6CGP8_9PLAN/77-435 --TMTTGTVFLMWIGEQIDA-YGI-G-NGISLLIMAGIL-ARMPQAgw------------
+B4S5A8_PROA2/73-417 --ILTASTVFVMWLGEKITE-RGI-G-NGISLIIMIGIL-ARFPQS--------------
+Q2S3P5_SALRD/75-414 --VLTSGTAFVMWLGERISE-DGI-G-NGISLIITIGII-AFLPQA--------------
+A1ZGT4_9SPHI/72-404 --ILTAGTVFTMWLGEKIDD-RGI-G-QGISLLIMIGII-SRLPQS--------------
+A6EHP4_9SPHI/71-408 --VLAAGTLFVMWLGEKITD-KGI-G-NGISLIIMVGII-ARLPIA--------------
+Q11QD2_CYTH3/72-411 --TLISGTMFCMWIGERITE-KGI-G-NGISMLIMIGIV-SRLPFA--------------
+Q1VTY0_9FLAO/73-421 --ILTTGCIFAMWLGEKITD-KGI-G-NGISLLIMVGII-ATLPQA--------------
+Q1NYZ7_9FLAO/72-422 --CITTGTFFTMWLGEKIND-KGI-G-NGNSLIIISGIL-SRFIYS--------------
+A5KHP6_CAMJE/62-402 --SMLAGTMLLMWLGEQITQ-RGI-G-NGISLIIFAGIV-SGIPRA--------------
+A4EA78_9ACTN/52-389 --TLTAGAMLIMWIGELITQ-RGI-G-NGMSLIIFANIM-AGLPQA--------------
+Q2GEC0_NEOSM/73-411 --TLVCGTFSLIWLGQQINS-RGI-G-NGMSLIIFAGIV-AEMPAI--------------
+Q3YRM8_EHRCJ/72-412 --SLLGGTMFLLWLGERINK-NGI-G-NGVSMIIFTGIV-AELPGS--------------
+Q5GSW3_WOLTR/77-416 --SLLGGTMFLIWLGEQISA-SGI-G-NGISLIIFTGII-SELHNA--------------
+Q0ANS0_MARMM/83-421 --TLVGATMLLLWLGEQITA-RGV-G-NGVSLIIFAGII-SAVPGV--------------
+A7IPQ0_XANP2/80-418 --TLTGGTMFLMWLGEQITS-RGI-G-NGTSLIIFGGIV-AELPGA--------------
+SECY_RICCN/70-411 --TLVVGTMLLMWLGEQITQ-RGI-G-NGTSLIIFIGII-SGVPSA--------------
+Q2G8W0_NOVAD/80-430 --SLIGGTMFLLWLGEQITS-RGI-G-NGVSLIIMAGIV-AQMPKF--------------
+A6E0Q6_9RHOB/73-411 --TLIGGTMFLMWLGEQITA-RGV-G-NGISLIIFVGII-AEVPAA--------------
+Q1UZE8_9RICK/67-404 --TIVAGTMFLMWLGEQITQ-RGI-G-NGISLIIFAGIV-AEIPRA--------------
+Q3R245_XYLFA/76-424 --ALTAGTVFLMWVGEQVTE-RGI-G-NGVSMIIFAGIV-AGLPGS--------------
+A4NK90_HAEIN/76-416 --SLVTGTMFLMWLGEQITE-RGI-G-NGISILVFGGIV-AGLPSA--------------
+Q057C4_BUCCC/64-407 --SLVTGTIFLMWLGELITT-KGV-G-NGVSLIIFSGII-SGLPAS--------------
+Q8D1Z2_WIGBR/82-424 --SLVTGTIFLMWLGEQITS-RGI-G-NGISILIFSGII-AGLPIE--------------
+Q6F7T2_ACIAD/83-426 --SLVAGTMFLMWLGEQITE-RGI-G-NGISMIIFAGIV-AGLPNQ--------------
+Q6Q8W8_9GAMM/67-407 --SVVAGTMFLMWLGEQVSD-RGI-G-NGISIIIATSIL-TGIPGA--------------
+A9BRX1_DELAS/74-413 --SLTAGTMFLMWLGEQITE-RGL-G-NGISILIFGGIA-AGLPSS--------------
+Q7DDS8_NEIMB/73-410 --SLVTGTMFLMWLGEQITE-RGI-G-NGISLIITAGIA-SGIPSG--------------
+Q5NHU8_FRATT/74-416 --SVTTGSMFLMWLGEQITE-RGV-G-NGISLLIFSGIV-ANLPFE--------------
+Q7WZR8_9GAMM/64-388 --TFVTGAIFLMWLGEQITD-KGI-G-NGISLIILSGLV-SVIPNA--------------
+A5EX98_DICNV/69-412 --GLTAGALFMMWLGEQITE-RGI-G-NGISMLIFGGIA-VNMPSG--------------
+Q6MJ32_BDEBA/70-415 --TLTAGTCFIMWLGEQITE-RGI-G-NGTSLIIFTGIA-AAIPGG--------------
+B5EFS0_GEOBB/71-411 --TLTAGTAFIMWLGEQMSE-KGI-G-NGISLIIFAGIV-ARIPTA--------------
+A3EVQ1_9BACT/75-412 --TLTAATTFVMWIGEQITE-RGV-G-NGISLIIFSGII-ARLPAA--------------
+Q1MPP6_LAWIP/71-412 --TLTAGTVLIMWLGEQISE-KGI-G-NGISLIIFSGIV-VGIPGA--------------
+SECY_AQUAE/71-412 --TLVAGTMFLVWIADRITE-KGI-G-NGASLIIFAGIV-ANFPNA--------------
+Q01WB2_SOLUE/74-438 --SLTTGTAFIMWLGEQISE-RGV-G-NGMSLIIFTGIV-VGLPNA--------------
+Q08ZH8_STIAU/26-370 --SLTAGTAFIMWLGERITE-RGI-G-NGISLIIFAGIV-AGLLPN--------------
+A6GCG0_9DELT/70-411 --SLTAGTCFLMWLGEQITE-RGI-G-NGISLIIFAGII-ADMPTA--------------
+Q04PV8_LEPBJ/72-436 --SITTGTVLLIWLGEQITE-RGI-G-NGISLLIFAGII-GRLPES--------------
+SECY_BORBU/72-409 --TVTTGTFILLWFGEQINQ-RGV-G-NGTSLIIFSGIV-VRLQAA--------------
+Q73PL2_TREDE/73-413 --TVTTGTMITVWMGEQITA-RGI-G-NGISMLIFAGIV-ARLPQA--------------
+Q67JW3_SYMTH/69-405 --SLTAGTALVMWIGEEITE-KGI-G-NGISLIIFANIV-SRLPYS--------------
+A7FQ38_CLOB1/69-409 --TVTTASTFLMWFGDKITE-KGI-G-NGISLIIFVNIV-SRFPST--------------
+A6LPT1_CLOB8/69-416 --ALVVGTTFCMWLGDQLTV-KGI-G-NGTSILIFVNII-SRVPAT--------------
+Q0SQG4_CLOPS/69-409 --TLVVGSTFLMWLGDQITV-KGV-G-NGTSLIIFANIL-SSLPMT--------------
+A9KJH4_CLOPH/71-425 --SFTAGSAILMWLGERITE-KGV-G-NGISVILLINIV-ANMPRD--------------
+A7VH89_9CLOT/71-420 --ILTGGSAFVMWLGERVTD-RGV-G-NGISIILLINIV-STMPND--------------
+A6BIS2_9FIRM/71-421 --TLTAGSAFLMWIGERITE-KGV-G-NGISIVLVINII-SRIPSD--------------
+A7VR33_9CLOT/71-423 --VFTAGTAMMMWLGEQINQ-KGI-G-NGISILLFAGIV-ARLPDTvn------------
+A6NXF0_9BACE/71-437 --TFTAGSAFVMWLGEQITE-FGI-G-NGISIILFAGIV-SRFPSM--------------
+Q250L2_DESHY/70-413 --ILTAGTAFLMWLGERITE-NGI-G-NGISLIIFAGIV-AGVPDA--------------
+Q8R7X3_THETN/69-402 --TLTAGTTFLMWLGERITE-NGL-G-NGSSLIIFAGII-SRIPNM--------------
+A4XLR1_CALS8/69-419 --ALTAGTVFLMWIGEQITE-NGI-G-NGISLLIFAGII-SRIPNG--------------
+A3DJJ2_CLOTH/71-411 --TFTAGTAFLMWLGEQITE-YGI-G-NGISLLIFAGIV-SRGPRG--------------
+A8MLG0_ALKOO/69-408 --TLTAGTAFLMWLGEQITE-KGI-G-NGISLLIFAGII-ASLPSS--------------
+Q18CH6_CLOD6/69-406 --TLVSASMLVMWIGDKITE-KGI-G-NGSSVIIFAGII-SRIPTD--------------
+B8D0S8_HALOH/72-406 --SLTAGTAFLMWLGEQITD-KGI-G-NGISIIIFTSII-SRFPSY--------------
+
+A9B431_HERA2/73-422 ------------------VY---QAITTSS----------------------SGNNVIG-
+A8CRX1_9CHLR/78-422 ------------------IG---RGLMASD-------------------------QFAG-
+A2Y4E5_ORYSI/132-498 ------------------LH---KMLTQFS---------------------GNWYSCWH-
+Q7UZW2_PROMP/80-422 ------------------LS---STIEKAQ--------------------TGDRGDVLG-
+Q7NKT4_GLOVI/79-416 ------------------FS---QTFQLLQ---------------------ADSSRVAG-
+SECY_GUITH/68-404 ------------------LQ---SQIQSTR----------------------LNIQALD-
+SECY_CYACA/62-394 ------------------LL---NQLFVHS------------------------IKFLD-
+Q85FU6_CYAME/42-325 ------------------LH---HPIEAPW------------------------------
+A0T0J6_PHATR/72-407 ------------------SK---TILSENS-----------------------QNFTLG-
+SECY_CYAPA/109-459 ------------------IE---QLFNSNI------------------NWT--FPMISS-
+Q4G351_EMIHU/63-407 ------------------LSslsKTFSAAN----------------------LASAIPL-
+SECY_PAVLU/66-404 ----------------kdDF---DSLNVSS------------------------QSNLY-
+Q6B8X0_GRATL/62-395 ------------------IQ---NYKINIY----------------------DKQTIIN-
+SECY_ANTSP/62-390 ------------------LQ---NYTFNIG----------------------TTNTVLN-
+A4RW47_OSTLU/65-398 ------------------VG---QTVSMAQ----------------------EKGDSSV-
+A7PFA4_VITVI/131-465 ------------------FG---RTVAQAF----------------------QDGNYIG-
+A7HM32_FERNB/75-404 ------------------FR---SAVLG-------------------------NLNIFG-
+A3CK84_STRSV/69-416 ----------------giYE---DYFVNIP-------------------SERLTSSFIF-
+Q5FM71_LACAC/68-415 ----------------qiYK---EEIINNS------------------ASDR-WQGILF-
+Q03ZM6_LEUMM/68-416 ----------------eiFK---ENILQAD------------------SSDM-LNGWIF-
+SECY_STAA8/69-413 ------------------LI---QFGQTAF-----------------vGQEDTSLAWLK-
+Q4MG72_BACCE/68-415 ----------------qiYL---QQFQNAG--------------------DQLFMHIIK-
+Q6F1X5_MESFL/92-454 ----------------atYD---FWIPSNE------------------SINVFFDGIIK-
+Q6KI36_MYCMO/87-436 ----------------atFN---ALVGEQQ------------------RVSSLSNGIVT-
+Q4A5I3_MYCS5/83-437 ----------------naFK---IFVGDLS-------------------QSGTLVGILN-
+Q98Q01_MYCPU/90-438 ----------------aaFN---VLVGTNK--------------------TTLFTGLIH-
+Q4AAF9_MYCHJ/85-434 ----------------haFE---YLVDLSF-------------------SSSLISQVLS-
+Q9PQP1_UREPA/76-434 ----------------aiFS---NLGSLTS---------------------SKVSQIIG-
+SECY_MYCGE/81-430 ----------------aaYN---VLSGIVI------------------TLTPQLTAAIS-
+Q8EUD2_MYCPE/81-433 ----------------svFQ---VLTGSSQ-------------------ISNQLLRYFS-
+Q7X4E3_9MOLU/69-399 ------------------FK---YLLSNSN-----------------------GFETQR-
+Q5Q069_ASTYP/59-398 ----------------nlNK---SYLSKNT---------------------FLTLKTFN-
+O21257_RECAM/57-372 ------------------FY---KYLIQIE-----------------------TLNVKY-
+Q74NB9_NANEQ/69-457 ---------gtptppigkIP---QIFYFIS-------------------QGLYTEAIVV-
+Q2EMT2_METVO/30-379 --------------pqgyLW---KFFSALV-------------------SGSMGPALEY-
+A5UL65_METS3/72-433 ----------pggvyggaIP---AFIQSFW-----------------------SSSIDF-
+SECY_METTH/73-436 ---------tqpgvpagrIT---GFLYLLF-------------------TGQSPDFQYY-
+SECY_PYRAB/72-448 ------dpltgkpaivgaIP---YFIQHIL--------------------KGDLKGALYr
+Q8TZA9_METKA/75-435 ---------qqpgrpagaVW---AFLYSAM---------------------QGTPDWTL-
+Q9HIT0_THEAC/82-514 -------tysltnppagaFP---KMFYIIMhss-----------ssylLT-NGVVQILF-
+Q2QAQ7_9EURY/161-583 -------ayglqnppagtLP---MIFYTLRtat-----------fsemVTANGFESILLg
+Q0W1W5_UNCMA/75-487 lnvdiaglgarenlpigiIF---RWEWLLNnig-----------lsqlLTGENLIVLLY-
+SECY_ARCFU/73-471 ----------nsampagiIP---RWIWIAQnyp-----------ldqlFTGSGLAFLLI-
+Q8TRS4_METAC/72-470 -----------eglpvglIP---KWIYIAQntg-----------adylFSGEGLMFLLV-
+A0B9U7_METTP/75-515 ----------dgglpigiVP---KWISIIRlgli---------gldeiFTAEGLKFIFV-
+SECY_HALMA/73-468 -----------lgnsegiIY---TWYLFITgerg----------tgpvLAADGLQTVLL-
+Q2FSG8_METHJ/73-458 ----------ndmypvgfFP---RLFAVVL---------------------DGANFIQY-
+A2SPM5_METLZ/73-458 ----------tdqfavgfFP---RLFQVIA---------------------DGSNFIEY-
+A0RUE4_CENSY/79-457 ----------gdgfavgiFP---FIGQWAS------------------VGMGNFEDIFFr
+A8ME75_CALMQ/77-461 ----------gagellgiIP---ALVAAVYsa-------------avsHTLAPLLSIVYr
+A3MUZ2_PYRCJ/70-435 --------sngntqvfglLP---ALGVALYdl-------------ftsGNANTLLGLVNr
+SECY_SULSO/73-449 ----------sqnlpigfFP---ALFTALA-------------------SHSDVLNLIVn
+SECY_SULAC/74-443 ----------sqnlpvgfFP---LLVSYIT-------------------SGRNLQEIVLn
+A2BME2_HYPBU/73-444 --------pegqpvyygwLA---HVVSTGD-----------------------LGVLRR-
+SECY_AERPE/73-434 -----------vaqdyglVP---AIISNPD-----------------------LTLLARp
+A1RWR3_THEPD/75-456 ----------gdglyyglFP---SLFSALV-----------------sGNSTLLMHVVVr
+SC61A_SCHPO/76-459 ---------angvqfegaVI---NFVYVMFt---------------wdNKAAALYQAFFr
+A7E5Q2_SCLS1/76-459 ---------grgpefegaVI---ALFHLLLt---------------wpNKQRALQEAFYr
+Q5KC69_CRYNE/75-459 ---------grgpefegaII---ALIHLLFt---------------wnDKTRALKEAFYr
+SC61A_ASHGO/75-460 ---------grgtefegaVV---ALFHLLSv---------------rkDKKRALVEAFYr
+Q59MJ6_CANAL/76-459 ---------akgtefdgaVV---AMFHLLGs---------------rkDKKRALIESFYr
+A7SJW4_NEMVE/75-458 ---------grgtefegaVI---ALFHLLAt---------------rtDKVRGLREAFYr
+A0CFY2_PARTE/73-456 ---------eagtqfegaII---NFFHLLFt---------------kqNTLQALYYAFFr
+Q22MG2_TETTH/151-538 --------gfekeqyegaIL---NLFHSLFa---------------idNKFVALQNAFYr
+A0CU87_PARTE/77-460 ---------elgleyegaII---ALLHGLFv---------------qsDKISALQSAILr
+Q7RLN0_PLAYO/121-506 ---------dkgiefegaII---SLIYCLFt---------------efNKISALKKSFYr
+Q4QGX4_LEIMA/77-467 ---------grgaefegaII---AFFHLLVs---------------rtDKVRALREAFYr
+A5JEK2_NOSBO/75-457 ---------grgiefegsLI---AFFHLLIv---------------rkNKFAALYEAFFr
+A2DH65_TRIVA/75-462 ---------grgteyeglVI---AFFHYLFt---------------rkNKLRALRDIVFr
+Q2QM98_ORYSJ/88-448 --------agagpefegpVF---AVTHRVAaap-----------pswrHKAGALLFTLLr
+Q6AV46_ORYSJ/86-471 ---------grgaefvgaVT---AAAHLLAt---------------raRKLSAVREAFFr
+Q6C854_YARLI/70-454 ---ipallmglwknglfnFG---GSYRYVI-------------------ENSFFRQNLP-
+SSH1_YEAST/78-465 --------eddqteaqgaLI---NLIQGLRsk--------------hkTFIGGIISAFNr
+Q6BT20_DEBHA/78-475 --------nsnkfesygaAM---NFIKNFR-----------------iNFKSLNYNVLN-
+A5DE75_PICGU/20-414 --------nsnkfesvgaLM---NLIRSFSf----------------kTLGKNIYNSFNr
+A3GFV9_PICST/78-476 --------nsnkfesygaLI---NFTRNFSfdi-----------skigTNVYNSFTRLQ-
+A5DWJ5_LODEL/34-436 -------nntlkfeslgaLL---NLVRNFSif-------------sptTTINQIWHAFTr
+Q5A2C9_CANAL/5-404 --------nsnkfesygaLM---NLIKNFSif-------------npkQTVYQIWHSFFr
+Q74L41_LACJO/64-372 -----------------------NIISNVK------------------LLLTMKYAWIW-
+B3XPQ8_LACRE/65-377 -----------------------TLLRSIK------------------MLAKQSYGPLW-
+A1C3L4_STRPA/70-403 ------------------II---RYFSVQQ------------------------FKFSS-
+Q3DVD6_STRAG/65-395 ------------------IP---LIFELFQ-----------------------DGYQLA-
+A5LN99_STRPN/64-389 ------------------VL---ETFQTVH------------------------IPTGI-
+A3CM55_STRSV/64-391 ------------------IW---NSIQELK------------------------ISSLW-
+Q03HZ8_PEDPA/65-396 -----------------------LLYGQGL----------------------GSGAVFF-
+A5IW80_STAA9/64-384 -----------------------QKMEYID------------------------ASHIV-
+Q4L9N9_STAHJ/61-383 -----------------------QHFFKLS------------------------VSVLL-
+Q5HKR3_STAEQ/61-380 -----------------------THFPKLN------------------------SSASL-
+Q9RSK8_DEIRA/68-413 ------------------IA---ATAQLLR---------------------SEQTTLLS-
+Q5SHQ8_THET8/71-413 ------------------IL---RTIGLIR---------------------TGEVNLVA-
+SECY_CORGL/73-424 ----------------niLG---------------------------------NSGGVV-
+A8LB12_FRASN/74-414 ----------------riLQ---------------------------------VAGGVV-
+Q83NQ1_TROW8/73-424 ------------------LV---GVYQT--------------------------RGFGM-
+Q8G3Z9_BIFLO/74-421 ------------------LP---QLWEIGY------------------GTNGTDGDWLK-
+A7B9M4_9ACTO/72-414 ------------------LL---SIGQA--------------------------GKWGS-
+SECY_CHLTR/73-433 ------------------LGsifNKLNLGS------------------QDPS-EFGIVS-
+Q1AU49_RUBXD/70-408 ------------------VR---TLIE--------------------------DGSVLT-
+Q8RIH6_FUSNN/75-411 ------------------VI---QTIQTMQ----------------------GNKFLIP-
+A6DRC9_9BACT/79-428 ------------------FA---AVYSK-Y------------------QE-G-EWNLVQ-
+C0ACZ0_9BACT/94-454 ------------------MGtlwTLLRAPV------------------GT-Q-GISMIS-
+Q1Q157_9BACT/75-434 ----------------nqIV---QNFTFSV------------------APAEHQIGIVK-
+A6CGP8_9PLAN/77-435 ----------------slIE---PAFEKGI------------------ALGT-DTGIDR-
+B4S5A8_PROA2/73-417 ------------------VI---AEFQSVS---------------------LGSKNWII-
+Q2S3P5_SALRD/75-414 ------------------LY---NEIGLI------------------------GDNFFI-
+A1ZGT4_9SPHI/72-404 ------------------LV---EEVVARS---------------------T-GSQVLI-
+A6EHP4_9SPHI/71-408 ------------------LY---QEITSRI---------------------VSDGGLIA-
+Q11QD2_CYTH3/72-411 ------------------LM---AEVSSKN-----------------------LEGALP-
+Q1VTY0_9FLAO/73-421 ------------------FI---QEFISRV--------------------TESNGGLIL-
+Q1NYZ7_9FLAO/72-422 ------------------II---SEIFNRL------------------KNNNKLLGIII-
+A5KHP6_CAMJE/62-402 ------------------IS---GTVGQ-I------------------NS-G-EMNFLT-
+A4EA78_9ACTN/52-389 ------------------IF---SSTE------------------------GNAGGIIT-
+Q2GEC0_NEOSM/73-411 ------------------FG---NLFSGIG---------------------SPGSGILG-
+Q3YRM8_EHRCJ/72-412 ------------------FS---SMFLL--------------------GKNG-NVPIFV-
+Q5GSW3_WOLTR/77-416 ------------------FS---FLLT--L------------------NKNG-SMSLLI-
+Q0ANS0_MARMM/83-421 ------------------IG---GALSQ-A------------------SS-T-GDGTVL-
+A7IPQ0_XANP2/80-418 ------------------FV---RTLQL-G------------------RE-G-AISTPL-
+SECY_RICCN/70-411 ------------------II---SMFEL-S------------------RK-G-ALS-PL-
+Q2G8W0_NOVAD/80-430 ------------------FG---NLFEG-G------------------RT-G-SISPFL-
+A6E0Q6_9RHOB/73-411 ------------------LA---QFFAS-G------------------RS-G-AVSPAV-
+Q1UZE8_9RICK/67-404 ------------------LV---TTFEL-G------------------RT-G-AVSTIM-
+Q3R245_XYLFA/76-424 ------------------VL---QTIDA-F------------------RS-D-ALSLIS-
+A4NK90_HAEIN/76-416 ------------------IL---QTIEQ-A------------------RQ-G-QMHPLV-
+Q057C4_BUCCC/64-407 ------------------VI---RTYKLIK---------------------IKNFSFLY-
+Q8D1Z2_WIGBR/82-424 ------------------VI---KSIEQ-A------------------RQ-G-NLNIIT-
+Q6F7T2_ACIAD/83-426 ------------------VI---QAFTS-V------------------QN-G-QGSLIG-
+Q6Q8W8_9GAMM/67-407 ------------------IG---QALEQ-S------------------RQ-G-DLSILL-
+A9BRX1_DELAS/74-413 ------------------IG---GLLEL-V------------------RT-G-AMSILA-
+Q7DDS8_NEIMB/73-410 ------------------IA---KLVTL-T------------------NQ-G-SMSMLT-
+Q5NHU8_FRATT/74-416 ------------------IS---NTLSQ-A------------------NQ-H-VISYLS-
+Q7WZR8_9GAMM/64-388 ------------------LG---RTLFLTI------------------KD-S-SWMYIQ-
+A5EX98_DICNV/69-412 ------------------IL---GLFNQAK---------------------IGEIGYGR-
+Q6MJ32_BDEBA/70-415 ------------------AQ---QLWEL-V------------------RT-G-EMRFAL-
+B5EFS0_GEOBB/71-411 ------------------IG---NSFRL-I------------------KT-G-ELSLFV-
+A3EVQ1_9BACT/75-412 ------------------II---NTYKL--------------------YNQG-EISGFL-
+Q1MPP6_LAWIP/71-412 ------------------IV---KTYQL-I------------------IL-G-DMNILI-
+SECY_AQUAE/71-412 ------------------VI---QFYEK-V------------------KT-G-DIGPLT-
+Q01WB2_SOLUE/74-438 ------------------IA---NIYQH-V------------------FTIH-DWGAIT-
+Q08ZH8_STIAU/26-370 ------------------GK---TLLDM-T------------------AQ-G-AIEAAA-
+A6GCG0_9DELT/70-411 ------------------SY---QLAQKAI------------------DDPE-NFGPLP-
+Q04PV8_LEPBJ/72-436 ------------------MV---QLFST-----------------------D-TMDALN-
+SECY_BORBU/72-409 ------------------LF---NLFQS-M------------------QDPSQNVNPVF-
+Q73PL2_TREDE/73-413 ------------------VW---ELIKLVS---------------------NNELNLVF-
+Q67JW3_SYMTH/69-405 ------------------IY---NEILL--------------------LRAG-QRNIFQ-
+A7FQ38_CLOB1/69-409 ------------------IY---SIVGL--------------------QKAE-TVNFVE-
+A6LPT1_CLOB8/69-416 ------------------IA---SMMTL--------------------QQAG-SASIVE-
+Q0SQG4_CLOPS/69-409 ------------------GY---QIYNL--------------------SKIG-KINVVE-
+A9KJH4_CLOPH/71-425 ------------------IY---GLIEKFV------------------LGESVVKGVTA-
+A7VH89_9CLOT/71-420 ------------------FK---NIYTQFI------------------KDKDPVRMCLI-
+A6BIS2_9FIRM/71-421 ------------------MK---TLFDQFV------------------KGKAIASACLA-
+A7VR33_9CLOT/71-423 ----------------ilVQ---ALQAAWQ------------------APDSFGQYYFF-
+A6NXF0_9BACE/71-437 ------------------LM---NMVQGVQrwsmhlsdeeisamsngeAFRNSLVHPAM-
+Q250L2_DESHY/70-413 ------------------IK---RIAGL--------------------LSVG-EINVFS-
+Q8R7X3_THETN/69-402 ------------------IY---LTHEY--------------------IKAG-TSNIFG-
+A4XLR1_CALS8/69-419 ------------------AV---SLWNYVA-----------------kLNEFSLTSIIG-
+A3DJJ2_CLOTH/71-411 ------------------ILylwDLYRLER------------------LGKG-ILGIFG-
+A8MLG0_ALKOO/69-408 ------------------LF---TTFAL--------------------TKAG-QINPLA-
+Q18CH6_CLOD6/69-406 ------------------VI---KISQQ--------------------VKSG-EVAPWV-
+B8D0S8_HALOH/72-406 ------------------IH---RNWEL--------------------YKTG-DITALN-
+
+A9B431_HERA2/73-422 --------G--------ILLLIVTLAT-VVGIVLITEGQRRIPVQYAKR---VRG-----
+A8CRX1_9CHLR/78-422 --------L--------AVYAFMALLT-TVLIVIFTEAHRRIPVQYAQT---VIRs----
+A2Y4E5_ORYSI/132-498 --------Y--------ILGIAGTFILvTMGAVLVTEGCRKIKLQYYGF------klasg
+Q7UZW2_PROMP/80-422 --------I--------AVLLGVFLLT-IVGIIFVQEGARRIPIVSAKR---QIG-----
+Q7NKT4_GLOVI/79-416 --------V--------VVLLLVFLAM-IVGIVFVQEGTRRIPIISARR---QVG-----
+SECY_GUITH/68-404 --------I--------FVLVFIFSVM-IIGIIFIQEGIKRIPIISARQ-----------
+SECY_CYACA/62-394 --------F--------ASYFALIVFS-IACIVFVQEAIRKVPIISAKQ-----------
+Q85FU6_CYAME/42-325 -----------------SLAMVVLIFT-MLGMIALQEAVRAIPILSAKQ-----------
+A0T0J6_PHATR/72-407 --------S--------EIGIVLLIFTsLYGIVFLQEGVRIIPLISSKQ---LNQ-----
+SECY_CYAPA/109-459 --------L--------ILSLSLSFIT-MFVIIGLQESGRPVPVLIARQ---EAErqkfn
+Q4G351_EMIHU/63-407 --------L--------LTGLGIYLGI-VLIIIFFQESYKKITIVSAKQlnlTTS-----
+SECY_PAVLU/66-404 --------I--------IYIIITLVSM-LIFSTLSQEGARKIPVVSAKQ-----------
+Q6B8X0_GRATL/62-395 --------G--------SFLFLLFVLI-LIINILIQECKRKIMIVSAKQ-----------
+SECY_ANTSP/62-390 --------G--------SLILSFGIII-LIINILIQEGERKIAILSAKQ-----------
+A4RW47_OSTLU/65-398 --------L--------AVFFGAFALT-TLGIVYVQEAERKIPMNYSTR-----------
+A7PFA4_VITVI/131-465 --------L--------VIIIISFFLL-VLGIVYVQEAERKIPLNYASR-----------
+A7HM32_FERNB/75-404 --------W--------IFLIAVAIFM-VVAIIYVQQAERRIKIEYATR---MVGr----
+A3CK84_STRSV/69-416 --------V--------GILIVAVLLI-IYFTTFVQQAEYKIPIQYTKV-----------
+Q5FM71_LACAC/68-415 --------F--------IAVIVAILIV-TQLVTWVEQADRRIPIQYTRR---ATI-----
+Q03ZM6_LEUMM/68-416 --------V--------VVLVIAMILV-VAFTTWSYEGTRRLQMQYTRS---ATS-----
+SECY_STAA8/69-413 --------V--------LGLLVSLILL-TVGAIYVLEAVRKIPIQYAKK-----------
+Q4MG72_BACCE/68-415 --------M--------LLIGLVILAI-VVGVIYIQQAVRKIPIQYAKA---VSGn----
+Q6F1X5_MESFL/92-454 --------F--------SIYMLVFFVV-IFSVVLMNEAERKVPIQQTGS---GLI-----
+Q6KI36_MYCMO/87-436 --------F--------ISYVFGFIIL-MYIIGFVYNAERRIPIQQVGA---GRA-----
+Q4A5I3_MYCS5/83-437 --------F--------VTYIFIYLAC-LMVIGIFYNAERRIPIQQTGA---GRS-----
+Q98Q01_MYCPU/90-438 --------F--------LLYLFGYLLL-IVIIVFVYLAERRIPIQQTGA---GLS-----
+Q4AAF9_MYCHJ/85-434 --------F--------ILYIFGFLLI-LLIAIYVYLAERKIPIQQTGS---GMS-----
+Q9PQP1_UREPA/76-434 --------F--------ILYILFYIMI-LIGVVFVNNSTRKIPVQQTGQ---ALI-----
+SECY_MYCGE/81-430 --------F--------FIYFLAFLVL-LFATTFITQATRKIPIQQSGQ---GLV-----
+Q8EUD2_MYCPE/81-433 --------F--------AVYLVFFFLI-LLATTFVNGSVRKIPIQQIGQ---GLS-----
+Q7X4E3_9MOLU/69-399 -----------------ILILVSYFVL-LILTIILSSAYLKIPINYAXN-----------
+Q5Q069_ASTYP/59-398 --------F--------ACIVLLLLLF-LIFTVVVQITSLKIPINYARN-----------
+O21257_RECAM/57-372 --------L--------VFLLFVQCLFcGIIYFYIDFLFLKIPIIKLNF------vg--n
+Q74NB9_NANEQ/69-457 -----------------GLQLLVIVLV-ILLSVYFYMVKIPIPTSFGKI-----------
+Q2EMT2_METVO/30-379 -----------------ILPILATIAV-FFVVVYAESIRVEIPLAHGRV-----------
+A5UL65_METS3/72-433 ---------s------vLIPLIATAAV-FFVVVYGESMRVEIPISHGSV-----------
+SECY_METTH/73-436 -----------------VLPVLALIAV-FLVVVYAESMRVEIPISMGGG-----------
+SECY_PYRAB/72-448 ------ggTa-----pdMMAVIATIIV-FLVVVYFESMRVEIPLGYRGV-----------
+Q8TZA9_METKA/75-435 -----------------LAPVIGAIIT-FLIVLYVEGMRVEIPIAFAGI-----------
+Q9HIT0_THEAC/82-514 -------sPp-----npMIAVLGTLLI-FFLVAYFQSSKIELPISHERV-----------
+Q2QAQ7_9EURY/161-583 d-----aaHp-----naVVALFSSVVV-FLVVAYAESSKLELPLTHGKV-----------
+Q0W1W5_UNCMA/75-487 ---------q-----geILALLATIII-FLLIVYVESTRIEIPLAHAAV-----------
+SECY_ARCFU/73-471 ---------q-----ggILALITTAAI-ILLVVFFEGTRVEIPLAHAVA-----------
+Q8TRS4_METAC/72-470 ---------r-----ggILALLSTVAI-FLLVVYVESTRIEIPLAHSAV-----------
+A0B9U7_METTP/75-515 ---------t-----ggLLALISTVGI-ILLVVLVESTRIEIPLAHSRV-----------
+SECY_HALMA/73-468 ---------q-----geLLGLFTTVLI-FAVVVYAESVRVEIPLSNARV-----------
+Q2FSG8_METHJ/73-458 --------Fg-----tdLIAFITTIAI-FILIVYVESTRVEIPLAHTQV-----------
+A2SPM5_METLZ/73-458 --------Fg-----lqLLALVTTVGL-FFIIVYVESTRIEIPLAHANV-----------
+A0RUE4_CENSY/79-457 ------ynQl-----psIFGLLLTGGV-LLILVYTQGMKIEIPIVSTKY-----------
+A8ME75_CALMQ/77-461 -------fNl-----pgLIGLIATIVL-GGFIAYVELMEVRIPLSFVQY-----------
+A3MUZ2_PYRCJ/70-435 pl--tvntYl-----pdFVGLVATILL-GYIILYLEMMKVNIPVASAQY-----------
+SECY_SULSO/73-449 tstknlfq-p------dLVGLVTTIAL-IIITIYLTTMTIEIPVTSQKL-----------
+SECY_SULAC/74-443 tssttpyq-p------dLIGLIATVGL-TILIVYLVNTNIYIPVTTQRL-----------
+A2BME2_HYPBU/73-444 --------Gm-----pdMVGFLATIAI-IMVLIYFQLMRVYIPVTSPRY-----------
+SECY_AERPE/73-434 -------nGf-----pdLTGFFTTLAA-IILLVYLQAMRVEIPITSERF-----------
+A1RWR3_THEPD/75-456 ------psGy-----pdLVGFVGMVVM-LLLLTYMESMKITIPVSSVRF-----------
+SC61A_SCHPO/76-459 sgltssqiQl-----pnLWNFFATLLV-FGVVIYLQDFRVEIPIRSQKF-----------
+A7E5Q2_SCLS1/76-459 -------qSl-----pnIMNLLATIVV-FAAVIYLQGFRVEIPVKSSRQ-----------
+Q5KC69_CRYNE/75-459 -------dRl-----pnIMNLLATVAV-FAAVIYLQGFRIEIPIKSSKM-----------
+SC61A_ASHGO/75-460 -------dYl-----pnMFQVLSTVFV-FLFVLYLQGFRYELPVRSTRT-----------
+Q59MJ6_CANAL/76-459 -------pNl-----pnMFQLLATLLV-FFAVVYLQGFRIELPMKSTRQ-----------
+A7SJW4_NEMVE/75-458 -------qNl-----pnLTNLIATIFV-FGIVIYFQGFRVDLPIKSARY-----------
+A0CFY2_PARTE/73-456 -------eSa-----pnLNNLLATLFV-ISLVIYLQGFRVEVPLASQKI-----------
+Q22MG2_TETTH/151-538 -------sHl-----pnLASLISTALI-FIVVVYFQGFKVDIALKNDRV-----------
+A0CU87_PARTE/77-460 -------dSl-----pnLTNLLATVLV-FLIVIYFQGFKVDIPIKNNKV-----------
+Q7RLN0_PLAYO/121-506 -------tHa-----pnVTNLLATILV-FLIVIYLQGFRVDLSVKYQTV-----------
+Q4QGX4_LEIMA/77-467 -------pQl-----pnLTNIFSTAVV-FAVVVFFQGFRVPLMTKSKFN-----------
+A5JEK2_NOSBO/75-457 -------qNl-----pnMFSLVSTVVL-FAFVIYLQGLRVELKTESTQV-----------
+A2DH65_TRIVA/75-462 -------pQl-----pnLCQLFSTVIV-FGACVYFDQIKINIGLETTVN-----------
+Q2QM98_ORYSJ/88-448 -------lDl-----pnLSNYMTTCVM-FVLAVRLDETHLRRLYRSRPR-----------
+Q6AV46_ORYSJ/86-471 gg---gggSl-----pdLRGLAATCAV-FLAAVYLQGVRVALPVRPRNA-----------
+Q6C854_YARLI/70-454 --------N--------LLQLYMSVAV-FMLTIYLNTFRVDIPIKSSRV-----------
+SSH1_YEAST/78-465 -------dYl-----pnLTTTIIVLAI-AIIVCYLQSVRVELPIRSTRA-----------
+Q6BT20_DEBHA/78-475 --------SftrsqlpnLSQFYIVLVT-VLVLIGVQNYRIELPIRSTKV-----------
+A5DE75_PICGU/20-414 -------eHl-----pnLTQVYITIVT-LLVVVALQNFRIELPIRSTRA-----------
+A3GFV9_PICST/78-476 --------Lp------nFTSFYITVAT-TLAVVYLQNLRIELPIRSTRA-----------
+A5DWJ5_LODEL/34-436 -------vQl-----pnLTQFYITLAT-ILAVVLLQNFRTEISIRSTKV-----------
+Q5A2C9_CANAL/5-404 -------iQl-----pnLTQFYISLAS-ILIVVALQNFRIELPIRSTKV-----------
+Q74L41_LACJO/64-372 --------L--------AALAIFILLL-IKFWLAFTKAYYPLKVVNPSL-----------
+B3XPQ8_LACRE/65-377 --------L--------FLAAIAGCIV-LVFWVSFNRAYYPLKMINTSM-----------
+A1C3L4_STRPA/70-403 --------Li-----qyGLVFFVALSIlIWFNILLYKGEYRIPIQRVGL-----------
+Q3DVD6_STRAG/65-395 --------I--------ILFLLWTLVA-MYLMITFERSEYRIPVMRTSI-----------
+A5LN99_STRPN/64-389 --------I--------VLLALLTLVF-SYLLALMYRARYLVPVNKIGL-----------
+A3CM55_STRSV/64-391 --------L--------ALMLVFSLVF-LYLAVTVERSKYRIPVNKINI-----------
+Q03HZ8_PEDPA/65-396 --------Tp-----klWLVLIISVAVvVIFTIFINKAELRIPLQRPFV-----------
+A5IW80_STAA9/64-384 -----------------IALLIILVIItLFILLFIELVEVRIPYIDLMN-----------
+Q4L9N9_STAHJ/61-383 -----------------LILVIVTLVIaLLILLFIELSEYRLNYKDIMN-----------
+Q5HKR3_STAEQ/61-380 -----------------ITMIIVLLVLaLFILFFIELTEYRIEYNDIMN-----------
+Q9RSK8_DEIRA/68-413 --------I--------LAFIAVILVT-IAGIVYIYQAERRVPVTYARArggAAGq----
+Q5SHQ8_THET8/71-413 --------F--------LFFLAFIVLA-FAGMAAVQQAERRIPVQYARK---VVGr----
+SECY_CORGL/73-424 --------F--------AVVLASVLIL-VIGVVFVEQGQRRIPVQYAKR---MVGr----
+A8LB12_FRASN/74-414 --------F--------GLVILLGLAI-VVFVVFVEQSQRRIPVQYAKR---LIGr----
+Q83NQ1_TROW8/73-424 --------F--------STVVITSLVV-MVGVVFVEQSQRRVPVQYAKR---VVGr----
+Q8G3Z9_BIFLO/74-421 --------F--------GIVVGVLVVI-LIFVDFVELCQRRVPVQYTRR---MIGr----
+A7B9M4_9ACTO/72-414 --------V--------AAIVALLLLV-AIAVVYVEQAQRRIPVQYAKR---MIGr----
+SECY_CHLTR/73-433 --------L--------LILCAVFVFV-LMATVLIIEGMRKIPVQHARR---IIGr----
+Q1AU49_RUBXD/70-408 --------M--------VILGIIAVMI-VAAIVFVNEGQRRIPITYAKR---QVGr----
+Q8RIH6_FUSNN/75-411 --------L--------LVLVAFLGTVtIAGIVLFQLGQRKIPIHYVGK---GFSs----
+A6DRC9_9BACT/79-428 --------I--------LVVVGILFIV-TAATVALVQGMRKIPLKYARD---ASSr----
+C0ACZ0_9BACT/94-454 --------L--------TFMVILFFAV-TMGIIMVVQGQRKIPVQYAKR---VVGn----
+Q1Q157_9BACT/75-434 --------L--------LILLGMFFAI-VGGVVYITQGQRRIPIQQAKH---TRGr----
+A6CGP8_9PLAN/77-435 --------L--------LILALVFVFV-VVWVIAITQGQRRIPIQSAKH---VRGr----
+B4S5A8_PROA2/73-417 --------E--------FIILALMVLI-VAAVVVLTVGTRRIPVQHAKR---VVGr----
+Q2S3P5_SALRD/75-414 --------L--------LVEIGVWVLV-AGAVVLVSQGMRRIPVQYAKR---VVGk----
+A1ZGT4_9SPHI/72-404 --------L--------ILEMVVLFFV-VMSVVMLTEATRRIPIQYAKQ---VVGn----
+A6EHP4_9SPHI/71-408 --------L--------VLEIVALFAV-VMFTIMIVQGVRKVPVQYAKR---IVGn----
+Q11QD2_CYTH3/72-411 --------L--------LIEFAALFAV-IMLVVLVQQATRRIPIQYTKQ---IAGg----
+Q1VTY0_9FLAO/73-421 --------I--------LIELVIWFVI-ILAAVMLVRAVRQIPVQYARK--nASGk----
+Q1NYZ7_9FLAO/72-422 --------L--------LFELFIWLLI-IGISIIIINFVKKIHIQYVNKfylKNYs----
+A5KHP6_CAMJE/62-402 --------A--------FAIFALILIT-IGVIIYVELGERRIPISYSRK---VVMq----
+A4EA78_9ACTN/52-389 --------M--------VIICAIILLV-IPLIVFLERGQRRIPVSYAKR---VVGr----
+Q2GEC0_NEOSM/73-411 --------I--------FVSLSLLVFV-VFLVVLVERASKNIPVHYPRR------rt--w
+Q3YRM8_EHRCJ/72-412 --------I--------LLMVLIFFAL-LLLIIFVEKSYRKILVQYPKR---QVKn----
+Q5GSW3_WOLTR/77-416 --------I--------LFVFVLFFLL-LLLIIFVESSYRKVTVQYPKK---QFK-----
+Q0ANS0_MARMM/83-421 --------V--------VGGVLILVG--LLLVVFVERSQRRLLVQYPKR---QQGn----
+A7IPQ0_XANP2/80-418 --------I--------LAALVLAVVV-IAFIVFMERAQRRLLIQYPKR---QVGn----
+SECY_RICCN/70-411 --------I--------AIAVCIGVVVlIAIIIFFERAQRKLLVQYPKR---QVGn----
+Q2G8W0_NOVAD/80-430 --------I--------FGIVIMLIAL-VIGICFLERATRRLLIQYPKR---ATQr----
+A6E0Q6_9RHOB/73-411 --------I--------VGVMLMVVAV-IAFVVFMERSLRKIHIQYPRR---QVGm----
+Q1UZE8_9RICK/67-404 --------I--------IGIFVLLVAT-IMFIVFMERALRKILINYPKR---QMGn----
+Q3R245_XYLFA/76-424 --------L--------LIIVFIVLSF-TFFVVFVERGLRRIAVNYARR---VEGr----
+A4NK90_HAEIN/76-416 --------L--------LLIAAIVFAV-TYFVVFVERGQRRIRVEYAKR---QQGr----
+Q057C4_BUCCC/64-407 --------V--------FFLLLIIFFV-IFIVVFIEKSQRKIIVCYARR---QQGr----
+Q8D1Z2_WIGBR/82-424 --------V--------LISIILVFVI-TYFVVFIERGQRRVIVNYAMR---QKGr----
+Q6F7T2_ACIAD/83-426 --------I--------VVFALLSLAV-LAAIVFIEKAQRRIPVNYAQK---QQGr----
+Q6Q8W8_9GAMM/67-407 --------L--------IGIGLLSMAV-IAVVVFIERGQRRITVNYAQR---QQGr----
+A9BRX1_DELAS/74-413 --------A--------IFIVLVVAAV-TYFVVFVERGQRKILVNYARR---QVGn----
+Q7DDS8_NEIMB/73-410 --------A--------LFIVFGALLL-IYLVVYFESAQRKIPIHYAKR---QFNg----
+Q5NHU8_FRATT/74-416 --------V--------WVLLILLLLV-IAFVVFMESAQRKITVNYAKR---QQGr----
+Q7WZR8_9GAMM/64-388 --------I--------FKVVSLVLIT-IILVVVIESGQIRIKVSYPRR---LIGk----
+A5EX98_DICNV/69-412 --------F--------FLLLGIIVSL-FALIVYVERAQRRIKIHYAKR-----------
+Q6MJ32_BDEBA/70-415 --------V--------LLLVAFMVAI-IAAVIYMEVAQRRITVQYSQR---QGGg----
+B5EFS0_GEOBB/71-411 --------L--------LLIAAVMFAV-IAAVVFMERGQRRIPIHYAKR---VVGl----
+A3EVQ1_9BACT/75-412 --------I--------LALVVMVFLI-VSSIVFIETARRKIPIQYAKR---LVGn----
+Q1MPP6_LAWIP/71-412 --------A--------LVLMLFMFAV-LTGVVFMERAQRRIPIQYAKR---QLGr----
+SECY_AQUAE/71-412 --------L--------LLIIALIIAI-IVGIVYVQEAERRIPIQYPGR---QVGr----
+Q01WB2_SOLUE/74-438 --------L--------IVLMALMVAV-VAFIVLVERGERRIPVQYAKR---VVGr----
+Q08ZH8_STIAU/26-370 --------L--------VGLAVFMLFI-IAVVVYVERGMRRIPVQYAKR---MAGr----
+A6GCG0_9DELT/70-411 --------L--------AMLLVVVLVV-IAFVVIMERGQRRIPVIYAKR---VVGk----
+Q04PV8_LEPBJ/72-436 --------V--------LILLILLILL-ISLTVLLTQGVRKVPLQYGKQ---MVGr----
+SECY_BORBU/72-409 --------V--------ILIISIFILV-VILIIYEYKAQMRIAIHYARA-----------
+Q73PL2_TREDE/73-413 --------V--------IIAFAMFVGI-IALVVYEQQGQRKIPVHYAKR---VIGr----
+Q67JW3_SYMTH/69-405 --------P--------LLVAVVALLM-VVFVVIINEAVRKIPVEYAKR---VVGr----
+A7FQ38_CLOB1/69-409 --------V--------IVFIVIALAL-FLLVVIMNLGERRIPVQYAGR---AVGn----
+A6LPT1_CLOB8/69-416 --------I--------VLFGVFTVFL-LATILYFSLSERRIPVQYAGK--fASGn----
+Q0SQG4_CLOPS/69-409 --------I--------ALFIFFTLAL-LAGVIYLSLAERRITVQYAGK---AVGn----
+A9KJH4_CLOPH/71-425 --------A--------IIIVAVILLS-VVLIILLNAAQRKIAVQYAKK---VQGr----
+A7VH89_9CLOT/71-420 --------A--------LLVVAIVVCV-TILVCMLQGAERKIPVQYAKK---VQGr----
+A6BIS2_9FIRM/71-421 --------V--------CVIIAIILAL-VVFTVILQDGERRIAVQYSQK---IVGr----
+A7VR33_9CLOT/71-423 --------V--------PLFVIIFLAI-IWVIVFMNDAERRIPVQYAKR---VVGr----
+A6NXF0_9BACE/71-437 --------I--------PLIIIGILAL-VVFIVFINDSERRIPVQYAKR---VVGr----
+Q250L2_DESHY/70-413 --------V--------FGLIVIGLGI-IAGVVFIQEGQRRIQVQYAKR---VVGr----
+Q8R7X3_THETN/69-402 --------A--------IAFVVAELIM-IVLIILATEGQRRIPVQYAKR---VVGr----
+A4XLR1_CALS8/69-419 --------V--------LLFLVMALAI-IVFIIVIQEGERRIPVQYAKR---IVGr----
+A3DJJ2_CLOTH/71-411 --------V--------LGVLLLFVVI-IASVVWVDQAERRIPVQYAKR---VVGr----
+A8MLG0_ALKOO/69-408 --------I--------ILFIVIAIAM-IVAVVAIEAGTRKIPVQYAKR---VVGr----
+Q18CH6_CLOD6/69-406 --------I--------VILAVVILLT-VTGVTFIQEATRKIPVQYAKR---VVGr----
+B8D0S8_HALOH/72-406 --------I--------LFFLVLAVVI-IAGVIFIQQGERRIPVQYSKR---VVGr----
+
+A9B431_HERA2/73-422 --NKvyGGQ--SSH-LPLKVNMAGMIPLIFAQSI--LIFPS---TVASYF-----WNPNG
+A8CRX1_9CHLR/78-422 gKMYrrGG---ESH-IPLRVNSAGMIPLIFASAL--VMLPG---LVASYFmagstEDP--
+A2Y4E5_ORYSI/132-498 aRSEssPVTEVEPY-IPFNINPTGMQPLLTTSYL--LAFPS---IMASIF-----GTQFW
+Q7UZW2_PROMP/80-422 ---NssLLPTRQSY-LPLKLNAGGVMPIIFASAL--IFLPI---TVANVT-----GNPIL
+Q7NKT4_GLOVI/79-416 -PRRqqYQQQQTSY-LPLRVNQGGVMPIIFASSL--LYLPL---TFAQFA-----RN---
+SECY_GUITH/68-404 --LGkgQMDNKTSY-LPLKLNQSGVMPIIFASAV--LVLPA---YLAQLV-----SNEQL
+SECY_CYACA/62-394 --LDstSFYSNDYF-LPLRINQGGVMPIILASSL--LALVD---YVIRYG-----LST--
+Q85FU6_CYAME/42-325 ----liQSIAQVYL-LPMRLNQGGVMPIIFASST--LALLH-------------------
+A0T0J6_PHATR/72-407 --SSlqDSVTSNNY-IPLRFNQAGVMPIILTTTI--LVVPN---YVNNLG----------
+SECY_CYAPA/109-459 ePITeaERRKTQAY-IFFQLLPAGIMPVIFASTIfdLALPA----FTNFL-----LQQG-
+Q4G351_EMIHU/63-407 -AQTqsERLANNSF-IPLKLNQGGIMPLVFSSTI--AVVFM---YPAQIL----------
+SECY_PAVLU/66-404 -LIDgvEDDMRRSY-IPIRFGQAGVVPIIFSSSI--LLFLT---TSIKQL-----PNA--
+Q6B8X0_GRATL/62-395 --LSkfTTSNPRSY-IPLKLNQGGVMPIVFASAT--MALPI---YFSNNI-----EV---
+SECY_ANTSP/62-390 --LGkiNELNHKVI-FLLKLNQGGVMPFVFASAV--VHTFL---FISNNT-----NS---
+A4RW47_OSTLU/65-398 ---FnaGGLAKSSY-LPFKVNSAGVMPIIFASSL--LALPA---TLTRFT-----DNGAV
+A7PFA4_VITVI/131-465 -YTNksGGLQKSTY-LPFKVNSSGVMPIIFSTSS--LALPG---TVSRFT-----GLAAL
+A7HM32_FERNB/75-404 -RIY--GGT--STY-LPIKVNHSGVIPIIFAWAI--ISIPE---AIAQIT-----GA---
+A3CK84_STRSV/69-416 -----aKGAPSSSY-LPLKVNPAGVIPVIFASSI--TAAPA---AIFQVV-----SALGY
+Q5FM71_LACAC/68-415 ------SGS--ESF-LPLKVNVSGVIPVIFASSF--IITPA---TILMAF-----QRTQG
+Q03ZM6_LEUMM/68-416 ------YGS--EAY-LPLKVNVSGVIPVIFASSF--ISTPQ---TVMLAF-----QDKYS
+SECY_STAA8/69-413 --QTaqRLGSQATY-LPLKVNSAGVIPVIFAMAF--FLLPR---TLTLFY-----PDK--
+Q4MG72_BACCE/68-415 nQ----YQGAKNTH-LPLKVNSAGVIPVIFASAF--LMTPR---TIAQLF-----PDSSI
+Q6F1X5_MESFL/92-454 ------DSKDHTPY-LPLKLNNAGVIPVIFASAL--ISTPI---TIAQIIdptasTSTVD
+Q6KI36_MYCMO/87-436 ------KNEKELSY-LPIKINPGGISPIIFALII--ISFPQ---LFASVF-----PISNP
+Q4A5I3_MYCS5/83-437 ------KALKEIGS-LPIKLNPAGIMPIIFAMLV--LSLPT---LIANIL-----PNDNY
+Q98Q01_MYCPU/90-438 ------KNIKEMGS-LPIKVNPAGIMPVIFSMIV--ISFPL---LIAGLL-----DRSTS
+Q4AAF9_MYCHJ/85-434 ------KNIKEISI-LPLKLNPAGIMPVIFALII--VSLPT---LFSGFL-----DRNTS
+Q9PQP1_UREPA/76-434 ------LDHEKLPF-LPIKIMTAGVMPVIFASSV--LAIPA---QVAEFL-----DKQ--
+SECY_MYCGE/81-430 ------SEVKTLPY-LPIKVNAAGVIPVIFASSI--MSIPV---TIAQFQ-----PQT--
+Q8EUD2_MYCPE/81-433 ------KEVDEMPY-LPIKLNAAGVIPVIFASSI--MTIAP---TISQFL-----PSG--
+Q7X4E3_9MOLU/69-399 -----rNNDKIDKY-IPIKLNTSGILPIILADTL--LNVIQ---QISMLF-----SKNG-
+Q5Q069_ASTYP/59-398 -------QSQGKSY-IPLKINSAGVMPVILAFAL--LQPFQ---ILAGVI-----GN---
+O21257_RECAM/57-372 eNDNynYLNYFQKY-QTSSLNLLGILPFILVYSIiyMLKLNlnsFLDLVF----------
+Q74NB9_NANEQ/69-457 --------PEKSLR-YEVRLIYTGNIPVIFAFAF--LHQIL---LIAWVL-----QQLGI
+Q2EMT2_METVO/30-379 --------KGAVGK-YPIKFIYVSNLPVILAAAL--FANFQ---LWGLVL-----YKIGF
+A5UL65_METS3/72-433 --RGhgRIRGSVGK-YPLKFVYASNMPVILTSAL--LVNVS---LLASVF-----QKIGF
+SECY_METTH/73-436 ----krLSRGAVGK-YPLRFIYASNMPVILTSAL--LLNVQ---LLANVF-----QKLGY
+SECY_PYRAB/72-448 ---------TIRGR-YPIRFLYVSNIPIILTFAL--YANIQ---LWARVL-----DRLGH
+Q8TZA9_METKA/75-435 --------RGARGR-FPVRLLYTSNIPVILASAL--FMNVR---LWALAF-----QRMGV
+Q9HIT0_THEAC/82-514 --------RGARGR-YPLQLLYASNIPVILATAL--LANVS---MWTLLF-----WSSPV
+Q2QAQ7_9EURY/161-583 --------RGHRGQ-YPIRLVYASNIPVILMAAL--LANLN---MFTLLF-----WSHPT
+Q0W1W5_UNCMA/75-487 --------RGARGK-FPVKLIYASVLPMILVRSL--QATLE---MVGLLL-----YRNGI
+SECY_ARCFU/73-471 --------RGARGR-FPIKLIYASVLPMIFVRAL--QANVV---ALGQVL-----HARGV
+Q8TRS4_METAC/72-470 --------RGARGR-FPVKLIYASVLPMILVRAL--QANIQ---MVGIIL-----ASRGI
+A0B9U7_METTP/75-515 --------RGARGR-FPVKLVYASVLPMILVRAL--QANIE---MLGALL-----TAKLG
+SECY_HALMA/73-468 --------KGARGR-FPVKLIYASVLPMILVRAL--QANIQ---FLGRIL-----NAQLG
+Q2FSG8_METHJ/73-458 --------RGARAR-FPVKLIYASVLPMILVRVL--QANVQ---MIGLFL-----NNIGI
+A2SPM5_METLZ/73-458 --------RGARSR-FPVKLVYASVLPMILVRVL--QANVQ---MIGMFL-----SSIGF
+A0RUE4_CENSY/79-457 --------RGFSAT-YPIKLMYVSNIPVILASAL--TANAI---FIGQMF-----WSNFN
+A8ME75_CALMQ/77-461 --------GGYKMS-YPFKVMYVSVLPIIFTAYT--VALIYnglYFIWTTynphnANALL
+A3MUZ2_PYRCJ/70-435 --------RGIKFT-IPLRFVYVSVLPIIFTTYS--LLLVG-------------------
+SECY_SULSO/73-449 --------RGIRRT-IPLNFLYVSSIPVIFVAVL--GSDIQ---LFASLA----------
+SECY_SULAC/74-443 --------RGIRTT-VPLNFLYVSSIPVIFVSVL--GADIQ---LFASLA----------
+A2BME2_HYPBU/73-444 --------GSIKTR-IPLNFIYVTNIPILFVAIA--VSDIK---VFEIVI-----ASLLG
+SECY_AERPE/73-434 --------KGIRSR-VPLQFIYVTNIPILLVGIL--VSDLL---LVQRLL-----ADYLG
+A1RWR3_THEPD/75-456 --------GGAKTR-IPLKFLYVSVMPVILVGAL--YANVV---MFTQAL-----WPRVN
+SC61A_SCHPO/76-459 --------RGYRST-FPVKLLYTSNTPIMLQSAL--TSNLF---FASRLL-----FNRFS
+A7E5Q2_SCLS1/76-459 --------RGARGS-YPVRLFYTSNMPIMLQSAL--SSNIF---LISQML-----YSRFS
+Q5KC69_CRYNE/75-459 --------RGQRGT-YPVKLFYTSNMPIMLQSAL--TSNVF---LVSQML-----AGRFP
+SC61A_ASHGO/75-460 --------RGQVGS-YPIKLFYTSNTPIMLQSAL--TSNIF---LTSQLL-----YQKFP
+Q59MJ6_CANAL/76-459 --------RGPYGS-YPIRLFYTSNIPIMLESAL--ASNIF---IISQLL-----FMRWP
+A7SJW4_NEMVE/75-458 --------RGQYSS-YPIKLFYTSNIPIILQSAL--VSNIY---VISQMM-----SAKFA
+A0CFY2_PARTE/73-456 --------RGLVSS-HGIKLFYTSNIPMIIQSTL--VQNVY---FLSQLL-----YRRFK
+Q22MG2_TETTH/151-538 --------RGAIQS-YPIKLFYTSNMPIILQSAL--ISNLY---FFSQIL-----YRNFN
+A0CU87_PARTE/77-460 --------RGGLTS-YPIKLFYTSNIPIILQTAL--VSNLY---FLSQIL-----YRNFK
+Q7RLN0_PLAYO/121-506 --------RGQQGT-YPIKLFYTSNIPIILQTAL--VSNLY---FFSQIL-----YKRFS
+Q4QGX4_LEIMA/77-467 --------GNDRQP-YMIKLFYTSNMPIILQTSV--VSNIS---FFSQIL-----SRRFG
+A5JEK2_NOSBO/75-457 --------RGQTGM-YPVKLLYSSTMPIIVQSYV--ISHIC---TISRFL-----YKRFP
+A2DH65_TRIVA/75-462 --------RARPEP-FEIKLFYCSNTPPIIQSTI--LSQLA---GFSRTI-----YFHWP
+Q2QM98_ORYSJ/88-448 --------RGTDEF-VPIKLLYTSAMPIMLHASA--VSAFC---V---------------
+Q6AV46_ORYSJ/86-471 -------PRSHRGGaYSVRLLYTSGMPVVLLSSA--VSSLY---VVSQAL-----YRRFG
+Q6C854_YARLI/70-454 --------RSLATA-FPVKLLYTGSMCLFLLSAF--SQNVL---IYSQSL-----YVQFP
+SSH1_YEAST/78-465 --------RGTNNV-YPIKLLYTGCLSVLFSYTI--LFYIH---IFAFVL-----IQLVA
+Q6BT20_DEBHA/78-475 --------RGMNNV-YPIRLFYTGALPILFAFTV--LTNLQ---VFGYFT-----STLLN
+A5DE75_PICGU/20-414 --------RGMNNV-FPIRLLYTGALPLAFAYTV--LTNLQ---VLGYIA-----SQLLE
+A3GFV9_PICST/78-476 --------RGMNNV-FPIRLLYTGALPVLFAYTV--IANIQ---YFGYLA-----YVVLQ
+A5DWJ5_LODEL/34-436 --------RGMNQM-FPIRLLYTGGLPVLFAYTV--IANLQ---VFGFIF-----EAALV
+Q5A2C9_CANAL/5-404 --------RGMNNV-FPIRLLYTGGLPVLFAFTV--VANIQ---VVGYLI-----HSVLS
+Q74L41_LACJO/64-372 ------PASSNLMT-VPLGLNMAAMMMYMVGMAI--LTLPL---MVGRYF-----SSSSL
+B3XPQ8_LACRE/65-377 ------SSHDRPII-LPIGLNMGAMMTYMVGMSL--LMVPT---LLANVL-----GPGSL
+A1C3L4_STRPA/70-403 -----nTPYHASSY-LPIRVTPAGAMPFMYGMTL--MMLPPyifVVLLHI----------
+Q3DVD6_STRAG/65-395 -----hNRLVDDAY-MPIKVNASGGMAFMYVYTL--LMFPQyiiILLRSI-----FPTN-
+A5LN99_STRPN/64-389 -----hNRFKRYSY-LEIMLNPAGGMPYMYVMSF--LSVPAylfILLGFI-----FPNH-
+A3CM55_STRSV/64-391 -----hNRFKKYSY-LDIRLNPAGGMPIMYAMTL--VSIPQyflLIIHFL-----QPEN-
+Q03HZ8_PEDPA/65-396 ------QNDFSESY-LPIRVLAAGSMPFMFTTTV--FMIPS---YIGSFV-----PEG--
+A5IW80_STAA9/64-384 -----vSATNMKSY-LSWKVNPAGSITLMMSISA--FVFLK---SGIHFI----------
+Q4L9N9_STAHJ/61-383 -----nSTNKTPTY-LAWKLNPAGSISIMISLSV--YVLLN---NMINLI----------
+Q5HKR3_STAEQ/61-380 -----iSAKDIPSY-LSWKLNPAGSISIMVSLSL--FMLTN---NIVNFI----------
+Q9RSK8_DEIRA/68-413 -ARG--AGQ--ATW-LPIKVNQAGVIPVIFASAM--LIIPN---LIASAT-----ATRA-
+Q5SHQ8_THET8/71-413 -RVY--GGQ--ATY-IPIKLNAAGVIPIIFAAAI--LQIPI---FLAAPF-----QDN--
+SECY_CORGL/73-424 -RQY--GGS--STY-LPLKVNQAGVIPVIFASSL--IYMPV---LITQIV-----NSGSL
+A8LB12_FRASN/74-414 -RMY--GGT--STY-LPIKVNQAGIIPVIFASSL--LQLPQ---LVGQVW-----SNQTF
+Q83NQ1_TROW8/73-424 -RIL--GGG--STY-LPIKLNMAGVVPVIFASAI--LRVPS---IIAQFS-----QPAPG
+Q8G3Z9_BIFLO/74-421 -KMY--GGS--STY-LPLKINMSGVIPPIFASSI--LAIPT---LIAQFG-----KSDQ-
+A7B9M4_9ACTO/72-414 -RQY--GGT--TTY-IPLKINMSGVIPVIFASSI--LALPP---MAAQFG-----SPND-
+SECY_CHLTR/73-433 rEVV--GG---GSY-LPLKVNYAGVIPVIFASSL--LMFPA---TIGQFL-----SSES-
+Q1AU49_RUBXD/70-408 -RMS--QGG--TTY-LPLKVNMAGVIPIIFASSL--LIFPV---VITQFA-----AGGDQ
+Q8RIH6_FUSNN/75-411 -K----GGIGEKSF-IPLRLNTAGVMPVIFASVF--MLIPG---VIVNAL-----PSTL-
+A6DRC9_9BACT/79-428 -NAM--IEK--TSY-LPLKVNHAGVMPIIFASAL--MMFPP---MIINKI-----GG---
+C0ACZ0_9BACT/94-454 -KVM--GGQ--NSF-LPLKVNYSGVMPVIFASAI--LLFPQ---QIFRYL-----GAAFN
+Q1Q157_9BACT/75-434 -RVY--GGQ--RHF-LPLRVNQAGVMPIIFAQSL--LIFPA---AIMQGI-----QIRFE
+A6CGP8_9PLAN/77-435 -RVS--GGQ--RQS-LPLRVNQAGVMPIIFASSL--LMFPY---FLFHGL-----SQYF-
+B4S5A8_PROA2/73-417 -KMY--GGS--TQY-IPMRVNTAGVMPIIFAQSI--MFLPN---TFLSFF-----PES--
+Q2S3P5_SALRD/75-414 -KVQ--GGT--TQY-LPLRVNAAGVMPIIFAQSI--MFIPS---TIASFF-----PNN--
+A1ZGT4_9SPHI/72-404 -RVY--GGQ--RQY-LPLKVNAAGVMPIIFAQAL--MFVPA---LITPYV-----GG---
+A6EHP4_9SPHI/71-408 -RQF--GGV--RQY-IPLKVNAAGVMPIIFAQAL--MFIPA---TLTQFF----------
+Q11QD2_CYTH3/72-411 -KQV--IGQ--RQY-LPLKLIAAGVMPIIFAQSV--MFLPA---IIGSSF-----PDS--
+Q1VTY0_9FLAO/73-421 fEKAsvGGA--RQF-IPLRLNASGVMPIIFAQAI--MFIPA---AVAGLS-----DS---
+Q1NYZ7_9FLAO/72-422 sNEIylRNE--MKF-LPLKVVYPGVMPIIFSQGI--LLIFI---TIFNKI----------
+A5KHP6_CAMJE/62-402 -NQN--KRI--MNY-IPIKLNLSGVIPPIFASAI--LMFPT---TILQTS-----TN---
+A4EA78_9ACTN/52-389 -RMM--GGQ--TTY-LPIKVNTAGVVPIIFASAL--LYFPA---QIAVFF-----PGIG-
+Q2GEC0_NEOSM/73-411 gSTH--GDA--ASN-IPVKINVSGVIPPIFANAL--ILFPL---TLANFS-----AE---
+Q3YRM8_EHRCJ/72-412 -KLY--GSS--STY-IPLKINISGVIPPIFANAL--LLSPI---TVANFH-----QGS--
+Q5GSW3_WOLTR/77-416 -RLH--SDD--FTY-IPLKINLSGVIPTIFANAI--LLTPV---SIANFY-----KGH--
+Q0ANS0_MARMM/83-421 -RMV--GGD--TSF-LPLKLNTAGVIPPIFASSL--LLLPA---TAASFQ-----AQSGP
+A7IPQ0_XANP2/80-418 -RIY--EGQ--SSH-LPLKLNTSGVIPPIFASSL--LLIPT---TIASFL-----QGSGP
+SECY_RICCN/70-411 -KIY--GGE--ATH-MPLKLNTSGVIPPIFASSI--LLFPA---TLANF------SNSNS
+Q2G8W0_NOVAD/80-430 -GMM--AAD--RSH-LPLKINTAGVIPPIFASSL--LLLPL---TITQFA-----GNSIS
+A6E0Q6_9RHOB/73-411 -KIY--DGG--SSH-LPVKVNPAGVIPAIFASSL--LLLPA---TITTFS-----GNTTN
+Q1UZE8_9RICK/67-404 -KMY--GGE--SSH-LPLKINQAGVIPAIFASAL--LLLPV---TFSNFS-----FSDND
+Q3R245_XYLFA/76-424 -NSY--MNK--SSF-LPLKLNMAGVIPPIFASSI--LAFPV---TLSIWS-----GQASS
+A4NK90_HAEIN/76-416 -QIL--GGH--STH-LPLKVNMANVMPAIFASSI--ILFPA---TLTQWF-----GQNDK
+Q057C4_BUCCC/64-407 -RMY--TAH--HSY-LPLKLNMAGVIPVIFSSSL--IVFPS---ILLTYL----------
+Q8D1Z2_WIGBR/82-424 -KIY--AAQ--ITH-LPLKVNMSGVIPAIFASSL--ILFPA---TIASWF-----GEGIG
+Q6F7T2_ACIAD/83-426 -RIF--TAQ--QTH-LPLKINMAGVIPAIFASSL--LLFPA---SLGQWL-----GSADP
+Q6Q8W8_9GAMM/67-407 -RMM--QAQ--QSH-LPFKVNMAGVIPAIFASTF--LLFPA---SLSTWF-----GENES
+A9BRX1_DELAS/74-413 -KVY--GGQ--SSH-LPLKLNMAGVIPPIFASSI--ILLPA---TVVNWF-----SAGES
+Q7DDS8_NEIMB/73-410 -RA---GSQ--NTH-MPFKLNMAGVIPPIFASSI--ILFPS---TLLGWF-----GSADT
+Q5NHU8_FRATT/74-416 -KMF--AAQ--TSH-LPLKLNMAGVIPAIFASSI--LMVPG---VLLGWL-----SNYNS
+Q7WZR8_9GAMM/64-388 -KLY--ATQ--SSY-LPLKLNMAGVIPAIFASSS--LIITA---SVG-------------
+A5EX98_DICNV/69-412 -QQFgtSAMGERFY-LPLKINMAGVIPAIFASAI--ITLLVsglTLASSL-----PGAAG
+Q6MJ32_BDEBA/70-415 -GMQ--SMQTPTSH-LPIKLNISGVIPPIFASSL--LMFPA---TMAQFV-----NT---
+B5EFS0_GEOBB/71-411 -KTV--GAQ--SSH-LPLKVNMAGVIPPIFASSI--IMFPA---TVGNFI-----DV---
+A3EVQ1_9BACT/75-412 -KMM--GGQ--STH-IPFKINTAGVIPPIFASSL--ISFPA---IIAGFV-----SV---
+Q1MPP6_LAWIP/71-412 -KVY--GGQ--STH-LPLRVNTAGVIPPIFASSL--LLFPA---TMASFD-----IS---
+SECY_AQUAE/71-412 -QLY--AGR--KTY-LPIKINPAGVIPIIFAQAL--LLIPS---TLLNFV-----QN---
+Q01WB2_SOLUE/74-438 -RVM--GGQ--STH-MPLKVNAGGVIPVIFASSI--LAFPQ---TLAQFG-----WVKNL
+Q08ZH8_STIAU/26-370 -RMF--AGQ--ATY-FPMKVNTSGVIPPIFAGAL--LSFPA---TLGTWF----------
+A6GCG0_9DELT/70-411 -RMF--GGS--QNY-LPLRINNAGVIPPIFASSI--IMFPA---QIAGMT-----GN---
+Q04PV8_LEPBJ/72-436 -KMV--QAK--SQS-IPFKVNGANVMPIIFASSL--ILFPQ---TIIQWL-----SSSSE
+SECY_BORBU/72-409 -NSN--NTV--SSY-LPIKLNPSGVLPVIFASVL--ITLPL---QILSGF-----AETS-
+Q73PL2_TREDE/73-413 -KMY--GGQ--NTY-IPFKINPSGVIPIIFASSF--LTFPL---MLSQMW-----GSNVS
+Q67JW3_SYMTH/69-405 -RVV--GGQ--RTH-LPIRINQAGVIPLIFASSL--MYFPI---TIAGFF-----PNS--
+A7FQ38_CLOB1/69-409 -KIY--KGQ--STH-IPINVNSSAVIGIIFAISV--MQFPI---TIGQFW-----PESAF
+A6LPT1_CLOB8/69-416 sNMV--KSQ--STH-IPLSIIGSAVLAIIFSMSV--MDFPK---TIATLFggvgeSQKEW
+Q0SQG4_CLOPS/69-409 -KMM--KGQ--STH-IPLSIIGTTVIAIIFAMSV--MSFPT---TIAQFF-----PEAGW
+A9KJH4_CLOPH/71-425 -KMV--GGQ--SSH-IPLKVNTAGVIPVIFAVSI--MQFPI---IIASFF-----GVQPA
+A7VH89_9CLOT/71-420 -KQM--GGQ--SSN-IPLKVNTAGVIPVIFASSL--MAIPS---IITSLF-----GK-SP
+A6BIS2_9FIRM/71-421 -RSY--GGQ--STN-IPLKVNTAGVIPIIFSSSL--MQFPI---VIASFL-----GKDNG
+A7VR33_9CLOT/71-423 -KMY--GGQ--STH-LPIKVNMSGVMPIIFASSI--LTIPS---TIQLFV-----TPT--
+A6NXF0_9BACE/71-437 -KMY--GGQ--SSH-IPLKVNMSGVMPIIFAQAI--ASLPA---TIAAFI-----P----
+Q250L2_DESHY/70-413 -RVY--GGQ--SSH-IPMKVNQAGVIPIIFAISL--LAFPS---TIATWM-----DPAS-
+Q8R7X3_THETN/69-402 -RVY--GGQ--STH-IPIRINMAGVIPIIFAISL--LQFPQ---QLATFF-----PHS--
+A4XLR1_CALS8/69-419 -RVY--GGQ--STH-IPIKVNIAGVIPIIFAISL--VMLPT---TIAQFF-----PNS--
+A3DJJ2_CLOTH/71-411 -KMY--GGQ--STH-IPIKVNMAGVLPIIFATSF--VALPA---TIVGFF----fPNSTH
+A8MLG0_ALKOO/69-408 -KMY--GGQ--SSH-IPLKVNQSGVMPVIFAMSL--LQFPH---TIAYFI-----GSEG-
+Q18CH6_CLOD6/69-406 -KMY--GGQ--SSH-IPMKVNQSGVMPIIFASSL--LAFPQ---TIAMFM-----GPNAQ
+B8D0S8_HALOH/72-406 -KVY--GGR--STH-IPMRINQAGVIPVIFAQAV--LQFPT---VIAAVL-----PY---
+
+A9B431_HERA2/73-422 sg-------------------------ffN---------------GVANFFVNSF-----
+A8CRX1_9CHLR/78-422 ---------------------------------------------NFWNTIYNIFnsgas
+A2Y4E5_ORYSI/132-498 -----------------------------E---------------SLKETLNPKTs--vg
+Q7UZW2_PROMP/80-422 -----------------------------I---------------KIAGSLNPGS-----
+Q7NKT4_GLOVI/79-416 -----------------------------A---------------TVDQVVNAI------
+SECY_GUITH/68-404 -----------------------------R---------------TVLHLFDGTS-----
+SECY_CYACA/62-394 -----------------------------L---------------QAVYFINDIL-----
+Q85FU6_CYAME/42-325 ------------------------------------------------------------
+A0T0J6_PHATR/72-407 -----------------------------L---------------LPKIDLPINF-----
+SECY_CYAPA/109-459 -----------------------------N---------------WGYQ-LIKSF-----
+Q4G351_EMIHU/63-407 --------------------------------------------------LSSALltnaa
+SECY_PAVLU/66-404 -----------------------------N---------------IATRVILDSV-----
+Q6B8X0_GRATL/62-395 -----------------------------P---------------NINNVINLFL-----
+SECY_ANTSP/62-390 ---------------------------------------------KITQFINLFL-----
+A4RW47_OSTLU/65-398 -----------------------------L---------------GVARFLSP-------
+A7PFA4_VITVI/131-465 -----------------------------K---------------KAALALN--------
+A7HM32_FERNB/75-404 -----------------------------Q---------------WAIKLFS--------
+A3CK84_STRSV/69-416 d---------------------------aD---------------WVKTAQSLLA-----
+Q5FM71_LACAC/68-415 d---------------------------qQ---------------WFKV-LNQIF-----
+Q03ZM6_LEUMM/68-416 s---------------------------aQ---------------WYQI-MQQIF-----
+SECY_STAA8/69-413 -----------------------------E---------------WAQNIANAAN-----
+Q4MG72_BACCE/68-415 s----------------------------K---------------WLVANLD--------
+Q6F1X5_MESFL/92-454 s---------------------------aN---------------AFVRFTQHYL-----
+Q6KI36_MYCMO/87-436 f---------------------------rI---------------WVESNLR--------
+Q4A5I3_MYCS5/83-437 s---------------------------kQ---------------WINENLQ--------
+Q98Q01_MYCPU/90-438 lv--------------------------rL---------------WIERHLA--------
+Q4AAF9_MYCHJ/85-434 av--------------------------rN---------------WIDNNMQ--------
+Q9PQP1_UREPA/76-434 -----------------------------S---------------MGYYVIHNYF-----
+SECY_MYCGE/81-430 -----------------------------E---------------SRWF-VEDYL-----
+Q8EUD2_MYCPE/81-433 -----------------------------S---------------AGSEFINEYL-----
+Q7X4E3_9MOLU/69-399 ---------------------------------------------KVNEYIGIFVe--sr
+Q5Q069_ASTYP/59-398 -----------------------------D---------------KLTKYVNLFTntnss
+O21257_RECAM/57-372 ------------------------------------------------------------
+Q74NB9_NANEQ/69-457 pllg---------------------tienG---------------HPINGLVAYIypdtg
+Q2EMT2_METVO/30-379 pllg---------------------tysnG---------------RAIDGIAYYFs---t
+A5UL65_METS3/72-433 pilg---------------------eivnG---------------KAVSGIALYLs---t
+SECY_METTH/73-436 pilg---------------------tvsnG---------------QAVDGLAYLLt---a
+SECY_PYRAB/72-448 pwlg---------------------tfdpT-t------------gNPVGGFVLYVi---p
+Q8TZA9_METKA/75-435 pilg---------------------kldpR--------------gQPISGLVYYLs---p
+Q9HIT0_THEAC/82-514 lskvpilgh-----------npllgsyptT-aqata---lnisatTPTGGLAYYLf---s
+Q2QAQ7_9EURY/161-583 mstvpilgsqga-----wsiapylgsydvG-q------------tQATDGFAWYAs---m
+Q0W1W5_UNCMA/75-487 tflgt--------------------fnqyN---------------QPVDGLMFYIn---p
+SECY_ARCFU/73-471 tifg---------------------efvnG---------------KAVSGLMFFLq---p
+Q8TRS4_METAC/72-470 tflg---------------------efsgS---------------KPLNGIMYYLa---p
+A0B9U7_METTP/75-515 tvttaettaegvrivytgyqswlgtflssAkfdaatgapisatspQPVSGLMYYLs---p
+SECY_HALMA/73-468 smpafl------------------gtyanG---------------QPTGGLFYFLa---p
+Q2FSG8_METHJ/73-458 tifg---------------------tfegQ---------------TPTGGLMWYLa---p
+A2SPM5_METLZ/73-458 talg---------------------eyngS---------------TPINGLMWYLa---p
+A0RUE4_CENSY/79-457 prndnifl-------------nvlaqfdlT-n-----------psTPIGGIVYYIt---p
+A8ME75_CALMQ/77-461 nsiacir---------------vittakfG-ti----------nePCPSSLIYYFt---v
+A3MUZ2_PYRCJ/70-435 qllq---------------------pfaaN-n------------pALITVLNVIFl---p
+SECY_SULSO/73-449 syvs---------------------psasN--------------iLNTVSGVFFFpppns
+SECY_SULAC/74-443 nsis---------------------nsasG--------------iLTDIANAFFFp--pq
+A2BME2_HYPBU/73-444 adn------------------------plV---------------RGMDVLYNYVs---p
+SECY_AERPE/73-434 ves------------------------raY---------------QIYSSIVYYLs---p
+A1RWR3_THEPD/75-456 pgnqnpwl-------------nviakynyT-ey---------gpvPLPGSFVYYIs---p
+SC61A_SCHPO/76-459 snflvr-----------------flgvweQ---------------TATSGLSYYLs---p
+A7E5Q2_SCLS1/76-459 enllvql----------------fgvwepK-egs--------aqlFATSGIAYYMs---p
+Q5KC69_CRYNE/75-459 dnllvrl----------------lgvwepM-enn-------ptqlGAVSGIAYYMs---a
+SC61A_ASHGO/75-460 nnpivkm----------------lgvwgtR-sdap------yspnAAISGLSYYIq---p
+Q59MJ6_CANAL/76-459 nnlfvkl----------------lgtwdaR-ags--------sqlYANGGLAYYIq---p
+A7SJW4_NEMVE/75-458 gnffvnl----------------lgtweeA-ggg-------parsYPVGGLCYYMs---p
+A0CFY2_PARTE/73-456 tnffvkl----------------lgtwqeA-efg--------gqsVPIGGLAYYMs---p
+Q22MG2_TETTH/151-538 gnfivgl----------------lgkwsiP-eag-------gshmVPVGGLVYYLs---p
+A0CU87_PARTE/77-460 gnflirl----------------lgyyqeL-en---------gqtVPIGGLVYYVs---p
+Q7RLN0_PLAYO/121-506 nsilvni----------------lgqwqeI-esn--------gtaVPIGGIAYYIs---p
+Q4QGX4_LEIMA/77-467 nrnflin---------------llgrweeR-gyngg----gsgqlFPVGGLAYYLv---p
+A5JEK2_NOSBO/75-457 tyflvra----------------lgvwssE-gs---------skyQPIKGLCYYIl---p
+A2DH65_TRIVA/75-462 eslatqi----------------fgvwrsH-ngms------ydysTPVSGLIYYLt---a
+Q2QM98_ORYSJ/88-448 dag-----------------------ggaA---------------YPVGGLVYYVt---p
+Q6AV46_ORYSJ/86-471 gsllvd-----------------llgkwtP-d-----------aaVPVGGIAYYVt---a
+Q6C854_YARLI/70-454 dnlmvqv----------------lgswgaDg--------------SPVGGIAYYI-----
+SSH1_YEAST/78-465 knepthii--------------ckimghyE-nan--------nllAVPTFPLSLLa---p
+Q6BT20_DEBHA/78-475 nysqlaasii---------gtwsldtksfNl--------------NLTSGILYFL-----
+A5DE75_PICGU/20-414 syspvass--------------vigkwtiD-yrs--------snlKVSSGILYFLs---p
+A3GFV9_PICST/78-476 kanvssfalsi-------iasfnldsysnRl--------------NLTSGALYFF-----
+A5DWJ5_LODEL/34-436 kltaspivs------------tlfanyvvE-pys--------nrlVIKSGVLYFFt---a
+Q5A2C9_CANAL/5-404 klgtspivi------------siignyvyN-pss--------nelDLNSGILNYFt---s
+Q74L41_LACJO/64-372 ------------------------------------------------------------
+B3XPQ8_LACRE/65-377 ------------------------------------------------------------
+A1C3L4_STRPA/70-403 ---------------------------------------------FPGNQILEYLsvhig
+Q3DVD6_STRAG/65-395 -----------------------------P---------------DITSYNDYFS-----
+A5LN99_STRPN/64-389 -----------------------------S---------------GLAALSKEFM-----
+A3CM55_STRSV/64-391 -----------------------------Q---------------LIEQWIEALS-----
+Q03HZ8_PEDPA/65-396 ---------------------------------------------EFNRFVQNYV----a
+A5IW80_STAA9/64-384 -------------------------------l------------sMFNKSISDDMpm-lt
+Q4L9N9_STAHJ/61-383 -------------------------------a------------tLLGSNANFEFl---s
+Q5HKR3_STAEQ/61-380 -------------------------------g-----------rfIVNHNFETHVf---n
+Q9RSK8_DEIRA/68-413 -----------------------------P---------------EVNAWINSNL-----
+Q5SHQ8_THET8/71-413 ---------------------------------------------PVLQGIANFF-----
+SECY_CORGL/73-424 ev-------------------------sdN---------------WWQRNIIAHL-----
+A8LB12_FRASN/74-414 q----------------------------D---------------FEQRYLSR-------
+Q83NQ1_TROW8/73-424 qp-------------------------paA---------------WVVW-INENF-----
+Q8G3Z9_BIFLO/74-421 -----------------------------S---------------WVKW-INANL-----
+A7B9M4_9ACTO/72-414 -----------------------------K---------------WVQW-ISAHF-----
+SECY_CHLTR/73-433 -----------------------------S---------------WLKR-IATML-----
+Q1AU49_RUBXD/70-408 s----------------------------S---------------WLFR-LAQIF-----
+Q8RIH6_FUSNN/75-411 ---------------------------------------------SIKTTLSIIF-----
+A6DRC9_9BACT/79-428 -----------------------------D---------------FART-VAPYF-----
+C0ACZ0_9BACT/94-454 l----------------------------P---------------FLIE-FSNNL-----
+Q1Q157_9BACT/75-434 pgs------------------------vgY---------------WITSRLSGIL-----
+A6CGP8_9PLAN/77-435 st-------------------------saF---------------W--AMLDEAF-----
+B4S5A8_PROA2/73-417 ---------------------------------------------EVMQNVATIF-----
+Q2S3P5_SALRD/75-414 ---------------------------------------------ATMQRVGGWF-----
+A1ZGT4_9SPHI/72-404 --------------------------------------------------ASSAF-----
+A6EHP4_9SPHI/71-408 -----------------------------P---------------SLQNTWLVQF-----
+Q11QD2_CYTH3/72-411 -----------------------------E---------------FATT-IGSTM-----
+Q1VTY0_9FLAO/73-421 ---------------------------------------------EMAQGITAAF-----
+Q1NYZ7_9FLAO/72-422 -----------------------------N---------------NLQL-----------
+A5KHP6_CAMJE/62-402 -----------------------------P---------------YLQA-INDFL-----
+A4EA78_9ACTN/52-389 ---------------------------------------------WIQA-VASAL-----
+Q2GEC0_NEOSM/73-411 -----------------------------S---------------HLGEFIIRYF-----
+Q3YRM8_EHRCJ/72-412 -----------------------------P---------------WSDF-ILMYF-----
+Q5GSW3_WOLTR/77-416 -----------------------------A---------------FSDF-ILNYF-----
+Q0ANS0_MARMM/83-421 -----------------------------G---------------WLQS-AVAIL-----
+A7IPQ0_XANP2/80-418 -----------------------------E---------------WLQT-ITTHI-----
+SECY_RICCN/70-411 -----------------------------E---------------TMGM-LTYYL-----
+Q2G8W0_NOVAD/80-430 pdt-----------------------kmgQ---------------AIVT-LNQYL-----
+A6E0Q6_9RHOB/73-411 -----------------------------P---------------VLST-VMAYF-----
+Q1UZE8_9RICK/67-404 -----------------------------T---------------FLN--LSSYF-----
+Q3R245_XYLFA/76-424 ntl------------------------fgA---------------WLQR-VSSAL-----
+A4NK90_HAEIN/76-416 f----------------------------E---------------WLNN-LSMLL-----
+Q057C4_BUCCC/64-407 -----------------------------R---------------YVFNDYKKIIyffdf
+Q8D1Z2_WIGBR/82-424 v----------------------------K---------------WMSK-IPYYL-----
+Q6F7T2_ACIAD/83-426 nag-----------------------ivkR---------------SLQD-LALVL-----
+Q6Q8W8_9GAMM/67-407 l----------------------------S---------------FLQS-FSLAL-----
+A9BRX1_DELAS/74-413 m----------------------------R---------------WLKD-IASTL-----
+Q7DDS8_NEIMB/73-410 n----------------------------S---------------VLHK-IAGLL-----
+Q5NHU8_FRATT/74-416 l----------------------------S---------------WLAD-VAEML-----
+Q7WZR8_9GAMM/64-388 -----------------------------Q---------------WINRSILPQL-----
+A5EX98_DICNV/69-412 -----------------------------R---------------YLSDLAAGFH-----
+Q6MJ32_BDEBA/70-415 -----------------------------P---------------WLKA-LQDSL-----
+B5EFS0_GEOBB/71-411 -----------------------------P---------------WVQA-ASKQL-----
+A3EVQ1_9BACT/75-412 -----------------------------P---------------WIQS-FGKSL-----
+Q1MPP6_LAWIP/71-412 -----------------------------D---------------WLKD-IAVWF-----
+SECY_AQUAE/71-412 -----------------------------P---------------FIKV-IADMF-----
+Q01WB2_SOLUE/74-438 -----------------------------P---------------WLSK-TLATI-----
+Q08ZH8_STIAU/26-370 -----------------------------P---------------FLQT-FRQGL-----
+A6GCG0_9DELT/70-411 -----------------------------P---------------YLQR-FAAAF-----
+Q04PV8_LEPBJ/72-436 -----------------------------Q---------------WAGWAIIMDFfn-pf
+SECY_BORBU/72-409 -----------------------------S---------------IARQ-ILSYL-----
+Q73PL2_TREDE/73-413 ---------------------------------------------WLAS-VARFL-----
+Q67JW3_SYMTH/69-405 -----------------------------D---------------FAVF-VGRYL-----
+A7FQ38_CLOB1/69-409 y----------------------------K---------------FITLNQYSPF-----
+A6LPT1_CLOB8/69-416 a----------------------------K---------------WVLNNPTSIF-----
+Q0SQG4_CLOPS/69-409 s----------------------------Q---------------WITGSSYSPF-----
+A9KJH4_CLOPH/71-425 ray------------------------fwP---------------KVLHMLNSQSwfnik
+A7VH89_9CLOT/71-420 sgv------------------------gaK---------------ILQG-MSQSYwf-na
+A6BIS2_9FIRM/71-421 sgi------------------------gsE---------------ILRG-LNQSNwcnpe
+A7VR33_9CLOT/71-423 -----------------------------G---------------FWKT-VLDAL-----
+A6NXF0_9BACE/71-437 -----------------------------G---------------GMDSTFMKVF-----
+Q250L2_DESHY/70-413 -----------------------------A---------------YVRF-VNTWF----v
+Q8R7X3_THETN/69-402 -----------------------------S---------------FYNF-VQKWL-----
+A4XLR1_CALS8/69-419 -----------------------------G---------------FYKF-VKAYF-----
+A3DJJ2_CLOTH/71-411 -----------------------------P--------------------VAEYF-----
+A8MLG0_ALKOO/69-408 -----------------------------G---------------FAKF-LNTWL-----
+Q18CH6_CLOD6/69-406 -----------------------------A---------------FVQKYLSMAT-----
+B8D0S8_HALOH/72-406 -----------------------------G---------------WAQD-IATAL-----
+
+A9B431_HERA2/73-422 ---------------------------------GPNGLAF-TLAMFVLVLLFTYFYA-LV
+A8CRX1_9CHLR/78-422 m---------------------------------PGGLVY-WGLYFFMTIIFAFFYT-MV
+A2Y4E5_ORYSI/132-498 ----------------------------------GGPWAY-YLTYAFLVFVFNIF---DI
+Q7UZW2_PROMP/80-422 ----------------------------------SNPWPY-ALTFFALILGFSYFYA-SL
+Q7NKT4_GLOVI/79-416 ----------------------------------SSGWIH-NILYLVLILFFSFFYA-TL
+SECY_GUITH/68-404 ----------------------------------NNKLLY-LLFYFTLILFFSYFYT-SL
+SECY_CYACA/62-394 ----------------------------------PFKILF-LLLYSAFIIFFNYLYC-SL
+Q85FU6_CYAME/42-325 ----------------------------------TWSIWW---LYVACIIFFSHFYN-LV
+A0T0J6_PHATR/72-407 ---------------------------------ESLNFVY-WIGYFVLILVFSSFYS-TI
+SECY_CYAPA/109-459 ---------------------------------PFNSLFK-DFCYLITIMLFSSNYAlTI
+Q4G351_EMIHU/63-407 gl------------------------------aSKLLTIYsFGINFVLVIFFSCFYV-SL
+SECY_PAVLU/66-404 ---------------------------------NLQQIFY-FFTFLVLIIFFSFFYT-LI
+Q6B8X0_GRATL/62-395 ----------------------------------PGRILY-FPAYGSLIIAFSYFYT-SL
+SECY_ANTSP/62-390 ----------------------------------PNQFLY-LPLYLIFIITFSYVYT-SL
+A4RW47_OSTLU/65-398 ----------------------------------GGGAGY-VPVNVAMICFFNYFYT-FL
+A7PFA4_VITVI/131-465 ----------------------------------PGGSLY-LPTNILLIAFFNYYYT-FL
+A7HM32_FERNB/75-404 ----------------------------------MQSPLM-MIIYALLIFFFTYFYS-VV
+A3CK84_STRSV/69-416 ----------------------------------TTTISG-MFMYAFLIVLFTFFYT-FV
+Q5FM71_LACAC/68-415 ---------------------------------SLQTTPG-VIIYTLLIILFTFFYA-FV
+Q03ZM6_LEUMM/68-416 ---------------------------------SMTTLPG-AILYTALIVVFTYFYA-FV
+SECY_STAA8/69-413 ----------------------------------PSSNVG-MVVYIVLIILFTYFYA-FV
+Q4MG72_BACCE/68-415 ----------------------------------FAHPIG-MTLYVGLIVAFTYFYA-FI
+Q6F1X5_MESFL/92-454 ---------------------------------SFNTWWG-IGIFAVMIVLFTFLYA-QV
+Q6KI36_MYCMO/87-436 ----------------------------------PNNTIG-FILFISITFIFAIFFG-LQ
+Q4A5I3_MYCS5/83-437 ----------------------------------FYKPLG-FSLLIIITFVFSLLMG-IQ
+Q98Q01_MYCPU/90-438 ----------------------------------FTHPIG-FSLLIIITFIFSIFMG-LQ
+Q4AAF9_MYCHJ/85-434 ----------------------------------IYHPIG-LIIFIVFNVSFSIIMS-LQ
+Q9PQP1_UREPA/76-434 ---------------------------------IVDSWTG-LAIYVVLILLFTFFFS-YV
+SECY_MYCGE/81-430 ---------------------------------SLSTPVG-IFLYAVLVILFSFFYS-YI
+Q8EUD2_MYCPE/81-433 ---------------------------------SIERPVG-LVIYTVLIVLFGFFYS-HI
+Q7X4E3_9MOLU/69-399 ----------------------------------SELGIY-FFVYILLIMLFSFFSS-FM
+Q5Q069_ASTYP/59-398 n---------------------------------NQINFFaIGFLVLLVIVLSFFSA-FM
+O21257_RECAM/57-372 -----------------------------------------NIFLEMLCMMFIYLFL---
+Q74NB9_NANEQ/69-457 flislilg-------------------nltldnLIRTITS-SLFFLGSSILFSIYFVlAT
+Q2EMT2_METVO/30-379 -pygls----------------------svisdPIHAIVY-TLFLIGFCVLFGLFWVeTS
+A5UL65_METS3/72-433 -pndvs----------------------llvtdPVRVIVY-AFFFLLCAVLFSYLWVeIS
+SECY_METTH/73-436 -prsid----------------------alildPFRVVFY-AVVFIGLCVLFAWLWVeIS
+SECY_PYRAB/72-448 -prsif----------------------tvidnPVRALVY-LILTVISSLIFGFLWVeLT
+Q8TZA9_METKA/75-435 -pnsiv----------------------ktlsdPLQALGY-MMAMVIASVFFAVLWVeLT
+Q9HIT0_THEAC/82-514 -pnglsdwlfpilqps---gyqnillghtplqeAIHIIVF-TAFMVGFSVLFAIFWIeTT
+Q2QAQ7_9EURY/161-583 -vngvgdwllplln------qspdpyghslwqvVLHVITY-VTVMTLGSMMFAKFWIeTT
+Q0W1W5_UNCMA/75-487 -inglsdwvpqla--------alnypgiqlwqiALHVFTD-AFILIAGGILFAIFWVeTT
+SECY_ARCFU/73-471 -vsspydwipslvks-----qgaafaaipdwmiYLHLLID-ALILVVGGIIFAWFWVeTS
+Q8TRS4_METAC/72-470 -ihspydwipslvres---fasygatapaiwqiGLHVLAD-AIMLIGGGIIFALFWIeTT
+A0B9U7_METTP/75-515 -ihgpsdwipsmvsqstpglvelginpiagwqiWLHLLTD-TAFLIIGGIIFAIFWIeTT
+SECY_HALMA/73-468 -iqsrgdwmwwl-----------egtaqpvwqiLTRVGID-LFVMLVGGAVFAVFWVeTT
+Q2FSG8_METHJ/73-458 -inhpsdwmwwmp---------syvgghapwevLIRLGID-TTIMVVGGAIFALFWVkTA
+A2SPM5_METLZ/73-458 -inqpqdwmwwls--------sftgtghavwevILRVGID-CTVMILGGALFAIFWVkTA
+A0RUE4_CENSY/79-457 -prgld----------------------iaaldPMRAVGY-VLFMIGIVVVFGKLWVeLG
+A8ME75_CALMQ/77-461 -vpy--------------------------nitPQYVVVH-ILMYVVLSVVFAYLWVnLA
+A3MUZ2_PYRCJ/70-435 -hry---------------------------fdPLLIILN-FALYVALAIAFAWIWVqLA
+SECY_SULSO/73-449 aiphsiy---------------------avvldPLGALEY-AVVFIVLSILFGILWVdVA
+SECY_SULAC/74-443 gvphsvy---------------------alvvdPVGAAIY-AAVFIVLSIVFGMLWIdVA
+A2BME2_HYPBU/73-444 -prgll----------------------aavadPLRTLTF-ALAWLALGLLFGFIWVeIA
+SECY_AERPE/73-434 -prgvv----------------------qsiadPVKTAVF-IASWTVLSIVFGYMWVeIA
+A1RWR3_THEPD/75-456 -prsla----------------------saladPVHLVVY-SLLYIGFAVLFGVAWIlTS
+SC61A_SCHPO/76-459 -pasfq----------------------dalidPIHTLVY-VFFTMFACALFSKLWIeVS
+A7E5Q2_SCLS1/76-459 -plnft----------------------dalldPIHTAVY-ITYMLVACAIFSKTWIeVS
+Q5KC69_CRYNE/75-459 -phslt----------------------salkdPFHTVIY-IAFIVTACALFSKTWIeVS
+SC61A_ASHGO/75-460 -pfsft----------------------ealldPIKTVVY-VTFVLGACAMFSRTWIdVS
+Q59MJ6_CANAL/76-459 -pfnft----------------------dalldPIKTTIY-IAFVLGSCAVFSTTWIeIS
+A7SJW4_NEMVE/75-458 -petvs----------------------hiiedPVHACIY-IFFMLGSCAFFSKTWIdVS
+A0CFY2_PARTE/73-456 -lrdvk----------------------diindPIHAVVY-VLFVVFMCGFFAKFWIqIS
+Q22MG2_TETTH/151-538 -phgmi----------------------evisdPLHTILY-VVFILTTCALFSKTWIqVS
+A0CU87_PARTE/77-460 -prsis----------------------eaifdPIHTILY-TAFILGTCAVFSKTWIdVS
+Q7RLN0_PLAYO/121-506 -pnsfa----------------------ditndPFHTLIY-ISFVLVSCAFFSKTWIeVS
+Q4QGX4_LEIMA/77-467 -patfy----------------------dlladPIHAIFY-VVFVLTSCAVFSRLWItIS
+A5JEK2_NOSBO/75-457 -pesif----------------------dfklrPFYFLFY-VLFTIISCSMLSRAWVeVS
+A2DH65_TRIVA/75-462 -pqsiq----------------------qtihdPLHTIIY-LIFSLSSAGFISYYYLrFS
+Q2QM98_ORYSJ/88-448 -pskll----------------------vdpglIHELLIH-SVFVVASCTLLSMAWAeAS
+Q6AV46_ORYSJ/86-471 -pasaa----------------------saaanPLHAAMY-VAFVLAACAALSRAWVvVS
+Q6C854_YARLI/70-454 spnnf-------------------------gydVIKMVLY-SVYTIVGCTLFSKYWAeIS
+SSH1_YEAST/78-465 -ptsffk---------------------gvtqqPLTFITY-SAFILVTGIWFADKWQaIS
+Q6BT20_DEBHA/78-475 tpsksla---------------------qsllsPIRSVTY-GLAIITLSTWFAYRWSrIS
+A5DE75_PICGU/20-414 -ptsil----------------------ntlvsPLKTAAF-TFVVIVLSAWFANIWSsIS
+A3GFV9_PICST/78-476 ssspsll---------------------stilsPIRTVVY-SATVIVLATWFAEKWSyIS
+A5DWJ5_LODEL/34-436 -sqtll----------------------qsiisPLRVVIY-SSTVVGLATWFAYKWSyIA
+Q5A2C9_CANAL/5-404 -ssslv----------------------esiisPIKTTVY-SITIIVLAVWFANKWSyIS
+Q74L41_LACJO/64-372 ----------------------------------INNWVFqASFSAVMGILIFYFFT-FV
+B3XPQ8_LACRE/65-377 ----------------------------------FANPYFnMVVSGILAFVLFYFFT-FV
+A1C3L4_STRPA/70-403 ----------------------------------LSQLPG-VICYIFLLYFLSIGFA-YY
+Q3DVD6_STRAG/65-395 ----------------------------------LSSIQG-VVIYMILMLVLSVAFT-FV
+A5LN99_STRPN/64-389 ----------------------------------IGKPLW-VYVYISVLFLFSIIFA-FV
+A3CM55_STRSV/64-391 ----------------------------------MGSPAW-FILYLLTIFILALAFA-FI
+Q03HZ8_PEDPA/65-396 ----------------------------------FDNPVG-ILIYCSIIVFLGYVFS-FM
+A5IW80_STAA9/64-384 ----------------------------------FDSPVG-ISVYLVIQMLLGYFLS-RF
+Q4L9N9_STAHJ/61-383 ----------------------------------FANPIG-IMFYIVLQIVLSYLLS-RF
+Q5HKR3_STAEQ/61-380 ----------------------------------FTNPVG-ITIYLLLQMILGYFLS-RL
+Q9RSK8_DEIRA/68-413 ---------------------------------TFGQPLY-LALESLLIFGFTYLYN-SV
+Q5SHQ8_THET8/71-413 ---------------------------------NPTRPSG-LFIEVLLVILFTYVYT-AV
+SECY_CORGL/73-424 -q-------------------------------TPSSWQY-IVLYFALTIFFSYFYV-SV
+A8LB12_FRASN/74-414 ----------------------------------GDHPLY-LVAYGALIIFFTYFYV-AI
+Q83NQ1_TROW8/73-424 -t-------------------------------TGNSPFY-IALYFFMIVGFTYFYV-AV
+Q8G3Z9_BIFLO/74-421 -a-------------------------------NTTSVWY-IALYALMIVFFCFFYT-SI
+A7B9M4_9ACTO/72-414 ---------------------------------TQGSSFY-LTIYALMTLFFTFFYT-AI
+SECY_CHLTR/73-433 ---------------------------------SPGSVAY-SIFYVLLIIFFTYFWT-AT
+Q1AU49_RUBXD/70-408 ---------------------------------APPSAPY-LILYALLIVMFTYFYT-AV
+Q8RIH6_FUSNN/75-411 ---------------------------------GQNHPVY-MILYALVIMFFSFFYT-AL
+A6DRC9_9BACT/79-428 ---------------------------------DFGSTSY-LIIQGVMILVFTFFWV-AT
+C0ACZ0_9BACT/94-454 ---------------------------------MRGHWVY-YVTMTLLILFFSYFWV-SV
+Q1Q157_9BACT/75-434 ---------------------------------Q-EGVLY-VMLYILLITFFCYFWT-AI
+A6CGP8_9PLAN/77-435 -q------------------------------pMSRGFVY-TMSYVVLIYFFCYFWT-AI
+B4S5A8_PROA2/73-417 ---------------------------------SYDSWWY-ALMFGTMIVFFTYFYT-AI
+Q2S3P5_SALRD/75-414 -s-------------------------------DISSMSY-SAVFFVVVVFFTYFYT-AI
+A1ZGT4_9SPHI/72-404 -s-------------------------------DITTWQY-NLVFGLLIIIFTYFYT-AI
+A6EHP4_9SPHI/71-408 -s-------------------------------DYTSLAY-SLTFAFLIIAFTFFYT-AI
+Q11QD2_CYTH3/72-411 -s-------------------------------DFTSWQY-NVAFATMIILFTYFYT-AI
+Q1VTY0_9FLAO/73-421 -q-------------------------------NMFGFWY-SLVFGILIIVFTYFYT-AI
+Q1NYZ7_9FLAO/72-422 ---------------------------------SNNGIWY-NILYSILIIIITFFYT-FL
+A5KHP6_CAMJE/62-402 ---------------------------------NPNGYLF-HVLTFLFVIFFAYFYA-SI
+A4EA78_9ACTN/52-389 ----------------------------------STGWLN-WVLNVVLIVFFAYFYT-SM
+Q2GEC0_NEOSM/73-411 ---------------------------------SVGQPLY-FLLHSCLLVFFCFFYS-DF
+Q3YRM8_EHRCJ/72-412 ---------------------------------SSGKLLY-IVCYALLIIFFAFFYT-AF
+Q5GSW3_WOLTR/77-416 ---------------------------------MANKVVY-IAAYLALIVFFNFFYT-NF
+Q0ANS0_MARMM/83-421 ---------------------------------GPGSPWF-MMAYAAMIIFFCFFYT-SV
+A7IPQ0_XANP2/80-418 ---------------------------------GHGRPAY-MVLYVLLIVFFCFFYT-AI
+SECY_RICCN/70-411 ---------------------------------GHGKPVY-ILLYVALIMFFSFFYT-AI
+Q2G8W0_NOVAD/80-430 ---------------------------------GHGKPLY-MLFYALGIIFFSFFYT-AV
+A6E0Q6_9RHOB/73-411 ---------------------------------GPGQPLY-LLFFTIMIVFFAYFYTfNV
+Q1UZE8_9RICK/67-404 ---------------------------------TQGQPLY-MLLYASGIIFFTFFYT-SI
+Q3R245_XYLFA/76-424 ---------------------------------GPGEPLH-MILFAVLIIGFAFFYT-AL
+A4NK90_HAEIN/76-416 ---------------------------------NPGQPLY-LLVYAVAIIFFSFFYT-AM
+Q057C4_BUCCC/64-407 l--------------------------------KFKHSIY-LIVNIILIIFFCFFYT-NI
+Q8D1Z2_WIGBR/82-424 ---------------------------------EPGTFSY-SILYASAIMFFCFFYT-SL
+Q6F7T2_ACIAD/83-426 ---------------------------------SPGQPLY-LMLFGTLIIFFCYFYT-AL
+Q6Q8W8_9GAMM/67-407 ---------------------------------NPGQPLY-ILVFAGLIISFCFIWL-AL
+A9BRX1_DELAS/74-413 ---------------------------------TPGQPIY-VMLYATAIIFFCFFYT-AL
+Q7DDS8_NEIMB/73-410 ---------------------------------QHGQLLY-MALFAATVIFFCYFYT-AL
+Q5NHU8_FRATT/74-416 ---------------------------------QPGSIVY-TVVFAATIIFFCFFYT-SL
+Q7WZR8_9GAMM/64-388 ---------------------------------SPGQPLY-IMFFVLSVIFYSFFYT-AI
+A5EX98_DICNV/69-412 ----------------------------------QGAWLY-IATFVLLIILFSFFYT-SI
+Q6MJ32_BDEBA/70-415 ---------------------------------NPSGAIF-NIMFVALIVFFSFFYT-EI
+B5EFS0_GEOBB/71-411 ---------------------------------APGKLLY-EVLFVAFIVFFCYFYT-AV
+A3EVQ1_9BACT/75-412 ---------------------------------SPGSFSY-TGLYVLLIVFFCFFYT-AV
+Q1MPP6_LAWIP/71-412 ---------------------------------SPSTILY-NCIFLVLIFFFCYFYT-AI
+SECY_AQUAE/71-412 ---------------------------------QPGAIFY-NFLYVTFIVFFTYFYT-AV
+Q01WB2_SOLUE/74-438 ---------------------------------QHGEPMY-YVLFVAGIIFFCFFYV-SI
+Q08ZH8_STIAU/26-370 ---------------------------------EGNPWLY-NGLFVLLVIFFAYFYT-AL
+A6GCG0_9DELT/70-411 ---------------------------------SYGNWLY-LTVYVALCIFFCYFYT-QI
+Q04PV8_LEPBJ/72-436 sq------------------------------iWYHALFY-YIIYTSLIIFFAYFYT-AI
+SECY_BORBU/72-409 ---------------------------------RPNGFYY-TFLNVILIIGFTYFYS-KI
+Q73PL2_TREDE/73-413 ---------------------------------RSDGWGY-NVLYVVLIIFFAYFYT-QV
+Q67JW3_SYMTH/69-405 ---------------------------------DTRSWWF-MLINALLIVFFTYFYT-AI
+A7FQ38_CLOB1/69-409 ---------------------------------RDKSIAY-IVLYFLLTVFFTWFYT-VV
+A6LPT1_CLOB8/69-416 ---------------------------------NNKSWMY-MVLYAVLTIFFNWFYT-QI
+Q0SQG4_CLOPS/69-409 ---------------------------------NAKTWMY-PVLYALLTIFFTWFYT-QI
+A9KJH4_CLOPH/71-425 ng-------------------------------EFKYTVG-VLIYMALIVFFAYFYT-SI
+A7VH89_9CLOT/71-420 -n-------------------------------YPWGFLG-LAVYILLVFFFAYFYT-AI
+A6BIS2_9FIRM/71-421 qi------------------------------kYSW---G-LVLYIVLTVFFAYFYT-SI
+A7VR33_9CLOT/71-423 ---------------------------------STTGWVY-ALIYFLLILMFAYFYV-AI
+A6NXF0_9BACE/71-437 ---------------------------------DSNGLVY-AIVYFLLILGFSYFYA-TM
+Q250L2_DESHY/70-413 mn------------------------------gSLTSIPY-LIVYAVLIIFFTYFYT-AV
+Q8R7X3_THETN/69-402 ---------------------------------STNGLIY-NLLDIFLIIGFTYFYT-AV
+A4XLR1_CALS8/69-419 ---------------------------------SSGSFWY-TFFYALFIIGFTYFYT-AI
+A3DJJ2_CLOTH/71-411 -r-------------------------------SFQSRIEvAILTGLLIIFFTFFYT-FI
+A8MLG0_ALKOO/69-408 -sp----------------------------tgMPGVFIY-NLLSAVLIIFFTYFYT-AI
+Q18CH6_CLOD6/69-406 ---------------------------------EQGFWTY-RSIEILLIIFFSYFYT-TV
+B8D0S8_HALOH/72-406 ---------------------------------EPGKPVH-LVLYAAMIFFFTYFWT-AF
+
+A9B431_HERA2/73-422 MFNQQNLPEMLQRNGGFIPGIRPG-RNTEVYLTKVLNRITLIGAV-GLAVVAALP--YFV
+A8CRX1_9CHLR/78-422 TFEQQDIPGTLQRQGGFVPGIRPG-KMTDQYLSGVIGRITWAGAL-FLGFVAIMP--FIA
+A2Y4E5_ORYSI/132-498 ANLPKEISDYLNKMSARVPKIKPG-RATVEYLTKIQTSTRFWGGI-LLSLLATSS--LLL
+Q7UZW2_PROMP/80-422 TINPVDVASNLKKGGVAIPGVRPG-SNTANYLSGIQNRLTLLGGL-FLGSVAIIP--AAV
+Q7NKT4_GLOVI/79-416 IINPEDVSKNLKRMGSSIPGVRPG-TATSEYIAKVMNRLTFLGAI-FLSAVAIIP--TFV
+SECY_GUITH/68-404 ILNPNDVSKNLKKMESSIYGVRPG-KATTEYLQKTLNRLTFLGAL-FLAFIAIVP--NII
+SECY_CYACA/62-394 VLNCFELSNNLKKASVVIPSIRPG-KMTEKFFKDTLDNLTLFGSG-FLAFIVLAP--NFL
+Q85FU6_CYAME/42-325 IANPKELSENLNKMAVVIPSIRPG-AETQQYLNRTLNRMSWIGGI-ALSLIALLP--WLF
+A0T0J6_PHATR/72-407 VLNPKDISDQLQKMAVTIPGIRPG-IQTTFYLKQVMKRITLLGTT-MLATLATIP--NFV
+SECY_CYAPA/109-459 MINPKTLAENLNSMNALIPGVRPG-SETKVYSEQLIHRLNFIGSF-VLALVCILP--SIV
+Q4G351_EMIHU/63-407 VLKPKDMSENLGKMAYSIPGIRQG-KETTKYLEKVINRLAFIGGL-FLAFLAFFP--LFV
+SECY_PAVLU/66-404 ILSPSDIAKNLKKMSSVIQDTKPG-VATKVYIRKFILQASFVGSI-LLSALILIP--SIL
+Q6B8X0_GRATL/62-395 VLNPDDIAENLNKMGASIPSIRPG-SDTIRYISKILDKMTFMGGV-FLFIIALIP--SLI
+SECY_ANTSP/62-390 ILNPEDIAKNLKKMGASIPNIRPG-SETIKYLNTRINRLTLIGAC-FLFTITLFP--TIT
+A4RW47_OSTLU/65-398 QLEPKDVADQLKRQGASIPGVRPG-AATRDYITRVLERLSVLGSV-FLGALALTP--GAV
+A7PFA4_VITVI/131-465 QLDPDDVSEQLKRQGASIPLVRPG-KSTAAFIKMVLSRISVLGSG-FLAILAAGP--SLV
+A7HM32_FERNB/75-404 VIDPKDISENIKRYGGFIPGIRAG-KPTEEYITFVLNRVTFLGAI-FLVGISLLP--YLV
+A3CK84_STRSV/69-416 QINPEKTAENLQKSGAYIPGVRPG-KGTEDYMSKLLRRLATVGSL-FLGFISILP--ILA
+Q5FM71_LACAC/68-415 QVNPEKLAENLQKQGAYIPSVWPG-KDTQNYISKMLIKLSTVGSI-FLGLVALLP--QLA
+Q03ZM6_LEUMM/68-416 QVNPDKLSENLQKQGAYIVGVRPG-AETKAFVSKLLLNLSFVGSI-FLGVVALVP--LIA
+SECY_STAA8/69-413 QVNPEKMADNLKKQGSYVPGIRPG-EQTKKYITKVLYRLTFVGSI-FLAVISILP--ILA
+Q4MG72_BACCE/68-415 QVNPEQMAENLKKQNGYVPGIRPG-KSTEQYVTKILYRLTFIGAI-FLGAISILP--LVF
+Q6F1X5_MESFL/92-454 QINPEKISENFQKSGTFIPGIKPG-KDTTNFLKGTINRLSLFGAI-FLAAIAALP--YVI
+Q6KI36_MYCMO/87-436 QSKVDKIAEDFAKNSTFIPGIKPG-QETETYLTGIVLRLCFFSAF-YLIIIGGMQfaQQL
+Q4A5I3_MYCS5/83-437 QSKVDKIAEDFAKNGTFIPKVTPG-EETQNYLVAIVFRLSFFSAF-YLVIIAGMQyvQIM
+Q98Q01_MYCPU/90-438 QSKIDKISEDFNKSGTFIPGLRPG-DQTENYLIDVVLRLSTFSAF-YLSILVSIQyiMQM
+Q4AAF9_MYCHJ/85-434 QSRVDKIAQDFAKNSTFIPGIRPG-EQTEDYLISVVLRLSVFSAI-YLTFLGILQpvEIM
+Q9PQP1_UREPA/76-434 QLNPPKMAEDIKKAGRFIPGVQVG-MDTEKHITKVIYRVNWIGAP-ILAFLACLP--HLV
+SECY_MYCGE/81-430 QINPERLAKNFEKSGRFIPGIRPG-NDTEKHIARVLIRINFIGAP-FLTVIAIIP--YIV
+Q8EUD2_MYCPE/81-433 QVNSEKLAENFQKSGKFIPGVKMG-EETQKYISKTLNRVNCIGVP-FLACLAIVP--YLI
+Q7X4E3_9MOLU/69-399 TINPKDVAEHLSKQNAYLKDVQPG-LPTVKKIVREMFKITFLGSC-FLTLLASTP--DII
+Q5Q069_ASTYP/59-398 NVNPEDISEHLSKQDAYIAGLRPG-EQTTRYLANTLFKITVLGTV-FITALVVTP--ILM
+O21257_RECAM/57-372 -------SRFLKKYLKFIYNINKN-NIYIEHINKNIYSIFFISHLyYLGILRDYClfCFL
+Q74NB9_NANEQ/69-457 GQDSEGLAKQLSKMFGRI-GLKRDyRIIKHYLDKIIPCVTVLGGF-IVGFLALLS--YWV
+Q2EMT2_METVO/30-379 GLDAKSMAQRLGGLNMAIKGFRKSnKSIENRLKRYIKPITVMGSA-FVGLLAALA--DFT
+A5UL65_METS3/72-433 GLNAKKISEQLYKSGIQIPGFRSSkRQLYKILKKYIPALTIISGL-YVGIIAFCA--DLT
+SECY_METTH/73-436 NIGPRHVARQLYQMGMQIPGFRSSrGQFEKILKRYIPTITILGGA-FVGLLAFVA--DLT
+SECY_PYRAB/72-448 GLDARTIARQLQRAGLQIPGFRRDpRTLERVLQKYIPYVTFWGSL-TVALIAVLA--DFL
+Q8TZA9_METKA/75-435 GMGPREIARHLHRAGLHIPGFRRDiRVLEKRLQKYIYPVTVMGGA-FVGFLAAGA--DLM
+Q9HIT0_THEAC/82-514 NMGASAVAKQIQASGMQIPGFRRDpRVMERVLKKYIPAITIFSGA-VVGLLAAGA--NLI
+Q2QAQ7_9EURY/161-583 NMGAKDVAKQIENTGMQIPGFRKNpKVLERILMRYIPPVTLFSGA-FVGLLAAGA--DLL
+Q0W1W5_UNCMA/75-487 GMGASRVARQIQKSGMQIPGFRRNeQVIEKVVSRYIPKVTVIGGA-FVGFLTLLS--SLF
+SECY_ARCFU/73-471 GMDARTVASQIAKSGMQVPGFRKSpQVLERVLSRYIPKVTILGGA-IIGILTLVA--NML
+Q8TRS4_METAC/72-470 GMGAKPTAQKIFNSGMQIPGFRRNiGSIEKVMQRYIPKVTVIGGA-FIGILTLVA--SLL
+A0B9U7_METTP/75-515 GMGAKSIAAKIHASGLQIPGYRRSpVSIERLMERYIPKVTVIGGA-IIGLLTVIA--SLL
+SECY_HALMA/73-468 DMGPEATAKQIHNSGMQIPGFRQNvGVIEKVLERYIPQVTVIGGA-LVGLLAVMA--NML
+Q2FSG8_METHJ/73-458 GLDSKAVARQIQLSGMSIPGYRRNpAVLEKVLDRYIPRVTVIGGV-FIGIMSVVA--NLF
+A2SPM5_METLZ/73-458 GLDSKHVARQIQNSGMQIPGYRRSpAVLERYLDRYIPRVTVIGGV-FIGLLSVMA--NML
+A0RUE4_CENSY/79-457 GLSPKSAAKNLLDADVQIPGFRRSnQPIEVLLNKYIPSVTIIGSM-ILGALAGAS--DVL
+A8ME75_CALMQ/77-461 GLSAEDQARTMVSSGLSIPGFRASaRSLAVHLKRYVNSLTFTSGL-LAGFIAALG--DVL
+A3MUZ2_PYRCJ/70-435 GLSAEDQARQFTQSQLHVPGFRQSeRVLAKILERPINALTIISGF-IAGTFASLG--NVL
+SECY_SULSO/73-449 GLDPATQAQQLVEAGIEIPGVRNNpKIIEGILARYIYPLAFFSSI-IVGLIAVFA--TLL
+SECY_SULAC/74-443 GLDPKTQAEQMIRSGIEIPGMRTNpRIIEGILSKYIYALGFFSSL-IVGLIAVVA--TFL
+A2BME2_HYPBU/73-444 GLSPRQQAENLIKSGMELPGIRKNvKLLERILARYIYPLTVISSL-LVTTMAILA--DVF
+SECY_AERPE/73-434 GLNPREQAERLIKGGLAIPGMRSDpRVLERVLRRYIYPLTFLSSL-IVAALVIVA--DIF
+A1RWR3_THEPD/75-456 GMDPETQAEQLAKAQLQIPGFRKSeKVIASMLKRYIWGLTILSSI-IIGVIAVVS--DIF
+SC61A_SCHPO/76-459 GASPRDVAKQLKSQQLVMAGHRE--GSMYKELKRIIPTAAWLSGA-VVGALAVAS--DLL
+A7E5Q2_SCLS1/76-459 GSSPRDVAKQLKDQGLVMAGHRE--QSMYKELKRIIPTAAAFGGA-CIGALSVGS--DLL
+Q5KC69_CRYNE/75-459 GSGPRDVAKQLKDQNMTLAGHRD--ASIYKELKRIIPTAAAFGGA-TLGLLSVVA--DMM
+SC61A_ASHGO/75-460 GTSPRDVSKQFKEQGLVINGRRE--TSVYRELKKVIPTAAAFGGA-TIGALSVGS--DLL
+Q59MJ6_CANAL/76-459 GTSPRDVAKQFKEQGLVIAGHRD--TSAYKELKKIIPIAAAFGGA-TIGALSVVC--DLM
+A7SJW4_NEMVE/75-458 GSSAKDVAKQLKDQQMVMRGHRD--KSMVHELNRYIPTAAAFGGL-CIGALSVLA--DFL
+A0CFY2_PARTE/73-456 GESAKDVARKFKDEQIKIKGLRE--ESMVKYLSGYIPVAAFCGGV-CIGLLTIVA--DIL
+Q22MG2_TETTH/151-538 GSSVKDVAKQLKEQGMGLVGSRD--SGLKSHLKRYIPIAATFGGL-CIGALSVVA--DFI
+A0CU87_PARTE/77-460 GSSPKDVAKQLKEQDMQIVGYRD--SSMKDVLKRYIPIAASFGGM-CIGALTILA--DFL
+Q7RLN0_PLAYO/121-506 GSSAKDVAKQLRDQHIGMRGHRDTpTSLTRVFNRYIPTAAAFGGM-CIGALTILA--DFL
+Q4QGX4_LEIMA/77-467 HTAPRDVAKQLASQGRWLVQARESeDDMTRLLEKYIPVAASFGGL-CVGALTIFA--DFL
+A5JEK2_NOSBO/75-457 DNTPTQVASQMKKNKMTLKGVRE--VNCASVLSKYIPTAALLGGC-FTSLVVLIS--NLF
+A2DH65_TRIVA/75-462 NQAPADVAEALKKQHLTLKGHREDqKRLEKTLSRYIPTAAALGGI-LVALLSFVA--DFL
+Q2QM98_ORYSJ/88-448 RSSAREFRTRVIGTGYFVW------DETSRRIDRVIAAAAAVGGF-AVGGLAVYA--GAV
+Q6AV46_ORYSJ/86-471 GSSSRDVARRLREQQMVMPGMRE--ASMQRELERYIPAAAALGGV-CVGALTVAA--DLM
+Q6C854_YARLI/70-454 GSAPKDVAKQFQAQSIVIVGQRA--QSAPRELAKVIPVAAAVGGA-VVGAIVAFC--DIF
+SSH1_YEAST/78-465 GSSARDVALEFKDQGITLMGRRE--QNVAKELNKVIPIAAVTGAS-VLSLITVIG--ESL
+Q6BT20_DEBHA/78-475 GSSPKDISKQFKEQGISISGKRD--ISITKELSRVIPVASVSGAF-VLAALAIAG--ELL
+A5DE75_PICGU/20-414 GSSPKDISKQFKEQGISIAGKRD--ISITKELSRVIPVASVSGAT-VLGLIAVAG--EVL
+A3GFV9_PICST/78-476 GSAPKDISKQFKDQGISISGKRD--ISITKELSRVIPVAAVSGGF-ILAAIAVAG--DLL
+A5DWJ5_LODEL/34-436 GSSPKDISKQFKEQGISIAGKRD--ISITKEFAKIIPTAAVTGAF-ILSALAVTG--DYL
+Q5A2C9_CANAL/5-404 GSSPKDISKQFKDQGISLAGKRD--ISITKELSRVIPVASVSGAF-ILSVVALIG--DFF
+Q74L41_LACJO/64-372 NFDPKEQAKSFRNNHYYIPNIAPG-RPTQRYLNRLIWIIAFPGAV-LNAFQLVFG--LYG
+B3XPQ8_LACRE/65-377 QFDPKAQAKAMLQGNNYILGVRPG-EPTRKYLRQILLHVSFLGAL-LNAIQLSFG--LLG
+A1C3L4_STRPA/70-403 NYDPYEISKNMRNNGDYISGKKPG-EETIKYIQYVVNSFAQFGAF-TVIIFGGLP--MLA
+Q3DVD6_STRAG/65-395 NIDPTKISEAMRESGDFIPNYRPG-KETQSYLSKICYLFGTFSGF-FMAFLGGVP--LLF
+A5LN99_STRPN/64-389 TMNGEEIADRMKKSGEYIYGIYPG-ADTSLFINRLVLRFSVIGGL-FNVVMAGGP--MLF
+A3CM55_STRSV/64-391 NISGDQIAERMQKSGEYIENVYPG-GATRRYINGLVTYFALVGAF-YLILISGLP--MMV
+Q03HZ8_PEDPA/65-396 NFQTERLTKNLKKSGDYIFNVVPG-TATRHYLNQRLFHLSTVANI-FFLIIVGTP--LIV
+A5IW80_STAA9/64-384 LINTKQKSKDFLKSGNYFSGVKPG-KDTERYLNYQARRVCWFGSA-LVTVIIGIP--LYF
+Q4L9N9_STAHJ/61-383 LINTKKKADEFLKNGNYFDPIRPG-RETERYLNSKARRVCWTGAI-LVALILAVP--LYS
+Q5HKR3_STAEQ/61-380 LINTKRKSKEFLKNGNYFEGIQPG-QQTEKFLGSKARRICWFGSI-VVAIVLAIP--MYS
+Q9RSK8_DEIRA/68-413 QFDPKRIAEQLREAGGFIPGVRPG-GPTADFLGRISGRLSLWGAI-FLVILTILP--QLV
+Q5SHQ8_THET8/71-413 QFDPKRIAESLREYGGFIPGIRPG-EPTVKFLEHIVSRLTLWGAL-FLGLVTLLP--QII
+SECY_CORGL/73-424 QYDPAEQAENMKKYGGFIPGIRPG-RPTAEYLGFVMNRLLFVGSL-YLAVIAVLP--NIM
+A8LB12_FRASN/74-414 TFNPTEVADNMRKYGGFIPGIRPG-RPTAEYLDHVLSRITLPGSL-FLGVITVLP--LAL
+Q83NQ1_TROW8/73-424 TFNPTEIADNMKNYGGFISGIRPG-VPTANYLSYIIKRITLPGSL-YLGIVSLIP--LIA
+Q8G3Z9_BIFLO/74-421 TFNPDETADNMKQYGGFIPGIRAG-NATSRYLTYVMNRLNTVGAV-YLLFVALIP--TVL
+A7B9M4_9ACTO/72-414 TFNPDEVADNMKKYGGFIPGYRAG-RPTAEYLRYVINRITSAGAL-YLVIIALLP--SLA
+SECY_CHLTR/73-433 QFRPEQIASEMKKNGAFIPGIRQG-KPTQTYLEYTMNRVTLLGAV-FLAVVAILP--SIL
+Q1AU49_RUBXD/70-408 QFNPIEHADNLKKSGGYIPGIRPG-QPTALYLNSVLTRITLFGAV-FLAVIAVLP--YLI
+Q8RIH6_FUSNN/75-411 VFDPEKVAENLKQGGGTIPGIRPG-EETVEYLEGVASRITWGGGI-FLAIISILP--YVI
+A6DRC9_9BACT/79-428 QFNPIQIADDLNRSGAFVPGHRPG-EPTSTFLNDTMTRITVAGAI-FLVILALLP--YVL
+C0ACZ0_9BACT/94-454 MFKPIQIAEDLKKYGGYIPGVRPG-EPTAKFLDFVMTRITLAGAI-FLTIIAVFP--DFL
+Q1Q157_9BACT/75-434 QFNPREMSNNMKDYGSFIPGIRPG-HRTAEYLESIMGKITLAGAA-FLSLIAILP--KLV
+A6CGP8_9PLAN/77-435 TFNPKDMAENLKDYGSFIPGYRPG-ARTAAYLEQVMVRITYVGAA-FLSLVAIIP--TLV
+B4S5A8_PROA2/73-417 AFNPKEVADTMRRQGGFIPGVRPG-KSTADFIDNILTRITLPGAI-SLAFIAVLP--TFL
+Q2S3P5_SALRD/75-414 TVNPQEMADTMKRQGGFIPGIRPG-KQTSEFIDTVLTRITLPGSI-FLGLVAIFP--AFA
+A1ZGT4_9SPHI/72-404 SVNPKQIADDLKRNGGFIAGVKPG-SDTSEYIDKIMSKITLPGSI-WLAIVAILP--AIA
+A6EHP4_9SPHI/71-408 TVNPTQMSDDMKKNGGFIPGIKPG-FATSSFIDDVISKITFPGAV-FLAIIAILP--SVA
+Q11QD2_CYTH3/72-411 TVNPNSIAEDLRRNGGFIPSVKPG-LATSEYIDDVLTKITLPGSI-FLALLAILP--AFA
+Q1VTY0_9FLAO/73-421 TVPTNKMADDLKRSGGFIPGIRPG-SETSEYLDRVMSQITLPGSI-FLALIAVFP--AVI
+Q1NYZ7_9FLAO/72-422 SIPVNKISDDLKINGVYIPNRKPG-KDTCFFLKKIVSQIYLTGSL-LLVIIALLP--SIF
+A5KHP6_CAMJE/62-402 VFNAKDIAENLKKQGGFIPGIRPG-EGTSSYLNEVASRLTLSGSI-YLGLVATLP--WVL
+A4EA78_9ACTN/52-389 VFNPDDTADNLKKQGGFIPGVRPG-RATAAYIKNALNKITLPSAV-FLALIAIVP--SII
+Q2GEC0_NEOSM/73-411 VFNTTEISDSLKKGEAIVAGRRPG-ISTKRHLDYVLRRITVVGAA-YLVCICVVP--EIF
+Q3YRM8_EHRCJ/72-412 VFDAKETSEILKKNGGFVPGKRPG-NATCEYFNYVIKRLTVLGSI-YLTVICIIP--ELI
+Q5GSW3_WOLTR/77-416 IFNPEENADFLKKNGGFIPGRRPG-KHTSDYLQDIVFKLTFIGSA-YLVVICTVP--EVM
+Q0ANS0_MARMM/83-421 VSNPDDMAENLRKYGGFLPGIRPG-KRTAEYIDFVMSRLTFIGAL-YLVLICMVP--MMM
+A7IPQ0_XANP2/80-418 VFNPVETADNLKKHGGFIPGIRPG-ERTAEYIDYVLTRITVVGAA-YIAAVCLFP--ELL
+SECY_RICCN/70-411 VFNSEETANNLRKYGAYIPGKRPG-KNTSDYFDYILTRLTVIGGI-YLSVICVIP--ELL
+Q2G8W0_NOVAD/80-430 VFNPEETAENLKKNGGFIPGIRPG-KNTANYLDYVLTRITVLGAA-YITVVCVVP--EFI
+A6E0Q6_9RHOB/73-411 AFKTDDVAENLKNQNGFIPGIRPG-KRTAEYLDFVVNRVLVIGSA-YLAAVCLLP--EIL
+Q1UZE8_9RICK/67-404 TFNPTETADNLRKYGGFVPGIRPG-ENTALYIEKIVTKLTTIGAL-YLTIVCLMP--EFL
+Q3R245_XYLFA/76-424 VFSSQETADILKKSGALIPGIRPG-KATSDYVDGVLTRLTAVGSL-YLVIVCLLP--EFM
+A4NK90_HAEIN/76-416 QYNPRDTADNLKKSGAFIPGIRPG-EQTSRYIDKVMTRLTLIGGL-YVTFVCLVP--YIM
+Q057C4_BUCCC/64-407 IFNVQDTANNLKKSGAFLPGIRPG-LKTAEYIKNIVFKLTTIGSI-YTVFICLIP--DIV
+Q8D1Z2_WIGBR/82-424 VFNSKDTADNLKKSGAFISGIRPG-IKTSQYINKIMMNLTLIGAT-YIALICLMP--DFF
+Q6F7T2_ACIAD/83-426 VFSPKEVSENLKRSGAYVPGIRPG-EQTARYLDHILNRLTFIGAI-YITVVCLMP--MIL
+Q6Q8W8_9GAMM/67-407 TFNTKDVSDNLKRSGAYIAGIRPG-EQTANYIDNVLARLTVFGAI-YLTLICLLP--LAL
+A9BRX1_DELAS/74-413 VFNSRETADNLKKSGAFIPGIRPG-DQTARYIDKILVRLTLAGAV-YITFVCLLP--EFL
+Q7DDS8_NEIMB/73-410 VFSPKEMAENLKKSGAFVPGIRPG-EQTSRYLEKVVLRLTLFGAL-YITTICLIP--EFL
+Q5NHU8_FRATT/74-416 VLNPKETADNLKKSGAYISGVRPG-EQTAKYIDAVMTRLTLVGSL-YITAICLLP--IFV
+Q7WZR8_9GAMM/64-388 VLNAKEVSINFKKSGAFIHGMRPG-KQTAGFISKVSSRLNWFGAI-YIVFFSLIP--QLI
+A5EX98_DICNV/69-412 MFENRELADSLKKSSAFIQGFRPG-RQTADYIDTVQERLTFVGAF-YVAFVCVLP--SLV
+Q6MJ32_BDEBA/70-415 VFNPNDVAENLKKYGGFVPGVRAG-KSTADYIQRVLERVNVVGCI-YLCTICILP--GIM
+B5EFS0_GEOBB/71-411 TFNPVDVADNVKKQGGYVPGIRPG-KETSDFLDAVLTKLTFAGAI-YISAVCVLP--SIL
+A3EVQ1_9BACT/75-412 VLNPTDIAENMQKYGGYIPGVRPG-QKTVEYLYRVMNRITFVGAL-YLSIVCVIP--ELL
+Q1MPP6_LAWIP/71-412 IFDSKDISENLKKAGGFIPGIRPG-EKTCEYLDGVLSRLTLWGGV-YISIISILP--MML
+SECY_AQUAE/71-412 LINPVELAENLHKAGAFIPGVRPG-QDTVKYLERIINRLIFFGAL-FLSVIALIP--ILI
+Q01WB2_SOLUE/74-438 IFNPNEAADNMRKYGGFIPGIRPG-RNTADYMNNILTKITVVGGI-YLAILCLIP--DIM
+Q08ZH8_STIAU/26-370 TFRPDDVADNIKKQGGYIPGIRPG-RQTADFIERVLNRITFGGAI-YLATICVIP--TIL
+A6GCG0_9DELT/70-411 QFNPVDLADNLKKQNASIPGVRPG-KRTAEHIEAILGRLTFAGSW-YISAVCVLP--VFL
+Q04PV8_LEPBJ/72-436 QFNPAELAENLKKYGGFIPGIRPG-SHTKEYIEKVLNRITLPGAM-FLAGLALAP--YII
+SECY_BORBU/72-409 QLSPKDISNNIRKNGGTIPGIKSD-E-MEKYLDEIMNKTLFSGSI-FLSIIAIIP--FLV
+Q73PL2_TREDE/73-413 ALNPTEIAKQIRENGGSIPGIRT--DKTEEYLQKILNRLILPGSL-YLAAIAVLP--TVI
+Q67JW3_SYMTH/69-405 TFNPENVADNIKKNGGFIPGYRPG-RPTAEYLERVSSRLTLVGGL-FLAAVTILP--ITI
+A7FQ38_CLOB1/69-409 TFKPDEMAENMHKSSGFIPGIRPG-EPTAEYIERVITKSSIIGGT-FAAIIAVFP--IIM
+A6LPT1_CLOB8/69-416 TFKPDEMSENLHKSAGFVPGVRPG-EETTTYFERVLNRLSFIGGI-LAAVLAVTP--VMI
+Q0SQG4_CLOPS/69-409 TFKPDEMAENMHKSSGFIPGIRPG-KPTEIYLEKVLNRISMFGGC-FAAIIAVVP--ILV
+A9KJH4_CLOPH/71-425 TFNPMEVANNMKKQGGFIPGIRPG-KPTTEYLTKVLNYIIFIGAI-GLMIVAIIP--IFF
+A7VH89_9CLOT/71-420 TFNPMEIANNMKKSGGFVPGIRPG-KPTQDYLNKILNYIIFIGAV-GLLIVAMIP--MFF
+A6BIS2_9FIRM/71-421 TFNPLEIANNMKKSGGFIPGIRPG-RPTVEYLTKILNYIIFVGAC-GLILVQIVP--ILF
+A7VR33_9CLOT/71-423 QYNPIEMANNLRQNNGTIPGIRPG-KPTSDYIQKILSKITLIGAL-FLAVIALLP--IAF
+A6NXF0_9BACE/71-437 QFNPIEVANNLKKNGGFVPGFRPG-KPTADFIYKVLNKITLFGAI-YLAVIALLP--IIT
+Q250L2_DESHY/70-413 SFNPVDVADNLKKYGGFIPGLRPG-RATSDYLSKILSRLTLAGGT-FLAMIAVLP--SLV
+Q8R7X3_THETN/69-402 IFNPQDISDNLKKYGGFIPGIRPG-KPTTEYLTKVLNRIVFVGAL-FLAFIATMP--VVL
+A4XLR1_CALS8/69-419 VFNPVEIANNLKNNGGFIPGIRPG-KPTVDFITRVLSKVTFAGAL-FLAFIAILP--TLV
+A3DJJ2_CLOTH/71-411 QFNPVEVANNLKKNGGFIPGIRPG-KPTSDYIYKVVSRISWFSAL-FLAIIQILP--SLL
+A8MLG0_ALKOO/69-408 TFNPVEISNNMKQNGGFIPGIRPG-KPTADYINKILTRITLSGAV-FLAIITIVP--TIV
+Q18CH6_CLOD6/69-406 SFNTEDISKNMKNNGGFIPGIRPG-EPTMDYLNRILTRLTLAGAT-FLAIIAMVP--ALT
+B8D0S8_HALOH/72-406 TFNPEEVADNMRKSGAFIPGIRPG-KATENFLTRILVRVTLAGAI-FLTVIAIMP--YFI
+
+A9B431_HERA2/73-422 QQIT------------------------GL----------QIG-FSS-TGLL----IVVG
+A8CRX1_9CHLR/78-422 REVT------------------------GI----------QVIqLSS-FGML----IVVG
+A2Y4E5_ORYSI/132-498 DRYL--------------------------rq------inEGFsIGF-TSVL----IIVG
+Q7UZW2_PROMP/80-422 ERAT------------------------NV---------qTFQgLGA-TSLL----ILVG
+Q7NKT4_GLOVI/79-416 EQGT------------------------GI---------tTFNgLGA-TSLL----ILVG
+SECY_GUITH/68-404 ETLT------------------------NL---------sVFKgLGG-TSLL----IIVG
+SECY_CYACA/62-394 EFVF------------------------HI---------rVFKgLAV-SSLL----IVVG
+Q85FU6_CYAME/42-325 SSLK------------------------------------IFSgFGA-TSLL----IVIG
+A0T0J6_PHATR/72-407 ESTL------------------------SI---------tSLNgLST-TSLL----ILAG
+SECY_CYAPA/109-459 ERSL------------------------GL---------pKLQiLSP-VSIS----IALG
+Q4G351_EMIHU/63-407 GNFI------------------------------------QFGlFKNlTSLL----ILIG
+SECY_PAVLU/66-404 AAAL------------------------GV---------hPLSiSGI-TSLI----LSFS
+Q6B8X0_GRATL/62-395 AYIT------------------------HT---------sLLQgLGT-TSLL----ILVG
+SECY_ANTSP/62-390 YYIF------------------------KI---------nTLKgLGA-TSLL----ILVG
+A4RW47_OSTLU/65-398 EQIT------------------------GL---------qTFRgFAG-TSLL----ILVG
+A7PFA4_VITVI/131-465 EQTT------------------------HL---------tAFRgFAG-TSVL----ILVG
+A7HM32_FERNB/75-404 EGIT------------------------RV----------NIW-LGG-TSAL----IAVG
+A3CK84_STRSV/69-416 KDVF------------------------GLt--------dAVA-LGG-TSLL----IIIS
+Q5FM71_LACAC/68-415 TNFW------------------------NLp--------sSIG-LGG-TSLL----IVIG
+Q03ZM6_LEUMM/68-416 SDVW------------------------GLn--------eKIG-LGG-TSLL----ISIG
+SECY_STAA8/69-413 TKFM------------------------GLp--------qSIQ-IGG-TSLL----IVIG
+Q4MG72_BACCE/68-415 TKIA------------------------TLp--------pSAQ-IGG-TSLL----IIVG
+Q6F1X5_MESFL/92-454 SKLT------------------------NLp--------sQLA-IGG-TGLI----ICIS
+Q6KI36_MYCMO/87-436 AGVP------------------------------------ENIsFGG-TSVI----ILVT
+Q4A5I3_MYCS5/83-437 TGIL-----------------------------------qPSIaFGG-TSLM----ILVS
+Q98Q01_MYCPU/90-438 AGMP------------------------------------AAIsFGG-TSMM----ILVS
+Q4AAF9_MYCHJ/85-434 LGLP------------------------------------SAItISG-TSII----ILAT
+Q9PQP1_UREPA/76-434 ALVA------------------------KTinhgipviqpSTI-FGG-TSII----IMVT
+SECY_MYCGE/81-430 SYFI------------------------RLp--------nSLS-LGG-TGII----IIVT
+Q8EUD2_MYCPE/81-433 TMTT------------------------GIp--------nGIA-IGG-TGVI----IMVT
+Q7X4E3_9MOLU/69-399 NYLA------------------------GIk-------isQNIpFSG-TSLL----IIVG
+Q5Q069_ASTYP/59-398 EHFL------------------------SL----------KDMkLGG-TSLL----IIVS
+O21257_RECAM/57-372 FIF---------------------------------------------SKLF----FIIS
+Q74NB9_NANEQ/69-457 SIPI-----------------------------------------GG-TSIL----LATM
+Q2EMT2_METVO/30-379 GALG-----------------------------------------GG-TGVL----LTVS
+A5UL65_METS3/72-433 GALG-----------------------------------------GG-TGVL----LTVG
+SECY_METTH/73-436 GSLG-----------------------------------------GG-TGVL----LTVG
+SECY_PYRAB/72-448 GALG-----------------------------------------TG-TGIL----LTVG
+Q8TZA9_METKA/75-435 GALG-----------------------------------------GG-TGVL----LTVS
+Q9HIT0_THEAC/82-514 GTVG---------------------------------------dTSG-TGLL----LAVG
+Q2QAQ7_9EURY/161-583 GTVG---------------------------------------nATG-TGLL----LAVG
+Q0W1W5_UNCMA/75-487 GILG---------------------------------------aVSG-TGML----LAVS
+SECY_ARCFU/73-471 GTIG---------------------------------------nVSG-TGLL----LAVS
+Q8TRS4_METAC/72-470 GTLG---------------------------------------sAGG-TGLL----LTVS
+A0B9U7_METTP/75-515 GTLG---------------------------------------gAGG-TGLL----LAVS
+SECY_HALMA/73-468 GTIG---------------------------------------gVSG-TGLL----LTVS
+Q2FSG8_METHJ/73-458 GVIG---------------------------------------aVSG-TGLL----LTVS
+A2SPM5_METLZ/73-458 GIIG---------------------------------------fVGG-TGLL----LTVS
+A0RUE4_CENSY/79-457 GVFG-----------------------------------------SG-IGIL----LMVD
+A8ME75_CALMQ/77-461 GVYG-----------------------------------------TG-IGLI----LMVE
+A3MUZ2_PYRCJ/70-435 GVWG-----------------------------------------GG-VGLI----LLVE
+SECY_SULSO/73-449 GAYG-----------------------------------------TG-IGIL----LAVT
+SECY_SULAC/74-443 GTYG-----------------------------------------TG-VGLL----LAIT
+A2BME2_HYPBU/73-444 GAYG-----------------------------------------TG-SGLV----LLVG
+SECY_AERPE/73-434 GAYG-----------------------------------------TG-TGLL----LAVG
+A1RWR3_THEPD/75-456 RVMG-----------------------------------------GG-TGIL----LLVG
+SC61A_SCHPO/76-459 GALG-----------------------------------------SG-TAVL----LCTT
+A7E5Q2_SCLS1/76-459 GALG-----------------------------------------SG-TGIL----LAVT
+Q5KC69_CRYNE/75-459 GALG-----------------------------------------SG-TGIL----MATT
+SC61A_ASHGO/75-460 GTLG-----------------------------------------SG-TSIL----MATT
+Q59MJ6_CANAL/76-459 GTLG-----------------------------------------SG-TSIL----LAVT
+A7SJW4_NEMVE/75-458 GAIG-----------------------------------------SG-TGIL----LAVT
+A0CFY2_PARTE/73-456 GAIG-----------------------------------------SG-TGIL----LAVT
+Q22MG2_TETTH/151-538 GVIG-----------------------------------------SG-TGIL----LAVN
+A0CU87_PARTE/77-460 GAIG-----------------------------------------SG-TGIL----LSVT
+Q7RLN0_PLAYO/121-506 GALG-----------------------------------------SG-TGIL----LAVT
+Q4QGX4_LEIMA/77-467 GAIG-----------------------------------------SG-TGIL----LSVT
+A5JEK2_NOSBO/75-457 DTIG-----------------------------------------SG-TNIF----LATS
+A2DH65_TRIVA/75-462 SAFG-----------------------------------------SG-TGII----LAVS
+Q2QM98_ORYSJ/88-448 GAIG----------------------------------------EAG-PELL----FAVL
+Q6AV46_ORYSJ/86-471 GAVG-----------------------------------------SG-AGML----LAVT
+Q6C854_YARLI/70-454 GGLG----------------------------------------ASA-APMI----VAVT
+SSH1_YEAST/78-465 GLKG-----------------------------------------KA-AGIV----VGIA
+Q6BT20_DEBHA/78-475 GGLG-----------------------------------------KG-VAAI----IGVC
+A5DE75_PICGU/20-414 GGAG-----------------------------------------KG-VGTI----IGVS
+A3GFV9_PICST/78-476 GGLG-----------------------------------------KS-AATI----VGVS
+A5DWJ5_LODEL/34-436 GGLG-----------------------------------------RN-VASI----VGVS
+Q5A2C9_CANAL/5-404 GGLG-----------------------------------------YG-VASI----IGVT
+Q74L41_LACJO/64-372 GNFL------------------------GN--------------YAG-FAIIpmnvVMIT
+B3XPQ8_LACRE/65-377 GQVL------------------------GN--------------FAG-LAIIpmnmIMIV
+A1C3L4_STRPA/70-403 VLLQ--------------------------gqg----knsVSIaLLI-SNAY----IIVS
+Q3DVD6_STRAG/65-395 ALG---------------------------n-------ddLRTvSSM-TGIF----MMIT
+A5LN99_STRPN/64-389 VLF---------------------------d-------ekLLRlAMI-PGLF----MMFG
+A3CM55_STRSV/64-391 VLV---------------------------d-------irYLRlSMI-PGIF----MIFI
+Q03HZ8_PEDPA/65-396 GLYL--------------------------p-------eiTNFaFVF-ANIL----ILIT
+A5IW80_STAA9/64-384 TLFV--------------------------p-------hlSTEiYFS-VQLI----VLVY
+Q4L9N9_STAHJ/61-383 TLLV--------------------------p-------nlSTEiYFS-MQLI----ILVY
+Q5HKR3_STAEQ/61-380 ALLV--------------------------p-------hlLKEvYFT-TQMI----VFVY
+Q9RSK8_DEIRA/68-413 QKAT------------------------GI----------TTFqFSG-TGLL----IIVG
+Q5SHQ8_THET8/71-413 QNLT------------------------GI----------HSIaFSG-IGLL----IVVG
+SECY_CORGL/73-424 LDL-------------------------GVda-----gsaGATpFGG-TAIL----ILVS
+A8LB12_FRASN/74-414 LNLT------------------------KD----------QPFpFAG-TSVL----IMVG
+Q83NQ1_TROW8/73-424 FALF------------------------GLsa------diP---LGG-TSVL----IMVG
+Q8G3Z9_BIFLO/74-421 IMAL------------------------GL---------nAKLpFGG-TTIL----IIAG
+A7B9M4_9ACTO/72-414 IIPL------------------------QLs--------sSQMpFGG-TTLL----IIIG
+SECY_CHLTR/73-433 GRIL------------------------RVda------nvSYF-LGG-TAML----IVVG
+Q1AU49_RUBXD/70-408 TGAL------------------------NLp--------nSIY-LGG-TSML----IVVG
+Q8RIH6_FUSNN/75-411 FTSM------------------------GL----------PVY-FGG-TGII----IVVG
+A6DRC9_9BACT/79-428 MNAM------------------------GSgstd--fiitQF--FGG-TSLL----IMVG
+C0ACZ0_9BACT/94-454 NAEL------------------------NVpq------riSSF-FGG-TGML----ITVG
+Q1Q157_9BACT/75-434 AGGF------------------------ELnr------aiAGF-YGG-TGLL----IIVG
+A6CGP8_9PLAN/77-435 STWL------------------------GVdf------lvASF-YGG-TGLL----IVVS
+B4S5A8_PROA2/73-417 TKFA------------------------NVtp------gfAQF-FGG-TSLL----IIVG
+Q2S3P5_SALRD/75-414 MQA-------------------------GVsq------gfAMF-YGG-TSLL----ILVQ
+A1ZGT4_9SPHI/72-404 VKF-------------------------GIqn------sfAQF-YGG-TSLL----IMVG
+A6EHP4_9SPHI/71-408 VKF-------------------------GIks------efAHF-YGG-TSLL----ILVG
+Q11QD2_CYTH3/72-411 SMT-------------------------GIek------efAYF-YGG-TSLL----IMIG
+Q1VTY0_9FLAO/73-421 VSLL------------------------NVqq------gwGLF-FGG-TSLL----IMVG
+Q1NYZ7_9FLAO/72-422 ISLGg---------------------dkNF----------SLF-FGG-TTII----IIVG
+A5KHP6_CAMJE/62-402 VKFM------------------------GV----------PFH-FGG-TSVL----IVVQ
+A4EA78_9ACTN/52-389 FSFT------------------------GN---------hLIQaFGG-TSIL----IMVG
+Q2GEC0_NEOSM/73-411 RNYF------------------------GF----------DAI-ISG-TSLL----IIVN
+Q3YRM8_EHRCJ/72-412 RYNY------------------------SV----------SFT-LGG-TSFL----IIVN
+Q5GSW3_WOLTR/77-416 RYYY------------------------DM----------PFI-FGG-TSLL----IIVN
+Q0ANS0_MARMM/83-421 ----------------------------NP----------NTA-LGG-TSLL----IVVS
+A7IPQ0_XANP2/80-418 ISYA------------------------SL----------PFY-FGG-TSLL----IVVS
+SECY_RICCN/70-411 MNKY------------------------VI----------SLS-LGG-TSFL----IVVN
+Q2G8W0_NOVAD/80-430 MAET------------------------GM---------gTLF-FGG-TSLL----IVVN
+A6E0Q6_9RHOB/73-411 RNQF------------------------AI----------PFY-FGG-TSVL----IVVS
+Q1UZE8_9RICK/67-404 IANY------------------------PI----------PFY-LGG-TSIL----IVVV
+Q3R245_XYLFA/76-424 QSRI------------------------GA----------SFH-FGG-TSLL----IAVV
+A4NK90_HAEIN/76-416 TSAW------------------------DV----------KFY-FGG-TSLL----IVVV
+Q057C4_BUCCC/64-407 RYFF------------------------KV----------PFN-FGG-TSLL----IVVV
+Q8D1Z2_WIGBR/82-424 RVFI------------------------KS----------PFH-FGG-TSLL----IVVV
+Q6F7T2_ACIAD/83-426 QNSF------------------------GI----------PFH-LGG-TSLL----IVVV
+Q6Q8W8_9GAMM/67-407 INFAg----------------------iSP----------TIS-IGG-TSVL----IIVV
+A9BRX1_DELAS/74-413 ILKY------------------------NV----------PFY-FGG-TSLL----IIVV
+Q7DDS8_NEIMB/73-410 TTVL------------------------NV----------PFY-LGG-TSLL----ILVV
+Q5NHU8_FRATT/74-416 VKFFa----------------------qGL----------SFT-FGG-TSLL----IVVV
+Q7WZR8_9GAMM/64-388 MVYC------------------------KI----------PFC-GGG-ISIL----IMVV
+A5EX98_DICNV/69-412 NMGS------------------------ASg--------qVLFlFGG-TSLL----IAVV
+Q6MJ32_BDEBA/70-415 VSQF------------------------NV----------PFQ-FGG-TSLL----ILVG
+B5EFS0_GEOBB/71-411 IGKF------------------------NL----------PFY-FGG-TSLL----IAVG
+A3EVQ1_9BACT/75-412 IYQL------------------------HV----------PFY-FGG-TSLL----IVIG
+Q1MPP6_LAWIP/71-412 ISQF------------------------NV----------PFY-FGG-TSIL----ILVG
+SECY_AQUAE/71-412 SVWF------------------------NI----------PFY-FGG-TTAL----IVVG
+Q01WB2_SOLUE/74-438 ISGIklhhlwlvgdwidrvaprfileglGV----------NFY-FGG-TSLL----IVVG
+Q08ZH8_STIAU/26-370 TQWL------------------------QV----------PFA-FGG-TALL----IVVG
+A6GCG0_9DELT/70-411 QTEF------------------------NV----------PFY-YGG-TSLL----IVVG
+Q04PV8_LEPBJ/72-436 IKFL------------------------DLssns--gggsLVYtFGG-TSLL----IMVG
+SECY_BORBU/72-409 QNIF------------------------RFph------dvSRI-MGG-SSLL----IMVG
+Q73PL2_TREDE/73-413 QWAF------------------------SFpr------niSML-MGG-TSLL----ILVG
+Q67JW3_SYMTH/69-405 MSLA------------------------GV---------qNAY-IGG-SSLL----IVVS
+A7FQ38_CLOB1/69-409 AAYS------------------------KF---------qGIS-FGG-TSML----IMVG
+A6LPT1_CLOB8/69-416 QNYT------------------------QF---------qNIA-FSG-TGLL----IVIN
+Q0SQG4_CLOPS/69-409 ANYT------------------------PF---------qGIQ-FGG-TSLL----ILVS
+A9KJH4_CLOPH/71-425 SGMF------------------------DA----------HVS-FSG-TSLI----IVVS
+A7VH89_9CLOT/71-420 NGFF------------------------SV----------NVS-FGG-TSII----IVVG
+A6BIS2_9FIRM/71-421 NGWL------------------------GA----------KVS-FGG-TSLI----IIVS
+A7VR33_9CLOT/71-423 SAFT------------------------GM---------hNLM-MGG-TSVI----ILVG
+A6NXF0_9BACE/71-437 SNII------------------------NLasgs--qmgrSLS-IGG-TSII----IVVG
+Q250L2_DESHY/70-413 IGLT------------------------GI---------pNIT-LGG-TSLL----IVVS
+Q8R7X3_THETN/69-402 MNVT------------------------GL----------QLY-FGG-TALL----IAVG
+A4XLR1_CALS8/69-419 GLMFr----------------------hQL----------NIY-FGG-TSLL----IVVG
+A3DJJ2_CLOTH/71-411 QAIT------------------------GI---------rGIW-FAG-TSVL----ILVG
+A8MLG0_ALKOO/69-408 LGIT------------------------HI----------PIS-FGG-TTII----IIVG
+Q18CH6_CLOD6/69-406 THYM------------------------KV----------NMS-LAG-TSLL----IVVG
+B8D0S8_HALOH/72-406 SDIT------------------------RV----------RIS-FGG-TSLL----IMTG
+
+A9B431_HERA2/73-422 ----VAVD---TMR
+A8CRX1_9CHLR/78-422 ----VALD---TMK
+A2Y4E5_ORYSI/132-498 ----SIIE---LRR
+Q7UZW2_PROMP/80-422 ----VAID---TAK
+Q7NKT4_GLOVI/79-416 ----VAID---TVR
+SECY_GUITH/68-404 ----VQVD---TSK
+SECY_CYACA/62-394 ----VAID---LIK
+Q85FU6_CYAME/42-325 ----VSID---TMR
+A0T0J6_PHATR/72-407 ----VVLD---LVR
+SECY_CYAPA/109-459 ----VAVD---TTR
+Q4G351_EMIHU/63-407 ----VITD---TTS
+SECY_PAVLU/66-404 ----IIND---TVR
+Q6B8X0_GRATL/62-395 ----VAID---TAK
+SECY_ANTSP/62-390 ----VAID---TAK
+A4RW47_OSTLU/65-398 ----VATD---SAR
+A7PFA4_VITVI/131-465 ----CATD---TAR
+A7HM32_FERNB/75-404 ----VALD---IAQ
+A3CK84_STRSV/69-416 ----TGIE---GMK
+Q5FM71_LACAC/68-415 ----VVLE---LSR
+Q03ZM6_LEUMM/68-416 ----VALD---LIR
+SECY_STAA8/69-413 ----VAIE---TMK
+Q4MG72_BACCE/68-415 ----VALE---TMK
+Q6F1X5_MESFL/92-454 ----VAIQ---TTQ
+Q6KI36_MYCMO/87-436 ----ASYE---TIT
+Q4A5I3_MYCS5/83-437 ----VSIE---TIS
+Q98Q01_MYCPU/90-438 ----VSLE---TID
+Q4AAF9_MYCHJ/85-434 ----TTLE---TIS
+Q9PQP1_UREPA/76-434 ----ATLE---LWN
+SECY_MYCGE/81-430 ----AVVE---FIS
+Q8EUD2_MYCPE/81-433 ----GSLD---FWS
+Q7X4E3_9MOLU/69-399 ----VALE---SIQ
+Q5Q069_ASTYP/59-398 ----VALE---TIQ
+O21257_RECAM/57-372 ---yLFIEidfSFF
+Q74NB9_NANEQ/69-457 ----ISYM---VYE
+Q2EMT2_METVO/30-379 ----IVYR---FYE
+A5UL65_METS3/72-433 ----IIHK---IYE
+SECY_METTH/73-436 ----IVYR---LYE
+SECY_PYRAB/72-448 ----ILYR---FYE
+Q8TZA9_METKA/75-435 ----ILYN---MYE
+Q9HIT0_THEAC/82-514 ----IIIQ---FYE
+Q2QAQ7_9EURY/161-583 ----IILR---TYE
+Q0W1W5_UNCMA/75-487 ----ITYQ---LYE
+SECY_ARCFU/73-471 ----IAYR---FYE
+Q8TRS4_METAC/72-470 ----IVYR---LYE
+A0B9U7_METTP/75-515 ----IMYR---LYE
+SECY_HALMA/73-468 ----ITYK---LYE
+Q2FSG8_METHJ/73-458 ----ITYR---LYE
+A2SPM5_METLZ/73-458 ----IIYR---LYE
+A0RUE4_CENSY/79-457 ----ILIN---YYN
+A8ME75_CALMQ/77-461 ----IIIQ---YYT
+A3MUZ2_PYRCJ/70-435 ----IALQ---YYA
+SECY_SULSO/73-449 ----IAIQ---YYS
+SECY_SULAC/74-443 ----IAMQ---YYN
+A2BME2_HYPBU/73-444 ----IIYN---FYQ
+SECY_AERPE/73-434 ----IINQ---YYA
+A1RWR3_THEPD/75-456 ----IIVQ---YYS
+SC61A_SCHPO/76-459 ----TIYG---YYE
+A7E5Q2_SCLS1/76-459 ----IIYG---YFE
+Q5KC69_CRYNE/75-459 ----IIYG---YFE
+SC61A_ASHGO/75-460 ----TIYG---YYE
+Q59MJ6_CANAL/76-459 ----TIYG---YYE
+A7SJW4_NEMVE/75-458 ----IIYQ---YFE
+A0CFY2_PARTE/73-456 ----IIYG---YFE
+Q22MG2_TETTH/151-538 ----IVYG---YFE
+A0CU87_PARTE/77-460 ----IIYG---YFE
+Q7RLN0_PLAYO/121-506 ----IIYQ---FYE
+Q4QGX4_LEIMA/77-467 ----MINQ---YYE
+A5JEK2_NOSBO/75-457 ----IVHQ---YLE
+A2DH65_TRIVA/75-462 ----IINQ---FTA
+Q2QM98_ORYSJ/88-448 ----VIKN---LAE
+Q6AV46_ORYSJ/86-471 ----TVYQ---CYE
+Q6C854_YARLI/70-454 ----SMNN---YFE
+SSH1_YEAST/78-465 ----GGFS---LLE
+Q6BT20_DEBHA/78-475 ----GAFG---ILE
+A5DE75_PICGU/20-414 ----AAFG---VLE
+A3GFV9_PICST/78-476 ----AAFS---VLE
+A5DWJ5_LODEL/34-436 ----SAFG---ILE
+Q5A2C9_CANAL/5-404 ----ASFA---VLE
+Q74L41_LACJO/64-372 -----------MFM
+B3XPQ8_LACRE/65-377 ----MFMQ---GIK
+A1C3L4_STRPA/70-403 ----LLLG---VIE
+Q3DVD6_STRAG/65-395 gmsfMILDefqVIR
+A5LN99_STRPN/64-389 ----GMIF---TIR
+A3CM55_STRSV/64-391 ----GMVF---SIK
+Q03HZ8_PEDPA/65-396 ----IIDT---TMD
+A5IW80_STAA9/64-384 ----ISIN---IAE
+Q4L9N9_STAHJ/61-383 ----ISINigeTIR
+Q5HKR3_STAEQ/61-380 ----IGIN---IAE
+Q9RSK8_DEIRA/68-413 ----VALE---TLK
+Q5SHQ8_THET8/71-413 ----VALD---TLR
+SECY_CORGL/73-424 ----VALT---TVK
+A8LB12_FRASN/74-414 ----VGLE---TVK
+Q83NQ1_TROW8/73-424 ----VGLD---TVK
+Q8G3Z9_BIFLO/74-421 ----VGLD---TLR
+A7B9M4_9ACTO/72-414 ----VGLQ---TVK
+SECY_CHLTR/73-433 ----VILD---TMK
+Q1AU49_RUBXD/70-408 ----VSLD---TVR
+Q8RIH6_FUSNN/75-411 ----VALD---TIQ
+A6DRC9_9BACT/79-428 ----VVLQ---TMQ
+C0ACZ0_9BACT/94-454 ----VILD---TMK
+Q1Q157_9BACT/75-434 ----VALD---MVQ
+A6CGP8_9PLAN/77-435 ----VVLD---LVN
+B4S5A8_PROA2/73-417 ----VGLD---TLQ
+Q2S3P5_SALRD/75-414 ----VTLD---TLQ
+A1ZGT4_9SPHI/72-404 ----VVLN---TLQ
+A6EHP4_9SPHI/71-408 ----VVLD---TLQ
+Q11QD2_CYTH3/72-411 ----VVLD---TLQ
+Q1VTY0_9FLAO/73-421 ----VAID---TIQ
+Q1NYZ7_9FLAO/72-422 ----GLLDikyTIN
+A5KHP6_CAMJE/62-402 ----VALD---TMR
+A4EA78_9ACTN/52-389 ----VVLD---TVD
+Q2GEC0_NEOSM/73-411 ----VITD---LLS
+Q3YRM8_EHRCJ/72-412 ----VIID---TFS
+Q5GSW3_WOLTR/77-416 ----VTTD---TIM
+Q0ANS0_MARMM/83-421 ----VTMD---TVS
+A7IPQ0_XANP2/80-418 ----VTMD---TVS
+SECY_RICCN/70-411 ----VVLD---TMT
+Q2G8W0_NOVAD/80-430 ----VTVD---TIT
+A6E0Q6_9RHOB/73-411 ----VTMD---TIQ
+Q1UZE8_9RICK/67-404 ----VAID---TVT
+Q3R245_XYLFA/76-424 ----VVMD---FIS
+A4NK90_HAEIN/76-416 ----VIMD---FIV
+Q057C4_BUCCC/64-407 ----VLIE---FIT
+Q8D1Z2_WIGBR/82-424 ----VTID---FMT
+Q6F7T2_ACIAD/83-426 ----VVMD---FMA
+Q6Q8W8_9GAMM/67-407 ----VLMD---FMS
+A9BRX1_DELAS/74-413 ----VTMD---FMA
+Q7DDS8_NEIMB/73-410 ----VTMD---FST
+Q5NHU8_FRATT/74-416 ----VMMD---FMA
+Q7WZR8_9GAMM/64-388 ----VVLD---FLS
+A5EX98_DICNV/69-412 ----VAMD---LMS
+Q6MJ32_BDEBA/70-415 ----VALD---TAQ
+B5EFS0_GEOBB/71-411 ----VGMD---TLS
+A3EVQ1_9BACT/75-412 ----VSLD---TAQ
+Q1MPP6_LAWIP/71-412 ----VAMD---FMS
+SECY_AQUAE/71-412 ----VALD---TFR
+Q01WB2_SOLUE/74-438 ----VAMD---TIN
+Q08ZH8_STIAU/26-370 ----VALD---TVQ
+A6GCG0_9DELT/70-411 ----VALD---TAQ
+Q04PV8_LEPBJ/72-436 ----VALE---TLK
+SECY_BORBU/72-409 ----VALD---TLI
+Q73PL2_TREDE/73-413 ----VDLD---TMS
+Q67JW3_SYMTH/69-405 ----VALE---TTK
+A7FQ38_CLOB1/69-409 ----FALD---TIR
+A6LPT1_CLOB8/69-416 ----VALD---FTR
+Q0SQG4_CLOPS/69-409 ----VSLE---IMR
+A9KJH4_CLOPH/71-425 ----VVLE---TMK
+A7VH89_9CLOT/71-420 ----VVIE---TMK
+A6BIS2_9FIRM/71-421 ----VILE---TLK
+A7VR33_9CLOT/71-423 ----VALD---TMK
+A6NXF0_9BACE/71-437 ----VALE---TVK
+Q250L2_DESHY/70-413 ----VALE---TMK
+Q8R7X3_THETN/69-402 ----VALD---TMK
+A4XLR1_CALS8/69-419 ----VALE---TIR
+A3DJJ2_CLOTH/71-411 ----VALE---TVK
+A8MLG0_ALKOO/69-408 ----VALE---TMK
+Q18CH6_CLOD6/69-406 ----VALE---LKR
+B8D0S8_HALOH/72-406 ----VALQ---TMQ
diff --git a/demotic/examples/example-single.sto b/demotic/examples/example-single.sto
new file mode 100644
index 0000000..7eadcda
--- /dev/null
+++ b/demotic/examples/example-single.sto
@@ -0,0 +1,344 @@
+# STOCKHOLM 1.0
+#=GF ID SecY
+#=GF AC PF00344.13
+#=GF DE eubacterial secY protein
+#=GF PI secY;
+#=GF AU Finn RD
+#=GF SE Prosite
+#=GF GA 20.10 20.10;
+#=GF TC 20.10 21.30;
+#=GF NC 19.80 19.80;
+#=GF BM hmmbuild HMM.ann SEED.ann
+#=GF SM hmmsearch -Z 9421015 -E 1000 HMM pfamseq
+#=GF TP Family
+#=GF DR INTERPRO; IPR002208;
+#=GF DR PROSITE; PDOC00612;
+#=GF DR PRINTS; PR00303;
+#=GF DR TC; 3.A.5;
+#=GF DR SCOP; 1rh5; fa;
+#=GF SQ 158
+#=GS A9B431_HERA2/73-422 AC A9B431.1
+#=GS A8CRX1_9CHLR/78-422 AC A8CRX1.1
+#=GS A2Y4E5_ORYSI/132-498 AC A2Y4E5.1
+#=GS Q7UZW2_PROMP/80-422 AC Q7UZW2.1
+#=GS Q7NKT4_GLOVI/79-416 AC Q7NKT4.1
+#=GS SECY_GUITH/68-404 AC P28527.2
+#=GS SECY_CYACA/62-394 AC P46249.2
+#=GS Q85FU6_CYAME/42-325 AC Q85FU6.1
+#=GS A0T0J6_PHATR/72-407 AC A0T0J6.1
+#=GS SECY_CYAPA/109-459 AC P25014.2
+#=GS Q4G351_EMIHU/63-407 AC Q4G351.1
+#=GS SECY_PAVLU/66-404 AC P28540.2
+#=GS Q6B8X0_GRATL/62-395 AC Q6B8X0.1
+#=GS SECY_ANTSP/62-390 AC Q37143.1
+#=GS A4RW47_OSTLU/65-398 AC A4RW47.1
+#=GS A7PFA4_VITVI/131-465 AC A7PFA4.1
+#=GS A7HM32_FERNB/75-404 AC A7HM32.1
+#=GS A3CK84_STRSV/69-416 AC A3CK84.1
+#=GS Q5FM71_LACAC/68-415 AC Q5FM71.1
+#=GS Q03ZM6_LEUMM/68-416 AC Q03ZM6.1
+#=GS SECY_STAA8/69-413 AC O08387.2
+#=GS Q4MG72_BACCE/68-415 AC Q4MG72.1
+#=GS Q6F1X5_MESFL/92-454 AC Q6F1X5.1
+#=GS Q6KI36_MYCMO/87-436 AC Q6KI36.1
+#=GS Q4A5I3_MYCS5/83-437 AC Q4A5I3.1
+#=GS Q98Q01_MYCPU/90-438 AC Q98Q01.1
+#=GS Q4AAF9_MYCHJ/85-434 AC Q4AAF9.1
+#=GS Q9PQP1_UREPA/76-434 AC Q9PQP1.1
+#=GS SECY_MYCGE/81-430 AC P47416.1
+#=GS Q8EUD2_MYCPE/81-433 AC Q8EUD2.1
+#=GS Q7X4E3_9MOLU/69-399 AC Q7X4E3.1
+#=GS Q5Q069_ASTYP/59-398 AC Q5Q069.1
+#=GS O21257_RECAM/57-372 AC O21257.1
+#=GS Q74NB9_NANEQ/69-457 AC Q74NB9.1
+#=GS Q2EMT2_METVO/30-379 AC Q2EMT2.1
+#=GS A5UL65_METS3/72-433 AC A5UL65.1
+#=GS SECY_METTH/73-436 AC O26134.1
+#=GS SECY_PYRAB/72-448 AC Q9V1V8.1
+#=GS Q8TZA9_METKA/75-435 AC Q8TZA9.1
+#=GS Q9HIT0_THEAC/82-514 AC Q9HIT0.1
+#=GS Q2QAQ7_9EURY/161-583 AC Q2QAQ7.1
+#=GS Q0W1W5_UNCMA/75-487 AC Q0W1W5.1
+#=GS SECY_ARCFU/73-471 AC O28377.1
+#=GS Q8TRS4_METAC/72-470 AC Q8TRS4.1
+#=GS A0B9U7_METTP/75-515 AC A0B9U7.1
+#=GS SECY_HALMA/73-468 AC P28542.2
+#=GS Q2FSG8_METHJ/73-458 AC Q2FSG8.1
+#=GS A2SPM5_METLZ/73-458 AC A2SPM5.1
+#=GS A0RUE4_CENSY/79-457 AC A0RUE4.1
+#=GS A8ME75_CALMQ/77-461 AC A8ME75.1
+#=GS A3MUZ2_PYRCJ/70-435 AC A3MUZ2.1
+#=GS SECY_SULSO/73-449 AC Q9UX84.1
+#=GS SECY_SULAC/74-443 AC P49978.1
+#=GS A2BME2_HYPBU/73-444 AC A2BME2.1
+#=GS SECY_AERPE/73-434 AC Q9YDD0.2
+#=GS A1RWR3_THEPD/75-456 AC A1RWR3.1
+#=GS SC61A_SCHPO/76-459 AC P79088.1
+#=GS A7E5Q2_SCLS1/76-459 AC A7E5Q2.1
+#=GS Q5KC69_CRYNE/75-459 AC Q5KC69.1
+#=GS SC61A_ASHGO/75-460 AC Q752H7.1
+#=GS Q59MJ6_CANAL/76-459 AC Q59MJ6.1
+#=GS A7SJW4_NEMVE/75-458 AC A7SJW4.1
+#=GS A0CFY2_PARTE/73-456 AC A0CFY2.1
+#=GS Q22MG2_TETTH/151-538 AC Q22MG2.2
+#=GS A0CU87_PARTE/77-460 AC A0CU87.1
+#=GS Q7RLN0_PLAYO/121-506 AC Q7RLN0.1
+#=GS Q4QGX4_LEIMA/77-467 AC Q4QGX4.1
+#=GS A5JEK2_NOSBO/75-457 AC A5JEK2.1
+#=GS A2DH65_TRIVA/75-462 AC A2DH65.1
+#=GS Q2QM98_ORYSJ/88-448 AC Q2QM98.2
+#=GS Q6AV46_ORYSJ/86-471 AC Q6AV46.1
+#=GS Q6C854_YARLI/70-454 AC Q6C854.2
+#=GS SSH1_YEAST/78-465 AC P38353.1
+#=GS Q6BT20_DEBHA/78-475 AC Q6BT20.2
+#=GS A5DE75_PICGU/20-414 AC A5DE75.1
+#=GS A3GFV9_PICST/78-476 AC A3GFV9.2
+#=GS A5DWJ5_LODEL/34-436 AC A5DWJ5.1
+#=GS Q5A2C9_CANAL/5-404 AC Q5A2C9.1
+#=GS Q74L41_LACJO/64-372 AC Q74L41.1
+#=GS B3XPQ8_LACRE/65-377 AC B3XPQ8.1
+#=GS A1C3L4_STRPA/70-403 AC A1C3L4.1
+#=GS Q3DVD6_STRAG/65-395 AC Q3DVD6.1
+#=GS A5LN99_STRPN/64-389 AC A5LN99.1
+#=GS A3CM55_STRSV/64-391 AC A3CM55.1
+#=GS Q03HZ8_PEDPA/65-396 AC Q03HZ8.1
+#=GS A5IW80_STAA9/64-384 AC A5IW80.1
+#=GS Q4L9N9_STAHJ/61-383 AC Q4L9N9.1
+#=GS Q5HKR3_STAEQ/61-380 AC Q5HKR3.1
+#=GS Q9RSK8_DEIRA/68-413 AC Q9RSK8.1
+#=GS Q5SHQ8_THET8/71-413 AC Q5SHQ8.1
+#=GS Q5SHQ8_THET8/71-413 DR PDB; 2zjs Y; 71-413;
+#=GS Q5SHQ8_THET8/71-413 DR PDB; 2zqp Y; 71-413;
+#=GS SECY_CORGL/73-424 AC P38376.1
+#=GS A8LB12_FRASN/74-414 AC A8LB12.1
+#=GS Q83NQ1_TROW8/73-424 AC Q83NQ1.1
+#=GS Q8G3Z9_BIFLO/74-421 AC Q8G3Z9.1
+#=GS A7B9M4_9ACTO/72-414 AC A7B9M4.1
+#=GS SECY_CHLTR/73-433 AC P28539.3
+#=GS Q1AU49_RUBXD/70-408 AC Q1AU49.1
+#=GS Q8RIH6_FUSNN/75-411 AC Q8RIH6.1
+#=GS A6DRC9_9BACT/79-428 AC A6DRC9.1
+#=GS C0ACZ0_9BACT/94-454 AC C0ACZ0.1
+#=GS Q1Q157_9BACT/75-434 AC Q1Q157.1
+#=GS A6CGP8_9PLAN/77-435 AC A6CGP8.1
+#=GS B4S5A8_PROA2/73-417 AC B4S5A8.1
+#=GS Q2S3P5_SALRD/75-414 AC Q2S3P5.1
+#=GS A1ZGT4_9SPHI/72-404 AC A1ZGT4.1
+#=GS A6EHP4_9SPHI/71-408 AC A6EHP4.1
+#=GS Q11QD2_CYTH3/72-411 AC Q11QD2.1
+#=GS Q1VTY0_9FLAO/73-421 AC Q1VTY0.1
+#=GS Q1NYZ7_9FLAO/72-422 AC Q1NYZ7.1
+#=GS A5KHP6_CAMJE/62-402 AC A5KHP6.1
+#=GS A4EA78_9ACTN/52-389 AC A4EA78.1
+#=GS Q2GEC0_NEOSM/73-411 AC Q2GEC0.1
+#=GS Q3YRM8_EHRCJ/72-412 AC Q3YRM8.1
+#=GS Q5GSW3_WOLTR/77-416 AC Q5GSW3.1
+#=GS Q0ANS0_MARMM/83-421 AC Q0ANS0.1
+#=GS A7IPQ0_XANP2/80-418 AC A7IPQ0.1
+#=GS SECY_RICCN/70-411 AC Q92GY6.1
+#=GS Q2G8W0_NOVAD/80-430 AC Q2G8W0.1
+#=GS A6E0Q6_9RHOB/73-411 AC A6E0Q6.1
+#=GS Q1UZE8_9RICK/67-404 AC Q1UZE8.1
+#=GS Q3R245_XYLFA/76-424 AC Q3R245.1
+#=GS A4NK90_HAEIN/76-416 AC A4NK90.1
+#=GS Q057C4_BUCCC/64-407 AC Q057C4.1
+#=GS Q8D1Z2_WIGBR/82-424 AC Q8D1Z2.1
+#=GS Q6F7T2_ACIAD/83-426 AC Q6F7T2.1
+#=GS Q6Q8W8_9GAMM/67-407 AC Q6Q8W8.1
+#=GS A9BRX1_DELAS/74-413 AC A9BRX1.1
+#=GS Q7DDS8_NEIMB/73-410 AC Q7DDS8.1
+#=GS Q5NHU8_FRATT/74-416 AC Q5NHU8.1
+#=GS Q7WZR8_9GAMM/64-388 AC Q7WZR8.1
+#=GS A5EX98_DICNV/69-412 AC A5EX98.1
+#=GS Q6MJ32_BDEBA/70-415 AC Q6MJ32.1
+#=GS B5EFS0_GEOBB/71-411 AC B5EFS0.1
+#=GS A3EVQ1_9BACT/75-412 AC A3EVQ1.1
+#=GS Q1MPP6_LAWIP/71-412 AC Q1MPP6.1
+#=GS SECY_AQUAE/71-412 AC O66491.1
+#=GS SECY_AQUAE/71-412 DR PDB; 3dl8 H; 71-412;
+#=GS SECY_AQUAE/71-412 DR PDB; 3dl8 G; 71-412;
+#=GS Q01WB2_SOLUE/74-438 AC Q01WB2.1
+#=GS Q08ZH8_STIAU/26-370 AC Q08ZH8.1
+#=GS A6GCG0_9DELT/70-411 AC A6GCG0.1
+#=GS Q04PV8_LEPBJ/72-436 AC Q04PV8.1
+#=GS SECY_BORBU/72-409 AC O51451.1
+#=GS Q73PL2_TREDE/73-413 AC Q73PL2.1
+#=GS Q67JW3_SYMTH/69-405 AC Q67JW3.1
+#=GS A7FQ38_CLOB1/69-409 AC A7FQ38.1
+#=GS A6LPT1_CLOB8/69-416 AC A6LPT1.1
+#=GS Q0SQG4_CLOPS/69-409 AC Q0SQG4.1
+#=GS A9KJH4_CLOPH/71-425 AC A9KJH4.1
+#=GS A7VH89_9CLOT/71-420 AC A7VH89.1
+#=GS A6BIS2_9FIRM/71-421 AC A6BIS2.1
+#=GS A7VR33_9CLOT/71-423 AC A7VR33.1
+#=GS A6NXF0_9BACE/71-437 AC A6NXF0.1
+#=GS Q250L2_DESHY/70-413 AC Q250L2.1
+#=GS Q8R7X3_THETN/69-402 AC Q8R7X3.1
+#=GS A4XLR1_CALS8/69-419 AC A4XLR1.1
+#=GS A3DJJ2_CLOTH/71-411 AC A3DJJ2.1
+#=GS A8MLG0_ALKOO/69-408 AC A8MLG0.1
+#=GS Q18CH6_CLOD6/69-406 AC Q18CH6.1
+#=GS B8D0S8_HALOH/72-406 AC B8D0S8.1
+A9B431_HERA2/73-422 SVAAMGVYPYITAQIIMQLL................IP.LIPALEQLSKE.GEQGRNRIQRYQYFLTVPLAYLQGYGQIKSLINSGINLFGTLNFS...........ITENFFQTFSILT..IMVSGSMFLVWMGELIDE.RGI.G.NGLSMIIFGGIV.TALPSM................................VY...QAITTSS......................SGNNVIG.........G........ILLLIVTLAT.VVGIVLITEGQRRIPVQYAKR...VRG.......NKVYGGQ..SSH.LPLKVNMAGMIPLIFAQSI..LIFPS...TVASYF.....WNPNGSG.........................FFN...............GVANFFVNSF......................................GPNGLA [...]
+A8CRX1_9CHLR/78-422 SVAALGVYPYITASIIMTLL................TP.VIPKLTALSKE.GEAGRNKINTITHWLAVPTAALAGYSQLLLLQREGAVAQTE...................PLAAVAIVL..SIVAGTMFMVWLGEQITS.YGI.G.NGISLIIFAGIV.AGLPDM................................IG...RGLMASD.........................QFAG.........L........AVYAFMALLT.TVLIVIFTEAHRRIPVQYAQT...VIRS....GKMYRRGG...ESH.IPLRVNSAGMIPLIFASAL..VMLPG...LVASYFMAGSTEDP...............................................NFWNTIYNIFNSGASM.................................PGGLV [...]
+A2Y4E5_ORYSI/132-498 SFFQLGISHQISASIVMQVLFYPLFGPALLFSNGNVLCHVLPSLEKLRKE.GLDGHEKIKGYIWWLSLGFALVAAFTVSCYSLQYSIYAASY..................RVKHVMITSL..FLVLGAMTMTWICDTISE.SGF.G.HGSSLIICVGIL.TGYTDT................................LH...KMLTQFS.....................GNWYSCWH.........Y........ILGIAGTFILVTMGAVLVTEGCRKIKLQYYGF......KLASGARSESSPVTEVEPY.IPFNINPTGMQPLLTTSYL..LAFPS...IMASIF.....GTQFW.............................E...............SLKETLNPKTS..VG..................................GGPWA [...]
+Q7UZW2_PROMP/80-422 GIFALGILPFINASIIIQLL................TA.SLPVLEDLQKNEGEAGRRKIAQITRYVSLGWGFLQSIIFSLILRQYAIEGISET.................AFV..LQTSI..ALVTGSMIVMWFSEIITE.KGI.G.QGASLVIFLNIV.ATLPKA................................LS...STIEKAQ....................TGDRGDVLG.........I........AVLLGVFLLT.IVGIIFVQEGARRIPIVSAKR...QIG........NSSLLPTRQSY.LPLKLNAGGVMPIIFASAL..IFLPI...TVANVT.....GNPIL.............................I...............KIAGSLNPGS.......................................SNPWP [...]
+Q7NKT4_GLOVI/79-416 GVFMLGILPYINASIIMQLL................VP.VFPKLEDLQKNEGEQGRRQIAQYTRYLALGWAIIQSIGVAIYIKPFVADWSPL...................FV..IQTTL..ALTAGAIFVMWLGELITE.KGI.G.NGASLLIFVSIV.SSLPTA................................FS...QTFQLLQ.....................ADSSRVAG.........V........VVLLLVFLAM.IVGIVFVQEGTRRIPIISARR...QVG......PRRQQYQQQQTSY.LPLRVNQGGVMPIIFASSL..LYLPL...TFAQFA.....RN................................A...............TVDQVVNAI........................................SSGWI [...]
+SECY_GUITH/68-404 GVFALGIVPYINASIIVQLA................TN.SIPSLEKLQKEEGELGRQKIVQLTRYVALVWALIQSIGVSFWVRPYVFNWDLN...................FV..FAMSL..TLTIGSMLIMWFSEQITE.KGI.G.NGPSLLIFINII.SGLPKL................................LQ...SQIQSTR......................LNIQALD.........I........FVLVFIFSVM.IIGIIFIQEGIKRIPIISARQ.............LGKGQMDNKTSY.LPLKLNQSGVMPIIFASAV..LVLPA...YLAQLV.....SNEQL.............................R...............TVLHLFDGTS.......................................NNKLL [...]
+SECY_CYACA/62-394 SVFALGIIPYINATITIQIL................SS.AFPALKKLQSEEGEIGKKKLNKITKYLSFCFAFIESLAIVLRLQKYAFDWN.....................LYFIVQTTL..ILISGAMLVMWLADNISY.KGI.G.TGASVIIFVNIA.SAFAKF................................LL...NQLFVHS........................IKFLD.........F........ASYFALIVFS.IACIVFVQEAIRKVPIISAKQ.............LDSTSFYSNDYF.LPLRINQGGVMPIILASSL..LALVD...YVIRYG.....LST...............................L...............QAVYFINDIL.......................................PFKIL [...]
+Q85FU6_CYAME/42-325 GWFVLGIIPTINASIVMQIL................IS.IVPALTRLQKEEGEMGQKQIQKYTRYLTFFLAGIQAFTLSQQ..................................WCTWL..LIVSGAMLVMWLAEQMTH.KGI.G.NGTSIFVCSNIA.ANF...................................LH...HPIEAPW...............................................SLAMVVLIFT.MLGMIALQEAVRAIPILSAKQ...............LIQSIAQVYL.LPMRLNQGGVMPIIFASST..LALLH.................................................................................................................TWSIW [...]
+A0T0J6_PHATR/72-407 GLFTLNIFPYINASILVQLI................LG.FSPKLSKLQKEGDLEGRRSINRLTRLITLMFALIQSVSLALYLKQILFNWN.....................YSLAIEIGL..WLTTGAMIVLWLSELITD.YGL.G.NGASLLIYTNII.SSLPNL................................SK...TILSENS.......................QNFTLG.........S........EIGIVLLIFTSLYGIVFLQEGVRIIPLISSKQ...LNQ.......SSLQDSVTSNNY.IPLRFNQAGVMPIILTTTI..LVVPN...YVNNLG.......................................L...............LPKIDLPINF......................................ESLNFV [...]
+SECY_CYAPA/109-459 GFFTLGILPYMNASFFLQVL................TK.ILPSLERFQKEQEEIAQREFKKWTRYLTVIWAFIQSIVISWIWIRPYALNWD....................FFLGLKVVV..ALTLGAVIVMIIAEQITE.IGL.T.NGSSLLIFINII.ARIPNS................................IE...QLFNSNI..................NWT..FPMISS.........L........ILSLSLSFIT.MFVIIGLQESGRPVPVLIARQ...EAERQKFNEPITEAERRKTQAY.IFFQLLPAGIMPVIFASTIFDLALPA....FTNFL.....LQQG..............................N...............WGYQ.LIKSF......................................PFNSLF [...]
+Q4G351_EMIHU/63-407 GIGSLGILPYINASIIIQLL................TP.LFPNLERLQKEEGELGRQQISRYTRYLTCIWAIVLSSAIAFFLIKPITFGWS....................LKLGLEIVL..SLTVGSILSMWFAELITE.ESL.G.NGSSMIIFINIV.GGIPNN................................LSSLSKTFSAAN......................LASAIPL.........L........LTGLGIYLGI.VLIIIFFQESYKKITIVSAKQLNLTTS......AQTQSERLANNSF.IPLKLNQGGIMPLVFSSTI..AVVFM...YPAQIL............................................................LSSALLTNAAGL..............................ASKLLTI [...]
+SECY_PAVLU/66-404 SILTLGLGPFFSASLAVQFL................VK.LYPAFEKLQNEEGEEGRKTIVRYTRILTVLFCIIESFFLSNSLRSFVFNWN.....................SISYFVVAA..AVTTGSLVLVWLSEVITE.RGI.G.NGSSLLILIGNL.SRFRFLIN............................KDDF...DSLNVSS........................QSNLY.........I........IYIIITLVSM.LIFSTLSQEGARKIPVVSAKQ............LIDGVEDDMRRSY.IPIRFGQAGVVPIIFSSSI..LLFLT...TSIKQL.....PNA...............................N...............IATRVILDSV......................................NLQQIF [...]
+Q6B8X0_GRATL/62-395 GIFALGIVPYINASIMMQLL................TK.LIPELENLQKEEGESGRQKIGQLTRYFTLIWSILQSIGISLWIKPYVFNWNYY...................FI..LDSII..ALGTGSLIIMWFAEIITE.YGI.G.NGASLLIFQNII.SGIPKN................................IQ...NYKINIY......................DKQTIIN.........G........SFLFLLFVLI.LIINILIQECKRKIMIVSAKQ.............LSKFTTSNPRSY.IPLKLNQGGVMPIVFASAT..MALPI...YFSNNI.....EV................................P...............NINNVINLFL.......................................PGRIL [...]
+SECY_ANTSP/62-390 GIFALGIVPYIYASIIIQLL................IK.LIPYLENLQKEEGEIGRQKINQLTRYLTLLWALIQSLSIAIWINHMY.........................LIHLFELCA..SLTTSSMIAMWFSEIISE.YGV.G.NGPSLLIFQNII.SSIPKN................................LQ...NYTFNIG......................TTNTVLN.........G........SLILSFGIII.LIINILIQEGERKIAILSAKQ.............LGKINELNHKVI.FLLKLNQGGVMPFVFASAV..VHTFL...FISNNT.....NS................................................KITQFINLFL.......................................PNQFL [...]
+A4RW47_OSTLU/65-398 GIFSLGIVPYINSSIIFQLL................GS.VFPELKKLQKEEGEAGRRKFQQYQRYGALGFAIVQAVGQCLYVRPFVEDFTPI...................WL..FEQSC..ALTAGAMILMYIGELLNE.IKL.G.NGTSLLIFANIV.SALPSS................................VG...QTVSMAQ......................EKGDSSV.........L........AVFFGAFALT.TLGIVYVQEAERKIPMNYSTR..............FNAGGLAKSSY.LPFKVNSAGVMPIIFASSL..LALPA...TLTRFT.....DNGAV.............................L...............GVARFLSP.........................................GGGAG [...]
+A7PFA4_VITVI/131-465 GICSLGIVPFINAQIVFQLL................TQ.IYPKLQDLQKREGETGRKKVLQYTRYASVGFALVQAIGQVLFLRPYVNDFSTQ...................WV..LSSVT..LLTLGSVLTTYIGERISD.LKL.G.NGTSLLIFTSII.SYLPAS................................FG...RTVAQAF......................QDGNYIG.........L........VIIIISFFLL.VLGIVYVQEAERKIPLNYASR............YTNKSGGLQKSTY.LPFKVNSSGVMPIIFSTSS..LALPG...TVSRFT.....GLAAL.............................K...............KAALALN..........................................PGGSL [...]
+A7HM32_FERNB/75-404 SVFSMSVTPYINASIIMQLL................AS.IIPSLKELLKE.GEEGRKKFQHYTKNLTLGLAALQSFVVSFGLARSYQGIIAIN.................TWLFSFVSTV..SLVAGTMFLLWIGDRITE.KGI.G.NGVSIMIFAGIV.SRYPAY................................FR...SAVLG.........................NLNIFG.........W........IFLIAVAIFM.VVAIIYVQQAERRIKIEYATR...MVGR.....RIY..GGT..STY.LPIKVNHSGVIPIIFAWAI..ISIPE...AIAQIT.....GA................................Q...............WAIKLFS..........................................MQSPL [...]
+A3CK84_STRSV/69-416 SVFALGVSPYITASIVVQLL................QMDLLPKFVEWGKQ.GEVGRRKLNQATRYIALVLAFVQAIGITAGFDTLSRANLVAN................PNVQTYALICV..LLATGSMIVTWLGEQITD.KGY.G.NGVSMIIFAGIV.SAIPDMIK............................GIYE...DYFVNIP...................SERLTSSFIF.........V........GILIVAVLLI.IYFTTFVQQAEYKIPIQYTKV................AKGAPSSSY.LPLKVNPAGVIPVIFASSI..TAAPA...AIFQVV.....SALGYD...........................AD...............WVKTAQSLLA.......................................TTTIS [...]
+Q5FM71_LACAC/68-415 SIFSLGVSPYITAQIVIQLL................QMDIVPTLVEWGKQ.GEVGRRKTNQVTRYLTLVVAFVQSIGITLGFNALTQMGLVKNQ..............TPQTY..VEIAI..IMTAGTMLLTWLGDEITD.KGL.G.NGVSVIIFAGII.ARLPSGLW............................QIYK...EEIINNS..................ASDR.WQGILF.........F........IAVIVAILIV.TQLVTWVEQADRRIPIQYTRR...ATI...........SGS..ESF.LPLKVNVSGVIPVIFASSF..IITPA...TILMAF.....QRTQGD...........................QQ...............WFKV.LNQIF......................................SLQTTP [...]
+Q03ZM6_LEUMM/68-416 SLFAMGVSPYVTAQIIVQLL................QLDIVPRFVEWSKQ.GEVGRRKLNNATRWLTLVLAFVQSVGITAGFNSLSSYGLVSQT...............NSVM..SFVVIGSVMTIGTFFAMWLGEMITE.KGL.G.NGVSMIIFAGII.AQAPEGFY............................EIFK...ENILQAD..................SSDM.LNGWIF.........V........VVLVIAMILV.VAFTTWSYEGTRRLQMQYTRS...ATS...........YGS..EAY.LPLKVNVSGVIPVIFASSF..ISTPQ...TVMLAF.....QDKYSS...........................AQ...............WYQI.MQQIF......................................SMTTLP [...]
+SECY_STAA8/69-413 SIFAMGIVPYITASIVMQLL................QMDIVPKFSEWAKQ.GEVGRRKLNNVTRYLAISLAFIQSIGMAFQFNNYLKGALIIN................QSIMSYLLIAL..VLTAGTAFLIWLGDQITQ.FGV.G.NGISIIIFAGIL.STLPAS................................LI...QFGQTAF.................VGQEDTSLAWLK.........V........LGLLVSLILL.TVGAIYVLEAVRKIPIQYAKK.............QTAQRLGSQATY.LPLKVNSAGVIPVIFAMAF..FLLPR...TLTLFY.....PDK...............................E...............WAQNIANAAN.......................................PSSNV [...]
+Q4MG72_BACCE/68-415 SIFAVGITPYITASIIVQLL................QMDVIPKFSEWAKQ.GEMGRKKSAQFTRYFTIILAFIQAIGMSYGFNNIAGGQLITD................QSWTTYLFIAT..VLTAGTAFLLWLGEQITA.NGV.G.NGISMIIFAGLV.AAIPNVAN............................QIYL...QQFQNAG....................DQLFMHIIK.........M........LLIGLVILAI.VVGVIYIQQAVRKIPIQYAKA...VSGN....NQ....YQGAKNTH.LPLKVNSAGVIPVIFASAF..LMTPR...TIAQLF.....PDSSIS............................K...............WLVANLD..........................................FAHPI [...]
+Q6F1X5_MESFL/92-454 SILALGVSPYITASIIVQLL................STDVVPILTRWNKS.GERGRKKLDKLTKVLMIPFALMQGIATIFTLQQQGV.....IEPGWSSD...NVLASPAFYY..VLVPL..VMLAGSYFMLWIADQITI.KGV.G.NGISIVIFIGII.VQLPNQIK............................ATYD...FWIPSNE..................SINVFFDGIIK.........F........SIYMLVFFVV.IFSVVLMNEAERKVPIQQTGS...GLI...........DSKDHTPY.LPLKLNNAGVIPVIFASAL..ISTPI...TIAQIIDPTASTSTVDS...........................AN...............AFVRFTQHYL......................................SFNTWW [...]
+Q6KI36_MYCMO/87-436 SIVALGISPFITASLVMQIL................QTKLFPPIYRLSQS.GPIGRRKINIITRAITIFLGVVQSMTIVSALSAQNSFISLTNEF.............NVFWYQFIILPV..ILIAGTVFSIFIGDQITD.KGV.G.NGTTLLIFTGIV.ITLPTQFT............................ATFN...ALVGEQQ..................RVSSLSNGIVT.........F........ISYVFGFIIL.MYIIGFVYNAERRIPIQQVGA...GRA...........KNEKELSY.LPIKINPGGISPIIFALII..ISFPQ...LFASVF.....PISNPF...........................RI...............WVESNLR..........................................PNNTI [...]
+Q4A5I3_MYCS5/83-437 SIFALGISPFINASLIMMIL................QSRLFPMIYKLTQS.GPQGRRKLNIATRILTFIIAYPQAVFLTKSLTAGERNSSFITLVSI........DGFSVDLLVYFLLPM..ILISASLFALFLSEQITN.KGV.G.NGTSIIIMTGIA.ARLPFQMQ............................NAFK...IFVGDLS...................QSGTLVGILN.........F........VTYIFIYLAC.LMVIGIFYNAERRIPIQQTGA...GRS...........KALKEIGS.LPIKLNPAGIMPIIFAMLV..LSLPT...LIANIL.....PNDNYS...........................KQ...............WINENLQ..........................................FYKPL [...]
+Q98Q01_MYCPU/90-438 SIVSLGINPFITASLIMTIL................QSKLFPPIQKMSQS.GPLGRKKINVITRLLTLVFAFPQAIVLTQTLSRENGFISIDQEF.............KTIANIYVLLPL..ILVAGSLFTLFLSEQITD.KGI.G.NGTSLIIFSGIS.LSLPSQFR............................AAFN...VLVGTNK....................TTLFTGLIH.........F........LLYLFGYLLL.IVIIVFVYLAERRIPIQQTGA...GLS...........KNIKEMGS.LPIKVNPAGIMPVIFSMIV..ISFPL...LIAGLL.....DRSTSLV..........................RL...............WIERHLA..........................................FTHPI [...]
+Q4AAF9_MYCHJ/85-434 SVVALGISPFITASLFMLIA................QTKLFPPIHRLSQS.GPAGRRKINIITRFLTLLVAVIQAVVLIRTVILNPDYGFVRLEI.............NTPVFIWLVLPL..VLVAGSLFSLFLAEQITD.KGV.G.NGTSLLIFSGIV.VGLPRRFQ............................HAFE...YLVDLSF...................SSSLISQVLS.........F........ILYIFGFLLI.LLIAIYVYLAERKIPIQQTGS...GMS...........KNIKEISI.LPLKLNPAGIMPVIFALII..VSLPT...LFSGFL.....DRNTSAV..........................RN...............WIDNNMQ..........................................IYHPI [...]
+Q9PQP1_UREPA/76-434 SLFAIGIGPYITAQIIMQLL................SSELVPPLAKLSKS.GERGRKKIEVITRIITLPLAVMQAVIIINLMTRANG.....FISIVSNA...PFAIGSPLFY..VTYIF..LMVGGTYISLFLADLISK.KGV.G.NGITLLILTGIV.ASLFNHFI............................AIFS...NLGSLTS.....................SKVSQIIG.........F........ILYILFYIMI.LIGVVFVNNSTRKIPVQQTGQ...ALI...........LDHEKLPF.LPIKIMTAGVMPVIFASSV..LAIPA...QVAEFL.....DKQ...............................S...............MGYYVIHNYF......................................IVDSWT [...]
+SECY_MYCGE/81-430 SLFAVGISPYISAQIIMQLL................STDLIPPLSKLVNS.GEVGRRKIEMITRIITLPFALVQAFAVIQIATNAGT.....GSSPIS......LANSGSEFI..AFYII..AMTAGTYMAVFLGDTISK.KGV.G.NGITLLILSGIL.SQLPQGFI............................AAYN...VLSGIVI..................TLTPQLTAAIS.........F........FIYFLAFLVL.LFATTFITQATRKIPIQQSGQ...GLV...........SEVKTLPY.LPIKVNAAGVIPVIFASSI..MSIPV...TIAQFQ.....PQT...............................E...............SRWF.VEDYL......................................SLSTPV [...]
+Q8EUD2_MYCPE/81-433 SFMAIGVSPYITAQIIVQLL................SSDLIKPLTRLSKA.GERGKRKLEIITRLITIPFAIMQAYAVLSLAGTQGLVSSFFGQSA..........LSSVPAGQIILLLL..GMTAGTYLTIFISDIISK.RGV.G.NGVTLIILSGIV.ASIYPNFT............................SVFQ...VLTGSSQ...................ISNQLLRYFS.........F........AVYLVFFFLI.LLATTFVNGSVRKIPIQQIGQ...GLS...........KEVDEMPY.LPIKLNAAGVIPVIFASSI..MTIAP...TISQFL.....PSG...............................S...............AGSEFINEYL......................................SIERPV [...]
+Q7X4E3_9MOLU/69-399 CILSLGVIPYVTASIVIQLS................QK.VFTFMKEWQEQ.GEKGKRKINIVTRVLTIFLSLGHGWALCQTEKLVLG........................PYLLFSTLF..FLTVGVFISIWLADLITS.KGL.G.NGISILIAVGMV.DKLFKT................................FK...YLLSNSN.......................GFETQR..................ILILVSYFVL.LILTIILSSAYLKIPINYAXN................RNNDKIDKY.IPIKLNTSGILPIILADTL..LNVIQ...QISMLF.....SKNG..............................................KVNEYIGIFVE..SR..................................SELGI [...]
+Q5Q069_ASTYP/59-398 TLFGLGITPYITASIVVQFL................QK.LLPICREWKDQ.GQMGKRKLNLLTRSLALFFAFGQSFAFLNSYSKLLVTSIS....................TRQLFLLAL..IATAGVAILIWFADLINS.KGI.G.NGTSILIVVSMS.HSLINLFA............................NLNK...SYLSKNT.....................FLTLKTFN.........F........ACIVLLLLLF.LIFTVVVQITSLKIPINYARN..................QSQGKSY.IPLKINSAGVMPVILAFAL..LQPFQ...ILAGVI.....GN................................D...............KLTKYVNLFTNTNSSN.................................NQINF [...]
+O21257_RECAM/57-372 SLFALNITPIITYLFLEQLY...................YIYSIPLISKK.KNLNKDLIKKYSVYIFLMISYLEGFIYLNHLYNTTSSSFLIFY..............LDNTINYLLCLN..FLVIGSCFLYFFAKLINI.YGI.G.KGLSFIIFINIV.GSFIDI................................FY...KYLIQIE.......................TLNVKY.........L........VFLLFVQCLFCGIIYFYIDFLFLKIPIIKLNF......VG..NENDNYNYLNYFQKY.QTSSLNLLGILPFILVYSIIYMLKLNLNSFLDLVF............................................................................................................. [...]
+Q74NB9_NANEQ/69-457 SIVSLGIGPIIIGYLLAELF...................IGSGELNIDIT.TEEGKRKFENLARFFMIVFGLFESIVMA.TIGWFKPSQFLISLFAMPFSFLGSNAFLIGYILAVLFIVA..QLMLGVILAYLLDDLSQK.WGF.T.SGINLFILATVS.RELFVQLFNPLTQIP..............GTPTPPIGKIP...QIFYFIS...................QGLYTEAIVV..................GLQLLVIVLV.ILLSVYFYMVKIPIPTSFGKI...................PEKSLR.YEVRLIYTGNIPVIFAFAF..LHQIL...LIAWVL.....QQLGIPLLG.....................TIENG...............HPINGLVAYIYPDTGFLISLILG...................NLTLDNLIRTIT [...]
+Q2EMT2_METVO/30-379 TLITLGIGPIVTAGIIMQLL...................IGSELVKLDMS.KPDNRALFQGLQKAFGIFLCFLEAGMFV.LAGAFGALT......................PMMSLALIL..QLAIGAILLIYLDEIVSR.YGI.G.SGIGLFIAAGVS.QTIFVGALG.........................PQGYLW...KFFSALV...................SGSMGPALEY..................ILPILATIAV.FFVVVYAESIRVEIPLAHGRV...................KGAVGK.YPIKFIYVSNLPVILAAAL..FANFQ...LWGLVL.....YKIGFPLLG.....................TYSNG...............RAIDGIAYYFS...T.PYGLS......................SVISDPIHAIV [...]
+A5UL65_METS3/72-433 SILTLGIGPIVTASIVLQLL...................VGSKLLDLDLS.SPEDKSQYQATQKILSIVFTMFEAGVLV.LTGSLVPIDNS....................YL..GVLFL..QLVIGAILIIYLDEVISK.WGF.G.SGIGLFIAAGVC.EAIIVGTFSFIPG.................PGGVYGGAIP...AFIQSFW.......................SSSIDF..........S......VLIPLIATAAV.FFVVVYGESMRVEIPISHGSV.............RGHGRIRGSVGK.YPLKFVYASNMPVILTSAL..LVNVS...LLASVF.....QKIGFPILG.....................EIVNG...............KAVSGIALYLS...T.PNDVS......................LLVTDPVRVIV [...]
+SECY_METTH/73-436 SILTLGIGPIVSASIILQLL...................VGGKILKLDLS.RHEDKAFFQGLQKLLAIVFTFFEALIFV.LTGSLAPSAPQF..................V....WVLIL..QLTIGGILIIFLDEVVSK.WGF.G.SGVGLFIAAGVS.QEIIVGAFNPLSAP...............TQPGVPAGRIT...GFLYLLF...................TGQSPDFQYY..................VLPVLALIAV.FLVVVYAESMRVEIPISMGGG...............KRLSRGAVGK.YPLRFIYASNMPVILTSAL..LLNVQ...LLANVF.....QKLGYPILG.....................TVSNG...............QAVDGLAYLLT...A.PRSID......................ALILDPFRVVF [...]
+SECY_PYRAB/72-448 SILTLGIGPIVTAGIILQLL...................VGSEIIKLDLA.NPEDRRFYQALQRVFSVFMCFLEAAIWV.LGGAFGRVGVDV..................TYAIAALMIL..QLAFGGIILIVLDELVSK.WGI.G.SGISLFIAAGVS.QRILTRSLNPLTDPNII.........DPLTGKPAIVGAIP...YFIQHIL....................KGDLKGALYR......GGTA.....PDMMAVIATIIV.FLVVVYFESMRVEIPLGYRGV....................TIRGR.YPIRFLYVSNIPIILTFAL..YANIQ...LWARVL.....DRLGHPWLG.....................TFDPT.T............GNPVGGFVLYVI...P.PRSIF......................TVIDNPVRALV [...]
+Q8TZA9_METKA/75-435 SILTLGIGPIVTASILLQLL...................VGGDLIKLDLT.NPEDRRLFQGLQKLLAIVLCFFEGVMMV.FSGAAPPAEPS....................ILLEILLIL..QLALGGILVIFLDEVVSK.WGI.G.SGVGLFIVAGVS.SQIIIGAFNPLPSP...............QQPGRPAGAVW...AFLYSAM.....................QGTPDWTL..................LAPVIGAIIT.FLIVLYVEGMRVEIPIAFAGI...................RGARGR.FPVRLLYTSNIPVILASAL..FMNVR...LWALAF.....QRMGVPILG.....................KLDPR..............GQPISGLVYYLS...P.PNSIV......................KTLSDPLQALG [...]
+Q9HIT0_THEAC/82-514 SLMDLGIGPIVTASIVMQLF...................VGAKIFNLDLQ.NAEDKAIYQGVQKLLVIIMIFVEAIPQA...FGYLVPDTKVVNSINA......VFPGYGEFLAQTIIIL..QLFFGSYLVFLMDEVVSK.YGI.G.SGISLFIAADVS.EQLFIGAFNWQALNNAL..........TYSLTNPPAGAFP...KMFYIIMHSS...........SSYLLT.NGVVQILF........SPP.....NPMIAVLGTLLI.FFLVAYFQSSKIELPISHERV...................RGARGR.YPLQLLYASNIPVILATAL..LANVS...MWTLLF.....WSSPVLSKVPILGH...........NPLLGSYPTT.AQATA...LNISATTPTGGLAYYLF...S.PNGLSDWLFPILQPS...GYQNILLGHTPLQEAIHIIV [...]
+Q2QAQ7_9EURY/161-583 SIMHLGIGPIVTGSIIMQLF...................AGAKIIKLDLG.DSDDKQLYQGVQKILVLIMIPVESIPQV...YGFLDASPALVSD.............FGQGWANAIIVS..QLFIGSLLVFLLDELVSK.WGI.G.SGISLFIAAGVA.QSTFVGTLSPLAVNPG...........AYGLQNPPAGTLP...MIFYTLRTAT...........FSEMVTANGFESILLGD.....AAHP.....NAVVALFSSVVV.FLVVAYAESSKLELPLTHGKV...................RGHRGQ.YPIRLVYASNIPVILMAAL..LANLN...MFTLLF.....WSHPTMSTVPILGSQGA.....WSIAPYLGSYDVG.Q............TQATDGFAWYAS...M.VNGVGDWLLPLLN......QSPDPYGHSLWQVVLHVIT [...]
+Q0W1W5_UNCMA/75-487 SIILLGIGPIVMASIVLQLL...................VGAELIPLDTT.DPKDQAIFQGLQKLMVFVMIVVEALPQI..YGGFLLPDPAIAATL...........GVSTGIIQLLIFA..QVALGGVLILYMDEIVSK.WGI.G.SGVSLFIVAGIA.QALVGGIFNWNPPYPGQAMGLNVDIAGLGARENLPIGIIF...RWEWLLNNIG...........LSQLLTGENLIVLLY..........Q.....GEILALLATIII.FLLIVYVESTRIEIPLAHAAV...................RGARGK.FPVKLIYASVLPMILVRSL..QATLE...MVGLLL.....YRNGITFLGT....................FNQYN...............QPVDGLMFYIN...P.INGLSDWVPQLA........ALNYPGIQLWQIALHVFT [...]
+SECY_ARCFU/73-471 SIIALGIGPIVTASIILQLL...................VGAGIIKLDLT.NPEDRAAYQDFQRFLVFVMIAVEAIPQI..AGGLLKPDLNLAAQL...........GVSPGIISFLIFI..QLFIGGVLIVYMDEVVSK.WGI.G.SGVSLFILAGIA.QSIVVGLFNWVIPP................NSAMPAGIIP...RWIWIAQNYP...........LDQLFTGSGLAFLLI..........Q.....GGILALITTAAI.ILLVVFFEGTRVEIPLAHAVA...................RGARGR.FPIKLIYASVLPMIFVRAL..QANVV...ALGQVL.....HARGVTIFG.....................EFVNG...............KAVSGLMFFLQ...P.VSSPYDWIPSLVKS.....QGAAFAAIPDWMIYLHLLI [...]
+Q8TRS4_METAC/72-470 SLVLLGIGPIVTASIVLQLL...................VGADIIKMDLS.DPKDQAFFQGAQKFLVFVMIILEALPQL..LGGYIQPDPGLAATL...........NVGLGVITLLLLV..QIFIGGTLILFMDEVVSK.WGI.G.SGVGLFIVAGIS.QQIVTGIFNWEFE..................EGLPVGLIP...KWIYIAQNTG...........ADYLFSGEGLMFLLV..........R.....GGILALLSTVAI.FLLVVYVESTRIEIPLAHSAV...................RGARGR.FPVKLIYASVLPMILVRAL..QANIQ...MVGIIL.....ASRGITFLG.....................EFSGS...............KPLNGIMYYLA...P.IHSPYDWIPSLVRES...FASYGATAPAIWQIGLHVLA [...]
+A0B9U7_METTP/75-515 SLMLLGIGPIVTASIVLQLL...................VGAEIIKLNLR.DPRDQAIFQGTQKALVFVMIVVEALPQI..TGGYLLPDQALATSL...........GVSLSIISLIIFL..QVCLGGVLILYMDEVVSK.WGI.G.SGVGLFIVAGVS.QQLVTGLFNWATG.................DGGLPIGIVP...KWISIIRLGLI.........GLDEIFTAEGLKFIFV..........T.....GGLLALISTVGI.ILLVVLVESTRIEIPLAHSRV...................RGARGR.FPVKLVYASVLPMILVRAL..QANIE...MLGALL.....TAKLGTVTTAETTAEGVRIVYTGYQSWLGTFLSSAKFDAATGAPISATSPQPVSGLMYYLS...P.IHGPSDWIPSMVSQSTPGLVELGINPIAGWQIWLHLLT [...]
+SECY_HALMA/73-468 SIMQLGIGPIVTASIVLQLL...................GGADLLGLNTQDDPRDQILYQGLQKLLVLVMICLTGLPMV.FAGGFLPADTAVANSL...........GIGTAGVQWLIFA..QMFVGGVLILFMDEVISK.WGV.G.SGIGLFIVAGVS.QRLVGGLLTAPF...................LGNSEGIIY...TWYLFITGERG..........TGPVLAADGLQTVLL..........Q.....GELLGLFTTVLI.FAVVVYAESVRVEIPLSNARV...................KGARGR.FPVKLIYASVLPMILVRAL..QANIQ...FLGRIL.....NAQLGSMPAFL..................GTYANG...............QPTGGLFYFLA...P.IQSRGDWMWWL...........EGTAQPVWQILTRVGI [...]
+Q2FSG8_METHJ/73-458 SIVHLGIGPIVTASIVLQLL...................KGADLIHIDTS.EIRGQIQYMGLQKLMIFIMIVVEALPMI..VGGFLKPDPAIASAL..........FGGNSGVLAILIFI..QICIGGVLIFLMDEVVTK.WGI.G.SGVGLFIIAGIS.EAIINGFINWAPV.................NDMYPVGFFP...RLFAVVL.....................DGANFIQY.........FG.....TDLIAFITTIAI.FILIVYVESTRVEIPLAHTQV...................RGARAR.FPVKLIYASVLPMILVRVL..QANVQ...MIGLFL.....NNIGITIFG.....................TFEGQ...............TPTGGLMWYLA...P.INHPSDWMWWMP.........SYVGGHAPWEVLIRLGI [...]
+A2SPM5_METLZ/73-458 TILHLGIGPIVTASIVLQLL...................RGADLIKINTS.DQRGQVLYMGLQKVLIFVMIILEALPNV..LGGWMSADPAVSAFF...........GGNAGFVMLLIFL..QICIGGVLVMFMDEVVSK.WGI.G.SGVGLFIVAGVA.QGLINGFFNWEAT.................TDQFAVGFFP...RLFQVIA.....................DGSNFIEY.........FG.....LQLLALVTTVGL.FFIIVYVESTRIEIPLAHANV...................RGARSR.FPVKLVYASVLPMILVRVL..QANVQ...MIGMFL.....SSIGFTALG.....................EYNGS...............TPINGLMWYLA...P.INQPQDWMWWLS........SFTGTGHAVWEVILRVGI [...]
+A0RUE4_CENSY/79-457 TLVELGIGPIVTAGLLMQLL...................RGSEILKFDFK.KPEERGIFQTATKMVSYVVIVVESSIYGIAVYGPGIADPS........................VLYILIGQLMASSIIIMFLDELIQKGWGL.G.SGISLFIMAGVA.QQILWSLFSPLPA.................GDGFAVGIFP...FIGQWAS..................VGMGNFEDIFFR......YNQL.....PSIFGLLLTGGV.LLILVYTQGMKIEIPIVSTKY...................RGFSAT.YPIKLMYVSNIPVILASAL..TANAI...FIGQMF.....WSNFNPRNDNIFL.............NVLAQFDLT.N...........PSTPIGGIVYYIT...P.PRGLD......................IAALDPMRAVG [...]
+A8ME75_CALMQ/77-461 TLAQLGIGPIIIAGIIMELV...................AFSELMDVDLN.DPKDQARFTALTKLVAVIIAMFEGAFIM.STHQLTVAN......................AGLAFIVWL..QMLFGAVIVILLDDLISKGWGI.G.SGISLFILISII.RSIFQSTFMPVTV.................GAGELLGIIP...ALVAAVYSA.............AVSHTLAPLLSIVYR.......FNL.....PGLIGLIATIVL.GGFIAYVELMEVRIPLSFVQY...................GGYKMS.YPFKVMYVSVLPIIFTAYT..VALIYNGLYFIWTTYNPHNANALLNSIACIR...............VITTAKFG.TI..........NEPCPSSLIYYFT...V.VPY..........................NITPQYVVV [...]
+A3MUZ2_PYRCJ/70-435 TLAHLGIGPIVIAGILMEVF...................AFSGVLNLDLN.KREDRLKFTLMLKWAALGIAALEATAYV.LGGQFGTVT......................PLGGVLIVL..QLLLATVIILLLDDLMSKGWGI.G.SAISLIIFLGVS.RQIFLSLFSWDTVQD.............SNGNTQVFGLLP...ALGVALYDL.............FTSGNANTLLGLVNRPL..TVNTYL.....PDFVGLVATILL.GYIILYLEMMKVNIPVASAQY...................RGIKFT.IPLRFVYVSVLPIIFTTYS..LLLVG...................QLLQ.....................PFAAN.N............PALITVLNVIFL...P.HRY...........................FDPLLIIL [...]
+SECY_SULSO/73-449 TLAQLGIGPIITAGLIMQIL...................AGSKLISIDLN.DPDDRVKFTEAQKGLAFIFILVESALFGYVLARTSTTINASIL..............FIA....GIVIA..QLIVATYLILLLDELIQKGWGL.G.SGVSLFILAGVM.KIMFWDMFGIASVS................SQNLPIGFFP...ALFTALA...................SHSDVLNLIVNTSTKNLFQ.P......DLVGLVTTIAL.IIITIYLTTMTIEIPVTSQKL...................RGIRRT.IPLNFLYVSSIPVIFVAVL..GSDIQ...LFASLA..........SYVS.....................PSASN..............ILNTVSGVFFFPPPNSAIPHSIY.....................AVVLDPLGALE [...]
+SECY_SULAC/74-443 TLAQLGIGPVITSGLIMQIL...................VGSKLINVDLT.TQEGKSKFTQAEKALALIFIIVESSLFGYVFTRATSNILLP.......................IIVVV..QLIIASYIILLLDEMIQKGWGL.G.SGVSLFIMAGIM.KVIFWNMFGIVSVQ................SQNLPVGFFP...LLVSYIT...................SGRNLQEIVLNTSSTTPYQ.P......DLIGLIATVGL.TILIVYLVNTNIYIPVTTQRL...................RGIRTT.VPLNFLYVSSIPVIFVSVL..GADIQ...LFASLA..........NSIS.....................NSASG..............ILTDIANAFFFP..PQGVPHSVY.....................ALVVDPVGAAI [...]
+A2BME2_HYPBU/73-444 TLMTLGIGPIVTAGIVLEVL...................VGGKLIELDLT.KPRDRKIFMGAQRTLALLFALLEAAAYV.IGCRFWISAFASSPEV..........CPPISTAVKIIVVL..QLVFATLVLMWFDEMIRNGWGI.G.SALSLFIVASVV.KGLFWQLAGSTKVAT.............PEGQPVYYGWLA...HVVSTGD.......................LGVLRR.........GM.....PDMVGFLATIAI.IMVLIYFQLMRVYIPVTSPRY...................GSIKTR.IPLNFIYVTNIPILFVAIA..VSDIK...VFEIVI.....ASLLGADN........................PLV...............RGMDVLYNYVS...P.PRGLL......................AAVADPLRTLT [...]
+SECY_AERPE/73-434 TLMELGIGPIVTASLIIQVL...................VGAKIIKLDLA.DPEGRRKFTSAQKVLALAFAALEAVAFT.VGGRYWVGTAIEP.................GPLDYALVSL..QLFLGALLVIYFDEVMQKGWGI.G.SAISLFILAGVA.QGVVWSIFGTIPG..................VAQDYGLVP...AIISNPD.......................LTLLARP.......NGF.....PDLTGFFTTLAA.IILLVYLQAMRVEIPITSERF...................KGIRSR.VPLQFIYVTNIPILLVGIL..VSDLL...LVQRLL.....ADYLGVES........................RAY...............QIYSSIVYYLS...P.PRGVV......................QSIADPVKTAV [...]
+A1RWR3_THEPD/75-456 TLIELGIGPIVTSGIVWELL...................VGSRIVNLDLT.TPEGRRTFAGLQKLTAFLFAALEAAAYI.LGGVYGALT......................QQQQIIVFV..QLFVASTFVILMNDMLEKGWGI.G.SAVSLFIAAGVA.QQIFWELFSPIGPL................GDGLYYGLFP...SLFSALV.................SGNSTLLMHVVVR......PSGY.....PDLVGFVGMVVM.LLLLTYMESMKITIPVSSVRF...................GGAKTR.IPLKFLYVSVMPVILVGAL..YANVV...MFTQAL.....WPRVNPGNQNPWL.............NVIAKYNYT.EY.........GPVPLPGSFVYYIS...P.PRSLA......................SALADPVHLVV [...]
+SC61A_SCHPO/76-459 TLMELGISPIVTSSMLVQLL...................VGSQLIEVNME.LKSDREMYQLVQKFLAIIIAFGQATAYV.LTGMYG......RPQD...........LGAGIC..LLLIL..QLAAASLIVLLLDELLQKGYGL.G.SGISLFIATINC.ENIFWKAFSPTTYHI..............ANGVQFEGAVI...NFVYVMFT...............WDNKAAALYQAFFRSGLTSSQIQL.....PNLWNFFATLLV.FGVVIYLQDFRVEIPIRSQKF...................RGYRST.FPVKLLYTSNTPIMLQSAL..TSNLF...FASRLL.....FNRFSSNFLVR.................FLGVWEQ...............TATSGLSYYLS...P.PASFQ......................DALIDPIHTLV [...]
+A7E5Q2_SCLS1/76-459 TLMELGITPIISSGMVFQLL...................AGTHLIDVNLD.LKADRELYQTAQKLFAIILSMGQATVYV.FTGLYG......QPSD...........LGAGVV..CLLIL..QLVVAGLIVILLDELLQKGYGL.G.SGISLFIATNIC.ESIIWKAFSPTTINT..............GRGPEFEGAVI...ALFHLLLT...............WPNKQRALQEAFYR.......QSL.....PNIMNLLATIVV.FAAVIYLQGFRVEIPVKSSRQ...................RGARGS.YPVRLFYTSNMPIMLQSAL..SSNIF...LISQML.....YSRFSENLLVQL................FGVWEPK.EGS........AQLFATSGIAYYMS...P.PLNFT......................DALLDPIHTAV [...]
+Q5KC69_CRYNE/75-459 TLMELGITPIVTSGMIMQLL...................AGAQLIDVDFS.LKDDRALFGAAQKLFAMIISLGQATVYV.LTGLYG......SPSS...........LGAGVC..LLLIL..QLVSASLIVILLDELLTKGYGL.G.SGISLFIATNIC.ESIVWKAFSPNTVNT..............GRGPEFEGAII...ALIHLLFT...............WNDKTRALKEAFYR.......DRL.....PNIMNLLATVAV.FAAVIYLQGFRIEIPIKSSKM...................RGQRGT.YPVKLFYTSNMPIMLQSAL..TSNVF...LVSQML.....AGRFPDNLLVRL................LGVWEPM.ENN.......PTQLGAVSGIAYYMS...A.PHSLT......................SALKDPFHTVI [...]
+SC61A_ASHGO/75-460 TLMELGVSPIITSSMIFQFL...................QGTQLLQVNLE.SKQDRELFQIAQKVCAIVLTLGQAIVVV.LTGNYG......SVSN...........LGIAIS..LLLIL..QLVFASFIVLLLDELLIKGYGL.G.SGISLFTATNIA.EQIFWKAFAPTTVNN..............GRGTEFEGAVV...ALFHLLSV...............RKDKKRALVEAFYR.......DYL.....PNMFQVLSTVFV.FLFVLYLQGFRYELPVRSTRT...................RGQVGS.YPIKLFYTSNTPIMLQSAL..TSNIF...LTSQLL.....YQKFPNNPIVKM................LGVWGTR.SDAP......YSPNAAISGLSYYIQ...P.PFSFT......................EALLDPIKTVV [...]
+Q59MJ6_CANAL/76-459 TLMELGISPIVSSGMLFQLL...................QGTKIIHVDMQ.NKNDRETFQTAQKLLAILLAVGQATVYV.LTGMYG......PPSS...........LGVGVC..SLLIL..QLVFASTIVILLDELLQKGYGL.G.SGVSLFTATNTC.EQVFWKAFAPTTSTS..............AKGTEFDGAVV...AMFHLLGS...............RKDKKRALIESFYR.......PNL.....PNMFQLLATLLV.FFAVVYLQGFRIELPMKSTRQ...................RGPYGS.YPIRLFYTSNIPIMLESAL..ASNIF...IISQLL.....FMRWPNNLFVKL................LGTWDAR.AGS........SQLYANGGLAYYIQ...P.PFNFT......................DALLDPIKTTI [...]
+A7SJW4_NEMVE/75-458 TLMELGISPIVTSGLIMQLL...................AGSKIIEVGDT.PK.DRALFNGAQKLFGIIITIGQAVVYV.MTGMYG......DPSD...........LGPGIC..LLIII..QLFCAGLIVLLLDELLQKGYGL.G.SGISLFIATNIC.ETIVWKAFSPATINT..............GRGTEFEGAVI...ALFHLLAT...............RTDKVRGLREAFYR.......QNL.....PNLTNLIATIFV.FGIVIYFQGFRVDLPIKSARY...................RGQYSS.YPIKLFYTSNIPIILQSAL..VSNIY...VISQMM.....SAKFAGNFFVNL................LGTWEEA.GGG.......PARSYPVGGLCYYMS...P.PETVS......................HIIEDPVHACI [...]
+A0CFY2_PARTE/73-456 TLMELGISPIVTSGMILQFL...................SGVGFIEVNHS.VREDKVLFNAAQKLLSFIMAIAEGMAYI.WSGAYG......DINQ...........IGAGNA..ILILL..QLTFAGVIVTMLDEMLQKGYGL.G.SGISLFIATNVS.ENILWKSFSPITLST..............EAGTQFEGAII...NFFHLLFT...............KQNTLQALYYAFFR.......ESA.....PNLNNLLATLFV.ISLVIYLQGFRVEVPLASQKI...................RGLVSS.HGIKLFYTSNIPMIIQSTL..VQNVY...FLSQLL.....YRRFKTNFFVKL................LGTWQEA.EFG........GQSVPIGGLAYYMS...P.LRDVK......................DIINDPIHAVV [...]
+Q22MG2_TETTH/151-538 TIMELGISPTVTAGMVMQLL...................VGAQILNIDQN.DPVQRSLYEGSQKLLGLIIAFFEAVAYV.WSGMYG......DIEK...........VGYGNA..LLIVL..QLTFAGIIVILLDDLLSKGHGL.GNSAISVFIAINIC.ETIIWKSFSPITYPIP............GFEKEQYEGAIL...NLFHSLFA...............IDNKFVALQNAFYR.......SHL.....PNLASLISTALI.FIVVVYFQGFKVDIALKNDRV...................RGAIQS.YPIKLFYTSNMPIILQSAL..ISNLY...FFSQIL.....YRNFNGNFIVGL................LGKWSIP.EAG.......GSHMVPVGGLVYYLS...P.PHGMI......................EVISDPLHTIL [...]
+A0CU87_PARTE/77-460 TLMELGISPMVTASMIMQLL...................AGAKLIDVDQN.VKEDKQLYSGAQKLLGILIAFGEAFAYV.WSGMYG......DLDK...........LGAGNA..ILIII..QLVFSAIVMIMIDELLSKGYGI.GNSGTSLFIAINIC.ENIMWKAFSPITHKT..............ELGLEYEGAII...ALLHGLFV...............QSDKISALQSAILR.......DSL.....PNLTNLLATVLV.FLIVIYFQGFKVDIPIKNNKV...................RGGLTS.YPIKLFYTSNIPIILQTAL..VSNLY...FLSQIL.....YRNFKGNFLIRL................LGYYQEL.EN.........GQTVPIGGLVYYVS...P.PRSIS......................EAIFDPIHTIL [...]
+Q7RLN0_PLAYO/121-506 TLMELGISPIVTSGMVMQLL...................AGSKIIDVDQS.LKEDRTLFQGAQKLLGLLITLGEAIAYV.VSGIYG......NLSE...........IGTGHA..ILIIL..QLFFAGVVVILLDELLQKGYGL.G.SGISLFIATNIC.ETIMWKSFSPTTINT..............DKGIEFEGAII...SLIYCLFT...............EFNKISALKKSFYR.......THA.....PNVTNLLATILV.FLIVIYLQGFRVDLSVKYQTV...................RGQQGT.YPIKLFYTSNIPIILQTAL..VSNLY...FFSQIL.....YKRFSNSILVNI................LGQWQEI.ESN........GTAVPIGGIAYYIS...P.PNSFA......................DITNDPFHTLI [...]
+Q4QGX4_LEIMA/77-467 TLMELGISPIVSASLILELL...................AGVRILTYDQN.NREERAVFEGFQKMMGLVITAVEAVAYV.SSGMYG......DPSR...........IGVVMC..GLIVL..QLMVATMICILLDELLQKGWGI.G.SGTSLFIATNVC.DTIIWKAFSPSTINT..............GRGAEFEGAII...AFFHLLVS...............RTDKVRALREAFYR.......PQL.....PNLTNIFSTAVV.FAVVVFFQGFRVPLMTKSKFN...................GNDRQP.YMIKLFYTSNMPIILQTSV..VSNIS...FFSQIL.....SRRFGNRNFLIN...............LLGRWEER.GYNGG....GSGQLFPVGGLAYYLV...P.PATFY......................DLLADPIHAIF [...]
+A5JEK2_NOSBO/75-457 TLMDLGISPVVTASMIMQFL...................GMLELVKVDYN.VKEDKILHGAANRLISLIMTVGSAIVQV.LTGFYG......DPKA...........LGWTYC..ILLMV..QLIFSGVIIILLDELLQKGYGL.G.NGVNLFIASNVC.ESIMWRAFSPKVFFT..............GRGIEFEGSLI...AFFHLLIV...............RKNKFAALYEAFFR.......QNL.....PNMFSLVSTVVL.FAFVIYLQGLRVELKTESTQV...................RGQTGM.YPVKLLYSSTMPIIVQSYV..ISHIC...TISRFL.....YKRFPTYFLVRA................LGVWSSE.GS.........SKYQPIKGLCYYIL...P.PESIF......................DFKLRPFYFLF [...]
+A2DH65_TRIVA/75-462 SLMEFGISPIVTSGMILQFL...................CSFGLINRNPS.DPEASALFDAAQKLAGIIMTAFQAGNAI.WSGEYG......IRGE...........IGFVNA..ALIMT..QLVSSAIVVILLDELCQNGYGI.G.SGISLFICTNIC.EMIMWRLFSFNHYSM..............GRGTEYEGLVI...AFFHYLFT...............RKNKLRALRDIVFR.......PQL.....PNLCQLFSTVIV.FGACVYFDQIKINIGLETTVN...................RARPEP.FEIKLFYCSNTPPIIQSTI..LSQLA...GFSRTI.....YFHWPESLATQI................FGVWRSH.NGMS......YDYSTPVSGLIYYLT...A.PQSIQ......................QTIHDPLHTII [...]
+Q2QM98_ORYSJ/88-448 TVMELGVAPVVTSWVVVRLL...................AALL........FDSDSSTTVASCELLARCLAYVTNASRL.VIG.........IAAALGM.....CGSGGAGNA..ALVVL..QLFAGGVVVVLADLLHETGYGVEGVSAASLLIATNAC.ERAVSHLFSPVKLRL.............AGAGPEFEGPVF...AVTHRVAAAP...........PSWRHKAGALLFTLLR.......LDL.....PNLSNYMTTCVM.FVLAVRLDETHLRRLYRSRPR...................RGTDEF.VPIKLLYTSAMPIMLHASA..VSAFC...V...............DAG.......................GGAA...............YPVGGLVYYVT...P.PSKLL......................VDPGLIHELLI [...]
+Q6AV46_ORYSJ/86-471 TVMELGITPVVTAGTLVQLL...................VGSNLVRADSS.NPDDRALLSAAQKLLSIVITAGEATAYV.LSGAYG......SVGV...........LGAGNA..VLVVL..QLVLGGMVAIFLDELLQKGYGF.G.SGISLFTAANTC.EGVVTRALSPATMDR..............GRGAEFVGAVT...AAAHLLAT...............RARKLSAVREAFFRGG...GGGSL.....PDLRGLAATCAV.FLAAVYLQGVRVALPVRPRNA..................PRSHRGGAYSVRLLYTSGMPVVLLSSA..VSSLY...VVSQAL.....YRRFGGSLLVD.................LLGKWTP.D...........AAVPVGGIAYYVT...A.PASAA......................SAAANPLHAAM [...]
+Q6C854_YARLI/70-454 TLMELGVGPMVTSGIIFQIL...................GGFQALNVNFD.IRADRELFQSGQKIFALLLTFFHAIFLVFFAQTYGTISTDSAVS.............ELSLGAAVLIVA..QLTAAGLVLILLGEIVDKGYSF.G.SGSGLFTALSVS.QNFMWQNLALLKVHQEFVGS...IPALLMGLWKNGLFNFG...GSYRYVI...................ENSFFRQNLP.........N........LLQLYMSVAV.FMLTIYLNTFRVDIPIKSSRV...................RSLATA.FPVKLLYTGSMCLFLLSAF..SQNVL...IYSQSL.....YVQFPDNLMVQV................LGSWGADG..............SPVGGIAYYI.....SPNNF.........................GYDVIKMVL [...]
+SSH1_YEAST/78-465 TLLEFGLFPNISSGLILQLL...................AGLKVIKVNFK.IQSDRELFQSLTKVFAIVQYVILTNIFI.FAGYF.......GDD............LSVVQI..GLINF..QLVGAGIFTTLLAEVIDKGFGF.S.SGAMIINTVVIA.TNLVADTFGVSQIKVG............EDDQTEAQGALI...NLIQGLRSK..............HKTFIGGIISAFNR.......DYL.....PNLTTTIIVLAI.AIIVCYLQSVRVELPIRSTRA...................RGTNNV.YPIKLLYTGCLSVLFSYTI..LFYIH...IFAFVL.....IQLVAKNEPTHII..............CKIMGHYE.NAN........NLLAVPTFPLSLLA...P.PTSFFK.....................GVTQQPLTFIT [...]
+Q6BT20_DEBHA/78-475 TLLELGLLPVLTSAFIWQLS...................AGFRFINVNLN.LRSDRELYQSGQKLTSFIFAIVYGAGYI.FSGYYNNVIKGYNPFN..........GDSVPVTTLVLIFL..QIVTMSFVTTLMVEIFDKGYCF.G.SGVLCFVALQVA.TNLIRDVVGLELVSLP............NSNKFESYGAAM...NFIKNFR.................INFKSLNYNVLN.........SFTRSQLPNLSQFYIVLVT.VLVLIGVQNYRIELPIRSTKV...................RGMNNV.YPIRLFYTGALPILFAFTV..LTNLQ...VFGYFT.....STLLNNYSQLAASII.........GTWSLDTKSFNL..............NLTSGILYFL.....TPSKSLA.....................QSLLSPIRSVT [...]
+A5DE75_PICGU/20-414 TLLELGLLPVMTSAFLWQLA...................AGLRLVKVNLS.LRSERELFQTGQKLTSFILGIVYTAGLI.ASGYFAPALR..NQTGFE.......DSFPVTTY..VFIFL..QVFVMSAVMTLLVEVFDKGYGF.G.SGILCFIALQAA.SDLVKNIIGLEVVKLA............NSNKFESVGALM...NLIRSFSF................KTLGKNIYNSFNR.......EHL.....PNLTQVYITIVT.LLVVVALQNFRIELPIRSTRA...................RGMNNV.FPIRLLYTGALPLAFAYTV..LTNLQ...VLGYIA.....SQLLESYSPVASS..............VIGKWTID.YRS........SNLKVSSGILYFLS...P.PTSIL......................NTLVSPLKTAA [...]
+A3GFV9_PICST/78-476 TLFELGVLPVVTAAFFWQLA...................VGLKLVNVNLG.LRSDRELFQTGQKLTSFVLAIVYGVGLI.YSGYYDNAIRGYDPLSD.........STPYGWY..GLILF..QFLSWSFIITLIVEVFDKGYAF.G.SGALSFLALQTA.TNLIAELVGLEIFPIN............NSNKFESYGALI...NFTRNFSFDI...........SKIGTNVYNSFTRLQ.........LP......NFTSFYITVAT.TLAVVYLQNLRIELPIRSTRA...................RGMNNV.FPIRLLYTGALPVLFAYTV..IANIQ...YFGYLA.....YVVLQKANVSSFALSI.......IASFNLDSYSNRL..............NLTSGALYFF.....SSSPSLL.....................STILSPIRTVV [...]
+A5DWJ5_LODEL/34-436 SLLELGFLPIITSAFLWQLA...................AGLKLININLG.LRYDRELFQLGQKLTAWGLALIFSVGLI.YSGYYDNVIR..GYKVVGG.....SGGVPIWSY..LIIFT..QIFTWQIVLTLIVEIFDKGYGF.G.SGILSFLALQNA.TSFIAELVGLEMFPVV...........NNTLKFESLGALL...NLVRNFSIF.............SPTTTINQIWHAFTR.......VQL.....PNLTQFYITLAT.ILAVVLLQNFRTEISIRSTKV...................RGMNQM.FPIRLLYTGGLPVLFAYTV..IANLQ...VFGFIF.....EAALVKLTASPIVS............TLFANYVVE.PYS........NRLVIKSGVLYFFT...A.SQTLL......................QSIISPLRVVI [...]
+Q5A2C9_CANAL/5-404 TLLELGLLPIITSAFIWQIA...................AGLRLINVNFK.LRIDRELFQTGQKLTSFIFSLIFAIGLI.YSGYYDNAIR..GYNPLQ.......DGIPYGSY..ALILL..QITAWSWIVTLLVEIFDKGYSF.G.SGILCFLAIQSS.TNFIANLLGLENFPVV............NSNKFESYGALM...NLIKNFSIF.............NPKQTVYQIWHSFFR.......IQL.....PNLTQFYISLAS.ILIVVALQNFRIELPIRSTKV...................RGMNNV.FPIRLLYTGGLPVLFAFTV..VANIQ...VVGYLI.....HSVLSKLGTSPIVI............SIIGNYVYN.PSS........NELDLNSGILNYFT...S.SSSLV......................ESIISPIKTTV [...]
+Q74L41_LACJO/64-372 SIFSIGLNPLMFSMLIIQLL...................SFTHSFGFDA....LSPKQVQYLMQFLTMIITIIQAALLVFAFTNRRN........................GLEDFEMIL..ILSAGSCLVVWLCYRNMK.YGV.G.ASAPVILTSILN.GAIP.......................................NIISNVK..................LLLTMKYAWIW.........L........AALAIFILLL.IKFWLAFTKAYYPLKVVNPSL.................PASSNLMT.VPLGLNMAAMMMYMVGMAI..LTLPL...MVGRYF.....SSSSL..............................................................................................INNWV [...]
+B3XPQ8_LACRE/65-377 SLFMVGLNPLMIAMLIIQLL...................TMLRLFYFDT....LSMNQLMKIQQWLTLGFAIIQSTAVTLGLKITTG........................TLDSLAVIL..MLTAGSMFVVWLGNMNMK.FGI.G.GTITLILFNIIS.GSIP.......................................TLLRSIK..................MLAKQSYGPLW.........L........FLAAIAGCIV.LVFWVSFNRAYYPLKMINTSM.................SSHDRPII.LPIGLNMGAMMTYMVGMSL..LMVPT...LLANVL.....GPGSL..............................................................................................FANPY [...]
+A1C3L4_STRPA/70-403 TLFSLGIGPTMTMMILWRFL...................ITFKLI......GSWTSNKVNRLQFLLTLAIALLQSFGITNDSKFLLIFGYSH...................STLRIITII..LLTTGTFILNWLCKINSE.RGI.G..GMTVVILVNMI.LTFQSN................................II...RYFSVQQ........................FKFSS.........LI.....QYGLVFFVALSILIWFNILLYKGEYRIPIQRVGL................NTPYHASSY.LPIRVTPAGAMPFMYGMTL..MMLPPYIFVVLLHI.......................................................FPGNQILEYLSVHIG..................................LSQLP [...]
+Q3DVD6_STRAG/65-395 GVFSLGIGPMMTTMILLRLF.........................TIGKYSSGVSQKVQQFRQNVVMLVIAIIQGLAITISFQYHNGFS......................LTKLLLATM..ILVTGAYIISWIGNLNAE.YGF.G..GMTILVVVGML.VGQFNN................................IP...LIFELFQ.......................DGYQLA.........I........ILFLLWTLVA.MYLMITFERSEYRIPVMRTSI................HNRLVDDAY.MPIKVNASGGMAFMYVYTL..LMFPQYIIILLRSI.....FPTN..............................P...............DITSYNDYFS.......................................LSSIQ [...]
+A5LN99_STRPN/64-389 SIFSVGLSPWMSAMILWQMF...................SFSKRLGLTST....SIEIQDRRKMYLTLMIAVIQSLAVSLRLPVQSSYSA.....................ILVVLMNTI..LLIAGTFFLVWLSDLNAS.MGI.G..GSIVILLSSMV.LNIPQD................................VL...ETFQTVH........................IPTGI.........I........VLLALLTLVF.SYLLALMYRARYLVPVNKIGL................HNRFKRYSY.LEIMLNPAGGMPYMYVMSF..LSVPAYLFILLGFI.....FPNH..............................S...............GLAALSKEFM.......................................IGKPL [...]
+A3CM55_STRSV/64-391 SLFSVGLSPWMSSMLIWQMF...................AVSKRLGLSKL....PLEVQERRRMLLTLVIALIQSVALVLNLPLQEAAGVDM...................TTIMVLDTL..VLMAGTYFLIWLTDLNAA.MGL.G..GSIMIVMASMI.AYIPQD................................IW...NSIQELK........................ISSLW.........L........ALMLVFSLVF.LYLAVTVERSKYRIPVNKINI................HNRFKKYSY.LDIRLNPAGGMPIMYAMTL..VSIPQYFLLIIHFL.....QPEN..............................Q...............LIEQWIEALS.......................................MGSPA [...]
+Q03HZ8_PEDPA/65-396 SLFSVGLGPYMTGMILFQAI...................QLLDIDELNKI....NDYKRGMIQRWISFVIALLQTLQFIYTIREHINFSGIKVW...............GIDYNLIVAFF..VLVAGAMIVAWMSDMITK.YGI.G..GSGVLILPGMI.DSIPRV.....................................LLYGQGL......................GSGAVFF.........TP.....KLWLVLIISVAVVVIFTIFINKAELRIPLQRPFV.................QNDFSESY.LPIRVLAAGSMPFMFTTTV..FMIPS...YIGSFV.....PEG...............................................EFNRFVQNYV....A..................................FDNPV [...]
+A5IW80_STAA9/64-384 NIFTLGLVPWLTSMIILMLI...................SYRNMDKYMKQ....TSLEKHYKERILTLILSVIQSYFVIHEYVSKERVH......................QDNIYLTIL..ILVTGTMLLVWLADKNSR.YGI...AGPMPIVMVSII.KSMMH......................................QKMEYID........................ASHIV..................IALLIILVIITLFILLFIELVEVRIPYIDLMN................VSATNMKSY.LSWKVNPAGSITLMMSISA..FVFLK...SGIHFI.........................................L............SMFNKSISDDMPM.LT..................................FDSPV [...]
+Q4L9N9_STAHJ/61-383 NVFSLGLGPWLTSLVIIMLL...................NYRNLDQATKQ....TRSEKHYKERIITIVFAIFQSYFVISTYIHNNFIK......................DSNIILLML..ILVAGTMLLVWLADQNIT.YGI...CGPMPIVLTSLI.KSLFNN.....................................QHFFKLS........................VSVLL..................LILVIVTLVIALLILLFIELSEYRLNYKDIMN................NSTNKTPTY.LAWKLNPAGSISIMISLSV..YVLLN...NMINLI.........................................A............TLLGSNANFEFL...S..................................FANPI [...]
+Q5HKR3_STAEQ/61-380 NIFSLGLGPWLSSMIILTLI...................NHKSNDKVKTQ....TRRERHFKERALTLIISAAQGFYIIHSYINKHAIK......................DSNMLILLL..VLITGTLLMVWLADQNTT.YGI...SGPMPIVLMSLV.KSIFN......................................THFPKLN........................SSASL..................ITMIIVLLVLALFILFFIELTEYRIEYNDIMN................ISAKDIPSY.LSWKLNPAGSISIMVSLSL..FMLTN...NIVNFI.........................................G...........RFIVNHNFETHVF...N..................................FTNPV [...]
+Q9RSK8_DEIRA/68-413 SIFALGVLPYITASIVIQLL................TT.TIPSLEKLSKE.GEEGRKKINQYTRYAAIALGAVQALFFSLYI..TSNPSFIAVGW.............DPGLFTVLVMVL..TQVAGIAFTMWIGERITE.VGI.G.NGISLIITAGII.AVYPRE................................IA...ATAQLLR.....................SEQTTLLS.........I........LAFIAVILVT.IAGIVYIYQAERRVPVTYARARGGAAGQ.....ARG..AGQ..ATW.LPIKVNQAGVIPVIFASAM..LIIPN...LIASAT.....ATRA..............................P...............EVNAWINSNL......................................TFGQPL [...]
+Q5SHQ8_THET8/71-413 SIFALGIMPYITAAIIMQIL................VT.VVPALEKLSKE.GEEGRRIINQYTRIGGIALGAFQGFFLATAFLGAEGGRFLLPGW.............SPGPFFWFVVVV..TQVAGIALLLWMAERITE.YGI.G.NGTSLIIFAGIVVEWLPQ.................................IL...RTIGLIR.....................TGEVNLVA.........F........LFFLAFIVLA.FAGMAAVQQAERRIPVQYARK...VVGR.....RVY..GGQ..ATY.IPIKLNAAGVIPIIFAAAI..LQIPI...FLAAPF.....QDN...............................................PVLQGIANFF......................................NPTRPS [...]
+#=GR Q5SHQ8_THET8/71-413 SS BTT----HCCCCCCCHHHHC................CC.CSCCHHHHHC-.-----CCHHHHHH------------HCCCCT--------S----.............----HHHHHHHH..HHH---HHHHHHHHHHCC.---.-.---CHHHH---CCCCCHH.................................HH...HH-----.....................-----CCH.........H........HHHHHHHHHH.H---HHHHC-EEEEEEE----...----.....---..---..ECE.EEEESS----HHHHHHHHH..CCHHH...HCCTT-.....TTS...............................................TTT---CCCC......................................-TTS-- [...]
+SECY_CORGL/73-424 SIFAIGIMPYITASIIVQLL................TV.VIPHFEELKKE.GQSGQAKMMQYTRYLTVALALLQSSGIVALADREQLLGAGIRVLS...........ADRNFFDLIVLVI..TMTAGAVLVMWMGELITE.KGV.G.NGMSLLIFAGIA.TRLPTDGM............................NILG.................................NSGGVV.........F........AVVLASVLIL.VIGVVFVEQGQRRIPVQYAKR...MVGR.....RQY..GGS..STY.LPLKVNQAGVIPVIFASSL..IYMPV...LITQIV.....NSGSLEV.........................SDN...............WWQRNIIAHL......Q...............................TPSSWQ [...]
+A8LB12_FRASN/74-414 SVFALGIMPYITSSIIIQLL................VV.VIPRLEQLKKE.GSSGEQKLTQYTRYLTVALGILQATGIVALARSGRL.....FPGCSA......QIIPDTSLFRIVTIVI..TMTAGTAVIMWMGELITA.RGV.G.NGMSLLIFTSIA.AALPSQGG............................RILQ.................................VAGGVV.........F........GLVILLGLAI.VVFVVFVEQSQRRIPVQYAKR...LIGR.....RMY..GGT..STY.LPIKVNQAGIIPVIFASSL..LQLPQ...LVGQVW.....SNQTFQ............................D...............FEQRYLSR.........................................GDHPL [...]
+Q83NQ1_TROW8/73-424 SVFALGVMPYITSSIIIQLL................RV.VVPRFEQLYKQ.GQEGQAKLIQYTRYLTIGLAVLQSTTLITVARSGAL..FAASNSPACS.....SLLTDDSWYSTIIIVI..VMTAGTGLIMWLGELITE.RGI.G.NGMSILIFTSIA.AGFPGV................................LV...GVYQT..........................RGFGM.........F........STVVITSLVV.MVGVVFVEQSQRRVPVQYAKR...VVGR.....RIL..GGG..STY.LPIKLNMAGVVPVIFASAI..LRVPS...IIAQFS.....QPAPGQP.........................PAA...............WVVW.INENF......T...............................TGNSPF [...]
+Q8G3Z9_BIFLO/74-421 SIFALGVMPYITASIVVQLL................RV.VIPRFEALHKE.GQSGEAKLTQYTRYLTIGLAVLQSTTILVTARSGAL.....FNYQCD......QVIPDGSVFNLVVMVL..IMTGGTGLIMWMAELVTD.KGI.G.QGMSILIFMSIC.SGF...................................LP...QLWEIGY..................GTNGTDGDWLK.........F........GIVVGVLVVI.LIFVDFVELCQRRVPVQYTRR...MIGR.....KMY..GGS..STY.LPLKINMSGVIPPIFASSI..LAIPT...LIAQFG.....KSDQ..............................S...............WVKW.INANL......A...............................NTTSVW [...]
+A7B9M4_9ACTO/72-414 SIFALGIMPYITASIIIQLL................RV.VIPRFDDLHKE.GQTGQAKLTQYTRYLTIFLGILQATTTISLARSGQL.....FQSCNH......DIIKDRSVMTFIMMII..VMMAGTGVIMWLGELITE.RGI.G.NGMSLLIFTSIA.ARLPEQ................................LL...SIGQA..........................GKWGS.........V........AAIVALLLLV.AIAVVYVEQAQRRIPVQYAKR...MIGR.....RQY..GGT..TTY.IPLKINMSGVIPVIFASSI..LALPP...MAAQFG.....SPND..............................K...............WVQW.ISAHF......................................TQGSSF [...]
+SECY_CHLTR/73-433 TVIALGVVPYISASIIVQLL................VV.FMPTLQREMRESPDQGKRKLGRMTRLFTLVLACVQSLLFAKFALRMNL..VVPGIVLPAMLS.LKLFGVPWVFY..LTTVV..VMITGTLLLMWVGEQISD.KGI.G.NGISLIITLGIL.ASFPSV................................LGSIFNKLNLGS..................QDPS.EFGIVS.........L........LILCAVFVFV.LMATVLIIEGMRKIPVQHARR...IIGR....REVV..GG...GSY.LPLKVNYAGVIPVIFASSL..LMFPA...TIGQFL.....SSES..............................S...............WLKR.IATML......................................SPGSVA [...]
+Q1AU49_RUBXD/70-408 SVFALGIMPYITAAIVMQLM................TV.AIPRLQELARE.GEVGQQKITQYTRVFTLALSFIQSVAMVLFLRSGQFGPVLAG................AGALDLFLVVV..TLTTGVMVTMWFGELITQ.RGL.G.NGISLIITASIL.SQAPNA................................VR...TLIE..........................DGSVLT.........M........VILGIIAVMI.VAAIVFVNEGQRRIPITYAKR...QVGR.....RMS..QGG..TTY.LPLKVNMAGVIPIIFASSL..LIFPV...VITQFA.....AGGDQS............................S...............WLFR.LAQIF......................................APPSAP [...]
+Q8RIH6_FUSNN/75-411 SIFSLGIIPYINASIVVSLL................VS.IIPQLEEIQKE.GESGRNRITQWTRYLTIALAIIQGTGVCLWLQSVGLIYNPGI.................SFF..VRTIT..TLTAGTVFLMWVGEQISI.KGI.G.NGVSLIIFLNVI.SRAPSS................................VI...QTIQTMQ......................GNKFLIP.........L........LVLVAFLGTVTIAGIVLFQLGQRKIPIHYVGK...GFSS.....K....GGIGEKSF.IPLRLNTAGVMPVIFASVF..MLIPG...VIVNAL.....PSTL..............................................SIKTTLSIIF......................................GQNHPV [...]
+A6DRC9_9BACT/79-428 GV..LGIMPYITASIIMQLM................TP.VFPNLEKLQKD.GSHGRQKLNQYTRYMTIVICAVQSAMMAVAMHTPSK....LLGVPGFED...LVINKGSAFV..IQTTI..IVTASAILIMWLGEQITD.KGL.G.NGASIIITINVL.SSMPQA................................FA...AVYSK.Y..................QE.G.EWNLVQ.........I........LVVVGILFIV.TAATVALVQGMRKIPLKYARD...ASSR.....NAM..IEK..TSY.LPLKVNHAGVMPIIFASAL..MMFPP...MIINKI.....GG................................D...............FART.VAPYF......................................DFGSTS [...]
+C0ACZ0_9BACT/94-454 AVCALGIMPYISASIIFQLM................TA.VVPSLARLQQE.GDVGRQKLSQYTRYATVLICLIQGALLILALENPTQLFGEGYDIARYGE...IVLVDRTWFL..ISSVI..FMTAGTMLLTWLGEQITQ.RGI.G.NGISLLITIGII.SDLPGA................................MGTLWTLLRAPV..................GT.Q.GISMIS.........L........TFMVILFFAV.TMGIIMVVQGQRKIPVQYAKR...VVGN.....KVM..GGQ..NSF.LPLKVNYSGVMPVIFASAI..LLFPQ...QIFRYL.....GAAFNL............................P...............FLIE.FSNNL......................................MRGHWV [...]
+Q1Q157_9BACT/75-434 AIFGLGVMPYISASIIFQLL................VG.VVPYLERLQKE.GEVGRKKINQYTRIATVGLCLFQAFVMTRTLYTVEF.....NGVPVIP.....VYLQGVSFQ..LMAAI..LLTTGTMILMWIGEQIEE.HGI.G.SGISIVIMVGII.ERLPWAF.............................NQIV...QNFTFSV..................APAEHQIGIVK.........L........LILLGMFFAI.VGGVVYITQGQRRIPIQQAKH...TRGR.....RVY..GGQ..RHF.LPLRVNQAGVMPIIFAQSL..LIFPA...AIMQGI.....QIRFEPGS........................VGY...............WITSRLSGIL......................................Q.EGVL [...]
+A6CGP8_9PLAN/77-435 TIFGLGIMPYISASIIFQLM................GT.VYPPLERLQKE.GEAGRKKINEYTRYATVVICLVQSFFWIRTLAGGFG.....SGTSLIL.....DGYQGLYFQ..IVATI..TMTTGTVFLMWIGEQIDA.YGI.G.NGISLLIMAGIL.ARMPQAGW............................SLIE...PAFEKGI..................ALGT.DTGIDR.........L........LILALVFVFV.VVWVIAITQGQRRIPIQSAKH...VRGR.....RVS..GGQ..RQS.LPLRVNQAGVMPIIFASSL..LMFPY...FLFHGL.....SQYF.ST.........................SAF...............W..AMLDEAF......Q..............................PMSRGFV [...]
+B4S5A8_PROA2/73-417 SIFSLGIMPYISASIIVQLL................GA.VTPYVQKLQKE.GEEGRQKINQYTRYGTVLIAALQAWGVSVSLASPSSFGTIVVP..............DPGFFFMMTTVL..ILTASTVFVMWLGEKITE.RGI.G.NGISLIIMIGIL.ARFPQS................................VI...AEFQSVS.....................LGSKNWII.........E........FIILALMVLI.VAAVVVLTVGTRRIPVQHAKR...VVGR.....KMY..GGS..TQY.IPMRVNTAGVMPIIFAQSI..MFLPN...TFLSFF.....PES...............................................EVMQNVATIF......................................SYDSWW [...]
+Q2S3P5_SALRD/75-414 GIFALGIMPYITASIIIQLM................GA.VVPYFQKLQRE.GEEGRRRITQLTRYGTIGITALQSIGYSINLLAGATGRAVVIN..............STLFT..ITTVV..VLTSGTAFVMWLGERISE.DGI.G.NGISLIITIGII.AFLPQA................................LY...NEIGLI........................GDNFFI.........L........LVEIGVWVLV.AGAVVLVSQGMRRIPVQYAKR...VVGK.....KVQ..GGT..TQY.LPLRVNAAGVMPIIFAQSI..MFIPS...TIASFF.....PNN...............................................ATMQRVGGWF......S...............................DISSMS [...]
+A1ZGT4_9SPHI/72-404 SIFALGIMPYISASIVIQLM................EV.AVPYFQKLKKE.GESGFKKKTQITRYLTIVITAAQAIGYIQATIPSNAIMVSQL.................SFT..ISTVI..ILTAGTVFTMWLGEKIDD.RGI.G.QGISLLIMIGII.SRLPQS................................LV...EEVVARS.....................T.GSQVLI.........L........ILEMVVLFFV.VMSVVMLTEATRRIPIQYAKQ...VVGN.....RVY..GGQ..RQY.LPLKVNAAGVMPIIFAQAL..MFVPA...LITPYV.....GG.....................................................ASSAF......S...............................DITTWQ [...]
+A6EHP4_9SPHI/71-408 SILALGVMPYISASIVVQLL................GI.AVPSFQKMQKE.GESGRKKLNQITRYLTVAITAVQAVGYVKTQVPMEAIVIDHT.................LFF..VMATF..VLAAGTLFVMWLGEKITD.KGI.G.NGISLIIMVGII.ARLPIA................................LY...QEITSRI.....................VSDGGLIA.........L........VLEIVALFAV.VMFTIMIVQGVRKVPVQYAKR...IVGN.....RQF..GGV..RQY.IPLKVNAAGVMPIIFAQAL..MFIPA...TLTQFF.......................................P...............SLQNTWLVQF......S...............................DYTSLA [...]
+Q11QD2_CYTH3/72-411 SVFGLGIMPYISASIVLQLL................TF.AVPYFQRLQKD.GESGRKTINQYTRILTIFITVAQSIGYLAATLDEGMIYEGMN.................TPFMNVVRIV..TLISGTMFCMWIGERITE.KGI.G.NGISMLIMIGIV.SRLPFA................................LM...AEVSSKN.......................LEGALP.........L........LIEFAALFAV.IMLVVLVQQATRRIPIQYTKQ...IAGG.....KQV..IGQ..RQY.LPLKLIAAGVMPIIFAQSV..MFLPA...IIGSSF.....PDS...............................E...............FATT.IGSTM......S...............................DFTSWQ [...]
+Q1VTY0_9FLAO/73-421 SVFALGIMPYISASIVVQLM................TI.AIPYLQKLQKE.GDSGRKKITQITRWLTIAITLVQGPGYIINLYNILPSSAFLMD...............STFTFVVSSVI..ILTTGCIFAMWLGEKITD.KGI.G.NGISLLIMVGII.ATLPQA................................FI...QEFISRV....................TESNGGLIL.........I........LIELVIWFVI.ILAAVMLVRAVRQIPVQYARK..NASGK....FEKASVGGA..RQF.IPLRLNASGVMPIIFAQAI..MFIPA...AVAGLS.....DS................................................EMAQGITAAF......Q...............................NMFGFW [...]
+Q1NYZ7_9FLAO/72-422 SILSLGIMPYISASILTQLM................CY.MFPSLYKIQQD.GEIGIKKINNITKVLTILISLIQAPVYITILISSNIKENPYNLILI.........HCKKIFI..ITSII..CITTGTFFTMWLGEKIND.KGI.G.NGNSLIIISGIL.SRFIYS................................II...SEIFNRL..................KNNNKLLGIII.........L........LFELFIWLLI.IGISIIIINFVKKIHIQYVNKFYLKNYS....SNEIYLRNE..MKF.LPLKVVYPGVMPIIFSQGI..LLIFI...TIFNKI.......................................N...............NLQL............................................SNNGIW [...]
+A5KHP6_CAMJE/62-402 SIISLGIMPYITASIIMELL................AA.TFPNIGKMKKE..RDSMQKYMQIIRYATIVITLVQSIGVAIGLQSLHG..RGGAGVIM........VEDLNMFI..ALCAI..SMLAGTMLLMWLGEQITQ.RGI.G.NGISLIIFAGIV.SGIPRA................................IS...GTVGQ.I..................NS.G.EMNFLT.........A........FAIFALILIT.IGVIIYVELGERRIPISYSRK...VVMQ.....NQN..KRI..MNY.IPIKLNLSGVIPPIFASAI..LMFPT...TILQTS.....TN................................P...............YLQA.INDFL......................................NPNGYL [...]
+A4EA78_9ACTN/52-389 SVFSLGIMPYITSSIILQML................QA.VVPSLHELARE.GEVGQTKITQYSRYLTLALAILNSVGYLFLFKSFGISFNGAGA...............PEIIFDLMIVG..TLTAGAMLIMWIGELITQ.RGI.G.NGMSLIIFANIM.AGLPQA................................IF...SSTE........................GNAGGIIT.........M........VIICAIILLV.IPLIVFLERGQRRIPVSYAKR...VVGR.....RMM..GGQ..TTY.LPIKVNTAGVVPIIFASAL..LYFPA...QIAVFF.....PGIG..............................................WIQA.VASAL.......................................STGWL [...]
+Q2GEC0_NEOSM/73-411 TLFALNVMPYIVSSIVVQIF................FS.MLKSEGKVSAE..FMNESRLSFYSKLVALFLAFFQGFIIVAGLERTKAFVGGNEE...............FYSLLKYTSVL..TLVCGTFSLIWLGQQINS.RGI.G.NGMSLIIFAGIV.AEMPAI................................FG...NLFSGIG.....................SPGSGILG.........I........FVSLSLLVFV.VFLVVLVERASKNIPVHYPRR......RT..WGSTH..GDA..ASN.IPVKINVSGVIPPIFANAL..ILFPL...TLANFS.....AE................................S...............HLGEFIIRYF......................................SVGQPL [...]
+Q3YRM8_EHRCJ/72-412 TVFALNVMPYIVSSIIIQLL................SV.TVPRLNELRQN.GELGRMKINNYIRYMTIFFCIVQGSVILLGLEKMNS.....ENSIVV.......IDPGLLFR..IVGIS..SLLGGTMFLLWLGERINK.NGI.G.NGVSMIIFTGIV.AELPGS................................FS...SMFLL....................GKNG.NVPIFV.........I........LLMVLIFFAL.LLLIIFVEKSYRKILVQYPKR...QVKN.....KLY..GSS..STY.IPLKINISGVIPPIFANAL..LLSPI...TVANFH.....QGS...............................P...............WSDF.ILMYF......................................SSGKLL [...]
+Q5GSW3_WOLTR/77-416 TILVLNVMPYIVASIVMQLL................SS.AVKGINEVKND.GELGRRRMNSYIRYMTIVFCIFQSVTILIGLERM.......NREGTLV.....VIEPGVMFR..TVGIF..SLLGGTMFLIWLGEQISA.SGI.G.NGISLIIFTGII.SELHNA................................FS...FLLT..L..................NKNG.SMSLLI.........I........LFVFVLFFLL.LLLIIFVESSYRKVTVQYPKK...QFK......RLH..SDD..FTY.IPLKINLSGVIPTIFANAI..LLTPV...SIANFY.....KGH...............................A...............FSDF.ILNYF......................................MANKVV [...]
+Q0ANS0_MARMM/83-421 AIFVLNVMPYISASIIMQLM................SA.TIPSLEKLKKEGGEQGRQQINQYTRYLTVLLATGQAFAIAIGMNTPNS...EGVALAL.........NPGPFFL..ASTVI..TLVGATMLLLWLGEQITA.RGV.G.NGVSLIIFAGII.SAVPGV................................IG...GALSQ.A..................SS.T.GDGTVL.........V........VGGVLILVG..LLLVVFVERSQRRLLVQYPKR...QQGN.....RMV..GGD..TSF.LPLKLNTAGVIPPIFASSL..LLLPA...TAASFQ.....AQSGP.............................G...............WLQS.AVAIL......................................GPGSPW [...]
+A7IPQ0_XANP2/80-418 AIFALNIMPYISASIIIQLL................TS.VSPTLEALKKE.GEAGRKQLNQYTRYLTVVLAVFQAYGIAVGLEG.......SGSVVA.........DPGWFFR..ITTVI..TLTGGTMFLMWLGEQITS.RGI.G.NGTSLIIFGGIV.AELPGA................................FV...RTLQL.G..................RE.G.AISTPL.........I........LAALVLAVVV.IAFIVFMERAQRRLLIQYPKR...QVGN.....RIY..EGQ..SSH.LPLKLNTSGVIPPIFASSL..LLIPT...TIASFL.....QGSGP.............................E...............WLQT.ITTHI......................................GHGRPA [...]
+SECY_RICCN/70-411 SIFALAIMPYITASIIIQLM................SV.AYKPLENLKKE.GEVGKRKVNQLSRYLTVLLASFQAYGVAISLESIVT...NTGPVVI.........LAGFFFR..ITTVI..TLVVGTMLLMWLGEQITQ.RGI.G.NGTSLIIFIGII.SGVPSA................................II...SMFEL.S..................RK.G.ALS.PL.........I........AIAVCIGVVVLIAIIIFFERAQRKLLVQYPKR...QVGN.....KIY..GGE..ATH.MPLKLNTSGVIPPIFASSI..LLFPA...TLANF......SNSNS.............................E...............TMGM.LTYYL......................................GHGKPV [...]
+Q2G8W0_NOVAD/80-430 SLIALGVMPYITASIVVQLA................AS.LHPALAAMKKE.GESGRKKLNQYTRYGAVLLTAIQGWVLASGLEAYGA..SSGLQAVV.........NPGLLFR..VGAVI..SLIGGTMFLLWLGEQITS.RGI.G.NGVSLIIMAGIV.AQMPKF................................FG...NLFEG.G..................RT.G.SISPFL.........I........FGIVIMLIAL.VIGICFLERATRRLLIQYPKR...ATQR.....GMM..AAD..RSH.LPLKINTAGVIPPIFASSL..LLLPL...TITQFA.....GNSISPDT.......................KMGQ...............AIVT.LNQYL......................................GHGKPL [...]
+A6E0Q6_9RHOB/73-411 GIFALGIMPYISASIIVQLM................TA.MVPALEQLKKE.GEQGRKKINQYTRYGTVALATLQSYGLAVSLQSGD......MVSN...........PGMFFI..ASCMI..TLIGGTMFLMWLGEQITA.RGV.G.NGISLIIFVGII.AEVPAA................................LA...QFFAS.G..................RS.G.AVSPAV.........I........VGVMLMVVAV.IAFVVFMERSLRKIHIQYPRR...QVGM.....KIY..DGG..SSH.LPVKVNPAGVIPAIFASSL..LLLPA...TITTFS.....GNTTN.............................P...............VLST.VMAYF......................................GPGQPL [...]
+Q1UZE8_9RICK/67-404 AIFALGIMPYISSSIIVQLL................TG.VSDYFKNLKAQ.GETGRAKITQITRYGTVILATIQGYGLSIGLQSSAD.....LVIN...........PGLFFT..ITAVS..TIVAGTMFLMWLGEQITQ.RGI.G.NGISLIIFAGIV.AEIPRA................................LV...TTFEL.G..................RT.G.AVSTIM.........I........IGIFVLLVAT.IMFIVFMERALRKILINYPKR...QMGN.....KMY..GGE..SSH.LPLKINQAGVIPAIFASAL..LLLPV...TFSNFS.....FSDND.............................T...............FLN..LSSYF......................................TQGQPL [...]
+Q3R245_XYLFA/76-424 SIFALNVMPYISASIVVQLA................TH.IFPSLKAMQKE.GESGRRKITQYSRIGAVILAVIQGGSIALALQNQTA..PGGAAVVY.........APGAAFV..MTAIV..ALTAGTVFLMWVGEQVTE.RGI.G.NGVSMIIFAGIV.AGLPGS................................VL...QTIDA.F..................RS.D.ALSLIS.........L........LIIVFIVLSF.TFFVVFVERGLRRIAVNYARR...VEGR.....NSY..MNK..SSF.LPLKLNMAGVIPPIFASSI..LAFPV...TLSIWS.....GQASSNTL........................FGA...............WLQR.VSSAL......................................GPGEPL [...]
+A4NK90_HAEIN/76-416 SILALGIMPYISASIVIQLL................AT.VSPALAELKKE.GAAGQRKISKYTRYATVVFATIQAVAISTGLPNM.....LSGLVP..........NVGFSFY..FTSVV..SLVTGTMFLMWLGEQITE.RGI.G.NGISILVFGGIV.AGLPSA................................IL...QTIEQ.A..................RQ.G.QMHPLV.........L........LLIAAIVFAV.TYFVVFVERGQRRIRVEYAKR...QQGR.....QIL..GGH..STH.LPLKVNMANVMPAIFASSI..ILFPA...TLTQWF.....GQNDKF............................E...............WLNN.LSMLL......................................NPGQPL [...]
+Q057C4_BUCCC/64-407 SIFALGVMPYISSSIIVQLL................TL.ISSYLRNLKKE.GDIGKKTINQYTKYITFFLSIIQSIGVVISLPFLPGMKNIIVF...............ADCYFYIIAVV..SLVTGTIFLMWLGELITT.KGV.G.NGVSLIIFSGII.SGLPAS................................VI...RTYKLIK.....................IKNFSFLY.........V........FFLLLIIFFV.IFIVVFIEKSQRKIIVCYARR...QQGR.....RMY..TAH..HSY.LPLKLNMAGVIPVIFSSSL..IVFPS...ILLTYL.......................................R...............YVFNDYKKIIYFFDFL................................KFKHSI [...]
+Q8D1Z2_WIGBR/82-424 SIFSLGIMPHISASIIIQLL................TI.IHPKLSEIKKD.GEFGRRKINKYTRYGTLFLAIIQSISISISLPNMPG...MQELII..........NKGIEFY..ITTIT..SLVTGTIFLMWLGEQITS.RGI.G.NGISILIFSGII.AGLPIE................................VI...KSIEQ.A..................RQ.G.NLNIIT.........V........LISIILVFVI.TYFVVFIERGQRRVIVNYAMR...QKGR.....KIY..AAQ..ITH.LPLKVNMSGVIPAIFASSL..ILFPA...TIASWF.....GEGIGV............................K...............WMSK.IPYYL......................................EPGTFS [...]
+Q6F7T2_ACIAD/83-426 SILALGIMPYISASIIVQLM................ST.VVPSLEALKKE.GEQGKRKINQYTRYGTLLLALVQGVGMCAGLIS.......QGITL..........TSGLAFY..IPAVT..SLVAGTMFLMWLGEQITE.RGI.G.NGISMIIFAGIV.AGLPNQ................................VI...QAFTS.V..................QN.G.QGSLIG.........I........VVFALLSLAV.LAAIVFIEKAQRRIPVNYAQK...QQGR.....RIF..TAQ..QTH.LPLKINMAGVIPAIFASSL..LLFPA...SLGQWL.....GSADPNAG.......................IVKR...............SLQD.LALVL......................................SPGQPL [...]
+Q6Q8W8_9GAMM/67-407 SIFALNVVPYISSAIIMQLF................SN.SIPYLQELKKD.GQAGRNKITQYTRYGTAILAFIQASALAVTLSA.......SGLAY..........VPGPTFF..VSAVF..SVVAGTMFLMWLGEQVSD.RGI.G.NGISIIIATSIL.TGIPGA................................IG...QALEQ.S..................RQ.G.DLSILL.........L........IGIGLLSMAV.IAVVVFIERGQRRITVNYAQR...QQGR.....RMM..QAQ..QSH.LPFKVNMAGVIPAIFASTF..LLFPA...SLSTWF.....GENESL............................S...............FLQS.FSLAL......................................NPGQPL [...]
+A9BRX1_DELAS/74-413 TVFALGIMPYISASIIMQLM................TY.VVPTFEQLKKE.GESGRRKITQYTRYGTLGLAIFQSLGIAVALESSAG.....LVLS...........PGFGFR..LTAVV..SLTAGTMFLMWLGEQITE.RGL.G.NGISILIFGGIA.AGLPSS................................IG...GLLEL.V..................RT.G.AMSILA.........A........IFIVLVVAAV.TYFVVFVERGQRKILVNYARR...QVGN.....KVY..GGQ..SSH.LPLKLNMAGVIPPIFASSI..ILLPA...TVVNWF.....SAGESM............................R...............WLKD.IASTL......................................TPGQPI [...]
+Q7DDS8_NEIMB/73-410 SIFAIGIMPYISASIIVQLA................SE.ILPSLKALKKE.GEAGRKVITKYTRYGTVLLAILQSLGVASFVFQ.......QGIVV..........TSSFEFH..VSTVV..SLVTGTMFLMWLGEQITE.RGI.G.NGISLIITAGIA.SGIPSG................................IA...KLVTL.T..................NQ.G.SMSMLT.........A........LFIVFGALLL.IYLVVYFESAQRKIPIHYAKR...QFNG.....RA...GSQ..NTH.MPFKLNMAGVIPPIFASSI..ILFPS...TLLGWF.....GSADTN............................S...............VLHK.IAGLL......................................QHGQLL [...]
+Q5NHU8_FRATT/74-416 SIFALGVMPYISASIIFQML................SA.VYPKFIELKKE.GESGQKKITQYTRYLTLALAIVQSFGIVAFVLHQ......DGLVTT.........NNMALFY..LTTIV..SVTTGSMFLMWLGEQITE.RGV.G.NGISLLIFSGIV.ANLPFE................................IS...NTLSQ.A..................NQ.H.VISYLS.........V........WVLLILLLLV.IAFVVFMESAQRKITVNYAKR...QQGR.....KMF..AAQ..TSH.LPLKLNMAGVIPAIFASSI..LMVPG...VLLGWL.....SNYNSL............................S...............WLAD.VAEML......................................QPGSIV [...]
+Q7WZR8_9GAMM/64-388 SIFSIGLMPYISASIIMQVI................TG.MFLDVE........VSKHKLTSYLRYLTFMLSVIHSLVVSILFLEKSV.....VYY............KKSVVY..LTIIL..TFVTGAIFLMWLGEQITD.KGI.G.NGISLIILSGLV.SVIPNA................................LG...RTLFLTI..................KD.S.SWMYIQ.........I........FKVVSLVLIT.IILVVVIESGQIRIKVSYPRR...LIGK.....KLY..ATQ..SSY.LPLKLNMAGVIPAIFASSS..LIITA...SVG..........................................Q...............WINRSILPQL......................................SPGQPL [...]
+A5EX98_DICNV/69-412 SLLALGVAPYISASIVMQLL................TH.MLPALKDLRQE.GSAGQKKITQYTRYFTLFLAIMQGFAISRTVMAAGMTISAGS.................GFL..LTATI..GLTAGALFMMWLGEQITE.RGI.G.NGISMLIFGGIA.VNMPSG................................IL...GLFNQAK.....................IGEIGYGR.........F........FLLLGIIVSL.FALIVYVERAQRRIKIHYAKR............QQFGTSAMGERFY.LPLKINMAGVIPAIFASAI..ITLLVSGLTLASSL.....PGAAG.............................R...............YLSDLAAGFH.......................................QGAWL [...]
+Q6MJ32_BDEBA/70-415 SIFALGIMPYISSSIIFQLL................TS.AIPYLEALKKE.GEQGRRKINQYTRYATVALAIIQGYGISTWLMNSTS..PDGHPLVIA......PTVAFLPFQ..IMTII..TLTAGTCFIMWLGEQITE.RGI.G.NGTSLIIFTGIA.AAIPGG................................AQ...QLWEL.V..................RT.G.EMRFAL.........V........LLLVAFMVAI.IAAVIYMEVAQRRITVQYSQR...QGGG.....GMQ..SMQTPTSH.LPIKLNISGVIPPIFASSL..LMFPA...TMAQFV.....NT................................P...............WLKA.LQDSL......................................NPSGAI [...]
+B5EFS0_GEOBB/71-411 TVFALGIMPYISSSIIFQLL................TV.VLPAVEKLSKE.GDAGRKKIIQYTRYGTIVLAVVQAFGISIGLEAMRG..PAGELVVP.........NPGWGFR..LMTVI..TLTAGTAFIMWLGEQMSE.KGI.G.NGISLIIFAGIV.ARIPTA................................IG...NSFRL.I..................KT.G.ELSLFV.........L........LLIAAVMFAV.IAAVVFMERGQRRIPIHYAKR...VVGL.....KTV..GAQ..SSH.LPLKVNMAGVIPPIFASSI..IMFPA...TVGNFI.....DV................................P...............WVQA.ASKQL......................................APGKLL [...]
+A3EVQ1_9BACT/75-412 TIFALGIMPYISASIILQLL................TV.VHPTLQAMAKE.GERGRKIITRYTRYLTVLIALVQSFGIALGLEGMNNGQ...FVPH...........PGWSFR..FIVVI..TLTAATTFVMWIGEQITE.RGV.G.NGISLIIFSGII.ARLPAA................................II...NTYKL....................YNQG.EISGFL.........I........LALVVMVFLI.VSSIVFIETARRKIPIQYAKR...LVGN.....KMM..GGQ..STH.IPFKINTAGVIPPIFASSL..ISFPA...IIAGFV.....SV................................P...............WIQS.FGKSL......................................SPGSFS [...]
+Q1MPP6_LAWIP/71-412 SVFALGIMPYISASIIMQLL................QV.IIPDFKRMAKEEGAAGRYKITQYTRYGTVIITLIQGIGIAIGLESMYS..PTNIPIVL.........EPGWVFR..IVTVL..TLTAGTVLIMWLGEQISE.KGI.G.NGISLIIFSGIV.VGIPGA................................IV...KTYQL.I..................IL.G.DMNILI.........A........LVLMLFMFAV.LTGVVFMERAQRRIPIQYAKR...QLGR.....KVY..GGQ..STH.LPLRVNTAGVIPPIFASSL..LLFPA...TMASFD.....IS................................D...............WLKD.IAVWF......................................SPSTIL [...]
+SECY_AQUAE/71-412 TVFALGVMPYISASIMMQLL................TV.AIPSLQRLAKEEGDYGRYKINEYTKYLTLFVATVQSLGIAFWIRGQVS..PKGIPVVE.........NPGISFI..LITVL..TLVAGTMFLVWIADRITE.KGI.G.NGASLIIFAGIV.ANFPNA................................VI...QFYEK.V..................KT.G.DIGPLT.........L........LLIIALIIAI.IVGIVYVQEAERRIPIQYPGR...QVGR.....QLY..AGR..KTY.LPIKINPAGVIPIIFAQAL..LLIPS...TLLNFV.....QN................................P...............FIKV.IADMF......................................QPGAIF [...]
+#=GR SECY_AQUAE/71-412 SS -SS----HHHHHHHHHHHHH................HH.HSS-SSS-S--------HHHHHHHHHHHHHHHHHHH---HHHH----S..------SS.........----THH..HHHHH..HHH---HHHHHHHHHHHH.---.-.---HHHHH---T.TTTTTT................................SS...----S.S..................--.-.----HH.........H........HHHHHHHHHH.H-----S--------------...----.....---..---..---.-----------HHHHHHHH..HHHHH...HHHHS-.....SS................................-...............---T.TTTSS......................................----HH [...]
+Q01WB2_SOLUE/74-438 TVFALGIMPYITASIILQLL................TV.VVPTLEKLQKE.GELGRRKITQWTRYLTIILSILQSFGISQGLMGM......QQGIVI.........NPGIGFV..FLTIL..SLTTGTAFIMWLGEQISE.RGV.G.NGMSLIIFTGIV.VGLPNA................................IA...NIYQH.V..................FTIH.DWGAIT.........L........IVLMALMVAV.VAFIVLVERGERRIPVQYAKR...VVGR.....RVM..GGQ..STH.MPLKVNAGGVIPVIFASSI..LAFPQ...TLAQFG.....WVKNL.............................P...............WLSK.TLATI......................................QHGEPM [...]
+Q08ZH8_STIAU/26-370 SIFGLGIMPYVSASIIMQLL................AV.VVPSLERLQKE.GASGRQKINQYTRYGSIVLSVVQGIGISRWLASLGR..SDAGQSGFNQI...VVPDDSAWFT..FMTVI..SLTAGTAFIMWLGERITE.RGI.G.NGISLIIFAGIV.AGLLPN................................GK...TLLDM.T..................AQ.G.AIEAAA.........L........VGLAVFMLFI.IAVVVYVERGMRRIPVQYAKR...MAGR.....RMF..AGQ..ATY.FPMKVNTSGVIPPIFAGAL..LSFPA...TLGTWF.......................................P...............FLQT.FRQGL......................................EGNPWL [...]
+A6GCG0_9DELT/70-411 SVFALGIMPYISASIIMQLM................TV.VIPKLEQLQKE.GETGRRKINQYSRYGTVGLALVQGYFMASWLEGQNT.....PGQTLV.......LETGLPFK..LMTML..SLTAGTCFLMWLGEQITE.RGI.G.NGISLIIFAGII.ADMPTA................................SY...QLAQKAI..................DDPE.NFGPLP.........L........AMLLVVVLVV.IAFVVIMERGQRRIPVIYAKR...VVGK.....RMF..GGS..QNY.LPLRINNAGVIPPIFASSI..IMFPA...QIAGMT.....GN................................P...............YLQR.FAAAF......................................SYGNWL [...]
+Q04PV8_LEPBJ/72-436 SIFALGIMPYISSSIVMQLF................MV.LVPSLQKLQKE.GEEGRKKIGQYTKYGTVILCAIQSLAVIQLAKGWST..GTELEPARYPG..LINSSVVPYFY..LIGIL..SITTGTVLLIWLGEQITE.RGI.G.NGISLLIFAGII.GRLPES................................MV...QLFST.......................D.TMDALN.........V........LILLILLILL.ISLTVLLTQGVRKVPLQYGKQ...MVGR.....KMV..QAK..SQS.IPFKVNGANVMPIIFASSL..ILFPQ...TIIQWL.....SSSSE.............................Q...............WAGWAIIMDFFN.PFSQ..............................IWYHALF [...]
+SECY_BORBU/72-409 SIFMLSIGPYISASIIVQLL................VY.SFPSLKKMQE..GDGGRQKTKKYTKYLTIVAAVVQGYATSLYAKGIPG.....AVTI...........PFYRYI..FVAIL..TVTTGTFILLWFGEQINQ.RGV.G.NGTSLIIFSGIV.VRLQAA................................LF...NLFQS.M..................QDPSQNVNPVF.........V........ILIISIFILV.VILIIYEYKAQMRIAIHYARA............NSN..NTV..SSY.LPIKLNPSGVLPVIFASVL..ITLPL...QILSGF.....AETS..............................S...............IARQ.ILSYL......................................RPNGFY [...]
+Q73PL2_TREDE/73-413 SVFMLGVMPYISTQILMQLA................MI.IFPRLKKIAEE..DGGRKKIQVWTRIVTVFVALLQSSAVGTWARAIPGAVVISS.................PVLHLFITMV..TVTTGTMITVWMGEQITA.RGI.G.NGISMLIFAGIV.ARLPQA................................VW...ELIKLVS.....................NNELNLVF.........V........IIAFAMFVGI.IALVVYEQQGQRKIPVHYAKR...VIGR.....KMY..GGQ..NTY.IPFKINPSGVIPIIFASSF..LTFPL...MLSQMW.....GSNVS.............................................WLAS.VARFL......................................RSDGWG [...]
+Q67JW3_SYMTH/69-405 AIVAMGVTPYINSSIIMQLL................TV.VIPRLEELQKE.GEEGRKKIQQYTRYGAVVLGLVQAFGIGYALRSYGAFYSNS...................WTTLFVIMV..SLTAGTALVMWIGEEITE.KGI.G.NGISLIIFANIV.SRLPYS................................IY...NEILL....................LRAG.QRNIFQ.........P........LLVAVVALLM.VVFVVIINEAVRKIPVEYAKR...VVGR.....RVV..GGQ..RTH.LPIRINQAGVIPLIFASSL..MYFPI...TIAGFF.....PNS...............................D...............FAVF.VGRYL......................................DTRSWW [...]
+A7FQ38_CLOB1/69-409 SIFAMGVVPYINSSIIMQLL................TI.ALPSLESLSKE.GEEGRKKIQQYTRYGAVILAVIQAFSTYAIIARAGALRDGS...................KLNLFIIII..TVTTASTFLMWFGDKITE.KGI.G.NGISLIIFVNIV.SRFPST................................IY...SIVGL....................QKAE.TVNFVE.........V........IVFIVIALAL.FLLVVIMNLGERRIPVQYAGR...AVGN.....KIY..KGQ..STH.IPINVNSSAVIGIIFAISV..MQFPI...TIGQFW.....PESAFY............................K...............FITLNQYSPF......................................RDKSIA [...]
+A6LPT1_CLOB8/69-416 SILALGVMPYINASIIIQLL................TV.AIPQLEQLSKE.GDTGRKKIQNATRYVSLGIAFILAYGIFATISSSGATVGLT...................AIQKTIVVF..ALVVGTTFCMWLGDQLTV.KGI.G.NGTSILIFVNII.SRVPAT................................IA...SMMTL....................QQAG.SASIVE.........I........VLFGVFTVFL.LATILYFSLSERRIPVQYAGK..FASGN....SNMV..KSQ..STH.IPLSIIGSAVLAIIFSMSV..MDFPK...TIATLFGGVGESQKEWA............................K...............WVLNNPTSIF......................................NNKSWM [...]
+Q0SQG4_CLOPS/69-409 SIFALGVVPYINASIIMQLL................TV.AIPKLEQLSKE.GDDGRKKIQKITRYASIVIGAITAYGSYVIIHNVGALKSNS...................PVSMFLILL..TLVVGSTFLMWLGDQITV.KGV.G.NGTSLIIFANIL.SSLPMT................................GY...QIYNL....................SKIG.KINVVE.........I........ALFIFFTLAL.LAGVIYLSLAERRITVQYAGK...AVGN.....KMM..KGQ..STH.IPLSIIGTTVIAIIFAMSV..MSFPT...TIAQFF.....PEAGWS............................Q...............WITGSSYSPF......................................NAKTWM [...]
+A9KJH4_CLOPH/71-425 SLFALGIGPYITSSIIMQLL................TI.AIPKLEEMQKD.GESGRKKIAEISRYVTIGLSIIESVAMVIGFSGSGALEGGL..................TFTNIVVITA..SFTAGSAILMWLGERITE.KGV.G.NGISVILLINIV.ANMPRD................................IY...GLIEKFV..................LGESVVKGVTA.........A........IIIVAVILLS.VVLIILLNAAQRKIAVQYAKK...VQGR.....KMV..GGQ..SSH.IPLKVNTAGVIPVIFAVSI..MQFPI...IIASFF.....GVQPARAY........................FWP...............KVLHMLNSQSWFNIKNG...............................EFKYTV [...]
+A7VH89_9CLOT/71-420 SIFALNVTPYITASIIIQLL................TI.AIPALEEMQKD.GEDGRKKITAITRFLTIGLAILESAGLAINFGRKGFMDSYN...................FWTVLTMIV..ILTGGSAFVMWLGERVTD.RGV.G.NGISIILLINIV.STMPND................................FK...NIYTQFI..................KDKDPVRMCLI.........A........LLVVAIVVCV.TILVCMLQGAERKIPVQYAKK...VQGR.....KQM..GGQ..SSN.IPLKVNTAGVIPVIFASSL..MAIPS...IITSLF.....GK.SPSGV........................GAK...............ILQG.MSQSYWF.NA.N...............................YPWGFL [...]
+A6BIS2_9FIRM/71-421 SVFALSITPYITSSIIVQLL................TI.AIPQLEEMQRD.GETGRKKIVAITRYLTVGLALIESGAMAVGFGRQGLLVKYN...................FVNAAIVVL..TLTAGSAFLMWIGERITE.KGV.G.NGISIVLVINII.SRIPSD................................MK...TLFDQFV..................KGKAIASACLA.........V........CVIIAIILAL.VVFTVILQDGERRIAVQYSQK...IVGR.....RSY..GGQ..STN.IPLKVNTAGVIPIIFSSSL..MQFPI...VIASFL.....GKDNGSGI........................GSE...............ILRG.LNQSNWCNPEQI..............................KYSW... [...]
+A7VR33_9CLOT/71-423 TLFAMSVTPYINSSIIMQLL................TV.AIPPLERMAKE.GEEGRKKIGAITRYVAVVLGLVQGLAYYLYLRGSSY.....EGTPIVTY...TEGAAGVFTA..IVIVL..VFTAGTAMMMWLGEQINQ.KGI.G.NGISILLFAGIV.ARLPDTVN............................ILVQ...ALQAAWQ..................APDSFGQYYFF.........V........PLFVIIFLAI.IWVIVFMNDAERRIPVQYAKR...VVGR.....KMY..GGQ..STH.LPIKVNMSGVMPIIFASSI..LTIPS...TIQLFV.....TPT...............................G...............FWKT.VLDAL......................................STTGWV [...]
+A6NXF0_9BACE/71-437 TVFALGVQPYINSSIIIQLL................TV.AIPALERLQKEGGEEGRKKIAAITRYTTVAIALLQGFGYFTLINANGLVGSDLP.................TWLAGIIIVL..TFTAGSAFVMWLGEQITE.FGI.G.NGISIILFAGIV.SRFPSM................................LM...NMVQGVQRWSMHLSDEEISAMSNGEAFRNSLVHPAM.........I........PLIIIGILAL.VVFIVFINDSERRIPVQYAKR...VVGR.....KMY..GGQ..SSH.IPLKVNMSGVMPIIFAQAI..ASLPA...TIAAFI.....P.................................G...............GMDSTFMKVF......................................DSNGLV [...]
+Q250L2_DESHY/70-413 SVFALSITPYITASIILQLL................TI.VIPSLERLAKE.GEFGRKKITQYTRYGTVILGFIQGFGMTFGLRGALIIPKPGM.................EWAIYLLVAL..ILTAGTAFLMWLGERITE.NGI.G.NGISLIIFAGIV.AGVPDA................................IK...RIAGL....................LSVG.EINVFS.........V........FGLIVIGLGI.IAGVVFIQEGQRRIQVQYAKR...VVGR.....RVY..GGQ..SSH.IPMKVNQAGVIPIIFAISL..LAFPS...TIATWM.....DPAS..............................A...............YVRF.VNTWF....VMN..............................GSLTSIP [...]
+Q8R7X3_THETN/69-402 TIFAMSIVPYINASIIMQLL................TI.AIPSLEQLAKE.GEEGRKKIAQYTRYLTVVLALIQAIGMTIGLRSAVINPT.....................FFRLTVIVI..TLTAGTTFLMWLGERITE.NGL.G.NGSSLIIFAGII.SRIPNM................................IY...LTHEY....................IKAG.TSNIFG.........A........IAFVVAELIM.IVLIILATEGQRRIPVQYAKR...VVGR.....RVY..GGQ..STH.IPIRINMAGVIPIIFAISL..LQFPQ...QLATFF.....PHS...............................S...............FYNF.VQKWL......................................STNGLI [...]
+A4XLR1_CALS8/69-419 SIFAMSVTPYINSSIIMQLL................TI.AIPALEELAKQ.GEEGRKKLAEWTRYGTAILAFLQAVGIYFGLKNAQGLTGGVPVIT..........TQGQGFLGFITITL..ALTAGTVFLMWIGEQITE.NGI.G.NGISLLIFAGII.SRIPNG................................AV...SLWNYVA.................KLNEFSLTSIIG.........V........LLFLVMALAI.IVFIIVIQEGERRIPVQYAKR...IVGR.....RVY..GGQ..STH.IPIKVNIAGVIPIIFAISL..VMLPT...TIAQFF.....PNS...............................G...............FYKF.VKAYF......................................SSGSFW [...]
+A3DJJ2_CLOTH/71-411 TIFAMSITPYINASIIIQLL................TV.AIPKLEALAKE.GEEGRKAIAEYTRYGAVVLGFLQATAFYFGLAQAVNERN.....................VLSFITITL..TFTAGTAFLMWLGEQITE.YGI.G.NGISLLIFAGIV.SRGPRG................................ILYLWDLYRLER..................LGKG.ILGIFG.........V........LGVLLLFVVI.IASVVWVDQAERRIPVQYAKR...VVGR.....KMY..GGQ..STH.IPIKVNMAGVLPIIFATSF..VALPA...TIVGFF....FPNSTH.............................P....................VAEYF......R...............................SFQSRI [...]
+A8MLG0_ALKOO/69-408 TIFALSISPYITSSIIMQLL................TI.AIPSLEALAKE.GEEGSKKIAQYQRYATIILALIQATGISVGLFRGALINQD....................TFSIIVVIL..TLTAGTAFLMWLGEQITE.KGI.G.NGISLLIFAGII.ASLPSS................................LF...TTFAL....................TKAG.QINPLA.........I........ILFIVIAIAM.IVAVVAIEAGTRKIPVQYAKR...VVGR.....KMY..GGQ..SSH.IPLKVNQSGVMPVIFAMSL..LQFPH...TIAYFI.....GSEG..............................G...............FAKF.LNTWL......SP............................TGMPGVFI [...]
+Q18CH6_CLOD6/69-406 SLFALGISPYITASIIIQLL................TV.GFESLAELQKS.GEEGKKKINKYTKYTALALAVVQALGITLGIVRSALISNS....................VFFITTVVI..TLVSASMLVMWIGDKITE.KGI.G.NGSSVIIFAGII.SRIPTD................................VI...KISQQ....................VKSG.EVAPWV.........I........VILAVVILLT.VTGVTFIQEATRKIPVQYAKR...VVGR.....KMY..GGQ..SSH.IPMKVNQSGVMPIIFASSL..LAFPQ...TIAMFM.....GPNAQ.............................A...............FVQKYLSMAT......................................EQGFWT [...]
+B8D0S8_HALOH/72-406 TIFAMSITPYITASIILQLL................TG.VIPRLEELQKQ.GVEGRKKLTQYTRYGTVVLAIIQAFGITMLIGRHNVIVNPN...................LFNLMLIVI..SLTAGTAFLMWLGEQITD.KGI.G.NGISIIIFTSII.SRFPSY................................IH...RNWEL....................YKTG.DITALN.........I........LFFLVLAVVI.IAGVIFIQQGERRIPVQYSKR...VVGR.....KVY..GGR..STH.IPMRINQAGVIPVIFAQAV..LQFPT...VIAAVL.....PY................................G...............WAQD.IATAL......................................EPGKPV [...]
+#=GC SS_cons BTT----HCCCCCCCHHHHC................CC.CSCCCCCHCC-------CCHHHHHHHHHHHHHHHHH-HCCCCC----S..-S----SS.........----THHHHHHHHH..HHH---HHHHHHHHHHCC.---.-.---CHHHH---CCCCCCCT................................CC...HH--S.S..................--.-.---CCH.........H........HHHHHHHHHH.H---HHCHC-EEEEEEE----...----.....---..---..ECE.EEEESS----HHHHHHHHH..CCHHH...HCCCT-.....TTS...............................-...............TTTT.TCCCC......................................-TTSHH [...]
+#=GC seq_cons olhuLGIhPaIoASIIhQLL...................shspLtclpcp.GcpGRc+lsphoRhholllullQuhuhshhhtths.........................hh..lhhll..pLssGohhlhWLuEhIoc.hGl.G.NGlSLlIhsuIl.sslsts................................lh...phhphh......................t..hshhh.........h........lhhllhhlhl.lhhllalppup++IPlpas+p.................tsp..psa.lPlKlNhuGVlPlIFAsul..lhhPt...hluphh......pt...............................t...............hhtp.lshhh.......................................hpshh [...]
+//
diff --git a/demotic/examples/example.fa b/demotic/examples/example.fa
new file mode 100644
index 0000000..9b1f523
--- /dev/null
+++ b/demotic/examples/example.fa
@@ -0,0 +1,12 @@
+>sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium sp. (strain NGR234) GN=NGR_a00980 PE=4 SV=1
+MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT
+TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF
+AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRP
+N
+>sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspergillus oryzae GN=hacA PE=2 SV=1
+MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD
+ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK
+HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS
+EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
diff --git a/demotic/examples/example.fasta.out b/demotic/examples/example.fasta.out
new file mode 100644
index 0000000..38392e2
--- /dev/null
+++ b/demotic/examples/example.fasta.out
@@ -0,0 +1,5870 @@
+# /usr/local/fasta-36x2/bin/fasta36_t -q example.fa /misc/data0/databases/Uniprot/uniprot_sprot.fasta
+FASTA searches a protein or DNA sequence data bank
+ version 36.04 January, 2010
+Please cite:
+ W.R. Pearson & D.J. Lipman PNAS (1988) 85:2444-2448
+
+Query: example.fa
+ 1>>>sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium sp. (strain NGR234) GN=NGR_a00980 - 181 aa
+Library: /misc/data0/databases/Uniprot/uniprot_sprot.fasta 181677051 residues in 516081 sequences
+
+ opt E()
+< 20 558 0:=
+ 22 0 0: one = represents 934 library sequences
+ 24 3 0:=
+ 26 2 11:*
+ 28 11 117:*
+ 30 120 710:*
+ 32 838 2746:= *
+ 34 3876 7447:===== *
+ 36 12656 15294:============== *
+ 38 28083 25276:===========================*===
+ 40 44462 35258:=====================================*==========
+ 42 53797 43098:==============================================*===========
+ 44 55983 47542:==================================================*=========
+ 46 48483 48422:===================================================*
+ 48 42188 46359:============================================== *
+ 50 36235 42303:======================================= *
+ 52 32159 37191:=================================== *
+ 54 27781 31768:============================== *
+ 56 24404 26536:=========================== *
+ 58 20107 21785:====================== *
+ 60 16997 17647:==================*
+ 62 13727 14148:===============*
+ 64 11688 11252:============*
+ 66 9240 8893:=========*
+ 68 7082 6995:=======*
+ 70 5456 5482:=====*
+ 72 4389 4283:====*
+ 74 3394 3340:===*
+ 76 2590 2599:==*
+ 78 2111 2020:==*
+ 80 1752 1569:=*
+ 82 1261 1200:=*
+ 84 948 951:=*
+ 86 795 736:*
+ 88 617 569:* inset = represents 7 library sequences
+ 90 401 440:*
+ 92 341 341:* :=======================================*
+ 94 233 264:* :================================== *
+ 96 164 204:* :======================== *
+ 98 145 158:* :===================== *
+ 100 97 122:* :============== *
+ 102 82 94:* :============ *
+ 104 70 73:* :==========*
+ 106 31 57:* :===== *
+ 108 39 44:* :======*
+ 110 22 34:* :====*
+ 112 22 26:* :===*
+ 114 16 20:* :==*
+ 116 10 16:* :==*
+ 118 20 12:* :=*=
+>120 20 9:* :=*=
+181677051 residues in 516081 sequences
+Statistics: Expectation_n fit: rho(ln(x))= 5.0921+/-0.000195; mu= 6.0172+/- 0.011
+ mean_var=67.4672+/-14.288, 0's: 51 Z-trim: 53 B-trim: 3380 in 1/65
+ Lambda= 0.156145
+ statistics sampled from 60000 (278110) to 515494 sequences (mod: 1)
+ Kolmogorov-Smirnov statistic: 0.0435 (N=29) at 46
+Algorithm: FASTA (3.6 Jan 2009) [optimized]
+Parameters: BL50 matrix (15:-5) ktup: 2
+ join: 42 (0.083), opt: 30 (0.584), open/ext: -10/-2, width: 16
+ Scan time: 11.160
+
+The best scores are: opt bits E(516081)
+sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG ( 181) 1141 265.5 2e-70
+sp|Q7SY73|ABH6B_XENLA Monoacylglycerol lipase abhd ( 337) 108 33.0 3.6
+
+>>sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=R (181 aa)
+ initn: 1141 init1: 1141 opt: 1141 Z-score: 1399.6 bits: 265.5 E(516081): 2e-70
+Smith-Waterman score: 1141; 100.0% identity (100.0% similar) in 181 aa overlap (1-181:1-181)
+
+ 10 20 30 40 50 60
+sp|P55 MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|P55 MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT
+ 10 20 30 40 50 60
+
+ 70 80 90 100 110 120
+sp|P55 TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|P55 TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF
+ 70 80 90 100 110 120
+
+ 130 140 150 160 170 180
+sp|P55 AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRP
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|P55 AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRP
+ 130 140 150 160 170 180
+
+
+sp|P55 N
+ :
+sp|P55 N
+
+
+>>sp|Q7SY73|ABH6B_XENLA Monoacylglycerol lipase abhd6-B (337 aa)
+ initn: 47 init1: 47 opt: 108 Z-score: 138.1 bits: 33.0 E(516081): 3.6
+Smith-Waterman score: 108; 24.6% identity (57.7% similar) in 130 aa overlap (41-164:65-189)
+
+ 20 30 40 50 60 70
+sp|P55 SNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGTTADDQLAFVS
+ ::: .. ..:. ..:... : :..:.
+sp|Q7S IRIYYWYWRRALGMQVKYSSYGNYKFCYTARGKPGNKPSVLM--LHGFSAHKDMWLGMVK
+ 40 50 60 70 80 90
+
+ 80 90 100 110 120
+sp|P55 LIADQGETTTVAF-GPEIGSRIAASFMAACGQLQ--HQIATRTGKEERKFKPFAAAGFSV
+ .. . . . : . : : :: : .... :::.. ::.. : .. ::: .: :.
+sp|Q7S FLPKNLHLVCVDMPGHEGTSRSALDYYSICGQVKRIHQFVESIGLNK---KPFHLVGTSM
+ 100 110 120 130 140
+
+ 130 140 150 160 170 180
+sp|P55 R---AGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRPN
+ ::. : . . :.. . : . . . :..:.
+sp|Q7S GGNVAGVYAAQHPTHISSLTLICPAGLMYPIESKFLKQLKVLEKSGDNQRIPLIPSTAGE
+ 150 160 170 180 190 200
+
+sp|Q7S MEDMLRLCSFVRFKIPQQVLQGLIDERIPHNEFYRKLFLALVDEKSRHSLHENMNKIMAP
+ 210 220 230 240 250 260
+
+ 2>>>sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspergillus oryzae GN=hacA - 345 aa
+Library: /misc/data0/databases/Uniprot/uniprot_sprot.fasta 181677051 residues in 516081 sequences
+
+ opt E()
+< 20 552 0:=
+ 22 0 0: one = represents 937 library sequences
+ 24 1 0:=
+ 26 0 11:*
+ 28 2 117:*
+ 30 14 710:*
+ 32 257 2746:= *
+ 34 2276 7448:=== *
+ 36 10190 15296:=========== *
+ 38 26420 25279:==========================*==
+ 40 42419 35262:=====================================*========
+ 42 52939 43104:==============================================*==========
+ 44 56211 47547:==================================================*=========
+ 46 52753 48428:===================================================*=====
+ 48 48517 46364:=================================================*==
+ 50 42369 42308:=============================================*
+ 52 35656 37195:=======================================*
+ 54 30193 31771:=================================*
+ 56 24361 26539:========================== *
+ 58 19644 21788:===================== *
+ 60 15073 17649:================= *
+ 62 11970 14150:============= *
+ 64 9165 11253:========== *
+ 66 7325 8894:======== *
+ 68 5598 6996:====== *
+ 70 4251 5482:=====*
+ 72 3363 4284:====*
+ 74 2804 3340:===*
+ 76 2216 2600:==*
+ 78 1756 2021:==*
+ 80 1503 1569:=*
+ 82 1074 1200:=*
+ 84 955 951:=*
+ 86 697 736:*
+ 88 516 569:* inset = represents 9 library sequences
+ 90 465 440:*
+ 92 423 341:* :=====================================*==
+ 94 350 264:* :=============================*=========
+ 96 240 204:* :======================*====
+ 98 192 158:* :=================*====
+ 100 169 122:* :=============*=====
+ 102 133 95:* :==========*====
+ 104 130 73:* :========*======
+ 106 91 57:* :======*====
+ 108 77 44:* :====*====
+ 110 59 34:* :===*===
+ 112 53 26:* :==*===
+ 114 50 20:* :==*===
+ 116 42 16:* :=*===
+ 118 27 12:* :=*=
+>120 275 9:* :*==============================
+181677051 residues in 516081 sequences
+Statistics: Expectation_n fit: rho(ln(x))= 6.2367+/-0.000211; mu= 5.0578+/- 0.012
+ mean_var=113.9719+/-22.498, 0's: 53 Z-trim: 72 B-trim: 0 in 0/66
+ Lambda= 0.120137
+ statistics sampled from 60000 (215252) to 515555 sequences (mod: 1)
+ Kolmogorov-Smirnov statistic: 0.0383 (N=29) at 50
+Algorithm: FASTA (3.6 Jan 2009) [optimized]
+Parameters: BL50 matrix (15:-5) ktup: 2
+ join: 43 (0.127), opt: 31 (0.659), open/ext: -10/-2, width: 16
+ Scan time: 17.160
+
+The best scores are: opt bits E(516081)
+sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hac ( 345) 2265 403.1 2.8e-111
+sp|Q8TFU8|HAC1_EMENI Transcriptional activator hac ( 350) 1740 312.1 7e-84
+sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac ( 451) 393 78.7 1.6e-13
+sp|P41546|HAC1_YEAST Transcriptional activator HAC ( 238) 240 52.0 9.7e-06
+sp|O24646|HY5_ARATH Transcription factor HY5 OS=Ar ( 168) 225 49.2 4.5e-05
+sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bo ( 261) 200 45.1 0.0013
+sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive elemen ( 519) 203 45.8 0.0015
+sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper ( 631) 201 45.6 0.0022
+sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=So ( 158) 191 43.3 0.0026
+sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element- ( 520) 191 43.8 0.0062
+sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive elemen ( 519) 189 43.4 0.0079
+sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive elemen ( 519) 187 43.1 0.01
+sp|A3LYI0|NST1_PICST Stress response protein NST1 (1234) 190 43.9 0.013
+sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive elemen ( 525) 183 42.4 0.016
+sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive elemen ( 428) 181 41.9 0.018
+sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive elemen ( 520) 182 42.2 0.018
+sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive elemen ( 520) 182 42.2 0.018
+sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive elemen ( 521) 179 41.7 0.026
+sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Ho ( 261) 174 40.6 0.029
+sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus ( 338) 175 40.8 0.031
+sp|Q8W191|HYH_ARATH Transcription factor HY5-like ( 149) 165 38.8 0.056
+sp|P53539|FOSB_HUMAN Protein fosB OS=Homo sapiens ( 338) 169 39.8 0.064
+sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element- ( 521) 171 40.3 0.069
+sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive elemen ( 456) 169 39.9 0.08
+sp|Q9TUB3|FOSB_CANFA Protein fosB OS=Canis familia ( 338) 166 39.3 0.091
+sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcri ( 349) 165 39.1 0.11
+sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element- ( 470) 165 39.2 0.13
+sp|Q90370|MAFB_COTJA Transcription factor MafB OS= ( 311) 161 38.4 0.16
+sp|Q90888|MAFB_CHICK Transcription factor MafB OS= ( 311) 161 38.4 0.16
+sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scro ( 380) 160 38.3 0.2
+sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive elemen ( 479) 161 38.5 0.22
+sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcri ( 351) 159 38.1 0.22
+sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocr ( 381) 159 38.1 0.23
+sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus mu ( 380) 158 37.9 0.26
+sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive elemen ( 461) 159 38.2 0.27
+sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive elemen ( 395) 158 37.9 0.27
+sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF ( 401) 158 37.9 0.27
+sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcri ( 483) 159 38.2 0.28
+sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcri ( 494) 159 38.2 0.28
+sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive elemen ( 395) 157 37.8 0.3
+sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS= ( 323) 154 37.2 0.37
+sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein ( 381) 155 37.4 0.37
+sp|P51145|FOSL2_RAT Fos-related antigen 2 OS=Rattu ( 327) 154 37.2 0.38
+sp|Q9UQ88|CD11A_HUMAN Cell division protein kinase ( 780) 159 38.4 0.4
+sp|Q9WVS8|MK07_MOUSE Mitogen-activated protein kin ( 806) 159 38.4 0.41
+sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive elemen ( 428) 155 37.4 0.41
+sp|P15408|FOSL2_HUMAN Fos-related antigen 2 OS=Hom ( 326) 153 37.0 0.42
+sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcri ( 413) 154 37.3 0.45
+sp|P29747|CREBA_DROME Cyclic AMP response element- ( 516) 155 37.5 0.47
+sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS= ( 323) 152 36.8 0.47
+sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Ratt ( 267) 150 36.4 0.52
+sp|P54842|MAFB_RAT Transcription factor MafB OS=Ra ( 323) 151 36.6 0.53
+sp|P47930|FOSL2_MOUSE Fos-related antigen 2 OS=Mus ( 326) 151 36.7 0.54
+sp|Q2VZV0|IF2_MAGSA Translation initiation factor ( 872) 157 38.0 0.55
+sp|Q0CEI3|KAPC_ASPTN Putative transcription factor ( 286) 150 36.4 0.55
+sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive elemen ( 404) 152 36.9 0.56
+sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcript ( 347) 151 36.7 0.56
+sp|P54841|MAFB_MOUSE Transcription factor MafB OS= ( 323) 150 36.5 0.6
+sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos ta ( 380) 151 36.7 0.6
+sp|A1C9M5|KAPC_ASPCL Putative transcription factor ( 288) 149 36.3 0.62
+sp|Q504L8|MAFB_XENTR Transcription factor MafB OS= ( 316) 149 36.3 0.67
+sp|O57342|MAFA_COTJA Transcription factor MafA OS= ( 286) 148 36.1 0.7
+sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcri ( 348) 149 36.3 0.72
+sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element- ( 367) 149 36.3 0.75
+sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus n ( 380) 149 36.4 0.77
+sp|Q16520|BATF_HUMAN Basic leucine zipper transcri ( 125) 142 34.7 0.77
+sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mu ( 267) 146 35.7 0.84
+sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo s ( 380) 148 36.2 0.86
+sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive elemen ( 357) 147 36.0 0.93
+sp|A4R2R1|NST1_MAGGR Stress response protein NST1 (1319) 155 37.9 0.95
+sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive elemen ( 370) 147 36.0 0.96
+sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis ( 381) 147 36.0 0.98
+sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcr ( 127) 139 34.2 1.1
+sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive elemen ( 508) 147 36.1 1.2
+sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Ara ( 315) 144 35.4 1.2
+sp|A2R346|KAPC_ASPNC Putative transcription factor ( 283) 143 35.2 1.3
+sp|O42290|MAFA_CHICK Transcription factor MafA OS= ( 286) 143 35.2 1.3
+sp|O43889|CREB3_HUMAN Cyclic AMP-responsive elemen ( 395) 145 35.7 1.3
+sp|O60841|IF2P_HUMAN Eukaryotic translation initia (1220) 151 37.1 1.4
+sp|Q5KGK5|EIF3A_CRYNE Eukaryotic translation initi ( 952) 149 36.7 1.5
+sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcr ( 118) 135 33.5 1.7
+sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive elemen ( 428) 143 35.4 1.7
+sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS= ( 313) 141 34.9 1.7
+sp|Q7TSC1|BAT2_MOUSE Large proline-rich protein BA (2158) 153 37.7 1.7
+sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcr ( 703) 146 36.1 1.7
+sp|Q54Y73|BZPD_DICDI Probable basic-leucine zipper ( 834) 147 36.3 1.8
+sp|P18625|FOSL2_CHICK Fos-related antigen 2 OS=Gal ( 323) 141 34.9 1.8
+sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodop ( 381) 142 35.1 1.8
+sp|O35284|BATF_MOUSE Basic leucine zipper transcri ( 125) 135 33.5 1.8
+sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Hom ( 295) 140 34.7 1.9
+sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus ( 295) 140 34.7 1.9
+sp|Q63ZM7|STABP_XENLA STAM-binding protein-like OS ( 416) 142 35.2 1.9
+sp|P29681|IMPE2_DROME 20-hydroxyecdysone protein O ( 466) 142 35.2 2.1
+sp|O35451|ATF6B_MOUSE Cyclic AMP-dependent transcr ( 699) 144 35.7 2.2
+sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS= ( 171) 135 33.6 2.3
+sp|O13024|INCEA_XENLA Inner centromere protein A O ( 873) 145 36.0 2.3
+sp|A0JMT0|CA1AB_XENLA Chromatin assembly factor 1 ( 885) 145 36.0 2.3
+sp|Q5RDE1|IF2P_PONAB Eukaryotic translation initia (1220) 147 36.4 2.3
+sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS= ( 289) 138 34.4 2.3
+sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattu ( 295) 138 34.4 2.4
+sp|Q54NF3|Y6434_DICDI Uncharacterized protein DDB_ ( 412) 140 34.8 2.4
+sp|P15336|ATF2_HUMAN Cyclic AMP-dependent transcri ( 505) 141 35.1 2.5
+sp|Q553B1|DDX46_DICDI ATP-dependent RNA helicase d (1151) 146 36.2 2.5
+sp|P48634|BAT2_HUMAN Large proline-rich protein BA (2157) 149 37.0 2.8
+sp|Q5TM26|BAT2_MACMU Large proline-rich protein BA (2160) 149 37.0 2.8
+sp|A3BYC1|HOX25_ORYSJ Homeobox-leucine zipper prot ( 320) 137 34.2 2.9
+sp|P16951|ATF2_MOUSE Cyclic AMP-dependent transcri ( 487) 139 34.7 3.1
+sp|Q96RN5|MED15_HUMAN Mediator of RNA polymerase I ( 788) 142 35.4 3.1
+sp|Q2UNX4|KAPC_ASPOR Putative transcription factor ( 284) 135 33.8 3.3
+sp|Q80U35|ARHGH_MOUSE Rho guanine nucleotide excha (2057) 147 36.6 3.5
+sp|P0C865|MK07_RAT Mitogen-activated protein kinas ( 806) 141 35.2 3.5
+sp|P97875|JDP2_MOUSE Jun dimerization protein 2 OS ( 163) 131 32.9 3.5
+sp|Q78E65|JDP2_RAT Jun dimerization protein 2 OS=R ( 163) 131 32.9 3.5
+sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive elemen ( 368) 136 34.1 3.6
+sp|P48755|FOSL1_MOUSE Fos-related antigen 1 OS=Mus ( 273) 134 33.6 3.6
+sp|A2AJI0|MA7D1_MOUSE MAP7 domain-containing prote ( 846) 141 35.3 3.7
+sp|Q00312|RBF1_CANAL Transcription factor RBF1 OS= ( 527) 138 34.6 3.7
+sp|O35413|SRBS2_RAT Sorbin and SH3 domain-containi (1196) 143 35.7 3.7
+sp|P97876|BATF3_RAT Basic leucine zipper transcrip ( 133) 129 32.5 3.9
+sp|O93602|ATF2_CHICK Cyclic AMP-dependent transcri ( 487) 137 34.4 3.9
+sp|Q5F489|TAF3_CHICK Transcription initiation fact ( 930) 141 35.3 3.9
+sp|Q6CBW0|NST1_YARLI Stress response protein NST1 ( 889) 140 35.1 4.3
+sp|Q9CXK9|RBM33_MOUSE RNA-binding protein 33 OS=Mu (1231) 142 35.6 4.3
+sp|Q554P0|BZPJ_DICDI Probable basic-leucine zipper ( 787) 139 34.9 4.4
+sp|Q55EQ3|Y9086_DICDI Uncharacterized abhydrolase ( 937) 140 35.1 4.4
+sp|O75037|KI21B_HUMAN Kinesin-like protein KIF21B (1637) 143 35.8 4.7
+sp|O14273|YET4_SCHPO Meiotically up-regulated prot ( 647) 137 34.5 4.8
+sp|P19880|YAP1_YEAST AP-1-like transcription facto ( 650) 137 34.5 4.8
+sp|Q6IPM2|IQCE_HUMAN IQ domain-containing protein ( 695) 137 34.5 5.1
+sp|Q98UK4|MAF_DANRE Transcription factor Maf OS=Da ( 327) 132 33.4 5.3
+sp|Q556Q3|IRLF_DICDI Probable serine/threonine-pro (1400) 141 35.4 5.3
+sp|P14233|TGA1B_TOBAC TGACG-sequence-specific DNA- ( 242) 130 32.9 5.4
+sp|Q8CH25|SLTM_MOUSE SAFB-like transcription modul (1031) 139 35.0 5.4
+sp|O81025|P2A03_ARATH Putative protein PHLOEM PROT ( 463) 134 33.8 5.4
+sp|P20226|TBP_HUMAN TATA-box-binding protein OS=Ho ( 339) 132 33.4 5.4
+sp|Q4WG58|PAN1_ASPFU Actin cytoskeleton-regulatory (1467) 141 35.5 5.5
+sp|B0YC95|PAN1_ASPFC Actin cytoskeleton-regulatory (1467) 141 35.5 5.5
+sp|Q00969|ATF2_RAT Cyclic AMP-dependent transcript ( 487) 134 33.9 5.6
+sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Ho ( 591) 135 34.1 5.7
+sp|Q6MG48|BAT2_RAT Large proline-rich protein BAT2 (2161) 143 35.9 5.8
+sp|P0C5H8|KAPC_EMENI Putative transcription factor ( 278) 130 33.0 5.9
+sp|Q9M7Q3|AI5L6_ARATH ABSCISIC ACID-INSENSITIVE 5- ( 454) 133 33.7 6
+sp|Q6P9R4|ARHGI_MOUSE Rho guanine nucleotide excha (1021) 138 34.8 6
+sp|Q9NWH9|SLTM_HUMAN SAFB-like transcription modul (1034) 138 34.8 6.1
+sp|O60308|K0562_HUMAN Uncharacterized protein KIAA ( 925) 137 34.6 6.3
+sp|A2Z0Q0|HOX25_ORYSI Homeobox-leucine zipper prot ( 260) 129 32.8 6.4
+sp|Q6Y7W6|PERQ2_HUMAN PERQ amino acid-rich with GY (1299) 139 35.1 6.4
+sp|Q4WA21|KAPC_ASPFU Putative transcription factor ( 280) 129 32.8 6.7
+sp|Q9QXL1|KI21B_MOUSE Kinesin-like protein KIF21B (1668) 140 35.3 6.9
+sp|P21127|CD11B_HUMAN Cell division protein kinase ( 795) 135 34.2 7.2
+sp|Q789F3|MAF_CHICK Transcription factor Maf OS=Ga ( 359) 130 33.0 7.2
+sp|Q6A000|K0753_MOUSE Uncharacterized protein KIAA ( 959) 136 34.4 7.3
+sp|P23091|MAF_AVIS4 Transforming protein Maf OS=Av ( 369) 130 33.1 7.4
+sp|Q5RCJ1|CIP4_PONAB Cdc42-interacting protein 4 O ( 601) 133 33.8 7.4
+sp|P23050|FOS_AVINK p55-v-Fos-transforming protein ( 322) 129 32.8 7.5
+sp|Q80YR5|SAFB2_MOUSE Scaffold attachment factor B ( 991) 136 34.5 7.5
+sp|Q6ZSZ5|ARHGI_HUMAN Rho guanine nucleotide excha (1173) 137 34.7 7.5
+sp|O70191|ATF5_MOUSE Cyclic AMP-dependent transcri ( 283) 128 32.6 7.7
+sp|A6NC98|CC88B_HUMAN Coiled-coil domain-containin (1476) 138 34.9 7.9
+sp|B0WYY2|MOEH_CULQU Moesin/ezrin/radixin homolog ( 572) 132 33.6 8
+sp|P11939|FOS_CHICK Proto-oncogene c-Fos OS=Gallus ( 367) 129 32.9 8.3
+sp|Q9XUS2|MED29_CAEEL Mediator of RNA polymerase I ( 441) 130 33.1 8.4
+sp|A1D9Z7|KAPC_NEOFI Putative transcription factor ( 280) 127 32.4 8.6
+sp|P29176|FOSX_MSVFR Transforming protein v-Fos/v- ( 244) 126 32.2 8.7
+sp|Q09458|YQ37_CAEEL Uncharacterized protein C09F5 ( 395) 129 32.9 8.7
+sp|P23922|HBP1A_WHEAT Transcription factor HBP-1a ( 349) 128 32.7 9
+sp|Q5R452|SAFB1_PONAB Scaffold attachment factor B ( 914) 134 34.1 9
+sp|O02756|CEBPD_BOVIN CCAAT/enhancer-binding prote ( 256) 126 32.2 9
+sp|Q03173|ENAH_MOUSE Protein enabled homolog OS=Mu ( 802) 133 33.9 9.2
+sp|P54843|MAF_MOUSE Transcription factor Maf OS=Mu ( 370) 128 32.7 9.4
+sp|P49716|CEBPD_HUMAN CCAAT/enhancer-binding prote ( 269) 126 32.2 9.4
+sp|Q15642|CIP4_HUMAN Cdc42-interacting protein 4 O ( 601) 131 33.4 9.4
+sp|Q54RZ9|BZPG_DICDI Probable basic-leucine zipper ( 372) 128 32.7 9.4
+sp|Q5AXH3|TOF1_EMENI Topoisomerase 1-associated fa (1167) 135 34.3 9.6
+sp|Q498L2|SLTM_XENLA SAFB-like transcription modul ( 998) 134 34.1 9.6
+sp|P0CB49|YLPM1_RAT YLP motif-containing protein 1 (1376) 136 34.6 9.6
+sp|Q39140|TGA6_ARATH Transcription factor TGA6 OS= ( 330) 127 32.5 9.7
+sp|Q8N9W4|GG6L2_HUMAN Golgin subfamily A member 6- ( 650) 131 33.4 10
+
+>>sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS (345 aa)
+ initn: 2265 init1: 2265 opt: 2265 Z-score: 2132.8 bits: 403.1 E(516081): 2.8e-111
+Smith-Waterman score: 2265; 100.0% identity (100.0% similar) in 345 aa overlap (1-345:1-345)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ 10 20 30 40 50 60
+
+ 70 80 90 100 110 120
+sp|Q1X QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+ 70 80 90 100 110 120
+
+ 130 140 150 160 170 180
+sp|Q1X QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD
+ 130 140 150 160 170 180
+
+ 190 200 210 220 230 240
+sp|Q1X ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK
+ 190 200 210 220 230 240
+
+ 250 260 270 280 290 300
+sp|Q1X HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS
+ 250 260 270 280 290 300
+
+ 310 320 330 340
+sp|Q1X EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ :::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ 310 320 330 340
+
+>>sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS (350 aa)
+ initn: 1623 init1: 1623 opt: 1740 Z-score: 1640.9 bits: 312.1 E(516081): 7e-84
+Smith-Waterman score: 1740; 78.9% identity (94.3% similar) in 332 aa overlap (13-344:18-348)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKK
+ .:::.::. ::::::::::::::.. .: .: .::::::::::
+sp|Q8T MKSADRFSPVKMEDAFANSLPTTPSLEVPVLTVSPADTSLQTKNVVAQ-TKPEEKKPAKK
+ 10 20 30 40 50
+
+ 60 70 80 90 100 110
+sp|Q1X RKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ :::::::::::::::::::::::::::::::::::::::::::::::::::::::::.::
+sp|Q8T RKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLESEK
+ 60 70 80 90 100 110
+
+ 120 130 140 150 160 170
+sp|Q1X IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLF
+ :.::::::::::::.::::::::::::.:::.::::::: .:: .:::..:::::::::
+sp|Q8T IDMEQQNQFLLQRLAQMEAENNRLSQQVAQLSAEVRGSRHSTPTSSSPASVSPTLTPTLF
+ 120 130 140 150 160 170
+
+ 180 190 200 210 220 230
+sp|Q1X KQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL
+ ::: ::.::.::::::::..:::::::::.:::: :..:::::::.::::: ::: ::::
+sp|Q8T KQEGDEVPLDRIPFPTPSVTDYSPTLKPSSLAESPDLTQHPAVSVGGLEGDESALTLFDL
+ 180 190 200 210 220 230
+
+ 240 250 260 270 280 290
+sp|Q1X GSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSM
+ :...::. : :..:::::::: :::.::::.: :::..:::.:::::..:::::::::::
+sp|Q8T GASIKHEPTHDLTAPLSDDDFRRLFNGDSSLESDSSLLEDGFAFDVLDSGDLSAFPFDSM
+ 240 250 260 270 280 290
+
+ 300 310 320 330 340
+sp|Q1X VNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ :.::.:::::: .:...:: : ..::..:.::. ::::.::::::::::
+sp|Q8T VDFDTEPVTLEDLEQTNGLSDSASCKAASLQPSHGASTSRCDGQGIAAGSA
+ 300 310 320 330 340 350
+
+>>sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS (451 aa)
+ initn: 467 init1: 378 opt: 414 Z-score: 397.4 bits: 82.4 E(516081): 1.3e-14
+Smith-Waterman score: 446; 31.1% identity (51.8% similar) in 421 aa overlap (7-344:43-450)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLN
+ . : . ::. : :.. :. : . .
+sp|Q8T EASPAESFLSAPGDNFTSLFADSTPSTLNPRDMMTPDSV-ADIDSRLSVIPESQDAEDDE
+ 20 30 40 50 60 70
+
+ 40 50 60 70 80 90
+sp|Q1X SADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAA
+ : .... . ::::.:::::::: :: :::::::::::::::::::::.::::::: :
+sp|Q8T SHSTSATAPSTSEKKPVKKRKSWGQVLPEPKTNLPPRKRAKTEDEKEQRRVERVLRNRRA
+ 80 90 100 110 120 130
+
+ 100 110 120 130 140
+sp|Q1X AQTSRERKRLEMEKLENEKIQME-------QQNQFLLQRLSQMEAENNRLS---------
+ ::.::::::::.: ::... ..: . : .:...:.... .. ..
+sp|Q8T AQSSRERKRLEVEALEKRNKELETLLINVQKTNLILVEELNRFRRSSGVVTRSSSPLDSL
+ 140 150 160 170 180 190
+
+ 150 160 170 180
+sp|Q1X QQLAQLAAEVRGSRANTPMPG------------------SPATASPTLTPTLFKQ-ERDE
+ :. :. .. ::: . : . .::. ::.: : :. . :
+sp|Q8T QDSITLSQQLFGSRDGQTMSNPEQSLMDQIMRSAANPTVNPASLSPSLPPISDKEFQTKE
+ 200 210 220 230 240 250
+
+ 190 200 210 220 230
+sp|Q1X LPLERIPFPTPSLSDYSPTLKPSTLAE--------SSDVAQHPAVSVAGLEGDGSALPLF
+ :. . . : . .. : :.: .:.::::..: .:.:.:
+sp|Q8T EDEEQADEDEEMEQTWHETKEAAAAKEKNSKQSRVSTDSTQRPAVSIGG----DAAVPVF
+ 260 270 280 290 300
+
+ 240 250 260 270
+sp|Q1X D-------LGSDLKHHSTDD----------VAAPLSDDDFNRLFHGDSSVEPDSSVFEDG
+ . :: : :. :: ..: :. : . :.... . :..:. .:
+sp|Q8T SDDAGANCLGLDPVHQ--DDGPFSIGHSFGLSAALDADRY--LLESQLLASPNASTVDD-
+ 310 320 330 340 350 360
+
+ 280 290 300 310
+sp|Q1X LAFDVLEGGDLSAF--PFDSMVNFDSEPVTLEGIEMA---------------------HG
+ : : : . . : :. : .:: . . . : :
+sp|Q8T ---DYLAGDSAACFTNPLPSDYDFDINDFLTDDANHAAYDIVAASNYAAADRELDLEIHD
+ 370 380 390 400 410
+
+ 320 330 340
+sp|Q1X LPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ .. . : :: :::. :: :::.:
+sp|Q8T PENQIPSRHSIQQPQSGASSHGCDDGGIAVGV
+ 420 430 440 450
+
+>>sp|P41546|HAC1_YEAST Transcriptional activator HAC1 OS (238 aa)
+ initn: 251 init1: 221 opt: 257 Z-score: 254.0 bits: 54.9 E(516081): 1.3e-06
+Smith-Waterman score: 257; 32.9% identity (60.3% similar) in 219 aa overlap (63-270:16-216)
+
+ 40 50 60 70 80
+sp|Q1X TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVP---KTNLPPRKRAKTEDEKEQRRIER
+ : .: :..:::::::::..:::::::::
+sp|P41 MEMTDFELTSNSQSNLAIPTNFKSTLPPRKRAKTKEEKEQRRIER
+ 10 20 30 40
+
+ 90 100 110 120 130 140
+sp|Q1X VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ-NQFLLQRLSQME-AENNRLSQQLAQLA
+ .:::: ::. :::.:::... :: . .:. :. :..:.. : : . . .:.:
+sp|P41 ILRNRRAAHQSREKKRLHLQYLERKCSLLENLLNSVNLEKLADHEDALTCSHDAFVASLD
+ 50 60 70 80 90 100
+
+ 150 160 170 180 190 200
+sp|Q1X A--EVRGSR-ANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPS
+ . ...: :. .: ..: :.::. ::. :. ::.:.
+sp|P41 EYRDFQSTRGASLDTRASSHSSSDTFTPS---------PLNCTMEPA--------TLSPK
+ 110 120 130 140
+
+ 210 220 230 240 250 260
+sp|Q1X TLAES-SDVAQHPAVSVAGLEG--DGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFH
+ .. .: :: ... :. ....:: : ...: .. .: :: :: . .
+sp|P41 SMRDSASDQETSWELQMFKTENVPESTTLPAVD-NNNLFDAVASPLADPLCDDIAGNSLP
+ 150 160 170 180 190 200
+
+ 270 280 290 300 310 320
+sp|Q1X GDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCK
+ :.:.. :.
+sp|P41 FDNSIDLDNWRNPEAQSGLNSFELNDFFITS
+ 210 220 230
+
+>>sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabid (168 aa)
+ initn: 217 init1: 217 opt: 225 Z-score: 226.1 bits: 49.2 E(516081): 4.5e-05
+Smith-Waterman score: 225; 31.8% identity (62.4% similar) in 170 aa overlap (6-167:3-167)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSV--DSLPATP---ASEVPVLTVSP---ADTSLNSADVKTQEVKPEEKKP
+ :.. ::. .:::.. .: .: : .. .: . . :. .: .
+sp|O24 MQEQATSSLAASSLPSSSERSSSSAPHLEIKEGIESDEEIRRVPEFGGEAVGKETSG
+ 10 20 30 40 50
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .. .. ::: .. :::..: :::..:..:.::::..:: .::::. . .::
+sp|O24 RESGSATGQERTQATVGESQRKRGRTPAEKENKRLKRLLRNRVSAQQARERKKAYLSELE
+ 60 70 80 90 100 110
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ :. ..:..:. : .::: .. ::. : . : . ... ::. . :: : ::
+sp|O24 NRVKDLENKNSELEERLSTLQNENQMLRHILKNTTGNKRGGGG-----GSNADASL
+ 120 130 140 150 160
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+>>sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos ta (261 aa)
+ initn: 188 init1: 137 opt: 200 Z-score: 200.1 bits: 45.1 E(516081): 0.0013
+Smith-Waterman score: 200; 29.9% identity (56.9% similar) in 204 aa overlap (16-206:10-196)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ ::. : .: .:. .:: :. : . : :
+sp|Q3S MVVVAPAQSPAAGAPKVLLLSGQPAATGGAPAGRALPVMVP------------G
+ 10 20 30 40
+
+ 70 80 90 100 110
+sp|Q1X QELPVPK--TNLPP--RKRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ :. :. ...:: ::: . :. :.. ..: :.::.::::.:.::. .: .::..
+sp|Q3S QQGASPEGASGVPPQARKRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQV
+ 50 60 70 80 90 100
+
+ 120 130 140 150 160
+sp|Q1X IQMEQQNQFLL-------QRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASP
+ ...:..:: :: .. . .::..: :.:. . : : .:.: :. .:.
+sp|Q3S VDLEEENQKLLLENQLLREKTHGLVVENQELRQRLG-MDALVTEEEAETKGNGAGLVAGS
+ 110 120 130 140 150 160
+
+ 170 180 190 200 210 220
+sp|Q1X TLTPTLFKQERDELPLERIPFPTPSLSDYSP-TLKPSTLAESSDVAQHPAVSVAGLEGDG
+ . . .: : . ::... :.. :: :: ::
+sp|Q3S AESAAL----RLRAPLQQVQAQLSPLQNISPWTLMALTLQTLSLTSCWAFCSTWTQSCSS
+ 170 180 190 200 210
+
+ 230 240 250 260 270 280
+sp|Q1X SALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDL
+
+sp|Q3S DVLPQSLPAWSSSQKWTQKDPVPYRPPLLHPWGRHQPSWKPLMN
+ 220 230 240 250 260
+
+>>sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive element-bi (519 aa)
+ initn: 134 init1: 134 opt: 203 Z-score: 198.9 bits: 45.8 E(516081): 0.0015
+Smith-Waterman score: 203; 32.7% identity (59.0% similar) in 156 aa overlap (4-152:210-360)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSL-PATPASEVPVLTVSP-A
+ : : ..: : ::.:.. :: :.: :
+sp|A1L PHEVDQFLNLSPKGLECLQMPPTPPSSVGSDSEGSQSPVHPCAPASPTQTPAVLKVAPRA
+ 180 190 200 210 220 230
+
+ 40 50 60 70 80
+sp|Q1X DTSLNSADVKTQEVKPEEKKP-----AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRR
+ .::.:. . : : . . : .:: .. ::: :.:: : .:: ..
+sp|A1L PSSLSSSPLLTAPHKLQGSGPLLLTEEEKRTLIAEGYPVP-TKLPLSK----AEEKALKK
+ 240 250 260 270 280 290
+
+ 90 100 110 120 130 140
+sp|Q1X IERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL
+ :.: ..:. .:: ::..:. .. ::.. ..:. : ... ..: :. : ::: .:
+sp|A1L IRRKIKNKISAQESRRKKKEYVDALEKKVETCSNENHELRRKVENLECTNKSLLQQLHSL
+ 300 310 320 330 340 350
+
+ 150 160 170 180 190 200
+sp|Q1X AAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTL
+ : : :
+sp|A1L QAVVAGKVPRSCRVTGTQTSTCLMVVVLCFSLFLGSFYPGLSPCSSITKADLSREISIHD
+ 360 370 380 390 400 410
+
+>>sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper tra (631 aa)
+ initn: 119 init1: 88 opt: 201 Z-score: 195.9 bits: 45.6 E(516081): 0.0022
+Smith-Waterman score: 201; 24.5% identity (55.4% similar) in 233 aa overlap (46-270:363-593)
+
+ 20 30 40 50 60 70
+sp|Q1X PATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTN----LP
+ : :: : :::: . . :: : :
+sp|Q54 NSNNISTQINNLNNNINNQNNQLNGSNNGKKKEEDKSIKKRK-FISSTPVKGENGGTTLI
+ 340 350 360 370 380 390
+
+ 80 90 100 110 120
+sp|Q1X PRKRA--KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL
+ : . . ..:..:.: .:...:: ::: :.:.. .. ::.. .. :. . :.
+sp|Q54 PTTDGGFNMDEERHQKRQRRLVKNREAAQLFRQRQKAYIQDLEKKVSDLTGTNSEFRARV
+ 400 410 420 430 440 450
+
+ 130 140 150 160 170 180
+sp|Q1X SQMEAENNRLSQQLAQLAAEVRGSRA-NTPMPGSPATASPTLTPTLFKQERDELPLERIP
+ ...::. . .:: : : . . . : :: .: ::. . : . : :
+sp|Q54 ELLNSENKLIREQLLYLRNFVTQAVSFSFPKGGSNGTNSPSGVADQFLNSILP-PGLNSP
+ 460 470 480 490 500 510
+
+ 190 200 210 220 230 240
+sp|Q1X FPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVA
+ .: : .: .. ...:.. .. ...:. . :. . :.: .: ..
+sp|Q54 LPQGILPAGMNLQNPMIMSAIAEAASKNSTFRQNIQGNLLGTPIPSPQSSLTSNSGNNSP
+ 520 530 540 550 560 570
+
+ 250 260 270 280 290 300
+sp|Q1X A-PLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEG
+ ::.... : ...... .:.:
+sp|Q54 NKPLNNNNNNNNINNNNNNNPSSPNNNLNNNNNISPNSSTSHQVPYLPQNTPPQQSTPNQ
+ 580 590 600 610 620 630
+
+>>sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanu (158 aa)
+ initn: 183 init1: 183 opt: 191 Z-score: 194.6 bits: 43.3 E(516081): 0.0026
+Smith-Waterman score: 191; 36.8% identity (67.4% similar) in 95 aa overlap (60-154:66-157)
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIER
+ :: : :. :::... .::..:..:
+sp|Q9S SDDEIRRVPEMGGEATGTTSASGRDGVSAAGQAQPSAGTQ---RKRGRSPADKENKRLKR
+ 40 50 60 70 80 90
+
+ 90 100 110 120 130 140
+sp|Q1X VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE
+ .::::..:: .::::. . :: . ..: .: : .::: .. ::. : . : . .:
+sp|Q9S LLRNRVSAQQARERKKAYLIDLEARVKELETKNAELEERLSTLQNENQMLRHILKNTTAG
+ 100 110 120 130 140 150
+
+ 150 160 170 180 190 200
+sp|Q1X VRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAES
+ .. .:
+sp|Q9S AQEGRK
+
+
+>>sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element-bind (520 aa)
+ initn: 133 init1: 133 opt: 191 Z-score: 187.6 bits: 43.8 E(516081): 0.0062
+Smith-Waterman score: 191; 25.3% identity (51.7% similar) in 300 aa overlap (4-290:214-499)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADT
+ : . ..: . :..:. . ... . .
+sp|Q66 AEPPEMSQFLKVTQEDLVQMPPTPPSSHGSDSDGSQSPRSLPPSSPVRPMARSSTAISTS
+ 190 200 210 220 230 240
+
+ 40 50 60 70 80 90
+sp|Q1X SLNSADVKTQEVK-PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ : .: : : .. : .:: .. :.: :.:: : .:: .:..: ..
+sp|Q66 PLLTAPHKLQGTSGPLLLTEEEKRTLIAEGYPIP-TKLPLTK----AEEKALKRVRRKIK
+ 250 260 270 280 290
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :. .:: ::..:. .: ::.. . ..:. : ... .:. : : ::: .: . :
+sp|Q66 NKISAQESRRKKKEYVECLEKKVETYTSENNELWKKVETLETANRTLLQQLQKLQTLVT-
+ 300 310 320 330 340 350
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+ :. . :. .:. : : . : : . :..:. : :.: . .: .:
+sp|Q66 SKISRPYK---MAATQTGTCLMVAALCFVLVLGSLAPCLPAFSSGSKTVKEDPVAADSVY
+ 360 370 380 390 400 410
+
+ 220 230 240 250 260
+sp|Q1X A--QHPAVSV------AGLEGDGSALPLFDL----GSDLKHHSTDDVAAPLSDDDFNRLF
+ : : :. :. :: :: :. . : .:: . : : .: . :
+sp|Q66 AASQMPSRSLLFYDDGAGSWEDGHRGALLPVEPPEGWELKPGGP---AEPRPQDHL-RHD
+ 420 430 440 450 460 470
+
+ 270 280 290 300 310 320
+sp|Q1X HGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTC
+ :.:: .. .. ... :. ..: :
+sp|Q66 HADS-IHETTKYLRETWPEDTEDNGASPNFSHPKEWFHDRDLGPNTTIKLS
+ 480 490 500 510 520
+
+>>sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive element-bi (519 aa)
+ initn: 133 init1: 133 opt: 189 Z-score: 185.8 bits: 43.4 E(516081): 0.0079
+Smith-Waterman score: 189; 26.7% identity (53.8% similar) in 240 aa overlap (4-232:215-445)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADT
+ : . ..: . :..:. . ... . .
+sp|Q9Z AEPPEMSQFLKVTPEDLVQMPPTPPSSHGSDSDGSQSPRSLPPSSPVRPMARSSTAISTS
+ 190 200 210 220 230 240
+
+ 40 50 60 70 80 90
+sp|Q1X SLNSADVKTQEVK-PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ : .: : : .. : .:: .. :.: :.:: : .:: .:..: ..
+sp|Q9Z PLLTAPHKLQGTSGPLLLTEEEKRTLIAEGYPIP-TKLPLTK----AEEKALKRVRRKIK
+ 250 260 270 280 290
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :. .:: ::..:. .: ::.. . ..:. : ... .:. : : ::: .: . :
+sp|Q9Z NKISAQESRRKKKEYVECLEKKVETYTSENNELWKKVETLETANRTLLQQLQKLQTLVT-
+ 300 310 320 330 340 350
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+ :. . :. .:. : : . : : . :..:. : :.: . .: .:
+sp|Q9Z SKISRPY---KMAATQTGTCLMVAALCFVLVLGSLVPCLPAFSSGSMTVKEDPIAADSVY
+ 360 370 380 390 400 410
+
+ 220 230 240 250 260
+sp|Q1X A--QHPAVSV------AGL--EGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHG
+ : : :. :. :: .: :. ::.
+sp|Q9Z AASQMPSRSLLFYDDGAGSWEDGRGALLPVEPPEGWELKPGGPAEQRPQDHLRHDRADSI
+ 420 430 440 450 460 470
+
+>>sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive element-bi (519 aa)
+ initn: 132 init1: 132 opt: 187 Z-score: 183.9 bits: 43.1 E(516081): 0.01
+Smith-Waterman score: 187; 26.2% identity (53.3% similar) in 240 aa overlap (4-232:215-445)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADT
+ : . ..: . :..:. . ... . .
+sp|Q96 AEPLEVNQFLKVTPEDLVQMPPTPPSSHGSDSDGSQSPRSLPPSSPVRPMARSSTAISTS
+ 190 200 210 220 230 240
+
+ 40 50 60 70 80 90
+sp|Q1X SLNSADVKTQEVK-PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ : .: : : .. : .:: .. :.: :.:: : .:: .:..: ..
+sp|Q96 PLLTAPHKLQGTSGPLLLTEEEKRTLIAEGYPIP-TKLPLTK----AEEKALKRVRRKIK
+ 250 260 270 280 290
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :. .:: ::..:. .: ::.. . ..:. : ... .: : : ::: .: . :
+sp|Q96 NKISAQESRRKKKEYVECLEKKVETFTSENNELWKKVETLENANRTLLQQLQKLQTLVT-
+ 300 310 320 330 340 350
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS--
+ .. . :. .:. : : . : : . : .:. : :.: . :: ..
+sp|Q96 NKISRPY---KMAATQTGTCLMVAALCFVLVLGSLVPCLPEFSSGSQTVKEDPLAADGVY
+ 360 370 380 390 400 410
+
+ 220 230 240 250 260
+sp|Q1X DVAQHPAVSV------AGLEGDGSA--LPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHG
+ ..: :. :. ::: :: . ::.
+sp|Q96 TASQMPSRSLLFYDDGAGLWEDGRSTLLPMEPPDGWEINPGGPAEQRPRDHLQHDHLDST
+ 420 430 440 450 460 470
+
+>>sp|A3LYI0|NST1_PICST Stress response protein NST1 OS=P (1234 aa)
+ initn: 113 init1: 84 opt: 200 Z-score: 191.0 bits: 45.6 E(516081): 0.004
+Smith-Waterman score: 201; 26.6% identity (54.6% similar) in 304 aa overlap (41-332:727-1001)
+
+ 20 30 40 50 60 70
+sp|Q1X SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNL
+ . .:.: .:.. :: .. .. : .:
+sp|A3L ELKQKQEALKADQRRRKEEAKLKREEEKKKRIEELKRKEEEHKKKVEAQQKKEEEAK-KL
+ 700 710 720 730 740 750
+
+ 80 90 100 110 120 130
+sp|Q1X PPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLS
+ ... :.:.:..... :. .. : .::.::..: :::... :::. :.
+sp|A3L KEERKKKAEEERKKKEEEKRQKELLKKQKEEERERLKLEAEENERLEKEQQE------LQ
+ 760 770 780 790 800
+
+ 140 150 160 170 180 190
+sp|Q1X QMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFP
+ ... .:.: . ::: ::. . .:: . ::: . :..: . : . :
+sp|A3L ELQESQNQLELESAQLPAEL-----AEEINASPDSFSPTKNH-LLEQLYQARP-SSVSGP
+ 810 820 830 840 850 860
+
+ 200 210 220 230 240
+sp|Q1X T---PSLSDYSPTLKPSTLAESSDVAQ----HPAVSVAGLEGDGSALPLFDLGSDLKHHS
+ : : .. ..: : . : :: : . ::.: : :.: :: : . . . . :
+sp|A3L TTISPPIQ-FTPEAVPPVAAVSSVVPSVVPISPALSGAILNGTGS--P--NSRNAMLYGS
+ 870 880 890 900 910
+
+ 250 260 270 280 290
+sp|Q1X TDDVAAPLSDDDFNRLFHGDSSVEPDSSVFE----DGLAFDV-LEGGDLSAFPFDSMVNF
+ . .. : : : . :.. : :: . .: ... : .::: :. . .:
+sp|A3L SAQAQLP------NGLNSSTSNMSPWSSKSRLNSTSGASLQSNLFQPQLSASGFSPFNDF
+ 920 930 940 950 960 970
+
+ 300 310 320 330 340
+sp|Q1X DSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ : :.: :: .. .. ...:.: ::.
+sp|A3L -STPATSAGI---GSVNVNAPLASTAVEPLAGANNGGVWNPSTTSSRNNSIWSNTPNLNN
+ 980 990 1000 1010 1020
+
+sp|A3L ASIWGNTLPSLAGGAGAGASTPSAAHTLPNSAPLASDNELIQVAAYNTFQMLQNSNQLEF
+ 1030 1040 1050 1060 1070 1080
+
+>>sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive element-bi (525 aa)
+ initn: 143 init1: 143 opt: 183 Z-score: 180.1 bits: 42.4 E(516081): 0.016
+Smith-Waterman score: 183; 31.0% identity (55.7% similar) in 158 aa overlap (4-152:218-368)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVP------VLT
+ : : .: . ::: :.: : . .
+sp|A2V VDQFLNLCPKEVAPTEALQMPPTPPSSHGSDSEGGQSPTRSLP--PSSPVQSQAGGKMAA
+ 190 200 210 220 230 240
+
+ 30 40 50 60 70 80
+sp|Q1X VSPA---DTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQ
+ ::. .. : .: : : : .:: .. :.: :.:: : .::
+sp|A2V RSPSALSNSPLLTAPHKLQGSGPLMLTEEEKRTLVAEGYPIP-TKLPLTK----AEEKAL
+ 250 260 270 280 290 300
+
+ 90 100 110 120 130 140
+sp|Q1X RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA
+ ..:.: ..:. .:: ::..:. :..::.. . ..:. : ... .:. : : :::
+sp|A2V KKIRRKIKNKISAQESRRKKKEYMDSLEKRVENSSSENSELRKKVEVLESTNRTLLQQLQ
+ 310 320 330 340 350 360
+
+ 150 160 170 180 190 200
+sp|Q1X QLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPS
+ .: : : :
+sp|A2V RLQAMVTGKVTRSCKAAGTQTGTCLMMVVLCFAVIFGSFTQNLDMYSSSSKTIHEPSQYS
+ 370 380 390 400 410 420
+
+>>sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive element-bi (428 aa)
+ initn: 137 init1: 137 opt: 181 Z-score: 179.4 bits: 41.9 E(516081): 0.018
+Smith-Waterman score: 181; 26.9% identity (53.3% similar) in 182 aa overlap (24-200:160-330)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSAD-VKTQEVKPEEKKP
+ :: .: :. :: . .. . :: .
+sp|Q08 MSSVISIQLAEDWNSAPLLIPESCIVNDLPPVCKSTPLPIRLTPADLIAVDALYPELHLT
+ 130 140 150 160 170 180
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .... .:: . .::: : .:. ....: .::. .:: ::.::. .. ::
+sp|Q08 EEEKRLLSQEGVALPNNLPLTK----AEERILKKVRRKIRNKQSAQDSRRRKKEYIDGLE
+ 190 200 210 220 230 240
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ .. .::: : ... ..: .: : :: .: . .. . .. : .: .
+sp|Q08 SRVAACSSQNQELHKKVVELEKHNISLITQLRKLQTLIKQTSNKA------AQTSTCVLI
+ 250 260 270 280 290
+
+ 180 190 200 210 220
+sp|Q1X TLFKQERDELPLERIPF---PTPSLSD-YSPTLKPSTLAESSDVAQHPAVSVAGLEGDGS
+ ::. .: :: :. : : : ::
+sp|Q08 LLFSLALLVFP-SYSPFRSRPSASQEDSYRPTGVISRNILNKGGFSEVADPQASDTLHRA
+ 300 310 320 330 340 350
+
+ 230 240 250 260 270 280
+sp|Q1X ALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLS
+
+sp|Q08 QQREEGDPGRHVVPPANPNPEETEPVSNRARTTPEPDEQVLAEPEAAILGQKGEPPGSDN
+ 360 370 380 390 400 410
+
+>>sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive element-bi (520 aa)
+ initn: 135 init1: 135 opt: 187 Z-score: 183.9 bits: 43.1 E(516081): 0.01
+Smith-Waterman score: 187; 23.9% identity (51.9% similar) in 297 aa overlap (14-297:228-517)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPAT--PASEVPVLTVSPADTSLNSADVK
+ ::: : :. .: . ... : .: :
+sp|Q70 DHLHLPPTPPSSHGSDSEGSLSPNPRLHPFSLPQTHSPSRAAPRAPSALSSSPLLTAPHK
+ 200 210 220 230 240 250
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ : : .:: .. :.: :.:: : .:: ..:.: ..:. .:: ::
+sp|Q70 LQGSGPLVLTEEEKRTLIAEGYPIP-TKLPLSKS----EEKALKKIRRKIKNKISAQESR
+ 260 270 280 290 300 310
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT-PMP
+ ..:. :..::.. . .: : ... .: : : ::: .: . : :. . : .
+sp|Q70 RKKKEYMDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQLQKLQTLVMGKVSRTCKLA
+ 320 330 340 350 360 370
+
+ 170 180 190 200 210
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPS---LSDYSPTLKPST--LAESSDV---
+ :. . . .. : . :.:. . : . .: : ...: ..
+sp|Q70 GTQTGTCLMVVVLCFAVAFGSFFQGYGPYPSATKMALPSQHSLQEPYTASVVRSRNLLIY
+ 380 390 400 410 420 430
+
+ 220 230 240 250 260 270
+sp|Q1X AQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV
+ .: .. :... : .: ::.: . : . .. : .. ...:.: . .
+sp|Q70 EEHSPPEESSSPGSAGELGGWDRGSSLLRVSGLESRPDVDLPHF--IISNETSLEKSVLL
+ 440 450 460 470 480 490
+
+ 280 290 300 310 320 330
+sp|Q1X -FEDGLAFDVLEGGD-LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFG
+ ... :. :::.. :.. .: ::
+sp|Q70 ELQQHLVSAKLEGNETLKVVELDRRVNTTF
+ 500 510 520
+
+>>sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive element-bi (520 aa)
+ initn: 135 init1: 135 opt: 185 Z-score: 182.0 bits: 42.7 E(516081): 0.013
+Smith-Waterman score: 185; 23.9% identity (51.5% similar) in 297 aa overlap (14-297:228-517)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPAT--PASEVPVLTVSPADTSLNSADVK
+ ::: : :. .: . ... : .: :
+sp|Q5R DHLHLPPTPPSSHGSDSEGSLSPNPRLHPFSLPQTHSPSRAAPRAPSALSSSPLLTAPHK
+ 200 210 220 230 240 250
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ : : .:: .. :.: :.:: : .:: ..:.: ..:. .:: ::
+sp|Q5R LQGSGPLVLTEEEKRTLIAEGYPIP-TKLPLTKS----EEKALKKIRRKIKNKISAQESR
+ 260 270 280 290 300 310
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT-PMP
+ ..:. :..::.. . .: : ... .: : : ::: .: . : :. . : .
+sp|Q5R RKKKEYMDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQLQKLQTLVMGKVSRTCKLA
+ 320 330 340 350 360 370
+
+ 170 180 190 200 210
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPS---LSDYSPTLKPST--LAESSDV---
+ :. . . .. : . :.:. . : . .: : ...: ..
+sp|Q5R GTQTGTCLMVVVLCFAVAFGSFFQGYGPYPSATKMALPSQHSLQEPYTASVVRSRNLLIY
+ 380 390 400 410 420 430
+
+ 220 230 240 250 260 270
+sp|Q1X AQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV
+ .: . :... : .: ::.: . : . .. : .. ...:.: . .
+sp|Q5R EEHSPPEEPSSPGSAGELGGWDRGSSLLRVSGLESRPDVDLPHF--IISNETSLEKSVLL
+ 440 450 460 470 480 490
+
+ 280 290 300 310 320 330
+sp|Q1X -FEDGLAFDVLEGGD-LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFG
+ ... :. :::.. :.. .: ::
+sp|Q5R ELQQHLVSAKLEGNETLKVVELDRRVNTTF
+ 500 510 520
+
+>>sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive element-bi (521 aa)
+ initn: 135 init1: 135 opt: 200 Z-score: 196.1 bits: 45.3 E(516081): 0.0021
+Smith-Waterman score: 200; 24.1% identity (52.9% similar) in 291 aa overlap (18-297:234-518)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ .:: .: . . . : .: : : :
+sp|Q8B PTPPSSHSSDSEGSLSPNPRLHPFSLSQAHSPARAMPRGPSALSTSPLLTAPHKLQGSGP
+ 210 220 230 240 250 260
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE
+ .:: .. :.: :.:: : .:: ..:.: ..:. .:: ::..:.
+sp|Q8B LVLTEEEKRTLVAEGYPIP-TKLPLTK----SEEKALKKIRRKIKNKISAQESRRKKKEY
+ 270 280 290 300 310
+
+ 110 120 130 140 150 160
+sp|Q1X MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT-PMPGSPATA
+ :..::.. . .: : ... .: : : ::: .: . : :. . : . :. . .
+sp|Q8B MDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQLQKLQTLVMGKVSRTCKLAGTQTGT
+ 320 330 340 350 360 370
+
+ 170 180 190 200 210
+sp|Q1X SPTLTPTLFKQERDELPLERIPFPTPS---LSDYSPTLKPST--LAESSDV---AQHPAV
+ .. : . :.:. . : . : .: : ...: .. .: .
+sp|Q8B CLMVVVLCFAVAFGSFFQGYGPYPSATKMALPSQHPLSEPYTASVVRSRNLLIYEEHAPL
+ 380 390 400 410 420 430
+
+ 220 230 240 250 260 270
+sp|Q1X SVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV-FEDGL
+ .. .... : .: ::.: . :. : : : . :. ...:.: . . ... :
+sp|Q8B EESSSPASAGELGGWDRGSSLLRASSGLEALPEVDLP-HFLISNETSLEKSVLLELQQHL
+ 440 450 460 470 480 490
+
+ 280 290 300 310 320 330
+sp|Q1X AFDVLEGGD-LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRC
+ . . :::.. :.. .. ::
+sp|Q8B VSSKLEGNETLKVVELERRVNATF
+ 500 510 520
+
+>>sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Homo s (261 aa)
+ initn: 188 init1: 137 opt: 201 Z-score: 201.0 bits: 45.2 E(516081): 0.0011
+Smith-Waterman score: 201; 28.5% identity (58.6% similar) in 186 aa overlap (16-187:10-186)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ :: . .: .:. .::... : . : .. . . : :
+sp|P17 MVVVAAAPNPADGTPKVLLLSGQPASAAGAPAGQALPLMVPAQRGASPEAASGG
+ 10 20 30 40 50
+
+ 70 80 90 100 110
+sp|Q1X QELPVPKTNLPPRKRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME
+ .:.. ::: . :. :.. ..: :.::.::::.:.::. .: .::.. ...:
+sp|P17 ----LPQA----RKRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLE
+ 60 70 80 90 100
+
+ 120 130 140 150 160
+sp|Q1X QQNQFLL-------QRLSQMEAENNRLSQQL------AQLAAEVRGSRANTPMPGSPATA
+ ..:: :: .. . .::..: :.: :. ::..:... :. :: .:
+sp|P17 EENQKLLLENQLLREKTHGLVVENQELRQRLGMDALVAEEEAEAKGNEVR-PVAGSAESA
+ 110 120 130 140 150 160
+
+ 170 180 190 200 210 220
+sp|Q1X SPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGD
+ . : : . . . ::. :
+sp|P17 ALRLRAPLQQVQAQLSPLQNISPWILAVLTLQIQSLISCWAFWTTWTQSCSSNALPQSLP
+ 170 180 190 200 210 220
+
+>>sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus GN=F (338 aa)
+ initn: 80 init1: 80 opt: 175 Z-score: 175.2 bits: 40.8 E(516081): 0.031
+Smith-Waterman score: 175; 25.7% identity (50.9% similar) in 222 aa overlap (9-222:76-290)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATP-ASEVPVLTVSPAD---TS
+ .::. . . : ::. :. :.: : ::
+sp|P13 GLGEMPGSFVPTVTAITTSQDLQWLVQPTLISSMAQSQGQPLASQPPA--VDPYDMPGTS
+ 50 60 70 80 90 100
+
+ 40 50 60 70 80 90
+sp|Q1X LNSADVKTQEVKPEEKK--PAKKRKSWGQELPVPKTNLP--PRKRAKTEDEKEQRRIERV
+ .. ... . . :. . . : : : ::... : .:.:.::..:
+sp|P13 YSTPGLSAYSTGGASGSGGPSTSTTTSGPVSARPARARPRRPREETLTPEEEEKRRVRRE
+ 110 120 130 140 150 160
+
+ 100 110 120 130 140 150
+sp|Q1X LRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV
+ ::. :: :.:.: ..:. : :.:... : ....... :..:: :.
+sp|P13 -RNKLAAAKCRNRRRELTDRLQAETDQLEEEKAELESEIAELQKEKERLEFVLVAHKPGC
+ 170 180 190 200 210 220
+
+ 160 170 180 190 200 210
+sp|Q1X RGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+ . . : :: : . : . ..: . : : : : : : .:. :
+sp|P13 KIPYEEGPGPGPLAEVRDL--PGSTSAKEDGFGWLLPPPPPPPLPFQSSRDAPPNLTAS-
+ 230 240 250 260 270
+
+ 220 230 240 250 260 270
+sp|Q1X DVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDS
+ . : :.: :
+sp|P13 -LFTHSEVQVLGDPFPVVSPSYTSSFVLTCPEVSAFAGAQRTSGSEQPSDPLNSPSLLAL
+ 280 290 300 310 320 330
+
+>>sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=A (149 aa)
+ initn: 148 init1: 148 opt: 165 Z-score: 170.6 bits: 38.8 E(516081): 0.056
+Smith-Waterman score: 165; 35.2% identity (76.1% similar) in 71 aa overlap (73-143:68-138)
+
+ 50 60 70 80 90 100
+sp|Q1X QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE
+ :.:... .:: : ..:.::::..:: .::
+sp|Q8W GSTCVLSSSADDGVNNPELDQTQNGVSTAKRRRGRNPVDKEYRSLKRLLRNRVSAQQARE
+ 40 50 60 70 80 90
+
+ 110 120 130 140 150 160
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS
+ ::.. . ::.. .....:. : ...: . ::. : ..:
+sp|Q8W RKKVYVSDLESRANELQNNNDQLEEKISTLTNENTMLRKMLINTRPKTDDNH
+ 100 110 120 130 140
+
+ 170 180 190 200 210 220
+sp|Q1X PATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAG
+
+>>sp|P53539|FOSB_HUMAN Protein fosB OS=Homo sapiens GN=F (338 aa)
+ initn: 80 init1: 80 opt: 169 Z-score: 169.5 bits: 39.8 E(516081): 0.064
+Smith-Waterman score: 169; 25.7% identity (49.5% similar) in 222 aa overlap (9-222:76-290)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATP-ASEVPVLTVSPAD---TS
+ .::. . . : ::. :: :.: : ::
+sp|P53 GLGEMPGSFVPTVTAITTSQDLQWLVQPTLISSMAQSQGQPLASQPPV--VDPYDMPGTS
+ 50 60 70 80 90 100
+
+ 40 50 60 70 80 90
+sp|Q1X LNSADVKTQEVKPEEKK--PAKKRKSWGQELPVPKTNLP--PRKRAKTEDEKEQRRIERV
+ .. .. . :. . . : : : ::... : .:.:.::..:
+sp|P53 YSTPGMSGYSSGGASGSGGPSTSGTTSGPGPARPARARPRRPREETLTPEEEEKRRVRRE
+ 110 120 130 140 150 160
+
+ 100 110 120 130 140 150
+sp|Q1X LRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV
+ ::. :: :.:.: ..:. : :.:... : ....... :..:: :.
+sp|P53 -RNKLAAAKCRNRRRELTDRLQAETDQLEEEKAELESEIAELQKEKERLEFVLVAHKPGC
+ 170 180 190 200 210 220
+
+ 160 170 180 190 200 210
+sp|Q1X RGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+ . . : :: : . : ..: . : : : : . : .:. :
+sp|P53 KIPYEEGPGPGPLAEVRDL--PGSAPAKEDGFSWLLPPPPPPPLPFQTSQDAPPNLTAS-
+ 230 240 250 260 270
+
+ 220 230 240 250 260 270
+sp|Q1X DVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDS
+ . : :.: :
+sp|P53 -LFTHSEVQVLGDPFPVVNPSYTSSFVLTCPEVSAFAGAQRTSGSDQPSDPLNSPSLLAL
+ 280 290 300 310 320 330
+
+>>sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element-bind (521 aa)
+ initn: 135 init1: 135 opt: 182 Z-score: 179.2 bits: 42.2 E(516081): 0.018
+Smith-Waterman score: 182; 23.4% identity (52.6% similar) in 291 aa overlap (18-297:234-518)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ .:. .: . . . : .: : : :
+sp|Q6Q PTPPSSHSSDSEGSLSPNPRLHPFSLSQAHSPGRAMPRGPSALSTSPLLTAPHKLQGSGP
+ 210 220 230 240 250 260
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE
+ .:: .. :.: :.:: : .:: ..:.: ..:. .:: ::..:.
+sp|Q6Q LVLTEEEKRTLIAEGYPIP-TKLPLTK----SEEKALKKIRRKIKNKISAQESRRKKKEY
+ 270 280 290 300 310
+
+ 110 120 130 140 150 160
+sp|Q1X MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT-PMPGSPATA
+ :..::.. . .: : ... .: : : ::: .: . : :. . : . :. . .
+sp|Q6Q MDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQLQKLQTLVMGKVSRTCKLAGTQTGT
+ 320 330 340 350 360 370
+
+ 170 180 190 200 210
+sp|Q1X SPTLTPTLFKQERDELPLERIPFPTPS---LSDYSPTLKPST--LAESSDV---AQHPAV
+ .. : : .:. . : . : .: : ...: .. .: ..
+sp|Q6Q CLMVVVLCFAVAFGSLFQGYGLYPSATKMALPSQHPLSEPYTASVVRSRNLLIYEEHSSL
+ 380 390 400 410 420 430
+
+ 220 230 240 250 260 270
+sp|Q1X SVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV-FEDGL
+ .. .... : .: ::.: . :. : : : . .. ..:.: . . ... :
+sp|Q6Q EESSSPASAGELGGWDRGSSLLRASSGLEALPEVDLP-HFIISKETSLEKSVLLELQQHL
+ 440 450 460 470 480 490
+
+ 280 290 300 310 320 330
+sp|Q1X AFDVLEGGD-LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRC
+ . . :::.. :.. .. ::
+sp|Q6Q VSSKLEGNETLKVVELERRVNATF
+ 500 510 520
+
+>>sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-bi (456 aa)
+ initn: 171 init1: 141 opt: 188 Z-score: 185.6 bits: 43.2 E(516081): 0.0081
+Smith-Waterman score: 188; 26.2% identity (53.3% similar) in 240 aa overlap (48-275:213-434)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK
+ .::: :. : :: :.:: :
+sp|Q3S SSGDLQQHHLAAPHLLRPGTGHCQELVLTEDEKKLLAKE---GITLP---TQLPLTKY--
+ 190 200 210 220 230
+
+ 80 90 100 110 120 130
+sp|Q1X TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN
+ .:. ..:.: .::. .:: ::..:. .. ::.. ::: : ... ..: .:
+sp|Q3S --EERMLKKIRRKIRNKQSAQESRKKKKEYIDGLETRMSACTAQNQELQRKVLHLEKQNL
+ 240 250 260 270 280 290
+
+ 140 150 160 170 180
+sp|Q1X RLSQQLAQLAAEVRGSRANTPMPGS---------PATASPTLTPTLFKQERDELPLERIP
+ : .:: .: : : : ... . :. . :...: : ..: : : . :
+sp|Q3S SLLEQLKKLQAIVVQSTSKSAQTGTCIAVLLFSFALIVLPSISP--FASNRAESPGDFAP
+ 300 310 320 330 340 350
+
+ 190 200 210 220 230 240
+sp|Q1X ---FPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTD
+ : .: . . :.: : .:. : :. ....:. . . : .. . ..:
+sp|Q3S VRVFSRTLHNDAASRVAPDT-APGSE-APGPGPNTGALQERSPGSP----PGEWESQDTR
+ 360 370 380 390 400
+
+ 250 260 270 280 290 300
+sp|Q1X DVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTL
+ . : : . : .:.: : :.... :
+sp|Q3S ALDNSTEDLDNSTLVQGNSVKELDQATLLDCAPPEPAVSPGHVGLEAAGGEL
+ 410 420 430 440 450
+
+>>sp|Q9TUB3|FOSB_CANFA Protein fosB OS=Canis familiaris (338 aa)
+ initn: 80 init1: 80 opt: 166 Z-score: 166.7 bits: 39.3 E(516081): 0.091
+Smith-Waterman score: 172; 28.8% identity (51.3% similar) in 191 aa overlap (72-237:145-332)
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ ::... : .:.:.::..: ::. :: :
+sp|Q9T GGASGSGGPSTSGTTSGPGPARPARARLRRPREETLTPEEEEKRRVRRE-RNKLAAAKCR
+ 120 130 140 150 160 170
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPG
+ .:.: ..:. : :.:... : ....... :..:: :. . . : ::
+sp|Q9T NRRRELTDRLQAETDQLEEEKAELESEIAELQKEKERLEFVLVAHKPGCKIPYEEGPGPG
+ 180 190 200 210 220 230
+
+ 170 180 190
+sp|Q1X S-------PATAS------------PTLTPTLFKQERDELPLERIPFPTPS----LSDYS
+ :..:: : : :. .: : . : : :.:
+sp|Q9T PLAEVRDLPGSASTKEDGFSWLLPPPPAPPLPFQTSQDAAPNLTASLFTHSEVQVLGDPF
+ 240 250 260 270 280 290
+
+ 200 210 220 230 240 250
+sp|Q1X PTLKPSTLAESSDVAQHPAVSV-AGLE-GDGSALPLFDLGSDLKHHSTDDVAAPLSDDDF
+ :...:: :: : : ::. :: . .:: : :.:
+sp|Q9T PVVNPSY--TSSFVLTCPEVSAFAGTQRPSGSDQPTDPLNSPSLLAL
+ 300 310 320 330
+
+ 260 270 280 290 300 310
+sp|Q1X NRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPD
+
+>>sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcriptio (349 aa)
+ initn: 123 init1: 91 opt: 165 Z-score: 165.6 bits: 39.1 E(516081): 0.11
+Smith-Waterman score: 165; 28.4% identity (61.5% similar) in 148 aa overlap (18-160:212-349)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSAD--VKTQEV
+ ::... . .:: .. :.: . .:...
+sp|Q06 GSEVDISEGDRKPDSAAYITLIPPCVKEEDTPSDNDSGICMSP-ESYLGSPQHSPSTSRA
+ 190 200 210 220 230 240
+
+ 50 60 70 80 90 100
+sp|Q1X KPEE-KKPAKKRKSWGQELPVPKTNLPP--RKRAKTEDEKEQRRIERVLRNRAAAQTSRE
+ :.. .:. .: : : :: :: ::.. :: ....... .:..:: :.
+sp|Q06 PPDNLPSPGGSRGS-----PRPKPYDPPGVSLTAKVKTEKLDKKLKKMEQNKTAATRYRQ
+ 250 260 270 280 290
+
+ 110 120 130 140 150 160
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS
+ .:: :.: : .: ..:..:. : .. ... : : : .: ::: .:.. .:
+sp|Q06 KKRAEQEALTGECKELEKKNEALKEKADSLAKEI----QYLKDLIEEVRKARGQKRVP
+ 300 310 320 330 340
+
+ 170 180 190 200 210 220
+sp|Q1X PATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAG
+
+>>sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-bind (470 aa)
+ initn: 153 init1: 153 opt: 174 Z-score: 172.3 bits: 40.8 E(516081): 0.045
+Smith-Waterman score: 174; 26.7% identity (52.6% similar) in 247 aa overlap (48-284:214-438)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK
+ .::: :. : :: :.:: :
+sp|Q5F GGGDLQQHPLAASQLLGPGSGHCQELVLTEDEKKLLAKE---GVTLP---TQLPLTKY--
+ 190 200 210 220 230
+
+ 80 90 100 110 120 130
+sp|Q1X TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN
+ .:. ..:.: .::. .:: ::..:. .. :::. ::: : ... ..: .:
+sp|Q5F --EERVLKKIRRKIRNKQSAQESRKKKKEYIDGLENRMSACTAQNQELQRKVLHLEKQNL
+ 240 250 260 270 280 290
+
+ 140 150 160 170 180
+sp|Q1X RLSQQLAQLAAEVRGSRANTPMPGSPATAS---------PTLTPTLFKQERDELPLERIP
+ : .:: .: : : : .. :. .. :...: : .. . : . ::
+sp|Q5F SLLEQLKHLQALVVQSTSKPAHAGTCIAVLLLSFVLIILPSISP--FTANKVDSPGDFIP
+ 300 310 320 330 340 350
+
+ 190 200 210 220 230 240
+sp|Q1X FPTPSLSDYSPTLKPSTLAE-SSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDV
+ . .: ::. . .. . ::. : : . .:....: : :. :. ::
+sp|Q5F -----VRVFSRTLHNHAASRVAPDVTPGPEVP-GPHKGSSGGLSA-DWGNFLEIPMLDD-
+ 360 370 380 390 400
+
+ 250 260 270 280 290 300
+sp|Q1X AAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEG
+ : . : . : ..:. . ... : .: . : :
+sp|Q5F --PTEELDNTTLVLANSTEDLGRATLLDWVASEPLLGQMGLEIPGEEIWLSWVPRWLRVR
+ 410 420 430 440 450 460
+
+ 310 320 330 340
+sp|Q1X IEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q5F VVQDALGVL
+ 470
+
+>>sp|Q90370|MAFB_COTJA Transcription factor MafB OS=Cotu (311 aa)
+ initn: 102 init1: 102 opt: 161 Z-score: 162.5 bits: 38.4 E(516081): 0.16
+Smith-Waterman score: 161; 27.3% identity (62.6% similar) in 139 aa overlap (29-163:171-307)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS
+ .:. .: .: ...:.. . .. .. : :
+sp|Q90 HHQYPAVTHEDLAGSGHPHHHHHHHHHASPTPSTSSSSSQQLQTSHQQHPPSSSVEDRFS
+ 150 160 170 180 190 200
+
+ 60 70 80 90 100 110
+sp|Q1X WGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ : . . .: . :. :.:: .:.: :.:.::. ::. : .. . ..:::::
+sp|Q90 DDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSCRYKRVQQKHHLENEK
+ 210 220 230 240 250
+
+ 120 130 140 150 160 170
+sp|Q1X IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPMPGSPATASPTLTPTL
+ :. :: . : :..... : . . . .::.. : . ... :.::
+sp|Q90 TQLIQQVEQLKQEVTRLARERDAYKLKCEKLASNGFREAGSTSDNPSSPEFFM
+ 260 270 280 290 300 310
+
+ 180 190 200 210 220 230
+sp|Q1X FKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFD
+
+>>sp|Q90888|MAFB_CHICK Transcription factor MafB OS=Gall (311 aa)
+ initn: 102 init1: 102 opt: 161 Z-score: 162.5 bits: 38.4 E(516081): 0.16
+Smith-Waterman score: 161; 27.3% identity (62.6% similar) in 139 aa overlap (29-163:171-307)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS
+ .:. .: .: ...:.. . .. .. : :
+sp|Q90 HHQYPAVTHEDLAGSGHPHHHHHHHHQASPTPSTSSSSSQQLQTSHQQHPPSSSVEDRFS
+ 150 160 170 180 190 200
+
+ 60 70 80 90 100 110
+sp|Q1X WGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ : . . .: . :. :.:: .:.: :.:.::. ::. : .. . ..:::::
+sp|Q90 DDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSCRYKRVQQKHHLENEK
+ 210 220 230 240 250
+
+ 120 130 140 150 160 170
+sp|Q1X IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPMPGSPATASPTLTPTL
+ :. :: . : :..... : . . . .::.. : . ... :.::
+sp|Q90 TQLIQQVEQLKQEVTRLARERDAYKLKCEKLASNGFREAGSTSDNPSSPEFFM
+ 260 270 280 290 300 310
+
+ 180 190 200 210 220 230
+sp|Q1X FKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFD
+
+>>sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scrofa G (380 aa)
+ initn: 100 init1: 68 opt: 166 Z-score: 166.1 bits: 39.3 E(516081): 0.1
+Smith-Waterman score: 166; 28.4% identity (52.4% similar) in 250 aa overlap (9-237:55-297)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEV-PVLT--VSPADTSL
+ .:::. .:.. : . : : :.:. .:
+sp|O97 DSLSYYHSPADSFSSMGSPVNAQDFCTDLAVSSVNFIPTVTAISISPDLQWLVQPTLVS-
+ 30 40 50 60 70 80
+
+ 40 50 60 70 80
+sp|Q1X NSADVKTQEVKP----EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTE----DEKEQRRI
+ . : .:. .: . : .: . . .: ... : :.:.: .:.:.:::
+sp|O97 SVAPSQTRAPHPYGVPTPSAGAYSRAGAVKTMPGGRAQSIGR-RGKVEQLSPEEEEKRRI
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA
+ .: ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|O97 RRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHR
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X AEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTL
+ . . .: ..:: :. : : .: ::: : : ::. :.
+sp|O97 PACKIPD-DLGFPEEMSVASLDLSGGLPEAATPESEEAFTLPLLNDPEPKPSVE---PVK
+ 210 220 230 240 250
+
+ 210 220 230 240 250
+sp|Q1X KPSTL---AESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFN
+ : :.. :: : :: : : . ..: .:: ::
+sp|O97 KVSSMELKAEPFDDFLFPASSRPGGSETARSVPDMDLSGSFYAADWEPLHGGSLGMGPMA
+ 260 270 280 290 300 310
+
+ 260 270 280 290 300 310
+sp|Q1X RLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDE
+
+sp|O97 TELEPLCTPVVTCTPSCTAYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTL
+ 320 330 340 350 360 370
+
+>>sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-bi (479 aa)
+ initn: 196 init1: 147 opt: 170 Z-score: 168.4 bits: 40.1 E(516081): 0.073
+Smith-Waterman score: 177; 27.0% identity (54.1% similar) in 233 aa overlap (48-258:214-432)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK
+ .::: :. : :: :.:: :
+sp|Q91 GSGDLQQHSLAASQLLGPGSGHCQELVLTEDEKKLLAKE---GVTLP---TQLPLTKY--
+ 190 200 210 220 230
+
+ 80 90 100 110 120 130
+sp|Q1X TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN
+ .:. ..:.: .::. .:: ::..:. .. :::. ::: : ... ..: .:
+sp|Q91 --EERVLKKIRRKIRNKQSAQESRKKKKEYIDGLENRMSACTAQNQELQRKVLHLEKQNL
+ 240 250 260 270 280 290
+
+ 140 150 160 170 180
+sp|Q1X RLSQQLAQLAAEVRGSRANTPMPGSPATAS---------PTLTPTLFKQERDELPLERIP
+ : .:: .: : : : .. :. .. :...: :.... . : . .:
+sp|Q91 SLLEQLKHLQALVVQSTSKPAHAGTCIAVLLLSFALIILPSISP--FNSNKVDSPGDFVP
+ 300 310 320 330 340 350
+
+ 190 200 210 220 230
+sp|Q1X -------FPTPSLSDYSPTLKPSTLAESS--DVAQ-HPAVSVAGLEGD-GSAL--PLFDL
+ . . . : .: . :.. . . ::. : . : .:: .: :. : :..:
+sp|Q91 VRVFSRTLHNHAASRVAPDVTPGSEVPGPWPDVGTPHKGPSSGGLSADWGNFLEIPMLDN
+ 360 370 380 390 400 410
+
+ 240 250 260 270 280 290
+sp|Q1X GSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSM
+ .. .:: .: : .:..:
+sp|Q91 LTEELDNSTLVLAN--STEDLGRATLLDWVASEPLLSPGRVGLEIPGEMWLSWVPRWLRV
+ 420 430 440 450 460
+
+>>sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcriptio (351 aa)
+ initn: 123 init1: 91 opt: 159 Z-score: 160.0 bits: 38.1 E(516081): 0.22
+Smith-Waterman score: 159; 31.6% identity (64.3% similar) in 98 aa overlap (66-160:258-351)
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR---AKTEDEKEQRRIERVLR
+ :: :: .. ::.. :: ....... .
+sp|P18 YLGSPQHSPSTRGSPNRSLPSPGVLCGSARPKPYDPPGEKMVAAKVKGEKLDKKLKKMEQ
+ 230 240 250 260 270 280
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :..:: :..:: :.: : .: ..:..:. : .: ... : : : .: :::
+sp|P18 NKTAATRYRQKKRAEQEALTGECKELEKKNEALKERADSLAKEI----QYLKDLIEEVRK
+ 290 300 310 320 330 340
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+ .:.. .:
+sp|P18 ARGKKRVP
+ 350
+
+>>sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocricet (381 aa)
+ initn: 87 init1: 55 opt: 159 Z-score: 159.5 bits: 38.1 E(516081): 0.23
+Smith-Waterman score: 159; 25.9% identity (49.0% similar) in 247 aa overlap (2-237:57-298)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|O88 LSYYHSPADSFSSMGSPVNAQDFCTDLSVSSANFIPTVTAISTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . : : . . : : :. . . . . . . .:.:.:::.
+sp|O88 PSQTRAPHPYGVPTPSTGAYSRAGMVKTVSGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|O88 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: .:: :: : : .: ::: : : ::: . .
+sp|O88 ACKIPD-DLGFPEEMFVASLDLTGGLPEATTPESEEAFSLPLLNDPEPKPSLEPVKSISN
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250 260
+sp|Q1X PSTLAESSDVAQHPAVSV-AGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNRLF
+ :: : :: : .: : . ..: .:: ::
+sp|O88 VELKAEPFDDFLFPASSRPSGSETTARSVPDMDLSGSFYAADWEPLHSSSLGMGPMVTEL
+ 270 280 290 300 310 320
+
+ 270 280 290 300 310 320
+sp|Q1X HGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTC
+
+sp|O88 EPLCTPVVTCTPSCTTYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTLLAL
+ 330 340 350 360 370 380
+
+>>sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus muscul (380 aa)
+ initn: 94 init1: 62 opt: 158 Z-score: 158.6 bits: 37.9 E(516081): 0.26
+Smith-Waterman score: 158; 25.2% identity (48.8% similar) in 246 aa overlap (2-237:57-297)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|P01 LSYYHSPADSFSSMGSPVNTQDFCADLSVSSANFIPTVTAISTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . . :: . . : : :. . . . . . . .:.:.:::.
+sp|P01 PSQTRAPHPYGLPTQSAGAYARAGMVKTVSGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|P01 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: ..:: :: : : .: ::: : : ::: . .
+sp|P01 ACKIPD-DLGFPEEMSVASLDLTGGLPEASTPESEEAFTLPLLNDPEPKPSLEPVKSISN
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250 260
+sp|Q1X PSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNRLFH
+ :: : :: : . . ..: :: ::
+sp|P01 VELKAEPFDDFLFPASSRPSGSETSRSVPDVDLSGSFYAADWEPLHSNSLGMGPMVTELE
+ 270 280 290 300 310 320
+
+ 270 280 290 300 310 320
+sp|Q1X GDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCK
+
+sp|P01 PLCTPVVTCTPGCTTYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTLLAL
+ 330 340 350 360 370 380
+
+>>sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-bi (461 aa)
+ initn: 140 init1: 140 opt: 163 Z-score: 162.1 bits: 38.9 E(516081): 0.16
+Smith-Waterman score: 163; 26.4% identity (52.7% similar) in 201 aa overlap (48-236:218-404)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK
+ .::: :. : :: :.:: :
+sp|Q68 SSGDLQQHHLGASYLLRPGAGHCQELVLTEDEKKLLAKE---GITLP---TQLPLTKY--
+ 190 200 210 220 230
+
+ 80 90 100 110 120 130
+sp|Q1X TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN
+ .:. ..:.: .::. .:: ::..:. .. ::.. ::: : ... ..: .:
+sp|Q68 --EERVLKKIRRKIRNKQSAQESRKKKKEYIDGLETRMSACTAQNQELQRKVLHLEKQNL
+ 240 250 260 270 280 290
+
+ 140 150 160 170 180
+sp|Q1X RLSQQLAQLAAEVRGSRANTPMPGSPATAS---------PTLTPTLFKQERDELPLERIP
+ : .:: .: : : : ... . :. ... :...: : .. : : . :
+sp|Q68 SLLEQLKKLQAIVVQSTSKSAQTGTCVAVLLLSFALIILPSISP--FGPNKTESPGDFAP
+ 300 310 320 330 340 350
+
+ 190 200 210 220 230 240
+sp|Q1X ---FPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTD
+ : .: . . ... : . .: .... :. :: : : :
+sp|Q68 VRVFSRTLHNDAASRVAADAVPGSEAPGPRPEADTTREESPGS--PGADWGFQDTANLTN
+ 360 370 380 390 400 410
+
+ 250 260 270 280 290 300
+sp|Q1X DVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTL
+
+sp|Q68 STEELDNATLVLRNATEGLGQVALLDWVAPGPSTGSGRAGLEAAGDEL
+ 420 430 440 450 460
+
+>>sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive element-bi (395 aa)
+ initn: 145 init1: 145 opt: 158 Z-score: 158.3 bits: 37.9 E(516081): 0.27
+Smith-Waterman score: 158; 29.3% identity (56.0% similar) in 150 aa overlap (54-199:192-329)
+
+ 30 40 50 60 70 80
+sp|Q1X PVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQE-LPVPKTNLPPRKRAKTEDEK
+ .... ::: . .: ..:: : .:.
+sp|Q8T AHAHILPRAGTVAPVPCTTLLPCQTLFLTDEEKRLLGQEGVSLP-SHLPLTK----AEER
+ 170 180 190 200 210
+
+ 90 100 110 120 130 140
+sp|Q1X EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ
+ ....: .::. .:: ::.::. .. ::.. ::: : ......: .: : :
+sp|Q8T VLKKVRRKIRNKQSAQDSRRRKKEYIDGLESRVAACSAQNQELQKKVQELERHNISLVAQ
+ 220 230 240 250 260 270
+
+ 150 160 170 180 190
+sp|Q1X LAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF---PTPSLSDYSP
+ : :: . . :.: .. : .: . ::. :: :: : . ::.:
+sp|Q8T LRQLQTLI----AQTS--NKAAQTSTCVLILLFSLALIILP-SFSPFQSRPEAGSEDYQP
+ 280 290 300 310 320
+
+ 200 210 220 230 240 250
+sp|Q1X TLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRL
+
+sp|Q8T HGVTSRNILTHKDVTENLETQVVESRLREPPGAKDANGSTRTLLEKMGGKPRPSGRIRSV
+ 330 340 350 360 370 380
+
+>>sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF2 OS (401 aa)
+ initn: 115 init1: 115 opt: 158 Z-score: 158.2 bits: 37.9 E(516081): 0.27
+Smith-Waterman score: 158; 28.6% identity (61.3% similar) in 119 aa overlap (80-198:195-312)
+
+ 50 60 70 80 90 100
+sp|Q1X KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ : .. .:..:.: :: .:. ::.::. .:
+sp|Q99 QVKSTTSGSSRDHSDDDDELEGETETTRNGDPSDAKRVRRMLSNRESARRSRRRKQAHMT
+ 170 180 190 200 210 220
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPT
+ .::.. :.. .:. ::.::... . : . . : :... ::.. : .
+sp|Q99 ELETQVSQLRVENSSLLKRLTDISQRYNDAAVDNRVLKADIETMRAKVKMAEETVKRVTG
+ 230 240 250 260 270 280
+
+ 170 180 190 200 210 220
+sp|Q1X LTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSA
+ :.: .:.. .:. . . : :: :
+sp|Q99 LNP-MFQSMSSEISTIGMQSFSGSPSDTSADTTQDGSKQHFYQPAPTSHMPAQDQKIQNG
+ 290 300 310 320 330 340
+
+>>sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcriptio (483 aa)
+ initn: 108 init1: 108 opt: 159 Z-score: 158.1 bits: 38.2 E(516081): 0.28
+Smith-Waterman score: 159; 26.1% identity (62.7% similar) in 153 aa overlap (26-168:277-424)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV--KPEEKKPA
+ ..:. :.: ... ..: . .:. .::
+sp|Q5R PSGHPIPSEAKMRLKATLTHQVSSINGGCGMVVGSASTMVTARPEQSQILIQHPDAPSPA
+ 250 260 270 280 290 300
+
+ 60 70 80 90 100 110
+sp|Q1X KKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLEN
+ . . : .: :.:.:. :.: .... ..:: . . ::::::. :....: . .::.
+sp|Q5R QPQVSPAQ--PTPSTG--GRRRRTVDEDPDERRQRFLERNRAAASRCRQKRKLWVSSLEK
+ 310 320 330 340 350 360
+
+ 120 130 140 150 160
+sp|Q1X EKIQMEQQNQFLLQRLSQMEAENNRLSQQL--------AQLAAEVRGSRANTPMPGSPAT
+ . .. .:: : .... .. : .:.: : . : ...: ..: .: :
+sp|Q5R KAEELTSQNIQLSNEVTLLRNEVAQLKQLLLAHKDCPVTALQKKTQG-YLESPKESSEPT
+ 370 380 390 400 410 420
+
+ 170 180 190 200 210 220
+sp|Q1X ASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEG
+ .::
+sp|Q5R GSPAPVIQHSSATAPSNGLSVRSAAEAVATSVLTQMASQRTELSMPIQSHVIMTPQSQSA
+ 430 440 450 460 470 480
+
+>>sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcriptio (494 aa)
+ initn: 108 init1: 108 opt: 159 Z-score: 158.0 bits: 38.2 E(516081): 0.28
+Smith-Waterman score: 159; 26.1% identity (62.7% similar) in 153 aa overlap (26-168:288-435)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV--KPEEKKPA
+ ..:. :.: ... ..: . .:. .::
+sp|P17 PSGHPIPSEAKMRLKATLTHQVSSINGGCGMVVGTASTMVTARPEQSQILIQHPDAPSPA
+ 260 270 280 290 300 310
+
+ 60 70 80 90 100 110
+sp|Q1X KKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLEN
+ . . : .: :.:.:. :.: .... ..:: . . ::::::. :....: . .::.
+sp|P17 QPQVSPAQ--PTPSTG--GRRRRTVDEDPDERRQRFLERNRAAASRCRQKRKLWVSSLEK
+ 320 330 340 350 360 370
+
+ 120 130 140 150 160
+sp|Q1X EKIQMEQQNQFLLQRLSQMEAENNRLSQQL--------AQLAAEVRGSRANTPMPGSPAT
+ . .. .:: : .... .. : .:.: : . : ...: ..: .: :
+sp|P17 KAEELTSQNIQLSNEVTLLRNEVAQLKQLLLAHKDCPVTALQKKTQG-YLESPKESSEPT
+ 380 390 400 410 420 430
+
+ 170 180 190 200 210 220
+sp|Q1X ASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEG
+ .::
+sp|P17 GSPAPVIQHSSATAPSNGLSVRSAAEAVATSVLTQMASQRTELSMPIQSHVIMTPQSQSA
+ 440 450 460 470 480 490
+
+>>sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive element-bi (395 aa)
+ initn: 145 init1: 145 opt: 157 Z-score: 157.4 bits: 37.8 E(516081): 0.3
+Smith-Waterman score: 157; 29.3% identity (56.0% similar) in 150 aa overlap (54-199:192-329)
+
+ 30 40 50 60 70 80
+sp|Q1X PVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQE-LPVPKTNLPPRKRAKTEDEK
+ .... ::: . .: ..:: : .:.
+sp|Q5U AHAHILPRAGTLAPVPCTTLLPCQTLFLTDEEKRLLGQEGVSLP-SHLPLTK----AEER
+ 170 180 190 200 210
+
+ 90 100 110 120 130 140
+sp|Q1X EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ
+ ....: .::. .:: ::.::. .. ::.. ::: : ......: .: : :
+sp|Q5U VLKKVRRKIRNKQSAQDSRRRKKEYIDGLESRVAACSAQNQELQKKVQELERHNISLVAQ
+ 220 230 240 250 260 270
+
+ 150 160 170 180 190
+sp|Q1X LAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF---PTPSLSDYSP
+ : :: . . :.: .. : .: . ::. :: :: : . ::.:
+sp|Q5U LRQLQTLI----AQTS--NKAAQTSTCVLILLFSLALIILP-SFSPFQGRPEAGPEDYQP
+ 280 290 300 310 320
+
+ 200 210 220 230 240 250
+sp|Q1X TLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRL
+
+sp|Q5U HGVTSRNILTHKDITENLETQVVESRLREPPEAKDANDSTRTLLEKMGGKPRPSGRIGTV
+ 330 340 350 360 370 380
+
+>>sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS=Homo (323 aa)
+ initn: 119 init1: 119 opt: 154 Z-score: 155.8 bits: 37.2 E(516081): 0.37
+Smith-Waterman score: 154; 28.6% identity (57.1% similar) in 154 aa overlap (14-163:174-319)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ : :.::...:. .:. . :: .
+sp|Q9Y AYPGAGVAHDELGPHAHPHHHHHHQASPPPSSAASPAQQLPTSHPGPGPHATASATAAGG
+ 150 160 170 180 190 200
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTS
+ . . :. : : : . . .: . :. :.:: .:.: :.:.::. ::.
+sp|Q9Y NGSVED------RFSDDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSC
+ 210 220 230 240 250
+
+ 110 120 130 140 150
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPM
+ : .. . ..::::: :. :: . : :..:.. : . . . .:: : . ...
+sp|Q9Y RYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAYKVKCEKLANSGFREAGSTSDS
+ 260 270 280 290 300 310
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::
+sp|Q9Y PSSPEFFL
+ 320
+
+>>sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein OS= (381 aa)
+ initn: 94 init1: 62 opt: 155 Z-score: 155.7 bits: 37.4 E(516081): 0.37
+Smith-Waterman score: 155; 25.2% identity (48.8% similar) in 246 aa overlap (2-237:57-297)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|P01 LSYYHSPADSFSSMGSPVNTQDFCADLSVSSANFIPTVTATSTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . . :: . . : : :. . . . . . . .:.:.:::.
+sp|P01 PSQTRAPHPYGLPTQSAGAYARAEMVKTVSGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|P01 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDKKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: ..:: :: : : .: ::: : : ::: . .
+sp|P01 ACKIPD-DLGFPEEMSVASLDLTGGLPEASTPESEEAFTLPLLNDPEPKPSLEPVKSISN
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250 260
+sp|Q1X PSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNRLFH
+ :: : :: : . . ..: :: ::
+sp|P01 VELKAEPFDDFLFPASSRPSGSETSRSVPNVDLSGSFYAADWEPLHSNSLGMGPMVTELE
+ 270 280 290 300 310 320
+
+ 270 280 290 300 310 320
+sp|Q1X GDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCK
+
+sp|P01 PLCTPVVTCTPLLRLPELTHAAGPVSSQRRQGSRHPDVPLPELVHYREEKHVFPQRFPST
+ 330 340 350 360 370 380
+
+>>sp|P51145|FOSL2_RAT Fos-related antigen 2 OS=Rattus no (327 aa)
+ initn: 95 init1: 64 opt: 154 Z-score: 155.7 bits: 37.2 E(516081): 0.38
+Smith-Waterman score: 155; 23.1% identity (55.9% similar) in 229 aa overlap (12-216:38-261)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL---TVSPAD------
+ :: .:.. .. .:.. :.. :
+sp|P51 NFDTSSRGSSGSPAHAESYSSGGGGQQKFRVD-MPGSGSAFIPTINAITTTSQDLQWMVQ
+ 10 20 30 40 50 60
+
+ 40 50 60 70 80
+sp|Q1X -TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK------TNLPPRKRAK--TEDEKE
+ : ..: . . .: :. . . :: : :.. :.: . . .:.:
+sp|P51 PTVITSMSNPYPRSHPYSPLPGLRSVPGHMALPRPGVIKTIGTTVGRRRRDEQLSPEEEE
+ 70 80 90 100 110 120
+
+ 90 100 110 120 130 140
+sp|Q1X QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQL
+ .:::.: ::. :: :.:.: :::..: ..:.... : ....... :...: .:
+sp|P51 KRRIRRE-RNKLAAAKCRNRRRELTEKLQTETEELEEEKSGLQKEIAELQKEKEKLEFML
+ 130 140 150 160 170 180
+
+ 150 160 170 180 190
+sp|Q1X AQLAAEVRGS---RANTPMPGSPAT--ASPTLTPTLFKQERDELPLERIPFPTPSLSDYS
+ . . . : : ..: : . .. .. :.. ::: : : : . ... .
+sp|P51 VAHGPVCKISPEERRSSPTSGVQSLRGTGSAVGPVVVKQEP---PEEDSPSSSAGMDKTQ
+ 190 200 210 220 230 240
+
+ 200 210 220 230 240 250
+sp|Q1X PT-LKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFN
+ . .:: ..: .. ...:
+sp|P51 RSVIKPISIAGGGFYGEEPLHTPIVVTSTPAITPGTSNLVFTYPSVLEQESPASPSESCS
+ 250 260 270 280 290 300
+
+>>sp|Q9UQ88|CD11A_HUMAN Cell division protein kinase 11A (780 aa)
+ initn: 75 init1: 75 opt: 159 Z-score: 155.3 bits: 38.4 E(516081): 0.4
+Smith-Waterman score: 159; 28.9% identity (56.1% similar) in 173 aa overlap (42-208:92-255)
+
+ 20 30 40 50 60 70
+sp|Q1X VDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLP
+ ... : ...: :....: .. : . .
+sp|Q9U IRNSPYRREDSMEDRGEEDDSLAIKPPQQMSRKEKVHHRKDEKRKEKW-KHARVKEREHE
+ 70 80 90 100 110 120
+
+ 80 90 100 110 120
+sp|Q1X PRKRAKTEDEKEQRRIERVLRNRAAAQTSR-ERKRLEM--EKLENEKIQMEQQNQFLLQR
+ ::: . :..: .:. :: : . : . :: :: :::. .: : :. . :::.. :.
+sp|Q9U RRKRHREEQDKARREWERQKRREMAREHSRRERDRLEQLERKRERERKMREQQKEQREQK
+ 130 140 150 160 170 180
+
+ 130 140 150 160 170 180
+sp|Q1X LSQMEAENNRLSQQLA-QLAAEVRGSRAN--TPMPGSPATASPTLTPTLFKQERDELPLE
+ . .::. : .. ...:. : : . . .: . :: : .:: ::
+sp|Q9U ERERRAEERRKEREARREVSAHHRTMREDYSDKVKASHWSRSPPRPP----RERFELGDG
+ 190 200 210 220 230
+
+ 190 200 210 220 230 240
+sp|Q1X RIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTD
+ : :. . .:. ::. : :
+sp|Q9U R----KPGEARPAPAQKPAQLKEEKMEERDLLSDLQDISDSERKTSSAESSSAESGSGSE
+ 240 250 260 270 280 290
+
+>>sp|Q9WVS8|MK07_MOUSE Mitogen-activated protein kinase (806 aa)
+ initn: 106 init1: 69 opt: 173 Z-score: 168.2 bits: 40.8 E(516081): 0.075
+Smith-Waterman score: 173; 27.0% identity (51.0% similar) in 259 aa overlap (3-236:429-680)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLP--ATPASEVPVLTVSP
+ : :: : .:: . :: .. ::..:
+sp|Q9W IRFQPSLQPVASEPVCPDVEMPSPWAPSGDCAME---SPPPALPPCSDPAPDTVDLTLQP
+ 400 410 420 430 440 450
+
+ 40 50 60 70 80
+sp|Q1X ADTSLNSADVKTQEVKPEEKKPA------KKRKSWGQELPVPKTNLP-PRKRAKTEDEKE
+ : . . : : . . .. : : :. .: .. : . : ::: . ......
+sp|Q9W APPASELAPPKREGAISDNTKAALKAALLKSLRSRLRDGPSAPLEAPEPRKPVTAQERQR
+ 460 470 480 490 500 510
+
+ 90 100 110 120 130 140
+sp|Q1X QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNR-LSQQ
+ .:. .: : : ::..: : :. : . . : : . ..:.: : ..
+sp|Q9W EREEKR--RRRQERAKEREKRRQERERKERGAGTLGGPSTDPLAGL--VLSDNDRSLLER
+ 520 530 540 550 560 570
+
+ 150 160 170 180 190
+sp|Q1X LAQLAAEVRGSRANTPMPG-SPATASPTLTPTL-FKQERDEL-PLERIPFPT--PSLSDY
+ ...: . : .: :. .:..:.:: ::: .: : : :: :. :
+sp|Q9W WTRMARPPAPAPAPAPAPAPAPSSAQPTSTPTGPVSQSTGPLQPAGSIPGPASQPVCPPP
+ 580 590 600 610 620 630
+
+ 200 210 220 230 240
+sp|Q1X SPTLKPS--------TLAESSDVAQHPAVSVAGLEGDGS--ALPLFDLGSDLKHHSTDDV
+ .:. .:. : .: .:.. : .:: :.:. .:: : :
+sp|Q9W GPVPQPAGPIPAPLQTAPSTSLLASQSLVPPSGLPGSGAPEVLPYFPSGPPPPDPGLTPQ
+ 640 650 660 670 680 690
+
+ 250 260 270 280 290 300
+sp|Q1X AAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEG
+
+sp|Q9W PSTSESPDVNLVTQQLSKSQVEDPLPPVFSGTPKGSGAGYGVGFDLEEFLNQSFDMGVAD
+ 700 710 720 730 740 750
+
+>>sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive element-bi (428 aa)
+ initn: 130 init1: 130 opt: 155 Z-score: 155.1 bits: 37.4 E(516081): 0.41
+Smith-Waterman score: 155; 26.8% identity (54.0% similar) in 198 aa overlap (8-199:138-322)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSP---ADTS
+ :. . .. : ::. : :::. . :
+sp|Q50 VSQTQHSLNINFPFDFNGWETGFLPDQAGGTQCASETPQAQPATGFP-LTVKDLLLSGTP
+ 110 120 130 140 150 160
+
+ 40 50 60 70 80 90
+sp|Q1X LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNR
+ ..: :. : . .:: . . .:. ..: : .:. ..:.: .::.
+sp|Q50 ETAAKVSQQSYQELILTEDEKRLLAKEGMTLPN-QFPLTKY----EERILKKIRRKIRNK
+ 170 180 190 200 210 220
+
+ 100 110 120 130 140 150
+sp|Q1X AAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR
+ .:: ::..:. .. ::.. .:. : ... :.: : : .:: .: : : ..
+sp|Q50 QSAQESRKKKKEYIDGLESRMAACSAHNHELQRKVFQLEKCNISLMEQLRRLQALVMNG-
+ 230 240 250 260 270 280
+
+ 160 170 180 190 200 210
+sp|Q1X ANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLS---DYSPTLKPSTLAESSD
+ .: :. .. . :. ::. :: . :: ..: :.::
+sp|Q50 SNKPVQAGTCVLVLLLSFTLIL-----LPNLK-PFTDTKVSQHGDFSPMRVQSRSLHNLQ
+ 290 300 310 320 330
+
+ 220 230 240 250 260 270
+sp|Q1X VAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSS
+
+sp|Q50 SSRVLRNLDHPYSMTENAKILPRFPEDKTMEEIASLLGRLHRRPQFTEYDPESHNHSFDQ
+ 340 350 360 370 380 390
+
+>>sp|P15408|FOSL2_HUMAN Fos-related antigen 2 OS=Homo sa (326 aa)
+ initn: 94 init1: 63 opt: 153 Z-score: 154.8 bits: 37.0 E(516081): 0.42
+Smith-Waterman score: 153; 24.9% identity (54.1% similar) in 233 aa overlap (4-222:39-253)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSS-VDSLPATPASEVPVLTVSPAD
+ :: . :. . .. : .:. :.:
+sp|P15 FDTSSRGSSGSPAHAESYSSGGGGQQKFRVDMPGSGSAFIPTINAITTSQDLQWMVQP--
+ 10 20 30 40 50 60
+
+ 40 50 60 70 80
+sp|Q1X TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK------TNLPPRKRAK--TEDEKEQ
+ : ..: . . .: :. . :: : :.. :.: . . .:.:.
+sp|P15 TVITSMSNPYPRSHPYSPLPGLASVPGHMALPRPGVIKTIGTTVGRRRRDEQLSPEEEEK
+ 70 80 90 100 110 120
+
+ 90 100 110 120 130 140
+sp|Q1X RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA
+ :::.: ::. :: :.:.: :::. : ..:.... : ....... :...: .:.
+sp|P15 RRIRRE-RNKLAAAKCRNRRRELTEKLQAETEELEEEKSGLQKEIAELQKEKEKLEFMLV
+ 130 140 150 160 170 180
+
+ 150 160 170 180 190
+sp|Q1X QLAAEVRGS---RANTPMPG-SPA-TASPTLTPTLFKQERDELPLERIPFPTPSLSDYSP
+ . . : : . : :: .: ... .. .. ::: ::: . ::
+sp|P15 AHGPVCKISPEERRSPPAPGLQPMRSGGGSVGAVVVKQE----PLE----------EDSP
+ 190 200 210 220 230
+
+ 200 210 220 230 240 250
+sp|Q1X TLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRL
+ . . . : ... . .: .:.::
+sp|P15 SSSSAGLDKAQRSVIKP-ISIAGGFYGEEPLHTPIVVTSTPAVTPGTSNLVFTYPSVLEQ
+ 240 250 260 270 280 290
+
+>>sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcriptio (413 aa)
+ initn: 108 init1: 108 opt: 154 Z-score: 154.3 bits: 37.3 E(516081): 0.45
+Smith-Waterman score: 154; 27.5% identity (67.5% similar) in 120 aa overlap (26-143:277-392)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV--KPEEKKPA
+ ..:. :.: ... ..: . .:. .::
+sp|Q8R PSGHPMPSEAKMRLKATLTHQVSSINGGCGMVVGTASTMVTARPEQNQILIQHPDAPSPA
+ 250 260 270 280 290 300
+
+ 60 70 80 90 100 110
+sp|Q1X KKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLEN
+ . . : .: :.:.:. :.: .... ..:: . . ::::::. :....: . .::.
+sp|Q8R QPQVSPAQ--PTPSTG--GRRRRTVDEDPDERRQRFLERNRAAASRCRQKRKLWVSSLEK
+ 310 320 330 340 350 360
+
+ 120 130 140 150 160 170
+sp|Q1X EKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPT
+ . .. .:: : .... .. : .:.: :
+sp|Q8R KAEELTSQNIQLSNEVTLLRNEVAQLKQLLLAHKDCPVTALQKKTQGYLGK
+ 370 380 390 400 410
+
+>>sp|P29747|CREBA_DROME Cyclic AMP response element-bind (516 aa)
+ initn: 190 init1: 128 opt: 155 Z-score: 154.0 bits: 37.5 E(516081): 0.47
+Smith-Waterman score: 155; 30.4% identity (55.4% similar) in 148 aa overlap (8-150:370-508)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVS--PADTSL
+ : :: : :. .: ..:.. : : :
+sp|P29 LSPNATVSISVANPAGGESSVRVSRTAASITRSSSGSASASGSSTSSTVTTTRQPIHTPL
+ 340 350 360 370 380 390
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQE---VKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ :.. : . . ::.: : .. :.:. .:: : .:: ..:.: ..
+sp|P29 ISSQPKGSTGTLLLTEEEK----RTLLAEGYPIPQ-KLPLTK----AEEKSLKKIRRKIK
+ 400 410 420 430 440 450
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :. .:: ::..:. :..:: . . .:. .:: .: : : .:: .: : :
+sp|P29 NKISAQESRRKKKEYMDQLERRVEILVTENHDYKKRLEGLEETNANLLSQLHKLQALVSK
+ 460 470 480 490 500 510
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+
+sp|P29 HNVKKS
+
+
+>>sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS=Maca (323 aa)
+ initn: 146 init1: 117 opt: 152 Z-score: 153.9 bits: 36.8 E(516081): 0.47
+Smith-Waterman score: 152; 28.6% identity (57.1% similar) in 154 aa overlap (14-163:174-319)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ : :.::...:. .:. . :: .
+sp|Q2P AYPGAGVAHDELGPHAHPHHHHHHQASPPPSSAASPAQQLPTSHPGPGPHATASATAAGG
+ 150 160 170 180 190 200
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTS
+ . . :. : : : . . .: . :. :.:: .:.: :.:.::. ::.
+sp|Q2P NGSVED------RFSDDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSC
+ 210 220 230 240 250
+
+ 110 120 130 140 150
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPM
+ : .. . ..::::: :. :: . : :..:.. : . . . .:: : . ...
+sp|Q2P RYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAHKVKCEKLANSGFREAGSTSDS
+ 260 270 280 290 300 310
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::
+sp|Q2P PSSPEFFL
+ 320
+
+>>sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Rattus n (267 aa)
+ initn: 156 init1: 109 opt: 152 Z-score: 155.0 bits: 36.8 E(516081): 0.41
+Smith-Waterman score: 152; 27.6% identity (56.4% similar) in 163 aa overlap (51-190:23-183)
+
+ 30 40 50 60 70
+sp|Q1X SEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK------TNLPP-R
+ .::. .. .: :. .. : :
+sp|Q9R MVVVAAAPSAASAAPKVLLLSGQPASGGRALPLMVPGPRAAGSEASGTPQAR
+ 10 20 30 40 50
+
+ 80 90 100 110 120
+sp|Q1X KRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQ-------FL
+ :: . :. :.. ..: :.::.::::.:.::. .: .::.. ...:..:: .:
+sp|Q9R KRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENQKLQLENQLL
+ 60 70 80 90 100 110
+
+ 130 140 150 160 170
+sp|Q1X LQRLSQMEAENNRLSQQLAQLA--------AEVRGSRANTPMPGSPATASPTLTPTLFKQ
+ .. . ::..: .:.. : :: .:. . . :: .:. : : .:
+sp|Q9R REKTHGLVIENQELRTRLGMNALVTEEVSEAESKGNGVRL-VAGSAESAALRLRAPL-QQ
+ 120 130 140 150 160 170
+
+ 180 190 200 210 220 230
+sp|Q1X ERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGS
+ . .: . ::
+sp|Q9R VQAQLSPPQNIFPWILTLLPLQILSLISFWAFWTSWTLSCFSNVLPQSLLIWRNSQRSTQ
+ 180 190 200 210 220 230
+
+>>sp|P54842|MAFB_RAT Transcription factor MafB OS=Rattus (323 aa)
+ initn: 119 init1: 119 opt: 151 Z-score: 153.0 bits: 36.6 E(516081): 0.53
+Smith-Waterman score: 151; 27.9% identity (57.8% similar) in 154 aa overlap (14-163:174-319)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ : :.::...:. .:. . .: . .
+sp|P54 GYPGAGVTHDELGPHAHPHHHHHHQASPPPSSAASPAQQLPTSHPGPGPHAAAAATAAGS
+ 150 160 170 180 190 200
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTS
+ . . :. : : : . . .: . :. :.:: .:.: :.:.::. ::.
+sp|P54 NGSVED------RFSDDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSC
+ 210 220 230 240 250
+
+ 110 120 130 140 150
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPM
+ : .. . ..::::: :. :: . : :..:.. : . . . .:: : . ...
+sp|P54 RYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAYKVKCEKLANSGFREAGSTSDS
+ 260 270 280 290 300 310
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::
+sp|P54 PSSPEFFL
+ 320
+
+>>sp|P47930|FOSL2_MOUSE Fos-related antigen 2 OS=Mus mus (326 aa)
+ initn: 94 init1: 63 opt: 151 Z-score: 152.9 bits: 36.7 E(516081): 0.54
+Smith-Waterman score: 151; 24.0% identity (56.3% similar) in 229 aa overlap (4-216:39-260)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSS-VDSLPATPASEVPVLTVSPAD
+ :: . :. . .. : .:. :.:
+sp|P47 FDTSSRGSSGSPAHAESYSSGGGGQQKFRVDMPGSGSAFIPTINAITTSQDLQWMVQP--
+ 10 20 30 40 50 60
+
+ 40 50 60 70 80
+sp|Q1X TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK------TNLPPRKRAK--TEDEKEQ
+ : ..: . . .: :. . :: : :.. :.: . . .:.:.
+sp|P47 TVITSMSNPYPRSHPYSPLPGLASVPGHMALPRPGVIKTIGTTVGRRRRDEQLSPEEEEK
+ 70 80 90 100 110 120
+
+ 90 100 110 120 130 140
+sp|Q1X RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLS-QQL
+ :::.: ::. :: :.:.: :::. : ..:.... : ....... :...: ...
+sp|P47 RRIRRE-RNKLAAAKCRNRRRELTEKLQAETEELEEEKSGLQKEIAELQKEKEKLEFMKV
+ 130 140 150 160 170 180
+
+ 150 160 170 180 190
+sp|Q1X A-----QLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYS
+ : ... : : : .. . . .:.: .. :.. ::: : : : . ... .
+sp|P47 AHGPVCKISPEERRSPPTSGLQSLRGTGS-AVGPVVVKQEP---PEEDSPSSSAGMDKTQ
+ 190 200 210 220 230 240
+
+ 200 210 220 230 240 250
+sp|Q1X PT-LKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFN
+ . .:: ..: .. ...:
+sp|P47 RSVIKPISIAGGGFYGEEPLHTPIVVTSTPAITPGTSNLVFTYPNVLEQESPSSPSESCS
+ 250 260 270 280 290 300
+
+>>sp|Q2VZV0|IF2_MAGSA Translation initiation factor IF-2 (872 aa)
+ initn: 186 init1: 84 opt: 157 Z-score: 152.8 bits: 38.0 E(516081): 0.55
+Smith-Waterman score: 157; 33.6% identity (62.6% similar) in 107 aa overlap (16-119:188-291)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV
+ :..::. :: ...:: . ..:.:
+sp|Q2V QSEPEAAAPAAEPVAPTAPVAAAPAPAPATPVAPAQPKPVAAAAPAGDATAVPRARTEEE
+ 160 170 180 190 200 210
+
+ 50 60 70 80 90 100
+sp|Q1X KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK---TEDEKEQRRIERVLRNRAAAQTSRE
+ . ::.. :::: . . :: .:. : :. .: :. .. : :: :. ::.. .::
+sp|Q2V EEEEER-AKKRAAAHKPAPVKRTE-PRRRTGKLTITDALTDDDRSERG-RSLAAVKRARE
+ 220 230 240 250 260 270
+
+ 110 120 130 140 150 160
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS
+ :.::. . .::. :
+sp|Q2V RERLKHMQKGSEKVIREVIVPESITVQELANRMAVRGADVIKCLMRLGVMATINQNIDAD
+ 280 290 300 310 320 330
+
+>>sp|Q0CEI3|KAPC_ASPTN Putative transcription factor kap (286 aa)
+ initn: 70 init1: 70 opt: 150 Z-score: 152.7 bits: 36.4 E(516081): 0.55
+Smith-Waterman score: 150; 23.4% identity (53.7% similar) in 214 aa overlap (14-223:37-240)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ : : : ..: ...: . :.:. . :
+sp|Q0C PAPHPSMQTSAQDHADQVLHDQLLAAHQHLSHPQQPRPQAP--ATQPPHMQPNTASPRDQ
+ 10 20 30 40 50 60
+
+ 50 60 70 80 90 100
+sp|Q1X E-VKPEEKKPAKKRKSWGQELPVPKTNLP-PRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ . . : . : : .: : :.. :: .. .:. .:::: .. :
+sp|Q0C NNIDPAISGSAI----LGAPPQTPPQPEPAPQESPKTYGKRPLSTSKRAAQNRAAQRAFR
+ 70 80 90 100 110 120
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-MP
+ .::. ..:::. :...: . . .. . ..::: .: . . .: ... :....: .:
+sp|Q0C QRKESYIRKLEE---QVKHQ-EAITEEYKALHAENYQLREYIINLQTRLLDSQGEVPELP
+ 130 140 150 160 170
+
+ 170 180 190 200 210
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERI-PFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :. .: :: : .. : :. . : . . .. ..:. . ..
+sp|Q0C GNIDLNQPRADLTLSAPELQRGNAASAGPAPAGPGPQQSQPNQNQGVGPNDDMNSLNRIA
+ 180 190 200 210 220 230
+
+ 220 230 240 250 260 270
+sp|Q1X VAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAF
+ ::::
+sp|Q0C VAGLGMRKHPNEDANYLGNNFQARRPRTDDNQTGATETTKQEPDGLPVVS
+ 240 250 260 270 280
+
+>>sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-bi (404 aa)
+ initn: 145 init1: 145 opt: 181 Z-score: 179.7 bits: 41.9 E(516081): 0.017
+Smith-Waterman score: 181; 26.7% identity (56.0% similar) in 225 aa overlap (1-207:107-318)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSV--DSLP--ATPASEVPVL
+ .:: .. .... ...: : . : .
+sp|Q61 LGSSSSSILHDHNYSLPQEHVSIDLGECEMISCRGRRELTGLAGSTFPFADTESFEKEGF
+ 80 90 100 110 120 130
+
+ 30 40 50 60 70 80
+sp|Q1X TVSPADTSLNSADVKTQEV--KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQ
+ :.: .:. . ... :::: .:. : :: ..:: : .:.
+sp|Q61 HVTPLPGEERAAEQEMSRLILTEEEKKLLEKE---GLTLP---STLPLTKV----EEQVL
+ 140 150 160 170 180
+
+ 90 100 110 120 130 140
+sp|Q1X RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA
+ .:..: .::. ::: ::..:.. . ::.. ... ::. : ......: .: : .::
+sp|Q61 KRVRRKIRNKRAAQESRKKKKVYVVGLESRVLKYTAQNRELQNKVQRLEEQNLSLLDQLR
+ 190 200 210 220 230 240
+
+ 150 160 170 180 190
+sp|Q1X QLAAEVRGSRANTPMPGSPA------TASPTLTPTLFKQE-RDELPLERIPF-----PTP
+ .: : : :: :: . :.:...... : .: : . . :
+sp|Q61 KLQAMVI-EIANKTSSGSTCVLVLVFSFCLLLVPAMYSSDARGSVPAEYVVLHRKLRALP
+ 250 260 270 280 290 300
+
+ 200 210 220 230 240 250
+sp|Q1X SLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLS
+ : .:..: :::.:.
+sp|Q61 SEDDHQP--KPSALSSELPMDSTHQSLDSSEHMFLVSSNFSCVLYHAPQAEQPLHWPLWD
+ 310 320 330 340 350 360
+
+>>sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcription (347 aa)
+ initn: 123 init1: 91 opt: 151 Z-score: 152.5 bits: 36.7 E(516081): 0.56
+Smith-Waterman score: 151; 30.9% identity (62.9% similar) in 97 aa overlap (66-160:255-347)
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP--RKRAKTEDEKEQRRIERVLRN
+ :: :: ::.. :: ....... .:
+sp|Q9E SYLGSPQHSPSTSRAPPDSLPSPGVPRGSRPKPYDPPGVSVTAKVKTEKLDKKLKKMEQN
+ 230 240 250 260 270 280
+
+ 100 110 120 130 140 150
+sp|Q1X RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS
+ ..:: :..:: :.: : .: ..:..:. : .. ... : : : .: ::: .
+sp|Q9E KTAATRYRQKKRAEQEALTGECKELEKKNEALKEKADSLAKEI----QYLKDLIEEVRKA
+ 290 300 310 320 330 340
+
+ 160 170 180 190 200 210
+sp|Q1X RANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVA
+ :.. .:
+sp|Q9E RGKKRVP
+
+
+>>sp|P54841|MAFB_MOUSE Transcription factor MafB OS=Mus (323 aa)
+ initn: 119 init1: 119 opt: 150 Z-score: 152.0 bits: 36.5 E(516081): 0.6
+Smith-Waterman score: 150; 27.9% identity (57.1% similar) in 154 aa overlap (14-163:174-319)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ : :.::...:. .:. . .: .
+sp|P54 GYPGAGVTHDDLGQHAHPHHHHHHQASPPPSSAASPAQQLPTSHPGPGPHATAAATAAGG
+ 150 160 170 180 190 200
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTS
+ . . :. : : : . . .: . :. :.:: .:.: :.:.::. ::.
+sp|P54 NGSVED------RFSDDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSC
+ 210 220 230 240 250
+
+ 110 120 130 140 150
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPM
+ : .. . ..::::: :. :: . : :..:.. : . . . .:: : . ...
+sp|P54 RYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAYKVKCEKLANSGFREAGSTSDS
+ 260 270 280 290 300 310
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::
+sp|P54 PSSPEFFL
+ 320
+
+>>sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos taurus (380 aa)
+ initn: 94 init1: 62 opt: 151 Z-score: 152.0 bits: 36.7 E(516081): 0.6
+Smith-Waterman score: 151; 24.0% identity (50.0% similar) in 246 aa overlap (2-237:57-297)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|O77 LSYYHSPADSFSSMGSPVNAQDYCTDLAVSSANFIPTVTAISTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . : : . . . : . :. . . . . . . .:.:.:::.
+sp|O77 PSQTRAPHPYGVPTPSAGAYSRAGVMKTMTGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|O77 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: ..:: :. : : .: ::: : : ::. . . .
+sp|O77 ACKIPD-DLGFPEEMSVASLDLSGGLPEAATPESEEAFTLPLLNDPEPKPSVEPVKSVGS
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250 260
+sp|Q1X PSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNRLFH
+ :: : . :: : . . ..: .:: ::
+sp|O77 MELKAEPFDDYMFPASSRPSGSETARSVPDMDLSGSFYAADWEPLHGGSLGMGPMATELE
+ 270 280 290 300 310 320
+
+ 270 280 290 300 310 320
+sp|Q1X GDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCK
+
+sp|O77 PLCTPVVTCTPSCTTYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTLLAL
+ 330 340 350 360 370 380
+
+>>sp|A1C9M5|KAPC_ASPCL Putative transcription factor kap (288 aa)
+ initn: 114 init1: 80 opt: 149 Z-score: 151.7 bits: 36.3 E(516081): 0.62
+Smith-Waterman score: 149; 20.8% identity (56.0% similar) in 159 aa overlap (66-223:83-237)
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRA
+ :. .: .. :: .. .:. .:::
+sp|A1C HMQPTTPVARDQNNIDPAISGGAMLAGPQTPQPDLSGQESPKTYGKRPLSTSKRAAQNRA
+ 60 70 80 90 100 110
+
+ 100 110 120 130 140 150
+sp|Q1X AAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA
+ : .. :.::. ... ::. :.. . . . .. ..::: .: . . .: ... ...
+sp|A1C AQRAFRQRKEAHIRDLEG-KVKAYET---MGEAIKALQAENYQLREYIINLQSRLLDTQG
+ 120 130 140 150 160
+
+ 160 170 180 190 200 210
+sp|Q1X NTP-MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQ
+ ..: .::. ..: . . .: : :. . . .. : ..:. .
+sp|A1C EVPELPGNIDLSQPRGDIPVPAPPTSGTSTSAVPVPPPTAPQQPQPAQNQASAPNDDMNS
+ 170 180 190 200 210 220
+
+ 220 230 240 250 260 270
+sp|Q1X HPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFE
+ ..::::
+sp|A1C LNRIAVAGLGMRKPPTEEANYLGNSFQQQARRVRPDDGQPDASELTLPKQEPTHGLPLIS
+ 230 240 250 260 270 280
+
+>>sp|Q504L8|MAFB_XENTR Transcription factor MafB OS=Xeno (316 aa)
+ initn: 139 init1: 109 opt: 149 Z-score: 151.2 bits: 36.3 E(516081): 0.67
+Smith-Waterman score: 149; 26.6% identity (62.6% similar) in 139 aa overlap (29-163:176-312)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS
+ ::. .: .: ...... . .... .. : :
+sp|Q50 QYQGLPHEEMGLPHQHPHHHHHHHHHQPSPSPSGSSSSSQQLQNSHQQHQNSSAVEDRFS
+ 150 160 170 180 190 200
+
+ 60 70 80 90 100 110
+sp|Q1X WGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ : . . .: . :. :.:. .:.: :.:.::. ::. : .. . ..:::::
+sp|Q50 DDQLVSMSVRELNRHLRGFTKDDVIRLKQKR--RTLKNRGYAQSCRFKRVQQKHHLENEK
+ 210 220 230 240 250 260
+
+ 120 130 140 150 160 170
+sp|Q1X IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV-RGSRANTPMPGSPATASPTLTPTL
+ :. :: . : ..:.. : . . . .:: . : . ... :.::
+sp|Q50 TQLIQQVEQLKLEVSRLARERDAYKIKCEKLANTTFREAGSTSDNPSSPEFFM
+ 270 280 290 300 310
+
+ 180 190 200 210 220 230
+sp|Q1X FKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFD
+
+>>sp|O57342|MAFA_COTJA Transcription factor MafA OS=Cotu (286 aa)
+ initn: 125 init1: 125 opt: 148 Z-score: 150.9 bits: 36.1 E(516081): 0.7
+Smith-Waterman score: 148; 34.1% identity (67.1% similar) in 85 aa overlap (83-167:201-281)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .:.: :.:.::. ::. : .. . . ::
+sp|O57 RFSDDQLVSMSVRELNRQLRGFSKEEVIRLKQKR--RTLKNRGYAQSCRYKRVQQRHILE
+ 180 190 200 210 220
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ ::: :...: . : :..:.. : . ... .::: :: .: :..: :..
+sp|O57 NEKCQLQSQVEQLKQEVSRLAKERDLYKEKYEKLAA--RGFPRETSPPAAPKTTAADFFM
+ 230 240 250 260 270 280
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+>>sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcriptio (348 aa)
+ initn: 123 init1: 91 opt: 149 Z-score: 150.6 bits: 36.3 E(516081): 0.72
+Smith-Waterman score: 149; 27.7% identity (61.0% similar) in 141 aa overlap (19-154:210-342)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPE
+ :... . .:: :.::.: . . . .
+sp|Q3Z LCSEVVIPEGDSKPDSTTTGFPQCIKEEDAPSDNDSGICMSP-DSSLGSPQDSPSTSRG-
+ 180 190 200 210 220 230
+
+ 50 60 70 80 90 100
+sp|Q1X EKKPAKKRKSWG--QELPVPKTNLPPRKR---AKTEDEKEQRRIERVLRNRAAAQTSRER
+ .: :. : : . :: :: .. ::.. :: ....... .:..:: :..
+sp|Q3Z --SPNKSLLSPGALSGSSRPKPYDPPGEKMVAAKVKGEKLDKKLKKMEQNKTAATRYRQK
+ 240 250 260 270 280 290
+
+ 110 120 130 140 150 160
+sp|Q1X KRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSP
+ :: :.: : .: ..:..:. : .. ... : . :..:. ::: .:
+sp|Q3Z KRAEQEALTGECKELEKKNEALKEKADSLAKEIQYLKDQIE----EVRKAREKKRVL
+ 300 310 320 330 340
+
+ 170 180 190 200 210 220
+sp|Q1X ATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL
+
+>>sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-bind (367 aa)
+ initn: 143 init1: 143 opt: 149 Z-score: 150.3 bits: 36.3 E(516081): 0.75
+Smith-Waterman score: 149; 33.3% identity (63.2% similar) in 87 aa overlap (60-146:170-252)
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIER
+ ::: . ..:: : .:. ..:.:
+sp|Q5U PRVSTIAPPPPAALLSCQRLFLTDEEKHLLGQEGVTLPSHLPLTK----AEERILKKIRR
+ 140 150 160 170 180 190
+
+ 90 100 110 120 130 140
+sp|Q1X VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE
+ .::. .:: ::.::. .. ::.. .::: : ......: .: : :. ::
+sp|Q5U KIRNKQSAQDSRRRKKEYIDGLESRVAACSEQNQKLQRKVQELERQNISLVAQVHQLQKF
+ 200 210 220 230 240 250
+
+ 150 160 170 180 190 200
+sp|Q1X VRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAES
+
+sp|Q5U TAQTSSRAAQTSTCVLILLFSLALIILPSFSPFQSQPEARSEGYQLHGVISRNILTHEDM
+ 260 270 280 290 300 310
+
+>>sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus norve (380 aa)
+ initn: 93 init1: 61 opt: 150 Z-score: 151.1 bits: 36.5 E(516081): 0.68
+Smith-Waterman score: 150; 27.6% identity (50.4% similar) in 250 aa overlap (8-237:54-297)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPA-SEVPVLT--VSPADTS
+ ..::.. .:.. : : : : :.: .
+sp|P12 GDSLSYYHSPADSFSSMGSPVNTQDFCADLSVSSANFIPTVTAISTSPDLQWLVQP---T
+ 30 40 50 60 70 80
+
+ 40 50 60 70 80
+sp|Q1X LNSADVKTQEVKPEEKK-PAKKRKSWGQELPVPKTNLPPR-----KRAKTE----DEKEQ
+ : :. . .: :. :. . .... : :: : .:.:.: .:.:.
+sp|P12 LVSSVAPSQTRAPHPYGLPTPSTGAYARA-GVVKTMSGGRAQSIGRRGKVEQLSPEEEEK
+ 90 100 110 120 130
+
+ 90 100 110 120 130 140
+sp|Q1X RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA
+ :::.: ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|P12 RRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILA
+ 140 150 160 170 180 190
+
+ 150 160 170 180 190
+sp|Q1X QLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYS
+ . . .: ...: :: : : .: ::: : : ::: .
+sp|P12 AHRPACKIPN-DLGFPEEMSVTSLDLTGGLPEATTPESEEAFTLPLLNDPEPKPSLEPVK
+ 200 210 220 230 240 250
+
+ 200 210 220 230 240 250
+sp|Q1X PTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFN
+ . :: : :: : . . ..: :: ::
+sp|P12 NISNMELKAEPFDDFLFPASSRPSGSETARSVPDVDLSGSFYAADWEPLHSSSLGMGPMV
+ 260 270 280 290 300 310
+
+ 260 270 280 290 300 310
+sp|Q1X RLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDE
+
+sp|P12 TELEPLCTPVVTCTPSCTTYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTL
+ 320 330 340 350 360 370
+
+>>sp|Q16520|BATF_HUMAN Basic leucine zipper transcriptio (125 aa)
+ initn: 127 init1: 127 opt: 143 Z-score: 151.0 bits: 34.9 E(516081): 0.69
+Smith-Waterman score: 143; 28.6% identity (56.2% similar) in 112 aa overlap (71-172:17-125)
+
+ 50 60 70 80 90 100
+sp|Q1X KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS
+ :: :. ...: ::..: .:: ::: :
+sp|Q16 MPHSSDSSDSSFSRSPPPGKQDSSDDV---RRVQRREKNRIAAQKS
+ 10 20 30 40
+
+ 110 120 130 140 150 160
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP
+ :.:. . . :. :. ..:.:: : ....:. : . ... : . :.:: :
+sp|Q16 RQRQTQKADTLHLESEDLEKQNAALRKEIKQLTEELKYFTSVLNSHEPLCSVLAASTPSP
+ 50 60 70 80 90 100
+
+ 170 180 190 200 210
+sp|Q1X G----------SPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+ .: ..:: . :
+sp|Q16 PEVVYSAHAFHQPHVSSPRFQP
+ 110 120
+
+>>sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mus mu (267 aa)
+ initn: 149 init1: 103 opt: 149 Z-score: 152.2 bits: 36.2 E(516081): 0.59
+Smith-Waterman score: 149; 27.0% identity (57.7% similar) in 163 aa overlap (51-190:23-183)
+
+ 30 40 50 60 70
+sp|Q1X SEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK------TNLPP-R
+ .::. .. .: :. .. : :
+sp|O35 MVVVAAAPSAATAAPKVLLLSGQPASGGRALPLMVPGPRAAGSEASGTPQAR
+ 10 20 30 40 50
+
+ 80 90 100 110 120
+sp|Q1X KRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQN-------QFL
+ :: . :. :.. ..: :.::.::::.:.::. .: .::.. ...:..: :.:
+sp|O35 KRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENHKLQLENQLL
+ 60 70 80 90 100 110
+
+ 130 140 150 160 170
+sp|Q1X LQRLSQMEAENNRLSQQLAQLA--------AEVRGSRANTPMPGSPATASPTLTPTLFKQ
+ .. . .::..: .:.. . .:..:: . . :: .:. : : .:
+sp|O35 REKTHGLVVENQELRTRLGMDTLDPDEVPEVEAKGSGVRL-VAGSAESAALRLCAPL-QQ
+ 120 130 140 150 160 170
+
+ 180 190 200 210 220 230
+sp|Q1X ERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGS
+ . .: . ::
+sp|O35 VQAQLSPPQNIFPWTLTLLPLQILSLISFWAFWTSWTLSCFSNVLPQSLLVWRNSQRSTQ
+ 180 190 200 210 220 230
+
+>>sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo sapie (380 aa)
+ initn: 86 init1: 54 opt: 156 Z-score: 156.7 bits: 37.6 E(516081): 0.33
+Smith-Waterman score: 156; 28.2% identity (51.6% similar) in 248 aa overlap (9-237:55-297)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPA-SEVPVLT--VSPADTSL
+ .::.. .:.. : : : : :.:: .:
+sp|P01 DSLSYYHSPADSFSSMGSPVNAQDFCTDLAVSSANFIPTVTAISTSPDLQWLVQPALVS-
+ 30 40 50 60 70 80
+
+ 40 50 60 70 80
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR-----KRAKTE----DEKEQRR
+ . : .:. .: :: . .... : :: : .:.:.: .:.:.::
+sp|P01 SVAPSQTRAPHPF-GVPAPSAGAYSRA-GVVKTMTGGRAQSIGRRGKVEQLSPEEEEKRR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X IERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL
+ :.: ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|P01 IRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAH
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X AAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPT
+ . . .: ..:: :: : . : .: ::: : : ::. .
+sp|P01 RPACKIPD-DLGFPEEMSVASLDLTGGLPEVATPESEEAFTLPLLNDPEPKPSVEPVKSI
+ 210 220 230 240 250
+
+ 210 220 230 240 250
+sp|Q1X LKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNRL
+ . .: : :: : . . ..: .:: ::
+sp|P01 SSMELKTEPFDDFLFPASSRPSGSETARSVPDMDLSGSFYAADWEPLHSGSLGMGPMATE
+ 260 270 280 290 300 310
+
+ 260 270 280 290 300 310
+sp|Q1X FHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETT
+
+sp|P01 LEPLCTPVVTCTPSCTAYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTLLA
+ 320 330 340 350 360 370
+
+>>sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive element-bi (357 aa)
+ initn: 113 init1: 113 opt: 147 Z-score: 148.6 bits: 36.0 E(516081): 0.93
+Smith-Waterman score: 147; 27.6% identity (59.3% similar) in 123 aa overlap (52-168:194-315)
+
+ 30 40 50 60 70 80
+sp|Q1X EVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDE
+ :: .. . : . :. . :.:. ::
+sp|Q8K HSHSHLHAHPAHHQTSPHPPLHTGNQAQVSPATQQMQPTQTIQPPQPTGGRRRRVVDEDP
+ 170 180 190 200 210 220
+
+ 90 100 110 120 130 140
+sp|Q1X KEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQ
+ :.:: . . :::::: :..... . .::.. .. : :. : ...:... : .:.:
+sp|Q8K DERRR-KFLERNRAAATRCRQKRKVWVMSLEKKAEELTQTNMQLQNEVSMLKNEVAQLKQ
+ 230 240 250 260 270 280
+
+ 150 160 170 180 190
+sp|Q1X QL-----AQLAAEVRGSRAN-TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLS
+ : ..: . :.. .: . ::. :
+sp|Q8K LLLTHKDCPITAMQKESQGYLSPESSPPASPVPACSQQQVIQHNTITTSSSVSEVVGSST
+ 290 300 310 320 330 340
+
+ 200 210 220 230 240 250
+sp|Q1X DYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDD
+
+sp|Q8K LSQLTTHRTDLNPIL
+ 350
+
+>>sp|A4R2R1|NST1_MAGGR Stress response protein NST1 OS=M (1319 aa)
+ initn: 158 init1: 64 opt: 171 Z-score: 163.5 bits: 40.6 E(516081): 0.14
+Smith-Waterman score: 171; 22.7% identity (56.7% similar) in 194 aa overlap (43-227:675-868)
+
+ 20 30 40 50 60 70
+sp|Q1X DSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP
+ :. : ::.: :. . ..: . .
+sp|A4R AQAEEKARKDAEKAAEEAERLAEEQRRQEEQRQKNEERKKKKEAQRKAEEEERQRKEAER
+ 650 660 670 680 690 700
+
+ 80 90 100 110 120
+sp|Q1X RKRAKTEDEK--EQRRIERVLRNRA--AAQTSRERKRLEMEKLENE-KIQMEQQNQFLLQ
+ .::. . :. :: : : ... : . ...:.. : : : . . :. .. :.
+sp|A4R LRRAQEQKERQAEQDRKAREAKEKEKKAKEEAKQREKAARELKEREARERKEKADKERLE
+ 710 720 730 740 750 760
+
+ 130 140 150 160 170 180
+sp|Q1X RLSQMEAENN-RLSQQLAQLAAEVRGSRANTPMPGSPA---TASPTLTPTLFKQERDELP
+ . ....::.. : .:. :. :.. . ::.:.: .:: . .:. .:.: .... .
+sp|A4R KEAKIKAEKEAREAQRKAERASQKATTLANVPVPTGPARRQSQAPNPAPALPQSQQASVA
+ 770 780 790 800 810 820
+
+ 190 200 210 220 230 240
+sp|Q1X LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHS
+ ..: .:.: :: ... .. :.. . .: :
+sp|A4R SPQLPTAVPALPKLPTPQKPRRTSQQEPFTSGFAAQQVHGQGAGQYPAPPKAATPVHTSP
+ 830 840 850 860 870 880
+
+ 250 260 270 280 290 300
+sp|Q1X TDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPV
+
+sp|A4R GPGGLLSKGSSSQGQSLHSQATSPLGTSLPTSTSLPTPFGMPHPPPNQHYPPGIGPLNAP
+ 890 900 910 920 930 940
+
+>>sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-bi (370 aa)
+ initn: 205 init1: 145 opt: 160 Z-score: 160.6 bits: 38.3 E(516081): 0.2
+Smith-Waterman score: 160; 29.7% identity (56.5% similar) in 138 aa overlap (18-146:119-256)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVP-VLTVS--PADTSLNSAD-VKTQ
+ ::: :: . ::: :.:. . :.:.
+sp|Q9D EVVYDSGTLQGTQREAGPTFGLISIQIDQWTPALMVPDACTVSGLPSDSHRHILPRVSTR
+ 90 100 110 120 130 140
+
+ 50 60 70 80 90
+sp|Q1X EVKPEEKKPAKKRKSW-----GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQ
+ : :. ... . : : .:: . .:. ..:.: .::. .::
+sp|Q9D APAPPAAMPSCQHHLFLTDEEKQLLAQEGITLPSHLPLTKAEERILKKIRRKIRNKQSAQ
+ 150 160 170 180 190 200
+
+ 100 110 120 130 140 150
+sp|Q1X TSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP
+ ::.::. .. ::.. .::: : ......: .: : .:. ::
+sp|Q9D DSRRRKKEYLDGLESRVAACSEQNQKLQRKVQELERQNIFLMEQVRQLQKLTAQTSSRAA
+ 210 220 230 240 250 260
+
+ 160 170 180 190 200 210
+sp|Q1X MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAV
+
+sp|Q9D QTSTCVLILLFSLALIILPSFSPFQGQSEARPEDYQLHGVISRNILTHENVTENLESPVL
+ 270 280 290 300 310 320
+
+>>sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis catu (381 aa)
+ initn: 91 init1: 59 opt: 150 Z-score: 151.1 bits: 36.5 E(516081): 0.68
+Smith-Waterman score: 150; 26.9% identity (50.6% similar) in 249 aa overlap (9-237:55-298)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPA-SEVPVLT--VSPADTSL
+ .::.. .:.. : : : : :.: .:
+sp|Q8H DNLSYYHSPADSFSSMGSPVNAQDFCTDLAVSSANFIPTVTAISTSPDLQWLVQP---TL
+ 30 40 50 60 70 80
+
+ 40 50 60 70 80
+sp|Q1X NSADVKTQEVKPEEKK-PAKKRKSWGQELPVPKTNLPPR-----KRAKTE----DEKEQR
+ :. . .: :. :: . .... : .. : .:.:.: .:.:.:
+sp|Q8H VSSVAPSQTRAPHPYGVPAPSAGAYSRAGVVKTVTAGGRAQSIGRRGKVEQLSPEEEEKR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQ
+ ::.: ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|Q8H RIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAA
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190
+sp|Q1X LAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSP
+ . . .: ..:: :. : : .: ::: : : ::. .
+sp|Q8H HRPACKIPD-DLGFPEEMSVASLDLSGGLPEAATPESEEAFTLPLLNDPEPKPSVEPVKS
+ 210 220 230 240 250
+
+ 200 210 220 230 240 250
+sp|Q1X TLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNR
+ . :: : :: : . . ..: .:: ::
+sp|Q8H ISSMELKAEPFDDFLFPASSRPSGSETARSVPDMDLSGSFYAADWEPLHGGSLGMGPMAT
+ 260 270 280 290 300 310
+
+ 260 270 280 290 300 310
+sp|Q1X LFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDET
+
+sp|Q8H ELEPLCTPVVTCTPSCTTYTSSFVFTYPEADSFPSCGAAHRKGSSSNEPSSDSLSSPTLL
+ 320 330 340 350 360 370
+
+>>sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcripti (127 aa)
+ initn: 106 init1: 106 opt: 139 Z-score: 147.2 bits: 34.2 E(516081): 1.1
+Smith-Waterman score: 139; 28.6% identity (68.8% similar) in 77 aa overlap (69-145:21-97)
+
+ 40 50 60 70 80 90
+sp|Q1X DVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQ
+ : : . . : ..:...: .::.:::
+sp|Q9N MSQGLPAAGSVLQRSVAAPGNQPQPQPQQQSPEDDDRKVRRREKNRVAAQ
+ 10 20 30 40 50
+
+ 100 110 120 130 140 150
+sp|Q1X TSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP
+ ::... . .::..: ..::.: .: ...... : ..:.. : .
+sp|Q9N RSRKKQTQKADKLHEEYESLEQENTMLRREIGKLTEELKHLTEALKEHEKMCPLLLCPMN
+ 60 70 80 90 100 110
+
+ 160 170 180 190 200 210
+sp|Q1X MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAV
+
+sp|Q9N FVPVPPRPDPVAGCLPR
+ 120
+
+>>sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive element-bi (508 aa)
+ initn: 113 init1: 113 opt: 147 Z-score: 146.6 bits: 36.1 E(516081): 1.2
+Smith-Waterman score: 147; 27.6% identity (59.3% similar) in 123 aa overlap (52-168:345-466)
+
+ 30 40 50 60 70 80
+sp|Q1X EVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDE
+ :: .. . : . :. . :.:. ::
+sp|Q02 HSHSHLHAHPAHHQTSPHPPLHTGNQAQVSPATQQMQPTQTIQPPQPTGGRRRRVVDEDP
+ 320 330 340 350 360 370
+
+ 90 100 110 120 130 140
+sp|Q1X KEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQ
+ :.:: . . :::::: :..... . .::.. .. : :. : ...:... : .:.:
+sp|Q02 DERRR-KFLERNRAAATRCRQKRKVWVMSLEKKAEELTQTNMQLQNEVSMLKNEVAQLKQ
+ 380 390 400 410 420 430
+
+ 150 160 170 180 190
+sp|Q1X QL-----AQLAAEVRGSRAN-TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLS
+ : ..: . :.. .: . ::. :
+sp|Q02 LLLTHKDCPITAMQKESQGYLSPESSPPASPVPACSQQQVIQHNTITTSSSVSEVVGSST
+ 440 450 460 470 480 490
+
+ 200 210 220 230 240 250
+sp|Q1X DYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDD
+
+sp|Q02 LSQLTTHRTDLNPIL
+ 500
+
+>>sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Arabido (315 aa)
+ initn: 188 init1: 124 opt: 144 Z-score: 146.5 bits: 35.4 E(516081): 1.2
+Smith-Waterman score: 144; 30.7% identity (60.6% similar) in 127 aa overlap (31-149:176-296)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ ::.: .:. . : : . . :
+sp|P42 VTAGSSDENDENANQQEQGSIRKPSFGQMLADASSQSTTGEIQGSVPMKPVAPGTNLNIG
+ 150 160 170 180 190 200
+
+ 70 80 90 100 110 120
+sp|Q1X QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+ ..: ....: ..::.: .: .: :: .:. :: ::. : :.:... .. .
+sp|P42 MDLWSSQAGVP------VKDERELKRQKRKQSNRESARRSRLRKQAECEQLQQRVESLSN
+ 210 220 230 240 250
+
+ 130 140 150 160 170
+sp|Q1X QNQFL---LQRLS----QMEAENNRLSQQLAQ-LAAEVRGSRANTPMPGSPATASPTLTP
+ .:: : ::::: ....::: ....: . :.::
+sp|P42 ENQSLRDELQRLSSECDKLKSENNSIQDELQRVLGAEAVANLEQNAAGSKDGEGTN
+ 260 270 280 290 300 310
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+>>sp|A2R346|KAPC_ASPNC Putative transcription factor kap (283 aa)
+ initn: 100 init1: 70 opt: 151 Z-score: 153.7 bits: 36.6 E(516081): 0.48
+Smith-Waterman score: 151; 22.5% identity (52.1% similar) in 213 aa overlap (16-223:44-236)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL---TVSPAD-TSLNSADVK
+ : :... : . :.:: : .... :
+sp|A2R QTSAQDHADQVLHDQLLAAHQHLSHPQQARPQGPTAQPPHMQPNTTSPRDQNNIDPAISG
+ 20 30 40 50 60 70
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ . .. . : . . . ::: : :: .. .:. .:::: .. :
+sp|A2R AAMLSGPPQTPPQPEPT-GQESP------------KTYGKRPLSTSKRAAQNRAAQRAFR
+ 80 90 100 110 120
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-MP
+ .::. ..:::.. .... :. ..:..::: .: . . .: ... :....: .:
+sp|A2R QRKESYIRKLEEQVKEFDNTNE----TMKQLQAENYQLREYIINLQSRLLDSQGEVPELP
+ 130 140 150 160 170
+
+ 170 180 190 200 210 220
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSV
+ :. .: .. : : : :. . . . : . :. . ..:
+sp|A2R GNIDLNQPRNDISV---PPPGAPAATGPAPGPGGAPQQMQVPNPGAATNEDMNSLNRIAV
+ 180 190 200 210 220 230
+
+ 230 240 250 260 270 280
+sp|Q1X AGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFD
+ :::
+sp|A2R AGLGMRKHPNEEANFLGNNFQARRPRNDDGQPDGSEATKTEPGHGLPVVS
+ 240 250 260 270 280
+
+>>sp|O42290|MAFA_CHICK Transcription factor MafA OS=Gall (286 aa)
+ initn: 125 init1: 125 opt: 143 Z-score: 146.2 bits: 35.2 E(516081): 1.3
+Smith-Waterman score: 143; 33.3% identity (67.9% similar) in 84 aa overlap (85-167:201-281)
+
+ 60 70 80 90 100 110
+sp|Q1X KRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENE
+ .. .:.:.::. ::. : .. . . ::::
+sp|O42 RFSDDQLVSMSVRELNRQLRGFSKEEVIRLKQNRRTLKNRGYAQSCRYKRVQQRHILENE
+ 180 190 200 210 220 230
+
+ 120 130 140 150 160 170
+sp|Q1X KIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG-SRANTPMPGSPATASPTLTPT
+ : :...: . : :..:.. : . ... .::: :: : .: :..: :..
+sp|O42 KCQLQSQVEQLKQEVSRLAKERDLYKEKYEKLAA--RGFPREPSP-PAAPKTTAADFFM
+ 240 250 260 270 280
+
+ 180 190 200 210 220 230
+sp|Q1X LFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLF
+
+>>sp|O43889|CREB3_HUMAN Cyclic AMP-responsive element-bi (395 aa)
+ initn: 137 init1: 137 opt: 145 Z-score: 146.2 bits: 35.7 E(516081): 1.3
+Smith-Waterman score: 145; 30.2% identity (62.8% similar) in 129 aa overlap (63-185:159-282)
+
+ 40 50 60 70 80 90
+sp|Q1X TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ : .:.: :: .::: :. .:..: .:
+sp|O43 TPQHMEELAEQEIARLVLTDEEKSLLEKEGLILPET-LP---LTKTE-EQILKRVRRKIR
+ 130 140 150 160 170 180
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV--
+ :. .:: ::..:.. . ::.. ... ::. : .... .: .: : .:: .: : :
+sp|O43 NKRSAQESRRKKKVYVGGLESRVLKYTAQNMELQNKVQLLEEQNLSLLDQLRKLQAMVIE
+ 190 200 210 220 230 240
+
+ 160 170 180 190 200
+sp|Q1X ---RGSRANTPMPGSPATASPTLTPTLFKQE-RDELPLERIPFPTPSLSDYSPTLKPSTL
+ . : ..: . .. :.:...... : :: :
+sp|O43 ISNKTSSSSTCILVLLVSFCLLLVPAMYSSDTRGSLPAEHGVLSRQLRALPSEDPYQLEL
+ 250 260 270 280 290 300
+
+ 210 220 230 240 250 260
+sp|Q1X AESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSV
+
+sp|O43 PALQSEVPKDSTHQWLDGSDCVLQAPGNTSCLLHYMPQAPSAEPPLEWPFPDLFSEPLCR
+ 310 320 330 340 350 360
+
+>>sp|O60841|IF2P_HUMAN Eukaryotic translation initiation (1220 aa)
+ initn: 64 init1: 64 opt: 151 Z-score: 145.2 bits: 37.1 E(516081): 1.4
+Smith-Waterman score: 151; 24.4% identity (58.3% similar) in 180 aa overlap (7-183:282-455)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLN
+ :. .::. . :::: . : . :. . :
+sp|O60 KLKEKEELETGKKDQSKQKESQRKFEEETVKSKVTVDT-GVIPASEEKAETPTAAEDD-N
+ 260 270 280 290 300
+
+ 40 50 60 70 80 90
+sp|Q1X SADVKTQEVKPE--EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE-RVLRN
+ .: : .. : . ::. .:.:. : . :. . : :.:...:. : :. :
+sp|O60 EGDKKKKDKKKKKGEKEEKEKEKKKGPSKATVKAMQEALAKLKEEEERQKREEEERIKRL
+ 310 320 330 340 350 360
+
+ 100 110 120 130 140 150
+sp|Q1X RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS
+ . .:..:::.:: : .: : :.. . :.. ... ....: .. :. . .. .
+sp|O60 EELEAKRKEEERLEQEKRERKK-QKEKERKERLKKEGKLLTKSQREARARAEATLKLLQA
+ 370 380 390 400 410 420
+
+ 160 170 180 190 200 210
+sp|Q1X RANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVA
+ .. . .:.. . : : ..: ..:
+sp|O60 QG-VEVPSKDSL--PKKRPIYEDKKRKKIPQQLESKEVSESMELCAAVEVMEQGVPEKEE
+ 430 440 450 460 470 480
+
+>>sp|Q5KGK5|EIF3A_CRYNE Eukaryotic translation initiatio (952 aa)
+ initn: 46 init1: 46 opt: 152 Z-score: 147.6 bits: 37.2 E(516081): 1.1
+Smith-Waterman score: 152; 30.7% identity (54.5% similar) in 202 aa overlap (48-230:735-930)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKK--RKSWGQELPVPKTNLPPRKR
+ :: : ::. :.. .: . .. :::
+sp|Q5K QRAARELKQRLGRMLEDYEAVKERIESQMQEELKAAKEEARRKIEEEKAQLREKVIKRKR
+ 710 720 730 740 750 760
+
+ 80 90 100 110 120
+sp|Q1X AKTEDE-KEQRRIERVLRNRA--AAQTSRERKR----LEMEKL--ENEKIQMEQQNQFLL
+ . : . :: :. :. :.. ::: ..:. : :: : :... . : : : :
+sp|Q5K EEKERKLKEAREAEERKRKEEEEAAQKAEEEARAAAALEAEAAAAEQRRAEREAQRQSDL
+ 770 780 790 800 810 820
+
+ 130 140 150 160 170
+sp|Q1X QRL-SQMEAENNRLSQQLAQLAAEVRGSRANTPMPG----SPATASPTLT---PTLFKQE
+ .:. .:.: :.. : .. :. :: . :. : : :. .: ::::. . :. . ..
+sp|Q5K ERIRAQQEREEEALRRRQAEKAAATSGGSAYRP-PARAGTTPPTASPAPSSGGPSWLARR
+ 830 840 850 860 870 880
+
+ 180 190 200 210 220 230
+sp|Q1X RDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSD
+ . :. : :: ::. : .: :.. :.:: :.. ::
+sp|Q5K KAMEAQSAGGAPVAS----SPKPVPSNSAAASAPASNGPESIAG-EAEKPALTGSVWRRG
+ 890 900 910 920 930
+
+ 240 250 260 270 280 290
+sp|Q1X LKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNF
+
+sp|Q5K MGARRGMPSTRGGA
+ 940 950
+
+>>sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcripti (118 aa)
+ initn: 115 init1: 115 opt: 135 Z-score: 143.8 bits: 33.5 E(516081): 1.7
+Smith-Waterman score: 135; 33.3% identity (77.8% similar) in 63 aa overlap (83-145:28-90)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ ..:...: .::.::: ::... . .::.
+sp|Q9D MSQGPPAVSVLQRSVDAPGNQPQSPKDDDRKVRRREKNRVAAQRSRKKQTQKADKLH
+ 10 20 30 40 50
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ .:. ..::.:. : ...:... : .::. : .
+sp|Q9D EEHESLEQENSVLRREISKLKEELRHLSEVLKEHEKMCPLLLCPMNFVQLRSDPVASCLP
+ 60 70 80 90 100 110
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+sp|Q9D R
+
+
+>>sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive element-bi (428 aa)
+ initn: 130 init1: 130 opt: 144 Z-score: 144.8 bits: 35.5 E(516081): 1.5
+Smith-Waterman score: 144; 25.8% identity (55.1% similar) in 178 aa overlap (25-199:161-322)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAK
+ .:. .: .. : . . . :..:
+sp|Q1L LPDQSGGTQCASETPQAQQTTGFPLTVKDLLLSGTPEPAAKVSQQSYQELILTEDEKRLL
+ 140 150 160 170 180 190
+
+ 60 70 80 90 100 110
+sp|Q1X KRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENE
+ .. :. :: ...: : .:. ..:.: .::. .:: ::..:. .. ::..
+sp|Q1L AKE--GMTLP---NQFPLTKY----EERILKKIRRKIRNKQSAQESRKKKKEYIDGLESR
+ 200 210 220 230 240
+
+ 120 130 140 150 160 170
+sp|Q1X KIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTL
+ .:. : ... :.: : : .:: .: : : .. .: :. .. . :. ::
+sp|Q1L MAACSAHNHELQRKVFQLEKCNISLMEQLRRLQALVMNG-SNKPVQAGTCVLVLLLSFTL
+ 250 260 270 280 290 300
+
+ 180 190 200 210 220 230
+sp|Q1X FKQERDELPLERIPFPTPSLS---DYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALP
+ . :: . :: ..: :.::
+sp|Q1L IL-----LPNLK-PFTDTKVSQHGDFSPMRVQSRSLHNLQSSRVLRNLDHPYSMTENAKI
+ 310 320 330 340 350
+
+>>sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS=Xeno (313 aa)
+ initn: 113 init1: 113 opt: 141 Z-score: 143.8 bits: 34.9 E(516081): 1.7
+Smith-Waterman score: 141; 26.8% identity (60.6% similar) in 142 aa overlap (29-163:171-309)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS
+ ::. .: .: ... :. . .. .. : :
+sp|Q6D HQYQGVHHEEMGLPHHHPHHHQHQHHQTSPSPSGSSSSSQQLHHQQ-QHSSSSAVEDRFS
+ 150 160 170 180 190
+
+ 60 70 80 90 100 110
+sp|Q1X WGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ : . . .: . :. :.:. .:.: :.:.::. ::. : .. . ..::.::
+sp|Q6D DDQLVSMTVRELNRHLRGFTKDDVIRLKQKR--RTLKNRGYAQSCRYKRVQQKHNLEGEK
+ 200 210 220 230 240 250
+
+ 120 130 140 150 160 170
+sp|Q1X IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA----AEVRGSRANTPMPGSPATASPTLT
+ :. :: . : :..:.. : . . . .:: .. : . ... :.::
+sp|Q6D TQLVQQVEQLKQEVSRLARERDAYKIKCEKLANNNSSNFREAGSTSDNPSSPEFFM
+ 260 270 280 290 300 310
+
+ 180 190 200 210 220 230
+sp|Q1X PTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALP
+
+>>sp|Q7TSC1|BAT2_MOUSE Large proline-rich protein BAT2 O (2158 aa)
+ initn: 95 init1: 82 opt: 157 Z-score: 147.5 bits: 38.4 E(516081): 1.1
+Smith-Waterman score: 157; 27.2% identity (48.4% similar) in 217 aa overlap (18-222:378-571)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSL--NSADVKTQEV
+ .:.::.: : :. :. .:. .
+sp|Q7T RDSDEEGAEGHKDSQSAAAEEPETDGKKGTSPGSELP-----PPKTAWTENARPSETEPA
+ 350 360 370 380 390 400
+
+ 50 60 70 80 90
+sp|Q1X KPEEKKPAKKRK-----SWGQELPVPKTNLPPRKRAKTEDEKE---QRRIERVLRNRAAA
+ : : : . .:: : . :: : ::: : ::: . . :.
+sp|Q7T PPTPKPPPPPPHRGPVGNWGPPGDYPDRGGPPCKPPAPEDEDEAWRQRRKQSSSEISLAV
+ 410 420 430 440 450 460
+
+ 100 110 120 130 140 150
+sp|Q1X QTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ-MEAENNRLSQQLAQLAAEVRGSRAN
+ . .:.:.. : .....:. .. :.::.. . : ..::. :. ::
+sp|Q7T ERARRRREEEERRMQEERRAACAEK---LKRLDEKFGAPDKRLK---AEPAA--------
+ 470 480 490 500
+
+ 160 170 180 190 200 210
+sp|Q1X TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSD-VAQH
+ : : .:: .:.: :.. :. : : ::: :. : . : : ::
+sp|Q7T -P-PVTPA--APALPPVVPKEIPAAPALPPTPTPTPEKEPEEPAQAPPVQAAPSPGVAPV
+ 510 520 530 540 550 560
+
+ 220 230 240 250 260 270
+sp|Q1X PAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFED
+ :.. .:
+sp|Q7T PTLVSGGGCTANSNSSGSFEASPVEPQLPSKEGPEPPEEVPPPTTPPAPKMEPKGDGVGS
+ 570 580 590 600 610 620
+
+>>sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcripti (703 aa)
+ initn: 52 init1: 52 opt: 146 Z-score: 143.7 bits: 36.1 E(516081): 1.7
+Smith-Waterman score: 147; 24.8% identity (51.2% similar) in 254 aa overlap (17-241:260-503)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLT--VSPADTS---LNSADVK
+ :.: : . .: :.: .: : .. ..
+sp|Q99 DGSSGKALPTRKPPLQPKPVVLTTVPMPSRAVPPSTTVLLQSLVQPPPVSPVVLIQGAIR
+ 230 240 250 260 270 280
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ .: : . : .::: :.: .. ::. : : .: .:...:: .: ::
+sp|Q99 VQPEGPAPSLPRPERKSI-VPAPMPGNSCPPEV-----DAKLLKRQQRMIKNRESACQSR
+ 290 300 310 320 330 340
+
+ 110 120 130 140
+sp|Q1X ERKRLEMEKLEN-------EKIQMEQQNQFLLQRLSQMEAENNRL-----SQQLAQLAAE
+ ..:. .. :: .. :....: : .:: . :::..: ..... . .
+sp|Q99 RKKKEYLQGLEARLQAVLADNQQLRRENAALRRRLEALLAENSELKLGSGNRKVVCIMVF
+ 350 360 370 380 390 400
+
+ 150 160 170 180 190
+sp|Q1X VRGSRANT-PMPGSPATASPTLTPTLFK---QERDEL-------PLERI-PFPTPSLSDY
+ . : :. : ..: ..: . : : : .: :.. . :. : .
+sp|Q99 LLFIAFNFGPVSISEPPSAP-ISPRMNKGEPQPRRHLLGFSEQEPVQGVEPLQGSSQGPK
+ 410 420 430 440 450 460
+
+ 200 210 220 230 240 250
+sp|Q1X SPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFN
+ : .:. :... :. . : : . :: :.:: .:
+sp|Q99 EPQPSPTDQPSFSNLTAFPGGAKELLLRDLDQ--LF-LSSDCRHFNRTESLRLADELSGW
+ 470 480 490 500 510
+
+ 260 270 280 290 300 310
+sp|Q1X RLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDE
+
+sp|Q99 VQRHQRGRRKIPQRAQERQKSQPRKKSPPVKAVPIQPPGPPERDSVGQLQLYRHPDRSQP
+ 520 530 540 550 560 570
+
+>>sp|Q54Y73|BZPD_DICDI Probable basic-leucine zipper tra (834 aa)
+ initn: 124 init1: 124 opt: 147 Z-score: 143.7 bits: 36.3 E(516081): 1.8
+Smith-Waterman score: 147; 26.9% identity (58.3% similar) in 156 aa overlap (10-157:315-458)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSAD
+ :::. .: . . . .: .. ::. .. .
+sp|Q54 TSPSSPSTSNMFLTPMVTTTTTSETSSSSDSSVNIIPNNTNTITNIL-IKEEDTNNGNNN
+ 290 300 310 320 330 340
+
+ 40 50 60 70 80 90
+sp|Q1X VKTQEVKPEEK-----KPAKKR---KSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL
+ :... . . .: .. : :.: :: .. :: . . :::.. .. .:..
+sp|Q54 KKSKKRTIDSRVQNIVHPLTREELLKIAGKE-PVQVVD-PPTH--NQEDERNVKKQRRLI
+ 350 360 370 380 390
+
+ 100 110 120 130 140 150
+sp|Q1X RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR
+ .:: .:: :: ::.. .: ::. .. :.: :... : :. . ::::.
+sp|Q54 KNRESAQLSRMRKKIYIEDLEKTISDLTQDN-------SSLKEEVLYLQGLVKQLAAQNS
+ 400 410 420 430 440 450
+
+ 160 170 180 190 200 210
+sp|Q1X GSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSD
+ .: :.
+sp|Q54 NSNNNSVIDINNNNVNNSQQQQQQHQQQQQLNNSNNNNNNNNNNSTNKQQQSKNVKAAGV
+ 460 470 480 490 500 510
+
+>>sp|P18625|FOSL2_CHICK Fos-related antigen 2 OS=Gallus (323 aa)
+ initn: 94 init1: 63 opt: 141 Z-score: 143.6 bits: 34.9 E(516081): 1.8
+Smith-Waterman score: 141; 24.4% identity (54.8% similar) in 217 aa overlap (68-271:108-311)
+
+ 40 50 60 70 80 90
+sp|Q1X ADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK--TEDEKEQRRIERVLRNRA
+ :.. :.: . . .:.:.:::.: ::.
+sp|P18 SHPYSHPLPPLSSVAGHTALQRPGVIKTIGTTVGRRRRDEQLSPEEEEKRRIRRE-RNKL
+ 80 90 100 110 120 130
+
+ 100 110 120 130 140 150
+sp|Q1X AAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS--
+ :: :.:.: :::. : .:.... : ....... :...: .:. . . :
+sp|P18 AAAKCRNRRRELTEKLQAETEVLEEEKSVLQKEIAELQKEKEKLEFMLVAHSPVCKISPE
+ 140 150 160 170 180 190
+
+ 160 170 180 190 200
+sp|Q1X -RANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSL---SDYSPTLKPSTLAES
+ : . : . .. . . .. ::: :.:. .:. :: . ..:: ..: .
+sp|P18 ERRSPPTSSLQSVRTGASGAVVVKQE----PVEE-EIPSSSLVLDKAQRSVIKPISIAGG
+ 200 210 220 230 240 250
+
+ 210 220 230 240 250 260
+sp|Q1X --SDVAQHPAVSVAGLEGDGSALPLFDLGSD---LKHHSTDDVAAPLSDDDFNRLFHGDS
+ .. : . . : .. : . ::. . . .. : .::: .. : :
+sp|P18 YYGEEALNTPIVV-------TSTPAITPGSSNLVFTYPNVLDQESPLSPSESCSKAHRRS
+ 260 270 280 290 300
+
+ 270 280 290 300 310 320
+sp|Q1X SVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSS
+ : :.:
+sp|P18 SSSGDQSSDSLNSPTLLAL
+ 310 320
+
+>>sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodopus r (381 aa)
+ initn: 46 init1: 46 opt: 144 Z-score: 145.4 bits: 35.5 E(516081): 1.4
+Smith-Waterman score: 144; 23.5% identity (49.7% similar) in 306 aa overlap (2-291:57-353)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|Q56 LSYYHSPADSFSSMGSPVNAQDFCADLSVSSANFIPTVTAISTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . : : . . : : :. . . . . . . .:.:.:::.
+sp|Q56 PSQTRAPHPYGVPTPSTGAYSRAGMVKTVSGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|Q56 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: . ..:: :: : : .: ::: : : :: . . .
+sp|Q56 ACKIPD-DLGFPEDMSVASLDLTGGLPEAATPESEEAFSLPLLNEPEPKTSLESVKSISS
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250
+sp|Q1X PSTLAESSDVAQHPAVSV-AGLEGDGSALPLFDL-GS----DLKH-HSTDDVAAPLSDDD
+ :: : : : .: : . ..: .:: :: : . ::.. .:.. .
+sp|Q56 MELKAEPFDDFLFSASSRPSGSETTARSVPDMDLSGSFYAADWEPLHSSSLGMGPMATE-
+ 270 280 290 300 310 320
+
+ 260 270 280 290 300 310
+sp|Q1X FNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLP
+ .. : . :. ... ....: : ..::
+sp|Q56 LEPLCTPVVTCTPSCTTYTSSFVFTYPE---TDSFPSCAAAHRKGSSSNEPSSDSLSSPT
+ 330 340 350 360 370
+
+ 320 330 340
+sp|Q1X DETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q56 LLAL
+ 380
+
+>>sp|O35284|BATF_MOUSE Basic leucine zipper transcriptio (125 aa)
+ initn: 98 init1: 98 opt: 135 Z-score: 143.5 bits: 33.5 E(516081): 1.8
+Smith-Waterman score: 135; 28.9% identity (62.2% similar) in 90 aa overlap (71-160:17-103)
+
+ 50 60 70 80 90 100
+sp|Q1X KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS
+ :: :. ...: :...: .:: ::: :
+sp|O35 MPHSSDSSDSSFSRSPPPGKQDSSDDV---RKVQRREKNRIAAQKS
+ 10 20 30 40
+
+ 110 120 130 140 150 160
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP
+ :.:. . . :. :. ..:.:: : ....:. : . ... :.. ..:: :
+sp|O35 RQRQTQKADTLHLESEDLEKQNAALRKEIKQLTEELKYFTSVLSSHEPLCSVLASGTPSP
+ 50 60 70 80 90 100
+
+ 170 180 190 200 210 220
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSV
+
+sp|O35 PEVVYSAHAFHQPHISSPRFQP
+ 110 120
+
+>>sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Homo sa (295 aa)
+ initn: 130 init1: 130 opt: 140 Z-score: 143.2 bits: 34.7 E(516081): 1.9
+Smith-Waterman score: 140; 25.8% identity (54.3% similar) in 151 aa overlap (2-148:142-290)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPA---TPASEVPVLTV
+ .: :.. . . ::: ::. :
+sp|Q16 GLQPASSAAPSVMDLSSRASAPLHPGIPSPNC-MQSPIRPGQLLPANRNTPSPIDPDTIQ
+ 120 130 140 150 160 170
+
+ 30 40 50 60 70 80
+sp|Q1X SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQEL-PVPKTNLPPRKRAKTEDEKEQRRI
+ :. . ::. . . .: .::: .:: : : . :: .: :...
+sp|Q16 VPVGYEPDPADLALSSIPGQEMFDPRKRKFSEEELKPQPMIK-KARKVFIPDDLKDDKYW
+ 180 190 200 210 220
+
+ 90 100 110 120 130 140
+sp|Q1X ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA
+ : .: ::. ::. .::. ... . .:..:. : :...... : .. .. ::.
+sp|Q16 ARRRKNNMAAKRSRDARRLKENQIAIRASFLEKENSALRQEVADLRKELGKCKNILAKYE
+ 230 240 250 260 270 280
+
+ 150 160 170 180 190 200
+sp|Q1X AEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLA
+ :
+sp|Q16 ARHGPL
+ 290
+
+>>sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus mus (295 aa)
+ initn: 130 init1: 130 opt: 140 Z-score: 143.2 bits: 34.7 E(516081): 1.9
+Smith-Waterman score: 140; 25.8% identity (54.3% similar) in 151 aa overlap (2-148:142-290)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPA---TPASEVPVLTV
+ .: :.. . . ::: ::. :
+sp|Q8B GLQPASSTAPSVMDLSSRATAPLHPGIPSPNC-MQSPIRPGQLLPANRNTPSPIDPDTIQ
+ 120 130 140 150 160 170
+
+ 30 40 50 60 70 80
+sp|Q1X SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQEL-PVPKTNLPPRKRAKTEDEKEQRRI
+ :. . ::. . . .: .::: .:: : : . :: .: :...
+sp|Q8B VPVGYEPDPADLALSSIPGQEMFDPRKRKFSEEELKPQPMIK-KARKVFIPDDLKDDKYW
+ 180 190 200 210 220
+
+ 90 100 110 120 130 140
+sp|Q1X ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA
+ : .: ::. ::. .::. ... . .:..:. : :...... : .. .. ::.
+sp|Q8B ARRRKNNMAAKRSRDARRLKENQIAIRASFLEKENSALRQEVADLRKELGKCKNILAKYE
+ 230 240 250 260 270 280
+
+ 150 160 170 180 190 200
+sp|Q1X AEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLA
+ :
+sp|Q8B ARHGPL
+ 290
+
+>>sp|Q63ZM7|STABP_XENLA STAM-binding protein-like OS=Xen (416 aa)
+ initn: 60 init1: 60 opt: 153 Z-score: 153.3 bits: 37.1 E(516081): 0.51
+Smith-Waterman score: 153; 29.8% identity (53.0% similar) in 181 aa overlap (39-210:79-238)
+
+ 10 20 30 40 50 60
+sp|Q1X MSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKT
+ : :: .: ::.:. :: : :. ::.
+sp|Q63 VYSGEGSIENAFILYNKYITLFIEKLPKHRDYKTANV-PEKKETLKKLK----EIAFPKA
+ 50 60 70 80 90 100
+
+ 70 80 90 100 110 120
+sp|Q1X N-----LPPRKRAKTEDEKEQRRIERVLRNRAAA---QTSRERKRLEMEKLENEKIQMEQ
+ . : : . . :. .:..: :. : : : : . :..:. . : ..: :.::
+sp|Q63 EELKKELHKRYKKEYEEYSEKQRKEEEERARRLALQQQLDAEKQRVALLKQQQE--QQEQ
+ 110 120 130 140 150 160
+
+ 130 140 150 160 170
+sp|Q1X QNQFL-LQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQER
+ . : ..: ...::: :. .:... :.. ..:. :. : .:: :
+sp|Q63 VQAFEEMMRRKELEAERLRILHQFSKDEPEAEP--LGSPL--IPGMNEPPVTPLL-----
+ 170 180 190 200 210
+
+ 180 190 200 210 220 230
+sp|Q1X DELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDL
+ : : : : : ::::. . .:
+sp|Q63 ---PSYGTVQPHPPAVDRS--LKPSSYGSNSSGVTSDGLRHVKIPRDVCCKFLQLSENNT
+ 220 230 240 250 260
+
+ 240 250 260 270 280 290
+sp|Q1X KHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFD
+
+sp|Q63 QRGVETCGILCGKLLQNEFTVTHVIVPKQSGGPDYCNTESEEELFLIQDQQGLITLGWIH
+ 270 280 290 300 310 320
+
+>>sp|P29681|IMPE2_DROME 20-hydroxyecdysone protein OS=Dr (466 aa)
+ initn: 103 init1: 74 opt: 142 Z-score: 142.4 bits: 35.2 E(516081): 2.1
+Smith-Waterman score: 142; 25.5% identity (57.1% similar) in 184 aa overlap (8-181:14-192)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVS----PADTSLNSADVKTQEVKPEEK
+ ... : .:: : ..:: : :. :: . .::..::::::
+sp|P29 MKPVALILVFLAISQARVLNLPKE-AIDIPVAIVEDKEPPVALSLVKEEVKAEEVKPEEV
+ 10 20 30 40 50
+
+ 60 70 80 90 100
+sp|Q1X KP-AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ :: :...:. . : : :. : :.. :.. :. . .:. . ...
+sp|P29 KPIAQEEKAKDLKEEVKPEIKPEIKEQPKPDIKDE--IKEDLKADIKEEL-KEKIEEQIN
+ 60 70 80 90 100 110
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATAS--
+ .: : : .: ... : . . .: ... . .. . :.:.. :.. . . :: .
+sp|P29 ELPNAK-PLELKEKSLEAEEKPQEIKEEVQQPEIKKEATEIKEEPAQNILKSLPAEETVV
+ 120 130 140 150 160 170
+
+ 170 180 190 200 210 220
+sp|Q1X -PT--LTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLE
+ :. :.:. .::..:
+sp|P29 VPAEELSPNPVEQEQSENQDAAHPQVRQATQATPTQQSTTQGNFVQQLIQNSPIGQFLNQ
+ 180 190 200 210 220 230
+
+>>sp|O35451|ATF6B_MOUSE Cyclic AMP-dependent transcripti (699 aa)
+ initn: 52 init1: 52 opt: 146 Z-score: 143.8 bits: 36.1 E(516081): 1.7
+Smith-Waterman score: 147; 23.6% identity (50.8% similar) in 254 aa overlap (16-241:259-500)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTS--LNSADVKTQ
+ :.. : . :. .:: . : .. ...:
+sp|O35 SSGKAPATRKPPLQPKPVVLTTVPVPPRAGPTSAAVLLQPLVQQPAVSPVVLIQGAIRVQ
+ 230 240 250 260 270 280
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRER
+ : : .::: :.: .. ::. : : .: .:...:: .: ::..
+sp|O35 PEGPAPAAPRPERKSI-VPAPMPGNSCPPE-----VDAKLLKRQQRMIKNRESACQSRRK
+ 290 300 310 320 330 340
+
+ 110 120 130 140 150
+sp|Q1X KRLEMEKLEN-------EKIQMEQQNQFLLQRLSQMEAENNRL-----SQQLAQLAAEVR
+ :. .. :: .. :....: : .:: . :::. : ..... . . .
+sp|O35 KKEYLQGLEARLQAVLADNQQLRRENAALRRRLEALLAENSGLKLGSGNRKVVCIMVFLL
+ 350 360 370 380 390 400
+
+ 160 170 180 190 200
+sp|Q1X GSRANT-PMPGSPATASPTLTPTLFKQE-RDELPLERIPFPTPSLSDYSPTLKPSTLAES
+ : :. : .: ..: . ..: : . : . : :. . ..: : .
+sp|O35 FIAFNFGPVSISEPPPAP-MSPRMSREEPRPQRHLLGFSEPGPAHG-----MEPLREAAQ
+ 410 420 430 440 450
+
+ 210 220 230 240 250
+sp|Q1X SDVAQHPAVS-------VAGLEGDGSALPLFDL-----GSDLKHHSTDDVAAPLSDDDFN
+ : :.:. . .... : .. : : :: .:: .:
+sp|O35 SPGEQQPSSAGRPSFRNLTAFPGGAKELLLRDLDQLFLSSDCRHFNRTESLRLADELSGW
+ 460 470 480 490 500 510
+
+ 260 270 280 290 300 310
+sp|Q1X RLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDE
+
+sp|O35 VQRHQRGRRKIPHRAQERQKSQLRKKSPPVKPVPTQPPGPPERDPVGQLQLYRHPGRSQP
+ 520 530 540 550 560 570
+
+>>sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS=Schi (171 aa)
+ initn: 159 init1: 112 opt: 154 Z-score: 159.5 bits: 36.9 E(516081): 0.23
+Smith-Waterman score: 154; 25.8% identity (55.8% similar) in 163 aa overlap (74-223:4-163)
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRER
+ :. ...:::..: .: ::: ::. :..
+sp|Q09 MTAKKKEVDDEKRRRILE---RNRIAASKFRQK
+ 10 20 30
+
+ 110 120 130 140 150
+sp|Q1X KRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQL-----AQLAAEVRG-----S
+ :. ...::. .:.. : :::.. : ::..:: : ....:. .
+sp|Q09 KKEWIKELEQTANAAFEQSKRLQLLLSQLQQEAFRLKSQLLAHQGCQCSVKIRSVLTDFQ
+ 40 50 60 70 80 90
+
+ 160 170 180 190 200 210
+sp|Q1X RANTPMPGSPATASPTLTP---TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+ :.. . .. . :. : ..... . : . : . : . ::. .:
+sp|Q09 TAHNALHSQHMAYRPVQPPPGDNMLESVVSVSPTQMHPSLQGLPPNQHPQMPPSSQQPNS
+ 100 110 120 130 140 150
+
+ 220 230 240 250 260 270
+sp|Q1X DVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDS
+ : .:. :.:::
+sp|Q09 DDVQQHMFSAAGLPRSLGGPI
+ 160 170
+
+>>sp|O13024|INCEA_XENLA Inner centromere protein A OS=Xe (873 aa)
+ initn: 111 init1: 111 opt: 145 Z-score: 141.5 bits: 36.0 E(516081): 2.3
+Smith-Waterman score: 145; 25.5% identity (60.6% similar) in 137 aa overlap (41-172:629-763)
+
+ 20 30 40 50 60 70
+sp|Q1X SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNL
+ . .: ..:: :. .. :: . :
+sp|O13 RRKQEEEARRLKVKQMEEEERRHQELLQKKREEEELERQKKIAEAKRLAEQERE--RQLL
+ 600 610 620 630 640 650
+
+ 80 90 100 110 120
+sp|Q1X PPRKRAKTEDEKEQRRIERVLR-----NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL
+ ..: ..: :::. . :..:. .::: . ..:.. : .: .... ..::.
+sp|O13 AEKERLRAEREKERIEKEKALQLQRELERAAQEKEQQRREAEERKKREQQERLEQERLRK
+ 660 670 680 690 700 710
+
+ 130 140 150 160 170 180
+sp|Q1X LQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLE
+ :. .... :..: ... : .:: . ... : .::: : .::
+sp|O13 EQEAKRLQEEEQRKAKEQAAVAASAPVMNVTVDMQNSPACESYEMTPKSCKVPSVKVNED
+ 720 730 740 750 760 770
+
+ 190 200 210 220 230 240
+sp|Q1X RIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTD
+
+sp|O13 NYGMDLNSDDSTDDESQPRKPIPAWASGNLLTQAIRQQYYKPIDVDRMYGTIDSPKLEEL
+ 780 790 800 810 820 830
+
+>>sp|A0JMT0|CA1AB_XENLA Chromatin assembly factor 1 subu (885 aa)
+ initn: 102 init1: 65 opt: 146 Z-score: 142.4 bits: 36.1 E(516081): 2.1
+Smith-Waterman score: 146; 22.8% identity (60.2% similar) in 206 aa overlap (8-210:234-432)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNS
+ : .: : .::.... .: :. . ..
+sp|A0J SSADDDSVSVSSSSSPVSLSSPDVQTGSKFTNGSSPSTSTTPTGKATSNKTS-AEKKKTK
+ 210 220 230 240 250 260
+
+ 40 50 60 70 80 90
+sp|Q1X ADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRI-ERVLRNRAA
+ .. .... ::.. :... ...: : . ..: : . ::..:. :.. .::
+sp|A0J DKAEKRQAEKEERECARREARAAKDLAKKKREGEREQREKDKKEKKEREDREKAEKNRLK
+ 270 280 290 300 310 320
+
+ 100 110 120 130 140 150
+sp|Q1X AQTSRER-KRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA
+ . ..:. . :: .. :..: . :.... .::.. :..:.. . :... .. .
+sp|A0J EEKKKEKLEALEAKQEEKRKKEEEKRQKEEEKRLKE---EEKRIKAEKAEITRFLQ--KP
+ 330 340 350 360 370
+
+ 160 170 180 190 200 210
+sp|Q1X NTPM-PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQ
+ .::. : . : . ..: .:. :: :: : . . . :. .: .:::
+sp|A0J KTPQAPKTFARSCGKFAPFEIKKGMALAPLCRIDFEQEASEELDIFLQEQT-SESSFLDE
+ 380 390 400 410 420 430
+
+ 220 230 240 250 260 270
+sp|Q1X HPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFE
+
+sp|A0J IKKRRPRKMGQTTVPTINSVEVDDVQVLGETDPVLGSNMVLEEHIKDIGVPERKKFGRMK
+ 440 450 460 470 480 490
+
+>>sp|Q5RDE1|IF2P_PONAB Eukaryotic translation initiation (1220 aa)
+ initn: 64 init1: 64 opt: 147 Z-score: 141.4 bits: 36.4 E(516081): 2.3
+Smith-Waterman score: 147; 23.9% identity (58.3% similar) in 180 aa overlap (7-183:282-455)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLN
+ :. ..:. . :::: . : . :. . :
+sp|Q5R KLKEKEESETGKKDQSKQKESQRKSEEETVKSKVTLDT-GVIPASEEKAETPTAAEDD-N
+ 260 270 280 290 300
+
+ 40 50 60 70 80 90
+sp|Q1X SADVKTQEVKPE--EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE-RVLRN
+ .: : .. : . ::. .:.:. : . :. . : :.:...:. : :. :
+sp|Q5R EGDKKKKDKKKKKGEKEEKEKEKKKGPSKATVKAMQEALAKLKEEEERQKREEEERIKRL
+ 310 320 330 340 350 360
+
+ 100 110 120 130 140 150
+sp|Q1X RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS
+ . .:..:::.:: : .: : :.. . :.. ... ....: .. :. . .. .
+sp|Q5R EELEAKRKEEERLEQEKRERKK-QKEKERKERLKKEGKLLTKSQREARARAEATLKLLQA
+ 370 380 390 400 410 420
+
+ 160 170 180 190 200 210
+sp|Q1X RANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVA
+ .. . .:.. . : : ..: ..:
+sp|Q5R QG-VEVPSKDSL--PKKRPIYEDKKRKKIPQQLESKEVSESMELCAAVEVMEQGVPEKEE
+ 430 440 450 460 470 480
+
+>>sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS=Xeno (289 aa)
+ initn: 96 init1: 96 opt: 138 Z-score: 141.4 bits: 34.4 E(516081): 2.3
+Smith-Waterman score: 138; 30.6% identity (68.2% similar) in 85 aa overlap (83-167:203-284)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .:.: :.:.::. ::. : .. . . ::
+sp|Q4U RFSDEQLVSMSVRELNRQLRGFSKEEVIRLKQKR--RTLKNRGYAQSCRYKRVQQRHILE
+ 180 190 200 210 220 230
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ .:: :...: . : :..:.. : . ... .::.. .: . :. :.:. :.
+sp|Q4U TEKCQLQSQVEQLKQEVSRLAKERDLYKDKYEKLASRSFTTRESPPQ-GNPGKANADFFM
+ 240 250 260 270 280
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+>>sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattus no (295 aa)
+ initn: 127 init1: 127 opt: 138 Z-score: 141.3 bits: 34.4 E(516081): 2.4
+Smith-Waterman score: 138; 29.4% identity (55.9% similar) in 136 aa overlap (16-148:163-290)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPAS-EVPV-LTVSPADTSLNSADVKTQ
+ : : . .::: .::: .:.:
+sp|Q64 PLHPGIPSPNCMQNPIRPGQLLPANRNTPSPIDPDTIQVPVGYEPDPADLALSSIP----
+ 140 150 160 170 180
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQEL-PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE
+ :: : .::: .:: : : . :: .: :... : .: ::. ::.
+sp|Q64 --GPEMFDP-RKRKFSEEELKPQPMIK-KARKVFIPDDLKDDKYWARRRKNNMAAKRSRD
+ 190 200 210 220 230 240
+
+ 110 120 130 140 150 160
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS
+ .::. ... . .:..:. : :...... : .. .. ::. :
+sp|Q64 ARRLKENQIAIRASFLEKENSALRQEVADLRKELGKCKNILAKYEARHGPL
+ 250 260 270 280 290
+
+ 170 180 190 200 210 220
+sp|Q1X PATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAG
+
+>>sp|Q54NF3|Y6434_DICDI Uncharacterized protein DDB_G028 (412 aa)
+ initn: 71 init1: 71 opt: 140 Z-score: 141.2 bits: 34.8 E(516081): 2.4
+Smith-Waterman score: 140; 18.5% identity (63.1% similar) in 157 aa overlap (22-170:171-321)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPV-LTVSPADTSLNSADVKTQEVKPEEK
+ ..:. .. ...: :: :. .:...
+sp|Q54 VECDFKMATNTPGSEQAQQQQQQQQQQQLGDIPIKQQITSSNNSGNS-----QQQQPQQQ
+ 150 160 170 180 190
+
+ 60 70 80 90 100 110
+sp|Q1X KPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEK
+ . ..... :. : . . .. . ....:..... :... : . ....:....
+sp|Q54 QQQQQQQQQQQQQPQQQQQQQQPQQQQHLQQQHQQQVQQ-LQQQQLQQQQLQQQQLQQQQ
+ 200 210 220 230 240 250
+
+ 120 130 140 150 160
+sp|Q1X LENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA----AEVRGSRANT---PMPGSP
+ :.....:. : .:. . .:.. . . ::: :. :. . ..:. : .::
+sp|Q54 LQQQQLQQPQLQQMQQPQQQQQQQQPQYTPQQLMQFQQMQQAQQQQQQAQQLQQQMGSSP
+ 260 270 280 290 300 310
+
+ 170 180 190 200 210 220
+sp|Q1X ATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL
+ . .:::.
+sp|Q54 THSSPTIKQEGLTGYTQIPQGGIINTNTNLNGTGGVSPNQPMPNSSPILPTNASSVVPPV
+ 320 330 340 350 360 370
+
+>>sp|P15336|ATF2_HUMAN Cyclic AMP-dependent transcriptio (505 aa)
+ initn: 65 init1: 65 opt: 141 Z-score: 141.0 bits: 35.1 E(516081): 2.5
+Smith-Waterman score: 141; 27.2% identity (62.5% similar) in 136 aa overlap (15-143:278-412)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ-
+ : :. ... : .: . . . .:. :.::
+sp|P15 LVRPVTMVPSVPGIPGPSSPQPVQSEAKMRLKAALTQQHPPVTNGDTVKGHGSGLVRTQS
+ 250 260 270 280 290 300
+
+ 50 60 70 80 90
+sp|Q1X -EVKPEE-KKPAKKRK----SWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAA
+ : .:. ..:: . : .. : ... :.:: .:: :.:: . . ::::::
+sp|P15 EESRPQSLQQPATSTTETPASPAHTTPQTQSTSGRRRRAANEDPDEKRR-KFLERNRAAA
+ 310 320 330 340 350 360
+
+ 100 110 120 130 140 150
+sp|Q1X QTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT
+ . :..... ...::.. .. . : : .... .. : .:.: :
+sp|P15 SRCRQKRKVWVQSLEKKAEDLSSLNGQLQSEVTLLRNEVAQLKQLLLAHKDCPVTAMQKK
+ 370 380 390 400 410 420
+
+ 160 170 180 190 200 210
+sp|Q1X PMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPA
+
+sp|P15 SGYHTADKDDSSEDISVPSSPHTEAIQHSSVSTSNGVSSTSKAEAVATSVLTQMADQSTE
+ 430 440 450 460 470 480
+
+>>sp|Q553B1|DDX46_DICDI ATP-dependent RNA helicase ddx46 (1151 aa)
+ initn: 54 init1: 54 opt: 146 Z-score: 140.8 bits: 36.2 E(516081): 2.5
+Smith-Waterman score: 146; 21.7% identity (52.6% similar) in 272 aa overlap (16-275:149-410)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPA--SEVPVLTVSPADTSLNSADVKTQ
+ : : :. :.. .: . . . :
+sp|Q55 QQQPHIQAPPPAKPRKSRFDQAPETIPIQAPQQPPMISNQPIFKQQPMYQQPMYQQKQQQ
+ 120 130 140 150 160 170
+
+ 50 60 70 80 90
+sp|Q1X EVKPEEKKPAKKRKS--WGQELPVPKTNLPP------RKRAKTEDEKEQRRI--ERVLRN
+ : .. :... . .. : : . :: ... . ....:.:. : . .
+sp|Q55 PQPPIFQQQQKQQQPPIFQHHQPPPIYQQPPVYQQQQQQQQPVFQQQQQQRVATEAIQFQ
+ 180 190 200 210 220 230
+
+ 100 110 120 130 140 150
+sp|Q1X RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS
+ .. : . :..::..:. :::: ..:: : .. . ..:. : .:.: : .. ::
+sp|Q55 QTPQQLAIEQERLKQER-ENEK-KIEQANLEEEMKKRREKVEQWR-KQKLEQ-ELKASGS
+ 240 250 260 270 280 290
+
+ 160 170 180 190 200 210
+sp|Q1X RANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVA
+ .:. .:: :.. : : : :: . . :: : .: : ..:
+sp|Q55 -SNSGSTSSPPTTTTTTTKTTAATTTATTSPLTIPSQQQQTATTSPIKKKWSLEEEEETA
+ 300 310 320 330 340 350
+
+ 220 230 240 250 260 270
+sp|Q1X QHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVF
+ : : :.. ..: :: ... .. ..: .. ... .. :....: .. .
+sp|Q55 Q-PLVNT-NIEQKEIKLP---PTANIPAAAATTTSATINTTTIKQSIEEDDDIDPLDAYM
+ 360 370 380 390 400
+
+ 280 290 300 310 320 330
+sp|Q1X EDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGAST
+ :.
+sp|Q55 ENLNKEANLNLKKSKTSQMIDDDEKLEEESEGEDDGKDKTIKKGKKEMLHTDHTSIKYAE
+ 410 420 430 440 450 460
+
+>>sp|P48634|BAT2_HUMAN Large proline-rich protein BAT2 O (2157 aa)
+ initn: 121 init1: 68 opt: 149 Z-score: 140.0 bits: 37.0 E(516081): 2.8
+Smith-Waterman score: 154; 27.0% identity (50.9% similar) in 222 aa overlap (18-228:380-575)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ .: :: :. .. :.:: ... :
+sp|P48 SDEEGAEGHRDSQSASGEERPPEADGKKGNSPNSEPPTPKTAWAETS-RPPETEPGPPAP
+ 350 360 370 380 390 400
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRK---SWGQELPVPKTNLPPRKRAKTEDEKE---QRRIERVLRNRAAAQTSR
+ . : .: .:: : . :: : ::: : ::: . . :.. .:
+sp|P48 KPPLPPPHRGPAGNWGPPGDYPDRGGPPCKPPAPEDEDEAWRQRRKQSSSEISLAVERAR
+ 410 420 430 440 450 460
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQ-MEAENNRLSQQLAQLAAEVRGSRANTPMP
+ .:.. : .....:. .. :.::.. . : ..::. :. :: : :
+sp|P48 RRREEEERRMQEERRAACAEK---LKRLDEKFGAPDKRLK---AEPAA---------P-P
+ 470 480 490 500 510
+
+ 170 180 190 200 210 220
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSV
+ ..:.: .: :.. : ::: : : :. : .: .: :.. . . :. .:
+sp|P48 AAPSTPAPP--PAVPK----ELPAP--PAPPPA-SAPTPEKEPEEPAQAPPAQSTPTPGV
+ 520 530 540 550 560
+
+ 230 240 250 260 270
+sp|Q1X AG----LEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDG
+ :. . : ::
+sp|P48 AAAPTLVSGGGSTSSTSSGSFEASPVEPQLPSKEGPEPPEEVPPPTTPPVPKVEPKGDGI
+ 570 580 590 600 610 620
+
+>>sp|Q5TM26|BAT2_MACMU Large proline-rich protein BAT2 O (2160 aa)
+ initn: 122 init1: 68 opt: 149 Z-score: 140.0 bits: 37.0 E(516081): 2.8
+Smith-Waterman score: 152; 25.6% identity (49.6% similar) in 242 aa overlap (18-251:380-589)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ .: ::.: .. :.:: ... :
+sp|Q5T SDEEGAEGHKDSQSASGEERPTEADGKKGNSPNSELPPPKTAWAETS-RPPETEPGPPAP
+ 350 360 370 380 390 400
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRK---SWGQELPVPKTNLPPRKRAKTEDEKE---QRRIERVLRNRAAAQTSR
+ . : .: .:: : . :: : ::: : ::: . . :.. .:
+sp|Q5T KPPLPPPHRGPAGNWGPPGDYPDRGGPPCKPPAPEDEDEAWRQRRKQSSSEISLAVERAR
+ 410 420 430 440 450 460
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQ-MEAENNRLSQQLAQLAAEVRGSRANTPMP
+ .:.. : .....:. .. :.::.. . : ..::. :. :: : :
+sp|Q5T RRREEEERRMQEERRAACAEK---LKRLDEKFGAPDKRLK---AEPAA---------P-P
+ 470 480 490 500 510
+
+ 170 180 190 200 210 220
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSV
+ ..:.: .: :.. : ::: : ::. :. : . :: : ..
+sp|Q5T AAPSTPAPP--PAVPK----ELPAPLAP---------SPASAPTPEKEPEESAQAPPAQC
+ 520 530 540 550
+
+ 230 240 250 260 270
+sp|Q1X AGLEGDGSALPLFDLGSDLKHHSTDDV-AAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAF
+ . : ..: : . :.. . :. . :.:.
+sp|Q5T TPTPGVAAAPTLVSGGGSTSSTSSGSFEASPVEPQLPSKEGPEPPEEVPPPTTPPAPKVE
+ 560 570 580 590 600 610
+
+ 280 290 300 310 320 330
+sp|Q1X DVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQ
+
+sp|Q5T PKGDGIGPTRQPPSQGLGYPKYQKSLPPRFQRQQQEQLLKQQQQQQWQQHQQGSAPPTPV
+ 620 630 640 650 660 670
+
+>>sp|A3BYC1|HOX25_ORYSJ Homeobox-leucine zipper protein (320 aa)
+ initn: 43 init1: 43 opt: 137 Z-score: 139.9 bits: 34.2 E(516081): 2.9
+Smith-Waterman score: 137; 23.4% identity (56.0% similar) in 282 aa overlap (24-294:48-314)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEK---
+ : ::.. . :. :. . .:.
+sp|A3B YSLERVAYVCERVGSPVMEEAELRRRRRKRPFLTTTHDELELQMEDLVDELYGVDEQGSS
+ 20 30 40 50 60 70
+
+ 60 70 80 90 100
+sp|Q1X -KPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIER--VLRNRAAAQTSRERKRLE
+ :.::. .... . . .. .:: : : :.... .: . ..:. . .: : .
+sp|A3B SAAARKRRLTAEQVRALERSFEEEKR-KLEPERKSELARRLGIAPRQVAVWFQNRRARWK
+ 80 90 100 110 120 130
+
+ 110 120 130 140 150 160
+sp|Q1X MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATAS
+ ..:: . ... .. :: . . :.:. : .:. :. ..... ...: : ::: :
+sp|A3B TKQLELDFDRLRAAHDELLAGRTALAADNESLRSQVILLTEKLQAN-GKSPSP-SPAPAE
+ 140 150 160 170 180 190
+
+ 170 180 190 200 210 220
+sp|Q1X PTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDG
+ : .:. .. .. . ::. : : . . .: . .. ::. ::. ::. .. .
+sp|A3B QTAVPAAPESAKS-FQLEE----GRRLYDAAGSTT-TTNGGGGGVAM-PAARVAAARAAS
+ 200 210 220 230 240
+
+ 230 240 250 260 270 280
+sp|Q1X SALP--LFDLGSDLKHHSTDDVAAPLSDDDF---NRLFHGDSSVEPDSSVFEDGLAFDVL
+ . : : . . : :: .. ::::. . :. :... :. :: ..: :
+sp|A3B NDSPESYFAGARSPPSSSEDDCGGAGSDDDYPSSSVLLPVDATLVGDA--FEHAVAATV-
+ 250 260 270 280 290 300
+
+ 290 300 310 320 330 340
+sp|Q1X EGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIA
+ ..: : :..:
+sp|A3B -AADEEA-PLNSWEWFWN
+ 310 320
+
+>>sp|P16951|ATF2_MOUSE Cyclic AMP-dependent transcriptio (487 aa)
+ initn: 65 init1: 65 opt: 139 Z-score: 139.3 bits: 34.7 E(516081): 3.1
+Smith-Waterman score: 139; 27.2% identity (62.5% similar) in 136 aa overlap (15-143:260-394)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ-
+ : :. ... : .: . . . .:. :.::
+sp|P16 LVRPVTMVPSVPGIPGPSSPQPVQSEAKMRLKAALTQQHPPVTNGDTVKGHGSGLVRTQS
+ 230 240 250 260 270 280
+
+ 50 60 70 80 90
+sp|Q1X -EVKPEE-KKPAKKRK----SWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAA
+ : .:. ..:: . : .. : ... :.:: .:: :.:: . . ::::::
+sp|P16 EESRPQSLQQPATSTTETPASPAHTTPQTQNTSGRRRRAANEDPDEKRR-KFLERNRAAA
+ 290 300 310 320 330 340
+
+ 100 110 120 130 140 150
+sp|Q1X QTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT
+ . :..... ...::.. .. . : : .... .. : .:.: :
+sp|P16 SRCRQKRKVWVQSLEKKAEDLSSLNGQLQSEVTLLRNEVAQLKQLLLAHKDCPVTAMQKK
+ 350 360 370 380 390 400
+
+ 160 170 180 190 200 210
+sp|Q1X PMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPA
+
+sp|P16 SGYHTADKDDSSEDLSVPSSPHTEAIQHSSVSTSNGVSSTSKAEAVATSVLTQMADQSTE
+ 410 420 430 440 450 460
+
+>>sp|Q96RN5|MED15_HUMAN Mediator of RNA polymerase II tr (788 aa)
+ initn: 164 init1: 84 opt: 142 Z-score: 139.3 bits: 35.4 E(516081): 3.1
+Smith-Waterman score: 142; 19.1% identity (59.5% similar) in 220 aa overlap (5-221:119-331)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTS
+ : . :: . : .. .: ... ..:.
+sp|Q96 TGGPAAGAAGIGMPPRGPGQSLGGMGSLGAMGQPMSLSGQPPPGTSGMAP-HSMAVVSTA
+ 90 100 110 120 130 140
+
+ 40 50 60 70 80 90
+sp|Q1X LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNR
+ ..... :.: .... .. .. : . . ... .... :.... :....
+sp|Q96 TPQTQLQLQQVALQQQQQQQQFQQQQQAALQQQQQQQQQQQFQAQQSAMQQQFQAVVQQQ
+ 150 160 170 180 190 200
+
+ 100 110 120 130 140 150
+sp|Q1X AAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR
+ : ...... .. ::.... :. ::.: :::..:.. .... .:: : . .. .
+sp|Q96 QQLQQQQQQQQ-HLIKLHHQNQQQIQQQQQQLQRIAQLQLQQQQQQQQQQQQQQQ-QALQ
+ 210 220 230 240 250 260
+
+ 160 170 180 190 200 210
+sp|Q1X ANTPMPGSPATASPTLTPTL-FKQERDEL--PLERIPFPTPSLSDYSPTLKPSTLAESSD
+ :. :. .: .: :. . :. ... .. : : :. . . .:: : .:.
+sp|Q96 AQPPIQ-QPPMQQPQPPPSQALPQQLQQMHHTQHHQPPPQPQQPPVAQN-QPSQLPPQSQ
+ 270 280 290 300 310 320
+
+ 220 230 240 250 260 270
+sp|Q1X VAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSS
+ . .: :: :
+sp|Q96 T--QPLVSQAQALPGQMLYTQPPLKFVRAPMVVQQPPVQPQVQQQQTAVQTAQAAQMVAP
+ 330 340 350 360 370 380
+
+>>sp|Q2UNX4|KAPC_ASPOR Putative transcription factor kap (284 aa)
+ initn: 70 init1: 70 opt: 142 Z-score: 145.3 bits: 35.0 E(516081): 1.4
+Smith-Waterman score: 142; 24.2% identity (51.6% similar) in 215 aa overlap (16-223:44-237)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL---TVSPAD-TSLNSADVK
+ : ::.. : . :.:: : .... :
+sp|Q2U QTSAQDHADQVLHDQLLAAHQHLSHPQQPRPQPPAAQPPHMQPNTTSPRDQNNIDPAISG
+ 20 30 40 50 60 70
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ . .. . : . . . ::: : :: .. .:. .:::: .. :
+sp|Q2U AAMLSGPPQTPPQPEPT-GQESP------------KTYGKRPLSTSKRAAQNRAAQRAFR
+ 80 90 100 110 120
+
+ 110 120 130 140 150
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQF--LLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-
+ .::. ..::: :: ..: . . .. ..::: .: . . .: ... :....:
+sp|Q2U QRKESYIRKLE------EQVKEFDTMSEAFKALQAENYQLREYIINLQSRLLESQGEVPE
+ 130 140 150 160 170
+
+ 160 170 180 190 200 210
+sp|Q1X MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAV
+ .::. ..: : : :.: : . . :. : ..:. . .
+sp|Q2U LPGNIDLSQPR-TDLNVPQPGAGPATTSSSAPAPP-SGAQQAQPPQGAASNDDMNSLNRI
+ 180 190 200 210 220 230
+
+ 220 230 240 250 260 270
+sp|Q1X SVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLA
+ .::::
+sp|Q2U AVAGLGMRKHPNEEANYLGNNFTGRRTRPDETQADSEVTKTEQAPHGLPMVS
+ 240 250 260 270 280
+
+>>sp|Q80U35|ARHGH_MOUSE Rho guanine nucleotide exchange (2057 aa)
+ initn: 95 init1: 56 opt: 147 Z-score: 138.4 bits: 36.6 E(516081): 3.5
+Smith-Waterman score: 147; 24.5% identity (52.9% similar) in 208 aa overlap (19-214:838-1039)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADV-KTQEVKP
+ :..: :. : : .: . : ..:
+sp|Q80 EDRIAGKTPKKKSLSDPSRRGELTGPGFEGPGGE-PIREVEPMLPPSSSEPILAEQWTEP
+ 810 820 830 840 850 860
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERK-RL
+ :. ::. : . . ::.: : . . .: . . .. :: : . . :..: :
+sp|Q80 EDPAPARGRAQSERSLPAP-----PASSTAHHDFHLDPKLTSVLSPRLTRRGSKKRPARS
+ 870 880 890 900 910 920
+
+ 110 120 130 140 150 160
+sp|Q1X EMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA----AEVRGSRANTPMP-G
+ ..:. :. ...: ... : :. .... . .. .. : : . .: : :
+sp|Q80 SHQELRREEGNQDQTGSLTQTRSSSKHVRHASVPATFTPIVVPEPAMSVGPPVAAPEPVG
+ 930 940 950 960 970 980
+
+ 170 180 190 200 210
+sp|Q1X SPATASPTL-TPTLFK-QERDELPLER--IPFPTP-SLSDYSPTLKPSTLAESSDVAQHP
+ :. . :.: .:.: .: : :. .: : : .: :. ::: .. : .:.
+sp|Q80 FPVRGHPALQAPSLEDVTKRYMLTLHSGDVPAPGPVDLPCLPPSAPPSTETKPSGAARAT
+ 990 1000 1010 1020 1030 1040
+
+ 220 230 240 250 260 270
+sp|Q1X AVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDG
+
+sp|Q80 PDEPAPASKCCSKPQVDMRKHVTMTLLDTEQSYVESLRTLMQGYMQPLKQPENSLLCDPS
+ 1050 1060 1070 1080 1090 1100
+
+>>sp|P0C865|MK07_RAT Mitogen-activated protein kinase 7 (806 aa)
+ initn: 130 init1: 75 opt: 149 Z-score: 145.7 bits: 36.6 E(516081): 1.3
+Smith-Waterman score: 156; 26.3% identity (50.2% similar) in 259 aa overlap (3-236:429-680)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLP--ATPASEVPVLTVSP
+ : :: : .:: . :: .. ::..:
+sp|P0C IRFQPSLQPVASEPVCPDVEMPSPWAPSGDCAME---SPPPALPPCSGPAPDTVDLTLQP
+ 400 410 420 430 440 450
+
+ 40 50 60 70 80
+sp|Q1X ADTSLNSADVKTQEVKPEEKKPA------KKRKSWGQELPVPKTNLP-PRKRAKTEDEKE
+ : . . : : . . .. : : :. .: .. : . : ::: . ......
+sp|P0C APPASELAPPKREGAISDNTKAALKAALLKSLRSRLRDGPSAPLEAPEPRKPVTAQERQR
+ 460 470 480 490 500 510
+
+ 90 100 110 120 130 140
+sp|Q1X QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNR-LSQQ
+ .:. .: : : ::..: : :. : . . : : . ..:.: : ..
+sp|P0C EREEKR--RRRQERAKEREKRRQERERKERGAGTLGGPSTDPLAGL--VLSDNDRSLLER
+ 520 530 540 550 560 570
+
+ 150 160 170 180 190
+sp|Q1X LAQLAAEVRGSRANTPMPG-SPATASPTLTPTL-FKQERDEL-PLERIPFPT--PSLSDY
+ ...: . : .: : .:..:.:: :. .: : : :: :. :
+sp|P0C WTRMARPPVPAPAPAPAPTPKPSSAQPTSPPNGPVSQSTAPLQPAGSIPGPASQPVCPPP
+ 580 590 600 610 620 630
+
+ 200 210 220 230 240
+sp|Q1X SPTLKPS--------TLAESSDVAQHPAVSVAGLEGDGS--ALPLFDLGSDLKHHSTDDV
+ .:. .:. : .: .:.. : .:: :.:. .:: : :
+sp|P0C GPVPQPAGPVPAPLQTAPSTSLLASQSLVPPSGLPGSGAPEVLPYFPSGPPPPDPGLTPQ
+ 640 650 660 670 680 690
+
+ 250 260 270 280 290 300
+sp|Q1X AAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEG
+
+sp|P0C PSTSESPDVNLVTQQLSKSQVEDPLPPVFSGTPKGSGAGYGVGFDLEEFLNQSFDMGVAD
+ 700 710 720 730 740 750
+
+>>sp|P97875|JDP2_MOUSE Jun dimerization protein 2 OS=Mus (163 aa)
+ initn: 109 init1: 109 opt: 131 Z-score: 138.2 bits: 32.9 E(516081): 3.5
+Smith-Waterman score: 131; 27.2% identity (56.3% similar) in 151 aa overlap (16-163:9-155)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ :.. :. .: : .: :.: :. . :.:.: . . .
+sp|P97 MMPGQIPDPSVTAGSLPGL--GPL-TGLPSSALTTEELKYADIRNIGAMIAPL
+ 10 20 30 40 50
+
+ 70 80 90 100 110 120
+sp|Q1X QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+ . : : : . :. . ::.:.:: .: .:..:: :..:. . : :. :. ..:
+sp|P97 HFLEV-KLGKRPQPVKSELDEEEERRKRRREKNKVAAARCRNKKKERTEFLQRESERLEL
+ 60 70 80 90 100
+
+ 130 140 150 160 170
+sp|Q1X QNQFLLQRLSQMEAENNRLSQQLAQLAAE--VRGSRANTPMP-GSPATASPTLTPTLFKQ
+ .: : .. ... : ..: .: . :: . . :: :.:
+sp|P97 MNAELKTQIEELKLERQQLILMLNRHRPTCIVRTDSVRTPESEGNPLLEQLDKK
+ 110 120 130 140 150 160
+
+ 180 190 200 210 220 230
+sp|Q1X ERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGS
+
+>>sp|Q78E65|JDP2_RAT Jun dimerization protein 2 OS=Rattu (163 aa)
+ initn: 109 init1: 109 opt: 131 Z-score: 138.2 bits: 32.9 E(516081): 3.5
+Smith-Waterman score: 131; 27.2% identity (56.3% similar) in 151 aa overlap (16-163:9-155)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ :.. :. .: : .: :.: :. . :.:.: . . .
+sp|Q78 MMPGQIPDPSVTAGSLPGL--GPL-TGLPSSALTTEELKYADIRNIGAMIAPL
+ 10 20 30 40 50
+
+ 70 80 90 100 110 120
+sp|Q1X QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+ . : : : . :. . ::.:.:: .: .:..:: :..:. . : :. :. ..:
+sp|Q78 HFLEV-KLGKRPQPVKSELDEEEERRKRRREKNKVAAARCRNKKKERTEFLQRESERLEL
+ 60 70 80 90 100
+
+ 130 140 150 160 170
+sp|Q1X QNQFLLQRLSQMEAENNRLSQQLAQLAAE--VRGSRANTPMP-GSPATASPTLTPTLFKQ
+ .: : .. ... : ..: .: . :: . . :: :.:
+sp|Q78 MNAELKTQIEELKLERQQLILMLNRHRPTCIVRTDSVRTPESEGNPLLEQLDKK
+ 110 120 130 140 150 160
+
+ 180 190 200 210 220 230
+sp|Q1X ERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGS
+
+>>sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive element-bi (368 aa)
+ initn: 134 init1: 134 opt: 151 Z-score: 152.2 bits: 36.7 E(516081): 0.59
+Smith-Waterman score: 151; 25.9% identity (54.7% similar) in 212 aa overlap (20-221:105-301)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEE
+ :. .:. . ::: .. . ::
+sp|Q8S PCLVQHDHTYSLSQEHVSIDLDNESYEKERAQMTPLRVEEPAD-----QEIARLILTEEE
+ 80 90 100 110 120
+
+ 50 60 70 80 90 100
+sp|Q1X KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ :. .:. : :: :: : .:. .:..: .::. .:: ::..:.. .
+sp|Q8S KRLLEKE---GLTLP---GMLPLTKM----EEQVLKRVRRKIRNKKSAQESRRKKKVYVG
+ 130 140 150 160 170
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV-----RGSRANTPMPGSPA
+ ::.. ... :: : .... .: .: : .:: .: : : ..: ..: .
+sp|Q8S GLESRVLKYTAQNLELQNKVQLLEEQNLSLLDQLRRLQAMVIQTANKASSSSTCVLVLLF
+ 180 190 200 210 220 230
+
+ 170 180 190 200 210
+sp|Q1X TASPTLTPTLFKQE-RDELPLER--IPFPTPSL-SDYSPTLKPSTL-AESSDVAQHPAVS
+ . :.:...... : :: :. . .: :. : :.: .: .: . .: ..
+sp|Q8S SFCLLLVPAMYSSDTRGSLPAEHRVLSRQLRALPSEDPPQLEPPALQSEVPKDSLNPELQ
+ 240 250 260 270 280 290
+
+ 220 230 240 250 260 270
+sp|Q1X VAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAF
+ .:
+sp|Q8S AASNSCCLFHLMPQAPRAEPPLQLPLPDGFSGCSCPDSISPLHANLTREEGWLPTPSPTS
+ 300 310 320 330 340 350
+
+>>sp|P48755|FOSL1_MOUSE Fos-related antigen 1 OS=Mus mus (273 aa)
+ initn: 97 init1: 97 opt: 150 Z-score: 153.0 bits: 36.4 E(516081): 0.53
+Smith-Waterman score: 150; 26.9% identity (53.4% similar) in 208 aa overlap (44-232:72-265)
+
+ 20 30 40 50 60 70
+sp|Q1X SLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR
+ . .: . .:. : . : : : . :
+sp|P48 SIDSSSQELHWMVQPHFLGPTGYPRPLAYPQYSPPQPRPGVIR-ALG---PPPGVRRRPC
+ 50 60 70 80 90
+
+ 80 90 100 110 120
+sp|Q1X KRAKTEDEKEQRRIERVLRNRAAAQTSRERKR-------LEMEKLENEKIQMEQQNQFLL
+ .. . :.: :.::..: ::. :: :.:.. : .:::.:: .... . :
+sp|P48 EQISPEEE-ERRRVRRE-RNKLAAAKCRNRRKELTDFLQAETDKLEDEKSGLQREIEELQ
+ 100 110 120 130 140 150
+
+ 130 140 150 160 170
+sp|Q1X QRLSQMEA--ENNRLSQQLAQLAAEVRGSRANT------PMPGSPATASPTLTP-TLFKQ
+ .. ..: : .: .. . . :. ..: : :: :. .:.: ...
+sp|P48 KQKERLELVLEAHRPICKIPEGDKKDPGGSGSTSGASSPPAPGRPVPCI-SLSPGPVLEP
+ 160 170 180 190 200 210
+
+ 180 190 200 210 220 230
+sp|Q1X ERDELPLERIPFPTPSLSDYSPTL---KPSTLAESSDVAQHPAVSVAGLEGDGSALPLFD
+ : . : . ::::. ..:.: ::: : . :.. . : .: : :. ::
+sp|P48 EALHTPTL---MTTPSLTPFTPSLVFTYPST-PEPCSSAHRKSSSSSG---DPSSDPLGS
+ 220 230 240 250 260
+
+ 240 250 260 270 280 290
+sp|Q1X LGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDS
+
+sp|P48 PTLLAL
+ 270
+
+>>sp|A2AJI0|MA7D1_MOUSE MAP7 domain-containing protein 1 (846 aa)
+ initn: 93 init1: 59 opt: 141 Z-score: 138.0 bits: 35.3 E(516081): 3.7
+Smith-Waterman score: 141; 24.7% identity (56.2% similar) in 146 aa overlap (4-149:527-669)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADT
+ . .:. .. .. ::.::: .: . ::. .
+sp|A2A PRGTTASPKGRVRRKEEAKESPSPSGPEDKNHRKSRAAEEKEPAAPASPAPSPVPSPTPA
+ 500 510 520 530 540 550
+
+ 40 50 60 70 80 90
+sp|Q1X SLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRN
+ . .. . .:: . : :: . .:... : . : : :..: :. :
+sp|A2A QPQKEQSSTQ-IPAETAVPAVPAAPTAPPTAAPSVT-PSKPMAGTTDREEATRLLAEKRR
+ 560 570 580 590 600 610
+
+ 100 110 120 130 140 150
+sp|Q1X RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS
+ .: : ::... ... ...... :: . : .. ::: : .: :. :.
+sp|A2A QAREQREREEQERKLQAERDKRMREEQLAREAEAR-AEREAEARRREEQEAREKAQAEQE
+ 620 630 640 650 660 670
+
+ 160 170 180 190 200 210
+sp|Q1X RANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVA
+
+sp|A2A EQERLQKQKEEAEARSREEAERQRQEREKHFQKEEQERQERRKRLEEIMKRTRKSEAAET
+ 680 690 700 710 720 730
+
+>>sp|Q00312|RBF1_CANAL Transcription factor RBF1 OS=Cand (527 aa)
+ initn: 102 init1: 62 opt: 142 Z-score: 141.7 bits: 35.3 E(516081): 2.3
+Smith-Waterman score: 142; 23.0% identity (57.0% similar) in 200 aa overlap (36-229:263-449)
+
+ 10 20 30 40 50 60
+sp|Q1X EKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEE----KKPAKKRKSWGQ
+ : : : .. ::.: .. .. . :
+sp|Q00 TTVKDATKRQRIAYTKRNKCAYRLVANLYPNEKDQKRKN-KPDEPGHNEENSRISEMWVL
+ 240 250 260 270 280 290
+
+ 70 80 90 100 110 120
+sp|Q1X ELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ
+ .. :. : : : :.... :.: .. . .... :..:. .... :..::
+sp|Q00 RMINPQHNHAPDPINK----KKRQKTSRTLVEKPINKP-HHHHLLQQEQQQQQQQQQQQQ
+ 300 310 320 330 340
+
+ 130 140 150 160 170
+sp|Q1X NQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPT--LFKQER
+ .: :. .: .: :.. .:: ::: ... . . .: .: . : : : .:.
+sp|Q00 QQ---QQQQQHNA-NSQAQQQAAQLQQQMQQQLQASGLPTTP-NYSELLGQLGQLSQQQS
+ 350 360 370 380 390 400
+
+ 180 190 200 210 220 230
+sp|Q1X DELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDL
+ .. :..:: .. . .:. :.. : : :. .:..:....:
+sp|Q00 QQQQLHHIPQQRQRTQSQQSQQQPQQTAHGLD--QPDAAVIAAIEASAAAAVASQGSPNV
+ 410 420 430 440 450
+
+ 240 250 260 270 280 290
+sp|Q1X KHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFD
+
+sp|Q00 TAAAVAALQHTQGNEHDAQQQQDRGGNNGGAIDSNVDPSLDPNVDPNVQAHDHSHGLRNS
+ 460 470 480 490 500 510
+
+>>sp|O35413|SRBS2_RAT Sorbin and SH3 domain-containing p (1196 aa)
+ initn: 70 init1: 70 opt: 143 Z-score: 137.8 bits: 35.7 E(516081): 3.7
+Smith-Waterman score: 143; 26.7% identity (53.9% similar) in 217 aa overlap (18-229:220-425)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ :: . : :: ... . : .::: .:
+sp|O35 TVDRPKDWYKTMFKQIHMVHKPDEDTDMYNTPYTYNAGLYNSPYSAQSHPA-AKTQTYRP
+ 190 200 210 220 230 240
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRKSWGQEL--PVPKTNLPPRKRAKTEDEK-EQRRIERVLRNRAAAQTSRERK
+ :. . . . .: ::: ..::: : .. :: . .: . .: :. :.
+sp|O35 LSKSHSDNGTDAFKEATSPVPPPHVPPRPRDQSSTEKHDWDPPDRKVDTRKF--RSEPRS
+ 250 260 270 280 290 300
+
+ 110 120 130 140 150 160
+sp|Q1X RLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPA
+ .:.: .. .: :. . . : :... .: :.. :..:.. : : . : : :
+sp|O35 IFEYEPGKSSILQHERPVS-VYQ--SSIDRSLERPSSS-ASMAGDFRKRRKSEPAVGPPR
+ 310 320 330 340 350 360
+
+ 170 180 190 200 210 220
+sp|Q1X TASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQH--PAVSVAG
+ . . . . : .:: : : .:. ::. .:: :...: .. : : .:
+sp|O35 GLGDH-SSSRTSPGRADLPGSSSTFTTSFISS-SPS-SPSR-AQGGDDSKMCPPLCSYSG
+ 370 380 390 400 410
+
+ 230 240 250 260 270 280
+sp|Q1X LEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVL
+ :.:. :.
+sp|O35 LNGSPSSELECCGAYRRHLDVPQDSQRAITFKNGWQMARQNAEIWSSTEEAVSPKIKSRS
+ 420 430 440 450 460 470
+
+>>sp|P97876|BATF3_RAT Basic leucine zipper transcription (133 aa)
+ initn: 100 init1: 100 opt: 129 Z-score: 137.5 bits: 32.5 E(516081): 3.9
+Smith-Waterman score: 129; 30.2% identity (77.8% similar) in 63 aa overlap (83-145:28-90)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ ..:...: .::.::: ::... . .::.
+sp|P97 MSQGPPAGGVLQSSVAAPGNQPQSPKDDDRKVRRREKNRVAAQRSRKKQTQKSDKLH
+ 10 20 30 40 50
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ .:. ..::.:. : ....... : .:.. : .
+sp|P97 EEHESLEQENSVLRREIAKLKEELRHLTEALKEHEKMCPLLLCPMNFVQLRPDPVASWSA
+ 60 70 80 90 100 110
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+sp|P97 HDAPDHPSFIWLGTLV
+ 120 130
+
+>>sp|O93602|ATF2_CHICK Cyclic AMP-dependent transcriptio (487 aa)
+ initn: 112 init1: 65 opt: 141 Z-score: 141.2 bits: 35.1 E(516081): 2.4
+Smith-Waterman score: 141; 25.2% identity (58.8% similar) in 131 aa overlap (13-143:275-394)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKT
+ :. . :.. : . . : ::.. ..:
+sp|O93 GPSSPQPVQSEAKLRLKAALTQQHPQVTNGDTAKGHPSGLVRTQSEEPRPQSLQQPATST
+ 250 260 270 280 290 300
+
+ 50 60 70 80 90 100
+sp|Q1X QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE
+ :. .:... . : . :.:: .:: :.:: . . ::::::. :.
+sp|O93 TETPASPAQPTQQTPNTGGR----------RRRAANEDPDEKRR-KFLERNRAAASRCRQ
+ 310 320 330 340 350
+
+ 110 120 130 140 150 160
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS
+ .... ...::.. .. . : : .... .. : .:.: :
+sp|O93 KRKVWVQSLEKKAEDLSSLNGQLQNEVTLLRNEVAQLKQLLLAHKDCPVTAMQKKSGYHT
+ 360 370 380 390 400 410
+
+ 170 180 190 200 210 220
+sp|Q1X PATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAG
+
+sp|O93 ADKDDSSEDISVPSSPHTEAIQHSSVSTSNGVSSTSKAEAVATSVLTQLADQSSEPGLPQ
+ 420 430 440 450 460 470
+
+>>sp|Q5F489|TAF3_CHICK Transcription initiation factor T (930 aa)
+ initn: 120 init1: 86 opt: 151 Z-score: 146.8 bits: 37.0 E(516081): 1.2
+Smith-Waterman score: 152; 26.1% identity (52.7% similar) in 226 aa overlap (14-232:662-845)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLP--ATP-ASEVPVLTVSPADTSLNSADV
+ ::: .:: : ..: .. :. . . .
+sp|Q5F KKDKEKVKDKSKEDKIKPPSAPLVLPPKEMSLPLFSTPTAMRLP--SMLPSLSPMLPEKL
+ 640 650 660 670 680
+
+ 50 60 70 80 90 100
+sp|Q1X KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS
+ .. ::.::: ::.: .:. . : .::... ... .
+sp|Q5F FEDKEKPKEKKKDKKEK---------------KKKKEREKDKEKEK-----KDKEKERKE
+ 690 700 710 720
+
+ 110 120 130 140 150
+sp|Q1X RERKRLEMEKLENEKIQMEQ---QNQFLLQRLS-QMEAENNRLSQQLAQLAAEVRGSRAN
+ ::.:. : :: ..:::..: . .. ::. .. : .... . . : : ..
+sp|Q5F REKKEKEKEKHKHEKIKVEPVVPAPSPVIPRLTLRVGAGQDKIVISKVVPAPE---AKPA
+ 730 740 750 760 770 780
+
+ 160 170 180 190 200 210
+sp|Q1X TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHP
+ ::. . : : :. .:. :.. : :.: . .::..:. : .: :
+sp|Q5F TPV-SRPKTPPPVPSPV-------PAPVHVTPPPAPVPAPPQPTVSPALLPPAS-----P
+ 790 800 810 820 830
+
+ 220 230 240 250 260 270
+sp|Q1X AVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDG
+ :::.:: :: :.
+sp|Q5F AVSAAG----GSKAPVRSVVTETVSTYVIRDEWGNQIWFCPGCNKPDDGSPMIGCDDCDD
+ 840 850 860 870 880
+
+>>sp|Q6CBW0|NST1_YARLI Stress response protein NST1 OS=Y (889 aa)
+ initn: 264 init1: 76 opt: 140 Z-score: 136.7 bits: 35.1 E(516081): 4.3
+Smith-Waterman score: 141; 28.0% identity (58.4% similar) in 161 aa overlap (48-194:477-629)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRK---
+ :::. :. :. ... . : . .:
+sp|Q6C KEREKAARKAASEAKQKARQEEQARLAREKEEKRLARIRE-MEERMRLAKEKEEREKEEL
+ 450 460 470 480 490 500
+
+ 80 90 100 110 120 130
+sp|Q1X RAKTEDEKEQRR-IERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQME
+ ::. ..:...:: ::. ..: : .::: :..:::... :...: : .. ...
+sp|Q6C RARQQQEEDERREKERLEEERI------ENERLEAERIENERLEKEREQQRLEEEKERQR
+ 510 520 530 540 550
+
+ 140 150 160 170 180
+sp|Q1X AENNRLSQQLAQLAAEVRGSRA---NTPMPGS---PATASPTLTPTLFK---QERDELPL
+ ...: .:.: . : :.: . . :.::. ::. : : . : :.
+sp|Q6C IKEEREKQKLEE-EREKRASMSIPLSKPLPGKTQIPASQPGTSLGGLQQPVPQAAPVAPV
+ 560 570 580 590 600 610
+
+ 190 200 210 220 230 240
+sp|Q1X ERIP-FPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHS
+ .: :.:.:
+sp|Q6C AMMPQSPSPQLPPGLTQHVAQSQILLDRLTPDPTSRMTPERHTPSPGSTTSNAKTLLDSL
+ 620 630 640 650 660 670
+
+>>sp|Q9CXK9|RBM33_MOUSE RNA-binding protein 33 OS=Mus mu (1231 aa)
+ initn: 63 init1: 63 opt: 142 Z-score: 136.7 bits: 35.6 E(516081): 4.3
+Smith-Waterman score: 142; 27.1% identity (54.7% similar) in 181 aa overlap (5-169:749-921)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPAD-T
+ :. : ..: : . :: .: .
+sp|Q9C PSSSRMQCTPHQGLRHNAASQNISKRPMQQMQPTAPRNSNLRELPIAPSHVLEMSGNRCS
+ 720 730 740 750 760 770
+
+ 40 50 60 70 80
+sp|Q1X SLNSADVKTQ-EVKPEEKKPAKKRKSWGQELPVPKTNLP---PRKRAKTE----DEKEQR
+ : :.::. ...: . ...:.: :. : : :...:: : :: :.
+sp|Q9C STPVAQVKSIVNTSPPCRAVVSSRSSQGNTDAKAKPLSPEAQPKEEAKPEAEFPDEDEET
+ 780 790 800 810 820 830
+
+ 90 100 110 120 130 140
+sp|Q1X RIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ----NQFLLQRLSQMEAENNRLS-
+ :. :. .:.:::. : :...... .:: .. ::.::.:.. .... .
+sp|Q9C RLYRL--------KIEEQKRLREEILKQKELRRQQQAGARKKELLERLAQQQQQQQQQQH
+ 840 850 860 870 880 890
+
+ 150 160 170 180 190
+sp|Q1X --QQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYS
+ :: : .. ::... . :: :::
+sp|Q9C QPQQQQQQPQQIYGSQTSMEQEELAATPSPTNGNPLLPFPGAQCRQNVKTRLLVKNQDIT
+ 900 910 920 930 940 950
+
+ 200 210 220 230 240 250
+sp|Q1X PTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNR
+
+sp|Q9C TASVQPKAVNFVPPGANVQHQGQHLRPLKHLRQLPHKVLQVKPMDMEETPHSPQAARVTS
+ 960 970 980 990 1000 1010
+
+>>sp|Q554P0|BZPJ_DICDI Probable basic-leucine zipper tra (787 aa)
+ initn: 125 init1: 125 opt: 139 Z-score: 136.5 bits: 34.9 E(516081): 4.4
+Smith-Waterman score: 139; 27.3% identity (66.7% similar) in 99 aa overlap (80-175:546-644)
+
+ 50 60 70 80 90 100
+sp|Q1X KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ .::: .. .:...:: :. :: :... .:
+sp|Q55 LSREHVLKLSSKEIEEYVSRLKMHHILTQAEEKELKKQRRLVKNREYASQSRSRRKIYVE
+ 520 530 540 550 560 570
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPG---SPATA
+ ..:.. . .:. . ..:.... ::. :..:: .:. .... . . : ::
+sp|Q55 NIETKLQKTNQDCASIKSQLNSVKEENKALKKQLYSLTNTLKSNPSLAEAFGKIFSPIGN
+ 580 590 600 610 620 630
+
+ 170 180 190 200 210 220
+sp|Q1X SPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGD
+ . : . :::
+sp|Q55 NKTSSATLFVFFFLFTFTFLFQSSTVTFNSDRVSSIQRNLLSLEETQATEWNIKRAILEE
+ 640 650 660 670 680 690
+
+>>sp|Q55EQ3|Y9086_DICDI Uncharacterized abhydrolase doma (937 aa)
+ initn: 213 init1: 65 opt: 140 Z-score: 136.4 bits: 35.1 E(516081): 4.4
+Smith-Waterman score: 140; 27.8% identity (61.1% similar) in 144 aa overlap (18-154:283-415)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKT-QEVK
+ .:.:.. . :.: . :. .... . .: :
+sp|Q55 HEVHNEFAKEEFVTYILEWIKERIENAKNESPSSNINTTTTSTTTTTTTTTSSPVVEESK
+ 260 270 280 290 300 310
+
+ 50 60 70 80 90 100
+sp|Q1X P--EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTE----DEKEQRRIERVLRNRAAAQTS
+ : ::.::. .... :: . . : ...: : : ::... ::. ...:::.
+sp|Q55 PVVEESKPVVEESK-----PVVEESKPVVEESKPEPVVDDSKEKEEKERLEKEEAAAKLE
+ 320 330 340 350 360
+
+ 110 120 130 140 150 160
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP
+ .:: .:: : :.. : ... . . . :: . .:: : ::... :
+sp|Q55 KER----LEKEEAERVAKEAEEKRI--KDEKEAQENLEKQQQEAAAAAQAEKERLEKEEA
+ 370 380 390 400 410 420
+
+ 170 180 190 200 210 220
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSV
+
+sp|Q55 DKLEKERLEAEAAAAAQAEKERLEAEAAAAAQAEKERLEAEAAAAVQAEKERLEKEEADR
+ 430 440 450 460 470 480
+
+>>sp|O75037|KI21B_HUMAN Kinesin-like protein KIF21B OS=H (1637 aa)
+ initn: 66 init1: 66 opt: 143 Z-score: 136.0 bits: 35.8 E(516081): 4.7
+Smith-Waterman score: 143; 26.2% identity (61.0% similar) in 141 aa overlap (41-173:723-857)
+
+ 20 30 40 50 60 70
+sp|Q1X SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNL
+ : : .. :. . :... . .:: ....
+sp|O75 STMECYTEEKANKIKADYEKRLREMNRDLQKLQAAQKEHARLLKNQSRYERELKKLQAEV
+ 700 710 720 730 740 750
+
+ 80 90 100 110 120
+sp|Q1X PPRKRAKT------EDEKEQRRIERVLRNRAAAQTSRERKRLEME--KLENEKIQMEQQN
+ :.::. ..:...::. .. ::: :: ..:..: :.. ::..: .:.
+sp|O75 AEMKKAKVALMKQMREEQQRRRLVETKRNREIAQLKKEQRRQEFQIRALESQK----RQQ
+ 760 770 780 790 800
+
+ 130 140 150 160 170 180
+sp|Q1X QFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDEL
+ ...:.: .: . ::.. ... .: : . :: : : .: . : .
+sp|O75 EMVLRRKTQEVSALRRLAKPMSERVAGRAGLK--PPMLDSGAEVSASTTSSEAESGARSV
+ 810 820 830 840 850 860
+
+ 190 200 210 220 230 240
+sp|Q1X PLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHH
+
+sp|O75 SSIVRQWNRKINHFLGDHPAPTVNGTRPARKKFQKKGASQSFSKAARLKWQSLERRIIDI
+ 870 880 890 900 910 920
+
+>>sp|O14273|YET4_SCHPO Meiotically up-regulated protein (647 aa)
+ initn: 116 init1: 50 opt: 137 Z-score: 135.8 bits: 34.5 E(516081): 4.8
+Smith-Waterman score: 137; 22.2% identity (59.1% similar) in 198 aa overlap (26-217:1-186)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ .:..: .. .. ... . .:: .:. ..
+sp|O14 MTTNPDIVKQTKNEIHQVTSRVQEKLDSKSTNAVE
+ 10 20 30
+
+ 70 80 90 100 110 120
+sp|Q1X QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+ :. .... .. :. .. ... . .. :::..: .: : .. : ::
+sp|O14 QNNNSSQASVTKDNKKKAA-KRAKKKAAKKKKQSAAASASST----PVE--EAQHAQEEQ
+ 40 50 60 70 80
+
+ 130 140 150 160 170
+sp|Q1X QNQFLLQR--LSQ--MEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFK
+ :.: .::. ..: .: . ..... : .:. . :. .. : ..:.... : .::
+sp|O14 QEQTILQEPGFTQTIVEKDADQVDEPLEPIASSALGT-VEPPTDNKPSASTSTAVPT--T
+ 90 100 110 120 130 140
+
+ 180 190 200 210 220 230
+sp|Q1X QERDELPLERIPFPTPSLSDYSPTLKPSTLAESSD--VAQHPAVSVAGLEGDGSALPLFD
+ . :. : : .:: :. : . : .. ..:.: ::.: :
+sp|O14 EARNTSITE--PANSPSSSSSSASTKSTATTQSADYVVAEHFAPQRNDEQLGNSPASITS
+ 150 160 170 180 190 200
+
+ 240 250 260 270 280 290
+sp|Q1X LGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDS
+
+sp|O14 KPATTSAAQPSSKVEENMAKATSQPITTAEKEIPELKPIEPEAIMISKEINTTHDQAAAT
+ 210 220 230 240 250 260
+
+>>sp|P19880|YAP1_YEAST AP-1-like transcription factor YA (650 aa)
+ initn: 100 init1: 66 opt: 137 Z-score: 135.8 bits: 34.5 E(516081): 4.8
+Smith-Waterman score: 140; 23.1% identity (54.9% similar) in 273 aa overlap (28-297:13-259)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTS-LNSADVKTQEVKPEEKKPAKKRKSW
+ :::.. . .... . .:.. :... . .
+sp|P19 MSVSTAKRSLDVVSPGSLAEFEGSKSRHDEIENEHRRTGTRD---
+ 10 20 30 40
+
+ 60 70 80 90 100 110
+sp|Q1X GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME
+ :.. :: . : .: .: . . .:. .:::: .. ::::. .:..:: .:.:
+sp|P19 GEDSEQPKKK--GSKTSKKQDLDPETKQKRTAQNRAAQRAFRERKERKMKELE-KKVQSL
+ 50 60 70 80 90
+
+ 120 130 140 150 160 170
+sp|Q1X QQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQER
+ .. : .: :.: . : .:: :. :.. : .: .. :.: ..
+sp|P19 ESIQ------QQNEVEATFLRDQLITLVNELKKYRPETRNDSKVLEYLARRDPNLHFSKN
+ 100 110 120 130 140 150
+
+ 180 190 200 210 220 230
+sp|Q1X DELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDL
+ . . :. ::. .: . ..: . . . :.: :..:.. ..:..:
+sp|P19 NVNHSNSEPIDTPN-DDIQENVKQ----KMNFTFQYP------LDNDNDNDNSKNVGKQL
+ 160 170 180 190 200
+
+ 240 250 260 270 280 290
+sp|Q1X KHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAF--DVLEGGDLSAFPFDSMVN
+ . . .::. .:. . :.. .::. :.:. :::.. :. .: . :
+sp|P19 PSPNDPSHSAPM---PINQTQKKLSDATDSSSATLDSLSNSNDVLNNTPNSSTSMDWLDN
+ 210 220 230 240 250
+
+ 300 310 320 330 340
+sp|Q1X FDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|P19 VIYTNRFVSGDDGSNSKTKNLDSNMFSNDFNFENQFDEQVSEFCSKMNQVCGTRQCPIPK
+ 260 270 280 290 300 310
+
+>>sp|Q6IPM2|IQCE_HUMAN IQ domain-containing protein E OS (695 aa)
+ initn: 66 init1: 66 opt: 137 Z-score: 135.4 bits: 34.5 E(516081): 5.1
+Smith-Waterman score: 137; 22.3% identity (50.0% similar) in 238 aa overlap (34-268:455-686)
+
+ 10 20 30 40 50 60
+sp|Q1X DMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQEL
+ .:.: . ::.: :::. . .:::
+sp|Q6I KADLEKELECAREGEEERREREEVLREEIQTLTSKLQELQEMKKEEKEDCPEVPHKAQEL
+ 430 440 450 460 470 480
+
+ 70 80 90 100 110 120
+sp|Q1X PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQ
+ :.: : .: .: . : . : :. . .:. .. . . . . ....
+sp|Q6I PAPT----PSSRHCEQDWPPDSSEEGLPRPRSPCSDGRRDAAARVLQAQWKVYKHKKKKA
+ 490 500 510 520 530 540
+
+ 130 140 150 160 170 180
+sp|Q1X FLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPT-LTPTLFKQER-DE
+ : . ..: . ::....::. . .:: : .::. .:. . : .
+sp|Q6I VLDEAAVVLQAAFRGHLTRTKLLASKAHGSEPPS-VPGLPDQSSPVPRVPSPIAQATGSP
+ 550 560 570 580 590
+
+ 190 200 210 220 230 240
+sp|Q1X LPLERIPFPTPSLSDYSPTLKPSTLAE-SSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK
+ . : : . .: . . :. .. .. .:. :... .::.:. :.. :
+sp|Q6I VQEEAIVIIQSALRAHLARARHSATGKRTTTAASTRRRSASATHGDASSPPFLAALPD-P
+ 600 610 620 630 640 650
+
+ 250 260 270 280 290 300
+sp|Q1X HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS
+ : .. ::: :: : : . :
+sp|Q6I SPSGPQALAPLPGDDVNSDDSDDIVIAPSLPTKNFPV
+ 660 670 680 690
+
+>>sp|Q98UK4|MAF_DANRE Transcription factor Maf OS=Danio (327 aa)
+ initn: 88 init1: 88 opt: 132 Z-score: 135.1 bits: 33.4 E(516081): 5.3
+Smith-Waterman score: 132; 31.2% identity (61.3% similar) in 93 aa overlap (83-175:243-326)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .:.: :.:.::. ::. : .. . . ::
+sp|Q98 RFSDEQLVNMSVRELNRQLRGVSKEEVIRLKQKR--RTLKNRGYAQSCRYKRVQQRHVLE
+ 220 230 240 250 260 270
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ .:: :. :: . : :..:.. : . ... .: . : : : :: . .:. .:
+sp|Q98 GEKTQLMQQVDHLKQEISRLVRERDAYKEKYEKLISS--GFREN----GSSSDNNPS-SP
+ 280 290 300 310 320
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+ .:
+sp|Q98 EFFM
+
+
+>>sp|Q556Q3|IRLF_DICDI Probable serine/threonine-protein (1400 aa)
+ initn: 120 init1: 84 opt: 141 Z-score: 135.0 bits: 35.4 E(516081): 5.3
+Smith-Waterman score: 141; 17.9% identity (58.7% similar) in 184 aa overlap (6-186:661-844)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSL
+ : .. : . . :. : . .: . . .
+sp|Q55 DLLFGVINDRLKAPIFINKDKYESLYFVYQEDYQNPSDPFRVLPTRSVDLSKISEGISRM
+ 640 650 660 670 680 690
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAK-KRKSWGQELPVPKTNLPPRKRAKTEDEKEQ--RRIERVLR
+ .. : .. : :..: : :.:. ..: : . .. . : ::.: .. . . .
+sp|Q55 KNDDFLNELEKEEKQKKLKTKQKKKIKKLENEKKQKVLQQDKQQEKEKKQNYQQPQDLQQ
+ 700 710 720 730 740 750
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ . ::...... .... .... :..::.: :. .:....... .:: : .. ..
+sp|Q55 HNLKIQTQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQSQQQQQQQQSPQQQSQQQS
+ 760 770 780 790 800 810
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+ .... . : .: .:.... : ..
+sp|Q55 QQSQQKSQQQSQQKSQQQSPPQQQQQQSQQPQQQSQQQSQQKQKHQKQQQQQKQEKQQQK
+ 820 830 840 850 860 870
+
+ 220 230 240 250 260 270
+sp|Q1X AQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV
+
+sp|Q55 QEKQQQKQEKPQQKQQLENQIKNLKIEIKKEEENNKEIKNKKEEVEKEKEENNKEIKSKS
+ 880 890 900 910 920 930
+
+>>sp|P14233|TGA1B_TOBAC TGACG-sequence-specific DNA-bind (242 aa)
+ initn: 103 init1: 103 opt: 130 Z-score: 135.0 bits: 32.9 E(516081): 5.4
+Smith-Waterman score: 130; 39.7% identity (68.3% similar) in 63 aa overlap (80-142:181-242)
+
+ 50 60 70 80 90 100
+sp|Q1X KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ :: :..: :..::: .:: ::.::. .:
+sp|P14 LKRKKSSEDSNNINIHQKLTNVALSDNVNNDEDEKKRA-RLVRNRESAQLSRQRKKHYVE
+ 160 170 180 190 200
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPT
+ .::.. :.. : : ... . ::: :. :
+sp|P14 ELEDKVRIMHSTIQDLNAKVAYIIAENATLKTQ
+ 210 220 230 240
+
+ 170 180 190 200 210 220
+sp|Q1X LTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSA
+
+>>sp|Q8CH25|SLTM_MOUSE SAFB-like transcription modulator (1031 aa)
+ initn: 228 init1: 106 opt: 139 Z-score: 134.9 bits: 35.0 E(516081): 5.4
+Smith-Waterman score: 139; 35.7% identity (63.1% similar) in 84 aa overlap (73-153:644-724)
+
+ 50 60 70 80 90 100
+sp|Q1X QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-
+ :.: . :.:.: ::. :.: . :
+sp|Q8C LREHLVRFERLKQAVEFRRRKEIAERERRERERIRIIREREER--ERLQRERERLEIERQ
+ 620 630 640 650 660 670
+
+ 110 120 130 140 150
+sp|Q1X --ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPM
+ ::.:.: :.:: :.:..::. . .:... . : : .::: . : :.:
+sp|Q8C KLERERMERERLERERIRIEQERRREAERIAREREELRRQQQQL-RYEQEKRNSLKRPRD
+ 680 690 700 710 720 730
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+
+sp|Q8C VDHRRDDPYWSENKKLSLDTEARFGHGSDYRQQSRFLDFSHRERARFPDTASVQSSFERR
+ 740 750 760 770 780 790
+
+>>sp|O81025|P2A03_ARATH Putative protein PHLOEM PROTEIN (463 aa)
+ initn: 79 init1: 49 opt: 134 Z-score: 134.9 bits: 33.8 E(516081): 5.4
+Smith-Waterman score: 134; 29.4% identity (57.5% similar) in 153 aa overlap (4-149:135-280)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSL--PATPASEVPVLTVSPA
+ :.:. ...:. . : . :: . .
+sp|O81 KEEESTVNTLQCIFGSQILDYCIVVFTGGDDLEEDDQTLDDYFRAGCPEFLTKVLRLCGG
+ 110 120 130 140 150 160
+
+ 40 50 60 70 80
+sp|Q1X DTSLNSADVKTQEVKPEEKKPAKKR-KSWGQELP-VPKTNLPPRKRAKTEDEKEQRRIER
+ : . : .. : :. : : .. :.. .: : :: : :.... :. ::
+sp|O81 RKVLFDNKSKDEKKKVEQVKQLLARVENVGEQTGGIPYTYQLHRK-IKEENDERLREEER
+ 170 180 190 200 210 220
+
+ 90 100 110 120 130 140
+sp|Q1X VL--RNRAAAQTSRERKRLEMEKLENEKIQMEQ-QNQFLLQRLSQMEAENNRLSQQLAQL
+ :. .::: :. .. .. : ::: ::.:::. .:. : ..: ::... . :. :.
+sp|O81 VIESKNRAEAELAEMQQNLLMEK---EKLQMEEAKNK---QLIAQAEANEKLMEQERAKN
+ 230 240 250 260 270
+
+ 150 160 170 180 190 200
+sp|Q1X AAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTL
+ ::
+sp|O81 RAETELAAVMVEKLQMEEEKNKQLIAQANRMICARDLNIEWSHSEEHWKWVNLDHNISSN
+ 280 290 300 310 320 330
+
+>>sp|P20226|TBP_HUMAN TATA-box-binding protein OS=Homo s (339 aa)
+ initn: 101 init1: 71 opt: 132 Z-score: 134.9 bits: 33.4 E(516081): 5.4
+Smith-Waterman score: 132; 24.8% identity (58.4% similar) in 125 aa overlap (91-212:43-161)
+
+ 70 80 90 100 110 120
+sp|Q1X QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+ ..: . . .:..: .... .... :..:
+sp|P20 GLASPQGAMTPGIPIFSPMMPYGTGLTPQPIQNTNSLSILEEQQRQQQQQQQQQQQQQQQ
+ 20 30 40 50 60 70
+
+ 130 140 150 160 170
+sp|Q1X QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFK-QER
+ :.: :. .:.. .... .:: : :: :. : .. :. . : : ::. :
+sp|P20 QQQQQQQQQQQQQQQQQQQQQQQAVAAAAVQQSTSQQATQGTSGQA-----PQLFHSQTL
+ 80 90 100 110 120
+
+ 180 190 200 210 220 230
+sp|Q1X DELPLE-RIP-FPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGS
+ :: : .:.: .. ..: . .::: .
+sp|P20 TTAPLPGTTPLYPSP-MTPMTPITPATPASESSGIVPQLQNIVSTVNLGCKLDLKTIALR
+ 130 140 150 160 170 180
+
+ 240 250 260 270 280 290
+sp|Q1X DLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVN
+
+sp|P20 ARNAEYNPKRFAAVIMRIREPRTTALIFSSGKMVCTGAKSEEQSRLAARKYARVVQKLGF
+ 190 200 210 220 230 240
+
+>>sp|Q4WG58|PAN1_ASPFU Actin cytoskeleton-regulatory com (1467 aa)
+ initn: 53 init1: 53 opt: 141 Z-score: 134.7 bits: 35.5 E(516081): 5.5
+Smith-Waterman score: 141; 23.3% identity (51.1% similar) in 227 aa overlap (38-257:1078-1294)
+
+ 10 20 30 40 50 60
+sp|Q1X TMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK
+ :. . .:. :.. . .. ... :
+sp|Q4W TITAEQAAREQAIREEQQAQEEETNRLEMEAQKREEELLKEKEAQEARLRALEEQVRQGK
+ 1050 1060 1070 1080 1090 1100
+
+ 70 80 90 100 110 120
+sp|Q1X TNLPPRKRAKTEDEKEQRRIERVLR-NRAAAQTSRERKR---LEMEKLENEKIQMEQQNQ
+ .:: : : :. .. : .: .:: . ..::.: ::.:.:..:. . ..
+sp|Q4W IRKQEEKRRKEEAERLAKEKEAALAAQRAEIERAKERERQLQLELERLDEESSSDDEGPV
+ 1110 1120 1130 1140 1150 1160
+
+ 130 140 150 160 170 180
+sp|Q1X FLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD-EL
+ . : . :: : .. . : .. . ::: .: :. :: : . .
+sp|Q4W NITP-----EDSTPTQSQLLPTVTPAAPVSAPESEQAGSPEDTSSQAPPVDFKLETESKN
+ 1170 1180 1190 1200 1210 1220
+
+ 190 200 210 220 230 240
+sp|Q1X PLERIPFPTPSLSDYS--PTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK
+ : .: . . . : :. .:: . ..:: : . : . .. : : .. :.
+sp|Q4W PYFKITHQATDTQVVSSPPVPQPSFTSPKADV--HSTNPFHRLAKQETSKPAFTGSAPLE
+ 1230 1240 1250 1260 1270 1280
+
+ 250 260 270 280 290 300
+sp|Q1X HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS
+ ..: : : .:::..
+sp|Q4W RKSR---ARPEADDDWSAAGSEFDSSDDDDDERPGGGSAKQLASILFGTMAPPRPLSAMD
+ 1290 1300 1310 1320 1330
+
+>>sp|B0YC95|PAN1_ASPFC Actin cytoskeleton-regulatory com (1467 aa)
+ initn: 53 init1: 53 opt: 141 Z-score: 134.7 bits: 35.5 E(516081): 5.5
+Smith-Waterman score: 141; 23.3% identity (51.1% similar) in 227 aa overlap (38-257:1078-1294)
+
+ 10 20 30 40 50 60
+sp|Q1X TMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK
+ :. . .:. :.. . .. ... :
+sp|B0Y TITAEQAAREQAIREEQQAQEEETNRLEMEAQKREEELLKEKEAQEARLRALEEQVRQGK
+ 1050 1060 1070 1080 1090 1100
+
+ 70 80 90 100 110 120
+sp|Q1X TNLPPRKRAKTEDEKEQRRIERVLR-NRAAAQTSRERKR---LEMEKLENEKIQMEQQNQ
+ .:: : : :. .. : .: .:: . ..::.: ::.:.:..:. . ..
+sp|B0Y IRKQEEKRRKEEAERLAKEKEAALAAQRAEIERAKERERQLQLELERLDEESSSDDEGPV
+ 1110 1120 1130 1140 1150 1160
+
+ 130 140 150 160 170 180
+sp|Q1X FLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD-EL
+ . : . :: : .. . : .. . ::: .: :. :: : . .
+sp|B0Y NITP-----EDSTPTQSQLLPTVTPAAPVSAPESEQAGSPEDTSSQAPPVDFKLETESKN
+ 1170 1180 1190 1200 1210 1220
+
+ 190 200 210 220 230 240
+sp|Q1X PLERIPFPTPSLSDYS--PTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK
+ : .: . . . : :. .:: . ..:: : . : . .. : : .. :.
+sp|B0Y PYFKITHQATDTQVVSSPPVPQPSFTSPKADV--HSTNPFHRLAKQETSKPAFTGSAPLE
+ 1230 1240 1250 1260 1270 1280
+
+ 250 260 270 280 290 300
+sp|Q1X HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS
+ ..: : : .:::..
+sp|B0Y RKSR---ARPEADDDWSAAGSEFDSSDDDDDERPGGGSAKQLASILFGTMAPPRPLSAMD
+ 1290 1300 1310 1320 1330
+
+>>sp|Q00969|ATF2_RAT Cyclic AMP-dependent transcription (487 aa)
+ initn: 65 init1: 65 opt: 134 Z-score: 134.6 bits: 33.9 E(516081): 5.6
+Smith-Waterman score: 134; 26.9% identity (63.9% similar) in 108 aa overlap (41-143:288-394)
+
+ 20 30 40 50 60
+sp|Q1X SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEE-KKPAKKRK----SWGQELPV
+ ...: .:. ..:: . : .. :
+sp|Q00 MRLKAALTQQHPPVTNGDTVKGHGSGLVRAQSEESRPQSLQQPATSTTETPASPAHTTPQ
+ 260 270 280 290 300 310
+
+ 70 80 90 100 110 120
+sp|Q1X PKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL
+ ... :.:: .:: :.:: . . ::::::. :..... ...::.. .. . : :
+sp|Q00 TQNTSGRRRRAANEDPDEKRR-KFLERNRAAASRCRQKRKVWVQSLEKKAEDLSSLNGQL
+ 320 330 340 350 360 370
+
+ 130 140 150 160 170 180
+sp|Q1X LQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLE
+ .... .. : .:.: :
+sp|Q00 QSEVTLLRNEVAQLKQLLLAHKDCPVTAMQKKSGYHTADKDDSSEDLSVPSSPHTEAIQH
+ 380 390 400 410 420 430
+
+>>sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Homo s (591 aa)
+ initn: 219 init1: 100 opt: 143 Z-score: 141.9 bits: 35.5 E(516081): 2.2
+Smith-Waterman score: 143; 31.2% identity (63.4% similar) in 112 aa overlap (35-142:111-219)
+
+ 10 20 30 40 50 60
+sp|Q1X MEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQE-L
+ ::: .. . . . ::. ... .:: :
+sp|Q8N RDARQVYGLNFGSKEDANVFASAMMHALEVLNSQETGPTLPRQNSQLPAQVQNGPSQEEL
+ 90 100 110 120 130 140
+
+ 70 80 90 100 110 120
+sp|Q1X PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-ERKRLEMEKLENEKIQMEQQN
+ . . .: ..: : : :..:.:: .: . : ::.::: :.::.:... :.:.
+sp|Q8N EIQRRQLQEQQRQK---ELERERLERERMERERLERERLERERLERERLEQEQLERERQE
+ 150 160 170 180 190
+
+ 130 140 150 160 170 180
+sp|Q1X QFLLQRLSQME--AENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD
+ . .:: ..: ...:: .:
+sp|Q8N RERQERLERQERLERQERLERQERLDRERQERQERERLERLERERQERERQEQLEREQLE
+ 200 210 220 230 240 250
+
+>>sp|Q6MG48|BAT2_RAT Large proline-rich protein BAT2 OS= (2161 aa)
+ initn: 89 init1: 74 opt: 154 Z-score: 144.7 bits: 37.9 E(516081): 1.5
+Smith-Waterman score: 155; 24.2% identity (50.2% similar) in 215 aa overlap (18-229:378-575)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ .:.::.: .. ...: : . :
+sp|Q6M RDSDEEGAEGHKDSQSAAGEEPETDGKKGTSPGSELPPPKTAWTENSRPSETEPAAPPIP
+ 350 360 370 380 390 400
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRK---SWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERK
+ . : .: .:: : . :: : ::: : : .: :...... : .
+sp|Q6M KPPPPPPHRGPVGNWGPPGDYPDRGGPPCKPPAPEDEDEAWR-QR--RKQSSSEISLAVE
+ 410 420 430 440 450 460
+
+ 110 120 130 140 150 160
+sp|Q1X RLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPA
+ : . .. :.:. ..:.. ..:.... .... .: :: . .. : :. :
+sp|Q6M RARRRREEEERRMQEERRAACAEKLKRLD---EKFGAPDKRLKAEPAAPPVTPPAPALPP
+ 470 480 490 500 510 520
+
+ 170 180 190 200 210 220
+sp|Q1X TASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLE
+ .. : ::: :: : ::: . :. : . . .. : :: . .
+sp|Q6M VV-PKETPT-----PPALP--PTPTPTPEKDPEEPAHAPPVQSAPTQ-AGPPAPT--PVS
+ 530 540 550 560 570
+
+ 230 240 250 260 270 280
+sp|Q1X GDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEG
+ : :.:
+sp|Q6M GGGTASSTSSGSFEASPAEPQLPSKEGPEPPEEVPAPTTPPAPKVEPKGDGVGPTRQPPS
+ 580 590 600 610 620 630
+
+>>sp|P0C5H8|KAPC_EMENI Putative transcription factor kap (278 aa)
+ initn: 70 init1: 70 opt: 152 Z-score: 154.8 bits: 36.8 E(516081): 0.42
+Smith-Waterman score: 169; 22.3% identity (51.2% similar) in 260 aa overlap (17-274:49-268)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVK
+ : : :. :.:: : . . .. .
+sp|P0C DHADQVLHDSLLAAQHLSQHPQQPRPQQPNAQPHHLQPTATTSPRDQNNIDPAISGGAML
+ 20 30 40 50 60 70
+
+ 50 60 70 80 90 100
+sp|Q1X PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRL
+ : . ::. . . .: : :: .. .:. .:::: .. :.::.
+sp|P0C PPSQPPAQPEPTVEDETP------------KTYGKRPLSTSKRAAQNRAAQRAFRQRKES
+ 80 90 100 110 120
+
+ 110 120 130 140 150 160
+sp|Q1X EMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-MPGSPAT
+ ..::: :... . . . :. . ..::: .: . . .: ... :....: .::.
+sp|P0C YIRKLE-EQVK---EYEVMSQEYKALQAENYQLREYVINLQSRLLDSQGEVPELPGNIDL
+ 130 140 150 160 170 180
+
+ 170 180 190 200 210 220
+sp|Q1X ASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEG
+ .: : :. .: :.: .:. . :. : .:. .
+sp|P0C NQP----------RTEI---SVPQPAP---------RPGQAGASAPPQGSPQSQVSIAND
+ 190 200 210 220
+
+ 230 240 250 260 270 280
+sp|Q1X DGSALP-LFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEG
+ : ..: . . : ...: ... : ::.. : .:: ...:. . :
+sp|P0C DMNSLNRIAEAGLGMRKHPNEE--AFLSNNFQARRGRGDETADPSETKTEPPTHGLPMVS
+ 230 240 250 260 270
+
+ 290 300 310 320 330 340
+sp|Q1X GDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAG
+
+>>sp|Q9M7Q3|AI5L6_ARATH ABSCISIC ACID-INSENSITIVE 5-like (454 aa)
+ initn: 112 init1: 112 opt: 142 Z-score: 142.5 bits: 35.2 E(516081): 2
+Smith-Waterman score: 142; 31.7% identity (55.9% similar) in 145 aa overlap (14-145:291-435)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEV-P-VLTVS--PADTSLNSA-
+ : ::: .:: : .: . : ...: .:
+sp|Q9M QPQQLIQTQERPFPKQTTIAFSNTVDVVNRSQPATQCQEVKPSILGIHNHPMNNNLLQAV
+ 270 280 290 300 310 320
+
+ 40 50 60 70 80 90
+sp|Q1X DVKT----QEVKP-EEKKPAKKRKSW--GQELPVPKTNLPPRKRAKTEDEKEQRRIERVL
+ : :: :.: . .: :: .. ::: :: . . .. .:: .:..
+sp|Q9M DFKTGVTVAAVSPGSQMSPDLTPKSALDASLSPVPYMFGRVRKTGAVLEKVIERRQKRMI
+ 330 340 350 360 370 380
+
+ 100 110 120 130 140 150
+sp|Q1X RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ-MEAENNRLSQQLAQLAAEV
+ .:: .: :: ::. .:: : :... :. : .. . :: ..:.: . : :
+sp|Q9M KNRESAARSRARKQAYTMELEAEIAQLKELNEELQKKQVEIMEKQKNQLLEPLRQPWGMG
+ 390 400 410 420 430 440
+
+ 160 170 180 190 200 210
+sp|Q1X RGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+
+sp|Q9M CKRQCLRRTLTGPW
+ 450
+
+>>sp|Q6P9R4|ARHGI_MOUSE Rho guanine nucleotide exchange (1021 aa)
+ initn: 61 init1: 61 opt: 153 Z-score: 148.1 bits: 37.4 E(516081): 0.99
+Smith-Waterman score: 153; 24.0% identity (52.8% similar) in 246 aa overlap (9-250:628-858)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVP--VLTVSPADTSLN
+ : :..:::.. :. : :.: ::.
+sp|Q6P WQGPASSPDSRPCDNSAPSGCCEESPQAVEMPSTESLPTVLELELVHRVQTLSQLLLSLQ
+ 600 610 620 630 640 650
+
+ 40 50 60 70 80 90
+sp|Q1X SADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAA
+ .. . :. : .. : ... .: . :: ....:: .:. ..::.
+sp|Q6P AV-IAQQDSYVEMQRTAIQEREKQFRLQSTRGNL-------LLEQERQRNFEKQREERAG
+ 660 670 680 690 700
+
+ 100 110 120 130 140 150
+sp|Q1X AQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRAN
+ .. . . : :... : :. ...:. .. ::.. :.: .. :.: : .:.. .:
+sp|Q6P VEKLQSQLRQEQQRWERERARQQQELELAGARLQEREGEARQMRQRLDQERTELERQRQA
+ 710 720 730 740 750 760
+
+ 160 170 180 190 200 210
+sp|Q1X TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHP
+ . . .::..: : : : . .: : .:::.. ... :
+sp|Q6P YQHDLERLREAQRAVD----RERERLELLR-RFKKQNT--VPGALPPEVLAEAQPASHPP
+ 770 780 790 800 810 820
+
+ 220 230 240 250 260 270
+sp|Q1X AVSVAGLEGDGS-ALPLFDLGSDLKHHS-TDDVAAPLSDDDFNRLFHGDSSVEPDSSVFE
+ . . :::: .. : :: . : . :.: :
+sp|Q6P SFNGDGLEGHSAPAKAPGTQGSAMLHGTGPDNVERPEVARWDSAPPESRPAKSDVPIQLL
+ 830 840 850 860 870 880
+
+ 280 290 300 310 320 330
+sp|Q1X DGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTT
+
+sp|Q6P SATNQIQRQTAVQQQIPTKLAASTKGGKEKGSKSRGSQRWESSASFDLKQQLLLSKFIGK
+ 890 900 910 920 930 940
+
+>>sp|Q9NWH9|SLTM_HUMAN SAFB-like transcription modulator (1034 aa)
+ initn: 105 init1: 105 opt: 138 Z-score: 134.0 bits: 34.8 E(516081): 6.1
+Smith-Waterman score: 138; 35.7% identity (63.1% similar) in 84 aa overlap (73-153:645-725)
+
+ 50 60 70 80 90 100
+sp|Q1X QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-
+ :.: . :.:.: ::. :.: . :
+sp|Q9N LREHLVRFERLRRAMELRRRREIAERERRERERIRIIREREER--ERLQRERERLEIERQ
+ 620 630 640 650 660 670
+
+ 110 120 130 140 150
+sp|Q1X --ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPM
+ ::.:.: :.:: :.:..::. . .:... . : : .::: . : :.:
+sp|Q9N KLERERMERERLERERIRIEQERRKEAERIAREREELRRQQQQL-RYEQEKRNSLKRPRD
+ 680 690 700 710 720 730
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+
+sp|Q9N VDHRRDDPYWSENKKLSLDTDARFGHGSDYSRQQNRFNDFDHRERGRFPESSAVQSSSFE
+ 740 750 760 770 780 790
+
+>>sp|O60308|K0562_HUMAN Uncharacterized protein KIAA0562 (925 aa)
+ initn: 42 init1: 42 opt: 137 Z-score: 133.7 bits: 34.6 E(516081): 6.3
+Smith-Waterman score: 137; 25.1% identity (49.8% similar) in 271 aa overlap (70-317:217-472)
+
+ 40 50 60 70 80 90
+sp|Q1X VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQT
+ : ::: .. :. . ... . : :
+sp|O60 YARKSDYISPLDDLAFDMYQDPEVAQIIRKLDERKREAVQKERYDY-AKKLKQAIADLQK
+ 190 200 210 220 230 240
+
+ 100 110 120 130 140 150
+sp|Q1X SRER-KRLEMEK---LENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA
+ :: : :.:: .:.: .. .... :.. :..:: . . . : ::.
+sp|O60 VGERLGRYEVEKRCAVEKEDYDLAKEKK---QQMEQYRAEVYEQLELHSLLDAELMRRPF
+ 250 260 270 280 290 300
+
+ 160 170 180 190 200
+sp|Q1X NTPM-P----GSPATASPTLTPTLFK-QERDELPLERIPFPTPSLSDYSPTLKPS-----
+ . :. : ::: .: :.: . .:: :: . :.:: :..:.
+sp|O60 DLPLQPLARSGSPCHQKPM--PSLPQLEERGTENQFAEPFLQEKPSSYSLTISPQHSAVD
+ 310 320 330 340 350 360
+
+ 210 220 230 240 250 260
+sp|Q1X TLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAP-LSDDDFNRLFHGD
+ : ..: :: ... .: : :: ...: . :. : .:. :.. .:
+sp|O60 PLLPATD--PHPKINAESLPYDERPLPA------IRKHYGEAVVEPEMSNADISDARRGG
+ 370 380 390 400 410
+
+ 270 280 290 300 310
+sp|Q1X SSVEPD----SSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPV---TLEGIEMAHGLPD
+ ::. ... : . :.::: : : : . . .. . . . . .:: : :
+sp|O60 MLGEPEPLTEKALREASSAIDVL-GETLVAEAYCKTWSYREDALLALSKKLMEMPVGTPK
+ 420 430 440 450 460 470
+
+ 320 330 340
+sp|Q1X ETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ :
+sp|O60 EDLKNTLRASVFLVRRAIKDIVTSVFQASLKLLKMIITQYIPKHKLSKLETAHCVERTIP
+ 480 490 500 510 520 530
+
+>>sp|A2Z0Q0|HOX25_ORYSI Homeobox-leucine zipper protein (260 aa)
+ initn: 43 init1: 43 opt: 129 Z-score: 133.6 bits: 32.8 E(516081): 6.4
+Smith-Waterman score: 129; 24.1% identity (57.8% similar) in 249 aa overlap (53-294:21-254)
+
+ 30 40 50 60 70 80
+sp|Q1X VPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK
+ :.::. .... . . .. .:: : : :.
+sp|A2Z MEDLVDELYGVDEQGSSSAAARKRRLTAEQVRALERSFEEEKR-KLEPER
+ 10 20 30 40
+
+ 90 100 110 120 130 140
+sp|Q1X EQRRIER--VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLS
+ ... .: . ..:. . .: : . ..:: . ... .. :: . . :.:. :
+sp|A2Z KSELARRLGIAPRQVAVWFQNRRARWKTKQLELDFDRLRAAHDELLAGRAALAADNESLR
+ 50 60 70 80 90 100
+
+ 150 160 170 180 190 200
+sp|Q1X QQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPT
+ .:. :. ..... ...: : ::: : : .:. .. .. . ::. : : . .
+sp|A2Z SQVILLTEKLQAN-GKSPSP-SPAPAEQTAVPAAPESAKS-FQLEE----GRCLYDAAGS
+ 110 120 130 140 150 160
+
+ 210 220 230 240 250
+sp|Q1X LKPSTLAESSDVAQHPAVSVAGLEGDGSALP--LFDLGSDLKHHSTDDVAAPLSDDDF--
+ .: . .. ::. ::. ::. .. .. : : . . : :: .. ::::.
+sp|A2Z TT-TTNGGGGGVAM-PAARVAAARAASNDSPESYFAGARSPPSSSEDDCGGAGSDDDYPS
+ 170 180 190 200 210 220
+
+ 260 270 280 290 300 310
+sp|Q1X -NRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLP
+ . :. :... :. :: ..: : ..: : :..:
+sp|A2Z SSVLLPVDATLVGDA--FEHAVAATV--AADEEA-PLNSWEWFWN
+ 230 240 250 260
+
+ 320 330 340
+sp|Q1X DETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+>>sp|Q6Y7W6|PERQ2_HUMAN PERQ amino acid-rich with GYF do (1299 aa)
+ initn: 85 init1: 85 opt: 140 Z-score: 134.5 bits: 35.2 E(516081): 5.7
+Smith-Waterman score: 140; 31.2% identity (58.9% similar) in 141 aa overlap (48-180:825-957)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK
+ :... ..:.. :: . : . : :.
+sp|Q6Y RRQREQEIALRRQREEEERQQQEEALRRLEERRREEEERRK--QEELLRKQEEEAAKWAR
+ 800 810 820 830 840 850
+
+ 80 90 100 110 120 130
+sp|Q1X TEDEKEQRRIERVLRNRAAAQTSR----ERKRLEME-KLENEKIQMEQQNQFLLQRLSQM
+ :.: ..: : :: . : : :::: :.: . ..: ....::.: :.::.:.
+sp|Q6Y EEEEAQRRLEENRLRMEEEAARLRHEEEERKRKELEVQRQKELMRQRQQQQEALRRLQQQ
+ 860 870 880 890 900 910
+
+ 140 150 160 170 180
+sp|Q1X EAENNRLSQQLAQL---AAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF
+ . . :::::. .. . :...:: : :: : . : ..::.
+sp|Q6Y QQQ-----QQLAQMKLPSSSTWGQQSNTTACQSQATLSLAEIQKL-EEERERQLREEQRR
+ 920 930 940 950 960
+
+ 190 200 210 220 230 240
+sp|Q1X PTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAA
+
+sp|Q6Y QQRELMKALQQQQQQQQQKLSGWGNVSKPSGTTKSLLEIQQEEARQMQKQQQQQQQHQQP
+ 970 980 990 1000 1010 1020
+
+>>sp|Q4WA21|KAPC_ASPFU Putative transcription factor kap (280 aa)
+ initn: 101 init1: 67 opt: 132 Z-score: 136.0 bits: 33.3 E(516081): 4.7
+Smith-Waterman score: 132; 23.7% identity (54.5% similar) in 156 aa overlap (66-216:75-214)
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP----RKRAKTEDEKEQRRIERVL
+ :.: : .. :: .. .:.
+sp|Q4W QPPHMQPNTPARDQNNIDPAISGATMLTGPPQTPTQPDVTGQETPKTYGKRPLSTSKRAA
+ 50 60 70 80 90 100
+
+ 100 110 120 130 140 150
+sp|Q1X RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR
+ .:::: .. :.::. ....::. :.. .. . . .. ..::: .: . . .: ...
+sp|Q4W QNRAAQRAFRQRKEAHIRELEG-KVKAYES---MGEAIKALQAENYQLREYIINLQSRLL
+ 110 120 130 140 150 160
+
+ 160 170 180 190 200 210
+sp|Q1X GSRANTP-MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+ :....: .::. ..: :.:.:. :: . . : :. :
+sp|Q4W DSQGEVPELPGNIDLSQP----------RSEIPVPPIPNSGTATTTAPPPTAPQQPQPSH
+ 170 180 190 200 210
+
+ 220 230 240 250 260 270
+sp|Q1X DVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDS
+ :: :
+sp|Q4W --AQAPTSNDDMNSLNRIAVAGLGMRKPPTEEANYLGNNFQAQARRVRPDEGQPEASELP
+ 220 230 240 250 260
+
+>>sp|Q9QXL1|KI21B_MOUSE Kinesin-like protein KIF21B OS=M (1668 aa)
+ initn: 66 init1: 66 opt: 140 Z-score: 133.1 bits: 35.3 E(516081): 6.9
+Smith-Waterman score: 140; 25.5% identity (62.0% similar) in 137 aa overlap (41-169:724-856)
+
+ 20 30 40 50 60 70
+sp|Q1X SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNL
+ : : .. :. . :... . .:: ....
+sp|Q9Q STMECYTEEKANKIKADYEKRLREMNRDLQKLQAAQKEHARLLKNQSRYERELKKLQAEV
+ 700 710 720 730 740 750
+
+ 80 90 100 110 120
+sp|Q1X PPRKRAKT------EDEKEQRRIERVLRNRAAAQTSRERKRLEME--KLENEKIQMEQQN
+ :.::. ..:...::. .. ::: :: ..:..: :.. ::..: .:.
+sp|Q9Q AEMKKAKVALMKQMREEQQRRRLVETKRNREIAQLKKEQRRQEFQIRALESQK----RQQ
+ 760 770 780 790 800
+
+ 130 140 150 160 170 180
+sp|Q1X QFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDEL
+ ...:.: .: . ::.. ... .: : . . :. ..:: :
+sp|Q9Q EIVLRRKTQEVSALRRLAKPMSERVAGRVGLKPPNMDSGAEVSASTTSSEAESGARSVSS
+ 810 820 830 840 850 860
+
+ 190 200 210 220 230 240
+sp|Q1X PLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHH
+
+sp|Q9Q IVRQWNRKIDHFLGDRPTATVNGGRPARKKFQKKGASQSFSKAARLKWQSLERRIIDIVM
+ 870 880 890 900 910 920
+
+>>sp|P21127|CD11B_HUMAN Cell division protein kinase 11B (795 aa)
+ initn: 68 init1: 68 opt: 135 Z-score: 132.7 bits: 34.2 E(516081): 7.2
+Smith-Waterman score: 135; 27.6% identity (53.0% similar) in 181 aa overlap (41-208:96-272)
+
+ 20 30 40 50 60
+sp|Q1X SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQE------LP
+ :... : :..: ....: . : .
+sp|P21 PYRREDSMEDRGEEDDSLAIKPPQQMSRKEKVHHRKDEKRKEKRRHRSHSAEGGKHARVK
+ 70 80 90 100 110 120
+
+ 70 80 90 100 110 120
+sp|Q1X VPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-ERKRLEM--EKLENEKIQMEQQ
+ . . ::: . :..: .:. :: : . : . :: :: :::. .: : :. . :::
+sp|P21 EKEREHERRKRHREEQDKARREWERQKRREMAREHSRRERDRLEQLERKRERERKMREQQ
+ 130 140 150 160 170 180
+
+ 130 140 150 160 170
+sp|Q1X NQFLLQRLSQMEAENNRLSQQLA-QLAAEVRGSRAN--TPMPGSPATASPTLTPTLFKQE
+ .. :. . .::. : .. ...:. : : . . .: . :: : .:
+sp|P21 KEQREQKERERRAEERRKEREARREVSAHHRTMREDYSDKVKASHWSRSPPRPP----RE
+ 190 200 210 220 230 240
+
+ 180 190 200 210 220 230
+sp|Q1X RDELPLERIPFPT-PSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGS
+ : :: : : . :. .. :: . :
+sp|P21 RFELGDGRKPGEARPARAQKPAQLKEEKMEERDLLSDLQDISDSERKTSSAESSSAESGS
+ 250 260 270 280 290 300
+
+ 240 250 260 270 280 290
+sp|Q1X DLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVN
+
+sp|P21 GSEEEEEEEEEEEEEGSTSEESEEEEEEEEEEEEETGSNSEEASEQSAEEVSEEEMSEDE
+ 310 320 330 340 350 360
+
+>>sp|Q789F3|MAF_CHICK Transcription factor Maf OS=Gallus (359 aa)
+ initn: 87 init1: 87 opt: 130 Z-score: 132.7 bits: 33.0 E(516081): 7.2
+Smith-Waterman score: 130; 30.5% identity (67.1% similar) in 82 aa overlap (83-163:276-355)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .:.: :.:.::. ::. : .. . . ::
+sp|Q78 RFSDEQLVTMSVRELNRQLRGVSKEEVIRLKQKR--RTLKNRGYAQSCRFKRVQQRHVLE
+ 250 260 270 280 290 300
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPMPGSPATASPTLT
+ .:: :. :: . : :..:.. : . ... .:... : . ... :.::
+sp|Q78 SEKNQLLQQVEHLKQEISRLVRERDAYKEKYEKLVSNGFRENGSSSDNPSSPEFFM
+ 310 320 330 340 350
+
+ 180 190 200 210 220 230
+sp|Q1X PTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALP
+
+>>sp|Q6A000|K0753_MOUSE Uncharacterized protein KIAA0753 (959 aa)
+ initn: 70 init1: 70 opt: 136 Z-score: 132.5 bits: 34.4 E(516081): 7.3
+Smith-Waterman score: 136; 25.7% identity (51.0% similar) in 253 aa overlap (39-269:542-766)
+
+ 10 20 30 40 50 60
+sp|Q1X MSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRK--SWGQELPVP
+ : .. . :. .: . : .:
+sp|Q6A RNRPNQPYSKSRLQQTTVSSRLKMNRQPMKDHRAPWIPPNPTSPPASPKCAAWM------
+ 520 530 540 550 560
+
+ 70 80 90 100 110
+sp|Q1X KTNLPPRKRAKTED-EKEQRRIERVLRNRAAAQTSR-------ERKRL-EMEKLENEKIQ
+ :.. :: :: .. ..:. . : ::. : ...: ::: :.:.:: ....
+sp|Q6A KVKYSPRDAAKEQSLQQEDIHKESQLRGDAEQEAARLSWPDAESSKRLKELEELEAKEME
+ 570 580 590 600 610 620
+
+ 120 130 140 150 160 170
+sp|Q1X MEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV-----RGSRANTPMPGSPATAS-PTLT
+ .:. :::. .:::..: ...: .: :: . : . : . . : :
+sp|Q6A RKQK-----QRLNWLEAETSRRTKELDELKAEEMDRLQKLSVSATQLADKVEEAVLERLK
+ 630 640 650 660 670 680
+
+ 180 190 200 210 220 230
+sp|Q1X PTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALP
+ : :.: .: . .: . :.: .:: : . : .:: ... . .. .:
+sp|Q6A PLLIKAQRVNSSVE----ANSHLKD-----RPSRHAAA---AAQPAEQASDVPFESRNIP
+ 690 700 710 720
+
+ 240 250 260 270 280
+sp|Q1X -----LFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGD
+ : : . .: .. : . :... :: :::. ::
+sp|Q6A QLRDCLEDTAHELWARTQDKI---LGSETSARL--GDSKDSPDLETMMLRMEEMEKYQET
+ 730 740 750 760 770 780
+
+ 290 300 310 320 330 340
+sp|Q1X LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q6A VRQRYNKIVYADPHLWMHEERNDQNTPAVSEGPLASHPIKITKTATQKCPAVNILLERPC
+ 790 800 810 820 830 840
+
+>>sp|P23091|MAF_AVIS4 Transforming protein Maf OS=Avian (369 aa)
+ initn: 87 init1: 87 opt: 130 Z-score: 132.5 bits: 33.1 E(516081): 7.4
+Smith-Waterman score: 130; 30.5% identity (67.1% similar) in 82 aa overlap (83-163:276-355)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .:.: :.:.::. ::. : .. . . ::
+sp|P23 RFSDEQLVTMSMRELNRQLRGVSKEEVIRLKQKR--RTLKNRGYAQSCRFKRVQQRHVLE
+ 250 260 270 280 290 300
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPMPGSPATASPTLT
+ .:: :. :: . : :..:.. : . ... .:... : . ... :.::
+sp|P23 SEKNQLLQQVEHLKQEISRLVRERDAYKEKYEKLVSNGFRENGSSSDNPSSPEFFMYPRE
+ 310 320 330 340 350 360
+
+ 180 190 200 210 220 230
+sp|Q1X PTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALP
+
+sp|P23 SSTTVM
+
+
+>>sp|Q5RCJ1|CIP4_PONAB Cdc42-interacting protein 4 OS=Po (601 aa)
+ initn: 111 init1: 73 opt: 149 Z-score: 147.5 bits: 36.5 E(516081): 1.1
+Smith-Waterman score: 149; 25.4% identity (54.2% similar) in 177 aa overlap (29-186:294-463)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKR-K
+ .:.:.::.. .. .:: . :...: :
+sp|Q5R DSQVLIELHKSGFARPGDVEFEDFSQPMNRAPSDSSLGTP----SDGRPELRGPGRSRTK
+ 270 280 290 300 310
+
+ 60 70 80 90 100
+sp|Q1X SW--GQEL------------PVPKT--NLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ : :.. :::.. : :: :. . .: . .. : :. :
+sp|Q5R RWPFGKKNKPRPPPLSPLGGPVPSALPNGPPSPRSGRDPLAILSEISKSVKPRLASFRSL
+ 320 330 340 350 360 370
+
+ 110 120 130 140 150
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA--EVRGSRANTPM
+ . .: . . .. ::: . : : :.: .. .:.... : : ... .::.
+sp|Q5R RGSRGTVVTEDFSHLPPEQQRKRLQQ---QLEERSRELQKEVDQREALKKMKDVYEKTPQ
+ 380 390 400 410 420 430
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::. : .: :: . :: .: ...
+sp|Q5R MGDPASLEPQITETLSNIERLKLEVQKYEAWLAEAESRVLSNRGDSLSRHARPPDPPTSA
+ 440 450 460 470 480 490
+
+>>sp|P23050|FOS_AVINK p55-v-Fos-transforming protein OS= (322 aa)
+ initn: 77 init1: 46 opt: 129 Z-score: 132.4 bits: 32.8 E(516081): 7.5
+Smith-Waterman score: 129; 22.5% identity (49.7% similar) in 306 aa overlap (2-291:12-294)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVSPADTSLNSADVKTQEVKPE
+ : .. :...... : :.: .:.:... . : .
+sp|P23 SQDFCTDLAVSSANFVPTVTAISTSPDLQWLVQPTLISSVAPSQNRGHPYGVPAPAPPAA
+ 10 20 30 40 50 60
+
+ 50 60 70 80 90 100
+sp|Q1X EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEM
+ ..:: . :. . . . . . . .:.:.:::.: ::. :: :.:.:
+sp|P23 YSRPAVLKAPGGRGQSIGRRG---KVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELT
+ 70 80 90 100 110
+
+ 110 120 130 140 150
+sp|Q1X EKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA------QLAAEVRGSR---ANTPM
+ . :. : :.:.... : ..... :...: :: .. :.: :. : : .
+sp|P23 DTLQAETDQLEEEKSALQAEIANLLKEKEKLEFILAAHRPACKMPEELRFSEELAAATAL
+ 120 130 140 150 160 170
+
+ 160 170 180 190 200 210
+sp|Q1X P-GSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTL-AESSDVAQHPA
+ :.: ::. . : ::: . :.. :. . : :: :
+sp|P23 DLGAP---SPAAAEEAFA-----LPL--MTEAPPAVPPKEPSGSGLELKAEPFD----EL
+ 180 190 200 210 220
+
+ 220 230 240 250 260 270
+sp|Q1X VSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPL---SDDDFNRLFHGDSSVEPDSSVFE
+ . :: . . ..: .:: . . ...: :: : ... : . : :..
+sp|P23 LFSAGPREASRSVPDMDLPGASSFYASD--WEPLGAGSGGELEPLCTPVVTCTPCPSTYT
+ 230 240 250 260 270 280
+
+ 280 290 300 310 320 330
+sp|Q1X DGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTT
+ . ..: :. .:::
+sp|P23 STFVFTYPEA---DAFPSCAAAHRKGSSSNEPSSDSLSSPTLLAL
+ 290 300 310 320
+
+>>sp|Q80YR5|SAFB2_MOUSE Scaffold attachment factor B2 OS (991 aa)
+ initn: 94 init1: 94 opt: 146 Z-score: 141.7 bits: 36.2 E(516081): 2.3
+Smith-Waterman score: 146; 26.6% identity (49.0% similar) in 263 aa overlap (5-245:610-858)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTS
+ ::.:. .:. . :. : . . : : :
+sp|Q80 PEDIKKEKDQDELTPGAAGHSRVTKSGSRGMERTVV-MDKSKGEPVISVKATSRSK-DRS
+ 580 590 600 610 620 630
+
+ 40 50 60 70 80
+sp|Q1X LNSADVKTQ-----EVKPEEK-KPAKKRKSWGQ-ELPVPKTNLPPRKRAKTEDEKEQR--
+ .: : :.. .. .: : ..:. : : . .:. :.: . . :.:::
+sp|Q80 SKSQDRKSEGREKRDILSFDKIKEQRERERQRQREREIRETE---RRREREQREREQRLD
+ 640 650 660 670 680 690
+
+ 90 100 110 120 130
+sp|Q1X ----RIE--RVLRNRAAAQTSR---ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN
+ : : :. :.: : .: ::.::: :.:: :....:.. . ::. . :
+sp|Q80 AFQERREKARLQRERMQLQCQRQRLERERLERERLERERMRVERERRKEQQRIMR---ER
+ 700 710 720 730 740 750
+
+ 140 150 160 170 180 190
+sp|Q1X NRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPS--L
+ ..: .: :: :: . :. : . : . .: : . :: :. .
+sp|Q80 EELRRQQEQLRAEQERRALRRPYD-LDARRDDGYWP---EGKRAALEDRYRDFPRPDHRF
+ 760 770 780 790 800
+
+ 200 210 220 230 240 250
+sp|Q1X SDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALP--LFDLGSDLKHHSTDDVAAPLS
+ :.. . . : . . : : ::. : . : :.::. :
+sp|Q80 HDFDHRDRGHYQEHVIDRRDGSRTRVE--ERDGQYYPDDQHSHGRLLEHHAWDSGDGWHG
+ 810 820 830 840 850 860
+
+ 260 270 280 290 300 310
+sp|Q1X DDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAH
+
+sp|Q80 YSSDKKLNEGQGLPPPPRVSREWAEHSSQLEEQQVPVWHSAVDTNMTGHEHIRWRGAERG
+ 870 880 890 900 910 920
+
+>>sp|Q6ZSZ5|ARHGI_HUMAN Rho guanine nucleotide exchange (1173 aa)
+ initn: 100 init1: 65 opt: 137 Z-score: 132.3 bits: 34.7 E(516081): 7.5
+Smith-Waterman score: 137; 25.3% identity (53.7% similar) in 190 aa overlap (80-267:851-1029)
+
+ 50 60 70 80 90 100
+sp|Q1X KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ ....:: .:. ..::: . . . : :..
+sp|Q6Z QDSYVETQRAAIQEREKQFRLQSTRGNLLLEQERQRNFEKQREERAALEKLQSQLRHEQQ
+ 830 840 850 860 870 880
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPT
+ . : :. ..:. . ::.. :.: .: ..: : ::.. .: .
+sp|Q6Z RWERERQWQHQELERAGARLQEREGEARQLRERLEQERAELERQRQAYQHDLERLREAQR
+ 890 900 910 920 930 940
+
+ 170 180 190 200 210 220
+sp|Q1X LTPTLFKQERDELPLERIPFPTPSLSDYSP-TLKPSTLAESSDVAQHPAVSVAGLEGDG-
+ . ..::..: : : . .. .: .: :.::::.. .. :. . ::::
+sp|Q6Z AV----ERERERLELLR----RLKKQNTAPGALPPDTLAEAQPPSHPPSFNGEGLEGPRV
+ 950 960 970 980 990
+
+ 230 240 250 260 270 280
+sp|Q1X SALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDL
+ : :: : .. .:: : .:: ..: ..
+sp|Q6Z SMLP---SGVGPEYAERPEVARRDSAPTESRLAKSDVPIQLLSATNQFQRQAAVQQQIPT
+ 1000 1010 1020 1030 1040
+
+ 290 300 310 320 330 340
+sp|Q1X SAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q6Z KLAASTKGGKDKGGKSRGSQRWESSASFDLKQQLLLNKLMGKDESTSRNRRSLSPILPGR
+ 1050 1060 1070 1080 1090 1100
+
+>>sp|O70191|ATF5_MOUSE Cyclic AMP-dependent transcriptio (283 aa)
+ initn: 57 init1: 57 opt: 129 Z-score: 133.1 bits: 32.8 E(516081): 6.8
+Smith-Waterman score: 132; 28.4% identity (52.7% similar) in 148 aa overlap (8-155:155-277)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNS
+ :....: : . ::. .:.:..:..
+sp|O70 PSPPPPPPPAAAPSLPLPLPLPTFDLPQPPTLDTLDLLAVYCRSEA-----GPGDSGLST
+ 130 140 150 160 170
+
+ 40 50 60 70 80 90
+sp|Q1X ADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAA
+ : : : : :: : : . :.:. ...:.. .. :..::
+sp|O70 LPVPQQ---PPPLAP----------LPSPARPAPYPSPASTRGDRKQKKRDQ---NKSAA
+ 180 190 200 210 220
+
+ 100 110 120 130 140 150
+sp|Q1X QTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT
+ :.::: : : ::.: .: .:. : .: ..: : : . .: :: .:.
+sp|O70 LRYRQRKRAEGEALEGECQGLEARNRELRERAESVEREI----QYVKDLLIEVYKARSQR
+ 230 240 250 260 270
+
+ 160 170 180 190 200 210
+sp|Q1X PMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPA
+
+sp|O70 TRST
+ 280
+
+>>sp|A6NC98|CC88B_HUMAN Coiled-coil domain-containing pr (1476 aa)
+ initn: 67 init1: 67 opt: 146 Z-score: 139.4 bits: 36.3 E(516081): 3
+Smith-Waterman score: 146; 28.2% identity (55.9% similar) in 195 aa overlap (6-186:276-466)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSL
+ ::. .:: . . :. . . .:
+sp|A6N RAPAEGPSHHLALQLANAKAQLRRLRQELEEKAELLLDSQAEVQGLEAEIRRLRQEAQAL
+ 250 260 270 280 290 300
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP-RKRAKT-EDEKEQRRIERVLRN
+ :...: :. :: . ..: . .:: . .: :.: .. : : : . :::: .
+sp|A6N -SGQAKRAELYREEAEALRERAG---RLPRLQEELRRCRERLQAAEAYKSQLEEERVLSG
+ 310 320 330 340 350 360
+
+ 100 110 120 130 140
+sp|Q1X RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQ-RLSQMEAENNRLSQQLAQLAAE---
+ :. . ...:: . . ... :....::. ::.. .:: . : .:. ::: :
+sp|A6N VLEASKALLEEQLEAARERCARLHETQRENLLLRTRLGEAHAELDSLRHQVDQLAEENVE
+ 370 380 390 400 410 420
+
+ 150 160 170 180 190 200
+sp|Q1X --VRGSRANTPMPGSP-----ATASPTLTPTLFKQERDEL-PLERIPFPTPSLSDYSPTL
+ .. .:. : :::: : :.:.: . . : .: :::
+sp|A6N LELELQRSLEPPPGSPGEAPLAGAAPSLQDEVREAEAGRLRTLERENRELRGLLQVLQGQ
+ 430 440 450 460 470 480
+
+ 210 220 230 240 250 260
+sp|Q1X KPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFH
+
+sp|A6N PGGQHPLLEAPREDPVLPVLEEAPQTPVAFDHSPQGLVQKARDGGPQALDLAPPALDSVL
+ 490 500 510 520 530 540
+
+>>sp|B0WYY2|MOEH_CULQU Moesin/ezrin/radixin homolog 1 OS (572 aa)
+ initn: 83 init1: 83 opt: 132 Z-score: 131.8 bits: 33.6 E(516081): 8
+Smith-Waterman score: 132; 23.7% identity (61.0% similar) in 118 aa overlap (36-151:294-411)
+
+ 10 20 30 40 50 60
+sp|Q1X EKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPV
+ .. ::. .... .:.: ::... .: .
+sp|B0W VFFAPRVRINKRILALCMGNHELYMRRRKPDTIDVQQMKAQAREEKNAKQQEREKLQLAL
+ 270 280 290 300 310 320
+
+ 70 80 90 100 110 120
+sp|Q1X PKTNLPPRKRAKTEDE--KEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQ
+ . .:. . ::. . :...:: : :: .: . ....:. : ..::...
+sp|B0W AARERAEKKQQEYEDRIRNMQEEMERSQANLIEAQDMIRRLEEQLKQLQAAKDDLEQRQN
+ 330 340 350 360 370 380
+
+ 130 140 150 160 170 180
+sp|Q1X FLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELP
+ : ....: .: . . :.: :.:
+sp|B0W ELQVMITRLEETKNMEAAERAKLEDEIRMKQEEVHKIQEEVSVKDSETKRLQEEVEEARR
+ 390 400 410 420 430 440
+
+>>sp|P11939|FOS_CHICK Proto-oncogene c-Fos OS=Gallus gal (367 aa)
+ initn: 77 init1: 46 opt: 129 Z-score: 131.6 bits: 32.9 E(516081): 8.3
+Smith-Waterman score: 129; 22.5% identity (49.7% similar) in 306 aa overlap (2-291:57-339)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|P11 LTYYPSPADSFSSMGSPVNSQDFCTDLAVSSANFVPTVTAISTSPDLQWLVQPTLISSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIER
+ :... . : . ..:: . :. . . . . . . .:.:.:::.:
+sp|P11 PSQNRGHPYGVPAPAPPAAYSRPAVLKAPGGRGQSIGRRG---KVEQLSPEEEEKRRIRR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA-----
+ ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|P11 E-RNKMAAAKCRNRRRELTDTLQAETDQLEEEKSALQAEIANLLKEKEKLEFILAAHRPA
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190
+sp|Q1X -QLAAEVRGSR---ANTPMP-GSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSP
+ .. :.: :. : : . :.: ::. . : ::: . :.. :
+sp|P11 CKMPEELRFSEELAAATALDLGAP---SPAAAEEAFA-----LPL--MTEAPPAVPPKEP
+ 210 220 230 240 250
+
+ 200 210 220 230 240 250
+sp|Q1X TLKPSTL-AESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPL---SDDD
+ . . : :: : . :: . . ..: .:: . . ...: :: : .
+sp|P11 SGSGLELKAEPFD----ELLFSAGPREASRSVPDMDLPGASSFYASD--WEPLGAGSGGE
+ 260 270 280 290 300
+
+ 260 270 280 290 300 310
+sp|Q1X FNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLP
+ .. : . : :.. . ..: :. .:::
+sp|P11 LEPLCTPVVTCTPCPSTYTSTFVFTYPEA---DAFPSCAAAHRKGSSSNEPSSDSLSSPT
+ 310 320 330 340 350 360
+
+ 320 330 340
+sp|Q1X DETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|P11 LLAL
+
+
+>>sp|Q9XUS2|MED29_CAEEL Mediator of RNA polymerase II tr (441 aa)
+ initn: 138 init1: 68 opt: 130 Z-score: 131.5 bits: 33.1 E(516081): 8.4
+Smith-Waterman score: 130; 26.2% identity (53.9% similar) in 141 aa overlap (112-243:13-152)
+
+ 90 100 110 120 130 140
+sp|Q1X KEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN-NRLS
+ ..... :.::.: ..: .::. .. ..
+sp|Q9X MSGQGPPPSMTPQQQHMLMQQQQQQQMMRQQQMQQQQMQQQR
+ 10 20 30 40
+
+ 150 160 170 180 190
+sp|Q1X QQLAQLAAEVRGSRANTP--MP--GSPATAS----PTLTPTLFKQERDELPLERIPFPTP
+ :: : :. .:: :: .: :::. : : : : : :. : .. :.
+sp|Q9X QQQIQQQAQQPYQRARTPQMVPQGGSPGGAHLQMHPHLQPQGQMQPRSPLVGAQLQAPSS
+ 50 60 70 80 90 100
+
+ 200 210 220 230 240 250
+sp|Q1X SLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLS
+ . .:: :. . .. . : .. . . ::. : .. .:.: :
+sp|Q9X VPTAANPTT-PQMMQQQMGMNQPMSLPPTHVSRPGSVAPPSSVPVNLQHTSGAPGLPGSQ
+ 110 120 130 140 150 160
+
+ 260 270 280 290 300 310
+sp|Q1X DDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAH
+
+sp|Q9X MEHQYPMHLQPQQQTLSRPGSQQSQHIQQPGSIQRPGSVLAPGSIPPGGPASQTGPQSIQ
+ 170 180 190 200 210 220
+
+>>sp|A1D9Z7|KAPC_NEOFI Putative transcription factor kap (280 aa)
+ initn: 101 init1: 67 opt: 131 Z-score: 135.1 bits: 33.1 E(516081): 5.3
+Smith-Waterman score: 131; 23.4% identity (55.0% similar) in 171 aa overlap (66-223:75-231)
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP----RKRAKTEDEKEQRRIERVL
+ :.: : .. :: .. .:.
+sp|A1D QPPHMQPNTPARDQNNIDPAISGATMLTGPPQTPTQPDVTGQETPKTYGKRPLSTSKRAA
+ 50 60 70 80 90 100
+
+ 100 110 120 130 140 150
+sp|Q1X RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR
+ .:::: .. :.::. ....::. :.. .. . . .. ..::: .: . . .: ...
+sp|A1D QNRAAQRAFRQRKEAHIRELEG-KVKAYEN---MGEAIKALQAENYQLREYIINLQSRLL
+ 110 120 130 140 150 160
+
+ 160 170 180 190 200
+sp|Q1X GSRANTP-MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPS------
+ :....: .::. ..: :.:.:. :: . . : :.
+sp|A1D DSQGEVPELPGNIDLSQP----------RSEIPVPPIPNSGTTTTAAPPPTAPQQPQPPH
+ 170 180 190 200 210
+
+ 210 220 230 240 250 260
+sp|Q1X TLAESS--DVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHG
+ . : .: :. . ..::::
+sp|A1D AQAPTSNDDMNSLNRIAVAGLGMRKPPTEEANYLGNNFQAQARRVRPDEGQTEASELPKQ
+ 220 230 240 250 260 270
+
+>>sp|P29176|FOSX_MSVFR Transforming protein v-Fos/v-Fox (244 aa)
+ initn: 82 init1: 50 opt: 132 Z-score: 136.8 bits: 33.3 E(516081): 4.2
+Smith-Waterman score: 132; 23.7% identity (49.6% similar) in 224 aa overlap (2-222:33-242)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. : ..... : :.: .:.
+sp|P29 LSYYHSPADSFSSMGSPVNTQDFCADLSVSSANFIPTETAISTSPDLQWLVQPTLVSSVA
+ 10 20 30 40 50 60
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . . :: . . : : :. . . . . . . .:. .:::.
+sp|P29 PSQTRAPHPYGLPTQSAGAYARAGMVKTVSGGRAQSIGRRG---KVEQLSPEEEVKRRIR
+ 70 80 90 100 110
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|P29 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHRP
+ 120 130 140 150 160 170
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAE
+ . . .: ..:: :: : ::: : : ::: . .. .
+sp|P29 ACKIPD-DLGFPEEMSVASLDLTGGL-------LPLLNDPEPKPSLEPVKSSFDDFLFPA
+ 180 190 200 210 220 230
+
+ 210 220 230 240 250 260
+sp|Q1X SSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEP
+ :: .. .:.::
+sp|P29 SS--GHSGFISMAGWQ
+ 240
+
+>>sp|Q09458|YQ37_CAEEL Uncharacterized protein C09F5.7 O (395 aa)
+ initn: 45 init1: 45 opt: 129 Z-score: 131.2 bits: 32.9 E(516081): 8.7
+Smith-Waterman score: 129; 23.6% identity (55.3% similar) in 208 aa overlap (30-227:29-229)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ : :..: .: ... : :: .:: .:
+sp|Q09 MLLPQPKSTAKKPKGEAKSLVARERKSQPQDSAL--MEVPAKREMP--KKEVKKIRSVH
+ 10 20 30 40 50
+
+ 70 80 90 100 110
+sp|Q1X QELPVPKTNLPP--RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME-KLENEKIQ
+ . : ::. ::.. . . .. . .. . :. ..: :.:. :: :: ....
+sp|Q09 KVESVTKTKSAKLRRKKSYSLSSDNESKYKKSISPAASEEASIEKKKEEMTSKLPEKSVA
+ 60 70 80 90 100 110
+
+ 120 130 140 150 160 170
+sp|Q1X MEQQNQ---FLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTL
+ :. :. : .. ... . ::. ...:.. .: . :: : ... .
+sp|Q09 MKTANSPKTFNMELAKKFFEMRMKESQRTSRMATKSDSSLET--MPESSHNSGQSSKSRK
+ 120 130 140 150 160 170
+
+ 180 190 200 210 220 230
+sp|Q1X FKQERDE-LPLERIPFPTPSLSDYS-PTLKPSTLA--ESSDVAQHPAVSVAGLEGDGSAL
+ .. : . ::.: : . . : ::. :. : ......: . .:.:: ::
+sp|Q09 SQRTRGKSTPLDRNIFKENGEPVWVVPDRKPGELVMNEHGEMVKYPEL-MAALEEDGLEM
+ 180 190 200 210 220 230
+
+ 240 250 260 270 280 290
+sp|Q1X PLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAF
+
+sp|Q09 EDGKGWFQKMSSYLMGELDQGRIDNKAASKDINPFASMETLEERTDLYFSRETVIYNTTD
+ 240 250 260 270 280 290
+
+>>sp|P23922|HBP1A_WHEAT Transcription factor HBP-1a OS=T (349 aa)
+ initn: 163 init1: 89 opt: 128 Z-score: 131.0 bits: 32.7 E(516081): 9
+Smith-Waterman score: 128; 29.9% identity (63.9% similar) in 97 aa overlap (59-150:223-319)
+
+ 30 40 50 60 70 80
+sp|Q1X SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQE--LPVP--KTNLPP-RKRAKTEDEKE
+ :: ::: . ..: :.. ::.:
+sp|P23 NKPMPLVPVQSGAVIGVAGPATNLNIGMDYWGATGSSPVPAMRGKVPSGSARGEQWDERE
+ 200 210 220 230 240 250
+
+ 90 100 110 120 130 140
+sp|Q1X QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQL
+ .. .: : :: .:. :: ::. : :.: .. ....:. : .:.... : ..: ..
+sp|P23 LKKQKRKLSNRESARRSRLRKQAECEELGQRAEALKSENSSLRIELDRIKKEYEELLSKN
+ 260 270 280 290 300 310
+
+ 150 160 170 180 190 200
+sp|Q1X AQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKP
+ ..: :..
+sp|P23 TSLKAKLGESGGGGGSDAVPDMNERGDTNGGSHQKEP
+ 320 330 340
+
+>>sp|Q5R452|SAFB1_PONAB Scaffold attachment factor B1 OS (914 aa)
+ initn: 45 init1: 45 opt: 137 Z-score: 133.8 bits: 34.6 E(516081): 6.3
+Smith-Waterman score: 137; 26.4% identity (60.5% similar) in 129 aa overlap (23-143:572-699)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKP
+ :::..:. . .. .. .. .::.
+sp|Q5R QKPGPSERSRATKSGSRGTERTVVMDKSKGVPVISVKTSGSKERASKSLDRKSASREKRS
+ 550 560 570 580 590 600
+
+ 60 70 80 90 100
+sp|Q1X A-------KKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-ERK
+ . . ::: .: . ..: ... :.:.:. .. :.: : : .: ::.
+sp|Q5R VVSFDKVKEPRKSRDSESHRVRERSEREQRMQAQWEREERERLEIARERLAFQRQRLERE
+ 610 620 630 640 650 660
+
+ 110 120 130 140 150 160
+sp|Q1X RLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPA
+ :.: :.:: :....:.. . .:. . : :. : .:.:
+sp|Q5R RMERERLERERMHVEHERRREQERIHR-EREELRRQQELRYEQERRPAVRRPYDLDRRDD
+ 670 680 690 700 710 720
+
+ 170 180 190 200 210 220
+sp|Q1X TASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLE
+
+sp|Q5R AYWPEAKRAALDERYHSDFNRQDRFHDFDHRDRGRYPDHSVDRREGSRSMMGEREGQHYP
+ 730 740 750 760 770 780
+
+>>sp|O02756|CEBPD_BOVIN CCAAT/enhancer-binding protein d (256 aa)
+ initn: 86 init1: 86 opt: 130 Z-score: 134.6 bits: 32.9 E(516081): 5.6
+Smith-Waterman score: 148; 26.7% identity (54.1% similar) in 146 aa overlap (19-163:119-245)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPE
+ :.: .:. ... :.: .. : . .: . :
+sp|O02 LLPGGPARLGGPGPAPRPLKREPDWGDGDAPGSLLPAQVAACAQTVVSLA-AAAQPTPPA
+ 90 100 110 120 130 140
+
+ 50 60 70 80 90 100
+sp|Q1X EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEM
+ .: :.: . : : . ::. . : : .: :: :.. ::.. .
+sp|O02 SPEP--PRRSPAPPAPGPARDKAAGKRGPDRGSPEYR--QRRERNNIAVRKSRDKAK---
+ 150 160 170 180 190 200
+
+ 110 120 130 140 150 160
+sp|Q1X EKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG-SRANTPMPGSPATAS
+ ..:: . :.: .. :::..:.:.. ::. .. : : .::.:
+sp|O02 -----------RRNQEMQQKLVELSAENEKLQQRVEQLTRDLAGLRRFFKQLPGAPFLPG
+ 210 220 230 240
+
+ 170 180 190 200 210 220
+sp|Q1X PTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDG
+
+sp|O02 AGAADAR
+ 250
+
+>>sp|Q03173|ENAH_MOUSE Protein enabled homolog OS=Mus mu (802 aa)
+ initn: 179 init1: 93 opt: 133 Z-score: 130.8 bits: 33.9 E(516081): 9.2
+Smith-Waterman score: 162; 25.9% identity (52.1% similar) in 259 aa overlap (9-254:105-350)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSA
+ : ... : . :.. : :.. .:.:
+sp|Q03 QTFHQWRDARQVYGLNFGSKEDANVFASAMMHALEVLNSQEAAQSKV-TATQDSTNLRCI
+ 80 90 100 110 120 130
+
+ 40 50 60 70 80 90
+sp|Q1X DVKTQEVKPEEKKPAKKRKSWGQE-LPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAA
+ . . . ::. ... .:: : . . .: ..: : : :.:. . ::. :.:
+sp|Q03 FCGPTLPRQNSQLPAQVQNGPSQEELEIQRRQLQEQQRQK-ELERERMERERLERERLER
+ 140 150 160 170 180 190
+
+ 100 110 120 130 140 150
+sp|Q1X QTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAE-NNRLSQQLAQLAAEV----RG
+ . ::.:::.:.:: .. . :. ... .:: ..: : ..: ..: :: : :
+sp|Q03 ERL-ERERLEQEQLERQRQEREHVERLERERLERLERERQERERERLEQLEREQVEWERE
+ 200 210 220 230 240 250
+
+ 160 170 180 190 200
+sp|Q1X SRANTPMPGSPATASPTLTPTLFK-QERDELPLERIPFPTPSLSDYSP-----TLKPSTL
+ : .. :.: .. : . : . : . : . .:: .: : : :
+sp|Q03 RRMSNAAPSSDSSLSSAPLPEYSSCQPPSAPPPSYAKVISAPVSDATPDYAVVTALPPTS
+ 260 270 280 290 300 310
+
+ 210 220 230 240 250 260
+sp|Q1X AESSDVAQHPAVSVAGLEGDGSAL-PLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSS
+ . . .: :. : . :::. :. : :..: : ::. .
+sp|Q03 TPPTPPLRHAATRFA--TSLGSAFHPV------LPHYAT--VPRPLNKNSRPSSPVNTPS
+ 320 330 340 350 360
+
+ 270 280 290 300 310 320
+sp|Q1X VEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSV
+
+sp|Q03 SQPPAAKSCAWPTSNFSPLPPSPPIMISSPPGKATGPRPVLPVCVSSPVPQMPPSPTAPN
+ 370 380 390 400 410 420
+
+>>sp|P54843|MAF_MOUSE Transcription factor Maf OS=Mus mu (370 aa)
+ initn: 85 init1: 85 opt: 128 Z-score: 130.6 bits: 32.7 E(516081): 9.4
+Smith-Waterman score: 128; 30.5% identity (67.1% similar) in 82 aa overlap (83-163:287-366)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .:.: :.:.::. ::. : .. . . ::
+sp|P54 RFSDEQLVTMSVRELNRQLRGVSKEEVIRLKQKR--RTLKNRGYAQSCRFKRVQQRHVLE
+ 260 270 280 290 300 310
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPMPGSPATASPTLT
+ .:: :. :: . : :..:.. : . ... .:... : . ... :.::
+sp|P54 SEKNQLLQQVDHLKQEISRLVRERDAYKEKYEKLVSNGFRENGSSSDNPSSPEFFM
+ 320 330 340 350 360 370
+
+ 180 190 200 210 220 230
+sp|Q1X PTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALP
+
+>>sp|P49716|CEBPD_HUMAN CCAAT/enhancer-binding protein d (269 aa)
+ initn: 90 init1: 90 opt: 126 Z-score: 130.6 bits: 32.2 E(516081): 9.4
+Smith-Waterman score: 128; 25.7% identity (51.4% similar) in 148 aa overlap (19-163:131-258)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADT--SLNSADVKTQEVK
+ :.: .:. ... :.: :: .: : ..
+sp|P49 LPGGPARPLGPGPAAPRLLKREPDWGDGDAPGSLLPAQVAACAQTVVSLAAAGQPTPPTS
+ 110 120 130 140 150 160
+
+ 50 60 70 80 90 100
+sp|Q1X PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRL
+ :: . . .. : : . ::. . : : .: :: :.. ::.. .
+sp|P49 PEPPRSSPRQTP----APGPAREKSAGKRGPDRGSPEYR--QRRERNNIAVRKSRDKAK-
+ 170 180 190 200 210
+
+ 110 120 130 140 150 160
+sp|Q1X EMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRAN-TPMPGSPAT
+ ..:: . :.: .. :::..: :.. ::. .. : : .:. :
+sp|P49 -------------RRNQEMQQKLVELSAENEKLHQRVEQLTRDLAGLRQFFKQLPSPPFL
+ 220 230 240 250 260
+
+ 170 180 190 200 210 220
+sp|Q1X ASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEG
+
+sp|P49 PAAGTADCR
+
+
+>>sp|Q15642|CIP4_HUMAN Cdc42-interacting protein 4 OS=Ho (601 aa)
+ initn: 106 init1: 68 opt: 147 Z-score: 145.6 bits: 36.2 E(516081): 1.4
+Smith-Waterman score: 147; 22.4% identity (50.2% similar) in 263 aa overlap (29-272:294-542)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKR-K
+ .:.:.::.. . . .:: . :...: :
+sp|Q15 DSHVLIELHKSGFARPGDVEFEDFSQPMNRAPSDSSLGTPS----DGRPELRGPGRSRTK
+ 270 280 290 300 310
+
+ 60 70 80 90 100
+sp|Q1X SW--GQEL------------PVPKT--NLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ : :.. :::.. : :: :. . .: . .. : :. :
+sp|Q15 RWPFGKKNKPRPPPLSPLGGPVPSALPNGPPSPRSGRDPLAILSEISKSVKPRLASFRSL
+ 320 330 340 350 360 370
+
+ 110 120 130 140 150
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA--EVRGSRANTPM
+ . .: . . .. ::: . : : :.: .. .:.... : : ... .::.
+sp|Q15 RGSRGTVVTEDFSHLPPEQQRKRLQQ---QLEERSRELQKEVDQREALKKMKDVYEKTPQ
+ 380 390 400 410 420 430
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::. : .. :: . :: .: ... . . . ..:.. . . :: :
+sp|Q15 MGDPASLEPQIAETLSNIERLKLEVQKYEAWLAEAESRVLSNRGDSLSRHARPPDPPA-S
+ 440 450 460 470 480 490
+
+ 220 230 240 250 260 270
+sp|Q1X VAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAF
+ . ...:: ..: :. : . . .: . : : :: : .
+sp|Q15 APPDSSSNSA------SQDTKESSEEPPSEESQDTPIYTEFDEDFEEEPTSPIGHCVAIY
+ 500 510 520 530 540
+
+ 280 290 300 310 320 330
+sp|Q1X DVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQ
+
+sp|Q15 HFEGSSEGTISMAEGEDLSLMEEDKGDGWTRVRRKEGGEGYVPTSYLRVTLN
+ 550 560 570 580 590 600
+
+>>sp|Q54RZ9|BZPG_DICDI Probable basic-leucine zipper tra (372 aa)
+ initn: 128 init1: 128 opt: 128 Z-score: 130.6 bits: 32.7 E(516081): 9.4
+Smith-Waterman score: 128; 32.8% identity (73.1% similar) in 67 aa overlap (80-146:274-340)
+
+ 50 60 70 80 90 100
+sp|Q1X KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ ..:: .: .:...:: .:. ::.::: ..
+sp|Q54 LNKEELNTFTTTDMNNYVKQANMVKELSQVEKKELKRQKRLIKNRESAHLSRQRKRERLT
+ 250 260 270 280 290 300
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPT
+ ::.. .. ... . . ::..: :: :. ...::
+sp|Q54 DLEHRVEELSSNSIDINKTLSSLENENLILKAEVGQLFEVINDSPVLSALFYKIASLSQQ
+ 310 320 330 340 350 360
+
+ 170 180 190 200 210 220
+sp|Q1X LTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSA
+
+sp|Q54 PQKDTIGAY
+ 370
+
+>>sp|Q5AXH3|TOF1_EMENI Topoisomerase 1-associated factor (1167 aa)
+ initn: 80 init1: 80 opt: 140 Z-score: 135.1 bits: 35.2 E(516081): 5.2
+Smith-Waterman score: 140; 25.7% identity (51.0% similar) in 241 aa overlap (48-270:936-1166)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK
+ : :. ::::. :.: :: . .: :..:.
+sp|Q5A NFGSDSEGEDVIPDGPLFPANPRSKAHALNELKQKRKKRKDKGEEEPVDEETLEERRQAR
+ 910 920 930 940 950 960
+
+ 80 90 100 110 120 130
+sp|Q1X TEDEKEQ-RRIERVLRNRAAAQTSRERKRLEMEKLENEKI--QMEQQNQFLLQRLSQMEA
+ :. . . .:. : .:. . : . :. .::.:. : :. .. :: :.. :
+sp|Q5A LENTRWRLAKIKSDLYVHASDEESDAEADQEFFRLEEERRNEQSERIKKALL--LGRTED
+ 970 980 990 1000 1010 1020
+
+ 140 150 160 170 180 190
+sp|Q1X ENNRLSQQLAQLAAEVRGSRANTP-MPGSPATASPTLTP---TLFKQERDELPLERIPFP
+ .:. :. ::.:.: : . : :.. : . :.:.. .. . .:
+sp|Q5A AGNKARQRK-------RGKRSNEPNIAGEEETSGKRRRHSGGTNVELEEDDILMDDMEMP
+ 1030 1040 1050 1060 1070
+
+ 200 210 220 230 240
+sp|Q1X T-PSLSDYSPTLKPS---TLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDL----KHH
+ . : ..:: . . ..: . : . : . : . . :.: ::.
+sp|Q5A SRASSGEYSSNDADAIDKSMAAAEDELYFDDDLAFGRDRDKDETSVDRDGADASSPRKHN
+ 1080 1090 1100 1110 1120 1130
+
+ 250 260 270 280 290
+sp|Q1X STDDVAA---PLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFD
+ . .. : ::. . :: : :: ::
+sp|Q5A DGSESAEEDIPLAPPNRRRLRAG-FVVESDSE
+ 1140 1150 1160
+
+ 300 310 320 330 340
+sp|Q1X SEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+>>sp|Q498L2|SLTM_XENLA SAFB-like transcription modulator (998 aa)
+ initn: 101 init1: 101 opt: 134 Z-score: 130.4 bits: 34.1 E(516081): 9.6
+Smith-Waterman score: 134; 31.0% identity (66.7% similar) in 84 aa overlap (73-153:607-689)
+
+ 50 60 70 80 90 100
+sp|Q1X QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-
+ :.: . . .:.....:. :.: . :
+sp|Q49 REKVERMERIQRFRRAVEMRRSREMAERECRERERIRIMREREELDRLQRERERLEIERQ
+ 580 590 600 610 620 630
+
+ 110 120 130 140 150
+sp|Q1X --ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPM
+ ::.:.: :.:: :.:..::. . .:... . : : ..:: .. : :.:
+sp|Q49 KLERERMERERLERERIRIEQERRREAERIAREREELRRQQEQL-RFEQEKRNSLKRPRD
+ 640 650 660 670 680 690
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+
+sp|Q49 VDHRRDEPFWNENKKMAVDTDSRFSHGSDFNRQQNRFNDFDHRDRNRYSEGSNVSSFERR
+ 700 710 720 730 740 750
+
+>>sp|P0CB49|YLPM1_RAT YLP motif-containing protein 1 OS= (1376 aa)
+ initn: 129 init1: 79 opt: 137 Z-score: 131.4 bits: 34.7 E(516081): 8.5
+Smith-Waterman score: 137; 20.1% identity (50.4% similar) in 224 aa overlap (19-227:858-1076)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPE
+ : . :. :.. ... . . . ..
+sp|P0C EFKRDTAAIPSAPVLPPPPVHPSIPPPGPMPMGMPPMSKPPPVQHTVDYGHGRDMPTNKV
+ 830 840 850 860 870 880
+
+ 50 60 70 80 90 100
+sp|Q1X EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS-RERKRLE
+ :. : .: . . :.:. . .: .:. .. : .. .: . .:. :. :: .
+sp|P0C EQIPYGERITLRPD-PLPERSAFDADHAGQRDRYDRDRDREPYFDRQSNMTDHRDFKRDR
+ 890 900 910 920 930 940
+
+ 110 120 130 140 150 160
+sp|Q1X MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATAS
+ . . ... ....: .: . . . :. .. . .. ::. . : .
+sp|P0C ETHRDRDRVLDYERDRF--DRERRPRDDRNQSYRDKKDHSSSRRGGF-DRPSYDRKSDRP
+ 950 960 970 980 990 1000
+
+ 170 180 190 200 210
+sp|Q1X PTLTPTLFKQERDELPLERIPFPTPSLSDYSPTL-----KPSTLAESSDVAQHPA-----
+ : : .: :: : ::.:.:.:::. : . :: . . .:. . :.
+sp|P0C PYEGPPMFGGERRTYPEERMPLPAPSLGHQPPPVPRVEKKPES-KNVDDILKPPGRESRP
+ 1010 1020 1030 1040 1050 1060
+
+ 220 230 240 250 260 270
+sp|Q1X ----VSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVF
+ : . :: :.:
+sp|P0C ERIVVIMRGLPGSGKTHVAKLIRDKEVEFGGPAPRVLSLDDYFIAEVEKEEKDPDSGKKV
+ 1070 1080 1090 1100 1110 1120
+
+>>sp|Q39140|TGA6_ARATH Transcription factor TGA6 OS=Arab (330 aa)
+ initn: 124 init1: 89 opt: 127 Z-score: 130.3 bits: 32.5 E(516081): 9.7
+Smith-Waterman score: 127; 36.4% identity (72.7% similar) in 55 aa overlap (77-131:38-91)
+
+ 50 60 70 80 90 100
+sp|Q1X PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRL
+ ...:. .:. ..:. .:: ::. :: ::.
+sp|Q39 TDVSTDGDTDHRDLGSDRGHMHAAASDSSDRSKDKLDQKTLRRLAQNREAARKSRLRKKA
+ 10 20 30 40 50 60
+
+ 110 120 130 140 150 160
+sp|Q1X EMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATA
+ ...::: .... : .: : :: :
+sp|Q39 YVQQLENSRLKLTQLEQEL-QRARQQGVFISSSGDQAHSTGGNGALAFDAEHSRWLEEKN
+ 70 80 90 100 110 120
+
+>>sp|Q8N9W4|GG6L2_HUMAN Golgin subfamily A member 6-like (650 aa)
+ initn: 186 init1: 90 opt: 131 Z-score: 130.1 bits: 33.4 E(516081): 10
+Smith-Waterman score: 131; 24.3% identity (61.7% similar) in 115 aa overlap (41-154:277-386)
+
+ 20 30 40 50 60
+sp|Q1X SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKR-KSWGQELPVPKTN
+ . .:.. .::: :.. : : ::
+sp|Q8N NVKELKRKLERAKFLLPQVQTNTLQEEMWRQEEELREQEKKIRKQEEKMWRQE-----ER
+ 250 260 270 280 290 300
+
+ 70 80 90 100 110 120
+sp|Q1X LPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL
+ : .. :.:...:: :. ::.. .:.. :..::.... ::..:.. . ..
+sp|Q8N LREQEGKMREQEEKMRRQEKRLREQEKELREQEKELREQKKLREQEEQMQEQEEKMWEQE
+ 310 320 330 340 350 360
+
+ 130 140 150 160 170 180
+sp|Q1X SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF
+ .:. ..... .: .: . . :
+sp|Q8N EKMREQEEKMWRQEERLWEQEKQMREQEQKMRDQEERMWEQDERLREKEERMREQEKMWE
+ 370 380 390 400 410 420
+
+
+
+526 residues in 2 query sequences
+181677051 residues in 516081 library sequences
+ Tcomplib [36.04] (8 proc)
+ start: Fri Apr 16 10:09:02 2010 done: Fri Apr 16 10:09:15 2010
+ Total Scan time: 28.320 Total Display time: 0.320
+
+Function used was FASTA [version 36.04 January, 2010]
diff --git a/demotic/examples/example.h2.out b/demotic/examples/example.h2.out
new file mode 100644
index 0000000..2738b02
--- /dev/null
+++ b/demotic/examples/example.h2.out
@@ -0,0 +1,4234 @@
+hmmsearch - search a sequence database with a profile HMM
+HMMER 2.3.2 (Oct 2003)
+Copyright (C) 1992-2003 HHMI/Washington University School of Medicine
+Freely distributed under the GNU General Public License (GPL)
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+HMM file: example.hmm2 [Orn_DAP_Arg_deC]
+Sequence database: /misc/data0/databases/Uniprot/uniprot_sprot.fasta
+per-sequence score cutoff: [none]
+per-domain score cutoff: [none]
+per-sequence Eval cutoff: <= 10
+per-domain Eval cutoff: [none]
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+Query HMM: Orn_DAP_Arg_deC
+Accession: PF00278.15
+Description: Pyridoxal-dependent decarboxylase, C-terminal sheet domain
+ [HMM has been calibrated; E-values are empirical estimates]
+
+Scores for complete sequences (score includes all domains):
+Sequence Description Score E-value N
+-------- ----------- ----- ------- ---
+sp|O29458|DCDA_ARCFU Diaminopimelate decarboxylase O 173.5 3e-47 1
+sp|Q9UQW9|DCOR_SCHPO Ornithine decarboxylase OS=Schi 171.6 1.2e-46 1
+sp|O27390|DCDA_METTH Diaminopimelate decarboxylase O 162.1 8.4e-44 1
+sp|Q9I8S4|DCOR2_XENLA Ornithine decarboxylase 2 OS=Xe 160.6 2.3e-43 1
+sp|P09057|DCOR_RAT Ornithine decarboxylase OS=Ratt 160.5 2.5e-43 1
+sp|P14019|DCOR_CRIGR Ornithine decarboxylase OS=Cric 159.9 3.8e-43 1
+sp|P00860|DCOR_MOUSE Ornithine decarboxylase OS=Mus 159.8 3.9e-43 1
+sp|P27119|DCOR_MUSPA Ornithine decarboxylase OS=Mus 159.8 3.9e-43 1
+sp|P27118|DCOR_CHICK Ornithine decarboxylase (Fragme 158.8 8e-43 1
+sp|P27120|DCOR1_XENLA Ornithine decarboxylase 1 OS=Xe 157.0 2.8e-42 1
+sp|P11926|DCOR_HUMAN Ornithine decarboxylase OS=Homo 156.9 3e-42 1
+sp|P27117|DCOR_BOVIN Ornithine decarboxylase OS=Bos 154.1 2.1e-41 1
+sp|P07805|DCOR_TRYBB Ornithine decarboxylase OS=Tryp 151.2 1.6e-40 1
+sp|Q9X1K5|DCDA_THEMA Diaminopimelate decarboxylase O 150.5 2.6e-40 1
+sp|P49725|DCOR_PANRE Ornithine decarboxylase OS=Pana 146.6 3.7e-39 1
+sp|O22616|DCOR_SOLLC Ornithine decarboxylase OS=Sola 145.8 6.6e-39 1
+sp|P27121|DCOR_NEUCR Ornithine decarboxylase OS=Neur 145.7 7.3e-39 1
+sp|P50134|DCOR_DATST Ornithine decarboxylase OS=Datu 145.5 8.2e-39 1
+sp|P08432|DCOR_YEAST Ornithine decarboxylase OS=Sacc 143.2 4e-38 1
+sp|Q8A2B1|SPEA_BACTN Biosynthetic arginine decarboxy 142.0 9.1e-38 1
+sp|Q9HUX1|SPEA_PSEAE Biosynthetic arginine decarboxy 141.0 1.9e-37 1
+sp|Q7NU27|SPEA_CHRVO Biosynthetic arginine decarboxy 140.9 2e-37 1
+sp|O69203|DCDA_ACTPA Diaminopimelate decarboxylase O 140.6 2.5e-37 1
+sp|Q8S3N2|DCOR_CAPAN Ornithine decarboxylase OS=Caps 140.5 2.6e-37 1
+sp|P00861|DCDA_ECOLI Diaminopimelate decarboxylase O 140.3 3.1e-37 1
+sp|Q7NE10|SPEA_GLOVI Biosynthetic arginine decarboxy 140.2 3.1e-37 1
+sp|Q58497|DCDA_METJA Diaminopimelate decarboxylase O 140.0 3.8e-37 1
+sp|Q5LIQ3|SPEA_BACFN Biosynthetic arginine decarboxy 139.5 5.4e-37 1
+sp|Q64ZT8|SPEA_BACFR Biosynthetic arginine decarboxy 139.5 5.4e-37 1
+sp|Q87VU3|SPEA_PSESM Biosynthetic arginine decarboxy 138.1 1.3e-36 1
+sp|P40807|DCOR1_DROME Ornithine decarboxylase 1 OS=Dr 137.4 2.2e-36 1
+sp|B0U1H6|SPEA_XYLFM Biosynthetic arginine decarboxy 137.4 2.3e-36 1
+sp|Q9PH02|SPEA_XYLFA Biosynthetic arginine decarboxy 137.4 2.3e-36 1
+sp|O05321|DCDA_PSEFL Diaminopimelate decarboxylase O 136.5 4.1e-36 1
+sp|B2I6M1|SPEA_XYLF2 Biosynthetic arginine decarboxy 136.3 4.7e-36 1
+sp|Q87F25|SPEA_XYLFT Biosynthetic arginine decarboxy 136.3 4.7e-36 1
+sp|Q8DHY6|SPEA_THEEB Biosynthetic arginine decarboxy 136.0 6.1e-36 1
+sp|O67262|DCDA_AQUAE Diaminopimelate decarboxylase O 135.8 6.8e-36 1
+sp|Q88QC7|SPEA_PSEPK Biosynthetic arginine decarboxy 134.8 1.3e-35 1
+sp|O14977|AZIN1_HUMAN Antizyme inhibitor 1 OS=Homo sa 133.2 4.2e-35 1
+sp|Q5R7K3|AZIN1_PONAB Antizyme inhibitor 1 OS=Pongo a 133.2 4.2e-35 1
+sp|O35484|AZIN1_MOUSE Antizyme inhibitor 1 OS=Mus mus 132.9 5.1e-35 1
+sp|Q50140|DCDA_MYCLE Diaminopimelate decarboxylase O 132.9 5.2e-35 1
+sp|A6L012|SPEA_BACV8 Biosynthetic arginine decarboxy 132.8 5.5e-35 1
+sp|P19572|DCDA_PSEAE Diaminopimelate decarboxylase O 132.5 6.8e-35 1
+sp|Q8YRP3|SPEA_ANASP Biosynthetic arginine decarboxy 132.3 7.9e-35 1
+sp|P23630|DCDA_BACSU Diaminopimelate decarboxylase O 131.7 1.2e-34 1
+sp|Q9ZBH5|DCDA_STRCO Diaminopimelate decarboxylase O 130.8 2.2e-34 1
+sp|Q8K9C4|DCDA_BUCAP Diaminopimelate decarboxylase O 130.6 2.4e-34 1
+sp|Q0ACK8|SPEA_ALHEH Biosynthetic arginine decarboxy 130.5 2.7e-34 1
+sp|Q949X7|DCDA1_ARATH Diaminopimelate decarboxylase 1 129.2 6.8e-34 1
+sp|Q94A94|DCDA2_ARATH Diaminopimelate decarboxylase 2 128.9 8.1e-34 1
+sp|P0A5M5|DCDA_MYCBO Diaminopimelate decarboxylase O 128.6 9.9e-34 1
+sp|P0A5M4|DCDA_MYCTU Diaminopimelate decarboxylase O 128.6 9.9e-34 1
+sp|P41931|DCOR_CAEEL Ornithine decarboxylase OS=Caen 127.8 1.7e-33 1
+sp|O50657|DCLO_SELRU Lysine/ornithine decarboxylase 127.7 1.9e-33 1
+sp|Q9KVL7|DCDA_VIBCH Diaminopimelate decarboxylase O 127.4 2.4e-33 1
+sp|Q6ZG77|DCDA_ORYSJ Probable diaminopimelate decarb 126.9 3.1e-33 1
+sp|Q55484|DCDA_SYNY3 Diaminopimelate decarboxylase O 126.7 3.6e-33 1
+sp|Q9JXM2|DCDA_NEIMB Diaminopimelate decarboxylase O 125.6 8.1e-33 1
+sp|Q8P448|SPEA_XANCP Biosynthetic arginine decarboxy 125.2 1e-32 1
+sp|Q54UF3|DCOR_DICDI Probable ornithine decarboxylas 125.0 1.2e-32 1
+sp|Q9Z661|DCDA_ZYMMO Diaminopimelate decarboxylase O 124.9 1.3e-32 1
+sp|Q9JWA6|DCDA_NEIMA Diaminopimelate decarboxylase O 123.9 2.6e-32 1
+sp|P40808|DCOR2_DROME Ornithine decarboxylase 2 OS=Dr 123.4 3.6e-32 1
+sp|Q8PFQ5|SPEA_XANAC Biosynthetic arginine decarboxy 122.9 5.1e-32 1
+sp|P56129|DCDA_HELPY Diaminopimelate decarboxylase O 122.1 9e-32 1
+sp|Q89AC6|DCDA_BUCBP Diaminopimelate decarboxylase O 121.5 1.4e-31 1
+sp|P78599|DCOR_CANAL Ornithine decarboxylase OS=Cand 121.5 1.4e-31 1
+sp|Q8DA54|SPEA_VIBVU Biosynthetic arginine decarboxy 121.1 1.8e-31 1
+sp|Q7MK24|SPEA_VIBVY Biosynthetic arginine decarboxy 121.1 1.8e-31 1
+sp|A4Y5Y9|SPEA_SHEPC Biosynthetic arginine decarboxy 121.1 1.8e-31 1
+sp|A1RKK8|SPEA_SHESW Biosynthetic arginine decarboxy 121.1 1.8e-31 1
+sp|P57513|DCDA_BUCAI Diaminopimelate decarboxylase O 121.0 2e-31 1
+sp|Q9RTK2|DCDA_DEIRA Diaminopimelate decarboxylase O 120.9 2.1e-31 1
+sp|B8CR70|SPEA_SHEPW Biosynthetic arginine decarboxy 120.8 2.2e-31 1
+sp|A3QDD8|SPEA_SHELP Biosynthetic arginine decarboxy 120.3 3.2e-31 1
+sp|B8EAI2|SPEA_SHEB2 Biosynthetic arginine decarboxy 119.9 4.1e-31 1
+sp|A3D3G2|SPEA_SHEB5 Biosynthetic arginine decarboxy 119.9 4.1e-31 1
+sp|A6WM65|SPEA_SHEB8 Biosynthetic arginine decarboxy 119.9 4.1e-31 1
+sp|A9KY70|SPEA_SHEB9 Biosynthetic arginine decarboxy 119.9 4.1e-31 1
+sp|P27116|DCOR_LEIDO Ornithine decarboxylase OS=Leis 119.8 4.5e-31 1
+sp|Q083L6|SPEA_SHEFN Biosynthetic arginine decarboxy 119.2 6.6e-31 1
+sp|Q8EFU5|SPEA_SHEON Biosynthetic arginine decarboxy 119.1 7e-31 1
+sp|B1KRD4|SPEA_SHEWM Biosynthetic arginine decarboxy 118.6 1e-30 1
+sp|Q7V3M9|SPEA_PROMP Biosynthetic arginine decarboxy 118.5 1.1e-30 1
+sp|A8FWJ3|SPEA_SHESH Biosynthetic arginine decarboxy 117.5 2.2e-30 1
+sp|Q0HJY2|SPEA_SHESM Biosynthetic arginine decarboxy 117.3 2.5e-30 1
+sp|Q0HW78|SPEA_SHESR Biosynthetic arginine decarboxy 117.3 2.5e-30 1
+sp|Q63764|AZIN1_RAT Antizyme inhibitor 1 OS=Rattus 117.2 2.7e-30 1
+sp|Q9ZME5|DCDA_HELPJ Diaminopimelate decarboxylase O 117.1 2.9e-30 1
+sp|A0KVN8|SPEA_SHESA Biosynthetic arginine decarboxy 117.0 3.1e-30 1
+sp|Q8ZHG8|SPEA_YERPE Biosynthetic arginine decarboxy 117.0 3.1e-30 1
+sp|B5XUB1|SPEA_KLEP3 Biosynthetic arginine decarboxy 116.8 3.5e-30 1
+sp|Q12LW6|SPEA_SHEDO Biosynthetic arginine decarboxy 116.8 3.5e-30 1
+sp|A2BNH3|SPEA_PROMS Biosynthetic arginine decarboxy 116.8 3.6e-30 1
+sp|Q87JS8|SPEA_VIBPA Biosynthetic arginine decarboxy 116.7 3.8e-30 1
+sp|A8H5G3|SPEA_SHEPA Biosynthetic arginine decarboxy 116.7 3.8e-30 1
+sp|A3PA96|SPEA_PROM0 Biosynthetic arginine decarboxy 116.6 4.1e-30 1
+sp|P41023|DCDA_BACMT Diaminopimelate decarboxylase O 116.4 4.6e-30 1
+sp|B0TQX3|SPEA_SHEHH Biosynthetic arginine decarboxy 116.4 4.8e-30 1
+sp|Q31DD8|SPEA_PROM9 Biosynthetic arginine decarboxy 116.4 4.8e-30 1
+sp|Q96412|SPE1_DIACA Arginine decarboxylase OS=Diant 116.3 4.9e-30 1
+sp|A1S712|SPEA_SHEAM Biosynthetic arginine decarboxy 116.1 5.9e-30 1
+sp|A8G243|SPEA_PROM2 Biosynthetic arginine decarboxy 115.5 8.8e-30 1
+sp|Q7VEG4|SPEA_PROMA Biosynthetic arginine decarboxy 115.2 1.1e-29 1
+sp|C4K6F4|SPEA_HAMD5 Biosynthetic arginine decarboxy 114.9 1.3e-29 1
+sp|B5F5L1|SPEA_SALA4 Biosynthetic arginine decarboxy 114.9 1.3e-29 1
+sp|Q57K30|SPEA_SALCH Biosynthetic arginine decarboxy 114.9 1.3e-29 1
+sp|B5FUJ7|SPEA_SALDC Biosynthetic arginine decarboxy 114.9 1.3e-29 1
+sp|B4THH1|SPEA_SALHS Biosynthetic arginine decarboxy 114.9 1.3e-29 1
+sp|A9N4N1|SPEA_SALPB Biosynthetic arginine decarboxy 114.9 1.3e-29 1
+sp|B4TV55|SPEA_SALSV Biosynthetic arginine decarboxy 114.9 1.3e-29 1
+sp|P60659|SPEA_SALTY Biosynthetic arginine decarboxy 114.9 1.3e-29 1
+sp|P60658|SPEA_SALTI Biosynthetic arginine decarboxy 114.9 1.3e-29 1
+sp|B4T5J3|SPEA_SALNS Biosynthetic arginine decarboxy 114.9 1.3e-29 1
+sp|P44316|DCDA_HAEIN Diaminopimelate decarboxylase O 114.9 1.4e-29 1
+sp|P22220|SPE1_AVESA Arginine decarboxylase OS=Avena 114.8 1.4e-29 1
+sp|Q9X5M1|DCDA_MYCS2 Diaminopimelate decarboxylase O 114.7 1.5e-29 1
+sp|Q9KLD1|SPEA_VIBCH Biosynthetic arginine decarboxy 114.4 1.9e-29 1
+sp|Q8XCX9|SPEA_ECO57 Biosynthetic arginine decarboxy 114.2 2.2e-29 1
+sp|B5YQD6|SPEA_ECO5E Biosynthetic arginine decarboxy 114.2 2.2e-29 1
+sp|Q8FE34|SPEA_ECOL6 Biosynthetic arginine decarboxy 114.2 2.2e-29 1
+sp|B1LDE8|SPEA_ECOSM Biosynthetic arginine decarboxy 114.2 2.2e-29 1
+sp|Q0T0V3|SPEA_SHIF8 Biosynthetic arginine decarboxy 113.9 2.6e-29 1
+sp|Q83Q93|SPEA_SHIFL Biosynthetic arginine decarboxy 113.9 2.6e-29 1
+sp|B9M6H6|SPEA_GEOSF Biosynthetic arginine decarboxy 113.6 3.3e-29 1
+sp|P21170|SPEA_ECOLI Biosynthetic arginine decarboxy 113.6 3.4e-29 1
+sp|B5EIW4|SPEA_GEOBB Biosynthetic arginine decarboxy 112.8 5.7e-29 1
+sp|C6E3V4|SPEA_GEOSM Biosynthetic arginine decarboxy 112.8 5.7e-29 1
+sp|A1AS90|SPEA_PELPD Biosynthetic arginine decarboxy 112.3 8.2e-29 1
+sp|A2BU00|SPEA_PROM5 Biosynthetic arginine decarboxy 112.2 8.6e-29 1
+sp|Q8RQM6|DCDA_COREF Diaminopimelate decarboxylase O 109.3 6.4e-28 1
+sp|B4F1A4|SPEA_PROMH Biosynthetic arginine decarboxy 108.8 8.9e-28 1
+sp|P74576|SPEA1_SYNY3 Biosynthetic arginine decarboxy 108.1 1.5e-27 1
+sp|A5GB52|SPEA_GEOUR Biosynthetic arginine decarboxy 107.3 2.6e-27 1
+sp|Q7U3S0|SPEA_SYNPX Biosynthetic arginine decarboxy 107.1 2.9e-27 1
+sp|A0A4W3|SPEA_GEOSL Biosynthetic arginine decarboxy 106.7 3.9e-27 1
+sp|Q39X78|SPEA_GEOMG Biosynthetic arginine decarboxy 106.4 4.8e-27 1
+sp|A1TY02|SPEA_MARAV Biosynthetic arginine decarboxy 106.3 5e-27 1
+sp|Q9RXR4|SPEA_DEIRA Biosynthetic arginine decarboxy 106.0 6.4e-27 1
+sp|P09890|DCDA_CORGL Diaminopimelate decarboxylase O 105.3 1e-26 1
+sp|O82475|SPE1_BRAJU Arginine decarboxylase OS=Brass 104.8 1.5e-26 1
+sp|Q39827|SPE1_SOYBN Arginine decarboxylase OS=Glyci 104.7 1.6e-26 1
+sp|Q7N121|SPEA_PHOLL Biosynthetic arginine decarboxy 104.7 1.6e-26 1
+sp|B3EAF3|SPEA_GEOLS Biosynthetic arginine decarboxy 104.5 1.8e-26 1
+sp|A5GWM2|SPEA_SYNR3 Biosynthetic arginine decarboxy 104.5 1.8e-26 1
+sp|Q7UTS2|SPEA_RHOBA Biosynthetic arginine decarboxy 104.0 2.5e-26 1
+sp|Q9KCM5|DCDA_BACHD Diaminopimelate decarboxylase O 103.8 3e-26 1
+sp|Q96A70|ADC_HUMAN Arginine decarboxylase OS=Homo 103.7 3.1e-26 1
+sp|Q43075|SPE1_PEA Arginine decarboxylase OS=Pisum 102.6 6.5e-26 1
+sp|P72587|SPEA2_SYNY3 Biosynthetic arginine decarboxy 100.6 2.6e-25 1
+sp|Q7TUJ9|SPEA_PROMM Biosynthetic arginine decarboxy 100.2 3.7e-25 1
+sp|P49726|SPE1_SOLLC Arginine decarboxylase OS=Solan 98.7 1e-24 1
+sp|Q9PII5|DCDA_CAMJE Diaminopimelate decarboxylase O 98.5 1.1e-24 1
+sp|A2CDK1|SPEA_PROM3 Biosynthetic arginine decarboxy 98.1 1.5e-24 1
+sp|Q8BVM4|ADC_MOUSE Antizyme inhibitor 2 OS=Mus mus 97.9 1.7e-24 1
+sp|Q9CL60|SPEA_PASMU Biosynthetic arginine decarboxy 95.7 8e-24 1
+sp|O23141|SPE2_ARATH Arginine decarboxylase 2 OS=Ara 94.8 1.5e-23 1
+sp|Q9SNN0|SPE1_ORYSJ Arginine decarboxylase 1 OS=Ory 94.7 1.6e-23 1
+sp|P31851|TABA_PSESZ Protein tabA OS=Pseudomonas syr 92.2 8.9e-23 1
+sp|Q9JT25|SPEA_NEIMA Biosynthetic arginine decarboxy 91.8 1.2e-22 1
+sp|Q9K0U3|SPEA_NEIMB Biosynthetic arginine decarboxy 91.8 1.2e-22 1
+sp|Q7XRA1|ADC2_ORYSJ Arginine decarboxylase 2 OS=Ory 91.2 1.8e-22 1
+sp|Q9SI64|SPE1_ARATH Arginine decarboxylase 1 OS=Ara 88.2 1.5e-21 1
+sp|C4L9A9|SPEA_TOLAT Biosynthetic arginine decarboxy 87.6 2.2e-21 1
+sp|A0KIP8|SPEA_AERHH Biosynthetic arginine decarboxy 78.4 1.3e-18 1
+sp|A4SPD6|SPEA_AERS4 Biosynthetic arginine decarboxy 73.6 3.6e-17 1
+sp|P55709|Y4YA_RHISN Uncharacterized protein y4yA OS 23.1 0.0018 1
+sp|O81160|SPE2_THECC Arginine decarboxylase (Fragmen -9.6 1.1 1
+
+Parsed for domains:
+Sequence Domain seq-f seq-t hmm-f hmm-t score E-value
+-------- ------- ----- ----- ----- ----- ----- -------
+sp|O29458|DCDA_ARCFU 1/1 285 391 .. 1 123 [] 173.5 3e-47
+sp|Q9UQW9|DCOR_SCHPO 1/1 307 426 .. 1 123 [] 171.6 1.2e-46
+sp|O27390|DCDA_METTH 1/1 292 398 .. 1 123 [] 162.1 8.4e-44
+sp|Q9I8S4|DCOR2_XENLA 1/1 284 405 .. 1 123 [] 160.6 2.3e-43
+sp|P09057|DCOR_RAT 1/1 285 408 .. 1 123 [] 160.5 2.5e-43
+sp|P14019|DCOR_CRIGR 1/1 282 402 .. 1 123 [] 159.9 3.8e-43
+sp|P00860|DCOR_MOUSE 1/1 285 408 .. 1 123 [] 159.8 3.9e-43
+sp|P27119|DCOR_MUSPA 1/1 285 408 .. 1 123 [] 159.8 3.9e-43
+sp|P27118|DCOR_CHICK 1/1 275 398 .. 1 123 [] 158.8 8e-43
+sp|P27120|DCOR1_XENLA 1/1 285 409 .. 1 123 [] 157.0 2.8e-42
+sp|P11926|DCOR_HUMAN 1/1 285 408 .. 1 123 [] 156.9 3e-42
+sp|P27117|DCOR_BOVIN 1/1 285 408 .. 1 123 [] 154.1 2.1e-41
+sp|P07805|DCOR_TRYBB 1/1 283 406 .. 1 123 [] 151.2 1.6e-40
+sp|Q9X1K5|DCDA_THEMA 1/1 257 362 .. 1 123 [] 150.5 2.6e-40
+sp|P49725|DCOR_PANRE 1/1 294 416 .. 1 123 [] 146.6 3.7e-39
+sp|O22616|DCOR_SOLLC 1/1 308 424 .. 1 123 [] 145.8 6.6e-39
+sp|P27121|DCOR_NEUCR 1/1 326 471 .. 1 123 [] 145.7 7.3e-39
+sp|P50134|DCOR_DATST 1/1 308 424 .. 1 123 [] 145.5 8.2e-39
+sp|P08432|DCOR_YEAST 1/1 329 460 .. 1 123 [] 143.2 4e-38
+sp|Q8A2B1|SPEA_BACTN 1/1 346 558 .. 1 123 [] 142.0 9.1e-38
+sp|Q9HUX1|SPEA_PSEAE 1/1 354 567 .. 1 123 [] 141.0 1.9e-37
+sp|Q7NU27|SPEA_CHRVO 1/1 343 556 .. 1 123 [] 140.9 2e-37
+sp|O69203|DCDA_ACTPA 1/1 309 415 .. 1 123 [] 140.6 2.5e-37
+sp|Q8S3N2|DCOR_CAPAN 1/1 312 428 .. 1 123 [] 140.5 2.6e-37
+sp|P00861|DCDA_ECOLI 1/1 279 397 .. 1 123 [] 140.3 3.1e-37
+sp|Q7NE10|SPEA_GLOVI 1/1 346 557 .. 1 123 [] 140.2 3.1e-37
+sp|Q58497|DCDA_METJA 1/1 305 410 .. 1 123 [] 140.0 3.8e-37
+sp|Q5LIQ3|SPEA_BACFN 1/1 346 558 .. 1 123 [] 139.5 5.4e-37
+sp|Q64ZT8|SPEA_BACFR 1/1 346 558 .. 1 123 [] 139.5 5.4e-37
+sp|Q87VU3|SPEA_PSESM 1/1 354 567 .. 1 123 [] 138.1 1.3e-36
+sp|P40807|DCOR1_DROME 1/1 276 391 .. 1 123 [] 137.4 2.2e-36
+sp|B0U1H6|SPEA_XYLFM 1/1 343 555 .. 1 123 [] 137.4 2.3e-36
+sp|Q9PH02|SPEA_XYLFA 1/1 343 555 .. 1 123 [] 137.4 2.3e-36
+sp|O05321|DCDA_PSEFL 1/1 285 390 .. 1 123 [] 136.5 4.1e-36
+sp|B2I6M1|SPEA_XYLF2 1/1 343 555 .. 1 123 [] 136.3 4.7e-36
+sp|Q87F25|SPEA_XYLFT 1/1 343 555 .. 1 123 [] 136.3 4.7e-36
+sp|Q8DHY6|SPEA_THEEB 1/1 353 564 .. 1 123 [] 136.0 6.1e-36
+sp|O67262|DCDA_AQUAE 1/1 290 396 .. 1 123 [] 135.8 6.8e-36
+sp|Q88QC7|SPEA_PSEPK 1/1 354 567 .. 1 123 [] 134.8 1.3e-35
+sp|O14977|AZIN1_HUMAN 1/1 282 406 .. 1 123 [] 133.2 4.2e-35
+sp|Q5R7K3|AZIN1_PONAB 1/1 282 406 .. 1 123 [] 133.2 4.2e-35
+sp|O35484|AZIN1_MOUSE 1/1 282 406 .. 1 123 [] 132.9 5.1e-35
+sp|Q50140|DCDA_MYCLE 1/1 336 449 .. 1 123 [] 132.9 5.2e-35
+sp|A6L012|SPEA_BACV8 1/1 346 558 .. 1 123 [] 132.8 5.5e-35
+sp|P19572|DCDA_PSEAE 1/1 284 389 .. 1 123 [] 132.5 6.8e-35
+sp|Q8YRP3|SPEA_ANASP 1/1 395 606 .. 1 123 [] 132.3 7.9e-35
+sp|P23630|DCDA_BACSU 1/1 301 409 .. 1 123 [] 131.7 1.2e-34
+sp|Q9ZBH5|DCDA_STRCO 1/1 286 403 .. 1 123 [] 130.8 2.2e-34
+sp|Q8K9C4|DCDA_BUCAP 1/1 275 393 .. 1 123 [] 130.6 2.4e-34
+sp|Q0ACK8|SPEA_ALHEH 1/1 345 558 .. 1 123 [] 130.5 2.7e-34
+sp|Q949X7|DCDA1_ARATH 1/1 351 459 .. 1 123 [] 129.2 6.8e-34
+sp|Q94A94|DCDA2_ARATH 1/1 356 464 .. 1 123 [] 128.9 8.1e-34
+sp|P0A5M5|DCDA_MYCBO 1/1 311 424 .. 1 123 [] 128.6 9.9e-34
+sp|P0A5M4|DCDA_MYCTU 1/1 311 424 .. 1 123 [] 128.6 9.9e-34
+sp|P41931|DCOR_CAEEL 1/1 286 407 .. 1 123 [] 127.8 1.7e-33
+sp|O50657|DCLO_SELRU 1/1 266 371 .. 1 123 [] 127.7 1.9e-33
+sp|Q9KVL7|DCDA_VIBCH 1/1 286 391 .. 1 123 [] 127.4 2.4e-33
+sp|Q6ZG77|DCDA_ORYSJ 1/1 356 463 .. 1 123 [] 126.9 3.1e-33
+sp|Q55484|DCDA_SYNY3 1/1 332 440 .. 1 123 [] 126.7 3.6e-33
+sp|Q9JXM2|DCDA_NEIMB 1/1 276 381 .. 1 123 [] 125.6 8.1e-33
+sp|Q8P448|SPEA_XANCP 1/1 343 555 .. 1 123 [] 125.2 1e-32
+sp|Q54UF3|DCOR_DICDI 1/1 328 450 .. 1 123 [] 125.0 1.2e-32
+sp|Q9Z661|DCDA_ZYMMO 1/1 289 394 .. 1 123 [] 124.9 1.3e-32
+sp|Q9JWA6|DCDA_NEIMA 1/1 276 381 .. 1 123 [] 123.9 2.6e-32
+sp|P40808|DCOR2_DROME 1/1 276 390 .. 1 123 [] 123.4 3.6e-32
+sp|Q8PFQ5|SPEA_XANAC 1/1 343 555 .. 1 123 [] 122.9 5.1e-32
+sp|P56129|DCDA_HELPY 1/1 270 377 .. 1 123 [] 122.1 9e-32
+sp|Q89AC6|DCDA_BUCBP 1/1 275 393 .. 1 123 [] 121.5 1.4e-31
+sp|P78599|DCOR_CANAL 1/1 324 468 .. 1 123 [] 121.5 1.4e-31
+sp|Q8DA54|SPEA_VIBVU 1/1 355 571 .. 1 123 [] 121.1 1.8e-31
+sp|Q7MK24|SPEA_VIBVY 1/1 354 570 .. 1 123 [] 121.1 1.8e-31
+sp|A4Y5Y9|SPEA_SHEPC 1/1 350 566 .. 1 123 [] 121.1 1.8e-31
+sp|A1RKK8|SPEA_SHESW 1/1 350 566 .. 1 123 [] 121.1 1.8e-31
+sp|P57513|DCDA_BUCAI 1/1 275 393 .. 1 123 [] 121.0 2e-31
+sp|Q9RTK2|DCDA_DEIRA 1/1 253 357 .. 1 123 [] 120.9 2.1e-31
+sp|B8CR70|SPEA_SHEPW 1/1 350 566 .. 1 123 [] 120.8 2.2e-31
+sp|A3QDD8|SPEA_SHELP 1/1 350 566 .. 1 123 [] 120.3 3.2e-31
+sp|B8EAI2|SPEA_SHEB2 1/1 350 566 .. 1 123 [] 119.9 4.1e-31
+sp|A3D3G2|SPEA_SHEB5 1/1 350 566 .. 1 123 [] 119.9 4.1e-31
+sp|A6WM65|SPEA_SHEB8 1/1 350 566 .. 1 123 [] 119.9 4.1e-31
+sp|A9KY70|SPEA_SHEB9 1/1 350 566 .. 1 123 [] 119.9 4.1e-31
+sp|P27116|DCOR_LEIDO 1/1 509 682 .. 1 123 [] 119.8 4.5e-31
+sp|Q083L6|SPEA_SHEFN 1/1 350 566 .. 1 123 [] 119.2 6.6e-31
+sp|Q8EFU5|SPEA_SHEON 1/1 350 566 .. 1 123 [] 119.1 7e-31
+sp|B1KRD4|SPEA_SHEWM 1/1 350 566 .. 1 123 [] 118.6 1e-30
+sp|Q7V3M9|SPEA_PROMP 1/1 355 574 .. 1 123 [] 118.5 1.1e-30
+sp|A8FWJ3|SPEA_SHESH 1/1 350 566 .. 1 123 [] 117.5 2.2e-30
+sp|Q0HJY2|SPEA_SHESM 1/1 350 566 .. 1 123 [] 117.3 2.5e-30
+sp|Q0HW78|SPEA_SHESR 1/1 350 566 .. 1 123 [] 117.3 2.5e-30
+sp|Q63764|AZIN1_RAT 1/1 282 406 .. 1 123 [] 117.2 2.7e-30
+sp|Q9ZME5|DCDA_HELPJ 1/1 270 377 .. 1 123 [] 117.1 2.9e-30
+sp|A0KVN8|SPEA_SHESA 1/1 350 566 .. 1 123 [] 117.0 3.1e-30
+sp|Q8ZHG8|SPEA_YERPE 1/1 372 588 .. 1 123 [] 117.0 3.1e-30
+sp|B5XUB1|SPEA_KLEP3 1/1 345 561 .. 1 123 [] 116.8 3.5e-30
+sp|Q12LW6|SPEA_SHEDO 1/1 350 566 .. 1 123 [] 116.8 3.5e-30
+sp|A2BNH3|SPEA_PROMS 1/1 355 574 .. 1 123 [] 116.8 3.6e-30
+sp|Q87JS8|SPEA_VIBPA 1/1 354 570 .. 1 123 [] 116.7 3.8e-30
+sp|A8H5G3|SPEA_SHEPA 1/1 350 566 .. 1 123 [] 116.7 3.8e-30
+sp|A3PA96|SPEA_PROM0 1/1 355 574 .. 1 123 [] 116.6 4.1e-30
+sp|P41023|DCDA_BACMT 1/1 301 409 .. 1 123 [] 116.4 4.6e-30
+sp|B0TQX3|SPEA_SHEHH 1/1 350 566 .. 1 123 [] 116.4 4.8e-30
+sp|Q31DD8|SPEA_PROM9 1/1 355 574 .. 1 123 [] 116.4 4.8e-30
+sp|Q96412|SPE1_DIACA 1/1 491 605 .. 1 123 [] 116.3 4.9e-30
+sp|A1S712|SPEA_SHEAM 1/1 350 566 .. 1 123 [] 116.1 5.9e-30
+sp|A8G243|SPEA_PROM2 1/1 355 574 .. 1 123 [] 115.5 8.8e-30
+sp|Q7VEG4|SPEA_PROMA 1/1 355 574 .. 1 123 [] 115.2 1.1e-29
+sp|C4K6F4|SPEA_HAMD5 1/1 346 562 .. 1 123 [] 114.9 1.3e-29
+sp|B5F5L1|SPEA_SALA4 1/1 345 561 .. 1 123 [] 114.9 1.3e-29
+sp|Q57K30|SPEA_SALCH 1/1 345 561 .. 1 123 [] 114.9 1.3e-29
+sp|B5FUJ7|SPEA_SALDC 1/1 345 561 .. 1 123 [] 114.9 1.3e-29
+sp|B4THH1|SPEA_SALHS 1/1 345 561 .. 1 123 [] 114.9 1.3e-29
+sp|A9N4N1|SPEA_SALPB 1/1 345 561 .. 1 123 [] 114.9 1.3e-29
+sp|B4TV55|SPEA_SALSV 1/1 345 561 .. 1 123 [] 114.9 1.3e-29
+sp|P60659|SPEA_SALTY 1/1 371 587 .. 1 123 [] 114.9 1.3e-29
+sp|P60658|SPEA_SALTI 1/1 371 587 .. 1 123 [] 114.9 1.3e-29
+sp|B4T5J3|SPEA_SALNS 1/1 345 561 .. 1 123 [] 114.9 1.3e-29
+sp|P44316|DCDA_HAEIN 1/1 285 391 .. 1 123 [] 114.9 1.4e-29
+sp|P22220|SPE1_AVESA 1/1 355 532 .. 1 123 [] 114.8 1.4e-29
+sp|Q9X5M1|DCDA_MYCS2 1/1 336 449 .. 1 123 [] 114.7 1.5e-29
+sp|Q9KLD1|SPEA_VIBCH 1/1 354 570 .. 1 123 [] 114.4 1.9e-29
+sp|Q8XCX9|SPEA_ECO57 1/1 371 587 .. 1 123 [] 114.2 2.2e-29
+sp|B5YQD6|SPEA_ECO5E 1/1 345 561 .. 1 123 [] 114.2 2.2e-29
+sp|Q8FE34|SPEA_ECOL6 1/1 371 587 .. 1 123 [] 114.2 2.2e-29
+sp|B1LDE8|SPEA_ECOSM 1/1 345 561 .. 1 123 [] 114.2 2.2e-29
+sp|Q0T0V3|SPEA_SHIF8 1/1 345 561 .. 1 123 [] 113.9 2.6e-29
+sp|Q83Q93|SPEA_SHIFL 1/1 371 587 .. 1 123 [] 113.9 2.6e-29
+sp|B9M6H6|SPEA_GEOSF 1/1 346 561 .. 1 123 [] 113.6 3.3e-29
+sp|P21170|SPEA_ECOLI 1/1 371 587 .. 1 123 [] 113.6 3.4e-29
+sp|B5EIW4|SPEA_GEOBB 1/1 425 561 .. 1 123 [] 112.8 5.7e-29
+sp|C6E3V4|SPEA_GEOSM 1/1 425 561 .. 1 123 [] 112.8 5.7e-29
+sp|A1AS90|SPEA_PELPD 1/1 425 561 .. 1 123 [] 112.3 8.2e-29
+sp|A2BU00|SPEA_PROM5 1/1 355 574 .. 1 123 [] 112.2 8.6e-29
+sp|Q8RQM6|DCDA_COREF 1/1 324 437 .. 1 123 [] 109.3 6.4e-28
+sp|B4F1A4|SPEA_PROMH 1/1 347 563 .. 1 123 [] 108.8 8.9e-28
+sp|P74576|SPEA1_SYNY3 1/1 396 615 .. 1 123 [] 108.1 1.5e-27
+sp|A5GB52|SPEA_GEOUR 1/1 346 561 .. 1 123 [] 107.3 2.6e-27
+sp|Q7U3S0|SPEA_SYNPX 1/1 351 570 .. 1 123 [] 107.1 2.9e-27
+sp|A0A4W3|SPEA_GEOSL 1/1 425 561 .. 1 123 [] 106.7 3.9e-27
+sp|Q39X78|SPEA_GEOMG 1/1 425 561 .. 1 123 [] 106.4 4.8e-27
+sp|A1TY02|SPEA_MARAV 1/1 350 566 .. 1 123 [] 106.3 5e-27
+sp|Q9RXR4|SPEA_DEIRA 1/1 372 586 .. 1 123 [] 106.0 6.4e-27
+sp|P09890|DCDA_CORGL 1/1 310 423 .. 1 123 [] 105.3 1e-26
+sp|O82475|SPE1_BRAJU 1/1 390 585 .. 1 123 [] 104.8 1.5e-26
+sp|Q39827|SPE1_SOYBN 1/1 401 596 .. 1 123 [] 104.7 1.6e-26
+sp|Q7N121|SPEA_PHOLL 1/1 347 563 .. 1 123 [] 104.7 1.6e-26
+sp|B3EAF3|SPEA_GEOLS 1/1 346 561 .. 1 123 [] 104.5 1.8e-26
+sp|A5GWM2|SPEA_SYNR3 1/1 355 566 .. 1 123 [] 104.5 1.8e-26
+sp|Q7UTS2|SPEA_RHOBA 1/1 460 592 .. 1 123 [] 104.0 2.5e-26
+sp|Q9KCM5|DCDA_BACHD 1/1 301 409 .. 1 123 [] 103.8 3e-26
+sp|Q96A70|ADC_HUMAN 1/1 286 409 .. 1 123 [] 103.7 3.1e-26
+sp|Q43075|SPE1_PEA 1/1 494 609 .. 1 123 [] 102.6 6.5e-26
+sp|P72587|SPEA2_SYNY3 1/1 375 587 .. 1 123 [] 100.6 2.6e-25
+sp|Q7TUJ9|SPEA_PROMM 1/1 355 574 .. 1 123 [] 100.2 3.7e-25
+sp|P49726|SPE1_SOLLC 1/1 291 492 .. 1 123 [] 98.7 1e-24
+sp|Q9PII5|DCDA_CAMJE 1/1 270 375 .. 1 123 [] 98.5 1.1e-24
+sp|A2CDK1|SPEA_PROM3 1/1 355 574 .. 1 123 [] 98.1 1.5e-24
+sp|Q8BVM4|ADC_MOUSE 1/1 286 408 .. 1 123 [] 97.9 1.7e-24
+sp|Q9CL60|SPEA_PASMU 1/1 357 573 .. 1 123 [] 95.7 8e-24
+sp|O23141|SPE2_ARATH 1/1 481 596 .. 1 123 [] 94.8 1.5e-23
+sp|Q9SNN0|SPE1_ORYSJ 1/1 401 598 .. 1 123 [] 94.7 1.6e-23
+sp|P31851|TABA_PSESZ 1/1 278 383 .. 1 123 [] 92.2 8.9e-23
+sp|Q9JT25|SPEA_NEIMA 1/1 343 559 .. 1 123 [] 91.8 1.2e-22
+sp|Q9K0U3|SPEA_NEIMB 1/1 343 559 .. 1 123 [] 91.8 1.2e-22
+sp|Q7XRA1|ADC2_ORYSJ 1/1 381 547 .. 1 123 [] 91.2 1.8e-22
+sp|Q9SI64|SPE1_ARATH 1/1 385 584 .. 1 123 [] 88.2 1.5e-21
+sp|C4L9A9|SPEA_TOLAT 1/1 433 566 .. 1 123 [] 87.6 2.2e-21
+sp|A0KIP8|SPEA_AERHH 1/1 348 564 .. 1 123 [] 78.4 1.3e-18
+sp|A4SPD6|SPEA_AERS4 1/1 348 564 .. 1 123 [] 73.6 3.6e-17
+sp|P55709|Y4YA_RHISN 1/1 324 439 .. 1 123 [] 23.1 0.0018
+sp|O81160|SPE2_THECC 1/1 341 406 .] 1 123 [] -9.6 1.1
+
+Alignments of top-scoring domains:
+sp|O29458|DCDA_ARCFU: domain 1 of 1, from 285 to 391: score 173.5, E = 3e-47
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+t+V +vk+ g+ + fv+ +d+G++ + ++pa+y+ +
+ sp|O29458| 285 VLITRVNAVKK-GY-KN--------FVA-VDAGFNVL-IRPAMYGSY 319
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h++++ +++d+ep+e++t++GP+C+sgDvlar d++LP ++evGDl++
+ sp|O29458| 320 HRVAVANKMDAEPEEVYTVVGPICESGDVLAR-DRKLP---KVEVGDLIA 365
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +fdaGAY+++++s++Ng+pr+aeVlv
+ sp|O29458| 366 VFDAGAYGFVMSSQYNGRPRCAEVLV 391
+
+sp|Q9UQW9|DCOR_SCHPO: domain 1 of 1, from 307 to 426: score 171.6, E = 1.2e-46
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ tL++nVi+++++++++k +yy++dGvygs ++++l+d++
+ sp|Q9UQW9| 307 TLAVNVIAKRKLDDEEK--------VMYYVNDGVYGS-LNCILFDHQ 344
+
+ CS --EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE...
+ hpilpvsr.........ldeeptepvtlaGPtCdsgDvlarFdvsLPlHl
+ hp++ v + +++ ++l ++ +++ ++GPtCds+Dv+a+ d +LP
+ sp|Q9UQW9| 345 HPVARVLKcgsrfvyndLVGTGQHRCFIWGPTCDSLDVIAN-DAHLPY-- 391
+
+ CS ------EEEES-----SGCC-B-TTT--.-EEEEE
+ elevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ el+vGD+++f+daGAYt ++as+FNgf+ +V++
+ sp|Q9UQW9| 392 ELNVGDWIYFEDAGAYTVAAASCFNGFKTSRIVYL 426
+
+sp|O27390|DCDA_METTH: domain 1 of 1, from 292 to 398: score 162.1, E = 8.4e-44
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+t+V ++ke ++ rk f++ +d+G++++ ++pa+y+ +
+ sp|O27390| 292 YLLTRVNTIKE-SY-RK--------FAG-VDAGFNTL-LRPAMYGSY 326
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h+il+ +r+ +ep e+ ++aG+ C+sgD +ar d++LP e+++GD l+
+ sp|O27390| 327 HHILVAERPLDEPSEKMDVAGNVCESGDLFAR-DRQLP---EINEGDVLA 372
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +++aGAY +s++s++N++prpaeVlv
+ sp|O27390| 373 IMNAGAYSFSMSSQYNSRPRPAEVLV 398
+
+sp|Q9I8S4|DCOR2_XENLA: domain 1 of 1, from 284 to 405: score 160.6, E = 2.3e-43
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-
+ *->tLvtnVigvkergg..........drkldlnerlafvyylddGvygs
+ +L++nVi++ke++ + ++++++++ + ++yy++dGvygs
+ sp|Q9I8S4| 284 SLAVNVIAKKEVEHsvsddeenesSKS--------IMYYVNDGVYGS 322
+
+ CS .-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE
+ lpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvsLP
+ +++ +d+ hp +++++++ +++p+++++l+GPtCd++D +a+ v+LP
+ sp|Q9I8S4| 323 -FNCLVFDHAHPKPILHKkpSPDQPLYTSSLWGPTCDGLDQIAE-RVQLP 370
+
+ CS ...------EEEES-----SGCC-B-TTT--.-EEEEE
+ lHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ el+vGD+l+f+++GAYt++++snFNgf++ ++ +
+ sp|Q9I8S4| 371 ---ELHVGDWLLFENMGAYTIAASSNFNGFQQSPVHYA 405
+
+sp|P09057|DCOR_RAT: domain 1 of 1, from 285 to 408: score 160.5, E = 2.5e-43
+ CS EEEEEEEEEEE--S S-E.. ......EEEEES----S-.-CH
+ *->tLvtnVigvkergg.....drkld.lnerlafvyylddGvygslpdp
+ tL++n+i++k++ +++++d+ d+ ne++ ++y ++dGvygs +++
+ sp|P09057| 285 TLAVNIIAKKTVWKeqtgsDDE-DeSNEQTLMYY-VNDGVYGS-FNC 328
+
+ CS HHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE...-
+ alydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvsLPlHle
+ +lyd+ h ++++++++++e+ ++++++GPtCd++D + + +sLP e
+ sp|P09057| 329 ILYDHAHVKALLQKrpKPDEKYYSSSIWGPTCDGLDRIVE-RCSLP---E 374
+
+ CS -----EEEES-----SGCC-B-TTT--.-EEEEE
+ levGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ ++vGD+++f+++GAYt ++as+FNgf+rp++++v
+ sp|P09057| 375 MHVGDWMLFENMGAYTVAAASTFNGFQRPNIYYV 408
+
+sp|P14019|DCOR_CRIGR: domain 1 of 1, from 282 to 402: score 159.9, E = 3.8e-43
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.
+ *->tLvtnVigvkergg.........drkldlnerlafvyylddGvygsl
+ tL++n+i++k ++ ++++++++++++ f+yy++dGvygs
+ sp|P14019| 282 TLAVNIIAKKIVSKgsddedessEQT--------FMYYVNDGVYGS- 319
+
+ CS -CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE.
+ pdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvsLPl
+ ++++lyd+ h ++++++++++e+ ++++++GPtCd++D + + + LP
+ sp|P14019| 320 FNCILYDHAHVKPLLPKrpKPDEKYYSSSIWGPTCDGLDRIVE-RCNLP- 367
+
+ CS ..------EEEES-----SGCC-B-TTT--.-EEEEE
+ HlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ e++vGD+++f+++GAYt ++as+FNgf+rp++++v
+ sp|P14019| 368 --EMHVGDWMLFENMGAYTVAAASTFNGFQRPSIYYV 402
+
+sp|P00860|DCOR_MOUSE: domain 1 of 1, from 285 to 408: score 159.8, E = 3.9e-43
+ CS EEEEEEEEEEE--S S-E........EEEEES----
+ *->tLvtnVigvkergg............drkldlnerlafvyylddGvy
+ tL++n+i++k++ +++++++++++++++ f+yy++dGvy
+ sp|P00860| 285 TLAVNIIAKKTVWKeqpgsddedesnEQT--------FMYYVNDGVY 323
+
+ CS S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEE
+ gslpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvs
+ gs ++++lyd+ h ++++++++++e+ ++++++GPtCd++D + + +
+ sp|P00860| 324 GS-FNCILYDHAHVKALLQKrpKPDEKYYSSSIWGPTCDGLDRIVE-RCN 371
+
+ CS EE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ LPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ LP e++vGD+++f+++GAYt ++as+FNgf+rp++++v
+ sp|P00860| 372 LP---EMHVGDWMLFENMGAYTVAAASTFNGFQRPNIYYV 408
+
+sp|P27119|DCOR_MUSPA: domain 1 of 1, from 285 to 408: score 159.8, E = 3.9e-43
+ CS EEEEEEEEEEE--S S-E........EEEEES----
+ *->tLvtnVigvkergg............drkldlnerlafvyylddGvy
+ tL++n+i++k++ +++++++++++++++ f+yy++dGvy
+ sp|P27119| 285 TLAVNIIAKKTVWKeqpgsddedesnEQT--------FMYYVNDGVY 323
+
+ CS S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEE
+ gslpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvs
+ gs ++++lyd+ h ++++++++++e+ ++++++GPtCd++D + + +
+ sp|P27119| 324 GS-FNCILYDHAHVKALLQKrpKPDEKYYSSSIWGPTCDGLDRIVE-RCN 371
+
+ CS EE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ LPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ LP e++vGD+++f+++GAYt ++as+FNgf+rp++++v
+ sp|P27119| 372 LP---EMHVGDWMLFENMGAYTVAAASTFNGFQRPNIYYV 408
+
+sp|P27118|DCOR_CHICK: domain 1 of 1, from 275 to 398: score 158.8, E = 8e-43
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.-
+ *->tLvtnVigvkergg........drkldlnerlafvyylddGvygslp
+ tL++n+i++k ++ ++++++++d++ n+++ ++y ++dGvygs +
+ sp|P27118| 275 TLAVNIIAKKIVSKeqtgsddeDDV---NDKTLMYY-VNDGVYGS-F 316
+
+ CS CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE..
+ dpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvsLPlH
+ +++lyd+ h +++++++++++ +++++++GPtCd++D + + + +P
+ sp|P27118| 317 NCILYDHAHVKPVLQKrpKPDDGCYSCSIWGPTCDGLDRIVE-RCNMP-- 363
+
+ CS .------EEEES-----SGCC-B-TTT--.-EEEEE
+ lelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ el+vGD+++f+++GAYt ++as+FNgf+rp + +v
+ sp|P27118| 364 -ELQVGDWILFENMGAYTVAAASTFNGFQRPTIHYV 398
+
+sp|P27120|DCOR1_XENLA: domain 1 of 1, from 285 to 409: score 157.0, E = 2.8e-42
+ CS EEEEEEEEEEE--S S-E.. ......EEEEES----S-.-C
+ *->tLvtnVigvkergg......drkld.lnerlafvyylddGvygslpd
+ tL++n+i++k++ ++++++d+ d n+++ ++y ++dGvygs ++
+ sp|P27120| 285 TLAVNIIAKKVMVNeqsgsdDEE-DaANDKTLMYY-VNDGVYGS-FN 328
+
+ CS HHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE...
+ palydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvsLPlHl
+ ++l+d+ h +++ ++++++e+ ++++++GPtCd++D + + ++LP
+ sp|P27120| 329 CILFDHAHVKPVLTKkpKPDEKFYSSSIWGPTCDGLDRIVE-RFELP--- 374
+
+ CS ------EEEES-----SGCC-B-TTT--.-EEEEE
+ elevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ el+vGD+++f+++GAYt ++as+FNgf+rp ++v
+ sp|P27120| 375 ELQVGDWMLFENMGAYTVAAASTFNGFQRPTLYYV 409
+
+sp|P11926|DCOR_HUMAN: domain 1 of 1, from 285 to 408: score 156.9, E = 3e-42
+ CS EEEEEEEEEEE--S S-E........EEEEES----
+ *->tLvtnVigvkergg............drkldlnerlafvyylddGvy
+ tL++n+i++k + +++++++++++++++ f+yy++dGvy
+ sp|P11926| 285 TLAVNIIAKKIVLKeqtgsddedessEQT--------FMYYVNDGVY 323
+
+ CS S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEE
+ gslpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvs
+ gs ++++lyd+ h ++++++++++e+ ++++++GPtCd++D + + +
+ sp|P11926| 324 GS-FNCILYDHAHVKPLLQKrpKPDEKYYSSSIWGPTCDGLDRIVE-RCD 371
+
+ CS EE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ LPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ LP e++vGD+++f+++GAYt ++as+FNgf+rp +++v
+ sp|P11926| 372 LP---EMHVGDWMLFENMGAYTVAAASTFNGFQRPTIYYV 408
+
+sp|P27117|DCOR_BOVIN: domain 1 of 1, from 285 to 408: score 154.1, E = 2.1e-41
+ CS EEEEEEEEEEE--S S-E........EEEEES----
+ *->tLvtnVigvkergg............drkldlnerlafvyylddGvy
+ tL++n+i++k + ++++++++++++dr+ f+yy++dGvy
+ sp|P27117| 285 TLAVNIIAKKLVLKeqtgsddeeestDRT--------FMYYVNDGVY 323
+
+ CS S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEE
+ gslpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvs
+ gs ++++lyd+ h ++++++++++e+ ++++++GPtCd++D + + +
+ sp|P27117| 324 GS-FNCILYDHAHVKPLLQKrpKPDEKYYSSSIWGPTCDGLDRIVE-RCN 371
+
+ CS EE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ LPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ LP e++vGD+++f+++GAYt ++as+FNgf+rp +++v
+ sp|P27117| 372 LP---EMHVGDWMLFENMGAYTVAAASTFNGFQRPTIYYV 408
+
+sp|P07805|DCOR_TRYBB: domain 1 of 1, from 283 to 406: score 151.2, E = 1.6e-40
+ CS EEEEEEEEEEE--S S-E........EEEEES----
+ *->tLvtnVigvkergg............drkldlnerlafvyylddGvy
+ tL++nVi++k+ +g +++ + + +++++ f+yy++dGvy
+ sp|P07805| 283 TLAVNVIAKKVTPGvqtdvgahaesnAQS--------FMYYVNDGVY 321
+
+ CS S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEE
+ gslpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvs
+ gs ++++lyd+ ++ +r++ ++e+++p++++GPtCd++D + + ++
+ sp|P07805| 322 GS-FNCILYDHAVVRPLPQRepIPNEKLYPSSVWGPTCDGLDQIVE-RYY 369
+
+ CS EE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ LPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ LP e++vG++l+f+d+GAYt + +s FNgf+ p +++v
+ sp|P07805| 370 LP---EMQVGEWLLFEDMGAYTVVGTSSFNGFQSPTIYYV 406
+
+sp|Q9X1K5|DCDA_THEMA: domain 1 of 1, from 257 to 362: score 150.5, E = 2.6e-40
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+ +V+ vk+r+ + fv+ +d+G++ + ++paly a+
+ sp|Q9X1K5| 257 YLLLRVVLVKRRHN-KA--------FVV-VDGGMNVL-IRPALYSAY 292
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h+i ++ ++++ +++++GP+C+sgDv+a d++LP e+e+GD+++
+ sp|Q9X1K5| 293 HRIFVLG--KQGKEMRADVVGPLCESGDVIAY-DRELP---EVEPGDIIA 336
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +++aGAY++++++n+N+ rpaeVlv
+ sp|Q9X1K5| 337 VENAGAYGYTMSNNYNSTTRPAEVLV 362
+
+sp|P49725|DCOR_PANRE: domain 1 of 1, from 294 to 416: score 146.6, E = 3.7e-39
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.-C
+ *->tLvtnVigvkergg.......drkldlnerlafvyylddGvygslpd
+ ++ tnVi+ +++ ++ +++ d++ n+ +++y ++dGvygs ++
+ sp|P49725| 294 SVTTNVIASVKVPAsritekaDDV---NRDGYMYY-MNDGVYGS-FN 335
+
+ CS HHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE...
+ palydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvsLPlHl
+ + l+d+++p ++++++ep++pv+++GPtCd++D + + +P
+ sp|P49725| 336 CKLFDHYQPRGMPLAehDADEPRFPVCVWGPTCDGLDQVEE-SSVMP--- 381
+
+ CS ------EEEES-----SGCC-B-TTT--.-EEEEE
+ elevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ +l +GD+l+++d+GAYt+++as+FNgf p+++++
+ sp|P49725| 382 RLYEGDWLYYPDMGAYTSVAASTFNGFDKPKTYYF 416
+
+sp|O22616|DCOR_SOLLC: domain 1 of 1, from 308 to 424: score 145.8, E = 6.6e-39
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS-
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalyda.
+ tL+t++ig+++rg+ k ++ ++dG+ygs ++++lyd+
+ sp|O22616| 308 TLATTIIGKRVRGE-LK--------EYW-INDGLYGS-MNCVLYDHa 343
+
+ CS ---EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE...
+ ...lhpilpvsr.....ldeeptepvtlaGPtCdsgDvlarFdvsLPlHl
+ + + p ++ s++++ + +++t+p+t++GPtCd++D++ r d++LP
+ sp|O22616| 344 tvtATPLACMSNrnnlnCGGSKTFPSTVFGPTCDALDTVLR-DYQLP--- 389
+
+ CS ------EEEES-----SGCC-B-TTT--.-EEEEE
+ elevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ el+v+D+l+f+++GAYt +++snFNgf a+V
+ sp|O22616| 390 ELQVNDWLIFPNMGAYTKAAGSNFNGFNTSAIVTH 424
+
+sp|P27121|DCOR_NEUCR: domain 1 of 1, from 326 to 471: score 145.7, E = 7.3e-39
+ CS EEEEEEEEEEE--S S-E.. ......EEEEES--
+ *->tLvtnVigvkergg.............drkld.lnerlafvyylddG
+ tL++n+i+++++ +++ + +++++ +d+ + +++++ ++vy ++dG
+ sp|P27121| 326 TLACNIIARRTIQDgsavsvsdsssmsDDGSVnNGDARYMVY-VNDG 371
+
+ CS --S-.-CHHHHS----EEECSS -TTSSEEEEEEE--
+ vygslpdpalydalhpilpvsr..............ldeeptepvtlaGP
+ +yg+ ++++++d++hp++ + r ++++ ++ ++ +e + +++++GP
+ sp|P27121| 372 LYGN-FSSIMFDHQHPVAKILRaggrtmynsvaaheSSAEDAIEYSIWGP 420
+
+ CS ---TT--SEE.EEEEE...------EEEES-----SGCC-B-TTT--.-E
+ tCdsgDvlarFdvsLPlHlelevGDllvffdaGAYteslasnFNgfprpa
+ tCd+ D + + + + + l+vGD+l+f+d+GAYt + a++FNgf
+ sp|P27121| 421 TCDGIDRITE-SIRFRE--ILDVGDWLYFEDMGAYTKCSATTFNGFSNEH 467
+
+ CS EEEE
+ eVlv<-*
+ V++
+ sp|P27121| 468 DVIY 471
+
+sp|P50134|DCOR_DATST: domain 1 of 1, from 308 to 424: score 145.5, E = 8.2e-39
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS-
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalyda.
+ tL+t++ig+++rg + y+++dG+ygs ++++lyd+
+ sp|P50134| 308 TLATTIIGKRVRG--EL--------REYWINDGLYGS-MNCVLYDHa 343
+
+ CS ---EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE...
+ ...lhpilpvsr.....ldeeptepvtlaGPtCdsgDvlarFdvsLPlHl
+ + + p ++ s++++ + +++t+p+t++GPtCd++D++ r d++LP
+ sp|P50134| 344 tvnATPLACMSNrsnlnCGGSKTFPSTVFGPTCDALDTVLR-DYQLP--- 389
+
+ CS ------EEEES-----SGCC-B-TTT--.-EEEEE
+ elevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ el+v+D+l+f+++GAYt +++snFNgf a+V
+ sp|P50134| 390 ELQVNDWLIFPNMGAYTKAAGSNFNGFNTSAIVTH 424
+
+sp|P08432|DCOR_YEAST: domain 1 of 1, from 329 to 460: score 143.2, E = 4e-38
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ tL+++Vi+++++++++ ++y ++dGvyg+ ++++l+d++
+ sp|P08432| 329 TLASHVIAKRKLSENEA--------MIY-TNDGVYGN-MNCILFDHQ 365
+
+ CS --EEECSS -TTSSEEEEEEE-----TT-
+ hpilpvsr......................ldeeptepvtlaGPtCdsgD
+ p + + +++ + + ++ ++++ ++ ++ ++e ++v+++GPtCd++D
+ sp|P08432| 366 EPHPRTLYhnlefhyddfesttavldsinkTRSEYPYKVSIWGPTCDGLD 415
+
+ CS -SEE.EEEEE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ vlarFdvsLPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-
+ ++a+ ++++ + ++ vGD+ +f+ GAYt+s+a++FNgf+++a +++
+ sp|P08432| 416 CIAK-EYYMKH--DVIVGDWFYFPALGAYTSSAATQFNGFEQTADIVY 460
+
+ CS
+ *
+
+ sp|P08432| - -
+
+sp|Q8A2B1|SPEA_BACTN: domain 1 of 1, from 346 to 558: score 142.0, E = 9.1e-38
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+++V+ + ++++ +++++ ++ ++ ++ + ++ ++++ +
+ sp|Q8A2B1| 346 VLIFEVLETATLPEwddeeeiapdahelvqelysiwdslnqnkmlea 392
+
+ CS S
+ .................................................d
+ ++ ++ +++ + +++ + +++ + ++ + +++ ++ ++ ++ +
+ sp|Q8A2B1| 393 whdaqqireealdlfshgivdlktraqierlywsitreinqiagglkhaP 442
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ + +++l++ la+ y++++++++slpd++++d+++pi+p++rlde p++++
+ sp|Q8A2B1| 443 DEFRgLSKLLADKYFCNFSLFQSLPDSWAIDQIFPIMPIQRLDEKPERSA 492
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SGC
+ tlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtes
+ tl + tCds++++a+F ++++ +LP+H+l+ + ++l++f++GAY+e+
+ sp|Q8A2B1| 493 TLQDITCDSDGKIANFistrnvAHYLPVHsLKKTEPYYLAVFLVGAYQEI 542
+
+ CS C-B-TTT--.-EEEEE
+ lasnFNgfprpaeVlv<-*
+ l++++N+f++++ V+v
+ sp|Q8A2B1| 543 LGDMHNLFGDTNAVHV 558
+
+sp|Q9HUX1|SPEA_PSEAE: domain 1 of 1, from 354 to 567: score 141.0, E = 1.9e-37
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t+V++v + +++ ++ + +++++ + + ++++ + +++
+ sp|Q9HUX1| 354 VLITQVTDVERHNDdvpkivdldeqpeivrwlaellgptdaemvtet 400
+
+ CS
+ ..................................................
+ + ++ ++ + +++ + ++ ++ ++ +++ + +++++
+ sp|Q9HUX1| 401 ywrathyigdaaaqyadgkislaqkalaeqcyfaicrrlhnqlkarqrsh 450
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEE
+ drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptep
+ +++ld+ln++la+ y+++++v++slpd+++++++ pilp++rl eep+++
+ sp|Q9HUX1| 451 RQVLDeLNDKLADKYICNFSVFQSLPDTWAIGQVLPILPLHRLGEEPDRR 500
+
+ CS EEEE-----TT--SEE. EEEEE.. .------EEEES-----SG
+ vtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYte
+ ++l + tCds++++ ++ ++++ + sLP+H+++ +++l+++f++GAY+e
+ sp|Q9HUX1| 501 AVLQDLTCDSDGKITQYvdeqsiETSLPVHeVKEGEDYLIGVFLVGAYQE 550
+
+ CS CC-B-TTT--.-EEEEE
+ slasnFNgfprpaeVlv<-*
+ +l++++N+f++++ V v
+ sp|Q9HUX1| 551 ILGDMHNLFGDTDSVNV 567
+
+sp|Q7NU27|SPEA_CHRVO: domain 1 of 1, from 343 to 556: score 140.9, E = 2e-37
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV++v +++++ + ++ ++ + + ++ + + ++++ ++
+ sp|Q7NU27| 343 VLLMNVTDVERLPDtvapidkaeelslplrklvelanlndeelvtei 389
+
+ CS
+ ..................................................
+ + ++ ++ ++ +++ + +++ ++ + + ++ +++ + +++++
+ sp|Q7NU27| 390 yyrashcvsevsemyaegrlslqekalaedlhatlcrrlhnqlqasqrsq 439
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEE
+ drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptep
+ ++++d+l++rla+ y+++++v++slpd++++d++ pi+pv+rl+e+pt++
+ sp|Q7NU27| 440 RQVYDeLTDRLADKYFCNFSVFQSLPDTWAIDQVLPIMPVHRLAEQPTRR 489
+
+ CS EEEE-----TT--SEE. EEEEE.. .------EEEES-----SG
+ vtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYte
+ ++l + tCds+++l ++ ++++ + s+ +H+++ +l+++f++GAY+e
+ sp|Q7NU27| 490 AVLQDLTCDSDGKLKQYvdqqsiESSMSVHeVKQGDEYLIAVFLVGAYQE 539
+
+ CS CC-B-TTT--.-EEEEE
+ slasnFNgfprpaeVlv<-*
+ +l++++N+f++++ V v
+ sp|Q7NU27| 540 ILGDMHNLFGDTDSVNV 556
+
+sp|O69203|DCDA_ACTPA: domain 1 of 1, from 309 to 415: score 140.6, E = 2.5e-37
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ + +++V +vk+ g +r+ fv+ +d+G++++ p+paly+ +
+ sp|O69203| 309 VTLYRVAAVKR-GVRRV--------FVA-VDGGMSDN-PRPALYGSR 344
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ + +++v+ ++++++pvt++G++C++gDvla+ dv+LP+ ++++GDll+
+ sp|O69203| 345 YAVRLVR--RGGRRAPVTVVGRHCEAGDVLAE-DVPLPE--DVRAGDLLA 389
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ ++ +GAY+++lasn+N ++rp++V v
+ sp|O69203| 390 VPVTGAYHHALASNYNAVGRPPVVGV 415
+
+sp|Q8S3N2|DCOR_CAPAN: domain 1 of 1, from 312 to 428: score 140.5, E = 2.6e-37
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS-
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalyda.
+ tL+t++ig+++rg + y+++dG+ygs ++++lyd+
+ sp|Q8S3N2| 312 TLATTIIGKRVRG--DL--------REYWINDGLYGS-MNCVLYDHa 347
+
+ CS ---EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE...
+ ...lhpilpvsr.....ldeeptepvtlaGPtCdsgDvlarFdvsLPlHl
+ + + p ++ s++ + + +++ +p+t++GPtCd++D++ r d++ P
+ sp|Q8S3N2| 348 tvtATPLACMSNrvnlnCSGSKMFPSTIFGPTCDALDTVLR-DYHVP--- 393
+
+ CS ------EEEES-----SGCC-B-TTT--.-EEEEE
+ elevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ el+v+D+++f+++GAYt +++snFNgf a+V
+ sp|Q8S3N2| 394 ELQVNDWVIFPNMGAYTKAAGSNFNGFNTSAIVTH 428
+
+sp|P00861|DCDA_ECOLI: domain 1 of 1, from 279 to 397: score 140.3, E = 3.1e-37
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+t+V +vk +g r fv +d+G++++ ++pa+y+ +
+ sp|P00861| 279 VLITQVRSVKQMGS-RH--------FVL-VDAGFNDL-MRPAMYGSY 314
+
+ CS --EEECSS -TTSSEEEEEEE-----TT--S EE.EEEEE.
+ hpilpvsr....ldeeptepvtlaGPtCdsgDvl.......arFdvsLPl
+ h+i + +++++l+ +pt+++++aGP+C+sgDv++++++++ + +++LP
+ sp|P00861| 315 HHISALAAdgrsLEHAPTVETVVAGPLCESGDVFtqqeggnVE-TRALP- 362
+
+ CS ..------EEEES-----SGCC-B-TTT--.-EEEEE
+ HlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ e+++GD+lv +d+GAY+ s++sn+N++p+ +eVl+
+ sp|P00861| 363 --EVKAGDYLVLHDTGAYGASMSSNYNSRPLLPEVLF 397
+
+sp|Q7NE10|SPEA_GLOVI: domain 1 of 1, from 346 to 557: score 140.2, E = 3.1e-37
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+ V+gv+++ ++++++ +++++ ++ ++ ++ ++++ ++
+ sp|Q7NE10| 346 VLVFDVMGVSHLQFgepepparnehsiirnlyetytqitpdnvqeaf 392
+
+ CS S-
+ ................................................dr
+ ++ ++ +++ + + + +++ + ++ + ++ + ++ + ++
+ sp|Q7NE10| 393 ndasqfkeealslfalgylglgeraraerlywgccekilnlvreldyiPD 442
+
+ CS E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEEE
+ kld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepvt
+ l++l++++a +yy++++v++s pd++++d+l+pi+p++rldeep ++ t
+ sp|Q7NE10| 443 ELAdLEKNMASTYYCNFSVFQSAPDSWAIDQLFPIMPIHRLDEEPKARGT 492
+
+ CS EE-----TT--SEE. EEEEE.. .------EEEES-----SGCC
+ laGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtesl
+ la+ tCds++++++F + ++ + L lH++++e+ ++l++f+ GAY+e+l
+ sp|Q7NE10| 493 LADLTCDSDGKIDQFidlrdvKGVLELHpVRPEEPYYLGMFLNGAYQEIL 542
+
+ CS -B-TTT--.-EEEEE
+ asnFNgfprpaeVlv<-*
+ ++++N+f+++++V++
+ sp|Q7NE10| 543 GDMHNLFGDTNTVHI 557
+
+sp|Q58497|DCDA_METJA: domain 1 of 1, from 305 to 410: score 140.0, E = 3.8e-37
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+ +V+++ke + k +v +d+G+++ ++pa+y+a+
+ sp|Q58497| 305 YLLGKVHHIKETPV-TK--------WVM-IDAGMNDM-MRPAMYEAY 340
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h+i+ + + e+v++aG +C+s Dv++r d++L+ ++evGD l+
+ sp|Q58497| 341 HHIINCK--VKNEKEVVSIAGGLCESSDVFGR-DRELD---KVEVGDVLA 384
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +fd+GAY++s+a+n+N ++rp Vl
+ sp|Q58497| 385 IFDVGAYGISMANNYNARGRPRMVLT 410
+
+sp|Q5LIQ3|SPEA_BACFN: domain 1 of 1, from 346 to 558: score 139.5, E = 5.4e-37
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+++V+ + +++ +++++ ++ ++ ++ + ++ ++++ +
+ sp|Q5LIQ3| 346 VLIFEVLETATLPQwddeeeiapdahelvqelygiwdtlnqnkmlea 392
+
+ CS S
+ .................................................d
+ ++ ++ +++ + +++ + +++ + ++ + +++ ++ ++ ++ +
+ sp|Q5LIQ3| 393 whdaqqireealdlfshgivdlktraqierlywsitreinqiagglkhaP 442
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ + +++l++ la+ y++++++++slpd++++d+++pi+p++rlde p++++
+ sp|Q5LIQ3| 443 DEFRgLSKLLADKYFCNFSLFQSLPDSWAIDQIFPIMPIQRLDEKPDRSA 492
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SGC
+ tlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtes
+ tl + tCds++++a+F ++++ ++P+H+l+ ++ +++++f++GAY+e+
+ sp|Q5LIQ3| 493 TLQDITCDSDGKIANFistrnvAHYMPVHsLKQKEPYYVAVFLVGAYQEI 542
+
+ CS C-B-TTT--.-EEEEE
+ lasnFNgfprpaeVlv<-*
+ l++++N+f++++ V+v
+ sp|Q5LIQ3| 543 LGDMHNLFGDTNAVHV 558
+
+sp|Q64ZT8|SPEA_BACFR: domain 1 of 1, from 346 to 558: score 139.5, E = 5.4e-37
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+++V+ + +++ +++++ ++ ++ ++ + ++ ++++ +
+ sp|Q64ZT8| 346 VLIFEVLETATLPQwddeeeiapdahelvqelygiwdtlnqnkmlea 392
+
+ CS S
+ .................................................d
+ ++ ++ +++ + +++ + +++ + ++ + +++ ++ ++ ++ +
+ sp|Q64ZT8| 393 whdaqqireealdlfshgivdlktraqierlywsitreinqiagglkhaP 442
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ + +++l++ la+ y++++++++slpd++++d+++pi+p++rlde p++++
+ sp|Q64ZT8| 443 DEFRgLSKLLADKYFCNFSLFQSLPDSWAIDQIFPIMPIQRLDEKPDRSA 492
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SGC
+ tlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtes
+ tl + tCds++++a+F ++++ ++P+H+l+ ++ +++++f++GAY+e+
+ sp|Q64ZT8| 493 TLQDITCDSDGKIANFistrnvAHYMPVHsLKQKEPYYVAVFLVGAYQEI 542
+
+ CS C-B-TTT--.-EEEEE
+ lasnFNgfprpaeVlv<-*
+ l++++N+f++++ V+v
+ sp|Q64ZT8| 543 LGDMHNLFGDTNAVHV 558
+
+sp|Q87VU3|SPEA_PSESM: domain 1 of 1, from 354 to 567: score 138.1, E = 1.3e-36
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv++V++v + +++ ++ ++++ +++ + + ++++ + +++
+ sp|Q87VU3| 354 MLVVQVTDVEKHNDevpkiadkeslpetvqwlvdllgptdiemvtet 400
+
+ CS
+ ..................................................
+ + ++ ++ ++ +++ + ++ +++ ++ ++ + +++++
+ sp|Q87VU3| 401 ywrathymsdiatqyadgkislaekalgeqcyfavcrrlynslkarqrsh 450
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEE
+ drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptep
+ +++ld+ln++la+ y+++++v++slpd+++++++ pilp++rldeep ++
+ sp|Q87VU3| 451 RQVLDeLNDKLADKYICNFSVFQSLPDTWAIGQVLPILPLHRLDEEPVRR 500
+
+ CS EEEE-----TT--SEE. EEEEE.. .------EEEES-----SG
+ vtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYte
+ ++l + tCds++++ ++ ++++ + s+P+H+l +++ll++f++GAY+e
+ sp|Q87VU3| 501 AVLQDLTCDSDGKIKQYvdeqsiETSMPVHsLNEGEDYLLGIFLVGAYQE 550
+
+ CS CC-B-TTT--.-EEEEE
+ slasnFNgfprpaeVlv<-*
+ +l++++N+f++++ V +
+ sp|Q87VU3| 551 ILGDMHNLFGDTDSVNI 567
+
+sp|P40807|DCOR1_DROME: domain 1 of 1, from 276 to 391: score 137.4, E = 2.2e-36
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.-CHH
+ *->tLvtnVigvkergg.....drkldlnerlafvyylddGvygslpdpa
+ tLv+++++++e++ + ++ d + ++y l+dGvygs ++++
+ sp|P40807| 276 TLVCKIHAKREIRNeagklDTV--------MYY-LNDGVYGS-FNCI 312
+
+ CS HHS- ---EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...-
+ lyda...lhpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHle
+ lyd++ + ++ + ++ p+ ++ ++GP+Cd++D++ + d +LP
+ sp|P40807| 313 LYDHqvvIAEHYLDN-AESLPHLKSLIWGPSCDALDKISE-DLHLP---N 357
+
+ CS -----EEEES-----SGCC-B-TTT--.-EEEEE
+ levGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ l++GDll+f ++GAYt+ as FNgf+ p++ ++
+ sp|P40807| 358 LNRGDLLGFRNMGAYTMPIASAFNGFEVPKTLYF 391
+
+sp|B0U1H6|SPEA_XYLFM: domain 1 of 1, from 343 to 555: score 137.4, E = 2.3e-36
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV+ v +++++ ++ ++++ ++ ++ ++ + ++ +
+ sp|B0U1H6| 343 VLIANVTEVEAVPEgrvpglcddepavvrhmreiygeldarpaielf 389
+
+ CS S
+ .................................................d
+ + ++ + ++ + ++ + ++ + ++ +++ +++ ++++++++
+ sp|B0U1H6| 390 yeaqhfhaeglaaytlgqidlvhrariddlfyaishgvrerlsheekshR 439
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ ++ld+lnerl++ y+++++v+ s+pd +++++++pi+p++rl+e+pt++
+ sp|B0U1H6| 440 PVLDeLNERLVDKYFVNFSVFESIPDVWAINQIFPIVPIERLNEAPTRRG 489
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SGC
+ tlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtes
+ ++++ tCds++++ ++ ++++ d +LPlH l++ + ++++ff++GAY+e+
+ sp|B0U1H6| 490 VVCDLTCDSDGTVKQYveneslDSALPLHvLRHGEAYRIGFFLVGAYQEI 539
+
+ CS C-B-TTT--.-EEEEE
+ lasnFNgfprpaeVlv<-*
+ l++ +N+f++++ V v
+ sp|B0U1H6| 540 LGDIHNLFGDTDAVEV 555
+
+sp|Q9PH02|SPEA_XYLFA: domain 1 of 1, from 343 to 555: score 137.4, E = 2.3e-36
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV+ v +++++ ++ ++++ ++ ++ ++ + ++ +
+ sp|Q9PH02| 343 VLIANVTEVEAVPEgrvpgvcddepavvrhmreiygeldarpaielf 389
+
+ CS S
+ .................................................d
+ + ++ + ++ + ++ + ++ + ++ +++ +++ ++++++++
+ sp|Q9PH02| 390 yeaqhfhaeglaaytlgqidlvhrariddlfyaishgvrerlsheekshR 439
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ ++ld+lnerl++ y+++++v+ s+pd +++++++pi+p++rl+e+pt++
+ sp|Q9PH02| 440 PVLDeLNERLVDKYFVNFSVFESIPDVWAINQIFPIVPIERLNEAPTRRG 489
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SGC
+ tlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtes
+ ++++ tCds++++ ++ ++++ d +LPlH l++ + ++++ff++GAY+e+
+ sp|Q9PH02| 490 VVCDLTCDSDGTVKQYveneslDSALPLHvLRHGEAYRIGFFLVGAYQEI 539
+
+ CS C-B-TTT--.-EEEEE
+ lasnFNgfprpaeVlv<-*
+ l++ +N+f++++ V v
+ sp|Q9PH02| 540 LGDIHNLFGDTDAVEV 555
+
+sp|O05321|DCDA_PSEFL: domain 1 of 1, from 285 to 390: score 136.5, E = 4.1e-36
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+t+V + k+ +++++ f++ +d+ ++++ ++paly+a+
+ sp|O05321| 285 VLLTQVEYLKH-TEHKD--------FAI-VDAAMNDL-IRPALYQAW 320
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ + v+ ++++ +++++++GP+C+ gD+la+ ++L le+GDll+
+ sp|O05321| 321 MDVTAVR-PRDTAARSYDIVGPICETGDFLAK-GRELA----LEEGDLLA 364
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +++aGAY+++++sn+N ++r+aeVlv
+ sp|O05321| 365 VHSAGAYGFVMSSNYNTRGRCAEVLV 390
+
+sp|B2I6M1|SPEA_XYLF2: domain 1 of 1, from 343 to 555: score 136.3, E = 4.7e-36
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV+ v +++++ ++ ++++ ++ ++ ++ + ++ +
+ sp|B2I6M1| 343 VLIANVTEVEAVPEgrvpgvcddepavvrhmreiygeldarpaielf 389
+
+ CS S
+ .................................................d
+ + ++ + ++ + ++ + ++ + ++ +++ +++ ++++++++
+ sp|B2I6M1| 390 yeaqhfhaeglaaytlgqidlvhrariddlfyaishgvrerlsheekshR 439
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ ++ld+lnerl++ y+++++v+ s+pd +++++++pi+p++rl+e pt++
+ sp|B2I6M1| 440 PVLDeLNERLVDKYFVNFSVFESIPDVWAINQIFPIVPIERLNEVPTRRG 489
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SGC
+ tlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtes
+ ++++ tCds++++ ++ ++++ d +LPlH l++ + ++++ff++GAY+e+
+ sp|B2I6M1| 490 VVCDLTCDSDGTVKQYveneslDSALPLHvLRHGEAYRIGFFLVGAYQEI 539
+
+ CS C-B-TTT--.-EEEEE
+ lasnFNgfprpaeVlv<-*
+ l++ +N+f++++ V v
+ sp|B2I6M1| 540 LGDIHNLFGDTDAVEV 555
+
+sp|Q87F25|SPEA_XYLFT: domain 1 of 1, from 343 to 555: score 136.3, E = 4.7e-36
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV+ v +++++ ++ ++++ ++ ++ ++ + ++ +
+ sp|Q87F25| 343 VLIANVTEVEAVPEgrvpgvcddepavvrhmreiygeldarpaielf 389
+
+ CS S
+ .................................................d
+ + ++ + ++ + ++ + ++ + ++ +++ +++ ++++++++
+ sp|Q87F25| 390 yeaqhfhaeglaaytlgqidlvhrariddlfyaishgvrerlsheekshR 439
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ ++ld+lnerl++ y+++++v+ s+pd +++++++pi+p++rl+e pt++
+ sp|Q87F25| 440 PVLDeLNERLVDKYFVNFSVFESIPDVWAINQIFPIVPIERLNEVPTRRG 489
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SGC
+ tlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtes
+ ++++ tCds++++ ++ ++++ d +LPlH l++ + ++++ff++GAY+e+
+ sp|Q87F25| 490 VVCDLTCDSDGTVKQYveneslDSALPLHvLRHGEAYRIGFFLVGAYQEI 539
+
+ CS C-B-TTT--.-EEEEE
+ lasnFNgfprpaeVlv<-*
+ l++ +N+f++++ V v
+ sp|Q87F25| 540 LGDIHNLFGDTDAVEV 555
+
+sp|Q8DHY6|SPEA_THEEB: domain 1 of 1, from 353 to 564: score 136.0, E = 6.1e-36
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV+gv+e++ ++++ + +++ ++ ++ + ++++ ++
+ sp|Q8DHY6| 353 VLIFNVLGVSEVPKitpepataeehliirnlydtyqaidennyqeay 399
+
+ CS S-
+ ................................................dr
+ ++ + +++ + + + + +++ + ++ + + ++++ ++
+ sp|Q8DHY6| 400 ndalqfkgeaislfnfgylslperaraeslfwaccakilgiarqqeyvPD 449
+
+ CS E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEEE
+ kld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepvt
+ +l++l++ +a +yy++ +v++s pd++++d+l+pi+p++rldeepte+ +
+ sp|Q8DHY6| 450 DLEdLEKIMASIYYINLSVFQSVPDSWAIDQLFPIMPIHRLDEEPTERGI 499
+
+ CS EE-----TT--SEE. EEEEE.. .------EEEES-----SGCC
+ laGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtesl
+ la+ tCds++++++F + ++ + L lH++++ + ++l+ f+ GAY+e++
+ sp|Q8DHY6| 500 LADLTCDSDGKIDQFidlrdvKSVLELHpFRPGEPYYLGLFLNGAYQEIM 549
+
+ CS -B-TTT--.-EEEEE
+ asnFNgfprpaeVlv<-*
+ ++ +N+f++++ V++
+ sp|Q8DHY6| 550 GNLHNLFGDTNAVHI 564
+
+sp|O67262|DCDA_AQUAE: domain 1 of 1, from 290 to 396: score 135.8, E = 6.8e-36
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+t+V k++g + f++ +d+G++++ ++p +y+a+
+ sp|O67262| 290 ILITQVQFLKDKGS-KH--------FII-VDAGMNDL-IRPSIYNAY 325
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h+i+pv+ e + ++++++GP+C+ gD+la d++ e+++G++l+
+ sp|O67262| 326 HHIIPVE-TKERKKVVADIVGPICETGDFLAL-DREIE---EVQRGEYLA 370
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +++aGAY+++++s++N +pr+aeVlv
+ sp|O67262| 371 VLSAGAYGFAMSSHYNMRPRAAEVLV 396
+
+sp|Q88QC7|SPEA_PSEPK: domain 1 of 1, from 354 to 567: score 134.8, E = 1.3e-35
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv +V++v + +++ ++ ++++ +++ + + ++++ + +++
+ sp|Q88QC7| 354 MLVIQVTDVEKHNDdvptienkealpetvqwlvdllgptdiemvtet 400
+
+ CS
+ ..................................................
+ + ++ ++ + +++ + +++ ++ ++ +++ + +++++
+ sp|Q88QC7| 401 ywrathymgdvaaqyadgklslgekalaeqcyfavcrrlhnslkarqrsh 450
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEE
+ drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptep
+ +++ld+ln++la+ y+++++v++slpd+++++++ pi+p++rldeep ++
+ sp|Q88QC7| 451 RQVLDeLNDKLADKYICNFSVFQSLPDTWAIGQVLPIIPLHRLDEEPMRR 500
+
+ CS EEEE-----TT--SEE. EEEEE.. .------EEEES-----SG
+ vtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYte
+ ++l + tCds+++++++ ++++ + s+P+H ++ +++ll++f++GAY+e
+ sp|Q88QC7| 501 AVLQDLTCDSDGKINQYvdeqsiETSMPVHaVKEGEDYLLGVFLVGAYQE 550
+
+ CS CC-B-TTT--.-EEEEE
+ slasnFNgfprpaeVlv<-*
+ +l++++N+f++++ V +
+ sp|Q88QC7| 551 ILGDMHNLFGDTDSVNI 567
+
+sp|O14977|AZIN1_HUMAN: domain 1 of 1, from 282 to 406: score 133.2, E = 4.2e-35
+ CS EEEEEEEEEEE--S S-E........EEEEES---
+ *->tLvtnVigvkergg.............drkldlnerlafvyylddGv
+ tL++n+i++k+++ ++ +++ ++++++++ f+yy++dGv
+ sp|O14977| 282 TLAVNIIAKKVVENdkfpsgvektgsdEPA--------FMYYMNDGV 320
+
+ CS -S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EE
+ ygslpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdv
+ ygs +++ l + l i+ v+++ +++ep+++++l+GP+Cd +D + + +
+ sp|O14977| 321 YGS-FASKLSEDLNTIPEVHKkyKEDEPLFTSSLWGPSCDELDQIVE-SC 368
+
+ CS EEE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ sLPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ +LP el+vGD+l+f ++GA ++ s FN f+rpa++++
+ sp|O14977| 369 LLP---ELNVGDWLIFDNMGADSFHEPSAFNDFQRPAIYYM 406
+
+sp|Q5R7K3|AZIN1_PONAB: domain 1 of 1, from 282 to 406: score 133.2, E = 4.2e-35
+ CS EEEEEEEEEEE--S S-E........EEEEES---
+ *->tLvtnVigvkergg.............drkldlnerlafvyylddGv
+ tL++n+i++k+++ ++ +++ ++++++++ f+yy++dGv
+ sp|Q5R7K3| 282 TLAVNIIAKKVVENdkfpsgvektgsdEPA--------FMYYMNDGV 320
+
+ CS -S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EE
+ ygslpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdv
+ ygs +++ l + l i+ v+++ +++ep+++++l+GP+Cd +D + + +
+ sp|Q5R7K3| 321 YGS-FASKLSEDLNTIPEVHKkyKEDEPLFTSSLWGPSCDELDQIVE-SC 368
+
+ CS EEE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ sLPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ +LP el+vGD+l+f ++GA ++ s FN f+rpa++++
+ sp|Q5R7K3| 369 LLP---ELNVGDWLIFDNMGADSFHEPSAFNDFQRPAIYYM 406
+
+sp|O35484|AZIN1_MOUSE: domain 1 of 1, from 282 to 406: score 132.9, E = 5.1e-35
+ CS EEEEEEEEEEE--S S-E........EEEEES---
+ *->tLvtnVigvkergg.............drkldlnerlafvyylddGv
+ tL++n+i++k+++ ++ +++ ++++++++ fvyy++dGv
+ sp|O35484| 282 TLAVNIIAKKVVENdkfssgvekngsdEPA--------FVYYMNDGV 320
+
+ CS -S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EE
+ ygslpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdv
+ ygs +++ l + l i+ v+++ +++ep+++++l+GP+Cd +D + + +
+ sp|O35484| 321 YGS-FASKLSEDLNTIPEVHKkyKEDEPLFTSSLWGPSCDELDQIVE-SC 368
+
+ CS EEE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ sLPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ +LP el+vGD+l+f ++GA ++ s FN f+rpa++++
+ sp|O35484| 369 LLP---ELNVGDWLIFDNMGADSFHEPSAFNDFQRPAIYFM 406
+
+sp|Q50140|DCDA_MYCLE: domain 1 of 1, from 336 to 449: score 132.9, E = 5.2e-35
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.-CHHH
+ *->tLvtnVigvkergg....drkldlnerlafvyylddGvygslpdpal
+ + +++V ++k+++ + + +r+ +v +d+G++++ +++al
+ sp|Q50140| 336 ITLYEVGTIKDVDVsataHRR--------YVS-IDGGMSDN-IRTAL 372
+
+ CS HS----EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...-----
+ ydalhpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevG
+ yda++ +++vsr ++p++p++++G +C+sgD++ r d + P +l++G
+ sp|Q50140| 373 YDAQYDVRLVSRTSDAPAAPASIVGKHCESGDIVVR-DTWVPD--DLKPG 419
+
+ CS -EEEES-----SGCC-B-TTT--.-EEEEE
+ DllvffdaGAYteslasnFNgfprpaeVlv<-*
+ Dl+++ +GAY++sl+s++N ++rpa+V+v
+ sp|Q50140| 420 DLVGVAATGAYCYSLSSRYNMLGRPAVVAV 449
+
+sp|A6L012|SPEA_BACV8: domain 1 of 1, from 346 to 558: score 132.8, E = 5.5e-35
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+++V+ + ++++ +++ + ++++++ ++ + ++ ++++ +
+ sp|A6L012| 346 VLIFEVLETATLPEmdedfevgendhelvhelyeiwdnlnqsrmvea 392
+
+ CS S
+ .................................................d
+ ++ ++ +++ + +++ + +++ + ++ + +++ ++ ++ ++ +
+ sp|A6L012| 393 whdaqqireealdlfshgivdlktraqierlywsvtreinqiasglkhaP 442
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ + +++l++ la+ y++++++++slpd++++d+++pi+p++rlde p++ +
+ sp|A6L012| 443 DEFRkLDKLLADKYFCNFSLFQSLPDSWAIDQIFPIMPIQRLDEKPDRNA 492
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SGC
+ tlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtes
+ tl + tCds++++a+F +++ LP+H+l+ + +++++f++GAY+e+
+ sp|A6L012| 493 TLQDITCDSDGKIANFistryvSHDLPVHsLKGKDAYYIGVFLVGAYQEI 542
+
+ CS C-B-TTT--.-EEEEE
+ lasnFNgfprpaeVlv<-*
+ l++++N+f++++ V+v
+ sp|A6L012| 543 LGDMHNLFGDTNAVHV 558
+
+sp|P19572|DCDA_PSEAE: domain 1 of 1, from 284 to 389: score 132.5, E = 6.8e-35
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+t+V + k+ +++++ f++ +d+ ++++ ++paly+a+
+ sp|P19572| 284 VLLTRVEYLKH-TEHKD--------FAI-VDAAMNDL-IRPALYQAW 319
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ + v+ ++++ ++++l+GP+C+ gD+la+ d+ L l++GDll+
+ sp|P19572| 320 MDVQAVR-PRDAAPRRYDLVGPICETGDFLAK-DRDLA----LAEGDLLA 363
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ + +aGAY+++++sn+N ++r+aeVlv
+ sp|P19572| 364 VRSAGAYGFVMSSNYNTRGRAAEVLV 389
+
+sp|Q8YRP3|SPEA_ANASP: domain 1 of 1, from 395 to 606: score 132.3, E = 7.9e-35
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++ V+++++++ ++++++++++++ + ++ ++ ++++ ++
+ sp|Q8YRP3| 395 VLIFDVLSTSDVPRdnpeppkegespvinylwetyqsinkenyqefy 441
+
+ CS S-
+ ................................................dr
+ ++ ++ +++ ++ + + + +++ + ++ ++ + ++++ ++
+ sp|Q8YRP3| 442 hdatqfkeeaisrfnlgilrlrerakaerlywaccqkildiirqhdyvPD 491
+
+ CS E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEEE
+ kld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepvt
+ l++l++ +a +yy++ +v++s pd++++d+l+pi+p++rldeept++ +
+ sp|Q8YRP3| 492 ELEdLEKIMASIYYINLSVFQSAPDCWAIDQLFPIMPIHRLDEEPTQRGI 541
+
+ CS EE-----TT--SEE. EEEEE.. .------EEEES-----SGCC
+ laGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtesl
+ la+ tCds+++++rF + ++ + L lH++ + + +++++f+ GAY+e++
+ sp|Q8YRP3| 542 LADLTCDSDGKIDRFidlrdvKSVLELHpFQPGEPYYMGMFLNGAYQEIM 591
+
+ CS -B-TTT--.-EEEEE
+ asnFNgfprpaeVlv<-*
+ ++ +N+f++++ V++
+ sp|Q8YRP3| 592 GNLHNLFGDTNAVHI 606
+
+sp|P23630|DCDA_BACSU: domain 1 of 1, from 301 to 409: score 131.7, E = 1.2e-34
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ t +++V + ke++g r+ +v+ +d+G++++ ++paly+a
+ sp|P23630| 301 TTLYTVGSQKEVPGVRQ--------YVA-VDGGMNDN-IRPALYQAK 337
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ + + +r e+ + +v++aG +C+sgD l d+ LP e+++GDll+
+ sp|P23630| 338 YEAAAANRIGEAHDKTVSIAGKCCESGDMLIW-DIDLP---EVKEGDLLA 383
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +f +GAY++s+a+n+N +prpa+V+v
+ sp|P23630| 384 VFCTGAYGYSMANNYNRIPRPAVVFV 409
+
+sp|Q9ZBH5|DCDA_STRCO: domain 1 of 1, from 286 to 403: score 130.8, E = 2.2e-34
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+++V + k +g + fv +d+G++++ ++pa+y+ +
+ sp|Q9ZBH5| 286 VLAAEVRAQKPVGS-NY--------FVL-VDAGFNDL-MRPAMYGSN 321
+
+ CS --EEECSS -TTSSEEEEEEE-----TT--SEE. EEEEE...
+ hpilpvsr...ldeeptepvtlaGPtCdsgDvlarF......dvsLPlHl
+ h++ ++++++ ++++ ++ ++laGP+C+sgDv+ + ++++ + v+ P
+ sp|Q9ZBH5| 322 HRVSVLDAdgaPRASDARDTVLAGPLCESGDVFTQVeggdvePVPVP--- 368
+
+ CS ------EEEES-----SGCC-B-TTT--.-EEEEE
+ elevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ +++vGDl+vf+d+GAY+ s++s++N++p+ +eVlv
+ sp|Q9ZBH5| 369 RTDVGDLVVFHDTGAYGASMSSTYNSRPLIPEVLV 403
+
+sp|Q8K9C4|DCDA_BUCAP: domain 1 of 1, from 275 to 393: score 130.6, E = 2.4e-34
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+++V ++k++g+ + fv +d+G++++ ++p++y+ +
+ sp|Q8K9C4| 275 ILISQVRAIKKMGD-KN--------FVL-IDAGFNDL-MRPTMYGSY 310
+
+ CS --EEECSS -TTSSEEEEEEE-----TT--SEE. EEEEE..
+ hpilpvsr....ldeeptepvtlaGPtCdsgDvlarF......dvsLPlH
+ h++ +v +++++ +e++t +++ GP+C+sgD++ ++++++ ++++LP
+ sp|Q8K9C4| 311 HHVSVVTKddrnIHETETIDTIIGGPLCESGDIFTQKeggnitTRKLP-- 358
+
+ CS .------EEEES-----SGCC-B-TTT--.-EEEEE
+ lelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ l++GD+l+f+d+GAY+ s++sn+N +p+ e+l+
+ sp|Q8K9C4| 359 -ILKIGDYLIFHDVGAYGASMSSNYNTRPLIQEILL 393
+
+sp|Q0ACK8|SPEA_ALHEH: domain 1 of 1, from 345 to 558: score 130.5, E = 2.7e-34
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vi+ +++g+ + + + ++ ++ + ++ +++++ +
+ sp|Q0ACK8| 345 VLITDVIDGDRVPGgadllapadaaprvlhelwtvwtgldrrhplea 391
+
+ CS
+ ..................................................
+ ++ ++ + ++ ++ + +++ + ++ + + ++ +++++++
+ sp|Q0ACK8| 392 yhdaahglaeaqelyahgvlnltdraraeriwqavchallqrldprrrph 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEE
+ drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptep
+ ++ ld+lne+la+ ++++++++s+pd +++d+++p+lp++rlde p+ +
+ sp|Q0ACK8| 442 RELLDeLNEKLADKLFCNFSLFQSMPDVWAIDQIFPVLPLQRLDEPPASR 491
+
+ CS EEEE-----TT--SEE. EEEEE.. .------EEEES-----SG
+ vtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYte
+ ++l + tCds++++ + ++++ + +LPl+++++ + +ll++f++GAY+e
+ sp|Q0ACK8| 492 AVLQDLTCDSDGCIRGYvdrdgvESTLPLPpWRPGEPYLLGIFLVGAYQE 541
+
+ CS CC-B-TTT--.-EEEEE
+ slasnFNgfprpaeVlv<-*
+ +l++++N+f+++ V v
+ sp|Q0ACK8| 542 ILGDMHNLFGDTHSVNV 558
+
+sp|Q949X7|DCDA1_ARATH: domain 1 of 1, from 351 to 459: score 129.2, E = 6.8e-34
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ ++v +V+gvk++g + f++ +d+++ + ++p lyda+
+ sp|Q949X7| 351 CFVNHVTGVKTNGT-KN--------FIV-IDGSMAEL-IRPSLYDAY 386
+
+ CS --EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE...------EE
+ hpilpvsr.ldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDll
+ ++i++vs++++e++ +++++GP C+s D+l++ d++LP ++ G l
+ sp|Q949X7| 387 QHIELVSPpPAEAEVTKFDVVGPVCESADFLGK-DRELP---TPPQGAGL 432
+
+ CS EES-----SGCC-B-TTT--.-EEEEE
+ vffdaGAYteslasnFNgfprpaeVlv<-*
+ v++daGAY++s+as++N+ rp+e++v
+ sp|Q949X7| 433 VVHDAGAYCMSMASTYNLKMRPPEYWV 459
+
+sp|Q94A94|DCDA2_ARATH: domain 1 of 1, from 356 to 464: score 128.9, E = 8.1e-34
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ ++v +V+gvk++g + f++ +d+++ + ++p lyda+
+ sp|Q94A94| 356 CFVNHVTGVKTNGT-KN--------FIV-IDGSMAEL-IRPSLYDAY 391
+
+ CS --EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE...------EE
+ hpilpvsr.ldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDll
+ ++i++vs++++e++ +++++GP C+s D+l++ d++LP ++ G l
+ sp|Q94A94| 392 QHIELVSPtPPEAEVTKFDVVGPVCESADFLGK-DRELP---TPPQGAGL 437
+
+ CS EES-----SGCC-B-TTT--.-EEEEE
+ vffdaGAYteslasnFNgfprpaeVlv<-*
+ v++daGAY++s+as++N+ rp+e++v
+ sp|Q94A94| 438 VVHDAGAYCMSMASTYNLKMRPPEYWV 464
+
+sp|P0A5M5|DCDA_MYCBO: domain 1 of 1, from 311 to 424: score 128.6, E = 9.9e-34
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.-CHHH
+ *->tLvtnVigvkergg....drkldlnerlafvyylddGvygslpdpal
+ + +++V +vk+++ + + +r+ +v +d+G++++ +++al
+ sp|P0A5M5| 311 ITLYEVGTVKDVDVsataHRR--------YVS-VDGGMSDN-IRTAL 347
+
+ CS HS----EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...-----
+ ydalhpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevG
+ y+a++ +++vsr ++p +p+ l+G +C+sgD++ r d + P ++++G
+ sp|P0A5M5| 348 YGAQYDVRLVSRVSDAPPVPARLVGKHCESGDIIVR-DTWVPD--DIRPG 394
+
+ CS -EEEES-----SGCC-B-TTT--.-EEEEE
+ DllvffdaGAYteslasnFNgfprpaeVlv<-*
+ Dl+++ +GAY++sl+s++N ++rpa+V+v
+ sp|P0A5M5| 395 DLVAVAATGAYCYSLSSRYNMVGRPAVVAV 424
+
+sp|P0A5M4|DCDA_MYCTU: domain 1 of 1, from 311 to 424: score 128.6, E = 9.9e-34
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.-CHHH
+ *->tLvtnVigvkergg....drkldlnerlafvyylddGvygslpdpal
+ + +++V +vk+++ + + +r+ +v +d+G++++ +++al
+ sp|P0A5M4| 311 ITLYEVGTVKDVDVsataHRR--------YVS-VDGGMSDN-IRTAL 347
+
+ CS HS----EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...-----
+ ydalhpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevG
+ y+a++ +++vsr ++p +p+ l+G +C+sgD++ r d + P ++++G
+ sp|P0A5M4| 348 YGAQYDVRLVSRVSDAPPVPARLVGKHCESGDIIVR-DTWVPD--DIRPG 394
+
+ CS -EEEES-----SGCC-B-TTT--.-EEEEE
+ DllvffdaGAYteslasnFNgfprpaeVlv<-*
+ Dl+++ +GAY++sl+s++N ++rpa+V+v
+ sp|P0A5M4| 395 DLVAVAATGAYCYSLSSRYNMVGRPAVVAV 424
+
+sp|P41931|DCOR_CAEEL: domain 1 of 1, from 286 to 407: score 127.8, E = 1.7e-33
+ CS EEEEEEEEEEE--S S-E........EEEEES----
+ *->tLvtnVigvkergg............drkldlnerlafvyylddGvy
+ +Lv+n+i+ e++ ++ ++++++ ++ ++y ++dGvy
+ sp|P41931| 286 SLVANIIHATEVPAskitkdpkdcadHGY--------MYY-INDGVY 323
+
+ CS S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEEE
+ gslpdpalydalhpilpvsr.ldeeptepvtlaGPtCdsgDvlarFdvsL
+ gs ++++l+d+ hpi + d+ + + +t++GPtCds+D + + + ++
+ sp|P41931| 324 GS-FNCILFDHAHPIGSPLFdTDRNEKFMSTIWGPTCDSLDLVED-KKLM 371
+
+ CS E...------EEEES-----SGCC-B-TTT--.-EEEEE
+ PlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ P +++vG++l+++d+GAYt ++a++FNgf p +v
+ sp|P41931| 372 P---KMNVGEWLYYPDMGAYTLAAATTFNGFSKPVPMYV 407
+
+sp|O50657|DCLO_SELRU: domain 1 of 1, from 266 to 371: score 127.7, E = 1.9e-33
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ Lvt+Vig+k+rg+ + +++ ld G+yg+ ++ ++yd++
+ sp|O50657| 266 NLVTSVIGTKTRGE-QP--------WYI-LDEGIYGC-FSGIMYDHW 301
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ ++l + ++ p+t+ GP+Cd+ Dvl+r d++ P el++GD+++
+ sp|O50657| 302 TYPLHCF--GKGNKKPSTFGGPSCDGIDVLYR-DFMAP---ELKIGDKVL 345
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ + +G Yt++ a++FNgf +++++++
+ sp|O50657| 346 VTEMGSYTSVSATRFNGFYLAPTIIF 371
+
+sp|Q9KVL7|DCDA_VIBCH: domain 1 of 1, from 286 to 391: score 127.4, E = 2.4e-33
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +Lvt+V k+ ++++ f++ +d+ ++++ ++paly+a+
+ sp|Q9KVL7| 286 VLVTKVEFLKH-TEHKN--------FAI-IDAAMNDL-IRPALYQAW 321
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ + i+p++ ++++++++++l+GP C+ D+l++ d+ L l++GDll+
+ sp|Q9KVL7| 322 QDIIPLR-PRQGEAQTYDLVGPVCETSDFLGK-DRDLV----LQEGDLLA 365
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ + + GAY+++++sn+N +pr aeV v
+ sp|Q9KVL7| 366 VRSSGAYGFTMSSNYNTRPRVAEVMV 391
+
+sp|Q6ZG77|DCDA_ORYSJ: domain 1 of 1, from 356 to 463: score 126.9, E = 3.1e-33
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ ++v +V+gvk++g + f++ +d+++ + ++p ly+a+
+ sp|Q6ZG77| 356 CFVNRVTGVKSNGT-KN--------FIV-VDGSMAEL-IRPSLYGAY 391
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ ++i++vs+ ++++ ++++++GP C+s D+l++ d++LP +++ G lv
+ sp|Q6ZG77| 392 QHIELVSPSPDAEVATFDIVGPVCESADFLGK-DRELP---TPDKGAGLV 437
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ ++daGAY++s+as++N+ rp+e++v
+ sp|Q6ZG77| 438 VHDAGAYCMSMASTYNLKLRPPEYWV 463
+
+sp|Q55484|DCDA_SYNY3: domain 1 of 1, from 332 to 440: score 126.7, E = 3.6e-33
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ + +++V g+k+++ +r+ ++ +d+G++++ p+p+ y+ +
+ sp|Q55484| 332 VTAYRVGGRKVVPNIRT--------YIS-VDGGMSDN-PRPITYQSV 368
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ +++++ +r+++e te+vt+aG +C+sgD+l + dv+LP e+GD++v
+ sp|Q55484| 369 YRVALANRMNDEITETVTVAGKHCESGDILVK-DVALP---AAEPGDIMV 414
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ + +GAY +s+asn+N ++rpa Vlv
+ sp|Q55484| 415 VAATGAYNHSMASNYNRLGRPAAVLV 440
+
+sp|Q9JXM2|DCDA_NEIMB: domain 1 of 1, from 276 to 381: score 125.6, E = 8.1e-33
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+t+V vk g+++ fv +d+ ++++ ++palyda+
+ sp|Q9JXM2| 276 SLLTRVEFVKY-GEEKN--------FVM-VDAAMNDL-MRPALYDAY 311
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h+i+ v+ + t ++ ++GP+C+ gD+l++ d++ e+GDll+
+ sp|Q9JXM2| 312 HHIEAVE-TKDIATLTANIVGPICETGDFLGK-DRTIA----CEEGDLLL 355
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ + +aGAY+ s+asn+N + r+aeVlv
+ sp|Q9JXM2| 356 IRSAGAYGASMASNYNARNRAAEVLV 381
+
+sp|Q8P448|SPEA_XANCP: domain 1 of 1, from 343 to 555: score 125.2, E = 1e-32
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV v ++++ ++ +++++ ++ ++ +++ + ++ +
+ sp|Q8P448| 343 VLIANVSEVEQAPEgrvpdahddepaairhlreihdeldvrpavelf 389
+
+ CS S
+ .................................................d
+ ++ ++ + ++ + ++ + +++ + ++ ++ + + + ++++++
+ sp|Q8P448| 390 qeaqhfhaeglsayalgqidlthrariddlfyaiahgvrarlsfdekshR 439
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ ++ld+lnerl++ y+++++v+ s+pd +++d+++pi+p++rl+e+p ++
+ sp|Q8P448| 440 PVLDeLNERLVDKYFVNFSVFESIPDVWAIDQVFPIVPIERLNEAPQRRG 489
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SGC
+ tlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtes
+ ++a+ tCds++ + + ++++ d sLPlH+l + + ++++ff++GAY+e+
+ sp|Q8P448| 490 IIADMTCDSDGMVKTYveneslDSSLPLHgLNPGESYRIGFFLVGAYQEI 539
+
+ CS C-B-TTT--.-EEEEE
+ lasnFNgfprpaeVlv<-*
+ l++ +N+f++++ V v
+ sp|Q8P448| 540 LGDIHNLFGDTDAVEV 555
+
+sp|Q54UF3|DCOR_DICDI: domain 1 of 1, from 328 to 450: score 125.0, E = 1.2e-32
+ CS EEEEEEEEEEE--S S-E........EEEEES---
+ *->tLvtnVigvkergg.............drkldlnerlafvyylddGv
+ tL+++Vi+++++ +++++++++++++ r+ + yyl dGv
+ sp|Q54UF3| 328 TLAVTVISKRSIKQednrqhprrtsnnMRQ--------YNYYLADGV 366
+
+ CS -S-.-CHHHHS- ---EEECSS-TTSSEEEEEEE-----TT--SEE.EEE
+ ygslpdpalyda.lhpilpvsrldeeptepvtlaGPtCdsgDvlarFdvs
+ ygs ++ + +d+ +l++ + p+tl+GPtCds Dv+ + d +
+ sp|Q54UF3| 367 YGS-FNNTKFDYaKVEPLLLK-PSTKQPTPCTLFGPTCDSIDVVLK-DTQ 413
+
+ CS EE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ LPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ P el++GD+l+f d+GAYt++ +s FNgf +p+++++
+ sp|Q54UF3| 414 IP---ELKIGDWLYFQDMGAYTIASSSSFNGFCPPPVYYY 450
+
+sp|Q9Z661|DCDA_ZYMMO: domain 1 of 1, from 289 to 394: score 124.9, E = 1.3e-32
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+++Vi +ke + fv+ ld+ ++++ +p+lyda+
+ sp|Q9Z661| 289 VLLSKVIRIKESKT-AR--------FVI-LDAAMNDL-VRPTLYDAY 324
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h i v +++ t+ ++++GP C+ gD++ar ++s ++++Dl++
+ sp|Q9Z661| 325 HEIKAVT--PSAQTYQADIVGPVCETGDIFAR-NRSIS---AVKADDLMA 368
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +++aGAY+ ++as +N++p+ aeV v
+ sp|Q9Z661| 369 IMSAGAYGATMASAYNSRPLVAEVMV 394
+
+sp|Q9JWA6|DCDA_NEIMA: domain 1 of 1, from 276 to 381: score 123.9, E = 2.6e-32
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ L+t+V vk g+++ fv +d+ ++++ ++palyda+
+ sp|Q9JWA6| 276 ALLTRVEFVKY-GEEKN--------FVM-VDAAMNDL-MRPALYDAY 311
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h+i+ v+ + + ++ ++GP+C+ gD+l++ d++ e+GDll+
+ sp|Q9JWA6| 312 HHIEAVE-PKNIAPLTANIVGPICETGDFLGK-DRTIA----CEEGDLLL 355
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ + +aGAY+ s+asn+N + r+aeVlv
+ sp|Q9JWA6| 356 IRSAGAYGASMASNYNARNRAAEVLV 381
+
+sp|P40808|DCOR2_DROME: domain 1 of 1, from 276 to 390: score 123.4, E = 3.6e-32
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ tL+++V++++e++ ++ ++ +++yyl+dG++g + ++y+
+ sp|P40808| 276 TLICKVHAKREVRS-KD---GKLDTMMYYLNDGIFGAFAGMFYYPEE 318
+
+ CS --EEECSS -TTSSEEEEEEE-----TT--SEE.EEEEE...------EE
+ hpilpvsr.ldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDll
+ ++++ ++ ++ p +++++GP+Cd++D++ d +LP l++GDll
+ sp|P40808| 319 VAPELYLDeAESLPKLKSVIWGPSCDAMDKIS--DLLLP---NLNPGDLL 363
+
+ CS EES-----SGCC-B-TTT--.-EEEEE
+ vffdaGAYteslasnFNgfprpaeVlv<-*
+ +f ++GAYt+ as FNgf p + ++
+ sp|P40808| 364 GFRNMGAYTMPIASPFNGFDVPETRFF 390
+
+sp|Q8PFQ5|SPEA_XANAC: domain 1 of 1, from 343 to 555: score 122.9, E = 5.1e-32
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV v ++++ ++ +++++ ++ ++ +++ + ++ +
+ sp|Q8PFQ5| 343 VLIANVSEVEQAPEgrvpdahddepaairhlreihdeldvrpavelf 389
+
+ CS S
+ .................................................d
+ ++ ++ + ++ + ++ + +++ + ++ ++ + + + ++++++
+ sp|Q8PFQ5| 390 qeaqhfhaeglsayalgqidlthrariddlfyaiahgvrarlsfdekshR 439
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ ++ld+lnerl++ y+++++v+ s+pd +++d+++pi+p++rl+e+p ++
+ sp|Q8PFQ5| 440 PVLDeLNERLVDKYFVNFSVFESIPDVWAIDQVFPIVPIERLNEAPQRRG 489
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SGC
+ tlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAYtes
+ ++a+ tCds++ + + ++++ d sLPlH+l + ++++ff++GAY+e+
+ sp|Q8PFQ5| 490 IIADMTCDSDGMVKTYveneslDSSLPLHrLNAGESYRIGFFLVGAYQEI 539
+
+ CS C-B-TTT--.-EEEEE
+ lasnFNgfprpaeVlv<-*
+ l++ +N+f++++ V v
+ sp|Q8PFQ5| 540 LGDIHNLFGDTDAVEV 555
+
+sp|P56129|DCDA_HELPY: domain 1 of 1, from 270 to 377: score 122.1, E = 9e-32
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ L+t+V++ k+ ++ fv+ +d+G+++ ++p ly+a
+ sp|P56129| 270 ELITQVLYEKKAQN-KR--------FVV-VDAGMNDF-LRPSLYHAK 305
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h i+++ + + + p++++GP C+s D++ + d +LP ele+GD+lv
+ sp|P56129| 306 HAIRVITPSKGREISPCDVVGPVCESSDTFLK-DAHLP---ELEPGDKLV 351
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ ++ +GAY++s+as++N++p e ++
+ sp|P56129| 352 IEKVGAYGSSMASQYNSRPKLLELAL 377
+
+sp|Q89AC6|DCDA_BUCBP: domain 1 of 1, from 275 to 393: score 121.5, E = 1.4e-31
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +Lv+++ +k+ + +r+ f+ +d G++++ ++pa+y+ +
+ sp|Q89AC6| 275 ILVSEIRVIKK-TNNRT--------FIL-VDSGFNDL-IRPAMYGSY 310
+
+ CS --EEECSS -TTSSEEEEEEE-----TT--S EE. EEEEE..
+ hpilpvsr....ldeeptepvtlaGPtCdsgDvl..arF....dvsLPlH
+ h+i +++r+++ + + t +++++GP+C+sgDv++++++++ +++ LP
+ sp|Q89AC6| 311 HHISVIPRdgrcVNYDDTIEAVVCGPLCESGDVFtqNEYgdikTRILP-- 358
+
+ CS .------EEEES-----SGCC-B-TTT--.-EEEEE
+ lelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ +++GD+lvf+d+GAY+ s++sn+N++p+ +e+l+
+ sp|Q89AC6| 359 -NVQIGDFLVFHDTGAYGASMSSNYNSRPLIPEILF 393
+
+sp|P78599|DCOR_CANAL: domain 1 of 1, from 324 to 468: score 121.5, E = 1.4e-31
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.-CH
+ *->tLvtnVigvkergg......drkldlnerlafvyylddGvygslpdp
+ tL+t++i++++++ +++++++++ ++a++y ++dGvyg+ +++
+ sp|P78599| 324 TLITHIIARRDLPTggnnnnNDM----TPSAMLY-INDGVYGN-LNC 364
+
+ CS HHHS----EEECSS -TTSSEEEEEEE-
+ alydalhpilpvsr.......................ldeeptepvtlaG
+ +l+d++ p + v ++++ +++ ++ + ++++++ + + ++++++G
+ sp|P78599| 365 ILFDHQTPKVYVLTnenqlfykqemmrslsvnnnnnnNNKTDGFKFSIWG 414
+
+ CS ----TT--SEE.EEEEE...------EEEES-----SGCC-B-TTT--
+ PtCdsgDvlarFdvsLPlHlelevGDllvffdaGAYteslasnFNgfp..
+ PtCd++D++ +L + ++vGD+l f+++GAYt+++++ FNg+ ++
+ sp|P78599| 415 PTCDGLDCVSS-LAKLSK--NVQVGDWLFFENVGAYTSCASTKFNGLSsg 461
+
+ CS .-EEEEE
+ rpaeVlv<-*
+ +++ +v
+ sp|P78599| 462 ETKTLYV 468
+
+sp|Q8DA54|SPEA_VIBVU: domain 1 of 1, from 355 to 571: score 121.1, E = 1.8e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nVig+ + ++ ++++++ + ++ ++ + +++++ +
+ sp|Q8DA54| 355 VLISNVIGTETYKPetvtepeedfplllnnmwrswlnlhngtdaral 401
+
+ CS
+ ..................................................
+ + ++++++ + +++ ++ + +++ ++++ + + ++ ++++
+ sp|Q8DA54| 402 ieiyndtqsdlaevhsqfatgvltlehrawaeqtslriyyelnrlmstkn 451
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ ld+l+erla+ ++++++++slpd++++d+++p+lp+s l+++
+ sp|Q8DA54| 452 rfhRPILDeLSERLADKFFVNFSLFQSLPDSWGIDQVFPVLPLSGLQNAA 501
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds++ ++ + ++++ + +LP++ + ++ +l++ff++GA
+ sp|Q8DA54| 502 DRRAVMLDITCDSDGAIDAYvdgqgiESTLPVPaWNEDEPYLMGFFLVGA 551
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f+++ V+v
+ sp|Q8DA54| 552 YQEILGDMHNLFGDTHSVVV 571
+
+sp|Q7MK24|SPEA_VIBVY: domain 1 of 1, from 354 to 570: score 121.1, E = 1.8e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nVig+ + ++ ++++++ + ++ ++ + +++++ +
+ sp|Q7MK24| 354 VLISNVIGTETYKPetvtepeedfplllnnmwrswlnlhngtdaral 400
+
+ CS
+ ..................................................
+ + ++++++ + +++ ++ + +++ ++++ + + ++ ++++
+ sp|Q7MK24| 401 ieiyndtqsdlaevhsqfatgvltlehrawaeqtslriyyelnrlmstkn 450
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ ld+l+erla+ ++++++++slpd++++d+++p+lp+s l+++
+ sp|Q7MK24| 451 rfhRPILDeLSERLADKFFVNFSLFQSLPDSWGIDQVFPVLPLSGLQNAA 500
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds++ ++ + ++++ + +LP++ + ++ +l++ff++GA
+ sp|Q7MK24| 501 DRRAVMLDITCDSDGAIDAYvdgqgiESTLPVPaWNEDEPYLMGFFLVGA 550
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f+++ V+v
+ sp|Q7MK24| 551 YQEILGDMHNLFGDTHSVVV 570
+
+sp|A4Y5Y9|SPEA_SHEPC: domain 1 of 1, from 350 to 566: score 121.1, E = 1.8e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ +++++ ++ ++ ++ +++ +++
+ sp|A4Y5Y9| 350 VLITDVIGTEAYQPeniqppaeespqllhnmwhswseisgradqral 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ ++++
+ sp|A4Y5Y9| 397 ieiyhdsqsdlqeaqslfalgqlslaerawaeqanlrvchevqgllstkn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|A4Y5Y9| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + e +l++ff++GA
+ sp|A4Y5Y9| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSAESPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|A4Y5Y9| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|A1RKK8|SPEA_SHESW: domain 1 of 1, from 350 to 566: score 121.1, E = 1.8e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ +++++ ++ ++ ++ +++ +++
+ sp|A1RKK8| 350 VLITDVIGTEAYQPeniqppaeespqllhnmwhswseisgradqral 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ ++++
+ sp|A1RKK8| 397 ieiyhdsqsdlqeaqslfalgqlslaerawaeqanlrvchevqgllstkn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|A1RKK8| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + e +l++ff++GA
+ sp|A1RKK8| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSAESPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|A1RKK8| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|P57513|DCDA_BUCAI: domain 1 of 1, from 275 to 393: score 121.0, E = 2e-31
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+++V ++k++g + fv +d G++++ ++p++y+ +
+ sp|P57513| 275 ILISKVWATKKMGN-KN--------FVL-VDVGFNDL-MRPTMYGSY 310
+
+ CS --EEECSS -TTSSEEEEEEE-----TT--SEE. EEEEE..
+ hpilpvsr....ldeeptepvtlaGPtCdsgDvlarF......dvsLPlH
+ h+i ++ ++++++e +t +++aGP+C+sgD++ ++++++ ++++LP
+ sp|P57513| 311 HHISVIYGddrkMNEKETIDTVVAGPLCESGDIFTQKeggtvqTRKLP-- 358
+
+ CS .------EEEES-----SGCC-B-TTT--.-EEEEE
+ lelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ +++vGD+l+f+d+GAY+ +++sn+N +p+ +e+l+
+ sp|P57513| 359 -TIKVGDYLIFHDTGAYGAAMSSNYNTRPLIPEILL 393
+
+sp|Q9RTK2|DCDA_DEIRA: domain 1 of 1, from 253 to 357: score 120.9, E = 2.1e-31
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L+t+V+g+k+ +g r f +d+G+ ++p ly+a
+ sp|Q9RTK2| 253 WLLTRVVGTKR-TG-RN--------FCL-VDAGMTEF-LRPMLYGAS 287
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ hp +p d+ te++++aGP C+sgD +ar v+LP ++++G ll+
+ sp|Q9RTK2| 288 HPLYPMW--DALATEVWDVAGPACESGDLIAR-GVPLP---TPQRGHLLL 331
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ + aGAY+ s++s+++++prpaeVl+
+ sp|Q9RTK2| 332 IGEAGAYGASMSSTYLSRPRPAEVLW 357
+
+sp|B8CR70|SPEA_SHEPW: domain 1 of 1, from 350 to 566: score 120.8, E = 2.2e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ + ++ +++++ + ++ ++ ++ +++ +++
+ sp|B8CR70| 350 VLLTDVIGTESYKPetilppsedaplllqnmwqswtevsgkadqral 396
+
+ CS
+ ..................................................
+ + ++ +++ ++ ++ ++ + ++ ++ + + ++ +++ +++
+ sp|B8CR70| 397 ieifhdcqsdltevhslfalgqlsladrawaeqinlrvchelqgsmssky 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p++p+s ld +p
+ sp|B8CR70| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVMPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ ++ e +l++ff++GA
+ sp|B8CR70| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWTQESPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|B8CR70| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|A3QDD8|SPEA_SHELP: domain 1 of 1, from 350 to 566: score 120.3, E = 3.2e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ + ++++ +++ ++ ++ ++ +++ +++
+ sp|A3QDD8| 350 VLITDVIGTEAYKPedlqapdeeapqqlknmwdswgevsgradqral 396
+
+ CS
+ ..................................................
+ + ++ +++ + ++ ++ + +++ ++ + + + ++ +++
+ sp|A3QDD8| 397 ieiyhdvqsdlaevhslfalgqmslsdrawaeqmnlrvcyelkgvmsgky 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++++d+lne+la+ ++++++++slpd +++d+++p++p+s ld p
+ sp|A3QDD8| 447 rfhRPVIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVMPLSGLDKKP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + e +l++ff++GA
+ sp|A3QDD8| 497 ERRAVMLDITCDSDGTVDQYvdgqgiETTLPVPaWSAESPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|A3QDD8| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|B8EAI2|SPEA_SHEB2: domain 1 of 1, from 350 to 566: score 119.9, E = 4.1e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ +++++ ++ ++ ++ +++ +++
+ sp|B8EAI2| 350 VLITDVIGTEAYQPediqppaeespqllhnmwhswselsgradqral 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ + ++
+ sp|B8EAI2| 397 ieiyhdsqsdlqeahslfalgqlslaerawaeqanlrvchevqgllsakn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|B8EAI2| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + + +l++ff++GA
+ sp|B8EAI2| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSADSPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|B8EAI2| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|A3D3G2|SPEA_SHEB5: domain 1 of 1, from 350 to 566: score 119.9, E = 4.1e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ +++++ ++ ++ ++ +++ +++
+ sp|A3D3G2| 350 VLITDVIGTEAYQPediqppaeespqllhnmwhswselsgradqral 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ + ++
+ sp|A3D3G2| 397 ieiyhdsqsdlqeahslfalgqlslaerawaeqanlrvchevqgllsakn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|A3D3G2| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + + +l++ff++GA
+ sp|A3D3G2| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSADSPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|A3D3G2| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|A6WM65|SPEA_SHEB8: domain 1 of 1, from 350 to 566: score 119.9, E = 4.1e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ +++++ ++ ++ ++ +++ +++
+ sp|A6WM65| 350 VLITDVIGTEAYQPediqppaeespqllhnmwhswselsgradqral 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ + ++
+ sp|A6WM65| 397 ieiyhdsqsdlqeahslfalgqlslaerawaeqanlrvchevqgllsakn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|A6WM65| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + + +l++ff++GA
+ sp|A6WM65| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSADSPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|A6WM65| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|A9KY70|SPEA_SHEB9: domain 1 of 1, from 350 to 566: score 119.9, E = 4.1e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ +++++ ++ ++ ++ +++ +++
+ sp|A9KY70| 350 VLITDVIGTEAYQPediqppaeespqllhnmwhswselsgradqral 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ + ++
+ sp|A9KY70| 397 ieiyhdsqsdlqeahslfalgqlslaerawaeqanlrvchevqgllsakn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|A9KY70| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + + +l++ff++GA
+ sp|A9KY70| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSADSPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|A9KY70| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|P27116|DCOR_LEIDO: domain 1 of 1, from 509 to 682: score 119.8, E = 4.5e-31
+ CS EEEEEEEEEEE--S S-E.. ......EEEEES----S
+ *->tLvtnVigvkergg..........drkld.lnerlafvyylddGvyg
+ L++nV + ++++ ++ + +++ +++ ++++++ +y ++dG+y+
+ sp|P27116| 509 ALLMNVFASRTLRLsdvevsrqafQSVVSmDEPEEYQYY-VNDGLYH 554
+
+ CS -.-CHHHHS----EEECSS
+ slpdpalydalhpilpvsr...............................
+ s ++++l+d+ hp l++ +++++ ++ +++++ ++++++++ +++
+ sp|P27116| 555 S-FNCILFDHAHPTLLLLNdgdgadgvesgteaaavcseeegetslsgpl 603
+
+ CS -TTSSEEEEEEE-----TT--SEE.EEEEE...--
+ ...............ldeeptepvtlaGPtCdsgDvlarFdvsLPlHlel
+ +++ + +++++ ++ p++ +t++GPtCds+D++ + ++++P e+
+ sp|P27116| 604 andplfmsawdrrrsFARRPLRITTIFGPTCDSMDCILK-KQPFP---EM 649
+
+ CS ----EEEES-----SGCC-B-TTT--.-EEEEE
+ evGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ + GD+l+++d+G Yt ++a FNgf +v
+ sp|P27116| 650 KLGDWLLVPDMGSYTTAAAGFFNGFATRRLEWV 682
+
+sp|Q083L6|SPEA_SHEFN: domain 1 of 1, from 350 to 566: score 119.2, E = 6.6e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ ++++++ ++ ++ ++ + +++ +++
+ sp|Q083L6| 350 VLITDVIGTEAYQPeniqepsedapqllhnmwqswleisgrydqrai 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ ++++
+ sp|Q083L6| 397 ieiyhdsqsdiseahslfavgqlsladrawaeqanlrvchevkgllsnnn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++++d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|Q083L6| 447 ryhRPVIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + + +l++ff +GA
+ sp|Q083L6| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSADSPYLIGFFMVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|Q083L6| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|Q8EFU5|SPEA_SHEON: domain 1 of 1, from 350 to 566: score 119.1, E = 7e-31
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++++++++ ++ ++ ++ +++ +++
+ sp|Q8EFU5| 350 VLITDVIGTEAYQVediqppeeespqllhnmwqswtelsgradqral 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ ++++
+ sp|Q8EFU5| 397 ieiyhdsqsdlqeaqslfalgqlslaerawaeqanlrvchevqgllstkn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|Q8EFU5| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + e +l++ff +GA
+ sp|Q8EFU5| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSAESPYLIGFFMVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|Q8EFU5| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|B1KRD4|SPEA_SHEWM: domain 1 of 1, from 350 to 566: score 118.6, E = 1e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ ++ ++ ++ ++ ++ +++ +++
+ sp|B1KRD4| 350 VLITDVIGTEAYKPediqppaedapqllhnmwhswneisgradqral 396
+
+ CS
+ ..................................................
+ + ++ +++ ++ ++ ++ + +++ ++ + + ++ ++ +++
+ sp|B1KRD4| 397 ieiyhdcqsdltevhslfalgqlsltdrawaeqvnlrvchelqgvmssky 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+e+la+ ++++++++slpd +++d+++pi+p+s ld +p
+ sp|B1KRD4| 447 rfhRPIIDeLTEKLADKFFVNFSLFQSLPDAWGIDQVFPIMPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + e +l++ff++GA
+ sp|B1KRD4| 497 ERRAVMLDITCDSDGTIDQYvdgqgiETTLPVPaWSAESPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ ++
+ sp|B1KRD4| 547 YQEILGDMHNLFGDTNSAVI 566
+
+sp|Q7V3M9|SPEA_PROMP: domain 1 of 1, from 355 to 574: score 118.5, E = 1.1e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++n++g+++++ + + +++++++ ++ ++ ++ ++ ++++++
+ sp|Q7V3M9| 355 VLIFNILGTSHVSSqvkvsdqkkqsliitnlietlnqiknlrdkked 401
+
+ CS
+ ..................................................
+ ++ + ++ ++ +++ + + +++ ++ + ++ ++
+ sp|Q7V3M9| 402 lseiielwndakkfkedclvafrlgficleerayaeeltwacakeianql 451
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-T
+ ......drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrld
+ ++++ +++l+++++ la +yy + +v+ s+pd++++++++pi+p++r+
+ sp|Q7V3M9| 452 enneiiHPDLSeITDTLASTYYANLSVFKSIPDTWAINQVFPIIPIHRHL 501
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ eep ++ +a+ tCds+++l++F ++++ + +L lH++e ++++l+++f
+ sp|Q7V3M9| 502 EEPFCKGHFADLTCDSDGKLNNFidngkiKSLLNLHpPEKNNDYLIGIFM 551
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ aGAY+e+l++ +N+f+ ++++++
+ sp|Q7V3M9| 552 AGAYQEALGNFHNLFGNTNVIHI 574
+
+sp|A8FWJ3|SPEA_SHESH: domain 1 of 1, from 350 to 566: score 117.5, E = 2.2e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ + ++++++ ++ ++ ++ ++ +++ +++
+ sp|A8FWJ3| 350 VLITDVIGTEAYKPevieepeteapqllhnmwqswsevsgradqral 396
+
+ CS
+ ..................................................
+ + ++ +++ ++ ++ ++ + +++ ++ + + ++ ++ +++
+ sp|A8FWJ3| 397 ieiyhdcqsdlsevhslfalgqlslserawaeqvnlrvchelrdvmspky 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++pi+p+s ld +p
+ sp|A8FWJ3| 447 rfhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPIMPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + + P++++ e +l++ff++GA
+ sp|A8FWJ3| 497 ERRAVMLDITCDSDGTIDQYvdgqgiETTIPVPtWSAESPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|A8FWJ3| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|Q0HJY2|SPEA_SHESM: domain 1 of 1, from 350 to 566: score 117.3, E = 2.5e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ +++++ ++ ++ ++ +++ +++
+ sp|Q0HJY2| 350 VLITDVIGTEAYQVediqppaeespqllhnmwqswtelsgradqral 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ ++++
+ sp|Q0HJY2| 397 ieiyhdsqsdlqeaqslfalgqlslaerawaeqanlrvchevqgllstkn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|Q0HJY2| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + e +l++ff +GA
+ sp|Q0HJY2| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSAESPYLMGFFMVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|Q0HJY2| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|Q0HW78|SPEA_SHESR: domain 1 of 1, from 350 to 566: score 117.3, E = 2.5e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ +++++ ++ ++ ++ +++ +++
+ sp|Q0HW78| 350 VLITDVIGTEAYQVediqppaeespqllhnmwqswtelsgradqral 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ ++++
+ sp|Q0HW78| 397 ieiyhdsqsdlqeaqslfalgqlslaerawaeqanlrvchevqgllstkn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|Q0HW78| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + e +l++ff +GA
+ sp|Q0HW78| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSAESPYLMGFFMVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|Q0HW78| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|Q63764|AZIN1_RAT: domain 1 of 1, from 282 to 406: score 117.2, E = 2.7e-30
+ CS EEEEEEEEEEE--S S-E........EEEEES---
+ *->tLvtnVigvkergg.............drkldlnerlafvyylddGv
+ tL++n+i++k+++ ++ +++ ++++++++ fvyy++dGv
+ sp|Q63764| 282 TLAVNIIAKKVVENdklssgvekngsdEPA--------FVYYMNDGV 320
+
+ CS -S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EE
+ ygslpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdv
+ ygs +++ l + l ++ v+++ +++ep+++++l+GP+Cd +D + + +
+ sp|Q63764| 321 YGS-FASKLSEDLNTVPEVHKkyKEDEPLFTSSLWGPSCDELDQIVE-SC 368
+
+ CS EEE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ sLPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ +LP el vGD+l+f ++GA + s F +rpa++++
+ sp|Q63764| 369 LLP---ELSVGDWLIFDNMGADSLHGPSAFSDTQRPAIYFM 406
+
+sp|Q9ZME5|DCDA_HELPJ: domain 1 of 1, from 270 to 377: score 117.1, E = 2.9e-30
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ L+t+V++ k+ ++ fv+ +d+G+++ ++p ly+a
+ sp|Q9ZME5| 270 ELITQVLYEKKAQN-KR--------FVI-VDAGMNDF-LRPSLYHAK 305
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h i+++ + + + p++++GP C+s D++ + d LP ele+GD+l+
+ sp|Q9ZME5| 306 HAIRVITPCGGREISPCDVVGPVCESSDTFLK-DANLP---ELEPGDKLA 351
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ ++ +GAY++s+as++N++p e ++
+ sp|Q9ZME5| 352 IEKVGAYGSSMASQYNSRPKLLELAL 377
+
+sp|A0KVN8|SPEA_SHESA: domain 1 of 1, from 350 to 566: score 117.0, E = 3.1e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ +++++ ++ ++ ++ +++ +++
+ sp|A0KVN8| 350 VLITDVIGTEAYQVeeiqppaeespqllhnmwqswteisgradqral 396
+
+ CS
+ ..................................................
+ + ++++++ ++ ++ ++ + ++ ++ + + ++ ++ ++++
+ sp|A0KVN8| 397 ieiyhdsqsdlqeaqslfalgqlslaerawaeqanlrvchevqgllstkn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld +p
+ sp|A0KVN8| 447 ryhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ + e +l++ff +GA
+ sp|A0KVN8| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWSAESPYLMGFFMVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|A0KVN8| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|Q8ZHG8|SPEA_YERPE: domain 1 of 1, from 372 to 588: score 117.0, E = 3.1e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+nVigv +++ ++++++ + ++ ++ ++ ++ ++++++++
+ sp|Q8ZHG8| 372 VLVSNVIGVERNEFcepqppeagapraleslwdtwqemqepenrrsl 418
+
+ CS
+ ..................................................
+ ++ ++++ + ++ +++ ++ + +++ ++ + ++ +++ ++++
+ sp|Q8ZHG8| 419 rewlhdsqmdlhdvhtqyahgmldlthrawaeqlylsicneiqkqldpsn 468
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld p
+ sp|Q8ZHG8| 469 rahRPIIDeLQERMADKLYVNFSLFQSMPDAWGIDQLFPVLPLEGLDKPP 518
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds+++++++ ++++ ++ ++P +++e+ ll+ff +G
+ sp|Q8ZHG8| 519 ERRAVLLDITCDSDGTIDHYidgdgvatTMPMPP-YDPENPPLLGFFMVG 567
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++a V v
+ sp|Q8ZHG8| 568 AYQEILGNMHNLFGDTAAVDV 588
+
+sp|B5XUB1|SPEA_KLEP3: domain 1 of 1, from 345 to 561: score 116.8, E = 3.5e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv ++++++ +++ ++ ++ ++ ++ + ++++++++
+ sp|B5XUB1| 345 VLVSNIIGVERNEYteatppaedaarplqsmwetwlemhetgnrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + ++++ + +++ ++ + ++ +++ ++++
+ sp|B5XUB1| 392 rewlhdsqmdlhdihigyssgtfnlqerawaeqlylnmchevqkqldpsn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ +y+++++++s+pd +++d+l+p++p++ l+ +p
+ sp|B5XUB1| 442 rahRPIIDeLQERMADKIYVNFSLFQSMPDAWGIDQLFPVMPLEGLNKSP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|B5XUB1| 492 ERRAVLLDITCDSDGAIDHYvdgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|B5XUB1| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|Q12LW6|SPEA_SHEDO: domain 1 of 1, from 350 to 566: score 116.8, E = 3.5e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ + + ++ ++ ++ ++ ++ +++++++
+ sp|Q12LW6| 350 VLITDVIGTEAYMPeniqapaedapqllhnmwqswteisgrhdqrai 396
+
+ CS
+ ..................................................
+ + ++++++ + ++ ++ + ++ ++++ + ++ ++ ++++
+ sp|Q12LW6| 397 ieiyhdsqsdiaeahslfavgqlslmdrawaeqtnlrvchevkgllsnnn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++++d+lne+la+ ++++++++slpd +++d+++p+lp+ ld +p
+ sp|Q12LW6| 447 ryhRPVIDeLNEKLADKLFVNFSLFQSLPDAWGIDQVFPVLPLTCLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++ +++++ +l++ff +GA
+ sp|Q12LW6| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPaWDPANPYLIGFFMVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|Q12LW6| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|A2BNH3|SPEA_PROMS: domain 1 of 1, from 355 to 574: score 116.8, E = 3.6e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV+g+++++ + + ++++++ ++ ++ + ++ ++++ +
+ sp|A2BNH3| 355 VLIFNVLGTSHVSSklqifdkknqqliisnlldtfyelkklknkkin 401
+
+ CS
+ ..................................................
+ ++ + ++ ++ +++ + + + ++ ++ + ++ +++
+ sp|A2BNH3| 402 lsqiielwndakkfkedclvafrlgflslaerayaeeltwacakeisnnl 451
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-T
+ ......drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrld
+ ++++ ++++l++++e la +yy + +++ s+pd++++++++pi+p++r+
+ sp|A2BNH3| 452 nndeinHPDLSeITETLASTYYANLSIFKSIPDSWAINQIFPIVPIHRHL 501
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ eep ++ +a+ tCds+++l++F ++++ + +L lH++e + ++l+++f
+ sp|A2BNH3| 502 EEPFCKGNFADLTCDSDGKLNNFidngkiKSLLNLHkPEEDKDYLIGIFM 551
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ +GAY+e+l++ +N+f+ +++V++
+ sp|A2BNH3| 552 TGAYQEALGNLHNLFGSTNVVHI 574
+
+sp|Q87JS8|SPEA_VIBPA: domain 1 of 1, from 354 to 570: score 116.7, E = 3.8e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nVig+ + ++ ++ + + + ++ ++ ++ +++++ +
+ sp|Q87JS8| 354 VLISNVIGTETYQPeevhelgvdaplllqnmwrnwenlqdgtdaral 400
+
+ CS
+ ..................................................
+ + ++++++ + +++ ++ + +++ ++ + + + +++ ++++
+ sp|Q87JS8| 401 ieiyndtqsdlaevhsqfatgvlnleqrawaeqlslriyfelsrkmstkn 450
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ ld+l+erla+ ++++++++slpd +++d+++p+lp+s l +++
+ sp|Q87JS8| 451 rfhRPILDeLSERLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLGDAE 500
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds++ ++++ ++++ + +LP++ + + +l++ff++GA
+ sp|Q87JS8| 501 ERRAVMLDITCDSDGAIDHYvdgqgiESTLPVPaWSKDKPYLMGFFLVGA 550
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f+++ +v
+ sp|Q87JS8| 551 YQEILGDMHNLFGDTHSAVV 570
+
+sp|A8H5G3|SPEA_SHEPA: domain 1 of 1, from 350 to 566: score 116.7, E = 3.8e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ ++ ++ ++ ++ + +++ +++
+ sp|A8H5G3| 350 VLLTDVIGTEAYKPediqppaedapqllhnmwqswievsgkadqral 396
+
+ CS
+ ..................................................
+ + ++ +++ ++ ++ ++ + ++ ++ + + + +++ + +
+ sp|A8H5G3| 397 ieiyhdcqsdltevhslfavgqlglaerawaeqvnlrvcyelqgsmsaky 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++++d+lne+la+ ++++++++slpd +++d+++p++p+s ld +p
+ sp|A8H5G3| 447 rfhRPVIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVMPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ + +++ + tCds+++++++ ++++ + +LP++ ++ e +l++ff++GA
+ sp|A8H5G3| 497 ESRAVMLDITCDSDGTVDQYvegqgiETTLPVPaWTQESPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|A8H5G3| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|A3PA96|SPEA_PROM0: domain 1 of 1, from 355 to 574: score 116.6, E = 4.1e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV+g+++++ + + ++++++ ++ ++ + ++ ++++ +
+ sp|A3PA96| 355 VLIFNVLGTSHVSSklqifdkknqqliisnlletyyelkklknkkin 401
+
+ CS
+ ..................................................
+ ++ + ++ ++ +++ + + + ++ ++ ++ +++
+ sp|A3PA96| 402 lsqiielwndakkfkedclvafrlgflslaerayaeelawacakeisnnl 451
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-T
+ ......drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrld
+ ++++ ++++l++++e la +yy + +++ s+pd++++++++pi+p++r+
+ sp|A3PA96| 452 nndeinHPDLSeITETLASTYYANLSIFKSIPDSWAINQIFPIVPIHRHL 501
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ eep ++ +a+ tCds+++l++F ++++ + +L lH++e + ++l+++f
+ sp|A3PA96| 502 EEPFCKGNFADLTCDSDGKLNNFiddgkiKSLLNLHePEKDKDYLIGIFM 551
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ +GAY+e+l++ +N+f+ +++V++
+ sp|A3PA96| 552 TGAYQEALGNLHNLFGSTNVVHI 574
+
+sp|P41023|DCDA_BACMT: domain 1 of 1, from 301 to 409: score 116.4, E = 4.6e-30
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ t ++++ ++k+++ r +v+ +d+G++++ ++paly+a
+ sp|P41023| 301 TTLYQIGSRKDVPNVRH--------YVA-VDGGMSDN-IRPALYNAK 337
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ + ++ +++ + +e+v++aG +C+sgD l d +LP + + +D+l+
+ sp|P41023| 338 YEAVLANKPLAKADETVSIAGKCCESGDMLIW-DLPLP---KADSDDILA 383
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +f +GAY++s+a+n+N +prpa+V+v
+ sp|P41023| 384 VFCTGAYGYSMANNYNRIPRPAVVFV 409
+
+sp|B0TQX3|SPEA_SHEHH: domain 1 of 1, from 350 to 566: score 116.4, E = 4.8e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ ++ +++ ++ ++ ++ ++ + +++ +++
+ sp|B0TQX3| 350 VLLTDVIGTEAYKPediqppaedapqllhnmwqswvevsgkadqral 396
+
+ CS
+ ..................................................
+ + ++ +++ ++ ++ ++ + ++ ++ + + + +++ + +
+ sp|B0TQX3| 397 ieifhdcqsdltevhslfavgqvglaerawaeqvnlrvcyelqgsmsaky 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p++p+s ld +p
+ sp|B0TQX3| 447 rfhRPIIDeLNEKLADKFFVNFSLFQSLPDAWGIDQVFPVMPLSGLDKAP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ + +++ + tCds+++++++ ++++ + +LP++ ++ e +l++ff++GA
+ sp|B0TQX3| 497 ESRAVMLDITCDSDGTIDQYvdgqgiETTLPVPaWTQESPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f++++ +v
+ sp|B0TQX3| 547 YQEILGDMHNLFGDTNSAVV 566
+
+sp|Q31DD8|SPEA_PROM9: domain 1 of 1, from 355 to 574: score 116.4, E = 4.8e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV+g+++++ + + ++++++ ++ ++ + ++ ++++ +
+ sp|Q31DD8| 355 VLIFNVLGTSHVSSklqifdkknqqliisnlletfyelkklknkkin 401
+
+ CS
+ ..................................................
+ ++ + ++ ++ +++ + + + ++ ++ + ++ +++
+ sp|Q31DD8| 402 lsqiielwndakkfkedclvafrlgflslaerayaeeltwacakeisknl 451
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-T
+ ......drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrld
+ +++ ++++l++++e la +yy + +++ s+pd++++++++pi+p++r+
+ sp|Q31DD8| 452 nndainHPDLSeITETLASTYYANLSIFKSIPDSWAINQIFPIVPIHRHL 501
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ eep ++ +a+ tCds+++l++F ++++ + +L lH++e + ++l+++f
+ sp|Q31DD8| 502 EEPFCKGNFADLTCDSDGKLNNFiddgkiKSLLNLHkPEEDKDYLIGIFM 551
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ +GAY+e+l++ +N+f+ +++V++
+ sp|Q31DD8| 552 TGAYQEALGNLHNLFGSTNVVHI 574
+
+sp|Q96412|SPE1_DIACA: domain 1 of 1, from 491 to 605: score 116.3, E = 4.9e-30
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ Lv++ +gv + + +y ++ +v++s+pd +++++l
+ sp|Q96412| 491 ELVSKALGVAD----GV--------CTYNVNLSVFTSIPDFWGIGQL 525
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE. EEEEE.. .-----
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarF...dvsLPlH.lelevG
+ +pi+p++rld++p ++ +l + tCds++++++F +++ sLPlH+l +G
+ sp|Q96412| 526 FPIMPIHRLDQQPKARGILSDLTCDSDGKIDKFigdESSLPLHeLSGGEG 575
+
+ CS -EEEES-----SGCC-B-TTT--.-EEEEE
+ DllvffdaGAYteslasnFNgfprpaeVlv<-*
+ ++l++f+ GAY e+l+ +N+f+ p++V v
+ sp|Q96412| 576 YYLGMFLGGAYEEALGGVHNLFGGPSVVRV 605
+
+sp|A1S712|SPEA_SHEAM: domain 1 of 1, from 350 to 566: score 116.1, E = 5.9e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+t Vig+ + ++ + ++++ ++ ++ ++ ++ +++ +++
+ sp|A1S712| 350 VLITDVIGTEAYSPedipapeeeapqllhnmwrswneissrldqral 396
+
+ CS
+ ..................................................
+ + ++++++ + ++ ++ + +++ ++ + ++ ++ + ++
+ sp|A1S712| 397 ieifhdtqsdlaeaqslfalgqlsledrawaeqcnlavchelqglmnarn 446
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+lne+la+ ++++++++slpd +++d+++p+lp+s ld p
+ sp|A1S712| 447 ryqRPIIDeLNEKLADRFFVNFSLFQSLPDAWGIDQVFPVLPLSGLDKVP 496
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds+++++++ ++++ + +LP++++ e +l++ff++GA
+ sp|A1S712| 497 ERRAVMLDITCDSDGIVDQYvdgqgiETTLPVPnWSAEDPYLIGFFLVGA 546
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++ +N+f++++ +v
+ sp|A1S712| 547 YQEILGDLHNLFGDTNSAVV 566
+
+sp|A8G243|SPEA_PROM2: domain 1 of 1, from 355 to 574: score 115.5, E = 8.8e-30
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV+g+++++ + + ++++++ ++ ++ + ++ ++++ +
+ sp|A8G243| 355 VLIFNVLGTSHVSSklkiyddkkqsliisnlietfyelkklknkkin 401
+
+ CS
+ ..................................................
+ ++ + ++ ++ +++ + + + ++ ++ + ++ ++
+ sp|A8G243| 402 lsqiielwndakkfkedclvafrlgflslaerayaeeltwacakeiannl 451
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-T
+ ......drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrld
+ ++++ ++++l +++e la +yy + +++ s+pd++++++++pi+p++r+
+ sp|A8G243| 452 nndeinHPDLFeITETLASTYYANLSIFKSIPDCWAINQIFPIMPIHRHL 501
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ eep ++ +a+ tCds+++l+ F ++++ + +L lH++e + ++l+++f
+ sp|A8G243| 502 EEPFCKGNFADLTCDSDGKLNSFinngkiKSLLNLHePEQDKDYLIGIFM 551
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ +GAY+e+l++ +N+f+ +++V++
+ sp|A8G243| 552 TGAYQEALGNLHNLFGNTNVVHI 574
+
+sp|Q7VEG4|SPEA_PROMA: domain 1 of 1, from 355 to 574: score 115.2, E = 1.1e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nV+g+++++ + +++++ + ++ +++ ++ ++++ +
+ sp|Q7VEG4| 355 ILIFNVLGTSSVPTqiaietsneclsvknlretlmilhqiceekkid 401
+
+ CS
+ ..................................................
+ ++ ++ ++ + +++ + + + + +++ + ++ + ++ +
+ sp|Q7VEG4| 402 vsklqeawndalkfkedalnafrlgfidlterataeqltwacakqiaahl 451
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-T
+ ......drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrld
+ +++ + ++ l+ +n++l+ +yy +++++ s pd++++++l+p lp++rl+
+ sp|Q7VEG4| 452 pndlkiPKELLaINKGLTETYYANISIFRSAPDTWAIQQLFPLLPIHRLQ 501
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ e p++ +a+ tCds+++larF ++++++++L lH+++ ++++++++f+
+ sp|Q7VEG4| 502 EKPDQLGHFADLTCDSDGKLARFinngqeKFLLELHtVKANENYWIGMFL 551
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ GAY+e++++ +N+f+ ++ +++
+ sp|Q7VEG4| 552 GGAYQEVMGNLHNLFGSTNAIHI 574
+
+sp|C4K6F4|SPEA_HAMD5: domain 1 of 1, from 346 to 562: score 114.9, E = 1.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nVigv +++ ++++ +++++++ ++ + ++ ++++++++
+ sp|C4K6F4| 346 VLISNVIGVERNEFsppqapekhspraleslwytwqemqkpdhrhsl 392
+
+ CS
+ ..................................................
+ ++ ++++++ ++ +++ +++ + +++ ++ + ++ +++ ++++
+ sp|C4K6F4| 393 reclhdsqrdlqdvhtqythgildlkqrawaeqlylqichhiqkeldpsd 442
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + ++ ++d+l+er+a+ y+++++++slpd +++++l+pilp++ l++ p
+ sp|C4K6F4| 443 rahRTMIDnLQERMADKLYVNFSLFQSLPDAWGINQLFPILPLEGLNQRP 492
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++l + tCds++++ ++ ++++ +LP ++++ e+ +l+ff +GA
+ sp|C4K6F4| 493 ERRAVLLDITCDSDGIIEHYvdgdgvANTLPIPpYDAENPPILGFFMVGA 542
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f+++a+V v
+ sp|C4K6F4| 543 YQEILGNMHNLFGDTAVVEV 562
+
+sp|B5F5L1|SPEA_SALA4: domain 1 of 1, from 345 to 561: score 114.9, E = 1.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv ++++++++ + ++ ++ ++ ++ ++ ++++++++
+ sp|B5F5L1| 345 VLVSNIIGVERNEYtdptapaedapralqnlwetwqemhkpgtrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + +++ + +++ ++ + ++ +++ ++++
+ sp|B5F5L1| 392 rewlhdsqmdlhdihigyssgafslqerawaeqlylsmchevqkqldpqn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|B5F5L1| 442 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|B5F5L1| 492 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|B5F5L1| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|Q57K30|SPEA_SALCH: domain 1 of 1, from 345 to 561: score 114.9, E = 1.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv ++++++++ + ++ ++ ++ ++ ++ ++++++++
+ sp|Q57K30| 345 VLVSNIIGVERNEYtdptapaedapralqnlwetwqemhkpgtrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + +++ + +++ ++ + ++ +++ ++++
+ sp|Q57K30| 392 rewlhdsqmdlhdihigyssgafslqerawaeqlylsmchevqkqldpqn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|Q57K30| 442 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|Q57K30| 492 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|Q57K30| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|B5FUJ7|SPEA_SALDC: domain 1 of 1, from 345 to 561: score 114.9, E = 1.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv ++++++++ + ++ ++ ++ ++ ++ ++++++++
+ sp|B5FUJ7| 345 VLVSNIIGVERNEYtdptapaedapralqnlwetwqemhkpgtrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + +++ + +++ ++ + ++ +++ ++++
+ sp|B5FUJ7| 392 rewlhdsqmdlhdihigyssgafslqerawaeqlylsmchevqkqldpqn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|B5FUJ7| 442 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|B5FUJ7| 492 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|B5FUJ7| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|B4THH1|SPEA_SALHS: domain 1 of 1, from 345 to 561: score 114.9, E = 1.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv ++++++++ + ++ ++ ++ ++ ++ ++++++++
+ sp|B4THH1| 345 VLVSNIIGVERNEYtdptapaedapralqnlwetwqemhkpgtrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + +++ + +++ ++ + ++ +++ ++++
+ sp|B4THH1| 392 rewlhdsqmdlhdihigyssgafslqerawaeqlylsmchevqkqldpqn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|B4THH1| 442 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|B4THH1| 492 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|B4THH1| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|A9N4N1|SPEA_SALPB: domain 1 of 1, from 345 to 561: score 114.9, E = 1.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv ++++++++ + ++ ++ ++ ++ ++ ++++++++
+ sp|A9N4N1| 345 VLVSNIIGVERNEYtdptapaedapralqnlwetwqemhkpgtrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + +++ + +++ ++ + ++ +++ ++++
+ sp|A9N4N1| 392 rewlhdsqmdlhdihigyssgafslqerawaeqlylsmchevqkqldpqn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|A9N4N1| 442 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|A9N4N1| 492 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|A9N4N1| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|B4TV55|SPEA_SALSV: domain 1 of 1, from 345 to 561: score 114.9, E = 1.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv ++++++++ + ++ ++ ++ ++ ++ ++++++++
+ sp|B4TV55| 345 VLVSNIIGVERNEYtdptapaedapralqnlwetwqemhkpgtrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + +++ + +++ ++ + ++ +++ ++++
+ sp|B4TV55| 392 rewlhdsqmdlhdihigyssgafslqerawaeqlylsmchevqkqldpqn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|B4TV55| 442 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|B4TV55| 492 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|B4TV55| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|P60659|SPEA_SALTY: domain 1 of 1, from 371 to 587: score 114.9, E = 1.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv ++++++++ + ++ ++ ++ ++ ++ ++++++++
+ sp|P60659| 371 VLVSNIIGVERNEYtdptapaedapralqnlwetwqemhkpgtrrsl 417
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + +++ + +++ ++ + ++ +++ ++++
+ sp|P60659| 418 rewlhdsqmdlhdihigyssgafslqerawaeqlylsmchevqkqldpqn 467
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|P60659| 468 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 517
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|P60659| 518 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 566
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|P60659| 567 AYQEILGNMHNLFGDTEAVDV 587
+
+sp|P60658|SPEA_SALTI: domain 1 of 1, from 371 to 587: score 114.9, E = 1.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv ++++++++ + ++ ++ ++ ++ ++ ++++++++
+ sp|P60658| 371 VLVSNIIGVERNEYtdptapaedapralqnlwetwqemhkpgtrrsl 417
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + +++ + +++ ++ + ++ +++ ++++
+ sp|P60658| 418 rewlhdsqmdlhdihigyssgafslqerawaeqlylsmchevqkqldpqn 467
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|P60658| 468 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 517
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|P60658| 518 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 566
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|P60658| 567 AYQEILGNMHNLFGDTEAVDV 587
+
+sp|B4T5J3|SPEA_SALNS: domain 1 of 1, from 345 to 561: score 114.9, E = 1.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv ++++++++ + ++ ++ ++ ++ ++ ++++++++
+ sp|B4T5J3| 345 VLVSNIIGVERNEYtdptapaedapralqnlwetwqemhkpgtrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + +++ + +++ ++ + ++ +++ ++++
+ sp|B4T5J3| 392 rewlhdsqmdlhdihigyssgafslqerawaeqlylsmchevqkqldpqn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|B4T5J3| 442 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|B4T5J3| 492 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|B4T5J3| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|P44316|DCDA_HAEIN: domain 1 of 1, from 285 to 391: score 114.9, E = 1.4e-29
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +Lv++V + k+++ r f++ +d G+++ ++paly+a+
+ sp|P44316| 285 ILVAKVQYLKSNES-RN--------FAI-TDTGMNDM-IRPALYEAY 320
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ i+ ++r e + + ++++GP C+ D+l++ +++L +++GD+++
+ sp|P44316| 321 MNIVEIDRTLEREKAIYDVVGPVCETSDFLGK-QRELS----IAEGDYIA 365
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +aGAY+ s++sn+N++ r+aeVlv
+ sp|P44316| 366 QCSAGAYGASMSSNYNSRARTAEVLV 391
+
+sp|P22220|SPE1_AVESA: domain 1 of 1, from 355 to 532: score 114.8, E = 1.4e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +++ + ++ + +++++ ++++ +++ ++ +++ ++++ + +++
+ sp|P22220| 355 MIILEALSAIPEPKddedeatteqlhgrirdlssklqptglsmssha 401
+
+ CS S-E........EEEEES----S-.-
+ .........................drkldlnerlafvyylddGvygslp
+ + ++++ + + +++ +++ +++ + + y+++ +v+ ++p
+ sp|P22220| 402 vhikkhgiemyklgkklsksvttdaHTI--------YNYHMNLSVFSLMP 443
+
+ CS CHHHHS----EEECSS-TTSSEEEEEEE-----TT--SEE. EEEEE.
+ dpalydalhpilpvsrldeeptepvtlaGPtCdsgDvlarF...dvsLPl
+ d +++++l+p +pvsrlde pt+++tl++ tCds++++++F +++ ++Pl
+ sp|P22220| 444 DYWGIQHLFPMMPVSRLDEKPTHKATLVDVTCDSDGKVDKFirdTETMPL 493
+
+ CS . .------EEEES-----SGCC-B-TTT--.-EEEEE
+ H..lelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ H+ ++ G++++++++GAY+e+l++ +N+f+ p+ V v
+ sp|P22220| 494 HplDPKLGGYYVAVLLTGAYQEALSNKHNLFGGPSLVRV 532
+
+sp|Q9X5M1|DCDA_MYCS2: domain 1 of 1, from 336 to 449: score 114.7, E = 1.5e-29
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.-CHHH
+ *->tLvtnVigvkergg....drkldlnerlafvyylddGvygslpdpal
+ + +++V +vk++ +++ +r+ +v +d+G++++ +++ l
+ sp|Q9X5M1| 336 ITLYEVGTVKDVAVsqtaHRR--------YVS-VDGGMSDN-IRTSL 372
+
+ CS HS----EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...-----
+ ydalhpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevG
+ y a++ ++vsr ++p + + ++G +C+sgD++ r d + ++++G
+ sp|Q9X5M1| 373 YAAQYDARLVSRVSDAPPALARIVGKHCESGDIVVR-DTWVSD--DIAPG 419
+
+ CS -EEEES-----SGCC-B-TTT--.-EEEEE
+ DllvffdaGAYteslasnFNgfprpaeVlv<-*
+ Dl+++ +GAY++s++s++N++ rpa+V+v
+ sp|Q9X5M1| 420 DLIGVAATGAYCYSMSSRYNLLCRPAVVAV 449
+
+sp|Q9KLD1|SPEA_VIBCH: domain 1 of 1, from 354 to 570: score 114.4, E = 1.9e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+tnVig+ + ++ + ++ + + ++ ++ ++ +++++++
+ sp|Q9KLD1| 354 VLITNVIGTEAYSPeeipapgadapmllknmwrgfeevqhgtddral 400
+
+ CS
+ ..................................................
+ + ++++++ ++ +++ ++ + +++ ++ + + ++ +++ ++++
+ sp|Q9KLD1| 401 ieiyndtqsdlseahsqfatgvlnlehrawaeqlslriyhelrqkmsnkn 450
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ ld+l+erla+ ++++++++slpd +++d+++p+lp+s l+e +
+ sp|Q9KLD1| 451 rfhRPILDeLQERLADKFFVNFSLFQSLPDAWGIDQVFPVLPLSGLEEMN 500
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++ + tCds++ + ++ ++++ + +LP++ ++ + +l++ff++GA
+ sp|Q9KLD1| 501 DRRAVMLDITCDSDGAVEQYvegqgiESTLPVPaWTSDKPYLMGFFLVGA 550
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f+++ +v
+ sp|Q9KLD1| 551 YQEILGDMHNLFGDTHSAVV 570
+
+sp|Q8XCX9|SPEA_ECO57: domain 1 of 1, from 371 to 587: score 114.2, E = 2.2e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv +++++ ++ + ++ ++ ++ ++ ++ ++++++++
+ sp|Q8XCX9| 371 VLVSNIIGVERNEYtvptapaedapralqsmwetwqemhepgtrrsl 417
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + ++++ + +++ ++ + ++ +++ ++++
+ sp|Q8XCX9| 418 rewlhdsqmdlhdihigyssgtfslqerawaeqlylsmchevqkqldpqn 467
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|Q8XCX9| 468 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 517
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|Q8XCX9| 518 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 566
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|Q8XCX9| 567 AYQEILGNMHNLFGDTEAVDV 587
+
+sp|B5YQD6|SPEA_ECO5E: domain 1 of 1, from 345 to 561: score 114.2, E = 2.2e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv +++++ ++ + ++ ++ ++ ++ ++ ++++++++
+ sp|B5YQD6| 345 VLVSNIIGVERNEYtvptapaedapralqsmwetwqemhepgtrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + ++++ + +++ ++ + ++ +++ ++++
+ sp|B5YQD6| 392 rewlhdsqmdlhdihigyssgtfslqerawaeqlylsmchevqkqldpqn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|B5YQD6| 442 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|B5YQD6| 492 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|B5YQD6| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|Q8FE34|SPEA_ECOL6: domain 1 of 1, from 371 to 587: score 114.2, E = 2.2e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv +++++ ++ + ++ ++ ++ ++ ++ ++++++++
+ sp|Q8FE34| 371 VLVSNIIGVERNEYtvptapaedapralqsmwetwqemhepgtrrsl 417
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + ++++ + +++ ++ + ++ +++ ++++
+ sp|Q8FE34| 418 rewlhdsqmdlhdihigyssgtfslqerawaeqlylsmchevqkqldpqn 467
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|Q8FE34| 468 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 517
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|Q8FE34| 518 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 566
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|Q8FE34| 567 AYQEILGNMHNLFGDTEAVDV 587
+
+sp|B1LDE8|SPEA_ECOSM: domain 1 of 1, from 345 to 561: score 114.2, E = 2.2e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv +++++ ++ + ++ ++ ++ ++ ++ ++++++++
+ sp|B1LDE8| 345 VLVSNIIGVERNEYtvptapaedapralqsmwetwqemhepgtrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + ++++ + +++ ++ + ++ +++ ++++
+ sp|B1LDE8| 392 rewlhdsqmdlhdihigyssgtfslqerawaeqlylsmchevqkqldpqn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|B1LDE8| 442 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|B1LDE8| 492 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|B1LDE8| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|Q0T0V3|SPEA_SHIF8: domain 1 of 1, from 345 to 561: score 113.9, E = 2.6e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv +++++ ++ + ++ ++ ++ ++ ++ ++++++++
+ sp|Q0T0V3| 345 VLVSNIIGVERNEYtvptapvedapralqsmwetwqemhepgtrrsl 391
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + ++++ + +++ ++ + ++ +++ ++++
+ sp|Q0T0V3| 392 rewlhdsqmdlhdihigyssgtfslqerawaeqlylsmchevqkqldpqn 441
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|Q0T0V3| 442 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 491
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|Q0T0V3| 492 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 540
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|Q0T0V3| 541 AYQEILGNMHNLFGDTEAVDV 561
+
+sp|Q83Q93|SPEA_SHIFL: domain 1 of 1, from 371 to 587: score 113.9, E = 2.6e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv +++++ ++ + ++ ++ ++ ++ ++ ++++++++
+ sp|Q83Q93| 371 VLVSNIIGVERNEYtvptapvedapralqsmwetwqemhepgtrrsl 417
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + ++++ + +++ ++ + ++ +++ ++++
+ sp|Q83Q93| 418 rewlhdsqmdlhdihigyssgtfslqerawaeqlylsmchevqkqldpqn 467
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|Q83Q93| 468 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 517
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|Q83Q93| 518 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 566
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|Q83Q93| 567 AYQEILGNMHNLFGDTEAVDV 587
+
+sp|B9M6H6|SPEA_GEOSF: domain 1 of 1, from 346 to 561: score 113.6, E = 3.3e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +LvtnV+ + + + +++ +++ ++ ++ ++ + +++ ++ +
+ sp|B9M6H6| 346 VLVTNVLNTNTQRLtpdfeeelaaaeklaptvkklvdihksidrysl 392
+
+ CS
+ ..................................................
+ +++ +++ + ++ + + + + +++ + ++ ++ ++ ++ +
+ sp|B9M6H6| 393 redyhdtvqliqeavslfnlgyltlneramaewlygkiikkinsivekik 442
+
+ CS S-E........EEEEES----S-.-CHHHHS----EEEC
+ ...........drkldlnerlafvyylddGvygslpdpalydalhpilpv
+ + +++ ++ + + + +y+ ++++++s+pd++++d+l+pi+p+
+ sp|B9M6H6| 443 pipeelqnfqlALR--------QTYFANFSLFQSIPDSWAIDQLFPIVPI 484
+
+ CS SS-TTSSEEEEEEE-----TT--SEE. EEEEE.. .------EE
+ srldeeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDll
+ +rl++ p++ +++a+ tCds++ + F ++++++ LPlH+ + ++++++
+ sp|B9M6H6| 485 QRLNQKPDVIASIADITCDSDGEITSFvgengrTKFLPLHkIRKDEDYYI 534
+
+ CS EES-----SGCC-B-TTT--.-EEEEE
+ vffdaGAYteslasnFNgfprpaeVlv<-*
+ +ff+ GAY+e+l++++N+f++++ V++
+ sp|B9M6H6| 535 GFFLIGAYQEILGDMHNLFGDTNAVHI 561
+
+sp|P21170|SPEA_ECOLI: domain 1 of 1, from 371 to 587: score 113.6, E = 3.4e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+n+igv +++++ ++ + ++ ++ ++ ++ ++ ++++++++
+ sp|P21170| 371 VLVSNIIGVERNEYtvptapaedapralqsmwetwqemhepgtrrsl 417
+
+ CS
+ ..................................................
+ ++ ++++ + ++ + + +++ + +++ ++ + ++ +++ ++++
+ sp|P21170| 418 rewlhdsqmdlhdihigyssgifslqerawaeqlylsmchevqkqldpqn 467
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++s+pd +++d+l+p+lp++ ld+ p
+ sp|P21170| 468 rahRPIIDeLQERMADKMYVNFSLFQSMPDAWGIDQLFPVLPLEGLDQVP 517
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds++ ++++ ++++ ++ ++P+ +++e+ l+ff +G
+ sp|P21170| 518 ERRAVLLDITCDSDGAIDHYidgdgiatTMPMPE-YDPENPPMLGFFMVG 566
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|P21170| 567 AYQEILGNMHNLFGDTEAVDV 587
+
+sp|B5EIW4|SPEA_GEOBB: domain 1 of 1, from 425 to 561: score 112.8, E = 5.7e-29
+ CS EEEEEEEEEEE--S S-E........EEEEES-
+ *->tLvtnVigvkergg...............drkldlnerlafvyyldd
+ ++ +++i + ++ ++ +++ ++ + + +y+ ++
+ sp|B5EIW4| 425 WICSKIIRKINSIVekmkpipdelqnfqlSLR--------QTYFANF 463
+
+ CS ---S-.-CHHHHS----EEECSS-TTSSEEEEEEE-----TT--SEE.
+ GvygslpdpalydalhpilpvsrldeeptepvtlaGPtCdsgDvlarF..
+ ++++s+pd++++d+l+pi+p++rlde p++ +++a+ tCds++ + F +
+ sp|B5EIW4| 464 SLFQSIPDSWAIDQLFPIVPIQRLDEKPDVLTSIADITCDSDGEITSFvg 513
+
+ CS EEEEE.. .------EEEES-----SGCC-B-TTT--.-EEEEE
+ ....dvsLPlH.lelevGDllvffdaGAYteslasnFNgfprpaeVlv<-
+ +++++ +LPlH+ ++++ ++++ff+ GAY+e+l++++N+f++++ V++
+ sp|B5EIW4| 514 engrTKALPLHkIKVDEQYYIGFFLIGAYQEILGDMHNLFGDTNAVHI 561
+
+ CS
+ *
+
+ sp|B5EIW4| - -
+
+sp|C6E3V4|SPEA_GEOSM: domain 1 of 1, from 425 to 561: score 112.8, E = 5.7e-29
+ CS EEEEEEEEEEE--S S-E........EEEEES-
+ *->tLvtnVigvkergg...............drkldlnerlafvyyldd
+ ++ +++i + ++ ++ +++ ++ + + +y+ ++
+ sp|C6E3V4| 425 WICSKIIRKINSIVekmkpipdelqnfqlSLR--------QTYFANF 463
+
+ CS ---S-.-CHHHHS----EEECSS-TTSSEEEEEEE-----TT--SEE.
+ GvygslpdpalydalhpilpvsrldeeptepvtlaGPtCdsgDvlarF..
+ ++++s+pd++++d+l+pi+p++rlde p++ +++a+ tCds++ + F +
+ sp|C6E3V4| 464 SLFQSIPDSWAIDQLFPIVPIQRLDEKPDVLTSIADITCDSDGEITSFvg 513
+
+ CS EEEEE.. .------EEEES-----SGCC-B-TTT--.-EEEEE
+ ....dvsLPlH.lelevGDllvffdaGAYteslasnFNgfprpaeVlv<-
+ +++++ +LPlH+ ++++ ++++ff+ GAY+e+l++++N+f++++ V++
+ sp|C6E3V4| 514 engrTKALPLHkIKVDEQYYIGFFLIGAYQEILGDMHNLFGDTNAVHI 561
+
+ CS
+ *
+
+ sp|C6E3V4| - -
+
+sp|A1AS90|SPEA_PELPD: domain 1 of 1, from 425 to 561: score 112.3, E = 8.2e-29
+ CS EEEEEEEEEEE--S S-E........EEEEES-
+ *->tLvtnVigvkergg...............drkldlnerlafvyyldd
+ +L t++i + + ++ ++ +++ ++ + + +y+ ++
+ sp|A1AS90| 425 WLYTRIIKKINNLVekmkpvpeelqnfklSMR--------QTYFANF 463
+
+ CS ---S-.-CHHHHS----EEECSS-TTSSEEEEEEE-----TT--SEE.
+ GvygslpdpalydalhpilpvsrldeeptepvtlaGPtCdsgDvlarF..
+ ++++s+pd++++d+l+pi+p++rl e p++ +++a+ tCds++ + F +
+ sp|A1AS90| 464 SLFQSIPDSWAIDQLFPIMPIQRLGEKPDVIASIADITCDSDGEITSFvg 513
+
+ CS EEEEE.. .------EEEES-----SGCC-B-TTT--.-EEEEE
+ ....dvsLPlH.lelevGDllvffdaGAYteslasnFNgfprpaeVlv<-
+ +++++ +LPlH+ + ++ ++++ff+ GAY+e+l++ +N+f++++ V++
+ sp|A1AS90| 514 engrTKYLPLHkIRKNEEYYIGFFLIGAYQEILGDLHNLFGDTNAVHI 561
+
+ CS
+ *
+
+ sp|A1AS90| - -
+
+sp|A2BU00|SPEA_PROM5: domain 1 of 1, from 355 to 574: score 112.2, E = 8.6e-29
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++ V+g+++++ + + +++++++ ++ +++++ ++ ++++++
+ sp|A2BU00| 355 VLIFDVLGTSHVSSqikvshqkktsliiknlidthnqlknlrnkked 401
+
+ CS
+ ..................................................
+ ++ + ++ ++ +++ + + + +++ ++ + ++ +++
+ sp|A2BU00| 402 lseiielwndakkfkkdclvafrlgfislgerayaeeltwacakeisshl 451
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-T
+ ......drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrld
+ ++++ +++l++++e l +yy + +v+ s+pd++++++++pi+p++r+
+ sp|A2BU00| 452 dnekiiHPDLSeITETLSSTYYANLSVFKSIPDTWAINQIFPIIPIHRHL 501
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ eep ++ +a+ tCds+++l++F ++++ + +L lH++e ++++l+++f
+ sp|A2BU00| 502 EEPICKGNFADLTCDSDGKLNNFidngkiKSLLNLHrPEENNDYLIGIFM 551
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ aGAY+e+l++ +N+f+ ++++++
+ sp|A2BU00| 552 AGAYQEALGNFHNLFGNTNVIHI 574
+
+sp|Q8RQM6|DCDA_COREF: domain 1 of 1, from 324 to 437: score 109.3, E = 6.4e-28
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.-CHHH
+ *->tLvtnVigvkergg....drkldlnerlafvyylddGvygslpdpal
+ + v++V ++k+++ ++++ r+ ++ +d+G++++ ++pal
+ sp|Q8RQM6| 324 VTVYEVGTIKDVDVddetTRR--------YIS-VDGGMSDN-IRPAL 360
+
+ CS HS----EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...-----
+ ydalhpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevG
+ y+a + ++vsr e++t + ++G +C+sgD+l + + + P +++ G
+ sp|Q8RQM6| 361 YGAEYDARVVSRFTEGETTNTRVVGSHCESGDILIN-EATYPS--DIHTG 407
+
+ CS -EEEES-----SGCC-B-TTT--.-EEEEE
+ DllvffdaGAYteslasnFNgfprpaeVlv<-*
+ Dll+ +GAY+++++s++N f rpa+V v
+ sp|Q8RQM6| 408 DLLALAATGAYCYAMSSRYNAFARPAVVSV 437
+
+sp|B4F1A4|SPEA_PROMH: domain 1 of 1, from 347 to 563: score 108.8, E = 8.9e-28
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++nVigv +++ + +++ ++ +++ + ++ ++ ++++++++
+ sp|B4F1A4| 347 VLISNVIGVERNEFtaitppaedaprpiaslwetweemqtkgnsrsl 393
+
+ CS
+ ..................................................
+ ++ ++++ + ++ +++ ++ + +++ ++ + ++ + + ++++
+ sp|B4F1A4| 394 rewlhdsqldlhdvhtqyvhgmlslterawaeelylnicrhiqydldpsn 443
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+ + y+++++++slpd +++d+l+p+lp++ ld
+ sp|B4F1A4| 444 rahRPIIDeLQERMSDKFYVNFSLFQSLPDAWGIDQLFPVLPIEGLDKPL 493
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ +++++l + tCds+++++++ ++++ + ++P + +++e ++ff +GA
+ sp|B4F1A4| 494 DRRAVLLDITCDSDGIIDHYvdgdgvETTMPMPaYDPEYPPMIGFFMVGA 543
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f+++a V v
+ sp|B4F1A4| 544 YQEILGNMHNLFGDTAAVDV 563
+
+sp|P74576|SPEA1_SYNY3: domain 1 of 1, from 396 to 615: score 108.1, E = 1.5e-27
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L++ V+++ +++ + ++ +++++ ++ ++ ++ + ++ ++ +
+ sp|P74576| 396 VLIFDVVATNDINPplpkvkgkdhailrnlmetwetitvdnyqeayh 442
+
+ CS S-E
+ ...............................................drk
+ + ++ +++ + + + + +++ + ++ ++ + ++++ +++
+ sp|P74576| 443 dveqfkteaislfnfgylglkerakaeelywaccrkilqicrqqeyvPDD 492
+
+ CS .. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEEEE
+ ld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepvtl
+ l++l+ +la +yy + +v++s pd++++d+l+pi+p++rldeept++ +l
+ sp|P74576| 493 LEnLEVNLASIYYANMSVFQSAPDSWAIDQLFPIMPIHRLDEEPTQRGIL 542
+
+ CS E-----TT--SEE. EEEEE.. .------EEEES
+ aGPtCdsgDvlarF......dvsLPlH...........lelevGDllvff
+ a+ tCds++++++F + ++ + L lH+ + +++++++++e+ ++l++f
+ sp|P74576| 543 ADITCDSDGKIDQFidlrdvKSVLELHplievhqpgtpPRVEP-YYLGMF 591
+
+ CS -----SGCC-B-TTT--.-EEEEE
+ daGAYteslasnFNgfprpaeVlv<-*
+ ++GAY+e++++ +N+f++ ++V++
+ sp|P74576| 592 LVGAYQEIMGNLHNLFGDINVVHI 615
+
+sp|A5GB52|SPEA_GEOUR: domain 1 of 1, from 346 to 561: score 107.3, E = 2.6e-27
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +LvtnV+ + + + ++ + + ++ ++ ++ ++ ++ ++ ++ +
+ sp|A5GB52| 346 VLVTNVLNTNTQNImpdfeatlneaeklaptvkklediyksidrysl 392
+
+ CS
+ ..................................................
+ +++ +++ + ++ + + + + +++ + ++ ++ ++ ++ +
+ sp|A5GB52| 393 redyhdtlqliqeavslfnlgyltlndramaewlygkiirkinsivekik 442
+
+ CS S-E........EEEEES----S-.-CHHHHS----EEEC
+ ...........drkldlnerlafvyylddGvygslpdpalydalhpilpv
+ + +++ ++ + + +y+ ++++++s pd++++d+l+pi+p+
+ sp|A5GB52| 443 pipeelqnfqlSLR--------QTYFANFSLFQSVPDSWAIDQLFPIVPI 484
+
+ CS SS-TTSSEEEEEEE-----TT--SEE. EEEEE.. .------EE
+ srldeeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDll
+ +rl++ p++ +++a+ tCds++ + F ++++++ LPlH+ + ++ +++
+ sp|A5GB52| 485 QRLNQKPDVIASIADITCDSDGEITSFvgengrTKFLPLHkIRKDEAYYI 534
+
+ CS EES-----SGCC-B-TTT--.-EEEEE
+ vffdaGAYteslasnFNgfprpaeVlv<-*
+ +ff+ GAY+e+l++++N+f++++ V++
+ sp|A5GB52| 535 GFFLIGAYQEILGDMHNLFGDTNAVHI 561
+
+sp|Q7U3S0|SPEA_SYNPX: domain 1 of 1, from 351 to 570: score 107.1, E = 2.9e-27
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ Lv+ V+g + ++ + ++ +++++ + ++ +++ + ++ +++ + +
+ sp|Q7U3S0| 351 LLVFDVLGSSALSAsipnasgdepltvrnlrdtlvtiqelsgtadaq 397
+
+ CS
+ ..................................................
+ + ++ ++ + +++ + + + +++ + ++ + + ++
+ sp|Q7U3S0| 398 lvrlqeawndalkfkqdalaafrlgymglpdrasaeqltwacadaiaqrl 447
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-T
+ ......drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrld
+ ++++ ++ l+ l+++la +yy + +++ s pd++++d+l+p++p+++l+
+ sp|Q7U3S0| 448 pkeqaiPEELAaLSKALAGTYYANLSIFRSAPDTWAIDQLFPVVPIQKLN 497
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ + pt+ + la+ tCds++ l+rF ++++++++L lH+l+ ++ +l++ f+
+ sp|Q7U3S0| 498 QRPTRLANLADLTCDSDGRLDRFigdgqpKQLLELHeLDDNNPYLIGLFL 547
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ GAY+e++++ +N+f+ ++ V++
+ sp|Q7U3S0| 548 SGAYQEVMGNLHNLFGTTNAVHI 570
+
+sp|A0A4W3|SPEA_GEOSL: domain 1 of 1, from 425 to 561: score 106.7, E = 3.9e-27
+ CS EEEEEEEEEEE--S S-E........EEEEES
+ *->tLvtnVigvkergg................drkldlnerlafvyyld
+ +L +++ + g ++ ++ +++ ++ + + +y+ +
+ sp|A0A4W3| 425 WLHGKILRKIN-GIvekikpipeelqnfqlSLR--------QTYFAN 462
+
+ CS ----S-.-CHHHHS----EEECSS-TTSSEEEEEEE-----TT--SEE.
+ dGvygslpdpalydalhpilpvsrldeeptepvtlaGPtCdsgDvlarF.
+ +++++s+pd++++d+l+pi+p++rl++ p++ +++a+ tCds++ + F
+ sp|A0A4W3| 463 FSLFQSIPDSWAIDQLFPIVPIQRLNQKPDVMASIADITCDSDGEITSFv 512
+
+ CS EEEEE.. .------EEEES-----SGCC-B-TTT--.-EEEEE
+ .....dvsLPlH.lelevGDllvffdaGAYteslasnFNgfprpaeVlv<
+ ++++++ +LPlH+ + +++++++ff+ GAY+e+l++++N+f++++ V+v
+ sp|A0A4W3| 513 gengrTKYLPLHkMRKDEDYFVGFFLIGAYQEILGDMHNLFGDTNAVHV 561
+
+ CS
+ -*
+
+ sp|A0A4W3| - -
+
+sp|Q39X78|SPEA_GEOMG: domain 1 of 1, from 425 to 561: score 106.4, E = 4.8e-27
+ CS EEEEEEEEEEE--S S-E........EEEEES
+ *->tLvtnVigvkergg................drkldlnerlafvyyld
+ +L +++ + g ++ ++ +++ ++ + + +y+ +
+ sp|Q39X78| 425 WLHGKILRKIN-GIvekikpipeelqnfqlSLR--------QTYFAN 462
+
+ CS ----S-.-CHHHHS----EEECSS-TTSSEEEEEEE-----TT--SEE.
+ dGvygslpdpalydalhpilpvsrldeeptepvtlaGPtCdsgDvlarF.
+ +++++s+pd++++d+l+pi+p++rl++ p++ +++a+ tCds++ + F
+ sp|Q39X78| 463 FSLFQSIPDSWAIDQLFPIVPIQRLNQKPDVMASIADITCDSDGEITSFv 512
+
+ CS EEEEE.. .------EEEES-----SGCC-B-TTT--.-EEEEE
+ .....dvsLPlH.lelevGDllvffdaGAYteslasnFNgfprpaeVlv<
+ ++++++ +LPlH+ + +++++++ff+ GAY+e+l++++N+f++++ V+v
+ sp|Q39X78| 513 gengrTKYLPLHkIRKDEDYFVGFFLIGAYQEILGDMHNLFGDTNAVHV 561
+
+ CS
+ -*
+
+ sp|Q39X78| - -
+
+sp|A1TY02|SPEA_MARAV: domain 1 of 1, from 350 to 566: score 106.3, E = 5e-27
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +LvtnVi++ +++++++++ + + + ++ ++ ++ ++++++++
+ sp|A1TY02| 350 VLVTNVIDREY-PDnreptepaaeapaplqdlwrdleslqdedsprs 395
+
+ CS
+ ..................................................
+ + ++ + + + + ++ + +++ + ++ + + + + ++
+ sp|A1TY02| 396 laeiyhdilhamadvhaqfahgllslqeraqaetlyvrccrmlraeldsa 445
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTS
+ ....drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldee
+ ++ +++ +d+lne+la ++++++++slpd +++d+++p++p++ l+++
+ sp|A1TY02| 446 nrahREIIDeLNEKLAEKLFVNFSLFQSLPDVWGIDQIFPVMPINGLNRS 495
+
+ CS SEEEEEEE-----TT--SEE. EEEEE.. .------EEEES---
+ ptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaG
+ +++++ + tCds++ ++++ ++++ + +LPl++ ++e l++ff +G
+ sp|A1TY02| 496 LNRRAVIQDITCDSDGRIDQYvdgqgiETTLPLPeHDPESPLLMGFFMTG 545
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++ V v
+ sp|A1TY02| 546 AYQEILGDMHNLFGDTHSVDV 566
+
+sp|Q9RXR4|SPEA_DEIRA: domain 1 of 1, from 372 to 586: score 106.0, E = 6.4e-27
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+ V++v + + ++++ + +++++++ ++ ++ ++ + ++
+ sp|Q9RXR4| 372 VLILPVVDVTGPTRnledqeltvpgedshqivrdmyetlenismrny 418
+
+ CS
+ ..................................................
+ +++ ++ +++++ ++ + + + +++ +++ + ++ + ++++
+ sp|Q9RXR4| 419 resyndavgdkqtlhnlfdlgyvtledrargealfnailrkiakliqgek 468
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSE
+ ..drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeept
+ ++ l++l++ la+ ++++++++slpd ++++al+pi+p++rl+e+pt
+ sp|Q9RXR4| 469 yvPDELEdLQKVLADKFICNFSLFQSLPDNWAIGALFPIVPLDRLNEQPT 518
+
+ CS EEEEEE-----TT--SEE. EEEEE...------EEEES-----S
+ epvtlaGPtCdsgDvlarF......dvsLPlHlelevGDllvffdaGAYt
+ + +tl++ tCds++++ +F + ++ + +LPlH + ++ ++l+ f++GAY+
+ sp|Q9RXR4| 519 RQATLVDITCDSDGKVEKFidlrdvKATLPLHEPGDRPYYLGAFLMGAYQ 568
+
+ CS GCC-B-TTT--.-EEEEE
+ eslasnFNgfprpaeVlv<-*
+ +l+s +N+f+ +e +v
+ sp|Q9RXR4| 569 DVLGSAHNLFGKVSEAHV 586
+
+sp|P09890|DCDA_CORGL: domain 1 of 1, from 310 to 423: score 105.3, E = 1e-26
+ CS EEEEEEEEEEE--S S-E........EEEEES----S-.-CHHH
+ *->tLvtnVigvkergg....drkldlnerlafvyylddGvygslpdpal
+ + +++V ++k+++ ++++ r+ +++ +d+G++++ ++pal
+ sp|P09890| 310 VTIYEVGTTKDVHVdddkTRR--------YIA-VDGGMSDN-IRPAL 346
+
+ CS HS----EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...-----
+ ydalhpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevG
+ y+ + ++vsr +e+ +++ ++G +C+sgD+l + d P ++ G
+ sp|P09890| 347 YGSEYDARVVSRFAEGDPVSTRIVGSHCESGDILIN-DEIYPS--DITSG 393
+
+ CS -EEEES-----SGCC-B-TTT--.-EEEEE
+ DllvffdaGAYteslasnFNgfprpaeVlv<-*
+ D+l+ +GAY+++++s++N f rpa+V v
+ sp|P09890| 394 DFLALAATGAYCYAMSSRYNAFTRPAVVSV 423
+
+sp|O82475|SPE1_BRAJU: domain 1 of 1, from 390 to 585: score 104.8, E = 1.5e-26
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+++ ++ +r+++++++ + ++ +++ +++ ++ + ++++
+ sp|O82475| 390 VLIFEAVSAGKRHEttpsdlqfllegyseeargdyenlydavmrgdr 436
+
+ CS S-E..
+ .............................................drkld
+ ++ ++ +++ ++ ++++ + ++ + ++ + +++ +++d++
+ sp|O82475| 437 escllyvdqlkqrcveefkegslsieqlagvdglcewvtkeiggsDPV-- 484
+
+ CS ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEEEEE--
+ lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepvtlaGP
+ +y ++ +v++s+pd +++d+l+pi+p++rld+ p ++ +l +
+ sp|O82475| 485 ------LTYNVNLSVFHSIPDFWGIDQLFPIVPIHRLDQRPVARGILSDL 528
+
+ CS ---TT--SEE. EEEEE...------EEEES-----SGCC-B-TTT--
+ tCdsgDvlarF...dvsLPlHlelevGDllvffdaGAYteslasnFNgfp
+ tCds++++++F +++ sLPlH ++G++l++f+ GAY e+l+ +N+f+
+ sp|O82475| 529 TCDSDGKINKFiggESSLPLHELDNNGYYLGMFLGGAYEEALGGVHNLFG 578
+
+ CS .-EEEEE
+ rpaeVlv<-*
+ p++V v
+ sp|O82475| 579 GPSVVRV 585
+
+sp|Q39827|SPE1_SOYBN: domain 1 of 1, from 401 to 596: score 104.7, E = 1.6e-26
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+++ +g+++ +g++ ++ + + ++ +++ + ++ +++ +
+ sp|Q39827| 401 VLIFEAVGTSSTNGggappalsahylaeelsedygylselafrgdye 447
+
+ CS S-E...
+ ............................................drkldl
+ + +++ +++ ++ ++++ ++ ++ + ++ + + +
+ sp|Q39827| 448 tclvyteemkercveqfkqgtvcmeqlaaveglcelvrkavgaaESV--- 494
+
+ CS .....EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEEEEE---
+ nerlafvyylddGvygslpdpalydalhpilpvsrldeeptepvtlaGPt
+ y+++ ++++s pd +++++++pi+p++rlde p ++ +l + t
+ sp|Q39827| 495 -----RRYHVNLSIFTSVPDAWGIEQVFPIIPIHRLDEKPSVRGILSDLT 539
+
+ CS --TT--SEE. EEEEE.. .------EEEES-----SGCC-B-TTT--
+ CdsgDvlarF...dvsLPlH.lelevGDllvffdaGAYteslasnFNgfp
+ Cds++++++F +++ sLPlH+ e + ++l++f+ GAY e+l+ +N+f+
+ sp|Q39827| 540 CDSDGKIDKFingESSLPLHeMEGGRTYYLGMFLGGAYEEALGGVHNLFG 589
+
+ CS .-EEEEE
+ rpaeVlv<-*
+ p++V v
+ sp|Q39827| 590 GPSVVRV 596
+
+sp|Q7N121|SPEA_PHOLL: domain 1 of 1, from 347 to 563: score 104.7, E = 1.6e-26
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+nVigv +++ ++++++ ++ +++ ++ ++ ++ ++++++++
+ sp|Q7N121| 347 VLVSNVIGVERNEFtqttppaedasrpltslwetwqemhsegnrrsl 393
+
+ CS
+ ..................................................
+ +++ ++++ + ++ +++ ++ + +++ ++ + ++ +++ ++++
+ sp|Q7N121| 394 reslhdgqldlhdvhtqyahgmldlterawaeelylnicrriqqdldpsn 443
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ...drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ + +++ +d+l+er+a+ y+++++++slpd +++d+l+p+lp++ ld
+ sp|Q7N121| 444 rahRPIIDeLQERMADKFYVNFSLFQSLPDAWGIDQLFPVLPIEGLDKPL 493
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds+++++++ ++++ + ++P ++++ ++ff +G
+ sp|Q7N121| 494 DRRAVLLDITCDSDGIVDHYvdgdgvaaTMPMPA-YDPDCPPMIGFFMVG 542
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++a + v
+ sp|Q7N121| 543 AYQEILGNMHNLFGDTAAIDV 563
+
+sp|B3EAF3|SPEA_GEOLS: domain 1 of 1, from 346 to 561: score 104.5, E = 1.8e-26
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +LvtnV+ + + + ++ ++ ++ +++ ++ ++ + ++ ++ +
+ sp|B3EAF3| 346 VLVTNVLNTNTQNLmpdyeqileemekpaptvkklldiyksidrysl 392
+
+ CS
+ ..................................................
+ +++ +++ + ++ + + + + +++ + ++ ++ ++ ++ +
+ sp|B3EAF3| 393 redyhdtlqlineavslfnlgyltlqdraiaewlyskiikkinsivekik 442
+
+ CS S-E........EEEEES----S-.-CHHHHS----EEEC
+ ...........drkldlnerlafvyylddGvygslpdpalydalhpilpv
+ + +++ ++ + + + +y+ ++++++s+pd++++d+l+pi+p+
+ sp|B3EAF3| 443 pipeelqnfqlALR--------QTYFANFSLFQSIPDSWAIDQLFPIMPL 484
+
+ CS SS-TTSSEEEEEEE-----TT--SEE. EEEEE.. .------EE
+ srldeeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDll
+ +rl + p++ +++a+ tCds++ + F +++++ LP H+l+ ++++++
+ sp|B3EAF3| 485 QRLGQRPDVMASIADITCDSDGEITSFvgengrSKFLPMHkLKKDEDYYI 534
+
+ CS EES-----SGCC-B-TTT--.-EEEEE
+ vffdaGAYteslasnFNgfprpaeVlv<-*
+ +ff+ GAY+e+l++ +N+f++++ V++
+ sp|B3EAF3| 535 GFFLIGAYQEILGDLHNLFGDTNAVHI 561
+
+sp|A5GWM2|SPEA_SYNR3: domain 1 of 1, from 355 to 566: score 104.5, E = 1.8e-26
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+nV+g + ++ ++ ++ +++ ++ +++ ++ ++++ ++
+ sp|A5GWM2| 355 VLVFNVLGQSGVNQpsipeavegealivrnlretlsgigpdnlqeaw 401
+
+ CS
+ ..................................................
+ ++ + +++ + + + +++++ ++ + + +++++ ++
+ sp|A5GWM2| 402 ndalkfkddalaafrlgylsltergkaeqlywaccsaiadllpgeeelpd 451
+
+ CS S-E........EEEEES----S-.-CHHHHS----EEECSS-T
+ .......drkldlnerlafvyylddGvygslpdpalydalhpilpvsrld
+ + ++ + + +yy + +v+ s pd++++d+l+p++p++rl+
+ sp|A5GWM2| 452 elkglkaAFA--------STYYANLSVFRSAPDTWAIDQLFPVMPIHRLE 493
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ e+p+e ++a+ tCds+++larF +++ + +L lH+l+ + ++++ f+
+ sp|A5GWM2| 494 EQPRELGSFADLTCDSDGKLARFiasgsaKPLLELHeLKDGEPYWIGLFL 543
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ GAY+e++++ +N+f+ ++ V +
+ sp|A5GWM2| 544 GGAYQEVMGNLHNLFGSTNAVSI 566
+
+sp|Q7UTS2|SPEA_RHOBA: domain 1 of 1, from 460 to 592: score 104.0, E = 2.5e-26
+ CS EEEEEEEEEEE--S S-E.. ......EEEEES----S-.-CHHHH
+ *->tLvtnVigvkergg..drkld.lnerlafvyylddGvygslpdpaly
+ + +V e +++++l++l++ l ++y+ ++++++s+pd++++
+ sp|Q7UTS2| 460 AICHRVRELAESMKerPDDLKhLDRMLSDIYFANFSLFQSMPDSWAI 506
+
+ CS S----EEECSS-TTSSEEEEEEE-----TT--SEE. EEEEE..
+ dalhpilpvsrldeeptepvtlaGPtCdsgDvlarF......dvsLPlH.
+ d+l+pi+p++rl e p + ++l + tCds+++++ F +++++++L lH+
+ sp|Q7UTS2| 507 DQLFPIMPIHRLLEKPSRHAVLGDITCDSDGKVDAFvcgggrQRTLMLHp 556
+
+ CS .------EEEES-----SGCC-B-TTT--.-EEEEE
+ lelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ l+ + + l++f +GAY+e+l++ +N+f+++ V+v
+ sp|Q7UTS2| 557 LKSGEPYQLAVFMVGAYQEILGDLHNLFGDTHAVHV 592
+
+sp|Q9KCM5|DCDA_BACHD: domain 1 of 1, from 301 to 409: score 103.8, E = 3e-26
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ t ++++ ++ke++ r ++ +d+G++++ ++paly+a
+ sp|Q9KCM5| 301 TTLYTIGSRKEIPNVRH--------YLS-VDGGMSDN-LRPALYQAE 337
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ + ++ +r +e+p +++aG +C+sgD l d +LP e + D+l+
+ sp|Q9KCM5| 338 YEGALANRVNEQPVGMFSVAGKCCESGDMLIW-DLPLP---EANHEDILA 383
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +f +GAY++s+a+n+N +prp++V+v
+ sp|Q9KCM5| 384 VFCTGAYGYSMANNYNRIPRPPVVFV 409
+
+sp|Q96A70|ADC_HUMAN: domain 1 of 1, from 286 to 409: score 103.7, E = 3.1e-26
+ CS EEEEEEEEEEE--S S-E........EEEEES----
+ *->tLvtnVigvkergg............drkldlnerlafvyylddGvy
+ t+++++i++ke+ ++++++++++++ ++ +vy+ld Gvy
+ sp|Q96A70| 286 TVAVSIIAKKEVLLdqpgreeengstSKT--------IVYHLDEGVY 324
+
+ CS S-.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEE
+ gslpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvs
+ g ++++l+d + p +++++++ e+p+++++l+GP d+ D++a+ +
+ sp|Q96A70| 325 GI-FNSVLFDNICPTPILQKkpSTEQPLYSSSLWGPAVDGCDCVAE-GLW 372
+
+ CS EE...------EEEES-----SGCC-B-TTT--.-EEEEE
+ LPlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ LP l+vGD+lvf ++GAYt ++s F g + + + +
+ sp|Q96A70| 373 LP---QLHVGDWLVFDNMGAYTVGMGSPFWGTQACHITYA 409
+
+sp|Q43075|SPE1_PEA: domain 1 of 1, from 494 to 609: score 102.6, E = 6.5e-26
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ L+t+ igvk+ ++ y+++ +v++s pd +++++l
+ sp|Q43075| 494 DLITETIGVKD----PV--------KKYHVNLSVFTSVPDFWGINQL 528
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE. EEEEE.. .----
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarF...dvsLPlH..lelev
+ +pi+p++rlde pt++ +l + tCds++++++F +++ sLPlH+ +
+ sp|Q43075| 529 FPIVPIHRLDEKPTARGILSDLTCDSDGKIDKFiggESSLPLHemEGHGG 578
+
+ CS --EEEES-----SGCC-B-TTT--.-EEEEE
+ GDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ G++l++f+ G Y e+l+ +N+f+ p++V v
+ sp|Q43075| 579 GYYLGMFLGGSYEEALGGLHNLFGGPSVVRV 609
+
+sp|P72587|SPEA2_SYNY3: domain 1 of 1, from 375 to 587: score 100.6, E = 2.6e-25
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+ V+g +g +++++++++ ++ ++ + ++ + ++ +++
+ sp|P72587| 375 VLVFDVLGSNQ-TGfsephppdenahpllknlwecyetitaeqyqeq 420
+
+ CS S
+ .................................................d
+ ++ + +++ ++ + + + +++++ ++ + ++ + +++ + +
+ sp|P72587| 421 yhdalqlkteasslfnfgylsltergqaeqihwaccrkifeitrqleyiP 470
+
+ CS -E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEE
+ rkld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepv
+ +++ l++ ++++yy++ +v++s p ++ d+l+pilp++ l+e p ++v
+ sp|P72587| 471 EDFQaLDKIMTDIYYVNLSVFQSAPESWSLDQLFPILPIHHLNEKPSQRV 520
+
+ CS EEE-----TT--SEE. EEEEE.. .------EEEES-----SG
+ tlaGPtCdsgDvlarF......dvsLPlH..lelevGDllvffdaGAYte
+ +la+ tCds+++++rF + + + +L +H+ + ++l++f++GAY+e
+ sp|P72587| 521 ILADLTCDSDGKIDRFidlwdvKSYLEVHplENDGNPYYLGMFLVGAYQE 570
+
+ CS CC-B-TTT--.-EEEEE
+ slasnFNgfprpaeVlv<-*
+ ++++ +N+f++ ++V++
+ sp|P72587| 571 IMGNLHNLFGDINVVHI 587
+
+sp|Q7TUJ9|SPEA_PROMM: domain 1 of 1, from 355 to 574: score 100.2, E = 3.7e-25
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+ V+g+ +++g ++++ +++ + ++ +++ ++ ++++ ++
+ sp|Q7TUJ9| 355 ILVFDVLGTGTVPGaipkqtveepltihnlretlsgvmatqkgavse 401
+
+ CS
+ ..................................................
+ ++ ++ ++ + +++ + + + +++ ++ ++ + ++
+ sp|Q7TUJ9| 402 isrlqeawndaikfkedalaafrlgyislperalaeqltgacaeaimgql 451
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-T
+ ......drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrld
+ + +++ +++l +l la +yy + +++ s pd++++++l+p +p++rl+
+ sp|Q7TUJ9| 452 pcnetiPDDLQsLRAVLASTYYANLSIFRSAPDTWAIEQLFPLMPIHRLN 501
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ eept+ +a+ tCds+++l+rF ++++++ +L lH+l+ ++ + +++f+
+ sp|Q7TUJ9| 502 EEPTQLGHFADLTCDSDGKLDRFigngqtKTLLELHnLRQNEAYMIGMFL 551
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ aGAY+e++++ +N+f+ ++ V++
+ sp|Q7TUJ9| 552 AGAYQEVMGNLHNLFGSTNAVHI 574
+
+sp|P49726|SPE1_SOLLC: domain 1 of 1, from 291 to 492: score 98.7, E = 1e-24
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+++ ++ ++ + ++++++++ ++ ++ +++ + + ++ + +
+ sp|P49726| 291 ILIFEAVSASTSHVstqpssgglqslvetlnedaradyrnlsaaavr 337
+
+ CS S-
+ ................................................dr
+ ++ ++ +++ +++ ++ ++++ + ++ ++ + ++ + d+
+ sp|P49726| 338 geydtcliysdqlkqrcveqfkdgsldieqlaavdsicdwvskaigvaDP 387
+
+ CS E........EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEEEE
+ kldlnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepvtl
+ + +y+++ +v++s+pd +++ +l+pi+p++rlde pt + +l
+ sp|P49726| 388 V--------RTYHVNLSVFTSIPDFWGFSQLFPIVPIHRLDEKPTMRGIL 429
+
+ CS E-----TT--SEE. EEEEE.. .------EEEES-----SGCC-
+ aGPtCdsgDvlarF...dvsLPlH....lelevGDllvffdaGAYtesla
+ + tCds++++++F +++ sLPlH+ ++++ + ++l++f+ GAY e+l+
+ sp|P49726| 430 SDLTCDSDGKVDKFiggESSLPLHeigsGDGGR-YYLGMFLGGAYEEALG 478
+
+ CS B-TTT--.-EEEEE
+ snFNgfprpaeVlv<-*
+ +N+f+ p++V v
+ sp|P49726| 479 GLHNLFGGPSVVRV 492
+
+sp|Q9PII5|DCDA_CAMJE: domain 1 of 1, from 270 to 375: score 98.5, E = 1.1e-24
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +v++V++ k + ++ fv+ +d+ ++++ ++p ly+a+
+ sp|Q9PII5| 270 EFVCSVLYEKQNKT-KR--------FVV-VDGAMNDL-IRPSLYEAY 305
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h i++ +++++ ++++G +C+sgD++a+ +sLP ++ +D++v
+ sp|Q9PII5| 306 HEIILPY--NQGEESLCDVVGGICESGDFFAK-ARSLP---STQSDDIMV 349
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ + ++GAY++s++sn+N + e ++
+ sp|Q9PII5| 350 IKNTGAYGFSMSSNYNTRNKVCELAL 375
+
+sp|A2CDK1|SPEA_PROM3: domain 1 of 1, from 355 to 574: score 98.1, E = 1.5e-24
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+ V+g+ +++g ++++++++ + ++ +++ + ++++ ++
+ sp|A2CDK1| 355 ILVFDVLGTGTVPGavpnqtgeepltihnlretlagvmatqkgaase 401
+
+ CS
+ ..................................................
+ ++ ++ ++ + +++ + + + +++ ++ + + ++
+ sp|A2CDK1| 402 isrlqeawndavkfkddalaafrlgyislteralaeqltwacaeaimgql 451
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-T
+ ......drkld.lnerlafvyylddGvygslpdpalydalhpilpvsrld
+ + +++ +++l +l la +yy + +++ s pd++++++l+p +p++rl
+ sp|A2CDK1| 452 pchetiPDDLQgLRAVLAGTYYANLSIFRSAPDTWAIEQLFPLMPIHRLK 501
+
+ CS TSSEEEEEEE-----TT--SEE. EEEEE.. .------EEEES-
+ eeptepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffd
+ eept+ +a+ tCds+++l+rF ++++++ +L lH+l+ ++ + +++f+
+ sp|A2CDK1| 502 EEPTQLGHFADLTCDSDGKLDRFigngqtKTLLELHnLRQNEAYMIGMFL 551
+
+ CS ----SGCC-B-TTT--.-EEEEE
+ aGAYteslasnFNgfprpaeVlv<-*
+ aGAY+e++++ +N+f+ ++ V++
+ sp|A2CDK1| 552 AGAYQEVMGNLHNLFGSTNAVHI 574
+
+sp|Q8BVM4|ADC_MOUSE: domain 1 of 1, from 286 to 408: score 97.9, E = 1.7e-24
+ CS EEEEEEEEEEE--S S-E........EEEEES----S
+ *->tLvtnVigvkergg...........drkldlnerlafvyylddGvyg
+ t+++++++++e+ ++ +++++++ ++ +vyyld Gvyg
+ sp|Q8BVM4| 286 TVAVSIVAKREVLDqasreeqtgaaPKS--------IVYYLDEGVYG 324
+
+ CS -.-CHHHHS----EEECSS -TTSSEEEEEEE-----TT--SEE.EEEE
+ slpdpalydalhpilpvsr..ldeeptepvtlaGPtCdsgDvlarFdvsL
+ ++++l+d + p + +++++ +++p+++++l+GP ++ D++a+ +L
+ sp|Q8BVM4| 325 V-FNSVLFDNTCPTPALQKkpSADQPLYSSSLWGPAVEGCDCVAE-GLWL 372
+
+ CS E...------EEEES-----SGCC-B-TTT--.-EEEEE
+ PlHlelevGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ P l+vGD+lvf ++GAYt s g + + +
+ sp|Q8BVM4| 373 P---QLQVGDWLVFDNMGAYTVDTKSLLGGTQARRVTYA 408
+
+sp|Q9CL60|SPEA_PASMU: domain 1 of 1, from 357 to 573: score 95.7, E = 8e-24
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+nVigv + ++ + ++ ++ ++ ++ + ++++++++
+ sp|Q9CL60| 357 VLVSNVIGVERYKFetlaapakdapsvlhsmwetwvdiqssrekrsl 403
+
+ CS
+ ..................................................
+ ++ ++++ + ++ +++ + + + +++ ++ + ++ ++ ++++
+ sp|Q9CL60| 404 rswihesqfdlsdvhnqynvgllnleqrawaeqlylnichevgqlfnekh 453
+
+ CS S-E .. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ..drk.ld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ +++r+ +d+l+er a+ y+++++++slpd +++d+l+p+ p+s+l++
+ sp|Q9CL60| 454 rsHRTiIDeLQERFADKLYVNFSLFQSLPDAWGIDQLFPVCPISNLNQPV 503
+
+ CS EEEEEEE-----TT--SEE. EEEEE.. .------EEEES----
+ tepvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGA
+ ++++l + tCds+++++++ ++++ + ++P +++e ++ ll+ff +GA
+ sp|Q9CL60| 504 SRRAVLLDITCDSDGTIDHYidgdgiTTTMPMPhYEEDNPPLLGFFMVGA 553
+
+ CS -SGCC-B-TTT--.-EEEEE
+ YteslasnFNgfprpaeVlv<-*
+ Y+e+l++++N+f+++++V v
+ sp|Q9CL60| 554 YQEILGNMHNLFGDTSTVDV 573
+
+sp|O23141|SPE2_ARATH: domain 1 of 1, from 481 to 596: score 94.8, E = 1.5e-23
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L + ig ++ ++ ++y ++ +v++s+pd +++d+l
+ sp|O23141| 481 VL--KAIGASD----PV--------HTYNINLSVFTSIPDLWGIDQL 513
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE. EEEEE.. .-
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarF...dvsLPlH.....le
+ +pi+p+++ld+ p ++ +l + tCds++++++F +++ sLPlH+ ++++
+ sp|O23141| 514 FPIVPIHKLDQRPGARGILSDLTCDSDGKINKFiggESSLPLHeldknGS 563
+
+ CS -----EEEES-----SGCC-B-TTT--.-EEEEE
+ levGDllvffdaGAYteslasnFNgfprpaeVlv<-*
+ + ++l++f+ GAY e+l+ +N+f+ p++V v
+ sp|O23141| 564 GGR-YFLGMFLGGAYEEALGGVHNLFGGPSVVRV 596
+
+sp|Q9SNN0|SPE1_ORYSJ: domain 1 of 1, from 401 to 598: score 94.7, E = 1.6e-23
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv++ + + +g+ ++ ++ ++ +++ + + ++ +++
+ sp|Q9SNN0| 401 VLVFEAFSASA-PGridpatgylldeltddchadyrnlmaaavrgdf 446
+
+ CS S-E..
+ .............................................drkld
+ ++ ++ +++ ++ +++ + ++ ++ + ++ + ++
+ sp|Q9SNN0| 447 dtcalyadqlkrrcadqfkdgvlglehlaavdslceivargmgaaEPP-- 494
+
+ CS ......EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEEEEE--
+ lnerlafvyylddGvygslpdpalydalhpilpvsrldeeptepvtlaGP
+ +y+++ +v++slpd +++++ +pi+p++rl e p++ +l +
+ sp|Q9SNN0| 495 ------RTYHINLSVFTSLPDMWAIGQMFPIIPIQRLGERPAVDGVLSDL 538
+
+ CS ---TT--SEE. EEEEE.. .------EEEES-----SGCC-B-TT
+ tCdsgDvlarF...dvsLPlH...lelevGDllvffdaGAYteslasnFN
+ tCds++++++F ++ sLPlH+ ++ +G++l++f+ GAY+e+l+ +N
+ sp|Q9SNN0| 539 TCDSDGKVDHFiggRHSLPLHelpVHGTRGYYLGMFLGGAYQEALGGLHN 588
+
+ CS T--.-EEEEE
+ gfprpaeVlv<-*
+ +f+ p++V v
+ sp|Q9SNN0| 589 LFGGPSVVRV 598
+
+sp|P31851|TABA_PSESZ: domain 1 of 1, from 278 to 383: score 92.2, E = 8.9e-23
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +Lv++Vi + ++g r +v+ ld++++++ ++p ly+a+
+ sp|P31851| 278 VLVSRVINRCSKG--RE--------IVG-LDASMSAL-MRPGLYGAY 312
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ h+ + d+ p+ +++++G +C+ D++a d++LP + +GDl +
+ sp|P31851| 313 HHLTLPF-ADQRPEGVFDVVGALCENFDKFAV-DRLLP---SPLIGDLAL 357
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ ++d+GA +++++ ++Ng+ rpae +
+ sp|P31851| 358 IHDTGAHGHAMGFTYNGRLRPAELML 383
+
+sp|Q9JT25|SPEA_NEIMA: domain 1 of 1, from 343 to 559: score 91.8, E = 1.2e-22
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+nVigv + ++ + ++++ ++ ++ ++ ++ + ++++++
+ sp|Q9JT25| 343 VLVANVIGVERYKPrrldapspeaprvlhsmwetwtdisasrekrsl 389
+
+ CS
+ ..................................................
+ ++ ++++ + + +++ + + + ++ ++ + ++ ++ ++++
+ sp|Q9JT25| 390 rswihegqfdladvhnqynvgllslaqrawaeqlylnichevgelfnekh 439
+
+ CS S-E .. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ..drk.ld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ +++r+ +d+l+er a+ y+++++++slpd +++d+l+p+ p+ l+e
+ sp|Q9JT25| 440 rsHRTiIDeLQERFADKLYVNFSLFQSLPDAWGIDQLFPVCPITGLNEPI 489
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds+++++++ ++++ ++ ++P ++ e+ ll+ff +G
+ sp|Q9JT25| 490 ARRAVLLDITCDSDGTIDHYidgdgiagTMPMPD-YPEEEPPLLGFFMVG 538
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++a+ v
+ sp|Q9JT25| 539 AYQEILGNMHNLFGDTATADV 559
+
+sp|Q9K0U3|SPEA_NEIMB: domain 1 of 1, from 343 to 559: score 91.8, E = 1.2e-22
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lv+nVigv + ++ + ++++ ++ ++ ++ ++ + ++++++
+ sp|Q9K0U3| 343 VLVANVIGVERYKPrrldapspeaprvlhsmwetwtdisasrekrsl 389
+
+ CS
+ ..................................................
+ ++ ++++ + + +++ + + + ++ ++ + ++ ++ ++++
+ sp|Q9K0U3| 390 rswihegqfdladvhnqynvgllslaqrawaeqlylnichevgelfnekh 439
+
+ CS S-E .. ......EEEEES----S-.-CHHHHS----EEECSS-TTSS
+ ..drk.ld.lnerlafvyylddGvygslpdpalydalhpilpvsrldeep
+ +++r+ +d+l+er a+ y+++++++slpd +++d+l+p+ p+ l+e
+ sp|Q9K0U3| 440 rsHRTiIDeLQERFADKLYVNFSLFQSLPDAWGIDQLFPVCPITGLNEPI 489
+
+ CS EEEEEEE-----TT--SEE. EEEEE...------EEEES---
+ tepvtlaGPtCdsgDvlarF........dvsLPlHlelevGDllvffdaG
+ +++++l + tCds+++++++ ++++ ++ ++P ++ e+ ll+ff +G
+ sp|Q9K0U3| 490 ARRAVLLDITCDSDGTIDHYidgdgiagTMPMPD-YPEEEPPLLGFFMVG 538
+
+ CS --SGCC-B-TTT--.-EEEEE
+ AYteslasnFNgfprpaeVlv<-*
+ AY+e+l++++N+f+++a+ v
+ sp|Q9K0U3| 539 AYQEILGNMHNLFGDTATADV 559
+
+sp|Q7XRA1|ADC2_ORYSJ: domain 1 of 1, from 381 to 547: score 91.2, E = 1.8e-22
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ L++++ + +++ ++ ++ +++++ + +++ + ++++ + +
+ sp|Q7XRA1| 381 RLLSKIQDLSSKQPrtahtvnggggvdamhshavelkkhgiemykla 427
+
+ CS S-E........EEEEES----S-.-CHHHHS----EEEC
+ ...........drkldlnerlafvyylddGvygslpdpalydalhpilpv
+ ++ +++ +++ + + y+++ +v+ + pd +++++l+p +pv
+ sp|Q7XRA1| 428 kklskrvtgdaNGI--------YNYHMNLSVFSLVPDFWGIGQLFPMMPV 469
+
+ CS SS-TTSSEEEEEEE-----TT--SEE. EEEEE.. .------E
+ srldeeptepvtlaGPtCdsgDvlarF...dvsLPlH.....lelevGDl
+ srl+e pt tl++ tCds++++ +F ++ v+LPlH+ ++ + G++
+ sp|Q7XRA1| 470 SRLNEKPTINGTLVDITCDSDGKVEKFirdAVTLPLHplddaAAEHGGYY 519
+
+ CS EEES-----SGCC-B-TTT--.-EEEEE
+ lvffdaGAYteslasnFNgfprpaeVlv<-*
+ ++ ++ GAY+e+la+ +N+f p V v
+ sp|Q7XRA1| 520 VAALLSGAYQEALACKHNLFSGPTLVRV 547
+
+sp|Q9SI64|SPE1_ARATH: domain 1 of 1, from 385 to 584: score 88.2, E = 1.5e-21
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +L+++ ++ ++++++++ ++ +++ +++ ++ + +++++
+ sp|Q9SI64| 385 VLIFEAVSAGQQHEtptdhqfmlegyseevrgdyenlygaamrgdre 431
+
+ CS S-E...
+ ............................................drkldl
+ + ++ +++ ++ ++++ + ++ + ++ + + + +d++
+ sp|Q9SI64| 432 scllyvdqlkqrcvegfkegslgieqlagvdglcewvikaigasDPV--- 478
+
+ CS .....EEEEES----S-.-CHHHHS----EEECSS-TTSSEEEEEEE---
+ nerlafvyylddGvygslpdpalydalhpilpvsrldeeptepvtlaGPt
+ +y+++ +v++s+pd +++d+l+pi+p+++ld+ p+++ +l + t
+ sp|Q9SI64| 479 -----LTYHVNLSVFTSIPDFWGIDQLFPIVPIHKLDQRPAARGILSDLT 523
+
+ CS --TT--SEE. EEEEE.. .------EEEES-----SGCC-B-
+ CdsgDvlarF...dvsLPlH......lelevGDllvffdaGAYteslasn
+ Cds++++++F +++ sLPlH+ ++++ + ++l++f+ GAY e+l+
+ sp|Q9SI64| 524 CDSDGKINKFiggESSLPLHemdnngCSGGR-YYLGMFLGGAYEEALGGV 572
+
+ CS TTT--.-EEEEE
+ FNgfprpaeVlv<-*
+ +N+f+ p++V v
+ sp|Q9SI64| 573 HNLFGGPSVVRV 584
+
+sp|C4L9A9|SPEA_TOLAT: domain 1 of 1, from 433 to 566: score 87.6, E = 2.2e-21
+ CS EEEEEEEEEEE--SS-E .. ......EEEEES----S-.-CHHHHS
+ *->tLvtnVigvkerggdrk.ld.lnerlafvyylddGvygslpdpalyd
+ +L +V+ +++ +r d+lne+la+ ++++++++slpd +++d
+ sp|C4L9A9| 433 CLKLKVMLDPVNRMHRNlQDeLNEKLADKCFVNFSLFQSLPDAWGID 479
+
+ CS ----EEECSS-TTSSEEEEEEE-----TT--SEE. EEEEE..
+ alhpilpvsrldeeptepvtlaGPtCdsgDvlarF........dvsLPlH
+ +++pi+p+s ld++pt++ ++ + tCds++ + ++ ++ + ++ ++P
+ sp|C4L9A9| 480 QIFPIMPLSGLDQQPTRRGVIMDITCDSDGMIKEYvdgvgienSLPMP-- 527
+
+ CS .------ EEEES-----SGCC-B-TTT-- .-EEEEE
+ lelevGD..llvffdaGAYteslasnFNgfp..rpaeVlv<-*
+ e++++++++++ff++GAY+e+l++ +N+f++++ aeV++
+ sp|C4L9A9| 528 -EMRNDEtnYMGFFLVGAYQEILGDLHNLFGdtHSAEVCL 566
+
+sp|A0KIP8|SPEA_AERHH: domain 1 of 1, from 348 to 564: score 78.4, E = 1.3e-18
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lvtn+ig + ++ + ++++ ++ ++ ++ + ++++++
+ sp|A0KIP8| 348 VLVTNIIGAEG-VEmndisapdddaptilqnmwkgwldlrsedpsll 393
+
+ CS
+ ..................................................
+ + +++ + ++ +++ + + + +++ + ++++ ++ ++ ++
+ sp|A0KIP8| 394 eifhdsvadlgdvntqytmgllnleqrawaemlhqntclalkellnpvnr 443
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSE
+ .drkld..lnerlafvyylddGvygslpdpalydalhpilpvsrldeept
+ ++r l+++l+e+la+ + ++++++slpd +++++++p++p+ l++ t
+ sp|A0KIP8| 444 nHRALAdeLSEKLADKCFANFSLFQSLPDAWGIGQVFPVMPLAGLERPLT 493
+
+ CS EEEEEE-----TT--SEE. EEEEE.. .------EEEES-----
+ epvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAY
+ ++ +l + tCds++ + ++ ++ + + +LP + + ++ ++ff++GAY
+ sp|A0KIP8| 494 RRGILMDITCDSDGQVEHYvdglgvESTLPMPvYGEHEECHVGFFLVGAY 543
+
+ CS SGCC-B-TTT-- .-EEEEE
+ teslasnFNgfp..rpaeVlv<-*
+ +e+l++ +N+f+++++aeV++
+ sp|A0KIP8| 544 QEILGDLHNLFGdtHCAEVWL 564
+
+sp|A4SPD6|SPEA_AERS4: domain 1 of 1, from 348 to 564: score 73.6, E = 3.6e-17
+ CS EEEEEEEEEEE--S
+ *->tLvtnVigvkergg.................................
+ +Lvtn ig + ++ + ++++ ++ ++ ++ + ++++++
+ sp|A4SPD6| 348 VLVTNLIGAEG-VEmsdisapdedaptllqnmwqgwldlrgedpsll 393
+
+ CS
+ ..................................................
+ + +++ + ++ +++ + + + +++ + ++++ ++ ++ ++
+ sp|A4SPD6| 394 eifhdsvadlgdvntqytmgllnleqrawaemlhqntclalkemlnpvnr 443
+
+ CS S-E.. ......EEEEES----S-.-CHHHHS----EEECSS-TTSSE
+ .drkld..lnerlafvyylddGvygslpdpalydalhpilpvsrldeept
+ ++r l+++l+e+la+ + ++++++slpd +++++++p++p+ ld+
+ sp|A4SPD6| 444 nHRALAdeLSEKLADKCFANFSLFQSLPDAWGIGQVFPVMPLTGLDRPLS 493
+
+ CS EEEEEE-----TT--SEE. EEEEE.. .------EEEES-----
+ epvtlaGPtCdsgDvlarF......dvsLPlH.lelevGDllvffdaGAY
+ ++ +l + tCds++ + ++ ++ + + +LP +++e ++ +++ff++GAY
+ sp|A4SPD6| 494 RRGILMDITCDSDGQVEHYvdglgvESTLPMPqYEENEVCYVGFFLVGAY 543
+
+ CS SGCC-B-TTT-- .-EEEEE
+ teslasnFNgfp..rpaeVlv<-*
+ +e+l++ +N+f+++++aeV++
+ sp|A4SPD6| 544 QEILGDLHNLFGdtHCAEVCL 564
+
+sp|P55709|Y4YA_RHISN: domain 1 of 1, from 324 to 439: score 23.1, E = 0.0018
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ + v+++ vk +g + +v+++ ++ + ++ +
+ sp|P55709| 324 ITVFRISRVKALGP-DS--------HVIFVEGSSFSA--CETWFASE 359
+
+ CS --EEECSS -TTSSEEEEEEE-----TT--S EE.EEEEE...---
+ hpilpvsr.....ldeeptepvtlaGPtCdsgDvl.arFdvsLPlHlele
+ + i p+ + ++ + p +++ laG +C+ Dv+++r ++P ++
+ sp|P55709| 360 FLIDPILVpatkaTVQLPPVRAYLAGHSCLDEDVIsNR-WLTFPT--APR 406
+
+ CS ---EEEES-----SGCC-B -TTT--.-EEEEE
+ vGDllvffdaGAYteslas.nFNgfprpaeVlv<-*
+ +GDllv+ ++G Y++ l + F +p+pa ++v
+ sp|P55709| 407 AGDLLVYANTGGYQMDLLEnEFHRHPMPARFCV 439
+
+sp|O81160|SPE2_THECC: domain 1 of 1, from 341 to 406: score -9.6, E = 1.1
+ CS EEEEEEEEEEE--SS-E........EEEEES----S-.-CHHHHS--
+ *->tLvtnVigvkerggdrkldlnerlafvyylddGvygslpdpalydal
+ +L + ig ++ ++ ++y ++ +v++s+pd +++d+l
+ sp|O81160| 341 VL--KAIGASD----PV--------HTYNINLSVFTSIPDLWGIDQL 373
+
+ CS --EEECSS-TTSSEEEEEEE-----TT--SEE.EEEEE...------EEE
+ hpilpvsrldeeptepvtlaGPtCdsgDvlarFdvsLPlHlelevGDllv
+ +pi+p+++ld+ p ++ +l + tCds++++++
+ sp|O81160| 374 FPIVPIHKLDQRPGARGILSDLTCDSDGKINK------------------ 405
+
+ CS ES-----SGCC-B-TTT--.-EEEEE
+ ffdaGAYteslasnFNgfprpaeVlv<-*
+ +
+ sp|O81160| 406 -------------------------F 406
+
+
+Histogram of all scores:
+score obs exp (one = represents 368 sequences)
+----- --- ---
+<-187 18 -|=
+ -187 0 0|
+ -186 0 0|
+ -185 1 0|=
+ -184 1 0|=
+ -183 1 0|=
+ -182 1 0|=
+ -181 2 0|=
+ -180 2 0|=
+ -179 7 0|=
+ -178 6 0|=
+ -177 14 0|=
+ -176 14 0|=
+ -175 17 0|=
+ -174 17 0|=
+ -173 36 0|=
+ -172 48 0|=
+ -171 65 0|=
+ -170 61 0|=
+ -169 67 0|=
+ -168 79 0|=
+ -167 125 0|=
+ -166 97 0|=
+ -165 103 0|=
+ -164 133 0|=
+ -163 136 0|=
+ -162 109 0|=
+ -161 171 0|=
+ -160 122 0|=
+ -159 235 0|=
+ -158 158 0|=
+ -157 103 0|=
+ -156 149 0|=
+ -155 123 0|=
+ -154 154 0|=
+ -153 121 0|=
+ -152 115 0|=
+ -151 98 0|=
+ -150 86 0|=
+ -149 123 0|=
+ -148 112 0|=
+ -147 116 0|=
+ -146 113 0|=
+ -145 128 0|=
+ -144 123 0|=
+ -143 125 0|=
+ -142 153 0|=
+ -141 119 0|=
+ -140 132 0|=
+ -139 146 0|=
+ -138 183 0|=
+ -137 205 0|=
+ -136 297 0|=
+ -135 267 0|=
+ -134 278 0|=
+ -133 401 0|==
+ -132 571 0|==
+ -131 341 0|=
+ -130 426 0|==
+ -129 416 0|==
+ -128 361 0|=
+ -127 396 0|==
+ -126 439 0|==
+ -125 407 0|==
+ -124 416 0|==
+ -123 384 0|==
+ -122 403 0|==
+ -121 476 0|==
+ -120 497 0|==
+ -119 583 0|==
+ -118 506 0|==
+ -117 569 0|==
+ -116 653 0|==
+ -115 724 0|==
+ -114 817 0|===
+ -113 975 0|===
+ -112 867 0|===
+ -111 1055 0|===
+ -110 1129 0|====
+ -109 1130 0|====
+ -108 1173 0|====
+ -107 1303 0|====
+ -106 1511 0|=====
+ -105 1761 0|=====
+ -104 1598 0|=====
+ -103 1922 0|======
+ -102 1956 0|======
+ -101 2171 0|======
+ -100 2341 0|=======
+ -99 2531 0|=======
+ -98 2977 0|=========
+ -97 3395 0|==========
+ -96 3552 0|==========
+ -95 3786 0|===========
+ -94 4681 0|=============
+ -93 5018 0|==============
+ -92 5434 0|===============
+ -91 5767 0|================
+ -90 6231 0|=================
+ -89 7348 9|*===================
+ -88 8000 63|*=====================
+ -87 8823 285|*=======================
+ -86 9568 957|==*=======================
+ -85 10619 2509|======*======================
+ -84 12082 5363|==============*==================
+ -83 13504 9681|==========================*==========
+ -82 14969 15206|=========================================*
+ -81 15881 21295|============================================ *
+ -80 17604 27128|================================================ *
+ -79 18526 31969|=================================================== *
+ -78 19609 35332|====================================================== *
+ -77 20829 37040|========================================================= *
+ -76 21100 37180|==========================================================*
+ -75 21674 36011|==========================================================*
+ -74 21586 33869|==========================================================*
+ -73 20963 31094|========================================================= *
+ -72 20694 27986|========================================================= *
+ -71 19128 24780|==================================================== *
+ -70 18231 21650|================================================== *
+ -69 16942 18707|=============================================== *
+ -68 14710 16019|======================================== *
+ -67 13068 13616|====================================*
+ -66 11524 11502|===============================*
+ -65 9842 9668|==========================*
+ -64 8643 8093|=====================*==
+ -63 7470 6752|==================*==
+ -62 6099 5617|===============*=
+ -61 5084 4663|============*=
+ -60 4216 3863|==========*=
+ -59 3641 3195|========*=
+ -58 2752 2640|=======*
+ -57 2382 2179|=====*=
+ -56 1809 1796|====*
+ -55 1477 1480|====*
+ -54 1200 1219|===*
+ -53 943 1003|==*
+ -52 814 825|==*
+ -51 660 679|=*
+ -50 542 558|=*
+ -49 333 459|=*
+ -48 341 377|=*
+ -47 246 310|*
+ -46 152 255|*
+ -45 131 209|*
+ -44 104 172|*
+ -43 103 141|*
+ -42 84 116|*
+ -41 58 95|*
+ -40 51 78|*
+ -39 41 64|*
+ -38 40 52|*
+ -37 43 43|*
+ -36 37 35|*
+ -35 24 29|*
+ -34 18 24|*
+ -33 20 19|*
+ -32 10 16|*
+ -31 13 13|*
+ -30 8 10|*
+ -29 9 9|*
+ -28 7 7|*
+ -27 4 6|*
+ -26 3 4|*
+ -25 3 4|*
+ -24 3 3|*
+ -23 3 2|*
+> -22 171 -|=
+
+
+% Statistical details of theoretical EVD fit:
+ mu = -75.9194
+ lambda = 0.1968
+chi-sq statistic = 6930210.0000
+ P(chi-square) = 0
+
+Total sequences searched: 516081
+
+Whole sequence top hits:
+tophits_s report:
+ Total hits: 450
+ Satisfying E cutoff: 170
+ Total memory: 106K
+
+Domain top hits:
+tophits_s report:
+ Total hits: 450
+ Satisfying E cutoff: 450
+ Total memory: 1738K
diff --git a/demotic/examples/example.hmm b/demotic/examples/example.hmm
new file mode 100644
index 0000000..4573ba9
--- /dev/null
+++ b/demotic/examples/example.hmm
@@ -0,0 +1,845 @@
+HMMER3/b [3.0 | March 2010]
+NAME US2
+ACC PF02476.8
+DESC US2 family
+LENG 126
+ALPH amino
+RF no
+CS no
+MAP yes
+DATE Mon Sep 7 22:59:25 2009
+NSEQ 15
+EFFN 2.047119
+CKSUM 2472745667
+GA 25.00 25.00
+TC 30.90 30.00
+NC 19.50 18.80
+STATS LOCAL MSV -9.7952 0.71252
+STATS LOCAL VITERBI -10.9655 0.71252
+STATS LOCAL FORWARD -3.6497 0.71252
+HMM A C D E F G H I K L M N P Q R S T V W Y
+ m->m m->i m->d i->m i->i d->m d->d
+ COMPO 2.40416 3.88727 3.02777 2.71996 3.50350 3.04063 3.68795 2.91827 2.73527 2.47221 3.79267 3.14159 2.96869 3.12969 2.82102 2.62876 2.82660 2.71389 3.82655 3.54759
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.00000 *
+ 1 2.34670 4.31682 4.05439 3.47793 3.32776 3.84938 2.66035 2.76495 3.37158 1.91436 2.57028 3.74974 4.21994 3.62661 3.60715 3.12590 3.01755 2.57121 4.84475 2.07695 1 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 2 4.15109 5.41832 5.42701 5.12700 3.63307 4.95879 5.56595 2.91941 4.90612 0.30047 3.51230 5.34507 5.30002 5.06992 4.93276 4.72612 4.42698 3.14284 5.71796 4.60202 2 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 3 2.78851 3.29911 3.01652 2.11986 4.42653 3.55112 2.90636 3.87477 2.55345 3.42519 4.21014 1.66336 3.96682 2.90860 3.02817 2.48585 3.02647 3.50167 5.61559 4.24398 3 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 4 2.85690 5.24798 2.62409 2.51660 4.61040 3.07734 3.84047 4.07378 2.62028 3.59668 4.37518 3.05819 4.00214 2.65336 2.76841 1.22963 3.10897 3.66811 5.76382 4.37314 4 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 5 2.93924 5.43691 2.31179 1.96566 4.78534 1.78663 3.87667 4.27598 2.70919 3.76708 4.53863 3.01513 2.87530 2.99941 3.23222 2.10783 3.19391 3.84234 5.91568 4.48077 5 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 6 2.27068 4.39378 3.82717 3.25144 3.51479 3.79342 4.05933 2.03881 3.15326 2.07705 3.49214 3.60400 4.16789 3.04032 2.21285 3.05466 3.00285 2.30840 4.99351 3.77854 6 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 7 2.39276 4.35611 3.83322 3.26034 2.63725 3.77416 4.04981 2.17538 3.18990 2.30768 3.46595 3.60261 2.51739 3.46719 2.89178 2.41776 2.97839 2.61815 4.95386 3.73937 7 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 8 2.77438 5.03745 2.80692 2.40818 4.30229 1.87938 3.78588 2.58629 2.57007 3.31114 4.11303 3.08503 3.97144 2.92514 2.40773 2.57025 3.00881 3.38593 5.53284 4.18255 8 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 9 2.26357 4.86562 3.25007 2.86977 4.62106 3.45159 4.12399 4.05685 2.96536 3.65600 4.45463 1.32649 2.19487 3.28964 3.40591 2.81724 2.51509 3.59508 5.86238 4.54173 9 - -
+ 2.68620 4.42227 2.77522 2.73126 3.46356 2.40515 3.72444 3.29356 2.67743 2.69357 4.24692 2.90349 2.73723 3.18149 2.89803 2.37889 2.77522 2.98521 4.58479 3.61505
+ 0.10458 2.35793 5.36366 0.28724 1.38763 0.48576 0.95510
+ 10 2.32704 4.96701 3.16601 2.60379 4.21007 3.59040 3.14525 3.62727 2.55302 3.22503 4.03822 3.12005 3.97901 2.53692 1.84100 2.79768 2.77734 2.98540 5.46067 2.92940 11 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 11 2.72336 4.43267 3.45279 2.90685 3.65155 3.63604 3.86407 3.04486 2.87173 2.07245 3.60133 3.33274 1.93599 3.18048 3.24557 2.50041 2.61116 2.81257 4.91977 3.80947 12 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 12 2.72570 4.10270 4.22073 3.67418 2.20076 3.80041 3.49817 2.31505 3.54206 2.16192 3.27217 3.82359 4.13957 3.73165 3.67617 3.12669 2.95191 2.43052 4.63614 1.87734 13 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 13 3.00014 5.46099 2.36280 2.47625 4.76619 3.55468 1.42248 4.27605 2.77767 3.78386 4.57652 2.29815 4.06623 3.06094 3.29449 2.24758 3.25917 3.86139 5.93222 4.49648 14 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 14 3.92339 5.15648 5.72897 5.15447 3.35224 5.27219 5.56342 2.51942 5.00180 0.54483 2.26912 5.39149 5.31040 4.92160 4.99167 4.66199 4.12892 2.42649 5.59142 4.63695 15 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 15 4.85749 5.90041 5.39625 5.32178 3.84205 4.72536 5.13523 5.02071 5.10285 4.25435 5.59852 5.36391 5.30839 5.43793 5.07308 5.05878 5.20805 4.91967 0.16029 3.81601 16 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 16 3.56350 4.76863 5.62145 5.17242 4.14285 5.16116 5.95321 1.23083 5.11210 2.55957 3.87461 5.33458 5.40059 5.38100 5.28881 4.60779 3.83071 0.74542 6.27674 5.04741 17 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 17 3.43528 4.71392 5.38626 4.81409 2.26701 4.76518 5.12956 1.80859 4.66313 1.25590 3.29436 4.90892 4.98925 4.71974 4.68509 4.11815 3.66378 1.42417 5.41890 4.30979 18 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 18 3.87040 5.50509 4.68630 4.69994 5.70927 0.14688 5.70011 5.56198 4.97457 5.08105 6.10671 4.85420 4.90648 5.23966 5.06488 4.07225 4.40293 4.94474 6.53971 5.85729 19 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 19 0.31531 4.78223 4.45526 4.35737 5.03015 3.57567 5.25133 4.29931 4.40029 4.13268 5.11470 4.24711 4.38688 4.66662 4.54301 3.14688 3.47852 3.79339 6.35538 5.28370 20 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 20 0.31531 4.78223 4.45526 4.35737 5.03015 3.57567 5.25133 4.29931 4.40029 4.13268 5.11470 4.24711 4.38688 4.66662 4.54301 3.14688 3.47852 3.79339 6.35538 5.28370 21 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 21 4.03711 6.08497 0.25387 3.15386 5.61866 4.00373 4.87395 5.43138 4.13203 4.90528 5.95805 3.72937 4.70525 4.15273 4.70455 3.95169 4.40712 5.00274 6.59667 5.44206 22 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 22 3.93892 5.15008 5.77759 5.24218 3.42460 5.33508 5.67002 1.74860 5.07997 0.56649 3.17831 5.47300 5.37951 5.03250 5.07876 4.75888 4.15533 2.55686 5.67642 4.67557 23 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 23 3.24328 0.65240 4.73283 4.36780 3.29555 4.02882 4.49402 3.41080 4.13265 3.11817 4.21058 4.33872 4.62005 4.40989 4.25036 3.52435 3.61940 3.20832 4.90946 2.39529 24 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 24 2.06339 5.21368 2.64191 2.11166 4.53942 3.53101 3.72155 4.00929 2.04159 3.50919 4.26123 3.00705 3.92666 2.82599 2.29393 2.72831 2.98763 2.87306 5.65695 4.26119 25 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 25 2.54643 4.76884 3.36491 2.87183 4.13254 3.58582 3.99261 3.08318 2.82459 3.16087 4.02260 3.32111 1.32327 2.65303 3.22193 2.88031 2.73584 3.18640 5.46993 4.18916 26 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 26 2.03032 4.09664 4.23339 3.68614 2.24299 3.80010 4.08854 2.44676 3.55183 2.36607 3.26580 3.83001 4.13940 3.73906 3.68101 3.12709 2.94866 1.61391 4.63967 3.56372 27 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 27 3.72273 4.97187 5.60523 5.03686 1.62498 5.03800 5.23249 1.56557 4.88677 1.07869 3.16188 5.15717 5.16391 4.82805 4.86307 4.40504 3.93517 2.62517 5.35978 4.20015 28 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 28 2.44428 5.28322 2.49931 1.55308 4.60656 3.53041 3.76648 4.08270 2.53723 2.95320 4.33871 2.58538 3.95514 2.87626 3.03607 2.27994 3.04731 3.66378 5.73142 4.32248 29 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 29 2.43771 3.85767 3.33854 2.77782 3.86996 3.64159 2.57755 3.25507 2.75455 2.26062 3.78402 2.57196 4.02724 2.71610 3.17596 2.64444 2.97655 2.99182 5.24050 2.78070 30 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 30 2.11185 4.57971 5.08334 4.53581 3.71250 4.58083 5.04141 1.09762 4.41166 1.75268 3.56292 4.68088 4.88734 4.60462 4.53933 3.93029 3.50926 1.83653 5.52801 4.35674 31 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 31 2.41613 5.08508 3.13824 2.61618 4.46174 3.56948 3.82409 3.89693 2.54154 3.44798 4.23948 3.12886 1.68539 2.44356 2.46416 2.45221 3.05388 3.51891 5.63320 4.28885 32 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.08170 4.64131 2.67645 0.61958 0.77255 0.48576 0.95510
+ 32 2.41176 5.14236 2.49528 2.46979 4.44407 2.10611 3.74114 3.89739 2.17970 2.63045 4.20856 2.64990 3.93037 2.86049 2.99522 2.74389 2.99459 3.51203 5.61376 4.23145 33 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01543 4.57504 5.29739 0.61958 0.77255 0.60472 0.79016
+ 33 2.37147 4.58485 3.54996 3.04298 4.14130 2.90462 4.11314 2.96164 3.02715 3.20406 4.05015 3.41101 1.47307 3.34651 3.42106 2.37813 2.38791 3.17703 5.50205 4.24368 34 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01543 4.57504 5.29739 0.61958 0.77255 0.60472 0.79016
+ 34 3.28133 5.46966 3.73743 3.02134 4.96925 3.92701 3.85648 4.30355 1.03150 3.71796 4.56312 3.43547 4.28108 2.97861 1.64692 3.26346 2.62045 3.96007 5.74770 4.57184 35 - -
+ 2.68597 4.42239 2.77534 2.73138 3.46328 2.40474 3.72509 3.29368 2.67755 2.69333 4.24704 2.90361 2.73754 3.18161 2.89815 2.37901 2.77534 2.98462 4.58491 3.61517
+ 0.21606 1.66439 5.29739 1.00151 0.45780 0.41798 1.07405
+ 35 4.12020 5.77258 4.70273 4.12388 5.34403 4.36876 4.70257 5.00705 2.96226 4.37865 5.40599 4.40019 4.87849 3.92946 0.26228 4.20114 4.36222 4.70599 6.13639 5.16848 39 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 36 3.00067 4.37825 4.79836 4.19826 2.23428 4.17508 4.48761 2.20511 4.02487 1.18339 2.58315 4.28025 4.49887 4.15161 4.08174 2.78503 3.22902 2.49394 4.95715 3.80106 40 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 37 3.20142 4.50461 5.12734 4.56746 3.07057 4.53164 4.96075 1.36756 4.42538 2.05089 3.54686 4.65720 4.83572 4.59637 4.50927 3.87543 2.71150 1.20694 5.42115 4.24200 41 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 38 1.39361 4.51592 3.85479 3.39230 3.71133 3.63185 4.23537 3.21064 3.33325 2.95118 3.87064 3.67169 4.17997 3.64000 3.63403 2.99089 2.57219 2.94696 5.20310 1.64218 42 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 39 1.54905 4.46587 4.70561 4.16481 3.75116 4.22780 4.75798 1.60994 4.05701 2.58772 3.65939 4.33202 4.63105 4.29230 4.24036 3.57201 2.82376 1.47443 5.40967 4.20932 43 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 40 2.80206 5.25881 3.05861 2.01840 4.60177 2.96537 3.73272 4.06691 1.71943 3.55058 4.30518 3.03935 3.95752 2.47595 2.44054 2.77044 3.02820 3.64960 5.68049 2.96306 44 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 41 2.56181 4.46955 4.94145 4.38488 3.71414 4.42785 4.86616 1.62997 4.25814 2.14004 3.61359 4.51811 4.75930 4.46742 4.38984 3.76432 2.54346 1.11266 5.41094 4.21484 45 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 42 2.28478 5.29270 2.66915 2.18486 4.63050 3.53114 3.80086 4.10589 2.58788 3.61069 4.37451 2.50200 2.01315 2.91596 3.08983 2.14852 3.08071 3.68768 5.76608 4.35667 46 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 43 2.84500 2.12405 1.43243 2.93438 4.66732 1.73723 4.26130 4.09978 3.19447 3.73439 4.56120 3.37590 4.12582 3.45757 3.64784 2.93227 3.22630 3.65647 5.94346 4.63582 47 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 44 1.73076 4.86535 3.22316 1.91151 4.22239 3.56142 3.91068 3.56417 2.73843 3.24192 4.07621 3.21063 4.01630 3.08084 3.18506 2.82534 2.03295 2.80522 5.52016 4.20433 48 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 45 3.64038 4.99068 4.87632 4.46692 1.47090 4.52208 3.97997 3.47679 4.29566 2.94000 4.08435 4.36300 2.93378 4.37224 4.37186 3.88101 3.88070 3.34978 1.12430 2.50203 49 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.16814 4.64131 1.93017 0.61958 0.77255 0.48576 0.95510
+ 46 1.67298 4.49614 3.59956 3.08505 4.07102 3.40351 4.11842 3.44146 3.05844 3.13736 3.99032 3.42127 2.52609 3.37026 3.43807 1.98772 2.40492 2.35445 5.44873 4.20213 50 - -
+ 2.68620 4.42227 2.77522 2.73089 3.46356 2.40515 3.72497 3.29356 2.67743 2.69357 4.24692 2.90349 2.73742 3.18149 2.89803 2.37889 2.77522 2.98521 4.58479 3.61505
+ 0.11958 2.23250 5.21233 0.29166 1.37446 0.35867 1.19934
+ 47 2.96470 5.38207 2.77877 2.22006 4.71669 1.36947 2.89548 4.18964 2.73994 3.71164 4.50531 2.52332 4.05493 3.04516 3.23951 2.54642 3.22211 3.78644 5.88183 4.47100 52 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 48 2.20425 5.01731 3.10319 2.23044 4.27793 2.86778 3.76095 3.70650 2.06188 2.86384 2.93099 3.07528 2.89449 2.89637 3.00905 2.76212 2.97824 3.36185 5.50582 4.15485 53 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 49 2.30135 4.84691 3.31652 2.79452 4.42241 3.48554 3.97509 3.85182 2.77161 3.44739 4.24678 3.25069 2.21982 3.13021 2.64914 1.52585 2.58061 3.44548 5.66621 4.34831 54 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 50 3.99686 5.30863 5.10112 4.74645 2.82221 4.70120 4.31354 3.50367 4.33812 2.14339 4.11034 4.67394 5.08982 4.61015 4.40711 4.24545 4.25596 3.52763 0.59778 2.85415 55 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.30073 4.64131 1.38598 0.61958 0.77255 0.48576 0.95510
+ 51 2.03752 4.94802 3.00713 2.23023 4.26292 3.46281 3.70080 3.69271 2.46242 3.26407 4.06015 3.00222 2.61085 2.83549 2.48455 2.69077 2.51586 3.33389 5.47248 4.12297 56 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.10978 4.35975 2.39489 0.61958 0.77255 0.30028 1.34944
+ 52 2.78752 4.62920 3.49321 2.91952 3.76676 3.71011 3.92368 2.59315 2.06265 1.85051 3.68485 3.36579 4.08747 2.31584 3.15400 2.94924 3.01542 2.60947 5.18551 3.93650 57 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01543 4.57504 5.29739 0.61958 0.77255 0.60472 0.79016
+ 53 3.19877 4.98956 4.05858 3.82531 4.33420 3.81429 4.77389 3.80308 3.71760 2.67141 4.55443 4.07120 0.52882 4.15314 3.95272 3.39356 3.62965 3.56467 5.80839 4.53606 58 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.09455 4.57504 2.52684 0.61958 0.77255 0.60472 0.79016
+ 54 2.72614 3.87252 1.87457 2.07765 4.46358 3.48035 3.71174 3.92549 2.47938 3.44802 4.21393 2.97477 3.02984 2.82611 2.96920 2.37500 2.69609 3.52392 5.61596 4.22508 59 - -
+ 2.68667 4.41808 2.77569 2.73149 3.46098 2.40517 3.72544 3.29322 2.67687 2.69300 4.24739 2.90341 2.73789 3.18196 2.89850 2.37903 2.77569 2.98488 4.58526 3.61498
+ 0.35666 1.22220 5.21953 1.80423 0.17985 0.36285 1.18971
+ 55 2.82738 5.29095 2.95967 1.87795 4.63423 2.49095 3.76871 4.10583 2.49769 3.59536 4.35356 2.28315 3.96997 2.87722 1.99156 2.79154 2.81283 3.68523 5.73363 4.33756 67 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 56 2.78922 4.23423 4.35591 3.76527 2.63729 3.91523 4.22744 2.13010 3.62688 1.87923 3.32171 3.93482 4.27856 3.83165 2.53935 3.20881 2.23219 2.01844 4.85797 3.67240 68 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 57 2.38074 5.03024 3.09531 2.33992 4.29399 2.94771 3.75486 2.63043 2.32212 2.71955 4.09356 3.06720 3.47526 2.52234 2.63774 2.48841 2.97541 3.37643 5.51470 4.15987 69 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 58 2.78879 4.90186 3.17858 2.41852 4.12972 3.60799 3.16299 3.53492 2.64609 2.60343 3.99585 3.17064 1.72737 3.01181 3.08057 2.84576 2.41678 3.23316 5.42607 4.11139 70 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 59 2.39275 4.33540 3.88507 2.66498 3.45173 2.52724 4.06734 2.28419 3.23486 1.77439 3.44426 3.63792 4.16418 3.50614 3.51515 3.05462 2.98103 2.59271 3.33792 3.72418 71 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 60 2.74514 4.63316 2.93543 2.42392 3.79854 3.66139 3.89230 2.69765 2.81065 1.98134 3.72632 3.30190 4.04546 3.13845 2.88283 2.88797 2.09639 2.92271 3.88357 3.92374 72 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 61 2.32596 4.79850 2.42935 2.84419 4.26188 3.53771 4.03477 3.55235 2.90539 3.28593 4.13553 3.30021 4.05202 3.22528 3.34358 2.85181 1.27931 2.69699 5.59054 4.28935 73 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 62 2.42824 4.68262 2.77844 2.90534 4.04268 3.57091 4.01348 3.37408 2.91847 3.09034 3.95016 3.34315 4.05319 3.23835 3.33441 1.82452 2.59697 1.68659 5.41199 4.13710 74 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 63 2.29808 5.22616 2.58335 2.02724 4.56612 3.01787 3.74303 4.04010 2.49876 3.54017 4.29266 3.00699 2.80153 2.84948 2.99160 2.19018 2.43669 3.61929 5.68916 4.28738 75 - -
+ 2.68649 4.42035 2.77581 2.73185 3.46366 2.40575 3.72302 3.29334 2.67687 2.69297 4.24752 2.90370 2.73722 3.18161 2.89772 2.37899 2.77581 2.98482 4.58539 3.61326
+ 0.39134 1.36633 2.67645 2.01947 0.14240 0.48576 0.95510
+ 64 2.39294 4.58200 4.34732 3.83453 3.14741 4.01480 4.23215 2.90913 3.59517 2.08340 3.60540 4.01317 4.44645 3.91421 3.78391 3.36479 3.31947 2.78142 1.16013 3.32325 85 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01543 4.57504 5.29739 0.61958 0.77255 0.60472 0.79016
+ 65 2.75020 5.13208 2.62467 2.08677 4.44215 2.86703 3.74051 3.89580 2.51233 3.43235 4.20593 3.01082 2.64215 2.85932 2.99902 2.73664 2.02616 2.99199 5.61255 4.22980 86 - -
+ 2.68625 4.42087 2.77491 2.73065 3.46390 2.40481 3.72450 3.29390 2.67777 2.69391 4.24726 2.90383 2.73746 3.18135 2.89801 2.37902 2.77522 2.98472 4.58513 3.61539
+ 0.18077 1.83028 5.29739 1.94899 0.15364 0.60472 0.79016
+ 66 2.61257 4.58423 3.66818 3.48540 4.90981 2.34451 4.66788 4.38902 3.67759 4.03487 4.83384 3.65629 0.85165 3.93071 4.00011 2.14541 3.12375 3.72773 6.21145 5.00141 96 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01543 4.57504 5.29739 0.61958 0.77255 0.60472 0.79016
+ 67 2.72388 3.22449 4.44573 3.84595 1.96777 3.86527 4.18459 2.32373 2.89607 2.06995 3.25437 3.94403 4.23098 3.85679 3.77394 3.16556 2.71362 2.16147 4.75674 2.85826 97 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01543 4.57504 5.29739 0.61958 0.77255 0.60472 0.79016
+ 68 2.72492 4.92142 2.57407 2.40502 2.92970 3.55328 3.76030 3.57461 2.56264 2.46375 3.99332 3.08524 2.53789 2.91184 2.70902 2.41754 2.95661 3.25278 5.42491 4.09032 98 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01543 4.57504 5.29739 0.61958 0.77255 0.60472 0.79016
+ 69 2.35817 5.24838 2.23957 2.15900 4.58170 3.02246 3.71207 4.06280 2.19275 3.54882 4.29521 2.97071 3.91032 2.46888 2.95856 2.71755 2.24389 3.63329 5.68700 4.27705 99 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01543 4.57504 5.29739 0.61958 0.77255 0.41798 1.07405
+ 70 2.10580 5.22867 2.60514 2.24588 4.55129 3.52745 2.61242 4.02325 2.49077 3.52562 4.27973 2.76084 2.77775 2.84281 2.98291 2.73935 2.38061 3.60811 5.67701 4.27624 100 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 71 2.30821 4.74213 3.29265 2.73265 2.86333 3.62538 2.97949 2.99675 2.40268 2.97901 3.82970 3.22071 2.80885 3.05170 3.14673 2.47482 2.33891 3.04662 5.28314 3.99317 101 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 72 2.76035 4.85464 3.20015 2.22279 4.06786 3.60412 3.82528 3.46579 2.65483 2.02582 3.21353 2.27334 3.99948 3.00247 3.09980 2.20458 2.99348 3.17129 5.38002 4.06880 102 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 73 2.79846 5.27280 2.14277 2.45339 4.60551 3.52724 2.45418 4.08343 2.52399 3.57887 4.33277 2.56736 3.09024 2.86715 3.02111 2.03930 2.70295 3.66036 5.72523 4.31678 103 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 74 2.74836 5.03313 3.09727 2.27438 3.29803 3.55940 3.75728 3.72962 2.08501 3.30330 4.09756 3.07013 2.36083 2.88986 2.79318 2.23567 2.97952 2.88057 5.51753 4.16356 104 - -
+ 2.68621 4.42228 2.77496 2.73126 3.46357 2.40516 3.72498 3.29313 2.67744 2.69358 4.24693 2.90350 2.73743 3.18149 2.89804 2.37890 2.77523 2.98521 4.58480 3.61506
+ 0.07407 2.70739 5.36366 0.65812 0.72944 0.48576 0.95510
+ 75 2.42228 4.27085 4.60247 3.39830 2.81841 4.04066 4.37198 1.82485 3.85113 1.42819 3.31868 4.11840 4.39193 4.02455 3.94827 3.34672 3.10543 2.04858 4.92596 3.75011 107 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 76 2.37360 4.86695 3.19530 2.10976 4.08423 3.59405 3.08153 3.48866 2.39223 2.85555 3.94424 3.14684 3.98297 2.97248 3.07679 2.47191 2.97663 2.13431 5.38440 3.48468 108 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 77 1.94217 4.61639 3.41701 2.85434 2.78884 3.66523 3.06353 2.79409 2.52558 2.84034 3.71119 2.94991 3.16549 3.15140 3.23103 2.89289 2.71710 2.59684 5.17678 3.91292 109 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 78 2.74578 3.94748 3.19048 2.63289 4.11286 2.78452 3.80265 3.51986 2.37241 2.27885 3.96639 2.86759 2.43690 2.96736 2.83705 2.38498 2.97905 3.21216 5.40390 4.08420 110 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 79 2.74569 4.69082 2.60611 2.78052 2.98070 2.96585 3.86930 2.78082 2.76202 2.25119 3.78052 3.25795 2.42900 2.75389 3.18390 2.86503 2.97752 2.98688 5.23937 3.96005 111 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 80 2.74056 4.70941 3.32596 2.76639 3.90283 2.87289 3.86551 2.97534 2.74716 2.95365 3.17317 2.57688 3.18851 3.08087 3.17336 2.01621 2.55937 2.50772 5.26569 3.98248 112 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 81 2.28712 4.72826 3.02403 2.74345 3.11891 2.82814 3.85133 3.30118 2.72552 2.34276 3.81614 2.92981 4.01568 3.06081 2.61785 2.57511 2.71367 2.60092 5.27119 3.98402 113 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 82 2.74444 4.42520 3.68966 3.12023 3.19657 3.74097 4.00025 2.57803 2.30364 2.45174 2.66600 3.50653 4.11894 2.91955 3.40146 2.64770 2.58601 2.69474 5.01184 2.45012 114 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 83 2.56816 5.22758 2.68666 1.94608 4.55876 3.52910 3.71909 4.03232 2.24953 3.52536 4.27378 3.00288 3.92501 2.82166 1.91845 2.72616 2.53356 3.26055 5.66744 4.26842 115 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 84 2.42538 2.47093 4.62834 4.02571 3.27778 3.95930 4.29258 2.07207 3.84225 1.86091 3.29022 4.07729 4.32050 3.99979 3.90023 3.26756 3.02658 2.05522 4.82267 2.32966 116 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 85 2.47112 3.26773 4.33403 3.74124 2.83042 3.87048 4.18214 2.04917 3.60061 2.38294 2.77387 3.89889 4.23807 2.87177 2.86448 3.16350 2.98034 1.84263 4.80954 3.62268 117 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 86 4.62256 5.61391 5.43303 5.32992 1.84687 5.12571 3.85539 4.20347 5.12491 3.37351 4.74571 4.70071 5.40204 4.85684 4.98076 4.54800 4.83016 4.16452 3.93769 0.43575 118 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 87 1.96673 5.33019 2.53054 2.16920 4.65468 1.98052 3.78783 4.13468 2.26553 3.62789 4.38695 3.00499 3.97245 2.65214 3.06629 2.80062 3.08244 3.71183 5.77419 4.35949 119 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.06728 4.64131 2.89282 0.61958 0.77255 0.48576 0.95510
+ 88 2.90754 4.33577 4.45194 3.87227 3.48111 4.07103 4.41088 1.92567 3.72660 2.15469 3.43962 4.07205 4.42595 3.96893 2.98149 3.37369 2.67548 1.22697 5.06705 3.87512 120 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01521 4.58925 5.31159 0.61958 0.77255 0.58102 0.81945
+ 89 3.30302 4.57994 5.21901 4.68568 3.80969 4.70762 5.21112 1.54308 4.57144 1.85404 3.63720 4.82097 4.99160 4.77616 4.69778 4.07202 2.80841 0.99381 5.66636 4.47973 121 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01521 4.58925 5.31159 0.61958 0.77255 0.58102 0.81945
+ 90 2.72868 4.99699 2.12448 2.53012 3.40456 2.45330 3.07671 3.68394 2.52654 2.94416 4.06258 3.05751 3.93511 2.88022 2.54063 2.74452 2.96017 2.98094 5.48355 4.13115 122 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01521 4.58925 5.31159 0.61958 0.77255 0.58102 0.81945
+ 91 2.79977 5.19222 3.01090 2.51028 4.53848 3.54321 3.76159 3.99419 2.47939 3.50862 4.28068 2.35518 1.95202 2.53758 2.50799 2.26043 3.03690 3.59451 5.66478 4.29061 123 - -
+ 2.68574 4.41907 2.77526 2.73109 3.46437 2.40495 3.72501 3.29381 2.67824 2.69389 4.24690 2.90408 2.73754 3.18230 2.89546 2.37911 2.77535 2.98532 4.58199 3.61587
+ 1.05763 1.10681 1.13286 2.12644 0.12699 0.58102 0.81945
+ 92 2.26005 4.91935 2.94101 2.14691 4.24996 2.65053 3.66402 3.68148 2.42085 3.24816 4.04378 2.95623 3.83710 2.79843 2.35002 2.65394 2.52008 3.31725 5.45120 4.10061 136 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.02235 4.20773 4.93007 0.61958 0.77255 1.01229 0.45159
+ 93 2.26219 4.49754 3.34404 2.79287 3.68154 3.51577 3.79826 3.09369 2.66364 2.77034 3.64939 3.22467 2.49152 3.05716 2.67931 2.78117 2.87973 2.83651 2.66072 3.79968 137 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.02235 4.20773 4.93007 0.61958 0.77255 0.81559 0.58407
+ 94 2.80635 4.27256 4.24559 3.66875 2.64561 2.82219 4.20442 2.50987 3.54662 1.35952 2.53565 3.88975 4.26142 3.75660 3.72684 3.20825 3.03956 2.41409 4.82782 3.62643 138 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.02021 4.30734 5.02969 0.61958 0.77255 0.93000 0.50179
+ 95 3.01060 5.22754 3.27816 2.72492 4.52871 3.67292 2.74707 4.01786 2.15364 3.49098 4.32819 2.58856 4.06701 2.86482 1.26875 2.99998 3.20856 3.67319 5.53801 4.25958 139 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.02021 4.30734 5.02969 0.61958 0.77255 0.93000 0.50179
+ 96 2.32623 4.62323 3.19133 2.25421 3.12005 3.51784 3.75335 3.20149 2.62811 2.46873 3.72025 3.12589 3.00272 2.96370 3.05684 2.31183 2.87383 2.92990 5.17444 3.88681 140 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.02021 4.30734 5.02969 0.61958 0.77255 0.60292 0.79232
+ 97 2.31757 4.96346 3.01754 2.09657 4.22339 2.85281 3.73612 3.64469 2.52210 2.28282 4.04245 3.03624 3.92000 2.22035 2.98232 2.74225 2.95737 3.30866 5.46338 4.11879 141 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01727 4.46328 5.18562 0.61958 0.77255 0.76435 0.62668
+ 98 2.04496 4.62240 3.29322 2.39046 3.82375 3.57239 3.82863 2.48632 2.72251 2.87473 3.73653 3.21209 3.04106 3.05400 3.14159 2.27883 2.92157 2.64318 5.19745 3.92027 142 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01727 4.46328 5.18562 0.61958 0.77255 0.76435 0.62668
+ 99 1.99633 4.81272 3.16335 2.62373 4.16065 3.48591 3.79835 3.57143 2.59990 3.18639 4.00428 2.60994 3.92520 2.95947 2.53979 1.92523 2.93532 2.70333 5.43398 4.11483 143 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01727 4.46328 5.18562 0.61958 0.77255 0.76435 0.62668
+ 100 2.70434 4.84872 2.74517 2.57615 4.08620 3.53201 3.75368 3.49009 2.55688 2.15744 3.93693 3.08608 2.46142 2.91712 2.50182 2.75389 2.55149 3.18072 5.37090 4.05021 144 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01727 4.46328 5.18562 0.61958 0.77255 0.76435 0.62668
+ 101 2.73290 3.29948 3.32299 2.74587 3.87302 3.61272 2.86448 3.26427 2.35671 2.43542 3.78140 3.21686 3.99378 3.01666 1.95228 2.84196 2.95906 2.99869 5.21547 3.35682 145 - -
+ 2.68619 4.42226 2.77521 2.73124 3.46355 2.40514 3.72496 3.29355 2.67742 2.69356 4.24691 2.90325 2.73741 3.18147 2.89802 2.37888 2.77521 2.98519 4.58478 3.61504
+ 0.07194 2.75173 5.18562 0.38748 1.13559 0.34420 1.23369
+ 102 2.75533 3.45647 3.47345 2.91624 3.83534 2.96450 3.94273 3.21754 2.38063 2.90106 3.77237 3.35646 1.67407 3.19684 3.22187 2.90793 3.00408 2.95930 3.25659 3.96431 147 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 103 2.07247 5.10813 2.63379 2.51910 4.41754 3.54115 3.77398 3.86351 2.54899 3.06459 4.19608 3.05346 2.05916 2.52606 3.02946 2.41242 3.00694 3.48706 5.60699 4.23510 148 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 104 2.48316 5.17633 2.61612 2.21490 4.49041 2.86532 3.26928 3.17324 2.34684 3.46828 4.22534 2.80592 3.92141 2.82672 2.53408 2.47717 2.97401 2.70097 5.62798 4.23653 149 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 105 2.46238 4.66589 3.37298 2.81154 3.84738 2.94419 3.88411 2.81844 2.78366 2.61044 3.76567 3.28083 2.26624 3.11639 2.40770 2.87331 2.58030 2.72127 5.22686 3.95367 150 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 106 2.24969 5.18261 3.02028 2.34513 4.50002 2.92416 3.71971 3.96582 2.26215 3.16840 4.23224 2.62895 2.63145 2.82642 2.60656 2.47703 2.68781 3.55864 5.63359 4.24132 151 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 107 2.54480 5.19454 3.01926 2.28075 4.51583 3.52840 3.13617 3.98409 2.22358 3.48883 3.25181 3.00605 2.86978 2.62450 2.33315 2.31545 2.73674 3.57242 5.64099 4.24677 152 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 108 2.75016 4.94404 3.15695 2.59825 4.18659 3.57990 3.78426 3.60250 2.57547 2.91718 4.01983 2.74281 2.45182 2.93536 2.20518 2.34303 2.41397 3.27998 4.04575 4.11719 153 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 109 2.26398 4.05764 3.06560 2.51036 4.39901 2.54896 3.74443 3.84602 2.25272 3.39150 4.16777 3.04422 2.87524 2.65445 2.72131 2.11768 2.97823 3.46818 5.57898 4.20769 154 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.07101 4.64131 2.83186 0.61958 0.77255 0.48576 0.95510
+ 110 2.76046 5.18472 3.00395 2.14146 4.50877 2.70367 3.72285 3.96985 2.25781 3.48012 4.24247 3.01090 2.26603 2.83274 2.52479 2.73721 2.40165 3.56643 5.63555 4.25085 155 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01527 4.58557 5.30792 0.61958 0.77255 0.58724 0.81161
+ 111 2.72495 3.64578 2.90703 2.43828 4.04379 3.57864 3.26343 3.12969 2.32905 2.35403 3.90883 3.13631 3.96679 2.96174 2.23423 2.78756 2.74555 3.14825 3.96310 4.03786 156 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01527 4.58557 5.30792 0.61958 0.77255 0.58724 0.81161
+ 112 2.36733 5.16210 2.66615 2.21124 4.47780 2.57108 3.70469 3.94260 2.45333 3.01517 4.21303 2.99176 3.34689 2.81242 2.29049 2.70597 2.53911 3.53735 5.61502 4.22334 157 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01527 4.58557 5.30792 0.61958 0.77255 0.42716 1.05658
+ 113 2.23858 5.19833 2.68293 2.32073 4.52113 3.52509 3.71637 3.46002 2.46106 3.49447 4.24607 2.64293 3.16012 2.82081 2.30857 2.18857 2.73621 3.57719 5.64569 4.24893 158 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 114 2.77687 5.17264 2.99356 2.19205 4.51615 2.93141 3.77364 3.97692 2.53960 3.50160 4.26921 3.03705 2.84869 2.63710 3.02507 1.68315 2.47437 3.57428 5.67067 4.28366 159 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 115 2.75506 5.14749 3.05477 2.49544 4.45073 3.54533 2.93714 3.90425 1.95330 3.43204 4.20043 3.03276 3.48597 2.66623 2.19703 2.34045 2.74582 3.51581 4.10147 3.44313 160 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.04795 4.64131 3.29222 0.61958 0.77255 0.48576 0.95510
+ 116 2.29258 5.21021 2.66721 2.09998 4.54181 3.15684 3.69956 4.01831 2.20694 3.50980 3.67373 2.98317 3.02034 2.80053 2.69211 2.27795 2.73869 3.59366 5.65123 4.24857 161 - -
+ 2.68608 4.42153 2.77540 2.73125 3.46374 2.40533 3.72515 3.29374 2.67737 2.69375 4.24710 2.90367 2.73659 3.18167 2.89821 2.37865 2.77502 2.98506 4.58497 3.61523
+ 1.03604 1.08222 1.18319 0.78012 0.61314 0.54780 0.86328
+ 117 2.25146 3.34797 3.21827 2.66147 3.80998 3.48648 2.82319 3.19585 2.62422 2.85967 3.71377 3.13239 3.29098 2.97014 2.76963 2.72203 2.28613 2.91880 5.16656 3.88540 165 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.02143 4.24953 4.97187 0.61958 0.77255 0.97957 0.47076
+ 118 2.61874 3.30041 3.32643 2.76674 3.67714 3.52511 3.79442 3.06405 2.69957 2.74844 3.62048 3.21139 2.41839 3.04980 2.54662 2.55147 2.86257 2.80887 5.07144 2.94192 166 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.02143 4.24953 4.97187 0.61958 0.77255 0.38435 1.14223
+ 119 2.36083 5.15406 2.78361 2.44457 4.47236 3.18076 3.69921 3.93730 2.30369 3.45009 4.20725 2.36792 3.89960 2.80680 2.58538 2.05051 2.69872 3.13452 5.60931 4.21780 167 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01553 4.56863 5.29098 0.61958 0.77255 0.41262 1.08446
+ 120 2.45907 5.16227 3.06375 2.51036 4.48827 2.61532 3.74374 3.94254 2.33588 3.46364 4.23106 3.04487 3.94748 2.61687 1.91221 2.29289 2.58381 3.54755 5.62736 4.25201 168 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 121 2.16139 4.89249 3.18907 2.63201 4.13532 3.58364 3.80487 3.54372 2.61330 2.54550 3.98445 2.86416 2.78143 2.96674 2.24003 2.31734 2.98107 2.96206 5.42013 4.09838 169 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 122 2.17513 4.59415 3.46236 2.90262 2.59822 3.66477 3.92779 3.14543 2.86587 2.61239 3.71079 3.34807 2.23059 3.19205 2.76821 2.35756 2.98284 2.89681 5.17528 3.91568 170 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 123 1.99124 0.82259 4.67453 4.42051 4.70714 3.29895 5.05582 4.04283 4.30022 3.83321 4.67760 4.05218 4.12111 4.48969 4.40915 1.92222 3.09031 3.47984 6.12915 5.00807 171 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 124 1.93752 1.92547 3.85874 3.30112 3.06163 3.70994 4.11007 2.92026 3.22956 2.65677 3.56237 3.62086 4.14531 2.82845 3.52799 3.00106 2.34259 2.69523 5.04878 3.83334 172 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 125 2.18980 3.60284 3.75529 2.69618 3.52002 3.31856 4.02480 2.04105 3.12555 2.60032 3.50132 3.55083 4.13272 3.41120 3.44366 2.41189 2.34683 2.66004 3.91422 3.76507 173 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.01443 4.64131 5.36366 0.61958 0.77255 0.48576 0.95510
+ 126 2.20111 2.53484 3.59831 3.04097 3.72004 3.66353 4.00344 3.08392 2.75594 2.24706 3.67475 3.44385 2.80871 3.30799 3.36083 2.05562 2.98643 2.83921 5.14818 3.90786 174 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00974 4.63662 * 0.61958 0.77255 0.00000 *
+//
+HMMER3/b [3.0 | March 2010]
+NAME Glyco_transf_28
+ACC PF03033.13
+DESC Glycosyltransferase family 28 N-terminal domain
+LENG 139
+ALPH amino
+RF no
+CS yes
+MAP yes
+DATE Thu Sep 17 23:04:26 2009
+NSEQ 43
+EFFN 7.057312
+CKSUM 3380827595
+GA 26.20 26.20
+TC 26.20 26.20
+NC 26.10 26.10
+STATS LOCAL MSV -10.0618 0.71071
+STATS LOCAL VITERBI -10.4218 0.71071
+STATS LOCAL FORWARD -4.4128 0.71071
+HMM A C D E F G H I K L M N P Q R S T V W Y
+ m->m m->i m->d i->m i->i d->m d->d
+ COMPO 2.29906 4.54364 3.15651 2.76769 3.29612 2.64211 3.58261 2.82374 2.88391 2.34808 3.70210 3.32574 3.10653 3.21062 2.94601 2.81037 2.84731 2.47823 4.62934 3.62497
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.00000 *
+ 1 2.93769 3.13941 5.38672 4.77915 1.70122 4.59823 4.94655 1.56606 4.56954 2.44086 3.87341 4.76449 4.95352 4.70242 4.57916 3.91536 3.63400 1.37878 5.42857 3.63284 1 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 2 1.77095 4.68927 5.27047 4.65832 3.31701 3.83403 4.82903 2.39711 4.44825 1.50386 3.45619 4.65027 4.85348 4.58284 4.46249 3.80410 2.61655 1.47616 5.32437 4.14802 2 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 3 3.45918 5.40997 6.12011 5.52243 1.94161 5.40694 5.74121 2.17953 5.34266 0.78755 3.05347 5.58027 5.62291 5.34535 5.31319 4.75257 4.34343 1.97842 5.99770 4.93331 3 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 4 1.20249 4.71476 5.01357 4.41617 3.81699 4.43509 4.76547 2.76611 4.25382 2.00341 3.24629 4.51673 4.80462 4.43173 4.35078 2.51054 1.90927 2.46657 5.34242 4.15992 4 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 5 1.99076 3.76121 4.62866 4.06843 4.09298 1.74549 4.75721 2.82870 3.98098 3.18175 4.09010 4.31070 3.62899 4.23085 4.22666 1.89520 2.10421 2.12195 5.58008 4.38005 5 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 6 3.05486 3.17617 5.19573 4.58377 2.89352 1.40599 3.60302 2.22944 4.37947 2.59647 2.94002 4.59133 4.80934 4.51996 4.40504 2.86784 3.51340 2.58711 5.28457 2.19123 6 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 7 2.90647 5.45675 5.35380 5.39797 6.34621 0.24861 6.30413 5.88868 5.65251 5.56345 6.30355 5.02196 2.59956 5.71616 5.70684 3.74536 4.12958 4.91021 7.63753 6.63559 7 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 8 2.34387 5.36275 4.84523 4.50611 5.62866 4.14471 3.59200 5.08251 4.51339 4.74135 5.53867 4.58734 4.91065 4.79173 4.81730 1.42337 0.66712 4.46356 6.95540 5.76208 8 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 9 1.95982 5.39273 4.39775 3.89193 5.32274 1.43454 4.98655 4.75551 3.80515 4.37259 5.16973 4.21038 4.76129 4.17417 1.04376 2.96811 3.18345 3.41887 6.58573 5.32380 9 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 10 2.58632 5.35332 5.69345 5.71014 6.28930 0.25536 6.35160 5.81044 5.74688 5.50139 6.22075 5.04638 5.02879 5.78916 5.72542 2.98462 3.14628 4.81448 7.62314 6.62906 10 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 11 3.25814 6.94187 0.89104 3.31537 6.24123 4.41195 0.91182 6.01827 4.35918 5.46015 6.39812 3.90853 5.13197 4.34973 5.06102 4.18591 4.69472 5.50334 7.49624 5.87450 11 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 12 3.90367 5.18630 5.94646 5.38362 2.46567 5.25482 5.68940 1.33591 5.22278 2.13244 3.53464 5.42275 5.54472 5.35790 5.25870 4.60625 3.18817 0.97168 6.08782 4.92497 12 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 13 3.22232 5.27822 3.72298 1.45248 1.99544 4.08888 3.61428 3.17259 3.15001 3.51945 4.36031 3.66254 4.47638 2.12662 3.59291 2.96374 3.09243 3.29794 5.80516 2.66914 13 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 14 3.48649 5.29936 4.47447 4.16607 4.84597 3.32975 5.14778 3.01735 4.16787 3.26115 4.84776 3.40279 0.43566 4.49613 4.45155 3.69924 3.88213 3.86894 6.28840 5.05292 14 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 15 1.53476 2.80103 5.12925 4.52164 2.19640 3.10133 4.76405 2.37630 4.33128 2.00233 3.79164 3.67050 4.80133 4.48397 4.37992 2.45051 3.51226 2.92128 5.29325 3.07608 15 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 16 2.23872 4.67144 5.21055 4.59885 3.76547 4.45731 3.90974 1.96305 3.55578 1.54186 3.04678 4.60491 4.82083 4.53407 4.41834 3.76705 3.03012 1.38752 5.29624 4.11920 16 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 17 0.64640 5.20116 4.86088 4.39518 4.97477 3.23067 5.26249 4.35449 4.34217 3.31640 4.92946 4.51377 2.17913 4.60590 4.63081 2.35957 3.79305 2.78916 6.39453 5.19925 17 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 18 3.30712 5.06645 5.74351 5.14848 2.78190 4.99659 5.36022 2.18938 4.95723 0.90493 3.48161 5.16414 5.30378 5.05860 4.96393 4.32753 3.47155 1.43086 5.76818 4.62457 18 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 19 1.07810 4.81373 4.49293 3.91499 3.50455 1.84064 4.60811 2.83063 3.45245 2.79008 3.37036 4.20966 4.69595 4.08450 3.57683 3.19768 3.13014 2.76876 5.41712 4.21299 19 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 20 2.96691 5.68829 2.79227 2.26176 5.02518 3.97404 3.74366 3.67819 2.14960 2.54298 4.73110 2.96936 3.65265 2.54279 2.12052 3.16329 3.08283 2.65727 2.84086 4.71993 20 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 21 1.82278 5.70319 3.45057 1.48668 5.04581 2.65068 3.46686 4.52945 2.52120 4.00704 4.74467 3.44258 4.36746 2.98482 2.41797 3.16335 2.56127 4.09255 6.13697 3.56547 21 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 22 3.36704 5.76646 6.50911 5.93220 2.76232 5.86450 6.18025 3.23546 5.78063 0.35768 3.86169 6.05638 5.96605 5.66411 5.71567 5.24870 4.74311 2.35973 6.23979 5.22216 22 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 23 2.79302 5.56427 3.52094 2.71798 4.85170 4.00514 4.19861 2.85053 2.14289 2.90492 3.14258 3.49984 3.70763 1.72000 1.78011 2.99898 3.43705 3.54174 6.03273 4.66043 23 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 24 2.04287 5.70988 2.78101 2.18866 5.05596 3.30252 3.66219 4.54256 1.98829 3.36426 4.75031 2.78846 4.36380 3.03673 1.68184 3.15888 2.89920 4.10107 6.14189 4.73044 24 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 25 2.29742 5.66410 3.11196 2.23103 3.59540 3.97986 4.16881 4.46354 2.60504 2.55241 4.70971 3.45484 4.37288 2.46995 1.46390 2.89791 3.43014 4.04472 6.10798 3.15213 25 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 26 3.09021 6.33437 2.23725 2.33922 5.65040 0.64949 3.94386 5.16047 3.56024 4.63976 5.43511 3.32053 4.76867 3.78451 4.12190 3.68142 4.03547 3.74190 6.78902 5.31295 26 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.08630 5.64863 2.53628 0.61958 0.77255 0.48576 0.95510
+ 27 2.63094 4.79226 4.39260 3.81746 3.88703 4.26730 1.06098 2.56147 3.73551 2.99292 3.90348 3.51166 2.65694 4.00073 4.00531 3.53497 3.45230 2.84521 3.27651 3.21654 27 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00569 5.56802 6.29037 0.61958 0.77255 0.56361 0.84199
+ 28 2.57555 5.68647 1.79201 1.53095 5.03256 3.54239 3.62795 3.79209 2.73080 3.99218 4.72691 2.66405 4.33972 2.53170 2.65296 2.84029 3.18899 4.07766 6.11849 4.70679 28 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00548 5.60582 6.32816 0.61958 0.77255 0.68958 0.69673
+ 29 2.91482 5.20632 5.97928 5.45483 4.54426 5.34591 5.90750 2.30908 5.32991 3.22994 2.92963 5.52263 5.65674 5.53303 5.42376 4.72118 3.01553 0.45118 6.35187 5.14753 29 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.04072 5.60582 3.31795 0.61958 0.77255 0.37662 1.15892
+ 30 2.78418 3.20493 3.60021 2.48528 4.61850 3.65024 2.85423 2.37366 2.51471 3.35137 4.45489 3.56042 4.41643 3.38369 1.48829 2.86688 2.90601 3.03938 5.88801 4.55533 30 - E
+ 2.68608 4.42275 2.77569 2.73173 3.46102 2.40563 3.72544 3.29250 2.67767 2.69333 4.24669 2.90396 2.73789 3.18196 2.89851 2.37937 2.77504 2.98455 4.57879 3.61300
+ 0.34725 1.23236 6.33742 0.80968 0.58879 0.39547 1.11891
+ 31 4.53873 5.75446 6.55803 5.97666 3.02975 5.93546 6.26709 1.70405 5.83403 1.02657 1.75033 6.11817 6.00569 5.71555 5.76757 5.32049 4.74858 1.70804 6.30950 5.33623 34 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 32 1.22361 2.59319 5.19534 4.63581 4.05921 1.35468 4.99828 2.73712 4.47459 2.68792 4.06367 4.66358 4.89913 4.64941 4.56620 3.77918 3.65406 2.64489 5.59421 4.41467 35 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 33 2.00418 4.91140 3.54520 3.66802 4.03922 4.25893 4.52307 2.75137 3.22216 2.57063 4.01816 4.04235 4.63648 3.48576 3.93635 2.62032 1.61359 1.63268 5.50191 4.27890 36 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 34 2.84176 4.00494 2.92926 2.55045 5.04013 3.27450 2.32021 3.59682 2.11985 4.00246 4.74038 3.44080 1.69079 2.79466 3.38770 2.62233 2.76225 4.08740 6.13364 4.72491 37 - T
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 35 2.68417 4.09987 2.83001 2.15608 5.04162 3.23200 4.15929 4.52528 2.59986 3.51937 4.74136 2.83550 1.42691 3.25669 2.38398 2.96726 3.42812 4.08870 6.13447 3.76893 38 - G
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 36 2.43836 5.70832 2.08920 2.35861 5.05226 1.82382 4.16067 4.53761 2.71269 3.50119 4.74943 2.06172 4.36661 3.25752 2.49249 2.91624 3.43110 3.40545 6.14161 4.73103 39 - G
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 37 2.61030 3.43970 5.24278 4.62763 2.37418 3.75644 4.78445 2.29887 4.41313 1.32478 2.27768 4.61252 4.81479 3.61984 4.42232 2.71603 3.51426 2.60976 5.27908 3.16351 40 - G
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 38 2.40219 5.58102 2.73385 1.71973 4.87498 3.59313 4.19150 3.11744 2.40033 3.25786 3.63655 3.48893 4.39025 3.30743 2.37825 3.19202 2.84596 2.05258 6.04558 4.66777 41 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 39 2.49830 5.70978 2.22143 1.89093 5.05601 2.83567 3.24683 4.54282 2.42560 4.01556 4.75014 3.02675 2.98146 3.25263 2.64723 2.27352 2.60190 4.10105 6.14177 3.86904 42 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 40 2.61860 5.43884 3.33103 2.59194 1.81097 3.59668 3.74596 4.10636 2.58550 2.34755 3.64065 3.55918 4.42562 2.77398 2.21118 3.01901 2.85160 3.77503 3.89975 3.82894 43 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.02653 5.64863 3.78708 0.61958 0.77255 0.48576 0.95510
+ 41 2.66121 3.82660 5.21391 3.67621 3.74204 4.43902 4.77197 1.92212 4.39010 1.71667 3.76798 4.59447 3.49216 4.52553 4.40602 3.74954 2.74998 1.26252 3.83796 4.09540 44 - H
+ 2.68629 4.42256 2.77550 2.73132 3.46322 2.40528 3.72525 3.29292 2.67748 2.69386 4.24720 2.90349 2.73745 3.18177 2.89831 2.37886 2.77550 2.98279 4.58508 3.61534
+ 0.44923 1.02128 6.34981 0.14679 1.99126 0.42420 1.06217
+ 42 2.36158 5.67378 3.18340 1.30053 5.00423 3.97795 4.16657 3.62471 2.43915 2.61708 4.71838 3.45126 2.62530 3.26783 2.72511 3.16804 2.61242 4.05655 6.11527 4.71347 47 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 43 2.09482 5.70944 2.93148 1.86851 4.09524 3.01564 4.15679 4.54218 2.16693 4.01514 4.74985 3.07122 4.36331 2.28885 2.98050 2.15760 2.54681 4.10061 6.14153 4.72996 48 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 44 1.37795 5.59810 2.72586 2.66246 3.54866 3.99406 3.01272 4.35411 2.76220 3.88412 3.86262 3.48136 4.38635 3.08036 2.77423 2.53766 2.67144 2.88052 6.05851 3.30217 49 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 45 3.43900 5.95053 3.06829 2.62341 5.27529 0.73752 3.66539 4.76248 2.74184 3.56430 5.00693 2.97992 3.19127 3.48010 3.66405 3.38625 3.68011 4.33227 6.38687 4.96145 50 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 46 3.62830 4.97273 5.60246 4.99568 3.91313 4.83895 5.17776 1.70333 4.79337 0.82878 3.48700 5.00296 3.92535 4.89214 4.79513 4.16106 3.85804 2.01387 5.60263 3.01791 51 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 47 2.20363 5.70614 2.84393 2.02712 3.88221 3.57770 3.28411 3.81338 2.53473 4.01126 4.74691 3.11940 2.35105 2.65918 3.38505 2.52356 2.03209 4.09657 6.13907 4.72835 52 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 48 1.53220 4.67593 5.10933 4.50286 1.72721 3.00917 3.26134 2.61191 4.31649 2.40265 3.36689 4.55098 4.79872 4.47274 4.37192 3.22166 2.86114 2.67789 5.29552 2.70776 53 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.02654 5.64863 3.78667 0.61958 0.77255 0.48576 0.95510
+ 49 2.59726 3.69266 3.35513 2.14185 4.58314 4.04375 3.30169 3.08155 2.74922 3.61016 4.43182 3.58683 4.43284 3.08861 2.58365 3.24922 3.07762 1.39867 5.86897 3.22793 54 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00536 5.62745 6.34980 0.61958 0.77255 0.59288 0.80460
+ 50 2.02433 5.59387 3.19472 2.50997 3.31322 3.27205 4.17198 3.71170 2.71896 2.97911 4.64572 3.46572 1.60144 3.03703 3.04646 2.59347 2.69579 3.96193 6.05232 4.66799 55 - E
+ 2.68632 4.42239 2.77533 2.73137 3.46253 2.40526 3.72433 3.29368 2.67754 2.69344 4.24703 2.90360 2.73753 3.18160 2.89814 2.37864 2.77533 2.98502 4.58491 3.61444
+ 0.09997 2.37097 6.34980 0.68011 0.70636 0.42417 1.06222
+ 51 3.52305 4.87060 5.50860 4.90571 3.28941 4.73605 5.08176 1.30851 4.70206 1.70387 3.90213 4.90031 5.07667 4.82497 4.71148 4.05711 3.22394 1.78054 5.53856 1.84927 58 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 52 2.52287 5.71937 2.73186 2.65862 5.06259 1.33820 4.17038 4.54809 2.77856 4.02400 4.76126 2.85203 2.43436 3.09621 3.18303 2.83662 2.52390 4.10917 6.15305 4.74172 59 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 53 2.38129 3.97034 2.94555 3.39667 4.22295 2.40721 4.41226 2.69831 3.36561 2.30587 4.16490 3.84357 2.10361 3.68447 3.02463 2.27801 2.80648 2.62282 5.63439 4.37896 60 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 54 2.96696 5.71030 1.72735 2.08512 5.05645 2.38575 4.15721 4.54322 2.53100 4.01604 4.75071 3.00889 3.34656 2.57570 2.42393 2.71658 3.22414 3.07544 6.14232 4.73065 61 - -
+ 2.68746 4.42877 2.77440 2.73159 3.45260 2.40950 3.72897 3.29357 2.68070 2.68873 4.22499 2.90492 2.73863 3.18036 2.89318 2.38258 2.77818 2.98609 4.55047 3.61741
+ 2.01323 0.83442 0.83859 2.91745 0.05559 0.48576 0.95510
+ 55 2.71559 4.63275 2.73754 3.28298 3.76598 3.92470 4.18187 2.76732 3.23370 2.07565 3.03079 3.67787 3.31885 3.53077 2.92523 2.74929 2.23309 1.90940 5.21791 3.98787 98 - S
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00923 5.08545 5.80780 0.61958 0.77255 0.41001 1.08958
+ 56 3.11524 4.09333 3.13042 2.11992 4.96994 2.28768 4.07612 4.45567 1.91303 3.33072 4.66588 3.35666 2.82995 2.11598 2.63155 2.74853 2.73280 4.01563 6.05795 4.64722 99 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00607 5.50261 6.22496 0.61958 0.77255 0.68595 0.70040
+ 57 2.28834 3.10713 4.89876 4.30090 2.46962 2.63000 3.18895 3.08141 4.14358 1.64921 3.75884 2.77682 4.71910 4.32651 3.38156 3.27050 3.44932 2.25175 4.11093 3.03842 100 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00576 5.55637 6.27872 0.61958 0.77255 0.68924 0.69707
+ 58 2.48006 5.63553 2.99990 2.71338 4.96617 2.84013 4.12769 4.44205 2.30454 3.46989 3.58326 3.16028 2.55512 2.81658 2.11805 3.12898 3.39102 3.41817 2.08033 4.67490 101 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00561 5.58154 6.30389 0.61958 0.77255 0.78589 0.60828
+ 59 1.76074 5.64497 3.06412 2.66361 4.05670 2.70523 4.12515 4.45834 2.62401 3.57293 3.96575 2.60328 4.33022 2.90254 1.81302 2.64234 3.14605 3.08582 6.08393 4.67934 102 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.47096 5.58154 0.98931 0.61958 0.77255 0.78589 0.60828
+ 60 2.92901 5.40252 3.19260 2.63642 4.73274 2.84765 3.17005 4.20790 1.70319 3.06882 4.44722 2.79566 3.46837 2.65930 2.58117 2.40018 3.16005 3.36670 5.84392 2.86540 103 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00892 5.11950 5.84185 0.61958 0.77255 1.65400 0.21231
+ 61 2.71954 4.47966 4.28092 3.05375 2.45816 2.35097 4.33004 2.64096 3.60132 1.71120 3.59268 3.29059 3.16693 3.84339 3.82738 2.85097 3.19239 2.43189 3.46820 3.88738 104 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.59971 5.11950 0.80957 0.61958 0.77255 0.12741 2.12334
+ 62 2.75641 5.52008 2.43083 2.13625 3.01651 3.81258 2.73982 4.33313 2.73967 2.52151 3.44889 2.69618 3.69288 2.20468 2.56131 3.00209 3.26602 3.90502 5.95915 4.55467 105 - .
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00710 5.34689 6.06923 0.61958 0.77255 0.17434 1.83265
+ 63 2.93156 5.39101 3.21807 2.85940 3.02655 3.60411 3.66496 2.97648 2.81288 2.79671 2.39298 3.29713 3.27144 2.97026 3.09653 2.06517 2.12913 2.99917 5.89819 4.56826 106 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 64 2.85405 4.92131 4.21394 3.09028 2.73502 2.88202 4.51324 2.79873 3.12173 2.06118 3.43003 2.80232 2.48812 3.51144 3.50041 2.28401 3.48236 2.52668 3.99314 3.13413 107 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 65 2.18577 5.70999 2.92312 2.43867 5.05629 2.38183 3.77229 4.54314 1.91183 4.01579 4.75033 3.13425 3.33471 2.50443 2.78465 2.40124 2.34743 4.10129 6.14192 4.73022 108 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 66 2.42950 5.31553 2.94072 2.67974 2.86570 2.71143 4.28526 2.85069 2.63839 2.59373 2.73029 2.33872 4.46197 3.46067 3.56693 2.93913 2.25464 3.21841 5.83797 4.52626 109 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 67 2.77454 4.65931 5.23283 4.61841 2.52057 3.55452 4.78329 2.23351 3.82360 1.23264 2.54256 4.60848 2.54131 4.53993 4.41913 3.76115 3.51469 2.37577 5.28089 3.38487 110 - C
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 68 3.04262 4.98391 4.09260 3.52583 3.63948 3.50396 4.46666 3.02695 1.81750 2.15838 3.06580 3.60942 2.99945 3.78836 2.57627 2.63501 2.30923 2.49145 4.14650 4.32539 111 - C
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 69 2.68671 5.69628 2.32394 1.92589 4.02485 3.54535 4.15988 3.77377 2.89641 3.02316 4.73817 2.96854 2.89536 3.03652 2.70378 1.92840 2.47329 3.70395 6.13179 4.72369 112 - S
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 70 2.38136 4.68585 3.85119 4.44534 2.46680 3.28060 4.74832 2.23586 4.27119 1.70165 3.80368 4.52149 2.23481 4.43846 4.34773 3.39443 2.55937 2.00994 5.30460 4.12368 113 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 71 1.72806 5.13536 3.30862 3.30834 2.62686 2.93130 3.50501 3.68209 2.87051 2.08371 3.80103 3.30949 3.15147 3.11546 3.69686 2.93090 3.46258 2.99635 3.22528 3.32108 114 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 72 2.20142 5.70751 2.22427 2.00944 5.05281 3.97006 3.47617 3.45608 2.10414 3.05500 4.74812 3.11891 4.36354 2.85186 2.28636 2.46014 3.42752 4.09827 6.14006 3.67366 115 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 73 2.98899 5.62738 3.04307 2.40484 3.17942 1.91518 4.17821 3.25308 2.35484 2.65389 4.67695 3.12112 4.37995 2.65802 2.40309 2.90408 3.43123 2.59260 6.08055 4.69065 116 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.48938 5.64863 0.95849 0.61958 0.77255 0.48576 0.95510
+ 74 2.64351 3.86966 3.15364 2.74504 3.20339 2.23793 4.15291 2.93647 3.11579 1.92930 3.88371 2.98399 4.29497 3.43261 2.71041 2.83215 3.20209 3.06839 3.34654 3.48892 117 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00850 5.16775 5.89010 0.61958 0.77255 1.60393 0.22453
+ 75 2.94982 5.40323 2.87386 2.66563 4.72503 3.38255 3.92229 3.12306 1.92087 2.79413 4.45008 2.76418 3.39974 2.32999 2.16678 2.72879 2.97179 3.35731 3.91643 4.45367 118 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00850 5.16775 5.89010 0.61958 0.77255 1.26752 0.33063
+ 76 1.81340 3.78371 3.42935 2.31059 3.38159 2.18972 3.30623 3.76844 2.86173 2.98918 4.21279 3.38324 4.22598 2.74893 3.31837 2.49701 2.74174 3.16240 5.65115 4.32885 119 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00791 5.23893 5.96128 0.61958 0.77255 1.37458 0.29162
+ 77 2.69052 4.45556 4.80081 4.19881 3.10308 4.19049 4.51247 2.09205 4.02743 1.85851 2.80123 3.28743 3.45060 3.43425 2.67982 3.49218 2.70438 1.99627 4.02885 3.04691 120 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00771 5.26549 5.98784 0.61958 0.77255 1.48523 0.25676
+ 78 2.78557 5.38999 2.93809 2.06487 3.17737 3.14727 3.28276 3.11929 2.24437 2.82631 4.44309 3.05855 4.18303 3.09706 2.00276 2.98404 3.22867 2.75343 5.85133 4.47010 121 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00771 5.26549 5.98784 0.61958 0.77255 1.33587 0.30507
+ 79 2.50593 5.50917 2.71686 2.03831 4.01322 3.78239 3.96981 4.33394 1.96062 2.78785 4.55080 3.25127 4.17578 2.12450 2.61451 2.46171 2.92227 3.40908 5.94404 4.53534 122 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00750 5.29208 6.01443 0.61958 0.77255 1.44807 0.26791
+ 80 1.66738 4.46548 4.84856 4.24476 3.00862 3.26867 4.53446 2.15265 4.06710 2.23341 3.58343 4.31279 4.57588 4.23119 4.13752 2.25837 2.39931 2.17307 3.58597 3.90416 123 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00750 5.29208 6.01443 0.61958 0.77255 0.98829 0.46555
+ 81 2.69056 5.29644 2.73558 2.48675 2.65949 3.88633 4.08802 2.91712 2.11360 2.68551 3.03458 3.04979 4.27659 3.23082 2.23675 3.08725 2.58739 3.63353 5.79235 3.78293 124 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00685 5.38293 6.10528 0.61958 0.77255 1.30051 0.31799
+ 82 2.29313 4.21160 2.97361 1.84382 3.19787 3.83391 4.02282 4.32456 1.95806 3.82052 3.47459 3.30824 4.22697 2.73981 2.32504 2.86268 2.83366 3.90397 5.96564 3.35013 125 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00685 5.38293 6.10528 0.61958 0.77255 1.30051 0.31799
+ 83 2.28796 4.63786 4.37566 3.37693 3.23701 3.27415 3.64746 1.94900 3.27839 1.95255 3.75014 4.07563 4.54351 3.95357 3.19804 2.48478 2.56295 2.18135 5.24262 3.60616 126 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00685 5.38293 6.10528 0.61958 0.77255 1.30051 0.31799
+ 84 3.40562 4.75828 5.37798 4.76440 2.56606 4.59467 4.91240 1.91343 4.55410 0.93541 2.82609 4.76052 4.91756 4.64152 4.54549 3.91332 3.63324 2.48246 3.11876 3.48243 127 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00685 5.38293 6.10528 0.61958 0.77255 1.30051 0.31799
+ 85 2.22701 5.53802 3.07557 1.99716 4.87239 3.23474 4.01906 2.86055 1.81715 2.84721 4.58150 3.30254 3.50270 2.94930 2.66047 2.51456 3.28425 3.92290 5.97715 3.75153 128 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00685 5.38293 6.10528 0.61958 0.77255 1.30051 0.31799
+ 86 2.69734 5.51614 2.62869 2.09497 4.84143 3.16832 4.02440 2.87874 2.37555 2.88014 3.02088 2.78727 2.96992 3.12744 2.58017 2.61677 3.05181 3.08716 5.96085 4.56214 129 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00685 5.38293 6.10528 0.61958 0.77255 1.30051 0.31799
+ 87 2.35444 5.32429 2.57373 2.59301 2.47508 2.88939 3.39015 3.45494 2.50035 2.72605 4.38956 2.97353 4.26968 2.41714 3.33431 3.07839 3.07107 2.96892 4.16855 3.35312 130 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00685 5.38293 6.10528 0.61958 0.77255 1.30051 0.31799
+ 88 3.05352 3.68078 3.06639 2.24322 2.98604 3.83380 4.02269 4.32537 1.83085 2.71355 4.56818 3.04450 3.50340 2.67215 2.73702 2.30143 2.57825 3.90455 5.96600 3.71417 131 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.07812 5.38293 2.65134 0.61958 0.77255 1.30051 0.31799
+ 89 2.46329 3.91657 2.37629 2.44766 4.37268 3.87947 4.08881 2.71063 2.71489 2.51447 3.35155 3.43146 1.80023 3.25710 3.00486 3.08690 3.26156 3.47511 5.67236 4.35462 132 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00735 5.31216 6.03450 0.61958 0.77255 1.41838 0.27721
+ 90 2.22219 4.03917 1.83640 2.00809 4.86594 3.79207 3.10443 4.35029 2.54041 3.31840 4.56460 2.94070 4.18581 2.22697 3.20810 2.98135 2.70757 3.91263 5.95734 4.54772 133 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00735 5.31216 6.03450 0.61958 0.77255 1.41838 0.27721
+ 91 2.02374 4.65144 3.42434 3.60815 3.76957 3.24995 3.45126 2.68725 3.53571 1.91251 3.76110 3.93888 3.32345 3.80600 3.82133 3.08621 2.34801 1.86316 5.24952 3.33534 134 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00735 5.31216 6.03450 0.61958 0.77255 1.41838 0.27721
+ 92 2.80681 3.65023 2.85973 3.65591 3.75049 4.10828 4.38933 2.37964 3.57776 2.19485 3.74537 3.30947 2.79685 3.84162 3.84966 2.44139 2.87658 1.53329 5.23545 4.02741 135 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.03735 5.31216 3.45061 0.61958 0.77255 1.19350 0.36120
+ 93 2.04359 4.46222 5.00082 4.38848 2.81428 4.24529 4.57650 1.91004 4.18296 2.10399 3.58088 4.39332 3.76476 3.44659 4.20655 3.17927 3.31290 1.81537 2.82267 2.82187 136 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00727 5.32303 6.04538 0.61958 0.77255 1.40166 0.28261
+ 94 2.23858 5.51465 2.83499 2.17419 4.85182 1.82003 3.98767 4.33222 2.52716 3.34533 4.55750 3.27020 3.35949 3.08662 2.64430 2.36254 2.93758 3.21992 5.95219 4.54607 137 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00727 5.32303 6.04538 0.61958 0.77255 1.23303 0.34448
+ 95 2.11523 4.51659 4.78336 4.18506 1.97658 4.22993 4.54791 2.71253 3.02755 2.41957 3.05873 3.46211 4.59655 4.20771 4.13036 2.73818 2.07674 2.18453 3.75672 3.43703 138 - C
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00707 5.35164 6.07398 0.61958 0.77255 1.35539 0.29820
+ 96 2.31149 3.11869 3.96355 2.28109 4.11543 1.16632 4.38840 3.45160 3.38060 2.81010 4.06688 3.81528 4.45345 3.68949 3.74874 3.28851 3.35709 2.52056 5.54421 4.30291 139 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.04845 5.35164 3.15687 0.61958 0.77255 1.35539 0.29820
+ 97 3.07100 5.52128 2.89054 2.46967 4.83980 1.20456 4.03809 3.16599 2.79794 3.81675 4.57448 3.02952 4.23295 2.53405 3.29052 2.63274 2.74512 3.89868 5.97254 4.57313 140 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00736 5.31055 6.03289 0.61958 0.77255 1.42082 0.27643
+ 98 3.08016 2.84137 4.01834 3.44875 2.30196 4.07050 4.31146 3.25562 3.37547 2.97050 3.86966 3.27107 4.44871 3.15666 2.14301 2.79984 3.31175 3.03619 5.30397 1.55733 141 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00736 5.31055 6.03289 0.61958 0.77255 1.18792 0.36364
+ 99 2.33853 4.67672 3.54231 3.62184 3.06781 4.11659 2.82899 2.39735 3.55038 2.87930 3.78617 3.95529 3.22793 3.11219 3.39888 2.67993 3.31206 1.61804 3.13049 3.36921 142 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00707 5.35164 6.07398 0.61958 0.77255 0.32806 1.27410
+ 100 1.30940 4.50437 2.84479 2.47662 4.99864 3.54883 4.13082 4.47970 2.57769 3.96288 4.70311 3.09263 4.33632 2.87188 3.12773 1.81169 3.39784 3.53365 6.09749 3.78537 143 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00554 5.59483 6.31718 0.61958 0.77255 0.73462 0.65333
+ 101 2.48808 5.01870 1.78644 3.38655 3.67180 2.46539 4.38927 3.18044 3.35360 2.05458 4.11686 3.82792 3.54132 3.67010 3.25706 3.12372 2.61797 2.14841 5.58789 4.33589 144 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00554 5.59483 6.31718 0.61958 0.77255 0.73462 0.65333
+ 102 2.46874 4.83896 2.61856 3.73742 3.95858 4.25741 4.53031 2.89028 3.67018 1.62486 3.38111 4.08194 1.63013 3.14513 3.96794 3.51805 3.46002 2.30467 5.43603 4.22170 145 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00554 5.59483 6.31718 0.61958 0.77255 0.73462 0.65333
+ 103 1.57140 4.68489 4.85515 4.26192 3.78696 3.01725 4.68523 2.73037 4.11726 1.78159 3.80360 4.40779 3.02692 4.31322 3.52842 3.66204 2.93372 1.58658 5.30343 4.11739 146 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00554 5.59483 6.31718 0.61958 0.77255 0.73462 0.65333
+ 104 3.24637 3.87409 5.16532 3.63897 2.57938 2.62194 4.74200 2.33848 4.34778 1.81026 2.42308 3.66347 4.77494 4.48744 4.37178 2.64026 2.76197 1.96742 5.24913 2.95826 147 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00554 5.59483 6.31718 0.61958 0.77255 0.53043 0.88758
+ 105 2.63073 4.64594 5.21679 4.60293 2.92917 2.43839 4.77104 1.79582 4.39175 1.83003 3.76461 4.59478 4.80130 4.52623 4.40597 3.74850 2.01940 1.92043 5.26937 3.15990 148 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.02878 5.62173 3.69885 0.61958 0.77255 0.61959 0.77255
+ 106 1.24487 5.59728 3.18667 2.40003 4.90741 1.83643 4.16327 4.36793 2.91658 3.20933 4.65163 3.11657 4.36217 3.27388 3.01921 2.88271 3.41435 3.41542 6.05624 4.66874 149 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00552 5.59847 6.32081 0.61958 0.77255 0.51075 0.91641
+ 107 1.58687 5.52620 2.83578 2.96132 4.80552 3.11139 4.19158 3.58457 2.95942 2.44587 4.58540 3.01308 4.38723 2.18078 3.43785 2.10310 2.85800 3.25912 6.00115 4.63411 150 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00537 5.62600 6.34834 0.61958 0.77255 0.59975 0.79617
+ 108 2.36620 5.09227 3.89367 3.33080 3.67876 4.14194 3.87949 2.73621 2.55565 2.21582 4.18669 2.98842 2.48751 3.30188 2.77700 2.44752 2.50177 2.72378 3.80523 3.63027 151 - H
+ 2.68633 4.42240 2.77534 2.73138 3.46369 2.40494 3.72509 3.29288 2.67756 2.69370 4.24705 2.90361 2.73708 3.18161 2.89761 2.37902 2.77534 2.98474 4.58492 3.61518
+ 0.04516 3.16049 6.34834 1.36808 0.29383 0.59975 0.79617
+ 109 2.53214 5.14332 3.00676 3.26942 2.70177 3.53589 4.34683 3.69709 2.72470 2.09531 4.23424 3.74266 3.48604 3.32492 2.68870 2.22416 3.44716 2.80421 3.86058 2.20473 157 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00537 5.62600 6.34834 0.61958 0.77255 0.59975 0.79617
+ 110 1.78823 3.32950 3.50220 2.53810 4.84226 3.98855 3.18463 4.29030 2.94426 2.23038 4.04679 3.09475 3.65209 2.17120 2.49013 2.49919 3.42121 3.39118 6.02156 4.64747 158 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00537 5.62600 6.34834 0.61958 0.77255 0.59975 0.79617
+ 111 2.85861 5.63122 3.07536 2.31266 3.94483 2.13204 3.53324 3.87792 2.22249 3.30810 3.32387 3.12232 4.36330 2.74221 2.30937 3.16153 2.88834 3.12194 4.02657 3.10944 159 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00537 5.62600 6.34834 0.61958 0.77255 0.59975 0.79617
+ 112 1.94383 4.98682 3.45086 3.06025 4.12958 2.62202 4.44282 1.57989 3.10033 2.87177 4.08831 3.90679 3.16273 3.75416 3.81453 3.16648 3.46171 1.91046 5.56415 4.32298 160 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00537 5.62600 6.34834 0.61958 0.77255 0.59975 0.79617
+ 113 1.80505 5.45502 3.56473 2.78393 4.70903 2.85183 3.39037 4.13509 2.78461 3.72049 4.52152 3.53607 1.49903 2.99146 3.47439 3.22014 3.43197 2.37095 5.94661 3.65294 161 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00537 5.62600 6.34834 0.61958 0.77255 0.59975 0.79617
+ 114 1.86164 4.75922 4.61583 4.03286 3.86641 4.33821 4.63386 2.05060 3.92780 2.00118 3.87301 4.27938 2.83722 3.49440 2.57294 3.21459 2.42002 2.02453 5.36759 4.17095 162 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00537 5.62600 6.34834 0.61958 0.77255 0.42056 1.06909
+ 115 3.27370 4.72109 4.85227 4.25972 2.47444 4.39416 2.41378 1.93731 4.12076 2.43889 3.83717 1.93460 4.76215 4.32152 3.54670 2.71079 3.09955 2.01857 5.33533 3.44906 163 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 116 2.75719 4.97681 5.66860 5.08503 3.46557 4.93141 5.32601 1.58426 4.90043 1.96963 3.49694 5.09638 5.26269 5.04661 4.92911 4.26413 3.05398 0.92870 5.78647 4.60685 164 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 117 1.33391 5.45400 3.63990 2.84409 4.74292 3.49942 1.38510 4.16098 3.14468 3.76541 4.57956 3.14774 4.49183 3.48947 3.60588 3.30619 2.91460 2.95604 6.00865 4.67503 165 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 118 3.51479 6.06225 2.63801 0.60145 5.38676 4.11647 3.44865 4.88687 3.24679 4.35956 5.12115 3.07002 4.59401 3.54389 3.77093 3.04649 3.23473 4.44480 6.49399 3.82025 166 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 119 2.11711 5.69054 2.59101 2.89728 5.02832 3.97395 3.14863 4.50910 2.14841 3.99266 3.88268 3.44426 4.36724 1.73567 2.99178 2.56445 3.42863 3.53962 6.12755 2.30811 167 - H
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 120 3.21370 5.43266 2.77213 3.04450 3.63901 4.04031 3.54256 4.09583 3.03895 2.00656 4.50191 1.61411 3.68415 3.38953 2.83472 2.90545 3.44504 3.76746 5.92768 2.01479 168 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 121 2.06556 5.32418 2.30900 3.12160 3.24451 1.72774 4.28193 3.23174 2.91129 2.76039 4.40249 3.62853 4.45944 2.78313 3.56197 2.30043 3.44879 2.97544 5.84504 4.53131 169 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 122 3.27662 4.72281 3.86158 3.53699 3.82317 4.39796 4.70913 1.15801 4.12548 1.85898 3.83899 4.42505 4.76581 4.32677 2.84517 2.98836 3.50872 1.91766 5.33826 3.55616 170 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 123 2.35686 5.35274 2.90040 3.20541 4.58170 4.11729 4.37093 3.97255 2.88506 2.99975 3.28797 3.70425 0.86109 3.55648 3.65098 3.35871 3.52560 3.68069 5.90415 4.59907 171 - -
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 124 2.87232 4.77530 2.89381 3.36250 2.54625 1.49908 4.64521 2.81375 3.93538 2.17289 3.30580 4.28821 4.72166 4.17229 4.15079 2.90281 3.49887 3.03122 3.77396 2.36967 172 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 125 1.99617 4.74044 4.76157 4.17317 2.36644 3.44291 3.51408 2.49849 2.54450 1.50534 3.52086 4.36980 4.74710 4.26437 3.26823 3.18158 3.09896 2.48578 5.35249 4.16178 173 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 126 1.86344 4.83743 4.42007 3.84445 3.95353 4.30555 4.58462 3.07022 3.76746 2.75580 3.33266 3.54540 3.72831 4.03279 2.73799 2.59230 1.86352 1.78972 5.43731 2.89696 174 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 127 2.12691 5.31419 2.91570 3.12966 3.51348 3.19176 3.47930 3.92581 3.11824 1.89473 4.39323 1.72211 4.46245 3.18843 3.56784 3.05335 2.56281 3.26990 4.08828 4.52553 175 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 128 2.72825 5.47881 3.59854 3.03805 2.01162 4.04448 1.99648 4.15967 1.78641 3.28423 4.54494 3.56186 4.43398 2.80582 2.31892 3.24643 3.12440 3.15889 5.96635 4.62218 176 - E
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 129 2.44466 4.66029 5.22001 4.60641 2.21476 4.44819 2.30709 2.23462 4.39687 2.04739 3.77911 4.60230 3.97432 4.53286 4.41399 3.25622 2.36248 2.07491 3.57567 2.83476 177 - S
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 130 2.75736 3.99746 4.81513 3.46289 2.26903 3.08555 4.69595 2.84410 4.09161 1.81518 2.46502 2.90902 4.75606 3.57331 3.07470 2.58080 3.50463 2.13580 5.34211 3.45244 178 - S
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 131 2.52404 5.56797 2.84310 2.95940 4.85746 3.27991 4.19705 4.30564 2.70415 3.84964 3.63109 3.12698 1.41543 3.31549 3.44001 1.87445 3.43558 2.96808 6.03657 3.77985 179 - G
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 132 2.84492 5.55172 3.21407 2.96699 3.90453 3.09427 4.20032 4.27961 2.19079 3.83024 2.33078 3.25373 3.62341 3.05029 1.97358 2.71696 3.43513 3.12503 2.13801 4.65303 180 - G
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 133 3.21769 5.39065 3.63618 2.76348 2.69889 4.05486 3.68756 3.40192 2.44105 3.64532 4.46359 3.59291 4.44396 2.72966 1.69563 3.25974 2.04264 3.71852 3.54186 2.41914 181 - G
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 134 1.38848 3.80710 4.75501 4.17614 3.93674 4.36496 4.73360 3.25658 4.04967 2.29495 3.94309 4.37949 1.63349 4.28365 2.83366 3.66475 3.54196 2.01188 5.44343 4.25121 182 - S
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 135 2.71168 5.70945 2.00479 2.55836 5.05472 3.97095 4.15854 4.54091 2.16977 3.36346 4.75013 1.70103 3.44870 3.25489 2.94999 2.83164 2.14152 4.10021 6.14195 4.73074 183 - C
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 136 2.59041 4.52108 3.50541 2.94883 4.88267 1.85525 4.19041 3.51527 2.08873 2.55726 4.64066 2.96886 4.38962 3.11122 2.20756 2.25740 2.84825 3.95066 6.04989 4.67089 184 - C
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 137 2.47049 5.23397 3.76291 2.45714 4.42465 4.10336 4.32223 2.21765 2.61567 3.47058 3.60725 3.69325 3.25311 2.24525 3.62093 2.99233 3.11957 1.54060 5.77199 4.47953 185 - C
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 138 2.20898 4.68384 3.68796 4.45456 2.62777 3.11797 2.79903 2.31675 4.27838 1.65444 3.45820 4.52611 4.79200 3.74118 4.35139 3.72929 3.10050 2.13820 5.30254 2.47479 186 - S
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00525 5.64863 6.37098 0.61958 0.77255 0.48576 0.95510
+ 139 2.62355 4.66425 5.19052 4.57889 3.38125 4.44444 4.77514 2.09923 4.37569 2.12021 3.37698 4.58892 2.62399 3.57091 4.40305 2.39205 2.72992 1.83682 2.47621 3.33477 187 - C
+ 2.68618 4.42225 2.77519 2.73123 3.46354 2.40513 3.72494 3.29354 2.67741 2.69355 4.24690 2.90347 2.73739 3.18146 2.89801 2.37887 2.77519 2.98518 4.58477 3.61503
+ 0.00353 5.64692 * 0.61958 0.77255 0.00000 *
+//
diff --git a/demotic/examples/example.hmm2 b/demotic/examples/example.hmm2
new file mode 100644
index 0000000..603e933
--- /dev/null
+++ b/demotic/examples/example.hmm2
@@ -0,0 +1,1469 @@
+HMMER2.0 [2.3.2]
+NAME Orn_DAP_Arg_deC
+ACC PF00278.15
+DESC Pyridoxal-dependent decarboxylase, C-terminal sheet domain
+LENG 123
+ALPH Amino
+RF no
+CS yes
+MAP yes
+COM /groups/eddy/home/eddys/releases/hmmer-2.3.2/src/hmmbuild example.hmm2 example.sto
+COM /groups/eddy/home/eddys/releases/hmmer-2.3.2/src/hmmcalibrate example.hmm2
+NSEQ 105
+DATE Fri Apr 16 11:03:03 2010
+CKSUM 1905
+GA 20.1 20.1
+TC 20.4 20.1
+NC 19.8 20.0
+XT -8455 -4 -1000 -1000 -8455 -4 -8455 -4
+NULT -4 -8455
+NULE 595 -1558 85 338 -294 453 -1158 197 249 902 -1085 -142 -21 -313 45 531 201 384 -1998 -644
+EVD -75.919388 0.196776
+HMM A C D E F G H I K L M N P Q R S T V W Y
+ m->m m->i m->d i->m i->i d->m d->d b->m m->e
+ -14 * -6727
+ 1 -155 743 -6532 -5896 -780 -5734 -1012 875 -5491 -503 870 -1313 -5784 -5114 -5291 92 1979 1780 532 1378 1
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 -14 *
+ 2 -1682 -4022 -6543 -5907 20 -5745 -4617 398 -2271 2820 -3223 -5391 -5795 -5125 -5302 -2634 -242 7 -4482 624 2
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -14 -11881 -6717 -894 -1115 -701 -1378 * *
+ 3 722 -557 -6512 -1872 -3954 -2641 -1278 1497 -2668 1607 -1117 -5364 -5770 -5097 -2208 -4804 -2260 2317 -4458 -4116 3
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11867 -12909 -894 -1115 -1442 -662 * *
+ 4 781 1635 -6517 -5881 640 -373 -4592 -3492 -5476 -1388 329 -2095 -5771 -5100 -5277 525 2693 622 -4458 171 4
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11867 -12909 -894 -1115 -1442 -662 * *
+ 5 -3883 -5357 -2074 1459 -2040 -2288 1088 -5428 746 -5373 -4446 2000 -2200 728 1586 623 691 -2301 -5540 -4857 5
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11867 -12909 -894 -1115 -1442 -662 * *
+ 6 -1426 -5583 -8811 -8513 -6360 -8668 -8868 1788 -8509 -2816 -5025 -8340 -2071 -8517 -8721 -8067 -6096 3514 -8205 -7636 6
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11867 -12909 -894 -1115 -1442 -662 * *
+ 7 -1673 -5007 -1267 -19 -2017 -820 776 1913 -631 676 230 -245 -5065 -395 -728 -2172 447 1185 -5281 -167 7
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11867 -12909 -894 -1115 -1442 -662 * *
+ 8 1096 -549 1742 -395 -762 1395 276 -2186 -3133 -983 -1302 -432 -4970 -877 -1016 241 27 -4892 -5490 1023 8
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11867 -12909 -894 -1115 -1442 -662 * *
+ 9 -229 -5188 -1785 -1839 -5436 -4910 -1020 952 1650 -557 -4297 -3579 -5001 -345 410 -1235 729 2165 -5417 -4782 9
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11867 -12909 -894 -1115 -1442 -662 * *
+ 10 -600 -5344 -2136 -198 -2009 -4861 -1131 -59 2674 -3187 -1379 -1844 -2433 -1334 1969 239 -1367 -406 -5531 -1732 10
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11867 -12909 -894 -1115 -1442 -662 * *
+ 11 -860 -475 333 1492 -5677 -1611 1301 -109 348 -2890 -4445 -576 -2112 -556 1098 89 701 761 -5539 -688 11
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -338 -11867 -2261 -894 -1115 -1442 -662 * *
+ 12 -321 -4996 -1638 -395 -5297 -1286 -3213 9 455 326 119 1051 -1112 -217 1735 -12 -2054 944 101 -1285 12
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -106 -11530 -3825 -894 -1115 -211 -2880 * *
+ 13 -504 -729 478 15 -1016 1089 1111 -2218 -306 -2850 -340 541 1326 -759 526 349 76 -1022 -309 -1630 13
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -228 -11759 -2777 -894 -1115 -3468 -137 * *
+ 14 -242 -5039 1770 933 -1801 1563 -721 -2161 -459 -1886 -4129 -174 -95 -1111 -469 -264 -991 -464 -5223 482 14
+ - -105 -440 237 138 -405 323 160 -556 176 -377 -675 246 317 80 91 304 73 -368 -262 -208
+ S -2192 -987 -1855 -4846 -51 -4737 -55 * *
+ 15 115 -4610 1102 701 -4931 -112 1059 424 367 -1501 -3699 584 310 -854 706 -336 -53 -359 -4793 -4110 104
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ S -1 -11065 -12107 -894 -1115 -591 -1573 * *
+ 16 -705 -5156 1135 146 -660 -230 -53 -2341 1335 -1367 -177 74 386 497 1733 -1890 -685 -1384 -5339 -552 105
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11656 -12698 -894 -1115 -764 -1282 * *
+ 17 -211 -5273 397 -203 -2303 -1044 -875 -941 1435 -1074 663 -120 -1153 425 945 -1561 770 651 390 -353 106
+ - -150 -501 234 45 -382 399 105 -627 209 -464 -721 274 393 49 95 360 116 -370 -295 -250
+ E -3070 -4950 -237 -1101 -905 -3102 -179 * *
+ 18 -1922 -1734 -4254 -3627 682 -3479 -2310 488 -3229 2158 -788 -3116 -3507 -2828 -3024 738 -1860 335 -2118 2030 111
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -4 -9069 -10112 -894 -1115 -5057 -44 * *
+ 19 1009 -3015 1544 246 -3307 -248 -1256 -3038 264 226 1184 -1241 -2687 -806 269 641 -1549 -301 -3215 -2550 112
+ - -149 -502 235 52 -383 398 103 -628 210 -468 -713 276 394 43 99 358 115 -372 -297 -252
+ . -4402 -71 -10280 -12 -6930 -5520 -32 * *
+ 20 -159 -2362 815 -1710 -2418 -2992 -1745 1755 -1629 1789 -1536 268 -3087 761 -2008 -155 -1770 -1834 -2738 -2270 114
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -3 -9325 -10367 -894 -1115 -3944 -97 * *
+ 21 -407 -3479 723 1350 -3798 154 -1627 -3551 -1217 -3495 -2570 2119 -267 390 -1729 1140 580 -3100 -3662 -2975 115
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -3 -9672 -10714 -894 -1115 -4804 -53 * *
+ 22 -2045 -3517 1732 1828 -3837 -3019 -1677 -557 1605 -3532 -2606 -1654 565 509 553 -1926 -323 -723 -3700 -3018 116
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -2 -9799 -10842 -894 -1115 -5367 -35 * *
+ 23 544 1072 -289 424 -3885 87 862 -3636 701 -468 -2654 1199 486 248 1450 -1972 -346 -3186 -3748 -3065 117
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -2 -9861 -10903 -894 -1115 -5261 -38 * *
+ 24 -625 -3445 -2090 403 -3692 -78 545 -3392 -1450 1414 1485 935 -3259 174 -276 134 367 154 -3674 -3039 118
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -2 -9926 -10968 -894 -1115 -5278 -38 * *
+ 25 1936 946 -4718 -4086 784 -799 -2841 541 -3694 -2116 -1470 -3599 -4023 -227 -723 -3055 967 812 -2724 2044 119
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -2 -9986 -11028 -894 -1115 -10 -7116 * *
+ 26 -2354 -993 765 -741 2318 -2313 261 56 -1928 -5062 2192 -1975 -1470 -322 -278 -671 -878 -306 3093 1303 120
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 27 697 -4060 -6143 -1035 -1022 -5673 -1474 126 -61 619 748 -412 -5727 -1681 -1275 -2400 246 1886 -378 1797 121
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 28 312 -4013 -6531 -5895 -104 233 -4605 666 -1543 -2001 -1105 -1805 -5784 -5113 -5290 -1365 -4127 1204 589 3721 122
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1315 -11881 -742 -894 -1115 -701 -1378 * *
+ 29 -2952 -2780 -933 -4648 2176 -4498 179 1283 -4246 -769 -56 -149 -4548 -566 -4051 -3582 29 1007 1991 2686 123
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -10567 -11609 -894 -1115 -13 -6832 * *
+ 30 -1799 2170 -6532 -5896 -1699 -2732 -4605 1539 -5491 1685 378 -5380 -5784 -1976 -5291 -1754 949 1754 -355 -4128 124
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 31 -5769 -946 3181 -2344 -7805 -1675 -84 -7682 -5228 -7569 -6819 3045 -6358 -4779 -1632 -1659 -730 -7166 -7755 -6824 125
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ S -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 32 1413 221 2283 -680 1069 1075 -4568 302 -5350 -416 -3238 -5290 -5758 -5008 -5217 -1289 -243 -1641 -4491 -4144 126
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 33 -619 -807 -8268 -8621 -8231 3261 -7564 -8059 -8252 -8320 -7339 -1904 -6589 -7668 -7841 1895 -5360 -6713 -8451 -8447 127
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 34 -725 -4015 -6533 -5897 802 -5736 -4607 1501 -746 319 3032 -5382 -5786 -5115 -716 -1693 -63 1977 -4473 -4131 128
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 35 -1024 -5354 -1109 -335 2403 -4874 1499 -5413 -3117 -2899 -4445 1820 -1892 -856 -1712 6 -679 -4972 -335 2983 129
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 36 284 739 1001 -866 -5658 1983 1959 -1651 -1916 -2898 -68 -570 -4969 1365 -3626 -408 579 -1135 -5537 -4860 130
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ S -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 37 -1145 316 -6511 -5877 -164 290 2549 -1140 -5476 909 -1105 1020 -5781 -1796 -5283 1948 -374 -1254 -4472 -579 131
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1456 -11881 -655 -894 -1115 -701 -1378 * *
+ 38 -1236 -2788 -5320 -4686 1054 -4531 -3404 1409 -4285 1992 3208 -445 -4568 -3899 -4083 -3619 -625 -802 -3250 -2917 132
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -2 -10426 -11469 -894 -1115 -39 -5234 * *
+ 39 -167 -3996 -6515 -5879 2326 -1666 -4588 1325 -5474 298 1651 -5363 2297 -5097 -1014 -1276 -1316 -934 -4454 -1470 133
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11864 -12906 -894 -1115 -1589 -583 * *
+ 40 296 -681 2289 -430 -5583 -1095 -3534 -2534 -3126 -1724 -1027 1303 -4965 -3084 2286 221 -2198 -4897 -5491 -76 134
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ C -15 -11864 -6668 -894 -1115 -336 -2266 * *
+ 41 -238 2953 -1955 71 -2041 -766 -77 -4122 -3883 -1250 -145 -1861 2289 -3779 -1963 862 385 -511 1342 -14 135
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ H -1 -11867 -12909 -894 -1115 -1455 -654 * *
+ 42 1213 407 -6517 -5881 71 -636 -4591 1299 -225 -262 -928 -5366 -5770 -712 -5276 -116 407 625 3572 -1617 136
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ H -15 -11867 -6594 -894 -1115 -373 -2132 * *
+ 43 459 -4501 -1172 287 -798 173 -3973 1060 -2022 1548 2146 -794 -5316 -672 -1974 -1338 -1391 -2282 -234 348 137
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ H -1 -11866 -12908 -894 -1115 -1488 -636 * *
+ 44 -1781 -4053 -182 -5470 2057 -2605 -1129 1130 -2190 -633 1294 -2241 -2185 -432 -1951 -1117 -2035 -441 366 3258 138
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ H -1 -11866 -12908 -894 -1115 -364 -2165 * *
+ 45 -1717 -5369 2610 1144 -1938 1098 507 -5441 -1261 -2908 -934 841 550 523 -443 -3776 -1912 -4991 -5553 -4870 139
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ S -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 46 1568 -951 -1248 -809 -1026 -727 2740 -1428 -657 -2188 -286 -838 -2109 1930 -575 -149 -3841 -1517 -249 1165 140
+ - -151 -492 231 38 -381 394 101 -613 218 -462 -715 271 392 41 103 354 120 -360 -299 -254
+ - -144 -3402 -12923 -1732 -517 -701 -1378 * *
+ 47 -801 -663 -1822 -555 -1150 -2359 846 308 -123 347 -4326 595 -5008 1356 375 -244 31 397 1833 1328 145
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 48 -940 -743 -2036 -822 2037 -2398 3343 -5328 -1242 -1597 -1338 -445 781 10 183 -1162 -910 -409 675 1291 146
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 49 -131 -5368 -509 -89 -2049 -945 1325 -5439 -1165 -1977 -1562 -3506 3047 -360 534 -459 -897 -4990 -5552 1125 147
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 50 -683 1237 -2448 -2599 158 -2705 -226 2391 -2531 -371 -210 -5285 612 -1131 -429 -4780 -391 1831 -4490 -4143 148
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 51 442 -4119 -5779 13 -674 -1882 -1050 636 -1454 946 1778 -4991 834 -2068 1036 -1694 -881 566 -4561 638 149
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 52 -326 1175 -2300 -1367 -404 -771 -27 569 -308 351 -1257 -302 2078 -207 -122 -1517 -908 855 -5260 -1685 150
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -25 -11881 -5894 -894 -1115 -701 -1378 * *
+ 53 -230 695 -2143 -1084 -871 -1271 -1194 1251 -5454 1111 -172 -1953 -449 -5080 -5260 -2063 395 2007 -4449 296 151
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ C -27 -11856 -5791 -894 -1115 -1836 -474 * *
+ 54 -560 -5319 365 333 -2017 -91 1721 -217 -739 -148 -4409 270 853 45 842 601 -183 -1026 -208 -4821 152
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ S -407 -11830 -2025 -894 -1115 -2491 -283 * *
+ 55 131 -4934 333 -357 -6 -747 -3101 -1084 1074 -4949 83 192 7 256 2425 -3349 -1748 -409 -5119 187 153
+ - -127 -510 242 66 -370 395 120 -657 197 -481 -709 311 375 21 105 349 104 -374 -244 -237
+ S -1245 -791 -12466 -2841 -217 -912 -1094 * *
+ 56 -1076 -673 326 -357 -183 -426 1033 -1567 786 967 804 -312 621 -724 854 -960 -1187 -266 -5335 -1358 200
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11683 -12725 -894 -1115 -341 -2249 * *
+ 57 513 -781 1412 751 -5656 -532 450 -5407 -218 -752 -178 426 530 766 802 -504 -338 -741 -5519 -4836 201
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ T -1 -11845 -12887 -894 -1115 -217 -2843 * *
+ 58 493 -5369 1490 1410 -5691 636 -254 -1731 -57 -5385 -4458 623 -2057 386 201 549 -204 -4991 -5553 -592 202
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ T -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 59 215 330 537 1571 -1811 1046 -3531 -2681 -172 -1703 -214 -1884 -314 208 -101 347 343 -824 -5546 -1398 203
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ S -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 60 -422 -954 -121 754 -5690 -239 -77 -5441 670 -722 -4458 443 2516 -25 218 -375 -2149 -2318 -5553 -618 204
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ S -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 61 667 285 484 267 -2069 -620 920 -2436 -20 597 -316 -1867 -895 -851 657 -773 1458 -1164 -5539 -1553 205
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 62 314 304 -831 1098 1221 -1825 1259 -1014 -409 -970 -1097 -1780 -5020 230 1332 -1378 -1013 309 -717 1386 206
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 63 -797 -5364 -1341 750 -1887 -2331 -932 -1058 1082 -981 -4453 -1866 1937 -1558 961 454 613 227 -144 -4867 207
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 64 1130 2050 -6530 -5894 538 -98 -4605 -1876 -5489 -3861 -1130 -5379 -5784 -1032 -5290 1013 243 1427 537 2443 208
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 65 -4104 223 1355 -4598 -1203 -5450 -176 508 -351 -1083 -1217 -601 -5517 -1792 -378 1205 1931 1045 -4688 -1296 209
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 66 -7091 -6500 -9564 -9041 366 -9384 -8247 2131 -8885 1864 -1038 -9087 -8520 -7787 -8466 -8766 -6971 2348 -6814 -1672 210
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 67 1613 1081 -6521 -5885 340 -298 -4603 -3506 -5483 -1309 -3217 -5375 -5782 -467 -1983 -323 -275 1594 3554 1377 211
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 68 -9285 -8565 1438 -8544 -10076 3643 -8773 -10978 -9549 -10412 -10266 -8744 -8844 -9135 -9400 -9466 -9515 -10476 -8857 -9945 212
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 69 -2361 -730 -3780 -2141 -5595 -1786 -115 -16 -336 -365 -4401 329 3343 266 539 -1141 -2291 -2457 -5506 -4841 213
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 70 -1655 1194 -6543 -5910 -3988 -5739 233 685 -5506 571 -3236 -1805 -5796 -5130 -5308 1157 2937 -361 -4492 -4150 214
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 71 -5347 5748 -8186 -7892 -5766 -6727 -6957 -1820 -7577 -2760 -973 -2039 -7130 -7190 -7395 -2515 -5522 -2119 -6784 -6480 215
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 72 -4170 -522 3161 1734 -862 -5649 -4489 -2008 -5077 191 -771 -1039 -5705 -4796 -5065 -4709 635 -3514 -4541 -1231 216
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 73 1150 -5383 -3776 -341 -5724 754 -3571 -5473 -3154 -5421 -4496 -249 454 -1338 -505 2630 -1496 -1561 -5590 -4910 217
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ T -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 74 -154 -684 1640 -4129 -4490 1632 67 -502 -1110 774 685 -5 -5368 -3872 -1888 -139 226 -335 -4848 -4407 218
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ T -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 75 -9166 -8596 4011 -8037 -10030 1070 -8530 -10877 -9251 -10333 -10165 -8309 -8749 -8751 -9287 -9233 -9364 -10390 -8854 -9811 219
+ - -149 -500 233 43 -381 398 105 -627 210 -464 -721 275 393 45 96 359 117 -370 -295 -243
+ - -36 -5360 -12923 -70 -4402 -701 -1378 * *
+ 76 -1206 2156 -6527 -2648 857 -5733 -4604 1334 1009 -419 -801 -5377 -5783 -493 -898 -4818 2 2226 -189 -485 221
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 77 -2414 -4146 -6676 -6041 1881 -5885 -4756 2300 -5639 1676 614 -5531 -5923 -5252 -5437 -4972 -861 1229 -191 -1485 222
+ - -151 -502 231 48 -382 399 117 -628 209 -468 -710 274 392 47 94 359 118 -371 -296 -237
+ S -150 -4118 -4593 -1137 -875 -701 -1378 * *
+ 78 1676 146 160 -553 -5570 1390 0 -1553 -124 -938 -1153 252 -1020 -3032 -637 -722 -457 -369 -5464 604 226
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -197 -11820 -2970 -894 -1115 -1657 -550 * *
+ 79 -2162 -5141 158 1079 -5462 -818 1251 -1393 1663 -2901 -4230 56 -1987 754 2238 -817 -1243 -1398 -5324 -1425 227
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -2423 -11639 -298 -894 -1115 -2508 -279 * *
+ 80 -4102 -3772 -5476 -5223 3620 -105 -2492 -3441 857 -3412 -3055 -4306 -5199 -4195 -4447 -4349 -4042 -345 -1881 2833 228
+ - -157 -498 248 43 -392 405 100 -590 201 -471 -722 274 389 48 92 360 113 -361 -306 -261
+ . -4563 -63 -10441 -2180 -360 -25 -5869 * *
+ 81 -2459 -5357 2559 1490 -5678 -750 -1031 -2226 1 -1583 -1395 617 -55 113 -143 -282 96 -4979 -5540 -4858 237
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11868 -12910 -894 -1115 -1413 -679 * *
+ 82 -673 324 -5783 -47 503 -1350 -1196 807 -1464 -1079 -1232 -4988 -5652 506 1496 -145 -791 1423 -4547 1902 238
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11868 -12910 -894 -1115 -1413 -679 * *
+ 83 432 -5274 -2217 442 -297 -4882 388 -5282 211 50 272 -3533 1027 175 -245 591 553 -199 1900 648 239
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11868 -12910 -894 -1115 -386 -2090 * *
+ 84 -1601 -4045 -6565 -2579 1422 -5768 -966 -454 -5524 2757 1842 -5414 -5815 -5144 -5323 -4853 -4160 -314 -621 -1544 240
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 85 -1274 -5373 751 -615 -2076 -1635 -3533 -5444 -696 -5389 -285 -1044 3667 -3073 -1272 -633 -1489 -4995 -5557 -4874 241
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -823 -11881 -1202 -894 -1115 -701 -1378 * *
+ 86 -504 -4596 -1323 785 -941 -358 1009 -686 1088 842 -3686 -967 -445 -299 335 -137 -258 244 -4781 -971 242
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -1837 -11058 -475 -894 -1115 -5707 -28 * *
+ 87 -2493 -3105 -3828 -4056 -4777 -21 4919 -4828 -4196 -5063 -4275 -3527 1360 -4031 -4242 -2712 -2903 -12 -5069 -4613 243
+ - -150 -504 233 45 -385 395 102 -618 208 -463 -724 274 405 45 95 358 118 -370 -298 -253
+ . -4390 -72 -10267 -808 -1222 -5464 -33 * *
+ 88 -1864 -1755 875 -3219 441 1046 -2214 -1257 -2892 1132 -955 -2882 5 -2585 187 -2433 -1804 1302 1989 864 250
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -3 -9320 -10362 -894 -1115 -24 -5911 * *
+ 89 -566 -5357 981 1693 -5678 -1302 -3517 -1593 541 -1101 -256 -149 1244 -156 816 -128 273 -1801 -5540 -4858 251
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11868 -12910 -894 -1115 -391 -2074 * *
+ 90 -1387 -498 -1503 -1097 -1906 -1961 433 763 -1031 2064 276 -5263 632 -1927 -5194 -4771 91 1208 -4495 -4147 252
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 91 211 -5369 205 1426 -5691 -128 507 -2545 1005 -2967 -4458 1077 -1238 1567 823 -553 -357 -4991 -5553 -650 253
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 92 56 -5354 -857 1287 -5668 -1632 -3534 1041 -1831 -874 -4445 425 1018 -311 231 -1106 -1433 1651 -5541 -1373 254
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -13 -11881 -6863 -894 -1115 -701 -1378 * *
+ 93 -2742 -7199 284 -974 -7442 3437 -4893 -2264 -2243 -7186 -6383 196 -51 -1912 -5547 -5227 -2485 -6792 -7367 -6500 255
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11868 -12911 -894 -1115 -395 -2062 * *
+ 94 -2834 -8548 3826 50 -8627 -6094 -5570 -8650 -6050 -8465 -7942 -2107 -6700 -2184 -7125 -2045 -6521 -8073 -8674 2022 256
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 95 -4181 255 -6387 -2796 739 -2675 -1035 112 17 1163 -1098 -2030 -2211 -2287 932 -2616 -4121 -643 3916 2319 257
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 96 -2928 -6191 -9320 -8877 -1204 -9162 -8403 2053 -8771 2179 441 -8848 -8491 -7950 -8528 -8549 -6679 2087 -7087 -7147 258
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 97 1595 -663 -6532 -1613 -982 982 -4605 243 -5490 168 -118 -5380 -5784 -2098 -5290 -1956 -2129 2089 -280 779 259
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 98 -1646 -4021 -6541 -5906 3201 -2723 -4615 2230 -5501 -1890 951 -5390 -5793 -5124 -5301 -4829 -2160 1356 686 289 260
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 99 -1778 -838 -41 1142 2032 -1180 1045 -1608 -729 656 1179 -1800 1315 -566 -138 -1482 -1362 -4963 -5536 -768 261
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ S -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 100 -1260 -567 2398 -1280 -5665 -1153 -96 -5410 -3118 420 -1238 2269 -4968 534 -1926 395 -918 -2659 -5540 -197 262
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 101 1766 1859 -6526 -5890 -1741 -1963 -4604 -1184 -5486 -1947 3141 -2216 -5783 -1261 -2085 -425 1232 1198 -251 -4129 263
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 102 -710 -5603 -8373 -8603 -6927 3726 -7619 -1210 -8247 -3404 -1603 -6842 -6808 -7667 -7877 -5416 -5540 -5603 -7958 -7907 264
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 103 3545 -5494 -8121 -8474 -8213 -1254 1050 -2856 -8199 -8311 -7335 -6596 -6590 -7628 -7816 -1235 -5365 -6715 -8436 -8409 265
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 104 -8529 -7443 -2394 -9209 -1503 -8768 -1161 -7422 -8804 -6723 -6821 -7377 -8628 -7523 -8170 -8025 -8379 -7578 -4205 4909 266
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 105 -237 1755 -1797 -1506 -1853 1522 841 -2485 -3258 -5088 -1084 -967 -5041 1619 -3742 -118 2485 -2569 -5368 -1533 267
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ S -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 106 -186 48 -2272 1030 741 -2401 380 889 -499 -459 1879 -1857 -5290 -965 -2036 748 -210 -363 949 1132 268
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ G -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 107 873 1125 -1270 -1033 -4008 -5687 259 266 -5266 -2450 116 -5233 -713 -4943 -5169 2063 579 1643 -4501 -4152 269
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ C -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 108 852 -569 -5819 -2482 -1817 -2695 -1024 -588 416 1376 3173 -1773 -5669 -1601 -1985 -219 -1366 -1375 -4555 1390 270
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ C -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 109 1972 -5371 -1903 -3196 -5692 1273 59 -5442 -875 -5387 -4460 327 -2154 -1344 -1896 1962 140 -4993 -5554 -1547 271
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 110 -1109 150 298 -3749 -1973 -1344 592 -4394 -3633 -2784 831 1232 -531 -3554 -1896 2207 1971 -2218 -5046 -1504 272
+ - -151 -502 234 41 -383 399 119 -625 212 -466 -723 275 391 43 96 359 117 -364 -297 -252
+ B -247 -2672 -12923 -12 -6972 -701 -1378 * *
+ 111 -342 25 -220 -135 -632 -480 29 -2448 -127 -1254 975 2077 -758 233 197 -105 955 -812 1150 -4866 274
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 112 -8511 -7429 -8892 -9248 3788 -8773 2968 -2181 -8803 -3072 -6779 -7383 -8626 -7522 -8164 -8021 -2259 -7543 -4203 2799 275
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ T -16 -11881 -6512 -894 -1115 -701 -1378 * *
+ 113 -2330 -577 -6759 -6317 -5141 -1571 -1237 -2035 -5825 20 -4364 4131 -6140 -5663 -1967 -2471 -4691 -4512 -5594 -5263 276
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ T -16 -11865 -6501 -894 -1115 -352 -2206 * *
+ 114 -794 -892 -1990 -3274 -2029 2661 -757 -5150 -1693 970 -204 -763 -4996 -906 -1307 910 -616 -4780 -5422 -4784 277
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ T -19 -11865 -6309 -894 -1115 -1527 -615 * *
+ 115 -4155 -3982 -6495 -5859 3395 -5702 1472 74 -2434 113 -1069 -5346 -5752 -619 1708 -4786 -2095 149 -4440 -39 278
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11847 -12889 -894 -1115 -2111 -380 * *
+ 116 -1147 -895 -738 156 -2111 1589 -1295 -5408 499 -2125 -300 -415 2480 290 -348 -1187 -529 -4959 -86 -667 279
+ - -150 -501 232 42 -377 399 105 -627 210 -465 -711 275 393 44 95 360 119 -370 -295 -250
+ - -113 -5088 -4439 -995 -1005 -226 -2788 * *
+ 117 -446 -5305 580 -447 -5625 -775 1449 -2469 -386 669 201 -115 844 116 1966 -1478 -483 -1060 -5489 -1547 282
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ . -1 -11814 -12857 -894 -1115 -976 -1024 * *
+ 118 380 887 -2296 -1621 -1625 -5637 -4487 -1206 -5158 -913 -3229 -5150 3194 -4852 -324 -321 1356 -615 -4480 -4128 283
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11846 -12888 -894 -1115 -875 -1137 * *
+ 119 1317 -5353 80 -51 -5674 235 -155 -5425 564 -2381 -4442 1076 1282 -847 -34 469 -31 -1174 -5537 -1538 284
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11864 -12906 -894 -1115 -339 -2256 * *
+ 120 -5 -5016 -805 1834 -1147 -2532 895 1302 -1202 -1357 -296 -3705 -5079 -817 -1190 -41 423 1338 -5291 -1561 285
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 121 -522 -829 -6521 -2652 20 -1557 -1291 736 -2288 -819 -1156 -5375 -5782 -1960 -398 -4817 -1282 2966 -4471 1558 286
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 122 41 1046 -2331 -1647 456 -728 994 912 -5468 845 -17 -1068 -5780 -5097 -234 -1239 -2217 1112 1281 2048 287
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ E -1 -11881 -12923 -894 -1115 -701 -1378 * *
+ 123 -1669 340 -6532 -5896 1095 -5734 -1166 1778 -2668 350 375 -5380 -5784 -5114 -1450 -1931 -1467 2315 486 1573 288
+ - * * * * * * * * * * * * * * * * * * * *
+ E * * * * * * * * 0
+//
+HMMER2.0 [2.3.2]
+NAME NIF3
+ACC PF01784.11
+DESC NIF3 (NGG1p interacting factor 3)
+LENG 350
+ALPH Amino
+RF no
+CS no
+MAP yes
+COM /groups/eddy/home/eddys/releases/hmmer-2.3.2/src/hmmbuild example.hmm2 example.sto
+COM /groups/eddy/home/eddys/releases/hmmer-2.3.2/src/hmmcalibrate example.hmm2
+NSEQ 122
+DATE Fri Apr 16 11:03:03 2010
+CKSUM 8888
+GA 23.4 23.4
+TC 24.1 24.0
+NC 22.0 23.3
+XT -8455 -4 -1000 -1000 -8455 -4 -8455 -4
+NULT -4 -8455
+NULE 595 -1558 85 338 -294 453 -1158 197 249 902 -1085 -142 -21 -313 45 531 201 384 -1998 -644
+EVD -180.735001 0.124881
+HMM A C D E F G H I K L M N P Q R S T V W Y
+ m->m m->i m->d i->m i->i d->m d->d b->m m->e
+ -12 * -6953
+ 1 -1169 -5587 2255 2289 -2333 -1931 -3746 -5659 380 -1940 -4676 -119 -5181 915 6 -1098 -418 -1459 -5770 -5087 1
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 -12 *
+ 2 -2251 -6145 -9105 -8594 349 -8711 -7768 2712 -8376 1740 -1230 -8380 -8291 -7700 -8142 -7963 -6537 1780 -6895 -1988 2
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 3 -436 490 -2634 -28 -1126 -2818 -4772 1894 -501 213 1375 -1964 -5967 -5188 -1707 -1138 56 1620 -4717 1194 3
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 4 -94 -651 695 1414 -2152 -598 -403 -5658 614 -1275 -4676 1188 -5181 875 762 705 -427 -1419 -5770 -1650 4
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 5 450 -4293 -2738 -1344 1690 -5878 215 1306 -250 -113 -454 -2370 -5933 -5063 379 -1161 -732 697 1971 1775 5
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 6 -1906 431 -6787 -6151 640 -5990 -4861 1710 -5746 2391 1857 -5636 -6037 -5367 -5546 -5075 -1724 109 -599 -395 6
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 7 -2642 -5590 1586 2611 -5911 -1420 -1344 -1596 -3330 -1038 -4679 1980 -5183 -904 102 -1818 -52 -5212 -5773 -5090 7
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 8 583 -5587 38 1753 -5908 -753 -3746 -2414 1539 -2515 -1338 -146 -5181 816 642 732 -730 -2896 -5770 -1722 8
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 9 -2038 -617 -673 -1612 1513 -5869 -440 1784 259 1299 651 -748 -5924 -2038 -1485 -2825 -1191 -135 1355 1008 9
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 10 2292 892 -6753 -6117 1518 -2694 -4826 -966 -5711 828 -3436 -5601 -6005 -5334 -5511 -410 -2535 -915 321 2249 10
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 11 -2349 -5587 0 -368 -2346 -1675 -1245 -2450 -1413 -2358 -4676 522 3647 -251 -2179 -315 -4053 -5208 -5770 -5087 11
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 12 -1996 -127 -6219 96 1328 -5867 -4709 695 812 953 -3500 -5335 1936 -405 -469 -1531 -683 396 -767 -4393 12
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 13 720 -1006 912 939 -2280 -1076 1720 -2735 740 -5603 -4676 840 -1410 331 402 1138 -1629 -5209 282 -2022 13
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -28 -12109 -5729 -894 -1115 -701 -1378 * *
+ 14 -772 -5389 -898 -2060 -417 -1431 -3783 -1784 265 2082 -4499 47 -5206 403 -305 -150 -503 -1773 1436 1083 14
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12082 -13124 -894 -1115 -2065 -394 * *
+ 15 2903 127 -6518 -5895 1119 -5897 -4758 -985 -1231 -2145 -1297 -1999 -1164 1389 -5404 -1484 -4313 -3646 -4685 1021 15
+ - -145 -501 232 45 -381 398 111 -627 210 -467 -721 275 395 44 95 358 116 -367 -295 -250
+ - -103 -5232 -4564 -995 -1005 -913 -1092 * *
+ 16 -111 75 646 2620 -5766 -5029 -1135 -2600 -92 -1051 1440 -3673 -413 379 -522 -689 -3986 -873 320 -374 18
+ - -150 -501 231 47 -382 398 104 -628 217 -468 -722 274 392 47 97 358 118 -371 -296 -244
+ - -167 -3324 -6742 -16 -6482 -373 -2133 * *
+ 17 -1057 -5579 2411 1610 -5900 147 -3735 -5651 51 -3121 -4668 -1165 -223 -1073 -3826 1462 -246 -5201 -5762 -5078 20
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12082 -13124 -894 -1115 -2055 -397 * *
+ 18 -1362 -4364 -1437 -5153 1248 226 -1142 -3891 -1076 -1993 -3558 -2175 -2457 -4704 -2508 -4781 -4271 -668 5293 2095 21
+ - -149 -500 233 43 -381 398 105 -626 210 -466 -721 275 394 45 99 359 119 -370 -295 -250
+ - -26 -5828 -13124 -83 -4162 -235 -2732 * *
+ 19 -925 1179 3914 -5962 -8518 -1479 -6770 -8385 -7260 -8523 -7664 -1258 -6835 -2109 -7688 -339 -5847 -2999 -8683 -8224 23
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 20 -1505 -5585 -3962 -949 -5906 -5088 910 -2608 112 -1842 -4675 3382 1765 -1025 -545 -682 -872 -5207 -5769 -808 24
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -15 -12109 -6657 -894 -1115 -701 -1378 * *
+ 21 -483 1767 -2564 -6033 -1699 -2838 -4798 289 -5644 -1902 -3430 2111 -637 -5280 -1499 612 -275 2382 -4684 -1438 25
+ - -155 -506 233 45 -347 392 100 -614 214 -467 -714 273 393 43 93 357 111 -365 -283 -249
+ - -74 -4683 -6536 -3148 -173 -342 -2244 * *
+ 22 -7717 -7960 -7442 -7630 -9670 3822 -7694 -9875 -1480 -9577 -9045 -7634 -8320 -2328 -7103 -7826 -7971 -9161 -8741 -9179 55
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -15 -12094 -6677 -894 -1115 -1617 -569 * *
+ 23 -2402 -4268 -6789 -6154 619 -5994 -1183 -53 -5750 2880 -1205 -5639 -2502 -5366 -5547 -5079 -4384 95 1717 -187 56
+ - -152 -503 233 45 -374 399 116 -625 211 -465 -724 275 393 46 93 360 114 -366 -298 -253
+ - -128 -3904 -5770 -1575 -590 -840 -1179 * *
+ 24 -4356 -4227 -6431 -1652 -1884 -5873 -4729 117 -1449 1395 861 -1453 -5926 3485 -5361 -553 -1390 -779 -4680 -1630 60
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12069 -13111 -894 -1115 -1219 -810 * *
+ 25 -592 877 -2523 -6088 -1959 -5929 -1011 1603 -1089 515 -903 -1219 -5979 -2218 -5485 -5013 -4322 2913 -4666 -1585 61
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -287 -12083 -2475 -894 -1115 -2022 -408 * *
+ 26 -1123 -643 -300 1246 -901 3047 -3452 -5358 -1012 -1936 -4378 -1611 -2061 -129 -3540 -2147 -1064 -4910 -5473 -4791 62
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2796 -11797 -225 -894 -1115 -3600 -124 * *
+ 27 1498 1588 260 -1937 758 -2940 -1707 -1486 -1772 -108 -1095 367 1798 -1632 -2051 -143 -1584 -1358 -2319 1078 63
+ - -150 -503 229 54 -384 397 109 -622 217 -465 -724 274 392 42 92 361 116 -373 -298 -253
+ - -931 -1075 -10163 -1826 -478 -3439 -140 * *
+ 28 -2311 -2585 1204 -531 1541 -3545 -2364 -2157 -2463 -19 -1776 -2599 2819 -2293 -2752 244 -2258 447 -2998 -2576 72
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -219 -9790 -2842 -894 -1115 -763 -1283 * *
+ 29 -538 -345 2652 -1040 -758 -670 140 -1747 -2768 -1734 -4006 1302 -1798 -2725 -1595 1603 -1811 -4510 -5113 142 73
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11473 -12515 -894 -1115 -3133 -175 * *
+ 30 -947 -4376 -959 -1928 1276 572 -837 -2029 -944 431 -822 -3664 2308 -3251 1092 -327 16 -1200 -4722 -1347 74
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11549 -12591 -894 -1115 -247 -2669 * *
+ 31 40 -939 807 1901 -5840 -333 -335 -2615 -89 -1686 -4608 1338 -267 107 -533 689 -659 -5141 -5702 -236 75
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12039 -13081 -894 -1115 -3029 -189 * *
+ 32 606 -5519 856 -320 -5840 1133 900 -5591 1259 -1808 -1504 815 -2379 936 201 336 -284 -5141 -5702 -5020 76
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2087 -12039 -388 -894 -1115 -3029 -189 * *
+ 33 -778 764 -300 468 -3963 -39 -1801 -3713 1919 -3658 -2731 835 -3235 189 1633 -657 1198 -3264 -3825 -3142 77
+ - -155 -506 240 42 -376 395 106 -628 209 -460 -726 284 393 43 96 353 117 -363 -300 -242
+ - -244 -2686 -10996 -3264 -159 -3711 -115 * *
+ 34 -131 -3897 984 535 -577 -1076 1861 -965 1033 -3913 1312 -2033 -839 711 1448 -208 40 -3519 -4080 -3397 102
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10259 -11301 -894 -1115 -9 -7324 * *
+ 35 -609 -5587 744 2458 -2106 -2079 -1024 -2745 29 -1714 -4676 709 153 1024 -910 -141 -244 -1825 -5770 -2046 103
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 36 -629 -1047 -2491 -6110 -190 -5953 -1386 2354 -1263 -1225 -3437 -5597 -2576 -2261 -5508 -2809 -4347 2896 -4692 -1809 104
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 37 -990 -5587 -987 844 -2249 -1974 1502 -2464 1732 -2401 -4676 1149 -5180 623 890 501 1218 -2848 -5770 -5087 105
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 38 -1914 -1041 -2287 -2241 -5908 574 -524 -1760 2421 -5603 -4676 389 -5181 -1769 2305 155 486 -5209 -5770 -5087 106
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 39 -680 -5840 -9048 -8729 -6443 -8904 -8921 3001 -8702 -62 -1522 -8559 -2348 -8627 -8863 -8286 -6347 2557 -8224 -7742 107
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 40 1226 -1073 -6752 -6116 79 -318 -1357 -364 -2621 2139 1720 -5600 -6004 -1176 -5511 -5039 -2334 584 -4691 -37 108
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 41 -1525 28 -6788 -6153 1124 -5992 -4867 845 -5750 1468 -3467 -5639 -6041 -5374 -5551 -2101 1427 2260 -4731 -1455 109
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 42 2319 3368 -8274 -8327 -2171 511 -7163 -6782 -7927 -2466 -6344 -6699 -6732 -7419 -7589 87 2034 -2843 -7543 -7332 110
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 43 -2517 -4247 -6768 -6132 -1713 -2598 -4842 -183 -5727 2432 1044 281 -6020 -5350 -5527 -5055 -2152 2048 -176 -4365 111
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 44 -6066 -7643 3774 -204 -2008 -6159 -5463 -2365 -5650 -7661 -162 -1091 -6653 -5136 -6430 -570 800 -7240 -7930 -7047 112
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 45 1747 910 -6767 -6131 -1892 -5970 -4842 521 -5727 1288 -159 -5616 1730 -5349 -5527 -5055 -1668 1233 -4706 -244 113
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 46 -2665 1861 94 -1453 -5103 -2034 -4017 -1732 -3767 -1224 -4147 -122 -5401 -3695 -130 933 3140 -1928 -5324 -1738 114
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -13 -12109 -6794 -894 -1115 -701 -1378 * *
+ 47 -256 -5567 -28 1840 -1312 -2685 -1192 -1662 -1005 647 634 -691 1584 461 -296 -100 -2336 -1804 -5752 -700 115
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12096 -13139 -894 -1115 -359 -2183 * *
+ 48 1580 -5587 1563 2049 -1141 -2872 -323 -5659 -244 -5603 -4676 -2014 -284 862 -785 -342 -1154 -2923 -5770 -1798 116
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 49 -339 -920 -6757 -1187 -1187 -5962 -4834 200 -5717 253 -3443 -329 -6012 -5341 -5518 -160 1058 2871 -4700 -4358 117
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 50 405 -978 -2562 -6302 68 -6148 -5035 2248 -5905 1410 872 -5794 -6189 -5533 -5712 -2877 -4513 1967 -4893 -4550 118
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 51 -47 -5587 1930 2264 -5908 -2796 -3746 -5659 175 -1395 -4676 618 -2429 551 450 -1077 -714 -1903 -5770 -1856 119
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 52 -37 -5587 -44 2754 -21 -5088 -3746 -5658 798 -1323 -1437 -445 -5181 891 884 -1111 -4053 -5208 -5770 -1650 120
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 53 3483 608 -6846 -6214 -1779 -2936 -4932 -2227 -2630 -1373 -443 -5699 -6096 -5433 -5613 -5135 -4436 -1621 -4791 -4451 121
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -12 -12109 -6918 -894 -1115 -701 -1378 * *
+ 54 -200 32 -1455 -373 -4788 -2748 -4179 2655 468 136 -1189 -4370 -1622 -1766 -293 -1261 -1580 1165 -5117 -1486 122
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12098 -13140 -894 -1115 -1454 -655 * *
+ 55 1116 -934 1094 2036 -1861 -1912 273 -5647 436 -3069 -4665 -353 -336 765 180 305 -4041 -5198 -5759 -1862 123
+ - -150 -501 233 50 -382 401 104 -628 211 -465 -722 274 394 44 94 359 116 -371 -296 -251
+ - -181 -5167 -3475 -1755 -507 -1454 -655 * *
+ 56 51 -33 -4012 408 -2159 -1230 1479 -1098 1280 893 567 1199 -5134 425 333 -827 -1574 -1792 1012 -1778 130
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11962 -13004 -894 -1115 -2817 -221 * *
+ 57 -2566 -5497 -179 -2085 -5818 2327 990 -5569 1457 -5513 -4587 2231 -2321 625 -402 -909 -3961 -5119 -5679 -4995 131
+ - -149 -500 232 42 -381 398 105 -627 212 -462 -721 275 393 45 95 362 117 -370 -295 -250
+ - -72 -4373 -13017 -34 -5410 -205 -2915 * *
+ 58 2455 2546 -1771 -2723 -2094 -1914 -1442 -56 -5607 -2166 -3437 -201 -5975 -5253 -5450 -997 -951 1589 -4690 360 133
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12097 -13139 -894 -1115 -361 -2177 * *
+ 59 -2065 -5937 3021 -513 -6250 -2744 -4039 -6010 -2129 -5950 -5036 2622 -5450 983 -2296 -18 -741 -5556 -6118 -5415 134
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 60 324 -940 -6758 -6122 1363 -5960 -4831 -1357 -5717 2374 2634 -2199 -6010 -5340 -5517 -2914 -739 212 -4696 -4354 135
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 61 -6950 -6379 -9549 -9137 -1292 -9440 -8815 3219 -9064 1733 -4313 -9123 -8772 -8296 -8870 -8857 -6886 1055 -7452 -7486 136
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 62 -7412 -6803 -9876 -9343 1002 -9722 -8544 2915 -9191 1103 -1071 -9435 -8787 -8028 -8737 -9124 -7282 2019 -729 -7234 137
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 63 1271 -4842 -7495 -6939 -4995 -6596 -5770 -2239 -6574 -1792 -1076 -6384 -6715 -6218 -6399 1687 2547 1551 -5626 -5277 138
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 64 -8548 -7657 -9047 -8870 -1965 -8826 5193 -7646 -1915 -3053 -7012 -7442 -8684 -7189 -1599 -8110 -8341 -7779 -4514 1937 139
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 65 -10068 -8941 -8614 -965 -10022 -8731 5431 -11325 -9792 -10673 -10610 -9232 -9187 -9513 -9585 -10274 -10202 -10986 -8996 -9816 140
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 66 -1903 -5824 -7117 -1878 -8491 1493 -7487 -8330 -8106 -8562 -7611 -6556 3921 -7476 -7986 -5421 -1644 -7018 -8696 -8574 141
+ - -150 -501 232 45 -382 403 105 -627 212 -467 -721 274 393 44 95 360 116 -370 -295 -250
+ - -111 -5657 -4212 -1551 -602 -701 -1378 * *
+ 67 -1813 -4169 -6690 -6055 1819 -5893 -4765 1142 -5650 2176 -3369 -5539 1012 -5273 -5450 -2555 -1206 306 -4629 842 145
+ - -149 -500 232 42 -371 399 105 -627 212 -464 -721 275 393 45 95 358 117 -370 -295 -250
+ - -70 -4401 -13072 -34 -5435 -1362 -711 * *
+ 68 -1940 -759 -7032 -6399 2695 -6251 -5119 2712 -6000 1052 1364 -5898 -915 -5594 -5792 -5341 -4621 -2435 -4932 -216 147
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12057 -13099 -894 -1115 -2697 -242 * *
+ 69 -2485 -4188 -6705 -6069 3822 -2760 -4777 -1270 -2579 -820 -272 -5553 -5958 -5287 -1421 -4993 -2202 -3601 3864 1041 148
+ - -150 -494 247 45 -383 396 119 -621 206 -457 -694 273 385 45 87 358 108 -372 -285 -245
+ - -3075 -4018 -287 -3103 -179 -2697 -242 * *
+ 70 -186 -3611 -2099 -1511 11 -3152 -1726 -3686 2411 -3603 -2706 1019 105 1771 1856 -2091 -2131 -3261 -3730 -3121 164
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -78 -9587 -4286 -894 -1115 -140 -3431 * *
+ 71 -1745 -5467 -1219 -3296 -2254 1170 1409 -2306 1855 -1702 -4556 827 -499 -922 1989 422 -1513 -2688 -5651 -4969 165
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -16 -11986 -6569 -894 -1115 -1835 -474 * *
+ 72 -240 -5484 -460 565 -5805 1747 -3643 -2202 294 -5500 -1334 -1023 2768 -443 -705 -576 -3950 -5106 -5667 -4985 166
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12001 -13043 -894 -1115 -2365 -311 * *
+ 73 197 -4164 -2690 -2599 174 -5834 -1005 559 -1572 1855 668 -2381 1160 -2032 -5344 -758 -1097 969 616 -1779 167
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12015 -13057 -894 -1115 -503 -1764 * *
+ 74 -1139 -5562 139 -99 -5884 -2034 -1300 -5634 2781 -1462 -4651 -777 281 1094 384 58 -1113 -5184 -322 -416 168
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -25 -12084 -5902 -894 -1115 -2010 -412 * *
+ 75 272 -1081 42 -1583 -1144 -1770 115 -1482 503 -1786 -4625 331 -178 333 1667 1141 339 -472 -5720 136 169
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12060 -13102 -894 -1115 -2645 -251 * *
+ 76 -2533 -4186 -6694 -1842 -983 -5905 -4776 2719 -995 1748 -193 -1140 -5955 -1795 -5459 -2609 -2050 1026 -418 -4301 170
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12060 -13102 -894 -1115 -2645 -251 * *
+ 77 -1024 141 612 -173 -1884 -1194 124 -796 654 -1525 -1377 860 -2484 -1593 387 -731 2407 -320 -5716 -5036 171
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12060 -13102 -894 -1115 -2645 -251 * *
+ 78 216 -1001 706 352 634 1712 -3702 -5594 -341 -752 -602 -1068 -872 -132 -1298 382 603 -2820 261 -980 172
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12060 -13102 -894 -1115 -2645 -251 * *
+ 79 -517 -5538 1741 1218 -2327 -1908 -990 -494 375 -3284 1253 1169 -913 174 -41 461 -751 -1243 315 -5039 173
+ - -141 -506 229 36 -377 394 99 -620 211 -460 -715 281 390 39 92 358 115 -369 -301 -225
+ - -685 -3231 -1882 -1872 -460 -2645 -251 * *
+ 80 -1962 -5108 2079 -1 -656 -499 -675 -2262 -493 -5124 -4197 1231 1187 -592 -147 132 1152 -1471 -5291 -430 178
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11603 -12645 -894 -1115 -5392 -35 * *
+ 81 -361 -4295 -2014 -1350 754 -4960 -3688 -75 -626 -1036 -752 -1663 2240 -587 -973 -560 -1955 -634 1767 2837 179
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -19 -11603 -6290 -894 -1115 -286 -2474 * *
+ 82 -2643 -702 -4755 -209 -1200 -5400 647 478 2114 -435 -267 -1164 555 1381 -1546 -1016 -761 622 -403 526 180
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12021 -13063 -894 -1115 -1492 -634 * *
+ 83 345 -5528 -1997 754 -1304 1895 177 -2423 706 -5544 -4617 -113 -5122 1368 16 -186 -1662 -5150 -5712 1549 181
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12048 -13090 -894 -1115 -1837 -474 * *
+ 84 338 -1159 -497 659 -2209 -1366 -354 -2630 1361 -3355 -4628 816 -5133 1102 2399 -207 -962 -5161 -5722 -5040 182
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12060 -13102 -894 -1115 -1507 -625 * *
+ 85 -838 618 -6696 -6062 -4154 -5916 -4786 1695 408 1038 1635 -5556 -2629 -2313 1873 -175 -4311 776 -4657 -1464 183
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12073 -13115 -894 -1115 -2338 -318 * *
+ 86 -332 -4198 -6715 -1687 -1777 -5919 -4790 2419 -1401 1580 -1193 -5564 -997 -5298 -2246 -5003 -2298 1429 -4656 879 184
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12073 -13115 -894 -1115 -2338 -318 * *
+ 87 302 -4668 -4828 375 54 -1908 -479 865 1470 609 -1275 -4414 -5534 788 1034 -710 -1087 -919 -641 20 185
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12073 -13115 -894 -1115 -2338 -318 * *
+ 88 -22 -5549 -286 -149 -560 -1178 -3712 -490 1957 414 -4638 -427 -884 1410 870 -2562 372 -2612 -5733 -1809 186
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12073 -13115 -894 -1115 -2338 -318 * *
+ 89 1286 1044 -6818 -6184 -38 -6025 -4898 182 -5781 2678 61 -5672 -6068 -5398 -5580 -2728 -1601 -2219 -4751 -4415 187
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12073 -13115 -894 -1115 -2338 -318 * *
+ 90 137 169 -6712 -2584 -1040 -5918 -68 2776 166 1324 253 -1303 -5968 -5296 -5474 -2820 -1534 -123 -4656 -1473 188
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12073 -13115 -894 -1115 -2338 -318 * *
+ 91 -67 -5552 -923 1630 -5873 -2878 -1268 -5624 2215 -3226 -451 -3688 -2167 1754 1561 -1374 -619 -2519 -5735 -5052 189
+ - -150 -501 232 42 -382 398 105 -627 212 -464 -721 274 393 44 101 360 116 -367 -295 -250
+ - -88 -4081 -13115 -26 -5784 -191 -3015 * *
+ 92 436 -841 -1033 -110 -5908 -574 2830 -5659 1026 -5603 -4676 2876 -959 -1761 -2164 -281 -4053 -2683 -5770 -811 191
+ - -137 -503 235 39 -384 395 109 -630 209 -459 -724 275 390 42 102 357 114 -366 -298 -247
+ - -29 -5657 -13151 -3385 -145 -701 -1378 * *
+ 93 -1768 -5593 2221 -436 -5914 1650 -498 -5665 486 -3170 -4682 2500 -2429 -1022 24 -3999 -4058 -2773 -5776 -5093 203
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 94 -1901 1213 -6782 -6147 -4217 -5986 -4860 3501 -2589 691 626 -5632 -6035 -5367 -2258 -2760 -2347 -329 -4725 -4382 204
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 95 1575 -914 -5853 -5264 -4343 -554 -1433 -3891 -5018 -1718 -3564 1799 497 -2110 -5110 2060 -509 -36 -570 -784 205
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 96 -2046 -4252 -6773 -6138 -37 -5977 -1038 1326 -5734 2183 -3453 -2487 -6026 -5357 -5534 -5062 -1581 2196 -4712 -373 206
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 97 -7686 -7042 -9531 -9236 2147 -9280 -6513 1478 -8939 -114 267 -8481 -8662 -7744 -8402 -8559 -7531 -2062 -223 4013 207
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 98 2207 1305 -6435 -5950 -5530 -1365 -1179 -5104 -5728 -5420 -4722 -2453 -6253 -5523 -671 2461 273 -574 -253 -5582 208
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 99 1987 1187 -6753 -6117 394 -5954 -4826 825 -5711 330 1573 -5601 1334 -5334 -5511 -846 -2544 -794 -647 1520 209
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 100 -8799 -8407 -9472 -9840 -9476 -8455 5462 -10883 -9976 -10428 -10173 -9476 -8992 -9807 -9530 -9111 -2423 -10174 -8830 -9274 210
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 101 -5472 -5506 -734 -7737 -5885 -6792 -6915 -710 -7589 784 -4869 -6996 -7202 -7161 -7424 -275 3590 -2243 -6813 -6525 211
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 102 620 -768 -7570 -7575 -8163 -1961 -1071 -7953 -7487 -8176 -7239 3536 2168 -1897 -7476 14 -5523 -2505 -8355 -8181 212
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 103 -217 -1086 -6754 -6118 1568 -5956 -4827 -1118 -5713 2255 1199 -5602 -6006 -5335 -5512 -2843 -2224 -31 2639 1746 213
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 104 -7957 -8797 4199 -6020 -9373 -7466 -1062 -9970 -7498 -9638 -9246 -6400 -8024 -6923 -2262 -7650 -8076 -9451 -8872 -8633 214
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -14 -12109 -6746 -894 -1115 -701 -1378 * *
+ 105 1925 28 -5541 -4962 -397 -2889 -539 1161 -55 -2952 -478 348 -2316 231 -130 921 -2533 650 -4854 -1508 215
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -14 -12096 -6727 -894 -1115 -1527 -615 * *
+ 106 2194 615 -2255 -2127 -4863 -5387 3203 -1622 -1492 -1725 -1088 -10 -5467 -3857 -2002 114 -255 808 -5162 -1468 216
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -12 -12082 -6902 -894 -1115 -2051 -399 * *
+ 107 511 -1138 -939 171 432 -1390 1304 -1752 746 -1878 -4635 -756 2640 424 -262 -2434 -742 -1788 -5730 -1920 217
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -70 -12071 -4415 -894 -1115 -2392 -305 * *
+ 108 -677 -5480 660 1364 -987 2021 -1169 -707 -266 -1826 -4570 1359 -353 -565 -3732 -1309 -476 -2566 -5665 -826 218
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1853 -12001 -468 -894 -1115 -3519 -132 * *
+ 109 -2575 -2424 490 -4149 798 -4107 -2970 1190 -848 1877 -1625 -3704 -4158 -312 -447 -3185 -2516 1231 -2879 1008 219
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10150 -11192 -894 -1115 -158 -3270 * *
+ 110 -2784 -5926 -5922 -5961 -7742 3720 -6126 -7438 -2348 -3166 -1557 -2213 -2059 -1980 -5815 -1888 -5550 -6658 -7730 -7392 220
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11999 -13041 -894 -1115 -456 -1885 * *
+ 111 -665 -4207 -6726 -6090 -964 -5928 253 578 -5685 974 1837 1850 -954 -5308 -5485 -2019 793 1857 -4665 -4323 221
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12082 -13124 -894 -1115 -920 -1085 * *
+ 112 308 668 -6007 -5411 -1862 -2084 -1074 -2237 -5141 -2812 -144 3714 -2145 -1883 -2263 826 -2216 -1622 -4765 -4401 222
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12095 -13137 -894 -1115 -342 -2244 * *
+ 113 1015 -5576 2784 401 -23 -1360 -3749 -1825 -335 -5590 -1229 -1252 -5183 -235 -911 -1318 -72 -782 886 -213 223
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 114 525 611 -6114 -2621 -4285 -894 489 -761 -605 -312 136 -5277 -5904 1821 -2382 -1017 8 83 3751 1962 224
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 115 -2051 -879 -7341 -6708 841 -6573 -5436 949 -6315 2786 -286 -6222 -6561 -2223 -6096 -5669 -4925 488 349 -4910 225
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 116 2962 1192 -2408 -2847 -888 -590 -4811 -314 -5658 -848 -491 -2327 -5995 -1938 -5483 -298 -1160 -313 -4698 -1607 226
+ - -150 -501 232 44 -382 398 116 -627 209 -464 -721 274 393 44 97 360 118 -370 -295 -250
+ - -82 -4185 -13151 -28 -5719 -701 -1378 * *
+ 117 -220 -5587 1403 1898 -5908 -2040 548 -2677 1682 -3379 -1544 850 -5181 1295 715 -1901 -4053 -5209 -5770 -5087 228
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 118 988 -77 -1553 -701 -1139 -573 -427 556 335 950 1222 -4117 -1509 482 1207 -1471 -2296 -163 -517 -4801 229
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 119 -2159 -914 -8720 -8110 -17 -8117 -6946 1044 -7781 3011 -496 -7782 -7811 -7080 -7479 -7277 -6252 -961 -6263 -1819 230
+ - -150 -505 235 40 -371 404 106 -619 210 -469 -725 273 393 40 93 359 121 -372 -299 -249
+ - -7274 -3634 -131 -1840 -473 -701 -1378 * *
+ 120 -1183 -2220 622 753 691 191 -919 388 -592 -2169 -1352 844 -2325 -534 -1059 463 561 1061 -2502 -1926 235
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -152 -8589 -3359 -894 -1115 -182 -3073 * *
+ 121 -1254 -5569 95 546 -5886 3041 214 -5641 -483 -3235 -4662 1299 -2347 -955 -3819 -1704 -4027 -5190 -5751 -5060 236
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11935 -12977 -894 -1115 -4099 -87 * *
+ 122 -1164 -4065 -6584 -5948 91 -5786 -1218 1402 -2444 2621 -1124 -5432 -2479 -5166 -1481 -1695 -958 -1473 1902 -1706 237
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -16 -11935 -6518 -894 -1115 -4099 -87 * *
+ 123 -2305 -1026 -250 1818 -1931 -350 -1048 -1146 955 -2230 -4495 -539 -2348 1727 128 -14 1303 -1815 -5589 -1839 238
+ - -150 -488 231 44 -377 399 104 -628 211 -465 -722 274 392 44 97 361 116 -371 -296 -245
+ - -4276 -5154 -120 -1801 -488 -4205 -80 * *
+ 124 -1089 2492 -1903 -1368 -1763 406 -1271 1577 -1221 -1620 -903 -1441 772 1418 -1543 1348 -1103 -1154 -2111 -1677 247
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -817 -8273 -1220 -894 -1115 -130 -3541 * *
+ 125 -469 -5432 1487 211 -5754 13 -335 -1504 1050 -5449 -1284 2065 -429 433 -1939 429 -557 -724 -5616 -1599 248
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11947 -12989 -894 -1115 -2823 -220 * *
+ 126 -923 1880 -2592 -2611 -1124 -913 -4507 1923 -1615 -533 -376 -2247 -223 -1132 -12 -180 1161 1303 -504 -704 249
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11962 -13004 -894 -1115 -3892 -101 * *
+ 127 -679 -913 -135 1487 -1006 -913 -298 -1175 1104 -2153 -1381 -912 -2144 -99 1492 73 599 -112 -5627 -778 250
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -14 -11962 -6687 -894 -1115 -3892 -101 * *
+ 128 -357 -984 -2189 -85 -1156 -1229 304 286 -1191 -5193 190 359 2887 -3251 -1406 -125 -1449 848 -5459 -1781 251
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -13 -11948 -6889 -894 -1115 -2798 -224 * *
+ 129 -2547 -4081 -6601 -5964 2591 -5802 -261 1243 -2629 2248 -1131 -5448 -1306 -5182 -5359 -2704 -2340 -121 -4539 -1298 252
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -39 -11952 -5227 -894 -1115 -3976 -95 * *
+ 130 -131 -877 1617 1209 -1914 1022 -344 -1687 866 -1227 -4488 -920 -2071 -60 -826 273 -516 -830 -5582 -1596 253
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -85 -11913 -4132 -894 -1115 -3234 -162 * *
+ 131 -1778 -5317 539 154 176 -2549 -800 -670 89 -606 -1169 186 2316 -19 -542 -294 -310 142 -5505 282 254
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -208 -11841 -2901 -894 -1115 -4629 -60 * *
+ 132 -421 428 -213 -1244 -1847 -2479 972 -2151 -124 -430 -959 795 -606 -2978 -1830 1287 1468 -2075 -171 2123 255
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -33 -11634 -5484 -894 -1115 -2427 -297 * *
+ 133 -677 -5193 -544 805 -924 248 547 -1499 1098 -331 358 562 363 1152 81 127 -2065 -1591 -5376 -131 256
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -315 -11695 -2352 -894 -1115 -5156 -41 * *
+ 134 1045 -337 417 914 -704 -59 -3061 -811 679 -2654 -3988 831 -1002 -348 -322 805 -13 -1300 -5082 -1080 257
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -130 -11381 -3544 -894 -1115 -5800 -26 * *
+ 135 -348 -4777 867 1371 -1480 432 -2942 -1781 563 -1735 -714 1278 547 -1038 -1359 367 -280 -530 173 -4280 258
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -321 -11252 -2329 -894 -1115 -2996 -193 * *
+ 136 85 1390 823 59 -4949 115 -43 -879 892 -949 -430 573 660 483 -1334 25 425 -1713 -4813 -807 259
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -121 -11088 -3640 -894 -1115 -6147 -21 * *
+ 137 -1602 -4454 -1182 318 -4745 -395 660 -266 -303 1190 423 -794 -513 95 -342 -2951 -1348 -914 -4656 2854 260
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -409 -10968 -2021 -894 -1115 -6252 -19 * *
+ 138 -448 344 -174 -197 -823 -3753 1091 199 622 -1075 -2980 -2452 1095 -409 -878 28 -1012 938 -4118 2136 261
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -110 -10560 -3781 -894 -1115 -6515 -16 * *
+ 139 -1175 -4093 -804 -761 -4415 48 -2247 -4165 3241 -4108 -3183 -2221 -3682 -234 -618 -352 819 -3716 -4274 -3592 262
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -36 -10451 -5379 -894 -1115 -6567 -15 * *
+ 140 -1125 601 -4970 -1370 -2621 -1468 1144 1370 -3981 2143 253 -726 -17 -470 -3847 -1156 -2750 -73 921 -2773 263
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10417 -11459 -894 -1115 -6583 -15 * *
+ 141 1146 -3848 4 -1967 -4090 60 -2258 -218 -530 -3830 -2959 -2262 -3681 -148 637 -361 -129 2387 -4081 -3451 264
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -80 -10417 -4226 -894 -1115 -6583 -15 * *
+ 142 -340 -2574 -5090 -4454 -258 -408 216 208 -4050 -477 -1777 -3940 -4345 -3673 -3851 -3379 1600 2720 -3032 722 265
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10338 -11380 -894 -1115 -6616 -15 * *
+ 143 -3292 -3604 -3763 -193 3647 -4456 1707 -3227 -3292 -3442 -2801 329 106 -3117 -3593 -1073 -3235 -955 -3197 1978 266
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -44 -10338 -5108 -894 -1115 -6616 -15 * *
+ 144 -375 -2545 -4971 -4341 -349 -1211 -3113 731 -1086 -1195 -1748 -3865 -4296 -3592 -18 -1094 -845 3118 -3002 -2658 267
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10296 -11338 -894 -1115 -6633 -15 * *
+ 145 -986 -2583 -5030 -4407 -2556 -4251 -3170 -2090 -4017 -94 479 -3908 3666 -3652 -3839 -360 -759 -569 -3059 38 268
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10296 -11338 -894 -1115 -6633 -15 * *
+ 146 512 561 -2361 1959 -4099 -332 1123 -1071 195 -1484 332 -2114 -853 -221 -645 -257 819 225 -4036 -3382 269
+ - -149 -504 239 51 -377 400 107 -627 206 -471 -715 281 391 44 94 360 117 -374 -299 -254
+ - -5460 -74 -5189 -6 -7974 -6633 -15 * *
+ 147 198 504 131 76 -4176 -1069 3563 -3918 -1649 -3879 175 -2044 -3496 1429 -592 -288 -577 -1143 -4059 1944 271
+ - -142 -504 230 49 -376 394 101 -627 208 -463 -725 276 391 44 91 359 117 -364 -287 -249
+ - -5421 -35 -11299 -6 -7974 -6648 -14 * *
+ 148 248 -3895 2202 2342 -475 -1150 -2056 -942 -1636 -3910 -2984 -427 -810 15 -550 -886 -736 -3516 -4078 -3396 273
+ - -142 -504 233 51 -385 398 101 -627 209 -471 -725 271 396 44 101 357 121 -371 -299 -254
+ - -5421 -35 -11299 -6 -7974 -6648 -14 * *
+ 149 -269 -2518 -820 -1140 -182 -4223 -3092 -580 -3937 1069 -1721 -3845 -4273 -3574 -3763 -1224 -753 2947 -2978 -2634 275
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10257 -11299 -894 -1115 -6648 -14 * *
+ 150 811 -3719 -2374 -1824 -450 -1241 -2117 -3663 952 461 -2828 -377 -3540 512 2601 -933 -579 -989 -3949 -3316 276
+ - -147 -504 239 49 -385 395 101 -627 215 -469 -725 275 389 53 98 359 115 -371 -299 -254
+ - -5421 -35 -11299 -6 -7974 -6648 -14 * *
+ 151 2787 -2620 -4232 423 -2591 -1277 -2913 -649 -970 -21 1332 -3461 -4146 -3135 -3437 -977 -2581 -47 -3062 -2696 278
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -42 -10257 -5150 -894 -1115 -6648 -14 * *
+ 152 -2636 -2524 -1008 -4001 -2485 -1104 -2993 1540 -948 2344 2452 -3659 -718 -3368 -3603 -971 -2577 -1941 -2977 -2626 279
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 153 1172 1582 -4540 -1068 1685 -415 -2963 -512 -1035 73 -1720 332 -4170 -3314 -3562 1319 -570 65 1059 -2617 280
+ - -145 -504 239 41 -385 399 101 -627 210 -470 -725 285 393 54 96 357 113 -368 -299 -254
+ - -5380 -36 -11258 -6 -7933 -6663 -14 * *
+ 154 2191 -3245 -2702 11 -552 -3581 342 -2964 -2037 290 247 -416 -3665 -55 -499 275 142 411 -3576 -3057 282
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 155 -1003 736 -2367 -1816 -3907 3098 -2100 -3599 -422 -1391 197 -422 -607 -90 -506 -946 -2360 -3246 -3905 -3281 283
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 156 2819 679 -4072 -97 -2583 -1276 373 -552 -3240 -365 -1803 -3351 -854 -3015 -648 -3062 -759 101 -3046 -2675 284
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 157 -148 882 -3629 -3058 -2773 2997 1307 -696 -2870 -459 -1964 -533 -3987 -2710 -641 -1095 -681 -2213 -3195 -2796 285
+ - -145 -504 228 43 -368 396 128 -620 208 -470 -725 276 389 47 99 359 115 -371 -274 -254
+ - -5380 -36 -11258 -6 -7933 -6663 -14 * *
+ 158 -2634 -2473 -4894 -955 -252 1394 -3039 2992 -3878 -429 -1675 -3790 -4223 -353 -3708 -971 -571 -571 1298 -2585 287
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 159 -3625 -4369 -579 -3535 -5691 3282 -4321 30 -4667 -5575 -4855 1419 -4875 -4123 -5177 -1087 -3923 -233 -5976 -5440 288
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 160 -994 -3854 1064 -505 -429 599 373 27 -410 -3869 -2944 2804 -3456 -1563 -373 -921 77 -3474 -4039 646 289
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 161 -2410 -3668 202 -550 -3906 -275 -2088 -940 -1708 -3648 411 -322 -3510 679 -568 -2335 -661 -1114 -3903 3987 290
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 162 -2463 575 1513 126 501 -296 -2278 -2976 -2029 -1342 -2405 -2374 -3662 -1957 -607 2283 -724 -977 -3582 1361 291
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 163 -909 2076 1299 579 -4174 -3363 2704 -3923 -1603 -1644 -2945 841 -777 -61 -542 691 51 -1029 -4040 888 292
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -47 -10216 -5006 -894 -1115 -6663 -14 * *
+ 164 -835 5013 -3632 -883 -254 -3883 1348 -2550 -2962 -2857 -2168 -487 -4037 -2802 -3208 961 -2613 -803 -3390 -2984 293
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -50 -10171 -4925 -894 -1115 -6679 -14 * *
+ 165 750 901 -5604 -5273 1215 -868 -4241 -3517 -4930 -3857 -3168 -4347 -4580 -4552 -4772 1887 2712 -3243 -4387 -90 294
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -53 -10123 -4824 -894 -1115 -6695 -14 * *
+ 166 -917 -2587 -556 -2992 3597 -3804 -2591 -472 -2797 -2453 -1776 -2985 -3870 -286 -577 720 -556 -2022 1164 875 295
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10072 -11114 -894 -1115 -6712 -14 * *
+ 167 -87 -3730 -2118 725 1017 -190 -1902 -873 -200 -3744 240 470 -3336 687 1434 1257 639 -3349 -3916 -3235 296
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -56 -10072 -4762 -894 -1115 -6712 -14 * *
+ 168 -143 -3426 -2229 -451 -3637 -3275 1950 47 -306 -3394 375 546 -671 -1535 -411 858 1318 1404 -3679 -36 297
+ - -145 -504 233 54 -385 398 102 -630 206 -470 -724 276 394 47 102 357 120 -370 -298 -253
+ - -5183 -41 -11061 -7 -7732 -6729 -14 * *
+ 169 -4269 -5366 -3182 1076 -6168 3311 -3227 -5700 -379 -5431 -4735 -3299 -4862 -2833 -360 -4091 189 -5323 -5369 -5013 299
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10019 -11061 -894 -1115 -6729 -14 * *
+ 170 -2225 1684 -459 658 -4000 770 -1859 519 -155 -3698 -2775 -1838 -3293 112 -315 -690 2651 -3303 -3871 -3192 300
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -99 -10019 -3935 -894 -1115 -6729 -14 * *
+ 171 -2703 -3603 -392 -408 696 3241 -2449 -619 -2254 -3564 -2799 -2349 -3784 -2123 -448 -2702 -558 -3141 -3946 -3383 301
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -106 -9922 -3836 -894 -1115 -6757 -13 * *
+ 172 -2421 1126 -3317 -2788 1762 147 -2711 -2954 -2577 -3211 -2477 -2825 -3799 1470 -178 -686 2997 -2713 -3666 -3230 302
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -6784 -13 * *
+ 173 -5051 -4563 -6429 -6412 4098 -5976 -2938 -4293 -5991 -1192 -3850 -5041 -5977 -5080 -5553 -874 961 -4326 -2239 1417 303
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -6784 -13 * *
+ 174 -2397 -2566 -3474 -2851 862 -3713 -2426 -403 2028 590 -1745 -2846 425 157 2319 -2742 -2327 -427 -2963 -2579 304
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -6784 -13 * *
+ 175 85 -3070 -4392 -3990 -3786 114 -3548 -3321 400 -304 -2953 -3629 3594 -3526 -3647 -2975 -2878 -596 -4160 -3815 305
+ - -148 -503 229 40 -384 403 102 -630 207 -454 -724 279 397 48 95 356 114 -367 -298 -253
+ - -4982 -47 -10860 -8 -7527 -6784 -13 * *
+ 176 114 -3672 -2821 3132 -4752 1126 -3040 -4470 -2831 -1201 -3709 -2784 -418 -2678 -3295 -2768 407 -3911 -4815 -4242 307
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -6784 -13 * *
+ 177 948 -6019 777 -289 -6202 3137 -3354 -6138 -563 -5995 -5336 -76 -4530 -3024 -4500 -3739 -4160 -5598 -6191 -5151 308
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -6784 -13 * *
+ 178 2010 -3468 -1990 -255 -3795 -755 -1767 -3524 -1363 -3511 558 -5 -3182 -1320 -229 579 2263 -3105 -3712 -3052 309
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -6784 -13 * *
+ 179 -611 -3486 -192 -1382 -282 -3045 702 -3523 -1296 -3494 -2582 3129 393 906 -1800 682 -387 -609 -3683 -3013 310
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -181 -9818 -3098 -894 -1115 -6784 -13 * *
+ 180 -3995 -4635 -3861 -4003 -6304 -4447 -4138 -6292 -3341 -6125 -5449 996 4064 -3869 -135 -4075 -4261 -5510 -5792 -5631 311
+ - -147 -502 231 43 -377 398 115 -628 208 -466 -722 278 400 43 94 357 115 -371 -296 -251
+ - -453 -1896 -10682 -1177 -843 -4742 -55 * *
+ 181 46 -2133 -625 -3917 3118 -3829 -2697 652 -3533 -1982 -1336 -3446 -277 -3173 -3366 -2911 1291 -268 -2589 2006 319
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -6784 -13 * *
+ 182 -2563 1054 -4934 -4318 -2376 165 -3079 2918 -3931 -158 -1582 -3818 -4207 -3567 -3745 -3267 -360 1759 -2934 442 320
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -6784 -13 * *
+ 183 -3254 -4032 -315 -3268 -5578 3510 -3895 -396 -3800 -5425 -4669 -3341 -4509 -3644 -204 -3348 -401 -4570 -5684 -5191 321
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -6784 -13 * *
+ 184 1392 -3569 -1917 1689 -3896 -645 -1733 -3647 540 -3592 -2667 -1701 -3163 2041 -1822 -599 1545 -3197 -3760 -3077 322
+ - -150 -503 229 42 -384 398 102 -608 215 -467 -724 272 390 51 95 356 120 -362 -298 -253
+ - -4982 -47 -10860 -8 -7527 -6784 -13 * *
+ 185 -2708 -4153 -139 -145 -224 3097 732 -4161 -2012 -1099 -3281 730 -3651 -1866 -2563 -704 -2670 -3747 -4356 -3644 324
+ - -148 -503 236 52 -384 395 108 -625 215 -469 -724 274 390 57 100 356 114 -373 -298 -253
+ - -4982 -47 -10860 -8 -7527 -6784 -13 * *
+ 186 -677 -2135 -667 -3848 19 -953 -2678 955 -3478 2208 -1337 -3409 -3866 -170 -3333 610 -2225 521 -2591 -2245 326
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -6784 -13 * *
+ 187 185 -2770 -2758 3005 -2835 -3475 2124 475 -2166 -1004 -1963 -2430 -3583 -2066 -2517 -2485 422 -2213 -3179 -2724 327
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9818 -10860 -894 -1115 -5783 -26 * *
+ 188 -1 -3572 -1947 877 -3893 -909 663 -3643 1198 -3588 -2661 -1709 -3167 870 2261 153 796 -662 -3755 -3073 328
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9869 -10911 -894 -1115 -5713 -28 * *
+ 189 484 -2435 -4228 1329 -2439 -919 -2892 -1851 -3503 -917 -1672 -3458 -4050 -3209 -3478 -3047 -2465 3013 -2938 357 329
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9922 -10964 -894 -1115 -5134 -42 * *
+ 190 319 -3757 1718 2207 -4076 -947 649 -3828 -1497 -3772 -2848 517 1195 -1449 371 -2157 -2221 -780 -3940 -3254 330
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10019 -11061 -894 -1115 -6729 -14 * *
+ 191 -3298 -4845 -157 3450 -5107 -82 -2805 -843 -2640 -4844 -4005 -2429 -537 -145 -3244 -3106 -3283 -793 -5047 -4274 331
+ - -151 -504 229 46 -376 395 102 -623 206 -466 -724 274 390 48 97 358 120 -350 -298 -249
+ - -5183 -41 -11061 -7 -7732 -6729 -14 * *
+ 192 -3521 -3782 -4573 -3605 -312 -4589 -2894 -501 1702 -1250 -2915 -3531 -4584 742 3390 -3739 -3372 -652 -3985 -3690 333
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10019 -11061 -894 -1115 -5584 -30 * *
+ 193 -3146 -2911 -5457 -845 -2943 -4821 -3762 2744 -726 1812 -2070 -4437 -651 -4171 -4332 -3935 -3094 1058 -3613 -3269 334
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10072 -11114 -894 -1115 -6712 -14 * *
+ 194 -94 -4388 -2202 3313 -4745 -3659 -2506 -4504 -484 -1334 -3566 -243 -3878 -2076 -2684 733 -2889 -4050 -4624 -3917 335
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10072 -11114 -894 -1115 -4964 -47 * *
+ 195 -945 -2439 -4845 -21 -2395 -4135 -3002 1100 -3833 1142 476 -3749 -783 -3475 -3668 -247 2539 132 -2896 -2552 336
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10171 -11213 -894 -1115 -5589 -30 * *
+ 196 -2637 -2477 -4891 -1064 670 -4175 -3042 2445 -3876 -465 -1679 -721 -4225 -3517 -823 -243 642 2048 -2934 -2590 337
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 197 -875 2654 -838 -4341 524 -4183 -3054 646 -3937 607 641 -673 -633 -3560 -3738 -1054 -683 2255 -2921 -78 338
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 198 -934 782 -635 -2741 -2874 -1165 397 -541 -2584 -1266 -2037 -2842 3160 -2456 695 -333 102 13 -3257 -2832 339
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 199 1044 627 -2244 1164 -4187 -3369 -2026 -3937 992 -3881 -2955 437 -3462 2346 1635 -857 -2334 -956 -4048 -3367 340
+ - -147 -504 238 43 -385 395 123 -631 211 -470 -725 278 389 44 98 362 115 -374 -285 -239
+ - -5380 -36 -11258 -6 -7933 -6663 -14 * *
+ 200 179 775 -2272 115 -4084 -1113 -2042 -891 607 1097 -2890 1587 -3473 689 1579 -2289 -732 -3399 -3995 -289 342
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 201 235 -3577 755 568 -3782 -3449 -2123 827 -531 1982 -2698 -2144 -3538 544 -580 -2369 -664 -925 -3834 -3230 343
+ - -142 -504 233 45 -385 399 101 -631 213 -466 -716 271 389 41 98 361 119 -371 -285 -248
+ - -5380 -36 -11258 -6 -7933 -6663 -14 * *
+ 202 831 -3855 -2238 627 -4173 -321 -2022 -41 1195 -1571 -2944 -312 -3456 1407 690 679 521 -951 -4040 -3358 345
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 203 846 -2538 -772 -4151 -2508 -4196 -3065 731 -3805 -985 -1745 -3760 -4250 -378 -3697 -1100 589 2914 -3011 -2662 346
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 204 -221 -2771 -5354 -4740 -2771 -4598 -3508 2383 -4355 1256 1304 -4245 -4627 -3988 -662 -3697 156 1758 -3353 -3009 347
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 205 1089 -3864 -528 111 -4185 -3364 -2023 -3936 2279 -3880 -2953 461 -3457 1709 694 -236 -2330 -151 -4047 -3364 348
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 206 2587 -2547 -801 -1088 -383 -4086 -2923 658 -3485 -300 489 -3526 -4142 -3213 755 -1160 40 -573 -2994 -2635 349
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -6663 -14 * *
+ 207 651 -2483 -4954 -4320 -2432 -4194 454 719 -844 1769 3405 -3826 -4243 -442 -3736 -3278 -2591 156 -2939 -2597 350
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10216 -11258 -894 -1115 -5628 -29 * *
+ 208 -2593 -3147 -3047 -866 -3209 -3770 2151 1464 1214 1687 -2313 -2660 -3847 1447 -2635 -336 -2529 -973 -3506 -3041 351
+ - -138 -504 233 49 -385 395 101 -624 219 -466 -725 273 391 44 97 358 115 -374 -299 -254
+ - -5421 -35 -11299 -6 -7974 -6648 -14 * *
+ 209 2461 -3194 136 -814 -348 -3662 1845 -2878 -2170 -3103 451 -2500 -826 598 -2580 -2613 -2455 1195 -3541 -200 353
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10257 -11299 -894 -1115 -6648 -14 * *
+ 210 -887 -3727 -2420 -627 -3968 -3492 4655 -3659 -1783 -1507 -2848 -265 681 -1744 -620 -134 -2429 -984 -3969 -3347 354
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10257 -11299 -894 -1115 -6648 -14 * *
+ 211 -2500 -3898 -2316 132 -4186 -3464 1355 -3916 -1739 -1516 -2998 -250 3459 530 -2240 -953 -735 -3503 -4099 785 355
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10257 -11299 -894 -1115 -6648 -14 * *
+ 212 -205 -3376 -630 146 -3501 -3596 -2296 -3127 -2021 -1528 -2523 -2368 736 -1953 -627 -2539 -702 -1039 -3692 4082 356
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10257 -11299 -894 -1115 -6648 -14 * *
+ 213 -244 -2963 -3287 3138 -3006 -1139 -2616 137 -2599 -1195 -2160 -2855 -3924 -2476 -2920 -275 -599 -2433 -3376 1305 357
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10257 -11299 -894 -1115 -6648 -14 * *
+ 214 -2426 -3863 -544 3070 -657 -1069 -2065 -3909 250 -1671 362 -431 -3498 646 -2156 -2313 -720 -1161 -4055 -217 358
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10257 -11299 -894 -1115 -6648 -14 * *
+ 215 -881 -3348 -720 -2114 -3470 -3586 -2281 22 -657 -3276 -2494 -311 1963 -1940 -549 -265 175 2456 -3664 -171 359
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10257 -11299 -894 -1115 -5613 -30 * *
+ 216 2807 -2535 -5044 -4408 -224 -4254 254 -590 -4005 -43 -1738 -3897 194 -3630 -3808 -1096 -835 -19 1234 38 360
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10296 -11338 -894 -1115 -6633 -15 * *
+ 217 -2654 -2723 143 -237 356 -4050 349 -648 -3158 -518 441 230 -878 -522 -3308 -3078 -2595 839 -3155 3639 361
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10296 -11338 -894 -1115 -6633 -15 * *
+ 218 -2866 -2766 3236 -284 -251 -4360 -3230 1009 -3843 -19 -1954 -3820 -4418 -3545 -3821 128 -2810 149 -3261 -2903 362
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10296 -11338 -894 -1115 -6633 -15 * *
+ 219 -2708 629 -846 -4412 -220 -4255 -3125 1676 -970 1797 399 -3899 95 -3632 -3810 -1054 -758 1262 -2992 -93 363
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10296 -11338 -894 -1115 -5533 -32 * *
+ 220 -313 -2920 -3513 -2945 412 -1204 241 1107 -24 -1364 369 -485 -731 430 -3058 -1197 -860 -2366 -3328 3514 364
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10338 -11380 -894 -1115 -6616 -15 * *
+ 221 -334 -3932 149 -556 -4238 -1152 -2135 -945 -585 76 -3025 -2116 3016 -59 118 -992 -36 -1180 -4125 -3451 365
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10338 -11380 -894 -1115 -4920 -48 * *
+ 222 110 -3184 -3198 353 -3232 -3887 -2617 -928 -728 2226 -2354 -574 -879 346 -2871 -2854 11 900 -3559 -3099 366
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10417 -11459 -894 -1115 -6583 -15 * *
+ 223 -13 -4032 879 2200 -4353 -352 -2193 -1033 1113 -982 228 -470 -65 923 -585 -2440 -2499 -3654 -4216 -397 367
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10417 -11459 -894 -1115 -4150 -84 * *
+ 224 300 -4147 -876 -851 -4464 -533 -2321 -1420 -712 -4161 -50 3066 728 869 -2409 10 -2625 -1242 -4334 597 368
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -10560 -11602 -894 -1115 -2864 -213 * *
+ 225 -402 -4440 483 290 -4761 -321 667 -1437 1100 -52 -3530 -2579 781 563 1038 -286 14 -580 -4624 288 369
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -10880 -11922 -894 -1115 -3343 -150 * *
+ 226 -73 -4526 -78 952 -399 1474 -358 -805 -1222 250 -3623 837 -74 -2318 -464 -225 -133 -1571 230 -607 370
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11041 -12083 -894 -1115 -2700 -241 * *
+ 227 -27 -440 -1489 1746 -428 -1272 -537 -4848 -776 -100 -3868 -1273 1279 849 586 291 -827 -1061 -4963 399 371
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -179 -11252 -3102 -894 -1115 -267 -2564 * *
+ 228 -412 -736 706 1472 -2130 1457 -293 -1123 -182 -1271 -4470 135 -894 249 -1276 -261 -589 -63 -5565 -70 372
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11896 -12938 -894 -1115 -4349 -73 * *
+ 229 492 1349 381 993 -604 -2740 -118 -127 -537 78 -4426 -1057 -2229 302 -474 -861 926 -507 -419 1350 373
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11896 -12938 -894 -1115 -4349 -73 * *
+ 230 -1746 -889 -745 -715 -5704 3127 -1002 -2362 1 -5399 -358 112 -147 -670 -3631 -309 -2232 -5005 -5567 -4884 374
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11896 -12938 -894 -1115 -4349 -73 * *
+ 231 -1643 191 -1625 -2723 257 -2838 -1313 1749 -2335 1771 2596 -5382 -5795 -2012 -5295 -386 -1480 -893 -4488 1165 375
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11896 -12938 -894 -1115 -4349 -73 * *
+ 232 -703 -839 -2414 -2690 -4078 3498 -4493 -3621 -5063 -1215 -1092 -5099 -1965 -4788 -2163 -2659 -4118 -958 -4559 -1198 376
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11896 -12938 -894 -1115 -4349 -73 * *
+ 233 -1661 895 -2101 -5862 966 -2400 -1268 -146 -728 -1069 244 -1388 -5792 -5101 3228 -4824 -1934 552 1446 -758 377
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11896 -12938 -894 -1115 -4349 -73 * *
+ 234 -2506 -4031 -2101 -5880 -3985 -5744 -4614 2761 -645 940 239 -5380 -5794 -561 -2315 -942 -2287 1411 -441 964 378
+ - -147 -500 233 43 -381 398 105 -627 210 -466 -721 275 393 45 96 359 117 -366 -295 -250
+ - -34 -5420 -12938 -72 -4361 -45 -5026 * *
+ 235 307 2285 -6733 -6098 419 3046 -4823 -2151 -1710 -4085 -1322 -2251 -6002 -5324 -5504 -1141 -2293 397 -4694 -1395 380
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -11 -12109 -7088 -894 -1115 -701 -1378 * *
+ 236 -962 -5574 -97 1759 -1302 -1286 507 -2567 825 -1860 -533 -333 -5171 534 665 -1808 1323 -230 -5758 1048 381
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -12 -12099 -6941 -894 -1115 -395 -2063 * *
+ 237 -2710 -137 -6741 -6105 1258 -5943 -4814 1293 -2559 2597 -3425 -1325 -1536 -1931 -5500 -2730 -2329 -246 -631 -534 382
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -12 -12098 -6988 -894 -1115 -1440 -663 * *
+ 238 204 -910 1717 1354 -2135 -1889 -1190 -5637 653 -5581 -1541 468 1949 -599 -1388 169 -444 -5187 -5748 -5065 383
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -40 -12087 -5214 -894 -1115 -262 -2589 * *
+ 239 -797 105 -213 1706 -1230 -686 183 -1849 1050 -1140 -1526 218 -122 1487 72 -720 58 -651 -5732 -5050 384
+ - -150 -501 234 42 -382 397 104 -623 209 -467 -722 274 395 44 95 361 119 -364 -296 -251
+ - -477 -3742 -2273 -21 -6110 -2386 -306 * *
+ 240 276 -565 -1171 230 -5558 -972 -3396 -5309 530 -5253 -4326 -18 3142 -2936 -995 647 -420 -4859 -5420 -4737 386
+ - -148 -501 234 46 -378 397 104 -624 209 -467 -722 274 392 44 97 359 118 -371 -296 -245
+ - -47 -4965 -12779 -1732 -517 -323 -2319 * *
+ 241 -1000 791 -2180 -106 -555 -2818 -4693 1371 -50 789 2704 -5373 -5893 673 -5312 -1360 177 1109 -4664 -4313 391
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12045 -13087 -894 -1115 -125 -3594 * *
+ 242 -1461 -5587 -282 -130 -5908 -1976 -1154 -5658 -161 -2236 -4676 -140 552 -3286 -1503 2279 2200 -2881 -5770 -1939 392
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 243 527 -4242 -6676 -1015 1572 -2079 -4811 38 -1843 2145 -397 -5565 -724 -2174 -1585 -2058 -1006 375 976 -4354 393
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 244 706 -5586 1263 1590 -2333 561 148 -1611 183 -2507 -4676 -1189 -1034 555 436 376 -2085 -1940 -723 -950 394
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 245 309 -5586 2192 2201 -2396 -1957 -1360 -1848 -749 -5602 -1509 296 -5181 831 -2177 -584 -731 -557 -5770 -1668 395
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -260 -12109 -2602 -894 -1115 -701 -1378 * *
+ 246 -862 -712 -6541 -5905 3014 -5744 -4615 1180 -5500 1914 787 -5390 -2138 -5120 -5299 -4829 -4135 -946 -457 -219 396
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -16 -11850 -6527 -894 -1115 -3504 -133 * *
+ 247 1882 1173 -6501 -2493 -3942 -2666 -4580 1898 -5462 646 -3191 -5352 -5757 -5086 -2376 -1161 -657 1681 -4447 -4105 397
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11849 -12891 -894 -1115 -4596 -61 * *
+ 248 587 -928 842 745 -2023 -724 352 -1707 1643 -538 -1031 576 -4933 1126 414 -155 -1943 -2616 -5521 -4839 398
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -15 -11849 -6657 -894 -1115 -4596 -61 * *
+ 249 -233 -5312 652 -526 145 -2447 1575 -443 1336 -939 -1192 -539 -4923 695 1805 -1160 -3793 -738 -5499 1294 399
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11834 -12877 -894 -1115 -36 -5338 * *
+ 250 -117 -146 -6753 -6117 501 -5955 -4826 1867 -5712 1421 -450 -5601 -6005 -2059 -2515 -5039 -2348 2280 -647 -864 400
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 251 1149 -1119 -2236 -598 -5901 -2789 -1122 -1811 3032 -1809 -567 -1930 -5182 -552 -311 148 -1170 -2866 -5767 -1856 401
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 252 532 -1150 588 1966 -5908 -2018 -1254 -2640 1395 -2387 -4676 425 -2413 1173 -970 263 252 -5209 -5770 -5087 402
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 253 442 -5440 -2173 -3499 -370 -1095 1022 265 1455 -354 -4547 458 -5224 52 1547 637 -796 -272 -591 -5022 403
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -15 -12109 -6628 -894 -1115 -701 -1378 * *
+ 254 -4408 -1001 -6754 -6118 1947 -5956 -4828 410 -5713 2604 602 -5603 -1307 -5335 -5513 -1858 -1121 -155 -4691 -831 404
+ - -148 -488 231 44 -377 403 104 -628 214 -468 -722 279 392 43 94 357 116 -371 -296 -251
+ - -564 -3252 -2195 -15 -6613 -1580 -587 * *
+ 255 57 -895 186 -20 -5557 1618 -147 -5308 552 -2729 -4325 1856 490 -221 275 248 -1942 -2352 -5419 -1599 406
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11739 -12782 -894 -1115 -2742 -234 * *
+ 256 364 720 -620 -1419 -1588 -2610 -982 1653 -2470 1540 -1043 -5210 25 -4930 -1872 -1079 -862 1182 -4402 -336 407
+ - -135 -504 229 45 -385 400 102 -630 209 -466 -724 271 396 41 92 357 125 -367 -298 -253
+ - -231 -3842 -3677 -2051 -398 -412 -2011 * *
+ 257 -642 -5427 299 1811 -2096 178 -162 -5499 562 -1742 -4516 32 1695 849 -1317 -216 214 -5049 -573 -4927 417
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11941 -12983 -894 -1115 -2166 -364 * *
+ 258 -129 -80 -572 -594 -223 772 2155 -1085 805 -5471 -1310 544 -1406 -347 307 331 517 -1890 -5639 1173 418
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2005 -11973 -414 -894 -1115 -1547 -605 * *
+ 259 -948 -2834 -3138 -686 -2860 1137 -2455 1494 645 22 -2011 -386 -3782 -157 -2752 -2689 756 827 -3227 1500 419
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -95 -10136 -3996 -894 -1115 -6691 -14 * *
+ 260 -2471 -2355 -445 -3861 646 870 -2831 -73 -656 1715 896 -3508 -658 -3214 -3448 -952 251 -1772 -2807 2066 420
+ - -150 -503 234 46 -380 406 107 -630 207 -470 -724 280 390 59 95 356 116 -370 -298 -253
+ - -5208 -170 -3575 -7 -7629 -6721 -14 * *
+ 261 -630 -3568 -331 -229 -412 -883 2097 -770 1368 -931 -2662 -1766 -3216 212 2244 -2032 -378 184 -3763 -3092 422
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -9918 -10960 -894 -1115 -4503 -65 * *
+ 262 -892 820 -499 204 -4067 -3256 1463 8 -324 -3764 -2838 -276 2271 903 -206 874 -2220 -828 -3933 776 423
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10089 -11131 -894 -1115 -5628 -29 * *
+ 263 785 902 -4799 -995 127 483 656 785 -3789 -2254 -1607 -3708 1696 -3432 -627 -3177 -2502 1667 1387 330 424
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2 -10136 -11178 -894 -1115 -9 -7368 * *
+ 264 -893 -4235 -2719 -6107 -544 -2056 -4824 1929 -5704 1625 -372 -1433 -912 -1317 -1706 -5037 -1087 2061 -4692 -4350 425
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 265 -540 -1055 -2309 -2183 -344 -2719 434 -1114 353 -1539 -536 -1852 -911 1067 3011 -728 -1025 133 -584 -5033 426
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 266 -425 -122 -6746 -2036 534 -5953 813 1050 -2719 518 -1292 -2239 -6003 -5330 -2498 -916 -105 2272 -4692 1829 427
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 267 1494 564 -2592 -1873 -4348 447 -4600 487 -2507 -1630 -3568 774 -324 -4772 -5095 -326 2 1742 1144 168 428
+ - -151 -504 224 28 -384 452 95 -632 204 -466 -749 275 405 43 85 362 100 -380 -308 -257
+ - -1959 -429 -13151 -1122 -888 -701 -1378 * *
+ 268 -138 -5586 2357 130 -381 373 -460 -2594 562 -1969 -4675 952 -1017 -981 -878 449 -782 -1462 -772 -1933 438
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 269 -397 -5559 -1460 -256 -10 683 -153 -1707 448 1273 22 -701 908 -299 -579 -788 164 -698 -5750 -910 439
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 270 -984 -5587 1954 805 -2267 -832 45 -2414 745 -3331 -4676 1543 1134 389 -880 65 -1157 -2007 315 -5087 440
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 271 -391 -955 -320 776 -1253 -2890 163 -1303 1848 -5603 -1333 -301 -1005 1341 1757 44 246 -5209 -5770 -5087 441
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 272 -2000 -5583 -703 700 -1330 -1905 -495 -401 1151 -1019 658 285 1387 661 200 33 500 -655 -5767 35 442
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 273 -1749 262 -6772 -6137 -1117 -5976 -4849 2805 -5733 -267 -1088 -2138 -979 -2090 -5533 -5061 -2404 2556 -4714 -4371 443
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 274 -1963 478 -2244 -286 -5908 -933 1305 -5659 2388 -3184 -4676 208 -5180 968 1477 892 11 -5209 -5770 -1856 444
+ - -150 -501 231 42 -382 397 111 -623 218 -468 -722 274 395 44 94 358 121 -371 -280 -251
+ - -28 -5720 -13151 -2264 -337 -701 -1378 * *
+ 275 -4118 -1071 -1047 -2241 -5907 -5092 -3750 -2798 2506 -5602 -1572 -1190 -5185 -1804 2347 59 1857 -2896 -5770 -5089 450
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 276 -1186 -4708 -7339 -6742 -611 -1936 -5556 2172 -6373 -1389 -1424 -6258 -2611 -6022 -6202 -5719 -2322 3183 -5397 -5043 451
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 277 3208 555 -6753 -6117 -943 857 -4827 -2157 -5712 -1551 -1160 -5601 -2343 -5335 -5512 -1990 -4348 -2265 -4692 -306 452
+ - -150 -501 235 45 -376 398 105 -627 209 -467 -721 274 393 44 95 358 119 -363 -295 -250
+ - -43 -5105 -13151 -996 -1004 -701 -1378 * *
+ 278 -1467 -4369 -6904 -6271 -317 -6116 -4992 2264 -5871 883 349 -5762 -6155 -5488 -5671 -5204 -2393 2483 2231 -858 455
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 279 -998 4484 -6753 -6117 34 -1026 -1204 909 -5712 383 -3437 -2331 -6005 -5335 -5512 -1448 -1062 1580 -4692 -4350 456
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 280 1311 1656 -7285 -6996 -7037 1861 -6571 -6687 -6785 -3130 -6178 -231 300 -2206 -6866 1605 1462 -2687 -7360 -7064 457
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 281 -10421 -8931 -9885 -10273 -10452 3868 -9526 -11566 -10466 -10858 -10853 -10282 -9334 -10356 -9878 -10965 -10599 -11224 -9101 -10471 458
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -16 -12109 -6498 -894 -1115 -701 -1378 * *
+ 282 1337 -684 24 -4759 -226 576 -4424 -4048 -2571 -2655 -3679 -4783 -5710 -4415 -2456 2804 -1378 -2297 -4910 -662 459
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12093 -13136 -894 -1115 -1642 -557 * *
+ 283 1033 -1081 -8491 -8809 -1491 3486 -7717 -8101 -8391 -3235 -7424 -6823 -6797 -7838 -2250 -1206 -5563 -6858 -8532 -8477 460
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12093 -13136 -894 -1115 -1642 -557 * *
+ 284 1379 -139 447 -3545 -614 1709 -1244 -2503 -1504 -1099 -578 -344 -996 1296 -3938 922 -1400 -4900 -5580 186 461
+ - -151 -502 233 41 -378 398 111 -629 215 -468 -723 276 391 43 96 365 117 -372 -297 -252
+ - -2382 -2834 -582 -11 -7022 -1642 -557 * *
+ 285 -2636 -4108 1757 449 73 797 -2268 -1162 113 -4124 -3197 1110 -951 -211 -700 1018 84 -205 -4291 -3609 463
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1094 -10503 -913 -894 -1115 -151 -3332 * *
+ 286 -2213 -279 1976 416 -104 -109 -3384 -5298 187 -5242 -4316 -211 -2058 -2925 -1180 2516 -3692 -4848 -5409 -4726 464
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11718 -12760 -894 -1115 -461 -1871 * *
+ 287 -110 -4145 -1800 -206 2382 -2842 -4728 -1427 -5597 1539 520 -5494 -5909 -1822 -2327 -1358 -4255 688 1112 1923 465
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12015 -13057 -894 -1115 -1581 -587 * *
+ 288 -261 -497 -6688 -2668 1394 -1883 -4760 2497 -5646 1344 -237 -5535 -2366 -5269 -5446 -4974 -2075 277 2318 166 466
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -180 -12042 -3095 -894 -1115 -2975 -196 * *
+ 289 -279 -720 1062 1229 -2120 -330 1446 -828 673 -2213 644 326 476 -893 561 310 -2121 -1537 -5534 -1528 467
+ - -151 -489 233 43 -383 396 103 -624 210 -462 -713 273 397 50 96 358 117 -372 -297 -252
+ - -220 -2919 -6756 -427 -1965 -1264 -777 * *
+ 290 144 -5439 857 1625 -5760 -2779 -1195 -616 761 302 -4528 -1941 -1473 1627 146 -420 -22 -1242 -5622 -4939 470
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11954 -12996 -894 -1115 -3957 -96 * *
+ 291 3091 -686 -6603 -5967 411 -5805 -4677 718 -2420 -1107 -3287 -5451 -2259 -5185 -5362 -2665 -2250 15 -4542 62 471
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -28 -11954 -5743 -894 -1115 -59 -4634 * *
+ 292 1027 -4748 -4719 -999 78 -2841 -1342 1039 1554 6 1101 -697 -5502 454 937 -694 -4166 -606 -588 -5 472
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12085 -13127 -894 -1115 -926 -1078 * *
+ 293 993 -5574 -271 345 -461 289 -378 -1735 1047 -3347 -1389 986 -2470 1182 1015 158 -375 -2021 -5758 -5075 473
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -56 -12096 -4711 -894 -1115 -358 -2186 * *
+ 294 1182 529 -221 352 -636 -2752 -3752 -758 956 287 563 -48 -5176 709 -244 -1000 -1043 182 -5600 621 474
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -16 -12054 -6573 -894 -1115 -2760 -230 * *
+ 295 -1826 -5520 570 -1549 -2107 2903 -3679 -5592 1408 -3053 -4609 16 -990 63 -227 -2570 -2317 -5142 -5703 -5021 475
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12039 -13081 -894 -1115 -3024 -189 * *
+ 296 2827 1985 -2450 -1877 -1784 -5886 -1356 -222 -5638 -133 -1134 -5529 -5936 -595 -5441 -4970 -4280 1337 -4625 -4282 476
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -3344 -12039 -150 -894 -1115 -3024 -189 * *
+ 297 -1372 -1786 -1996 -1429 -1823 -2598 1693 1322 690 886 -961 1763 -2672 -1148 -1513 -1583 1367 -1246 -2167 -1728 477
+ - -150 -501 231 42 -382 397 104 -623 211 -467 -722 277 399 47 94 358 116 -368 -296 -239
+ - -3865 -104 -9742 -18 -6371 -20 -6213 * *
+ 298 -6624 -8747 4035 -538 -8850 -1294 -5791 -2852 -6274 -8688 -8166 -4891 -6918 -561 -7351 -1974 -6738 -8291 -8897 -7712 479
+ - -150 -461 237 42 -377 397 104 -628 209 -467 -722 274 392 44 95 358 116 -371 -296 -236
+ - -71 -4385 -13140 -725 -1341 -382 -2104 * *
+ 299 1401 2155 -7445 -6848 -1090 -6725 -5667 318 -6483 1605 -355 -6372 -6729 -6117 -6307 -5836 -68 2047 -5482 -5143 482
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 300 -7202 -6661 -9453 -8994 2861 -9128 -7195 -93 -8744 1582 -4071 -8621 -8525 -7737 -8328 -8403 -2351 -285 -6218 3238 483
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 301 -6775 -6220 -9410 -9033 -394 -9300 -8885 3120 -8981 1306 -4497 -8973 -8744 -8401 -8895 -8713 -6731 1855 -7642 -7570 484
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 302 -1262 -4975 -7515 -7124 -2051 -6016 -5860 -4991 -6737 -3230 -4676 -1990 -6466 -6327 -6514 882 3750 -2443 -5821 -1520 485
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 303 329 -5763 -2245 -8060 -8470 3496 -7639 -8304 -8296 -8552 -261 -6700 -6821 -7682 -8033 439 -5618 -6974 -8686 -8623 486
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 304 -6643 -8789 3192 2865 -8864 -6322 -175 -8888 -6285 -8702 -8182 -2237 -6930 -5500 -7366 -1858 -6755 -8310 -8912 -7723 487
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 305 -809 -816 -6753 -6117 -254 -1835 -4826 1955 -2398 1388 2021 -5601 -578 -5334 -5511 -5039 -380 1793 -4691 -1817 488
+ - -153 -489 231 56 -385 396 116 -626 211 -470 -725 274 392 45 95 357 113 -370 -262 -240
+ - -63 -4561 -13151 -2530 -274 -701 -1378 * *
+ 306 -2682 -5587 -666 -1124 -5909 -725 -3747 -5659 2698 -5604 -4677 -1283 -2202 -3287 169 1629 974 -2462 -5771 708 500
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 307 -8472 -7545 -8859 1194 -1040 -3052 3855 -7474 -8737 -2301 -6904 -7514 -2213 -2165 -8222 -8100 -8338 -7595 2888 3530 501
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 308 -1094 -5587 270 -393 -5908 -2804 4676 -2672 -552 -5603 -4676 -1240 -87 -580 -344 -360 -4053 -2417 -5770 -1548 502
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 309 -142 -5504 2077 1195 -1409 -1977 -249 -1790 -3371 -2291 -4603 -1861 -110 972 -3872 -920 1610 554 -5710 -794 503
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 310 2219 -1014 -6751 -6115 788 -556 -4825 427 -2629 -1564 -279 -5600 -2618 -2071 -895 -2896 -1037 1025 2781 1326 504
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 311 -1340 -4639 -2556 -2404 -68 -5541 2887 290 -1439 1390 1600 -2008 -5615 1181 510 -160 -4221 21 -5035 -485 505
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 312 -71 -5530 2350 1566 -1277 -2014 -943 -559 -1410 26 -517 -1125 -2434 -1090 -2178 -353 -184 -949 344 116 506
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 313 3028 -787 -6749 -6114 -672 -1833 -556 -1606 -5709 -742 1358 -2136 -6004 -5332 -2441 -1296 -1094 -1490 -4691 1224 507
+ - -147 -500 233 43 -381 398 105 -627 210 -466 -721 275 393 45 96 361 119 -370 -295 -250
+ - -52 -5902 -5760 -652 -1460 -701 -1378 * *
+ 314 -840 -916 -924 954 -1292 -1954 -1222 354 1489 384 -63 229 -5169 409 1325 -1726 -725 25 -5710 -1738 510
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12083 -13125 -894 -1115 -798 -1235 * *
+ 315 899 -5574 687 2560 -1921 -1396 289 -2563 -1217 -3068 -625 428 -5169 -87 -2229 867 -2432 -1711 -5758 -5075 511
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12097 -13139 -894 -1115 -1461 -651 * *
+ 316 95 1463 -609 -521 -2210 -2039 886 -943 959 981 948 863 -2402 922 410 107 -1666 -2689 -5750 -1850 512
+ - -146 -500 232 42 -381 402 105 -627 210 -465 -721 275 393 45 95 358 117 -370 -295 -250
+ - -93 -6018 -4403 -1529 -614 -372 -2139 * *
+ 317 -1824 -5533 -289 -1325 -5855 3170 327 -5605 -227 -3134 -4623 1389 -5125 -1577 -774 -1771 -3999 -5156 -5716 -1585 518
+ - -148 -501 231 42 -382 399 104 -620 211 -465 -722 276 394 47 97 358 118 -371 -296 -251
+ - -81 -5304 -5091 -1869 -462 -652 -1459 * *
+ 318 -2532 -4170 -6683 -6047 -540 -5890 -4761 2445 -755 1652 1043 -5534 -1060 -1069 -1557 -1432 -613 1072 -4628 -4286 525
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -12044 -13086 -894 -1115 -2947 -200 * *
+ 319 1353 1452 -4569 -4012 -4845 -1711 1504 -1572 -2203 -713 -3942 2036 514 -1963 -1962 1125 739 -930 -5137 -1654 526
+ - -150 -501 232 42 -381 398 105 -627 212 -467 -709 278 393 44 95 360 116 -366 -295 -250
+ - -47 -4962 -13086 -753 -1298 -122 -3625 * *
+ 320 -2054 -852 -6772 -6137 1060 -3003 -4849 891 -5733 1746 1200 -5622 -6025 -5356 -5533 -5061 -1664 2373 -4713 285 529
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 321 -790 -1100 -7735 -7154 604 -7054 -6024 3140 -6808 589 -513 -6703 -7024 -6431 -6638 -6180 -5266 1569 -5788 -420 530
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 322 557 954 3061 104 -1156 -1917 -4816 -1345 -5676 303 -929 -5578 -5998 -5308 -5493 -1152 -508 -81 -4695 -855 531
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 323 2015 2412 -6754 -6118 -616 -57 -4827 1593 -5713 -157 834 -5602 106 -5336 -5513 -2076 -1178 743 -4692 -4350 532
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 324 -1500 -6174 -1474 -303 -1402 3278 -4305 -6309 -3981 -6251 -5349 201 -184 -3868 -2452 -416 -137 -5841 -6423 -5706 533
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 325 -10320 -8913 -9757 -10035 -9858 -8870 5463 -11349 -9602 -10663 -10609 -10021 -9297 -9868 -2269 -10768 -10436 -11051 -8920 -9653 534
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -22 -12109 -6044 -894 -1115 -701 -1378 * *
+ 326 -1327 -4596 -2274 -2449 1902 -5537 2630 -4184 -2325 -1230 -177 -2202 -5610 -2101 -4608 977 -622 -2194 2097 3270 535
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -232 -12087 -2751 -894 -1115 -269 -2556 * *
+ 327 2014 -824 -2132 1302 -354 -562 -235 -5437 -1952 -5383 -882 1896 -871 -257 -258 -277 -3836 -1444 -510 -706 536
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11881 -12923 -894 -1115 -42 -5109 * *
+ 328 -1765 -4255 -2543 -6046 -4214 -3002 -4824 38 -5661 -1657 164 -5570 -6001 -2024 -5492 2120 3060 -1069 -4716 -4372 537
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 329 -8164 -8910 -1363 3949 -9764 -7579 -7291 -10175 -7833 -9827 -9467 -6545 -8137 -7112 -8597 -7842 -8280 -9664 -9039 -9016 538
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 330 -1129 -1191 -538 378 -2348 -5101 484 -1326 460 -1466 -543 342 -5194 361 2394 -150 18 -355 1568 653 539
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 331 -1052 -1054 -1677 -1331 1811 425 98 1074 -2781 117 -3439 -5589 1811 -5321 -5502 -5035 -4346 1268 -4693 1380 540
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 332 542 -787 -6754 -6118 2653 2112 -4827 -834 -5713 -4083 1865 -5602 -6006 -5336 -5513 -5041 -820 -72 1582 973 541
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 333 -265 5 -6739 -2842 -1159 -2121 -1089 1397 361 1301 2190 -1004 -1064 -5327 -5506 -2960 -1137 1672 -4692 -1808 542
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 334 -361 -5587 538 1253 -2156 -513 -428 -1750 1569 -2366 -4676 59 425 1424 846 -556 -4053 -1836 -512 61 543
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 335 1315 -5571 469 318 -2416 -1487 631 107 610 109 -4662 -3730 -660 -572 709 -483 224 -467 -5759 -277 544
+ - -154 -496 231 40 -383 392 99 -625 214 -454 -690 271 398 58 97 355 112 -366 -288 -256
+ - -137 -3470 -13151 -2149 -369 -701 -1378 * *
+ 336 -1262 -662 -8280 -7661 1293 -7606 -6454 1196 -7306 2645 1075 -7264 -7428 -6718 -7042 -6738 -5833 279 -599 -5794 550
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -12 -12109 -6921 -894 -1115 -701 -1378 * *
+ 337 2188 468 -2328 -48 -791 676 -1340 -1829 545 -1775 1249 -3861 -5257 634 357 -1018 -4078 -918 -5556 -301 551
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12098 -13140 -894 -1115 -374 -2130 * *
+ 338 -54 -1071 1092 2178 -5908 -261 -3746 -2803 823 -3250 -4676 375 -2575 1053 923 -712 -769 -2831 -5770 -5087 552
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 339 -1414 -4812 -1405 -792 137 -5421 1251 -69 910 737 -525 -4306 -5500 1059 1392 -1374 -2520 -214 1978 1786 553
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - 0 -12109 -13151 -894 -1115 -701 -1378 * *
+ 340 -2822 -5568 -2787 -7707 615 -7660 -6585 1049 -7376 2928 -484 -7317 -7500 -6851 -7152 -6806 -2490 -166 -6123 -5923 554
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -23 -12109 -6021 -894 -1115 -701 -1378 * *
+ 341 -230 -5566 -556 1123 -5887 -1500 128 -2805 1586 -3302 -478 380 -5159 1002 1288 820 386 -1654 -5749 -1889 555
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -11 -12087 -7066 -894 -1115 -812 -1216 * *
+ 342 223 -5567 315 2160 -5888 -1035 -1341 -1683 1461 -2187 -4656 860 -2314 839 218 -63 -2065 -2876 -5750 -5067 556
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -15 -12088 -6652 -894 -1115 -1842 -472 * *
+ 343 217 -5549 -287 1057 -23 -1032 1172 -5618 1478 -306 -310 432 -5148 627 822 -3961 -447 -1321 1896 -985 557
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -2247 -12074 -342 -894 -1115 -2295 -329 * *
+ 344 155 -3231 -302 -297 -271 1843 -1807 -609 -216 550 -2355 1719 -3221 -1402 -1933 -243 -2037 -2786 1341 -2895 558
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -289 -9829 -2470 -894 -1115 -160 -3251 * *
+ 345 -718 554 -1351 -2529 2824 -1174 -1315 -544 -1166 1377 -1126 -2257 -1363 -1146 -5220 -2763 -577 262 -411 1025 559
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11930 -12972 -894 -1115 -1499 -630 * *
+ 346 51 -5474 1479 120 -2041 764 -164 -5546 1119 -2333 -4563 -36 1419 534 571 2 -3940 -2810 -5657 -1376 560
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -582 -11991 -1593 -894 -1115 -3630 -121 * *
+ 347 447 -4927 1668 758 -5248 -160 741 -1220 819 -919 -4017 572 -88 422 -1379 -1937 501 -786 160 -4428 561
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -405 -11410 -2034 -894 -1115 -3691 -116 * *
+ 348 715 316 344 -188 83 -946 546 -282 657 -13 -3695 491 -668 665 447 -1682 -644 -91 -4792 156 562
+ - -151 -513 231 54 -377 414 119 -623 196 -462 -717 289 387 28 74 348 105 -346 -227 -252
+ - -1805 -487 -12119 -1982 -421 -3647 -120 * *
+ 349 -239 -4711 199 2304 -5032 -417 -2870 -4783 862 -4727 -3800 1156 -80 1017 200 -543 -1392 -2035 163 -4211 583
+ - -149 -500 233 43 -381 399 106 -626 210 -466 -720 275 394 45 96 359 117 -369 -294 -249
+ - -1 -11175 -12217 -894 -1115 -14 -6736 * *
+ 350 -860 161 -6909 -2858 894 -6127 -5013 2305 -5884 767 -3572 -5773 -6169 -5512 -5690 -5216 -1702 2523 -585 -4528 584
+ - * * * * * * * * * * * * * * * * * * * *
+ - * * * * * * * * 0
+//
diff --git a/demotic/examples/example.hmmsearch.out b/demotic/examples/example.hmmsearch.out
new file mode 100644
index 0000000..f5a5de9
--- /dev/null
+++ b/demotic/examples/example.hmmsearch.out
@@ -0,0 +1,17949 @@
+# hmmsearch :: search profile(s) against a sequence database
+# HMMER 3.0 (March 2010); http://hmmer.org/
+# Copyright (C) 2010 Howard Hughes Medical Institute.
+# Freely distributed under the GNU General Public License (GPLv3).
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# query HMM file: example.hmm
+# target sequence database: /misc/data0/databases/Uniprot/uniprot_sprot.fasta
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+Query: US2 [M=126]
+Accession: PF02476.8
+Description: US2 family
+Scores for complete sequences (score includes all domains):
+ --- full sequence --- --- best 1 domain --- -#dom-
+ E-value score bias E-value score bias exp N Sequence Description
+ ------- ------ ----- ------- ------ ----- ---- -- -------- -----------
+ 4.2e-39 138.8 0.3 4.2e-39 138.8 0.2 1.7 2 sp|P06485|US02_HHV11 Protein US2 OS=Human herpesvirus 1 (st
+ 2e-38 136.6 0.2 3.6e-38 135.8 0.1 1.4 1 sp|P13292|US02_HHV2H Protein US2 OS=Human herpesvirus 2 (st
+ 1.6e-35 127.2 0.1 2.2e-35 126.8 0.0 1.1 1 sp|Q05106|US453_GAHVG Uncharacterized 16.6 kDa protein OS=Ga
+ 2.3e-35 126.8 0.0 3.9e-35 126.0 0.0 1.3 1 sp|P32517|US02_EHV1K US1 protein OS=Equine herpesvirus 1 (s
+ 3.3e-33 119.8 0.0 6.4e-33 118.9 0.0 1.5 1 sp|P28964|US02_EHV1B Gene 68 protein OS=Equine herpesvirus
+ 2.1e-31 114.0 0.0 3.6e-31 113.2 0.0 1.4 1 sp|Q08099|US02_BHV1S Protein US2 homolog OS=Bovine herpesvi
+ 1.8e-17 68.9 0.0 3.3e-17 68.1 0.0 1.4 1 sp|P24382|US02_SUHVN Protein US2 homolog OS=Suid herpesviru
+ ------ inclusion threshold ------
+ 1.4 14.3 0.1 2.6 13.5 0.0 1.4 1 sp|Q9ZK80|ATPG_HELPJ ATP synthase gamma chain OS=Helicobact
+ 1.4 14.3 0.1 2.6 13.5 0.0 1.4 1 sp|P56082|ATPG_HELPY ATP synthase gamma chain OS=Helicobact
+ 1.5 14.2 0.1 2.9 13.3 0.0 1.4 1 sp|B2UUP1|ATPG_HELPS ATP synthase gamma chain OS=Helicobact
+ 1.5 14.2 0.0 2.9 13.3 0.0 1.4 1 sp|B6JMX3|ATPG_HELP2 ATP synthase gamma chain OS=Helicobact
+ 2.6 13.4 0.0 4.8 12.6 0.0 1.4 1 sp|Q17Y79|ATPG_HELAH ATP synthase gamma chain OS=Helicobact
+ 3.6 13.0 0.0 6.6 12.2 0.0 1.4 1 sp|B5Z8D1|ATPG_HELPG ATP synthase gamma chain OS=Helicobact
+ 3.9 12.9 0.0 7.3 12.0 0.0 1.4 1 sp|Q1CSD4|ATPG_HELPH ATP synthase gamma chain OS=Helicobact
+
+
+Domain annotation for each sequence (and alignments):
+>> sp|P06485|US02_HHV11 Protein US2 OS=Human herpesvirus 1 (strain 17) GN=US2 PE=1 SV=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? -2.0 0.0 4.5 1.6e+05 88 116 .. 50 78 .. 49 86 .. 0.74
+ 2 ! 138.8 0.2 1.1e-43 4.2e-39 2 126 .] 111 247 .. 110 247 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: -2.0 bits; conditional E-value: 4.5
+ US2 88 vvdpealreeaslrppepakrseresske 116
+ vv+p+ lr +a++ + p+++++ ++++
+ sp|P06485|US02_HHV11 50 VVRPANLRRLAEPLMDLPKPTRPIVRTRS 78
+ 67888888888888888888887777776 PP
+
+ == domain 2 score: 138.8 bits; conditional E-value: 1.1e-43
+ US2 2 Lnsgiign.rpyhLWvlGAADLCkpvlelipgpk...RlvavkvpdawagksWalPdelkplltvewtpfeeaalskleallsakrlvY 86
+ L+++++++ r+yhLWv+GAADLC p+le++++ + R++a+k+pdaw+g++Wa+P+++ p++tv+wtpf++a++++le+lls+++++Y
+ sp|P06485|US02_HHV11 111 LHRDQPSPpRLYHLWVVGAADLCVPFLEYAQKIRlgvRFIAIKTPDAWVGEPWAVPTRFLPEWTVAWTPFPAAPNHPLETLLSRYEYQY 199
+ 888888888******************************************************************************** PP
+
+ US2 87 avvdp..........ealreeaslrppepakrseresskeapsraaccis 126
+ +vv p ++lr++++l++p+pa++++ ++s++ r++cc++
+ sp|P06485|US02_HHV11 200 GVVLPgtngrerdcmRWLRSLIALHKPHPATPGPLTTSHP--VRRPCCAC 247
+ ***************************************9..******97 PP
+
+>> sp|P13292|US02_HHV2H Protein US2 OS=Human herpesvirus 2 (strain HG52) GN=US2 PE=1 SV=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 135.8 0.1 9.8e-43 3.6e-38 1 126 [] 110 246 .. 110 246 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 135.8 bits; conditional E-value: 9.8e-43
+ US2 1 lLnsgiign.rpyhLWvlGAADLCkpvlelipgpk...RlvavkvpdawagksWalPdelkplltvewtpfeeaalskleallsakrlv 85
+ lL+++++g+ r+yhLWv+GAADLC p++e++++++ R++a+k++daw+g++W+lPd++ p++tv+wtpf++a++++le+lls+++++
+ sp|P13292|US02_HHV2H 110 LLHQERPGPhRLYHLWVVGAADLCVPFFEYAQKTRlgfRFIATKTNDAWVGEPWPLPDRFLPERTVSWTPFPAAPNHPLENLLSRYEYQ 198
+ 599******99****************************************************************************** PP
+
+ US2 86 Yavvdp........ealreeaslr.ppepakrseresskeapsraaccis 126
+ Y+vv p ++lr++++++ +p+pa+++++ ++++ ++++c+++
+ sp|P13292|US02_HHV2H 199 YGVVVPgdrersclRWLRSLVAPHnKPRPASSRPHPATHP--TQRPCFTC 246
+ ********************99996777777777777777..*****987 PP
+
+>> sp|Q05106|US453_GAHVG Uncharacterized 16.6 kDa protein OS=Gallid herpesvirus 2 (strain GA) GN=US453 PE=4 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.8 0.0 5.9e-40 2.2e-35 1 124 [. 1 116 [. 1 118 [. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 126.8 bits; conditional E-value: 5.9e-40
+ US2 1 lLnsgiignrpyhLWvlGAADLCkpvlelipgpkRlvavkvpdawagksWalPdelkplltvewtpfeeaalskleallsakrlvYav 88
+ +L+s+++gn+p++LW++GAAD+C+ +le+ip pkRl+a+kv+++w+g++Wa+Pd++++llt++w+p ++++++++++++s + +vY++
+ sp|Q05106|US453_GAHVG 1 MLESEVSGNAPHSLWIVGAADICRIALECIPLPKRLLAIKVSGTWSGMPWAIPDNIQTLLTSTWEPKFDTPEDRAHFCDSDMVCVYKI 88
+ 79************************************************************************************** PP
+
+ US2 89 vdpealreeaslrppepakrseresske..apsraacc 124
+ +++ pp+p k++e e +++ +p r +cc
+ sp|Q05106|US453_GAHVG 89 LGS----------PPNPLKPPEIEPPQMssTPGRLFCC 116
+ ***..........4444444444444444457889998 PP
+
+>> sp|P32517|US02_EHV1K US1 protein OS=Equine herpesvirus 1 (strain Kentucky A) GN=US1 PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.0 0.0 1.1e-39 3.9e-35 1 124 [. 111 265 .. 111 268 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 126.0 bits; conditional E-value: 1.1e-39
+ US2 1 lLnsgiignrpyhLWvlGAADLCkpvlelipgpkRlvavkvpdawagksWalPd.......elkplltvewt................. 65
+ +Lns++i+n+pyhLWvlGAADLCkpv++lipgpkR+v+++++d++ +ksW +P+ e++p++tve +
+ sp|P32517|US02_EHV1K 111 HLNSSLIINQPYHLWVLGAADLCKPVFDLIPGPKRMVYAEIADEF-HKSW-QPPfvcgklfETIPWTTVEHNhplklraaggedtvvge 197
+ 7********************************************.****.7888***************4445556666677777888 PP
+
+ US2 66 .pfeeaalskleallsakrlvYavvdp.......ealreeaslrppepakrseresske.apsraacc 124
+ +f+++++++l++++++ r++Yavvdp ++ r++ ++rp+e +r++r++s++ ap+r+ ++
+ sp|P32517|US02_EHV1K 198 cGFSKHSSNSLVHPPTVNRVIYAVVDParlreipAPGRPLPRRRPSEGGMRAPRRRSRApAPARSTAA 265
+ 8**************************999999999999*****************999755555544 PP
+
+>> sp|P28964|US02_EHV1B Gene 68 protein OS=Equine herpesvirus 1 (strain Ab4p) GN=68 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.9 0.0 1.7e-37 6.4e-33 1 112 [. 111 245 .. 111 262 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 118.9 bits; conditional E-value: 1.7e-37
+ US2 1 lLnsgiignrpyhLWvlGAADLCkpvlelipgpkRlvavkvpdawagksWalPd.......elkplltvewt................. 65
+ +Lns++i+n+pyhLWvlGAADLCkpv++lipgpkR+v+++++d++ +ksW +P+ e++p++tve +
+ sp|P28964|US02_EHV1B 111 HLNSSLIINQPYHLWVLGAADLCKPVFDLIPGPKRMVYAEIADEF-HKSW-QPPfvcgklfETIPWTTVEHNhplklraaggedtvvge 197
+ 7********************************************.****.7888***************4445556666677777888 PP
+
+ US2 66 .pfeeaalskleallsakrlvYavvdpealreeaslrppepakrsere 112
+ +f+++++++l+ ++++kr++Yavvdp++lre ++ p p++r+ ++
+ sp|P28964|US02_EHV1B 198 cGFSKHSSNSLVRPPTVKRVIYAVVDPARLREIPAPGRPLPRRRPSEG 245
+ 8**************************888887776644444443332 PP
+
+>> sp|Q08099|US02_BHV1S Protein US2 homolog OS=Bovine herpesvirus 1.2 (strain ST) PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 113.2 0.0 9.8e-36 3.6e-31 1 110 [. 105 208 .. 105 219 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 113.2 bits; conditional E-value: 9.8e-36
+ US2 1 lLnsgiignrpyhLWvlGAADLCkpvlelipgpkRlvavkvpdawagksWalPdelkplltvewtpfeeaalskleallsakrlvYavv 89
+ lLnsg++g+rp+h+Wv+GAADL++p++++i++++Rlv++++++++ag++W+lP ++ p+++++w+p++++al +l+a + rlvY+vv
+ sp|Q08099|US02_BHV1S 105 LLNSGRAGARPFHMWVFGAADLYAPIFAHIAATTRLVYAQLDCTFAGAAWRLP-RRGPAIASPWPPYDTPALPELVAGGVLLRLVYEVV 192
+ 69************************************************999.9********************************** PP
+
+ US2 90 dpealreeaslrppepakrse 110
+ d+ a++rp++++++++
+ sp|Q08099|US02_BHV1S 193 DR-----GAAPRPAKREPPCP 208
+ **.....88889888888765 PP
+
+>> sp|P24382|US02_SUHVN Protein US2 homolog OS=Suid herpesvirus 1 (strain NIA-3) GN=28K PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 68.1 0.0 8.8e-22 3.3e-17 1 125 [. 135 255 .. 135 256 .] 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 68.1 bits; conditional E-value: 8.8e-22
+ US2 1 lLnsgiignrpyhLWvlGAADLCkpvlelipgpkRlvavkvpdawagksWalPdelkplltvewtpfeeaalskleallsakrlvYavv 89
+ +Lnsg++g++p+hLW+lGAADLC++vl +++ R +a+ p+a++g++++ +++p+lt++ +al+ ++a + a+r+++a v
+ sp|P24382|US02_SUHVN 135 YLNSGARGTAPIHLWILGAADLCDQVLLAAS---RSTAAGAPGAPTGARLT---RRRPGLTDA------DALDVIVAGIPATRAMFARV 211
+ 8****************************99...****************5...9******99......9******************* PP
+
+ US2 90 dp..........ealreeaslrppepakrseresskeapsraacci 125
+ ++ eal++++ +r + +++r+ r++ +e ++++c+i
+ sp|P24382|US02_SUHVN 212 HNrswrhagewtEALHAQIVTRGDVRRRRGGRGNGRE--RAPRCTI 255
+ ************************************9..9999987 PP
+
+>> sp|Q9ZK80|ATPG_HELPJ ATP synthase gamma chain OS=Helicobacter pylori J99 GN=atpG PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.5 0.0 7.1e-05 2.6 51 107 .. 208 262 .. 203 283 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 13.5 bits; conditional E-value: 7.1e-05
+ US2 51 alPdelkplltvewtpfeeaalskleallsakrlvYavvdpealreeaslrppepak 107
+ ++P+e+++ +t+e + e++ l++l+ + + + l Ya++d+ l +e s r ++ +
+ sp|Q9ZK80|ATPG_HELPJ 208 PQPSETQETITSEPSGSEDEILDSLAEKYVEYSLYYALIDS--LAAEHSARMQAMDT 262
+ 5899*************************************..44444444443333 PP
+
+>> sp|P56082|ATPG_HELPY ATP synthase gamma chain OS=Helicobacter pylori GN=atpG PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.5 0.0 7.1e-05 2.6 51 107 .. 208 262 .. 203 283 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 13.5 bits; conditional E-value: 7.1e-05
+ US2 51 alPdelkplltvewtpfeeaalskleallsakrlvYavvdpealreeaslrppepak 107
+ ++P+e+++ +t+e + e++ l++l+ + + + l Ya++d+ l +e s r ++ +
+ sp|P56082|ATPG_HELPY 208 PQPSETQETITSEPSGSEDEILDSLAEKYVEYSLYYALIDS--LAAEHSARMQAMDT 262
+ 5899*************************************..44444444443333 PP
+
+>> sp|B2UUP1|ATPG_HELPS ATP synthase gamma chain OS=Helicobacter pylori (strain Shi470) GN=atpG PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.3 0.0 7.8e-05 2.9 51 107 .. 208 262 .. 203 283 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 13.3 bits; conditional E-value: 7.8e-05
+ US2 51 alPdelkplltvewtpfeeaalskleallsakrlvYavvdpealreeaslrppepak 107
+ ++P+e+++ +t+e + e++ l++l+ + + + l Ya++d+ l +e s r ++ +
+ sp|B2UUP1|ATPG_HELPS 208 PQPNETQETITSEPSGSEDEILDSLAEKYVEYSLYYALIDS--LAAEHSARMQAMDT 262
+ 5899*************************************..44444444443333 PP
+
+>> sp|B6JMX3|ATPG_HELP2 ATP synthase gamma chain OS=Helicobacter pylori (strain P12) GN=atpG PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.3 0.0 7.8e-05 2.9 51 107 .. 208 262 .. 203 283 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 13.3 bits; conditional E-value: 7.8e-05
+ US2 51 alPdelkplltvewtpfeeaalskleallsakrlvYavvdpealreeaslrppepak 107
+ ++P+e+++ +t+e + e++ l++l+ + + + l Ya++d+ l +e s r ++ +
+ sp|B6JMX3|ATPG_HELP2 208 PQPNEVQETITSEPSGSEDEILDSLAEKYVEYSLYYALIDS--LAAEHSARMQAMDT 262
+ 5899*************************************..44444444443333 PP
+
+>> sp|Q17Y79|ATPG_HELAH ATP synthase gamma chain OS=Helicobacter acinonychis (strain Sheeba) GN=atpG PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.6 0.0 0.00013 4.8 52 107 .. 209 262 .. 201 283 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 12.6 bits; conditional E-value: 0.00013
+ US2 52 lPdelkplltvewtpfeeaalskleallsakrlvYavvdpealreeaslrppepak 107
+ +P+e ++ +t+e + e++ l++l+++ + + l Ya++d+ l +e s r ++ +
+ sp|Q17Y79|ATPG_HELAH 209 QPSEAQETITSEPSGSEDEILDSLAKKYVEYSLYYALIDS--LAAEHSARMQAMDT 262
+ 899*************************************..44444444443333 PP
+
+>> sp|B5Z8D1|ATPG_HELPG ATP synthase gamma chain OS=Helicobacter pylori (strain G27) GN=atpG PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.2 0.0 0.00018 6.6 51 107 .. 208 262 .. 203 283 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 12.2 bits; conditional E-value: 0.00018
+ US2 51 alPdelkplltvewtpfeeaalskleallsakrlvYavvdpealreeaslrppepak 107
+ ++P+e ++ +t+e + e++ l++l+ + + + l Ya++d+ l +e s r ++ +
+ sp|B5Z8D1|ATPG_HELPG 208 PQPSEAQETITSEPSGSEDEILDSLAEKYVEYSLYYALIDS--LAAEHSARMQAMDT 262
+ 5899*************************************..44444444443333 PP
+
+>> sp|Q1CSD4|ATPG_HELPH ATP synthase gamma chain OS=Helicobacter pylori (strain HPAG1) GN=atpG PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 0.0 0.0002 7.3 51 107 .. 208 262 .. 203 283 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.0002
+ US2 51 alPdelkplltvewtpfeeaalskleallsakrlvYavvdpealreeaslrppepak 107
+ ++P+e ++ +t+e + e++ l++l+ + + + l Ya++d+ l +e s r ++ +
+ sp|Q1CSD4|ATPG_HELPH 208 PQPNEAQETITSEPSGSEDEILDSLAEKYVEYSLYYALIDS--LAAEHSARMQAMDT 262
+ 5899*************************************..44444444443333 PP
+
+
+
+Internal pipeline statistics summary:
+-------------------------------------
+Query model(s): 1 (126 nodes)
+Target sequences: 516081 (181677051 residues)
+Passed MSV filter: 9110 (0.0176523); expected 10321.6 (0.02)
+Passed bias filter: 7603 (0.0147322); expected 10321.6 (0.02)
+Passed Vit filter: 423 (0.000819639); expected 516.1 (0.001)
+Passed Fwd filter: 17 (3.29406e-05); expected 5.2 (1e-05)
+Initial search space (Z): 516081 [actual number of targets]
+Domain search space (domZ): 14 [number of targets reported over threshold]
+# CPU time: 4.56u 0.07s 00:00:04.63 Elapsed: 00:00:01.60
+# Mc/sec: 14307.07
+//
+Query: Glyco_transf_28 [M=139]
+Accession: PF03033.13
+Description: Glycosyltransferase family 28 N-terminal domain
+Scores for complete sequences (score includes all domains):
+ --- full sequence --- --- best 1 domain --- -#dom-
+ E-value score bias E-value score bias exp N Sequence Description
+ ------- ------ ----- ------- ------ ----- ---- -- -------- -----------
+ 3e-40 142.2 0.0 7.6e-40 140.8 0.0 1.7 1 sp|A7Z4E5|MURG_BACA2 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.6e-40 141.9 0.0 2.3e-38 136.1 0.0 2.5 2 sp|Q65JY0|MURG_BACLD UDP-N-acetylglucosamine--N-acetylmuram
+ 7.6e-40 140.8 0.0 2.8e-39 139.0 0.0 1.9 1 sp|P37585|MURG_BACSU UDP-N-acetylglucosamine--N-acetylmuram
+ 3e-39 138.9 0.0 1.4e-38 136.8 0.0 2.0 1 sp|A8FCY1|MURG_BACP2 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.6e-39 137.6 0.0 4.4e-37 131.9 0.0 2.8 1 sp|Q812W5|MURG1_BACCR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-38 137.0 0.5 4e-38 135.3 0.1 1.9 1 sp|A3MY90|MURG_ACTP2 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-38 136.7 0.0 4.4e-37 131.9 0.0 2.7 1 sp|A0RHT1|MURG2_BACAH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-38 136.7 0.0 4.4e-37 131.9 0.0 2.7 1 sp|Q636B6|MURG1_BACCZ UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-38 136.7 0.0 4.4e-37 131.9 0.0 2.7 1 sp|Q81JG5|MURG1_BACAN UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-38 136.4 0.0 4.4e-37 131.9 0.0 2.6 1 sp|Q732F8|MURG1_BACC1 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-38 135.8 0.0 1.8e-37 133.1 0.0 2.3 1 sp|B7GGI2|MURG_ANOFW UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-38 135.7 0.1 4.2e-37 131.9 0.0 2.3 1 sp|A7GRN6|MURG_BACCN UDP-N-acetylglucosamine--N-acetylmuram
+ 3.7e-38 135.4 0.4 1.4e-37 133.5 0.1 2.0 1 sp|B0BRH7|MURG_ACTPJ UDP-N-acetylglucosamine--N-acetylmuram
+ 3.7e-38 135.4 0.4 1.4e-37 133.5 0.1 2.0 1 sp|B3GZK8|MURG_ACTP7 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-38 135.3 0.0 1.1e-36 130.6 0.0 2.7 1 sp|Q6HEQ4|MURG1_BACHK UDP-N-acetylglucosamine--N-acetylmuram
+ 9.4e-38 134.1 0.0 4e-37 132.0 0.0 2.0 1 sp|O07670|MURG_ENTHR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-37 133.3 1.8 2.3e-36 129.6 0.3 2.5 2 sp|A7FM66|MURG_YERP3 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-37 133.3 1.8 2.3e-36 129.6 0.3 2.5 2 sp|B1JK81|MURG_YERPY UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-37 133.3 1.8 2.3e-36 129.6 0.3 2.5 2 sp|B2K4E6|MURG_YERPB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-37 133.3 1.8 2.3e-36 129.6 0.3 2.5 2 sp|Q66EK5|MURG_YERPS UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-37 133.0 1.5 1.4e-36 130.3 0.2 2.3 1 sp|A1JJJ3|MURG_YERE8 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.2e-37 132.8 2.4 2.7e-36 129.3 0.4 2.3 2 sp|A9MQC2|MURG_SALAR UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-37 132.8 1.5 4.5e-37 131.8 1.0 1.5 1 sp|P64869|Y1526_MYCTU Uncharacterized protein Rv1526c/MT1577
+ 2.3e-37 132.8 1.5 4.5e-37 131.8 1.0 1.5 1 sp|P64870|Y1553_MYCBO Uncharacterized protein Mb1553c OS=Myc
+ 3.1e-37 132.4 0.1 5.6e-37 131.5 0.1 1.5 1 sp|Q65RY6|MURG_MANSM UDP-N-acetylglucosamine--N-acetylmuram
+ 3.5e-37 132.2 1.8 2.1e-36 129.7 0.2 2.4 1 sp|B2VD91|MURG_ERWT9 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.6e-37 132.2 0.1 7.4e-37 131.2 0.1 1.6 1 sp|Q4QLF8|MURG_HAEI8 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-37 132.1 0.1 7.4e-37 131.2 0.1 1.5 1 sp|A5UIR2|MURG_HAEIG UDP-N-acetylglucosamine--N-acetylmuram
+ 4e-37 132.0 0.1 7.4e-37 131.2 0.1 1.5 1 sp|P45065|MURG_HAEIN UDP-N-acetylglucosamine--N-acetylmuram
+ 4.7e-37 131.8 2.7 5.5e-36 128.3 0.3 2.6 2 sp|A9R124|MURG_YERPG UDP-N-acetylglucosamine--N-acetylmuram
+ 4.7e-37 131.8 2.7 5.5e-36 128.3 0.3 2.6 2 sp|Q1C214|MURG_YERPA UDP-N-acetylglucosamine--N-acetylmuram
+ 4.7e-37 131.8 2.7 5.5e-36 128.3 0.3 2.6 2 sp|Q1CMM7|MURG_YERPN UDP-N-acetylglucosamine--N-acetylmuram
+ 4.7e-37 131.8 2.7 5.5e-36 128.3 0.3 2.6 2 sp|Q8ZIE9|MURG_YERPE UDP-N-acetylglucosamine--N-acetylmuram
+ 5.7e-37 131.5 0.0 3.5e-36 129.0 0.0 2.1 1 sp|O07109|MURG_ENTFA UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-37 131.5 1.2 2.4e-36 129.5 0.1 2.1 1 sp|A3QIM1|MURG_SHELP UDP-N-acetylglucosamine--N-acetylmuram
+ 6e-37 131.5 1.3 3.5e-36 129.0 0.2 2.3 1 sp|A8G9S7|MURG_SERP5 UDP-N-acetylglucosamine--N-acetylmuram
+ 6.3e-37 131.4 1.6 3.4e-36 129.0 0.3 2.2 1 sp|B7LWF6|MURG_ESCF3 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.1e-37 131.2 2.0 4.3e-36 128.7 0.2 2.3 1 sp|A7MIE5|MURG_ENTS8 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.4e-37 131.2 2.7 4e-36 128.8 0.2 2.6 1 sp|C6DEU3|MURG_PECCP UDP-N-acetylglucosamine--N-acetylmuram
+ 8.3e-37 131.0 0.3 1.3e-35 127.1 0.1 2.4 1 sp|Q88V81|MURG_LACPL UDP-N-acetylglucosamine--N-acetylmuram
+ 8.9e-37 130.9 1.2 8.3e-36 127.8 0.2 2.3 1 sp|Q8Z9G9|MURG_SALTI UDP-N-acetylglucosamine--N-acetylmuram
+ 8.9e-37 130.9 2.2 1.9e-35 126.6 0.1 2.6 2 sp|B4F111|MURG_PROMH UDP-N-acetylglucosamine--N-acetylmuram
+ 9.9e-37 130.7 2.6 1.4e-35 127.0 0.2 2.3 2 sp|A0L1P2|MURG_SHESA UDP-N-acetylglucosamine--N-acetylmuram
+ 9.9e-37 130.7 2.6 1.4e-35 127.0 0.2 2.3 2 sp|Q0HZR6|MURG_SHESR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-36 130.4 1.6 9.6e-36 127.5 0.3 2.3 1 sp|B5BLC2|MURG_SALPK UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-36 130.4 1.6 9.6e-36 127.5 0.3 2.3 1 sp|Q5PDC8|MURG_SALPA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-36 130.4 0.6 2.3e-36 129.6 0.0 1.8 1 sp|Q9K9T0|MURG_BACHD UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-36 130.3 0.0 2.9e-36 129.2 0.0 1.6 1 sp|Q8Y5M2|MURG_LISMO UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-36 130.0 1.5 1.3e-35 127.1 0.3 2.3 1 sp|A9MZL9|MURG_SALPB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-36 130.0 1.5 1.3e-35 127.1 0.3 2.3 1 sp|B4TJ87|MURG_SALHS UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-36 130.0 1.5 1.3e-35 127.1 0.3 2.3 1 sp|B4TXH8|MURG_SALSV UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-36 130.0 1.5 1.3e-35 127.1 0.3 2.3 1 sp|B5F7W4|MURG_SALA4 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-36 130.0 1.5 1.3e-35 127.1 0.3 2.3 1 sp|Q8ZRU3|MURG_SALTY UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-36 130.0 1.5 1.3e-35 127.1 0.3 2.3 1 sp|B4SU50|MURG_SALNS UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-36 130.0 1.5 1.5e-35 127.0 0.2 2.3 1 sp|A1REZ6|MURG_SHESW UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-36 130.0 1.5 1.5e-35 127.0 0.2 2.3 1 sp|A4Y2N6|MURG_SHEPC UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-36 130.0 0.7 9.6e-36 127.5 0.1 2.2 1 sp|A6T4N3|MURG_KLEP7 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-36 129.9 1.5 1.3e-35 127.1 0.3 2.3 1 sp|B5RH64|MURG_SALG2 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-36 129.9 0.9 6.4e-36 128.1 0.2 2.1 1 sp|A8ALK6|MURG_CITK8 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-36 129.9 1.5 1.3e-35 127.1 0.3 2.2 1 sp|Q57TD0|MURG_SALCH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-36 129.9 1.6 2.2e-35 126.4 0.2 2.4 2 sp|A6WID1|MURG_SHEB8 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-36 129.9 1.6 2.2e-35 126.4 0.2 2.4 2 sp|A9KY29|MURG_SHEB9 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-36 129.9 1.6 2.2e-35 126.4 0.2 2.4 2 sp|B8E698|MURG_SHEB2 UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-36 129.8 0.7 9.6e-36 127.5 0.1 2.1 1 sp|B5Y1U7|MURG_KLEP3 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.2e-36 129.6 1.7 2.2e-35 126.4 0.2 2.3 2 sp|A3CZM1|MURG_SHEB5 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-36 129.5 0.3 8.9e-36 127.7 0.1 2.0 1 sp|Q7U336|MURG_HAEDU UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-36 129.5 0.2 4.9e-36 128.5 0.1 1.5 1 sp|B7VJ03|MURG_VIBSL UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-36 129.5 0.4 6e-36 128.2 0.1 1.8 1 sp|Q0I1D3|MURG_HAES1 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-36 129.4 1.2 1.3e-35 127.1 0.3 2.2 1 sp|B5FI72|MURG_SALDC UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-36 129.4 0.0 1.3e-35 127.1 0.0 2.1 1 sp|A2RJQ4|MURG_LACLM UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-36 129.4 0.0 1.3e-35 127.1 0.0 2.1 1 sp|Q02XY0|MURG_LACLS UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-36 129.3 1.5 9.4e-36 127.6 0.3 2.1 1 sp|B7MNU9|MURG_ECO81 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-36 129.3 1.5 9.4e-36 127.6 0.3 2.1 1 sp|B7NHJ6|MURG_ECO7I UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-36 129.3 1.5 9.4e-36 127.6 0.3 2.1 1 sp|B7UIE0|MURG_ECO27 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-36 129.3 1.5 9.4e-36 127.6 0.3 2.1 1 sp|Q0TLP9|MURG_ECOL5 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-36 129.3 1.5 9.4e-36 127.6 0.3 2.1 1 sp|Q8FL64|MURG_ECOL6 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-36 129.2 1.6 9.4e-36 127.6 0.3 2.1 1 sp|A1A7D5|MURG_ECOK1 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-36 129.2 1.6 9.4e-36 127.6 0.3 2.1 1 sp|B7MAL3|MURG_ECO45 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-36 129.2 1.6 9.4e-36 127.6 0.3 2.1 1 sp|Q1RGA5|MURG_ECOUT UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-36 129.1 2.3 1.2e-35 127.2 0.2 2.4 1 sp|Q6D0I3|MURG_ERWCT UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|B5YZC6|MURG_ECO5E UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|Q8X9Y8|MURG_ECO57 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|A7ZHI1|MURG_ECO24 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|B1LG27|MURG_ECOSM UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|B6HZ67|MURG_ECOSE UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|B7M133|MURG_ECO8A UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|B7N7W3|MURG_ECOLU UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|Q326E5|MURG_SHIBS UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|Q3Z5R9|MURG_SHISS UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|Q32K02|MURG_SHIDS UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|B2U295|MURG_SHIB3 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|B1IR88|MURG_ECOLC UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|B1XC67|MURG_ECODH UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|C4ZRI5|MURG_ECOBW UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|P17443|MURG_ECOLI UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-36 129.1 1.3 9.4e-36 127.6 0.3 2.1 1 sp|A7ZW42|MURG_ECOHS UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-36 129.1 2.9 3.4e-35 125.8 0.3 2.6 2 sp|A4TQ83|MURG_YERPP UDP-N-acetylglucosamine--N-acetylmuram
+ 3.5e-36 129.0 0.1 2.6e-35 126.1 0.0 2.4 1 sp|Q9CF92|MURG_LACLA UDP-N-acetylglucosamine--N-acetylmuram
+ 3.7e-36 128.9 1.2 3.2e-35 125.8 0.2 2.3 1 sp|B5R2M4|MURG_SALEP UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-36 128.8 1.1 1.3e-35 127.1 0.2 2.1 1 sp|Q0T8A7|MURG_SHIF8 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-36 128.8 1.1 1.3e-35 127.1 0.2 2.1 1 sp|Q83MN4|MURG_SHIFL UDP-N-acetylglucosamine--N-acetylmuram
+ 4.1e-36 128.7 2.5 6.6e-35 124.8 0.2 2.3 2 sp|Q8CX35|MURG_SHEON UDP-N-acetylglucosamine--N-acetylmuram
+ 4.3e-36 128.7 0.0 9.4e-36 127.6 0.0 1.6 1 sp|B8DBP8|MURG_LISMH UDP-N-acetylglucosamine--N-acetylmuram
+ 4.6e-36 128.6 0.0 1.1e-35 127.4 0.0 1.6 1 sp|A0AKD5|MURG_LISW6 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.2e-36 128.4 2.9 1.3e-35 127.1 1.0 2.2 1 sp|Q9ZBA5|MURG_STRCO UDP-N-acetylglucosamine--N-acetylmuram
+ 5.5e-36 128.3 0.0 1.2e-35 127.3 0.0 1.6 1 sp|Q929Y2|MURG_LISIN UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-36 128.3 0.5 1.2e-35 127.3 0.1 1.7 1 sp|B8F3B6|MURG_HAEPS UDP-N-acetylglucosamine--N-acetylmuram
+ 5.9e-36 128.2 2.6 1.4e-35 127.0 0.2 2.2 1 sp|Q0HE83|MURG_SHESM UDP-N-acetylglucosamine--N-acetylmuram
+ 6e-36 128.2 0.0 1.3e-35 127.2 0.0 1.6 1 sp|C1KWY8|MURG_LISMC UDP-N-acetylglucosamine--N-acetylmuram
+ 6e-36 128.2 0.0 1.3e-35 127.2 0.0 1.6 1 sp|Q71XX8|MURG_LISMF UDP-N-acetylglucosamine--N-acetylmuram
+ 6.4e-36 128.1 0.1 1.3e-35 127.1 0.1 1.5 1 sp|A1S2F9|MURG_SHEAM UDP-N-acetylglucosamine--N-acetylmuram
+ 9.6e-36 127.5 0.1 2e-35 126.5 0.0 1.6 1 sp|A5UCW8|MURG_HAEIE UDP-N-acetylglucosamine--N-acetylmuram
+ 9.8e-36 127.5 1.0 1.1e-33 120.9 0.1 2.6 2 sp|Q03QH5|MURG_LACBA UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-35 127.4 0.3 2.2e-35 126.4 0.2 1.6 1 sp|Q8DEL0|MURG_VIBVU UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-35 127.4 0.3 2.2e-35 126.4 0.2 1.6 1 sp|Q7MNV1|MURG_VIBVY UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-35 127.2 0.1 2.5e-35 126.2 0.1 1.5 1 sp|Q3IFY0|MURG_PSEHT UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-35 127.1 1.5 3.8e-35 125.6 0.4 2.1 1 sp|B7LFW0|MURG_ECO55 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-35 127.0 0.2 2.4e-35 126.3 0.1 1.4 1 sp|B1KKX7|MURG_SHEWM UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-35 126.3 0.1 4.2e-35 125.5 0.1 1.5 1 sp|Q49929|Y2348_MYCLE Uncharacterized glycosyltransferase ML
+ 2.3e-35 126.3 1.8 9.4e-35 124.3 0.2 2.1 1 sp|Q7N147|MURG_PHOLL UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-35 126.3 0.3 7.8e-35 124.6 0.1 1.9 1 sp|A8H984|MURG_SHEPA UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-35 126.1 2.1 5.7e-35 125.0 0.7 2.0 1 sp|Q820F6|MURG_STRAW UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-35 126.1 0.0 1.9e-34 123.3 0.0 2.2 1 sp|Q1WTA0|MURG_LACS1 UDP-N-acetylglucosamine--N-acetylmuram
+ 3e-35 125.9 0.7 7.7e-35 124.6 0.5 1.6 1 sp|Q9X4H4|MURG_STRCU UDP-N-acetylglucosamine--N-acetylmuram
+ 4e-35 125.6 1.3 7.1e-35 124.7 0.2 2.0 1 sp|Q12SC6|MURG_SHEDO UDP-N-acetylglucosamine--N-acetylmuram
+ 4e-35 125.5 3.0 6e-35 125.0 0.2 2.2 1 sp|P57817|MURG_PASMU UDP-N-acetylglucosamine--N-acetylmuram
+ 4.3e-35 125.4 1.1 1.1e-34 124.2 0.2 2.0 1 sp|Q87SG4|MURG_VIBPA UDP-N-acetylglucosamine--N-acetylmuram
+ 4.4e-35 125.4 0.5 1.4e-34 123.7 0.1 1.9 1 sp|B0TQN7|MURG_SHEHH UDP-N-acetylglucosamine--N-acetylmuram
+ 4.7e-35 125.3 0.5 1.7e-34 123.5 0.0 2.0 1 sp|C4L5U5|MURG_EXISA UDP-N-acetylglucosamine--N-acetylmuram
+ 5.3e-35 125.1 0.5 1.2e-34 124.0 0.1 1.7 1 sp|A9M2H3|MURG_NEIM0 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.1e-35 124.7 1.7 1.1e-34 124.1 0.2 1.9 1 sp|Q6LMF6|MURG_PHOPR UDP-N-acetylglucosamine--N-acetylmuram
+ 8.4e-35 124.5 0.2 1.7e-34 123.5 0.1 1.5 1 sp|Q5E2Q0|MURG_VIBF1 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.7e-35 124.4 0.2 1.6e-34 123.6 0.2 1.5 1 sp|P64865|Y1524_MYCTU Uncharacterized glycosyltransferase Rv
+ 8.7e-35 124.4 0.2 1.6e-34 123.6 0.2 1.5 1 sp|P64866|Y1551_MYCBO Uncharacterized glycosyltransferase Mb
+ 9e-35 124.4 0.2 1.7e-34 123.5 0.1 1.5 1 sp|B5FB35|MURG_VIBFM UDP-N-acetylglucosamine--N-acetylmuram
+ 9.6e-35 124.3 0.3 2.5e-33 119.7 0.2 2.3 2 sp|B2GB78|MURG_LACF3 UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-34 124.2 0.1 2e-34 123.3 0.1 1.5 1 sp|B6ELH5|MURG_ALISL UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-34 124.1 0.0 2.4e-34 123.0 0.0 1.6 1 sp|B8CWJ6|MURG_HALOH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-34 124.1 1.2 2.3e-34 123.1 0.2 1.9 1 sp|A7MXR6|MURG_VIBHB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-34 124.1 0.5 3.3e-33 119.3 0.0 2.4 2 sp|A5VJ33|MURG_LACRD UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-34 124.1 0.5 3.3e-33 119.3 0.0 2.4 2 sp|B2G6K5|MURG_LACRJ UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-34 123.8 0.0 3.2e-34 122.6 0.0 1.7 1 sp|Q182Y6|MURG_CLOD6 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-34 123.8 0.2 3.6e-34 122.5 0.2 1.7 1 sp|Q2NVV1|MURG_SODGM UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-34 123.8 0.1 3.6e-34 122.4 0.0 1.8 1 sp|Q07WI5|MURG_SHEFN UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-34 123.8 0.6 3e-34 122.7 0.1 1.7 1 sp|A1KVL3|MURG_NEIMF UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-34 123.7 0.4 3e-34 122.7 0.1 1.6 1 sp|Q9K0Y2|MURG_NEIMB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-34 123.4 0.2 5.6e-34 121.8 0.0 1.8 1 sp|B8CNL1|MURG_SHEPW UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-34 123.3 1.8 1.4e-33 120.6 0.4 2.1 1 sp|C4LA25|MURG_TOLAT UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-34 123.3 0.2 6.1e-34 121.7 0.0 1.8 1 sp|Q9F1N0|MURG_SHEVI UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-34 122.9 0.5 6.5e-34 121.6 0.4 1.7 1 sp|A5F5M9|MURG_VIBC3 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-34 122.9 0.1 9.4e-34 121.1 0.1 1.9 1 sp|Q03W35|MURG_LEUMM UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-34 122.8 2.7 4.4e-34 122.2 1.3 1.7 1 sp|A3Q1L8|MURG_MYCSJ UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-34 122.8 2.7 4.4e-34 122.2 1.3 1.7 1 sp|A1UI54|MURG_MYCSK UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-34 122.8 2.7 4.4e-34 122.2 1.3 1.7 1 sp|Q1B6X1|MURG_MYCSS UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-34 122.6 1.5 3.9e-34 122.3 0.3 1.7 1 sp|C3LQU6|MURG_VIBCM UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-34 122.6 1.5 3.9e-34 122.3 0.3 1.7 1 sp|Q9KPG7|MURG_VIBCH UDP-N-acetylglucosamine--N-acetylmuram
+ 4.3e-34 122.2 0.1 7.6e-34 121.4 0.1 1.4 1 sp|A8FQA0|MURG_SHESH UDP-N-acetylglucosamine--N-acetylmuram
+ 6.8e-34 121.5 0.4 1.6e-33 120.3 0.1 1.8 1 sp|B4RQC5|MURG_NEIG2 UDP-N-acetylglucosamine--N-acetylmuram
+ 6.8e-34 121.5 0.4 1.6e-33 120.3 0.1 1.8 1 sp|Q5F6L8|MURG_NEIG1 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.6e-34 121.4 1.3 1.6e-33 120.4 0.3 2.0 1 sp|B1I4C4|MURG_DESAP UDP-N-acetylglucosamine--N-acetylmuram
+ 8e-34 121.3 1.6 8e-34 121.3 1.1 2.2 1 sp|Q6A9Q2|MURG_PROAC UDP-N-acetylglucosamine--N-acetylmuram
+ 8.6e-34 121.2 0.3 6.8e-33 118.3 0.0 2.4 1 sp|B3WDY2|MURG_LACCB UDP-N-acetylglucosamine--N-acetylmuram
+ 8.6e-34 121.2 0.3 6.8e-33 118.3 0.0 2.4 1 sp|Q039R7|MURG_LACC3 UDP-N-acetylglucosamine--N-acetylmuram
+ 9e-34 121.2 0.2 5.8e-33 118.5 0.0 2.3 1 sp|A4J2B1|MURG_DESRM UDP-N-acetylglucosamine--N-acetylmuram
+ 9.5e-34 121.1 0.1 2.3e-33 119.8 0.0 1.7 1 sp|Q47VQ9|MURG_COLP3 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-33 120.9 0.0 2.1e-33 120.0 0.0 1.5 1 sp|B2A2H2|MURG_NATTJ UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-33 120.3 1.6 2.3e-33 119.8 0.3 1.9 1 sp|Q6NGC8|MURG_CORDI UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-33 120.2 1.5 2.9e-33 119.5 0.3 1.8 1 sp|B4RWX9|MURG_ALTMD UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-33 120.2 0.3 3.7e-33 119.2 0.1 1.6 1 sp|Q9JSZ7|MURG_NEIMA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-33 120.1 0.6 5.2e-32 115.5 0.2 2.5 2 sp|B0KFS6|MURG_PSEPG UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-33 119.7 0.8 5e-33 118.7 0.2 1.8 1 sp|A4XQS4|MURG_PSEMY UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-33 119.7 1.1 5.1e-33 118.7 0.4 1.7 1 sp|Q48EF8|MURG_PSE14 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-33 119.7 0.0 2.6e-33 119.7 0.0 1.7 1 sp|Q8R9G6|MURG_THETN UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-33 119.6 0.2 4.7e-32 115.6 0.2 2.3 1 sp|A5W8Q0|MURG_PSEP1 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-33 119.5 1.3 3.1e-32 116.2 0.4 2.4 1 sp|Q1I5B8|MURG_PSEE4 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-33 119.5 0.9 6.5e-33 118.4 0.3 1.8 1 sp|Q87WY5|MURG_PSESM UDP-N-acetylglucosamine--N-acetylmuram
+ 3.4e-33 119.3 0.0 5.8e-33 118.5 0.0 1.4 1 sp|C3L230|MURG_CLOB6 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.5e-33 119.3 0.5 6.5e-33 118.4 0.1 1.7 1 sp|A1WC06|MURG_ACISJ UDP-N-acetylglucosamine--N-acetylmuram
+ 3.5e-33 119.3 0.5 6.5e-33 118.4 0.1 1.7 1 sp|B9MFR2|MURG_DIAST UDP-N-acetylglucosamine--N-acetylmuram
+ 3.6e-33 119.2 3.2 3.6e-33 119.2 2.2 2.3 1 sp|B8ZQQ0|MURG_MYCLB UDP-N-acetylglucosamine--N-acetylmuram
+ 3.6e-33 119.2 3.2 3.6e-33 119.2 2.2 2.3 1 sp|O69552|MURG_MYCLE UDP-N-acetylglucosamine--N-acetylmuram
+ 3.7e-33 119.2 0.0 2.1e-32 116.8 0.0 1.9 1 sp|Q893R7|MURG_CLOTE UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-33 119.1 0.0 6.5e-33 118.4 0.0 1.4 1 sp|A7GGX9|MURG_CLOBL UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-33 119.1 0.0 6.5e-33 118.4 0.0 1.4 1 sp|B1IKH3|MURG_CLOBK UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-33 119.1 0.0 6.5e-33 118.4 0.0 1.4 1 sp|C1FUF9|MURG_CLOBJ UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-33 119.1 0.0 6.5e-33 118.4 0.0 1.4 1 sp|A5I5J5|MURG_CLOBH UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-33 119.1 0.0 6.5e-33 118.4 0.0 1.4 1 sp|A7FX11|MURG_CLOB1 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-33 119.1 1.1 7.4e-33 118.2 0.4 1.7 1 sp|Q4ZNZ0|MURG_PSEU2 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.3e-33 119.0 0.0 4.3e-32 115.7 0.0 2.2 1 sp|A4XI04|MURG_CALS8 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.6e-33 118.9 1.2 1.1e-32 117.6 0.8 1.7 1 sp|A0R016|MURG_MYCS2 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.1e-33 118.7 0.0 2e-32 116.8 0.0 2.0 1 sp|A8YUN9|MURG_LACH4 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.6e-33 118.6 0.6 5.6e-33 118.6 0.4 2.6 1 sp|A1SL80|MURG_NOCSJ UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-33 118.5 1.0 7.1e-32 115.0 0.3 2.4 1 sp|Q88N76|MURG_PSEPK UDP-N-acetylglucosamine--N-acetylmuram
+ 8.3e-33 118.0 0.0 1.4e-32 117.3 0.0 1.4 1 sp|B1KYH7|MURG_CLOBM UDP-N-acetylglucosamine--N-acetylmuram
+ 8.7e-33 118.0 2.7 1.5e-32 117.2 0.1 2.5 1 sp|Q24TE6|MURG_DESHY UDP-N-acetylglucosamine--N-acetylmuram
+ 9e-33 117.9 1.5 1.8e-32 117.0 0.5 1.9 1 sp|Q3K744|MURG_PSEPF UDP-N-acetylglucosamine--N-acetylmuram
+ 9.4e-33 117.9 0.7 1.7e-31 113.8 0.4 2.4 1 sp|B1J3L2|MURG_PSEPW UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-32 117.8 0.1 1.1e-31 114.4 0.0 2.4 1 sp|B0K3H0|MURG_THEPX UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-32 117.8 0.1 1.1e-31 114.4 0.0 2.4 1 sp|B0K8K7|MURG_THEP3 UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-32 117.7 0.0 1.5e-31 114.0 0.0 2.2 1 sp|A3DE27|MURG_CLOTH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-32 117.3 3.8 2.3e-32 116.6 1.1 2.3 1 sp|A1TAW8|MURG_MYCVP UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-32 117.1 1.3 7.6e-32 114.9 0.2 2.5 1 sp|B8FT56|MURG_DESHD UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-32 116.6 1.2 2.3e-32 116.6 0.8 1.7 1 sp|Q9RWP0|MURG_DEIRA UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-32 116.5 1.3 1.8e-31 113.7 0.3 2.2 1 sp|B2I1J5|MURG_ACIBC UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-32 116.5 1.3 1.8e-31 113.7 0.3 2.2 1 sp|B0V9F5|MURG_ACIBY UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-32 116.5 1.3 1.8e-31 113.7 0.3 2.2 1 sp|B7GV73|MURG_ACIB3 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-32 116.5 1.3 1.8e-31 113.7 0.3 2.2 1 sp|B7ICE5|MURG_ACIB5 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-32 116.5 0.1 2.5e-32 116.5 0.0 2.0 1 sp|A5D145|MURG_PELTS UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-32 116.3 1.2 1.8e-31 113.7 0.3 2.2 1 sp|A3M9Y1|MURG_ACIBT UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-32 116.3 0.0 5.9e-32 115.3 0.0 1.6 1 sp|A9KK83|MURG_CLOPH UDP-N-acetylglucosamine--N-acetylmuram
+ 3.6e-32 116.0 0.7 7.1e-32 115.0 0.5 1.5 1 sp|C3KCT0|MURG_PSEFS UDP-N-acetylglucosamine--N-acetylmuram
+ 4.5e-32 115.7 0.0 9.5e-32 114.6 0.0 1.6 1 sp|Q03EY2|MURG_PEDPA UDP-N-acetylglucosamine--N-acetylmuram
+ 4.8e-32 115.6 1.5 1.3e-31 114.2 1.0 1.7 1 sp|A0QF52|MURG_MYCA1 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.3e-32 115.4 0.0 2.1e-30 110.2 0.0 2.5 2 sp|Q04B72|MURG_LACDB UDP-N-acetylglucosamine--N-acetylmuram
+ 5.3e-32 115.4 0.0 2.1e-30 110.2 0.0 2.5 2 sp|Q1GAT5|MURG_LACDA UDP-N-acetylglucosamine--N-acetylmuram
+ 6.7e-32 115.1 2.3 9.1e-32 114.7 0.6 2.0 1 sp|Q4K6J3|MURG_PSEF5 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.5e-32 114.9 1.2 5.8e-31 112.1 0.3 2.2 1 sp|B0VNZ9|MURG_ACIBS UDP-N-acetylglucosamine--N-acetylmuram
+ 8.8e-32 114.7 0.0 5e-31 112.3 0.0 2.1 1 sp|Q5FKV2|MURG_LACAC UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-31 114.5 2.0 7.3e-31 111.7 0.3 2.4 1 sp|A0KPX2|MURG_AERHH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-31 114.3 4.6 1.4e-31 114.1 2.4 1.7 1 sp|A1WYU3|MURG_HALHL UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-31 114.3 2.2 3.1e-31 113.0 1.5 1.7 1 sp|Q73YQ8|MURG_MYCPA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-31 114.3 1.0 2.2e-31 113.4 0.3 1.7 1 sp|B1MXW0|MURG_LEUCK UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-31 114.2 0.4 3.4e-31 112.8 0.3 1.7 1 sp|Q604V7|MURG_METCA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-31 114.2 0.0 2.3e-31 113.3 0.0 1.4 1 sp|B2V1X5|MURG_CLOBA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-31 113.8 0.2 3.4e-31 112.8 0.1 1.5 1 sp|A1U3F8|MURG_MARAV UDP-N-acetylglucosamine--N-acetylmuram
+ 2.1e-31 113.5 0.0 2.5e-30 110.0 0.0 2.2 1 sp|A8MH36|MURG_ALKOO UDP-N-acetylglucosamine--N-acetylmuram
+ 2.1e-31 113.5 0.0 5.3e-31 112.2 0.0 1.6 1 sp|B2TLE0|MURG_CLOBB UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-31 113.2 2.0 1.5e-30 110.7 0.3 2.4 1 sp|A4SI56|MURG_AERS4 UDP-N-acetylglucosamine--N-acetylmuram
+ 3e-31 113.0 0.0 1.3e-30 111.0 0.0 1.9 1 sp|C4Z1B5|MURG_EUBE2 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-31 113.0 0.3 6.9e-31 111.8 0.2 1.6 1 sp|C1DQ99|MURG_AZOVD UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-31 112.9 1.0 1.8e-30 110.5 0.3 2.1 1 sp|Q6F703|MURG_ACIAD UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-31 112.9 0.0 5.3e-31 112.2 0.0 1.4 1 sp|B1YIT7|MURG_EXIS2 UDP-N-acetylglucosamine--N-acetylmuram
+ 5e-31 112.3 2.6 1.2e-30 111.1 1.8 1.6 1 sp|C1CW40|MURG_DEIDV UDP-N-acetylglucosamine--N-acetylmuram
+ 5.1e-31 112.2 0.9 1.9e-30 110.4 0.3 1.9 1 sp|Q47QW9|MURG_THEFY UDP-N-acetylglucosamine--N-acetylmuram
+ 5.3e-31 112.2 0.0 9e-31 111.4 0.0 1.4 1 sp|A0Q182|MURG_CLONN UDP-N-acetylglucosamine--N-acetylmuram
+ 5.3e-31 112.2 1.4 5.3e-31 112.2 0.9 2.0 1 sp|A1KKJ6|MURG_MYCBP UDP-N-acetylglucosamine--N-acetylmuram
+ 5.3e-31 112.2 1.4 5.3e-31 112.2 0.9 2.0 1 sp|C1AQ69|MURG_MYCBT UDP-N-acetylglucosamine--N-acetylmuram
+ 5.3e-31 112.2 1.4 5.3e-31 112.2 0.9 2.0 1 sp|Q7VEP8|MURG_MYCBO UDP-N-acetylglucosamine--N-acetylmuram
+ 6.3e-31 111.9 0.0 1e-30 111.3 0.0 1.3 1 sp|B0S0Z5|MURG_FINM2 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.7e-31 111.7 0.2 4.9e-30 109.0 0.2 2.1 1 sp|B7UZJ0|MURG_PSEA8 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.7e-31 111.7 0.2 4.9e-30 109.0 0.2 2.1 1 sp|Q02H28|MURG_PSEAB UDP-N-acetylglucosamine--N-acetylmuram
+ 7.7e-31 111.7 0.2 4.9e-30 109.0 0.2 2.1 1 sp|Q9HW01|MURG_PSEAE UDP-N-acetylglucosamine--N-acetylmuram
+ 7.8e-31 111.6 0.8 7.8e-31 111.6 0.5 2.2 1 sp|A0PTI7|MURG_MYCUA UDP-N-acetylglucosamine--N-acetylmuram
+ 8.2e-31 111.6 0.2 4.9e-30 109.0 0.2 2.1 1 sp|A6VB85|MURG_PSEA7 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.5e-31 111.5 0.1 1.5e-30 110.7 0.1 1.4 1 sp|A9KER3|MURG_COXBN UDP-N-acetylglucosamine--N-acetylmuram
+ 8.6e-31 111.5 0.1 1.5e-30 110.7 0.1 1.4 1 sp|A9NA44|MURG_COXBR UDP-N-acetylglucosamine--N-acetylmuram
+ 8.6e-31 111.5 0.1 1.5e-30 110.7 0.1 1.4 1 sp|B6J2Q3|MURG_COXB2 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.6e-31 111.5 0.1 1.5e-30 110.7 0.1 1.4 1 sp|B6J5K3|MURG_COXB1 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.6e-31 111.5 0.1 1.5e-30 110.7 0.1 1.4 1 sp|Q820X3|MURG_COXBU UDP-N-acetylglucosamine--N-acetylmuram
+ 9.1e-31 111.4 0.0 2.9e-30 109.8 0.0 1.9 1 sp|Q042P9|MURG_LACGA UDP-N-acetylglucosamine--N-acetylmuram
+ 9.6e-31 111.4 1.3 9.6e-31 111.4 0.9 2.1 1 sp|B2HGR6|MURG_MYCMM UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-30 111.2 0.8 2.7e-30 109.9 0.2 1.8 1 sp|Q0VS02|MURG_ALCBS UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-30 111.2 2.3 1.1e-30 111.2 1.6 1.8 1 sp|Q0RNP1|MURG_FRAAA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-30 111.0 2.9 2.1e-30 110.3 0.5 2.3 1 sp|Q2RK79|MURG_MOOTA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-30 111.0 2.6 1.3e-30 111.0 1.8 1.7 1 sp|Q1IXV9|MURG_DEIGD UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-30 111.0 0.0 5.5e-30 108.9 0.0 2.0 1 sp|Q74JY4|MURG_LACJO UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-30 110.7 0.0 3.9e-30 109.4 0.0 1.7 1 sp|A5MZ55|MURG_CLOK5 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-30 110.5 0.6 3.7e-30 109.5 0.4 1.5 1 sp|A1TKD1|MURG_ACIAC UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-30 110.4 0.0 4.3e-30 109.3 0.0 1.6 1 sp|B7J0L2|MURG_BORBZ UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-30 110.4 0.0 4.3e-30 109.3 0.0 1.6 1 sp|O51708|MURG_BORBU UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-30 110.3 1.0 4.2e-30 109.3 0.7 1.6 1 sp|Q15Q17|MURG_PSEA6 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.1e-30 110.3 0.0 5.7e-30 108.9 0.0 1.8 1 sp|A7A179|ATG26_YEAS7 Sterol 3-beta-glucosyltransferase OS=S
+ 2.3e-30 110.1 0.5 4.8e-30 109.1 0.4 1.6 1 sp|Q1D0T0|MURG_MYXXD UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-30 110.0 1.0 2.5e-30 110.0 0.7 1.6 1 sp|Q1QVG7|MURG_CHRSD UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-30 110.0 0.5 2.6e-30 110.0 0.3 2.1 1 sp|A4VIH8|MURG_PSEU5 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-30 109.9 0.0 8.3e-30 108.3 0.0 1.8 1 sp|Q38XM8|MURG_LACSS UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-30 109.6 0.4 8.3e-30 108.3 0.1 1.8 1 sp|A1SU19|MURG_PSYIN UDP-N-acetylglucosamine--N-acetylmuram
+ 3.4e-30 109.6 0.0 7.1e-30 108.5 0.0 1.6 1 sp|Q31I59|MURG_THICR UDP-N-acetylglucosamine--N-acetylmuram
+ 3.4e-30 109.6 0.0 8.7e-30 108.3 0.0 1.7 1 sp|Q04ET0|MURG_OENOB UDP-N-acetylglucosamine--N-acetylmuram
+ 3.4e-30 109.6 0.9 3.4e-30 109.6 0.6 1.8 1 sp|Q2KVG0|MURG_BORA1 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.6e-30 109.5 0.3 7.1e-30 108.5 0.2 1.5 1 sp|Q5R0M1|MURG_IDILO UDP-N-acetylglucosamine--N-acetylmuram
+ 3.7e-30 109.5 0.1 1e-29 108.1 0.0 1.7 1 sp|Q5WAE4|MURG_BACSK UDP-N-acetylglucosamine--N-acetylmuram
+ 3.7e-30 109.5 3.4 1.3e-29 107.6 1.0 2.3 1 sp|Q2JD50|MURG_FRASC UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-30 109.4 1.3 8.8e-30 108.2 0.9 1.6 1 sp|B5ELC3|MURG_ACIF5 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-30 109.4 1.3 8.8e-30 108.2 0.9 1.6 1 sp|B7J3V2|MURG_ACIF2 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.9e-30 109.4 0.0 7.7e-30 108.4 0.0 1.5 1 sp|Q0SM88|MURG_BORAP UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-30 109.3 0.3 1.1e-29 107.9 0.2 1.7 1 sp|Q4FQV9|MURG_PSYA2 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.5e-30 109.2 0.0 2.9e-29 106.6 0.0 2.2 1 sp|Q730T5|MURG2_BACC1 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.8e-30 109.1 0.0 2.6e-29 106.7 0.0 2.1 1 sp|Q1LSW5|MURG_BAUCH UDP-N-acetylglucosamine--N-acetylmuram
+ 5.4e-30 108.9 0.2 9.8e-30 108.1 0.2 1.4 1 sp|Q9WY74|MURG_THEMA UDP-N-acetylglucosamine--N-acetylmuram
+ 5.5e-30 108.9 0.2 9.8e-30 108.1 0.1 1.4 1 sp|B1L9S1|MURG_THESQ UDP-N-acetylglucosamine--N-acetylmuram
+ 5.5e-30 108.9 0.2 9.8e-30 108.1 0.2 1.4 1 sp|A5IKI9|MURG_THEP1 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.9e-30 108.8 1.4 1.4e-29 107.5 0.6 1.9 1 sp|A4FLW0|MURG_SACEN UDP-N-acetylglucosamine--N-acetylmuram
+ 6.6e-30 108.6 1.4 1.3e-29 107.7 0.9 1.5 1 sp|Q9RNM6|MURG_ZYMMO UDP-N-acetylglucosamine--N-acetylmuram
+ 7.1e-30 108.5 0.0 1.9e-29 107.1 0.0 1.8 1 sp|Q06321|ATG26_YEAST Sterol 3-beta-glucosyltransferase OS=S
+ 7.2e-30 108.5 3.0 1.2e-29 107.8 2.1 1.4 1 sp|Q9PF81|MURG_XYLFA UDP-N-acetylglucosamine--N-acetylmuram
+ 7.9e-30 108.4 1.5 7.9e-30 108.4 1.0 1.9 1 sp|Q5GW41|MURG_XANOR UDP-N-acetylglucosamine--N-acetylmuram
+ 8.9e-30 108.2 0.2 1.4e-29 107.6 0.1 1.3 1 sp|B2S3B6|MURG_TREPS UDP-N-acetylglucosamine--N-acetylmuram
+ 8.9e-30 108.2 0.2 1.4e-29 107.6 0.1 1.3 1 sp|O83535|MURG_TREPA UDP-N-acetylglucosamine--N-acetylmuram
+ 9.2e-30 108.2 0.0 1.7e-29 107.3 0.0 1.5 1 sp|Q0AJE1|MURG_NITEC UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-29 108.1 1.1 1e-29 108.1 0.8 1.8 1 sp|B3PCM0|MURG_CELJU UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-29 107.8 0.1 2e-29 107.0 0.1 1.4 1 sp|A5G8K0|MURG_GEOUR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-29 107.8 1.4 1.2e-29 107.8 1.0 2.1 1 sp|A5U4I0|MURG_MYCTA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-29 107.8 1.4 1.2e-29 107.8 1.0 2.1 1 sp|O06224|MURG_MYCTU UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-29 107.7 1.0 1.3e-29 107.7 0.7 2.2 1 sp|Q4JW95|MURG_CORJK UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-29 107.6 0.0 3.3e-29 106.4 0.0 1.6 1 sp|Q97GY4|MURG_CLOAB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-29 107.4 0.0 2.5e-29 106.8 0.0 1.4 1 sp|Q9Z702|MURG_CHLPN UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-29 107.4 0.4 2.8e-29 106.6 0.3 1.4 1 sp|Q1Q944|MURG_PSYCK UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-29 107.3 0.5 5.5e-29 105.6 0.3 1.9 1 sp|C0RE70|MURG_BRUMB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-29 107.3 0.5 5.5e-29 105.6 0.3 1.9 1 sp|Q8YI66|MURG_BRUME UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-29 107.3 1.3 3.8e-29 106.2 0.9 1.6 1 sp|Q3BXF2|MURG_XANC5 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-29 107.2 0.5 5.5e-29 105.6 0.3 1.8 1 sp|B2S6Q4|MURG_BRUA1 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-29 107.2 0.5 5.5e-29 105.6 0.3 1.8 1 sp|Q2YLY5|MURG_BRUA2 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-29 107.2 0.5 5.5e-29 105.6 0.3 1.8 1 sp|Q57C78|MURG_BRUAB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-29 107.1 0.0 4.1e-29 106.1 0.0 1.6 1 sp|Q660A8|MURG_BORGA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-29 107.1 0.0 3.8e-29 106.2 0.0 1.5 1 sp|B8I6H3|MURG_CLOCE UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-29 107.1 0.5 5.5e-29 105.6 0.3 1.8 1 sp|A5VRH7|MURG_BRUO2 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-29 107.1 0.5 5.5e-29 105.6 0.3 1.8 1 sp|B0CHM0|MURG_BRUSI UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-29 107.1 1.4 4e-29 106.1 0.7 1.8 1 sp|A0JV94|MURG_ARTS2 UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-29 107.1 0.0 4.1e-29 106.1 0.0 1.5 1 sp|A6TS61|MURG_ALKMQ UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-29 107.1 0.0 4e-29 106.1 0.0 1.5 1 sp|C5D4C2|MURG_GEOSW UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-29 107.1 0.5 5.5e-29 105.6 0.3 1.7 1 sp|A9M690|MURG_BRUC2 UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-29 107.0 1.6 6.1e-29 105.5 1.1 1.8 1 sp|Q8PPA8|MURG_XANAC UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-29 107.0 0.5 5.5e-29 105.6 0.3 1.7 1 sp|Q8CY39|MURG_BRUSU UDP-N-acetylglucosamine--N-acetylmuram
+ 2.2e-29 106.9 1.6 5e-29 105.8 1.1 1.6 1 sp|A1WRL1|MURG_VEREI UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-29 106.7 0.0 1.3e-28 104.4 0.0 2.1 1 sp|Q812T8|MURG2_BACCR UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-29 106.6 3.7 4.8e-29 105.9 2.6 1.4 1 sp|B0U4Z7|MURG_XYLFM UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-29 106.5 0.0 5.3e-29 105.7 0.0 1.4 1 sp|A4IJS4|MURG_GEOTN UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-29 106.4 1.4 3.2e-29 106.4 0.9 1.9 1 sp|Q2NZB8|MURG_XANOM UDP-N-acetylglucosamine--N-acetylmuram
+ 4.6e-29 105.9 0.0 7.6e-29 105.2 0.0 1.4 1 sp|A5FIY3|MURG_FLAJ1 UDP-N-acetylglucosamine--N-acetylmuram
+ 6e-29 105.5 0.6 1.6e-28 104.2 0.4 1.7 1 sp|Q39JX0|MURG_BURS3 UDP-N-acetylglucosamine--N-acetylmuram
+ 6.9e-29 105.3 3.5 9.4e-29 104.9 1.1 2.1 1 sp|C1A0X5|MURG_RHOE4 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.3e-29 105.3 0.3 1.8e-28 103.9 0.1 1.8 1 sp|Q748D6|MURG_GEOSL UDP-N-acetylglucosamine--N-acetylmuram
+ 8.2e-29 105.1 0.1 1.3e-28 104.4 0.1 1.4 1 sp|Q820Y4|MURG_TROWT UDP-N-acetylglucosamine--N-acetylmuram
+ 8.2e-29 105.1 0.1 1.3e-28 104.4 0.1 1.4 1 sp|Q83HK1|MURG_TROW8 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.3e-29 105.1 3.4 1.3e-28 104.5 0.9 2.2 1 sp|A4QFM3|MURG_CORGB UDP-N-acetylglucosamine--N-acetylmuram
+ 8.5e-29 105.0 0.5 1.8e-28 104.0 0.1 1.7 1 sp|Q39YL9|MURG_GEOMG UDP-N-acetylglucosamine--N-acetylmuram
+ 8.5e-29 105.0 0.0 1.3e-28 104.5 0.0 1.3 1 sp|A1R0I9|MURG_BORT9 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.7e-29 105.0 0.0 2e-28 103.9 0.0 1.6 1 sp|Q3AAE6|MURG_CARHZ UDP-N-acetylglucosamine--N-acetylmuram
+ 9.1e-29 104.9 3.5 1.3e-28 104.5 0.9 2.2 1 sp|Q8NNN5|MURG_CORGL UDP-N-acetylglucosamine--N-acetylmuram
+ 9.1e-29 104.9 0.0 2e-28 103.8 0.0 1.6 1 sp|Q0TNP7|MURG_CLOP1 UDP-N-acetylglucosamine--N-acetylmuram
+ 9.1e-29 104.9 0.0 2e-28 103.8 0.0 1.6 1 sp|Q8XIQ1|MURG_CLOPE UDP-N-acetylglucosamine--N-acetylmuram
+ 9.4e-29 104.9 0.0 2e-28 103.8 0.0 1.6 1 sp|Q0SRB4|MURG_CLOPS UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-28 104.8 2.6 1.9e-28 103.9 1.8 1.5 1 sp|Q5YYX9|MURG_NOCFA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-28 104.7 2.7 1.5e-28 104.3 0.4 2.0 1 sp|A7HH67|MURG_ANADF UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-28 104.6 0.0 2.6e-28 103.5 0.0 1.6 1 sp|Q82VS3|MURG_NITEU UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-28 104.6 3.5 1.3e-28 104.4 1.4 1.9 1 sp|B0RVA5|MURG_XANCB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-28 104.6 0.8 2.9e-28 103.3 0.5 1.7 1 sp|Q2SZI3|MURG_BURTA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-28 104.5 1.3 1.8e-28 104.0 0.3 1.7 1 sp|Q11GS5|MURG_MESSB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-28 104.5 3.6 1.3e-28 104.4 1.4 1.9 1 sp|Q4UQX0|MURG_XANC8 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-28 104.5 3.6 1.3e-28 104.4 1.4 1.9 1 sp|Q8PCK0|MURG_XANCP UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-28 104.4 0.8 3.4e-28 103.1 0.5 1.7 1 sp|A3NZL5|MURG_BURP0 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-28 104.3 2.8 1.7e-28 104.1 0.7 1.9 1 sp|Q98KB3|MURG_RHILO UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-28 104.2 1.6 3.5e-28 103.1 1.1 1.6 1 sp|Q0A6K2|MURG_ALHEH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-28 104.2 0.0 3.4e-28 103.1 0.0 1.6 1 sp|A5IGA6|MURG_LEGPC UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-28 104.2 0.0 2.6e-28 103.5 0.0 1.4 1 sp|Q5L3H6|MURG_GEOKA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-28 104.1 2.6 2.9e-28 103.3 0.9 2.1 1 sp|A0LTM3|MURG_ACIC1 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.1e-28 103.7 0.0 4.3e-28 102.8 0.0 1.5 1 sp|Q3A2G6|MURG_PELCD UDP-N-acetylglucosamine--N-acetylmuram
+ 2.2e-28 103.7 0.2 5.5e-27 99.2 0.0 2.6 1 sp|Q0AYQ8|MURG_SYNWW UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-28 103.5 0.4 7.6e-28 102.0 0.1 1.9 1 sp|Q1LIM6|MURG_RALME UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-28 103.5 2.0 2.1e-27 100.5 0.5 2.2 1 sp|Q92NL9|MURG_RHIME UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-28 103.4 0.7 2.2e-27 100.4 0.3 2.1 1 sp|Q72JP9|MURG_THET2 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-28 103.4 1.3 2.8e-28 103.4 0.9 2.3 1 sp|A1R5F8|MURG_ARTAT UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-28 103.3 3.7 4.9e-28 102.6 2.6 1.4 1 sp|Q87AF9|MURG_XYLFT UDP-N-acetylglucosamine--N-acetylmuram
+ 3e-28 103.3 3.7 4.9e-28 102.6 2.6 1.4 1 sp|B2I9B3|MURG_XYLF2 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-28 103.1 1.4 5.6e-28 102.4 0.3 1.9 1 sp|A6WZQ6|MURG_OCHA4 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-28 103.1 0.7 8.6e-28 101.8 0.5 1.7 1 sp|A1V0R8|MURG_BURMS UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-28 103.1 0.7 8.6e-28 101.8 0.5 1.7 1 sp|A2S5U5|MURG_BURM9 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-28 103.1 0.7 8.6e-28 101.8 0.5 1.7 1 sp|A3MR63|MURG_BURM7 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-28 103.1 0.7 8.6e-28 101.8 0.5 1.7 1 sp|Q62GS7|MURG_BURMA UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-28 103.1 0.7 8.6e-28 101.8 0.5 1.7 1 sp|Q63QJ7|MURG_BURPS UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-28 103.1 0.7 8.6e-28 101.8 0.5 1.7 1 sp|A3NDW4|MURG_BURP6 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.9e-28 102.9 0.4 8.7e-28 101.8 0.3 1.6 1 sp|Q3J789|MURG_NITOC UDP-N-acetylglucosamine--N-acetylmuram
+ 3.9e-28 102.9 0.0 6e-28 102.3 0.0 1.3 1 sp|Q8K9T4|MURG_BUCAP UDP-N-acetylglucosamine--N-acetylmuram
+ 4e-28 102.9 0.4 7.8e-28 101.9 0.0 1.7 1 sp|B9M172|MURG_GEOSF UDP-N-acetylglucosamine--N-acetylmuram
+ 4e-28 102.9 0.4 1.1e-27 101.5 0.0 1.9 1 sp|B5EBQ1|MURG_GEOBB UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-28 102.8 0.9 1.1e-27 101.5 0.6 1.7 1 sp|Q3JND8|MURG_BURP1 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-28 102.8 1.1 8.4e-28 101.8 0.3 1.8 1 sp|Q1IKH0|MURG_ACIBL UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-28 102.8 0.1 1.4e-27 101.1 0.0 1.9 1 sp|P74657|MURG_SYNY3 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.4e-28 102.7 0.5 9.7e-28 101.6 0.4 1.6 1 sp|B1YSS4|MURG_BURA4 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.4e-28 102.7 0.5 9.7e-28 101.6 0.4 1.6 1 sp|Q0BIK1|MURG_BURCM UDP-N-acetylglucosamine--N-acetylmuram
+ 5.7e-28 102.4 0.0 2.2e-27 100.5 0.0 1.9 1 sp|Q6HDR3|MURG2_BACHK UDP-N-acetylglucosamine--N-acetylmuram
+ 5.7e-28 102.4 0.0 2.2e-27 100.5 0.0 1.9 1 sp|Q81JE6|MURG2_BACAN UDP-N-acetylglucosamine--N-acetylmuram
+ 6.2e-28 102.2 0.9 1.3e-27 101.2 0.2 1.8 1 sp|Q0K6M4|MURG_RALEH UDP-N-acetylglucosamine--N-acetylmuram
+ 6.4e-28 102.2 0.0 1.5e-27 101.0 0.0 1.6 1 sp|Q5WY98|MURG_LEGPL UDP-N-acetylglucosamine--N-acetylmuram
+ 6.5e-28 102.2 0.0 2.2e-27 100.5 0.0 1.8 1 sp|A0RIN0|MURG3_BACAH UDP-N-acetylglucosamine--N-acetylmuram
+ 6.7e-28 102.1 0.5 1.7e-27 100.9 0.4 1.7 1 sp|Q7W4B4|MURG_BORPA UDP-N-acetylglucosamine--N-acetylmuram
+ 6.7e-28 102.1 0.0 1.5e-27 101.0 0.0 1.6 1 sp|Q5X6U5|MURG_LEGPA UDP-N-acetylglucosamine--N-acetylmuram
+ 6.7e-28 102.1 0.0 1.5e-27 101.0 0.0 1.6 1 sp|Q5ZXC4|MURG_LEGPH UDP-N-acetylglucosamine--N-acetylmuram
+ 6.9e-28 102.1 0.0 1.1e-27 101.4 0.0 1.4 1 sp|A6M1F0|MURG_CLOB8 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.7e-28 101.9 0.0 1.1e-27 101.4 0.0 1.2 1 sp|B8D7B9|MURG_BUCAT UDP-N-acetylglucosamine--N-acetylmuram
+ 7.7e-28 101.9 0.0 1.1e-27 101.4 0.0 1.2 1 sp|P57311|MURG_BUCAI UDP-N-acetylglucosamine--N-acetylmuram
+ 8.3e-28 101.8 0.5 2e-27 100.6 0.4 1.7 1 sp|Q7VUQ3|MURG_BORPE UDP-N-acetylglucosamine--N-acetylmuram
+ 8.4e-28 101.8 0.5 2e-27 100.6 0.4 1.7 1 sp|Q7WFS2|MURG_BORBR UDP-N-acetylglucosamine--N-acetylmuram
+ 8.7e-28 101.8 1.5 3.6e-27 99.8 0.3 2.1 1 sp|B2SYX6|MURG_BURPP UDP-N-acetylglucosamine--N-acetylmuram
+ 9.7e-28 101.6 0.0 1.6e-27 100.9 0.0 1.4 1 sp|B0B8Y7|MURG_CHLT2 UDP-N-acetylglucosamine--N-acetylmuram
+ 9.7e-28 101.6 0.0 1.6e-27 100.9 0.0 1.4 1 sp|B0BAL6|MURG_CHLTB UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-27 101.5 0.0 1.5e-27 101.0 0.0 1.2 1 sp|B8D914|MURG_BUCA5 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-27 101.5 0.4 2.4e-27 100.4 0.3 1.6 1 sp|Q47AA4|MURG_DECAR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-27 101.4 0.5 2.3e-27 100.4 0.3 1.5 1 sp|A4JB94|MURG_BURVG UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-27 101.2 0.1 2.2e-27 100.4 0.1 1.4 1 sp|Q2Y638|MURG_NITMU UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-27 101.0 1.1 2.6e-27 100.2 0.2 1.8 1 sp|B2JHG0|MURG_BURP8 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-27 101.0 0.0 2.6e-27 100.2 0.0 1.4 1 sp|O84766|MURG_CHLTR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-27 101.0 0.0 2.6e-27 100.2 0.0 1.4 1 sp|Q3KKT1|MURG_CHLTA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-27 100.8 0.1 3.5e-27 99.8 0.0 1.5 1 sp|A1AU61|MURG_PELPD UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-27 100.8 0.0 3.6e-27 99.8 0.0 1.5 1 sp|Q2LR48|MURG_SYNAS UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-27 100.7 1.6 3.2e-27 99.9 0.6 1.8 1 sp|Q2G995|MURG_NOVAD UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-27 100.7 0.9 4.2e-27 99.5 0.3 1.8 1 sp|A5EY03|MURG_DICNV UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-27 100.6 5.4 2e-27 100.6 0.8 2.4 1 sp|Q8FNU0|MURG_COREF UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-27 100.6 0.9 4.5e-27 99.4 0.6 1.6 1 sp|A9AI96|MURG_BURM1 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-27 100.4 0.2 3.9e-27 99.7 0.1 1.4 1 sp|Q21SW9|MURG_RHOFD UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-27 100.2 0.0 4.9e-27 99.3 0.0 1.5 1 sp|B5YFT4|MURG_THEYD UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-27 100.2 0.0 7e-27 98.8 0.0 1.8 1 sp|A7KAK6|ATG26_PICAN Sterol 3-beta-glucosyltransferase OS=P
+ 3.1e-27 100.0 0.7 6.9e-27 98.9 0.1 1.8 1 sp|Q46WZ4|MURG_RALEJ UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-27 100.0 1.6 1.1e-26 98.1 0.3 2.1 1 sp|Q13TZ2|MURG_BURXL UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-27 99.9 0.2 1.1e-26 98.2 0.0 2.0 1 sp|C6DZK6|MURG_GEOSM UDP-N-acetylglucosamine--N-acetylmuram
+ 4.4e-27 99.5 0.0 7.7e-27 98.7 0.0 1.4 1 sp|A8GVJ7|MURG_RICB8 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.4e-27 99.5 0.0 7.7e-27 98.7 0.0 1.4 1 sp|Q1RI55|MURG_RICBR UDP-N-acetylglucosamine--N-acetylmuram
+ 5.2e-27 99.2 1.7 5.1e-26 96.0 0.7 2.2 1 sp|B5ZWJ4|MURG_RHILW UDP-N-acetylglucosamine--N-acetylmuram
+ 5.4e-27 99.2 0.0 1e-26 98.3 0.0 1.5 1 sp|B0JFZ1|MURG_MICAN UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-27 99.1 0.2 1.3e-26 98.0 0.1 1.6 1 sp|Q31KS7|MURG_SYNE7 UDP-N-acetylglucosamine--N-acetylmuram
+ 6e-27 99.1 0.2 1.3e-26 97.9 0.1 1.6 1 sp|Q5N140|MURG_SYNP6 UDP-N-acetylglucosamine--N-acetylmuram
+ 6.4e-27 99.0 0.0 1.6e-26 97.6 0.0 1.7 1 sp|Q14I26|MURG_FRAT1 UDP-N-acetylglucosamine--N-acetylmuram
+ 6.4e-27 99.0 0.0 1.6e-26 97.6 0.0 1.7 1 sp|Q5NGM4|MURG_FRATT UDP-N-acetylglucosamine--N-acetylmuram
+ 6.5e-27 98.9 0.0 1.5e-26 97.8 0.0 1.6 1 sp|Q493Q1|MURG_BLOPB UDP-N-acetylglucosamine--N-acetylmuram
+ 6.5e-27 98.9 0.0 1.1e-26 98.2 0.0 1.4 1 sp|Q92I58|MURG_RICCN UDP-N-acetylglucosamine--N-acetylmuram
+ 6.5e-27 98.9 0.0 1.1e-26 98.2 0.0 1.4 1 sp|C3PND5|MURG_RICAE UDP-N-acetylglucosamine--N-acetylmuram
+ 6.5e-27 98.9 0.0 1.1e-26 98.2 0.0 1.4 1 sp|C4K2A6|MURG_RICPU UDP-N-acetylglucosamine--N-acetylmuram
+ 6.6e-27 98.9 0.0 1e-26 98.3 0.0 1.3 1 sp|B2S1A8|MURG_BORHD UDP-N-acetylglucosamine--N-acetylmuram
+ 6.6e-27 98.9 0.0 1.1e-26 98.2 0.0 1.4 1 sp|A8GRZ6|MURG_RICRS UDP-N-acetylglucosamine--N-acetylmuram
+ 6.6e-27 98.9 0.0 1.1e-26 98.2 0.0 1.4 1 sp|B0BXF6|MURG_RICRO UDP-N-acetylglucosamine--N-acetylmuram
+ 6.7e-27 98.9 0.5 1.5e-26 97.8 0.4 1.6 1 sp|Q3SMH3|MURG_THIDA UDP-N-acetylglucosamine--N-acetylmuram
+ 6.7e-27 98.9 0.9 1.7e-26 97.6 0.7 1.7 1 sp|Q21MG9|MURG_SACD2 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.7e-27 98.5 0.0 6.8e-26 95.6 0.0 2.2 1 sp|B1IAM4|MURG_STRPI UDP-N-acetylglucosamine--N-acetylmuram
+ 8.7e-27 98.5 0.0 6.8e-26 95.6 0.0 2.2 1 sp|Q04LK0|MURG_STRP2 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.7e-27 98.5 0.0 6.8e-26 95.6 0.0 2.2 1 sp|Q8DQM1|MURG_STRR6 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.7e-27 98.5 0.0 6.8e-26 95.6 0.0 2.2 1 sp|B2IN77|MURG_STRPS UDP-N-acetylglucosamine--N-acetylmuram
+ 8.8e-27 98.5 0.0 6.8e-26 95.6 0.0 2.2 1 sp|C1CQG5|MURG_STRZT UDP-N-acetylglucosamine--N-acetylmuram
+ 8.9e-27 98.5 0.0 6.8e-26 95.6 0.0 2.2 1 sp|C1CD52|MURG_STRZJ UDP-N-acetylglucosamine--N-acetylmuram
+ 9e-27 98.5 0.0 2.4e-26 97.1 0.0 1.7 1 sp|Q634T3|MURG2_BACCZ UDP-N-acetylglucosamine--N-acetylmuram
+ 9e-27 98.5 0.3 1.7e-26 97.5 0.2 1.5 1 sp|A1VST6|MURG_POLNA UDP-N-acetylglucosamine--N-acetylmuram
+ 9e-27 98.5 2.0 3.5e-26 96.6 0.8 2.1 1 sp|A6UB85|MURG_SINMW UDP-N-acetylglucosamine--N-acetylmuram
+ 9.2e-27 98.5 0.0 5.5e-26 95.9 0.0 2.0 1 sp|B9DNZ7|MURG_STACT UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-26 98.3 0.5 2.6e-26 97.0 0.4 1.7 1 sp|B4E6J2|MURG_BURCJ UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-26 98.3 0.5 2.6e-26 97.0 0.4 1.7 1 sp|B1JV78|MURG_BURCC UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-26 98.2 0.0 6.8e-26 95.6 0.0 2.1 1 sp|C1C649|MURG_STRP7 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-26 98.2 0.4 3e-26 96.8 0.2 1.7 1 sp|Q2S9Z2|MURG_HAHCH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-26 98.2 0.0 7.6e-26 95.5 0.0 2.2 1 sp|B5E2Z9|MURG_STRP4 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-26 98.2 0.0 7.6e-26 95.5 0.0 2.2 1 sp|C1CJF3|MURG_STRZP UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-26 98.1 0.4 2.5e-26 97.1 0.3 1.6 1 sp|A9I4V2|MURG_BORPD UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-26 98.0 2.0 1.3e-26 98.0 1.4 2.0 1 sp|B0RIJ3|MURG_CLAMS UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-26 97.9 0.0 1.1e-25 95.0 0.0 2.2 1 sp|P0CB60|MURG_STRPN UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-26 97.9 0.0 1e-25 95.0 0.0 2.2 1 sp|B8ZMZ7|MURG_STRPJ UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-26 97.8 1.6 1.1e-25 94.9 0.7 2.2 1 sp|B3PTW0|MURG_RHIE6 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-26 97.8 1.9 3.3e-26 96.7 1.3 1.6 1 sp|Q0SHS1|MURG_RHOSR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-26 97.7 2.4 3.1e-26 96.8 0.9 2.0 1 sp|Q313Q3|MURG_DESDG UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-26 97.7 0.0 3.1e-26 96.8 0.0 1.5 1 sp|A8F1I4|MURG_RICM5 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-26 97.7 0.0 2.5e-26 97.0 0.0 1.3 1 sp|A6H195|MURG_FLAPJ UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-26 97.6 1.4 2.6e-26 97.0 0.4 1.8 1 sp|A0K486|MURG_BURCH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-26 97.6 1.4 2.6e-26 97.0 0.4 1.8 1 sp|Q1BZG3|MURG_BURCA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-26 97.6 0.3 3.4e-26 96.6 0.2 1.5 1 sp|Q12EL5|MURG_POLSJ UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-26 97.5 1.2 4.5e-26 96.2 0.9 1.6 1 sp|Q8UDM8|MURG_AGRT5 UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-26 97.3 0.1 3.4e-26 96.6 0.0 1.4 1 sp|B7K5Z6|MURG_CYAP8 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.1e-26 97.3 0.3 8e-26 95.4 0.2 2.0 1 sp|Q2NCZ0|MURG_ERYLH UDP-N-acetylglucosamine--N-acetylmuram
+ 2.1e-26 97.3 0.0 7.3e-26 95.5 0.0 2.0 1 sp|Q9Y751|ATG26_PICPG Sterol 3-beta-glucosyltransferase OS=P
+ 2.1e-26 97.3 0.3 4.2e-26 96.3 0.2 1.5 1 sp|Q5P6Z6|MURG_AZOSE UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-26 97.1 1.7 4.3e-26 96.3 1.1 1.5 1 sp|B6IRG2|MURG_RHOCS UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-26 97.1 0.0 3.9e-26 96.4 0.0 1.4 1 sp|A7TF84|ATG26_VANPO Sterol 3-beta-glucosyltransferase OS=V
+ 2.4e-26 97.1 2.4 1.7e-25 94.3 1.4 2.1 1 sp|Q2S528|MURG_SALRD UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-26 97.0 0.0 6.5e-26 95.7 0.0 1.7 1 sp|B2SGS8|MURG_FRATM UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-26 97.0 0.0 6.5e-26 95.7 0.0 1.7 1 sp|A4IX64|MURG_FRATW UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-26 96.9 1.6 6.3e-26 95.7 1.1 1.7 1 sp|Q67Q48|MURG_SYMTH UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-26 96.7 0.0 6.6e-26 95.7 0.0 1.6 1 sp|Q6C8M8|ATG26_YARLI Sterol 3-beta-glucosyltransferase OS=Y
+ 3.1e-26 96.7 2.1 7e-26 95.6 1.4 1.6 1 sp|C1AU55|MURG_RHOOB UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-26 96.7 0.1 6.8e-26 95.6 0.1 1.6 1 sp|B3E3Y2|MURG_GEOLS UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-26 96.7 0.0 8.1e-26 95.4 0.0 1.7 1 sp|A0Q766|MURG_FRATN UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-26 96.7 0.0 4.9e-26 96.1 0.0 1.3 1 sp|B1WVP7|MURG_CYAA5 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-26 96.5 0.0 6.8e-26 95.6 0.0 1.4 1 sp|B0TY93|MURG_FRAP2 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-26 96.4 0.0 8.7e-26 95.3 0.0 1.6 1 sp|Q68WW7|MURG_RICTY UDP-N-acetylglucosamine--N-acetylmuram
+ 4.1e-26 96.4 0.0 7.5e-26 95.5 0.0 1.5 1 sp|Q6GGZ0|MURG_STAAR UDP-N-acetylglucosamine--N-acetylmuram
+ 5e-26 96.1 0.6 1.4e-25 94.6 0.4 1.7 1 sp|B9JH51|MURG_AGRRK UDP-N-acetylglucosamine--N-acetylmuram
+ 5.6e-26 95.9 0.0 1.2e-25 94.9 0.0 1.6 1 sp|Q6BN88|ATG26_DEBHA Sterol 3-beta-glucosyltransferase OS=D
+ 6.1e-26 95.8 0.0 1.6e-25 94.5 0.0 1.7 1 sp|A7NDC0|MURG_FRATF UDP-N-acetylglucosamine--N-acetylmuram
+ 6.1e-26 95.8 0.0 1.6e-25 94.5 0.0 1.7 1 sp|Q0BL37|MURG_FRATO UDP-N-acetylglucosamine--N-acetylmuram
+ 6.1e-26 95.8 0.0 1.6e-25 94.5 0.0 1.7 1 sp|Q2A2I7|MURG_FRATH UDP-N-acetylglucosamine--N-acetylmuram
+ 6.5e-26 95.7 2.5 6.5e-26 95.7 1.7 1.9 1 sp|A5CS51|MURG_CLAM3 UDP-N-acetylglucosamine--N-acetylmuram
+ 6.6e-26 95.7 0.0 1.1e-25 94.9 0.0 1.4 1 sp|Q9ZDC0|MURG_RICPR UDP-N-acetylglucosamine--N-acetylmuram
+ 7.1e-26 95.6 0.0 1.2e-25 94.8 0.0 1.4 1 sp|Q9ZK59|MURG_HELPJ UDP-N-acetylglucosamine--N-acetylmuram
+ 7.7e-26 95.5 0.0 1.4e-25 94.6 0.0 1.4 1 sp|B7KGH1|MURG_CYAP7 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.9e-26 95.4 0.0 1.4e-25 94.6 0.0 1.4 1 sp|Q4L6C8|MURG_STAHJ UDP-N-acetylglucosamine--N-acetylmuram
+ 9.3e-26 95.2 1.4 9.3e-26 95.2 0.9 1.7 1 sp|B4UES1|MURG_ANASK UDP-N-acetylglucosamine--N-acetylmuram
+ 9.8e-26 95.1 3.1 1.4e-25 94.7 1.3 1.8 1 sp|B9JY54|MURG_AGRVS UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-25 94.7 1.4 4.4e-25 93.0 0.8 1.9 1 sp|Q1ME33|MURG_RHIL3 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-25 94.6 0.0 2.5e-25 93.8 0.0 1.4 1 sp|A8EZ14|MURG_RICCK UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-25 94.5 0.0 3.8e-25 93.2 0.0 1.7 1 sp|Q5A950|ATG26_CANAL Sterol 3-beta-glucosyltransferase OS=C
+ 1.6e-25 94.4 1.3 1.6e-25 94.4 0.9 1.7 1 sp|Q2IG27|MURG_ANADE UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-25 94.1 1.4 2e-25 94.1 1.0 1.7 1 sp|B8J8E8|MURG_ANAD2 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.1e-25 94.0 1.0 5.2e-25 92.8 0.7 1.7 1 sp|C3MEM9|MURG_RHISN UDP-N-acetylglucosamine--N-acetylmuram
+ 2.1e-25 94.0 0.0 4.1e-25 93.1 0.0 1.5 1 sp|Q1CSB1|MURG_HELPH UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-25 93.9 0.0 4.4e-25 93.0 0.0 1.4 1 sp|P59424|MURG_BUCBP UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-25 93.9 1.4 1.3e-24 91.4 0.8 2.1 1 sp|Q2K6C1|MURG_RHIEC UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-25 93.9 0.0 4.1e-25 93.1 0.0 1.4 1 sp|O25770|MURG_HELPY UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-25 93.9 0.0 5.7e-25 92.6 0.0 1.6 1 sp|A0M527|MURG_GRAFK UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-25 93.9 0.0 4.1e-25 93.1 0.0 1.4 1 sp|B2UUR4|MURG_HELPS UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-25 93.8 0.0 4.5e-25 93.0 0.0 1.5 1 sp|Q3K2P3|MURG_STRA1 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-25 93.8 0.0 4.5e-25 93.0 0.0 1.5 1 sp|Q8CX15|MURG_STRA5 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-25 93.8 0.0 4.5e-25 93.0 0.0 1.5 1 sp|Q8E6P0|MURG_STRA3 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-25 93.8 0.0 4.8e-25 92.9 0.0 1.5 1 sp|Q7U346|MURG_BLOFL UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-25 93.7 0.0 4.8e-25 92.9 0.0 1.4 1 sp|Q5HPC0|MURG_STAEQ UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-25 93.7 0.0 4.8e-25 92.9 0.0 1.4 1 sp|Q8CMM3|MURG_STAES UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-25 93.6 0.7 5.8e-25 92.6 0.3 1.7 1 sp|Q01Q48|MURG_SOLUE UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-25 93.6 0.0 4.9e-25 92.8 0.0 1.4 1 sp|B5Z8F1|MURG_HELPG UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-25 93.5 0.0 5.8e-25 92.6 0.0 1.5 1 sp|Q5L524|MURG_CHLAB UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-25 93.5 0.0 5.6e-25 92.7 0.0 1.4 1 sp|Q255W4|MURG_CHLFF UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-25 93.5 0.0 6.7e-25 92.4 0.0 1.5 1 sp|Q820E0|MURG_CHLCV UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-25 93.4 2.3 3.5e-25 93.3 0.2 2.0 1 sp|Q8XVI7|MURG_RALSO UDP-N-acetylglucosamine--N-acetylmuram
+ 3.6e-25 93.3 0.0 6.6e-25 92.4 0.0 1.4 1 sp|Q4ULT6|MURG_RICFE UDP-N-acetylglucosamine--N-acetylmuram
+ 3.9e-25 93.2 0.0 6.6e-25 92.4 0.0 1.4 1 sp|Q49XM9|MURG_STAS1 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.9e-25 93.2 0.0 6.5e-25 92.5 0.0 1.4 1 sp|Q119X8|MURG_TRIEI UDP-N-acetylglucosamine--N-acetylmuram
+ 4e-25 93.2 0.0 1.3e-24 91.5 0.0 1.9 1 sp|Q03L97|MURG_STRTD UDP-N-acetylglucosamine--N-acetylmuram
+ 4e-25 93.1 1.0 7.4e-25 92.3 0.7 1.5 1 sp|A0L5N1|MURG_MAGSM UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-25 93.1 3.7 4.2e-25 93.1 1.2 2.0 1 sp|B8H091|MURG_CAUCN UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-25 93.1 3.7 4.2e-25 93.1 1.2 2.0 1 sp|Q9A5A1|MURG_CAUCR UDP-N-acetylglucosamine--N-acetylmuram
+ 4.4e-25 93.0 0.0 7.8e-25 92.2 0.0 1.4 1 sp|A8GNC7|MURG_RICAH UDP-N-acetylglucosamine--N-acetylmuram
+ 4.7e-25 92.9 0.0 1.5e-24 91.3 0.0 1.9 1 sp|B5XMA2|MURG_STRPZ UDP-N-acetylglucosamine--N-acetylmuram
+ 4.8e-25 92.9 0.0 7.7e-25 92.2 0.0 1.3 1 sp|B6JMZ5|MURG_HELP2 UDP-N-acetylglucosamine--N-acetylmuram
+ 5e-25 92.8 0.0 1e-24 91.8 0.0 1.6 1 sp|A7ERM5|ATG26_SCLS1 Sterol 3-beta-glucosyltransferase OS=S
+ 5.1e-25 92.8 0.3 1.2e-24 91.6 0.2 1.6 1 sp|Q7V466|MURG_PROMM UDP-N-acetylglucosamine--N-acetylmuram
+ 5.7e-25 92.7 0.3 1.2e-24 91.7 0.2 1.5 1 sp|A2CDG1|MURG_PROM3 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 2.1e-24 90.8 0.0 1.9 1 sp|Q5M0D4|MURG_STRT1 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 2.1e-24 90.8 0.0 1.9 1 sp|Q5M4Y1|MURG_STRT2 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 1.1e-24 91.7 0.0 1.5 1 sp|A6QGX0|MURG_STAAE UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 1.1e-24 91.7 0.0 1.5 1 sp|Q2FYL5|MURG_STAA8 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 1.1e-24 91.7 0.0 1.5 1 sp|Q5HG02|MURG_STAAC UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 1.1e-24 91.7 0.0 1.5 1 sp|Q6G9E3|MURG_STAAS UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 1.1e-24 91.7 0.0 1.5 1 sp|Q8NWR4|MURG_STAAW UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 1.1e-24 91.7 0.0 1.5 1 sp|A5ISU9|MURG_STAA9 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 1.1e-24 91.7 0.0 1.5 1 sp|A6U1N8|MURG_STAA2 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 1.1e-24 91.7 0.0 1.5 1 sp|A7X2A2|MURG_STAA1 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 1.1e-24 91.7 0.0 1.5 1 sp|P65481|MURG_STAAM UDP-N-acetylglucosamine--N-acetylmuram
+ 5.8e-25 92.6 0.0 1.1e-24 91.7 0.0 1.5 1 sp|P65482|MURG_STAAN UDP-N-acetylglucosamine--N-acetylmuram
+ 6e-25 92.6 0.0 1.1e-24 91.7 0.0 1.4 1 sp|Q2YY01|MURG_STAAB UDP-N-acetylglucosamine--N-acetylmuram
+ 6.2e-25 92.5 0.0 2.1e-24 90.8 0.0 1.9 1 sp|Q7MAW5|MURG_PORGI UDP-N-acetylglucosamine--N-acetylmuram
+ 6.3e-25 92.5 0.1 2.1e-24 90.8 0.0 1.9 1 sp|A2RDL0|MURG_STRPG UDP-N-acetylglucosamine--N-acetylmuram
+ 6.4e-25 92.5 0.1 2.1e-24 90.8 0.0 1.9 1 sp|Q5XB05|MURG_STRP6 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.5e-25 92.3 0.0 2.5e-24 90.6 0.0 1.9 1 sp|Q1JAT5|MURG_STRPB UDP-N-acetylglucosamine--N-acetylmuram
+ 7.5e-25 92.3 0.0 2.5e-24 90.6 0.0 1.9 1 sp|Q1JKY5|MURG_STRPC UDP-N-acetylglucosamine--N-acetylmuram
+ 9.4e-25 91.9 0.0 2.1e-24 90.8 0.0 1.6 1 sp|B2RIF1|MURG_PORG3 UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-24 91.8 0.0 2.4e-24 90.6 0.0 1.6 1 sp|C0M6J2|MURG_STRE4 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-24 91.5 1.0 2.8e-24 90.4 0.7 1.6 1 sp|A1UTC5|MURG_BARBK UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-24 91.5 0.0 3e-24 90.3 0.0 1.6 1 sp|C0MD54|MURG_STRS7 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-24 91.3 0.0 3.2e-24 90.2 0.0 1.6 1 sp|B4U1U4|MURG_STREM UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-24 91.3 0.0 2.7e-24 90.5 0.0 1.5 1 sp|A5CWW1|MURG_VESOH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-24 91.3 1.6 4.1e-24 89.9 1.1 1.7 1 sp|A1A2E9|MURG_BIFAA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-24 91.2 0.0 5.1e-24 89.6 0.0 1.9 1 sp|P65483|MURG_STRP1 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-24 91.2 0.0 5.1e-24 89.6 0.0 1.9 1 sp|P65484|MURG_STRP8 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-24 91.2 0.0 5.1e-24 89.6 0.0 1.9 1 sp|Q48SK9|MURG_STRPM UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-24 91.2 0.0 5.1e-24 89.6 0.0 1.9 1 sp|Q1J5S6|MURG_STRPF UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-24 91.2 0.0 3e-24 90.3 0.0 1.5 1 sp|A8Z3Z7|MURG_STAAT UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-24 91.2 0.0 3e-24 90.3 0.0 1.5 1 sp|Q2FH20|MURG_STAA3 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-24 91.2 0.0 5.1e-24 89.6 0.0 1.9 1 sp|Q1JG11|MURG_STRPD UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-24 91.0 0.0 4e-24 89.9 0.0 1.6 1 sp|Q17WB5|MURG_HELAH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.9e-24 90.9 0.1 3.4e-24 90.1 0.1 1.4 1 sp|C6BYG6|MURG_DESAD UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-24 90.7 0.5 5.7e-24 89.4 0.2 1.8 1 sp|Q6G2Q5|MURG_BARHE UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-24 90.7 0.2 5.6e-24 89.4 0.1 1.7 1 sp|A9IWA5|MURG_BART1 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-24 90.4 0.0 5.7e-24 89.4 0.0 1.6 1 sp|Q8CUL4|MURG_OCEIH UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-24 90.4 0.0 5.6e-24 89.4 0.0 1.5 1 sp|A6LEU3|MURG_PARD8 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-24 90.2 1.4 3.1e-24 90.2 1.0 1.7 1 sp|Q6AE64|MURG_LEIXX UDP-N-acetylglucosamine--N-acetylmuram
+ 3.3e-24 90.2 0.2 6.9e-24 89.1 0.1 1.6 1 sp|A1K3U6|MURG_AZOSB UDP-N-acetylglucosamine--N-acetylmuram
+ 3.9e-24 89.9 0.0 6.2e-24 89.3 0.0 1.3 1 sp|Q9PLG2|MURG_CHLMU UDP-N-acetylglucosamine--N-acetylmuram
+ 4.1e-24 89.9 0.6 8.9e-24 88.8 0.4 1.6 1 sp|Q1GRX9|MURG_SPHAL UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-24 89.8 0.0 9.1e-24 88.7 0.0 1.6 1 sp|Q751Z4|ATG26_ASHGO Sterol 3-beta-glucosyltransferase OS=A
+ 4.4e-24 89.8 0.1 1.3e-23 88.2 0.0 1.8 1 sp|A4VTK4|MURG_STRSY UDP-N-acetylglucosamine--N-acetylmuram
+ 4.4e-24 89.8 0.1 1.3e-23 88.2 0.0 1.8 1 sp|A4VZT9|MURG_STRS2 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.6e-24 89.7 0.1 9.2e-24 88.7 0.0 1.5 1 sp|B3QWT7|MURG_CHLT3 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.6e-24 89.7 0.0 8e-24 88.9 0.0 1.4 1 sp|Q6AJ53|MURG_DESPS UDP-N-acetylglucosamine--N-acetylmuram
+ 5e-24 89.6 0.6 9.4e-24 88.7 0.2 1.6 1 sp|B9K6P7|MURG_THENN UDP-N-acetylglucosamine--N-acetylmuram
+ 5.9e-24 89.3 0.0 1.9e-23 87.7 0.0 1.9 1 sp|Q8K6R7|MURG_STRP3 UDP-N-acetylglucosamine--N-acetylmuram
+ 6.9e-24 89.1 0.0 1.3e-23 88.3 0.0 1.5 1 sp|Q54IL5|UGT52_DICDI UDP-sugar-dependent glycosyltransferas
+ 7.5e-24 89.0 0.6 1.9e-23 87.7 0.4 1.7 1 sp|B3DQN1|MURG_BIFLD UDP-N-acetylglucosamine--N-acetylmuram
+ 7.5e-24 89.0 0.6 1.9e-23 87.7 0.4 1.7 1 sp|Q8CY50|MURG_BIFLO UDP-N-acetylglucosamine--N-acetylmuram
+ 7.8e-24 89.0 0.0 1.8e-23 87.7 0.0 1.7 1 sp|Q6MIG1|MURG_BDEBA UDP-N-acetylglucosamine--N-acetylmuram
+ 8.4e-24 88.9 0.6 1.5e-23 88.0 0.4 1.5 1 sp|Q7U3U6|MURG_SYNPX UDP-N-acetylglucosamine--N-acetylmuram
+ 8.9e-24 88.8 0.6 2.2e-23 87.5 0.4 1.7 1 sp|B7GQ78|MURG_BIFLI UDP-N-acetylglucosamine--N-acetylmuram
+ 9.3e-24 88.7 0.0 3.8e-23 86.7 0.0 2.1 1 sp|Q0UY53|ATG26_PHANO Sterol 3-beta-glucosyltransferase OS=P
+ 1.2e-23 88.4 0.0 3.6e-23 86.8 0.0 1.8 1 sp|Q8DVE2|MURG_STRMU UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-23 88.4 2.0 1.3e-23 88.2 0.6 1.7 1 sp|Q6N411|MURG_RHOPA UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-23 88.3 0.0 3.2e-23 87.0 0.0 1.8 1 sp|Q6CUV2|ATG26_KLULA Sterol 3-beta-glucosyltransferase OS=K
+ 1.3e-23 88.3 0.1 2e-23 87.6 0.1 1.3 1 sp|Q1MPB9|MURG_LAWIP UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-23 88.3 0.0 2e-22 84.4 0.0 2.2 1 sp|Q8R5N5|MURG_FUSNN UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-23 88.1 0.3 3.8e-23 86.7 0.1 1.8 1 sp|Q3ANV3|MURG_CHLCH UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-23 88.1 0.0 6.7e-23 85.9 0.0 2.1 1 sp|A8AW15|MURG_STRGC UDP-N-acetylglucosamine--N-acetylmuram
+ 2.2e-23 87.5 1.7 5.9e-23 86.1 1.2 1.8 1 sp|B8DP79|MURG_DESVM UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-23 87.4 1.2 4.6e-23 86.5 0.8 1.5 1 sp|Q728U8|MURG_DESVH UDP-N-acetylglucosamine--N-acetylmuram
+ 3e-23 87.1 0.0 5.9e-23 86.1 0.0 1.5 1 sp|Q8NJS1|ATG26_LEPMC Sterol 3-beta-glucosyltransferase OS=L
+ 3.4e-23 86.9 0.0 6.2e-23 86.0 0.0 1.5 1 sp|Q5KK25|ATG26_CRYNE Sterol 3-beta-glucosyltransferase OS=C
+ 3.5e-23 86.8 0.1 9.9e-23 85.4 0.0 1.8 1 sp|Q8YZI3|MURG_ANASP UDP-N-acetylglucosamine--N-acetylmuram
+ 3.6e-23 86.8 0.0 1e-22 85.3 0.0 1.8 1 sp|B9DUV6|MURG_STRU0 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-23 86.7 0.0 7.7e-23 85.7 0.0 1.6 1 sp|Q3M935|MURG_ANAVT UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-23 86.7 0.0 8.2e-23 85.7 0.0 1.6 1 sp|Q7VDZ2|MURG_PROMA UDP-N-acetylglucosamine--N-acetylmuram
+ 3.9e-23 86.7 0.1 7.7e-23 85.7 0.1 1.5 1 sp|Q0I6M0|MURG_SYNS3 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-23 86.6 0.1 9.6e-23 85.4 0.0 1.6 1 sp|B2J8J9|MURG_NOSP7 UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-23 86.6 0.3 4.2e-23 86.6 0.2 1.5 1 sp|A5GPC2|MURG_SYNPW UDP-N-acetylglucosamine--N-acetylmuram
+ 4.5e-23 86.5 2.3 4.5e-23 86.5 1.6 1.8 1 sp|B4RFS0|MURG_PHEZH UDP-N-acetylglucosamine--N-acetylmuram
+ 5.2e-23 86.3 1.4 1e-22 85.4 1.0 1.5 1 sp|A1VBE8|MURG_DESVV UDP-N-acetylglucosamine--N-acetylmuram
+ 6.2e-23 86.1 0.0 1e-22 85.4 0.0 1.4 1 sp|B7IHN7|MURG_THEAB UDP-N-acetylglucosamine--N-acetylmuram
+ 6.3e-23 86.0 0.0 1.3e-22 85.0 0.0 1.6 1 sp|Q7S1I0|ATG26_NEUCR Sterol 3-beta-glucosyltransferase OS=N
+ 6.7e-23 85.9 0.4 1.2e-22 85.1 0.3 1.4 1 sp|Q3AVX2|MURG_SYNS9 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.2e-23 85.8 0.0 1.5e-22 84.8 0.0 1.6 1 sp|Q4WID6|ATG26_ASPFU Sterol 3-beta-glucosyltransferase OS=A
+ 7.2e-23 85.8 0.0 1.5e-22 84.8 0.0 1.6 1 sp|A1CYS1|ATG26_NEOFI Sterol 3-beta-glucosyltransferase OS=N
+ 7.8e-23 85.7 0.0 1.7e-22 84.6 0.0 1.6 1 sp|Q8DHY4|MURG_THEEB UDP-N-acetylglucosamine--N-acetylmuram
+ 8.1e-23 85.7 0.4 2.4e-22 84.2 0.0 1.9 1 sp|Q11RH5|MURG_CYTH3 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.2e-23 85.6 0.1 1.6e-22 84.7 0.0 1.5 1 sp|A9BDG0|MURG_PROM4 UDP-N-acetylglucosamine--N-acetylmuram
+ 9e-23 85.5 0.0 3.6e-22 83.6 0.0 2.0 1 sp|Q73L91|MURG_TREDE UDP-N-acetylglucosamine--N-acetylmuram
+ 9.7e-23 85.4 0.8 9.7e-23 85.4 0.6 1.9 1 sp|C4XK69|MURG_DESMR UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-22 85.3 1.9 2.3e-22 84.2 1.3 1.6 1 sp|A1BAL5|MURG_PARDP UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-22 85.1 0.1 4.1e-22 83.4 0.0 1.9 1 sp|A3CLN6|MURG_STRSV UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-22 85.1 0.0 2.5e-22 84.1 0.0 1.6 1 sp|A4SV74|MURG_POLSQ UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-22 84.9 0.0 2.6e-22 84.0 0.0 1.4 1 sp|O67238|MURG_AQUAE UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-22 84.7 0.0 2.8e-22 83.9 0.0 1.4 1 sp|Q2U0C3|ATG26_ASPOR Sterol 3-beta-glucosyltransferase OS=A
+ 1.6e-22 84.7 0.4 4.4e-22 83.3 0.3 1.8 1 sp|Q3STS8|MURG_NITWN UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-22 84.7 0.3 3.2e-22 83.7 0.2 1.5 1 sp|A1BJX8|MURG_CHLPD UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-22 84.6 0.0 3.6e-22 83.6 0.0 1.6 1 sp|A1AWE8|MURG_RUTMC UDP-N-acetylglucosamine--N-acetylmuram
+ 1.7e-22 84.6 0.0 3.2e-22 83.7 0.0 1.5 1 sp|A1CFB3|ATG26_ASPCL Sterol 3-beta-glucosyltransferase OS=A
+ 2.1e-22 84.4 2.1 5e-22 83.1 1.4 1.7 1 sp|B8IN64|MURG_METNO UDP-N-acetylglucosamine--N-acetylmuram
+ 2.2e-22 84.3 0.8 5.1e-22 83.1 0.2 1.9 1 sp|Q6G124|MURG_BARQU UDP-N-acetylglucosamine--N-acetylmuram
+ 2.2e-22 84.2 1.6 5e-22 83.1 1.1 1.6 1 sp|Q2W0H3|MURG_MAGSA UDP-N-acetylglucosamine--N-acetylmuram
+ 2.8e-22 83.9 0.0 5.3e-22 83.0 0.0 1.5 1 sp|Q0CKU4|ATG26_ASPTN Sterol 3-beta-glucosyltransferase OS=A
+ 2.8e-22 83.9 0.4 5.6e-22 82.9 0.2 1.6 1 sp|B1ZU31|MURG_OPITP UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-22 83.9 0.1 5.6e-22 82.9 0.0 1.5 1 sp|A6L071|MURG_BACV8 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-22 83.9 0.3 6.6e-22 82.7 0.2 1.6 1 sp|Q1QNU3|MURG_NITHX UDP-N-acetylglucosamine--N-acetylmuram
+ 3.8e-22 83.5 0.0 1e-21 82.1 0.0 1.7 1 sp|B2V7Y8|MURG_SULSY UDP-N-acetylglucosamine--N-acetylmuram
+ 4.9e-22 83.1 0.2 1e-21 82.1 0.1 1.6 1 sp|Q3AGT7|MURG_SYNSC UDP-N-acetylglucosamine--N-acetylmuram
+ 5.2e-22 83.0 0.0 1e-21 82.1 0.0 1.5 1 sp|Q5B4C9|ATG26_EMENI Sterol 3-beta-glucosyltransferase OS=E
+ 7.1e-22 82.6 0.0 1.4e-21 81.7 0.0 1.5 1 sp|A5GW69|MURG_SYNR3 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.4e-22 82.6 0.8 7.4e-22 82.6 0.6 2.0 1 sp|A4YZK3|MURG_BRASO UDP-N-acetylglucosamine--N-acetylmuram
+ 7.6e-22 82.5 1.9 7.6e-22 82.5 1.3 2.6 1 sp|Q2RVU4|MURG_RHORT UDP-N-acetylglucosamine--N-acetylmuram
+ 7.8e-22 82.5 0.1 1.8e-21 81.3 0.1 1.6 1 sp|Q2JW21|MURG_SYNJA UDP-N-acetylglucosamine--N-acetylmuram
+ 8e-22 82.4 0.8 8e-22 82.4 0.6 2.0 1 sp|A5EPK4|MURG_BRASB UDP-N-acetylglucosamine--N-acetylmuram
+ 9.4e-22 82.2 0.0 1.8e-21 81.3 0.0 1.5 1 sp|A7KAN4|ATG26_PENCW Sterol 3-beta-glucosyltransferase OS=P
+ 1.1e-21 82.0 0.2 2.7e-21 80.8 0.1 1.7 1 sp|Q2JJR4|MURG_SYNJB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-21 81.9 0.0 2.2e-21 81.0 0.0 1.5 1 sp|A2QNQ5|ATG26_ASPNC Sterol 3-beta-glucosyltransferase OS=A
+ 1.3e-21 81.8 2.4 2.6e-21 80.8 1.6 1.5 1 sp|Q0AMW7|MURG_MARMM UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-21 81.5 0.0 5.2e-21 79.8 0.0 1.8 1 sp|Q812Y1|MURG3_BACCR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-21 81.3 2.2 4e-21 80.2 1.5 1.6 1 sp|B4SH49|MURG_PELPB UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-21 81.2 1.0 4.3e-21 80.1 0.4 1.8 1 sp|B4S6Q9|MURG_PROA2 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.5e-21 80.8 0.0 4.4e-21 80.0 0.0 1.4 1 sp|A8G2K3|MURG_PROM2 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.7e-21 80.8 0.3 5.9e-21 79.6 0.2 1.6 1 sp|Q89FU7|MURG_BRAJA UDP-N-acetylglucosamine--N-acetylmuram
+ 3.5e-21 80.4 0.0 8.3e-21 79.2 0.0 1.6 1 sp|A0RHC3|MURG1_BACAH UDP-N-acetylglucosamine--N-acetylmuram
+ 3.7e-21 80.3 0.0 8.3e-21 79.2 0.0 1.6 1 sp|Q6MBS7|MURG_PARUW UDP-N-acetylglucosamine--N-acetylmuram
+ 3.9e-21 80.2 0.7 9.7e-21 78.9 0.5 1.7 1 sp|Q0BXU2|MURG_HYPNA UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-21 80.1 0.5 7.5e-21 79.3 0.3 1.4 1 sp|Q8KGD4|MURG_CHLTE UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-21 80.1 0.2 7.7e-21 79.3 0.1 1.5 1 sp|B3QLW4|MURG_CHLP8 UDP-N-acetylglucosamine--N-acetylmuram
+ 5.4e-21 79.8 0.2 1.1e-20 78.7 0.1 1.5 1 sp|A6T2F8|MURG_JANMA UDP-N-acetylglucosamine--N-acetylmuram
+ 7.8e-21 79.2 0.0 1.4e-20 78.5 0.0 1.4 1 sp|A5CEL6|MURG_ORITB UDP-N-acetylglucosamine--N-acetylmuram
+ 7.9e-21 79.2 0.0 1.2e-20 78.6 0.0 1.3 1 sp|Q8D2Z6|MURG_WIGBR UDP-N-acetylglucosamine--N-acetylmuram
+ 9.1e-21 79.0 1.4 2.4e-20 77.7 1.0 1.8 1 sp|B0UFC7|MURG_METS4 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-20 78.6 0.7 2.2e-20 77.8 0.5 1.5 1 sp|Q163J0|MURG_ROSDO UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-20 78.6 0.2 3.9e-20 77.0 0.1 1.9 1 sp|A4G8T8|MURG_HERAR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-20 78.6 1.6 2.5e-20 77.6 1.1 1.5 1 sp|Q28NN5|MURG_JANSC UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-20 78.6 0.0 2.4e-20 77.6 0.0 1.5 1 sp|Q31CY4|MURG_PROM9 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-20 78.5 2.0 3.2e-20 77.3 1.4 1.7 1 sp|B1ZGP4|MURG_METPB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-20 78.3 0.8 1.5e-20 78.3 0.6 1.8 1 sp|Q5LU63|MURG_SILPO UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-20 78.3 0.0 2.7e-20 77.5 0.0 1.4 1 sp|B3CRE9|MURG_ORITI UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-20 78.1 2.2 2.4e-20 77.7 0.6 1.9 1 sp|Q1GIV1|MURG_SILST UDP-N-acetylglucosamine--N-acetylmuram
+ 2.1e-20 77.8 0.5 5.1e-20 76.6 0.3 1.7 1 sp|Q1GZ01|MURG_METFK UDP-N-acetylglucosamine--N-acetylmuram
+ 2.3e-20 77.7 0.1 7.8e-20 76.0 0.0 1.9 1 sp|B3ET95|MURG_AMOA5 UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-20 77.7 0.2 1.2e-19 75.4 0.0 2.0 1 sp|Q8A258|MURG_BACTN UDP-N-acetylglucosamine--N-acetylmuram
+ 2.6e-20 77.5 0.5 5.5e-20 76.5 0.3 1.6 1 sp|Q211T8|MURG_RHOPB UDP-N-acetylglucosamine--N-acetylmuram
+ 2.9e-20 77.4 1.3 5.5e-20 76.5 0.5 1.8 1 sp|Q2IYK8|MURG_RHOP2 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.9e-20 77.0 4.1 4.1e-20 76.9 0.9 2.2 1 sp|B1LXZ4|MURG_METRJ UDP-N-acetylglucosamine--N-acetylmuram
+ 4.4e-20 76.8 0.0 7.8e-20 76.0 0.0 1.4 1 sp|A2BNZ2|MURG_PROMS UDP-N-acetylglucosamine--N-acetylmuram
+ 5.1e-20 76.6 0.0 9.9e-20 75.7 0.0 1.5 1 sp|C0R2W7|MURG_WOLWR UDP-N-acetylglucosamine--N-acetylmuram
+ 5.1e-20 76.6 0.0 9.9e-20 75.7 0.0 1.5 1 sp|Q73I55|MURG_WOLPM UDP-N-acetylglucosamine--N-acetylmuram
+ 5.9e-20 76.4 1.8 1.4e-19 75.2 1.3 1.7 1 sp|A9VWV3|MURG_METEP UDP-N-acetylglucosamine--N-acetylmuram
+ 6.1e-20 76.3 1.8 1.4e-19 75.2 1.3 1.7 1 sp|B7KSC1|MURG_METC4 UDP-N-acetylglucosamine--N-acetylmuram
+ 6.5e-20 76.3 0.0 9.5e-20 75.7 0.0 1.3 1 sp|A2C027|MURG_PROM1 UDP-N-acetylglucosamine--N-acetylmuram
+ 6.7e-20 76.2 2.3 3.6e-19 73.9 0.7 2.4 1 sp|A3PHS8|MURG_RHOS1 UDP-N-acetylglucosamine--N-acetylmuram
+ 7.9e-20 76.0 1.3 2.8e-19 74.2 1.2 1.7 1 sp|A4SH02|MURG_PROVI UDP-N-acetylglucosamine--N-acetylmuram
+ 7.9e-20 76.0 2.2 3.6e-19 73.9 0.7 2.3 1 sp|Q3J4M2|MURG_RHOS4 UDP-N-acetylglucosamine--N-acetylmuram
+ 9.5e-20 75.7 0.0 1.7e-19 74.9 0.0 1.4 1 sp|Q7V388|MURG_PROMP UDP-N-acetylglucosamine--N-acetylmuram
+ 9.9e-20 75.7 0.0 1.7e-19 74.9 0.0 1.4 1 sp|A3PAR5|MURG_PROM0 UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-19 75.6 0.8 1e-19 75.6 0.6 1.9 1 sp|Q07PT3|MURG_RHOP5 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.1e-19 75.5 0.8 3e-19 74.1 0.6 1.8 1 sp|Q133X1|MURG_RHOPS UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-19 75.4 0.1 2.5e-19 74.4 0.1 1.6 1 sp|Q5LIJ7|MURG_BACFN UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-19 75.4 0.1 2.5e-19 74.4 0.1 1.6 1 sp|Q64ZM1|MURG_BACFR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-19 75.3 0.0 2.5e-19 74.4 0.0 1.5 1 sp|A6LLF1|MURG_THEM4 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-19 75.0 0.0 2.4e-19 74.4 0.0 1.3 1 sp|Q46HH6|MURG_PROMT UDP-N-acetylglucosamine--N-acetylmuram
+ 2.4e-19 74.4 2.8 7.8e-19 72.8 1.1 2.2 1 sp|A4WQD5|MURG_RHOS5 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.2e-19 74.0 0.0 6e-19 73.1 0.0 1.5 1 sp|A2BUH4|MURG_PROM5 UDP-N-acetylglucosamine--N-acetylmuram
+ 6.6e-19 73.0 0.0 1.5e-18 71.8 0.0 1.6 1 sp|Q5GS79|MURG_WOLTR UDP-N-acetylglucosamine--N-acetylmuram
+ 1e-18 72.4 0.2 2.5e-18 71.1 0.1 1.6 1 sp|Q7NPZ9|MURG_CHRVO UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-18 72.2 3.1 2.1e-17 68.1 0.0 2.8 2 sp|Q1AVX3|MURG_RUBXD UDP-N-acetylglucosamine--N-acetylmuram
+ 1.3e-18 72.1 0.1 2.4e-18 71.2 0.1 1.4 1 sp|Q7MBC4|MURG_GLOVI UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-18 71.8 0.0 2.8e-18 70.9 0.0 1.4 1 sp|Q7U322|MURG_HELHP UDP-N-acetylglucosamine--N-acetylmuram
+ 2e-18 71.4 0.6 2e-18 71.4 0.5 1.5 1 sp|Q3B129|MURG_PELLD UDP-N-acetylglucosamine--N-acetylmuram
+ 4.3e-18 70.4 0.1 6.9e-17 66.5 0.0 2.1 1 sp|Q30PK0|MURG_SULDN UDP-N-acetylglucosamine--N-acetylmuram
+ 7.3e-18 69.6 0.3 1.4e-17 68.7 0.2 1.5 1 sp|A2SCY5|MURG_METPP UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-17 68.9 0.0 3e-16 64.4 0.0 2.1 2 sp|A0RP87|MURG_CAMFF UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-17 68.5 0.0 6.2e-17 66.6 0.0 2.0 1 sp|B3CM87|MURG_WOLPP UDP-N-acetylglucosamine--N-acetylmuram
+ 3.5e-17 67.4 3.3 8.1e-17 66.2 2.3 1.7 1 sp|A5FUL0|MURG_ACICJ UDP-N-acetylglucosamine--N-acetylmuram
+ 5.3e-17 66.8 0.0 1.1e-16 65.8 0.0 1.5 1 sp|Q7MAD4|MURG_WOLSU UDP-N-acetylglucosamine--N-acetylmuram
+ 8.9e-17 66.1 0.0 2.8e-16 64.5 0.0 1.8 1 sp|B2KE54|MURG_ELUMP UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-16 65.6 0.4 2.2e-16 64.8 0.3 1.5 1 sp|B3EIK8|MURG_CHLL2 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.4e-16 65.4 3.3 1.4e-16 65.4 2.3 2.7 1 sp|A5UZT7|MURG_ROSS1 UDP-N-acetylglucosamine--N-acetylmuram
+ 3.1e-16 64.4 0.8 7.2e-16 63.1 0.5 1.7 1 sp|Q5FUJ5|MURG_GLUOX UDP-N-acetylglucosamine--N-acetylmuram
+ 6.5e-16 63.3 0.1 4.4e-15 60.6 0.0 2.2 1 sp|A6Q722|MURG_SULNB UDP-N-acetylglucosamine--N-acetylmuram
+ 1.6e-15 62.0 0.0 3.1e-15 61.1 0.0 1.5 1 sp|B8E325|MURG_DICTD UDP-N-acetylglucosamine--N-acetylmuram
+ 2.2e-15 61.6 0.0 5.6e-15 60.3 0.0 1.7 1 sp|A6Q579|MURG_NITSB UDP-N-acetylglucosamine--N-acetylmuram
+ 3.4e-15 61.0 0.8 1.1e-14 59.3 0.5 1.9 1 sp|Q0BV25|MURG_GRABC UDP-N-acetylglucosamine--N-acetylmuram
+ 4e-15 60.8 0.0 1.3e-14 59.0 0.0 1.9 1 sp|Q5PB22|MURG_ANAMM UDP-N-acetylglucosamine--N-acetylmuram
+ 4.1e-15 60.7 0.0 1.9e-14 58.5 0.0 1.9 1 sp|A7I265|MURG_CAMHC UDP-N-acetylglucosamine--N-acetylmuram
+ 6.3e-15 60.1 1.1 6.3e-15 60.1 0.8 2.2 1 sp|A9FI55|MURG_SORC5 UDP-N-acetylglucosamine--N-acetylmuram
+ 8.2e-15 59.7 0.0 1.7e-14 58.7 0.0 1.6 1 sp|B5YEL3|MURG_DICT6 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.2e-13 56.0 0.0 2.1e-13 55.1 0.0 1.5 1 sp|A8FM88|MURG_CAMJ8 UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-13 55.6 0.0 2.8e-13 54.8 0.0 1.5 1 sp|Q5HU62|MURG_CAMJR UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-13 55.6 0.0 2.8e-13 54.8 0.0 1.5 1 sp|A1W027|MURG_CAMJJ UDP-N-acetylglucosamine--N-acetylmuram
+ 1.5e-13 55.6 0.0 2.8e-13 54.8 0.0 1.5 1 sp|Q9PNQ2|MURG_CAMJE UDP-N-acetylglucosamine--N-acetylmuram
+ 3.5e-13 54.5 0.0 6.4e-13 53.6 0.0 1.5 1 sp|A7H2Z9|MURG_CAMJD UDP-N-acetylglucosamine--N-acetylmuram
+ 7.2e-13 53.4 0.0 1.8e-12 52.2 0.0 1.7 1 sp|A8F4X1|MURG_THELT UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-10 45.7 0.3 3.9e-09 41.3 0.2 2.3 1 sp|Q72R84|MURG_LEPIC UDP-N-acetylglucosamine--N-acetylmuram
+ 1.8e-10 45.7 0.3 3.9e-09 41.3 0.2 2.3 1 sp|Q8F4J1|MURG_LEPIN UDP-N-acetylglucosamine--N-acetylmuram
+ 4.2e-09 41.3 0.0 7.1e-09 40.5 0.0 1.4 1 sp|Q4FPK5|MURG_PELUB UDP-N-acetylglucosamine--N-acetylmuram
+ 7.7e-09 40.4 0.3 1.5e-07 36.2 0.2 2.3 1 sp|Q04V94|MURG_LEPBJ UDP-N-acetylglucosamine--N-acetylmuram
+ 7.7e-09 40.4 0.3 1.5e-07 36.2 0.2 2.3 1 sp|Q04Y82|MURG_LEPBL UDP-N-acetylglucosamine--N-acetylmuram
+ 3.4e-07 35.1 0.0 9.9e-07 33.5 0.0 1.8 1 sp|Q8TTI1|Y452_METAC Uncharacterized glycosyltransferase MA
+ 2.3e-06 32.4 0.0 3.1e-05 28.7 0.0 2.5 1 sp|Q8TTI0|Y453_METAC Uncharacterized glycosyltransferase MA
+ 2.4e-06 32.3 0.0 1.2e-05 30.0 0.0 2.1 1 sp|Q8PWF3|Y1636_METMA Uncharacterized glycosyltransferase MM
+ 7.8e-06 30.6 0.0 2.7e-05 28.9 0.0 2.0 1 sp|O34539|YJIC_BACSU Uncharacterized UDP-glucosyltransferas
+ 2e-05 29.3 0.7 6.6e-05 27.6 0.1 2.2 1 sp|Q53685|OLED_STRAT Oleandomycin glycosyltransferase OS=St
+ 2e-05 29.3 0.0 4.5e-05 28.2 0.0 1.6 1 sp|Q8PZB2|Y582_METMA Uncharacterized glycosyltransferase MM
+ 7.8e-05 27.4 0.1 0.00022 25.9 0.1 1.7 1 sp|P21686|CRTX_PANAN Zeaxanthin glucosyltransferase OS=Pant
+ 0.00056 24.6 0.0 0.0013 23.5 0.0 1.6 1 sp|Q54387|MGT_STRLI Macrolide glycosyltransferase OS=Strep
+ 0.00067 24.4 0.3 0.0017 23.1 0.2 1.6 1 sp|Q01330|CRTX_ESCVU Zeaxanthin glucosyltransferase OS=Esch
+ ------ inclusion threshold ------
+ 0.012 20.4 0.0 0.36 15.5 0.0 2.4 2 sp|O31853|YOJK_BACSU Uncharacterized UDP-glucosyltransferas
+ 0.013 20.2 0.0 0.049 18.4 0.0 1.9 1 sp|B1YIY4|MTNA_EXIS2 Methylthioribose-1-phosphate isomerase
+ 0.016 19.9 0.0 0.039 18.6 0.0 1.7 1 sp|Q0WW21|UGAGT_ARATH Anthocyanin 5-O-glucosyltransferase OS
+ 0.021 19.6 0.4 0.064 18.0 0.0 2.0 1 sp|Q9Z565|ILVC1_STRCO Ketol-acid reductoisomerase 1 OS=Strep
+ 0.022 19.5 0.0 0.051 18.3 0.0 1.7 1 sp|O05496|YDHE_BACSU Uncharacterized UDP-glucosyltransferas
+ 0.022 19.4 0.3 0.064 18.0 0.0 1.9 1 sp|Q9FBT8|ILVC2_STRCO Ketol-acid reductoisomerase 2 OS=Strep
+ 0.023 19.4 0.4 0.044 18.5 0.1 1.7 1 sp|Q9SBL1|HMNGT_SORBI Cyanohydrin beta-glucosyltransferase O
+ 0.067 17.9 0.2 0.19 16.4 0.1 1.9 1 sp|B1I2P1|MTNA_DESAP Methylthioribose-1-phosphate isomerase
+ 0.08 17.6 0.0 8.6 11.1 0.0 3.1 2 sp|A8AZU1|MUTL_STRGC DNA mismatch repair protein mutL OS=St
+ 0.085 17.6 0.0 0.19 16.4 0.0 1.6 1 sp|Q01198|LIGD_PSEPA C alpha-dehydrogenase OS=Pseudomonas p
+ 0.087 17.5 0.1 1.2 13.8 0.0 2.2 1 sp|Q83RR8|NPD_SHIFL NAD-dependent deacetylase OS=Shigella
+ 0.089 17.5 0.0 0.24 16.1 0.0 1.7 1 sp|C5D7U5|MTNA_GEOSW Methylthioribose-1-phosphate isomerase
+ 0.11 17.2 0.0 9.4 10.9 0.0 3.1 2 sp|A3CR14|MUTL_STRSV DNA mismatch repair protein mutL OS=St
+ 0.12 17.1 0.0 0.37 15.5 0.0 1.8 1 sp|Q88M09|MTNA_PSEPK Methylthioribose-1-phosphate isomerase
+ 0.13 17.0 0.0 0.45 15.2 0.0 1.9 1 sp|Q5L1E6|MTNA_GEOKA Methylthioribose-1-phosphate isomerase
+ 0.14 16.9 0.1 1.9 13.2 0.0 2.2 1 sp|Q8X8E0|NPD_ECO57 NAD-dependent deacetylase OS=Escherich
+ 0.14 16.9 0.1 1.8 13.3 0.0 2.2 1 sp|P75960|NPD_ECOLI NAD-dependent deacetylase OS=Escherich
+ 0.14 16.9 0.8 0.21 16.3 0.5 1.5 1 sp|Q5V467|MAMA1_HALMA Methylaspartate mutase S chain 1 OS=Ha
+ 0.14 16.9 0.0 0.65 14.7 0.0 2.1 1 sp|C0MAS4|MUTL_STRE4 DNA mismatch repair protein mutL OS=St
+ 0.14 16.8 0.1 1.4 13.6 0.0 2.1 1 sp|P0A2F2|NPD_SALTY NAD-dependent deacetylase OS=Salmonell
+ 0.14 16.8 0.1 1.4 13.6 0.0 2.1 1 sp|P0A2F3|NPD_SALTI NAD-dependent deacetylase OS=Salmonell
+ 0.15 16.8 0.0 0.77 14.5 0.0 2.1 1 sp|C0MGC4|MUTL_STRS7 DNA mismatch repair protein mutL OS=St
+ 0.15 16.8 0.0 0.48 15.1 0.0 1.8 1 sp|Q65KK2|MTNA_BACLD Methylthioribose-1-phosphate isomerase
+ 0.15 16.7 0.0 0.5 15.1 0.0 1.9 1 sp|B0KTX5|MTNA_PSEPG Methylthioribose-1-phosphate isomerase
+ 0.16 16.7 0.0 0.41 15.4 0.0 1.7 1 sp|B1J5G5|MTNA_PSEPW Methylthioribose-1-phosphate isomerase
+ 0.16 16.7 0.0 0.51 15.1 0.0 1.9 1 sp|A5W7G2|MTNA_PSEP1 Methylthioribose-1-phosphate isomerase
+ 0.17 16.6 0.1 0.86 14.3 0.0 2.1 1 sp|A4ILL1|MTNA_GEOTN Methylthioribose-1-phosphate isomerase
+ 0.18 16.5 0.0 0.77 14.5 0.0 2.0 1 sp|B4U0J7|MUTL_STREM DNA mismatch repair protein mutL OS=St
+ 0.2 16.4 0.1 1.9 13.2 0.0 2.2 1 sp|Q8FIM4|NPD_ECOL6 NAD-dependent deacetylase OS=Escherich
+ 0.21 16.3 0.2 0.72 14.6 0.0 2.0 1 sp|B2GFJ7|ILVC_KOCRD Ketol-acid reductoisomerase OS=Kocuria
+ 0.21 16.3 0.3 0.67 14.7 0.0 2.0 1 sp|B1VZ72|ILVC_STRGG Ketol-acid reductoisomerase OS=Strepto
+ 0.22 16.2 0.2 0.73 14.5 0.0 2.0 1 sp|Q59818|ILVC_STRAW Ketol-acid reductoisomerase OS=Strepto
+ 0.26 16.0 0.0 2.9 12.6 0.0 2.4 1 sp|Q731R7|MTNA_BACC1 Methylthioribose-1-phosphate isomerase
+ 0.29 15.8 0.0 0.6 14.8 0.0 1.5 1 sp|B1GZW3|TPIS_UNCTG Triosephosphate isomerase OS=Unculture
+ 0.33 15.7 0.1 6.3 11.5 0.0 2.4 1 sp|Q2IWS4|GLYA_RHOP2 Serine hydroxymethyltransferase OS=Rho
+ 0.36 15.5 0.0 1.4 13.6 0.0 2.0 1 sp|A7GS56|MTNA_BACCN Methylthioribose-1-phosphate isomerase
+ 0.37 15.5 0.0 0.85 14.3 0.0 1.6 1 sp|B7KF23|ILVC_CYAP7 Ketol-acid reductoisomerase OS=Cyanoth
+ 0.39 15.4 0.0 1 14.1 0.0 1.6 1 sp|A5W1E8|RNZ_PSEP1 Ribonuclease Z OS=Pseudomonas putida (
+ 0.45 15.2 0.0 1.6 13.5 0.0 1.9 1 sp|B3QSP0|ILVC_CHLT3 Ketol-acid reductoisomerase OS=Chloroh
+ 0.46 15.2 0.0 4.5 12.0 0.0 2.3 1 sp|O31662|MTNA_BACSU Methylthioribose-1-phosphate isomerase
+ 0.51 15.0 0.2 2.2 13.0 0.1 2.1 1 sp|C1F6Z5|ILVC_ACIC5 Ketol-acid reductoisomerase OS=Acidoba
+ 0.55 14.9 0.1 50 8.6 0.0 2.3 2 sp|Q2G3S7|PYRB_NOVAD Aspartate carbamoyltransferase OS=Novo
+ 0.57 14.9 1.6 25 9.6 0.0 3.0 2 sp|Q96LB3|IFT74_HUMAN Intraflagellar transport protein 74 ho
+ 0.58 14.9 0.2 1.6 13.5 0.1 1.8 1 sp|A9AZM5|ILVC_HERA2 Ketol-acid reductoisomerase OS=Herpeto
+ 0.64 14.7 0.0 3.9 12.2 0.0 2.0 1 sp|B8HSQ9|SURE_CYAP4 5'-nucleotidase surE OS=Cyanothece sp.
+ 0.68 14.6 0.0 2.4 12.9 0.0 1.9 1 sp|Q3SPL2|UVRC_NITWN UvrABC system protein C OS=Nitrobacter
+ 0.68 14.6 0.0 2.8 12.6 0.0 1.8 1 sp|A7Z3X0|MTNA_BACA2 Methylthioribose-1-phosphate isomerase
+ 0.69 14.6 0.4 44 8.8 0.1 2.2 2 sp|Q38W65|EFTS_LACSS Elongation factor Ts OS=Lactobacillus
+ 0.69 14.6 0.0 1.9 13.2 0.0 1.7 1 sp|C3JYK1|TIG_PSEFS Trigger factor OS=Pseudomonas fluoresc
+ 0.71 14.6 0.0 1.7 13.4 0.0 1.7 1 sp|Q1GZA6|BIOB_METFK Biotin synthase OS=Methylobacillus fla
+ 0.71 14.6 0.0 2.5 12.8 0.0 2.0 1 sp|Q635P7|MTNA2_BACCZ Methylthioribose-1-phosphate isomerase
+ 0.71 14.6 0.0 1.8 13.3 0.0 1.7 1 sp|O48676|HTGT_ARATH N-hydroxythioamide S-beta-glucosyltran
+ 0.72 14.6 0.1 1.4e+02 7.1 0.0 2.9 2 sp|Q8YRC9|THIOG_ANASP Bifunctional protein thiO/thiG OS=Anab
+ 0.73 14.5 0.0 11 10.8 0.0 2.4 1 sp|Q8DW43|ILVC_STRMU Ketol-acid reductoisomerase OS=Strepto
+ 0.73 14.5 0.0 2.3 12.9 0.0 1.9 1 sp|Q81MJ6|MTNA2_BACAN Methylthioribose-1-phosphate isomerase
+ 0.74 14.5 0.0 7.7 11.2 0.0 2.4 1 sp|Q6N693|GLYA1_RHOPA Serine hydroxymethyltransferase 1 OS=R
+ 0.75 14.5 0.0 2 13.1 0.0 1.7 1 sp|B0C915|MURD_ACAM1 UDP-N-acetylmuramoylalanine--D-glutama
+ 0.76 14.5 0.0 3.5 12.4 0.0 2.0 1 sp|Q2KA25|GLYA_RHIEC Serine hydroxymethyltransferase OS=Rhi
+ 0.77 14.5 0.0 6.5 11.5 0.0 2.3 1 sp|Q214H7|GLYA_RHOPB Serine hydroxymethyltransferase OS=Rho
+ 0.79 14.4 0.0 3.8 12.2 0.0 2.2 1 sp|B9DW70|MUTL_STRU0 DNA mismatch repair protein mutL OS=St
+ 0.8 14.4 0.0 2.6 12.8 0.0 1.9 1 sp|A0RI38|MTNA2_BACAH Methylthioribose-1-phosphate isomerase
+ 0.81 14.4 0.0 2.6 12.8 0.0 1.9 1 sp|Q6HED3|MTNA2_BACHK Methylthioribose-1-phosphate isomerase
+ 0.83 14.4 0.0 2.4 12.9 0.0 1.8 1 sp|Q1QIR5|UVRC_NITHX UvrABC system protein C OS=Nitrobacter
+ 0.84 14.3 0.0 4.8 11.9 0.0 2.3 1 sp|A8AVN4|ILVC_STRGC Ketol-acid reductoisomerase OS=Strepto
+ 0.86 14.3 0.3 13 10.4 0.0 2.8 1 sp|Q7V5V5|MURD_PROMM UDP-N-acetylmuramoylalanine--D-glutama
+ 0.9 14.2 0.1 2.4 12.9 0.1 1.8 1 sp|Q47SB6|ILVC_THEFY Ketol-acid reductoisomerase OS=Thermob
+ 0.9 14.2 0.1 1.8 13.3 0.0 1.5 1 sp|A4FMQ5|ILVC_SACEN Ketol-acid reductoisomerase OS=Sacchar
+ 0.91 14.2 0.1 1.3 13.8 0.0 1.3 1 sp|Q5V3R4|TRM56_HALMA tRNA ribose 2'-O-methyltransferase aTr
+ 0.91 14.2 0.0 37 9.0 0.0 2.3 2 sp|B8GW68|ENO_CAUCN Enolase OS=Caulobacter crescentus (str
+ 0.91 14.2 0.0 37 9.0 0.0 2.3 2 sp|Q9A7J9|ENO_CAUCR Enolase OS=Caulobacter crescentus GN=e
+ 0.92 14.2 0.2 2.8 12.7 0.1 1.8 1 sp|Q5V3F0|MAMA2_HALMA Methylaspartate mutase S chain 2 OS=Ha
+ 0.96 14.2 0.0 4.9 11.9 0.0 2.2 1 sp|B1LZ88|GLYA_METRJ Serine hydroxymethyltransferase OS=Met
+ 0.98 14.1 0.0 2.1 13.0 0.0 1.5 1 sp|P94966|BIOB_METSK Biotin synthase OS=Methylobacillus sp.
+ 1 14.1 0.1 2.4 12.9 0.1 1.7 1 sp|Q3SHE4|ILVC_THIDA Ketol-acid reductoisomerase OS=Thiobac
+ 1.1 14.0 0.0 8.5 11.1 0.0 2.3 1 sp|Q07MT9|GLYA_RHOP5 Serine hydroxymethyltransferase OS=Rho
+ 1.1 14.0 0.0 2.6 12.7 0.0 1.8 1 sp|A9VRK3|MTNA1_BACWK Methylthioribose-1-phosphate isomerase
+ 1.1 13.9 0.3 5.6 11.7 0.1 2.2 1 sp|A9GW78|ILVC_SORC5 Ketol-acid reductoisomerase OS=Sorangi
+ 1.1 13.9 0.0 4.5 12.0 0.0 2.0 1 sp|Q5YRW2|ILVC_NOCFA Ketol-acid reductoisomerase OS=Nocardi
+ 1.2 13.9 0.0 5.6 11.7 0.0 2.2 1 sp|A3CQ86|ILVC_STRSV Ketol-acid reductoisomerase OS=Strepto
+ 1.2 13.8 0.0 7.6 11.2 0.0 2.2 1 sp|Q21AW5|UVRC_RHOPB UvrABC system protein C OS=Rhodopseudo
+ 1.3 13.7 0.0 3.5 12.4 0.0 1.8 1 sp|Q81IK7|MTNA1_BACCR Methylthioribose-1-phosphate isomerase
+ 1.3 13.7 0.1 1.9e+02 6.7 0.0 3.2 2 sp|Q5FNN2|PYRG_GLUOX CTP synthase OS=Gluconobacter oxydans
+ 1.3 13.7 0.1 4.3 12.0 0.1 2.0 1 sp|Q2S9V9|ILVC_HAHCH Ketol-acid reductoisomerase OS=Hahella
+ 1.4 13.6 0.0 2.4 12.9 0.0 1.5 1 sp|Q17QH8|D39U1_BOVIN Epimerase family protein SDR39U1 OS=Bo
+ 1.4 13.6 0.1 3.2 12.5 0.1 1.7 1 sp|Q2J6V2|ILVC_FRASC Ketol-acid reductoisomerase OS=Frankia
+ 1.4 13.6 0.2 22 9.8 0.0 2.4 1 sp|A1WUW3|ILVC_HALHL Ketol-acid reductoisomerase OS=Halorho
+ 1.4 13.6 0.1 5.3 11.8 0.1 2.0 1 sp|A8LMD0|PUR9_DINSH Bifunctional purine biosynthesis prote
+ 1.4 13.6 0.2 5.1 11.8 0.1 2.0 1 sp|C5BAT0|GCSP_EDWI9 Glycine dehydrogenase [decarboxylating
+ 1.4 13.6 0.0 6.3 11.5 0.0 2.0 1 sp|C1B2M1|ILVC_RHOOB Ketol-acid reductoisomerase OS=Rhodoco
+ 1.4 13.6 0.0 6.3 11.5 0.0 2.0 1 sp|Q0S2H3|ILVC_RHOSR Ketol-acid reductoisomerase OS=Rhodoco
+ 1.4 13.6 0.0 3.5 12.3 0.0 1.7 1 sp|A0R946|MTNA1_BACAH Methylthioribose-1-phosphate isomerase
+ 1.4 13.6 0.0 3.5 12.3 0.0 1.7 1 sp|Q81ZC2|MTNA1_BACAN Methylthioribose-1-phosphate isomerase
+ 1.5 13.6 0.0 3.5 12.3 0.0 1.7 1 sp|Q6HP54|MTNA1_BACHK Methylthioribose-1-phosphate isomerase
+ 1.5 13.5 0.0 6 11.6 0.0 1.9 1 sp|Q1MIU5|GLYA_RHIL3 Serine hydroxymethyltransferase OS=Rhi
+ 1.5 13.5 0.0 4.4 12.0 0.0 1.8 1 sp|A8FCG5|MTNA_BACP2 Methylthioribose-1-phosphate isomerase
+ 1.6 13.5 0.7 7.3 11.3 0.1 2.2 1 sp|Q63CV4|ILVC2_BACCZ Ketol-acid reductoisomerase 2 OS=Bacil
+ 1.6 13.4 0.0 4.7 11.9 0.0 1.8 1 sp|A4J179|ILVC_DESRM Ketol-acid reductoisomerase OS=Desulfo
+ 1.6 13.4 0.0 2.2 13.0 0.0 1.3 1 sp|Q9V030|PAAD_PYRAB Probable aromatic acid decarboxylase O
+ 1.7 13.4 0.7 7.7 11.2 0.1 2.2 1 sp|Q81F27|ILVC2_BACCR Ketol-acid reductoisomerase 2 OS=Bacil
+ 1.7 13.4 0.0 28 9.4 0.0 2.6 1 sp|Q03IJ9|ILVC_STRTD Ketol-acid reductoisomerase OS=Strepto
+ 1.7 13.4 0.0 28 9.4 0.0 2.6 1 sp|Q9F0I7|ILVC_STRTR Ketol-acid reductoisomerase OS=Strepto
+ 1.7 13.4 0.1 4.6 11.9 0.0 1.7 1 sp|P26166|YBCC_RHOCA Uncharacterized 20.5 kDa protein in bc
+ 1.7 13.4 0.2 3.8 12.2 0.1 2.1 1 sp|B8I1T8|ILVC_CLOCE Ketol-acid reductoisomerase OS=Clostri
+ 1.7 13.3 0.1 37 9.0 0.0 2.7 1 sp|A4VXL3|ILVC_STRSY Ketol-acid reductoisomerase OS=Strepto
+ 1.7 13.3 0.1 37 9.0 0.0 2.7 1 sp|A4W3V8|ILVC_STRS2 Ketol-acid reductoisomerase OS=Strepto
+ 1.8 13.3 0.0 4.4 12.0 0.0 1.7 1 sp|Q3B594|ILVC_PELLD Ketol-acid reductoisomerase OS=Pelodic
+ 1.8 13.3 0.0 15 10.3 0.0 2.5 1 sp|B1I8F2|MUTL_STRPI DNA mismatch repair protein mutL OS=St
+ 1.8 13.3 0.0 15 10.3 0.0 2.5 1 sp|B2IS10|MUTL_STRPS DNA mismatch repair protein mutL OS=St
+ 1.8 13.3 0.0 15 10.3 0.0 2.5 1 sp|B8ZKC9|MUTL_STRPJ DNA mismatch repair protein mutL OS=St
+ 1.8 13.3 0.0 15 10.3 0.0 2.5 1 sp|P0A3R1|HEXB_STRPN DNA mismatch repair protein hexB OS=St
+ 1.8 13.3 0.0 15 10.3 0.0 2.5 1 sp|P0A3R2|HEXB_STRR6 DNA mismatch repair protein hexB OS=St
+ 1.8 13.3 0.0 15 10.3 0.0 2.5 1 sp|Q04MR4|MUTL_STRP2 DNA mismatch repair protein mutL OS=St
+ 1.8 13.3 0.0 15 10.3 0.0 2.5 1 sp|C1CI68|MUTL_STRZP DNA mismatch repair protein mutL OS=St
+ 1.8 13.3 0.0 15 10.3 0.0 2.5 1 sp|C1CP43|MUTL_STRZT DNA mismatch repair protein mutL OS=St
+ 1.8 13.3 1.2 8.8 11.0 0.2 2.7 1 sp|Q8ZQE4|MACB_SALTY Macrolide export ATP-binding/permease
+ 1.8 13.3 1.2 8.8 11.0 0.2 2.7 1 sp|Q57R58|MACB_SALCH Macrolide export ATP-binding/permease
+ 1.8 13.2 0.0 3.6 12.3 0.0 1.5 1 sp|Q64550|UD11_RAT UDP-glucuronosyltransferase 1-1 OS=Rat
+ 1.8 13.2 0.0 6 11.6 0.0 1.8 1 sp|B9JCX4|GLYA_AGRRK Serine hydroxymethyltransferase OS=Agr
+ 1.9 13.2 1.2 8.8 11.0 0.2 2.6 1 sp|Q8Z824|MACB_SALTI Macrolide export ATP-binding/permease
+ 1.9 13.2 0.0 2.7 12.7 0.0 1.2 1 sp|O94475|YC67_SCHPO Uncharacterized protein C1919.07 OS=Sc
+ 1.9 13.2 0.0 2.2e+02 6.5 0.0 2.2 2 sp|P59837|RDH12_BOVIN Retinol dehydrogenase 12 OS=Bos taurus
+ 1.9 13.2 0.8 8.8 11.0 0.2 2.4 1 sp|Q5PGK9|MACB_SALPA Macrolide export ATP-binding/permease
+ 2 13.1 0.8 18 10.0 0.1 2.6 1 sp|Q02CM4|ILVC_SOLUE Ketol-acid reductoisomerase OS=Solibac
+ 2 13.1 0.0 11 10.8 0.0 2.0 1 sp|Q669P6|NPD_YERPS NAD-dependent deacetylase OS=Yersinia
+ 2 13.1 0.0 11 10.8 0.0 2.0 1 sp|Q8ZFR1|NPD_YERPE NAD-dependent deacetylase OS=Yersinia
+ 2 13.1 0.1 5.1 11.8 0.1 1.7 1 sp|B9KYS1|ILVC_THERP Ketol-acid reductoisomerase OS=Thermom
+ 2 13.1 0.4 13 10.5 0.1 2.3 1 sp|B4UAN4|ILVC_ANASK Ketol-acid reductoisomerase OS=Anaerom
+ 2 13.1 0.4 13 10.5 0.1 2.3 1 sp|B8J829|ILVC_ANAD2 Ketol-acid reductoisomerase OS=Anaerom
+ 2 13.1 0.4 13 10.5 0.1 2.3 1 sp|Q2IJB7|ILVC_ANADE Ketol-acid reductoisomerase OS=Anaerom
+ 2.1 13.1 0.1 5.1 11.8 0.1 1.7 1 sp|Q0RDI8|ILVC_FRAAA Ketol-acid reductoisomerase OS=Frankia
+ 2.1 13.1 1.1 7.1 11.3 0.0 2.3 1 sp|P0ABQ0|COABC_ECOLI Coenzyme A biosynthesis bifunctional p
+ 2.1 13.1 1.1 7.1 11.3 0.0 2.3 1 sp|P0ABQ1|COABC_ECOL6 Coenzyme A biosynthesis bifunctional p
+ 2.1 13.1 0.1 4.8 11.9 0.0 1.8 1 sp|B2J2U6|ILVC_NOSP7 Ketol-acid reductoisomerase OS=Nostoc
+ 2.1 13.0 0.0 6.4 11.5 0.0 1.8 1 sp|Q89DG9|UVRC_BRAJA UvrABC system protein C OS=Bradyrhizob
+ 2.1 13.0 0.1 5.1 11.8 0.1 1.6 1 sp|Q2S0M9|ILVC_SALRD Ketol-acid reductoisomerase OS=Salinib
+ 2.2 13.0 0.0 4.9 11.9 0.0 1.7 1 sp|Q7NH80|ILVC_GLOVI Ketol-acid reductoisomerase OS=Gloeoba
+ 2.2 13.0 0.1 4.5 12.0 0.1 1.6 1 sp|Q8G6V1|ILVC2_BIFLO Ketol-acid reductoisomerase 2 OS=Bifid
+ 2.2 13.0 0.0 33 9.2 0.0 2.2 1 sp|Q2W698|ENO_MAGSA Enolase OS=Magnetospirillum magneticum
+ 2.3 12.9 0.0 5.4 11.7 0.0 1.7 1 sp|Q63GN3|MTNA1_BACCZ Methylthioribose-1-phosphate isomerase
+ 2.3 12.9 0.0 5.4 11.7 0.0 1.7 1 sp|B0JRP2|ILVC_MICAN Ketol-acid reductoisomerase OS=Microcy
+ 2.3 12.9 0.0 15 10.3 0.0 2.3 1 sp|C1CBX8|MUTL_STRZJ DNA mismatch repair protein mutL OS=St
+ 2.3 12.9 0.0 5.4 11.7 0.0 1.8 1 sp|Q3SLY0|BIOB_THIDA Biotin synthase OS=Thiobacillus denitr
+ 2.4 12.9 0.0 15 10.3 0.0 2.3 1 sp|B5E6C5|MUTL_STRP4 DNA mismatch repair protein mutL OS=St
+ 2.5 12.8 0.0 6 11.6 0.0 1.7 1 sp|B2J6I3|MURD_NOSP7 UDP-N-acetylmuramoylalanine--D-glutama
+ 2.5 12.8 0.1 28 9.4 0.0 2.6 1 sp|Q5LXV0|ILVC_STRT1 Ketol-acid reductoisomerase OS=Strepto
+ 2.5 12.8 0.1 28 9.4 0.0 2.6 1 sp|Q5M2F2|ILVC_STRT2 Ketol-acid reductoisomerase OS=Strepto
+ 2.6 12.8 0.2 95 7.7 0.0 2.3 2 sp|C6A5E6|VATD_THESM V-type ATP synthase subunit D OS=Therm
+ 2.6 12.8 0.1 7.7 11.2 0.0 1.8 1 sp|Q2RIS6|ILVC_MOOTA Ketol-acid reductoisomerase OS=Moorell
+ 2.6 12.7 0.3 74 8.0 0.0 2.9 1 sp|Q3M859|THIOG_ANAVT Bifunctional protein thiO/thiG OS=Anab
+ 2.6 12.7 0.0 7.4 11.3 0.0 1.7 1 sp|Q5GS59|RLME_WOLTR Ribosomal RNA large subunit methyltran
+ 2.7 12.7 2.1 2.8 12.7 0.1 2.1 1 sp|B8G7X1|ILVC_CHLAD Ketol-acid reductoisomerase OS=Chlorof
+ 2.8 12.7 0.3 9 11.0 0.1 2.0 1 sp|C5C2I2|ILVC_BEUC1 Ketol-acid reductoisomerase OS=Beutenb
+ 2.8 12.6 0.3 13 10.5 0.1 2.1 1 sp|Q5SJ03|ILVC_THET8 Ketol-acid reductoisomerase OS=Thermus
+ 2.8 12.6 0.3 13 10.5 0.1 2.1 1 sp|Q72JC8|ILVC_THET2 Ketol-acid reductoisomerase OS=Thermus
+ 2.9 12.6 0.0 11 10.8 0.0 2.0 1 sp|Q4JUN9|ILVC_CORJK Ketol-acid reductoisomerase OS=Coryneb
+ 2.9 12.6 0.0 7.5 11.3 0.0 1.7 1 sp|Q2J0X3|UVRC_RHOP2 UvrABC system protein C OS=Rhodopseudo
+ 2.9 12.6 0.0 16 10.2 0.0 2.2 1 sp|Q02YY8|ILVC_LACLS Ketol-acid reductoisomerase OS=Lactoco
+ 2.9 12.6 0.1 8.9 11.0 0.0 1.9 1 sp|B9EBF4|ILVC_MACCJ Ketol-acid reductoisomerase OS=Macroco
+ 2.9 12.6 0.0 6 11.6 0.0 1.6 1 sp|Q43716|UFOG_PETHY Anthocyanidin 3-O-glucosyltransferase
+ 3 12.6 0.0 5.6 11.7 0.0 1.4 1 sp|A5GUT4|SURE_SYNR3 5'-nucleotidase surE OS=Synechococcus
+ 3 12.6 0.2 6.8 11.4 0.0 1.7 1 sp|Q1ARE4|ILVC_RUBXD Ketol-acid reductoisomerase OS=Rubroba
+ 3 12.5 0.4 19 10.0 0.1 2.5 1 sp|A6W7N6|ILVC_KINRD Ketol-acid reductoisomerase OS=Kineoco
+ 3 12.5 0.6 1.4e+02 7.1 0.0 3.1 1 sp|Q11039|DEAD_MYCTU Cold-shock DEAD box protein A homolog
+ 3 12.5 0.1 9.5 10.9 0.0 1.8 1 sp|Q13BM0|UVRC_RHOPS UvrABC system protein C OS=Rhodopseudo
+ 3.1 12.5 0.0 4.8 11.9 0.0 1.4 1 sp|Q8YMT3|SURE_ANASP 5'-nucleotidase surE OS=Anabaena sp. (
+ 3.1 12.5 0.0 8.6 11.1 0.0 1.7 1 sp|Q319M0|SURE_PROM9 5'-nucleotidase surE OS=Prochlorococcu
+ 3.1 12.5 0.0 9.9 10.9 0.0 1.9 1 sp|A9VFD5|MTNA2_BACWK Methylthioribose-1-phosphate isomerase
+ 3.2 12.5 0.0 2.1e+02 6.6 0.0 2.3 2 sp|A1JRP2|NADA_YERE8 Quinolinate synthase A OS=Yersinia ent
+ 3.3 12.4 0.0 18 10.0 0.0 2.2 1 sp|A2RKQ6|ILVC_LACLM Ketol-acid reductoisomerase OS=Lactoco
+ 3.5 12.3 0.5 11 10.7 0.1 2.1 1 sp|Q32DZ9|MACB_SHIDS Macrolide export ATP-binding/permease
+ 3.5 12.3 0.1 10 10.8 0.1 1.8 1 sp|A5CPY6|ILVC_CLAM3 Ketol-acid reductoisomerase OS=Claviba
+ 3.5 12.3 0.1 10 10.8 0.1 1.8 1 sp|B0RIN6|ILVC_CLAMS Ketol-acid reductoisomerase OS=Claviba
+ 3.7 12.3 0.0 14 10.4 0.0 1.9 1 sp|Q8K5J6|MUTL_STRP3 DNA mismatch repair protein mutL OS=St
+ 3.7 12.3 0.0 14 10.4 0.0 1.9 1 sp|Q99XN7|MUTL_STRP1 DNA mismatch repair protein mutL OS=St
+ 3.7 12.3 0.0 14 10.4 0.0 1.9 1 sp|B5XJ09|MUTL_STRPZ DNA mismatch repair protein mutL OS=St
+ 3.8 12.2 0.0 14 10.4 0.0 1.9 1 sp|A2RGV3|MUTL_STRPG DNA mismatch repair protein mutL OS=St
+ 3.8 12.2 0.0 14 10.4 0.0 1.9 1 sp|Q5X9H5|MUTL_STRP6 DNA mismatch repair protein mutL OS=St
+ 3.9 12.2 0.0 11 10.8 0.0 1.7 1 sp|Q3JYM6|MUTL_STRA1 DNA mismatch repair protein mutL OS=St
+ 3.9 12.2 0.0 11 10.8 0.0 1.7 1 sp|Q8E2R5|MUTL_STRA3 DNA mismatch repair protein mutL OS=St
+ 4 12.2 0.0 12 10.6 0.0 1.8 1 sp|Q9MB73|LGT_CITUN Limonoid UDP-glucosyltransferase OS=Ci
+ 4.1 12.1 0.0 11 10.7 0.0 1.8 1 sp|A8G678|SURE_PROM2 5'-nucleotidase surE OS=Prochlorococcu
+ 4.2 12.1 1.1 26 9.5 0.5 2.3 1 sp|A9WP08|ILVC_RENSM Ketol-acid reductoisomerase OS=Renibac
+ 4.8 11.9 0.1 4.8 11.9 0.1 2.1 1 sp|A9WC26|ILVC_CHLAA Ketol-acid reductoisomerase OS=Chlorof
+ 4.8 11.9 0.1 4.8 11.9 0.1 2.1 1 sp|B9LGM7|ILVC_CHLSY Ketol-acid reductoisomerase OS=Chlorof
+ 4.9 11.9 0.0 12 10.7 0.0 1.8 1 sp|A2BSJ2|SURE_PROMS 5'-nucleotidase surE OS=Prochlorococcu
+ 5 11.8 0.1 15 10.3 0.0 1.8 1 sp|Q9LR44|IABG1_ARATH Indole-3-acetate beta-glucosyltransfer
+ 5.2 11.8 0.3 38 9.0 0.1 2.2 1 sp|O57731|VATD_PYRHO V-type ATP synthase subunit D OS=Pyroc
+ 5.6 11.7 0.0 15 10.3 0.0 1.7 1 sp|A3PEA4|SURE_PROM0 5'-nucleotidase surE OS=Prochlorococcu
+ 6.8 11.4 1.8 11 10.7 0.1 2.3 1 sp|P75831|MACB_ECOLI Macrolide export ATP-binding/permease
+ 7.6 11.2 2.0 11 10.7 0.1 2.3 1 sp|Q83LR7|MACB_SHIFL Macrolide export ATP-binding/permease
+ 7.7 11.2 2.0 11 10.7 0.1 2.3 1 sp|Q3Z3Q4|MACB_SHISS Macrolide export ATP-binding/permease
+ 9.5 10.9 1.8 16 10.2 0.1 2.3 1 sp|Q8XED0|MACB_ECO57 Macrolide export ATP-binding/permease
+
+
+Domain annotation for each sequence (and alignments):
+>> sp|A7Z4E5|MURG_BACA2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 140.8 0.0 1.3e-42 7.6e-40 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 140.8 bits; conditional E-value: 1.3e-42
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+A+ +e+qrr ++V+ ++t++gle+++ e +++++++i++ ++++kl s++++k++ ++lk+++k+k lk
+ sp|A7Z4E5|MURG_BACA2 3 IAVSGGGTGGHIYPALAFIKEVQRRHPDVEflyIGTENGLEKKIvERENIPFRAIEIT-GFKRKL-SFENVKTVMRFLKGVKKSKSYLK 89
+ 6899******************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ e+kpd+v+g+ggyv +++++aa++ gip++++Eqn++pg++nk+l++++n+v+
+ sp|A7Z4E5|MURG_BACA2 90 EFKPDAVIGTGGYVCGPVVYAAAKMGIPTIIHEQNSLPGITNKFLSKYVNKVA 142
+ ***************************************************97 PP
+
+>> sp|Q65JY0|MURG_BACLD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 136.1 0.0 4e-41 2.3e-38 1 138 [. 3 142 .. 3 143 .. 0.99
+ 2 ? 3.2 0.0 4 2.2e+03 13 106 .. 203 234 .. 173 251 .. 0.60
+
+ Alignments for each domain:
+ == domain 1 score: 136.1 bits; conditional E-value: 4e-41
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT+G+++Pa+A+ +e++r +V+ ++t++gle+ + e +g+++++i++ ++++kl s++++k++ ++lk++++ ke lk
+ sp|Q65JY0|MURG_BACLD 3 IVVSGGGTGGHIYPALAFIKEVKRHHEDVEflyIGTEKGLEKNIvEREGIPFKAIEIT-GFKRKL-SFENVKTVMRFLKGVKECKEELK 89
+ 799*******************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd+v+g+ggyv +++++aa+++gip++++Eqn++pgl+nk+l++++++v+
+ sp|Q65JY0|MURG_BACLD 90 RFKPDAVIGTGGYVCGPVVYAASKLGIPTIIHEQNSLPGLTNKFLSKYVDKVA 142
+ ***************************************************97 PP
+
+ == domain 2 score: 3.2 bits; conditional E-value: 4
+ HHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EE CS
+ Glyco_transf_28 13 ePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvad 101
+ e +A+ +eL++r+++V ++ +g+ + d
+ sp|Q65JY0|MURG_BACLD 203 EAVIAMQNELKKRDYQV--------------------------------------------------------------LYVTGEVHYD 229
+ 34455555555555555..............................................................5555555555 PP
+
+ EE--H CS
+ Glyco_transf_28 102 lalia 106
+ ++ a
+ sp|Q65JY0|MURG_BACLD 230 KVTAA 234
+ 55444 PP
+
+>> sp|P37585|MURG_BACSU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 139.0 0.0 4.9e-42 2.8e-39 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 139.0 bits; conditional E-value: 4.9e-42
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+A+ +e+qrr ++V+ ++t++gle+++ e +++++++i++ ++++kl s++++k++ ++lk+++k+k l+
+ sp|P37585|MURG_BACSU 3 IAISGGGTGGHIYPALAFIKEVQRRHPNVEflyIGTENGLEKKIvERENIPFRSIEIT-GFKRKL-SFENVKTVMRFLKGVKKSKSYLA 89
+ 6899******************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ e+kpd+v+g+ggyv +++++aa++ gip++v+Eqn++pg++nk+l++++n+v+
+ sp|P37585|MURG_BACSU 90 EFKPDAVIGTGGYVCGPVVYAAAKMGIPTIVHEQNSLPGITNKFLSKYVNKVA 142
+ ***************************************************97 PP
+
+>> sp|A8FCY1|MURG_BACP2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 136.8 0.0 2.4e-41 1.4e-38 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 136.8 bits; conditional E-value: 2.4e-41
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT+G+++Pa+A+ +e++r ++V+ ++t++gle+++ e +++++++i++ ++++kl s++++k++ ++lk+++k+k lk
+ sp|A8FCY1|MURG_BACP2 3 IVISGGGTGGHIYPALAFIKEVKRLHPDVEflyIGTENGLEKKIvERENIPFKAIEIS-GFKRKL-SFDNVKTVMRFLKGVQKSKSYLK 89
+ 799*******************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ e+kpd+v+g+ggyv +++++aa++++ip++++Eqn++pg++nk+l+r++n+v+
+ sp|A8FCY1|MURG_BACP2 90 EFKPDAVIGTGGYVCGPVVYAASKLKIPTIIHEQNSLPGITNKFLARYVNKVA 142
+ ***************************************************97 PP
+
+>> sp|Q812W5|MURG1_BACCR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.9 0.0 7.9e-40 4.4e-37 1 139 [] 3 143 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 131.9 bits; conditional E-value: 7.9e-40
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ v+++ggGT+G+++Pa+Al re ++ +e r ++t++gle+++ ++ag+++++i + ++++k+ sl+++k++ ++lk+++++k+ +
+ sp|Q812W5|MURG1_BACCR 3 VLVSGGGTGGHIYPALALIREIKKLNPEARflyIGTENGLESTIvPKAGIPFQSIVIS-GFKRKI-SLDNVKTVMRFLKGVQDSKRYI 88
+ 7899******************************************************.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++++pd+v+g+ggyv +++++aa+++gip++v+Eqn++pg++nk+l+r++++v+v
+ sp|Q812W5|MURG1_BACCR 89 RRFNPDIVIGTGGYVCGPVVYAAAKLGIPTIVHEQNSVPGVTNKFLSRYVDKVAV 143
+ ****************************************************975 PP
+
+>> sp|A3MY90|MURG_ACTP2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 135.3 0.1 7e-41 4e-38 2 138 .. 6 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 135.3 bits; conditional E-value: 7e-41
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+areLq++G+e+r l+t++++e+ + +++g++++ i++ +l+ k+ + lk +++ +ka+ +a++i+k+++
+ sp|A3MY90|MURG_ACTP2 6 LVMAGGTGGHVFPAIAVARELQKQGWEIRwLGTKDRMEADLvPKHGIPIEFIQIS-GLKGKG-IGALLKAPFAIFKAVMQARKIIKNYQ 92
+ 789*************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+l+g+p++++Eqn+++gl+n +l++ a +vl
+ sp|A3MY90|MURG_ACTP2 93 PDAVLGMGGYVSGPGGIAAKLCGVPVILHEQNAVAGLTNVWLSKIARRVL 142
+ **********************************************9986 PP
+
+>> sp|A0RHT1|MURG2_BACAH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.9 0.0 7.9e-40 4.4e-37 1 139 [] 3 143 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 131.9 bits; conditional E-value: 7.9e-40
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ v+++ggGT+G+++Pa+Al re ++ +e r ++t++gle+++ ++ag+++++i + ++++k+ sl+++k++ ++lk+++++k+ +
+ sp|A0RHT1|MURG2_BACAH 3 VLVSGGGTGGHIYPALALIREIKKLNPEARflyIGTENGLESTIvPKAGIPFQSIVIS-GFKRKI-SLDNVKTVMRFLKGVQDSKRYI 88
+ 7899******************************************************.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++++pd+v+g+ggyv +++++aa+++gip++v+Eqn++pg++nk+l+r++++v+v
+ sp|A0RHT1|MURG2_BACAH 89 RRFNPDIVIGTGGYVCGPVVYAAAKLGIPTIVHEQNSVPGVTNKFLSRYVDKVAV 143
+ ****************************************************975 PP
+
+>> sp|Q636B6|MURG1_BACCZ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.9 0.0 7.9e-40 4.4e-37 1 139 [] 3 143 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 131.9 bits; conditional E-value: 7.9e-40
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ v+++ggGT+G+++Pa+Al re ++ +e r ++t++gle+++ ++ag+++++i + ++++k+ sl+++k++ ++lk+++++k+ +
+ sp|Q636B6|MURG1_BACCZ 3 VLVSGGGTGGHIYPALALIREIKKLNPEARflyIGTENGLESTIvPKAGIPFQSIVIS-GFKRKI-SLDNVKTVMRFLKGVQDSKRYI 88
+ 7899******************************************************.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++++pd+v+g+ggyv +++++aa+++gip++v+Eqn++pg++nk+l+r++++v+v
+ sp|Q636B6|MURG1_BACCZ 89 RRFNPDIVIGTGGYVCGPVVYAAAKLGIPTIVHEQNSVPGVTNKFLSRYVDKVAV 143
+ ****************************************************975 PP
+
+>> sp|Q81JG5|MURG1_BACAN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.9 0.0 7.9e-40 4.4e-37 1 139 [] 3 143 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 131.9 bits; conditional E-value: 7.9e-40
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ v+++ggGT+G+++Pa+Al re ++ +e r ++t++gle+++ ++ag+++++i + ++++k+ sl+++k++ ++lk+++++k+ +
+ sp|Q81JG5|MURG1_BACAN 3 VLVSGGGTGGHIYPALALIREIKKLNPEARflyIGTENGLESTIvPKAGIPFQSIVIS-GFKRKI-SLDNVKTVMRFLKGVQDSKRYI 88
+ 7899******************************************************.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++++pd+v+g+ggyv +++++aa+++gip++v+Eqn++pg++nk+l+r++++v+v
+ sp|Q81JG5|MURG1_BACAN 89 RRFNPDIVIGTGGYVCGPVVYAAAKLGIPTIVHEQNSVPGVTNKFLSRYVDKVAV 143
+ ****************************************************975 PP
+
+>> sp|Q732F8|MURG1_BACC1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.9 0.0 7.9e-40 4.4e-37 1 139 [] 3 143 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 131.9 bits; conditional E-value: 7.9e-40
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ v+++ggGT+G+++Pa+Al re ++ +e r ++t++gle+++ ++ag+++++i + ++++k+ sl+++k++ ++lk+++++k+ +
+ sp|Q732F8|MURG1_BACC1 3 VLVSGGGTGGHIYPALALIREIKKLNPEARflyIGTENGLESTIvPKAGIPFQSIVIS-GFKRKI-SLDNVKTVMRFLKGVQDSKRYI 88
+ 7899******************************************************.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++++pd+v+g+ggyv +++++aa+++gip++v+Eqn++pg++nk+l+r++++v+v
+ sp|Q732F8|MURG1_BACC1 89 RRFNPDIVIGTGGYVCGPVVYAAAKLGIPTIVHEQNSVPGVTNKFLSRYVDKVAV 143
+ ****************************************************975 PP
+
+>> sp|B7GGI2|MURG_ANOFW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 133.1 0.0 3.2e-40 1.8e-37 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 133.1 bits; conditional E-value: 3.2e-40
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT+G+++Pa+A+ +e++++ ++V ++t++gle+++ + +++++++i++ +l+++l s++++k++ ++ k++r+ k++lk
+ sp|B7GGI2|MURG_ANOFW 3 IVVSGGGTGGHIYPALAFIHEVKKQHPNVDvlyIGTKKGLESTIvPRENIPFHAIDIS-GLKRSL-SFENVKTIVRFIKSVRACKKLLK 89
+ 799*******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpdvv+g+ggyv +++++aa+++gip++++Eqn+ipgl+n +l+r+an+v+
+ sp|B7GGI2|MURG_ANOFW 90 QYKPDVVLGTGGYVCGPVVYAAAKLGIPTIIHEQNSIPGLTNTFLSRYANKVA 142
+ ***************************************************97 PP
+
+>> sp|A7GRN6|MURG_BACCN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.9 0.0 7.5e-40 4.2e-37 1 139 [] 3 143 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 131.9 bits; conditional E-value: 7.5e-40
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+Al re ++ +e r ++t++gle+++ ++ag+++++i + ++++k+ s++++k++ ++ k+++++k+ ++
+ sp|A7GRN6|MURG_BACCN 3 ILVSGGGTGGHIYPALALIREIKKLHPEARflyIGTENGLESTIvPKAGIPFQSIVIS-GFKRKI-SFDNVKTVMRFVKGVQDSKRYIR 89
+ 6899******************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ +++pdvv+g+ggyv +++++aa+++gip++v+Eqn++pg++nk+l+r++++v+v
+ sp|A7GRN6|MURG_BACCN 90 RFNPDVVIGTGGYVCGPVVYAAAKLGIPTIVHEQNSVPGVTNKFLSRYVDKVAV 143
+ ***************************************************975 PP
+
+>> sp|B0BRH7|MURG_ACTPJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 133.5 0.1 2.5e-40 1.4e-37 2 138 .. 6 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 133.5 bits; conditional E-value: 2.5e-40
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+areLq++G+e+r l+t++++e+ + +++g++++ i++ +l+ k+ + lk +++ +ka+ +a++i+k+++
+ sp|B0BRH7|MURG_ACTPJ 6 LVMAGGTGGHVFPAIAVARELQKQGWEIRwLGTKDRMEADLvPKHGIPIEFIQIS-GLKGKG-IGALLKAPFAIFKAVMQARKIIKNYQ 92
+ 789*************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+l+g+p++++Eqn+++gl+n +l++ a +vl
+ sp|B0BRH7|MURG_ACTPJ 93 PDAVLGMGGYVSGPGGIAAKLCGVPVILHEQNAVAGLTNVWLSKIACRVL 142
+ *******************************************9987775 PP
+
+>> sp|B3GZK8|MURG_ACTP7 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 133.5 0.1 2.5e-40 1.4e-37 2 138 .. 6 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 133.5 bits; conditional E-value: 2.5e-40
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+areLq++G+e+r l+t++++e+ + +++g++++ i++ +l+ k+ + lk +++ +ka+ +a++i+k+++
+ sp|B3GZK8|MURG_ACTP7 6 LVMAGGTGGHVFPAIAVARELQKQGWEIRwLGTKDRMEADLvPKHGIPIEFIQIS-GLKGKG-IGALLKAPFAIFKAVMQARKIIKNYQ 92
+ 789*************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+l+g+p++++Eqn+++gl+n +l++ a +vl
+ sp|B3GZK8|MURG_ACTP7 93 PDAVLGMGGYVSGPGGIAAKLCGVPVILHEQNAVAGLTNVWLSKIACRVL 142
+ *******************************************9987775 PP
+
+>> sp|Q6HEQ4|MURG1_BACHK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 130.6 0.0 2e-39 1.1e-36 1 139 [] 3 143 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 130.6 bits; conditional E-value: 2e-39
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ v+++ggGT+G+++Pa+Al re ++ +e r ++t++gle+++ +++g+++++i + ++++k+ sl+++k++ ++lk+++++k+ +
+ sp|Q6HEQ4|MURG1_BACHK 3 VLVSGGGTGGHIYPALALIREIKKLNPEARflyIGTENGLESTIvPKTGIPFQSIVIS-GFKRKI-SLDNVKTVMRFLKGVQDSKRYI 88
+ 7899******************************************************.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++++pd+v+g+ggyv +++++aa+++gip++v+Eqn++pg++nk+l+r++++v+v
+ sp|Q6HEQ4|MURG1_BACHK 89 RRFNPDIVIGTGGYVCGPVVYAAAKLGIPTIVHEQNSVPGVTNKFLSRYVDKVAV 143
+ ****************************************************975 PP
+
+>> sp|O07670|MURG_ENTHR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 132.0 0.0 7.1e-40 4e-37 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 132.0 bits; conditional E-value: 7.1e-40
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+A+ + +++++++ + +++++gle+++ +e+g+++++++++ ++++kl sl++lk+++ +lk++r+ak+ilk
+ sp|O07670|MURG_ENTHR 3 ILVTGGGTGGHIYPALAFVNYVKTKEPNTEfmyVGAQRGLENKIvPETGMPFRTLEIQ-GFQRKL-SLHNLKTIQLFLKSIREAKKILK 89
+ 799*******************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ e+kpdvv+g+ggyv++++++aa+++ ip++++Eqn++pg++nk+l+r++++++
+ sp|O07670|MURG_ENTHR 90 EFKPDVVIGTGGYVSGAVVYAASKLAIPTIIHEQNSVPGITNKFLSRYVDRIA 142
+ **************************************************986 PP
+
+>> sp|A7FM66|MURG_YERP3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.6 0.3 4e-39 2.3e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 2.6 0.0 6.1 3.4e+03 38 108 .. 266 342 .. 253 356 .] 0.53
+
+ Alignments for each domain:
+ == domain 1 score: 129.6 bits; conditional E-value: 4e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i++ +l+ k+ ++ l+ + + ++a+r+a +i+++++
+ sp|A7FM66|MURG_YERP3 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEASLvPQHGIEIDFIKIS-GLRGKG-LMAQLTAPIRIYRAVRQAQKIMRDYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+l+g+p++++Eqngi+gl+n++l+r a++vl
+ sp|A7FM66|MURG_YERP3 96 PDVVLGMGGYVSGPGGLAAWLCGVPVVLHEQNGIAGLTNRWLARIAKKVL 145
+ ***********************************************997 PP
+
+ == domain 2 score: 2.6 bits; conditional E-value: 6.1
+ HHHHHH---EEEE----........................S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 38 eefveeagleavpigpd........................vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadl 102
+ +++v++agl+a ++ + ++ ++ +l+ + ++++++++++ +
+ sp|A7FM66|MURG_YERP3 266 VSEVAAAGLPAIFVPFQhkdrqqywnalplekagaakiieqPQFT------------------ATSVSSLLAGWDRATLLSMAERARSV 336
+ 567899****99999998888666666555544444443332222..................22333333334444444444444444 PP
+
+ E--HHH CS
+ Glyco_transf_28 103 aliaal 108
+ a+ a+
+ sp|A7FM66|MURG_YERP3 337 AIPDAT 342
+ 444333 PP
+
+>> sp|B1JK81|MURG_YERPY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.6 0.3 4e-39 2.3e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 2.6 0.0 6.1 3.4e+03 38 108 .. 266 342 .. 253 356 .] 0.53
+
+ Alignments for each domain:
+ == domain 1 score: 129.6 bits; conditional E-value: 4e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i++ +l+ k+ ++ l+ + + ++a+r+a +i+++++
+ sp|B1JK81|MURG_YERPY 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEASLvPQHGIEIDFIKIS-GLRGKG-LMAQLTAPIRIYRAVRQAQKIMRDYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+l+g+p++++Eqngi+gl+n++l+r a++vl
+ sp|B1JK81|MURG_YERPY 96 PDVVLGMGGYVSGPGGLAAWLCGVPVVLHEQNGIAGLTNRWLARIAKKVL 145
+ ***********************************************997 PP
+
+ == domain 2 score: 2.6 bits; conditional E-value: 6.1
+ HHHHHH---EEEE----........................S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 38 eefveeagleavpigpd........................vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadl 102
+ +++v++agl+a ++ + ++ ++ +l+ + ++++++++++ +
+ sp|B1JK81|MURG_YERPY 266 VSEVAAAGLPAIFVPFQhkdrqqywnalplekagaakiieqPQFT------------------ATSVSSLLAGWDRATLLSMAERARSV 336
+ 567899****99999998888666666555544444443332222..................22333333334444444444444444 PP
+
+ E--HHH CS
+ Glyco_transf_28 103 aliaal 108
+ a+ a+
+ sp|B1JK81|MURG_YERPY 337 AIPDAT 342
+ 444333 PP
+
+>> sp|B2K4E6|MURG_YERPB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.6 0.3 4e-39 2.3e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 2.6 0.0 6.1 3.4e+03 38 108 .. 266 342 .. 253 356 .] 0.53
+
+ Alignments for each domain:
+ == domain 1 score: 129.6 bits; conditional E-value: 4e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i++ +l+ k+ ++ l+ + + ++a+r+a +i+++++
+ sp|B2K4E6|MURG_YERPB 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEASLvPQHGIEIDFIKIS-GLRGKG-LMAQLTAPIRIYRAVRQAQKIMRDYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+l+g+p++++Eqngi+gl+n++l+r a++vl
+ sp|B2K4E6|MURG_YERPB 96 PDVVLGMGGYVSGPGGLAAWLCGVPVVLHEQNGIAGLTNRWLARIAKKVL 145
+ ***********************************************997 PP
+
+ == domain 2 score: 2.6 bits; conditional E-value: 6.1
+ HHHHHH---EEEE----........................S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 38 eefveeagleavpigpd........................vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadl 102
+ +++v++agl+a ++ + ++ ++ +l+ + ++++++++++ +
+ sp|B2K4E6|MURG_YERPB 266 VSEVAAAGLPAIFVPFQhkdrqqywnalplekagaakiieqPQFT------------------ATSVSSLLAGWDRATLLSMAERARSV 336
+ 567899****99999998888666666555544444443332222..................22333333334444444444444444 PP
+
+ E--HHH CS
+ Glyco_transf_28 103 aliaal 108
+ a+ a+
+ sp|B2K4E6|MURG_YERPB 337 AIPDAT 342
+ 444333 PP
+
+>> sp|Q66EK5|MURG_YERPS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.6 0.3 4e-39 2.3e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 2.6 0.0 6.1 3.4e+03 38 108 .. 266 342 .. 253 356 .] 0.53
+
+ Alignments for each domain:
+ == domain 1 score: 129.6 bits; conditional E-value: 4e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i++ +l+ k+ ++ l+ + + ++a+r+a +i+++++
+ sp|Q66EK5|MURG_YERPS 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEASLvPQHGIEIDFIKIS-GLRGKG-LMAQLTAPIRIYRAVRQAQKIMRDYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+l+g+p++++Eqngi+gl+n++l+r a++vl
+ sp|Q66EK5|MURG_YERPS 96 PDVVLGMGGYVSGPGGLAAWLCGVPVVLHEQNGIAGLTNRWLARIAKKVL 145
+ ***********************************************997 PP
+
+ == domain 2 score: 2.6 bits; conditional E-value: 6.1
+ HHHHHH---EEEE----........................S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 38 eefveeagleavpigpd........................vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadl 102
+ +++v++agl+a ++ + ++ ++ +l+ + ++++++++++ +
+ sp|Q66EK5|MURG_YERPS 266 VSEVAAAGLPAIFVPFQhkdrqqywnalplekagaakiieqPQFT------------------ATSVSSLLAGWDRATLLSMAERARSV 336
+ 567899****99999998888666666555544444443332222..................22333333334444444444444444 PP
+
+ E--HHH CS
+ Glyco_transf_28 103 aliaal 108
+ a+ a+
+ sp|Q66EK5|MURG_YERPS 337 AIPDAT 342
+ 444333 PP
+
+>> sp|A1JJJ3|MURG_YERE8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 130.3 0.2 2.5e-39 1.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 130.3 bits; conditional E-value: 2.5e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + ++ g+e+ i++ +l+ k+ ++ l+ + + ++a+r+ak+i+++++
+ sp|A1JJJ3|MURG_YERE8 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEASLvPKNGIEIDFIEIS-GLRGKG-LMAQLTAPVRIYRAVRQAKKIMRDYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+l+gip++++Eqngi+gl+n++l+r a++vl
+ sp|A1JJJ3|MURG_YERE8 96 PDVVLGMGGYVSGPGGLAAWLCGIPVVLHEQNGIAGLTNRWLARIAKKVL 145
+ ***********************************************997 PP
+
+>> sp|A9MQC2|MURG_SALAR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.3 0.4 4.8e-39 2.7e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 2.9 0.0 5.2 2.9e+03 38 108 .. 266 342 .. 254 351 .. 0.63
+
+ Alignments for each domain:
+ == domain 1 score: 129.3 bits; conditional E-value: 4.8e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g++++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|A9MQC2|MURG_SALAR 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGINIEFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|A9MQC2|MURG_SALAR 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATTVM 145
+ *********************************************99885 PP
+
+ == domain 2 score: 2.9 bits; conditional E-value: 5.2
+ HHHHHH---EEEE----..........S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHH CS
+ Glyco_transf_28 38 eefveeagleavpigpd..........vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaal 108
+ ++++++agl+a ++ + ++l + ++++e ++ + +++ +l+ ++ d+++ +++++ ++ ++ a+
+ sp|A9MQC2|MURG_SALAR 266 VSEIAAAGLPAIFVPFQhkdrqqywnaLPLEN--AGAAKILEQPQF--TAEAVADTLAGWSRDTLLTMAERARAVSILDAT 342
+ 466799*****999999888855555533333..223333333333..456667777777777777777777766666555 PP
+
+>> sp|P64869|Y1526_MYCTU Uncharacterized protein Rv1526c/MT1577 OS=Mycobacterium tuberculosis GN=Rv1526c PE=4 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.8 1.0 8.1e-40 4.5e-37 1 138 [. 3 144 .. 3 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 131.8 bits; conditional E-value: 8.1e-40
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----................................S- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd................................vk 56
+ +vla++GTrGdveP++A+++eL+rrGh V++a+pp+l efve+agl+ v++gpd v+
+ sp|P64869|Y1526_MYCTU 3 FVLAVHGTRGDVEPCAAVGVELRRRGHAVHMAVPPNLIEFVESAGLTGVAYGPDsdeqintvaafvrnltraqnplnlaravkelfVE 90
+ 89***********************************************************************************99* PP
+
+ -----.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 57 lwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +wa e+ +tl++la+g adl++++++++g++anvaE+++ip ++++++p+++ng++
+ sp|P64869|Y1526_MYCTU 91 GWA--EMGTTLTTLADG--------------------------ADLVMTGQTYHGVAANVAEYYDIPAAALHHFPMQVNGQI 144
+ ***..99**********..........................*************************************97 PP
+
+>> sp|P64870|Y1553_MYCBO Uncharacterized protein Mb1553c OS=Mycobacterium bovis GN=Mb1553c PE=4 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.8 1.0 8.1e-40 4.5e-37 1 138 [. 3 144 .. 3 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 131.8 bits; conditional E-value: 8.1e-40
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----................................S- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd................................vk 56
+ +vla++GTrGdveP++A+++eL+rrGh V++a+pp+l efve+agl+ v++gpd v+
+ sp|P64870|Y1553_MYCBO 3 FVLAVHGTRGDVEPCAAVGVELRRRGHAVHMAVPPNLIEFVESAGLTGVAYGPDsdeqintvaafvrnltraqnplnlaravkelfVE 90
+ 89***********************************************************************************99* PP
+
+ -----.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 57 lwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +wa e+ +tl++la+g adl++++++++g++anvaE+++ip ++++++p+++ng++
+ sp|P64870|Y1553_MYCBO 91 GWA--EMGTTLTTLADG--------------------------ADLVMTGQTYHGVAANVAEYYDIPAAALHHFPMQVNGQI 144
+ ***..99**********..........................*************************************97 PP
+
+>> sp|Q65RY6|MURG_MANSM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.5 0.1 1e-39 5.6e-37 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 131.5 bits; conditional E-value: 1e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+a+ Lq++G++++ l+t++++e+++ +++g++++ i++ +l+ k+ + l +++ ++a+ +a++i+ ++k
+ sp|Q65RY6|MURG_MANSM 8 LVMAGGTGGHVFPAIAVAQYLQKQGWDICwLGTKDRMEAQLvPKHGIPIEFIQIS-GLRGKG-IKALLGAPFAICRAIMQARKIILRQK 94
+ 789****************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ ++aa+l+g+p++++Eqn+++gl+n +l++ a++vl
+ sp|Q65RY6|MURG_MANSM 95 PDAVLGMGGYVSGPGGVAAKLCGVPVILHEQNAVAGLTNVWLSKIAKRVL 144
+ ***********************************************997 PP
+
+>> sp|B2VD91|MURG_ERWT9 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.7 0.2 3.7e-39 2.1e-36 2 138 .. 7 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 129.7 bits; conditional E-value: 3.7e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g++++ i + +l+ k+ + l +++ ++a+r+a++i+k ++
+ sp|B2VD91|MURG_ERWT9 7 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIEFIRIS-GLRGKG-IKALLAAPLRIFNAWRQARAIMKAWQ 93
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B2VD91|MURG_ERWT9 94 PDVVLGMGGYVSGPGGLAAWSCGIPVVLHEQNGIAGLTNKWLAKIATKVM 143
+ ***********************************************986 PP
+
+>> sp|Q4QLF8|MURG_HAEI8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.2 0.1 1.3e-39 7.4e-37 2 138 .. 7 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 131.2 bits; conditional E-value: 1.3e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+a++Lq+++++++ l+t++++e+++ +++g++++ i++ +l+ k+ + l +++ ++a+ +ak+i++e+k
+ sp|Q4QLF8|MURG_HAEI8 7 LVMAGGTGGHVFPAIAVAQTLQKQEWDICwLGTKDRMEAQLvPKYGIPIRFIQIS-GLRGKG-IKALLNAPFAIFRAVLQAKKIIQEEK 93
+ 789****************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++a++aa+l+g+p++++Eqn+i+gl+nkll + a+ vl
+ sp|Q4QLF8|MURG_HAEI8 94 PDAVLGMGGYVSGPAGVAAKLCGVPIILHEQNAIAGLTNKLLGKIATCVL 143
+ *******************************************9999886 PP
+
+>> sp|A5UIR2|MURG_HAEIG UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.2 0.1 1.3e-39 7.4e-37 2 138 .. 7 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 131.2 bits; conditional E-value: 1.3e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+a++Lq+++++++ l+t++++e+++ +++g++++ i++ +l+ k+ + l +++ ++a+ +ak+i++e+k
+ sp|A5UIR2|MURG_HAEIG 7 LVMAGGTGGHVFPAIAVAQTLQKQEWDICwLGTKDRMEAQLvPKYGIPIRFIQIS-GLRGKG-IKALLNAPFAIFRAVLQAKKIIQEEK 93
+ 789****************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++a++aa+l+g+p++++Eqn+i+gl+nkll + a+ vl
+ sp|A5UIR2|MURG_HAEIG 94 PDAVLGMGGYVSGPAGVAAKLCGVPIILHEQNAIAGLTNKLLGKIATCVL 143
+ *******************************************9999886 PP
+
+>> sp|P45065|MURG_HAEIN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 131.2 0.1 1.3e-39 7.4e-37 2 138 .. 7 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 131.2 bits; conditional E-value: 1.3e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+a++Lq+++++++ l+t++++e+++ +++g++++ i++ +l+ k+ + l +++ ++a+ +ak+i++e+k
+ sp|P45065|MURG_HAEIN 7 LVMAGGTGGHVFPAIAVAQTLQKQEWDICwLGTKDRMEAQLvPKYGIPIRFIQIS-GLRGKG-IKALLNAPFAIFRAVLQAKKIIQEEK 93
+ 789****************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++a++aa+l+g+p++++Eqn+i+gl+nkll + a+ vl
+ sp|P45065|MURG_HAEIN 94 PDAVLGMGGYVSGPAGVAAKLCGVPIILHEQNAIAGLTNKLLGKIATCVL 143
+ *******************************************9999886 PP
+
+>> sp|A9R124|MURG_YERPG UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 128.3 0.3 9.8e-39 5.5e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 2.8 0.0 5.3 3e+03 38 116 .. 266 350 .. 254 356 .] 0.56
+
+ Alignments for each domain:
+ == domain 1 score: 128.3 bits; conditional E-value: 9.8e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i++ +l+ k+ ++ l+ + + ++a+r+a +i+++++
+ sp|A9R124|MURG_YERPG 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEASLvPQHGIEIDFIKIS-GLRGKG-LMAQLTAPIRIYRAVRQAQKIMRDYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p+vv+g+ggyv+++ ++aa+l+g+p++++Eqngi+gl+n++l+r a++vl
+ sp|A9R124|MURG_YERPG 96 PNVVLGMGGYVSGPGGLAAWLCGVPVVLHEQNGIAGLTNRWLARIAKKVL 145
+ ***********************************************997 PP
+
+ == domain 2 score: 2.8 bits; conditional E-value: 5.3
+ HHHHHH---EEEE----........................S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 38 eefveeagleavpigpd........................vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadl 102
+ +++v++agl+a ++ + ++ + ++ +l+++ ++++++++++ +
+ sp|A9R124|MURG_YERPG 266 VSEVAAAGLPAIFVPFQhkdrqqywnalplekagaakiieqP----------------QF--TATSVSSLLASWDRATLLSMAERARSV 336
+ 567899****99999998888666655433333333332222................22..334444555555555555555555555 PP
+
+ E--HHHHHHHHHHH CS
+ Glyco_transf_28 103 aliaallagipanv 116
+ a+ a+ + ++ +v
+ sp|A9R124|MURG_YERPG 337 AIPDATERVAAEVV 350
+ 55555555554444 PP
+
+>> sp|Q1C214|MURG_YERPA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 128.3 0.3 9.8e-39 5.5e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 2.8 0.0 5.3 3e+03 38 116 .. 266 350 .. 254 356 .] 0.56
+
+ Alignments for each domain:
+ == domain 1 score: 128.3 bits; conditional E-value: 9.8e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i++ +l+ k+ ++ l+ + + ++a+r+a +i+++++
+ sp|Q1C214|MURG_YERPA 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEASLvPQHGIEIDFIKIS-GLRGKG-LMAQLTAPIRIYRAVRQAQKIMRDYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p+vv+g+ggyv+++ ++aa+l+g+p++++Eqngi+gl+n++l+r a++vl
+ sp|Q1C214|MURG_YERPA 96 PNVVLGMGGYVSGPGGLAAWLCGVPVVLHEQNGIAGLTNRWLARIAKKVL 145
+ ***********************************************997 PP
+
+ == domain 2 score: 2.8 bits; conditional E-value: 5.3
+ HHHHHH---EEEE----........................S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 38 eefveeagleavpigpd........................vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadl 102
+ +++v++agl+a ++ + ++ + ++ +l+++ ++++++++++ +
+ sp|Q1C214|MURG_YERPA 266 VSEVAAAGLPAIFVPFQhkdrqqywnalplekagaakiieqP----------------QF--TATSVSSLLASWDRATLLSMAERARSV 336
+ 567899****99999998888666655433333333332222................22..334444555555555555555555555 PP
+
+ E--HHHHHHHHHHH CS
+ Glyco_transf_28 103 aliaallagipanv 116
+ a+ a+ + ++ +v
+ sp|Q1C214|MURG_YERPA 337 AIPDATERVAAEVV 350
+ 55555555554444 PP
+
+>> sp|Q1CMM7|MURG_YERPN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 128.3 0.3 9.8e-39 5.5e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 2.8 0.0 5.3 3e+03 38 116 .. 266 350 .. 254 356 .] 0.56
+
+ Alignments for each domain:
+ == domain 1 score: 128.3 bits; conditional E-value: 9.8e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i++ +l+ k+ ++ l+ + + ++a+r+a +i+++++
+ sp|Q1CMM7|MURG_YERPN 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEASLvPQHGIEIDFIKIS-GLRGKG-LMAQLTAPIRIYRAVRQAQKIMRDYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p+vv+g+ggyv+++ ++aa+l+g+p++++Eqngi+gl+n++l+r a++vl
+ sp|Q1CMM7|MURG_YERPN 96 PNVVLGMGGYVSGPGGLAAWLCGVPVVLHEQNGIAGLTNRWLARIAKKVL 145
+ ***********************************************997 PP
+
+ == domain 2 score: 2.8 bits; conditional E-value: 5.3
+ HHHHHH---EEEE----........................S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 38 eefveeagleavpigpd........................vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadl 102
+ +++v++agl+a ++ + ++ + ++ +l+++ ++++++++++ +
+ sp|Q1CMM7|MURG_YERPN 266 VSEVAAAGLPAIFVPFQhkdrqqywnalplekagaakiieqP----------------QF--TATSVSSLLASWDRATLLSMAERARSV 336
+ 567899****99999998888666655433333333332222................22..334444555555555555555555555 PP
+
+ E--HHHHHHHHHHH CS
+ Glyco_transf_28 103 aliaallagipanv 116
+ a+ a+ + ++ +v
+ sp|Q1CMM7|MURG_YERPN 337 AIPDATERVAAEVV 350
+ 55555555554444 PP
+
+>> sp|Q8ZIE9|MURG_YERPE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 128.3 0.3 9.8e-39 5.5e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 2.8 0.0 5.3 3e+03 38 116 .. 266 350 .. 254 356 .] 0.56
+
+ Alignments for each domain:
+ == domain 1 score: 128.3 bits; conditional E-value: 9.8e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i++ +l+ k+ ++ l+ + + ++a+r+a +i+++++
+ sp|Q8ZIE9|MURG_YERPE 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEASLvPQHGIEIDFIKIS-GLRGKG-LMAQLTAPIRIYRAVRQAQKIMRDYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p+vv+g+ggyv+++ ++aa+l+g+p++++Eqngi+gl+n++l+r a++vl
+ sp|Q8ZIE9|MURG_YERPE 96 PNVVLGMGGYVSGPGGLAAWLCGVPVVLHEQNGIAGLTNRWLARIAKKVL 145
+ ***********************************************997 PP
+
+ == domain 2 score: 2.8 bits; conditional E-value: 5.3
+ HHHHHH---EEEE----........................S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 38 eefveeagleavpigpd........................vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadl 102
+ +++v++agl+a ++ + ++ + ++ +l+++ ++++++++++ +
+ sp|Q8ZIE9|MURG_YERPE 266 VSEVAAAGLPAIFVPFQhkdrqqywnalplekagaakiieqP----------------QF--TATSVSSLLASWDRATLLSMAERARSV 336
+ 567899****99999998888666655433333333332222................22..334444555555555555555555555 PP
+
+ E--HHHHHHHHHHH CS
+ Glyco_transf_28 103 aliaallagipanv 116
+ a+ a+ + ++ +v
+ sp|Q8ZIE9|MURG_YERPE 337 AIPDATERVAAEVV 350
+ 55555555554444 PP
+
+>> sp|O07109|MURG_ENTFA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.0 0.0 6.2e-39 3.5e-36 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 129.0 bits; conditional E-value: 6.2e-39
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+++ ++++++ + + ++t++gle+++ ++a++++++i+++ +++++l s++++k+++ +l +++kak+i++
+ sp|O07109|MURG_ENTFA 3 ILVTGGGTGGHIYPALSFVEHVKKEAPATEflyVGTENGLESQIvPKAKIPFKTIKIQ-GFKRSL-SPQNFKTIYLFLTSINKAKKIIR 89
+ 799*******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ e++pdvv+g+ggyv++++++aa ++ip++++Eqn+ipg++nk+l+r++++++
+ sp|O07109|MURG_ENTFA 90 EFQPDVVIGTGGYVSGAVVYAAHQLKIPTIIHEQNSIPGMTNKFLSRYVDKIA 142
+ **************************************************987 PP
+
+>> sp|A3QIM1|MURG_SHELP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.5 0.1 4.3e-39 2.4e-36 1 138 [. 7 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 129.5 bits; conditional E-value: 4.3e-39
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a++L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l +++ l+++ +a+e++ke+
+ sp|A3QIM1|MURG_SHELP 7 ILIMAGGTGGHVFPALAVAKALAKQGWQVRwLGTADRMEARLvPQHGFDIDFIDIK-GVRGNG-LIRKLAAPFKILRSIMQAREVIKEF 93
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kp+vv+g+gg+++++ ++aa+l+gip++++Eqn+ipg++nkll+r a +vl
+ sp|A3QIM1|MURG_SHELP 94 KPHVVLGMGGFASGPGGVAAKLSGIPLVLHEQNAIPGMTNKLLSRIASRVL 144
+ ***********************************************9986 PP
+
+>> sp|A8G9S7|MURG_SERP5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.0 0.2 6.2e-39 3.5e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 129.0 bits; conditional E-value: 6.2e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + l+ +++ + a+r+ak+i+++++
+ sp|A8G9S7|MURG_SERP5 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-LKAQLSAPLRIWHAVRQAKAIMRNYQ 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+l+gip++++Eqngi+gl+n++l+r a++vl
+ sp|A8G9S7|MURG_SERP5 96 PDVVLGMGGYVSGPGGLAAWLCGIPVVLHEQNGIAGLTNRWLARIAKTVL 145
+ **********************************************9986 PP
+
+>> sp|B7LWF6|MURG_ESCF3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.0 0.3 6e-39 3.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 129.0 bits; conditional E-value: 6e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L ++G+eVr l+t +++e+ + +++g+e+ i + +l+ k+ + l +++ ++a+r+a++i+k +k
+ sp|B7LWF6|MURG_ESCF3 9 MVMAGGTGGHVFPGLAVAHHLIAQGWEVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALLAAPLRIFNAWRQARAIMKAFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B7LWF6|MURG_ESCF3 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|A7MIE5|MURG_ENTS8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 128.7 0.2 7.6e-39 4.3e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 128.7 bits; conditional E-value: 7.6e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + l+ + + ++a+r+a++i+k++k
+ sp|A7MIE5|MURG_ENTS8 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-VKALLLAPVRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a +v+
+ sp|A7MIE5|MURG_ENTS8 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIASRVM 145
+ ********************************************999885 PP
+
+>> sp|C6DEU3|MURG_PECCP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 128.8 0.2 7.1e-39 4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 128.8 bits; conditional E-value: 7.1e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ ++ l+ + + ++a+r+a++i+++++
+ sp|C6DEU3|MURG_PECCP 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IWAQLSAPIRIFQAVRQARAIMRRYQ 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+l+gip++++Eqngi+gl+n++l+ a++vl
+ sp|C6DEU3|MURG_PECCP 96 PDVVLGMGGYVSGPGGLAAWLCGIPVVLHEQNGIAGLTNRWLSHIAKKVL 145
+ **********************************************9997 PP
+
+>> sp|Q88V81|MURG_LACPL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.1 2.4e-38 1.3e-35 2 138 .. 4 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.4e-38
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++ggGT+G+++Pa+Al ++L++ ++e ++t++gle+++ +e+g+++++i+++ +++++l sl+++k+++ +lk++ a++ +k
+ sp|Q88V81|MURG_LACPL 4 MISGGGTGGHIYPALALIDALKAHDPEAQvqfVGTHRGLESRIvPERGIDFKTIKIQ-GFKRSL-SLQNVKTVYLFLKSVVTARKYIKA 90
+ 5799**********************99999**************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpdvvvg+ggyv++++++aa+ +ip++++Eqn++ g++nk+l+r++++++
+ sp|Q88V81|MURG_LACPL 91 FKPDVVVGTGGYVSGAVVFAASQMHIPTVIHEQNSVVGVTNKFLSRFVDKIA 142
+ *************************************************987 PP
+
+>> sp|Q8Z9G9|MURG_SALTI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.8 0.2 1.5e-38 8.3e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.8 bits; conditional E-value: 1.5e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t++++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|Q8Z9G9|MURG_SALTI 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTSDRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|Q8Z9G9|MURG_SALTI 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|B4F111|MURG_PROMH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.6 0.1 3.5e-38 1.9e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 3.2 0.0 4 2.3e+03 38 116 .. 271 355 .. 257 358 .. 0.68
+
+ Alignments for each domain:
+ == domain 1 score: 126.6 bits; conditional E-value: 3.5e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a+ Lq +G+++r l+t +++e+++ +++g+e++ i + +l+ k+ + + + + ka+++a++i+k+++
+ sp|B4F111|MURG_PROMH 9 MVMAGGTGGHVFPGLAVAHYLQSQGWDIRwLGTADRMEAQLvPKHGIEIEYIRIS-GLRGKG-VKALIAAPIRIIKAIFQARRIMKRYQ 95
+ 5899***************************************************.******.9999********************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++vl
+ sp|B4F111|MURG_PROMH 96 PDAVLGMGGYVSGPGGVAAWSCGIPVVLHEQNGIAGLTNRWLSKIAKRVL 145
+ ***********************************************997 PP
+
+ == domain 2 score: 3.2 bits; conditional E-value: 4
+ HHHHHH---EEEE----....S------...-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHH CS
+ Glyco_transf_28 38 eefveeagleavpigpd....vklwakl..eslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanv 116
+ ++++++agl+a ++ + ++w+ l e ++ + + ++ + +++ +l+++ + ++ +++ ++ +a++ a+ + + +++
+ sp|B4F111|MURG_PROMH 271 VSEIAAAGLPAIFVPFQhkdrQQYWNALplENAGAARIIEQNDLTPEAIADTLENWDRHQLMLMAEKAQSVAITDATERVANVII 355
+ 4566999999999999988885555543113344445555555577778888888888888888888888888888777777665 PP
+
+>> sp|A0L1P2|MURG_SHESA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.0 0.2 2.5e-38 1.4e-35 1 138 [. 8 145 .. 8 146 .. 0.99
+ 2 ? 3.7 0.1 2.9 1.6e+03 54 117 .. 285 357 .. 254 361 .. 0.68
+
+ Alignments for each domain:
+ == domain 1 score: 127.0 bits; conditional E-value: 2.5e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++ +++ +ak++++e+
+ sp|A0L1P2|MURG_SHESA 8 ILVMAGGTGGHVFPALAVAKYLAQQGWQVRwLGTADRMEARLvPQYGFDIDFIDIK-GVRGNG-LVRKLAAPFKVVRSILQAKAVIAEF 94
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+lag+p++++Eqn+ipg++nkll+r an+vl
+ sp|A0L1P2|MURG_SHESA 95 KPDVVLGMGGFASGPGGVAAKLAGVPLVLHEQNAIPGMTNKLLSRIANQVL 145
+ ************************************************986 PP
+
+ == domain 2 score: 3.7 bits; conditional E-value: 2.9
+ -..............S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHH CS
+ Glyco_transf_28 54 d..............vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanva 117
+ v++ a + +++++++ + + ++l++++ + ++++g+++ d+a++ a+ + +++ +a
+ sp|A0L1P2|MURG_SHESA 285 PhavddhqtrnaqvlVEAGAAFLLPQAILDVNKL----VSKLQLLANDR-AELAQMGQRARDVAVLDATEQVAQVCIA 357
+ 3446666666666665666666677777777777....44445555555.6677***************999998876 PP
+
+>> sp|Q0HZR6|MURG_SHESR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.0 0.2 2.5e-38 1.4e-35 1 138 [. 8 145 .. 8 146 .. 0.99
+ 2 ? 3.7 0.1 2.9 1.6e+03 54 117 .. 285 357 .. 254 361 .. 0.68
+
+ Alignments for each domain:
+ == domain 1 score: 127.0 bits; conditional E-value: 2.5e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++ +++ +ak++++e+
+ sp|Q0HZR6|MURG_SHESR 8 ILVMAGGTGGHVFPALAVAKYLAQQGWQVRwLGTADRMEARLvPQYGFDIDFIDIK-GVRGNG-LVRKLAAPFKVVRSILQAKAVIAEF 94
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+lag+p++++Eqn+ipg++nkll+r an+vl
+ sp|Q0HZR6|MURG_SHESR 95 KPDVVLGMGGFASGPGGVAAKLAGVPLVLHEQNAIPGMTNKLLSRIANQVL 145
+ ************************************************986 PP
+
+ == domain 2 score: 3.7 bits; conditional E-value: 2.9
+ -..............S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHH CS
+ Glyco_transf_28 54 d..............vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanva 117
+ v++ a + +++++++ + + ++l++++ + ++++g+++ d+a++ a+ + +++ +a
+ sp|Q0HZR6|MURG_SHESR 285 PhavddhqtrnaqvlVEAGAAFLLPQAILDVNKL----VSKLQLLANDR-AELAQMGQRARDVAVLDATEQVAQVCIA 357
+ 3446666666666665666666677777777777....44445555555.6677***************999998876 PP
+
+>> sp|B5BLC2|MURG_SALPK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.5 0.3 1.7e-38 9.6e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.5 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|B5BLC2|MURG_SALPK 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l+r a++v+
+ sp|B5BLC2|MURG_SALPK 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLARIATTVM 145
+ **********************************************9885 PP
+
+>> sp|Q5PDC8|MURG_SALPA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.5 0.3 1.7e-38 9.6e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.5 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|Q5PDC8|MURG_SALPA 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l+r a++v+
+ sp|Q5PDC8|MURG_SALPA 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLARIATTVM 145
+ **********************************************9885 PP
+
+>> sp|Q9K9T0|MURG_BACHD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.6 0.0 4.1e-39 2.3e-36 1 138 [. 3 142 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 129.6 bits; conditional E-value: 4.1e-39
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT+G+++Pa+A+ +e ++r+ + ++t++gle+++ + +g+++++i + ++++kl s++++k++ ++l+++++ak++l
+ sp|Q9K9T0|MURG_BACHD 3 IVVSGGGTGGHIYPALAFINEMKKRDERLDvlyIGTERGLESEIvPREGIPFQTIHIT-GFQRKL-SMENVKTVVRFLRGTKRAKALLN 89
+ 799***********************877777**************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ e+kpdvv+g+ggyv +++++aa++++ip++++Eqn++pgl+nk+l+r++++++
+ sp|Q9K9T0|MURG_BACHD 90 EFKPDVVIGTGGYVCGPVVYAAAKLKIPTVIHEQNSVPGLTNKFLSRYVDRIA 142
+ **************************************************987 PP
+
+>> sp|Q8Y5M2|MURG_LISMO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 129.2 0.0 5.2e-39 2.9e-36 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 129.2 bits; conditional E-value: 5.2e-39
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+v+Pa+Al reL++ +e + ++t++gle+ + + +g+++++i++ +++++l sl+++k++ ++l + +k+k+il+
+ sp|Q8Y5M2|MURG_LISMO 3 VAISGGGTGGHVYPALALIRELKKSHPEAEflyIGTEKGLEAGIvKREGIPFEAIEIT-GFKRSL-SLENIKTVMRFLSGAKKSKQILR 89
+ 6899******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpdvv+g+ggyv +++++aa++++ip+ ++Eqn+++gl+nk+l+r+ ++v+
+ sp|Q8Y5M2|MURG_LISMO 90 DFKPDVVIGTGGYVCGPVVYAAAKLKIPTLIHEQNSVAGLTNKFLSRYTDKVA 142
+ **************************************************997 PP
+
+>> sp|A9MZL9|MURG_SALPB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.3 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|A9MZL9|MURG_SALPB 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|A9MZL9|MURG_SALPB 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|B4TJ87|MURG_SALHS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.3 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|B4TJ87|MURG_SALHS 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|B4TJ87|MURG_SALHS 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|B4TXH8|MURG_SALSV UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.3 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|B4TXH8|MURG_SALSV 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|B4TXH8|MURG_SALSV 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|B5F7W4|MURG_SALA4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.3 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|B5F7W4|MURG_SALA4 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|B5F7W4|MURG_SALA4 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|Q8ZRU3|MURG_SALTY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.3 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|Q8ZRU3|MURG_SALTY 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|Q8ZRU3|MURG_SALTY 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|B4SU50|MURG_SALNS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.3 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|B4SU50|MURG_SALNS 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|B4SU50|MURG_SALNS 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|A1REZ6|MURG_SHESW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.0 0.2 2.6e-38 1.5e-35 1 138 [. 8 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.0 bits; conditional E-value: 2.6e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++ +++ +ak++++e+
+ sp|A1REZ6|MURG_SHESW 8 ILVMAGGTGGHVFPALAVAKYLAQQGWQVRwLGTADRMEARLvPQYGFDIDFIDIK-GVRGNG-LVRKLAAPFKVIRSILQAKAVIAEF 94
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+lagip++++Eqn+ipg++nkll+r a++vl
+ sp|A1REZ6|MURG_SHESW 95 KPDVVLGMGGFASGPGGVAARLAGIPLVLHEQNAIPGMTNKLLSRIATQVL 145
+ ***********************************************9986 PP
+
+>> sp|A4Y2N6|MURG_SHEPC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.0 0.2 2.6e-38 1.5e-35 1 138 [. 8 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.0 bits; conditional E-value: 2.6e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++ +++ +ak++++e+
+ sp|A4Y2N6|MURG_SHEPC 8 ILVMAGGTGGHVFPALAVAKYLAQQGWQVRwLGTADRMEARLvPQYGFDIDFIDIK-GVRGNG-LVRKLAAPFKVIRSILQAKAVIAEF 94
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+lagip++++Eqn+ipg++nkll+r a++vl
+ sp|A4Y2N6|MURG_SHEPC 95 KPDVVLGMGGFASGPGGVAARLAGIPLVLHEQNAIPGMTNKLLSRIATQVL 145
+ ***********************************************9986 PP
+
+>> sp|A6T4N3|MURG_KLEP7 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.5 0.1 1.7e-38 9.6e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.5 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + ++ g+e+ i + +l+ k+ + l+ + + ++a+r+a++i+k+++
+ sp|A6T4N3|MURG_KLEP7 9 MVMAGGTGGHVFPGLAVAHHLMDQGWQVRwLGTADRMEADLvPKNGIEIDFIRIS-GLRGKG-IKAQLLAPVRIFNAWRQARAIMKRFQ 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|A6T4N3|MURG_KLEP7 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIAKKVM 145
+ **********************************************9986 PP
+
+>> sp|B5RH64|MURG_SALG2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.3 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|B5RH64|MURG_SALG2 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|B5RH64|MURG_SALG2 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|A8ALK6|MURG_CITK8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 128.1 0.2 1.1e-38 6.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 128.1 bits; conditional E-value: 1.1e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|A8ALK6|MURG_CITK8 9 MVMAGGTGGHVFPGLAVAHHLMDQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKQFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|A8ALK6|MURG_CITK8 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|Q57TD0|MURG_SALCH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.3 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|Q57TD0|MURG_SALCH 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|Q57TD0|MURG_SALCH 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|A6WID1|MURG_SHEB8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.4 0.2 3.9e-38 2.2e-35 1 138 [. 8 145 .. 8 146 .. 0.98
+ 2 ? 2.3 0.0 8 4.5e+03 54 116 .. 287 356 .. 254 360 .. 0.67
+
+ Alignments for each domain:
+ == domain 1 score: 126.4 bits; conditional E-value: 3.9e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++ +++ +ak++++e+
+ sp|A6WID1|MURG_SHEB8 8 ILVMAGGTGGHVFPALAVAKYLAQQGWQVRwLGTADRMEARLvPQYGFDIDFIDIK-GVRGNG-LIRKLAAPFKVVRSILQAKAVIAEF 94
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+lagip++++Eqn+ipg++nkll+r a++vl
+ sp|A6WID1|MURG_SHEB8 95 KPDVVLGMGGFASGPGGVAARLAGIPLVLHEQNAIPGMTNKLLSRIATQVL 145
+ ***********************************************9986 PP
+
+ == domain 2 score: 2.3 bits; conditional E-value: 8
+ -............S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHH CS
+ Glyco_transf_28 54 d............vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanv 116
+ v++ a + +++++++ + + k l + + ++++g+++ d+a++ a+ + +++ +
+ sp|A6WID1|MURG_SHEB8 287 AvddhqtrngqvlVEAGAAFLLPQAILDVNKL-----AGKLQLLANDRTELARMGQRARDVAVLDATEQVAAVCI 356
+ 15555555555555555555566666666666.....4444455555677889************9999988765 PP
+
+>> sp|A9KY29|MURG_SHEB9 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.4 0.2 3.9e-38 2.2e-35 1 138 [. 8 145 .. 8 146 .. 0.98
+ 2 ? 2.3 0.0 8 4.5e+03 54 116 .. 287 356 .. 254 360 .. 0.67
+
+ Alignments for each domain:
+ == domain 1 score: 126.4 bits; conditional E-value: 3.9e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++ +++ +ak++++e+
+ sp|A9KY29|MURG_SHEB9 8 ILVMAGGTGGHVFPALAVAKYLAQQGWQVRwLGTADRMEARLvPQYGFDIDFIDIK-GVRGNG-LIRKLAAPFKVVRSILQAKAVIAEF 94
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+lagip++++Eqn+ipg++nkll+r a++vl
+ sp|A9KY29|MURG_SHEB9 95 KPDVVLGMGGFASGPGGVAARLAGIPLVLHEQNAIPGMTNKLLSRIATQVL 145
+ ***********************************************9986 PP
+
+ == domain 2 score: 2.3 bits; conditional E-value: 8
+ -............S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHH CS
+ Glyco_transf_28 54 d............vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanv 116
+ v++ a + +++++++ + + k l + + ++++g+++ d+a++ a+ + +++ +
+ sp|A9KY29|MURG_SHEB9 287 AvddhqtrngqvlVEAGAAFLLPQAILDVNKL-----AGKLQLLANDRTELARMGQRARDVAVLDATEQVAAVCI 356
+ 15555555555555555555566666666666.....4444455555677889************9999988765 PP
+
+>> sp|B8E698|MURG_SHEB2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.4 0.2 3.9e-38 2.2e-35 1 138 [. 8 145 .. 8 146 .. 0.98
+ 2 ? 2.3 0.0 8 4.5e+03 54 116 .. 287 356 .. 254 360 .. 0.67
+
+ Alignments for each domain:
+ == domain 1 score: 126.4 bits; conditional E-value: 3.9e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++ +++ +ak++++e+
+ sp|B8E698|MURG_SHEB2 8 ILVMAGGTGGHVFPALAVAKYLAQQGWQVRwLGTADRMEARLvPQYGFDIDFIDIK-GVRGNG-LIRKLAAPFKVVRSILQAKAVIAEF 94
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+lagip++++Eqn+ipg++nkll+r a++vl
+ sp|B8E698|MURG_SHEB2 95 KPDVVLGMGGFASGPGGVAARLAGIPLVLHEQNAIPGMTNKLLSRIATQVL 145
+ ***********************************************9986 PP
+
+ == domain 2 score: 2.3 bits; conditional E-value: 8
+ -............S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHH CS
+ Glyco_transf_28 54 d............vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanv 116
+ v++ a + +++++++ + + k l + + ++++g+++ d+a++ a+ + +++ +
+ sp|B8E698|MURG_SHEB2 287 AvddhqtrngqvlVEAGAAFLLPQAILDVNKL-----AGKLQLLANDRTELARMGQRARDVAVLDATEQVAAVCI 356
+ 15555555555555555555566666666666.....4444455555677889************9999988765 PP
+
+>> sp|B5Y1U7|MURG_KLEP3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.5 0.1 1.7e-38 9.6e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.5 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + ++ g+e+ i + +l+ k+ + l+ + + ++a+r+a++i+k+++
+ sp|B5Y1U7|MURG_KLEP3 9 MVMAGGTGGHVFPGLAVAHHLMDQGWQVRwLGTADRMEADLvPKNGIEIDFIRIS-GLRGKG-IKAQLLAPVRIFNAWRQARAIMKRFQ 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B5Y1U7|MURG_KLEP3 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIAKKVM 145
+ **********************************************9986 PP
+
+>> sp|A3CZM1|MURG_SHEB5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.4 0.2 3.9e-38 2.2e-35 1 138 [. 8 145 .. 8 146 .. 0.98
+ 2 ? 2.2 0.0 8.1 4.5e+03 54 116 .. 287 356 .. 255 360 .. 0.67
+
+ Alignments for each domain:
+ == domain 1 score: 126.4 bits; conditional E-value: 3.9e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++ +++ +ak++++e+
+ sp|A3CZM1|MURG_SHEB5 8 ILVMAGGTGGHVFPALAVAKYLAQQGWQVRwLGTADRMEARLvPQYGFDIDFIDIK-GVRGNG-LIRKLAAPFKVVRSILQAKAVIAEF 94
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+lagip++++Eqn+ipg++nkll+r a++vl
+ sp|A3CZM1|MURG_SHEB5 95 KPDVVLGMGGFASGPGGVAARLAGIPLVLHEQNAIPGMTNKLLSRIATQVL 145
+ ***********************************************9986 PP
+
+ == domain 2 score: 2.2 bits; conditional E-value: 8.1
+ -............S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHH CS
+ Glyco_transf_28 54 d............vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanv 116
+ v++ a + +++++++ + + k l + + ++++g+++ d+a++ a+ + +++ +
+ sp|A3CZM1|MURG_SHEB5 287 AvddhqtrngqvlVEAGAAFLLPQAILDVNKL-----AGKLQLLANDRTELARMGQRARDVAVLDATEQVAAVCI 356
+ 15555555555555555555566666666666.....4444455555677889************9999988765 PP
+
+>> sp|Q7U336|MURG_HAEDU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.7 0.1 1.6e-38 8.9e-36 2 138 .. 6 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.7 bits; conditional E-value: 1.6e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+a+eLq++G++++ l+t++++e+++ ++++++++ i++ +l+ k+ l+ +k ++ lka+ +a i+k+++
+ sp|Q7U336|MURG_HAEDU 6 LIMAGGTGGHVFPAIAVAQELQKQGWQICwLGTKDRMEAELvPQYNIPIEFIQIS-GLKGKG-VLALIKAPFTILKAVLQALNIIKKYR 92
+ 789****************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+l+++p++++Eqn+i+gl+n +l++ a++vl
+ sp|Q7U336|MURG_HAEDU 93 PDAVLGMGGYVSGPGGIAARLCNVPIVLHEQNAIAGLTNVWLAKIAKRVL 142
+ ***********************************************997 PP
+
+>> sp|B7VJ03|MURG_VIBSL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 128.5 0.1 8.7e-39 4.9e-36 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 128.5 bits; conditional E-value: 8.7e-39
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq++G+e+r l+t +++e+ + +++g+e+ i+++ +l+ ++ +k +k +++ +a+ +a++++k ++
+ sp|B7VJ03|MURG_VIBSL 8 LVMAGGTGGHVFPGLAVAKKLQQQGWEIRwLGTADRMEADLvPKHGIEIDFIKVK-GLRGQG-VSKLIKAPFQIINAILQARRHIKAWQ 94
+ 789*************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ +iaa+l+gip++++Eqn+++gl+n++l++ a++v+
+ sp|B7VJ03|MURG_VIBSL 95 PDVVLGMGGYVSGPGGIAAWLSGIPVVLHEQNAVAGLTNQWLSKIAKKVF 144
+ ***********************************************997 PP
+
+>> sp|Q0I1D3|MURG_HAES1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 128.2 0.1 1.1e-38 6e-36 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 128.2 bits; conditional E-value: 1.1e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+a+ Lq+++++++ l+t +++e+++ +++g++++ i++ +l+ k+ ++ lk ++ l+a+ +a++i+k+++
+ sp|Q0I1D3|MURG_HAES1 8 LVMAGGTGGHVFPAIAVAQYLQKQDWDICwLGTRDRMEAKLvPKHGIPIEFIQIS-GLRGKG-LITLLKAPFVILRAVLQARKIIKKYQ 94
+ 789****************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+l++ip++v+Eqn++ gl+n ll++ a++vl
+ sp|Q0I1D3|MURG_HAES1 95 PDVVLGMGGYVSGPGGVAAKLCNIPVVVHEQNAVLGLTNSLLAKIATRVL 144
+ ***********************************************997 PP
+
+>> sp|B5FI72|MURG_SALDC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.3 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|B5FI72|MURG_SALDC 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|B5FI72|MURG_SALDC 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|A2RJQ4|MURG_LACLM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.0 2.4e-38 1.3e-35 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.4e-38
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+A+ + L++++++ + ++t++gle+++ + ag++ ++++++ +l+++l s++++k++++++k++ +ak+i+k
+ sp|A2RJQ4|MURG_LACLM 3 IIITGGGTGGHIYPALAFLKYLKQEEPDTEvlyIGTKKGLESKIvPRAGIQLKTVDIQ-GLRRSL-SPQNIKTAYKFFKSVSDAKKIMK 89
+ 689*******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpdvv+g+ggyva+++++aa+ ++ip++++E n+ pg++n++l++++++++
+ sp|A2RJQ4|MURG_LACLM 90 DFKPDVVLGTGGYVAGPVVFAAAQLKIPTIIHEGNSFPGITNRFLAKKVDRIA 142
+ **************************************************987 PP
+
+>> sp|Q02XY0|MURG_LACLS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.0 2.4e-38 1.3e-35 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.4e-38
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+A+ + L++++++ + ++t++gle+++ + ag++ ++++++ +l+++l s++++k++++++k++ +ak+i+k
+ sp|Q02XY0|MURG_LACLS 3 IIITGGGTGGHIYPALAFLKYLKQEEPDTEvlyIGTKKGLESKIvPRAGIQLKTVDIQ-GLRRSL-SPQNIKTAYKFFKSVSDAKKIMK 89
+ 689*******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpdvv+g+ggyva+++++aa+ ++ip++++E n+ pg++n++l++++++++
+ sp|Q02XY0|MURG_LACLS 90 DFKPDVVLGTGGYVAGPVVFAAAQLKIPTIIHEGNSFPGITNRFLAKKVDRIA 142
+ **************************************************987 PP
+
+>> sp|B7MNU9|MURG_ECO81 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B7MNU9|MURG_ECO81 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B7MNU9|MURG_ECO81 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B7NHJ6|MURG_ECO7I UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B7NHJ6|MURG_ECO7I 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B7NHJ6|MURG_ECO7I 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B7UIE0|MURG_ECO27 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B7UIE0|MURG_ECO27 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B7UIE0|MURG_ECO27 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|Q0TLP9|MURG_ECOL5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|Q0TLP9|MURG_ECOL5 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|Q0TLP9|MURG_ECOL5 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|Q8FL64|MURG_ECOL6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|Q8FL64|MURG_ECOL6 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|Q8FL64|MURG_ECOL6 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|A1A7D5|MURG_ECOK1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|A1A7D5|MURG_ECOK1 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|A1A7D5|MURG_ECOK1 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B7MAL3|MURG_ECO45 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B7MAL3|MURG_ECO45 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B7MAL3|MURG_ECO45 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|Q1RGA5|MURG_ECOUT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|Q1RGA5|MURG_ECOUT 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|Q1RGA5|MURG_ECOUT 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|Q6D0I3|MURG_ERWCT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.2 0.2 2.2e-38 1.2e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.2 bits; conditional E-value: 2.2e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + l+ + + ++a+r+a++i+++++
+ sp|Q6D0I3|MURG_ERWCT 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IRAQLSAPIRIFQAVRQARAIMRRYQ 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+l+gip++++Eqngi+gl+n++l+ a++vl
+ sp|Q6D0I3|MURG_ERWCT 96 PDVVLGMGGYVSGPGGLAAWLCGIPVVLHEQNGIAGLTNRWLSHIAKKVL 145
+ **********************************************9997 PP
+
+>> sp|B5YZC6|MURG_ECO5E UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B5YZC6|MURG_ECO5E 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B5YZC6|MURG_ECO5E 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|Q8X9Y8|MURG_ECO57 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|Q8X9Y8|MURG_ECO57 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|Q8X9Y8|MURG_ECO57 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|A7ZHI1|MURG_ECO24 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|A7ZHI1|MURG_ECO24 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|A7ZHI1|MURG_ECO24 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B1LG27|MURG_ECOSM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B1LG27|MURG_ECOSM 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B1LG27|MURG_ECOSM 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B6HZ67|MURG_ECOSE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B6HZ67|MURG_ECOSE 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B6HZ67|MURG_ECOSE 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B7M133|MURG_ECO8A UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B7M133|MURG_ECO8A 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B7M133|MURG_ECO8A 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B7N7W3|MURG_ECOLU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B7N7W3|MURG_ECOLU 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B7N7W3|MURG_ECOLU 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|Q326E5|MURG_SHIBS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|Q326E5|MURG_SHIBS 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|Q326E5|MURG_SHIBS 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|Q3Z5R9|MURG_SHISS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|Q3Z5R9|MURG_SHISS 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|Q3Z5R9|MURG_SHISS 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|Q32K02|MURG_SHIDS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|Q32K02|MURG_SHIDS 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|Q32K02|MURG_SHIDS 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B2U295|MURG_SHIB3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B2U295|MURG_SHIB3 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B2U295|MURG_SHIB3 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B1IR88|MURG_ECOLC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B1IR88|MURG_ECOLC 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B1IR88|MURG_ECOLC 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B1XC67|MURG_ECODH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|B1XC67|MURG_ECODH 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B1XC67|MURG_ECODH 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|C4ZRI5|MURG_ECOBW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|C4ZRI5|MURG_ECOBW 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|C4ZRI5|MURG_ECOBW 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|P17443|MURG_ECOLI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|P17443|MURG_ECOLI 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|P17443|MURG_ECOLI 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|A7ZW42|MURG_ECOHS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.3 1.7e-38 9.4e-36 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|A7ZW42|MURG_ECOHS 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|A7ZW42|MURG_ECOHS 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|A4TQ83|MURG_YERPP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 125.8 0.3 6e-38 3.4e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+ 2 ? 2.8 0.0 5.3 3e+03 38 116 .. 266 350 .. 254 356 .] 0.56
+
+ Alignments for each domain:
+ == domain 1 score: 125.8 bits; conditional E-value: 6e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++ GT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i++ +l+ k+ ++ l+ + + ++a+r+a +i+++++
+ sp|A4TQ83|MURG_YERPP 9 MVMAAGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEASLvPQHGIEIDFIKIS-GLRGKG-LMAQLTAPIRIYRAVRQAQKIMRDYQ 95
+ 57899**************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p+vv+g+ggyv+++ ++aa+l+g+p++++Eqngi+gl+n++l+r a++vl
+ sp|A4TQ83|MURG_YERPP 96 PNVVLGMGGYVSGPGGLAAWLCGVPVVLHEQNGIAGLTNRWLARIAKKVL 145
+ ***********************************************997 PP
+
+ == domain 2 score: 2.8 bits; conditional E-value: 5.3
+ HHHHHH---EEEE----........................S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 38 eefveeagleavpigpd........................vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadl 102
+ +++v++agl+a ++ + ++ + ++ +l+++ ++++++++++ +
+ sp|A4TQ83|MURG_YERPP 266 VSEVAAAGLPAIFVPFQhkdrqqywnalplekagaakiieqP----------------QF--TATSVSSLLASWDRATLLSMAERARSV 336
+ 567899****99999998888666655433333333332222................22..334444555555555555555555555 PP
+
+ E--HHHHHHHHHHH CS
+ Glyco_transf_28 103 aliaallagipanv 116
+ a+ a+ + ++ +v
+ sp|A4TQ83|MURG_YERPP 337 AIPDATERVAAEVV 350
+ 55555555554444 PP
+
+>> sp|Q9CF92|MURG_LACLA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.1 0.0 4.7e-38 2.6e-35 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 126.1 bits; conditional E-value: 4.7e-38
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+A+ + L + +++ + ++t++gle+++ ++ag++ ++++++ +l+++l s+++lk++++++k++ +ak+i+k
+ sp|Q9CF92|MURG_LACLA 3 IIITGGGTGGHIYPALAFLKYLEKVEPDTEvlyIGTKKGLEAKIvPQAGIKLKTVDIQ-GLRRSL-SPQNLKTAYKFFKSVSDAKKIMK 89
+ 689***************************99**************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ e+kpdvv+g+ggyva+++++aa+ ++ip++++E n+ pg++n++l++++++++
+ sp|Q9CF92|MURG_LACLA 90 EFKPDVVLGTGGYVAGPVVYAAAQLKIPTIIHEGNSFPGITNRFLAKKVDRIA 142
+ **************************************************987 PP
+
+>> sp|B5R2M4|MURG_SALEP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 125.8 0.2 5.8e-38 3.2e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 125.8 bits; conditional E-value: 5.8e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+ +G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l +++ ++a+r+a++i+k++k
+ sp|B5R2M4|MURG_SALEP 9 MVMAGGTGGHVFPGLAVAHHLMSQGWQVRwLGTADRMEADLvPKHGIDIDFIRIS-GLRGKG-VKALLAAPLRIFNAWRQARAIMKRFK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n++l++ a++v+
+ sp|B5R2M4|MURG_SALEP 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNQWLAKIATTVM 145
+ *********************************************99885 PP
+
+>> sp|Q0T8A7|MURG_SHIF8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.2 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a+ L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|Q0T8A7|MURG_SHIF8 9 MVMAGGTGGHVFPGLAVAHYLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|Q0T8A7|MURG_SHIF8 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|Q83MN4|MURG_SHIFL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.2 2.3e-38 1.3e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a+ L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r+a++i+k +k
+ sp|Q83MN4|MURG_SHIFL 9 MVMAGGTGGHVFPGLAVAHYLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRQARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|Q83MN4|MURG_SHIFL 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|Q8CX35|MURG_SHEON UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 124.8 0.2 1.2e-37 6.6e-35 1 138 [. 8 145 .. 8 146 .. 0.98
+ 2 ? 3.8 0.1 2.6 1.5e+03 54 117 .. 285 357 .. 255 361 .. 0.68
+
+ Alignments for each domain:
+ == domain 1 score: 124.8 bits; conditional E-value: 1.2e-37
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++ +++ +ak++++e+
+ sp|Q8CX35|MURG_SHEON 8 ILVMAGGTGGHVFPALAVAKYLAQQGWQVRwLGTADRMEARLvPQYGFDIDFIDIK-GVRGNG-LVRKLAAPFKVVRSILQAKAVIAEF 94
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+lag+p++++Eqn+ipg++nkll+r a +vl
+ sp|Q8CX35|MURG_SHEON 95 KPDVVLGMGGFASGPGGVAAKLAGVPLVLHEQNAIPGMTNKLLSRIASQVL 145
+ *********************************************999886 PP
+
+ == domain 2 score: 3.8 bits; conditional E-value: 2.6
+ -..............S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHH CS
+ Glyco_transf_28 54 d..............vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanva 117
+ v++ a + +++++++ + + ++l++++ + ++++g+++ d+a++ a+ + +++ +a
+ sp|Q8CX35|MURG_SHEON 285 PhavddhqtrnaqvlVEAGAAFLLPQAILDVNKL----VSKLQLLANDR-AELARMGQRARDVAVLDATEQVAQVCIA 357
+ 3446666666666665666666677777777777....44445555555.6678***************999998876 PP
+
+>> sp|B8DBP8|MURG_LISMH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.6 0.0 1.7e-38 9.4e-36 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 127.6 bits; conditional E-value: 1.7e-38
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+v+Pa+Al reL++ +e + ++t++gle+ + + +g+++++i++ +++++l sl+++k++ ++l + +k+k+il+
+ sp|B8DBP8|MURG_LISMH 3 VAISGGGTGGHVYPALALIRELKKVHPEAEflyIGTEKGLEAGIvKREGIPFEAIEIT-GFKRSL-SLENIKTVMRFLSGAKKSKQILR 89
+ 6899******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpdvv+g+ggyv +++++aa++++ip+ ++Eqn+++gl+nk+l+r+ ++v+
+ sp|B8DBP8|MURG_LISMH 90 DFKPDVVIGTGGYVCGPVVYAAAKLKIPTLIHEQNSVAGLTNKFLSRYTDKVA 142
+ **************************************************997 PP
+
+>> sp|A0AKD5|MURG_LISW6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.4 0.0 1.9e-38 1.1e-35 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 127.4 bits; conditional E-value: 1.9e-38
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+v+Pa+A+ reL++ +e + ++t++gle+ + + +g+++++i++ +++++l sl+++k++ ++l + +k+k+il+
+ sp|A0AKD5|MURG_LISW6 3 VAISGGGTGGHVYPALAFIRELKKLHPEAEflyIGTEKGLEADIvKREGIPFESIEIT-GFKRSL-SLENVKTIMRFLSGAKKSKQILR 89
+ 6899******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpdvv+g+ggyv +++++aa++++ip+ ++Eqn+++gl+nk+l+r+ ++v+
+ sp|A0AKD5|MURG_LISW6 90 DFKPDVVIGTGGYVCGPVVYAAAKLKIPTLIHEQNSVAGLTNKFLSRYTDKVA 142
+ **************************************************997 PP
+
+>> sp|Q9ZBA5|MURG_STRCO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 1.0 2.3e-38 1.3e-35 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G++ePa+Ala++L+r+++ V l+t++gle+++ +e+g+e i++ +l++k +++ ++ + + + +++++++il+
+ sp|Q9ZBA5|MURG_STRCO 3 VVLAGGGTAGHIEPALALADALRRQDPTVGitaLGTERGLETRLvPERGYELALIPAV-PLPRKP-TPELITVPGRLRGTIKATEQILE 89
+ 79****************************9***************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + k+d+v+gfggyva++a++aa+++g+p++v+E+n++pgl+nk+ +r+a +v+
+ sp|Q9ZBA5|MURG_STRCO 90 RTKADAVAGFGGYVALPAYLAAKRLGVPIVVHEANARPGLANKIGSRYAAQVA 142
+ *************************************************9987 PP
+
+>> sp|Q929Y2|MURG_LISIN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.3 0.0 2.1e-38 1.2e-35 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 127.3 bits; conditional E-value: 2.1e-38
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+v+Pa+A+ reL++ +e + ++t++gle+ + + +g+++++i++ +++++l sl+++k++ ++l + +k+k+il+
+ sp|Q929Y2|MURG_LISIN 3 VAISGGGTGGHVYPALAFIRELKKVHPEAEflyIGTEKGLEAGIvKREGIPFESIEIT-GFKRSL-SLENIKTVMRFLSGAKKSKQILR 89
+ 6899******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ e+kpdvv+g+ggyv +++++aa++++ip+ ++Eqn+i+gl+nk+l+r+ ++v+
+ sp|Q929Y2|MURG_LISIN 90 EFKPDVVIGTGGYVCGPVVYAAAKLKIPTLIHEQNSIAGLTNKFLSRYTDKVA 142
+ **************************************************997 PP
+
+>> sp|B8F3B6|MURG_HAEPS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.3 0.1 2.1e-38 1.2e-35 2 137 .. 6 141 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.3 bits; conditional E-value: 2.1e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+ reLq++G+e+r l+t++++e+ + +++g++++ i++ +l+ k+ + l+ +++ l+a+ +ak+i+ +k
+ sp|B8F3B6|MURG_HAEPS 6 LVMAGGTGGHVFPAIAVVRELQQQGWEIRwLGTKDRMEADLvPKHGIPIEFIQIS-GLKGKG-IKALLTAPFAILRAVLQAKKIINAYK 92
+ 789*************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pd+v+g+ggyv+++ +iaa+l+g+p++++Eqn++ gl+n +l++ a +
+ sp|B8F3B6|MURG_HAEPS 93 PDAVLGMGGYVSGPGGIAAKLCGVPVILHEQNAVVGLTNVWLSKIARRT 141
+ *******************************************999876 PP
+
+>> sp|Q0HE83|MURG_SHESM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.0 0.2 2.5e-38 1.4e-35 1 138 [. 8 145 .. 8 146 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 127.0 bits; conditional E-value: 2.5e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++ +++ +ak++++e+
+ sp|Q0HE83|MURG_SHESM 8 ILVMAGGTGGHVFPALAVAKYLAQQGWQVRwLGTADRMEARLvPQYGFDIDFIDIK-GVRGNG-LVRKLAAPFKVVRSILQAKAVIAEF 94
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+lag+p++++Eqn+ipg++nkll+r an+vl
+ sp|Q0HE83|MURG_SHESM 95 KPDVVLGMGGFASGPGGVAAKLAGVPLVLHEQNAIPGMTNKLLSRIANQVL 145
+ ************************************************986 PP
+
+>> sp|C1KWY8|MURG_LISMC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.2 0.0 2.2e-38 1.3e-35 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 127.2 bits; conditional E-value: 2.2e-38
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+v+Pa+Al reL++ +e + ++t++gle+ + + +g+++++i++ +++++l sl+++k++ ++l + +k+k+il+
+ sp|C1KWY8|MURG_LISMC 3 VAISGGGTGGHVYPALALIRELKKIHPEAEflyIGTEKGLEAGIvKREGIPFEAIEIT-GFKRSL-SLENIKTVMRFLSGAKKSKQILR 89
+ 6899******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpdvv+g+ggyv +++++aa++++ip+ ++Eqn+++gl+nk+l+r+ ++v+
+ sp|C1KWY8|MURG_LISMC 90 DFKPDVVIGTGGYVCGPVVYAAAKLKIPTLIHEQNSVAGLTNKFLSRYTDKVA 142
+ **************************************************997 PP
+
+>> sp|Q71XX8|MURG_LISMF UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.2 0.0 2.2e-38 1.3e-35 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 127.2 bits; conditional E-value: 2.2e-38
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+v+Pa+Al reL++ +e + ++t++gle+ + + +g+++++i++ +++++l sl+++k++ ++l + +k+k+il+
+ sp|Q71XX8|MURG_LISMF 3 VAISGGGTGGHVYPALALIRELKKIHPEAEflyIGTEKGLEAGIvKREGIPFEAIEIT-GFKRSL-SLENIKTVMRFLSGAKKSKQILR 89
+ 6899******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpdvv+g+ggyv +++++aa++++ip+ ++Eqn+++gl+nk+l+r+ ++v+
+ sp|Q71XX8|MURG_LISMF 90 DFKPDVVIGTGGYVCGPVVYAAAKLKIPTLIHEQNSVAGLTNKFLSRYTDKVA 142
+ **************************************************997 PP
+
+>> sp|A1S2F9|MURG_SHEAM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 127.1 0.1 2.3e-38 1.3e-35 2 138 .. 10 146 .. 9 147 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 127.1 bits; conditional E-value: 2.3e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+ar+L +G+++r l+t +++e+++ +++g ++ i+++ +++ ++ l++l ++++l+++ +a+++++e+k
+ sp|A1S2F9|MURG_SHEAM 10 LVMAGGTGGHVFPALAVARRLASEGWQIRwLGTADRMEARLvPQHGFDIDFIDIQ-GVRGNG-LLRKLAAPFKVLRSVMQARKVIREFK 96
+ 789****************************************************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+gg+++++ ++aa+l+gip++++Eqn+ipg++nkll+r a++vl
+ sp|A1S2F9|MURG_SHEAM 97 PDVVLGMGGFASGPGGVAAKLCGIPLVLHEQNAIPGMTNKLLSRIATRVL 146
+ ***********************************************997 PP
+
+>> sp|A5UCW8|MURG_HAEIE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.5 0.0 3.5e-38 2e-35 2 137 .. 7 142 .. 6 144 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 126.5 bits; conditional E-value: 3.5e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+a++Lq+++++++ l+t++++e+++ +++ ++++ i++ +l+ k+ + + +++ ++a+ +ak+i++e+k
+ sp|A5UCW8|MURG_HAEIE 7 LVMAGGTGGHVFPAIAVAQTLQKQEWDICwLGTKDRMEAQLvPKYDIPIRFIQIS-GLRGKG-IKALFNAPFAIFRAVLQAKKIIQEEK 93
+ 789****************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pd+v+g+ggyv+++a++aa+l+g+p++++Eqn+i+gl+nkll + a v
+ sp|A5UCW8|MURG_HAEIE 94 PDAVLGMGGYVSGPAGVAAKLCGVPIILHEQNAIAGLTNKLLGKIASCV 142
+ *****************************************99988776 PP
+
+>> sp|Q03QH5|MURG_LACBA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 120.9 0.1 1.9e-36 1.1e-33 2 138 .. 4 142 .. 3 143 .. 0.97
+ 2 ? 4.5 0.0 1.6 8.8e+02 63 130 .. 295 355 .. 267 358 .. 0.70
+
+ Alignments for each domain:
+ == domain 1 score: 120.9 bits; conditional E-value: 1.9e-36
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++ggGT+G+++Pa+Al ++L++r+++ +++++gle+++ +++g+++++ ++ +++++l sl+++k+++ +lk++++ak+ +++
+ sp|Q03QH5|MURG_LACBA 4 MVSGGGTGGHIYPALALIKALKKREPNSAvmyVGSERGLESTIvPAKGIPFQATRIQ-GFKRSL-SLENFKTVYLFLKSVHEAKKMIRQ 90
+ 5899**********************977779*************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpdvvvg+ggyv++++++aa+++++p+ ++Eqn++ g++n++l+r++++++
+ sp|Q03QH5|MURG_LACBA 91 FKPDVVVGTGGYVSGAVVYAAARLHVPTLIHEQNSVVGITNRFLSRYVDRIA 142
+ *************************************************986 PP
+
+ == domain 2 score: 4.5 bits; conditional E-value: 1.6
+ -HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 63 slktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ + k+ +la + a ei+kea d++ ++ ad+++++++l++ a q+g+p++++++l
+ sp|Q03QH5|MURG_LACBA 295 QTKNANSLATV-----GAAEIIKEA--DLTGETLIAKADQLMTNDALRQDMATASKQLGVPDAADRVL 355
+ 44445555554.....445555554..4777788889**************************99987 PP
+
+>> sp|Q8DEL0|MURG_VIBVU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.4 0.2 3.9e-38 2.2e-35 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 126.4 bits; conditional E-value: 3.9e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq++G+e+r l+t +++e+++ +++g+++ i+++ +l+ ++ + ++ +++ l+a+++ak+++k+++
+ sp|Q8DEL0|MURG_VIBVU 8 MVMAGGTGGHVFPGLAVAKKLQQQGWEIRwLGTADRMEAELvPKHGIDIDFIKVK-GLRGQG-IKRLVLAPFQILNAIFQAKAHIKRWQ 94
+ 5899***************************************************.*****9.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+l+gip++++Eqn+++gl+n++l++ a++v+
+ sp|Q8DEL0|MURG_VIBVU 95 PDAVLGMGGYVSGPGGIAAWLSGIPVVLHEQNAVAGLTNHWLAKIAKKVF 144
+ ***********************************************996 PP
+
+>> sp|Q7MNV1|MURG_VIBVY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.4 0.2 3.9e-38 2.2e-35 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 126.4 bits; conditional E-value: 3.9e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq++G+e+r l+t +++e+++ +++g+++ i+++ +l+ ++ + ++ +++ l+a+++ak+++k+++
+ sp|Q7MNV1|MURG_VIBVY 8 MVMAGGTGGHVFPGLAVAKKLQQQGWEIRwLGTADRMEAELvPKHGIDIDFIKVK-GLRGQG-IKRLVLAPFQILNAIFQAKAHIKRWQ 94
+ 5899***************************************************.*****9.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+l+gip++++Eqn+++gl+n++l++ a++v+
+ sp|Q7MNV1|MURG_VIBVY 95 PDAVLGMGGYVSGPGGIAAWLSGIPVVLHEQNAVAGLTNHWLAKIAKKVF 144
+ ***********************************************996 PP
+
+>> sp|Q3IFY0|MURG_PSEHT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.2 0.1 4.4e-38 2.5e-35 1 138 [. 5 142 .. 5 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 126.2 bits; conditional E-value: 4.4e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +v+++gGT+G+++P +A+a+ L+++G++V ++tp+++e++v +++++++ i+++ +++ ++ + +k ++ +l+a+ +a+++lk++
+ sp|Q3IFY0|MURG_PSEHT 5 CVVVAGGTGGHIFPGIAVADYLKQQGWQVSwIGTPDRMEATVvPKHNIDINFINVK-GVRGNG-IKRLIKAPFMVLNAILQARKVLKSE 91
+ 6999****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+++ggyv ++ +iaa+++gip++++Eqn+i+g++nk+l+++an+vl
+ sp|Q3IFY0|MURG_PSEHT 92 KPDVVLAMGGYVTGPTGIAAKSLGIPLVIHEQNAIAGMSNKWLAKFANRVL 142
+ *************************************************97 PP
+
+>> sp|B7LFW0|MURG_ECO55 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 125.6 0.4 6.7e-38 3.8e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 125.6 bits; conditional E-value: 6.7e-38
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+e+ i + +l+ k+ + + +++ ++a+r a++i+k +k
+ sp|B7LFW0|MURG_ECO55 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTADRMEADLvPKHGIEIDFIRIS-GLRGKG-IKALIAAPLRIFNAWRHARAIMKAYK 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+nk+l++ a++v+
+ sp|B7LFW0|MURG_ECO55 96 PDVVLGMGGYVSGPGGLAAWSLGIPVVLHEQNGIAGLTNKWLAKIATKVM 145
+ ***********************************************986 PP
+
+>> sp|B1KKX7|MURG_SHEWM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 126.3 0.1 4.2e-38 2.4e-35 1 138 [. 10 147 .. 10 148 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 126.3 bits; conditional E-value: 4.2e-38
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l ++++l+++ +a+ ++ke+
+ sp|B1KKX7|MURG_SHEWM 10 ILIMAGGTGGHVFPALAVAKYLSKQGWKVRwLGTAERMEARLvPQHGFDIDFIDIK-GVRGNG-VVRKLAAPFKVLRSITQARVVIKEF 96
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pdvv+g+gg+++++ ++aa+l+gip++++Eqn+ipg++nk+l+r a +vl
+ sp|B1KKX7|MURG_SHEWM 97 QPDVVLGMGGFASGPGGVAARLSGIPLVLHEQNAIPGMTNKILSRIASQVL 147
+ *********************************************999886 PP
+
+>> sp|Q49929|Y2348_MYCLE Uncharacterized glycosyltransferase ML2348 OS=Mycobacterium leprae GN=ML2348 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 125.5 0.1 7.4e-38 4.2e-35 1 138 [. 3 141 .. 3 142 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 125.5 bits; conditional E-value: 7.4e-38
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.............................S---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.............................vklwa 59
+ ++la+ G+rGdveP++Al+ eLqrrGheVr+++pp++ +fve+agl+av++gpd ++wa
+ sp|Q49929|Y2348_MYCLE 3 FTLAASGSRGDVEPFAALGLELQRRGHEVRIGVPPDMLRFVESAGLAAVAYGPDtqeflardtysqwrqwwkilppikalqqlRQAWA 90
+ 78*************************************************************8888888888888888888888888 PP
+
+ --.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 60 kleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ + lk+la+g adl++++ ++g++anvaE++gip+ v++++p r+ng++
+ sp|Q49929|Y2348_MYCLE 91 --DMATDLKSLADG--------------------------ADLVMTGVVYQGVVANVAEYYGIPFGVLHFVPARVNGKI 141
+ ..788888888888..........................************************************987 PP
+
+>> sp|Q7N147|MURG_PHOLL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 124.3 0.2 1.7e-37 9.4e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 124.3 bits; conditional E-value: 1.7e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++V l+t +++e+ + +++g++++ i++ +l+ k+ + l + + +ka+r+ak+i+++++
+ sp|Q7N147|MURG_PHOLL 9 MVMAGGTGGHVFPGLAVAHHLKDQGWDVLwLGTADRMEADLvPKHGIDIEFIQIS-GLRGKG-IKALLAAPVRIFKAIRQAKAIMRRYQ 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ +iaa+ +g+p++++Eqngi+gl+n++l++ a++vl
+ sp|Q7N147|MURG_PHOLL 96 PDVVLGMGGYVSGPGGIAAWMCGVPVVLHEQNGIAGLTNRWLAKIATTVL 145
+ **********************************************9986 PP
+
+>> sp|A8H984|MURG_SHEPA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 124.6 0.1 1.4e-37 7.8e-35 1 138 [. 10 147 .. 10 148 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 124.6 bits; conditional E-value: 1.4e-37
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l +++ l+++ +a++++k++
+ sp|A8H984|MURG_SHEPA 10 ILIMAGGTGGHVFPALAVAKYLSQQGWKVRwLGTAERMEARLvPQHGFDIDFIDIK-GVRGNG-LMRKLAAPFKILRSVMQARAVIKSF 96
+ 689*****************************************************.****99.9************************ PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+l+gip++++Eqn+ipg++n+ll+r a vl
+ sp|A8H984|MURG_SHEPA 97 KPDVVMGMGGFASGPGGVAAKLSGIPLVLHEQNAIPGMTNRLLSRIASEVL 147
+ *********************************************998875 PP
+
+>> sp|Q820F6|MURG_STRAW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 125.0 0.7 1e-37 5.7e-35 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 125.0 bits; conditional E-value: 1e-37
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G++ePa+Ala++L+r+++ V l+t++gle+++ +e+g++ i++ +l++k +++ ++ + + + ++++a++il+
+ sp|Q820F6|MURG_STRAW 3 VVLAGGGTAGHIEPALALADALRRQDPTVGitaLGTERGLETRLvPERGYDLALIPAV-PLPRKP-TPELITVPGRLRGTIKAAEQILE 89
+ 79****************************9***************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + k+d+vvgfggyva++ ++aa+++g+p++++E+n++pgl+nk+ +r+a +v+
+ sp|Q820F6|MURG_STRAW 90 RTKADAVVGFGGYVALPGYLAAKRLGVPIVIHEANARPGLANKIGSRYAAQVA 142
+ *************************************************9987 PP
+
+>> sp|Q1WTA0|MURG_LACS1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 123.3 0.0 3.4e-37 1.9e-34 2 138 .. 4 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 123.3 bits; conditional E-value: 3.4e-37
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++ggGT+G+++Pa+Al ++ ++++++ + ++t++gle+++ ++ag++ ++i+++ +++++l sl+++k+++ +lk++++ k+i+++
+ sp|Q1WTA0|MURG_LACS1 4 LISGGGTGGHIYPALALIEAIKQKEPDSEilyVGTHKGLESRIvPSAGVPLKTIKIQ-GFKRSL-SLENFKTVYLFLKSVHDCKKIIRD 90
+ 789*************************999**************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpdvvvg+ggyv +++++aa++ +ip++v+Eqn+++g++nk+l+r++++v
+ sp|Q1WTA0|MURG_LACS1 91 FKPDVVVGTGGYVCGAVVYAAARMKIPTFVHEQNSVAGVTNKFLSRFVDKVG 142
+ *************************************************986 PP
+
+>> sp|Q9X4H4|MURG_STRCU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 124.6 0.5 1.4e-37 7.7e-35 1 137 [. 3 141 .. 3 142 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 124.6 bits; conditional E-value: 1.4e-37
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G++ePa+Ala++L+r+++ V l+t++gle+++ +e+g+e i++ +l++k +++ ++ + + + ++++a++il+
+ sp|Q9X4H4|MURG_STRCU 3 VVLAGGGTAGHIEPALALADALRRQDPTVGitaLGTERGLETRLvPERGYELALIPAV-PLPRKP-TPELITVPGRLRGTIKAAEQILE 89
+ 79****************************9***************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ + k+d vvgfggyva++ ++aa+++g+p++++E+n++pgl+nk+ +r+a +v
+ sp|Q9X4H4|MURG_STRCU 90 RTKADCVVGFGGYVALPGYLAAKRLGVPIVIHEANARPGLANKIGSRYAARV 141
+ *************************************************998 PP
+
+>> sp|Q12SC6|MURG_SHEDO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 124.7 0.2 1.3e-37 7.1e-35 1 138 [. 10 147 .. 10 148 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 124.7 bits; conditional E-value: 1.3e-37
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ l+tl +++ +++ +a+e+++e+
+ sp|Q12SC6|MURG_SHEDO 10 ILIMAGGTGGHVFPALAVAKNLAEKGWQVRwLGTADRMEARLvPQHGFDIDFIDIQ-GVRGNG-LLRTLAAPFKIMRSIMQAREVIAEF 96
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kp+v++g+gg+++++ ++a +lagip++++Eqn+ipg++nkll+r a++vl
+ sp|Q12SC6|MURG_SHEDO 97 KPQVILGMGGFASGPGGVAGRLAGIPLVLHEQNAIPGMTNKLLARIATKVL 147
+ ************************************************997 PP
+
+>> sp|P57817|MURG_PASMU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 125.0 0.2 1.1e-37 6e-35 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 125.0 bits; conditional E-value: 1.1e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+a+ Lq++G++++ l+t +++e+++ ++++++++ i++ +l+ k+ + l+ +++ ++a+ +a++i+k ++
+ sp|P57817|MURG_PASMU 9 LVMAGGTGGHVFPAIAVAQYLQQQGWDICwLGTADRMEAQLvPKHHIPIQFIQIS-GLRGKG-IKALLSAPFSIFRAILQARKIIKAYQ 95
+ 789****************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p++v+g+ggyv+++ +iaa+l+gip++++Eqn+++gl+n +l++ a +vl
+ sp|P57817|MURG_PASMU 96 PHAVLGMGGYVSGPGGIAAKLCGIPVILHEQNAVAGLTNSWLAKIARRVL 145
+ *********************************************99986 PP
+
+>> sp|Q87SG4|MURG_VIBPA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 124.2 0.2 1.9e-37 1.1e-34 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 124.2 bits; conditional E-value: 1.9e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq++G+e+r l+t +++e+ + +++g+e+ i+++ +l+ ++ + l +++ +a+ +a++++k+++
+ sp|Q87SG4|MURG_VIBPA 8 MVMAGGTGGHVFPGLAVAKQLQEQGWEIRwLGTADRMEADLvPKHGIEIDFIKVK-GLRGQG-VKRLLAAPFQIINAIMQARAHMKRWQ 94
+ 5899************************************99*************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+l+gip++++Eqn+++gl+n++l++ a++v+
+ sp|Q87SG4|MURG_VIBPA 95 PDAVLGMGGYVSGPGGIAAWLSGIPVVLHEQNAVAGLTNQWLSKIAKKVF 144
+ ***********************************************997 PP
+
+>> sp|B0TQN7|MURG_SHEHH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 123.7 0.1 2.5e-37 1.4e-34 1 138 [. 10 147 .. 10 148 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 123.7 bits; conditional E-value: 2.5e-37
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ +++l +++ +++ +a++++k++
+ sp|B0TQN7|MURG_SHEHH 10 ILIMAGGTGGHVFPALAVAKYLSQQGWKVRwLGTAERMEARLvPQHGFDIDFIDIK-GVRGNG-LMRKLAAPFKIIRSVMQARAVIKKF 96
+ 689*****************************************************.****99.99*********************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kp+vv+g+gg+++++ ++aa+l+gip++++Eqn+ipg++n+ll+r a vl
+ sp|B0TQN7|MURG_SHEHH 97 KPHVVMGMGGFASGPGGVAAKLSGIPLVLHEQNAIPGMTNRLLSRIASEVL 147
+ *********************************************998875 PP
+
+>> sp|C4L5U5|MURG_EXISA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 123.5 0.0 3e-37 1.7e-34 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 123.5 bits; conditional E-value: 3e-37
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+Al ++L++r ++ ++t++gle+ + + ag+++++i++ +l+++l sl+++k+++ +lka+r++k+ ++
+ sp|C4L5U5|MURG_EXISA 3 IMISGGGTGGHIYPALALIETLKKRHPDLQvqyIGTENGLEADLvPRAGVPFKSIQIA-GLKRSL-SLENVKTAYWFLKAVRALKKDMA 89
+ 6799***********************99888***********99*************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpdvv+g+gg+v++++++ a +gip++++Eqn+ipgl+nk+l+++a++v+
+ sp|C4L5U5|MURG_EXISA 90 AFKPDVVIGTGGFVSGPVVYTAQQLGIPTILHEQNSIPGLTNKFLSKKADRVA 142
+ **************************************************997 PP
+
+>> sp|A9M2H3|MURG_NEIM0 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 124.0 0.1 2.1e-37 1.2e-34 1 138 [. 6 143 .. 6 144 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 124.0 bits; conditional E-value: 2.1e-37
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++l++gGT+G+++Pa+A+a+ L++rGh+V+ l++++ +ee++ +++g+ ++++++ +++ ++ ++l+ ++ ++++r+a +i++++
+ sp|A9M2H3|MURG_NEIM0 6 FMLMAGGTGGHIFPALAVADSLRARGHHVIwLGSKDSMEERIvPQYGIRLETLAIK-GVRGNG-IKRKLMLPFTLYQTVREAQRIIRKH 92
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + v+gfgg+v + ++aa+l+g+p++++Eqn+++gl+n++l+r+a++vl
+ sp|A9M2H3|MURG_NEIM0 93 RVECVIGFGGFVTFPGGLAAKLLGVPIVIHEQNAVAGLSNRHLSRWAKRVL 143
+ *************************************************97 PP
+
+>> sp|Q6LMF6|MURG_PHOPR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 124.1 0.2 2e-37 1.1e-34 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 124.1 bits; conditional E-value: 2e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq++G+e+r l+t +++e+ + +++g+e+ i+++ +l+ ++ +++l +++ a+ +a++ +k ++
+ sp|Q6LMF6|MURG_PHOPR 8 LVMAGGTGGHVFPGLAVAKKLQQEGWEIRwLGTADRMEADLvPKHGIEIDFIKVK-GLRGQG-IIRMLAAPFKIVGAILQARKYIKAWQ 94
+ 789*************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ +iaa+l+g+p++++Eqn+++gl+n++l+r a +vl
+ sp|Q6LMF6|MURG_PHOPR 95 PDVVLGMGGYVSGPGGIAAWLSGVPVVLHEQNAVAGLTNQWLSRIAAKVL 144
+ **********************************************9986 PP
+
+>> sp|Q5E2Q0|MURG_VIBF1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 123.5 0.1 3.1e-37 1.7e-34 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 123.5 bits; conditional E-value: 3.1e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq +G+e+r l+t +++e+ + +++g+e+ i+++ +l+ ++ k + +++ l a+ +ak+++k ++
+ sp|Q5E2Q0|MURG_VIBF1 9 LVMAGGTGGHVFPGLAVAKQLQSEGWEIRwLGTADRMEADLvPKHGIEIDFIKVK-GLRGQG-LKKLIAAPFQILGAISQAKKHIKAWQ 95
+ 789*************************************99*************.****99.9999********************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ +iaa+l+gip++++Eqn+++gl+n++l++ a++v+
+ sp|Q5E2Q0|MURG_VIBF1 96 PDVVLGMGGYVSGPGGIAAWLSGIPVVLHEQNAVAGLTNQWLSKIAKRVF 145
+ ***********************************************997 PP
+
+>> sp|P64865|Y1524_MYCTU Uncharacterized glycosyltransferase Rv1524/MT1575 OS=Mycobacterium tuberculosis GN=Rv1524 PE=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 123.6 0.2 2.8e-37 1.6e-34 1 138 [. 3 143 .. 3 144 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 123.6 bits; conditional E-value: 2.8e-37
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----................S------.-HHHCCSHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd................vklwakleslktlkelae 72
+ +v+a++GTrGd+eP++A++ eLqrrGh+V+la+pp+l fve+agl+av++g++ + +++ l++
+ sp|P64865|Y1524_MYCTU 3 FVVASYGTRGDIEPCAAVGLELQRRGHDVCLAVPPNLIGFVETAGLSAVAYGSRdsqeqldeqflhnawkL---------QNPIKLLR 81
+ 89****************************************************99988887654444440.........44444444 PP
+
+ HHHHHHHHHHHHHHHHHH.HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 73 glkalrkakeilkeakpd.vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + a+ ++e ++e ++ ++v++g adl+l+++++++++anvaE++gip+++++++p rang++
+ sp|P64865|Y1524_MYCTU 82 E--AMAPVTEGWAELSAMlTPVAAG---ADLLLTGQIYQEVVANVAEHHGIPLAALHFYPVRANGEI 143
+ 4..4444555555544331334444...************************************986 PP
+
+>> sp|P64866|Y1551_MYCBO Uncharacterized glycosyltransferase Mb1551 OS=Mycobacterium bovis GN=Mb1551 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 123.6 0.2 2.8e-37 1.6e-34 1 138 [. 3 143 .. 3 144 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 123.6 bits; conditional E-value: 2.8e-37
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----................S------.-HHHCCSHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd................vklwakleslktlkelae 72
+ +v+a++GTrGd+eP++A++ eLqrrGh+V+la+pp+l fve+agl+av++g++ + +++ l++
+ sp|P64866|Y1551_MYCBO 3 FVVASYGTRGDIEPCAAVGLELQRRGHDVCLAVPPNLIGFVETAGLSAVAYGSRdsqeqldeqflhnawkL---------QNPIKLLR 81
+ 89****************************************************99988887654444440.........44444444 PP
+
+ HHHHHHHHHHHHHHHHHH.HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 73 glkalrkakeilkeakpd.vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + a+ ++e ++e ++ ++v++g adl+l+++++++++anvaE++gip+++++++p rang++
+ sp|P64866|Y1551_MYCBO 82 E--AMAPVTEGWAELSAMlTPVAAG---ADLLLTGQIYQEVVANVAEHHGIPLAALHFYPVRANGEI 143
+ 4..4444555555544331334444...************************************986 PP
+
+>> sp|B5FB35|MURG_VIBFM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 123.5 0.1 3.1e-37 1.7e-34 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 123.5 bits; conditional E-value: 3.1e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq +G+e+r l+t +++e+ + +++g+e+ i+++ +l+ ++ k + +++ l a+ +ak+++k ++
+ sp|B5FB35|MURG_VIBFM 9 LVMAGGTGGHVFPGLAVAKQLQSEGWEIRwLGTADRMEADLvPKHGIEIDFIKVK-GLRGQG-LKKLIAAPFQILGAISQAKKHIKAWQ 95
+ 789*************************************99*************.****99.9999********************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ +iaa+l+gip++++Eqn+++gl+n++l++ a++v+
+ sp|B5FB35|MURG_VIBFM 96 PDVVLGMGGYVSGPGGIAAWLSGIPVVLHEQNAVAGLTNQWLSKIAKRVF 145
+ ***********************************************997 PP
+
+>> sp|B2GB78|MURG_LACF3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 119.7 0.2 4.4e-36 2.5e-33 2 138 .. 4 142 .. 3 143 .. 0.98
+ 2 ? 2.1 0.0 9 5.1e+03 72 114 .. 201 243 .. 186 252 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 119.7 bits; conditional E-value: 4.4e-36
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++ggGT+G+++Pa+Al ++L++ +++ + +++++gle+++ ++ag+ ++ +++ +++++l sl+++k+++ +lka+ +ak+++k+
+ sp|B2GB78|MURG_LACF3 4 MVSGGGTGGHIYPALALIERLKQVEPDTEvlyVGAKRGLETKIvPQAGYRLETMEVQ-GFRRSL-SLENVKTVYLFLKAVAQAKKLIKD 90
+ 5899*************************99**************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++pdvv+g+ggyv++++l+aa+++g+p++++Eqn++ g++nk+l+r++n v+
+ sp|B2GB78|MURG_LACF3 91 FRPDVVLGTGGYVSGAVLYAAAKLGVPTVIHEQNSVVGVTNKFLARYVNEVA 142
+ *************************************************997 PP
+
+ == domain 2 score: 2.1 bits; conditional E-value: 9
+ HHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHH CS
+ Glyco_transf_28 72 eglkalrkakeilkeakpdvvvgfggyvadlaliaallagipa 114
+ + +ka+ +a ++ e+ +v++++g d++++a + + i
+ sp|B2GB78|MURG_LACF3 201 RINKAVVEALPSFNEQPYQVIFATGRKRYDDVMGALAGQPIGD 243
+ 567889999999**********************998776655 PP
+
+>> sp|B6ELH5|MURG_ALISL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 123.3 0.1 3.6e-37 2e-34 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 123.3 bits; conditional E-value: 3.6e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq +G+e+r l+t++++e+ + +++g+e+ i+++ +l+ ++ k l +++ a+ +ak++++ ++
+ sp|B6ELH5|MURG_ALISL 9 LVMAGGTGGHVFPGLAVAKQLQSEGWEIRwLGTEDRMEADLvPKHGIEIDFIKVK-GLRGQG-LKKLLIAPFQIIGAILQAKKHIQAWQ 95
+ 789*************************************99*************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv+++ +iaa+l+gip++++Eqn+++gl+n++l++ a++v+
+ sp|B6ELH5|MURG_ALISL 96 PDVVLGMGGYVSGPGGIAAWLSGIPVVLHEQNAVAGLTNQWLSKIAKRVF 145
+ ***********************************************997 PP
+
+>> sp|B8CWJ6|MURG_HALOH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 123.0 0.0 4.3e-37 2.4e-34 2 138 .. 4 140 .. 3 141 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 123.0 bits; conditional E-value: 4.3e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ v++ggGT+G+++Pa+Ala+ ++++G e+ +++ +gle+++ +e+g +++ i++ +++++l s++ +++l++ ++++ +a+++l+++k
+ sp|B8CWJ6|MURG_HALOH 4 VFTGGGTGGHIYPALALAESFRKKGDEILyIGSNDGLERRIvPEEGFDFQGIEVA-PFPRNL-SVHLFSSLLKTGRGFIQARKLLRKFK 90
+ 89*****************************************************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+gg+v++++++aa+l++ip++++Eqn+ pgl+n+ll+ ++++++
+ sp|B8CWJ6|MURG_HALOH 91 PDVVIGTGGFVSGPVVLAAALQKIPTVIHEQNAYPGLANRLLAPFVTRIA 140
+ *********************************************99986 PP
+
+>> sp|A7MXR6|MURG_VIBHB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 123.1 0.2 4e-37 2.3e-34 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 123.1 bits; conditional E-value: 4e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq++G+e+r l+t +++e+ + +++g+e+ i+++ +l+ ++ + l +++ +a+ +a++++k+++
+ sp|A7MXR6|MURG_VIBHB 8 MVMAGGTGGHVFPGLAVAKQLQEQGWEIRwLGTADRMEADLvPKHGIEIDFIKVK-GLRGQG-VKRLLAAPFQIINAIMQARAHMKRWQ 94
+ 5899************************************99*************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+ +gip++++Eqn+++gl+n++l++ a++v+
+ sp|A7MXR6|MURG_VIBHB 95 PDAVLGMGGYVSGPGGIAAWMSGIPVVLHEQNAVAGLTNQWLSKIAKKVF 144
+ ***********************************************997 PP
+
+>> sp|A5VJ33|MURG_LACRD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 119.3 0.0 5.8e-36 3.3e-33 2 138 .. 4 142 .. 3 143 .. 0.98
+ 2 ? 2.7 0.0 5.7 3.2e+03 64 129 .. 299 357 .. 237 360 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 119.3 bits; conditional E-value: 5.8e-36
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++ggGT+G+++Pa+Al ++L++ +++ + ++t++gle+++ + ag+e ++ + +++++l sl+++k+++ +l++++ ak+i++e
+ sp|A5VJ33|MURG_LACRD 4 LVSGGGTGGHIYPALALIERLKQVEPDTEvlyVGTTRGLENKIvPDAGIELETMHMQ-GFKRSL-SLENFKTIYLFLNSVHHAKKIISE 90
+ 789**************************99**************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpdvv+g+ggyv++++l+aa++ +ip++++Eqn++ g++nk+l+r++++++
+ sp|A5VJ33|MURG_LACRD 91 FKPDVVLGTGGYVSGAVLYAAAKKHIPTVIHEQNSVVGVTNKFLSRYVDQIA 142
+ ************************************************9986 PP
+
+ == domain 2 score: 2.7 bits; conditional E-value: 5.7
+ HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEES CS
+ Glyco_transf_28 64 lktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkl 129
+ +k+ l k ++ l ++++++++ +ad ++ ++ a+ aE+ g+p+++++l
+ sp|A5VJ33|MURG_LACRD 299 VKNAQALV-------KNNAGLMITEDKLDARALLTQADKIMEDEEVRKEMAHAAEKMGRPDAADRL 357
+ 44444444.......44888888899999999999999999999999999*********9999876 PP
+
+>> sp|B2G6K5|MURG_LACRJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 119.3 0.0 5.8e-36 3.3e-33 2 138 .. 4 142 .. 3 143 .. 0.98
+ 2 ? 2.7 0.0 5.7 3.2e+03 64 129 .. 299 357 .. 237 360 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 119.3 bits; conditional E-value: 5.8e-36
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++ggGT+G+++Pa+Al ++L++ +++ + ++t++gle+++ + ag+e ++ + +++++l sl+++k+++ +l++++ ak+i++e
+ sp|B2G6K5|MURG_LACRJ 4 LVSGGGTGGHIYPALALIERLKQVEPDTEvlyVGTTRGLENKIvPDAGIELETMHMQ-GFKRSL-SLENFKTIYLFLNSVHHAKKIISE 90
+ 789**************************99**************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpdvv+g+ggyv++++l+aa++ +ip++++Eqn++ g++nk+l+r++++++
+ sp|B2G6K5|MURG_LACRJ 91 FKPDVVLGTGGYVSGAVLYAAAKKHIPTVIHEQNSVVGVTNKFLSRYVDQIA 142
+ ************************************************9986 PP
+
+ == domain 2 score: 2.7 bits; conditional E-value: 5.7
+ HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEES CS
+ Glyco_transf_28 64 lktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkl 129
+ +k+ l k ++ l ++++++++ +ad ++ ++ a+ aE+ g+p+++++l
+ sp|B2G6K5|MURG_LACRJ 299 VKNAQALV-------KNNAGLMITEDKLDARALLTQADKIMEDEEVRKEMAHAAEKMGRPDAADRL 357
+ 44444444.......44888888899999999999999999999999999*********9999876 PP
+
+>> sp|Q182Y6|MURG_CLOD6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 122.6 0.0 5.6e-37 3.2e-34 1 138 [. 4 143 .. 4 144 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 122.6 bits; conditional E-value: 5.6e-37
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+l+ggGT+G+v+Pa+A+a++ +++ ++ + ++t++g+e+++ +++g e ++++++ ++++k+ ++++k++++ +k+l+++++i+k
+ sp|Q182Y6|MURG_CLOD6 4 VLLSGGGTGGHVYPAIAIANKIRDEHPDAEiifVGTEKGIESEIvPKYGFELKTVTVQ-GFKRKI-DFDNVKRVFKLFKGLEQSRKIVK 90
+ 79***************************999**************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd+v+g+ggyv++++l++a+ +ipa+++Eqn+ pg++nk+l++++++vl
+ sp|Q182Y6|MURG_CLOD6 91 KFKPDIVIGTGGYVSGPVLFNASMGKIPAIIHEQNSFPGVTNKILSKTVTKVL 143
+ ***************************************************97 PP
+
+>> sp|Q2NVV1|MURG_SODGM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 122.5 0.2 6.3e-37 3.6e-34 2 135 .. 9 142 .. 8 146 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 122.5 bits; conditional E-value: 6.3e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++Vr l+t +++e+ + +++g+++ i + +l+ k+ + l+ + + ++alr+a++i++ ++
+ sp|Q2NVV1|MURG_SODGM 9 MVMAGGTGGHVFPGLAVAHHLMAQGWQVRwLGTANRMEADLvPQHGIDIDFIRIS-GLRGKG-LKAQLLAPVRIWRALRQARRIMRAWR 95
+ 5899************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ pdvv+g+ggyv+++ ++aa+++gip++++Eqngi+gl+n+ l++
+ sp|Q2NVV1|MURG_SODGM 96 PDVVLGMGGYVSGPGGLAAWSCGIPVVLHEQNGIAGLTNRGLAKISR 142
+ ***************************************97776655 PP
+
+>> sp|Q07WI5|MURG_SHEFN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 122.4 0.0 6.4e-37 3.6e-34 1 138 [. 11 148 .. 11 149 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 122.4 bits; conditional E-value: 6.4e-37
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G+++r l+t +++e+++ +++g +++ i+++ +++ ++ +++l +++ +++ +ak+++ ++
+ sp|Q07WI5|MURG_SHEFN 11 ILIMAGGTGGHVFPALAVAKYLAEKGWQIRwLGTADRMEARLvPQHGFDIEFIDIK-GVRGNG-LMRKLAAPFKIIRSIIQAKAVIDDF 97
+ 689*****************************************************.****99.99*********************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pdv++g+gg+++++ ++a +l+gip++++Eqn+ipgl+nkll++ a++vl
+ sp|Q07WI5|MURG_SHEFN 98 QPDVILGMGGFASGPGGVAGKLSGIPVVLHEQNAIPGLTNKLLSKIAKKVL 148
+ ************************************************997 PP
+
+>> sp|A1KVL3|MURG_NEIMF UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 122.7 0.1 5.3e-37 3e-34 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 122.7 bits; conditional E-value: 5.3e-37
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++l++gGT+G+++Pa+A+a+ L++rGh+V+ l++++ +ee++ +++g+ ++++++ +++ ++ ++l+ + ++++r+a +i++++
+ sp|A1KVL3|MURG_NEIMF 6 FMLMAGGTGGHIFPALAVADSLRARGHHVIwLGSKDSMEERIvPQYGIRLETLAIK-GVRGNG-IKRKLMLPVTLYQTVREAQRIIRKH 92
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + v+gfgg+v + ++aa+l+g+p++++Eqn+++gl+n++l+r+a++vl
+ sp|A1KVL3|MURG_NEIMF 93 RVECVIGFGGFVTFPGGLAAKLLGVPIVIHEQNAVAGLSNRHLSRWAKRVL 143
+ *************************************************97 PP
+
+>> sp|Q9K0Y2|MURG_NEIMB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 122.7 0.1 5.3e-37 3e-34 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 122.7 bits; conditional E-value: 5.3e-37
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++l++gGT+G+++Pa+A+a+ L++rGh+V+ l++++ +ee++ +++g+ ++++++ +++ ++ ++l+ + ++++r+a +i++++
+ sp|Q9K0Y2|MURG_NEIMB 6 FMLMAGGTGGHIFPALAVADSLRARGHHVIwLGSKDSMEERIvPQYGIRLETLAIK-GVRGNG-IKRKLMLPVTLYQTVREAQRIIRKH 92
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + v+gfgg+v + ++aa+l+g+p++++Eqn+++gl+n++l+r+a++vl
+ sp|Q9K0Y2|MURG_NEIMB 93 RVECVIGFGGFVTFPGGLAAKLLGVPIVIHEQNAVAGLSNRHLSRWAKRVL 143
+ *************************************************97 PP
+
+>> sp|B8CNL1|MURG_SHEPW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 121.8 0.0 9.9e-37 5.6e-34 1 138 [. 10 147 .. 10 148 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 121.8 bits; conditional E-value: 9.9e-37
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ ++++ +++ ++ l++l +++ l+++ +a+ +++++
+ sp|B8CNL1|MURG_SHEPW 10 ILIMAGGTGGHVFPALAVAKYLSQQGWKVRwLGTADRMEARLvPQHGFDIDFLDIK-GVRGNG-LLRKLAAPFKILRSVMQARSVIQDF 96
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+l+gip++++Eqn+ipg++nkll++ a+ vl
+ sp|B8CNL1|MURG_SHEPW 97 KPDVVMGMGGFASGPGGVAARLSGIPLVLHEQNAIPGMTNKLLSKVATEVL 147
+ *********************************************999886 PP
+
+>> sp|C4LA25|MURG_TOLAT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 120.6 0.4 2.5e-36 1.4e-33 2 138 .. 6 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 120.6 bits; conditional E-value: 2.5e-36
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ v+++gGT+G+v+P +A+a++Lq+ G++++ l+tp+++e+ + +++g +++ i+++ +l++++ +++l+ +++ +ka+ +a++il++ +
+ sp|C4LA25|MURG_TOLAT 6 VIMAGGTGGHVFPGLAVAHRLQADGWNIHwLGTPDRMEADLvPAHGFPIEFINIR-GLRNHG-LVRKLLAPFQICKAVLQAFMILRRIR 92
+ 799*************************************99*************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggy+a++ ++aa+l+gip++++Eqn+ +gl+n+ll++ a+++l
+ sp|C4LA25|MURG_TOLAT 93 PDVVLGMGGYAAGPGGVAAKLLGIPVVLHEQNAAAGLTNRLLAKIATRIL 142
+ **********************************************9987 PP
+
+>> sp|Q9F1N0|MURG_SHEVI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 121.7 0.0 1.1e-36 6.1e-34 1 138 [. 10 147 .. 10 148 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 121.7 bits; conditional E-value: 1.1e-36
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++ ++Vr l+t +++e+++ +++g ++ i+++ +++ ++ l++l ++++ +++ +a+++++e+
+ sp|Q9F1N0|MURG_SHEVI 10 ILIMAGGTGGHVFPALAVAKYLSQKSWKVRwLGTAERMEARLvPQHGFDIDFIDIK-GVRGNG-LLRKLAAPFKVMRSVMQARRVIQEF 96
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ +iaa+l+gip++++Eqn+ipg++nkll+r a +vl
+ sp|Q9F1N0|MURG_SHEVI 97 KPDVVLGMGGFASGPGGIAARLSGIPLVLHEQNAIPGMTNKLLSRIASKVL 147
+ ***********************************************9986 PP
+
+>> sp|A5F5M9|MURG_VIBC3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 121.6 0.4 1.2e-36 6.5e-34 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 121.6 bits; conditional E-value: 1.2e-36
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq++G+++r l+t +++e+++ +++g+e+ i+++ +l+ ++ ++ lk +++ +a+ +a+++l ++
+ sp|A5F5M9|MURG_VIBC3 9 MVMAGGTGGHVFPGLAVAKQLQQQGWQIRwLGTADRMEAELvPKHGIEIDFIQVK-GLRGQG-LMRLLKAPFQIVNAILQARRHLLAYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+l gip++++Eqn+++gl+n++l++ a +v+
+ sp|A5F5M9|MURG_VIBC3 96 PDAVLGMGGYVSGPGGIAAWLMGIPVVLHEQNAVAGLTNQWLAKIARRVF 145
+ *********************************************99986 PP
+
+>> sp|Q03W35|MURG_LEUMM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 121.1 0.1 1.7e-36 9.4e-34 1 137 [. 3 141 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 121.1 bits; conditional E-value: 1.7e-36
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G+++Pa+Ala+ ++ +++ + +++++g+e+ + +++g+++++++++ ++++++ sl+++k++ +lka+++ak+i+k
+ sp|Q03W35|MURG_LEUMM 3 IILSGGGTGGHIYPALALAEVIRKHEPDTEflyVGSERGVESNIvPATGMPFEKLTVQ-GFKRSF-SLENIKTVSLFLKAVKEAKKIIK 89
+ 689*******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ ++ pdvvvg+ggyv++++++aa +++ip++++Eqn+++g++nk+l+r a+++
+ sp|Q03W35|MURG_LEUMM 90 DFDPDVVVGTGGYVSGAVVYAAQRLHIPTVIHEQNSVAGVTNKFLSRGATKI 141
+ ***********************************************99987 PP
+
+>> sp|A3Q1L8|MURG_MYCSJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 122.2 1.3 7.9e-37 4.4e-34 1 138 [. 7 146 .. 7 147 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 122.2 bits; conditional E-value: 7.9e-37
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+laggGT+G+vePa+A+a++L + ++ Vr l+t++gle+++ +e+g++ + i+p +l++kl s + + + ++++a+r+++eil
+ sp|A3Q1L8|MURG_MYCSJ 7 VLLAGGGTAGHVEPAMAVADALAALEPGVRitaLGTERGLETRLvPERGYALELITPV-PLPRKL-SGDLARLPMRVRRAVRETREILD 93
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +dvv+gfggyva++a++aa+++++p++v+E+n+ +gl+nk+ +r+a +vl
+ sp|A3Q1L8|MURG_MYCSJ 94 TVHADVVIGFGGYVALPAYLAARRNRVPIVVHEANASAGLANKVGARFARRVL 146
+ **************************************************997 PP
+
+>> sp|A1UI54|MURG_MYCSK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 122.2 1.3 7.9e-37 4.4e-34 1 138 [. 7 146 .. 7 147 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 122.2 bits; conditional E-value: 7.9e-37
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+laggGT+G+vePa+A+a++L + ++ Vr l+t++gle+++ +e+g++ + i+p +l++kl s + + + ++++a+r+++eil
+ sp|A1UI54|MURG_MYCSK 7 VLLAGGGTAGHVEPAMAVADALAALEPGVRitaLGTERGLETRLvPERGYALELITPV-PLPRKL-SGDLARLPMRVRRAVRETREILD 93
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +dvv+gfggyva++a++aa+++++p++v+E+n+ +gl+nk+ +r+a +vl
+ sp|A1UI54|MURG_MYCSK 94 TVHADVVIGFGGYVALPAYLAARRNRVPIVVHEANASAGLANKVGARFARRVL 146
+ **************************************************997 PP
+
+>> sp|Q1B6X1|MURG_MYCSS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 122.2 1.3 7.9e-37 4.4e-34 1 138 [. 7 146 .. 7 147 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 122.2 bits; conditional E-value: 7.9e-37
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+laggGT+G+vePa+A+a++L + ++ Vr l+t++gle+++ +e+g++ + i+p +l++kl s + + + ++++a+r+++eil
+ sp|Q1B6X1|MURG_MYCSS 7 VLLAGGGTAGHVEPAMAVADALAALEPGVRitaLGTERGLETRLvPERGYALELITPV-PLPRKL-SGDLARLPMRVRRAVRETREILD 93
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +dvv+gfggyva++a++aa+++++p++v+E+n+ +gl+nk+ +r+a +vl
+ sp|Q1B6X1|MURG_MYCSS 94 TVHADVVIGFGGYVALPAYLAARRNRVPIVVHEANASAGLANKVGARFARRVL 146
+ **************************************************997 PP
+
+>> sp|C3LQU6|MURG_VIBCM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 122.3 0.3 6.9e-37 3.9e-34 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 122.3 bits; conditional E-value: 6.9e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq++G+++r l+t +++e+++ +++g+e+ i+++ +l+ ++ ++ lk +++ +a+ +a+++l ++
+ sp|C3LQU6|MURG_VIBCM 9 MVMAGGTGGHVFPGLAVAKQLQQQGWQIRwLGTADRMEAELvPKHGIEIDFIQVK-GLRGQG-LMRLLKAPFQIVNAILQARRHLLTYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+l+gip++++Eqn+++gl+n++l++ a +v+
+ sp|C3LQU6|MURG_VIBCM 96 PDAVLGMGGYVSGPGGIAAWLLGIPVVLHEQNAVAGLTNQWLAKIARRVF 145
+ *********************************************99986 PP
+
+>> sp|Q9KPG7|MURG_VIBCH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 122.3 0.3 6.9e-37 3.9e-34 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 122.3 bits; conditional E-value: 6.9e-37
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++Lq++G+++r l+t +++e+++ +++g+e+ i+++ +l+ ++ ++ lk +++ +a+ +a+++l ++
+ sp|Q9KPG7|MURG_VIBCH 9 MVMAGGTGGHVFPGLAVAKQLQQQGWQIRwLGTADRMEAELvPKHGIEIDFIQVK-GLRGQG-LMRLLKAPFQIVNAILQARRHLLTYQ 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggyv+++ +iaa+l+gip++++Eqn+++gl+n++l++ a +v+
+ sp|Q9KPG7|MURG_VIBCH 96 PDAVLGMGGYVSGPGGIAAWLLGIPVVLHEQNAVAGLTNQWLAKIARRVF 145
+ *********************************************99986 PP
+
+>> sp|A8FQA0|MURG_SHESH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 121.4 0.1 1.4e-36 7.6e-34 1 138 [. 10 147 .. 10 148 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 121.4 bits; conditional E-value: 1.4e-36
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+ L ++G++Vr l+t +++e+++ +++g ++ i+++ +++ ++ l++l ++++ +++ +a +++ke+
+ sp|A8FQA0|MURG_SHESH 10 ILIMAGGTGGHVFPALAVAKYLCQQGWQVRwLGTAERMEARLvPQHGFDIDFIDIK-GVRGNG-LLRKLAAPFKVIRSIMQAQAVIKEF 96
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdvv+g+gg+++++ ++aa+l+g p++++Eqn+ipg++nk+l+r a +vl
+ sp|A8FQA0|MURG_SHESH 97 KPDVVLGMGGFASGPGGVAARLSGLPLVLHEQNAIPGMTNKILARIASQVL 147
+ *********************************************999876 PP
+
+>> sp|B4RQC5|MURG_NEIG2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 120.3 0.1 2.9e-36 1.6e-33 1 138 [. 6 143 .. 6 144 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 120.3 bits; conditional E-value: 2.9e-36
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++l++gGT+G+++Pa+A+a+ L+ rGh+V+ l++++ +ee++ +++g+ ++++++ + + ++ ++l+ ++ +k++r+a +i++++
+ sp|B4RQC5|MURG_NEIG2 6 FMLMAGGTGGHIFPALAVADSLRVRGHHVIwLGSKDSMEERIvPQYGIRLETLAIK-GIRGNG-IKRKLMLPFTLYKTVREAQRIIRKH 92
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + v+gfgg+v + ++aa+l+g+p++++Eqn+++gl+n++l+r+a++vl
+ sp|B4RQC5|MURG_NEIG2 93 RVECVIGFGGFVTFPGGLAAKLLGVPIVIHEQNAVAGLSNRHLSRWAKRVL 143
+ *************************************************97 PP
+
+>> sp|Q5F6L8|MURG_NEIG1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 120.3 0.1 2.9e-36 1.6e-33 1 138 [. 6 143 .. 6 144 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 120.3 bits; conditional E-value: 2.9e-36
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++l++gGT+G+++Pa+A+a+ L+ rGh+V+ l++++ +ee++ +++g+ ++++++ + + ++ ++l+ ++ +k++r+a +i++++
+ sp|Q5F6L8|MURG_NEIG1 6 FMLMAGGTGGHIFPALAVADSLRVRGHHVIwLGSKDSMEERIvPQYGIRLETLAIK-GIRGNG-IKRKLMLPFTLYKTVREAQRIIRKH 92
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + v+gfgg+v + ++aa+l+g+p++++Eqn+++gl+n++l+r+a++vl
+ sp|Q5F6L8|MURG_NEIG1 93 RVECVIGFGGFVTFPGGLAAKLLGVPIVIHEQNAVAGLSNRHLSRWAKRVL 143
+ *************************************************97 PP
+
+>> sp|B1I4C4|MURG_DESAP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 120.4 0.3 2.8e-36 1.6e-33 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 120.4 bits; conditional E-value: 2.8e-36
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v++aggGT+G+++Pa+A+a++ +rr ++ ++t++gle+++ + +gl++++i++ +l++ l s+++l +++ +++l ++ +++
+ sp|B1I4C4|MURG_DESAP 3 VIIAGGGTGGHIYPALAIAEGIKRRHPDADllyVGTSRGLETEIvPRTGLPFHAIPAA-GLKRGL-SPTNLAAVLRAGRGLGASLSLMR 89
+ 689*******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++p+vvvg+ggyv +++++aa+l+gi++ ++Eqn++pgl+n+ l+r+a + +
+ sp|B1I4C4|MURG_DESAP 90 RFRPQVVVGTGGYVCGPVVLAAALRGIKTLIHEQNALPGLTNRMLSRYASRTA 142
+ *************************************************9875 PP
+
+>> sp|Q6A9Q2|MURG_PROAC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 121.3 1.1 1.4e-36 8e-34 1 134 [. 4 137 .. 4 140 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 121.3 bits; conditional E-value: 1.4e-36
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ vvlaggGT+G+ P++A a +Lq+rG V ++tp+gle +v +eagl+ i+p +l++ + + +k +a+ a+rka e+l++
+ sp|Q6A9Q2|MURG_PROAC 4 VVLAGGGTAGHTSPLIATAMALQERGATVScIGTPRGLEGRViPEAGLQLDMIPPV-PLPRTV-NADLFKVPARLAGAVRKAGEVLQRR 90
+ 79******************************************************.****99.9999999****************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprra 134
+ + dvvvgfggyv+++a++aa++a+ip++++Eqn++pgl+nk+ +r+a
+ sp|Q6A9Q2|MURG_PROAC 91 QTDVVVGFGGYVSLPAYLAARRAKIPVVIHEQNAVPGLANKIAARFA 137
+ ******************************************99986 PP
+
+>> sp|B3WDY2|MURG_LACCB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.3 0.0 1.2e-35 6.8e-33 2 138 .. 4 142 .. 3 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 118.3 bits; conditional E-value: 1.2e-35
+ EEE-------HHHHHHHHHHHHH---..EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGh..eVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ v++ggGT+G+++Pa+Al ++L+++G +V ++t++gle+++ +++gl++ +++++ +++++l sl++++++ ++l +l +ak++l++
+ sp|B3WDY2|MURG_LACCB 4 VISGGGTGGHIYPALALIEALKAEGKldDVLyVGTKRGLESRIvPATGLKFATLDLQ-GFKRSL-SLSNFTTVRKFLGSLGEAKKLLQD 90
+ 799**********************544666**************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++pd+vvg+ggyv++++l+aa++++ip++++E+n+++g++nk+l+ ++++v+
+ sp|B3WDY2|MURG_LACCB 91 FQPDIVVGTGGYVSGAILFAATRLHIPTVIHESNSVAGVTNKFLSHFVDRVA 142
+ *************************************************997 PP
+
+>> sp|Q039R7|MURG_LACC3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.3 0.0 1.2e-35 6.8e-33 2 138 .. 4 142 .. 3 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 118.3 bits; conditional E-value: 1.2e-35
+ EEE-------HHHHHHHHHHHHH---..EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGh..eVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ v++ggGT+G+++Pa+Al ++L+++G +V ++t++gle+++ +++gl++ +++++ +++++l sl++++++ ++l +l +ak++l++
+ sp|Q039R7|MURG_LACC3 4 VISGGGTGGHIYPALALIEALKAEGKldDVLyVGTKRGLESRIvPATGLKFATLDLQ-GFKRSL-SLSNFTTVRKFLGSLGEAKKLLQD 90
+ 799**********************544666**************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++pd+vvg+ggyv++++l+aa++++ip++++E+n+++g++nk+l+ ++++v+
+ sp|Q039R7|MURG_LACC3 91 FQPDIVVGTGGYVSGAILFAATRLHIPTVIHESNSVAGVTNKFLSHFVDRVA 142
+ *************************************************997 PP
+
+>> sp|A4J2B1|MURG_DESRM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.5 0.0 1e-35 5.8e-33 2 138 .. 4 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.5 bits; conditional E-value: 1e-35
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++ggGT+G+++Pa+A+ar+Lq r +V ++t +gle+ + ++a+ ++++i++ +l++k+ sl+++k l++ ++++r+a i+k
+ sp|A4J2B1|MURG_DESRM 4 IITGGGTGGHIYPALAIARGLQSRFSKVQilyVGTNRGLEADIvPKANFPFQAITVS-GLQRKI-SLENFKVLWQAYRGYREAVGIIKT 90
+ 689******************************************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++pdvv+g+ggyv ++++ aa+++gip+ ++Eqn+ pg++n++l+++a++v
+ sp|A4J2B1|MURG_DESRM 91 FNPDVVIGTGGYVCGPVVMAAARRGIPTLIHEQNAFPGITNRILSKFADQVT 142
+ *************************************************986 PP
+
+>> sp|Q47VQ9|MURG_COLP3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 119.8 0.0 4.1e-36 2.3e-33 2 137 .. 17 152 .. 16 154 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 119.8 bits; conditional E-value: 4.1e-36
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+++P +A+a+eL+++G++++ l+t +++e+++ + +g+++ i++ +l+ k l+tl+ +++ l++l++a++++k k
+ sp|Q47VQ9|MURG_COLP3 17 LVMAGGTGGHIFPGIAVADELKAQGWKIHwLGTADRMEAQIvPMHGYDISFINIS-GLRGKN-LLTTLVMPFKLLRSLFQARRVIKTVK 103
+ 789****************************************************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pdvv+g+ggy++++ ++aa+l++ip++v+Eqn+ +gl+n+ll+r an+v
+ sp|Q47VQ9|MURG_COLP3 104 PDVVIGMGGYASAPGGLAAWLSKIPLIVHEQNAAAGLSNRLLARIANKV 152
+ ***********************************************98 PP
+
+>> sp|B2A2H2|MURG_NATTJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 120.0 0.0 3.6e-36 2.1e-33 1 135 [. 3 139 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 120.0 bits; conditional E-value: 3.6e-36
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+++Pa+A+ +eL++r V ++t++g+e ++ +++g+++ +i+++ +l++k+ l+ + l ++lk+l ++ +++k
+ sp|B2A2H2|MURG_NATTJ 3 VLVTGGGTGGHIYPALAVINELKERNQIVDilyVGTSKGMEQEIiPNRGIDFAAITVR-GLQRKI-NLEQVYFLRDFLKGLYQSYRLIK 89
+ 799***********************9999****************************.******.99999999999999********* PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +++pdvv+g+ggyv +++l aa+l +ip++++Eqn ipg++nk+l+r+a+
+ sp|B2A2H2|MURG_NATTJ 90 NFTPDVVIGTGGYVCGPVLMAASLMKIPTVLHEQNVIPGITNKFLSRFAD 139
+ ************************************************98 PP
+
+>> sp|Q6NGC8|MURG_CORDI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 119.8 0.3 4.2e-36 2.3e-33 1 130 [. 6 135 .. 6 138 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 119.8 bits; conditional E-value: 4.2e-36
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ vv+aggGT+G++ePa+A+a+ L++rG eV l+t++gle+ + +e+g e + i+p ++++k+ + +k +++ l ++ ++++ilke+
+ sp|Q6NGC8|MURG_CORDI 6 VVVAGGGTAGHIEPALAVAESLRHRGAEVVaLGTTKGLETSIvPERGFELRLINPV-PVPRKI-NADLFKLPFRLLATISQTRKILKEF 92
+ 79******************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ dvv+gfggyva++a+iaa+l++ip +v+E+n++ g++nkl
+ sp|Q6NGC8|MURG_CORDI 93 DTDVVIGFGGYVAAPAYIAAKLQKIPFIVHEANARSGMANKLG 135
+ ****************************************986 PP
+
+>> sp|B4RWX9|MURG_ALTMD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 119.5 0.3 5.1e-36 2.9e-33 1 138 [. 5 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 119.5 bits; conditional E-value: 5.1e-36
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+P +A+a++L+++G++++ l+t +++e++v +++ ++++ i+++ +l+ k+ ++ + + + k+l++a++i+k+
+ sp|B4RWX9|MURG_ALTMD 5 CLIMAGGTGGHVFPGLAVANALRAEGWDIHwLGTAERMEAQVvPKHDIPIHFIPVK-GLRGKG-ISARIQGAVALVKSLFSARRIIKRL 91
+ 6899****************************************************.******.999999999999************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pd+vvgfggy++++ ++aa+++gip++v+Eqn+ +g++nkll++ a +vl
+ sp|B4RWX9|MURG_ALTMD 92 QPDIVVGFGGYASGPGGVAAKSLGIPVIVHEQNAAAGMTNKLLSKLASRVL 142
+ *********************************************999987 PP
+
+>> sp|Q9JSZ7|MURG_NEIMA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 119.2 0.1 6.5e-36 3.7e-33 1 138 [. 6 143 .. 6 144 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 119.2 bits; conditional E-value: 6.5e-36
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++l++gGT+G+++Pa+A+a+ L++rGh+V+ l++++ +ee++ +++ + ++++++ +++ ++ ++l+ ++ ++++r+a +i++++
+ sp|Q9JSZ7|MURG_NEIMA 6 FMLMAGGTGGHIFPALAVADSLRARGHHVIwLGSKDSMEERIvPQYDILLETLAIK-GVRGNG-IKRKLMLPFTLYQTVREAQQIIRKH 92
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + v+gfgg+v + ++aa+l+g+p++++Eqn+++gl+n++l+r+a++vl
+ sp|Q9JSZ7|MURG_NEIMA 93 RVECVIGFGGFVTFPGGLAAKLLGVPIVIHEQNAVAGLSNRHLSRWAKRVL 143
+ *************************************************97 PP
+
+>> sp|B0KFS6|MURG_PSEPG UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 115.5 0.2 9.2e-35 5.2e-32 1 130 [. 8 137 .. 8 144 .. 0.98
+ 2 ? 2.3 0.0 7.8 4.4e+03 34 55 .. 209 258 .. 207 352 .. 0.56
+
+ Alignments for each domain:
+ == domain 1 score: 115.5 bits; conditional E-value: 9.2e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+++ ++agl+ + i++ +l+ k+ +l+ lk ++ ka+ +a++i+++
+ sp|B0KFS6|MURG_PSEPG 8 VLIMAGGTGGHVFPALACAREFQARGYSVHwLGTPRGIENELvPQAGLPLHLIQVS-GLRGKG-KLSLLKAPFTLIKAVLQARRIIRQL 94
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ kp v+gfggyv ++ ++aa+l+g+p++++Eqn+++g +n+ll
+ sp|B0KFS6|MURG_PSEPG 95 KPVCVLGFGGYVTGPGGVAARLCGVPLVIHEQNARAGTANRLL 137
+ ****************************************986 PP
+
+ == domain 2 score: 2.3 bits; conditional E-value: 7.8
+ TGGGHHHH.HH---EEEE----...........................S CS
+ Glyco_transf_28 34 ppgleefv.eeagleavpigpd...........................v 55
+ p gl+++v +ag ++ pi+++ v
+ sp|B0KFS6|MURG_PSEPG 209 PAGLRPEVfHQAGKQHAPITAEryheagvaaqvepfikdmaqaygwadmV 258
+ 77788888888888888888886666444444444444444444444440 PP
+
+>> sp|A4XQS4|MURG_PSEMY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.7 0.2 8.9e-36 5e-33 1 137 [. 5 141 .. 5 142 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 118.7 bits; conditional E-value: 8.9e-36
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+t++g+e+++ ++agl+ + i++ +l+ k+ +l+ lk +++ l++l +a++i++e
+ sp|A4XQS4|MURG_PSEMY 5 VLIMAGGTGGHVFPALACAREFQTRGYAVHwLGTSRGIENELvPQAGLPLHLINVS-GLRGKG-KLSLLKAPFQLLRSLLQARRIVREL 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +p v+g+ggyv ++ ++aa+lag+p++++Eqn+++g +n+ll+r a+++
+ sp|A4XQS4|MURG_PSEMY 92 QPVCVLGMGGYVTGPGGLAARLAGVPLVIHEQNAVAGTANRLLSRIATRI 141
+ **********************************************9986 PP
+
+>> sp|Q48EF8|MURG_PSE14 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.7 0.4 9e-36 5.1e-33 1 137 [. 5 141 .. 5 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.7 bits; conditional E-value: 9e-36
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG++V+ l+tp+g+e+++ ++agl+ + i++ +l+ k+ l+ lk ++ lkal +a++++++
+ sp|Q48EF8|MURG_PSE14 5 VLIMAGGTGGHVFPALACAREFQARGYKVHwLGTPRGIENELvPQAGLTLHLINVT-GLRGKG-RLSLLKAPFMLLKALMQARKVVRQV 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kp vvgfggyv ++ ++aa+lag+p++++Eqn+++g +n+ l+ +a +v
+ sp|Q48EF8|MURG_PSE14 92 KPVCVVGFGGYVTGPGGLAAKLAGVPLIIHEQNAVAGTANRSLASFASRV 141
+ ********************************************999886 PP
+
+>> sp|Q8R9G6|MURG_THETN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 119.7 0.0 4.6e-36 2.6e-33 2 138 .. 4 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 119.7 bits; conditional E-value: 4.6e-36
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++PavA+a+e + + + ++t++gle+++ + +g e v+i+++ ++++kl s++tlk++++ + ++++a++ilk+
+ sp|Q8R9G6|MURG_THETN 4 LFAGGGTGGHIYPAVAIAKEILKNEQDAQilfVGTEKGLEKELvPREGFELVTIEVQ-GFKRKL-SFDTLKTVYKAFTGFKQANKILKD 90
+ 89*********************99999999**************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kp+vv+g+ggyv +++l aa +ip+ ++Eqn+ pgl+n+ll+ +++ v+
+ sp|Q8R9G6|MURG_THETN 91 FKPHVVIGTGGYVCGPVLMAAVIKRIPTLIHEQNAFPGLTNRLLSPFVDIVA 142
+ ***********************************************99886 PP
+
+>> sp|A5W8Q0|MURG_PSEP1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 115.6 0.2 8.3e-35 4.7e-32 1 130 [. 8 137 .. 8 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 115.6 bits; conditional E-value: 8.3e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+++ ++agl+ + i++ +l+ k+ +l+ lk ++ ka+ +a++i+++
+ sp|A5W8Q0|MURG_PSEP1 8 VLIMAGGTGGHVFPALACAREFQKRGYSVHwLGTPRGIENELvPQAGLPLHLIQVS-GLRGKG-KLSLLKAPFTLVKAVLQARRIIRQL 94
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ kp v+gfggyv ++ ++aa+l+g+p++++Eqn+++g +n+ll
+ sp|A5W8Q0|MURG_PSEP1 95 KPVCVLGFGGYVTGPGGVAARLCGVPLVIHEQNARAGTANRLL 137
+ ****************************************986 PP
+
+>> sp|Q1I5B8|MURG_PSEE4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 116.2 0.4 5.5e-35 3.1e-32 1 134 [. 8 141 .. 8 145 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 116.2 bits; conditional E-value: 5.5e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+++ ++agl+ + i++ +l+ k+ +l+ lk ++ ka+ +a++i++e
+ sp|Q1I5B8|MURG_PSEE4 8 VLIMAGGTGGHVFPALACAREFQARGYSVHwLGTPRGIENELvPQAGLPLHLIQVT-GLRGKG-KLSLLKAPFTLVKAVLQARRIVREL 94
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprra 134
+ kp v+gfggyv ++ ++aa+l+g+p++++Eqn+++g +n+ll a
+ sp|Q1I5B8|MURG_PSEE4 95 KPVCVIGFGGYVTGPGGVAARLCGVPLVIHEQNARAGTANRLLVPLA 141
+ *****************************************987665 PP
+
+>> sp|Q87WY5|MURG_PSESM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.4 0.3 1.2e-35 6.5e-33 1 137 [. 5 141 .. 5 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.4 bits; conditional E-value: 1.2e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG++V+ l+tp+g+e+++ ++agl+ + i++ +l+ k+ l+ lk ++ lkal +a++++++
+ sp|Q87WY5|MURG_PSESM 5 VLIMAGGTGGHVFPALACAREFQARGYKVHwLGTPRGIENELiPQAGLPLHLINVT-GLRGKG-RLSLLKAPFMLLKALMQARKVVRQV 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kp vvgfggyv ++ ++aa+lag+p++++Eqn+++g +n+ l+ +a +v
+ sp|Q87WY5|MURG_PSESM 92 KPVCVVGFGGYVTGPGGLAARLAGVPLIIHEQNAVAGTANRSLASFASRV 141
+ ********************************************999886 PP
+
+>> sp|C3L230|MURG_CLOB6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.5 0.0 1e-35 5.8e-33 1 138 [. 4 141 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.5 bits; conditional E-value: 1e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggGT+G+v P +Al eL++ G+e++ +++ +g+e+++ e++g+e+ pi ++ kl++++ lk++++++++lk++++ak+i+k++
+ sp|C3L230|MURG_CLOB6 4 IIMTGGGTAGHVTPNLALVPELKKLGYEIKyIGSIEGIERKIiEKEGIEYFPISSG-KLRRYF-DLKNFSDPFKVLKGVFQAKKIIKKE 90
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd+v++ gg+v ++++iaa l++ip++ +E++ pgl+nkl ++++v
+ sp|C3L230|MURG_CLOB6 91 KPDIVFSKGGFVTVPVVIAAHLNKIPVIAHESDITPGLANKLATPYCTRVC 141
+ ********************************************9999985 PP
+
+>> sp|A1WC06|MURG_ACISJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.4 0.1 1.2e-35 6.5e-33 2 138 .. 52 188 .. 51 189 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.4 bits; conditional E-value: 1.2e-35
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+++P +Ala++L++rG++V+ l+tp +ee++ + +g +++pi+ +++ k+ + l +++ +a +a++++++ +
+ sp|A1WC06|MURG_ACISJ 52 LVMAGGTGGHIFPGLALAEALRERGWQVHwLGTPGSMEERLvPPRGFAFEPIDFS-GVRGKG-LKTLLALPLRLARACLQARAVVRRLQ 138
+ 689****************************************************.****99.99999999****************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g ggyv + +iaa+la+ p+ ++Eqn++pg++nkll+r a++v+
+ sp|A1WC06|MURG_ACISJ 139 PDVVIGLGGYVTFPGGIAARLARKPLLLHEQNSVPGMANKLLSRLATRVY 188
+ ***********************************************998 PP
+
+>> sp|B9MFR2|MURG_DIAST UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.4 0.1 1.2e-35 6.5e-33 2 138 .. 52 188 .. 51 189 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.4 bits; conditional E-value: 1.2e-35
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+++P +Ala++L++rG++V+ l+tp +ee++ + +g +++pi+ +++ k+ + l +++ +a +a++++++ +
+ sp|B9MFR2|MURG_DIAST 52 LVMAGGTGGHIFPGLALAEALRERGWQVHwLGTPGSMEERLvPPRGFAFEPIDFS-GVRGKG-LKTLLALPLRLARACLQARAVVRRLQ 138
+ 689****************************************************.****99.99999999****************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g ggyv + +iaa+la+ p+ ++Eqn++pg++nkll+r a++v+
+ sp|B9MFR2|MURG_DIAST 139 PDVVIGLGGYVTFPGGIAARLARKPLLLHEQNSVPGMANKLLSRLATRVY 188
+ ***********************************************998 PP
+
+>> sp|B8ZQQ0|MURG_MYCLB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 119.2 2.2 6.3e-36 3.6e-33 1 138 [. 31 175 .. 31 176 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 119.2 bits; conditional E-value: 6.3e-36
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L++ +++Vr l+t++gle+++ +e+g++ + i+p +l++kl + + + ++++++a+r+++++++
+ sp|B8ZQQ0|MURG_MYCLB 31 VVLAGGGTAGHVEPAMAVADALRALDPQVRitaLGTSRGLETRLvPERGYHLELITPV-PLPRKL-TGDLARLPLRVWRAVRETRAVFE 117
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH.....HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal.....lagipanvaEqngipglvnkllprrangvl 138
+ +++vvvgfggyva++a++aa+ +++ip++v+E+n+++g++n++ r+a++vl
+ sp|B8ZQQ0|MURG_MYCLB 118 VVEAHVVVGFGGYVALPAYLAARgiprvRRRIPVVVHEANARAGIANRVGVRTAERVL 175
+ *******************************************************997 PP
+
+>> sp|O69552|MURG_MYCLE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 119.2 2.2 6.3e-36 3.6e-33 1 138 [. 31 175 .. 31 176 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 119.2 bits; conditional E-value: 6.3e-36
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L++ +++Vr l+t++gle+++ +e+g++ + i+p +l++kl + + + ++++++a+r+++++++
+ sp|O69552|MURG_MYCLE 31 VVLAGGGTAGHVEPAMAVADALRALDPQVRitaLGTSRGLETRLvPERGYHLELITPV-PLPRKL-TGDLARLPLRVWRAVRETRAVFE 117
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH.....HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal.....lagipanvaEqngipglvnkllprrangvl 138
+ +++vvvgfggyva++a++aa+ +++ip++v+E+n+++g++n++ r+a++vl
+ sp|O69552|MURG_MYCLE 118 VVEAHVVVGFGGYVALPAYLAARgiprvRRRIPVVVHEANARAGIANRVGVRTAERVL 175
+ *******************************************************997 PP
+
+>> sp|Q893R7|MURG_CLOTE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 116.8 0.0 3.6e-35 2.1e-32 1 138 [. 5 142 .. 5 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 116.8 bits; conditional E-value: 3.6e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++l+ggGT+G+v P ++l +L++ G+eV ++t++g+e+ + +++g+++++i ++ kl++++ lk++++++++lk++ +a++i+k++
+ sp|Q893R7|MURG_CLOTE 5 IILTGGGTAGHVTPNISLIPKLKELGYEVQyIGTKDGIEKSLiKKEGIKYHEISSG-KLRRYF-DLKNFTDPFKVLKGIMEARKIIKKE 91
+ 78******************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kp++v++ gg+va++++i+a l+++p++ +E++ pgl+nkl+ ++n+v
+ sp|Q893R7|MURG_CLOTE 92 KPNIVFSKGGFVAVPVVIGAYLNKVPVISHESDMTPGLANKLSTPYCNKVC 142
+ ************************************************986 PP
+
+>> sp|A7GGX9|MURG_CLOBL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.4 0.0 1.2e-35 6.5e-33 1 138 [. 4 141 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.4 bits; conditional E-value: 1.2e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggGT+G+v P +Al eL++ G+e++ +++ +g+e+++ e++g+e+ pi ++ kl++++ lk++++++++lk++++ak+i+k++
+ sp|A7GGX9|MURG_CLOBL 4 IIMTGGGTAGHVTPNLALVPELKKSGYEIKyIGSIEGIERKIiEKEGIEYFPISSG-KLRRYF-DLKNFSDPFKVLKGVFQAKKIIKRE 90
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd+v++ gg+v ++++iaa l++ip++ +E++ pgl+nkl ++++v
+ sp|A7GGX9|MURG_CLOBL 91 KPDIVFSKGGFVTVPVVIAAHLNKIPVIAHESDITPGLANKLATPYCTRVC 141
+ ********************************************9999985 PP
+
+>> sp|B1IKH3|MURG_CLOBK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.4 0.0 1.2e-35 6.5e-33 1 138 [. 4 141 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.4 bits; conditional E-value: 1.2e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggGT+G+v P +Al eL++ G+e++ +++ +g+e+++ e++g+e+ pi ++ kl++++ lk++++++++lk++++ak+i+k++
+ sp|B1IKH3|MURG_CLOBK 4 IIMTGGGTAGHVTPNLALVPELKKSGYEIKyIGSIEGIERKIiEKEGIEYFPISSG-KLRRYF-DLKNFSDPFKVLKGVFQAKKIIKRE 90
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd+v++ gg+v ++++iaa l++ip++ +E++ pgl+nkl ++++v
+ sp|B1IKH3|MURG_CLOBK 91 KPDIVFSKGGFVTVPVVIAAHLNKIPVIAHESDITPGLANKLATPYCTRVC 141
+ ********************************************9999985 PP
+
+>> sp|C1FUF9|MURG_CLOBJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.4 0.0 1.2e-35 6.5e-33 1 138 [. 4 141 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.4 bits; conditional E-value: 1.2e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggGT+G+v P +Al eL++ G+e++ +++ +g+e+++ e++g+e+ pi ++ kl++++ lk++++++++lk++++ak+i+k++
+ sp|C1FUF9|MURG_CLOBJ 4 IIMTGGGTAGHVTPNLALVPELKKLGYEIKyIGSIEGIERKIiEKEGIEYFPISSG-KLRRYF-DLKNFSDPFKVLKGVFQAKKIIKRE 90
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd+v++ gg+v ++++iaa l++ip++ +E++ pgl+nkl ++++v
+ sp|C1FUF9|MURG_CLOBJ 91 KPDIVFSKGGFVTVPVVIAAHLNKIPVIAHESDITPGLANKLATPYCTRVC 141
+ ********************************************9999985 PP
+
+>> sp|A5I5J5|MURG_CLOBH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.4 0.0 1.2e-35 6.5e-33 1 138 [. 4 141 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.4 bits; conditional E-value: 1.2e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggGT+G+v P +Al eL++ G+e++ +++ +g+e+++ e++g+e+ pi ++ kl++++ lk++++++++lk++++ak+i+k++
+ sp|A5I5J5|MURG_CLOBH 4 IIMTGGGTAGHVTPNLALVPELKKLGYEIKyIGSIEGIERKIiEKEGIEYFPISSG-KLRRYF-DLKNFSDPFKVLKGVFQAKKIIKRE 90
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd+v++ gg+v ++++iaa l++ip++ +E++ pgl+nkl ++++v
+ sp|A5I5J5|MURG_CLOBH 91 KPDIVFSKGGFVTVPVVIAAHLNKIPVIAHESDITPGLANKLATPYCTRVC 141
+ ********************************************9999985 PP
+
+>> sp|A7FX11|MURG_CLOB1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.4 0.0 1.2e-35 6.5e-33 1 138 [. 4 141 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.4 bits; conditional E-value: 1.2e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggGT+G+v P +Al eL++ G+e++ +++ +g+e+++ e++g+e+ pi ++ kl++++ lk++++++++lk++++ak+i+k++
+ sp|A7FX11|MURG_CLOB1 4 IIMTGGGTAGHVTPNLALVPELKKLGYEIKyIGSIEGIERKIiEKEGIEYFPISSG-KLRRYF-DLKNFSDPFKVLKGVFQAKKIIKRE 90
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd+v++ gg+v ++++iaa l++ip++ +E++ pgl+nkl ++++v
+ sp|A7FX11|MURG_CLOB1 91 KPDIVFSKGGFVTVPVVIAAHLNKIPVIAHESDITPGLANKLATPYCTRVC 141
+ ********************************************9999985 PP
+
+>> sp|Q4ZNZ0|MURG_PSEU2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.2 0.4 1.3e-35 7.4e-33 1 137 [. 5 141 .. 5 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.2 bits; conditional E-value: 1.3e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG++V+ l+tp+g+e+++ ++agl+ + i++ +l+ k+ l+ lk ++ lkal +a++++++
+ sp|Q4ZNZ0|MURG_PSEU2 5 VLIMAGGTGGHVFPALACAREFQARGYKVHwLGTPRGIENELvPQAGLTLHLINVT-GLRGKG-RLSLLKAPLMLLKALMQARKVVRQV 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kp vvgfggyv ++ ++aa+lag+p++++Eqn+++g +n+ l+ +a +v
+ sp|Q4ZNZ0|MURG_PSEU2 92 KPVCVVGFGGYVTGPGGLAAKLAGVPLIIHEQNAVAGTANRSLASFASRV 141
+ ********************************************999886 PP
+
+>> sp|A4XI04|MURG_CALS8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 115.7 0.0 7.7e-35 4.3e-32 1 138 [. 8 147 .. 8 148 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 115.7 bits; conditional E-value: 7.7e-35
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT+G+++PavA+a+ L++r + ++t +gle+++ +++g++++ i+++ +l+++l ++k++ ++++ ++r+a +ilk
+ sp|A4XI04|MURG_CALS8 8 IVFSGGGTGGHIYPAVAVADYLKKRYNNLNivfIGTNEGLESKIvPQHGYKIEYIQAK-GLKRSL-TVKNVEVFLKFISGYRQALQILK 94
+ 79***********************99988889*************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + kp+vv+ +ggyv++++ +aa++++i+++++Eqn+ pgl+nk+ +r+++++l
+ sp|A4XI04|MURG_CALS8 95 RIKPKVVFVTGGYVSLPVALAARRLKIKTILHEQNAYPGLANKIISRFCEKIL 147
+ *************************************************9987 PP
+
+>> sp|A0R016|MURG_MYCS2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 117.6 0.8 2e-35 1.1e-32 1 138 [. 17 161 .. 17 162 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 117.6 bits; conditional E-value: 2e-35
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L++ +++Vr l+t++gle+++ +++g++ + i+p +l++k s + l+ + +++ a+r+++ +l
+ sp|A0R016|MURG_MYCS2 17 VVLAGGGTAGHVEPAMAVADALRALDPDVRitaLGTQRGLETRLvPQRGYDLELITPV-PLPRKP-SKDLLRLPMRVRTAIRQTRDVLT 103
+ 79********************************************************.*****9.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH.....HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal.....lagipanvaEqngipglvnkllprrangvl 138
+ ++dvvvgfggyva++a++aa+ ++++p++v+E+n+++gl+n++ +r a +vl
+ sp|A0R016|MURG_MYCS2 104 GVNADVVVGFGGYVALPAYLAARggltgRRKVPVVVHEANARAGLANRVGARSARRVL 161
+ ******************************************************9997 PP
+
+>> sp|A8YUN9|MURG_LACH4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 116.8 0.0 3.5e-35 2e-32 1 137 [. 3 143 .. 3 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 116.8 bits; conditional E-value: 3.5e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.....EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.....latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakei 83
+ v+++ggGT+G+++P++A+ ++L++rG+ ++t++gle+++ ++ag+++++i+++ ++++k lk++ ++ +l+a+++a++i
+ sp|A8YUN9|MURG_LACH4 3 VIFTGGGTGGHIYPIMAIIERLKERGISTNdkilfVGTKKGLESKIvPAAGVNFKTINIQ-GFNRKH-PLKNFETIKLFLQATKSARKI 89
+ 789*********************************************************.****98.********************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ lke+kpdvv+g+ggyv+++ +++a++ +ip+ ++E+n++ gl+nk+l +++++
+ sp|A8YUN9|MURG_LACH4 90 LKEFKPDVVLGTGGYVSGAMVYEAAKMHIPTMIHESNSVVGLANKFLGHYVDRI 143
+ **************************************************9987 PP
+
+>> sp|A1SL80|MURG_NOCSJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 118.6 0.4 9.9e-36 5.6e-33 1 139 [] 3 143 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 118.6 bits; conditional E-value: 9.9e-36
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+laggGT+G+ P++A a++L+r +++V+ l+tp+gle++v +eag++ + i+p +l+++ + lk +++ + a+r++ ++l
+ sp|A1SL80|MURG_NOCSJ 3 VLLAGGGTAGHTSPLLATADALRRLEPDVEitcLGTPRGLENKVvPEAGYPLELIPPV-PLPRRP-GADLLKVPFRLRAAVRATHAVLD 89
+ 79********************************************************.****99.9999999**************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ + +pdvvvg+ggyv+ +a++a++++gip++v+Eqn +pgl+n++ +r+a +v+v
+ sp|A1SL80|MURG_NOCSJ 90 RVRPDVVVGYGGYVSMPAYVATRKRGIPLVVHEQNTVPGLANRAGARFAQRVAV 143
+ **************************************************9975 PP
+
+>> sp|Q88N76|MURG_PSEPK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 115.0 0.3 1.3e-34 7.1e-32 1 130 [. 8 137 .. 8 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 115.0 bits; conditional E-value: 1.3e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+++ ++agl+ + i++ +l+ k+ +l+ lk ++ ka+ +a++i+++
+ sp|Q88N76|MURG_PSEPK 8 VLIMAGGTGGHVFPALACAREFQARGYSVHwLGTPRGIENELvPQAGLPLHLIQVS-GLRGKG-KLSLLKAPFTLVKAVLQARRIIRQL 94
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ kp v+gfggyv ++ ++aa+l+g+p++++Eqn+++g +n+ll
+ sp|Q88N76|MURG_PSEPK 95 KPVCVLGFGGYVTGPGGVAARLCGVPLVIHEQNARAGTANRLL 137
+ ****************************************986 PP
+
+>> sp|B1KYH7|MURG_CLOBM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 117.3 0.0 2.4e-35 1.4e-32 1 138 [. 4 141 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 117.3 bits; conditional E-value: 2.4e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggGT+G+v P +Al eL++ G+e++ +++ +g+e+++ e +g+e+ pi ++ kl++++ lk++++++++lk++++ak+i+k++
+ sp|B1KYH7|MURG_CLOBM 4 IIMTGGGTAGHVTPNLALVPELKKLGYEIKyIGSIEGIERKIiEREGIEYFPISSG-KLRRYF-DLKNFSDPFKVLKGVFQAKKIIKRE 90
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd+v++ gg+v ++++iaa l++ip++ +E++ pgl+nkl ++++v
+ sp|B1KYH7|MURG_CLOBM 91 KPDIVFSKGGFVTVPVVIAAHLNKIPVIAHESDITPGLANKLATPYCTRVC 141
+ ********************************************9999985 PP
+
+>> sp|Q24TE6|MURG_DESHY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 117.2 0.1 2.7e-35 1.5e-32 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 117.2 bits; conditional E-value: 2.7e-35
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+++Pa+A+a++ ++ ++ + ++t +g+e+++ +eag+e+ + ++ +l++kl sl+tlk + +kal ++k+ilk
+ sp|Q24TE6|MURG_DESHY 3 VIVTGGGTGGHIYPALAIAKGILAQRPDAEilyIGTREGMEARLvPEAGIEFSGVSGQ-GLPRKL-SLETLKVGGKSFKALWETKQILK 89
+ 689************************99999**************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd+vvg+ggyva+++++ a+l gip+ ++Eqn++pg++nk+l r++ +v+
+ sp|Q24TE6|MURG_DESHY 90 KFKPDLVVGTGGYVAGPVVLTAALFGIPTLLHEQNALPGITNKILTRFVRKVM 142
+ *************************************************9997 PP
+
+>> sp|Q3K744|MURG_PSEPF UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 117.0 0.5 3.1e-35 1.8e-32 1 137 [. 5 141 .. 5 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 117.0 bits; conditional E-value: 3.1e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+ + ++agle + i++ +l+ k+ +l+ lk ++ lk++ +a++i+++
+ sp|Q3K744|MURG_PSEPF 5 VLIMAGGTGGHVFPALACAREFQARGYTVHwLGTPRGIENDLvPAAGLELHRINAT-GLRGKG-KLSLLKAPFMLLKSVWQARAIIRRL 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +p vvgfggyv ++ ++aa+lag+p++v+Eqn+++g +n+ll +a +v
+ sp|Q3K744|MURG_PSEPF 92 RPVCVVGFGGYVTGPGGLAAKLAGVPVIVHEQNAVAGTANRLLVPFAARV 141
+ *******************************************9999876 PP
+
+>> sp|B1J3L2|MURG_PSEPW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 113.8 0.4 3e-34 1.7e-31 1 130 [. 8 137 .. 8 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 113.8 bits; conditional E-value: 3e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+++ ++agl+ + i++ +l+ k+ +l+ lk ++ ka+ +a++i+ +
+ sp|B1J3L2|MURG_PSEPW 8 VLIMAGGTGGHVFPALACAREFQARGYTVHwLGTPRGIENELvPQAGLSLHLIQVS-GLRGKG-KLSLLKAPFTLVKAVLQARRIIGQL 94
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ kp v+gfggyv ++ ++aa+l+g+p++++Eqn+++g +n+ll
+ sp|B1J3L2|MURG_PSEPW 95 KPVCVIGFGGYVTGPGGVAARLCGVPLVIHEQNARAGTANRLL 137
+ ****************************************986 PP
+
+>> sp|B0K3H0|MURG_THEPX UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 114.4 0.0 2e-34 1.1e-31 2 138 .. 4 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 114.4 bits; conditional E-value: 2e-34
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++Pa+A+a+e + + + ++t++gle+++ + +g e ++i+++ ++++kl sl+tlk++++ +l++a+ il e
+ sp|B0K3H0|MURG_THEPX 4 LFAGGGTGGHIYPAIAIAKEILKNEKNAQilfVGTKKGLENELvPREGFELKTITVQ-GFKRKL-SLDTLKTIYKAMVGLKEANNILNE 90
+ 89*********************99999999**************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpdvv+g+ggyv +++l a+l gip+ ++Eqn+ pgl+nk+l+r+++ v+
+ sp|B0K3H0|MURG_THEPX 91 FKPDVVIGTGGYVCGPVLMMAALKGIPTLIHEQNAFPGLTNKVLSRFVKVVA 142
+ ***********************************************99776 PP
+
+>> sp|B0K8K7|MURG_THEP3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 114.4 0.0 2e-34 1.1e-31 2 138 .. 4 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 114.4 bits; conditional E-value: 2e-34
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++Pa+A+a+e + + + ++t++gle+++ + +g e ++i+++ ++++kl sl+tlk++++ +l++a+ il e
+ sp|B0K8K7|MURG_THEP3 4 LFAGGGTGGHIYPAIAIAKEILKNEKNAQilfVGTKKGLENELvPREGFELKTITVQ-GFKRKL-SLDTLKTIYKAMVGLKEANNILNE 90
+ 89*********************99999999**************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpdvv+g+ggyv +++l a+l gip+ ++Eqn+ pgl+nk+l+r+++ v+
+ sp|B0K8K7|MURG_THEP3 91 FKPDVVIGTGGYVCGPVLMMAALKGIPTLIHEQNAFPGLTNKVLSRFVKVVA 142
+ ***********************************************99776 PP
+
+>> sp|A3DE27|MURG_CLOTH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 114.0 0.0 2.7e-34 1.5e-31 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 114.0 bits; conditional E-value: 2.7e-34
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G++ P +A+a+ ++r+++ + ++t++gle+++ + ++ e++ i+++ ++++kl s++tl+ + e +++l +a++i+k
+ sp|A3DE27|MURG_CLOTH 3 VIISGGGTAGHINPGLAIAKYIKKREPDTEilfIGTERGLEARLvPRENFEIKMIKVR-GFKRKL-SMDTLVAVKELFQGLAEARKIIK 89
+ 6899******************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd+v+g+ggyv +++l++a++ +ip+ v+Eqn+ pg++nk+l++++++v+
+ sp|A3DE27|MURG_CLOTH 90 DYKPDLVIGTGGYVCGPVLFNASRMKIPTLVHEQNAFPGVTNKILSKFVDRVA 142
+ ***************************************************97 PP
+
+>> sp|A1TAW8|MURG_MYCVP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 116.6 1.1 4.1e-35 2.3e-32 1 138 [. 32 175 .. 32 176 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 116.6 bits; conditional E-value: 4.1e-35
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G++ePa+A+a++L + +++Vr l+t++gle+++ +++g++ + i++ +l++kl s + ++ + ++l+a+r++++il
+ sp|A1TAW8|MURG_MYCVP 32 VVLAGGGTAGHIEPAMAVADALTALDPDVRitaLGTERGLETRLvPQRGYHLELITLV-PLPRKL-SADLFRLPMRVLRAVRQTRRILD 118
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH....HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal....lagipanvaEqngipglvnkllprrangvl 138
+ e ++dvvvgfggyva++a++aa+ +++p++v+E+n+ +g +nk+ +r a +vl
+ sp|A1TAW8|MURG_MYCVP 119 EVSADVVVGFGGYVAVPAYLAARslrtHRRVPVVVHEANASAGWANKVGARSAQRVL 175
+ **********************97777889***********************9997 PP
+
+>> sp|B8FT56|MURG_DESHD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 114.9 0.2 1.3e-34 7.6e-32 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 114.9 bits; conditional E-value: 1.3e-34
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+++Pa+A+a++ ++ + ++t +g+e+++ +eagle+ + ++ +l++kl sl+tlk + +kal ++k+ilk
+ sp|B8FT56|MURG_DESHD 3 VIVTGGGTGGHIYPALAIAKGILVHQPDAEilyIGTREGMEARLvPEAGLEFAGVSGQ-GLPRKL-SLETLKVGGKSFKALWETKQILK 89
+ 689********************999999999**************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd+vvg+ggyva+++++ a+l gip+ ++Eqn++pg++nk+l r++ +v+
+ sp|B8FT56|MURG_DESHD 90 KFKPDLVVGTGGYVAGPVVLTAALFGIPTLLHEQNALPGITNKILTRFVRKVM 142
+ *************************************************9997 PP
+
+>> sp|Q9RWP0|MURG_DEIRA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 116.6 0.8 4.1e-35 2.3e-32 1 137 [. 4 141 .. 4 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 116.6 bits; conditional E-value: 4.1e-35
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ vv+a+gGT+G+++PavA a+eL+ rG+eV ++ + g+ee + e +gl+++ ++++ kl+++++ +++l++ +++l +a+++l+
+ sp|Q9RWP0|MURG_DEIRA 4 VVMATGGTGGHIYPAVATAKELRGRGYEVAlMGQKGGMEEGIaEREGLTFYGVDAG-KLARSGQGRPDPRQLLKAGQGLAQARRTLAGL 91
+ 79******************************************************.******************************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +p++vvg+gg+++++ ++aa ++gip++++Eqn++ gl+++l rra v
+ sp|Q9RWP0|MURG_DEIRA 92 NPAAVVGYGGFASLPGVLAAQSLGIPTILHEQNARLGLTQRLAVRRARAV 141
+ **********************************************9877 PP
+
+>> sp|B2I1J5|MURG_ACIBC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 113.7 0.3 3.1e-34 1.8e-31 1 135 [. 12 146 .. 12 149 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 113.7 bits; conditional E-value: 3.1e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++ GT+G+v+Pa+A+a++Lq++G +V latp g+e+++ + +++++++i+++ +++ ++ +++l +++ lka+++a++ +k+
+ sp|B2I1J5|MURG_ACIBC 12 VMMMAAGTGGHVFPALAVAKQLQQQGCQVSwLATPTGMENRLlKDQNIPIYQIDIQ-GVRGNG-VIRKLAAPFKILKATFSAMRYMKQL 98
+ 67899***************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ k d+v+gfggyva++ ++aa+l+gip+ ++Eqn+++g++n l+r a+
+ sp|B2I1J5|MURG_ACIBC 99 KVDAVAGFGGYVAGPGGLAARLLGIPVLIHEQNAVAGFTNAQLSRVAK 146
+ ****************************************99998776 PP
+
+>> sp|B0V9F5|MURG_ACIBY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 113.7 0.3 3.1e-34 1.8e-31 1 135 [. 12 146 .. 12 149 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 113.7 bits; conditional E-value: 3.1e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++ GT+G+v+Pa+A+a++Lq++G +V latp g+e+++ + +++++++i+++ +++ ++ +++l +++ lka+++a++ +k+
+ sp|B0V9F5|MURG_ACIBY 12 VMMMAAGTGGHVFPALAVAKQLQQQGCQVSwLATPTGMENRLlKDQNIPIYQIDIQ-GVRGNG-VIRKLAAPFKILKATFSAMRYMKQL 98
+ 67899***************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ k d+v+gfggyva++ ++aa+l+gip+ ++Eqn+++g++n l+r a+
+ sp|B0V9F5|MURG_ACIBY 99 KVDAVAGFGGYVAGPGGLAARLLGIPVLIHEQNAVAGFTNAQLSRVAK 146
+ ****************************************99998776 PP
+
+>> sp|B7GV73|MURG_ACIB3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 113.7 0.3 3.1e-34 1.8e-31 1 135 [. 12 146 .. 12 149 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 113.7 bits; conditional E-value: 3.1e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++ GT+G+v+Pa+A+a++Lq++G +V latp g+e+++ + +++++++i+++ +++ ++ +++l +++ lka+++a++ +k+
+ sp|B7GV73|MURG_ACIB3 12 VMMMAAGTGGHVFPALAVAKQLQQQGCQVSwLATPTGMENRLlKDQNIPIYQIDIQ-GVRGNG-VIRKLAAPFKILKATFSAMRYMKQL 98
+ 67899***************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ k d+v+gfggyva++ ++aa+l+gip+ ++Eqn+++g++n l+r a+
+ sp|B7GV73|MURG_ACIB3 99 KVDAVAGFGGYVAGPGGLAARLLGIPVLIHEQNAVAGFTNAQLSRVAK 146
+ ****************************************99998776 PP
+
+>> sp|B7ICE5|MURG_ACIB5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 113.7 0.3 3.1e-34 1.8e-31 1 135 [. 12 146 .. 12 149 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 113.7 bits; conditional E-value: 3.1e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++ GT+G+v+Pa+A+a++Lq++G +V latp g+e+++ + +++++++i+++ +++ ++ +++l +++ lka+++a++ +k+
+ sp|B7ICE5|MURG_ACIB5 12 VMMMAAGTGGHVFPALAVAKQLQQQGCQVSwLATPTGMENRLlKDQNIPIYQIDIQ-GVRGNG-VIRKLAAPFKILKATFSAMRYMKQL 98
+ 67899***************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ k d+v+gfggyva++ ++aa+l+gip+ ++Eqn+++g++n l+r a+
+ sp|B7ICE5|MURG_ACIB5 99 KVDAVAGFGGYVAGPGGLAARLLGIPVLIHEQNAVAGFTNAQLSRVAK 146
+ ****************************************99998776 PP
+
+>> sp|A5D145|MURG_PELTS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 116.5 0.0 4.4e-35 2.5e-32 1 138 [. 3 142 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 116.5 bits; conditional E-value: 4.4e-35
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+A+ar+L++r + + ++t++g+e+ + +++g ++ i + +l +kl s+++l+ l++ +++ +a ei+
+ sp|A5D145|MURG_PELTS 3 FLVSGGGTGGHIYPALAIARGLKNRYPGAEilyMGTSNGMEADIvPAEGFPFTGISAS-GLERKL-SPRNLLALWQAVRGFCQAVEIIG 89
+ 799**********************7766666**************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++p++v+g+ggyv +++++aa l +ip+ ++Eqn++pg++n++l+r+a +v+
+ sp|A5D145|MURG_PELTS 90 RWRPEAVIGTGGYVCGPVVLAAVLKRIPTLIHEQNALPGVTNRILSRFASRVA 142
+ **************************************************997 PP
+
+>> sp|A3M9Y1|MURG_ACIBT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 113.7 0.3 3.1e-34 1.8e-31 1 135 [. 12 146 .. 12 149 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 113.7 bits; conditional E-value: 3.1e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++ GT+G+v+Pa+A+a++Lq++G +V latp g+e+++ + +++++++i+++ +++ ++ +++l +++ lka+++a++ +k+
+ sp|A3M9Y1|MURG_ACIBT 12 VMMMAAGTGGHVFPALAVAKQLQQQGCQVSwLATPTGMENRLlKDQNIPIYQIDIQ-GVRGNG-VIRKLAAPFKILKATFSAMRYMKQL 98
+ 67899***************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ k d+v+gfggyva++ ++aa+l+gip+ ++Eqn+++g++n l+r a+
+ sp|A3M9Y1|MURG_ACIBT 99 KVDAVAGFGGYVAGPGGLAARLLGIPVLIHEQNAVAGFTNAQLSRVAK 146
+ ****************************************99998776 PP
+
+>> sp|A9KK83|MURG_CLOPH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 115.3 0.0 1.1e-34 5.9e-32 1 134 [. 4 137 .. 4 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 115.3 bits; conditional E-value: 1.1e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +vl+ggGT+G+v P +Al +L+++G+e++ +++ +g+e+++ e+ g++++ i ++ kl+++l +k++++++++lk++r+ak++lk+
+ sp|A9KK83|MURG_CLOPH 4 IVLTGGGTAGHVTPNIALIAGLKEQGYEIHyIGSYEGIERELiEKLGIPYHGISSG-KLRRYL-DIKNFSDPFKVLKGYREAKKLLKNL 90
+ 79******************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprra 134
+ p+vv++ gg+va+++++aa++++ipa+++E++ pgl+n+l+ a
+ sp|A9KK83|MURG_CLOPH 91 DPNVVFSKGGFVAVPVVLAAKKRKIPAIIHESDMTPGLANRLCIPSA 137
+ ****************************************9876555 PP
+
+>> sp|C3KCT0|MURG_PSEFS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 115.0 0.5 1.3e-34 7.1e-32 1 134 [. 5 138 .. 5 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 115.0 bits; conditional E-value: 1.3e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+++ ++agl+ + i++ +l+ k+ +l+ lk ++ lka+ +a++++++
+ sp|C3KCT0|MURG_PSEFS 5 VLIMAGGTGGHVFPALACAREFQNRGYTVHwLGTPRGIENELvPNAGLPLHLINVT-GLRGKG-KLSLLKAPFVLLKAVWQARKVIRDV 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprra 134
+ +p v+gfggyv ++ ++aa+lag+p++v+Eqn+++g +n+ll a
+ sp|C3KCT0|MURG_PSEFS 92 QPVCVLGFGGYVTGPGGVAAKLAGVPVIVHEQNAVAGTANRLLVPLA 138
+ *****************************************987665 PP
+
+>> sp|Q03EY2|MURG_PEDPA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 114.6 0.0 1.7e-34 9.5e-32 2 138 .. 4 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 114.6 bits; conditional E-value: 1.7e-34
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++ggGT+G+++Pa+Al +++++ +++ ++t++gle+++ + +g+++++i+++ +++++l sl+++k++ +l ++ ka++ +ke
+ sp|Q03EY2|MURG_PEDPA 4 MVSGGGTGGHIYPALALIKQVKQSEPDSQilyVGTSKGLESKIvPDSGIDFKTINIQ-GFKRSL-SLENFKTIGLFLSSVVKARKMVKE 90
+ 5899***********************9999**************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpdvv+g+ggyv++++++aa+ g+p++++Eqn++ g++nk+l++++++++
+ sp|Q03EY2|MURG_PEDPA 91 FKPDVVLGTGGYVSGAVVFAASMMGVPTVIHEQNSVVGVTNKFLSKFVKKIA 142
+ *************************************************987 PP
+
+>> sp|A0QF52|MURG_MYCA1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 114.2 1.0 2.2e-34 1.3e-31 1 138 [. 34 178 .. 34 179 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 114.2 bits; conditional E-value: 2.2e-34
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L++ +++Vr l+t +gle+++ +e+g++ + i+p +l++k + + + + ++++a+r+++++l
+ sp|A0QF52|MURG_MYCA1 34 VVLAGGGTAGHVEPAMAVADALKALDPNVRitsLGTARGLETRLvPERGYDLELITPV-PLPRKP-TGDLARLPSRVWRAVRETRAVLH 120
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH.....HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal.....lagipanvaEqngipglvnkllprrangvl 138
+ +dvv+gfggyva++a++aa+ + ++p++++E+n+ +gl+n++ +r+a +vl
+ sp|A0QF52|MURG_MYCA1 121 AVDADVVIGFGGYVALPAYLAARgvsprKPRVPVVIHEANASAGLANRVGARTAQRVL 178
+ ***********************99999***************************997 PP
+
+>> sp|Q04B72|MURG_LACDB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.2 0.0 3.7e-33 2.1e-30 1 137 [. 3 143 .. 3 145 .. 0.96
+ 2 ? 2.3 0.0 7.8 4.4e+03 71 102 .. 204 235 .. 179 240 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 110.2 bits; conditional E-value: 3.7e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.......EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.......latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkak 81
+ v+++ggGT+G+++P++Al ++L+++G ++ ++t++gle+++ ++ag+++++i+++ ++ +k l+++k+++ +lka+++ak
+ sp|Q04B72|MURG_LACDB 3 VIFSGGGTGGHIYPIMALIERLKEEG--ICqddeilfVGTKKGLESKIvPAAGVNFKTIDIQ-GFDRKH-LLNNVKTIQLFLKATKRAK 87
+ 689***********************..44568889**************************.****98.******************* PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ eil++++pdvv+g+ggyv+++++++a++ +ip+ ++E+n++ g++nk+l +++++
+ sp|Q04B72|MURG_LACDB 88 EILADFQPDVVLGTGGYVSGAIVYEASKMKIPTMIHESNSVVGVANKFLGHYVDKI 143
+ ****************************************************9987 PP
+
+ == domain 2 score: 2.3 bits; conditional E-value: 7.8
+ HHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 71 aeglkalrkakeilkeakpdvvvgfggyvadl 102
+ ++ ++ + k+ + lk++ +v++++g+y+ d+
+ sp|Q04B72|MURG_LACDB 204 LAINRVMLKSLMELKKKPYQVIWATGTYYYDA 235
+ 455567888999999999999**999999875 PP
+
+>> sp|Q1GAT5|MURG_LACDA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.2 0.0 3.7e-33 2.1e-30 1 137 [. 3 143 .. 3 145 .. 0.96
+ 2 ? 2.3 0.0 7.8 4.4e+03 71 102 .. 204 235 .. 179 240 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 110.2 bits; conditional E-value: 3.7e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.......EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.......latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkak 81
+ v+++ggGT+G+++P++Al ++L+++G ++ ++t++gle+++ ++ag+++++i+++ ++ +k l+++k+++ +lka+++ak
+ sp|Q1GAT5|MURG_LACDA 3 VIFSGGGTGGHIYPIMALIERLKEEG--ICqddeilfVGTKKGLESKIvPAAGVNFKTIDIQ-GFDRKH-LLNNVKTIQLFLKATKRAK 87
+ 689***********************..44568889**************************.****98.******************* PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ eil++++pdvv+g+ggyv+++++++a++ +ip+ ++E+n++ g++nk+l +++++
+ sp|Q1GAT5|MURG_LACDA 88 EILADFQPDVVLGTGGYVSGAIVYEASKMKIPTMIHESNSVVGVANKFLGHYVDKI 143
+ ****************************************************9987 PP
+
+ == domain 2 score: 2.3 bits; conditional E-value: 7.8
+ HHHHHHHHHHHHHHHHHHHHHHHHC----EEE CS
+ Glyco_transf_28 71 aeglkalrkakeilkeakpdvvvgfggyvadl 102
+ ++ ++ + k+ + lk++ +v++++g+y+ d+
+ sp|Q1GAT5|MURG_LACDA 204 LAINRVMLKSLMELKKKPYQVIWATGTYYYDA 235
+ 455567888999999999999**999999875 PP
+
+>> sp|Q4K6J3|MURG_PSEF5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 114.7 0.6 1.6e-34 9.1e-32 1 134 [. 5 138 .. 5 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 114.7 bits; conditional E-value: 1.6e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+ + ++agl+ + i++ +l+ k+ +l+ lk ++ ka+ +a++++++
+ sp|Q4K6J3|MURG_PSEF5 5 VLIMAGGTGGHVFPALACAREFQARGYTVHwLGTPRGIENDLvPAAGLPLHLINVS-GLRGKG-KLSLLKAPFVLIKAVLQARRVIRQL 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprra 134
+ kp v+gfggyv ++ ++aa+l+g+p++v+Eqn+++g +n+ll a
+ sp|Q4K6J3|MURG_PSEF5 92 KPVCVLGFGGYVTGPGGVAAKLSGVPVIVHEQNAVAGTANRLLVPLA 138
+ *****************************************987665 PP
+
+>> sp|B0VNZ9|MURG_ACIBS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 112.1 0.3 1e-33 5.8e-31 1 135 [. 12 146 .. 12 149 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 112.1 bits; conditional E-value: 1e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++ GT+G+v+Pa+A+a++Lq++G +V latp g+e+++ + +++++++i+++ +++ ++ +++l +++ lka+++a++ +k+
+ sp|B0VNZ9|MURG_ACIBS 12 VMMMAAGTGGHVFPALAVAKQLQQQGCQVSwLATPIGMENRLlKDQNIPIYQIDIQ-GVRGNG-VIRKLAAPFKILKATFSAMRYMKQL 98
+ 67899***************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ k d+v+gfggyva++ ++aa+l+gip+ ++Eqn+++g++n l+r a+
+ sp|B0VNZ9|MURG_ACIBS 99 KVDAVAGFGGYVAGPGGLAARLLGIPVLIHEQNAVAGFTNAQLSRVAK 146
+ ****************************************99998776 PP
+
+>> sp|Q5FKV2|MURG_LACAC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 112.3 0.0 8.8e-34 5e-31 1 137 [. 3 143 .. 3 145 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 112.3 bits; conditional E-value: 8.8e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.....EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.....latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakei 83
+ v+++ggGT+G+++P++A+ ++L++rG+ ++t++gle+++ ++ag+++++i+++ ++++k lk++ ++ +++a+++a++i
+ sp|Q5FKV2|MURG_LACAC 3 VIFTGGGTGGHIYPIMAIIERLKERGISKNdeilfVGTQKGLESKIvPAAGVNFETIQIQ-GFNRKH-PLKNFETIKLFFQATKSARKI 89
+ 789***********************87778999**************************.****98.********************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ l+e+kpdvv+g+ggyv+++ +++a++ +ip+ ++E+n++ gl+nk+l +++++
+ sp|Q5FKV2|MURG_LACAC 90 LQEFKPDVVLGTGGYVSGAMVYEAAKMHIPTMIHESNSVVGLANKFLGHYVDKI 143
+ **************************************************9987 PP
+
+>> sp|A0KPX2|MURG_AERHH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 111.7 0.3 1.3e-33 7.3e-31 2 138 .. 6 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 111.7 bits; conditional E-value: 1.3e-33
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G+ ++ l+t +++e+++ +++g+++ i+++ +++ ++ + l+ +++ k++ +a+++lk +
+ sp|A0KPX2|MURG_AERHH 6 LVMAGGTGGHVFPGLAVADRLKAQGWTIHwLGTADRMEAELvPAHGYPISFIDIQ-GVRGNG-IKRLLVAPYRIVKSVLQARRVLKTIR 92
+ 789****************************************************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+gg+++++ ++aa+l+gip+ ++Eqn+ +gl+nkll+r a++vl
+ sp|A0KPX2|MURG_AERHH 93 PDVVLGMGGFASGPGGVAAWLSGIPLLLHEQNAAAGLTNKLLARLAKRVL 142
+ ***********************************************997 PP
+
+>> sp|A1WYU3|MURG_HALHL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 114.1 2.4 2.4e-34 1.4e-31 1 132 [. 6 137 .. 6 144 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 114.1 bits; conditional E-value: 2.4e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++a+gGT+G+v+P +A+a++L++rGh+V l+t gle +v ++agl+a+ ++++ + + k+ + +++ ++a+ a ++l+++
+ sp|A1WYU3|MURG_HALHL 6 VAIAAGGTGGHVYPGLAVADALRERGHRVVwLGTRAGLEGRVvPAAGLDAEWLEIG-GMRGKG-LATIAALPWRLGRAVAVAGAALRRQ 92
+ 799*****************************************************.****99.9************************ PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGG CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllpr 132
+ +pdvv+g+ggyva+++++aa+lag p++++Eqn+++g++n++l+r
+ sp|A1WYU3|MURG_HALHL 93 RPDVVLGMGGYVAGPVGLAARLAGRPLIIHEQNARAGMTNRFLAR 137
+ ******************************************987 PP
+
+>> sp|Q73YQ8|MURG_MYCPA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 113.0 1.5 5.5e-34 3.1e-31 1 138 [. 34 178 .. 34 179 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 113.0 bits; conditional E-value: 5.5e-34
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L++ +++Vr l+t +gle+++ +e+g++ + i+p +l++k + + + + ++++a+r+++++l
+ sp|Q73YQ8|MURG_MYCPA 34 VVLAGGGTAGHVEPAMAVADALKALDPHVRitaLGTARGLETRLvPERGYDLELITPV-PLPRKP-TGDLARLPSRVWRAVRETRAVLH 120
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH.....HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal.....lagipanvaEqngipglvnkllprrangvl 138
+ +dvv+gfggyva++a++aa+ + ++p++++E+n+ +gl+n++ +r+a +vl
+ sp|Q73YQ8|MURG_MYCPA 121 AVDADVVIGFGGYVALPAYLAARgvsprKPRVPVVIHEANASAGLANRVGARTAQRVL 178
+ ***********************99999***************************997 PP
+
+>> sp|B1MXW0|MURG_LEUCK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 113.4 0.3 3.9e-34 2.2e-31 1 137 [. 3 141 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 113.4 bits; conditional E-value: 3.9e-34
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+l+ggGT+G+++Pa+Ala+ ++ +++ + +++++g+e+ + +++g+++++++++ ++ ++l sl+++k+++ +lka++ +k+i+k
+ sp|B1MXW0|MURG_LEUCK 3 VILSGGGTGGHIYPALALAEVIKQHEPDAEflyVGSERGVEANIvPKTGMAFKQLAVQ-GFSRSL-SLHNIKTVQLFLKAVKVSKKIIK 89
+ 789*******************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ e+kpdvv+g+ggyva+++++aa + +ip++++Eqn+++g++nk+l+r a+++
+ sp|B1MXW0|MURG_LEUCK 90 EFKPDVVIGTGGYVAGAVVYAAQRMNIPTVIHEQNSVAGVTNKFLARGATKI 141
+ ***********************************************99987 PP
+
+>> sp|Q604V7|MURG_METCA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 112.8 0.3 6.1e-34 3.4e-31 1 138 [. 5 142 .. 5 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 112.8 bits; conditional E-value: 6.1e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +v+++gGT+G+v+Pa+A+a +L+r+G eV ++t gle++v ++ag+++ + + + + k+ ++ k +a + a +a +il++
+ sp|Q604V7|MURG_METCA 5 IVILAGGTGGHVFPALAVAGKLRRAGAEVFwMGTRTGLEARVvPAAGYPIDWLSVS-GIRGKG-LASKAKAPAMLGLACLQALRILRRR 91
+ 799*****************************************************.******.999999999999************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd+v+g+gg+va++ ++ a+ +gip++++Eqn ipg +n++l+r an+vl
+ sp|Q604V7|MURG_METCA 92 KPDAVLGMGGFVAGPGGLMARVLGIPLIIHEQNRIPGTTNRWLSRIANRVL 142
+ ************************************************986 PP
+
+>> sp|B2V1X5|MURG_CLOBA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 113.3 0.0 4.2e-34 2.3e-31 1 134 [. 6 139 .. 6 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 113.3 bits; conditional E-value: 4.2e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v+++ggGT+G+v P +Al +L++ G eV+ +++++g+e+++ ++ ++++ +i ++ kl++++ lk++++++++lk++++a++ilk++
+ sp|B2V1X5|MURG_CLOBA 6 VIMTGGGTAGHVTPNLALVPALKENGFEVKyIGSKDGIEKEIiKNNNIPYFQISSG-KLRRYF-DLKNFSDPFKVLKGIKDANKILKKE 92
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprra 134
+ kpdvv++ gg+va++++iaa l++ip++ +E++ pgl+nkl++ ++
+ sp|B2V1X5|MURG_CLOBA 93 KPDVVFSKGGFVAVPVVIAAHLRKIPVVAHESDMTPGLANKLSAPFC 139
+ *****************************************988765 PP
+
+>> sp|A1U3F8|MURG_MARAV UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 112.8 0.1 6e-34 3.4e-31 1 137 [. 9 145 .. 9 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 112.8 bits; conditional E-value: 6e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A ar+Lq+rGheV+ l+++ g+ee++ + ++ i + +l+ k+ +l+ l+ +++ +al +a ++l++
+ sp|A1U3F8|MURG_MARAV 9 FLMMAGGTGGHVFPALATARALQQRGHEVHwLGASGGMEERLiGDTDIPLSLIHIS-GLRGKG-KLALLLAPFRLMRALGEAYTHLRRI 95
+ 799*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +pd vvg+gg+v ++ +iaa+l + p++++Eqn+i+g++n++l r+ ++v
+ sp|A1U3F8|MURG_MARAV 96 RPDCVVGMGGFVTGPGGIAAWLMRKPLVIHEQNAIAGMTNRWLTRFSETV 145
+ *******************************************9987665 PP
+
+>> sp|A8MH36|MURG_ALKOO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.0 0.0 4.4e-33 2.5e-30 1 138 [. 3 142 .. 3 143 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 110.0 bits; conditional E-value: 4.4e-33
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+l+ggGT+G+++Pa+++a++ +++ ++ + ++t++g+e+++ ++ag++++ +++ l++k+ sl+++k++a lk++ +a++i+k
+ sp|A8MH36|MURG_ALKOO 3 VILSGGGTGGHIYPAISIANKIKEQHPKAEilfIGTENGMESEIvPKAGYPIKYVTVS-YLKRKI-SLHNVKSAAMLLKGIAEARKIIK 89
+ 789*******************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ e+kpd+v+g+gg+v +++l+ a+++gi + ++Eqn pgl+n++l+r++++++
+ sp|A8MH36|MURG_ALKOO 90 EFKPDIVIGTGGFVCGPVLYMASKLGIRTMIHEQNVFPGLTNRILDRYVDRIA 142
+ **************************************************986 PP
+
+>> sp|B2TLE0|MURG_CLOBB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 112.2 0.0 9.3e-34 5.3e-31 1 136 [. 6 141 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 112.2 bits; conditional E-value: 9.3e-34
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v+++ggGT+G+v P +Al L++ G eV+ +++++g+e+++ ++ ++++ +i ++ kl++++ +k++++++++lk++++a++ilk++
+ sp|B2TLE0|MURG_CLOBB 6 VIMTGGGTAGHVTPNLALVPSLKENGFEVKyIGSKDGIEKEIiKNNNIPYFQISSG-KLRRYF-DFKNFSDPFKVLKGIKDANRILKKE 92
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ kpdv+++ gg+va++++iaa l++ip++ +E++ pgl+nkl++ ++n+
+ sp|B2TLE0|MURG_CLOBB 93 KPDVIFSKGGFVAVPVVIAAHLRKIPVVAHESDMTPGLANKLSAPFCNK 141
+ ******************************************9999987 PP
+
+>> sp|A4SI56|MURG_AERS4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.7 0.3 2.7e-33 1.5e-30 2 138 .. 6 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 110.7 bits; conditional E-value: 2.7e-33
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G+ ++ l+t +++e+++ +++g+++ i+++ +++ ++ + l +++ k++ +a+++lk +
+ sp|A4SI56|MURG_AERS4 6 LVMAGGTGGHVFPGLAVADRLKAQGWTIHwLGTADRMEAELvPAHGYPISFIDIQ-GVRGNG-IKRLLAAPYRIVKSVLQARRVLKTIR 92
+ 789****************************************************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+gg+++++ ++aa+l+gip+ ++Eqn+ +gl+nkll+r a++vl
+ sp|A4SI56|MURG_AERS4 93 PDVVLGMGGFASGPGGVAAWLSGIPLLLHEQNAAAGLTNKLLARLAKRVL 142
+ ***********************************************997 PP
+
+>> sp|C4Z1B5|MURG_EUBE2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 111.0 0.0 2.2e-33 1.3e-30 1 137 [. 4 140 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 111.0 bits; conditional E-value: 2.2e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +vl+ggGT+G+v P +Al L+++G+eV +++ g+e+++ e g++++ i ++ kl+++ slk+l++++++l +l++ak+++k+
+ sp|C4Z1B5|MURG_EUBE2 4 IVLTGGGTAGHVTPNIALLPSLKEAGYEVFyIGSYTGIEKTLiEDLGIPYYGISSG-KLRRYR-SLKNLSDPFRVLHGLFQAKRLMKKI 90
+ 79******************************************************.****88.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kpd+v++ gg+v++++++aa +++ip++++E++ pgl+nk+ +r+a+++
+ sp|C4Z1B5|MURG_EUBE2 91 KPDIVFSKGGFVSVPVVLAAGSRHIPVIIHESDMTPGLANKIAMRKATKI 140
+ ***********************************************987 PP
+
+>> sp|C1DQ99|MURG_AZOVD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 111.8 0.2 1.2e-33 6.9e-31 1 136 [. 5 140 .. 5 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 111.8 bits; conditional E-value: 1.2e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+ + ++agl+ + i+++ +l+ k+ + lk +++ ++l++a++i+ e
+ sp|C1DQ99|MURG_AZOVD 5 VLIMAGGTGGHVFPALACAREFQARGYAVHwLGTPRGIENDLvPSAGLPLHRIQIG-GLRGKG-LATLLKAPFQLIRSLFQARRIMNEL 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ +p v+g+gg+v ++ ++aa+l g+p++++Eqn+++g +n++l+ a++
+ sp|C1DQ99|MURG_AZOVD 92 RPVCVLGMGGFVTGPGGVAAKLTGAPLVIHEQNAVAGTSNRALAPLADR 140
+ *****************************************99887776 PP
+
+>> sp|Q6F703|MURG_ACIAD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.5 0.3 3.2e-33 1.8e-30 1 137 [. 12 148 .. 12 149 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 110.5 bits; conditional E-value: 3.2e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++ GT+G+v+Pa+A+a++Lq+ G +V latp g+e+++ + +++++++i+++ +++ ++ +++l+ +++ lka+ +a++ +k+
+ sp|Q6F703|MURG_ACIAD 12 VMMMAAGTGGHVFPALAVAKQLQQHGCQVSwLATPAGMENRLlKDQNIPIYQIDIQ-GVRGNG-AVRKLLAPFKILKATYSAMRYMKQL 98
+ 67899***************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k d+v+gfggyva++ ++aa+ +gip+ ++Eqn+++g++n l+r a +v
+ sp|Q6F703|MURG_ACIAD 99 KVDAVAGFGGYVAGPGGLAARILGIPILIHEQNAVAGFTNTQLARVASKV 148
+ ****************************************9998888765 PP
+
+>> sp|B1YIT7|MURG_EXIS2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 112.2 0.0 9.4e-34 5.3e-31 1 138 [. 3 141 .. 3 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 112.2 bits; conditional E-value: 9.4e-34
+ EEEE-------HHHHHHHHHHHHH---.EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGh.eVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +v++ggGT+G+++Pa+A+ re rr + eV ++t++gle+ + + ag+++++i++ + +++l s++++k+ +++lk++ +++++l++
+ sp|B1YIT7|MURG_EXIS2 3 IVVSGGGTGGHIYPALAMIREIERRTPcEVLyIGTENGLEADIvRRAGIPFESIEIS-GIRRSL-SFENVKTGFRFLKSVVRVRKLLRD 89
+ 799********************99865888**************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++pd+vvg+gg+v +++l+ a++ g ++ v+Eqn++pg++nk+l+r++++v+
+ sp|B1YIT7|MURG_EXIS2 90 FQPDIVVGTGGFVCGPVLYTAAKMGYKTLVHEQNSLPGITNKFLARYVDRVA 141
+ *************************************************997 PP
+
+>> sp|C1CW40|MURG_DEIDV UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 111.1 1.8 2.1e-33 1.2e-30 1 137 [. 4 141 .. 4 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 111.1 bits; conditional E-value: 2.1e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ vv+a+gGT+G+++PavA areL +rGhe l+ g+ee+v +e+gl+++ ++++ kl+++++ ++el++ +++ +a+++l+
+ sp|C1CW40|MURG_DEIDV 4 VVMATGGTGGHIYPAVATARELNARGHETLlLGQRGGMEERVaAEQGLSFEGVDAG-KLARSGQGRPDPRELFRAVRGVVEARRVLQAR 91
+ 79******************************************************.******************************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +p++vvg+gg+++++ ++aa ++gi+++++Eqn++ gl++++ ra v
+ sp|C1CW40|MURG_DEIDV 92 RPALVVGYGGFASLPGVLAAQSLGIATVLHEQNARLGLTQRVAVGRARAV 141
+ ******************************************99999876 PP
+
+>> sp|Q47QW9|MURG_THEFY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.4 0.3 3.3e-33 1.9e-30 1 132 [. 3 136 .. 3 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 110.4 bits; conditional E-value: 3.3e-33
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+Ala++L+r ++ l+t++gle ++ + +g+e +i++ +l++kl +++ l+ + + +a+ a ++l
+ sp|Q47QW9|MURG_THEFY 3 VVLAGGGTAGHVEPALALADALRRINPDTQvlcLGTKRGLEQRLvPMRGYELAEIPAV-PLPRKL-TPQLLSVPGRLANAISTAAKHLD 89
+ 79**************************99999*************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGG CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllpr 132
+ + ++d++vgfggyva++ ++aa++++ip++v+E+n +pgl+n+l +r
+ sp|Q47QW9|MURG_THEFY 90 RVQADILVGFGGYVATPGYLAARSRRIPIVVHEANPLPGLANRLGAR 136
+ ******************************************98765 PP
+
+>> sp|A0Q182|MURG_CLONN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 111.4 0.0 1.6e-33 9e-31 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 111.4 bits; conditional E-value: 1.6e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggG++G+v P +Al +L++ G+e+ ++t++g+e+++ e+++++++ i ++ kl++++ +k++++++++lk++++ak+i+k++
+ sp|A0Q182|MURG_CLONN 6 IIMTGGGSAGHVTPNLALVPKLKELGYEIQyIGTENGIERKIiESENIKYHIISSG-KLRRYF-DIKNFSDPFKVLKGVFEAKKIIKRE 92
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kp++v++ gg+v+++++i+a+l++ip++ +E++ pgl+nkl + ++n+v
+ sp|A0Q182|MURG_CLONN 93 KPNIVFSKGGFVSVPVVIGARLNRIPVISHESDMTPGLANKLAAPFCNKVC 143
+ ***********************************************9986 PP
+
+>> sp|A1KKJ6|MURG_MYCBP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 112.2 0.9 9.4e-34 5.3e-31 1 138 [. 38 185 .. 38 186 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 112.2 bits; conditional E-value: 9.4e-34
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L + +++Vr l+tp+gle+++ +++g++ + i++ + ++k + + + ++++a+r+a+ +l
+ sp|A1KKJ6|MURG_MYCBP 38 VVLAGGGTAGHVEPAMAVADALVALDPRVRitaLGTPRGLETRLvPQRGYHLELITAV-PMPRKP-GGDLARLPSRVWRAVREARDVLD 124
+ 79********************************************************.****99.999999999************** PP
+
+ HHHHHHHHHC----EEEE--HHH........HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal........lagipanvaEqngipglvnkllprrangvl 138
+ + +dvvvgfggyva++a++aa+ +++ip++++E+n+++gl+n++ + +a++vl
+ sp|A1KKJ6|MURG_MYCBP 125 DVDADVVVGFGGYVALPAYLAARglplpprrRRRIPVVIHEANARAGLANRVGAHTADRVL 185
+ ***********************************************************97 PP
+
+>> sp|C1AQ69|MURG_MYCBT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 112.2 0.9 9.4e-34 5.3e-31 1 138 [. 38 185 .. 38 186 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 112.2 bits; conditional E-value: 9.4e-34
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L + +++Vr l+tp+gle+++ +++g++ + i++ + ++k + + + ++++a+r+a+ +l
+ sp|C1AQ69|MURG_MYCBT 38 VVLAGGGTAGHVEPAMAVADALVALDPRVRitaLGTPRGLETRLvPQRGYHLELITAV-PMPRKP-GGDLARLPSRVWRAVREARDVLD 124
+ 79********************************************************.****99.999999999************** PP
+
+ HHHHHHHHHC----EEEE--HHH........HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal........lagipanvaEqngipglvnkllprrangvl 138
+ + +dvvvgfggyva++a++aa+ +++ip++++E+n+++gl+n++ + +a++vl
+ sp|C1AQ69|MURG_MYCBT 125 DVDADVVVGFGGYVALPAYLAARglplpprrRRRIPVVIHEANARAGLANRVGAHTADRVL 185
+ ***********************************************************97 PP
+
+>> sp|Q7VEP8|MURG_MYCBO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 112.2 0.9 9.4e-34 5.3e-31 1 138 [. 38 185 .. 38 186 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 112.2 bits; conditional E-value: 9.4e-34
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L + +++Vr l+tp+gle+++ +++g++ + i++ + ++k + + + ++++a+r+a+ +l
+ sp|Q7VEP8|MURG_MYCBO 38 VVLAGGGTAGHVEPAMAVADALVALDPRVRitaLGTPRGLETRLvPQRGYHLELITAV-PMPRKP-GGDLARLPSRVWRAVREARDVLD 124
+ 79********************************************************.****99.999999999************** PP
+
+ HHHHHHHHHC----EEEE--HHH........HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal........lagipanvaEqngipglvnkllprrangvl 138
+ + +dvvvgfggyva++a++aa+ +++ip++++E+n+++gl+n++ + +a++vl
+ sp|Q7VEP8|MURG_MYCBO 125 DVDADVVVGFGGYVALPAYLAARglplpprrRRRIPVVIHEANARAGLANRVGAHTADRVL 185
+ ***********************************************************97 PP
+
+>> sp|B0S0Z5|MURG_FINM2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 111.3 0.0 1.8e-33 1e-30 1 138 [. 3 142 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 111.3 bits; conditional E-value: 1.8e-33
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa++l +eL++r+ + + ++t++gle+ + ++ g+++++i ++ + ++k+ + +k l e +++lr+a++ilk
+ sp|B0S0Z5|MURG_FINM2 3 IIVSGGGTGGHIYPAISLIEELKKRDKDNKilyVGTEKGLESSIvPKLGIDFKTIHVR-GIPRKI-NANSFKALKELFQGLREANKILK 89
+ 6899***********************99999**************************.888888.77888888888888********* PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ e+kpd+v+g+ggyv++++l+ a++ ++++ +Eqn+ pg++n++l+r++++ +
+ sp|B0S0Z5|MURG_FINM2 90 EFKPDLVIGTGGYVSGPILYKATKTKAKVAFHEQNSFPGITNRILSRYVDKYF 142
+ *************************************************9865 PP
+
+>> sp|B7UZJ0|MURG_PSEA8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.0 0.2 8.7e-33 4.9e-30 1 137 [. 5 141 .. 5 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 109.0 bits; conditional E-value: 8.7e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+ + ++agl+ + i++ +l+ k+ + +k ++e lk+l++a +++++
+ sp|B7UZJ0|MURG_PSEA8 5 VLIMAGGTGGHVFPALACAREFQARGYAVHwLGTPRGIENDLvPKAGLPLHLIQVS-GLRGKG-LKSLVKAPLELLKSLFQALRVIRQL 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +p v+g ggyv ++ ++aa+l+g+p++++Eqn+++g +n+ l+ a +v
+ sp|B7UZJ0|MURG_PSEA8 92 RPVCVLGLGGYVTGPGGLAARLNGVPLVIHEQNAVAGTANRSLAPIARRV 141
+ *****************************************998877765 PP
+
+>> sp|Q02H28|MURG_PSEAB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.0 0.2 8.7e-33 4.9e-30 1 137 [. 5 141 .. 5 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 109.0 bits; conditional E-value: 8.7e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+ + ++agl+ + i++ +l+ k+ + +k ++e lk+l++a +++++
+ sp|Q02H28|MURG_PSEAB 5 VLIMAGGTGGHVFPALACAREFQARGYAVHwLGTPRGIENDLvPKAGLPLHLIQVS-GLRGKG-LKSLVKAPLELLKSLFQALRVIRQL 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +p v+g ggyv ++ ++aa+l+g+p++++Eqn+++g +n+ l+ a +v
+ sp|Q02H28|MURG_PSEAB 92 RPVCVLGLGGYVTGPGGLAARLNGVPLVIHEQNAVAGTANRSLAPIARRV 141
+ *****************************************998877765 PP
+
+>> sp|Q9HW01|MURG_PSEAE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.0 0.2 8.7e-33 4.9e-30 1 137 [. 5 141 .. 5 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 109.0 bits; conditional E-value: 8.7e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+ + ++agl+ + i++ +l+ k+ + +k ++e lk+l++a +++++
+ sp|Q9HW01|MURG_PSEAE 5 VLIMAGGTGGHVFPALACAREFQARGYAVHwLGTPRGIENDLvPKAGLPLHLIQVS-GLRGKG-LKSLVKAPLELLKSLFQALRVIRQL 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +p v+g ggyv ++ ++aa+l+g+p++++Eqn+++g +n+ l+ a +v
+ sp|Q9HW01|MURG_PSEAE 92 RPVCVLGLGGYVTGPGGLAARLNGVPLVIHEQNAVAGTANRSLAPIARRV 141
+ *****************************************998877765 PP
+
+>> sp|A0PTI7|MURG_MYCUA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 111.6 0.5 1.4e-33 7.8e-31 1 138 [. 22 166 .. 22 167 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 111.6 bits; conditional E-value: 1.4e-33
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L +++Vr l+t++gle+++ +++g++ + i+p +l++k s + + + ++++++r+++++l
+ sp|A0PTI7|MURG_MYCUA 22 VVLAGGGTAGHVEPAMAVADALSVLEPNVRitaLGTSRGLETRLvPARGYHLELITPV-PLPRKP-SGDLARLPPRVWRSVRETRAVLD 108
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH.....HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal.....lagipanvaEqngipglvnkllprrangvl 138
+ +dvv+gfggyva++a++aa+ +++ip++++E+n+++gl+n++ r+a++vl
+ sp|A0PTI7|MURG_MYCUA 109 LVDADVVIGFGGYVALPAYLAARgipglRRRIPVVIHEANARAGLANRVGLRTADRVL 166
+ ***************************9****************************97 PP
+
+>> sp|A6VB85|MURG_PSEA7 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.0 0.2 8.7e-33 4.9e-30 1 137 [. 5 141 .. 5 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 109.0 bits; conditional E-value: 8.7e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+ + ++agl+ + i++ +l+ k+ + +k ++e lk+l++a +++++
+ sp|A6VB85|MURG_PSEA7 5 VLIMAGGTGGHVFPALACAREFQARGYAVHwLGTPRGIENDLvPKAGLPLHLIQVS-GLRGKG-LKSLVKAPLELLKSLFQALRVIRQL 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +p v+g ggyv ++ ++aa+l+g+p++++Eqn+++g +n+ l+ a +v
+ sp|A6VB85|MURG_PSEA7 92 RPVCVLGLGGYVTGPGGLAARLNGVPLVIHEQNAVAGTANRSLAPIARRV 141
+ *****************************************998877765 PP
+
+>> sp|A9KER3|MURG_COXBN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.7 0.1 2.6e-33 1.5e-30 1 135 [. 4 137 .. 4 141 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 110.7 bits; conditional E-value: 2.6e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+areL++++ +V l+++ glee++ + l+ +i++ ++++ l+ l+ +++ +a+++a +i+++
+ sp|A9KER3|MURG_COXBN 4 ILIIAGGTGGHIFPALAVARELREQEVDVQwLGVKGGLEEKLvpDSFPLHLIQIKAF-RGKR---GLQQLLMPLRLVRAVFQAYRIIRQ 88
+ 6899*************************************9666666666666666.5555...66777778888899********** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +kpdv++g+ggyva++ ++aa+ + p++++Eqn+ipgl+n++l++ a+
+ sp|A9KER3|MURG_COXBN 89 FKPDVILGMGGYVAGPGGLAAWITRTPLIIHEQNSIPGLTNRVLAKMAK 137
+ ********************************************99886 PP
+
+>> sp|A9NA44|MURG_COXBR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.7 0.1 2.6e-33 1.5e-30 1 135 [. 4 137 .. 4 141 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 110.7 bits; conditional E-value: 2.6e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+areL++++ +V l+++ glee++ + l+ +i++ ++++ l+ l+ +++ +a+++a +i+++
+ sp|A9NA44|MURG_COXBR 4 ILIIAGGTGGHIFPALAVARELREQEVDVQwLGVKGGLEEKLvpDSFPLHLIQIKAF-RGKR---GLQQLLMPLRLVRAVFQAYRIIRQ 88
+ 6899*************************************9666666666666666.5555...66777778888899********** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +kpdv++g+ggyva++ ++aa+ + p++++Eqn+ipgl+n++l++ a+
+ sp|A9NA44|MURG_COXBR 89 FKPDVILGMGGYVAGPGGLAAWITRTPLIIHEQNSIPGLTNRVLAKMAK 137
+ ********************************************99886 PP
+
+>> sp|B6J2Q3|MURG_COXB2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.7 0.1 2.6e-33 1.5e-30 1 135 [. 4 137 .. 4 141 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 110.7 bits; conditional E-value: 2.6e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+areL++++ +V l+++ glee++ + l+ +i++ ++++ l+ l+ +++ +a+++a +i+++
+ sp|B6J2Q3|MURG_COXB2 4 ILIIAGGTGGHIFPALAVARELREQEVDVQwLGVKGGLEEKLvpDSFPLHLIQIKAF-RGKR---GLQQLLMPLRLVRAVFQAYRIIRQ 88
+ 6899*************************************9666666666666666.5555...66777778888899********** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +kpdv++g+ggyva++ ++aa+ + p++++Eqn+ipgl+n++l++ a+
+ sp|B6J2Q3|MURG_COXB2 89 FKPDVILGMGGYVAGPGGLAAWITRTPLIIHEQNSIPGLTNRVLAKMAK 137
+ ********************************************99886 PP
+
+>> sp|B6J5K3|MURG_COXB1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.7 0.1 2.6e-33 1.5e-30 1 135 [. 4 137 .. 4 141 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 110.7 bits; conditional E-value: 2.6e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+areL++++ +V l+++ glee++ + l+ +i++ ++++ l+ l+ +++ +a+++a +i+++
+ sp|B6J5K3|MURG_COXB1 4 ILIIAGGTGGHIFPALAVARELREQEVDVQwLGVKGGLEEKLvpDSFPLHLIQIKAF-RGKR---GLQQLLMPLRLVRAVFQAYRIIRQ 88
+ 6899*************************************9666666666666666.5555...66777778888899********** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +kpdv++g+ggyva++ ++aa+ + p++++Eqn+ipgl+n++l++ a+
+ sp|B6J5K3|MURG_COXB1 89 FKPDVILGMGGYVAGPGGLAAWITRTPLIIHEQNSIPGLTNRVLAKMAK 137
+ ********************************************99886 PP
+
+>> sp|Q820X3|MURG_COXBU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.7 0.1 2.6e-33 1.5e-30 1 135 [. 4 137 .. 4 141 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 110.7 bits; conditional E-value: 2.6e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+areL++++ +V l+++ glee++ + l+ +i++ ++++ l+ l+ +++ +a+++a +i+++
+ sp|Q820X3|MURG_COXBU 4 ILIIAGGTGGHIFPALAVARELREQEVDVQwLGVKGGLEEKLvpDSFPLHLIQIKAF-RGKR---GLQQLLMPLRLVRAVFQAYRIIRQ 88
+ 6899*************************************9666666666666666.5555...66777778888899********** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +kpdv++g+ggyva++ ++aa+ + p++++Eqn+ipgl+n++l++ a+
+ sp|Q820X3|MURG_COXBU 89 FKPDVILGMGGYVAGPGGLAAWITRTPLIIHEQNSIPGLTNRVLAKMAK 137
+ ********************************************99886 PP
+
+>> sp|Q042P9|MURG_LACGA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.8 0.0 5.2e-33 2.9e-30 1 137 [. 3 143 .. 3 145 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 109.8 bits; conditional E-value: 5.2e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.....EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.....latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakei 83
+ v+++ggGT+G+++P++Al ++L++r ++t +gle+++ ++ag+++++++++ ++ +k lk++ ++ + ka+++ak+i
+ sp|Q042P9|MURG_LACGA 3 VIFSGGGTGGHIYPIMALIERLKERKLVTNdeilfVGTDRGLESKIvPAAGVPFRTLKIK-GFDRKH-PLKNFETIELFIKATKEAKQI 89
+ 689***********************66659999**************************.****98.********************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +k++kpdvvvg+ggyv+++++++a++ +ip++++E+n++ gl+nk+l+ +++++
+ sp|Q042P9|MURG_LACGA 90 IKDFKPDVVVGTGGYVSGAIVYEAAKMHIPTIIHESNSVVGLANKFLAHYVDKI 143
+ ***************************************************987 PP
+
+>> sp|B2HGR6|MURG_MYCMM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 111.4 0.9 1.7e-33 9.6e-31 1 138 [. 22 166 .. 22 167 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 111.4 bits; conditional E-value: 1.7e-33
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L +++Vr l+t +gle+++ +++g++ + i+p +l++k s + + + ++++a+r+++++l
+ sp|B2HGR6|MURG_MYCMM 22 VVLAGGGTAGHVEPAMAVADALSVLEPNVRitaLGTARGLETRLvPARGYHLELITPV-PLPRKP-SGDLARLPPRVWRAVRETRAVLD 108
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH.....HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal.....lagipanvaEqngipglvnkllprrangvl 138
+ +dvv+gfggyva++a++aa+ +++ip++++E+n+++gl+n++ r+a++vl
+ sp|B2HGR6|MURG_MYCMM 109 LVDADVVIGFGGYVALPAYLAARgipglRRRIPVVIHEANARAGLANRVGLRTADRVL 166
+ ***************************9****************************97 PP
+
+>> sp|Q0VS02|MURG_ALCBS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.9 0.2 4.8e-33 2.7e-30 1 132 [. 5 136 .. 5 140 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 109.9 bits; conditional E-value: 4.8e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A+a++L++rG ++ l++++g+e + +++g+e+ ++ + +l+ + ++l+ +++ l+a+ +a+++++
+ sp|Q0VS02|MURG_ALCBS 5 VLIMAGGTGGHVFPALAVADQLRTRGFDILwLGAENGMEGNLvRQYGYEIAELSVS-RLRGGG-IKRKLTAPFNLLRAVLQARQLIRAR 91
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGG CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllpr 132
+ +p + vgfgg+++++ ++aa+l+++p++v+Eqn++pgl+n+ll+r
+ sp|Q0VS02|MURG_ALCBS 92 QPVLAVGFGGFASGPGGLAARLCKVPVVVHEQNAVPGLTNRLLSR 136
+ *****************************************9987 PP
+
+>> sp|Q0RNP1|MURG_FRAAA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 111.2 1.6 1.9e-33 1.1e-30 1 133 [. 5 139 .. 5 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 111.2 bits; conditional E-value: 1.9e-33
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L++++++ r l+t gle+++ +++g+e +++ + +++ +++ lk + + ++a+r+a ++l
+ sp|Q0RNP1|MURG_FRAAA 5 VVLAGGGTAGHVEPALAVADALRAADPRARltlLGTATGLEARLvPARGYELATVPKV-PMPRRP-TPALLKLPVRLFDAVRQAGATLD 91
+ 79********************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprr 133
+ + ++dvvvgfggyv+++a++aa+++gip++v+E+n +pg++n+l +r+
+ sp|Q0RNP1|MURG_FRAAA 92 RVRADVVVGFGGYVSVPAYLAARRRGIPIVVHEANPLPGMANRLGARF 139
+ *******************************************98876 PP
+
+>> sp|Q2RK79|MURG_MOOTA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.3 0.5 3.7e-33 2.1e-30 1 131 [. 3 135 .. 3 142 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 110.3 bits; conditional E-value: 3.7e-33
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+v+Pa+A+ar+L+++ + V+ ++t +gle+ v + agl+ +i+++ +l ++ +k+++ l + +++l +a + ++
+ sp|Q2RK79|MURG_MOOTA 3 VIITGGGTGGHVYPALAIARGLKEARPGVEllyIGTARGLEADVvPRAGLTLATITVQ-GLVRRQ-VWKNIPALVKTGRGLGEAWQQVR 89
+ 689*******************************************************.776655.9********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSG CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllp 131
+ +++pdvvvg+ggyv++++++aa+l+g+p++++Eqn+ pg++n+ll+
+ sp|Q2RK79|MURG_MOOTA 90 RFRPDVVVGTGGYVSGPVCLAAALQGVPVILHEQNAFPGVTNRLLA 135
+ ******************************************9875 PP
+
+>> sp|Q1IXV9|MURG_DEIGD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 111.0 1.8 2.2e-33 1.3e-30 1 137 [. 4 141 .. 4 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 111.0 bits; conditional E-value: 2.2e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +v+a+gGT+G+++PavA+ reL +rGhe l+ g+ee+v +e+gl+++ ++++ kl+++++ ++el++ +++ +a++ l++a
+ sp|Q1IXV9|MURG_DEIGD 4 IVMATGGTGGHIYPAVAVSRELLARGHEAVlLGQRGGMEERVaAEQGLPFQGVNAG-KLARSGQGRPDPRELLRAARGVAEARAFLRDA 91
+ 79**************************999*************************.******************************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +p +vvgfgg+++++ ++aa +gip++++Eqn++ gl+++l + ra v
+ sp|Q1IXV9|MURG_DEIGD 92 RPGAVVGFGGFASLPGVLAAQTLGIPTVLHEQNARLGLTQRLAAGRARAV 141
+ *******************************************9999876 PP
+
+>> sp|Q74JY4|MURG_LACJO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.9 0.0 9.8e-33 5.5e-30 1 137 [. 3 143 .. 3 145 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 108.9 bits; conditional E-value: 9.8e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.....EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.....latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakei 83
+ v+++ggGT+G+++P++Al ++L++r ++t +gle+++ ++ag+++++++++ ++ +k lk++ ++ + ka+++ak+i
+ sp|Q74JY4|MURG_LACJO 3 VIFSGGGTGGHIYPIMALIERLKERKLVTNdeilfVGTDRGLESKIvPAAGVPFKTLKIK-GFDRKH-PLKNFETIELFIKATKEAKQI 89
+ 689***********************66659999**************************.****98.********************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +k++kpdvvvg+ggyv+++++++a++ ++p++++E+n++ gl+nk+l+ +++++
+ sp|Q74JY4|MURG_LACJO 90 IKNFKPDVVVGTGGYVSGAIVYEAAKMHVPTIIHESNSVVGLANKFLAHYVDKI 143
+ ***************************************************987 PP
+
+>> sp|A5MZ55|MURG_CLOK5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.4 0.0 6.9e-33 3.9e-30 1 138 [. 4 141 .. 4 142 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 109.4 bits; conditional E-value: 6.9e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++l+ggG++G+v P +Al +L++ G+e+ ++t+ g+e+++ e+++++++ i ++ kl++++ +k++++++++ k++++a +i++++
+ sp|A5MZ55|MURG_CLOK5 4 IILTGGGSAGHVTPNLALIPKLKELGYEIQyIGTESGIEREIiENEKIKYHVISSG-KLRRYF-DIKNFTDPFKVIKGIFQAIFIMRKE 90
+ 78******************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kp+vv++ gg+v++++++aa +gip++ +E++ pgl+n+l++ ++++v
+ sp|A5MZ55|MURG_CLOK5 91 KPNVVFSKGGFVSVPVVFAAYINGIPVIAHESDITPGLANRLSSPYCTKVC 141
+ ***********************************************9985 PP
+
+>> sp|A1TKD1|MURG_ACIAC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.5 0.4 6.5e-33 3.7e-30 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 109.5 bits; conditional E-value: 6.5e-33
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+++P +A+a+eL++rG++V+ l+tp +e+++ + +g +++pi+ +++ k+ + + +++ l+a+ +a +++++ +
+ sp|A1TKD1|MURG_ACIAC 8 LVMAGGTGGHIFPGLAVAEELRARGWKVHwLGTPGSMESRIvPPQGFAFEPIDFS-GVRGKG-LATLALLPLRLLRAFWQALAVVRRVQ 94
+ 689****************************************************.******.99999********************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvvvg ggyv + + a l+g p++v+Eqn+++glvnk+l+ a++v+
+ sp|A1TKD1|MURG_ACIAC 95 PDVVVGLGGYVTFPGGMMAVLCGKPLVVHEQNSVAGLVNKVLAGVADRVF 144
+ ********************************************999997 PP
+
+>> sp|B7J0L2|MURG_BORBZ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.3 0.0 7.6e-33 4.3e-30 1 139 [] 7 148 .. 7 148 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 109.3 bits; conditional E-value: 7.6e-33
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ + ++ggGT+G+v+P +++ ++L++ + e++ ++ ++ +ee++ e++++++ +i+++ kl++++ s+k++++++++ ++ k++++l
+ sp|B7J0L2|MURG_BORBZ 7 IFFTGGGTGGHVFPGISIIQKLKEFDNEIEffwIGKKNSIEEKLikEQDNIKFISIPCG-KLRRYF-SFKNFTDFFKVILGIIKSFYVL 93
+ 679****************************************99**************.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ k++kp++++++gg+v+++a+ia++l++i+ + +E + pgl++k+++++an++++
+ sp|B7J0L2|MURG_BORBZ 94 KKYKPQLIYATGGFVSTPAIIASSLLKIKSITHEMDLDPGLATKINSKFANNIHI 148
+ ***************************************************9985 PP
+
+>> sp|O51708|MURG_BORBU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.3 0.0 7.6e-33 4.3e-30 1 139 [] 7 148 .. 7 148 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 109.3 bits; conditional E-value: 7.6e-33
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ + ++ggGT+G+v+P +++ ++L++ + e++ ++ ++ +ee++ e++++++ +i+++ kl++++ s+k++++++++ ++ k++++l
+ sp|O51708|MURG_BORBU 7 IFFTGGGTGGHVFPGISIIQKLKEFDNEIEffwIGKKNSIEEKLikEQDNIKFISIPCG-KLRRYF-SFKNFTDFFKVILGIIKSFYVL 93
+ 679****************************************99**************.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ k++kp++++++gg+v+++a+ia++l++i+ + +E + pgl++k+++++an++++
+ sp|O51708|MURG_BORBU 94 KKYKPQLIYATGGFVSTPAIIASSLLKIKSITHEMDLDPGLATKINSKFANNIHI 148
+ ***************************************************9985 PP
+
+>> sp|Q15Q17|MURG_PSEA6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.3 0.7 7.4e-33 4.2e-30 2 138 .. 16 152 .. 15 153 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 109.3 bits; conditional E-value: 7.4e-33
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++ ++++ l+t ++e+ + ++ag e+ i++ +++ ++ ++ l +++ ka+ +a+ ++k+ k
+ sp|Q15Q17|MURG_PSEA6 16 LVMAGGTGGHVFPGLAVAQALKEQNWHIHwLGTAQRMEADLvPKAGFEISFIDIA-GVRGNG-LVRLLAAPFKIIKAVIQARGVIKQVK 102
+ 789*************************************99*************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+gg+++++ ++aa+l g p++++Eqn+ pg++n+ll+r an+vl
+ sp|Q15Q17|MURG_PSEA6 103 PDVVIGMGGFASGPGGVAAWLMGKPLVLHEQNAAPGMTNRLLARIANKVL 152
+ ************************************************97 PP
+
+>> sp|A7A179|ATG26_YEAS7 Sterol 3-beta-glucosyltransferase OS=Saccharomyces cerevisiae (strain YJM789) GN=ATG26 PE=3 SV
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.9 0.0 1e-32 5.7e-30 2 138 .. 743 878 .. 742 879 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 108.9 bits; conditional E-value: 1e-32
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ l+++G+rGdv+P++Al+++L ++Gh+V ++t+ ++++fve++g+++++i+++ v++ + + +k+l+e+ ++ +
+ sp|A7A179|ATG26_YEAS7 743 GLLTIGSRGDVQPYIALGKGLIKEGHQVVIITHSEFRDFVESHGIQFEEIAGNpvelmslmVENES--MNVKMLREASSK-------F 821
+ 589***************************************************999997777777..899999999999.......* PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + +a +++++++++ + ++li++++a++ +++aE+++ip+++++++p+++++++
+ sp|A7A179|ATG26_YEAS7 822 RGWIDALLQTSWEVCNRRKFDILIESPSAMVGIHIAEALQIPYFRAFTMPWTRTRAY 878
+ *****************************************************9987 PP
+
+>> sp|Q1D0T0|MURG_MYXXD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.1 0.4 8.5e-33 4.8e-30 1 137 [. 4 142 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 109.1 bits; conditional E-value: 8.5e-33
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v++aggGT+G+++P +Ala+e+ +r h+ + ++t++g+e++v +++g++ + ++++ +l+ k+ +l+ lk l++ a+ ++++il+
+ sp|Q1D0T0|MURG_MYXXD 4 VLIAGGGTGGHLFPGIALAEEVVTRHHRNEvvfVGTERGIESRVvPKEGYPLELVKVQ-GLKGKG-FLSLLKALFALPLAFIESFRILA 90
+ 799************************755559*************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ ++kpdvvvg+ggy++++++ aa+l gip+ + Eqn++pg++nk+l r + v
+ sp|Q1D0T0|MURG_MYXXD 91 RQKPDVVVGVGGYASGPVVMAAWLMGIPTAIQEQNALPGFTNKVLGRIVRVV 142
+ ********************************************99887655 PP
+
+>> sp|Q1QVG7|MURG_CHRSD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.0 0.7 4.5e-33 2.5e-30 1 138 [. 9 146 .. 9 147 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 110.0 bits; conditional E-value: 4.5e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v Pa++lar+L++rG V+ l++p+g+e+++ ++a + + i++ +l+ ++ + + l+ +++ ka+ +a+++++++
+ sp|Q1QVG7|MURG_CHRSD 9 VLIMAGGTGGHVVPALSLARALRARGVSVEwLGSPRGIENRLvPAADIVLHRIQVA-GLRGNG-MAGWLLAPWRLAKAVWQARQVIAKF 95
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p++vvg gg+++++ ++aa+l + ++v+Eqn+++g++n++l+r a+gv+
+ sp|Q1QVG7|MURG_CHRSD 96 DPQLVVGLGGFASGPGGLAAWLMRRRLIVHEQNAVAGMTNRYLSRLADGVY 146
+ *************************************************98 PP
+
+>> sp|A4VIH8|MURG_PSEU5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 110.0 0.3 4.6e-33 2.6e-30 1 132 [. 5 136 .. 5 142 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 110.0 bits; conditional E-value: 4.6e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A are+q+rG+ V+ l+tp+g+e+++ ++agl+ + i++ +l+ k+ + +k +++ ++l++a++i++e
+ sp|A4VIH8|MURG_PSEU5 5 VLIMAGGTGGHVFPALACAREFQTRGYAVHwLGTPRGIENELvPAAGLPLHLIQVS-GLRGKG-LASLIKAPLQLVRSLFQARRIIREL 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGG CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllpr 132
+ +p v+g ggyv ++ ++aa+lag+p++++Eqn+++g +n+ l
+ sp|A4VIH8|MURG_PSEU5 92 RPVCVLGLGGYVTGPGGLAAKLAGVPLVIHEQNAVAGTANRSLVP 136
+ ****************************************98765 PP
+
+>> sp|Q38XM8|MURG_LACSS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.3 0.0 1.5e-32 8.3e-30 3 138 .. 2 143 .. 1 144 [. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 108.3 bits; conditional E-value: 1.5e-32
+ EE-------HHHHHHHHHHHHH---..EEE..EEETGGGHHHH.HH---EEEE----S------....-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrGh..eVr..latppgleefv.eeagleavpigpdvklwakle...slktlkelaeglkalrkakei 83
+ ++ggGT+G+++Pa+Al ++L++rG ++t++gle+++ + +g+++++++++ +++++++ ++lk++ + ++++ak+
+ sp|Q38XM8|MURG_LACSS 2 ISGGGTGGHIYPALALIERLKQRGLldA-VlyVGTERGLESKIvPDQGIDFKTLEIQ-GFKRSMNlngIKTNLKTIELFMSSIKSAKKM 88
+ 789*********************6423.36**************************.7777554111568999999999********* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +ke+kpdvv+g+ggyv++ +l+aa+++++p++++Eqn+ +g++nk+l+r++++v+
+ sp|Q38XM8|MURG_LACSS 89 IKEFKPDVVIGTGGYVSGSLLYAASRLKVPTIIHEQNSAAGVTNKFLARFVDKVA 143
+ *****************************************************97 PP
+
+>> sp|A1SU19|MURG_PSYIN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.3 0.1 1.5e-32 8.3e-30 2 138 .. 8 144 .. 7 145 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 108.3 bits; conditional E-value: 1.5e-32
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ v+++gGT+G+v+P +A+a++L+++G+ V l+t +++e+++ +++g+e+ i++ + + ++ + l+ + + k++ +a+ +lk+ +
+ sp|A1SU19|MURG_PSYIN 8 VVMAGGTGGHVFPGLAVADALKEQGWAVSwLGTADRMEAQLvPKHGYEIDFIDIA-GIRGNG-LKRLLMAPIRIIKSIWQARSVLKKRR 94
+ 899****************************************************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ d+v+g+gg+++++ +iaa++ gip++++Eqn+++gl+n++l+ + ++vl
+ sp|A1SU19|MURG_PSYIN 95 VDLVLGMGGFASGPGGIAAWSMGIPVILHEQNAVAGLTNRILSLFSKRVL 144
+ ******************************************99888876 PP
+
+>> sp|Q31I59|MURG_THICR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.5 0.0 1.3e-32 7.1e-30 1 138 [. 4 141 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 108.5 bits; conditional E-value: 1.3e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+P +Ala++L ++ + l+t++g+e+++ +a++++++i++ +l+ ++ l+ lk +++++ka+r+a++i++++
+ sp|Q31I59|MURG_THICR 4 ILIMAGGTGGHVFPGLALAEALADKQVKTVwLGTCNGMEKQWvDAAKIPFYTIAIS-GLRGNG-LLGWLKAPFNVFKAWRQARYIIQQE 90
+ 689*********************9988889*************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+gg+v ++ ++aal+++ p++++Eqn+ pgl+nkll+ +a++v+
+ sp|Q31I59|MURG_THICR 91 APDLVLGMGGFVCGPGGLAALSLNKPLVLHEQNATPGLTNKLLAPFAKKVI 141
+ ************************************************986 PP
+
+>> sp|Q04ET0|MURG_OENOB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.3 0.0 1.5e-32 8.7e-30 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 108.3 bits; conditional E-value: 1.5e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+Al + L + +++ + +++ +gle + +++gl+++++ ++ ++ ++l sl+++k++ + ka++k+k i+
+ sp|Q04ET0|MURG_OENOB 3 IIVSGGGTGGHIYPALALVESLLKHEPDSKvlyIGSFRGLEGSIvPKTGLDFKQLHVQ-GFSRSL-SLTNFKTVNLFIKAVKKSKHIIH 89
+ 6899************************9999**************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd+v+g+ggyv++++l+aa +++ip++++Eqn+i+g++nk+l+r a++++
+ sp|Q04ET0|MURG_OENOB 90 DFKPDIVLGTGGYVSGAVLYAAQRLRIPTVINEQNSIAGVTNKFLSRGADRIA 142
+ *************************************************9987 PP
+
+>> sp|Q2KVG0|MURG_BORA1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 109.6 0.6 6.1e-33 3.4e-30 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 109.6 bits; conditional E-value: 6.1e-33
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G++ P +A+a+ L++rG++Vr l+ p+++e ++ +++g+e+ p+ + +l+ ++ + lk ++ +al +a+++++e
+ sp|Q2KVG0|MURG_BORA1 6 ILIMAGGTGGHIMPGLAVAEILRQRGWQVRwLGNPDKMEGKLvPARGIEMAPLRFQ-GLRGRG-VTALLKLPLLLTRALLQARKHMAEI 92
+ 689*****************************************************.****99.99*********************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pdvv+g+ggyva + ++ a+l++ p++v+Eqn+++g +n++l+r a++vl
+ sp|Q2KVG0|MURG_BORA1 93 QPDVVLGMGGYVAFPGGVVAALRRTPLVVHEQNAVAGTANRWLARMAKNVL 143
+ ***********************************************9997 PP
+
+>> sp|Q5R0M1|MURG_IDILO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.5 0.2 1.3e-32 7.1e-30 1 138 [. 4 142 .. 4 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 108.5 bits; conditional E-value: 1.3e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGG.GHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppg.leefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ v++a+ GT+G+++Pa+A+a++ ++ G++V l+t++g le++v ++a+ + ++i +++ ++ ++l ++ ka+ + +++lk
+ sp|Q5R0M1|MURG_IDILO 4 VLIAAAGTGGHIFPALAVAEQMRDNGWQVDwLGTQEGrLESRViPAANFPLHSISMT-GVRGHG-LKRKLFMPFTLAKAVLQCRRLLKT 90
+ 789*******************************98549******************.****99.777777777777************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p+vv+ fggyv ++ ++aa+l+gip++v+Eqn+ipg++++ll+ ran+v+
+ sp|Q5R0M1|MURG_IDILO 91 LQPQVVATFGGYVCAPMGLAAKLLGIPLVVHEQNAIPGMTTRLLAPRANKVM 142
+ **************************************************97 PP
+
+>> sp|Q5WAE4|MURG_BACSK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.1 0.0 1.8e-32 1e-29 1 136 [. 4 139 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 108.1 bits; conditional E-value: 1.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggG++G+v P +A+ +eL ++++ + +++ +g+e+++ e+ag+ + i ++ kl++++ +k+++++a+ +++r+a++ilk +
+ sp|Q5WAE4|MURG_BACSK 4 IIFTGGGSAGHVTPNLAIINELNDKDWSIAyIGSYEGIERQLvEKAGIRYFGISSG-KLRRYM-DWKNVTDIARIANGFRQARKILKAE 90
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ kpdvv++ gg+v ++++ aa ++ip++++E++ pgl+n+l +r+an+
+ sp|Q5WAE4|MURG_BACSK 91 KPDVVFSKGGFVTVPVVAAAYTLRIPVHLHESDLTPGLANRLAKRFANT 139
+ ***********************************************97 PP
+
+>> sp|Q2JD50|MURG_FRASC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.6 1.0 2.4e-32 1.3e-29 1 131 [. 5 137 .. 5 141 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 107.6 bits; conditional E-value: 2.4e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L++ + +Vr l+t gle+++ +++g e +++ + +++ +++ +k +a++l+a+ +a e+l
+ sp|Q2JD50|MURG_FRASC 5 VVLAGGGTAGHVEPALAVADALRATDSRVRltlLGTATGLEARLvPARGHELATVPKV-PMPRRP-TPAVFKLPARFLDAICQAGETLD 91
+ 79********************************************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSG CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllp 131
+ ++dvvvgfggyv+++a++aa+++gip++v+E+n +pgl+n+l +
+ sp|Q2JD50|MURG_FRASC 92 LVRADVVVGFGGYVSAPAYLAARRRGIPIVVHEANPLPGLANRLGA 137
+ ******************************************9865 PP
+
+>> sp|B5ELC3|MURG_ACIF5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.2 0.9 1.6e-32 8.8e-30 1 138 [. 5 142 .. 5 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 108.2 bits; conditional E-value: 1.6e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++a+gGT+G+v+Pa+A+a++L+++G eV+ +t g+e+++ +e+g++ ++++ + +l+ k+ + l+ ++++ +a+ +a++il++
+ sp|B5ELC3|MURG_ACIF5 5 VLIAAGGTGGHVFPALAVADALRAQGVEVTfAGTATGMEARLvPERGYTLHTLDMQ-GLRGKG-IRRWLRAPWRVSRAILQARRILRQT 91
+ 799***************************889***********************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +vv+g+ggyv ++++iaa+ +g p+ ++Eqn+++gl+n+ll+ a +v+
+ sp|B5ELC3|MURG_ACIF5 92 RSHVVLGMGGYVTAPVGIAAWTLGRPLCLHEQNAVAGLSNRLLAPLARRVF 142
+ ******************************************998888876 PP
+
+>> sp|B7J3V2|MURG_ACIF2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.2 0.9 1.6e-32 8.8e-30 1 138 [. 5 142 .. 5 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 108.2 bits; conditional E-value: 1.6e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++a+gGT+G+v+Pa+A+a++L+++G eV+ +t g+e+++ +e+g++ ++++ + +l+ k+ + l+ ++++ +a+ +a++il++
+ sp|B7J3V2|MURG_ACIF2 5 VLIAAGGTGGHVFPALAVADALRAQGVEVTfAGTATGMEARLvPERGYTLHTLDMQ-GLRGKG-IRRWLRAPWRVSRAILQARRILRQT 91
+ 799***************************889***********************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +vv+g+ggyv ++++iaa+ +g p+ ++Eqn+++gl+n+ll+ a +v+
+ sp|B7J3V2|MURG_ACIF2 92 RSHVVLGMGGYVTAPVGIAAWTLGRPLCLHEQNAVAGLSNRLLAPLARRVF 142
+ ******************************************998888876 PP
+
+>> sp|Q0SM88|MURG_BORAP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.4 0.0 1.4e-32 7.7e-30 1 139 [] 7 148 .. 7 148 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 108.4 bits; conditional E-value: 1.4e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ + ++ggGT+G+++P +++ ++L++ + e++ ++ ++ +ee++ e+ ++++ +i+++ kl++++ s++++++++++ ++ k+++il
+ sp|Q0SM88|MURG_BORAP 7 IFFTGGGTGGHIFPGISIIQKLKELDNEIEffwIGKKNSIEEKLikEQNNIKFISIPCG-KLRRYF-SFQNFTDFFKVIFGIIKSFYIL 93
+ 679****************************************99**************.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ k++kp++v+++gg+v+++ +ia++l++i+++ +E + pgl++k+++++an++++
+ sp|Q0SM88|MURG_BORAP 94 KKYKPQIVYATGGFVSTPTIIASSLLKIKRITHEMDLDPGLATKINSKFANKIYI 148
+ ****************************************************986 PP
+
+>> sp|Q4FQV9|MURG_PSYA2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.9 0.2 1.9e-32 1.1e-29 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 107.9 bits; conditional E-value: 1.9e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++ GT+G+v+Pa+A+ +eL +rG ++ l+tp+g+e+ + + +g+++++i+ + +l+ k+ + lk + l a+ ++ +i++ +
+ sp|Q4FQV9|MURG_PSYA2 6 ILMMAAGTGGHVFPALAVSEELSKRGAIIHwLGTPNGMENGLvAPTGYPFHAIEMQ-GLRGKG-IGRLLKMPVTLLSATMAVIKIIRGN 92
+ 6899**********************9999************9*************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ k+d vvgfggyv+++ +iaa+l + p++++Eqn+i+g++n++l++ a++vl
+ sp|Q4FQV9|MURG_PSYA2 93 KIDMVVGFGGYVSAPGGIAARLTKTPLIIHEQNAIAGMSNRYLAKMATKVL 143
+ ************************************************997 PP
+
+>> sp|Q730T5|MURG2_BACC1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.6 0.0 5.1e-32 2.9e-29 1 138 [. 4 141 .. 4 142 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 106.6 bits; conditional E-value: 5.1e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +v++ggG++G+v P +A+ +Lq++ +++ ++++ g+e+++ e++g+++++i+++ kl++++ lk++k+++ + k++ +a +++
+ sp|Q730T5|MURG2_BACC1 4 IVFTGGGSAGHVTPNLAIIPHLQEQNWDISyIGSHQGIEKTIiEKEGIPYYSIASG-KLRRYF-DLKNIKDPFLVMKGVMDAYVRIRK 89
+ 79******************************************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdv+++ gg+v+++++i+ +l+++p+ ++E++ pgl+nk+ r+a +++
+ sp|Q730T5|MURG2_BACC1 90 LKPDVIFSKGGFVSVPVVIGGWLNRVPVLLHESDMTPGLANKIALRFASKIF 141
+ ***********************************************99987 PP
+
+>> sp|Q1LSW5|MURG_BAUCH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.7 0.0 4.6e-32 2.6e-29 2 138 .. 7 143 .. 6 144 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 106.7 bits; conditional E-value: 4.6e-32
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+++P +A+a+ ++G++Vr l+t++++e+ + +++g++++ + + ++ ++ + ++++ + + l+a+ ++ +i+++++
+ sp|Q1LSW5|MURG_BAUCH 7 IIVAGGTGGHIFPGLAIANNMITQGWDVRwLGTKNRIEADLvPKHGITTYFLSIY-GYGLHG-KKQKILAIVSILQAVLQSYYIMRKWR 93
+ 6789************************************99*********9999.999999.99999999999*************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+v+g+ggy++++ ++aa+ ++ip++++Eqn + gl+n +l+++a++vl
+ sp|Q1LSW5|MURG_BAUCH 94 PDIVLGMGGYISGPCGLAAWMCKIPLVIHEQNRVTGLTNYYLSKFAKKVL 143
+ ***********************************************997 PP
+
+>> sp|Q9WY74|MURG_THEMA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.1 0.2 1.7e-32 9.8e-30 1 139 [] 4 146 .. 4 146 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 108.1 bits; conditional E-value: 1.7e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpd.vklwakleslktlkelaeglkalrkakeil 84
+ v+ aggGT+G+++P++A+ ++L +r +V+ +a++ +++e+v ++++ e++++ +d +l + l+++k+l+++++ + a+ ++k++l
+ sp|Q9WY74|MURG_THEMA 4 VAAAGGGTGGHLYPLLAILETLAKRV-DVKvlfFAVKGKIDERVvRKDHPEFETVSIDvRGLLRPLHHPKNLWRTLKIGIATIEVKKHL 91
+ 5789*********************9.99999**********************7777669999************************* PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ k++kpd+vv +ggy+++++++aa+ +gip++v+Eqn +pgl+ k+l+++a++v+v
+ sp|Q9WY74|MURG_THEMA 92 KRFKPDLVVLTGGYISGVVGLAAKDLGIPIFVHEQNVVPGLAVKVLSQYAKKVFV 146
+ ****************************************************986 PP
+
+>> sp|B1L9S1|MURG_THESQ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.1 0.1 1.7e-32 9.8e-30 1 139 [] 4 146 .. 4 146 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 108.1 bits; conditional E-value: 1.7e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpd.vklwakleslktlkelaeglkalrkakeil 84
+ ++ aggGT+G+++P++A+ ++L +r +V+ +a++ +++e+v ++++ e++++ +d +l + l+++k+l+++++ + a+ ++k++l
+ sp|B1L9S1|MURG_THESQ 4 IAAAGGGTGGHLYPLLAILETLAKRV-DVKvlfFAVKGKIDERVvRKDHPEFETVSIDvRGLLRPLHHPKNLWRTLKIGIATIEVKKHL 91
+ 5789*********************9.99999**********************7777669999************************* PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ k++kpd+vv +ggy+++++++aa+ +gip++v+Eqn +pgl+ k+l+++a++v+v
+ sp|B1L9S1|MURG_THESQ 92 KRFKPDLVVLTGGYISGVVGLAAKDLGIPIFVHEQNVVPGLAVKVLSQYAKKVFV 146
+ ****************************************************986 PP
+
+>> sp|A5IKI9|MURG_THEP1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.1 0.2 1.7e-32 9.8e-30 1 139 [] 4 146 .. 4 146 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 108.1 bits; conditional E-value: 1.7e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpd.vklwakleslktlkelaeglkalrkakeil 84
+ v+ aggGT+G+++P++A+ ++L +r +V+ +a++ +++e+v ++++ e++++ +d +l + l+++k+l+++++ + a+ ++k++l
+ sp|A5IKI9|MURG_THEP1 4 VAAAGGGTGGHLYPLLAILETLAKRV-DVKvlfFAVKGKIDERVvRKDHPEFETVSIDvRGLLRPLHHPKNLWRTLKIGIATIEVKKHL 91
+ 5789*********************9.99999**********************7777669999************************* PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ k++kpd+vv +ggy+++++++aa+ +gip++v+Eqn +pgl+ k+l+++a++v+v
+ sp|A5IKI9|MURG_THEP1 92 KRFKPDLVVLTGGYISGVVGLAAKDLGIPIFVHEQNVVPGLAVKVLSQYAKKVFV 146
+ ****************************************************986 PP
+
+>> sp|A4FLW0|MURG_SACEN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.5 0.6 2.6e-32 1.4e-29 1 138 [. 22 160 .. 22 161 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 107.5 bits; conditional E-value: 2.6e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vv+aggGT+G++ePa+Ala++++r ++ r l+t++gle+++ +++g++ + ++p + ++k +++ lk ++++++++++++e+l
+ sp|A4FLW0|MURG_SACEN 22 VVVAGGGTAGHIEPALALADAVRRLRPDARvtaLGTERGLENRLvPARGYPLELVPPV-PMPRKP-TPELLKLPLKVRESVKRTREVLD 108
+ 79****************************99**************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +dvvvgfggyv+++a++a ++ + p++v+E+n+++gl+nk+ +++a++vl
+ sp|A4FLW0|MURG_SACEN 109 RVGADVVVGFGGYVSLPAYLA-ARGKTPIVVHEANARAGLANKVGAKFAERVL 160
+ ********************5.56789***********************997 PP
+
+>> sp|Q9RNM6|MURG_ZYMMO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.7 0.9 2.3e-32 1.3e-29 2 138 .. 8 142 .. 7 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 107.7 bits; conditional E-value: 2.3e-32
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpd.vklwakleslktlkelaeglkalrkakeilkeak 88
+ +la+gGT+G++ Pa Ala+eL+rrGh+V l+t ++ ++f + +++++++++ +++ k+ +++++++++g +++a +++++++
+ sp|Q9RNM6|MURG_ZYMMO 8 ILAAGGTGGHMIPAHALAVELMRRGHHVALVTDERGTRFPeLFKDVQIHQLPAGrLTGGVKG-LFQAMRNIWAG---RERALTLYENFT 92
+ 79**************************************99***********986666667.89999999999...************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p++vvgfggy a++al+aa +a+ip++++Eqn+++g +n++l+ r++ ++
+ sp|Q9RNM6|MURG_ZYMMO 93 PAAVVGFGGYPALPALLAAFKAKIPTVIHEQNAVMGRTNRFLAGRVDAIA 142
+ *********************************************99875 PP
+
+>> sp|Q06321|ATG26_YEAST Sterol 3-beta-glucosyltransferase OS=Saccharomyces cerevisiae GN=ATG26 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.1 0.0 3.5e-32 1.9e-29 2 138 .. 743 878 .. 742 879 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 107.1 bits; conditional E-value: 3.5e-32
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ l+++G+rGdv+P++Al+++L ++Gh+V ++t+ ++++fve++g+++++i+++ v++ + + +k+l+e+ ++ +
+ sp|Q06321|ATG26_YEAST 743 GLLTIGSRGDVQPYIALGKGLIKEGHQVVIITHSEFRDFVESHGIQFEEIAGNpvelmslmVENES--MNVKMLREASSK-------F 821
+ 589***************************************************999997777777..899999999999.......* PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + +a +++++++++ + ++li++++a++ ++++E+++ip+++++++p+++++++
+ sp|Q06321|ATG26_YEAST 822 RGWIDALLQTSWEVCNRRKFDILIESPSAMVGIHITEALQIPYFRAFTMPWTRTRAY 878
+ *****************************************************9987 PP
+
+>> sp|Q9PF81|MURG_XYLFA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.8 2.1 2.2e-32 1.2e-29 1 138 [. 15 152 .. 15 153 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 107.8 bits; conditional E-value: 2.2e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a +L++rG V l+++ ++e+++ +++g+e+++i++ +++ ++ +l+ l ++ ++l a+++a+++l+++
+ sp|Q9PF81|MURG_XYLFA 15 VMILAGGTGGHIFPGLAVAGALRARGVPVVwLGATGKMETHLvPKHGIEIQTIAVS-GVRGHG-MLALLGTPVRVLPAIFAAMRVLRRY 101
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p vvv+fgg++a++ +iaa+l g p++v+Eqn pg++n++l+r a +vl
+ sp|Q9PF81|MURG_XYLFA 102 RPRVVVSFGGFAAGPGGIAARLMGLPLIVHEQNRAPGMTNRILARVARRVL 152
+ **********************************************99987 PP
+
+>> sp|Q5GW41|MURG_XANOR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.4 1.0 1.4e-32 7.9e-30 1 138 [. 21 158 .. 21 159 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 108.4 bits; conditional E-value: 1.4e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a+ L++rG V+ l++ ++e+++ +++ +++ ++++ +l+ k+ ++k l ++++ +a+r+a ++l++
+ sp|Q5GW41|MURG_XANOR 21 VMILAGGTGGHIFPGLAVAKVLRARGVPVTwLGADGAMETRLvPQHDIPIDTLAIT-GLRGKG-MVKLLGAPLRVMRAVRAAGFVLRKR 107
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p +v++fgg++a++ ++aa+l+g+p+ v+Eqn pg++nk+l+r+a +vl
+ sp|Q5GW41|MURG_XANOR 108 QPRAVISFGGFAAGPGGLAARLLGAPLLVHEQNRAPGMTNKVLSRFARRVL 158
+ ************************************************997 PP
+
+>> sp|B2S3B6|MURG_TREPS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.6 0.1 2.5e-32 1.4e-29 1 139 [] 15 154 .. 15 154 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 107.6 bits; conditional E-value: 2.5e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vv++ggGT+G+++P +A+ ++L ++ Vr +++ +g ++ + e+agle++ i+++ k++++ s++++ +++++l ++ ++ il+
+ sp|B2S3B6|MURG_TREPS 15 VVFTGGGTGGHIFPGIAVFQALAQQA-AVRvvwIGAARGADRSIvESAGLEFCGITAG-KWRRYA-SVRNFFDVFRVLVGTVQSYCILR 100
+ 79********************9998.88888**************************.999999.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ +p+++++ gg+v+++++iaa+l++ip++ +E++ pgl++++++r+a+++lv
+ sp|B2S3B6|MURG_TREPS 101 ALRPQALFSKGGFVSVPPCIAAWLLRIPVVTHESDISPGLATRINARFADRILV 154
+ **************************************************9985 PP
+
+>> sp|O83535|MURG_TREPA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.6 0.1 2.5e-32 1.4e-29 1 139 [] 15 154 .. 15 154 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 107.6 bits; conditional E-value: 2.5e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vv++ggGT+G+++P +A+ ++L ++ Vr +++ +g ++ + e+agle++ i+++ k++++ s++++ +++++l ++ ++ il+
+ sp|O83535|MURG_TREPA 15 VVFTGGGTGGHIFPGIAVFQALAQQA-AVRvvwIGAARGADRSIvESAGLEFCGITAG-KWRRYA-SVRNFFDVFRVLVGTVQSYCILR 100
+ 79********************9998.88888**************************.999999.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ +p+++++ gg+v+++++iaa+l++ip++ +E++ pgl++++++r+a+++lv
+ sp|O83535|MURG_TREPA 101 ALRPQALFSKGGFVSVPPCIAAWLLRIPVVTHESDISPGLATRINARFADRILV 154
+ **************************************************9985 PP
+
+>> sp|Q0AJE1|MURG_NITEC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.3 0.0 3e-32 1.7e-29 3 138 .. 2 137 .. 1 138 [. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 107.3 bits; conditional E-value: 3e-32
+ EE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ +++gGT+G+v+P +A+ar+ q++G++V+ l+t +g+e+++ +++g +++ i+ +l+ k ++ l+ +++ ka +++ il++++p
+ sp|Q0AJE1|MURG_NITEC 2 IMAGGTGGHVFPGLAVARAMQAEGWRVIwLGTRNGMEATLvPQHGFTIELINFS-GLRGKK-PVSYLLLPWRLAKACWQSFCILRRQRP 88
+ 789***************************************************.****99.*************************** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++v+g+ggy a++ +i a l+g p+ ++Eqn i+gl+nk+l++ a ++l
+ sp|Q0AJE1|MURG_NITEC 89 QIVLGMGGYPALPGGIMAVLSGKPLLIHEQNRIAGLTNKILAKIASRIL 137
+ *******************************************999886 PP
+
+>> sp|B3PCM0|MURG_CELJU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 108.1 0.8 1.8e-32 1e-29 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 108.1 bits; conditional E-value: 1.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+eL++rG V+ l+t +g+e+++ ++a+++ i ++ +++ ++ + lk ++ ka+++a i+++
+ sp|B3PCM0|MURG_CELJU 6 ILVMAGGTGGHVFPALAVAEELRARGALVEwLGTAKGIENTLvPKANIPLNLISVE-GVRGRG-LTGLLKAPFLITKAVFQAISIIRKM 92
+ 789*****************************************************.****99.9************************ PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++d+v+gfgg+++++ ++aa+l+g p++++Eqn+++g +n+ll+r a +vl
+ sp|B3PCM0|MURG_CELJU 93 NADLVLGFGGFASGPGGVAARLLGKPLVIHEQNAVAGTTNRLLARIAQRVL 143
+ ***********************************************9987 PP
+
+>> sp|A5G8K0|MURG_GEOUR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.0 0.1 3.6e-32 2e-29 2 139 .] 4 143 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 107.0 bits; conditional E-value: 3.6e-32
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++P +A+a+e+ +r h + ++t++g+e+++ + g+ + i++ + + + l++++++a+ l ++ ++++ilke
+ sp|A5G8K0|MURG_GEOUR 4 LIAGGGTGGHLFPGIAVAEEFLARNHSNEvlfVGTERGIEARLlPRLGYRLECITAS-GIKGQS-PLAKIRSAAQLLYGYAQSRRILKE 90
+ 79************************77777**************************.9**999.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++pd+v+g+ggy+++++++aa+ +i ++++Eqn+ipgl+nkll+r+a++v++
+ sp|A5G8K0|MURG_GEOUR 91 FRPDLVLGVGGYASAPVVLAARGMQIRRFIHEQNAIPGLTNKLLARFAEKVFI 143
+ *************************************************9985 PP
+
+>> sp|A5U4I0|MURG_MYCTA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.8 1.0 2.2e-32 1.2e-29 1 138 [. 38 185 .. 38 186 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 107.8 bits; conditional E-value: 2.2e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L + +++Vr l+t +gle+++ +++g++ + i++ + ++k + + + ++++a+r+a+ +l
+ sp|A5U4I0|MURG_MYCTA 38 VVLAGGGTAGHVEPAMAVADALVALDPRVRitaLGTLRGLETRLvPQRGYHLELITAV-PMPRKP-GGDLARLPSRVWRAVREARDVLD 124
+ 79********************************************************.****99.999999999************** PP
+
+ HHHHHHHHHC----EEEE--HHH........HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal........lagipanvaEqngipglvnkllprrangvl 138
+ + +dvvvgfggyva++a++aa+ +++ip++++E+n+++gl+n++ + +a++vl
+ sp|A5U4I0|MURG_MYCTA 125 DVDADVVVGFGGYVALPAYLAARglplpprrRRRIPVVIHEANARAGLANRVGAHTADRVL 185
+ ***********************************************************97 PP
+
+>> sp|O06224|MURG_MYCTU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.8 1.0 2.2e-32 1.2e-29 1 138 [. 38 185 .. 38 186 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 107.8 bits; conditional E-value: 2.2e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+vePa+A+a++L + +++Vr l+t +gle+++ +++g++ + i++ + ++k + + + ++++a+r+a+ +l
+ sp|O06224|MURG_MYCTU 38 VVLAGGGTAGHVEPAMAVADALVALDPRVRitaLGTLRGLETRLvPQRGYHLELITAV-PMPRKP-GGDLARLPSRVWRAVREARDVLD 124
+ 79********************************************************.****99.999999999************** PP
+
+ HHHHHHHHHC----EEEE--HHH........HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal........lagipanvaEqngipglvnkllprrangvl 138
+ + +dvvvgfggyva++a++aa+ +++ip++++E+n+++gl+n++ + +a++vl
+ sp|O06224|MURG_MYCTU 125 DVDADVVVGFGGYVALPAYLAARglplpprrRRRIPVVIHEANARAGLANRVGAHTADRVL 185
+ ***********************************************************97 PP
+
+>> sp|Q4JW95|MURG_CORJK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 107.7 0.7 2.3e-32 1.3e-29 1 130 [. 13 144 .. 13 147 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 107.7 bits; conditional E-value: 2.3e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vv+aggGT+G++ePa+A+a++++++ ++ r l+t++gle+++ +++g + + i+p ++++kl + + +++ +kal+++k++l+
+ sp|Q4JW95|MURG_CORJK 13 VVVAGGGTAGHIEPAMAVAEAVRAQRPDARitaLGTTRGLETTLvPARGFDLQLIPPV-PVPRKL-NKDLATLPLRLRKALKETKRVLR 99
+ 79********************************************************.****99.99999999*************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ e ++dvv+gfggyv+++a++aa++++ip +v+E+n+++g++nkl
+ sp|Q4JW95|MURG_CORJK 100 EVEADVVIGFGGYVSAPAYLAARSLKIPFFVHEANARAGVANKLG 144
+ ******************************************975 PP
+
+>> sp|Q97GY4|MURG_CLOAB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.4 0.0 5.8e-32 3.3e-29 1 137 [. 6 142 .. 6 144 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 106.4 bits; conditional E-value: 5.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +v++ggG++G+v P +Al +L++ G+e++ ++t++g+e+ + e++++++ i ++ kl++++ +k++++++++ +++++ il+++
+ sp|Q97GY4|MURG_CLOAB 6 IVMTGGGSAGHVTPNLALVPKLKELGYEIEyIGTKDGIERSIiEKENIKYNCISSG-KLRRYI-DIKNFSDPFKVILGIFQSVSILRKK 92
+ 79******************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kp++v++ gg+v+++++iaa +++ip++ +E++ pgl+n++ ++++v
+ sp|Q97GY4|MURG_CLOAB 93 KPNIVFSKGGFVSVPVVIAAHFCRIPVIAHESDITPGLANRIAVPYCTKV 142
+ ********************************************999987 PP
+
+>> sp|Q9Z702|MURG_CHLPN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.8 0.0 4.5e-32 2.5e-29 1 137 [. 8 142 .. 8 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 106.8 bits; conditional E-value: 4.5e-32
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ v+la+gG++G++ Pa+++ +++ r+G++V l +gl+++ ++g+++++i+++ l+ l+ +k ++++++ + ++ ka++ lk +
+ sp|Q9Z702|MURG_CHLPN 8 VALAVGGSGGHIVPALSVKEAFSREGIDV-LLLGKGLKNHPsLQQGISYREIPSG--LPTVLNPIKIMSRTLSLCSGYLKARKELKIFD 93
+ 79***************************.999**********************..99999*************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pd+v+gfg+y+++++l+a l+++ip++++Eqn +pg+vn+l++r+a g+
+ sp|Q9Z702|MURG_CHLPN 94 PDLVIGFGSYHSLPVLLAGLSHKIPLFLHEQNLVPGKVNQLFSRYARGI 142
+ **********************************************997 PP
+
+>> sp|Q1Q944|MURG_PSYCK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.6 0.3 5e-32 2.8e-29 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 106.6 bits; conditional E-value: 5e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++ GT+G+v+Pa+A+ +eL +rG ++ l+tp+g+e+ + + +g+++++i+ + +l+ k+ + lk + l a+ ++ +i++ +
+ sp|Q1Q944|MURG_PSYCK 6 ILMMAAGTGGHVFPALAVSEELTKRGAMIHwLGTPNGMENGLvAPTGYPFHAIEMQ-GLRGKG-IGRLLKMPVTLLSATMAVIKIIRGN 92
+ 6899**********************9999************9*************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++d+vvgfggyv+++ +iaa+l + p++++Eqn+i+g++n++l++ a++vl
+ sp|Q1Q944|MURG_PSYCK 93 NIDIVVGFGGYVSAPGGIAARLTKTPLIIHEQNAIAGMSNRYLAKMATKVL 143
+ ************************************************997 PP
+
+>> sp|C0RE70|MURG_BRUMB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.6 0.3 9.8e-32 5.5e-29 1 137 [. 10 145 .. 10 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 105.6 bits; conditional E-value: 9.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa Ala+eL++rG++V+lat + +fv + a +++ i + + + + + ++ lk++++ +++ ++++++++ k
+ sp|C0RE70|MURG_BRUMB 10 IVLAAGGTGGHLFPAEALAHELRARGWDVHLATDARAQRFVgAFAQDHVHVIRSA-TIAGR-NPVALLKTFWSLWQGNLDSRKLFRRLK 96
+ 79***************************************87777777778888.55554.59************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy +++l+aa+ gip+ ++Eqn+++g +nk l+ r++ +
+ sp|C0RE70|MURG_BRUMB 97 PKLVVGFGGYPTLPPLYAASNMGIPTLIHEQNAVMGRANKGLAGRVKAI 145
+ ****************************************999998865 PP
+
+>> sp|Q8YI66|MURG_BRUME UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.6 0.3 9.8e-32 5.5e-29 1 137 [. 10 145 .. 10 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 105.6 bits; conditional E-value: 9.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa Ala+eL++rG++V+lat + +fv + a +++ i + + + + + ++ lk++++ +++ ++++++++ k
+ sp|Q8YI66|MURG_BRUME 10 IVLAAGGTGGHLFPAEALAHELRARGWDVHLATDARAQRFVgAFAQDHVHVIRSA-TIAGR-NPVALLKTFWSLWQGNLDSRKLFRRLK 96
+ 79***************************************87777777778888.55554.59************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy +++l+aa+ gip+ ++Eqn+++g +nk l+ r++ +
+ sp|Q8YI66|MURG_BRUME 97 PKLVVGFGGYPTLPPLYAASNMGIPTLIHEQNAVMGRANKGLAGRVKAI 145
+ ****************************************999998865 PP
+
+>> sp|Q3BXF2|MURG_XANC5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.2 0.9 6.7e-32 3.8e-29 1 138 [. 22 159 .. 22 160 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 106.2 bits; conditional E-value: 6.7e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a+ L++rG V+ l++ +++e+++ +++ +++ ++++ +l+ k+ +k l + ++ +a+r+a ++l++
+ sp|Q3BXF2|MURG_XANC5 22 VMILAGGTGGHIFPGLAVAKVLRARGVPVTwLGADDAMETRLvPQHDIPIDTLAIS-GLRGKG-VVKLLGAPVRVMRAVRAAGFVLRKR 108
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p +v++fgg++a++ ++aa+l+g+p+ v+Eqn pg++nk+l+r+a +vl
+ sp|Q3BXF2|MURG_XANC5 109 RPRAVISFGGFAAGPGGLAARLLGAPLLVHEQNRAPGMTNKVLSRFARRVL 159
+ ************************************************997 PP
+
+>> sp|B2S6Q4|MURG_BRUA1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.6 0.3 9.8e-32 5.5e-29 1 137 [. 10 145 .. 10 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 105.6 bits; conditional E-value: 9.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa Ala+eL++rG++V+lat + +fv + a +++ i + + + + + ++ lk++++ +++ ++++++++ k
+ sp|B2S6Q4|MURG_BRUA1 10 IVLAAGGTGGHLFPAEALAHELRARGWDVHLATDARAQRFVgAFAQDHVHVIRSA-TIAGR-NPVALLKTFWSLWQGNLDSRKLFRRLK 96
+ 79***************************************87777777778888.55554.59************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy +++l+aa+ gip+ ++Eqn+++g +nk l+ r++ +
+ sp|B2S6Q4|MURG_BRUA1 97 PKLVVGFGGYPTLPPLYAASNMGIPTLIHEQNAVMGRANKGLAGRVKAI 145
+ ****************************************999998865 PP
+
+>> sp|Q2YLY5|MURG_BRUA2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.6 0.3 9.8e-32 5.5e-29 1 137 [. 10 145 .. 10 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 105.6 bits; conditional E-value: 9.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa Ala+eL++rG++V+lat + +fv + a +++ i + + + + + ++ lk++++ +++ ++++++++ k
+ sp|Q2YLY5|MURG_BRUA2 10 IVLAAGGTGGHLFPAEALAHELRARGWDVHLATDARAQRFVgAFAQDHVHVIRSA-TIAGR-NPVALLKTFWSLWQGNLDSRKLFRRLK 96
+ 79***************************************87777777778888.55554.59************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy +++l+aa+ gip+ ++Eqn+++g +nk l+ r++ +
+ sp|Q2YLY5|MURG_BRUA2 97 PKLVVGFGGYPTLPPLYAASNMGIPTLIHEQNAVMGRANKGLAGRVKAI 145
+ ****************************************999998865 PP
+
+>> sp|Q57C78|MURG_BRUAB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.6 0.3 9.8e-32 5.5e-29 1 137 [. 10 145 .. 10 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 105.6 bits; conditional E-value: 9.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa Ala+eL++rG++V+lat + +fv + a +++ i + + + + + ++ lk++++ +++ ++++++++ k
+ sp|Q57C78|MURG_BRUAB 10 IVLAAGGTGGHLFPAEALAHELRARGWDVHLATDARAQRFVgAFAQDHVHVIRSA-TIAGR-NPVALLKTFWSLWQGNLDSRKLFRRLK 96
+ 79***************************************87777777778888.55554.59************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy +++l+aa+ gip+ ++Eqn+++g +nk l+ r++ +
+ sp|Q57C78|MURG_BRUAB 97 PKLVVGFGGYPTLPPLYAASNMGIPTLIHEQNAVMGRANKGLAGRVKAI 145
+ ****************************************999998865 PP
+
+>> sp|Q660A8|MURG_BORGA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.1 0.0 7.2e-32 4.1e-29 1 138 [. 7 147 .. 7 148 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 106.1 bits; conditional E-value: 7.2e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ + ++ggGT+G+v+P +++ ++L++ + e++ ++ ++ +ee++ e+ ++++ ++++ kl++++ s++++++++++ ++ k++++l
+ sp|Q660A8|MURG_BORGA 7 IFFTGGGTGGHVFPGISIIQKLKELDNEIEffwIGKKNSIEEKLikEQNNIKFIWVPCG-KLRRYF-SFQNFTDFFKVILGIIKSFYVL 93
+ 679****************************************99**************.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ k++kp++v+++gg+v+++ +ia++l++i+++ +E + pgl++k+++++an+++
+ sp|Q660A8|MURG_BORGA 94 KKYKPQIVYATGGFVSTPTIIASSLLKIKRITHEMDLDPGLATKINSKFANKIY 147
+ ****************************************************98 PP
+
+>> sp|B8I6H3|MURG_CLOCE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.2 0.0 6.7e-32 3.8e-29 1 137 [. 3 141 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 106.2 bits; conditional E-value: 6.7e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v++aggGT+G++ P +A+a+ ++++ e ++t++gle+++ + +g++ ++i+++ ++++kl sl+tl + e +++++a ++lk
+ sp|B8I6H3|MURG_CLOCE 3 VLIAGGGTGGHINPGLAIAKYIKQKEAEADitfVGTKKGLETKLvPREGYPLETITVR-GFKRKL-SLDTLIAIKELIQSFFQASRLLK 89
+ 799*********************99999999**************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ + kpdvv+g+ggyv +++l+ a++ gip+ ++E+n+ pg++n+ll r++ v
+ sp|B8I6H3|MURG_CLOCE 90 RIKPDVVIGTGGYVCGPVLYMAAKKGIPTLIHESNAFPGVTNRLLERYVSYV 141
+ ***********************************************99766 PP
+
+>> sp|A5VRH7|MURG_BRUO2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.6 0.3 9.8e-32 5.5e-29 1 137 [. 10 145 .. 10 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 105.6 bits; conditional E-value: 9.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa Ala+eL++rG++V+lat + +fv + a +++ i + + + + + ++ lk++++ +++ ++++++++ k
+ sp|A5VRH7|MURG_BRUO2 10 IVLAAGGTGGHLFPAEALAHELRARGWDVHLATDARAQRFVgAFAQDHVHVIRSA-TIAGR-NPVALLKTFWSLWQGNLDSRKLFRRLK 96
+ 79***************************************87777777778888.55554.59************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy +++l+aa+ gip+ ++Eqn+++g +nk l+ r++ +
+ sp|A5VRH7|MURG_BRUO2 97 PKLVVGFGGYPTLPPLYAASNMGIPTLIHEQNAVMGRANKGLAGRVKAI 145
+ ****************************************999998865 PP
+
+>> sp|B0CHM0|MURG_BRUSI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.6 0.3 9.8e-32 5.5e-29 1 137 [. 10 145 .. 10 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 105.6 bits; conditional E-value: 9.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa Ala+eL++rG++V+lat + +fv + a +++ i + + + + + ++ lk++++ +++ ++++++++ k
+ sp|B0CHM0|MURG_BRUSI 10 IVLAAGGTGGHLFPAEALAHELRARGWDVHLATDARAQRFVgAFAQDHVHVIRSA-TIAGR-NPVALLKTFWSLWQGNLDSRKLFRRLK 96
+ 79***************************************87777777778888.55554.59************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy +++l+aa+ gip+ ++Eqn+++g +nk l+ r++ +
+ sp|B0CHM0|MURG_BRUSI 97 PKLVVGFGGYPTLPPLYAASNMGIPTLIHEQNAVMGRANKGLAGRVKAI 145
+ ****************************************999998865 PP
+
+>> sp|A0JV94|MURG_ARTS2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.1 0.7 7.1e-32 4e-29 1 133 [. 8 142 .. 8 148 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 106.1 bits; conditional E-value: 7.1e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G++ P++A+a +L++ ++Vr ++tp g+e+++ ++agle +i +++++ sl+ l+ + + a+++a +il
+ sp|A0JV94|MURG_ARTS2 8 VVLAGGGTAGHISPLLAIAAALRDVRPDVRllaVGTPSGMETRLvPAAGLELATISRV-PFPRRP-SLDLLRLPGRLAGAVKQAGRILD 94
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprr 133
+ +a +dv+vg+ggyv +++++aa++++ip++++E+n ++gl+nk+ +r+
+ sp|A0JV94|MURG_ARTS2 95 DAHADVLVGVGGYVCTPLYLAARRRKIPIVIHEANTRAGLANKVGARF 142
+ *******************************************99887 PP
+
+>> sp|A6TS61|MURG_ALKMQ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.1 0.0 7.2e-32 4.1e-29 1 138 [. 3 142 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 106.1 bits; conditional E-value: 7.2e-32
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+A+a++ ++ ++ + ++t +gle+++ ++ag+e++ i++ l++k+ s++++k++a+ k+l +a++++k
+ sp|A6TS61|MURG_ALKMQ 3 IMISGGGTGGHIYPAIAIANQITEKHPQAKiqfVGTAKGLESELiPKAGYEIKHITVS-YLRRKI-SFHNVKSIAKLIKGLVEARRLIK 89
+ 6799******************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++pdvv+g+gg+v +++l+ a+++g ++ ++Eqn pgl+n++l ++++++
+ sp|A6TS61|MURG_ALKMQ 90 DFNPDVVIGTGGFVCGPVLYMATKLGYKTLIHEQNVFPGLTNRVLGNYVDRIA 142
+ *************************************************9986 PP
+
+>> sp|C5D4C2|MURG_GEOSW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.1 0.0 7.1e-32 4e-29 1 137 [. 5 142 .. 5 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 106.1 bits; conditional E-value: 7.1e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++l+ggGT+G+v +Al +L+++G+++ ++++ g+e+++ + +g+++ pi ++ kl++++ ++++k+++++lk++++a +i+k+
+ sp|C5D4C2|MURG_GEOSW 5 IILTGGGTAGHVMVNLALIPKLKEQGWDIAyIGSHQGIERELisKVEGVPYFPISTG-KLRRYF-DWNNFKDPFKVLKGTFQAYRIIKK 91
+ 78**************************************9999999**********.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +kp +v++ gg+v+++++i+a+l+g+p +++E++ pgl+nk+ + +a+++
+ sp|C5D4C2|MURG_GEOSW 92 EKPSIVFSKGGFVSVPVIIGAWLNGVPSIIHESDITPGLANKIAMPFATKI 142
+ ***********************************************9997 PP
+
+>> sp|A9M690|MURG_BRUC2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.6 0.3 9.8e-32 5.5e-29 1 137 [. 10 145 .. 10 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 105.6 bits; conditional E-value: 9.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa Ala+eL++rG++V+lat + +fv + a +++ i + + + + + ++ lk++++ +++ ++++++++ k
+ sp|A9M690|MURG_BRUC2 10 IVLAAGGTGGHLFPAEALAHELRARGWDVHLATDARAQRFVgAFAQDHVHVIRSA-TIAGR-NPVALLKTFWSLWQGNLDSRKLFRRLK 96
+ 79***************************************87777777778888.55554.59************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy +++l+aa+ gip+ ++Eqn+++g +nk l+ r++ +
+ sp|A9M690|MURG_BRUC2 97 PKLVVGFGGYPTLPPLYAASNMGIPTLIHEQNAVMGRANKGLAGRVKAI 145
+ ****************************************999998865 PP
+
+>> sp|Q8PPA8|MURG_XANAC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.5 1.1 1.1e-31 6.1e-29 1 138 [. 21 158 .. 21 159 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 105.5 bits; conditional E-value: 1.1e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a+ L++rG V+ l++ ++e+++ +++ +++ ++++ +l+ k+ +k l + ++ +a+r+a ++l++
+ sp|Q8PPA8|MURG_XANAC 21 VMILAGGTGGHIFPGLAVAKVLRARGVPVTwLGADGAMETRLvPQHDIPIDTLAIS-GLRGKG-VVKLLGAPVRVMRAVRAAGFVLRKR 107
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p +v++fgg++a++ ++aa+l+g+p+ v+Eqn pg++nk+l+r+a +vl
+ sp|Q8PPA8|MURG_XANAC 108 QPRAVISFGGFAAGPGGLAARLLGAPLLVHEQNRAPGMTNKVLSRFARRVL 158
+ ************************************************997 PP
+
+>> sp|Q8CY39|MURG_BRUSU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.6 0.3 9.8e-32 5.5e-29 1 137 [. 10 145 .. 10 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 105.6 bits; conditional E-value: 9.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa Ala+eL++rG++V+lat + +fv + a +++ i + + + + + ++ lk++++ +++ ++++++++ k
+ sp|Q8CY39|MURG_BRUSU 10 IVLAAGGTGGHLFPAEALAHELRARGWDVHLATDARAQRFVgAFAQDHVHVIRSA-TIAGR-NPVALLKTFWSLWQGNLDSRKLFRRLK 96
+ 79***************************************87777777778888.55554.59************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy +++l+aa+ gip+ ++Eqn+++g +nk l+ r++ +
+ sp|Q8CY39|MURG_BRUSU 97 PKLVVGFGGYPTLPPLYAASNMGIPTLIHEQNAVMGRANKGLAGRVKAI 145
+ ****************************************999998865 PP
+
+>> sp|A1WRL1|MURG_VEREI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.8 1.1 8.9e-32 5e-29 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 105.8 bits; conditional E-value: 8.9e-32
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+++P +A+a++L++rG++V+ l++p +e+++ +++g + ++++ +++ k+ + + +++ l+a+ +a+++l++ +
+ sp|A1WRL1|MURG_VEREI 8 LIMAGGTGGHIFPGLAVAEALRARGWRVHwLGAPASMEARIaAQHGFALESVTFS-GVRGKG-LATLALLPLRLLRAFWQARAVLRRVQ 94
+ 689****************************************************.******.99999********************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdv+vg ggy++ + + ll++ p++++Eqn+++gl+n+ll+ ra++v+
+ sp|A1WRL1|MURG_VEREI 95 PDVLVGLGGYISFPGALMGLLRRKPLVLHEQNAVAGLANRLLAGRADRVF 144
+ ***********************************************997 PP
+
+>> sp|Q812T8|MURG2_BACCR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.4 0.0 2.4e-31 1.3e-28 1 138 [. 4 141 .. 4 142 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 104.4 bits; conditional E-value: 2.4e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +v++ggG++G+v P +A+ Lq+ +++ ++++ g+e+++ e++g+++++i ++ kl++++ lk++k+++ + k++ +a +++
+ sp|Q812T8|MURG2_BACCR 4 IVFTGGGSAGHVTPNLAIIPYLQEDNWDISyIGSHQGIEKTIiEKEGIPYYSISSG-KLRRYF-DLKNIKDPFLVMKGVMDAYVRIRK 89
+ 79******************************************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdv+++ gg+v+++++i+ +l+++p+ ++E++ pgl+nk+ r+a +++
+ sp|Q812T8|MURG2_BACCR 90 LKPDVIFSKGGFVSVPVVIGGWLNRVPVLLHESDMTPGLANKIALRFASKIF 141
+ ***********************************************99987 PP
+
+>> sp|B0U4Z7|MURG_XYLFM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.9 2.6 8.4e-32 4.8e-29 1 138 [. 15 152 .. 15 153 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 105.9 bits; conditional E-value: 8.4e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a +L++rG V l+++ ++e+++ +++g+e+++i++ +++ ++ +l+ l + ++l+a+++a+ +l+++
+ sp|B0U4Z7|MURG_XYLFM 15 VMILAGGTGGHIFPGLAVAGALRARGVPVVwLGATGKMETHLvPKHGIEIQTIAVA-GVRGRG-MLALLGAPVRVLRAIFAAMGVLRRY 101
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p vvv+fgg++a++ +iaa++ + p++v+Eqn pg++n++l+r a++vl
+ sp|B0U4Z7|MURG_XYLFM 102 RPRVVVSFGGFAAGPGGIAARFMRLPLIVHEQNRAPGMTNRVLARVAKRVL 152
+ ************************************************997 PP
+
+>> sp|A4IJS4|MURG_GEOTN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.7 0.0 9.4e-32 5.3e-29 1 137 [. 5 142 .. 5 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 105.7 bits; conditional E-value: 9.4e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +vl+ggGT+G+v vAl +L+++G+++ +++++g+e+++ + +g++++++ ++ kl++++ +k++k+++++lk++ +a +++++
+ sp|A4IJS4|MURG_GEOTN 5 IVLTGGGTAGHVMVNVALIPKLKEQGWDIVyIGSHEGIEREIigRIDGVPYYSVSTG-KLRRYF-DWKNFKDPFNVLKGVWQAYRLIQK 91
+ 79****************************************9999***********.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +kpd+v++ gg+v+++++++a+l+g+p +++E++ pgl+nk+ + +a+++
+ sp|A4IJS4|MURG_GEOTN 92 EKPDIVFSKGGFVSVPVILGAWLNGVPSVIHESDLTPGLANKIAMPFATKI 142
+ **********************************************99987 PP
+
+>> sp|Q2NZB8|MURG_XANOM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 106.4 0.9 5.8e-32 3.2e-29 1 138 [. 21 158 .. 21 159 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 106.4 bits; conditional E-value: 5.8e-32
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a+ L +rG V+ l++ ++e+++ +++ +++ ++++ +l+ k+ ++k l ++++ +a+r+a ++l++
+ sp|Q2NZB8|MURG_XANOM 21 VMILAGGTGGHIFPGLAVAKVLSARGVPVTwLGADGAMETRLvPQHDIPIDTLAIT-GLRGKG-MVKLLGAPLRVMRAVRAAGFVLRKR 107
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p +v++fgg++a++ ++aa+l+g+p+ v+Eqn pg++nk+l+r+a +vl
+ sp|Q2NZB8|MURG_XANOM 108 QPRAVISFGGFAAGPGGLAARLLGAPLLVHEQNRAPGMTNKVLSRFARRVL 158
+ ************************************************997 PP
+
+>> sp|A5FIY3|MURG_FLAJ1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 105.2 0.0 1.3e-31 7.6e-29 1 137 [. 6 144 .. 6 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 105.2 bits; conditional E-value: 1.3e-31
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G+++Pa+A+a+eL+ + ++ + +++++++e + ++ag+e++ + + +l++kl +l++++ +++ +l ++k+i+k
+ sp|A5FIY3|MURG_FLAJ1 6 FILSGGGTGGHIYPAIAIANELKLQFPDAEflfVGAKDKMEMQKvPQAGYEIKGLWIA-GLQRKL-TLQNMMFPLKLASSLLESKRIIK 92
+ 79**************************************98877*************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ ++kp+vv+g+gg++++++l aa +agip++v Eqn+ pg++nkll+++an +
+ sp|A5FIY3|MURG_FLAJ1 93 KFKPNVVIGTGGFASGPLLQAAGSAGIPTVVQEQNSFPGITNKLLSKKANAI 144
+ *************************************************987 PP
+
+>> sp|Q39JX0|MURG_BURS3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.2 0.4 2.8e-31 1.6e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 104.2 bits; conditional E-value: 2.8e-31
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ ++G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l+ +++ l+a ++ ++l++ +
+ sp|Q39JX0|MURG_BURS3 9 MVMAGGTGGHVFPGLAVAHRMEAAGWRVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LKTKLTLPFNLLRACGQSLAALRRVR 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ ++l+g p++++Eqn+i+gl+nk+l+++a++vlv
+ sp|Q39JX0|MURG_BURS3 96 PDVVLGMGGYITFPAGVMTALSGRPLVLHEQNSIAGLTNKVLAKFAKRVLV 146
+ ************************************************986 PP
+
+>> sp|C1A0X5|MURG_RHOE4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.9 1.1 1.7e-31 9.4e-29 1 138 [. 10 155 .. 10 156 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 104.9 bits; conditional E-value: 1.7e-31
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vv+aggGT+G++ePa+A+a++++++ ++ r l+t +gle+++ +++g++ + i+p +l++k +++ +k + + l ++rk++e+l
+ sp|C1A0X5|MURG_RHOE4 10 VVVAGGGTAGHIEPALAVADAVKAAQPDTRitaLGTARGLETTLvPARGYTLELIPPV-PLPRKP-TMDLVKLPTRILASVRKTREVLD 96
+ 79********************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH......HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal......lagipanvaEqngipglvnkllprrangvl 138
+ + +dv+vgfggyva++a++aa+ +++ip++++E+n+ +g++nk+ +r a++vl
+ sp|C1A0X5|MURG_RHOE4 97 SVDADVIVGFGGYVALPAYLAARggvlrrRRKIPIVIHEANASAGIANKIGARLATRVL 155
+ *******************************************************9997 PP
+
+>> sp|Q748D6|MURG_GEOSL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.9 0.1 3.3e-31 1.8e-28 2 138 .. 4 142 .. 3 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 103.9 bits; conditional E-value: 3.3e-31
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++P +A+a+e+ +r+ + + ++t +g+e++v +++g+ + i++ + + k+ sl+ k la++l ++ ++++ilke
+ sp|Q748D6|MURG_GEOSL 4 LIAGGGTGGHLFPGIAVAEEFLARDKQNEvlfVGTWKGIEARVlPKTGYRLECITAA-GIRGKG-SLARAKGLAKFLYGYAQSRKILKE 90
+ 79*******************9999766666**************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++pd+v+g+ggy++++ l aa+ +ip++++Eqn+ipg++n+ l++ a++++
+ sp|Q748D6|MURG_GEOSL 91 FRPDLVLGVGGYASAPTLMAARGMQIPRFIHEQNAIPGFTNRMLAKVADKIF 142
+ ************************************************9987 PP
+
+>> sp|Q820Y4|MURG_TROWT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.4 0.1 2.4e-31 1.3e-28 1 137 [. 4 140 .. 4 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 104.4 bits; conditional E-value: 2.4e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++laggGT+G+v P++Ala+ L+ Gh l+t++g+e+++ +++g+++ +i+ +++++ s + l +++++ +++ ++ il e+
+ sp|Q820Y4|MURG_TROWT 4 ILLAGGGTAGHVNPLLALADVLKVSGHATFaLGTSEGIESRLvPNSGIDFFTIPKL-PFPRRT-SRHILCFPFKFFSSVKLVRSILIEH 90
+ 79***************************99************************9.****99.99*********************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k++vvvgfggyva++a+ aa++++ip +v+E+n++pgl+n l + +a+ v
+ sp|Q820Y4|MURG_TROWT 91 KIQVVVGFGGYVAAPAYAAAISLNIPYVVHESNARPGLANLLAAHFAKCV 140
+ ****************************************9999999876 PP
+
+>> sp|Q83HK1|MURG_TROW8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.4 0.1 2.4e-31 1.3e-28 1 137 [. 4 140 .. 4 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 104.4 bits; conditional E-value: 2.4e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++laggGT+G+v P++Ala+ L+ Gh l+t++g+e+++ +++g+++ +i+ +++++ s + l +++++ +++ ++ il e+
+ sp|Q83HK1|MURG_TROW8 4 ILLAGGGTAGHVNPLLALADVLKVSGHATFaLGTSEGIESRLvPNSGIDFFTIPKL-PFPRRT-SRHILCFPFKFFSSVKLVRSILIEH 90
+ 79***************************99************************9.****99.99*********************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k++vvvgfggyva++a+ aa++++ip +v+E+n++pgl+n l + +a+ v
+ sp|Q83HK1|MURG_TROW8 91 KIQVVVGFGGYVAAPAYAAAISLNIPYVVHESNARPGLANLLAAHFAKCV 140
+ ****************************************9999999876 PP
+
+>> sp|A4QFM3|MURG_CORGB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.5 0.9 2.3e-31 1.3e-28 1 129 [. 3 132 .. 3 135 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 104.5 bits; conditional E-value: 2.3e-31
+ EEEE-------HHHHHHHHHHHHH-.--EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrr.GheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ vv+aggGT+G++ePa+A+a++L+++ G V l+t +gle+++ + +g e + i+p ++++k ++ lk ++++ kal +a+++lk+
+ sp|A4QFM3|MURG_CORGB 3 VVVAGGGTAGHIEPALAVAEALRDKhGATVSaLGTARGLETTLvPDRGFELHLIEPV-PVPRKP-NMDLLKLPFRVAKALGQARKALKD 89
+ 79********************975378888**************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEES CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkl 129
+ +++v+gfggyv+++a+ aa+++g p +v+E+n+++g++nkl
+ sp|A4QFM3|MURG_CORGB 90 TDAQAVIGFGGYVSAPAYMAAKSLGLPFFVHEANARAGMANKL 132
+ *****************************************97 PP
+
+>> sp|Q39YL9|MURG_GEOMG UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.0 0.1 3.1e-31 1.8e-28 2 138 .. 4 142 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 104.0 bits; conditional E-value: 3.1e-31
+ EEE-------HHHHHHHHHHH..HH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareL..qrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++P +A+a+e+ +++G eV ++t +g+e++v ++ g+ + i++ + + k+ s++ k la++l ++ ++++ilke
+ sp|Q39YL9|MURG_GEOMG 4 LIAGGGTGGHLFPGIAVAEEFlsRKKGNEVLfVGTWRGIEARVlPKLGYRLECITAA-GIRGKG-SVARAKGLAKFLYGYAQSRKILKE 90
+ 79******************977789*******************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpd+v+g+ggy++++al+aa+ +ip++++Eqn+ipg++nk l+ a++v+
+ sp|Q39YL9|MURG_GEOMG 91 FKPDLVLGVGGYASAPALLAARGMHIPRFIHEQNAIPGFTNKMLATVAERVF 142
+ ********************************************99999987 PP
+
+>> sp|A1R0I9|MURG_BORT9 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.5 0.0 2.2e-31 1.3e-28 1 139 [] 7 148 .. 7 148 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 104.5 bits; conditional E-value: 2.2e-31
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ + ++ggGT+G+v+P +A+ +L++ + +++ l+ ++ +e+++ e a +++ +i+++ kl++++ sl+++++++++ ++ k+++i+
+ sp|A1R0I9|MURG_BORT9 7 IFFTGGGTGGHVFPGIAIISKLRELDTNIEffwLGQKDSMEDKIikEHAYIKFIAIPSG-KLRRYF-SLQNFTDFFKVIFGIIKSFFII 93
+ 679******************************************9999**********.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ k++kp++++++gg+v+ +++iaa+l++++ + +E + pgl++k+++++an++++
+ sp|A1R0I9|MURG_BORT9 94 KKYKPQIIYATGGFVSSPPIIAASLLKVKSITHEMDLDPGLATKINSKFANKIHI 148
+ ****************************************************985 PP
+
+>> sp|Q3AAE6|MURG_CARHZ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.9 0.0 3.5e-31 2e-28 2 137 .. 4 141 .. 3 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 103.9 bits; conditional E-value: 3.5e-31
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ v+aggGT+G+++Pa+A+a+ ++ ++ + ++tp+g+e++v +++g + + ++++ + ++k+ s++tlk l+ + k+l a+ lk+
+ sp|Q3AAE6|MURG_CARHZ 4 VFAGGGTGGHLYPALAIAQSWKESHPNDEilfVGTPRGIENTVvPKYGFPLYLLPVE-GIPRKV-SWETLKKLFLVPKSLINAFIFLKK 90
+ 89***********************998889**************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +kpd+vvg+ggy++ ++++aa+ ++ip++++Eqn+ pg++nk+l+ r++ v
+ sp|Q3AAE6|MURG_CARHZ 91 EKPDIVVGTGGYASFPVVFAATVLKIPTVIHEQNAYPGIANKILAARVDAV 141
+ ***********************************************9987 PP
+
+>> sp|Q8NNN5|MURG_CORGL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.5 0.9 2.3e-31 1.3e-28 1 129 [. 3 132 .. 3 135 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 104.5 bits; conditional E-value: 2.3e-31
+ EEEE-------HHHHHHHHHHHHH-.--EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrr.GheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ vv+aggGT+G++ePa+A+a++L+++ G V l+t +gle+++ + +g e + i+p ++++k ++ lk ++++ kal +a+++lk+
+ sp|Q8NNN5|MURG_CORGL 3 VVVAGGGTAGHIEPALAVAEALRDKhGATVSaLGTARGLETTLvPDRGFELHLIEPV-PVPRKP-NMDLLKLPFRVAKALGQARKALKD 89
+ 79********************975378888**************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEES CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkl 129
+ +++v+gfggyv+++a+ aa+++g p +v+E+n+++g++nkl
+ sp|Q8NNN5|MURG_CORGL 90 TDAQAVIGFGGYVSAPAYMAAKSLGLPFFVHEANARAGMANKL 132
+ *****************************************97 PP
+
+>> sp|Q0TNP7|MURG_CLOP1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.8 0.0 3.5e-31 2e-28 1 135 [. 6 140 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 103.8 bits; conditional E-value: 3.5e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggG++G+v P +Al +L++ G e++ +++++g+e+++ +++++++++i ++ kl++++ +k++++++++lk++ +a +il+++
+ sp|Q0TNP7|MURG_CLOP1 6 IIMTGGGSAGHVTPNLALVPKLKELGFEIKyIGSKNGIEKEIiTKENIPYYSISSG-KLRRYF-DIKNFTDPFKVLKGVMDASRILSKE 92
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ kpdv+++ gg+v ++++iaa+ +ip++ +E++ pgl+nk+ + +++
+ sp|Q0TNP7|MURG_CLOP1 93 KPDVIFSKGGFVTVPVVIAASMKKIPVVSHESDLTPGLANKIASPFCD 140
+ ******************************************998887 PP
+
+>> sp|Q8XIQ1|MURG_CLOPE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.8 0.0 3.5e-31 2e-28 1 135 [. 6 140 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 103.8 bits; conditional E-value: 3.5e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggG++G+v P +Al +L++ G e++ +++++g+e+++ +++++++++i ++ kl++++ +k++++++++lk++ +a +il+++
+ sp|Q8XIQ1|MURG_CLOPE 6 IIMTGGGSAGHVTPNLALVPKLKELGFEIKyIGSKNGIEKEIiTKENIPYYSISSG-KLRRYF-DIKNFTDPFKVLKGVMDASRILSKE 92
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ kpdv+++ gg+v ++++iaa+ +ip++ +E++ pgl+nk+ + +++
+ sp|Q8XIQ1|MURG_CLOPE 93 KPDVIFSKGGFVTVPVVIAASMKKIPVVSHESDLTPGLANKIASPFCD 140
+ ******************************************998887 PP
+
+>> sp|Q0SRB4|MURG_CLOPS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.8 0.0 3.5e-31 2e-28 1 135 [. 6 140 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 103.8 bits; conditional E-value: 3.5e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggG++G+v P +Al +L++ G e++ +++++g+e+++ +++++++++i ++ kl++++ +k++++++++lk++ +a +il+++
+ sp|Q0SRB4|MURG_CLOPS 6 IIMTGGGSAGHVTPNLALVPKLKELGFEIKyIGSKNGIEKEIiTKENIPYYSISSG-KLRRYF-DIKNFTDPFKVLKGVMDASRILSKE 92
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ kpdv+++ gg+v ++++iaa+ +ip++ +E++ pgl+nk+ + +++
+ sp|Q0SRB4|MURG_CLOPS 93 KPDVIFSKGGFVTVPVVIAASMKKIPVVSHESDLTPGLANKIASPFCD 140
+ ******************************************998887 PP
+
+>> sp|Q5YYX9|MURG_NOCFA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.9 1.8 3.4e-31 1.9e-28 1 138 [. 17 162 .. 17 163 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 103.9 bits; conditional E-value: 3.4e-31
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v++aggGT+G++ePa+A+a++L+r ++ +r l+t++gle+++ +e+g++ + i+p +l++k +++ l+ +a+++ ++r++++++
+ sp|Q5YYX9|MURG_NOCFA 17 VIVAGGGTAGHIEPALAVADALRRLDPAIRvtaLGTERGLETRLvPERGYPLELIPPV-PLPRKP-TVDLLRLPARVRASVRRTRAVID 103
+ 689*******************************************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH......HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal......lagipanvaEqngipglvnkllprrangvl 138
+ ++dv++gfggyva++a++aa ++ +p++v+E+n+ +g++nk+ +r a vl
+ sp|Q5YYX9|MURG_NOCFA 104 AVQADVIIGFGGYVALPAYLAAGrgvlrrRRAVPVIVHEANAKAGIANKIGARVARAVL 162
+ *********************999999999********************999998876 PP
+
+>> sp|A7HH67|MURG_ANADF UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.3 0.4 2.6e-31 1.5e-28 2 138 .. 4 142 .. 3 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 104.3 bits; conditional E-value: 2.6e-31
+ EEE-------HHHHHHHHHHHHH-..--EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrr..GheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+v+P +Ala+e+ r G +V ++t++gle++v ++ag +++ i+++ +l+ k+ l+ l++l+ + +al ++ +il++
+ sp|A7HH67|MURG_ANADF 4 LIAGGGTGGHVFPGIALAEEVVGRhpGNDVVfVGTERGLEAKVvPAAGFPIELIDVK-GLKGKG-ILSLLLNLLLVPRALLQSHRILRK 90
+ 79*******************6664488999**************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++pdvvvg+ggy+++++++ a+l++ip+ v Eqn+i+g++n++l r+++ ++
+ sp|A7HH67|MURG_ANADF 91 WRPDVVVGVGGYASGPVVLVAWLLRIPTAVQEQNAIAGFTNRVLGRFVDAAF 142
+ ***********************************************99865 PP
+
+>> sp|Q82VS3|MURG_NITEU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.5 0.0 4.7e-31 2.6e-28 3 138 .. 2 137 .. 1 138 [. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 103.5 bits; conditional E-value: 4.7e-31
+ EE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ +++gGT+G+v+P +A+ar q+ G+++ l+t +g+e+ + +++g +++ i+ +l+ k ++ l+ +++ +a ++++il++++p
+ sp|Q82VS3|MURG_NITEU 2 IMAGGTGGHVFPGLAVARSMQANGWRIVwLGTRNGMEAALvPQHGFSIELINFS-GLRGKK-LSSYLLLPWRLAQACWQSFRILRRQQP 88
+ 789***************************************************.****99.9************************** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +vv+g+ggy a++ +i a l+g p+ ++Eqn i+gl+nk+l++ a+++l
+ sp|Q82VS3|MURG_NITEU 89 QVVLGMGGYPALPGGIMAVLLGKPLLIHEQNRIAGLTNKILAKIADRIL 137
+ **********************************************987 PP
+
+>> sp|B0RVA5|MURG_XANCB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.4 1.4 2.4e-31 1.3e-28 1 138 [. 22 159 .. 22 160 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 104.4 bits; conditional E-value: 2.4e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a+ L++rG V+ l++ ++e+++ +++ +++ ++++ +l+ k+ +k l + ++ +a+r+a ++l++
+ sp|B0RVA5|MURG_XANCB 22 VMILAGGTGGHIFPGLAVAKVLRARGVPVTwLGADGAMETRLvPQHAIQIDTLAIS-GLRGKG-IVKLLGAPVRVMRAVRAAGFVLRKR 108
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p +v++fgg++a++ ++aa+l+g+p+ v+Eqn pg++nk+l+r+a +vl
+ sp|B0RVA5|MURG_XANCB 109 QPRAVISFGGFAAGPGGLAARLLGVPLLVHEQNRAPGMTNKVLSRFARRVL 159
+ ************************************************997 PP
+
+>> sp|Q2SZI3|MURG_BURTA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.3 0.5 5.2e-31 2.9e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 103.3 bits; conditional E-value: 5.2e-31
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ q++G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l +++ l+a ++ ++l++ k
+ sp|Q2SZI3|MURG_BURTA 9 MVMAGGTGGHVFPGLAVAHRMQAQGWRVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LATKLALPFNLLRACAQSLRALRRVK 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ + l g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|Q2SZI3|MURG_BURTA 96 PDVVLGMGGYITFPAGLVTVLTGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|Q11GS5|MURG_MESSB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.0 0.3 3.2e-31 1.8e-28 1 137 [. 6 141 .. 6 142 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 104.0 bits; conditional E-value: 3.2e-31
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++Pa Ala+eL++rG+ V+lat ++ ++f + e+++i++ ++ ++ l+ lk+ ++ +++++++++++ + k
+ sp|Q11GS5|MURG_MESSB 6 ILLSAGGTGGHLFPAEALAHELRARGWSVHLATDKRATRFAgTFPADEIHAIDSA-TFGSRN-PLALLKSGLSIWRGFKQSTALINRLK 92
+ 79**************************************986666677779999.777777.9************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy +++l+aa+++++p+ v+Eqn+++g +nk+l+ r++ +
+ sp|Q11GS5|MURG_MESSB 93 PAAVVGFGGYPTLPPLYAATRRQVPTLVHEQNAVMGRANKALAPRVTAI 141
+ *******************************************999876 PP
+
+>> sp|Q4UQX0|MURG_XANC8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.4 1.4 2.4e-31 1.3e-28 1 138 [. 22 159 .. 22 160 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 104.4 bits; conditional E-value: 2.4e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a+ L++rG V+ l++ ++e+++ +++ +++ ++++ +l+ k+ +k l + ++ +a+r+a ++l++
+ sp|Q4UQX0|MURG_XANC8 22 VMILAGGTGGHIFPGLAVAKVLRARGVPVTwLGADGAMETRLvPQHAIQIDTLAIS-GLRGKG-IVKLLGAPVRVMRAVRAAGFVLRKR 108
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p +v++fgg++a++ ++aa+l+g+p+ v+Eqn pg++nk+l+r+a +vl
+ sp|Q4UQX0|MURG_XANC8 109 QPRAVISFGGFAAGPGGLAARLLGVPLLVHEQNRAPGMTNKVLSRFARRVL 159
+ ************************************************997 PP
+
+>> sp|Q8PCK0|MURG_XANCP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.4 1.4 2.4e-31 1.3e-28 1 138 [. 22 159 .. 22 160 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 104.4 bits; conditional E-value: 2.4e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a+ L++rG V+ l++ ++e+++ +++ +++ ++++ +l+ k+ +k l + ++ +a+r+a ++l++
+ sp|Q8PCK0|MURG_XANCP 22 VMILAGGTGGHIFPGLAVAKVLRARGVPVTwLGADGAMETRLvPQHAIQIDTLAIS-GLRGKG-IVKLLGAPVRVMRAVRAAGFVLRKR 108
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p +v++fgg++a++ ++aa+l+g+p+ v+Eqn pg++nk+l+r+a +vl
+ sp|Q8PCK0|MURG_XANCP 109 QPRAVISFGGFAAGPGGLAARLLGVPLLVHEQNRAPGMTNKVLSRFARRVL 159
+ ************************************************997 PP
+
+>> sp|A3NZL5|MURG_BURP0 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.1 0.5 6e-31 3.4e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 103.1 bits; conditional E-value: 6e-31
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ q++G++V l++p g+e+++ + +g++++ + + +l+ k+ +++ +++ l+a ++ ++l++ k
+ sp|A3NZL5|MURG_BURP0 9 MVMAGGTGGHVFPGLAVAHRMQAQGWRVVwLGSPAGMEATLvPRHGIPMEYVRFG-GLRGKG-LATKFALPFNLLRACAQSLRALRRVK 95
+ 5899***************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ + l g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|A3NZL5|MURG_BURP0 96 PDVVLGMGGYITFPAGLVTVLTGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|Q98KB3|MURG_RHILO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 104.1 0.7 2.9e-31 1.7e-28 1 137 [. 6 141 .. 6 142 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 104.1 bits; conditional E-value: 2.9e-31
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++la+gGT+G+++Pa Ala+eL rG+ V+lat ++ e+f +++pi++ + +k ++ l +++ ++++r+a +i+ + k
+ sp|Q98KB3|MURG_RHILO 6 ILLAAGGTGGHLFPAEALAHELNGRGWTVHLATDDRAERFAgHFPAAAVHPIQSA-TMGSKN-PIAVLGAFWKIWRGVRQASTIIGRIK 92
+ 79***************************************6666666677****.777777.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pd+vvgfggy +++l+aa+++++p+ ++Eqn+++g +n++l+ r++ +
+ sp|Q98KB3|MURG_RHILO 93 PDAVVGFGGYPTLPPLYAATRRKVPTLIHEQNAVMGRANRALAGRVDAI 141
+ ********************************************99976 PP
+
+>> sp|Q0A6K2|MURG_ALHEH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.1 1.1 6.2e-31 3.5e-28 1 138 [. 5 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 103.1 bits; conditional E-value: 6.2e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+v+Pa+A+a++L+++G V l+t +gle++v ++a ++ +++ ++ +l+ ++ + l ++ l+al +a +l+++
+ sp|Q0A6K2|MURG_ALHEH 5 VLIMAGGTGGHVFPALAVAERLREQGVPVVwLGTREGLEARVvPAADIPLESLRVR-GLRGNG-LRGWLAAPFVLLRALWQALGVLRRH 91
+ 789*****************************************************.****99.9999********************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p +v+g+ggy+a++ +aa+l + p++++Eqn+++gl+n+ll+r a +vl
+ sp|Q0A6K2|MURG_ALHEH 92 RPRAVLGMGGYAAGPGAVAAWLTRRPLIIHEQNAVAGLTNRLLSRLARRVL 142
+ *********************************************999987 PP
+
+>> sp|A5IGA6|MURG_LEGPC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.1 0.0 6.1e-31 3.4e-28 1 137 [. 5 141 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 103.1 bits; conditional E-value: 6.1e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +v++ggGT+G+v P +Al +e++++G++V+ +++ g+e++ e ++++ + ++ kl++++ slk+l+++++ ++ ++ ++ +
+ sp|A5IGA6|MURG_LEGPC 5 IVFTGGGTAGHVTPNIALIKEFRKEGWNVEyIGSVSGIEKEMiEPMDIPFHGVSSG-KLRRYF-SLKNLLDPFKIVLGIIQSSLLFYKI 91
+ 79******************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kpdvv++ gg+va +++++a+l++ip++ +E++ pgl+n+l+ ++n++
+ sp|A5IGA6|MURG_LEGPC 92 KPDVVFSKGGFVAFPVVVGAWLNRIPVVAHESDMSPGLANRLSFPFVNKI 141
+ *****************************************999988886 PP
+
+>> sp|Q5L3H6|MURG_GEOKA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.5 0.0 4.7e-31 2.6e-28 1 137 [. 5 142 .. 5 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 103.5 bits; conditional E-value: 4.7e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++l+ggGT+G+v vAl +L++ G+++ ++++ g+e+++ + +g++++++ ++ kl++++ +k++k+++++lk++ +a +++++
+ sp|Q5L3H6|MURG_GEOKA 5 IILTGGGTAGHVMVNVALIPKLKELGWDIVyIGSHQGIEREIigRIDGVPYYSVSTG-KLRRYF-DWKNFKDPFNVLKGVWQAYRLIQK 91
+ 78****************************************9999***********.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +kpdvv++ gg+v+++++++a+l+g+p +++E++ pgl+nk+ + +a+++
+ sp|Q5L3H6|MURG_GEOKA 92 EKPDVVFSKGGFVSVPVILGAWLNGVPSVIHESDLTPGLANKIAMPFATKI 142
+ **********************************************99987 PP
+
+>> sp|A0LTM3|MURG_ACIC1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.3 0.9 5.2e-31 2.9e-28 1 135 [. 3 139 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 103.3 bits; conditional E-value: 5.2e-31
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G++ePa+ la++L+rr+ V l++p+gle+++ +++g + i++ +l+++l +++ l + + + a+ ++++il+
+ sp|A0LTM3|MURG_ACIC1 3 VVLAGGGTAGHIEPALTLAEALRRRDVGVGitlLGSPRGLETRLvPARGFDLALIPAV-PLPRRL-TPDLLAVPSRLRAAVGEVERILA 89
+ 79***************************9****************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ e +dv+vgfggyva++ ++aa++ g p +v+E+n++pgl+n++ +r+
+ sp|A0LTM3|MURG_ACIC1 90 ETGADVLVGFGGYVALPGYLAARRTGLPYVVHEANARPGLANRWGARFTR 139
+ ********************************************998865 PP
+
+>> sp|Q3A2G6|MURG_PELCD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 102.8 0.0 7.6e-31 4.3e-28 2 137 .. 4 141 .. 3 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 102.8 bits; conditional E-value: 7.6e-31
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +laggGT+G+++PavAla++L +++ e ++t +g+e++v +e+g + + i+++ ++ +++ l++l+ + +++ + il++
+ sp|Q3A2G6|MURG_PELCD 4 LLAGGGTGGHLFPAVALAQRLLEQDSEAQvqfVGTARGIEARVlPEQGWPLELIDIR-GFVNQG-LLGKLRMIPCLIRSVWQGLCILRK 90
+ 89*******************9999888888**************************.****99.999999999999************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ ++pdvv+g+ggy++++ l+aa+l +ip++++Eqn+ pgl+n+ll +a v
+ sp|Q3A2G6|MURG_PELCD 91 FQPDVVLGVGGYASAPMLVAARLKRIPTVIHEQNAWPGLTNRLLGPWARCV 141
+ *******************************************99988765 PP
+
+>> sp|Q0AYQ8|MURG_SYNWW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 99.2 0.0 9.8e-30 5.5e-27 1 136 [. 3 140 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 99.2 bits; conditional E-value: 9.8e-30
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+A+a +L++r e + ++t++gle+ + + agl + +i++ + ++ +lk+ ++l ++ +++++a i+k
+ sp|Q0AYQ8|MURG_SYNWW 3 FIITGGGTGGHIYPALAIASGLKERLGEAEilyVGTKKGLEANIvPRAGLRFTTIDIS-GIDRSS-MLKASRSLVKFPRSFFQAWDIIK 89
+ 789**********************8888888**************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ +++pd+v+g+ggyv+ +++ a ++ +++++Eqn+ipgl+n+ l+rr++
+ sp|Q0AYQ8|MURG_SYNWW 90 DFQPDIVIGTGGYVSFPIVMAGTFFPSKTVIHEQNAIPGLANRNLARRVDY 140
+ ***********************************************9985 PP
+
+>> sp|Q1LIM6|MURG_RALME UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 102.0 0.1 1.3e-30 7.6e-28 2 138 .. 7 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 102.0 bits; conditional E-value: 1.3e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+ar+L+++G++V l+ g+e+++ +++ ++++ i+ + +l+ k+ l++l+ +++ l+a+ ++ +l++ k
+ sp|Q1LIM6|MURG_RALME 7 LVMAGGTGGHVFPGLAVARALRDEGWRVVwLGNRTGMEATLvPKHDIPMEYIQFG-GLRGKG-LLTKLLLPLNLLRAFWQSIGALRRVK 93
+ 789****************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggy+ +a+ a+l+g p++++Eqn+i+gl+nk+l++ a++vl
+ sp|Q1LIM6|MURG_RALME 94 PDVVLGMGGYITFPAGMMASLLGRPLVLHEQNSIAGLANKVLAKVADRVL 143
+ ***********************************************997 PP
+
+>> sp|Q92NL9|MURG_RHIME UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.5 0.5 3.7e-30 2.1e-27 1 137 [. 6 141 .. 6 142 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 100.5 bits; conditional E-value: 3.7e-30
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavp...igpdvklwakleslktlkelaeglkalrkakei 83
+ ++la+gGT+G+++Pa Ala+eL++ G+ V+l+t + e+f+ +++++++vp ig++ + +k +++++ + +lr+a+++
+ sp|Q92NL9|MURG_RHIME 6 ILLAAGGTGGHLFPAEALAHELKATGYSVHLVTDSRAERFTgkfPADEIHVVPsatIGSK-------NPVKLARSVWKLWTGLRAARRL 87
+ 79**************************************99888999999995444444.......599******************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++ kp +vvgfggy +++l+aa+ gip +++Eqn+++g +nk l+ r++ v
+ sp|Q92NL9|MURG_RHIME 88 IARLKPRAVVGFGGYPTVPPLLAATGMGIPSIIHEQNAVMGRANKMLASRVKAV 141
+ **************************************************9987 PP
+
+>> sp|Q72JP9|MURG_THET2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.4 0.3 3.9e-30 2.2e-27 1 135 [. 2 134 .. 2 138 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 100.4 bits; conditional E-value: 3.9e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++l+ggGT+G+++Pa+A+a+eL+rrGh V l+++ gle+++ +++ +++ i+++ kl ++ +++ + +++g + +a ++l++
+ sp|Q72JP9|MURG_THET2 2 ILLTGGGTGGHLFPALAVAEELRRRGHPVFyLGAEGGLEARLlPKTPIPHALIPAG-KLDRSALRPQEAPKVLQG---VLRAQALLRRL 86
+ 79******************************************************.****88777777777777...*********** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +p++v+++ggy+ + + aa+l+gip+ ++Eqn++ gl+n++l+ a+
+ sp|Q72JP9|MURG_THET2 87 RPKAVLSTGGYAGFPGGMAASLLGIPLLLHEQNARLGLANRALAPLAK 134
+ *****************************************9887665 PP
+
+>> sp|A1R5F8|MURG_ARTAT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 103.4 0.9 5e-31 2.8e-28 1 138 [. 14 153 .. 14 154 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 103.4 bits; conditional E-value: 5e-31
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ vvlaggGT+G+v P++A+a++ +++ +e ++tp g+e+++ ++ag+e +i+ +++++ s + +k +a+ a+r+a++il+
+ sp|A1R5F8|MURG_ARTAT 14 VVLAGGGTAGHVSPLLAIADAIREKRPEAAilaVGTPSGMETRLvPAAGYELATIDRV-PFPRRP-SADLVKLPARLSGAVRQARRILE 100
+ 79****************************9***************************.****99.9999999999999********** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ea++dv+vg+ggyv ++ ++aa++++ip++++E+n +gl+n++ +r+ n v+
+ sp|A1R5F8|MURG_ARTAT 101 EARADVLVGVGGYVCTPMYLAARKLRIPIVIHEANMKAGLANRVGARFSNHVA 153
+ ***********************************************999886 PP
+
+>> sp|Q87AF9|MURG_XYLFT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 102.6 2.6 8.6e-31 4.9e-28 1 138 [. 12 149 .. 12 150 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 102.6 bits; conditional E-value: 8.6e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a L++rG V l++ ++e+++ +++g+e+++i++ +++ ++ +l+ l + ++l a+++a+++l+++
+ sp|Q87AF9|MURG_XYLFT 12 VMILAGGTGGHIFPGLAVAGVLRARGVPVVwLGAAGKMETHLvPKHGIEIQTIAVS-GVRGHG-MLALLGAPVRVLPAIFAAMRVLRRY 98
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p vvv+fgg++a++ +iaa+l g p++v+Eqn pg++n++l+r a +vl
+ sp|Q87AF9|MURG_XYLFT 99 RPRVVVSFGGFAAGPGGIAARLMGLPLIVHEQNRAPGMTNRVLARVARRVL 149
+ **********************************************99987 PP
+
+>> sp|B2I9B3|MURG_XYLF2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 102.6 2.6 8.8e-31 4.9e-28 1 138 [. 15 152 .. 15 153 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 102.6 bits; conditional E-value: 8.8e-31
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++P +A+a L++rG V l++ ++e+++ +++g+e+++i++ +++ ++ +l+ l + ++l a+++a+++l+++
+ sp|B2I9B3|MURG_XYLF2 15 VMILAGGTGGHIFPGLAVAGVLRARGVPVVwLGAAGKMETHLvPKHGIEIQTIAVS-GVRGHG-MLALLGAPVRVLPAIFAAMRVLRRY 101
+ 6799****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p vvv+fgg++a++ +iaa+l g p++v+Eqn pg++n++l+r a +vl
+ sp|B2I9B3|MURG_XYLF2 102 RPRVVVSFGGFAAGPGGIAARLMGLPLIVHEQNRAPGMTNRVLARVARRVL 152
+ **********************************************99987 PP
+
+>> sp|A6WZQ6|MURG_OCHA4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 102.4 0.3 9.9e-31 5.6e-28 1 137 [. 6 141 .. 6 142 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 102.4 bits; conditional E-value: 9.9e-31
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa Ala+eL++rG++V+lat + +f + a+ +++ i + + + + + ++ lk++++ +++ ++++++++ k
+ sp|A6WZQ6|MURG_OCHA4 6 IVLAAGGTGGHLFPAEALAHELKARGWDVHLATDARAQRFAgAFAEDHVHVIRSA-TIAGR-NPIALLKTFWSLWQGNLDSRKLFRRLK 92
+ 79***************************************98888888889999.55554.59************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++v+gfggy +++l+aa+ +ip+ v+Eqn+++g +nk l+ r++ +
+ sp|A6WZQ6|MURG_OCHA4 93 PKLVAGFGGYPTLPPLYAASNMNIPTMVHEQNAVMGRANKGLAGRVKAI 141
+ ****************************************999998865 PP
+
+>> sp|A1V0R8|MURG_BURMS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.8 0.5 1.5e-30 8.6e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.8 bits; conditional E-value: 1.5e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ q++G++V l+ p g+e+++ + +g++++ + + +l+ k+ +++ +++ l+a ++ ++l++ k
+ sp|A1V0R8|MURG_BURMS 9 MVMAGGTGGHVFPGLAVAHRMQAQGWRVVwLGNPAGMEATLvPRHGIPMEYVRFG-GLRGKG-LATKFALPFNLLRACAQSLRALRRVK 95
+ 5899***************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ + l g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|A1V0R8|MURG_BURMS 96 PDVVLGMGGYITFPAGLVTVLTGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|A2S5U5|MURG_BURM9 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.8 0.5 1.5e-30 8.6e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.8 bits; conditional E-value: 1.5e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ q++G++V l+ p g+e+++ + +g++++ + + +l+ k+ +++ +++ l+a ++ ++l++ k
+ sp|A2S5U5|MURG_BURM9 9 MVMAGGTGGHVFPGLAVAHRMQAQGWRVVwLGNPAGMEATLvPRHGIPMEYVRFG-GLRGKG-LATKFALPFNLLRACAQSLRALRRVK 95
+ 5899***************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ + l g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|A2S5U5|MURG_BURM9 96 PDVVLGMGGYITFPAGLVTVLTGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|A3MR63|MURG_BURM7 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.8 0.5 1.5e-30 8.6e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.8 bits; conditional E-value: 1.5e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ q++G++V l+ p g+e+++ + +g++++ + + +l+ k+ +++ +++ l+a ++ ++l++ k
+ sp|A3MR63|MURG_BURM7 9 MVMAGGTGGHVFPGLAVAHRMQAQGWRVVwLGNPAGMEATLvPRHGIPMEYVRFG-GLRGKG-LATKFALPFNLLRACAQSLRALRRVK 95
+ 5899***************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ + l g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|A3MR63|MURG_BURM7 96 PDVVLGMGGYITFPAGLVTVLTGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|Q62GS7|MURG_BURMA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.8 0.5 1.5e-30 8.6e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.8 bits; conditional E-value: 1.5e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ q++G++V l+ p g+e+++ + +g++++ + + +l+ k+ +++ +++ l+a ++ ++l++ k
+ sp|Q62GS7|MURG_BURMA 9 MVMAGGTGGHVFPGLAVAHRMQAQGWRVVwLGNPAGMEATLvPRHGIPMEYVRFG-GLRGKG-LATKFALPFNLLRACAQSLRALRRVK 95
+ 5899***************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ + l g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|Q62GS7|MURG_BURMA 96 PDVVLGMGGYITFPAGLVTVLTGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|Q63QJ7|MURG_BURPS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.8 0.5 1.5e-30 8.6e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.8 bits; conditional E-value: 1.5e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ q++G++V l+ p g+e+++ + +g++++ + + +l+ k+ +++ +++ l+a ++ ++l++ k
+ sp|Q63QJ7|MURG_BURPS 9 MVMAGGTGGHVFPGLAVAHRMQAQGWRVVwLGNPAGMEATLvPRHGIPMEYVRFG-GLRGKG-LATKFALPFNLLRACAQSLRALRRVK 95
+ 5899***************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ + l g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|Q63QJ7|MURG_BURPS 96 PDVVLGMGGYITFPAGLVTVLTGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|A3NDW4|MURG_BURP6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.8 0.5 1.5e-30 8.6e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.8 bits; conditional E-value: 1.5e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ q++G++V l+ p g+e+++ + +g++++ + + +l+ k+ +++ +++ l+a ++ ++l++ k
+ sp|A3NDW4|MURG_BURP6 9 MVMAGGTGGHVFPGLAVAHRMQAQGWRVVwLGNPAGMEATLvPRHGIPMEYVRFG-GLRGKG-LATKFALPFNLLRACAQSLRALRRVK 95
+ 5899***************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ + l g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|A3NDW4|MURG_BURP6 96 PDVVLGMGGYITFPAGLVTVLTGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|Q3J789|MURG_NITOC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.8 0.3 1.6e-30 8.7e-28 1 132 [. 5 136 .. 5 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 101.8 bits; conditional E-value: 1.6e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G+++Pa+A+a++L++ G eV ++t gle+++ ++ag++++ i ++ +l+ k+ + l+ +++ l al +a ++l+++
+ sp|Q3J789|MURG_NITOC 5 VLIMAGGTGGHIFPALAVADRLRAWGVEVVwMGTRHGLEAELvPKAGYPIEWISIG-GLRGKG-LTHWLRAPFKLLLALSQALRALRRW 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGG CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllpr 132
+ +p+vv+g gg+v+++ +++a+l++ p+ ++Eqn+i g +n+ll+
+ sp|Q3J789|MURG_NITOC 92 QPAVVLGLGGFVSGPGGLGAWLLRRPLLIHEQNAIVGTANRLLAP 136
+ ****************************************99865 PP
+
+>> sp|Q8K9T4|MURG_BUCAP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 102.3 0.0 1.1e-30 6e-28 1 135 [. 6 140 .. 6 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 102.3 bits; conditional E-value: 1.1e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gG++G+v+P + +a++L ++G+++ ++t++++e+++ ++ +++++ i+++ +l+++ + ++++ ++l+++ ++++i+k++
+ sp|Q8K9T4|MURG_BUCAP 6 IIILAGGSGGHVFPGLTIAKHLIKKGWDINwIGTKNKIESEIiPKCNIKIHFIKIQ-GLRNSS-LKNLIMTPINVLNSYLQVRKIIKNW 92
+ 6899****************************************************.****77.888889999**************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ pd+++g+ggyv+++ ++aa++++ip +++Eqn i+g++nkll++ +
+ sp|Q8K9T4|MURG_BUCAP 93 IPDIILGMGGYVSGPGGLAAWSCKIPFILHEQNKIAGITNKLLSKIST 140
+ *******************************************98765 PP
+
+>> sp|B9M172|MURG_GEOSF UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.9 0.0 1.4e-30 7.8e-28 2 139 .] 4 143 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 101.9 bits; conditional E-value: 1.4e-30
+ EEE-------HHHHHHHHHHHHH--..-EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrG..heVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++P +A+a+e+ +r eV ++t++g+e+++ ++ g+ + i + + + + l+++k++a l ++ ++++ilke
+ sp|B9M172|MURG_GEOSF 4 IVAGGGTGGHLFPGIAVAEEFLARNsaNEVLfIGTERGIEARLlPKLGYRLECISAS-GIKGQS-PLTKVKSAALLLYGYSQSRKILKE 90
+ 68*******************9887224566**************************.9**999.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++pdvv+g+ggy+++++++ a+ ++i ++++Eqn+ipgl+nk+l+r a++v++
+ sp|B9M172|MURG_GEOSF 91 FRPDVVLGVGGYASAPVVLSARGLQIRRFIHEQNAIPGLTNKVLARIADKVFI 143
+ **************************************************985 PP
+
+>> sp|B5EBQ1|MURG_GEOBB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.5 0.0 1.9e-30 1.1e-27 2 139 .] 4 143 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 101.5 bits; conditional E-value: 1.9e-30
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++P +A+a+e+ +r +e + ++t++g+e+++ ++ g++ i + + + + ++k+++++ + l ++ ++++ilke
+ sp|B5EBQ1|MURG_GEOBB 4 IIAGGGTGGHLFPGIAVADEFLARSPENEvlfVGTERGIEARLlPKLGYKLALISAS-GMKGMG-TIKKIMSAGRLLYGYSQSRKILKE 90
+ 68**********************9887777**************************.999988.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++pd+v+g+ggy+++++++aa+ gi ++++Eqn+ pgl+nk+l r+++gv++
+ sp|B5EBQ1|MURG_GEOBB 91 FRPDLVLGVGGYASAPIVLAARGMGIRRFIHEQNAFPGLTNKVLGRFVDGVFI 143
+ **************************************************985 PP
+
+>> sp|Q3JND8|MURG_BURP1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.5 0.6 1.9e-30 1.1e-27 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.5 bits; conditional E-value: 1.9e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ q++G++V l+ p g+e+++ + +g++++ + + +l+ k+ +++ +++ l+a ++ ++l++ k
+ sp|Q3JND8|MURG_BURP1 9 MVMAGGTGGHVFPGLAVAHRMQAQGWRVVwLGNPAGMEATLvPRHGIPMEYVHFG-GLRGKG-LATKFALPFNLLRACAQSLRALRRVK 95
+ 5899***************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ + l g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|Q3JND8|MURG_BURP1 96 PDVVLGMGGYITFPAGLVTVLTGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|Q1IKH0|MURG_ACIBL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.8 0.3 1.5e-30 8.4e-28 2 137 .. 4 140 .. 3 142 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 101.8 bits; conditional E-value: 1.5e-30
+ EEE-------HHHHHHHHHHHHH.---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqr.rGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +laggGT+G+v Pa+A+a+eL++ G eV+ ++t++g+e+++ ++ag + + ++++ l++ +++ +k+ ++ ka+ ++++i++e+
+ sp|Q1IKH0|MURG_ACIBL 4 ILAGGGTGGHVIPALAIAQELKNvHGAEVIfIGTQRGIETRLvPAAGFSLKLVKVG-ALNRVS-FSTRIKTMFDLPKAILESRRIIREF 90
+ 79********************967*******************************.777755.9************************ PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kpdv +g+ggy++++a++aa+l+++p+++ E n pg++n+l++ +a +
+ sp|Q1IKH0|MURG_ACIBL 91 KPDVMIGVGGYASGPAMLAARLCRVPTVIFEPNIYPGFANRLVAPFAAAA 140
+ ******************************************99998765 PP
+
+>> sp|P74657|MURG_SYNY3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.1 0.0 2.6e-30 1.4e-27 2 138 .. 8 141 .. 7 142 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 101.1 bits; conditional E-value: 2.6e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+Ala++L +++ ++ l++p++le+++ + ++ ++i+++ +++ + slkt+k ++ l++++ +++++k++k+
+ sp|P74657|MURG_SYNY3 8 LIAASGTGGHLFPALALAQQLPDYE--IIwLGVPDRLETTLVPRQYPLQTIPVE-GFQGRP-SLKTIKIGWNLLRSVFTVRKLIKSKKI 92
+ 799********************99..556***********8888888889999.999999.*************************** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++v+ +ggy+a++a++aa+l++ip++ +E+n ipg+v+ +l r++++v+
+ sp|P74657|MURG_SYNY3 93 NAVATTGGYIAAPAIVAAKLCNIPVIFHESNFIPGKVTTWLGRWCDTVA 141
+ **********************************************997 PP
+
+>> sp|B1YSS4|MURG_BURA4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.6 0.4 1.7e-30 9.7e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.6 bits; conditional E-value: 1.7e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ ++G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l+ +++ l+a ++ +l++ +
+ sp|B1YSS4|MURG_BURA4 9 MVMAGGTGGHVFPGLAVAHRMEAAGWRVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LKTKLTLPFNLLRACWQSLGALRRVR 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ a+l+g p++++Eqn+i+gl+nk+l+++a++vlv
+ sp|B1YSS4|MURG_BURA4 96 PDVVLGMGGYITFPAGVMAALSGRPLVLHEQNSIAGLANKVLAKFAKRVLV 146
+ ************************************************986 PP
+
+>> sp|Q0BIK1|MURG_BURCM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.6 0.4 1.7e-30 9.7e-28 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.6 bits; conditional E-value: 1.7e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ ++G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l+ +++ l+a ++ +l++ +
+ sp|Q0BIK1|MURG_BURCM 9 MVMAGGTGGHVFPGLAVAHRMEAAGWRVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LKTKLTLPFNLLRACWQSLGALRRVR 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ a+l+g p++++Eqn+i+gl+nk+l+++a++vlv
+ sp|Q0BIK1|MURG_BURCM 96 PDVVLGMGGYITFPAGVMAALSGRPLVLHEQNSIAGLANKVLAKFAKRVLV 146
+ ************************************************986 PP
+
+>> sp|Q6HDR3|MURG2_BACHK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.5 0.0 3.9e-30 2.2e-27 1 138 [. 4 141 .. 4 142 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 100.5 bits; conditional E-value: 3.9e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +v++ggG++G+v P +A+ L++ +++ ++++ g+e+++ e++ +++++i+++ kl++++ lk++k+++ + k++ +a +++
+ sp|Q6HDR3|MURG2_BACHK 4 IVFTGGGSAGHVTPNLAIIPYLKEDNWDISyIGSHQGIEKTIiEKEDIPYYSIASG-KLRRYF-DLKNIKDPFLVMKGVMDAYVRIRK 89
+ 79******************************************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdv+++ gg+v+++++i+ +l+++p+ ++E++ pgl+nk+ r+a +++
+ sp|Q6HDR3|MURG2_BACHK 90 LKPDVIFSKGGFVSVPVVIGGWLNRVPVLLHESDMTPGLANKIALRFASKIF 141
+ ***********************************************99987 PP
+
+>> sp|Q81JE6|MURG2_BACAN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.5 0.0 3.9e-30 2.2e-27 1 138 [. 4 141 .. 4 142 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 100.5 bits; conditional E-value: 3.9e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +v++ggG++G+v P +A+ L++ +++ ++++ g+e+++ e++ +++++i+++ kl++++ lk++k+++ + k++ +a +++
+ sp|Q81JE6|MURG2_BACAN 4 IVFTGGGSAGHVTPNLAIIPYLKEDNWDISyIGSHQGIEKTIiEKEDIPYYSIASG-KLRRYF-DLKNIKDPFLVMKGVMDAYVRIRK 89
+ 79******************************************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdv+++ gg+v+++++i+ +l+++p+ ++E++ pgl+nk+ r+a +++
+ sp|Q81JE6|MURG2_BACAN 90 LKPDVIFSKGGFVSVPVVIGGWLNRVPVLLHESDMTPGLANKIALRFASKIF 141
+ ***********************************************99987 PP
+
+>> sp|Q0K6M4|MURG_RALEH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.2 0.2 2.3e-30 1.3e-27 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.2 bits; conditional E-value: 2.3e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++V l+ g+e+++ +++ ++++ i+ + +l+ k+ +++++ +++ l+a+ ++ ++l++ +
+ sp|Q0K6M4|MURG_RALEH 8 LVMAGGTGGHVFPGLAVAHALREQGWKVVwLGNRTGMEATLvPKHDIPMEFIQFG-GLRGKG-LVTKFLLPLNLLRAFWQSIAALRRVR 94
+ 789****************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p vv+g+ggy+ +a+ a+l+g p++++Eqn+i+gl+nk+l++ a++vl
+ sp|Q0K6M4|MURG_RALEH 95 PSVVLGMGGYITFPAGMMASLLGRPLVLHEQNSIAGLANKVLAKVADRVL 144
+ ***********************************************997 PP
+
+>> sp|Q5WY98|MURG_LEGPL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.0 0.0 2.6e-30 1.5e-27 1 137 [. 5 141 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.0 bits; conditional E-value: 2.6e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +v++ggGT+G+v P +Al +e++++G++V+ +++ g+e++ e ++++ + ++ kl++++ slk+l+++++ ++ ++ ++ +
+ sp|Q5WY98|MURG_LEGPL 5 IVFTGGGTAGHVTPNIALIKEFRKEGWNVEyIGSVSGIEKEMiEPLDIPFHGVSSG-KLRRYF-SLKNLLDPFKIVLGIIQSSLLFYKI 91
+ 79****************************************9*************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kpdvv++ gg+va +++++a+l++ip++ +E++ pgl+n+l+ ++n++
+ sp|Q5WY98|MURG_LEGPL 92 KPDVVFSKGGFVAFPVVVGAWLNRIPVVAHESDMSPGLANRLSFPFVNKI 141
+ *****************************************999988886 PP
+
+>> sp|A0RIN0|MURG3_BACAH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.5 0.0 3.9e-30 2.2e-27 1 138 [. 4 141 .. 4 142 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 100.5 bits; conditional E-value: 3.9e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +v++ggG++G+v P +A+ L++ +++ ++++ g+e+++ e++ +++++i+++ kl++++ lk++k+++ + k++ +a +++
+ sp|A0RIN0|MURG3_BACAH 4 IVFTGGGSAGHVTPNLAIIPYLKEDNWDISyIGSHQGIEKTIiEKEDIPYYSIASG-KLRRYF-DLKNIKDPFLVMKGVMDAYVRIRK 89
+ 79******************************************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdv+++ gg+v+++++i+ +l+++p+ ++E++ pgl+nk+ r+a +++
+ sp|A0RIN0|MURG3_BACAH 90 LKPDVIFSKGGFVSVPVVIGGWLNRVPVLLHESDMTPGLANKIALRFASKIF 141
+ ***********************************************99987 PP
+
+>> sp|Q7W4B4|MURG_BORPA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.9 0.4 2.9e-30 1.7e-27 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 100.9 bits; conditional E-value: 2.9e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G++ P +A+a+ L++rG++V l+ p+++e ++ + +g+e vp+ + +++ ++ + lk ++ +a +a + l++
+ sp|Q7W4B4|MURG_BORPA 6 ILIMAGGTGGHIMPGLAVAEVLRERGWRVLwLGNPDKMEGRLvPPRGIELVPLRFQ-GVRGRG-AAALLKLPFLLARACAQAWRRLADI 92
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pdvv+g+ggyva + ++ a+l++ p++v+Eqn+++g +n++l+r a +vl
+ sp|Q7W4B4|MURG_BORPA 93 RPDVVLGMGGYVAFPGGVMAALRRMPLVVHEQNAVAGTANRWLARLARRVL 143
+ *********************************************999987 PP
+
+>> sp|Q5X6U5|MURG_LEGPA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.0 0.0 2.6e-30 1.5e-27 1 137 [. 5 141 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.0 bits; conditional E-value: 2.6e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +v++ggGT+G+v P +Al +e++++G++V+ +++ g+e++ e ++++ + ++ kl++++ slk+l+++++ ++ ++ ++ +
+ sp|Q5X6U5|MURG_LEGPA 5 IVFTGGGTAGHVTPNIALIKEFRKEGWNVEyIGSVSGIEKEMiEPLDIPFHGVSSG-KLRRYF-SLKNLLDPFKIVLGIIQSSLLFYKI 91
+ 79****************************************9*************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kpdvv++ gg+va +++++a+l++ip++ +E++ pgl+n+l+ ++n++
+ sp|Q5X6U5|MURG_LEGPA 92 KPDVVFSKGGFVAFPVVVGAWLNRIPVVAHESDMSPGLANRLSFPFVNKI 141
+ *****************************************999988886 PP
+
+>> sp|Q5ZXC4|MURG_LEGPH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.0 0.0 2.6e-30 1.5e-27 1 137 [. 5 141 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.0 bits; conditional E-value: 2.6e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +v++ggGT+G+v P +Al +e++++G++V+ +++ g+e++ e ++++ + ++ kl++++ slk+l+++++ ++ ++ ++ +
+ sp|Q5ZXC4|MURG_LEGPH 5 IVFTGGGTAGHVTPNIALIKEFRKEGWNVEyIGSVSGIEKEMiEPLDIPFHGVSSG-KLRRYF-SLKNLLDPFKIVLGIIQSSLLFYKI 91
+ 79****************************************9*************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kpdvv++ gg+va +++++a+l++ip++ +E++ pgl+n+l+ ++n++
+ sp|Q5ZXC4|MURG_LEGPH 92 KPDVVFSKGGFVAFPVVVGAWLNRIPVVAHESDMSPGLANRLSFPFVNKI 141
+ *****************************************999988886 PP
+
+>> sp|A6M1F0|MURG_CLOB8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.4 0.0 2e-30 1.1e-27 1 136 [. 6 141 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 101.4 bits; conditional E-value: 2e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggGT+G+v P +Al +L++++ e++ +++ +g+e+++ ++ ++++ i ++ kl++++ +k+++++++ lk++ +a +il+++
+ sp|A6M1F0|MURG_CLOB8 6 IIMTGGGTAGHVTPNLALVPKLKQKDFEIKyIGSFDGIEKEIiTKNNIPFFGISCG-KLRRYF-DVKNFTDPFKILKGIAQALKILSKE 92
+ 689*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ kpdv+++ gg+va++++iaa+ +ip++ +E++ pgl+nkl++ ++++
+ sp|A6M1F0|MURG_CLOB8 93 KPDVIFSKGGFVAVPVVIAASIKKIPVVAHESDMTPGLANKLSAPFCDK 141
+ ******************************************9988876 PP
+
+>> sp|B8D7B9|MURG_BUCAT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.4 0.0 2e-30 1.1e-27 1 135 [. 6 140 .. 6 144 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 101.4 bits; conditional E-value: 2e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gG++G+v+P + +ar L ++G+ V ++t++ +e+++ +++g++++ i ++ +l++ + + ++ l+a+ ++k+i+k +
+ sp|B8D7B9|MURG_BUCAT 6 IIIMAGGSGGHVFPGLTIARYLIEKGWLVNwIGTKNSIESRIiPKYGIKIHYISIK-GLRNTS-LKNLIISPIYILRAYYAVKKIIKTW 92
+ 6899****************************************************.****66.666778999999************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +pd+v+g+ggyv+++ ++a++ ++ip+ ++Eqn i+g++nk+l+r +
+ sp|B8D7B9|MURG_BUCAT 93 SPDIVLGMGGYVSGPGGVASWNCNIPLLLHEQNKIAGITNKWLSRIST 140
+ *******************************************99766 PP
+
+>> sp|P57311|MURG_BUCAI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.4 0.0 2e-30 1.1e-27 1 135 [. 6 140 .. 6 144 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 101.4 bits; conditional E-value: 2e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gG++G+v+P + +ar L ++G+ V ++t++ +e+++ +++g++++ i ++ +l++ + + ++ l+a+ ++k+i+k +
+ sp|P57311|MURG_BUCAI 6 IIIMAGGSGGHVFPGLTIARYLIEKGWLVNwIGTKNSIESRIiPKYGIKIHYISIK-GLRNTS-LKNLIISPIYILRAYYAVKKIIKTW 92
+ 6899****************************************************.****66.666778999999************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +pd+v+g+ggyv+++ ++a++ ++ip+ ++Eqn i+g++nk+l+r +
+ sp|P57311|MURG_BUCAI 93 SPDIVLGMGGYVSGPGGVASWNCNIPLLLHEQNKIAGITNKWLSRIST 140
+ *******************************************99766 PP
+
+>> sp|Q7VUQ3|MURG_BORPE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.6 0.4 3.6e-30 2e-27 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 100.6 bits; conditional E-value: 3.6e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G++ P +A+a+ L++rG++V l+ p+++e ++ + +g+e vp+ + +++ ++ + lk ++ +a +a + l++
+ sp|Q7VUQ3|MURG_BORPE 6 ILIMAGGTGGHIMPGLAVAEVLRERGWRVLwLGNPDKMEGRLvPPRGIELVPLRFQ-GVRGRG-AAALLKLPFLLARACAQAWRRLADI 92
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pdvv+g+ggyva + ++ a+l++ p++v+Eqn+++g +n++l+r a +vl
+ sp|Q7VUQ3|MURG_BORPE 93 RPDVVLGMGGYVAFPGGVMAALRRTPLVVHEQNAVAGTANRWLARLARRVL 143
+ *********************************************999987 PP
+
+>> sp|Q7WFS2|MURG_BORBR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.6 0.4 3.6e-30 2e-27 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 100.6 bits; conditional E-value: 3.6e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G++ P +A+a+ L++rG++V l+ p+++e ++ + +g+e vp+ + +++ ++ + lk ++ +a +a + l++
+ sp|Q7WFS2|MURG_BORBR 6 ILIMAGGTGGHIMPGLAVAEVLRERGWRVLwLGNPDKMEGRLvPPRGIELVPLRFQ-GVRGRG-AAALLKLPFLLARACAQAWRRLADI 92
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pdvv+g+ggyva + ++ a+l++ p++v+Eqn+++g +n++l+r a +vl
+ sp|Q7WFS2|MURG_BORBR 93 RPDVVLGMGGYVAFPGGVMAALRRTPLVVHEQNAVAGTANRWLARLARRVL 143
+ *********************************************999987 PP
+
+>> sp|B2SYX6|MURG_BURPP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 99.8 0.3 6.3e-30 3.6e-27 2 139 .] 10 147 .. 9 147 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 99.8 bits; conditional E-value: 6.3e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a+ q+ G++V l+ p g+e+++ +++g++++ + + +l+ k+ + ++l+ + + l+a ++ +l++ k
+ sp|B2SYX6|MURG_BURPP 10 MVMAGGTGGHVFPGLAVAHLMQAWGWKVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-MKTKLMLPVNLLRACTQSLSVLRRVK 96
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ ++l+g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|B2SYX6|MURG_BURPP 97 PDVVLGMGGYITFPAGLMTALSGRPLVLHEQNSIAGLANKVLAKVAKRVLV 147
+ ***********************************************9986 PP
+
+>> sp|B0B8Y7|MURG_CHLT2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.9 0.0 2.9e-30 1.6e-27 1 137 [. 7 141 .. 7 143 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 100.9 bits; conditional E-value: 2.9e-30
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G++ Pa+A +++ ++++eV l +gl++f+ ++++++ i+++ + +l+ +++++ + + +k++ +a + +++++
+ sp|B0B8Y7|MURG_CHLT2 7 IVLAVGGTGGHIIPALAARETFIHEDIEV-LLLGKGLAHFLgDDSEIAYCDIPSG--SPFSLRVNRMFSGAKQLYKGYVAALQKIRDFT 92
+ 79***************************.99***********************..44444777777777777777************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pd+ +gfg+y++++a++a+++++ip++++Eqn +pg+vnkl++r+a+gv
+ sp|B0B8Y7|MURG_CHLT2 93 PDLAIGFGSYHSLPAMLASIRSRIPLFLHEQNIVPGKVNKLFSRFAKGV 141
+ ***********************************************98 PP
+
+>> sp|B0BAL6|MURG_CHLTB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.9 0.0 2.9e-30 1.6e-27 1 137 [. 7 141 .. 7 143 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 100.9 bits; conditional E-value: 2.9e-30
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G++ Pa+A +++ ++++eV l +gl++f+ ++++++ i+++ + +l+ +++++ + + +k++ +a + +++++
+ sp|B0BAL6|MURG_CHLTB 7 IVLAVGGTGGHIIPALAARETFIHEDIEV-LLLGKGLAHFLgDDSEIAYCDIPSG--SPFSLRVNRMFSGAKQLYKGYVAALQKIRDFT 92
+ 79***************************.99***********************..44444777777777777777************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pd+ +gfg+y++++a++a+++++ip++++Eqn +pg+vnkl++r+a+gv
+ sp|B0BAL6|MURG_CHLTB 93 PDLAIGFGSYHSLPAMLASIRSRIPLFLHEQNIVPGKVNKLFSRFAKGV 141
+ ***********************************************98 PP
+
+>> sp|B8D914|MURG_BUCA5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 101.0 0.0 2.6e-30 1.5e-27 1 135 [. 6 140 .. 6 144 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 101.0 bits; conditional E-value: 2.6e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gG++G+v+P + +ar L ++G+ V ++t++ +e+++ +++g++++ i ++ +l++ + + ++ l+a+ ++k+i+k +
+ sp|B8D914|MURG_BUCA5 6 IIIMAGGSGGHVFPGLTIARYLIEKGWLVNwIGTKNSIESRIiPTYGIKIHYISIK-GLRNTS-LKNLIISPIYILRAYYAVKKIIKTW 92
+ 6899****************************************************.****66.666778999999************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +pd+v+g+ggyv+++ ++a++ ++ip+ ++Eqn i+g++nk+l+r +
+ sp|B8D914|MURG_BUCA5 93 SPDIVLGMGGYVSGPGGVASWNCNIPLLLHEQNKIAGITNKWLSRIST 140
+ *******************************************99766 PP
+
+>> sp|Q47AA4|MURG_DECAR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.4 0.3 4.2e-30 2.4e-27 1 138 [. 5 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 100.4 bits; conditional E-value: 4.2e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+++Pa+A+a++L+++G++V l+ p+g+e+++ +++g e+v i+ l+ k+ l++l+ + + l+++ + +++++
+ sp|Q47AA4|MURG_DECAR 5 ILVMAGGTGGHIFPALAVAHKLRDAGWRVVwLGNPEGMEARLvPQHGFEMVWIKFS-ALRGKG-ILRKLLLPVNLLRGFWQGLKAIRQV 91
+ 789*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kp+vv+g+ggy+ + + a+l g+p++++Eqn+++gl+n++l+ a++++
+ sp|Q47AA4|MURG_DECAR 92 KPNVVLGMGGYITFPGGMMAALTGVPLVLHEQNSVAGLANRVLASVADRIV 142
+ *********************************************999986 PP
+
+>> sp|A4JB94|MURG_BURVG UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.4 0.3 4.1e-30 2.3e-27 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 100.4 bits; conditional E-value: 4.1e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ ++G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l+ +++ l+a ++ +l++ +
+ sp|A4JB94|MURG_BURVG 9 MVMAGGTGGHVFPGLAVAHRMEAAGWRVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LKTKLTLPFNLLRACWQSLGALRRVR 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ ++l+g p++++Eqn+i+gl+nk+l+++a++vlv
+ sp|A4JB94|MURG_BURVG 96 PDVVLGMGGYITFPAGVMTALSGRPLVLHEQNSIAGLANKVLAKFAKRVLV 146
+ ************************************************986 PP
+
+>> sp|Q2Y638|MURG_NITMU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.4 0.1 4e-30 2.2e-27 1 138 [. 5 142 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 100.4 bits; conditional E-value: 4e-30
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+P +A+a+ L+++G+++ l+t+ g+e+++ +++g + ++i +l+ k + l+ +a+ l a+ ++ +++++
+ sp|Q2Y638|MURG_NITMU 5 ILIMAGGTGGHVFPGLAVAEYLKAAGWRIVwLGTEGGMETTLaRQQGHALETIRFS-GLRGKN-VRTWLLLPARLLLAFWQSARVIRKV 91
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pdvv+g+ggy a + + a+l+ p+ ++Eqn+ipgl+n++l+r a++vl
+ sp|Q2Y638|MURG_NITMU 92 RPDVVLGMGGYPAFPGGMMASLLARPLLIHEQNSIPGLANRILSRLADRVL 142
+ ************************************************997 PP
+
+>> sp|B2JHG0|MURG_BURP8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.2 0.2 4.6e-30 2.6e-27 2 139 .] 10 147 .. 9 147 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 100.2 bits; conditional E-value: 4.6e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a+ q+ G++V l+ p+g+e+++ +++g++++ ++ + +l+ k+ + ++l+ + + l+a ++ +l++ k
+ sp|B2JHG0|MURG_BURP8 10 MVMAGGTGGHVFPGLAVAHLMQAWGWRVVwLGNPNGMEATLvPKHGIPMEYVQFG-GLRGKG-MKTKLMLPVNLLRACMQSLSVLRRVK 96
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a+ ++l+g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|B2JHG0|MURG_BURP8 97 PDVVLGMGGYITFPAGMMTALSGTPLVLHEQNSIAGLANKVLAKLAKRVLV 147
+ ***********************************************9986 PP
+
+>> sp|O84766|MURG_CHLTR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.2 0.0 4.6e-30 2.6e-27 1 137 [. 7 141 .. 7 143 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 100.2 bits; conditional E-value: 4.6e-30
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G++ Pa+A +++ ++++eV l +gl++f+ ++++++ i+++ + +l+ +++++ + + +k++ +a + +++++
+ sp|O84766|MURG_CHLTR 7 IVLAVGGTGGHIIPALAARETFIHEDIEV-LLLGKGLAHFLgDDSEVAYCDIPSG--SPFSLRVNRMFSGAKQLYKGYVAALQKIRDFT 92
+ 79***************************.99***********************..44444777777777777777************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pd+ +gfg+y++++a++a+++++ip++++Eqn +pg+vnkl++r+a+gv
+ sp|O84766|MURG_CHLTR 93 PDLAIGFGSYHSLPAMLASIRSRIPLFLHEQNIVPGKVNKLFSRFAKGV 141
+ ***********************************************98 PP
+
+>> sp|Q3KKT1|MURG_CHLTA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.2 0.0 4.6e-30 2.6e-27 1 137 [. 7 141 .. 7 143 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 100.2 bits; conditional E-value: 4.6e-30
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G++ Pa+A +++ ++++eV l +gl++f+ ++++++ i+++ + +l+ +++++ + + +k++ +a + +++++
+ sp|Q3KKT1|MURG_CHLTA 7 IVLAVGGTGGHIIPALAARETFIHEDIEV-LLLGKGLAHFLgDDSEVAYCDIPSG--SPFSLRVNRMFSGAKQLYKGYVAALQKIRDFT 92
+ 79***************************.99***********************..44444777777777777777************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pd+ +gfg+y++++a++a+++++ip++++Eqn +pg+vnkl++r+a+gv
+ sp|Q3KKT1|MURG_CHLTA 93 PDLAIGFGSYHSLPAMLASIRSRIPLFLHEQNIVPGKVNKLFSRFAKGV 141
+ ***********************************************98 PP
+
+>> sp|A1AU61|MURG_PELPD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 99.8 0.0 6.2e-30 3.5e-27 2 138 .. 4 142 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 99.8 bits; conditional E-value: 6.2e-30
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++P +A+a+e+ r++ ++t++g+e++ ++ag + + i + + + k+ l++l+ +a ++++r++ ++l +
+ sp|A1AU61|MURG_PELPD 4 IIAGGGTGGHLFPGIAVAEEFLSRDPANQvlfVGTERGIEARAvPAAGFPLELISAA-GIRGKG-GLGKLRGAAMMFNGYRQSCRLLDR 90
+ 68***********************876666**************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++pd+v+g+ggy++++ l+aa+ +++p +++Eqn++pg++n+ll+r+a++++
+ sp|A1AU61|MURG_PELPD 91 FRPDAVLGVGGYASLPMLLAARTRQVPSFIHEQNAVPGMTNRLLSRFADRIF 142
+ *************************************************997 PP
+
+>> sp|Q2LR48|MURG_SYNAS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 99.8 0.0 6.3e-30 3.6e-27 1 138 [. 5 144 .. 5 145 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 99.8 bits; conditional E-value: 6.3e-30
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v++aggGT+G+++P vA+a+eL rr+ e r ++t++g+e++v + g + ++++ + + ++ ++ + l++ +l ++++i++
+ sp|Q2LR48|MURG_SYNAS 5 VIIAGGGTGGHLFPGVAIAEELLRRDRENRvlfVGTKRGIEKKVlKDLGFRLKLLNVE-GIKGRG-VMRSSLALLKLPGSLMQSMKIIR 91
+ 689**********************9999999************9999*999999999.555555.555555555555566******** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++pdvv+g+ggy++++a+ aa l gi++ +aEqn+ipgl+n++l r++++v+
+ sp|Q2LR48|MURG_SYNAS 92 DFRPDVVIGVGGYASGPAVMAAHLMGIKTAIAEQNSIPGLTNRILGRFVDRVF 144
+ **************************************************997 PP
+
+>> sp|Q2G995|MURG_NOVAD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 99.9 0.6 5.6e-30 3.2e-27 2 138 .. 9 143 .. 8 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 99.9 bits; conditional E-value: 5.6e-30
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ vla+gGT+G++ Pa Ala+eL rrGh+V l+t ++ ++ + + l+a+ ++++ +l + + ++ +k l + ++++ a +++++++p
+ sp|Q2G995|MURG_NOVAD 9 VLAAGGTGGHLIPAFALAVELDRRGHHVALVTDERGAKIPgKPDFLPAHVLPAG-RLGK--NPVALFKGLRAIWQGRAMALRLFESFEP 94
+ 8*****************************************************.9998..789999999999999************* PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ v+gfggy a++al+aa +a+ip++++Eqn++ g vn+ll++r++ ++
+ sp|Q2G995|MURG_NOVAD 95 SCVIGFGGYPALPALLAAHAARIPTVIHEQNAVLGRVNRLLAKRVDAIA 143
+ *********************************************9875 PP
+
+>> sp|A5EY03|MURG_DICNV UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 99.5 0.3 7.5e-30 4.2e-27 2 138 .. 9 145 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 99.5 bits; conditional E-value: 7.5e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+ar+ ++G ++ l+ + g+e + +eag ++ i++ +l+ ++ ++ lk ++ ++a+++ak+i++ +
+ sp|A5EY03|MURG_DICNV 9 LFMAGGTGGHVYPALAVARAAAEQGSIIHwLGNQSGFEGKKvPEAGFIFHDIAVY-GLRGNG-VIGWLKAPFMIGRAVFQAKKIMQHIQ 95
+ 799**********************9999*********9888*************.*****9.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+gg+++++ +iaa+ ++ip+ ++Eqn+++gl+n ll+r an++l
+ sp|A5EY03|MURG_DICNV 96 PDVVIGMGGFASGPGGIAAKILNIPLLIHEQNAVMGLTNALLSRVANTIL 145
+ **********************************************9986 PP
+
+>> sp|Q8FNU0|MURG_COREF UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 100.6 0.8 3.6e-30 2e-27 1 130 [. 10 140 .. 10 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 100.6 bits; conditional E-value: 3.6e-30
+ EEEE-------HHHHHHHHHHHHH.---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqr.rGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ vv+aggGT+G++ePa+A+a++L++ +G V+ l+t +gle+ + + +g + + i+p ++++ l+ +k ++++ k+lr+a+++l++
+ sp|Q8FNU0|MURG_COREF 10 VVVAGGGTAGHIEPALAVAEALRDgYGATVTaLGTARGLETSLvPDRGFDLRLIEPV-PVPRTP-NLDLVKLPFRVAKSLRQARQVLRD 96
+ 79********************9769*******************************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ +++vvgfggyv+++a++aa+++gip +v+E+n+++g++nkl
+ sp|Q8FNU0|MURG_COREF 97 TGAHAVVGFGGYVSAPAYLAARSLGIPFFVHEANARAGMANKLG 140
+ *****************************************986 PP
+
+>> sp|A9AI96|MURG_BURM1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 99.4 0.6 8.1e-30 4.5e-27 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 99.4 bits; conditional E-value: 8.1e-30
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ ++G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l +++ l+a ++ ++l++ +
+ sp|A9AI96|MURG_BURM1 9 MVMAGGTGGHVFPGLAVAHRMEAAGWRVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LKTKLALPFNLLRACAQSLAALRRVR 95
+ 5899***************************************************.******.99************************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ ++l+g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|A9AI96|MURG_BURM1 96 PDVVLGMGGYITFPAGVMTALSGRPLVLHEQNSIAGLANKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|Q21SW9|MURG_RHOFD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 99.7 0.1 6.9e-30 3.9e-27 2 138 .. 36 177 .. 35 178 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 99.7 bits; conditional E-value: 6.9e-30
+ EEE-------HHHHHHHHHHHHH---EEE......EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr......latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakei 83
+ ++++gGT+G+++P +Ala++L++rG++V+ a++p +e+++ + +g ++++i+ +++ k+ + ++ +++ l+a ++ ++
+ sp|Q21SW9|MURG_RHOFD 36 LIMAGGTGGHIFPGLALAHALRERGWRVHwlggagTASQPSMESQLvPPQGFAFESIDFS-GVRGKG-LGTLVRLPWRLLRACWQSVAL 122
+ 689***************************9999999***********************.******.********************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ l++ +pdvv+g ggy+ ++a++ + l+g +++++Eqn+++g++nk+l+r+a++v+
+ sp|Q21SW9|MURG_RHOFD 123 LRRVQPDVVLGLGGYITLPAGLMSVLLGKALILHEQNSVAGMANKVLARFATRVF 177
+ *****************************************************97 PP
+
+>> sp|B5YFT4|MURG_THEYD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 99.3 0.0 8.8e-30 4.9e-27 1 138 [. 3 142 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 99.3 bits; conditional E-value: 8.8e-30
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v++aggGT+G+++P +Ala+ L + +e ++tp+gle++v +++g+e i ++ ++ k ++++ k+l + lk+++++k i+
+ sp|B5YFT4|MURG_THEYD 3 VIIAGGGTGGHLFPGIALAESLIGKYPEAQiifVGTPKGLEAKViPKTGYELSFISIQ-GFVGKS-FSEKAKSLKSLLKSMFESKNIIN 89
+ 689**********************9999999**************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ pd+v+g+ggy++ ++++aa l +ip+++ Eqn +pgl+nkll + a v+
+ sp|B5YFT4|MURG_THEYD 90 SFAPDIVFGVGGYASFPVVLAAFLKKIPTIILEQNTVPGLANKLLGKIASAVA 142
+ *********************************************99998876 PP
+
+>> sp|A7KAK6|ATG26_PICAN Sterol 3-beta-glucosyltransferase OS=Pichia angusta GN=ATG26 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.8 0.0 1.2e-29 7e-27 1 138 [. 790 924 .. 790 925 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 98.8 bits; conditional E-value: 1.2e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.vklwakleslktlkelaeglkalrkakeilkea 87
+ ++l+++G+rGdv+P++Al+++L+++Gh+Vr++t+ ++e++++++g+ + +i++d +l+a +++ ++ +++ k+ ++ ++++ ++
+ sp|A7KAK6|ATG26_PICAN 790 FTLLTIGSRGDVQPYIALGKALMKEGHQVRIVTHAEFEPWIKKHGIRFASIAGDpSELMA--LMVTHPTINYNFIKEAKSKFRSWIDD 875
+ 789***************************************************555555..45666555555555555555556555 PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +v ++ ++++++li+++++ +++aE+++ip+++++++p+++++++
+ sp|A7KAK6|ATG26_PICAN 876 L--LVTSWKACQDTDILIESPSSICGIHIAEKLQIPYFRAFTMPWTRTRAY 924
+ 5..344566679***********************************9987 PP
+
+>> sp|Q46WZ4|MURG_RALEJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.9 0.1 1.2e-29 6.9e-27 2 138 .. 8 144 .. 7 145 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 98.9 bits; conditional E-value: 1.2e-29
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++L+++G++V l+ g+e+++ +++ ++++ i+ + +l+ k+ +++++ +++ l+a+ ++ +l++ +
+ sp|Q46WZ4|MURG_RALEJ 8 LVMAGGTGGHVFPGLAVAHALREQGWKVVwLGNRTGMEATLvPKHDIPMEFIQFG-GLRGKG-LVTKFLLPLNLLRAFWQSLGALRRVR 94
+ 789****************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p vv+g+ggy+ +a+ a+l+g p++++Eqn+i+gl+nk+l++ a++vl
+ sp|Q46WZ4|MURG_RALEJ 95 PSVVLGMGGYITFPAGMMASLLGRPLVLHEQNSIAGLANKVLAKVADRVL 144
+ ***********************************************997 PP
+
+>> sp|Q13TZ2|MURG_BURXL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.1 0.3 2e-29 1.1e-26 2 139 .] 10 147 .. 9 147 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 98.1 bits; conditional E-value: 2e-29
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a+ q+ G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l+ +++ l+a ++ +l++ k
+ sp|Q13TZ2|MURG_BURXL 10 MVMAGGTGGHVFPGLAVAHLMQAWGWKVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LKTKLMLPLNLLRACTQSLSVLRRVK 96
+ 5899***************************************************.******.99999999****************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ ++l+g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|Q13TZ2|MURG_BURXL 97 PDVVLGMGGYITFPAGLMTALSGRPLVLHEQNSIAGLANKVLAKVAKRVLV 147
+ ***********************************************9986 PP
+
+>> sp|C6DZK6|MURG_GEOSM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.2 0.0 1.9e-29 1.1e-26 2 139 .] 4 143 .. 3 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 98.2 bits; conditional E-value: 1.9e-29
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++P +A+a+e+ +r +e + ++t++g+e+++ ++ g++ i + + + + ++k+++++ + l ++ ++++ilke
+ sp|C6DZK6|MURG_GEOSM 4 IIAGGGTGGHLFPGIAIADEFLARSPENEvlfVGTERGIEARLlPKLGYKLALISAS-GMKGMG-TIKKIMSAGRLLYGYSQSRKILKE 90
+ 68**********************9887777**************************.999988.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++pd+v+g+ggy+++++++aa+ g+ ++++Eqn+ pgl+nk+l r ++gv++
+ sp|C6DZK6|MURG_GEOSM 91 FRPDLVLGVGGYASAPIVLAARGMGVRRFIHEQNAFPGLTNKVLGRIVDGVFI 143
+ *************************************************9985 PP
+
+>> sp|A8GVJ7|MURG_RICB8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.7 0.0 1.4e-29 7.7e-27 1 138 [. 4 135 .. 4 136 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 98.7 bits; conditional E-value: 1.4e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vl++gGT+G+++PavAl++eL +r +eV+++t ++e+ + agl ++ i+++ + + l+ l a++ka ++l + +
+ sp|A8GVJ7|MURG_RICB8 4 IVLVAGGTGGHFFPAVALGEELIKRKYEVHFITDLRCEKYInHDAGLIFHVIDLK-------RPKNILLFLPLLSLAIFKAIKLLFSLS 85
+ 79*****************************************************.......34444444444445899********** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p +vvgfggy ++ ++aa+++++p++++Eqn+ g+vn++++ +a++++
+ sp|A8GVJ7|MURG_RICB8 86 PSAVVGFGGYPVVASMFAAIFLRVPIVIHEQNSYLGKVNRFFANFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|Q1RI55|MURG_RICBR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.7 0.0 1.4e-29 7.7e-27 1 138 [. 4 135 .. 4 136 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 98.7 bits; conditional E-value: 1.4e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vl++gGT+G+++PavAl++eL +r +eV+++t ++e+ + agl ++ i+++ + + l+ l a++ka ++l + +
+ sp|Q1RI55|MURG_RICBR 4 IVLVAGGTGGHFFPAVALGEELIKRKYEVHFITDLRCEKYInHDAGLIFHVIDLK-------RPKNILLFLPLLSLAIFKAIKLLFSLS 85
+ 79*****************************************************.......34444444444445899********** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p +vvgfggy ++ ++aa+++++p++++Eqn+ g+vn++++ +a++++
+ sp|Q1RI55|MURG_RICBR 86 PSAVVGFGGYPVVASMFAAIFLRVPIVIHEQNSYLGKVNRFFANFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|B5ZWJ4|MURG_RHILW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.0 0.7 9.1e-29 5.1e-26 1 137 [. 6 141 .. 6 142 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 96.0 bits; conditional E-value: 9.1e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavp...igpdvklwakleslktlkelaeglkalrkakei 83
+ v+la+gGT+G+v+Pa Ala +L++rG+ V+l+t + e+ +++++++vp ig++ + ++ ++l+ + ++r+ak++
+ sp|B5ZWJ4|MURG_RHILW 6 VLLAAGGTGGHVFPAEALAFKLKERGYSVHLVTDSRAERYAgkfPAEEIHVVPsatIGSK-------NPVAVARSLWTLWSGMRAAKKL 87
+ 79********************************99999887668889999886444444.......366777777777777******* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++ kp +vvgfggy +++l+aa+++g+p+ ++Eqn+++g +nk+l+ r+ g+
+ sp|B5ZWJ4|MURG_RHILW 88 IQRLKPVIVVGFGGYPTVPPLLAATRLGVPTMIHEQNAVMGRANKALATRVQGI 141
+ ************************************************999886 PP
+
+>> sp|B0JFZ1|MURG_MICAN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.3 0.0 1.8e-29 1e-26 2 138 .. 9 142 .. 8 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 98.3 bits; conditional E-value: 1.8e-29
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+++Pa+Ala++L ++++e l++p++le + + ++ ++i+++ +++ +l lktlk l+++l+a+ +++ ++k+ +++
+ sp|B0JFZ1|MURG_MICAN 9 LIAASGTGGHLFPALALAERLPDYEIEW-LGVPDRLEQSLVPKTYPLHTIPIE-GFQTRL-GLKTLKILFSQLRAIWQVRSLIKKRQIA 94
+ 799**********************776.***********7788888889999.999999.**************************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +v+ +ggy+a++ ++aa+la+ip++++E+n ipg+v+k+l r++++v+
+ sp|B0JFZ1|MURG_MICAN 95 AVFTTGGYIAGPTILAARLANIPVILHESNYIPGKVTKVLGRWCDTVA 142
+ ********************************************9986 PP
+
+>> sp|Q31KS7|MURG_SYNE7 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.0 0.1 2.3e-29 1.3e-26 2 138 .. 9 141 .. 8 142 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 98.0 bits; conditional E-value: 2.3e-29
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+v+Pa+A+a++L ++ ++ l++p++le+++ + ++ ++i ++ +++ ++ l ++++++ a++k++++lk+++++
+ sp|Q31KS7|MURG_SYNE7 9 LFAASGTGGHVFPALAVAEALPEAKIDW-LGVPDRLETQLVGDRYPLHTIRVG-GFQGSW--LLRPLTALRLIGAIFKVRRLLKRQQIE 93
+ 79***********************888.************************.99**77..666777777779*************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +v+ +ggy+a++a+ aa+++gip++++E+n++pg++++ll+r++ +v+
+ sp|Q31KS7|MURG_SYNE7 94 AVFTTGGYIAGPAIAAAWSLGIPVVLHESNALPGKTTRLLSRFCRRVA 141
+ ********************************************9986 PP
+
+>> sp|Q5N140|MURG_SYNP6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.9 0.1 2.4e-29 1.3e-26 2 138 .. 15 147 .. 14 148 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 97.9 bits; conditional E-value: 2.4e-29
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+v+Pa+A+a++L ++ ++ l++p++le+++ + ++ ++i ++ +++ ++ l ++++++ a++k++++lk+++++
+ sp|Q5N140|MURG_SYNP6 15 LFAASGTGGHVFPALAVAEALPEAKIDW-LGVPDRLETQLVGDRYPLHTIRVG-GFQGSW--LLRPLTALRLIGAIFKVRRLLKRQQIE 99
+ 79***********************888.************************.99**77..666777777779*************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +v+ +ggy+a++a+ aa+++gip++++E+n++pg++++ll+r++ +v+
+ sp|Q5N140|MURG_SYNP6 100 AVFTTGGYIAGPAIAAAWSLGIPVVLHESNALPGKTTRLLSRFCRRVA 147
+ ********************************************9986 PP
+
+>> sp|Q14I26|MURG_FRAT1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.6 0.0 2.9e-29 1.6e-26 1 137 [. 8 143 .. 8 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 97.6 bits; conditional E-value: 2.9e-29
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+a+ L++ +V+ ++tp+++e+ + e ++++ i++ ++++k+ +k+++ +++ + k++ +lk+
+ sp|Q14I26|MURG_FRAT1 8 IIITAGGTGGHIYPALAIAELLRQNKANVTwVGTPNNMEASIvpEYFNIQF--IKSS-GVRRKG-IIKKITFPLKLAYNTLKSRSLLKK 92
+ 689***************************************655556666..9999.99****.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k+d+v+gfggyv++++++aa+ +ip++++Eqn+ gl+n++l+++a+++
+ sp|Q14I26|MURG_FRAT1 93 LKADLVIGFGGYVSGPICLAAAQINIPVIIHEQNAKIGLTNRILAKFATTI 143
+ ***********************************************9986 PP
+
+>> sp|Q5NGM4|MURG_FRATT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.6 0.0 2.9e-29 1.6e-26 1 137 [. 8 143 .. 8 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 97.6 bits; conditional E-value: 2.9e-29
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+a+ L++ +V+ ++tp+++e+ + e ++++ i++ ++++k+ +k+++ +++ + k++ +lk+
+ sp|Q5NGM4|MURG_FRATT 8 IIITAGGTGGHIYPALAIAELLRQNKANVTwVGTPNNMEASIvpEYFNIQF--IKSS-GVRRKG-IIKKITFPLKLAYNTLKSRSLLKK 92
+ 689***************************************655556666..9999.99****.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k+d+v+gfggyv++++++aa+ +ip++++Eqn+ gl+n++l+++a+++
+ sp|Q5NGM4|MURG_FRATT 93 LKADLVIGFGGYVSGPICLAAAQINIPVIIHEQNAKIGLTNRILAKFATTI 143
+ ***********************************************9986 PP
+
+>> sp|Q493Q1|MURG_BLOPB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.8 0.0 2.6e-29 1.5e-26 1 138 [. 7 144 .. 7 145 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 97.8 bits; conditional E-value: 2.6e-29
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gG++G+v+P +++a+ L + G++V l+t +++e+++ +++g++++ i ++ +++ + ++k +++l+ a+ +a++i+k +
+ sp|Q493Q1|MURG_BLOPB 7 IMIVAGGSGGHVFPGLSVAHYLINHGYQVVwLGTADRIESKLvPQYGIDIKFIRIN-GWNGEKLHIKCIMPLFIC-LAIYQARKIIKYW 93
+ 6789****************************************************.777666689999999987.9************ PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd+v+g+ggyv+++ ++aa+ +g+p++++Eqn i gl+n++l+ + ++vl
+ sp|Q493Q1|MURG_BLOPB 94 KPDIVLGMGGYVSGPGGLAAWTCGVPLIIHEQNRIIGLTNRYLSIFSKKVL 144
+ *******************************************98888775 PP
+
+>> sp|Q92I58|MURG_RICCN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.2 0.0 1.9e-29 1.1e-26 1 138 [. 4 135 .. 4 136 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 98.2 bits; conditional E-value: 1.9e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++PavAl++eL +rG+eV+++t +++ + ++ ++ ++++ +s + ++ l + a+ ka ++l + k
+ sp|Q92I58|MURG_RICCN 4 IILVAGGTGGHFFPAVALGEELIKRGYEVHFITDLRCKQYIkQDMKVIFHILDLK-------RSGNIFLFLPRLSIAVLKAIKLLYNMK 85
+ 689**************************************999***********.......688899999999999************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p v+vgfggy ++++aa+++++p++++Eqn+ g+vnk+++ +a++++
+ sp|Q92I58|MURG_RICCN 86 PSVTVGFGGYPVIAPMFAAIFLRVPIIIHEQNSYLGKVNKFFASFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|C3PND5|MURG_RICAE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.2 0.0 1.9e-29 1.1e-26 1 138 [. 4 135 .. 4 136 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 98.2 bits; conditional E-value: 1.9e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++PavAl++eL +rG+eV+++t +++ + ++ ++ ++++ +s + ++ l + a+ ka ++l + k
+ sp|C3PND5|MURG_RICAE 4 IILVAGGTGGHFFPAVALGEELIKRGYEVHFITDLRCKQYIkQDMKVIFHILDLK-------RSGNIFLFLPRLSIAVLKAIKLLYNMK 85
+ 689**************************************999***********.......688899999999999************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p v+vgfggy ++++aa+++++p++++Eqn+ g+vnk+++ +a++++
+ sp|C3PND5|MURG_RICAE 86 PSVTVGFGGYPVIAPMFAAIFLRVPIIIHEQNSYLGKVNKFFASFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|C4K2A6|MURG_RICPU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.2 0.0 1.9e-29 1.1e-26 1 138 [. 4 135 .. 4 136 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 98.2 bits; conditional E-value: 1.9e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++PavAl++eL +rG+eV+++t +++ + ++ ++ ++++ +s + ++ l + a+ ka ++l + k
+ sp|C4K2A6|MURG_RICPU 4 IILVAGGTGGHFFPAVALGEELIKRGYEVHFITDLRCKQYIkQDMKVIFHILDLK-------RSGNIFLFLPRLSIAVLKAIKLLYNMK 85
+ 689**************************************999***********.......688899999999999************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p v+vgfggy ++++aa+++++p++++Eqn+ g+vnk+++ +a++++
+ sp|C4K2A6|MURG_RICPU 86 PSVTVGFGGYPVIAPMFAAIFLRVPIIIHEQNSYLGKVNKFFASFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|B2S1A8|MURG_BORHD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.3 0.0 1.8e-29 1e-26 1 139 [] 7 148 .. 7 148 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 98.3 bits; conditional E-value: 1.8e-29
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ + ++ggGT+G+v+P +A+ +L++ + +++ l+ + +e+ + e + +++ +i+++ kl++++ sl+++++++++ ++ k+++i+
+ sp|B2S1A8|MURG_BORHD 7 IFFTGGGTGGHVFPGIAIISKLKELDTNIEffwLGQKGSMEDNIikEHEYIKFIAIPSG-KLRRYF-SLQNFTDVFKVIFGIIKSFFII 93
+ 679******************************************777889********.******.********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ k++kp++++++gg+v+ +++iaa+l++++ + +E + pgl++k+++++a ++++
+ sp|B2S1A8|MURG_BORHD 94 KKYKPQIIYATGGFVSSPPIIAASLLRVKSITHEMDLDPGLATKINSKFASKIHI 148
+ **************************************************99985 PP
+
+>> sp|A8GRZ6|MURG_RICRS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.2 0.0 1.9e-29 1.1e-26 1 138 [. 4 135 .. 4 136 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 98.2 bits; conditional E-value: 1.9e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++PavAl++eL +rG+eV+++t +++ + ++ ++ ++++ +s + ++ l + a+ ka ++l + k
+ sp|A8GRZ6|MURG_RICRS 4 IILVAGGTGGHFFPAVALGEELIKRGYEVHFITDLRCKQYIkQDMKVIFHILDLK-------RSGNIFLFLPRLSIAVLKAIKLLYNMK 85
+ 689**************************************999***********.......688899999999999************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p v+vgfggy ++++aa+++++p++++Eqn+ g+vnk+++ +a++++
+ sp|A8GRZ6|MURG_RICRS 86 PSVTVGFGGYPVIAPMFAAIFLRVPIIIHEQNSYLGKVNKFFASFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|B0BXF6|MURG_RICRO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.2 0.0 1.9e-29 1.1e-26 1 138 [. 4 135 .. 4 136 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 98.2 bits; conditional E-value: 1.9e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++PavAl++eL +rG+eV+++t +++ + ++ ++ ++++ +s + ++ l + a+ ka ++l + k
+ sp|B0BXF6|MURG_RICRO 4 IILVAGGTGGHFFPAVALGEELIKRGYEVHFITDLRCKQYIkQDMKVIFHILDLK-------RSGNIFLFLPRLSIAVLKAIKLLYNMK 85
+ 689**************************************999***********.......688899999999999************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p v+vgfggy ++++aa+++++p++++Eqn+ g+vnk+++ +a++++
+ sp|B0BXF6|MURG_RICRO 86 PSVTVGFGGYPVIAPMFAAIFLRVPIIIHEQNSYLGKVNKFFASFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|Q3SMH3|MURG_THIDA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.8 0.4 2.7e-29 1.5e-26 2 138 .. 9 145 .. 8 146 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 97.8 bits; conditional E-value: 2.7e-29
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+Pa+A+a++L++rG+ V l+t gle++v ++ag+++v + + +++ k+ +k+l+ +a l a+ ++ ++ + +
+ sp|Q3SMH3|MURG_THIDA 9 MVMAGGTGGHVYPALAVAETLRERGWSVFwLGTRAGLEARVvPAAGIDMVWVSMG-GVRGKG-LVKKLLLPAMLLVAFAQSLGAILRRR 95
+ 5899***************************************************.******.9************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggy a + + a+l++ p++v+Eqn++ gl+n+ll+ a++vl
+ sp|Q3SMH3|MURG_THIDA 96 PDVVLGMGGYTAFPGGMMASLLNRPLVVHEQNSVGGLTNRLLACLADRVL 145
+ *****************************************999998886 PP
+
+>> sp|Q21MG9|MURG_SACD2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.6 0.7 3.1e-29 1.7e-26 1 138 [. 32 175 .. 32 176 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 97.6 bits; conditional E-value: 3.1e-29
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-......--EEEE----S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea......gleavpigpdvklwakleslktlkelaeglkalrkak 81
+ vv+++gGT+G+v+P +A+a++ +rG ++ l++ g+e+++ ++a +++ +i++ +++ k+ ++ l ++++lka+++ak
+ sp|Q21MG9|MURG_SACD2 32 VVIMAGGTGGHVYPGLAVAEAMHQRGFNIAwLGSRGGMEKELvAKAseqmgfDIAFSEIEIS-GVRGKG-RMALLAAPFRVLKAIEQAK 118
+ 799****************************9999999988875553333334777779999.******.******************* PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +il++ +p++v+g+gg+va++ + aa++++ip++++Eqn+ +g +nk+l r+an l
+ sp|Q21MG9|MURG_SACD2 119 QILQKLRPALVIGMGGFVAGPGGMAARKLKIPLVIHEQNAAAGTTNKILRRFANLTL 175
+ *****************************************************9876 PP
+
+>> sp|B1IAM4|MURG_STRPI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.6 0.0 1.2e-28 6.8e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.6 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|B1IAM4|MURG_STRPI 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKRGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|B1IAM4|MURG_STRPI 91 RLRPQTLFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|Q04LK0|MURG_STRP2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.6 0.0 1.2e-28 6.8e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.6 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|Q04LK0|MURG_STRP2 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKRGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|Q04LK0|MURG_STRP2 91 RLRPQTLFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|Q8DQM1|MURG_STRR6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.6 0.0 1.2e-28 6.8e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.6 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|Q8DQM1|MURG_STRR6 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKRGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|Q8DQM1|MURG_STRR6 91 RLRPQTLFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|B2IN77|MURG_STRPS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.6 0.0 1.2e-28 6.8e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.6 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|B2IN77|MURG_STRPS 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKRGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|B2IN77|MURG_STRPS 91 RLRPQTLFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|C1CQG5|MURG_STRZT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.6 0.0 1.2e-28 6.8e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.6 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|C1CQG5|MURG_STRZT 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKRGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|C1CQG5|MURG_STRZT 91 RLRPQTLFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|C1CD52|MURG_STRZJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.6 0.0 1.2e-28 6.8e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.6 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|C1CD52|MURG_STRZJ 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKRGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|C1CD52|MURG_STRZJ 91 RLRPQTLFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|Q634T3|MURG2_BACCZ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.1 0.0 4.3e-29 2.4e-26 1 138 [. 4 141 .. 4 142 .. 0.99
+
+ Alignments for each domain:
+ == domain 1 score: 97.1 bits; conditional E-value: 4.3e-29
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +v++ggG++G+v P +A+ L++ +++ ++++ g+e+++ e++ + +++i+++ kl++++ lk++k+++ + k++ +a +++
+ sp|Q634T3|MURG2_BACCZ 4 IVFTGGGSAGHVTPNLAIIPYLKEDNWDISyIGSHQGIEKTIiEKEDILYYSIASG-KLRRYF-DLKNIKDPFLVMKGVMDAYVRIRK 89
+ 79******************************************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpdv+++ gg+v+++++i+ +l+++p+ ++E++ pgl+nk+ r+a +++
+ sp|Q634T3|MURG2_BACCZ 90 LKPDVIFSKGGFVSVPVVIGGWLNRVPVLLHESDMTPGLANKIALRFASKIF 141
+ ***********************************************99987 PP
+
+>> sp|A1VST6|MURG_POLNA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.5 0.2 3.1e-29 1.7e-26 2 138 .. 8 149 .. 7 150 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 97.5 bits; conditional E-value: 3.1e-29
+ EEE-------HHHHHHHHHHHHH---EEE......EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr......latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakei 83
+ ++++gGT+G+++P +A+a++L++rG++V+ a+ p +e+++ + +g ++++i+ +++ k+ ++ + +++ lka+ ++ ++
+ sp|A1VST6|MURG_POLNA 8 LVMAGGTGGHIFPGLAVAEALRERGWRVHwlggkgSAARPSMESQLvPPRGFSFETIDFS-GVRGKG-PVTLALLPLRLLKAFWQSVQV 94
+ 689***************************88888899**********************.******.********************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++ kpdvvvg ggy+a +a+ + l+g p++++Eqn+++g+vnk+l+ a++v+
+ sp|A1VST6|MURG_POLNA 95 IRRVKPDVVVGLGGYIAFPAGMMSVLLGKPLVLHEQNSVAGMVNKVLASVADRVF 149
+ ***************************************************9997 PP
+
+>> sp|A6UB85|MURG_SINMW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.6 0.8 6.1e-29 3.5e-26 1 136 [. 6 140 .. 6 142 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 96.6 bits; conditional E-value: 6.1e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavp...igpdvklwakleslktlkelaeglkalrkakei 83
+ ++la+gGT+G+++Pa Ala+eL++ G+ V+l+t + e+f +++++++v+ ig++ + +k +++++ + +lr+a+++
+ sp|A6UB85|MURG_SINMW 6 ILLAAGGTGGHLFPAEALAHELKASGYSVHLVTDSRAERFAgrfPADEIHVVAsatIGSK-------NPVKLARSAWKLWTGLRAARRL 87
+ 79**********************************999998778999999885444444.......599******************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ +++ kp +vvgfggy +++l+aa+ g+p++++Eqn+++g +nk l+ r+
+ sp|A6UB85|MURG_SINMW 88 ISRLKPMAVVGFGGYPTVPPLLAATGMGVPTIIHEQNAVMGRANKMLASRVAA 140
+ ***********************************************999876 PP
+
+>> sp|B9DNZ7|MURG_STACT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.9 0.0 9.8e-29 5.5e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.9 bits; conditional E-value: 9.8e-29
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l q+rG+e +++++g+e++ e++ g+++ pi ++ kl++++ s++++k+++++lk++ +a+++lk
+ sp|B9DNZ7|MURG_STACT 4 IAFTGGGTVGHVSVNLSLIPIAQERGYEAFyVGSKNGIEREMiESQlpGIQYFPISSG-KLRRYI-SVENIKDVFKVLKGVLDARKVLK 90
+ 79****************************************766566888889****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk++ ++a++++
+ sp|B9DNZ7|MURG_STACT 91 KQKPDLLFSKGGFVSVPVVIAARSLNIPVVIHESDITPGLANKISLKFAKKIY 143
+ **************************************************997 PP
+
+>> sp|B4E6J2|MURG_BURCJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.0 0.4 4.6e-29 2.6e-26 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 97.0 bits; conditional E-value: 4.6e-29
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ ++G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l+ + + l+a ++ +l++ +
+ sp|B4E6J2|MURG_BURCJ 9 MVMAGGTGGHVFPGLAVAHRMEAAGWRVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LKTKLTLPVNLLRACWQSLGALRRVR 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ ++l+g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|B4E6J2|MURG_BURCJ 96 PDVVLGMGGYITFPAGVMTALSGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|B1JV78|MURG_BURCC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.0 0.4 4.6e-29 2.6e-26 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 97.0 bits; conditional E-value: 4.6e-29
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ ++G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l+ + + l+a ++ +l++ +
+ sp|B1JV78|MURG_BURCC 9 MVMAGGTGGHVFPGLAVAHRMEAAGWRVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LKTKLTLPVNLLRACWQSLGALRRVR 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ ++l+g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|B1JV78|MURG_BURCC 96 PDVVLGMGGYITFPAGVMTALSGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|C1C649|MURG_STRP7 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.6 0.0 1.2e-28 6.8e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.6 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|C1C649|MURG_STRP7 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKRGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|C1C649|MURG_STRP7 91 RLRPQTLFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|Q2S9Z2|MURG_HAHCH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.8 0.2 5.3e-29 3e-26 1 135 [. 6 140 .. 6 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 96.8 bits; conditional E-value: 5.3e-29
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A a +L+++G +V l++ g+ee++ + ++++ i+++ +l+ k+ + l+ + + +al +a+ +++++
+ sp|Q2S9Z2|MURG_HAHCH 6 FLVMAGGTGGHVYPALASALALREQGANVVwLGARGGMEERIiGRTDIPMRLITIG-GLRGKG-VAALLMAPVNLVRALWQAFSVFRKE 92
+ 799*****************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ kpd v+g+gg+++++ +i a l g p++++Eqn+i+g++n++l+r a
+ sp|Q2S9Z2|MURG_HAHCH 93 KPDCVLGMGGFASGPGGIVACLTGTPLVIHEQNAIAGMTNRWLARGAR 140
+ ******************************************998765 PP
+
+>> sp|B5E2Z9|MURG_STRP4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.5 0.0 1.3e-28 7.6e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.5 bits; conditional E-value: 1.3e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|B5E2Z9|MURG_STRP4 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKRGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVCWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|B5E2Z9|MURG_STRP4 91 RLRPQTLFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|C1CJF3|MURG_STRZP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.5 0.0 1.3e-28 7.6e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.5 bits; conditional E-value: 1.3e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|C1CJF3|MURG_STRZP 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKRGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVCWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|C1CJF3|MURG_STRZP 91 RLRPQTLFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|A9I4V2|MURG_BORPD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.1 0.3 4.4e-29 2.5e-26 1 138 [. 6 143 .. 6 144 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 97.1 bits; conditional E-value: 4.4e-29
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++gGT+G++ P +A+a+ L++rG++V l+ p+++e ++ + +g++ vp + +++ ++ ++lk ++ l+a +a +l +
+ sp|A9I4V2|MURG_BORPD 6 VLIMAGGTGGHIMPGLAVADVLRERGWRVLwLGNPDKMEGRLvPPRGIDLVPMHFQ-GVRGRG-VAAMLKLPFLLLRACSQAWGHLTRV 92
+ 789*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pdvv+g+ggyva + + a+l+g p++v+Eqn+++g +n++l+r a +vl
+ sp|A9I4V2|MURG_BORPD 93 RPDVVLGMGGYVAFPGGMMAALRGLPLVVHEQNAVAGTANRWLARLARRVL 143
+ *********************************************999987 PP
+
+>> sp|B0RIJ3|MURG_CLAMS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.0 1.4 2.3e-29 1.3e-26 2 137 .. 5 142 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 98.0 bits; conditional E-value: 2.3e-29
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +laggGT+G+v P++A+a+eL++r++ + l+t +gle+++ +++g+e +i+ +++++ ++++ + ++ +a+ ++++ ++e
+ sp|B0RIJ3|MURG_CLAMS 5 LLAGGGTAGHVNPLLAVADELRAREPGSTilvLGTREGLESRLvPARGYELLTIARL-PFPRRP-NGAAVRFAPAFTRAVGQIRRMIAE 91
+ 89***********************9887899************************9.****99.999999999*************** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ dvvvgfggy+a++a++aa+++g+p++v+E+n+ pgl+n+l +r a+ v
+ sp|B0RIJ3|MURG_CLAMS 92 RGVDVVVGFGGYAAAPAYLAARRSGVPVVVHEANASPGLANRLGARVATAV 142
+ ********************************************9999887 PP
+
+>> sp|P0CB60|MURG_STRPN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.0 0.0 1.9e-28 1.1e-25 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.0 bits; conditional E-value: 1.9e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|P0CB60|MURG_STRPN 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKCGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|P0CB60|MURG_STRPN 91 RLRPQTLFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|B8ZMZ7|MURG_STRPJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.0 0.0 1.9e-28 1e-25 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.0 bits; conditional E-value: 1.9e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l+ ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i+
+ sp|B8ZMZ7|MURG_STRPJ 4 IVFTGGGTVGHVTLNLLLMPKFIEDGWEVHyIGDKRGIEHQEiLKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGIVQSLFIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+ +g+p++++E++ +gl+nk+ ++a++++
+ sp|B8ZMZ7|MURG_STRPJ 91 RLRPQILFSKGGFVSVPPVIAARVSGVPVFIHESDLSMGLANKIAYKFATKMY 143
+ **************************************************987 PP
+
+>> sp|B3PTW0|MURG_RHIE6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.9 0.7 2e-28 1.1e-25 1 137 [. 6 141 .. 6 142 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 94.9 bits; conditional E-value: 2e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavp...igpdvklwakleslktlkelaeglkalrkakei 83
+ v+la+gGT+G+v+Pa Ala +L++rG+ V+l+t + e+f +++++++vp ig++ + ++ ++l+ + ++r+ak++
+ sp|B3PTW0|MURG_RHIE6 6 VLLAAGGTGGHVFPAEALAFKLKERGYSVHLVTDSRAERFAgkfPAEEIHVVPsatIGSK-------NPVAVARSLWTLWSGMRAAKKL 87
+ 79**************************************98778888888885444444.......366777777777777******* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++ kp +vvgfggy +++l+aa+++gi+ ++Eqn+++g +nk+l+ r++ +
+ sp|B3PTW0|MURG_RHIE6 88 IQRLKPVIVVGFGGYPTVPPLLAATRLGIASMLHEQNAVMGRANKALAPRVKAI 141
+ ************************************************999876 PP
+
+>> sp|Q0SHS1|MURG_RHOSR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.7 1.3 5.8e-29 3.3e-26 1 138 [. 10 155 .. 10 156 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 96.7 bits; conditional E-value: 5.8e-29
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v++aggGT+G++ePa+A+a++ ++ + l+t +gle+++ +e+g++ + i+p +l++k +l+ l+ + +++ ++r+++e+l
+ sp|Q0SHS1|MURG_RHOSR 10 VIVAGGGTAGHIEPALAVADAIKAIDDTAVvtaLGTARGLETTLvPERGYPLELIPPV-PLPRKP-TLDLLRLPGRVRASVRRTREVLD 96
+ 689********************977433359**************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH......HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal......lagipanvaEqngipglvnkllprrangvl 138
+ +dvvvgfggyva++a++aa +++ip++v+E+n+ +g++nk+ +rra +vl
+ sp|Q0SHS1|MURG_RHOSR 97 ATGADVVVGFGGYVALPAYLAAGpgllrrRRRIPIVVHEANASAGIANKIGARRAARVL 155
+ *********************98999999**************************9997 PP
+
+>> sp|Q313Q3|MURG_DESDG UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.8 0.9 5.4e-29 3.1e-26 1 139 [] 4 143 .. 4 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 96.8 bits; conditional E-value: 5.4e-29
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+l++gGT+G+++Pa+A+a+e +r+ + ++ + g e+++ +++g+ ++ ++++ +++ + lk+++ la+ ++ + ++++
+ sp|Q313Q3|MURG_DESDG 4 VLLTTGGTGGHIFPALAVAEEIRRQYPAADilfVGGSYGPEARIvPAHGIRFEGLPVR-GVMG--RGLKAPLALAAMTAGVARGMRLVG 89
+ 79************************99999999************************.9999..77********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ +++pdvv+gfggy+a +a++aa+l++ p v+Eqn++pg++n+ll++ a++v++
+ sp|Q313Q3|MURG_DESDG 90 RFNPDVVIGFGGYAAFAAMVAAKLREKPCAVHEQNSVPGMANRLLAKIADRVFI 143
+ ***************************************************985 PP
+
+>> sp|A8F1I4|MURG_RICM5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.8 0.0 5.4e-29 3.1e-26 1 138 [. 4 135 .. 4 136 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 96.8 bits; conditional E-value: 5.4e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++PavAl++eL +rG+eV+++t +++ + ++ ++ ++++ +s + ++ l + a+ ka ++l + k
+ sp|A8F1I4|MURG_RICM5 4 IILVAGGTGGHFFPAVALGEELIKRGYEVHFITDLRCKQYIkQDMKVIFHILDLK-------RSGNIFLFLPRLSIAVLKAIKLLYNMK 85
+ 689**************************************999***********.......688899999999999************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +v+vgfggy ++++aa+++++p++++Eqn+ g+vnk+++ +a++++
+ sp|A8F1I4|MURG_RICM5 86 SAVTVGFGGYPVIAPMFAAIFLRVPIIIHEQNSYLGKVNKFFASFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|A6H195|MURG_FLAPJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.0 0.0 4.5e-29 2.5e-26 1 138 [. 6 145 .. 6 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 97.0 bits; conditional E-value: 4.5e-29
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G+++Pa+A+a+eL+ r ++ + +++++++e + ++ag++++ + + +l++k+ +l++ + +++ l +l k++ i++
+ sp|A6H195|MURG_FLAPJ 6 FILSGGGTGGHIYPAIAIANELKSRFPNCKilfVGAKDKMEMQKvPQAGYDIKGLSIA-GLQRKI-TLQNAMFPFKLLSSLVKSFGIVQ 92
+ 79**************************************98877*************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpdvv+g+gg++++++l a+ +gi++++ Eqn+ pg++nkll+++an++
+ sp|A6H195|MURG_FLAPJ 93 QFKPDVVIGTGGFASGAVLKVASILGIATVIQEQNSYPGITNKLLSKKANKIC 145
+ **************************************************985 PP
+
+>> sp|A0K486|MURG_BURCH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.0 0.4 4.6e-29 2.6e-26 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 97.0 bits; conditional E-value: 4.6e-29
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ ++G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l+ + + l+a ++ +l++ +
+ sp|A0K486|MURG_BURCH 9 MVMAGGTGGHVFPGLAVAHRMEAAGWRVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LKTKLTLPVNLLRACWQSLGALRRVR 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ ++l+g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|A0K486|MURG_BURCH 96 PDVVLGMGGYITFPAGVMTALSGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|Q1BZG3|MURG_BURCA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 97.0 0.4 4.6e-29 2.6e-26 2 139 .] 9 146 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 97.0 bits; conditional E-value: 4.6e-29
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+v+P +A+a++ ++G++V l+ p g+e+++ +++g++++ + + +l+ k+ ++l+ + + l+a ++ +l++ +
+ sp|Q1BZG3|MURG_BURCA 9 MVMAGGTGGHVFPGLAVAHRMEAAGWRVVwLGNPAGMEATLvPKHGIPMEYVRFG-GLRGKG-LKTKLTLPVNLLRACWQSLGALRRVR 95
+ 5899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ pdvv+g+ggy+ +a++ ++l+g p++++Eqn+i+gl+nk+l++ a++vlv
+ sp|Q1BZG3|MURG_BURCA 96 PDVVLGMGGYITFPAGVMTALSGRPLVLHEQNSIAGLTNKVLAKLAKRVLV 146
+ ***********************************************9986 PP
+
+>> sp|Q12EL5|MURG_POLSJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.6 0.2 6e-29 3.4e-26 2 138 .. 35 176 .. 34 177 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 96.6 bits; conditional E-value: 6e-29
+ EEE-------HHHHHHHHHHHHH---EEE......EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr......latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakei 83
+ ++++gGT+G+++P +A+a++L++rG++V+ a +p +e+++ + +g ++++i+ +++ k+ l+ + +++ lka+ ++ ++
+ sp|Q12EL5|MURG_POLSJ 35 LVMAGGTGGHIFPGLAVAEALRERGWRVHwlggrgNAGHPSMESQLvPPRGFAFESIDFS-GVRGKG-PLTLVFLPLRLLKAFWQSIQV 121
+ 689***************************77777789**********************.******.********************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++ kpdvvvg ggy+a +a+ + l+g p++++Eqn+++g+vnk+l+ a++v+
+ sp|Q12EL5|MURG_POLSJ 122 VRRVKPDVVVGLGGYIAFPAGMMSVLLGKPLVLHEQNSVAGMVNKVLAGVADRVF 176
+ *************************************************999997 PP
+
+>> sp|Q8UDM8|MURG_AGRT5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.2 0.9 7.9e-29 4.5e-26 1 137 [. 6 141 .. 6 142 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 96.2 bits; conditional E-value: 7.9e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavp...igpdvklwakleslktlkelaeglkalrkakei 83
+ v+la+gGT+G+v+Pa Ala++L++rG++V+l+t + e+ +++++++vp ig++ + ++ +++l++ + +lr a+++
+ sp|Q8UDM8|MURG_AGRT5 6 VLLAAGGTGGHVFPAEALAHTLKARGYQVHLVTDSRAERYAgkfPADEIHVVPsatIGSK-------NPISVVRSLWKLWVGLRTARRL 87
+ 79********************************99999887678999999995444444.......599******************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ + + kp +vvgfggy +++l+a++ +g+p +++Eqn+++g +nk+l+ r++ +
+ sp|Q8UDM8|MURG_AGRT5 88 VTKLKPVAVVGFGGYPTVPPLLASTGLGVPSIIHEQNAVMGRANKALAARVKAI 141
+ *************************************************99876 PP
+
+>> sp|B7K5Z6|MURG_CYAP8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.6 0.0 6.1e-29 3.4e-26 2 138 .. 5 138 .. 4 139 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 96.6 bits; conditional E-value: 6.1e-29
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+++Pa+Ala++L ++ +e l++p++le ++ + ++ ++i+++ +++ + lk+l l++ +++++++ ++k + +d
+ sp|B7K5Z6|MURG_CYAP8 5 LIAASGTGGHLFPALALAEHLPDYQIEW-LGVPDRLEQTLVGDRYPLHSIAVE-GFQTRS-VLKNLQILFKLIRGIFEVRHLIKTHHID 90
+ 799********************99776.************************.****99.**************************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ vv+ +ggy+a++a+++a+lagi a+++E+n ipg+v++ll+r++++v+
+ sp|B7K5Z6|MURG_CYAP8 91 VVFTTGGYIAAPAILGARLAGIRAILHESNFIPGKVTRLLSRFCDRVA 138
+ *********************************************997 PP
+
+>> sp|Q2NCZ0|MURG_ERYLH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.4 0.2 1.4e-28 8e-26 2 137 .. 9 142 .. 8 144 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 95.4 bits; conditional E-value: 1.4e-28
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ vla+gGT+G++ Pa Ala eL rrGh+V l+t ++ ++ + + l+a+ i+++ ++ + + l+ + l +++k+++ ak+++++++p
+ sp|Q2NCZ0|MURG_ERYLH 9 VLAAGGTGGHLLPAFALAAELDRRGHHVALITDERGAKIPgKPDFLPAHVIPAG-RFGK--NPLRWVGGLRAVWKGREMAKRLFESFQP 94
+ 8*****************************************************.7777..566666666666666************* PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +vvgfggy a++a++aa+++ ip +++Eqn++ g vn+l + r+ +
+ sp|Q2NCZ0|MURG_ERYLH 95 SAVVGFGGYPALPAMLAASREDIPSIIHEQNAVLGRVNRLQAGRVSAI 142
+ ****************************************99998766 PP
+
+>> sp|Q9Y751|ATG26_PICPG Sterol 3-beta-glucosyltransferase OS=Pichia pastoris (strain GS115) GN=ATG26 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.5 0.0 1.3e-28 7.3e-26 1 138 [. 763 897 .. 763 898 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.5 bits; conditional E-value: 1.3e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrka 80
+ +vl+++G+rGdv+P+++la++L ++ h+V+++t+++++++ve++g+e+ +i+++ v++++ s+++lke+ e+
+ sp|Q9Y751|ATG26_PICPG 763 FVLLTIGSRGDVQPYISLAKGLLAENHKVKIVTHEEFKPWVESYGIEFATIAGNpaelmslmVTHKS--LSVGFLKEAKEK------- 841
+ 89*****************************************************999998888888..799999999999....... PP
+
+ HHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 81 keilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ + + + +++++ +++++li++++a++ +++aE+++ip+++++++p+++++++
+ sp|Q9Y751|ATG26_PICPG 842 FTGWIGELLQSSWDAC--QDADVLIESPSAMAGIHIAEKLQIPYFRAFTMPWTRTRAY 897
+ 999*****99999999..8999********************************9987 PP
+
+>> sp|Q5P6Z6|MURG_AZOSE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.3 0.2 7.5e-29 4.2e-26 2 138 .. 5 141 .. 4 142 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 96.3 bits; conditional E-value: 7.5e-29
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+++P vA+a++L+ rG+++ ++ p+g+e+++ +++g+e+ + + l+ k+ l++l+ +++ l+++ +a l++ +
+ sp|Q5P6Z6|MURG_AZOSE 5 LVMAGGTGGHIFPGVAVAEQLRGRGWRIVwMGNPDGMEARIvPQHGYETAWVHFG-ALRGKG-LLRKLLLPLNLLRGFWQALGELRRIR 91
+ 789****************************************************.******.99************************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggyv + + a+l+g p++v+Eqn+++gl+n++l+ a++vl
+ sp|Q5P6Z6|MURG_AZOSE 92 PDVVLGMGGYVTFPGGMMAALLGRPLVVHEQNSVAGLANRVLAGVADRVL 141
+ *********************************************99997 PP
+
+>> sp|B6IRG2|MURG_RHOCS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.3 1.1 7.6e-29 4.3e-26 1 137 [. 6 140 .. 6 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 96.3 bits; conditional E-value: 7.6e-29
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa AlareL +rGh+V l+t + ++f + ++++++ i + +l l++ ++++e + ++ +a+++l++ +
+ sp|B6IRG2|MURG_RHOCS 6 IVLAAGGTGGHLFPAEALARELLERGHRVVLVTDVRGTAFGdALREVPVHRIRSA-TLGG--GLLGKARTALELGIGTLQARRLLSRLE 91
+ 79*****************************************************.9999..469************************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p++vvgfggy + +a++aa+ ++ip+ ++Eqn+++g +n+ l+rra +
+ sp|B6IRG2|MURG_RHOCS 92 PAIVVGFGGYPSFPAVYAAAGLRIPVAIHEQNAVMGRANRMLARRARLI 140
+ *********************************************9865 PP
+
+>> sp|A7TF84|ATG26_VANPO Sterol 3-beta-glucosyltransferase OS=Vanderwaltozyma polyspora (strain ATCC 22028 / DSM 70294)
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.4 0.0 7e-29 3.9e-26 2 138 .. 760 895 .. 759 896 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 96.4 bits; conditional E-value: 7e-29
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ ++++G+rGdv+P++Ala++L ++Gh V+++t++++++fve +g+++++i++d v++ a +++l+e+ ++ +
+ sp|A7TF84|ATG26_VANPO 760 GFLTIGSRGDVQPYIALAKGLIQEGHSVTIITHREFKSFVECHGIDFKEIAGDptklmslmVEHEA--INVGMLMEASSK-------F 838
+ 589********************************************************9999999..69**********.......* PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + + +++++++ ++++li++++a++ +++ E+++ip+++++++p+++++++
+ sp|A7TF84|ATG26_VANPO 839 RGWIHDLLVTTWEACKNLKLDILIESPSAMAGIHISEALQIPYFRAFTMPWTRTRAY 895
+ *****************************************************9987 PP
+
+>> sp|Q2S528|MURG_SALRD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.3 1.4 3.1e-28 1.7e-25 1 138 [. 8 147 .. 8 148 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 94.3 bits; conditional E-value: 3.1e-28
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+v+Pa+A+a+++++ ++ +t+++le++ +eag++ +pi+++ +l+++ ++l+ ++++ ++l ++ +++
+ sp|Q2S528|MURG_SALRD 8 ILMVGGGTGGHVYPAIAIADAVRALRPDAQivfAGTQDRLEARAvPEAGYALHPITAQ-GLQRRA-VASNLLLPFRVAQGLVQSWRLVG 94
+ 6899***********************99987779***********************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pdv vg+ggyva+++l aa+l+g p+ + Eqn+ +gl+n++l+r a +++
+ sp|Q2S528|MURG_SALRD 95 AIEPDVAVGTGGYVAAPVLMAAWLRGRPLLIQEQNAYAGLTNRVLARLALRIH 147
+ *********************************************99887776 PP
+
+>> sp|B2SGS8|MURG_FRATM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.7 0.0 1.2e-28 6.5e-26 1 137 [. 8 143 .. 8 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 95.7 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+a+ L++ +V+ ++tp+ +e+ + e ++++ i++ ++++k+ +k+++ +++ + k++ +lk+
+ sp|B2SGS8|MURG_FRATM 8 IIITAGGTGGHIYPALAIAELLRQNKANVTwVGTPNSMEASIvpEYFNIQF--IKSS-GVRRKG-IIKKITFPLKLAYNTLKSRSLLKK 92
+ 689***************************************655556666..9999.99****.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k+d+v+gfggyv++++++aa+ +ip++++Eqn+ gl+n++l+++a+++
+ sp|B2SGS8|MURG_FRATM 93 LKADLVIGFGGYVSGPICLAAAQINIPVIIHEQNAKIGLTNRILAKFATTI 143
+ ***********************************************9986 PP
+
+>> sp|A4IX64|MURG_FRATW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.7 0.0 1.2e-28 6.5e-26 1 137 [. 8 143 .. 8 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 95.7 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+a+ L++ +V+ ++tp+ +e+ + e ++++ i++ ++++k+ +k+++ +++ + k++ +lk+
+ sp|A4IX64|MURG_FRATW 8 IIITAGGTGGHIYPALAIAELLRQNKANVTwVGTPNSMEASIvpEYFNIQF--IKSS-GVRRKG-IIKKITFPLKLAYNTLKSRSLLKK 92
+ 689***************************************655556666..9999.99****.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k+d+v+gfggyv++++++aa+ +ip++++Eqn+ gl+n++l+++a+++
+ sp|A4IX64|MURG_FRATW 93 LKADLVIGFGGYVSGPICLAAAQINIPVIIHEQNAKIGLTNRILAKFATTI 143
+ ***********************************************9986 PP
+
+>> sp|Q67Q48|MURG_SYMTH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.7 1.1 1.1e-28 6.3e-26 2 139 .] 4 143 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 95.7 bits; conditional E-value: 1.1e-28
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++ggGT+G+++Pa+++ar+L ++++e + ++t g e+ + ++ag+++ i ++ ++ + + l+ ++ ++ ++l +a ++++
+ sp|Q67Q48|MURG_SYMTH 4 LITGGGTGGHIYPALSIARALTEQDPEAEllyVGTRTGREAAIvPQAGIAFAVISSG-GVVNLG-LLQRVRGGLRAARGLLEALGHIRR 90
+ 79*******************************************************.999977.99999999999999********** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++pd+v+g+gg+va+++l aa+la++p+++ Eqn+ pg++n+l +r+a+ v+v
+ sp|Q67Q48|MURG_SYMTH 91 FRPDIVIGTGGFVAGPVLAAARLARVPLVIQEQNAFPGVTNRLAARWATAVFV 143
+ *************************************************9985 PP
+
+>> sp|Q6C8M8|ATG26_YARLI Sterol 3-beta-glucosyltransferase OS=Yarrowia lipolytica GN=ATG26 PE=3 SV=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.7 0.0 1.2e-28 6.6e-26 1 138 [. 997 1131 .. 997 1132 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 95.7 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalr 78
+ ++l+++G+rGdv+P+++l+++L ++Gh+Vr+at+ ++++++e +g+e++++++d v + +s+++l+++a++
+ sp|Q6C8M8|ATG26_YARLI 997 FTLLTIGSRGDVQPYISLGKALIEEGHRVRIATHSEFKDWIEGYGIEFKEVAGDpselmkimVDHGV--FSVSFLRDAASK----- 1075
+ 789*******************************************************997777777..8***********..... PP
+
+ HHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 79 kakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ + ++ + +++++ + ++li++++a++ +++aE+++ip+++++++p+ +++++
+ sp|Q6C8M8|ATG26_YARLI 1076 --FRGWINELLASSWEAC--QGSDVLIESPSAMAGIHIAEALQIPYFRAFTMPWSRTRAY 1131
+ ..9999999988887777..78999******************************99987 PP
+
+>> sp|C1AU55|MURG_RHOOB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.6 1.4 1.2e-28 7e-26 1 138 [. 10 155 .. 10 156 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 95.6 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v++aggGT+G++ePa+A+a++ ++ + l+t +gle+++ +e+g++ + ++p +l++k +l+ l+ + +++ ++r+++e+l
+ sp|C1AU55|MURG_RHOOB 10 VIVAGGGTAGHIEPALAVADAIKAIDDTAVvtaLGTARGLETTLvPERGYPLELVPPV-PLPRKP-TLDLLRLPGRVRASVRRTREVLD 96
+ 689********************977433359**************************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHH......HHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal......lagipanvaEqngipglvnkllprrangvl 138
+ +dvvvgfggyva++a++aa +++ip++v+E+n+ +g++nk+ +rra +vl
+ sp|C1AU55|MURG_RHOOB 97 ATGADVVVGFGGYVALPAYLAAGpgllrrRRRIPIVVHEANASAGIANKIGARRAARVL 155
+ *********************98999999**************************9997 PP
+
+>> sp|B3E3Y2|MURG_GEOLS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.6 0.1 1.2e-28 6.8e-26 2 139 .] 4 143 .. 3 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 95.6 bits; conditional E-value: 1.2e-28
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++P +A+a+e+ r++ +++++g+e++ + g++ + i + + + k+ sl++lk +a ++ ++++il +
+ sp|B3E3Y2|MURG_GEOLS 4 IVAGGGTGGHLFPGIAVAEEFLSRDPANQvlfVGSERGIEARAiPRLGYQLELISAA-GIRGKG-SLAKLKGAAMMIYGYAQSRKILHR 90
+ 68***********************876666**************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++pd+v+g+ggy++++ + aa+ +ip++++Eqn++pg++nk+l+r an+v++
+ sp|B3E3Y2|MURG_GEOLS 91 FQPDLVLGVGGYASLPMVMAARGMEIPRYIHEQNALPGMSNKVLSRVANKVFI 143
+ **************************************************985 PP
+
+>> sp|A0Q766|MURG_FRATN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.4 0.0 1.4e-28 8.1e-26 1 137 [. 8 143 .. 8 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 95.4 bits; conditional E-value: 1.4e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+a+ L++ +V+ ++tp+ +e+ + e ++++ i++ ++++k+ +k+++ +++ + +++ +lk+
+ sp|A0Q766|MURG_FRATN 8 IIITAGGTGGHIYPALAIAELLRQNKANVTwVGTPNSMEASIvpEYFNIQF--IKSS-GVRRKG-IIKKITFPLKLAYNTLRSRSLLKK 92
+ 689***************************************655556666..9999.99****.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k+d+v+gfggyv++++++aa+l +ip++++Eqn+ gl+n++l+++a+++
+ sp|A0Q766|MURG_FRATN 93 LKADLVIGFGGYVSGPICLAAALINIPVIIHEQNAKIGLTNRILAKFATTI 143
+ ***********************************************9986 PP
+
+>> sp|B1WVP7|MURG_CYAA5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 96.1 0.0 8.7e-29 4.9e-26 2 138 .. 5 138 .. 4 139 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 96.1 bits; conditional E-value: 8.7e-29
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+v+Pa+ +a++L +++++ l+tp++le + + +++++i ++ +++ + +k+lk l+ l +++++k++++++k+d
+ sp|B1WVP7|MURG_CYAA5 5 LIAASGTGGHVFPALGVAEKLSDYEIQW-LGTPNRLEQSLVGDRYPFHTISVE-GFQTRS-PIKKLKILLGLLSSIFEVKQLIEQQKID 90
+ 799*********************9666.************************.****99.**************************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ vv+ +ggy+a a++aa+l+gipa+++E+n ipg+v+kll+r++++v+
+ sp|B1WVP7|MURG_CYAA5 91 VVFTTGGYIASSAILAAKLSGIPAILHESNYIPGKVTKLLSRFCTTVA 138
+ ********************************************9986 PP
+
+>> sp|B0TY93|MURG_FRAP2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.6 0.0 1.2e-28 6.8e-26 1 137 [. 8 143 .. 8 145 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 95.6 bits; conditional E-value: 1.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+a+ L++ +V+ ++tp+ +e+ + e ++++ i++ +++ k+ +++ ++ ++ ka++ilk+
+ sp|B0TY93|MURG_FRAP2 8 IIITAGGTGGHIYPALAVAEMLRENNANVTwVGTPNSMEANIvpEYFNMQY--IKSS-GVRGKG-LKRKVAFPFTLISSTLKARKILKK 92
+ 689***************************************655555555..7777.778888.77777777777788999******* PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k+d+v+gfggyv++++++aa ip++++Eqn+ gl+n++l++ a++v
+ sp|B0TY93|MURG_FRAP2 93 LKIDLVIGFGGYVSGPICLAAVQKDIPIIIHEQNAKIGLTNRILAKLATKV 143
+ **********************************************99998 PP
+
+>> sp|Q68WW7|MURG_RICTY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.3 0.0 1.5e-28 8.7e-26 1 138 [. 4 135 .. 4 136 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 95.3 bits; conditional E-value: 1.5e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++PavAl++eL +rG+ V+++t ++++ + + ++ ++ ++++ ++++ l+ l l a+ k+ +++ k
+ sp|Q68WW7|MURG_RICTY 4 IILVAGGTGGHFFPAVALGEELIKRGYIVHFITDLRCKKYInKDMKIIFYLLDLK-------RFSNILLFLPTLLIAFLKSIKLIYHIK 85
+ 689***************************************************9.......567777777777777888********* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +v++gfggy ++++aa++++ip++++Eqn+ g+vnk+++r+a++++
+ sp|Q68WW7|MURG_RICTY 86 SCVIIGFGGYPVIAPMFAAIFLRIPIIIHEQNSYLGKVNKFFARFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|Q6GGZ0|MURG_STAAR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.5 0.0 1.3e-28 7.5e-26 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.5 bits; conditional E-value: 1.3e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+eV +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|Q6GGZ0|MURG_STAAR 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEVLyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|Q6GGZ0|MURG_STAAR 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|B9JH51|MURG_AGRRK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.6 0.4 2.4e-28 1.4e-25 1 136 [. 6 140 .. 6 142 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 94.6 bits; conditional E-value: 2.4e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavp...igpdvklwakleslktlkelaeglkalrkakei 83
+ ++la+gGT+G+v+Pa Ala +L++rG+ V+l+t + e+ +++++++vp ig++ + +k ++l+ + ++r+a+++
+ sp|B9JH51|MURG_AGRRK 6 ILLAAGGTGGHVFPAEALAYKLKERGYSVHLVTDSRAERYAgkfPADEIHVVPsatIGSK-------NPIKVARSLWTLWTGIRAARKL 87
+ 79********************************99999887678999999995444444.......588999999999999******* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ ++ kp vvgfggy +++l+aa++ g+pa ++Eqn+++g +nk+l+ r+
+ sp|B9JH51|MURG_AGRRK 88 IRTIKPLCVVGFGGYPTVPPLLAATRMGVPAMIHEQNAVMGRANKALAARVQA 140
+ ***********************************************999876 PP
+
+>> sp|Q6BN88|ATG26_DEBHA Sterol 3-beta-glucosyltransferase OS=Debaryomyces hansenii GN=ATG26 PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.9 0.0 2.1e-28 1.2e-25 1 138 [. 1050 1184 .. 1050 1185 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 94.9 bits; conditional E-value: 2.1e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalr 78
+ ++l+++G+rGdv+P++Al+++L ++Gh+V++at+ ++ee++ +g+++++i+++ v++ + +sl++lke+ ++
+ sp|Q6BN88|ATG26_DEBHA 1050 FTLLTIGSRGDVQPYIALGKGLLNEGHNVTIATHSDFEEWIVGHGIKFKTIAGNpvelmslmVTHGS--MSLSFLKEASSK----- 1128
+ 789***************************************************9888777666666..677777777777..... PP
+
+ HHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 79 kakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ + ++ d++++++ + ++li++++a++ a++aE++gip+++++++p+++++++
+ sp|Q6BN88|ATG26_DEBHA 1129 --FRGWIQELLDTSWKAC--QGSDILIESPSAMVGAHIAEALGIPYIRAFTMPWTRTRAY 1184
+ ..999*****99999999..788999******************************9987 PP
+
+>> sp|A7NDC0|MURG_FRATF UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.5 0.0 2.8e-28 1.6e-25 1 137 [. 8 143 .. 8 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 94.5 bits; conditional E-value: 2.8e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+a+ L++ +V+ ++tp+ +e+ + e ++++ i++ ++++k+ +k+++ +++ + k++ +lk+
+ sp|A7NDC0|MURG_FRATF 8 IIITAGGTGGHIYPALAIAELLRQNKANVTwVGTPNSMEASIvpEYFNIQF--IKSS-GVRRKG-IIKKITFPLKLAYNTLKSRSLLKK 92
+ 689***************************************655556666..9999.99****.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k+++v+gfggyv++++++aa+ +ip++++Eqn+ gl+n++l+++a+++
+ sp|A7NDC0|MURG_FRATF 93 LKANLVIGFGGYVSGPICLAAAQINIPVIIHEQNAKIGLTNRILAKFATTI 143
+ ***********************************************9986 PP
+
+>> sp|Q0BL37|MURG_FRATO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.5 0.0 2.8e-28 1.6e-25 1 137 [. 8 143 .. 8 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 94.5 bits; conditional E-value: 2.8e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+a+ L++ +V+ ++tp+ +e+ + e ++++ i++ ++++k+ +k+++ +++ + k++ +lk+
+ sp|Q0BL37|MURG_FRATO 8 IIITAGGTGGHIYPALAIAELLRQNKANVTwVGTPNSMEASIvpEYFNIQF--IKSS-GVRRKG-IIKKITFPLKLAYNTLKSRSLLKK 92
+ 689***************************************655556666..9999.99****.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k+++v+gfggyv++++++aa+ +ip++++Eqn+ gl+n++l+++a+++
+ sp|Q0BL37|MURG_FRATO 93 LKANLVIGFGGYVSGPICLAAAQINIPVIIHEQNAKIGLTNRILAKFATTI 143
+ ***********************************************9986 PP
+
+>> sp|Q2A2I7|MURG_FRATH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.5 0.0 2.8e-28 1.6e-25 1 137 [. 8 143 .. 8 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 94.5 bits; conditional E-value: 2.8e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa+A+a+ L++ +V+ ++tp+ +e+ + e ++++ i++ ++++k+ +k+++ +++ + k++ +lk+
+ sp|Q2A2I7|MURG_FRATH 8 IIITAGGTGGHIYPALAIAELLRQNKANVTwVGTPNSMEASIvpEYFNIQF--IKSS-GVRRKG-IIKKITFPLKLAYNTLKSRSLLKK 92
+ 689***************************************655556666..9999.99****.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k+++v+gfggyv++++++aa+ +ip++++Eqn+ gl+n++l+++a+++
+ sp|Q2A2I7|MURG_FRATH 93 LKANLVIGFGGYVSGPICLAAAQINIPVIIHEQNAKIGLTNRILAKFATTI 143
+ ***********************************************9986 PP
+
+>> sp|A5CS51|MURG_CLAM3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.7 1.7 1.2e-28 6.5e-26 2 137 .. 5 142 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 95.7 bits; conditional E-value: 1.2e-28
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +laggGT+G+v P++A+a+eL++r++ + l+t +gle+++ +++g+e +i+ +++++ ++++ + ++ +a+ ++++ ++e
+ sp|A5CS51|MURG_CLAM3 5 LLAGGGTAGHVNPLLAVADELRAREPGSTilvLGTREGLESRLvPARGYELLTIARL-PFPRRP-DGAAVRFAPAFARAVGQIRRMIAE 91
+ 89***********************9887899************************9.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +dvvvgfggy+a++a+ aa++ g+p++v+E+n+ pgl+n+l +r a v
+ sp|A5CS51|MURG_CLAM3 92 RGIDVVVGFGGYAAAPAYAAARRPGVPVVVHEANASPGLANRLGARVAAAV 142
+ ******************************************999988766 PP
+
+>> sp|Q9ZDC0|MURG_RICPR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.9 0.0 2e-28 1.1e-25 1 138 [. 4 135 .. 4 136 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 94.9 bits; conditional E-value: 2e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++PavAl++eL +rG+ V+++t ++++ + + ++ ++ ++++ ++ + ++ l ++ k+ +++ + k
+ sp|Q9ZDC0|MURG_RICPR 4 IILVAGGTGGHFFPAVALGEELIKRGYIVHFITDLRCKKYInKDMKIIFHILNLK-RFSN------IFLFLPILSITFLKSIRLIYNIK 85
+ 689****************************************************.4444......44444444456777********* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++v++gfggy ++++aa++++ip++++Eqn+ g+vnk+++r+a++++
+ sp|Q9ZDC0|MURG_RICPR 86 CCVIIGFGGYPVIAPMFAAIFLRIPIIIHEQNSYLGKVNKFFARFAKKIA 135
+ ***********************************************986 PP
+
+>> sp|Q9ZK59|MURG_HELPJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.8 0.0 2.2e-28 1.2e-25 1 138 [. 3 142 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 94.8 bits; conditional E-value: 2.2e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ a Ala eL ++G+e + l+++ g ++++ e++ l + +++ ++ +k ++k++++l+ + ka +kakeilk
+ sp|Q9ZK59|MURG_HELPJ 3 FALTGGGTGGHLSIAKALAIELEKQGIEAIyLGSTYGQDKEWfENSPLFSERyfFNTQ-GVVNKS-FFKKIRSLFLQAKAAFKAKEILK 89
+ 79*************************************************9445555.777777.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++++++++++gg++a++a++a+ll++ip++++Eqn+i g n++l+ +a+ v+
+ sp|Q9ZK59|MURG_HELPJ 90 KHQITHTISVGGFSAGPASFASLLNKIPLYIHEQNAIKGSLNRYLSPKAKAVF 142
+ *************************************************9987 PP
+
+>> sp|B7KGH1|MURG_CYAP7 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.6 0.0 2.5e-28 1.4e-25 2 138 .. 9 142 .. 8 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 94.6 bits; conditional E-value: 2.5e-28
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+++Pa+A+a++L ++ +e l++p++le ++ + ++ ++i+++ +++ + slk +k l+ + ++++++++l+e k+d
+ sp|B7KGH1|MURG_CYAP7 9 LIAASGTGGHLFPALAVAEQLLDYKIEW-LGVPNRLEQTLVPQDYPLHTIAVE-GFQTGF-SLKSVKILLGLFSSVFQVRKLLRERKID 94
+ 799********************99776.***********99999999*****.999988.99999999999999************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +v+ +ggy+a +a++aa+l+gip++++E+n +pg+v+++++r++ +v+
+ sp|B7KGH1|MURG_CYAP7 95 IVFTTGGYIASPAILAARLEGIPVILHESNYLPGKVTRFFSRWCQTVA 142
+ *******************************************99886 PP
+
+>> sp|Q4L6C8|MURG_STAHJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.6 0.0 2.4e-28 1.4e-25 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 94.6 bits; conditional E-value: 2.4e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + ++Gh+ ++++ g+e++ e++ ++e++pi ++ kl+++l s+++ k+++++lk++ +a+++lk
+ sp|Q4L6C8|MURG_STAHJ 4 IAFTGGGTVGHVSVNLSLIPTATDKGHDAFyIGSKTGIEREMiESQlpNIEYYPISSG-KLRRYL-SVDNAKDVFKVLKGVIDARKVLK 90
+ 79****************************************776655688999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk++ ++a++++
+ sp|Q4L6C8|MURG_STAHJ 91 REKPDLLFSKGGFVSVPVVIAARSLNIPTIIHESDLTPGLANKISLKFAKKIY 143
+ **************************************************997 PP
+
+>> sp|B4UES1|MURG_ANASK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 95.2 0.9 1.6e-28 9.3e-26 2 137 .. 4 141 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 95.2 bits; conditional E-value: 1.6e-28
+ EEE-------HHHHHHHHHHHHH---..EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGh..eVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+v+P +Ala+e+ +r + +V ++t +gle+ v ++ag +++ i+++ +l+ k+ ++l++l+ +a+ ++ +ilk+
+ sp|B4UES1|MURG_ANASK 4 MVAGGGTGGHVFPGIALAEEVVTRHPanDVVfVGTARGLEASVvPAAGFPIELIEVK-GLKGKG-IAGALLNLLLLPRAFLQSWRILKR 90
+ 68*******************99987336779*************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ ++pdvvvg+ggy+++++++ a++ +ip+ v Eqn+i+gl+n+ll r ++ +
+ sp|B4UES1|MURG_ANASK 91 WRPDVVVGVGGYASGPVVLTAWAMRIPTAVQEQNAIAGLTNRLLGRVVKAA 141
+ *******************************************99887765 PP
+
+>> sp|B9JY54|MURG_AGRVS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.7 1.3 2.4e-28 1.4e-25 1 137 [. 6 141 .. 6 142 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 94.7 bits; conditional E-value: 2.4e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavp...igpdvklwakleslktlkelaeglkalrkakei 83
+ ++la+gGT+G+++Pa Ala+eL++rG+ V+l+t + e+ +++ +++vp ig++ ++ k+l++l++g +r+a+ +
+ sp|B9JY54|MURG_AGRVS 6 ILLAAGGTGGHLFPAEALAHELRARGYSVHLVTDSRAERYAgkfPADAIHVVPsatIGSK--NPV--AIAKALLTLWRG---YRAARSL 87
+ 79*********************************9999985445666666664333333..333..555555555555...******* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ ++ kp vv+gfggy ++l+aa+++g++++++Eqn+++g +n++l+ r++ +
+ sp|B9JY54|MURG_AGRVS 88 IAGLKPLVVIGFGGYPTIPPLLAARALGVATVIHEQNAVMGRANRFLAPRVKAI 141
+ ************************************************999876 PP
+
+>> sp|Q1ME33|MURG_RHIL3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.0 0.8 7.8e-28 4.4e-25 1 136 [. 6 140 .. 6 142 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 93.0 bits; conditional E-value: 7.8e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavp...igpdvklwakleslktlkelaeglkalrkakei 83
+ v+la+gGT+G+v+Pa Ala +L++rG+ V+l+t + e+ +++++++vp ig++ + ++ ++l+ + ++r+ak++
+ sp|Q1ME33|MURG_RHIL3 6 VLLAAGGTGGHVFPAEALAFKLKERGYSVHLVTDSRAERYAgkfPAEEIHVVPsatIGSK-------NPVAVARSLWTLWSGMRAAKKL 87
+ 79********************************99999887668889999886444444.......366777777777777******* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ +++ +p +vvgfggy +++l+aa+++g+p ++Eqn+++g +nk+l+ r+
+ sp|Q1ME33|MURG_RHIL3 88 IQRLQPVIVVGFGGYPTVPPLLAATRLGVPSMIHEQNAVMGRANKALATRVQA 140
+ ***********************************************999876 PP
+
+>> sp|A8EZ14|MURG_RICCK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.8 0.0 4.5e-28 2.5e-25 1 138 [. 4 135 .. 4 136 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 93.8 bits; conditional E-value: 4.5e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++PavAl++eL +rG+eV++++ ++++ + ++ ++ ++++ +s + ++ l + a+ ka ++l + k
+ sp|A8EZ14|MURG_RICCK 4 IILVAGGTGGHFFPAVALGEELIKRGYEVHFIIDLRCKKYIsQDMKVIFHILDLK-------RSGNIFLFLPRLSIAVLKAIRLLYNIK 85
+ 689****************************************************.......688899999999999************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p v+vgfggy ++aa ++++p++++Eqn+ g+vnk++ +a++++
+ sp|A8EZ14|MURG_RICCK 86 PSVIVGFGGYPVISSMFAAVFLRVPIIIHEQNSYLGKVNKFFTSFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|Q5A950|ATG26_CANAL Sterol 3-beta-glucosyltransferase OS=Candida albicans GN=ATG26 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.2 0.0 6.7e-28 3.8e-25 1 138 [. 1017 1151 .. 1017 1152 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 93.2 bits; conditional E-value: 6.7e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalr 78
+ ++l+++G+rGdv+P++Al+++L ++Gh+V++at+ ++ +++++ gl +++i++d v++++ +s+++lk+++++
+ sp|Q5A950|ATG26_CANAL 1017 ITLLTIGSRGDVQPYIALGKGLVKEGHNVTIATHAEFGDWIKTFGLGFKEIAGDpaelmsfmVTHNS--MSVGFLKNAQQK----- 1095
+ 689****************************************************999999888888..899999999999..... PP
+
+ HHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 79 kakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++++ ++ +++++++ + ++li++++a+ +++aE++gip+++++++p+++++++
+ sp|Q5A950|ATG26_CANAL 1096 --FRSWISKLLTTSWEAC--QGSDILIESPSAMSGIHIAEALGIPYFRAFTMPWTRTRAY 1151
+ ..9999999989988887..788999******************************9987 PP
+
+>> sp|Q2IG27|MURG_ANADE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.4 0.9 2.9e-28 1.6e-25 2 137 .. 4 141 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 94.4 bits; conditional E-value: 2.9e-28
+ EEE-------HHHHHHHHHHHHH---..EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGh..eVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+v+P +Ala+e+ +r + +V ++t +gle+ v ++ag +++ i+++ +l+ k+ +++l++l+ +a+ ++ +il++
+ sp|Q2IG27|MURG_ANADE 4 MVAGGGTGGHVFPGIALAEEVVTRHPanDVVfVGTARGLEASVvPAAGFPIELIEVK-GLKGKG-LVGALLNLLLLPRAFLQSWRILRR 90
+ 68*******************99987336779*************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ ++pdvvvg+ggy+++++++ a++ +ip+ v Eqn+i+gl+n+ll r ++ +
+ sp|Q2IG27|MURG_ANADE 91 WRPDVVVGVGGYASGPVVLTAWAMRIPTAVQEQNAIAGLTNRLLGRVVKAA 141
+ *******************************************99887765 PP
+
+>> sp|B8J8E8|MURG_ANAD2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 94.1 1.0 3.6e-28 2e-25 2 137 .. 4 141 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 94.1 bits; conditional E-value: 3.6e-28
+ EEE-------HHHHHHHHHHHHH---..EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGh..eVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+v+P +Ala+e+ +r + +V ++t +gle+ v ++ag +++ i+++ +l+ k+ ++l++l+ +a+ ++ +il++
+ sp|B8J8E8|MURG_ANAD2 4 MVAGGGTGGHVFPGIALAEEVVTRHPanDVVfVGTARGLEASVvPAAGFPIELIEVK-GLKGKG-IAGALLNLLLLPRAFLQSWRILRR 90
+ 68*******************99987336779*************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ ++pdvvvg+ggy+++++++ a++ +ip+ v Eqn+i+gl+n+ll r ++ +
+ sp|B8J8E8|MURG_ANAD2 91 WRPDVVVGVGGYASGPVVLTAWAMRIPTAVQEQNAIAGLTNRLLGRVVKAA 141
+ *******************************************99887765 PP
+
+>> sp|C3MEM9|MURG_RHISN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.8 0.7 9.3e-28 5.2e-25 1 136 [. 6 140 .. 6 142 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 92.8 bits; conditional E-value: 9.3e-28
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavp...igpdvklwakleslktlkelaeglkalrkakei 83
+ + la+gGT+G+++Pa Ala+eL++ G+ V+l+t + e+ +++++++vp i +k +k ++++ + +lr+a+++
+ sp|C3MEM9|MURG_RHISN 6 IFLAAGGTGGHLFPAEALAHELKASGYAVHLVTDSRAERYAgkfPAEEVHVVPsatI------GSKN-PIKLAQSVWKLWTGLRAARRL 87
+ 689********************************9999985445666666664333......4444.99******************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ ++++kp +vvgfggy +++l+aa+ g+p ++Eqn+++g +nk l+ r+
+ sp|C3MEM9|MURG_RHISN 88 IARYKPRAVVGFGGYPTVPPLLAATGMGVPSLIHEQNAVMGRANKMLASRVQA 140
+ ************************************************99976 PP
+
+>> sp|Q1CSB1|MURG_HELPH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.1 0.0 7.3e-28 4.1e-25 1 138 [. 3 142 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 93.1 bits; conditional E-value: 7.3e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ a Ala eL ++G+e + l+++ g ++++ e++ l + +++ ++ +k ++k++ +l+ + ka +kakeilk
+ sp|Q1CSB1|MURG_HELPH 3 FALTGGGTGGHLSIAKALAIELEKQGIEAIyLGSTYGQDKEWfENSPLFSERyfFNTQ-GVVNKS-FFKKIGSLFLQAKAAFKAKEILK 89
+ 79*************************************************9445555.777777.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++++++++++gg++a++a++a+ll++ip++++Eqn+i g n++l+ +a+ v+
+ sp|Q1CSB1|MURG_HELPH 90 KHQITHTISVGGFSAGPASFASLLNKIPLYIHEQNAIKGSLNRYLSPKAKAVF 142
+ *************************************************9987 PP
+
+>> sp|P59424|MURG_BUCBP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.0 0.0 7.9e-28 4.4e-25 1 134 [. 4 137 .. 4 141 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 93.0 bits; conditional E-value: 7.9e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT G+++P + +a+ L ++G++V l+t++++e+++ +++g++++ i++ +++ k ++ + +++ a +ak+i+++
+ sp|P59424|MURG_BUCBP 4 IIIMAGGTCGHIFPGLEIAKSLINKGWKVFwLGTSKNIESKIvPKYGITIKYINIS-GVRGKN-LFELMAIPFKLIIACYQAKKIIENI 90
+ 6899****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprra 134
+ +pd+++g+ggyv+++ +i + l + p++++Eqn i+gl+nkll+++
+ sp|P59424|MURG_BUCBP 91 NPDIILGMGGYVSVPGGIISYLYKKPLIIHEQNKIAGLANKLLSKFT 137
+ *******************************************9986 PP
+
+>> sp|Q2K6C1|MURG_RHIEC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.4 0.8 2.4e-27 1.3e-24 1 137 [. 6 141 .. 6 142 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 91.4 bits; conditional E-value: 2.4e-27
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavp...igpdvklwakleslktlkelaeglkalrkakei 83
+ v+la+gGT+G+v+Pa Ala +L++rG+ V+l+t + e+ +++++++vp ig++ + ++ ++l+ + ++r+ak++
+ sp|Q2K6C1|MURG_RHIEC 6 VLLAAGGTGGHVFPAEALAFKLKERGYSVHLVTDSRAERYAgkfPAEEIHVVPsatIGSK-------NPVAVARSLWTLWSGMRAAKRL 87
+ 79********************************99999887668889999886444444.......366777777777777******* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++ kp +vvgfggy +++l+aa+++g++ ++Eqn+++g +nk+l+ r++ +
+ sp|Q2K6C1|MURG_RHIEC 88 IQRLKPVIVVGFGGYPTVPPLLAATRLGVASMLHEQNAVMGRANKALAPRVKAI 141
+ ************************************************999876 PP
+
+>> sp|O25770|MURG_HELPY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.1 0.0 7.3e-28 4.1e-25 1 138 [. 3 142 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 93.1 bits; conditional E-value: 7.3e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ a Ala eL ++G+e + l+++ g ++++ e++ l + +++ ++ +k ++k++ +l+ + ka +kakeilk
+ sp|O25770|MURG_HELPY 3 FALTGGGTGGHLSIAKALAIELEKQGIEAIyLGSTYGQDKEWfENSPLFSERyfFNTQ-GVVNKS-FFKKIGSLFLQAKAAFKAKEILK 89
+ 79*************************************************9445555.777777.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++++++++++gg++a++a++a+ll++ip++++Eqn+i g n++l+ +a+ v+
+ sp|O25770|MURG_HELPY 90 KHQITHTISVGGFSAGPASFASLLNKIPLYIHEQNAIKGSLNRYLSPKAKAVF 142
+ *************************************************9987 PP
+
+>> sp|A0M527|MURG_GRAFK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.6 0.0 1e-27 5.7e-25 1 135 [. 7 143 .. 7 146 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 92.6 bits; conditional E-value: 1e-27
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+l+ggGT+G+++Pa+A+a+e +rr ++ + +++++++e + ++ag+e++ + + + +++ slk++ +++ +l k+++i+k
+ sp|A0M527|MURG_GRAFK 7 VILSGGGTGGHIYPAIAIADEIKRRYPNAEilfVGAQDRMEMEKvPQAGYEIKGLWIS-GIDRSF-SLKNFIFPFKLMSSLSKSRKIIK 93
+ 789*************************************96555*************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ ++kpd+v+g+gg+ ++++l a++ gip+ + Eqn++pg++n++l++ a
+ sp|A0M527|MURG_GRAFK 94 KFKPDIVIGTGGFGSGPLLRIAISKGIPTLIQEQNSLPGVTNRILSKNAS 143
+ *********************************************99875 PP
+
+>> sp|B2UUR4|MURG_HELPS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.1 0.0 7.3e-28 4.1e-25 1 138 [. 3 142 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 93.1 bits; conditional E-value: 7.3e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ a Ala eL ++G+e + l+++ g ++++ e++ l + +++ ++ +k ++k++ +l+ + ka +kakeilk
+ sp|B2UUR4|MURG_HELPS 3 FALTGGGTGGHLSIAKALAIELEKQGIEAIyLGSTYGQDKEWfENSPLFSERyfFNTQ-GVVNKS-FFKKIGSLFLQAKAAFKAKEILK 89
+ 79*************************************************9445555.777777.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++++++++++gg++a++a++a+ll++ip++++Eqn+i g n++l+ +a+ v+
+ sp|B2UUR4|MURG_HELPS 90 KHQITHTISVGGFSAGPASFASLLNKIPLYIHEQNAIKGSLNRYLSPKAKAVF 142
+ *************************************************9987 PP
+
+>> sp|Q3K2P3|MURG_STRA1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.0 0.0 8e-28 4.5e-25 1 138 [. 5 144 .. 5 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 93.0 bits; conditional E-value: 8e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s+++++++++++ ++ ++ +i++
+ sp|Q3K2P3|MURG_STRA1 5 IVFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHEQiNQSGLdiTFHSIATG-KLRRYF-SWQNMLDVFKVGVGVLQSIAIIA 91
+ 79*************************************9988***98225666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+++p++v+E++ +gl+nk+ ++a+ ++
+ sp|Q3K2P3|MURG_STRA1 92 KLRPQALFSKGGFVSVPPVVAARLLKVPVFVHESDLSMGLANKIAYKFATIMY 144
+ ***********************************************999765 PP
+
+>> sp|Q8CX15|MURG_STRA5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.0 0.0 8e-28 4.5e-25 1 138 [. 5 144 .. 5 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 93.0 bits; conditional E-value: 8e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s+++++++++++ ++ ++ +i++
+ sp|Q8CX15|MURG_STRA5 5 IVFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHEQiNQSGLdiTFHSIATG-KLRRYF-SWQNMLDVFKVGVGVLQSIAIIA 91
+ 79*************************************9988***98225666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+++p++v+E++ +gl+nk+ ++a+ ++
+ sp|Q8CX15|MURG_STRA5 92 KLRPQALFSKGGFVSVPPVVAARLLKVPVFVHESDLSMGLANKIAYKFATIMY 144
+ ***********************************************999765 PP
+
+>> sp|Q8E6P0|MURG_STRA3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.0 0.0 8e-28 4.5e-25 1 138 [. 5 144 .. 5 145 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 93.0 bits; conditional E-value: 8e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ ++gl ++++i+++ kl++++ s+++++++++++ ++ ++ +i++
+ sp|Q8E6P0|MURG_STRA3 5 IVFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHEQiNQSGLdiTFHSIATG-KLRRYF-SWQNMLDVFKVGVGVLQSIAIIA 91
+ 79*************************************9988***98225666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+++p++v+E++ +gl+nk+ ++a+ ++
+ sp|Q8E6P0|MURG_STRA3 92 KLRPQALFSKGGFVSVPPVVAARLLKVPVFVHESDLSMGLANKIAYKFATIMY 144
+ ***********************************************999765 PP
+
+>> sp|Q7U346|MURG_BLOFL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.9 0.0 8.6e-28 4.8e-25 1 138 [. 8 146 .. 8 147 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 92.9 bits; conditional E-value: 8.6e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+++P +++ar L++ G++V +++++++e+++ + ++++++ i ++ +l+ k k ++ l+ + a+ ++++i++ +
+ sp|Q7U346|MURG_BLOFL 8 IMIIAGGTGGHIFPGLSVARYLMNHGYKVVwIGSKDRIESELvPVYNIDIKYICIQ-GLRGKKIYQKLITLLFLIFFAMYQSFKIIRCW 95
+ 6789****************************************************.99998856667777889999************ PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd+v+++ggyv+++ ++ a+l gip++++Eqn i+gl+n++++r+a+++l
+ sp|Q7U346|MURG_BLOFL 96 KPDIVLSMGGYVSGPSSLVAWLYGIPVIIHEQNRIMGLTNRYVSRFAKKIL 146
+ ************************************************986 PP
+
+>> sp|Q5HPC0|MURG_STAEQ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.9 0.0 8.5e-28 4.8e-25 2 138 .. 5 143 .. 4 144 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 92.9 bits; conditional E-value: 8.5e-28
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ + +ggGT G+v ++l + ++Ghe ++++ g+e++ e++ ++++pi ++ kl+++l s+++ k+++++lk++ +a++ilk+
+ sp|Q5HPC0|MURG_STAEQ 5 AYTGGGTVGHVSVNLSLIPTSIEKGHEAFyIGSKHGIEREMiESQlpDIQYYPISSG-KLRRYL-SFENAKDVFKVLKGILDARKILKK 91
+ 669**************************************766644688999****.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk++ ++a++++
+ sp|Q5HPC0|MURG_STAEQ 92 QKPDLLFSKGGFVSVPVVIAARSLKIPTIIHESDLTPGLANKISLKFAKKIY 143
+ *************************************************997 PP
+
+>> sp|Q8CMM3|MURG_STAES UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.9 0.0 8.5e-28 4.8e-25 2 138 .. 5 143 .. 4 144 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 92.9 bits; conditional E-value: 8.5e-28
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ + +ggGT G+v ++l + ++Ghe ++++ g+e++ e++ ++++pi ++ kl+++l s+++ k+++++lk++ +a++ilk+
+ sp|Q8CMM3|MURG_STAES 5 AYTGGGTVGHVSVNLSLIPTSIEKGHEAFyIGSKHGIEREMiESQlpDIQYYPISSG-KLRRYL-SFENAKDVFKVLKGILDARKILKK 91
+ 669**************************************766644688999****.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk++ ++a++++
+ sp|Q8CMM3|MURG_STAES 92 QKPDLLFSKGGFVSVPVVIAARSLKIPTIIHESDLTPGLANKISLKFAKKIY 143
+ *************************************************997 PP
+
+>> sp|Q01Q48|MURG_SOLUE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.6 0.3 1e-27 5.8e-25 1 138 [. 14 149 .. 14 150 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 92.6 bits; conditional E-value: 1e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++aggGT+G+v Pa+A+areL+ rGh+V ++t+ g+e+++ + +g e+++i+++ +l++ ++++ +l + ++ k +++++a
+ sp|Q01Q48|MURG_SOLUE 14 FLMAGGGTGGHVIPALAVARELRSRGHKVFfVGTQHGMEARLvPPEGFEFKTIEIG-GLNQVS-WNQKFATLSRLPITTLKCGRSVRDA 100
+ 79******************************************************.665533.5666666666644455555555555 PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +v+++ggyva++++ aal +++p++v E n+ pg++n++ +r + ++l
+ sp|Q01Q48|MURG_SOLUE 101 S--AVFSMGGYVAGPPVMAALVRRVPVVVMEPNAFPGFTNRVIARLVSRAL 149
+ 5..***************************************999887765 PP
+
+>> sp|B5Z8F1|MURG_HELPG UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.8 0.0 8.8e-28 4.9e-25 1 138 [. 3 142 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 92.8 bits; conditional E-value: 8.8e-28
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ a Ala eL ++G+e + l+++ g ++++ e++ l + +++ ++ +k ++k++ +l+ + ka +kakeilk
+ sp|B5Z8F1|MURG_HELPG 3 FALTGGGTGGHLSIAKALAIELEKQGIEAIyLGSTYGQDREWfENSPLFSERyfFNTQ-GVVNKS-FFKKIGSLFLQAKAAFKAKEILK 89
+ 79*************************************************9445555.777777.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++++++++++gg++a++a++a+ll++ip++++Eqn+i g n++l+ +a+ v+
+ sp|B5Z8F1|MURG_HELPG 90 NHQITHTISVGGFSAGPASFASLLNKIPLYIHEQNAIKGSLNRYLSPKAKAVF 142
+ *************************************************9987 PP
+
+>> sp|Q5L524|MURG_CHLAB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.6 0.0 1e-27 5.8e-25 1 138 [. 8 144 .. 8 145 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 92.6 bits; conditional E-value: 1e-27
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++la+gG++G++ Pa+A +++ r+G +V l +gle++ e+ + +++i+++ l+ ++ +++++++ + + +++kak+ l +
+ sp|Q5L524|MURG_CHLAB 8 IALAVGGSGGHIVPALATREAFCREGVDV-LLLGKGLENHPslGEQQILYKEIPSG--LPTFVRPITAVRRVCSLYAGYKKAKKELLIF 93
+ 79***************************.6666666666655999**********..77777899999999999999*********** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+gfg+y+++++l aal+ +ip++++Eqn +pg+vnkl++r+a+gv
+ sp|Q5L524|MURG_CHLAB 94 DPDVVIGFGSYHSLPVLMAALKKKIPIFLHEQNVVPGKVNKLFSRFAKGVG 144
+ ************************************************986 PP
+
+>> sp|Q255W4|MURG_CHLFF UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.7 0.0 1e-27 5.6e-25 1 138 [. 7 143 .. 7 144 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 92.7 bits; conditional E-value: 1e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++la+gG++G++ Pa+A +++ ++G++V l+ + + + e+ +++++i+++ l + +++++++ + + +++kak+ l +
+ sp|Q255W4|MURG_CHLFF 7 IALAVGGSGGHIVPALATRETFCKEGIDVLlLGKGLDNYPNLCEQDIPYREIPSG-SLSISR-PIAAIRNTRSLYIGYKKAKKELIAFG 93
+ 79***************************66666666666669************.666544.88999999999999************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+gfg+y+++++l aal+ +ip++++Eqn +pg+vnkl++r+a+gv
+ sp|Q255W4|MURG_CHLFF 94 PDVVIGFGSYHSLPVLMAALKKKIPIFLHEQNLVPGKVNKLFSRFAKGVG 143
+ ***********************************************986 PP
+
+>> sp|Q820E0|MURG_CHLCV UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.4 0.0 1.2e-27 6.7e-25 1 138 [. 8 144 .. 8 145 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 92.4 bits; conditional E-value: 1.2e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++la+gG++G++ Pa+A +++ ++G +V l+ + + + +++++i+++++ a ++++++ + ++++rkak+ l +
+ sp|Q820E0|MURG_CHLCV 8 IALAVGGSGGHIVPALATREAFCKEGVDVLlLGKGLDNHPNLCDLDVHYKEIPSGLPTVA--SPVTAIRRMSSLYNGYRKAKKELCIFD 94
+ 79***************************666666666666699999********66666..889************************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+gfg+y+++++l aal+ +ip++++Eqn ipg vnkl++r+a+gv
+ sp|Q820E0|MURG_CHLCV 95 PDVVIGFGSYHSLPVLMAALKKKIPIFLHEQNLIPGRVNKLFSRFAKGVG 144
+ ***********************************************986 PP
+
+>> sp|Q8XVI7|MURG_RALSO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.3 0.2 6.1e-28 3.5e-25 2 138 .. 14 150 .. 13 151 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 93.3 bits; conditional E-value: 6.1e-28
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+++Pa+++ar L +rG++V l+ g+e ++ +++g + +++ + +++ k+ +++++ +++ l+a+ ++ ++++ +
+ sp|Q8XVI7|MURG_RALSO 14 LVMAGGTGGHIFPALSVARLLAARGWQVVwLGNASGMEGQLvPKHGFPLESVRFG-GVRGKG-LVTKFLLPLNLLRAFWQSLGVVRRVR 100
+ 789****************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p+vv+g+ggy+ + + + l+g+p++++Eqn+i+gl+n++l+r a++vl
+ sp|Q8XVI7|MURG_RALSO 101 PNVVLGMGGYITFPGGMMSVLLGAPLVLHEQNSIAGLANRVLARVADRVL 150
+ ***********************************************997 PP
+
+>> sp|Q4ULT6|MURG_RICFE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.4 0.0 1.2e-27 6.6e-25 1 138 [. 4 135 .. 4 136 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 92.4 bits; conditional E-value: 1.2e-27
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l++gGT+G+++PavAl++eL +rG+eV+++t ++ + + + gl ++ ++++ +s + ++ l + a+ ka ++l + +
+ sp|Q4ULT6|MURG_RICFE 4 IILVAGGTGGHFFPAVALGEELIKRGYEVHFITDLRCQKYInQNMGLIFHILDLK-------RSDNIFLFLPNLSIAILKAIKLLYNIR 85
+ 689****************************************************.......45666666666667899********** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ v++gfggy ++++aa+++++p+++ Eqn+ g+vnk+++ +a++++
+ sp|Q4ULT6|MURG_RICFE 86 SSVIIGFGGYPVIAPMFAAIFLRVPIIIYEQNSYLGKVNKFFASFAKKIA 135
+ ***********************************************987 PP
+
+>> sp|Q49XM9|MURG_STAS1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.4 0.0 1.2e-27 6.6e-25 1 138 [. 4 143 .. 4 144 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 92.4 bits; conditional E-value: 1.2e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavp...igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + ++G++ +++++g+e++ e+ l+ + i ++ kl++++ s++++k+++++lk++ +a+ +lk
+ sp|Q49XM9|MURG_STAS1 4 IAFTGGGTVGHVSVNLSLIPTAIEEGYDTFyIGSKNGIEREMIESQLPSIKyhsISSG-KLRRYI-SWDNIKDIFKVLKGVLDARSVLK 90
+ 79****************************************6666654443339999.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk++ ++a++++
+ sp|Q49XM9|MURG_STAS1 91 KEKPDLLFSKGGFVSVPVVIAAKSLKIPTIIHESDLTPGLANKISLKFAKKIY 143
+ **************************************************997 PP
+
+>> sp|Q119X8|MURG_TRIEI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.5 0.0 1.2e-27 6.5e-25 2 138 .. 29 162 .. 28 163 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 92.5 bits; conditional E-value: 1.2e-27
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+++Pa+A+a++L+++ +e l++p++le+++ + ++ ++i ++ ++++kl ++tlk l + ++ k++ ilke k +
+ sp|Q119X8|MURG_TRIEI 29 LIAASGTGGHLFPAIAIANQLKDYHIEW-LGVPDRLETKLIPSQYPLHTISVE-GFQQKL-GIETLKVLSRLIGSILKVRHILKEGKFQ 114
+ 799**********************776.***********99***********.******.**************************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ +ggy+a++a+iaa+++g p++++E+n +pg+v+++++r +n v+
+ sp|Q119X8|MURG_TRIEI 115 GLFTTGGYIAAPAIIAARYLGLPVILHESNVLPGKVTRWFSRLCNVVA 162
+ *****************************************9998775 PP
+
+>> sp|Q03L97|MURG_STRTD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.5 0.0 2.3e-27 1.3e-24 1 138 [. 7 146 .. 7 147 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.5 bits; conditional E-value: 2.3e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l ++ + G+eV+ ++ + g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i++
+ sp|Q03L97|MURG_STRTD 7 IVFTGGGTVGHVTLNLILIPKFLKDGWEVHyIGDKHGIEHEQiDKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGILQSIAIIA 93
+ 79*************************************9988***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++ia++l+++p++v+E++ +gl+nk+ ++a++++
+ sp|Q03L97|MURG_STRTD 94 KIRPQALFSKGGFVSVPPVIASKLLRVPVYVHESDLSMGLANKIAYKFATTMF 146
+ ************************************************99875 PP
+
+>> sp|A0L5N1|MURG_MAGSM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.3 0.7 1.3e-27 7.4e-25 2 138 .. 9 147 .. 8 148 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 92.3 bits; conditional E-value: 1.3e-27
+ EEE-------HHHHHHHHHHHHH--..-EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrG..heVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++aggGT+G+++Pa+A+a++ ++r h V+ ++ ++gle+++ ++ag + ++++++ +l+ k+ +++l++l l a+ +a+ +++
+ sp|A0L5N1|MURG_MAGSM 9 LIAGGGTGGHLFPALAVAERWRERYglHSVHfIGGQRGLENRLvPNAGFTLETLAVG-QLKGKG-LPHKLRTLGGLLPAVWQARGMVQR 95
+ 79********************985579*****************************.******.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + p+vv+g+ggy++++a++aa+++gip ++Eqn+++gl+n+ll+ a +vl
+ sp|A0L5N1|MURG_MAGSM 96 FDPHVVLGVGGYASAPAMVAARSLGIPMALHEQNARAGLTNRLLSHLAQQVL 147
+ ********************************************99988887 PP
+
+>> sp|B8H091|MURG_CAUCN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.1 1.2 7.5e-28 4.2e-25 2 138 .. 6 141 .. 5 142 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 93.1 bits; conditional E-value: 7.5e-28
+ EEE-------HHHHHHHHHHHHH---EEEEEETGG....GHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppg....leefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ v+a+gGT+G+++Pa Ala++L +rG++V lat ++ ++f +e+ l+ + +++ + + l+++k + +l+++ +a++++k+
+ sp|B8H091|MURG_CAUCN 6 VVAAGGTGGHMFPAQALAEALAARGWRVVLATDDRgalyADKFPAEERLALSAATAK---SN--DPLGMIKAGFVVLQGVMEARAAFKR 89
+ 89*******************************983432344557777777777777...44..89*********************** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p+vvvgfggy a++al++al++g p++++Eqn++ g vn++l+ r+n v+
+ sp|B8H091|MURG_CAUCN 90 LDPAVVVGFGGYPALPALLGALSQGRPTVIHEQNAVLGRVNRFLAPRVNEVA 141
+ ************************************************9885 PP
+
+>> sp|Q9A5A1|MURG_CAUCR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 93.1 1.2 7.5e-28 4.2e-25 2 138 .. 6 141 .. 5 142 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 93.1 bits; conditional E-value: 7.5e-28
+ EEE-------HHHHHHHHHHHHH---EEEEEETGG....GHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppg....leefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ v+a+gGT+G+++Pa Ala++L +rG++V lat ++ ++f +e+ l+ + +++ + + l+++k + +l+++ +a++++k+
+ sp|Q9A5A1|MURG_CAUCR 6 VVAAGGTGGHMFPAQALAEALAARGWRVVLATDDRgalyADKFPAEERLALSAATAK---SN--DPLGMIKAGFVVLQGVMEARAAFKR 89
+ 89*******************************983432344557777777777777...44..89*********************** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p+vvvgfggy a++al++al++g p++++Eqn++ g vn++l+ r+n v+
+ sp|Q9A5A1|MURG_CAUCR 90 LDPAVVVGFGGYPALPALLGALSQGRPTVIHEQNAVLGRVNRFLAPRVNEVA 141
+ ************************************************9885 PP
+
+>> sp|A8GNC7|MURG_RICAH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.2 0.0 1.4e-27 7.8e-25 1 138 [. 4 135 .. 4 136 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 92.2 bits; conditional E-value: 1.4e-27
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++la+gGT+G+++PavAl++eL +rG+eV+++t ++ + + + gl ++ ++++ +s++ ++ l + a+ ka ++l + +
+ sp|A8GNC7|MURG_RICAH 4 IILAAGGTGGHFFPAVALGEELVKRGYEVHFITDLRCQKYInQNLGLIFHILDLK-------RSSNIFLFLPNLSIAILKAIKLLYNIR 85
+ 78*****************************************************.......788899999999999************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++gfg+y ++aa ++++p++++Eqn+ g+vnk+++ +a++++
+ sp|A8GNC7|MURG_RICAH 86 SSAIIGFGSYPVISSMFAAVFLRVPIIIHEQNSYLGKVNKFFASFAKRIA 135
+ ***********************************************987 PP
+
+>> sp|B5XMA2|MURG_STRPZ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.3 0.0 2.6e-27 1.5e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.3 bits; conditional E-value: 2.6e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +il+
+ sp|B5XMA2|MURG_STRPZ 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHTEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFILA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++++
+ sp|B5XMA2|MURG_STRPZ 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTMY 144
+ *************************************************9876 PP
+
+>> sp|B6JMZ5|MURG_HELP2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 92.2 0.0 1.4e-27 7.7e-25 1 138 [. 3 142 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 92.2 bits; conditional E-value: 1.4e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ a Ala eL ++G e + l+++ g ++++ e++ l + +++ ++ +k ++k++ +l+ + ka +kakeilk
+ sp|B6JMZ5|MURG_HELP2 3 FALTGGGTGGHLSIAKALAIELEKQGVEAIyLGSTYGQDKEWfENSPLFSERyfFNTQ-GVVNKS-FFKKINSLFLQVKAAFKAKEILK 89
+ 79*************************************************9445555.777777.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++++++++++gg++a++a++a+ll++ip++++Eqn+i g n++l+ +a+ v+
+ sp|B6JMZ5|MURG_HELP2 90 KHQITHTISVGGFSAGPASFASLLNHIPLYIHEQNAIKGSLNRYLSPKAKAVF 142
+ *************************************************9987 PP
+
+>> sp|A7ERM5|ATG26_SCLS1 Sterol 3-beta-glucosyltransferase OS=Sclerotinia sclerotiorum (strain ATCC 18683 / 1980 / Ss-1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.8 0.0 1.8e-27 1e-24 4 138 .. 945 1076 .. 942 1077 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 91.8 bits; conditional E-value: 1.8e-27
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ +++G+rGdv+P++Al ++L+++Gh+ ++at+ +++e++e++g+e+ p+++d v++ +++++lke+ ++ +
+ sp|A7ERM5|ATG26_SCLS1 945 LTIGSRGDVQPYIALCKGLMAEGHQTKIATHLEFKEWIESHGIEFAPVDGDpaelmricVENGM--FTVSFLKEASSK-------F 1021
+ 79**************************************************999995555555..899999999999.......9 PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + ++ +++++ ++ ++li++++a++ +++aE++ ip+++++++p+++++++
+ sp|A7ERM5|ATG26_SCLS1 1022 RGWIDDLLSSSWRAC--QNSDILIESPSAMAGIHIAEALRIPYFRAFTMPWTRTRAY 1076
+ 999999988888888..788999******************************9987 PP
+
+>> sp|Q7V466|MURG_PROMM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.6 0.2 2.1e-27 1.2e-24 2 137 .. 5 137 .. 4 139 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 91.6 bits; conditional E-value: 2.1e-27
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++a+ GT+G+++Pa+A+a++L + V+ l++p++le+++ e ++l++v g+ + + l++l++l++ l a+ +++++l+++
+ sp|Q7V466|MURG_PROMM 5 LIAASGTGGHLFPALAVAEALPGS-WSVCwLGVPDRLETQLvpERYELTTVRAGGL---QG--RGLRKLVQLLQLLAATGRVRKLLRKQ 87
+ 799*******************97.6**************9777777777666655...56..568999999999999*********** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++v+ +ggy+a++a++aa+++gip++++E+n+ipg v++ll r++ v
+ sp|Q7V466|MURG_PROMM 88 GIQTVFTTGGYIAAPAILAARWCGIPVVLHESNAIPGRVTRLLGRFCQVV 137
+ ******************************************99998765 PP
+
+>> sp|A2CDG1|MURG_PROM3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.2 2e-27 1.2e-24 2 137 .. 5 137 .. 4 139 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 2e-27
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++a+ GT+G+++Pa+A+a+ L + + V+ l++p++le+++ e ++l++v g+ + + l++l++l++ l a+ +++++l+++
+ sp|A2CDG1|MURG_PROM3 5 LIAASGTGGHLFPALAVAESLPAS-WSVCwLGVPDRLETQLvpERYELTTVRAGGL---QG--RGLRKLVQLLQLLAATGRVRKLLRKQ 87
+ 799******************987.6**************9777777777666655...56..568999999999999*********** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++v+ +ggy+a++a++aa+++gip++++E+n+ipg v++ll r++ v
+ sp|A2CDG1|MURG_PROM3 88 GIQTVFTTGGYIAAPAILAARWCGIPVVLHESNAIPGRVTRLLGRFCQVV 137
+ ******************************************99998765 PP
+
+>> sp|Q5M0D4|MURG_STRT1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.8 0.0 3.6e-27 2.1e-24 1 138 [. 7 146 .. 7 147 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.8 bits; conditional E-value: 3.6e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l ++ + G+eV+ ++ + g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i++
+ sp|Q5M0D4|MURG_STRT1 7 IVFTGGGTVGHVTLNLILIPKFLKDGWEVHyIGDKHGVEHEQiDKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGILQSIAIIA 93
+ 79*************************************9988***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++ia++l+++p++v+E++ +gl+nk+ ++a++++
+ sp|Q5M0D4|MURG_STRT1 94 KIRPQALFSKGGFVSVPPVIASKLLRVPVYVHESDLSMGLANKIAYKFATTMF 146
+ ************************************************99875 PP
+
+>> sp|Q5M4Y1|MURG_STRT2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.8 0.0 3.6e-27 2.1e-24 1 138 [. 7 146 .. 7 147 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.8 bits; conditional E-value: 3.6e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l ++ + G+eV+ ++ + g+e++ ++gl ++++i+++ kl++++ s++++++++++++++ ++ +i++
+ sp|Q5M4Y1|MURG_STRT2 7 IVFTGGGTVGHVTLNLILIPKFLKDGWEVHyIGDKHGVEHEQiDKSGLdvTFHSIATG-KLRRYF-SWQNMLDVFKVGWGILQSIAIIA 93
+ 79*************************************9988***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++ia++l+++p++v+E++ +gl+nk+ ++a++++
+ sp|Q5M4Y1|MURG_STRT2 94 KIRPQALFSKGGFVSVPPVIASKLLRVPVYVHESDLSMGLANKIAYKFATTMF 146
+ ************************************************99875 PP
+
+>> sp|A6QGX0|MURG_STAAE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|A6QGX0|MURG_STAAE 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|A6QGX0|MURG_STAAE 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|Q2FYL5|MURG_STAA8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|Q2FYL5|MURG_STAA8 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|Q2FYL5|MURG_STAA8 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|Q5HG02|MURG_STAAC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|Q5HG02|MURG_STAAC 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|Q5HG02|MURG_STAAC 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|Q6G9E3|MURG_STAAS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|Q6G9E3|MURG_STAAS 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|Q6G9E3|MURG_STAAS 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|Q8NWR4|MURG_STAAW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|Q8NWR4|MURG_STAAW 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|Q8NWR4|MURG_STAAW 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|A5ISU9|MURG_STAA9 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|A5ISU9|MURG_STAA9 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|A5ISU9|MURG_STAA9 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|A6U1N8|MURG_STAA2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|A6U1N8|MURG_STAA2 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|A6U1N8|MURG_STAA2 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|A7X2A2|MURG_STAA1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|A7X2A2|MURG_STAA1 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|A7X2A2|MURG_STAA1 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|P65481|MURG_STAAM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|P65481|MURG_STAAM 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|P65481|MURG_STAAM 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|P65482|MURG_STAAN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|P65482|MURG_STAAN 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|P65482|MURG_STAAN 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|Q2YY01|MURG_STAAB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 91.7 0.0 1.9e-27 1.1e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 91.7 bits; conditional E-value: 1.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|Q2YY01|MURG_STAAB 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip++++E++ pgl+nk+ ++a++++
+ sp|Q2YY01|MURG_STAAB 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTIIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|Q7MAW5|MURG_PORGI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.8 0.0 3.7e-27 2.1e-24 1 137 [. 12 150 .. 12 152 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.8 bits; conditional E-value: 3.7e-27
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGH.HHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgle.efveeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+++a++L+rr +e + ++++ ++e e+v+ +g+e+v ++++ +l +k l+++k + ++ +++r a+++++
+ sp|Q7MAW5|MURG_PORGI 12 FIISGGGTGGHIFPAISIADALRRRYPECEilfVGAEGRMEmERVPRSGYEIVGLPIK-GLDRKH-LLSNYKVAIAVIRSMRLANKTIR 98
+ 7899***************************9********83566*************.****98.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++pd v+g+ggy++++ l a ++gip+ + Eqn+ +g++nkll+r a ++
+ sp|Q7MAW5|MURG_PORGI 99 NFRPDMVIGVGGYASGPTLRRAHSLGIPTLIQEQNSYAGVTNKLLSRGAHKI 150
+ **********************************************988776 PP
+
+>> sp|A2RDL0|MURG_STRPG UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.8 0.0 3.8e-27 2.1e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.8 bits; conditional E-value: 3.8e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +i++
+ sp|A2RDL0|MURG_STRPG 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHTEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFIVA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++v+
+ sp|A2RDL0|MURG_STRPG 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTVY 144
+ **************************************************998 PP
+
+>> sp|Q5XB05|MURG_STRP6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.8 0.0 3.8e-27 2.1e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.8 bits; conditional E-value: 3.8e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +i++
+ sp|Q5XB05|MURG_STRP6 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHTEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFIVA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++v+
+ sp|Q5XB05|MURG_STRP6 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTVY 144
+ **************************************************998 PP
+
+>> sp|Q1JAT5|MURG_STRPB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.6 0.0 4.4e-27 2.5e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.6 bits; conditional E-value: 4.4e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +i++
+ sp|Q1JAT5|MURG_STRPB 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHTEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFIIA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++++
+ sp|Q1JAT5|MURG_STRPB 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTMY 144
+ *************************************************9876 PP
+
+>> sp|Q1JKY5|MURG_STRPC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.6 0.0 4.4e-27 2.5e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.6 bits; conditional E-value: 4.4e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +i++
+ sp|Q1JKY5|MURG_STRPC 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHTEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFIIA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++++
+ sp|Q1JKY5|MURG_STRPC 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTMY 144
+ *************************************************9876 PP
+
+>> sp|B2RIF1|MURG_PORG3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.8 0.0 3.7e-27 2.1e-24 1 137 [. 12 150 .. 12 152 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.8 bits; conditional E-value: 3.7e-27
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGH.HHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgle.efveeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+++a++L+rr +e + ++++ ++e e+v+ +g+e+v ++++ +l +k l+++k + ++ +++r a+++++
+ sp|B2RIF1|MURG_PORG3 12 FIISGGGTGGHIFPAISIADALRRRYPECEilfVGAEGRMEmERVPRSGYEIVGLPIK-GLDRKH-LLSNYKVAIAVIRSMRLANKTIR 98
+ 7899***************************9********83566*************.****98.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++pd v+g+ggy++++ l a ++gip+ + Eqn+ +g++nkll+r a ++
+ sp|B2RIF1|MURG_PORG3 99 NFRPDMVIGVGGYASGPTLRRAHSLGIPTLIQEQNSYAGVTNKLLSRGAHKI 150
+ **********************************************988776 PP
+
+>> sp|C0M6J2|MURG_STRE4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.6 0.0 4.2e-27 2.4e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.6 bits; conditional E-value: 4.2e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+v + l ++ + G+eV+ ++ +g+e++ +++gl ++++i+++ kl++++ s+++l+++++++ ++ ++ +i++
+ sp|C0M6J2|MURG_STRE4 5 IIFTGGGTAGHVTLNLILIPKFIKDGWEVHyIGDDKGIEHQEiKKSGLdvTFHAIATG-KLRRYF-SWQNLLDIFKVGFGVMQSLFIIA 91
+ 689**************************************99****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+l+g+pa+++E++ +gl+n++ r+a++++
+ sp|C0M6J2|MURG_STRE4 92 RLRPKALFSKGGFVSVPPVIAARLLGVPAFIHESDLSMGLANRIAYRFATTMY 144
+ *************************************************9876 PP
+
+>> sp|A1UTC5|MURG_BARBK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.4 0.7 4.9e-27 2.8e-24 1 138 [. 7 143 .. 7 144 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 90.4 bits; conditional E-value: 4.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ vvl++gGT+G+++Pa Ala+eL++rG++V+lat ++ ++fv ++ +++ i + +l ++ + ++ +k+++ l+++ ++ ++++ +
+ sp|A1UTC5|MURG_BARBK 7 VVLVAGGTGGHLFPAEALAVELRQRGYDVHLATDERAKRFVrHFDEKHIHIISSA-TLVRH-HPFALIKTFWLLLRGMVQSWILFRKLR 93
+ 79***************************************87777777778888.66665.5************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p +v gfggy ++++ a+l g +++++Eqn+++g +n++l+ r+n ++
+ sp|A1UTC5|MURG_BARBK 94 PVLVGGFGGYPTVPPVWVAALTGRVTFIHEQNAVMGRANRVLATRVNAIA 143
+ **********************************************9876 PP
+
+>> sp|C0MD54|MURG_STRS7 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.3 0.0 5.3e-27 3e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.3 bits; conditional E-value: 5.3e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+v + l ++ + G+eV+ ++ +g+e++ +++gl++ i+++ kl++++ s+++l+++++++ ++ ++ +i++
+ sp|C0MD54|MURG_STRS7 5 IIFTGGGTAGHVTLNLILIPKFIKDGWEVHyIGDDNGIEHQEiKKSGLDVAFhtIATG-KLRRYF-SWQNLLDIFKVGFGVMQSLFIIA 91
+ 689**************************************99****9755545****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+l+g+pa+++E++ +gl+n++ r+a++++
+ sp|C0MD54|MURG_STRS7 92 RLRPKALFSKGGFVSVPPVIAARLLGVPAFIHESDLSMGLANRIAYRFATTMY 144
+ *************************************************9876 PP
+
+>> sp|B4U1U4|MURG_STREM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.2 0.0 5.8e-27 3.2e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.2 bits; conditional E-value: 5.8e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+v + l ++ + G+eV+ ++ +g+e++ +++gl ++++i+++ kl++++ s+++l+++++++ ++ ++ +i++
+ sp|B4U1U4|MURG_STREM 5 IIFTGGGTAGHVTLNLILIPKFIKDGWEVHyIGDDNGIEHQEiKKSGLdvTFHAIATG-KLRRYF-SWQNLLDAFKVGFGVMQSLFIIA 91
+ 689**************************************99****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+l+g+pa+++E++ +gl+n++ r+a++++
+ sp|B4U1U4|MURG_STREM 92 RLRPKALFSKGGFVSVPPVIAARLLGVPAFIHESDLSMGLANRIAYRFATTMY 144
+ *************************************************9876 PP
+
+>> sp|A5CWW1|MURG_VESOH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.5 0.0 4.7e-27 2.7e-24 1 137 [. 8 144 .. 8 146 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 90.5 bits; conditional E-value: 4.7e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+++Pa+A+a+eL++ ++ l++ g+e+ + ++++++ +++ + +l+ k ++ +k ++ a+ ++ +i+ ++
+ sp|A5CWW1|MURG_VESOH 8 ILIMAGGTGGHIFPALAIANELKKHSSNIQwLGSNLGMENNIiPKHNIKLHTVSSV-GLRGKN-VISLIKAPFLLSYATLQVIKIFLKF 94
+ 689*****************************************************.****99.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kpdvv+g+gg+ ++ ++ a+ + ++++Eqn+ipg +nk+l++ a++
+ sp|A5CWW1|MURG_VESOH 95 KPDVVLGMGGFTSGIGGLVAWVFKTTLVIHEQNSIPGTTNKILNKIATKT 144
+ *********************************************99986 PP
+
+>> sp|A1A2E9|MURG_BIFAA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.9 1.1 7.3e-27 4.1e-24 1 135 [. 7 143 .. 7 146 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 89.9 bits; conditional E-value: 7.3e-27
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHH.HHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglka.lrkakeil 84
+ +vlaggGT+G+v P++A+a+ ++ ++e ++t gle+ + ++ag e ++i+ ++++ + +k+ +++ +++ka k++ il
+ sp|A1A2E9|MURG_BIFAA 7 IVLAGGGTAGHVNPLLAVAHVIRELEPEADiavVGTAVGLERDLvPQAGFELETIEKV-PFPR--RPNKAALQFPAKWKAeKAKVRDIL 92
+ 79**************************99999*********999*************.****..77888888888887615689**** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +++++vvvgfggy +++++ aa + gip+ ++Eqn+++g++nkl +r+a
+ sp|A1A2E9|MURG_BIFAA 93 TRHQAQVVVGFGGYTSAPVYAAAHSMGIPIAIHEQNARAGMANKLGARWAS 143
+ **********************************************99986 PP
+
+>> sp|P65483|MURG_STRP1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.6 0.0 9e-27 5.1e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 89.6 bits; conditional E-value: 9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +i++
+ sp|P65483|MURG_STRP1 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHTEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFIVA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++++
+ sp|P65483|MURG_STRP1 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTMY 144
+ *************************************************9876 PP
+
+>> sp|P65484|MURG_STRP8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.6 0.0 9e-27 5.1e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 89.6 bits; conditional E-value: 9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +i++
+ sp|P65484|MURG_STRP8 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHTEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFIVA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++++
+ sp|P65484|MURG_STRP8 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTMY 144
+ *************************************************9876 PP
+
+>> sp|Q48SK9|MURG_STRPM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.6 0.0 9e-27 5.1e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 89.6 bits; conditional E-value: 9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +i++
+ sp|Q48SK9|MURG_STRPM 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHTEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFIVA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++++
+ sp|Q48SK9|MURG_STRPM 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTMY 144
+ *************************************************9876 PP
+
+>> sp|Q1J5S6|MURG_STRPF UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.6 0.0 9e-27 5.1e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 89.6 bits; conditional E-value: 9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +i++
+ sp|Q1J5S6|MURG_STRPF 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHTEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFIVA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++++
+ sp|Q1J5S6|MURG_STRPF 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTMY 144
+ *************************************************9876 PP
+
+>> sp|A8Z3Z7|MURG_STAAT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.3 0.0 5.4e-27 3e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.3 bits; conditional E-value: 5.4e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|A8Z3Z7|MURG_STAAT 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip+ ++E++ pgl+nk+ ++a++++
+ sp|A8Z3Z7|MURG_STAAT 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTLIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|Q2FH20|MURG_STAA3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.3 0.0 5.4e-27 3e-24 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.3 bits; conditional E-value: 5.4e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH-..--EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eea..gleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v ++l + +G+e +++++g+e++ e++ +++++pi ++ kl++++ sl++ k+++++lk++ +a+++lk
+ sp|Q2FH20|MURG_STAA3 4 IAFTGGGTVGHVSVNLSLIPTALSQGYEALyIGSKNGIEREMiESQlpEIKYYPISSG-KLRRYI-SLENAKDVFKVLKGILDARKVLK 90
+ 79****************************************776644678999****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++kpd++++ gg+v+++++iaa++++ip+ ++E++ pgl+nk+ ++a++++
+ sp|Q2FH20|MURG_STAA3 91 KEKPDLLFSKGGFVSVPVVIAAKSLNIPTLIHESDLTPGLANKIALKFAKKIY 143
+ *************************************************9997 PP
+
+>> sp|Q1JG11|MURG_STRPD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.6 0.0 9e-27 5.1e-24 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 89.6 bits; conditional E-value: 9e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e++ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +i++
+ sp|Q1JG11|MURG_STRPD 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHTEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFIVA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++++
+ sp|Q1JG11|MURG_STRPD 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTMY 144
+ *************************************************9876 PP
+
+>> sp|Q17WB5|MURG_HELAH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.9 0.0 7.1e-27 4e-24 1 138 [. 3 142 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 89.9 bits; conditional E-value: 7.1e-27
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+l+ggGT+G++ a Ala eL ++G e + l+++ g ++++ e + l + +++ ++ +k ++k++ +l+ + ka kakeilk
+ sp|Q17WB5|MURG_HELAH 3 VALTGGGTGGHLSIAKALAIELEKQGVEAIyLGSTYGQDKEWfEDSPLFSECyfFNTQ-GVVNKS-FFKKIGSLFLQAKAALKAKEILK 89
+ 79**********************************************9887336666.777777.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++++++++++gg++a++a++a+ll++ip++++Eqn+i g n++l+ +a+ v+
+ sp|Q17WB5|MURG_HELAH 90 KHQITHTISVGGFSAGPASFASLLNKIPLYIHEQNAIKGSLNRYLSPKAKAVF 142
+ *************************************************9987 PP
+
+>> sp|C6BYG6|MURG_DESAD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.1 0.1 6e-27 3.4e-24 1 138 [. 4 141 .. 4 142 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 90.1 bits; conditional E-value: 6e-27
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +vl++gGT+G+v+Pa+A+a+e ++r ++ + ++ + +e+ve ag++++ ++++ ++ + k +++l+ + a+ a + +++
+ sp|C6BYG6|MURG_DESAD 4 IVLTTGGTGGHVFPALAVAHEIKNRFPQCEilfIGGKGPEREMVERAGISFKGLPAK-GVLGGG-IKKVFSSLWIV-SAMIMALKEIAS 89
+ 79***************************999888888888888*************.999988.99999999999.************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +kpd+v+gfggy+ +++aa+l+g+p+ ++Eqn++pg++n++l + +++v+
+ sp|C6BYG6|MURG_DESAD 90 FKPDAVIGFGGYAGFCPVLAAWLLGVPTAIHEQNSVPGVTNRILGKVVKRVF 141
+ *********************************************9999986 PP
+
+>> sp|Q6G2Q5|MURG_BARHE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.4 0.2 1e-26 5.7e-24 1 136 [. 7 141 .. 7 143 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 89.4 bits; conditional E-value: 1e-26
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vla+gGT+G+++Pa A+a+eL++rG++V+l+t ++ +fv ++ +++ i + ++ ++ ++ +k+++ lk++ ++ +++ + +
+ sp|Q6G2Q5|MURG_BARHE 7 IVLAAGGTGGHLFPAEAVAVELRQRGYDVHLVTDERAQRFVrCFDEEHIHIISSA-TFTRRH-PFSLIKTFWMLLKGMGQSLALFYKLC 93
+ 79***************************************75555566667777.776655.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ p +v gfggy ++li a++ + +++++Eqn+++g +n++l+ ++
+ sp|Q6G2Q5|MURG_BARHE 94 PVLVGGFGGYPTFPPLIVAAFMRRVTFIHEQNAVMGRANRVLAVFVSA 141
+ *****************************************9988765 PP
+
+>> sp|A9IWA5|MURG_BART1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.4 0.1 9.9e-27 5.6e-24 1 135 [. 7 140 .. 7 143 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 89.4 bits; conditional E-value: 9.9e-27
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ +vla+gGT+G+++Pa Ala+eL++rG++V+l+t ++ ++fv+ e+ i + ++ + + ++ +k++++ lk++ ++ +++ + +p
+ sp|A9IWA5|MURG_BART1 7 IVLAAGGTGGHLFPAEALAVELRQRGYDVHLITDERARSFVRRFDEEHTHIVSSATFTR-CHPFALIKTILSLLKGMGQSLRLFYKLRP 94
+ 79***************************************666666666555548888.67*************************** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +v gfggy + ++l+ a l + +++++Eqn+++g +n++l+ ++
+ sp|A9IWA5|MURG_BART1 95 VLVGGFGGYPSFPPLFIAVLMRRVTFIHEQNAVMGRANRVLAIFVR 140
+ ***************************************9987665 PP
+
+>> sp|Q8CUL4|MURG_OCEIH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.4 0.0 1e-26 5.7e-24 1 137 [. 7 144 .. 7 146 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 89.4 bits; conditional E-value: 1e-26
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++++ggGT+G+v +Al q+rG+e+ +++ +g+e+ + + +g++++++ ++ kl++++ s ++lk+++++lk++ +a +i+ +
+ sp|Q8CUL4|MURG_OCEIH 7 ILFTGGGTAGHVIVNLALIPYYQERGWEIDyIGSYNGIERDLisPLDGVTYHSVSTG-KLRRYM-SKENLKDPFKVLKGTMQAYRIIGK 93
+ 79*************************************999999************.****99.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kp +v++ gg+v+++++ aa+l+g+p +++E++ pgl+nkl+ + ++v
+ sp|Q8CUL4|MURG_OCEIH 94 RKPSIVFSKGGFVSVPVVAAAKLRGVPSIIHESDYTPGLANKLSIPFTKRV 144
+ ******************************************987777766 PP
+
+>> sp|A6LEU3|MURG_PARD8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.4 0.0 1e-26 5.6e-24 1 137 [. 6 144 .. 6 146 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 89.4 bits; conditional E-value: 1e-26
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGH.HHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgle.efveeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pa+++a+++++r ++ + +++++++e ++v++ag+++v +++ ++ + + ++++k + k+lr a+++++
+ sp|A6LEU3|MURG_PARD8 6 IIISGGGTGGHIFPAISIANTFKKRFPDAEilfVGAEDRMEmDKVPAAGYKIVGLPVS-GFDRA-HLMNNVKVMVRLAKSLRLARKTIR 92
+ 6899**************************99********83566*************.99995.599********************* PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ e+kpd+ vg+ggy++++ l a+++g+pa + Eqn+ +g++nkll+++a ++
+ sp|A6LEU3|MURG_PARD8 93 EFKPDIAVGVGGYASGPTLWMAASQGVPALIQEQNSYAGVTNKLLAKKASKI 144
+ ************************************************9987 PP
+
+>> sp|Q6AE64|MURG_LEIXX UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 90.2 1.0 5.6e-27 3.1e-24 2 133 .. 5 138 .. 4 143 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 90.2 bits; conditional E-value: 5.6e-27
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +laggGT+G+v P++A+a++L+r ++ + l+t +gle+++ +++g+e +i+ +++++ ++++ + e ++++r++ e+++
+ sp|Q6AE64|MURG_LEIXX 5 LLAGGGTAGHVNPLLAVADRLRRDDPAAEvlvLGTAEGLEARLvPARGYELATIPRL-PFPRRP-NAAAVRFPGEYRRSVRAVGELIRA 91
+ 89************************99999**************************.****99.99999999**************** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprr 133
+ +++vvgfggy+a++a+ aa++a +p++++E+n++pgl+ +l +r+
+ sp|Q6AE64|MURG_LEIXX 92 RGIAAVVGFGGYAAAPAYSAARKAAVPLILHEANARPGLASRLGARY 138
+ ****************************************9998876 PP
+
+>> sp|A1K3U6|MURG_AZOSB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.1 0.1 1.2e-26 6.9e-24 2 138 .. 5 141 .. 4 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 89.1 bits; conditional E-value: 1.2e-26
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++gGT+G+++P +A+a++L+++G+++ ++ p+g+e+++ +++g+++ + + l+ k+ +++l+ + + l ++ +a l++ k
+ sp|A1K3U6|MURG_AZOSB 5 LVMAGGTGGHIFPGIAVAEALRAKGWRIVwMGNPDGMEARIvPSRGYDTAWVRFG-ALRGKG-LVRKLLLPVNLLVGFWQALGQLRRIK 91
+ 789****************************************************.******.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pdvv+g+ggy+ + + a+l+g p++++Eqn+++gl+n++l+ a++vl
+ sp|A1K3U6|MURG_AZOSB 92 PDVVLGMGGYITFPGGMMAALLGWPLVLHEQNSVAGLANRVLAGVADRVL 141
+ *********************************************99997 PP
+
+>> sp|Q9PLG2|MURG_CHLMU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 89.3 0.0 1.1e-26 6.2e-24 1 137 [. 8 142 .. 8 144 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 89.3 bits; conditional E-value: 1.1e-26
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ vvla+gGT+G++ Pa+A +++ ++ eV l +gl++f+ e + ++ i+++ + +l+ +++++ + + ++++ +a + +k++
+ sp|Q9PLG2|MURG_CHLMU 8 VVLAVGGTGGHIIPALAARETFIKEKVEV-LLLGKGLTRFLeGEPDVLYYDIPSG--SPFSLRPNQMFSGARQLYQGYTAALRMIKSFA 93
+ 79***************************.99*********88889*********..55555888888888888889************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pdv vgfg+y++++a++a+++ +ip++++Eqn +pg+vnkl++ +a+gv
+ sp|Q9PLG2|MURG_CHLMU 94 PDVAVGFGSYHSLPAILASIRKRIPLFLHEQNVVPGKVNKLFSHFAKGV 142
+ ***********************************************98 PP
+
+>> sp|Q1GRX9|MURG_SPHAL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 88.8 0.4 1.6e-26 8.9e-24 1 138 [. 7 142 .. 7 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 88.8 bits; conditional E-value: 1.6e-26
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++la+gGT+G++ Pa Ala+eL +rGh+V l++ ++ + + a+le++ ++++ ++ l+ lk +++ +k++r a e++ ++
+ sp|Q1GRX9|MURG_SPHAL 7 FLLAAGGTGGHMLPAYALADELIARGHRVALVSDDRGLKIPgAPAELETHVLPAG-RASG--GPLGWLKGALAIRKGRRMAIELIDDFD 92
+ 79****************************999999999999*************.4444..69************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p+vvvgfggy +++ l+aa + + p++++Eqn++ g vn+l++ r++ v+
+ sp|Q1GRX9|MURG_SPHAL 93 PAVVVGFGGYPSLPSLLAAGATKRPRVIHEQNAVLGRVNRLMAPRVDAVA 142
+ ***********************************************997 PP
+
+>> sp|Q751Z4|ATG26_ASHGO Sterol 3-beta-glucosyltransferase OS=Ashbya gossypii GN=ATG26 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 88.7 0.0 1.6e-26 9.1e-24 3 138 .. 781 913 .. 779 914 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 88.7 bits; conditional E-value: 1.6e-26
+ EE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHHH CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkake 82
+ ++++G+rGdv+P++Al+++L ++Gh+V ++++ ++ ++v+++gl++++i++d v++ + + ++ ++e+a+ ++
+ sp|Q751Z4|ATG26_ASHGO 781 MLTIGSRGDVQPYIALGKGLLQEGHRVVVISHAEFGDWVRSHGLQFRAIAGDpaelmalmVQHGS--MNVGLIREAAST-------FR 859
+ 789*************************************************9777666666666..566666666666.......99 PP
+
+ HHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 83 ilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + ++ ++ ++++ + ++li++++a++ +++aE+++ip+++++++p++ ++ +
+ sp|Q751Z4|ATG26_ASHGO 860 NWIRDLLETAWEAC--QGIDVLIESPSAMAGIHIAEALQIPYFRAFTMPWTKTRSY 913
+ 99999999998888..788999*****************************98876 PP
+
+>> sp|A4VTK4|MURG_STRSY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 88.2 0.0 2.4e-26 1.3e-23 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 88.2 bits; conditional E-value: 2.4e-26
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l ++ ++G+eV+ ++ +g+e++ ++gl+++ i+++ kl++++ s+++++++++++ ++ ++ +i++
+ sp|A4VTK4|MURG_STRSY 4 IVFTGGGTVGHVTLNLLLIPRFLEEGWEVHyIGDGNGIEHEQvVKSGLDVHFhsIATG-KLRRYF-SFQNMLDVFKVGFGVLQSLTIIA 90
+ 79*************************************987799998766655****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+l+++p++++E++ +gl+nk+ ++a++++
+ sp|A4VTK4|MURG_STRSY 91 KIRPQALFSKGGFVSVPPVIAANLLRVPVFIHESDLTMGLANKIAYKFATTMY 143
+ *************************************************9886 PP
+
+>> sp|A4VZT9|MURG_STRS2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 88.2 0.0 2.4e-26 1.3e-23 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 88.2 bits; conditional E-value: 2.4e-26
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l ++ ++G+eV+ ++ +g+e++ ++gl+++ i+++ kl++++ s+++++++++++ ++ ++ +i++
+ sp|A4VZT9|MURG_STRS2 4 IVFTGGGTVGHVTLNLLLIPRFLEEGWEVHyIGDGNGIEHEQvVKSGLDVHFhsIATG-KLRRYF-SFQNMLDVFKVGFGVLQSLTIIA 90
+ 79*************************************987799998766655****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+l+++p++++E++ +gl+nk+ ++a++++
+ sp|A4VZT9|MURG_STRS2 91 KIRPQALFSKGGFVSVPPVIAANLLRVPVFIHESDLTMGLANKIAYKFATTMY 143
+ *************************************************9886 PP
+
+>> sp|B3QWT7|MURG_CHLT3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 88.7 0.0 1.6e-26 9.2e-24 2 138 .. 4 146 .. 3 147 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 88.7 bits; conditional E-value: 1.6e-26
+ EEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------....-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakl...eslktlkelaeglkalrkakei 83
+ ++aggGT+G+v+Pa+A+a+e r + + ++t++g+e++ +++g +++ i++ ++++ + e +++lk + + ++l + i
+ sp|B3QWT7|MURG_CHLT3 4 IFAGGGTGGHVFPAIAIAQEILRTQQNAEiqfVGTERGIEATAvPKQGFPMHLIPVA-GVKRGFspkELFENLKVPMRLQRSLSACHDI 91
+ 79******************99988888778***********99*************.6666552223677889999999********* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ l+++kp+vv+g+gg+v+++++ +a + +ip+ + Eqn+ pg++++ll+ ra v+
+ sp|B3QWT7|MURG_CHLT3 92 LQREKPNVVIGTGGFVSGPIVWEAQSKKIPTLIQEQNSMPGVTTRLLSLRASEVH 146
+ *************************************************999887 PP
+
+>> sp|Q6AJ53|MURG_DESPS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 88.9 0.0 1.4e-26 8e-24 1 137 [. 9 147 .. 9 149 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 88.9 bits; conditional E-value: 1.4e-26
+ EEEE-------HHHHHHHHHHHHH-..--EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrr..GheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G+++Pa+A a+++ r+ G eV ++t++++++++ e +g + v+i++ +l+ k + + +k l+ + +a +il+
+ sp|Q6AJ53|MURG_DESPS 9 ILLTGGGTGGHLFPAIAAAQQFCREypGAEVLfVGTKRKMDAETlERYGFKGVAINSY-GLKGKN-MRELVKALLVLPISCLQALFILA 95
+ 79********************9986677888**************************.999999.99999999999999********* PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++pd+v+g+ggyv ++++ a+l++ p+ ++Eqn++pgl+n+ l++ +++v
+ sp|Q6AJ53|MURG_DESPS 96 RFRPDLVLGVGGYVTGPVVAMAKLCRRPTLIHEQNSVPGLANRKLAKLVDRV 147
+ *******************************************999999887 PP
+
+>> sp|B9K6P7|MURG_THENN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 88.7 0.2 1.7e-26 9.4e-24 1 139 [] 4 146 .. 4 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 88.7 bits; conditional E-value: 1.7e-26
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpd.vklwakleslktlkelaeglkalrkakeil 84
+ v+ aggGT+G+++P++A+ ++L + e + +a++ +++e+v ++++ e++ +++d +l + l ++k+++++a++ +a+ kak+ l
+ sp|B9K6P7|MURG_THENN 4 VAAAGGGTGGHLYPLLAILETLSKDV-ETKvlfFAVKGKIDEKVvKQEHPEYEVVTLDvRGLFRPLYHPKNFWRAAKVVNAILKAKKEL 91
+ 5789******************9976.66667*************8888888777777558889999********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ ++kpdv+v +ggy+++++++aa+ g+p++++Eqn +pgl+ k+++++a +++v
+ sp|B9K6P7|MURG_THENN 92 LRFKPDVIVLTGGYISGVVGLAAKNMGVPIFLHEQNVVPGLAVKTVAKYARKIFV 146
+ **************************************************99975 PP
+
+>> sp|Q8K6R7|MURG_STRP3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 87.7 0.0 3.3e-26 1.9e-23 1 138 [. 5 144 .. 5 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 87.7 bits; conditional E-value: 3.3e-26
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e+ e++gl ++++i+++ kl++++ s+++l +++++ +l ++ +i++
+ sp|Q8K6R7|MURG_STRP3 5 ILFTGGGTVGHVTLNLILIPKFIKDGWEVHyIGDKNGIEHIEiEKSGLdvTFHAIATG-KLRRYF-SWQNLADVFKVALGLLQSLFIVA 91
+ 79**************************************999****8335677****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v++++++aa+l+g p++++E++ +gl+nk+ ++a++++
+ sp|Q8K6R7|MURG_STRP3 92 KLRPQALFSKGGFVSVPPVVAAKLLGKPVFIHESDRSMGLANKIAYKFATTMY 144
+ *************************************************9876 PP
+
+>> sp|Q54IL5|UGT52_DICDI UDP-sugar-dependent glycosyltransferase 52 OS=Dictyostelium discoideum GN=ugt52 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 88.3 0.0 2.2e-26 1.3e-23 1 138 [. 1166 1303 .. 1166 1304 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 88.3 bits; conditional E-value: 2.2e-26
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----......S------.-HHHCCSHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpd......vklwakleslktlkelaeglkalrk 79
+ ++++++G+rGd++P++Al +L+++Gh+V+lat++ +++ + +e gl+++p+g+d +++++ ++++k++ke++++
+ sp|Q54IL5|UGT52_DICDI 1166 ITILTIGSRGDIQPFIALSLGLKEYGHNVTLATHELYRDLIsKEFGLNYQPLGGDprelmdLCVRNGIFTPKFIKEALSR------ 1245
+ 6799*********************************************************9999999************...... PP
+
+ HHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 80 akeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++++ ++ +++++++ +++++lia++ + + +++ E ++ip++ ++++p ++++ +
+ sp|Q54IL5|UGT52_DICDI 1246 -FRSFIDDLLLTCWKAVQNSNTQVLIATPGCFAGPHIGEVLQIPFFNAFTMPFTRTRTY 1303
+ .*****************************************************99976 PP
+
+>> sp|B3DQN1|MURG_BIFLD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 87.7 0.4 3.3e-26 1.9e-23 1 135 [. 8 144 .. 8 148 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 87.7 bits; conditional E-value: 3.3e-26
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +vlaggGT+G+v P++A+a + ++ ++ ++t gle+ + +eag+e +i+ +++++ l +l+ +a+ +++ k++ il+
+ sp|B3DQN1|MURG_BIFLD 8 IVLAGGGTAGHVNPLLAVAGAIRDIEPTAQvtvIGTAVGLEKDLvPEAGYELDTIEKV-PFPRRP-NLYMLRFPAKWKRETAKVRSILE 94
+ 79**********************99987777************9*************.****99.9********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +dvv+gfggy++++++ a + gip+ ++Eqn+++g++nkl +r+a+
+ sp|B3DQN1|MURG_BIFLD 95 TRHADVVAGFGGYASAPVYATAHKMGIPIAIHEQNARAGMANKLGARWAD 144
+ ***********************************************998 PP
+
+>> sp|Q8CY50|MURG_BIFLO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 87.7 0.4 3.3e-26 1.9e-23 1 135 [. 8 144 .. 8 148 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 87.7 bits; conditional E-value: 3.3e-26
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +vlaggGT+G+v P++A+a + ++ ++ ++t gle+ + +eag+e +i+ +++++ l +l+ +a+ +++ k++ il+
+ sp|Q8CY50|MURG_BIFLO 8 IVLAGGGTAGHVNPLLAVAGAIRDIEPTAQvtvIGTAVGLEKDLvPEAGYELDTIEKV-PFPRRP-NLYMLRFPAKWKRETAKVRSILE 94
+ 79**********************99987777************9*************.****99.9********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +dvv+gfggy++++++ a + gip+ ++Eqn+++g++nkl +r+a+
+ sp|Q8CY50|MURG_BIFLO 95 TRHADVVAGFGGYASAPVYATAHKMGIPIAIHEQNARAGMANKLGARWAD 144
+ ***********************************************998 PP
+
+>> sp|Q6MIG1|MURG_BDEBA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 87.7 0.0 3.3e-26 1.8e-23 1 137 [. 7 145 .. 7 147 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 87.7 bits; conditional E-value: 3.3e-26
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v+aggGT+G+++P +A+ar+Lq+ ++ ++ ++t +gle+++ + +g + + i+++ +l+ k ++++k+l++ +l ++ ++l
+ sp|Q6MIG1|MURG_BDEBA 7 IVIAGGGTGGHIYPGIAIARALQKLDPSIEvhfVGTARGLESKIvPREGFPLHLIESG-QLNVKS-PIQKMKTLLKIPVGLWQSIRLLG 93
+ 79************************988877**************************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ + kp +v+g+ggy++++ ++aa+ g + v E n+ pg++n++l+r++++
+ sp|Q6MIG1|MURG_BDEBA 94 QLKPLYVIGVGGYASGPFVLAASIIGFNTAVWEPNAMPGMANRILSRFVDKC 145
+ *************************************************986 PP
+
+>> sp|Q7U3U6|MURG_SYNPX UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 88.0 0.4 2.7e-26 1.5e-23 2 137 .. 5 137 .. 4 139 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 88.0 bits; conditional E-value: 2.7e-26
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpd.vklwakleslktlkelaeglkalrkakeilkeak 88
+ ++a+ GT+G+++Pa+A+a++L + +++Vr l++p++le+++ a ++ +++++ +++ + + ++ l+ la+g ++ +++++++
+ sp|Q7U3U6|MURG_SYNPX 5 LIAASGTGGHLFPALAVAEALPE-DWQVRwLGVPDRLETQLVPARYSLFTVNAGgLQGSRLSKAVQLLLLLAAG----VSVARLIRRER 88
+ 799******************86.78***************555666666666611555545555555555555....*********** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++v+++ggy+a++a++aa+++g+p++++E+n+ipg v++ll r++ v
+ sp|Q7U3U6|MURG_SYNPX 89 IQLVLSTGGYIAAPAILAARFCGVPTVLHEANAIPGRVTRLLGRFCGAV 137
+ *****************************************99988666 PP
+
+>> sp|B7GQ78|MURG_BIFLI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 87.5 0.4 4e-26 2.2e-23 1 135 [. 8 144 .. 8 148 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 87.5 bits; conditional E-value: 4e-26
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +vlaggGT+G+v P++A+a + ++ ++ ++t gle+ + +eag+e +i+ +++++ l +l+ +a+ +++ k++ il+
+ sp|B7GQ78|MURG_BIFLI 8 IVLAGGGTAGHVNPLLAVAGAIRDIEPTAQvtvIGTAVGLEKDLvPEAGYELDTIEKV-PFPRRP-DLYMLRFPAKWKRETAKVRSILE 94
+ 79**********************99987777************9*************.*****9.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +dvv+gfggy++++++ a + gip+ ++Eqn+++g++nkl +r+a+
+ sp|B7GQ78|MURG_BIFLI 95 TRHADVVAGFGGYASAPVYATAHKMGIPIAIHEQNARAGMANKLGARWAD 144
+ ***********************************************998 PP
+
+>> sp|Q0UY53|ATG26_PHANO Sterol 3-beta-glucosyltransferase OS=Phaeosphaeria nodorum GN=ATG26 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 86.7 0.0 6.8e-26 3.8e-23 2 138 .. 956 1089 .. 955 1090 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 86.7 bits; conditional E-value: 6.8e-26
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrk 79
+ v +++G+rGdv+P+++l +eL ++Gh+ r+at+ ++e++v+++g+++ p+++d v++ ++++++ke+ ++
+ sp|Q0UY53|ATG26_PHANO 956 VCLTIGSRGDVQPYISLCKELLKEGHKARIATHAEFEPWVRKHGIDFAPVDGDpaelmricVEHGM--FTYGFIKEANSK------ 1033
+ 6789*******************************************************7777777..8***********...... PP
+
+ HHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 80 akeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ + ++ + +++++ + +++li++++ ++ ++vaE++ ip+++++++p+ +++++
+ sp|Q0UY53|ATG26_PHANO 1034 -FRGWLDDVCSSSWRAC--QGADVLIESPSTMAGIHVAEALEIPYFRAFTMPWSRTRAY 1089
+ .8888888877777777..8999*******************************99987 PP
+
+>> sp|Q8DVE2|MURG_STRMU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 86.8 0.0 6.4e-26 3.6e-23 1 138 [. 6 145 .. 6 146 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 86.8 bits; conditional E-value: 6.4e-26
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH--..-EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeag..leavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ + g+e++ e++ + +++i+++ kl++++ slk++++++++++++ ++ +i+
+ sp|Q8DVE2|MURG_STRMU 6 IIFTGGGTVGHVTLNLLLIPRFLKDGWEVHyIGDKHGIEHEQiEQSDfdVIFHSIATG-KLRRYF-SLKNVLDVFKVGWGVLQSLTIMV 92
+ 689************************************998888761166777****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+v+++ gg+v++++++aa+l++ip++v+E++ +gl+n++ ++a++++
+ sp|Q8DVE2|MURG_STRMU 93 KVRPQVLFSKGGFVSVPPVVAANLLRIPVFVHESDLSMGLANRIAYKFATTMY 145
+ *************************************************9876 PP
+
+>> sp|Q6N411|MURG_RHOPA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 88.2 0.6 2.3e-26 1.3e-23 1 138 [. 7 143 .. 7 144 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 88.2 bits; conditional E-value: 2.3e-26
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE....----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavp....igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++la+gGT+G+++Pa Al++ L rrG++Vrl+t + ++ +gl + + ++++ +++ + ++ k++++ + + a+ ++
+ sp|Q6N411|MURG_RHOPA 7 ILLAAGGTGGHLFPAEALGVVLIRRGYRVRLVTDHRATRY---SGLFTAEmtdvVPSE-TVRGRT-PWALAKTALKLGSGALLAFNLIG 90
+ 79********************************999998...555555533345566.777766.9999******************* PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + kp++vvgfggy +++l+aa+++++p+ ++Eqn+++g +n++l+ r++ ++
+ sp|Q6N411|MURG_RHOPA 91 RLKPAAVVGFGGYPTLPPLLAATWRRVPTLIHEQNAVMGRANRFLAPRVDAIA 143
+ ************************************************99875 PP
+
+>> sp|Q6CUV2|ATG26_KLULA Sterol 3-beta-glucosyltransferase OS=Kluyveromyces lactis GN=ATG26 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 87.0 0.0 5.6e-26 3.2e-23 2 138 .. 739 872 .. 738 873 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 87.0 bits; conditional E-value: 5.6e-26
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ l+++G+rGdv+P++Ala++Lq++GheV++ t+ ++++++ ++++ +++i ++ v++ + + ++ l+++ + +
+ sp|Q6CUV2|ATG26_KLULA 739 GLLTIGSRGDVQPYIALAKGLQAEGHEVIILTHGEFKDWIVSHNIGFREISGNpaelislmVQHGS--MNMGLLRDASTN-------F 817
+ 589******************************************************988877777..778888888888.......7 PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ + d+ +++g++ ++li++++a++ +++aE++ ip+++++++p+++++++
+ sp|Q6CUV2|ATG26_KLULA 818 STWISSLLDT--AWEGCQGIDILIESPSAMAGIHIAEALRIPYFRAFTMPWTRTRAY 872
+ 7777777444..48999************************************9987 PP
+
+>> sp|Q1MPB9|MURG_LAWIP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 87.6 0.1 3.6e-26 2e-23 1 138 [. 5 140 .. 5 141 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 87.6 bits; conditional E-value: 3.6e-26
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+v+Pa+A+a+++ ++ + ++++ g e++ ++ +++++ ++++ ++ +++k+++ l++ ka+ ka++il++
+ sp|Q1MPB9|MURG_LAWIP 5 IAITTGGTGGHVYPALAVAEQFHDKA-DLFfIGSQYGPEAEMvKTFNIPFYGLPVR-GVLG--RKWKAFSALYSMIKAIVKARKILQKC 89
+ 789**********************9.5555********9999*************.8888..999*********************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ pd+vvgfg+y++ ++l+aa+l +ip+ ++Eqn +pgl+n+ l+r a++v+
+ sp|Q1MPB9|MURG_LAWIP 90 MPDIVVGFGSYASFAPLVAAKLKRIPTAIHEQNVRPGLANRMLARLADRVF 140
+ ************************************************997 PP
+
+>> sp|Q8R5N5|MURG_FUSNN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 84.4 0.0 3.5e-25 2e-22 1 135 [. 7 135 .. 7 139 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 84.4 bits; conditional E-value: 3.5e-25
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v+l++gGT+G+++Pa+A+a++L+ +G+e +++ +++e+ + +e+g ++ +++ ++ lk++ + lka+r a +++ke+
+ sp|Q8R5N5|MURG_FUSNN 7 VMLTTGGTGGHIYPALAVADRLKIKGIEAVfVGSMERMEKDLvPESGHKFIGVDIS--------VPRGLKNIRKYLKAIRTAYKVIKEE 87
+ 68**************************999***********9*******666655........55677888888888*********** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ kpd+++gfg+y++++++ia +l++ ++++ Eqn g +nk + + a+
+ sp|Q8R5N5|MURG_FUSNN 88 KPDAIIGFGNYISVPVIIAGILLRKKIYLQEQNVNIGSANKMFYKIAK 135
+ ******************************************999887 PP
+
+>> sp|Q3ANV3|MURG_CHLCH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 86.7 0.1 6.7e-26 3.8e-23 1 139 [] 3 147 .. 3 147 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 86.7 bits; conditional E-value: 6.7e-26
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----...S------.-HHHCCSHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpd...vklwakleslktlkelaeglkalrkake 82
+ v++aggGT+G+++Pa+A+a eLqr ++V ++t+ g+e++ + g++ + + ++ ++ kl +++l+ l+++ ++l + +
+ sp|Q3ANV3|MURG_CHLCH 3 VLFAGGGTGGHLYPAIAMAAELQRLSPNVSvafVGTKSGIEATEvPRLGYKLHLVSVRglkRGFSPKL-LIENLRILFDFARSLGITIQ 90
+ 79***************************************9988**********9994444444444.66788889999********* PP
+
+ HHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 83 ilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ +l+++ pdvvvg+gg+v++++l+aa l+g ++ + Eqn+ pg++++ll+ +a v+v
+ sp|Q3ANV3|MURG_CHLCH 91 LLRSEAPDVVVGTGGFVSAPLLFAAQLLGKKTLIQEQNAFPGVTTRLLSLFASEVHV 147
+ *************************************************99998875 PP
+
+>> sp|A8AW15|MURG_STRGC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.9 0.0 1.2e-25 6.7e-23 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 85.9 bits; conditional E-value: 1.2e-25
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ ++G++V+ ++ ++g+e + ++gl ++++++++ kl++++ s+++l++ +++ ++++++ i+
+ sp|A8AW15|MURG_STRGC 4 ILFTGGGTVGHVTLNLLLIPKFIKEGWQVHyIGDKNGIEYQEiQKSGLdvTFHSVATG-KLRRYF-SWQNLLDGFKVIWGIFQSLSIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+l+g+p++v+E++ gl+nk+ + a++++
+ sp|A8AW15|MURG_STRGC 91 KVRPQALFSKGGFVSVPPVIAARLSGVPVYVHESDLSIGLANKIAYKCATKMY 143
+ *********************************************99999876 PP
+
+>> sp|B8DP79|MURG_DESVM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 86.1 1.2 1.1e-25 5.9e-23 1 138 [. 4 142 .. 4 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 86.1 bits; conditional E-value: 1.1e-25
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+l++gGT+G+++Pa+A+a+e rr ++ r l+ + g e+ + + agle+v ++++ +++ + l++l + + + ++ +a +++
+ sp|B8DP79|MURG_DESVM 4 VILTTGGTGGHIFPALAVAEEITRRYPKARilfLGGQYGPEADLaARAGLEYVGLPVR-GVMG--RGLRALAAAGAMGLGVWRAVSVVR 89
+ 78********************************************************.9999..7799999999999*********** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ pd+ vgfggy+a + ++aa+l+g pa ++Eqn+ipgl+n+ll + +v+
+ sp|B8DP79|MURG_DESVM 90 RFDPDIAVGFGGYAAFAGVLAARLCGRPAAIHEQNAIPGLTNRLLGHVVQRVF 142
+ *******************************************9988777765 PP
+
+>> sp|Q728U8|MURG_DESVH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 86.5 0.8 8.2e-26 4.6e-23 1 138 [. 4 142 .. 4 143 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 86.5 bits; conditional E-value: 8.2e-26
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+l++gGT+G+++Pa+A+a+e ++r +e ++ g e+ + + agl++v ++++ ++ + ++++ ++ ++ +a +++
+ sp|Q728U8|MURG_DESVH 4 VILTTGGTGGHIFPALAVAEEIRARYPECSvlfMGGLYGPEADLaARAGLDFVGLPVR-GVLG--RGVRAIGAAFGMAAGIARAYAVMG 89
+ 78**************************999999999999*9999*************.6555..4455555555555669999***** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ pd+v+gfggy+a + ++aa+l+g pa ++Eqn++pgl+n++l+r + +v+
+ sp|Q728U8|MURG_DESVH 90 RFDPDIVLGFGGYAAFAGVLAARLRGRPAAIHEQNSVPGLTNRVLSRVVPRVF 142
+ ***********************************************999886 PP
+
+>> sp|Q8NJS1|ATG26_LEPMC Sterol 3-beta-glucosyltransferase OS=Leptosphaeria maculans GN=ATG26 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 86.1 0.0 1e-25 5.9e-23 2 138 .. 960 1093 .. 959 1094 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 86.1 bits; conditional E-value: 1e-25
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrk 79
+ v +++G+rGdv+P++Al +eL ++Gh+ r+at+ ++e++v+++g+++ p++++ v++ ++++++ke+ ++
+ sp|Q8NJS1|ATG26_LEPMC 960 VCLTIGSRGDVQPYIALCKELLKEGHKPRIATHAEFEPWVRKHGIDFAPVDGNpaelmricVEHGM--FTYNFMKEANSK------ 1037
+ 6789**************************************************99*997777777..8999****9999...... PP
+
+ HHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 80 akeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ + ++ + +++++ + +++li++++ ++ +++aE++ ip+++++++p+++++++
+ sp|Q8NJS1|ATG26_LEPMC 1038 -FRGWLDDVCSSSWRAC--QGADVLIESPSTMAGIHIAEALEIPYFRAFTMPWTRTRAY 1093
+ .7888888877777777..8999********************************9987 PP
+
+>> sp|Q5KK25|ATG26_CRYNE Sterol 3-beta-glucosyltransferase OS=Cryptococcus neoformans GN=ATG26 PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 86.0 0.0 1.1e-25 6.2e-23 4 138 .. 1039 1170 .. 1036 1171 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 86.0 bits; conditional E-value: 1.1e-25
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----......S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd......vklwakleslktlkelaeglkalrkakei 83
+ +++G+rGdv+P++Al ++Lq++Gh ++at+ +++++ve +g++++++g+d +++ + ++++++lke +++ ++
+ sp|Q5KK25|ATG26_CRYNE 1039 LTIGSRGDVQPYIALCKGLQAEGHITKIATHGEYKAWVEGHGIAFESVGGDpaelmqMCVDNGMFTVSFLKEGLQK-------FRG 1117
+ 79**************************************************999997777777999999999999.......899 PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + ++ + +++++ + ++li++++a+ ++vaE++ ip+ +++++p+++++++
+ sp|Q5KK25|ATG26_CRYNE 1118 WLDDLLNSSWEAC--QGSDLLIESPSAMSGIHVAEALRIPYYRAFTMPWTRTRAY 1170
+ 9999977777776..788999******************************9987 PP
+
+>> sp|Q8YZI3|MURG_ANASP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.4 0.0 1.8e-25 9.9e-23 2 135 .. 9 139 .. 8 143 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 85.4 bits; conditional E-value: 1.8e-25
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+++Pa+Ala++L ++++e l++p++le+++ + ++ +i+++ ++++ l ++ l+ l + ++ k++++lk+ + +
+ sp|Q8YZI3|MURG_ANASP 9 LIAASGTGGHLFPAIALAEKLPDYEIEW-LGVPNRLETQLVPKQYPLNTIAVE-GFQQGL-GISSLVILGKLIGSILKVRRLLKQGNFQ 94
+ 799**********************776.***********8888999999999.999988.**************************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ vv +ggy+a++a+iaa+++g p++ +E+n++pg+v++++ ++
+ sp|Q8YZI3|MURG_ANASP 95 GVVTTGGYIAGPAVIAARSLGLPVIFHESNALPGKVTRFFGPWCS 139
+ **************************************9987765 PP
+
+>> sp|B9DUV6|MURG_STRU0 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.3 0.0 1.8e-25 1e-22 1 138 [. 5 144 .. 5 145 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 85.3 bits; conditional E-value: 1.8e-25
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT G+v + l ++ + G+eV+ ++ ++g+e + ++g+ ++++i+++ kl++++ s+++l +++++ +l ++ i+
+ sp|B9DUV6|MURG_STRU0 5 ILFTGGGTVGHVTLNLILIPKFLKDGWEVHyIGDKKGIEYQEiQKSGYpvTFHAIKTG-KLRRYF-SWQNLIDVFKVATGLLQSLVIIN 91
+ 79**************************************99988876116777****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + kp+++++ gg+v+++++ia++l g+p++v+E++ +gl+nk+ ++a +++
+ sp|B9DUV6|MURG_STRU0 92 KVKPQALFSKGGFVSVPPVIASRLMGVPVFVHESDLSMGLANKIALKFASTMY 144
+ ********************************************999987765 PP
+
+>> sp|Q3M935|MURG_ANAVT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.7 0.0 1.4e-25 7.7e-23 2 135 .. 9 139 .. 8 143 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 85.7 bits; conditional E-value: 1.4e-25
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+++Pa+Ala++L ++++e l++p++le+++ + ++ +i+++ ++++ l l+ l+ l + ++ k++++lk+ + +
+ sp|Q3M935|MURG_ANAVT 9 LIAASGTGGHLFPAIALAEKLPDYEIEW-LGVPNRLETQLVPKQYPLNTIAVE-GFQQGL-GLSSLVILGKLIGSILKVRRLLKQGNFQ 94
+ 799**********************776.***********8888999999999.999988.**************************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ vv +ggy+a++a+iaa+++g p++ +E+n++pg+v++++ ++
+ sp|Q3M935|MURG_ANAVT 95 GVVTTGGYIAGPAVIAARSLGLPVIFHESNALPGKVTRFFGPWCS 139
+ **************************************9987765 PP
+
+>> sp|Q7VDZ2|MURG_PROMA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.7 0.0 1.4e-25 8.2e-23 2 138 .. 5 138 .. 4 139 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 85.7 bits; conditional E-value: 1.4e-25
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+++a+eL + +++ l++p++le+++ +++++ i+++ +l++ + l+++ +l++ a++ + +++k++++
+ sp|Q7VDZ2|MURG_PROMA 5 LIAASGTGGHIFPALSVAEELPES-WDISwLGVPERLENQLVPTKYDMTVIPVG-GLQS--KGLRKYFQLLKLILAIFFVIYLIKRKQI 89
+ 799******************987.6***************5555555556666.6677..4488888889998999999********* PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++v+ +ggy+a++a+ia++l+gi ++++E+n+ pg+v++ll ++++ v+
+ sp|Q7VDZ2|MURG_PROMA 90 KLVFTTGGYIAAPAIIASKLCGINVILHESNSYPGKVTRLLGKFCDEVA 138
+ ********************************************99886 PP
+
+>> sp|Q0I6M0|MURG_SYNS3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.7 0.1 1.4e-25 7.7e-23 2 139 .] 5 139 .. 4 139 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 85.7 bits; conditional E-value: 1.4e-25
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+++a++L + + Vr +++p++le+ + ++ +++++ +l+ + l++l +l + l a +++++++++++
+ sp|Q0I6M0|MURG_SYNS3 5 LVAASGTGGHLFPALSVADALLEP-WSVRwVGVPDRLETSLVPGRYPLTTVKAG-GLQG--RGLRKLIQLIQLLAASGSIRRLIQRERI 89
+ 799******************976.7**************95555666666666.6677..5688999999999999************ PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ d+v+ +ggy+a++a++aa+++gip++++E+n+ipg v++ll r++++v+v
+ sp|Q0I6M0|MURG_SYNS3 90 DAVFTTGGYIAAPAILAARWCGIPVVLHESNAIPGRVTRLLGRFCTRVAV 139
+ **********************************************9975 PP
+
+>> sp|B2J8J9|MURG_NOSP7 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.4 0.0 1.7e-25 9.6e-23 2 137 .. 9 141 .. 8 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 85.4 bits; conditional E-value: 1.7e-25
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+++Pa+Ala++L ++ +e l++p++le+++ ++++ +i+++ ++++ + l+ ++ + + ++ ++++ilk+ + +
+ sp|B2J8J9|MURG_NOSP7 9 LIAASGTGGHLFPAIALAEKLPDYQIEW-LGVPNRLETQLVPKEYPLNTIAVE-GFQQGF-GLSSIRIFGKLAGSIIEVRRILKQGNFQ 94
+ 799********************99776.***********8899999999999.999988.**************************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ v+ +ggy+a++a+iaa+++g p++ +E+n++pg+v++++ ++ v
+ sp|B2J8J9|MURG_NOSP7 95 GVFTTGGYIAGPAVIAARSLGLPVVFHESNALPGKVTRFFGPWCSAV 141
+ ***************************************99988776 PP
+
+>> sp|A5GPC2|MURG_SYNPW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 86.6 0.2 7.5e-26 4.2e-23 2 138 .. 5 138 .. 4 139 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 86.6 bits; conditional E-value: 7.5e-26
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++a+ GT+G+++Pa+++a++L +G+ + l++p++le+++ e + l++ ++++ +l+ + lk++++l++ l a r+++++++++
+ sp|A5GPC2|MURG_SYNPW 5 LIAASGTGGHLFPALSVADALP-AGWSAHwLGVPDRLETTLvpERYPLTT--VNAG-GLQG--RGLKKVVQLLRLLAASRDVRRLIRRN 87
+ 799******************8.59***************9555555555..6666.6677..6689999999999999********** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +dvv+ +ggy+a++a+++a+++g+p++++E+n+ipg v++ll r +++v+
+ sp|A5GPC2|MURG_SYNPW 88 GIDVVFTTGGYIAAPAILGARWSGVPVVLHESNAIPGRVTRLLGRACTQVA 138
+ *******************************************99999886 PP
+
+>> sp|B4RFS0|MURG_PHEZH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 86.5 1.6 8e-26 4.5e-23 2 137 .. 6 140 .. 5 142 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 86.5 bits; conditional E-value: 8e-26
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH......HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv......eeagleavpigpdvklwakleslktlkelaeglkalrkakeil 84
+ v+a+gGT+G+++Pa Ala++L +rG+++ la+ ++++ + gl+a ++ p+ + +++++ +++l++ a++++
+ sp|B4RFS0|MURG_PHEZH 6 VVAAGGTGGHLFPAQALAEALIARGWRIVLASDERVAGLAqdfpaeRRIGLSAATYRPG-------DPVGMMRAGFAVLRGAMHARAAF 87
+ 89********************************9987641111222335555555555.......9********************** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +e pdvvvgfggy +++al+aa+l + p++++Eqn+++g +n++l+ ++ +v
+ sp|B4RFS0|MURG_PHEZH 88 REIGPDVVVGFGGYPSAPALVAAILDRRPTVIHEQNAVMGRTNRILAPHVRTV 140
+ *********************************************99888776 PP
+
+>> sp|A1VBE8|MURG_DESVV UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.4 1.0 1.8e-25 1e-22 1 138 [. 4 142 .. 4 143 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 85.4 bits; conditional E-value: 1.8e-25
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+l++gGT+G+++Pa+A+a+e ++r +e ++ g e+ + + agl++v ++++ ++ + ++++ ++ ++ +a +++
+ sp|A1VBE8|MURG_DESVV 4 VILTTGGTGGHIFPALAVAEEIRARYPECSvlfMGGLYGPEADLaARAGLDFVGLPVR-GVLG--RGVRAIGAAFGMAAGIARAYAVMG 89
+ 78**************************999999999999*9999*************.6555..4455555555555669999***** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++ pd+v+gfggy+a + ++aa+l+g pa ++Eqn++pg++n++l+r + +v+
+ sp|A1VBE8|MURG_DESVV 90 RFDPDIVLGFGGYAAFAGVLAARLRGRPAAIHEQNSVPGVTNRVLSRVVPRVF 142
+ ***********************************************999886 PP
+
+>> sp|B7IHN7|MURG_THEAB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.4 0.0 1.8e-25 1e-22 1 139 [] 4 144 .. 4 144 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 85.4 bits; conditional E-value: 1.8e-25
+ EEEE-------HHHHHHHHHHHHH--.-EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrG.heVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++agg T+G+++Pa+A+ +eL + ++V + ++ +lee+v + ++++ v+++++ +l++ + s++++k+l++ ++a + + + lk+
+ sp|B7IHN7|MURG_THEAB 4 IAVAGGVTGGHLYPALAVLKELEKLTpIDVLyFTVSGKLEERVlKDYNYKKVSLKIQ-GLKRPVYSIENIKRLFKIFNANNIVLKELKK 91
+ 789*********************9735888**************************.******************************* PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ +kpd+v+ +ggyv+ ++++aa++++ip+++ Eqn ipgl+n l+ +a++v+v
+ sp|B7IHN7|MURG_THEAB 92 FKPDIVFVTGGYVSYPVGTAAKKLKIPLYIQEQNVIPGLANIKLSSFAKKVFV 144
+ *************************************************9985 PP
+
+>> sp|Q7S1I0|ATG26_NEUCR Sterol 3-beta-glucosyltransferase OS=Neurospora crassa GN=atg-26 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.0 0.0 2.3e-25 1.3e-22 4 138 .. 1016 1147 .. 1013 1148 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 85.0 bits; conditional E-value: 2.3e-25
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ +++G+rGdv+P++Al ++L ++Gh+ +++t++++++++e++g+e+ p+++d +++ +++++l+e+ ++ +
+ sp|Q7S1I0|ATG26_NEUCR 1016 LTIGSRGDVQPYIALCKRLLEEGHRPKIVTHREFKDWIESHGIEFGPVEGDpselmricIENGT--FTYAFLREANSK-------F 1092
+ 79*************************************************9777774444444..677777777777.......7 PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + ++ + +++ ++ ++li++++a++ +++aE++gip+++++++p+++++++
+ sp|Q7S1I0|ATG26_NEUCR 1093 RGWLDELLTSAWEA--CQGSDLLIESPSAMAGIHIAEALGIPYFRAFTMPWTRTRAY 1147
+ 77877776666555..589999*******************************9987 PP
+
+>> sp|Q3AVX2|MURG_SYNS9 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.1 0.3 2.1e-25 1.2e-22 2 138 .. 5 138 .. 4 139 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 85.1 bits; conditional E-value: 2.1e-25
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+a++L +V l++p++le+++ a + +++++ +l+ + +++l++l + l a ++++++ +++
+ sp|Q3AVX2|MURG_SYNS9 5 LIAASGTGGHLFPALAVADALDGHC-QVSwLGVPDRLETELVPARFKLITVNAG-GLQG--RGITKLVQLIRLLAASITVRRLIRTHQI 89
+ 799******************8876.9**************9999999999999.9999..77************************** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ d+v+ +ggy+a++a+++a+++g+pa+++E+n+ipg v++ll r++ v+
+ sp|Q3AVX2|MURG_SYNS9 90 DAVFTTGGYIAAPAILGARWCGVPAVLHESNAIPGRVTRLLGRFCSAVA 138
+ *******************************************998886 PP
+
+>> sp|Q4WID6|ATG26_ASPFU Sterol 3-beta-glucosyltransferase OS=Aspergillus fumigatus GN=atg26 PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 84.8 0.0 2.7e-25 1.5e-22 4 138 .. 907 1038 .. 904 1039 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 84.8 bits; conditional E-value: 2.7e-25
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ +++G+rGdv+P++Al ++L ++Gh+ ++at+ ++e++v+++g+++ p+++d v++ +++++lke+ ++ +
+ sp|Q4WID6|ATG26_ASPFU 907 LTIGSRGDVQPYIALCKGLLAEGHRPKIATHAEFEPWVRKHGIDFAPVEGDpaelmricVENGM--FTYSFLKEASQK-------F 983
+ 79**************************************************999884444444..889999999888.......8 PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + ++ ++ +++++++ ++li++++a++ +++aE++ ip+++++++p+ +++++
+ sp|Q4WID6|ATG26_ASPFU 984 RGWIDDL--LSSAWASCQDSDLLIESPSAMAGIHIAEALRIPYFRAFTMPWSRTRAY 1038
+ 8888888..666778889**********************************99987 PP
+
+>> sp|A1CYS1|ATG26_NEOFI Sterol 3-beta-glucosyltransferase OS=Neosartorya fischeri (strain ATCC 1020 / DSM 3700 / FGSC
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 84.8 0.0 2.7e-25 1.5e-22 4 138 .. 916 1047 .. 913 1048 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 84.8 bits; conditional E-value: 2.7e-25
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ +++G+rGdv+P++Al ++L ++Gh+ ++at+ ++e++v+++g+++ p+++d v++ +++++lke+ ++ +
+ sp|A1CYS1|ATG26_NEOFI 916 LTIGSRGDVQPYIALCKGLLAEGHRPKIATHAEFEPWVRKHGIDFAPVEGDpaelmricVENGM--FTYSFLKEASQK-------F 992
+ 79**************************************************999884444444..889999999888.......8 PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + ++ ++ +++++++ ++li++++a++ +++aE++ ip+++++++p+ +++++
+ sp|A1CYS1|ATG26_NEOFI 993 RGWIDDL--LSSAWASCQDSDLLIESPSAMAGIHIAEALRIPYFRAFTMPWSRTRAY 1047
+ 8888888..666778889**********************************99987 PP
+
+>> sp|Q8DHY4|MURG_THEEB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 84.6 0.0 3e-25 1.7e-22 2 138 .. 8 141 .. 7 142 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 84.6 bits; conditional E-value: 3e-25
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+a+eL +++ ++ l++ ++le+++ +++ ++++ +l+ k +++l++l++++ + +++++lk+
+ sp|Q8DHY4|MURG_THEEB 8 LIAASGTGGHLFPALAVAQELPEYE--IHwLGVRDRLENQLIPPHYPLHTVNFS-GLQGKT-PWAKLRPLWQFWGVFWQTRQLLKQGDF 92
+ 799********************99..667***********8888888888888.889988.9************************** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + v+ +ggy+a++a++aa+++g +a+++E+n++pg+v+++l+ +++ v+
+ sp|Q8DHY4|MURG_THEEB 93 QGVFTTGGYIAAPAILAARSLGRVAILHESNALPGKVTRWLAPWCTLVA 141
+ ******************************************9999886 PP
+
+>> sp|Q11RH5|MURG_CYTH3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 84.2 0.0 4.2e-25 2.4e-22 1 137 [. 9 147 .. 9 149 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 84.2 bits; conditional E-value: 4.2e-25
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++PavA+a++ ++r ++ + ++++ ++e + ++ag++++ + + + ++kl sl++l ++++ +++kak+i++
+ sp|Q11RH5|MURG_CYTH3 9 IIISGGGTGGHIYPAVAIANAIKARFPDSEilfVGAQGRMEMQKvPAAGYNIEGLWIS-GIQRKL-SLDNLAFPLKVIASYFKAKKIVS 95
+ 6899*********************9999999********98877*************.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +kpd+ +g+ggy++ ++l aa+++g+++ + Eqn+ +g++nk+l+++++ +
+ sp|Q11RH5|MURG_CYTH3 96 TFKPDIAIGVGGYASWPLLQAANASGVATLIQEQNSYAGVANKALSKKVKAI 147
+ ************************************************9976 PP
+
+>> sp|A9BDG0|MURG_PROM4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 84.7 0.0 2.9e-25 1.6e-22 2 138 .. 5 138 .. 4 139 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 84.7 bits; conditional E-value: 2.9e-25
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+a++L + ++V l+++++le+ + ++++ +ig++ ++++ + +k ++++++ l a+ ++ +++++++
+ sp|A9BDG0|MURG_PROM4 5 LIAASGTGGHLFPALAVAEALPES-WKVSwLGVSDRLESSLIPKKYQLSTIGVE-GVQS--RGIKRIVQIFKLLAATGSVICLIRRNRI 89
+ 799******************987.6***************99999********.9999..77************************** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++v+ +ggy+a++a++aa+l g +++++E+n+ipg++++ll r +++v+
+ sp|A9BDG0|MURG_PROM4 90 QIVLTTGGYIAVPAVLAAKLTGKKVILHESNAIPGKATRLLGRLCDKVA 138
+ *****************************************99999986 PP
+
+>> sp|Q73L91|MURG_TREDE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.6 0.0 6.4e-25 3.6e-22 1 139 [] 4 151 .. 4 151 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 83.6 bits; conditional E-value: 6.4e-25
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE........----S------.-HHHCCSHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavp........igpdvklwakleslktlkelaeglkal 77
+ vv++ggGT+G+++P +A+a++L e r +++ +g+++++ e+++l + i+++ kl++++ s++++ +++++ ++
+ sp|Q73L91|MURG_TREDE 4 VVFTGGGTGGHIFPGLAVAEALSSSL-ECRivwIGSAKGVDRKIvESSELYSASpsvlefigIPAG-KLRRYF-SFQNFIDVFKVAAGF 89
+ 79********************9764.444559************999874443355555448888.******.*************** PP
+
+ HHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 78 rkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ k+++il + kp v++ gg+v+++++ aa++++ip++ +E + pgl++++++++an++lv
+ sp|Q73L91|MURG_TREDE 90 IKSFFILLKLKPVFVFSKGGFVSVPPCAAAKFLKIPVITHECDFSPGLATRINSKFANRILV 151
+ ***********************************************************985 PP
+
+>> sp|C4XK69|MURG_DESMR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 85.4 0.6 1.7e-25 9.7e-23 2 138 .. 5 141 .. 4 142 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 85.4 bits; conditional E-value: 1.7e-25
+ EEE-------HHHHHHHHHHHHH-..--EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrr..GheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++gGT+G+++Pa+A+a++ +r G +V ++ g e ++ ++agl++v+++++ ++ + +k+l ++ l+a+ a + ++e+
+ sp|C4XK69|MURG_DESMR 5 IVTTGGTGGHIFPALAVAEAAMRLspGLDVLFIGGAGPEGELaAKAGLPFVALPAK-GVFG--RGIKALAAPFWMLRAFGLAGARIREF 90
+ 689*******************985588999999999999999*************.8888..6689999999999************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pdvv gfggy+ ++ aa+l g+p+ ++Eqn++pg++nk+l r++++v+
+ sp|C4XK69|MURG_DESMR 91 SPDVVCGFGGYAGFIPVAAARLMGVPTAIHEQNSVPGVTNKVLGRFVDRVF 141
+ ************************************************997 PP
+
+>> sp|A1BAL5|MURG_PARDP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 84.2 1.3 4.1e-25 2.3e-22 1 138 [. 7 144 .. 7 145 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 84.2 bits; conditional E-value: 4.1e-25
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavp..igpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++a+gGT+G+++Pa +la++L ++G++V+l t ++ ++ + e+ + + + ++ + l+ l +++ + ++ +a ++++ +
+ sp|A1BAL5|MURG_PARDP 7 CLIAAGGTGGHMFPAQSLAETLLAQGWRVKLSTDERGARYAGAFPAEVARevVSSA-TTARGG-ALARLAVPFRIGAGVLAAIRAMRAD 93
+ 689************************************99555555444437777.555556.9999********************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p+vvvgfggy +a+ aal ++ip+ ++Eqngi+g vn +++rr+++v+
+ sp|A1BAL5|MURG_PARDP 94 RPAVVVGFGGYPTIPAMSAALVLRIPRMIHEQNGIMGRVNMAFARRVDRVA 144
+ ************************************************986 PP
+
+>> sp|A3CLN6|MURG_STRSV UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.4 0.0 7.3e-25 4.1e-22 1 138 [. 4 143 .. 4 144 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 83.4 bits; conditional E-value: 7.3e-25
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---..EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagl..eavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v++ggGT G+v + l ++ ++G++V+ ++ + g+e + ++gl ++++++++ kl++++ s+++l++ +++ ++++++ i+
+ sp|A3CLN6|MURG_STRSV 4 IVFTGGGTVGHVTLNLLLIPKFIKEGWQVHyVGDKHGIEYQEiQKSGLdvTFHSVATG-KLRRYF-SWQNLLDGFKVVWGIFQSLGIML 90
+ 79***************************************99***98334666****.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +p+++++ gg+v+++++iaa+l+g+p++v+E++ gl+nk+ + a++++
+ sp|A3CLN6|MURG_STRSV 91 KVRPQALFSKGGFVSVPPVIAARLSGVPVYVHESDLSIGLANKIAYKCATKMY 143
+ *********************************************99999876 PP
+
+>> sp|A4SV74|MURG_POLSQ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 84.1 0.0 4.4e-25 2.5e-22 1 136 [. 6 141 .. 6 144 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 84.1 bits; conditional E-value: 4.4e-25
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+++P +A+a+ L+ G++V l+ + g+e ++ ++ + ++++++ + +l+ k+ ++l+ + + +a +++ +i+++
+ sp|A4SV74|MURG_POLSQ 6 ILVMAGGTGGHIFPGLAVAEYLRICGWNVSwLGNQSGMEYRLvKSCNFPFEAVEFG-GLRGKG-IKAKLMLPINLARACHQSWKIMRRL 92
+ 789*****************************************************.******.999999999999************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ kp+vv+g+ggy+ + ++ ++l++ p++++E+n+++g +n++l++ a +
+ sp|A4SV74|MURG_POLSQ 93 KPNVVLGMGGYITFPGGLISKLLKRPLVLHEANSVAGSANRALAKIAMR 141
+ ******************************************9998765 PP
+
+>> sp|O67238|MURG_AQUAE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 84.0 0.0 4.6e-25 2.6e-22 1 139 [] 2 137 .. 2 137 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 84.0 bits; conditional E-value: 4.6e-25
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavp..igpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++++ggGT+G+++Pa+A+ + + +++ +V+ +++++g+e + ++ +++++ ++++ +l+++ ++++lk ++++lka ++++e lke
+ sp|O67238|MURG_AQUAE 2 IAVSGGGTGGHFFPALAFTNYVLKKE-KVKfIGSKRGIEYE-LKDLIKTEKlfLDVE-PLRERN-FYQKLKAIWKFLKAQEEINEFLKE 86
+ 6899**********************.***9*******999.677888888446666.777777.************************ PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ + +++ fggy++++++i++ l++ ++++Eqn+ip ++nk+l+++a++vl+
+ sp|O67238|MURG_AQUAE 87 DYRALI--FGGYASLPLGINTVLRRKELFIHEQNSIPSKTNKILSKKAKKVLI 137
+ **9999..******************************************985 PP
+
+>> sp|Q2U0C3|ATG26_ASPOR Sterol 3-beta-glucosyltransferase OS=Aspergillus oryzae GN=atg26 PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.9 0.0 5e-25 2.8e-22 4 138 .. 897 1028 .. 894 1029 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 83.9 bits; conditional E-value: 5e-25
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ +++G+rGdv+P++Al ++L ++Gh+ ++at+ ++e++v+++g+++ p+++d v++ +++++lke+ + +
+ sp|Q2U0C3|ATG26_ASPOR 897 LTIGSRGDVQPYIALCKGLLAEGHKPKIATHAEFEPWVRQHGIDFAPVDGDpaelmricVENGM--FTYSFLKEASTK-------F 973
+ 79**************************************************999994444444..899999999999.......8 PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + ++ ++ +++++++ ++li++++a++ +++aE++ ip+++++++p+ +++++
+ sp|Q2U0C3|ATG26_ASPOR 974 RGWIDDL--LSSAWASCQDSDLLIESPSAMAGIHIAEALRIPYFRAFTMPWSRTRAY 1028
+ 8888888..666778889**********************************99987 PP
+
+>> sp|Q3STS8|MURG_NITWN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.3 0.3 7.8e-25 4.4e-22 1 138 [. 7 143 .. 7 144 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 83.3 bits; conditional E-value: 7.8e-25
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.....vklwakleslktlkelaeglkalrkakeil 84
+ ++la+gGT+G+++Pa Al++eL++rG +Vrl+t + + +gl + ++ v++++ ++ ++ + ++ a ++
+ sp|Q3STS8|MURG_NITWN 7 ILLAAGGTGGHLFPAEALGVELMKRGLRVRLVTDSRALRY---SGLFSKDLTDVvpsetVRGRS---PWALARTGLMLAAGTAVALNLM 89
+ 79****************************9999887766...566655544444443434444...44444444444445889999** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + kp++vvgfggy +++liaa+l+gip++++++n+++g +n +l++r+n ++
+ sp|Q3STS8|MURG_NITWN 90 RVLKPAAVVGFGGYPTLPPLIAARLRGIPTVIHDSNAVMGRANSFLSKRVNAIA 143
+ ***************************************************976 PP
+
+>> sp|A1BJX8|MURG_CHLPD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.7 0.2 5.7e-25 3.2e-22 1 138 [. 3 146 .. 3 147 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 83.7 bits; conditional E-value: 5.7e-25
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----..S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpd..vklwakleslktlkelaeglkalrkakei 83
+ v++aggGT+G+++PavA+a eLq+r ++V+ +t+ g+e++ + g+ + + ++ ++++ + +++l la++ a+r+a +i
+ sp|A1BJX8|MURG_CHLPD 3 VLFAGGGTGGHLYPAVAMAGELQKRVPHVKlsfAGTEAGIEAREiPRLGYRLHLLSVRglKRGRSLGALVDNLGVLADFIGAVRSALAI 91
+ 79****************************88779999999999999999999999995533444445677788899************ PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + +++pdvvvg+gg+v++++l+aa +g ++ + Eqn+ pg+++kll+ +a ++
+ sp|A1BJX8|MURG_CHLPD 92 INSESPDVVVGTGGFVSAPLLLAAQMRGKKTLIQEQNAFPGVTTKLLSLFASEIH 146
+ ***********************************************99988766 PP
+
+>> sp|A1AWE8|MURG_RUTMC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.6 0.0 6.4e-25 3.6e-22 1 137 [. 5 141 .. 5 143 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 83.6 bits; conditional E-value: 6.4e-25
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++++gGT+G+++Pa+A+a+eL++ ++ l++ g+e+++ ++++++ +++++ +l+ k ++ +k l+ a+ +++ i+ ++
+ sp|A1AWE8|MURG_RUTMC 5 ILIMAGGTGGHIFPALAIANELKNHSTHIQwLGSNVGIENEIvPKHNIKLHTVNSV-GLRGKS-VVSLIKALFLLSYATLQIMGIFLKF 91
+ 689***********************9999**************************.*****9.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kp++v+g+gg+ ++ ++ a +ip++++Eqn+i g +nk+l++ a++
+ sp|A1AWE8|MURG_RUTMC 92 KPNIVLGMGGFTSGIGGLVACIFRIPLVIHEQNSISGTTNKILNKIAKKT 141
+ *********************************************99986 PP
+
+>> sp|A1CFB3|ATG26_ASPCL Sterol 3-beta-glucosyltransferase OS=Aspergillus clavatus GN=atg26 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.7 0.0 5.7e-25 3.2e-22 4 138 .. 913 1044 .. 910 1045 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 83.7 bits; conditional E-value: 5.7e-25
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ +++G+rGdv+P++Al ++L ++Gh+ ++at+ ++e++v+ +g+++ p+++d v++ +++++lke+ ++ +
+ sp|A1CFB3|ATG26_ASPCL 913 LTIGSRGDVQPYIALCKGLLAEGHKPKIATHAEFEPWVRRHGIDFAPVDGDpaelmricVENGM--FTYSFLKEASQK-------F 989
+ 79**************************************************999884444444..889999999888.......8 PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + ++ ++ +++++++ ++li++++a++ +++aE++ ip+++++++p+ +++++
+ sp|A1CFB3|ATG26_ASPCL 990 RGWIDDL--LSSAWASCQDSDLLIESPSAMAGIHIAEALRIPYFRAFTMPWSRTRAY 1044
+ 8888888..666778889**********************************99987 PP
+
+>> sp|B8IN64|MURG_METNO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.1 1.4 8.9e-25 5e-22 1 135 [. 8 141 .. 8 145 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 83.1 bits; conditional E-value: 8.9e-25
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S----.--.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwa.kleslktlkelaeglkalrkakeilkea 87
+ v+la+gGT+G+++Pa Ala +L++rG++V lat ++e+ e e+v+i++ ++ + l ++l++l + ++ +a +++++
+ sp|B8IN64|MURG_METNO 8 VLLAAGGTGGHLFPAEALALRLRERGIRVVLATDSRVETLSgEFPASEIVSIPSATPSGRsPLARGAALVTLGR---GFAAALRVVRRL 93
+ 79***************************************999999999999995555504444555555555...5*********** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +p+v vgfggy +++l+aa +++p+ ++Eqn+++g +n +l+r a+
+ sp|B8IN64|MURG_METNO 94 NPAVAVGFGGYPTVPPLLAAQMLRVPTLLHEQNAVMGRANAFLARGAT 141
+ ******************************************999876 PP
+
+>> sp|Q6G124|MURG_BARQU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.1 0.2 9e-25 5.1e-22 1 135 [. 7 140 .. 7 143 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 83.1 bits; conditional E-value: 9e-25
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavp.igpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +vl++gGT+G+++Pa A+a+eL++rG++V+l+t ++ + fv e+ + + ++ ++ ++ +k+ + lk++ ++ +++ + +
+ sp|Q6G124|MURG_BARQU 7 IVLVAGGTGGHLFPAEAVAVELRQRGYDVHLVTDRRAKCFVSCVDEEHTHiVSSA-TFTRRH-PFALIKTCWILLKGMGQSLALFYKLR 93
+ 79***************************************55555555515555.666655.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ p +v gfggy ++l+ a+l + +++++Eqn+i+g +n++l+ ++
+ sp|Q6G124|MURG_BARQU 94 PVLVGGFGGYPTFPPLLVAALMRCVTFIHEQNAIMGRANRVLAVFVH 140
+ *****************************************998876 PP
+
+>> sp|Q2W0H3|MURG_MAGSA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.1 1.1 8.8e-25 5e-22 1 138 [. 8 144 .. 8 145 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 83.1 bits; conditional E-value: 8.8e-25
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++la+gGT+G+v+Pa Ala L +rG++ l+t ++ ++ + +le+ i ++ + + ++ +l++l++++e + +l +a+ il + +
+ sp|Q2W0H3|MURG_MAGSA 8 IALAAGGTGGHVFPAEALASVLLDRGYRLALITDKRGAAYGgTLGKLETFRISAG-GIAGRG-KLSALRSALELGLGLIQARSILGRIR 94
+ 79****************************9999999999989999*********.999999.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p++v+gfggy++++ ++aa+lagip+ ++Eqn++ g +n+ll+ ++ +++
+ sp|Q2W0H3|MURG_MAGSA 95 PAAVIGFGGYASVPGMGAAALAGIPTAIHEQNAVLGRANRLLAGHVRRIA 144
+ ******************************************99988875 PP
+
+>> sp|Q0CKU4|ATG26_ASPTN Sterol 3-beta-glucosyltransferase OS=Aspergillus terreus (strain NIH 2624 / FGSC A1156) GN=atg
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 83.0 0.0 9.4e-25 5.3e-22 4 138 .. 903 1034 .. 900 1035 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 83.0 bits; conditional E-value: 9.4e-25
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ +++G+rGdv+P++Al ++L ++Gh+ ++at+ ++e++++++g+++ p+++d v++ +++++lke+ + +
+ sp|Q0CKU4|ATG26_ASPTN 903 LTIGSRGDVQPYIALCKGLLAEGHRPKIATHAEFEPWIRKHGIDFAPVEGDpaelmricVENGM--FTYSFLKEASMK-------F 979
+ 79**************************************************999994444444..899999999999.......8 PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + ++ ++ ++++ ++li++++a++ +++aE++ ip+++++++p+++++++
+ sp|Q0CKU4|ATG26_ASPTN 980 RGWIDDLLS--SAWRSCQDSDLLIESPSAMAGIHIAEALRIPYFRAFTMPWTRTRAY 1034
+ 888888855..555666999*********************************9987 PP
+
+>> sp|B1ZU31|MURG_OPITP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 82.9 0.2 1e-24 5.6e-22 1 138 [. 4 141 .. 4 142 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 82.9 bits; conditional E-value: 1e-24
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G++ P +Ala++Lq+rGh Vr l++++++++++ + l++ +++ ++ + ++ + + + ++l + +++
+ sp|B1ZU31|MURG_OPITP 4 FLISCGGTGGHLSPGIALAEGLQARGHSVRlLISHKKVDARLiaKYPRLDFTRVPGT-GFSL--HPVRLARFIGTQSRGLWFCRGLVRA 89
+ 7899**************************************9444579*******9.8877..99999999999999*********** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ a+p+ vv+fgg+ ++ +++aa+++g+p+ ++E+n +pg + ++l+r+an+v+
+ sp|B1ZU31|MURG_OPITP 90 ARPAGVVAFGGFTSAGVVLAARWRGVPVALHEANRVPGRAIRVLSRFANRVY 141
+ **************************************************98 PP
+
+>> sp|A6L071|MURG_BACV8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 82.9 0.0 1e-24 5.6e-22 1 136 [. 7 144 .. 7 147 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 82.9 bits; conditional E-value: 1e-24
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pav++a++ +++ +e + ++++ ++e + ++ag++++ +++ ++ +k lk+++ l++ k+ a++i+k
+ sp|A6L071|MURG_BACV8 7 IIISGGGTGGHIFPAVSIANAIKEQHPEAEilfVGAEGRMEMQRvPAAGYPIKGLPVA-GFDRKN-LLKNVSVLFKLVKSQLLARKIIK 93
+ 6899************************************98766*************.****99.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ ++kp++ vg+ggy++++ l a gip+ + Eqn+ +g++nkll+++a +
+ sp|A6L071|MURG_BACV8 94 DFKPHAAVGVGGYASGPTLKMAGMMGIPTLIQEQNSYAGVTNKLLAKKACK 144
+ *********************************************999866 PP
+
+>> sp|Q1QNU3|MURG_NITHX UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 82.7 0.2 1.2e-24 6.6e-22 1 138 [. 7 143 .. 7 144 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 82.7 bits; conditional E-value: 1.2e-24
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE....----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavp....igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++la+gGT+G+++Pa Al++eL++r+ +Vrl+t + + +gl + ++++ +++ + l+ ++ + ++ a +++
+ sp|Q1QNU3|MURG_NITHX 7 ILLAAGGTGGHLFPAEALGVELMKRDLRVRLVTDSRALRY---SGLFSKDmtdvVPSE-TVRGRS-PLALARTGLMLATGTVVALNLMR 90
+ 79****************************9999887777...455444422225555.556655.77777777777788999999*** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + kp++v+gfggy +++liaa+l gip++++++n+++g +n+ll+rr+n ++
+ sp|Q1QNU3|MURG_NITHX 91 RLKPAAVIGFGGYPTLPPLIAARLKGIPTVIHDANAVMGRANRLLSRRVNAIA 143
+ **************************************************986 PP
+
+>> sp|B2V7Y8|MURG_SULSY UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 82.1 0.0 1.8e-24 1e-21 1 139 [] 4 141 .. 4 141 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 82.1 bits; conditional E-value: 1.8e-24
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ v ++ggGT+G+++Pa+++a+ L+++G ++ ++t++g+e++ ++++ ++ + ++ k ++++ +++ l +++k+ + +k+
+ sp|B2V7Y8|MURG_SULSY 4 VFISGGGTGGHFYPALSVAENLKEKGFSITyIGTTNGIENKKdfPADEKIL--YPMR-AVRGKS-IVGKIQGVFSLLSTTFKVYKQIKK 88
+ 5789***********************************996444444444..5555.557777.99********************** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ +kpd ++ fggy + ++++a+ la++p++++Eqn+ip +nk+l+ +a++v++
+ sp|B2V7Y8|MURG_SULSY 89 EKPDFSICFGGYTSIPLGLASFLARVPLYIHEQNSIPSYSNKILSYFAKKVFI 141
+ *************************************************9985 PP
+
+>> sp|Q3AGT7|MURG_SYNSC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 82.1 0.1 1.9e-24 1e-21 2 138 .. 5 138 .. 4 139 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 82.1 bits; conditional E-value: 1.9e-24
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++a+ GT+G+++Pa+A+a+++ + V +++p++le+++ e gl v g+ + + lk+l++l++ l a +++++++++
+ sp|Q3AGT7|MURG_SYNSC 5 LIAASGTGGHLFPALAVAEAVEDLW-LVSwVGVPDRLETQLvpERFGLVCVNAGGL---QG--RGLKKLLQLLRLLLASVSVRRAIRRN 87
+ 799******************9996.8889**********9888889888666555...66..5699********************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +d+v+ +ggy+a++a++aa+++ ip++++E+n+ipg v++ll r++ v+
+ sp|Q3AGT7|MURG_SYNSC 88 AIDAVFTTGGYIAAPAILAARWCCIPVVLHESNAIPGRVTRLLGRFCSAVA 138
+ ********************************************9998876 PP
+
+>> sp|Q5B4C9|ATG26_EMENI Sterol 3-beta-glucosyltransferase OS=Emericella nidulans GN=atg26 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 82.1 0.0 1.8e-24 1e-21 4 138 .. 901 1032 .. 898 1033 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 82.1 bits; conditional E-value: 1.8e-24
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----......S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd......vklwakleslktlkelaeglkalrkakei 83
+ +++G+rGdv+P++Al ++L ++Gh+ ++at+ ++e++v+++g+++ p+++d +++ + ++++++lke+ ++ ++
+ sp|Q5B4C9|ATG26_EMENI 901 LTIGSRGDVQPYIALCKGLLAEGHKPKIATHAEFEPWVRKHGIDFAPVDGDpaelmrLCVENGMFTYSFLKEATAK-------FRG 979
+ 79**************************************************888884444444788888888888.......999 PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + ++ ++++ ++ ++li++++a++ +++aE++ ip+++ +++p+ +++++
+ sp|Q5B4C9|ATG26_EMENI 980 WIDDLLSSAWRAC--QDSDLLIESPSAMAGIHIAEALRIPYFRGFTMPWSRTRAY 1032
+ 9999977777776..8999*******************************99987 PP
+
+>> sp|A5GW69|MURG_SYNR3 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 81.7 0.0 2.5e-24 1.4e-21 2 138 .. 5 138 .. 4 139 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 81.7 bits; conditional E-value: 2.5e-24
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+a++ + + Vr l++p++le+++ + ++ ++ ++ +l+ + l++lk+l + l++ ++++++++++
+ sp|A5GW69|MURG_SYNR3 5 LIAASGTGGHLFPALAVADRMPET-WSVRwLGVPDRLERQLVPSRYPLFTVRAG-GLQG--RGLRKLKQLIQLLWSAWPVTRLIRKQEC 89
+ 799*****************9876.7***************7777777788888.7888..6699999999999999999********* PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +vv+ +ggy+a++a++aa+l++ p++++E+n+ipg v++l+ r++ +v+
+ sp|A5GW69|MURG_SYNR3 90 AVVFTTGGYIAAPAILAARLCRRPVVLHESNAIPGQVTRLFGRFCSRVA 138
+ ********************************************99986 PP
+
+>> sp|A4YZK3|MURG_BRASO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 82.6 0.6 1.3e-24 7.4e-22 1 138 [. 8 144 .. 8 145 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 82.6 bits; conditional E-value: 1.3e-24
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++la+gGT+G+++Pa Al++eL +rG++Vrl+t + + +++ +++vp ++ +++ ++ ++++ + ++ +a+ ++++
+ sp|A4YZK3|MURG_BRASO 8 ILLAAGGTGGHLFPAEALGVELIKRGYRVRLVTDARALKYSglfTKDMIDVVPSETV---RSRS-PVALARTALLLGTGTLAAFNLMRR 92
+ 79****************************999988776643346666666555544...6655.8999999999999*********** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kp++v+gfggy +++l+aa+lag+p ++++n++ g +n++l+ +++ ++
+ sp|A4YZK3|MURG_BRASO 93 LKPAAVIGFGGYPTVPPLLAARLAGVPSLIHDANAVLGRANRFLSAHVKAIA 144
+ *********************************************9998875 PP
+
+>> sp|Q2RVU4|MURG_RHORT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 82.5 1.3 1.3e-24 7.6e-22 1 136 [. 19 153 .. 19 156 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 82.5 bits; conditional E-value: 1.3e-24
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++la+gGT+G+v+Pa Ala eL rrGh+ +l+t ++ + l+++ i ++ +++ ++ ++ l+ e + +a +l++ +
+ sp|Q2RVU4|MURG_RHORT 19 IALAAGGTGGHVFPAEALAGELIRRGHKLTLITDKRGHVYGgTLGLLDTKRILAG-GVAGRG-VIGRLRGMIELAMGSLQAYGLLRRLR 105
+ 79****************************8887777766657777899998888.777777.77777777777777************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ pdvvvgfggy++++ ++aa++++ p++v+Eqn++pg +n+ll+ r+ +
+ sp|Q2RVU4|MURG_RHORT 106 PDVVVGFGGYASVPTMLAAIRLKLPTVVHEQNAVPGRANRLLAARVSR 153
+ ******************************************999876 PP
+
+>> sp|Q2JW21|MURG_SYNJA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 81.3 0.1 3.1e-24 1.8e-21 2 138 .. 15 147 .. 14 148 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 81.3 bits; conditional E-value: 3.1e-24
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+ ++L + + + l++p +le+++ + ++ + ++ +w+ +++l +l + +a+ ++++il++ +
+ sp|Q2JW21|MURG_SYNJA 15 LVAASGTGGHIFPALAVVEQLPTWQI--EwLGVPQRLEAKLVPDRYPLHRVAMS--GWQG-SPWQKLGSLVQLARATLQVRQILASGQF 98
+ 799*******************9775..55***********9999999999999..5554.59************************** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ dvv+ +ggy+a++ ++aa+++g+p+ ++E+n +pg+v+++l r++ v+
+ sp|Q2JW21|MURG_SYNJA 99 DVVLTTGGYIAAPTILAARSLGVPVLLHESNCLPGKVTRWLGRFCRLVA 147
+ ******************************************9998775 PP
+
+>> sp|A5EPK4|MURG_BRASB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 82.4 0.6 1.4e-24 8e-22 1 138 [. 8 144 .. 8 145 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 82.4 bits; conditional E-value: 1.4e-24
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++la+gGT+G+++Pa Al++eL +rG++Vrl+t + + +++ +++vp ++ +++ ++ ++++ + ++ +a+ ++++
+ sp|A5EPK4|MURG_BRASB 8 ILLAAGGTGGHLFPAEALGVELIKRGYRVRLVTDARALRYSglfTKDMIDVVPSETV---RSRS-PVALARTALLLGTGTLAAFNLMRR 92
+ 79****************************999988766533346666666555555...6655.8999999999999*********** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kp++v+gfggy +++l+aa+lag+p ++++n++ g +n++l+ +++ ++
+ sp|A5EPK4|MURG_BRASB 93 LKPAAVIGFGGYPTVPPLLAARLAGVPSLIHDANAVLGRANRFLSAHVKAIA 144
+ *********************************************9998875 PP
+
+>> sp|A7KAN4|ATG26_PENCW Sterol 3-beta-glucosyltransferase OS=Penicillium chrysogenum (strain ATCC 28089 / DSM 1075 / W
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 81.3 0.0 3.1e-24 1.8e-21 4 138 .. 889 1020 .. 886 1021 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 81.3 bits; conditional E-value: 3.1e-24
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ +++G+rGdv+P++Al ++L ++Gh+ ++at+ ++e++++++g+++ p+++d v++ +++++l+e+ + +
+ sp|A7KAN4|ATG26_PENCW 889 LTIGSRGDVQPYIALCKGLLAEGHKPKIATHAEFEPWIRKHGIDFAPVDGDpaelmricVENGM--FTYSFLREASLK-------F 965
+ 79**************************************************888884444444..888888888888.......8 PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + ++ ++ ++ g++ ++li++++a++ +++aE++ ip+++ +++p+++++++
+ sp|A7KAN4|ATG26_PENCW 966 RGWIDDL--LSSAWIGCQGSDLLIESPSAMAGIHIAEALRIPYFRGFTMPWTRTRAY 1020
+ 8888877..78889***************************************9987 PP
+
+>> sp|Q2JJR4|MURG_SYNJB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 80.8 0.1 4.7e-24 2.7e-21 2 136 .. 15 145 .. 14 148 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 80.8 bits; conditional E-value: 4.7e-24
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+a++L + ++++ l++p+++e ++ + ++ + + +w+ l+ l la+ +a+ +++++l + +
+ sp|Q2JJR4|MURG_SYNJB 15 LVAASGTGGHIFPALAVAEQLPD--WQIEwLGVPDRMEGKLVRERYPLHRVVMS--GWQGS-PLHRLQALAQLARATLQVRRLLMSGRF 98
+ 799******************96..55667***********8888999998888..45545.9999*********************** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ d+v+ +ggy+a++a++aa+++g+p+ ++E+n ipg+v+++l r++
+ sp|Q2JJR4|MURG_SYNJB 99 DIVLTTGGYIAAPAILAARSLGVPVLLHESNWIPGKVTRWLGRFCQV 145
+ *****************************************998865 PP
+
+>> sp|A2QNQ5|ATG26_ASPNC Sterol 3-beta-glucosyltransferase OS=Aspergillus niger (strain CBS 513.88 / FGSC A1513) GN=atg
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 81.0 0.0 3.9e-24 2.2e-21 4 138 .. 902 1033 .. 899 1034 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 81.0 bits; conditional E-value: 3.9e-24
+ E-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkak 81
+ +++G+rGdv+P++Al ++L ++Gh+ ++at+ ++e++v+++g+++ +++d v++ ++++++ke+ ++ +
+ sp|A2QNQ5|ATG26_ASPNC 902 LTIGSRGDVQPYIALCKGLLAEGHRPKIATHAEFEPWVRKHGIDFALVDGDpaelmricVENGM--FTYSFFKEATAK-------F 978
+ 79**************************************************999995555555..899999999999.......9 PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + + ++ ++++ +++++li++++a++ +++aE++ ip+++++++p+ +++++
+ sp|A2QNQ5|ATG26_ASPNC 979 RGWIDDLLSSAWKAC--QDTDLLIESPSAMAGIHIAEALRIPYFRAFTMPWSRTRAY 1033
+ 999999966666665..9**********************************99987 PP
+
+>> sp|Q0AMW7|MURG_MARMM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 80.8 1.6 4.6e-24 2.6e-21 1 134 [. 6 138 .. 6 142 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 80.8 bits; conditional E-value: 4.6e-24
+ EEEE-------HHHHHHHHHHHHH---EEEEEET.GGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatp.pgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ +++a+gGT+G+++Pa A a++L +rG++Vrl+t +gl++ + +++ +i + + + + lk + ++e +++ +a+ i+ ++k
+ sp|Q0AMW7|MURG_MARMM 6 CLIAAGGTGGHMFPARAAAEALIARGWQVRLVTDaRGLRHATDFPAVAVDEIHAASPSTK--NPLKLARAALELTQGFAQARSIVGKWK 92
+ 689***************************776615666666777777777888844444..69999999999999************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprra 134
+ pdv++gfggy a +al a++ gi+ ++Eqn++ g vn++++ +a
+ sp|Q0AMW7|MURG_MARMM 93 PDVIAGFGGYPAFPALAVARSMGIAFAIHEQNAVLGRVNRVFAAKA 138
+ *****************************************98776 PP
+
+>> sp|Q812Y1|MURG3_BACCR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 79.8 0.0 9.2e-24 5.2e-21 1 135 [. 5 137 .. 5 140 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 79.8 bits; conditional E-value: 9.2e-24
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggGT+G+v + l ++ ++G++V+ +++++g+e+ + +++++ ++ ++ kl++++ ++++k++++ ++ ++ ++k+
+ sp|Q812Y1|MURG3_BACCR 5 ILFTGGGTAGHVMINIVLIPKFIEKGWRVEyIGSKNGIEKSL-VQNVKYNSVSTG-KLRRYW-DWDNFKDPFKIIRGCLQSYNLIKKT 89
+ 79***************************************6.456777778888.89****.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ kpdv++++gg+v++++ i+a+l+++p+++ E ++ gl+nk+ +a+
+ sp|Q812Y1|MURG3_BACCR 90 KPDVIFSAGGFVSVPVAIGAWLNRVPIIIREPDSTLGLANKIALPFAT 137
+ *****************************************9877666 PP
+
+>> sp|B4SH49|MURG_PELPB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 80.2 1.5 7.1e-24 4e-21 1 138 [. 3 146 .. 3 147 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 80.2 bits; conditional E-value: 7.1e-24
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----..S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpd..vklwakleslktlkelaeglkalrkakei 83
+ v++aggGT+G+++Pa+A+a eL++ ++V ++t+ g+e++ + g+ + i+++ +++a + ++++ +a++ al +a ++
+ sp|B4SH49|MURG_PELPB 3 VLFAGGGTGGHLYPAIAMAGELRKLVPDVVisfVGTTGGIEATEvPRLGYRLHLIPVRglKRGRALADIVANIGVIADFVAALGRAAAL 91
+ 79***************************************9988*********999977667777799******************** PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ ++++ pdvvvg+gg+v++++l+aa l + ++ + Eqn+ pg+++kll+ a v+
+ sp|B4SH49|MURG_PELPB 92 IAREAPDVVVGTGGFVSAPLLLAAQLMRKKTLIQEQNAFPGVTTKLLAALASEVH 146
+ *********************************************9988777665 PP
+
+>> sp|B4S6Q9|MURG_PROA2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 80.1 0.4 7.7e-24 4.3e-21 1 138 [. 3 146 .. 3 147 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 80.1 bits; conditional E-value: 7.7e-24
+ EEEE-------HHHHHHHHHHHHH-..--EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCS...HHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrr..GheVr.latppgleefv.eeagleavpigpdvklwakleslktlke...laeglkalrkake 82
+ +++aggGT+G+++PavA+a++L + G V ++t++g+e++ + g+ + ++++ ++++ + ++++l + l+++ +a+ ka
+ sp|B4S6Q9|MURG_PROA2 3 ILFAGGGTGGHLYPAVAMAERLEQLypGTTVAfVGTERGIEATEiPRLGYRLHLLDVR-GFRRGFSFSDMLNNagvLLDFVRAVVKAAG 90
+ 79*********************983455555*********9999*************.99999855544444333789999******* PP
+
+ HHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 83 ilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ i++ ++pdvvvg+gg+v++++l aa l g ++ + Eqn+ pg+++++l+ +a+ v+
+ sp|B4S6Q9|MURG_PROA2 91 IIRAEQPDVVVGTGGFVSGPLLAAAELMGRKTLIQEQNAFPGVTTRFLAAFATEVH 146
+ ****************************************************9997 PP
+
+>> sp|A8G2K3|MURG_PROM2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 80.0 0.0 7.8e-24 4.4e-21 2 135 .. 8 137 .. 7 141 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 80.0 bits; conditional E-value: 7.8e-24
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+ +e+ ++ ++++ l+++ +l++ + ++++ +++ ++++ ++ ++ + + e++ ++++ +ilke+k+
+ sp|A8G2K3|MURG_PROM2 8 LVAASGTGGHIFPALAVSKEVEDK-WNIHwLGVKQRLDSNLIPKKYNLRTLSIKTPRKN-IFLFYQYIEILMS---TFQIIRILKEKKI 91
+ 799******************887.6999************666777777777733444.4455555555555...8************ PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ ++v+ +ggy++++ +ia+++++ip++++E+n ipg+v+k++ +n
+ sp|A8G2K3|MURG_PROM2 92 NLVFTTGGYISAPTIIASKFLRIPVIIHESNLIPGMVTKYFGFLCN 137
+ ***************************************9976665 PP
+
+>> sp|Q89FU7|MURG_BRAJA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 79.6 0.2 1e-23 5.9e-21 1 137 [. 7 142 .. 7 144 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 79.6 bits; conditional E-value: 1e-23
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++la+gGT+G+++Pa Al++eL rrG +Vrl+t ++ + ++ +++v+ ++ ++++ ++ + ++la+g + +a ++k+
+ sp|Q89FU7|MURG_BRAJA 7 ILLAAGGTGGHLFPAEALGVELIRRGFRVRLVTDERALRYSglfSKDMIDVVSSETA-RGRNPFQVAYAGLTLAAG---TLSAYSLIKR 91
+ 79****************************999998766533357888888887777.888888777777888888...********** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kp +vvgfggy +++l+aa++ag+p +++++n++ g +n++l+ r+ +
+ sp|Q89FU7|MURG_BRAJA 92 LKPVAVVGFGGYPTLPPLVAAKFAGVPGIIHDANAVLGRANRFLSSRVRAI 142
+ ***********************************************9876 PP
+
+>> sp|A0RHC3|MURG1_BACAH UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylgl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 79.2 0.0 1.5e-23 8.3e-21 1 130 [. 5 132 .. 5 138 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 79.2 bits; conditional E-value: 1.5e-23
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggGT+G+v + l +++ +G+ V+ +++++g+e+ +++++ +i ++ kl++++ ++++k++++ k+ ++ +++k+
+ sp|A0RHC3|MURG1_BACAH 5 ILFTGGGTAGHVMINMVLIPKFMGKGWGVEyIGSQNGIEKL-LVQNVKYNSISTG-KLRRYW-DWENFKDPFKIIKGCIQSYKLMKRI 89
+ 79***********************************9999.566788999****.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ kpdv++++gg+v+++++i+a+ +++p+++ E ++ gl+nk+
+ sp|A0RHC3|MURG1_BACAH 90 KPDVIFSAGGFVSVPVVIGAWMNKVPVIIREPDSTLGLANKIA 132
+ ****************************************985 PP
+
+>> sp|Q6MBS7|MURG_PARUW UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 79.2 0.0 1.5e-23 8.3e-21 1 135 [. 5 140 .. 5 144 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 79.2 bits; conditional E-value: 1.5e-23
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+++Pa la+eL ++ + l + gl + + +++++ + +l +k +k lk +++ l+++ ++ +i+++
+ sp|Q6MBS7|MURG_PARUW 5 FMITAGGTGGHIFPAQGLAQELIKKTYSSSiLFVAGGLSTNKyfDRSIFPFQEVSAS-PLFSKN-PFKLLKGVFNLLRGVWQSIRIIRK 91
+ 789***********************9998855555554443367777777777777.555555.9*********************** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +kpdvvvgfg+y+ +++l+aa+ ++ip++++E+n+ipg++nk+l+ a
+ sp|Q6MBS7|MURG_PARUW 92 FKPDVVVGFGSYYTVPPLLAAKILRIPIVLHEANSIPGKANKWLASMAW 140
+ *******************************************987765 PP
+
+>> sp|Q0BXU2|MURG_HYPNA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 78.9 0.5 1.7e-23 9.7e-21 1 138 [. 10 146 .. 10 147 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 78.9 bits; conditional E-value: 1.7e-23
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE.----S-.-----.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavp.igpdvk.lwakleslktlkelaeglkalrkakeilkea 87
+ v++a+gGT+G+++Pa A+a+e ++rG++ l++ + + + + ++ i++ + +++ ++ + +++ + ++ +a++++k++
+ sp|Q0BXU2|MURG_HYPNA 10 VIIAAGGTGGHMFPARAFADEMRARGWNTALISDSRGLRYAADFPADWKEeIEAASPnFRKP---WTVPGAALKINAGIARARRLMKQH 95
+ 689***************************77666555555555555444455443305554...5566666666666*********** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +p++v+gfggy a +al aa+++g+p++++Eqn++ g vn+ ++++a v+
+ sp|Q0BXU2|MURG_HYPNA 96 RPALVAGFGGYPAFPALAAARRLGVPIIIHEQNAVLGRVNRQFAKHAQLVA 146
+ ********************************************9998875 PP
+
+>> sp|Q8KGD4|MURG_CHLTE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 79.3 0.3 1.3e-23 7.5e-21 1 138 [. 3 146 .. 3 147 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 79.3 bits; conditional E-value: 1.3e-23
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCS....HHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlke....laeglkalrkak 81
+ v++aggGT+G+++P vA+a eL++r + + +t+ g+e++ + g+ v +++ +l++ l s+++l+e l ++ k+l a+
+ sp|Q8KGD4|MURG_CHLTE 3 VLFAGGGTGGHLYPGVAMAAELKKRVPGISisfAGTSAGIEATEvPRLGYRLVLFPVR-GLKRGL-SIRALVEnaliLGDFAKSLSMAM 89
+ 79***********************999997788999***99888*************.777776.55555442222778889999*** PP
+
+ HHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++++++pdvvvg+ggyv++++l+aa l+g ++ + Eqn+ pg++++ll+r a+ v+
+ sp|Q8KGD4|MURG_CHLTE 90 ALVRKEQPDVVVGTGGYVSAPLLLAAQLSGKKTLIQEQNAFPGVTTRLLARMATEVH 146
+ *****************************************************9987 PP
+
+>> sp|B3QLW4|MURG_CHLP8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 79.3 0.1 1.4e-23 7.7e-21 1 138 [. 3 146 .. 3 147 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 79.3 bits; conditional E-value: 1.4e-23
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----.....S------.-HHHCCSHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpd.....vklwakleslktlkelaeglkalrka 80
+ v++aggGT+G+++P vA+a eL++ + V+ +tp g+e++ + g++ + ++++ l+ + +++ l +++ +l +a
+ sp|B3QLW4|MURG_CHLP8 3 VLFAGGGTGGHLYPGVAMASELKKVVPGVEisfAGTPAGIEATEvPRLGYPLHLLPVRglkrgRSLR---DLAANVGVLKDFGSSLMQA 88
+ 79***********************9999988889*****99988*************754443333...344555666677777**** PP
+
+ HHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 81 keilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + i+++++p+vvvg+ggyv++++l+aa l+g ++ + Eqn+ pg++++ l+r a v+
+ sp|B3QLW4|MURG_CHLP8 89 FSIIRKETPNVVVGTGGYVSAPLLLAAQLSGCKTLIQEQNAFPGVTTRMLARMASEVH 146
+ ***************************************************9998887 PP
+
+>> sp|A6T2F8|MURG_JANMA UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 78.7 0.1 2e-23 1.1e-20 2 138 .. 5 141 .. 4 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 78.7 bits; conditional E-value: 2e-23
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ v+++ GT+G+++P +A+a++ ++rG++V l+t+ g+e+++ ++ag+e+ i+ +l+ k+ +t++ +++ ++ + ilk+ +
+ sp|A6T2F8|MURG_JANMA 5 VIMAAGTGGHIFPGLAIAETMKARGWQVSwLGTSHGMERELvPKAGVEMDIIEFS-GLRGKG-LQHTITGAFKLVASFATCFSILKRRN 91
+ 7899***************************************************.******.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p +v+g+ggyv ++ + a+l+g+p+++ ++++ +l+nk+l+ a++vl
+ sp|A6T2F8|MURG_JANMA 92 PGIVLGMGGYVTVPGGWMAKLRGVPVVLVNADAALLLSNKTLMPVAERVL 141
+ ******************************************99998886 PP
+
+>> sp|A5CEL6|MURG_ORITB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 78.5 0.0 2.4e-23 1.4e-20 1 138 [. 4 140 .. 4 141 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 78.5 bits; conditional E-value: 2.4e-23
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavp.igpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ + l+ggGT+G+++Pa+Al++eLq+rG++V l+t ++e+ + + +++++ i v + +k+l + l a ++++ +++
+ sp|A5CEL6|MURG_ORITB 4 IFLVGGGTGGHLFPAIALGEELQERGYNVYLITDTRCEKYLLNFNYSFKIhIMNMVSISN--TGIKKLYAYIRILAACITGFKLVYSNS 90
+ 679*********************************************764222245556..45777777777788899999******* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p ++v+fggy ++++i+ +l +ip +++Eqn++ gl+n+l+ r+a+ +
+ sp|A5CEL6|MURG_ORITB 91 PSLIVAFGGYTIAPIIINGILFRIPFILHEQNSVLGLANRLFLRYAKAIT 140
+ **********************************************9875 PP
+
+>> sp|Q8D2Z6|MURG_WIGBR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 78.6 0.0 2.2e-23 1.2e-20 1 133 [. 8 140 .. 8 146 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 78.6 bits; conditional E-value: 2.2e-23
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++++ggG++G+v+ +++a++L + G e+ +++++++e+ + +++++++++i++ +++ + + +l +l + ++ k+k+++k +
+ sp|Q8D2Z6|MURG_WIGBR 8 IIITGGGSGGHVFVGLSIAEQLIKIGCEILwIGSSDRIESYLiPKSNIKIYKINVI-GFNGNN-IFLKLISLIKTAYSILKIKKLIKYY 94
+ 689****************************************************9.999988.999999999999************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprr 133
+ kpd+v+++ggyv+ + ia++ +++p++++Eqn++pgl+n +l +
+ sp|Q8D2Z6|MURG_WIGBR 95 KPDIVLSIGGYVSFPGAIATWISKVPLIIHEQNSVPGLSNYILYKL 140
+ ****************************************988765 PP
+
+>> sp|B0UFC7|MURG_METS4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 77.7 1.0 4.2e-23 2.4e-20 1 134 [. 8 140 .. 8 145 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 77.7 bits; conditional E-value: 4.2e-23
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ v+la+gGT+G+++Pa Ala +L++rG++V la+ ++e+ e+v+i++ ++ + l+ ++ ++++ +a +++++ +
+ sp|B0UFC7|MURG_METS4 8 VLLAAGGTGGHLFPAEALALRLRDRGIRVVLASDGRVEALSgGFPASEIVSIPSATPSGR--SPLARGAAFLTLGRGFAAAIRAVRRLN 94
+ 79***********************************99976555556666777755555..445555555555566************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprra 134
+ p+vvvgfggy +++l+aa +++p+ ++Eqn+++g +n +l+r a
+ sp|B0UFC7|MURG_METS4 95 PAVVVGFGGYPTVPPLLAAQMLRVPTLLHEQNAVMGRANGFLARGA 140
+ ***************************************9998765 PP
+
+>> sp|Q163J0|MURG_ROSDO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 77.8 0.5 3.9e-23 2.2e-20 2 137 .. 2 137 .. 1 139 [. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 77.8 bits; conditional E-value: 3.9e-23
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++a+gGT+G+++Pa Ala++ +rG++V+l t + ++ + + ++++i + ++++ + ++++ +++ + ++ +a ++++++
+ sp|Q163J0|MURG_ROSDO 2 LIAAGGTGGHMFPAQALAEAMLNRGWRVKLTTDARGARYTggFPHSTQIEEISSA-TFARGG-IAAKIVAPFKIGAGVLRALLSFRRDR 88
+ 79*********************************9999977778889999****.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p+vvvgfggy +al aa l + p+ ++Eqng+ g vn +++ r++ +
+ sp|Q163J0|MURG_ROSDO 89 PAVVVGFGGYPTIPALAAAFLMKLPRMIHEQNGVLGRVNTAFASRVDAI 137
+ *********************************************9987 PP
+
+>> sp|A4G8T8|MURG_HERAR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 77.0 0.1 6.9e-23 3.9e-20 2 138 .. 5 141 .. 4 142 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 77.0 bits; conditional E-value: 6.9e-23
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++ GT+G+++P +A+a++ q+rG+eV+ l+t+ g+e+ + +++g+++ +i +l+ k+ +t++ +++ l ++ + il++ k
+ sp|A4G8T8|MURG_HERAR 5 LIMAAGTGGHIFPGLAIADTMQARGWEVTwLGTEHGMERDLvPKSGIAMDTISFA-GLRGKG-LRHTVTGVLRLLASFGTCFSILARRK 91
+ 68999***********************************99*************.******.9************************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p vv+g+ggyv ++ + a+l+g+p+++ ++++ +l+nk+l a +vl
+ sp|A4G8T8|MURG_HERAR 92 PGVVLGMGGYVTVPGGWMAKLRGVPLVLLNADAALLLSNKALTPIAQRVL 141
+ ****************************************9999888876 PP
+
+>> sp|Q28NN5|MURG_JANSC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 77.6 1.1 4.4e-23 2.5e-20 2 137 .. 7 142 .. 6 144 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 77.6 bits; conditional E-value: 4.4e-23
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++a+gGT+G+++Pa Al ++ r+G++V+l t + ++ v ++ +e++++ + ++ + + l++l +++ + ++ a++ + ++k
+ sp|Q28NN5|MURG_JANSC 7 IIAAGGTGGHMFPAQALSEAMLRKGWRVTLSTDARGARYVggFSHAVEIREVSSA-TFTRGG-ALAKLAVPFRIFGGVLTATARMLREK 93
+ 689*************************************999************.****99.************************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pdvvvgfggy +a+ aa+l g p+ ++Eqng+ g vn+++++++ v
+ sp|Q28NN5|MURG_JANSC 94 PDVVVGFGGYPTIPAMAAARLTGRPRMLHEQNGVLGRVNRVFAKHVAHV 142
+ *******************************************998766 PP
+
+>> sp|Q31CY4|MURG_PROM9 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 77.6 0.0 4.3e-23 2.4e-20 2 135 .. 8 137 .. 7 141 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 77.6 bits; conditional E-value: 4.3e-23
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+ +e+ + +++++ l++ +l++ ++++ ++++++++ +++++ + + e++ ++++ +ilke+k+
+ sp|Q31CY4|MURG_PROM9 8 LVAASGTGGHIFPALAVSKEVED-EWNIHwLGVRQRLDANFIPKKYNLRTLNIKTP-RKNIFLFYQYIEILIS---TFQIIRILKEKKI 91
+ 799*****************976.57***********9988777777777777733.4434466666666666...9************ PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ ++v+ +ggy++++ ++a++l++ip++++E+n ipg+v+k++ +n
+ sp|Q31CY4|MURG_PROM9 92 NLVFTTGGYISAPTIVASKLLRIPIIIHESNVIPGMVTKYFGFLCN 137
+ ***************************************9976665 PP
+
+>> sp|B1ZGP4|MURG_METPB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 77.3 1.4 5.6e-23 3.2e-20 1 133 [. 8 139 .. 8 145 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 77.3 bits; conditional E-value: 5.6e-23
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ v++ +gGT+G+++Pa +la +L++rG++V lat ++++ e+v+i++ ++ + +l+ ++ ++++ +a +++++ +
+ sp|B1ZGP4|MURG_METPB 8 VLVCAGGTGGHLFPAQSLAYALKARGIRVALATDARVDSIAgDFPAEEIVTIASATPSGR--SMLRRAGAVLTLGRGFGQAARAVRRLN 94
+ 6899*********************************99887666667777888766677..688888888888888************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprr 133
+ p++vvgfggy +++++aa l+++p++++Eqn+++g +n +l++
+ sp|B1ZGP4|MURG_METPB 95 PAAVVGFGGYPTVPPMLAAQLLRVPTILHEQNAVMGRANGFLAKG 139
+ ***************************************998875 PP
+
+>> sp|Q5LU63|MURG_SILPO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 78.3 0.6 2.7e-23 1.5e-20 2 137 .. 7 142 .. 6 144 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 78.3 bits; conditional E-value: 2.7e-23
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++a+gGT+G+++Pa Ala++ r+G++Vrl t + ++ + + e+ ++ + ++++ + l++ + + + ++ ++ +++++
+ sp|Q5LU63|MURG_SILPO 7 MIAAGGTGGHMFPAQALAEAMLRKGWRVRLSTDARGARYTggFPHTTEISQVSSA-TFARGG-ILAKAMVAPRIAAGIAATAWEMRRDR 93
+ 689**********************************999443444444458888.999999.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pdvvvgfggy + +al+aa+l++ p+ ++Eqng+ g vn+l++rr+ v
+ sp|Q5LU63|MURG_SILPO 94 PDVVVGFGGYPSIPALGAATLLRLPRMIHEQNGVLGRVNQLFARRVACV 142
+ *********************************************9877 PP
+
+>> sp|B3CRE9|MURG_ORITI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 77.5 0.0 4.8e-23 2.7e-20 1 138 [. 4 140 .. 4 141 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 77.5 bits; conditional E-value: 4.8e-23
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavp.igpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ + l+ggGT+G+++Pa+Al++eLq+rG++V l+t ++e+ + +++++++ i v + +k+l + l a ++++ +++
+ sp|B3CRE9|MURG_ORITI 4 IFLVGGGTGGHLFPAIALGEELQERGYNVYLITDTRCEKYLLNSNYSFKIhIMNMVSISN--TGIKKLYAYIRILAACITGFKLVYSNS 90
+ 679*********************************************664222235556..45777777777888899999******* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p ++v fggy ++++i+ +l +ip +++Eqn++ gl+n+l+ r+a+ +
+ sp|B3CRE9|MURG_ORITI 91 PGLIVTFGGYTIAPIIINGILFKIPFILHEQNSVLGLANRLFLRYAKAIT 140
+ **********************************************9875 PP
+
+>> sp|Q1GIV1|MURG_SILST UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 77.7 0.6 4.2e-23 2.4e-20 2 137 .. 7 142 .. 6 144 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 77.7 bits; conditional E-value: 4.2e-23
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++a+gGT+G+++Pa Ala++ r+G++V+l t p+ ++ + + e+ ++ + ++++ + l++ + + + ++ ++ + +++++
+ sp|Q1GIV1|MURG_SILST 7 LMAAGGTGGHMFPAQALAEAMLRKGWRVKLSTDPRGARYTggFPHMTEITEVSSA-TFARGG-LLAKAMVAPRIAAGVASMAMQMRRDR 93
+ 79*************************************9644455566668888.999999.7777777778889************* PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ pdvv+gfggy + +al+aa+l+g p+ ++Eqng+ g+vn+ ++ r+ v
+ sp|Q1GIV1|MURG_SILST 94 PDVVIGFGGYPSIPALGAATLLGLPRMIHEQNGVLGKVNQKFATRVAEV 142
+ ****************************************999988766 PP
+
+>> sp|Q1GZ01|MURG_METFK UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 76.6 0.3 9.1e-23 5.1e-20 2 138 .. 6 142 .. 5 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 76.6 bits; conditional E-value: 9.1e-23
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++ GT+G+v P +A+a++ q rG++V+ l+t+ g+e+++ + +gl++ ++ + + k+ +tl+ ++ a+ +a ++++e +
+ sp|Q1GZ01|MURG_METFK 6 LIMAAGTGGHVMPGLAIAKTMQSRGWNVHwLGTTHGMENRLvPPSGLPMTLLKFS-GMRGKG-WKHTLLGMFRLVGATWRAWRLMRELQ 92
+ 68999*************************************************9.888888.888888888888888999999***** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ p++v+g+ggyv ++ + aa+lag+p+ + ++++ +++n++l ++a++vl
+ sp|Q1GZ01|MURG_METFK 93 PQAVLGMGGYVTVPGGWAARLAGVPLAIVNADAALLMSNRALVKHAKRVL 142
+ ***********************************************997 PP
+
+>> sp|B3ET95|MURG_AMOA5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 76.0 0.0 1.4e-22 7.8e-20 1 137 [. 3 143 .. 3 145 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 76.0 bits; conditional E-value: 1.4e-22
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------..-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakle.slktlkelaeglkalrkakeil 84
+ v+++ggGT+G+v+P +A+a+ L+++ e +++ ++e ++ag+++v ++++ + ++kl+ +k+l + +l +l k+k+i+
+ sp|B3ET95|MURG_AMOA5 3 VIISGGGTGGHVYPGIAIADVLKQKNAENQilfVGAGGKMEMSQvPAAGYPIVGLPIR-GINRKLKyIWKNLALPIWVLISLWKVKRII 90
+ 6899********************9999888899******86555*************.7777663278999999999999******** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ k++kp+vv+g+ggy+ + ++ a++ +ip+++ Eqn+ +g++n+ll+++a ++
+ sp|B3ET95|MURG_AMOA5 91 KDFKPNVVIGTGGYAGFPTIYMAARMHIPIVLQEQNAYAGVANRLLAKYAHKI 143
+ *************************************************9987 PP
+
+>> sp|Q8A258|MURG_BACTN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 75.4 0.0 2.2e-22 1.2e-19 1 137 [. 7 145 .. 7 147 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 75.4 bits; conditional E-value: 2.2e-22
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G+++Pav++a++ + ++ + ++++ ++e + + ag+++ +++ ++ +k +k+++ l + ++ ka+ i+k
+ sp|Q8A258|MURG_BACTN 7 IIISGGGTGGHIFPAVSIANAIIELRPDAKilfVGAEGRMEMQRvPDAGYKIIGLPIA-GFDRKH-LWKNVSVLIKLARSQWKARSIIK 93
+ 6899************************************98766*************.****98.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++p+v vg+ggy++++ l a g+p+ + Eqn+ +g++nkll+++a+ +
+ sp|Q8A258|MURG_BACTN 94 NFRPQVAVGVGGYASGPTLKTAGMMGVPTLIQEQNSYAGVTNKLLAQKAKAI 145
+ ***********************************************99976 PP
+
+>> sp|Q211T8|MURG_RHOPB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 76.5 0.3 9.7e-23 5.5e-20 1 138 [. 8 144 .. 8 145 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 76.5 bits; conditional E-value: 9.7e-23
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE....----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavp....igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++la+gGT+G+++Pa Al+++L++rG +Vrl+t + + +gl + ++++ +l+ + ++ +++++ + ++ a ++
+ sp|Q211T8|MURG_RHOPB 8 IMLAAGGTGGHLFPAEALGVALMKRGLRVRLVTDMRALRY---SGLFSRDmvdvVPSE-TLRGRS-PVALARTALKLGTGTLMALSLML 91
+ 68*******************************9887777...455444443357777.888877.9999******************* PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + kp++v+gfggy +++l+aa+ gip+ v+++n+++g +n++l+ +++ ++
+ sp|Q211T8|MURG_RHOPB 92 RLKPAAVIGFGGYPTLPPLLAARMFGIPTLVHDSNAVMGRANRFLSHKVTAIA 144
+ ***********************************************999875 PP
+
+>> sp|Q2IYK8|MURG_RHOP2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 76.5 0.5 9.8e-23 5.5e-20 1 137 [. 7 142 .. 7 144 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 76.5 bits; conditional E-value: 9.8e-23
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++la+gGT+G+++Pa Al++ L++rG +Vrl+t + ++ ++ +++vp ++ + + ++ ++ + + ++ ka +++ +
+ sp|Q2IYK8|MURG_RHOP2 7 ILLAAGGTGGHLFPAEALGVVLMKRGLRVRLVTDSRAMRYSglfSADMIDVVPSETV---RGRT-PWALARTGLMLGAGTAKALALMLR 91
+ 79****************************999998887743345666666665555...4444.777777778888889********* PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kp++vvgfggy +++l+aa++++ip+ ++++n+++g +n+ll++ ++ +
+ sp|Q2IYK8|MURG_RHOP2 92 LKPAAVVGFGGYPTLPPLFAARALRIPTLIHDSNAVMGRANRLLSKGVTAI 142
+ *********************************************988876 PP
+
+>> sp|B1LXZ4|MURG_METRJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 76.9 0.9 7.2e-23 4.1e-20 1 137 [. 8 143 .. 8 145 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 76.9 bits; conditional E-value: 7.2e-23
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++l +gGT+G+++Pa +la++L++rG++V lat ++++ e e+v+i++ ++ + lk ++ ++++ a + +++ +
+ sp|B1LXZ4|MURG_METRJ 8 ILLCAGGTGGHLFPAESLAHALRARGIRVALATDARVDSIAsEFPASEVVTIASATPSGR--SPLKRAGAVLTLGRGFGVAAKEIRRIN 94
+ 7899***********************************998888899999999977777..578888888888888************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p+++vgfggy +++++a +++p++++Eqn+++g +n +l+r a ++
+ sp|B1LXZ4|MURG_METRJ 95 PAAIVGFGGYPTVPPVLAGQILRVPTILHEQNAVMGRANAFLARGARTI 143
+ ******************************************9988766 PP
+
+>> sp|A2BNZ2|MURG_PROMS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 76.0 0.0 1.4e-22 7.8e-20 2 135 .. 8 137 .. 7 141 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 76.0 bits; conditional E-value: 1.4e-22
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+ +e+ + +++++ l+++ +l++ + ++++ ++++++++ ++ + +++ +k l + +++ +ilke+k+
+ sp|A2BNZ2|MURG_PROMS 8 LVAASGTGGHIFPALAVSKEVED-EWNIHwLGIQQRLDANLIPQKYNLKTLNLKTPRKNIFLFYQYIKILMST----FQIIRILKEKKI 91
+ 799*****************976.57***************88888888899886677766667777766666....************ PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ ++v+ +ggy++++ ++a++ ++ip++++E+n +pg+v+k++ +n
+ sp|A2BNZ2|MURG_PROMS 92 NLVFTTGGYISAPTIVASKILKIPIIIHESNVVPGMVTKYFGFLCN 137
+ ***************************************9976665 PP
+
+>> sp|C0R2W7|MURG_WOLWR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 75.7 0.0 1.8e-22 9.9e-20 1 137 [. 3 130 .. 3 132 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 75.7 bits; conditional E-value: 1.8e-22
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++la+gGT+G+++Pa+Ala++L+++G++ +l t ++ + + e++ l+ + ++ k++ + + +++ ++ + +++
+ sp|C0R2W7|MURG_WOLWR 3 IILATGGTGGHIFPAIALAKALKTQGYNCILFTDKKTNKNTdiESYTLPLRRPSSN-KFKF--FLFLIYSSMLAL--------YQVRKL 80
+ 78*******************************99988886556666666666655.4444..444444444444........788999 PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kp+ v+gfg+y++ + l+aa+ + ip++++Eqn + g vn+++ + a+ +
+ sp|C0R2W7|MURG_WOLWR 81 KPKSVIGFGSYASFPTLLAARVLSIPIILHEQNTVLGRVNRFFFKSAKLI 130
+ ******************************************99988876 PP
+
+>> sp|Q73I55|MURG_WOLPM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 75.7 0.0 1.8e-22 9.9e-20 1 137 [. 3 130 .. 3 132 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 75.7 bits; conditional E-value: 1.8e-22
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ ++la+gGT+G+++Pa+Ala++L+++G++ +l t ++ + + e++ l+ + ++ k++ + + +++ ++ + +++
+ sp|Q73I55|MURG_WOLPM 3 IILATGGTGGHIFPAIALAKALKTQGYNCILFTDKKTNKNTdiESYTLPLRRPSSN-KFKF--FLFLIYSSMLAL--------YQVRKL 80
+ 78*******************************99988886556666666666655.4444..444444444444........788999 PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ kp+ v+gfg+y++ + l+aa+ + ip++++Eqn + g vn+++ + a+ +
+ sp|Q73I55|MURG_WOLPM 81 KPKSVIGFGSYASFPTLLAARVLSIPIILHEQNTVLGRVNRFFFKSAKLI 130
+ ******************************************99988876 PP
+
+>> sp|A9VWV3|MURG_METEP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 75.2 1.3 2.5e-22 1.4e-19 1 133 [. 8 139 .. 8 145 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 75.2 bits; conditional E-value: 2.5e-22
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S-.-----.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvk.lwakleslktlkelaeglkalrkakeilkea 87
+ v++ +gGT+G+++Pa +la +L++rG++V lat ++++ e+v+i++ ++ +++ l+ +++++l +g + +a +++++
+ sp|A9VWV3|MURG_METEP 8 VLVCAGGTGGHLFPAQSLAYALKDRGIRVALATDARVDSIAgDFPAEEIVTIASATPsGRSVLRRAGAVVTLGRG---FGQAARAVRRL 93
+ 6899********************************998776544555555665544044445555555555555...*********** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprr 133
+ +p++vvgfggy +++++aa l+++p++++Eqn+++g +n +l++
+ sp|A9VWV3|MURG_METEP 94 NPAAVVGFGGYPTVPPMLAAQLLRVPTILHEQNAVMGRANGFLAKG 139
+ ****************************************998875 PP
+
+>> sp|B7KSC1|MURG_METC4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 75.2 1.3 2.5e-22 1.4e-19 1 133 [. 8 139 .. 8 145 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 75.2 bits; conditional E-value: 2.5e-22
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S-.-----.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvk.lwakleslktlkelaeglkalrkakeilkea 87
+ v++ +gGT+G+++Pa +la +L++rG++V lat ++++ e+v+i++ ++ +++ l+ +++++l +g + +a +++++
+ sp|B7KSC1|MURG_METC4 8 VLVCAGGTGGHLFPAQSLAYALKDRGIRVALATDARVDSIAgDFPAEEIVTIASATPsGRSVLRRAGAVVTLGRG---FGQAARAVRRL 93
+ 6899********************************998776544555555665544044445555555555555...*********** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprr 133
+ +p++vvgfggy +++++aa l+++p++++Eqn+++g +n +l++
+ sp|B7KSC1|MURG_METC4 94 NPAAVVGFGGYPTVPPMLAAQLLRVPTILHEQNAVMGRANGFLAKG 139
+ ****************************************998875 PP
+
+>> sp|A2C027|MURG_PROM1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 75.7 0.0 1.7e-22 9.5e-20 2 138 .. 5 138 .. 4 139 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 75.7 bits; conditional E-value: 1.7e-22
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+++Pa+++a+ L + V l++p++le ++ ++++ +++++ +l+ + +++l +l + l a ++ +l+++k++
+ sp|A2C027|MURG_PROM1 5 LIAASGTGGHIYPALSFADSLSNSWEIVWLGVPNRLEVELVPEKYNLIKLKVG-GLQG--NIFRKLFDLCKLLFASVQVSVLLRQKKIN 90
+ 799********************998888********9998888899999999.9999..89*************************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ v++ +ggy++++ +++a+ agip+ ++E+n+ipg+v++ll r+++ v+
+ sp|A2C027|MURG_PROM1 91 VIFTTGGYISAPCILGAKMAGIPVLLHESNAIPGKVTRLLGRFCDHVA 138
+ *******************************************99886 PP
+
+>> sp|A3PHS8|MURG_RHOS1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 73.9 0.7 6.3e-22 3.6e-19 2 137 .. 7 142 .. 6 144 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 73.9 bits; conditional E-value: 6.3e-22
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++a+gGT+G+++Pa Ala++ rrG++V+l t + ++ + +e++++ + ++++ + l++ + +++ ++ +a + + +++
+ sp|A3PHS8|MURG_RHOS1 7 LIAAGGTGGHMFPAQALAEAMVRRGWRVKLSTDARGARYAggFPHVVEIEEVSSA-TFARGG-PLAKALVPLRIAGGVASAVAGFLRDR 93
+ 79********************************99999977778899999***9.****99.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p vvvgfggy + +al aa +++ p+ ++Eqng+ g vn+l++ r+ v
+ sp|A3PHS8|MURG_RHOS1 94 PSVVVGFGGYPSIPALSAAVALRLPRMIHEQNGVLGRVNRLFAPRVQAV 142
+ ******************************************9999876 PP
+
+>> sp|A4SH02|MURG_PROVI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 74.2 1.2 4.9e-22 2.8e-19 1 138 [. 3 146 .. 3 147 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 74.2 bits; conditional E-value: 4.9e-22
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----..S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpd..vklwakleslktlkelaeglkalrkakei 83
+ +++aggGT+G+++PavA+a+e+qr + +t++g+e++ + g+ + ++++ ++++ ++ +++ +a++ al +a ++
+ sp|A4SH02|MURG_PROVI 3 ILFAGGGTGGHLYPAVAMAEEVQRMVPGASvlfAGTSRGIEAREvPRLGYRLHLLEVRglRRGRSLKDMAANIGIAADFAAALASAVAL 91
+ 79**********************86655554789******9999*******999999664445555789999999************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++++pdvvvg+gg+v++++l+aa l+g ++ + Eqn+ pg++++ll+ a+ v+
+ sp|A4SH02|MURG_PROVI 92 VRRERPDVVVGTGGFVSAPVLFAAQLLGKKTLIQEQNAFPGVTTRLLSALATEVH 146
+ ************************************************9999887 PP
+
+>> sp|Q3J4M2|MURG_RHOS4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 73.9 0.7 6.3e-22 3.6e-19 2 137 .. 7 142 .. 6 144 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 73.9 bits; conditional E-value: 6.3e-22
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++a+gGT+G+++Pa Ala++ rrG++V+l t + ++ + +e++++ + ++++ + l++ + +++ ++ +a + + +++
+ sp|Q3J4M2|MURG_RHOS4 7 LIAAGGTGGHMFPAQALAEAMVRRGWRVKLSTDARGARYAggFPHVVEIEEVSSA-TFARGG-PLAKALVPLRIAGGVASAVAGFLRDR 93
+ 79********************************99999977778899999***9.****99.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p vvvgfggy + +al aa +++ p+ ++Eqng+ g vn+l++ r+ v
+ sp|Q3J4M2|MURG_RHOS4 94 PSVVVGFGGYPSIPALSAAVALRLPRMIHEQNGVLGRVNRLFAPRVQAV 142
+ ******************************************9999876 PP
+
+>> sp|Q7V388|MURG_PROMP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 74.9 0.0 3e-22 1.7e-19 2 130 .. 9 133 .. 8 141 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 74.9 bits; conditional E-value: 3e-22
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+ +++ + +++++ l+++++l+++ ++++ +++++++ ++ ++ ++ lk l++ + + +ilke+k+
+ sp|Q7V388|MURG_PROMP 9 LIAASGTGGHIFPALAVSKKVEK-DWDIHwLGVTKRLDSEFVPSKYNLLTLNLETPKKNIFRVFQYLKILFSI----FNIIKILKEKKI 92
+ 799*****************975.78************99977778888888886666666777777777777....999********* PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ ++v+ +ggy++++ ++aa++++ip++++E+n ipg v+k++
+ sp|Q7V388|MURG_PROMP 93 NLVFTTGGYISAPTILAAKWLKIPVILHESNLIPGTVTKYF 133
+ **************************************998 PP
+
+>> sp|A3PAR5|MURG_PROM0 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 74.9 0.0 3e-22 1.7e-19 2 130 .. 8 132 .. 7 141 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 74.9 bits; conditional E-value: 3e-22
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+ +e+ ++ ++++ l+++++l++ ++++ ++++++++ ++ + + + ++ l +++++ ilke+k+
+ sp|A3PAR5|MURG_PROM0 8 LVAASGTGGHIFPALAVTKEVEDK-WNIHwLGVHKRLDANFIPKKYNLRTLNIKTPRKN----IFLFYQYFRILMSTFQVIWILKEEKI 91
+ 799******************887.6999********9988777777777777733444....444555555555569*********** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ ++v+ +ggy++++ +ia++l++ip++++E+n ipg+v+k +
+ sp|A3PAR5|MURG_PROM0 92 NLVFTTGGYISAPTIIASKLLRIPVIIHESNLIPGMVTKNF 132
+ *************************************9876 PP
+
+>> sp|Q07PT3|MURG_RHOP5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 75.6 0.6 1.8e-22 1e-19 1 138 [. 7 143 .. 7 144 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 75.6 bits; conditional E-value: 1.8e-22
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE....----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavp....igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++la+gGT+G+++Pa Al++ L++rG +Vrl+t + + +gl ++ ++++ +++ + ++ ++ a + ++ ka +++
+ sp|Q07PT3|MURG_RHOP5 7 ILLAAGGTGGHLFPAEALGVVLMQRGLRVRLVTDSRALRY---SGLFSREmtdvVPSE-TVRGRS-PVALARTGAMLGAGTLKALTLMW 90
+ 79****************************9999988777...677666633346666.777766.89999999999999********* PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + kp++v+gfggy +++liaa+l +ip+ v+++n+++g +n++l+ +++ ++
+ sp|Q07PT3|MURG_RHOP5 91 RLKPAAVIGFGGYPTLPPLIAARLMKIPTLVHDSNAVMGRANRFLSAHVTAIA 143
+ **********************************************9999875 PP
+
+>> sp|Q133X1|MURG_RHOPS UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 74.1 0.6 5.3e-22 3e-19 1 137 [. 7 142 .. 7 144 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 74.1 bits; conditional E-value: 5.3e-22
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv...eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ ++la+gGT+G+++Pa Al++ L++rG +Vrl+t + ++ ++ +++vp ++ +++ ++ ++ + ++ a ++ +
+ sp|Q133X1|MURG_RHOPS 7 ILLAAGGTGGHLFPAEALGVVLMKRGLRVRLVTDSRAMRYSglfSADMIDVVPSETV-RGRT---PWALARTGVMLGAGTALAIGLMMR 91
+ 79****************************999988887643356666666665555.3333...55666666666666888999**** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +p++v+gfggy +++l+aa++++ip+ ++++n+++g +n+ll+rr+ +
+ sp|Q133X1|MURG_RHOPS 92 LRPAAVIGFGGYPTLPPLFAARALRIPTLIHDANAVMGRANRLLSRRVSAI 142
+ ***********************************************9876 PP
+
+>> sp|Q5LIJ7|MURG_BACFN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 74.4 0.1 4.4e-22 2.5e-19 1 137 [. 16 154 .. 16 156 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 74.4 bits; conditional E-value: 4.4e-22
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+++Pav++a++ ++ ++ ++++ ++e + + ag+++ +++ ++ +k +k++ l++ ++ ka+ i++
+ sp|Q5LIJ7|MURG_BACFN 16 VIISGGGTGGHIFPAVSIANAIKELRPDAQilfVGAEGRMEMQRvPDAGYQIIGLPVA-GFDRKH-LWKNVAVLLKLVRSQWKARNIIR 102
+ 6899**************************99********98766*************.****98.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++p+v vg+ggy++++ l a g+p+ + Eqn+ +g++nkll+++a ++
+ sp|Q5LIJ7|MURG_BACFN 103 QFRPQVAVGVGGYASGPTLKMAGMMGVPTLIQEQNSYAGVTNKLLAQKARRI 154
+ ***********************************************99987 PP
+
+>> sp|Q64ZM1|MURG_BACFR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 74.4 0.1 4.4e-22 2.5e-19 1 137 [. 16 154 .. 16 156 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 74.4 bits; conditional E-value: 4.4e-22
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ggGT+G+++Pav++a++ ++ ++ ++++ ++e + + ag+++ +++ ++ +k +k++ l++ ++ ka+ i++
+ sp|Q64ZM1|MURG_BACFR 16 VIISGGGTGGHIFPAVSIANAIKELRPDAQilfVGAEGRMEMQRvPDAGYQIIGLPVA-GFDRKH-LWKNVAVLLKLVRSQWKARNIIR 102
+ 6899**************************99********98766*************.****98.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +++p+v vg+ggy++++ l a g+p+ + Eqn+ +g++nkll+++a ++
+ sp|Q64ZM1|MURG_BACFR 103 QFRPQVAVGVGGYASGPTLKMAGMMGVPTLIQEQNSYAGVTNKLLAQKARRI 154
+ ***********************************************99987 PP
+
+>> sp|A6LLF1|MURG_THEM4 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 74.4 0.0 4.4e-22 2.5e-19 1 139 [] 4 144 .. 4 144 .. 0.97
+
+ Alignments for each domain:
+ == domain 1 score: 74.4 bits; conditional E-value: 4.4e-22
+ EEEE-------HHHHHHHHHHHHH--.-EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrG.heVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++agg T+G+++Pa+A +eLq+ ++V + ++ +lee+v + ++ ++v+++++ +l + l s++++k++++ l+a + +k++lk+
+ sp|A6LLF1|MURG_THEM4 4 IAVAGGVTGGHLYPALATLNELQKITpIDVLyFTVKGKLEEKVlKDYNFKTVSLDVK-GLIRPLYSFGNIKRILKILNAKNIVKKALKD 91
+ 789*********************7626999**************************.******************************* PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvlv 139
+ +kpd+ + +ggyv+ ++++ a+ +g ++++Eqn ipgl+n l++ a++v+v
+ sp|A6LLF1|MURG_THEM4 92 FKPDIAFVTGGYVSYPVGVTAKQLGFLLYIHEQNVIPGLTNLKLSKIADKVFV 144
+ *************************************************9985 PP
+
+>> sp|Q46HH6|MURG_PROMT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 74.4 0.0 4.2e-22 2.4e-19 2 138 .. 5 138 .. 4 139 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 74.4 bits; conditional E-value: 4.2e-22
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+++Pa+++a+ L + V l++p +le ++ ++++ +++++ +l+ +s+++l +l + l a ++ +l+++k++
+ sp|Q46HH6|MURG_PROMT 5 LIAASGTGGHIYPALSFADSLSNSWEIVWLGVPHRLEVELVPEKYNLIKLKVG-GLQG--NSFRKLFNLCKLLFASVQVSVLLRQKKIN 90
+ 799********************998888********9998888888999999.9999..99*************************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ v++ +ggy++++ +++a+ agip+ ++E+n+ipg+v++ll r+++ v+
+ sp|Q46HH6|MURG_PROMT 91 VIFTTGGYISAPSILGAKMAGIPVLLHESNAIPGKVTRLLGRFCDHVA 138
+ *******************************************99886 PP
+
+>> sp|A4WQD5|MURG_RHOS5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 72.8 1.1 1.4e-21 7.8e-19 2 137 .. 7 142 .. 6 144 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 72.8 bits; conditional E-value: 1.4e-21
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++a+gGT+G+++Pa Ala++ rrG++V+l t + ++ + +e+ ++ ++ ++++ + l+ + +a+ ++ +a + +++
+ sp|A4WQD5|MURG_RHOS5 7 LIAAGGTGGHMFPAQALAEAMVRRGWRVKLSTDARGARYAggFPHVVEIDQVSSG-TFARGG-ALARALVPARIAAGVASAVVGFLRDR 93
+ 79********************************99999877677889999****.999999.999999999999************** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ p+vvvgfggy + +al aa +++ p+ ++Eqng+ g vn+l++ r++ v
+ sp|A4WQD5|MURG_RHOS5 94 PAVVVGFGGYPSIPALSAAVALRLPRMIHEQNGVLGRVNRLFAPRVDAV 142
+ *********************************************9987 PP
+
+>> sp|A2BUH4|MURG_PROM5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 73.1 0.0 1.1e-21 6e-19 2 130 .. 9 133 .. 8 142 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 73.1 bits; conditional E-value: 1.1e-21
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++a+ GT+G+++Pa+A+ +e+ ++ +++ l+++++l+++ ++++ +++++ ++ +s+ l + ++ l +++ + +ilke+k+
+ sp|A2BUH4|MURG_PROM5 9 LIAASGTGGHIFPALAVSKEVEKYW-NMHwLGVEKRLDSKFVPRKYNLLTLNLE--TPQ--KSIFILFQYLKILYSTFNIIKILKEKKI 92
+ 799*******************995.9***********9997777777777777..556..5677888888888889************ PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkll 130
+ ++v+ +gg+++++ ++aa+l++ip++++E+n ipg v+k++
+ sp|A2BUH4|MURG_PROM5 93 NLVFTTGGFISAPTILAAKLLNIPVIIHESNLIPGTVTKYF 133
+ **************************************998 PP
+
+>> sp|Q5GS79|MURG_WOLTR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 71.8 0.0 2.7e-21 1.5e-18 1 135 [. 3 128 .. 3 132 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 71.8 bits; conditional E-value: 2.7e-21
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +vla+gGT+G+++Pa+ lar+ +r+G++ +l + ++ + + + + l+ + g++ k++ + l ++ a + +++
+ sp|Q5GS79|MURG_WOLTR 3 IVLATGGTGGHIFPAITLARAIKRQGYDSILFADKKTGKNTdvKDYTLPLNKPGGN-KFRF--FLLLIYS--------CVLALYQIRKL 80
+ 79****************************88887777666346666666655555.4444..3333333........35556889*** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ kp++v+gfggy++ + l+aa+ + ip++++Eqn++ g vnk++ a+
+ sp|Q5GS79|MURG_WOLTR 81 KPKLVIGFGGYASFPTLLAAKVLSIPIILHEQNAVLGRVNKFFFNSAE 128
+ ******************************************977665 PP
+
+>> sp|Q7NPZ9|MURG_CHRVO UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 71.1 0.1 4.4e-21 2.5e-18 1 133 [. 6 138 .. 6 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 71.1 bits; conditional E-value: 4.4e-21
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ v++++ GT+G++ P +A+a+eLq rG++V l+t +g+e+++ + +g++ + ++ +++ k+ l+ lk +++ a++++ + + ++
+ sp|Q7NPZ9|MURG_CHRVO 6 VMVMAAGTGGHIVPGLAVAKELQSRGWKVVwLGTRRGMENKLvPPTGIPLERLNFH-GVRGKG-LLGSLKGALQLAGAFFSSAAQIFRH 92
+ 67899***************************************************.******.************************* PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprr 133
+ +pdvv+g+ggyv ++ ++ a l++ p+++ ++++ +l+nk+l +
+ sp|Q7NPZ9|MURG_CHRVO 93 RPDVVLGMGGYVCLPGGVMAGLLWKPLVLVNADAGLLLSNKALLPF 138
+ ********************************99999999987555 PP
+
+>> sp|Q1AVX3|MURG_RUBXD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 68.1 0.0 3.8e-20 2.1e-17 19 139 .] 2 121 .. 1 121 [. 0.93
+ 2 ? 3.7 0.1 2.8 1.6e+03 1 24 [. 165 188 .. 165 192 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 68.1 bits; conditional E-value: 3.8e-20
+ HHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE-- CS
+ Glyco_transf_28 19 areLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlali 105
+ a+ L++rG eV ++++ gle+++ ++ag +++++ +l+ s + + l+++ a+ + +++l+e +p +v+g+ggy++++a+
+ sp|Q1AVX3|MURG_RUBXD 2 AESLRERGAEVVfFGSESGLERELvPKAGFGLHALPLS-GLAGGPASRARASLLFAR--AVVRCRALLRELRPGAVLGVGGYASAPAVA 87
+ 889***********************************.999977666666666666..****************************** PP
+
+ HHHHHHHHHHHHHH----EEEEESSGGGSCCCSC CS
+ Glyco_transf_28 106 aallagipanvaEqngipglvnkllprrangvlv 139
+ aa+l+gip++++Eqn++pg+vn++ r+a vlv
+ sp|Q1AVX3|MURG_RUBXD 88 AARLLGIPTFIHEQNSVPGKVNRAAGRFAREVLV 121
+ ****************************999875 PP
+
+ == domain 2 score: 3.7 bits; conditional E-value: 2.8
+ EEEE-------HHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqr 24
+ vvl+ gG++G + +A a++++
+ sp|Q1AVX3|MURG_RUBXD 165 VVLVFGGSGGALRINLAAAEAFRG 188
+ 799*****************9986 PP
+
+>> sp|Q7MBC4|MURG_GLOVI UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 71.2 0.1 4.2e-21 2.4e-18 2 134 .. 7 136 .. 6 140 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 71.2 bits; conditional E-value: 4.2e-21
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpd 90
+ ++a+ GT+G+++Pa+A+a eL + ++ l++p++le+++ ++ ++++++ +l++k ++ l + + + a+r a+ +l++++ +
+ sp|Q7MBC4|MURG_GLOVI 7 LIAASGTGGHIFPALAVAGELSEFEIAW-LGVPDRLENKLVPGRYPLHTVALQ-GLNRKP-GPQWLEAASQTFAAYRYARNLLSQERFA 92
+ 799**********************444.***********7777888888888.889988.999999999999**************** PP
+
+ HHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 91 vvvgfggyvadlaliaallagipanvaEqngipglvnkllprra 134
+ v+ +ggy+a++a++aa++++ pa+ +E+n +pg+v ++l+r+
+ sp|Q7MBC4|MURG_GLOVI 93 GVFTTGGYIAAPAVLAARSLNLPAIGHESNVLPGKVIRYLARWM 136
+ ***************************************99986 PP
+
+>> sp|Q7U322|MURG_HELHP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 70.9 0.0 5e-21 2.8e-18 1 137 [. 2 140 .. 2 141 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 70.9 bits; conditional E-value: 5e-21
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpd.vklwakleslktlkelaeglkalrkakeilke 86
+ ++++ggGT+G++ a Ala+e q+ + + ++++ g ++++ e + l ++ + +d +++ +k l+++k ++++lka +a+ ilk+
+ sp|Q7U322|MURG_HELHP 2 FAITGGGTGGHLAIAKALAQEAQKNNQQSIyIGSQIGQDKTWfEGSSLFTHCYFLDsTGVVNKK-GLGKIKAIFKQLKAAWEARNILKK 89
+ 799***********************99999*******************99888865777766.9*********************** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ +k+++v+++gg++a+ a+i+a+l++ p++++Eqn+i g+ n +l +a+ +
+ sp|Q7U322|MURG_HELHP 90 HKIEYVISVGGFSAGGASIGAILSNTPLFIHEQNAIKGKLNEILTPFAKAI 140
+ *******************************************99999876 PP
+
+>> sp|Q3B129|MURG_PELLD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 71.4 0.5 3.5e-21 2e-18 1 138 [. 3 146 .. 3 147 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 71.4 bits; conditional E-value: 3.5e-21
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHH.HH---EEEE----.....S------.-HHHCCSHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefv.eeagleavpigpd.....vklwakleslktlkelaeglkalrka 80
+ +++aggGT+G+++PavA+a L++ + V+ +t g+e+ + g+ + i+++ l a l ++ l+++a+ l++a
+ sp|Q3B129|MURG_PELLD 3 ILFAGGGTGGHLYPAVAMAAMLKEMVPGVElsfAGTASGIEAGEvPRLGYRLHLIPVRglkrgRSLSALLSNIGVLTDFAAS---LFRA 88
+ 79****************************88889*****99877*************766655555555555555566665...**** PP
+
+ HHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 81 keilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++++++pdvvvg+gg+v++++l+aa l+g ++ + Eqn+ pgl+++ll+ a v+
+ sp|Q3B129|MURG_PELLD 89 AALIRRERPDVVVGTGGFVSAPVLLAAQLLGRKTLIQEQNAFPGLTTRLLSILAREVH 146
+ ************************************************9997777666 PP
+
+>> sp|Q30PK0|MURG_SULDN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 66.5 0.0 1.2e-19 6.9e-17 3 136 .. 5 140 .. 3 143 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 66.5 bits; conditional E-value: 1.2e-19
+ EE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpd.vklwakleslktlkelaeglkalrkakeilkeak 88
+ ++ggGT+G++ a Al ++ + Ghe + ++++ g +++ e+ + + ++ +++ ++ + l++lk l+ +l+a++++++ilk+++
+ sp|Q30PK0|MURG_SULDN 5 ITGGGTGGHLMIAEALVEACANDGHEAIfIGSTSGQDRKYfEQNSKFSHVYFLQtTGVVNQ-RGLGKLKALWLVLRAFFASRAILKKHN 92
+ 79************************************99744433333344442255554.599************************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ +++++++gg++a++a++a+l++ ip++++Eqn++ g+ n +l+ +a++
+ sp|Q30PK0|MURG_SULDN 93 IQATYSVGGFSAAAASFASLSRLIPLFIHEQNAVYGKLNSILKPFATR 140
+ ******************************************999987 PP
+
+>> sp|A2SCY5|MURG_METPP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 68.7 0.2 2.4e-20 1.4e-17 2 137 .. 7 145 .. 6 147 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 68.7 bits; conditional E-value: 2.4e-20
+ EEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH....HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr.latppgleefv....eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ v+++ GT+G++ P +A+a+e q+rG+ V l+t+ g+e+++ +e+g+e+ +i+ +l+ k+ l+tl+ ++ l a+ + +il+
+ sp|A2SCY5|MURG_METPP 7 VVMAAGTGGHIIPGLAVAQEMQHRGWTVSwLGTEQGMENRLvppaAESGIEMDTIAFS-GLRGKG-LLHTLTGGLRLLGAFAACAKILR 93
+ 7899***********************************988766789**********.******.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ + ++v+g+ggyv + ++ a+l+g p+++ ++++ +++n++l+ a+++
+ sp|A2SCY5|MURG_METPP 94 RRATTAVLGMGGYVCFPGGLMASLLGKPLILVNADAALLMSNRALKPVADRI 145
+ *******************************************999998887 PP
+
+>> sp|A0RP87|MURG_CAMFF UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 64.4 0.0 5.3e-19 3e-16 1 136 [. 2 139 .. 2 142 .. 0.92
+ 2 ? 2.5 0.0 6.7 3.8e+03 2 41 .. 171 210 .. 170 264 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 64.4 bits; conditional E-value: 5.3e-19
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE..----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp..igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++++ggGT+G++ a Ala eL++rG +V+ +++ g ++++ e + + + +++ ++ +k +++l l++ k +k + i+
+ sp|A0RP87|MURG_CAMFF 2 IAITGGGTGGHLAIAKALAIELKNRGENVIfIGSNSGQDRMWfEHSDIFKFKyfFPSR-GVVNKK-GIHKLFALLNIIKLAFKCRCIFT 88
+ 789***************************************9888886544356777.888877.999999999999*********** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ e+++ v+++ggy++++a+++a + +++++Eqn+i g+ n +l+ ++++
+ sp|A0RP87|MURG_CAMFF 89 EHNISSVISVGGYSSAPASFGAVIFRKKLFIHEQNAIKGKLNSILKPFCKK 139
+ *******************************************99988876 PP
+
+ == domain 2 score: 2.5 bits; conditional E-value: 6.7
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv 41
+ +++gg + + ++Al +L + h++ ++ ++g +e
+ sp|A0RP87|MURG_CAMFF 171 LFLGGSQGASFINSLALNLALNLKNHNINIIHQCGAKELE 210
+ 66777777789999***************99999988873 PP
+
+>> sp|B3CM87|MURG_WOLPP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 66.6 0.0 1.1e-19 6.2e-17 1 137 [. 3 127 .. 3 129 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 66.6 bits; conditional E-value: 1.1e-19
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ ++la+gGT+G+v+Pa+ la++L+ +Gh+ +l t + + e++ l+ ++ ++ kl+ +l +++ +++ + ++ kp
+ sp|B3CM87|MURG_WOLPP 3 IILATGGTGGHVFPAITLAKALKVQGHNCILFTDQKTINI-ESYILPLCKPSGN-KLKF--LFLLMYSCVLAL--------YQTRKLKP 79
+ 78***************************99999988765.9999999887777.5555..334444444444........556999** PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ ++++gfg+y++ + l+aa+ + ip++++Eqn + g vn+++ + a+ +
+ sp|B3CM87|MURG_WOLPP 80 KLIIGFGSYASFPTLLAAKILSIPIVLHEQNTVLGRVNRFFFKSAKLI 127
+ ****************************************99988876 PP
+
+>> sp|A5FUL0|MURG_ACICJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 66.2 2.3 1.4e-19 8.1e-17 1 135 [. 9 145 .. 9 149 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 66.2 bits; conditional E-value: 1.4e-19
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +v+a+gGT+G++ Pa ++a+eL+rrG ++ l t + + + ag e + +++ +l+ + + l+ +a+ +++ +a+ il++
+ sp|A5FUL0|MURG_ACICJ 9 IVIAAGGTGGHMVPAESVADELMRRGQRIVLMTDARSAGQKsaVFAGCERHVLAGA-GLAGRS-LGRRLLGVAQLARGTVAARHILAKL 95
+ 79****************************99999999886556788887778888.788877.9999********************* PP
+
+ HHHHHHHC----EEEE--HHH..HHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaal..lagipanvaEqngipglvnkllprran 135
+ +++vvgfggy ++++++aa+ +++ ++++++qn++ g +n++l+r+a+
+ sp|A5FUL0|MURG_ACICJ 96 DAAAVVGFGGYPSVPPVLAAAtlRRRPAIVLHDQNAVLGGANRFLARFAD 145
+ *****************9998778999********************998 PP
+
+>> sp|Q7MAD4|MURG_WOLSU UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 65.8 0.0 1.9e-19 1.1e-16 1 131 [. 3 135 .. 3 140 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 65.8 bits; conditional E-value: 1.9e-19
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH..HH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv..eeagleavp.igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ a Al++ L + +++++g ++ + e+g + + ++++ ++ ++ ++++++l ++++a+ +a++ilk
+ sp|Q7MAD4|MURG_WOLSU 3 ILLTGGGTGGHLAIAKALMESLASKNQSLFfIGSQRGQDRSWfeHEEGFKRRFfLETQ-GVVNQR-GIAKIRSLSSQFQAMLEARKILK 89
+ 79************************9999***********98667777777777777.666655.9********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSG CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllp 131
+ +++++ vv++ggy+a++a++aal++gip++++Eqn+ gl n+ll+
+ sp|Q7MAD4|MURG_WOLSU 90 NHQIKRVVSVGGYSAAPASLAALSLGIPLYIHEQNAKVGLLNRLLK 135
+ ****************************************999876 PP
+
+>> sp|B2KE54|MURG_ELUMP UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 64.5 0.0 4.9e-19 2.8e-16 1 135 [. 4 139 .. 4 143 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 64.5 bits; conditional E-value: 4.9e-19
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++a+gGT+G+++P +l++eL++r +eV ++ +++ + ++ ++ + ++++i+ +++++ + ++ + +++ ++ ++ i+ +
+ sp|B2KE54|MURG_ELUMP 4 FIIASGGTGGHFYPGFSLGKELRKRSYEVLfVVRKEDAAIKTlTKNNFNYKEINFT-GFPRSANPIRHIIFCYKFIVSFWQTLGIINAF 91
+ 789***************************8666666666666*************.******************************** PP
+
+ HHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ kpdv+vg+ggy + ++++ a+ gi+ v+++n gl+nk+++++ n
+ sp|B2KE54|MURG_ELUMP 92 KPDVCVGMGGYLSFPVIVWAKIKGIKSAVHDSNTKIGLANKICAKFTN 139
+ ******************************************999876 PP
+
+>> sp|B3EIK8|MURG_CHLL2 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 64.8 0.3 4e-19 2.2e-16 1 133 [. 3 141 .. 3 147 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 64.8 bits; conditional E-value: 4e-19
+ EEEE-------HHHHHHHHHHHHH-..--EEE.EEETGGGHHHH.HH---EEEE----S------....-HHHCCSHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrr..GheVr.latppgleefv.eeagleavpigpdvklwakle...slktlkelaeglkalrkake 82
+ v++aggGT+G+++PavA+a+eL + G V +t++g+e+ + g+ + ++++ +l++ + l+++ l ++ al a
+ sp|B3EIK8|MURG_CHLL2 3 VLFAGGGTGGHLYPAVAMAVELLKLvpGASVSfAGTKNGIEASEiPRLGYRLHLLPVR-GLKRGGSlraILANVGILIDFAGALINAGG 90
+ 79**********************8445666688999999998889999999999999.66665530003444455566677899999* PP
+
+ HHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 83 ilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprr 133
+ ++++++pdvvvg+gg+v++++l+aa g + + Eqn+ pg+++kll+
+ sp|B3EIK8|MURG_CHLL2 91 LIRRENPDVVVGTGGFVSAPVLLAAQMMGRRTLIQEQNAFPGVTTKLLSIL 141
+ **********************************************99865 PP
+
+>> sp|A5UZT7|MURG_ROSS1 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 65.4 2.3 2.5e-19 1.4e-16 3 138 .. 20 177 .. 18 178 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 65.4 bits; conditional E-value: 2.5e-19
+ EE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.........................S------.-HHH CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.........................vklwakleslkt 66
+ l+ggGT+G+v+Pa+A+a +L + G + +a ++g +++ +++ ++ ++ v++++ l ++++
+ sp|A5UZT7|MURG_ROSS1 20 LVGGGTGGHVYPALAVAAALNAHGAQFVVADTDGGRNRAMSRHTRWSALYVGsvggmeaalvaresalpfhalpaaaVRGRNPLTMVRN 108
+ 89*************************************777777777444445**********************9999999999999 PP
+
+ CCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 67 lkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ l +la+g + +a +++++++p++++g+ggyv +++++aa+la +p+++ + +pgl+ +ll+r an v+
+ sp|A5UZT7|MURG_ROSS1 109 LITLARG---TGAAHRLIARDRPAAILGTGGYVCVPVFLAARLACVPTVIYQPDVVPGLAVRLLARLANLVA 177
+ 9999999...********************************************************999875 PP
+
+>> sp|Q5FUJ5|MURG_GLUOX UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 63.1 0.5 1.3e-18 7.2e-16 1 134 [. 5 142 .. 5 147 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 63.1 bits; conditional E-value: 1.3e-18
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE....----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavp....igpdvklwakleslktlkelaeglkalrkakeilk 85
+ +v+a+gGT+G+++Pa A+a L +rGh+ l t + ++ e+gl +++ +++ k+ ++++ +++ l+++ +a++il+
+ sp|Q5FUJ5|MURG_GLUOX 5 IVIAAGGTGGHFFPAEAVATVLAERGHDLVLMTDARHGRR--ETGLFKDRpqyvLDGA-GVAGKG-LSGKVHGVLALLRGMMEARRILA 89
+ 79***************************98877766665..4444443334224555.799999.999999***************** PP
+
+ HHHHHHHHHC----EEEE--HHH....HHHHHHHHHHH----EEEEESSGGGS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaal....lagipanvaEqngipglvnkllprra 134
+ + +++vvgfggy + ++l+a++ + + + +++E n++ g +n +l+r+
+ sp|Q5FUJ5|MURG_GLUOX 90 SLDAAAVVGFGGYPSIPPLTASRllpsAKRPQMVIHEGNAVLGQANAFLSRFS 142
+ **********************9888888999*****************9985 PP
+
+>> sp|A6Q722|MURG_SULNB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 60.6 0.0 7.8e-18 4.4e-15 1 135 [. 3 137 .. 3 141 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 60.6 bits; conditional E-value: 7.8e-18
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ ++++ggGT+G++ + A+ ++L+ ++ + ++++ g ++++ e+++ ++++ d+++ + + +++lk+l+ l+a+ ka+++lk++
+ sp|A6Q722|MURG_SULNB 3 IIMTGGGTGGHLAIIKAVKEQLKGEE-LIYIGSTTGQDRQWfENDEDFTETYFFDTRGVVNQRGFGKLKSLWMMLQAMMKARKLLKKYD 90
+ 689********************999.555***********999998888887775555555699************************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ ++vv+++gg+++++ +aa++a +p++++Eqn+ g nkll +a
+ sp|A6Q722|MURG_SULNB 91 AKVVFSVGGFSSAATAFAAKSASVPLVIHEQNAALGSLNKLLRPYAA 137
+ ****************************************9988875 PP
+
+>> sp|B8E325|MURG_DICTD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 61.1 0.0 5.5e-18 3.1e-15 1 138 [. 4 135 .. 4 136 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 61.1 bits; conditional E-value: 5.5e-18
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+v Pa+ +a+ +r ++ + ++ ++ +ee++ + +++++ +++ ++ +k+l+ + ++++a +il e
+ sp|B8E325|MURG_DICTD 4 ILFVAGGTGGHVIPALNMADYISERAPHWKisfIGRKNSFEEKLIAGKYDFYGLDII---KS--SDIKKLSYYL----SIKDALKILGE 83
+ 799**********************9998888*******************555555...33..3444444444....55999****** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +pd++v fg+y+ +++++a++ + p +++Eqn ipg v+kl+ r+ gv+
+ sp|B8E325|MURG_DICTD 84 LEPDILVVFGSYITVPIIVASIIKKLPFFLHEQNVIPGRVTKLFYRFSQGVA 135
+ **********************************************999886 PP
+
+>> sp|A6Q579|MURG_NITSB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 60.3 0.0 9.9e-18 5.6e-15 1 138 [. 3 142 .. 3 143 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 60.3 bits; conditional E-value: 9.9e-18
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp...igpdvklwakleslktlkelaeglkalrkakeil 84
+ ++++ggGT+G++ a +l +++++++ +++ g ++ + e+++ ++++ +++ ++ +k +++++ l + +a ++ak+++
+ sp|A6Q579|MURG_NITSB 3 ILITGGGTGGHLSVAKSLKEAFKKKDATLYyIGSIQGQDRSWfENDE-DFQKklfFDVE-GVVNKK-GINKIRALTDIVRASFAAKKLI 88
+ 789***********************9998************65555.44444555555.555555.78888888888899******** PP
+
+ HHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 85 keakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ k++++d+vv++ggy+a++a++aal ++ p++++Eqn++ g+ n+ll+ +a++v+
+ sp|A6Q579|MURG_NITSB 89 KNESIDAVVSVGGYSAAAASFAALQLNLPLFIHEQNAVKGKLNRLLSPFAKRVF 142
+ ***************************************************996 PP
+
+>> sp|Q0BV25|MURG_GRABC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 59.3 0.5 2e-17 1.1e-14 1 133 [. 10 144 .. 10 148 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 59.3 bits; conditional E-value: 2e-17
+ EEEE-------HHHHHHHHHHHHH---EEEEEETG...GGHHHH.HH--...-EEEE----S------.-HHHCCSHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatpp...gleefv.eeag...leavpigpdvklwakleslktlkelaeglkalrkake 82
+ +++a+gGT+G+++Pa Ala eL+rrG ++ l t gl+++v + + l+ i+++ + ++ +++ l +g + ka +
+ sp|Q0BV25|MURG_GRABC 10 IIIAAGGTGGHFFPAEALAAELKRRGRQIVLMTDArsgGLTSTVfADTDrfvLPGAGIAGR-GIRR---AGQAVIALGHG---VVKAGA 91
+ 689***************************9887611145566633322111333334444.5555...44666666666...****** PP
+
+ HHHHHHHHHHHHC----EEEE--HHH..HHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 83 ilkeakpdvvvgfggyvadlaliaal..lagipanvaEqngipglvnkllprr 133
+ +l++ ++ +vgfggy +++++a+ ++++p++++Eqn++ g +n+ll+r+
+ sp|Q0BV25|MURG_GRABC 92 LLRRLEAGCIVGFGGYPCIPPVLGARlrARNVPVILHEQNAVLGRANRLLARK 144
+ ************************9966789*****************99886 PP
+
+>> sp|Q5PB22|MURG_ANAMM UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 59.0 0.0 2.4e-17 1.3e-14 1 135 [. 4 137 .. 4 141 .. 0.94
+
+ Alignments for each domain:
+ == domain 1 score: 59.0 bits; conditional E-value: 2.4e-17
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeak 88
+ vvla+gGT+G++ Pa+ l + L +rG++ l t + + + g++ + + p +++++ ++ lk a + + l++ k
+ sp|Q5PB22|MURG_ANAMM 4 VVLAAGGTGGHIVPAALLCQVLADRGYRCVLYTDQYFLQYTaRFPGIKGYVLLPL--CKRSGGAVRLLKFCALLAYSCVLSYIKLRSLK 90
+ 79**************************************9999****9998887..67777799999999999999************ PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ pd+v+gfg y++ ++l+ a+l + a+++Eqn+++g vn++++ +a
+ sp|Q5PB22|MURG_ANAMM 91 PDLVIGFGAYASFPVLLSAWLMSVDAVLHEQNSVMGRVNRVFAGYAR 137
+ ******************************************99986 PP
+
+>> sp|A7I265|MURG_CAMHC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 58.5 0.0 3.4e-17 1.9e-14 1 137 [. 3 141 .. 3 143 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 58.5 bits; conditional E-value: 3.4e-17
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpd.vklwakleslktlkelaeglkalrkakeilke 86
+ ++++ggGT+G++ a la eL++rG + + +++++g + + e++ l +++ ++ ++ +k ++ +++l++ l + ++i+++
+ sp|A7I265|MURG_CAMHC 3 IAITGGGTGGHLTIAKILAYELKKRGLKTIfIGSTNGQDMLWfENSVLFDEKYFLKsSGVVNKK-GISRILSLFKILALSFGCRKIFAK 90
+ 789***************************************9999998888665532666666.899999999999999********* PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ + ++v+++ggy++++a + a +++ip++++Eqn+ g+ n ll+r+a++
+ sp|A7I265|MURG_CAMHC 91 HDVKAVISVGGYSSAPAAFWAVANKIPLFIHEQNAEIGKINALLKRFAKRF 141
+ ************************************************985 PP
+
+>> sp|A9FI55|MURG_SORC5 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 60.1 0.8 1.1e-17 6.3e-15 1 138 [. 4 145 .. 4 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 60.1 bits; conditional E-value: 1.1e-17
+ EEEE-------HHHHHHHHHHHHH..---EEE...EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqr..rGheVr...latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakei 83
+ v++aggGT+G+v+P +A+++++++ r+ e r ++t +g+e +v e+g + + + + +l+ + +++++ +a+ + l +a+++
+ sp|A9FI55|MURG_SORC5 4 VLIAGGGTGGHVFPMIAVGDAVRAaaRDEEARvvyVGTARGIEVRVmGERGDNLELLHVL-PLRGGG-LSGFVRGAARAGSVLPEARRL 90
+ 799*****************998622444555669*******************999999.999999.********************* PP
+
+ HHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 84 lkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +++ + v ++ ggy+ +++++aa+++g+p+ + E n++ gl+n+ll+ +++++
+ sp|A9FI55|MURG_SORC5 91 VERLDARVALSLGGYAGGPVSLAARSLGVPVAILEPNSVLGLSNRLLAPIVDRAY 145
+ ***********************************************99999987 PP
+
+>> sp|B5YEL3|MURG_DICT6 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 58.7 0.0 3e-17 1.7e-14 1 138 [. 4 135 .. 4 136 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 58.7 bits; conditional E-value: 3e-17
+ EEEE-------HHHHHHHHHHHHH---EEE...EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr...latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ +++++gGT+G+v Pa+ +a+ ++ ++ + ++ ++ +ee + +++++ +++ ++ +k+l+ ++ +a +il e
+ sp|B5YEL3|MURG_DICT6 4 ILFVAGGTGGHVIPALNMADYIAQKAPHWKisfVGRKDSFEEGLIRGKYDFYGLNIS---RS--SDVKKLSYYLSI----SDAIKILNE 83
+ 799*******************9998888888*******************999999...22..244444444444....777****** PP
+
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ kpd++v fg+y+ ++++ia++ + p +++Eqn +pg v+kl+ + +gv+
+ sp|B5YEL3|MURG_DICT6 84 VKPDILVVFGSYITVPVIIASIVKKYPFFLHEQNVVPGRVTKLFYEFSEGVA 135
+ ********************************************99988876 PP
+
+>> sp|A8FM88|MURG_CAMJ8 UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 55.1 0.0 3.8e-16 2.1e-13 1 136 [. 3 140 .. 3 143 .. 0.96
+
+ Alignments for each domain:
+ == domain 1 score: 55.1 bits; conditional E-value: 3.8e-16
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavp...igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ l + ++ +e +++++g ++ + e ++ +++ + ++ ++ ++ +++++++l++ lk ++ +ei+k
+ sp|A8FM88|MURG_CAMJ8 3 IALTGGGTGGHLAIVRCLLESAIKKNIECVyIGSQNGQDKAWFENEVRFKEkffLSSK-GVVNQS-KFGKISSLLHTLKLSKDCREIFK 89
+ 79**************************889***********999****999989999.999988.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ ++ +++v+++ggy+a++a++aal+++ p++++Eqn+ g n ll+ +a++
+ sp|A8FM88|MURG_CAMJ8 90 KYHIQAVFSVGGYSAAPASFAALFSHLPLFIHEQNSKSGSLNMLLKPFATK 140
+ ***************************************999999998887 PP
+
+>> sp|Q5HU62|MURG_CAMJR UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 54.8 0.0 5e-16 2.8e-13 1 136 [. 3 140 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 54.8 bits; conditional E-value: 5e-16
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavp...igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ l + ++ +e +++++g ++ + e ++ +++ + ++ ++ ++ +++++++l++ lk ++ +ei+k
+ sp|Q5HU62|MURG_CAMJR 3 IALTGGGTGGHLAIVRCLLESAIKKNIECVyIGSQNGQDKAWFENEVRFKEkffLSSK-GVVNQS-KFDKISSLLHTLKLSKDCREIFK 89
+ 79**************************889***********999****999988999.888888.9********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ ++ +++v+++ggy+a++a++aal+++ p++++Eqn+ g n ll+ +a++
+ sp|Q5HU62|MURG_CAMJR 90 KYHIQAVFSVGGYSAAPASFAALFSHLPLFIHEQNSKSGSLNMLLKPFATK 140
+ ***************************************999999998887 PP
+
+>> sp|A1W027|MURG_CAMJJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 54.8 0.0 5e-16 2.8e-13 1 136 [. 3 140 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 54.8 bits; conditional E-value: 5e-16
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavp...igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ l + ++ +e +++++g ++ + e ++ +++ + ++ ++ ++ +++++++l++ lk ++ +ei+k
+ sp|A1W027|MURG_CAMJJ 3 IALTGGGTGGHLAIVRCLLESAIKKNIECVyIGSQNGQDKAWFENEVRFKEkffLSSK-GVVNQS-KFDKISSLLHTLKLSKDCREIFK 89
+ 79**************************889***********999****999988999.888888.9********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ ++ +++v+++ggy+a++a++aal+++ p++++Eqn+ g n ll+ +a++
+ sp|A1W027|MURG_CAMJJ 90 KYHIQAVFSVGGYSAAPASFAALFSHLPLFIHEQNSKSGSLNMLLKPFATK 140
+ ***************************************999999998887 PP
+
+>> sp|Q9PNQ2|MURG_CAMJE UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 54.8 0.0 5e-16 2.8e-13 1 136 [. 3 140 .. 3 143 .. 0.95
+
+ Alignments for each domain:
+ == domain 1 score: 54.8 bits; conditional E-value: 5e-16
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavp...igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ l + ++ +e +++++g ++ + e ++ +++ + ++ ++ ++ +++++++l++ lk ++ +ei+k
+ sp|Q9PNQ2|MURG_CAMJE 3 IALTGGGTGGHLAIVRCLLESAIKKNIECVyIGSQNGQDKAWFENEVRFKEkffLSSK-GVVNQS-KFDKISSLLHTLKLSKDCREIFK 89
+ 79**************************889***********999****999988999.888888.9********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ ++ +++v+++ggy+a++a++aal+++ p++++Eqn+ g n ll+ +a++
+ sp|Q9PNQ2|MURG_CAMJE 90 KYHIQAVFSVGGYSAAPASFAALFSHLPLFIHEQNSKSGSLNMLLKPFATK 140
+ ***************************************999999998887 PP
+
+>> sp|A7H2Z9|MURG_CAMJD UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 53.6 0.0 1.1e-15 6.4e-13 1 136 [. 3 140 .. 3 143 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 53.6 bits; conditional E-value: 1.1e-15
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE...----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavp...igpdvklwakleslktlkelaeglkalrkakeilk 85
+ ++l+ggGT+G++ l + ++ +e +++++g ++ + e + +++ + ++ ++ ++ +++++++l++ lk ++ +ei+k
+ sp|A7H2Z9|MURG_CAMJD 3 IALTGGGTGGHLAIVRCLLESAIKKNIECVyIGSQNGQDKAWFENEARFKEkffLSSK-GVVNQN-KFGKISSLLHTLKLSKDCREIFK 89
+ 79**************************889***********6666666666677777.777777.*********************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrang 136
+ ++ +++v+++ggy+a++a++aal+++ p++++Eqn+ g n ll+ +a++
+ sp|A7H2Z9|MURG_CAMJD 90 KYHIQAVFSVGGYSAAPASFAALFSHLPLFIHEQNSKSGSLNMLLKPFATK 140
+ ***************************************999999998887 PP
+
+>> sp|A8F4X1|MURG_THELT UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 52.2 0.0 3.1e-15 1.8e-12 4 138 .. 6 142 .. 3 143 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 52.2 bits; conditional E-value: 3.1e-15
+ E-------HHHHHHHHHHHHH.---EEE.EEETGGGHHHH.HH---EEEE----.S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 4 aggGTrGdvePavAlareLqr.rGheVr.latppgleefv.eeagleavpigpd.vklwakleslktlkelaeglkalrkakeilkeak 88
+ aggGT+G+++Pav++ ++L + + +V+ ++ ++g+e+++ + ++ e++ i++d +l + + +++++++l++ + ++ +l+ ++
+ sp|A8F4X1|MURG_THELT 6 AGGGTGGHLYPAVSILEKLAEmKKLNVTyFCLEKGIESKIlPLEHPEYKLIKIDlKGLERPIWKPSNFTRLLKI--SQSESIIALEIKQ 92
+ 89*****************984568999*************777777777666653777777789999999999..8889999****** PP
+
+ HHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ +d + +ggy++ +++ ++++ p ++ Eqn +pgl+nk+l+ a++++
+ sp|A8F4X1|MURG_THELT 93 CDFGLMTGGYISYPVGKVCKKLKKPFFIQEQNVVPGLANKALSLSAKKIF 142
+ *******************************************9999987 PP
+
+>> sp|Q72R84|MURG_LEPIC UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 41.3 0.2 7e-12 3.9e-09 1 138 [. 4 142 .. 4 143 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 41.3 bits; conditional E-value: 7e-12
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------...-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakl..eslktlkelaeglkalrkakeilk 85
+ +v+++gGT+G++ P vAla+ L + + ++ ++ + + + + + ++ ++ lw +l s+++++ + + ++ k+++i+k
+ sp|Q72R84|MURG_LEPIC 4 IVIVAGGTGGHISPGVALAEVLTELKEK--IGYENLYLYSLvrNKNNPDLEQAPCP-VLWHNLppLSSNFFLFPIRYTIQIIKTFFIFK 89
+ 799*********************9944..68888766655588888888888888.5555432258888999999999********** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + ++dvv+g+ggy+ + ++ ++ + ++++ Eqn ipg vn+l+ r+a +v+
+ sp|Q72R84|MURG_LEPIC 90 KLNIDVVIGMGGYSTVSSILYGIFFRKKIYLCEQNTIPGNVNRLFFRFASKVA 142
+ ************************************************99986 PP
+
+>> sp|Q8F4J1|MURG_LEPIN UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 41.3 0.2 7e-12 3.9e-09 1 138 [. 4 142 .. 4 143 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 41.3 bits; conditional E-value: 7e-12
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------...-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakl..eslktlkelaeglkalrkakeilk 85
+ +v+++gGT+G++ P vAla+ L + + ++ ++ + + + + + ++ ++ lw +l s+++++ + + ++ k+++i+k
+ sp|Q8F4J1|MURG_LEPIN 4 IVIVAGGTGGHISPGVALAEVLTELKEK--IGYENLYLYSLvrNKNNPDLEQAPCP-VLWHNLppLSSNFFLFPIRYTIQIIKTFFIFK 89
+ 799*********************9944..68888766655588888888888888.5555432258888999999999********** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ + ++dvv+g+ggy+ + ++ ++ + ++++ Eqn ipg vn+l+ r+a +v+
+ sp|Q8F4J1|MURG_LEPIN 90 KLNIDVVIGMGGYSTVSSILYGIFFRKKIYLCEQNTIPGNVNRLFFRFASKVA 142
+ ************************************************99986 PP
+
+>> sp|Q4FPK5|MURG_PELUB UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 40.5 0.0 1.3e-11 7.1e-09 1 138 [. 5 138 .. 5 139 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 40.5 bits; conditional E-value: 1.3e-11
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakp 89
+ +++++gG++G+v Pa + ++L + +V + + + ++f+ +++++ + +++ + ++ l ++++ ++k+ ++++k+
+ sp|Q4FPK5|MURG_PELUB 5 ILISTGGSGGHVIPATIIYKHLEDNF-DVSMTSDFRGVKFLNKDEYNLKIFNVR-PISKN--LLIIPLDFIFMIFLIFKSISFFRKNKI 89
+ 6899******************9876.***************999999999999.77774..45555555555557899999******* PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCCS CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangvl 138
+ d+++++ggy +++++++a+ ++i++ + E n + g +nk++ ++ +++
+ sp|Q4FPK5|MURG_PELUB 90 DTLISTGGYMSLPLCLGARILNIKLLLFEPNMVLGRSNKFFLSYCQKIF 138
+ *****************************************99998875 PP
+
+>> sp|Q04V94|MURG_LEPBJ UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 36.2 0.2 2.7e-10 1.5e-07 1 137 [. 4 141 .. 4 143 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 36.2 bits; conditional E-value: 2.7e-10
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------...-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakl..eslktlkelaeglkalrkakeilk 85
+ +v+a+gGT+G++ P vAla+ L + + ++ ++ + + + + + ++ ++ lw +l s++ ++ +++ ++ k++ ++k
+ sp|Q04V94|MURG_LEPBJ 4 IVIAAGGTGGHISPGVALAEVLTDLKEK--IGYENLYLYSLirNQNNPDLEQAPCP-VLWHNLppLSSNIFLFPFRYTIQILKTFLLFK 89
+ 79**********************9944..68888877766688888888888888.5555432268999999**************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ + + dvv+g+ggy+ + ++ +l + ++++ Eqn +pg v +l+ r+an++
+ sp|Q04V94|MURG_LEPBJ 90 KLNVDVVIGMGGYSTVSSILYGILFKKKIYLCEQNTVPGNVSRLFFRFANKA 141
+ *************************************************997 PP
+
+>> sp|Q04Y82|MURG_LEPBL UDP-N-acetylglucosamine--N-acetylmuramyl-(pentapeptide) pyrophosphoryl-undecaprenol N-acetylglu
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 36.2 0.2 2.7e-10 1.5e-07 1 137 [. 4 141 .. 4 143 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 36.2 bits; conditional E-value: 2.7e-10
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------...-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakl..eslktlkelaeglkalrkakeilk 85
+ +v+a+gGT+G++ P vAla+ L + + ++ ++ + + + + + ++ ++ lw +l s++ ++ +++ ++ k++ ++k
+ sp|Q04Y82|MURG_LEPBL 4 IVIAAGGTGGHISPGVALAEVLTDLKEK--IGYENLYLYSLirNQNNPDLEQAPCP-VLWHNLppLSSNIFLFPFRYTIQILKTFLLFK 89
+ 79**********************9944..68888877766688888888888888.5555432268999999**************** PP
+
+ HHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSCCC CS
+ Glyco_transf_28 86 eakpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprrangv 137
+ + + dvv+g+ggy+ + ++ +l + ++++ Eqn +pg v +l+ r+an++
+ sp|Q04Y82|MURG_LEPBL 90 KLNVDVVIGMGGYSTVSSILYGILFKKKIYLCEQNTVPGNVSRLFFRFANKA 141
+ *************************************************997 PP
+
+>> sp|Q8TTI1|Y452_METAC Uncharacterized glycosyltransferase MA_0452 OS=Methanosarcina acetivorans GN=MA_0452 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 33.5 0.0 1.8e-09 9.9e-07 10 103 .. 13 111 .. 4 164 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 33.5 bits; conditional E-value: 1.8e-09
+ --HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.........S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 10 GdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.........vklwakleslktlkelaeglkalrkakeilkeakp 89
+ G+ ++Al++eL ++Ghe+++++ +e ve++g++a++i+++ + l +tlk+++ + k+ ++l+e+kp
+ sp|Q8TTI1|Y452_METAC 13 GHTSRCLALGKELLNAGHEIKFGAYGYSKELVEKTGYTAQEIPSEiklvgkagsLDLTG--SIEATLKSAQLL--GGPKLLKLLREFKP 97
+ 9********************************************99988887766666..567777777777..778899******** PP
+
+ HHHHHC----EEEE CS
+ Glyco_transf_28 90 dvvvgfggyvadla 103
+ dvvv+ y +la
+ sp|Q8TTI1|Y452_METAC 98 DVVVSDSYYLGTLA 111
+ ***87665444444 PP
+
+>> sp|Q8TTI0|Y453_METAC Uncharacterized glycosyltransferase MA_0453 OS=Methanosarcina acetivorans GN=MA_0453 PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 28.7 0.0 5.5e-08 3.1e-05 10 113 .. 13 118 .. 3 128 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 28.7 bits; conditional E-value: 5.5e-08
+ --HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.........S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 10 GdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.........vklwakleslktlkelaeglkalrkakeilkeakp 89
+ G+ ++Al++e+ ++GheV +++ +e v+++g++a +i+p+ + +tl++l + ++rk+ ++++ +p
+ sp|Q8TTI0|Y453_METAC 13 GHTSRCLALGKEFLAAGHEVSFGAYGYSRELVRKTGYSAWEIQPEirligetgiFDIGK--SIKETLRNLSPV--GFRKLLKLIEVLEP 97
+ 9********************************************99987766644444..344455555555..77899999****** PP
+
+ HHHHHC----EEEE--HHHHHHHH CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagip 113
+ dvv++ g y+ ++aa+++++p
+ sp|Q8TTI0|Y453_METAC 98 DVVLSDGYYS---GILAARSRKVP 118
+ ***9988444...44555666655 PP
+
+>> sp|Q8PWF3|Y1636_METMA Uncharacterized glycosyltransferase MM_1636 OS=Methanosarcina mazei GN=MM_1636 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 30.0 0.0 2.2e-08 1.2e-05 10 112 .. 13 117 .. 4 143 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 30.0 bits; conditional E-value: 2.2e-08
+ --HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.........S------.-HHHCCSHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 10 GdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.........vklwakleslktlkelaeglkalrkakeilkeak 88
+ G+ ++Al++eL ++Ghe+++++ ++ ve++g+ +++i+++ l +tlk++ + k+ +++k++k
+ sp|Q8PWF3|Y1636_METMA 13 GHTSRCLALGKELLAAGHEIEFGAYGYSRDLVEKTGYRIHEIPSEiklvgkaggFDLSG--SIEATLKNARIL--GGPKVLKLIKDFK 96
+ 9********************************************99977664422222..334444444444..55689999***** PP
+
+ HHHHHHC----EEEE--HHHHHHH CS
+ Glyco_transf_28 89 pdvvvgfggyvadlaliaallagi 112
+ pdvvv+ l ++aa l++i
+ sp|Q8PWF3|Y1636_METMA 97 PDVVVSDS---YYLGTLAAMLLNI 117
+ ***97755...4444444445555 PP
+
+>> sp|O34539|YJIC_BACSU Uncharacterized UDP-glucosyltransferase yjiC OS=Bacillus subtilis GN=yjiC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 28.9 0.0 4.8e-08 2.7e-05 6 93 .. 11 104 .. 6 124 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 28.9 bits; conditional E-value: 4.8e-08
+ ------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....S------.-HHHCCSHHHHHHH.HHHHHHHHHHHH CS
+ Glyco_transf_28 6 gGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.....vklwakleslktlkelaeglka.lrkakeilkeak 88
+ +++ G+v P +Al ++L ++Gh+V+ at++++++ v +ag ea + + + ++ +e+++++++l+++ + l +++e++k+++
+ sp|O34539|YJIC_BACSU 11 IPAYGHVNPTLALVEKLCEKGHRVTYATTEEFAPAVQQAGGEALIYHTSlnidpKQIREMMEKNDAPLSLLKESLSiLPQLEELYKDDQ 99
+ 5667************************************9999988777777846666556666666666654441568888889998 PP
+
+ HHHHH CS
+ Glyco_transf_28 89 pdvvv 93
+ pd+++
+ sp|O34539|YJIC_BACSU 100 PDLII 104
+ 88874 PP
+
+>> sp|Q53685|OLED_STRAT Oleandomycin glycosyltransferase OS=Streptomyces antibioticus GN=oleD PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 27.6 0.1 1.2e-07 6.6e-05 1 59 [. 10 75 .. 10 132 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 27.6 bits; conditional E-value: 1.2e-07
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.......S---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.......vklwa 59
+ +++ ++ + G+v P++ + reL +rGh+V+ a+pp ++++v+++g v + + ++w
+ sp|Q53685|OLED_STRAT 10 IAMFSIAAHGHVNPSLEVIRELVARGHRVTYAIPPVFADKVAATGPRPVLYHSTlpgpdadPEAWG 75
+ 577889999************************************999988888555556533333 PP
+
+>> sp|Q8PZB2|Y582_METMA Uncharacterized glycosyltransferase MM_0582 OS=Methanosarcina mazei GN=MM_0582 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 28.2 0.0 8e-08 4.5e-05 10 112 .. 13 117 .. 3 129 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 28.2 bits; conditional E-value: 8e-08
+ --HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.........S------.-HHHCCSHHHHH..HHHHHHHHHHHHH CS
+ Glyco_transf_28 10 GdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.........vklwakleslktlkelaegl..kalrkakeilkea 87
+ G+ ++Al++e+ ++GheV +++ + v ++g++a++i+++ + k +ke++++l ++rk+ +++++
+ sp|Q8PZB2|Y582_METMA 13 GHTGRCLALGKEFLAAGHEVNFGAYGYSKGLVQKTGYSAYEIPSEiklageagtF------DIRKSIKETLNNLspSGFRKILRLIEKL 95
+ 99999****************************************7664444332......333444444443322378999999**** PP
+
+ HHHHHHHC----EEEE--HHHHHHH CS
+ Glyco_transf_28 88 kpdvvvgfggyvadlaliaallagi 112
+ pdvv++ g y ++aa ++++
+ sp|Q8PZB2|Y582_METMA 96 DPDVVLSDGYY---TGILAAQKRKV 117
+ *****998844...34444555554 PP
+
+>> sp|P21686|CRTX_PANAN Zeaxanthin glucosyltransferase OS=Pantoea ananas GN=crtX PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 25.9 0.1 3.9e-07 0.00022 11 126 .. 14 131 .. 13 135 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 25.9 bits; conditional E-value: 3.9e-07
+ -HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----..........S------.-HHHCCSHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 11 dvePavAlareLqrrGheVrlatppgleefveeagleavpigpd..........vklwakleslktlkelaeglkalrkakeilkeakp 89
+ +v + la+eL +rGh+V+++ + ++++ + ++ + ++++g+d + l+a+ +++lk + e ++ + +
+ sp|P21686|CRTX_PANAN 14 HVRALQNLAQELVARGHRVTFIQQYDIKHLIDSETIGFHSVGTDshppgaltrvLHLAAHPLGPSMLKLINEM-------ARTTDMLCR 95
+ 67777779***************************************98887776677766666666666666.......555555555 PP
+
+ HHHHHC----EEEE--HHHHHHHHHHHHHH----EEE CS
+ Glyco_transf_28 90 dvvvgfggyvadlaliaallagipanvaEqngipglv 126
+ +++ +f a++ +i + + + a vaE++g+p+++
+ sp|P21686|CRTX_PANAN 96 ELPQAFN-DLAVDGVIVDQMEPAGALVAEALGLPFIS 131
+ 5555554.4567777779999999**********986 PP
+
+>> sp|Q54387|MGT_STRLI Macrolide glycosyltransferase OS=Streptomyces lividans GN=mgt PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 23.5 0.0 2.2e-06 0.0013 9 54 .. 33 78 .. 25 136 .. 0.72
+
+ Alignments for each domain:
+ == domain 1 score: 23.5 bits; conditional E-value: 2.2e-06
+ ---HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE---- CS
+ Glyco_transf_28 9 rGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd 54
+ G+v P++ + reL +rGh+V+ a+p+ l+++v+eag e + ++
+ sp|Q54387|MGT_STRLI 33 HGHVNPSLEVIRELVARGHRVTYAIPRLLADKVAEAGAEPKLWNST 78
+ 6***********************************9876655555 PP
+
+>> sp|Q01330|CRTX_ESCVU Zeaxanthin glucosyltransferase OS=Escherichia vulneris GN=crtX PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 23.1 0.2 2.9e-06 0.0017 15 125 .. 18 125 .. 13 129 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 23.1 bits; conditional E-value: 2.9e-06
+ HHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----.....S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC-- CS
+ Glyco_transf_28 15 avAlareLqrrGheVrlatppgleefv.eeagleavpigpd.....vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfgg 97
+ + Ala e +rGh+V++ t + e++ ++++p+++ +++ +s+++l++l + + +l + ++ + ++ +
+ sp|Q01330|CRTX_ESCVU 18 LHALALEMAQRGHRVTFLTGNVASLAEqETERVAFYPLPASvqqaqRNVQQ--QSNGNLLRLIAA-------MSSLTDVLCQQLPAILQ 97
+ 78**************998887777778**********9998554333333..566666666666.......8888888888888888* PP
+
+ --EEEE--HHHHHHHHHHHHHH----EE CS
+ Glyco_transf_28 98 yvadlaliaallagipanvaEqngipgl 125
+ + a++ali + + + vaE++g+p++
+ sp|Q01330|CRTX_ESCVU 98 RLAVDALIVDEMEPAGSLVAEALGLPFI 125
+ **************************97 PP
+
+>> sp|O31853|YOJK_BACSU Uncharacterized UDP-glucosyltransferase yojK OS=Bacillus subtilis GN=yojK PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.5 0.0 0.00065 0.36 1 53 [. 4 56 .. 4 125 .. 0.82
+ 2 ? 2.3 0.0 7.7 4.3e+03 30 98 .. 189 270 .. 181 275 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 15.5 bits; conditional E-value: 0.00065
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE--- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigp 53
+ v+++g++ G++ P++ +++eL+ rG +++ + ++++e++++ +e++++
+ sp|O31853|YOJK_BACSU 4 VLMIGFPGEGHINPSIGVMKELKSRGENITYYAVKEYKEKITALDIEFREYHD 56
+ 678899999*********************9999999****999999999865 PP
+
+ == domain 2 score: 2.3 bits; conditional E-value: 7.7
+ EEEETGGGHHHHHH---EEEE----..............S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC--- CS
+ Glyco_transf_28 30 rlatppgleefveeagleavpigpd..............vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggy 98
+ ++ t++g+ + e+ g +v +gp + + + l ++++ + + ++ + +++ e+ k++ +vv+++g+
+ sp|O31853|YOJK_BACSU 189 IVFTSRGFQPLAEQFGERYVFVGPSiteragnndfpfdqIDNENVL-FISMGTIFNNQKQFFNQCLEVCKDFDGKVVLSIGKH 270
+ 5778999999999999999999999999999999999887777766.999999999999999999999999999999998876 PP
+
+>> sp|B1YIY4|MTNA_EXIS2 Methylthioribose-1-phosphate isomerase OS=Exiguobacterium sibiricum (strain DSM 17290 / JCM 134
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.4 0.0 8.6e-05 0.049 19 70 .. 201 251 .. 190 271 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 18.4 bits; conditional E-value: 8.6e-05
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSH CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkel 70
+ +eLqr+G++V+l+t + ++++++e+ ++a +g+d + +++++ +++ ++
+ sp|B1YIY4|MTNA_EXIS2 201 TWELQRAGIDVTLITDNMVAHTIKEKQITAIIVGAD-RITRNGDTANKIGTF 251
+ 69**********************************.888888776666555 PP
+
+>> sp|Q0WW21|UGAGT_ARATH Anthocyanin 5-O-glucosyltransferase OS=Arabidopsis thaliana GN=UGT75C1 PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.6 0.0 7e-05 0.039 2 55 .. 15 74 .. 14 130 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 18.6 bits; conditional E-value: 7e-05
+ EEE-------HHHHHHHHHHHHH---EEE....EEETGGGHHHHHH---EEEE----..S CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVr....latppgleefveeagleavpigpd..v 55
+ +l+++++ G++ Pa+ la++L + G V+ + +++++ e ++gl++ + + +
+ sp|Q0WW21|UGAGT_ARATH 15 LLVTFPAQGHINPALQLANRLIHHGATVTystaVSAHRRMGEPPSTKGLSFAWFTDGfdD 74
+ 799**********************************************99887776542 PP
+
+>> sp|Q9Z565|ILVC1_STRCO Ketol-acid reductoisomerase 1 OS=Streptomyces coelicolor GN=ilvC1 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.0 0.0 0.00011 0.064 1 54 [. 20 70 .. 20 105 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 18.0 bits; conditional E-value: 0.00011
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ v+++g+G+ G+ A a L++ G +Vr++ ++g +++ ee+gl +vp++
+ sp|Q9Z565|ILVC1_STRCO 20 VAVIGYGSQGH-----AHALSLRDSGVDVRVGLHEGSKSKAkaEEQGLRVVPVAEA 70
+ 67888999998.....77999******************9999*********9876 PP
+
+>> sp|O05496|YDHE_BACSU Uncharacterized UDP-glucosyltransferase ydhE OS=Bacillus subtilis GN=ydhE PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.3 0.0 9.1e-05 0.051 2 49 .. 5 52 .. 4 103 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 18.3 bits; conditional E-value: 9.1e-05
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEE CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleav 49
+ +++ +++ G+v P + + +++ ++G++V+ ++++++++++e+ag +++
+ sp|O05496|YDHE_BACSU 5 LILNFPAEGHVNPTLGITKAFSDKGYDVHYISTEKYKKRLEAAGATVH 52
+ 67778999************************************8865 PP
+
+>> sp|Q9FBT8|ILVC2_STRCO Ketol-acid reductoisomerase 2 OS=Streptomyces coelicolor GN=ilvC2 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.0 0.0 0.00011 0.064 1 54 [. 20 70 .. 20 105 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 18.0 bits; conditional E-value: 0.00011
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ v+++g+G+ G+ A a L++ G +Vr++ ++g +++ ee+gl +vp++
+ sp|Q9FBT8|ILVC2_STRCO 20 VAVIGYGSQGH-----AHALSLRDSGVDVRVGLHEGSKSKAkaEEQGLRVVPVAEA 70
+ 67888999998.....77999******************9999*********9876 PP
+
+>> sp|Q9SBL1|HMNGT_SORBI Cyanohydrin beta-glucosyltransferase OS=Sorghum bicolor GN=UGT85B1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.5 0.1 7.8e-05 0.044 1 55 [. 13 83 .. 13 152 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 18.5 bits; conditional E-value: 7.8e-05
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE----...............S CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavpigpd...............v 55
+ vvl+ ++ G+v P++ lar L +rG +V+ + t+ ++++ ++++g +av ++ +
+ sp|Q9SBL1|HMNGT_SORBI 13 VVLVPFPGQGHVAPLMQLARLLHARGARVTfVYTQYNYRRLLRAKGEAAVRPPATssarfrieviddglsL 83
+ 688889999*********************************99999988755554555555555555554 PP
+
+>> sp|B1I2P1|MTNA_DESAP Methylthioribose-1-phosphate isomerase OS=Desulforudis audaxviator (strain MP104C) GN=mtnA PE=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.4 0.1 0.00034 0.19 18 62 .. 199 242 .. 184 278 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 16.4 bits; conditional E-value: 0.00034
+ HHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------. CS
+ Glyco_transf_28 18 lareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakle 62
+ a+eL+r+G+eV + + ++++ + + +gl+ v +g+d +++a+++
+ sp|B1I2P1|MTNA_DESAP 199 TAWELMREGIEV-VLVADNMAGYLmAREGLDLVIVGAD-RVAANGD 242
+ 69**********.667777777777*************.8888763 PP
+
+>> sp|A8AZU1|MUTL_STRGC DNA mismatch repair protein mutL OS=Streptococcus gordonii (strain Challis / ATCC 35105 / CH1 /
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.1 0.0 0.015 8.6 55 127 .. 194 265 .. 129 268 .. 0.84
+ 2 ? 2.6 0.0 6.1 3.5e+03 105 136 .. 315 346 .. 308 348 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 11.1 bits; conditional E-value: 0.015
+ S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 55 vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ + + +++l+++ +g +l ak+ ++ d+++++ gyv+++ l+ a++++i + ++ + +l n
+ sp|A8AZU1|MUTL_STRGC 194 REMTRTA-GSGNLRQAIAGIYGLATAKKMVEISASDLDFEVSGYVSLPELTRANRNYITILINGRYIKNFLLN 265
+ 4455544.789999999*******************************************9998887766666 PP
+
+ == domain 2 score: 2.6 bits; conditional E-value: 6.1
+ -HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 105 iaallagipanvaEqngipglvnkllprrang 136
+ a +++ i+a + Eq+ ip++ l + ++++
+ sp|A8AZU1|MUTL_STRGC 315 MALISQAIAASLKEQDLIPDALENLAKSTVKR 346
+ 67889****************99999888876 PP
+
+>> sp|Q01198|LIGD_PSEPA C alpha-dehydrogenase OS=Pseudomonas paucimobilis GN=ligD PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.4 0.0 0.00034 0.19 20 91 .. 173 244 .. 171 279 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 16.4 bits; conditional E-value: 0.00034
+ HHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 20 reLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpdv 91
+ ++L ++G+ V ++tp ++++ + e++ l ++g+ ++ ++ es++ l ++++ + + +k+ e++k+ +d
+ sp|Q01198|LIGD_PSEPA 173 QGLEKYGIGVSVCTPANIKSNIaEASRLRPAKYGTS-GYVENEESIASLHSIHQHGLEPEKLAEAIKKGVEDN 244
+ 689*********************************.9999999********************999877665 PP
+
+>> sp|Q83RR8|NPD_SHIFL NAD-dependent deacetylase OS=Shigella flexneri GN=npdA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.8 0.0 0.0021 1.2 2 31 .. 209 239 .. 209 254 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 13.8 bits; conditional E-value: 0.0021
+ EEE-------HHHHHHHHHHHHH--.-EEEE CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrG.heVrl 31
+ v++++GT G+v+Pa+ + +e + G h V+l
+ sp|Q83RR8|NPD_SHIFL 209 VFIAIGTSGHVYPAAGFVHEAKLHGaHTVEL 239
+ 789***************9999888344445 PP
+
+>> sp|C5D7U5|MTNA_GEOSW Methylthioribose-1-phosphate isomerase OS=Geobacillus sp. (strain WCH70) GN=mtnA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.1 0.0 0.00042 0.24 19 69 .. 205 254 .. 198 280 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 16.1 bits; conditional E-value: 0.00042
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCS CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlke 69
+ +eL+++G +V+l+t + + ++++++++av +g+d + +a++++ +++ +
+ sp|C5D7U5|MTNA_GEOSW 205 TWELMQAGVDVTLITDNMAAQTIKAKNITAVIVGAD-RIAANGDTANKIGT 254
+ 69**********************************.88888877666655 PP
+
+>> sp|A3CR14|MUTL_STRSV DNA mismatch repair protein mutL OS=Streptococcus sanguinis (strain SK36) GN=mutL PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.9 0.0 0.017 9.4 56 127 .. 195 265 .. 131 268 .. 0.87
+ 2 ? 2.2 0.0 8.4 4.7e+03 105 136 .. 315 346 .. 309 348 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 10.9 bits; conditional E-value: 0.017
+ ------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 56 klwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ + + +++l+++ +g +l ak+ ++ d+++++ gyv+++ l+ a++++i + ++ + +l n
+ sp|A3CR14|MUTL_STRSV 195 EMTRTA-GSGNLRQAIAGIYGLATAKKMVEISASDLDFEVSGYVSLPELTRANRNYITILINGRYIKNFLLN 265
+ 445544.7899999999******************************************9998887766666 PP
+
+ == domain 2 score: 2.2 bits; conditional E-value: 8.4
+ -HHHHHHHHHHHHHH----EEEEESSGGGSCC CS
+ Glyco_transf_28 105 iaallagipanvaEqngipglvnkllprrang 136
+ a +++ i++ + Eq+ ip++ l + ++++
+ sp|A3CR14|MUTL_STRSV 315 MALISQAIATSLKEQDLIPDALENLAKSTVKR 346
+ 67889***************999998888876 PP
+
+>> sp|Q88M09|MTNA_PSEPK Methylthioribose-1-phosphate isomerase OS=Pseudomonas putida (strain KT2440) GN=mtnA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.5 0.0 0.00066 0.37 19 69 .. 211 260 .. 205 290 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 15.5 bits; conditional E-value: 0.00066
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCS CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlke 69
+ ++eL ++G+ V+l++ +l++ +++g++ v +g+d + +a++++ +++ +
+ sp|Q88M09|MTNA_PSEPK 211 GWELANEGIPVTLCADSALAHLMKTKGITWVVVGAD-CIAANGDMAGKIGT 260
+ 8***********************************.88888877776654 PP
+
+>> sp|Q5L1E6|MTNA_GEOKA Methylthioribose-1-phosphate isomerase OS=Geobacillus kaustophilus GN=mtnA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.2 0.0 0.0008 0.45 18 69 .. 203 253 .. 197 288 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 15.2 bits; conditional E-value: 0.0008
+ HHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCS CS
+ Glyco_transf_28 18 lareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlke 69
+ a+eL+++G +V+l+t + + ++++g+ a +g+d + ++++++ +++ +
+ sp|Q5L1E6|MTNA_GEOKA 203 TAWELMQAGVDVTLITDNMAAQAIKAKGIGAIIVGAD-RIAQNGDTANKIGT 253
+ 59***********************************.77777766665554 PP
+
+>> sp|Q8X8E0|NPD_ECO57 NAD-dependent deacetylase OS=Escherichia coli O157:H7 GN=npdA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.2 0.0 0.0033 1.9 3 31 .. 210 239 .. 209 254 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 13.2 bits; conditional E-value: 0.0033
+ EE-------HHHHHHHHHHHHH--.-EEEE CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrG.heVrl 31
+ ++++GT G+v+Pa+ + +e + G h V+l
+ sp|Q8X8E0|NPD_ECO57 210 FIAIGTSGHVYPAAGFVHEAKLHGaHTVEL 239
+ 889**************9999888344445 PP
+
+>> sp|P75960|NPD_ECOLI NAD-dependent deacetylase OS=Escherichia coli (strain K12) GN=npdA PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.3 0.0 0.0031 1.8 3 33 .. 210 241 .. 209 264 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 13.3 bits; conditional E-value: 0.0031
+ EE-------HHHHHHHHHHHHH--.-EEEEEE CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrG.heVrlat 33
+ ++++GT G+v+Pa+ + +e + G h V+l
+ sp|P75960|NPD_ECOLI 210 FIAIGTSGHVYPAAGFVHEAKLHGaHTVELNL 241
+ 889***************99988834454655 PP
+
+>> sp|Q5V467|MAMA1_HALMA Methylaspartate mutase S chain 1 OS=Haloarcula marismortui GN=mamA1 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.3 0.5 0.00037 0.21 1 50 [. 10 61 .. 10 147 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 16.3 bits; conditional E-value: 0.00037
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavp 50
+ v+l ++G+ +v + l ++L ++G eV+ l+++ + +efv +++ +a++
+ sp|Q5V467|MAMA1_HALMA 10 VILGVIGSDAHVVGITILEQALSAAGFEVInLGVQTAQDEFVsAAKSHDAEA 61
+ 57889*************************************7555555554 PP
+
+>> sp|C0MAS4|MUTL_STRE4 DNA mismatch repair protein mutL OS=Streptococcus equi subsp. equi (strain 4047) GN=mutL PE=3 S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.7 0.0 0.0012 0.65 50 127 .. 189 265 .. 150 268 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 14.7 bits; conditional E-value: 0.0012
+ E----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 50 pigpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ i + +l + + l+++++g +l+ ak+ + ++d+++++gg+v+++ l+ a++++i + ++ + +l n
+ sp|C0MAS4|MUTL_STRE4 189 LISDGKQLTQTS-GAGDLRQALAGIYGLNTAKKMIDISSADLDFEVGGFVSLPELTRANRNYITILINGRYIKNFLLN 265
+ 555554555544.67889999********************************************9998887766666 PP
+
+>> sp|P0A2F2|NPD_SALTY NAD-dependent deacetylase OS=Salmonella typhimurium GN=npdA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.6 0.0 0.0025 1.4 3 36 .. 210 244 .. 209 259 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 13.6 bits; conditional E-value: 0.0025
+ EE-------HHHHHHHHHHHHH--.-EEEEEETGG CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrG.heVrlatppg 36
+ ++++GT G+v+Pa+ + +e + G h V+l +p
+ sp|P0A2F2|NPD_SALTY 210 FIAIGTSGHVYPAAGFVHEAKLHGaHTVELNLEPS 244
+ 889****************9998845555666665 PP
+
+>> sp|P0A2F3|NPD_SALTI NAD-dependent deacetylase OS=Salmonella typhi GN=npdA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.6 0.0 0.0025 1.4 3 36 .. 210 244 .. 209 259 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 13.6 bits; conditional E-value: 0.0025
+ EE-------HHHHHHHHHHHHH--.-EEEEEETGG CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrG.heVrlatppg 36
+ ++++GT G+v+Pa+ + +e + G h V+l +p
+ sp|P0A2F3|NPD_SALTI 210 FIAIGTSGHVYPAAGFVHEAKLHGaHTVELNLEPS 244
+ 889****************9998845555666665 PP
+
+>> sp|C0MGC4|MUTL_STRS7 DNA mismatch repair protein mutL OS=Streptococcus equi subsp. zooepidemicus (strain H70) GN=mut
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.5 0.0 0.0014 0.77 56 127 .. 195 265 .. 152 268 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 14.5 bits; conditional E-value: 0.0014
+ ------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 56 klwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ +l + + l+++++g +l+ ak+ + ++d+++++gg+v+++ l+ a++++i + ++ + +l n
+ sp|C0MGC4|MUTL_STRS7 195 QLTQTS-GTGDLRQALAGIYGLNTAKKMIDISSADLDFEVGGFVSLPELTRANRNYITILINGRYIKNFLLN 265
+ 444444.6678999999******************************************9998887766666 PP
+
+>> sp|Q65KK2|MTNA_BACLD Methylthioribose-1-phosphate isomerase OS=Bacillus licheniformis (strain DSM 13 / ATCC 14580) G
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.1 0.0 0.00085 0.48 18 70 .. 204 255 .. 194 281 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 15.1 bits; conditional E-value: 0.00085
+ HHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSH CS
+ Glyco_transf_28 18 lareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkel 70
+ a+eL++ G++V+l+t +++ +e++++av +g+d + ++++++ +++ ++
+ sp|Q65KK2|MTNA_BACLD 204 TAWELMQGGIDVTLITDSMAAHTMKEKNISAVIVGAD-RIARNGDTANKIGTF 255
+ 69***********************************.999988777766655 PP
+
+>> sp|B0KTX5|MTNA_PSEPG Methylthioribose-1-phosphate isomerase OS=Pseudomonas putida (strain GB-1) GN=mtnA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.1 0.0 0.00089 0.5 19 63 .. 211 254 .. 204 293 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 15.1 bits; conditional E-value: 0.00089
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.- CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakles 63
+ a+eL ++G+ V+l++ +l++ +++g++ v +g+d + +a+++
+ sp|B0KTX5|MTNA_PSEPG 211 AWELANEGIPVTLCADSALAHLMKTKGITWVVVGAD-CIAANGDV 254
+ 9***********************************.66665543 PP
+
+>> sp|B1J5G5|MTNA_PSEPW Methylthioribose-1-phosphate isomerase OS=Pseudomonas putida (strain W619) GN=mtnA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.4 0.0 0.00072 0.41 19 64 .. 211 255 .. 204 291 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 15.4 bits; conditional E-value: 0.00072
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-H CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwaklesl 64
+ a+eL ++G+ V+l++ +l++ +++g++ v +g+d + +a+++
+ sp|B1J5G5|MTNA_PSEPW 211 AWELANEGIPVTLCADSALAHLMKSKGITWVVVGAD-CIAANGDVA 255
+ 9***********************************.666655444 PP
+
+>> sp|A5W7G2|MTNA_PSEP1 Methylthioribose-1-phosphate isomerase OS=Pseudomonas putida (strain F1 / ATCC 700007) GN=mtnA
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.1 0.0 0.0009 0.51 19 63 .. 211 254 .. 204 292 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 15.1 bits; conditional E-value: 0.0009
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.- CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakles 63
+ a+eL ++G+ V+l++ +l++ +++g++ v +g+d + +a+++
+ sp|A5W7G2|MTNA_PSEP1 211 AWELANEGIPVTLCADSALAHLMKTKGITWVVVGAD-CIAANGDV 254
+ 9***********************************.66665543 PP
+
+>> sp|A4ILL1|MTNA_GEOTN Methylthioribose-1-phosphate isomerase OS=Geobacillus thermodenitrificans (strain NG80-2) GN=mt
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.3 0.0 0.0015 0.86 18 69 .. 203 253 .. 197 287 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 14.3 bits; conditional E-value: 0.0015
+ HHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCS CS
+ Glyco_transf_28 18 lareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlke 69
+ a+eL+++G +V+l+t + + ++++++++a +g+d + ++++++ +++ +
+ sp|A4ILL1|MTNA_GEOTN 203 TAWELMQAGVDVTLITDNMAAQTIKAKNINAIIVGAD-RIAQNGDTANKIGT 253
+ 59***********************************.77776666555544 PP
+
+>> sp|B4U0J7|MUTL_STREM DNA mismatch repair protein mutL OS=Streptococcus equi subsp. zooepidemicus (strain MGCS10565)
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.5 0.0 0.0014 0.77 56 127 .. 195 265 .. 153 268 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 14.5 bits; conditional E-value: 0.0014
+ ------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 56 klwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ +l + + l+++++g +l+ ak+ + ++d+++++gg+v+++ l+ a++++i + ++ + +l n
+ sp|B4U0J7|MUTL_STREM 195 QLTQTS-GTGDLRQALAGIYGLNTAKKMIDISSADLDFEVGGFVSLPELTRANRNYITILINGRYIKNFLLN 265
+ 444444.6678999999******************************************9998887766666 PP
+
+>> sp|Q8FIM4|NPD_ECOL6 NAD-dependent deacetylase OS=Escherichia coli O6 GN=npdA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.2 0.0 0.0033 1.9 3 31 .. 210 239 .. 209 254 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 13.2 bits; conditional E-value: 0.0033
+ EE-------HHHHHHHHHHHHH--.-EEEE CS
+ Glyco_transf_28 3 laggGTrGdvePavAlareLqrrG.heVrl 31
+ ++++GT G+v+Pa+ + +e + G h V+l
+ sp|Q8FIM4|NPD_ECOL6 210 FIAIGTSGHVYPAAGFVHEAKLHGaHTVEL 239
+ 889**************9999888344445 PP
+
+>> sp|B2GFJ7|ILVC_KOCRD Ketol-acid reductoisomerase OS=Kocuria rhizophila (strain ATCC 9341 / DSM 348 / NBRC 103217 / D
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.6 0.0 0.0013 0.72 1 55 [. 20 83 .. 20 110 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 14.6 bits; conditional E-value: 0.0013
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----............S CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd............v 55
+ v+++g+G+ G+ A a L++ G +Vr++ +g +++ e++gl++ +i+ +
+ sp|B2GFJ7|ILVC_KOCRD 20 VAIIGYGSQGH-----AHALNLRDSGVDVRIGLNEGSKSRAkaEAEGLQVMSIAEAakeadvimiltpD 83
+ 57888888888.....7799********************99999****99998773333333333332 PP
+
+>> sp|B1VZ72|ILVC_STRGG Ketol-acid reductoisomerase OS=Streptomyces griseus subsp. griseus (strain JCM 4626 / NBRC 1335
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.7 0.0 0.0012 0.67 1 50 [. 20 66 .. 20 103 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 14.7 bits; conditional E-value: 0.0012
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavp 50
+ v+++g+G+ G+ A a L++ G +Vr++ ++g +++ ee+gl +v+
+ sp|B1VZ72|ILVC_STRGG 20 VAVLGYGSQGH-----AHALSLRDSGVDVRVGLHEGSKSKAkaEEQGLRVVT 66
+ 67889999999.....77999******************9988999998864 PP
+
+>> sp|Q59818|ILVC_STRAW Ketol-acid reductoisomerase OS=Streptomyces avermitilis GN=ilvC PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.5 0.0 0.0013 0.73 1 50 [. 20 66 .. 20 106 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 14.5 bits; conditional E-value: 0.0013
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavp 50
+ v+++g+G+ G+ A a L++ G +Vr++ ++g +++ ee+gl +v+
+ sp|Q59818|ILVC_STRAW 20 VAVIGYGSQGH-----AHALSLRDSGVDVRVGLHEGSKSKAkaEEQGLRVVT 66
+ 67888999998.....77999******************9988999998864 PP
+
+>> sp|Q731R7|MTNA_BACC1 Methylthioribose-1-phosphate isomerase OS=Bacillus cereus (strain ATCC 10987) GN=mtnA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.6 0.0 0.0052 2.9 19 65 .. 205 250 .. 203 298 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 12.6 bits; conditional E-value: 0.0052
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HH CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslk 65
+ +eL+++G++V+l+t + ++ + +++++a +g+d + a++++ +
+ sp|Q731R7|MTNA_BACC1 205 TWELKQAGIDVTLITDNTAAHAIQTKEINAIIVGAD-RIVANGDTAN 250
+ 59**********************************.6666554444 PP
+
+>> sp|B1GZW3|TPIS_UNCTG Triosephosphate isomerase OS=Uncultured termite group 1 bacterium phylotype Rs-D17 GN=tpiA PE=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.8 0.0 0.0011 0.6 10 85 .. 119 194 .. 117 214 .. 0.72
+
+ Alignments for each domain:
+ == domain 1 score: 14.8 bits; conditional E-value: 0.0011
+ --HHHHHHHHHHHHH---EEE.....EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 10 GdvePavAlareLqrrGheVr.....latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilk 85
+ d+ P+v ++++L++r+ +V+ + +gl++ + +a l++ +++p wa + + kt ++ +++ +++++ + +
+ sp|B1GZW3|TPIS_UNCTG 119 ADITPIVCVGETLKERENNVTfsvieKQVRNGLADLTlQQASLTVIAYEPV---WAIG-TGKTATPDQAQ--EVHSFIRKIY 194
+ 7********************77433346789999999*******999999...7744.44444443333..5555544443 PP
+
+>> sp|Q2IWS4|GLYA_RHOP2 Serine hydroxymethyltransferase OS=Rhodopseudomonas palustris (strain HaA2) GN=glyA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.5 0.0 0.011 6.3 13 108 .. 25 121 .. 22 126 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 11.5 bits; conditional E-value: 0.011
+ HHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC--- CS
+ Glyco_transf_28 13 ePavAlareLqrrGheVrlatppgleefv..eeagleavp.igpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggy 98
+ e a+A+ eL r+ heV+l+++++++++ e++g + ++ + +++++ +++++ae+ a+++ak+++ +++v g++
+ sp|Q2IWS4|GLYA_RHOP2 25 EIAAAIKGELGRQRHEVELIASENIVSRAvlEAQGSVMTNkYAEGYPGARYY-GGCEFVDVAEN-LAIERAKKLFGAGFANVQPNSGSQ 111
+ 7899**********************99887666654444577777777777.88889999998.999999999999999999999998 PP
+
+ -EEEE--HHH CS
+ Glyco_transf_28 99 vadlaliaal 108
+ + ++++a l
+ sp|Q2IWS4|GLYA_RHOP2 112 MNQAVFLALL 121
+ 8888888765 PP
+
+>> sp|A7GS56|MTNA_BACCN Methylthioribose-1-phosphate isomerase OS=Bacillus cereus subsp. cytotoxis (strain NVH 391-98)
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.6 0.0 0.0025 1.4 19 66 .. 205 251 .. 198 283 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 13.6 bits; conditional E-value: 0.0025
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHH CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslkt 66
+ +eL+++G +V+l+t + ++++++++++a +g+d + a++++ ++
+ sp|A7GS56|MTNA_BACCN 205 TWELREAGVDVTLITDNMAAHTIRTKNISAIIVGAD-RIVANGDTANK 251
+ 69**********************************.66666655444 PP
+
+>> sp|B7KF23|ILVC_CYAP7 Ketol-acid reductoisomerase OS=Cyanothece sp. (strain PCC 7424) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.3 0.0 0.0015 0.85 1 61 [. 20 76 .. 20 110 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 14.3 bits; conditional E-value: 0.0015
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------ CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakl 61
+ v+++g+G+ G+ A a L++ G++V+++ pg ++ eeagl++++++ ++a +
+ sp|B7KF23|ILVC_CYAP7 20 VAIIGYGSQGH-----AHALNLKDSGIDVIVGLYPGSKSAKkaEEAGLTVHSVADA-AAKADW 76
+ 57888888888.....7799***************99987777*********9998.555433 PP
+
+>> sp|A5W1E8|RNZ_PSEP1 Ribonuclease Z OS=Pseudomonas putida (strain F1 / ATCC 700007) GN=rnz PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.1 0.0 0.0018 1 23 126 .. 138 237 .. 132 244 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 14.1 bits; conditional E-value: 0.0018
+ HH---EEE.EEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHH CS
+ Glyco_transf_28 23 qrrGheVr.latppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallag 111
+ +r + V + t+ + e+++ + l+a+ i+ + +lw e k l+ +++g +l + l++ +p v ++g + +al+aa ++g
+ sp|A5W1E8|RNZ_PSEP1 138 SHRVPSVGfVFTEINPEPRLDIQRLDAEGIPRG-PLWG--ELAKGLTVTFNG--QLLNGNDYLRPSRPPQRVIVCGDNDKPALLAAVARG 222
+ 455555555556666666777777888888888.****..88**********..************************************ PP
+
+ HHHHHHHH----EEE CS
+ Glyco_transf_28 112 ipanvaEqngipglv 126
+ + + v+E+ +v
+ sp|A5W1E8|RNZ_PSEP1 223 ADVLVHEATFTQAVV 237
+ *******98766655 PP
+
+>> sp|B3QSP0|ILVC_CHLT3 Ketol-acid reductoisomerase OS=Chloroherpeton thalassium (strain ATCC 35110 / GB-78) GN=ilvC PE
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.5 0.0 0.0028 1.6 2 52 .. 20 67 .. 19 101 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 13.5 bits; conditional E-value: 0.0028
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE-- CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpig 52
+ +++g+G+ G+ A a L++ G +V+++ +++ +++v e+agl +++ +
+ sp|B3QSP0|ILVC_CHLT3 20 AVLGFGSQGH-----AHALNLKDSGMNVCVGLKENSASWVkaEKAGLMVEKTA 67
+ 6777777777.....7799**********************99***9887755 PP
+
+>> sp|O31662|MTNA_BACSU Methylthioribose-1-phosphate isomerase OS=Bacillus subtilis GN=mtnA PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 0.0 0.008 4.5 19 63 .. 205 248 .. 198 257 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.008
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.- CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakles 63
+ a+eL++ G++V+l+t +++ +e+ ++av +g+d + ++++++
+ sp|O31662|MTNA_BACSU 205 AWELMQGGIDVTLITDSMAAHTMKEKQISAVIVGAD-RIAKNGDT 248
+ 9***********************************.76665544 PP
+
+>> sp|C1F6Z5|ILVC_ACIC5 Ketol-acid reductoisomerase OS=Acidobacterium capsulatum (strain ATCC 51196 / DSM 11244 / JCM 7
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.0 0.1 0.004 2.2 1 60 [. 20 75 .. 20 105 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 13.0 bits; conditional E-value: 0.004
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S----- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwak 60
+ v+++g+G+ G+ A a +L++ G eVr++ p+ ++ ++agle+ +++ +wa
+ sp|C1F6Z5|ILVC_ACIC5 20 VAIIGYGSQGH-----AHALGLKDSGVEVRVGLAPNSRSIEkaKKAGLETGTVAEV-AAWAD 75
+ 67888999998.....77899*********999988876555599***99998888.77774 PP
+
+>> sp|Q2G3S7|PYRB_NOVAD Aspartate carbamoyltransferase OS=Novosphingobium aromaticivorans (strain DSM 12444) GN=pyrB PE
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 4.0 0.0 2.3 1.3e+03 63 125 .. 93 143 .. 67 145 .. 0.65
+ 2 ? 8.6 0.0 0.09 50 22 47 .. 199 225 .. 196 282 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 4.0 bits; conditional E-value: 2.3
+ -HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EE CS
+ Glyco_transf_28 63 slktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipgl 125
+ + ++ +++ +g ++ +d+ + ad+++i +++g+++ +aE+ + p l
+ sp|Q2G3S7|PYRB_NOVAD 93 MHAATSSVKKG-ET-----------LIDTAMTLNAMRADAIVIRHASSGAVRLIAEKVDCPVL 143
+ 44444444444.33...........33444445555699******************999976 PP
+
+ == domain 2 score: 8.6 bits; conditional E-value: 0.09
+ HHH---EEEEEETGGGHHHH.HH---E CS
+ Glyco_transf_28 22 LqrrGheVrlatppgleefv.eeagle 47
+ L + G eVr+++pp+l++ e+ g++
+ sp|Q2G3S7|PYRB_NOVAD 199 LTALGAEVRVCAPPALMPAEiEAMGVT 225
+ 8899*************9998999986 PP
+
+>> sp|Q96LB3|IFT74_HUMAN Intraflagellar transport protein 74 homolog OS=Homo sapiens GN=IFT74 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 3.2 0.2 4.2 2.4e+03 56 96 .. 349 387 .. 252 421 .. 0.79
+ 2 ? 9.6 0.0 0.044 25 28 87 .. 505 562 .. 499 572 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 3.2 bits; conditional E-value: 4.2
+ ------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC- CS
+ Glyco_transf_28 56 klwakleslktlkelaeglkalrkakeilkeakpdvvvgfg 96
+ +++ e+++++kel ++ +++ + e+++e k + + + +
+ sp|Q96LB3|IFT74_HUMAN 349 EHQG--EMNQKYKELKKREEHMDTFIETFEETKNQELKRKA 387
+ 5666..89**********99999999999999977665544 PP
+
+ == domain 2 score: 9.6 bits; conditional E-value: 0.044
+ EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 28 eVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ +++l t+++ +++ e++++e+++++++ l+++ + + l++l +++++l++ ++++ke+
+ sp|Q96LB3|IFT74_HUMAN 505 RMILSTHRNAFKKImEKQNIEYEALKTQ--LQENE-THSQLTNLERKWQHLEQNNFAMKEF 562
+ 46799***********************..66655.*****************99999987 PP
+
+>> sp|A9AZM5|ILVC_HERA2 Ketol-acid reductoisomerase OS=Herpetosiphon aurantiacus (strain ATCC 23779 / DSM 785) GN=ilvC
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.5 0.1 0.0028 1.6 1 57 [. 20 73 .. 20 110 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 13.5 bits; conditional E-value: 0.0028
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S-- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvkl 57
+ v+++g+G+ G+ A a L++ G +V ++ ++g +++ e+agl++ ++g +k+
+ sp|A9AZM5|ILVC_HERA2 20 VAIIGYGSQGH-----AHALNLKDSGVQVVVGLHEGSKSKAkaEAAGLQVLSVGEATKA 73
+ 57888888888.....7799*******************9999******9999987443 PP
+
+>> sp|B8HSQ9|SURE_CYAP4 5'-nucleotidase surE OS=Cyanothece sp. (strain PCC 7425 / ATCC 29141) GN=surE PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.2 0.0 0.0069 3.9 18 59 .. 19 69 .. 15 96 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 12.2 bits; conditional E-value: 0.0069
+ HHHHHHH---EEEEEETGGGHHHHHH---E.EEE----.........S---- CS
+ Glyco_transf_28 18 lareLqrrGheVrlatppgleefveeagle.avpigpd.........vklwa 59
+ la++L ++GheV ++++p+ e+ + +gl+ + pi ++ vk+wa
+ sp|B8HSQ9|SURE_CYAP4 19 LADTLAAAGHEV-MVVCPDRERSATGHGLTlFDPIRAEavaslfhpsVKAWA 69
+ 89**********.****************94566887766666666655555 PP
+
+>> sp|Q3SPL2|UVRC_NITWN UvrABC system protein C OS=Nitrobacter winogradskyi (strain Nb-255 / ATCC 25391) GN=uvrC PE=3 S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.9 0.0 0.0043 2.4 14 73 .. 601 661 .. 600 667 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 12.9 bits; conditional E-value: 0.0043
+ HHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE.----S------.-HHHCCSHHHH CS
+ Glyco_transf_28 14 PavAlareLqrrGheVrlatppgleefv.eeagleavp.igpdvklwakleslktlkelaeg 73
+ P + + ++L+++ h+ ++++++l+++ +eagl+ vp igp + +a l++++tlke+ +
+ sp|Q3SPL2|UVRC_NITWN 601 PVLYFIQRLRDEAHRFVIGSHRKLRRKDiREAGLQEVPgIGPA-RKRALLHHFGTLKEIERA 661
+ 6777899*****************99988**************.9999999*****998765 PP
+
+>> sp|A7Z3X0|MTNA_BACA2 Methylthioribose-1-phosphate isomerase OS=Bacillus amyloliquefaciens (strain FZB42) GN=mtnA PE=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.6 0.0 0.005 2.8 19 63 .. 205 248 .. 198 262 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 12.6 bits; conditional E-value: 0.005
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.- CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakles 63
+ a+eL++ G++V+l+t +++ +e++++av +g+d + ++++++
+ sp|A7Z3X0|MTNA_BACA2 205 AWELMQGGIDVTLITDSMAAHTMKEKHISAVIVGAD-RIAKNGDT 248
+ 9***********************************.76666554 PP
+
+>> sp|Q38W65|EFTS_LACSS Elongation factor Ts OS=Lactobacillus sakei subsp. sakei (strain 23K) GN=tsf PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 8.8 0.1 0.078 44 21 118 .. 40 134 .. 36 138 .. 0.77
+ 2 ? 3.9 0.0 2.5 1.4e+03 27 122 .. 177 262 .. 159 273 .. 0.65
+
+ Alignments for each domain:
+ == domain 1 score: 8.8 bits; conditional E-value: 0.078
+ HHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHH.HHHHHHHHHHHHHHHHHHC----EEEE--HHH CS
+ Glyco_transf_28 21 eLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglka.lrkakeilkeakpdvvvgfggyvadlaliaal 108
+ +L+++G +a + ++++++gl+ v+i++++ + +++s + ++ +++ka l+++ e+++++kp+ +++++ + +ia++
+ sp|Q38W65|EFTS_LACSS 40 ALREKG----MAKAAKKNDRIAAEGLAGVAIDGNTAAIVEVNSETDFVASNDQFKAlLKDIAETIAKNKPADMAAAEELPMGEGTIASS 124
+ 677777....99999999****************555555566666666666666525679999*******999999888888888887 PP
+
+ HHHHHHHHHH CS
+ Glyco_transf_28 109 lagipanvaE 118
+ + a++ E
+ sp|Q38W65|EFTS_LACSS 125 VINLTAVIGE 134
+ 7777666666 PP
+
+ == domain 2 score: 3.9 bits; conditional E-value: 2.5
+ -EEEEEETGGGHHHHHH---EEEE----.......S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHH CS
+ Glyco_transf_28 27 heVrlatppgleefveeagleavpigpd.......vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaal 108
+ h+V + ++ v + ++a++++ + +k+ + + ++ + eg ++++ l+e + +d+a+i ++
+ sp|Q38W65|EFTS_LACSS 177 HDVAMHVSAVNPQYVSREDVPAETLDHErevlteeTKNEG--KPENIIPKIVEG-----RVNKFLSEIS----------LNDQAFIKDS 248
+ 5555555555555555555555555555555554444444..556666666666.....5555555555..........78999***** PP
+
+ HHHHHHHHHHH--- CS
+ Glyco_transf_28 109 lagipanvaEqngi 122
+ ++++ +va +ng
+ sp|Q38W65|EFTS_LACSS 249 DQTVAQFVASKNGS 262
+ *********99973 PP
+
+>> sp|C3JYK1|TIG_PSEFS Trigger factor OS=Pseudomonas fluorescens (strain SBW25) GN=tig PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.2 0.0 0.0033 1.9 44 126 .. 121 199 .. 99 208 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 13.2 bits; conditional E-value: 0.0033
+ ---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEE CS
+ Glyco_transf_28 44 agleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglv 126
+ +g++++ + ++ ++ l++++e++++ ++++++ e +++++++ ++f+g v++ a+ + ++ g ++++ + ipg+
+ sp|C3JYK1|TIG_PSEFS 121 DGIAIERLSAE--VAD--SDLDNMLEILRKQNTRFEVAERAAQNEDQLNIDFVGKVDGEAFAGGSAKGTQLVLGSNRMIPGFE 199
+ 56677777777..666..5899**********************************************************985 PP
+
+>> sp|Q1GZA6|BIOB_METFK Biotin synthase OS=Methylobacillus flagellatus (strain KT / ATCC 51484 / DSM 6875) GN=bioB PE=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.4 0.0 0.003 1.7 11 97 .. 131 219 .. 131 299 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 13.4 bits; conditional E-value: 0.003
+ -HHHHHHHHHHHHH---EEE..EE.ETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC- CS
+ Glyco_transf_28 11 dvePavAlareLqrrGheVr..la.tppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfg 96
+ d+eP +A+ re+++ G e + l+ ++g +e+++eagl+++ ++d +++++ + t ++ +++l++l +++e + ++ ++g+g
+ sp|Q1GZA6|BIOB_METFK 131 DLEPVLAMIREVKAMGLETCatLGmLKDGQAEQLKEAGLDYYNHNLD-TAPEYYGEVITTRTYQDRLDTLDRVREQDINVCCGGIIGMG 218
+ 89********************873578888899*********9999.77776666666677777777777776666666666666666 PP
+
+ - CS
+ Glyco_transf_28 97 g 97
+ +
+ sp|Q1GZA6|BIOB_METFK 219 E 219
+ 4 PP
+
+>> sp|Q635P7|MTNA2_BACCZ Methylthioribose-1-phosphate isomerase 2 OS=Bacillus cereus (strain ZK / E33L) GN=mtnA2 PE=3 S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.8 0.0 0.0044 2.5 19 66 .. 205 251 .. 203 311 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 12.8 bits; conditional E-value: 0.0044
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHH CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslkt 66
+ +eL+++G++V+l+t + ++ + +++++a +g+d + a++++ ++
+ sp|Q635P7|MTNA2_BACCZ 205 TWELKQAGIDVTLITDNTAAHAIQTKEINAIIVGAD-RIVANGDTANK 251
+ 59**********************************.66665544444 PP
+
+>> sp|O48676|HTGT_ARATH N-hydroxythioamide S-beta-glucosyltransferase OS=Arabidopsis thaliana GN=UGT74B1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.3 0.0 0.0032 1.8 1 73 [. 12 87 .. 12 130 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 13.3 bits; conditional E-value: 0.0032
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....S------.-HHHCCSHHHH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpd.....vklwakleslktlkelaeg 73
+ vv++ ++ G++ P v +a++L + +V++at+ ++ +++ l+++pi + ++ + +s++t++e ++
+ sp|O48676|HTGT_ARATH 12 VVILPYPVQGHLNPMVQFAKRLVSKNVKVTIATTTYTASSITTPSLSVEPISDGfdfipIGIPG--FSVDTYSESFKL 87
+ 678889999******************************************9987777744444..444444444444 PP
+
+>> sp|Q8YRC9|THIOG_ANASP Bifunctional protein thiO/thiG OS=Anabaena sp. (strain PCC 7120) GN=thiO/thiG PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 3.9 0.0 2.5 1.4e+03 16 33 .. 15 32 .. 12 74 .. 0.80
+ 2 ? 7.1 0.0 0.25 1.4e+02 87 133 .. 315 361 .. 290 366 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 3.9 bits; conditional E-value: 2.5
+ HHHHHHHHH---EEEEEE CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlat 33
+ +A+a+eL+ rG eV+++
+ sp|Q8YRC9|THIOG_ANASP 15 LAIAVELKLRGAEVTVIC 32
+ 8*************9543 PP
+
+ == domain 2 score: 7.1 bits; conditional E-value: 0.25
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGG CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprr 133
+ ++p++++++g y ++ +l ++a i+ + Eq + p+l++++++r
+ sp|Q8YRC9|THIOG_ANASP 315 HCPNLTLATGHYRNGILLAPITAALIADLIVEQKSDPLLSHFHYSRS 361
+ 78999**************************************9985 PP
+
+>> sp|Q8DW43|ILVC_STRMU Ketol-acid reductoisomerase OS=Streptococcus mutans GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.0 0.019 11 1 54 [. 21 70 .. 21 103 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.019
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGG.GHHHHHH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppg.leefveeagleavpigpd 54
+ ++++g+G+ G+ A a+ L++ Gh+V++++ g ++ +e+g +++++g
+ sp|Q8DW43|ILVC_STRMU 21 IAVIGYGSQGH-----AHAQNLRDSGHDVIIGVRHGkSFDKAKEDGFDTYEVGEA 70
+ 57888899888.....88**************96541445557777777776655 PP
+
+>> sp|Q81MJ6|MTNA2_BACAN Methylthioribose-1-phosphate isomerase 2 OS=Bacillus anthracis GN=mtnA2 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.9 0.0 0.0041 2.3 19 66 .. 205 251 .. 203 308 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 12.9 bits; conditional E-value: 0.0041
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHH CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslkt 66
+ +eL+++G++V+l+t + ++ + +++++a +g+d + a++++ ++
+ sp|Q81MJ6|MTNA2_BACAN 205 TWELKQAGIDVTLITDNTAAHAIQTKEISAIIVGAD-RIVANGDTANK 251
+ 59**********************************.66665544444 PP
+
+>> sp|Q6N693|GLYA1_RHOPA Serine hydroxymethyltransferase 1 OS=Rhodopseudomonas palustris GN=glyA1 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.2 0.0 0.014 7.7 13 107 .. 24 119 .. 21 125 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 11.2 bits; conditional E-value: 0.014
+ HHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC-- CS
+ Glyco_transf_28 13 ePavAlareLqrrGheVrlatppgleefv..eeagleavp.igpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfgg 97
+ e a+A+ eL r+ heV+l+++++++++ e++g + ++ + +++++ +++++ae+ a+ +ak+++ ++++v g+
+ sp|Q6N693|GLYA1_RHOPA 24 EIAAAIRGELGRQRHEVELIASENIVSRAvlEAQGSVMTNkYAEGYPGNRYY-GGCEFVDVAEN-LAIDRAKKLFGANFANVQPNSGS 109
+ 7899**********************99886666654444577776677777.78888888888.89999999999999999988888 PP
+
+ --EEEE--HH CS
+ Glyco_transf_28 98 yvadlaliaa 107
+ + + ++++a
+ sp|Q6N693|GLYA1_RHOPA 110 QMNQAVFLAL 119
+ 8888888876 PP
+
+>> sp|B0C915|MURD_ACAM1 UDP-N-acetylmuramoylalanine--D-glutamate ligase OS=Acaryochloris marina (strain MBIC 11017) GN=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.1 0.0 0.0035 2 16 73 .. 14 69 .. 12 109 .. 0.75
+
+ Alignments for each domain:
+ == domain 1 score: 13.1 bits; conditional E-value: 0.0035
+ HHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHH CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlkelaeg 73
+ +A ar L+r+G++V ++ e v +++ l+a+ i++ l+ k+ sl++l el
+ sp|B0C915|MURD_ACAM1 14 IAAARLLRREGWQVSVGDAGHSEGLVaTQKTLAAEGIPVH--LNLKF-SLSALAELSLD 69
+ 7999**********************************99..44444.55665555444 PP
+
+>> sp|Q2KA25|GLYA_RHIEC Serine hydroxymethyltransferase OS=Rhizobium etli (strain CFN 42 / ATCC 51251) GN=glyA PE=3 SV=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.4 0.0 0.0061 3.5 13 108 .. 20 116 .. 16 121 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 12.4 bits; conditional E-value: 0.0061
+ HHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC--- CS
+ Glyco_transf_28 13 ePavAlareLqrrGheVrlatppgleefv..eeagleavp.igpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggy 98
+ e + A+++eL r+ he++l+++++++++ e++g + ++ + +++++ ++++ae+ a+++ak+++ ++++v g++
+ sp|Q2KA25|GLYA_RHIEC 20 EIFGAIGKELGRQRHEIELIASENIVSRAvlEAQGSIMTNkYAEGYPGKRYY-GGCQFVDIAEE-LAIERAKKLFGVNFANVQPNSGSQ 106
+ 56779*********************99887766655544588888888888.88899999999.999999999999999999999999 PP
+
+ -EEEE--HHH CS
+ Glyco_transf_28 99 vadlaliaal 108
+ + ++++a l
+ sp|Q2KA25|GLYA_RHIEC 107 MNQAVFLALL 116
+ 9999998865 PP
+
+>> sp|Q214H7|GLYA_RHOPB Serine hydroxymethyltransferase OS=Rhodopseudomonas palustris (strain BisB18) GN=glyA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.5 0.0 0.011 6.5 13 107 .. 32 127 .. 28 133 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 11.5 bits; conditional E-value: 0.011
+ HHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC--- CS
+ Glyco_transf_28 13 ePavAlareLqrrGheVrlatppgleefv..eeagleavp.igpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggy 98
+ e a+A+a eL r+ he++l+++++++++ e++g + ++ + ++ ++ +++++ae+ a+++ak+++ +++v g++
+ sp|Q214H7|GLYA_RHOPB 32 EIAAAIAGELGRQRHEIELIASENIVSRAvmEAQGSVMTNkYAEGYPGHRYY-GGCEFVDVAEN-LAIERAKKLFGAGFANVQPNSGSQ 118
+ 789**********************999888777755554477775666666.77788888888.899999999999999988888888 PP
+
+ -EEEE--HH CS
+ Glyco_transf_28 99 vadlaliaa 107
+ + ++++a
+ sp|Q214H7|GLYA_RHOPB 119 MNQAVFLAL 127
+ 888888876 PP
+
+>> sp|B9DW70|MUTL_STRU0 DNA mismatch repair protein mutL OS=Streptococcus uberis (strain ATCC BAA-854 / 0140J) GN=mutL
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.2 0.0 0.0067 3.8 65 127 .. 203 265 .. 151 268 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 12.2 bits; conditional E-value: 0.0067
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ + lk++ +g +l+ ak+ ++ ++d+++++ gyv+++ l+ a++++i + ++ + +l n
+ sp|B9DW70|MUTL_STRU0 203 GDLKQAIAGIYGLNTAKKMIEISNADLDFEVSGYVSLPELTRANRNYITILINGRYIKNFLLN 265
+ 5788888999999*************************************9998887766666 PP
+
+>> sp|A0RI38|MTNA2_BACAH Methylthioribose-1-phosphate isomerase 2 OS=Bacillus thuringiensis (strain Al Hakam) GN=mtnA2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.8 0.0 0.0046 2.6 19 66 .. 205 251 .. 203 307 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 12.8 bits; conditional E-value: 0.0046
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHH CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslkt 66
+ +eL+++G++V+l+t + ++ + +++++a +g+d + a++++ ++
+ sp|A0RI38|MTNA2_BACAH 205 TWELKQAGIDVTLITDNTAAHAIQTKEINAIIVGAD-RIVANGDTANK 251
+ 59**********************************.66665544444 PP
+
+>> sp|Q6HED3|MTNA2_BACHK Methylthioribose-1-phosphate isomerase 2 OS=Bacillus thuringiensis subsp. konkukian GN=mtnA2 P
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.8 0.0 0.0046 2.6 19 66 .. 205 251 .. 203 307 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 12.8 bits; conditional E-value: 0.0046
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHH CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslkt 66
+ +eL+++G++V+l+t + ++ + +++++a +g+d + a++++ ++
+ sp|Q6HED3|MTNA2_BACHK 205 TWELKQAGIDVTLITDNTAAHAIQTKEINAIIVGAD-RIVANGDTANK 251
+ 59**********************************.66665544444 PP
+
+>> sp|Q1QIR5|UVRC_NITHX UvrABC system protein C OS=Nitrobacter hamburgensis (strain X14 / DSM 10229) GN=uvrC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.9 0.0 0.0042 2.4 14 73 .. 602 662 .. 601 669 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 12.9 bits; conditional E-value: 0.0042
+ HHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE.----S------.-HHHCCSHHHH CS
+ Glyco_transf_28 14 PavAlareLqrrGheVrlatppgleefv.eeagleavp.igpdvklwakleslktlkelaeg 73
+ P + + ++L+++ h+ ++++++l+++ +eagl+ vp igp + +a l++++tlke+ +
+ sp|Q1QIR5|UVRC_NITHX 602 PVLYFIQRLRDEAHRFVIGSHRKLRRKDiREAGLQEVPgIGPA-RKRALLHHFGTLKEIERA 662
+ 6777899*****************99988**************.9999999*****998765 PP
+
+>> sp|A8AVN4|ILVC_STRGC Ketol-acid reductoisomerase OS=Streptococcus gordonii (strain Challis / ATCC 35105 / CH1 / DL1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.9 0.0 0.0085 4.8 1 50 [. 21 66 .. 21 118 .. 0.75
+
+ Alignments for each domain:
+ == domain 1 score: 11.9 bits; conditional E-value: 0.0085
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGH.HHHHH---EEEE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgle.efveeagleavp 50
+ ++++g+G+ G+ A a+ L++ Gh+V++++ pg ++ +e+g ++++
+ sp|A8AVN4|ILVC_STRGC 21 IAVIGYGSQGH-----AHAQNLRDTGHDVIIGVRPGKSfDKAKEDGFDTYT 66
+ 57888889888.....88***************997431333666655555 PP
+
+>> sp|Q7V5V5|MURD_PROMM UDP-N-acetylmuramoylalanine--D-glutamate ligase OS=Prochlorococcus marinus (strain MIT 9313) GN
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.4 0.0 0.024 13 17 68 .. 40 90 .. 34 134 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 10.4 bits; conditional E-value: 0.024
+ HHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCC CS
+ Glyco_transf_28 17 AlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlk 68
+ +la L+ +G+ V+l+ p +l +f+ + l+av i p+ +w + +l++l+
+ sp|Q7V5V5|MURD_PROMM 40 SLAADLRLQGIAVELGKPLELNSFIpLLDQLDAVVISPG-IAWDHP-TLTALR 90
+ 7999***********************************.777766.666665 PP
+
+>> sp|Q47SB6|ILVC_THEFY Ketol-acid reductoisomerase OS=Thermobifida fusca (strain YX) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.9 0.1 0.0043 2.4 1 50 [. 21 67 .. 21 91 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 12.9 bits; conditional E-value: 0.0043
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavp 50
+ v+++g+G+ G+ A a L++ G +Vr++ p+ +++ ee+gl +v+
+ sp|Q47SB6|ILVC_THEFY 21 VAVIGYGSQGH-----AHALSLRDSGVDVRVGLPESSKSRAkaEEDGLRVVT 67
+ 67888999998.....77999******************9999999998875 PP
+
+>> sp|A4FMQ5|ILVC_SACEN Ketol-acid reductoisomerase OS=Saccharopolyspora erythraea (strain NRRL 23338) GN=ilvC PE=3 SV=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.3 0.0 0.0032 1.8 1 47 [. 21 64 .. 21 92 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 13.3 bits; conditional E-value: 0.0032
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---E CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagle 47
+ v+++g+G+ G+ A a L++ G +Vr++ p+g +++ ee+gl
+ sp|A4FMQ5|ILVC_SACEN 21 VAVIGYGSQGH-----AHALSLRDSGADVRIGLPEGSKSRAkaEEEGLR 64
+ 67888999998.....77999*******************987888875 PP
+
+>> sp|Q5V3R4|TRM56_HALMA tRNA ribose 2'-O-methyltransferase aTrm56 OS=Haloarcula marismortui GN=rrnAC0857 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.8 0.0 0.0022 1.3 30 121 .. 11 103 .. 1 116 [. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 13.8 bits; conditional E-value: 0.0022
+ EEEETGGGHHHH.HH---EEEE----....S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHH CS
+ Glyco_transf_28 30 rlatppgleefv.eeagleavpigpd....vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagi 112
+ rl+ pg +e+ + gl+a+++g+d +++ ++ +t+ ++ +++ + +++ + ++++ ++ +f+g+v l +++ + +++
+ sp|Q5V3R4|TRM56_HALMA 11 RLGHRPGRDERMtTHVGLTARALGADkvvlANAAR--NQADTVIDITDRFGGPFDVASTEEPKR--LIRDFEGRVVHLTMYGEPVQEV 94
+ 3999999999999**************98544445..699999999999888888888777776..8999****************** PP
+
+ HHHHHHH-- CS
+ Glyco_transf_28 113 panvaEqng 121
+ a v E+n
+ sp|Q5V3R4|TRM56_HALMA 95 EADVREANT 103
+ *****9985 PP
+
+>> sp|B8GW68|ENO_CAUCN Enolase OS=Caulobacter crescentus (strain NA1000 / CB15N) GN=eno PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 2.9 0.0 5.1 2.9e+03 24 67 .. 105 146 .. 104 172 .. 0.78
+ 2 ? 9.0 0.0 0.066 37 13 48 .. 184 219 .. 183 276 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 2.9 bits; conditional E-value: 5.1
+ H---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHC CS
+ Glyco_transf_28 24 rrGheVrlatppgleefv.eeagleavpigpdvklwakleslktl 67
+ r G + +l+++ + ++ e+agl+ +++ ++ ++a++ ++ +
+ sp|B8GW68|ENO_CAUCN 105 RLGANAILGVSLATAKAAaESAGLPLYKYVGG--VNARV-LPTPM 146
+ 67999999***99999999*********8887..33333.34444 PP
+
+ == domain 2 score: 9.0 bits; conditional E-value: 0.066
+ HHHHHHHHHHHH---EEEEEETGGGHHHHHH---EE CS
+ Glyco_transf_28 13 ePavAlareLqrrGheVrlatppgleefveeaglea 48
+ e + Al ++L+++Gh+ ++ + g+++ +++a+ +
+ sp|B8GW68|ENO_CAUCN 184 EIFHALKKALKDAGHNTNVGDEGGFAPNLASAEAAL 219
+ 6799**********************9996665444 PP
+
+>> sp|Q9A7J9|ENO_CAUCR Enolase OS=Caulobacter crescentus GN=eno PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 2.9 0.0 5.1 2.9e+03 24 67 .. 105 146 .. 104 172 .. 0.78
+ 2 ? 9.0 0.0 0.066 37 13 48 .. 184 219 .. 183 276 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 2.9 bits; conditional E-value: 5.1
+ H---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHC CS
+ Glyco_transf_28 24 rrGheVrlatppgleefv.eeagleavpigpdvklwakleslktl 67
+ r G + +l+++ + ++ e+agl+ +++ ++ ++a++ ++ +
+ sp|Q9A7J9|ENO_CAUCR 105 RLGANAILGVSLATAKAAaESAGLPLYKYVGG--VNARV-LPTPM 146
+ 67999999***99999999*********8887..33333.34444 PP
+
+ == domain 2 score: 9.0 bits; conditional E-value: 0.066
+ HHHHHHHHHHHH---EEEEEETGGGHHHHHH---EE CS
+ Glyco_transf_28 13 ePavAlareLqrrGheVrlatppgleefveeaglea 48
+ e + Al ++L+++Gh+ ++ + g+++ +++a+ +
+ sp|Q9A7J9|ENO_CAUCR 184 EIFHALKKALKDAGHNTNVGDEGGFAPNLASAEAAL 219
+ 6799**********************9996665444 PP
+
+>> sp|Q5V3F0|MAMA2_HALMA Methylaspartate mutase S chain 2 OS=Haloarcula marismortui GN=mamA2 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.7 0.1 0.0049 2.8 1 54 [. 4 59 .. 4 131 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 12.7 bits; conditional E-value: 0.0049
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHH.HH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefv.eeagleavpigpd 54
+ v+l ++G+ +v + l r++ ++G +V l+++ ef+ ++++ +a++i +
+ sp|Q5V3F0|MAMA2_HALMA 4 VILGVIGSDAHVVGITILERAFEAAGFNVVnLGVQSSQSEFIdAADEHDAEAILVS 59
+ 578899************************************98888888887666 PP
+
+>> sp|B1LZ88|GLYA_METRJ Serine hydroxymethyltransferase OS=Methylobacterium radiotolerans (strain ATCC 27329 / DSM 1819
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.9 0.0 0.0086 4.9 11 45 .. 24 60 .. 17 125 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 11.9 bits; conditional E-value: 0.0086
+ -HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH-- CS
+ Glyco_transf_28 11 dvePavAlareLqrrGheVrlatppgleefv..eeag 45
+ d e a A+a+eL r+ he++l+++++++++ e++g
+ sp|B1LZ88|GLYA_METRJ 24 DPEIAEAVAKELGRQQHEIELIASENIVSRAvlEAQG 60
+ 557888*********************9998755554 PP
+
+>> sp|P94966|BIOB_METSK Biotin synthase OS=Methylobacillus sp. (strain KT1) GN=bioB PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.0 0.0 0.0038 2.1 11 97 .. 128 216 .. 128 242 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 13.0 bits; conditional E-value: 0.0038
+ -HHHHHHHHHHHHH---EEE..EE.ETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC- CS
+ Glyco_transf_28 11 dvePavAlareLqrrGheVr..la.tppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfg 96
+ d+eP +A+ re+++ G e + l+ ++g +e+++eagl+++ ++d +++++ + t ++ +++l++l +++e + ++ ++g+g
+ sp|P94966|BIOB_METSK 128 DLEPVLAMIREVKAMGLETCatLGmLKDGQAEQLKEAGLDYYNHNLD-TAPEYYGEVITTRTYQDRLDTLDRVREQDINVCCGGIIGMG 215
+ 89********************873578888899*********9999.88877767777777777777777777777777777777766 PP
+
+ - CS
+ Glyco_transf_28 97 g 97
+ +
+ sp|P94966|BIOB_METSK 216 E 216
+ 5 PP
+
+>> sp|Q3SHE4|ILVC_THIDA Ketol-acid reductoisomerase OS=Thiobacillus denitrificans (strain ATCC 25259) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.9 0.1 0.0043 2.4 1 70 [. 19 81 .. 19 119 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 12.9 bits; conditional E-value: 0.0043
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCCSH CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlkel 70
+ v+++g+G+ G+ A a+ L++ G +V++a pg ++ e+agl++++++ + a l +++++
+ sp|Q3SHE4|ILVC_THIDA 19 VAIVGYGSQGH-----AHANNLKDSGVDVTVALRPGSASAKkaENAGLTVKSVPEA-VAGA---DLVMILTP 81
+ 67888999998.....88******************9887777********99988.2222...33333333 PP
+
+>> sp|Q07MT9|GLYA_RHOP5 Serine hydroxymethyltransferase OS=Rhodopseudomonas palustris (strain BisA53) GN=glyA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.1 0.0 0.015 8.5 13 107 .. 25 120 .. 20 126 .. 0.75
+
+ Alignments for each domain:
+ == domain 1 score: 11.1 bits; conditional E-value: 0.015
+ HHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC--- CS
+ Glyco_transf_28 13 ePavAlareLqrrGheVrlatppgleefv..eeagleavp.igpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggy 98
+ e a+A+a eL r+ he++l+++++++++ e++g + ++ + ++ ++ +++++ae+ a+ +ak+++ +++v g++
+ sp|Q07MT9|GLYA_RHOP5 25 EIAAAIAGELGRQRHEIELIASENIVSRAvlEAQGSVMTNkYAEGYPGHRYY-GGCEFVDVAEN-LAIDRAKKLFGAGFANVQPNSGSQ 111
+ 789***********************99886666644444466665555555.67777777777.788888888888888888777777 PP
+
+ -EEEE--HH CS
+ Glyco_transf_28 99 vadlaliaa 107
+ + ++++a
+ sp|Q07MT9|GLYA_RHOP5 112 MNQAVFLAL 120
+ 777777765 PP
+
+>> sp|A9VRK3|MTNA1_BACWK Methylthioribose-1-phosphate isomerase 1 OS=Bacillus weihenstephanensis (strain KBAB4) GN=mtnA
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.7 0.0 0.0047 2.6 17 63 .. 202 247 .. 193 332 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 12.7 bits; conditional E-value: 0.0047
+ HHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.- CS
+ Glyco_transf_28 17 AlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakles 63
+ a eLqr+G++V+++t +++++v + +++av +g+d +++a+++
+ sp|A9VRK3|MTNA1_BACWK 202 LTALELQRAGIDVTVITD-NMAAMVmSQGKIDAVIVGCD-RVAANGDV 247
+ 5699*********98875.6777777*************.77776643 PP
+
+>> sp|A9GW78|ILVC_SORC5 Ketol-acid reductoisomerase OS=Sorangium cellulosum (strain So ce56) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.7 0.1 0.01 5.6 1 54 [. 20 70 .. 20 105 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 11.7 bits; conditional E-value: 0.01
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ v+++g+G+ G+ A a L++ G V++a p+g +++ +agl++ ++
+ sp|A9GW78|ILVC_SORC5 20 VAIVGYGSQGH-----AHALNLRDSGVTVIVALPEGSKSRPkaQAAGLQVATVSEA 70
+ 67889999998.....7799********************9988999999887655 PP
+
+>> sp|Q5YRW2|ILVC_NOCFA Ketol-acid reductoisomerase OS=Nocardia farcinica GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 0.0 0.0079 4.5 1 59 [. 21 75 .. 21 103 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.0079
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwa 59
+ v+++g+G+ G+ A L++ G eVr++ +g +++ eeagl++ +++v +wa
+ sp|Q5YRW2|ILVC_NOCFA 21 VAVIGYGSQGH-----AHSLSLRDSGVEVRVGLAEGSKSRPkaEEAGLTV-GTPAEVSAWA 75
+ 56778888888.....55678*********9999999999888*****97.4444446666 PP
+
+>> sp|A3CQ86|ILVC_STRSV Ketol-acid reductoisomerase OS=Streptococcus sanguinis (strain SK36) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.7 0.0 0.01 5.6 1 36 [. 21 51 .. 21 117 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 11.7 bits; conditional E-value: 0.01
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGG CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppg 36
+ ++++g+G+ G+ A a+ L++ Gh+V++++ pg
+ sp|A3CQ86|ILVC_STRSV 21 IAVIGYGSQGH-----AHAQNLRDTGHDVIIGVRPG 51
+ 57888889888.....88***************997 PP
+
+>> sp|Q21AW5|UVRC_RHOPB UvrABC system protein C OS=Rhodopseudomonas palustris (strain BisB18) GN=uvrC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.2 0.0 0.013 7.6 14 72 .. 611 670 .. 610 676 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 11.2 bits; conditional E-value: 0.013
+ HHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE.----S------.-HHHCCSHHH CS
+ Glyco_transf_28 14 PavAlareLqrrGheVrlatppgleefv.eeagleavp.igpdvklwakleslktlkelae 72
+ P + + ++L+++ h+ ++++++l+++ +eagl+ p igp + +a l++++tlke+ +
+ sp|Q21AW5|UVRC_RHOPB 611 PVLYFIQRLRDEAHRFVIGSHRKLRKKDiREAGLQEIPgIGPS-RKRALLHHFGTLKEIER 670
+ 6777899******************9988**************.9999999*****99876 PP
+
+>> sp|Q81IK7|MTNA1_BACCR Methylthioribose-1-phosphate isomerase 1 OS=Bacillus cereus (strain ATCC 14579 / DSM 31) GN=mt
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.4 0.0 0.0061 3.5 17 63 .. 202 247 .. 193 276 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 12.4 bits; conditional E-value: 0.0061
+ HHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.- CS
+ Glyco_transf_28 17 AlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakles 63
+ a eLqr+G++V+++t +++++v + +++av +g+d +++a+++
+ sp|Q81IK7|MTNA1_BACCR 202 LTALELQRAGIDVTVITD-NMAAMVmSQGKIDAVIVGCD-RVAANGDV 247
+ 5699*********98875.6777777*************.88887744 PP
+
+>> sp|Q5FNN2|PYRG_GLUOX CTP synthase OS=Gluconobacter oxydans GN=pyrG PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 2.8 0.0 5.6 3.2e+03 15 31 .. 21 37 .. 19 42 .. 0.92
+ 2 ? 6.7 0.0 0.34 1.9e+02 2 45 .. 137 183 .. 136 223 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 2.8 bits; conditional E-value: 5.6
+ HHHHHHHHHH---EEEE CS
+ Glyco_transf_28 15 avAlareLqrrGheVrl 31
+ ++Ala Lq+rG++Vr+
+ sp|Q5FNN2|PYRG_GLUOX 21 SAALAALLQARGYKVRM 37
+ 589*************8 PP
+
+ == domain 2 score: 6.7 bits; conditional E-value: 0.34
+ EEE-------HH..HHHHHHHHHHH.---EEEEEETGGGHHHHHH-- CS
+ Glyco_transf_28 2 vlaggGTrGdve..PavAlareLqr.rGheVrlatppgleefveeag 45
+ ++ +gGT Gd+e P++ r+L++ Gh +++++ l + +++ag
+ sp|Q5FNN2|PYRG_GLUOX 137 LVEIGGTVGDIEslPFLEAIRQLRNdLGHAQTMCVHLTLLPYIPAAG 183
+ 66789******98899*99****973699999******999995555 PP
+
+>> sp|Q2S9V9|ILVC_HAHCH Ketol-acid reductoisomerase OS=Hahella chejuensis (strain KCTC 2396) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 0.1 0.0076 4.3 1 55 [. 19 82 .. 19 128 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.0076
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----............S CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd............v 55
+ v+++g+G+ G+ A a+ L++ G +V+++ +g ++ e+agl++++++ +
+ sp|Q2S9V9|ILVC_HAHCH 19 VAIIGYGSQGH-----AHANNLKDSGVDVCVGLRKGSGSWAkaENAGLAVKEVAEAvagadvvmiltpD 82
+ 57888888888.....88**********************999*******9998873333333333332 PP
+
+>> sp|Q17QH8|D39U1_BOVIN Epimerase family protein SDR39U1 OS=Bos taurus GN=SDR39U1 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.9 0.0 0.0042 2.4 2 79 .. 3 75 .. 2 121 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 12.9 bits; conditional E-value: 0.0042
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHH CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrk 79
+ vl+ggGT+ + Al + L++rGheV+l++ + ++++ + l++ ++ ++ +l +++++++++++a ++
+ sp|Q17QH8|D39U1_BOVIN 3 VLVGGGTG---FIGTALTQLLKARGHEVTLISRKPGPDRITWDDLTTSGLPRC-DAAVNL-AGENILNPLRRWNAAFQ 75
+ 67888888...999****************99999999999999999998888.666666.88888888888666554 PP
+
+>> sp|Q2J6V2|ILVC_FRASC Ketol-acid reductoisomerase OS=Frankia sp. (strain CcI3) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.5 0.1 0.0057 3.2 1 47 [. 20 63 .. 20 100 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 12.5 bits; conditional E-value: 0.0057
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---E CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagle 47
+ v+++g+G+ G+ A a L++ G +Vr++ p + +++ ee+gl
+ sp|Q2J6V2|ILVC_FRASC 20 VAVIGYGSQGH-----AHALNLRDSGVDVRVGLPADSRSRAraEEEGLR 63
+ 67888999998.....7799******************99987888876 PP
+
+>> sp|A1WUW3|ILVC_HALHL Ketol-acid reductoisomerase OS=Halorhodospira halophila (strain DSM 244 / SL1) GN=ilvC PE=3 SV=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.8 0.0 0.038 22 1 54 [. 19 69 .. 19 98 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 9.8 bits; conditional E-value: 0.038
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ v+++g+G+ G+ A a+ L++ G +V ++ pg + eagle+ +++
+ sp|A1WUW3|ILVC_HALHL 19 VAIIGYGSQGH-----AHANNLKESGVNVVVGLRPGSSSAAkaQEAGLEVASVEEA 69
+ 57888888888.....88*******************99998899***99988766 PP
+
+>> sp|A8LMD0|PUR9_DINSH Bifunctional purine biosynthesis protein purH OS=Dinoroseobacter shibae (strain DFL 12) GN=purH
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.8 0.1 0.0093 5.3 15 70 .. 20 71 .. 13 99 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 11.8 bits; conditional E-value: 0.0093
+ HHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSH CS
+ Glyco_transf_28 15 avAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkel 70
+ +v+l+++L +rG V+l ++ g ++ ++eagl++v + +++++ ++ + +k+l
+ sp|A8LMD0|PUR9_DINSH 20 LVPLGQALAARG--VELLSTGGTAKALREAGLDVVDVSDVTGFPE--MMDGRVKTL 71
+ 79**********..**********************999977777..565555554 PP
+
+>> sp|C5BAT0|GCSP_EDWI9 Glycine dehydrogenase [decarboxylating] OS=Edwardsiella ictaluri (strain 93-146) GN=gcvP PE=3 S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.8 0.1 0.0091 5.1 1 37 [. 215 251 .. 215 306 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 11.8 bits; conditional E-value: 0.0091
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGG CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgl 37
+ v+l +GT Gd++ + Al++ L++rG ++a+ p
+ sp|C5BAT0|GCSP_EDWI9 215 VLLQQVGTQGDLHDYRALMDSLRERGVITCMAADPLA 251
+ 567789***************************9965 PP
+
+>> sp|C1B2M1|ILVC_RHOOB Ketol-acid reductoisomerase OS=Rhodococcus opacus (strain B4) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.5 0.0 0.011 6.3 1 48 [. 21 65 .. 21 102 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.5 bits; conditional E-value: 0.011
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeaglea 48
+ v+++g+G+ G+ A L++ G +Vr++ ++g +++ ee+gl++
+ sp|C1B2M1|ILVC_RHOOB 21 VAVIGYGSQGH-----AHSLSLRDSGVDVRIGLKEGSKSRAkaEEQGLTV 65
+ 56778888888.....55678*******************9999999986 PP
+
+>> sp|Q0S2H3|ILVC_RHOSR Ketol-acid reductoisomerase OS=Rhodococcus sp. (strain RHA1) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.5 0.0 0.011 6.3 1 48 [. 21 65 .. 21 102 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.5 bits; conditional E-value: 0.011
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeaglea 48
+ v+++g+G+ G+ A L++ G +Vr++ ++g +++ ee+gl++
+ sp|Q0S2H3|ILVC_RHOSR 21 VAVIGYGSQGH-----AHSLSLRDSGVDVRIGLKEGSKSRAkaEEQGLTV 65
+ 56778888888.....55678*******************9999999986 PP
+
+>> sp|A0R946|MTNA1_BACAH Methylthioribose-1-phosphate isomerase 1 OS=Bacillus thuringiensis (strain Al Hakam) GN=mtnA1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.3 0.0 0.0062 3.5 17 63 .. 202 247 .. 193 275 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 12.3 bits; conditional E-value: 0.0062
+ HHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.- CS
+ Glyco_transf_28 17 AlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakles 63
+ a eLqr+G++V+++t +++++v + +++av +g+d +++a+++
+ sp|A0R946|MTNA1_BACAH 202 LTALELQRAGIDVTVITD-NMAAMVmSQGKIDAVIVGCD-RVAANGDV 247
+ 5699*********98875.6777777*************.88887744 PP
+
+>> sp|Q81ZC2|MTNA1_BACAN Methylthioribose-1-phosphate isomerase 1 OS=Bacillus anthracis GN=mtnA1 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.3 0.0 0.0062 3.5 17 63 .. 202 247 .. 193 275 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 12.3 bits; conditional E-value: 0.0062
+ HHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.- CS
+ Glyco_transf_28 17 AlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakles 63
+ a eLqr+G++V+++t +++++v + +++av +g+d +++a+++
+ sp|Q81ZC2|MTNA1_BACAN 202 LTALELQRAGIDVTVITD-NMAAMVmSQGKIDAVIVGCD-RVAANGDV 247
+ 5699*********98875.6777777*************.88887744 PP
+
+>> sp|Q6HP54|MTNA1_BACHK Methylthioribose-1-phosphate isomerase 1 OS=Bacillus thuringiensis subsp. konkukian GN=mtnA1 P
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.3 0.0 0.0062 3.5 17 63 .. 202 247 .. 193 275 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 12.3 bits; conditional E-value: 0.0062
+ HHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.- CS
+ Glyco_transf_28 17 AlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakles 63
+ a eLqr+G++V+++t +++++v + +++av +g+d +++a+++
+ sp|Q6HP54|MTNA1_BACHK 202 LTALELQRAGIDVTVITD-NMAAMVmSQGKIDAVIVGCD-RVAANGDV 247
+ 5699*********98875.6777777*************.88887744 PP
+
+>> sp|Q1MIU5|GLYA_RHIL3 Serine hydroxymethyltransferase OS=Rhizobium leguminosarum bv. viciae (strain 3841) GN=glyA PE=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.6 0.0 0.011 6 16 108 .. 23 116 .. 16 121 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 11.6 bits; conditional E-value: 0.011
+ HHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EE CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefv..eeagleavp.igpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvad 101
+ A+++eL r+ he++l+++++++++ e++g + ++ + +++++ ++++ae+ a+++ak+++ ++++v g++ +
+ sp|Q1MIU5|GLYA_RHIL3 23 GAIGKELGRQRHEIELIASENIVSRAvlEAQGSIMTNkYAEGYPGKRYY-GGCQFVDIAEE-LAIERAKKLFGVNFANVQPNSGSQMNQ 109
+ 599********************99887766655544588888888888.88899999999.999999999999999999999999999 PP
+
+ EE--HHH CS
+ Glyco_transf_28 102 laliaal 108
+ ++++a l
+ sp|Q1MIU5|GLYA_RHIL3 110 AVFLALL 116
+ 9998865 PP
+
+>> sp|A8FCG5|MTNA_BACP2 Methylthioribose-1-phosphate isomerase OS=Bacillus pumilus (strain SAFR-032) GN=mtnA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 0.0 0.0078 4.4 19 65 .. 205 250 .. 198 288 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.0078
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HH CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslk 65
+ +eL++ G +V+l+t + +++ +e+ ++av +g+d + +++++ +
+ sp|A8FCG5|MTNA_BACP2 205 TWELMQGGVDVTLITDNMAAHTMKEKQISAVIVGAD-RIARNGDAAN 250
+ 69**********************************.7777664443 PP
+
+>> sp|Q63CV4|ILVC2_BACCZ Ketol-acid reductoisomerase 2 OS=Bacillus cereus (strain ZK / E33L) GN=ilvC2 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.3 0.1 0.013 7.3 1 68 [. 19 79 .. 19 103 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 11.3 bits; conditional E-value: 0.013
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.-HHHCC CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakleslktlk 68
+ v+++g+G+ G+ A a+ L++ G eV +++ pg +v +++g e+ ++ ++ + +++l+
+ sp|Q63CV4|ILVC2_BACCZ 19 VAVVGYGSQGH-----AQAQNLRDSGVEVVVGVRPGKSYEVaKADGFEVMSVSEA--VRT-AQVVQMLL 79
+ 67899999999.....669**********************99999998887766..222.24455554 PP
+
+>> sp|A4J179|ILVC_DESRM Ketol-acid reductoisomerase OS=Desulfotomaculum reducens (strain MI-1) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.9 0.0 0.0084 4.7 1 68 [. 20 81 .. 20 107 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.9 bits; conditional E-value: 0.0084
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHCC CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktlk 68
+ ++++g+G+ G+ A a+ L++ G +V ++ ++ +++ e++gl++ +++ +++a e ++ l+
+ sp|A4J179|ILVC_DESRM 20 IAVLGYGSQGH-----AQAQSLRDSGLDVVVGLRKDSARWSkaEADGLQVATVPDA-CAQA--EVIQVLL 81
+ 67899999999.....669********************9999**********999.7777..5555554 PP
+
+>> sp|Q9V030|PAAD_PYRAB Probable aromatic acid decarboxylase OS=Pyrococcus abyssi GN=PYRAB09680 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.0 0.0 0.0039 2.2 1 55 [. 3 76 .. 3 127 .. 0.70
+
+ Alignments for each domain:
+ == domain 1 score: 13.0 bits; conditional E-value: 0.0039
+ EEEE-------HHHHHHHHHHHHH---EEE.EEETGGGHHHHHH---EEEE.----..................S CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVr.latppgleefveeagleavp.igpd..................v 55
+ vv+a+ G+ G ++ + l ++L++ GheV+ la++ g++ e+g+e++p d
+ sp|Q9V030|PAAD_PYRAB 3 VVVAITGASGTIYG-IKLYETLRDLGHEVIlLASKTGIKVAKYETGIEVKPdFSEDelfapiasgsypfdamviA 76
+ 68888899998886.5699***********888888888877999999988544445666666666555555551 PP
+
+>> sp|Q81F27|ILVC2_BACCR Ketol-acid reductoisomerase 2 OS=Bacillus cereus (strain ATCC 14579 / DSM 31) GN=ilvC2 PE=3 SV
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.2 0.1 0.014 7.7 1 54 [. 19 68 .. 19 104 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 11.2 bits; conditional E-value: 0.014
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpd 54
+ v+++g+G+ G+ A a+ L++ G eV +++ pg +v +++g e+ ++
+ sp|Q81F27|ILVC2_BACCR 19 VAVVGYGSQGH-----AQAQNLRDSGVEVVVGVRPGKSYEVaKADGFEVMSVSEA 68
+ 67899999999.....669**********************99999998877766 PP
+
+>> sp|Q03IJ9|ILVC_STRTD Ketol-acid reductoisomerase OS=Streptococcus thermophilus (strain ATCC BAA-491 / LMD-9) GN=ilvC
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.4 0.0 0.05 28 1 52 [. 21 68 .. 21 117 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 9.4 bits; conditional E-value: 0.05
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGH.HHHHH---EEEE-- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgle.efveeagleavpig 52
+ ++++g+G+ G+ A + L++ Gh+V++++ pg ++ +e+g ++++++
+ sp|Q03IJ9|ILVC_STRTD 21 IAVIGYGSQGH-----AHSQNLRDTGHDVIIGVRPGKSfDKAKEDGFDTYTVA 68
+ 56778888888.....6789*************99743144466666666555 PP
+
+>> sp|Q9F0I7|ILVC_STRTR Ketol-acid reductoisomerase OS=Streptococcus thermophilus GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.4 0.0 0.05 28 1 52 [. 21 68 .. 21 117 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 9.4 bits; conditional E-value: 0.05
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGH.HHHHH---EEEE-- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgle.efveeagleavpig 52
+ ++++g+G+ G+ A + L++ Gh+V++++ pg ++ +e+g ++++++
+ sp|Q9F0I7|ILVC_STRTR 21 IAVIGYGSQGH-----AHSQNLRDTGHDVIIGVRPGKSfDKAKEDGFDTYTVA 68
+ 56778888888.....6789*************99743144466666666555 PP
+
+>> sp|P26166|YBCC_RHOCA Uncharacterized 20.5 kDa protein in bchF-crtJ intergenic region OS=Rhodobacter capsulatus PE=4
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.9 0.0 0.0082 4.6 14 90 .. 88 168 .. 83 184 .. 0.65
+
+ Alignments for each domain:
+ == domain 1 score: 11.9 bits; conditional E-value: 0.0082
+ HHHHHHHHHHH---EEEEEETGGGHHHH...HH---EEEE----....S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 14 PavAlareLqrrGheVrlatppgleefv...eeagleavpigpd....vklwakleslktlkelaeglkalrkakeilkeakpd 90
+ a+ +a eL+rrG Vr++ pgl + +++ +a i+++ v+ a + +ktl++l +g + + ++ ++ +++++
+ sp|P26166|YBCC_RHOCA 88 GALIVAMELRRRGVSVRIVFAPGLSDLSrlmATTRFDAALITVGsmdrVEICA--KLVKTLSSLTKG-RMRVAIGGAIVSQRAE 168
+ 57889*****************9987644245555555556666666655555..336666666666.4444555555555555 PP
+
+>> sp|B8I1T8|ILVC_CLOCE Ketol-acid reductoisomerase OS=Clostridium cellulolyticum (strain ATCC 35319 / DSM 5812 / JCM 6
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.2 0.1 0.0067 3.8 1 54 [. 20 70 .. 20 303 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 12.2 bits; conditional E-value: 0.0067
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ v+++g+G+ G+ A a+ L++ G +V+++ +p +++ e++gl+a+ +
+ sp|B8I1T8|ILVC_CLOCE 20 VAVIGYGSQGH-----AHAQNLKDSGVNVIVGLTPSSARRKqvEADGLKAYDTAEA 70
+ 67888999998.....88**************99998765444******9775544 PP
+
+>> sp|A4VXL3|ILVC_STRSY Ketol-acid reductoisomerase OS=Streptococcus suis (strain 05ZYH33) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.0 0.0 0.066 37 1 35 [. 21 50 .. 21 90 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 9.0 bits; conditional E-value: 0.066
+ EEEE-------HHHHHHHHHHHHH---EEEEEETG CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatpp 35
+ ++++g+G+ G+ A a+ L++ Gh+V++++
+ sp|A4VXL3|ILVC_STRSY 21 IAVIGYGSQGH-----AHAQNLRDTGHDVIIGVRA 50
+ 57888889888.....88**************976 PP
+
+>> sp|A4W3V8|ILVC_STRS2 Ketol-acid reductoisomerase OS=Streptococcus suis (strain 98HAH33) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.0 0.0 0.066 37 1 35 [. 21 50 .. 21 90 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 9.0 bits; conditional E-value: 0.066
+ EEEE-------HHHHHHHHHHHHH---EEEEEETG CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatpp 35
+ ++++g+G+ G+ A a+ L++ Gh+V++++
+ sp|A4W3V8|ILVC_STRS2 21 IAVIGYGSQGH-----AHAQNLRDTGHDVIIGVRA 50
+ 57888889888.....88**************976 PP
+
+>> sp|Q3B594|ILVC_PELLD Ketol-acid reductoisomerase OS=Pelodictyon luteolum (strain DSM 273) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 0.0 0.0079 4.4 1 59 [. 19 73 .. 19 116 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.0079
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwa 59
+ ++++g+G+ G+ A a L++ G +V+++ p+ + +eagl ++p++ vk wa
+ sp|Q3B594|ILVC_PELLD 19 IAVLGYGSQGH-----AHALNLKDSGMNVCVGLRPDSSSCAkaREAGLRVEPVADAVK-WA 73
+ 67889999998.....7799*****************9998889********999833.33 PP
+
+>> sp|B1I8F2|MUTL_STRPI DNA mismatch repair protein mutL OS=Streptococcus pneumoniae (strain Hungary19A-6) GN=mutL PE=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.026 15 65 128 .. 203 266 .. 172 268 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.026
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnk 128
+ + l+++ +g +l +ak+ ++ ++ d+++++ g+v+++ l+ a++++i ++++ + +l n+
+ sp|B1I8F2|MUTL_STRPI 203 GQLRQAIAGIYGLVSAKKMIEIENSDLDFEISGFVSLPELTRANRNYISLFINGRYIKNFLLNR 266
+ 56777788888999*************************************9988877776665 PP
+
+>> sp|B2IS10|MUTL_STRPS DNA mismatch repair protein mutL OS=Streptococcus pneumoniae (strain CGSP14) GN=mutL PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.026 15 65 128 .. 203 266 .. 172 268 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.026
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnk 128
+ + l+++ +g +l +ak+ ++ ++ d+++++ g+v+++ l+ a++++i ++++ + +l n+
+ sp|B2IS10|MUTL_STRPS 203 GQLRQAIAGIYGLVSAKKMIEIENSDLDFEISGFVSLPELTRANRNYISLFINGRYIKNFLLNR 266
+ 56777788888999*************************************9988877776665 PP
+
+>> sp|B8ZKC9|MUTL_STRPJ DNA mismatch repair protein mutL OS=Streptococcus pneumoniae (strain ATCC 700669 / Spain 23F-1)
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.026 15 65 128 .. 203 266 .. 172 268 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.026
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnk 128
+ + l+++ +g +l +ak+ ++ ++ d+++++ g+v+++ l+ a++++i ++++ + +l n+
+ sp|B8ZKC9|MUTL_STRPJ 203 GQLRQAIAGIYGLVSAKKMIEIENSDLDFEISGFVSLPELTRANRNYISLFINGRYIKNFLLNR 266
+ 56777788888999*************************************9988877776665 PP
+
+>> sp|P0A3R1|HEXB_STRPN DNA mismatch repair protein hexB OS=Streptococcus pneumoniae GN=hexB PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.026 15 65 128 .. 203 266 .. 172 268 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.026
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnk 128
+ + l+++ +g +l +ak+ ++ ++ d+++++ g+v+++ l+ a++++i ++++ + +l n+
+ sp|P0A3R1|HEXB_STRPN 203 GQLRQAIAGIYGLVSAKKMIEIENSDLDFEISGFVSLPELTRANRNYISLFINGRYIKNFLLNR 266
+ 56777788888999*************************************9988877776665 PP
+
+>> sp|P0A3R2|HEXB_STRR6 DNA mismatch repair protein hexB OS=Streptococcus pneumoniae (strain ATCC BAA-255 / R6) GN=hexB
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.026 15 65 128 .. 203 266 .. 172 268 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.026
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnk 128
+ + l+++ +g +l +ak+ ++ ++ d+++++ g+v+++ l+ a++++i ++++ + +l n+
+ sp|P0A3R2|HEXB_STRR6 203 GQLRQAIAGIYGLVSAKKMIEIENSDLDFEISGFVSLPELTRANRNYISLFINGRYIKNFLLNR 266
+ 56777788888999*************************************9988877776665 PP
+
+>> sp|Q04MR4|MUTL_STRP2 DNA mismatch repair protein mutL OS=Streptococcus pneumoniae serotype 2 (strain D39 / NCTC 7466
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.026 15 65 128 .. 203 266 .. 172 268 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.026
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnk 128
+ + l+++ +g +l +ak+ ++ ++ d+++++ g+v+++ l+ a++++i ++++ + +l n+
+ sp|Q04MR4|MUTL_STRP2 203 GQLRQAIAGIYGLVSAKKMIEIENSDLDFEISGFVSLPELTRANRNYISLFINGRYIKNFLLNR 266
+ 56777788888999*************************************9988877776665 PP
+
+>> sp|C1CI68|MUTL_STRZP DNA mismatch repair protein mutL OS=Streptococcus pneumoniae (strain P1031) GN=mutL PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.026 15 65 128 .. 203 266 .. 172 268 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.026
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnk 128
+ + l+++ +g +l +ak+ ++ ++ d+++++ g+v+++ l+ a++++i ++++ + +l n+
+ sp|C1CI68|MUTL_STRZP 203 GQLRQAIAGIYGLVSAKKMIEIENSDLDFEISGFVSLPELTRANRNYISLFINGRYIKNFLLNR 266
+ 56777788888999*************************************9988877776665 PP
+
+>> sp|C1CP43|MUTL_STRZT DNA mismatch repair protein mutL OS=Streptococcus pneumoniae (strain Taiwan19F-14) GN=mutL PE=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.026 15 65 128 .. 203 266 .. 172 268 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.026
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnk 128
+ + l+++ +g +l +ak+ ++ ++ d+++++ g+v+++ l+ a++++i ++++ + +l n+
+ sp|C1CP43|MUTL_STRZT 203 GQLRQAIAGIYGLVSAKKMIEIENSDLDFEISGFVSLPELTRANRNYISLFINGRYIKNFLLNR 266
+ 56777788888999*************************************9988877776665 PP
+
+>> sp|Q8ZQE4|MACB_SALTY Macrolide export ATP-binding/permease protein macB OS=Salmonella typhimurium GN=macB PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.2 0.016 8.8 16 59 .. 184 248 .. 181 304 .. 0.61
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.016
+ HHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....................S---- CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefveeagleavpigpd.....................vklwa 59
+ +A+ r+L++rGh V+++t++ l + +e+ +e++ ++ ++w+
+ sp|Q8ZQE4|MACB_SALTY 184 MAILRQLRDRGHTVIIVTHDPLIAAQAERIIEIHDGKIVhnppaqekkreqgvdaavvntAPGWR 248
+ 89*****************9998888777777776444455666777777777777777655555 PP
+
+>> sp|Q57R58|MACB_SALCH Macrolide export ATP-binding/permease protein macB OS=Salmonella choleraesuis GN=macB PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.2 0.016 8.8 16 59 .. 184 248 .. 181 304 .. 0.61
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.016
+ HHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....................S---- CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefveeagleavpigpd.....................vklwa 59
+ +A+ r+L++rGh V+++t++ l + +e+ +e++ ++ ++w+
+ sp|Q57R58|MACB_SALCH 184 MAILRQLRDRGHTVIIVTHDPLIAAQAERIIEIHDGKIVhnppaqekkreqgvdaavvntAPGWR 248
+ 89*****************9998888777777776444455666777777777777777655555 PP
+
+>> sp|Q64550|UD11_RAT UDP-glucuronosyltransferase 1-1 OS=Rattus norvegicus GN=Ugt1a1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.3 0.0 0.0064 3.6 15 92 .. 45 123 .. 39 172 .. 0.71
+
+ Alignments for each domain:
+ == domain 1 score: 12.3 bits; conditional E-value: 0.0064
+ HHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----........S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 15 avAlareLqrrGheVrlatppgleefveeagleavpigpd........vklwakleslktlkelaeglkalrkakeilkeakpdvv 92
+ + + ++Lq++GheV +++p++ + e + ++++++++ +++ ++++++ l ++ +++ + k d +
+ sp|Q64550|UD11_RAT 45 MLGVIQQLQQKGHEVVVIAPEASIHIKEGSFYTMRKYPVPfqnenvtaA-------FVELGRSVFDQDPFLLRVVKTYNKVKRDSS 123
+ 57899****************999999********99999665333330.......344444444444444444444444444444 PP
+
+>> sp|B9JCX4|GLYA_AGRRK Serine hydroxymethyltransferase OS=Agrobacterium radiobacter (strain K84 / ATCC BAA-868) GN=gly
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.6 0.0 0.011 6 13 108 .. 20 116 .. 17 121 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.6 bits; conditional E-value: 0.011
+ HHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE.----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC--- CS
+ Glyco_transf_28 13 ePavAlareLqrrGheVrlatppgleefv..eeagleavp.igpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggy 98
+ e + A+++eL r+ he++l+++++++++ e++g + ++ + +++++ ++++ae+ a+++ak+++ ++++v g++
+ sp|B9JCX4|GLYA_AGRRK 20 EIFGAIGKELGRQRHEIELIASENIVSRAvlEAQGSIMTNkYAEGYPGKRYY-GGCQYVDIAEE-LAIERAKKLFGVNFANVQPNSGSQ 106
+ 66789*********************99887666655544577777888888.88889999999.999999999999999999999999 PP
+
+ -EEEE--HHH CS
+ Glyco_transf_28 99 vadlaliaal 108
+ + ++++a l
+ sp|B9JCX4|GLYA_AGRRK 107 MNQAVFLALL 116
+ 9988888765 PP
+
+>> sp|Q8Z824|MACB_SALTI Macrolide export ATP-binding/permease protein macB OS=Salmonella typhi GN=macB PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.2 0.016 8.8 16 59 .. 184 248 .. 181 304 .. 0.61
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.016
+ HHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....................S---- CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefveeagleavpigpd.....................vklwa 59
+ +A+ r+L++rGh V+++t++ l + +e+ +e++ ++ ++w+
+ sp|Q8Z824|MACB_SALTI 184 MAILRQLRDRGHTVIIVTHDPLIAAQAERIIEIHDGKIVhnppaqekkreqgvdaavvntAPGWR 248
+ 89*****************9998888777777776444455666777777777777777655555 PP
+
+>> sp|O94475|YC67_SCHPO Uncharacterized protein C1919.07 OS=Schizosaccharomyces pombe GN=SPCC1919.07 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.7 0.0 0.0047 2.7 43 134 .. 80 181 .. 70 185 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 12.7 bits; conditional E-value: 0.0047
+ H---EEEE----...........S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EE.EE--HHHHHHHHHHHHHH CS
+ Glyco_transf_28 43 eagleavpigpd...........vklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvad.laliaallagipanvaEq 119
+ ++l+a+p+++ + ++ e ++ ++e e k+++++++ + +kp+v ++ ++ +d + ++++ + +p+ ++E+
+ sp|O94475|YC67_SCHPO 80 YSKLQARPLTGLgisnqkpkskvRTIQR--EEVADMLESVEHEKSIQEFRKRYNVQKPKVNISHAEAEEDiDSFLESMDQSAPPSITED 166
+ 5566666644445667788877777888..7888999999999*******************9888776627899999*********** PP
+
+ ----EEEEESSGGGS CS
+ Glyco_transf_28 120 ngipglvnkllprra 134
+ g +++ +++++
+ sp|O94475|YC67_SCHPO 167 KGENYISSNHSSMHI 181
+ *********999976 PP
+
+>> sp|P59837|RDH12_BOVIN Retinol dehydrogenase 12 OS=Bos taurus GN=RDH12 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 6.5 0.0 0.39 2.2e+02 19 73 .. 56 108 .. 53 136 .. 0.78
+ 2 ? 4.4 0.0 1.7 9.7e+02 34 79 .. 211 265 .. 205 284 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 6.5 bits; conditional E-value: 0.39
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHH CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeg 73
+ areL rrG +V +a + l+ + ++++++a + +++ l +kl l+ k++ ++
+ sp|P59837|RDH12_BOVIN 56 ARELARRGARVYIACRDVLKGESAASEIQADTKNSQ-VLVRKL-DLSDTKSIRAF 108
+ 89****************************999999.555556.55555555544 PP
+
+ == domain 2 score: 4.4 bits; conditional E-value: 1.7
+ TGGGHHHHHH---EEEE----.............S------.-HHHCCSHHHHHHHHHH CS
+ Glyco_transf_28 34 ppgleefveeagleavpigpd.............vklwakleslktlkelaeglkalrk 79
+ +++l+++++ +g++++++ p+ lw+ ++ +lk+++eg a +
+ sp|P59837|RDH12_BOVIN 211 TRELAKRLKGTGVTTYAVHPGivrsklvrhsfllCLLWR--LFSPFLKTTWEG--AQTS 265
+ 688999***************************999999..79*********9..4444 PP
+
+>> sp|Q5PGK9|MACB_SALPA Macrolide export ATP-binding/permease protein macB OS=Salmonella paratyphi A GN=macB PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.2 0.016 8.8 16 59 .. 184 248 .. 181 304 .. 0.61
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.016
+ HHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....................S---- CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefveeagleavpigpd.....................vklwa 59
+ +A+ r+L++rGh V+++t++ l + +e+ +e++ ++ ++w+
+ sp|Q5PGK9|MACB_SALPA 184 MAILRQLRDRGHTVIIVTHDPLIAAQAERIIEIHDGKIVhnppaqekkreqgvdaavvntAPGWR 248
+ 89*****************9998888777777776444455666777777777777777655555 PP
+
+>> sp|Q02CM4|ILVC_SOLUE Ketol-acid reductoisomerase OS=Solibacter usitatus (strain Ellin6076) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.0 0.1 0.032 18 1 48 [. 20 64 .. 20 90 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 10.0 bits; conditional E-value: 0.032
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeaglea 48
+ v+++g+G+ G+ A a L++ G +V ++ p g +++ e+agl++
+ sp|Q02CM4|ILVC_SOLUE 20 VAIIGYGSQGH-----AHALNLRDSGVDVVVGLPAGSKSTAkaEAAGLKV 64
+ 57888888888.....7799*******************99989999975 PP
+
+>> sp|Q669P6|NPD_YERPS NAD-dependent deacetylase OS=Yersinia pseudotuberculosis GN=npdA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.0 0.019 11 3 21 .. 208 226 .. 207 257 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.019
+ EE-------HHHHHHHHHH CS
+ Glyco_transf_28 3 laggGTrGdvePavAlare 21
+ ++++GT G+v+Pa+ + +e
+ sp|Q669P6|NPD_YERPS 208 FISIGTSGHVYPAAGFVHE 226
+ 789**********998877 PP
+
+>> sp|Q8ZFR1|NPD_YERPE NAD-dependent deacetylase OS=Yersinia pestis GN=npdA PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.0 0.019 11 3 21 .. 208 226 .. 207 257 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.019
+ EE-------HHHHHHHHHH CS
+ Glyco_transf_28 3 laggGTrGdvePavAlare 21
+ ++++GT G+v+Pa+ + +e
+ sp|Q8ZFR1|NPD_YERPE 208 FISIGTSGHVYPAAGFVHE 226
+ 789**********998877 PP
+
+>> sp|B9KYS1|ILVC_THERP Ketol-acid reductoisomerase OS=Thermomicrobium roseum (strain ATCC 27502 / DSM 5159 / P-2) GN=i
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.8 0.1 0.009 5.1 1 69 [. 20 82 .. 20 94 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.8 bits; conditional E-value: 0.009
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCS CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeagleavpigpdvklwakleslktlke 69
+ v+++g+G+ G+ A a+ L++ G +V ++ ++g +++ +++ ++ ++p+ +++a+++ +++l++
+ sp|B9KYS1|ILVC_THERP 20 VAVLGYGSQGH-----AHAQNLRDSGVQVVVGLHEGSRSRERAKSDGFEVLTPR-EAAARGDIISMLMP 82
+ 67889999998.....88*********************996666667778888.88888888888776 PP
+
+>> sp|B4UAN4|ILVC_ANASK Ketol-acid reductoisomerase OS=Anaeromyxobacter sp. (strain K) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.5 0.1 0.023 13 1 48 [. 20 64 .. 20 104 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 10.5 bits; conditional E-value: 0.023
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeaglea 48
+ v+++g+G+ G+ A a L++ G +Vr++ g +++ e agl +
+ sp|B4UAN4|ILVC_ANASK 20 VAIIGYGSQGH-----AHALNLRDSGVDVRVGLAAGSKSKAkaEGAGLRV 64
+ 57888888888.....7799**********66666666666448888765 PP
+
+>> sp|B8J829|ILVC_ANAD2 Ketol-acid reductoisomerase OS=Anaeromyxobacter dehalogenans (strain 2CP-1 / ATCC BAA-258) GN=i
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.5 0.1 0.023 13 1 48 [. 20 64 .. 20 103 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 10.5 bits; conditional E-value: 0.023
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeaglea 48
+ v+++g+G+ G+ A a L++ G +Vr++ g +++ e agl +
+ sp|B8J829|ILVC_ANAD2 20 VAIIGYGSQGH-----AHALNLRDSGVDVRVGLAAGSKSKAkaEGAGLRV 64
+ 57888888888.....7799**********66666666666448888765 PP
+
+>> sp|Q2IJB7|ILVC_ANADE Ketol-acid reductoisomerase OS=Anaeromyxobacter dehalogenans (strain 2CP-C) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.5 0.1 0.023 13 1 48 [. 20 64 .. 20 103 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 10.5 bits; conditional E-value: 0.023
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeaglea 48
+ v+++g+G+ G+ A a L++ G +Vr++ g +++ e agl +
+ sp|Q2IJB7|ILVC_ANADE 20 VAIIGYGSQGH-----AHALNLRDSGVDVRVGLAAGSKSKAkaEGAGLRV 64
+ 57888888888.....7799**********66666666666448888765 PP
+
+>> sp|Q0RDI8|ILVC_FRAAA Ketol-acid reductoisomerase OS=Frankia alni (strain ACN14a) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.8 0.1 0.0091 5.1 1 45 [. 20 59 .. 20 95 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 11.8 bits; conditional E-value: 0.0091
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHHHH-- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefveeag 45
+ v+++g+G+ G+ A a L++ G +Vr++ p + +++ ++a+
+ sp|Q0RDI8|ILVC_FRAAA 20 VAVIGYGSQGH-----AHALNLRDSGVDVRVGLPADSRSRAKAAE 59
+ 67888999998.....7799*******************995543 PP
+
+>> sp|P0ABQ0|COABC_ECOLI Coenzyme A biosynthesis bifunctional protein coaBC OS=Escherichia coli (strain K12) GN=coaBC P
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.3 0.0 0.013 7.1 18 54 .. 24 61 .. 23 135 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 11.3 bits; conditional E-value: 0.013
+ HHHHHHH---EEEEEETGGGHHHHHH---EEEE.---- CS
+ Glyco_transf_28 18 lareLqrrGheVrlatppgleefveeagleavp.igpd 54
+ l r+L++rG +Vr+a +++ ++f++ l+av+ +++
+ sp|P0ABQ0|COABC_ECOLI 24 LVRRLRDRGADVRVAMTEAAKAFITPLSLQAVSgYPVS 61
+ 689*********************98888888766655 PP
+
+>> sp|P0ABQ1|COABC_ECOL6 Coenzyme A biosynthesis bifunctional protein coaBC OS=Escherichia coli O6 GN=coaBC PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.3 0.0 0.013 7.1 18 54 .. 24 61 .. 23 135 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 11.3 bits; conditional E-value: 0.013
+ HHHHHHH---EEEEEETGGGHHHHHH---EEEE.---- CS
+ Glyco_transf_28 18 lareLqrrGheVrlatppgleefveeagleavp.igpd 54
+ l r+L++rG +Vr+a +++ ++f++ l+av+ +++
+ sp|P0ABQ1|COABC_ECOL6 24 LVRRLRDRGADVRVAMTEAAKAFITPLSLQAVSgYPVS 61
+ 689*********************98888888766655 PP
+
+>> sp|B2J2U6|ILVC_NOSP7 Ketol-acid reductoisomerase OS=Nostoc punctiforme (strain ATCC 29133 / PCC 73102) GN=ilvC PE=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.9 0.0 0.0085 4.8 1 64 [. 20 76 .. 20 170 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 11.9 bits; conditional E-value: 0.0085
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-H CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwaklesl 64
+ ++++g+G+ G+ A a L++ G +V+++ pg ++ e+agl++++++ ++a +
+ sp|B2J2U6|ILVC_NOSP7 20 IAIIGYGSQGH-----AHALNLKDSGLNVIVGLYPGSKSVAkaEAAGLTVKSVADA-ANAA---DF 76
+ 57888888888.....7799****************9998888*********9998.3333...22 PP
+
+>> sp|Q89DG9|UVRC_BRAJA UvrABC system protein C OS=Bradyrhizobium japonicum GN=uvrC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.5 0.0 0.011 6.4 14 73 .. 598 658 .. 597 665 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 11.5 bits; conditional E-value: 0.011
+ HHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE.----S------.-HHHCCSHHHH CS
+ Glyco_transf_28 14 PavAlareLqrrGheVrlatppgleefv.eeagleavp.igpdvklwakleslktlkelaeg 73
+ P + + ++L+++ h+ ++++++l+++ +eagl+ p igp + +a l++++tlke+ +
+ sp|Q89DG9|UVRC_BRAJA 598 PVLYFIQRLRDEAHRFVIGSHRKLRKKDiREAGLQEIPgIGPS-RKRALLHHFGTLKEIERA 658
+ 6777899******************9988**************.999999******998775 PP
+
+>> sp|Q2S0M9|ILVC_SALRD Ketol-acid reductoisomerase OS=Salinibacter ruber (strain DSM 13855) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.8 0.1 0.009 5.1 1 63 [. 17 73 .. 17 104 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 11.8 bits; conditional E-value: 0.009
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakles 63
+ v+++g+G+ G+ A a L + G +V ++ pg ++ e++gl++ ig +w +
+ sp|Q2S0M9|ILVC_SALRD 17 VAVIGYGSQGH-----AHALNLHDSGVDVAVGLRPGSSSRPkaEQQGLTVMDIGEA-AAWG--DV 73
+ 67888899888.....7799*****************999999***********99.7777..33 PP
+
+>> sp|Q7NH80|ILVC_GLOVI Ketol-acid reductoisomerase OS=Gloeobacter violaceus GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.9 0.0 0.0086 4.9 1 59 [. 22 76 .. 22 122 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 11.9 bits; conditional E-value: 0.0086
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwa 59
+ ++++g+G+ G+ A a L++ G++V+++ +g +++ e++gl+++p + ++a
+ sp|Q7NH80|ILVC_GLOVI 22 IAIVGYGSQGH-----AHALNLKDSGIDVIVGLYEGSRSWAraENEGLAVYPTAEA-AAKA 76
+ 67888999998.....7799********************99999****9887766.3333 PP
+
+>> sp|Q8G6V1|ILVC2_BIFLO Ketol-acid reductoisomerase 2 OS=Bifidobacterium longum GN=ilvC2 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 0.1 0.0081 4.5 1 54 [. 21 71 .. 21 110 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.0081
+ EEEE-------HHHHHHHHHHHHH---EEEEEETG..GGHHHHHH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatpp..gleefveeagleavpigpd 54
+ v+++g+G+ G+ A a L++ G +V ++ p + +ef +e+gle++p+g
+ sp|Q8G6V1|ILVC2_BIFLO 21 VAILGYGSQGH-----AHALNLRDSGVDVVVGLRPtsKSVEFAKEQGLEVKPVGEA 71
+ 67889999998.....7799**********9998822467788**********987 PP
+
+>> sp|Q2W698|ENO_MAGSA Enolase OS=Magnetospirillum magneticum (strain AMB-1 / ATCC 700264) GN=eno PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.2 0.0 0.059 33 15 53 .. 186 224 .. 183 275 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 9.2 bits; conditional E-value: 0.059
+ HHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE--- CS
+ Glyco_transf_28 15 avAlareLqrrGheVrlatppgleefveeagleavpigp 53
+ + Al ++L+++Gh+ ++ + g+++ +++a+++ i
+ sp|Q2W698|ENO_MAGSA 186 FHALKKTLKDAGHNTNVGDEGGFAPNLKSAEMALDFIMK 224
+ 78*************************999998877655 PP
+
+>> sp|Q63GN3|MTNA1_BACCZ Methylthioribose-1-phosphate isomerase 1 OS=Bacillus cereus (strain ZK / E33L) GN=mtnA1 PE=3 S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.7 0.0 0.0097 5.4 17 63 .. 202 247 .. 193 275 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.7 bits; conditional E-value: 0.0097
+ HHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S------.- CS
+ Glyco_transf_28 17 AlareLqrrGheVrlatppgleefv.eeagleavpigpdvklwakles 63
+ a eLqr+G++V+++t +++++v + +++av +g+d +++a+++
+ sp|Q63GN3|MTNA1_BACCZ 202 LTALELQRAGIDVTVITD-NMAAMVmSQGKVDAVIVGCD-RVAANGDV 247
+ 5699*********98875.67777779************.88887744 PP
+
+>> sp|B0JRP2|ILVC_MICAN Ketol-acid reductoisomerase OS=Microcystis aeruginosa (strain NIES-843) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.7 0.0 0.0096 5.4 1 54 [. 20 70 .. 20 140 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 11.7 bits; conditional E-value: 0.0096
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ ++++g+G+ G+ A a L++ G +V+++ pg ++ + +eag++++ ++
+ sp|B0JRP2|ILVC_MICAN 20 IAIIGYGSQGH-----AHALNLKDSGVNVIVGLYPGSKSAIkaKEAGIPVYDVAEA 70
+ 57888888888.....7799*********************999*****9888766 PP
+
+>> sp|C1CBX8|MUTL_STRZJ DNA mismatch repair protein mutL OS=Streptococcus pneumoniae (strain JJA) GN=mutL PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.027 15 65 128 .. 203 266 .. 173 268 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.027
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnk 128
+ + l+++ +g +l +ak+ ++ ++ d+++++ g+v+++ l+ a++++i ++++ + +l n+
+ sp|C1CBX8|MUTL_STRZJ 203 GQLRQAIAGIYGLVSAKKMIEIENSDLDFEISGFVSLPELTRANRNYISLFINGRYIKNFLLNR 266
+ 56777788888999*************************************9988877776665 PP
+
+>> sp|Q3SLY0|BIOB_THIDA Biotin synthase OS=Thiobacillus denitrificans (strain ATCC 25259) GN=bioB PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.7 0.0 0.0097 5.4 12 80 .. 114 184 .. 113 279 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 11.7 bits; conditional E-value: 0.0097
+ HHHHHHHHHHHHH---EEE..EE.ETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHH CS
+ Glyco_transf_28 12 vePavAlareLqrrGheVr..la.tppgleefveeagleavpigpdvklwakleslktlkelaeglkalrka 80
+ +eP +A+ re+++ G e + l+ ++g +e+++eagl+++ ++d ++++ + t ++ +++l++l+++
+ sp|Q3SLY0|BIOB_THIDA 114 LEPVLAMVREVKALGLETCatLGmLKDGQAEQLKEAGLDYYNHNLD-TAPEFYGEIITTRDYQDRLDTLERV 184
+ 69*******************873578888899********99999.5554111222333333343334333 PP
+
+>> sp|B5E6C5|MUTL_STRP4 DNA mismatch repair protein mutL OS=Streptococcus pneumoniae serotype 19F (strain G54) GN=mutL
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.027 15 65 128 .. 203 266 .. 173 268 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.027
+ HHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEE CS
+ Glyco_transf_28 65 ktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvnk 128
+ + l+++ +g +l +ak+ ++ ++ d+++++ g+v+++ l+ a++++i ++++ + +l n+
+ sp|B5E6C5|MUTL_STRP4 203 GQLRQAIAGIYGLVSAKKMIEIENSDLDFEISGFVSLPELTRANRNYISLFINGRYIKNFLLNR 266
+ 56777788888999*************************************9988877776665 PP
+
+>> sp|B2J6I3|MURD_NOSP7 UDP-N-acetylmuramoylalanine--D-glutamate ligase OS=Nostoc punctiforme (strain ATCC 29133 / PCC
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.6 0.0 0.011 6 16 55 .. 14 60 .. 11 138 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.6 bits; conditional E-value: 0.011
+ HHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----......S CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefv.eeagleavpigpd......v 55
+ vA ar L+r+G+eV+l + ++ + +++l+a++i+++ +
+ sp|B2J6I3|MURD_NOSP7 14 VAAARLLKREGWEVELSDGNTSKTLLqQQQELAAEQITVKlgqsleL 60
+ 899**********************************9994444440 PP
+
+>> sp|Q5LXV0|ILVC_STRT1 Ketol-acid reductoisomerase OS=Streptococcus thermophilus (strain CNRZ 1066) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.4 0.0 0.05 28 1 52 [. 21 68 .. 21 117 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 9.4 bits; conditional E-value: 0.05
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGH.HHHHH---EEEE-- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgle.efveeagleavpig 52
+ ++++g+G+ G+ A + L++ Gh+V++++ pg ++ +e+g ++++++
+ sp|Q5LXV0|ILVC_STRT1 21 IAVIGYGSQGH-----AHSQNLRDTGHDVIIGVRPGKSfDKAKEDGFDTYTVA 68
+ 56778888888.....6789*************99743144466666666555 PP
+
+>> sp|Q5M2F2|ILVC_STRT2 Ketol-acid reductoisomerase OS=Streptococcus thermophilus (strain ATCC BAA-250 / LMG 18311) GN=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.4 0.0 0.05 28 1 52 [. 21 68 .. 21 117 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 9.4 bits; conditional E-value: 0.05
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGH.HHHHH---EEEE-- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgle.efveeagleavpig 52
+ ++++g+G+ G+ A + L++ Gh+V++++ pg ++ +e+g ++++++
+ sp|Q5M2F2|ILVC_STRT2 21 IAVIGYGSQGH-----AHSQNLRDTGHDVIIGVRPGKSfDKAKEDGFDTYTVA 68
+ 56778888888.....6789*************99743144466666666555 PP
+
+>> sp|C6A5E6|VATD_THESM V-type ATP synthase subunit D OS=Thermococcus sibiricus (strain MM 739 / DSM 12597) GN=atpD PE=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 3.2 0.0 4.1 2.3e+03 66 100 .. 13 47 .. 5 74 .. 0.79
+ 2 ? 7.7 0.0 0.17 95 29 87 .. 104 160 .. 98 205 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 3.2 bits; conditional E-value: 4.1
+ HCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----E CS
+ Glyco_transf_28 66 tlkelaeglkalrkakeilkeakpdvvvgfggyva 100
+ +l++l ++ k +k +ilke++++++++f + ++
+ sp|C6A5E6|VATD_THESM 13 ELLRLKRRIKLAEKGHKILKEKQDALIMEFFTIYD 47
+ 678899999999***************99876544 PP
+
+ == domain 2 score: 7.7 bits; conditional E-value: 0.17
+ EEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 29 Vrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilkea 87
+ V l+ +g+++ e+g+++v+ p+v + a e++++++el +l +++++ + l+++
+ sp|C6A5E6|VATD_THESM 104 VPLIEAEGFRRDPYERGYAFVSTSPKVDVTA--ETFEEVLELVTRLAEIEETLKRLAKE 160
+ 557777899999999***********88888..99999999999988888888888765 PP
+
+>> sp|Q2RIS6|ILVC_MOOTA Ketol-acid reductoisomerase OS=Moorella thermoacetica (strain ATCC 39073) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.2 0.0 0.014 7.7 1 67 [. 20 80 .. 20 103 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 11.2 bits; conditional E-value: 0.014
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-HHHC CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwakleslktl 67
+ ++++g+G+ G+ + a+ L++ G +V ++ p+ +++ +agle+++++ + a + ++ l
+ sp|Q2RIS6|ILVC_MOOTA 20 IAVMGYGSQGHSQ-----AQNLKDSGLDVVVGLRPESKSRAaaQAAGLEVKTVAEA-AAEA--DIIQIL 80
+ 6789999999966.....9*********************998999***9999877.4444..445554 PP
+
+>> sp|Q3M859|THIOG_ANAVT Bifunctional protein thiO/thiG OS=Anabaena variabilis (strain ATCC 29413 / PCC 7937) GN=thiO/t
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 8.0 0.0 0.13 74 87 135 .. 315 363 .. 291 366 .. 0.92
+
+ Alignments for each domain:
+ == domain 1 score: 8.0 bits; conditional E-value: 0.13
+ HHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEEESSGGGSC CS
+ Glyco_transf_28 87 akpdvvvgfggyvadlaliaallagipanvaEqngipglvnkllprran 135
+ +++++++++g y ++ +l ++a i+ ++ Eq + p+l++++++r+ +
+ sp|Q3M859|THIOG_ANAVT 315 HCANLTLATGHYRNGILLAPITAALIADFIVEQKSDPLLSHFHYSRFQK 363
+ 6778999*************************************99865 PP
+
+>> sp|Q5GS59|RLME_WOLTR Ribosomal RNA large subunit methyltransferase E OS=Wolbachia sp. subsp. Brugia malayi (strain T
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.3 0.0 0.013 7.4 24 93 .. 58 124 .. 54 128 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 11.3 bits; conditional E-value: 0.013
+ H---EEE.EEETGGGHHHH.HH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 24 rrGheVr.latppgleefv.eeagleavpigpdvklwakleslktlkelaeglkalrkakeilkeakpdvvv 93
+ ++G ++ l+++pg ++v ++g+++v+i+++ + ++++ +k ++ ++l+ ++e +k++k dv++
+ sp|Q5GS59|RLME_WOLTR 58 QAGQKIVdLGASPGGWSQVaSQKGVKVVAIDIK---PV--NTISGVKYIQYDINELETLRERFKDQKFDVIL 124
+ 44444444*************************...66..99************************999875 PP
+
+>> sp|B8G7X1|ILVC_CHLAD Ketol-acid reductoisomerase OS=Chloroflexus aggregans (strain MD-66 / DSM 9485) GN=ilvC PE=3 SV
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.7 0.1 0.0049 2.8 2 54 .. 21 70 .. 20 103 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 12.7 bits; conditional E-value: 0.0049
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ +++g+G+ G+ A ar L + G +Vr++ pg +++ eeagl++ +++
+ sp|B8G7X1|ILVC_CHLAD 21 AIIGFGSQGH-----AHARNLADSGLDVRVGLYPGSKSWAkvEEAGLKVMTVAEA 70
+ 5667777776.....789********************9999******9888766 PP
+
+>> sp|C5C2I2|ILVC_BEUC1 Ketol-acid reductoisomerase OS=Beutenbergia cavernae (strain ATCC BAA-8 / DSM 12333 / NBRC 1643
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.1 0.016 9 1 52 [. 20 68 .. 20 98 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.016
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE-- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpig 52
+ v+++g+G+ G+ A a L++ G +Vr++ +g +++ e++gl++ +++
+ sp|C5C2I2|ILVC_BEUC1 20 VAVIGYGSQGH-----AHALNLRDSGVDVRVGLREGSASRAkaENEGLKVLTVP 68
+ 67888999998.....7799*******************998899999887665 PP
+
+>> sp|Q5SJ03|ILVC_THET8 Ketol-acid reductoisomerase OS=Thermus thermophilus (strain HB8 / ATCC 27634 / DSM 579) GN=ilvC
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.5 0.1 0.022 13 2 54 .. 20 69 .. 19 111 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 10.5 bits; conditional E-value: 0.022
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ +++g+G+ G+ A a L++ G +Vr++ +g +++ e+agl + p++
+ sp|Q5SJ03|ILVC_THET8 20 AVLGFGSQGH-----AHALNLKDSGVDVRVGLRKGSRSWEkaEAAGLRVLPVAEA 69
+ 6777777777.....7799******************99988999*999887765 PP
+
+>> sp|Q72JC8|ILVC_THET2 Ketol-acid reductoisomerase OS=Thermus thermophilus (strain HB27 / ATCC BAA-163 / DSM 7039) GN=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.5 0.1 0.022 13 2 54 .. 20 69 .. 19 111 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 10.5 bits; conditional E-value: 0.022
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ +++g+G+ G+ A a L++ G +Vr++ +g +++ e+agl + p++
+ sp|Q72JC8|ILVC_THET2 20 AVLGFGSQGH-----AHALNLKDSGVDVRVGLRKGSRSWEkaEAAGLRVLPVAEA 69
+ 6777777777.....7799******************99988999*999887765 PP
+
+>> sp|Q4JUN9|ILVC_CORJK Ketol-acid reductoisomerase OS=Corynebacterium jeikeium (strain K411) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.0 0.019 11 1 49 [. 21 66 .. 21 97 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.019
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleav 49
+ v+++g+G+ G+ A a+ L++ G eV ++ +g +++ eeag +++
+ sp|Q4JUN9|ILVC_CORJK 21 VAIIGYGSQGH-----AHAQNLRESGVEVVIGLREGSKSRAkaEEAGFTVK 66
+ 57888888888.....88**********************98888887765 PP
+
+>> sp|Q2J0X3|UVRC_RHOP2 UvrABC system protein C OS=Rhodopseudomonas palustris (strain HaA2) GN=uvrC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.3 0.0 0.013 7.5 14 72 .. 607 666 .. 606 672 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 11.3 bits; conditional E-value: 0.013
+ HHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE.----S------.-HHHCCSHHH CS
+ Glyco_transf_28 14 PavAlareLqrrGheVrlatppgleefv.eeagleavp.igpdvklwakleslktlkelae 72
+ P + + ++L+++ h+ ++++++l+++ +eagl+ p igp + +a l++++tlke+ +
+ sp|Q2J0X3|UVRC_RHOP2 607 PVLYFIQRLRDEAHRFVIGSHRKLRKKDiREAGLQEIPgIGPS-RKRALLHHFGTLKEIER 666
+ 6777899******************9988**************.9999999*****99876 PP
+
+>> sp|Q02YY8|ILVC_LACLS Ketol-acid reductoisomerase OS=Lactococcus lactis subsp. cremoris (strain SK11) GN=ilvC PE=3 SV
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.2 0.0 0.028 16 1 36 [. 21 51 .. 21 101 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 10.2 bits; conditional E-value: 0.028
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGG CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppg 36
+ ++++g+G+ G+ A a+ L++ Gh+V++++ g
+ sp|Q02YY8|ILVC_LACLS 21 IAVIGYGSQGH-----AHAQNLRDSGHDVIIGVRQG 51
+ 57888899888.....88**************9765 PP
+
+>> sp|B9EBF4|ILVC_MACCJ Ketol-acid reductoisomerase OS=Macrococcus caseolyticus (strain JCSC5402) GN=ilvC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.0 0.016 8.9 1 57 [. 20 70 .. 20 113 .. 0.72
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.016
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE----S-- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpdvkl 57
+ ++++g+G+ G+ A a L++ G++V +++ +g ++ ee+g +a+ + +
+ sp|B9EBF4|ILVC_MACCJ 20 IAVLGYGSQGH-----AHALNLKDSGYDVVIGVREGQSRTKaEEDGFQAYDVSEA--V 70
+ 67889999998.....7799***************9988888******9988777..2 PP
+
+>> sp|Q43716|UFOG_PETHY Anthocyanidin 3-O-glucosyltransferase OS=Petunia hybrida GN=RT PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.6 0.0 0.011 6 10 43 .. 23 56 .. 21 167 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.6 bits; conditional E-value: 0.011
+ --HHHHHHHHHHHHH---EEEEEETGGGHHHHHH CS
+ Glyco_transf_28 10 GdvePavAlareLqrrGheVrlatppgleefvee 43
+ G++ P+v la++L +G +V + t g +++v++
+ sp|Q43716|UFOG_PETHY 23 GHISPFVQLANKLSSYGVKVSFFTASGNASRVKS 56
+ 9********************9999988888865 PP
+
+>> sp|A5GUT4|SURE_SYNR3 5'-nucleotidase surE OS=Synechococcus sp. (strain RCC307) GN=surE PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.7 0.0 0.0099 5.6 15 56 .. 20 60 .. 18 99 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 11.7 bits; conditional E-value: 0.0099
+ HHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE.----S- CS
+ Glyco_transf_28 15 avAlareLqrrGheVrlatppgleefveeagleavp.igpdvk 56
+ + Ala+e rrGh V+ +++p+ e+ + +gl+ ++ i ++ +
+ sp|A5GUT4|SURE_SYNR3 20 IKALAHEAARRGHSVT-VVCPDQERSATGHGLTLQSpIRAE-Q 60
+ 679************6.5789999999******98767777.3 PP
+
+>> sp|Q1ARE4|ILVC_RUBXD Ketol-acid reductoisomerase OS=Rubrobacter xylanophilus (strain DSM 9941 / NBRC 16129) GN=ilvC
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.4 0.0 0.012 6.8 2 64 .. 20 76 .. 19 121 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.4 bits; conditional E-value: 0.012
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S------.-H CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwaklesl 64
+ +++g+G+ G+ A a L++ G eV+++ +g +++ eeagl + +i+ wa e +
+ sp|Q1ARE4|ILVC_RUBXD 20 AVLGFGSQGH-----AHALNLRDSGCEVTVGLYRGSASWPkaEEAGLRVAEIPET-VRWA--EVV 76
+ 6777777777.....7799********************999**********999.5555..333 PP
+
+>> sp|A6W7N6|ILVC_KINRD Ketol-acid reductoisomerase OS=Kineococcus radiotolerans (strain ATCC BAA-149 / DSM 14245 / SRS
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.0 0.1 0.033 19 2 48 .. 21 64 .. 20 106 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 10.0 bits; conditional E-value: 0.033
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EE CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeaglea 48
+ +++g+G+ G+ A a L++ G +V ++ ++g +++ ee+gl++
+ sp|A6W7N6|ILVC_KINRD 21 AVLGFGSQGH-----AHALSLRDSGVDVVVGLKEGSKSRAkaEEQGLTV 64
+ 6777777777.....77999*******************9999999986 PP
+
+>> sp|Q11039|DEAD_MYCTU Cold-shock DEAD box protein A homolog OS=Mycobacterium tuberculosis GN=deaD PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 7.1 0.0 0.25 1.4e+02 23 52 .. 129 158 .. 121 262 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 7.1 bits; conditional E-value: 0.25
+ HH---EEEEEETGGGHHHHHH---EEEE-- CS
+ Glyco_transf_28 23 qrrGheVrlatppgleefveeagleavpig 52
+ rrG +V ++tp ++ +++e a l+ ++
+ sp|Q11039|DEAD_MYCTU 129 LRRGAQVVVGTPGRMIDHLERATLDLSRVD 158
+ 59********************99887655 PP
+
+>> sp|Q13BM0|UVRC_RHOPS UvrABC system protein C OS=Rhodopseudomonas palustris (strain BisB5) GN=uvrC PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.9 0.0 0.017 9.5 14 72 .. 607 666 .. 606 672 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 10.9 bits; conditional E-value: 0.017
+ HHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE.----S------.-HHHCCSHHH CS
+ Glyco_transf_28 14 PavAlareLqrrGheVrlatppgleefv.eeagleavp.igpdvklwakleslktlkelae 72
+ P + + ++L+++ h+ ++++++l+++ +eagl+ p igp + +a l++++tlke+ +
+ sp|Q13BM0|UVRC_RHOPS 607 PVLYFIQRLRDEAHRFVIGSHRKLRKKDiREAGLQEIPgIGPT-RKRALLHHFGTLKEIER 666
+ 6777899******************9988*********9****.9999999*****99876 PP
+
+>> sp|Q8YMT3|SURE_ANASP 5'-nucleotidase surE OS=Anabaena sp. (strain PCC 7120) GN=surE PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.9 0.0 0.0085 4.8 18 105 .. 19 127 .. 16 156 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 11.9 bits; conditional E-value: 0.0085
+ HHHHHHH---EEEEEETGGGHHHHHH---EEEE.----........................S------.-HHHCCSHHHHHHHHHHHH CS
+ Glyco_transf_28 18 lareLqrrGheVrlatppgleefveeagleavp.igpd........................vklwakleslktlkelaeglkalrkak 81
+ la++L ++Gh+V++ ++p+ e+ + +gl+ ++ i ++ + lwa les+ l+ + ++ + +
+ sp|Q8YMT3|SURE_ANASP 19 LANALAEAGHDVTV-VCPDRERSATGHGLTLHQpIRAEivesifhpaikawacdgtpsdcvkLALWALLESPPDLVLSGIN-QGANLGT 105
+ 89**********76.566777777******987699999999999998888888888888887777777777777666666.6667777 PP
+
+ HHHHHHHHHHHHHC----EEEE-- CS
+ Glyco_transf_28 82 eilkeakpdvvvgfggyvadlali 105
+ eil + + v+++++g +++ ++i
+ sp|Q8YMT3|SURE_ANASP 106 EILYSGT--VSAAMEGMIEGIPSI 127
+ 7776666..666666666666655 PP
+
+>> sp|Q319M0|SURE_PROM9 5'-nucleotidase surE OS=Prochlorococcus marinus (strain MIT 9312) GN=surE PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.1 0.0 0.015 8.6 16 54 .. 20 58 .. 17 106 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 11.1 bits; conditional E-value: 0.015
+ HHHHHHHHH---EEEEEETGGGHHHHHH---EEEE.---- CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefveeagleavp.igpd 54
+ Ala+ q+rGh+V+ +++p+ e+ + +gl+ ++ + ++
+ sp|Q319M0|SURE_PROM9 20 RALAKSAQKRGHKVT-VVCPDQERSATGHGLTLQSpLRVE 58
+ 59************6.5788999999*****987645555 PP
+
+>> sp|A9VFD5|MTNA2_BACWK Methylthioribose-1-phosphate isomerase 2 OS=Bacillus weihenstephanensis (strain KBAB4) GN=mtnA
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.9 0.0 0.017 9.9 19 66 .. 205 251 .. 203 300 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 10.9 bits; conditional E-value: 0.017
+ HHHHHH---EEEEEETGGGHHHHHH---EEEE----S------.-HHH CS
+ Glyco_transf_28 19 areLqrrGheVrlatppgleefveeagleavpigpdvklwakleslkt 66
+ +eL++++++V+l+t + ++ +++++++a +g+d + +++++ ++
+ sp|A9VFD5|MTNA2_BACWK 205 TWELKQADIDVTLITDNTAAHAIRTKEINAIIVGAD-RIVENGDTANK 251
+ 59**********************************.55444444433 PP
+
+>> sp|A1JRP2|NADA_YERE8 Quinolinate synthase A OS=Yersinia enterocolitica serotype O:8 / biotype 1B (strain 8081) GN=na
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 3.4 0.0 3.5 2e+03 47 107 .. 15 73 .. 8 82 .. 0.84
+ 2 ? 6.6 0.0 0.37 2.1e+02 85 132 .. 226 276 .. 191 278 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 3.4 bits; conditional E-value: 3.5
+ EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HH CS
+ Glyco_transf_28 47 eavpigpdvklwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaa 107
+ +a+p+++d + +k + +++k+l+++++a+ a + ++ ++ ++gg+vad + a
+ sp|A1JRP2|NADA_YERE8 15 PARPVPLD--VDQKAFYREKIKTLLKQRDAVLVAHYYTDPEIQALAEETGGCVADSLEMAR 73
+ 68888888..555558999********99999999999999999999*******9887665 PP
+
+ == domain 2 score: 6.6 bits; conditional E-value: 0.37
+ HHHHHHHHHH...C----EEEE--HHHHHHHHHHHHHH----EEEEESSGG CS
+ Glyco_transf_28 85 keakpdvvvg...fggyvadlaliaallagipanvaEqngipglvnkllpr 132
+ +++p++vv+ ++g + l++ a +l + +++va ++gi +++++++p
+ sp|A1JRP2|NADA_YERE8 226 HPESPQAVVDmadAVGSTSQLIMAAKTLPQKKLIVATDRGIFYKMQQACPD 276
+ 555666665411157889**************************9999885 PP
+
+>> sp|A2RKQ6|ILVC_LACLM Ketol-acid reductoisomerase OS=Lactococcus lactis subsp. cremoris (strain MG1363) GN=ilvC PE=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.0 0.0 0.032 18 1 36 [. 21 51 .. 21 101 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 10.0 bits; conditional E-value: 0.032
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGG CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppg 36
+ ++++g+G+ G+ A a+ L++ Gh+V++++ g
+ sp|A2RKQ6|ILVC_LACLM 21 IAVIGYGSQGH-----AHAQNLRDSGHDVIIGVRQG 51
+ 57888899888.....88**************9765 PP
+
+>> sp|Q32DZ9|MACB_SHIDS Macrolide export ATP-binding/permease protein macB OS=Shigella dysenteriae serotype 1 (strain S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.1 0.019 11 16 110 .. 184 298 .. 181 304 .. 0.65
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.019
+ HHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....................S------.-HHHCCSHHHH.H..HHHHHH CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefveeagleavpigpd.....................vklwakleslktlkelaeg.l..kalrka 80
+ +A+ ++L++rGh V+++t++ ++ +e+ +e++ ++ v +w+ ++++ + e++ + a +k+
+ sp|Q32DZ9|MACB_SHIDS 184 MAILHQLRDRGHTVIIVTHDPQVAAQAERVIEIRDGEIVrnppaidkvnvaggtepvvntVSGWR--QFVSGFNEALTMaWraLAANKM 270
+ 8999***************9999988888888887555555788888888888888888877777..3344443333330200333333 PP
+
+ HHHHHHHHHHHHHHC----EEEE--HHHHH CS
+ Glyco_transf_28 81 keilkeakpdvvvgfggyvadlaliaalla 110
+ +++l + +++g+++ v+ ++++ a+++
+ sp|Q32DZ9|MACB_SHIDS 271 RTLLTMLG--IIIGIASVVSIVVVGDAAKQ 298
+ 33333333..66666666666666666655 PP
+
+>> sp|A5CPY6|ILVC_CLAM3 Ketol-acid reductoisomerase OS=Clavibacter michiganensis subsp. michiganensis (strain NCPPB 382
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.1 0.018 10 1 59 [. 20 74 .. 20 109 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.018
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwa 59
+ v+++g+G+ G+ A a L++ G eV ++ ++g +++ ee+g ++ + ++d +wa
+ sp|A5CPY6|ILVC_CLAM3 20 VAVIGYGSQGH-----AHALNLRDSGVEVVIGLKEGSTSRAkaEEQGFTV-KTPSDASAWA 74
+ 67888999998.....7799********************9956666555.5555546666 PP
+
+>> sp|B0RIN6|ILVC_CLAMS Ketol-acid reductoisomerase OS=Clavibacter michiganensis subsp. sepedonicus (strain ATCC 33113
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.1 0.018 10 1 59 [. 20 74 .. 20 109 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.018
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE----S---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpdvklwa 59
+ v+++g+G+ G+ A a L++ G eV ++ ++g +++ ee+g ++ + ++d +wa
+ sp|B0RIN6|ILVC_CLAMS 20 VAVIGYGSQGH-----AHALNLRDSGVEVVIGLKEGSTSRAkaEEQGFTV-KTPSDASAWA 74
+ 67888999998.....7799********************9956666555.5555546666 PP
+
+>> sp|Q8K5J6|MUTL_STRP3 DNA mismatch repair protein mutL OS=Streptococcus pyogenes serotype M3 GN=mutL PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.4 0.0 0.024 14 57 127 .. 196 265 .. 158 268 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 10.4 bits; conditional E-value: 0.024
+ -----.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 57 lwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ l + + l+++ +g +l+ +k+ l+ ++d+++++ gyv+++ l+ a++++ + v+ + +l n
+ sp|Q8K5J6|MUTL_STRP3 196 LTQTS-GTGDLRQAIAGIYGLNTTKKMLAISNADLDFEVSGYVSLPELTRANRNYMTILVNGRYIKNFLLN 265
+ 55544.567788888999999**********************************9999988877666666 PP
+
+>> sp|Q99XN7|MUTL_STRP1 DNA mismatch repair protein mutL OS=Streptococcus pyogenes serotype M1 GN=mutL PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.4 0.0 0.024 14 57 127 .. 196 265 .. 158 268 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 10.4 bits; conditional E-value: 0.024
+ -----.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 57 lwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ l + + l+++ +g +l+ +k+ l+ ++d+++++ gyv+++ l+ a++++ + v+ + +l n
+ sp|Q99XN7|MUTL_STRP1 196 LTQTS-GTGDLRQAIAGIYGLNTTKKMLAISNADLDFEVSGYVSLPELTRANRNYMTILVNGRYIKNFLLN 265
+ 55544.567788888999999**********************************9999988877666666 PP
+
+>> sp|B5XJ09|MUTL_STRPZ DNA mismatch repair protein mutL OS=Streptococcus pyogenes serotype M49 (strain NZ131) GN=mutL
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.4 0.0 0.024 14 57 127 .. 196 265 .. 158 268 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 10.4 bits; conditional E-value: 0.024
+ -----.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 57 lwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ l + + l+++ +g +l+ +k+ l+ ++d+++++ gyv+++ l+ a++++ + v+ + +l n
+ sp|B5XJ09|MUTL_STRPZ 196 LTQTS-GTGDLRQAIAGIYGLNTTKKMLAISNADLDFEVSGYVSLPELTRANRNYMTILVNGRYIKNFLLN 265
+ 55544.567788888999999**********************************9999988877666666 PP
+
+>> sp|A2RGV3|MUTL_STRPG DNA mismatch repair protein mutL OS=Streptococcus pyogenes serotype M5 (strain Manfredo) GN=mut
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.4 0.0 0.024 14 57 127 .. 196 265 .. 158 268 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 10.4 bits; conditional E-value: 0.024
+ -----.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 57 lwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ l + + l+++ +g +l+ +k+ l+ ++d+++++ gyv+++ l+ a++++ + v+ + +l n
+ sp|A2RGV3|MUTL_STRPG 196 LTQTS-GTGDLRQAIAGIYGLNTTKKMLAISNADLDFEVSGYVSLPELTRANRNYMTILVNGRYIKNFLLN 265
+ 55544.567788888999999**********************************9999988877666666 PP
+
+>> sp|Q5X9H5|MUTL_STRP6 DNA mismatch repair protein mutL OS=Streptococcus pyogenes serotype M6 GN=mutL PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.4 0.0 0.024 14 57 127 .. 196 265 .. 158 268 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 10.4 bits; conditional E-value: 0.024
+ -----.-HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EEEE CS
+ Glyco_transf_28 57 lwakleslktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipglvn 127
+ l + + l+++ +g +l+ +k+ l+ ++d+++++ gyv+++ l+ a++++ + v+ + +l n
+ sp|Q5X9H5|MUTL_STRP6 196 LTQTS-GTGDLRQAIAGIYGLNTTKKMLAISNADLDFEVSGYVSLPELTRANRNYMTILVNGRYIKNFLLN 265
+ 55544.567788888999999**********************************9999988877666666 PP
+
+>> sp|Q3JYM6|MUTL_STRA1 DNA mismatch repair protein mutL OS=Streptococcus agalactiae serotype Ia GN=mutL PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.0 0.019 11 63 125 .. 201 263 .. 168 268 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.019
+ -HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EE CS
+ Glyco_transf_28 63 slktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipgl 125
+ + l+++ +g +l+ ak+ ++ ++d+++++ gyv+++ l+ a++++i + ++ + +l
+ sp|Q3JYM6|MUTL_STRA1 201 GTGDLRQAIAGIYGLNTAKKMIEISNADLDFEISGYVSLPELTRANRNYITLLINGRYIKNFL 263
+ 566788888999999***********************************9999877766655 PP
+
+>> sp|Q8E2R5|MUTL_STRA3 DNA mismatch repair protein mutL OS=Streptococcus agalactiae serotype III GN=mutL PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.0 0.019 11 63 125 .. 201 263 .. 168 268 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.019
+ -HHHCCSHHHHHHHHHHHHHHHHHHHHHHHHHC----EEEE--HHHHHHHHHHHHHH----EE CS
+ Glyco_transf_28 63 slktlkelaeglkalrkakeilkeakpdvvvgfggyvadlaliaallagipanvaEqngipgl 125
+ + l+++ +g +l+ ak+ ++ ++d+++++ gyv+++ l+ a++++i + ++ + +l
+ sp|Q8E2R5|MUTL_STRA3 201 GTGDLRQAIAGIYGLNTAKKMIEISNADLDFEISGYVSLPELTRANRNYITLLINGRYIKNFL 263
+ 566788888999999***********************************9999877766655 PP
+
+>> sp|Q9MB73|LGT_CITUN Limonoid UDP-glucosyltransferase OS=Citrus unshiu PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.6 0.0 0.021 12 1 54 [. 9 63 .. 9 141 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 10.6 bits; conditional E-value: 0.021
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH.HH---EEEE---- CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv.eeagleavpigpd 54
+ v+l++++ G+v P++ l+r L +G +l tp+ + ++ ++ + +++p +++
+ sp|Q9MB73|LGT_CITUN 9 VLLVSFPGHGHVNPLLRLGRLLASKGFFLTLTTPESFGKQMrKAGNFTYEPTPVG 63
+ 68999999*********************************55555677776655 PP
+
+>> sp|A8G678|SURE_PROM2 5'-nucleotidase surE OS=Prochlorococcus marinus (strain MIT 9215) GN=surE PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.0 0.02 11 17 54 .. 21 58 .. 18 136 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.02
+ HHHHHHHH---EEEEEETGGGHHHHHH---EEEE.---- CS
+ Glyco_transf_28 17 AlareLqrrGheVrlatppgleefveeagleavp.igpd 54
+ Ala+ q+rGh+V++ ++p+ e+ + +gl+ ++ + ++
+ sp|A8G678|SURE_PROM2 21 ALAKSAQKRGHKVKV-VCPDQERSATGHGLTLQSpLRVE 58
+ 9************96.67888888899999987645555 PP
+
+>> sp|A9WP08|ILVC_RENSM Ketol-acid reductoisomerase OS=Renibacterium salmoninarum (strain ATCC 33209 / DSM 20767 / IFO
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.5 0.5 0.046 26 1 48 [. 20 64 .. 20 104 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 9.5 bits; conditional E-value: 0.046
+ EEEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeaglea 48
+ v+++g+G+ G+ A a L++ G +Vr++ +g ++ e++gl +
+ sp|A9WP08|ILVC_RENSM 20 VAVIGYGSQGH-----AHALSLRDSGVDVRVGLAEGSQSRAkaEAEGLRV 64
+ 67888999998.....77999*********99999999998878888876 PP
+
+>> sp|A9WC26|ILVC_CHLAA Ketol-acid reductoisomerase OS=Chloroflexus aurantiacus (strain ATCC 29366 / DSM 635 / J-10-fl)
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.9 0.1 0.0085 4.8 2 54 .. 21 70 .. 20 102 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 11.9 bits; conditional E-value: 0.0085
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ +++g+G+ G+ A ar L + G +Vr++ pg +++ e+agl++ +++
+ sp|A9WC26|ILVC_CHLAA 21 AIIGFGSQGH-----AHARNLADSGLDVRVGLYPGSKSWAkvEAAGLKVMTVAEA 70
+ 5667777776.....789********************9999*****99887766 PP
+
+>> sp|B9LGM7|ILVC_CHLSY Ketol-acid reductoisomerase OS=Chloroflexus aurantiacus (strain ATCC 29364 / DSM 637 / Y-400-fl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.9 0.1 0.0085 4.8 2 54 .. 21 70 .. 20 102 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 11.9 bits; conditional E-value: 0.0085
+ EEE-------HHHHHHHHHHHHH---EEEEEETGGGHHHH..HH---EEEE---- CS
+ Glyco_transf_28 2 vlaggGTrGdvePavAlareLqrrGheVrlatppgleefv..eeagleavpigpd 54
+ +++g+G+ G+ A ar L + G +Vr++ pg +++ e+agl++ +++
+ sp|B9LGM7|ILVC_CHLSY 21 AIIGFGSQGH-----AHARNLADSGLDVRVGLYPGSKSWAkvEAAGLKVMTVAEA 70
+ 5667777776.....789********************9999*****99887766 PP
+
+>> sp|A2BSJ2|SURE_PROMS 5'-nucleotidase surE OS=Prochlorococcus marinus (strain AS9601) GN=surE PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.0 0.02 12 17 53 .. 21 57 .. 18 150 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.02
+ HHHHHHHH---EEEEEETGGGHHHHHH---EEEE.--- CS
+ Glyco_transf_28 17 AlareLqrrGheVrlatppgleefveeagleavp.igp 53
+ Ala+ q+rGh+V++ ++p+ e+ + +gl+ ++ + +
+ sp|A2BSJ2|SURE_PROMS 21 ALAKSAQKRGHKVKV-VCPDQERSATGHGLTLQSpLRV 57
+ 9************96.6788888889999998754554 PP
+
+>> sp|Q9LR44|IABG1_ARATH Indole-3-acetate beta-glucosyltransferase 1 OS=Arabidopsis thaliana GN=UGT75B1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.026 15 1 32 [. 6 38 .. 6 43 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.026
+ EEEE-------HHHHHHHHHHHHH-.--EEEEE CS
+ Glyco_transf_28 1 vvlaggGTrGdvePavAlareLqrr.GheVrla 32
+ ++l+++++ G+v P++ +ar+L +r G +V+++
+ sp|Q9LR44|IABG1_ARATH 6 FLLVTFPAQGHVNPSLRFARRLIKRtGARVTFV 38
+ 79********************87646777655 PP
+
+>> sp|O57731|VATD_PYRHO V-type ATP synthase subunit D OS=Pyrococcus horikoshii GN=atpD PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.0 0.1 0.068 38 26 86 .. 101 159 .. 80 170 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 9.0 bits; conditional E-value: 0.068
+ --EEEEEETGGGHHHHHH---EEEE----S------.-HHHCCSHHHHHHHHHHHHHHHHH CS
+ Glyco_transf_28 26 GheVrlatppgleefveeagleavpigpdvklwakleslktlkelaeglkalrkakeilke 86
+ G +V l+ p+l+++ e+g+++v+ ++ v +a e++++++ela +l +++++ + l +
+ sp|O57731|VATD_PYRHO 101 GVRVPLIEVPELKRKASERGYAFVSTTSTVDMAA--EKFEEVLELAIRLAEVEESLKRLGK 159
+ 556669999*******************988999..99**********8888888887765 PP
+
+>> sp|A3PEA4|SURE_PROM0 5'-nucleotidase surE OS=Prochlorococcus marinus (strain MIT 9301) GN=surE PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.0 0.027 15 17 50 .. 21 53 .. 18 102 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.027
+ HHHHHHHH---EEEEEETGGGHHHHHH---EEEE CS
+ Glyco_transf_28 17 AlareLqrrGheVrlatppgleefveeagleavp 50
+ Ala+ q+rGh+V++ ++p+ e+ + +gl+ ++
+ sp|A3PEA4|SURE_PROM0 21 ALAKSAQKRGHKVKV-VCPDQERSATGHGLTLQS 53
+ 9************96.678888888999999875 PP
+
+>> sp|P75831|MACB_ECOLI Macrolide export ATP-binding/permease protein macB OS=Escherichia coli (strain K12) GN=macB PE=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.1 0.019 11 16 110 .. 184 298 .. 181 304 .. 0.65
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.019
+ HHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....................S------.-HHHCCSHHHH.H..HHHHHH CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefveeagleavpigpd.....................vklwakleslktlkelaeg.l..kalrka 80
+ +A+ ++L++rGh V+++t++ ++ +e+ +e++ ++ v +w+ ++++ + e++ + a +k+
+ sp|P75831|MACB_ECOLI 184 MAILHQLRDRGHTVIIVTHDPQVAAQAERVIEIRDGEIVrnppaiekvnvtggtepvvntVSGWR--QFVSGFNEALTMaWraLAANKM 270
+ 8999***************9999988888888887555556788888888888888888877777..3344443333330200333333 PP
+
+ HHHHHHHHHHHHHHC----EEEE--HHHHH CS
+ Glyco_transf_28 81 keilkeakpdvvvgfggyvadlaliaalla 110
+ +++l + +++g+++ v+ ++++ a+++
+ sp|P75831|MACB_ECOLI 271 RTLLTMLG--IIIGIASVVSIVVVGDAAKQ 298
+ 33333333..66666666666666666655 PP
+
+>> sp|Q83LR7|MACB_SHIFL Macrolide export ATP-binding/permease protein macB OS=Shigella flexneri GN=macB PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.1 0.02 11 16 110 .. 184 298 .. 181 304 .. 0.65
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.02
+ HHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....................S------.-HHHCCSHHHH.H..HHHHHH CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefveeagleavpigpd.....................vklwakleslktlkelaeg.l..kalrka 80
+ +A+ ++L++rGh V+++t++ ++ +e+ +e++ ++ v +w+ ++++ + e++ + a +k+
+ sp|Q83LR7|MACB_SHIFL 184 MAILHQLRDRGHTVIIVTHDPQVAAQAERVIEIRDGEIVrnppaiekvnvaggtepvvntVSGWR--QFVSGFNEALTMaWraLAANKM 270
+ 8999***************9999988888888887555556788888888888888888877777..3344443333330200333333 PP
+
+ HHHHHHHHHHHHHHC----EEEE--HHHHH CS
+ Glyco_transf_28 81 keilkeakpdvvvgfggyvadlaliaalla 110
+ +++l + +++g+++ v+ ++++ a+++
+ sp|Q83LR7|MACB_SHIFL 271 RTLLTMLG--IIIGIASVVSIVVVGDAAKQ 298
+ 33333333..66666666666666666655 PP
+
+>> sp|Q3Z3Q4|MACB_SHISS Macrolide export ATP-binding/permease protein macB OS=Shigella sonnei (strain Ss046) GN=macB PE
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.1 0.02 11 16 110 .. 184 298 .. 181 304 .. 0.65
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.02
+ HHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....................S------.-HHHCCSHHHH.H..HHHHHH CS
+ Glyco_transf_28 16 vAlareLqrrGheVrlatppgleefveeagleavpigpd.....................vklwakleslktlkelaeg.l..kalrka 80
+ +A+ ++L++rGh V+++t++ ++ +e+ +e++ ++ v +w+ ++++ + e++ + a +k+
+ sp|Q3Z3Q4|MACB_SHISS 184 MAILHQLRDRGHTVIIVTHDPQVAAQAERVIEIRDGEIVrnppaiekvnvaggtepvvntVSGWR--QFVSGFNEALTMaWraLAANKM 270
+ 8999***************9999988888888887555556788888888888888888877777..3344443333330200333333 PP
+
+ HHHHHHHHHHHHHHC----EEEE--HHHHH CS
+ Glyco_transf_28 81 keilkeakpdvvvgfggyvadlaliaalla 110
+ +++l + +++g+++ v+ ++++ a+++
+ sp|Q3Z3Q4|MACB_SHISS 271 RTLLTMLG--IIIGIASVVSIVVVGDAAKQ 298
+ 33333333..66666666666666666655 PP
+
+>> sp|Q8XED0|MACB_ECO57 Macrolide export ATP-binding/permease protein macB OS=Escherichia coli O157:H7 GN=macB PE=3 SV=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.2 0.1 0.029 16 15 108 .. 183 296 .. 180 304 .. 0.59
+
+ Alignments for each domain:
+ == domain 1 score: 10.2 bits; conditional E-value: 0.029
+ HHHHHHHHHH---EEEEEETGGGHHHHHH---EEEE----.....................S------.-HHHCCSHHHH.H..HHHHH CS
+ Glyco_transf_28 15 avAlareLqrrGheVrlatppgleefveeagleavpigpd.....................vklwakleslktlkelaeg.l..kalrk 79
+ +A+ ++L++rGh V+++t++ ++ +e+ +e++ ++ +w+ ++++ + e++ + a +k
+ sp|Q8XED0|MACB_ECO57 183 VMAILHQLRDRGHTVIIVTHDPQVAAQAERVIEIRDGEIVrnppaiekvnvaggtepvvntASGWR--QFVSGFNEALTMaWraLAANK 269
+ 5899****************9888888888777776444455677777777777777777744444..222222222222010033333 PP
+
+ HHHHHHHHHHHHHHHC----EEEE--HHH CS
+ Glyco_transf_28 80 akeilkeakpdvvvgfggyvadlaliaal 108
+ ++++l + +++g+++ v+ ++++ a+
+ sp|Q8XED0|MACB_ECO57 270 MRTLLTMLG--IIIGIASVVSIVVVGDAA 296
+ 333333333..555555555555555555 PP
+
+
+
+Internal pipeline statistics summary:
+-------------------------------------
+Query model(s): 1 (139 nodes)
+Target sequences: 516081 (181677051 residues)
+Passed MSV filter: 24810 (0.0480738); expected 10321.6 (0.02)
+Passed bias filter: 19491 (0.0377673); expected 10321.6 (0.02)
+Passed Vit filter: 3048 (0.00590605); expected 516.1 (0.001)
+Passed Fwd filter: 917 (0.00177685); expected 5.2 (1e-05)
+Initial search space (Z): 516081 [actual number of targets]
+Domain search space (domZ): 916 [number of targets reported over threshold]
+# CPU time: 6.72u 0.07s 00:00:06.79 Elapsed: 00:00:02.00
+# Mc/sec: 12563.74
+//
diff --git a/demotic/examples/example.ncbi-blastp.out b/demotic/examples/example.ncbi-blastp.out
new file mode 100644
index 0000000..26b75ef
--- /dev/null
+++ b/demotic/examples/example.ncbi-blastp.out
@@ -0,0 +1,437 @@
+BLASTP 2.2.22 [Sep-27-2009]
+
+
+Reference: Altschul, Stephen F., Thomas L. Madden, Alejandro A. Schaffer,
+Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997),
+"Gapped BLAST and PSI-BLAST: a new generation of protein database search
+programs", Nucleic Acids Res. 25:3389-3402.
+
+Reference for compositional score matrix adjustment: Altschul, Stephen F.,
+John C. Wootton, E. Michael Gertz, Richa Agarwala, Aleksandr Morgulis,
+Alejandro A. Schaffer, and Yi-Kuo Yu (2005) "Protein database searches
+using compositionally adjusted substitution matrices", FEBS J. 272:5101-5109.
+
+Query= sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium
+sp. (strain NGR234) GN=NGR_a00980 PE=4 SV=1
+ (181 letters)
+
+Database: uniprot_sprot.fasta
+ 516,081 sequences; 181,677,051 total letters
+
+Searching..................................................done
+
+
+
+ Score E
+Sequences producing significant alignments: (bits) Value
+
+sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium s... 325 1e-88
+sp|B2VCH7|MTLD_ERWT9 Mannitol-1-phosphate 5-dehydrogenase OS=Erw... 31 3.8
+sp|Q9CZP0|UFSP1_MOUSE Ufm1-specific protease 1 OS=Mus musculus G... 30 7.3
+
+>sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium sp.
+ (strain NGR234) GN=NGR_a00980 PE=4 SV=1
+ Length = 181
+
+ Score = 325 bits (832), Expect = 1e-88, Method: Compositional matrix adjust.
+ Identities = 163/181 (90%), Positives = 163/181 (90%)
+
+Query: 1 MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT 60
+ MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT
+Sbjct: 1 MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT 60
+
+Query: 61 TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF 120
+ TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF
+Sbjct: 61 TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF 120
+
+Query: 121 AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSXXXXXXXXXXXXXXXXXXSRP 180
+ AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERS SRP
+Sbjct: 121 AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRP 180
+
+Query: 181 N 181
+ N
+Sbjct: 181 N 181
+
+
+>sp|B2VCH7|MTLD_ERWT9 Mannitol-1-phosphate 5-dehydrogenase
+ OS=Erwinia tasmaniensis (strain DSM 17950 / Et1/99)
+ GN=mtlD PE=3 SV=1
+ Length = 382
+
+ Score = 31.2 bits (69), Expect = 3.8, Method: Compositional matrix adjust.
+ Identities = 17/52 (32%), Positives = 32/52 (61%), Gaps = 6/52 (11%)
+
+Query: 42 GKMAEIDAILITDVNGIGTTADDQLAFVSLIADQGETTTVAFGPEIGSRIAA 93
+ G+ A+I+ ++ VN + +++DD +A ++ + + T A GP+I RIAA
+Sbjct: 52 GEQAQIE--IVNGVNAVHSSSDDIIALIAEV----DIVTTAVGPQILERIAA 97
+
+
+>sp|Q9CZP0|UFSP1_MOUSE Ufm1-specific protease 1 OS=Mus musculus
+ GN=Ufsp1 PE=1 SV=1
+ Length = 217
+
+ Score = 30.0 bits (66), Expect = 7.3, Method: Compositional matrix adjust.
+ Identities = 15/44 (34%), Positives = 22/44 (50%)
+
+Query: 111 GKEERKFKPFAAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFI 154
+ G+EER + F G V G AD + +L I G+EV+ +
+Sbjct: 129 GEEERLYSHFTTGGGPVMVGGDADAQSKALLGICEGPGSEVYVL 172
+
+
+BLASTP 2.2.22 [Sep-27-2009]
+
+
+Reference: Altschul, Stephen F., Thomas L. Madden, Alejandro A. Schaffer,
+Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997),
+"Gapped BLAST and PSI-BLAST: a new generation of protein database search
+programs", Nucleic Acids Res. 25:3389-3402.
+
+Reference for compositional score matrix adjustment: Altschul, Stephen F.,
+John C. Wootton, E. Michael Gertz, Richa Agarwala, Aleksandr Morgulis,
+Alejandro A. Schaffer, and Yi-Kuo Yu (2005) "Protein database searches
+using compositionally adjusted substitution matrices", FEBS J. 272:5101-5109.
+
+Query= sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA
+OS=Aspergillus oryzae GN=hacA PE=2 SV=1
+ (345 letters)
+
+Database: uniprot_sprot.fasta
+ 516,081 sequences; 181,677,051 total letters
+
+Searching..................................................done
+
+
+
+ Score E
+Sequences producing significant alignments: (bits) Value
+
+sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspergill... 602 e-171
+sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS=Emericell... 416 e-115
+sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS=Trichoder... 84 2e-15
+sp|P41546|HAC1_YEAST Transcriptional activator HAC1 OS=Saccharom... 58 1e-07
+sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabidopsis thal... 41 0.010
+sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanum lycopers... 38 0.12
+sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-binding prot... 34 1.5
+sp|A1URL3|PYRD_BARBK Dihydroorotate dehydrogenase OS=Bartonella ... 34 1.6
+sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-binding prot... 34 1.9
+sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-binding prot... 33 2.1
+sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-binding protei... 33 2.6
+sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-binding prot... 33 2.9
+sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=Arabidopsis... 32 5.7
+sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos taurus GN=XB... 32 5.8
+sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-binding protei... 32 9.0
+sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-binding prot... 32 9.3
+
+>sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspergillus
+ oryzae GN=hacA PE=2 SV=1
+ Length = 345
+
+ Score = 602 bits (1552), Expect = e-171, Method: Compositional matrix adjust.
+ Identities = 303/345 (87%), Positives = 303/345 (87%)
+
+Query: 1 MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVXXXXXXXXXXXXSWG 60
+ MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV SWG
+Sbjct: 1 MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG 60
+
+Query: 61 QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQ 120
+ QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS IQMEQ
+Sbjct: 61 QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ 120
+
+Query: 121 QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMXXXXXXXXXXXXXXXFKQERD 180
+ QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPM FKQERD
+Sbjct: 121 QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD 180
+
+Query: 181 ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK 240
+ ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK
+Sbjct: 181 ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK 240
+
+Query: 241 HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS 300
+ HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS
+Sbjct: 241 HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS 300
+
+Query: 301 EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC 345
+ EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+Sbjct: 301 EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC 345
+
+
+>sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS=Emericella
+ nidulans GN=hacA PE=2 SV=2
+ Length = 350
+
+ Score = 416 bits (1069), Expect = e-115, Method: Compositional matrix adjust.
+ Identities = 225/332 (67%), Positives = 254/332 (76%), Gaps = 1/332 (0%)
+
+Query: 13 DSLPATPASEVPVLTVSPADTSLNSADVKTQEVXXXXXXXXXXXXSWGQELPVPKTNLPP 72
+ +SLP TP+ EVPVLTVSPADTSL + +V Q SWGQELPVPKTNLPP
+Sbjct: 18 NSLPTTPSLEVPVLTVSPADTSLQTKNVVAQ-TKPEEKKPAKKRKSWGQELPVPKTNLPP 76
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQQNQFLLQRLSQM 132
+ RKRAKTEDEKEQRRIERVLRNRAAAQTS I MEQQNQFLLQRL+QM
+Sbjct: 77 RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLESEKIDMEQQNQFLLQRLAQM 136
+
+Query: 133 EAENNRLSQQLAQLAAEVRGSRANTPMXXXXXXXXXXXXXXXFKQERDELPLERIPFPTP 192
+ EAENNRLSQQ+AQL+AEVRGSR +TP FKQE DE+PL+RIPFPTP
+Sbjct: 137 EAENNRLSQQVAQLSAEVRGSRHSTPTSSSPASVSPTLTPTLFKQEGDEVPLDRIPFPTP 196
+
+Query: 193 SLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLS 252
+ S++DYSPTLKPS+LAES D+ QHPAVSV GLEGD SAL LFDLG+ +KH T D+ APLS
+Sbjct: 197 SVTDYSPTLKPSSLAESPDLTQHPAVSVGGLEGDESALTLFDLGASIKHEPTHDLTAPLS 256
+
+Query: 253 DDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAH 312
+ DDDF RLF+GDSS+E DSS+ EDG AFDVL+ GDLSAFPFDSMV+FD+EPVTLE +E +
+Sbjct: 257 DDDFRRLFNGDSSLESDSSLLEDGFAFDVLDSGDLSAFPFDSMVDFDTEPVTLEDLEQTN 316
+
+Query: 313 GLPDETTCKTSSVQPGFGASTTRCDGQGIAAG 344
+ GL D +CK +S+QP GAST+RCDGQGIAAG
+Sbjct: 317 GLSDSASCKAASLQPSHGASTSRCDGQGIAAG 348
+
+
+>sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS=Trichoderma
+ reesei GN=hac1 PE=2 SV=1
+ Length = 451
+
+ Score = 84.0 bits (206), Expect = 2e-15, Method: Compositional matrix adjust.
+ Identities = 38/43 (88%), Positives = 40/43 (93%)
+
+Query: 58 SWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ SWGQ LP PKTNLPPRKRAKTEDEKEQRR+ERVLRNR AAQ+S
+Sbjct: 93 SWGQVLPEPKTNLPPRKRAKTEDEKEQRRVERVLRNRRAAQSS 135
+
+
+>sp|P41546|HAC1_YEAST Transcriptional activator HAC1
+ OS=Saccharomyces cerevisiae GN=HAC1 PE=1 SV=2
+ Length = 238
+
+ Score = 58.2 bits (139), Expect = 1e-07, Method: Compositional matrix adjust.
+ Identities = 28/41 (68%), Positives = 33/41 (80%), Gaps = 3/41 (7%)
+
+Query: 63 LPVP---KTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ L +P K+ LPPRKRAKT++EKEQRRIER+LRNR AA S
+Sbjct: 16 LAIPTNFKSTLPPRKRAKTKEEKEQRRIERILRNRRAAHQS 56
+
+
+>sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabidopsis
+ thaliana GN=HY5 PE=1 SV=1
+ Length = 168
+
+ Score = 41.2 bits (95), Expect = 0.010, Method: Compositional matrix adjust.
+ Identities = 27/80 (33%), Positives = 39/80 (48%)
+
+Query: 60 GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQME 119
+ GQE RKR +T EKE +R++R+LRNR +AQ + +E
+Sbjct: 65 GQERTQATVGESQRKRGRTPAEKENKRLKRLLRNRVSAQQARERKKAYLSELENRVKDLE 124
+
+Query: 120 QQNQFLLQRLSQMEAENNRL 139
+ +N L +RLS ++ EN L
+Sbjct: 125 NKNSELEERLSTLQNENQML 144
+
+
+>sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanum
+ lycopersicum GN=HY5 PE=2 SV=1
+ Length = 158
+
+ Score = 37.7 bits (86), Expect = 0.12, Method: Compositional matrix adjust.
+ Identities = 26/80 (32%), Positives = 41/80 (51%), Gaps = 3/80 (3%)
+
+Query: 60 GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQME 119
+ GQ P T RKR ++ +KE +R++R+LRNR +AQ + ++E
+Sbjct: 66 GQAQPSAGTQ---RKRGRSPADKENKRLKRLLRNRVSAQQARERKKAYLIDLEARVKELE 122
+
+Query: 120 QQNQFLLQRLSQMEAENNRL 139
+ +N L +RLS ++ EN L
+Sbjct: 123 TKNAELEERLSTLQNENQML 142
+
+
+>sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-binding protein
+ 3 OS=Mus musculus GN=Creb3 PE=2 SV=2
+ Length = 404
+
+ Score = 34.3 bits (77), Expect = 1.5, Method: Compositional matrix adjust.
+ Identities = 20/71 (28%), Positives = 35/71 (49%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQQNQFLLQRLSQMEAENNRL 139
+ +E+ +R+ R +RN+ AAQ S ++ QN+ L ++ ++E +N L
+Sbjct: 182 EEQVLKRVRRKIRNKRAAQESRKKKKVYVVGLESRVLKYTAQNRELQNKVQRLEEQNLSL 241
+
+Query: 140 SQQLAQLAAEV 150
+ QL +L A V
+Sbjct: 242 LDQLRKLQAMV 252
+
+
+>sp|A1URL3|PYRD_BARBK Dihydroorotate dehydrogenase OS=Bartonella
+ bacilliformis (strain ATCC 35685 / KC583) GN=pyrD PE=3
+ SV=1
+ Length = 362
+
+ Score = 33.9 bits (76), Expect = 1.6, Method: Compositional matrix adjust.
+ Identities = 28/70 (40%), Positives = 36/70 (51%), Gaps = 11/70 (15%)
+
+Query: 227 GSALPLF-DLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGL---AFDVL 282
+ G ++P+F L DL DDVAA LS DF D V ++++F GL AF +
+Sbjct: 205 GFSIPIFLKLAPDLTEQELDDVAAELSLSDF------DGLVVSNTTLFRQGLKKSAF-MN 257
+
+Query: 283 EGGDLSAFPF 292
+ EGG LS P
+Sbjct: 258 EGGGLSGRPL 267
+
+
+>sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-binding protein
+ 3-like protein 3 OS=Bos taurus GN=CREB3L3 PE=2 SV=1
+ Length = 456
+
+ Score = 33.9 bits (76), Expect = 1.9, Method: Compositional matrix adjust.
+ Identities = 20/71 (28%), Positives = 34/71 (47%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQQNQFLLQRLSQMEAENNRL 139
+ +E+ ++I R +RN+ +AQ S QNQ L +++ +E +N L
+Sbjct: 235 EERMLKKIRRKIRNKQSAQESRKKKKEYIDGLETRMSACTAQNQELQRKVLHLEKQNLSL 294
+
+Query: 140 SQQLAQLAAEV 150
+ +QL +L A V
+Sbjct: 295 LEQLKKLQAIV 305
+
+
+>sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-binding protein
+ 3-like protein 3 OS=Homo sapiens GN=CREB3L3 PE=1 SV=2
+ Length = 461
+
+ Score = 33.5 bits (75), Expect = 2.1, Method: Compositional matrix adjust.
+ Identities = 20/71 (28%), Positives = 34/71 (47%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQQNQFLLQRLSQMEAENNRL 139
+ +E+ ++I R +RN+ +AQ S QNQ L +++ +E +N L
+Sbjct: 240 EERVLKKIRRKIRNKQSAQESRKKKKEYIDGLETRMSACTAQNQELQRKVLHLEKQNLSL 299
+
+Query: 140 SQQLAQLAAEV 150
+ +QL +L A V
+Sbjct: 300 LEQLKKLQAIV 310
+
+
+>sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-binding protein
+ 3-like protein 3 OS=Rattus norvegicus GN=Creb3l3 PE=2
+ SV=1
+ Length = 470
+
+ Score = 33.1 bits (74), Expect = 2.6, Method: Compositional matrix adjust.
+ Identities = 22/83 (26%), Positives = 36/83 (43%)
+
+Query: 68 TNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQQNQFLLQ 127
+ LP + +E+ ++I R +RN+ +AQ S QNQ L +
+Sbjct: 224 VTLPTQLPLTKYEERVLKKIRRKIRNKQSAQESRKKKKEYIDGLENRMSACTAQNQELQR 283
+
+Query: 128 RLSQMEAENNRLSQQLAQLAAEV 150
+ ++ +E +N L +QL L A V
+Sbjct: 284 KVLHLEKQNLSLLEQLKHLQALV 306
+
+
+>sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-binding protein
+ 3-like protein 3 OS=Mus musculus GN=Creb3l3 PE=2 SV=1
+ Length = 479
+
+ Score = 33.1 bits (74), Expect = 2.9, Method: Compositional matrix adjust.
+ Identities = 22/83 (26%), Positives = 36/83 (43%)
+
+Query: 68 TNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQQNQFLLQ 127
+ LP + +E+ ++I R +RN+ +AQ S QNQ L +
+Sbjct: 224 VTLPTQLPLTKYEERVLKKIRRKIRNKQSAQESRKKKKEYIDGLENRMSACTAQNQELQR 283
+
+Query: 128 RLSQMEAENNRLSQQLAQLAAEV 150
+ ++ +E +N L +QL L A V
+Sbjct: 284 KVLHLEKQNLSLLEQLKHLQALV 306
+
+
+>sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=Arabidopsis
+ thaliana GN=HYH PE=1 SV=1
+ Length = 149
+
+ Score = 32.3 bits (72), Expect = 5.7, Method: Compositional matrix adjust.
+ Identities = 19/71 (26%), Positives = 35/71 (49%)
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQQNQFLLQRLSQM 132
+ R+R + +KE R ++R+LRNR +AQ + +++ N L +++S +
+Sbjct: 68 RRRGRNPVDKEYRSLKRLLRNRVSAQQARERKKVYVSDLESRANELQNNNDQLEEKISTL 127
+
+Query: 133 EAENNRLSQQL 143
+ EN L + L
+Sbjct: 128 TNENTMLRKML 138
+
+
+>sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos taurus GN=XBP1
+ PE=2 SV=1
+ Length = 261
+
+ Score = 32.0 bits (71), Expect = 5.8, Method: Compositional matrix adjust.
+ Identities = 25/86 (29%), Positives = 41/86 (47%), Gaps = 10/86 (11%)
+
+Query: 68 TNLPP--RKRAK-TEDEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQQNQF 124
+ + +PP RKR + T E++ + R L+NR AAQT+ + +E++NQ
+Sbjct: 52 SGVPPQARKRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENQK 111
+
+Query: 125 LL-------QRLSQMEAENNRLSQQL 143
+ LL ++ + EN L Q+L
+Sbjct: 112 LLLENQLLREKTHGLVVENQELRQRL 137
+
+
+>sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-binding protein
+ 3-like protein 4 OS=Rattus norvegicus GN=Creb3l4 PE=2
+ SV=1
+ Length = 367
+
+ Score = 31.6 bits (70), Expect = 9.0, Method: Compositional matrix adjust.
+ Identities = 18/67 (26%), Positives = 33/67 (49%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQQNQFLLQRLSQMEAENNRL 139
+ +E+ ++I R +RN+ +AQ S +QNQ L +++ ++E +N L
+Sbjct: 186 EERILKKIRRKIRNKQSAQDSRRRKKEYIDGLESRVAACSEQNQKLQRKVQELERQNISL 245
+
+Query: 140 SQQLAQL 146
+ Q+ QL
+Sbjct: 246 VAQVHQL 252
+
+
+>sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-binding protein
+ 3-like protein 4 OS=Mus musculus GN=Creb3l4 PE=1 SV=1
+ Length = 370
+
+ Score = 31.6 bits (70), Expect = 9.3, Method: Compositional matrix adjust.
+ Identities = 18/67 (26%), Positives = 34/67 (50%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSXXXXXXXXXXXXXXXIQMEQQNQFLLQRLSQMEAENNRL 139
+ +E+ ++I R +RN+ +AQ S +QNQ L +++ ++E +N L
+Sbjct: 190 EERILKKIRRKIRNKQSAQDSRRRKKEYLDGLESRVAACSEQNQKLQRKVQELERQNIFL 249
+
+Query: 140 SQQLAQL 146
+ +Q+ QL
+Sbjct: 250 MEQVRQL 256
+
+
+ Database: uniprot_sprot.fasta
+ Posted date: Apr 12, 2010 9:48 AM
+ Number of letters in database: 181,677,051
+ Number of sequences in database: 516,081
+
+Lambda K H
+ 0.317 0.128 0.360
+
+Gapped
+Lambda K H
+ 0.267 0.0410 0.140
+
+
+Matrix: BLOSUM62
+Gap Penalties: Existence: 11, Extension: 1
+Number of Sequences: 516081
+Number of Hits to DB: 151,440,785
+Number of extensions: 5635886
+Number of successful extensions: 14148
+Number of sequences better than 10.0: 43
+Number of HSP's gapped: 14298
+Number of HSP's successfully gapped: 44
+Length of database: 181,677,051
+Neighboring words threshold: 11
+Window for multiple hits: 40
+X1: 16 ( 7.3 bits)
+X2: 38 (14.6 bits)
+X3: 64 (24.7 bits)
+S1: 41 (21.7 bits)
+S2: 66 (30.0 bits)
diff --git a/demotic/examples/example.phmmer.out b/demotic/examples/example.phmmer.out
new file mode 100644
index 0000000..7c63df7
--- /dev/null
+++ b/demotic/examples/example.phmmer.out
@@ -0,0 +1,3477 @@
+# phmmer :: search a protein sequence against a protein database
+# HMMER 3.0 (March 2010); http://hmmer.org/
+# Copyright (C) 2010 Howard Hughes Medical Institute.
+# Freely distributed under the GNU General Public License (GPLv3).
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# query sequence file: example.fa
+# target sequence database: /misc/data0/databases/Uniprot/uniprot_sprot.fasta
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+Query: sp|P55685|Y4WG_RHISN [L=181]
+Description: Uncharacterized protein y4wG OS=Rhizobium sp. (strain NGR234) GN=NGR_a00980 PE=4 SV=1
+Scores for complete sequences (score includes all domains):
+ --- full sequence --- --- best 1 domain --- -#dom-
+ E-value score bias E-value score bias exp N Sequence Description
+ ------- ------ ----- ------- ------ ----- ---- -- -------- -----------
+ 1.9e-115 387.7 2.1 2.1e-115 387.6 1.4 1.0 1 sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizob
+ ------ inclusion threshold ------
+ 1.7 13.5 0.0 7.4 11.4 0.0 1.9 2 sp|A1VDW9|HEM1_DESVV Glutamyl-tRNA reductase OS=Desulfovibr
+ 2.1 13.1 0.0 9.5 11.0 0.0 1.9 2 sp|Q72C23|HEM1_DESVH Glutamyl-tRNA reductase OS=Desulfovibr
+ 2.8 12.7 0.1 22 9.8 0.1 2.0 2 sp|C0ZYA2|RIMP_RHOE4 Ribosome maturation factor rimP OS=Rho
+ 2.9 12.7 0.1 4.7e+02 5.5 0.0 2.2 2 sp|Q98G87|UBIG_RHILO 3-demethylubiquinone-9 3-methyltransfe
+ 3.6 12.4 0.1 13 10.6 0.0 1.8 2 sp|B2VCH7|MTLD_ERWT9 Mannitol-1-phosphate 5-dehydrogenase O
+ 4.5 12.1 0.5 11 10.8 0.3 1.7 1 sp|A1WE19|RLMN_VEREI Ribosomal RNA large subunit methyltran
+ 4.6 12.0 1.0 7.6 11.3 0.1 1.8 2 sp|Q2J713|RLMN_FRASC Ribosomal RNA large subunit methyltran
+ 5.4 11.8 0.0 12 10.7 0.0 1.5 2 sp|Q9CZP0|UFSP1_MOUSE Ufm1-specific protease 1 OS=Mus muscul
+ 7.4 11.4 0.2 32 9.3 0.0 1.9 2 sp|Q21KT6|RLMN_SACD2 Ribosomal RNA large subunit methyltran
+ 7.5 11.4 0.0 9.9 11.0 0.0 1.3 1 sp|Q7W7U1|NADD_BORPA Probable nicotinate-nucleotide adenyly
+ 7.9 11.3 0.9 5.7e+02 5.2 0.0 3.1 3 sp|Q8C6Y6|ASB14_MOUSE Ankyrin repeat and SOCS box protein 14
+ 8 11.3 0.1 13 10.6 0.1 1.4 1 sp|Q8Y3H7|Y003_RALSO UPF0161 protein RSc0003 OS=Ralstonia s
+ 8.1 11.2 0.7 2.4e+02 6.4 0.0 2.8 3 sp|A4G4J9|RLMN_HERAR Ribosomal RNA large subunit methyltran
+ 8.8 11.1 0.2 16 10.2 0.2 1.4 1 sp|B8F3W8|LEUC_HAEPS 3-isopropylmalate dehydratase large su
+ 9.6 11.0 0.0 12 10.7 0.0 1.1 1 sp|Q07074|YH007_YEAST Uncharacterized protein YHR007C-A OS=S
+ 9.7 11.0 1.5 1.9e+02 6.8 0.1 2.8 3 sp|A6SZX3|RLMN_JANMA Ribosomal RNA large subunit methyltran
+ 9.7 11.0 2.6 12 10.7 0.4 2.0 2 sp|A2SHB8|RLMN_METPP Ribosomal RNA large subunit methyltran
+
+
+Domain annotation for each sequence (and alignments):
+>> sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium sp. (strain NGR234) GN=NGR_a00980 PE=4 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 387.6 1.4 7.5e-120 2.1e-115 1 181 [] 1 181 [] 1 181 [] 1.00
+
+ Alignments for each domain:
+ == domain 1 score: 387.6 bits; conditional E-value: 7.5e-120
+ sp|P55685|Y4WG_RHISN 1 ltascrirrnsnsaqkstlgwsalstsdskvfyrvawllgrgklaeidailitdvngigttaddqlafvsliadqgetttvafgpeigs 89
+ +tascrirrnsnsaqkst+gwsalstsdskvfyrvawllgrgk+aeidailitdvngigttaddqlafvsliadqgetttvafgpeigs
+ sp|P55685|Y4WG_RHISN 1 MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGTTADDQLAFVSLIADQGETTTVAFGPEIGS 89
+ 8**************************************************************************************** PP
+
+ sp|P55685|Y4WG_RHISN 90 riaasflaacgqlqhqiatrtgkeerkfkpfaaagfsvraglaadgsnsgllsistvagaevhfiaterslrelenqltllleqlrlrs 178
+ riaasf+aacgqlqhqiatrtgkeerkfkpfaaagfsvraglaadgsnsg+lsistvagaevhfiaterslrelenqltllleqlrlrs
+ sp|P55685|Y4WG_RHISN 90 RIAASFMAACGQLQHQIATRTGKEERKFKPFAAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRS 178
+ ***************************************************************************************** PP
+
+ sp|P55685|Y4WG_RHISN 179 rpn 181
+ rpn
+ sp|P55685|Y4WG_RHISN 179 RPN 181
+ **8 PP
+
+>> sp|A1VDW9|HEM1_DESVV Glutamyl-tRNA reductase OS=Desulfovibrio vulgaris subsp. vulgaris (strain DP4) GN=hemA PE=3 SV=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.4 0.0 0.00026 7.4 63 108 .. 39 86 .. 10 104 .. 0.76
+ 2 ? -1.1 0.0 1.8 5e+04 36 50 .. 185 199 .. 172 225 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.4 bits; conditional E-value: 0.00026
+ sp|P55685|Y4WG_RHISN 63 ddqlafvsli..adqgetttvafgpeigsriaasflaacgqlqhqiat 108
+ dd ++ v ++ +++ e v+ gpe+ sr+ ++ aa gq++h++a
+ sp|A1VDW9|HEM1_DESVV 39 DDVVSEVLILstCNRVEILAVGRGPEVVSRVLRGWAAARGQCEHDLAP 86
+ 55554444431156778889999*********************9985 PP
+
+ == domain 2 score: -1.1 bits; conditional E-value: 1.8
+ sp|P55685|Y4WG_RHISN 36 awllgrgklaeidai 50
+ a l+g g +ae+ a
+ sp|A1VDW9|HEM1_DESVV 185 AMLIGAGEMAELAAT 199
+ 789999999999775 PP
+
+>> sp|Q72C23|HEM1_DESVH Glutamyl-tRNA reductase OS=Desulfovibrio vulgaris (strain Hildenborough / ATCC 29579 / NCIMB 83
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.0 0.00033 9.5 63 108 .. 39 86 .. 10 104 .. 0.76
+ 2 ? -1.1 0.0 1.8 5e+04 36 50 .. 185 199 .. 172 225 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.00033
+ sp|P55685|Y4WG_RHISN 63 ddqlafvsli..adqgetttvafgpeigsriaasflaacgqlqhqiat 108
+ dd ++ v ++ +++ e v+ gpe+ sr+ ++ aa gq++h++a
+ sp|Q72C23|HEM1_DESVH 39 DDVVSEVLILstCNRVEILAVGRGPEVVSRVLRGWSAARGQCEHDLAP 86
+ 55554444431156778889999*********************9985 PP
+
+ == domain 2 score: -1.1 bits; conditional E-value: 1.8
+ sp|P55685|Y4WG_RHISN 36 awllgrgklaeidai 50
+ a l+g g +ae+ a
+ sp|Q72C23|HEM1_DESVH 185 AMLIGAGEMAELAAT 199
+ 789999999999775 PP
+
+>> sp|C0ZYA2|RIMP_RHOE4 Ribosome maturation factor rimP OS=Rhodococcus erythropolis (strain PR4 / NBRC 100887) GN=rimP
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.8 0.1 0.00077 22 36 76 .. 93 131 .. 82 148 .. 0.83
+ 2 ? 0.6 0.0 0.53 1.5e+04 40 65 .. 167 192 .. 155 200 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 9.8 bits; conditional E-value: 0.00077
+ sp|P55685|Y4WG_RHISN 36 awllgrgklaeidailitdvngigttaddqlafvsliadqg 76
+ w rg+ a+id t v+ igt dd +a v i+ +g
+ sp|C0ZYA2|RIMP_RHOE4 93 HWRRARGRKARIDLAGETVVGRIGTLNDDSVAVV--IGGRG 131
+ 699**************************99976..45555 PP
+
+ == domain 2 score: 0.6 bits; conditional E-value: 0.53
+ sp|P55685|Y4WG_RHISN 40 grgklaeidailitdvngigttaddq 65
+ g+ da+ +td +g+ + dd+
+ sp|C0ZYA2|RIMP_RHOE4 167 PEGRAVPSDAVDLTDDSGVDSVEDDE 192
+ 56888899************999997 PP
+
+>> sp|Q98G87|UBIG_RHILO 3-demethylubiquinone-9 3-methyltransferase OS=Rhizobium loti GN=ubiG PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 5.5 0.0 0.016 4.7e+02 101 123 .. 44 66 .. 32 95 .. 0.81
+ 2 ? 5.2 0.0 0.02 5.8e+02 71 103 .. 122 156 .. 107 175 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 5.5 bits; conditional E-value: 0.016
+ sp|P55685|Y4WG_RHISN 101 qlqhqiatrtgkeerkfkpfaaa 123
+ ++ qia r g++ r +pf +
+ sp|Q98G87|UBIG_RHILO 44 YIRDQIAARFGRDPRAARPFEGL 66
+ 5789****************754 PP
+
+ == domain 2 score: 5.2 bits; conditional E-value: 0.02
+ sp|P55685|Y4WG_RHISN 71 liadqgetttvafgpeigsriaa..sflaacgqlq 103
+ +ad get v e+ ++a f+a cgq+
+ sp|Q98G87|UBIG_RHILO 122 DLADAGETFDVILNMEVVEHVADidLFVAKCGQMV 156
+ 589*****************99633699*****85 PP
+
+>> sp|B2VCH7|MTLD_ERWT9 Mannitol-1-phosphate 5-dehydrogenase OS=Erwinia tasmaniensis (strain DSM 17950 / Et1/99) GN=mtl
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.6 0.0 0.00046 13 44 96 .. 54 100 .. 45 113 .. 0.76
+ 2 ? -1.7 0.0 2.8 7.9e+04 40 77 .. 248 282 .. 233 293 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 10.6 bits; conditional E-value: 0.00046
+ sp|P55685|Y4WG_RHISN 44 laeidailitdvngigttaddqlafvsliadqgetttvafgpeigsriaasfl 96
+ +a+i+ ++ vn + +++dd +a lia+ + t a gp+i riaa++
+ sp|B2VCH7|MTLD_ERWT9 54 QAQIE--IVNGVNAVHSSSDDIIA---LIAEV-DIVTTAVGPQILERIAAGMA 100
+ 55554..56788999999998655...67765.5667799*********9865 PP
+
+ == domain 2 score: -1.7 bits; conditional E-value: 2.8
+ sp|P55685|Y4WG_RHISN 40 grgklaeidailitdvngigttaddqlafvsliadqge 77
+ +g + e a+li g ad + a+++ i ++ e
+ sp|B2VCH7|MTLD_ERWT9 248 VQGAMEESGAVLIK---RYGFAADKHAAYIQKIINRFE 282
+ 56888888888875...568889999999988887766 PP
+
+>> sp|A1WE19|RLMN_VEREI Ribosomal RNA large subunit methyltransferase N OS=Verminephrobacter eiseniae (strain EF01-2) G
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.3 0.0004 11 56 119 .. 304 362 .. 276 388 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.0004
+ sp|P55685|Y4WG_RHISN 56 ngigttaddq.lafvsliadqgetttvafgpeigsriaasflaacgqlqhqiatrtgkeerkfkp 119
+ +g+ +a dq laf ++++ g ttv g+ ia aacgql ++ rt er k
+ sp|A1WE19|RLMN_VEREI 304 SGLLRSAHDQiLAFAQVLGAAGIVTTVRK--TRGDDIA----AACGQLAGDVRDRTRVAERMAKQ 362
+ 5666777777479************9974..5677776....69************999998775 PP
+
+>> sp|Q2J713|RLMN_FRASC Ribosomal RNA large subunit methyltransferase N OS=Frankia sp. (strain CcI3) GN=rlmN PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? -2.8 0.1 6 1.7e+05 77 108 .. 135 156 .. 120 169 .. 0.57
+ 2 ? 11.3 0.1 0.00027 7.6 42 119 .. 324 395 .. 316 413 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: -2.8 bits; conditional E-value: 6
+ sp|P55685|Y4WG_RHISN 77 etttvafgpeigsriaasflaacgqlqhqiat 108
+ + tv+ + g+ +++ f+a t
+ sp|Q2J713|RLMN_FRASC 135 DRATVCVSSQAGCGMGCPFCA----------T 156
+ 445555555555555555544..........2 PP
+
+ == domain 2 score: 11.3 bits; conditional E-value: 0.00027
+ sp|P55685|Y4WG_RHISN 42 gklaeidailitdvngigtta...ddqlafvsliadqgetttvafgpeigsriaasflaacgqlqhqiatrtgkeerkfkp 119
+ g+la+++ i + +g a q afv + d+g ttv g ia aacgql + gk er +p
+ sp|Q2J713|RLMN_FRASC 324 GRLAHVNLIPLNPTGGSSWRAsapAGQRAFVRRLRDRGIVTTVRD--TRGREIA----AACGQLAAE---PAGKPERTDRP 395
+ 6778888888877777655441114799**************974..4566666....69***9755...55777777776 PP
+
+>> sp|Q9CZP0|UFSP1_MOUSE Ufm1-specific protease 1 OS=Mus musculus GN=Ufsp1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.0 0.0004 12 107 155 .. 126 173 .. 104 189 .. 0.84
+ 2 ? -2.1 0.0 3.6 1e+05 17 37 .. 192 213 .. 180 215 .. 0.71
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.0004
+ sp|P55685|Y4WG_RHISN 107 atrtgkeerkfkpfaaagfsvraglaadgsnsgllsistvagaevhfia 155
+ + g eer + f +g v g ad ++ ll+i+ g+ev+ +
+ sp|Q9CZP0|UFSP1_MOUSE 126 G-LRGEEERLYSHFTTGGGPVMVGGDADAQSKALLGICEGPGSEVYVLI 173
+ 3.459***************************************98765 PP
+
+ == domain 2 score: -2.1 bits; conditional E-value: 3.6
+ sp|P55685|Y4WG_RHISN 17 stlgwsal.stsdskvfyrvaw 37
+ + +gw+ + s ds fy +++
+ sp|Q9CZP0|UFSP1_MOUSE 192 GWVGWQKVkSVFDSNSFYNLCF 213
+ 4578876537789999998875 PP
+
+>> sp|Q21KT6|RLMN_SACD2 Ribosomal RNA large subunit methyltransferase N OS=Saccharophagus degradans (strain 2-40 / ATCC
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? -0.8 0.0 1.4 4e+04 74 156 .. 105 129 .. 83 158 .. 0.62
+ 2 ? 9.3 0.0 0.0011 32 67 115 .. 324 366 .. 312 381 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: -0.8 bits; conditional E-value: 1.4
+ sp|P55685|Y4WG_RHISN 74 dqgetttvafgpeigsriaasflaacgqlqhqiatrtgkeerkfkpfaaagfsvraglaadgsnsgllsistvagaevhfiat 156
+ +g+ t++ ++g+ + +sf+a t
+ sp|Q21KT6|RLMN_SACD2 105 PDGDRGTLCVSSQVGCSLDCSFCA----------------------------------------------------------T 129
+ 234444555555555555555544..........................................................3 PP
+
+ == domain 2 score: 9.3 bits; conditional E-value: 0.0011
+ sp|P55685|Y4WG_RHISN 67 afvsliadqgetttvafgpeigsriaasflaacgqlqhqiatrtgkeer 115
+ f +++ d g tttv g+ + aacgql q+ rt + +r
+ sp|Q21KT6|RLMN_SACD2 324 RFQQILIDAGYTTTVRT--TRGDD----IDAACGQLAGQVNDRTKRSQR 366
+ 58889999999999974..34554....5689************88776 PP
+
+>> sp|Q7W7U1|NADD_BORPA Probable nicotinate-nucleotide adenylyltransferase OS=Bordetella parapertussis GN=nadD PE=3 SV=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.0 0.00035 9.9 105 152 .. 146 193 .. 100 197 .] 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.00035
+ sp|P55685|Y4WG_RHISN 105 qiatrtgkeerkfkpfaaagfsvraglaadgsnsgllsistvagaevh 152
+ a r +e f p+a + ++r laad + +gll a h
+ sp|Q7W7U1|NADD_BORPA 146 LAAHRRQLHELPFAPMAVSASDIRQRLAADAATDGLLPEPVAAYIATH 193
+ 34557778999*************************987666655555 PP
+
+>> sp|Q8C6Y6|ASB14_MOUSE Ankyrin repeat and SOCS box protein 14 OS=Mus musculus GN=Asb14 PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 5.2 0.0 0.02 5.7e+02 124 158 .. 216 249 .. 205 256 .. 0.83
+ 2 ? 1.6 0.0 0.26 7.3e+03 131 166 .. 320 355 .. 309 361 .. 0.86
+ 3 ? 0.2 0.1 0.68 1.9e+04 149 178 .. 522 553 .. 518 554 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 5.2 bits; conditional E-value: 0.02
+ sp|P55685|Y4WG_RHISN 124 gfsvraglaadgsnsgllsistvagaevhfiater 158
+ gf+ laa+g+++g++++ ga+vh a++
+ sp|Q8C6Y6|ASB14_MOUSE 216 GFTP-LALAAQGGHTGIMQLLLQKGADVHSQASDS 249
+ 6654.469*********************988775 PP
+
+ == domain 2 score: 1.6 bits; conditional E-value: 0.26
+ sp|P55685|Y4WG_RHISN 131 laadgsnsgllsistvagaevhfiaterslrelenq 166
+ +aa g++ +l + ag +v+f+ +r ++ ++q
+ sp|Q8C6Y6|ASB14_MOUSE 320 CAAAGAHPHCLELLIQAGFDVNFMLDQRIRKHYDDQ 355
+ 68899999*****************99988887776 PP
+
+ == domain 3 score: 0.2 bits; conditional E-value: 0.68
+ sp|P55685|Y4WG_RHISN 149 aevhfi.aterslrelen.qltllleqlrlrs 178
+ e+hfi a rsl++l + ++ ++ +lrlr+
+ sp|Q8C6Y6|ASB14_MOUSE 522 PEIHFIlANPRSLQHLCRlKIRKCMGRLRLRC 553
+ 589*9847789**9986526777888888885 PP
+
+>> sp|Q8Y3H7|Y003_RALSO UPF0161 protein RSc0003 OS=Ralstonia solanacearum GN=RSc0003 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.6 0.1 0.00044 13 64 101 .. 22 59 .. 10 68 .. 0.90
+
+ Alignments for each domain:
+ == domain 1 score: 10.6 bits; conditional E-value: 0.00044
+ sp|P55685|Y4WG_RHISN 64 dqlafvsliadqgetttvafgpeigsriaasflaacgq 101
+ q+ f+ ++d + + gp igs +aa l+ c
+ sp|Q8Y3H7|Y003_RALSO 22 AQCRFLPTCSDYARDAVLTHGPAIGSYLAAKRLCRCHP 59
+ 5889999***************************9975 PP
+
+>> sp|A4G4J9|RLMN_HERAR Ribosomal RNA large subunit methyltransferase N OS=Herminiimonas arsenicoxydans GN=rlmN PE=3 SV
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 0.1 0.0 0.77 2.2e+04 93 133 .. 14 53 .. 10 72 .. 0.82
+ 2 ? 0.8 0.0 0.46 1.3e+04 136 153 .. 101 118 .. 79 143 .. 0.78
+ 3 ? 6.4 0.0 0.0085 2.4e+02 67 117 .. 321 365 .. 289 375 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 0.1 bits; conditional E-value: 0.77
+ sp|P55685|Y4WG_RHISN 93 asflaacgqlqhqiatrtgkeerkfkpfaaagfsvraglaa 133
+ a+ +a cg+l + r + +r + f+a+ f+ la
+ sp|A4G4J9|RLMN_HERAR 14 AQLIAYCGELGEK-PFRAKQLQRWIHQFGASDFDAMTDLAK 53
+ 677899**99876.578888899999*****9999888875 PP
+
+ == domain 2 score: 0.8 bits; conditional E-value: 0.46
+ sp|P55685|Y4WG_RHISN 136 snsgllsistvagaevhf 153
+ n g l+ist ag+ v+
+ sp|A4G4J9|RLMN_HERAR 101 ENRGTLCISTQAGCAVNC 118
+ 589999999999998753 PP
+
+ == domain 3 score: 6.4 bits; conditional E-value: 0.0085
+ sp|P55685|Y4WG_RHISN 67 afvsliadqgetttvafgpeigsriaasflaacgqlqhqiatrtgkeerkf 117
+ af +++ d g tt+ g+ ++ aacgql ++ rt ++r
+ sp|A4G4J9|RLMN_HERAR 321 AFAQVLMDGGLVTTIRK--TRGD----DIDAACGQLAGEVQDRTRVQDRMK 365
+ 78888888888888753..3344....45689************9998864 PP
+
+>> sp|B8F3W8|LEUC_HAEPS 3-isopropylmalate dehydratase large subunit OS=Haemophilus parasuis serovar 5 (strain SH0165) G
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.2 0.2 0.00057 16 88 168 .. 135 218 .. 90 229 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 10.2 bits; conditional E-value: 0.00057
+ sp|P55685|Y4WG_RHISN 88 gsriaasflaacgqlqhqiatrtgkeerkfkpfaaagfsvraglaadgsnsgllsistvagaevhfia.terslrel..enqlt 168
+ g+ a +f + +++h +at+t k+ r k vr g+ a +++ +t+ag+ h + + ++r+l e+++t
+ sp|B8F3W8|LEUC_HAEPS 135 GAFGALAFGIGTSEVEHVLATQTVKQARAKKMKIEVRGKVREGITAKDIVLAIIGKTTMAGGTGHVVEfCGEAIRDLsmEGRMT 218
+ 33446678888999**************99988888889***********************9998752456777752244555 PP
+
+>> sp|Q07074|YH007_YEAST Uncharacterized protein YHR007C-A OS=Saccharomyces cerevisiae GN=YHR007C-A PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.0 0.00041 12 142 173 .. 32 62 .. 27 68 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.00041
+ sp|P55685|Y4WG_RHISN 142 sistvagaevhfiaterslrelenqltllleq 173
+ s+ t+ a vh+i t+ + ++ enql lll q
+ sp|Q07074|YH007_YEAST 32 SLPTLL-APVHYIPTRLTHHQAENQLFLLLFQ 62
+ 555554.78*******************9987 PP
+
+>> sp|A6SZX3|RLMN_JANMA Ribosomal RNA large subunit methyltransferase N OS=Janthinobacterium sp. (strain Marseille) GN=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 0.1 0.0 0.76 2.2e+04 93 133 .. 13 52 .. 10 71 .. 0.81
+ 2 ? 0.7 0.0 0.49 1.4e+04 136 153 .. 100 117 .. 75 135 .. 0.77
+ 3 ? 6.8 0.1 0.0066 1.9e+02 67 117 .. 322 366 .. 307 376 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 0.1 bits; conditional E-value: 0.76
+ sp|P55685|Y4WG_RHISN 93 asflaacgqlqhqiatrtgkeerkfkpfaaagfsvraglaa 133
+ a+ +a cg+l + r + +r + f+a+ f+ la
+ sp|A6SZX3|RLMN_JANMA 13 AQLIAYCGELGEK-PFRAKQLQRWIHQFGASDFDAMTDLAK 52
+ 6778999999866.5788888999999****9999888875 PP
+
+ == domain 2 score: 0.7 bits; conditional E-value: 0.49
+ sp|P55685|Y4WG_RHISN 136 snsgllsistvagaevhf 153
+ n g l+ist ag+ v+
+ sp|A6SZX3|RLMN_JANMA 100 ENRGTLCISTQAGCAVNC 117
+ 589999999999998753 PP
+
+ == domain 3 score: 6.8 bits; conditional E-value: 0.0066
+ sp|P55685|Y4WG_RHISN 67 afvsliadqgetttvafgpeigsriaasflaacgqlqhqiatrtgkeerkf 117
+ af +++ d g ttv g+ ++ aacgql ++ rt ++r
+ sp|A6SZX3|RLMN_JANMA 322 AFAQVLMDAGIVTTVRK--TRGD----DIDAACGQLAGEVQDRTRVQDRMK 366
+ 78888899999888863..3444....45689************9998864 PP
+
+>> sp|A2SHB8|RLMN_METPP Ribosomal RNA large subunit methyltransferase N OS=Methylibium petroleiphilum (strain PM1) GN=r
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? -0.7 0.0 1.3 3.8e+04 95 116 .. 135 156 .. 78 166 .. 0.59
+ 2 ? 10.7 0.4 0.00042 12 66 139 .. 319 387 .. 291 393 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: -0.7 bits; conditional E-value: 1.3
+ sp|P55685|Y4WG_RHISN 95 flaacgqlqhqiatrtgkeerk 116
+ ++a + +hq+ r g er
+ sp|A2SHB8|RLMN_METPP 135 IVAQLWHAEHQLRARLGTTERV 156
+ 4445555667777777777765 PP
+
+ == domain 2 score: 10.7 bits; conditional E-value: 0.00042
+ sp|P55685|Y4WG_RHISN 66 lafvsliadqgetttvafgpeigsriaasflaacgqlqhqiatrtgkeerkfk.pfaaagfsvraglaadgsnsg 139
+ af +l+ d g ttv g+ ++ aacgql ++ rt + r + p+a ++ ad + sg
+ sp|A2SHB8|RLMN_METPP 319 QAFAQLLVDGGLVTTVRR--TRGD----DIDAACGQLAGEVQDRTNAQARMRRaPIAIRPIDSAVQRRADAAPSG 387
+ 489999999999999964..3354....45689************999885443888887777777777777766 PP
+
+
+
+Internal pipeline statistics summary:
+-------------------------------------
+Query model(s): 1 (181 nodes)
+Target sequences: 516081 (181677051 residues)
+Passed MSV filter: 11913 (0.0230836); expected 10321.6 (0.02)
+Passed bias filter: 11913 (0.0230836); expected 10321.6 (0.02)
+Passed Vit filter: 1904 (0.00368934); expected 516.1 (0.001)
+Passed Fwd filter: 38 (7.36319e-05); expected 5.2 (1e-05)
+Initial search space (Z): 516081 [actual number of targets]
+Domain search space (domZ): 18 [number of targets reported over threshold]
+# CPU time: 6.07u 0.08s 00:00:06.15 Elapsed: 00:00:02.46
+# Mc/sec: 13367.30
+//
+Query: sp|Q1XGE2|HAC1_ASPOR [L=345]
+Description: Transcriptional activator hacA OS=Aspergillus oryzae GN=hacA PE=2 SV=1
+Scores for complete sequences (score includes all domains):
+ --- full sequence --- --- best 1 domain --- -#dom-
+ E-value score bias E-value score bias exp N Sequence Description
+ ------- ------ ----- ------- ------ ----- ---- -- -------- -----------
+ 2e-228 762.1 3.5 2.2e-228 762.0 2.4 1.0 1 sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspe
+ 1.2e-169 568.8 2.3 1.5e-169 568.6 1.6 1.0 1 sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS=Emer
+ 1.5e-26 98.4 9.3 1.5e-26 98.4 6.4 3.2 3 sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS=Tric
+ 1.3e-12 52.6 5.6 1.3e-12 52.6 3.9 1.7 1 sp|P41546|HAC1_YEAST Transcriptional activator HAC1 OS=Sacc
+ 6e-11 47.1 2.6 6.9e-11 46.9 1.8 1.1 1 sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabidopsi
+ 4.6e-07 34.3 0.7 6e-07 33.9 0.5 1.3 1 sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos taurus
+ 7.8e-07 33.6 5.7 9.5e-07 33.3 3.9 1.1 1 sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanum ly
+ 1.7e-06 32.5 2.8 2.4e-06 32.0 2.0 1.3 1 sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Homo sapien
+ 9.6e-06 30.0 4.8 1.2e-05 29.6 3.4 1.1 1 sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=Arabi
+ 2.2e-05 28.8 0.0 3.8e-05 28.0 0.0 1.3 1 sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive element-binding
+ 6.8e-05 27.2 2.5 0.0001 26.6 1.7 1.3 1 sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-binding
+ 7.1e-05 27.1 3.1 0.00011 26.6 2.2 1.4 1 sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Rattus norv
+ 0.00017 25.8 0.5 0.00027 25.2 0.3 1.3 1 sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper transcri
+ 0.00023 25.5 0.8 0.0004 24.7 0.2 1.6 1 sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive element-binding
+ 0.00023 25.4 4.5 0.00023 25.4 3.1 1.6 1 sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF2 OS=Petro
+ 0.00028 25.2 0.2 0.00056 24.2 0.2 1.4 1 sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-binding
+ 0.00029 25.1 3.1 0.00044 24.5 2.2 1.3 1 sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mus musculu
+ 0.00031 25.0 0.1 0.00043 24.5 0.0 1.2 1 sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-binding
+ 0.00058 24.1 0.3 0.00058 24.1 0.2 1.7 1 sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-binding
+ 0.0006 24.1 2.0 0.0006 24.1 1.4 1.8 2 sp|O57342|MAFA_COTJA Transcription factor MafA OS=Coturnix
+ 0.00063 24.0 3.1 0.0012 23.1 2.2 1.4 1 sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-binding
+ 0.00077 23.7 2.0 0.00089 23.5 0.3 1.7 1 sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive element-binding
+ 0.00091 23.5 3.2 0.0035 21.5 1.0 2.0 2 sp|Q90370|MAFB_COTJA Transcription factor MafB OS=Coturnix
+ 0.00095 23.4 0.1 0.0015 22.7 0.0 1.4 1 sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-binding
+ 0.001 23.3 0.4 0.0019 22.4 0.3 1.3 1 sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive element-binding
+ 0.0011 23.3 0.6 0.0021 22.3 0.4 1.4 1 sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive element-binding
+ 0.0012 23.1 3.7 0.0043 21.3 1.3 2.0 2 sp|Q90888|MAFB_CHICK Transcription factor MafB OS=Gallus ga
+ 0.0013 23.0 0.2 0.0013 23.0 0.1 1.6 1 sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-binding
+ 0.0014 22.9 0.1 0.0023 22.2 0.1 1.3 1 sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive element-binding
+ 0.0014 22.9 1.3 0.0021 22.3 0.2 1.8 1 sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS=Homo sapi
+ 0.0016 22.7 0.1 0.0027 22.0 0.1 1.3 1 sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive element-binding
+ 0.0017 22.6 1.7 0.044 17.9 0.8 2.1 2 sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS=Xenopus l
+ 0.0018 22.6 0.0 0.0032 21.7 0.0 1.5 1 sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive element-binding
+ 0.0018 22.6 0.1 0.0028 21.9 0.0 1.2 1 sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive element-binding
+ 0.0021 22.3 1.7 0.0023 22.2 0.2 1.7 1 sp|P54842|MAFB_RAT Transcription factor MafB OS=Rattus no
+ 0.0021 22.3 0.1 0.0032 21.7 0.0 1.2 1 sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element-binding
+ 0.0021 22.3 0.2 0.0024 22.1 0.2 1.0 1 sp|Q16520|BATF_HUMAN Basic leucine zipper transcriptional f
+ 0.0023 22.1 0.3 0.0023 22.1 0.2 1.8 1 sp|P54841|MAFB_MOUSE Transcription factor MafB OS=Mus muscu
+ 0.0027 21.9 0.3 0.0027 21.9 0.2 1.8 1 sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS=Macaca fa
+ 0.0029 21.8 2.4 0.0029 21.8 1.6 1.8 2 sp|O42290|MAFA_CHICK Transcription factor MafA OS=Gallus ga
+ 0.003 21.8 3.8 0.0033 21.6 2.6 1.1 1 sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcriptional f
+ 0.0037 21.5 0.0 0.0066 20.7 0.0 1.5 1 sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive element-binding
+ 0.004 21.4 0.0 0.004 21.4 0.0 1.6 1 sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element-binding
+ 0.0043 21.3 3.0 0.011 19.9 2.1 1.7 1 sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcription fac
+ 0.0053 21.0 0.9 0.0092 20.2 0.6 1.3 1 sp|O43889|CREB3_HUMAN Cyclic AMP-responsive element-binding
+ 0.0054 20.9 2.2 0.0054 20.9 1.5 1.7 1 sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcription fac
+ 0.0057 20.9 3.2 0.014 19.6 2.2 1.6 1 sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcription fac
+ 0.0068 20.6 0.1 0.0076 20.5 0.1 1.1 1 sp|O35284|BATF_MOUSE Basic leucine zipper transcriptional f
+ 0.0084 20.3 0.3 0.012 19.8 0.2 1.2 1 sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive element-binding
+ 0.0089 20.2 5.8 0.014 19.6 3.7 1.5 1 sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive element-binding
+ 0.0097 20.1 4.3 0.012 19.9 2.9 1.1 1 sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcriptional f
+ ------ inclusion threshold ------
+ 0.012 19.9 4.4 0.029 18.5 1.1 2.0 2 sp|Q504L8|MAFB_XENTR Transcription factor MafB OS=Xenopus t
+ 0.012 19.8 5.2 0.012 19.8 3.6 1.8 1 sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive element-binding
+ 0.016 19.4 2.1 0.026 18.7 1.5 1.3 1 sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS=Xenopus t
+ 0.018 19.3 1.8 0.32 15.1 1.3 2.0 2 sp|P23091|MAF_AVIS4 Transforming protein Maf OS=Avian musc
+ 0.018 19.2 0.4 0.026 18.7 0.3 1.2 1 sp|P81269|ATF1_MOUSE Cyclic AMP-dependent transcription fac
+ 0.019 19.2 1.6 0.38 14.9 1.2 2.0 2 sp|Q789F3|MAF_CHICK Transcription factor Maf OS=Gallus gal
+ 0.02 19.1 0.1 0.042 18.0 0.1 1.5 1 sp|P29747|CREBA_DROME Cyclic AMP response element-binding pr
+ 0.02 19.0 0.5 0.034 18.3 0.3 1.3 1 sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcription fac
+ 0.024 18.8 1.8 0.33 15.1 0.9 2.1 2 sp|P54844|MAF_RAT Transcription factor Maf OS=Rattus nor
+ 0.024 18.8 1.5 0.43 14.7 1.0 2.1 2 sp|O75444|MAF_HUMAN Transcription factor Maf OS=Homo sapie
+ 0.024 18.8 3.3 0.032 18.4 2.3 1.1 1 sp|P97876|BATF3_RAT Basic leucine zipper transcriptional f
+ 0.025 18.8 0.3 0.025 18.8 0.2 1.7 1 sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcription fac
+ 0.025 18.7 1.5 0.43 14.7 1.0 2.1 2 sp|A7Z017|MAF_BOVIN Transcription factor Maf OS=Bos taurus
+ 0.026 18.7 1.7 0.53 14.4 1.2 2.2 2 sp|Q0V9K1|MAF_XENTR Transcription factor Maf OS=Xenopus tr
+ 0.028 18.6 0.3 0.047 17.9 0.2 1.4 1 sp|Q08DA8|ATF1_BOVIN Cyclic AMP-dependent transcription fac
+ 0.029 18.5 0.3 0.03 18.5 0.2 1.1 1 sp|O60675|MAFK_HUMAN Transcription factor MafK OS=Homo sapi
+ 0.03 18.5 2.0 0.48 14.5 1.1 2.1 2 sp|P54843|MAF_MOUSE Transcription factor Maf OS=Mus muscul
+ 0.036 18.2 0.3 0.05 17.8 0.2 1.2 1 sp|P18846|ATF1_HUMAN Cyclic AMP-dependent transcription fac
+ 0.039 18.1 1.9 0.039 18.1 1.3 2.2 1 sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Arabidopsis
+ 0.039 18.1 0.4 0.039 18.1 0.3 1.1 1 sp|Q61827|MAFK_MOUSE Transcription factor MafK OS=Mus muscu
+ 0.046 17.9 0.9 0.058 17.6 0.6 1.1 1 sp|P14233|TGA1B_TOBAC TGACG-sequence-specific DNA-binding pr
+ 0.051 17.7 0.6 0.086 17.0 0.4 1.3 1 sp|Q6NW59|ATF4_DANRE Cyclic AMP-dependent transcription fac
+ 0.067 17.3 2.3 0.15 16.2 1.6 1.6 1 sp|O24160|TGA21_TOBAC TGACG-sequence-specific DNA-binding pr
+ 0.07 17.3 2.8 0.21 15.7 1.3 1.9 2 sp|Q98UK4|MAF_DANRE Transcription factor Maf OS=Danio reri
+ 0.071 17.3 0.8 0.11 16.7 0.6 1.2 1 sp|A3KMR8|MAFA_DANRE Transcription factor MafA OS=Danio rer
+ 0.078 17.1 0.7 0.09 16.9 0.5 1.1 1 sp|Q90596|MAFK_CHICK Transcription factor MafK OS=Gallus ga
+ 0.079 17.1 0.5 0.13 16.4 0.3 1.4 1 sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcription fac
+ 0.086 17.0 1.2 0.088 17.0 0.8 1.1 1 sp|P97875|JDP2_MOUSE Jun dimerization protein 2 OS=Mus musc
+ 0.086 17.0 1.2 0.088 17.0 0.8 1.1 1 sp|Q78E65|JDP2_RAT Jun dimerization protein 2 OS=Rattus n
+ 0.092 16.9 0.2 0.15 16.2 0.2 1.3 1 sp|P12959|OP2_MAIZE Regulatory protein opaque-2 OS=Zea may
+ 0.093 16.9 6.4 0.093 16.9 4.4 2.1 2 sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive element-binding
+ 0.093 16.9 4.3 0.16 16.1 3.0 1.3 1 sp|Q39140|TGA6_ARATH Transcription factor TGA6 OS=Arabidops
+ 0.098 16.8 4.3 0.19 15.9 2.9 1.4 1 sp|P23923|HBP1B_WHEAT Transcription factor HBP-1b(c38) OS=Tr
+ 0.11 16.7 1.0 0.21 15.7 0.7 1.6 1 sp|Q00322|CEBPD_MOUSE CCAAT/enhancer-binding protein delta O
+ 0.11 16.6 3.2 0.18 15.9 2.2 1.3 1 sp|Q39163|TGA5_ARATH Transcription factor TGA5 OS=Arabidops
+ 0.12 16.5 1.0 0.21 15.7 0.7 1.3 1 sp|Q54RZ9|BZPG_DICDI Probable basic-leucine zipper transcri
+ 0.12 16.5 0.5 0.21 15.7 0.3 1.3 1 sp|Q8CF90|MAFA_MOUSE Transcription factor MafA OS=Mus muscu
+ 0.13 16.4 0.2 0.13 16.4 0.2 1.8 1 sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcription fac
+ 0.15 16.2 3.5 0.26 15.4 2.4 1.3 1 sp|P43273|TGA2_ARATH Transcription factor TGA2 OS=Arabidops
+ 0.16 16.1 5.8 0.22 15.7 1.5 2.1 2 sp|Q98UK5|MAFB_DANRE Transcription factor MafB OS=Danio rer
+ 0.17 16.0 1.5 0.38 14.9 1.0 1.6 1 sp|P16951|ATF2_MOUSE Cyclic AMP-dependent transcription fac
+ 0.18 15.9 2.1 0.5 14.5 0.1 2.1 2 sp|P27925|CREB1_BOVIN Cyclic AMP-responsive element-binding
+ 0.19 15.9 1.4 0.41 14.8 1.0 1.6 1 sp|P15336|ATF2_HUMAN Cyclic AMP-dependent transcription fac
+ 0.19 15.9 2.6 0.46 14.6 1.8 1.6 1 sp|O35451|ATF6B_MOUSE Cyclic AMP-dependent transcription fac
+ 0.19 15.9 7.0 0.36 15.0 4.8 1.4 1 sp|Q2VZV0|IF2_MAGSA Translation initiation factor IF-2 OS=
+ 0.21 15.7 1.1 0.37 14.9 0.8 1.5 1 sp|Q6ZDF3|TRAB1_ORYSJ bZIP transcription factor TRAB1 OS=Ory
+ 0.22 15.7 1.6 0.5 14.5 1.1 1.6 1 sp|Q6P788|ATF5_RAT Cyclic AMP-dependent transcription fac
+ 0.22 15.6 6.7 0.22 15.6 4.7 2.2 2 sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive element-binding
+ 0.23 15.6 0.3 1 13.5 0.1 1.9 2 sp|Q66J36|NFIL3_XENLA Nuclear factor interleukin-3-regulated
+ 0.29 15.3 0.6 0.52 14.4 0.4 1.3 1 sp|Q8NHW3|MAFA_HUMAN Transcription factor MafA OS=Homo sapi
+ 0.37 14.9 0.5 0.76 13.9 0.3 1.5 1 sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocricetus a
+ 0.38 14.9 0.1 0.62 14.2 0.0 1.3 1 sp|P23922|HBP1A_WHEAT Transcription factor HBP-1a OS=Triticu
+ 0.39 14.9 0.2 0.45 14.6 0.1 1.0 1 sp|Q90595|MAFF_CHICK Transcription factor MafF OS=Gallus ga
+ 0.39 14.8 3.0 0.76 13.9 0.4 2.1 2 sp|P53450|FOS_TAKRU Proto-oncogene c-Fos OS=Takifugu rubri
+ 0.43 14.7 2.8 1.1 13.3 1.9 1.7 1 sp|Q00969|ATF2_RAT Cyclic AMP-dependent transcription fac
+ 0.43 14.7 0.2 0.78 13.8 0.2 1.5 1 sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scrofa GN=
+ 0.51 14.5 0.1 0.84 13.7 0.1 1.5 1 sp|P79145|CREM_CANFA cAMP-responsive element modulator OS=C
+ 0.52 14.4 2.9 1.1 13.3 2.0 1.6 1 sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcription fac
+ 0.53 14.4 0.1 0.85 13.7 0.1 1.4 1 sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus musculus G
+ 0.54 14.4 0.1 0.54 14.4 0.1 1.8 1 sp|P15337|CREB1_RAT Cyclic AMP-responsive element-binding
+ 0.54 14.4 0.1 0.54 14.4 0.1 1.9 1 sp|P16220|CREB1_HUMAN Cyclic AMP-responsive element-binding
+ 0.54 14.4 0.1 0.54 14.4 0.1 1.9 1 sp|Q01147|CREB1_MOUSE Cyclic AMP-responsive element-binding
+ 0.57 14.3 3.5 1.1 13.3 2.4 1.5 1 sp|O93602|ATF2_CHICK Cyclic AMP-dependent transcription fac
+ 0.63 14.1 0.7 0.75 13.9 0.5 1.1 1 sp|Q90889|MAFG_CHICK Transcription factor MafG OS=Gallus ga
+ 0.64 14.1 0.1 1 13.5 0.1 1.3 1 sp|P79702|FOS_CYPCA Proto-oncogene c-Fos OS=Cyprinus carpi
+ 0.64 14.1 3.7 1 13.5 2.5 1.2 1 sp|Q8X229|FCR3_CANAL Fluconazole resistance protein 3 OS=Ca
+ 0.65 14.1 0.3 1.3 13.1 0.2 1.6 1 sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus norvegi
+ 0.71 14.0 4.9 1.3 13.1 3.4 1.4 1 sp|P49716|CEBPD_HUMAN CCAAT/enhancer-binding protein delta O
+ 0.72 14.0 0.3 0.72 14.0 0.2 1.7 1 sp|Q554P0|BZPJ_DICDI Probable basic-leucine zipper transcri
+ 0.74 13.9 0.1 0.74 13.9 0.1 2.2 1 sp|Q55E93|BZPE_DICDI Probable basic-leucine zipper transcri
+ 0.75 13.9 0.2 1.1 13.4 0.1 1.2 1 sp|P51984|CREB_CHLVR Cyclic AMP-responsive element-binding
+ 0.77 13.9 0.2 1 13.4 0.1 1.3 1 sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein OS=FBJ
+ 0.81 13.8 0.1 1.3 13.1 0.0 1.6 1 sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos taurus GN=
+ 0.82 13.8 4.0 0.9 13.6 2.7 1.1 1 sp|Q8WYK2|JDP2_HUMAN Jun dimerization protein 2 OS=Homo sap
+ 0.86 13.7 1.4 2.3 12.3 1.0 1.8 1 sp|Q60925|DBP_MOUSE D site-binding protein OS=Mus musculus
+ 0.9 13.6 0.6 1.5 12.9 0.4 1.3 1 sp|P14232|TGA1A_TOBAC TGACG-sequence-specific DNA-binding pr
+ 0.96 13.6 1.4 2.3 12.3 1.0 1.7 1 sp|P16443|DBP_RAT D site-binding protein OS=Rattus norve
+ 0.97 13.5 0.0 1.5 12.9 0.0 1.3 1 sp|Q68EL6|NFIL3_DANRE Nuclear factor interleukin-3-regulated
+ 0.98 13.5 0.2 1.7 12.7 0.2 1.5 1 sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo sapiens G
+ 1 13.5 2.7 1.5 12.9 1.9 1.2 1 sp|Q9C5Q2|AI5L3_ARATH ABSCISIC ACID-INSENSITIVE 5-like prote
+ 1.1 13.4 0.2 2.1 12.4 0.2 1.4 1 sp|Q5FW38|NFIL3_XENTR Nuclear factor interleukin-3-regulated
+ 1.1 13.4 0.1 1.9 12.5 0.1 1.5 1 sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis catus GN
+ 1.2 13.3 3.1 1.9 12.6 2.2 1.3 1 sp|Q9SJN0|ABI5_ARATH Protein ABSCISIC ACID-INSENSITIVE 5 OS
+ 1.2 13.2 3.6 1.9 12.6 2.5 1.2 1 sp|P42777|GBF4_ARATH G-box-binding factor 4 OS=Arabidopsis
+ 1.3 13.1 6.2 1.8 12.6 4.3 1.2 1 sp|P15407|FOSL1_HUMAN Fos-related antigen 1 OS=Homo sapiens
+ 1.3 13.1 0.6 1.5 12.9 0.4 1.1 1 sp|O15525|MAFG_HUMAN Transcription factor MafG OS=Homo sapi
+ 1.4 13.0 0.1 2.5 12.2 0.0 1.3 1 sp|P40535|ACA2_YEAST ATF/CREB activator 2 OS=Saccharomyces
+ 1.5 12.9 0.2 1.7 12.7 0.2 1.1 1 sp|A7YY73|MAFF_BOVIN Transcription factor MafF OS=Bos tauru
+ 1.6 12.9 0.4 1.9e+02 6.0 0.1 2.1 2 sp|Q8PY58|PSMR_METMA Proteasome-activating nucleotidase OS=
+ 1.6 12.8 0.5 3.2 11.8 0.4 1.5 1 sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodopus robor
+ 1.7 12.7 1.1 2.8 12.0 0.8 1.4 1 sp|P23050|FOS_AVINK p55-v-Fos-transforming protein OS=Avia
+ 1.8 12.6 2.3 2.8 12.0 1.6 1.2 1 sp|Q9LES3|AI5L2_ARATH ABSCISIC ACID-INSENSITIVE 5-like prote
+ 2 12.5 2.7 3.5 11.7 1.8 1.4 1 sp|Q84JK2|FD_ARATH Protein FD OS=Arabidopsis thaliana GN=
+ 2 12.5 0.7 2.3 12.3 0.5 1.1 1 sp|A5PJV0|MAFG_BOVIN Transcription factor MafG OS=Bos tauru
+ 2 12.5 0.7 2.3 12.3 0.5 1.1 1 sp|O54790|MAFG_MOUSE Transcription factor MafG OS=Mus muscu
+ 2 12.5 2.7 3.4 11.7 1.9 1.3 1 sp|Q39234|TGA3_ARATH Transcription factor TGA3 OS=Arabidops
+ 2.2 12.4 1.4 3.3 11.8 1.0 1.3 1 sp|P07049|CPPB_NEIGO Cryptic plasmid protein B OS=Neisseria
+ 2.2 12.3 1.2 3.8 11.6 0.9 1.4 1 sp|P11939|FOS_CHICK Proto-oncogene c-Fos OS=Gallus gallus
+ 2.5 12.2 0.0 2.9 12.0 0.0 1.3 1 sp|P29176|FOSX_MSVFR Transforming protein v-Fos/v-Fox OS=FB
+ 2.5 12.2 0.9 2.9 12.0 0.6 1.1 1 sp|O54791|MAFF_MOUSE Transcription factor MafF OS=Mus muscu
+ 2.7 12.1 0.3 1.9e+02 6.0 0.1 2.1 2 sp|Q8TI88|PSMR_METAC Proteasome-activating nucleotidase OS=
+ 2.8 12.0 0.4 5.5 11.1 0.3 1.4 1 sp|O08750|NFIL3_MOUSE Nuclear factor interleukin-3-regulated
+ 2.8 12.0 0.7 3.4 11.7 0.5 1.1 1 sp|Q76MX4|MAFG_RAT Transcription factor MafG OS=Rattus no
+ 3 11.9 1.2 6.4 10.9 0.8 1.5 1 sp|P20482|CNC_DROME Segmentation protein cap'n'collar OS=D
+ 3.1 11.9 0.3 5.3 11.1 0.2 1.3 1 sp|Q90Z72|NFIL3_CHICK Nuclear factor interleukin-3-regulated
+ 3.2 11.8 2.4 5.6 11.0 1.7 1.3 1 sp|Q9VWW0|CREBB_DROME Cyclic AMP response element-binding pr
+ 3.2 11.8 2.0 4.9 11.2 1.4 1.3 1 sp|Q8BKJ9|SIRT7_MOUSE NAD-dependent deacetylase sirtuin-7 OS
+ 3.3 11.8 0.2 6.3 10.9 0.1 1.5 1 sp|Q56TT7|FOS_PHOCM Proto-oncogene c-Fos OS=Phodopus campb
+ 3.3 11.8 0.5 5.8 11.0 0.3 1.3 1 sp|Q6IMZ0|NFIL3_RAT Nuclear factor interleukin-3-regulated
+ 3.5 11.7 5.3 0.94 13.6 1.6 1.4 1 sp|P38749|YAP3_YEAST AP-1-like transcription factor YAP3 OS
+ 3.7 11.6 0.4 5.5 11.0 0.2 1.2 1 sp|Q08D88|NFIL3_BOVIN Nuclear factor interleukin-3-regulated
+ 3.8 11.6 0.4 5.9 11.0 0.3 1.2 1 sp|Q16649|NFIL3_HUMAN Nuclear factor interleukin-3-regulated
+ 3.8 11.6 3.0 6.6 10.8 2.1 1.3 1 sp|Q9C7S0|BZI60_ARATH bZIP transcription factor 60 OS=Arabid
+ 3.9 11.6 0.8 5.5 11.1 0.6 1.2 1 sp|P78962|ATF21_SCHPO Transcription factor atf21 OS=Schizosa
+ 4 11.5 0.1 6.9 10.7 0.1 1.5 1 sp|Q1LZH5|CREM_BOVIN cAMP-responsive element modulator OS=B
+ 4.2 11.4 0.0 7.3 10.7 0.0 1.3 1 sp|B1MX63|THIE_LEUCK Thiamine-phosphate pyrophosphorylase O
+ 4.6 11.3 2.8 6.7 10.8 2.0 1.2 1 sp|Q5AVK6|NOP16_EMENI Nucleolar protein 16 OS=Emericella nid
+ 4.6 11.3 1.0 5.5 11.1 0.7 1.1 1 sp|Q9ULX9|MAFF_HUMAN Transcription factor MafF OS=Homo sapi
+ 4.6 11.3 0.4 5.7 11.0 0.3 1.2 1 sp|P53567|CEBPG_HUMAN CCAAT/enhancer-binding protein gamma O
+ 4.8 11.2 0.7 21 9.2 0.3 2.1 1 sp|Q2V2M9|FHOD3_HUMAN FH1/FH2 domain-containing protein 3 OS
+ 4.9 11.2 0.1 7.1 10.7 0.1 1.3 1 sp|Q03060|CREM_HUMAN cAMP-responsive element modulator OS=H
+ 4.9 11.2 0.1 11 10.0 0.1 1.5 1 sp|O68007|BACB_BACLI Bacitracin synthase 2 OS=Bacillus lich
+ 5.1 11.2 0.5 7.6 10.6 0.4 1.2 1 sp|Q5VPE3|HOX2_ORYSJ Homeobox-leucine zipper protein HOX2 O
+ 5.1 11.2 0.5 7.6 10.6 0.4 1.2 1 sp|Q84U86|HOX2_ORYSI Homeobox-leucine zipper protein HOX2 O
+ 5.4 11.1 0.0 6.6 10.8 0.0 1.1 1 sp|Q65US7|THIE_MANSM Thiamine-phosphate pyrophosphorylase O
+ 5.4 11.1 0.2 8.6 10.4 0.2 1.2 1 sp|P07948|LYN_HUMAN Tyrosine-protein kinase Lyn OS=Homo sa
+ 5.4 11.1 9.6 1.1 13.4 4.3 1.6 1 sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Homo sapien
+ 5.5 11.1 0.9 6.6 10.8 0.6 1.2 1 sp|Q9XGJ4|GGM13_GNEGN MADS-box protein GGM13 OS=Gnetum gnemo
+ 5.8 11.0 0.6 9.2 10.3 0.4 1.3 1 sp|P27921|JUND_CHICK Transcription factor jun-D OS=Gallus g
+ 5.9 10.9 1.0 8.8 10.4 0.7 1.2 1 sp|Q5XHX8|THEG_RAT Testicular haploid expressed gene prot
+ 6 10.9 2.3 8.7 10.4 1.6 1.2 1 sp|P18847|ATF3_HUMAN Cyclic AMP-dependent transcription fac
+ 6.1 10.9 5.5 8.7 10.4 3.8 1.2 1 sp|P24068|OCS1_MAIZE Ocs element-binding factor 1 OS=Zea ma
+ 6.2 10.9 6.0 11 10.1 4.2 1.3 1 sp|P20393|NR1D1_HUMAN Nuclear receptor subfamily 1 group D m
+ 6.3 10.9 12.2 10 10.2 8.1 1.6 1 sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus GN=Fosb P
+ 6.4 10.8 2.1 13 9.8 1.5 1.4 1 sp|P42775|GBF2_ARATH G-box-binding factor 2 OS=Arabidopsis
+ 6.5 10.8 11.4 20 9.2 7.9 1.8 1 sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS=Schizosac
+ 6.9 10.7 2.2 11 10.0 1.5 1.3 1 sp|P24813|YAP2_YEAST AP-1-like transcription activator YAP2
+ 7 10.7 9.2 1.9 12.5 4.4 1.5 1 sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattus norv
+ 7.3 10.6 0.4 12 9.9 0.3 1.3 1 sp|Q02100|SKO1_YEAST CRE-binding bZIP protein SKO1 OS=Sacch
+ 7.7 10.6 0.0 11 10.0 0.0 1.2 1 sp|P50198|LINX_PSEPA 2,5-dichloro-2,5-cyclohexadiene-1,4-di
+ 7.7 10.6 5.8 10 10.2 4.0 1.1 1 sp|Q6DGM8|JDP2_DANRE Jun dimerization protein 2 OS=Danio re
+ 7.8 10.6 0.5 9.1 10.3 0.4 1.2 1 sp|A2Z0Q0|HOX25_ORYSI Homeobox-leucine zipper protein HOX25
+ 7.9 10.5 0.5 13 9.8 0.3 1.2 1 sp|Q9UPR3|SMG5_HUMAN Protein SMG5 OS=Homo sapiens GN=SMG5 P
+ 8.1 10.5 6.6 1.1 13.3 1.4 1.9 1 sp|Q41558|HBP1C_WHEAT Transcription factor HBP-1b(c1) (Fragm
+ 8.2 10.5 11.7 13 9.9 7.9 1.5 1 sp|O02756|CEBPD_BOVIN CCAAT/enhancer-binding protein delta O
+ 8.6 10.4 0.2 17 9.4 0.2 1.4 1 sp|Q63315|CAD22_RAT Cadherin-22 OS=Rattus norvegicus GN=Cd
+ 8.7 10.4 0.2 17 9.4 0.2 1.4 1 sp|Q9WTP5|CAD22_MOUSE Cadherin-22 OS=Mus musculus GN=Cdh22 P
+ 9.3 10.3 3.3 8.4 10.5 0.5 1.8 2 sp|Q5FUV3|ATE_GLUOX Putative arginyl-tRNA--protein transfe
+ 9.5 10.3 5.0 17 9.4 3.5 1.4 1 sp|Q99091|CPRF3_PETCR Light-inducible protein CPRF3 OS=Petro
+ 9.5 10.3 10.3 1.3 13.1 4.4 1.5 1 sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus musculu
+ 9.9 10.2 0.4 17 9.5 0.3 1.4 1 sp|Q9JLC6|TEF_MOUSE Thyrotroph embryonic factor OS=Mus mus
+ 10 10.2 0.5 15 9.6 0.4 1.2 1 sp|Q92172|TEF_CHICK Transcription factor VBP OS=Gallus gal
+
+
+Domain annotation for each sequence (and alignments):
+>> sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspergillus oryzae GN=hacA PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 762.0 2.4 8.7e-232 2.2e-228 1 345 [] 1 345 [] 1 345 [] 1.00
+
+ Alignments for each domain:
+ == domain 1 score: 762.0 bits; conditional E-value: 8.7e-232
+ sp|Q1XGE2|HAC1_ASPOR 1 lscdlektlssvdslpatpasevpvltvspadtslnsadvktqevkpeekkpakkrkswgqelpvpktnlpprkraktedekeqrrier 89
+ +scd+ekt+ssvdslpatpasevpvltvspadtslnsadvktqevkpeekkpakkrkswgqelpvpktnlpprkraktedekeqrrier
+ sp|Q1XGE2|HAC1_ASPOR 1 MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIER 89
+ 8**************************************************************************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 90 vlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatasptltptlfkqe 178
+ vlrnraaaqtsrerkrle+eklenekiq+eqqnqfllqrlsq+eaennrlsqqlaqlaaevrgsrantp+pgspatasptltptlfkqe
+ sp|Q1XGE2|HAC1_ASPOR 90 VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQE 178
+ ***************************************************************************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 179 rdelpleripfptpslsdysptlkpstlaessdvaqhpavsvaglegdgsalplfdlgsdlkhhstddvaaplsdddfnrlfhgdssve 267
+ rdelpleripfptpslsdysptlkpstlaessdvaqhpavsvaglegdgsalplfdlgsdlkhhstddvaaplsdddfnrlfhgdssve
+ sp|Q1XGE2|HAC1_ASPOR 179 RDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVE 267
+ ***************************************************************************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 268 pdssvfedglafdvleggdlsafpfdslvnfdsepvtlegielahglpdettcktssvqpgfgasttrcdgqgiaagc 345
+ pdssvfedglafdvleggdlsafpfds+vnfdsepvtlegie+ahglpdettcktssvqpgfgasttrcdgqgiaagc
+ sp|Q1XGE2|HAC1_ASPOR 268 PDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC 345
+ ****************************************************************************** PP
+
+>> sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS=Emericella nidulans GN=hacA PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 568.6 1.6 5.8e-173 1.5e-169 11 344 .. 16 348 .. 9 349 .. 0.98
+
+ Alignments for each domain:
+ == domain 1 score: 568.6 bits; conditional E-value: 5.8e-173
+ sp|Q1XGE2|HAC1_ASPOR 11 svdslpatpasevpvltvspadtslnsadvktqevkpeekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqt 99
+ +slp tp+ evpvltvspadtsl++ +v q kpeekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqt
+ sp|Q8TFU8|HAC1_EMENI 16 FANSLPTTPSLEVPVLTVSPADTSLQTKNVVAQ-TKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQT 103
+ 4689*************************9876.7****************************************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 100 srerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatasptltptlfkqerdelplerip 188
+ srerkrle+ekle+eki++eqqnqfllqrl+q+eaennrlsqq+aql+aevrgsr +tp spa+ sptltptlfkqe de+pl+rip
+ sp|Q8TFU8|HAC1_EMENI 104 SRERKRLEMEKLESEKIDMEQQNQFLLQRLAQMEAENNRLSQQVAQLSAEVRGSRHSTPTSSSPASVSPTLTPTLFKQEGDEVPLDRIP 192
+ ***************************************************************************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 189 fptpslsdysptlkpstlaessdvaqhpavsvaglegdgsalplfdlgsdlkhhstddvaaplsdddfnrlfhgdssvepdssvfedgl 277
+ fptps++dysptlkps+laes d+ qhpavsv+glegd sal lfdlg+ +kh t d+ aplsdddf+rlf+gdss+e dss+ edg+
+ sp|Q8TFU8|HAC1_EMENI 193 FPTPSVTDYSPTLKPSSLAESPDLTQHPAVSVGGLEGDESALTLFDLGASIKHEPTHDLTAPLSDDDFRRLFNGDSSLESDSSLLEDGF 281
+ ***************************************************************************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 278 afdvleggdlsafpfdslvnfdsepvtlegielahglpdettcktssvqpgfgasttrcdgqgiaag 344
+ afdvl+ gdlsafpfds+v+fd+epvtle +e+ +gl d +ck +s+qp gast+rcdgqgiaag
+ sp|Q8TFU8|HAC1_EMENI 282 AFDVLDSGDLSAFPFDSMVDFDTEPVTLEDLEQTNGLSDSASCKAASLQPSHGASTSRCDGQGIAAG 348
+ ******************************************************************9 PP
+
+>> sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS=Trichoderma reesei GN=hac1 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 98.4 6.4 5.8e-30 1.5e-26 47 119 .. 82 154 .. 45 184 .. 0.86
+ 2 ? -0.5 0.0 7.1 1.8e+04 209 234 .. 287 308 .. 278 351 .. 0.70
+ 3 ? 3.2 0.0 0.52 1.3e+03 315 344 .. 421 450 .. 356 451 .] 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 98.4 bits; conditional E-value: 5.8e-30
+ sp|Q1XGE2|HAC1_ASPOR 47 peekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqle 119
+ ekkp kkrkswgq lp pktnlpprkraktedekeqrr+ervlrnr aaq+srerkrle+e le + +le
+ sp|Q8TFF3|HAC1_TRIRE 82 TSEKKPVKKRKSWGQVLPEPKTNLPPRKRAKTEDEKEQRRVERVLRNRRAAQSSRERKRLEVEALEKRNKELE 154
+ 469*************************************************************997765554 PP
+
+ == domain 2 score: -0.5 bits; conditional E-value: 7.1
+ sp|Q1XGE2|HAC1_ASPOR 209 ssdvaqhpavsvaglegdgsalplfd 234
+ s+d q+pavs++g d +a+p+f
+ sp|Q8TFF3|HAC1_TRIRE 287 STDSTQRPAVSIGG---D-AAVPVFS 308
+ 67778888888754...3.5667763 PP
+
+ == domain 3 score: 3.2 bits; conditional E-value: 0.52
+ sp|Q1XGE2|HAC1_ASPOR 315 pdettcktssvqpgfgasttrcdgqgiaag 344
+ ++ + s qp gas+ cd gia g
+ sp|Q8TFF3|HAC1_TRIRE 421 ENQIPSRHSIQQPQSGASSHGCDDGGIAVG 450
+ 455566778889****************98 PP
+
+>> sp|P41546|HAC1_YEAST Transcriptional activator HAC1 OS=Saccharomyces cerevisiae GN=HAC1 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 52.6 3.9 5e-16 1.3e-12 67 119 .. 23 75 .. 12 145 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 52.6 bits; conditional E-value: 5e-16
+ sp|Q1XGE2|HAC1_ASPOR 67 ktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqle 119
+ k+ lpprkrakt++ekeqrrier+lrnr aa+ sre+krl+l+ le++ le
+ sp|P41546|HAC1_YEAST 23 KSTLPPRKRAKTKEEKEQRRIERILRNRRAAHQSREKKRLHLQYLERKCSLLE 75
+ 789******************************************98765555 PP
+
+>> sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabidopsis thaliana GN=HY5 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 46.9 1.8 2.7e-14 6.9e-11 59 153 .. 64 158 .. 49 167 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 46.9 bits; conditional E-value: 2.7e-14
+ sp|Q1XGE2|HAC1_ASPOR 59 wgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqla 147
+ gqe + rkr++t eke +r++r+lrnr +aq +rerk+ l len+ +le +n l +rls l+ en+ l + l
+ sp|O24646|HY5_ARATH 64 TGQERTQATVGESQRKRGRTPAEKENKRLKRLLRNRVSAQQARERKKAYLSELENRVKDLENKNSELEERLSTLQNENQMLRHILKNTT 152
+ 57777777777789******************************************************************999998888 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 148 aevrgs 153
+ + rg+
+ sp|O24646|HY5_ARATH 153 GNKRGG 158
+ 888876 PP
+
+>> sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos taurus GN=XBP1 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 33.9 0.5 2.4e-10 6e-07 68 145 .. 52 139 .. 10 208 .. 0.72
+
+ Alignments for each domain:
+ == domain 1 score: 33.9 bits; conditional E-value: 2.4e-10
+ sp|Q1XGE2|HAC1_ASPOR 68 tnlpp..rkrak.tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfll.......qrlsqleaennrlsqqlaq 145
+ +++pp rkr + t+ e++ ++r l+nr aaqt+r+rk+ ++ le++ ++le++nq ll ++ l en+ l q+l++
+ sp|Q3SZZ2|XBP1_BOVIN 52 SGVPPqaRKRQRlTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENQKLLlenqllrEKTHGLVVENQELRQRLGM 139
+ 56677334554436778999***********************************999876622211112233455667777776654 PP
+
+>> sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanum lycopersicum GN=HY5 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 33.3 3.9 3.7e-10 9.5e-07 72 148 .. 75 151 .. 62 158 .] 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 33.3 bits; conditional E-value: 3.7e-10
+ sp|Q1XGE2|HAC1_ASPOR 72 prkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa 148
+ rkr+++ +ke +r++r+lrnr +aq +rerk+ l le + +le +n l +rls l+ en+ l + l a
+ sp|Q9SM50|HY5_SOLLC 75 QRKRGRSPADKENKRLKRLLRNRVSAQQARERKKAYLIDLEARVKELETKNAELEERLSTLQNENQMLRHILKNTTA 151
+ 69*****************************************99********************999887766555 PP
+
+>> sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Homo sapiens GN=XBP1 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 32.0 2.0 9.4e-10 2.4e-06 72 186 .. 58 185 .. 14 194 .. 0.72
+
+ Alignments for each domain:
+ == domain 1 score: 32.0 bits; conditional E-value: 9.4e-10
+ sp|Q1XGE2|HAC1_ASPOR 72 prkrak.tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfll.......qrlsqleaennrlsqqlaq..la... 147
+ rkr + t+ e++ ++r l+nr aaqt+r+rk+ ++ le++ ++le++nq ll ++ l en+ l q+l++ l
+ sp|P17861|XBP1_HUMAN 58 ARKRQRlTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENQKLLlenqllrEKTHGLVVENQELRQRLGMdaLVaee 146
+ 366655367788999**********************************9998765332111133445667898899888652232122 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 148 .aevrgsrantplpgspatasptltptlfkqerdelpler 186
+ ae +g+ p+ gs +a+ l l + + + pl+
+ sp|P17861|XBP1_HUMAN 147 eAEAKGNEV-RPVAGSAESAALRLRAPLQQVQAQLSPLQN 185
+ 234444433.477788777777777666655555556665 PP
+
+>> sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=Arabidopsis thaliana GN=HYH PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 29.6 3.4 4.9e-09 1.2e-05 72 144 .. 67 139 .. 56 146 .. 0.93
+
+ Alignments for each domain:
+ == domain 1 score: 29.6 bits; conditional E-value: 4.9e-09
+ sp|Q1XGE2|HAC1_ASPOR 72 prkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqla 144
+ r+r++ +ke r ++r+lrnr +aq +rerk++ + le++ +l+ n+ l +++s l en l ++l
+ sp|Q8W191|HYH_ARATH 67 KRRRGRNPVDKEYRSLKRLLRNRVSAQQARERKKVYVSDLESRANELQNNNDQLEEKISTLTNENTMLRKMLI 139
+ 69999*************************************************************9998876 PP
+
+>> sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive element-binding protein 3-like protein 2 OS=Danio rerio GN=creb3l2 PE=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 28.0 0.0 1.5e-08 3.8e-05 14 155 .. 221 363 .. 208 384 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 28.0 bits; conditional E-value: 1.5e-08
+ sp|Q1XGE2|HAC1_ASPOR 14 slpatpasevpvltvsp.adtslnsadvktqevkpeekkpa.....kkrkswgqelpvpktnlpprkraktedekeqrriervlrnra 95
+ + pa+p + vl v+p a +sl+s+ + t k + p kr + pvp t lp k +ek ++i+r ++n+
+ sp|A1L224|CR3L2_DANRE 221 CAPASPTQTPAVLKVAPrAPSSLSSSPLLTAPHKLQGSGPLllteeEKRTLIAEGYPVP-TKLPLSK----AEEKALKKIRRKIKNKI 303
+ 56999999889999999567899999999988888888875222225777778888888.6777544....468999*********** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 96 aaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsra 155
+ +aq sr++k+ ++ le + + +n+ l +++ le+ n l qql l a v g
+ sp|A1L224|CR3L2_DANRE 304 SAQESRRKKKEYVDALEKKVETCSNENHELRRKVENLECTNKSLLQQLHSLQAVVAGKVP 363
+ **********99*****98888999****************************9999644 PP
+
+>> sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-binding protein 3-like protein 4 OS=Mus musculus GN=Creb3l4 PE=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 26.6 1.7 4.1e-08 0.0001 76 147 .. 186 257 .. 114 274 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 26.6 bits; conditional E-value: 4.1e-08
+ sp|Q1XGE2|HAC1_ASPOR 76 aktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqla 147
+ +e+ ++i+r +rn+ +aq sr+rk+ l+ le++ + +qnq l +++++le +n l +q+ ql
+ sp|Q9D2A5|CR3L4_MOUSE 186 LTKAEERILKKIRRKIRNKQSAQDSRRRKKEYLDGLESRVAACSEQNQKLQRKVQELERQNIFLMEQVRQLQ 257
+ 44456788999*****************************************************99998875 PP
+
+>> sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Rattus norvegicus GN=Xbp1 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 26.6 2.2 4.2e-08 0.00011 73 127 .. 52 106 .. 37 148 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 26.6 bits; conditional E-value: 4.2e-08
+ sp|Q1XGE2|HAC1_ASPOR 73 rkrak.tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllq 127
+ rkr + t+ e++ ++r l+nr aaqt+r+rk+ ++ le++ ++le++nq l q
+ sp|Q9R1S4|XBP1_RAT 52 RKRQRlTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENQKL-Q 106
+ 55554267788999***********************************99965.3 PP
+
+>> sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper transcription factor F OS=Dictyostelium discoideum GN=bzpF PE=3 S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 25.2 0.3 1.1e-07 0.00027 46 175 .. 363 498 .. 347 593 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 25.2 bits; conditional E-value: 1.1e-07
+ sp|Q1XGE2|HAC1_ASPOR 46 kpeekkpakkrkswgqelpvpk....tnlpp.rkr.aktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqr 128
+ k ee k kkrk pv t l p ++e++q+r +r+++nr aaq r+r++ ++ le + +l n + r
+ sp|Q54WN7|BZPF_DICDI 363 KKEEDKSIKKRKFI-SSTPVKGenggTTLIPtTDGgFNMDEERHQKRQRRLVKNREAAQLFRQRQKAYIQDLEKKVSDLTGTNSEFRAR 450
+ 56677777777754.44566431122444440443135677899******************************999******9999** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 129 lsqleaennrlsqqlaqlaaevrgs.rantplpgspatasptltptlf 175
+ + l +en + +ql l v + + p gs +t sp+ f
+ sp|Q54WN7|BZPF_DICDI 451 VELLNSENKLIREQLLYLRNFVTQAvSFSFPKGGSNGTNSPSGVADQF 498
+ *****************9988765415678999999999998665555 PP
+
+>> sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive element-binding protein 3-like protein 2 OS=Xenopus laevis GN=creb3l2 PE
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 24.7 0.2 1.6e-07 0.0004 60 157 .. 281 373 .. 241 392 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 24.7 bits; conditional E-value: 1.6e-07
+ sp|Q1XGE2|HAC1_ASPOR 60 gqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqla 147
+ + p+p t lp k +ek ++i+r ++n+ +aq sr++k+ ++ le + +n l +++ le+ n+ l qql +l
+ sp|A2VD01|CR3L2_XENLA 281 AEGYPIP-TKLPLTK----AEEKALKKIRRKIKNKISAQESRRKKKEYMDSLEKRVENSSSENSELRKKVEVLESTNRTLLQQLQRLQ 363
+ 5556666.5666543....368999****************************99889999*************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 148 aevrgsrant 157
+ a v g ++
+ sp|A2VD01|CR3L2_XENLA 364 AMVTGKVTRS 373
+ ***9976554 PP
+
+>> sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF2 OS=Petroselinum crispum GN=CPRF2 PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 25.4 3.1 9.1e-08 0.00023 77 162 .. 192 277 .. 187 312 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 25.4 bits; conditional E-value: 9.1e-08
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgs 162
+ + d + +r++r+l nr +a+ sr+rk+ ++ le + ql+ +n ll+rl+++ + n + + l a++ ra +
+ sp|Q99090|CPRF2_PETCR 192 RNGDPSDAKRVRRMLSNRESARRSRRRKQAHMTELETQVSQLRVENSSLLKRLTDISQRYNDAAVDNRVLKADIETMRAKVKMAEE 277
+ 56788999*************************************************99999999999999999999999888655 PP
+
+>> sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-binding protein 3-like protein 3 OS=Rattus norvegicus GN=Creb3l3 P
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 24.2 0.2 2.2e-07 0.00056 77 154 .. 233 310 .. 219 328 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 24.2 bits; conditional E-value: 2.2e-07
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsr 154
+ +e+ ++i+r +rn+ +aq sr++k+ ++ len+ + qnq l +++ +le +n l +ql +l a v s
+ sp|Q5FVM5|CR3L3_RAT 233 TKYEERVLKKIRRKIRNKQSAQESRKKKKEYIDGLENRMSACTAQNQELQRKVLHLEKQNLSLLEQLKHLQALVVQST 310
+ 4456788899***********************************************************999876554 PP
+
+>> sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mus musculus GN=Xbp1 PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 24.5 2.2 1.7e-07 0.00044 73 127 .. 52 106 .. 36 135 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 24.5 bits; conditional E-value: 1.7e-07
+ sp|Q1XGE2|HAC1_ASPOR 73 rkrak.tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllq 127
+ rkr + t+ e++ ++r l+nr aaqt+r+rk+ ++ le++ ++le++n+ l q
+ sp|O35426|XBP1_MOUSE 52 RKRQRlTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENHKL-Q 106
+ 55554267788999*********************************9998754.3 PP
+
+>> sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-binding protein 3 OS=Mus musculus GN=Creb3 PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 24.5 0.0 1.7e-07 0.00043 80 151 .. 182 253 .. 163 315 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 24.5 bits; conditional E-value: 1.7e-07
+ sp|Q1XGE2|HAC1_ASPOR 80 dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevr 151
+ +e+ +r++r +rn+ aaq sr++k++ + le++ ++ qn+ l ++++le +n l +ql +l a v
+ sp|Q61817|CREB3_MOUSE 182 EEQVLKRVRRKIRNKRAAQESRKKKKVYVVGLESRVLKYTAQNRELQNKVQRLEEQNLSLLDQLRKLQAMVI 253
+ 4566799***********************************************************999774 PP
+
+>> sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-binding protein 3-like protein 3 OS=Mus musculus GN=Creb3l3 PE=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 24.1 0.2 2.3e-07 0.00058 77 154 .. 233 310 .. 219 329 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 24.1 bits; conditional E-value: 2.3e-07
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsr 154
+ +e+ ++i+r +rn+ +aq sr++k+ ++ len+ + qnq l +++ +le +n l +ql +l a v s
+ sp|Q91XE9|CR3L3_MOUSE 233 TKYEERVLKKIRRKIRNKQSAQESRKKKKEYIDGLENRMSACTAQNQELQRKVLHLEKQNLSLLEQLKHLQALVVQST 310
+ 4456788899***********************************************************999876554 PP
+
+>> sp|O57342|MAFA_COTJA Transcription factor MafA OS=Coturnix coturnix japonica GN=MAFA PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? -0.8 0.1 8.7 2.2e+04 156 180 .. 69 93 .. 22 97 .. 0.76
+ 2 ! 24.1 1.4 2.3e-07 0.0006 85 167 .. 201 281 .. 174 285 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: -0.8 bits; conditional E-value: 8.7
+ sp|Q1XGE2|HAC1_ASPOR 156 ntplpgspatasptltptlfkqerd 180
+ p pg+ +a+pt p k + +
+ sp|O57342|MAFA_COTJA 69 CAPSPGGQPSAGPTAAPLGSKPQLE 93
+ 4688888888999988876666655 PP
+
+ == domain 2 score: 24.1 bits; conditional E-value: 2.3e-07
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatas 167
+ ++ +r l+nr+ aq++r ++ + + lenek+ql+ q + l q +s+l e++ ++ +laa rg t p +p t +
+ sp|O57342|MAFA_COTJA 201 KQKRRTLKNRGYAQSCRYKRVQQRHILENEKCQLQSQVEQLKQEVSRLAKERDLYKEKYEKLAA--RGFPRETSPPAAPKTTA 281
+ 445699***********988888999************************************98..89888898899998865 PP
+
+>> sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-binding protein 3-like protein 4 OS=Rattus norvegicus GN=Creb3l4 P
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 23.1 2.2 4.8e-07 0.0012 78 148 .. 184 254 .. 165 270 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 23.1 bits; conditional E-value: 4.8e-07
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa 148
+ +e+ ++i+r +rn+ +aq sr+rk+ ++ le++ + +qnq l +++++le +n l q+ ql
+ sp|Q5UEM7|CR3L4_RAT 184 KAEERILKKIRRKIRNKQSAQDSRRRKKEYIDGLESRVAACSEQNQKLQRKVQELERQNISLVAQVHQLQK 254
+ 346788899**************************************************999988888753 PP
+
+>> sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive element-binding protein 3-like protein 4 OS=Xenopus tropicalis GN=creb3l
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 23.5 0.3 3.5e-07 0.00089 24 151 .. 160 284 .. 150 296 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 23.5 bits; conditional E-value: 3.5e-07
+ sp|Q1XGE2|HAC1_ASPOR 24 pvltvspadtslnsadvk.tqevkpeekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrlelek 110
+ pv+ +p l ad+ + + pe ++ qe nlp k +e+ ++++r +rn+ +aq sr+rk+ ++
+ sp|Q08CW8|CR3L4_XENTR 160 PVCKSTPLPIRLTPADLIaVDALYPELHLTEEEKRLLSQEGVALPNNLPLTK----AEERILKKVRRKIRNKQSAQDSRRRKKEYIDG 243
+ 4444555555566666430344556666555566666677655557888655....3578889999********************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 111 lenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevr 151
+ le++ + qnq l +++ +le +n l ql +l ++
+ sp|Q08CW8|CR3L4_XENTR 244 LESRVAACSSQNQELHKKVVELEKHNISLITQLRKLQTLIK 284
+ ********************************999877665 PP
+
+>> sp|Q90370|MAFB_COTJA Transcription factor MafB OS=Coturnix coturnix japonica GN=MAFB PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 1.5 0.0 1.8 4.5e+03 115 178 .. 15 81 .. 8 103 .. 0.70
+ 2 ! 21.5 1.0 1.4e-06 0.0035 53 149 .. 195 292 .. 168 309 .. 0.71
+
+ Alignments for each domain:
+ == domain 1 score: 1.5 bits; conditional E-value: 1.8
+ sp|Q1XGE2|HAC1_ASPOR 115 kiqleqqnqfllqrlsqle...aennrlsqqlaqlaaevrgsrantpl..pgspatasptltptlfkqe 178
+ + +e n+f l++++ + ++n+r ++++ +l gs ++tp+ p s +sp+++pt k +
+ sp|Q90370|MAFB_COTJA 15 PLAMEYVNDFDLMKFDVKKeplGRNDRSGRHCTRLQ--PAGSVSSTPIstPCSSVPSSPSFSPTEQKTH 81
+ 567888888888877643312257788888877764..4677777775446777778999999976655 PP
+
+ == domain 2 score: 21.5 bits; conditional E-value: 1.4e-06
+ sp|Q1XGE2|HAC1_ASPOR 53 akkrkswgqelpvpktnlpprkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrls 140
+ r s q + + l + r+ t+de + ++ +r l+nr+ aq++r ++ + + lenek ql qq + l q +++l e++
+ sp|Q90370|MAFB_COTJA 195 VEDRFSDDQLVSMSVRELNRHLRGFTKDEVIRlKQKRRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVTRLARERDAYK 283
+ 555666666666666667777888999987552556799***********988888999*********************999998877 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 141 qqlaqlaae 149
+ ++ +la+
+ sp|Q90370|MAFB_COTJA 284 LKCEKLASN 292
+ 777777654 PP
+
+>> sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-binding protein 3-like protein 3 OS=Homo sapiens GN=CREB3L3 PE=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 22.7 0.0 6.1e-07 0.0015 77 161 .. 237 321 .. 222 385 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 22.7 bits; conditional E-value: 6.1e-07
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpg 161
+ +e+ ++i+r +rn+ +aq sr++k+ ++ le + + qnq l +++ +le +n l +ql +l a v s + + + g
+ sp|Q68CJ9|CR3L3_HUMAN 237 TKYEERVLKKIRRKIRNKQSAQESRKKKKEYIDGLETRMSACTAQNQELQRKVLHLEKQNLSLLEQLKKLQAIVVQSTSKSAQTG 321
+ 345678889*************************************************************998877776666655 PP
+
+>> sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive element-binding protein 3-like protein 3-B OS=Danio rerio GN=creb3l3b PE
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 22.4 0.3 7.4e-07 0.0019 78 160 .. 205 286 .. 190 305 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 22.4 bits; conditional E-value: 7.4e-07
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplp 160
+ +e+ ++i+r +rn+ +aq sr++k+ ++ le++ + +n+ l +++ qle n l +ql +l a v + +n p+
+ sp|Q1LYG4|CR3LB_DANRE 205 KYEERILKKIRRKIRNKQSAQESRKKKKEYIDGLESRMAACSAHNHELQRKVFQLEKCNISLMEQLRRLQALVMNG-SNKPVQ 286
+ 346788899************************************************************9988643.466655 PP
+
+>> sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive element-binding protein 3-like protein 3-A OS=Danio rerio GN=creb3l3a PE
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 22.3 0.4 8.1e-07 0.0021 78 160 .. 205 286 .. 187 305 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 22.3 bits; conditional E-value: 8.1e-07
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplp 160
+ +e+ ++i+r +rn+ +aq sr++k+ ++ le++ + +n+ l +++ qle n l +ql +l a v + +n p+
+ sp|Q502F0|CR3LA_DANRE 205 KYEERILKKIRRKIRNKQSAQESRKKKKEYIDGLESRMAACSAHNHELQRKVFQLEKCNISLMEQLRRLQALVMNG-SNKPVQ 286
+ 446788899************************************************************9988643.466655 PP
+
+>> sp|Q90888|MAFB_CHICK Transcription factor MafB OS=Gallus gallus GN=MAFB PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 1.5 0.0 1.8 4.5e+03 115 178 .. 15 81 .. 8 103 .. 0.70
+ 2 ! 21.3 1.3 1.7e-06 0.0043 52 149 .. 194 292 .. 167 309 .. 0.71
+
+ Alignments for each domain:
+ == domain 1 score: 1.5 bits; conditional E-value: 1.8
+ sp|Q1XGE2|HAC1_ASPOR 115 kiqleqqnqfllqrlsqle...aennrlsqqlaqlaaevrgsrantpl..pgspatasptltptlfkqe 178
+ + +e n+f l++++ + ++n+r ++++ +l gs ++tp+ p s +sp+++pt k +
+ sp|Q90888|MAFB_CHICK 15 PLAMEYVNDFDLMKFDVKKeplGRNDRSGRHCTRLQ--PAGSVSSTPIstPCSSVPSSPSFSPTEQKTH 81
+ 567888888888877643312257788888877764..4677777775446777778999999976655 PP
+
+ == domain 2 score: 21.3 bits; conditional E-value: 1.7e-06
+ sp|Q1XGE2|HAC1_ASPOR 52 pakkrkswgqelpvpktnlpprkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrl 139
+ r s q + + l + r+ t+de + ++ +r l+nr+ aq++r ++ + + lenek ql qq + l q +++l e++
+ sp|Q90888|MAFB_CHICK 194 SVEDRFSDDQLVSMSVRELNRHLRGFTKDEVIRlKQKRRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVTRLARERDAY 282
+ 4555666666666666677777889999997552556799***********988888999*********************99999887 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 140 sqqlaqlaae 149
+ ++ +la+
+ sp|Q90888|MAFB_CHICK 283 KLKCEKLASN 292
+ 7777777654 PP
+
+>> sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-binding protein 3-like protein 3 OS=Bos taurus GN=CREB3L3 PE=2 S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 23.0 0.1 5e-07 0.0013 77 161 .. 232 316 .. 217 371 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 23.0 bits; conditional E-value: 5e-07
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpg 161
+ +e+ ++i+r +rn+ +aq sr++k+ ++ le + + qnq l +++ +le +n l +ql +l a v s + + + g
+ sp|Q3SYZ3|CR3L3_BOVIN 232 TKYEERMLKKIRRKIRNKQSAQESRKKKKEYIDGLETRMSACTAQNQELQRKVLHLEKQNLSLLEQLKKLQAIVVQSTSKSAQTG 316
+ 4456788899************************************************************998877766655555 PP
+
+>> sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive element-binding protein 3-like protein 2 OS=Pongo abelii GN=CREB3L2 PE=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 22.2 0.1 9.1e-07 0.0023 54 159 .. 270 370 .. 226 388 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 22.2 bits; conditional E-value: 9.1e-07
+ sp|Q1XGE2|HAC1_ASPOR 54 kkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsq 141
+ kr + p+p t lp k +ek ++i+r ++n+ +aq sr++k+ ++ le + + +n l +++ le n+ l q
+ sp|Q5RCM9|CR3L2_PONAB 270 EKRTLIAEGYPIP-TKLPLTK----SEEKALKKIRRKIKNKISAQESRRKKKEYMDSLEKKVESCSTENLELRKKVEVLENTNRTLLQ 352
+ 5555666667776.5676544....468999****************************988889999******************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 142 qlaqlaaevrgsrantpl 159
+ ql +l v g ++t
+ sp|Q5RCM9|CR3L2_PONAB 353 QLQKLQTLVMGKVSRTCK 370
+ *******99998777754 PP
+
+>> sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS=Homo sapiens GN=MAFB PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 22.3 0.2 8.3e-07 0.0021 72 148 .. 226 303 .. 170 321 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 22.3 bits; conditional E-value: 8.3e-07
+ sp|Q1XGE2|HAC1_ASPOR 72 prkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa 148
+ + r+ t+de + ++ +r l+nr+ aq++r ++ + + lenek ql qq + l q +s+l e++ ++ +la
+ sp|Q9Y5Q3|MAFB_HUMAN 226 RHLRGFTKDEVIRlKQKRRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAYKVKCEKLAN 303
+ 55677788886541556799***********988888999**********************9999887666655553 PP
+
+>> sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive element-binding protein 3-like protein 2 OS=Homo sapiens GN=CREB3L2 PE=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 22.0 0.1 1e-06 0.0027 54 159 .. 270 370 .. 226 388 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 22.0 bits; conditional E-value: 1e-06
+ sp|Q1XGE2|HAC1_ASPOR 54 kkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsq 141
+ kr + p+p t lp k +ek ++i+r ++n+ +aq sr++k+ ++ le + + +n l +++ le n+ l q
+ sp|Q70SY1|CR3L2_HUMAN 270 EKRTLIAEGYPIP-TKLPLSK----SEEKALKKIRRKIKNKISAQESRRKKKEYMDSLEKKVESCSTENLELRKKVEVLENTNRTLLQ 352
+ 5566666667777.6676543....468999****************************988889999******************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 142 qlaqlaaevrgsrantpl 159
+ ql +l v g ++t
+ sp|Q70SY1|CR3L2_HUMAN 353 QLQKLQTLVMGKVSRTCK 370
+ *******99998777754 PP
+
+>> sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS=Xenopus laevis GN=mafb PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 3.2 0.0 0.52 1.3e+03 115 182 .. 15 86 .. 8 100 .. 0.76
+ 2 ! 17.9 0.8 1.7e-05 0.044 70 143 .. 211 285 .. 168 310 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 3.2 bits; conditional E-value: 0.52
+ sp|Q1XGE2|HAC1_ASPOR 115 kiqleqqnqfllqrls.qleaennrlsqqlaql.aaevrgsrantpl..pgspatasptltptlfkqerdel 182
+ + +e n+f l++++ + e ++r ++ + q+ + gs ++tp+ p s +sp+++pt k + d+l
+ sp|Q6DE84|MAFB_XENLA 15 PLAMEYLNDFDLMKFDvKKEPLGGRPDRAIRQCnRLQPTGSVSSTPIstPCSSVPSSPSFSPTEHKTHLDDL 86
+ 567888888888877624556667777777776234778999999975578888999******999998887 PP
+
+ == domain 2 score: 17.9 bits; conditional E-value: 1.7e-05
+ sp|Q1XGE2|HAC1_ASPOR 70 lpprkraktedek.eqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqql 143
+ l + r+ t+d+ + ++ +r l+nr+ aq++r ++ + + le+ek ql qq + l q +s+l e++ ++
+ sp|Q6DE84|MAFB_XENLA 211 LNRHLRGFTKDDViRLKQKRRTLKNRGYAQSCRYKRVQQKHNLEGEKTQLVQQVEQLKQEVSRLARERDAYKIKC 285
+ 5555677777765144566799***********99888999**********************999987665554 PP
+
+>> sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive element-binding protein 3-like protein 1 OS=Mus musculus GN=Creb3l1 PE=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 21.7 0.0 1.3e-06 0.0032 59 160 .. 271 366 .. 215 434 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 21.7 bits; conditional E-value: 1.3e-06
+ sp|Q1XGE2|HAC1_ASPOR 59 wgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaql 146
+ + p+p t lp k +ek +r++r ++n+ +aq sr++k+ +e le + +n l +++ le n+ l qql +l
+ sp|Q9Z125|CR3L1_MOUSE 271 IAEGYPIP-TKLPLTK----AEEKALKRVRRKIKNKISAQESRRKKKEYVECLEKKVETYTSENNELWKKVETLETANRTLLQQLQKL 353
+ 55556666.5666543....368999*********************99****9877778899999*******************999 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 147 aaevrgsrantplp 160
+ v s+ + p
+ sp|Q9Z125|CR3L1_MOUSE 354 QTLVT-SKISRPYK 366
+ 88775.55555554 PP
+
+>> sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive element-binding protein 3-like protein 2 OS=Mus musculus GN=Creb3l2 PE=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 21.9 0.0 1.1e-06 0.0028 55 159 .. 271 370 .. 230 391 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 21.9 bits; conditional E-value: 1.1e-06
+ sp|Q1XGE2|HAC1_ASPOR 55 krkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqq 142
+ kr + p+p t lp k +ek ++i+r ++n+ +aq sr++k+ ++ le + + +n l +++ le n+ l qq
+ sp|Q8BH52|CR3L2_MOUSE 271 KRTLVAEGYPIP-TKLPLTK----SEEKALKKIRRKIKNKISAQESRRKKKEYMDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQ 353
+ 555555566666.5666543....468999****************************988889999********************* PP
+
+ sp|Q1XGE2|HAC1_ASPOR 143 laqlaaevrgsrantpl 159
+ l +l v g ++t
+ sp|Q8BH52|CR3L2_MOUSE 354 LQKLQTLVMGKVSRTCK 370
+ ******99998777754 PP
+
+>> sp|P54842|MAFB_RAT Transcription factor MafB OS=Rattus norvegicus GN=Mafb PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 22.2 0.2 9.1e-07 0.0023 72 148 .. 226 303 .. 172 321 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 22.2 bits; conditional E-value: 9.1e-07
+ sp|Q1XGE2|HAC1_ASPOR 72 prkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa 148
+ + r+ t+de + ++ +r l+nr+ aq++r ++ + + lenek ql qq + l q +s+l e++ ++ +la
+ sp|P54842|MAFB_RAT 226 RHLRGFTKDEVIRlKQKRRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAYKVKCEKLAN 303
+ 55677788886541556799***********988888999**********************9999887666655553 PP
+
+>> sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element-binding protein 3-like protein 2 OS=Rattus norvegicus GN=Creb3l2 P
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 21.7 0.0 1.3e-06 0.0032 59 159 .. 275 370 .. 234 387 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 21.7 bits; conditional E-value: 1.3e-06
+ sp|Q1XGE2|HAC1_ASPOR 59 wgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqla 147
+ + p+p t lp k +ek ++i+r ++n+ +aq sr++k+ ++ le + + +n l +++ le n+ l qql +l
+ sp|Q6QDP7|CR3L2_RAT 275 IAEGYPIP-TKLPLTK----SEEKALKKIRRKIKNKISAQESRRKKKEYMDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQLQKLQ 358
+ 55556666.5666543....468999****************************988889999************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 148 aevrgsrantpl 159
+ v g ++t
+ sp|Q6QDP7|CR3L2_RAT 359 TLVMGKVSRTCK 370
+ *99998777754 PP
+
+>> sp|Q16520|BATF_HUMAN Basic leucine zipper transcriptional factor ATF-like OS=Homo sapiens GN=BATF PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 22.1 0.2 9.3e-07 0.0024 71 135 .. 17 78 .. 12 108 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 22.1 bits; conditional E-value: 9.3e-07
+ sp|Q1XGE2|HAC1_ASPOR 71 pprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleae 135
+ pp k+ + + rr++r +nr aaq sr+r+ + + l+ e +le+qn l + + ql e
+ sp|Q16520|BATF_HUMAN 17 PPGKQ---DSSDDVRRVQRREKNRIAAQKSRQRQTQKADTLHLESEDLEKQNAALRKEIKQLTEE 78
+ 44444...44445799***************************************9999998766 PP
+
+>> sp|P54841|MAFB_MOUSE Transcription factor MafB OS=Mus musculus GN=Mafb PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 22.1 0.2 9.1e-07 0.0023 72 148 .. 226 303 .. 172 321 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 22.1 bits; conditional E-value: 9.1e-07
+ sp|Q1XGE2|HAC1_ASPOR 72 prkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa 148
+ + r+ t+de + ++ +r l+nr+ aq++r ++ + + lenek ql qq + l q +s+l e++ ++ +la
+ sp|P54841|MAFB_MOUSE 226 RHLRGFTKDEVIRlKQKRRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAYKVKCEKLAN 303
+ 45677788886541556799***********988888999**********************9999887666655553 PP
+
+>> sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS=Macaca fascicularis GN=MAFB PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 21.9 0.2 1.1e-06 0.0027 72 147 .. 226 302 .. 170 321 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 21.9 bits; conditional E-value: 1.1e-06
+ sp|Q1XGE2|HAC1_ASPOR 72 prkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqla 147
+ + r+ t+de + ++ +r l+nr+ aq++r ++ + + lenek ql qq + l q +s+l e++ ++ +la
+ sp|Q2PFS4|MAFB_MACFA 226 RHLRGFTKDEVIRlKQKRRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAHKVKCEKLA 302
+ 55677788886541556799***********988888999********************99988876554444444 PP
+
+>> sp|O42290|MAFA_CHICK Transcription factor MafA OS=Gallus gallus GN=MAFA PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? -0.8 0.1 8.7 2.2e+04 156 180 .. 69 93 .. 22 97 .. 0.76
+ 2 ! 21.8 1.6 1.1e-06 0.0029 84 167 .. 200 281 .. 174 286 .] 0.81
+
+ Alignments for each domain:
+ == domain 1 score: -0.8 bits; conditional E-value: 8.7
+ sp|Q1XGE2|HAC1_ASPOR 156 ntplpgspatasptltptlfkqerd 180
+ p pg+ +a+pt p k + +
+ sp|O42290|MAFA_CHICK 69 CAPSPGGQPSAGPTAAPLGSKPQLE 93
+ 4688888888999988876666655 PP
+
+ == domain 2 score: 21.8 bits; conditional E-value: 1.1e-06
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatas 167
+ ++ +r l+nr+ aq++r ++ + + lenek+ql+ q + l q +s+l e++ ++ +laa rg p +p t +
+ sp|O42290|MAFA_CHICK 200 LKQNRRTLKNRGYAQSCRYKRVQQRHILENEKCQLQSQVEQLKQEVSRLAKERDLYKEKYEKLAA--RGFPREPSPPAAPKTTA 281
+ 3556799***********988888999****************************9****99998..67655555567776654 PP
+
+>> sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcriptional factor ATF-like 3 OS=Homo sapiens GN=BATF3 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 21.6 2.6 1.3e-06 0.0033 70 143 .. 22 95 .. 12 124 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 21.6 bits; conditional E-value: 1.3e-06
+ sp|Q1XGE2|HAC1_ASPOR 70 lpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqql 143
+ p + + e ++r+++r +nr aaq sr+++ + +kl+ e leq+n +l + +++l e +l++ l
+ sp|Q9NR55|BATF3_HUMAN 22 QPQPQPQQQSPEDDDRKVRRREKNRVAAQRSRKKQTQKADKLHEEYESLEQENTMLRREIGKLTEELKHLTEAL 95
+ 33333334445667788889999*********************************999999998888887766 PP
+
+>> sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive element-binding protein 3-like protein 1 OS=Homo sapiens GN=CREB3L1 PE=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 20.7 0.0 2.6e-06 0.0066 60 156 .. 272 362 .. 219 434 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 20.7 bits; conditional E-value: 2.6e-06
+ sp|Q1XGE2|HAC1_ASPOR 60 gqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqla 147
+ + p+p t lp k +ek +r++r ++n+ +aq sr++k+ +e le + + +n l +++ le n+ l qql +l
+ sp|Q96BA8|CR3L1_HUMAN 272 AEGYPIP-TKLPLTK----AEEKALKRVRRKIKNKISAQESRRKKKEYVECLEKKVETFTSENNELWKKVETLENANRTLLQQLQKLQ 354
+ 5556666.5666543....468999*********************99*****988889999**********************9998 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 148 aevrgsran 156
+ v +
+ sp|Q96BA8|CR3L1_HUMAN 355 TLVTNK-IS 362
+ 877543.33 PP
+
+>> sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element-binding protein 3-like protein 1 OS=Rattus norvegicus GN=Creb3l1 P
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 21.4 0.0 1.6e-06 0.004 59 160 .. 270 365 .. 215 432 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 21.4 bits; conditional E-value: 1.6e-06
+ sp|Q1XGE2|HAC1_ASPOR 59 wgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqla 147
+ + p+p t lp k +ek +r++r ++n+ +aq sr++k+ +e le + +n l +++ le n+ l qql +l
+ sp|Q66HA2|CR3L1_RAT 270 IAEGYPIP-TKLPLTK----AEEKALKRVRRKIKNKISAQESRRKKKEYVECLEKKVETYTSENNELWKKVETLETANRTLLQQLQKLQ 353
+ 55556666.5666543....368999*********************99****9877778899999*******************9998 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 148 aevrgsrantplp 160
+ v s+ + p
+ sp|Q66HA2|CR3L1_RAT 354 TLVT-SKISRPYK 365
+ 8775.45555543 PP
+
+>> sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcription factor ATF-7 OS=Homo sapiens GN=ATF7 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 19.9 2.1 4.4e-06 0.011 46 141 .. 310 401 .. 285 419 .. 0.69
+
+ Alignments for each domain:
+ == domain 1 score: 19.9 bits; conditional E-value: 4.4e-06
+ sp|Q1XGE2|HAC1_ASPOR 46 kpeekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqlea 134
+ p+ pa+ + s q p p t+ r+r +++ ++rr + + rnraaa +r++++l + le + +l qn l ++ l+
+ sp|P17544|ATF7_HUMAN 310 HPDAPSPAQPQVSPAQ--PTPSTG--GRRRRTVDEDPDERRQRFLERNRAAASRCRQKRKLWVSSLEKKAEELTSQNIQLSNEVTLLRN 394
+ 4666777777766555..788886..344444444455666566669********************9999999999777776666665 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 135 ennrlsq 141
+ e +l q
+ sp|P17544|ATF7_HUMAN 395 EVAQLKQ 401
+ 5555554 PP
+
+>> sp|O43889|CREB3_HUMAN Cyclic AMP-responsive element-binding protein 3 OS=Homo sapiens GN=CREB3 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 20.2 0.6 3.6e-06 0.0092 77 150 .. 169 241 .. 157 255 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 20.2 bits; conditional E-value: 3.6e-06
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaev 150
+ kte e+ +r++r +rn+ +aq sr++k++ + le++ ++ qn+ l +++ le +n l +ql +l a v
+ sp|O43889|CREB3_HUMAN 169 KTE-EQILKRVRRKIRNKRSAQESRRKKKVYVGGLESRVLKYTAQNMELQNKVQLLEEQNLSLLDQLRKLQAMV 241
+ 555.456789*********************************************************9998876 PP
+
+>> sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcription factor ATF-7 OS=Mus musculus GN=Atf7 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 20.9 1.5 2.1e-06 0.0054 46 140 .. 299 389 .. 274 401 .. 0.68
+
+ Alignments for each domain:
+ == domain 1 score: 20.9 bits; conditional E-value: 2.1e-06
+ sp|Q1XGE2|HAC1_ASPOR 46 kpeekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqlea 134
+ p+ pa+ + s q p p t+ r+r +++ ++rr + + rnraaa +r++++l + le + +l qn l ++ l+
+ sp|Q8R0S1|ATF7_MOUSE 299 HPDAPSPAQPQVSPAQ--PTPSTG--GRRRRTVDEDPDERRQRFLERNRAAASRCRQKRKLWVSSLEKKAEELTSQNIQLSNEVTLLRN 383
+ 4666777777766555..788886..344444444455666566669********************9999999999777766666665 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 135 ennrls 140
+ e +l
+ sp|Q8R0S1|ATF7_MOUSE 384 EVAQLK 389
+ 555554 PP
+
+>> sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcription factor ATF-7 OS=Pongo abelii GN=ATF7 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 19.6 2.2 5.4e-06 0.014 46 141 .. 299 390 .. 275 408 .. 0.70
+
+ Alignments for each domain:
+ == domain 1 score: 19.6 bits; conditional E-value: 5.4e-06
+ sp|Q1XGE2|HAC1_ASPOR 46 kpeekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqlea 134
+ p+ pa+ + s q p p t+ r+r +++ ++rr + + rnraaa +r++++l + le + +l qn l ++ l+
+ sp|Q5R9C9|ATF7_PONAB 299 HPDAPSPAQPQVSPAQ--PTPSTG--GRRRRTVDEDPDERRQRFLERNRAAASRCRQKRKLWVSSLEKKAEELTSQNIQLSNEVTLLRN 383
+ 4666677777766555..788886..344444444455666566669********************9999999999777776666665 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 135 ennrlsq 141
+ e +l q
+ sp|Q5R9C9|ATF7_PONAB 384 EVAQLKQ 390
+ 5555554 PP
+
+>> sp|O35284|BATF_MOUSE Basic leucine zipper transcriptional factor ATF-like OS=Mus musculus GN=Batf PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 20.5 0.1 3e-06 0.0076 71 135 .. 17 78 .. 12 107 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 20.5 bits; conditional E-value: 3e-06
+ sp|Q1XGE2|HAC1_ASPOR 71 pprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleae 135
+ pp k+ + + r+++r +nr aaq sr+r+ + + l+ e +le+qn l + + ql e
+ sp|O35284|BATF_MOUSE 17 PPGKQDSS---DDVRKVQRREKNRIAAQKSRQRQTQKADTLHLESEDLEKQNAALRKEIKQLTEE 78
+ 55554444...45688999999*********************************9999998766 PP
+
+>> sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive element-binding protein 3 OS=Bos taurus GN=CREB3 PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 19.8 0.2 4.8e-06 0.012 79 151 .. 149 221 .. 134 274 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 19.8 bits; conditional E-value: 4.8e-06
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevr 151
+ +e+ +r++r +rn+ +aq sr++k++ + le++ ++ qn l +++ le +n l +ql +l a v
+ sp|Q8SQ19|CREB3_BOVIN 149 MEEQVLKRVRRKIRNKKSAQESRRKKKVYVGGLESRVLKYTAQNLELQNKVQLLEEQNLSLLDQLRRLQAMVI 221
+ 3466779***************************************9999*99***************99875 PP
+
+>> sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive element-binding protein 3-like protein 4 OS=Homo sapiens GN=CREB3L4 PE=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 19.6 3.7 5.5e-06 0.014 78 150 .. 212 284 .. 191 299 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 19.6 bits; conditional E-value: 5.5e-06
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaev 150
+ +e+ ++++r +rn+ +aq sr+rk+ ++ le++ + qnq l +++++le +n l ql ql +
+ sp|Q8TEY5|CR3L4_HUMAN 212 KAEERVLKKVRRKIRNKQSAQDSRRRKKEYIDGLESRVAACSAQNQELQKKVQELERHNISLVAQLRQLQTLI 284
+ 346788899******************************************************9999997654 PP
+
+>> sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcriptional factor ATF-like 3 OS=Mus musculus GN=Batf3 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ! 19.9 2.9 4.6e-06 0.012 81 143 .. 26 88 .. 12 96 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 19.9 bits; conditional E-value: 4.6e-06
+ sp|Q1XGE2|HAC1_ASPOR 81 ekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqql 143
+ + ++r+++r +nr aaq sr+++ + +kl+ e leq+n l + +s+l+ e ++ls+ l
+ sp|Q9D275|BATF3_MOUSE 26 KDDDRKVRRREKNRVAAQRSRKKQTQKADKLHEEHESLEQENSVLRREISKLKEELRHLSEVL 88
+ 335677888889*****************************************9999998766 PP
+
+>> sp|Q504L8|MAFB_XENTR Transcription factor MafB OS=Xenopus tropicalis GN=mafb PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 1.9 0.0 1.3 3.3e+03 116 182 .. 16 86 .. 8 100 .. 0.70
+ 2 ? 18.5 1.1 1.2e-05 0.029 54 147 .. 201 295 .. 173 314 .. 0.66
+
+ Alignments for each domain:
+ == domain 1 score: 1.9 bits; conditional E-value: 1.3
+ sp|Q1XGE2|HAC1_ASPOR 116 iqleqqnqfllqrls.qleaennrlsqqlaql.aaevrgsrantpl..pgspatasptltptlfkqerdel 182
+ + +e n+f l++++ + e ++r ++ + + + gs ++tp+ p s +sp+++pt k + del
+ sp|Q504L8|MAFB_XENTR 16 LAMEYVNDFDLMKFDvKKEPLGGRPDRAIRPCnRLQPTGSVSSTPIstPCSSVPSSPSFSPTEQKTHMDEL 86
+ 56677777766666523444555555555444134667888888864577888899999999999999997 PP
+
+ == domain 2 score: 18.5 bits; conditional E-value: 1.2e-05
+ sp|Q1XGE2|HAC1_ASPOR 54 kkrkswgqelpvpktnlpprkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsq 141
+ r s q + + l + r+ t+d+ + ++ +r l+nr+ aq++r ++ + + lenek ql qq + l +s+l e++
+ sp|Q504L8|MAFB_XENTR 201 EDRFSDDQLVSMSVRELNRHLRGFTKDDVIRlKQKRRTLKNRGYAQSCRFKRVQQKHHLENEKTQLIQQVEQLKLEVSRLARERDAYKI 289
+ 55555555555555666667788887775441566799***********988888999********99998888888888888776655 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 142 qlaqla 147
+ ++ +la
+ sp|Q504L8|MAFB_XENTR 290 KCEKLA 295
+ 444444 PP
+
+>> sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive element-binding protein 3-like protein 4 OS=Macaca fascicularis GN=CREB3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 19.8 3.6 4.8e-06 0.012 78 150 .. 212 284 .. 191 299 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 19.8 bits; conditional E-value: 4.8e-06
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaev 150
+ +e+ ++++r +rn+ +aq sr+rk+ ++ le++ + qnq l +++++le +n l ql ql +
+ sp|Q5UEM8|CR3L4_MACFA 212 KAEERVLKKVRRKIRNKQSAQDSRRRKKEYIDGLESRVAACSAQNQELQKKVQELERHNISLVAQLRQLQTLI 284
+ 346788899******************************************************9999997654 PP
+
+>> sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS=Xenopus tropicalis GN=mafa PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.7 1.5 1e-05 0.026 85 167 .. 203 284 .. 181 288 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 18.7 bits; conditional E-value: 1e-05
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatas 167
+ ++ +r l+nr+ aq++r ++ + + le ek+ql+ q + l q +s+l e++ ++ +la++ +r + p g+p+ a+
+ sp|Q4U1U2|MAFA_XENTR 203 KQKRRTLKNRGYAQSCRYKRVQQRHILETEKCQLQSQVEQLKQEVSRLAKERDLYKDKYEKLASRSFTTRES-PPQGNPGKAN 284
+ 445699***********988888999***************************99999999*9998888765.5568888775 PP
+
+>> sp|P23091|MAF_AVIS4 Transforming protein Maf OS=Avian musculoaponeurotic fibrosarcoma virus AS42 GN=V-MAF PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 1.8 0.0 1.4 3.7e+03 114 168 .. 15 68 .. 6 80 .. 0.72
+ 2 ? 15.1 1.3 0.00013 0.32 85 148 .. 276 339 .. 253 362 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 1.8 bits; conditional E-value: 1.4
+ sp|Q1XGE2|HAC1_ASPOR 114 ekiqleqqnqfllqrls..qleaennrlsqqlaqlaaevrgsrantplpgspatasp 168
+ + +e n+f l+++ + e +r+ q+++l a gs ++tp+ +p+++ p
+ sp|P23091|MAF_AVIS4 15 SPLAMEYVNDFDLMKFEvkKEPVETDRIISQCGRLIA--GGSLSSTPMS-TPCSSVP 68
+ 5678999999988886511455799999999999987..5999999994.3444333 PP
+
+ == domain 2 score: 15.1 bits; conditional E-value: 0.00013
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa 148
+ ++ +r l+nr+ aq++r ++ + + le+ek ql qq + l q +s+l e++ ++ +l +
+ sp|P23091|MAF_AVIS4 276 KQKRRTLKNRGYAQSCRFKRVQQRHVLESEKNQLLQQVEHLKQEISRLVRERDAYKEKYEKLVS 339
+ 445699***********988889999**********************9999988887777765 PP
+
+>> sp|P81269|ATF1_MOUSE Cyclic AMP-dependent transcription factor ATF-1 OS=Mus musculus GN=Atf1 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.7 0.3 1e-05 0.026 75 131 .. 204 259 .. 167 265 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 18.7 bits; conditional E-value: 1e-05
+ sp|Q1XGE2|HAC1_ASPOR 75 raktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ kt+d + rr r+++nr aa+ +r++k+ ++ len+ le qn+ l++ l
+ sp|P81269|ATF1_MOUSE 204 TTKTDDPQ-LRREIRLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKT 259
+ 46776665.566669************99999999****************998865 PP
+
+>> sp|Q789F3|MAF_CHICK Transcription factor Maf OS=Gallus gallus GN=MAF PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 1.8 0.0 1.4 3.5e+03 114 168 .. 15 68 .. 6 81 .. 0.72
+ 2 ? 14.9 1.2 0.00015 0.38 85 148 .. 276 339 .. 254 357 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 1.8 bits; conditional E-value: 1.4
+ sp|Q1XGE2|HAC1_ASPOR 114 ekiqleqqnqfllqrls..qleaennrlsqqlaqlaaevrgsrantplpgspatasp 168
+ + +e n+f l+++ + e +r+ q+++l a gs ++tp+ +p+++ p
+ sp|Q789F3|MAF_CHICK 15 SPLAMEYVNDFDLMKFEvkKEPVETDRIISQCGRLIA--GGSLSSTPMS-TPCSSVP 68
+ 5678999999988886511455799999999999987..5999999994.3443333 PP
+
+ == domain 2 score: 14.9 bits; conditional E-value: 0.00015
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa 148
+ ++ +r l+nr+ aq++r ++ + + le+ek ql qq + l q +s+l e++ ++ +l +
+ sp|Q789F3|MAF_CHICK 276 KQKRRTLKNRGYAQSCRFKRVQQRHVLESEKNQLLQQVEHLKQEISRLVRERDAYKEKYEKLVS 339
+ 445699***********988889999**********************9999988877766654 PP
+
+>> sp|P29747|CREBA_DROME Cyclic AMP response element-binding protein A OS=Drosophila melanogaster GN=CrebA PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.0 0.1 1.6e-05 0.042 64 149 .. 427 507 .. 383 513 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 18.0 bits; conditional E-value: 1.6e-05
+ sp|Q1XGE2|HAC1_ASPOR 64 pvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaae 149
+ p+p+ lp k +ek ++i+r ++n+ +aq sr++k+ +++le++ l +n+ +rl le n l ql +l a
+ sp|P29747|CREBA_DROME 427 PIPQ-KLPLTK----AEEKSLKKIRRKIKNKISAQESRRKKKEYMDQLERRVEILVTENHDYKKRLEGLEETNANLLSQLHKLQAL 507
+ 5554.344322....4689999***************************98777788899999*******9999999999998775 PP
+
+>> sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcription factor ATF-4 OS=Homo sapiens GN=ATF4 PE=1 SV=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.3 0.3 1.3e-05 0.034 75 155 .. 270 346 .. 242 351 .] 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 18.3 bits; conditional E-value: 1.3e-05
+ sp|Q1XGE2|HAC1_ASPOR 75 raktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsra 155
+ ak + ek +++++++ +n+ aa r++kr e+e l +e +le++n+ l +r + l e q l +l evr +r+
+ sp|P18848|ATF4_HUMAN 270 AAKVKGEKLDKKLKKMEQNKTAATRYRQKKRAEQEALTGECKELEKKNEALKERADSLAKEI----QYLKDLIEEVRKARG 346
+ 48999*************************************************99987775....445555555655554 PP
+
+>> sp|P54844|MAF_RAT Transcription factor Maf OS=Rattus norvegicus GN=Maf PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 2.0 0.0 1.2 3.1e+03 113 168 .. 14 68 .. 5 87 .. 0.74
+ 2 ? 15.1 0.9 0.00013 0.33 85 148 .. 286 349 .. 264 368 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 2.0 bits; conditional E-value: 1.2
+ sp|Q1XGE2|HAC1_ASPOR 113 nekiqleqqnqfllqrls..qleaennrlsqqlaqlaaevrgsrantplpgspatasp 168
+ + +e n+f l+++ + e +r+ q+++l a gs ++tp+ +p+++ p
+ sp|P54844|MAF_RAT 14 TSPLAMEYVNDFDLMKFEvkKEPVETDRIISQCGRLIA--GGSLSSTPMS-TPCSSVP 68
+ 56678999999988886511456799999999999987..5999999994.3443333 PP
+
+ == domain 2 score: 15.1 bits; conditional E-value: 0.00013
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa 148
+ ++ +r l+nr+ aq++r ++ + + le+ek ql qq + l q +s+l e++ ++ +l +
+ sp|P54844|MAF_RAT 286 KQKRRTLKNRGYAQSCRFKRVQQRHVLESEKNQLLQQVDHLKQEISRLVRERDAYKEKYEKLVS 349
+ 445699***********988889999**********************9999988887777654 PP
+
+>> sp|O75444|MAF_HUMAN Transcription factor Maf OS=Homo sapiens GN=MAF PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 1.9 0.0 1.3 3.4e+03 113 168 .. 14 68 .. 5 80 .. 0.72
+ 2 ? 14.7 1.0 0.00017 0.43 85 147 .. 290 352 .. 268 371 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 1.9 bits; conditional E-value: 1.3
+ sp|Q1XGE2|HAC1_ASPOR 113 nekiqleqqnqfllqrls..qleaennrlsqqlaqlaaevrgsrantplpgspatasp 168
+ + +e n+f l+++ + e +r+ q+++l a gs ++tp+ +p+++ p
+ sp|O75444|MAF_HUMAN 14 TSPLAMEYVNDFDLMKFEvkKEPVETDRIISQCGRLIA--GGSLSSTPMS-TPCSSVP 68
+ 56678999999988886511456799999999999987..5999999994.3444333 PP
+
+ == domain 2 score: 14.7 bits; conditional E-value: 0.00017
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqla 147
+ ++ +r l+nr+ aq++r ++ + + le+ek ql qq + l q +s+l e++ ++ +l
+ sp|O75444|MAF_HUMAN 290 KQKRRTLKNRGYAQSCRFKRVQQRHVLESEKNQLLQQVDHLKQEISRLVRERDAYKEKYEKLV 352
+ 445699***********988889999**********************999998877766665 PP
+
+>> sp|P97876|BATF3_RAT Basic leucine zipper transcriptional factor ATF-like 3 OS=Rattus norvegicus GN=Batf3 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.4 2.3 1.2e-05 0.032 81 143 .. 26 88 .. 14 96 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 18.4 bits; conditional E-value: 1.2e-05
+ sp|Q1XGE2|HAC1_ASPOR 81 ekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqql 143
+ + ++r+++r +nr aaq sr+++ + +kl+ e leq+n l + +++l+ e ++l++ l
+ sp|P97876|BATF3_RAT 26 KDDDRKVRRREKNRVAAQRSRKKQTQKSDKLHEEHESLEQENSVLRREIAKLKEELRHLTEAL 88
+ 335677888889***************************************999998888766 PP
+
+>> sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcription factor ATF-4 OS=Mus musculus GN=Atf4 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.8 0.2 9.7e-06 0.025 63 155 .. 254 344 .. 220 349 .] 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 18.8 bits; conditional E-value: 9.7e-06
+ sp|Q1XGE2|HAC1_ASPOR 63 lpvpktnlppr..kraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaae 149
+ p pk pp ak + ek +++++++ +n+ aa r++kr e+e l +e +le++n+ l ++ + l e q l +l e
+ sp|Q06507|ATF4_MOUSE 254 SPRPKPYDPPGvsLTAKVKTEKLDKKLKKMEQNKTAATRYRQKKRAEQEALTGECKELEKKNEALKEKADSLAKEI----QYLKDLIEE 338
+ 477777778862257999**********************************************999988887665....445555556 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 150 vrgsra 155
+ vr +r+
+ sp|Q06507|ATF4_MOUSE 339 VRKARG 344
+ 665554 PP
+
+>> sp|A7Z017|MAF_BOVIN Transcription factor Maf OS=Bos taurus GN=MAF PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 1.9 0.0 1.4 3.5e+03 113 168 .. 14 68 .. 5 80 .. 0.72
+ 2 ? 14.7 1.0 0.00017 0.43 85 147 .. 294 356 .. 272 375 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 1.9 bits; conditional E-value: 1.4
+ sp|Q1XGE2|HAC1_ASPOR 113 nekiqleqqnqfllqrls..qleaennrlsqqlaqlaaevrgsrantplpgspatasp 168
+ + +e n+f l+++ + e +r+ q+++l a gs ++tp+ +p+++ p
+ sp|A7Z017|MAF_BOVIN 14 TSPLAMEYVNDFDLMKFEvkKEPVETDRIISQCGRLIA--GGSLSSTPMS-TPCSSVP 68
+ 56678999999988886511456799999999999987..5999999994.3444333 PP
+
+ == domain 2 score: 14.7 bits; conditional E-value: 0.00017
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqla 147
+ ++ +r l+nr+ aq++r ++ + + le+ek ql qq + l q +s+l e++ ++ +l
+ sp|A7Z017|MAF_BOVIN 294 KQKRRTLKNRGYAQSCRFKRVQQRHVLESEKNQLLQQVDHLKQEISRLVRERDAYKEKYEKLV 356
+ 445699***********988889999**********************999998877766665 PP
+
+>> sp|Q0V9K1|MAF_XENTR Transcription factor Maf OS=Xenopus tropicalis GN=maf PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 2.0 0.0 1.2 3.2e+03 113 168 .. 14 68 .. 5 78 .. 0.72
+ 2 ? 14.4 1.2 0.00021 0.53 85 146 .. 267 328 .. 245 349 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 2.0 bits; conditional E-value: 1.2
+ sp|Q1XGE2|HAC1_ASPOR 113 nekiqleqqnqfllqrls..qleaennrlsqqlaqlaaevrgsrantplpgspatasp 168
+ + +e n+f l+++ + e +r+ q+++l a gs ++tp+ +p+++ p
+ sp|Q0V9K1|MAF_XENTR 14 TSPLAMEYVNDFDLMKFEvkKEPVETDRIISQCGRLIA--GGSLSSTPMS-TPCSSVP 68
+ 56678999999988886511456799999999999987..5999999994.4444333 PP
+
+ == domain 2 score: 14.4 bits; conditional E-value: 0.00021
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaql 146
+ ++ +r l+nr+ aq++r ++ + + le+ek ql qq + l q +s+l e++ ++ +l
+ sp|Q0V9K1|MAF_XENTR 267 KQKRRTLKNRGYAQSCRFKRVQQRHVLESEKNQLLQQVEHLKQEISRLLRERDAYKEKYEKL 328
+ 445699***********988889999*********************999988777666554 PP
+
+>> sp|Q08DA8|ATF1_BOVIN Cyclic AMP-dependent transcription factor ATF-1 OS=Bos taurus GN=ATF1 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 17.9 0.2 1.9e-05 0.047 74 131 .. 204 260 .. 165 268 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 17.9 bits; conditional E-value: 1.9e-05
+ sp|Q1XGE2|HAC1_ASPOR 74 kraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ + +kt+d + +r i r+++nr aa+ +r++k+ ++ len+ le qn+ l++ l
+ sp|Q08DA8|ATF1_BOVIN 204 QTSKTDDPQLKREI-RLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKT 260
+ 45788887776666.89***********99999999****************998865 PP
+
+>> sp|O60675|MAFK_HUMAN Transcription factor MafK OS=Homo sapiens GN=MAFK PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.5 0.2 1.2e-05 0.03 78 166 .. 45 134 .. 9 155 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 18.5 bits; conditional E-value: 1.2e-05
+ sp|Q1XGE2|HAC1_ASPOR 78 tedek.eqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspat 165
+ t++e + ++ +r l+nr+ a ++r ++ + e le+++++l+q+ + l + s ++ e + l + l r + p at
+ sp|O60675|MAFK_HUMAN 45 TKEEVtRLKQRRRTLKNRGYAASCRIKRVTQKEELERQRVELQQEVEKLARENSSMRLELDALRSKYEALQTFARTVARGPVAPSKVAT 133
+ 44433023445699************9999****************************9999998887777766654333333444444 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 166 a 166
+
+ sp|O60675|MAFK_HUMAN 134 T 134
+ 3 PP
+
+>> sp|P54843|MAF_MOUSE Transcription factor Maf OS=Mus musculus GN=Maf PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 1.9 0.0 1.3 3.3e+03 113 168 .. 14 68 .. 5 80 .. 0.72
+ 2 ? 14.5 1.1 0.00019 0.48 85 148 .. 287 350 .. 265 368 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 1.9 bits; conditional E-value: 1.3
+ sp|Q1XGE2|HAC1_ASPOR 113 nekiqleqqnqfllqrls..qleaennrlsqqlaqlaaevrgsrantplpgspatasp 168
+ + +e n+f l+++ + e +r+ q+++l a gs ++tp+ +p+++ p
+ sp|P54843|MAF_MOUSE 14 TSPLAMEYVNDFDLMKFEvkKEPVETDRIISQCGRLIA--GGSLSSTPMS-TPCSSVP 68
+ 56778999999988886511456799999999999987..5999999994.3444333 PP
+
+ == domain 2 score: 14.5 bits; conditional E-value: 0.00019
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa 148
+ ++ +r l+nr+ aq++r ++ + + le+ek ql qq + l q +s+l e++ ++ +l +
+ sp|P54843|MAF_MOUSE 287 KQKRRTLKNRGYAQSCRFKRVQQRHVLESEKNQLLQQVDHLKQEISRLVRERDAYKEKYEKLVS 350
+ 445699***********988889999**********************9999988877766654 PP
+
+>> sp|P18846|ATF1_HUMAN Cyclic AMP-dependent transcription factor ATF-1 OS=Homo sapiens GN=ATF1 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 17.8 0.2 2e-05 0.05 74 131 .. 205 261 .. 166 269 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 17.8 bits; conditional E-value: 2e-05
+ sp|Q1XGE2|HAC1_ASPOR 74 kraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ + kt+d + +r i r+++nr aa+ +r++k+ ++ len+ le qn+ l++ l
+ sp|P18846|ATF1_HUMAN 205 QTTKTDDPQLKREI-RLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKT 261
+ 45788887766666.89***********99999999****************998865 PP
+
+>> sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Arabidopsis thaliana GN=GBF1 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.1 1.3 1.5e-05 0.039 77 142 .. 216 281 .. 176 302 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 18.1 bits; conditional E-value: 1.5e-05
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqq 142
+ +de+e +r +r nr +a+ sr rk+ e+e+l+++ l +nq l + l++l +e ++l +
+ sp|P42774|GBF1_ARATH 216 PVKDERELKRQKRKQSNRESARRSRLRKQAECEQLQQRVESLSNENQSLRDELQRLSSECDKLKSE 281
+ 5689********************************998899999999976666666666555433 PP
+
+>> sp|Q61827|MAFK_MOUSE Transcription factor MafK OS=Mus musculus GN=Mafk PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 18.1 0.3 1.5e-05 0.039 78 165 .. 45 133 .. 9 155 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 18.1 bits; conditional E-value: 1.5e-05
+ sp|Q1XGE2|HAC1_ASPOR 78 tedek.eqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspat 165
+ t++e + ++ +r l+nr+ a ++r ++ + e le+++++l+q+ + l + s ++ e + l + l r + p at
+ sp|Q61827|MAFK_MOUSE 45 TKEEVtRLKQRRRTLKNRGYAASCRIKRVTQKEELERQRVELQQEVEKLARENSSMRLELDALRSKYEALQTFARTVARGPVTPTKVAT 133
+ 44433023445699************9999**************************999999988877776665543333223333333 PP
+
+>> sp|P14233|TGA1B_TOBAC TGACG-sequence-specific DNA-binding protein TGA-1B (Fragment) OS=Nicotiana tabacum GN=TGA1B PE
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 17.6 0.6 2.3e-05 0.058 80 140 .. 181 240 .. 166 242 .] 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 17.6 bits; conditional E-value: 2.3e-05
+ sp|Q1XGE2|HAC1_ASPOR 80 dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrls 140
+ de e++r r++rnr +aq sr+rk+ +e le++ ++ q l +++ + aen l
+ sp|P14233|TGA1B_TOBAC 181 DEDEKKR-ARLVRNRESAQLSRQRKKHYVEELEDKVRIMHSTIQDLNAKVAYIIAENATLK 240
+ 5555555.6899*********************9877788899999999999999998775 PP
+
+>> sp|Q6NW59|ATF4_DANRE Cyclic AMP-dependent transcription factor ATF-4 OS=Danio rerio GN=atf4 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 17.0 0.4 3.4e-05 0.086 47 144 .. 230 327 .. 200 338 .. 0.75
+
+ Alignments for each domain:
+ == domain 1 score: 17.0 bits; conditional E-value: 3.4e-05
+ sp|Q1XGE2|HAC1_ASPOR 47 peekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleae 135
+ + p+ + k + + p l r + + k +++++++ +n+ aa r++kr+e+e l +e +le++n+ l ++ + l e
+ sp|Q6NW59|ATF4_DANRE 230 QSDLEPSSRAKPYSRPDPEASPALKGRVKTSSGAPKVEKKLKKMEQNKTAATRYRQKKRVEQESLNSECSELEKKNRELSEKADSLSRE 318
+ 55667888888888766666666666666666778999**************************************9998888877766 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 136 nnrlsqqla 144
+ + l + l
+ sp|Q6NW59|ATF4_DANRE 319 IQYLRDLLE 327
+ 655544443 PP
+
+>> sp|O24160|TGA21_TOBAC TGACG-sequence-specific DNA-binding protein TGA-2.1 OS=Nicotiana tabacum GN=TGA21 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.2 1.6 6.1e-05 0.15 82 133 .. 165 215 .. 155 236 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 16.2 bits; conditional E-value: 6.1e-05
+ sp|Q1XGE2|HAC1_ASPOR 82 keqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqle 133
+ +q+ ++r+ +nr aa+ sr rk+ +++len +++l q q l qr q+
+ sp|O24160|TGA21_TOBAC 165 LDQKTLRRLAQNREAARKSRLRKKAYVQQLENSRLKLSQLEQDL-QRARQQG 215
+ 4788899999***************************9999975.6665543 PP
+
+>> sp|Q98UK4|MAF_DANRE Transcription factor Maf OS=Danio rerio GN=maf PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? -0.1 0.0 5.2 1.3e+04 115 165 .. 16 65 .. 5 86 .. 0.60
+ 2 ? 15.7 1.3 8.2e-05 0.21 85 144 .. 243 302 .. 221 324 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: -0.1 bits; conditional E-value: 5.2
+ sp|Q1XGE2|HAC1_ASPOR 115 kiqleqqnqfllqrls..qleaennrlsqqlaqlaaevrgsrantplpgspat 165
+ + +e n+f l+++ + e +r q+++l a gs ++tp+ +p++
+ sp|Q98UK4|MAF_DANRE 16 PLAMEYVNDFDLMKFEvkKEPVEPDRSISQCSRLIA--GGSLSSTPMS-TPCS 65
+ 556677777766665311233455555555555554..4667777773.3333 PP
+
+ == domain 2 score: 15.7 bits; conditional E-value: 8.2e-05
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqla 144
+ ++ +r l+nr+ aq++r ++ + + le+ek ql qq + l q +s+l e++ ++
+ sp|Q98UK4|MAF_DANRE 243 KQKRRTLKNRGYAQSCRYKRVQQRHVLEGEKTQLMQQVDHLKQEISRLVRERDAYKEKYE 302
+ 445699***********988889999*********************9999887766655 PP
+
+>> sp|A3KMR8|MAFA_DANRE Transcription factor MafA OS=Danio rerio GN=mafa PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.7 0.6 4.2e-05 0.11 85 165 .. 225 305 .. 200 315 .] 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 16.7 bits; conditional E-value: 4.2e-05
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspat 165
+ ++ +r l+nr+ aq++r ++ + + le+ek+ l+ q + l q +++l e++ ++ +la++ + +nt p s
+ sp|A3KMR8|MAFA_DANRE 225 KQKRRTLKNRGYAQSCRYKRVQQRHMLESEKCTLQSQVEQLKQDVARLIKERDLYKEKYEKLASRAFNGGGNTRDPSSGNH 305
+ 445699***********998889999**************************************99999999988877554 PP
+
+>> sp|Q90596|MAFK_CHICK Transcription factor MafK OS=Gallus gallus GN=MAFK PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.9 0.5 3.5e-05 0.09 84 164 .. 52 132 .. 31 154 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 16.9 bits; conditional E-value: 3.5e-05
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspa 164
+ ++ +r l+nr+ a ++r ++ + e le+++++l+q+ + l + s ++ e + l + l r + p a
+ sp|Q90596|MAFK_CHICK 52 LKQRRRTLKNRGYAASCRIKRVTQKEELERQRVELQQEVEKLARENSSMKLELDALRSKYEALQTFARTVARGPITPTKVA 132
+ 3344699************9999***************************9999998887777666554333222233333 PP
+
+>> sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcription factor ATF-4 OS=Bos taurus GN=ATF4 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.4 0.3 5.2e-05 0.13 75 145 .. 267 337 .. 228 346 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 16.4 bits; conditional E-value: 5.2e-05
+ sp|Q1XGE2|HAC1_ASPOR 75 raktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaq 145
+ ak + ek +++++++ +n+ aa r++kr e+e l +e +le++n+ l ++ + l e + l +q+ +
+ sp|Q3ZCH6|ATF4_BOVIN 267 AAKVKGEKLDKKLKKMEQNKTAATRYRQKKRAEQEALTGECKELEKKNEALKEKADSLAKEIQYLKDQIEE 337
+ 48999**********************************************99999999888888887754 PP
+
+>> sp|P97875|JDP2_MOUSE Jun dimerization protein 2 OS=Mus musculus GN=Jdp2 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 17.0 0.8 3.5e-05 0.088 77 145 .. 65 134 .. 9 157 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 17.0 bits; conditional E-value: 3.5e-05
+ sp|Q1XGE2|HAC1_ASPOR 77 kte.dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaq 145
+ k+e de e+rr +r +n+ aa +r +k+ + e l++e +le +n l ++ +l+ e+++l +l +
+ sp|P97875|JDP2_MOUSE 65 KSElDEEEERRKRRREKNKVAAARCRNKKKERTEFLQRESERLELMNAELKTQIEELKLERQQLILMLNR 134
+ 3333888999999999****************************************99999998777654 PP
+
+>> sp|Q78E65|JDP2_RAT Jun dimerization protein 2 OS=Rattus norvegicus GN=Jdp2 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 17.0 0.8 3.5e-05 0.088 77 145 .. 65 134 .. 9 157 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 17.0 bits; conditional E-value: 3.5e-05
+ sp|Q1XGE2|HAC1_ASPOR 77 kte.dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaq 145
+ k+e de e+rr +r +n+ aa +r +k+ + e l++e +le +n l ++ +l+ e+++l +l +
+ sp|Q78E65|JDP2_RAT 65 KSElDEEEERRKRRREKNKVAAARCRNKKKERTEFLQRESERLELMNAELKTQIEELKLERQQLILMLNR 134
+ 3333888999999999****************************************99999998777654 PP
+
+>> sp|P12959|OP2_MAIZE Regulatory protein opaque-2 OS=Zea mays GN=O2 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.2 0.2 5.8e-05 0.15 85 159 .. 227 301 .. 221 342 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 16.2 bits; conditional E-value: 5.8e-05
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantpl 159
+ r+++ nr +a+ sr rk +l+ le++ ql+ +n ll+r++ l + n + + l a++ ra +
+ sp|P12959|OP2_MAIZE 227 ERVRKKESNRESARRSRYRKAAHLKELEDQVAQLKAENSCLLRRIAALNQKYNDANVDNRVLRADMETLRAKVKM 301
+ 46777778***************************************9999998888888888888877776655 PP
+
+>> sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive element-binding protein 5 OS=Mus musculus GN=Creb5 PE=2 SV=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 0.8 0.9 2.9 7.3e+03 141 170 .. 19 48 .. 10 124 .. 0.63
+ 2 ? 16.9 4.4 3.7e-05 0.093 51 143 .. 193 284 .. 182 322 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 0.8 bits; conditional E-value: 2.9
+ sp|Q1XGE2|HAC1_ASPOR 141 qqlaqlaaevrgsrantplpgspatasptl 170
+ +q + a + g+ n +pgs a p
+ sp|Q8K1L0|CREB5_MOUSE 19 RQRQPMPASMPGTLPNPTMPGSSAVLMPME 48
+ 455567788899999999999988877753 PP
+
+ == domain 2 score: 16.9 bits; conditional E-value: 3.7e-05
+ sp|Q1XGE2|HAC1_ASPOR 51 kpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennr 138
+ pa ++ + q + p+ r+r ed +rr + + rnraaa +r+++++ + le + +l q n+ l +s+l+ e +
+ sp|Q8K1L0|CREB5_MOUSE 193 SPATQQMQPTQTIQPPQPTGGRRRRVVDEDPD-ERRRKFLERNRAAATRCRQKRKVWVMSLEKKAEELTQTNMQLQNEVSMLKNEVAQ 279
+ 57777777778888888777667777666655.55667889**********************9999***999999999999888877 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 139 lsqql 143
+ l q l
+ sp|Q8K1L0|CREB5_MOUSE 280 LKQLL 284
+ 77655 PP
+
+>> sp|Q39140|TGA6_ARATH Transcription factor TGA6 OS=Arabidopsis thaliana GN=TGA6 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.1 3.0 6.4e-05 0.16 77 131 .. 38 91 .. 33 102 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 16.1 bits; conditional E-value: 6.4e-05
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ +++d+ +q+ ++r+ +nr aa+ sr rk+ +++len +++l q q lqr q
+ sp|Q39140|TGA6_ARATH 38 RSKDKLDQKTLRRLAQNREAARKSRLRKKAYVQQLENSRLKLTQLEQE-LQRARQ 91
+ 5679999**********************************9998886.466555 PP
+
+>> sp|P23923|HBP1B_WHEAT Transcription factor HBP-1b(c38) OS=Triticum aestivum PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.9 2.9 7.3e-05 0.19 73 131 .. 37 91 .. 30 106 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 15.9 bits; conditional E-value: 7.3e-05
+ sp|Q1XGE2|HAC1_ASPOR 73 rkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ r r k d+k +r r+ +nr aa+ sr rk+ +++len +++l q q lqr q
+ sp|P23923|HBP1B_WHEAT 37 RSRDKNGDQKTMR---RLAQNREAARKSRLRKKAYVQQLENSRLKLTQLEQE-LQRARQ 91
+ 6666666666665...5679*************************9998886.466555 PP
+
+>> sp|Q00322|CEBPD_MOUSE CCAAT/enhancer-binding protein delta OS=Mus musculus GN=Cebpd PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.7 0.7 8.1e-05 0.21 98 169 .. 195 263 .. 142 267 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 15.7 bits; conditional E-value: 8.1e-05
+ sp|Q1XGE2|HAC1_ASPOR 98 qtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspataspt 169
+ + rer + ++k + + +++nq + q+l +l aen +l q++ ql ++ g r sp pt
+ sp|Q00322|CEBPD_MOUSE 195 RQRRERNNIAVRK---SRDKAKRRNQEMQQKLVELSAENEKLHQRVEQLTRDLAGLRQFFKKLPSPPFLPPT 263
+ 3345555555555...44456789999****************************99876655555555555 PP
+
+>> sp|Q39163|TGA5_ARATH Transcription factor TGA5 OS=Arabidopsis thaliana GN=TGA5 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.9 2.2 7e-05 0.18 79 131 .. 40 91 .. 34 109 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 15.9 bits; conditional E-value: 7e-05
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ + + +q+ ++r+ +nr aa+ sr rk+ +++len +++l q q lqr q
+ sp|Q39163|TGA5_ARATH 40 KSKMDQKTLRRLAQNREAARKSRLRKKAYVQQLENSRLKLTQLEQE-LQRARQ 91
+ 4567899999*****************************9998886.466655 PP
+
+>> sp|Q54RZ9|BZPG_DICDI Probable basic-leucine zipper transcription factor G OS=Dictyostelium discoideum GN=bzpG PE=3 S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.7 0.7 8.4e-05 0.21 80 149 .. 274 343 .. 262 352 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 15.7 bits; conditional E-value: 8.4e-05
+ sp|Q1XGE2|HAC1_ASPOR 80 dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaae 149
+ ++ke +r +r+++nr +a+ sr+rkr +l le++ +l + + + ls le en l +++ql
+ sp|Q54RZ9|BZPG_DICDI 274 EKKELKRQKRLIKNRESAHLSRQRKRERLTDLEHRVEELSSNSIDINKTLSSLENENLILKAEVGQLFEV 343
+ 578999***************************9888888877788899********9999999998654 PP
+
+>> sp|Q8CF90|MAFA_MOUSE Transcription factor MafA OS=Mus musculus GN=Mafa PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.7 0.3 8.2e-05 0.21 85 168 .. 262 348 .. 237 356 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 15.7 bits; conditional E-value: 8.2e-05
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevr.g..srantplpgspatasp 168
+ ++ +r l+nr+ aq++r ++ + + le+ek+ql+ q + l +++l e++ ++ +la++ g + a+ p spa a+p
+ sp|Q8CF90|MAFA_MOUSE 262 KQKRRTLKNRGYAQSCRFKRVQQRHILESEKCQLQSQVEQLKLEVGRLAKERDLYKEKYEKLAGRGGpGgaGGAGFPREPSPAQAGP 348
+ 445699***********988888999**********999999999999999999998888888753212113456666667777776 PP
+
+>> sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcription factor ATF-4 OS=Rattus norvegicus GN=Atf4 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 16.4 0.2 5e-05 0.13 74 155 .. 265 342 .. 230 347 .] 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 16.4 bits; conditional E-value: 5e-05
+ sp|Q1XGE2|HAC1_ASPOR 74 kraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsra 155
+ ak + ek +++++++ +n+ aa r++kr e+e l +e +le++n+ l ++ + l e q l +l evr +r+
+ sp|Q9ES19|ATF4_RAT 265 VTAKVKTEKLDKKLKKMEQNKTAATRYRQKKRAEQEALTGECKELEKKNEALKEKADSLAKEI----QYLKDLIEEVRKARG 342
+ 46899999*******************************************999988887665....444555555555554 PP
+
+>> sp|P43273|TGA2_ARATH Transcription factor TGA2 OS=Arabidopsis thaliana GN=TGA2 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.4 2.4 0.0001 0.26 79 131 .. 40 91 .. 31 103 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 15.4 bits; conditional E-value: 0.0001
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ + + +q+ ++r+ +nr aa+ sr rk+ +++len +++l q q lqr q
+ sp|P43273|TGA2_ARATH 40 KGKMDQKTLRRLAQNREAARKSRLRKKAYVQQLENSRLKLTQLEQE-LQRARQ 91
+ 5567899999*****************************9998886.466655 PP
+
+>> sp|Q98UK5|MAFB_DANRE Transcription factor MafB OS=Danio rerio GN=mafb PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 1.7 0.1 1.5 3.9e+03 132 182 .. 36 86 .. 8 120 .. 0.64
+ 2 ? 15.7 1.5 8.5e-05 0.22 73 144 .. 259 331 .. 241 354 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 1.7 bits; conditional E-value: 1.5
+ sp|Q1XGE2|HAC1_ASPOR 132 leaennrlsqqlaqlaaevrgsrantpl..pgspatasptltptlfkqerdel 182
+ + a+++ +q+ +l + +gs ++tp+ p s +sp+++pt k + +el
+ sp|Q98UK5|MAFB_DANRE 36 MAAHDRANIRQCNRL--QPQGSVSSTPIstPCSSVPSSPSFSPTEQKNHLEEL 86
+ 333333333444444..567888888864477888889999999888777765 PP
+
+ == domain 2 score: 15.7 bits; conditional E-value: 8.5e-05
+ sp|Q1XGE2|HAC1_ASPOR 73 rkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqla 144
+ + r+ t+de + ++ +r l+nr+ aq++r ++ + + lenek ql q + l q +++l e++ ++
+ sp|Q98UK5|MAFB_DANRE 259 HLRGFTKDEVIRlKQKRRTLKNRGYAQSCRFKRVQQKHLLENEKTQLINQVEQLKQEINRLARERDAYKLKCE 331
+ 5577788886541556799**********99888888899********9999999999999888876655544 PP
+
+>> sp|P16951|ATF2_MOUSE Cyclic AMP-dependent transcription factor ATF-2 OS=Mus musculus GN=Atf2 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.9 1.0 0.00015 0.38 64 125 .. 316 376 .. 262 402 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 14.9 bits; conditional E-value: 0.00015
+ sp|Q1XGE2|HAC1_ASPOR 64 pvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfl 125
+ p + r+ra ed e+rr + + rnraaa +r+++++ ++ le + +l n l
+ sp|P16951|ATF2_MOUSE 316 PQTQNTSGRRRRAANEDPDEKRR-KFLERNRAAASRCRQKRKVWVQSLEKKAEDLSSLNGQL 376
+ 44444455678888888877776.6788******************9998776666655544 PP
+
+>> sp|P27925|CREB1_BOVIN Cyclic AMP-responsive element-binding protein 1 OS=Bos taurus GN=CREB1 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 0.6 0.1 3.2 8.1e+03 140 211 .. 20 94 .. 10 104 .. 0.62
+ 2 ? 14.5 0.1 0.0002 0.5 78 131 .. 262 315 .. 240 320 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 0.6 bits; conditional E-value: 3.2
+ sp|Q1XGE2|HAC1_ASPOR 140 sqqlaqlaaevrgsrantplpgspatas.ptltptlfkqerdelpleripfptpsl..sdysptlkpstlaessd 211
+ sqq+ a + a+ +p + at+s pt+t + i ps+ s t++ st+aes d
+ sp|P27925|CREB1_BOVIN 20 SQQMTVQAQPQIATLAQVSMPAAHATSSaPTVTLVQLPNGQTVQVHGVIQAAQPSViqSPQVQTVQISTIAESED 94
+ 566665555556788999999999997537777555444333322233444444441155566777788888776 PP
+
+ == domain 2 score: 14.5 bits; conditional E-value: 0.0002
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ +e ++r r+++nr aa+ +r++k+ ++ len+ le qn+ l++ l
+ sp|P27925|CREB1_BOVIN 262 PAEEAARKREVRLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKA 315
+ 445667778889************99999999****************998865 PP
+
+>> sp|P15336|ATF2_HUMAN Cyclic AMP-dependent transcription factor ATF-2 OS=Homo sapiens GN=ATF2 PE=1 SV=4
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.8 1.0 0.00016 0.41 63 125 .. 333 394 .. 281 420 .. 0.75
+
+ Alignments for each domain:
+ == domain 1 score: 14.8 bits; conditional E-value: 0.00016
+ sp|Q1XGE2|HAC1_ASPOR 63 lpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfl 125
+ p ++ r+ra ed e+rr + + rnraaa +r+++++ ++ le + +l n l
+ sp|P15336|ATF2_HUMAN 333 TPQTQSTSGRRRRAANEDPDEKRR-KFLERNRAAASRCRQKRKVWVQSLEKKAEDLSSLNGQL 394
+ 444555566789999999888777.6788******************9998776666655544 PP
+
+>> sp|O35451|ATF6B_MOUSE Cyclic AMP-dependent transcription factor ATF-6 beta OS=Mus musculus GN=Atf6b PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.6 1.8 0.00018 0.46 38 137 .. 283 383 .. 257 391 .. 0.63
+
+ Alignments for each domain:
+ == domain 1 score: 14.6 bits; conditional E-value: 0.00018
+ sp|Q1XGE2|HAC1_ASPOR 38 advktqevkpeekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklen.......ekiql 118
+ + ++ q p p rks p+p ++pp ak +r +r+++nr +a sr++k+ l+ le + ql
+ sp|O35451|ATF6B_MOUSE 283 GAIRVQPEGPAPAAPRPERKSIV-PAPMPGNSCPPEVDAK-----LLKRQQRMIKNRESACQSRRKKKEYLQGLEArlqavlaDNQQL 364
+ 45666666666667777777764.5788889999986555.....5667788999**9998898888766666654110111133344 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 119 eqqnqfllqrlsqleaenn 137
+ +++n l +rl l aen+
+ sp|O35451|ATF6B_MOUSE 365 RRENAALRRRLEALLAENS 383
+ 4555555555555555554 PP
+
+>> sp|Q2VZV0|IF2_MAGSA Translation initiation factor IF-2 OS=Magnetospirillum magneticum (strain AMB-1 / ATCC 700264) G
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 15.0 4.8 0.00014 0.36 13 118 .. 185 290 .. 176 325 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 15.0 bits; conditional E-value: 0.00014
+ sp|Q1XGE2|HAC1_ASPOR 13 dslpatpasevpvltvspadtslnsadvktqevkpeekkpakkrkswgqelpvpktnlpprkrak...tedekeqrriervlrnraaaq 98
+ + p pa+ pv +pa + +t+e e akkr + + pv +t p r+ +k t+ ++ r er r+ aa +
+ sp|Q2VZV0|IF2_MAGSA 185 PATPVAPAQPKPVAAAAPAGDATAVPRARTEEEEE-EEERAKKRAAAHKPAPVKRTE-PRRRTGKltiTDALTDDDRSERG-RSLAAVK 270
+ 567899999**********9999999999998765.556699999999888888875.44444453224555667777774.7889999 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 99 tsrerkrleleklenekiql 118
+ +rer rl+ + +ek+
+ sp|Q2VZV0|IF2_MAGSA 271 RARERERLKHMQKGSEKVIR 290
+ 99*****9876666777654 PP
+
+>> sp|Q6ZDF3|TRAB1_ORYSJ bZIP transcription factor TRAB1 OS=Oryza sativa subsp. japonica GN=TRAB1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.9 0.8 0.00015 0.37 64 139 .. 210 287 .. 174 312 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 14.9 bits; conditional E-value: 0.00015
+ sp|Q1XGE2|HAC1_ASPOR 64 pvpktnlpprkraktedek.eqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq.leaennrl 139
+ p p ++ +r+ ek +rr +r+++nr +a sr rk+ le e +l++qn+ l ++ + +e + n +
+ sp|Q6ZDF3|TRAB1_ORYSJ 210 PYPFEGVIRGRRSGGNVEKvVERRQRRMIKNRESAARSRARKQAYTMELEAEVQKLKEQNMELQKKQEEiMEMQKNFF 287
+ 55555554444544444442689999*****************99999***999999999987766544367776655 PP
+
+>> sp|Q6P788|ATF5_RAT Cyclic AMP-dependent transcription factor ATF-5 OS=Rattus norvegicus GN=Atf5 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.5 1.1 0.0002 0.5 73 141 .. 200 265 .. 171 280 .. 0.75
+
+ Alignments for each domain:
+ == domain 1 score: 14.5 bits; conditional E-value: 0.0002
+ sp|Q1XGE2|HAC1_ASPOR 73 rkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsq 141
+ a t+ +++q++ + +n++aa r+rkr e e le+e le +n+ l +r +e e + + +
+ sp|Q6P788|ATF5_RAT 200 PSPASTRGDRKQKKRD---QNKSAALRYRQRKRAEGEALEGECQGLEARNRELRERAESVEREIQYVKD 265
+ 3446666666665544...79***********************************9999988665544 PP
+
+>> sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive element-binding protein 5 OS=Homo sapiens GN=CREB5 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? -0.7 1.8 8.3 2.1e+04 141 171 .. 170 200 .. 144 276 .. 0.63
+ 2 ? 15.6 4.7 8.8e-05 0.22 51 143 .. 344 435 .. 333 472 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: -0.7 bits; conditional E-value: 8.3
+ sp|Q1XGE2|HAC1_ASPOR 141 qqlaqlaaevrgsrantplpgspatasptlt 171
+ +q + a + g+ n +pgs a p
+ sp|Q02930|CREB5_HUMAN 170 RQRQPMPASMPGTLPNPTMPGSSAVLMPMER 200
+ 4555677888899999999999888777543 PP
+
+ == domain 2 score: 15.6 bits; conditional E-value: 8.8e-05
+ sp|Q1XGE2|HAC1_ASPOR 51 kpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennr 138
+ pa ++ + q + p+ r+r ed +rr + + rnraaa +r+++++ + le + +l q n+ l +s+l+ e +
+ sp|Q02930|CREB5_HUMAN 344 SPATQQMQPTQTIQPPQPTGGRRRRVVDEDPD-ERRRKFLERNRAAATRCRQKRKVWVMSLEKKAEELTQTNMQLQNEVSMLKNEVAQ 430
+ 57777777778888787777667777666655.55667889**********************9999***999999999999888877 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 139 lsqql 143
+ l q l
+ sp|Q02930|CREB5_HUMAN 431 LKQLL 435
+ 77654 PP
+
+>> sp|Q66J36|NFIL3_XENLA Nuclear factor interleukin-3-regulated protein OS=Xenopus laevis GN=nfil3 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.5 0.1 0.0004 1 63 130 .. 44 113 .. 25 140 .. 0.79
+ 2 ? -0.5 0.0 7 1.8e+04 29 51 .. 196 218 .. 179 228 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 13.5 bits; conditional E-value: 0.0004
+ sp|Q1XGE2|HAC1_ASPOR 63 lpvp.ktnlpprkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrls 130
+ lpv k++ rkr dek++ e+ +n aa+ sre++rl len+ i l ++n l l
+ sp|Q66J36|NFIL3_XENLA 44 LPVKnKSSSCRRKREFIPDEKKDaMYWEKRRKNNEAAKRSREKRRLNDMVLENKLIALGEENASLKTELL 113
+ 66642555667899999998766155799999**************************999987766655 PP
+
+ == domain 2 score: -0.5 bits; conditional E-value: 7
+ sp|Q1XGE2|HAC1_ASPOR 29 spadtslnsadvktqevkpeekk 51
+ s +++++s d+k+q++k e+
+ sp|Q66J36|NFIL3_XENLA 196 STIQSNCRSTDIKSQRIKQEQME 218
+ 4556788999********99875 PP
+
+>> sp|Q8NHW3|MAFA_HUMAN Transcription factor MafA OS=Homo sapiens GN=MAFA PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.4 0.4 0.0002 0.52 85 167 .. 255 335 .. 230 345 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 14.4 bits; conditional E-value: 0.0002
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaev.rgsrantplpgspatas 167
+ ++ +r l+nr+ aq++r ++ + + le+ek+ql+ q + l +++l e++ ++ +la++ gs ++ g p s
+ sp|Q8NHW3|MAFA_HUMAN 255 KQKRRTLKNRGYAQSCRFKRVQQRHILESEKCQLQSQVEQLKLEVGRLAKERDLYKEKYEKLAGRGgPGSAGGA---GFPREPS 335
+ 445699***********988888999**********99999999999999999999998888875313443333...3333333 PP
+
+>> sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocricetus auratus GN=FOS PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.9 0.3 0.0003 0.76 79 234 .. 134 294 .. 118 303 .. 0.65
+
+ Alignments for each domain:
+ == domain 1 score: 13.9 bits; conditional E-value: 0.0003
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatas 167
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l la ++ + +p as
+ sp|O88479|FOS_MESAU 134 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHRPACK-IPDDLGFPEEMFVAS 220
+ 467788999885.899999999999999999************999999999999999998877765433332.223344555555555 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 168 ptlt...p...tlfkqerdelpleripfptpslsdysptlkpstlaessdvaqhpavs.vaglegdgsalplfd 234
+ lt p t +e lpl p p psl ae d +pa s +g e ++p +d
+ sp|O88479|FOS_MESAU 221 LDLTgglPeatTPESEEAFSLPLLNDPEPKPSLEPVKSISNVELKAEPFDDFLFPASSrPSGSETTARSVPDMD 294
+ 55552221111223445556777777777777776666666666666666666666552345555555555555 PP
+
+>> sp|P23922|HBP1A_WHEAT Transcription factor HBP-1a OS=Triticum aestivum PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.2 0.0 0.00024 0.62 64 137 .. 232 306 .. 220 328 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 14.2 bits; conditional E-value: 0.00024
+ sp|Q1XGE2|HAC1_ASPOR 64 pvpktnlpp.rkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaenn 137
+ p + +p r+ de+e ++ +r l nr +a+ sr rk+ e+e l ++ l+ +n l l++++ e
+ sp|P23922|HBP1A_WHEAT 232 PAMRGKVPSgSARGEQWDERELKKQKRKLSNRESARRSRLRKQAECEELGQRAEALKSENSSLRIELDRIKKEYE 306
+ 33444555413577788********************************99988889999888777777776655 PP
+
+>> sp|Q90595|MAFF_CHICK Transcription factor MafF OS=Gallus gallus GN=MAFF PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.6 0.1 0.00018 0.45 84 167 .. 52 134 .. 31 144 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 14.6 bits; conditional E-value: 0.00018
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatas 167
+ ++ +r l+nr+ a ++r ++ ++ e l+ +k++le + + l + + ++ e + l + l + r a+ p p atas
+ sp|Q90595|MAFF_CHICK 52 LKQRRRTLKNRGYAASCRVKRVCQKEELQKQKMELEWEVDKLARENAAMRLELDTLRGKYEALQGFARTVAAHGP-PAKVATAS 134
+ 3344699*******************************9999999999999999999999999998888888877.77778876 PP
+
+>> sp|P53450|FOS_TAKRU Proto-oncogene c-Fos OS=Takifugu rubripes GN=fos PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.9 0.4 0.0003 0.76 73 144 .. 112 182 .. 41 223 .. 0.74
+ 2 ? 1.1 0.0 2.3 5.8e+03 17 42 .. 316 340 .. 301 359 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 13.9 bits; conditional E-value: 0.0003
+ sp|Q1XGE2|HAC1_ASPOR 73 rkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqla 144
+ r t +e e++ri+r rn+ aa +r r+r + l+ e qle++ l ++ l e rl la
+ sp|P53450|FOS_TAKRU 112 RVEQTTPEEEEKKRIRRE-RNKQAAAKCRNRRRELTDTLQAETDQLEDEKSSLQNDIANLLKEKERLEFILA 182
+ 444557788889999886.788788888999998899**********9999999999999989888876665 PP
+
+ == domain 2 score: 1.1 bits; conditional E-value: 2.3
+ sp|Q1XGE2|HAC1_ASPOR 17 atpasevpvltvspadtslnsadvkt 42
+ p + pv+t++pa t+l s+ v t
+ sp|P53450|FOS_TAKRU 316 FEPLC-TPVVTCTPACTTLTSSFVFT 340
+ 34433.69************998877 PP
+
+>> sp|Q00969|ATF2_RAT Cyclic AMP-dependent transcription factor ATF-2 OS=Rattus norvegicus GN=Atf2 PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.3 1.9 0.00044 1.1 64 125 .. 316 376 .. 283 402 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 13.3 bits; conditional E-value: 0.00044
+ sp|Q1XGE2|HAC1_ASPOR 64 pvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfl 125
+ p + r+ra ed e+rr + + rnraaa +r+++++ ++ le + +l n l
+ sp|Q00969|ATF2_RAT 316 PQTQNTSGRRRRAANEDPDEKRR-KFLERNRAAASRCRQKRKVWVQSLEKKAEDLSSLNGQL 376
+ 44444445688888888887776.6788******************9998776666655544 PP
+
+>> sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scrofa GN=FOS PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.8 0.2 0.00031 0.78 79 146 .. 134 200 .. 77 302 .. 0.68
+
+ Alignments for each domain:
+ == domain 1 score: 13.8 bits; conditional E-value: 0.00031
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaql 146
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l la
+ sp|O97930|FOS_PIG 134 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAH 200
+ 467788999885.899899999999999999***********99999999999888888887766643 PP
+
+>> sp|P79145|CREM_CANFA cAMP-responsive element modulator OS=Canis familiaris GN=CREM PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.7 0.1 0.00033 0.84 80 131 .. 299 350 .. 227 354 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 13.7 bits; conditional E-value: 0.00033
+ sp|Q1XGE2|HAC1_ASPOR 80 dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ +e ++r r+++nr aa+ +r++k+ ++ len+ le qn+ l++ l
+ sp|P79145|CREM_CANFA 299 EEATRKRELRLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKA 350
+ 4556677789************99999999****************998865 PP
+
+>> sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcription factor ATF-6 beta OS=Homo sapiens GN=ATF6B PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.3 2.0 0.00045 1.1 37 138 .. 285 387 .. 252 393 .. 0.70
+
+ Alignments for each domain:
+ == domain 1 score: 13.3 bits; conditional E-value: 0.00045
+ sp|Q1XGE2|HAC1_ASPOR 37 sadvktqevkpeekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklen.......ekiq 117
+ ++ ++ q p p rks p+p ++pp ak +r +r+++nr +a sr++k+ l+ le + q
+ sp|Q99941|ATF6B_HUMAN 285 QGAIRVQPEGPAPSLPRPERKSIV-PAPMPGNSCPPEVDAK-----LLKRQQRMIKNRESACQSRRKKKEYLQGLEArlqavlaDNQQ 366
+ 455777777788888888899874.6799999999987665.....5567778999**998888888876666665411111113446 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 118 leqqnqfllqrlsqleaennr 138
+ l+++n l +rl l aen+
+ sp|Q99941|ATF6B_HUMAN 367 LRRENAALRRRLEALLAENSE 387
+ 666677777777777777765 PP
+
+>> sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus musculus GN=Fos PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.7 0.1 0.00033 0.85 79 146 .. 134 200 .. 81 297 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 13.7 bits; conditional E-value: 0.00033
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaql 146
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l la
+ sp|P01101|FOS_MOUSE 134 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAH 200
+ 467788999885.899889999999999999***********99999999999888888887766643 PP
+
+>> sp|P15337|CREB1_RAT Cyclic AMP-responsive element-binding protein 1 OS=Rattus norvegicus GN=Creb1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.4 0.1 0.00021 0.54 78 131 .. 278 331 .. 257 336 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 14.4 bits; conditional E-value: 0.00021
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ +e ++r r+++nr aa+ +r++k+ ++ len+ le qn+ l++ l
+ sp|P15337|CREB1_RAT 278 PAEEAARKREVRLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKA 331
+ 445667778889************99999999****************998865 PP
+
+>> sp|P16220|CREB1_HUMAN Cyclic AMP-responsive element-binding protein 1 OS=Homo sapiens GN=CREB1 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.4 0.1 0.00021 0.54 78 131 .. 278 331 .. 257 336 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 14.4 bits; conditional E-value: 0.00021
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ +e ++r r+++nr aa+ +r++k+ ++ len+ le qn+ l++ l
+ sp|P16220|CREB1_HUMAN 278 PAEEAARKREVRLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKA 331
+ 445667778889************99999999****************998865 PP
+
+>> sp|Q01147|CREB1_MOUSE Cyclic AMP-responsive element-binding protein 1 OS=Mus musculus GN=Creb1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.4 0.1 0.00021 0.54 78 131 .. 278 331 .. 257 336 .. 0.86
+
+ Alignments for each domain:
+ == domain 1 score: 14.4 bits; conditional E-value: 0.00021
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ +e ++r r+++nr aa+ +r++k+ ++ len+ le qn+ l++ l
+ sp|Q01147|CREB1_MOUSE 278 PAEEAARKREVRLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKA 331
+ 445667778889************99999999****************998865 PP
+
+>> sp|O93602|ATF2_CHICK Cyclic AMP-dependent transcription factor ATF-2 OS=Gallus gallus GN=ATF2 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.3 2.4 0.00044 1.1 66 129 .. 319 380 .. 260 403 .. 0.68
+
+ Alignments for each domain:
+ == domain 1 score: 13.3 bits; conditional E-value: 0.00044
+ sp|Q1XGE2|HAC1_ASPOR 66 pktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrl 129
+ p t+ r+ra ed e+rr + + rnraaa +r+++++ ++ le + +l n l +
+ sp|O93602|ATF2_CHICK 319 PNTG-GRRRRAANEDPDEKRR-KFLERNRAAASRCRQKRKVWVQSLEKKAEDLSSLNGQLQNEV 380
+ 3332.3477888888877776.6788******************99987766666665554444 PP
+
+>> sp|Q90889|MAFG_CHICK Transcription factor MafG OS=Gallus gallus GN=MAFG PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.9 0.5 0.0003 0.75 84 165 .. 52 134 .. 30 146 .. 0.70
+
+ Alignments for each domain:
+ == domain 1 score: 13.9 bits; conditional E-value: 0.0003
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaql..aaevrgsrantplpgspat 165
+ ++ +r l+nr+ a ++r ++ + e le +k +l+q+ + l + ++ e + l + l a+ tp+ g p t
+ sp|Q90889|MAFG_CHICK 52 LKQRRRTLKNRGYAASCRVKRVTQKEELEKQKAELQQEVEKLASENASMKMELDALRSKYEALqnFARTVARSPVTPVRG-PLT 134
+ 3444699************9999***************999999888888877777654433300333333334566666.333 PP
+
+>> sp|P79702|FOS_CYPCA Proto-oncogene c-Fos OS=Cyprinus carpio GN=fos PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.5 0.1 0.00039 1 66 145 .. 97 175 .. 39 207 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 13.5 bits; conditional E-value: 0.00039
+ sp|Q1XGE2|HAC1_ASPOR 66 pktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaq 145
+ p +n r + +e e++r++r rn+ aa +r r+r + l+ e +le++ l ++ l e rl la
+ sp|P79702|FOS_CYPCA 97 PNSNKRARAEQLSPEEEEKKRVRRE-RNKMAAAKCRNRRRELTDTLQAETDELEDEKSALQNDIANLLKEKERLEFILAA 175
+ 4556555555556678888888775.8999999999999998999*********99999999999999999999877764 PP
+
+>> sp|Q8X229|FCR3_CANAL Fluconazole resistance protein 3 OS=Candida albicans GN=FCR3 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.5 2.5 0.0004 1 81 140 .. 208 267 .. 197 289 .. 0.87
+
+ Alignments for each domain:
+ == domain 1 score: 13.5 bits; conditional E-value: 0.0004
+ sp|Q1XGE2|HAC1_ASPOR 81 ekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrls 140
+ e+ +++r +nraa + rerk +l+ le + + e+++q ll+ l q++ +n ++
+ sp|Q8X229|FCR3_CANAL 208 TEEELQMKRKAQNRAAQRAFRERKESKLKELEAKLLASEEERQKLLDELEQIKKQNISIA 267
+ 4567788999******************************************99997665 PP
+
+>> sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus norvegicus GN=Fos PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.1 0.2 0.00052 1.3 79 145 .. 134 199 .. 116 297 .. 0.72
+
+ Alignments for each domain:
+ == domain 1 score: 13.1 bits; conditional E-value: 0.00052
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaq 145
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l la
+ sp|P12841|FOS_RAT 134 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAA 199
+ 467788999885.899889999999999999***********9999998999888888888766654 PP
+
+>> sp|P49716|CEBPD_HUMAN CCAAT/enhancer-binding protein delta OS=Homo sapiens GN=CEBPD PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.1 3.4 0.00052 1.3 82 159 .. 192 253 .. 129 266 .. 0.53
+
+ Alignments for each domain:
+ == domain 1 score: 13.1 bits; conditional E-value: 0.00052
+ sp|Q1XGE2|HAC1_ASPOR 82 keqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantpl 159
+ e + rer + ++ + + +++nq + q+l +l aen +l q++ ql ++ g r +
+ sp|P49716|CEBPD_HUMAN 192 PE-------------YRQRRERNNIAVR---KSRDKAKRRNQEMQQKLVELSAENEKLHQRVEQLTRDLAGLRQFFKQ 253
+ 11.............1222333333333...33445567777788888888888888888888888888887764432 PP
+
+>> sp|Q554P0|BZPJ_DICDI Probable basic-leucine zipper transcription factor J OS=Dictyostelium discoideum GN=bzpJ PE=3 S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 14.0 0.2 0.00028 0.72 79 148 .. 545 614 .. 535 644 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 14.0 bits; conditional E-value: 0.00028
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa 148
+ +eke ++ +r+++nr a sr r+++ +e +e + + q+ + +l+ ++ en l +ql l
+ sp|Q554P0|BZPJ_DICDI 545 AEEKELKKQRRLVKNREYASQSRSRRKIYVENIETKLQKTNQDCASIKSQLNSVKEENKALKKQLYSLTN 614
+ 46899999999**********************9866556666677888999************988865 PP
+
+>> sp|Q55E93|BZPE_DICDI Probable basic-leucine zipper transcription factor E OS=Dictyostelium discoideum GN=bzpE PE=3 S
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.9 0.1 0.00029 0.74 85 146 .. 248 309 .. 243 324 .. 0.88
+
+ Alignments for each domain:
+ == domain 1 score: 13.9 bits; conditional E-value: 0.00029
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaql 146
+ r+ +r+l+nr aaq r+r++ + le++ le n l ++s+l en+ + +++ l
+ sp|Q55E93|BZPE_DICDI 248 RKNRRLLKNREAAQLFRQRQKEYINSLESKASSLEASNTTALSKVSHLTEENQLMKDKVRYL 309
+ 77789*******************************************99998887776655 PP
+
+>> sp|P51984|CREB_CHLVR Cyclic AMP-responsive element-binding protein OS=Chlorohydra viridissima GN=CREB PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.4 0.1 0.00043 1.1 76 131 .. 184 239 .. 149 243 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 13.4 bits; conditional E-value: 0.00043
+ sp|Q1XGE2|HAC1_ASPOR 76 aktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ + +e ++r r+ +nr aa+ +r++k+ ++ len+ le qn+ l++ l
+ sp|P51984|CREB_CHLVR 184 HQLAEEATRKRELRLYKNREAARECRRKKKEYVKCLENRVAVLENQNKALIEELKS 239
+ 444566777788899***********99999999****************998865 PP
+
+>> sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein OS=FBJ murine osteosarcoma virus GN=V-FOS PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.4 0.1 0.0004 1 79 146 .. 134 200 .. 84 298 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 13.4 bits; conditional E-value: 0.0004
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaql 146
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l la
+ sp|P01102|FOS_MSVFB 134 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDKKSALQTEIANLLKEKEKLEFILAAH 200
+ 467788999885.899999999999999999***********99999999999988888887766643 PP
+
+>> sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos taurus GN=FOS PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.1 0.0 0.00052 1.3 79 144 .. 134 198 .. 79 298 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 13.1 bits; conditional E-value: 0.00052
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqla 144
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l la
+ sp|O77628|FOS_BOVIN 134 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILA 198
+ 467788999885.899888899999999999**********9999888888888777777766555 PP
+
+>> sp|Q8WYK2|JDP2_HUMAN Jun dimerization protein 2 OS=Homo sapiens GN=JDP2 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.6 2.7 0.00035 0.9 78 145 .. 67 134 .. 30 157 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 13.6 bits; conditional E-value: 0.00035
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaq 145
+ de e+rr +r +n+ aa +r +k+ + e l++e +le +n l ++ +l+ e+++l +l +
+ sp|Q8WYK2|JDP2_HUMAN 67 ELDEEEERRKRRREKNKVAAARCRNKKKERTEFLQRESERLELMNAELKTQIEELKQERQQLILMLNR 134
+ 34888999999999**********************************99999999999988776654 PP
+
+>> sp|Q60925|DBP_MOUSE D site-binding protein OS=Mus musculus GN=Dbp PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.3 1.0 0.00092 2.3 38 135 .. 210 307 .. 184 323 .. 0.69
+
+ Alignments for each domain:
+ == domain 1 score: 12.3 bits; conditional E-value: 0.00092
+ sp|Q1XGE2|HAC1_ASPOR 38 advktqevkpeek.kpakkrkswgqel.pvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqf 124
+ ad+ + +e p + r s +el p p rk e++k+++ r +n aa+ sr+ +rl+ ++ + le++n
+ sp|Q60925|DBP_MOUSE 210 ADLALSSIPGHETfDPRRHRFS-EEELkPQP-IMKKARKVQVPEEQKDEKYWSRRYKNNEAAKRSRDARRLKENQISVRAAFLEKENAL 296
+ 4444444444443034444444.34441333.334567777789999*******************************99*******99 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 125 llqrlsqleae 135
+ l q + ++ e
+ sp|Q60925|DBP_MOUSE 297 LRQEVVAVRQE 307
+ 99987665555 PP
+
+>> sp|P14232|TGA1A_TOBAC TGACG-sequence-specific DNA-binding protein TGA-1A OS=Nicotiana tabacum GN=TGA1A PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.9 0.4 0.00058 1.5 85 125 .. 74 114 .. 59 133 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 12.9 bits; conditional E-value: 0.00058
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfl 125
+ + ++r+ +nr aa+ sr rk+ +++len k++l q q l
+ sp|P14232|TGA1A_TOBAC 74 KVLRRLAQNREAARKSRLRKKAYVQQLENSKLKLIQLEQEL 114
+ 45678899***********************9988877755 PP
+
+>> sp|P16443|DBP_RAT D site-binding protein OS=Rattus norvegicus GN=Dbp PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.3 1.0 0.00092 2.3 38 135 .. 210 307 .. 184 323 .. 0.69
+
+ Alignments for each domain:
+ == domain 1 score: 12.3 bits; conditional E-value: 0.00092
+ sp|Q1XGE2|HAC1_ASPOR 38 advktqevkpeek.kpakkrkswgqel.pvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqf 124
+ ad+ + +e p + r s +el p p rk e++k+++ r +n aa+ sr+ +rl+ ++ + le++n
+ sp|P16443|DBP_RAT 210 ADLALSSIPGHETfDPRRHRFS-EEELkPQP-IMKKARKVQVPEEQKDEKYWSRRYKNNEAAKRSRDARRLKENQISVRAAFLEKENAL 296
+ 4444444444443034444444.34441333.334567777789999*******************************99*******99 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 125 llqrlsqleae 135
+ l q + ++ e
+ sp|P16443|DBP_RAT 297 LRQEVVAVRQE 307
+ 99987665555 PP
+
+>> sp|Q68EL6|NFIL3_DANRE Nuclear factor interleukin-3-regulated protein OS=Danio rerio GN=nfil3 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.9 0.0 0.00059 1.5 71 131 .. 50 111 .. 39 184 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 12.9 bits; conditional E-value: 0.00059
+ sp|Q1XGE2|HAC1_ASPOR 71 pprkraktedekeqr.riervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ rkr dek++ er +n aa+ sre++rl len+ + l ++n l l
+ sp|Q68EL6|NFIL3_DANRE 50 CRRKREFIPDEKKDNlYWERRRKNNEAAKRSREKRRLNDMVLENKLMALGEENASLKAELLS 111
+ 5688888888876551679**************************99999999877666655 PP
+
+>> sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo sapiens GN=FOS PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.7 0.2 0.00069 1.7 79 144 .. 134 198 .. 120 294 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 12.7 bits; conditional E-value: 0.00069
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqla 144
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l la
+ sp|P01100|FOS_HUMAN 134 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILA 198
+ 467788999885.899888899999999999**********9999988888888887777766555 PP
+
+>> sp|Q9C5Q2|AI5L3_ARATH ABSCISIC ACID-INSENSITIVE 5-like protein 3 OS=Arabidopsis thaliana GN=DPBF4 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.9 1.9 0.00059 1.5 70 133 .. 175 239 .. 165 242 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 12.9 bits; conditional E-value: 0.00059
+ sp|Q1XGE2|HAC1_ASPOR 70 lpprkrakte..dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqle 133
+ p rkr e ++ +rr +r+++nr +a sr rk+ + le + +le++n+ l+rl ++e
+ sp|Q9C5Q2|AI5L3_ARATH 175 APGRKRVAGEivEKTVERRQKRMIKNRESAARSRARKQAYTHELEIKVSRLEEENEK-LRRLKEVE 239
+ 58889877662244568999**************************999*****996.57777665 PP
+
+>> sp|Q5FW38|NFIL3_XENTR Nuclear factor interleukin-3-regulated protein OS=Xenopus tropicalis GN=nfil3 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.4 0.2 0.00083 2.1 71 132 .. 60 122 .. 43 150 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 12.4 bits; conditional E-value: 0.00083
+ sp|Q1XGE2|HAC1_ASPOR 71 pprkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsql 132
+ rkr dek++ e+ +n aa+ sre++rl len+ i l ++n l l l
+ sp|Q5FW38|NFIL3_XENTR 60 CRRKREFIPDEKKDaMYWEKRRKNNEAAKRSREKRRLNDMVLENKLIALGEENASLKTELLSL 122
+ 46788888888766156799999**************************99998877666555 PP
+
+>> sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis catus GN=FOS PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.5 0.1 0.00076 1.9 79 144 .. 135 199 .. 124 298 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 12.5 bits; conditional E-value: 0.00076
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqla 144
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l la
+ sp|Q8HZP6|FOS_FELCA 135 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILA 199
+ 467788999885.899888899999999999**********9999888888888777777765554 PP
+
+>> sp|Q9SJN0|ABI5_ARATH Protein ABSCISIC ACID-INSENSITIVE 5 OS=Arabidopsis thaliana GN=ABI5 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.6 2.2 0.00076 1.9 70 141 .. 340 411 .. 327 435 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 12.6 bits; conditional E-value: 0.00076
+ sp|Q1XGE2|HAC1_ASPOR 70 lpprkrakte..dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsq 141
+ l rkr ++ +rr +r+++nr +a sr rk+ le e ql+++n l + l++le ++ +q
+ sp|Q9SJN0|ABI5_ARATH 340 LRGRKRVVDGpvEKVVERRQRRMIKNRESAARSRARKQAYTVELEAELNQLKEENAQLKHALAELERKRK--QQ 411
+ 555666543210233579999*************************************999998876543..33 PP
+
+>> sp|P42777|GBF4_ARATH G-box-binding factor 4 OS=Arabidopsis thaliana GN=GBF4 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.6 2.5 0.00074 1.9 77 134 .. 181 238 .. 170 259 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 12.6 bits; conditional E-value: 0.00074
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqlea 134
+ d+ +r +r+++nr +a srerk+ + le +le++n+ ll+ + +
+ sp|P42777|GBF4_ARATH 181 EAMDKAAAQRQKRMIKNRESAARSRERKQAYQVELETLAAKLEEENEQLLKEIEESTK 238
+ 45677788899************************************99998876554 PP
+
+>> sp|P15407|FOSL1_HUMAN Fos-related antigen 1 OS=Homo sapiens GN=FOSL1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.6 4.3 0.00072 1.8 64 202 .. 88 234 .. 64 263 .. 0.61
+
+ Alignments for each domain:
+ == domain 1 score: 12.6 bits; conditional E-value: 0.00072
+ sp|Q1XGE2|HAC1_ASPOR 64 pvpktnlpprkraktedekeqrriervlrnraaaqtsr.erkrl......eleklenekiqleqqnqfllqrlsqle..aennrlsqq 142
+ p p + p + e e e+rr++r rn+ aa +r +rk l e +kle+ek l+++ + l ++ +le e +r +
+ sp|P15407|FOSL1_HUMAN 88 PPPGVRRRPCEQISPE-EEERRRVRRE-RNKLAAAKCRnRRKELtdflqaETDKLEDEKSGLQREIEELQKQKERLElvLEAHRPICK 173
+ 5566666666665544.5577888776.666555555505554432222256778888777777666665555554422466777777 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 143 laqlaaev.rgsrantplpgspatasptltptlfkq.erdelpleripfptpslsdysptlk 202
+ + + a e gs ++t p +p+ p+++ + e + l + tpsl+ ++p+l
+ sp|P15407|FOSL1_HUMAN 174 IPEGAKEGdTGSTSGTSSPPAPCRPVPCISLSPGPVlEPEALHTP-TLMTTPSLTPFTPSLV 234
+ 777777642689999999999988888765433322033333333.3467899999999874 PP
+
+>> sp|O15525|MAFG_HUMAN Transcription factor MafG OS=Homo sapiens GN=MAFG PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.9 0.4 0.00059 1.5 84 152 .. 52 120 .. 30 144 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 12.9 bits; conditional E-value: 0.00059
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrg 152
+ ++ +r l+nr+ a ++r ++ + e le +k +l+q+ + l + ++ e + l + l r
+ sp|O15525|MAFG_HUMAN 52 LKQRRRTLKNRGYAASCRVKRVTQKEELEKQKAELQQEVEKLASENASMKLELDALRSKYEALQTFART 120
+ 3444699************9999***************9999999999999888887766655554443 PP
+
+>> sp|P40535|ACA2_YEAST ATF/CREB activator 2 OS=Saccharomyces cerevisiae GN=CST6 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.2 0.0 0.00098 2.5 85 133 .. 427 475 .. 363 484 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 12.2 bits; conditional E-value: 0.00098
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqle 133
+ +r + + rnr aa +r+rk++ + +l+ e +++++n++ll++l+ e
+ sp|P40535|ACA2_YEAST 427 KRARLLERNRIAASKCRQRKKVAQLQLQKEFNEIKDENRILLKKLNYYE 475
+ 34444558***********************************998765 PP
+
+>> sp|A7YY73|MAFF_BOVIN Transcription factor MafF OS=Bos taurus GN=MAFF PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.7 0.2 0.00069 1.7 84 174 .. 52 139 .. 32 170 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 12.7 bits; conditional E-value: 0.00069
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatasptltp 172
+ ++ +r l+nr+ a ++r ++ ++ e l+ +k +le++ + l + + ++ e + l ++ l + r a g a +p
+ sp|A7YY73|MAFF_BOVIN 52 LKQRRRTLKNRGYAASCRVKRVCQKEELQKQKSELEREVDKLARENAAMRLELDALRGKCEALQGFARSVAA---ARGPAALVAPASVI 137
+ 3444699*******************************9999999999999988887776666555444332...33444445555555 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 173 tl 174
+ t+
+ sp|A7YY73|MAFF_BOVIN 138 TI 139
+ 55 PP
+
+>> sp|Q8PY58|PSMR_METMA Proteasome-activating nucleotidase OS=Methanosarcina mazei GN=pan PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 6.0 0.1 0.075 1.9e+02 110 154 .. 26 70 .. 22 95 .. 0.82
+ 2 ? 5.0 0.0 0.15 3.8e+02 115 194 .. 255 332 .. 236 374 .. 0.72
+
+ Alignments for each domain:
+ == domain 1 score: 6.0 bits; conditional E-value: 0.075
+ sp|Q1XGE2|HAC1_ASPOR 110 klenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsr 154
+ ++++ qle +n fl +++sq+e+e + l q + e+r +
+ sp|Q8PY58|PSMR_METMA 26 SVQDRVRQLESRNSFLEEQCSQIESEKRYLENQKIKYEREIRKLQ 70
+ 566677799*********************999999999998655 PP
+
+ == domain 2 score: 5.0 bits; conditional E-value: 0.15
+ sp|Q1XGE2|HAC1_ASPOR 115 kiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatasp.tltptlfkqerdelpleripfptpsl 194
+ i +++ + + +rl++ + ++ +++ l ql ae+ g + + at p l p + + r + l ++p+p +
+ sp|Q8PY58|PSMR_METMA 255 IIFIDELDSIAARRLNETTGADREVQRTLMQLLAEMDGFDKRKNIRIIAATNRPdVLDPAILRPGRFDR-LVHVPMPG--I 332
+ 4567778888999*******9*****************8777777778888888358899999998764.55666664..3 PP
+
+>> sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodopus roborovskii GN=FOS PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.8 0.4 0.0012 3.2 79 142 .. 134 196 .. 118 251 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.8 bits; conditional E-value: 0.0012
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqq 142
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l
+ sp|Q56TN0|FOS_PHORO 134 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFI 196
+ 467788999885.899888899999999899**********99988888888777777666555 PP
+
+>> sp|P23050|FOS_AVINK p55-v-Fos-transforming protein OS=Avian retrovirus NK24 GN=V-FOS PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 0.8 0.0011 2.8 79 140 .. 88 148 .. 41 168 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.0011
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrls 140
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l
+ sp|P23050|FOS_AVINK 88 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEEEKSALQAEIANLLKEKEKLE 148
+ 467788999885.899889999999999999**********999888888877777766665 PP
+
+>> sp|Q9LES3|AI5L2_ARATH ABSCISIC ACID-INSENSITIVE 5-like protein 2 OS=Arabidopsis thaliana GN=DPBF3 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 1.6 0.0011 2.8 68 126 .. 207 268 .. 199 276 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.0011
+ sp|Q1XGE2|HAC1_ASPOR 68 tnlpprkrakted...ekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfll 126
+ t+ p rkr + + + +rr +r+++nr +a sr rk+ + le + +le++n+ l
+ sp|Q9LES3|AI5L2_ARATH 207 TQTPGRKRVASGEvveKTVERRQKRMIKNRESAARSRARKQAYTHELEIKVSRLEEENERLR 268
+ 77899999766542214458999**************************9999**9998765 PP
+
+>> sp|Q84JK2|FD_ARATH Protein FD OS=Arabidopsis thaliana GN=FD PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.7 1.8 0.0014 3.5 66 133 .. 197 264 .. 188 281 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 11.7 bits; conditional E-value: 0.0014
+ sp|Q1XGE2|HAC1_ASPOR 66 pktnlpprkraktede.keqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqle 133
+ p +++ +kr++ +e rr +r+++nr +a sr rk+ le e +l+ +n l ++ +ql+
+ sp|Q84JK2|FD_ARATH 197 PSSSFG-KKRGQDSNEgSGNRRHKRMIKNRESAARSRARKQAYTNELELEVAHLQAENARLKRQQDQLK 264
+ 555554.455554444167899**************************999999999998877777664 PP
+
+>> sp|A5PJV0|MAFG_BOVIN Transcription factor MafG OS=Bos taurus GN=MAFG PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.3 0.5 0.0009 2.3 84 151 .. 52 119 .. 30 144 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 12.3 bits; conditional E-value: 0.0009
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevr 151
+ ++ +r l+nr+ a ++r ++ + e le +k +l+q+ + l + ++ e + l + l r
+ sp|A5PJV0|MAFG_BOVIN 52 LKQRRRTLKNRGYAASCRVKRVTQKEELEKQKAELQQEVEKLASENASMKLELDALRSKYEALQNFAR 119
+ 3444699************9999***************999999988888888877665544443333 PP
+
+>> sp|O54790|MAFG_MOUSE Transcription factor MafG OS=Mus musculus GN=Mafg PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.3 0.5 0.0009 2.3 84 151 .. 52 119 .. 30 144 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 12.3 bits; conditional E-value: 0.0009
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevr 151
+ ++ +r l+nr+ a ++r ++ + e le +k +l+q+ + l + ++ e + l + l r
+ sp|O54790|MAFG_MOUSE 52 LKQRRRTLKNRGYAASCRVKRVTQKEELEKQKAELQQEVEKLASENASMKLELDALRSKYEALQNFAR 119
+ 3444699************9999***************999999988888888877665544443333 PP
+
+>> sp|Q39234|TGA3_ARATH Transcription factor TGA3 OS=Arabidopsis thaliana GN=TGA3 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.7 1.9 0.0014 3.4 77 131 .. 90 144 .. 82 161 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 11.7 bits; conditional E-value: 0.0014
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ + ed+ ++ +r+ +nr aa+ sr rk+ ++++le +++l q q l++ +q
+ sp|Q39234|TGA3_ARATH 90 QDEDRINDKMKRRLAQNREAARKSRLRKKAHVQQLEESRLKLSQLEQELVRARQQ 144
+ 456666677778899*****************************99988876555 PP
+
+>> sp|P07049|CPPB_NEIGO Cryptic plasmid protein B OS=Neisseria gonorrhoeae GN=cppB PE=4 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.8 1.0 0.0013 3.3 108 151 .. 147 194 .. 122 204 .. 0.71
+
+ Alignments for each domain:
+ == domain 1 score: 11.8 bits; conditional E-value: 0.0013
+ sp|Q1XGE2|HAC1_ASPOR 108 leklenekiqleqqnq....fllqrlsqleaennrlsqqlaqlaaevr 151
+ l le+ +eq+ + l +rl++le en l+qqla laae+
+ sp|P07049|CPPB_NEIGO 147 LAELESNHAAIEQRMMkaltHLGERLAELEQENTSLAQQLASLAAELE 194
+ 5566666666666554111156689********************984 PP
+
+>> sp|P11939|FOS_CHICK Proto-oncogene c-Fos OS=Gallus gallus GN=FOS PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.6 0.9 0.0015 3.8 79 140 .. 133 193 .. 88 212 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 11.6 bits; conditional E-value: 0.0015
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrls 140
+ +e e+rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l
+ sp|P11939|FOS_CHICK 133 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEEEKSALQAEIANLLKEKEKLE 193
+ 467788999885.899889999999999999**********999888888877777666665 PP
+
+>> sp|P29176|FOSX_MSVFR Transforming protein v-Fos/v-Fox OS=FBR murine osteosarcoma virus GN=FOS-FOX PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 0.0 0.0011 2.9 80 144 .. 111 174 .. 54 239 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.0011
+ sp|Q1XGE2|HAC1_ASPOR 80 dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqla 144
+ +e +rri+r rn+ aa +r r+r + l+ e qle++ l ++ l e +l la
+ sp|P29176|FOSX_MSVFR 111 EEEVKRRIRR-ERNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILA 174
+ 4555788877.5899999999999999999**********9999988888888877777766555 PP
+
+>> sp|O54791|MAFF_MOUSE Transcription factor MafF OS=Mus musculus GN=Maff PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.0 0.6 0.0011 2.9 84 168 .. 52 133 .. 32 154 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 12.0 bits; conditional E-value: 0.0011
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatasp 168
+ ++ +r l+nr+ a ++r ++ ++ e l+ +k +le++ + l + + ++ e + l ++ l + r a g a +p
+ sp|O54791|MAFF_MOUSE 52 LKQRRRTLKNRGYAASCRVKRVCQKEELQKQKSELEREVDKLARENAAMRLELDALRGKCEALQGFARSVAA---ARGPAALVAP 133
+ 3444699*******************************9999999999999888887666655554443322...2233333444 PP
+
+>> sp|Q8TI88|PSMR_METAC Proteasome-activating nucleotidase OS=Methanosarcina acetivorans GN=pan PE=3 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 6.0 0.1 0.075 1.9e+02 110 154 .. 26 70 .. 22 95 .. 0.82
+ 2 ? 4.1 0.0 0.28 7.1e+02 115 190 .. 255 330 .. 236 363 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 6.0 bits; conditional E-value: 0.075
+ sp|Q1XGE2|HAC1_ASPOR 110 klenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsr 154
+ ++++ qle +n fl +++sq+e+e + l q + e+r +
+ sp|Q8TI88|PSMR_METAC 26 SVQDRVRQLESRNSFLEEQCSQIESEKRYLENQKIKYEREIRKLQ 70
+ 566677799*********************999999999998655 PP
+
+ == domain 2 score: 4.1 bits; conditional E-value: 0.28
+ sp|Q1XGE2|HAC1_ASPOR 115 kiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatasp.tltptlfkqerdelpleripfp 190
+ i +++ + + +rl++ + ++ +++ l ql ae+ g + + at p l p + + r + l ++p+p
+ sp|Q8TI88|PSMR_METAC 255 IIFIDELDSIAARRLNETTGADREVQRTLMQLLAEMDGFDKRKNIRIIAATNRPdVLDPAILRPGRFDR-LVHVPMP 330
+ 4567778888999******999****************8777777777888887357899999988764.5566665 PP
+
+>> sp|O08750|NFIL3_MOUSE Nuclear factor interleukin-3-regulated protein OS=Mus musculus GN=Nfil3 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.1 0.3 0.0021 5.5 69 129 .. 58 119 .. 51 142 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 11.1 bits; conditional E-value: 0.0021
+ sp|Q1XGE2|HAC1_ASPOR 69 nlpprkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrl 129
+ + rkr dek++ e+ +n aa+ sre++rl len+ i l ++n l l
+ sp|O08750|NFIL3_MOUSE 58 SACRRKREFIPDEKKDaMYWEKRRKNNEAAKRSREKRRLNDLVLENKLIALGEENATLKAEL 119
+ 5567899999998766155789999**************************99998876655 PP
+
+>> sp|Q76MX4|MAFG_RAT Transcription factor MafG OS=Rattus norvegicus GN=Mafg PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.7 0.5 0.0013 3.4 84 149 .. 79 144 .. 57 170 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 11.7 bits; conditional E-value: 0.0013
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaae 149
+ ++ +r l+nr+ a ++r ++ + e le +k +l+q+ + l + ++ e + l + l
+ sp|Q76MX4|MAFG_RAT 79 LKQRRRTLKNRGYAASCRVKRVTQKEELEKQKAELQQEVEKLASENASMKLELDALRSKYEALQNF 144
+ 3444699************9999***************9999998888888888776655444433 PP
+
+>> sp|P20482|CNC_DROME Segmentation protein cap'n'collar OS=Drosophila melanogaster GN=cnc PE=1 SV=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.9 0.8 0.0025 6.4 85 152 .. 1197 1264 .. 1154 1284 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 10.9 bits; conditional E-value: 0.0025
+ sp|Q1XGE2|HAC1_ASPOR 85 rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrg 152
+ r i+r +n+ aaq +r+rk ++ le+e + ++ l q ++le+e+ r+s ++a+l +v
+ sp|P20482|CNC_DROME 1197 RDIRRRGKNKVAAQNCRKRKLDQILTLEDEVNAVVKRKTQLNQDRDHLESERKRISNKFAMLHRHVFQ 1264
+ 67889999**********************988888888899999****************9988754 PP
+
+>> sp|Q90Z72|NFIL3_CHICK Nuclear factor interleukin-3-regulated protein OS=Gallus gallus GN=NFIL3 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.1 0.2 0.0021 5.3 70 130 .. 59 120 .. 54 145 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 11.1 bits; conditional E-value: 0.0021
+ sp|Q1XGE2|HAC1_ASPOR 70 lpprkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrls 130
+ rkr dek++ e+ +n aa+ sre++rl len+ i l ++n l l
+ sp|Q90Z72|NFIL3_CHICK 59 ACRRKREFIPDEKKDaMYWEKRRKNNEAAKRSREKRRLNDLVLENKLIALGEENATLKAELL 120
+ 557899999898766155789999**************************999988766655 PP
+
+>> sp|Q9VWW0|CREBB_DROME Cyclic AMP response element-binding protein B OS=Drosophila melanogaster GN=CrebB-17A PE=1 SV=
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 1.7 0.0022 5.6 78 131 .. 296 348 .. 289 355 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.0022
+ sp|Q1XGE2|HAC1_ASPOR 78 tedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ ed+ ++r i r+ +nr aa+ +r++k+ ++ len+ le qn+ l++ l
+ sp|Q9VWW0|CREBB_DROME 296 AEDQTRKREI-RLQKNREAARECRRKKKEYIKCLENRVAVLENQNKALIEELKS 348
+ 4666666555.899***********99999******************998865 PP
+
+>> sp|Q8BKJ9|SIRT7_MOUSE NAD-dependent deacetylase sirtuin-7 OS=Mus musculus GN=Sirt7 PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.2 1.4 0.0019 4.9 74 164 .. 19 111 .. 12 174 .. 0.75
+
+ Alignments for each domain:
+ == domain 1 score: 11.2 bits; conditional E-value: 0.0019
+ sp|Q1XGE2|HAC1_ASPOR 74 kraktedekeq.rriervlrnraaaqtsrerkrl..eleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantp 158
+ +r + e+++e+ r++ r+lr aa + s e rl e e l e ++++ l +r ++ + l +++ +la+ vr +r
+ sp|Q8BKJ9|SIRT7_MOUSE 19 RRLREEQQRERlRQVSRILRKAAAER-SAEEGRLlaESEDLVTELQGRSRRREGLKRRQEEVCDDPEELRRKVRELAGAVRSARHLVV 105
+ 4556666666547899***9766555.55555542477889988777888888899999999899999**************998777 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 159 lpgspa 164
+ g+
+ sp|Q8BKJ9|SIRT7_MOUSE 106 YTGAGI 111
+ 766654 PP
+
+>> sp|Q56TT7|FOS_PHOCM Proto-oncogene c-Fos OS=Phodopus campbelli GN=FOS PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.9 0.1 0.0025 6.3 79 144 .. 134 198 .. 118 301 .. 0.71
+
+ Alignments for each domain:
+ == domain 1 score: 10.9 bits; conditional E-value: 0.0025
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqla 144
+ +e e+rri+r rn+ aa +r r+r + l+ e +le++ l ++ l e +l la
+ sp|Q56TT7|FOS_PHOCM 134 PEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDHLEDEKSALQTEIANLLKEKEKLEFILA 198
+ 467788999885.88888889999999889999999999999998888888888888777766655 PP
+
+>> sp|Q6IMZ0|NFIL3_RAT Nuclear factor interleukin-3-regulated protein OS=Rattus norvegicus GN=Nfil3 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.3 0.0023 5.8 69 129 .. 58 119 .. 51 140 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.0023
+ sp|Q1XGE2|HAC1_ASPOR 69 nlpprkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrl 129
+ + rkr dek++ e+ +n aa+ sre++rl len+ i l ++n l l
+ sp|Q6IMZ0|NFIL3_RAT 58 SACRRKREFIPDEKKDaMYWEKRRKNNEAAKRSREKRRLNDLVLENKLIALGEENATLKAEL 119
+ 5567899999998766155789999**************************99998776655 PP
+
+>> sp|P38749|YAP3_YEAST AP-1-like transcription factor YAP3 OS=Saccharomyces cerevisiae GN=YAP3 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.6 1.6 0.00037 0.94 81 140 .. 142 201 .. 127 211 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 13.6 bits; conditional E-value: 0.00037
+ sp|Q1XGE2|HAC1_ASPOR 81 ekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrls 140
+ ++ + ++ +nraa + rerk +++ l+++ ++ e+ +q ll+ + +l+ n ++
+ sp|P38749|YAP3_YEAST 142 VPDDSKAKKKAQNRAAQKAFRERKEARMKELQDKLLESERNRQSLLKEIEELRKANTEIN 201
+ 555666777889*************************************99998887765 PP
+
+>> sp|Q08D88|NFIL3_BOVIN Nuclear factor interleukin-3-regulated protein OS=Bos taurus GN=NFIL3 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.2 0.0022 5.5 70 129 .. 59 119 .. 52 142 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.0022
+ sp|Q1XGE2|HAC1_ASPOR 70 lpprkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrl 129
+ rkr dek++ e+ +n aa+ sre++rl len+ i l ++n l l
+ sp|Q08D88|NFIL3_BOVIN 59 ACRRKREFIPDEKKDaMYWEKRRKNNEAAKRSREKRRLNDLVLENKLIALGEENATLKAEL 119
+ 567899999898766155789999**************************99998876655 PP
+
+>> sp|Q16649|NFIL3_HUMAN Nuclear factor interleukin-3-regulated protein OS=Homo sapiens GN=NFIL3 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.3 0.0023 5.9 70 129 .. 59 119 .. 52 141 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.0023
+ sp|Q1XGE2|HAC1_ASPOR 70 lpprkraktedekeq.rriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrl 129
+ rkr dek++ e+ +n aa+ sre++rl len+ i l ++n l l
+ sp|Q16649|NFIL3_HUMAN 59 ACRRKREFIPDEKKDaMYWEKRRKNNEAAKRSREKRRLNDLVLENKLIALGEENATLKAEL 119
+ 567899999898766155789999**************************99998876655 PP
+
+>> sp|Q9C7S0|BZI60_ARATH bZIP transcription factor 60 OS=Arabidopsis thaliana GN=BZIP60 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 2.1 0.0026 6.6 80 142 .. 137 199 .. 132 215 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.0026
+ sp|Q1XGE2|HAC1_ASPOR 80 dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqq 142
+ d+ ++ +r +rnr aa srerk+ ++ le + le++ l + l + aen+ l
+ sp|Q9C7S0|BZI60_ARATH 137 DDAVAKKRRRRVRNRDAAVRSRERKKEYVQDLEKKSKYLERECLRLGRMLECFVAENQSLRYC 199
+ 444455556778**********************99999999988888888899999877654 PP
+
+>> sp|P78962|ATF21_SCHPO Transcription factor atf21 OS=Schizosaccharomyces pombe GN=atf21 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.1 0.6 0.0022 5.5 74 143 .. 261 327 .. 237 343 .. 0.72
+
+ Alignments for each domain:
+ == domain 1 score: 11.1 bits; conditional E-value: 0.0022
+ sp|Q1XGE2|HAC1_ASPOR 74 kraktedekeqrriervlrnraaaqtsrerkrleleklenek.iqleqqnqfllqrlsqleaennrlsqql 143
+ t d k++r +e rnr aa +r++k+l + le i +e q++ l +sql+ e l ql
+ sp|P78962|ATF21_SCHPO 261 SNNETPDMKRRRFLE---RNRIAASKCRQKKKLWTQNLEKTAhIACE-QSKALRILVSQLREEVICLKNQL 327
+ 455677777666666...7*******************986515555.56667777899888877776654 PP
+
+>> sp|Q1LZH5|CREM_BOVIN cAMP-responsive element modulator OS=Bos taurus GN=CREM PE=2 SV=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.1 0.0027 6.9 80 130 .. 299 349 .. 227 355 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.0027
+ sp|Q1XGE2|HAC1_ASPOR 80 dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrls 130
+ +e ++r r+++nr aa+ +r+rk+ ++ le++ le qn+ l++ l
+ sp|Q1LZH5|CREM_BOVIN 299 EEATRKRELRLMKNREAAKECRRRKKEYVKCLESRVAVLEVQNKKLIEELE 349
+ 4556677789****************99*******99*******9998876 PP
+
+>> sp|B1MX63|THIE_LEUCK Thiamine-phosphate pyrophosphorylase OS=Leuconostoc citreum (strain KM20) GN=thiE PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.0 0.0029 7.3 189 227 .. 139 177 .. 130 187 .. 0.91
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.0029
+ sp|Q1XGE2|HAC1_ASPOR 189 fptpslsdysptlkpstlaessdvaqhpavsvaglegdg 227
+ f t s sd p + s l++ +a+hp v+++g++ d
+ sp|B1MX63|THIE_LEUCK 139 FATTSKSDAKPPIGISGLSQLIRIAHHPIVAIGGIQRDN 177
+ 8999********************************996 PP
+
+>> sp|Q5AVK6|NOP16_EMENI Nucleolar protein 16 OS=Emericella nidulans GN=nop16 PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 2.0 0.0026 6.7 29 114 .. 136 219 .. 127 236 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.0026
+ sp|Q1XGE2|HAC1_ASPOR 29 spadtslnsadvktqevkpeekkpakkrkswgqelpvpktnlpprk...raktedekeqrriervlrnraaaqtsrerkrleleklen 113
+ +p + ln+ e+kp+ kk a + q+l + n+ p+k ++k e+e r ie+ n aa +r+rk +++ e+
+ sp|Q5AVK6|NOP16_EMENI 136 NPLNDPLNDLSDNEPEIKPQVKKAANQ---IVQQLEIQADNVAPKKprhQSKREEEWITRLIEKHGDNYAA--MARDRKLNPMQQTEG 218
+ 688888999888999******999876...46999999999987552114555666666666666656554..579999999998887 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 114 e 114
+ +
+ sp|Q5AVK6|NOP16_EMENI 219 D 219
+ 6 PP
+
+>> sp|Q9ULX9|MAFF_HUMAN Transcription factor MafF OS=Homo sapiens GN=MAFF PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.1 0.7 0.0022 5.5 84 152 .. 52 120 .. 32 144 .. 0.74
+
+ Alignments for each domain:
+ == domain 1 score: 11.1 bits; conditional E-value: 0.0022
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrg 152
+ ++ +r l+nr+ a ++r ++ ++ e l+ +k +le++ + l + + ++ e + l ++ l + r
+ sp|Q9ULX9|MAFF_HUMAN 52 LKQRRRTLKNRGYAASCRVKRVCQKEELQKQKSELEREVDKLARENAAMRLELDALRGKCEALQGFARS 120
+ 3444699******************************99999999888988888877665555444443 PP
+
+>> sp|P53567|CEBPG_HUMAN CCAAT/enhancer-binding protein gamma OS=Homo sapiens GN=CEBPG PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 11.0 0.3 0.0023 5.7 90 147 .. 58 112 .. 21 117 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 11.0 bits; conditional E-value: 0.0023
+ sp|Q1XGE2|HAC1_ASPOR 90 vlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqla 147
+ + rn + rer + ++ +++ +q+ q lqr++ql+ en rl ++ l
+ sp|P53567|CEBPG_HUMAN 58 MDRNSDEYRQRRERNNMAVK---KSRLKSKQKAQDTLQRVNQLKEENERLEAKIKLLT 112
+ 55565555566666666554...56888999999****************98887665 PP
+
+>> sp|Q2V2M9|FHOD3_HUMAN FH1/FH2 domain-containing protein 3 OS=Homo sapiens GN=FHOD3 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.2 0.3 0.0081 21 56 167 .. 412 524 .. 366 535 .. 0.72
+
+ Alignments for each domain:
+ == domain 1 score: 9.2 bits; conditional E-value: 0.0081
+ sp|Q1XGE2|HAC1_ASPOR 56 rkswgqelpv.pktnlpprkraktedekeqrriervlrnr.aaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsq 141
+ r s g +p p +++ p + a+ e + +r++ + rer+r e e + ++i+ e++n+f + l ql ae +
+ sp|Q2V2M9|FHOD3_HUMAN 412 RPSSGSSVPTtPTSSVSPPQEARWERSSPSGLLTSSFRQHqESLAAERERRRQEREE-RLQRIEREERNKFRYKYLEQLAAEEHEKEL 498
+ 566677777525556777778888888877777776665414556779999998876.4579*****************999875433 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 142 qlaqlaaevrgsrantplpgspatas 167
+ + ++ + p +pa+ +
+ sp|Q2V2M9|FHOD3_HUMAN 499 RSRSVSRGRADLSLDLTSPAAPACLA 524
+ 32222222222223444455555554 PP
+
+>> sp|Q03060|CREM_HUMAN cAMP-responsive element modulator OS=Homo sapiens GN=CREM PE=1 SV=5
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.7 0.1 0.0028 7.1 80 130 .. 299 349 .. 230 355 .. 0.89
+
+ Alignments for each domain:
+ == domain 1 score: 10.7 bits; conditional E-value: 0.0028
+ sp|Q1XGE2|HAC1_ASPOR 80 dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrls 130
+ +e ++r r+++nr aa+ +r+rk+ ++ le++ le qn+ l++ l
+ sp|Q03060|CREM_HUMAN 299 EEATRKRELRLMKNREAAKECRRRKKEYVKCLESRVAVLEVQNKKLIEELE 349
+ 4556677789****************99*******99*******9998876 PP
+
+>> sp|O68007|BACB_BACLI Bacitracin synthase 2 OS=Bacillus licheniformis GN=bacB PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.0 0.1 0.0045 11 181 256 .. 353 428 .. 325 464 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 10.0 bits; conditional E-value: 0.0045
+ sp|Q1XGE2|HAC1_ASPOR 181 elpleripfptpslsdysptlkpstla..essdvaqhpavsvaglegdgsalplfdlgsdlkhhstddvaaplsdddf 256
+ l l+ p ++s+y t+k +tl e++d + gl d s plfd dl+h dd+a+ + f
+ sp|O68007|BACB_BACLI 353 TLALRNRPKGNMTFSEYVQTVKNNTLKayENQDYQFDALIEHLGLTHDMSRNPLFDTMFDLQH--ADDFASEAGGGHF 428
+ 5778888888999************95347888888888999*******************99..5788876665555 PP
+
+>> sp|Q5VPE3|HOX2_ORYSJ Homeobox-leucine zipper protein HOX2 OS=Oryza sativa subsp. japonica GN=HOX2 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.6 0.4 0.003 7.6 106 251 .. 160 302 .. 135 307 .. 0.63
+
+ Alignments for each domain:
+ == domain 1 score: 10.6 bits; conditional E-value: 0.003
+ sp|Q1XGE2|HAC1_ASPOR 106 leleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa.evr..gsrantplpgspatasptltptlfkqerdelpleripfpt 191
+ ++ ++ + + q e + ++l + + +l en rl ++la+l a + + a+ +p s a a+ t++p++ + p
+ sp|Q5VPE3|HOX2_ORYSJ 160 FQNRRARTKLKQTEVDCEYLKRWCERLADENKRLEKELADLRAlKAApsPASASAMQPSSSAAATLTMCPSCRRVATAGAPH------Q 242
+ 44444444444666677788888888999**********9976233311445677889999999999999876655444443......3 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 192 pslsdysptlkpstlaessdvaqhpavsvag...legdgsalplfdlgsdlkhhstddvaapl 251
+ p+ ++ p +t++ ss a av+vag l + +p +d +st + aapl
+ sp|Q5VPE3|HOX2_ORYSJ 243 PNHQQCHPKS-NTTISSSSTAA--AAVAVAGgnvLPSHCQFFPAAAAAADRTSQSTWNAAAPL 302
+ 5556666643.34555555544..456666633345555666666677788888888888887 PP
+
+>> sp|Q84U86|HOX2_ORYSI Homeobox-leucine zipper protein HOX2 OS=Oryza sativa subsp. indica GN=HOX2 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.6 0.4 0.003 7.6 106 251 .. 160 302 .. 135 307 .. 0.63
+
+ Alignments for each domain:
+ == domain 1 score: 10.6 bits; conditional E-value: 0.003
+ sp|Q1XGE2|HAC1_ASPOR 106 leleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaa.evr..gsrantplpgspatasptltptlfkqerdelpleripfpt 191
+ ++ ++ + + q e + ++l + + +l en rl ++la+l a + + a+ +p s a a+ t++p++ + p
+ sp|Q84U86|HOX2_ORYSI 160 FQNRRARTKLKQTEVDCEYLKRWCERLADENKRLEKELADLRAlKAApsPASASAMQPSSSAAATLTMCPSCRRVATAGAPH------Q 242
+ 44444444444666677788888888999**********9976233311445677889999999999999876655444443......3 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 192 pslsdysptlkpstlaessdvaqhpavsvag...legdgsalplfdlgsdlkhhstddvaapl 251
+ p+ ++ p +t++ ss a av+vag l + +p +d +st + aapl
+ sp|Q84U86|HOX2_ORYSI 243 PNHQQCHPKS-NTTISSSSTAA--AAVAVAGgnvLPSHCQFFPAAAAAADRTSQSTWNAAAPL 302
+ 5556666643.34555555544..456666633345555666666677788888888888887 PP
+
+>> sp|Q65US7|THIE_MANSM Thiamine-phosphate pyrophosphorylase OS=Mannheimia succiniciproducens (strain MBEL55E) GN=thiE
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.0 0.0026 6.6 135 238 .. 95 196 .. 54 199 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.0026
+ sp|Q1XGE2|HAC1_ASPOR 135 ennrlsqqlaqlaaevrgsrantplpgspatasptltptlfkqerdelpleri.p.fptpslsdysptlkpstlaessdva.qhpavsv 220
+ ++ +++q+ + +r +r n p+ g tl l ++r+++ + p fpt s +d+sp + + + + +++ + p+v++
+ sp|Q65US7|THIE_MANSM 95 DGIHVGQKDTAVETILRNTR-NKPIIGLS---INTLAQALANKDRQDIDYFGVgPiFPTNSKADHSPLVGMNFIRQIRQLGiDKPCVAI 179
+ 55555555555555555554.67777754...457777777777777776655324*******************999986378***** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 221 aglegdgsalplfdlgsd 238
+ +g++ + +a+ l lg+d
+ sp|Q65US7|THIE_MANSM 180 GGIKEESAAI-LRRLGAD 196
+ ***9876665.6777776 PP
+
+>> sp|P07948|LYN_HUMAN Tyrosine-protein kinase Lyn OS=Homo sapiens GN=LYN PE=1 SV=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.4 0.2 0.0034 8.6 36 87 .. 15 67 .. 7 73 .. 0.84
+
+ Alignments for each domain:
+ == domain 1 score: 10.4 bits; conditional E-value: 0.0034
+ sp|Q1XGE2|HAC1_ASPOR 36 nsadvktqevkpeekkp.akkrkswgqelpvpktnlpprkraktedekeqrri 87
+ ++ d+ktq v+ e+ + s q+ pvp ++l p +r +t+d eq i
+ sp|P07948|LYN_HUMAN 15 DGVDLKTQPVRNTERTIyVRDPTSNKQQRPVPESQLLPGQRFQTKDPEEQGDI 67
+ 5689*******9888761566678889********************999765 PP
+
+>> sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Homo sapiens GN=HLF PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.4 4.3 0.00042 1.1 21 145 .. 163 287 .. 141 293 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 13.4 bits; conditional E-value: 0.00042
+ sp|Q1XGE2|HAC1_ASPOR 21 sevpvltvspadtslnsadvktqevkpeekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrlele 109
+ p p + ad+ + +e +krk +el rk +d k+++ r +n aa+ sr+ +rl+
+ sp|Q16534|HLF_HUMAN 163 PIDPDTIQVPVGYEPDPADLALSSIPGQEMFDPRKRKFSEEELKPQPMIKKARKVFIPDDLKDDKYWARRRKNNMAAKRSRDARRLKEN 251
+ 3334444457777778888888999999998889999888888533334467888889999**************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 110 klenekiqleqqnqfllqrlsqleaennrlsqqlaq 145
+ ++ + le++n l q +++l+ e +++ la+
+ sp|Q16534|HLF_HUMAN 252 QIAIRASFLEKENSALRQEVADLRKELGKCKNILAK 287
+ ********************9999998888777776 PP
+
+>> sp|Q9XGJ4|GGM13_GNEGN MADS-box protein GGM13 OS=Gnetum gnemon GN=GGM13 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.8 0.6 0.0026 6.6 74 147 .. 92 165 .. 75 230 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 10.8 bits; conditional E-value: 0.0026
+ sp|Q1XGE2|HAC1_ASPOR 74 kraktedekeqrriervlrnraaaqtsrerkrleleklenekiql.eqqnqfllqrlsqleaennrlsqqlaqla 147
+ r k e+ek q i+r++ + t e +l + +le+ ++ ++nq +lq+l l+ + + l +q ++l+
+ sp|Q9XGJ4|GGM13_GNEGN 92 TRMKNENEKLQTNIRRMMGEDLTSLTMTELHHLGQ-QLESASSRVrSRKNQLMLQQLENLRRKERILEDQNSHLC 165
+ 689**************************999975.57766555415789*****99988777666665544333 PP
+
+>> sp|P27921|JUND_CHICK Transcription factor jun-D OS=Gallus gallus GN=JUND PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.4 0.0036 9.2 71 139 .. 230 298 .. 195 308 .. 0.70
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.0036
+ sp|Q1XGE2|HAC1_ASPOR 71 pprkraktedekeqrrier.vlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrl 139
+ pp d +e+ + er lrnr aa +r+rk ++ +le + l+ qn l s l+ + +l
+ sp|P27921|JUND_CHICK 230 PPLSPI-DMDTQERIKAERkRLRNRIAASKCRKRKLERISRLEEKVKSLKSQNTELASTASLLREQVAQL 298
+ 333333.344555555555269************999999999777778999987776666655554444 PP
+
+>> sp|Q5XHX8|THEG_RAT Testicular haploid expressed gene protein OS=Rattus norvegicus GN=Theg PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.4 0.7 0.0034 8.8 117 205 .. 218 300 .. 182 318 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 10.4 bits; conditional E-value: 0.0034
+ sp|Q1XGE2|HAC1_ASPOR 117 qleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspatasptltptlfkqerdelpleripfptpslsdysptlkpst 205
+ le q l+rl+ + +nn s +++++ r ++ p p + a p tl +e d + p p p +sdy+ l+ +t
+ sp|Q5XHX8|THEG_RAT 218 TLEYQASNRLKRLATPKIRNNIWSINMSEVSQVSRAAQMAVPTPRTLRLAKPRAPATLL-EEWDPM-----PKPKPYVSDYNRLLQLAT 300
+ 45556666799*****************************************9877776.567755.....679999****99887655 PP
+
+>> sp|P18847|ATF3_HUMAN Cyclic AMP-dependent transcription factor ATF-3 OS=Homo sapiens GN=ATF3 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.4 1.6 0.0034 8.7 76 158 .. 82 163 .. 71 168 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 10.4 bits; conditional E-value: 0.0034
+ sp|Q1XGE2|HAC1_ASPOR 76 aktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqql..aqlaaevrgsrantp 158
+ a ede+++rr e rn+ aa +r +k+ + e l+ e +le n l ++ +l+ e ++l +l + + vr + ++tp
+ sp|P18847|ATF3_HUMAN 82 APEEDERKKRRRE---RNKIAAAKCRNKKKEKTECLQKESEKLESVNAELKAQIEELKNEKQHLIYMLnlHRPTCIVRAQNGRTP 163
+ 4456666666655...7999999***************************99999999999988765411455666777777776 PP
+
+>> sp|P24068|OCS1_MAIZE Ocs element-binding factor 1 OS=Zea mays GN=OBF1 PE=2 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.4 3.8 0.0034 8.7 84 149 .. 25 90 .. 12 101 .. 0.77
+
+ Alignments for each domain:
+ == domain 1 score: 10.4 bits; conditional E-value: 0.0034
+ sp|Q1XGE2|HAC1_ASPOR 84 qrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaae 149
+ +rr +r l nr +a+ sr rk+ +l+ l +e +l+ +n + r ++ ++ r+ q+ l a+
+ sp|P24068|OCS1_MAIZE 25 HRREKRRLSNRESARRSRLRKQQHLDELVQEVARLQADNARVAARARDIASQYTRVEQENTVLRAR 90
+ 577778888999999999999999999999988888888888888888888888888876655543 PP
+
+>> sp|P20393|NR1D1_HUMAN Nuclear receptor subfamily 1 group D member 1 OS=Homo sapiens GN=NR1D1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.1 4.2 0.0043 11 83 197 .. 173 288 .. 159 298 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 10.1 bits; conditional E-value: 0.0043
+ sp|Q1XGE2|HAC1_ASPOR 83 eqrriervlrnraaaqtsrerkrlel....eklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrantplpgspat. 165
+ e i r+ rnr+ q +r +k l + + ++ +i ++++++l + s + nn+ls q+ e ++ tp p +p+
+ sp|P20393|NR1D1_HUMAN 173 ENCSIVRINRNRC--QQCRFKKCLSVgmsrDAVRFGRIPKREKQRMLAEMQSAMNLANNQLSSQC---PLETSPTQHPTPGPMGPSPp 255
+ 5556778888875..66777776654111145677788888888889999999999999999875...45666667777777666541 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 166 asptltptl.fkqerdelpleripfptpslsdy 197
+ +p +p + f q ++l r p p p++ d
+ sp|P20393|NR1D1_HUMAN 256 PAPVPSPLVgFSQFPQQLTPPRSPSPEPTVEDV 288
+ 4577777655999999************99885 PP
+
+>> sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus GN=Fosb PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.2 8.1 0.0039 10 69 164 .. 142 236 .. 130 297 .. 0.72
+
+ Alignments for each domain:
+ == domain 1 score: 10.2 bits; conditional E-value: 0.0039
+ sp|Q1XGE2|HAC1_ASPOR 69 nlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsrant 157
+ pr t +e e+rr++r rn+ aa +r r+r ++l+ e qle++ l +++l+ e rl l ++
+ sp|P13346|FOSB_MOUSE 142 PRRPREETLTPEEEEKRRVRRE-RNKLAAAKCRNRRRELTDRLQAETDQLEEEKAELESEIAELQKEKERLEFVLVAHKPGCKIPYEEG 229
+ 445788888999999***9885.89999999999999999*****************************99877655444444444455 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 158 plpgspa 164
+ p pg a
+ sp|P13346|FOSB_MOUSE 230 PGPGPLA 236
+ 5555544 PP
+
+>> sp|P42775|GBF2_ARATH G-box-binding factor 2 OS=Arabidopsis thaliana GN=GBF2 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.8 1.5 0.0051 13 80 152 .. 246 322 .. 236 329 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 9.8 bits; conditional E-value: 0.0051
+ sp|Q1XGE2|HAC1_ASPOR 80 dekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqq....laqlaaevrg 152
+ +eke +r +r nr +a+ sr rk+ e e+l + l +n+ l +l+ql e+ +l + l ql a+ g
+ sp|P42775|GBF2_ARATH 246 NEKEVKREKRKQSNRESARRSRLRKQAETEQLSVKVDALVAENMSLRSKLGQLNNESEKLRLEneaiLDQLKAQATG 322
+ 79999***************************998889999***********9877665543211224566666655 PP
+
+>> sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS=Schizosaccharomyces pombe GN=pcr1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.2 7.9 0.0079 20 74 145 .. 4 73 .. 1 169 [. 0.60
+
+ Alignments for each domain:
+ == domain 1 score: 9.2 bits; conditional E-value: 0.0079
+ sp|Q1XGE2|HAC1_ASPOR 74 kraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqql.aq 145
+ k+ +dek++r +e rnr aa r++k+ ++ le+ +q++ l lsql+ e rl ql a+
+ sp|Q09926|PCR1_SCHPO 4 KKKEVDDEKRRRILE---RNRIAASKFRQKKKEWIKELEQTANAAFEQSKRLQLLLSQLQQEAFRLKSQLlAH 73
+ 445567777666555...7***********9987777776665555555555556777777777776554122 PP
+
+>> sp|P24813|YAP2_YEAST AP-1-like transcription activator YAP2 OS=Saccharomyces cerevisiae GN=CAD1 PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.0 1.5 0.0045 11 64 121 .. 29 80 .. 15 105 .. 0.73
+
+ Alignments for each domain:
+ == domain 1 score: 10.0 bits; conditional E-value: 0.0045
+ sp|Q1XGE2|HAC1_ASPOR 64 pvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqq 121
+ p k + p rkr +e + r r +nraa + r+rk +++ l+ +++l +q
+ sp|P24813|YAP2_YEAST 29 PKRKVGRPGRKRIDSE--AKSR---RTAQNRAAQRAFRDRKEAKMKSLQE-RVELLEQ 80
+ 5566777888876544..3334...6789****************99974.5544333 PP
+
+>> sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattus norvegicus GN=Hlf PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 12.5 4.4 0.00076 1.9 24 145 .. 166 287 .. 141 293 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 12.5 bits; conditional E-value: 0.00076
+ sp|Q1XGE2|HAC1_ASPOR 24 pvltvspadtslnsadvktqevkpeekkpakkrkswgqel.pvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrlelekl 111
+ p p + ad+ + e +krk +el p p rk +d k+++ r +n aa+ sr+ +rl+ ++
+ sp|Q64709|HLF_RAT 166 PDTIQVPVGYEPDPADLALSSIPGPEMFDPRKRKFSEEELkPQPMI-KKARKVFIPDDLKDDKYWARRRKNNMAAKRSRDARRLKENQI 253
+ 3334446666667788877777655565566777767777244444.457888889999****************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 112 enekiqleqqnqfllqrlsqleaennrlsqqlaq 145
+ + le++n l q +++l+ e +++ la+
+ sp|Q64709|HLF_RAT 254 AIRASFLEKENSALRQEVADLRKELGKCKNILAK 287
+ ******************9999998888777776 PP
+
+>> sp|Q02100|SKO1_YEAST CRE-binding bZIP protein SKO1 OS=Saccharomyces cerevisiae GN=SKO1 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.9 0.3 0.0047 12 79 120 .. 425 466 .. 390 481 .. 0.83
+
+ Alignments for each domain:
+ == domain 1 score: 9.9 bits; conditional E-value: 0.0047
+ sp|Q1XGE2|HAC1_ASPOR 79 edekeqrriervlrnraaaqtsrerkrleleklenekiqleq 120
+ +e+e++r e + rnr aa r+rk+ ++k+en+ e
+ sp|Q02100|SKO1_YEAST 425 NEEQERKRKEFLERNRVAASKFRKRKKEYIKKIENDLQFYES 466
+ 3567888999999**********************8655555 PP
+
+>> sp|P50198|LINX_PSEPA 2,5-dichloro-2,5-cyclohexadiene-1,4-diol dehydrogenase OS=Pseudomonas paucimobilis GN=linX PE=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.0 0.0 0.0045 11 138 190 .. 164 217 .. 158 225 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 10.0 bits; conditional E-value: 0.0045
+ sp|Q1XGE2|HAC1_ASPOR 138 rlsqqlaqlaaevrgsrantplpgspata.sptltptlfkqerdelpleripfp 190
+ r+ + a l rg r nt +pg+ t + + p + kq+ ++p+ ++ p
+ sp|P50198|LINX_PSEPA 164 RIMSKAAALEFVDRGVRVNTIVPGGMNTPiTANVPPDVLKQQTSQIPMGKLGDP 217
+ 5566677777888**********9876641567899************998766 PP
+
+>> sp|Q6DGM8|JDP2_DANRE Jun dimerization protein 2 OS=Danio rerio GN=jdp2 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.2 4.0 0.0039 10 76 141 .. 62 128 .. 48 142 .. 0.82
+
+ Alignments for each domain:
+ == domain 1 score: 10.2 bits; conditional E-value: 0.0039
+ sp|Q1XGE2|HAC1_ASPOR 76 aktede.keqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsq 141
+ k+ed+ ++r+ +r +n+ aa +r rk+ + + l+ e +le+ n l ++ +l++e+++l
+ sp|Q6DGM8|JDP2_DANRE 62 IKSEDDdDDERKKRRREKNKVAAARCRNRKKERTDFLQKESERLEMLNSDLKSQIEELKSERQQLIV 128
+ 566554145666677789*************************************999999988765 PP
+
+>> sp|A2Z0Q0|HOX25_ORYSI Homeobox-leucine zipper protein HOX25 OS=Oryza sativa subsp. indica GN=HOX25 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 10.3 0.4 0.0036 9.1 53 173 .. 21 140 .. 13 219 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 10.3 bits; conditional E-value: 0.0036
+ sp|Q1XGE2|HAC1_ASPOR 53 akkrkswgqelpvpktnlpprkraktedek..eqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennr 138
+ a+kr+ +++ ++ kr k e e+ e r + ++ a + +r r + ++le + +l+ ++ ll + l a+n
+ sp|A2Z0Q0|HOX25_ORYSI 21 ARKRRLTAEQVRALERSFEEEKR-KLEPERksELARRLGIAPRQVAVWFQNRRARWKTKQLELDFDRLRAAHDELLAGRAALAADNES 107
+ 67777777777777777766665.444444013333334556667777788889999999999999999999999999999******* PP
+
+ sp|Q1XGE2|HAC1_ASPOR 139 lsqqlaqlaaevrgsrantplpgspatasptltpt 173
+ l q+ l +++ + +p p spa a t p
+ sp|A2Z0Q0|HOX25_ORYSI 108 LRSQVILLTEKLQA-NGKSPSP-SPAPAEQTAVPA 140
+ ****9988877764.5677887.799999888886 PP
+
+>> sp|Q9UPR3|SMG5_HUMAN Protein SMG5 OS=Homo sapiens GN=SMG5 PE=1 SV=3
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.8 0.3 0.0052 13 112 173 .. 800 860 .. 792 901 .. 0.78
+
+ Alignments for each domain:
+ == domain 1 score: 9.8 bits; conditional E-value: 0.0052
+ sp|Q1XGE2|HAC1_ASPOR 112 enekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsr..antplpgspatasptltpt 173
+ e+e + ++ q qf r++q ea++nrl +++aql ++ s+ ++ +p + + sp l p
+ sp|Q9UPR3|SMG5_HUMAN 800 EQESLLQQAQAQF---RMAQEEARRNRLMRDMAQLRLQLEVSQleGSLQQPKAQSAMSPYLVPD 860
+ 5555555666666...899***************998776665115677888888899999886 PP
+
+>> sp|Q41558|HBP1C_WHEAT Transcription factor HBP-1b(c1) (Fragment) OS=Triticum aestivum PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.3 1.4 0.00044 1.1 77 131 .. 183 236 .. 142 250 .. 0.85
+
+ Alignments for each domain:
+ == domain 1 score: 13.3 bits; conditional E-value: 0.00044
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsq 131
+ k++d+ +++ ++r+ +nr aa+ sr rk+ ++ le+ +++l q q lqr q
+ sp|Q41558|HBP1C_WHEAT 183 KSRDKLDHKSLRRLAQNREAARKSRLRKKAYIQNLESSRLKLTQLEQE-LQRARQ 236
+ 778999999999****************************99998886.466555 PP
+
+>> sp|O02756|CEBPD_BOVIN CCAAT/enhancer-binding protein delta OS=Bos taurus GN=CEBPD PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.9 7.9 0.005 13 74 164 .. 171 246 .. 115 253 .. 0.57
+
+ Alignments for each domain:
+ == domain 1 score: 9.9 bits; conditional E-value: 0.005
+ sp|Q1XGE2|HAC1_ASPOR 74 kraktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrlsqqlaqlaaevrgsra.ntplp 160
+ kr+ + e + rer + ++k + + +++nq + q+l +l aen +l+q++ ql ++ g r lp
+ sp|O02756|CEBPD_BOVIN 171 KRGPDRGSPEY-------------RQRRERNNIAVRK---SRDKAKRRNQEMQQKLVELSAENEKLQQRVEQLTRDLAGLRRfFKQLP 242
+ 33222222222.............2233344443333...333456777788888888888888888888888888888765145678 PP
+
+ sp|Q1XGE2|HAC1_ASPOR 161 gspa 164
+ g+p
+ sp|O02756|CEBPD_BOVIN 243 GAPF 246
+ 8875 PP
+
+>> sp|Q63315|CAD22_RAT Cadherin-22 OS=Rattus norvegicus GN=Cdh22 PE=1 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.4 0.2 0.0068 17 254 299 .. 713 759 .. 681 767 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 9.4 bits; conditional E-value: 0.0068
+ sp|Q1XGE2|HAC1_ASPOR 254 ddfnrlfhgdssvepdssvfedglafdv.leggdlsafpfdslvnfd 299
+ + + l +g ss epd svf+d ++ v l dls p+d++ +
+ sp|Q63315|CAD22_RAT 713 SERHSLPRGPSSPEPDFSVFRDFISRKVaLADADLSVPPYDAFQTYA 759
+ 45567889****************998747899********987765 PP
+
+>> sp|Q9WTP5|CAD22_MOUSE Cadherin-22 OS=Mus musculus GN=Cdh22 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.4 0.2 0.0068 17 254 299 .. 713 759 .. 681 767 .. 0.80
+
+ Alignments for each domain:
+ == domain 1 score: 9.4 bits; conditional E-value: 0.0068
+ sp|Q1XGE2|HAC1_ASPOR 254 ddfnrlfhgdssvepdssvfedglafdv.leggdlsafpfdslvnfd 299
+ + + l +g ss epd svf+d ++ v l dls p+d++ +
+ sp|Q9WTP5|CAD22_MOUSE 713 SERHSLPRGPSSPEPDFSVFRDFISRKVaLADADLSVPPYDAFQTYA 759
+ 45567889****************998747899********987765 PP
+
+>> sp|Q5FUV3|ATE_GLUOX Putative arginyl-tRNA--protein transferase OS=Gluconobacter oxydans GN=ate PE=3 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 1.9 0.0 1.4 3.5e+03 177 224 .. 2 49 .. 1 56 [. 0.89
+ 2 ? 10.5 0.5 0.0033 8.4 137 193 .. 48 102 .. 39 127 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 1.9 bits; conditional E-value: 1.4
+ sp|Q1XGE2|HAC1_ASPOR 177 qerdelpleripfptpslsdysptlkpstlaessdvaqhpavsvagle 224
+ q+r +l p p+p l d + + la + va h +s ag++
+ sp|Q5FUV3|ATE_GLUOX 2 QHRPQLFYTTAPAPCPYLPDRTERKVLTELAGPDAVALHNRLSQAGFR 49
+ 78999999999**********99988899999999*********9987 PP
+
+ == domain 2 score: 10.5 bits; conditional E-value: 0.0033
+ sp|Q1XGE2|HAC1_ASPOR 137 nrlsqqlaqlaaevrgsrantplpgspatasptltptlfkqerdelpleripfptps 193
+ r s+ +a a + g+ra tp+ at +pt t ++ ++ +l + ip p p+
+ sp|Q5FUV3|ATE_GLUOX 48 FRRSHAIAY-APVCVGCRACTPMRIPAATFAPTRTQKKIRSRHTDLVVNIIP-PVPT 102
+ 455566654.45567**********9****************99**999997.5554 PP
+
+>> sp|Q99091|CPRF3_PETCR Light-inducible protein CPRF3 OS=Petroselinum crispum GN=CPRF3 PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.4 3.5 0.0068 17 77 132 .. 190 248 .. 179 269 .. 0.81
+
+ Alignments for each domain:
+ == domain 1 score: 9.4 bits; conditional E-value: 0.0068
+ sp|Q1XGE2|HAC1_ASPOR 77 ktedekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfl...lqrlsql 132
+ + de+e +r +r nr +a+ sr rk+ + + l+ + l ++n++l lqr+s+
+ sp|Q99091|CPRF3_PETCR 190 RVNDERELKRQRRKQSNRESARRSRLRKQAKSDELQERLDNLSKENRILrknLQRISEA 248
+ 467999999999************************999999****9993334555544 PP
+
+>> sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus musculus GN=Hlf PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 13.1 4.4 0.00051 1.3 23 145 .. 165 287 .. 142 293 .. 0.79
+
+ Alignments for each domain:
+ == domain 1 score: 13.1 bits; conditional E-value: 0.00051
+ sp|Q1XGE2|HAC1_ASPOR 23 vpvltvspadtslnsadvktqevkpeekkpakkrkswgqelpvpktnlpprkraktedekeqrriervlrnraaaqtsrerkrlelekl 111
+ p p + ad+ + +e +krk +el rk +d k+++ r +n aa+ sr+ +rl+ ++
+ sp|Q8BW74|HLF_MOUSE 165 DPDTIQVPVGYEPDPADLALSSIPGQEMFDPRKRKFSEEELKPQPMIKKARKVFIPDDLKDDKYWARRRKNNMAAKRSRDARRLKENQI 253
+ 34444456777778888888899999998889999888888533334467888889999****************************** PP
+
+ sp|Q1XGE2|HAC1_ASPOR 112 enekiqleqqnqfllqrlsqleaennrlsqqlaq 145
+ + le++n l q +++l+ e +++ la+
+ sp|Q8BW74|HLF_MOUSE 254 AIRASFLEKENSALRQEVADLRKELGKCKNILAK 287
+ ******************9999998888777776 PP
+
+>> sp|Q9JLC6|TEF_MOUSE Thyrotroph embryonic factor OS=Mus musculus GN=Tef PE=2 SV=1
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.5 0.3 0.0066 17 52 134 .. 201 282 .. 152 292 .. 0.71
+
+ Alignments for each domain:
+ == domain 1 score: 9.5 bits; conditional E-value: 0.0066
+ sp|Q1XGE2|HAC1_ASPOR 52 pakkrkswgqelpvpktnlpprkrakted.ekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqlea 134
+ p k r + +e p+ + k+ d +k+++ r +n aa+ sr+ +rl+ ++ + le++n l +++l+
+ sp|Q9JLC6|TEF_MOUSE 201 PRKHR--FAEEDLKPQPMIKKAKKVFVPDeQKDEKYWTRRKKNNVAAKRSRDARRLKENQITIRAAFLEKENTALRTEVAELRK 282
+ 43333..3344444666666666666555157788889999****************999999999999999988777776665 PP
+
+>> sp|Q92172|TEF_CHICK Transcription factor VBP OS=Gallus gallus GN=TEF PE=1 SV=2
+ # score bias c-Evalue i-Evalue hmmfrom hmm to alifrom ali to envfrom env to acc
+ --- ------ ----- --------- --------- ------- ------- ------- ------- ------- ------- ----
+ 1 ? 9.6 0.4 0.0059 15 54 139 .. 214 299 .. 176 308 .. 0.76
+
+ Alignments for each domain:
+ == domain 1 score: 9.6 bits; conditional E-value: 0.0059
+ sp|Q1XGE2|HAC1_ASPOR 54 kkrkswgqelpvpktnlpprkrakted.ekeqrriervlrnraaaqtsrerkrleleklenekiqleqqnqfllqrlsqleaennrl 139
+ +k+k ++l p+ + k+ d +k+++ r +n aa+ sr+ +rl+ ++ + le++n l +++l+ e +r+
+ sp|Q92172|TEF_CHICK 214 RKHKFTEEDL-KPQPMIKKAKKVFVPDeQKDEKYWTRRKKNNVAAKRSRDARRLKENQITIRAAFLEKENTALRTEVAELRKEVGRC 299
+ 4555444444.3555555556655555167888889999*********************99999*****99999998888887775 PP
+
+
+
+Internal pipeline statistics summary:
+-------------------------------------
+Query model(s): 1 (345 nodes)
+Target sequences: 516081 (181677051 residues)
+Passed MSV filter: 21797 (0.0422356); expected 10321.6 (0.02)
+Passed bias filter: 21797 (0.0422356); expected 10321.6 (0.02)
+Passed Vit filter: 6030 (0.0116842); expected 516.1 (0.001)
+Passed Fwd filter: 1516 (0.00293752); expected 5.2 (1e-05)
+Initial search space (Z): 516081 [actual number of targets]
+Domain search space (domZ): 203 [number of targets reported over threshold]
+# CPU time: 21.11u 0.09s 00:00:21.20 Elapsed: 00:00:03.64
+# Mc/sec: 17219.39
+//
diff --git a/demotic/examples/example.psiblast.out b/demotic/examples/example.psiblast.out
new file mode 100644
index 0000000..b6890a1
--- /dev/null
+++ b/demotic/examples/example.psiblast.out
@@ -0,0 +1,4544 @@
+BLASTP 2.2.22 [Sep-27-2009]
+
+
+Reference: Altschul, Stephen F., Thomas L. Madden, Alejandro A. Schaffer,
+Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997),
+"Gapped BLAST and PSI-BLAST: a new generation of protein database search
+programs", Nucleic Acids Res. 25:3389-3402.
+
+
+Reference for composition-based statistics:
+Schaffer, Alejandro A., L. Aravind, Thomas L. Madden,
+Sergei Shavirin, John L. Spouge, Yuri I. Wolf,
+Eugene V. Koonin, and Stephen F. Altschul (2001),
+"Improving the accuracy of PSI-BLAST protein database searches with
+composition-based statistics and other refinements", Nucleic Acids Res. 29:2994-3005.
+
+Query= A3CM55.1
+ (328 letters)
+
+Database: uniprot_sprot.fasta
+ 516,081 sequences; 181,677,051 total letters
+
+Searching..................................................done
+
+
+
+ Score E
+Sequences producing significant alignments: (bits) Value
+
+sp|P78283|SECY_VIBCH Preprotein translocase subunit secY OS=Vibr... 276 2e-73
+sp|P43804|SECY_HAEIN Preprotein translocase subunit secY OS=Haem... 275 3e-73
+sp|Q9HWF5|SECY_PSEAE Preprotein translocase subunit secY OS=Pseu... 273 1e-72
+sp|Q59912|SECY_STRGB Preprotein translocase subunit secY OS=Stre... 268 4e-71
+sp|Q05217|SECY_STACT Preprotein translocase subunit secY OS=Stap... 264 5e-70
+sp|Q59916|SECY_STRGR Preprotein translocase subunit secY OS=Stre... 260 1e-68
+sp|O33006|SECY_MYCLE Preprotein translocase subunit secY OS=Myco... 259 3e-68
+sp|P38376|SECY_CORGL Preprotein translocase subunit secY OS=Cory... 258 4e-68
+sp|P77964|SECY_SYNY3 Preprotein translocase subunit secY OS=Syne... 258 5e-68
+sp|P27148|SECY_LACLC Preprotein translocase subunit secY OS=Lact... 256 2e-67
+sp|Q8CNF3|SECY_STAES Preprotein translocase subunit secY OS=Stap... 255 3e-67
+sp|Q5HM19|SECY_STAEQ Preprotein translocase subunit secY OS=Stap... 255 3e-67
+sp|P46785|SECY_STRCO Preprotein translocase subunit secY OS=Stre... 255 3e-67
+sp|P49977|SECY_STRLI Preprotein translocase subunit secY OS=Stre... 255 4e-67
+sp|P93690|SECY_SPIOL Preprotein translocase subunit secY, chloro... 255 4e-67
+sp|Q7A086|SECY_STAAW Preprotein translocase subunit secY OS=Stap... 254 5e-67
+sp|Q6G791|SECY_STAAS Preprotein translocase subunit secY OS=Stap... 254 5e-67
+sp|Q6GEK3|SECY_STAAR Preprotein translocase subunit secY OS=Stap... 254 5e-67
+sp|Q7A468|SECY_STAAN Preprotein translocase subunit secY OS=Stap... 254 5e-67
+sp|Q99S39|SECY_STAAM Preprotein translocase subunit secY OS=Stap... 254 5e-67
+sp|Q5HDX8|SECY_STAAC Preprotein translocase subunit secY OS=Stap... 254 5e-67
+sp|O08387|SECY_STAA8 Preprotein translocase subunit secY OS=Stap... 254 5e-67
+sp|P58118|SECY_LACLA Preprotein translocase subunit secY OS=Lact... 254 7e-67
+sp|P0A5Z2|SECY_MYCTU Preprotein translocase subunit secY OS=Myco... 253 9e-67
+sp|P0A5Z3|SECY_MYCBO Preprotein translocase subunit secY OS=Myco... 253 9e-67
+sp|P43416|SECY_STRSC Preprotein translocase subunit secY OS=Stre... 253 9e-67
+sp|Q9XQU4|SECY_PEA Preprotein translocase subunit secY, chloropl... 252 2e-66
+sp|P0AGA5|SECY_SHIFL Preprotein translocase subunit secY OS=Shig... 252 2e-66
+sp|P0AGA2|SECY_ECOLI Preprotein translocase subunit secY OS=Esch... 252 2e-66
+sp|P0AGA3|SECY_ECOL6 Preprotein translocase subunit secY OS=Esch... 252 2e-66
+sp|P0AGA4|SECY_ECO57 Preprotein translocase subunit secY OS=Esch... 252 2e-66
+sp|Q05207|SECY_BACLD Preprotein translocase subunit secY OS=Baci... 250 8e-66
+sp|O63066|SECY_MAIZE Preprotein translocase subunit secY, chloro... 250 8e-66
+sp|P16336|SECY_BACSU Preprotein translocase subunit secY OS=Baci... 249 2e-65
+sp|P38375|SECY_BACHD Preprotein translocase subunit secY OS=Baci... 247 7e-65
+sp|Q38885|SECY_ARATH Preprotein translocase subunit secY, chloro... 247 7e-65
+sp|P0A4H1|SECY_SYNP6 Preprotein translocase subunit secY OS=Syne... 246 1e-64
+sp|P0A4H0|SECY_SYNE7 Preprotein translocase subunit secY OS=Syne... 246 1e-64
+sp|Q6ZG25|SECY_ORYSJ Preprotein translocase subunit secY, chloro... 246 2e-64
+sp|P51297|SECY_PORPU Preprotein translocase subunit secY OS=Porp... 244 8e-64
+sp|O66491|SECY_AQUAE Preprotein translocase subunit secY OS=Aqui... 240 1e-62
+sp|Q4UMQ9|SECY_RICFE Preprotein translocase subunit secY OS=Rick... 240 1e-62
+sp|Q68W98|SECY_RICTY Preprotein translocase subunit secY OS=Rick... 238 3e-62
+sp|Q92GY6|SECY_RICCN Preprotein translocase subunit secY OS=Rick... 238 4e-62
+sp|Q1RHP1|SECY_RICBR Preprotein translocase subunit secY OS=Rick... 238 6e-62
+sp|P38397|SECY_PYRSA Preprotein translocase subunit secY (Fragme... 237 7e-62
+sp|Q9ZCS5|SECY_RICPR Preprotein translocase subunit secY OS=Rick... 237 9e-62
+sp|P28539|SECY_CHLTR Preprotein translocase subunit secY OS=Chla... 236 1e-61
+sp|Q1XDJ1|SECY_PORYE Preprotein translocase subunit secY OS=Porp... 236 1e-61
+sp|P28527|SECY_GUITH Preprotein translocase subunit secY OS=Guil... 233 2e-60
+sp|Q89A85|SECY_BUCBP Preprotein translocase subunit secY OS=Buch... 231 3e-60
+sp|P57571|SECY_BUCAI Preprotein translocase subunit secY OS=Buch... 231 6e-60
+sp|Q8K969|SECY_BUCAP Preprotein translocase subunit secY OS=Buch... 226 2e-58
+sp|Q59548|SECY_MYCPN Preprotein translocase subunit secY OS=Myco... 224 9e-58
+sp|Q9PJN1|SECY_CHLMU Preprotein translocase subunit secY OS=Chla... 222 2e-57
+sp|P33108|SECY_MICLU Preprotein translocase subunit secY OS=Micr... 222 3e-57
+sp|O52351|SECY_MYCGA Preprotein translocase subunit secY OS=Myco... 221 7e-57
+sp|P10250|SECY_MYCCT Preprotein translocase subunit secY OS=Myco... 219 2e-56
+sp|P47416|SECY_MYCGE Preprotein translocase subunit secY OS=Myco... 218 3e-56
+sp|Q9Z7S5|SECY_CHLPN Preprotein translocase subunit secY OS=Chla... 217 9e-56
+sp|O25879|SECY_HELPY Preprotein translocase subunit secY OS=Heli... 214 6e-55
+sp|Q9ZJS9|SECY_HELPJ Preprotein translocase subunit secY OS=Heli... 214 7e-55
+sp|O59442|SECY_PYRHO Preprotein translocase subunit secY OS=Pyro... 211 6e-54
+sp|P49976|SECY_BUCAK Preprotein translocase subunit secY (Fragme... 211 7e-54
+sp|Q870W0|SC61A_NEUCR Protein transport protein SEC61 subunit al... 210 8e-54
+sp|Q9V1V8|SECY_PYRAB Preprotein translocase subunit secY OS=Pyro... 210 1e-53
+sp|Q8U019|SECY_PYRFU Preprotein translocase subunit secY OS=Pyro... 210 1e-53
+sp|Q54XK2|SC61A_DICDI Protein transport protein Sec61 subunit al... 208 3e-53
+sp|P49461|SECY_ODOSI Preprotein translocase subunit secY OS=Odon... 205 5e-52
+sp|O51451|SECY_BORBU Preprotein translocase subunit secY OS=Borr... 204 8e-52
+sp|Q5NVM7|S61A2_PONAB Protein transport protein Sec61 subunit al... 203 1e-51
+sp|Q96TW8|SC61A_HANAN Protein transport protein SEC61 subunit al... 203 2e-51
+sp|P78979|SC61A_YARLI Protein transport protein SEC61 subunit al... 203 2e-51
+sp|Q9JLR1|S61A2_MOUSE Protein transport protein Sec61 subunit al... 202 3e-51
+sp|Q9H9S3|S61A2_HUMAN Protein transport protein Sec61 subunit al... 202 3e-51
+sp|Q2KHX4|S61A2_BOVIN Protein transport protein Sec61 subunit al... 202 3e-51
+sp|Q90ZM2|S61A1_DANRE Protein transport protein Sec61 subunit al... 202 3e-51
+sp|Q8AY32|SC61A_GADOC Protein transport protein Sec61 subunit al... 202 3e-51
+sp|Q98SN8|S61A2_ONCMY Protein transport protein Sec61 subunit al... 201 4e-51
+sp|Q5EA68|S61A1_BOVIN Protein transport protein Sec61 subunit al... 201 5e-51
+sp|P61621|S61A1_RAT Protein transport protein Sec61 subunit alph... 201 5e-51
+sp|Q5R5L5|S61A1_PONAB Protein transport protein Sec61 subunit al... 201 5e-51
+sp|P61620|S61A1_MOUSE Protein transport protein Sec61 subunit al... 201 5e-51
+sp|P61619|S61A1_HUMAN Protein transport protein Sec61 subunit al... 201 5e-51
+sp|Q7T278|SC61A_HARAN Protein transport protein Sec61 subunit al... 201 6e-51
+sp|Q7T277|SC61A_DISMA Protein transport protein Sec61 subunit al... 201 6e-51
+sp|Q8AY36|SC61A_PAGBO Protein transport protein Sec61 subunit al... 201 7e-51
+sp|Q8AY35|SC61A_NOTAN Protein transport protein Sec61 subunit al... 201 7e-51
+sp|Q8AY34|SC61A_HEMAM Protein transport protein Sec61 subunit al... 201 8e-51
+sp|Q90YL4|S61A2_DANRE Protein transport protein Sec61 subunit al... 201 8e-51
+sp|Q8AY31|SC61A_BOVVA Protein transport protein Sec61 subunit al... 200 9e-51
+sp|P38377|S61A1_CANFA Protein transport protein Sec61 subunit al... 200 1e-50
+sp|Q9P8E3|SC61A_CANAL Protein transport protein SEC61 subunit al... 199 1e-50
+sp|Q6FRY3|SC61A_CANGA Protein transport protein SEC61 subunit al... 199 2e-50
+sp|Q752H7|SC61A_ASHGO Protein transport protein SEC61 subunit al... 199 2e-50
+sp|P25014|SECY_CYAPA Preprotein translocase subunit secY OS=Cyan... 199 2e-50
+sp|Q6CPY9|SC61A_KLULA Protein transport protein SEC61 subunit al... 199 3e-50
+sp|Q6BN08|SC61A_DEBHA Protein transport protein SEC61 subunit al... 198 4e-50
+sp|Q8AY33|SC61A_BORSA Protein transport protein Sec61 subunit al... 198 4e-50
+sp|Q98SN9|S61A1_ONCMY Protein transport protein Sec61 subunit al... 198 5e-50
+sp|P46249|SECY_CYACA Preprotein translocase subunit secY OS=Cyan... 193 1e-48
+sp|P32915|SC61A_YEAST Protein transport protein SEC61 OS=Sacchar... 193 2e-48
+sp|Q25147|SC61A_HALRO Protein transport protein Sec61 subunit al... 192 4e-48
+sp|O26134|SECY_METTH Preprotein translocase subunit secY OS=Meth... 191 5e-48
+sp|P38379|SC61A_PYRSA Protein transport protein Sec61 subunit al... 188 5e-47
+sp|Q37143|SECY_ANTSP Preprotein translocase subunit secY OS=Anti... 184 8e-46
+sp|Q60175|SECY_METJA Preprotein translocase subunit secY OS=Meth... 183 1e-45
+sp|P28540|SECY_PAVLU Preprotein translocase subunit secY OS=Pavl... 179 3e-44
+sp|P79088|SC61A_SCHPO Protein transport protein sec61 subunit al... 178 5e-44
+sp|P28541|SECY_METVA Preprotein translocase subunit secY OS=Meth... 174 6e-43
+sp|Q9YDD0|SECY_AERPE Preprotein translocase subunit secY OS=Aero... 171 5e-42
+sp|O28377|SECY_ARCFU Preprotein translocase subunit secY OS=Arch... 171 7e-42
+sp|P28542|SECY_HALMA Preprotein translocase subunit secY OS=Halo... 165 3e-40
+sp|Q9HPB1|SECY_HALSA Preprotein translocase subunit secY OS=Halo... 162 4e-39
+sp|Q977V3|SECY_HALVO Preprotein translocase subunit secY OS=Halo... 156 2e-37
+sp|P49978|SECY_SULAC Preprotein translocase subunit secY OS=Sulf... 140 2e-32
+sp|Q9UX84|SECY_SULSO Preprotein translocase subunit secY OS=Sulf... 131 9e-30
+sp|P38353|SSH1_YEAST Sec sixty-one protein homolog OS=Saccharomy... 127 7e-29
+sp|O42965|YGMH_SCHPO Uncharacterized protein C19G7.17 OS=Schizos... 117 1e-25
+sp|P72179|SECY_PARDE Preprotein translocase subunit secY (Fragme... 99 5e-20
+sp|P28620|SECY_BACST Preprotein translocase subunit secY (Fragme... 74 1e-12
+sp|P0C6V7|R1AB_BEV Replicase polyprotein 1ab OS=Berne virus GN=r... 34 1.0
+sp|P0C6F3|R1A_BEV Replicase polyprotein 1a OS=Berne virus GN=1a ... 34 1.1
+sp|Q49VR4|LTAS_STAS1 Glycerol phosphate lipoteichoic acid syntha... 33 3.2
+sp|Q5HR16|LTAS_STAEQ Glycerol phosphate lipoteichoic acid syntha... 33 3.6
+sp|Q8CQ10|LTAS_STAES Glycerol phosphate lipoteichoic acid syntha... 32 4.0
+sp|Q6P6T5|OCLN_RAT Occludin OS=Rattus norvegicus GN=Ocln PE=2 SV=1 32 4.4
+sp|P94493|YNCC_BACSU Putative metabolite transport protein yncC ... 32 5.7
+sp|Q7A1I3|LTAS_STAAW Glycerol phosphate lipoteichoic acid syntha... 32 6.0
+sp|Q6GBB1|LTAS_STAAS Glycerol phosphate lipoteichoic acid syntha... 32 6.0
+sp|Q6GIS3|LTAS_STAAR Glycerol phosphate lipoteichoic acid syntha... 32 6.0
+sp|Q7A6U1|LTAS_STAAN Glycerol phosphate lipoteichoic acid syntha... 32 6.0
+sp|Q99VQ4|LTAS_STAAM Glycerol phosphate lipoteichoic acid syntha... 32 6.0
+sp|Q5HHV4|LTAS_STAAC Glycerol phosphate lipoteichoic acid syntha... 32 6.0
+sp|Q2G093|LTAS_STAA8 Glycerol phosphate lipoteichoic acid syntha... 32 6.0
+sp|Q2FIS2|LTAS_STAA3 Glycerol phosphate lipoteichoic acid syntha... 32 6.0
+sp|Q2YSL2|LTAS_STAAB Glycerol phosphate lipoteichoic acid syntha... 32 6.0
+sp|P0C6V8|R1AB_BRV1 Replicase polyprotein 1ab OS=Breda virus 1 G... 32 6.7
+sp|P0C6F4|R1A_BRV1 Replicase polyprotein 1a OS=Breda virus 1 GN=... 32 7.6
+
+>sp|P78283|SECY_VIBCH Preprotein translocase subunit secY OS=Vibrio
+ cholerae GN=secY PE=3 SV=2
+ Length = 444
+
+ Score = 276 bits (706), Expect = 2e-73, Method: Composition-based stats.
+ Identities = 82/326 (25%), Positives = 158/326 (48%), Gaps = 20/326 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+ ++G+ P++S+ ++ Q+ V L++L E + RR TLV+A Q++
+Sbjct: 76 SILALGIMPYISASIVVQLLTVVH-PALAELKKEGEAGRRKISQYTRYGTLVLATFQAIG 134
+
+Query: 55 LVLNLPLQ--EAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMI 111
+ + LP +D T ++ T+ L+ GT FL+WL + G+G +++ A ++
+Sbjct: 135 IATGLPNMVNNLVVIDQTMFTLIATVSLVTGTMFLMWLGEQITERGIGNGISILIFAGIV 194
+
+Query: 112 AYIPQDIWNSIQELKIS---SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFK 168
+ A +P+ I +I++ + L L L+ V + +Y V +ER + RI VN K
+Sbjct: 195 AGLPKAIGQTIEQARQGELHVLLLLLIAVLAFAVIYFVVFMERGQRRIVVNYAKRQQGRK 254
+
+Query: 169 ----KYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHF--LQPENQLIEQWIEALSMG 222
+ + ++L +++N AG +P ++A +++ P + ALS G
+Sbjct: 255 VFAAQSTHLPLKINMAGVIPAIFASSIILFPGTLAQWFGQNGESSTFGWLTDVSLALSPG 314
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ P + +LY I + + + + A+ ++KSG ++ + PG T +YI+ ++T
+Sbjct: 315 QPLYVMLYAAAIIFFCFFYTALVFNPRETADNLKKSGAFVPGIRPGEQTAKYIDKVMTRL 374
+
+Query: 283 ALVGAFYLILISGLP-MMVVLVDIRY 307
+ L GA Y+ I +P M+V ++R+
+Sbjct: 375 TLAGALYITFICLIPEFMMVAWNVRF 400
+
+
+>sp|P43804|SECY_HAEIN Preprotein translocase subunit secY
+ OS=Haemophilus influenzae GN=secY PE=3 SV=1
+ Length = 441
+
+ Score = 275 bits (704), Expect = 3e-73, Method: Composition-based stats.
+ Identities = 71/324 (21%), Positives = 143/324 (44%), Gaps = 19/324 (5%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ S+ ++G+ P++S+ ++ Q+ A L++L E T+V A IQ+VA
+Sbjct: 76 SILALGIMPYISASIVIQLLATVS-PALAELKKEGAAGQRKISKYTRYATVVFATIQAVA 134
+
+Query: 55 LVLNLPLQ--EAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMI 111
+ + LP + + L+ GT FL+WL + G+G ++V ++
+Sbjct: 135 ISTGLPNMLSGLVPNVGFSFYFTSVVSLVTGTMFLMWLGEQITERGIGNGISILVFGGIV 194
+
+Query: 112 AYIPQDIWNSIQELKISSLW---LALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRF- 167
+ A +P I +I++ + + L L+ Y V VER + RI V
+Sbjct: 195 AGLPSAILQTIEQARQGQMHPLVLLLIAAIVFAVTYFVVFVERGQRRIRVEYAKRQQGRQ 254
+
+Query: 168 ---KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSP 224
+ ++L +++N A MP ++A +++ P + + + L+ G P
+Sbjct: 255 ILGGHSTHLPLKVNMANVMPAIFASSIILFPATLTQWFGQ-NDKFEWLNNLSMLLNPGQP 313
+
+Query: 225 AWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFAL 284
+ + ++Y + I + + + + A+ ++KSG +I + PG T RYI+ ++T L
+Sbjct: 314 LYLLVYAVAIIFFSFFYTAMQYNPRDTADNLKKSGAFIPGIRPGEQTSRYIDKVMTRLTL 373
+
+Query: 285 VGAFYLILISGLPMMV-VLVDIRY 307
+ +G Y+ + +P ++ D+++
+Sbjct: 374 IGGLYVTFVCLVPYIMTSAWDVKF 397
+
+
+>sp|Q9HWF5|SECY_PSEAE Preprotein translocase subunit secY
+ OS=Pseudomonas aeruginosa GN=secY PE=3 SV=1
+ Length = 442
+
+ Score = 273 bits (698), Expect = 1e-72, Method: Composition-based stats.
+ Identities = 73/322 (22%), Positives = 155/322 (48%), Gaps = 17/322 (5%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++S+ +I Q+ + L +L E + RR T+V+AL+Q++
+Sbjct: 75 SIFALGIMPYISASIIMQLMT-AISPQLEQLKKEGESGRRKISQYTRYGTVVLALVQAIG 133
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ + + L Q A + + +AG F++WL + G+G M++ A ++A
+Sbjct: 134 MSVGLGSQGVAFSNDFGFYFVAVTTFVAGAMFMMWLGEQITERGVGNGISMLIFAGIVAG 193
+
+Query: 114 IPQDIWNSIQELKISSLWLALML---VFSLVFLYLAVTVERSKYRIPVNKINIHNRFK-- 168
+ +P+ I S + + + + ++ + ++ + V +ER + RI V+ K
+Sbjct: 194 LPRAIGQSFESARQGDINIFALIGVGLLAVAIIAFVVFIERGQRRIAVHYAKRQQGRKVF 253
+
+Query: 169 --KYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAW 226
+ + S+L +++N AG +P ++A +++ P + ++ +A++ G P
+Sbjct: 254 AAQTSHLPLKVNMAGVIPAIFASSILLFPASLGSWFGQSEGLG-WLQDVAQAIAPGQPLN 312
+
+Query: 227 FILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVG 286
+ +L+ I + + + +AE ++KSG +I + PG + RYI+G++T + G
+Sbjct: 313 ILLFTAGIVFFCFFYTALMFNPKDVAENLKKSGAFIPGIRPGEQSARYIDGVLTRLTMFG 372
+
+Query: 287 AFYLILISGLP-MMVVLVDIRY 307
+ A Y+ + LP +VV + +
+Sbjct: 373 ALYMTAVCLLPQFLVVAAHVPF 394
+
+
+>sp|Q59912|SECY_STRGB Preprotein translocase subunit secY
+ OS=Streptomyces galbus GN=secY PE=3 SV=1
+ Length = 437
+
+ Score = 268 bits (686), Expect = 4e-71, Method: Composition-based stats.
+ Identities = 71/322 (22%), Positives = 142/322 (44%), Gaps = 26/322 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ ++F++G+ P++++ +I Q+ V L L E Q LT+ +A++Q
+Sbjct: 73 TIFALGIMPYITASIILQLLTVV-IPRLEALKKEGQAGTAKITQYTRYLTVALAILQGTG 131
+
+Query: 55 LVLNLPLQEAAG----------VDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-I 103
+ LV G + + + AGT ++WL +L G+G
+Sbjct: 132 LVATARSAPLFGRCSVGGQIVPDQSIFTTITMVICMTAGTCVVMWLGELITDRGIGNGMS 191
+
+Query: 104 MIVMASMIAYIPQDIWNSIQELKISSLWLAL--MLVFSLVFLYLAVTVERSKYRIPVNKI 161
+ +++ S+ A P +W ++ ++ W+ ++ L+ + L V VE+++ RIPV
+Sbjct: 192 ILMFISIAATFPSALWAIKKQGTLAGGWIEFGTVIAVGLIMVALVVFVEQAQRRIPVQYA 251
+
+Query: 162 ----NIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIE 217
+ + +Y+ +++N AG +P+++A +L+ IP +EQ
+Sbjct: 252 KRMIGRRSYGGTSTYIPLKVNQAGVIPVIFASSLLYIPALVAQFAGGNSGWKSWVEQ--N 309
+
+Query: 218 ALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYING 277
+ P + + Y L I A + I+ + +++A+ M+K G +I + G T Y++
+Sbjct: 310 LTKGDHPIYIVTYFLLIVFFAFFYVAISFNPEEVADNMKKYGGFIPGIRAGRPTAEYLSY 369
+
+Query: 278 LVTYFALVGAFYLILISGLPMM 299
+ ++ G+ YL LI+ +P M
+Sbjct: 370 VLNRITWPGSLYLGLIALVPTM 391
+
+
+>sp|Q05217|SECY_STACT Preprotein translocase subunit secY
+ OS=Staphylococcus carnosus (strain TM300) GN=secY PE=3
+ SV=2
+ Length = 430
+
+ Score = 264 bits (676), Expect = 5e-70, Method: Composition-based stats.
+ Identities = 62/319 (19%), Positives = 149/319 (46%), Gaps = 24/319 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + ++ + R+ +++A IQS+
+Sbjct: 69 SIFAMGIMPYITASIVMQLLQMDIVPKFTEWAKQGDVGRKKLNNVTRYFAIILAFIQSIG 128
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + +L +VL GT FL+WL + G+G +I+ A +
+Sbjct: 129 MAFQFNNYLKGALIIDPSPMSYLLIAIVLTTGTAFLLWLGEQITQYGVGNGISIIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKIS-------SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ ++ +P + Q+ + L +A +++ ++ AV V ++ +IP+
+Sbjct: 189 LSTLPSSLIQFYQQAFVGQSDTTMAWLQVAGLVIGLVLLTMGAVYVLQAVRKIPIQYAKK 248
+
+Query: 164 HNR---FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + +YL +++N AG +P+++AM +P+ + P+ +Q +
+Sbjct: 249 QSTQRLGSNATYLPLKVNSAGVIPVIFAMAFFLLPRTLTMFF----PKADWAQQIANTAN 304
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ S ++Y++ I +AF+ ++ +++++ ++K G Y+ + PG T++YI ++
+Sbjct: 305 PSSNIGMVIYIILIIAFTYFYAFVQVNPEKMSDNLKKQGSYVPGIRPGEQTKKYITKVLY 364
+
+Query: 281 YFALVGAFYLILISGLPMM 299
+ VG+ +L +I+ LP++
+Sbjct: 365 RLTFVGSIFLAVIAILPIL 383
+
+
+>sp|Q59916|SECY_STRGR Preprotein translocase subunit secY
+ OS=Streptomyces griseus GN=secY PE=3 SV=1
+ Length = 437
+
+ Score = 260 bits (664), Expect = 1e-68, Method: Composition-based stats.
+ Identities = 73/325 (22%), Positives = 147/325 (45%), Gaps = 26/325 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ ++F++G+ P++++ +I Q+ V L L E Q LT+ +A++Q
+Sbjct: 72 TIFALGIMPYITASIILQLLTVV-IPRLEALKKEGQSGTAKITQYTRYLTVALAILQGTG 130
+
+Query: 55 LVLNLPLQ----------EAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIM 104
+ LV + ++ L + AGT ++WL +L G+G +
+Sbjct: 131 LVATARSGALFQNCSVGSQIVADKSIFTTIIMVLTMTAGTPPVMWLGELITDRGIGNGMS 190
+
+Query: 105 I-VMASMIAYIPQDIWNSIQELKISSLWLAL--MLVFSLVFLYLAVTVERSKYRIPVN-- 159
+ I + S+ A P +W + K++ W+ +++ V + L V VE+++ RIPV
+Sbjct: 191 IPMFISIAATFPGALWAIKESGKLADGWIEFGTVILIGFVMVALVVFVEQAQRRIPVQLP 250
+
+Query: 160 --KINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIE 217
+ I + +Y+ +++N AG +P+++A +L+ IP + + I+
+Sbjct: 251 KRMIGRRSYGGTSTYIPLKVNQAGVIPVIFASSLLYIPALIVQFSNSQAGWATWIQD--N 308
+
+Query: 218 ALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYING 277
+ ++ P + Y + I A + I+ + D++A+ M+K G +I + G T Y++
+Sbjct: 309 FVTGDHPYYIATYFVLIVFFAFFYVAISFNPDEVADNMKKYGGFIPGIRAGRPTAEYLSY 368
+
+Query: 278 LVTYFALVGAFYLILISGLPMMVVL 302
+ ++ G+ YL LI+ +P M +
+Sbjct: 369 VLNRITWPGSLYLGLIALVPTMALA 393
+
+
+>sp|O33006|SECY_MYCLE Preprotein translocase subunit secY
+ OS=Mycobacterium leprae GN=secY PE=3 SV=1
+ Length = 438
+
+ Score = 259 bits (662), Expect = 3e-68, Method: Composition-based stats.
+ Identities = 70/348 (20%), Positives = 146/348 (41%), Gaps = 30/348 (8%)
+
+Query: 3 FSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVALV 56
+ +VG+ P++++ +I Q+ V +L E Q L + +A++Q+ ++V
+Sbjct: 74 LTVGVMPYITASIIVQLLTVV-IPRFEELRKEGQAGQAKMTQYTRYLAIALAVLQATSIV 132
+
+Query: 57 LNLPLQE--------AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVM 107
+ +V+ LV+ G ++W+ +L G+G +++
+Sbjct: 133 ALAANGGLLQGCQEDIISDQSIFSLVVIVLVMTGGAALVMWMGELITERGIGNGMSLLIF 192
+
+Query: 108 ASMIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKI----NI 163
+ + A IP + + + A + + +LV + V VE+ + RIPV
+Sbjct: 193 VGIAARIPAEGKQILDS--RGGVIFAAVCLAALVIIVGVVFVEQGQRRIPVQYAKRMVGR 250
+
+Query: 164 HNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQP---ENQLIEQWIEALS 220
+ +YL +++N AG +P+++A +L+ IP ++ ++ + LS
+Sbjct: 251 RMYGGTSTYLPLKVNQAGVIPVIFASSLIYIPHLITQLVRSGSGGVGKSWWDKFVGTYLS 310
+
+Query: 221 -MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLV 279
+ P + +Y I + + + D+ A+ M+K G +I + PG T Y+ ++
+Sbjct: 311 DPADPVYINIYFGLIIFFTYFYVSVTFNPDERADEMKKFGGFIPGIRPGRPTADYLRYVL 370
+
+Query: 280 TYFALVGAFYLILISGLPMMVVLVD----IRYLRLSMIPGIFMIFIGM 323
+ + L G+ YL I+ LP + + + ++ L + MI +G+
+Sbjct: 371 SRITLPGSIYLGAIAVLPNLFLQIGNGGEVQNLPFGGTAVLIMIGVGL 418
+
+
+>sp|P38376|SECY_CORGL Preprotein translocase subunit secY
+ OS=Corynebacterium glutamicum GN=secY PE=3 SV=1
+ Length = 440
+
+ Score = 258 bits (660), Expect = 4e-68, Method: Composition-based stats.
+ Identities = 71/328 (21%), Positives = 146/328 (44%), Gaps = 26/328 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ S+F++G+ P++++ +I Q+ V +L E Q LT+ +AL+QS
+Sbjct: 73 SIFAIGIMPYITASIIVQLLTVV-IPHFEELKKEGQSGQAKMMQYTRYLTVALALLQSSG 131
+
+Query: 55 LV--------LNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMI 105
+ +V L ++ + +++ + + AG ++W+ +L G+G ++
+Sbjct: 132 IVALADREQLLGAGIRVLSADRNFFDLIVLVITMTAGAVLVMWMGELITEKGVGNGMSLL 191
+
+Query: 106 VMASMIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKI---- 161
+ + A + +P D N + + A++L L+ + V VE+ + RIPV
+Sbjct: 192 IFAGIATRLPTDGMNIL--GNSGGVVFAVVLASVLILVIGVVFVEQGQRRIPVQYAKRMV 249
+
+Query: 162 NIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQ---PENQLIEQWIEA 218
+ +YL +++N AG +P+++A +L+ +P I++ +N I
+Sbjct: 250 GRRQYGGSSTYLPLKVNQAGVIPVIFASSLIYMPVLITQIVNSGSLEVSDNWWQRNIIAH 309
+
+Query: 219 LS-MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYING 277
+ L S + +LY + + + + AE M+K G +I + PG T Y+
+Sbjct: 310 LQTPSSWQYIVLYFALTIFFSYFYVSVQYDPAEQAENMKKYGGFIPGIRPGRPTAEYLGF 369
+
+Query: 278 LVTYFALVGAFYLILISGLPMMVVLVDI 305
+ ++ VG+ YL +I+ LP +++ + +
+Sbjct: 370 VMNRLLFVGSLYLAVIAVLPNIMLDLGV 397
+
+
+>sp|P77964|SECY_SYNY3 Preprotein translocase subunit secY
+ OS=Synechocystis sp. (strain PCC 6803) GN=secY PE=3 SV=1
+ Length = 442
+
+ Score = 258 bits (659), Expect = 5e-68, Method: Composition-based stats.
+ Identities = 70/320 (21%), Positives = 150/320 (46%), Gaps = 19/320 (5%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ +F++G+ P++++ +I Q+ + E + RR + +IQ +
+Sbjct: 79 GIFALGILPYINASIIMQLLTAAIPALEDLQKNEGEAGRRKISQYSRYIAFGWCIIQGLG 138
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ L + L L+ A + L + AG+ F++W+++L G+G +++ +++A
+Sbjct: 139 LTVGL-LRPYANNYGPLFIFQTVLAITAGSMFVMWISELITERGIGNGASLLIFVNIVAT 197
+
+Query: 114 IPQDIWNSIQ----ELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHN---- 165
+ +PQ + +I+ + S + L+++ LV + V V+ RIP+
+Sbjct: 198 LPQTLGQTIEYAQSGGRQSITAVVLLMLVFLVMIVGIVFVQEGTRRIPIISARRQVGKKL 257
+
+Query: 166 RFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHF---LQPENQLIEQWIEALSMG 222
+ ++ SYL +RLN G MPI++A ++ +P L ++ Q AL G
+Sbjct: 258 YRERTSYLPLRLNQGGVMPIIFASAVLILPSSLAGFATGNEGLGGFGEIFVQISNALRPG 317
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ + + ++Y + IF + +A + ++ + +++ ++K G I + PG T +Y+ G++
+Sbjct: 318 TWVYTVVYSVMIFFFSYFYASLIVNPEDVSKNLKKMGSSIPGIRPGKKTEQYLEGVLNRL 377
+
+Query: 283 ALVGAFYLILISGLPMMVVL 302
+ +GA +L ++ LP+ V
+Sbjct: 378 TFLGAIFLSFVATLPIFVEQ 397
+
+
+>sp|P27148|SECY_LACLC Preprotein translocase subunit secY
+ OS=Lactococcus lactis subsp. cremoris GN=secY PE=3 SV=3
+ Length = 439
+
+ Score = 256 bits (654), Expect = 2e-67, Method: Composition-based stats.
+ Identities = 74/329 (22%), Positives = 159/329 (48%), Gaps = 21/329 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ SLF++G+SP++++ +I Q+ + + + + RR +TLV+A+ QS+
+Sbjct: 69 SLFAMGVSPYITASIIVQLLQMDILPKFVEWSKQGEIGRRKLNQATRYITLVLAMAQSIG 128
+
+Query: 55 LVLNLPLQE---AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + ++ ++L G+ + W+ + G G +I+ A +
+Sbjct: 129 ITAGFQAMSSLNIVQNPNWQSYLMIGVLLTTGSMVVTWMGEQINEKGFGSGVSVIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKI---------SSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKI 161
+ ++ IP I + E + S +++ +++ ++V +Y+ V++++ ++P+
+Sbjct: 189 VSGIPSAIKSVYDEKFLNVRPSEIPMSWIFVIGLILSAIVIIYVTTFVQQAERKVPIQYT 248
+
+Query: 162 NIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPEN-QLIEQWIEALS 220
+ + SYL +R+NPAG +P+++A ++ + P L + Q N + ALS
+Sbjct: 249 KLTQGAPTSSYLPLRVNPAGVIPVIFAGSITTAPATILQFLQRSQGSNVGWLSTLQNALS 308
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ + + Y L I + ++F+ ++ +++AE +QK G YI +V PG T +Y++ L+
+Sbjct: 309 YTTWTGMLFYALLIVLFTFFYSFVQVNPEKMAENLQKQGSYIPSVRPGKGTEKYVSRLLM 368
+
+Query: 281 YFALVGAFYLILISGLPMMVVL-VDIRYL 308
+ A VG+ +L LIS +P+ + +
+Sbjct: 369 RLATVGSLFLGLISIIPIAAQNVWGLPKI 397
+
+
+>sp|Q8CNF3|SECY_STAES Preprotein translocase subunit secY
+ OS=Staphylococcus epidermidis (strain ATCC 12228)
+ GN=secY PE=3 SV=1
+ Length = 430
+
+ Score = 255 bits (652), Expect = 3e-67, Method: Composition-based stats.
+ Identities = 65/309 (21%), Positives = 146/309 (47%), Gaps = 24/309 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + ++ + + RR +++A IQS+
+Sbjct: 69 SIFAMGIMPYITASIVMQLLQMDIVPKFTEWAKQGEMGRRKINNVTRYFAIILAFIQSIG 128
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + + +L +VL AGT FLIWL D G+G +I+ A +
+Sbjct: 129 MAFQFNNYLKGQLIIEKSVMSYLLIAVVLTAGTAFLIWLGDQITQFGVGNGISLIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKIS-------SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ ++ +P + Q + + L + ++V ++ A+ V +K +IP+
+Sbjct: 189 LSTLPSSLEQFAQSVFVGQDDTSLAWLKILGLIVALILLTVGAIFVLEAKRKIPIQYAKK 248
+
+Query: 164 HNR---FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + + +YL +++N AG +P+++AM +P+ L P+ + + + +
+Sbjct: 249 QSAQRLGSQATYLPLKVNSAGVIPVIFAMAFFLLPRTLTLFF----PKAEWAQNIADTAN 304
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ S I+Y++ I A +AF+ ++ +++A+ ++K G Y+ + PG T++YI ++
+Sbjct: 305 PSSNIGMIIYVVLIIAFAYFYAFVQVNPEKMADNLKKQGSYVPGIRPGEQTKKYITKVLY 364
+
+Query: 281 YFALVGAFY 289
+ VG+ +
+Sbjct: 365 RLTFVGSIF 373
+
+
+>sp|Q5HM19|SECY_STAEQ Preprotein translocase subunit secY
+ OS=Staphylococcus epidermidis (strain ATCC 35984 /
+ RP62A) GN=secY PE=3 SV=1
+ Length = 430
+
+ Score = 255 bits (652), Expect = 3e-67, Method: Composition-based stats.
+ Identities = 65/309 (21%), Positives = 146/309 (47%), Gaps = 24/309 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + ++ + + RR +++A IQS+
+Sbjct: 69 SIFAMGIMPYITASIVMQLLQMDIVPKFTEWAKQGEMGRRKINNVTRYFAIILAFIQSIG 128
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + + +L +VL AGT FLIWL D G+G +I+ A +
+Sbjct: 129 MAFQFNNYLKGQLIIEKSVMSYLLIAVVLTAGTAFLIWLGDQITQFGVGNGISLIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKIS-------SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ ++ +P + Q + + L + ++V ++ A+ V +K +IP+
+Sbjct: 189 LSTLPSSLEQFAQSVFVGQDDTSLAWLKILGLIVALILLTVGAIFVLEAKRKIPIQYAKK 248
+
+Query: 164 HNR---FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + + +YL +++N AG +P+++AM +P+ L P+ + + + +
+Sbjct: 249 QSAQRLGSQATYLPLKVNSAGVIPVIFAMAFFLLPRTLTLFF----PKAEWAQNIADTAN 304
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ S I+Y++ I A +AF+ ++ +++A+ ++K G Y+ + PG T++YI ++
+Sbjct: 305 PSSNIGMIIYVVLIIAFAYFYAFVQVNPEKMADNLKKQGSYVPGIRPGEQTKKYITKVLY 364
+
+Query: 281 YFALVGAFY 289
+ VG+ +
+Sbjct: 365 RLTFVGSIF 373
+
+
+>sp|P46785|SECY_STRCO Preprotein translocase subunit secY
+ OS=Streptomyces coelicolor GN=secY PE=3 SV=2
+ Length = 437
+
+ Score = 255 bits (652), Expect = 3e-67, Method: Composition-based stats.
+ Identities = 71/325 (21%), Positives = 146/325 (44%), Gaps = 26/325 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ ++F++G+ P++++ +I Q+ V L L E Q LT+ +A++Q
+Sbjct: 73 TVFALGIMPYITASIILQLLTVV-IPRLEALKKEGQAGTAKITQYTRYLTVALAILQGTG 131
+
+Query: 55 LVLNLPLQ----------EAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-I 103
+ LV + V+ + + AGT ++WL +L G+G
+Sbjct: 132 LVATARSGALFSGCTVAGQIVPDQAIFTTVVMVICMTAGTCVVMWLGELITDRGIGNGMS 191
+
+Query: 104 MIVMASMIAYIPQDIWNSIQELKISSLWLAL--MLVFSLVFLYLAVTVERSKYRIPVNKI 161
+ +++ S+ A P +W ++ +++ W+ +++ LV + L V VE+++ RIPV
+Sbjct: 192 ILMFISIAATFPSALWAIKKQGELADGWIEFGTVILVGLVMVGLVVFVEQAQRRIPVQYA 251
+
+Query: 162 ----NIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIE 217
+ + +Y+ +++N AG +P+++A +L+ IP + + I +
+Sbjct: 252 KRMIGRRSYGGTSTYIPLKVNQAGVIPVIFASSLLYIPALIVQFSNSTAGWATWITK--N 309
+
+Query: 218 ALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYING 277
+ + ILY I A + I+ + +++A+ M+K G +I + G T Y++
+Sbjct: 310 LADTAATPHIILYFFLIVFFAFFYVAISFNPEEVADNMKKYGGFIPGIRAGRPTAEYLSY 369
+
+Query: 278 LVTYFALVGAFYLILISGLPMMVVL 302
+ ++ G+ YL LI+ +P M +
+Sbjct: 370 VLNRITWPGSLYLGLIALVPTMALA 394
+
+
+>sp|P49977|SECY_STRLI Preprotein translocase subunit secY
+ OS=Streptomyces lividans GN=secY PE=3 SV=1
+ Length = 437
+
+ Score = 255 bits (651), Expect = 4e-67, Method: Composition-based stats.
+ Identities = 71/325 (21%), Positives = 146/325 (44%), Gaps = 26/325 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ ++F++G+ P++++ +I Q+ V L L E Q LT+ +A++Q
+Sbjct: 73 TVFALGIMPYITASIILQLLTVV-IPRLEALKKEGQAGTAKITQYTRYLTVALAILQGTG 131
+
+Query: 55 LVLNLPLQ----------EAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-I 103
+ LV + V+ + + AGT ++WL +L G+G
+Sbjct: 132 LVATARSGALFSGCTVAGQIVPDQAIFTTVVMVICMTAGTCVVMWLGELITDRGIGNGMS 191
+
+Query: 104 MIVMASMIAYIPQDIWNSIQELKISSLWLAL--MLVFSLVFLYLAVTVERSKYRIPVNKI 161
+ +++ S+ A P +W ++ +++ W+ +++ LV + L V VE+++ RIPV
+Sbjct: 192 ILMFISIAATFPSALWAIKKQGELADGWIEFGTVILVGLVMVGLVVFVEQAQRRIPVQYA 251
+
+Query: 162 ----NIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIE 217
+ + +Y+ +++N AG +P+++A +L+ IP + + I +
+Sbjct: 252 KRMIGRRSYGGTSTYIPLKVNQAGVIPVIFASSLLYIPALIVQFSNSTAGWATWITK--N 309
+
+Query: 218 ALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYING 277
+ + ILY I A + I+ + +++A+ M+K G +I + G T Y++
+Sbjct: 310 LADTAATPHIILYFFLIVFFAFFYVAISFNPEEVADNMKKYGGFIPGIRAGRPTAEYLSY 369
+
+Query: 278 LVTYFALVGAFYLILISGLPMMVVL 302
+ ++ G+ YL LI+ +P M +
+Sbjct: 370 VLNRITWPGSLYLGLIALVPTMALA 394
+
+
+>sp|P93690|SECY_SPIOL Preprotein translocase subunit secY,
+ chloroplastic OS=Spinacia oleracea GN=SECY PE=2 SV=1
+ Length = 545
+
+ Score = 255 bits (651), Expect = 4e-67, Method: Composition-based stats.
+ Identities = 62/315 (19%), Positives = 151/315 (47%), Gaps = 20/315 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ + S+G+ P++++ +++Q+ + E + R+ ++ AL+Q++
+Sbjct: 190 GICSLGIVPFINAQIVFQLLSQVYPKLQDLQKKEGEAGRKKIKQYTQYASVGFALVQAIG 249
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ VL L + T ++ ++L G+ F +L + + + LG +++ ++I+Y
+Sbjct: 250 QVLFL--RPYVNDYSTEWVLSSVILLTLGSVFTTYLGERISDLKLGNGTSLLIFTNIISY 307
+
+Query: 114 IPQDIWNSIQELKISSLW--LALMLVFSLVFLYLAVTVERSKYRIPVNKI----NIHNRF 167
+ +P ++ E + LA+++V + ++ V V+ ++ +IP+N
+Sbjct: 308 LPASFGRTVAEAYQEGNYTGLAIIVVSFVSLVFGIVYVQEAERKIPMNYASRYSGKSGGL 367
+
+Query: 168 KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWF 227
+ +K +YL ++N AG MPI+++ + +S+P ++++ AL+ G +
+Sbjct: 368 QKSAYLPFKVNSAGVMPIIFSTSSLSLPATLARFTGLD-----ILKKAAVALTPGGSFYL 422
+
+Query: 228 ILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGA 287
+ +L I + F+ + D ++E++++ G I V PG +T YI +++ +++G+
+Sbjct: 423 PTNILLIAFFNYYYTFLQLDPDDVSEQLKRQGASIPLVRPGKSTAAYIKTVLSRISVLGS 482
+
+Query: 288 FYLILISGLPMMVVL 302
+ +L +++ P +V
+Sbjct: 483 GFLAILAAGPAVVEQ 497
+
+
+>sp|Q7A086|SECY_STAAW Preprotein translocase subunit secY
+ OS=Staphylococcus aureus (strain MW2) GN=secY PE=3 SV=1
+ Length = 430
+
+ Score = 254 bits (650), Expect = 5e-67, Method: Composition-based stats.
+ Identities = 72/327 (22%), Positives = 152/327 (46%), Gaps = 25/327 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + S+ + + RR L + +A IQS+
+Sbjct: 69 SIFAMGIVPYITASIVMQLLQMDIVPKFSEWAKQGEVGRRKLNNVTRYLAISLAFIQSIG 128
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + +L LVL AGT FLIWL D G+G +I+ A +
+Sbjct: 129 MAFQFNNYLKGALIINQSIMSYLLIALVLTAGTAFLIWLGDQITQFGVGNGISIIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKIS-------SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ ++ +P + Q + L + +LV ++ A+ V + +IP+
+Sbjct: 189 LSTLPASLIQFGQTAFVGQEDTSLAWLKVLGLLVSLILLTVGAIYVLEAVRKIPIQYAKK 248
+
+Query: 164 HNR---FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + +YL +++N AG +P+++AM +P+ L P+ + + A +
+Sbjct: 249 QTAQRLGSQATYLPLKVNSAGVIPVIFAMAFFLLPRTLTLF----YPDKEWAQNIANAAN 304
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ S ++Y++ I + +AF+ ++ +++A+ ++K G Y+ + PG T++YI ++
+Sbjct: 305 PSSNVGMVVYIVLIILFTYFYAFVQVNPEKMADNLKKQGSYVPGIRPGEQTKKYITKVLY 364
+
+Query: 281 YFALVGAFYLILISGLPMMVV-LVDIR 306
+ VG+ +L +IS LP++ + +
+Sbjct: 365 RLTFVGSIFLAVISILPILATKFMGLP 391
+
+
+>sp|Q6G791|SECY_STAAS Preprotein translocase subunit secY
+ OS=Staphylococcus aureus (strain MSSA476) GN=secY PE=3
+ SV=1
+ Length = 430
+
+ Score = 254 bits (650), Expect = 5e-67, Method: Composition-based stats.
+ Identities = 72/327 (22%), Positives = 152/327 (46%), Gaps = 25/327 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + S+ + + RR L + +A IQS+
+Sbjct: 69 SIFAMGIVPYITASIVMQLLQMDIVPKFSEWAKQGEVGRRKLNNVTRYLAISLAFIQSIG 128
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + +L LVL AGT FLIWL D G+G +I+ A +
+Sbjct: 129 MAFQFNNYLKGALIINQSIMSYLLIALVLTAGTAFLIWLGDQITQFGVGNGISIIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKIS-------SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ ++ +P + Q + L + +LV ++ A+ V + +IP+
+Sbjct: 189 LSTLPASLIQFGQTAFVGQEDTSLAWLKVLGLLVSLILLTVGAIYVLEAVRKIPIQYAKK 248
+
+Query: 164 HNR---FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + +YL +++N AG +P+++AM +P+ L P+ + + A +
+Sbjct: 249 QTAQRLGSQATYLPLKVNSAGVIPVIFAMAFFLLPRTLTLF----YPDKEWAQNIANAAN 304
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ S ++Y++ I + +AF+ ++ +++A+ ++K G Y+ + PG T++YI ++
+Sbjct: 305 PSSNVGMVVYIVLIILFTYFYAFVQVNPEKMADNLKKQGSYVPGIRPGEQTKKYITKVLY 364
+
+Query: 281 YFALVGAFYLILISGLPMMVV-LVDIR 306
+ VG+ +L +IS LP++ + +
+Sbjct: 365 RLTFVGSIFLAVISILPILATKFMGLP 391
+
+
+>sp|Q6GEK3|SECY_STAAR Preprotein translocase subunit secY
+ OS=Staphylococcus aureus (strain MRSA252) GN=secY PE=3
+ SV=1
+ Length = 430
+
+ Score = 254 bits (650), Expect = 5e-67, Method: Composition-based stats.
+ Identities = 72/327 (22%), Positives = 152/327 (46%), Gaps = 25/327 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + S+ + + RR L + +A IQS+
+Sbjct: 69 SIFAMGIVPYITASIVMQLLQMDIVPKFSEWAKQGEVGRRKLNNVTRYLAISLAFIQSIG 128
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + +L LVL AGT FLIWL D G+G +I+ A +
+Sbjct: 129 MAFQFNNYLKGALIINQSIMSYLLIALVLTAGTAFLIWLGDQITQFGVGNGISIIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKIS-------SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ ++ +P + Q + L + +LV ++ A+ V + +IP+
+Sbjct: 189 LSTLPASLIQFGQTAFVGQEDTSLAWLKVLGLLVSLILLTVGAIYVLEAVRKIPIQYAKK 248
+
+Query: 164 HNR---FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + +YL +++N AG +P+++AM +P+ L P+ + + A +
+Sbjct: 249 QTAQRLGSQATYLPLKVNSAGVIPVIFAMAFFLLPRTLTLF----YPDKEWAQNIANAAN 304
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ S ++Y++ I + +AF+ ++ +++A+ ++K G Y+ + PG T++YI ++
+Sbjct: 305 PSSNVGMVVYIVLIILFTYFYAFVQVNPEKMADNLKKQGSYVPGIRPGEQTKKYITKVLY 364
+
+Query: 281 YFALVGAFYLILISGLPMMVV-LVDIR 306
+ VG+ +L +IS LP++ + +
+Sbjct: 365 RLTFVGSIFLAVISILPILATKFMGLP 391
+
+
+>sp|Q7A468|SECY_STAAN Preprotein translocase subunit secY
+ OS=Staphylococcus aureus (strain N315) GN=secY PE=1 SV=1
+ Length = 430
+
+ Score = 254 bits (650), Expect = 5e-67, Method: Composition-based stats.
+ Identities = 72/327 (22%), Positives = 152/327 (46%), Gaps = 25/327 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + S+ + + RR L + +A IQS+
+Sbjct: 69 SIFAMGIVPYITASIVMQLLQMDIVPKFSEWAKQGEVGRRKLNNVTRYLAISLAFIQSIG 128
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + +L LVL AGT FLIWL D G+G +I+ A +
+Sbjct: 129 MAFQFNNYLKGALIINQSIMSYLLIALVLTAGTAFLIWLGDQITQFGVGNGISIIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKIS-------SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ ++ +P + Q + L + +LV ++ A+ V + +IP+
+Sbjct: 189 LSTLPASLIQFGQTAFVGQEDTSLAWLKVLGLLVSLILLTVGAIYVLEAVRKIPIQYAKK 248
+
+Query: 164 HNR---FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + +YL +++N AG +P+++AM +P+ L P+ + + A +
+Sbjct: 249 QTAQRLGSQATYLPLKVNSAGVIPVIFAMAFFLLPRTLTLF----YPDKEWAQNIANAAN 304
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ S ++Y++ I + +AF+ ++ +++A+ ++K G Y+ + PG T++YI ++
+Sbjct: 305 PSSNVGMVVYIVLIILFTYFYAFVQVNPEKMADNLKKQGSYVPGIRPGEQTKKYITKVLY 364
+
+Query: 281 YFALVGAFYLILISGLPMMVV-LVDIR 306
+ VG+ +L +IS LP++ + +
+Sbjct: 365 RLTFVGSIFLAVISILPILATKFMGLP 391
+
+
+>sp|Q99S39|SECY_STAAM Preprotein translocase subunit secY
+ OS=Staphylococcus aureus (strain Mu50 / ATCC 700699)
+ GN=secY PE=3 SV=1
+ Length = 430
+
+ Score = 254 bits (650), Expect = 5e-67, Method: Composition-based stats.
+ Identities = 72/327 (22%), Positives = 152/327 (46%), Gaps = 25/327 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + S+ + + RR L + +A IQS+
+Sbjct: 69 SIFAMGIVPYITASIVMQLLQMDIVPKFSEWAKQGEVGRRKLNNVTRYLAISLAFIQSIG 128
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + +L LVL AGT FLIWL D G+G +I+ A +
+Sbjct: 129 MAFQFNNYLKGALIINQSIMSYLLIALVLTAGTAFLIWLGDQITQFGVGNGISIIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKIS-------SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ ++ +P + Q + L + +LV ++ A+ V + +IP+
+Sbjct: 189 LSTLPASLIQFGQTAFVGQEDTSLAWLKVLGLLVSLILLTVGAIYVLEAVRKIPIQYAKK 248
+
+Query: 164 HNR---FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + +YL +++N AG +P+++AM +P+ L P+ + + A +
+Sbjct: 249 QTAQRLGSQATYLPLKVNSAGVIPVIFAMAFFLLPRTLTLF----YPDKEWAQNIANAAN 304
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ S ++Y++ I + +AF+ ++ +++A+ ++K G Y+ + PG T++YI ++
+Sbjct: 305 PSSNVGMVVYIVLIILFTYFYAFVQVNPEKMADNLKKQGSYVPGIRPGEQTKKYITKVLY 364
+
+Query: 281 YFALVGAFYLILISGLPMMVV-LVDIR 306
+ VG+ +L +IS LP++ + +
+Sbjct: 365 RLTFVGSIFLAVISILPILATKFMGLP 391
+
+
+>sp|Q5HDX8|SECY_STAAC Preprotein translocase subunit secY
+ OS=Staphylococcus aureus (strain COL) GN=secY PE=3 SV=1
+ Length = 430
+
+ Score = 254 bits (650), Expect = 5e-67, Method: Composition-based stats.
+ Identities = 72/327 (22%), Positives = 152/327 (46%), Gaps = 25/327 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + S+ + + RR L + +A IQS+
+Sbjct: 69 SIFAMGIVPYITASIVMQLLQMDIVPKFSEWAKQGEVGRRKLNNVTRYLAISLAFIQSIG 128
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + +L LVL AGT FLIWL D G+G +I+ A +
+Sbjct: 129 MAFQFNNYLKGALIINQSIMSYLLIALVLTAGTAFLIWLGDQITQFGVGNGISIIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKIS-------SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ ++ +P + Q + L + +LV ++ A+ V + +IP+
+Sbjct: 189 LSTLPASLIQFGQTAFVGQEDTSLAWLKVLGLLVSLILLTVGAIYVLEAVRKIPIQYAKK 248
+
+Query: 164 HNR---FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + +YL +++N AG +P+++AM +P+ L P+ + + A +
+Sbjct: 249 QTAQRLGSQATYLPLKVNSAGVIPVIFAMAFFLLPRTLTLF----YPDKEWAQNIANAAN 304
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ S ++Y++ I + +AF+ ++ +++A+ ++K G Y+ + PG T++YI ++
+Sbjct: 305 PSSNVGMVVYIVLIILFTYFYAFVQVNPEKMADNLKKQGSYVPGIRPGEQTKKYITKVLY 364
+
+Query: 281 YFALVGAFYLILISGLPMMVV-LVDIR 306
+ VG+ +L +IS LP++ + +
+Sbjct: 365 RLTFVGSIFLAVISILPILATKFMGLP 391
+
+
+>sp|O08387|SECY_STAA8 Preprotein translocase subunit secY
+ OS=Staphylococcus aureus (strain NCTC 8325) GN=secY PE=3
+ SV=2
+ Length = 430
+
+ Score = 254 bits (650), Expect = 5e-67, Method: Composition-based stats.
+ Identities = 72/327 (22%), Positives = 152/327 (46%), Gaps = 25/327 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + S+ + + RR L + +A IQS+
+Sbjct: 69 SIFAMGIVPYITASIVMQLLQMDIVPKFSEWAKQGEVGRRKLNNVTRYLAISLAFIQSIG 128
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + +L LVL AGT FLIWL D G+G +I+ A +
+Sbjct: 129 MAFQFNNYLKGALIINQSIMSYLLIALVLTAGTAFLIWLGDQITQFGVGNGISIIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKIS-------SLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ ++ +P + Q + L + +LV ++ A+ V + +IP+
+Sbjct: 189 LSTLPASLIQFGQTAFVGQEDTSLAWLKVLGLLVSLILLTVGAIYVLEAVRKIPIQYAKK 248
+
+Query: 164 HNR---FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + +YL +++N AG +P+++AM +P+ L P+ + + A +
+Sbjct: 249 QTAQRLGSQATYLPLKVNSAGVIPVIFAMAFFLLPRTLTLF----YPDKEWAQNIANAAN 304
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ S ++Y++ I + +AF+ ++ +++A+ ++K G Y+ + PG T++YI ++
+Sbjct: 305 PSSNVGMVVYIVLIILFTYFYAFVQVNPEKMADNLKKQGSYVPGIRPGEQTKKYITKVLY 364
+
+Query: 281 YFALVGAFYLILISGLPMMVV-LVDIR 306
+ VG+ +L +IS LP++ + +
+Sbjct: 365 RLTFVGSIFLAVISILPILATKFMGLP 391
+
+
+>sp|P58118|SECY_LACLA Preprotein translocase subunit secY
+ OS=Lactococcus lactis subsp. lactis GN=secY PE=3 SV=1
+ Length = 439
+
+ Score = 254 bits (649), Expect = 7e-67, Method: Composition-based stats.
+ Identities = 74/329 (22%), Positives = 159/329 (48%), Gaps = 21/329 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ SLF++G+SP++++ +I Q+ + + + + RR +TLV+A+ QS+
+Sbjct: 69 SLFAMGVSPYITASIIVQLLQMDILPKFVEWSKQGEIGRRKLNQATRYITLVLAMAQSIG 128
+
+Query: 55 LVLNLPLQE---AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + ++ +L G+ + W+ + G G +I+ A +
+Sbjct: 129 ITAGFQAMSSLNIVQNPNWQSYLMIGAILTTGSMVVTWMGEQINEKGFGSGVSVIIFAGI 188
+
+Query: 111 IAYIPQDIWNSIQELKI---------SSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKI 161
+ ++ IP + + E + S L++ +++ +++ +Y+ V++++ ++P+
+Sbjct: 189 VSSIPSAVKSVYDEKFLNVRPSEIPMSWLFVIGLVLSAIIIIYVTTFVQQAERKVPIQYT 248
+
+Query: 162 NIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPEN-QLIEQWIEALS 220
+ + SYL +R+NPAG +P+++A ++ + P L + Q N + +ALS
+Sbjct: 249 KLTQGAPTSSYLPLRVNPAGVIPVIFAGSITTAPATILQFLQRSQGSNVGWLSTLQDALS 308
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ + + Y L I + ++F+ ++ +++AE +QK G YI +V PG T +Y++ L+
+Sbjct: 309 YTTWTGMLFYALLIVLFTFFYSFVQVNPEKMAENLQKQGSYIPSVRPGKGTEKYVSRLLM 368
+
+Query: 281 YFALVGAFYLILISGLPMMVVL-VDIRYL 308
+ A VGA +L LIS +P+ + +
+Sbjct: 369 RLATVGALFLGLISIIPIAAQNVWGLPKI 397
+
+
+>sp|P0A5Z2|SECY_MYCTU Preprotein translocase subunit secY
+ OS=Mycobacterium tuberculosis GN=secY PE=3 SV=1
+ Length = 441
+
+ Score = 253 bits (648), Expect = 9e-67, Method: Composition-based stats.
+ Identities = 70/350 (20%), Positives = 149/350 (42%), Gaps = 30/350 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ ++F+VG+ P++++ +I Q+ V +L E Q L + +A++Q+ +
+Sbjct: 75 TVFAVGVMPYITASIIVQLLTVV-IPRFEELRKEGQAGQSKMTQYTRYLAIALAILQATS 133
+
+Query: 55 LVLNLPLQE--------AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMI 105
+ +V +V+ LV+ G ++W+ +L G+G ++
+Sbjct: 134 IVALAANGGLLQGCSLDIIADQSIFTLVVIVLVMTGGAALVMWMGELITERGIGNGMSLL 193
+
+Query: 106 VMASMIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKI---- 161
+ + + A IP + + ++ + + +L+ + V VE+ + RIPV
+Sbjct: 194 IFVGIAARIPAEGQSILES--RGGVVFTAVCAAALIIIVGVVFVEQGQRRIPVQYAKRMV 251
+
+Query: 162 NIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQP---ENQLIEQWIEA 218
+ +YL +++N AG +P+++A +L+ IP +I + +
+Sbjct: 252 GRRMYGGTSTYLPLKVNQAGVIPVIFASSLIYIPHLITQLIRSGSGVVGNSWWDKFVGTY 311
+
+Query: 219 LS-MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYING 277
+ LS + + +Y I + I + D+ A+ M+K G +I + PG T Y+
+Sbjct: 312 LSDPSNLVYIGIYFGLIIFFTYFYVSITFNPDERADEMKKFGGFIPGIRPGRPTADYLRY 371
+
+Query: 278 LVTYFALVGAFYLILISGLPMMVVLVD----IRYLRLSMIPGIFMIFIGM 323
+ +++ L G+ YL +I+ LP + + + ++ L + MI +G+
+Sbjct: 372 VLSRITLPGSIYLGVIAVLPNLFLQIGAGGTVQNLPFGGTAVLIMIGVGL 421
+
+
+>sp|P0A5Z3|SECY_MYCBO Preprotein translocase subunit secY
+ OS=Mycobacterium bovis GN=secY PE=3 SV=1
+ Length = 441
+
+ Score = 253 bits (648), Expect = 9e-67, Method: Composition-based stats.
+ Identities = 70/350 (20%), Positives = 149/350 (42%), Gaps = 30/350 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ ++F+VG+ P++++ +I Q+ V +L E Q L + +A++Q+ +
+Sbjct: 75 TVFAVGVMPYITASIIVQLLTVV-IPRFEELRKEGQAGQSKMTQYTRYLAIALAILQATS 133
+
+Query: 55 LVLNLPLQE--------AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMI 105
+ +V +V+ LV+ G ++W+ +L G+G ++
+Sbjct: 134 IVALAANGGLLQGCSLDIIADQSIFTLVVIVLVMTGGAALVMWMGELITERGIGNGMSLL 193
+
+Query: 106 VMASMIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKI---- 161
+ + + A IP + + ++ + + +L+ + V VE+ + RIPV
+Sbjct: 194 IFVGIAARIPAEGQSILES--RGGVVFTAVCAAALIIIVGVVFVEQGQRRIPVQYAKRMV 251
+
+Query: 162 NIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQP---ENQLIEQWIEA 218
+ +YL +++N AG +P+++A +L+ IP +I + +
+Sbjct: 252 GRRMYGGTSTYLPLKVNQAGVIPVIFASSLIYIPHLITQLIRSGSGVVGNSWWDKFVGTY 311
+
+Query: 219 LS-MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYING 277
+ LS + + +Y I + I + D+ A+ M+K G +I + PG T Y+
+Sbjct: 312 LSDPSNLVYIGIYFGLIIFFTYFYVSITFNPDERADEMKKFGGFIPGIRPGRPTADYLRY 371
+
+Query: 278 LVTYFALVGAFYLILISGLPMMVVLVD----IRYLRLSMIPGIFMIFIGM 323
+ +++ L G+ YL +I+ LP + + + ++ L + MI +G+
+Sbjct: 372 VLSRITLPGSIYLGVIAVLPNLFLQIGAGGTVQNLPFGGTAVLIMIGVGL 421
+
+
+>sp|P43416|SECY_STRSC Preprotein translocase subunit secY
+ OS=Streptomyces scabies GN=secY PE=3 SV=1
+ Length = 437
+
+ Score = 253 bits (648), Expect = 9e-67, Method: Composition-based stats.
+ Identities = 70/325 (21%), Positives = 144/325 (44%), Gaps = 26/325 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ ++F++G+ P++++ +I Q+ V L L E Q LT+ +A++Q
+Sbjct: 73 TIFALGIMPYITASIILQLLTVV-IPRLEALKKEGQSGTAKITQYTRYLTVALAVLQGTG 131
+
+Query: 55 LVLNLPLQEAAG----------VDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-I 103
+ LV D + + + AGT ++WL +L G+G
+Sbjct: 132 LVATARSGALFSQCPQANNIVPDDSIFTTLTMVVTMTAGTAVVMWLGELITDRGIGNGMS 191
+
+Query: 104 MIVMASMIAYIPQDIWNSIQELKI--SSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKI 161
+ +++ S+ A P +W+ ++ + + +++ LV + L V VE+++ RIPV
+Sbjct: 192 ILMFISIAATFPSALWSIKEQGDLAGGWIEFGIVIAVGLVMVALVVFVEQAQRRIPVQYA 251
+
+Query: 162 ----NIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIE 217
+ + +Y+ +++N AG +P+++A +L+ IP + I++
+Sbjct: 252 KRMIGRRSYGGTSTYIPLKVNQAGIIPVIFASSLLYIPALVVQFSGSTAGWAAWIQK--N 309
+
+Query: 218 ALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYING 277
+ +PA +Y I A + I+ + +++A+ M+K G +I + G T Y++
+Sbjct: 310 LADTAAPAHITVYFFLIIFFAFFYVAISFNPEEVADNMKKYGGFIPGIRAGRPTAEYLSY 369
+
+Query: 278 LVTYFALVGAFYLILISGLPMMVVL 302
+ ++ G+ YL LI+ +P M +
+Sbjct: 370 VLNRITWPGSLYLGLIALVPTMALA 394
+
+
+>sp|Q9XQU4|SECY_PEA Preprotein translocase subunit secY,
+ chloroplastic OS=Pisum sativum GN=SECY PE=2 SV=1
+ Length = 527
+
+ Score = 252 bits (645), Expect = 2e-66, Method: Composition-based stats.
+ Identities = 56/315 (17%), Positives = 145/315 (46%), Gaps = 20/315 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ + S+G+ P++++ +++Q+ A E + ++ A++Q++
+Sbjct: 171 GICSLGIVPFINAQIVFQLLAQVYPKLQDLQKKEGEAGRKKLLQYTRYASVGFAIVQAIG 230
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ VL L + A T + ++L G+ F ++ + + LG +++ ++I+Y
+Sbjct: 231 QVLFL--RPYANDFTTEWALTSVILLTLGSVFTTYIGEQITELKLGNGTSLLIFTNIISY 288
+
+Query: 114 IPQDIWNSIQELKISSLWLAL--MLVFSLVFLYLAVTVERSKYRIPVNKINI----HNRF 167
+ +P + + + ++ L ++V + + V V+ ++ +IP+N +
+Sbjct: 289 LPASFGRTFSQAFSDANYVGLVTIIVSFFLLVLGIVYVQEAERKIPINYASRFTSKSGGI 348
+
+Query: 168 KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWF 227
+ +K +YL ++N +G MPI+++ + +++P + + AL+ G +
+Sbjct: 349 EKSAYLPFKVNSSGVMPIIFSTSSLALPGTLARFTGLSSLKTAAV-----ALNPGGSFYL 403
+
+Query: 228 ILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGA 287
+ +L I + F+ + D ++E++++ G I V PG +T +I +++ +++G+
+Sbjct: 404 PFNILLIAFFNYYYTFLQLDPDDVSEQLKRQGASIPLVRPGKSTATFIKTVLSRISVLGS 463
+
+Query: 288 FYLILISGLPMMVVL 302
+ +L +++ P +V
+Sbjct: 464 TFLAILAAGPAVVEQ 478
+
+
+>sp|P0AGA5|SECY_SHIFL Preprotein translocase subunit secY
+ OS=Shigella flexneri GN=secY PE=3 SV=1
+ Length = 443
+
+ Score = 252 bits (645), Expect = 2e-66, Method: Composition-based stats.
+ Identities = 76/326 (23%), Positives = 151/326 (46%), Gaps = 21/326 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++S+ +I Q+ V L+++ E + RR TLV+A+ QS+
+Sbjct: 76 SIFALGIMPYISASIIIQLLTVVH-PTLAEIKKEGESGRRKISQYTRYGTLVLAIFQSIG 134
+
+Query: 55 LVLNLPLQE----AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIV-MAS 109
+ + LP + L+ GT FL+WL + G+G I I+ A
+Sbjct: 135 IATGLPNMPGMQGLVINPGFAFYFTAVVSLVTGTMFLMWLGEQITERGIGNGISIIIFAG 194
+
+Query: 110 MIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTV---ERSKYRIPVNKINIHNR 166
+ ++A +P I ++I++ + L ++L+ +++ + V ER + RI VN
+Sbjct: 195 IVAGLPPAIAHTIEQARQGDLHFLVLLLVAVLVFAVTFFVVFVERGQRRIVVNYAKRQQG 254
+
+Query: 167 FK----KYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMG 222
+ + + ++L +++N AG +P ++A +++ P N + L G
+Sbjct: 255 RRVYAAQSTHLPLKVNMAGVIPAIFASSIILFPATIASWFGGGTGWN-WLTTISLYLQPG 313
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ P + +LY I + + + + A+ ++KSG ++ + PG T +YI+ ++T
+Sbjct: 314 QPLYVLLYASAIIFFCFFYTALVFNPRETADNLKKSGAFVPGIRPGEQTAKYIDKVMTRL 373
+
+Query: 283 ALVGAFYLILISGLPMMV-VLVDIRY 307
+ LVGA Y+ I +P + + + +
+Sbjct: 374 TLVGALYITFICLIPEFMRDAMKVPF 399
+
+
+>sp|P0AGA2|SECY_ECOLI Preprotein translocase subunit secY
+ OS=Escherichia coli (strain K12) GN=secY PE=1 SV=1
+ Length = 443
+
+ Score = 252 bits (645), Expect = 2e-66, Method: Composition-based stats.
+ Identities = 76/326 (23%), Positives = 151/326 (46%), Gaps = 21/326 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++S+ +I Q+ V L+++ E + RR TLV+A+ QS+
+Sbjct: 76 SIFALGIMPYISASIIIQLLTVVH-PTLAEIKKEGESGRRKISQYTRYGTLVLAIFQSIG 134
+
+Query: 55 LVLNLPLQE----AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIV-MAS 109
+ + LP + L+ GT FL+WL + G+G I I+ A
+Sbjct: 135 IATGLPNMPGMQGLVINPGFAFYFTAVVSLVTGTMFLMWLGEQITERGIGNGISIIIFAG 194
+
+Query: 110 MIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTV---ERSKYRIPVNKINIHNR 166
+ ++A +P I ++I++ + L ++L+ +++ + V ER + RI VN
+Sbjct: 195 IVAGLPPAIAHTIEQARQGDLHFLVLLLVAVLVFAVTFFVVFVERGQRRIVVNYAKRQQG 254
+
+Query: 167 FK----KYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMG 222
+ + + ++L +++N AG +P ++A +++ P N + L G
+Sbjct: 255 RRVYAAQSTHLPLKVNMAGVIPAIFASSIILFPATIASWFGGGTGWN-WLTTISLYLQPG 313
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ P + +LY I + + + + A+ ++KSG ++ + PG T +YI+ ++T
+Sbjct: 314 QPLYVLLYASAIIFFCFFYTALVFNPRETADNLKKSGAFVPGIRPGEQTAKYIDKVMTRL 373
+
+Query: 283 ALVGAFYLILISGLPMMV-VLVDIRY 307
+ LVGA Y+ I +P + + + +
+Sbjct: 374 TLVGALYITFICLIPEFMRDAMKVPF 399
+
+
+>sp|P0AGA3|SECY_ECOL6 Preprotein translocase subunit secY
+ OS=Escherichia coli O6 GN=secY PE=3 SV=1
+ Length = 443
+
+ Score = 252 bits (645), Expect = 2e-66, Method: Composition-based stats.
+ Identities = 76/326 (23%), Positives = 151/326 (46%), Gaps = 21/326 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++S+ +I Q+ V L+++ E + RR TLV+A+ QS+
+Sbjct: 76 SIFALGIMPYISASIIIQLLTVVH-PTLAEIKKEGESGRRKISQYTRYGTLVLAIFQSIG 134
+
+Query: 55 LVLNLPLQE----AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIV-MAS 109
+ + LP + L+ GT FL+WL + G+G I I+ A
+Sbjct: 135 IATGLPNMPGMQGLVINPGFAFYFTAVVSLVTGTMFLMWLGEQITERGIGNGISIIIFAG 194
+
+Query: 110 MIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTV---ERSKYRIPVNKINIHNR 166
+ ++A +P I ++I++ + L ++L+ +++ + V ER + RI VN
+Sbjct: 195 IVAGLPPAIAHTIEQARQGDLHFLVLLLVAVLVFAVTFFVVFVERGQRRIVVNYAKRQQG 254
+
+Query: 167 FK----KYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMG 222
+ + + ++L +++N AG +P ++A +++ P N + L G
+Sbjct: 255 RRVYAAQSTHLPLKVNMAGVIPAIFASSIILFPATIASWFGGGTGWN-WLTTISLYLQPG 313
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ P + +LY I + + + + A+ ++KSG ++ + PG T +YI+ ++T
+Sbjct: 314 QPLYVLLYASAIIFFCFFYTALVFNPRETADNLKKSGAFVPGIRPGEQTAKYIDKVMTRL 373
+
+Query: 283 ALVGAFYLILISGLPMMV-VLVDIRY 307
+ LVGA Y+ I +P + + + +
+Sbjct: 374 TLVGALYITFICLIPEFMRDAMKVPF 399
+
+
+>sp|P0AGA4|SECY_ECO57 Preprotein translocase subunit secY
+ OS=Escherichia coli O157:H7 GN=secY PE=3 SV=1
+ Length = 443
+
+ Score = 252 bits (645), Expect = 2e-66, Method: Composition-based stats.
+ Identities = 76/326 (23%), Positives = 151/326 (46%), Gaps = 21/326 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++S+ +I Q+ V L+++ E + RR TLV+A+ QS+
+Sbjct: 76 SIFALGIMPYISASIIIQLLTVVH-PTLAEIKKEGESGRRKISQYTRYGTLVLAIFQSIG 134
+
+Query: 55 LVLNLPLQE----AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIV-MAS 109
+ + LP + L+ GT FL+WL + G+G I I+ A
+Sbjct: 135 IATGLPNMPGMQGLVINPGFAFYFTAVVSLVTGTMFLMWLGEQITERGIGNGISIIIFAG 194
+
+Query: 110 MIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTV---ERSKYRIPVNKINIHNR 166
+ ++A +P I ++I++ + L ++L+ +++ + V ER + RI VN
+Sbjct: 195 IVAGLPPAIAHTIEQARQGDLHFLVLLLVAVLVFAVTFFVVFVERGQRRIVVNYAKRQQG 254
+
+Query: 167 FK----KYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMG 222
+ + + ++L +++N AG +P ++A +++ P N + L G
+Sbjct: 255 RRVYAAQSTHLPLKVNMAGVIPAIFASSIILFPATIASWFGGGTGWN-WLTTISLYLQPG 313
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ P + +LY I + + + + A+ ++KSG ++ + PG T +YI+ ++T
+Sbjct: 314 QPLYVLLYASAIIFFCFFYTALVFNPRETADNLKKSGAFVPGIRPGEQTAKYIDKVMTRL 373
+
+Query: 283 ALVGAFYLILISGLPMMV-VLVDIRY 307
+ LVGA Y+ I +P + + + +
+Sbjct: 374 TLVGALYITFICLIPEFMRDAMKVPF 399
+
+
+>sp|Q05207|SECY_BACLD Preprotein translocase subunit secY
+ OS=Bacillus licheniformis (strain DSM 13 / ATCC 14580)
+ GN=secY PE=3 SV=2
+ Length = 431
+
+ Score = 250 bits (640), Expect = 8e-66, Method: Composition-based stats.
+ Identities = 68/325 (20%), Positives = 147/325 (45%), Gaps = 26/325 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+ ++G+ P++++ +I Q+ + ++ + + RR T+V+ IQ++
+Sbjct: 68 SILAMGIMPYITASIIIQLLQMDVVPKFTEWSKQGEVGRRKLAQFTRYFTIVLGFIQALG 127
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + +L +VL AGT FL+WL + + G+G +I+ A +
+Sbjct: 128 MSYGFNNMAGGALITDPGVGTYLLIAIVLTAGTAFLMWLGEQITSHGVGNGISIIIFAGI 187
+
+Query: 111 IAYIPQDIWNSI--------QELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKIN 162
+ +A IPQ I +L + + + ++LV L + + ++++ +I +
+Sbjct: 188 VAGIPQTINQIYAQQFVDAGDQLFLQIIKVVVILVAILAIVVGVIFIQQAVRKISIQYAK 247
+
+Query: 163 IHNR----FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEA 218
+ R + ++L +++NPAG +P+++A+ ++ P+ N +
+Sbjct: 248 GSGRSPVPGGQSTHLPLKVNPAGVIPVIFAVAFITTPRTVATFFGSNDVTN----WIQKT 303
+
+Query: 219 LSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGL 278
+ P +Y I +AF+ ++ +Q+A+ ++K G YI V PG T+ I +
+Sbjct: 304 FDYTHPVGMGVYAALIIAFTYFYAFVQVNPEQMADNLKKQGGYIPGVRPGKMTQDRITSI 363
+
+Query: 279 VTYFALVGAFYLILISGLPMMVVLV 303
+ + VG+ +L +I+ LP++ V +
+Sbjct: 364 LYRLTFVGSIFLAVIAILPVLFVNI 388
+
+
+>sp|O63066|SECY_MAIZE Preprotein translocase subunit secY,
+ chloroplastic OS=Zea mays GN=SECY PE=2 SV=1
+ Length = 553
+
+ Score = 250 bits (640), Expect = 8e-66, Method: Composition-based stats.
+ Identities = 56/315 (17%), Positives = 148/315 (46%), Gaps = 20/315 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ + S+G+ P++++ +++Q+ A E + ++ A++Q++
+Sbjct: 195 GICSLGIVPFINAQIVFQLLAQLYPKLQDLQRKEGEAGRKKVLQYTRYASVGFAIVQAIG 254
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ VL L + T ++ +L G+ F ++ + + + LG +++ S+I+Y
+Sbjct: 255 QVLYL--RPYVNDFSTEWVLTSVTLLTLGSVFTTFIGERISDLKLGNGTSLLIFTSIISY 312
+
+Query: 114 IPQDIWNSIQELKISSLWLAL--MLVFSLVFLYLAVTVERSKYRIPVNKINIHNRF---- 167
+ +P ++ + ++ L +++ L+ + V V+ ++ +IP+N + ++
+Sbjct: 313 LPASFGRTVAQAFQDGNYVGLLTIILSFLLLVLGIVYVQEAERKIPLNYASRYSSRTGEL 372
+
+Query: 168 KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWF 227
+ ++ +YL ++N +G MPI+++ + +++P +++ AL+ G +
+Sbjct: 373 QRSAYLPFKVNSSGVMPIIFSTSSLALPGTLARFSGLDF-----LKKAAIALNPGGALYL 427
+
+Query: 228 ILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGA 287
+ +L I + F+ + D ++E++++ G I V PG +T YI ++ +++G+
+Sbjct: 428 PTNVLLIAFFNYYYTFLQLDPDDLSEQLKRQGASIPLVRPGKSTAAYIKTVLNRISVLGS 487
+
+Query: 288 FYLILISGLPMMVVL 302
+ +L +++ P +V
+Sbjct: 488 AFLAVLAAGPSLVEQ 502
+
+
+>sp|P16336|SECY_BACSU Preprotein translocase subunit secY
+ OS=Bacillus subtilis GN=secY PE=3 SV=1
+ Length = 431
+
+ Score = 249 bits (636), Expect = 2e-65, Method: Composition-based stats.
+ Identities = 65/329 (19%), Positives = 148/329 (44%), Gaps = 27/329 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G++P++++ +I Q+ + ++ + + RR T+V+ IQ++
+Sbjct: 68 SIFAMGITPYITASIIIQLLQMDVVPKFTEWSKQGEVGRRKLAQFTRYFTIVLGFIQALG 127
+
+Query: 55 LVLNLPL---QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ + + ++ LVL GT FL+WL + + G+G +I+ A +
+Sbjct: 128 MSYGFNNLANGMLIEKSGVSTYLIIALVLTGGTAFLMWLGEQITSHGVGNGISIIIFAGI 187
+
+Query: 111 IAYIPQDIWNSIQELKISS--------LWLALMLVFSLVFLYLAVTVERSKYRIPVNKIN 162
+ ++ IP+ I + + S + +AL+++ L + + ++++ +I +
+Sbjct: 188 VSSIPKTIGQIYETQFVGSNDQLFIHIVKVALLVIAILAVIVGVIFIQQAVRKIAIQYAK 247
+
+Query: 163 IHN----RFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEA 218
+ + ++L +++NPAG +P+++A+ + P+ N + +
+Sbjct: 248 GTGRSPAGGGQSTHLPLKVNPAGVIPVIFAVAFLITPRTIASFFG----TNDVTKWIQNN 303
+
+Query: 219 LSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGL 278
+ P +Y+ I +AF+ ++ +Q+A+ ++K G YI V PG T+ I +
+Sbjct: 304 FDNTHPVGMAIYVALIIAFTYFYAFVQVNPEQMADNLKKQGGYIPGVRPGKMTQDRITSI 363
+
+Query: 279 VTYFALVGAFYLILISGLP-MMVVLVDIR 306
+ + VG+ +L +IS LP + +
+Sbjct: 364 LYRLTFVGSIFLAVISILPIFFIQFAGLP 392
+
+
+>sp|P38375|SECY_BACHD Preprotein translocase subunit secY
+ OS=Bacillus halodurans GN=secY PE=3 SV=2
+ Length = 430
+
+ Score = 247 bits (632), Expect = 7e-65, Method: Composition-based stats.
+ Identities = 71/321 (22%), Positives = 149/321 (46%), Gaps = 24/321 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++++ ++ Q+ + ++ E + RR T+V+ IQ++
+Sbjct: 68 SIFAMGIMPYITASIVMQLLQMDVVPKFAEWAKEGEAGRRKLAQFTRYGTIVLGFIQALG 127
+
+Query: 55 LVLNLP--LQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMI 111
+ + + ++ + LVL AGT FL+WL + A G+G +I+ A +
+Sbjct: 128 MSVGFNNFFPGLIPNPSVSVYLFIALVLTAGTAFLMWLGEQITAKGVGNGISIIIFAGIA 187
+
+Query: 112 AYIPQDIWNSI--------QELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ A IP + ++L ++ + + L+ + L + + V+++ +IPV
+Sbjct: 188 AGIPNGLNLIYSTRIQDAGEQLFLNIVVILLLALAILAIIVGVIFVQQALRKIPVQYAKR 247
+
+Query: 164 HNRF----KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEAL 219
+ + ++L +++N AG +P+++A++L P + P + IE
+Sbjct: 248 LVGRNPVGGQSTHLPLKVNAAGVIPVIFALSLFIFPPTVAGLFGSDHPVAAWV---IETF 304
+
+Query: 220 SMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLV 279
+ P +Y L I + FI ++ +++AE ++K G YI + PG AT+ YI ++
+Sbjct: 305 DYTHPIGMAVYALLIIGFTYFYTFIQVNPERMAENLKKQGGYIPGIRPGKATQTYITRIL 364
+
+Query: 280 TYFALVGAFYLILISGLPMMV 300
+ VG+ +L +++ LP+
+Sbjct: 365 YRLTFVGSLFLAVVAILPVFF 385
+
+
+>sp|Q38885|SECY_ARATH Preprotein translocase subunit secY,
+ chloroplastic OS=Arabidopsis thaliana GN=SECY PE=1 SV=2
+ Length = 551
+
+ Score = 247 bits (632), Expect = 7e-65, Method: Composition-based stats.
+ Identities = 58/316 (18%), Positives = 143/316 (45%), Gaps = 20/316 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ + S+G+ P++++ +++Q+ A E + ++ A++Q++
+Sbjct: 193 GICSLGIVPFINAQIVFQLLAQVYPKLQDLQKKEGEAGRKKILQYTRYASVGFAIVQAIG 252
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ V L + T +V +L G+ ++ + + + LG +++ S+I+Y
+Sbjct: 253 QVFYL--RPYVNDFSTEWVVSSVTLLTLGSVLTTYIGERISDLKLGNGTSLLIFTSIISY 310
+
+Query: 114 IPQDIWNSIQELKISSLWLAL--MLVFSLVFLYLAVTVERSKYRIPVNKINIH----NRF 167
+ +P + E + L ++V L+ + V V+ ++ +IP+N + +
+Sbjct: 311 LPASFGRTTAEALQEGNYTGLGTIVVSFLLLVLGIVYVQEAERKIPLNYASRYTSKAGGL 370
+
+Query: 168 KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWF 227
+ +K +YL ++N AG MPI+++ + +++P ++ AL+ G +
+Sbjct: 371 QKSAYLPFKVNSAGVMPIIFSTSSLALPATLARFTGI-----SALKNVAFALTPGGSFYL 425
+
+Query: 228 ILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGA 287
+ +L I + F+ + D ++E++++ G I V PG +T +I ++ +++G+
+Sbjct: 426 PTNILLIAFFNYYYTFLQLDPDDVSEQLKRQGASIPLVRPGKSTALFIKTVLGRISVLGS 485
+
+Query: 288 FYLILISGLPMMVVLV 303
+ +L +++ P +V +
+Sbjct: 486 AFLAVLAAGPAVVEQI 501
+
+
+>sp|P0A4H1|SECY_SYNP6 Preprotein translocase subunit secY
+ OS=Synechococcus sp. (strain ATCC 27144 / PCC 6301 /
+ SAUG 1402/1) GN=secY PE=3 SV=1
+ Length = 439
+
+ Score = 246 bits (630), Expect = 1e-64, Method: Composition-based stats.
+ Identities = 68/319 (21%), Positives = 150/319 (47%), Gaps = 25/319 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ +F++G+ P++++ +I Q+ + E + RR ++L AL+QS+
+Sbjct: 83 GVFALGILPYINASIILQLLTAAVPALEDLQKNEGEAGRRKIAQLTRYVSLGWALLQSIV 142
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ + + + A + L L+AG+ F++W+++L G+G +++ +++A
+Sbjct: 143 IAVW--VTRYAVTPGPLFTIQTALALVAGSMFVMWISELITERGIGNGASLLIFLNIVAT 200
+
+Query: 114 IPQDIWNSIQELKISS----LWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI----HN 165
+ +P+ + +++ + + ++L+ L + V V+ RIPV
+Sbjct: 201 LPRSLQQTLELAQSGDRSTVGGIVILLIVFLATIVGIVFVQEGTRRIPVVSARRQVGNRV 260
+
+Query: 166 RFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGS-- 223
+ ++ SYL +RLN G MPI++A ++ +P N+++ + LS
+Sbjct: 261 YSERSSYLPLRLNQGGVMPIIFASAILVLPFSLANFT-----SNEVVLRIANYLSPNGPT 315
+
+Query: 224 -PAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ + + YL+ I + ++ + ++ +A+ ++K G I V PG AT +Y+ G++
+Sbjct: 316 PWIYALFYLVLIVAFSYFYSSLILNPVDLAQNLKKMGSSIPGVRPGRATSQYVQGVLNRL 375
+
+Query: 283 ALVGAFYLILISGLPMMVV 301
+ ++GA +L L++ +P V
+Sbjct: 376 TILGAVFLGLVAIIPTAVE 394
+
+
+>sp|P0A4H0|SECY_SYNE7 Preprotein translocase subunit secY
+ OS=Synechococcus elongatus (strain PCC 7942) GN=secY
+ PE=3 SV=1
+ Length = 439
+
+ Score = 246 bits (630), Expect = 1e-64, Method: Composition-based stats.
+ Identities = 68/319 (21%), Positives = 150/319 (47%), Gaps = 25/319 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ +F++G+ P++++ +I Q+ + E + RR ++L AL+QS+
+Sbjct: 83 GVFALGILPYINASIILQLLTAAVPALEDLQKNEGEAGRRKIAQLTRYVSLGWALLQSIV 142
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ + + + A + L L+AG+ F++W+++L G+G +++ +++A
+Sbjct: 143 IAVW--VTRYAVTPGPLFTIQTALALVAGSMFVMWISELITERGIGNGASLLIFLNIVAT 200
+
+Query: 114 IPQDIWNSIQELKISS----LWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI----HN 165
+ +P+ + +++ + + ++L+ L + V V+ RIPV
+Sbjct: 201 LPRSLQQTLELAQSGDRSTVGGIVILLIVFLATIVGIVFVQEGTRRIPVVSARRQVGNRV 260
+
+Query: 166 RFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGS-- 223
+ ++ SYL +RLN G MPI++A ++ +P N+++ + LS
+Sbjct: 261 YSERSSYLPLRLNQGGVMPIIFASAILVLPFSLANFT-----SNEVVLRIANYLSPNGPT 315
+
+Query: 224 -PAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ + + YL+ I + ++ + ++ +A+ ++K G I V PG AT +Y+ G++
+Sbjct: 316 PWIYALFYLVLIVAFSYFYSSLILNPVDLAQNLKKMGSSIPGVRPGRATSQYVQGVLNRL 375
+
+Query: 283 ALVGAFYLILISGLPMMVV 301
+ ++GA +L L++ +P V
+Sbjct: 376 TILGAVFLGLVAIIPTAVE 394
+
+
+>sp|Q6ZG25|SECY_ORYSJ Preprotein translocase subunit secY,
+ chloroplastic OS=Oryza sativa subsp. japonica GN=SECY
+ PE=2 SV=1
+ Length = 556
+
+ Score = 246 bits (629), Expect = 2e-64, Method: Composition-based stats.
+ Identities = 54/316 (17%), Positives = 148/316 (46%), Gaps = 20/316 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ + S+G+ P++++ +++Q+ A E + ++ A++Q++
+Sbjct: 198 GICSLGIVPFINAQIVFQLLAQLYPKLQDLQKKEGEAGRKKVLQYTRYASVGFAIVQAIG 257
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ VL L + T ++ +L G+ F ++ + + + LG +++ S+I+Y
+Sbjct: 258 QVLFL--RPYVNDFSTEWVLTSVTLLTLGSVFTTFIGERISDLKLGNGTSLLIFTSIISY 315
+
+Query: 114 IPQDIWNSIQELKISSLWLAL--MLVFSLVFLYLAVTVERSKYRIPVNKINI----HNRF 167
+ +P ++ + ++ L +++ L + V V+ ++ +IP+N +
+Sbjct: 316 LPASFGRTVAQAFQDGNYVGLLTIILSFLFLVLGIVYVQEAERKIPLNYASRYSSRSGGL 375
+
+Query: 168 KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWF 227
+ ++ +YL ++N +G MPI+++ + +++P + +++ +L+ G +
+Sbjct: 376 QRSAYLPFKVNSSGVMPIIFSTSSLALPGTLARFTGL-----EFLKKAAISLNPGGALYI 430
+
+Query: 228 ILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGA 287
+ +L I + F+ + D ++E++++ G I V PG +T +I +++ +++G+
+Sbjct: 431 PTNVLLIAFFNYYYTFLQLDPDDLSEQLKRQGASIPLVRPGKSTAAFIKTVLSNISVLGS 490
+
+Query: 288 FYLILISGLPMMVVLV 303
+ +L +++ P +V +
+Sbjct: 491 AFLAVLAAGPSVVEQI 506
+
+
+>sp|P51297|SECY_PORPU Preprotein translocase subunit secY
+ OS=Porphyra purpurea GN=secY PE=3 SV=1
+ Length = 411
+
+ Score = 244 bits (623), Expect = 8e-64, Method: Composition-based stats.
+ Identities = 73/323 (22%), Positives = 149/323 (46%), Gaps = 22/323 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR-------MLLTLVIALIQSV 53
+ +F++G+ P+++S ++ Q+ L KL E E R L L A +QS
+Sbjct: 62 GIFALGIVPYINSSIVMQLLT-KIIPDLEKLQKEEGELGRQKITQITRYLALGWATLQSG 120
+
+Query: 54 ALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIA 112
+ A+ + ++ T + L L AG+ ++WL++L G+G +++ ++++
+Sbjct: 121 AISIW--VKPYVFNWNFTFVCESVLALTAGSMIIMWLSELITEKGIGNGASLLIFQNIVS 178
+
+Query: 113 YIPQDIWNSIQELKISS--LWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFKK- 169
+ +P++ S + S+ + L +V L+ + + + V+ RI + +
+Sbjct: 179 GLPKNFTQSFFDANYSNTSIKFGLFIVIFLLMIIITIFVQEGTRRIKIISARQLGKSSIL 238
+
+Query: 170 --YSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWF 227
+ SYL ++LN G MPI++A +++P Y + +N + Q + +
+Sbjct: 239 DPNSYLPLKLNQGGVMPIVFASASMALPAYLTQLT-----QNTFLLQVLYLFCPNGSLYL 293
+
+Query: 228 ILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGA 287
+ +LY + I + + I ++ + IA ++K G I N+ PG AT Y+ ++ +GA
+Sbjct: 294 VLYSVLILFFSYFYTSIVMNPEDIATNLKKMGASIPNIRPGQATIDYLQVILNRLTFLGA 353
+
+Query: 288 FYLILISGLPMMVVLV-DIRYLR 309
+ +L ++ +P ++ V I+ LR
+Sbjct: 354 TFLFTVALIPFIIEKVAQIQNLR 376
+
+
+>sp|O66491|SECY_AQUAE Preprotein translocase subunit secY OS=Aquifex
+ aeolicus GN=secY PE=1 SV=1
+ Length = 429
+
+ Score = 240 bits (612), Expect = 1e-62, Method: Composition-based stats.
+ Identities = 77/329 (23%), Positives = 156/329 (47%), Gaps = 28/329 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQ-------ERRRMLLTLVIALIQSV 53
+ ++F++G+ P++S+ ++ Q+ V+ L +L E LTL +A +QS+
+Sbjct: 71 TVFALGVMPYISASIMMQLLTVA-IPSLQRLAKEEGDYGRYKINEYTKYLTLFVATVQSL 129
+
+Query: 54 ALVLNLPLQ------EAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIV 106
+ + + Q + +++ L L+AGT FL+W+ D G+G +I+
+Sbjct: 130 GIAFWIRGQVSPKGIPVVENPGISFILITVLTLVAGTMFLVWIADRITEKGIGNGASLII 189
+
+Query: 107 MASMIAYIPQDIWNSIQELKISS---LWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI 163
+ A ++A P + +++K L L L++ + + V V+ ++ RIP+
+Sbjct: 190 FAGIVANFPNAVIQFYEKVKTGDIGPLTLLLIIALIIAIIVGIVYVQEAERRIPIQYPGR 249
+
+Query: 164 HNRF----KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEAL 219
+ + +YL I++NPAG +PI++A L+ IP L + +N I+ +
+Sbjct: 250 QVGRQLYAGRKTYLPIKINPAGVIPIIFAQALLLIPSTLLNFV-----QNPFIKVIADMF 304
+
+Query: 220 SMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLV 279
+ G+ + LY+ I + + I+ ++AE + K+G +I V PG T +Y+ ++
+Sbjct: 305 QPGAIFYNFLYVTFIVFFTYFYTAVLINPVELAENLHKAGAFIPGVRPGQDTVKYLERII 364
+
+Query: 280 TYFALVGAFYLILISGLPMMVVLV-DIRY 307
+ GA +L +I+ +P+++ + +I +
+Sbjct: 365 NRLIFFGALFLSVIALIPILISVWFNIPF 393
+
+
+>sp|Q4UMQ9|SECY_RICFE Preprotein translocase subunit secY
+ OS=Rickettsia felis GN=secY PE=3 SV=1
+ Length = 433
+
+ Score = 240 bits (612), Expect = 1e-62, Method: Composition-based stats.
+ Identities = 66/344 (19%), Positives = 155/344 (45%), Gaps = 25/344 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++ + P++++ +I Q+ +V+ + L L E + +R LT+++A Q+
+Sbjct: 70 SIFALAIMPYITASIIIQLMSVAYKP-LENLKKEGEVGKRKVNQLSRYLTVLLASFQAYG 128
+
+Query: 55 LVLNL-----PLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMA 108
+ + ++L + V + L+ GT L+WL + G+G +I+
+Sbjct: 129 VAISLESIVTNTGPVVILAGFFFRVTTVITLVVGTMLLMWLGEQITQRGIGNGTSLIIFI 188
+
+Query: 109 SMIAYIPQDIWNSIQELKISSLWLALMLVFSL---VFLYLAVTVERSKYRIPVNKINIH- 164
+ +I+ +P I + + + +L + L + V + + + E+++ ++ V
+Sbjct: 189 GIISGVPSAIISMFELSRKGALSPLIALAVCIGVVVLIAIIIFFEKAQRKLLVQYPKRQV 248
+
+Query: 165 ---NRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSM 221
+ + +++ ++LN +G +P ++A +++ P ++ + L
+Sbjct: 249 GNKIYGGEATHMPLKLNTSGVIPPIFASSILLFPATLANF---SNSNSETMGMLTYYLGH 305
+
+Query: 222 GSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTY 281
+ G P + +LY+ I + + I + ++ A ++K G YI PG T Y + ++T
+Sbjct: 306 GKPVYILLYVALIMFFSFFYTAIVFNSEETANNLRKYGAYIPGKRPGKNTSDYFDYILTR 365
+
+Query: 282 FALVGAFYLILISGLPMMVVLVDIRYLRLSMIPGIFMIFIGMVF 325
+ ++G YL +I +P ++ ++ + LS+ F+I + +V
+Sbjct: 366 LTVIGGIYLSVICVIPELL--MNKYVISLSLGGTSFLIVVNVVL 407
+
+
+>sp|Q68W98|SECY_RICTY Preprotein translocase subunit secY
+ OS=Rickettsia typhi GN=secY PE=3 SV=1
+ Length = 433
+
+ Score = 238 bits (609), Expect = 3e-62, Method: Composition-based stats.
+ Identities = 65/344 (18%), Positives = 157/344 (45%), Gaps = 25/344 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++ + P++++ +I Q+ +V+ + L L E + +R LT+++A Q+
+Sbjct: 70 SIFALAIMPYITASIIIQLMSVAYKP-LENLKKEGESGKRKINQLSRYLTVLLASFQAYG 128
+
+Query: 55 LVLNL-----PLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMA 108
+ + L+L + V + L+ GT L+WL + G+G +I+
+Sbjct: 129 VALSLESMVTNTGPVVILAGFFFRVTTVITLVVGTMLLMWLGEQITQRGIGNGTSLIIFI 188
+
+Query: 109 SMIAYIPQDIWNSIQELKISSLWLAL---MLVFSLVFLYLAVTVERSKYRIPVNKINIH- 164
+ +I+ +P I + + + +L + + + ++ + + + E+++ ++ V
+Sbjct: 189 GIISGVPSAIISMFELSRKGALSPLIAITVCIGVVLLIAIIIFFEKAQRKLLVQYPKRQV 248
+
+Query: 165 ---NRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSM 221
+ + +++ ++LN +G +P ++A +++ P ++ + L
+Sbjct: 249 GNKIYGGEATHMPLKLNTSGVIPPIFASSILLFPTTLANF---SNSNSETMSMLSYYLGH 305
+
+Query: 222 GSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTY 281
+ G P + +LY++ I + + I + ++ A ++K G YI PG T Y + ++T
+Sbjct: 306 GKPVYILLYVVLIMFFSFFYTAIVFNSEETANNLRKYGAYIPGKRPGKNTSDYFDYILTR 365
+
+Query: 282 FALVGAFYLILISGLPMMVVLVDIRYLRLSMIPGIFMIFIGMVF 325
+ ++G YL +I +P ++ ++ + LS+ F+I + +V
+Sbjct: 366 LTVIGGLYLSIICVIPELL--MNKYVISLSLGGTSFLIVVNVVL 407
+
+
+>sp|Q92GY6|SECY_RICCN Preprotein translocase subunit secY
+ OS=Rickettsia conorii GN=secY PE=3 SV=1
+ Length = 433
+
+ Score = 238 bits (608), Expect = 4e-62, Method: Composition-based stats.
+ Identities = 65/344 (18%), Positives = 155/344 (45%), Gaps = 25/344 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++ + P++++ +I Q+ +V+ + L L E + +R LT+++A Q+
+Sbjct: 70 SIFALAIMPYITASIIIQLMSVAYKP-LENLKKEGEVGKRKVNQLSRYLTVLLASFQAYG 128
+
+Query: 55 LVLNL-----PLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMA 108
+ + ++L + + + L+ GT L+WL + G+G +I+
+Sbjct: 129 VAISLESIVTNTGPVVILAGFFFRITTVITLVVGTMLLMWLGEQITQRGIGNGTSLIIFI 188
+
+Query: 109 SMIAYIPQDIWNSIQELKISSLWLALMLVFSL---VFLYLAVTVERSKYRIPVNKINIH- 164
+ +I+ +P I + + + +L + + + V + + + ER++ ++ V
+Sbjct: 189 GIISGVPSAIISMFELSRKGALSPLIAIAVCIGVVVLIAIIIFFERAQRKLLVQYPKRQV 248
+
+Query: 165 ---NRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSM 221
+ + +++ ++LN +G +P ++A +++ P ++ + L
+Sbjct: 249 GNKIYGGEATHMPLKLNTSGVIPPIFASSILLFPATLANF---SNSNSETMGMLTYYLGH 305
+
+Query: 222 GSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTY 281
+ G P + +LY+ I + + I + ++ A ++K G YI PG T Y + ++T
+Sbjct: 306 GKPVYILLYVALIMFFSFFYTAIVFNSEETANNLRKYGAYIPGKRPGKNTSDYFDYILTR 365
+
+Query: 282 FALVGAFYLILISGLPMMVVLVDIRYLRLSMIPGIFMIFIGMVF 325
+ ++G YL +I +P ++ ++ + LS+ F+I + +V
+Sbjct: 366 LTVIGGIYLSVICVIPELL--MNKYVISLSLGGTSFLIVVNVVL 407
+
+
+>sp|Q1RHP1|SECY_RICBR Preprotein translocase subunit secY
+ OS=Rickettsia bellii (strain RML369-C) GN=secY PE=3 SV=1
+ Length = 433
+
+ Score = 238 bits (607), Expect = 6e-62, Method: Composition-based stats.
+ Identities = 65/344 (18%), Positives = 156/344 (45%), Gaps = 25/344 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++ + P++++ +I Q+ +V+ + L L E + +R LT+++A +Q+
+Sbjct: 70 SIFALAIMPYITASIIIQLMSVAYKP-LENLKKEGEAGKRKINQLSRYLTVLLASLQAYG 128
+
+Query: 55 LVLNL-----PLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMA 108
+ + ++L + + + L+ GT L+WL + G+G +I+
+Sbjct: 129 VAVSLESIVTNTGPVVIIPGLFFKITTVITLVVGTMLLMWLGEQITQRGIGNGTSLIIFI 188
+
+Query: 109 SMIAYIPQDIWNSIQELKISSLWLALMLVFS---LVFLYLAVTVERSKYRIPVNKINIH- 164
+ +I+ +P I + + + +L + + ++ + + + E+++ ++ V
+Sbjct: 189 GIISGVPSAIISMFELSRKGALSPLVAIAVCAGVVILISIIIFFEKAQRKLLVQYPKRQV 248
+
+Query: 165 ---NRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSM 221
+ +Y+ ++LN +G +P ++A +++ P ++++ L
+Sbjct: 249 GNKIYGGDSTYMPLKLNTSGVIPPIFASSILLFPATLANF---SSSNSEIMNMLTYYLGH 305
+
+Query: 222 GSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTY 281
+ G P + +LY+ I + + I + ++ A ++K G YI PG T Y + ++T
+Sbjct: 306 GKPIYILLYVALIMFFSFFYTAIVFNSEETANNLRKYGAYIPGKRPGKNTSEYFDYILTR 365
+
+Query: 282 FALVGAFYLILISGLPMMVVLVDIRYLRLSMIPGIFMIFIGMVF 325
+ +VG YL +I +P ++ ++ + LS+ F+I + +V
+Sbjct: 366 LTVVGGIYLSVICIIPELL--MNKYVISLSLGGTSFLIVVNVVL 407
+
+
+>sp|P38397|SECY_PYRSA Preprotein translocase subunit secY (Fragment)
+ OS=Pyrenomonas salina GN=secY PE=3 SV=1
+ Length = 412
+
+ Score = 237 bits (606), Expect = 7e-62, Method: Composition-based stats.
+ Identities = 70/314 (22%), Positives = 146/314 (46%), Gaps = 22/314 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLE-VQERRRM------LLTLVIALIQSV 53
+ +F++G+ P++++ ++ Q A + L KL E + R+ L A IQS+
+Sbjct: 68 GIFALGIVPYINASIVIQ-LATTSIPNLEKLQKEEGEAGRQKISQITRYRALGWAAIQSL 126
+
+Query: 54 ALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIA 112
+ + ++ + +V TL L G+ ++W ++ G+G +++ ++IA
+Sbjct: 127 GVSFW--VRPYVFNWDSQFVVQMTLALTTGSMLIMWFSEQITEKGIGNGPSLLIFINIIA 184
+
+Query: 113 YIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFKKYSY 172
+ +P+ I + ++ L+++ S+ + + +Y I + + H K+ SY
+Sbjct: 185 GLPKLIQQKSNAISSTNQTTELVVLASISVYDSRIFIRDRRYYI-LQTVGRH--CKQTSY 241
+
+Query: 173 LDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSP---AWFIL 229
+ L +RLN G MPI++A ++ +P Y +I +NQ + + + LS S + I
+Sbjct: 242 LPLRLNQGGVMPIIFASAILVLPAYLGQVI-----QNQFVLKLVTLLSPNSSDKNLYLIF 296
+
+Query: 230 YLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFY 289
+ Y I + +A + I+ + +++ ++K I V PG AT Y+ + +GA +
+Sbjct: 297 YFSLILFFSYFYASLIINPNDVSQNLKKMESSIPGVRPGKATTDYLQKTLNRLTFLGALF 356
+
+Query: 290 LILISGLPMMVVLV 303
+ L I+ +P ++ +
+Sbjct: 357 LAFIAVVPSIIENI 370
+
+
+>sp|Q9ZCS5|SECY_RICPR Preprotein translocase subunit secY
+ OS=Rickettsia prowazekii GN=secY PE=3 SV=1
+ Length = 433
+
+ Score = 237 bits (605), Expect = 9e-62, Method: Composition-based stats.
+ Identities = 65/344 (18%), Positives = 156/344 (45%), Gaps = 25/344 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++ + P++++ +I Q+ +V+ + L L E + +R LT+++A Q+
+Sbjct: 70 SIFALAIMPYITASIIIQLMSVAYKP-LENLKKEGETGKRKINQLSRYLTVLLASFQAYG 128
+
+Query: 55 LVLNL-----PLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMA 108
+ + L+L + V + L+ GT L+WL + G+G +I+
+Sbjct: 129 VALSLESMVTNTGPVVILAGFFFRVTTVITLVVGTILLMWLGEQITQRGIGNGTSLIIFI 188
+
+Query: 109 SMIAYIPQDIWNSIQELKISSLWLAL---MLVFSLVFLYLAVTVERSKYRIPVNKINIH- 164
+ +I+ +P I + + + +L + + + ++ + + + E+++ ++ V
+Sbjct: 189 GIISGVPSAIISMFELSRKGALSPLIAITVCIGVVLLIAIIIFFEKAQRKLLVQYPKRQV 248
+
+Query: 165 ---NRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSM 221
+ + +++ ++LN +G +P ++A +++ P + + L
+Sbjct: 249 GNKIYGGEATHMPLKLNTSGVIPPIFASSILLFPTTLASF---SNSNSDTMSMLTYYLGH 305
+
+Query: 222 GSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTY 281
+ G P + +LY++ I + + I + ++ A ++K G YI PG T Y + ++T
+Sbjct: 306 GKPVYILLYVVLIMFFSFFYTAIVFNSEETANNLRKYGAYIPGKRPGKNTSDYFDYILTR 365
+
+Query: 282 FALVGAFYLILISGLPMMVVLVDIRYLRLSMIPGIFMIFIGMVF 325
+ ++G YL +I +P ++ ++ + LS+ F+I + +V
+Sbjct: 366 LTVIGGIYLSVICVIPELL--MNKYVISLSLGGTSFLIVVNVVL 407
+
+
+>sp|P28539|SECY_CHLTR Preprotein translocase subunit secY
+ OS=Chlamydia trachomatis GN=secY PE=3 SV=3
+ Length = 457
+
+ Score = 236 bits (604), Expect = 1e-61, Method: Composition-based stats.
+ Identities = 71/336 (21%), Positives = 146/336 (43%), Gaps = 36/336 (10%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRML------LTLVIALIQSV- 53
+ ++ ++G+ P++S+ +I Q+ V ++ + +R L TLV+A +QS+
+Sbjct: 73 TVIALGVVPYISASIIVQLLVVFMPTLQREMRESPDQGKRKLGRMTRLFTLVLACVQSLL 132
+
+Query: 54 -------------ALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLG 100
+ +VL L + +V++ GT L+W+ + + G+G
+Sbjct: 133 FAKFALRMNLVVPGIVLPAMLSLKLFGVPWVFYLTTVVVMITGTLLLMWVGEQISDKGIG 192
+
+Query: 101 GSIMIVMA-SMIAYIPQDIWNSIQELKISS--------LWLALMLVFSLVFLYLAVTVER 151
+ I +++ ++A P + + +L + S + L ++ + L V +
+Sbjct: 193 NGISLIITLGILASFPSVLGSIFNKLNLGSQDPSEFGIVSLLILCAVFVFVLMATVLIIE 252
+
+Query: 152 SKYRIPVNKINI----HNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQP 207
+ +IPV SYL +++N AG +P+++A +L+ P +
+Sbjct: 253 GMRKIPVQHARRIIGRREVVGGGSYLPLKVNYAGVIPVIFASSLLMFPATIGQFL---SS 309
+
+Query: 208 ENQLIEQWIEALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYP 267
+ E+ +++ LS GS A+ I Y+L I + +QIA M+K+G +I +
+Sbjct: 310 ESSWLKRIATMLSPGSVAYSIFYVLLIIFFTYFWTATQFRPEQIASEMKKNGAFIPGIRQ 369
+
+Query: 268 GGATRRYINGLVTYFALVGAFYLILISGLPMMVVLV 303
+ G T+ Y+ + L+GA +L +++ LP ++ +
+Sbjct: 370 GKPTQTYLEYTMNRVTLLGAVFLAVVAILPSILGRI 405
+
+
+>sp|Q1XDJ1|SECY_PORYE Preprotein translocase subunit secY
+ OS=Porphyra yezoensis GN=secY PE=3 SV=1
+ Length = 411
+
+ Score = 236 bits (604), Expect = 1e-61, Method: Composition-based stats.
+ Identities = 74/323 (22%), Positives = 148/323 (45%), Gaps = 22/323 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR-------MLLTLVIALIQSV 53
+ +F++G+ P+++S ++ Q+ L KL E E R L L A +QS
+Sbjct: 62 GIFALGIVPYINSSIVMQLLT-KIVPNLEKLQKEEGELGRQKITQITRYLALGWATLQSG 120
+
+Query: 54 ALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIA 112
+ A+ + ++ + L L AG+ ++WL++L G+G +++ ++++
+Sbjct: 121 AISIW--VKPYVFNWNFAFVCESVLALTAGSMIIMWLSELITEKGIGNGASLLIFQNIVS 178
+
+Query: 113 YIPQDIWNSIQELKI--SSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFKK- 169
+ +P++ S + +SL L + L+ + + + V+ RI + +
+Sbjct: 179 GLPKNFTQSFFDASYSNASLKFGLFIAIFLLMIIITICVQEGTRRIKIISARQLGKSSIL 238
+
+Query: 170 --YSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWF 227
+ SYL ++LN G MPI++A +++P Y II +N+ + Q + +
+Sbjct: 239 DPNSYLPLKLNQGGVMPIVFASASMALPSYLTQII-----QNKTLLQILYLFCPNGSLYL 293
+
+Query: 228 ILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGA 287
+ +LY I + + I ++ + IA ++K G I N+ PG AT Y+ ++ +GA
+Sbjct: 294 LLYCALILFFSYFYTSIVMNPEDIAINLKKMGASIPNIRPGQATIDYLQVILNRLTFLGA 353
+
+Query: 288 FYLILISGLPMMVVLV-DIRYLR 309
+ +L ++ +P ++ V I+ LR
+Sbjct: 354 SFLFTVALIPFIIEKVTQIQNLR 376
+
+
+>sp|P28527|SECY_GUITH Preprotein translocase subunit secY
+ OS=Guillardia theta GN=secY PE=3 SV=2
+ Length = 420
+
+ Score = 233 bits (594), Expect = 2e-60, Method: Composition-based stats.
+ Identities = 63/316 (19%), Positives = 143/316 (45%), Gaps = 18/316 (5%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR-------MLLTLVIALIQSV 53
+ +F++G+ P++++ +I Q A + L KL E E R + LV ALIQS+
+Sbjct: 68 GVFALGIVPYINASIIVQ-LATNSIPSLEKLQKEEGELGRQKIVQLTRYVALVWALIQSI 126
+
+Query: 54 ALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIA 112
+ + ++ + +L L G+ ++W ++ G+G +++ ++I+
+Sbjct: 127 GVSFW--VRPYVFNWDLNFVFAMSLTLTIGSMLIMWFSEQITEKGIGNGPSLLIFINIIS 184
+
+Query: 113 YIPQDIWNSIQELKISSLWLALMLVFSLV--FLYLAVTVERSKYRIPVNKINIHNRF--- 167
+ +P+ + + IQ +++ L + ++ + + + ++ RIP+ +
+Sbjct: 185 GLPKLLQSQIQSTRLNIQALDIFVLVFIFSVMIIGIIFIQEGIKRIPIISARQLGKGQMD 244
+
+Query: 168 KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWF 227
+ K SYL ++LN +G MPI++A ++ +P Y ++ Q + + S +
+Sbjct: 245 NKTSYLPLKLNQSGVMPIIFASAVLVLPAYLAQLVSNEQLRT--VLHLFDGTSNNKLLYL 302
+
+Query: 228 ILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGA 287
+ + Y I + + + ++ + +++ ++K I V PG AT Y+ + +GA
+Sbjct: 303 LFYFTLILFFSYFYTSLILNPNDVSKNLKKMESSIYGVRPGKATTEYLQKTLNRLTFLGA 362
+
+Query: 288 FYLILISGLPMMVVLV 303
+ +L I+ +P ++ +
+Sbjct: 363 LFLAFIAIVPNIIETL 378
+
+
+>sp|Q89A85|SECY_BUCBP Preprotein translocase subunit secY
+ OS=Buchnera aphidicola subsp. Baizongia pistaciae
+ GN=secY PE=3 SV=1
+ Length = 441
+
+ Score = 231 bits (591), Expect = 3e-60, Method: Composition-based stats.
+ Identities = 68/326 (20%), Positives = 152/326 (46%), Gaps = 21/326 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++SS +I Q+ + ++ + ++ R +TL++A +QS
+Sbjct: 77 SIFALGIMPFISSSIIVQILTLIH-PKFIEMKKDGEQGRHRINKYIRYITLILAALQSFG 135
+
+Query: 55 LVLNLPLQE----AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMASM 110
+ + ++LP + + + L+ GT FL+WL +L G+G I I++ S
+Sbjct: 136 MSISLPNIPGLKDVIIDPSISFYGIAIISLITGTIFLMWLGELITEKGIGNGISIIIFSG 195
+
+Query: 111 -IAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYL---AVTVERSKYRIPVNKINI--- 163
+ ++ +P N++++++ SL + L +V + V +ERS+ +I ++
+Sbjct: 196 IVSGLPSSFLNTVEKVRQGSLHVLLFCFIGIVIFLVTLLVVYIERSQRKITISYAKRNLG 255
+
+Query: 164 -HNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMG 222
+ ++L ++LN +G +P ++A ++V P + + + L
+Sbjct: 256 HRTYSMNSTHLPLKLNMSGVIPAIFASSIVLFPATIASWFGNRD-HFKWLVDIVFYLQPT 314
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ P + + Y+ I + + + + A+ ++KSG +I + PG T +YIN ++
+Sbjct: 315 KPLYILTYITAIIFFCFFYTGLAFNPRETADNLKKSGAFILGIRPGEKTAQYINKIMLRL 374
+
+Query: 283 ALVGAFYLILISGLPMMV-VLVDIRY 307
+ +G+ Y+ I +P ++ +D+ +
+Sbjct: 375 TFLGSMYMAFICLVPELMRFFMDVPF 400
+
+
+>sp|P57571|SECY_BUCAI Preprotein translocase subunit secY
+ OS=Buchnera aphidicola subsp. Acyrthosiphon pisum
+ GN=secY PE=3 SV=1
+ Length = 437
+
+ Score = 231 bits (589), Expect = 6e-60, Method: Composition-based stats.
+ Identities = 75/326 (23%), Positives = 157/326 (48%), Gaps = 23/326 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLVIALIQSVA 54
+ S+F++G+ P++S+ +I Q+ + LS++ E + TL++AL+QS+
+Sbjct: 76 SIFALGIMPYISASIIIQLLTLVY-PTLSEIKKEGESGRHRINQYTRYATLILALVQSIG 134
+
+Query: 55 LVLNLPL----QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMASM 110
+ + + LP + ++ + L+ T FL+WL +L G+G I I++
+Sbjct: 135 IAMTLPNIAGIRSIIINTDFYFYLIAIISLVTSTMFLMWLGELITEYGIGNGISIIIFIG 194
+
+Query: 111 IAY-IPQDIWNSIQELKISSLWLALMLVFSLV---FLYLAVTVERSKYRIPVNKINIHNR 166
+ I +P I N+I++ + L + L L L+ ++L V +ER + +I V+
+Sbjct: 195 IIAGLPSAIGNTIEKTRQGDLHILLFLFILLLIFSVIFLVVFMERGQRKIVVHYAQRQQG 254
+
+Query: 167 FKKY----SYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMG 222
+ + Y ++L +++N AG +P ++A ++V P + + ++ + + + L
+Sbjct: 255 RRIYETPSTHLPLKINMAGVIPAIFASSIVLFPATIISW---CKVNHEWLTKILFYLQPN 311
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ + ILY+ I + + + + A+ ++KSG +I + PG T +YIN ++
+Sbjct: 312 QFLYLILYISAIVFFCFFYTGLVFNPRETADNLKKSGAFISGIRPGEQTAKYINKIMLRL 371
+
+Query: 283 ALVGAFYLILISGLPMMV-VLVDIRY 307
+ LVG+ Y+ I +P + +++ +
+Sbjct: 372 TLVGSLYITFICLIPEFMRSAMNVPF 397
+
+
+>sp|Q8K969|SECY_BUCAP Preprotein translocase subunit secY
+ OS=Buchnera aphidicola subsp. Schizaphis graminum
+ GN=secY PE=3 SV=1
+ Length = 439
+
+ Score = 226 bits (576), Expect = 2e-58, Method: Composition-based stats.
+ Identities = 76/326 (23%), Positives = 156/326 (47%), Gaps = 21/326 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++SS +I Q+ + LS++ E + R TLV+AL QS+
+Sbjct: 76 SIFALGIMPYISSSIIIQLLTLV-IPSLSEIKKEGEVGRTKINQYTRYTTLVLALFQSIG 134
+
+Query: 55 LVLNLP----LQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGSIMIVMAS 109
+ +V +LP + + ++L+ GT FL+WL +L G +I+
+Sbjct: 135 IVTSLPKISGMNQIIIHPDFYFYFTAIIILVTGTMFLMWLGELITECGIGNGISIIIFIG 194
+
+Query: 110 MIAYIPQDIWNSIQELKISSLWLALMLVFSLVFL---YLAVTVERSKYRIPVNKINIHNR 166
+ +IA +P I ++I++ + L + L L ++ +L V +ERS+ +I ++
+Sbjct: 195 IIAGLPSAIVHTIEQTRQGDLHILLFLCVLILIFSVVFLVVFIERSQRKIIIHYAQRQKG 254
+
+Query: 167 FK----KYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMG 222
+ + + ++L +++N AG +P ++A ++V P + + L++
+Sbjct: 255 RRIYSTQSTHLPLKINMAGVIPAIFASSVVLFPVTIISWFGID-RKCYLLKTIFFYFQPN 313
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ P + ILY+ +I + + + + A+ ++KSG +I + PG T +YIN ++
+Sbjct: 314 QPLYLILYVFSIIFFCFFYTGLVFNPRETADNLKKSGGFISGIRPGEQTAKYINKIMIRL 373
+
+Query: 283 ALVGAFYLILISGLPMMV-VLVDIRY 307
+ L G+ Y+ I +P + +++ +
+Sbjct: 374 TLFGSLYIAFICLIPEFMRSAMNVPF 399
+
+
+>sp|Q59548|SECY_MYCPN Preprotein translocase subunit secY
+ OS=Mycoplasma pneumoniae GN=secY PE=3 SV=1
+ Length = 477
+
+ Score = 224 bits (571), Expect = 9e-58, Method: Composition-based stats.
+ Identities = 70/326 (21%), Positives = 157/326 (48%), Gaps = 29/326 (8%)
+
+Query: 3 FSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRML------LTLVIALIQSVALV 56
+ F+VG+SP++S+ ++ Q+ + LSKL + RR + +TL AL+QS A++
+Sbjct: 85 FAVGISPYISAQIVMQLLSTDLIPPLSKLVNSGEVGRRKIEMITRIITLPFALVQSFAVI 144
+
+Query: 57 LNLPLQE------AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSI-MIVMAS 109
+ + + + + + AGTY ++L D + G+G I +++++
+Sbjct: 145 QIATNSGGGSSPITLKNNGSDFVAFYIIAMTAGTYLSVFLGDTISKKGIGNGITLLILSG 204
+
+Query: 110 MIAYIPQDIWN----------SIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVN 159
+ ++A +P+ +I +++ + + + L+ + + +IP+
+Sbjct: 205 ILAQLPEGFIAAYSVLSGVVVTINATLTTAISFFIYFMAFVTLLFATTFITQETRKIPIQ 264
+
+Query: 160 KINIHNRFKKY--SYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIE 217
+ + + YL I++N AG +P+++A +++SIP QP+ + +
+Sbjct: 265 QSGQGLVTESSALPYLPIKVNSAGVIPVIFASSIMSIPVTIAQF----QPQTESRWFVED 320
+
+Query: 218 ALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYING 277
+ LS+ P +LY + + + + +++I I+ +++A+ +KSG +I + PG T ++I
+Sbjct: 321 YLSLSKPTGIVLYGILVILFSFFYSYIQINPERLAKNFEKSGRFIPGIRPGKDTEKHIAR 380
+
+Query: 278 LVTYFALVGAFYLILISGLPMMVVLV 303
+ ++ +GA +L +I+ +P +V +
+Sbjct: 381 VLVRINFIGAPFLTVIAIIPYIVSAL 406
+
+
+>sp|Q9PJN1|SECY_CHLMU Preprotein translocase subunit secY
+ OS=Chlamydia muridarum GN=secY PE=3 SV=1
+ Length = 457
+
+ Score = 222 bits (567), Expect = 2e-57, Method: Composition-based stats.
+ Identities = 69/336 (20%), Positives = 144/336 (42%), Gaps = 36/336 (10%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRML------LTLVIALIQSV- 53
+ ++ ++G+ P++S+ +I Q+ V ++ + +R L TL++A +QS+
+Sbjct: 73 TVIALGVVPYISASIIVQLLVVFMPTLQREMREAPDQGKRKLGRMTRLFTLLLACVQSLL 132
+
+Query: 54 -------------ALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLG 100
+ +VL L + +V+ GT L+W+ + + G+G
+Sbjct: 133 FAKFALRMNLVVPGIVLPAMLSLKLFGIPCVFYLTTVVVMTTGTLLLMWIGEQISDKGIG 192
+
+Query: 101 GSIMIVMA-SMIAYIPQDIWNSIQELKISS--------LWLALMLVFSLVFLYLAVTVER 151
+ I +++ M+A P + + +L + S + L ++ + L V +
+Sbjct: 193 NGISLIITLGMLASFPSVLGSIFNKLNLGSQDPSEFGIVSLLVLCAVFVFVLMATVLIIE 252
+
+Query: 152 SKYRIPVNKINI----HNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQP 207
+ ++PV SYL +++N AG +P+++A +L+ P +
+Sbjct: 253 GVRKVPVQHARRIIGRREVLGGGSYLPLKVNYAGVIPVIFASSLLMFPATIGQFL---SS 309
+
+Query: 208 ENQLIEQWIEALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYP 267
+ E+ +++ LS GS + I Y+L I + +QIA M+K+G +I +
+Sbjct: 310 ESSWLKRIATMLSPGSVVYSIFYVLLIIFFTYFWTATQFRPEQIASEMKKNGAFIPGIRQ 369
+
+Query: 268 GGATRRYINGLVTYFALVGAFYLILISGLPMMVVLV 303
+ G T+ Y+ + L+GA +L +++ LP ++ +
+Sbjct: 370 GKPTQSYLEYTMNRVTLLGAVFLAVVAILPSILGRI 405
+
+
+>sp|P33108|SECY_MICLU Preprotein translocase subunit secY
+ OS=Micrococcus luteus GN=secY PE=3 SV=1
+ Length = 436
+
+ Score = 222 bits (566), Expect = 3e-57, Method: Composition-based stats.
+ Identities = 65/326 (19%), Positives = 132/326 (40%), Gaps = 27/326 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER------RRMLLTLV-------- 46
+ S+F++G+ P++++ +I Q+ V +L E + LTL
+Sbjct: 73 SVFALGIMPYITASIIVQLLRVV-IPRFEQLHQERRRGQATLTQYTRYLTLALALLQATT 131
+
+Query: 47 IALIQSVALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMI 105
+ +A + +L L ++L + L G ++W + G+G ++
+Sbjct: 132 MASLARTGALLGCSL-PLLRDGSILTVLLVVIALTTGCLIVMWFGERITENGVGNGMSLL 190
+
+Query: 106 VMASMIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHN 165
+ + S+ A P + +Q A+++ L+ + V VE S+ RIPV
+Sbjct: 191 IFTSIAAGFPAGLGQVVQT--QGWRVFAIVMGIGLLTMLAIVFVEESQRRIPVQYAKRQI 248
+
+Query: 166 R----FKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQ--LIEQWIEAL 219
+ +Y+ +++N A +P+++A +++ +P + I
+Sbjct: 249 GSRTVGGSSTYIPVKVNMANVIPVIFASSVLMLPGILIQFNTPQDGSAPAPWITWLSRYF 308
+
+Query: 220 -SMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGL 278
+ S P + LY L I + I + +I++ M++ G +I P G T RY+ +
+Sbjct: 309 GSGDHPVYMALYFLLIIGFTYFYVSITFNPVEISDNMKRYGGFIPASAPAGPTERYLQYV 368
+
+Query: 279 VTYFAL-VGAFYLILISGLPMMVVLV 303
+ ++ VGA YL +++ +P++ V
+Sbjct: 369 ISRITFVVGALYLGIVAMIPLIAFAV 394
+
+
+>sp|O52351|SECY_MYCGA Preprotein translocase subunit secY
+ OS=Mycoplasma gallisepticum GN=secY PE=3 SV=2
+ Length = 498
+
+ Score = 221 bits (563), Expect = 7e-57, Method: Composition-based stats.
+ Identities = 82/324 (25%), Positives = 156/324 (48%), Gaps = 27/324 (8%)
+
+Query: 3 FSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVALV 56
+ F+VG+SP++S+ +I Q+ + LSKL + RR +TL A++Q+ A++
+Sbjct: 82 FAVGISPYISAQIIMQLLSTDLIPPLSKLAKSGELGRRRIELITRFVTLPFAVVQAFAII 141
+
+Query: 57 LNLPLQEAAG----VDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSI-MIVMASMI 111
+ + Q + + AGTY I++ D+ + G+G I +++++ ++
+Sbjct: 142 ALINNQRNGAIRFENGGILHQAFYIVTMTAGTYIGIFIGDIISKKGVGNGITLLILSGIL 201
+
+Query: 112 AYIPQDIWNSI----------QELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKI 161
+ A +P + S++ +L + LV L V S RIP+ +
+Sbjct: 202 ARLPDGFIVMYRVLGGVIISTNPILTSAINFSLYFLAFLVLLLAISFVNSSTRRIPIQQT 261
+
+Query: 162 NIHNRFK--KYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEAL 219
+ K YL I+LN AG +P+++A +++SIP QP+++ + L
+Sbjct: 262 GEGMVLGNEKLPYLPIKLNAAGVIPVIFASSIMSIPITIAEF----QPQSEARWFVEDYL 317
+
+Query: 220 SMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLV 279
+ S+ +P LY++ I I +++I I+ +Q+AE KS ++I V PG T ++I ++
+Sbjct: 318 SLRTPVGISLYVILIIIFTFFYSYIQINPEQLAENFNKSHKFIPGVRPGLDTEKHITKVL 377
+
+Query: 280 TYFALVGAFYLILISGLPMMVVLV 303
+ +GA +L +++ +P ++ LV
+Sbjct: 378 MRINFIGAPFLAIVAVIPYIISLV 401
+
+
+>sp|P10250|SECY_MYCCT Preprotein translocase subunit secY
+ OS=Mycoplasma capricolum subsp. capricolum (strain
+ California kid / ATCC 27343 / NCTC 10154) GN=secY PE=3
+ SV=2
+ Length = 482
+
+ Score = 219 bits (558), Expect = 2e-56, Method: Composition-based stats.
+ Identities = 70/332 (21%), Positives = 157/332 (47%), Gaps = 29/332 (8%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRML------LTLVIALIQSVA 54
+ S+ ++G+SP++++ +I Q+ + L++ + R+ L + + AL+Q+ A
+Sbjct: 93 SILALGVSPYITASIIVQLLSTDVIPVLTRWSKSGERGRKKLDKLTKIIMIPFALMQAEA 152
+
+Query: 55 LVLNLPLQEAAGVD---------MTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMI 105
+ + L Q +L LV++ G++F++W+ D G+G I I
+Sbjct: 153 TIFTLSSQGLIIPGWDNTNAIANSAFYYILIPLVMLGGSFFMLWIADQITIKGIGNGISI 212
+
+Query: 106 VMASMIAY-IPQDIWNSIQE-----------LKISSLWLALMLVFSLVFLYLAVTVERSK 153
+ V+ I +P ++ ++ + L + + L+ + V + ++
+Sbjct: 213 VIFIGIIISMPSNLKSTFEYWVSNSGEEANIFFSGLLNFMIYISVFLLVILSVVIMNEAE 272
+
+Query: 154 YRIPVNKINI--HNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQL 211
+ +IP+ + + + YL ++LN AG +P+++A ++S P II + P++
+Sbjct: 273 RKIPIQQTGSGLTDSSEHTPYLPLKLNNAGVIPVIFASAIISTPITISQIIEAVNPDSGF 332
+
+Query: 212 IEQWIEALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGAT 271
+ + + LS + ++ + I + ++ + I+ ++IAE QKSG +I + PG T
+Sbjct: 333 VIFTRDYLSFNTWWGISIFGILIVLFTFLYSQVQINPEKIAENFQKSGTFIPGIKPGKDT 392
+
+Query: 272 RRYINGLVTYFALVGAFYLILISGLPMMVVLV 303
+ +Y+ G++ ++VG+ +L +I+ LP ++ +
+Sbjct: 393 TKYLTGIINRLSVVGSVFLAIIALLPYVISKL 424
+
+
+>sp|P47416|SECY_MYCGE Preprotein translocase subunit secY
+ OS=Mycoplasma genitalium GN=secY PE=3 SV=1
+ Length = 475
+
+ Score = 218 bits (557), Expect = 3e-56, Method: Composition-based stats.
+ Identities = 73/325 (22%), Positives = 158/325 (48%), Gaps = 29/325 (8%)
+
+Query: 3 FSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRML------LTLVIALIQSVALV 56
+ F+VG+SP++S+ +I Q+ + LSKL + RR + +TL AL+Q+ A++
+Sbjct: 83 FAVGISPYISAQIIMQLLSTDLIPPLSKLVNSGEVGRRKIEMITRIITLPFALVQAFAVI 142
+
+Query: 57 LNLPLQEAAG------VDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSI-MIVMAS 109
+ + + + + AGTY ++L D + G+G I +++++
+Sbjct: 143 QIATNAGTGSSPISLANSGSEFIAFYIIAMTAGTYMAVFLGDTISKKGVGNGITLLILSG 202
+
+Query: 110 MIAYIPQDIWNSIQELK----------ISSLWLALMLVFSLVFLYLAVTVERSKYRIPVN 159
+ +++ +PQ + L +++ + + LV L+ + ++ +IP+
+Sbjct: 203 ILSQLPQGFIAAYNVLSGIVITLTPQLTAAISFFIYFLAFLVLLFATTFITQATRKIPIQ 262
+
+Query: 160 KINIH--NRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIE 217
+ + + K YL I++N AG +P+++A +++SIP QP+ + +
+Sbjct: 263 QSGQGLVSEVKTLPYLPIKVNAAGVIPVIFASSIMSIPVTIAQF----QPQTESRWFVED 318
+
+Query: 218 ALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYING 277
+ LS+ +P LY + + + + +++I I+ +++A+ +KSG +I + PG T ++I
+Sbjct: 319 YLSLSTPVGIFLYAVLVILFSFFYSYIQINPERLAKNFEKSGRFIPGIRPGNDTEKHIAR 378
+
+Query: 278 LVTYFALVGAFYLILISGLPMMVVL 302
+ ++ +GA +L +I+ +P +V
+Sbjct: 379 VLIRINFIGAPFLTVIAIIPYIVSY 403
+
+
+>sp|Q9Z7S5|SECY_CHLPN Preprotein translocase subunit secY
+ OS=Chlamydia pneumoniae GN=secY PE=3 SV=1
+ Length = 457
+
+ Score = 217 bits (553), Expect = 9e-56, Method: Composition-based stats.
+ Identities = 68/336 (20%), Positives = 146/336 (43%), Gaps = 36/336 (10%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSV- 53
+ ++ ++G+ P++S+ +I Q+F V ++ + +R L T+ +A+IQS+
+Sbjct: 73 TVIALGVVPYISASIIVQLFLVFMPALQREMRESSDQGKRRIGRLTRLFTVALAVIQSLL 132
+
+Query: 54 -------------ALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLG 100
+ +VL L + +V+ GT L+W+ + + G+G
+Sbjct: 133 FAKFALRMNLTIPGIVLPTLLSSKLFGVPWIFYITTVVVMTTGTLLLMWIGEQISDKGIG 192
+
+Query: 101 GSIMIVMA-SMIAYIPQDIWNSIQELKISS--------LWLALMLVFSLVFLYLAVTVER 151
+ I +++A +++ P + + + +L + S + + ++ + + L + +
+Sbjct: 193 NGISLIIALGILSSFPSVLGSIVNKLNLGSQDSSDLGLISILILALVFVFVLITTILIIE 252
+
+Query: 152 SKYRIPVNKINI----HNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQP 207
+ +IPV SYL +++N AG +P+++A +L+ P I
+Sbjct: 253 GVRKIPVQYARRVIGRREVPGGGSYLPLKVNYAGVIPVIFASSLLMFPATIGQFI---AS 309
+
+Query: 208 ENQLIEQWIEALSMGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYP 267
+ E+ +++ L+ GS + I Y+L I + +QIA M+K+ +I +
+Sbjct: 310 ESSWMKRIAALLAPGSLVYSICYVLLIIFFTYFWTATQFHPEQIASEMKKNNAFIPGIRQ 369
+
+Query: 268 GGATRRYINGLVTYFALVGAFYLILISGLPMMVVLV 303
+ G T+ Y+ + L+GA +L I+ LP ++ +
+Sbjct: 370 GKPTQHYLEYTMNRVTLLGALFLAAIAILPSLLGCL 405
+
+
+>sp|O25879|SECY_HELPY Preprotein translocase subunit secY
+ OS=Helicobacter pylori GN=secY PE=3 SV=1
+ Length = 420
+
+ Score = 214 bits (546), Expect = 6e-55, Method: Composition-based stats.
+ Identities = 75/326 (23%), Positives = 159/326 (48%), Gaps = 24/326 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR-----MLLTLVIALIQSVAL 55
+ S+ S+G+ P+++S +I ++ + + L+K+ E ++ LT++I LIQ+V++
+Sbjct: 62 SIISLGIMPYITSSIIMELLS-ATFPNLAKMKKERDGMQKYMQIVRYLTILITLIQAVSV 120
+
+Query: 56 VLN-----LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMAS 109
+ + A +DM M++ ++ GT L+W+ + G+G +I+ A
+Sbjct: 121 SVGLRSISGGANGAIMIDMQVFMIVSAFSMLTGTMLLMWIGEQITQRGVGNGISLIIFAG 180
+
+Query: 110 MIAYIPQDIWNSIQELKISSLWLA---LMLVFSLVFLYLAVTVERSKYRIPVNKIN---- 162
+ +++ IP I + + + + +++ L ++ + VE ++ RIP++
+Sbjct: 181 IVSGIPSAISGTFNLVNTGVINILMLIGIVLIVLATIFAIIYVELAERRIPISYARKVVM 240
+
+Query: 163 IHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMG 222
+ + + +Y+ I+LN +G +P ++A L+ P L N+ ++ + LS
+Sbjct: 241 QNQNKRIMNYIPIKLNLSGVIPPIFASALLVFPSTILQ----QATSNKTLQAVADFLSPQ 296
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ A+ IL L I A ++ I + IA+ ++++G YI + PG T ++N + +
+Sbjct: 297 GYAYNILMFLLIIFFAYFYSSIVFNSKDIADNLRRNGGYIPGLRPGEGTSSFLNSVASKL 356
+
+Query: 283 ALVGAFYLILISGLPMMVV-LVDIRY 307
+ L G+ YL LIS +P ++V + + +
+Sbjct: 357 TLWGSLYLALISTVPWILVKAMGVPF 382
+
+
+>sp|Q9ZJS9|SECY_HELPJ Preprotein translocase subunit secY
+ OS=Helicobacter pylori J99 GN=secY PE=3 SV=1
+ Length = 420
+
+ Score = 214 bits (546), Expect = 7e-55, Method: Composition-based stats.
+ Identities = 75/326 (23%), Positives = 159/326 (48%), Gaps = 24/326 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR-----MLLTLVIALIQSVAL 55
+ S+ S+G+ P+++S +I ++ + + L+K+ E ++ LT++I LIQ+V++
+Sbjct: 62 SIISLGIMPYITSSIIMELLS-ATFPNLAKMKKERDGMQKYMQIVRYLTILITLIQAVSV 120
+
+Query: 56 VLN-----LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMAS 109
+ + A +DM M++ ++ GT L+W+ + G+G +I+ A
+Sbjct: 121 SVGLRSISGGANGAIMIDMQVFMIVSAFSMLTGTMLLMWIGEQITQRGVGNGISLIIFAG 180
+
+Query: 110 MIAYIPQDIWNSIQELKISSLWLA---LMLVFSLVFLYLAVTVERSKYRIPVNKIN---- 162
+ +++ IP I + + + + +++ L ++ + VE ++ RIP++
+Sbjct: 181 IVSGIPSAISGTFNLVNTGVINILMLIGIVLIVLATIFAIIYVELAERRIPISYARKVVM 240
+
+Query: 163 IHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMG 222
+ + + +Y+ I+LN +G +P ++A L+ P L N+ ++ + LS
+Sbjct: 241 QNQNKRIMNYIPIKLNLSGVIPPIFASALLVFPSTILQ----QATSNKTLQAIADFLSPQ 296
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYF 282
+ A+ IL L I A ++ I + IA+ ++++G YI + PG T ++N + +
+Sbjct: 297 GYAYNILMFLLIIFFAYFYSSIVFNSKDIADNLRRNGGYIPGLRPGEGTSSFLNAVASKL 356
+
+Query: 283 ALVGAFYLILISGLPMMVV-LVDIRY 307
+ L G+ YL LIS +P ++V + + +
+Sbjct: 357 TLWGSLYLALISTVPWILVKAMGVPF 382
+
+
+>sp|O59442|SECY_PYRHO Preprotein translocase subunit secY
+ OS=Pyrococcus horikoshii GN=secY PE=3 SV=1
+ Length = 468
+
+ Score = 211 bits (538), Expect = 6e-54, Method: Composition-based stats.
+ Identities = 59/364 (16%), Positives = 127/364 (34%), Gaps = 64/364 (17%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR---MLLTLVIALIQSVALVL 57
+ S+ ++G+ P +++ +I Q+ S+ + L E + + + ++ + ++ VL
+Sbjct: 72 SILTLGIGPIVTAGIILQLLVGSELIRLDLANPEDRRFYQALQRVFSVFMCFFEAAIWVL 131
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMA--------- 108
+ TI L + L G LI L +L + G+G I + +A
+Sbjct: 132 GGAFGRVGVDVTYTIATLMIIQLALGGIILIVLDELVSKWGIGSGISLFIAAGVSQRILT 191
+
+Query: 109 -------------------SMIAYIPQDIWNSIQELKISSLWL------ALMLVFSLVFL 143
+ +++ IP I + + +L+ + + +++
+Sbjct: 192 RSLNPLTDPNIIDPLTGKPAIVGAIPYFIQHILDGDLKGALYRGGSAPDMIAVTATIIVF 251
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLII- 202
+ + V E + IP+ + R + I+ +PI+ L + Q + ++
+Sbjct: 252 LVVVYFESMRVEIPLGYRGVTIRGR----YPIKFLYVSNIPIILTFALYANIQLWARVLD 307
+
+Query: 203 --------HFLQPENQLIEQWIEALSMGSPAWF--------ILYLLTIFILALAFAFI-- 244
+ F I ++ + + I+YL+ I +L F F+
+Sbjct: 308 RFGHPWLGRFDPVTGNPIGGFVLYVIPPRNIFTVIDNPVRAIIYLILTIIFSLLFGFLWV 367
+
+Query: 245 ---NISGDQIAERMQKSGEYIENVYPGGAT-RRYINGLVTYFALVGAFYLILISGLPMMV 300
+ + IA ++Q++G I T R + + Y G+ + LIS L +
+Sbjct: 368 ELTGLDARTIARQLQRAGLQIPGFRRDPRTLERVLQKYIPYVTFWGSLTVALISVLADFL 427
+
+Query: 301 VLVD 304
+ +
+Sbjct: 428 GALG 431
+
+
+>sp|P49976|SECY_BUCAK Preprotein translocase subunit secY (Fragment)
+ OS=Buchnera aphidicola subsp. Acyrthosiphon kondoi
+ GN=secY PE=3 SV=1
+ Length = 356
+
+ Score = 211 bits (537), Expect = 7e-54, Method: Composition-based stats.
+ Identities = 62/283 (21%), Positives = 124/283 (43%), Gaps = 20/283 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ S+F++G+ P++S+ +I Q+ V L+++ E + RR TLV+A+ QS+
+Sbjct: 76 SIFALGIMPYISASIIIQLLTVVH-PALAEVKKEGEAGRRKISQYTRYGTLVLAIFQSIG 134
+
+Query: 55 LVLNLPLQE----AAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAM-GLGGSIMIVMAS 109
+ + LP + L+ GT FL+WL + G +I+ A
+Sbjct: 135 IATGLPNMPGMQGLVMNPGFAFYFTAVVSLVTGTMFLMWLGEQITERGIGNGISIIIFAG 194
+
+Query: 110 MIAYIPQDIWNSIQELKISSLW---LALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNR 166
+ ++A +P + ++I++ + L L L+ V + V +ER + RI VN
+Sbjct: 195 IVAGLPPAVAHTIEQARQGDLHFLLLLLVAVLVFAVTFFVVFIERGQRRIVVNYAKRQQG 254
+
+Query: 167 FK----KYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMG 222
+ + + ++L +++N AG +P ++A +++ P N + L G
+Sbjct: 255 RRVYAAQSTHLPLKVNMAGVIPAIFASSIILFPATIASWFGGGTGWN-WLTTVSLYLQPG 313
+
+Query: 223 SPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENV 265
+ P + +LY I + + + + A+ ++KSG ++ +
+Sbjct: 314 QPLYVLLYASAIIFFCFFYTALVFNPRETADNLKKSGAFVPGI 356
+
+
+>sp|Q870W0|SC61A_NEUCR Protein transport protein SEC61 subunit alpha
+ OS=Neurospora crassa GN=sec-61 PE=3 SV=1
+ Length = 476
+
+ Score = 210 bits (536), Expect = 8e-54, Method: Composition-based stats.
+ Identities = 61/391 (15%), Positives = 131/391 (33%), Gaps = 78/391 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLS---KLPLEVQERRRMLLTLVIALIQSVALVL 57
+ +L +G++P +SS +++Q+ A + + ++ K E+ + + L +++++ + V
+Sbjct: 76 TLMELGITPIISSGMVFQLLAGTHMIDVNLDLKADRELYQTAQKLFAVILSIGTATVYVF 135
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGS-IMIVMASMIAYI- 114
+ + I+ L L L+ +I L +L GLG + + ++ I
+Sbjct: 136 TGLYGPPS-DLGAGIVFLLILQLVVAGMIVILLDELLQKGYGLGSGISLFIATNICESIM 194
+
+Query: 115 -----PQDI----WNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ P I + I+ L + L+ +LV
+Sbjct: 195 WKAFSPTSINTGRGPEYEGAVIALFHLLMTWDNKQRALYEAFYRQNLPNIMNLLATLVVF 254
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ + ++ + IPV Y IRL MPIM L S +++
+Sbjct: 255 AAVIYLQGFRVEIPVKSSRQRGARGSY---PIRLFYTSNMPIMLQSALSSNVFLISQMLY 311
+
+Query: 204 FLQPEN------------------QLIEQWIEALSMGSPA-----------WFILYLLTI 234
+ EN + + +S +I Y+LT
+Sbjct: 312 SRFSENLLVRLFGVWEAKEGTAQLSAVSGLVYYMSPPLNFKDALLDPIHTAVYIAYMLTA 371
+
+Query: 235 FILALAFAFINI---SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLI 291
+ + +I + S +A++++ G + + + + ++ A G +
+Sbjct: 372 -CAVFSKTWIEVSGSSPRDVAKQLKDQGLVMAGHRE-QSMYKELKRIIPTAAAFGGACIG 429
+
+Query: 292 LISGLPMMVVLVDI---RYLRLSMIPGIFMI 319
+ +S ++ + L +++I G F I
+Sbjct: 430 ALSVASDLMGALGSGTGTLLAVTIIYGYFEI 460
+
+
+>sp|Q9V1V8|SECY_PYRAB Preprotein translocase subunit secY
+ OS=Pyrococcus abyssi GN=secY PE=3 SV=1
+ Length = 468
+
+ Score = 210 bits (536), Expect = 1e-53, Method: Composition-based stats.
+ Identities = 57/364 (15%), Positives = 128/364 (35%), Gaps = 64/364 (17%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR---MLLTLVIALIQSVALVL 57
+ S+ ++G+ P +++ +I Q+ S+ + L E + + + ++ + +++ VL
+Sbjct: 72 SILTLGIGPIVTAGIILQLLVGSEIIKLDLANPEDRRFYQALQRVFSVFMCFLEAAIWVL 131
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMA--------- 108
+ I L L L G LI L +L + G+G I + +A
+Sbjct: 132 GGAFGRVGVDVTYAIAALMILQLAFGGIILIVLDELVSKWGIGSGISLFIAAGVSQRILT 191
+
+Query: 109 -------------------SMIAYIPQDIWNSIQELKISSLWLALM------LVFSLVFL 143
+ +++ IP I + ++ +L+ ++ +++
+Sbjct: 192 RSLNPLTDPNIIDPLTGKPAIVGAIPYFIQHILKGDLKGALYRGGTAPDMMAVIATIIVF 251
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLII- 202
+ + V E + IP+ + R + IR +PI+ L + Q + ++
+Sbjct: 252 LVVVYFESMRVEIPLGYRGVTIRGR----YPIRFLYVSNIPIILTFALYANIQLWARVLD 307
+
+Query: 203 --------HFLQPENQLIEQWIEALSMGSPAWFIL--------YLLTIFILALAFAFI-- 244
+ F + ++ + + ++ YL+ I +L F F+
+Sbjct: 308 RLGHPWLGTFDPTTGNPVGGFVLYVIPPRSIFTVIDNPVRALVYLILTVISSLIFGFLWV 367
+
+Query: 245 ---NISGDQIAERMQKSGEYIENVYPGGAT-RRYINGLVTYFALVGAFYLILISGLPMMV 300
+ + IA ++Q++G I T R + + Y G+ + LI+ L +
+Sbjct: 368 ELTGLDARTIARQLQRAGLQIPGFRRDPRTLERVLQKYIPYVTFWGSLTVALIAVLADFL 427
+
+Query: 301 VLVD 304
+ +
+Sbjct: 428 GALG 431
+
+
+>sp|Q8U019|SECY_PYRFU Preprotein translocase subunit secY
+ OS=Pyrococcus furiosus GN=secY PE=3 SV=1
+ Length = 468
+
+ Score = 210 bits (535), Expect = 1e-53, Method: Composition-based stats.
+ Identities = 59/364 (16%), Positives = 129/364 (35%), Gaps = 64/364 (17%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR---MLLTLVIALIQSVALVL 57
+ S+ ++G+ P +++ +I Q+ S+ + L E + + + ++ + ++ +L
+Sbjct: 72 SILTLGIGPIVTAGIILQLLVGSEIIKLDLANPEDRRFYQALQRVFSVFMCFFEAAVWIL 131
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMA--------- 108
+ I VL L L G LI L +L + G+G I + +A
+Sbjct: 132 GGAFGRVGVDVTYAIAVLMILQLAMGGIVLIILDELVSKWGIGSGISLFIAAGVSQTILT 191
+
+Query: 109 -------------------SMIAYIPQDIWNSIQELKISSLWL------ALMLVFSLVFL 143
+ +++ IP I + ++ +++ L +V ++V
+Sbjct: 192 RSLNPLTDPNIIDPLTGQPAIVGAIPYFIQHILKGDLWGAIYRGGSAPDMLSVVATIVVF 251
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLII- 202
+ ++ V E + IP+ + R IR +PI+ L + Q + ++
+Sbjct: 252 FIVVYFESMRVEIPLGYRGVTVRGS----YPIRFLYVSNIPIILTFALYANIQLWARVLD 307
+
+Query: 203 --------HFLQPENQLIEQWIEALSMGSPAW--------FILYLLTIFILALAFAFI-- 244
+ F I ++ + + I+YL+ I +L F ++
+Sbjct: 308 RLGHPWLGRFDPTTGSPISGFVLYVIPPRNIFSVIDNPVRAIVYLILTVIFSLLFGYLWV 367
+
+Query: 245 ---NISGDQIAERMQKSGEYIENVYPGGAT-RRYINGLVTYFALVGAFYLILISGLPMMV 300
+ + IA ++Q++G I T + + + Y G+ + LI+ L +
+Sbjct: 368 ELTGLDARSIARQLQRAGLQIPGFRRDPRTLEKVLQRYIPYVTFWGSLTVALIAVLADFL 427
+
+Query: 301 VLVD 304
+ +
+Sbjct: 428 GALG 431
+
+
+>sp|Q54XK2|SC61A_DICDI Protein transport protein Sec61 subunit alpha
+ OS=Dictyostelium discoideum GN=sec61a PE=3 SV=1
+ Length = 475
+
+ Score = 208 bits (531), Expect = 3e-53, Method: Composition-based stats.
+ Identities = 50/373 (13%), Positives = 127/373 (34%), Gaps = 75/373 (20%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQ---ERRRMLLTLVIALIQSVALVL 57
+ +L +G+SP ++S ++ Q+ A +K + + + + + L ++I + Q VA +
+Sbjct: 75 TLMELGISPIVTSGMVMQLLAGAKLIEIDQSVKADRDLFSAAQKLFGMLICVGQGVAYIW 134
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGS-IMIVMASMIAYI- 114
+ + + A + L L L ++ L +L G+G + + ++ I
+Sbjct: 135 SGSYGDPAVLGFGNC-FLIVLQLFFAGIIVMLLDELLQKGYGIGSGISLFIATNICETIV 193
+
+Query: 115 -----PQDI----WNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ P + + I+ L L L+ +++
+Sbjct: 194 WKTFSPTTVSVGKGTEFEGAVIALFHLLLTRNDKVRALKEAFYRQNLPNITNLLATVLIF 253
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ + + + + +PV + + Y I+L +PI+ LVS + +++
+Sbjct: 254 MVVIYFQGFRVDLPVKSTRVSGQQGTY---PIKLFYTSNIPIILQSALVSNLYFISQLLY 310
+
+Query: 204 FLQPEN------------------QLIEQWIEALS-----------MGSPAWFILYLLTI 234
+ P+N + +S ++I ++LT
+Sbjct: 311 RRFPDNILVNLFGAWRTSEYSQQMIPVSGLTYYISSPNNMSAVLADPFHALFYITFMLTS 370
+
+Query: 235 FILALAFAFINI---SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLI 291
+ L + +I + S +A++++ ++ + + +N + A G +
+Sbjct: 371 CAL-FSKVWIEVSGSSARDVAKQLKDQQMTMKGHR-DTSVIKELNRYIPTAAAFGGLCIG 428
+
+Query: 292 LISGLPMMVVLVD 304
+ ++ + + +
+Sbjct: 429 ALTVVADFMGAIG 441
+
+
+>sp|P49461|SECY_ODOSI Preprotein translocase subunit secY
+ OS=Odontella sinensis GN=secY PE=3 SV=1
+ Length = 425
+
+ Score = 205 bits (521), Expect = 5e-52, Method: Composition-based stats.
+ Identities = 72/323 (22%), Positives = 142/323 (43%), Gaps = 25/323 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM-------LLTLVIALIQSV 53
+ LF++ + P++++ +I Q+ VS GLSKL E R LLTL +LIQS
+Sbjct: 66 GLFTLNIFPYINASIIMQLL-VSLLPGLSKLQKEGGAEARRSINSLTRLLTLGWSLIQST 124
+
+Query: 54 ALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIA 112
+ ++ L + A + + L G ++WL+++ GLG +++ ++++
+Sbjct: 125 SVAFYL--KRALFEWNLVLAFEIVIWLTTGAMIVLWLSEIITEYGLGNGPSLLIYTNIVS 182
+
+Query: 113 YIPQDIWNSI--QELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI------- 163
+ +P + I K+ L V LY V ++ ++ +
+Sbjct: 183 SLPGFVKQVITESSGKVPIGSWLLSGFVLFVALYGIVLLQEGMRKVYLISSKQLNQTSLP 242
+
+Query: 164 ---HNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALS 220
+ + + Y+ +R N AG MPI+ ++ IP F+ + L+ LI + S
+Sbjct: 243 FSGSSNLESGYYIPLRFNQAGVMPIILTTAVLVIP-TFIYNLGLLRILTPLITLPVFVKS 301
+
+Query: 221 MGSPAWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVT 280
+ +++ Y + I + +L ++ I ++ +++ +QK I + PG T Y+ ++
+Sbjct: 302 Y-KIIYWVSYFVLILLFSLFYSTIVVNPKDLSDELQKMAVSIPGIRPGVETTFYLKQVMK 360
+
+Query: 281 YFALVGAFYLILISGLPMMVVLV 303
+ L+GA L L++ LP ++ +
+Sbjct: 361 RVTLLGAIMLALLATLPNIIQAI 383
+
+
+>sp|O51451|SECY_BORBU Preprotein translocase subunit secY
+ OS=Borrelia burgdorferi GN=secY PE=3 SV=1
+ Length = 434
+
+ Score = 204 bits (519), Expect = 8e-52, Method: Composition-based stats.
+ Identities = 59/314 (18%), Positives = 144/314 (45%), Gaps = 15/314 (4%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQE----RRRMLLTLVIALIQSVALV 56
+ S+F + + P++S+ +I Q+ S + + LT+V A++Q A
+Sbjct: 72 SIFMLSIGPYISASIIVQLLVYSFPSLKKMQEGDGGRQKTKKYTKYLTIVAAVVQGYATS 131
+
+Query: 57 LNL-PLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI 114
+ L + A + + + L + GT+ L+W + G+G +I+ + ++ +
+Sbjct: 132 LYAKGIPGAVTIPFYRYIFVAILTVTTGTFILLWFGEQINQRGVGNGTSLIIFSGIVVRL 191
+
+Query: 115 PQDIWNSIQEL-----KISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFKK 169
+ ++N Q + ++ +++ L++ ++ + L + +++ RI ++ ++
+Sbjct: 192 QAALFNLFQSMQDPSQNVNPVFVILIISIFILVVILIIYEYKAQMRIAIHYARANSNNTV 251
+
+Query: 170 YSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWFIL 229
+ SYL I+LNP+G +P+++A L+++P L I+ + + Q + L + L
+Sbjct: 252 SSYLPIKLNPSGVLPVIFASVLITLP---LQILSGFAETSSIARQILSYLRPNGFYYTFL 308
+
+Query: 230 YLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFY 289
+ ++ I ++ I +S I+ ++K+G I + +Y++ ++ G+ +
+Sbjct: 309 NVILIIGFTYFYSKIQLSPKDISNNIRKNGGTIPGIKSDE-MEKYLDEIMNKTLFSGSIF 367
+
+Query: 290 LILISGLPMMVVLV 303
+ L +I+ +P +V +
+Sbjct: 368 LSIIAIIPFLVQNI 381
+
+
+>sp|Q5NVM7|S61A2_PONAB Protein transport protein Sec61 subunit alpha
+ isoform 2 OS=Pongo abelii GN=SEC61A2 PE=2 SV=1
+ Length = 476
+
+ Score = 203 bits (518), Expect = 1e-51, Method: Composition-based stats.
+ Identities = 60/392 (15%), Positives = 126/392 (32%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + A + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPAEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 ---PQDI----WNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ P I + I+ L L+ ++ +
+Sbjct: 195 ASSPTTINTGRGTEFEGAVIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +YS I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYSSYPIKLFYTSNIPIILQSALVSNLYVISQMLSVR 311
+
+Query: 206 QPEN--------------------QLIEQWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N + LS IL + IF+L
+Sbjct: 312 FSGNFLVNLLGQWADVSGGGPARSYPVGGLCYYLSPPESMGAILEDPVHVVVYIIFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRDTSMVHE-LNRYIPTAAAFGGLCIGA 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S L + + L +++I F IF+
+Sbjct: 431 LSVLADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q96TW8|SC61A_HANAN Protein transport protein SEC61 subunit alpha
+ OS=Hansenula anomala GN=SEC61 PE=3 SV=1
+ Length = 479
+
+ Score = 203 bits (516), Expect = 2e-51, Method: Composition-based stats.
+ Identities = 59/372 (15%), Positives = 129/372 (34%), Gaps = 73/372 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLS---KLPLEVQERRRMLLTLVIALIQSVALVL 57
+ +L +G+SP +SS +++Q+ ++ L ++ K E + + L +++++ Q+ VL
+Sbjct: 76 TLMELGISPIVSSGMVFQLLQGTQLLDVNLESKTDRETFQTAQKLFAILLSIGQATVYVL 135
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGSIMIVMASMI----- 111
+ + + +L L L+ +I L +L GLG I + MA+ I
+Sbjct: 136 TGIYGRPS-DLGVGVCLLLILQLVFAGIIVILLDELLQKGYGLGSGISLFMATNICEQIF 194
+
+Query: 112 --AYIPQDI----WNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ A+ P + + + ++ L + L+ + +
+Sbjct: 195 WKAFAPTTVNNGRGDEFEGAVVALFHLLSVRKDKRRALVEAFYRQNLPNIFQLLATFIVF 254
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ +L V ++ +Y IPV + Y I+L PIM L S ++
+Sbjct: 255 FLVVYLQGFRYEIPVRSTRQRGQNGLY---PIKLFYTSNTPIMLQSALTSNFFIISQMLF 311
+
+Query: 204 FLQPENQLIE------------------QWIEALSMG--------SPAWFILYLLTIFIL 237
+ P N ++ + P ++Y+ + +
+Sbjct: 312 QRFPLNPVVRLFGVWDARPGSAQLFASNGLAYYIQPPLSLTEALLDPIKTVIYVSFVLSV 371
+
+Query: 238 ALAFA--FINIS---GDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F+ +I IS +A++ + G I + + + ++ A G +
+Sbjct: 372 CALFSKTWIEISGTAPRDVAKQFKDQGLVIAG-RRETSVYKELKRIIPTAAAFGGASIGA 430
+
+Query: 293 ISGLPMMVVLVD 304
+ +S ++ +
+Sbjct: 431 LSVACDLLGTLG 442
+
+
+>sp|P78979|SC61A_YARLI Protein transport protein SEC61 subunit alpha
+ OS=Yarrowia lipolytica GN=SEC61 PE=3 SV=2
+ Length = 471
+
+ Score = 203 bits (516), Expect = 2e-51, Method: Composition-based stats.
+ Identities = 50/371 (13%), Positives = 119/371 (32%), Gaps = 73/371 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLS---KLPLEVQERRRMLLTLVIALIQSVALVL 57
+ SL +G++P +SS +++Q+ ++ + ++ K E+ + + L ++++L Q+ VL
+Sbjct: 76 SLMELGITPIVSSGMVFQLLGGTQLIEVNMDLKSDRELYQTAQKLFAIILSLGQATVYVL 135
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGS-IMIVMASMIAYI- 114
+ + +L L+ +I L +L GLG + + ++ I
+Sbjct: 136 TGMYGPPK-DLGVGVCLLLIFQLVLAALVVILLDELLQKGYGLGSGISLFIATNICEQIF 194
+
+Query: 115 ---------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ + + ++ + L LV ++
+Sbjct: 195 WKAFAPTTVNKGRGYEFEGAIVAFVHLLFTRKDKKRAIIEAFTRQDLPNMSQLVTTVAIF 254
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ + ++ + IPV + + I+L +PIM L S ++
+Sbjct: 255 AAVIYLQGFRVDIPVKSSKQRGPYGVF---PIKLFYTSNLPIMLQSALTSNIFIISQMLF 311
+
+Query: 204 FLQPEN------------------QLIEQWIEALSMG--------SPAWFILYLLTIFIL 237
+ P N + + P ++Y+ + +
+Sbjct: 312 KKFPTNVLVRLLGVWDGREGMQQLFPVSGIAYYMQPPFNAKEALADPVKTVIYIAFVLGV 371
+
+Query: 238 ALAFAFINI-----SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F+ I S +A++ ++ G I A + + ++ A G +
+Sbjct: 372 CAVFSATWIEISGSSPRDVAKQFKEQGLVIAGRRETSAY-KELKRIIPTAAAFGGATIGA 430
+
+Query: 293 ISGLPMMVVLV 303
+ +S ++ +
+Sbjct: 431 LSVASDLLGAL 441
+
+
+>sp|Q9JLR1|S61A2_MOUSE Protein transport protein Sec61 subunit alpha
+ isoform 2 OS=Mus musculus GN=Sec61a2 PE=2 SV=3
+ Length = 476
+
+ Score = 202 bits (514), Expect = 3e-51, Method: Composition-based stats.
+ Identities = 59/392 (15%), Positives = 126/392 (32%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + A + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPAEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 ---PQDI----WNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ P I + I+ L L+ ++ +
+Sbjct: 195 AFSPTTINTGRGTEFEGAVIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +YS I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYSSYPIKLFYTSNIPIILQSALVSNLYVISQMLSVR 311
+
+Query: 206 QPEN--------------------QLIEQWIEALSMGSPAWFI------LYLLTIFILAL 239
+ N + LS I + + IF+L
+Sbjct: 312 FSGNFLVNLLGQWADVSGGGPARSYPVGGLCYYLSPPESMGAIFEDPVHVVVYIIFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRDTSMVHE-LNRYIPTAAAFGGLCIGA 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S L + + L +++I F IF+
+Sbjct: 431 LSVLADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q9H9S3|S61A2_HUMAN Protein transport protein Sec61 subunit alpha
+ isoform 2 OS=Homo sapiens GN=SEC61A2 PE=2 SV=3
+ Length = 476
+
+ Score = 202 bits (514), Expect = 3e-51, Method: Composition-based stats.
+ Identities = 59/392 (15%), Positives = 126/392 (32%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + A + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPAEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 ---PQDI----WNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ P I + I+ L L+ ++ +
+Sbjct: 195 AFSPTTINTGRGTEFEGAVIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +YS I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYSSYPIKLFYTSNIPIILQSALVSNLYVISQMLSVR 311
+
+Query: 206 QPEN--------------------QLIEQWIEALSMGSPAWFI------LYLLTIFILAL 239
+ N + LS I + + IF+L
+Sbjct: 312 FSGNFLVNLLGQWADVSGGGPARSYPVGGLCYYLSPPESMGAIFEDPVHVVVYIIFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRDTSMVHE-LNRYIPTAAAFGGLCIGA 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S L + + L +++I F IF+
+Sbjct: 431 LSVLADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q2KHX4|S61A2_BOVIN Protein transport protein Sec61 subunit alpha
+ isoform 2 OS=Bos taurus GN=SEC61A2 PE=2 SV=3
+ Length = 476
+
+ Score = 202 bits (514), Expect = 3e-51, Method: Composition-based stats.
+ Identities = 59/392 (15%), Positives = 126/392 (32%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + A + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPAEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 ---PQDI----WNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ P I + I+ L L+ ++ +
+Sbjct: 195 AFSPTTINTGRGTEFEGAVIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +YS I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYSSYPIKLFYTSNIPIILQSALVSNLYVISQMLSVR 311
+
+Query: 206 QPEN--------------------QLIEQWIEALSMGSPAWFI------LYLLTIFILAL 239
+ N + LS I + + IF+L
+Sbjct: 312 FSGNFLVNLLGQWADVSGGGPARSYPVGGLCYYLSPPESMGAIFEDPVHVVVYIIFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRDTSMVHE-LNRYIPTAAAFGGLCIGA 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S L + + L +++I F IF+
+Sbjct: 431 LSVLADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q90ZM2|S61A1_DANRE Protein transport protein Sec61 subunit
+ alpha-like 1 OS=Danio rerio GN=sec61al1 PE=2 SV=3
+ Length = 476
+
+ Score = 202 bits (514), Expect = 3e-51, Method: Composition-based stats.
+ Identities = 53/392 (13%), Positives = 124/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPEN--------------------QLIEQWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N + LS +L + +F+L
+Sbjct: 312 FSGNFLVNLLGTWSDTSSGGPARAYPVGGLCYYLSPPESFGSVLDDPVHAVIYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q8AY32|SC61A_GADOC Protein transport protein Sec61 subunit alpha
+ OS=Gadus ogac GN=sec61a PE=2 SV=3
+ Length = 476
+
+ Score = 202 bits (514), Expect = 3e-51, Method: Composition-based stats.
+ Identities = 53/392 (13%), Positives = 123/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +V+ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLVIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPEN--------------------QLIEQWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N + S +L + +F+L
+Sbjct: 312 FSGNFLVNLLGTWSDTSTGGPARAYPVGGLCYYFSPPESFGSVLDDPVHASIYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q98SN8|S61A2_ONCMY Protein transport protein Sec61 subunit alpha
+ isoform B OS=Oncorhynchus mykiss GN=sec61ab PE=2 SV=3
+ Length = 476
+
+ Score = 201 bits (513), Expect = 4e-51, Method: Composition-based stats.
+ Identities = 52/392 (13%), Positives = 122/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSDMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLLATVFVFGV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPEN--------------------QLIEQWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N + S +L + F+L
+Sbjct: 312 FSGNFLVNLLGTWSDTSSGGPARAYPVGGLCYYFSPPESFGSVLDDPIHAAIYICFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q5EA68|S61A1_BOVIN Protein transport protein Sec61 subunit alpha
+ isoform 1 OS=Bos taurus GN=SEC61A1 PE=2 SV=3
+ Length = 476
+
+ Score = 201 bits (513), Expect = 5e-51, Method: Composition-based stats.
+ Identities = 56/392 (14%), Positives = 124/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L + I + QS+ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMTITIGQSIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGVCLLITIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGMEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATIFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSAR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNLLVSLLGTWSDTSSGGPARAYPVGGLCYYLSPPESFGSVLEDPVHAVVYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGA 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S L + + L +++I F IF+
+Sbjct: 431 LSVLADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|P61621|S61A1_RAT Protein transport protein Sec61 subunit alpha
+ isoform 1 OS=Rattus norvegicus GN=Sec61a1 PE=2 SV=2
+ Length = 476
+
+ Score = 201 bits (513), Expect = 5e-51, Method: Composition-based stats.
+ Identities = 56/392 (14%), Positives = 125/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + QS+ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQSIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLITIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGMEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATIFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSAR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNLLVSLLGTWSDTSSGGPARAYPVGGLCYYLSPPESFGSVLEDPVHAVVYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGA 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S L + + L +++I F IF+
+Sbjct: 431 LSVLADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q5R5L5|S61A1_PONAB Protein transport protein Sec61 subunit alpha
+ isoform 1 OS=Pongo abelii GN=SEC61A1 PE=2 SV=3
+ Length = 476
+
+ Score = 201 bits (513), Expect = 5e-51, Method: Composition-based stats.
+ Identities = 56/392 (14%), Positives = 125/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + QS+ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQSIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLITIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGMEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATIFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSAR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNLLVSLLGTWSDTSSGGPARAYPVGGLCYYLSPPESFGSVLEDPVHAVVYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGA 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S L + + L +++I F IF+
+Sbjct: 431 LSVLADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|P61620|S61A1_MOUSE Protein transport protein Sec61 subunit alpha
+ isoform 1 OS=Mus musculus GN=Sec61a1 PE=2 SV=2
+ Length = 476
+
+ Score = 201 bits (513), Expect = 5e-51, Method: Composition-based stats.
+ Identities = 56/392 (14%), Positives = 125/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + QS+ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQSIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLITIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGMEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATIFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSAR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNLLVSLLGTWSDTSSGGPARAYPVGGLCYYLSPPESFGSVLEDPVHAVVYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGA 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S L + + L +++I F IF+
+Sbjct: 431 LSVLADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|P61619|S61A1_HUMAN Protein transport protein Sec61 subunit alpha
+ isoform 1 OS=Homo sapiens GN=SEC61A1 PE=1 SV=2
+ Length = 476
+
+ Score = 201 bits (513), Expect = 5e-51, Method: Composition-based stats.
+ Identities = 56/392 (14%), Positives = 125/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + QS+ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQSIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLITIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGMEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATIFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSAR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNLLVSLLGTWSDTSSGGPARAYPVGGLCYYLSPPESFGSVLEDPVHAVVYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGA 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S L + + L +++I F IF+
+Sbjct: 431 LSVLADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q7T278|SC61A_HARAN Protein transport protein Sec61 subunit alpha
+ OS=Harpagifer antarcticus GN=sec61a PE=2 SV=3
+ Length = 476
+
+ Score = 201 bits (512), Expect = 6e-51, Method: Composition-based stats.
+ Identities = 54/392 (13%), Positives = 125/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNILNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNFLVNLLGTWSDATSGGPARAYPVAGLCYYLSPPESFGSVLDDPVHAAIYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q7T277|SC61A_DISMA Protein transport protein Sec61 subunit alpha
+ OS=Dissostichus mawsoni GN=sec61a PE=2 SV=3
+ Length = 476
+
+ Score = 201 bits (512), Expect = 6e-51, Method: Composition-based stats.
+ Identities = 54/392 (13%), Positives = 125/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNILNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNFLVNLLGTWSDATSGGPARAYPVAGLCYYLSPPESFGSVLDDPVHAAIYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q8AY36|SC61A_PAGBO Protein transport protein Sec61 subunit alpha
+ OS=Pagothenia borchgrevinki GN=sec61a PE=2 SV=3
+ Length = 476
+
+ Score = 201 bits (511), Expect = 7e-51, Method: Composition-based stats.
+ Identities = 54/392 (13%), Positives = 125/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNILNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNFLVNLLGTWSDATSGGPARAYPVAGLCYYLSPPESFGSVLDDPVHAAIYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q8AY35|SC61A_NOTAN Protein transport protein Sec61 subunit alpha
+ OS=Notothenia angustata GN=sec61a PE=2 SV=3
+ Length = 476
+
+ Score = 201 bits (511), Expect = 7e-51, Method: Composition-based stats.
+ Identities = 54/392 (13%), Positives = 125/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNILNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNFLVNLLGTWSDATSGGPARAYPVAGLCYYLSPPESFGSVLDDPVHAAIYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q8AY34|SC61A_HEMAM Protein transport protein Sec61 subunit alpha
+ OS=Hemitripterus americanus GN=sec61a PE=2 SV=3
+ Length = 476
+
+ Score = 201 bits (511), Expect = 8e-51, Method: Composition-based stats.
+ Identities = 55/392 (14%), Positives = 126/392 (32%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K +G+ P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIGVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREGFYRQNLPNLMNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNFLVNLLGTWSDATSGGPARAYPVAGLCYYLSPPESFGSVLDDPVHAGIYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q90YL4|S61A2_DANRE Protein transport protein Sec61 subunit
+ alpha-like 2 OS=Danio rerio GN=sec61al2 PE=2 SV=3
+ Length = 476
+
+ Score = 201 bits (511), Expect = 8e-51, Method: Composition-based stats.
+ Identities = 55/392 (14%), Positives = 124/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q+V V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAVVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATIFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPEN--------------------QLIEQWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N + LS +L + IF+L
+Sbjct: 312 FSGNFLVNLLGTWSDTSTGGPARAYPVGGLCYYLSPPESFGTVLEDPIHAIIYIIFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q8AY31|SC61A_BOVVA Protein transport protein Sec61 subunit alpha
+ OS=Bovichtus variegatus GN=sec61a PE=2 SV=3
+ Length = 476
+
+ Score = 200 bits (510), Expect = 9e-51, Method: Composition-based stats.
+ Identities = 53/392 (13%), Positives = 125/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G++P ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGIAPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFGPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNFLVNLLGTWSDATTSGPARAYPVAGLCYYLSPPESFGSVLDDPVHAVIYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|P38377|S61A1_CANFA Protein transport protein Sec61 subunit alpha
+ isoform 1 OS=Canis familiaris GN=SEC61A1 PE=1 SV=3
+ Length = 476
+
+ Score = 200 bits (510), Expect = 1e-50, Method: Composition-based stats.
+ Identities = 56/392 (14%), Positives = 125/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + QS+ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQSIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLITIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGMEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATIFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSAR 311
+
+Query: 206 QPENQLIE--------------------QWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N L+ LS +L + +F+L
+Sbjct: 312 FSGNLLVSLLGTWSDTSSGGPARAYPVGGLCHYLSPPESFGSVLEDPVHAVVYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGA 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S L + + L +++I F IF+
+Sbjct: 431 LSVLADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q9P8E3|SC61A_CANAL Protein transport protein SEC61 subunit alpha
+ OS=Candida albicans GN=SEC61 PE=3 SV=1
+ Length = 479
+
+ Score = 199 bits (508), Expect = 1e-50, Method: Composition-based stats.
+ Identities = 57/374 (15%), Positives = 122/374 (32%), Gaps = 77/374 (20%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPL---EVQERRRMLLTLVIALIQSVALVL 57
+ +L +G+SP +SS +++Q+ +K + + E + + LL +++A+ Q+ VL
+Sbjct: 76 TLMELGISPIVSSGMLFQLLQGTKIIHVDMQNKNDRETFQTAQKLLAILLAVGQATVYVL 135
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGSIMIVMASMI----- 111
+ + + + +L L L+ + +I L +L GLG + + A+
+Sbjct: 136 TGMYGPPSSLGVGVCSLL-ILQLVFASTIVILLDELLQKGYGLGSGVSLFTATNTCEQVF 194
+
+Query: 112 --AYIP----QDIWNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ A+ P ++ L L+ +L+
+Sbjct: 195 WKAFAPTTSTSAKGTEFDGAVVAMFHLLGSRKDKKRALIESFYRPNLPNMFQLLATLLVF 254
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ + V ++ + +P+ + Y IRL +PIM L S ++
+Sbjct: 255 FAVVYLQGFRIELPMKSTRQRGPYGSY---PIRLFYTSNIPIMLESALASNIFIISQLLF 311
+
+Query: 204 FLQPENQLIE------------------QWIEALSMGSPAWFILYLLTIFILALAFAFI- 244
+ P N ++ + P F LL + AF+
+Sbjct: 312 MRWPNNLFVKLLGTWDARAGSSQLYANGGLAYYIQP--PFNFTDALLDPIKTTIYIAFVL 369
+
+Query: 245 --------------NISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYL 290
+ S +A++ ++ G I A + + ++ A G +
+Sbjct: 370 GSCAVFSTTWIEISGTSPRDVAKQFKEQGLVIAGHRDTSAY-KELKKIIHIAAAFGGATI 428
+
+Query: 291 ILISGLPMMVVLVD 304
+ +S + ++ +
+Sbjct: 429 GALSVVCDLMGTLG 442
+
+
+>sp|Q6FRY3|SC61A_CANGA Protein transport protein SEC61 subunit alpha
+ OS=Candida glabrata GN=SEC61 PE=3 SV=1
+ Length = 479
+
+ Score = 199 bits (507), Expect = 2e-50, Method: Composition-based stats.
+ Identities = 54/373 (14%), Positives = 119/373 (31%), Gaps = 74/373 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR---MLLTLVIALIQSVALVL 57
+ +L +G+SP ++S +I+Q ++ L +S E +E + + +++ Q++ +V+
+Sbjct: 75 TLMELGVSPIITSSMIFQFLQGTQLLQVSLDSKEDRELYQIAQKVCAIILTFGQALVVVM 134
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGSIMIVMASMIA---- 112
+ + I +L LM ++ ++ L +L GLG I + A+ IA
+Sbjct: 135 TGNYGSPS-DLGIAISLLLIFQLMFASFIVLLLDELLTKGYGLGSGISLFTATNIAENIF 193
+
+Query: 113 -------YIPQDIWNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ + + I+ L + ++ ++
+Sbjct: 194 WKAFAPTTVNSGRGKEFEGAVIAFFHLLAVRKDKKRALVEAFYRENLPNMFQVIATVFVF 253
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ + ++ +Y +PV + + + I+L PIM L S I+
+Sbjct: 254 LFVLYLQGFRYELPVKSTKVR---GQMAIYPIKLFYTSNTPIMLQSALSSNIFLISQILF 310
+
+Query: 204 FLQPENQ-------------------LIEQWIEALSMGSPAWFILY------LLTIFILA 238
+ P N + L L + T F+L
+Sbjct: 311 QKYPSNPVIRLFGVWGIRPGTNGPQVPLSGISYYLQPIGSLKMALLDPIKTVIYTAFVLG 370
+
+Query: 239 LAFAFIN-------ISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLI 291
+ F S +A++ ++ G I + + + ++ A G +
+Sbjct: 371 TCALFSKTWIEISGTSAKDVAKQFKEQGMVINGKRET-SVYKELKKIIPTAAAFGGATIG 429
+
+Query: 292 LISGLPMMVVLVD 304
+ +S ++ +
+Sbjct: 430 ALSVGSDLLGALG 442
+
+
+>sp|Q752H7|SC61A_ASHGO Protein transport protein SEC61 subunit alpha
+ OS=Ashbya gossypii GN=SEC61 PE=3 SV=1
+ Length = 480
+
+ Score = 199 bits (507), Expect = 2e-50, Method: Composition-based stats.
+ Identities = 50/374 (13%), Positives = 123/374 (32%), Gaps = 75/374 (20%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQ---ERRRMLLTLVIALIQSVALVL 57
+ +L +G+SP ++S +I+Q ++ L ++ + + + + + +V+ L Q++ +VL
+Sbjct: 75 TLMELGVSPIITSSMIFQFLQGTQLLQVNLESKQDRELFQIAQKVCAIVLTLGQAIVVVL 134
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDL-NAAMGLGGSIMIVMASMIA---- 112
+ I +L L L+ ++ ++ L +L GLG I + A+ IA
+Sbjct: 135 TGNYGS-VSNLGIAISLLLILQLVFASFIVLLLDELLIKGYGLGSGISLFTATNIAEQIF 193
+
+Query: 113 -------YIPQDIWNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ + + ++ L + ++ ++
+Sbjct: 194 WKAFAPTTVNNGRGTEFEGAVVALFHLLSVRKDKKRALVEAFYRDYLPNMFQVLSTVFVF 253
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ + ++ +Y +PV + Y I+L PIM L S +++
+Sbjct: 254 LFVLYLQGFRYELPVRSTRTRGQVGSY---PIKLFYTSNTPIMLQSALTSNIFLTSQLLY 310
+
+Query: 204 FLQPENQLIE--------------------QWIEALSMG--------SPAWFILYLLTIF 235
+ P N +++ + P ++Y+ +
+Sbjct: 311 QKFPNNPIVKMLGVWGTRSDAPYSPNAAISGLSYYIQPPFSFTEALLDPIKTVVYVTFVL 370
+
+Query: 236 ILALAFAFINIS-----GDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYL 290
+ F+ I ++++ ++ G I + R + ++ A G +
+Sbjct: 371 GACAMFSRTWIDVSGTSPRDVSKQFKEQGLVING-RRETSVYRELKKVIPTAAAFGGATI 429
+
+Query: 291 ILISGLPMMVVLVD 304
+ +S ++ +
+Sbjct: 430 GALSVGSDLLGTLG 443
+
+
+>sp|P25014|SECY_CYAPA Preprotein translocase subunit secY
+ OS=Cyanophora paradoxa GN=secY PE=3 SV=2
+ Length = 492
+
+ Score = 199 bits (507), Expect = 2e-50, Method: Composition-based stats.
+ Identities = 70/337 (20%), Positives = 138/337 (40%), Gaps = 31/337 (9%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQE-------RRRMLLTLVIALIQSV 53
+ F++G+ P+M++ Q+ L + E +E + LT++ A IQS+
+Sbjct: 109 GFFTLGILPYMNASFFLQVLT-KILPSLERFQKEQEEIAQREFKKWTRYLTVIWAFIQSI 167
+
+Query: 54 ALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSI-MIVMASMIA 112
+ + ++ A + + + L G ++ + + +GL +++ ++IA
+Sbjct: 168 VISWIW-IRPYALNWDFFLGLKVVVALTLGAVIVMIIAEQITEIGLTNGSSLLIFINIIA 226
+
+Query: 113 YIPQDIWNSIQE----LKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFK 168
+ IP I L L L S + +++ + ++ S +PV +
+Sbjct: 227 RIPNSIEQLFNSNINWTFPMISSLILSLSLSFITMFVIIGLQESGRPVPVLIARQEAERQ 286
+
+Query: 169 KY-------------SYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQW 215
+ K+ +Y+ +L PAG MP+++A T+ + +FL + Q
+Sbjct: 287 KFNEPITEAERRKTQAYIFFQLLPAGIMPVIFASTIFDL--ALPAFTNFLLQQGNWGYQL 344
+
+Query: 216 IEALSMGSPAWFILYLLTIFILALAFAF-INISGDQIAERMQKSGEYIENVYPGGATRRY 274
+ I++ S YL+TI + + +A I I+ +AE + I V PG T+ Y
+Sbjct: 345 IKSFPFNSLFKDFCYLITIMLFSSNYALTIMINPKTLAENLNSMNALIPGVRPGSETKVY 404
+
+Query: 275 INGLVTYFALVGAFYLILISGLPMMVV-LVDIRYLRL 310
+ L+ +G+F L L+ LP +V + + L++
+Sbjct: 405 SEQLIHRLNFIGSFVLALVCILPSIVERSLGLPKLQI 441
+
+
+>sp|Q6CPY9|SC61A_KLULA Protein transport protein SEC61 subunit alpha
+ OS=Kluyveromyces lactis GN=SEC61 PE=3 SV=1
+ Length = 480
+
+ Score = 199 bits (506), Expect = 3e-50, Method: Composition-based stats.
+ Identities = 51/374 (13%), Positives = 124/374 (33%), Gaps = 75/374 (20%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR---MLLTLVIALIQSVALVL 57
+ +L +G+SP ++S +I+Q ++ L ++ + +E + + +++ Q++ +VL
+Sbjct: 75 TLMELGVSPIITSSMIFQFLQGTQLLQVNMENKQDRELYQIAQKVFAILLTFGQAIVVVL 134
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGSIMIVMASMI----- 111
+ + + I +L L+ ++ ++ L +L + GLG I + A+ I
+Sbjct: 135 TGNYGKPS-DLGLAISLLLIFQLIFASFTVLLLDELLSKGYGLGSGISLFTATNIAEQIT 193
+
+Query: 112 --AYIPQDI----WNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ A+ P + + I+ L + + ++
+Sbjct: 194 WKAFAPTTVNVGRGQEFEGAVIALFHLLAIRKDKKRALVEAFYRENLPNMFQVFSTIGVF 253
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ + ++ +Y +P+ ++ Y I+L PIM L S I++
+Sbjct: 254 LSVLYLQGFRYELPIKSTRTRGQYGSY---PIKLFYTSNTPIMLQSALTSNIFLISQILY 310
+
+Query: 204 FLQPENQLIE--------------------QWIEALSMG--------SPAWFILYLLTIF 235
+ N L++ + P ++Y+ +
+Sbjct: 311 QRFSTNPLVKLLGVWGTRAGAPAGQQVALSGLSYYIQPPFSVTDALLDPIKTVVYVGFVL 370
+
+Query: 236 ILALAFAFINI-----SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYL 290
+ F+ I S +A++ + G I + + ++ A G +
+Sbjct: 371 GACALFSKTWIEISGTSPRDVAKQFKDQGLTINGKRET-NVYKELKKIIPTAAAFGGAVI 429
+
+Query: 291 ILISGLPMMVVLVD 304
+ +S ++ +
+Sbjct: 430 GALSVGSDLLGTLG 443
+
+
+>sp|Q6BN08|SC61A_DEBHA Protein transport protein SEC61 subunit alpha
+ OS=Debaryomyces hansenii GN=SEC61 PE=3 SV=1
+ Length = 479
+
+ Score = 198 bits (504), Expect = 4e-50, Method: Composition-based stats.
+ Identities = 55/372 (14%), Positives = 123/372 (33%), Gaps = 73/372 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQ---ERRRMLLTLVIALIQSVALVL 57
+ +L +G+SP +S+ +++Q+ +K + + + + + L +++A+ Q+ VL
+Sbjct: 76 TLMELGISPIVSAGMVFQLLQGTKLITVDMSNKNDRDQFQTAQKLFAILLAVGQATVYVL 135
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGSIMIVMASMI----- 111
+ + + ++L ++ AG +I L +L GLG I + A+ +
+Sbjct: 136 TGMYGPPSSLGTGVCLLLVLQLVFAG-IVVILLDELLQKGYGLGSGISLFTATNVCEQVF 194
+
+Query: 112 --AYIPQ----DIWNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ A+ P + ++ L L+ ++
+Sbjct: 195 WKAFAPTTSNIGKGTEFEGAVVALFHLLGSRKDKKRALLEAFYRSHLPNMFQLIATVFVF 254
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ L V ++ + +P+ + Y IRL +PIM L S ++
+Sbjct: 255 LLVVYLQGFRIELPIKSTRQRGPYGLY---PIRLFYTSNIPIMLQSALSSNIFIISQMLF 311
+
+Query: 204 FLQPENQLIE------------------QWIEALSMG--------SPAWFILYLLTIFIL 237
+ P N ++ + P I+Y++ +
+Sbjct: 312 VRWPNNIFVKILGSWDTRQGAAQLYAVSGLAYYIQPPLSFTEALLDPIKTIIYIIFVLGS 371
+
+Query: 238 ALAFAFINI-----SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F+ I S +A++ ++ G I A R + ++ A G +
+Sbjct: 372 CAVFSTTWIEISGASPRDVAKQFKEQGLVIAGHRDTSAY-RELKKIIPTAAAFGGATIGA 430
+
+Query: 293 ISGLPMMVVLVD 304
+ +S ++ +
+Sbjct: 431 LSVFCDLMGTLG 442
+
+
+>sp|Q8AY33|SC61A_BORSA Protein transport protein Sec61 subunit alpha
+ OS=Boreogadus saida GN=sec61a PE=2 SV=3
+ Length = 476
+
+ Score = 198 bits (504), Expect = 4e-50, Method: Composition-based stats.
+ Identities = 54/392 (13%), Positives = 126/392 (32%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + Q++ V+
+Sbjct: 75 TLMELGISPIVTSDLIMQLLAGAKIIEVGDSPKDRALFNGAQKLFGMIITIGQAIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +V+ + +AG L+ L GLG +++ ++ I
+Sbjct: 135 GMYGDPSEMGAGICLVIIIQLFVAGLIVLLLDELLQKGYGLGSGISLLIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLMNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPENQL--------------------IEQWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N + + LS +L + +F+L
+Sbjct: 312 FSGNFIVNLLGTWSDTSTGGPARAYPVGGLCYFLSPPESFGSVLDDPVHAAIYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMRGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|Q98SN9|S61A1_ONCMY Protein transport protein Sec61 subunit alpha
+ isoform A OS=Oncorhynchus mykiss GN=sec61aa PE=2 SV=3
+ Length = 476
+
+ Score = 198 bits (503), Expect = 5e-50, Method: Composition-based stats.
+ Identities = 54/392 (13%), Positives = 124/392 (31%), Gaps = 75/392 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G+SP ++S LI Q+ A +K + + P + + L ++I + QS+ V+
+Sbjct: 75 TLMELGISPIVTSGLIMQLLAGAKIIEVGDTPKDRALFNGAQKLFGMIITIGQSIVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAYI--- 114
+ + + + +++ + +AG L+ L GLG + + ++ I
+Sbjct: 135 GMYGDPSEMGAGICLLIIIQLFVAGLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 115 -------PQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ + I+ L L+ ++ +
+Sbjct: 195 AFSPTTVNTGRGTEFEGAIIALFHLLATRTDKVRALREAFYRQNLPNLLNLIATVFVFAV 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +Y+ I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYNTYPIKLFYTSNIPIILQSALVSNLYVISQMLSTR 311
+
+Query: 206 QPEN--------------------QLIEQWIEALSMGSPAWFIL------YLLTIFILAL 239
+ N + LS +L + +F+L
+Sbjct: 312 FSGNFLVNLLGTWSDTSTGGPARAYPVGGLCYFLSPPESFGSVLDDPIHAAIYIVFMLGS 371
+
+Query: 240 AFAFINI-------SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLIL 292
+ F S +A+++++ + +N + A G +
+Sbjct: 372 CAFFSKTWIEVSGSSAKDVAKQLKEQQMVMGGHRETSMVHE-LNRYIPTAAAFGGLCIGG 430
+
+Query: 293 ISGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ +S + + + L +++I F IF+
+Sbjct: 431 LSVMADFLGAIGSGTGILLAVTIIYQYFEIFV 462
+
+
+>sp|P46249|SECY_CYACA Preprotein translocase subunit secY
+ OS=Cyanidium caldarium GN=secY PE=3 SV=2
+ Length = 410
+
+ Score = 193 bits (492), Expect = 1e-48, Method: Composition-based stats.
+ Identities = 59/313 (18%), Positives = 134/313 (42%), Gaps = 16/313 (5%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERR------RMLLTLVIALIQSVA 54
+ S+F++G+ P++++ + Q+ + + E + + L+ A I+S+A
+Sbjct: 62 SVFALGIIPYINATITIQILSSAFPALKKLQSEEGEIGKKKLNKITKYLSFCFAFIESLA 121
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ +VL L Q+ A +V TL+L++G ++WL D + G+G +I+ ++ +
+Sbjct: 122 IVLRL--QKYAFDWNLYFIVQTTLILISGAMLVMWLADNISYKGIGTGASVIIFVNIASA 179
+
+Query: 114 IPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINI---HNRFKKY 170
+ + + N + I L A + + V V+ + ++P+ + +
+Sbjct: 180 FAKFLLNQLFVHSIKFLDFASYFALIVFSIACIVFVQEAIRKVPIISAKQLDSTSFYSND 239
+
+Query: 171 SYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWFILY 230
+ +L +R+N G MPI+ A +L+++ Y + +I + + +LY
+Sbjct: 240 YFLPLRINQGGVMPIILASSLLALVDYVIRY----GLSTLQAVYFINDILPFKILFLLLY 295
+
+Query: 231 LLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYL 290
+ I + + ++ +++ ++K+ I ++ PG T ++ + L G+ +L
+Sbjct: 296 SAFIIFFNYLYCSLVLNCFELSNNLKKASVVIPSIRPGKMTEKFFKDTLDNLTLFGSGFL 355
+
+Query: 291 ILISGLPMMVVLV 303
+ I P + V
+Sbjct: 356 AFIVLAPNFLEFV 368
+
+
+>sp|P32915|SC61A_YEAST Protein transport protein SEC61
+ OS=Saccharomyces cerevisiae GN=SEC61 PE=1 SV=1
+ Length = 480
+
+ Score = 193 bits (491), Expect = 2e-48, Method: Composition-based stats.
+ Identities = 54/373 (14%), Positives = 124/373 (33%), Gaps = 74/373 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGL---SKLPLEVQERRRMLLTLVIALIQSVALVL 57
+ +L +G+SP ++S +I+Q ++ L + SK E+ + + + +++ L Q++ +V+
+Sbjct: 76 TLLELGVSPIITSSMIFQFLQGTQLLQIRPESKQDRELFQIAQKVCAIILILGQALVVVM 135
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGSIMIVMASMIA---- 112
+ + + + +L LM + ++ L +L + GLG I + A+ IA
+Sbjct: 136 TGNYGAPSDLGLPIC-LLLIFQLMFASLIVMLLDELLSKGYGLGSGISLFTATNIAEQIF 194
+
+Query: 113 -------YIPQDIWNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ + + I+ L + ++ ++
+Sbjct: 195 WRAFAPTTVNSGRGKEFEGAVIAFFHLLAVRKDKKRALVEAFYRTNLPNMFQVLMTVAIF 254
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ + ++ +Y +P+ + + Y I+L PIM L S I+
+Sbjct: 255 LFVLYLQGFRYELPIRSTKVRGQIGIY---PIKLFYTSNTPIMLQSALTSNIFLISQILF 311
+
+Query: 204 FLQPENQLIE-------------------QWIEALSM------------GSPAWFILYLL 232
+ P N LI + + + L
+Sbjct: 312 QKYPTNPLIRLIGVWGIRPGTQGPQMALSGLAYYIQPLMSLSEALLDPIKTIVYITFVLG 371
+
+Query: 233 TIFILALAFAFIN-ISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLI 291
+ + + + + I+ S IA++ + G I + R + ++ A G +
+Sbjct: 372 SCAVFSKTWIEISGTSPRDIAKQFKDQGMVINGKRET-SIYRELKKIIPTAAAFGGATIG 430
+
+Query: 292 LISGLPMMVVLVD 304
+ +S ++ +
+Sbjct: 431 ALSVGSDLLGTLG 443
+
+
+>sp|Q25147|SC61A_HALRO Protein transport protein Sec61 subunit alpha
+ OS=Halocynthia roretzi PE=2 SV=1
+ Length = 475
+
+ Score = 192 bits (488), Expect = 4e-48, Method: Composition-based stats.
+ Identities = 59/391 (15%), Positives = 131/391 (33%), Gaps = 74/391 (18%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEV--QERRRMLLTLVIALIQSVALVLN 58
+ +L +G++P ++S LI Q+ A +K + + P + + L ++I + Q+V V+
+Sbjct: 75 TLMELGITPIVTSGLIMQLLAGAKLIEVGDTPKDRALFNGAQKLFGMIITIGQAVVYVMT 134
+
+Query: 59 LPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMASMI------- 111
+ + + + +++ + +A L+ L GLG I + +A+ I
+Sbjct: 135 GMYGDPSDMGAGICLLIIIQLFIASLIVLLLDELLQKGYGLGSGISLFIATNICETIVWK 194
+
+Query: 112 ----AYIPQDIWNSIQELKISSLWLALM----------------------LVFSLVFLYL 145
+ A + + I+ L L +++ +
+Sbjct: 195 SFSPATVNTGRGTEFEGAVIALFHLLATRSDKVRALREAFYRPNLPNLMNLSATILVFGI 254
+
+Query: 146 AVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFL 205
+ + + + +P+ +YS I+L +PI+ LVS ++
+Sbjct: 255 VIYFQGFRVDLPIKSAR---YRGQYSSYPIKLFYTSNIPIILQSALVSGLYVISQMLAIR 311
+
+Query: 206 QPENQLIEQ-------------------WIEALSMGSPAWFI-------LYLLTIFILAL 239
+ N I LS + + L +T + +
+Sbjct: 312 FRGNFFIGLLGVWEDVEGGGPARSYPVALCYYLSPPESFFSMFLDPIHGLLYITFMLGSC 371
+
+Query: 240 AF---AFINIS---GDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLILI 293
+ AF +I +S +A+++++ + + +N + A G + +
+Sbjct: 372 AFFSKTWIEVSGSAAKDVAKQLKEQQMVMRGHRE-KSMIHELNRYIPTAAAFGGLCIGAL 430
+
+Query: 294 SGLPMMVVLVDIR---YLRLSMIPGIFMIFI 321
+ S L + + L +++I F IF+
+Sbjct: 431 SVLADFIGAIGSGTGILLAVTIIYQYFEIFV 461
+
+
+>sp|O26134|SECY_METTH Preprotein translocase subunit secY
+ OS=Methanobacterium thermoautotrophicum GN=secY PE=3
+ SV=1
+ Length = 456
+
+ Score = 191 bits (486), Expect = 5e-48, Method: Composition-based stats.
+ Identities = 52/345 (15%), Positives = 118/345 (34%), Gaps = 51/345 (14%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQ---ERRRMLLTLVIALIQSVALVL 57
+ S+ ++G+ P +S+ +I Q+ K L L E + + + LL +V +++ VL
+Sbjct: 73 SILTLGIGPIVSASIILQLLVGGKILKLDLSRHEDKAFFQGLQKLLAIVFTFFEALIFVL 132
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMASMIA----- 112
+ L +A + + L L G +I+L ++ + G G + + +A+ ++
+Sbjct: 133 TGSLAPSA----PQFVWVLILQLTIGGILIIFLDEVVSKWGFGSGVGLFIAAGVSQEIIV 188
+
+Query: 113 -----------------YIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYR 155
+ I ++ + L ++ + + V E +
+Sbjct: 189 GAFNPLSAPTQPGVPAGRITGFLYLLFTGQSPDFQYYVLPVLALIAVFLVVVYAESMRVE 248
+
+Query: 156 IPVNK-INIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQ-------P 207
+ IP++ +R A MP++ L+ Q + L
+Sbjct: 249 IPISMGGGKRLSRGAVGKYPLRFIYASNMPVILTSALLLNVQLLANVFQKLGYPILGTVS 308
+
+Query: 208 ENQLIEQWIEALSMGS--------PAWFILYLLTIFILALAFAFI-----NISGDQIAER 254
+ Q ++ L+ P + Y + L + FA++ NI +A +
+Sbjct: 309 NGQAVDGLAYLLTAPRSIDALILDPFRVVFYAVVFIGLCVLFAWLWVEISNIGPRHVARQ 368
+
+Query: 255 MQKSGEYIENVYPGG-ATRRYINGLVTYFALVGAFYLILISGLPM 298
+ + + G I + + + ++G ++ L++ +
+Sbjct: 369 LYQMGMQIPGFRSSRGQFEKILKRYIPTITILGGAFVGLLAFVAD 413
+
+
+>sp|P38379|SC61A_PYRSA Protein transport protein Sec61 subunit alpha
+ OS=Pyrenomonas salina PE=2 SV=1
+ Length = 494
+
+ Score = 188 bits (478), Expect = 5e-47, Method: Composition-based stats.
+ Identities = 62/374 (16%), Positives = 132/374 (35%), Gaps = 74/374 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQ---ERRRMLLTLVIALIQSVALVL 57
+ +L +G+SP ++S L+ Q+ A SK + + + E + + + LL ++I + +SVA VL
+Sbjct: 78 TLMELGISPIVTSGLVMQLLAGSKIIDVDQGTKEDKTLFQGAQKLLGILITIGESVAYVL 137
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGSIMIVMASMI----- 111
+ + + + +L + L +I L +L G+G +I + +A+ +
+Sbjct: 138 SGMYGDVKDLGAGN-AILIIVQLFTSGIIVICLDELLQKGYGIGSAISLFIATNVCESIV 196
+
+Query: 112 ------AYIPQDIWNSIQELKISSLWLALM----------------------LVFSLVFL 143
+ I + ++ L + L+ +++
+Sbjct: 197 WKSFSPTTINTGRGTEFEGALVALFQLMITKTDKVRALQEAFYRQNLPNVTNLLATVLVF 256
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ L V + + +P+ ++ I+L MPI+ LVS + I++
+Sbjct: 257 VLVVYFQGFQVELPITPAKSKGMAGQF--YPIKLFYTSNMPIILQTALVSNLYFISQILY 314
+
+Query: 204 FLQPENQLI--------------------EQWIEALSMGSPAWFIL------YLLTIFIL 237
+ PEN +I +S + I+ L IFIL
+Sbjct: 315 KRYPENIIIHILGRWEEPEMSVSGQMRPVGGIAYYISPLNSFAEIVSDPVHALLYIIFIL 374
+
+Query: 238 ALAFAFIN-------ISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYL 290
+ A F S ++++++ ++ + +R +N + A G +
+Sbjct: 375 ASCALFSKTWIQVSGTSASDVSKQLRDQQMVMKGFRAS-SMQRELNRYIPTAAAFGGMCI 433
+
+Query: 291 ILISGLPMMVVLVD 304
+ +S + + +
+Sbjct: 434 GALSIVADFMGAIG 447
+
+
+>sp|Q37143|SECY_ANTSP Preprotein translocase subunit secY
+ OS=Antithamnion sp. GN=secY PE=3 SV=1
+ Length = 405
+
+ Score = 184 bits (467), Expect = 8e-46, Method: Composition-based stats.
+ Identities = 61/315 (19%), Positives = 141/315 (44%), Gaps = 24/315 (7%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRM------LLTLVIALIQSVA 54
+ +F++G+ P++ + +I Q+ + E + R+ LTL+ ALIQS++
+Sbjct: 62 GIFALGIVPYIYASIIIQLLIKLIPYLENLQKEEGEIGRQKINQLTRYLTLLWALIQSLS 121
+
+Query: 55 LVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASMIAY 113
+ + + + + L + +W +++ + G+G +++ ++I+
+Sbjct: 122 IAIWINHM------YLIHLFELCASLTTSSMIAMWFSEIISEYGVGNGPSLLIFQNIISS 175
+
+Query: 114 IPQDIWNSIQELKISSLWL--ALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFKKYS 171
+ IP+++ N + ++ L +L+L F ++ L + + ++ + +I + + + +
+Sbjct: 176 IPKNLQNYTFNIGTTNTVLNGSLILSFGIIILIINILIQEGERKIAILSAKQLGKINELN 235
+
+Query: 172 Y---LDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWFI 228
+ + ++LN G MP ++A +V + N I Q+I +
+Sbjct: 236 HKVIFLLKLNQGGVMPFVFASAVV------HTFLFISNNTNSKITQFINLFLPNQFLYLP 289
+
+Query: 229 LYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAF 288
+ LYL+ I + + + ++ + IA+ ++K G I N+ PG T +Y+N + L+GA
+Sbjct: 290 LYLIFIITFSYVYTSLILNPEDIAKNLKKMGASIPNIRPGSETIKYLNTRINRLTLIGAC 349
+
+Query: 289 YLILISGLPMMVVLV 303
+ +L I+ P + +
+Sbjct: 350 FLFTITLFPTITYYI 364
+
+
+>sp|Q60175|SECY_METJA Preprotein translocase subunit secY
+ OS=Methanocaldococcus jannaschii GN=secY PE=1 SV=2
+ Length = 436
+
+ Score = 183 bits (466), Expect = 1e-45, Method: Composition-based stats.
+ Identities = 48/338 (14%), Positives = 127/338 (37%), Gaps = 41/338 (12%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQ---ERRRMLLTLVIALIQSVALVL 57
+ +L ++G+ P +++ +I Q+ S + + E + + + LL++++ +++V V
+Sbjct: 69 TLITLGIGPIVTAGIIMQLLVGSGIIQMDLSIPENRALFQGCQKLLSIIMCFVEAVLFVG 128
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSI-MIVMASMIAYI-- 114
+ + + L + + G+ LI+L ++ + G+G I + + A + I
+Sbjct: 129 AGAFG----ILTPLLAFLVIIQIAFGSIILIYLDEIVSKYGIGSGIGLFIAAGVSQTIFV 184
+
+Query: 115 -----PQDIWNSIQELKISSLWLALM--LVFSLVFLYLAVTVERSKYRIPVNKINIHNRF 167
+ +W + L + + ++ +++ + V E + IP+ I
+Sbjct: 185 GALGPEGYLWKFLNSLIQGVPNIEYIAPIIGTIIVFLMVVYAECMRVEIPLAHGRIKGAV 244
+
+Query: 168 KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH-------FLQPENQLIEQWIEALS 220
+ KY I+ +P++ A L + Q + L ++ + ++ LS
+Sbjct: 245 GKY---PIKFVYVSNIPVILAAALFANIQLWGLALYRMGIPILGHYEGGRAVDGIAYYLS 301
+
+Query: 221 MG--------SPAWFILYLLTIFILALAFAFI-----NISGDQIAERMQKSGEYIENVYP 267
+ P I+Y++ + I + F + +A+R+ G I+
+Sbjct: 302 TPYGLSSVISDPIHAIVYMIAMIITCVMFGIFWVETTGLDPKSMAKRIGSLGMAIKGFRK 361
+
+Query: 268 G-GATRRYINGLVTYFALVGAFYLILISGLPMMVVLVD 304
+ A + + ++ + ++ ++ + + +
+Sbjct: 362 SEKAIEHRLKRYIPPLTVMSSAFVGFLATIANFIGALG 399
+
+
+>sp|P28540|SECY_PAVLU Preprotein translocase subunit secY OS=Pavlova
+ lutherii GN=secY PE=3 SV=2
+ Length = 419
+
+ Score = 179 bits (455), Expect = 3e-44, Method: Composition-based stats.
+ Identities = 67/337 (19%), Positives = 146/337 (43%), Gaps = 23/337 (6%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQE-------RRRMLLTLVIALIQSV 53
+ S+ ++GL P+ S+ L Q V KL E E R +LT++ +I+S
+Sbjct: 66 SILTLGLGPFFSASLAVQFL-VKLYPAFEKLQNEEGEEGRKTIVRYTRILTVLFCIIESF 124
+
+Query: 54 ALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSI-MIVMASMIA 112
+ L +L + + + + G+ L+WL+++ G+G ++++ ++
+Sbjct: 125 FLSNSL--RSFVFNWNSISYFVVAAAVTTGSLVLVWLSEVITERGIGNGSSLLILIGNLS 182
+
+Query: 113 YIPQDI----WNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRF- 167
+ I ++S+ S+L++ +++ + L + + +IPV
+Sbjct: 183 RFRFLINKDDFDSLNVSSQSNLYIIYIIITLVSMLIFSTLSQEGARKIPVVSAKQLIDGV 242
+
+Query: 168 ---KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSP 224
+ + SY+ IR AG +PI+++ +++ I L N ++++++
+Sbjct: 243 EDDMRRSYIPIRFGQAGVVPIIFSSSILLF---LTTSIKQLPNANIATRVILDSVNLQQI 299
+
+Query: 225 AWFILYLLTIFILALAFAFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFAL 284
+ +F +L+ I + + I +S IA+ ++K I++ PG AT+ YI + +
+Sbjct: 300 FYFFTFLVLIIFFSFFYTLIILSPSDIAKNLKKMSSVIQDTKPGVATKVYIRKFILQASF 359
+
+Query: 285 VGAFYLILISGLPMMV-VLVDIRYLRLSMIPGIFMIF 320
+ VG+ L + +P ++ + + L +S I + + F
+Sbjct: 360 VGSILLSALILIPSILAAALGVHPLSISGITSLILSF 396
+
+
+>sp|P79088|SC61A_SCHPO Protein transport protein sec61 subunit alpha
+ OS=Schizosaccharomyces pombe GN=sec61 PE=2 SV=1
+ Length = 479
+
+ Score = 178 bits (452), Expect = 5e-44, Method: Composition-based stats.
+ Identities = 49/371 (13%), Positives = 118/371 (31%), Gaps = 71/371 (19%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRR---MLLTLVIALIQSVALVL 57
+ +L +G+SP ++S ++ Q+ S+ + ++ +E + L ++IA Q+ A VL
+Sbjct: 76 TLMELGISPIVTSSMLVQLLVGSQLIEVNMELKSDREMYQLVQKFLAIIIAFGQATAYVL 135
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMIVMASM------- 110
+ + ++L + A L+ L GLG I + +A++
+Sbjct: 136 TGMYGRPQDLGAGICLLLILQLAAASLIVLLLDELLQKGYGLGSGISLFIATINCENIFW 195
+
+Query: 111 IAYIPQDI----WNSIQELKISSLWLALM-----------------------------LV 137
+ A+ P + I+ +++
+Sbjct: 196 KAFSPTTYHIANGVQFEGAVINFVYVMFTWDNKAAALYQAFFRSGLTSSQIQLPNLWNFF 255
+
+Query: 138 FSLVFLYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQY 197
+ +L+ + + ++ + IP+ + ++L PIM L S +
+Sbjct: 256 ATLLVFGVVIYLQDFRVEIPIRSQKFRGYRSTF---PVKLLYTSNTPIMLQSALTSNLFF 312
+
+Query: 198 FLLIIHFLQPENQLIE-----------QWIEALSMGSPAWFILY-----LLTIFILALAF 241
+ ++ N L+ LS + L L+ +F A
+Sbjct: 313 ASRLLFNRFSSNFLVRFLGVWEQTATSGLSYYLSPPASFQDALIDPIHTLVYVFFTMFAC 372
+
+Query: 242 AFIN--------ISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLILI 293
+ A + S +A++++ + G + + + ++ A + + +
+Sbjct: 373 ALFSKLWIEVSGASPRDVAKQLKSQQLVMAGHREG-SMYKELKRIIPTAAWLSGAVVGAL 431
+
+Query: 294 SGLPMMVVLVD 304
+ + ++ +
+Sbjct: 432 AVASDLLGALG 442
+
+
+>sp|P28541|SECY_METVA Preprotein translocase subunit secY
+ OS=Methanococcus vannielii GN=secY PE=3 SV=1
+ Length = 438
+
+ Score = 174 bits (443), Expect = 6e-43, Method: Composition-based stats.
+ Identities = 49/340 (14%), Positives = 121/340 (35%), Gaps = 43/340 (12%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQ---ERRRMLLTLVIALIQSVALVL 57
+ +L ++G+ P +++ +I Q+ S+ + L + + + L + + +++V V
+Sbjct: 68 TLITLGIGPIVTAGIIMQLLVGSELISLDLSKPMNRALFQGLQKLFGIFLCFLEAVMFVG 127
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSI-MIVMASMIAYI-- 114
+ V +T+ ++ L L G +I+L ++ + G+G I + + A + I
+Sbjct: 128 AGAFG----VVNSTLALILVLQLALGAILVIYLDEIVSRYGIGSGIGLFIAAGVAQTIFV 183
+
+Query: 115 -----PQDIWNSIQELKISSLWL----ALMLVFSLVFLYLAVTVERSKYRIPVNKINIHN 165
+ +W + + SL + L ++ +L + V VE + IP+ +
+Sbjct: 184 GAFGAEGYLWKFFSAMSVGSLGIAFEYILPILSTLFVFLVVVYVESIRVEIPLAHGRVKG 243
+
+Query: 166 RFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH-------FLQPENQLIEQWIEA 218
+ KY I+ +P++ A L + Q + + + +
+Sbjct: 244 AVGKY---PIKFIYVSNLPVILAAALFANIQLWGMFLDRMGYPILGQYSNGTAVSGIAYY 300
+
+Query: 219 LSMG--------SPAWFILYLLTIFILALAFAFI-----NISGDQIAERMQKSGEYIENV 265
+ S P I Y L + I + F + +A+++ I+
+Sbjct: 301 FSTPYGISNIISDPLHAIFYTLMMVIFCILFGLFWVETSGLDAKSMAKKLGNLDMAIKGF 360
+
+Query: 266 YPG-GATRRYINGLVTYFALVGAFYLILISGLPMMVVLVD 304
+ + + + + ++G+ ++ ++ +
+Sbjct: 361 RKSQKSIEQRLKRYIKPITVMGSAFVGFLAAAADFTGALG 400
+
+
+>sp|Q9YDD0|SECY_AERPE Preprotein translocase subunit secY
+ OS=Aeropyrum pernix GN=secY PE=3 SV=2
+ Length = 457
+
+ Score = 171 bits (435), Expect = 5e-42, Method: Composition-based stats.
+ Identities = 47/348 (13%), Positives = 120/348 (34%), Gaps = 47/348 (13%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER---RRMLLTLVIALIQSVALVL 57
+ +L +G+ P +++ LI Q+ +K + L E + + + +L L A +++VA +
+Sbjct: 73 TLMELGIGPIVTASLIIQVLVGAKIIKLDLADPEGRRKFTSAQKVLALAFAALEAVAFTV 132
+
+Query: 58 NLPL-QEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGG-SIMIVMASMIAYI 114
+ A L +L L G +I+ ++ G+G + ++A + +
+Sbjct: 133 GGRYWVGTAIEPGPLDYALVSLQLFLGALLVIYFDEVMQKGWGIGSAISLFILAGVAQGV 192
+
+Query: 115 PQDIWNSIQELKISSLWLALML--------------------VFSLVFLYLAVTVERSKY 154
+ I+ +I + + ++ +L + L V ++ +
+Sbjct: 193 VWSIFGTIPGVAQDYGLVPAIISNPDLTLLARPNGFPDLTGFFTTLAAIILLVYLQAMRV 252
+
+Query: 155 RIPVNKINIHNRFKKYSYLDIRLNPAGGMPI----MYAMTLVSIPQYFLLIIHFLQPENQ 210
+ IP+ S + ++ +PI + L+ + + + Q
+Sbjct: 253 EIPITSER---FKGIRSRVPLQFIYVTNIPILLVGILVSDLLLVQRLLADYLGVESRAYQ 309
+
+Query: 211 LIEQWIEALSMGS--------PAWFILYLLTIFILALAFAFI-----NISGDQIAERMQK 257
+ + + LS P +++ + +L++ F ++ ++ + AER+ K
+Sbjct: 310 IYSSIVYYLSPPRGVVQSIADPVKTAVFIASWTVLSIVFGYMWVEIAGLNPREQAERLIK 369
+
+Query: 258 SGEYIENVYPGGAT-RRYINGLVTYFALVGAFYLILISGLPMMVVLVD 304
+ G I + R + + + + + + + +
+Sbjct: 370 GGLAIPGMRSDPRVLERVLRRYIYPLTFLSSLIVAALVIVADIFGAYG 417
+
+
+>sp|O28377|SECY_ARCFU Preprotein translocase subunit secY
+ OS=Archaeoglobus fulgidus GN=secY PE=3 SV=1
+ Length = 493
+
+ Score = 171 bits (434), Expect = 7e-42, Method: Composition-based stats.
+ Identities = 44/383 (11%), Positives = 123/383 (32%), Gaps = 82/383 (21%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERR---RMLLTLVIALIQSVALVL 57
+ S+ ++G+ P +++ +I Q+ + + L E + + L V+ ++++ +
+Sbjct: 73 SIIALGIGPIVTASIILQLLVGAGIIKLDLTNPEDRAAYQDFQRFLVFVMIAVEAIPQIA 132
+
+Query: 58 NL------PLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGS-IMIVMASM 110
+ L GV I L + L G ++++ ++ + G+G + ++A +
+Sbjct: 133 GGLLKPDLNLAAQLGVSPGIISFLIFIQLFIGGVLIVYMDEVVSKWGIGSGVSLFILAGI 192
+
+Query: 111 IAYIPQDIW----------------------------NSIQELKISSLWLALMLVFSL-- 140
+ I ++ ++ L + ++ +
+Sbjct: 193 AQSIVVGLFNWVIPPNSAMPAGIIPRWIWIAQNYPLDQLFTGSGLAFLLIQGGILALITT 252
+
+Query: 141 -VFLYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFL 199
+ + L V E ++ IP+ ++ I+L A +P+++ L +
+Sbjct: 253 AAIILLVVFFEGTRVEIPLAHAVARGARGRF---PIKLIYASVLPMIFVRALQANVVALG 309
+
+Query: 200 LII-------HFLQPENQLIEQWIEALSM----------------------GSPAWFILY 230
+ ++ + + + L ++
+Sbjct: 310 QVLHARGVTIFGEFVNGKAVSGLMFFLQPVSSPYDWIPSLVKSQGAAFAAIPDWMIYLHL 369
+
+Query: 231 LLTIFILALA---FAFI-----NISGDQIAERMQKSGEYIENVYPGGAT-RRYINGLVTY 281
+ L+ IL + FA+ + +A ++ KSG + R ++ +
+Sbjct: 370 LIDALILVVGGIIFAWFWVETSGMDARTVASQIAKSGMQVPGFRKSPQVLERVLSRYIPK 429
+
+Query: 282 FALVGAFYLILISGLPMMVVLVD 304
+ ++G + +++ + M+ +
+Sbjct: 430 VTILGGAIIGILTLVANMLGTIG 452
+
+
+>sp|P28542|SECY_HALMA Preprotein translocase subunit secY
+ OS=Haloarcula marismortui GN=secY PE=3 SV=2
+ Length = 487
+
+ Score = 165 bits (419), Expect = 3e-40, Method: Composition-based stats.
+ Identities = 51/380 (13%), Positives = 129/380 (33%), Gaps = 79/380 (20%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQ----ERRRMLLTLVIALIQSVALV 56
+ S+ +G+ P +++ ++ Q+ + LGL+ + + LL LV+ + + +V
+Sbjct: 73 SIMQLGIGPIVTASIVLQLLGGADLLGLNTQDDPRDQILYQGLQKLLVLVMICLTGLPMV 132
+
+Query: 57 LNLPLQEA-------AGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSI-MIVMA 108
+ A G+ + L + G ++++ ++ + G+G I + ++A
+Sbjct: 133 FAGGFLPADTAVANSLGIGTAGVQWLIFAQMFVGGVLILFMDEVISKWGVGSGIGLFIVA 192
+
+Query: 109 SMIAYI------PQDIWNSIQELKISSLWL-----------------------ALMLVFS 139
+ + + + NS + L++ L L +
+Sbjct: 193 GVSQRLVGGLLTAPFLGNSEGIIYTWYLFITGERGTGPVLAADGLQTVLLQGELLGLFTT 252
+
+Query: 140 LVFLYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFL 199
+ ++ + V E + IP++ + ++ ++L A +P++ L + Q+
+Sbjct: 253 VLIFAVVVYAESVRVEIPLSNARVKGARGRF---PVKLIYASVLPMILVRALQANIQFLG 309
+
+Query: 200 LIIH--------------FLQPENQLIEQWIEALSMGSPAWFI---------------LY 230
+ I++ QP L S G W++ +
+Sbjct: 310 RILNAQLGSMPAFLGTYANGQPTGGLFYFLAPIQSRGDWMWWLEGTAQPVWQILTRVGID 369
+
+Query: 231 LLTIFILALAFAFI-----NISGDQIAERMQKSGEYIENVYPGGAT-RRYINGLVTYFAL 284
+ L + + FA ++ + A+++ SG I + + + +
+Sbjct: 370 LFVMLVGGAVFAVFWVETTDMGPEATAKQIHNSGMQIPGFRQNVGVIEKVLERYIPQVTV 429
+
+Query: 285 VGAFYLILISGLPMMVVLVD 304
+ +G + L++ + M+ +
+Sbjct: 430 IGGALVGLLAVMANMLGTIG 449
+
+
+>sp|Q9HPB1|SECY_HALSA Preprotein translocase subunit secY
+ OS=Halobacterium salinarium GN=secY PE=3 SV=1
+ Length = 491
+
+ Score = 162 bits (410), Expect = 4e-39, Method: Composition-based stats.
+ Identities = 48/383 (12%), Positives = 123/383 (32%), Gaps = 83/383 (21%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQE----RRRMLLTLVIALIQSVALV 56
+ ++ +G+ P +++ ++ Q+ + LGL + + L V+ ++ +V
+Sbjct: 72 TVLQLGIGPIVTASIVLQLLGGANLLGLDTDNDPRDQAIYQGLQKFLVGVMVVLTGAPMV 131
+
+Query: 57 LNLPLQEAAGV-------DMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSIMI---- 105
+ + + + VL + AG L+++ ++ + G+G I +
+Sbjct: 132 FLGNFLQPSQQLAQSMPGGAFGVEVLIFAQIAAGGILLLFMDEVISKWGVGSGIGLFIVA 191
+
+Query: 106 ----------------------------VMASMIAYIPQDIWNSIQELKISSLWLALMLV 137
+ ++ ++ +P + S E + + L+
+Sbjct: 192 GVSQSLVGGLVFWEGGVGSQGLLPTWFDIIVGNVSNMPPLLSGSGIEFLLMQAGILG-LL 250
+
+Query: 138 FSLVFLYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQY 197
+ +L + V E + IP++ + ++ ++L A +P++ L + Q+
+Sbjct: 251 TTLFIYVVVVYAESVRVEIPLSHARVKGARGRF---PVKLIYASVLPMILVRALQANIQF 307
+
+Query: 198 FLL-----------IIHFLQPENQLIEQWIEAL----SMGSPAWFI-------LYLLTIF 235
+ + Q+ L S + W+ +L
+Sbjct: 308 LGQILNSTLASMPTWLGVYGGNGQVTGGLFYYLAPIYSPNAWMWWTSGATAARWQVLIRI 367
+
+Query: 236 ILALAFAFI-------------NISGDQIAERMQKSGEYIENVYPGGAT-RRYINGLVTY 281
+ + L+F I ++ D A ++Q SG I + + +
+Sbjct: 368 AIDLSFMIIGGAIFAIFWVETADMGPDATARQIQNSGMQIPGFRKNQGVIEKVMERYIPQ 427
+
+Query: 282 FALVGAFYLILISGLPMMVVLVD 304
+ ++G + L++ + M+ +
+Sbjct: 428 VTVIGGALVGLLAVMANMLGTIG 450
+
+
+>sp|Q977V3|SECY_HALVO Preprotein translocase subunit secY
+ OS=Halobacterium volcanii GN=secY PE=3 SV=1
+ Length = 488
+
+ Score = 156 bits (395), Expect = 2e-37, Method: Composition-based stats.
+ Identities = 45/380 (11%), Positives = 124/380 (32%), Gaps = 79/380 (20%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQ----ERRRMLLTLVIALIQSVALV 56
+ S+ +G+ P +++ ++ Q+ + LGL + + LL V+ + + +V
+Sbjct: 73 SVLQLGIGPIVTASIVLQLLGGADLLGLDTDNNPRDQVLYQGLQKLLVGVMICLTGLPMV 132
+
+Query: 57 LNLPLQEA-------AGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLGGSI-MIVMA 108
+ A G+ + L + G ++++ ++ + G+G + + ++A
+Sbjct: 133 FAGNFLPADQAVATSLGIGTVGVKGLIFAQIAVGGVLILFMDEIVSKWGVGSGVGLFIIA 192
+
+Query: 109 SMIAYI------------PQDIWNSIQELKISSLWLALM---LVFSLVF----------- 142
+ + + + + + ++ L L+ ++
+Sbjct: 193 GVSQQLVGGLFSWQGLGGTSGFFATWIGIITGAIELPASPTDLLSTVFLGQGQLLALITT 252
+
+Query: 143 ---LYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFL 199
+ + V E + IP++ + ++ ++L A +P++ L + Q+
+Sbjct: 253 LLIFGIVVYAESVRVEIPLSHARVKGARGRF---PVKLIYASVLPMILVRALQANIQFLG 309
+
+Query: 200 LIIHFLQP----------ENQLIEQWIEALSM----GSPAWF---------------ILY 230
+ ++ Q+ + L+ WF ++
+Sbjct: 310 RFLNSSWVGMPAWLGQYTSGQVTGGLLYYLAPIQSRSDWMWFLGLTSADPLDIAIRVLID 369
+
+Query: 231 LLTIFILALAFAFI-----NISGDQIAERMQKSGEYIENVYPGGAT-RRYINGLVTYFAL 284
+ L+ + + FA + A+++Q SG I R + + +
+Sbjct: 370 LIFMIVGGAVFAIFWVETTGMGPKSTAQQIQNSGMQIPGFRRNPQVIERVMERYIPQVTV 429
+
+Query: 285 VGAFYLILISGLPMMVVLVD 304
+ +G + L++ + M+ +
+Sbjct: 430 IGGALVGLLAVMANMLGTIG 449
+
+
+>sp|P49978|SECY_SULAC Preprotein translocase subunit secY
+ OS=Sulfolobus acidocaldarius GN=secY PE=3 SV=1
+ Length = 463
+
+ Score = 140 bits (353), Expect = 2e-32, Method: Composition-based stats.
+ Identities = 46/357 (12%), Positives = 113/357 (31%), Gaps = 57/357 (15%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRMLLTLVIALIQSVALVLNLP 60
+ +L +G+ P ++S LI Q+ SK + + E + + +ALI +
+Sbjct: 74 TLAQLGIGPVITSGLIMQILVGSKLINVDLTTQEGKSKFTQ-AEKALALIFIIVESSLFG 132
+
+Query: 61 LQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGS-IMIVMASM-------- 110
+ + ++ + L+ +Y ++ L ++ GLG + +MA +
+Sbjct: 133 YVFTRATSNILLPIIVVVQLIIASYIILLLDEMIQKGWGLGSGVSLFIMAGIMKVIFWNM 192
+
+Query: 111 ------------IAYIPQDIWNSIQELKISSLWL-----------ALMLVFSLVFLYLAV 147
+ + + P + + + L + L+ ++ L V
+Sbjct: 193 FGIVSVQSQNLPVGFFPLLVSYITSGRNLQEIVLNTSSTTPYQPDLIGLIATVGLTILIV 252
+
+Query: 148 TVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHF-LQ 206
+ + + IPV + + + + +P+++ L + Q F + +
+Sbjct: 253 YLVNTNIYIPVTTQRLRGIR---TTVPLNFLYVSSIPVIFVSVLGADIQLFASLANSISN 309
+
+Query: 207 PENQLIEQWIEALSMG-------------SPAWFILYLLTIFILALAFAFI-----NISG 248
+ + ++ A P +Y +L++ F + +
+Sbjct: 310 SASGILTDIANAFFFPPQGVPHSVYALVVDPVGAAIYAAVFIVLSIVFGMLWIDVAGLDP 369
+
+Query: 249 DQIAERMQKSGEYIENVYPGGA-TRRYINGLVTYFALVGAFYLILISGLPMMVVLVD 304
+ AE+M +SG I + ++ + + + LI+ + +
+Sbjct: 370 KTQAEQMIRSGIEIPGMRTNPRIIEGILSKYIYALGFFSSLIVGLIAVVATFLGTYG 426
+
+
+>sp|Q9UX84|SECY_SULSO Preprotein translocase subunit secY
+ OS=Sulfolobus solfataricus GN=secY PE=3 SV=1
+ Length = 469
+
+ Score = 131 bits (329), Expect = 9e-30, Method: Composition-based stats.
+ Identities = 49/363 (13%), Positives = 118/363 (32%), Gaps = 62/363 (17%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQER---RRMLLTLVIALIQSVALVL 57
+ +L +G+ P +++ LI Q+ A SK + + + + + + L + L++S
+Sbjct: 73 TLAQLGIGPIITAGLIMQILAGSKLISIDLNDPDDRVKFTEAQKGLAFIFILVESALFGY 132
+
+Query: 58 NLPLQEAAGVDMTTIMV-LDTLVLMAGTYFLIWLTDLNAA-MGLGGS-IMIVMASM---- 110
+ L + + L+ TY ++ L +L GLG + ++A +
+Sbjct: 133 VLARTSTTINASILFIAGIVIAQLIVATYLILLLDELIQKGWGLGSGVSLFILAGVMKIM 192
+
+Query: 111 ----------------IAYIPQDIWNSIQELKISSLWL-----------ALMLVFSLVFL 143
+ I + P + +L + + LV ++ +
+Sbjct: 193 FWDMFGIASVSSQNLPIGFFPALFTALASHSDVLNLIVNTSTKNLFQPDLVGLVTTIALI 252
+
+Query: 144 YLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIH 203
+ + + + IPV + + + + +P+++ L S Q F +
+Sbjct: 253 IITIYLTTMTIEIPVTSQKLRGIRRT---IPLNFLYVSSIPVIFVAVLGSDIQLFASLAS 309
+
+Query: 204 FLQPENQLIEQWI---------EALSMGSPAWFIL-------YLLTIFILALAFAFI--- 244
+ ++ P I + + S +L Y + +L++ F +
+Sbjct: 310 YVSPSASNILNTVSGVFFFPPPNSAIPHSIYAVVLDPLGALEYAVVFIVLSILFGILWVD 369
+
+Query: 245 --NISGDQIAERMQKSGEYIENVYPG-GATRRYINGLVTYFALVGAFYLILISGLPMMVV 301
+ + A+++ ++G I V + + A + + LI+ ++
+Sbjct: 370 VAGLDPATQAQQLVEAGIEIPGVRNNPKIIEGILARYIYPLAFFSSIIVGLIAVFATLLG 429
+
+Query: 302 LVD 304
+
+Sbjct: 430 AYG 432
+
+
+>sp|P38353|SSH1_YEAST Sec sixty-one protein homolog OS=Saccharomyces
+ cerevisiae GN=SSH1 PE=1 SV=1
+ Length = 490
+
+ Score = 127 bits (321), Expect = 7e-29, Method: Composition-based stats.
+ Identities = 60/376 (15%), Positives = 119/376 (31%), Gaps = 77/376 (20%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLSKLPLEVQERRRMLLTLVIALIQSVALVLNLP 60
+ +L GL P +SS LI Q+ A K + ++ ++ LT V A++Q V L
+Sbjct: 78 TLLEFGLFPNISSGLILQLLAGLKVIKVN-FKIQSDRELFQSLTKVFAIVQYVILTNIFI 136
+
+Query: 61 LQEAAGVDMTTIMV-LDTLVLMAGTYFLIWLTDLNAA-MGLGGSIMIVMASMIAY----- 113
+ G D++ + + L L+ F L ++ G MI+ +IA
+Sbjct: 137 FAGYFGDDLSVVQIGLINFQLVGAGIFTTLLAEVIDKGFGFSSGAMIINTVVIATNLVAD 196
+
+Query: 114 ----------------IPQDIWNSIQELKISSLWLALMLVFSL---------------VF 142
+ + N IQ L+ ++ +
+Sbjct: 197 TFGVSQIKVGEDDQTEAQGALINLIQGLRSKHKTFIGGIISAFNRDYLPNLTTTIIVLAI 256
+
+Query: 143 LYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLII 202
+ + ++ + +P+ Y I+L G + ++++ T++ F ++
+Sbjct: 257 AIIVCYLQSVRVELPIRSTRARGTNNVY---PIKLLYTGCLSVLFSYTILFYIHIFAFVL 313
+
+Query: 203 HFLQPENQLI--------------------EQWIEALSMGSPAW---------FILYLLT 233
+ L +N+ + L+ + + FI Y
+Sbjct: 314 IQLVAKNEPTHIICKIMGHYENANNLLAVPTFPLSLLAPPTSFFKGVTQQPLTFITYSAF 373
+
+Query: 234 IFILALAF-----AFINISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAF 288
+ I + + F A S +A + G + + +N ++ A+ GA
+Sbjct: 374 ILVTGIWFADKWQAISGSSARDVALEFKDQGITLMG-RREQNVAKELNKVIPIAAVTGAS 432
+
+Query: 289 YLILISGLPMMVVLVD 304
+ L LI+ + + L
+Sbjct: 433 VLSLITVIGESLGLKG 448
+
+
+>sp|O42965|YGMH_SCHPO Uncharacterized protein C19G7.17
+ OS=Schizosaccharomyces pombe GN=SPBC19G7.17 PE=2 SV=2
+ Length = 475
+
+ Score = 117 bits (294), Expect = 1e-25, Method: Composition-based stats.
+ Identities = 40/372 (10%), Positives = 127/372 (34%), Gaps = 77/372 (20%)
+
+Query: 1 SLFSVGLSPWMSSMLIWQMFAVSKRLGLS---KLPLEVQERRRMLLTLVIALIQSVALVL 57
+ L GL+P S + Q+ A K++ ++ + + + + +++ ++ LI +V V
+Sbjct: 76 GLMITGLAPIYLSSFLLQILASKKKIAVNFNLIIDRVLFQNAQKVVSALLYLILAVTYVS 135
+
+Query: 58 NLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAA-MGLGGSIMI-----VMASM- 110
+ + + + + ++ L + I+L ++ GLG ++ ++ ++
+Sbjct: 136 SGYYGSFSDLGIFRF-IMLILQIFLPGIVCIYLCEIIEKGHGLGSGPVLLLGSHILGNIM 194
+
+Query: 111 ----------------------IAYIPQDIWNSIQE-------LKISSLWLALMLVFSLV 141
+ + ++++ + L S + + +
+Sbjct: 195 WDVLSLHRYPVNESGDSQYQGALVGFAFNLFSFKNKFSSLRSILFRSEGLSFVQFLVCIA 254
+
+Query: 142 FLYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLI 201
+ + + +P+ + + + ++L +P++Y +++S F
+Sbjct: 255 VFATFMYTLNIRIDVPIRSSRVRGVRQNF---PLKLLYTSVIPLIYFYSILSHLLVFAYA 311
+
+Query: 202 IHFLQPEN--------------------QLIEQWIEALSMG--------SPAWFILYLLT 233
+ ++ L P + QL+ + L P ++Y +T
+Sbjct: 312 LYSLCPNSLITRLLVQYSPIDTFAEHKLQLVGGLVYFLYPPLGLSEALLHPVHTVIYTIT 371
+
+Query: 234 IFILALAFAFINIS-----GDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAF 288
+ + + + F+ + ++ + +++ I + + ++ A + AF
+Sbjct: 372 LICITIYFSLLWMNATAGGPRDVLLFFKENQLVIAGYREATML-KELEKIIPIAAKLSAF 430
+
+Query: 289 YLILISGLPMMV 300
+ ++ ++S + +
+Sbjct: 431 FVSILSVIAGIF 442
+
+
+>sp|P72179|SECY_PARDE Preprotein translocase subunit secY (Fragment)
+ OS=Paracoccus denitrificans GN=secY PE=3 SV=1
+ Length = 182
+
+ Score = 98.7 bits (245), Expect = 5e-20, Method: Composition-based stats.
+ Identities = 21/113 (18%), Positives = 48/113 (42%), Gaps = 3/113 (2%)
+
+Query: 186 MYAMTLVSIPQYFLLIIHFLQPENQLIEQWIEALSMGSPAWFILYLLTIFILALAFAF-I 244
+ ++A +L+ +P ++ + G P + + + I + + +
+Sbjct: 1 IFASSLLLLPVTISTFSGNQ--TGPIMSTVLAYFGPGQPLYLLFFAAMIVFFTYFYTYNV 58
+
+Query: 245 NISGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLILISGLP 297
+ + + +AE ++ G +I + PG T Y+ +VT ++G+ YL + LP
+Sbjct: 59 SFKTEDVAENLKNQGGFIPGIRPGKRTEDYLTYVVTRVLVIGSAYLAFVCLLP 111
+
+
+>sp|P28620|SECY_BACST Preprotein translocase subunit secY (Fragment)
+ OS=Bacillus stearothermophilus GN=secY PE=3 SV=1
+ Length = 99
+
+ Score = 74.0 bits (181), Expect = 1e-12, Method: Composition-based stats.
+ Identities = 20/57 (35%), Positives = 35/57 (61%)
+
+Query: 247 SGDQIAERMQKSGEYIENVYPGGATRRYINGLVTYFALVGAFYLILISGLPMMVVLV 303
+ + +Q+AE ++K G YI + PG T+ Y+ ++ LVG+ +L +I+ LP+ V V
+Sbjct: 1 NPEQMAENLKKQGGYIPGIRPGKNTQEYVTRILYRLTLVGSVFLAVIAVLPVFFVNV 57
+
+
+>sp|P0C6V7|R1AB_BEV Replicase polyprotein 1ab OS=Berne virus GN=rep
+ PE=1 SV=1
+ Length = 6857
+
+ Score = 34.4 bits (78), Expect = 1.0, Method: Composition-based stats.
+ Identities = 12/102 (11%), Positives = 39/102 (38%), Gaps = 12/102 (11%)
+
+Query: 135 MLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSI 194
+ + +V ++ + + + I + ++ FK ++Y+ +L + +++ +V +
+Sbjct: 3061 YVFVFIVVIFTVIFLILIRLYIVM-----YSYFKVFTYVVFKLLFVNIIMVLF---VVCL 3112
+
+Query: 195 PQYFLLIIHFLQPE----NQLIEQWIEALSMGSPAWFILYLL 232
+ P ++ L + P +++L+ L
+Sbjct: 3113 PPLVPGVVFVLALWLCDSVMFLLYLAFLSLFILPWFYVLFFL 3154
+
+
+>sp|P0C6F3|R1A_BEV Replicase polyprotein 1a OS=Berne virus GN=1a PE=1
+ SV=1
+ Length = 4569
+
+ Score = 34.4 bits (78), Expect = 1.1, Method: Composition-based stats.
+ Identities = 12/102 (11%), Positives = 39/102 (38%), Gaps = 12/102 (11%)
+
+Query: 135 MLVFSLVFLYLAVTVERSKYRIPVNKINIHNRFKKYSYLDIRLNPAGGMPIMYAMTLVSI 194
+ + +V ++ + + + I + ++ FK ++Y+ +L + +++ +V +
+Sbjct: 3061 YVFVFIVVIFTVIFLILIRLYIVM-----YSYFKVFTYVVFKLLFVNIIMVLF---VVCL 3112
+
+Query: 195 PQYFLLIIHFLQPE----NQLIEQWIEALSMGSPAWFILYLL 232
+ P ++ L + P +++L+ L
+Sbjct: 3113 PPLVPGVVFVLALWLCDSVMFLLYLAFLSLFILPWFYVLFFL 3154
+
+
+>sp|Q49VR4|LTAS_STAS1 Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus saprophyticus subsp. saprophyticus
+ (strain ATCC 15305 / DSM 20229) GN=ltaS PE=3 SV=1
+ Length = 646
+
+ Score = 32.8 bits (74), Expect = 3.2, Method: Composition-based stats.
+ Identities = 11/81 (13%), Positives = 25/81 (30%), Gaps = 1/81 (1%)
+
+Query: 70 TTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDIWNSIQELKIS 128
+ +L L + TYF ++ GL I+++ + + I+ + K
+Sbjct: 11 FAFFILTVLTVTLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLIALVLSIFLFFKGKKAF 70
+
+Query: 129 SLWLALMLVFSLVFLYLAVTV 149
+ + + + V
+Sbjct: 71 WFIFIGGFILTFLLYANVVYF 91
+
+
+>sp|Q5HR16|LTAS_STAEQ Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus epidermidis (strain ATCC 35984 /
+ RP62A) GN=ltaS PE=3 SV=1
+ Length = 646
+
+ Score = 32.8 bits (74), Expect = 3.6, Method: Composition-based stats.
+ Identities = 9/91 (9%), Positives = 26/91 (28%), Gaps = 1/91 (1%)
+
+Query: 60 PLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDI 118
+ + + +L + TYF ++ GL I+++ + + +
+Sbjct: 1 MSLPKKKIGIFAFFLLTVFTITLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLIALVLSV 60
+
+Query: 119 WNSIQELKISSLWLALMLVFSLVFLYLAVTV 149
+ + + K + + + V
+Sbjct: 61 FLFFKGKKAFWFIFIGGFLLTFLLYANVVYF 91
+
+
+>sp|Q8CQ10|LTAS_STAES Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus epidermidis (strain ATCC 12228)
+ GN=ltaS PE=3 SV=1
+ Length = 646
+
+ Score = 32.4 bits (73), Expect = 4.0, Method: Composition-based stats.
+ Identities = 10/91 (10%), Positives = 26/91 (28%), Gaps = 1/91 (1%)
+
+Query: 60 PLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDI 118
+ + + +L + TYF ++ GL I+I+ + + +
+Sbjct: 1 MSLPKKKIGIFAFFLLTVFTITLKTYFSYYVDFSLGVKGLVQNLILIMNPYSLIALVLSV 60
+
+Query: 119 WNSIQELKISSLWLALMLVFSLVFLYLAVTV 149
+ + + K + + + V
+Sbjct: 61 FLFFKGKKAFWFIFIGGFLLTFLLYANVVYF 91
+
+
+>sp|Q6P6T5|OCLN_RAT Occludin OS=Rattus norvegicus GN=Ocln PE=2 SV=1
+ Length = 523
+
+ Score = 32.4 bits (73), Expect = 4.4, Method: Composition-based stats.
+ Identities = 11/132 (8%), Positives = 42/132 (31%), Gaps = 21/132 (15%)
+
+Query: 42 LLTLVIALIQSVALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAMGLG- 100
+ L I S+ + + ++ +++ + + G ++++ + MG+
+Sbjct: 142 LAMAAFCFIASLVIFVTSVIRSGMSRTRRYYLIVIIVSAILG--IMVFIATIVYIMGVNP 199
+
+Query: 101 ----GSIMI---VMASMIAYI--PQDIWNSIQELK--------ISSLWLALMLVFSLVFL 143
+ M + + + P + + ++ + L + + F
+Sbjct: 200 TAQASGSMYGSQIYT-ICSQFYTPGGTGLYVDQYLYHYCVVDPQEAIAIVLGFMIIVAFA 258
+
+Query: 144 YLAVTVERSKYR 155
+ + V +++ +
+Sbjct: 259 LIIVFAVKTRRK 270
+
+
+>sp|P94493|YNCC_BACSU Putative metabolite transport protein yncC
+ OS=Bacillus subtilis GN=yncC PE=3 SV=2
+ Length = 471
+
+ Score = 32.0 bits (72), Expect = 5.7, Method: Composition-based stats.
+ Identities = 14/105 (13%), Positives = 38/105 (36%), Gaps = 2/105 (1%)
+
+Query: 44 TLVIALIQSVALVLNLPLQEAAGVDMTTIMVLDTLVLMAGTYFLIWLTDLNAAM--GLGG 101
+ T + LI ++VL+ + V T++ L + G + + ++ GLG
+Sbjct: 332 TTALLLIAIFSIVLDGSMALPYVVLSLTVLFLAFMQGCVGPVTWLVIAEIFPQRLRGLGS 391
+
+Query: 102 SIMIVMASMIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLA 146
+ I + ++ ++ + + S + + ++ +
+Sbjct: 392 GISVFFLWILNFVIGFAFPILLSSVGLSFTFFIFVALGVLAIGFV 436
+
+
+>sp|Q7A1I3|LTAS_STAAW Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus aureus (strain MW2) GN=ltaS PE=1 SV=1
+ Length = 646
+
+ Score = 32.0 bits (72), Expect = 6.0, Method: Composition-based stats.
+ Identities = 9/81 (11%), Positives = 25/81 (30%), Gaps = 1/81 (1%)
+
+Query: 70 TTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDIWNSIQELKIS 128
+ +L + + TYF ++ GL I+++ + + ++ + K
+Sbjct: 11 FAFFLLTVITITLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLVALVLSVFLFFKGKKAF 70
+
+Query: 129 SLWLALMLVFSLVFLYLAVTV 149
+ + + + V
+Sbjct: 71 WFMFIGGFLLTFLLYANVVYF 91
+
+
+>sp|Q6GBB1|LTAS_STAAS Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus aureus (strain MSSA476) GN=ltaS PE=3
+ SV=1
+ Length = 646
+
+ Score = 32.0 bits (72), Expect = 6.0, Method: Composition-based stats.
+ Identities = 9/81 (11%), Positives = 25/81 (30%), Gaps = 1/81 (1%)
+
+Query: 70 TTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDIWNSIQELKIS 128
+ +L + + TYF ++ GL I+++ + + ++ + K
+Sbjct: 11 FAFFLLTVITITLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLVALVLSVFLFFKGKKAF 70
+
+Query: 129 SLWLALMLVFSLVFLYLAVTV 149
+ + + + V
+Sbjct: 71 WFMFIGGFLLTFLLYANVVYF 91
+
+
+>sp|Q6GIS3|LTAS_STAAR Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus aureus (strain MRSA252) GN=ltaS PE=3
+ SV=1
+ Length = 646
+
+ Score = 32.0 bits (72), Expect = 6.0, Method: Composition-based stats.
+ Identities = 9/81 (11%), Positives = 25/81 (30%), Gaps = 1/81 (1%)
+
+Query: 70 TTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDIWNSIQELKIS 128
+ +L + + TYF ++ GL I+++ + + ++ + K
+Sbjct: 11 FAFFLLTVITITLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLVALVLSVFLFFKGKKAF 70
+
+Query: 129 SLWLALMLVFSLVFLYLAVTV 149
+ + + + V
+Sbjct: 71 WFMFIGGFLLTFLLYANVVYF 91
+
+
+>sp|Q7A6U1|LTAS_STAAN Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus aureus (strain N315) GN=ltaS PE=1 SV=1
+ Length = 646
+
+ Score = 32.0 bits (72), Expect = 6.0, Method: Composition-based stats.
+ Identities = 9/81 (11%), Positives = 25/81 (30%), Gaps = 1/81 (1%)
+
+Query: 70 TTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDIWNSIQELKIS 128
+ +L + + TYF ++ GL I+++ + + ++ + K
+Sbjct: 11 FAFFLLTVITITLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLVALVLSVFLFFKGKKAF 70
+
+Query: 129 SLWLALMLVFSLVFLYLAVTV 149
+ + + + V
+Sbjct: 71 WFMFIGGFLLTFLLYANVVYF 91
+
+
+>sp|Q99VQ4|LTAS_STAAM Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus aureus (strain Mu50 / ATCC 700699)
+ GN=ltaS PE=1 SV=1
+ Length = 646
+
+ Score = 32.0 bits (72), Expect = 6.0, Method: Composition-based stats.
+ Identities = 9/81 (11%), Positives = 25/81 (30%), Gaps = 1/81 (1%)
+
+Query: 70 TTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDIWNSIQELKIS 128
+ +L + + TYF ++ GL I+++ + + ++ + K
+Sbjct: 11 FAFFLLTVITITLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLVALVLSVFLFFKGKKAF 70
+
+Query: 129 SLWLALMLVFSLVFLYLAVTV 149
+ + + + V
+Sbjct: 71 WFMFIGGFLLTFLLYANVVYF 91
+
+
+>sp|Q5HHV4|LTAS_STAAC Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus aureus (strain COL) GN=ltaS PE=3 SV=1
+ Length = 646
+
+ Score = 32.0 bits (72), Expect = 6.0, Method: Composition-based stats.
+ Identities = 9/81 (11%), Positives = 25/81 (30%), Gaps = 1/81 (1%)
+
+Query: 70 TTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDIWNSIQELKIS 128
+ +L + + TYF ++ GL I+++ + + ++ + K
+Sbjct: 11 FAFFLLTVITITLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLVALVLSVFLFFKGKKAF 70
+
+Query: 129 SLWLALMLVFSLVFLYLAVTV 149
+ + + + V
+Sbjct: 71 WFMFIGGFLLTFLLYANVVYF 91
+
+
+>sp|Q2G093|LTAS_STAA8 Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus aureus (strain NCTC 8325) GN=ltaS PE=1
+ SV=1
+ Length = 646
+
+ Score = 32.0 bits (72), Expect = 6.0, Method: Composition-based stats.
+ Identities = 9/81 (11%), Positives = 25/81 (30%), Gaps = 1/81 (1%)
+
+Query: 70 TTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDIWNSIQELKIS 128
+ +L + + TYF ++ GL I+++ + + ++ + K
+Sbjct: 11 FAFFLLTVITITLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLVALVLSVFLFFKGKKAF 70
+
+Query: 129 SLWLALMLVFSLVFLYLAVTV 149
+ + + + V
+Sbjct: 71 WFMFIGGFLLTFLLYANVVYF 91
+
+
+>sp|Q2FIS2|LTAS_STAA3 Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus aureus (strain USA300) GN=ltaS PE=3
+ SV=1
+ Length = 646
+
+ Score = 32.0 bits (72), Expect = 6.0, Method: Composition-based stats.
+ Identities = 9/81 (11%), Positives = 25/81 (30%), Gaps = 1/81 (1%)
+
+Query: 70 TTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDIWNSIQELKIS 128
+ +L + + TYF ++ GL I+++ + + ++ + K
+Sbjct: 11 FAFFLLTVITITLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLVALVLSVFLFFKGKKAF 70
+
+Query: 129 SLWLALMLVFSLVFLYLAVTV 149
+ + + + V
+Sbjct: 71 WFMFIGGFLLTFLLYANVVYF 91
+
+
+>sp|Q2YSL2|LTAS_STAAB Glycerol phosphate lipoteichoic acid synthase
+ OS=Staphylococcus aureus (strain bovine RF122 / ET3-1)
+ GN=ltaS PE=3 SV=1
+ Length = 646
+
+ Score = 32.0 bits (72), Expect = 6.0, Method: Composition-based stats.
+ Identities = 9/81 (11%), Positives = 25/81 (30%), Gaps = 1/81 (1%)
+
+Query: 70 TTIMVLDTLVLMAGTYFLIWLTDLNAAMGL-GGSIMIVMASMIAYIPQDIWNSIQELKIS 128
+ +L + + TYF ++ GL I+++ + + ++ + K
+Sbjct: 11 FAFFLLTVITITLKTYFSYYVDFSLGVKGLVQNLILLMNPYSLVALVLSVFLFFKGKKAF 70
+
+Query: 129 SLWLALMLVFSLVFLYLAVTV 149
+ + + + V
+Sbjct: 71 WFMFIGGFLLTFLLYANVVYF 91
+
+
+>sp|P0C6V8|R1AB_BRV1 Replicase polyprotein 1ab OS=Breda virus 1 GN=rep
+ PE=2 SV=1
+ Length = 6733
+
+ Score = 31.7 bits (71), Expect = 6.7, Method: Composition-based stats.
+ Identities = 16/137 (11%), Positives = 48/137 (35%), Gaps = 23/137 (16%)
+
+Query: 108 ASMIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRF 167
+ +++ +P + + + + + + + L + + V + F
+Sbjct: 2926 TNIVECLP-----TFEIISPYVFVVLVAIFTIVFLFLLRMYI--------VMY----SYF 2968
+
+Query: 168 KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPE-NQLIEQWIEA--LSMGSP 224
+ K ++Y+ +L + +++ +V +P ++ L + + LS+
+Sbjct: 2969 KVFTYVVFKLLFVNTVMVLF---VVCLPPLVPGVVFVLALWLCDSVVFLLYLAVLSLFIL 3025
+
+Query: 225 AWFILYLLTIFILALAF 241
+ WF + L + + F
+Sbjct: 3026 PWFYVMLFVLIVGGFVF 3042
+
+
+>sp|P0C6F4|R1A_BRV1 Replicase polyprotein 1a OS=Breda virus 1 GN=1a
+ PE=3 SV=1
+ Length = 4445
+
+ Score = 31.7 bits (71), Expect = 7.6, Method: Composition-based stats.
+ Identities = 16/137 (11%), Positives = 48/137 (35%), Gaps = 23/137 (16%)
+
+Query: 108 ASMIAYIPQDIWNSIQELKISSLWLALMLVFSLVFLYLAVTVERSKYRIPVNKINIHNRF 167
+ +++ +P + + + + + + + L + + V + F
+Sbjct: 2926 TNIVECLP-----TFEIISPYVFVVLVAIFTIVFLFLLRMYI--------VMY----SYF 2968
+
+Query: 168 KKYSYLDIRLNPAGGMPIMYAMTLVSIPQYFLLIIHFLQPE-NQLIEQWIEA--LSMGSP 224
+ K ++Y+ +L + +++ +V +P ++ L + + LS+
+Sbjct: 2969 KVFTYVVFKLLFVNTVMVLF---VVCLPPLVPGVVFVLALWLCDSVVFLLYLAVLSLFIL 3025
+
+Query: 225 AWFILYLLTIFILALAF 241
+ WF + L + + F
+Sbjct: 3026 PWFYVMLFVLIVGGFVF 3042
+
+
+ Database: uniprot_sprot.fasta
+ Posted date: Apr 12, 2010 9:48 AM
+ Number of letters in database: 181,677,051
+ Number of sequences in database: 516,081
+
+Lambda K H
+ 0.320 0.164 0.454
+
+Lambda K H
+ 0.267 0.0500 0.140
+
+
+Matrix: BLOSUM62
+Gap Penalties: Existence: 11, Extension: 1
+Number of Hits to DB: 133,748,572
+Number of Sequences: 516081
+Number of extensions: 6364856
+Number of successful extensions: 37324
+Number of sequences better than 10.0: 789
+Number of HSP's better than 10.0 without gapping: 141
+Number of HSP's successfully gapped in prelim test: 648
+Number of HSP's that attempted gapping in prelim test: 35714
+Number of HSP's gapped (non-prelim): 1353
+length of query: 328
+length of database: 181,677,051
+effective HSP length: 117
+effective length of query: 211
+effective length of database: 121,295,574
+effective search space: 25593366114
+effective search space used: 25593366114
+T: 11
+A: 40
+X1: 16 ( 7.4 bits)
+X2: 38 (14.6 bits)
+X3: 64 (24.7 bits)
+S1: 40 (21.1 bits)
+S2: 70 (31.3 bits)
diff --git a/demotic/examples/example.ssearch.out b/demotic/examples/example.ssearch.out
new file mode 100644
index 0000000..55add39
--- /dev/null
+++ b/demotic/examples/example.ssearch.out
@@ -0,0 +1,5812 @@
+# /usr/local/fasta-36x2/bin/ssearch36_t -q example.fa /misc/data0/databases/Uniprot/uniprot_sprot.fasta
+SSEARCH searches a sequence data bank
+ version 36.04 January, 2010
+Please cite:
+ T. F. Smith and M. S. Waterman, (1981) J. Mol. Biol. 147:195-197;
+ W.R. Pearson (1991) Genomics 11:635-650
+
+Query: example.fa
+ 1>>>sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium sp. (strain NGR234) GN=NGR_a00980 - 181 aa
+Library: /misc/data0/databases/Uniprot/uniprot_sprot.fasta 181677051 residues in 516081 sequences
+
+ opt E()
+< 20 552 0:=
+ 22 4 0:= one = represents 790 library sequences
+ 24 11 0:=
+ 26 44 11:*
+ 28 185 117:*
+ 30 984 711:*=
+ 32 3307 2749:===*=
+ 34 8676 7455:=========*=
+ 36 16592 15311:===================*==
+ 38 27252 25304:================================*==
+ 40 36214 35297:============================================*=
+ 42 43422 43146:======================================================*
+ 44 46626 47594:===========================================================*
+ 46 47359 48476:===========================================================*
+ 48 45135 46410:==========================================================*
+ 50 40548 42349:==================================================== *
+ 52 35616 37232:============================================== *
+ 54 30462 31803:======================================= *
+ 56 26378 26565:=================================*
+ 58 21901 21809:===========================*
+ 60 17755 17667:======================*
+ 62 13618 14164:=================*
+ 64 11354 11264:==============*
+ 66 8741 8903:===========*
+ 68 7286 7003:========*=
+ 70 5736 5488:======*=
+ 72 4389 4288:=====*
+ 74 3439 3343:====*
+ 76 2941 2602:===*
+ 78 2125 2023:==*
+ 80 1817 1571:=*=
+ 82 1255 1201:=*
+ 84 1079 952:=*
+ 86 779 736:*
+ 88 622 570:* inset = represents 7 library sequences
+ 90 407 441:*
+ 92 310 341:* :=======================================*
+ 94 252 264:* :==================================== *
+ 96 207 204:* :=============================*
+ 98 169 158:* :======================*==
+ 100 146 122:* :=================*===
+ 102 94 95:* :=============*
+ 104 80 73:* :==========*=
+ 106 44 57:* :======= *
+ 108 42 44:* :======*
+ 110 34 34:* :====*
+ 112 24 26:* :===*
+ 114 20 20:* :==*
+ 116 20 16:* :==*
+ 118 10 12:* :=*
+>120 18 9:* :=*=
+181677051 residues in 516081 sequences
+Statistics: Expectation_n fit: rho(ln(x))= 6.5893+/-0.000186; mu= 5.4925+/- 0.010
+ mean_var=54.1928+/-11.354, 0's: 59 Z-trim: 59 B-trim: 3232 in 1/65
+ Lambda= 0.174222
+ statistics sampled from 60000 (279906) to 516065 sequences (mod: 1)
+ Kolmogorov-Smirnov statistic: 0.0128 (N=29) at 42
+Algorithm: Smith-Waterman (SSE2, Michael Farrar 2006) (7.1 Aug 2009)
+Parameters: BL50 matrix (15:-5), open/ext: -10/-2
+ Scan time: 12.010
+
+The best scores are: s-w bits E(516081)
+sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG ( 181) 1141 292.6 1.4e-78
+sp|Q7SY73|ABH6B_XENLA Monoacylglycerol lipase abhd ( 337) 108 32.9 4.1
+
+>>sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=R (181 aa)
+ s-w opt: 1141 Z-score: 1545.9 bits: 292.6 E(516081): 1.4e-78
+Smith-Waterman score: 1141; 100.0% identity (100.0% similar) in 181 aa overlap (1-181:1-181)
+
+ 10 20 30 40 50 60
+sp|P55 MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|P55 MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT
+ 10 20 30 40 50 60
+
+ 70 80 90 100 110 120
+sp|P55 TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|P55 TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF
+ 70 80 90 100 110 120
+
+ 130 140 150 160 170 180
+sp|P55 AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRP
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|P55 AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRP
+ 130 140 150 160 170 180
+
+
+sp|P55 N
+ :
+sp|P55 N
+
+
+>>sp|Q7SY73|ABH6B_XENLA Monoacylglycerol lipase abhd6-B (337 aa)
+ s-w opt: 108 Z-score: 137.2 bits: 32.9 E(516081): 4.1
+Smith-Waterman score: 108; 24.6% identity (57.7% similar) in 130 aa overlap (41-164:65-189)
+
+ 20 30 40 50 60 70
+sp|P55 SNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGTTADDQLAFVS
+ ::: .. ..:. ..:... : :..:.
+sp|Q7S IRIYYWYWRRALGMQVKYSSYGNYKFCYTARGKPGNKPSVLM--LHGFSAHKDMWLGMVK
+ 40 50 60 70 80 90
+
+ 80 90 100 110 120
+sp|P55 LIADQGETTTVAF-GPEIGSRIAASFMAACGQLQ--HQIATRTGKEERKFKPFAAAGFSV
+ .. . . . : . : : :: : .... :::.. ::.. : .. ::: .: :.
+sp|Q7S FLPKNLHLVCVDMPGHEGTSRSALDYYSICGQVKRIHQFVESIGLNK---KPFHLVGTSM
+ 100 110 120 130 140
+
+ 130 140 150 160 170 180
+sp|P55 R---AGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRPN
+ ::. : . . :.. . : . . . :..:.
+sp|Q7S GGNVAGVYAAQHPTHISSLTLICPAGLMYPIESKFLKQLKVLEKSGDNQRIPLIPSTAGE
+ 150 160 170 180 190 200
+
+sp|Q7S MEDMLRLCSFVRFKIPQQVLQGLIDERIPHNEFYRKLFLALVDEKSRHSLHENMNKIMAP
+ 210 220 230 240 250 260
+
+ 2>>>sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspergillus oryzae GN=hacA - 345 aa
+Library: /misc/data0/databases/Uniprot/uniprot_sprot.fasta 181677051 residues in 516081 sequences
+
+ opt E()
+< 20 549 0:=
+ 22 0 0: one = represents 1023 library sequences
+ 24 1 0:=
+ 26 0 11:*
+ 28 1 117:*
+ 30 41 711:*
+ 32 346 2748:= *
+ 34 1976 7453:== *
+ 36 6380 15306:======= *
+ 38 17052 25295:================= *
+ 40 31636 35284:=============================== *
+ 42 47449 43131:==========================================*====
+ 44 57813 47577:==============================================*==========
+ 46 61372 48459:===============================================*============
+ 48 56648 46394:=============================================*==========
+ 50 48468 42334:=========================================*======
+ 52 40207 37219:====================================*===
+ 54 32033 31792:===============================*
+ 56 25118 26556:=========================*
+ 58 19256 21802:=================== *
+ 60 14861 17661:=============== *
+ 62 11182 14159:=========== *
+ 64 8664 11260:========= *
+ 66 7032 8900:======= *
+ 68 5657 7000:======*
+ 70 4343 5486:=====*
+ 72 3344 4287:====*
+ 74 2668 3342:===*
+ 76 2281 2601:==*
+ 78 1739 2022:=*
+ 80 1412 1570:=*
+ 82 1245 1201:=*
+ 84 964 951:*
+ 86 779 736:*
+ 88 638 570:* inset = represents 9 library sequences
+ 90 494 441:*
+ 92 425 341:* :=====================================*==
+ 94 339 264:* :=============================*========
+ 96 280 204:* :======================*=========
+ 98 218 158:* :=================*=======
+ 100 199 122:* :=============*=========
+ 102 153 95:* :==========*======
+ 104 125 73:* :========*=====
+ 106 106 57:* :======*=====
+ 108 82 44:* :====*=====
+ 110 99 34:* :===*=======
+ 112 64 26:* :==*=====
+ 114 66 20:* :==*=====
+ 116 43 16:* :=*===
+ 118 30 12:* :=*==
+>120 203 9:* :*======================
+181677051 residues in 516081 sequences
+Statistics: Expectation_n fit: rho(ln(x))= 8.6553+/-0.00021; mu= 1.0570+/- 0.012
+ mean_var=116.4100+/-22.696, 0's: 69 Z-trim: 86 B-trim: 0 in 0/64
+ Lambda= 0.118872
+ statistics sampled from 60000 (216003) to 515883 sequences (mod: 1)
+ Kolmogorov-Smirnov statistic: 0.0572 (N=29) at 40
+Algorithm: Smith-Waterman (SSE2, Michael Farrar 2006) (7.1 Aug 2009)
+Parameters: BL50 matrix (15:-5), open/ext: -10/-2
+ Scan time: 17.720
+
+The best scores are: s-w bits E(516081)
+sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hac ( 345) 2265 397.3 1.6e-109
+sp|Q8TFU8|HAC1_EMENI Transcriptional activator hac ( 350) 1740 307.2 2e-82
+sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac ( 451) 446 85.3 1.7e-15
+sp|P41546|HAC1_YEAST Transcriptional activator HAC ( 238) 257 52.9 4.9e-06
+sp|O24646|HY5_ARATH Transcription factor HY5 OS=Ar ( 168) 225 47.5 0.00016
+sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Ho ( 261) 201 43.3 0.0042
+sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bo ( 261) 200 43.1 0.0048
+sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive elemen ( 519) 203 43.6 0.0068
+sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=So ( 158) 191 41.6 0.0083
+sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive elemen ( 521) 200 43.1 0.0097
+sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper ( 631) 201 43.3 0.01
+sp|A3LYI0|NST1_PICST Stress response protein NST1 (1234) 201 43.3 0.021
+sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element- ( 520) 191 41.6 0.028
+sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive elemen ( 456) 188 41.1 0.035
+sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive elemen ( 519) 189 41.2 0.036
+sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive elemen ( 519) 187 40.9 0.045
+sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive elemen ( 520) 187 40.9 0.045
+sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive elemen ( 520) 185 40.5 0.058
+sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive elemen ( 404) 181 39.9 0.071
+sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive elemen ( 525) 183 40.2 0.074
+sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive elemen ( 428) 181 39.9 0.076
+sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element- ( 521) 182 40.0 0.082
+sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus ( 338) 175 38.9 0.12
+sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive elemen ( 479) 177 39.2 0.14
+sp|Q5A2K0|NST1_CANAL Stress response protein NST1 (1399) 186 40.7 0.14
+sp|Q8W191|HYH_ARATH Transcription factor HY5-like ( 149) 165 37.2 0.17
+sp|Q9TUB3|FOSB_CANFA Protein fosB OS=Canis familia ( 338) 172 38.3 0.17
+sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element- ( 470) 174 38.7 0.19
+sp|P0C5H8|KAPC_EMENI Putative transcription factor ( 278) 169 37.8 0.2
+sp|P53539|FOSB_HUMAN Protein fosB OS=Homo sapiens ( 338) 169 37.8 0.25
+sp|P79702|FOS_CYPCA Proto-oncogene c-Fos OS=Cyprin ( 347) 168 37.6 0.29
+sp|Q0D9R7|ARFS_ORYSJ Auxin response factor 19 OS=O (1161) 178 39.3 0.3
+sp|P15407|FOSL1_HUMAN Fos-related antigen 1 OS=Hom ( 271) 165 37.1 0.32
+sp|Q5B3C8|NST1_EMENI Stress response protein nst1 (1125) 176 39.0 0.37
+sp|Q9WVS8|MK07_MOUSE Mitogen-activated protein kin ( 806) 173 38.5 0.38
+sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scro ( 380) 166 37.3 0.4
+sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcri ( 349) 165 37.1 0.41
+sp|Q90370|MAFB_COTJA Transcription factor MafB OS= ( 311) 161 36.5 0.59
+sp|Q90888|MAFB_CHICK Transcription factor MafB OS= ( 311) 161 36.5 0.59
+sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive elemen ( 461) 163 36.8 0.7
+sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS= ( 171) 154 35.3 0.73
+sp|O88778|BSN_RAT Protein bassoon OS=Rattus norveg (3938) 181 39.8 0.74
+sp|Q8VCH8|UBXN4_MOUSE UBX domain-containing protei ( 506) 163 36.8 0.77
+sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive elemen ( 370) 160 36.3 0.79
+sp|A4R2R1|NST1_MAGGR Stress response protein NST1 (1319) 171 38.1 0.79
+sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcri ( 351) 159 36.1 0.85
+sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocr ( 381) 159 36.1 0.92
+sp|A5PKJ4|MK07_BOVIN Mitogen-activated protein kin ( 781) 165 37.1 0.94
+sp|Q1DQC1|PAN1_COCIM Actin cytoskeleton-regulatory (1485) 170 37.9 1
+sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus mu ( 380) 158 35.9 1
+sp|Q6NW59|ATF4_DANRE Cyclic AMP-dependent transcri ( 339) 157 35.8 1
+sp|Q76LL6|FHOD3_MOUSE FH1/FH2 domain-containing pr (1578) 170 37.9 1.1
+sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive elemen ( 395) 158 35.9 1.1
+sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF ( 401) 158 35.9 1.1
+sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcri ( 483) 159 36.1 1.2
+sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcri ( 494) 159 36.1 1.2
+sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive elemen ( 395) 157 35.8 1.2
+sp|P51145|FOSL2_RAT Fos-related antigen 2 OS=Rattu ( 327) 155 35.4 1.3
+sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo s ( 380) 156 35.6 1.3
+sp|Q03173|ENAH_MOUSE Protein enabled homolog OS=Mu ( 802) 162 36.6 1.4
+sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS= ( 323) 154 35.3 1.4
+sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Ratt ( 267) 152 34.9 1.5
+sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein ( 381) 155 35.4 1.5
+sp|P10158|FOSL1_RAT Fos-related antigen 1 OS=Rattu ( 275) 152 34.9 1.5
+sp|Q6Y7W8|PERQ2_MOUSE PERQ amino acid-rich with GY (1291) 165 37.1 1.6
+sp|P15408|FOSL2_HUMAN Fos-related antigen 2 OS=Hom ( 326) 153 35.1 1.6
+sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive elemen ( 428) 155 35.4 1.7
+sp|A2R346|KAPC_ASPNC Putative transcription factor ( 283) 151 34.7 1.8
+sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS= ( 323) 152 34.9 1.8
+sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcri ( 413) 154 35.2 1.8
+sp|P48755|FOSL1_MOUSE Fos-related antigen 1 OS=Mus ( 273) 150 34.6 1.9
+sp|Q9UQ88|CD11A_HUMAN Cell division protein kinase ( 780) 159 36.1 1.9
+sp|Q16520|BATF_HUMAN Basic leucine zipper transcri ( 125) 143 33.4 2
+sp|Q0CEI3|KAPC_ASPTN Putative transcription factor ( 286) 150 34.6 2
+sp|P54842|MAFB_RAT Transcription factor MafB OS=Ra ( 323) 151 34.7 2
+sp|P29747|CREBA_DROME Cyclic AMP response element- ( 516) 155 35.4 2
+sp|P47930|FOSL2_MOUSE Fos-related antigen 2 OS=Mus ( 326) 151 34.7 2
+sp|Q63ZM7|STABP_XENLA STAM-binding protein-like OS ( 416) 153 35.1 2.1
+sp|Q91496|FOS_TETFL Proto-oncogene c-Fos OS=Tetrao ( 374) 152 34.9 2.1
+sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mu ( 267) 149 34.4 2.1
+sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcript ( 347) 151 34.7 2.2
+sp|O02756|CEBPD_BOVIN CCAAT/enhancer-binding prote ( 256) 148 34.2 2.3
+sp|P54841|MAFB_MOUSE Transcription factor MafB OS= ( 323) 150 34.6 2.3
+sp|A1C9M5|KAPC_ASPCL Putative transcription factor ( 288) 149 34.4 2.3
+sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive elemen ( 368) 151 34.7 2.3
+sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos ta ( 380) 151 34.7 2.4
+sp|Q6NS15|MED15_XENLA Mediator of RNA polymerase I ( 777) 157 35.7 2.4
+sp|P94517|YSCB_BACSU Uncharacterized protein yscB ( 221) 146 33.9 2.5
+sp|Q504L8|MAFB_XENTR Transcription factor MafB OS= ( 316) 149 34.4 2.5
+sp|O57342|MAFA_COTJA Transcription factor MafA OS= ( 286) 148 34.2 2.5
+sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus n ( 380) 150 34.6 2.7
+sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis ( 381) 150 34.6 2.7
+sp|Q56TT7|FOS_PHOCM Proto-oncogene c-Fos OS=Phodop ( 381) 150 34.6 2.7
+sp|Q2VZV0|IF2_MAGSA Translation initiation factor ( 872) 157 35.7 2.7
+sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcri ( 348) 149 34.4 2.8
+sp|Q5HZY0|UBXN4_RAT UBX domain-containing protein ( 506) 152 34.9 2.8
+sp|P0C865|MK07_RAT Mitogen-activated protein kinas ( 806) 156 35.6 2.8
+sp|Q9N0J3|CEBPD_SHEEP CCAAT/enhancer-binding prote ( 255) 146 33.9 2.9
+sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element- ( 367) 149 34.4 2.9
+sp|A0JMK9|CAF1A_DANRE Chromatin assembly factor 1 ( 863) 156 35.6 3
+sp|Q96JK9|MAML3_HUMAN Mastermind-like protein 3 OS (1134) 158 35.9 3.2
+sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcr ( 127) 139 32.7 3.2
+sp|Q9C0A6|SETD5_HUMAN SET domain-containing protei (1442) 160 36.2 3.2
+sp|B3DM43|SOX5_XENTR Transcription factor Sox-5 OS ( 753) 154 35.2 3.4
+sp|A5FV21|IF2_ACICJ Translation initiation factor ( 887) 155 35.4 3.5
+sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive elemen ( 357) 147 34.0 3.6
+sp|Q9H254|SPTN4_HUMAN Spectrin beta chain, brain 3 (2564) 164 36.9 3.6
+sp|B2AWS3|PAN1_PODAN Actin cytoskeleton-regulatory (1441) 159 36.0 3.6
+sp|Q61827|MAFK_MOUSE Transcription factor MafK OS= ( 156) 139 32.7 4
+sp|O60675|MAFK_HUMAN Transcription factor MafK OS= ( 156) 139 32.7 4
+sp|Q4QRL3|CC88B_MOUSE Coiled-coil domain-containin (1481) 158 35.9 4.2
+sp|P53450|FOS_TAKRU Proto-oncogene c-Fos OS=Takifu ( 376) 146 33.9 4.3
+sp|Q9UPA5|BSN_HUMAN Protein bassoon OS=Homo sapien (3926) 166 37.2 4.4
+sp|O88737|BSN_MOUSE Protein bassoon OS=Mus musculu (3942) 166 37.2 4.4
+sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Ara ( 315) 144 33.5 4.5
+sp|Q7ZVN7|MED15_DANRE Mediator of RNA polymerase I ( 809) 152 34.9 4.6
+sp|O42290|MAFA_CHICK Transcription factor MafA OS= ( 286) 143 33.4 4.6
+sp|A9V549|EIF3A_MONBE Eukaryotic translation initi (1052) 154 35.2 4.7
+sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcr ( 118) 135 32.0 4.8
+sp|Q5RCJ1|CIP4_PONAB Cdc42-interacting protein 4 O ( 601) 149 34.4 4.8
+sp|O43889|CREB3_HUMAN Cyclic AMP-responsive elemen ( 395) 145 33.7 5
+sp|O35284|BATF_MOUSE Basic leucine zipper transcri ( 125) 135 32.0 5.1
+sp|Q2UNX4|KAPC_ASPOR Putative transcription factor ( 284) 142 33.2 5.1
+sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive elemen ( 508) 147 34.0 5.1
+sp|Q6P9R4|ARHGI_MOUSE Rho guanine nucleotide excha (1021) 153 35.0 5.2
+sp|Q5F489|TAF3_CHICK Transcription initiation fact ( 930) 152 34.9 5.3
+sp|Q5HZG4|TAF3_MOUSE Transcription initiation fact ( 932) 152 34.9 5.3
+sp|Q9UKV3|ACINU_HUMAN Apoptotic chromatin condensa (1341) 155 35.4 5.4
+sp|Q5KGK5|EIF3A_CRYNE Eukaryotic translation initi ( 952) 152 34.9 5.4
+sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodop ( 381) 144 33.5 5.5
+sp|Q3KQU3|MA7D1_HUMAN MAP7 domain-containing prote ( 841) 150 34.5 6.1
+sp|Q15642|CIP4_HUMAN Cdc42-interacting protein 4 O ( 601) 147 34.0 6.1
+sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive elemen ( 428) 144 33.5 6.2
+sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS= ( 313) 141 33.0 6.4
+sp|P18625|FOSL2_CHICK Fos-related antigen 2 OS=Gal ( 323) 141 33.0 6.6
+sp|Q3UHR0|BAHC1_MOUSE BAH and coiled-coil domain-c (2643) 159 36.0 6.7
+sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus ( 295) 140 32.9 6.8
+sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Hom ( 295) 140 32.9 6.8
+sp|Q9NZ53|PDXL2_HUMAN Podocalyxin-like protein 2 O ( 605) 146 33.9 6.9
+sp|Q7TSC1|BAT2_MOUSE Large proline-rich protein BA (2158) 157 35.7 6.9
+sp|O35451|ATF6B_MOUSE Cyclic AMP-dependent transcr ( 699) 147 34.0 7.1
+sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcr ( 703) 147 34.0 7.2
+sp|Q3UIW5|RNF10_MOUSE RING finger protein 10 OS=Mu ( 804) 148 34.2 7.3
+sp|Q6C908|PAN1_YARLI Actin cytoskeleton-regulatory (1634) 154 35.2 7.5
+sp|Q9W705|NCOA2_XENLA Nuclear receptor coactivator (1516) 153 35.0 7.8
+sp|O60841|IF2P_HUMAN Eukaryotic translation initia (1220) 151 34.7 7.9
+sp|P15205|MAP1B_RAT Microtubule-associated protein (2459) 157 35.7 7.9
+sp|Q9M7Q3|AI5L6_ARATH ABSCISIC ACID-INSENSITIVE 5- ( 454) 142 33.2 8.3
+sp|Q69022|EBNA2_EBVA8 Epstein-Barr nuclear antigen ( 454) 142 33.2 8.3
+sp|Q9ES64|USH1C_MOUSE Harmonin OS=Mus musculus GN= ( 910) 148 34.2 8.3
+sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS= ( 289) 138 32.5 8.4
+sp|P29681|IMPE2_DROME 20-hydroxyecdysone protein O ( 466) 142 33.2 8.5
+sp|Q54Y73|BZPD_DICDI Probable basic-leucine zipper ( 834) 147 34.0 8.6
+sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattu ( 295) 138 32.5 8.6
+sp|Q6MG48|BAT2_RAT Large proline-rich protein BAT2 (2161) 155 35.3 8.8
+sp|Q54HX6|MYBI_DICDI Myb-like protein I OS=Dictyos ( 977) 148 34.2 9
+sp|Q90596|MAFK_CHICK Transcription factor MafK OS= ( 156) 132 31.5 9.1
+sp|Q4VYS1|FOXP2_XENLA Forkhead box protein P2 OS=X ( 706) 145 33.7 9.2
+sp|Q54NF3|Y6434_DICDI Uncharacterized protein DDB_ ( 412) 140 32.8 9.5
+sp|Q0CPW4|PAN1_ASPTN Actin cytoskeleton-regulatory (1469) 151 34.7 9.5
+sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Ho ( 591) 143 33.3 9.7
+sp|Q00312|RBF1_CANAL Transcription factor RBF1 OS= ( 527) 142 33.2 9.7
+sp|P48634|BAT2_HUMAN Large proline-rich protein BA (2157) 154 35.2 9.9
+
+>>sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS (345 aa)
+ s-w opt: 2265 Z-score: 2101.4 bits: 397.3 E(516081): 1.6e-109
+Smith-Waterman score: 2265; 100.0% identity (100.0% similar) in 345 aa overlap (1-345:1-345)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ 10 20 30 40 50 60
+
+ 70 80 90 100 110 120
+sp|Q1X QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+ 70 80 90 100 110 120
+
+ 130 140 150 160 170 180
+sp|Q1X QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD
+ 130 140 150 160 170 180
+
+ 190 200 210 220 230 240
+sp|Q1X ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK
+ 190 200 210 220 230 240
+
+ 250 260 270 280 290 300
+sp|Q1X HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS
+ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS
+ 250 260 270 280 290 300
+
+ 310 320 330 340
+sp|Q1X EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ :::::::::::::::::::::::::::::::::::::::::::::
+sp|Q1X EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ 310 320 330 340
+
+>>sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS (350 aa)
+ s-w opt: 1740 Z-score: 1614.7 bits: 307.2 E(516081): 2e-82
+Smith-Waterman score: 1740; 78.9% identity (94.3% similar) in 332 aa overlap (13-344:18-348)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKK
+ .:::.::. ::::::::::::::.. .: .: .::::::::::
+sp|Q8T MKSADRFSPVKMEDAFANSLPTTPSLEVPVLTVSPADTSLQTKNVVAQ-TKPEEKKPAKK
+ 10 20 30 40 50
+
+ 60 70 80 90 100 110
+sp|Q1X RKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ :::::::::::::::::::::::::::::::::::::::::::::::::::::::::.::
+sp|Q8T RKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLESEK
+ 60 70 80 90 100 110
+
+ 120 130 140 150 160 170
+sp|Q1X IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLF
+ :.::::::::::::.::::::::::::.:::.::::::: .:: .:::..:::::::::
+sp|Q8T IDMEQQNQFLLQRLAQMEAENNRLSQQVAQLSAEVRGSRHSTPTSSSPASVSPTLTPTLF
+ 120 130 140 150 160 170
+
+ 180 190 200 210 220 230
+sp|Q1X KQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL
+ ::: ::.::.::::::::..:::::::::.:::: :..:::::::.::::: ::: ::::
+sp|Q8T KQEGDEVPLDRIPFPTPSVTDYSPTLKPSSLAESPDLTQHPAVSVGGLEGDESALTLFDL
+ 180 190 200 210 220 230
+
+ 240 250 260 270 280 290
+sp|Q1X GSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSM
+ :...::. : :..:::::::: :::.::::.: :::..:::.:::::..:::::::::::
+sp|Q8T GASIKHEPTHDLTAPLSDDDFRRLFNGDSSLESDSSLLEDGFAFDVLDSGDLSAFPFDSM
+ 240 250 260 270 280 290
+
+ 300 310 320 330 340
+sp|Q1X VNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ :.::.:::::: .:...:: : ..::..:.::. ::::.::::::::::
+sp|Q8T VDFDTEPVTLEDLEQTNGLSDSASCKAASLQPSHGASTSRCDGQGIAAGSA
+ 300 310 320 330 340 350
+
+>>sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS (451 aa)
+ s-w opt: 446 Z-score: 413.4 bits: 85.3 E(516081): 1.7e-15
+Smith-Waterman score: 446; 31.1% identity (51.8% similar) in 421 aa overlap (7-344:43-450)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLN
+ . : . ::. : :.. :. : . .
+sp|Q8T EASPAESFLSAPGDNFTSLFADSTPSTLNPRDMMTPDSV-ADIDSRLSVIPESQDAEDDE
+ 20 30 40 50 60 70
+
+ 40 50 60 70 80 90
+sp|Q1X SADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAA
+ : .... . ::::.:::::::: :: :::::::::::::::::::::.::::::: :
+sp|Q8T SHSTSATAPSTSEKKPVKKRKSWGQVLPEPKTNLPPRKRAKTEDEKEQRRVERVLRNRRA
+ 80 90 100 110 120 130
+
+ 100 110 120 130 140
+sp|Q1X AQTSRERKRLEMEKLENEKIQME-------QQNQFLLQRLSQMEAENNRLS---------
+ ::.::::::::.: ::... ..: . : .:...:.... .. ..
+sp|Q8T AQSSRERKRLEVEALEKRNKELETLLINVQKTNLILVEELNRFRRSSGVVTRSSSPLDSL
+ 140 150 160 170 180 190
+
+ 150 160 170 180
+sp|Q1X QQLAQLAAEVRGSRANTPMPG------------------SPATASPTLTPTLFKQ-ERDE
+ :. :. .. ::: . : . .::. ::.: : :. . :
+sp|Q8T QDSITLSQQLFGSRDGQTMSNPEQSLMDQIMRSAANPTVNPASLSPSLPPISDKEFQTKE
+ 200 210 220 230 240 250
+
+ 190 200 210 220 230
+sp|Q1X LPLERIPFPTPSLSDYSPTLKPSTLAE--------SSDVAQHPAVSVAGLEGDGSALPLF
+ :. . . : . .. : :.: .:.::::..: .:.:.:
+sp|Q8T EDEEQADEDEEMEQTWHETKEAAAAKEKNSKQSRVSTDSTQRPAVSIGG----DAAVPVF
+ 260 270 280 290 300
+
+ 240 250 260 270
+sp|Q1X D-------LGSDLKHHSTDD----------VAAPLSDDDFNRLFHGDSSVEPDSSVFEDG
+ . :: : :. :: ..: :. : . :.... . :..:. .:
+sp|Q8T SDDAGANCLGLDPVHQ--DDGPFSIGHSFGLSAALDADRY--LLESQLLASPNASTVDD-
+ 310 320 330 340 350 360
+
+ 280 290 300 310
+sp|Q1X LAFDVLEGGDLSAF--PFDSMVNFDSEPVTLEGIEMA---------------------HG
+ : : : . . : :. : .:: . . . : :
+sp|Q8T ---DYLAGDSAACFTNPLPSDYDFDINDFLTDDANHAAYDIVAASNYAAADRELDLEIHD
+ 370 380 390 400 410
+
+ 320 330 340
+sp|Q1X LPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ .. . : :: :::. :: :::.:
+sp|Q8T PENQIPSRHSIQQPQSGASSHGCDDGGIAVGV
+ 420 430 440 450
+
+>>sp|P41546|HAC1_YEAST Transcriptional activator HAC1 OS (238 aa)
+ s-w opt: 257 Z-score: 243.3 bits: 52.9 E(516081): 4.9e-06
+Smith-Waterman score: 257; 32.9% identity (60.3% similar) in 219 aa overlap (63-270:16-216)
+
+ 40 50 60 70 80
+sp|Q1X TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVP---KTNLPPRKRAKTEDEKEQRRIER
+ : .: :..:::::::::..:::::::::
+sp|P41 MEMTDFELTSNSQSNLAIPTNFKSTLPPRKRAKTKEEKEQRRIER
+ 10 20 30 40
+
+ 90 100 110 120 130 140
+sp|Q1X VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ-NQFLLQRLSQME-AENNRLSQQLAQLA
+ .:::: ::. :::.:::... :: . .:. :. :..:.. : : . . .:.:
+sp|P41 ILRNRRAAHQSREKKRLHLQYLERKCSLLENLLNSVNLEKLADHEDALTCSHDAFVASLD
+ 50 60 70 80 90 100
+
+ 150 160 170 180 190 200
+sp|Q1X A--EVRGSR-ANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPS
+ . ...: :. .: ..: :.::. ::. :. ::.:.
+sp|P41 EYRDFQSTRGASLDTRASSHSSSDTFTPS---------PLNCTMEPA--------TLSPK
+ 110 120 130 140
+
+ 210 220 230 240 250 260
+sp|Q1X TLAES-SDVAQHPAVSVAGLEG--DGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFH
+ .. .: :: ... :. ....:: : ...: .. .: :: :: . .
+sp|P41 SMRDSASDQETSWELQMFKTENVPESTTLPAVD-NNNLFDAVASPLADPLCDDIAGNSLP
+ 150 160 170 180 190 200
+
+ 270 280 290 300 310 320
+sp|Q1X GDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCK
+ :.:.. :.
+sp|P41 FDNSIDLDNWRNPEAQSGLNSFELNDFFITS
+ 210 220 230
+
+>>sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabid (168 aa)
+ s-w opt: 225 Z-score: 216.5 bits: 47.5 E(516081): 0.00016
+Smith-Waterman score: 225; 31.8% identity (62.4% similar) in 170 aa overlap (6-167:3-167)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSV--DSLPATP---ASEVPVLTVSP---ADTSLNSADVKTQEVKPEEKKP
+ :.. ::. .:::.. .: .: : .. .: . . :. .: .
+sp|O24 MQEQATSSLAASSLPSSSERSSSSAPHLEIKEGIESDEEIRRVPEFGGEAVGKETSG
+ 10 20 30 40 50
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .. .. ::: .. :::..: :::..:..:.::::..:: .::::. . .::
+sp|O24 RESGSATGQERTQATVGESQRKRGRTPAEKENKRLKRLLRNRVSAQQARERKKAYLSELE
+ 60 70 80 90 100 110
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ :. ..:..:. : .::: .. ::. : . : . ... ::. . :: : ::
+sp|O24 NRVKDLENKNSELEERLSTLQNENQMLRHILKNTTGNKRGGGG-----GSNADASL
+ 120 130 140 150 160
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+>>sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Homo s (261 aa)
+ s-w opt: 201 Z-score: 190.7 bits: 43.3 E(516081): 0.0042
+Smith-Waterman score: 201; 28.5% identity (58.6% similar) in 186 aa overlap (16-187:10-186)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ :: . .: .:. .::... : . : .. . . : :
+sp|P17 MVVVAAAPNPADGTPKVLLLSGQPASAAGAPAGQALPLMVPAQRGASPEAASGG
+ 10 20 30 40 50
+
+ 70 80 90 100 110
+sp|Q1X QELPVPKTNLPPRKRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME
+ .:.. ::: . :. :.. ..: :.::.::::.:.::. .: .::.. ...:
+sp|P17 ----LPQA----RKRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLE
+ 60 70 80 90 100
+
+ 120 130 140 150 160
+sp|Q1X QQNQFLL-------QRLSQMEAENNRLSQQL------AQLAAEVRGSRANTPMPGSPATA
+ ..:: :: .. . .::..: :.: :. ::..:... :. :: .:
+sp|P17 EENQKLLLENQLLREKTHGLVVENQELRQRLGMDALVAEEEAEAKGNEVR-PVAGSAESA
+ 110 120 130 140 150 160
+
+ 170 180 190 200 210 220
+sp|Q1X SPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGD
+ . : : . . . ::. :
+sp|P17 ALRLRAPLQQVQAQLSPLQNISPWILAVLTLQIQSLISCWAFWTTWTQSCSSNALPQSLP
+ 170 180 190 200 210 220
+
+>>sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos ta (261 aa)
+ s-w opt: 200 Z-score: 189.7 bits: 43.1 E(516081): 0.0048
+Smith-Waterman score: 200; 29.9% identity (56.9% similar) in 204 aa overlap (16-206:10-196)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ ::. : .: .:. .:: :. : . : :
+sp|Q3S MVVVAPAQSPAAGAPKVLLLSGQPAATGGAPAGRALPVMVP------------G
+ 10 20 30 40
+
+ 70 80 90 100 110
+sp|Q1X QELPVPK--TNLPP--RKRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ :. :. ...:: ::: . :. :.. ..: :.::.::::.:.::. .: .::..
+sp|Q3S QQGASPEGASGVPPQARKRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQV
+ 50 60 70 80 90 100
+
+ 120 130 140 150 160
+sp|Q1X IQMEQQNQFLL-------QRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASP
+ ...:..:: :: .. . .::..: :.:. . : : .:.: :. .:.
+sp|Q3S VDLEEENQKLLLENQLLREKTHGLVVENQELRQRLG-MDALVTEEEAETKGNGAGLVAGS
+ 110 120 130 140 150 160
+
+ 170 180 190 200 210 220
+sp|Q1X TLTPTLFKQERDELPLERIPFPTPSLSDYSP-TLKPSTLAESSDVAQHPAVSVAGLEGDG
+ . . .: : . ::... :.. :: :: ::
+sp|Q3S AESAAL----RLRAPLQQVQAQLSPLQNISPWTLMALTLQTLSLTSCWAFCSTWTQSCSS
+ 170 180 190 200 210
+
+ 230 240 250 260 270 280
+sp|Q1X SALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDL
+
+sp|Q3S DVLPQSLPAWSSSQKWTQKDPVPYRPPLLHPWGRHQPSWKPLMN
+ 220 230 240 250 260
+
+>>sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive element-bi (519 aa)
+ s-w opt: 203 Z-score: 187.0 bits: 43.6 E(516081): 0.0068
+Smith-Waterman score: 203; 32.7% identity (59.0% similar) in 156 aa overlap (4-152:210-360)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSL-PATPASEVPVLTVSP-A
+ : : ..: : ::.:.. :: :.: :
+sp|A1L PHEVDQFLNLSPKGLECLQMPPTPPSSVGSDSEGSQSPVHPCAPASPTQTPAVLKVAPRA
+ 180 190 200 210 220 230
+
+ 40 50 60 70 80
+sp|Q1X DTSLNSADVKTQEVKPEEKKP-----AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRR
+ .::.:. . : : . . : .:: .. ::: :.:: : .:: ..
+sp|A1L PSSLSSSPLLTAPHKLQGSGPLLLTEEEKRTLIAEGYPVP-TKLPLSK----AEEKALKK
+ 240 250 260 270 280 290
+
+ 90 100 110 120 130 140
+sp|Q1X IERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL
+ :.: ..:. .:: ::..:. .. ::.. ..:. : ... ..: :. : ::: .:
+sp|A1L IRRKIKNKISAQESRRKKKEYVDALEKKVETCSNENHELRRKVENLECTNKSLLQQLHSL
+ 300 310 320 330 340 350
+
+ 150 160 170 180 190 200
+sp|Q1X AAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTL
+ : : :
+sp|A1L QAVVAGKVPRSCRVTGTQTSTCLMVVVLCFSLFLGSFYPGLSPCSSITKADLSREISIHD
+ 360 370 380 390 400 410
+
+>>sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanu (158 aa)
+ s-w opt: 191 Z-score: 185.4 bits: 41.6 E(516081): 0.0083
+Smith-Waterman score: 191; 36.8% identity (67.4% similar) in 95 aa overlap (60-154:66-157)
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIER
+ :: : :. :::... .::..:..:
+sp|Q9S SDDEIRRVPEMGGEATGTTSASGRDGVSAAGQAQPSAGTQ---RKRGRSPADKENKRLKR
+ 40 50 60 70 80 90
+
+ 90 100 110 120 130 140
+sp|Q1X VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE
+ .::::..:: .::::. . :: . ..: .: : .::: .. ::. : . : . .:
+sp|Q9S LLRNRVSAQQARERKKAYLIDLEARVKELETKNAELEERLSTLQNENQMLRHILKNTTAG
+ 100 110 120 130 140 150
+
+ 150 160 170 180 190 200
+sp|Q1X VRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAES
+ .. .:
+sp|Q9S AQEGRK
+
+
+>>sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive element-bi (521 aa)
+ s-w opt: 200 Z-score: 184.2 bits: 43.1 E(516081): 0.0097
+Smith-Waterman score: 200; 24.1% identity (52.9% similar) in 291 aa overlap (18-297:234-518)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ .:: .: . . . : .: : : :
+sp|Q8B PTPPSSHSSDSEGSLSPNPRLHPFSLSQAHSPARAMPRGPSALSTSPLLTAPHKLQGSGP
+ 210 220 230 240 250 260
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE
+ .:: .. :.: :.:: : .:: ..:.: ..:. .:: ::..:.
+sp|Q8B LVLTEEEKRTLVAEGYPIP-TKLPLTK----SEEKALKKIRRKIKNKISAQESRRKKKEY
+ 270 280 290 300 310
+
+ 110 120 130 140 150 160
+sp|Q1X MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT-PMPGSPATA
+ :..::.. . .: : ... .: : : ::: .: . : :. . : . :. . .
+sp|Q8B MDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQLQKLQTLVMGKVSRTCKLAGTQTGT
+ 320 330 340 350 360 370
+
+ 170 180 190 200 210
+sp|Q1X SPTLTPTLFKQERDELPLERIPFPTPS---LSDYSPTLKPST--LAESSDV---AQHPAV
+ .. : . :.:. . : . : .: : ...: .. .: .
+sp|Q8B CLMVVVLCFAVAFGSFFQGYGPYPSATKMALPSQHPLSEPYTASVVRSRNLLIYEEHAPL
+ 380 390 400 410 420 430
+
+ 220 230 240 250 260 270
+sp|Q1X SVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV-FEDGL
+ .. .... : .: ::.: . :. : : : . :. ...:.: . . ... :
+sp|Q8B EESSSPASAGELGGWDRGSSLLRASSGLEALPEVDLP-HFLISNETSLEKSVLLELQQHL
+ 440 450 460 470 480 490
+
+ 280 290 300 310 320 330
+sp|Q1X AFDVLEGGD-LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRC
+ . . :::.. :.. .. ::
+sp|Q8B VSSKLEGNETLKVVELERRVNATF
+ 500 510 520
+
+>>sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper tra (631 aa)
+ s-w opt: 201 Z-score: 183.6 bits: 43.3 E(516081): 0.01
+Smith-Waterman score: 201; 24.5% identity (55.4% similar) in 233 aa overlap (46-270:363-593)
+
+ 20 30 40 50 60 70
+sp|Q1X PATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTN----LP
+ : :: : :::: . . :: : :
+sp|Q54 NSNNISTQINNLNNNINNQNNQLNGSNNGKKKEEDKSIKKRK-FISSTPVKGENGGTTLI
+ 340 350 360 370 380 390
+
+ 80 90 100 110 120
+sp|Q1X PRKRA--KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL
+ : . . ..:..:.: .:...:: ::: :.:.. .. ::.. .. :. . :.
+sp|Q54 PTTDGGFNMDEERHQKRQRRLVKNREAAQLFRQRQKAYIQDLEKKVSDLTGTNSEFRARV
+ 400 410 420 430 440 450
+
+ 130 140 150 160 170 180
+sp|Q1X SQMEAENNRLSQQLAQLAAEVRGSRA-NTPMPGSPATASPTLTPTLFKQERDELPLERIP
+ ...::. . .:: : : . . . : :: .: ::. . : . : :
+sp|Q54 ELLNSENKLIREQLLYLRNFVTQAVSFSFPKGGSNGTNSPSGVADQFLNSILP-PGLNSP
+ 460 470 480 490 500 510
+
+ 190 200 210 220 230 240
+sp|Q1X FPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVA
+ .: : .: .. ...:.. .. ...:. . :. . :.: .: ..
+sp|Q54 LPQGILPAGMNLQNPMIMSAIAEAASKNSTFRQNIQGNLLGTPIPSPQSSLTSNSGNNSP
+ 520 530 540 550 560 570
+
+ 250 260 270 280 290 300
+sp|Q1X A-PLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEG
+ ::.... : ...... .:.:
+sp|Q54 NKPLNNNNNNNNINNNNNNNPSSPNNNLNNNNNISPNSSTSHQVPYLPQNTPPQQSTPNQ
+ 580 590 600 610 620 630
+
+>>sp|A3LYI0|NST1_PICST Stress response protein NST1 OS=P (1234 aa)
+ s-w opt: 201 Z-score: 178.2 bits: 43.3 E(516081): 0.021
+Smith-Waterman score: 201; 26.6% identity (54.6% similar) in 304 aa overlap (41-332:727-1001)
+
+ 20 30 40 50 60 70
+sp|Q1X SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNL
+ . .:.: .:.. :: .. .. : .:
+sp|A3L ELKQKQEALKADQRRRKEEAKLKREEEKKKRIEELKRKEEEHKKKVEAQQKKEEEAK-KL
+ 700 710 720 730 740 750
+
+ 80 90 100 110 120 130
+sp|Q1X PPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLS
+ ... :.:.:..... :. .. : .::.::..: :::... :::. :.
+sp|A3L KEERKKKAEEERKKKEEEKRQKELLKKQKEEERERLKLEAEENERLEKEQQE------LQ
+ 760 770 780 790 800
+
+ 140 150 160 170 180 190
+sp|Q1X QMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFP
+ ... .:.: . ::: ::. . .:: . ::: . :..: . : . :
+sp|A3L ELQESQNQLELESAQLPAEL-----AEEINASPDSFSPTKNH-LLEQLYQARP-SSVSGP
+ 810 820 830 840 850 860
+
+ 200 210 220 230 240
+sp|Q1X T---PSLSDYSPTLKPSTLAESSDVAQ----HPAVSVAGLEGDGSALPLFDLGSDLKHHS
+ : : .. ..: : . : :: : . ::.: : :.: :: : . . . . :
+sp|A3L TTISPPIQ-FTPEAVPPVAAVSSVVPSVVPISPALSGAILNGTGS--P--NSRNAMLYGS
+ 870 880 890 900 910
+
+ 250 260 270 280 290
+sp|Q1X TDDVAAPLSDDDFNRLFHGDSSVEPDSSVFE----DGLAFDV-LEGGDLSAFPFDSMVNF
+ . .. : : : . :.. : :: . .: ... : .::: :. . .:
+sp|A3L SAQAQLP------NGLNSSTSNMSPWSSKSRLNSTSGASLQSNLFQPQLSASGFSPFNDF
+ 920 930 940 950 960 970
+
+ 300 310 320 330 340
+sp|Q1X DSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ : :.: :: .. .. ...:.: ::.
+sp|A3L -STPATSAGI---GSVNVNAPLASTAVEPLAGANNGGVWNPSTTSSRNNSIWSNTPNLNN
+ 980 990 1000 1010 1020
+
+sp|A3L ASIWGNTLPSLAGGAGAGASTPSAAHTLPNSAPLASDNELIQVAAYNTFQMLQNSNQLEF
+ 1030 1040 1050 1060 1070 1080
+
+>>sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element-bind (520 aa)
+ s-w opt: 191 Z-score: 175.9 bits: 41.6 E(516081): 0.028
+Smith-Waterman score: 191; 25.3% identity (51.7% similar) in 300 aa overlap (4-290:214-499)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADT
+ : . ..: . :..:. . ... . .
+sp|Q66 AEPPEMSQFLKVTQEDLVQMPPTPPSSHGSDSDGSQSPRSLPPSSPVRPMARSSTAISTS
+ 190 200 210 220 230 240
+
+ 40 50 60 70 80 90
+sp|Q1X SLNSADVKTQEVK-PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ : .: : : .. : .:: .. :.: :.:: : .:: .:..: ..
+sp|Q66 PLLTAPHKLQGTSGPLLLTEEEKRTLIAEGYPIP-TKLPLTK----AEEKALKRVRRKIK
+ 250 260 270 280 290
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :. .:: ::..:. .: ::.. . ..:. : ... .:. : : ::: .: . :
+sp|Q66 NKISAQESRRKKKEYVECLEKKVETYTSENNELWKKVETLETANRTLLQQLQKLQTLVT-
+ 300 310 320 330 340 350
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+ :. . :. .:. : : . : : . :..:. : :.: . .: .:
+sp|Q66 SKISRPYK---MAATQTGTCLMVAALCFVLVLGSLAPCLPAFSSGSKTVKEDPVAADSVY
+ 360 370 380 390 400 410
+
+ 220 230 240 250 260
+sp|Q1X A--QHPAVSV------AGLEGDGSALPLFDL----GSDLKHHSTDDVAAPLSDDDFNRLF
+ : : :. :. :: :: :. . : .:: . : : .: . :
+sp|Q66 AASQMPSRSLLFYDDGAGSWEDGHRGALLPVEPPEGWELKPGGP---AEPRPQDHL-RHD
+ 420 430 440 450 460 470
+
+ 270 280 290 300 310 320
+sp|Q1X HGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTC
+ :.:: .. .. ... :. ..: :
+sp|Q66 HADS-IHETTKYLRETWPEDTEDNGASPNFSHPKEWFHDRDLGPNTTIKLS
+ 480 490 500 510 520
+
+>>sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-bi (456 aa)
+ s-w opt: 188 Z-score: 174.2 bits: 41.1 E(516081): 0.035
+Smith-Waterman score: 188; 26.2% identity (53.3% similar) in 240 aa overlap (48-275:213-434)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK
+ .::: :. : :: :.:: :
+sp|Q3S SSGDLQQHHLAAPHLLRPGTGHCQELVLTEDEKKLLAKE---GITLP---TQLPLTKY--
+ 190 200 210 220 230
+
+ 80 90 100 110 120 130
+sp|Q1X TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN
+ .:. ..:.: .::. .:: ::..:. .. ::.. ::: : ... ..: .:
+sp|Q3S --EERMLKKIRRKIRNKQSAQESRKKKKEYIDGLETRMSACTAQNQELQRKVLHLEKQNL
+ 240 250 260 270 280 290
+
+ 140 150 160 170 180
+sp|Q1X RLSQQLAQLAAEVRGSRANTPMPGS---------PATASPTLTPTLFKQERDELPLERIP
+ : .:: .: : : : ... . :. . :...: : ..: : : . :
+sp|Q3S SLLEQLKKLQAIVVQSTSKSAQTGTCIAVLLFSFALIVLPSISP--FASNRAESPGDFAP
+ 300 310 320 330 340 350
+
+ 190 200 210 220 230 240
+sp|Q1X ---FPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTD
+ : .: . . :.: : .:. : :. ....:. . . : .. . ..:
+sp|Q3S VRVFSRTLHNDAASRVAPDT-APGSE-APGPGPNTGALQERSPGSP----PGEWESQDTR
+ 360 370 380 390 400
+
+ 250 260 270 280 290 300
+sp|Q1X DVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTL
+ . : : . : .:.: : :.... :
+sp|Q3S ALDNSTEDLDNSTLVQGNSVKELDQATLLDCAPPEPAVSPGHVGLEAAGGEL
+ 410 420 430 440 450
+
+>>sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive element-bi (519 aa)
+ s-w opt: 189 Z-score: 174.0 bits: 41.2 E(516081): 0.036
+Smith-Waterman score: 189; 26.7% identity (53.8% similar) in 240 aa overlap (4-232:215-445)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADT
+ : . ..: . :..:. . ... . .
+sp|Q9Z AEPPEMSQFLKVTPEDLVQMPPTPPSSHGSDSDGSQSPRSLPPSSPVRPMARSSTAISTS
+ 190 200 210 220 230 240
+
+ 40 50 60 70 80 90
+sp|Q1X SLNSADVKTQEVK-PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ : .: : : .. : .:: .. :.: :.:: : .:: .:..: ..
+sp|Q9Z PLLTAPHKLQGTSGPLLLTEEEKRTLIAEGYPIP-TKLPLTK----AEEKALKRVRRKIK
+ 250 260 270 280 290
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :. .:: ::..:. .: ::.. . ..:. : ... .:. : : ::: .: . :
+sp|Q9Z NKISAQESRRKKKEYVECLEKKVETYTSENNELWKKVETLETANRTLLQQLQKLQTLVT-
+ 300 310 320 330 340 350
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+ :. . :. .:. : : . : : . :..:. : :.: . .: .:
+sp|Q9Z SKISRPY---KMAATQTGTCLMVAALCFVLVLGSLVPCLPAFSSGSMTVKEDPIAADSVY
+ 360 370 380 390 400 410
+
+ 220 230 240 250 260
+sp|Q1X A--QHPAVSV------AGL--EGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHG
+ : : :. :. :: .: :. ::.
+sp|Q9Z AASQMPSRSLLFYDDGAGSWEDGRGALLPVEPPEGWELKPGGPAEQRPQDHLRHDRADSI
+ 420 430 440 450 460 470
+
+>>sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive element-bi (519 aa)
+ s-w opt: 187 Z-score: 172.2 bits: 40.9 E(516081): 0.045
+Smith-Waterman score: 187; 26.2% identity (53.3% similar) in 240 aa overlap (4-232:215-445)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADT
+ : . ..: . :..:. . ... . .
+sp|Q96 AEPLEVNQFLKVTPEDLVQMPPTPPSSHGSDSDGSQSPRSLPPSSPVRPMARSSTAISTS
+ 190 200 210 220 230 240
+
+ 40 50 60 70 80 90
+sp|Q1X SLNSADVKTQEVK-PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ : .: : : .. : .:: .. :.: :.:: : .:: .:..: ..
+sp|Q96 PLLTAPHKLQGTSGPLLLTEEEKRTLIAEGYPIP-TKLPLTK----AEEKALKRVRRKIK
+ 250 260 270 280 290
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :. .:: ::..:. .: ::.. . ..:. : ... .: : : ::: .: . :
+sp|Q96 NKISAQESRRKKKEYVECLEKKVETFTSENNELWKKVETLENANRTLLQQLQKLQTLVT-
+ 300 310 320 330 340 350
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS--
+ .. . :. .:. : : . : : . : .:. : :.: . :: ..
+sp|Q96 NKISRPY---KMAATQTGTCLMVAALCFVLVLGSLVPCLPEFSSGSQTVKEDPLAADGVY
+ 360 370 380 390 400 410
+
+ 220 230 240 250 260
+sp|Q1X DVAQHPAVSV------AGLEGDGSA--LPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHG
+ ..: :. :. ::: :: . ::.
+sp|Q96 TASQMPSRSLLFYDDGAGLWEDGRSTLLPMEPPDGWEINPGGPAEQRPRDHLQHDHLDST
+ 420 430 440 450 460 470
+
+>>sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive element-bi (520 aa)
+ s-w opt: 187 Z-score: 172.2 bits: 40.9 E(516081): 0.045
+Smith-Waterman score: 187; 23.9% identity (51.9% similar) in 297 aa overlap (14-297:228-517)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPAT--PASEVPVLTVSPADTSLNSADVK
+ ::: : :. .: . ... : .: :
+sp|Q70 DHLHLPPTPPSSHGSDSEGSLSPNPRLHPFSLPQTHSPSRAAPRAPSALSSSPLLTAPHK
+ 200 210 220 230 240 250
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ : : .:: .. :.: :.:: : .:: ..:.: ..:. .:: ::
+sp|Q70 LQGSGPLVLTEEEKRTLIAEGYPIP-TKLPLSKS----EEKALKKIRRKIKNKISAQESR
+ 260 270 280 290 300 310
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT-PMP
+ ..:. :..::.. . .: : ... .: : : ::: .: . : :. . : .
+sp|Q70 RKKKEYMDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQLQKLQTLVMGKVSRTCKLA
+ 320 330 340 350 360 370
+
+ 170 180 190 200 210
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPS---LSDYSPTLKPST--LAESSDV---
+ :. . . .. : . :.:. . : . .: : ...: ..
+sp|Q70 GTQTGTCLMVVVLCFAVAFGSFFQGYGPYPSATKMALPSQHSLQEPYTASVVRSRNLLIY
+ 380 390 400 410 420 430
+
+ 220 230 240 250 260 270
+sp|Q1X AQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV
+ .: .. :... : .: ::.: . : . .. : .. ...:.: . .
+sp|Q70 EEHSPPEESSSPGSAGELGGWDRGSSLLRVSGLESRPDVDLPHF--IISNETSLEKSVLL
+ 440 450 460 470 480 490
+
+ 280 290 300 310 320 330
+sp|Q1X -FEDGLAFDVLEGGD-LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFG
+ ... :. :::.. :.. .: ::
+sp|Q70 ELQQHLVSAKLEGNETLKVVELDRRVNTTF
+ 500 510 520
+
+>>sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive element-bi (520 aa)
+ s-w opt: 185 Z-score: 170.3 bits: 40.5 E(516081): 0.058
+Smith-Waterman score: 185; 23.9% identity (51.5% similar) in 297 aa overlap (14-297:228-517)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPAT--PASEVPVLTVSPADTSLNSADVK
+ ::: : :. .: . ... : .: :
+sp|Q5R DHLHLPPTPPSSHGSDSEGSLSPNPRLHPFSLPQTHSPSRAAPRAPSALSSSPLLTAPHK
+ 200 210 220 230 240 250
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ : : .:: .. :.: :.:: : .:: ..:.: ..:. .:: ::
+sp|Q5R LQGSGPLVLTEEEKRTLIAEGYPIP-TKLPLTKS----EEKALKKIRRKIKNKISAQESR
+ 260 270 280 290 300 310
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT-PMP
+ ..:. :..::.. . .: : ... .: : : ::: .: . : :. . : .
+sp|Q5R RKKKEYMDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQLQKLQTLVMGKVSRTCKLA
+ 320 330 340 350 360 370
+
+ 170 180 190 200 210
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPS---LSDYSPTLKPST--LAESSDV---
+ :. . . .. : . :.:. . : . .: : ...: ..
+sp|Q5R GTQTGTCLMVVVLCFAVAFGSFFQGYGPYPSATKMALPSQHSLQEPYTASVVRSRNLLIY
+ 380 390 400 410 420 430
+
+ 220 230 240 250 260 270
+sp|Q1X AQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV
+ .: . :... : .: ::.: . : . .. : .. ...:.: . .
+sp|Q5R EEHSPPEEPSSPGSAGELGGWDRGSSLLRVSGLESRPDVDLPHF--IISNETSLEKSVLL
+ 440 450 460 470 480 490
+
+ 280 290 300 310 320 330
+sp|Q1X -FEDGLAFDVLEGGD-LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFG
+ ... :. :::.. :.. .: ::
+sp|Q5R ELQQHLVSAKLEGNETLKVVELDRRVNTTF
+ 500 510 520
+
+>>sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-bi (404 aa)
+ s-w opt: 181 Z-score: 168.6 bits: 39.9 E(516081): 0.071
+Smith-Waterman score: 181; 26.7% identity (56.0% similar) in 225 aa overlap (1-207:107-318)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSV--DSLP--ATPASEVPVL
+ .:: .. .... ...: : . : .
+sp|Q61 LGSSSSSILHDHNYSLPQEHVSIDLGECEMISCRGRRELTGLAGSTFPFADTESFEKEGF
+ 80 90 100 110 120 130
+
+ 30 40 50 60 70 80
+sp|Q1X TVSPADTSLNSADVKTQEV--KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQ
+ :.: .:. . ... :::: .:. : :: ..:: : .:.
+sp|Q61 HVTPLPGEERAAEQEMSRLILTEEEKKLLEKE---GLTLP---STLPLTKV----EEQVL
+ 140 150 160 170 180
+
+ 90 100 110 120 130 140
+sp|Q1X RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA
+ .:..: .::. ::: ::..:.. . ::.. ... ::. : ......: .: : .::
+sp|Q61 KRVRRKIRNKRAAQESRKKKKVYVVGLESRVLKYTAQNRELQNKVQRLEEQNLSLLDQLR
+ 190 200 210 220 230 240
+
+ 150 160 170 180 190
+sp|Q1X QLAAEVRGSRANTPMPGSPA------TASPTLTPTLFKQE-RDELPLERIPF-----PTP
+ .: : : :: :: . :.:...... : .: : . . :
+sp|Q61 KLQAMVI-EIANKTSSGSTCVLVLVFSFCLLLVPAMYSSDARGSVPAEYVVLHRKLRALP
+ 250 260 270 280 290 300
+
+ 200 210 220 230 240 250
+sp|Q1X SLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLS
+ : .:..: :::.:.
+sp|Q61 SEDDHQP--KPSALSSELPMDSTHQSLDSSEHMFLVSSNFSCVLYHAPQAEQPLHWPLWD
+ 310 320 330 340 350 360
+
+>>sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive element-bi (525 aa)
+ s-w opt: 183 Z-score: 168.4 bits: 40.2 E(516081): 0.074
+Smith-Waterman score: 183; 31.0% identity (55.7% similar) in 158 aa overlap (4-152:218-368)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVP------VLT
+ : : .: . ::: :.: : . .
+sp|A2V VDQFLNLCPKEVAPTEALQMPPTPPSSHGSDSEGGQSPTRSLP--PSSPVQSQAGGKMAA
+ 190 200 210 220 230 240
+
+ 30 40 50 60 70 80
+sp|Q1X VSPA---DTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQ
+ ::. .. : .: : : : .:: .. :.: :.:: : .::
+sp|A2V RSPSALSNSPLLTAPHKLQGSGPLMLTEEEKRTLVAEGYPIP-TKLPLTK----AEEKAL
+ 250 260 270 280 290 300
+
+ 90 100 110 120 130 140
+sp|Q1X RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA
+ ..:.: ..:. .:: ::..:. :..::.. . ..:. : ... .:. : : :::
+sp|A2V KKIRRKIKNKISAQESRRKKKEYMDSLEKRVENSSSENSELRKKVEVLESTNRTLLQQLQ
+ 310 320 330 340 350 360
+
+ 150 160 170 180 190 200
+sp|Q1X QLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPS
+ .: : : :
+sp|A2V RLQAMVTGKVTRSCKAAGTQTGTCLMMVVLCFAVIFGSFTQNLDMYSSSSKTIHEPSQYS
+ 370 380 390 400 410 420
+
+>>sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive element-bi (428 aa)
+ s-w opt: 181 Z-score: 168.2 bits: 39.9 E(516081): 0.076
+Smith-Waterman score: 181; 26.9% identity (53.3% similar) in 182 aa overlap (24-200:160-330)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSAD-VKTQEVKPEEKKP
+ :: .: :. :: . .. . :: .
+sp|Q08 MSSVISIQLAEDWNSAPLLIPESCIVNDLPPVCKSTPLPIRLTPADLIAVDALYPELHLT
+ 130 140 150 160 170 180
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .... .:: . .::: : .:. ....: .::. .:: ::.::. .. ::
+sp|Q08 EEEKRLLSQEGVALPNNLPLTK----AEERILKKVRRKIRNKQSAQDSRRRKKEYIDGLE
+ 190 200 210 220 230 240
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ .. .::: : ... ..: .: : :: .: . .. . .. : .: .
+sp|Q08 SRVAACSSQNQELHKKVVELEKHNISLITQLRKLQTLIKQTSNKA------AQTSTCVLI
+ 250 260 270 280 290
+
+ 180 190 200 210 220
+sp|Q1X TLFKQERDELPLERIPF---PTPSLSD-YSPTLKPSTLAESSDVAQHPAVSVAGLEGDGS
+ ::. .: :: :. : : : ::
+sp|Q08 LLFSLALLVFP-SYSPFRSRPSASQEDSYRPTGVISRNILNKGGFSEVADPQASDTLHRA
+ 300 310 320 330 340 350
+
+ 230 240 250 260 270 280
+sp|Q1X ALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLS
+
+sp|Q08 QQREEGDPGRHVVPPANPNPEETEPVSNRARTTPEPDEQVLAEPEAAILGQKGEPPGSDN
+ 360 370 380 390 400 410
+
+>>sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element-bind (521 aa)
+ s-w opt: 182 Z-score: 167.5 bits: 40.0 E(516081): 0.082
+Smith-Waterman score: 182; 23.4% identity (52.6% similar) in 291 aa overlap (18-297:234-518)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ .:. .: . . . : .: : : :
+sp|Q6Q PTPPSSHSSDSEGSLSPNPRLHPFSLSQAHSPGRAMPRGPSALSTSPLLTAPHKLQGSGP
+ 210 220 230 240 250 260
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE
+ .:: .. :.: :.:: : .:: ..:.: ..:. .:: ::..:.
+sp|Q6Q LVLTEEEKRTLIAEGYPIP-TKLPLTK----SEEKALKKIRRKIKNKISAQESRRKKKEY
+ 270 280 290 300 310
+
+ 110 120 130 140 150 160
+sp|Q1X MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT-PMPGSPATA
+ :..::.. . .: : ... .: : : ::: .: . : :. . : . :. . .
+sp|Q6Q MDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQLQKLQTLVMGKVSRTCKLAGTQTGT
+ 320 330 340 350 360 370
+
+ 170 180 190 200 210
+sp|Q1X SPTLTPTLFKQERDELPLERIPFPTPS---LSDYSPTLKPST--LAESSDV---AQHPAV
+ .. : : .:. . : . : .: : ...: .. .: ..
+sp|Q6Q CLMVVVLCFAVAFGSLFQGYGLYPSATKMALPSQHPLSEPYTASVVRSRNLLIYEEHSSL
+ 380 390 400 410 420 430
+
+ 220 230 240 250 260 270
+sp|Q1X SVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV-FEDGL
+ .. .... : .: ::.: . :. : : : . .. ..:.: . . ... :
+sp|Q6Q EESSSPASAGELGGWDRGSSLLRASSGLEALPEVDLP-HFIISKETSLEKSVLLELQQHL
+ 440 450 460 470 480 490
+
+ 280 290 300 310 320 330
+sp|Q1X AFDVLEGGD-LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRC
+ . . :::.. :.. .. ::
+sp|Q6Q VSSKLEGNETLKVVELERRVNATF
+ 500 510 520
+
+>>sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus GN=F (338 aa)
+ s-w opt: 175 Z-score: 164.5 bits: 38.9 E(516081): 0.12
+Smith-Waterman score: 175; 25.7% identity (50.9% similar) in 222 aa overlap (9-222:76-290)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATP-ASEVPVLTVSPAD---TS
+ .::. . . : ::. :. :.: : ::
+sp|P13 GLGEMPGSFVPTVTAITTSQDLQWLVQPTLISSMAQSQGQPLASQPPA--VDPYDMPGTS
+ 50 60 70 80 90 100
+
+ 40 50 60 70 80 90
+sp|Q1X LNSADVKTQEVKPEEKK--PAKKRKSWGQELPVPKTNLP--PRKRAKTEDEKEQRRIERV
+ .. ... . . :. . . : : : ::... : .:.:.::..:
+sp|P13 YSTPGLSAYSTGGASGSGGPSTSTTTSGPVSARPARARPRRPREETLTPEEEEKRRVRRE
+ 110 120 130 140 150 160
+
+ 100 110 120 130 140 150
+sp|Q1X LRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV
+ ::. :: :.:.: ..:. : :.:... : ....... :..:: :.
+sp|P13 -RNKLAAAKCRNRRRELTDRLQAETDQLEEEKAELESEIAELQKEKERLEFVLVAHKPGC
+ 170 180 190 200 210 220
+
+ 160 170 180 190 200 210
+sp|Q1X RGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+ . . : :: : . : . ..: . : : : : : : .:. :
+sp|P13 KIPYEEGPGPGPLAEVRDL--PGSTSAKEDGFGWLLPPPPPPPLPFQSSRDAPPNLTAS-
+ 230 240 250 260 270
+
+ 220 230 240 250 260 270
+sp|Q1X DVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDS
+ . : :.: :
+sp|P13 -LFTHSEVQVLGDPFPVVSPSYTSSFVLTCPEVSAFAGAQRTSGSEQPSDPLNSPSLLAL
+ 280 290 300 310 320 330
+
+>>sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-bi (479 aa)
+ s-w opt: 177 Z-score: 163.6 bits: 39.2 E(516081): 0.14
+Smith-Waterman score: 177; 27.0% identity (54.1% similar) in 233 aa overlap (48-258:214-432)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK
+ .::: :. : :: :.:: :
+sp|Q91 GSGDLQQHSLAASQLLGPGSGHCQELVLTEDEKKLLAKE---GVTLP---TQLPLTKY--
+ 190 200 210 220 230
+
+ 80 90 100 110 120 130
+sp|Q1X TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN
+ .:. ..:.: .::. .:: ::..:. .. :::. ::: : ... ..: .:
+sp|Q91 --EERVLKKIRRKIRNKQSAQESRKKKKEYIDGLENRMSACTAQNQELQRKVLHLEKQNL
+ 240 250 260 270 280 290
+
+ 140 150 160 170 180
+sp|Q1X RLSQQLAQLAAEVRGSRANTPMPGSPATAS---------PTLTPTLFKQERDELPLERIP
+ : .:: .: : : : .. :. .. :...: :.... . : . .:
+sp|Q91 SLLEQLKHLQALVVQSTSKPAHAGTCIAVLLLSFALIILPSISP--FNSNKVDSPGDFVP
+ 300 310 320 330 340 350
+
+ 190 200 210 220 230
+sp|Q1X -------FPTPSLSDYSPTLKPSTLAESS--DVAQ-HPAVSVAGLEGD-GSAL--PLFDL
+ . . . : .: . :.. . . ::. : . : .:: .: :. : :..:
+sp|Q91 VRVFSRTLHNHAASRVAPDVTPGSEVPGPWPDVGTPHKGPSSGGLSADWGNFLEIPMLDN
+ 360 370 380 390 400 410
+
+ 240 250 260 270 280 290
+sp|Q1X GSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSM
+ .. .:: .: : .:..:
+sp|Q91 LTEELDNSTLVLAN--STEDLGRATLLDWVASEPLLSPGRVGLEIPGEMWLSWVPRWLRV
+ 420 430 440 450 460
+
+>>sp|Q5A2K0|NST1_CANAL Stress response protein NST1 OS=C (1399 aa)
+ s-w opt: 186 Z-score: 163.3 bits: 40.7 E(516081): 0.14
+Smith-Waterman score: 186; 20.1% identity (55.0% similar) in 358 aa overlap (32-334:788-1145)
+
+ 10 20 30 40 50
+sp|Q1X SCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSW--
+ .. :.. . : .... ...: ..::.
+sp|Q5A KRKEEELKAKEEEQRLQKEKLKAEQKKRKEEARLKKEEEKKKKIEEQKRKEEEHRKKVEA
+ 760 770 780 790 800 810
+
+ 60 70 80 90 100 110
+sp|Q1X GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME
+ :. . .: ..: :.:.:..:.. :. .. : .:... :. . . :. . .
+sp|Q5A QQKREAEAKKLKEERRRKAEEERKQKEEEKKQKELLKKQKEEEKRQKELLRKQREEEKEK
+ 820 830 840 850 860 870
+
+ 120 130 140 150 160
+sp|Q1X QQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPM--------PGS----PATAS
+ . .. .: . : ....:..:. ... .. ::.:. ::: :.::.
+sp|Q5A EAARLEEERTKLMVNDDDELARQIEVEKSKLSAAVANNPLLNHLYQPSPGSAPTTPSTAN
+ 880 890 900 910 920 930
+
+ 170 180 190 200
+sp|Q1X -PTLTPT-----------LFKQERDELPLERIPF----------PTPSLSDY--SPTLKP
+ :.:.: . .:..... :..: : ::.:.. : .:
+sp|Q5A LPALSPLQSASAKLMSQQFEQQHQQQVSQEKLPQTSNIQSPNQQPHPSISSFQFSSEYNP
+ 940 950 960 970 980 990
+
+ 210 220 230 240 250
+sp|Q1X --STLAESSDVAQHPAV-------SVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDD
+ :.. ..:.. ..:.. :. :.:.. .: . .: .:.... : .
+sp|Q5A NASVFHNNSSLLSNPSIMNSPRTTSTNLLNGNSPIVPNVTTNISLGATNTSNLSPWSSKS
+ 1000 1010 1020 1030 1040 1050
+
+ 260 270 280 290 300
+sp|Q1X DFNRL------FHGDSSVEPDSSVFEDGLAFDVLEGGDLSAF-PF-DSMVNFDSEPVTLE
+ .: : : : .. ... .:.. : ..:..: : : : .:. . .
+sp|Q5A RLNSLSNSTQPFIGGNQFTQTNTASFNGVGNAVQQSGNFSPFNAFSDPLVSDAFKAAGPA
+ 1060 1070 1080 1090 1100 1110
+
+ 310 320 330 340
+sp|Q1X GIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ :.. : . .. ..:. : :..: ::
+sp|Q5A GMNSNIWLNSSNVGNNSGNQSGISAPTTTSTNTSSRNNSIWGNTNPNKVTEPSLLNNNNN
+ 1120 1130 1140 1150 1160 1170
+
+>>sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=A (149 aa)
+ s-w opt: 165 Z-score: 161.8 bits: 37.2 E(516081): 0.17
+Smith-Waterman score: 165; 35.2% identity (76.1% similar) in 71 aa overlap (73-143:68-138)
+
+ 50 60 70 80 90 100
+sp|Q1X QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE
+ :.:... .:: : ..:.::::..:: .::
+sp|Q8W GSTCVLSSSADDGVNNPELDQTQNGVSTAKRRRGRNPVDKEYRSLKRLLRNRVSAQQARE
+ 40 50 60 70 80 90
+
+ 110 120 130 140 150 160
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS
+ ::.. . ::.. .....:. : ...: . ::. : ..:
+sp|Q8W RKKVYVSDLESRANELQNNNDQLEEKISTLTNENTMLRKMLINTRPKTDDNH
+ 100 110 120 130 140
+
+ 170 180 190 200 210 220
+sp|Q1X PATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAG
+
+>>sp|Q9TUB3|FOSB_CANFA Protein fosB OS=Canis familiaris (338 aa)
+ s-w opt: 172 Z-score: 161.7 bits: 38.3 E(516081): 0.17
+Smith-Waterman score: 172; 28.8% identity (51.3% similar) in 191 aa overlap (72-237:145-332)
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ ::... : .:.:.::..: ::. :: :
+sp|Q9T GGASGSGGPSTSGTTSGPGPARPARARLRRPREETLTPEEEEKRRVRRE-RNKLAAAKCR
+ 120 130 140 150 160 170
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPG
+ .:.: ..:. : :.:... : ....... :..:: :. . . : ::
+sp|Q9T NRRRELTDRLQAETDQLEEEKAELESEIAELQKEKERLEFVLVAHKPGCKIPYEEGPGPG
+ 180 190 200 210 220 230
+
+ 170 180 190
+sp|Q1X S-------PATAS------------PTLTPTLFKQERDELPLERIPFPTPS----LSDYS
+ :..:: : : :. .: : . : : :.:
+sp|Q9T PLAEVRDLPGSASTKEDGFSWLLPPPPAPPLPFQTSQDAAPNLTASLFTHSEVQVLGDPF
+ 240 250 260 270 280 290
+
+ 200 210 220 230 240 250
+sp|Q1X PTLKPSTLAESSDVAQHPAVSV-AGLE-GDGSALPLFDLGSDLKHHSTDDVAAPLSDDDF
+ :...:: :: : : ::. :: . .:: : :.:
+sp|Q9T PVVNPSY--TSSFVLTCPEVSAFAGTQRPSGSDQPTDPLNSPSLLAL
+ 300 310 320 330
+
+ 260 270 280 290 300 310
+sp|Q1X NRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPD
+
+>>sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-bind (470 aa)
+ s-w opt: 174 Z-score: 160.9 bits: 38.7 E(516081): 0.19
+Smith-Waterman score: 174; 26.7% identity (52.6% similar) in 247 aa overlap (48-284:214-438)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK
+ .::: :. : :: :.:: :
+sp|Q5F GGGDLQQHPLAASQLLGPGSGHCQELVLTEDEKKLLAKE---GVTLP---TQLPLTKY--
+ 190 200 210 220 230
+
+ 80 90 100 110 120 130
+sp|Q1X TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN
+ .:. ..:.: .::. .:: ::..:. .. :::. ::: : ... ..: .:
+sp|Q5F --EERVLKKIRRKIRNKQSAQESRKKKKEYIDGLENRMSACTAQNQELQRKVLHLEKQNL
+ 240 250 260 270 280 290
+
+ 140 150 160 170 180
+sp|Q1X RLSQQLAQLAAEVRGSRANTPMPGSPATAS---------PTLTPTLFKQERDELPLERIP
+ : .:: .: : : : .. :. .. :...: : .. . : . ::
+sp|Q5F SLLEQLKHLQALVVQSTSKPAHAGTCIAVLLLSFVLIILPSISP--FTANKVDSPGDFIP
+ 300 310 320 330 340 350
+
+ 190 200 210 220 230 240
+sp|Q1X FPTPSLSDYSPTLKPSTLAE-SSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDV
+ . .: ::. . .. . ::. : : . .:....: : :. :. ::
+sp|Q5F -----VRVFSRTLHNHAASRVAPDVTPGPEVP-GPHKGSSGGLSA-DWGNFLEIPMLDD-
+ 360 370 380 390 400
+
+ 250 260 270 280 290 300
+sp|Q1X AAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEG
+ : . : . : ..:. . ... : .: . : :
+sp|Q5F --PTEELDNTTLVLANSTEDLGRATLLDWVASEPLLGQMGLEIPGEEIWLSWVPRWLRVR
+ 410 420 430 440 450 460
+
+ 310 320 330 340
+sp|Q1X IEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q5F VVQDALGVL
+ 470
+
+>>sp|P0C5H8|KAPC_EMENI Putative transcription factor kap (278 aa)
+ s-w opt: 169 Z-score: 160.5 bits: 37.8 E(516081): 0.2
+Smith-Waterman score: 169; 22.3% identity (51.2% similar) in 260 aa overlap (17-274:49-268)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVK
+ : : :. :.:: : . . .. .
+sp|P0C DHADQVLHDSLLAAQHLSQHPQQPRPQQPNAQPHHLQPTATTSPRDQNNIDPAISGGAML
+ 20 30 40 50 60 70
+
+ 50 60 70 80 90 100
+sp|Q1X PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRL
+ : . ::. . . .: : :: .. .:. .:::: .. :.::.
+sp|P0C PPSQPPAQPEPTVEDETP------------KTYGKRPLSTSKRAAQNRAAQRAFRQRKES
+ 80 90 100 110 120
+
+ 110 120 130 140 150 160
+sp|Q1X EMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-MPGSPAT
+ ..::: :... . . . :. . ..::: .: . . .: ... :....: .::.
+sp|P0C YIRKLE-EQVK---EYEVMSQEYKALQAENYQLREYVINLQSRLLDSQGEVPELPGNIDL
+ 130 140 150 160 170 180
+
+ 170 180 190 200 210 220
+sp|Q1X ASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEG
+ .: : :. .: :.: .:. . :. : .:. .
+sp|P0C NQP----------RTEI---SVPQPAP---------RPGQAGASAPPQGSPQSQVSIAND
+ 190 200 210 220
+
+ 230 240 250 260 270 280
+sp|Q1X DGSALP-LFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEG
+ : ..: . . : ...: ... : ::.. : .:: ...:. . :
+sp|P0C DMNSLNRIAEAGLGMRKHPNEE--AFLSNNFQARRGRGDETADPSETKTEPPTHGLPMVS
+ 230 240 250 260 270
+
+ 290 300 310 320 330 340
+sp|Q1X GDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAG
+
+>>sp|P53539|FOSB_HUMAN Protein fosB OS=Homo sapiens GN=F (338 aa)
+ s-w opt: 169 Z-score: 158.9 bits: 37.8 E(516081): 0.25
+Smith-Waterman score: 169; 25.7% identity (49.5% similar) in 222 aa overlap (9-222:76-290)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATP-ASEVPVLTVSPAD---TS
+ .::. . . : ::. :: :.: : ::
+sp|P53 GLGEMPGSFVPTVTAITTSQDLQWLVQPTLISSMAQSQGQPLASQPPV--VDPYDMPGTS
+ 50 60 70 80 90 100
+
+ 40 50 60 70 80 90
+sp|Q1X LNSADVKTQEVKPEEKK--PAKKRKSWGQELPVPKTNLP--PRKRAKTEDEKEQRRIERV
+ .. .. . :. . . : : : ::... : .:.:.::..:
+sp|P53 YSTPGMSGYSSGGASGSGGPSTSGTTSGPGPARPARARPRRPREETLTPEEEEKRRVRRE
+ 110 120 130 140 150 160
+
+ 100 110 120 130 140 150
+sp|Q1X LRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV
+ ::. :: :.:.: ..:. : :.:... : ....... :..:: :.
+sp|P53 -RNKLAAAKCRNRRRELTDRLQAETDQLEEEKAELESEIAELQKEKERLEFVLVAHKPGC
+ 170 180 190 200 210 220
+
+ 160 170 180 190 200 210
+sp|Q1X RGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+ . . : :: : . : ..: . : : : : . : .:. :
+sp|P53 KIPYEEGPGPGPLAEVRDL--PGSAPAKEDGFSWLLPPPPPPPLPFQTSQDAPPNLTAS-
+ 230 240 250 260 270
+
+ 220 230 240 250 260 270
+sp|Q1X DVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDS
+ . : :.: :
+sp|P53 -LFTHSEVQVLGDPFPVVNPSYTSSFVLTCPEVSAFAGAQRTSGSDQPSDPLNSPSLLAL
+ 280 290 300 310 320 330
+
+>>sp|P79702|FOS_CYPCA Proto-oncogene c-Fos OS=Cyprinus c (347 aa)
+ s-w opt: 168 Z-score: 157.8 bits: 37.6 E(516081): 0.29
+Smith-Waterman score: 168; 21.7% identity (55.5% similar) in 299 aa overlap (6-291:39-319)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPA-SEVPVLT--VSPAD
+ : ..::.. .:.. : : : : :.:
+sp|P79 DCDASSRCSTASAAAESVACYPLNQTQKFTELSVSSASFVPTVTAISSCPDLQWMVQPMV
+ 10 20 30 40 50 60
+
+ 40 50 60 70 80 90
+sp|Q1X TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ .:. .. .. .:. : : . : . :..: : . . .:.:..:..: :
+sp|P79 SSVAPSNGGARSYNPN---PYPKMRVTGTK--SPNSNKRARAEQLSPEEEEKKRVRRE-R
+ 70 80 90 100 110 120
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :. :: :.:.: . :. : ..:.... : . .... :..:: :: .
+sp|P79 NKMAAAKCRNRRRELTDTLQAETDELEDEKSALQNDIANLLKEKERLEFILA-------A
+ 130 140 150 160 170
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLT-PTLFKQERDELPLERIPFPTPSLSD-YSPTLKPSTLAESS
+ . .:.: .. :. . : . . . . : : : :. .: : . .... .
+sp|P79 HKPICKIPSSSVSPIPAASVPEIHSITTSVVSTANAPVTTSSSSSLFSSTASTDSFGSTV
+ 180 190 200 210 220 230
+
+ 220 230 240 250 260
+sp|Q1X DVAQ-HPAV-------SVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHG
+ .... .:.. . : :: . ..: ::.:.: .. ... .: ...:.. :
+sp|P79 EISDLEPTLEESLELLAKAELE-TARSVPDVDLSSSLYARDWESLYTP-ANNDLEPLCTP
+ 240 250 260 270 280 290
+
+ 270 280 290 300 310 320
+sp|Q1X DSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKT
+ . : ... ....: :. ..::
+sp|P79 VVTRTPACTTYTSSFTFTYPEN---DVFPSCGPVHRRGSSSNDQSSDSLNSPTLLTL
+ 300 310 320 330 340
+
+>>sp|Q0D9R7|ARFS_ORYSJ Auxin response factor 19 OS=Oryza (1161 aa)
+ s-w opt: 178 Z-score: 157.4 bits: 39.3 E(516081): 0.3
+Smith-Waterman score: 178; 22.4% identity (58.4% similar) in 250 aa overlap (1-237:530-774)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSP
+ .: .. . ....: : .: .:
+sp|Q0D NIQFNTPKLSQQMQPVNELAKAGIPLNQLGVSTKPQEQIHDASNLQRQQPSMNHMLPLSQ
+ 500 510 520 530 540 550
+
+ 40 50 60 70 80 90
+sp|Q1X ADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERV
+ :.:.:..:.: .:. ... . . .. . :. . ... . .....:.. ...
+sp|Q0D AQTNLGQAQVLVQNQMQQQHASSTQGQQPATSQPLLLPQQQQQQQQQQQQQQQQQQQQKL
+ 560 570 580 590 600 610
+
+ 100 110 120 130 140
+sp|Q1X LRNRAAAQTSRERKRL-----EMEKLENEKIQM-EQQNQF-LLQRLSQMEAENNRLSQQ-
+ :... .....: .. .: :...:. .:: :. :::.:.:.. .. :::
+sp|Q0D LQQQQQQLLLQQQQQLSKMPAQLSSLANQQFQLTDQQLQLQLLQKLQQQQ--QSLLSQPA
+ 620 630 640 650 660 670
+
+ 150 160 170 180 190
+sp|Q1X --LAQLAAEVRGSRANTPMPGSPATASPTLTPT-LFKQERDELPLERIPFPTPSLSDYSP
+ :::: . .. : . . : ::. .. :. ..: . :.: : .. .
+sp|Q0D VTLAQLPLIQEQQKLLLDMQ-QQLSNSQTLSQQQMMPQQSTKVPSQNTPLPLPVQQEPQQ
+ 680 690 700 710 720 730
+
+ 200 210 220 230 240 250
+sp|Q1X TL--KPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFN
+ : : . ::..:..: :..:: . :: ::. :.
+sp|Q0D KLLQKQAMLADTSEAAVPPTTSVNVISTTGS--PLMTTGATHSVLTEEIPSCSTSPSTAN
+ 740 750 760 770 780 790
+
+ 260 270 280 290 300 310
+sp|Q1X RLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDE
+
+sp|Q0D GNHLLQPILGRNKHCSMINTEKVPQSAAPMSVPSSLEAVTATPRMMKDSPKLNHNVKQSV
+ 800 810 820 830 840 850
+
+>>sp|P15407|FOSL1_HUMAN Fos-related antigen 1 OS=Homo sa (271 aa)
+ s-w opt: 165 Z-score: 157.0 bits: 37.1 E(516081): 0.32
+Smith-Waterman score: 165; 28.3% identity (53.7% similar) in 205 aa overlap (44-232:72-263)
+
+ 20 30 40 50 60 70
+sp|Q1X SLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR
+ . .: . .:. : . : : : . :
+sp|P15 NTMSGSQELQWMVQPHFLGPSSYPRPLTYPQYSPPQPRPGVIR-ALG---PPPGVRRRPC
+ 50 60 70 80 90
+
+ 80 90 100 110 120
+sp|Q1X KRAKTEDEKEQRRIERVLRNRAAAQTSRERKR-------LEMEKLENEKIQMEQQNQFLL
+ .. . :.: :.::..: ::. :: :.:.. : .:::.:: .... . :
+sp|P15 EQISPEEE-ERRRVRRE-RNKLAAAKCRNRRKELTDFLQAETDKLEDEKSGLQREIEELQ
+ 100 110 120 130 140 150
+
+ 130 140 150 160 170 180
+sp|Q1X QRLSQMEA--ENNRLSQQLAQLAAEV-RGSRANTPMPGSPATASP--TLTP-TLFKQERD
+ .. ..: : .: .. . : : :: ..: : .: : .:.: ... :
+sp|P15 KQKERLELVLEAHRPICKIPEGAKEGDTGSTSGTSSPPAPCRPVPCISLSPGPVLEPEAL
+ 160 170 180 190 200 210
+
+ 190 200 210 220 230
+sp|Q1X ELPLERIPFPTPSLSDYSPTL---KPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGS
+ . : . ::::. ..:.: ::: : :.. . : .: : :. ::
+sp|P15 HTPTL---MTTPSLTPFTPSLVFTYPST-PEPCASAHRKSSSSSG---DPSSDPLGSPTL
+ 220 230 240 250 260
+
+ 240 250 260 270 280 290
+sp|Q1X DLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVN
+
+sp|P15 LAL
+ 270
+
+>>sp|Q5B3C8|NST1_EMENI Stress response protein nst1 OS=E (1125 aa)
+ s-w opt: 176 Z-score: 155.8 bits: 39.0 E(516081): 0.37
+Smith-Waterman score: 176; 24.5% identity (55.0% similar) in 302 aa overlap (43-340:528-798)
+
+ 20 30 40 50 60 70
+sp|Q1X DSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP
+ :: : ::.. :... .: . .
+sp|Q5B KKRLAKLAKDEEKARREAQKAAEEAAAKAEQERKLEEQRKKKEEQRKKRE---AERKAQE
+ 500 510 520 530 540 550
+
+ 80 90 100 110 120 130
+sp|Q1X RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM
+ ..::. : ::..: :. :.. : . .::.:. : .. :. : . ... .. :. .:
+sp|Q5B EERARKEAEKHKRLREERERQEEAERRQREQKEQEKKRREEAKRKEREERELREQKAKQE
+ 560 570 580 590 600 610
+
+ 140 150 160 170 180
+sp|Q1X EAEN--NRLSQQLAQLAAEVRGSRANTPMPGSPATASP-TLTPTLFKQERDELPLE-RIP
+ . .. .. :.. . .:. ...:: . .: ::.. : . ::.. : : . : :
+sp|Q5B RERKAQDEQSRRERERVAQEQAKRAPNLQPVSPVSPPPESATPVVSKAP---TPAKGRRP
+ 620 630 640 650 660 670
+
+ 190 200 210 220 230 240
+sp|Q1X FPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVA
+ : :. :: . :. ::.:.:. . :. ...::..: . : . : .
+sp|Q5B SQQGSHSS-SPRSQ-SASAEASQVSPR---SAPLSQSSGSSIPKYGSGHPILHPHP---G
+ 680 690 700 710 720
+
+ 250 260 270 280 290 300
+sp|Q1X APLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGI
+ ::.: ..: : .. :.. .::. : .: ..: : ... :.:.
+sp|Q5B APMSP--LGRT-H-PPGLSPSNPPGLSGLVPRPPMGHELPTYPPHSSPYMNQ----LRGF
+ 730 740 750 760 770
+
+ 310 320 330 340
+sp|Q1X EMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ .:.: : ::.... :.:
+sp|Q5B PAPNGIP---------VLPGMNGTRPMPPGRGFPLDAPGIPFHAQPPFSGIFSPQPSGLP
+ 780 790 800 810 820
+
+sp|Q5B HGHSRQPSNSFERSPLDTSAQPFPISRPSPIKRPPSTQQEQRNSRRDVDDLSAQLGSSAL
+ 830 840 850 860 870 880
+
+>>sp|Q9WVS8|MK07_MOUSE Mitogen-activated protein kinase (806 aa)
+ s-w opt: 173 Z-score: 155.7 bits: 38.5 E(516081): 0.38
+Smith-Waterman score: 173; 27.0% identity (51.0% similar) in 259 aa overlap (3-236:429-680)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLP--ATPASEVPVLTVSP
+ : :: : .:: . :: .. ::..:
+sp|Q9W IRFQPSLQPVASEPVCPDVEMPSPWAPSGDCAME---SPPPALPPCSDPAPDTVDLTLQP
+ 400 410 420 430 440 450
+
+ 40 50 60 70 80
+sp|Q1X ADTSLNSADVKTQEVKPEEKKPA------KKRKSWGQELPVPKTNLP-PRKRAKTEDEKE
+ : . . : : . . .. : : :. .: .. : . : ::: . ......
+sp|Q9W APPASELAPPKREGAISDNTKAALKAALLKSLRSRLRDGPSAPLEAPEPRKPVTAQERQR
+ 460 470 480 490 500 510
+
+ 90 100 110 120 130 140
+sp|Q1X QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNR-LSQQ
+ .:. .: : : ::..: : :. : . . : : . ..:.: : ..
+sp|Q9W EREEKR--RRRQERAKEREKRRQERERKERGAGTLGGPSTDPLAGL--VLSDNDRSLLER
+ 520 530 540 550 560 570
+
+ 150 160 170 180 190
+sp|Q1X LAQLAAEVRGSRANTPMPG-SPATASPTLTPTL-FKQERDEL-PLERIPFPT--PSLSDY
+ ...: . : .: :. .:..:.:: ::: .: : : :: :. :
+sp|Q9W WTRMARPPAPAPAPAPAPAPAPSSAQPTSTPTGPVSQSTGPLQPAGSIPGPASQPVCPPP
+ 580 590 600 610 620 630
+
+ 200 210 220 230 240
+sp|Q1X SPTLKPS--------TLAESSDVAQHPAVSVAGLEGDGS--ALPLFDLGSDLKHHSTDDV
+ .:. .:. : .: .:.. : .:: :.:. .:: : :
+sp|Q9W GPVPQPAGPIPAPLQTAPSTSLLASQSLVPPSGLPGSGAPEVLPYFPSGPPPPDPGLTPQ
+ 640 650 660 670 680 690
+
+ 250 260 270 280 290 300
+sp|Q1X AAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEG
+
+sp|Q9W PSTSESPDVNLVTQQLSKSQVEDPLPPVFSGTPKGSGAGYGVGFDLEEFLNQSFDMGVAD
+ 700 710 720 730 740 750
+
+>>sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scrofa G (380 aa)
+ s-w opt: 166 Z-score: 155.2 bits: 37.3 E(516081): 0.4
+Smith-Waterman score: 166; 28.4% identity (52.4% similar) in 250 aa overlap (9-237:55-297)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEV-PVLT--VSPADTSL
+ .:::. .:.. : . : : :.:. .:
+sp|O97 DSLSYYHSPADSFSSMGSPVNAQDFCTDLAVSSVNFIPTVTAISISPDLQWLVQPTLVS-
+ 30 40 50 60 70 80
+
+ 40 50 60 70 80
+sp|Q1X NSADVKTQEVKP----EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTE----DEKEQRRI
+ . : .:. .: . : .: . . .: ... : :.:.: .:.:.:::
+sp|O97 SVAPSQTRAPHPYGVPTPSAGAYSRAGAVKTMPGGRAQSIGR-RGKVEQLSPEEEEKRRI
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA
+ .: ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|O97 RRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHR
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X AEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTL
+ . . .: ..:: :. : : .: ::: : : ::. :.
+sp|O97 PACKIPD-DLGFPEEMSVASLDLSGGLPEAATPESEEAFTLPLLNDPEPKPSVE---PVK
+ 210 220 230 240 250
+
+ 210 220 230 240 250
+sp|Q1X KPSTL---AESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFN
+ : :.. :: : :: : : . ..: .:: ::
+sp|O97 KVSSMELKAEPFDDFLFPASSRPGGSETARSVPDMDLSGSFYAADWEPLHGGSLGMGPMA
+ 260 270 280 290 300 310
+
+ 260 270 280 290 300 310
+sp|Q1X RLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDE
+
+sp|O97 TELEPLCTPVVTCTPSCTAYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTL
+ 320 330 340 350 360 370
+
+>>sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcriptio (349 aa)
+ s-w opt: 165 Z-score: 155.0 bits: 37.1 E(516081): 0.41
+Smith-Waterman score: 165; 28.4% identity (61.5% similar) in 148 aa overlap (18-160:212-349)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSAD--VKTQEV
+ ::... . .:: .. :.: . .:...
+sp|Q06 GSEVDISEGDRKPDSAAYITLIPPCVKEEDTPSDNDSGICMSP-ESYLGSPQHSPSTSRA
+ 190 200 210 220 230 240
+
+ 50 60 70 80 90 100
+sp|Q1X KPEE-KKPAKKRKSWGQELPVPKTNLPP--RKRAKTEDEKEQRRIERVLRNRAAAQTSRE
+ :.. .:. .: : : :: :: ::.. :: ....... .:..:: :.
+sp|Q06 PPDNLPSPGGSRGS-----PRPKPYDPPGVSLTAKVKTEKLDKKLKKMEQNKTAATRYRQ
+ 250 260 270 280 290
+
+ 110 120 130 140 150 160
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS
+ .:: :.: : .: ..:..:. : .. ... : : : .: ::: .:.. .:
+sp|Q06 KKRAEQEALTGECKELEKKNEALKEKADSLAKEI----QYLKDLIEEVRKARGQKRVP
+ 300 310 320 330 340
+
+ 170 180 190 200 210 220
+sp|Q1X PATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAG
+
+>>sp|Q90370|MAFB_COTJA Transcription factor MafB OS=Cotu (311 aa)
+ s-w opt: 161 Z-score: 152.2 bits: 36.5 E(516081): 0.59
+Smith-Waterman score: 161; 27.3% identity (62.6% similar) in 139 aa overlap (29-163:171-307)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS
+ .:. .: .: ...:.. . .. .. : :
+sp|Q90 HHQYPAVTHEDLAGSGHPHHHHHHHHHASPTPSTSSSSSQQLQTSHQQHPPSSSVEDRFS
+ 150 160 170 180 190 200
+
+ 60 70 80 90 100 110
+sp|Q1X WGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ : . . .: . :. :.:: .:.: :.:.::. ::. : .. . ..:::::
+sp|Q90 DDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSCRYKRVQQKHHLENEK
+ 210 220 230 240 250
+
+ 120 130 140 150 160 170
+sp|Q1X IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPMPGSPATASPTLTPTL
+ :. :: . : :..... : . . . .::.. : . ... :.::
+sp|Q90 TQLIQQVEQLKQEVTRLARERDAYKLKCEKLASNGFREAGSTSDNPSSPEFFM
+ 260 270 280 290 300 310
+
+ 180 190 200 210 220 230
+sp|Q1X FKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFD
+
+>>sp|Q90888|MAFB_CHICK Transcription factor MafB OS=Gall (311 aa)
+ s-w opt: 161 Z-score: 152.2 bits: 36.5 E(516081): 0.59
+Smith-Waterman score: 161; 27.3% identity (62.6% similar) in 139 aa overlap (29-163:171-307)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS
+ .:. .: .: ...:.. . .. .. : :
+sp|Q90 HHQYPAVTHEDLAGSGHPHHHHHHHHQASPTPSTSSSSSQQLQTSHQQHPPSSSVEDRFS
+ 150 160 170 180 190 200
+
+ 60 70 80 90 100 110
+sp|Q1X WGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ : . . .: . :. :.:: .:.: :.:.::. ::. : .. . ..:::::
+sp|Q90 DDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSCRYKRVQQKHHLENEK
+ 210 220 230 240 250
+
+ 120 130 140 150 160 170
+sp|Q1X IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPMPGSPATASPTLTPTL
+ :. :: . : :..... : . . . .::.. : . ... :.::
+sp|Q90 TQLIQQVEQLKQEVTRLARERDAYKLKCEKLASNGFREAGSTSDNPSSPEFFM
+ 260 270 280 290 300 310
+
+ 180 190 200 210 220 230
+sp|Q1X FKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFD
+
+>>sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-bi (461 aa)
+ s-w opt: 163 Z-score: 150.9 bits: 36.8 E(516081): 0.7
+Smith-Waterman score: 163; 26.4% identity (52.7% similar) in 201 aa overlap (48-236:218-404)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK
+ .::: :. : :: :.:: :
+sp|Q68 SSGDLQQHHLGASYLLRPGAGHCQELVLTEDEKKLLAKE---GITLP---TQLPLTKY--
+ 190 200 210 220 230
+
+ 80 90 100 110 120 130
+sp|Q1X TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN
+ .:. ..:.: .::. .:: ::..:. .. ::.. ::: : ... ..: .:
+sp|Q68 --EERVLKKIRRKIRNKQSAQESRKKKKEYIDGLETRMSACTAQNQELQRKVLHLEKQNL
+ 240 250 260 270 280 290
+
+ 140 150 160 170 180
+sp|Q1X RLSQQLAQLAAEVRGSRANTPMPGSPATAS---------PTLTPTLFKQERDELPLERIP
+ : .:: .: : : : ... . :. ... :...: : .. : : . :
+sp|Q68 SLLEQLKKLQAIVVQSTSKSAQTGTCVAVLLLSFALIILPSISP--FGPNKTESPGDFAP
+ 300 310 320 330 340 350
+
+ 190 200 210 220 230 240
+sp|Q1X ---FPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTD
+ : .: . . ... : . .: .... :. :: : : :
+sp|Q68 VRVFSRTLHNDAASRVAADAVPGSEAPGPRPEADTTREESPGS--PGADWGFQDTANLTN
+ 360 370 380 390 400 410
+
+ 250 260 270 280 290 300
+sp|Q1X DVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTL
+
+sp|Q68 STEELDNATLVLRNATEGLGQVALLDWVAPGPSTGSGRAGLEAAGDEL
+ 420 430 440 450 460
+
+>>sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS=Schi (171 aa)
+ s-w opt: 154 Z-score: 150.5 bits: 35.3 E(516081): 0.73
+Smith-Waterman score: 154; 25.8% identity (55.8% similar) in 163 aa overlap (74-223:4-163)
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRER
+ :. ...:::..: .: ::: ::. :..
+sp|Q09 MTAKKKEVDDEKRRRILE---RNRIAASKFRQK
+ 10 20 30
+
+ 110 120 130 140 150
+sp|Q1X KRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQL-----AQLAAEVRG-----S
+ :. ...::. .:.. : :::.. : ::..:: : ....:. .
+sp|Q09 KKEWIKELEQTANAAFEQSKRLQLLLSQLQQEAFRLKSQLLAHQGCQCSVKIRSVLTDFQ
+ 40 50 60 70 80 90
+
+ 160 170 180 190 200 210
+sp|Q1X RANTPMPGSPATASPTLTP---TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+ :.. . .. . :. : ..... . : . : . : . ::. .:
+sp|Q09 TAHNALHSQHMAYRPVQPPPGDNMLESVVSVSPTQMHPSLQGLPPNQHPQMPPSSQQPNS
+ 100 110 120 130 140 150
+
+ 220 230 240 250 260 270
+sp|Q1X DVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDS
+ : .:. :.:::
+sp|Q09 DDVQQHMFSAAGLPRSLGGPI
+ 160 170
+
+>>sp|O88778|BSN_RAT Protein bassoon OS=Rattus norvegicus (3938 aa)
+ s-w opt: 181 Z-score: 150.4 bits: 39.8 E(516081): 0.74
+Smith-Waterman score: 181; 26.0% identity (55.7% similar) in 235 aa overlap (15-236:2294-2524)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQE
+ ::: : : :. :..: . .. : :
+sp|O88 STIPPAEGPVYLGKPAAAKASGAGGPPRPELPAGGAREEPLSTTAPP-AVIKEAPVAQAP
+ 2270 2280 2290 2300 2310 2320
+
+ 50 60 70 80 90 100
+sp|Q1X VKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDE--KEQRRIERVLRNRAAAQTSRE
+ . : .::: . :. : . ...:. ::. :.:... .. :.:. . :.
+sp|O88 APPPGQKPAGDAAA-GSGSGVLGRPVMEKEEASQEDRQRKQQEQLLQLERERVELEKLRQ
+ 2330 2340 2350 2360 2370 2380
+
+ 110 120 130 140 150
+sp|Q1X RKRLEMEKLENEKIQME---QQNQFLLQR-LSQMEA-ENNRLSQQLAQLAAEVRGSRANT
+ ::. :.:: :..... ...:.:.:: :..... ... :.:: . :. .: .
+sp|O88 L-RLQ-EELERERVELQRHREEEQLLVQRELQELQTIKHHVLQQQQEERQAQFALQREQL
+ 2390 2400 2410 2420 2430
+
+ 160 170 180 190 200 210
+sp|Q1X PMPGSPATASPTLTPTLFKQERDELPLERIPFP-TPSLSDYSPTLKPSTLAESSDV---A
+ . : : .: ... .. ::: : . .: . ::....
+sp|O88 AQQRLQLEQIQQLQQQLQQQLEEQKQRQKAPFPATCEAPSRGPPPAATELAQNGQYWPPL
+ 2440 2450 2460 2470 2480 2490
+
+ 220 230 240 250 260 270
+sp|Q1X QHPA-VSVAGLEGDGSAL-PLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSS
+ : : ..::: :: :.: :.. :
+sp|O88 THTAFIAVAGTEGPGQAREPVLHRGLPSSASDMSLQTEEQWEAGRSGIKKRHSMPRLRDA
+ 2500 2510 2520 2530 2540 2550
+
+>>sp|Q8VCH8|UBXN4_MOUSE UBX domain-containing protein 4 (506 aa)
+ s-w opt: 163 Z-score: 150.1 bits: 36.8 E(516081): 0.77
+Smith-Waterman score: 163; 22.8% identity (51.4% similar) in 333 aa overlap (19-337:146-459)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPE
+ : :. : .:: ....: . : .
+sp|Q8V KGEASVTNDNQSESSVSTPSASFEPDVCENPESKNTELCETPATSDIKSDTATGGECTGH
+ 120 130 140 150 160 170
+
+ 50 60 70 80 90 100
+sp|Q1X EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEM
+ ... . . .:. : : : :...:..: :.. :. . ::..
+sp|Q8V DSHSQEPHGCSNQRPAEDLTVRVERLTKKLEERREEKRKEEAQRE---IKKEIERRKTGK
+ 180 190 200 210 220 230
+
+ 110 120 130 140 150 160
+sp|Q1X EKLENEKIQMEQQNQFLLQRLSQMEAEN----NRLSQQLAQLAAEVRGSRANTPMPGSPA
+ : :. .. : :. .. .:.. :. .::. .:..::.: :: :..: . :
+sp|Q8V EMLDYKRKQEEELTKRMLEERSREKAEDRAARERIKQQIALDRAE-RAARFAKTKEAEAA
+ 240 250 260 270 280 290
+
+ 170 180 190 200 210
+sp|Q1X TASPTLTP---TLFKQE---RDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAV
+ :. :: : :.: ::. . :: : :. :... . :: : .. : :
+sp|Q8V KAAALLTKQAGTEVKRESTARDRSTIARIQFRLPDGSSFTNQF-PSD-APLEEARQFAAQ
+ 300 310 320 330 340
+
+ 220 230 240 250 260 270
+sp|Q1X SVAGLEGDGSALPLFD----LGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFE
+ .:.. :. : .: : :.. : :: . . : : .: .:. .
+sp|Q8V TVGNTYGNFSLATMFPRREFTREDYKRRLLDLELAPSA--SVVLLPAG----RPATSIVH
+ 350 360 370 380 390 400
+
+ 280 290 300 310 320 330
+sp|Q1X DGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTT
+ .. . :. .:: .. . :. . ... : .:. ...:..:. .::..
+sp|Q8V SS-SGDIWTLLGTVLYPFLAIWRLISN------FLFSNPPPAQTSARATSTEPSNSASSS
+ 410 420 430 440 450
+
+ 340
+sp|Q1X RCDGQGIAAGC
+ . .
+sp|Q8V KSEKREPVRKRMLEKRGEDFKKEGKIYRLRTQDDGEDENNTWNGNSTQQM
+ 460 470 480 490 500
+
+>>sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-bi (370 aa)
+ s-w opt: 160 Z-score: 149.9 bits: 36.3 E(516081): 0.79
+Smith-Waterman score: 160; 29.7% identity (56.5% similar) in 138 aa overlap (18-146:119-256)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVP-VLTVS--PADTSLNSAD-VKTQ
+ ::: :: . ::: :.:. . :.:.
+sp|Q9D EVVYDSGTLQGTQREAGPTFGLISIQIDQWTPALMVPDACTVSGLPSDSHRHILPRVSTR
+ 90 100 110 120 130 140
+
+ 50 60 70 80 90
+sp|Q1X EVKPEEKKPAKKRKSW-----GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQ
+ : :. ... . : : .:: . .:. ..:.: .::. .::
+sp|Q9D APAPPAAMPSCQHHLFLTDEEKQLLAQEGITLPSHLPLTKAEERILKKIRRKIRNKQSAQ
+ 150 160 170 180 190 200
+
+ 100 110 120 130 140 150
+sp|Q1X TSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP
+ ::.::. .. ::.. .::: : ......: .: : .:. ::
+sp|Q9D DSRRRKKEYLDGLESRVAACSEQNQKLQRKVQELERQNIFLMEQVRQLQKLTAQTSSRAA
+ 210 220 230 240 250 260
+
+ 160 170 180 190 200 210
+sp|Q1X MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAV
+
+sp|Q9D QTSTCVLILLFSLALIILPSFSPFQGQSEARPEDYQLHGVISRNILTHENVTENLESPVL
+ 270 280 290 300 310 320
+
+>>sp|A4R2R1|NST1_MAGGR Stress response protein NST1 OS=M (1319 aa)
+ s-w opt: 171 Z-score: 149.9 bits: 38.1 E(516081): 0.79
+Smith-Waterman score: 171; 22.7% identity (56.7% similar) in 194 aa overlap (43-227:675-868)
+
+ 20 30 40 50 60 70
+sp|Q1X DSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP
+ :. : ::.: :. . ..: . .
+sp|A4R AQAEEKARKDAEKAAEEAERLAEEQRRQEEQRQKNEERKKKKEAQRKAEEEERQRKEAER
+ 650 660 670 680 690 700
+
+ 80 90 100 110 120
+sp|Q1X RKRAKTEDEK--EQRRIERVLRNRA--AAQTSRERKRLEMEKLENE-KIQMEQQNQFLLQ
+ .::. . :. :: : : ... : . ...:.. : : : . . :. .. :.
+sp|A4R LRRAQEQKERQAEQDRKAREAKEKEKKAKEEAKQREKAARELKEREARERKEKADKERLE
+ 710 720 730 740 750 760
+
+ 130 140 150 160 170 180
+sp|Q1X RLSQMEAENN-RLSQQLAQLAAEVRGSRANTPMPGSPA---TASPTLTPTLFKQERDELP
+ . ....::.. : .:. :. :.. . ::.:.: .:: . .:. .:.: .... .
+sp|A4R KEAKIKAEKEAREAQRKAERASQKATTLANVPVPTGPARRQSQAPNPAPALPQSQQASVA
+ 770 780 790 800 810 820
+
+ 190 200 210 220 230 240
+sp|Q1X LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHS
+ ..: .:.: :: ... .. :.. . .: :
+sp|A4R SPQLPTAVPALPKLPTPQKPRRTSQQEPFTSGFAAQQVHGQGAGQYPAPPKAATPVHTSP
+ 830 840 850 860 870 880
+
+ 250 260 270 280 290 300
+sp|Q1X TDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPV
+
+sp|A4R GPGGLLSKGSSSQGQSLHSQATSPLGTSLPTSTSLPTPFGMPHPPPNQHYPPGIGPLNAP
+ 890 900 910 920 930 940
+
+>>sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcriptio (351 aa)
+ s-w opt: 159 Z-score: 149.4 bits: 36.1 E(516081): 0.85
+Smith-Waterman score: 159; 31.6% identity (64.3% similar) in 98 aa overlap (66-160:258-351)
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR---AKTEDEKEQRRIERVLR
+ :: :: .. ::.. :: ....... .
+sp|P18 YLGSPQHSPSTRGSPNRSLPSPGVLCGSARPKPYDPPGEKMVAAKVKGEKLDKKLKKMEQ
+ 230 240 250 260 270 280
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :..:: :..:: :.: : .: ..:..:. : .: ... : : : .: :::
+sp|P18 NKTAATRYRQKKRAEQEALTGECKELEKKNEALKERADSLAKEI----QYLKDLIEEVRK
+ 290 300 310 320 330 340
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+ .:.. .:
+sp|P18 ARGKKRVP
+ 350
+
+>>sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocricet (381 aa)
+ s-w opt: 159 Z-score: 148.7 bits: 36.1 E(516081): 0.92
+Smith-Waterman score: 159; 25.9% identity (49.0% similar) in 247 aa overlap (2-237:57-298)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|O88 LSYYHSPADSFSSMGSPVNAQDFCTDLSVSSANFIPTVTAISTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . : : . . : : :. . . . . . . .:.:.:::.
+sp|O88 PSQTRAPHPYGVPTPSTGAYSRAGMVKTVSGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|O88 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: .:: :: : : .: ::: : : ::: . .
+sp|O88 ACKIPD-DLGFPEEMFVASLDLTGGLPEATTPESEEAFSLPLLNDPEPKPSLEPVKSISN
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250 260
+sp|Q1X PSTLAESSDVAQHPAVSV-AGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNRLF
+ :: : :: : .: : . ..: .:: ::
+sp|O88 VELKAEPFDDFLFPASSRPSGSETTARSVPDMDLSGSFYAADWEPLHSSSLGMGPMVTEL
+ 270 280 290 300 310 320
+
+ 270 280 290 300 310 320
+sp|Q1X HGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTC
+
+sp|O88 EPLCTPVVTCTPSCTTYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTLLAL
+ 330 340 350 360 370 380
+
+>>sp|A5PKJ4|MK07_BOVIN Mitogen-activated protein kinase (781 aa)
+ s-w opt: 165 Z-score: 148.5 bits: 37.1 E(516081): 0.94
+Smith-Waterman score: 165; 27.0% identity (48.0% similar) in 244 aa overlap (3-236:429-655)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPAD
+ : ::. . :. :: .. ::..:
+sp|A5P IRFQPSLQPVASEPGCPDVEMPSPWAPSGDCAMESPPPAPLPCPG-PAPDTIDLTLQPPP
+ 400 410 420 430 440 450
+
+ 40 50 60 70 80
+sp|Q1X TSLNSADVKTQEVKPEEKKPA------KKRKSWGQELPVPKTNLP-PRKRAKTEDEKEQR
+ . . : : . . .. : : :. .: .. : . : ::: . .......:
+sp|A5P PASEPAPPKKEGAISDNTKAALKAALLKSLRSRLRDGPSAPLEAPEPRKPVTAQERQRER
+ 460 470 480 490 500 510
+
+ 90 100 110 120 130 140
+sp|Q1X RIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQ
+ . .: : : ::..: : :. : . : : . ..:.: .: .
+sp|A5P EEKR--RRRQERAKEREKRRQERERKERGAGVSGGPSADPLAGL--VLSDNDR---SLLE
+ 520 530 540 550 560 570
+
+ 150 160 170 180 190 200
+sp|Q1X LAAEVRGSRANTPMPGSPATASPTLTPTL-FKQERDELPLERIPFPTPSLSDYSPTLKPS
+ : .: : .:::: : :. : :: : :.:. . :. :.
+sp|A5P -----RWTRMAQPPAPAPATARPPSPPAGPATQPTGPLPQPACPPPAPAAG---PA-APQ
+ 580 590 600 610 620
+
+ 210 220 230 240 250 260
+sp|Q1X TLAESSDVAQHPAVSVAGLEGDG--SALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHG
+ : : :. .: .: : :: : . :.:: : :
+sp|A5P TTAASGLLAPQPLVPPPGLPGPSALSVLPYFPSGPPPPDPGGAPQPSTSESPDVTLVTQQ
+ 630 640 650 660 670 680
+
+ 270 280 290 300 310 320
+sp|Q1X DSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKT
+
+sp|A5P LSKSQVEDPLPPVFSGTPKGSGAGYGVGFDLEEFLNQSFDMGVADGPQDGQADSASLSAS
+ 690 700 710 720 730 740
+
+>>sp|Q1DQC1|PAN1_COCIM Actin cytoskeleton-regulatory com (1485 aa)
+ s-w opt: 170 Z-score: 148.0 bits: 37.9 E(516081): 1
+Smith-Waterman score: 170; 23.6% identity (51.8% similar) in 284 aa overlap (5-265:989-1264)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVP----------
+ . . : : : : :.:. :
+sp|Q1D RQEREKREKEERRRRAEEEDAKREAERQKRLAQEKSPVTSPPPKPSSKKPPPPPSRKVRT
+ 960 970 980 990 1000 1010
+
+ 30 40 50 60 70 80
+sp|Q1X -VLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKE
+ : : . .:. .. ... :::. : :... .:: . . :: . : .:
+sp|Q1D DVTESVEAKKAEDSVVASKARAEQEEKERALKQEQEAQEAERKQLE-DEAKRQEEELARE
+ 1020 1030 1040 1050 1060 1070
+
+ 90 100 110 120 130
+sp|Q1X QRRIERVLR--NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNR---
+ .. . :: .. . : . .... . .: . :: :.. .. :: ...:: . :
+sp|Q1D KEAAQARLRALEEQVRQGKIKKQEEKRRKQQAEKEAKEKEARLAAQR-AELEAAQARERE
+ 1080 1090 1100 1110 1120 1130
+
+ 140 150 160 170 180 190
+sp|Q1X LSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDELPLERIPFPTPSLS
+ :..:: ... : .: . :. .: :..:: . :. : : : .: :. .
+sp|Q1D LQRQLENMGEEESSSDDEGPIEITPQTSTPTQSQVLPAPFPQPSP--PTAALPVPAIQEP
+ 1140 1150 1160 1170 1180 1190
+
+ 200 210 220 230 240 250
+sp|Q1X DYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPL----
+ : . . .:: : . .:. .. : . : : : .:...:. ..: :
+sp|Q1D DQDVAREPSPTLPSPVETPEPVKQTLPPETE-SRNPYF---RQLSQQSAPSAAQPTHEMQ
+ 1200 1210 1220 1230 1240 1250
+
+ 260 270 280 290 300 310
+sp|Q1X SDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMA
+ : . :.:: . .:.
+sp|Q1D STNPFHRLAQQESTSKSAFTTDATVPGPLERKSRVRPEEDDWSAAESENESDEDDDRVAG
+ 1260 1270 1280 1290 1300 1310
+
+>>sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus muscul (380 aa)
+ s-w opt: 158 Z-score: 147.8 bits: 35.9 E(516081): 1
+Smith-Waterman score: 158; 25.2% identity (48.8% similar) in 246 aa overlap (2-237:57-297)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|P01 LSYYHSPADSFSSMGSPVNTQDFCADLSVSSANFIPTVTAISTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . . :: . . : : :. . . . . . . .:.:.:::.
+sp|P01 PSQTRAPHPYGLPTQSAGAYARAGMVKTVSGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|P01 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: ..:: :: : : .: ::: : : ::: . .
+sp|P01 ACKIPD-DLGFPEEMSVASLDLTGGLPEASTPESEEAFTLPLLNDPEPKPSLEPVKSISN
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250 260
+sp|Q1X PSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNRLFH
+ :: : :: : . . ..: :: ::
+sp|P01 VELKAEPFDDFLFPASSRPSGSETSRSVPDVDLSGSFYAADWEPLHSNSLGMGPMVTELE
+ 270 280 290 300 310 320
+
+ 270 280 290 300 310 320
+sp|Q1X GDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCK
+
+sp|P01 PLCTPVVTCTPGCTTYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTLLAL
+ 330 340 350 360 370 380
+
+>>sp|Q6NW59|ATF4_DANRE Cyclic AMP-dependent transcriptio (339 aa)
+ s-w opt: 157 Z-score: 147.8 bits: 35.8 E(516081): 1
+Smith-Waterman score: 157; 22.5% identity (63.8% similar) in 138 aa overlap (18-154:204-338)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ :: : . : .:.... :. . ..
+sp|Q6N APQDEHTEVPVLHPAGIMLSLSPSHIVVLLTPKEEQNISDCSDSDSGIS---VSGSPAHQ
+ 180 190 200 210 220 230
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE
+ . .:... : ... : . : : .... : ....... .:..:: :..::.:
+sp|Q6N SDLEPSSRAKPYSRPDPEASPALKGRVKTSSGAPKVEKKLKKMEQNKTAATRYRQKKRVE
+ 240 250 260 270 280 290
+
+ 110 120 130 140 150 160
+sp|Q1X MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL-AAEVRGSRANTPMPGSPATA
+ .:.:..: ..:..:. : .. ... : . : . : .. .:. : :.
+sp|Q6N QESLNSECSELEKKNRELSEKADSLSREIQYLRDLLEEMRTAKQRKSKR
+ 300 310 320 330
+
+ 170 180 190 200 210 220
+sp|Q1X SPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGD
+
+>>sp|Q76LL6|FHOD3_MOUSE FH1/FH2 domain-containing protei (1578 aa)
+ s-w opt: 170 Z-score: 147.5 bits: 37.9 E(516081): 1.1
+Smith-Waterman score: 170; 25.1% identity (52.5% similar) in 259 aa overlap (7-235:509-759)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLN
+ :. ..:.:: .: : ... . :. :
+sp|Q76 GGTSGPEASRPAARLLPPSPGLATRPSTAPKVSPTIDKLPYVPHSPFHLFSYDFEDSPLL
+ 480 490 500 510 520 530
+
+ 40 50 60 70 80 90
+sp|Q1X SADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL-----
+ . : : . . :.. . .:. . : : . : .. . .. : :
+sp|Q76 TKD-KGGDSQTENRYSNFSSNSFQSSRPSPGPSGSPSYASSFSSPQDTRSSPSGLLTSSF
+ 540 550 560 570 580 590
+
+ 100 110 120 130 140
+sp|Q1X -RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQF----LLQRLSQMEAENNRLSQQLAQL
+ ... . . :::.: : :. . ..:. :..:.: : .: : .:...: . : ::
+sp|Q76 RQHQESLAAERERRRQEREE-RLQRIEREERNKFNREYLDKREEQRQARGERY-KYLEQL
+ 600 610 620 630 640 650
+
+ 150 160 170 180 190
+sp|Q1X AAE----------VRGSRANTPM----PGSPATASPT-LTPTLFKQERDELPLERIPFPT
+ ::: : .::. . :..:: ::. .:. .:: ::. : ::
+sp|Q76 AAETQEKEPRSQSVSRGRADLSLDLSLPAAPAPPSPSSQSPSADSQE--ALPVPSSP-PT
+ 660 670 680 690 700 710
+
+ 200 210 220 230 240
+sp|Q1X ---PSLS--DYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDD
+ :..: :. : :. . .....: : . : :. . :...:
+sp|Q76 LQCPQVSGKDHEPELEAEAGQGADEASQDIASAHRGAES--QEEPVLELEPEERASLSEK
+ 720 730 740 750 760 770
+
+ 250 260 270 280 290 300
+sp|Q1X VAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLE
+
+sp|Q76 ERQNEEVNERDNCSASSISSSSSTLEREEKEDKLSEDRATGLWSTSLQDVGVNGQCGDIL
+ 780 790 800 810 820 830
+
+>>sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive element-bi (395 aa)
+ s-w opt: 158 Z-score: 147.5 bits: 35.9 E(516081): 1.1
+Smith-Waterman score: 158; 29.3% identity (56.0% similar) in 150 aa overlap (54-199:192-329)
+
+ 30 40 50 60 70 80
+sp|Q1X PVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQE-LPVPKTNLPPRKRAKTEDEK
+ .... ::: . .: ..:: : .:.
+sp|Q8T AHAHILPRAGTVAPVPCTTLLPCQTLFLTDEEKRLLGQEGVSLP-SHLPLTK----AEER
+ 170 180 190 200 210
+
+ 90 100 110 120 130 140
+sp|Q1X EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ
+ ....: .::. .:: ::.::. .. ::.. ::: : ......: .: : :
+sp|Q8T VLKKVRRKIRNKQSAQDSRRRKKEYIDGLESRVAACSAQNQELQKKVQELERHNISLVAQ
+ 220 230 240 250 260 270
+
+ 150 160 170 180 190
+sp|Q1X LAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF---PTPSLSDYSP
+ : :: . . :.: .. : .: . ::. :: :: : . ::.:
+sp|Q8T LRQLQTLI----AQTS--NKAAQTSTCVLILLFSLALIILP-SFSPFQSRPEAGSEDYQP
+ 280 290 300 310 320
+
+ 200 210 220 230 240 250
+sp|Q1X TLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRL
+
+sp|Q8T HGVTSRNILTHKDVTENLETQVVESRLREPPGAKDANGSTRTLLEKMGGKPRPSGRIRSV
+ 330 340 350 360 370 380
+
+>>sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF2 OS (401 aa)
+ s-w opt: 158 Z-score: 147.4 bits: 35.9 E(516081): 1.1
+Smith-Waterman score: 158; 28.6% identity (61.3% similar) in 119 aa overlap (80-198:195-312)
+
+ 50 60 70 80 90 100
+sp|Q1X KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ : .. .:..:.: :: .:. ::.::. .:
+sp|Q99 QVKSTTSGSSRDHSDDDDELEGETETTRNGDPSDAKRVRRMLSNRESARRSRRRKQAHMT
+ 170 180 190 200 210 220
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPT
+ .::.. :.. .:. ::.::... . : . . : :... ::.. : .
+sp|Q99 ELETQVSQLRVENSSLLKRLTDISQRYNDAAVDNRVLKADIETMRAKVKMAEETVKRVTG
+ 230 240 250 260 270 280
+
+ 170 180 190 200 210 220
+sp|Q1X LTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSA
+ :.: .:.. .:. . . : :: :
+sp|Q99 LNP-MFQSMSSEISTIGMQSFSGSPSDTSADTTQDGSKQHFYQPAPTSHMPAQDQKIQNG
+ 290 300 310 320 330 340
+
+>>sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcriptio (483 aa)
+ s-w opt: 159 Z-score: 146.8 bits: 36.1 E(516081): 1.2
+Smith-Waterman score: 159; 26.1% identity (62.7% similar) in 153 aa overlap (26-168:277-424)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV--KPEEKKPA
+ ..:. :.: ... ..: . .:. .::
+sp|Q5R PSGHPIPSEAKMRLKATLTHQVSSINGGCGMVVGSASTMVTARPEQSQILIQHPDAPSPA
+ 250 260 270 280 290 300
+
+ 60 70 80 90 100 110
+sp|Q1X KKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLEN
+ . . : .: :.:.:. :.: .... ..:: . . ::::::. :....: . .::.
+sp|Q5R QPQVSPAQ--PTPSTG--GRRRRTVDEDPDERRQRFLERNRAAASRCRQKRKLWVSSLEK
+ 310 320 330 340 350 360
+
+ 120 130 140 150 160
+sp|Q1X EKIQMEQQNQFLLQRLSQMEAENNRLSQQL--------AQLAAEVRGSRANTPMPGSPAT
+ . .. .:: : .... .. : .:.: : . : ...: ..: .: :
+sp|Q5R KAEELTSQNIQLSNEVTLLRNEVAQLKQLLLAHKDCPVTALQKKTQG-YLESPKESSEPT
+ 370 380 390 400 410 420
+
+ 170 180 190 200 210 220
+sp|Q1X ASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEG
+ .::
+sp|Q5R GSPAPVIQHSSATAPSNGLSVRSAAEAVATSVLTQMASQRTELSMPIQSHVIMTPQSQSA
+ 430 440 450 460 470 480
+
+>>sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcriptio (494 aa)
+ s-w opt: 159 Z-score: 146.6 bits: 36.1 E(516081): 1.2
+Smith-Waterman score: 159; 26.1% identity (62.7% similar) in 153 aa overlap (26-168:288-435)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV--KPEEKKPA
+ ..:. :.: ... ..: . .:. .::
+sp|P17 PSGHPIPSEAKMRLKATLTHQVSSINGGCGMVVGTASTMVTARPEQSQILIQHPDAPSPA
+ 260 270 280 290 300 310
+
+ 60 70 80 90 100 110
+sp|Q1X KKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLEN
+ . . : .: :.:.:. :.: .... ..:: . . ::::::. :....: . .::.
+sp|P17 QPQVSPAQ--PTPSTG--GRRRRTVDEDPDERRQRFLERNRAAASRCRQKRKLWVSSLEK
+ 320 330 340 350 360 370
+
+ 120 130 140 150 160
+sp|Q1X EKIQMEQQNQFLLQRLSQMEAENNRLSQQL--------AQLAAEVRGSRANTPMPGSPAT
+ . .. .:: : .... .. : .:.: : . : ...: ..: .: :
+sp|P17 KAEELTSQNIQLSNEVTLLRNEVAQLKQLLLAHKDCPVTALQKKTQG-YLESPKESSEPT
+ 380 390 400 410 420 430
+
+ 170 180 190 200 210 220
+sp|Q1X ASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEG
+ .::
+sp|P17 GSPAPVIQHSSATAPSNGLSVRSAAEAVATSVLTQMASQRTELSMPIQSHVIMTPQSQSA
+ 440 450 460 470 480 490
+
+>>sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive element-bi (395 aa)
+ s-w opt: 157 Z-score: 146.6 bits: 35.8 E(516081): 1.2
+Smith-Waterman score: 157; 29.3% identity (56.0% similar) in 150 aa overlap (54-199:192-329)
+
+ 30 40 50 60 70 80
+sp|Q1X PVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQE-LPVPKTNLPPRKRAKTEDEK
+ .... ::: . .: ..:: : .:.
+sp|Q5U AHAHILPRAGTLAPVPCTTLLPCQTLFLTDEEKRLLGQEGVSLP-SHLPLTK----AEER
+ 170 180 190 200 210
+
+ 90 100 110 120 130 140
+sp|Q1X EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ
+ ....: .::. .:: ::.::. .. ::.. ::: : ......: .: : :
+sp|Q5U VLKKVRRKIRNKQSAQDSRRRKKEYIDGLESRVAACSAQNQELQKKVQELERHNISLVAQ
+ 220 230 240 250 260 270
+
+ 150 160 170 180 190
+sp|Q1X LAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF---PTPSLSDYSP
+ : :: . . :.: .. : .: . ::. :: :: : . ::.:
+sp|Q5U LRQLQTLI----AQTS--NKAAQTSTCVLILLFSLALIILP-SFSPFQGRPEAGPEDYQP
+ 280 290 300 310 320
+
+ 200 210 220 230 240 250
+sp|Q1X TLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRL
+
+sp|Q5U HGVTSRNILTHKDITENLETQVVESRLREPPEAKDANDSTRTLLEKMGGKPRPSGRIGTV
+ 330 340 350 360 370 380
+
+>>sp|P51145|FOSL2_RAT Fos-related antigen 2 OS=Rattus no (327 aa)
+ s-w opt: 155 Z-score: 146.2 bits: 35.4 E(516081): 1.3
+Smith-Waterman score: 155; 23.1% identity (55.9% similar) in 229 aa overlap (12-216:38-261)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL---TVSPAD------
+ :: .:.. .. .:.. :.. :
+sp|P51 NFDTSSRGSSGSPAHAESYSSGGGGQQKFRVD-MPGSGSAFIPTINAITTTSQDLQWMVQ
+ 10 20 30 40 50 60
+
+ 40 50 60 70 80
+sp|Q1X -TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK------TNLPPRKRAK--TEDEKE
+ : ..: . . .: :. . . :: : :.. :.: . . .:.:
+sp|P51 PTVITSMSNPYPRSHPYSPLPGLRSVPGHMALPRPGVIKTIGTTVGRRRRDEQLSPEEEE
+ 70 80 90 100 110 120
+
+ 90 100 110 120 130 140
+sp|Q1X QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQL
+ .:::.: ::. :: :.:.: :::..: ..:.... : ....... :...: .:
+sp|P51 KRRIRRE-RNKLAAAKCRNRRRELTEKLQTETEELEEEKSGLQKEIAELQKEKEKLEFML
+ 130 140 150 160 170 180
+
+ 150 160 170 180 190
+sp|Q1X AQLAAEVRGS---RANTPMPGSPAT--ASPTLTPTLFKQERDELPLERIPFPTPSLSDYS
+ . . . : : ..: : . .. .. :.. ::: : : : . ... .
+sp|P51 VAHGPVCKISPEERRSSPTSGVQSLRGTGSAVGPVVVKQEP---PEEDSPSSSAGMDKTQ
+ 190 200 210 220 230 240
+
+ 200 210 220 230 240 250
+sp|Q1X PT-LKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFN
+ . .:: ..: .. ...:
+sp|P51 RSVIKPISIAGGGFYGEEPLHTPIVVTSTPAITPGTSNLVFTYPSVLEQESPASPSESCS
+ 250 260 270 280 290 300
+
+>>sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo sapie (380 aa)
+ s-w opt: 156 Z-score: 146.0 bits: 35.6 E(516081): 1.3
+Smith-Waterman score: 156; 28.2% identity (51.6% similar) in 248 aa overlap (9-237:55-297)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPA-SEVPVLT--VSPADTSL
+ .::.. .:.. : : : : :.:: .:
+sp|P01 DSLSYYHSPADSFSSMGSPVNAQDFCTDLAVSSANFIPTVTAISTSPDLQWLVQPALVS-
+ 30 40 50 60 70 80
+
+ 40 50 60 70 80
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR-----KRAKTE----DEKEQRR
+ . : .:. .: :: . .... : :: : .:.:.: .:.:.::
+sp|P01 SVAPSQTRAPHPF-GVPAPSAGAYSRA-GVVKTMTGGRAQSIGRRGKVEQLSPEEEEKRR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X IERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL
+ :.: ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|P01 IRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAH
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X AAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPT
+ . . .: ..:: :: : . : .: ::: : : ::. .
+sp|P01 RPACKIPD-DLGFPEEMSVASLDLTGGLPEVATPESEEAFTLPLLNDPEPKPSVEPVKSI
+ 210 220 230 240 250
+
+ 210 220 230 240 250
+sp|Q1X LKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNRL
+ . .: : :: : . . ..: .:: ::
+sp|P01 SSMELKTEPFDDFLFPASSRPSGSETARSVPDMDLSGSFYAADWEPLHSGSLGMGPMATE
+ 260 270 280 290 300 310
+
+ 260 270 280 290 300 310
+sp|Q1X FHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETT
+
+sp|P01 LEPLCTPVVTCTPSCTAYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTLLA
+ 320 330 340 350 360 370
+
+>>sp|Q03173|ENAH_MOUSE Protein enabled homolog OS=Mus mu (802 aa)
+ s-w opt: 162 Z-score: 145.5 bits: 36.6 E(516081): 1.4
+Smith-Waterman score: 162; 25.9% identity (52.1% similar) in 259 aa overlap (9-254:105-350)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSA
+ : ... : . :.. : :.. .:.:
+sp|Q03 QTFHQWRDARQVYGLNFGSKEDANVFASAMMHALEVLNSQEAAQSKV-TATQDSTNLRCI
+ 80 90 100 110 120 130
+
+ 40 50 60 70 80 90
+sp|Q1X DVKTQEVKPEEKKPAKKRKSWGQE-LPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAA
+ . . . ::. ... .:: : . . .: ..: : : :.:. . ::. :.:
+sp|Q03 FCGPTLPRQNSQLPAQVQNGPSQEELEIQRRQLQEQQRQK-ELERERMERERLERERLER
+ 140 150 160 170 180 190
+
+ 100 110 120 130 140 150
+sp|Q1X QTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAE-NNRLSQQLAQLAAEV----RG
+ . ::.:::.:.:: .. . :. ... .:: ..: : ..: ..: :: : :
+sp|Q03 ERL-ERERLEQEQLERQRQEREHVERLERERLERLERERQERERERLEQLEREQVEWERE
+ 200 210 220 230 240 250
+
+ 160 170 180 190 200
+sp|Q1X SRANTPMPGSPATASPTLTPTLFK-QERDELPLERIPFPTPSLSDYSP-----TLKPSTL
+ : .. :.: .. : . : . : . : . .:: .: : : :
+sp|Q03 RRMSNAAPSSDSSLSSAPLPEYSSCQPPSAPPPSYAKVISAPVSDATPDYAVVTALPPTS
+ 260 270 280 290 300 310
+
+ 210 220 230 240 250 260
+sp|Q1X AESSDVAQHPAVSVAGLEGDGSAL-PLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSS
+ . . .: :. : . :::. :. : :..: : ::. .
+sp|Q03 TPPTPPLRHAATRFA--TSLGSAFHPV------LPHYAT--VPRPLNKNSRPSSPVNTPS
+ 320 330 340 350 360
+
+ 270 280 290 300 310 320
+sp|Q1X VEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSV
+
+sp|Q03 SQPPAAKSCAWPTSNFSPLPPSPPIMISSPPGKATGPRPVLPVCVSSPVPQMPPSPTAPN
+ 370 380 390 400 410 420
+
+>>sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS=Homo (323 aa)
+ s-w opt: 154 Z-score: 145.4 bits: 35.3 E(516081): 1.4
+Smith-Waterman score: 154; 28.6% identity (57.1% similar) in 154 aa overlap (14-163:174-319)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ : :.::...:. .:. . :: .
+sp|Q9Y AYPGAGVAHDELGPHAHPHHHHHHQASPPPSSAASPAQQLPTSHPGPGPHATASATAAGG
+ 150 160 170 180 190 200
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTS
+ . . :. : : : . . .: . :. :.:: .:.: :.:.::. ::.
+sp|Q9Y NGSVED------RFSDDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSC
+ 210 220 230 240 250
+
+ 110 120 130 140 150
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPM
+ : .. . ..::::: :. :: . : :..:.. : . . . .:: : . ...
+sp|Q9Y RYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAYKVKCEKLANSGFREAGSTSDS
+ 260 270 280 290 300 310
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::
+sp|Q9Y PSSPEFFL
+ 320
+
+>>sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Rattus n (267 aa)
+ s-w opt: 152 Z-score: 145.1 bits: 34.9 E(516081): 1.5
+Smith-Waterman score: 152; 27.6% identity (56.4% similar) in 163 aa overlap (51-190:23-183)
+
+ 30 40 50 60 70
+sp|Q1X SEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK------TNLPP-R
+ .::. .. .: :. .. : :
+sp|Q9R MVVVAAAPSAASAAPKVLLLSGQPASGGRALPLMVPGPRAAGSEASGTPQAR
+ 10 20 30 40 50
+
+ 80 90 100 110 120
+sp|Q1X KRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQ-------FL
+ :: . :. :.. ..: :.::.::::.:.::. .: .::.. ...:..:: .:
+sp|Q9R KRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENQKLQLENQLL
+ 60 70 80 90 100 110
+
+ 130 140 150 160 170
+sp|Q1X LQRLSQMEAENNRLSQQLAQLA--------AEVRGSRANTPMPGSPATASPTLTPTLFKQ
+ .. . ::..: .:.. : :: .:. . . :: .:. : : .:
+sp|Q9R REKTHGLVIENQELRTRLGMNALVTEEVSEAESKGNGVRL-VAGSAESAALRLRAPL-QQ
+ 120 130 140 150 160 170
+
+ 180 190 200 210 220 230
+sp|Q1X ERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGS
+ . .: . ::
+sp|Q9R VQAQLSPPQNIFPWILTLLPLQILSLISFWAFWTSWTLSCFSNVLPQSLLIWRNSQRSTQ
+ 180 190 200 210 220 230
+
+>>sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein OS= (381 aa)
+ s-w opt: 155 Z-score: 145.0 bits: 35.4 E(516081): 1.5
+Smith-Waterman score: 155; 25.2% identity (48.8% similar) in 246 aa overlap (2-237:57-297)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|P01 LSYYHSPADSFSSMGSPVNTQDFCADLSVSSANFIPTVTATSTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . . :: . . : : :. . . . . . . .:.:.:::.
+sp|P01 PSQTRAPHPYGLPTQSAGAYARAEMVKTVSGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|P01 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDKKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: ..:: :: : : .: ::: : : ::: . .
+sp|P01 ACKIPD-DLGFPEEMSVASLDLTGGLPEASTPESEEAFTLPLLNDPEPKPSLEPVKSISN
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250 260
+sp|Q1X PSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNRLFH
+ :: : :: : . . ..: :: ::
+sp|P01 VELKAEPFDDFLFPASSRPSGSETSRSVPNVDLSGSFYAADWEPLHSNSLGMGPMVTELE
+ 270 280 290 300 310 320
+
+ 270 280 290 300 310 320
+sp|Q1X GDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCK
+
+sp|P01 PLCTPVVTCTPLLRLPELTHAAGPVSSQRRQGSRHPDVPLPELVHYREEKHVFPQRFPST
+ 330 340 350 360 370 380
+
+>>sp|P10158|FOSL1_RAT Fos-related antigen 1 OS=Rattus no (275 aa)
+ s-w opt: 152 Z-score: 144.8 bits: 34.9 E(516081): 1.5
+Smith-Waterman score: 152; 27.1% identity (53.6% similar) in 207 aa overlap (44-232:74-267)
+
+ 20 30 40 50 60 70
+sp|Q1X SLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR
+ . .: . .:. : . : : : . :
+sp|P10 NAVSGSQELQWMVQPHFLGPSGYPRPLTYPQYSPPQPRPGVIR-ALG---PPPGVRRRPC
+ 50 60 70 80 90
+
+ 80 90 100 110 120
+sp|Q1X KRAKTEDEKEQRRIERVLRNRAAAQTSRERKR-------LEMEKLENEKIQMEQQNQFLL
+ .. . :.: :.::..: ::. :: :.:.. : .:::.:: .... . :
+sp|P10 EQISPEEE-ERRRVRRE-RNKLAAAKCRNRRKELTDFLQAETDKLEDEKSGLQREIEELQ
+ 100 110 120 130 140 150
+
+ 130 140 150 160 170
+sp|Q1X QRLSQMEA--ENNRLSQQLAQLAAEVRGSRANTPMPGSP-ATASP----TLTP-TLFKQE
+ .. ..: : .: .. . . :. ..: ::: . : .:.: ... :
+sp|P10 KQKERLELVLEAHRPICKIPEEDKKDTGGTSSTSGAGSPPGPCRPVPCISLSPGPVLEPE
+ 160 170 180 190 200 210
+
+ 180 190 200 210 220 230
+sp|Q1X RDELPLERIPFPTPSLSDYSPTL---KPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL
+ . : . ::::. ..:.: ::: : . :.. . : .: : :. ::
+sp|P10 ALHTPTL---MTTPSLTPFTPSLVFTYPST-PEPCSSAHRKSSSSSG---DPSSDPLGSP
+ 220 230 240 250 260 270
+
+ 240 250 260 270 280 290
+sp|Q1X GSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSM
+
+sp|P10 TLLAL
+
+
+>>sp|Q6Y7W8|PERQ2_MOUSE PERQ amino acid-rich with GYF do (1291 aa)
+ s-w opt: 165 Z-score: 144.5 bits: 37.1 E(516081): 1.6
+Smith-Waterman score: 165; 24.2% identity (51.3% similar) in 273 aa overlap (13-267:284-545)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPA--TPASEVPVLTVSPADTSLNSADV
+ :::: .: . : . . . :. :
+sp|Q6Y RRFEFDFRDRDDERGYRRVRSGSGSIDDDRDSLPEWCLEDAEEEMGTFDSSGAFLSLKKV
+ 260 270 280 290 300 310
+
+ 50 60 70 80 90 100
+sp|Q1X KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS
+ . . . :::.. . :.: .. ..:: :. ..:. :.. .::.:..:
+sp|Q6Y QKEPI-PEEQEMDFRPVEEGEER--SDSDSSHNEEAKEPDKTNRREGEKT--DRAGAEAS
+ 320 330 340 350 360
+
+ 110 120 130 140
+sp|Q1X RE---------RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN---NRLSQQLAQLAA
+ .: : .. .: :.:.... ... . : :: : :: .. . .
+sp|Q6Y EEVPQTSLSSARPGTPSDHQPQEATQFERKDEPKAEQVEKAEEENRSENSLSAKVPSRGD
+ 370 380 390 400 410 420
+
+ 150 160 170 180 190 200
+sp|Q1X EV--RGSRANTPMPGSPATASPTL--TPTLFKQERDELPLERIPFPTPSLSDYSPTLKPS
+ :. ... .::.: : :::: : .: . :.: .:..:. : .:.
+sp|Q6Y ETVPASQQPSTPLP--PDTASPLLILSPPVPTPSSASRPVETAAVEAPGMSSVST--EPD
+ 430 440 450 460 470 480
+
+ 210 220 230 240 250 260
+sp|Q1X TLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDS
+ . . :. :: :. ::: : : :..: . :. :: . ... .. :
+sp|Q6Y DEEGLKHLEQQAEKMVAYLQD--SALDDERLTSKLQEHRAKGVSIPLMHEAMQKWYYKDP
+ 490 500 510 520 530 540
+
+ 270 280 290 300 310 320
+sp|Q1X SVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSS
+ . :
+sp|Q6Y QGEIQGPFNNQEMAEWFQAGYFTMSLLVKRACDESFQPLGDIMKMWGRVPFSPGPAPPPH
+ 550 560 570 580 590 600
+
+>>sp|P15408|FOSL2_HUMAN Fos-related antigen 2 OS=Homo sa (326 aa)
+ s-w opt: 153 Z-score: 144.4 bits: 35.1 E(516081): 1.6
+Smith-Waterman score: 153; 24.9% identity (54.1% similar) in 233 aa overlap (4-222:39-253)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSS-VDSLPATPASEVPVLTVSPAD
+ :: . :. . .. : .:. :.:
+sp|P15 FDTSSRGSSGSPAHAESYSSGGGGQQKFRVDMPGSGSAFIPTINAITTSQDLQWMVQP--
+ 10 20 30 40 50 60
+
+ 40 50 60 70 80
+sp|Q1X TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK------TNLPPRKRAK--TEDEKEQ
+ : ..: . . .: :. . :: : :.. :.: . . .:.:.
+sp|P15 TVITSMSNPYPRSHPYSPLPGLASVPGHMALPRPGVIKTIGTTVGRRRRDEQLSPEEEEK
+ 70 80 90 100 110 120
+
+ 90 100 110 120 130 140
+sp|Q1X RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA
+ :::.: ::. :: :.:.: :::. : ..:.... : ....... :...: .:.
+sp|P15 RRIRRE-RNKLAAAKCRNRRRELTEKLQAETEELEEEKSGLQKEIAELQKEKEKLEFMLV
+ 130 140 150 160 170 180
+
+ 150 160 170 180 190
+sp|Q1X QLAAEVRGS---RANTPMPG-SPA-TASPTLTPTLFKQERDELPLERIPFPTPSLSDYSP
+ . . : : . : :: .: ... .. .. ::: ::: . ::
+sp|P15 AHGPVCKISPEERRSPPAPGLQPMRSGGGSVGAVVVKQE----PLE----------EDSP
+ 190 200 210 220 230
+
+ 200 210 220 230 240 250
+sp|Q1X TLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRL
+ . . . : ... . .: .:.::
+sp|P15 SSSSAGLDKAQRSVIKP-ISIAGGFYGEEPLHTPIVVTSTPAVTPGTSNLVFTYPSVLEQ
+ 240 250 260 270 280 290
+
+>>sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive element-bi (428 aa)
+ s-w opt: 155 Z-score: 144.1 bits: 35.4 E(516081): 1.7
+Smith-Waterman score: 155; 26.8% identity (54.0% similar) in 198 aa overlap (8-199:138-322)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSP---ADTS
+ :. . .. : ::. : :::. . :
+sp|Q50 VSQTQHSLNINFPFDFNGWETGFLPDQAGGTQCASETPQAQPATGFP-LTVKDLLLSGTP
+ 110 120 130 140 150 160
+
+ 40 50 60 70 80 90
+sp|Q1X LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNR
+ ..: :. : . .:: . . .:. ..: : .:. ..:.: .::.
+sp|Q50 ETAAKVSQQSYQELILTEDEKRLLAKEGMTLPN-QFPLTKY----EERILKKIRRKIRNK
+ 170 180 190 200 210 220
+
+ 100 110 120 130 140 150
+sp|Q1X AAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR
+ .:: ::..:. .. ::.. .:. : ... :.: : : .:: .: : : ..
+sp|Q50 QSAQESRKKKKEYIDGLESRMAACSAHNHELQRKVFQLEKCNISLMEQLRRLQALVMNG-
+ 230 240 250 260 270 280
+
+ 160 170 180 190 200 210
+sp|Q1X ANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLS---DYSPTLKPSTLAESSD
+ .: :. .. . :. ::. :: . :: ..: :.::
+sp|Q50 SNKPVQAGTCVLVLLLSFTLIL-----LPNLK-PFTDTKVSQHGDFSPMRVQSRSLHNLQ
+ 290 300 310 320 330
+
+ 220 230 240 250 260 270
+sp|Q1X VAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSS
+
+sp|Q50 SSRVLRNLDHPYSMTENAKILPRFPEDKTMEEIASLLGRLHRRPQFTEYDPESHNHSFDQ
+ 340 350 360 370 380 390
+
+>>sp|A2R346|KAPC_ASPNC Putative transcription factor kap (283 aa)
+ s-w opt: 151 Z-score: 143.7 bits: 34.7 E(516081): 1.8
+Smith-Waterman score: 151; 22.5% identity (52.1% similar) in 213 aa overlap (16-223:44-236)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL---TVSPAD-TSLNSADVK
+ : :... : . :.:: : .... :
+sp|A2R QTSAQDHADQVLHDQLLAAHQHLSHPQQARPQGPTAQPPHMQPNTTSPRDQNNIDPAISG
+ 20 30 40 50 60 70
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ . .. . : . . . ::: : :: .. .:. .:::: .. :
+sp|A2R AAMLSGPPQTPPQPEPT-GQESP------------KTYGKRPLSTSKRAAQNRAAQRAFR
+ 80 90 100 110 120
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-MP
+ .::. ..:::.. .... :. ..:..::: .: . . .: ... :....: .:
+sp|A2R QRKESYIRKLEEQVKEFDNTNE----TMKQLQAENYQLREYIINLQSRLLDSQGEVPELP
+ 130 140 150 160 170
+
+ 170 180 190 200 210 220
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSV
+ :. .: .. : : : :. . . . : . :. . ..:
+sp|A2R GNIDLNQPRNDISV---PPPGAPAATGPAPGPGGAPQQMQVPNPGAATNEDMNSLNRIAV
+ 180 190 200 210 220 230
+
+ 230 240 250 260 270 280
+sp|Q1X AGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFD
+ :::
+sp|A2R AGLGMRKHPNEEANFLGNNFQARRPRNDDGQPDGSEATKTEPGHGLPVVS
+ 240 250 260 270 280
+
+>>sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS=Maca (323 aa)
+ s-w opt: 152 Z-score: 143.6 bits: 34.9 E(516081): 1.8
+Smith-Waterman score: 152; 28.6% identity (57.1% similar) in 154 aa overlap (14-163:174-319)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ : :.::...:. .:. . :: .
+sp|Q2P AYPGAGVAHDELGPHAHPHHHHHHQASPPPSSAASPAQQLPTSHPGPGPHATASATAAGG
+ 150 160 170 180 190 200
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTS
+ . . :. : : : . . .: . :. :.:: .:.: :.:.::. ::.
+sp|Q2P NGSVED------RFSDDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSC
+ 210 220 230 240 250
+
+ 110 120 130 140 150
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPM
+ : .. . ..::::: :. :: . : :..:.. : . . . .:: : . ...
+sp|Q2P RYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAHKVKCEKLANSGFREAGSTSDS
+ 260 270 280 290 300 310
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::
+sp|Q2P PSSPEFFL
+ 320
+
+>>sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcriptio (413 aa)
+ s-w opt: 154 Z-score: 143.4 bits: 35.2 E(516081): 1.8
+Smith-Waterman score: 154; 27.5% identity (67.5% similar) in 120 aa overlap (26-143:277-392)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV--KPEEKKPA
+ ..:. :.: ... ..: . .:. .::
+sp|Q8R PSGHPMPSEAKMRLKATLTHQVSSINGGCGMVVGTASTMVTARPEQNQILIQHPDAPSPA
+ 250 260 270 280 290 300
+
+ 60 70 80 90 100 110
+sp|Q1X KKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLEN
+ . . : .: :.:.:. :.: .... ..:: . . ::::::. :....: . .::.
+sp|Q8R QPQVSPAQ--PTPSTG--GRRRRTVDEDPDERRQRFLERNRAAASRCRQKRKLWVSSLEK
+ 310 320 330 340 350 360
+
+ 120 130 140 150 160 170
+sp|Q1X EKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPT
+ . .. .:: : .... .. : .:.: :
+sp|Q8R KAEELTSQNIQLSNEVTLLRNEVAQLKQLLLAHKDCPVTALQKKTQGYLGK
+ 370 380 390 400 410
+
+>>sp|P48755|FOSL1_MOUSE Fos-related antigen 1 OS=Mus mus (273 aa)
+ s-w opt: 150 Z-score: 143.0 bits: 34.6 E(516081): 1.9
+Smith-Waterman score: 150; 26.9% identity (53.4% similar) in 208 aa overlap (44-232:72-265)
+
+ 20 30 40 50 60 70
+sp|Q1X SLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR
+ . .: . .:. : . : : : . :
+sp|P48 SIDSSSQELHWMVQPHFLGPTGYPRPLAYPQYSPPQPRPGVIR-ALG---PPPGVRRRPC
+ 50 60 70 80 90
+
+ 80 90 100 110 120
+sp|Q1X KRAKTEDEKEQRRIERVLRNRAAAQTSRERKR-------LEMEKLENEKIQMEQQNQFLL
+ .. . :.: :.::..: ::. :: :.:.. : .:::.:: .... . :
+sp|P48 EQISPEEE-ERRRVRRE-RNKLAAAKCRNRRKELTDFLQAETDKLEDEKSGLQREIEELQ
+ 100 110 120 130 140 150
+
+ 130 140 150 160 170
+sp|Q1X QRLSQMEA--ENNRLSQQLAQLAAEVRGSRANT------PMPGSPATASPTLTP-TLFKQ
+ .. ..: : .: .. . . :. ..: : :: :. .:.: ...
+sp|P48 KQKERLELVLEAHRPICKIPEGDKKDPGGSGSTSGASSPPAPGRPVPCI-SLSPGPVLEP
+ 160 170 180 190 200 210
+
+ 180 190 200 210 220 230
+sp|Q1X ERDELPLERIPFPTPSLSDYSPTL---KPSTLAESSDVAQHPAVSVAGLEGDGSALPLFD
+ : . : . ::::. ..:.: ::: : . :.. . : .: : :. ::
+sp|P48 EALHTPTL---MTTPSLTPFTPSLVFTYPST-PEPCSSAHRKSSSSSG---DPSSDPLGS
+ 220 230 240 250 260
+
+ 240 250 260 270 280 290
+sp|Q1X LGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDS
+
+sp|P48 PTLLAL
+ 270
+
+>>sp|Q9UQ88|CD11A_HUMAN Cell division protein kinase 11A (780 aa)
+ s-w opt: 159 Z-score: 143.0 bits: 36.1 E(516081): 1.9
+Smith-Waterman score: 159; 28.9% identity (56.1% similar) in 173 aa overlap (42-208:92-255)
+
+ 20 30 40 50 60 70
+sp|Q1X VDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLP
+ ... : ...: :....: .. : . .
+sp|Q9U IRNSPYRREDSMEDRGEEDDSLAIKPPQQMSRKEKVHHRKDEKRKEKW-KHARVKEREHE
+ 70 80 90 100 110 120
+
+ 80 90 100 110 120
+sp|Q1X PRKRAKTEDEKEQRRIERVLRNRAAAQTSR-ERKRLEM--EKLENEKIQMEQQNQFLLQR
+ ::: . :..: .:. :: : . : . :: :: :::. .: : :. . :::.. :.
+sp|Q9U RRKRHREEQDKARREWERQKRREMAREHSRRERDRLEQLERKRERERKMREQQKEQREQK
+ 130 140 150 160 170 180
+
+ 130 140 150 160 170 180
+sp|Q1X LSQMEAENNRLSQQLA-QLAAEVRGSRAN--TPMPGSPATASPTLTPTLFKQERDELPLE
+ . .::. : .. ...:. : : . . .: . :: : .:: ::
+sp|Q9U ERERRAEERRKEREARREVSAHHRTMREDYSDKVKASHWSRSPPRPP----RERFELGDG
+ 190 200 210 220 230
+
+ 190 200 210 220 230 240
+sp|Q1X RIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTD
+ : :. . .:. ::. : :
+sp|Q9U R----KPGEARPAPAQKPAQLKEEKMEERDLLSDLQDISDSERKTSSAESSSAESGSGSE
+ 240 250 260 270 280 290
+
+>>sp|Q16520|BATF_HUMAN Basic leucine zipper transcriptio (125 aa)
+ s-w opt: 143 Z-score: 142.8 bits: 33.4 E(516081): 2
+Smith-Waterman score: 143; 28.6% identity (56.2% similar) in 112 aa overlap (71-172:17-125)
+
+ 50 60 70 80 90 100
+sp|Q1X KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS
+ :: :. ...: ::..: .:: ::: :
+sp|Q16 MPHSSDSSDSSFSRSPPPGKQDSSDDV---RRVQRREKNRIAAQKS
+ 10 20 30 40
+
+ 110 120 130 140 150 160
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP
+ :.:. . . :. :. ..:.:: : ....:. : . ... : . :.:: :
+sp|Q16 RQRQTQKADTLHLESEDLEKQNAALRKEIKQLTEELKYFTSVLNSHEPLCSVLAASTPSP
+ 50 60 70 80 90 100
+
+ 170 180 190 200 210
+sp|Q1X G----------SPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+ .: ..:: . :
+sp|Q16 PEVVYSAHAFHQPHVSSPRFQP
+ 110 120
+
+>>sp|Q0CEI3|KAPC_ASPTN Putative transcription factor kap (286 aa)
+ s-w opt: 150 Z-score: 142.7 bits: 34.6 E(516081): 2
+Smith-Waterman score: 150; 23.4% identity (53.7% similar) in 214 aa overlap (14-223:37-240)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ : : : ..: ...: . :.:. . :
+sp|Q0C PAPHPSMQTSAQDHADQVLHDQLLAAHQHLSHPQQPRPQAP--ATQPPHMQPNTASPRDQ
+ 10 20 30 40 50 60
+
+ 50 60 70 80 90 100
+sp|Q1X E-VKPEEKKPAKKRKSWGQELPVPKTNLP-PRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ . . : . : : .: : :.. :: .. .:. .:::: .. :
+sp|Q0C NNIDPAISGSAI----LGAPPQTPPQPEPAPQESPKTYGKRPLSTSKRAAQNRAAQRAFR
+ 70 80 90 100 110 120
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-MP
+ .::. ..:::. :...: . . .. . ..::: .: . . .: ... :....: .:
+sp|Q0C QRKESYIRKLEE---QVKHQ-EAITEEYKALHAENYQLREYIINLQTRLLDSQGEVPELP
+ 130 140 150 160 170
+
+ 170 180 190 200 210
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERI-PFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :. .: :: : .. : :. . : . . .. ..:. . ..
+sp|Q0C GNIDLNQPRADLTLSAPELQRGNAASAGPAPAGPGPQQSQPNQNQGVGPNDDMNSLNRIA
+ 180 190 200 210 220 230
+
+ 220 230 240 250 260 270
+sp|Q1X VAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAF
+ ::::
+sp|Q0C VAGLGMRKHPNEDANYLGNNFQARRPRTDDNQTGATETTKQEPDGLPVVS
+ 240 250 260 270 280
+
+>>sp|P54842|MAFB_RAT Transcription factor MafB OS=Rattus (323 aa)
+ s-w opt: 151 Z-score: 142.6 bits: 34.7 E(516081): 2
+Smith-Waterman score: 151; 27.9% identity (57.8% similar) in 154 aa overlap (14-163:174-319)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ : :.::...:. .:. . .: . .
+sp|P54 GYPGAGVTHDELGPHAHPHHHHHHQASPPPSSAASPAQQLPTSHPGPGPHAAAAATAAGS
+ 150 160 170 180 190 200
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTS
+ . . :. : : : . . .: . :. :.:: .:.: :.:.::. ::.
+sp|P54 NGSVED------RFSDDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSC
+ 210 220 230 240 250
+
+ 110 120 130 140 150
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPM
+ : .. . ..::::: :. :: . : :..:.. : . . . .:: : . ...
+sp|P54 RYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAYKVKCEKLANSGFREAGSTSDS
+ 260 270 280 290 300 310
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::
+sp|P54 PSSPEFFL
+ 320
+
+>>sp|P29747|CREBA_DROME Cyclic AMP response element-bind (516 aa)
+ s-w opt: 155 Z-score: 142.6 bits: 35.4 E(516081): 2
+Smith-Waterman score: 155; 30.4% identity (55.4% similar) in 148 aa overlap (8-150:370-508)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVS--PADTSL
+ : :: : :. .: ..:.. : : :
+sp|P29 LSPNATVSISVANPAGGESSVRVSRTAASITRSSSGSASASGSSTSSTVTTTRQPIHTPL
+ 340 350 360 370 380 390
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQE---VKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ :.. : . . ::.: : .. :.:. .:: : .:: ..:.: ..
+sp|P29 ISSQPKGSTGTLLLTEEEK----RTLLAEGYPIPQ-KLPLTK----AEEKSLKKIRRKIK
+ 400 410 420 430 440 450
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ :. .:: ::..:. :..:: . . .:. .:: .: : : .:: .: : :
+sp|P29 NKISAQESRRKKKEYMDQLERRVEILVTENHDYKKRLEGLEETNANLLSQLHKLQALVSK
+ 460 470 480 490 500 510
+
+ 160 170 180 190 200 210
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+
+sp|P29 HNVKKS
+
+
+>>sp|P47930|FOSL2_MOUSE Fos-related antigen 2 OS=Mus mus (326 aa)
+ s-w opt: 151 Z-score: 142.6 bits: 34.7 E(516081): 2
+Smith-Waterman score: 151; 24.0% identity (56.3% similar) in 229 aa overlap (4-216:39-260)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSS-VDSLPATPASEVPVLTVSPAD
+ :: . :. . .. : .:. :.:
+sp|P47 FDTSSRGSSGSPAHAESYSSGGGGQQKFRVDMPGSGSAFIPTINAITTSQDLQWMVQP--
+ 10 20 30 40 50 60
+
+ 40 50 60 70 80
+sp|Q1X TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK------TNLPPRKRAK--TEDEKEQ
+ : ..: . . .: :. . :: : :.. :.: . . .:.:.
+sp|P47 TVITSMSNPYPRSHPYSPLPGLASVPGHMALPRPGVIKTIGTTVGRRRRDEQLSPEEEEK
+ 70 80 90 100 110 120
+
+ 90 100 110 120 130 140
+sp|Q1X RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLS-QQL
+ :::.: ::. :: :.:.: :::. : ..:.... : ....... :...: ...
+sp|P47 RRIRRE-RNKLAAAKCRNRRRELTEKLQAETEELEEEKSGLQKEIAELQKEKEKLEFMKV
+ 130 140 150 160 170 180
+
+ 150 160 170 180 190
+sp|Q1X A-----QLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYS
+ : ... : : : .. . . .:.: .. :.. ::: : : : . ... .
+sp|P47 AHGPVCKISPEERRSPPTSGLQSLRGTGS-AVGPVVVKQEP---PEEDSPSSSAGMDKTQ
+ 190 200 210 220 230 240
+
+ 200 210 220 230 240 250
+sp|Q1X PT-LKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFN
+ . .:: ..: .. ...:
+sp|P47 RSVIKPISIAGGGFYGEEPLHTPIVVTSTPAITPGTSNLVFTYPNVLEQESPSSPSESCS
+ 250 260 270 280 290 300
+
+>>sp|Q63ZM7|STABP_XENLA STAM-binding protein-like OS=Xen (416 aa)
+ s-w opt: 153 Z-score: 142.4 bits: 35.1 E(516081): 2.1
+Smith-Waterman score: 153; 29.8% identity (53.0% similar) in 181 aa overlap (39-210:79-238)
+
+ 10 20 30 40 50 60
+sp|Q1X MSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKT
+ : :: .: ::.:. :: : :. ::.
+sp|Q63 VYSGEGSIENAFILYNKYITLFIEKLPKHRDYKTANV-PEKKETLKKLK----EIAFPKA
+ 50 60 70 80 90 100
+
+ 70 80 90 100 110 120
+sp|Q1X N-----LPPRKRAKTEDEKEQRRIERVLRNRAAA---QTSRERKRLEMEKLENEKIQMEQ
+ . : : . . :. .:..: :. : : : : . :..:. . : ..: :.::
+sp|Q63 EELKKELHKRYKKEYEEYSEKQRKEEEERARRLALQQQLDAEKQRVALLKQQQE--QQEQ
+ 110 120 130 140 150 160
+
+ 130 140 150 160 170
+sp|Q1X QNQFL-LQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQER
+ . : ..: ...::: :. .:... :.. ..:. :. : .:: :
+sp|Q63 VQAFEEMMRRKELEAERLRILHQFSKDEPEAEP--LGSPL--IPGMNEPPVTPLL-----
+ 170 180 190 200 210
+
+ 180 190 200 210 220 230
+sp|Q1X DELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDL
+ : : : : : ::::. . .:
+sp|Q63 ---PSYGTVQPHPPAVDRS--LKPSSYGSNSSGVTSDGLRHVKIPRDVCCKFLQLSENNT
+ 220 230 240 250 260
+
+ 240 250 260 270 280 290
+sp|Q1X KHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFD
+
+sp|Q63 QRGVETCGILCGKLLQNEFTVTHVIVPKQSGGPDYCNTESEEELFLIQDQQGLITLGWIH
+ 270 280 290 300 310 320
+
+>>sp|Q91496|FOS_TETFL Proto-oncogene c-Fos OS=Tetraodon (374 aa)
+ s-w opt: 152 Z-score: 142.4 bits: 34.9 E(516081): 2.1
+Smith-Waterman score: 152; 24.1% identity (56.4% similar) in 241 aa overlap (15-248:47-278)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLN-SADVKTQ
+ : :. :: ::..:. .. .:. .. ..
+sp|Q91 SASPSDNVYYPSPAGSYSSMGSPQSQDLTDLTASSASFVPTVTAISTSPDLQWMVQPLVS
+ 20 30 40 50 60 70
+
+ 50 60 70 80 90
+sp|Q1X EVKPEEK-KPAKKRKSWGQELPVPKTNLPPRKRAKTE----DEKEQRRIERVLRNRAAAQ
+ : : .. .: . :. . . .. : ::...: .:.:..::.: ::. ::
+sp|Q91 SVAPSRRAHPYSPSPSYKRTVMRSGASKPHAKRGRVEQTTPEEEEKKRIRRE-RNKQAAA
+ 80 90 100 110 120 130
+
+ 100 110 120 130 140 150
+sp|Q1X TSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR-GSRANT
+ :.:.: ..:. : :.: ... : . .... :..:: :: . :. ..
+sp|Q91 KCRNRRRELTDSLQAETDQLEAEKSSLQNDIANLLKEKERLEFILAAHQPICKIPSQMDS
+ 140 150 160 170 180 190
+
+ 160 170 180 190 200 210
+sp|Q1X PMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPA
+ .: .. :: . . .. . : .: : :..: . :. .:. .
+sp|Q91 DFP--VVSMSP--VHAYLSTAASTQPQTSVPEATTVTSSHSTFTSTSNSIFGSN--SDSL
+ 200 210 220 230 240
+
+ 220 230 240 250 260 270
+sp|Q1X VSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGL
+ .:.: . . :.. . :: :.. ..: : .:
+sp|Q91 LSTATV--SDSVVKMTDLESSVLEESLDLLAKTEVETVEVPDVNLSSSLYTAQDWEPLHA
+ 250 260 270 280 290 300
+
+ 280 290 300 310 320 330
+sp|Q1X AFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCD
+
+sp|Q91 TIGSSDFEPLCTPVVTCTPACTTITSSFVFTFPEAETFPTCCVAHRRGSNSNDQSSDSLS
+ 310 320 330 340 350 360
+
+>>sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mus mu (267 aa)
+ s-w opt: 149 Z-score: 142.3 bits: 34.4 E(516081): 2.1
+Smith-Waterman score: 149; 27.0% identity (57.7% similar) in 163 aa overlap (51-190:23-183)
+
+ 30 40 50 60 70
+sp|Q1X SEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK------TNLPP-R
+ .::. .. .: :. .. : :
+sp|O35 MVVVAAAPSAATAAPKVLLLSGQPASGGRALPLMVPGPRAAGSEASGTPQAR
+ 10 20 30 40 50
+
+ 80 90 100 110 120
+sp|Q1X KRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQN-------QFL
+ :: . :. :.. ..: :.::.::::.:.::. .: .::.. ...:..: :.:
+sp|O35 KRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENHKLQLENQLL
+ 60 70 80 90 100 110
+
+ 130 140 150 160 170
+sp|Q1X LQRLSQMEAENNRLSQQLAQLA--------AEVRGSRANTPMPGSPATASPTLTPTLFKQ
+ .. . .::..: .:.. . .:..:: . . :: .:. : : .:
+sp|O35 REKTHGLVVENQELRTRLGMDTLDPDEVPEVEAKGSGVRL-VAGSAESAALRLCAPL-QQ
+ 120 130 140 150 160 170
+
+ 180 190 200 210 220 230
+sp|Q1X ERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGS
+ . .: . ::
+sp|O35 VQAQLSPPQNIFPWTLTLLPLQILSLISFWAFWTSWTLSCFSNVLPQSLLVWRNSQRSTQ
+ 180 190 200 210 220 230
+
+>>sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcription (347 aa)
+ s-w opt: 151 Z-score: 142.0 bits: 34.7 E(516081): 2.2
+Smith-Waterman score: 151; 30.9% identity (62.9% similar) in 97 aa overlap (66-160:255-347)
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP--RKRAKTEDEKEQRRIERVLRN
+ :: :: ::.. :: ....... .:
+sp|Q9E SYLGSPQHSPSTSRAPPDSLPSPGVPRGSRPKPYDPPGVSVTAKVKTEKLDKKLKKMEQN
+ 230 240 250 260 270 280
+
+ 100 110 120 130 140 150
+sp|Q1X RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS
+ ..:: :..:: :.: : .: ..:..:. : .. ... : : : .: ::: .
+sp|Q9E KTAATRYRQKKRAEQEALTGECKELEKKNEALKEKADSLAKEI----QYLKDLIEEVRKA
+ 290 300 310 320 330 340
+
+ 160 170 180 190 200 210
+sp|Q1X RANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVA
+ :.. .:
+sp|Q9E RGKKRVP
+
+
+>>sp|O02756|CEBPD_BOVIN CCAAT/enhancer-binding protein d (256 aa)
+ s-w opt: 148 Z-score: 141.7 bits: 34.2 E(516081): 2.3
+Smith-Waterman score: 148; 26.7% identity (54.1% similar) in 146 aa overlap (19-163:119-245)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPE
+ :.: .:. ... :.: .. : . .: . :
+sp|O02 LLPGGPARLGGPGPAPRPLKREPDWGDGDAPGSLLPAQVAACAQTVVSLA-AAAQPTPPA
+ 90 100 110 120 130 140
+
+ 50 60 70 80 90 100
+sp|Q1X EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEM
+ .: :.: . : : . ::. . : : .: :: :.. ::.. .
+sp|O02 SPEP--PRRSPAPPAPGPARDKAAGKRGPDRGSPEYR--QRRERNNIAVRKSRDKAK---
+ 150 160 170 180 190 200
+
+ 110 120 130 140 150 160
+sp|Q1X EKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG-SRANTPMPGSPATAS
+ ..:: . :.: .. :::..:.:.. ::. .. : : .::.:
+sp|O02 -----------RRNQEMQQKLVELSAENEKLQQRVEQLTRDLAGLRRFFKQLPGAPFLPG
+ 210 220 230 240
+
+ 170 180 190 200 210 220
+sp|Q1X PTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDG
+
+sp|O02 AGAADAR
+ 250
+
+>>sp|P54841|MAFB_MOUSE Transcription factor MafB OS=Mus (323 aa)
+ s-w opt: 150 Z-score: 141.7 bits: 34.6 E(516081): 2.3
+Smith-Waterman score: 150; 27.9% identity (57.1% similar) in 154 aa overlap (14-163:174-319)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ : :.::...:. .:. . .: .
+sp|P54 GYPGAGVTHDDLGQHAHPHHHHHHQASPPPSSAASPAQQLPTSHPGPGPHATAAATAAGG
+ 150 160 170 180 190 200
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTS
+ . . :. : : : . . .: . :. :.:: .:.: :.:.::. ::.
+sp|P54 NGSVED------RFSDDQLVSMSVRELNRHLRGFTKDEVIRLKQKR--RTLKNRGYAQSC
+ 210 220 230 240 250
+
+ 110 120 130 140 150
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPM
+ : .. . ..::::: :. :: . : :..:.. : . . . .:: : . ...
+sp|P54 RYKRVQQKHHLENEKTQLIQQVEQLKQEVSRLARERDAYKVKCEKLANSGFREAGSTSDS
+ 260 270 280 290 300 310
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::
+sp|P54 PSSPEFFL
+ 320
+
+>>sp|A1C9M5|KAPC_ASPCL Putative transcription factor kap (288 aa)
+ s-w opt: 149 Z-score: 141.7 bits: 34.4 E(516081): 2.3
+Smith-Waterman score: 149; 20.8% identity (56.0% similar) in 159 aa overlap (66-223:83-237)
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRA
+ :. .: .. :: .. .:. .:::
+sp|A1C HMQPTTPVARDQNNIDPAISGGAMLAGPQTPQPDLSGQESPKTYGKRPLSTSKRAAQNRA
+ 60 70 80 90 100 110
+
+ 100 110 120 130 140 150
+sp|Q1X AAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA
+ : .. :.::. ... ::. :.. . . . .. ..::: .: . . .: ... ...
+sp|A1C AQRAFRQRKEAHIRDLEG-KVKAYET---MGEAIKALQAENYQLREYIINLQSRLLDTQG
+ 120 130 140 150 160
+
+ 160 170 180 190 200 210
+sp|Q1X NTP-MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQ
+ ..: .::. ..: . . .: : :. . . .. : ..:. .
+sp|A1C EVPELPGNIDLSQPRGDIPVPAPPTSGTSTSAVPVPPPTAPQQPQPAQNQASAPNDDMNS
+ 170 180 190 200 210 220
+
+ 220 230 240 250 260 270
+sp|Q1X HPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFE
+ ..::::
+sp|A1C LNRIAVAGLGMRKPPTEEANYLGNSFQQQARRVRPDDGQPDASELTLPKQEPTHGLPLIS
+ 230 240 250 260 270 280
+
+>>sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive element-bi (368 aa)
+ s-w opt: 151 Z-score: 141.6 bits: 34.7 E(516081): 2.3
+Smith-Waterman score: 151; 25.9% identity (54.7% similar) in 212 aa overlap (20-221:105-301)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEE
+ :. .:. . ::: .. . ::
+sp|Q8S PCLVQHDHTYSLSQEHVSIDLDNESYEKERAQMTPLRVEEPAD-----QEIARLILTEEE
+ 80 90 100 110 120
+
+ 50 60 70 80 90 100
+sp|Q1X KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ :. .:. : :: :: : .:. .:..: .::. .:: ::..:.. .
+sp|Q8S KRLLEKE---GLTLP---GMLPLTKM----EEQVLKRVRRKIRNKKSAQESRRKKKVYVG
+ 130 140 150 160 170
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV-----RGSRANTPMPGSPA
+ ::.. ... :: : .... .: .: : .:: .: : : ..: ..: .
+sp|Q8S GLESRVLKYTAQNLELQNKVQLLEEQNLSLLDQLRRLQAMVIQTANKASSSSTCVLVLLF
+ 180 190 200 210 220 230
+
+ 170 180 190 200 210
+sp|Q1X TASPTLTPTLFKQE-RDELPLER--IPFPTPSL-SDYSPTLKPSTL-AESSDVAQHPAVS
+ . :.:...... : :: :. . .: :. : :.: .: .: . .: ..
+sp|Q8S SFCLLLVPAMYSSDTRGSLPAEHRVLSRQLRALPSEDPPQLEPPALQSEVPKDSLNPELQ
+ 240 250 260 270 280 290
+
+ 220 230 240 250 260 270
+sp|Q1X VAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAF
+ .:
+sp|Q8S AASNSCCLFHLMPQAPRAEPPLQLPLPDGFSGCSCPDSISPLHANLTREEGWLPTPSPTS
+ 300 310 320 330 340 350
+
+>>sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos taurus (380 aa)
+ s-w opt: 151 Z-score: 141.3 bits: 34.7 E(516081): 2.4
+Smith-Waterman score: 151; 24.0% identity (50.0% similar) in 246 aa overlap (2-237:57-297)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|O77 LSYYHSPADSFSSMGSPVNAQDYCTDLAVSSANFIPTVTAISTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . : : . . . : . :. . . . . . . .:.:.:::.
+sp|O77 PSQTRAPHPYGVPTPSAGAYSRAGVMKTMTGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|O77 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: ..:: :. : : .: ::: : : ::. . . .
+sp|O77 ACKIPD-DLGFPEEMSVASLDLSGGLPEAATPESEEAFTLPLLNDPEPKPSVEPVKSVGS
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250 260
+sp|Q1X PSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNRLFH
+ :: : . :: : . . ..: .:: ::
+sp|O77 MELKAEPFDDYMFPASSRPSGSETARSVPDMDLSGSFYAADWEPLHGGSLGMGPMATELE
+ 270 280 290 300 310 320
+
+ 270 280 290 300 310 320
+sp|Q1X GDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCK
+
+sp|O77 PLCTPVVTCTPSCTTYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTLLAL
+ 330 340 350 360 370 380
+
+>>sp|Q6NS15|MED15_XENLA Mediator of RNA polymerase II tr (777 aa)
+ s-w opt: 157 Z-score: 141.1 bits: 35.7 E(516081): 2.4
+Smith-Waterman score: 157; 20.1% identity (53.1% similar) in 273 aa overlap (30-297:282-540)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSW
+ : . .. ... :.: ... . .
+sp|Q6N QRIAHLQQMQQMQQQQQQQQQQQQQQQQQPPPQQVMQLQQMQQQQVAQSQQQQLLSTQPQ
+ 260 270 280 290 300 310
+
+ 60 70 80 90 100 110
+sp|Q1X GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERK-RLEMEKLENEKIQM
+ . : : . ..: . : ..:.... . . :: : . ... . . .. ... :.
+sp|Q6N APSL-VAQGQIPSQVMPVTLTPQQQQQLKILQQVRAQQQQQAQHQAQQQAQQQAHQQAQQ
+ 320 330 340 350 360 370
+
+ 120 130 140 150 160 170
+sp|Q1X EQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT-PTLFKQ
+ . :.: : .:. . . .:: :: ::. ....:. .. :... :. .:
+sp|Q6N QAQQQAQQQAAQQQAQQAAQQAQQQAQQAAQQQAAQAHLAAGQVTQNSIPVMSSPSPVQQ
+ 380 390 400 410 420 430
+
+ 180 190 200 210 220 230
+sp|Q1X ERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGS
+ . :. : :.:. :. : .:. :.:.. :: : ... . : : :
+sp|Q6N VQTPQPMPPPPQPSPQPSQ--PMSQPN-----SNVSSGPAPSPSSFMPSPSPQP---SQS
+ 440 450 460 470 480
+
+ 240 250 260 270 280 290
+sp|Q1X DLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV-FEDGLAFDVLEGGDLSAF--PFDS
+ . .. .. ..: : .: . .: . : :. :. .: :. .:: . :.
+sp|Q6N PASARTPQNFSVP-SPGPLNTPGNPNSVMSPASNNQSEEQQYLDKLK--QLSKYIEPLRR
+ 490 500 510 520 530
+
+ 300 310 320 330 340
+sp|Q1X MVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ :.:
+sp|Q6N MINKIDKNEERKKDLSKMKSLLDILTDPNKRCPLKTLQKCEIALEKLKNDMAVPTPPPPT
+ 540 550 560 570 580 590
+
+>>sp|P94517|YSCB_BACSU Uncharacterized protein yscB OS=B (221 aa)
+ s-w opt: 146 Z-score: 141.0 bits: 33.9 E(516081): 2.5
+Smith-Waterman score: 146; 26.5% identity (56.9% similar) in 181 aa overlap (7-183:28-188)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVP--VLTVSPADTSLN-
+ :. ..: . : : .:. . ..:.. ...
+sp|P94 MNKLIQLALFFTLMLTGCSNSSTSSESKVETTVKTTAAFPQKELEKELKKLKPVSLDMKF
+ 10 20 30 40 50 60
+
+ 40 50 60 70 80 90
+sp|Q1X SADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAA
+ . . :. : . :. :.:... . : . : :: : ..:: .:. : :
+sp|P94 ESPLATELGKRKAKEEAEKQRQIAAEKKLEKER--EAKRKKQQEEKAERQ-------RLA
+ 70 80 90 100 110
+
+ 100 110 120 130 140 150
+sp|Q1X AQTSRERKRL-EMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA
+ : . ::.:: : :. . ..:.: : .:. .. .::..: :: : .:. .: .
+sp|P94 EQQAAERQRLAEAER----QAELERQRQAAIQKEQKANAEKKRQSQAQRQ-QTEAPSSNS
+ 120 130 140 150 160
+
+ 160 170 180 190 200 210
+sp|Q1X NTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQH
+ . : :.: . .. :. .: .:::
+sp|P94 QDP-PSSSSQTDKTI-----QQPASELPDDDGYGYEERKKWHDDQVEWGIKQGYIDPEDA
+ 170 180 190 200 210 220
+
+>>sp|Q504L8|MAFB_XENTR Transcription factor MafB OS=Xeno (316 aa)
+ s-w opt: 149 Z-score: 140.9 bits: 34.4 E(516081): 2.5
+Smith-Waterman score: 149; 26.6% identity (62.6% similar) in 139 aa overlap (29-163:176-312)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS
+ ::. .: .: ...... . .... .. : :
+sp|Q50 QYQGLPHEEMGLPHQHPHHHHHHHHHQPSPSPSGSSSSSQQLQNSHQQHQNSSAVEDRFS
+ 150 160 170 180 190 200
+
+ 60 70 80 90 100 110
+sp|Q1X WGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ : . . .: . :. :.:. .:.: :.:.::. ::. : .. . ..:::::
+sp|Q50 DDQLVSMSVRELNRHLRGFTKDDVIRLKQKR--RTLKNRGYAQSCRFKRVQQKHHLENEK
+ 210 220 230 240 250 260
+
+ 120 130 140 150 160 170
+sp|Q1X IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV-RGSRANTPMPGSPATASPTLTPTL
+ :. :: . : ..:.. : . . . .:: . : . ... :.::
+sp|Q50 TQLIQQVEQLKLEVSRLARERDAYKIKCEKLANTTFREAGSTSDNPSSPEFFM
+ 270 280 290 300 310
+
+ 180 190 200 210 220 230
+sp|Q1X FKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFD
+
+>>sp|O57342|MAFA_COTJA Transcription factor MafA OS=Cotu (286 aa)
+ s-w opt: 148 Z-score: 140.8 bits: 34.2 E(516081): 2.5
+Smith-Waterman score: 148; 34.1% identity (67.1% similar) in 85 aa overlap (83-167:201-281)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .:.: :.:.::. ::. : .. . . ::
+sp|O57 RFSDDQLVSMSVRELNRQLRGFSKEEVIRLKQKR--RTLKNRGYAQSCRYKRVQQRHILE
+ 180 190 200 210 220
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ ::: :...: . : :..:.. : . ... .::: :: .: :..: :..
+sp|O57 NEKCQLQSQVEQLKQEVSRLAKERDLYKEKYEKLAA--RGFPRETSPPAAPKTTAADFFM
+ 230 240 250 260 270 280
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+>>sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus norve (380 aa)
+ s-w opt: 150 Z-score: 140.4 bits: 34.6 E(516081): 2.7
+Smith-Waterman score: 150; 27.6% identity (50.4% similar) in 250 aa overlap (8-237:54-297)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPA-SEVPVLT--VSPADTS
+ ..::.. .:.. : : : : :.: .
+sp|P12 GDSLSYYHSPADSFSSMGSPVNTQDFCADLSVSSANFIPTVTAISTSPDLQWLVQP---T
+ 30 40 50 60 70 80
+
+ 40 50 60 70 80
+sp|Q1X LNSADVKTQEVKPEEKK-PAKKRKSWGQELPVPKTNLPPR-----KRAKTE----DEKEQ
+ : :. . .: :. :. . .... : :: : .:.:.: .:.:.
+sp|P12 LVSSVAPSQTRAPHPYGLPTPSTGAYARA-GVVKTMSGGRAQSIGRRGKVEQLSPEEEEK
+ 90 100 110 120 130
+
+ 90 100 110 120 130 140
+sp|Q1X RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA
+ :::.: ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|P12 RRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILA
+ 140 150 160 170 180 190
+
+ 150 160 170 180 190
+sp|Q1X QLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYS
+ . . .: ...: :: : : .: ::: : : ::: .
+sp|P12 AHRPACKIPN-DLGFPEEMSVTSLDLTGGLPEATTPESEEAFTLPLLNDPEPKPSLEPVK
+ 200 210 220 230 240 250
+
+ 200 210 220 230 240 250
+sp|Q1X PTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFN
+ . :: : :: : . . ..: :: ::
+sp|P12 NISNMELKAEPFDDFLFPASSRPSGSETARSVPDVDLSGSFYAADWEPLHSSSLGMGPMV
+ 260 270 280 290 300 310
+
+ 260 270 280 290 300 310
+sp|Q1X RLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDE
+
+sp|P12 TELEPLCTPVVTCTPSCTTYTSSFVFTYPEADSFPSCAAAHRKGSSSNEPSSDSLSSPTL
+ 320 330 340 350 360 370
+
+>>sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis catu (381 aa)
+ s-w opt: 150 Z-score: 140.4 bits: 34.6 E(516081): 2.7
+Smith-Waterman score: 150; 26.9% identity (50.6% similar) in 249 aa overlap (9-237:55-298)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPA-SEVPVLT--VSPADTSL
+ .::.. .:.. : : : : :.: .:
+sp|Q8H DNLSYYHSPADSFSSMGSPVNAQDFCTDLAVSSANFIPTVTAISTSPDLQWLVQP---TL
+ 30 40 50 60 70 80
+
+ 40 50 60 70 80
+sp|Q1X NSADVKTQEVKPEEKK-PAKKRKSWGQELPVPKTNLPPR-----KRAKTE----DEKEQR
+ :. . .: :. :: . .... : .. : .:.:.: .:.:.:
+sp|Q8H VSSVAPSQTRAPHPYGVPAPSAGAYSRAGVVKTVTAGGRAQSIGRRGKVEQLSPEEEEKR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQ
+ ::.: ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|Q8H RIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAA
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190
+sp|Q1X LAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSP
+ . . .: ..:: :. : : .: ::: : : ::. .
+sp|Q8H HRPACKIPD-DLGFPEEMSVASLDLSGGLPEAATPESEEAFTLPLLNDPEPKPSVEPVKS
+ 210 220 230 240 250
+
+ 200 210 220 230 240 250
+sp|Q1X TLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GSDLKHHSTDDVAAPLSDDDFNR
+ . :: : :: : . . ..: .:: ::
+sp|Q8H ISSMELKAEPFDDFLFPASSRPSGSETARSVPDMDLSGSFYAADWEPLHGGSLGMGPMAT
+ 260 270 280 290 300 310
+
+ 260 270 280 290 300 310
+sp|Q1X LFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDET
+
+sp|Q8H ELEPLCTPVVTCTPSCTTYTSSFVFTYPEADSFPSCGAAHRKGSSSNEPSSDSLSSPTLL
+ 320 330 340 350 360 370
+
+>>sp|Q56TT7|FOS_PHOCM Proto-oncogene c-Fos OS=Phodopus c (381 aa)
+ s-w opt: 150 Z-score: 140.4 bits: 34.6 E(516081): 2.7
+Smith-Waterman score: 150; 23.5% identity (50.0% similar) in 306 aa overlap (2-291:57-353)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|Q56 LSYYHSPADSFSSMGSPVNAQDFCADLSVSSANFIPTVTAISTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . : : . . : : :. . . . . . . .:.:.:::.
+sp|Q56 PSQTRAPHPYGVPTPPTGAYSRAGMVKTVSGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : ..:.... : ..... :...: ::
+sp|Q56 RE-RNKMAAAKCRNRRRELTDTLQAETDHLEDEKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: . ..:: :: : : .: ::: : : :: . .
+sp|Q56 ACKIPD-DLGFPEDMSVASLDLTGGLPEATTPESEEAFSLPLLNDPEPKTSLEPVKSISN
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250
+sp|Q1X PSTLAESSDVAQHPAVSV-AGLEGDGSALPLFDL-GS----DLKH-HSTDDVAAPLSDDD
+ :: : :: : .: : . ..: .:: :: : . ::.. .:.. .
+sp|Q56 MELKAEPFDDFLFPASSRPSGSETTARSVPDMDLSGSFYAADWEPLHSSSLGMGPMATE-
+ 270 280 290 300 310 320
+
+ 260 270 280 290 300 310
+sp|Q1X FNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLP
+ .. : . :. ... ....: :. ..::
+sp|Q56 LEPLCTPVVTCTPSCTTYTSSFVFTYPEA---DSFPSCAAAHRKGSSSNEPSSDSLSSPT
+ 330 340 350 360 370
+
+ 320 330 340
+sp|Q1X DETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q56 LLAL
+ 380
+
+>>sp|Q2VZV0|IF2_MAGSA Translation initiation factor IF-2 (872 aa)
+ s-w opt: 157 Z-score: 140.2 bits: 35.7 E(516081): 2.7
+Smith-Waterman score: 157; 33.6% identity (62.6% similar) in 107 aa overlap (16-119:188-291)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV
+ :..::. :: ...:: . ..:.:
+sp|Q2V QSEPEAAAPAAEPVAPTAPVAAAPAPAPATPVAPAQPKPVAAAAPAGDATAVPRARTEEE
+ 160 170 180 190 200 210
+
+ 50 60 70 80 90 100
+sp|Q1X KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK---TEDEKEQRRIERVLRNRAAAQTSRE
+ . ::.. :::: . . :: .:. : :. .: :. .. : :: :. ::.. .::
+sp|Q2V EEEEER-AKKRAAAHKPAPVKRTE-PRRRTGKLTITDALTDDDRSERG-RSLAAVKRARE
+ 220 230 240 250 260 270
+
+ 110 120 130 140 150 160
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS
+ :.::. . .::. :
+sp|Q2V RERLKHMQKGSEKVIREVIVPESITVQELANRMAVRGADVIKCLMRLGVMATINQNIDAD
+ 280 290 300 310 320 330
+
+>>sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcriptio (348 aa)
+ s-w opt: 149 Z-score: 140.2 bits: 34.4 E(516081): 2.8
+Smith-Waterman score: 149; 27.7% identity (61.0% similar) in 141 aa overlap (19-154:210-342)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPE
+ :... . .:: :.::.: . . . .
+sp|Q3Z LCSEVVIPEGDSKPDSTTTGFPQCIKEEDAPSDNDSGICMSP-DSSLGSPQDSPSTSRG-
+ 180 190 200 210 220 230
+
+ 50 60 70 80 90 100
+sp|Q1X EKKPAKKRKSWG--QELPVPKTNLPPRKR---AKTEDEKEQRRIERVLRNRAAAQTSRER
+ .: :. : : . :: :: .. ::.. :: ....... .:..:: :..
+sp|Q3Z --SPNKSLLSPGALSGSSRPKPYDPPGEKMVAAKVKGEKLDKKLKKMEQNKTAATRYRQK
+ 240 250 260 270 280 290
+
+ 110 120 130 140 150 160
+sp|Q1X KRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSP
+ :: :.: : .: ..:..:. : .. ... : . :..:. ::: .:
+sp|Q3Z KRAEQEALTGECKELEKKNEALKEKADSLAKEIQYLKDQIE----EVRKAREKKRVL
+ 300 310 320 330 340
+
+ 170 180 190 200 210 220
+sp|Q1X ATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL
+
+>>sp|Q5HZY0|UBXN4_RAT UBX domain-containing protein 4 OS (506 aa)
+ s-w opt: 152 Z-score: 140.0 bits: 34.9 E(516081): 2.8
+Smith-Waterman score: 152; 24.4% identity (53.0% similar) in 279 aa overlap (73-337:200-459)
+
+ 50 60 70 80 90 100
+sp|Q1X QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE
+ : : :...:..: :.. :. . :
+sp|Q5H GECAGHDSLSQEPPGCSNQRPAEDLTVRVERLTKKLEERREEKRKEEAQRE---IKKEIE
+ 170 180 190 200 210 220
+
+ 110 120 130 140 150
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN----NRLSQQLAQLAAEVRGSRANTP
+ :.. : :. .. : :. .. .:.. :. .::. .:..::.: :: :..:
+sp|Q5H RRKTGKEMLDYKRKQEEELTKRMLEERSREKAEDRAARERIKQQIALDRAE-RAARFAKT
+ 230 240 250 260 270 280
+
+ 160 170 180 190 200 210
+sp|Q1X MPGSPATASPTLTPTL---FKQE---RDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+ . : :. :. :.: ::. . :: : :. :... . :: : ..
+sp|Q5H KEAEAAKAAALLAKQAEAEVKRESSTRDRSTIARIQFRLPDGSSFTNQF-PSD-APLEEA
+ 290 300 310 320 330 340
+
+ 220 230 240 250 260
+sp|Q1X AQHPAVSVAGLEGDGSALPLFD----LGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEP
+ : : .:.. :. : .: : :.. : :: .. . . .:. :
+sp|Q5H RQFAAQTVGNTYGNFSLATMFPRREFTREDYKRKLLDLELAPSASVVLLPAGRPATSIVP
+ 350 360 370 380 390 400
+
+ 270 280 290 300 310 320
+sp|Q1X DSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPG
+ .:: : . .: : : .:: .. . :. . ... : .:. ...:..:.
+sp|Q5H SSS----GDIWTLL-GTVL--YPFLAIWRLISNFL------FSNPPPAQTSARATSTEPS
+ 410 420 430 440 450
+
+ 330 340
+sp|Q1X FGASTTRCDGQGIAAGC
+ .::... .
+sp|Q5H NSASSSKSEKREPVRKRVLEKRGEDFKKEGKIYRLRTQDDGEDENNTWNGNSTQQM
+ 460 470 480 490 500
+
+>>sp|P0C865|MK07_RAT Mitogen-activated protein kinase 7 (806 aa)
+ s-w opt: 156 Z-score: 139.9 bits: 35.6 E(516081): 2.8
+Smith-Waterman score: 156; 26.3% identity (50.2% similar) in 259 aa overlap (3-236:429-680)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLP--ATPASEVPVLTVSP
+ : :: : .:: . :: .. ::..:
+sp|P0C IRFQPSLQPVASEPVCPDVEMPSPWAPSGDCAME---SPPPALPPCSGPAPDTVDLTLQP
+ 400 410 420 430 440 450
+
+ 40 50 60 70 80
+sp|Q1X ADTSLNSADVKTQEVKPEEKKPA------KKRKSWGQELPVPKTNLP-PRKRAKTEDEKE
+ : . . : : . . .. : : :. .: .. : . : ::: . ......
+sp|P0C APPASELAPPKREGAISDNTKAALKAALLKSLRSRLRDGPSAPLEAPEPRKPVTAQERQR
+ 460 470 480 490 500 510
+
+ 90 100 110 120 130 140
+sp|Q1X QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNR-LSQQ
+ .:. .: : : ::..: : :. : . . : : . ..:.: : ..
+sp|P0C EREEKR--RRRQERAKEREKRRQERERKERGAGTLGGPSTDPLAGL--VLSDNDRSLLER
+ 520 530 540 550 560 570
+
+ 150 160 170 180 190
+sp|Q1X LAQLAAEVRGSRANTPMPG-SPATASPTLTPTL-FKQERDEL-PLERIPFPT--PSLSDY
+ ...: . : .: : .:..:.:: :. .: : : :: :. :
+sp|P0C WTRMARPPVPAPAPAPAPTPKPSSAQPTSPPNGPVSQSTAPLQPAGSIPGPASQPVCPPP
+ 580 590 600 610 620 630
+
+ 200 210 220 230 240
+sp|Q1X SPTLKPS--------TLAESSDVAQHPAVSVAGLEGDGS--ALPLFDLGSDLKHHSTDDV
+ .:. .:. : .: .:.. : .:: :.:. .:: : :
+sp|P0C GPVPQPAGPVPAPLQTAPSTSLLASQSLVPPSGLPGSGAPEVLPYFPSGPPPPDPGLTPQ
+ 640 650 660 670 680 690
+
+ 250 260 270 280 290 300
+sp|Q1X AAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEG
+
+sp|P0C PSTSESPDVNLVTQQLSKSQVEDPLPPVFSGTPKGSGAGYGVGFDLEEFLNQSFDMGVAD
+ 700 710 720 730 740 750
+
+>>sp|Q9N0J3|CEBPD_SHEEP CCAAT/enhancer-binding protein d (255 aa)
+ s-w opt: 146 Z-score: 139.9 bits: 33.9 E(516081): 2.9
+Smith-Waterman score: 146; 26.7% identity (54.1% similar) in 146 aa overlap (19-163:118-244)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPE
+ :.: .:. ... :.: .. : . .: . :
+sp|Q9N LLPGGPARLGGPGPAPRPLKREPDWGDGDAPGSLLPAQVAACAQTVVSLAPA-AQPTPP-
+ 90 100 110 120 130 140
+
+ 50 60 70 80 90 100
+sp|Q1X EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEM
+ .: :.: . : : . ::. . : : .: :: :.. ::.. .
+sp|Q9N -ASPDPPRRSPAPPAPGPARDKAAGKRGPDRGSPEYR--QRRERNNIAVRKSRDKAK---
+ 150 160 170 180 190
+
+ 110 120 130 140 150 160
+sp|Q1X EKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG-SRANTPMPGSPATAS
+ ..:: . :.: .. :::..:.:.. ::. .. : : .::.:
+sp|Q9N -----------RRNQEMQQKLVELSAENEKLQQRVEQLTRDLAGLRRFFKQLPGAPFLPG
+ 200 210 220 230 240
+
+ 170 180 190 200 210 220
+sp|Q1X PTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDG
+
+sp|Q9N AGAADAR
+ 250
+
+>>sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-bind (367 aa)
+ s-w opt: 149 Z-score: 139.7 bits: 34.4 E(516081): 2.9
+Smith-Waterman score: 149; 33.3% identity (63.2% similar) in 87 aa overlap (60-146:170-252)
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIER
+ ::: . ..:: : .:. ..:.:
+sp|Q5U PRVSTIAPPPPAALLSCQRLFLTDEEKHLLGQEGVTLPSHLPLTK----AEERILKKIRR
+ 140 150 160 170 180 190
+
+ 90 100 110 120 130 140
+sp|Q1X VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE
+ .::. .:: ::.::. .. ::.. .::: : ......: .: : :. ::
+sp|Q5U KIRNKQSAQDSRRRKKEYIDGLESRVAACSEQNQKLQRKVQELERQNISLVAQVHQLQKF
+ 200 210 220 230 240 250
+
+ 150 160 170 180 190 200
+sp|Q1X VRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAES
+
+sp|Q5U TAQTSSRAAQTSTCVLILLFSLALIILPSFSPFQSQPEARSEGYQLHGVISRNILTHEDM
+ 260 270 280 290 300 310
+
+>>sp|A0JMK9|CAF1A_DANRE Chromatin assembly factor 1 subu (863 aa)
+ s-w opt: 156 Z-score: 139.4 bits: 35.6 E(516081): 3
+Smith-Waterman score: 156; 25.3% identity (55.5% similar) in 229 aa overlap (1-215:208-432)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSP
+ .: .. : . : : :.. .:. .:
+sp|A0J DSDTEEEEEEEEEEEEQQQEAEVSHGNESVLSTGSTSSASVIASSPE-PSKSAPT---TP
+ 180 190 200 210 220 230
+
+ 40 50 60 70 80
+sp|Q1X ADTS-LNSAD-VKTQEVKPEEKKPAKKRKSWGQE-LPVPKTNLPPRKRAKTEDEKEQRRI
+ :.:: .:.:. :: . .: ... :.:. .: : .:. ... ::...
+sp|A0J ASTSRINAANKVKRRSLKSVQEQEEKQRQRDEKERLKQEAKAAKEKKKEEARKMKEEKER
+ 240 250 260 270 280 290
+
+ 90 100 110 120 130 140
+sp|Q1X ERVLRNRAAAQTSRERK-RLEMEKLENEKIQMEQQNQFLLQRLSQM--EAENNRLSQQLA
+ :. ... . ::.: : : :: .. : . ::... . .: . . :..::...
+sp|A0J EKKEKKEKDEKERREKKERDEKEKADKLKAKEEQRQMKIEAKLEEKRKKEEEKRLKEEKD
+ 300 310 320 330 340 350
+
+ 150 160 170 180 190
+sp|Q1X QLAAE----VRG-SRANTPM-PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYS
+ .. :: .: .. .: . : . :.: ..: .: . . :: :. : : .
+sp|A0J RIKAEKAEITRFLQKPKTQLAPKTLASACGKFAPFEIKAHMSLAPLTRVQCEDSVLEDLD
+ 360 370 380 390 400 410
+
+ 200 210 220 230 240 250
+sp|Q1X PTL-KP-STLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDF
+ : .: ::: .: . :
+sp|A0J RYLAQPDSTLNGLKDWTGHKPRSSGPTRPRHSAQGDCVVITESQKADDGPDRSRYGRMKL
+ 420 430 440 450 460 470
+
+>>sp|Q96JK9|MAML3_HUMAN Mastermind-like protein 3 OS=Hom (1134 aa)
+ s-w opt: 158 Z-score: 139.0 bits: 35.9 E(516081): 3.2
+Smith-Waterman score: 158; 22.8% identity (53.1% similar) in 254 aa overlap (8-250:390-619)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNS
+ : .:. :. .:::. :. :::. ...:
+sp|Q96 DPSHSPFAHVSMGSPQARPSSSGPPFSTVSTATSLPSVASTPAAPNPA--SSPANCAVQS
+ 360 370 380 390 400 410
+
+ 40 50 60 70 80 90
+sp|Q1X ADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAA
+ .. .: : . : : . : : ... . . . . . :.. ::
+sp|Q96 PQTPNQAHTPGQAPP---RPGNGYLLNPAAVTVAGSASGPVAVPSSDMSPAEQLKQMAAQ
+ 420 430 440 450 460 470
+
+ 100 110 120 130 140 150
+sp|Q1X QTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT
+ : ..: .: ..: .... :..::.: :. .:.. ..:. :. . :. ..
+sp|Q96 Q--QQRAKLMQQKQQQQQQQQQQQQQ---QQQQQQQQHSNQTSNW-SPLGPP------SS
+ 480 490 500 510 520
+
+ 160 170 180 190 200
+sp|Q1X PMPGSPATA----SPTLTPTLFKQERDELPLERIPFPTPSLSDYSP-------TLKPSTL
+ :. :. :: :: . : :... .: . ....: : . .:..:
+sp|Q96 PY-GAAFTAEKPNSPMMYPQAFNNQNPIVPPMANNLQKTTMNNYLPQNHMNMINQQPNNL
+ 530 540 550 560 570 580
+
+ 210 220 230 240 250 260
+sp|Q1X AESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSV
+ . .: :: .. :.. :: ...::... : :: :
+sp|Q96 GTNSLNKQHNILTY------GNTKPLTHFNADLSQRMTPPVANPNKNPLMPYIQQQQQQQ
+ 590 600 610 620 630
+
+ 270 280 290 300 310 320
+sp|Q1X EPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQ
+
+sp|Q96 QQQQQQQQQQQPPPPQLQAPRAHLSEDQKRLLLMKQKGVMNQPMAYAALPSHGQEQHPVG
+ 640 650 660 670 680 690
+
+>>sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcripti (127 aa)
+ s-w opt: 139 Z-score: 139.0 bits: 32.7 E(516081): 3.2
+Smith-Waterman score: 139; 28.6% identity (68.8% similar) in 77 aa overlap (69-145:21-97)
+
+ 40 50 60 70 80 90
+sp|Q1X DVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQ
+ : : . . : ..:...: .::.:::
+sp|Q9N MSQGLPAAGSVLQRSVAAPGNQPQPQPQQQSPEDDDRKVRRREKNRVAAQ
+ 10 20 30 40 50
+
+ 100 110 120 130 140 150
+sp|Q1X TSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP
+ ::... . .::..: ..::.: .: ...... : ..:.. : .
+sp|Q9N RSRKKQTQKADKLHEEYESLEQENTMLRREIGKLTEELKHLTEALKEHEKMCPLLLCPMN
+ 60 70 80 90 100 110
+
+ 160 170 180 190 200 210
+sp|Q1X MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAV
+
+sp|Q9N FVPVPPRPDPVAGCLPR
+ 120
+
+>>sp|Q9C0A6|SETD5_HUMAN SET domain-containing protein 5 (1442 aa)
+ s-w opt: 160 Z-score: 139.0 bits: 36.2 E(516081): 3.2
+Smith-Waterman score: 160; 21.2% identity (49.9% similar) in 359 aa overlap (2-331:410-760)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPA
+ .: ..: .. :: : : : . :
+sp|Q9C TKDAEVTIAFDYEYSNCNYKVDCACHKGNRNCPIQKRNPNATELPLLPPP--PSLPTIGA
+ 380 390 400 410 420 430
+
+ 40 50 60 70 80 90
+sp|Q1X DTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL
+ .: .: : :.. ... .. . .::.: : .... . .:: ... :.:.
+sp|Q9C ETRRRKARRKELEMEQQNEASEENNDQQSQEVPEKVTVSSDHEEVDNPEEKPEEEKEEVI
+ 440 450 460 470 480 490
+
+ 100 110 120 130 140
+sp|Q1X ---RNRAAAQTSRERKRLE--MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL
+ .: : .. .:: ...: :. .:: . . ....: : : :..: .. ...
+sp|Q9C DDQENLAHSRRTREDRKVEAIMHAFENLEKRKKRRDQPLEQSNSDVEITTTTSETPVGEE
+ 500 510 520 530 540 550
+
+ 150 160 170 180 190
+sp|Q1X A------AEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPS-------
+ . .:: .: .:. .:..: ... . . .: : . .: : :.
+sp|Q9C TKTEAPESEVSNSVSNVTIPSTPQSVGVNTRRS--SQAGDIAAEKLVPKPPPAKPSRPRP
+ 560 570 580 590 600 610
+
+ 200 210 220 230 240
+sp|Q1X ---LSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAA-
+ .: : . ... ::. .: :.:: :: .: . . : :. .
+sp|Q9C KSRISRYRTSSAQRLKRQKQANAQQAELSQAALEEGGSN----SLVTPTEAGSLDSSGEN
+ 620 630 640 650 660 670
+
+ 250 260 270 280 290 300
+sp|Q1X -PLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSA----FPFDSMVNFDSEPVT
+ ::. .: . . : :. .: . . : : . .: : . . . ..:..
+sp|Q9C RPLTGSDPTVVSITGSHVNRAASKYPKTKKYLVTEWLNDKAEKQECPVECPLRITTDPTV
+ 680 690 700 710 720 730
+
+ 310 320 330 340
+sp|Q1X LEG-IEMAHGL-PDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ : ..: :: . : : . ::.
+sp|Q9C LATTLNMLPGLIHSPLICTTPKHYIRFGSPFIPERRRRPLLPDGTFSSCKKRWIKQALEE
+ 740 750 760 770 780 790
+
+>>sp|B3DM43|SOX5_XENTR Transcription factor Sox-5 OS=Xen (753 aa)
+ s-w opt: 154 Z-score: 138.6 bits: 35.2 E(516081): 3.4
+Smith-Waterman score: 154; 23.3% identity (50.0% similar) in 236 aa overlap (95-327:224-436)
+
+ 70 80 90 100 110 120
+sp|Q1X VPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQF
+ ::.: ..:...:. : ..:.: .::. .
+sp|B3D EKERQLMAMINQLTSLREQLLAAHDEQKKLAASQIEKQRQQMELAKQQQEQIARQQQQLL
+ 200 210 220 230 240 250
+
+ 130 140 150 160 170 180
+sp|Q1X LLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQE---RDE
+ :. .. .. ... :: : : : . .. :. . : : :. . :
+sp|B3D QQQHKINLLQQQIQVQGQLPPLMIPVFPPDQRT-LAAAAAAQQGFLIPPGFSYKPGCSDP
+ 260 270 280 290 300 310
+
+ 190 200 210 220 230 240
+sp|Q1X LPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKH
+ :.. :: . . .: : : : . .:: :..:. :. :: .
+sp|B3D YPVQLIPTTMAAAAAATPGLAPLQLQQLY-AAQLAAMQVS----PGAKLP------GVPP
+ 320 330 340 350 360
+
+ 250 260 270 280 290 300
+sp|Q1X HSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSE
+ . .....: : .: :.:. .: :: . .::: : : . :
+sp|B3D SNLSNAVSPSS-------IHTDKSTSSPPPKTKD----DVTQPLNLSAKPKGSDSKSPSS
+ 370 380 390 400 410
+
+ 310 320 330 340
+sp|Q1X PVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ :.. . ... .: . :.::. :
+sp|B3D PTSPHIPRLSSALAHKPICSTSASTPLRVNSIDILSSITSPGYLNDHDAVTKAIQEARQM
+ 420 430 440 450 460 470
+
+>>sp|A5FV21|IF2_ACICJ Translation initiation factor IF-2 (887 aa)
+ s-w opt: 155 Z-score: 138.2 bits: 35.4 E(516081): 3.5
+Smith-Waterman score: 155; 26.7% identity (49.2% similar) in 240 aa overlap (41-255:41-271)
+
+ 20 30 40 50 60 70
+sp|Q1X SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNL
+ ... :. : .: :. . : : :..
+sp|A5F KGRLSLRPVNRGELGRTVDAGSVRQSFSHGRSKVVQVEVRK--KRGGAAGAETGRPSA--
+ 20 30 40 50 60
+
+ 80 90 100 110
+sp|Q1X PPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQM------------
+ : : . . . :.. :.::... .:: ::: :. :.:::..
+sp|A5F PSRASGGAAAPRGLTAAEQAARQRAVVEQQREAARLEAERREQEKISILSAAEEARRKAE
+ 70 80 90 100 110 120
+
+ 120 130 140 150 160 170
+sp|Q1X -EQQNQFLLQRLSQMEAENNRLSQQLAQL--AAEVRGSRANTPMPG---SPATASPTLTP
+ : . .:: . : : : .. :. :::. . : : :. :: .: : .:
+sp|A5F EEARAAEEAERL-RAEEEARRREEEEAERRRAAEASQATAAPPAPAAAASPRAAMP--AP
+ 130 140 150 160 170 180
+
+ 180 190 200 210 220
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTL-------AESSDVAQHPAVSVAGLEG
+ : . : .: :.: .. : ::. . :.: :..:. ..: .
+sp|A5F TAAPARPGAAPARRTA-PVPPATSASETLRLRAARTGRDEEEEASRPARRPGSGAAPSRK
+ 190 200 210 220 230 240
+
+ 230 240 250 260 270 280
+sp|Q1X DGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGG
+ . : .:.: .. . :: : :: ::
+sp|A5F PSVPAPK-KVGDDRRRGARIDVQAALSGDDERVRSLASVRRQRDRERRQAELERLRSDQV
+ 250 260 270 280 290 300
+
+>>sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive element-bi (357 aa)
+ s-w opt: 147 Z-score: 138.1 bits: 34.0 E(516081): 3.6
+Smith-Waterman score: 147; 27.6% identity (59.3% similar) in 123 aa overlap (52-168:194-315)
+
+ 30 40 50 60 70 80
+sp|Q1X EVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDE
+ :: .. . : . :. . :.:. ::
+sp|Q8K HSHSHLHAHPAHHQTSPHPPLHTGNQAQVSPATQQMQPTQTIQPPQPTGGRRRRVVDEDP
+ 170 180 190 200 210 220
+
+ 90 100 110 120 130 140
+sp|Q1X KEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQ
+ :.:: . . :::::: :..... . .::.. .. : :. : ...:... : .:.:
+sp|Q8K DERRR-KFLERNRAAATRCRQKRKVWVMSLEKKAEELTQTNMQLQNEVSMLKNEVAQLKQ
+ 230 240 250 260 270 280
+
+ 150 160 170 180 190
+sp|Q1X QL-----AQLAAEVRGSRAN-TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLS
+ : ..: . :.. .: . ::. :
+sp|Q8K LLLTHKDCPITAMQKESQGYLSPESSPPASPVPACSQQQVIQHNTITTSSSVSEVVGSST
+ 290 300 310 320 330 340
+
+ 200 210 220 230 240 250
+sp|Q1X DYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDD
+
+sp|Q8K LSQLTTHRTDLNPIL
+ 350
+
+>>sp|Q9H254|SPTN4_HUMAN Spectrin beta chain, brain 3 OS= (2564 aa)
+ s-w opt: 164 Z-score: 138.1 bits: 36.9 E(516081): 3.6
+Smith-Waterman score: 164; 22.5% identity (53.9% similar) in 204 aa overlap (6-203:2186-2384)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPV-LTVSPADTS
+ :. . .: :: :. :. : ..: :..
+sp|Q9H GLEPLARRASDTLSAEVRTRVGYVRQELKPERLQPRIDRLPEIPGRVEPAALPAAPEDAA
+ 2160 2170 2180 2190 2200 2210
+
+ 40 50 60 70 80 90
+sp|Q1X LNSAD-VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRA--KTEDEKEQRRIERVL
+ . : . ...:.: .: ....: . .:. : :... ..:. ..:: ::
+sp|Q9H ETPATPAAAEQVRP---RP-ERQESADRAEELPRRRRPERQESVDQSEEAARRRRPERQE
+ 2220 2230 2240 2250 2260 2270
+
+ 100 110 120 130 140 150
+sp|Q1X RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR
+ . : : : :. . . :. . . . : .. .... . . ::... ...
+sp|Q9H SAEHEAAHSLTLGRYEQMERRRERRERRLERQESSEQEMPIRGDLVKGKATLADIVEQLQ
+ 2280 2290 2300 2310 2320 2330
+
+ 160 170 180 190 200
+sp|Q1X GSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPT-PSLSDY-SPTLKPSTLAES
+ ..:. .:..:. .: : . ::: :: : : : : .: .:
+sp|Q9H EKEAGPGLPAGPSLPQPRELPPGRLPNGLELP-ERTPRPDRPRARDRPKPRRRPRPREGG
+ 2340 2350 2360 2370 2380 2390
+
+ 210 220 230 240 250 260
+sp|Q1X SDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPD
+
+sp|Q9H EGGGSRRSRSAPAQGGSAPAPPPPPTHTVQHEGFLLRKRELDANRKSSNRSWVSLYCVLS
+ 2400 2410 2420 2430 2440 2450
+
+>>sp|B2AWS3|PAN1_PODAN Actin cytoskeleton-regulatory com (1441 aa)
+ s-w opt: 159 Z-score: 138.0 bits: 36.0 E(516081): 3.6
+Smith-Waterman score: 159; 23.5% identity (50.4% similar) in 341 aa overlap (16-333:1015-1335)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV
+ : :. ..: :. . ..: :..:
+sp|B2A AERQARIAEETGAPAPAAQAAVPKPEGKKPPPPPSRKTP--KVDDRRAEEEAAARKAEEG
+ 990 1000 1010 1020 1030 1040
+
+ 50 60 70 80 90 100
+sp|Q1X KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKT-EDEKEQRRIERVLRNRAAAQTSRERK
+ . :... ..:.. .:: ..::: ::: ..: : : .: . :. :
+sp|B2A RLERERGEQERQT--REL---------EERAKDQEDELAKERAEADARLKALEEQVRQGK
+ 1050 1060 1070 1080 1090
+
+ 110 120 130 140 150
+sp|Q1X RLEMEKLENEKIQM---EQQNQFLLQRLSQMEAENNR---LSQQLAQLAAEVRGSRANT-
+ . :. ...: : ..:. : :: ...:: .: : .:: : .: .: .
+sp|B2A LKKEEEKRKKKAAMAEAKEQEAKLAQRRAEIEAARKREEELRKQLEALDVEDSSSDDDEG
+ 1100 1110 1120 1130 1140 1150
+
+ 160 170 180 190 200
+sp|Q1X PMPGSPATASPTLTPTLF--KQERDELPLERIPFPT---PSLSDYSPTLKPST------L
+ : .: ...::: . .:: . : .: :. :.. ::. :
+sp|B2A PEQITPQASTPTLGGSQVGGSQELEPAPPTPVPAPVQSPPQIVTSSPAETESRNPYFRMR
+ 1160 1170 1180 1190 1200 1210
+
+ 210 220 230 240 250 260
+sp|Q1X AESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSV
+ :...... : . : . : :.... :. :. .::: . .: :..
+sp|B2A AQAAETTPAPPAPPAPVAPPPPPQP--DVSTNPFHRMTQAAAAPAPSGPVSRKRPEDDGW
+ 1220 1230 1240 1250 1260
+
+ 270 280 290 300 310 320
+sp|Q1X EPDSSVFEDGLAFDVLEGGD----LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKT
+ :. .: : . :. :... : .:. .:.. : . : . : .: .
+sp|B2A GSDKE--DDDEDSDDDRPGQGAAHLASILFGTMA--PPRPLSATGDKSAAASPP-VTSPV
+ 1270 1280 1290 1300 1310 1320
+
+ 330 340
+sp|Q1X SSVQPGFGASTTRCDGQGIAAGC
+ .: :.. . :
+sp|B2A ASPPPAIPSPTAAGAPPAPPPPPPMPGMGAPPPPPPPPPMPGSGAPAAPPPPPPPAPGGA
+ 1330 1340 1350 1360 1370 1380
+
+>>sp|Q61827|MAFK_MOUSE Transcription factor MafK OS=Mus (156 aa)
+ s-w opt: 139 Z-score: 137.3 bits: 32.7 E(516081): 4
+Smith-Waterman score: 139; 26.4% identity (56.6% similar) in 159 aa overlap (47-193:5-156)
+
+ 20 30 40 50 60
+sp|Q1X ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTN-------
+ :. .: : .: :.. :: . .
+sp|Q61 MTTNPKPNKALKVKKEAGENAPVLSDDELVSMSV
+ 10 20 30
+
+ 70 80 90 100 110 120
+sp|Q1X --LPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQF
+ : . :. :..: .::: :.:.::. : . : .. . :.:: ......:. .
+sp|Q61 RELNQHLRGLTKEEVTRLKQRR--RTLKNRGYAASCRIKRVTQKEELERQRVELQQEVEK
+ 40 50 60 70 80 90
+
+ 130 140 150 160 170 180
+sp|Q1X LLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPL
+ : .. :.:. : . : .. : . .: . : :. .:. .. : . :. :. ::
+sp|Q61 LARENSSMRLELDALRSKYEALQTFAR-TVARGPV--TPTKVATTSVITIVKSA--ELSS
+ 100 110 120 130 140
+
+ 190 200 210 220 230 240
+sp|Q1X ERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHST
+ .:: . :
+sp|Q61 TSVPFSAAS
+ 150
+
+>>sp|O60675|MAFK_HUMAN Transcription factor MafK OS=Homo (156 aa)
+ s-w opt: 139 Z-score: 137.3 bits: 32.7 E(516081): 4
+Smith-Waterman score: 139; 26.4% identity (56.6% similar) in 159 aa overlap (47-193:5-156)
+
+ 20 30 40 50 60
+sp|Q1X ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTN-------
+ :. .: : .: :.. :: . .
+sp|O60 MTTNPKPNKALKVKKEAGENAPVLSDDELVSMSV
+ 10 20 30
+
+ 70 80 90 100 110 120
+sp|Q1X --LPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQF
+ : . :. :..: .::: :.:.::. : . : .. . :.:: ......:. .
+sp|O60 RELNQHLRGLTKEEVTRLKQRR--RTLKNRGYAASCRIKRVTQKEELERQRVELQQEVEK
+ 40 50 60 70 80 90
+
+ 130 140 150 160 170 180
+sp|Q1X LLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPL
+ : .. :.:. : . : .. : . .: . : :. .:. .. : . :. :. ::
+sp|O60 LARENSSMRLELDALRSKYEALQTFAR-TVARGPV--APSKVATTSVITIVKST--ELSS
+ 100 110 120 130 140
+
+ 190 200 210 220 230 240
+sp|Q1X ERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHST
+ .:: . :
+sp|O60 TSVPFSAAS
+ 150
+
+>>sp|Q4QRL3|CC88B_MOUSE Coiled-coil domain-containing pr (1481 aa)
+ s-w opt: 158 Z-score: 136.9 bits: 35.9 E(516081): 4.2
+Smith-Waterman score: 158; 28.6% identity (57.8% similar) in 185 aa overlap (6-180:281-460)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSL
+ ::. . .:: . . :. . . .:
+sp|Q4Q NASAEGVSHHLALQLTNAKAQLRRLRQEVEEKAEQLLDSQAEVQGLEAEIRRLRQETQAL
+ 260 270 280 290 300 310
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK---TEDEKEQRRIERVLR
+ ::..: :. :: . ..: . .:: . .: : : : .: : : . ::::
+sp|Q4Q -SAQAKRAELYREEAEALRERAG---RLPRLQEELR-RCREKLQAAEVFKGQLEEERVLS
+ 320 330 340 350 360
+
+ 100 110 120 130 140
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQ-RLSQMEAENNRLSQQLAQLAAE--
+ . :. ...::. . .. ... :....::. ::.. .:. . : .:: ::. :
+sp|Q4Q EALEASKVLLEEQLEVARERSARLHETQRENLLLRTRLGEAHADLDSLRHQLEQLVEENV
+ 370 380 390 400 410 420
+
+ 150 160 170 180 190 200
+sp|Q1X ---VRGSRANTPMPGSPATAS-PTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPST
+ .. .:. : ::::. :: : .:.: . :.
+sp|Q4Q ELELELQRSLEPPPGSPGEASLPGAAPSLQDEVREAEAGRLRAVERENRELRGQLQMLQA
+ 430 440 450 460 470 480
+
+ 210 220 230 240 250 260
+sp|Q1X LAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSS
+
+sp|Q4Q QLGSQHPLLEEQRENSRQPPVPNRDPATPSALHHSPQSPACQIGGEGSESLDLPSPASYS
+ 490 500 510 520 530 540
+
+>>sp|P53450|FOS_TAKRU Proto-oncogene c-Fos OS=Takifugu r (376 aa)
+ s-w opt: 146 Z-score: 136.8 bits: 33.9 E(516081): 4.3
+Smith-Waterman score: 146; 25.9% identity (57.5% similar) in 247 aa overlap (15-248:48-279)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLN-------S
+ : :. :: .:..:. .. .:. :
+sp|P53 ASPVGDNLYYPSPAGSYSSMGSPQSQDFTDLTASSASFIPTVTAISTSPDLQWMVQPLIS
+ 20 30 40 50 60 70
+
+ 40 50 60 70 80 90
+sp|Q1X ADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK--TEDEKEQRRIERVLRNRA
+ . . .....: .:. :: .. . :.. :.:.. : .:.:..::.: ::.
+sp|P53 SVAPSHRAHPYSPSPSYKRTV--MRSAASKAH-GKRSRVEQTTPEEEEKKRIRRE-RNKQ
+ 80 90 100 110 120 130
+
+ 100 110 120 130 140 150
+sp|Q1X AAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR-GSR
+ :: :.:.: . :. : :.:.... : . .... :..:: :: . :.
+sp|P53 AAAKCRNRRRELTDTLQAETDQLEDEKSSLQNDIANLLKEKERLEFILAAHQPICKIPSQ
+ 140 150 160 170 180 190
+
+ 160 170 180 190 200 210
+sp|Q1X ANTPMPGSPATASPT---LTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSD
+ .: . : .. ::. :. :. : . .: . : : : .. : . : .. :::
+sp|P53 MDTDF--SVVSMSPVHACLSTTVSTQLQTSIP--EATTVTSSHSTFTST-SNSIFSGSSD
+ 200 210 220 230 240
+
+ 220 230 240 250 260 270
+sp|Q1X VAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSS
+ .:.: . ..:.. . :: :.. ..: : .:
+sp|P53 ----SLLSTATV--SNSVVKMTDLDSSVLEESLDLLAKTEAETARSVPDVNLSNSLFAAQ
+ 250 260 270 280 290 300
+
+ 280 290 300 310 320 330
+sp|Q1X VFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGA
+
+sp|P53 DWEPLHATISSSDFEPLCTPVVTCTPACTTLTSSFVFTFPEAETFPTCGVAHRRRSNSND
+ 310 320 330 340 350 360
+
+>>sp|Q9UPA5|BSN_HUMAN Protein bassoon OS=Homo sapiens GN (3926 aa)
+ s-w opt: 166 Z-score: 136.5 bits: 37.2 E(516081): 4.4
+Smith-Waterman score: 166; 25.7% identity (58.3% similar) in 187 aa overlap (16-189:2328-2510)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTS--LNSADVKTQ
+ :: :.. : ..:. : :. . .
+sp|Q9U RPEMPVGAAREEPLPTTTPAAIKEAAGAPAPAPLAGQKPPADAAPGGGSGALSRPGFEKE
+ 2300 2310 2320 2330 2340 2350
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRER
+ :.. ::.. .:.. .: ...: .. . ..: :..:.: . :.: : .:
+sp|Q9U EASQEERQ--RKQQEQLLQLERERVELEKLRQLRLQEELERERVE-LQRHREEEQLLVQR
+ 2360 2370 2380 2390 2400 2410
+
+ 110 120 130 140 150
+sp|Q1X KRLEMEKLENEKIQMEQ---QNQFLLQR--LSQ--MEAEN-NRLSQQLAQLAAEVRGSRA
+ . :.. .... .:..: : :: ::: :.: .. :. ..:.::: : : . .:
+sp|Q9U ELQELQTIKHHVLQQQQEERQAQFALQREQLAQQRLQLEQIQQLQQQLQQQLEEQK-QRQ
+ 2420 2430 2440 2450 2460 2470
+
+ 160 170 180 190 200 210
+sp|Q1X NTPMPGS---PATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDV
+ ..:.:.. :. . : . : .. . :: . :
+sp|Q9U KAPFPAACEAPGRGPPLAAAELAQNGQYWPPLTHAAFIAMAGPEGLGQPREPVLHRGLPS
+ 2480 2490 2500 2510 2520 2530
+
+ 220 230 240 250 260 270
+sp|Q1X AQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV
+
+sp|Q9U SASDMSLQTEEQWEASRSGIKKRHSMPRLRDACELESGTEPCVVRRIADSSVQTDDEDGE
+ 2540 2550 2560 2570 2580 2590
+
+>>sp|O88737|BSN_MOUSE Protein bassoon OS=Mus musculus GN (3942 aa)
+ s-w opt: 166 Z-score: 136.5 bits: 37.2 E(516081): 4.4
+Smith-Waterman score: 166; 24.2% identity (57.5% similar) in 186 aa overlap (16-189:2336-2518)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTS--LNSADVKTQ
+ :: : .. :. .. .. : :. . .
+sp|O88 PAGVAREEPFSTTAPAVIKEAPVAPAPGPAPAPPPGQKPAGEAAAGSGSGVLSRPASEKE
+ 2310 2320 2330 2340 2350 2360
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRER
+ :.. :... .:.. .: ...: .. . ..: :..:.: . :.: : .:
+sp|O88 EASQEDRQ--RKQQEQLLQLERERVELEKLRQLRLQEELERERVE-LQRHREEEQLLVQR
+ 2370 2380 2390 2400 2410 2420
+
+ 110 120 130 140 150
+sp|Q1X KRLEMEKLENEKIQMEQ---QNQFLLQR--LSQ--MEAENNRLSQQLAQLAAEVRGSRAN
+ . :.. .... .:..: : :: ::: :.: .. :. . :: :: : . .: .
+sp|O88 ELQELQTIKQHVLQQQQEERQAQFALQREQLAQQRLQLEQIQQLQQQLQLQLEEQKQRQK
+ 2430 2440 2450 2460 2470 2480
+
+ 160 170 180 190 200 210
+sp|Q1X TPMPGS---PATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVA
+ .:.:.. :. . : . : .. . :: . :
+sp|O88 APFPATCEAPSRGPPPAATELAQNGQYWPPLTHAAFIAVAGTEGPGQPREPVLHRGLPSS
+ 2490 2500 2510 2520 2530 2540
+
+ 220 230 240 250 260 270
+sp|Q1X QHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVF
+
+sp|O88 ASDMSLQTEEQWEAGRSGIKKRHSMPRLRDACEPESGPDPSTVRRIADSSVQTDDEEGEG
+ 2550 2560 2570 2580 2590 2600
+
+>>sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Arabido (315 aa)
+ s-w opt: 144 Z-score: 136.3 bits: 33.5 E(516081): 4.5
+Smith-Waterman score: 144; 30.7% identity (60.6% similar) in 127 aa overlap (31-149:176-296)
+
+ 10 20 30 40 50 60
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+ ::.: .:. . : : . . :
+sp|P42 VTAGSSDENDENANQQEQGSIRKPSFGQMLADASSQSTTGEIQGSVPMKPVAPGTNLNIG
+ 150 160 170 180 190 200
+
+ 70 80 90 100 110 120
+sp|Q1X QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+ ..: ....: ..::.: .: .: :: .:. :: ::. : :.:... .. .
+sp|P42 MDLWSSQAGVP------VKDERELKRQKRKQSNRESARRSRLRKQAECEQLQQRVESLSN
+ 210 220 230 240 250
+
+ 130 140 150 160 170
+sp|Q1X QNQFL---LQRLS----QMEAENNRLSQQLAQ-LAAEVRGSRANTPMPGSPATASPTLTP
+ .:: : ::::: ....::: ....: . :.::
+sp|P42 ENQSLRDELQRLSSECDKLKSENNSIQDELQRVLGAEAVANLEQNAAGSKDGEGTN
+ 260 270 280 290 300 310
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+>>sp|Q7ZVN7|MED15_DANRE Mediator of RNA polymerase II tr (809 aa)
+ s-w opt: 152 Z-score: 136.2 bits: 34.9 E(516081): 4.6
+Smith-Waterman score: 152; 20.8% identity (56.0% similar) in 259 aa overlap (58-297:322-573)
+
+ 30 40 50 60 70 80
+sp|Q1X VSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRI
+ : :.. ::. ... .. ....: ..
+sp|Q7Z QMQQQQQLQVQAQGQPQVQGQGGAVQMPPHSQQQQVLVPQMVQGQHSQMSALSQQQQLKL
+ 300 310 320 330 340 350
+
+ 90 100 110 120 130 140
+sp|Q1X ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA
+ ..... : : ...... .... .... :..::.: :. .: . .. . :: .::.
+sp|Q7Z QQAMQARMQQQQQQQQQQQQQQQQQQQQQQQQQQQQ--QQQQQQHQQQQVQQVQQASQLT
+ 360 370 380 390 400
+
+ 150 160 170 180 190
+sp|Q1X A-----------EV--RGSRA--NTPMPGSPATASPTLTPTLFKQERDELPLE-RIPFPT
+ : .. : :: :. .: .:.. . : .. . :.. . :
+sp|Q7Z AVPGQMMPRPGMQIPPRLPRATPNSAIPQNPVAIGGQQMPQAQQMMSSPSPVQVQTPQSM
+ 410 420 430 440 450 460
+
+ 200 210 220 230 240 250
+sp|Q1X PSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPL
+ : . .:. .: . .. ..:.. :. : .:.. . : : . .:. .: . .:
+sp|Q7Z PPPPQPQPSPQPPS-SQPNSVSSGPTPSPGGFQPSPSPQPSQSPASSRTPQSYP-LQVP-
+ 470 480 490 500 510 520
+
+ 260 270 280 290 300
+sp|Q1X SDDDFNRLFHGDSSVEP-DSSVFEDGLAFDVLEGGDLSAF--PFDSMVNFDSEPVTLEGI
+ : .: . .: . : .: :: : .: :. .:: . :. :.:
+sp|Q7Z SPGPLNTPGNPSSVMSPAGASQSEDQLYMDKLR--QLSKYIEPLRRMINKIDKNEDRKKD
+ 530 540 550 560 570 580
+
+ 310 320 330 340
+sp|Q1X EMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q7Z LSKMKSLLNILTDPNTRCPLKTLQKCEIALEKLKNDMAVPTPPPPPVPCTKKQYLCQPIL
+ 590 600 610 620 630 640
+
+>>sp|O42290|MAFA_CHICK Transcription factor MafA OS=Gall (286 aa)
+ s-w opt: 143 Z-score: 136.2 bits: 33.4 E(516081): 4.6
+Smith-Waterman score: 143; 33.3% identity (67.9% similar) in 84 aa overlap (85-167:201-281)
+
+ 60 70 80 90 100 110
+sp|Q1X KRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENE
+ .. .:.:.::. ::. : .. . . ::::
+sp|O42 RFSDDQLVSMSVRELNRQLRGFSKEEVIRLKQNRRTLKNRGYAQSCRYKRVQQRHILENE
+ 180 190 200 210 220 230
+
+ 120 130 140 150 160 170
+sp|Q1X KIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG-SRANTPMPGSPATASPTLTPT
+ : :...: . : :..:.. : . ... .::: :: : .: :..: :..
+sp|O42 KCQLQSQVEQLKQEVSRLAKERDLYKEKYEKLAA--RGFPREPSP-PAAPKTTAADFFM
+ 240 250 260 270 280
+
+ 180 190 200 210 220 230
+sp|Q1X LFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLF
+
+>>sp|A9V549|EIF3A_MONBE Eukaryotic translation initiatio (1052 aa)
+ s-w opt: 154 Z-score: 135.9 bits: 35.2 E(516081): 4.7
+Smith-Waterman score: 154; 27.1% identity (56.2% similar) in 203 aa overlap (41-231:770-966)
+
+ 20 30 40 50 60 70
+sp|Q1X SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNL
+ :: : . : :. :: . . .
+sp|A9V EKARVDHAKALGLKELLKAFAPDKDAYIEEKTAERRKEYMAKLDDFKQRMQEQKI-RLER
+ 740 750 760 770 780 790
+
+ 80 90 100 110 120
+sp|Q1X PPRKRAKTE----DEKEQRRI--ERVLRNRAAAQTSRERKRLEMEKLEN-EKIQMEQQNQ
+ :.: . : .:.::::: :. :.. ...::..: :. :::. :. .::. ..
+sp|A9V EERERKREEKRRAEEEEQRRIKQEEEDRKQREREAKREQERQEQLKLEEAERKKMEEATK
+ 800 810 820 830 840 850
+
+ 130 140 150 160 170 180
+sp|Q1X FLLQRLSQMEA-ENNRLSQQLAQLAAEV--RGSRANTPMPGSPATASPTLTPTLFKQERD
+ . :: :..: :...::. :: . . :..:...: ..:.. . . .: . .
+sp|A9V LQRQREEQVRAREQEKLSNLSAQTSQPTWKRSARSDAPTTAAPSS----MRVSSWKGDAS
+ 860 870 880 890 900 910
+
+ 190 200 210 220 230
+sp|Q1X ELPLERIPFPTPSLSDYSPTLKP-STLAESSDVA-QHPAVSVAGLEGDGSALPLFDLGSD
+ . . :: :: . . . : :.. .: : . . : .:: :. :
+sp|A9V DDSGRSQPF-RPSRGGERDSGRSFSGLGDRGDRAPRDTGRSFSGLGDRGDRAPRDTGRSF
+ 920 930 940 950 960 970
+
+ 240 250 260 270 280 290
+sp|Q1X LKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNF
+
+sp|A9V SGLGDRAPRDFSGRSEPSRSGPRDFSGRSEAGRTSGERRALHVPSGGADKPSGDNVWRSS
+ 980 990 1000 1010 1020 1030
+
+>>sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcripti (118 aa)
+ s-w opt: 135 Z-score: 135.9 bits: 32.0 E(516081): 4.8
+Smith-Waterman score: 135; 33.3% identity (77.8% similar) in 63 aa overlap (83-145:28-90)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ ..:...: .::.::: ::... . .::.
+sp|Q9D MSQGPPAVSVLQRSVDAPGNQPQSPKDDDRKVRRREKNRVAAQRSRKKQTQKADKLH
+ 10 20 30 40 50
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ .:. ..::.:. : ...:... : .::. : .
+sp|Q9D EEHESLEQENSVLRREISKLKEELRHLSEVLKEHEKMCPLLLCPMNFVQLRSDPVASCLP
+ 60 70 80 90 100 110
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+sp|Q9D R
+
+
+>>sp|Q5RCJ1|CIP4_PONAB Cdc42-interacting protein 4 OS=Po (601 aa)
+ s-w opt: 149 Z-score: 135.8 bits: 34.4 E(516081): 4.8
+Smith-Waterman score: 149; 25.4% identity (54.2% similar) in 177 aa overlap (29-186:294-463)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKR-K
+ .:.:.::.. .. .:: . :...: :
+sp|Q5R DSQVLIELHKSGFARPGDVEFEDFSQPMNRAPSDSSLGTP----SDGRPELRGPGRSRTK
+ 270 280 290 300 310
+
+ 60 70 80 90 100
+sp|Q1X SW--GQEL------------PVPKT--NLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ : :.. :::.. : :: :. . .: . .. : :. :
+sp|Q5R RWPFGKKNKPRPPPLSPLGGPVPSALPNGPPSPRSGRDPLAILSEISKSVKPRLASFRSL
+ 320 330 340 350 360 370
+
+ 110 120 130 140 150
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA--EVRGSRANTPM
+ . .: . . .. ::: . : : :.: .. .:.... : : ... .::.
+sp|Q5R RGSRGTVVTEDFSHLPPEQQRKRLQQ---QLEERSRELQKEVDQREALKKMKDVYEKTPQ
+ 380 390 400 410 420 430
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::. : .: :: . :: .: ...
+sp|Q5R MGDPASLEPQITETLSNIERLKLEVQKYEAWLAEAESRVLSNRGDSLSRHARPPDPPTSA
+ 440 450 460 470 480 490
+
+>>sp|O43889|CREB3_HUMAN Cyclic AMP-responsive element-bi (395 aa)
+ s-w opt: 145 Z-score: 135.4 bits: 33.7 E(516081): 5
+Smith-Waterman score: 145; 30.2% identity (62.8% similar) in 129 aa overlap (63-185:159-282)
+
+ 40 50 60 70 80 90
+sp|Q1X TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR
+ : .:.: :: .::: :. .:..: .:
+sp|O43 TPQHMEELAEQEIARLVLTDEEKSLLEKEGLILPET-LP---LTKTE-EQILKRVRRKIR
+ 130 140 150 160 170 180
+
+ 100 110 120 130 140 150
+sp|Q1X NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV--
+ :. .:: ::..:.. . ::.. ... ::. : .... .: .: : .:: .: : :
+sp|O43 NKRSAQESRRKKKVYVGGLESRVLKYTAQNMELQNKVQLLEEQNLSLLDQLRKLQAMVIE
+ 190 200 210 220 230 240
+
+ 160 170 180 190 200
+sp|Q1X ---RGSRANTPMPGSPATASPTLTPTLFKQE-RDELPLERIPFPTPSLSDYSPTLKPSTL
+ . : ..: . .. :.:...... : :: :
+sp|O43 ISNKTSSSSTCILVLLVSFCLLLVPAMYSSDTRGSLPAEHGVLSRQLRALPSEDPYQLEL
+ 250 260 270 280 290 300
+
+ 210 220 230 240 250 260
+sp|Q1X AESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSV
+
+sp|O43 PALQSEVPKDSTHQWLDGSDCVLQAPGNTSCLLHYMPQAPSAEPPLEWPFPDLFSEPLCR
+ 310 320 330 340 350 360
+
+>>sp|O35284|BATF_MOUSE Basic leucine zipper transcriptio (125 aa)
+ s-w opt: 135 Z-score: 135.4 bits: 32.0 E(516081): 5.1
+Smith-Waterman score: 135; 28.9% identity (62.2% similar) in 90 aa overlap (71-160:17-103)
+
+ 50 60 70 80 90 100
+sp|Q1X KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS
+ :: :. ...: :...: .:: ::: :
+sp|O35 MPHSSDSSDSSFSRSPPPGKQDSSDDV---RKVQRREKNRIAAQKS
+ 10 20 30 40
+
+ 110 120 130 140 150 160
+sp|Q1X RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP
+ :.:. . . :. :. ..:.:: : ....:. : . ... :.. ..:: :
+sp|O35 RQRQTQKADTLHLESEDLEKQNAALRKEIKQLTEELKYFTSVLSSHEPLCSVLASGTPSP
+ 50 60 70 80 90 100
+
+ 170 180 190 200 210 220
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSV
+
+sp|O35 PEVVYSAHAFHQPHISSPRFQP
+ 110 120
+
+>>sp|Q2UNX4|KAPC_ASPOR Putative transcription factor kap (284 aa)
+ s-w opt: 142 Z-score: 135.3 bits: 33.2 E(516081): 5.1
+Smith-Waterman score: 142; 24.2% identity (51.6% similar) in 215 aa overlap (16-223:44-237)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL---TVSPAD-TSLNSADVK
+ : ::.. : . :.:: : .... :
+sp|Q2U QTSAQDHADQVLHDQLLAAHQHLSHPQQPRPQPPAAQPPHMQPNTTSPRDQNNIDPAISG
+ 20 30 40 50 60 70
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ . .. . : . . . ::: : :: .. .:. .:::: .. :
+sp|Q2U AAMLSGPPQTPPQPEPT-GQESP------------KTYGKRPLSTSKRAAQNRAAQRAFR
+ 80 90 100 110 120
+
+ 110 120 130 140 150
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQF--LLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-
+ .::. ..::: :: ..: . . .. ..::: .: . . .: ... :....:
+sp|Q2U QRKESYIRKLE------EQVKEFDTMSEAFKALQAENYQLREYIINLQSRLLESQGEVPE
+ 130 140 150 160 170
+
+ 160 170 180 190 200 210
+sp|Q1X MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAV
+ .::. ..: : : :.: : . . :. : ..:. . .
+sp|Q2U LPGNIDLSQPR-TDLNVPQPGAGPATTSSSAPAPP-SGAQQAQPPQGAASNDDMNSLNRI
+ 180 190 200 210 220 230
+
+ 220 230 240 250 260 270
+sp|Q1X SVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLA
+ .::::
+sp|Q2U AVAGLGMRKHPNEEANYLGNNFTGRRTRPDETQADSEVTKTEQAPHGLPMVS
+ 240 250 260 270 280
+
+>>sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive element-bi (508 aa)
+ s-w opt: 147 Z-score: 135.3 bits: 34.0 E(516081): 5.1
+Smith-Waterman score: 147; 27.6% identity (59.3% similar) in 123 aa overlap (52-168:345-466)
+
+ 30 40 50 60 70 80
+sp|Q1X EVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDE
+ :: .. . : . :. . :.:. ::
+sp|Q02 HSHSHLHAHPAHHQTSPHPPLHTGNQAQVSPATQQMQPTQTIQPPQPTGGRRRRVVDEDP
+ 320 330 340 350 360 370
+
+ 90 100 110 120 130 140
+sp|Q1X KEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQ
+ :.:: . . :::::: :..... . .::.. .. : :. : ...:... : .:.:
+sp|Q02 DERRR-KFLERNRAAATRCRQKRKVWVMSLEKKAEELTQTNMQLQNEVSMLKNEVAQLKQ
+ 380 390 400 410 420 430
+
+ 150 160 170 180 190
+sp|Q1X QL-----AQLAAEVRGSRAN-TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLS
+ : ..: . :.. .: . ::. :
+sp|Q02 LLLTHKDCPITAMQKESQGYLSPESSPPASPVPACSQQQVIQHNTITTSSSVSEVVGSST
+ 440 450 460 470 480 490
+
+ 200 210 220 230 240 250
+sp|Q1X DYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDD
+
+sp|Q02 LSQLTTHRTDLNPIL
+ 500
+
+>>sp|Q6P9R4|ARHGI_MOUSE Rho guanine nucleotide exchange (1021 aa)
+ s-w opt: 153 Z-score: 135.2 bits: 35.0 E(516081): 5.2
+Smith-Waterman score: 153; 24.0% identity (52.8% similar) in 246 aa overlap (9-250:628-858)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVP--VLTVSPADTSLN
+ : :..:::.. :. : :.: ::.
+sp|Q6P WQGPASSPDSRPCDNSAPSGCCEESPQAVEMPSTESLPTVLELELVHRVQTLSQLLLSLQ
+ 600 610 620 630 640 650
+
+ 40 50 60 70 80 90
+sp|Q1X SADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAA
+ .. . :. : .. : ... .: . :: ....:: .:. ..::.
+sp|Q6P AV-IAQQDSYVEMQRTAIQEREKQFRLQSTRGNL-------LLEQERQRNFEKQREERAG
+ 660 670 680 690 700
+
+ 100 110 120 130 140 150
+sp|Q1X AQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRAN
+ .. . . : :... : :. ...:. .. ::.. :.: .. :.: : .:.. .:
+sp|Q6P VEKLQSQLRQEQQRWERERARQQQELELAGARLQEREGEARQMRQRLDQERTELERQRQA
+ 710 720 730 740 750 760
+
+ 160 170 180 190 200 210
+sp|Q1X TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHP
+ . . .::..: : : : . .: : .:::.. ... :
+sp|Q6P YQHDLERLREAQRAVD----RERERLELLR-RFKKQNT--VPGALPPEVLAEAQPASHPP
+ 770 780 790 800 810 820
+
+ 220 230 240 250 260 270
+sp|Q1X AVSVAGLEGDGS-ALPLFDLGSDLKHHS-TDDVAAPLSDDDFNRLFHGDSSVEPDSSVFE
+ . . :::: .. : :: . : . :.: :
+sp|Q6P SFNGDGLEGHSAPAKAPGTQGSAMLHGTGPDNVERPEVARWDSAPPESRPAKSDVPIQLL
+ 830 840 850 860 870 880
+
+ 280 290 300 310 320 330
+sp|Q1X DGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTT
+
+sp|Q6P SATNQIQRQTAVQQQIPTKLAASTKGGKEKGSKSRGSQRWESSASFDLKQQLLLSKFIGK
+ 890 900 910 920 930 940
+
+>>sp|Q5F489|TAF3_CHICK Transcription initiation factor T (930 aa)
+ s-w opt: 152 Z-score: 135.1 bits: 34.9 E(516081): 5.3
+Smith-Waterman score: 152; 26.1% identity (52.7% similar) in 226 aa overlap (14-232:662-845)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLP--ATP-ASEVPVLTVSPADTSLNSADV
+ ::: .:: : ..: .. :. . . .
+sp|Q5F KKDKEKVKDKSKEDKIKPPSAPLVLPPKEMSLPLFSTPTAMRLP--SMLPSLSPMLPEKL
+ 640 650 660 670 680
+
+ 50 60 70 80 90 100
+sp|Q1X KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS
+ .. ::.::: ::.: .:. . : .::... ... .
+sp|Q5F FEDKEKPKEKKKDKKEK---------------KKKKEREKDKEKEK-----KDKEKERKE
+ 690 700 710 720
+
+ 110 120 130 140 150
+sp|Q1X RERKRLEMEKLENEKIQMEQ---QNQFLLQRLS-QMEAENNRLSQQLAQLAAEVRGSRAN
+ ::.:. : :: ..:::..: . .. ::. .. : .... . . : : ..
+sp|Q5F REKKEKEKEKHKHEKIKVEPVVPAPSPVIPRLTLRVGAGQDKIVISKVVPAPE---AKPA
+ 730 740 750 760 770 780
+
+ 160 170 180 190 200 210
+sp|Q1X TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHP
+ ::. . : : :. .:. :.. : :.: . .::..:. : .: :
+sp|Q5F TPV-SRPKTPPPVPSPV-------PAPVHVTPPPAPVPAPPQPTVSPALLPPAS-----P
+ 790 800 810 820 830
+
+ 220 230 240 250 260 270
+sp|Q1X AVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDG
+ :::.:: :: :.
+sp|Q5F AVSAAG----GSKAPVRSVVTETVSTYVIRDEWGNQIWFCPGCNKPDDGSPMIGCDDCDD
+ 840 850 860 870 880
+
+>>sp|Q5HZG4|TAF3_MOUSE Transcription initiation factor T (932 aa)
+ s-w opt: 152 Z-score: 135.1 bits: 34.9 E(516081): 5.3
+Smith-Waterman score: 152; 27.2% identity (52.0% similar) in 202 aa overlap (14-203:664-845)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ
+ .:: : : : .. :: . . . .
+sp|Q5H KRERERLKEKNREDKIKAPPTQLVLPPKEMALPLFSPSAVRVPAMLPAFSPMLPEKLFEE
+ 640 650 660 670 680 690
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRER
+ . ::.::. : .: .:. : : :::... :: .: . ::.
+sp|Q5H KEKPKEKERKKDKK---------------EKKKKKEKEKEKEKKER---EREKERREREK
+ 700 710 720 730
+
+ 110 120 130 140 150
+sp|Q1X KRLEMEKLENEKIQMEQ---QNQFLLQRLS-QMEAENNRLSQQLAQLAAEVRGS----RA
+ .. : :: ..:::..: . .. ::. .. : .... . . : :.. . :
+sp|Q5H REKEKEKHKHEKIKVEPVIPAPSPVIPRLTLRVGAGQDKIVISKVVPAPEAKPAPSLNRP
+ 740 750 760 770 780 790
+
+ 160 170 180 190 200 210
+sp|Q1X NTPMPGS---PATASPT-LTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSD
+ .:: :. :. .::: : : :. : : .: :.:.:: . . :
+sp|Q5H KTPPPAPVPIPVRVSPTPLQPPLLTQAAVCPAL--MPSPAPALSGIGSAKAPVRSVVTET
+ 800 810 820 830 840 850
+
+ 220 230 240 250 260 270
+sp|Q1X VAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSS
+
+sp|Q5H VSTYVIRDEWGNQIWICPGCNKPDDGSPMIGCDDCDDWYHWPCVGIMAAPPEEMQWFCPK
+ 860 870 880 890 900 910
+
+>>sp|Q9UKV3|ACINU_HUMAN Apoptotic chromatin condensation (1341 aa)
+ s-w opt: 155 Z-score: 134.9 bits: 35.4 E(516081): 5.4
+Smith-Waterman score: 155; 25.8% identity (55.1% similar) in 256 aa overlap (46-283:294-535)
+
+ 20 30 40 50 60 70
+sp|Q1X PATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPV--PKTNLPPR
+ : .: :. : :.:.: :. . :
+sp|Q9U DRNLKTEEEEEEEEEEEEDDEEEEGDDEGQKSREAPILKEFKEEGEEIPRVKPEEMMDER
+ 270 280 290 300 310 320
+
+ 80 90 100 110 120
+sp|Q1X KRAKTEDEKEQRRIERVLRNRAAAQTS---RERKRLEMEK---LENEKIQMEQQNQFLLQ
+ ........ .: : :.. :. : :.... ::. ::.:. .. ...: : .
+sp|Q9U PKTRSQEQEVLERGGRFTRSQEEARKSHLARQQQEKEMKTTSPLEEEEREI-KSSQGLKE
+ 330 340 350 360 370 380
+
+ 130 140 150 160 170 180
+sp|Q1X RLSQMEAENNRLSQQLAQLAA--EVRGSRANTPMPG-SPATASPTLTPTLFKQERDELPL
+ . .. ... :.:.: : .:. .:: : . ..:: : : ..:. : :.
+sp|Q9U KSKSPSPPRLTEDRKKASLVALPEQTASEEETPPPLLTKEASSPPPHPQLHSEEEIE-PM
+ 390 400 410 420 430 440
+
+ 190 200 210 220 230 240
+sp|Q1X ERIPFPTPSLSDYSPTLKPSTLAESSD--VAQHPAVSVAGLEGDGSALPLFDLGSDLKHH
+ : : : : : . :: :.: :.. . :.:: . :.:: :: . :: : .
+sp|Q9U EG-PAP-PVLIQLSP---PNTDADTRELLVSQHTVQLVGGLS------PLSS-PSDTKAE
+ 450 460 470 480
+
+ 250 260 270 280 290
+sp|Q1X ST-----DDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVN
+ : .. . :: . . . .....::.:. . : . . :
+sp|Q9U SPAEKVPEESVLPLVQKSTLADYSAQKDLEPESDRSAQPLPLKIEELALAKGITEECLKQ
+ 490 500 510 520 530 540
+
+ 300 310 320 330 340
+sp|Q1X FDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q9U PSLEQKEGRRASHTLLPSHRLKQSADSSSSRSSSSSSSSSRSRSRSPDSSGSRSHSPLRS
+ 550 560 570 580 590 600
+
+>>sp|Q5KGK5|EIF3A_CRYNE Eukaryotic translation initiatio (952 aa)
+ s-w opt: 152 Z-score: 134.9 bits: 34.9 E(516081): 5.4
+Smith-Waterman score: 152; 30.7% identity (54.5% similar) in 202 aa overlap (48-230:735-930)
+
+ 20 30 40 50 60 70
+sp|Q1X TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKK--RKSWGQELPVPKTNLPPRKR
+ :: : ::. :.. .: . .. :::
+sp|Q5K QRAARELKQRLGRMLEDYEAVKERIESQMQEELKAAKEEARRKIEEEKAQLREKVIKRKR
+ 710 720 730 740 750 760
+
+ 80 90 100 110 120
+sp|Q1X AKTEDE-KEQRRIERVLRNRA--AAQTSRERKR----LEMEKL--ENEKIQMEQQNQFLL
+ . : . :: :. :. :.. ::: ..:. : :: : :... . : : : :
+sp|Q5K EEKERKLKEAREAEERKRKEEEEAAQKAEEEARAAAALEAEAAAAEQRRAEREAQRQSDL
+ 770 780 790 800 810 820
+
+ 130 140 150 160 170
+sp|Q1X QRL-SQMEAENNRLSQQLAQLAAEVRGSRANTPMPG----SPATASPTLT---PTLFKQE
+ .:. .:.: :.. : .. :. :: . :. : : :. .: ::::. . :. . ..
+sp|Q5K ERIRAQQEREEEALRRRQAEKAAATSGGSAYRP-PARAGTTPPTASPAPSSGGPSWLARR
+ 830 840 850 860 870 880
+
+ 180 190 200 210 220 230
+sp|Q1X RDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSD
+ . :. : :: ::. : .: :.. :.:: :.. ::
+sp|Q5K KAMEAQSAGGAPVAS----SPKPVPSNSAAASAPASNGPESIAG-EAEKPALTGSVWRRG
+ 890 900 910 920 930
+
+ 240 250 260 270 280 290
+sp|Q1X LKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNF
+
+sp|Q5K MGARRGMPSTRGGA
+ 940 950
+
+>>sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodopus r (381 aa)
+ s-w opt: 144 Z-score: 134.8 bits: 33.5 E(516081): 5.5
+Smith-Waterman score: 144; 23.5% identity (49.7% similar) in 306 aa overlap (2-291:57-353)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVL--TVS
+ : .. :...... : :.: .:.
+sp|Q56 LSYYHSPADSFSSMGSPVNAQDFCADLSVSSANFIPTVTAISTSPDLQWLVQPTLVSSVA
+ 30 40 50 60 70 80
+
+ 30 40 50 60 70 80
+sp|Q1X PADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE
+ :..: . : : . . : : :. . . . . . . .:.:.:::.
+sp|Q56 PSQTRAPHPYGVPTPSTGAYSRAGMVKTVSGGRAQSIGRRG---KVEQLSPEEEEKRRIR
+ 90 100 110 120 130 140
+
+ 90 100 110 120 130 140
+sp|Q1X RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ : ::. :: :.:.: . :. : :.:.... : ..... :...: ::
+sp|Q56 RE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEIANLLKEKEKLEFILAAHRP
+ 150 160 170 180 190 200
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LPLERIPFPTPSLSDYSPTLK
+ . . .: . ..:: :: : : .: ::: : : :: . . .
+sp|Q56 ACKIPD-DLGFPEDMSVASLDLTGGLPEAATPESEEAFSLPLLNEPEPKTSLESVKSISS
+ 210 220 230 240 250 260
+
+ 210 220 230 240 250
+sp|Q1X PSTLAESSDVAQHPAVSV-AGLEGDGSALPLFDL-GS----DLKH-HSTDDVAAPLSDDD
+ :: : : : .: : . ..: .:: :: : . ::.. .:.. .
+sp|Q56 MELKAEPFDDFLFSASSRPSGSETTARSVPDMDLSGSFYAADWEPLHSSSLGMGPMATE-
+ 270 280 290 300 310 320
+
+ 260 270 280 290 300 310
+sp|Q1X FNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLP
+ .. : . :. ... ....: : ..::
+sp|Q56 LEPLCTPVVTCTPSCTTYTSSFVFTYPE---TDSFPSCAAAHRKGSSSNEPSSDSLSSPT
+ 330 340 350 360 370
+
+ 320 330 340
+sp|Q1X DETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q56 LLAL
+ 380
+
+>>sp|Q3KQU3|MA7D1_HUMAN MAP7 domain-containing protein 1 (841 aa)
+ s-w opt: 150 Z-score: 134.0 bits: 34.5 E(516081): 6.1
+Smith-Waterman score: 150; 24.6% identity (48.9% similar) in 264 aa overlap (16-258:555-812)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTS-LNSADVKTQE
+ :: : .: : . .:.:.. :.: . .
+sp|Q3K DKSQSKRRASNEKESAAPASPAPSPAPSPTPAPPQKEQPP-AETPTDAAVLTSPPAPAPP
+ 530 540 550 560 570 580
+
+ 50 60 70 80 90
+sp|Q1X VKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK------EQRRIERVLRNRAAAQ
+ : : . . . . .: . : ..: . :.:. ..: :. : .: :.
+sp|Q3K VTPSKPMAGTTDREEATRLLAEKRRQAREQREREEQERRLQAERDKRMREEQLAREAEAR
+ 590 600 610 620 630 640
+
+ 100 110 120 130 140
+sp|Q1X TSRE---RKRLEMEKLENEKIQMEQQNQFLLQRL-------SQMEAENNRLSQQLA-QLA
+ . :: :.: :.: :: : ::..: ::. :. ::: .:: .. :
+sp|Q3K AEREAEARRREEQEA--REKAQAEQEEQERLQKQKEEAEARSREEAERQRLEREKHFQQQ
+ 650 660 670 680 690 700
+
+ 150 160 170 180 190 200
+sp|Q1X AEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLE-RIPFPTPSLSDYSPTLKPSTL
+ . : : . : . .. : ::. : . : :. .. :: :. ..
+sp|Q3K EQERQERRKRLEEIMKRTRKSEVSETKQKQDSKEANANGSSPEPVKAVEARSPGLQKEAV
+ 710 720 730 740 750 760
+
+ 210 220 230 240 250 260
+sp|Q1X AESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAA--PLSDDDFNRLFHGDS
+ . . :.: :. . : .: : . . : :. . .. : .: ...:
+sp|Q3K QKEEPIPQEPQWSLPSKELPAS---LVNGLQPLPAHQENGFSTNGPSGDKSLSRTPETLL
+ 770 780 790 800 810
+
+ 270 280 290 300 310 320
+sp|Q1X SVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSS
+
+sp|Q3K PFAEAEAFLKKAVVQSPQVTEVL
+ 820 830 840
+
+>>sp|Q15642|CIP4_HUMAN Cdc42-interacting protein 4 OS=Ho (601 aa)
+ s-w opt: 147 Z-score: 133.9 bits: 34.0 E(516081): 6.1
+Smith-Waterman score: 147; 22.4% identity (50.2% similar) in 263 aa overlap (29-272:294-542)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKR-K
+ .:.:.::.. . . .:: . :...: :
+sp|Q15 DSHVLIELHKSGFARPGDVEFEDFSQPMNRAPSDSSLGTPS----DGRPELRGPGRSRTK
+ 270 280 290 300 310
+
+ 60 70 80 90 100
+sp|Q1X SW--GQEL------------PVPKT--NLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ : :.. :::.. : :: :. . .: . .. : :. :
+sp|Q15 RWPFGKKNKPRPPPLSPLGGPVPSALPNGPPSPRSGRDPLAILSEISKSVKPRLASFRSL
+ 320 330 340 350 360 370
+
+ 110 120 130 140 150
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA--EVRGSRANTPM
+ . .: . . .. ::: . : : :.: .. .:.... : : ... .::.
+sp|Q15 RGSRGTVVTEDFSHLPPEQQRKRLQQ---QLEERSRELQKEVDQREALKKMKDVYEKTPQ
+ 380 390 400 410 420 430
+
+ 160 170 180 190 200 210
+sp|Q1X PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS
+ :.::. : .. :: . :: .: ... . . . ..:.. . . :: :
+sp|Q15 MGDPASLEPQIAETLSNIERLKLEVQKYEAWLAEAESRVLSNRGDSLSRHARPPDPPA-S
+ 440 450 460 470 480 490
+
+ 220 230 240 250 260 270
+sp|Q1X VAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAF
+ . ...:: ..: :. : . . .: . : : :: : .
+sp|Q15 APPDSSSNSA------SQDTKESSEEPPSEESQDTPIYTEFDEDFEEEPTSPIGHCVAIY
+ 500 510 520 530 540
+
+ 280 290 300 310 320 330
+sp|Q1X DVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQ
+
+sp|Q15 HFEGSSEGTISMAEGEDLSLMEEDKGDGWTRVRRKEGGEGYVPTSYLRVTLN
+ 550 560 570 580 590 600
+
+>>sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive element-bi (428 aa)
+ s-w opt: 144 Z-score: 133.9 bits: 33.5 E(516081): 6.2
+Smith-Waterman score: 144; 25.8% identity (55.1% similar) in 178 aa overlap (25-199:161-322)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAK
+ .:. .: .. : . . . :..:
+sp|Q1L LPDQSGGTQCASETPQAQQTTGFPLTVKDLLLSGTPEPAAKVSQQSYQELILTEDEKRLL
+ 140 150 160 170 180 190
+
+ 60 70 80 90 100 110
+sp|Q1X KRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENE
+ .. :. :: ...: : .:. ..:.: .::. .:: ::..:. .. ::..
+sp|Q1L AKE--GMTLP---NQFPLTKY----EERILKKIRRKIRNKQSAQESRKKKKEYIDGLESR
+ 200 210 220 230 240
+
+ 120 130 140 150 160 170
+sp|Q1X KIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTL
+ .:. : ... :.: : : .:: .: : : .. .: :. .. . :. ::
+sp|Q1L MAACSAHNHELQRKVFQLEKCNISLMEQLRRLQALVMNG-SNKPVQAGTCVLVLLLSFTL
+ 250 260 270 280 290 300
+
+ 180 190 200 210 220 230
+sp|Q1X FKQERDELPLERIPFPTPSLS---DYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALP
+ . :: . :: ..: :.::
+sp|Q1L IL-----LPNLK-PFTDTKVSQHGDFSPMRVQSRSLHNLQSSRVLRNLDHPYSMTENAKI
+ 310 320 330 340 350
+
+>>sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS=Xeno (313 aa)
+ s-w opt: 141 Z-score: 133.6 bits: 33.0 E(516081): 6.4
+Smith-Waterman score: 141; 26.8% identity (60.6% similar) in 142 aa overlap (29-163:171-309)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS
+ ::. .: .: ... :. . .. .. : :
+sp|Q6D HQYQGVHHEEMGLPHHHPHHHQHQHHQTSPSPSGSSSSSQQLHHQQ-QHSSSSAVEDRFS
+ 150 160 170 180 190
+
+ 60 70 80 90 100 110
+sp|Q1X WGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEK
+ : . . .: . :. :.:. .:.: :.:.::. ::. : .. . ..::.::
+sp|Q6D DDQLVSMTVRELNRHLRGFTKDDVIRLKQKR--RTLKNRGYAQSCRYKRVQQKHNLEGEK
+ 200 210 220 230 240 250
+
+ 120 130 140 150 160 170
+sp|Q1X IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA----AEVRGSRANTPMPGSPATASPTLT
+ :. :: . : :..:.. : . . . .:: .. : . ... :.::
+sp|Q6D TQLVQQVEQLKQEVSRLARERDAYKIKCEKLANNNSSNFREAGSTSDNPSSPEFFM
+ 260 270 280 290 300 310
+
+ 180 190 200 210 220 230
+sp|Q1X PTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALP
+
+>>sp|P18625|FOSL2_CHICK Fos-related antigen 2 OS=Gallus (323 aa)
+ s-w opt: 141 Z-score: 133.4 bits: 33.0 E(516081): 6.6
+Smith-Waterman score: 141; 24.4% identity (54.8% similar) in 217 aa overlap (68-271:108-311)
+
+ 40 50 60 70 80 90
+sp|Q1X ADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK--TEDEKEQRRIERVLRNRA
+ :.. :.: . . .:.:.:::.: ::.
+sp|P18 SHPYSHPLPPLSSVAGHTALQRPGVIKTIGTTVGRRRRDEQLSPEEEEKRRIRRE-RNKL
+ 80 90 100 110 120 130
+
+ 100 110 120 130 140 150
+sp|Q1X AAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS--
+ :: :.:.: :::. : .:.... : ....... :...: .:. . . :
+sp|P18 AAAKCRNRRRELTEKLQAETEVLEEEKSVLQKEIAELQKEKEKLEFMLVAHSPVCKISPE
+ 140 150 160 170 180 190
+
+ 160 170 180 190 200
+sp|Q1X -RANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSL---SDYSPTLKPSTLAES
+ : . : . .. . . .. ::: :.:. .:. :: . ..:: ..: .
+sp|P18 ERRSPPTSSLQSVRTGASGAVVVKQE----PVEE-EIPSSSLVLDKAQRSVIKPISIAGG
+ 200 210 220 230 240 250
+
+ 210 220 230 240 250 260
+sp|Q1X --SDVAQHPAVSVAGLEGDGSALPLFDLGSD---LKHHSTDDVAAPLSDDDFNRLFHGDS
+ .. : . . : .. : . ::. . . .. : .::: .. : :
+sp|P18 YYGEEALNTPIVV-------TSTPAITPGSSNLVFTYPNVLDQESPLSPSESCSKAHRRS
+ 260 270 280 290 300
+
+ 270 280 290 300 310 320
+sp|Q1X SVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSS
+ : :.:
+sp|P18 SSSGDQSSDSLNSPTLLAL
+ 310 320
+
+>>sp|Q3UHR0|BAHC1_MOUSE BAH and coiled-coil domain-conta (2643 aa)
+ s-w opt: 159 Z-score: 133.2 bits: 36.0 E(516081): 6.7
+Smith-Waterman score: 159; 23.0% identity (49.5% similar) in 382 aa overlap (8-338:860-1230)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTV--SPADTSL
+ .: :: :: :... .: .: :
+sp|Q3U SLWMGGHSYGLGHPALHQNLPPGFPASVPGSMPSVFPLPQDAATQLVILPSEPTPHTTPH
+ 830 840 850 860 870 880
+
+ 40 50 60 70 80 90
+sp|Q1X NSADVKTQE-VKPE---EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL
+ . :.: : . : . ::.. . :: :: .:.. ..: ...
+sp|Q3U TLAEVMDQASLWPPMYGARGPASHMQHPGQ--------LPVYSRSQLLRQQELYALQQQQ
+ 890 900 910 920 930 940
+
+ 100 110 120 130 140
+sp|Q1X RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL-LQRLSQMEAENNRLSQQLAQLAAE-
+ ... : ...... .... .... :... .: : :::..:.. . . ..: . : :
+sp|Q3U QQQQQQQQQQQQQQQQQQQQQQQQQQQHRATQALELQRVAQFQRKPEDRHMELEEAAQEK
+ 950 960 970 980 990 1000
+
+ 150 160 170 180 190
+sp|Q1X ----VRGSRANTPMP-GSPATASPTL--------TPTLFKQERDELPLER--IPFPTPSL
+ .. : ::: :.:..:. : .::: : : : :
+sp|Q3U TPKSTHKPVALTPMAKGTPSSATAGLVKLSPCCQSPTLKTPASCPTPPPRPSAPCTLPIC
+ 1010 1020 1030 1040 1050 1060
+
+ 200 210 220 230 240
+sp|Q1X SDYSP---TLKPSTLAESSDVAQHPAVSVAGLEGDGS-----------ALPLFDLGSDLK
+ :: . :::. ..:. .:. ..... :: : . .:: .:::.
+sp|Q3U PTGSPGPGSKVPSTM-DKSEEGQRAGTNLTTLEPDLTPGLNPTAGLDLSLPSDVHSSDLQ
+ 1070 1080 1090 1100 1110 1120
+
+ 250 260 270 280 290
+sp|Q1X HHSTDDVAAPLSDDDFNRLF-HGDSSVEPDSSVFEDGL---AFDVLEGGDLSAFPFDSMV
+ .: ....: . . : : :. .. : :: : :. . ::. .:
+sp|Q3U DPKTMQTTTPGTRPEPPRTFLPGEPPPCSPRNLEEPGLLSRARDATQ--DLANLPPPVEG
+ 1130 1140 1150 1160 1170
+
+ 300 310 320 330 340
+sp|Q1X NFDS----EPVTLEGIE------MAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ .. .: :::.. . .: :.: .:.:.: :. : .:
+sp|Q3U GLPPGKAEDPSPLEGLQALKFGDLLEGGGTEATGQTNSTQGGMQNERTVDQGAPQPPLGA
+ 1180 1190 1200 1210 1220 1230
+
+sp|Q3U TPQALEQEAGSPAALDKREGPQKVPDVAQLQEEETQLEESGGDSEVDWGTPNHSHPPKAL
+ 1240 1250 1260 1270 1280 1290
+
+>>sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus mus (295 aa)
+ s-w opt: 140 Z-score: 133.2 bits: 32.9 E(516081): 6.8
+Smith-Waterman score: 140; 25.8% identity (54.3% similar) in 151 aa overlap (2-148:142-290)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPA---TPASEVPVLTV
+ .: :.. . . ::: ::. :
+sp|Q8B GLQPASSTAPSVMDLSSRATAPLHPGIPSPNC-MQSPIRPGQLLPANRNTPSPIDPDTIQ
+ 120 130 140 150 160 170
+
+ 30 40 50 60 70 80
+sp|Q1X SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQEL-PVPKTNLPPRKRAKTEDEKEQRRI
+ :. . ::. . . .: .::: .:: : : . :: .: :...
+sp|Q8B VPVGYEPDPADLALSSIPGQEMFDPRKRKFSEEELKPQPMIK-KARKVFIPDDLKDDKYW
+ 180 190 200 210 220
+
+ 90 100 110 120 130 140
+sp|Q1X ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA
+ : .: ::. ::. .::. ... . .:..:. : :...... : .. .. ::.
+sp|Q8B ARRRKNNMAAKRSRDARRLKENQIAIRASFLEKENSALRQEVADLRKELGKCKNILAKYE
+ 230 240 250 260 270 280
+
+ 150 160 170 180 190 200
+sp|Q1X AEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLA
+ :
+sp|Q8B ARHGPL
+ 290
+
+>>sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Homo sa (295 aa)
+ s-w opt: 140 Z-score: 133.2 bits: 32.9 E(516081): 6.8
+Smith-Waterman score: 140; 25.8% identity (54.3% similar) in 151 aa overlap (2-148:142-290)
+
+ 10 20
+sp|Q1X MSCDMEKTMSSVDSLPA---TPASEVPVLTV
+ .: :.. . . ::: ::. :
+sp|Q16 GLQPASSAAPSVMDLSSRASAPLHPGIPSPNC-MQSPIRPGQLLPANRNTPSPIDPDTIQ
+ 120 130 140 150 160 170
+
+ 30 40 50 60 70 80
+sp|Q1X SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQEL-PVPKTNLPPRKRAKTEDEKEQRRI
+ :. . ::. . . .: .::: .:: : : . :: .: :...
+sp|Q16 VPVGYEPDPADLALSSIPGQEMFDPRKRKFSEEELKPQPMIK-KARKVFIPDDLKDDKYW
+ 180 190 200 210 220
+
+ 90 100 110 120 130 140
+sp|Q1X ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA
+ : .: ::. ::. .::. ... . .:..:. : :...... : .. .. ::.
+sp|Q16 ARRRKNNMAAKRSRDARRLKENQIAIRASFLEKENSALRQEVADLRKELGKCKNILAKYE
+ 230 240 250 260 270 280
+
+ 150 160 170 180 190 200
+sp|Q1X AEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLA
+ :
+sp|Q16 ARHGPL
+ 290
+
+>>sp|Q9NZ53|PDXL2_HUMAN Podocalyxin-like protein 2 OS=Ho (605 aa)
+ s-w opt: 146 Z-score: 133.0 bits: 33.9 E(516081): 6.9
+Smith-Waterman score: 146; 25.3% identity (51.9% similar) in 285 aa overlap (32-294:107-375)
+
+ 10 20 30 40 50
+sp|Q1X SCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPE--EKKPAKKRKSW
+ :.::. . . .. : :. :: . . :
+sp|Q9N PGSGFPSEENEESRILQPPQYFWEEEEELNDSSLDLGPT-ADYVFPDLTEKAGSIEDTSQ
+ 80 90 100 110 120 130
+
+ 60 70 80 90 100
+sp|Q1X GQELP-----VPKTNL-------PPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE
+ .:::: .:: :: :::.. . :.:.:.:. :.: . : .:...:
+sp|Q9N AQELPNLPSPLPKMNLVEPPWHMPPREEEEEEEEEEEREKEEVEK-----QEEEEEEELL
+ 140 150 160 170 180 190
+
+ 110 120 130 140 150 160
+sp|Q1X MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATAS
+ . .:. . : .: : :: . .. .. .. :. : .... : .:.
+sp|Q9N PVNGSQEEAK-PQVRDFSLTSSSQTPGATKSRHEDSGDQASS--GVEVESSM--GPSLLL
+ 200 210 220 230 240
+
+ 170 180 190 200 210 220
+sp|Q1X PTLTPTLFKQ-ERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGD
+ :..::: ..: : :. . :. :.:. : :....: . .
+sp|Q9N PSVTPTTVTPGDQDSTSQEAEATVLPAAGLGVEFEAPQ---EASEEATAGAAGLSGQHEE
+ 250 260 270 280 290 300
+
+ 230 240 250 260 270 280
+sp|Q1X GSALPLFDLG---SDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVF-EDGLAFDVL
+ ::: : : .: . : ... : . . : :: . :.:... .. : ..:
+sp|Q9N VPALPSFPQTTAPSGAEHPDEDPLGSRTSAS--SPLAPGDMELTPSSATLGQEDLNQQLL
+ 310 320 330 340 350 360
+
+ 290 300 310 320 330
+sp|Q1X EGGDLSA---FPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQ
+ :: : .:.::
+sp|Q9N EGQAAEAQSRIPWDSTQVICKDWSNLAGKNYIILNMTENIDCEVFRQHRGPQLLALVEEV
+ 370 380 390 400 410 420
+
+>>sp|Q7TSC1|BAT2_MOUSE Large proline-rich protein BAT2 O (2158 aa)
+ s-w opt: 157 Z-score: 132.9 bits: 35.7 E(516081): 6.9
+Smith-Waterman score: 157; 27.2% identity (48.4% similar) in 217 aa overlap (18-222:378-571)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSL--NSADVKTQEV
+ .:.::.: : :. :. .:. .
+sp|Q7T RDSDEEGAEGHKDSQSAAAEEPETDGKKGTSPGSELP-----PPKTAWTENARPSETEPA
+ 350 360 370 380 390 400
+
+ 50 60 70 80 90
+sp|Q1X KPEEKKPAKKRK-----SWGQELPVPKTNLPPRKRAKTEDEKE---QRRIERVLRNRAAA
+ : : : . .:: : . :: : ::: : ::: . . :.
+sp|Q7T PPTPKPPPPPPHRGPVGNWGPPGDYPDRGGPPCKPPAPEDEDEAWRQRRKQSSSEISLAV
+ 410 420 430 440 450 460
+
+ 100 110 120 130 140 150
+sp|Q1X QTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ-MEAENNRLSQQLAQLAAEVRGSRAN
+ . .:.:.. : .....:. .. :.::.. . : ..::. :. ::
+sp|Q7T ERARRRREEEERRMQEERRAACAEK---LKRLDEKFGAPDKRLK---AEPAA--------
+ 470 480 490 500
+
+ 160 170 180 190 200 210
+sp|Q1X TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSD-VAQH
+ : : .:: .:.: :.. :. : : ::: :. : . : : ::
+sp|Q7T -P-PVTPA--APALPPVVPKEIPAAPALPPTPTPTPEKEPEEPAQAPPVQAAPSPGVAPV
+ 510 520 530 540 550 560
+
+ 220 230 240 250 260 270
+sp|Q1X PAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFED
+ :.. .:
+sp|Q7T PTLVSGGGCTANSNSSGSFEASPVEPQLPSKEGPEPPEEVPPPTTPPAPKMEPKGDGVGS
+ 570 580 590 600 610 620
+
+>>sp|O35451|ATF6B_MOUSE Cyclic AMP-dependent transcripti (699 aa)
+ s-w opt: 147 Z-score: 132.7 bits: 34.0 E(516081): 7.1
+Smith-Waterman score: 147; 23.6% identity (50.8% similar) in 254 aa overlap (16-241:259-500)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTS--LNSADVKTQ
+ :.. : . :. .:: . : .. ...:
+sp|O35 SSGKAPATRKPPLQPKPVVLTTVPVPPRAGPTSAAVLLQPLVQQPAVSPVVLIQGAIRVQ
+ 230 240 250 260 270 280
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRER
+ : : .::: :.: .. ::. : : .: .:...:: .: ::..
+sp|O35 PEGPAPAAPRPERKSI-VPAPMPGNSCPPE-----VDAKLLKRQQRMIKNRESACQSRRK
+ 290 300 310 320 330 340
+
+ 110 120 130 140 150
+sp|Q1X KRLEMEKLEN-------EKIQMEQQNQFLLQRLSQMEAENNRL-----SQQLAQLAAEVR
+ :. .. :: .. :....: : .:: . :::. : ..... . . .
+sp|O35 KKEYLQGLEARLQAVLADNQQLRRENAALRRRLEALLAENSGLKLGSGNRKVVCIMVFLL
+ 350 360 370 380 390 400
+
+ 160 170 180 190 200
+sp|Q1X GSRANT-PMPGSPATASPTLTPTLFKQE-RDELPLERIPFPTPSLSDYSPTLKPSTLAES
+ : :. : .: ..: . ..: : . : . : :. . ..: : .
+sp|O35 FIAFNFGPVSISEPPPAP-MSPRMSREEPRPQRHLLGFSEPGPAHG-----MEPLREAAQ
+ 410 420 430 440 450
+
+ 210 220 230 240 250
+sp|Q1X SDVAQHPAVS-------VAGLEGDGSALPLFDL-----GSDLKHHSTDDVAAPLSDDDFN
+ : :.:. . .... : .. : : :: .:: .:
+sp|O35 SPGEQQPSSAGRPSFRNLTAFPGGAKELLLRDLDQLFLSSDCRHFNRTESLRLADELSGW
+ 460 470 480 490 500 510
+
+ 260 270 280 290 300 310
+sp|Q1X RLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDE
+
+sp|O35 VQRHQRGRRKIPHRAQERQKSQLRKKSPPVKPVPTQPPGPPERDPVGQLQLYRHPGRSQP
+ 520 530 540 550 560 570
+
+>>sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcripti (703 aa)
+ s-w opt: 147 Z-score: 132.7 bits: 34.0 E(516081): 7.2
+Smith-Waterman score: 147; 24.8% identity (51.2% similar) in 254 aa overlap (17-241:260-503)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLT--VSPADTS---LNSADVK
+ :.: : . .: :.: .: : .. ..
+sp|Q99 DGSSGKALPTRKPPLQPKPVVLTTVPMPSRAVPPSTTVLLQSLVQPPPVSPVVLIQGAIR
+ 230 240 250 260 270 280
+
+ 50 60 70 80 90 100
+sp|Q1X TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR
+ .: : . : .::: :.: .. ::. : : .: .:...:: .: ::
+sp|Q99 VQPEGPAPSLPRPERKSI-VPAPMPGNSCPPEV-----DAKLLKRQQRMIKNRESACQSR
+ 290 300 310 320 330 340
+
+ 110 120 130 140
+sp|Q1X ERKRLEMEKLEN-------EKIQMEQQNQFLLQRLSQMEAENNRL-----SQQLAQLAAE
+ ..:. .. :: .. :....: : .:: . :::..: ..... . .
+sp|Q99 RKKKEYLQGLEARLQAVLADNQQLRRENAALRRRLEALLAENSELKLGSGNRKVVCIMVF
+ 350 360 370 380 390 400
+
+ 150 160 170 180 190
+sp|Q1X VRGSRANT-PMPGSPATASPTLTPTLFK---QERDEL-------PLERI-PFPTPSLSDY
+ . : :. : ..: ..: . : : : .: :.. . :. : .
+sp|Q99 LLFIAFNFGPVSISEPPSAP-ISPRMNKGEPQPRRHLLGFSEQEPVQGVEPLQGSSQGPK
+ 410 420 430 440 450 460
+
+ 200 210 220 230 240 250
+sp|Q1X SPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFN
+ : .:. :... :. . : : . :: :.:: .:
+sp|Q99 EPQPSPTDQPSFSNLTAFPGGAKELLLRDLDQ--LF-LSSDCRHFNRTESLRLADELSGW
+ 470 480 490 500 510
+
+ 260 270 280 290 300 310
+sp|Q1X RLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDE
+
+sp|Q99 VQRHQRGRRKIPQRAQERQKSQPRKKSPPVKAVPIQPPGPPERDSVGQLQLYRHPDRSQP
+ 520 530 540 550 560 570
+
+>>sp|Q3UIW5|RNF10_MOUSE RING finger protein 10 OS=Mus mu (804 aa)
+ s-w opt: 148 Z-score: 132.5 bits: 34.2 E(516081): 7.3
+Smith-Waterman score: 148; 24.4% identity (55.0% similar) in 209 aa overlap (80-285:588-784)
+
+ 50 60 70 80 90 100
+sp|Q1X KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ :. :.:. .: ...: . ::: :.:::
+sp|Q3U SHLPLTCEFSICELALQPPVVSKETLEMFSDDIEKRKRQR--QKKAREERRRER-RIEME
+ 560 570 580 590 600 610
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRL---SQQLAQLAAEVRGSRANTPMPGSPATA
+ ::.. . .. :. :.:. : :. .. :. ..: .:. . .:. ::..
+sp|Q3U --ENKRQGRYPEVHIPLENLQQFPAFNSYTCPSDSALGPTSTEGHGALSLSPLSRSPGSH
+ 620 630 640 650 660 670
+
+ 170 180 190 200 210 220
+sp|Q1X SPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGD
+ . : : . : : . :: : :: :. . . . . . ..: . :
+sp|Q3U ADFLLTPLSPTASQGSP----SFCVGSLEDDSPFLSFAQMLRVGKAKADGWPKTAPKKDD
+ 680 690 700 710 720
+
+ 230 240 250 260 270 280
+sp|Q1X GSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGD
+ .: .: . :: . ..: : .: ...:.. ... . .. :. . : :. : .::
+sp|Q3U NSLVPPAPVDSDGESDNSDRVPVPSFQNSFSQAIEA-AFMKLDTPATSDPLSED--RGGK
+ 730 740 750 760 770 780
+
+ 290 300 310 320 330 340
+sp|Q1X LSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q3U KRKRQKQKLLFSTSVVHTK
+ 790 800
+
+>>sp|Q6C908|PAN1_YARLI Actin cytoskeleton-regulatory com (1634 aa)
+ s-w opt: 154 Z-score: 132.4 bits: 35.2 E(516081): 7.5
+Smith-Waterman score: 154; 26.2% identity (50.6% similar) in 320 aa overlap (16-311:1113-1403)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVS-PADTSLNSADVKTQE
+ ::: . .:.. :: ::: : : .:
+sp|Q6C SPAVASPAATPAVSSPAPVSRGVPAPAAATPATDPATTPAVPVSAPADDS----DSDDEE
+ 1090 1100 1110 1120 1130
+
+ 50 60 70 80 90 100
+sp|Q1X VKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERK
+ :: :.::. :: : . .:. :.::.:.. ::. : ::
+sp|Q6C Y---EKLMAQKRE---QEERFKKQQEADKKK---EEEKKQKK---------AAKEERMRK
+ 1140 1150 1160 1170 1180
+
+ 110 120 130 140 150 160
+sp|Q1X -RLEMEKLEN-EKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG-SRANTPMPG
+ : ::: : :: :.:. .. :::.. . :: .. .. . : . : . .
+sp|Q6C LREEMEANEAREKAWKESQS----KEAEADEAEGDVGAAALAAFSNKATAPSTTPTAVAA
+ 1190 1200 1210 1220 1230
+
+ 170 180 190 200 210
+sp|Q1X SP--ATASPTLTPTLFKQERDELPLERI--------PFPTPSLSDYSPTLKPSTLAESSD
+ .: ::..:. . :. :..:. :. . : .: :.:.: ..
+sp|Q6C TPPVATSTPSPAAPTVPAADDNNPFHRLNNGGDAAAAAPAAGGEDNNPFLRPGT--NQPI
+ 1240 1250 1260 1270 1280 1290
+
+ 220 230 240 250 260
+sp|Q1X VAQHPA-VSVAGLEGDGSALP--LFDLGSDLKHHSTDDVAAPLS-DDDFNRLFHGDSSVE
+ .: :: : : :. . : . . .. . ..:: .: :.: .. .: ...:
+sp|Q6C AAPSPASFSEAPKEAPKPVDPVKISNQRANQRAAKNDDDDWGMSSDEDDDQDYHRGNAAE
+ 1300 1310 1320 1330 1340 1350
+
+ 270 280 290 300 310 320
+sp|Q1X PDSSVFEDGLAFDVLE----GGDLSAFPFDSMVNFD--SEPVTLEGIEMAHGLPDETTCK
+ :..:. .: . . :. ..: : : . ::. ..:.:
+sp|Q6C LASQLFRT-MAPPIQRQPTGGAPITATPTGSAPAAPPAAPPVAPAAVEVAVAASEATPGP
+ 1360 1370 1380 1390 1400 1410
+
+ 330 340
+sp|Q1X TSSVQPGFGASTTRCDGQGIAAGC
+
+sp|Q6C ESAPPAPPMPEINIPPATEAPSAPAATEAPPAPPSAPTTIETTHLPPPVDTHNDMSSSEF
+ 1420 1430 1440 1450 1460 1470
+
+>>sp|Q9W705|NCOA2_XENLA Nuclear receptor coactivator 2 O (1516 aa)
+ s-w opt: 153 Z-score: 132.1 bits: 35.0 E(516081): 7.8
+Smith-Waterman score: 153; 22.4% identity (54.8% similar) in 290 aa overlap (61-333:1188-1460)
+
+ 40 50 60 70 80 90
+sp|Q1X ADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERV
+ :.: : .:. . : : : .
+sp|Q9W RPGLRPTGMVQNQPNQLRLQLQHRLQAQNRQQLMNPINNVSNMNLAMRPGVPGQLREQGP
+ 1160 1170 1180 1190 1200 1210
+
+ 100 110 120 130 140
+sp|Q1X LRNRAAAQTSRE--RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA
+ . . :: .:: ..:....:.... :..::.: :. .:.. .... .:: . :
+sp|Q9W INAQMLAQRQREILSQHLRQKQLQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQHRAM
+ 1220 1230 1240 1250 1260 1270
+
+ 150 160 170 180 190 200
+sp|Q1X EVRGSRANTP--MPGSPATASPTLTPTLFKQERDELPLER-----IPFPTPSLSDYSPTL
+ .:.. : : :: . . .: . . ...:. :: : : : .:: .
+sp|Q9W MMRSQGLAMPPNMVGSGGIPASINSPRIPQGSTQQFPFPPNYGTGIPSPPPFTSPFSP-V
+ 1280 1290 1300 1310 1320 1330
+
+ 210 220 230 240 250
+sp|Q1X KPS----TLAESSDVAQHPAVSVAGLEGD--GSALPLFDLGSDLKHHSTDDVAAPLSDDD
+ :: .:..:: ... .. :. :. :. :. .. ...:.. . . . .:...
+sp|Q9W PPSPGSQSLSHSSLHGSQMNLANQGIMGSMGGQYGPV--MNPQMQHNAFQFANSGMSQQS
+ 1340 1350 1360 1370 1380 1390
+
+ 260 270 280 290 300 310
+sp|Q1X FNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVN--FDSEPVTLEGIEMAHG
+ . : : .. :.: .. . : :.. .:..: ..:: :.: :.:
+sp|Q9W -DPGFTGATT--PQSPIMSPRM------GHIQSSMMQQSQANPAYQSE---LNG--WAQG
+ 1400 1410 1420 1430 1440
+
+ 320 330 340
+sp|Q1X LPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+ : .. ... : :: ..
+sp|Q9W NPAGNSMFSQQSPPHFGQQSGTSMYNSNNMNISVSMAANGNGMNNMNQMTGQINMTSVTS
+ 1450 1460 1470 1480 1490 1500
+
+>>sp|O60841|IF2P_HUMAN Eukaryotic translation initiation (1220 aa)
+ s-w opt: 151 Z-score: 132.0 bits: 34.7 E(516081): 7.9
+Smith-Waterman score: 151; 24.4% identity (58.3% similar) in 180 aa overlap (7-183:282-455)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLN
+ :. .::. . :::: . : . :. . :
+sp|O60 KLKEKEELETGKKDQSKQKESQRKFEEETVKSKVTVDT-GVIPASEEKAETPTAAEDD-N
+ 260 270 280 290 300
+
+ 40 50 60 70 80 90
+sp|Q1X SADVKTQEVKPE--EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE-RVLRN
+ .: : .. : . ::. .:.:. : . :. . : :.:...:. : :. :
+sp|O60 EGDKKKKDKKKKKGEKEEKEKEKKKGPSKATVKAMQEALAKLKEEEERQKREEEERIKRL
+ 310 320 330 340 350 360
+
+ 100 110 120 130 140 150
+sp|Q1X RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS
+ . .:..:::.:: : .: : :.. . :.. ... ....: .. :. . .. .
+sp|O60 EELEAKRKEEERLEQEKRERKK-QKEKERKERLKKEGKLLTKSQREARARAEATLKLLQA
+ 370 380 390 400 410 420
+
+ 160 170 180 190 200 210
+sp|Q1X RANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVA
+ .. . .:.. . : : ..: ..:
+sp|O60 QG-VEVPSKDSL--PKKRPIYEDKKRKKIPQQLESKEVSESMELCAAVEVMEQGVPEKEE
+ 430 440 450 460 470 480
+
+>>sp|P15205|MAP1B_RAT Microtubule-associated protein 1B (2459 aa)
+ s-w opt: 157 Z-score: 131.9 bits: 35.7 E(516081): 7.9
+Smith-Waterman score: 157; 21.8% identity (54.5% similar) in 330 aa overlap (12-323:595-900)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVK
+ :.: :.. .::: : . : .:.:
+sp|P15 PEATKASQVEKTPKVESKEKVIVKKDKPGKVESKPSVTEKEVP----SKEEQSPVKAEV-
+ 570 580 590 600 610
+
+ 50 60 70 80 90
+sp|Q1X TQEVKPEEKKPAKKRKSWGQEL---PVPKTNLPPRKR-AKTEDEKEQRRIERVLRNRAAA
+ .... : : . : : .:. : : . :.:. :: ::. .. :. ...:
+sp|P15 AEKAATESKPKVTKDKVVKKEIKTKPEEKKEEKPKKEVAKKEDKTPLKKDEKPKKEEAKK
+ 620 630 640 650 660 670
+
+ 100 110 120 130 140 150
+sp|Q1X QTSRERKRLEMEKLENEKIQMEQ-----QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG
+ . ..: :. : ..:..: .. : ... .. .... :... .... ... ...
+sp|P15 EIKKEIKKEEKKELKKE-VKKETPLKDAKKEVKKDEKKEVKKEEKEPKKEIKKISKDIKK
+ 680 690 700 710 720 730
+
+ 160 170 180 190 200
+sp|Q1X SRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPT--LKP---STLA
+ : ::. . :. : : . :.:. : .. :. . .:.: . . .: .: :
+sp|P15 S---TPLSDTKKPAA--LKPKVAKKEE---PTKKEPIAAGKLKDKGKVKVIKKEGKTTEA
+ 740 750 760 770 780 790
+
+ 210 220 230 240 250 260
+sp|Q1X ESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGD----
+ .. :. ....::. ..: : : : .. : .:.. ::..: .
+sp|P15 AATAVGTAAVAAAAGVAASGPAKELEAERSLMS--SPEDLTK-----DFEELKAEEIDVA
+ 800 810 820 830 840
+
+ 270 280 290 300 310 320
+sp|Q1X SSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTS
+ ....:. ..:: . : :. .. .. :. : ::: ..: : :. .
+sp|P15 KDIKPQLELIEDEEKLKETEPGEAYVIQKETEVSKGSAESPDEGITTTEG---EGECEQT
+ 850 860 870 880 890 900
+
+ 330 340
+sp|Q1X SVQPGFGASTTRCDGQGIAAGC
+
+sp|P15 PEELEPVEKQGVDDIEKFEDEGAGFEESSEAGDYEEKAETEEAEEPEEDGEDNVSGSASK
+ 910 920 930 940 950 960
+
+>>sp|Q9M7Q3|AI5L6_ARATH ABSCISIC ACID-INSENSITIVE 5-like (454 aa)
+ s-w opt: 142 Z-score: 131.6 bits: 33.2 E(516081): 8.3
+Smith-Waterman score: 142; 31.7% identity (55.9% similar) in 145 aa overlap (14-145:291-435)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEV-P-VLTVS--PADTSLNSA-
+ : ::: .:: : .: . : ...: .:
+sp|Q9M QPQQLIQTQERPFPKQTTIAFSNTVDVVNRSQPATQCQEVKPSILGIHNHPMNNNLLQAV
+ 270 280 290 300 310 320
+
+ 40 50 60 70 80 90
+sp|Q1X DVKT----QEVKP-EEKKPAKKRKSW--GQELPVPKTNLPPRKRAKTEDEKEQRRIERVL
+ : :: :.: . .: :: .. ::: :: . . .. .:: .:..
+sp|Q9M DFKTGVTVAAVSPGSQMSPDLTPKSALDASLSPVPYMFGRVRKTGAVLEKVIERRQKRMI
+ 330 340 350 360 370 380
+
+ 100 110 120 130 140 150
+sp|Q1X RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ-MEAENNRLSQQLAQLAAEV
+ .:: .: :: ::. .:: : :... :. : .. . :: ..:.: . : :
+sp|Q9M KNRESAARSRARKQAYTMELEAEIAQLKELNEELQKKQVEIMEKQKNQLLEPLRQPWGMG
+ 390 400 410 420 430 440
+
+ 160 170 180 190 200 210
+sp|Q1X RGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS
+
+sp|Q9M CKRQCLRRTLTGPW
+ 450
+
+>>sp|Q69022|EBNA2_EBVA8 Epstein-Barr nuclear antigen 2 O (454 aa)
+ s-w opt: 142 Z-score: 131.6 bits: 33.2 E(516081): 8.3
+Smith-Waterman score: 142; 24.4% identity (47.3% similar) in 205 aa overlap (10-209:236-424)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPAS-EVPVLTVSPADTSLNSA
+ :. .:: :.: .: .:.:: .:
+sp|Q69 PPTAPQRLTLGHQLSLPPHPPPHQSTPHCSSDSTGLPPPPTSYSIPSMTLSPEPLPPPAA
+ 210 220 230 240 250 260
+
+ 40 50 60 70 80 90
+sp|Q1X DVKTQE--VKPEEKKPAKKRKSWGQEL--PVPKTNLPPRKRAKTEDEKEQRRIERVLRNR
+ .. . .. : : . :.: :. :: . . :. . : : :.:
+sp|Q69 PAHPLPGVIYDQQALPPTPGPPWWPPVRDPTPTTQTPPTNTKQGPDQGQGRG--R-WRGR
+ 270 280 290 300 310 320
+
+ 100 110 120 130 140 150
+sp|Q1X AAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR
+ . : . : .:.:: . . . .. . .:: . . : : . . . :
+sp|Q69 G-----RSKGRGRMHKLPEPRRPGPDTSSPSMPQLSPVVS----LHQGQGPENSPTPGPS
+ 330 340 350 360 370
+
+ 160 170 180 190 200 210
+sp|Q1X ANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQ
+ . :. .:.: ..: . : :. :: :: . : :::.:. : ::
+sp|Q69 TAGPVCRVTPSATPDISPIHEPESSDS---EEPPFLFPS-DWYPPTLEPAELDESWEGIF
+ 380 390 400 410 420
+
+ 220 230 240 250 260 270
+sp|Q1X HPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFE
+
+sp|Q69 ETTESHSSDEENVGGPSKRPRTSTQ
+ 430 440 450
+
+>>sp|Q9ES64|USH1C_MOUSE Harmonin OS=Mus musculus GN=Ush1 (910 aa)
+ s-w opt: 148 Z-score: 131.5 bits: 34.2 E(516081): 8.3
+Smith-Waterman score: 148; 23.1% identity (48.9% similar) in 333 aa overlap (15-333:386-687)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEV-PVLTVSPADTS-LNSADVKT
+ :: : ..:: :: .: . . . : :
+sp|Q9E YRKEMEQISEEEEKFKKQWEEDWGSKEQLILPKTITAEVHPVPLRKPKSFGWFYRYDGKF
+ 360 370 380 390 400 410
+
+ 50 60 70 80 90 100
+sp|Q1X QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE
+ .. . :. : . . :.: : .: ... : :. .. ... :: : ..: :
+sp|Q9E PTIRKKAKEKKKAKYDSLQDLRKNKKELEFEQKLYKEKEEMLEKEKQLKINRLAQEVS-E
+ 420 430 440 450 460 470
+
+ 110 120 130 140 150 160
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS
+ .: ..: :.:: .:. ..:: : .:: .:... :. .. : :
+sp|Q9E TEREDLE--ESEK------TQYWVERLCQ-----TRL-EQISSAENEIPEMTTGPPPP--
+ 480 490 500 510
+
+ 170 180 190 200 210
+sp|Q1X PATASPTLTPT--------LFKQERDELPLERIPFP--TPSLSDYSPTLKPSTLAESSDV
+ : ..:: : : . :..::. . .: ::: : .: .. : :
+sp|Q9E PPSVSPLAPPLRRFAGGIHLHTTDLDDIPLDMFYYPPKTPSALPVMP--HPPSVNSPSKV
+ 520 530 540 550 560 570
+
+ 220 230 240 250 260 270
+sp|Q1X AQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSV
+ :.. .: ...: : ... . : . .. . . ..: :.
+sp|Q9E PAPPVLPSSGHVSSSS--------SPWVQRTPPPIPIPPPPSIPTQDL---TPTRPLPSA
+ 580 590 600 610 620
+
+ 280 290 300 310 320 330
+sp|Q1X FEDGLAFDVLEGGDLSAFPFDSM-VNFDS-EPVTLEGIEMAHGLPDETTCKTSSVQPGFG
+ .:..:. .. :: . : :. .: : .: . : . .: : . . : :
+sp|Q9E LEEALGNHPFRTGD-PGHPADDWEANTHSGKPSSSPTTERSFPPAPKTFCPSPQPPRGPG
+ 630 640 650 660 670 680
+
+ 340
+sp|Q1X ASTTRCDGQGIAAGC
+ .::
+sp|Q9E VSTISKPVMVHQEHNFVYRPAVKSEVLPQEMLKRMVVYQTAFRQDFRKYEEGFDPYSMFS
+ 690 700 710 720 730 740
+
+>>sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS=Xeno (289 aa)
+ s-w opt: 138 Z-score: 131.5 bits: 32.5 E(516081): 8.4
+Smith-Waterman score: 138; 30.6% identity (68.2% similar) in 85 aa overlap (83-167:203-284)
+
+ 60 70 80 90 100 110
+sp|Q1X AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE
+ .:.: :.:.::. ::. : .. . . ::
+sp|Q4U RFSDEQLVSMSVRELNRQLRGFSKEEVIRLKQKR--RTLKNRGYAQSCRYKRVQQRHILE
+ 180 190 200 210 220 230
+
+ 120 130 140 150 160 170
+sp|Q1X NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP
+ .:: :...: . : :..:.. : . ... .::.. .: . :. :.:. :.
+sp|Q4U TEKCQLQSQVEQLKQEVSRLAKERDLYKDKYEKLASRSFTTRESPPQ-GNPGKANADFFM
+ 240 250 260 270 280
+
+ 180 190 200 210 220 230
+sp|Q1X TLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL
+
+>>sp|P29681|IMPE2_DROME 20-hydroxyecdysone protein OS=Dr (466 aa)
+ s-w opt: 142 Z-score: 131.3 bits: 33.2 E(516081): 8.5
+Smith-Waterman score: 142; 25.5% identity (57.1% similar) in 184 aa overlap (8-181:14-192)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVS----PADTSLNSADVKTQEVKPEEK
+ ... : .:: : ..:: : :. :: . .::..::::::
+sp|P29 MKPVALILVFLAISQARVLNLPKE-AIDIPVAIVEDKEPPVALSLVKEEVKAEEVKPEEV
+ 10 20 30 40 50
+
+ 60 70 80 90 100
+sp|Q1X KP-AKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEME
+ :: :...:. . : : :. : :.. :.. :. . .:. . ...
+sp|P29 KPIAQEEKAKDLKEEVKPEIKPEIKEQPKPDIKDE--IKEDLKADIKEEL-KEKIEEQIN
+ 60 70 80 90 100 110
+
+ 110 120 130 140 150 160
+sp|Q1X KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATAS--
+ .: : : .: ... : . . .: ... . .. . :.:.. :.. . . :: .
+sp|P29 ELPNAK-PLELKEKSLEAEEKPQEIKEEVQQPEIKKEATEIKEEPAQNILKSLPAEETVV
+ 120 130 140 150 160 170
+
+ 170 180 190 200 210 220
+sp|Q1X -PT--LTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLE
+ :. :.:. .::..:
+sp|P29 VPAEELSPNPVEQEQSENQDAAHPQVRQATQATPTQQSTTQGNFVQQLIQNSPIGQFLNQ
+ 180 190 200 210 220 230
+
+>>sp|Q54Y73|BZPD_DICDI Probable basic-leucine zipper tra (834 aa)
+ s-w opt: 147 Z-score: 131.3 bits: 34.0 E(516081): 8.6
+Smith-Waterman score: 147; 26.9% identity (58.3% similar) in 156 aa overlap (10-157:315-458)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSAD
+ :::. .: . . . .: .. ::. .. .
+sp|Q54 TSPSSPSTSNMFLTPMVTTTTTSETSSSSDSSVNIIPNNTNTITNIL-IKEEDTNNGNNN
+ 290 300 310 320 330 340
+
+ 40 50 60 70 80 90
+sp|Q1X VKTQEVKPEEK-----KPAKKR---KSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL
+ :... . . .: .. : :.: :: .. :: . . :::.. .. .:..
+sp|Q54 KKSKKRTIDSRVQNIVHPLTREELLKIAGKE-PVQVVD-PPTH--NQEDERNVKKQRRLI
+ 350 360 370 380 390
+
+ 100 110 120 130 140 150
+sp|Q1X RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR
+ .:: .:: :: ::.. .: ::. .. :.: :... : :. . ::::.
+sp|Q54 KNRESAQLSRMRKKIYIEDLEKTISDLTQDN-------SSLKEEVLYLQGLVKQLAAQNS
+ 400 410 420 430 440 450
+
+ 160 170 180 190 200 210
+sp|Q1X GSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSD
+ .: :.
+sp|Q54 NSNNNSVIDINNNNVNNSQQQQQQHQQQQQLNNSNNNNNNNNNNSTNKQQQSKNVKAAGV
+ 460 470 480 490 500 510
+
+>>sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattus no (295 aa)
+ s-w opt: 138 Z-score: 131.3 bits: 32.5 E(516081): 8.6
+Smith-Waterman score: 138; 29.4% identity (55.9% similar) in 136 aa overlap (16-148:163-290)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPAS-EVPV-LTVSPADTSLNSADVKTQ
+ : : . .::: .::: .:.:
+sp|Q64 PLHPGIPSPNCMQNPIRPGQLLPANRNTPSPIDPDTIQVPVGYEPDPADLALSSIP----
+ 140 150 160 170 180
+
+ 50 60 70 80 90 100
+sp|Q1X EVKPEEKKPAKKRKSWGQEL-PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE
+ :: : .::: .:: : : . :: .: :... : .: ::. ::.
+sp|Q64 --GPEMFDP-RKRKFSEEELKPQPMIK-KARKVFIPDDLKDDKYWARRRKNNMAAKRSRD
+ 190 200 210 220 230 240
+
+ 110 120 130 140 150 160
+sp|Q1X RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS
+ .::. ... . .:..:. : :...... : .. .. ::. :
+sp|Q64 ARRLKENQIAIRASFLEKENSALRQEVADLRKELGKCKNILAKYEARHGPL
+ 250 260 270 280 290
+
+ 170 180 190 200 210 220
+sp|Q1X PATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAG
+
+>>sp|Q6MG48|BAT2_RAT Large proline-rich protein BAT2 OS= (2161 aa)
+ s-w opt: 155 Z-score: 131.1 bits: 35.3 E(516081): 8.8
+Smith-Waterman score: 155; 24.2% identity (50.2% similar) in 215 aa overlap (18-229:378-575)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ .:.::.: .. ...: : . :
+sp|Q6M RDSDEEGAEGHKDSQSAAGEEPETDGKKGTSPGSELPPPKTAWTENSRPSETEPAAPPIP
+ 350 360 370 380 390 400
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRK---SWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERK
+ . : .: .:: : . :: : ::: : : .: :...... : .
+sp|Q6M KPPPPPPHRGPVGNWGPPGDYPDRGGPPCKPPAPEDEDEAWR-QR--RKQSSSEISLAVE
+ 410 420 430 440 450 460
+
+ 110 120 130 140 150 160
+sp|Q1X RLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPA
+ : . .. :.:. ..:.. ..:.... .... .: :: . .. : :. :
+sp|Q6M RARRRREEEERRMQEERRAACAEKLKRLD---EKFGAPDKRLKAEPAAPPVTPPAPALPP
+ 470 480 490 500 510 520
+
+ 170 180 190 200 210 220
+sp|Q1X TASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLE
+ .. : ::: :: : ::: . :. : . . .. : :: . .
+sp|Q6M VV-PKETPT-----PPALP--PTPTPTPEKDPEEPAHAPPVQSAPTQ-AGPPAPT--PVS
+ 530 540 550 560 570
+
+ 230 240 250 260 270 280
+sp|Q1X GDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEG
+ : :.:
+sp|Q6M GGGTASSTSSGSFEASPAEPQLPSKEGPEPPEEVPAPTTPPAPKVEPKGDGVGPTRQPPS
+ 580 590 600 610 620 630
+
+>>sp|Q54HX6|MYBI_DICDI Myb-like protein I OS=Dictyosteli (977 aa)
+ s-w opt: 148 Z-score: 131.0 bits: 34.2 E(516081): 9
+Smith-Waterman score: 148; 17.5% identity (58.7% similar) in 223 aa overlap (36-252:628-845)
+
+ 10 20 30 40 50 60
+sp|Q1X EKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPV
+ ::.. :. . ... .... :. .
+sp|Q54 NNNNNNNNNINNNNNNNNGNNINNNNNNNNNSSNQIIQQQQQVQQQQMQQQQMMMQNQII
+ 600 610 620 630 640 650
+
+ 70 80 90 100 110 120
+sp|Q1X PKTNLP-PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQF
+ : .: :.... . . :..... .. . : ...... .... .... :..::.:
+sp|Q54 PTLPMPSPQSQVLQSQFQPQQQMQQQMQMQYQQQQQQQQQQQQQQQQQQQQQQQQQQQQ-
+ 660 670 680 690 700 710
+
+ 130 140 150 160 170 180
+sp|Q1X LLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDE-LP
+ :. .:.. .... .::. : .. .. .:. : ... . .:. ...: .
+sp|Q54 --QQQQQQQQQQQQQQQQIYQ--QNLNSNSGNSSPNISSINGDFVRSPNYNNKKRPPPVN
+ 720 730 740 750 760 770
+
+ 190 200 210 220 230
+sp|Q1X LERIPFPTPSLS---DYSPTLKPS-TLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDL
+ . : ::. :: ..::. .: .: .... . . . .. :. : : : :
+sp|Q54 VSRPEFPVTPLSGSPSHSPAQSPHYNLNNGNNNNGNGSSNSSSYSGNQSPLGLVPSPSLS
+ 780 790 800 810 820 830
+
+ 240 250 260 270 280 290
+sp|Q1X KHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFD
+ : . ...: :
+sp|Q54 LHPPSPLITSPTSHSIRWPGPLNNTLMYDYRRMEPSHGINYVPLQQSPHAPPQQSPHFNN
+ 840 850 860 870 880 890
+
+>>sp|Q90596|MAFK_CHICK Transcription factor MafK OS=Gall (156 aa)
+ s-w opt: 132 Z-score: 130.9 bits: 31.5 E(516081): 9.1
+Smith-Waterman score: 132; 25.2% identity (56.6% similar) in 159 aa overlap (47-193:5-156)
+
+ 20 30 40 50 60
+sp|Q1X ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTN-------
+ :. .: : .. :.. :: . .
+sp|Q90 MTTNPKPNKALKVKEESGENAPVLSDDELVSMSV
+ 10 20 30
+
+ 70 80 90 100 110 120
+sp|Q1X --LPPRKRAKTEDEK---EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQF
+ : . :. :..: .::: :.:.::. : . : .. . :.:: ......:. .
+sp|Q90 RELNQHLRGLTKEEVIRLKQRR--RTLKNRGYAASCRIKRVTQKEELERQRVELQQEVEK
+ 40 50 60 70 80 90
+
+ 130 140 150 160 170 180
+sp|Q1X LLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPL
+ : .. :.:. : . : .. : . .: . : :. .:. .. : . :. :. :.
+sp|Q90 LARENSSMKLELDALRSKYEALQTFAR-TVARGPI--TPTKVATTSVITIVKSA--EISS
+ 100 110 120 130 140
+
+ 190 200 210 220 230 240
+sp|Q1X ERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHST
+ .:: . :
+sp|Q90 SSVPFSAAS
+ 150
+
+>>sp|Q4VYS1|FOXP2_XENLA Forkhead box protein P2 OS=Xenop (706 aa)
+ s-w opt: 145 Z-score: 130.8 bits: 33.7 E(516081): 9.2
+Smith-Waterman score: 145; 20.1% identity (51.2% similar) in 344 aa overlap (10-321:36-373)
+
+ 10 20 30
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSAD
+ :: :. .. .: : .: .. .. . .
+sp|Q4V ATETISNSSMNQNGMSTLSSQLDAGSRDGRSSSDT--SSEVSTVELLHLQQQQALQAARQ
+ 10 20 30 40 50 60
+
+ 40 50 60 70 80 90
+sp|Q1X VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQT
+ . :. :.: ...:. ..:: . . : .. : .. .: ..:: .
+sp|Q4V LLLQQQTSGLKSPKNNEKQRPLQVPVSMAMMTP--QVITPQQMQQILQQQVLSPQQLQAL
+ 70 80 90 100 110 120
+
+ 100 110 120 130 140 150
+sp|Q1X SRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT--
+ .... . ... . ... .::.:. :: :.:.. .... .:: : . . .. .
+sp|Q4V LQQQQAVMLQQQQLQEFYKKQQEQLHLQLLQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
+ 130 140 150 160 170 180
+
+ 160 170 180 190
+sp|Q1X -------PMPGSPATASPTLTPTLF------------KQERDELPLER---IPFPTPSLS
+ : ::. : . :. . .:.. : :.: : .: :: :
+sp|Q4V QQQQQPQPHPGKQAKEQQQLAAQQLVFQQQLLQMQQLQQQQHLLNLQRQGLISIP-PSQS
+ 190 200 210 220 230 240
+
+ 200 210 220 230 240 250
+sp|Q1X DYSPTLKPSTLAESSDVAQ--HPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSD
+ :.. ... : . ...: ..: .: .:: .... .:. ... :
+sp|Q4V ALPVQSLPQAGLSPAEIQQLWKEVTGVHSMEDNGIKHGGLDLTTNISSSTTSTTTSKASP
+ 250 260 270 280 290 300
+
+ 260 270 280 290 300
+sp|Q1X D-DFNRLFHGDSSV---EPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIE
+ . :..:..:: . ::: :. : .: : . .: . : :. ..
+sp|Q4V PITHHSLLNGQASVLSARRDSSSHEETGASHTLYGHGVCKWPGCENICEDFGQF-LKHLN
+ 310 320 330 340 350
+
+ 310 320 330 340
+sp|Q1X MAHGLPDETT--CKTSSVQPGFGASTTRCDGQGIAAGC
+ :.: :..: :.
+sp|Q4V NEHALDDRSTAQCRVQMQVVQQLEIQLSKERERLQAMMTHLHMRPSEPKPSPKPLNLVST
+ 360 370 380 390 400 410
+
+>>sp|Q54NF3|Y6434_DICDI Uncharacterized protein DDB_G028 (412 aa)
+ s-w opt: 140 Z-score: 130.5 bits: 32.8 E(516081): 9.5
+Smith-Waterman score: 140; 18.5% identity (63.1% similar) in 157 aa overlap (22-170:171-321)
+
+ 10 20 30 40 50
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPV-LTVSPADTSLNSADVKTQEVKPEEK
+ ..:. .. ...: :: :. .:...
+sp|Q54 VECDFKMATNTPGSEQAQQQQQQQQQQQLGDIPIKQQITSSNNSGNS-----QQQQPQQQ
+ 150 160 170 180 190
+
+ 60 70 80 90 100 110
+sp|Q1X KPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEK
+ . ..... :. : . . .. . ....:..... :... : . ....:....
+sp|Q54 QQQQQQQQQQQQQPQQQQQQQQPQQQQHLQQQHQQQVQQ-LQQQQLQQQQLQQQQLQQQQ
+ 200 210 220 230 240 250
+
+ 120 130 140 150 160
+sp|Q1X LENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA----AEVRGSRANT---PMPGSP
+ :.....:. : .:. . .:.. . . ::: :. :. . ..:. : .::
+sp|Q54 LQQQQLQQPQLQQMQQPQQQQQQQQPQYTPQQLMQFQQMQQAQQQQQQAQQLQQQMGSSP
+ 260 270 280 290 300 310
+
+ 170 180 190 200 210 220
+sp|Q1X ATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL
+ . .:::.
+sp|Q54 THSSPTIKQEGLTGYTQIPQGGIINTNTNLNGTGGVSPNQPMPNSSPILPTNASSVVPPV
+ 320 330 340 350 360 370
+
+>>sp|Q0CPW4|PAN1_ASPTN Actin cytoskeleton-regulatory com (1469 aa)
+ s-w opt: 151 Z-score: 130.5 bits: 34.7 E(516081): 9.5
+Smith-Waterman score: 151; 24.8% identity (53.4% similar) in 266 aa overlap (16-268:1032-1284)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEV
+ :: :. .. . ... .... ..:: .. .:
+sp|Q0C LREQERQRRLAEERGTPAQPSTKPIGKKPPPAPPSRRARTDSADQSEAK-KAAD-EAAKV
+ 1010 1020 1030 1040 1050
+
+ 50 60 70 80 90 100
+sp|Q1X KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRN-RAAAQTSRERK
+ . .. : .... :: . . . :.: . : ::.. : :: . .: .. .:
+sp|Q0C EQTAREQAIREEQQVQEEETKRLEDEARQR-EEEFMKEKEAQEARLRALQEQVQQGKIKK
+ 1060 1070 1080 1090 1100 1110
+
+ 110 120 130 140 150 160
+sp|Q1X RLEME-KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA--EVRGSRANTPMPG
+ . : . : : :. ::. .. :: ...:: ..: : .: : : .: . : .
+sp|Q0C QEEKRRKEEAERRAKEQEAKLAAQR-AELEAAKERERQLQRELEAMEEESSSDDEGPEFA
+ 1120 1130 1140 1150 1160 1170
+
+ 170 180 190 200 210 220
+sp|Q1X SPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAES-SDVAQHPAVSV
+ .: ..::. : : : . : : : .: . . :. .. : :: :
+sp|Q0C TPRNGSPAQT---------EAPTAEAPPPPPPAPATAPPVPAIAEPEAPTSPATSPASSR
+ 1180 1190 1200 1210 1220
+
+ 230 240 250 260 270
+sp|Q1X AGLEGDG-SALPLFD-LG--SDLKHHSTDDVAAPLSD----DDFNRLFHGDSSVEPDSSV
+ :.: .. : : : .: .: . . ..:. :: . :.:: . . :. :
+sp|Q0C ANLSPEAESKNPWFKKIGQPADSQPAPVPQAATTPSDTHSTNPFHRLAQQQESTAPAFTG
+ 1230 1240 1250 1260 1270 1280
+
+ 280 290 300 310 320 330
+sp|Q1X FEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGAS
+
+sp|Q0C SAPLERKTRARPEDDDDWSAAGSEFDSSDDEDDRAGGGSAKQLASILFGTMAPPRPLSAM
+ 1290 1300 1310 1320 1330 1340
+
+>>sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Homo s (591 aa)
+ s-w opt: 143 Z-score: 130.4 bits: 33.3 E(516081): 9.7
+Smith-Waterman score: 143; 31.2% identity (63.4% similar) in 112 aa overlap (35-142:111-219)
+
+ 10 20 30 40 50 60
+sp|Q1X MEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQE-L
+ ::: .. . . . ::. ... .:: :
+sp|Q8N RDARQVYGLNFGSKEDANVFASAMMHALEVLNSQETGPTLPRQNSQLPAQVQNGPSQEEL
+ 90 100 110 120 130 140
+
+ 70 80 90 100 110 120
+sp|Q1X PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-ERKRLEMEKLENEKIQMEQQN
+ . . .: ..: : : :..:.:: .: . : ::.::: :.::.:... :.:.
+sp|Q8N EIQRRQLQEQQRQK---ELERERLERERMERERLERERLERERLERERLEQEQLERERQE
+ 150 160 170 180 190
+
+ 130 140 150 160 170 180
+sp|Q1X QFLLQRLSQME--AENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD
+ . .:: ..: ...:: .:
+sp|Q8N RERQERLERQERLERQERLERQERLDRERQERQERERLERLERERQERERQEQLEREQLE
+ 200 210 220 230 240 250
+
+>>sp|Q00312|RBF1_CANAL Transcription factor RBF1 OS=Cand (527 aa)
+ s-w opt: 142 Z-score: 130.4 bits: 33.2 E(516081): 9.7
+Smith-Waterman score: 142; 23.0% identity (57.0% similar) in 200 aa overlap (36-229:263-449)
+
+ 10 20 30 40 50 60
+sp|Q1X EKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEE----KKPAKKRKSWGQ
+ : : : .. ::.: .. .. . :
+sp|Q00 TTVKDATKRQRIAYTKRNKCAYRLVANLYPNEKDQKRKN-KPDEPGHNEENSRISEMWVL
+ 240 250 260 270 280 290
+
+ 70 80 90 100 110 120
+sp|Q1X ELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ
+ .. :. : : : :.... :.: .. . .... :..:. .... :..::
+sp|Q00 RMINPQHNHAPDPINK----KKRQKTSRTLVEKPINKP-HHHHLLQQEQQQQQQQQQQQQ
+ 300 310 320 330 340
+
+ 130 140 150 160 170
+sp|Q1X NQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPT--LFKQER
+ .: :. .: .: :.. .:: ::: ... . . .: .: . : : : .:.
+sp|Q00 QQ---QQQQQHNA-NSQAQQQAAQLQQQMQQQLQASGLPTTP-NYSELLGQLGQLSQQQS
+ 350 360 370 380 390 400
+
+ 180 190 200 210 220 230
+sp|Q1X DELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDL
+ .. :..:: .. . .:. :.. : : :. .:..:....:
+sp|Q00 QQQQLHHIPQQRQRTQSQQSQQQPQQTAHGLD--QPDAAVIAAIEASAAAAVASQGSPNV
+ 410 420 430 440 450
+
+ 240 250 260 270 280 290
+sp|Q1X KHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFD
+
+sp|Q00 TAAAVAALQHTQGNEHDAQQQQDRGGNNGGAIDSNVDPSLDPNVDPNVQAHDHSHGLRNS
+ 460 470 480 490 500 510
+
+>>sp|P48634|BAT2_HUMAN Large proline-rich protein BAT2 O (2157 aa)
+ s-w opt: 154 Z-score: 130.2 bits: 35.2 E(516081): 9.9
+Smith-Waterman score: 154; 27.0% identity (50.9% similar) in 222 aa overlap (18-228:380-575)
+
+ 10 20 30 40
+sp|Q1X MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKP
+ .: :: :. .. :.:: ... :
+sp|P48 SDEEGAEGHRDSQSASGEERPPEADGKKGNSPNSEPPTPKTAWAETS-RPPETEPGPPAP
+ 350 360 370 380 390 400
+
+ 50 60 70 80 90 100
+sp|Q1X EEKKPAKKRK---SWGQELPVPKTNLPPRKRAKTEDEKE---QRRIERVLRNRAAAQTSR
+ . : .: .:: : . :: : ::: : ::: . . :.. .:
+sp|P48 KPPLPPPHRGPAGNWGPPGDYPDRGGPPCKPPAPEDEDEAWRQRRKQSSSEISLAVERAR
+ 410 420 430 440 450 460
+
+ 110 120 130 140 150 160
+sp|Q1X ERKRLEMEKLENEKIQMEQQNQFLLQRLSQ-MEAENNRLSQQLAQLAAEVRGSRANTPMP
+ .:.. : .....:. .. :.::.. . : ..::. :. :: : :
+sp|P48 RRREEEERRMQEERRAACAEK---LKRLDEKFGAPDKRLK---AEPAA---------P-P
+ 470 480 490 500 510
+
+ 170 180 190 200 210 220
+sp|Q1X GSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSV
+ ..:.: .: :.. : ::: : : :. : .: .: :.. . . :. .:
+sp|P48 AAPSTPAPP--PAVPK----ELPAP--PAPPPA-SAPTPEKEPEEPAQAPPAQSTPTPGV
+ 520 530 540 550 560
+
+ 230 240 250 260 270
+sp|Q1X AG----LEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDG
+ :. . : ::
+sp|P48 AAAPTLVSGGGSTSSTSSGSFEASPVEPQLPSKEGPEPPEEVPPPTTPPVPKVEPKGDGI
+ 570 580 590 600 610 620
+
+
+
+526 residues in 2 query sequences
+181677051 residues in 516081 library sequences
+ Tcomplib [36.04] (8 proc)
+ start: Fri Apr 16 09:19:16 2010 done: Fri Apr 16 09:19:21 2010
+ Total Scan time: 29.730 Total Display time: 0.360
+
+Function used was SSEARCH [version 36.04 January, 2010]
diff --git a/demotic/examples/example.sto b/demotic/examples/example.sto
new file mode 100644
index 0000000..478447d
--- /dev/null
+++ b/demotic/examples/example.sto
@@ -0,0 +1,552 @@
+# STOCKHOLM 1.0
+#=GF ID Orn_DAP_Arg_deC
+#=GF AC PF00278.15
+#=GF DE Pyridoxal-dependent decarboxylase, C-terminal sheet domain
+#=GF AU Finn RD, Griffiths-Jones SR
+#=GF SE Prosite
+#=GF GA 20.10 20.10;
+#=GF TC 20.40 20.10;
+#=GF NC 19.80 20.00;
+#=GF BM hmmbuild HMM.ann SEED.ann
+#=GF SM hmmsearch -Z 9421015 -E 1000 HMM pfamseq
+#=GF TP Domain
+#=GF RN [1]
+#=GF RM 10378276
+#=GF RT Structure of mammalian ornithine decarboxylase at 1.6 A
+#=GF RT resolution: stereochemical implications of PLP-dependent amino
+#=GF RT acid decarboxylases.
+#=GF RA Kern AD, Oliveira MA, Coffino P, Hackert ML;
+#=GF RL Structure Fold Des 1999;7:567-581.
+#=GF DR INTERPRO; IPR000183;
+#=GF DR PROSITE; PDOC00685;
+#=GF DR SCOP; 1qu4; fa;
+#=GF DR HOMSTRAD; Orn_Arg_deC_NC;
+#=GF DR HOMSTRAD; Orn_DAP_Arg_deC;
+#=GF CC These pyridoxal-dependent decarboxylases act on ornithine,
+#=GF CC lysine, arginine and related substrates.
+#=GF SQ 105
+#=GS O14439_USTMA/296-443 AC O14439.1
+#=GS O01579_CAEEL/298-416 AC O01579.1
+#=GS AZIN1_HUMAN/282-406 AC O14977.2
+#=GS ADC_MOUSE/286-408 AC Q8BVM4.1
+#=GS Q7DFY1_SELRU/266-371 AC Q7DFY1.1
+#=GS Q7UFM7_RHOBA/290-397 AC Q7UFM7.1
+#=GS Q7MC63_VIBVY/293-399 AC Q7MC63.1
+#=GS Q70GM6_CHLRE/256-376 AC Q70GM6.1
+#=GS A8BFD3_GIALA/305-445 AC A8BFD3.1
+#=GS DCOR_SOLLC/308-424 AC O22616.2
+#=GS Q7PV11_ANOGA/282-398 AC Q7PV11.4
+#=GS Q7Q083_ANOGA/289-408 AC Q7Q083.4
+#=GS Q7PZ99_ANOGA/280-394 AC Q7PZ99.4
+#=GS DCOR2_DROME/276-390 AC P40808.2
+#=GS A9NCJ9_COXBR/264-371 AC A9NCJ9.1
+#=GS Q98K89_RHILO/273-385 AC Q98K89.1
+#=GS Q6SF82_9BACT/264-372 AC Q6SF82.1
+#=GS Q9X2I6_THEMA/263-370 AC Q9X2I6.1
+#=GS Q82VZ0_NITEU/286-391 AC Q82VZ0.1
+#=GS Q5LXE4_SILPO/280-393 AC Q5LXE4.1
+#=GS Q7CRV2_AGRT5/264-377 AC Q7CRV2.2
+#=GS Q8PS97_METMA/278-390 AC Q8PS97.1
+#=GS Q5YT58_NOCFA/255-366 AC Q5YT58.1
+#=GS O69865_STRCO/277-392 AC O69865.1
+#=GS Q5XQ82_9ARCH/314-419 AC Q5XQ82.1
+#=GS Q604F1_METCA/244-348 AC Q604F1.1
+#=GS Q7VZY7_BORPE/241-343 AC Q7VZY7.1
+#=GS Q88IS0_PSEPK/241-343 AC Q88IS0.1
+#=GS Q5HSR6_CAMJR/244-361 AC Q5HSR6.1
+#=GS P73562_SYNY3/258-365 AC P73562.1
+#=GS Q9RUH6_DEIRA/278-394 AC Q9RUH6.1
+#=GS Q7MAL4_WOLSU/251-357 AC Q7MAL4.1
+#=GS O24865_HELPY/267-385 AC O24865.1
+#=GS Q5LVU5_SILPO/266-369 AC Q5LVU5.1
+#=GS Q72EZ9_DESVH/261-367 AC Q72EZ9.1
+#=GS Q57LZ4_SALCH/318-441 AC Q57LZ4.1
+#=GS Q82HL1_STRAW/330-442 AC Q82HL1.1
+#=GS Q75JL7_DICDI/295-407 AC Q75JL7.1
+#=GS Q7WXK3_RALEH/291-407 AC Q7WXK3.1
+#=GS Q7A862_STAAN/277-393 AC Q7A862.1
+#=GS Q5SEM5_RALSO/282-398 AC Q5SEM5.1
+#=GS Q76KY1_STRHA/280-393 AC Q76KY1.1
+#=GS Q8RKC5_ERWCH/297-409 AC Q8RKC5.1
+#=GS Q7CYS1_AGRT5/270-383 AC Q7CYS1.2
+#=GS Q7N8H2_PHOLL/306-419 AC Q7N8H2.1
+#=GS Q82VG2_NITEU/296-409 AC Q82VG2.1
+#=GS Q5YWM9_NOCFA/340-451 AC Q5YWM9.1
+#=GS Q72WM6_DESVH/318-424 AC Q72WM6.1
+#=GS Q62F85_BURMA/278-395 AC Q62F85.1
+#=GS Q7NPE5_GLOVI/307-415 AC Q7NPE5.1
+#=GS Q7A0X5_STAAW/290-398 AC Q7A0X5.1
+#=GS DCDA_MYCS2/336-449 AC Q9X5M1.1
+#=GS DCDA_ACTPA/309-415 AC O69203.1
+#=GS Q8TY23_METKA/277-383 AC Q8TY23.1
+#=GS Q7N7F9_PHOLL/289-407 AC Q7N7F9.1
+#=GS Q8F7A1_LEPIN/276-395 AC Q8F7A1.1
+#=GS Q8GGR7_STRAZ/284-405 AC Q8GGR7.1
+#=GS DCDA_METJA/305-410 AC Q58497.1
+#=GS DCDA_METJA/305-410 DR PDB; 1tuf B; 315-420;
+#=GS DCDA_METJA/305-410 DR PDB; 1twi D; 315-420;
+#=GS DCDA_METJA/305-410 DR PDB; 1tuf A; 315-420;
+#=GS DCDA_METJA/305-410 DR PDB; 1twi A; 315-420;
+#=GS DCDA_METJA/305-410 DR PDB; 1twi C; 315-420;
+#=GS DCDA_METJA/305-410 DR PDB; 1twi B; 315-420;
+#=GS Q7ULZ0_RHOBA/283-389 AC Q7ULZ0.1
+#=GS Q6SHW6_9BACT/289-395 AC Q6SHW6.1
+#=GS Q5V5E3_HALMA/306-412 AC Q5V5E3.1
+#=GS DCDA_METTH/292-398 AC O27390.1
+#=GS Q87EA9_XYLFT/758-866 AC Q87EA9.1
+#=GS DCDA1_ARATH/351-459 AC Q949X7.1
+#=GS DCDA_PSEFL/285-390 AC O05321.1
+#=GS Q5FPL4_GLUOX/282-390 AC Q5FPL4.1
+#=GS Q9A681_CAUCR/288-394 AC Q9A681.1
+#=GS Q5FEQ0_EHRRW/291-397 AC Q5FEQ0.1
+#=GS Q7MT14_PORGI/263-379 AC Q7MT14.1
+#=GS Q6MM66_BDEBA/286-391 AC Q6MM66.1
+#=GS Q6L350_PICTO/286-391 AC Q6L350.1
+#=GS Q97AJ0_THEVO/281-380 AC Q97AJ0.1
+#=GS Q728N7_DESVH/285-394 AC Q728N7.1
+#=GS Q62B72_BURMA/307-413 AC Q62B72.1
+#=GS Q66B85_YERPS/267-374 AC Q66B85.1
+#=GS Q5NIN9_FRATT/298-400 AC Q5NIN9.1
+#=GS Q8XS02_RALSO/281-396 AC Q8XS02.1
+#=GS SPEA_XYLFT/343-555 AC Q87F25.1
+#=GS Q5NHM0_FRATT/327-467 AC Q5NHM0.1
+#=GS SPEA_PROMP/355-574 AC Q7V3M9.1
+#=GS SPEA_GLOVI/346-557 AC Q7NE10.1
+#=GS Q6MQU4_BDEBA/373-587 AC Q6MQU4.1
+#=GS Q72F01_DESVH/373-585 AC Q72F01.1
+#=GS Q5SHU0_THET8/347-559 AC Q5SHU0.1
+#=GS SPEA_BACTN/346-558 AC Q8A2B1.1
+#=GS O25176_HELPY/412-542 AC O25176.1
+#=GS SPE2_ARATH/396-596 AC O23141.1
+#=GS O04429_DIACA/405-605 AC O04429.1
+#=GS SPE1_AVESA/355-532 AC P22220.1
+#=GS Q5X0L3_LEGPL/343-556 AC Q5X0L3.1
+#=GS SPEA_CHRVO/343-556 AC Q7NU27.1
+#=GS SPEA_VIBVY/354-570 AC Q7MK24.1
+#=GS Q7PZA0_ANOGA/274-386 AC Q7PZA0.3
+#=GS Q60D03_SOLDE/147-257 AC Q60D03.2
+#=GS DCOR_NEUCR/326-471 AC P27121.1
+#=GS DCOR_YEAST/329-460 AC P08432.1
+#=GS DCOR_CANAL/324-468 AC P78599.1
+#=GS Q84527_PBCV1/263-371 AC Q84527.1
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nv9 A; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nv9 H; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nv9 C; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nv9 F; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nva H; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nv9 E; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nva D; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nv9 D; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nv9 G; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nva C; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nva E; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nv9 B; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nva B; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nva F; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nva A; 263-371;
+#=GS Q84527_PBCV1/263-371 DR PDB; 2nva G; 263-371;
+#=GS Q5MNH7_NEOUN/277-400 AC Q5MNH7.1
+#=GS Q58P26_ENTHI/268-382 AC Q58P26.1
+#=GS O15696_PLAFA/807-931 AC O15696.1
+#=GS DCOR_LEIDO/509-682 AC P27116.1
+#=GS P78829_SCHPO/238-357 AC P78829.1
+#=GS O76203_HAECO/287-407 AC O76203.1
+#=GS DCOR_PANRE/294-416 AC P49725.1
+O14439_USTMA/296-443 ALATNIIAVRRGEPSAAM..................................................................................DHVEAT........PKAQVMYY.QNDGLYGS.FNCVIFDHVKFIQSSDAGPRVRVRADDWVARG........................ASGECGRLALQQEAMTLESCSVWGPTCDSID.CV...RD.........HVELPK........GLQVGDWLVYENMGAYTICAAS.TFNGIR..RSEIRYT
+O01579_CAEEL/298-416 TLCTNVIGKRAMDAKFI...................................................................................TNDDFD.........DGVGFVYQTNDGVYGS.FGCKQMDI....KPLCKPLDVE............................................NDSEEQLHFGTILGPTLDGTD.VA..............QRLMKS.......RQLRVGEWLVWEQMGAFTIPVDS.EHS.....VPPVYYY
+AZIN1_HUMAN/282-406 TLAVNIIAKKVVENDKFP.................................................................................SGVEKTG.......SDEPAFMYY.MNDGVYGS.FASKLSED....LNTIPEVHKK............................................YKEDEPLFTSSLWGPSCDELD.QI...VE.........SCLLP.........ELNVGDWLIFDNMGADSFHEPS.AFNDFQ..RPAIYYM
+ADC_MOUSE/286-408 TVAVSIVAKREVLDQASR..................................................................................EEQTGA........APKSIVYY.LDEGVYGV.FNSVLFDN....TCPTPALQKK............................................PSADQPLYSSSLWGPAVEGCD.CV...AE.........GLWLP.........QLQVGDWLVFDNMGAYTVDTKS.LLGGTQ..ARRVTYA
+Q7DFY1_SELRU/266-371 NLVTSVIGTKTRG...........................................................................................EQ.............PWYILDEGIYGC.FSGIMYDH....WTYPLHCF................................................GKGNKKPSTFGGPSCDGID.VL...YR.........DFMAP.........ELKIGDKVLVTEMGSYTSVSAT.RFNGFY..LAPTIIF
+Q7UFM7_RHOBA/290-397 TLITRVIGKSRRWE..........................................................................................LP.............WFF.LDDGIYGS.FSGKIFDH....TDFPLLVEN..............................................DGSRETVPCVVAGPTCDSTD.IV...SR.........DQWLP.........DLEVGELVLVPSMGAYAAASAS.PFNGLP..MANSVAI
+Q7MC63_VIBVY/293-399 TSVASVMGQAEREG..........................................................................................QI.............WYY.LDDGIYGS.FSGLMFDD....ARYPLTTI...............................................KQGGELIPSVLSGPTCDSVD.VI...AE.........NILLP.........KLNNGDLVIGRTMGAYTSATAT.DFNFFK..RAQTIAL
+Q70GM6_CHLRE/256-376 TLLTPVYGQRDRVAAD.....................................................................................GSVKK.............DYW.LTDGLYGS.FNCILYDG....QNPGYKVVRSPL........................................MADSTDSRTFLSTLWGPTCDSAD.CV...YK.........DVTLP.........VLRNGDWLMWNNAGAYTVAGAC.DFNGIEFTTPGKLYV
+A8BFD3_GIALA/305-445 TLGTRIYGRRIIFDKIEDNS.............................................................................CLTEKEIME....SGKASINEVKYY.VGDGVYGY.YNAILFDH....VVPHLRFTDKHGNR...................................KELSGAHAGSSLNTSSIFGPTCDSLD.CI...LK.........ERKLP.........LLDVGDWVITDAFGAYTYAAAT.EFNGIP..HVSVVCC
+DCOR_SOLLC/308-424 TLATTIIGKRVRGE..........................................................................................LK.............EYW.INDGLYGS.MNCVLYDHATVTATPLACMSNRN.........................................NLNCGGSKTFPSTVFGPTCDALD.TV...LR.........DYQLP.........ELQVNDWLIFPNMGAYTKAAGS.NFNGFN..TSAIVTH
+#=GR DCOR_SOLLC/308-424 sAS ......................................................................................................................................................................................................................*.........................................................................
+Q7PV11_ANOGA/282-398 TLVSFVDSKRVMKEKQPD..................................................................................GTEKTR.............MYYYLNDGIFGT.FYCTAHEA....QPAIPIVER..............................................KTGAKDFPTSVWGPTCDVMD.LI...LP.........DVMLP.........ELNVGDSVVFENCGAYGQVLAC.RFNGFP..LPKVIAY
+Q7Q083_ANOGA/289-408 TLLTTVQGKKIVRDDA.....................................................................................GQIQQ.............MMYYINDGVFGTLFDWLSLREIKDLKRAVPLVRR.............................................EREHEPAFPTTIWGPTCDSTD.IV...CE.........DVPYP.........EHHIGDYIVFENLGAYGMTFAT.NFNGFP..KPTVQVY
+Q7PZ99_ANOGA/280-394 TLVTNVQSKRV.CLNAR...................................................................................TGTIDR.............MMYYLNDGVYAS.FNSILYDH....QVPQPKLIG..............................................GQAGKQYKSTLWGPTCDALD.QL...IE.........TIALP.........ELQIDDWVVFENMGAYTIPVAS.PFNGFE..LPKVYCY
+DCOR2_DROME/276-390 TLICKVHAKREVRSKD.....................................................................................GKLDT.............MMYYLNDGIFGAFAGMFYYPE....EVAPELYLD.............................................EAESLPKLKSVIWGPSCDAMD.KI...S..........DLLLP.........NLNPGDLLGFRNMGAYTMPIAS.PFNGFD..VPETRFF
+#=GR DCOR2_DROME/276-390 sAS ......................................................................................................................................................................................................................*.........................................................................
+A9NCJ9_COXBR/264-371 SVIVNVELRKDD...........................................................................................................ILY.INDGTYGSLFDAGIPHF....IFPVHLLRPK............................................HTADVDLLPFSFYGPTCDSLD.YM...KG.........PFYLPN........DIKAGDYIEIGQMGAYGRTLST.AFNGFK..QREGVIM
+Q98K89_RHILO/273-385 SLIVRVLLRKGK...........................................................................................................RLY.INDGIWASLSDSWTGKI....TLPARFIPDPAI.......................................RTRNGAEKNVVPFKVCGATCDSVD.IL...SR.........PFWLPE........TVDTGDWIEIGHIGAYSLSLRT.RFNGFY..PDTFVEV
+Q6SF82_9BACT/264-372 TLATQIKALRGL...........................................................................................................RTVFLNDGVYGL.LSEFRDLG....VSQRYQAWRA...........................................GSKLAGPSAAYTVFGPTCDSID.KL...PS.........PLHLPK........SIQEGDYLLFSEIGAYSLSLAT.AFNGYG..GCEIVAV
+Q9X2I6_THEMA/263-370 WLVTKVLLKSERSG..........................................................................................EK.............WVY.IDAGVFHG.LAETIQNF....EYEIRVLG...............................................KEREELEEYHLAGPTCDSVD.VI...YD.........RIFLPK........SITLNDLVCFINAGAYTVEYNT.RFNGIE..PPKMVFI
+Q82VZ0_NITEU/286-391 CFVCRVVGTATRNG..........................................................................................KR.............WMY.WDAGIFGGIIE..VSEG....LRYEILTQ................................................RNGSLIPWSVAGPTCDSVD.VL...MH.........DEMLPE........DIQENDFIFIPNAGAYTTSYAS.NFNGFP..LPDVVVI
+Q5LXE4_SILPO/280-393 AIAAEVLLVSRKSGH.......................................................................................DLHR.............WVY.LDIGKFSG.LAETMDEA....IRYQFLTE...............................................REHEPTGPCILAGPSCDSAD.VLY.EKK.........PVQLPL........GLRDGDRIVIRNCGAYTSTYASVGFNGFP..PLDVVAI
+Q7CRV2_AGRT5/264-377 VIKAEVVLVSK....................................................................................................KSDNDNHRWVF.LDIGKFGG.LAETMDEA....IRYPIRTE...............................................RDQDEMQPCVLAGPTCDSAD.VL...YEK.......NMYPLPV........SLTIGDEVLIEGTGAYTTTYSAVAFNGFE..PLKAYVI
+Q8PS97_METMA/278-390 IIVSEVIMIAKKARF.......................................................................................NQYK.............WVY.LDIGKFGG.LIETLDEC....IKYPIFCD................................................KKGCAEEVILAGPTCDSMD.ILY.EHH.........KYSFPH........TMRDGNRVYIFTTGAYTQSYSSICFNGFP..PLKAYVI
+Q5YT58_NOCFA/255-366 TIHAEVVAVRIAPD.........................................................................................GRR.............WVY.LDIGRYNG.MAETENEY....IAYRFVTE...............................................RDGDPVDEAVVAGPTCDGDD.VLY.QRT.........RVLLPT........TLRAGDRVQILDTGAYTASYSSVSFNGFP..PLTVHVS
+O69865_STRCO/277-392 AIRAHVVRLTERRAAD.....................................................................................GERQH.............WLY.LSCGKFNG.LYEM..DA....LQYRLVFPG..............................................HPDGPCVPAVVAGPTCDSDD.AYSHEEG.........LVPVPA........ALASGDPVWVLSCGAYATSYTTRGFNGFA..PLPYAFA
+Q5XQ82_9ARCH/314-419 MVVSVIGTAKRGD...........................................................................................NM.............WAY.IDAGIYSGLLDYVIKDK....VFEISILDR.............................................TEPSSKTYKYLLSGPTSDALD.FL...G..........EYSFKK........QLNAGDKLIIKNCGAYTFVLGT.HFGGFN.....HFGF
+Q604F1_METCA/244-348 YLVASVIDVFNSG...........................................................................................GK.............TVAVLDSSINHH.PEVFEYQR....SPRLAEV.................................................CEEGRETAILAGGTCLAGD.LF...G..........EYALPT........RPRIGDRLVFEDVGAYTLVKAN.RFNGHN..LPSIYRW
+Q7VZY7_BORPE/241-343 TLEVTVLDVMRNE............................................................................................K.............NLAIVDAATEAHMLDLLIYRM....SARVQP...................................................DQGPHRYVIYGNSCLAGD.VF...G..........EFSFES........PLQPGSRISIQDAAGYTMVKKN.WFNGVR..MPAIAIR
+Q88IS0_PSEPK/241-343 SLEVTVLDTLYNG............................................................................................K.............HLAVVDSSIEAHLLDLLIYRL....NAKMAP...................................................NDGEHTYMVCGKSCLAGD.IF...G..........EYQFDR........PLAIGDRLSFIDTAGYTMVKKN.WFNGLK..MPSIVVK
+Q5HSR6_CAMJR/244-361 NLVASVVDIIENE............................................................................................K.............QIAILDTSSEAHMPDTIIMPY....TSEVLNARILATRE....................................NEKISDLKENEFSYLLTGNTCLAGD.VM...G..........EYAFDK........KLKIGDKIVFLDQIHYTIVKNT.TFNGIR..LPNLMLL
+P73562_SYNY3/258-365 FLLSTVEDLIETP...........................................................................................EF.............THAMLDVSFTAHMPDCLEMPY....RPEVRGAR...............................................VPQTGDTVYRLGGSSCLAGD.FL...G..........DYAFDQ........PLQVGDRLIFEDMMHYTMVKTT.TFNGVH..HPAIGCL
+Q9RUH6_DEIRA/278-394 WLVSSVLDVVHNV............................................................................................K.............DAALLDVSVSAHMPDVLEMPY....RPRILGAGDPPLD.....................................DHREAQDTGSGYPYIIGGTTCLAGD.VV...G..........EYVFPH........ELKVGSRVVFDDMIHYTMVKTT.FFNGVK..HPDIGIL
+Q7MAL4_WOLSU/251-357 FLLGEVVDVVRNG............................................................................................M.............EIAILDISAAAHMPDCLEMPY....RPMVRGSA...............................................EAGEKRYSYRLGGPTCLAGD.VI...G..........DYSFDS........PLKVGDQLIFEDMIHYTIVKNN.TFNGVP..LPSIGVI
+O24865_HELPY/267-385 FLIASVIDIVQND............................................................................................Q.............EIAILDASFSAHMPDCLEMPY....RPSIFKVSVENDEE...................................LIEVEKGENQGAFSYFLGGPTCLAGD.FM...G..........SFSFET........PLKRGDKIVFQDMLHYTIVKNN.SFNGVP..LPSLARL
+Q5LVU5_SILPO/266-369 ILVGEILDLPSNG............................................................................................M.............DLAITDISATCHMPDVIEAPY....RPALMDE..................................................ADSGHTYRLGGPSCLAGD.VI...G..........DYTWDQ........PLTIGQRFAFLDQAHYSMVKTN.TFNGVP..LPTIALW
+Q72EZ9_DESVH/261-367 VLLCSVLDVVQAD............................................................................................V.............PVVILDTSAAAHMPDVLEMPY....RPGCIGSG...............................................LPDEKAWTCRLAGKSCLAGD.VV...G..........DYSFDR........PLRPGDRLAFLDMAIYSMVKTT.TFNGLQ..LPAIALY
+Q57LZ4_SALCH/318-441 VLLTEVSCEKRK...........................................................................................................TNYDLNGNVECH.VEWKFVDA....GYSVLSDSQHFDWFF.................................YVYNASRMTAAHDAWVKLAGPLCDGGD.YFHMGVKG.......EEFLLPK........ETHVGDIVAFLDAGAYAIESQT.VYNNRP..RTGVVMI
+Q82HL1_STRAW/330-442 TVVARVEYAKSAGG..........................................................................................RA.............VAV.THAGVQVA.TRTVYAPA....SWPLRITAYDA.........................................KGHPKAGPEVVQDVAGPACFAGD.LL...AV.........GRALP.........LLEQGDHVAALDTGAYYFAHHY.AYNSLA..RPGIYGF
+Q75JL7_DICDI/295-407 VVVSTVEYTKSSGD..........................................................................................RE.............IAI.CHAGANMY.IRTVYQFP....LWRIRVTIFDS.........................................NGEYKTGNEKITDIAGPCCFAAD.VL...VK.........ERLLP.........PIKKDDFIMAHDSGAYMLSSYS.HYNLRL..APPIFSF
+Q7WXK3_RALEH/291-407 YYAMEVIDVKHAFD..........................................................................................RA.............FVV.ACGGTHHF.RTPYAQGH....SHPFRVLPVESWR......................................YPFARPGVRDARVSVVGQLCTPKD.VL...AQ.........DAPVD.........SVRAGDMVVFPYAGAYAWHISHHDFLRHP..HPQHCYL
+Q7A862_STAAN/277-393 YYVTEVLDIKKVHG..........................................................................................AW.............YAI.LRGGTQQF.RLPVSWQH....NHPFEIYRYKDNP......................................YSFEKVSISRQDTTLVGQLCTPKD.VF...AR.........EVQID.........AISTGDVIVFKYAGAYGWSISHHDFLSHP..HPEFIYL
+Q5SEM5_RALSO/282-398 YYVTEVVDIKRNHG..........................................................................................KW.............FAV.LRGGTHHF.RLTASWQH....NHPFAIVPNAQWT......................................YPFARPSVQAQAVTLCGELCTPKD.VL...AR.........DVVVD.........RLSVGDRIVFQLAGAYGWHISHHDFLSHP..HPERRFV
+Q76KY1_STRHA/280-393 TLLTRVVNIKVSRG..........................................................................................RK.............FVV.IDAGINTF.GGMSGLGR....LLPVAVEPEYT.........................................GSAEATELTDVASLAGPLCTPGD.IL...GR.........EIRLP.........ELAPGDLVTIPNAGAYGVTASLLMFLGRP..APVEVVL
+Q8RKC5_ERWCH/297-409 LFVTRVNTLKTAGG..........................................................................................KT.............FAV.CDGGANCH.SAAAGLNSMLRKNFPLLRLGD..............................................NQGRPLQPYQVSGPLCTPTD.LL...GD.........NVLLP.........TLEVDDLIGITHSGAYGLTASPGSFLSFG..YPVEVMV
+Q7CYS1_AGRT5/270-383 LYVVEVNSVKT.......................................................................................................SRGTTFVV.TDGGMHHHLAASGNLGQIVKRNYPIVAPAM..............................................MQAAHDETATIVGPLCTPLD.TL...AR.........NATLP.........KLNAGDLLAILQSGAYGASASPGGFLSHT..VAKEVLV
+Q7N8H2_PHOLL/306-419 IYVTKIVERKISHD..........................................................................................MT.............FLV.TDGGMNHHLSASGNLGQLIRRNYPAIIGNK..............................................IKGEKRETVNIVGPLCTPLD.IL...VH.........QGDMS.........VATPGDLVVIFQSGAYGLSASPNNFLSQT..NAVEVLV
+Q82VG2_NITEU/296-409 IYVCRVLEKKISRG..........................................................................................QT.............FLV.TNGGLHHHLAASGNFGQVIRKNYPVAIGNK..............................................MKIDETEIVSVVGPLCTPLD.LL...AD.........RMELS.........RAEPGDLVVVFQSGAYGLTASPTAFLSHP..ASLEVLI
+Q5YWM9_NOCFA/340-451 LTLASVEFVKELGD..........................................................................................GT.............VLVTLDLSRDTVTPADQEVMV....DPLVLPGAR..............................................RDDGPAVGVYFAGRLCLERDLIT...TR.........QVFLPG........LPAPGDVVVFPNTAAYHMDLSA.STAARW..APPRRWV
+Q72WM6_DESVH/318-424 LLLTRVKAVKERPG.........................................................................................AEP.............FAI.TDGGRLSQ.AYPCDFEW....HEAFLAND...............................................LRRPLARAYTVTGRVCTRSD.WL...YR.........GKVMP.........ELASGDILAVLDAGAYFSSYAM.NF.AFP..RAAVVGV
+Q62F85_BURMA/278-395 VFVTRVRAVKVWDD..........................................................................................RV.............IAV.CDGGMSHN.FLLAKTEAVLKTWAAPTLVPAGT.........................................ADAHRAPNARPITFVGNTCNRAD.VI...GR.........LERHPR........LPQPGDFVVFSQCGAYHHSYTVSGFLSHK...PAQVYI
+Q7NPE5_GLOVI/307-415 ATAYTVGSTKTIPS.........................................................................................IRK.............YFS.VDGGMSDN.PRPITYKA....LYTAVVANK..............................................MHDGRREKVTVAGKHCESGD.VL...LR.........DVELP.........PLERGDCLVVFSTGAYNCSMAS.NYNRIP..RPAAVLV
+Q7A0X5_STAAW/290-398 VTLYEVGTIKEIPE.........................................................................................INK.............YVS.IDGGMSDH.IRTALYDA....KYQALLVN...............................................RNEEADDSVTIAGKLCESGD.II...IK.........DAKLPS........SVKRGDYLAILSTGAYHYSMAS.NYNQMQ..KPSVFFL
+DCDA_MYCS2/336-449 ITLYEVGTVKDVAVSQ.....................................................................................TAHRR.............YVS.VDGGMSDN.IRTSLYAA....QYDARLVSR..............................................VSDAPPALARIVGKHCESGD.IV...VR.........DTWVSD........DIAPGDLIGVAATGAYCYSMSS.RYNLLC..RPAVVAV
+DCDA_ACTPA/309-415 VTLYRVAAVKR.GV.........................................................................................RRV.............FVA.VDGGMSDN.PRPALYGS....RYAVRLVR................................................RGGRRAPVTVVGRHCEAGD.VL...AE.........DVPLPE........DVRAGDLLAVPVTGAYHHALAS.NYNAVG..RPPVVGV
+Q8TY23_METKA/277-383 ILVTSVRQVKR.GR..........................................................................................RR.............WVF.VDTGMNAL.IRPALYDA....YHEVVVHG...............................................GDYSATEKASVAGPLCESGD.VL...AE.........DRELPI........DISEGDLVVFLSAGAYCESMAS.NYNCYP..IPGSVVV
+Q7N7F9_PHOLL/289-407 VLMTEVRAVKQ.MG.........................................................................................NRN.............YVL.VDAGFNDL.MRPVMYGS....YHHISVLPADG..........................................RKIEQLPLRETLVAGPLCESGD.IF...TQVEG..GGIAPRALP.........PVQVGDYLVFHDTGAYGASMSS.NYNSRP..LISEVLF
+Q8F7A1_LEPIN/276-395 SILTTVDDVVS.TGP.......................................................................................GGYT.............FVK.LDAGMDVN.TRPSLYAA....KHPLVVVSKE............................................GVHSGKTADYVYVGHCCESGD.LF..............TQAEGGGPITRITGEAKLGDYVVMEGAGAYCSSMSTKNYNSFP..ETAEVLV
+Q8GGR7_STRAZ/284-405 SLVTKVIDKAD.TGA.......................................................................................EGNS.............FLK.INSGLTEI.ARPSYYGV....QHPIVSVPATG.........................................GAERAADDREEFNVVGHCCIAGD.VL..TAK.........QEELAPVP....LGRTEIGDYVVIERAGSYCSSMSMKNFNSYP..EAAEVLR
+DCDA_METJA/305-410 YLLGKVHHIKE.TP.........................................................................................VTK.............WVM.IDAGMNDM.MRPAMYEA....YHHIINCK................................................VKNEKEVVSIAGGLCESSD.VF...GR.........DRELD.........KVEVGDVLAIFDVGAYGISMAN.NYNARG..RPRMVLT
+#=GR DCDA_METJA/305-410 SS -EE--EEEEEE.-S.........................................................................................S-E.............EEE.E-----S-.-HHHHH--....---EEESS................................................--SSEEEEEEE-----TT-.--...--.........-EEEE.........-------EEES-------TT-B.-TTT--..--EEEEE
+Q7ULZ0_RHOBA/283-389 YLITKVINQKS.SY..........................................................................................KD.............YVG.VDACMSNL.MRPGMYGA....YHHITVMGK..............................................EDQPADRTVDIVGSLCENND.KF...AI.........DRKMP.........ATEVGDIAVIHDAGAHGHSMGF.QYNGRL..RSAEIVF
+Q6SHW6_9BACT/289-395 ILLAQVTGIKD.SY..........................................................................................KT.............FIG.LDAGMETL.MRPALYGA....VHRIYKVGA..............................................LMEEQNLTVDITGRICENTD.RL...AI.........DIPFP.........DVAEGDLIAIMDTGAYGYAMAH.QFNTRP..RPAEVLI
+Q5V5E3_HALMA/306-412 CILTEVNTVKE.TP.........................................................................................AAT.............VVG.VDASLATL.IRPAMFGS....YHPIRNVT...............................................APEREAEPVSVGGPCCTSAD.VF...CT.........DRPLA.........RPERTDLLAIGNAGAYGYELAN.QFHSQP..RPAEVAF
+DCDA_METTH/292-398 YLLTRVNTIKE.SY..........................................................................................RK.............FAG.VDAGFNTL.LRPAMYGS....YHHILVAER..............................................PLDEPSEKMDVAGNVCESGD.LF...AR.........DRQLP.........EINEGDVLAIMNAGAYSFSMSS.QYNSRP..RPAEVLV
+Q87EA9_XYLFT/758-866 VLLTRVTQVIE.KD.........................................................................................DIL.............RVG.LEAGMHTL.IRPALYDA....WHGVENLTR..............................................LDETPHVLCDVVGPICESSD.VF...GR.........RRHLPA........ATASGDLMLIADAGAYGFSMAS.TYNLRG..LPAEVVL
+DCDA1_ARATH/351-459 CFVNHVTGVKT.NG.........................................................................................TKN.............FIV.IDGSMAEL.IRPSLYDA....YQHIELVSP.............................................PPAEAEVTKFDVVGPVCESAD.FL...GK.........DRELP.........TPPQGAGLVVHDAGAYCMSMAS.TYNLKM..RPPEYWV
+DCDA_PSEFL/285-390 VLLTQVEYLKH.TE.........................................................................................HKD.............FAI.VDAAMNDL.IRPALYQA....WMDVTAVR...............................................PRDTAARSYDIVGPICETGD.FL...AK.........GRELA..........LEEGDLLAVHSAGAYGFVMSS.NYNTRG..RCAEVLV
+Q5FPL4_GLUOX/282-390 ILLTRVIETKA.GN..........................................................................................PD.............FVV.LDAAMNDL.ARPSLYES....WHGIMPVAP.............................................NGLTSLTKLWDIVGPVCESSD.IF...AR.........DRALPA........DTKRGDLIALLDTGAYGSVMSS.TYNTRP..LAAQVLI
+Q9A681_CAUCR/288-394 VLVSEVIHVHERPE.........................................................................................GRK.............FLV.IDAAMNDL.VRPAMYDA....FHDIRPVI................................................QRTGETVYDVVGPVCETGD.TF...TR.........DRALP.........PFAAGDLVAFMSAGAYGAAMAS.EYNTRP..LVPEVLV
+Q5FEQ0_EHRRW/291-397 ILLAKVLYHKS.NY.........................................................................................EKN.............HLV.LDTGMNDL.IRPALYNA....EHTIIPAV...............................................VSSKSHLSFDIVGPICESDD.TF...AY.........SYWIN.........NVDNNEIVAICTVGAYGSSMSS.NYNSRP..LVPEVIV
+Q7MT14_PORGI/263-379 SLITQVLYIKE.GK.........................................................................................AKK.............FAI.VDAGMTDL.VRPALYEA....HHQIRLVQPGEWT.....................................MRATSPSAALTEKYDVVGPICESSD.VF...ER.........ELLMP.........ELKRGDYLAIRSAGAYGAVMAS.SYNMRP..LPGSLFS
+Q6MM66_BDEBA/286-391 ALITQVQYIKE.TS.........................................................................................AKT.............FVI.VDAGMNHL.IRPSLYEA....THRIEPLK................................................RKDAAFVVDVVGPICESSD.FF...AK.........EISLT.........KVQEGDFVAIMDSGAYGYSMAS.VYNLQE..LPLEICI
+Q6L350_PICTO/286-391 IALATVTDLKN.YG..........................................................................................RS.............IAG.TDLGMNIL.IRPALYGA....VHEIICIN...............................................KNDDKLFNYDITGQICENTD.FT...GL.........NVKLP.........GLEPGDILGIMNAGAYVSSMSS.NYNSLS..RAAEVLI
+Q97AJ0_THEVO/281-380 ILVGKVYDVYN..............................................................................................G.............FVG.TDIGMNIN.IRHALYGA....EHRFYALT................................................GRSDEAEYIVTGQICENTD.VT...GR............LTG........KVQIGDLVAMYDAGAYIYSMSS.NYNGRF..RPTEVIV
+Q728N7_DESVH/285-394 LLLGSVHSVKS.NG.........................................................................................ANR.............YVG.TDLGFNVL.ARPVMYDA....HHDIEVYRED............................................GAPSDLLLPQTVVGNICESGD.II...AR.........NRPLP.........PVEEGDILGVLDAGAYGYVMSS.SYNQRM..RPAEVLI
+Q62B72_BURMA/307-413 MLVLRVAYVELKRN..........................................................................................RR.............FVG.LNGGFNLA.IEPAFYDL...PCEPVPCVR................................................RPGPAQSVCVAGNINEALD.VW...GN.........DVSLP.........PVEPGDFIALLNAGGYASSMSS.NHCLRG..QFRELAL
+Q66B85_YERPS/267-374 YLVTRIVFAKCR.............................................................................................Y.............STNVITTAVPGTNIRSAQYHN....HRKVLIIPE.............................................RPVNCEHSVADVYGSNCYEND.II...AK.........NVPVPF........DLSLDDKIAIFSCGAYDIMNSSDWIRK....RPPIIVI
+Q5NIN9_FRATT/298-400 ALLTTIVGTREQNE.........................................................................................DFQ.............SLI.TDAGIHTI...PTISTY....RHPIYHLK................................................TDSYHKKTLLLGPSCMQHD.FL...HD.........DIFLP.........KLEYGDKLLIDGVGAYNISRNN.EFIHLK....PSVIL
+Q8XS02_RALSO/281-396 VLLTGIKRDIVQH...........................................................................................SL.............GNIVVTDGSRMLMPSAQLRNR....AHHTVFLDAAF.........................................NEVVDYSRRCVAKVRGRSILRNDYIL...PG.........DVVAPE........TVKAGEYMLILDVGAYCATQHM.EFLNVP..PAGEVLV
+SPEA_XYLFT/343-555 VLIANVTEVEAVPEGRVPGVCDDEPAVVRHMREIYGELDARPAIELFYEAQHFHA.......EGLAAYTLGQIDLVHRARIDDLFYAISHGVRERLSHEEKSHRPV....LDELNERLVDKYFVNFSVFESIPDVWAINQ....IFPIVPIER..............................................LNEVPTRRGVVCDLTCDSDG.TV...KQYVE..NESLDSALPLH.....VLRHGEAYRIGFFLVGAYQEILGD.IHNLFG..DTDAVEV
+Q5NHM0_FRATT/327-467 LLITKPLIKQHESDIENEILHQ..........................................................................QWLDREVSLGELQSYLPQNQKNTQQAWLNFSIFQSLPDHWGIDQ....KFPILPLEF..............................................FNSYVTSEVKLYDISCDVDG.VV.....K......STSEYIEI........ATDNIEYIVFMCVGAYQGMLSA.KHNMLG..NISAVNI
+SPEA_PROMP/355-574 VLIFNILGTSHVSSQVKVSDQKKQSLIITNLIETLNQIKNLRDKKEDLSEIIELWNDAKKFKEDCLVAFRLGFICLEERAYAEELTWACAKEIANQLENNEIIHPD....LSEITDTLASTYYANLSVFKSIPDTWAINQ....VFPIIPIHR..............................................HLEEPFCKGHFADLTCDSDG.KL...NNFID..NGKIKSLLNLH.....PPEKNNDYLIGIFMAGAYQEALGN.FHNLFG..NTNVIHI
+SPEA_GLOVI/346-557 VLVFDVMGVSHLQFGEPEPPARNEHSIIRNLYETYTQITPDNVQEAFNDASQFKE........EALSLFALGYLGLGERARAERLYWGCCEKILNLVRELDYIPDE....LADLEKNMASTYYCNFSVFQSAPDSWAIDQ....LFPIMPIHR..............................................LDEEPKARGTLADLTCDSDG.KI...DQFID..LRDVKGVLELH.....PVRPEEPYYLGMFLNGAYQEILGD.MHNLFG..DTNTVHI
+Q6MQU4_BDEBA/373-587 VLVFNVMGVNDLHRHEPPRPATKTDHSIMQDMQYIFEKVNKDNINECFNDLEQAK.......QETLQLFTYGVLSLEQRAWCESMYFAIATKMIKLARATPDCEDI....VAALGKELCDTYFSNFSVFQSVPDSWAVGQ....LFPVIPIHR..............................................LGEEPKREATLADLTCDSDG.VI...EKFIDTASGEPKETIRLH.....QFTEGQQYYLGVFLTGAYQEILGD.LHNLFG..DTDAVHI
+Q72F01_DESVH/373-585 MLLFNILDVSRVEIGNLPDALPEDTPEPVRNMREVLAGMTLRNLQECYNDALYYR.......DAVRQLFLTGQVTLRQRTLSERLFWAIMKRIAQEKQKLKHVPKD....LAEIDVALADIYYGNFSVFQSLPDSWAIDQ....LFPVMPVHR..............................................LQELPSRQGILSDITCDSDG.RI...DHFID..PQGMKGTLDLH.....PLRDGEEYYLGVFLVGAYQETLGD.LHNLLG..DTNVVSV
+Q5SHU0_THET8/347-559 VLVLQVIDVIAPPGEARPSPPPPEAHPLVKELWESLQSLSPKNFQEVYHDAFADK.......ETLQTLYDLGLVSLRDRALAEEIFYHIARRVQTIAQNLPYVPDE....LEDLEKLLADKLVCNFSVFQSLPDAWAIHQ....LFPVVPLSR..............................................LLEPPTRRATLVDISCDSDG.KM...DRFID..LHDVRQTLPVH.....PVRPGEPYYLGVFLVGAYQDVLGS.NHNLFG..QVGEAHV
+SPEA_BACTN/346-558 VLIFEVLETATLPEWDDEEEIAPDAHELVQELYSIWDSLNQNKMLEAWHDAQQIR.......EEALDLFSHGIVDLKTRAQIERLYWSITREINQIAGGLKHAPDE....FRGLSKLLADKYFCNFSLFQSLPDSWAIDQ....IFPIMPIQR..............................................LDEKPERSATLQDITCDSDG.KI...ANFIS..TRNVAHYLPVH.....SLKKTEPYYLAVFLVGAYQEILGD.MHNLFG..DTNAVHV
+O25176_HELPY/412-542 VL..........AHLIVKKAV............................................................................QLLYVKDHN.D..ILRIQEQVQERYLLNCSFFQSLPDYWGLRQ....NFPVMPLNK..............................................LDEKPTRSASLWDITCDSDG.EI...A.F......DSTKPLFLHD....IDIDEEEYFLAFFLVGAYQEVLGM.KHNLFT..HPTEFSV
+SPE2_ARATH/396-596 VLIFEAVSADKPMVHQATPGDIQFLLEGNEEARANYEDLYAAVMRGDHESCLLY..........VDQLKQRCVEGFKEGVLSIEQLASVDGLCEWVLKAIGASDPV.............HTYNINLSVFTSIPDLWGIDQ....LFPIVPIHK..............................................LDQRPGARGILSDLTCDSDG.KI...NKFI.....GGESSLPLHEL.DKNGSGGR.YFLGMFLGGAYEEALGG.VHNLFG..GPSVVRV
+O04429_DIACA/405-605 ILVFEAVSSSSSASPPMPGSTLALDYLVDGLTDEVKGEYRSLTAAAMRGEYESCL.......MYSGMLKQRCVELFKDGCLGMEQLAAVDGLCELVSKALGVADGV.............CTYNVNLSVFTSIPDFWGIGQ....LFPIMPIHR..............................................LDQQPKARGILSDLTCDSDG.KI...DKFI.....GDESSLPLH.....ELSGGEGYYLGMFLGGAYEEALGG.VHNLFG..GPSVVRV
+SPE1_AVESA/355-532 MIILEALSAIPEPKDDEDEATTEQLHGRIRDLSSKLQPTGLS..................................MSSHAVHIKKHGIEMYKLGKKLSKSVTTDA..........HTIYNYHMNLSVFSLMPDYWGIQH....LFPMMPVSR..............................................LDEKPTHKATLVDVTCDSDG.KV...DKFI.....RDTETMPLHP....LDPKLGGYYVAVLLTGAYQEALSN.KHNLFG..GPSLVRV
+Q5X0L3_LEGPL/343-556 VLISNITDVEIINKAPVLPEISEDDSHVIRDIYDTYQAITDSSPTEIYNYAAHSLN......EAHSLFKHGVISLQEKAKVEAFYTNICMEIKDKLDEENPSEKAL....LMRINECMAAKIFCNISFFQSIPDAWAIGQ....IFPVAPISQ..............................................LNRTLSMHSVLQDLTCDSDG.TI...KQYPG..SSCVTTTLMLP.....SYDINNPYNIGFFLVGAYQEILGN.LHNLFG..DTNSLDV
+SPEA_CHRVO/343-556 VLLMNVTDVERLPDTVAPIDKAEELSLPLRKLVELANLNDEELVTEIYYRASHCVS......EVSEMYAEGRLSLQEKALAEDLHATLCRRLHNQLQASQRSQRQV....YDELTDRLADKYFCNFSVFQSLPDTWAIDQ....VLPIMPVHR..............................................LAEQPTRRAVLQDLTCDSDG.KL...KQYVD..QQSIESSMSVH.....EVKQGDEYLIAVFLVGAYQEILGD.MHNLFG..DTDSVNV
+SPEA_VIBVY/354-570 VLISNVIGTETYKPETVTEPEEDFPLLLNNMWRSWLNLHNGTDARALIEIYNDTQSD...LAEVHSQFATGVLTLEHRAWAEQTSLRIYYELNRLMSTKNRFHRPI....LDELSERLADKFFVNFSLFQSLPDSWGIDQ....VFPVLPLSG..............................................LQNAADRRAVMLDITCDSDG.AI...DAYVD..GQGIESTLPVP.....AWNEDEPYLMGFFLVGAYQEILGD.MHNLFG..DTHSVVV
+Q7PZA0_ANOGA/274-386 TALVNVVSKSYEKDVD.....................................................................................GAVVR.............VRYYVDDGLYDT.FDWCDDQG....SGPLLQED...............................................KRGAPCVRSVIYGRTMCEHD.VI...RE.........EISLP.........EHEIGDCLVFPNRGAYAKLLGR.GHNGFR..PTGTKVC
+Q60D03_SOLDE/147-257 TLVTHVIGKRVRG...........................................................................................EK.............IEYWIDEGIYGS.FRPTLYNS...CFVGIKTISM..............................................KESCEIGESTIYGPSCDSLD.AV...AV.........DIKLP.........ELELDDLIVFYDMGAYSKCAGT.KFNGFDMLSTPTYIV
+DCOR_NEUCR/326-471 TLACNIIARRTIQDGSAVSV.............................................................................SDSSSMSDD.G..SVNNGDARYMVY.VNDGLYGN.FSSIMFDH....QHPVAKILRAGGRTMY................................NSVAAHESSAEDAIEYSIWGPTCDGID.RI...TE.........SIRFRE........ILDVGDWLYFEDMGAYTKCSAT.TFNGFS..NEHDVIY
+#=GR DCOR_NEUCR/326-471 sAS ......................................................................................................................................................................................................................*.........................................................................
+DCOR_YEAST/329-460 TLASHVIAKRKLSE.........................................................................................NEA.............MIY.TNDGVYGN.MNCILFDH....QEPHPRTLYHNLEFHYDDFE........................STTAVLDSINKTRSEYPYKVSIWGPTCDGLD.CI...AK.........EYYMKH........DVIVGDWFYFPALGAYTSSAAT.QFNGFE..QTADIVY
+#=GR DCOR_YEAST/329-460 sAS ......................................................................................................................................................................................................................*.........................................................................
+DCOR_CANAL/324-468 TLITHIIARRDLPTGGN...................................................................................NNNNDM.........TPSAMLY.INDGVYGN.LNCILFDH....QTPKVYVLTNENQLFYKQEM.......................MRSLSVNNNNNNNNKTDGFKFSIWGPTCDGLD.CV...SS.........LAKLSK........NVQVGDWLFFENVGAYTSCAST.KFNGLSSGETKTLYV
+#=GR DCOR_CANAL/324-468 sAS ......................................................................................................................................................................................................................*.........................................................................
+Q84527_PBCV1/263-371 VLATQVIGKRVRD...........................................................................................GL.............YEYFFNESTYGG.FSNVIFEK....SVPTPQLLRD............................................VPDDEEYVPSVLYGCTCDGVD.VI...NH.........NVALP.........ELHIGDWVYFPSWGAYTNVLTT.SFNGFG...EYDVYY
+#=GR Q84527_PBCV1/263-371 SS EEEEEB---EE--...........................................................................................--.............EEEEBS------.-THHHHS-....-----EESS-............................................--TT--EEEEEEE--------.-S...EE.........EEEEE.........------EEEES-----SGGG--.------...-EEEEE
+Q5MNH7_NEOUN/277-400 YLAVKVVARRVNATAF.....................................................................................GHEPA............TRLY.INDGIYSNFMMRFIVNM....TFSPAAVIREGVW......................................HDQADHTMRGEACSLWGRSCDSND.CI...NR.........DCRLGP........EVRVGDWLVFKDMGAYTTVCNT.TFNGFT..SSNHTIY
+Q58P26_ENTHI/268-382 HLVSSLHGKRVRIQN.......................................................................................GKKQ.............IEYTSGDGLHGSFGCCIWFEK....QKSCECITQK............................................VNENTKMYESIIYGPSCNGSD.KV...A..........TQELPE........MEPGKDWLLFPNMGAYTISMAT.NFNGFE..ERNHVIY
+O15696_PLAFA/807-931 SKLGNITNIKKKVVNI.....................................................................................NDNRY...........NYFSYYVSDSIYGC.FSGIIFDE....YNRCPIYVIKNKN.....................................NPNQNFMNFNLYLANVFGQSCDGLD.MI...NS.........ITYLP.........ECYINDWLLYEYAGAYTFVSSS.NFNGFK..KCKKVYI
+DCOR_LEIDO/509-682 ALLMNVFASRTLRLSDVEVS..............................................................................RQAFQSVV.....SMDEPEEYQYY.VNDGLYHS.FNCILFDH....AHPTLLLLNDGDGADGVESGTEAAAVCSEEEGETSLSGPLANDPLFMSAWDRRRSFARRPLRITTIFGPTCDSMD.CI...LK.........KQPFP.........EMKLGDWLLVPDMGSYTTAAAG.FFNGFA..TRRLEWV
+#=GR DCOR_LEIDO/509-682 sAS ......................................................................................................................................................................................................................*.........................................................................
+P78829_SCHPO/238-357 TLAVNVIAKRKLDDE........................................................................................EKV.............MYY.VNDGVYGS.LNCILFDH....QHPVARVLKCGSR.....................................FVYNDLVGTGQHRCFIWGPTCDSLD.VI...AN.........DAHLPY........EPNVGDWIYFEDAGAYTVAAAS.CFNGFK..TSRIVYL
+O76203_HAECO/287-407 TLVCNIIHATEVSAEKIT..................................................................................KRPEDV........EERGFMYY.VNDGVYGS.FNCILFDH....VQPVGTPLF..............................................DEIAQEYPSTIWGPTCDSLD.KI....E.........DQKLMR........MMSVGEWIVYRNMGAYTCSAST.TFNGFQ..RPNAIYM
+DCOR_PANRE/294-416 SVTTNVIASVKVPASRIT..................................................................................EKADDV........NRDGYMYY.MNDGVYGS.FNCKLFDH....YQPRGMPLAE............................................HDADEPRFPVCVWGPTCDGLD.QV...EE.........SSVMP.........RLYEGDWLYYPDMGAYTSVAAS.TFNGFD..KPKTYYF
+#=GR DCOR_PANRE/294-416 sAS ......................................................................................................................................................................................................................*.........................................................................
+#=GC SS_cons EEEEEEEEEEE--S.........................................................................................S-E.............EEEEES----S-.-CHHHHS-....---EEECSS-............................................--TTSSEEEEEEE-----TT-.-S...EE.........EEEEE.........------EEEES-----SGCC-B.-TTT--...-EEEEE
+#=GC seq_cons sLlspVhsh+p.st..........................................................................................tt.............hhh.lssGhhsp.hsshhhst....hhslhhht...............................................hpspstttsslsGsoC-usD.hl...sp.........chhLP.........plp.GDhlshhssGAYshshus.saNuhs..tsshlhl
+//
+# STOCKHOLM 1.0
+#=GF ID NIF3
+#=GF AC PF01784.11
+#=GF DE NIF3 (NGG1p interacting factor 3)
+#=GF PI DUF34;
+#=GF AU Bashton M, Bateman A
+#=GF SE Pfam-B_1006 (release 4.2)
+#=GF GA 23.40 23.40;
+#=GF TC 24.10 24.00;
+#=GF NC 22.00 23.30;
+#=GF BM hmmbuild HMM.ann SEED.ann
+#=GF SM hmmsearch -Z 9421015 -E 1000 HMM pfamseq
+#=GF TP Family
+#=GF RN [1]
+#=GF RM 8663102
+#=GF RT Transcriptional activation by yeast PDR1p is inhibited by its
+#=GF RT association with NGG1p/ADA3p.
+#=GF RA Martens JA, Genereaux J, Saleh A, Brandl CJ;
+#=GF RL J Biol Chem 1996;271:15884-15890.
+#=GF RN [2]
+#=GF RM 11124544
+#=GF RT Isolation and characterization of a novel human gene, NIF3L1,
+#=GF RT and its mouse ortholog, Nif3l1, highly conserved from bacteria
+#=GF RT to mammals.
+#=GF RA Tascou S, Uedelhoven J, Dixkens C, Nayernia K, Engel W, Burfeind
+#=GF RA P;
+#=GF RL Cytogenet Cell Genet 2000;90:330-336.
+#=GF DR INTERPRO; IPR002678;
+#=GF DR SCOP; 1nmp; fa;
+#=GF CC This family contains several NIF3 (NGG1p interacting factor 3)
+#=GF CC protein homologues. NIF3 interacts with the yeast
+#=GF CC transcriptional coactivator NGG1p which is part of the ADA
+#=GF CC complex, the exact function of this interaction is unknown
+#=GF CC [1,2].
+#=GF SQ 122
+#=GS Q6AQL0_DESPS/7-255 AC Q6AQL0.1
+#=GS Q1NWG7_9DELT/9-267 AC Q1NWG7.1
+#=GS Q1JZJ5_DESAC/11-364 AC Q1JZJ5.1
+#=GS B3E3Z5_GEOLS/16-365 AC B3E3Z5.1
+#=GS B5EBN8_GEOBB/8-355 AC B5EBN8.1
+#=GS A0LHK1_SYNFM/6-257 AC A0LHK1.1
+#=GS Q1ASW8_RUBXD/7-359 AC Q1ASW8.1
+#=GS Q24T08_DESHY/7-373 AC Q24T08.1
+#=GS Q67RW0_SYMTH/3-355 AC Q67RW0.1
+#=GS A6NV06_9BACE/2-238 AC A6NV06.1
+#=GS A7VVR8_9CLOT/6-241 AC A7VVR8.1
+#=GS Q2S0R3_SALRD/53-405 AC Q2S0R3.1
+#=GS A7V376_BACUN/5-351 AC A7V376.1
+#=GS Q7MTC6_PORGI/5-351 AC Q7MTC6.1
+#=GS Q11U42_CYTH3/6-352 AC Q11U42.1
+#=GS A6ENK7_9BACT/5-358 AC A6ENK7.1
+#=GS A3ZRR2_9PLAN/11-256 AC A3ZRR2.1
+#=GS Q7UDY5_RHOBA/21-282 AC Q7UDY5.1
+#=GS A4ECC5_9ACTN/5-252 AC A4ECC5.1
+#=GS Q83GL0_TROWT/12-270 AC Q83GL0.1
+#=GS A7BDB0_9ACTO/13-271 AC A7BDB0.1
+#=GS A0LTB3_ACIC1/18-373 AC A0LTB3.1
+#=GS Q6AFH9_LEIXX/10-259 AC Q6AFH9.1
+#=GS Q6M3K0_CORGL/8-362 AC Q6M3K0.1
+#=GS A8ZUC2_DESOH/8-358 AC A8ZUC2.1
+#=GS Q6M164_METMP/5-237 AC Q6M164.1
+#=GS A3MU59_PYRCJ/10-266 AC A3MU59.1
+#=GS Q8TZC0_METKA/12-224 AC Q8TZC0.1
+#=GS A5UKQ3_METS3/5-218 AC A5UKQ3.1
+#=GS Q2FPY1_METHJ/5-230 AC Q2FPY1.1
+#=GS Y1146_METTH/8-215 AC O27214.1
+#=GS Q8TW44_METKA/6-234 AC Q8TW44.1
+#=GS Q0W3L4_UNCMA/5-231 AC Q0W3L4.1
+#=GS Q12Z61_METBU/5-232 AC Q12Z61.1
+#=GS A0ZGU3_NODSP/5-248 AC A0ZGU3.1
+#=GS Q310X0_DESDG/5-312 AC Q310X0.1
+#=GS Q1MR73_LAWIP/5-246 AC Q1MR73.1
+#=GS A1VDX4_DESVV/5-310 AC A1VDX4.1
+#=GS Q7MQP7_WOLSU/6-230 AC Q7MQP7.1
+#=GS Q7VIG7_HELHP/17-261 AC Q7VIG7.1
+#=GS Y959_HELPY/6-231 AC O25613.1
+#=GS A8EW77_ARCB4/5-232 AC A8EW77.1
+#=GS Q30TF6_SULDN/5-228 AC Q30TF6.1
+#=GS A7GZB8_CAMC5/5-228 AC A7GZB8.1
+#=GS A7SAJ3_NEMVE/5-336 AC A7SAJ3.1
+#=GS Q4CW43_TRYCR/7-273 AC Q4CW43.1
+#=GS Q5KCX5_CRYNE/12-280 AC Q5KCX5.1
+#=GS NIF3_SCHPO/9-265 AC O94404.1
+#=GS Q7S5H9_NEUCR/62-330 AC Q7S5H9.2
+#=GS A6SM83_BOTFB/24-302 AC A6SM83.1
+#=GS Q5B6Z5_EMENI/15-342 AC Q5B6Z5.1
+#=GS Q4KMJ5_DANRE/5-334 AC Q4KMJ5.1
+#=GS A4IGP2_XENTR/5-334 AC A4IGP2.1
+#=GS Q6P1B7_MOUSE/31-363 AC Q6P1B7.1
+#=GS NIF3L_DICDI/12-341 AC Q55E83.1
+#=GS Q8SV52_ENCCU/5-229 AC Q8SV52.1
+#=GS Q6FQE2_CANGA/13-283 AC Q6FQE2.1
+#=GS A3LS90_PICST/8-261 AC A3LS90.1
+#=GS Q86F61_SCHJA/5-335 AC Q86F61.1
+#=GS Q14P57_SPICI/5-233 AC Q14P57.1
+#=GS Q2SRY9_MYCCT/5-244 AC Q2SRY9.1
+#=GS Q6F1J4_MESFL/5-244 AC Q6F1J4.1
+#=GS Q8EUT6_MYCPE/5-240 AC Q8EUT6.1
+#=GS Q4A5V5_MYCS5/5-245 AC Q4A5V5.2
+#=GS Q6KI02_MYCMO/6-252 AC Q6KI02.1
+#=GS A5IY53_MYCAP/5-248 AC A5IY53.1
+#=GS Q601Y7_MYCH2/5-239 AC Q601Y7.1
+#=GS Y351_UREPA/10-250 AC Q9PQE0.1
+#=GS Q7NB92_MYCGA/5-241 AC Q7NB92.1
+#=GS Q3F0L5_BACTI/6-294 AC Q3F0L5.1
+#=GS Q0SN38_BORAP/5-237 AC Q0SN38.1
+#=GS A9B0A0_HERA2/5-242 AC A9B0A0.1
+#=GS Q1IWV8_DEIGD/21-255 AC Q1IWV8.1
+#=GS Q73KL0_TREDE/5-248 AC Q73KL0.1
+#=GS Q2LUC1_SYNAS/5-241 AC Q2LUC1.1
+#=GS Y1777_ARCFU/5-234 AC O28497.1
+#=GS Y1424_PYRAB/5-239 AC Q9UYT3.1
+#=GS Y1766_HALSA/5-242 AC Q9HP80.1
+#=GS A8B7G6_GIALA/7-257 AC A8B7G6.1
+#=GS A5EYD5_DICNV/5-236 AC A5EYD5.1
+#=GS Q5WY60_LEGPL/6-241 AC Q5WY60.1
+#=GS Y291_BUCAP/5-236 AC Q8K9N4.1
+#=GS Q1Z5P6_PHOPR/5-241 AC Q1Z5P6.1
+#=GS Q6FCJ5_ACIAD/6-241 AC Q6FCJ5.1
+#=GS A2S764_BURM9/5-237 AC A2S764.1
+#=GS A5CVR4_VESOH/6-235 AC A5CVR4.1
+#=GS Q21U81_RHOFD/6-241 AC Q21U81.1
+#=GS A6GMA8_9BURK/8-242 AC A6GMA8.1
+#=GS A0L3K9_MAGSM/6-241 AC A0L3K9.1
+#=GS A3YBU9_9GAMM/11-248 AC A3YBU9.1
+#=GS Q6MC02_PARUW/7-241 AC Q6MC02.1
+#=GS Y108_CHLTR/5-240 AC O84110.1
+#=GS Q609U6_METCA/7-244 AC Q609U6.1
+#=GS A9VML6_BACWK/5-238 AC A9VML6.1
+#=GS A6TKN7_ALKMQ/5-263 AC A6TKN7.1
+#=GS A4J511_DESRM/5-303 AC A4J511.1
+#=GS Q3Z2K6_SHISS/9-274 AC Q3Z2K6.1
+#=GS Q022B6_SOLUE/14-253 AC Q022B6.1
+#=GS A4IP70_GEOTN/7-250 AC A4IP70.1
+#=GS Y1125_STAEQ/5-353 AC Q5HNY9.1
+#=GS A5KQA2_9FIRM/5-253 AC A5KQA2.1
+#=GS Q8RE15_FUSNN/5-246 AC Q8RE15.1
+#=GS A0Q1P0_CLONN/7-258 AC A0Q1P0.1
+#=GS Q0TNV6_CLOP1/5-249 AC Q0TNV6.1
+#=GS B8CXH0_HALOH/6-355 AC B8CXH0.1
+#=GS Y1073_LACLA/5-244 AC Q9CGM3.1
+#=GS A5LFS5_STRPN/5-252 AC A5LFS5.1
+#=GS Q4ETV8_LISMO/8-360 AC Q4ETV8.1
+#=GS Q038U7_LACC3/6-251 AC Q038U7.1
+#=GS B3XRX7_LACRE/6-257 AC B3XRX7.1
+#=GS Q5FJU7_LACAC/6-251 AC Q5FJU7.1
+#=GS Q03Y42_LEUMM/5-248 AC Q03Y42.1
+#=GS A8MG99_ALKOO/7-357 AC A8MG99.1
+#=GS A4XK84_CALS8/6-353 AC A4XK84.1
+#=GS B0K888_THEP3/7-356 AC B0K888.1
+#=GS Q18BX9_CLOD6/5-352 AC Q18BX9.1
+#=GS A0RIR2_BACAH/9-360 AC A0RIR2.1
+#=GS A4J7B6_DESRM/6-358 AC A4J7B6.1
+#=GS Q0AZ81_SYNWW/7-359 AC Q0AZ81.1
+#=GS Q3AEW6_CARHZ/6-353 AC Q3AEW6.1
+#=GS B8I6N4_CLOCE/5-249 AC B8I6N4.1
+#=GS A3DDU7_CLOTH/7-355 AC A3DDU7.1
+Q6AQL0_DESPS/7-255 DILESIEGDAPKSLA..E.SW.DNV.............................GL...LVG..........DKER..........................QVKRVLVGLDPTTSLLAEAIE......LG.ADTVITHHP...V.IF................HPLSAIDTS....TPVGIIIEQALL.H...........KISLIASHTNLDSAAS.GVSQALA.IAL.....GLE.........KCCPLLPSSEGI...............................................................................................................EGTGLGCL.AEFST.P....LLWEDFCDLLLERL.SV.........LS......VQVA.......G.SVPKRVA.....RVA..LCGGSG [...]
+Q1NWG7_9DELT/9-267 KLLTLLDTVSPFSQA..A.AW.DNV.............................GL...MVG..........AVHR..........................EVSGILLALDPTPDLLEECRH......HH.CNTIITHHP...P.IF................HPLPSIRTD....QPEGQLVSQAIK.D...........DINLLACHTNLDVVAD.GVSDVLA.RLL.....GIT.........ASAPLEPLERPAGAQAA.....................................................................................................TGAKAPLSGFGRY.GQLAS.P....MAGEEFLARISDRL.KL.........PA......LSVA.......G.PIPRQVS.....TVA..VCGGSG [...]
+Q1JZJ5_DESAC/11-364 DLVGWLNRNYPQSLA..E.EW.DNV.............................GL...QVG..........DLNQ..........................EITKVMVALEPTEQTIKQAID......HH.CQLLISHHP...L.LF................KPLKKISKN....DETGRILFAAIQ.N...........NLAIVSAHTNLDHAAD.GLNDWLA.ECL.....DLG.........ATTPLLPPRSGDLVKLVVFVPEDDTDRVATALFKAGAGHIGGYDHCSFRNRGTGTFRPGTDTQP.......FIGQTGQDERVDEVRLETIVPRHRLAATLQRMEKAHPYEEVAYDLIPLENRRQDIGLGRI.GRLAE.P....LSLEELAHRCKDKL.DC.........AA......LRIV......AA.EQPRPVN.....KVA..VCGGSG [...]
+B3E3Z5_GEOLS/16-365 DIAGIINKKYPFRLA..E.DW.DNV.............................GL...QLG..........DTTK..........................SVTRIMVALDPLPQVITSALD......HN.CDLLVTHHP...L.IF................SPLRQITSS....TSTGNSLLLAAQ.G...........GLALLAMHTNYDIATD.GLNDLLA.DRI.....GLQ.........QTRPLKITSRDELIKLVVFVPEEQLATVRSALLPHAESIGNYQDCSFSTRGEGTFLPLAGAEP........AIGTIGKQEKVAEQRLELLLRRDQLSRAIRTLLAVHPYEEPAFDCYPLLNEAAAKGLGRI.GYLPE.P....VVLADWAGSVAKQL.DC.........ET......LRFV.......G.DTGRSIR.....KIA..LCSGSG [...]
+B5EBN8_GEOBB/8-355 DISGITGKIAPTHLA..E.SW.DNV.............................GL...QLG..........DPSS..........................QVSRIMVALDPGRPAVEAAVE......IG.CQLLITHHP...F.IF................TPLKKISTA....DETGRLAILALK.N...........DLSIISLHTNFDIAPG.GVNDLLA.GLL.....GIQ.........GAQPLRITGGDEYVKMVLFAPSGCEEKLLGALSPFMPHIGNYRDCSYQGEGTGRFTPLPGARP........FVGEVGASHAEPESRLEILLVKERIAAAVAALKGAHPYEEPAYDLYPVLNRGEAYGLGRI.GKLAE.P....VTAGAYALQVKERL.AA.........TG......VRLV.......G.DPARQVK.....KVA..LCGGSG [...]
+A0LHK1_SYNFM/6-257 DVMDWVDAYAPFRFS..A.GW.DRC.............................GL...QVG..........DPEA..........................ELSRLLVALDPGSTTLGEALS......LK.CQCVVTHHP...L.IF................QPLESVRAD....VFPGKLIMTAVR.E...........GISLICAHTNLDAARA.GTNEQLA.RVF.....ALQ.........GVTPLEIDAAWQD............................................................................................................EPRYAGMGCV.GELPA.E....MSLDGLASFAAAAM.GG.........GA......VRVV.......G.EPGRSVR.....RVA..VCTGSG [...]
+Q1ASW8_RUBXD/7-359 QVVEAVERLAPPELA..E.GW.DNC.............................GL...QVG..........DLSS..........................EVSRVLVALTPLPEVFDEAEE......EG.ADFLLLHHP...L.LF................RPVRSLDTS....GYPGDLVARAVR.A...........GITVYAAHTSYDAAPG.GVSEALA.AAL.....GLR.........GPLEV.VSPRGSLRKLVVFVPEEHADGVAEALAGEGAGVIGDYTHCTFRAPGTGTFLGGEASSP.......AVGERGRLERVPEVRLETVVPAHLARRAVAAAKAAHPYEEVALDLYPVDGHPQDCGYGRV.GRLPE.P....LSPEELRERVSEAL.GA.........PA......RLVA......NP.SPGERVE.....RVA..ALGGSG [...]
+Q24T08_DESHY/7-373 LIAQIIERVAPKAWA..E.EW.DNV.............................GL...LVG..........DFAA..........................PVERILVALDATPEVLQEARE......KD.VQLIVAHHP...I.LF................RALKNLRSD....NQSARLPIQMIQ.S...........GIAYYAAHTNLDQSPL.SSSWSLG.KAL.....ELE.........KMEHLKLTHAEKLVKLVTFVPKDHAEAVRQALVNVGVGEGITDGPHASEYAECFFTVVGTGMFRPLNNAHPTIGEVGELTRVEEIRLESILPENRIDRVVKALQKAHPYEEPAYDLIPLYNRGASRGYGVI.GYLKV.P....ESLGSFARKLSAGL.RKLAPASLAEEPK......VRAS.......G.NTEQILR.....KIA..IVNGSG [...]
+Q67RW0_SYMTH/3-355 NIAAYIEELAPLYWA..E.SW.DNV.............................GL...QVG..........DPGA..........................AVQRVLVALELTDPVLEEAES......LG.CDMVVVHHP...P.IF................RPLKALRFD....NRPARRLLRLIR.G...........GIALYAAHTNLDQAAG.MTNDTLA.AAA.....GLT.........EFEVLKQAGEERYVKLVVFVPRGHEDAVRDALAGAGAGHIGNYSHCTFQAPGTGTFLPLEGTNP.......FIGQQGRLERVEELRLETIVPESAAAQAVQAMIAAHPYEEVAYDLYPLANPGKVRGHGRI.GRLAQ.P....VSLAQLAERLKQAL.RT.........PA......VRVV.......G.DPERMVT.....TVA..VGAGAG [...]
+A6NV06_9BACE/2-238 DVYRFLDGKAPFSTQ..M.SF.DNA.............................GF...LVG..........HGDK..........................EVHTILVALDITETVVEEAAQ......AG.AELIVSHHP...V.IF................LPAKHITDQ....DPSGRKLLALLE.Y...........NIAAICAHTNLDIAPG.GVNDALA.QAL.....GLE.........QIGPFS......................................................................................................................EDGLGRT.GVISG.A....LSAEAFAAQVKERL.GA.........NG......VRFV.........DGGRLVC.....KVA..VGGGAC [...]
+A7VVR8_9CLOT/6-241 EIYRYLNEIAPFSTA..M.DF.DNA.............................GF...LVG..........DGKT..........................EVTKALVTLDITAQSVRQARE......KG.AQLIVSHHP...V.IF................HPLKRLLSN........SVPYLLAK.E...........GIGAICAHTNLDMAPG.GVNDCLA.AAL.....ELS.........GRMEVAFYG...................................................................................................................ELPCCVM.GTLAQ.P....MEPKSFAAFVKERL.SC.........EG......IRYV.........AGNRPVR.....KVA..LCSGAG [...]
+Q2S0R3_SALRD/53-405 DITTALEAWAPPGSA..Q.DY.DNV.............................GL...QVG..........DASR..........................SVTSAVLALDATPAVLAEAKA......HD.AELVVTHHP...L.LF................RPLDGVTAD....GYVSNLALQFAE.A...........GIGLYSIHTNLDAAPE.GVSFALA.ERL.....GLT.........DVGFLDG.FADTLYKLAVFVPEDAFDEVRRALADAGAGRIGDYEACAFASEGTGFFKPGAGADP......HIGTAGGDVESAHERKLEVEVARWNLSSVMAALQEAHPYEEVAHDLYPVKQKNSRAGLGAL.GHLEA.P....MPLSAFLDRVATRL.DA.........GS......LRYA.......G.DPDATVE.....RVA..VCGGAG [...]
+A7V376_BACUN/5-351 ELVSALERFAPLPLQ..D.GF.DNA.............................GL...QIG..........LTDA..........................EATGALLCLDVTEAVLDEAIA......LG.YNVVISHHP...L.IF................KGYKSITGR....DYVERCILKAIK.N...........DIVVYAAHTNLDNAPG.GVNFKIA.EKI.....GLK.........NVRILEA.KENALVKLTTFVPTAQAEDVRKALFDAGCGNIGNYDLCSYNMEGEGTFRAREGATP.......YCGAIGELHTEREVRIETIIPAYKKAATVKALLAAHPYEEPVYDIYPLQNSWPQAGAGVI.GELEV.P....ETELEFLKRIKKTF.EV.........GC......LRHN.......K.LLGREIQ.....TVA..LCGGAG [...]
+Q7MTC6_PORGI/5-351 DIIEAIEAVCPRAYQ..E.SY.DNS.............................GV...QVG..........DTKR..........................EATGALLCVDVTEAVLEEAIR......LG.CNLVIAHHP...I.LF................KPLKRLTGS....SYVERCVELAVR.H...........GLVLYAAHTNADNAPQ.GLNALLA.ERF.....GLL.........NTRPLEP.LQGKLLELVTFVPTEYADAVRQALWQAGAGRLGHYDCCSFSHAGTGTFRAAEGANP.......FVGAISELHHEAEERISLVLPAYRQGTVLQALHAAHPYELPAVSLIPLANDHPSAGGGIV.GDLPS.P....ISEREMLLHIKEVF.GL.........KV......LSHS.......A.WRERPLR.....RMA..ICGGSG [...]
+Q11U42_CYTH3/6-352 DLISYLEQIAPLAYQ..E.DY.DNC.............................GL...LVG..........DRQQ..........................TCTGVVVCLDVIEEVVNEAIS......KG.YNLIVAHHP...F.IF................KGVKKITGS....NYVERIIIKAIQ.H...........NIAIYAIHTNLDNIEG.GVSGMLA.QKL.....GLI.........HTEILSP.KKGLLSKLVTFVPTTHTEQLLQGIFSTGAGSIGNYSECSYTVTGTGSFKPNEKANP.......TIGTANQAEQVEENRIEIIYPNHLERQVIRALHAHHPYEVPAYDLIALQNRNTEVGSGFV.GELEK.S....MTKEDFLAFITARL.SL.........TC......IRYT.......T.AFQGEIK.....KVA..LCGGSG [...]
+A6ENK7_9BACT/5-358 EIINELELLAPQAYA..E.GF.DNT.............................GL...LVG..........DANA..........................EVSGILVTLDTLETIVDEAIA......SD.CNLIVSFHP...I.IF................SGLKKITGK....NYVERVVLKAIK.N...........DIAIYAIHTALDNSFN.GVNAGIC.DRL.....QLS.........NRKILIP.QKGTIKKLITYVPTEEATALKQALFNVGAGSIGNYDNCSFSTNGTGTYKGNENSNP.......VVGAKHEFIAADETQISVTFPKHLESIIIKTLHEAHSYEEVAYEVLTLENTNQHIGMGMI.GALKN.P....MEEADFLNYLKKQM.NV.........AV......VRHS.......S.LRNKTIK.....KVA..VLGGSG [...]
+A3ZRR2_9PLAN/11-256 QLCRYLDQFAPVALA..E.SW.DNV.............................GL...LVG..........DRAA..........................AVNKLMTCLTITPEVVEEALA......GG.ANMIVAHHP...L.PF................RALKRITAD....DTVGRMLLQLIA.A...........GVAIYSPHTGFDSAAA.GINQQLA.AGL.....GLT.........DVSPLKPFDNPA..............................................................................................................LAPLGSGRY.GKLTA.P....QTLAQFAAVVREFL.QI.........EY......VQVV.......G.GADQKVT.....QPA..VACGAA [...]
+Q7UDY5_RHOBA/21-282 SICQSLSAIAPLKLA..E.EW.DNV.............................GL...LLG..........DRSA..........................EAHRILTCLTITPAVVEEATE......LA.ANLIVAHHP...L.PF................KPMARITTD....SAASAMVWNLCR.A...........GIAVYSAHTAYDSARL.GINEQWA.NRL.....DLT.........SIKPLTPSLDD................................................................................................................PTLGSGRY.GELSE.P....MTAREFLSFAAKSC.GS.........TR......PRLV.......G.DFDRSIR.....RVA..IGCGSG [...]
+A4ECC5_9ACTN/5-252 ELERALLARYPKADA..E.GW.DHV.............................GL...SVG..........DPAA..........................EIAGVACALDATEANVRRAQD......AG.ANVLLTHHP...V.YI................KAPEAFCPADASRPQCSAALYEAAR.C...........GVSIISLHTNLDCSHE..ARVCLS.ELL.....GAA.........PVSSLEHVDDP................................................................................................................EATGLGAL.ATLND.P....CTLRDLATRAATAFGSD.................PRVW........GEADRPCR.....TVA..ILGGSL [...]
+Q83GL0_TROWT/12-270 VLCATFESMWPSSDA..C.EW.DNV.............................GL...LCG..........FPGL..........................SVERVHFVVDVTSATINEAIK......AG.ADLLVSHHP...L.IF................KPIKKLTCD....TYESFLLSQLIE.S...........KCALFSVHTNADIAPD.GLAQHWS.HLI.....GLR.........NVKPVRY....CPESPS.....................................................................................................VDSTETQYGFGRI.GDLAE.P....VSLYDFAKDLKAFL.PET.......VGG......IMVA.......G.DEAKEIH.....SAA..VVPGAG [...]
+A7BDB0_9ACTO/13-271 DVMALMESWYPAATA..Q.SW.DRV.............................GL...IVG..........DPAA..........................PVRSILLALDPTAAIADQAVAGPSGDGQS.FDMVITHHP...L.LL................RGASFLPVT....DPKGGVVTTLIR.S...........GIALFNAHTNADVACD.GVATALA.DLI.....GLR.........DTTPLEP....CGTD.........................................................................................................AEGHEIGLGRV.GTVDE......TTLGSFADHVASVL.PAG.......PSG......LFVG.......G.DENATVQ.....RVA..VLGGAG [...]
+A0LTB3_ACIC1/18-373 DVVAVLNQLYPPALA..A.EW.DAV.............................GL...VCG..........EPSQ..........................AVRRILFAVDPVPSVAAEAIE......RG.VDLLVTHHP...L.YL................RGTSSVAAT....TAKGRVVHELIR.A...........GIALFTAHTNADHANP.GVSDALA.AAL.....GVT.........ELRPLDPLPAQPIDKLVTFAPADAVERILDVLSAAGAGAIGAYSRCAWTTDGIGTFRPNPGAHP.......TIGTIGRIETVPEVRVEMVLPRARRDAVIAALLAAHPYEEPAYDVIPLAERPGRAGTGRI.GRLDQ.P....ESLADFVDRVRAAL.PAT.......PGG......GRYA.......G.DPDRLVH.....IVA..VCGGAG [...]
+Q6AFH9_LEIXX/10-259 TVREAAETLWPLSGA..E.SW.DAP.............................GL...VCG..........DPAA..........................SVERILLAVDAVAATVEEAIE......TR.SDLLIAHHP...L.LL................RGVTSIAED....RYKGALLAKLIR.G...........GCALLAAHTNVDVVAQ.GTSAVLA.ARL.....GLT.........GTTP.......IVP..........................................................................................................AADGVTGIGRV.GTLSR.P....STLGALARSLAGLL.PPT.......AGG......VRAA.......G.DFHQPVS.....RVA..LCGGAG [...]
+Q6M3K0_CORGL/8-362 DIRRILDEAYPPALA..E.SW.DKV.............................GL...ICG..........DPTE..........................SVKRVGLALDCTQAVADKAVD......MG.LDMLIIHHP...L.LL................RGVTSVAAD....EPKGKVIHTLIR.G...........GVALFSAHTNADSARP.GVNDKLA.ELV.....GIT.........AGRPIATRLLGGMDKWGVHVLPRMQRTLKKMLFDAGAGAIGDYRECAFEIEGTGQFRPVEGANPA....EGDVDKLFKSLELRIEFVAPRNLRARLTSVLREAHPYEEPAFDIVEMHSAESLENATGLGRV.GELPE.P....MRLADFVQQVANNL.PVT.......EWG......VRAT.......G.DPEQMVS.....RVA..VSSGSG [...]
+A8ZUC2_DESOH/8-358 DMVAIMNRLAPPDLA..E.TW.DNC.............................GL...QAG..........CFDQ..........................EVKTVLVALDPSSAVVRDACD......RD.VDLLITHHP...L.FL................SPPRSVDFS....RMPGTAIFLAAT.H...........GLSIFSAHTNLDSAEG.GLNDRCA.ECI.....GLQ.........NVRVLSRAGQTDHVKLAFFVPVEHEARLLEALAATPAGAWGRYSSCSFSVRGTGRFQPLEGAVP......FIGRTGEIVAVEEVRVEAIVPRRDLDGVVRVLKQAHPYETMAYDVFPLAGGIEPLHGLGRI.GEVEP......STLEVFAGRVKQRF.GV.........DR......VGVA.......G.DMAMPVK.....TVA..VCSGAG [...]
+Q6M164_METMP/5-237 EIIKIIEKFAPKELAVPR....DNI.............................GL...QVG.........LNLEK..........................EVETLGIALDPSLEVIKKAES......EN.VDFLFTHHP...I.LK................DPIRNFTGP......IYKKLKILTK.K...........DIPLYSAHTNLDICKN.GLNDCLA.ELY.....NLK.........DVKNLY......................................................................................................................EDGLGRV.GTFDG.......TFEDILKITKENIFAV.........PQ......TVVP.......KSIYDKKQL.....KVA..VLSGYG [...]
+A3MU59_PYRCJ/10-266 DVVEVLESIAPPSLA..MEEHRNRL.............................GL...VVGPLHG..LEEV..............................AVERIGFSLNPSIRAIRAAVE......RG.AQLLVVHHE...YFLF...................PRAEDSAPVIYSYRDRVLELLRRH...........RLYLYAAHTNWDFAEG.GNFDTLA.RLL.....GLE..........ARPLPLKLGN................................................................................................................LVLKKAVLAAELPR.P....MKLRELAQYVKERL..............GL..RHIAYV........DGGREEVR.....RVA..LSTGGG [...]
+Q8TZC0_METKA/12-224 GVLEVLEGLAPFDLA..V.EG.DEV.............................GL...VAG..........DPSD..........................SVDRVVVCLDLTPQLVRRLSP.........ETLVISHHP.........................................VPGPLLERV...........RSPVIVFHSNWDAARA...AEALA.EWL.....GLE.........DVRKPDPLAAE.........................................................................................................................GRFDG.......TLEDLLSRVEDAL.NP.........PE......IRVV.........ATKNRIH.....RVI..VVSGFG [...]
+A5UKQ3_METS3/5-218 EIIEFIDKNIPKNLA..L.EN.DEI.............................GFKKEYNL............NQ..........................DISSIKIFMDLYPEFDTQKTN..........TLILTHHP...P.LF...............N..........................P...........KTPTYTIHSNWDIING.GANEALA.ETL.....KLN.........VISPFDK.....................................................................................................................TTNIGRI.CKTDK.......SFGDFEKDILDSF............NE......IRIV......NKPSSSKKLN.....KIG..IVSGFG [...]
+Q2FPY1_METHJ/5-230 ELFSRFEQDIPPSYA..V.PG.DQN.............................GY..................IGTLD...................PHIFDVQKILVLMDYILPESPNIDY.......SLYDLLVLHHP.......................PPIS......................P...........VIPTYVIHSNWDIVTG.GACDALA.DAL.....NIT.........SFDVLDE.....................................................................................................................STGIGRI.GGIDR.ETEDIITQGRFIHEIMATL.RV.........HD......IRTV.......NCNRFQPVG.....TIC..VISGFG [...]
+Y1146_METTH/8-215 SLIELMDRVAPPELA..L.PG.DRI.............................GYHGPEI.........................................EVEAVLVLMDYLEDVAVDG...........YDLLVLHHP.......................PEVE......................P...........PIPYLTVHSNWDVADG.GACDALA.DAL.....GLD.........VESFLDP.....................................................................................................................DTGVDRI.CRADL.......SLEELLE.RTGVL.NP.........ET......LRVV.........NPREYVD.....RVA..VVSGFG [...]
+Q8TW44_METKA/6-234 EVIDFVEELAPPDLA..E.DW.DNP.............................GI...QVCP........PGGLD.........................RKAERVLVALDAT.HALERAGD.........ADLVLTHHP...L.LF................RPPRRIGGR......WYRVLRAVLE.A...........DAVFYAAHTNLDRAEG.GVADTLA.RRL.....NLR....................VE............................................................................................................REACDGFGRL.CEVPG.......SEEELLNALRNLS.PL.................TTVY.........GDWEGVS.....RVL..VVPGAA [...]
+Q0W3L4_UNCMA/5-231 DLVKLLEAIAPPDLA..E.DF.DHGK...........................IGL...IVP...........GYH..........................RVNKVATALDPTPFVIERAID......MH.AEAIVVHHT...L.IW................NPVTALTPD......MAGVLKLLLE.N...........DISLYSMHTNYDRAPG.GVNDTLA.DLL.....GLK.........DTVAVDLCRA..........................................................................................................................GVVET......QSLADFAASASRALKVD.................VEVV........GRLNKDVC.....TIV..TAAGSA [...]
+Q12Z61_METBU/5-232 KVVETLEEIAPPELA..E.DF.DIDR...........................IGL...TLD...........LDN..........................DIKRIAVALDPTEYVLERAAQ......IG.ADMLITHHT...L.IF................HSVNLISKE......LAGLLKIAFD.N...........EISLYSMHTNYDSAKG.GVNDVLA.QRL.....GLN.........DVY.........................................................................................................................EVGMGRI.GTIDE......CPLDVFIDHVAKSLNTH.................LQYV.........GEKDTIK.....KVM..VFGGSG [...]
+A0ZGU3_NODSP/5-248 DLITWFEEWANPAWC..E.SW.DNC.............................GW...QIQ.........PGVLS..........................EKARVLVCLTPTLAVMQEAIA......LH.ANLIFAHHP...L.IF................SPLKSLCSG....EAIAEMARLAFT.H...........NIGIYSAHTNFDQVQD.GTADVLA.QIL.....DLQ.........SATPIVPTQA..................................................................................................................GLGYGRV.GLLEP.C....LTLQELLAKIHTRL.AP.........PH......LIFS......PTADLQQNIS.....RVA..VLGGSG [...]
+Q310X0_DESDG/5-312 DFIHMIERIAPVCGA..A.EW.DNS.............................GV...QVA..........SRCT..........................EIHSVAVALDPSEANIEKAVS......QG.ADFFLAHHP...L.AF.................KPQPLSGN....DSYFRSVSQLIT.N...........DICLYSAHTSLDANPA.GPVGWLA.ESL.....KLQ.........NCKTLEPTAASMQHRIIAPSAASGSIPAVIAGSIRCRHIQGIGYEF..........................................EFDTEDIVYETAADHIRQVLPAGTSLLKAEERAGRRELGLGIS.GSLPC.R....LSWHEFVQLLEKSVERT.................FWTT.......CGPVPETVE.....TVA..YCTGSG [...]
+Q1MR73_LAWIP/5-246 NIINIIEEVAPLSVA..A.TW.DNS.............................GV...QVA..........SSQD..........................EIFCLAVCLDPTPESVYKASE......LG.ANMILSHHP...LGLR................PRFPTIIDN......YYSVLKLLLS.K...........NILLYSAHTSLDANLY.GPASWLA.EVL.....ELH.........ECSVLESIHTTNG............................................................................................................VSSQYGFGRI.GHFSS.P....VPVENFCQRIYPLIGEA.................VPRL.......IGELPRQIY.....RVA..FCPGAG [...]
+A1VDX4_DESVV/5-310 RIIETIEKTALPAAA..A.PW.DHC.............................GV...QVA..........AARD..........................DVHALAVCLDPTPDNVVKAAA......LG.ADFVLAHHP.....LL................LQPRYLDRV....DAHHEVVRTLLT.R...........DIWLYGAHTSLDANPA.GPVAWFA.DEL.....ALE.........GRRVLEPTFTRQRITHRIVGMGAHLAAVAALPAVLKARAGDDDLV............................................VSCNAEDWAQLEVALRALPDGDRPMLPMAPEYPAEVWGIGII.GDLPA.P....LAWDDFIRRVGQLV.PL.........DG......ATFC........GSPPPVIS.....RVG..YCTGSG [...]
+Q7MQP7_WOLSU/6-230 EVLGFLEEISPLALQ..E.PW.DNS.............................GL...LVG..........SGGE..........................EVNSIYVALEATLKLVESLPP.........HSLLITHHP...L.LF................KPLKALLWE....EYPANILRALIQ.K...........NLSLIALHTNFDQTH...LGRYVASEVL.....GFS........G............................................................................................................................VEMEGYV.GYFPL.K....MSTHELASHLKRAL.GL.........ER......IATV.........GQERYLE.....RGA..IITGSG [...]
+Q7VIG7_HELHP/17-261 EIYELCNTISPFNTQ..E.SW.DKS.............................GL...NLG..........SFHN..........................EYTDIVLCLEVNLAIALSLKP.........NTLLITHHP...L.FF................NPTAQMITD....TYPHNIAAILIR.K...........NCSLISLHTNFDKSH...LNTYLTHQIL.................QWHHFVPS....................................................................................................................EDGLLMS.GKIPP......ISLQKLAQDVCKKL.NA.........PSVSFVQGDDITFLNQESQASHTNDAIT.....EAY..VVCGSG [...]
+Y959_HELPY/6-231 EVLVVLNRLSPFELQ..E.SW.DNS.............................GL...NVG..........SENS..........................EFSEIVACLEITLKIALNAPQ.........NALIITHHP...L.IF................KPLKTLNDE....IYPGNILKILIQ.K...........NVSVISMHTNFDKTH...LNKHFAHALLE..FDGLV.....................................................................................................................................EKGLMLV.KENAN......IEFDALVKKIKSSL.GV.........GS......LACV.........KSSQTIK.....DLA..FVCGSG [...]
+A8EW77_ARCB4/5-232 EIYDVLNEISPFELQ..E.KW.DNS.............................GI...LVG..........SFED..........................EIENVYISMDLDLELAKDLKP.........NSLIITHHP...L.IF................SGIKRVNFD....TYSTKILKELIK.K...........DISLISMHTNIDKTH...LNKYVIEKIL.....GFK........I............................................................................................................................ENSSEFI.SYCNV.N....MNFDELVKYVSNKL.NL.........KT......TKVV.........RSKEFIK.....DIA..VVTGSA [...]
+Q30TF6_SULDN/5-228 QIYDFLDSLSPFELQ..E.KW.DNS.............................GL...LVG..........DFNQ..........................DVKKIVLSIDVDESLIDSMEE.........GTLLITHHP...I.IF................GGLKQLEFN....KYPANLLQKMIQ.K...........NISNISMHTNFDQTH...LNEYVATEIL.....GYK........I............................................................................................................................AQKDGFV.AYLDI.D....EDFDFFALKVASAF.SL.........PH......AKCV.........KSSQRVK.....RVA..LTTGSG [...]
+A7GZB8_CAMC5/5-228 EIYKILDAIAPFDIQ..E.SW.DNS.............................GL...LVG..........SLES..........................EFERIYLSLDLSREILENALP.........NSLFITHHP...L.IF................KGLKSLNFS....YYPSNLIRKMIE.K...........NISLISMHTNADLAF...LNEHFTREIL.....GFE........P............................................................................................................................SEKDGFL.MYCEV.K....FSFDELACFLKEKL.RV.........ET......IRAV.........HAKDEIS.....RIC..VCTGSG [...]
+A7SAJ3_NEMVE/5-336 EVVSNLESWAPTSLA..E.KW.DNV.............................GL...LVE.........PSGQH..........................NVRSILLTNDLTEKVLQEAIE......KR.ANMIISYHP...P.IF................VPLKRLTSK....SFKERIIVKAIE.E...........RIAIYSPHTAFDAVFG.GVNDWLA.KGL.....GRG.........SVDPITYSMEACVKGCDYNVTAIAPSTEAAEKINSQINSLGGIGSNSIGKTERF...........................GDPALPKIVTHCSGDTLSAVMQILQSYTIYYLEIYQLAKKPIPGTGSGRL.CTLDT.P....VTLPDIIHRIKKHL.QL.........PH......LRVAY....APSKAKDTLLS.....TVA..LCAGSG [...]
+Q4CW43_TRYCR/7-273 RVMVAMGEIAPLWLA..DQSW.DNV.............................GL...LVE.........SPDSN..........................NSGIVLLTVDLTPEVMEECLR......HN.VEVIVAYHP...P.IF................TAFKRLTLA....DPKQKIILQTVR.H...........GASIYSPHTSLDAAKG.GINDWLA.SIVDS.SG............ACRPIQPCECVNRHGNGGF.................................................................................................GGNDNDELSVGIGRL.VALHQ.P....KTMATLVNDIKTGL.RI.........PT......VRVSL....PHGWSGNTSVH.....SVA..ICAGSG [...]
+Q5KCX5_CRYNE/12-280 LIKRVWERIAPLQLA..ERSW.DNV.............................GP...IIEA........PYPNP..........................SHRQVLLTIDLTPSVCAEALK......HPSLSLIVSYHP...P.IF................RGLKSLTLS....DPLQASLLKLSA.K...........GISVFAPHTSLDATPN.GINTWLI.KPFIPISISHD.........PIIPSDPLESF................................................................................................................EGAGMGRI.AKLSE.P....LDIRQAIKMVKDHL.SL.........DF......VQLAE.....PQPDVRKPIK.....SVA..VCAGSG [...]
+NIF3_SCHPO/9-265 KLKKVVESIYNPKLA..D.SW.DNT.............................GL...LLEA........PFPRT..........................NASSVLLTIDLTEKVAEEAIS......NKLVSSIVAYHP...I.IF................RGLKAITME....DPQQRSLLKLAA.E...........GIHVYSPHTAVDAAVD.GVNDWLA.QGIAGGRNNIK.........SVVPTQQNSVMA...............................................................................................................EAEGYGRI.CELKI.P....TTLRELVQRAKELT.GL.........QY......VQVC......APNGLDSHIS.....KVS..LCAGSG [...]
+Q7S5H9_NEUCR/62-330 RVVAAMRALYPEQLA..DKAW.DNV.............................GL...LQENI......AVAGQD..........................VPQTVLLTNDLTVAVAEEAIR......KR.ASVIVSYHP...F.IF................RGLKSVTLA....DPQQRILLQLAQ.A...........NIAVYSPHTAVDAAPG.GMNDWLA.DMLDGHGVETKR.......SICQPISSSITASLP..........................................................................................................PAFFNSGYGRL.VELGH.P....VYLGNIIKAYAEGLGGL.........NH......IMIAA.....PKDKKVTTIR.....SVG..ICAGSG [...]
+A6SM83_BOTFB/24-302 TVVLTTRGVSFVTYL..WGSFTDNI.............................QV...LLEA........PHREN.........................HLKDSVLLTVDLTKGVADEAIR......RK.DSIIITYHP...I.IF................RGLKAVTLA....NSQQSSLLRLAQ.E...........GISVYSPHTAVDAAPE.GLNDWLA.DIV.................TNRPLKKNQSVDTESIDHERSI..........................................................................................VNSIKDIPDGFEGAGYGRI.VRFKQ.P....QKLGDLVARMQSSL............QIGGRISGLSVAVPQSIPRGKKSSIEIS.....SIG..ICAGSG [...]
+Q5B6Z5_EMENI/15-342 AVVNSMRKLYPESLA..DKSF.DNT.............................GL...LLEA.......PFNPTR.........................RQKNSVLLTIDLTKAVADEAIA......RK.DSVVVAYHP...I.IF................RGLKSLTFN....DPQQQSLLRLAA.E...........GISVYSPHTAVDATPG.GMGDWLC.DVVTGATTPSSS.......SSVADLESPPSALYSAPTYPKPGPVSPSTSSK........................................................................IIPHTRSTIHPSPAPVPSGLEDAGMGRL.VTFAE.P....QPLASVIDNIASGVGYP.........GG......IPIAIP...QSASVEDIKIR.....TVG..VCPGSG [...]
+Q4KMJ5_DANRE/5-334 GVLEVLEQLAPLSLA..E.SW.DNV.............................GL...LVE.........PSRPR..........................PIKTILLTNDLTAAVMDEAVG......MK.CDLIVSYHP...P.LF................RPFKRLLQK....DWKQRLAVRAIE.N...........GIGIFSPHTSWDSVEG.GVNDWLV.GGM.....GRG.........KVSVLSQAVSSGAQKHRVEFSCMDDGEVNSLLEQLRHTEGSETFQCTRINSES.............................GGQQVNLTCGSSALTGAVQILLSHPHASKSLNITQVQQPPLLGCGQGRL.SVLEE.P....VSVSTAVQKMKTHL.GL.........PH......LRLAL....GDQQTLDSMVK.....TVA..VCAGSG [...]
+A4IGP2_XENTR/5-334 SVVSRLNVLTPPALA..E.GW.DNV.............................GL...LVE.........PSPPH..........................QVHKLLLTNDLTEDVLDEAID......TG.ANMILSYHP...P.VF................KALKRITQK....SWKERLVVKALE.K...........HLAVYSPHTSCDALAN.GVNDWLA.RAL.....GPS.........KSVPLRASTSLTYPGGVGHLLEFRLDPAGNIMSRLNGIQGVSVCTSTARHDGD.............................NGTRVSLSCSQNALVEVLSILSEEPQVYNSLQLLTLQKPPLVDTGMGRL.CTLSE.P....VSIAAALERIKKHL.HL.........PH......LRLAL....GRGRTLESSVS.....MAA..VCAGSG [...]
+Q6P1B7_MOUSE/31-363 ALLSSLNDFASLSFA..E.SW.DNV.............................GL...LVE.........PSPPH..........................TVNTLFLTNDLTEEVMDEALQ......KK.ADFILSYHP...P.IF................RPMKHITWK....TWKECLVIRALE.N...........RVAVYSPHTAYDAAPQ.GVNSWLA.KGL.....GTC.........TTRPIHPSRAPDYPTEGAHRLEFSVNRSQDLDKVMSTLRGVGGVSVTSFPARCD..........................GEEQTRISLNCTQKTLMQVLAFLSQDRQLYQKTEILSLEKPLLLHTGMGRL.CTLDE.S....VSLAIMIERIKTHL.KL.........SH......LRLAL....GVGRTLESQVK.....VVA..LCAGSG [...]
+NIF3L_DICDI/12-341 EVLKKLGELIPLNLA..E.KW.DNV.............................GL...LVEP........SNTDS.........................MDIERIFLTNDLTEPVLQEAIN......EK.ASFIISYHP...P.LF................NQFKTVNQK....SISQRIAIKSIE.N...........RIPIYSPHSALDSCDG.GLNDWIS.NALIKLNSGKG.........RSKPITPYQESLKSTQKISIYLHTNQPLTAEILKQLELNSNFQFYSTDK.....................................IELSCDQQQLLILINLIKSFSNEIKNWDIINQEKVLSLNNGSGKL.VTLDDDG....IDIDVIVKGVKELF.NI.........EY......VRIGR.....PLSGESKKIK.....TIS..LCAGSG [...]
+Q8SV52_ENCCU/5-229 EVSKAIDRFASLRRA..KTDW.DNV.............................GV...IVD...........SGT..........................QDKKILLTIDLTEPVLEECIH......LG.VKNVVAYHP...I.IF................KAVKKLGSK.......ESIVIGCIK.N...........GINVFTPHSALDP....LMNTYVY.NMI.................NSGPFFYKKN..........................................................................................................................CGPNT......STIGNAIRILKERS.GL.........ES......FRIC........LAREHTME.....SVPEFMHVGVG [...]
+Q6FQE2_CANGA/13-283 KALEVIRAAFPEKYA..DKSF.DNT.............................GL...LIDCSS....NEESHAN..........................NAVKMLLTVDLTSRVADEAVK......QG.CNLILAYHP...F.IF................PSWNRLNPQ...TNVQHASAIKLIQ.N...........NISVYSPHTAVDAVDG.GVNDWLV.ESLVPKTVNIT.........TKECIESTANTAP............................................................................................................HDPITGYGRY.FKLDK.A....VTLQEVVDVLKKNT.GL.........SH......VQIASLP.YEISGNLHHEVQ.....TVA..VCAGSG [...]
+A3LS90_PICST/8-261 RAVKAVQKFYPIALA..DKTW.DNT.............................GL...LLDSS......SDNIKS..........................DQLNILLTIDLTQSVAEEAVK......KS.ANFIVAYHP...F.IF................RGLKSITTK....DPQQRSLIKLIQ.N...........NISVYSPHTAVDSAYG.GVNDYLV.DGITY.GFDIQ.........SREAIEKDENA................................................................................................................QDCGMGRI.VTLKK.P....APLSKLIGNVKCSL.GL.........KY......VQIAR....GSGTSKDHEVS.....TIA..ICAGAG [...]
+Q86F61_SCHJA/5-335 KIIQLLDMYCLPHLA..E.KW.DNV.............................GL...LIE.........PSPPH..........................RVNKIFITNDLTEQVLDEAIS......QK.SGLIVSYHP...P.IF................SSLKKLTQQ....HWKQRVVIRCIE.N...........KIAVFSPHTGLDAKFG.GINDWLL.EPL.....AVR.........EKKSLTRSPAINQATSRLNVVMNQNFGDFVMSTGVGVCTTNIMSDAG.........................................LTAVVTCAESDLKRVLDMAEALQIFVVSKDTIQQTREEGCGRL.VTLQF.P....VHLKAVIAAYKKFL.NV.........EH......LTVAP....GLGKTLDCSVQ.....TVA..VCAGSG [...]
+Q14P57_SPICI/5-233 KLYQEIETDFSLKVA..C.KW.DYS.............................GH...QYG............NKN........................HFVAKIMVCLDLTSEVITAAIA......KQ.INVIITHHP...F.CF................GKKKRIQRI....PYKQTIIELLNK.H...........QIAVYALHTNYD.....GLMNELILQEL.....NTQ.........KIVAFDDNL...........................................................................................................................TKIGHIS....LTADEIIMKLKAIF.KI.........TT......VQHN.......LPKLDQPIK.....TVA..LAAGAA [...]
+Q2SRY9_MYCCT/5-244 NIISYLNQLFNPKKA..S.NW.DHV.............................GF...QFE............YKKL.....................NNINISKVLVCLDLTNDCLEFAIS......NQ.IQLIITRHP...F.IF................NELKLEKKN....PNKKQMIKKLNK.H...........KILVFSIHTNYDSSIKQNLLEILN.KKL.................KINSFKKYGKDKE............................................................................................................SNL........FYLDQ.K....ISVNDLINDLKEIF.SL.........NQ......IRLN......SNISLDTKIK.....NFY..LTSGSG [...]
+Q6F1J4_MESFL/5-244 KLIKYLEKKFPANKA..Y.EW.DNV.............................GI...QKF............NKKVV...................NFDKEISNVLITMDLNNESLKQMEN......SK.IDFIITRHP...F.IF................NELKKEKEN....PFKKELIKYLTK.E...........DIYVFSIHTNYDICGYKAFIDLLT.NAF.................KIKSAKFPLFNKE............................................................................................................YLE........VNLNS.D....ISKDDLIQNLKNVF.QV.........KT......IQIN........SDENFKTS.....KFL..INQGSG [...]
+Q8EUT6_MYCPE/5-240 DFYYLLDSIYKIDSQ..D.EW.DNS.............................GI......Y.......EFGSDN..........................VLINPILSLDINLDVVDYAIE......NN.SNLILSHHP...V.FI................DPLDQKKKH......IKSIFQKLEE.H...........NISVISLHTCFDKNPK.GTTYQII.KRL.................KGFNISRSKKSPY.............................................................................................................LF........FGVSNSK....LTLADLVKKIKNNL.EI.........EY......VNVL.......SSKLDKNNNKPKHIKIA..AVGGSG [...]
+Q4A5V5_MYCS5/5-245 ELASFLEYLYPKDNA..E.EW.DPV.............................GF...SLS............YKN........................MLVRGVITCLDVTKEIVNFAIE......NN.YNFIVSHHP...FLFY...................EDLNEELNTYFYKKEIYELCKK.H...........KISLFSLHTNYDSDKN.GTSYQVA.KFL.....NLF.........DSPAHKELKTVSK............................................................................................................YAY........CFKDN......LSVSELAKAAKNSY.KI.........DS......LATN.......VSDLDAKFN.....SFC..IIAGSG [...]
+Q6KI02_MYCMO/6-252 DLINYLESFYPFEKA..E.LW.DKV.............................GFSFLSKN............LK..........................QIKKILICLDFDFEAFEKVMK......ND.IDLIITHHP...F.YF..................EDTLEEEFLKNPYKSKIESVFKKLN...........NKSIYTLHTNFDNHFE.GTSYLIA.EQL.................GYTNFLKTNNN................................................................................................................Q........AVITKVN....ENFKDIVDKIKSSF.NF.........TY......VISN.......LKETDEIVKTKKTWKIA..IFAGAG [...]
+A5IY53_MYCAP/5-248 KITNYLIKQYPLENK..E.EW.DPA.............................GW...SLK.........FNLSE..........................KINGIVVALDLTSEILEKALC......LN.ANLIITHHP...FKFY...................KTWEEEFINAPYKSQILKTLKQ.K...........RINVLCLHTNYDNHKF.GTSFQIA.KML.....DLE........QNIAHFENSNYP.........................................................................................................................IAIKNVN....FKFKELVLLINQKL.NL.........HQ......MRTNI....DFDESKNKIIK.....NIA..VFSGSG [...]
+Q601Y7_MYCH2/5-239 EVGDFLLEKFPLQNC..Q.NW.DKC.............................GWQFLFDT........................................KFLGATICLDLTNDVLDFALK......NS.SNLIITHHP...FFFY...................QTKKEEYAYSPYKKKLTFLLKK.K...........LISVISLHTNFDSKEN.QTAFSII.KQCGFDFEKIE.........KIDEF...............................................................................................................................NILFQTS....ADFNEILKKISLNT.NL.........TT......FRSN........VEKNFFPK.....KVA..ILPGSG [...]
+Y351_UREPA/10-250 DILNFLTKKYDLSKA..E.AW.DKN.............................G.....LFF........D..EQ.........................QTINNVQIALDITDDVVNDAIL......NN.ANLIISHHP...L.FT................N..QDSNDEV.NYFVNIDLIEKIKK.N...........KISLIHLHTAFDASAN.GMSMQMA.KRL.....GL..............LNLKQDEQNP..........................................................................................................YLVV........GELKL.G....VSVDYISRIIKQKF.LS.........PI......IKYN......NVFRLETNLK.....KIG..IIGGSG [...]
+Q7NB92_MYCGA/5-241 RITDWVLKEFPLRNQ..L.SF.DNA.............................KLINHKNL............TN..........................QLTKVLVCADYDRFNFELAKK......HN.ANLIISHHP.....MF................INHQDLKSD....AFIAKAYQDFYQ.N...........NRSFLVLHTAYDFSPN.GAHSYFF.KLL.................KIKKFDPNPINHY.............................................................................................................YR........FEID.......CSLEQLISDLKKI.............EYIDQVQYLSTA.........KFKKKLK.....KGL..ICLGSG [...]
+Q3F0L5_BACTI/6-294 EIVSKLDIELDIKSF....GK.DSAFSQFIPMVYEPLKFDWKSVFEKDFVELFNGL...MLK............GD.........................ANVKKIFLAVFPTDEVLERFIE.....ESNSGDLLFMHHP...L.LMEC...........GDPKGVWGKGFV....PIKEKYIKQIKE.K...........KLSFYTCHVPMDYHANLGTSVAIA.KQL.....NAE.........IIDGFLTSSIN.................................................................................................................NEDLVLI.CNIEE......KSTSELTSHLKEIF..D.................IPYVD.....FEGKNINNVK.....KIA..IVAGCG [...]
+Q0SN38_BORAP/5-237 DLFFKLNSIFDIKKYEHV.DK.NLN.............................GL...QVGD........L..SA..........................EVNKVAFAVDASYSTLKEAKG.........NDFLITHHG...I.FW................SKKERIISN......MYNKVKFLIE.N...........NLALYSVHLPMDAHSVYSHSKVFS.DFL.....GLT.........NPFAFANYE...................................................................................................................GFNLGII.ADSA.......FSFSE....ILEKI.............KKKNKHILFSK.........KFKEKVN.....KVA..IVSGSG [...]
+A9B0A0_HERA2/5-242 ELVRYLDSYLQTAKF..R.DA.SLN.............................GL...QVE...........GRD..........................EVKTIALAVDASLQAIEAAIA......GN.ADLLLTHHG...L.FW................GNAQPLVGW......LGRRIKRLMA.A...........DCSLYTSHLPLDAHGEVGNNAQLL.KLL.....GWE.........MVQPFGDYR...................................................................................................................GQMLGFI.GQLTT.P....LSIEGLVAHVKSTL.AI.........PEN....EIKVW.......G.QTSRGIK.....RVG..VVSGDG [...]
+Q1IWV8_DEIGD/21-255 TLVRWLNEYLNIGAY..P.DP.SLN.............................GL...QI.............EGT........................DTIRRVAASVDTSIKTLQDAAD......SG.ADLLLVHHG...L.FW................GKPLALTGP......HRTRVRTALM.A...........DLNLYAAHIPLDAHPEVGNNAMMA.RAL.....SLQ.........SLRPFGDWQ...................................................................................................................GHKIGLA.GELPF.S....QSLQD....FADRI............QKLTGEICLVHA.........GGQPQVQ.....RLG..IVSGSG [...]
+Q73KL0_TREDE/5-248 ELDLYFTELLNIDAFAAQ.DL.SQN.............................GV...QVQ............NSG........................KEIKKVAFAVDACLQSIKEAAE......RK.ADMLFVHHG...L.FW................SRSLRIMGN......HYHRIKALLD.N...........DIVLYAVHLPLDAHPLYGNNIGLA.RRL.....ELE.........NLKEFGMYR...................................................................................................................GLNIGFY.GSLPL.K....EGSEE.GLELDEIINKL.........FPQGEKPANILP.........FGPKKIK.....TIG..IISGGA [...]
+Q2LUC1_SYNAS/5-241 RITDYIDSYLDIHSY..H.DD.SAN.............................GL...QV.............ENT........................GNVKKIGLAVDACHESISRACR......AG.CDLLIVHHG...L.FW................GSQQLIVDN......HYQRIRALIM.A...........DLALYAAHIPLDAHPIIGHNRVIA.EHL.....DLE.........DIEPFALHH...................................................................................................................GKHIGVK.GRFRQ.S....GSRAE....AAIWI............EKELGACRGLLE.........FGPETIS.....TVA..VVAGSA [...]
+Y1777_ARCFU/5-234 EVVRFLDDFLEINSY..Q.DV.SNN.............................GL...QV.............EGS........................EEVKKVAFAVDASMESFRAAKA......VN.ADMLVVHHG...L.IW................GGIGYIRGI......VKRRIEFLLR.S...........NLSLYAAHLPLDAHREVGNNAVIL.RKI.....GAE.........PQEEFGEYK...................................................................................................................GVKIGFS.AKLEK.A....TAVGE....IAEKL..............G...PAMVLP.........FGEERVR.....KVA..AVSGKG [...]
+Y1424_PYRAB/5-239 EIVSFLDEYLSISSY..P.DK.SSN.............................GL...QV.............EGK........................EEVERIAFAVDACLDTIAKARA......FN.ADMLIVHHG...I.IW................GGVSYVKGL......FAKRLKALLS.S...........EMNLYVAHIPLDVHPEVGNNVQLL.KLL.....NLE.........PLEPFGEYK...................................................................................................................GIKIGYI.GEFEE.P....KPLPM....IAQIL..A.........EKLPVDYVRSYE.........FGLQEIK.....RVA..VVSGAG [...]
+Y1766_HALSA/5-242 DVTSRYNDRLRVTDY..A.DA.ATN.............................GL...QVG............PGD........................RSVERIAFAVDAAAATISDAVE......WG.ADLLVVHHG...V.AW................GGLDAVTGR......EYDRIAALVD.G...........ECALYAAHLPLDGHPELGNAAHVA.DVL.....GLT.........QRSPFGDHS...................................................................................................................GEQIGLQ.GQLPD.P....TSAPA....LSKSLAAA.........LPTGDQPVQVLD.........VGPAELT.....DVA..VVTGSG [...]
+A8B7G6_GIALA/7-257 QLLQFLSEVYEEQ....P.DG.QYN.............................GL...QV.............EGR........................KEIRTLVTGVSLCGDLIAEAVH......RN.ADAILVHHG...F.FG................KSFLRVTDS......IKKRLTPLLK.H...........DINLFAYHLPMDAHPIIGHNAQLC.KAA.....GLLLEKFYSCGCYCENPGNLSG..................................................................................................................LEIIRRL.SEFCD.RRAYEVDTRTP...QQNDLCSS.........TFYGTRVWPFNS.......SFAINSPPK.....RVY..ICSGGS [...]
+A5EYD5_DICNV/5-236 FLVSHLNELLQIRKF..R.DY.APN.............................GL...QI.............AGR........................AEIQTVVTAVSASQAAIDFAVA......NN.ADALLVHHG...Y.FW...............KGEAAELVGV......KRKRIATLLH.H...........EINLLAYHLPLDQHATLGNNALFG.QAL.................SAHNISQSS...................................................................................................................FDDFLWQ.GDIET......VSASQ....WIAAV............EKILQRSIIAVG.........NTQKMIQ.....KIA..WCTGAA [...]
+Q5WY60_LEGPL/6-241 ELSLFLLDFLNCSQY..Q.DY.APN.............................GI...QV.............EGK........................DKIKRICTAVSASEDVISQAIE......QQ.ADALLVHHG...Y.FW...............KGENPVISGM......KRRRIAKLLG.H...........NMNLFAYHLPLDCHPELGNNASLA.NLL.....LIE.........SPEMHKVNN...................................................................................................................TANLLWS.GKLSK.A....MNSEQ....FSSFL............ERKLGRYPVHIA.........GNEKMIH.....SIA..WCTGAA [...]
+Y291_BUCAP/5-236 LLEKIINKKLSSDQY..S.DV.VPN.............................GL...QI.............EGE........................KIIKKIITGVTACQELLDKALS......YG.ANAIIVHHG...Y.FW...............KNESQCIHNM......TRKRLTTILS.N...........NINLYSWHIPLDIHPKLGNNAQIA.KKL.................NIRIKGY.....................................................................................................................ILPYLFW.GTLEE.N....INAFD....FSKKI............EKKYEKKPIHIY........ANAPIYIS.....RIA..WCSGRG [...]
+Q1Z5P6_PHOPR/5-241 KLEAALNELLSPHLI..K.DY.CPN.............................GL...QV.............EGK........................TQVKKIITGVTACQALIERAIE......EK.ADALLVHHG...F.FW...............KGEPAEIRGM......KFRRIKALIE.N...........GINLYAYHLPLDVHPELGNNAKLA.QML.....ELE.........VIGGLEDGN...................................................................................................................PRSVAMY.GQLDK.T....ITGAE....LASRL............SIGLHREPLHIG........DNAPADIK.....TVG..WCTGGG [...]
+Q6FCJ5_ACIAD/6-241 EIVQWCDQTLSSNQF..K.DY.APN.............................GL...QI.............EGA........................SEVNHILCAVTASDAAIDAAIE......AG.ANVLLVHHG...Y.FW...............KGEPYPITGM......RGRRIKKLIQ.H...........NISLLAYHLPLDAHPSLGNNAAIA.DLL.....ELK.........HIEALDPNE...................................................................................................................KFPIGNI.GDLKQ.A....LSPEA....FKAKL............QDVFDFNIIHLP.........AQVESIQ.....KVG..FCTGGA [...]
+A2S764_BURM9/5-237 ELELYLNNTLEIGRF..K.DY.SPN.............................GL...QV.............EGR........................RKIEKIATGVTASLAFLDRALE......WG.ADAVLVHHG...Y.FW...............RHEAPQITGR......KYQRLKRLLA.N...........DLNLFAFHLPLDAHPEFGNNAQLG.ERL.....GLI.........GDARFG......................................................................................................................DQDLGWL.ATLPM.P....VSLEH....FTAKV............ENTLGRAPLVLG.........DLDQQLR.....RVA..WCTGGA [...]
+A5CVR4_VESOH/6-235 TLSEYCHDYLDVDTF..D.DY.CPN.............................GL...QI.............EGR........................QQIRKIIAGVSVNQDLIERVID......EK.ADALFVHHG...L.FW...............QNESLVITGI......KKNRIKILLE.K...........NINLFAYHLPLDAHLIVGNNIQLA.MHL.....NIV.........NPTPI.......................................................................................................................GDTLVWQ.GEVK.......LSLIE....VSQLV............QDITQRIPLVFG.........DLNQQIK.....KIA..WCTGDA [...]
+Q21U81_RHOFD/6-241 QLLQAFDALLQPERF..R.DY.GPN.............................GL...QV.............EGT........................DTVRKIVSGVTASRALIEAAIA......AQ.ADTIFVHHG...L.FW...............RAQDGRITGW......LKARLALLLA.A...........DINLFAYHLPLDAHAELGNNAQLG.LKL.....GLR.........ALTRFG......................................................................................................................EQELGFL.GEPMASAS..FASAET....LAQHI............EYVLNRPVALVG.........PAHSAIK.....KVA..WCSGGG [...]
+A6GMA8_9BURK/8-242 VLEHDLRELLDQARM..S.DY.CPN.............................GL...QL.............EGK........................PRIQRLLTGVTASRALIELAAE......LN.ADAILVHHG...L.MW...............KGDPQVVTGF......RKERLQLALA.H...........DLNVFAYHLPLDKHPELGNNAQLG.NML.....GWP.........STRVVG......................................................................................................................DKGLVHL.GVLPT.P....QPLSA....LVRQV............SDVLGHHVQVEG.......NSDPERSVA.....TVA..WCTGGA [...]
+A0L3K9_MAGSM/6-241 EIETHLRNILQCDRI..D.DY.CPN.............................GV...QV.............RGG........................HNITRVVSGVTACMALFEAAVA......VN.AQLIITHHG...L.FW...............NKDPRVVEGM......LKHRLKLLLE.H...........DITLMGFHLPLDMHPELGNNAQIL.NRL.....QLI.........AGEPFGVYK...................................................................................................................GSALSKM.GHWEQ.S....LSLDQ....VQQKL............QKLFGGEPLVLP.........YGPPNIR.....KVA..VCSGGA [...]
+A3YBU9_9GAMM/11-248 AFEKKLTAILKPNKF..K.DY.APN.............................GL...QV.............QGC........................DEIAKVVTGVTACQALIDEAIR......LN.ADAIFVHHG...Y.FW...............KGESQVITGI......KYQRISRLIK.N...........DINLYAYHLPLDAHPELGNNAQLV.KMF.....NLK.........NPRSLQSYLPL.................................................................................................................DESIGVI.AEFEQ.A....LEIEQ....VKERI............EKALGRDVLFEA.........SGKKLIK.....TVA..LCSGGA [...]
+Q6MC02_PARUW/7-241 NLKELLTQIFPEEGL..I.DY.CPN.............................GL...QV.............EGK........................SEIKILATAVSASLNTIQMAIE......KN.VDALIVHHG...I.FW...............QRDSYVIEGT......KREKLFTLLK.S...........GVSLFAYHLPLDKHLILGNNWKAA.HDL.....GWE.........KLEPFAFMN...................................................................................................................GIPIGVK.GKIKP......TKREI....VKANL............ERYYQHSANCAL.........GGPELIQ.....TLA..LVSGGA [...]
+Y108_CHLTR/5-240 DLLNILNELLHPEYF..S.DY.GPN.............................GL...QVG............NAQ........................TAIRKVAVAVTADLATIEKAIA......CE.ANVLLVHHG...I.FW...............KGMPYSITGI......LYQRMQRLME.G...........NIQLIAYHLPLDAHTTIGNNWKVA.RDL.....GWE.........QLESFGSS....................................................................................................................QPSLGVK.GVFPE......MEVHD....FISQL............SAYYQTPVLAKA........LGGKKRVS.....SAA..LISGGA [...]
+Q609U6_METCA/7-244 ALERFLAGLLNPGAF..A.DY.GPN.............................GL...QV.............EGR........................EEIRRIAFAVSATAHSIAAAAE......WQ.ADALIVHHG...L.FWK..............FHGARPLVGP......FARRVFPLVR.Q...........AINLFAYHLPLDAHPEIGNAAVLG.HRI.....GLG.........EQAPFGDHQ...................................................................................................................GCPTGVR.GRLRE.S....LPASA....LRERL............AEILEHPVLLAT........PDATAPVC.....TIG..IITGGA [...]
+A9VML6_BACWK/5-238 QFKEHITSLFEEHLN..KYGD.DEY.............................GF...TH...........ISKE..........................EFHKIGYTTNLTLETIEEAYQ......NG.VDMIVTHHA........................PWSFLFGM......EEACIEKLKE.Y...........EMNHFWIHLPLDFVKF.GTCTSLF.NEI.....GID.........TILEYSTYE...................................................................................................................EEELPGI.GEYKE.A....IPFSNLVEKLEERM..E.........EK......VKSW.......K.NHDRPVK.....RIA..ILTGAG [...]
+A6TKN7_ALKMQ/5-263 EIMDIALELAGLNEI....PA.DS..............................GI...IVE............GE..........................HIKKVAIGVDMELAEMLLARD......LG.VDLVITHHPSGGS.PRINLHKVMDNQIDSMIRAGVPINKAQKALKEKKDEIERGLHVSNYDRAVSAAKLLKMPFMGIHTPTDILAERKVQGLLD.EKL.....................................................................................................................................................KEQPK......ATLQDIIKALETLP.EY.........QRTMAKPAVRVG.........AKDDYAG.....KTFVTMAGGTG [...]
+A4J511_DESRM/5-303 EIYDLVIKMGIEH.........DPR.............................GLEVVQKQLTKEKKKIEDLKEDEKKEVDQDRLFNPYTDTRVLYGELNREVKRILVGVDMEVAEVLLADRLE..EKGKKIDLIMAHHPEGKA.MAGLYDVMH.LQEDLLAQLGVPINVAEGIMAGRIAEVRRGLMPVNHNRAVDAARLLDIPLMCCHTPADNMVT....EYVQ.KKI.....................................................................................................................................................AENNC......ETLGDIVKVLKQIP.EYAAAVKTGAGPT......IVVG.........SKDRSAG.....KVFVDMTGGTS [...]
+Q3Z2K6_SHISS/9-274 DLNCFLNSMVAVSQP....TV.DKII...........................FGA...EAT........................................LINKIGTCWIASMDVLRKAVF......EG.VNIIITHEP...T.FYSYADLEGDDLEFSWARKIMDYTRGELSYLKIIEQKKEFLHK.N...........NLVIIRCHDVMDREPTFGMSKALA.QQL.....ELD.........VTNIVA......................................................................................................................SDEMYCV.YAIDP......DSAINITKRFAKNL.............KIYNLPGIQFY........GDKARVVR.....TVG..IGAG.. [...]
+Q022B6_SOLUE/14-253 QVVERIQKNAGVPWQ..PESL.DTF..................................KAG..........DPAT..........................PVTGIATTGMATMDVLNRASK......AR.TNLVLTLEP...T.FF................GRLDPQAAN....DPVYAAKQEFIRKN...........ALVVWRFTDHWRARKPDPFPTGLA.AVL.....GST.....................................................................................................................................KYQVADDVFRYDVPP....ITLTVLAGDLAKRLKAR.........AG......IRVI........GDPQSRVR.....RIA..LLPGLS [...]
+A4IP70_GEOTN/7-250 TVMERLTACVETRSP....TV.DTL.............................KYGDSSM.........................................EVKGIAVSFMPTYRVIEQAVQ......AG.ANLLISHEG...L.FYS.............HAGDAETMKND....PVYQEKVRLICE.S...........GIAIYRFHDQWHRYQPDGIMVGLV.RAL.....GWE....................SY............................................................................................................VSEYQSAATI.VTIPR......ILARDMVKYVKERL..............GI..SFIRVA........GDLSTICT.....RIG..LLAGYR [...]
+Y1125_STAEQ/5-353 ELMEVLNNHVPFHQA..E.SW.DNV.............................GL...LIG..........NDKL..........................DITGILTTLDCTDDVVNQAIE......LN.TNTIIAHHP...L.IF................KGVKRIVED....GY.GSIIRKLIQ.N...........NINLIALHTNLDVNPK.GVNRMLA.DQI.....GLE.........NISMINT.NSSYYYKVQTFIPKNYIEDFKDSLNELGLAKEGNYEYCFFESEGKGQFKPVGDAS........PYIGKLDSIEYVDEIKLEFMIKDNELEITKRAILDNHPYETPVFDFIKMNKESEYGLGII.GQLNQ.T....MTLDEFSEYAKKQL.NI.........PS......VRYT.......G.QHDSPIK.....KVA..IIGGSG [...]
+A5KQA2_9FIRM/5-253 EIIQVIEASYPKEAA..L.DF.DNV.............................GL...LAG..........RLEK..........................EVSKVYLALDATEEVIDKAIA......LG.TDMLITHHP...L.IF................SPMKRVTDE....DFIGRRVVKLLQ.N...........DISYYAMHTNYDVL...GMAKLAE.DIL.....GIE.........KTYVLDVTMEKD..............................................................................................................GAEEGIGRI.GMLER.E....MTLEECCLYVKHKL.KL.........GS......VKVY.......G.DMKKNVH.....CLA..VSPGAG [...]
+Q8RE15_FUSNN/5-246 DIINILEKKFPKINA..E.EW.DNI.............................GL...LIG..........DYDK..........................EVKKIQFSLDATLESIENAIS......EK.VDMLITHHP...I.IF................KAIKDITEQ....NILGKKIRNLIK.N...........DINVYSIHTNLDSSIE.GLNDYVL.KKI.....GIS.........EYKILDFDEEK.................................................................................................................NCGIGRI.FKLNE.E....KNLKKFIEELKLKL.KI.........LN......LRVI.......SNDLNKKIK.....KVA..LINGSA [...]
+A0Q1P0_CLONN/7-258 DFKNIVEEFAPVKLK..L.SY.DNV.............................GL...MVG..........ELNN..........................EIGNILVTLDCTLDVIEEAKA......KN.CNFIFAHHP...L.LY................KKPSSITSE....TLVGRKILELIK.N...........NISLYSAHTNLDSVKD.GINDTVM.KLL.....KIK.........NCKTIEFSEGKDE............................................................................................................DDDVSGLGRV.GTLES.P....ITVKEMCNRVKEVL.NT.........PF......VRYI.......G.EDSKEIK.....TIA..VINGSG [...]
+Q0TNV6_CLOP1/5-249 DIINIIEDIAPVNLK..E.GF.DNV.............................GL...MVG..........DREK..........................NITKILLALDCTEEVIKEAKE......MG.AELILTHHP...L.LF................RKPSTITTD....TLLGRKIISLIK.D...........DINLYSAHTNWDSVKG.GLNDTLV.EIL.....GFN.........KGIIMDKSPVD................................................................................................................SEAGIGRV.VELTK.E....MTVLEIINLIKSSL.GI.........KN......LRYA.......G.DLNEVIK.....KIA..IVNGSG [...]
+B8CXH0_HALOH/6-355 NIVGVMNEIAPRFLA..M.DW.DNP.............................GL...QIG..........YFSQ..........................EINRVLVTLDVTEEVVEEAIE......EN.CQLIISHHP...L.LF................KGLKSIHDK....SYNGRVVLKAIK.N...........NIAVLSAHTNFDIVGS.GINDYLS.HLL.....GLS.........DIQPLKVTGEKPYIKLVVFIPESHFDVVRKEILDSGLAGFIGNYSHTSFSVKGEGTFKPLEGSN......PFTGQKGHLARVEELRLETIIPANNISKVIDIIKKVHPYEEVAYDLYPLNNTGEKYGLGRI.GLLEK.G....IKLVDFVDIVKEKL.GI.........RH......IRYT.......G.NYDNIVK.....RIA..VCSGSG [...]
+Y1073_LACLA/5-244 DFMLEYEKFCPKELA..V.EG.DPV.............................GL...QVG..........NPND..........................ELTKVLVTLDIREQTVAEAKA......LG.VNLIIAKHP...L.IF................RPLSALTSM....NDQEKLVLDLAR.A...........GIAVYTSHTNIDVVTG.GLNDYFS.QLL.....GMT.........DIEVLDD.....................................................................................................................EEGLGRV.GNIEL......TELSVLTEKVKASF.GL.........DR......LRLIT.....YDHNLTQKIG.....RIA..ICGGSG [...]
+A5LFS5_STRPN/5-252 EVIQAYEAFCPQEFS..M.EG.DSR.............................GL...QIG..........TLDK..........................GIQRVMVALDIREETVAEAIE......KG.VDLIIVKHA...P.IF................RPIKDLLAS....RPQNQIYIDLIK.H...........DIAVYVSHTNIDIVEN.GLNDWFC.QML.....GIE.........ETTYLQE....T..............................................................................................................GPERGIGRI.GNI.Q.P....QTFWELAQQVKQVF.DL.........DS......LRMVHY...QEN.DLQKPIS.....RVA..ICGGSG [...]
+Q4ETV8_LISMO/8-360 EYTAIMEKIAPKKLA..M.EG.DPI.............................GL...QVG..........DLSR..........................KVRKIMFTLDVLEEVVDEAIE......KK.VDLIIAHHP...F.LY................RPTQHIDTT....TKQGKMIKKLIK.H...........DITVFAAHTNLDIAQG.GVNDILA.DLL.....HLQ.........NTTMIEETYSEPYCKIAVYVPENELESVRLALVNNGAGQIGTEYTECTFHTTGIGSFKPGANAN......PTIGEKDALTSVPEFKIEAIFPQYLTETITKAVKIAHPYEEPAIDVYTLEMQTYKEGLGRV.GMLPK.K....LGMVSFIDKLKTAF.AI.........DN......VRFI.......G.DLKTTVH.....KVA..IIGGDG [...]
+Q038U7_LACC3/6-251 QIINRFEDFAPLSLA..W.ER.DPS.............................GL...QLG..........NPDK..........................PVKTVLVTLDVRPEVVTEAEA......IH.ADMIFSHHP...A.MF................RPVHNLDLR....VPQNAMYAQILK.D...........DLLVYAAHTNLDRVQD.GMNDWLA.EAL.....GLS.........QVVPFINEGE..................................................................................................................GANMGRI.GLLPD.K....IRLDAFVEQVKAAY.NV.........KG......LRVV.......ARDLDRLVQ.....KVA..ILGGDG [...]
+B3XRX7_LACRE/6-257 QLIVRFEKFANPQLA..E.KW.DHV.............................GL...QIG..........NPDL..........................QITRLMTTLDVRPEVVDEAIE......QN.VDFIFAHHP...I.MF................HPAKDLDTR....DPQNAMYAKLLA.N...........NITVYAAHTNLDAANG.GMNDWLA.DQL.....HLT.........NTVPLVPAGNDPI............................................................................................................SGEPVGMGRI.GELAE.P....LTPQKFAKYCMDVF.GI.........RG......LRLIV....NPL.DQEREIK.....RVA..VLGGAG [...]
+Q5FJU7_LACAC/6-251 DIVERLRKDFPEDIA..S.QG.DPV.............................GM...QIG..........SMES..........................DVTNVMTTLDVRPQVVEEAVE......KG.VNLIISHHP...V.MF................RPAKNLDYA....NPQNAMYGNIIK.N...........NITVYSIHTNSDKAQN.GSADWQA.EEL.....GLK.........DIEPFCLDDD..................................................................................................................GIAMGRK.GKLPK.T....MSAYDFAFYVKDKM.DI.........KM......ARLI.......TASNEKPIT.....TVG..FICGDG [...]
+Q03Y42_LEUMM/5-248 ELIDKIELFAPKQLA..E.EG.DPT.............................GL...QIG..........DPKQ..........................PVHRVMTALDVRPEVVQEAID......NQ.VNFIWAHHE...V.MF................FPAKNLDLS....QPQNRMYADLIQ.H...........HIVVYASHTNMDSAQG.GMNDWLA.EAL.....GIQ.........DVVPLVPNVDK.................................................................................................................KTGLGRI.GQLEQ.P....ISVQEYAVKIRDLF.HV.........QA......VRVI.......AKDVTKPIQ.....KIA..VLGGDG [...]
+A8MG99_ALKOO/7-357 EIINIIENLAPLRYA..Y.QW.DNV.............................GL...QIG..........SRSD..........................EVQRILIALEVTDEVLEEAVK......NN.VDMIISHHP...L.IF................SPLKKIIKE....DLKGKLLYKAIR.N...........NISVYSTHTNMDIAPN.GLNDYVA.NLL.....GLK.........DMEVLDVTEKSTYYKLAVFTPVGHEEKVAEAICSAGAGHIGNYSNCTFRVNGTGTFLPLEGTNP.......FIGAQGQGEKVEEIKIETIVPQGNLKSVVKAMLKVHPYEEVAYDIYPLENEGPVLGIGRM.GYLPH.A....VSIADLANKIKDIF.NI.........EH......IKIA.......G.DLKAHIN.....KVA..IINGSG [...]
+A4XK84_CALS8/6-353 EIATFLENYFPKKLS..Y.DW.DNV.............................GL...QVG..........SFSA..........................KVDSILICVDVTEDVLNEAKD......LG.VRLVISHHP...L.IF................QGLKSIKDD....TPEGRLIIDTIK.N...........DIAILSFHTNADVSKH.GINFYLA.KLL.....NLE.........NIEGLSVKQKNGYFKIVVYVPSDYKDEVLEAMAQEGAGFVGKYSHCFFAVEGQGCFKPQEGANP.......FVGKIGELERVDEVRLESIVPEEKLKNVIKAMLKAHPYEEVAYDIYRLENDISYECIGVI.GQ..R.S....IEAENLIKELKEKL.NL.........SF......VKAS.........LVKNQFK.....KIA..IVSGSG [...]
+B0K888_THEP3/7-356 VIASIMDKLAPRKFA..E.EW.DNV.............................GL...LVG..........DGSK..........................DVSKILVALDATFEVVKEAID......KK.VDMIVTHHP...L.IF................KPIKNVKAD....NPVGSLLIQLIK.N...........DISLYAAHTSFDIAPN.GMNDILC.NVL.....GIY.........DREVLDVTYSEGYKKIAVYVPQGYEEIVKNAMCNAGAGFIGNYSNSTFQTQGIGTYKPLEGTNP.......FIGEIGKIEKVEEVKIETVVPQKYLEKVINAMLNVHPYEEVAYDVYPLENLKEEYGLGRI.GTISE......TTLKELALQVKAKL.KI.........NN......LRVV.......G.DPNKKIK.....KVA..VCGGSG [...]
+Q18BX9_CLOD6/5-352 SLTRKIEKKYPLNLA..E.DW.DNV.............................GL...IVG..........DFDM..........................DVKKVLVSLEANEDVIDEAIS......KN.IDLIVTHHP...F.IF................GKINKINSG....DLKGRLIQKLIK.N...........DISLYSMHTNFDIAFD.GLNDYFM.EIM.....EFG.........NSKVLDITKSENLYKLAVYVPHNYSDELRKVLSNSGAGHIGNYSDCTFSIEGEGQFKPLEGSNP.......FLGSVNDIETVNEVKIETVVPQKLLGGVISSMLDAHPYEEVAYDLYKLENKGEIFGLGRI.SKLDK.S....MTLESLSRKIKEKL.NM.........KH......IRVV.......G.NLSTDIT.....KVA..VVTGAG [...]
+A0RIR2_BACAH/9-360 EIISLFESMYPKHLA..M.EG.DKI.............................GL...QIG..........ALNK..........................PVQHVLIALDVTEEVVDEAIQ......LG.ANVIIAHHP...L.IF................NPLKAIHTD....KAYGKIIEKCIK.N...........DIAIYAAHTNVDVAKG.GVNDLLA.EAL.....GLQ.........NTEVLAPTYAEEMKKIVVFVPETHAEEVRKALGDAGAGHIGNYSHCTFSSEGTGTFIPQEGTNP.......YIGETGQLERVEEVRIETIIPASLQRKVIKAIVTAHPYEEVAYDVYPLDNKGETLGLGKI.GYLQE.E....MTLGQFAEHVKKSL.DV.........KG......ARVV.......G.KLDDKVR.....KVA..VLGGDG [...]
+A4J7B6_DESRM/6-358 EIVSMLEQIAPRHLA..E.EW.DNS.............................GW...QVG..........DPAA..........................GVSKVLLTLDVDAVVVREAVE......KQ.VNLIISHHP...L.LM................KGIKNIRLD....EPKGELIAQLIK.N...........NIGLYAAHTNLDSAAG.GVNEQLA.KRL.....GLQ.........NIEVLHPAKGEKHLKLVVFVPVQQVEGVQRAISQAGAGWIGNYSDCTFSVQGEGTFRPLEGTNP.......FIGQQGQLEQVAESRLETIVPASKIKTVLKAMLEAHPYEEVAYDLYPLENQTSNAGLGRI.GHLAE.T....QSFADFIIAVKEAL.GL.........AS......VKVG.......G.SMWKDVR.....RIA..VCGGSG [...]
+Q0AZ81_SYNWW/7-359 DIIGIMEEHFPPWLA..E.AW.DNS.............................GL...QLG..........STNK..........................AVKKAAVALDLDESILNQALE......LK.VAMIITHHP...L.FF................KPLKQINYE....SPVGRLIQRIVK.A...........GISVYAAHSNLDAAEK.GLNQILA.ELL.....GLQ.........DIDILGNHKKEELYKLVVFVPASHYEEVRRAINAAGAGFIGNYSDCSFRVRGTGTFRPGAGTQP.......FLGQEGELEEADEFRLETVVRKRELAQVMQAMQEAHPYEEVAFDIFRLEQAGKGYSMGRY.GFLPE.E....TKLGDYARQVKETL.GL.........EA......VRVV.......G.DLNKVIR.....KVA..IVSGSG [...]
+Q3AEW6_CARHZ/6-353 EIAAVIEEKFPRKLA..M.EW.DNP.............................GW...QI...........YFEK..........................EVHKVLLALDITAATVDFALN......EK.VDLIITHHP...L.FF................KPLKSLTFE....RKETLPLLKLLE.K...........QISVYAIHTNLDVAFG.GINDYLA.ELL.....ELQ.........EVKPLGEEIFEKLYKLSVFVPESHWETVREAMGAAGAGFIGNYSHCTFNTRGIGTFLPLEGTNP.......YIGAVGKLERVEEVKIETIVPERLLAKVVKAMLKVHPYEEVAYDIYPLENKNYLGGMGRI.G.LTG.K....KSFKEFLALVAEKL.GI.........EN......LRYG.......G.DLNSVPK.....KVA..VVTGAG [...]
+B8I6N4_CLOCE/5-249 DIINFLNEIAPWRYA..E.EW.DSV.............................GL...MVG..........SRES..........................YVTKILLCMDVTSDVISEAAQ......CG.AQMILSHHP...F.IF................SKLKSIDME....TFKGEQIANLIK.N...........NISVVSAHTNLDTAPG.GVNDTLA.ESL.....HLT.........NSRNLKPYMPKGL.............................................................................................................ECDLGMGKV.GELQN.S....KSFDEFVIDVKKSL.CI.........EN......LRII.......G.VKPKKVK.....KVA..VFCGSF [...]
+A3DDU7_CLOTH/7-355 DIIKYMEELAPVSLA..E.DY.DNV.............................GL...LIG..........SRES..........................TVERIFVCLDVTSKTVDEAVA......KK.ADLIVSHHP...V.IF................KGLKRINED....DPKGNIIYKLIR.N...........NIGVYSAHTNLDVAHG.GVNNYLS.SIL.....GLK.........DIISLKDYKAEKLYKVVVFVPHESVDAVRDAMSRAGAGWIGNYSDCSFMTAGTGTFRPLEGTNP.......YIGTTGNLEKVDEYRIETVVSQRNLKKVIEAMIKVHPYEEVAYDVYPLEIKGRQYGMGNV.GVLDK.P....KSLDEFIAVVKEKL.GV.........KN......VRVI.......G.ETNKEIE.....KVA..VFCGSF [...]
+#=GC seq_cons clhphlcphhPhphu..p.sa.Dss.............................GL....ls............pp..........................plp+lhlslDso.pllccAlp......ts.sshllsHHP...l.ha................pshcplssp......htphlhpLlc.s...........sIslauhHTshDss.s.GhNshLA.chL.....slp.........shpsht......................................................................................................................thuhGhl.Gplsp.s....hohpphhthlpppl.th.........tt......lphs.........shspplp.....+VA..lsuGuG [...]
+//
diff --git a/demotic/examples/example.wu-blastp.out b/demotic/examples/example.wu-blastp.out
new file mode 100644
index 0000000..01071b3
--- /dev/null
+++ b/demotic/examples/example.wu-blastp.out
@@ -0,0 +1,7086 @@
+BLASTP 2.0MP-WashU [04-May-2006] [linux26-x64-I32LPF64 2006-05-10T17:22:28]
+
+Copyright (C) 1996-2006 Washington University, Saint Louis, Missouri USA.
+All Rights Reserved.
+
+Reference: Gish, W. (1996-2006) http://blast.wustl.edu
+
+Query= sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium sp.
+ (strain NGR234) GN=NGR_a00980 PE=4 SV=1
+ (181 letters; record 1)
+
+Database: uniprot_sprot_wu.fasta
+ 516,081 sequences; 181,677,051 total letters.
+Searching....10....20....30....40....50....60....70....80....90....100% done
+
+ Smallest
+ Sum
+ High Probability
+Sequences producing High-scoring Segment Pairs: Score P(N) N
+
+sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhiz... 897 9.1e-90 1
+sp|Q07074|YH007_YEAST Uncharacterized protein YHR007C-A O... 60 0.74 1
+sp|Q8XVA0|Y2931_RALSO UPF0135 protein RSc2931 OS=Ralstoni... 74 0.995 1
+sp|P33890|TIR2_YEAST Cold shock-induced protein TIR2 OS=S... 74 0.995 1
+sp|A7HGP8|CH602_ANADF 60 kDa chaperonin 2 OS=Anaeromyxoba... 78 0.996 1
+sp|Q608F1|Y1541_METCA UPF0350 protein MCA1541 OS=Methyloc... 58 0.9999 1
+
+
+>sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium sp. (strain
+ NGR234) GN=NGR_a00980 PE=4 SV=1
+ Length = 181
+
+ Score = 897 (320.8 bits), Expect = 9.1e-90, P = 9.1e-90
+ Identities = 181/181 (100%), Positives = 181/181 (100%)
+
+Query: 1 MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT 60
+ MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT
+Sbjct: 1 MTASCRIRRNSNSAQKSTMGWSALSTSDSKVFYRVAWLLGRGKMAEIDAILITDVNGIGT 60
+
+Query: 61 TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF 120
+ TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF
+Sbjct: 61 TADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQLQHQIATRTGKEERKFKPF 120
+
+Query: 121 AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRP 180
+ AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRP
+Sbjct: 121 AAAGFSVRAGLAADGSNSGMLSISTVAGAEVHFIATERSLRELENQLTLLLEQLRLRSRP 180
+
+Query: 181 N 181
+ N
+Sbjct: 181 N 181
+
+
+>sp|Q07074|YH007_YEAST Uncharacterized protein YHR007C-A OS=Saccharomyces
+ cerevisiae GN=YHR007C-A PE=1 SV=2
+ Length = 71
+
+ Score = 60 (26.2 bits), Expect = 1.3, P = 0.74
+ Identities = 16/33 (48%), Positives = 21/33 (63%)
+
+Query: 141 LSISTVAGAEVHFIATERSLRELENQLTLLLEQ 173
+ LS+ T+ A VH+I T + + ENQL LLL Q
+Sbjct: 31 LSLPTLL-APVHYIPTRLTHHQAENQLFLLLFQ 62
+
+
+>sp|Q8XVA0|Y2931_RALSO UPF0135 protein RSc2931 OS=Ralstonia solanacearum
+ GN=RSc2931 PE=3 SV=1
+ Length = 248
+
+ Score = 74 (31.1 bits), Expect = 5.2, P = 0.995
+ Identities = 37/131 (28%), Positives = 56/131 (42%)
+
+Query: 42 GKMAEIDAILITDVNGIGTTADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAACGQ 101
+ G A++ A+L + G DD+L ++ + + TT AF + +R+ + G
+Sbjct: 107 GNNAQLGALL--GIQPTGRFGDDELGWIGTLPEA--TTLGAFAEVVAARLDRMPLVIGGA 162
+
+Query: 102 LQ--HQIATRTGKEERKFKPFAAAGFSVRAGLAADGSNSGMLSISTVA--GAEVHFIATE 157
+ + H I TG + F +AG V A + + S VA GA H ATE
+Sbjct: 163 DRPVHTIGWCTGGAQGWFDAAVSAGVDVYLSGEASEQTTHLARESGVAYIGAGHH--ATE 220
+
+Query: 158 RS-LRELENQL 167
+ R +R L N L
+Sbjct: 221 RGGVRALGNHL 231
+
+
+>sp|P33890|TIR2_YEAST Cold shock-induced protein TIR2 OS=Saccharomyces
+ cerevisiae GN=TIR2 PE=2 SV=1
+ Length = 251
+
+ Score = 74 (31.1 bits), Expect = 5.4, P = 0.995
+ Identities = 30/124 (24%), Positives = 49/124 (39%)
+
+Query: 29 SKVFYRVAWLLGRGKMAEIDAILITDVNGIGTTADDQLAFVSLIADQGETTTVAFGPEIG 88
+ SK+ V W R + E++++L T +T A S +A ETT+ A
+Sbjct: 89 SKMLTMVPWYSSR-LLPELESLLGTSTTAASSTEASSAATSSAVASSSETTSSAVASS-- 145
+
+Query: 89 SRIAASFMAACGQLQHQIATRTGKEERKFKPFAAAGFSVRAGLAADGSNSGMLSI---ST 145
+ S +S +A+ + AT + + S +A + S+S + S ST
+Sbjct: 146 SEATSSAVASSSEASSSAATSSAVASSSEATSSTVASSTKAASSTKASSSAVSSAVASST 205
+
+Query: 146 VAGA 149
+ A A
+Sbjct: 206 KASA 209
+
+
+>sp|A7HGP8|CH602_ANADF 60 kDa chaperonin 2 OS=Anaeromyxobacter sp. (strain
+ Fw109-5) GN=groL2 PE=3 SV=1
+ Length = 547
+
+ Score = 78 (32.5 bits), Expect = 5.6, P = 0.996
+ Identities = 32/116 (27%), Positives = 48/116 (41%)
+
+Query: 39 LGRGKMAEIDAILITDVNGIGTTADDQLAFVSLIADQGETTTVAFGPEIGSRIAASFMAA 98
+ LGR K ID T V+G G AD + A V I Q E TT + E A +
+Sbjct: 317 LGRAKRISIDKDNTTIVDGAGQKADIE-ARVKTIRAQIEETTSDYDREKLQERLAKLVGG 375
+
+Query: 99 CGQLQHQIATRTGKEERKFK---PFAAAGFSVRAGLAADGSNSGMLSISTVAGAEV 151
+ + AT T +E+K + A +V G+ G + + ++ + G +V
+Sbjct: 376 VAVINVGAATETEMKEKKARVEDALHATRAAVEEGIVPGGGVAYLRAVKALEGVKV 431
+
+
+>sp|Q608F1|Y1541_METCA UPF0350 protein MCA1541 OS=Methylococcus capsulatus
+ GN=MCA1541 PE=3 SV=1
+ Length = 83
+
+ Score = 58 (25.5 bits), Expect = 9.0, P = 0.9999
+ Identities = 26/76 (34%), Positives = 35/76 (46%)
+
+Query: 34 RVAWLLGRGKMAEIDAILITDVNGIGTTAD--DQLAFVSLI----ADQGETTTVAFGPEI 87
+ R+ W RG MAE+D +L V+G AD ++ AF L+ AD T PE
+Sbjct: 6 RLLWSCRRG-MAELDRVLALYVHGAYQEADVSERQAFERLLDLQDADLWRCLTGLARPED 64
+
+Query: 88 GS--RIAASFMAACGQ 101
+ + +AA A GQ
+Sbjct: 65 PALAALAAKLRALVGQ 80
+
+
+Parameters:
+
+ ctxfactor=1.00
+ E=10
+
+ Query ----- As Used ----- ----- Computed ----
+ Frame MatID Matrix name Lambda K H Lambda K H
+ +0 0 BLOSUM62 0.318 0.129 0.360 same same same
+ Q=9,R=2 0.244 0.0300 0.180 n/a n/a n/a
+
+ Query
+ Frame MatID Length Eff.Length E S W T X E2 S2
+ +0 0 181 181 9.8 75 3 11 22 0.41 32
+ 31 0.40 35
+
+
+Statistics:
+
+ Database: /misc/data0/databases/Uniprot/uniprot_sprot_wu.fasta
+ Title: uniprot_sprot_wu.fasta
+ Posted: 9:42:10 AM EDT Apr 12, 2010
+ Created: 9:42:26 AM EDT Apr 12, 2010
+ Format: XDF-1
+ # of letters in database: 181,677,051
+ # of sequences in database: 516,081
+ # of database sequences satisfying E: 6
+ No. of states in DFA: 569 (121 KB)
+ Total size of DFA: 245 KB (2103 KB)
+ Time to generate neighborhood: 0.00u 0.00s 0.00t Elapsed: 00:00:00
+ No. of threads or processors used: 8
+ Search cpu time: 10.70u 0.06s 10.76t Elapsed: 00:00:01
+ Total cpu time: 10.70u 0.06s 10.76t Elapsed: 00:00:01
+ Start: Fri Apr 16 09:13:43 2010 End: Fri Apr 16 09:13:44 2010
+
+EXIT CODE 0
+
+BLASTP 2.0MP-WashU [04-May-2006] [linux26-x64-I32LPF64 2006-05-10T17:22:28]
+
+Copyright (C) 1996-2006 Washington University, Saint Louis, Missouri USA.
+All Rights Reserved.
+
+Reference: Gish, W. (1996-2006) http://blast.wustl.edu
+
+Query= sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspergillus
+ oryzae GN=hacA PE=2 SV=1
+ (345 letters; record 2)
+
+Database: uniprot_sprot_wu.fasta
+ 516,081 sequences; 181,677,051 total letters.
+Searching....10....20....30....40....50....60....70....80....90....100% done
+
+ Smallest
+ Sum
+ High Probability
+Sequences producing High-scoring Segment Pairs: Score P(N) N
+
+sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=As... 1765 9.6e-182 1
+sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS=Em... 1348 1.5e-137 1
+sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS=Tr... 303 1.8e-31 2
+sp|P41546|HAC1_YEAST Transcriptional activator HAC1 OS=Sa... 184 9.3e-14 1
+sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabidops... 170 3.4e-12 1
+sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanum l... 140 7.0e-09 1
+sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos tauru... 150 3.2e-08 1
+sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Homo sapi... 150 3.2e-08 1
+sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive element-bindi... 156 3.7e-08 1
+sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=Arab... 127 1.9e-07 1
+sp|A3LYI0|NST1_PICST Stress response protein NST1 OS=Pich... 148 9.6e-07 1
+sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive element-bindi... 136 6.4e-06 1
+sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive element-bindi... 136 6.4e-06 1
+sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive element-bindi... 136 6.5e-06 1
+sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-bindi... 132 1.2e-05 1
+sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive element-bindi... 133 1.4e-05 1
+sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element-binding... 131 2.3e-05 1
+sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper transc... 132 2.4e-05 1
+sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive element-bindi... 130 3.0e-05 1
+sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcriptiona... 104 6.0e-05 1
+sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcriptiona... 104 6.0e-05 1
+sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive element-bindi... 127 6.4e-05 1
+sp|O88778|BSN_RAT Protein bassoon OS=Rattus norvegicus GN... 136 7.2e-05 1
+sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element-binding... 125 0.00011 1
+sp|Q9WVS8|MK07_MOUSE Mitogen-activated protein kinase 7 O... 127 0.00012 1
+sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive element-bindi... 123 0.00013 1
+sp|Q16520|BATF_HUMAN Basic leucine zipper transcriptional... 100 0.00016 1
+sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-bindi... 121 0.00017 1
+sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF2 OS=Pe... 121 0.00020 1
+sp|P97876|BATF3_RAT Basic leucine zipper transcriptional ... 99 0.00021 1
+sp|Q5B3C8|NST1_EMENI Stress response protein nst1 OS=Emer... 125 0.00029 1
+sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-bindi... 115 0.00030 2
+sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-bindi... 120 0.00032 1
+sp|Q6NW59|ATF4_DANRE Cyclic AMP-dependent transcription f... 118 0.00032 1
+sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Rattus norv... 116 0.00032 1
+sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcription f... 118 0.00034 1
+sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcription f... 117 0.00044 1
+sp|O35284|BATF_MOUSE Basic leucine zipper transcriptional... 96 0.00044 1
+sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus GN=Fosb... 116 0.00053 1
+sp|Q90888|MAFB_CHICK Transcription factor MafB OS=Gallus ... 115 0.00059 1
+sp|Q90370|MAFB_COTJA Transcription factor MafB OS=Coturni... 115 0.00059 1
+sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mus muscu... 113 0.00071 1
+sp|P51145|FOSL2_RAT Fos-related antigen 2 OS=Rattus norve... 114 0.00084 1
+sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-bindi... 116 0.00089 1
+sp|A4R2R1|NST1_MAGGR Stress response protein NST1 OS=Magn... 121 0.00097 1
+sp|O57342|MAFA_COTJA Transcription factor MafA OS=Coturni... 112 0.0011 1
+sp|O60675|MAFK_HUMAN Transcription factor MafK OS=Homo sa... 103 0.0012 1
+sp|P15407|FOSL1_HUMAN Fos-related antigen 1 OS=Homo sapie... 111 0.0012 1
+sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-binding... 115 0.0014 2
+sp|Q03173|ENAH_MOUSE Protein enabled homolog OS=Mus muscu... 117 0.0015 1
+sp|P53539|FOSB_HUMAN Protein fosB OS=Homo sapiens GN=FOSB... 112 0.0015 1
+sp|Q2VZV0|IF2_MAGSA Translation initiation factor IF-2 OS... 117 0.0016 1
+sp|Q61827|MAFK_MOUSE Transcription factor MafK OS=Mus mus... 102 0.0017 1
+sp|P29747|CREBA_DROME Cyclic AMP response element-binding... 117 0.0018 2
+sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocricetus ... 112 0.0019 1
+sp|Q9TUB3|FOSB_CANFA Protein fosB OS=Canis familiaris GN=... 111 0.0019 1
+sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive element-bindi... 112 0.0020 1
+sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive element-bindi... 112 0.0020 1
+sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcription fac... 111 0.0020 1
+sp|P79702|FOS_CYPCA Proto-oncogene c-Fos OS=Cyprinus carp... 111 0.0020 1
+sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Homo sapi... 114 0.0021 1
+sp|P47930|FOSL2_MOUSE Fos-related antigen 2 OS=Mus muscul... 110 0.0023 1
+sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcription f... 112 0.0027 1
+sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcription f... 112 0.0028 1
+sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS=Homo sa... 109 0.0030 1
+sp|Q9UQ88|CD11A_HUMAN Cell division protein kinase 11A OS... 118 0.0032 2
+sp|O43889|CREB3_HUMAN Cyclic AMP-responsive element-bindi... 110 0.0033 1
+sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcription f... 109 0.0034 1
+sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcription f... 110 0.0035 1
+sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Arabidopsi... 108 0.0037 1
+sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive element-bindi... 109 0.0038 1
+sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-binding... 111 0.0038 2
+sp|P54842|MAFB_RAT Transcription factor MafB OS=Rattus no... 108 0.0039 1
+sp|A5PKJ4|MK07_BOVIN Mitogen-activated protein kinase 7 O... 113 0.0039 1
+sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus musculus ... 109 0.0040 1
+sp|O13024|INCEA_XENLA Inner centromere protein A OS=Xenop... 113 0.0045 1
+sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS=Macaca ... 107 0.0050 1
+sp|Q5KGK5|EIF3A_CRYNE Eukaryotic translation initiation f... 113 0.0050 1
+sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scrofa GN=F... 108 0.0051 1
+sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein OS=FBJ... 108 0.0051 1
+sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS=Schizos... 100 0.0057 1
+sp|Q90596|MAFK_CHICK Transcription factor MafK OS=Gallus ... 98 0.0062 1
+sp|Q504L8|MAFB_XENTR Transcription factor MafB OS=Xenopus... 106 0.0062 1
+sp|Q1DQC1|PAN1_COCIM Actin cytoskeleton-regulatory comple... 114 0.0065 1
+sp|P54841|MAFB_MOUSE Transcription factor MafB OS=Mus mus... 106 0.0065 1
+sp|Q5A2K0|NST1_CANAL Stress response protein NST1 OS=Cand... 113 0.0078 1
+sp|Q8VCH8|UBXN4_MOUSE UBX domain-containing protein 4 OS=... 108 0.0079 1
+sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive element-bindi... 107 0.0079 1
+sp|P10158|FOSL1_RAT Fos-related antigen 1 OS=Rattus norve... 104 0.0080 1
+sp|P97875|JDP2_MOUSE Jun dimerization protein 2 OS=Mus mu... 98 0.0081 1
+sp|Q78E65|JDP2_RAT Jun dimerization protein 2 OS=Rattus n... 98 0.0081 1
+sp|P15408|FOSL2_HUMAN Fos-related antigen 2 OS=Homo sapie... 105 0.0085 1
+sp|O42290|MAFA_CHICK Transcription factor MafA OS=Gallus ... 104 0.0087 1
+sp|A1C9M5|KAPC_ASPCL Putative transcription factor kapC O... 103 0.010 2
+sp|P0C865|MK07_RAT Mitogen-activated protein kinase 7 OS=... 109 0.011 1
+sp|Q15424|SAFB1_HUMAN Scaffold attachment factor B1 OS=Ho... 109 0.013 1
+sp|O60841|IF2P_HUMAN Eukaryotic translation initiation fa... 110 0.014 1
+sp|Q5RDE1|IF2P_PONAB Eukaryotic translation initiation fa... 110 0.014 1
+sp|Q9M7Q3|AI5L6_ARATH ABSCISIC ACID-INSENSITIVE 5-like pr... 105 0.014 1
+sp|A9V549|EIF3A_MONBE Eukaryotic translation initiation f... 109 0.015 1
+sp|Q9UKV3|ACINU_HUMAN Apoptotic chromatin condensation in... 110 0.016 1
+sp|Q63ZM7|STABP_XENLA STAM-binding protein-like OS=Xenopu... 104 0.016 1
+sp|Q4QRL3|CC88B_MOUSE Coiled-coil domain-containing prote... 110 0.018 1
+sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo sapiens ... 103 0.018 1
+sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus norvegic... 103 0.018 1
+sp|P19880|YAP1_YEAST AP-1-like transcription factor YAP1 ... 96 0.019 2
+sp|Q8CH25|SLTM_MOUSE SAFB-like transcription modulator OS... 108 0.019 1
+sp|Q9NWH9|SLTM_HUMAN SAFB-like transcription modulator OS... 108 0.019 1
+sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Homo sapie... 101 0.020 1
+sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus muscul... 101 0.020 1
+sp|Q6CBW0|NST1_YARLI Stress response protein NST1 OS=Yarr... 107 0.021 1
+sp|Q498L2|SLTM_XENLA SAFB-like transcription modulator OS... 105 0.022 2
+sp|Q1E554|CGR1_COCIM rRNA-processing protein CGR1 OS=Cocc... 89 0.023 1
+sp|Q91496|FOS_TETFL Proto-oncogene c-Fos OS=Tetraodon flu... 102 0.023 1
+sp|Q9ESN9|JIP3_MOUSE C-Jun-amino-terminal kinase-interact... 98 0.023 2
+sp|P53450|FOS_TAKRU Proto-oncogene c-Fos OS=Takifugu rubr... 102 0.023 1
+sp|Q05682|CALD1_HUMAN Caldesmon OS=Homo sapiens GN=CALD1 ... 106 0.023 1
+sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos taurus GN... 102 0.024 1
+sp|Q56TT7|FOS_PHOCM Proto-oncogene c-Fos OS=Phodopus camp... 102 0.024 1
+sp|Q0CEI3|KAPC_ASPTN Putative transcription factor kapC O... 100 0.024 1
+sp|Q6P9R4|ARHGI_MOUSE Rho guanine nucleotide exchange fac... 107 0.024 1
+sp|P29681|IMPE2_DROME 20-hydroxyecdysone protein OS=Droso... 103 0.025 1
+sp|A2AJI0|MA7D1_MOUSE MAP7 domain-containing protein 1 OS... 106 0.025 1
+sp|Q5R452|SAFB1_PONAB Scaffold attachment factor B1 OS=Po... 106 0.028 1
+sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive element-bindi... 102 0.028 1
+sp|Q9D439|CCD11_MOUSE Coiled-coil domain-containing prote... 103 0.028 1
+sp|P48755|FOSL1_MOUSE Fos-related antigen 1 OS=Mus muscul... 99 0.029 1
+sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS=Xenopus... 100 0.029 1
+sp|Q54RZ9|BZPG_DICDI Probable basic-leucine zipper transc... 101 0.030 1
+sp|A0JMK9|CAF1A_DANRE Chromatin assembly factor 1 subunit... 109 0.030 2
+sp|P18625|FOSL2_CHICK Fos-related antigen 2 OS=Gallus gal... 100 0.030 1
+sp|A2R346|KAPC_ASPNC Putative transcription factor kapC O... 99 0.031 1
+sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis catus G... 101 0.031 1
+sp|P26042|MOES_PIG Moesin OS=Sus scrofa GN=MSN PE=2 SV=3 103 0.033 1
+sp|Q2HJ49|MOES_BOVIN Moesin OS=Bos taurus GN=MSN PE=2 SV=3 103 0.033 1
+sp|A5FV21|IF2_ACICJ Translation initiation factor IF-2 OS... 105 0.034 1
+sp|A6SCT6|DBP3_BOTFB ATP-dependent RNA helicase dbp3 OS=B... 103 0.034 1
+sp|Q7PGE8|EIF3A_ANOGA Eukaryotic translation initiation f... 106 0.035 1
+sp|O77788|NFM_BOVIN Neurofilament medium polypeptide OS=B... 105 0.036 1
+sp|Q9JTB5|IF2_NEIMA Translation initiation factor IF-2 OS... 105 0.038 1
+sp|Q9JYD2|IF2_NEIMB Translation initiation factor IF-2 OS... 105 0.038 1
+sp|A1KV51|IF2_NEIMF Translation initiation factor IF-2 OS... 105 0.038 1
+sp|P0C5H8|KAPC_EMENI Putative transcription factor kapC O... 98 0.038 1
+sp|Q80YR5|SAFB2_MOUSE Scaffold attachment factor B2 OS=Mu... 105 0.039 1
+sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodopus robo... 100 0.039 1
+sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS=Xenopus... 98 0.041 1
+sp|P26038|MOES_HUMAN Moesin OS=Homo sapiens GN=MSN PE=1 SV=3 102 0.042 1
+sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattus norve... 98 0.043 1
+sp|A0JMT0|CA1AB_XENLA Chromatin assembly factor 1 subunit... 104 0.044 1
+sp|Q6Y7W6|PERQ2_HUMAN PERQ amino acid-rich with GYF domai... 112 0.044 2
+sp|Q8WYK2|JDP2_HUMAN Jun dimerization protein 2 OS=Homo s... 92 0.045 1
+sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive element-bindi... 99 0.046 1
+sp|Q9C0A6|SETD5_HUMAN SET domain-containing protein 5 OS=... 106 0.046 1
+sp|Q92575|UBXN4_HUMAN UBX domain-containing protein 4 OS=... 101 0.046 1
+sp|Q5R4I3|UBXN4_PONAB UBX domain-containing protein 4 OS=... 101 0.046 1
+sp|P14233|TGA1B_TOBAC TGACG-sequence-specific DNA-binding... 96 0.048 1
+sp|A9M1D5|IF2_NEIM0 Translation initiation factor IF-2 OS... 104 0.048 1
+sp|Q554P0|BZPJ_DICDI Probable basic-leucine zipper transc... 103 0.049 1
+sp|Q8N9W4|GG6L2_HUMAN Golgin subfamily A member 6-like pr... 102 0.049 1
+sp|Q8N300|CCD23_HUMAN Coiled-coil domain-containing prote... 77 0.050 1
+sp|O81025|P2A03_ARATH Putative protein PHLOEM PROTEIN 2-L... 100 0.052 1
+sp|O35763|MOES_RAT Moesin OS=Rattus norvegicus GN=Msn PE=... 101 0.055 1
+sp|Q9Z220|TSG10_RAT Testis-specific gene 10 protein OS=Ra... 102 0.055 1
+sp|Q32N93|INCEB_XENLA Inner centromere protein B OS=Xenop... 103 0.056 1
+sp|Q95XZ5|NPBL_CAEEL Nipped-B-like protein pqn-85 OS=Caen... 107 0.056 1
+sp|Q6CT90|EIF3A_KLULA Eukaryotic translation initiation f... 103 0.059 1
+sp|Q5F489|TAF3_CHICK Transcription initiation factor TFII... 103 0.059 1
+sp|P42775|GBF2_ARATH G-box-binding factor 2 OS=Arabidopsi... 98 0.060 1
+sp|Q55EQ3|Y9086_DICDI Uncharacterized abhydrolase domain-... 103 0.060 1
+sp|Q54LU8|Y8646_DICDI Probable serine/threonine-protein k... 98 0.060 2
+sp|P94517|YSCB_BACSU Uncharacterized protein yscB OS=Baci... 94 0.066 1
+sp|Q2UKG6|EIF3A_ASPOR Eukaryotic translation initiation f... 103 0.067 1
+sp|Q9Y592|CCD41_HUMAN Coiled-coil domain-containing prote... 101 0.069 1
+sp|Q6Y7W8|PERQ2_MOUSE PERQ amino acid-rich with GYF domai... 111 0.069 2
+sp|Q8X229|FCR3_CANAL Fluconazole resistance protein 3 OS=... 98 0.069 1
+sp|P26041|MOES_MOUSE Moesin OS=Mus musculus GN=Msn PE=1 SV=3 100 0.070 1
+sp|Q9TW28|MYOM_DICDI Myosin-M heavy chain OS=Dictyosteliu... 105 0.072 1
+sp|Q9NZ53|PDXL2_HUMAN Podocalyxin-like protein 2 OS=Homo ... 100 0.074 1
+sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive element-bindi... 99 0.075 1
+sp|Q5HZG4|TAF3_MOUSE Transcription initiation factor TFII... 102 0.076 1
+sp|A0LE19|IF2_MAGSM Translation initiation factor IF-2 OS... 102 0.077 1
+sp|Q869E1|DNLI1_DICDI DNA ligase 1 OS=Dictyostelium disco... 103 0.078 1
+sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH P... 104 0.081 1
+sp|O70191|ATF5_MOUSE Cyclic AMP-dependent transcription f... 95 0.085 1
+sp|Q39140|TGA6_ARATH Transcription factor TGA6 OS=Arabido... 96 0.085 1
+sp|Q68EL6|NFIL3_DANRE Nuclear factor interleukin-3-regula... 98 0.085 1
+sp|Q55FW7|GLE1_DICDI Nucleoporin GLE1 OS=Dictyostelium di... 101 0.086 1
+sp|Q3TLH4|BA2L2_MOUSE Protein BAT2-like 2 OS=Mus musculus... 89 0.092 2
+sp|Q04323|UBXN1_HUMAN UBX domain-containing protein 1 OS=... 95 0.092 1
+sp|P23922|HBP1A_WHEAT Transcription factor HBP-1a OS=Trit... 96 0.092 1
+sp|Q9C5Q2|AI5L3_ARATH ABSCISIC ACID-INSENSITIVE 5-like pr... 94 0.094 1
+sp|Q54TD7|DDX24_DICDI ATP-dependent RNA helicase ddx24 OS... 101 0.097 1
+sp|Q5F797|IF2_NEIG1 Translation initiation factor IF-2 OS... 101 0.098 1
+sp|B4RMZ3|IF2_NEIG2 Translation initiation factor IF-2 OS... 101 0.098 1
+sp|Q86AH4|Y8592_DICDI Putative uncharacterized protein DD... 99 0.099 1
+sp|Q8IIG7|YPF05_PLAF7 Uncharacterized protein PF11_0207 O... 101 0.10 1
+sp|B2KI97|THOC2_RHIFE THO complex subunit 2 OS=Rhinolophu... 103 0.11 1
+sp|Q9UM54|MYO6_HUMAN Myosin-VI OS=Homo sapiens GN=MYO6 PE... 102 0.11 1
+sp|Q3KQU3|MA7D1_HUMAN MAP7 domain-containing protein 1 OS... 100 0.11 1
+sp|Q14244|MAP7_HUMAN Ensconsin OS=Homo sapiens GN=MAP7 PE... 98 0.11 2
+sp|P29596|ATF3_RAT Cyclic AMP-dependent transcription fac... 90 0.11 1
+sp|Q5TM26|BAT2_MACMU Large proline-rich protein BAT2 OS=M... 104 0.11 1
+sp|Q0IHP2|INCE_XENTR Inner centromere protein OS=Xenopus ... 100 0.12 1
+sp|Q9NQS7|INCE_HUMAN Inner centromere protein OS=Homo sap... 100 0.12 1
+sp|Q5HZY0|UBXN4_RAT UBX domain-containing protein 4 OS=Ra... 97 0.12 1
+sp|Q90595|MAFF_CHICK Transcription factor MafF OS=Gallus ... 87 0.12 1
+sp|Q6ZSZ5|ARHGI_HUMAN Rho guanine nucleotide exchange fac... 101 0.12 1
+sp|Q7PS12|MOEH_ANOGA Moesin/ezrin/radixin homolog 1 OS=An... 98 0.12 1
+sp|P12957|CALD1_CHICK Caldesmon OS=Gallus gallus GN=CALD1... 99 0.13 1
+sp|Q08DA8|ATF1_BOVIN Cyclic AMP-dependent transcription f... 93 0.13 1
+sp|Q94126|CES2_CAEEL Cell death specification protein 2 O... 91 0.13 1
+sp|O66547|Y157_AQUAE Uncharacterized protein aq_157 OS=Aq... 88 0.13 1
+sp|A6ZRZ0|NST1_YEAS7 Stress response protein NST1 OS=Sacc... 101 0.13 1
+sp|P53935|NST1_YEAST Stress response protein NST1 OS=Sacc... 101 0.13 1
+sp|A3BYC1|HOX25_ORYSJ Homeobox-leucine zipper protein HOX... 94 0.13 1
+sp|B1AZI6|THOC2_MOUSE THO complex subunit 2 OS=Mus muscul... 102 0.13 1
+sp|Q9H254|SPTN4_HUMAN Spectrin beta chain, brain 3 OS=Hom... 104 0.14 1
+sp|Q2UNX4|KAPC_ASPOR Putative transcription factor kapC O... 93 0.14 1
+sp|Q9JJ50|HGS_RAT Hepatocyte growth factor-regulated tyro... 94 0.14 2
+sp|Q2KII1|ATF3_BOVIN Cyclic AMP-dependent transcription f... 89 0.14 1
+sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcription ... 98 0.14 1
+sp|Q7TSC1|BAT2_MOUSE Large proline-rich protein BAT2 OS=M... 103 0.14 1
+sp|Q4I877|NDE1_GIBZE Nuclear distribution protein nudE ho... 97 0.14 1
+sp|Q84WU4|GOGC3_ARATH Golgin candidate 3 OS=Arabidopsis t... 98 0.15 1
+sp|Q499N6|UBXN1_RAT UBX domain-containing protein 1 OS=Ra... 93 0.15 1
+sp|B4PPK2|FOSL_DROYA Transcription factor kayak OS=Drosop... 81 0.15 3
+sp|A4R8N4|PAN1_MAGGR Actin cytoskeleton-regulatory comple... 101 0.15 1
+sp|B2AWS3|PAN1_PODAN Actin cytoskeleton-regulatory comple... 101 0.15 1
+sp|Q92545|TM131_HUMAN Transmembrane protein 131 OS=Homo s... 102 0.15 1
+sp|Q38W81|IF2_LACSS Translation initiation factor IF-2 OS... 99 0.16 1
+sp|Q789F3|MAF_CHICK Transcription factor Maf OS=Gallus ga... 94 0.16 1
+sp|P49716|CEBPD_HUMAN CCAAT/enhancer-binding protein delt... 92 0.16 1
+sp|P81269|ATF1_MOUSE Cyclic AMP-dependent transcription f... 92 0.16 1
+sp|P23091|MAF_AVIS4 Transforming protein Maf OS=Avian mus... 94 0.16 1
+sp|P18846|ATF1_HUMAN Cyclic AMP-dependent transcription f... 92 0.16 1
+sp|Q07283|TRHY_HUMAN Trichohyalin OS=Homo sapiens GN=TCHH... 102 0.16 1
+sp|Q4X1V0|NDE1_ASPFU Nuclear distribution protein nudE ho... 95 0.17 2
+sp|Q8R1H8|BATF2_MOUSE Basic leucine zipper transcriptiona... 79 0.17 2
+sp|Q66J36|NFIL3_XENLA Nuclear factor interleukin-3-regula... 95 0.17 1
+sp|P13816|GARP_PLAFF Glutamic acid-rich protein OS=Plasmo... 97 0.17 1
+sp|P38749|YAP3_YEAST AP-1-like transcription factor YAP3 ... 93 0.17 1
+sp|Q3UIW5|RNF10_MOUSE RING finger protein 10 OS=Mus muscu... 99 0.18 2
+sp|P23923|HBP1B_WHEAT Transcription factor HBP-1b(c38) OS... 93 0.18 1
+sp|Q9D5R3|CCD41_MOUSE Coiled-coil domain-containing prote... 97 0.18 1
+sp|Q9QXL2|KI21A_MOUSE Kinesin-like protein KIF21A OS=Mus ... 101 0.18 1
+sp|Q9UPT6|JIP3_HUMAN C-Jun-amino-terminal kinase-interact... 95 0.18 2
+sp|P16884|NFH_RAT Neurofilament heavy polypeptide OS=Ratt... 99 0.18 1
+sp|Q60765|ATF3_MOUSE Cyclic AMP-dependent transcription f... 88 0.18 1
+sp|Q9N0J3|CEBPD_SHEEP CCAAT/enhancer-binding protein delt... 91 0.18 1
+sp|A5DLJ8|NST1_PICGU Stress response protein NST1 OS=Pich... 99 0.18 1
+sp|A5DHL9|EIF3A_PICGU Eukaryotic translation initiation f... 98 0.19 1
+sp|Q6NXA9|UBXN1_DANRE UBX domain-containing protein 1 OS=... 92 0.19 1
+sp|O02756|CEBPD_BOVIN CCAAT/enhancer-binding protein delt... 91 0.19 1
+sp|O88735|MAP7_MOUSE Ensconsin OS=Mus musculus GN=Map7 PE... 97 0.19 1
+sp|Q99105|MYSU_RABIT Myosin heavy chain, embryonic smooth... 95 0.19 1
+sp|Q9M7Q2|AI5L7_ARATH ABSCISIC ACID-INSENSITIVE 5-like pr... 94 0.20 1
+sp|Q9HCM9|TRI39_HUMAN Tripartite motif-containing protein... 95 0.20 1
+sp|Q1XHU0|TRI39_PANTR Tripartite motif-containing protein... 95 0.20 1
+sp|Q7SHT5|PXR1_NEUCR Protein pxr-1 OS=Neurospora crassa G... 93 0.20 1
+sp|Q32LJ0|CCD23_BOVIN Coiled-coil domain-containing prote... 71 0.21 1
+sp|Q99LQ4|CCD23_MOUSE Coiled-coil domain-containing prote... 71 0.21 1
+sp|Q4KLG3|CCD23_RAT Coiled-coil domain-containing protein... 71 0.21 1
+sp|Q54XG7|DIMA_DICDI Basic-leucine zipper transcription f... 99 0.21 1
+sp|Q54CY3|Y4489_DICDI Putative uncharacterized protein DD... 86 0.21 1
+sp|B0KWH8|THOC2_CALJA THO complex subunit 2 OS=Callithrix... 100 0.21 1
+sp|Q7Z4V5|HDGR2_HUMAN Hepatoma-derived growth factor-rela... 96 0.21 1
+sp|P15205|MAP1B_RAT Microtubule-associated protein 1B OS=... 102 0.22 3
+sp|Q98UK4|MAF_DANRE Transcription factor Maf OS=Danio rer... 92 0.22 1
+sp|O75037|KI21B_HUMAN Kinesin-like protein KIF21B OS=Homo... 108 0.22 2
+sp|Q02040|SF17A_HUMAN Splicing factor, arginine/serine-ri... 96 0.22 1
+sp|P82179|TRDN_CANFA Triadin OS=Canis familiaris GN=TRDN ... 96 0.22 1
+sp|B0WYY2|MOEH_CULQU Moesin/ezrin/radixin homolog 1 OS=Cu... 95 0.22 1
+sp|Q556Q3|IRLF_DICDI Probable serine/threonine-protein ki... 99 0.23 1
+sp|P18847|ATF3_HUMAN Cyclic AMP-dependent transcription f... 87 0.23 1
+sp|Q5RCJ1|CIP4_PONAB Cdc42-interacting protein 4 OS=Pongo... 95 0.24 1
+sp|Q1RM35|CC104_DANRE Coiled-coil domain-containing prote... 92 0.24 1
+sp|A2Z0Q0|HOX25_ORYSI Homeobox-leucine zipper protein HOX... 90 0.24 1
+sp|P15336|ATF2_HUMAN Cyclic AMP-dependent transcription f... 94 0.24 1
+sp|O88453|SAFB1_RAT Scaffold attachment factor B1 OS=Ratt... 97 0.24 1
+sp|B0YC95|PAN1_ASPFC Actin cytoskeleton-regulatory comple... 99 0.24 1
+sp|Q4WG58|PAN1_ASPFU Actin cytoskeleton-regulatory comple... 99 0.24 1
+sp|A6NC98|CC88B_HUMAN Coiled-coil domain-containing prote... 99 0.25 1
+sp|A6R7X5|PAN1_AJECN Actin cytoskeleton-regulatory comple... 99 0.25 1
+sp|Q05D44|IF2P_MOUSE Eukaryotic translation initiation fa... 98 0.25 1
+sp|P54843|MAF_MOUSE Transcription factor Maf OS=Mus muscu... 92 0.26 1
+sp|O75444|MAF_HUMAN Transcription factor Maf OS=Homo sapi... 92 0.26 1
+sp|A7Z017|MAF_BOVIN Transcription factor Maf OS=Bos tauru... 92 0.26 1
+sp|A5PJN1|TAP26_BOVIN Thyroid transcription factor 1-asso... 89 0.27 1
+sp|O24160|TGA21_TOBAC TGACG-sequence-specific DNA-binding... 93 0.27 1
+sp|Q54Y73|BZPD_DICDI Probable basic-leucine zipper transc... 96 0.27 1
+sp|Q5FW38|NFIL3_XENTR Nuclear factor interleukin-3-regula... 93 0.27 1
+sp|Q39163|TGA5_ARATH Transcription factor TGA5 OS=Arabido... 91 0.27 1
+sp|Q90889|MAFG_CHICK Transcription factor MafG OS=Gallus ... 85 0.27 1
+sp|O35451|ATF6B_MOUSE Cyclic AMP-dependent transcription ... 95 0.28 1
+sp|Q9QXL1|KI21B_MOUSE Kinesin-like protein KIF21B OS=Mus ... 107 0.28 2
+sp|Q5RG44|K1211_DANRE Uncharacterized protein KIAA1211 ho... 97 0.28 1
+sp|P48634|BAT2_HUMAN Large proline-rich protein BAT2 OS=H... 100 0.28 1
+sp|C0QTL9|IF2_PERMH Translation initiation factor IF-2 OS... 96 0.28 1
+sp|P53352|INCE_CHICK Inner centromere protein OS=Gallus g... 96 0.28 1
+sp|Q8BKJ9|SIRT7_MOUSE NAD-dependent deacetylase sirtuin-7... 92 0.29 1
+sp|Q5XIB5|CCD86_RAT Coiled-coil domain-containing protein... 91 0.29 1
+sp|O93602|ATF2_CHICK Cyclic AMP-dependent transcription f... 93 0.29 1
+sp|P16951|ATF2_MOUSE Cyclic AMP-dependent transcription f... 93 0.29 1
+sp|Q5QTY8|IF2_IDILO Translation initiation factor IF-2 OS... 96 0.29 1
+sp|Q6FUQ5|FYV7_CANGA rRNA-processing protein FYV7 OS=Cand... 84 0.29 1
+sp|P37934|MAAY3_SCHCO Mating-type protein A-alpha Y3 OS=S... 97 0.29 2
+sp|Q99089|CPRF1_PETCR Common plant regulatory factor 1 OS... 92 0.29 1
+sp|Q3ZBU9|UBXN4_BOVIN UBX domain-containing protein 4 OS=... 93 0.30 1
+sp|P34511|YMX3_CAEEL Uncharacterized protein K06H7.3 OS=C... 94 0.30 1
+sp|Q8C0Q2|ZHX3_MOUSE Zinc fingers and homeoboxes protein ... 96 0.31 1
+sp|Q5B5B0|PAN1_EMENI Actin cytoskeleton-regulatory comple... 98 0.31 1
+sp|A2AG50|MA7D2_MOUSE MAP7 domain-containing protein 2 OS... 95 0.31 1
+sp|Q4PBP6|NST1_USTMA Stress response protein NST1 OS=Usti... 98 0.31 1
+sp|Q7KZI7|MARK2_HUMAN Serine/threonine-protein kinase MAR... 95 0.31 1
+sp|Q03484|CEBPD_RAT CCAAT/enhancer-binding protein delta ... 89 0.31 1
+sp|Q80VM7|ANR24_MOUSE Ankyrin repeat domain-containing pr... 96 0.32 1
+sp|P54844|MAF_RAT Transcription factor Maf OS=Rattus norv... 91 0.32 1
+sp|B1ZDQ8|IF2_METPB Translation initiation factor IF-2 OS... 96 0.32 1
+sp|Q99LI8|HGS_MOUSE Hepatocyte growth factor-regulated ty... 94 0.32 2
+sp|Q6BUE3|PXR1_DEBHA Protein PXR1 OS=Debaryomyces hanseni... 90 0.32 1
+sp|Q7RWT1|EIF3A_NEUCR Eukaryotic translation initiation f... 96 0.32 1
+sp|Q6ZDF3|TRAB1_ORYSJ bZIP transcription factor TRAB1 OS=... 90 0.32 1
+sp|Q8NI27|THOC2_HUMAN THO complex subunit 2 OS=Homo sapie... 98 0.33 1
+sp|B1MTK1|THOC2_CALMO THO complex subunit 2 OS=Callicebus... 98 0.33 1
+sp|Q8N4C8|MINK1_HUMAN Misshapen-like kinase 1 OS=Homo sap... 93 0.33 2
+sp|P42776|GBF3_ARATH G-box-binding factor 3 OS=Arabidopsi... 91 0.33 1
+sp|A1D9Z7|KAPC_NEOFI Putative transcription factor kapC O... 89 0.34 1
+sp|Q4G091|MICLK_RAT MICAL C-terminal-like protein OS=Ratt... 94 0.34 1
+sp|Q6P788|ATF5_RAT Cyclic AMP-dependent transcription fac... 89 0.34 1
+sp|Q9Y2D1|ATF5_HUMAN Cyclic AMP-dependent transcription f... 89 0.34 1
+sp|P43273|TGA2_ARATH Transcription factor TGA2 OS=Arabido... 90 0.34 1
+sp|Q795Q5|YTTA_BACSU Uncharacterized membrane protein ytt... 88 0.34 1
+sp|Q32LP2|RADI_BOVIN Radixin OS=Bos taurus GN=RDX PE=2 SV=1 93 0.35 1
+sp|Q9PU45|RADI_CHICK Radixin OS=Gallus gallus GN=RDX PE=2... 93 0.35 1
+sp|P35241|RADI_HUMAN Radixin OS=Homo sapiens GN=RDX PE=1 ... 93 0.35 1
+sp|P26044|RADI_PIG Radixin OS=Sus scrofa GN=RDX PE=2 SV=1 93 0.35 1
+sp|Q2KHR3|QSER1_HUMAN Glutamine and serine-rich protein 1... 98 0.35 1
+sp|Q54NF3|Y6434_DICDI Uncharacterized protein DDB_G028529... 91 0.36 1
+sp|Q99091|CPRF3_PETCR Light-inducible protein CPRF3 OS=Pe... 89 0.36 1
+sp|P30427|PLEC1_RAT Plectin-1 OS=Rattus norvegicus GN=Ple... 102 0.36 1
+sp|Q553B1|DDX46_DICDI ATP-dependent RNA helicase ddx46 OS... 96 0.36 1
+sp|Q5AXH3|TOF1_EMENI Topoisomerase 1-associated factor 1 ... 96 0.37 1
+sp|Q0V9K1|MAF_XENTR Transcription factor Maf OS=Xenopus t... 90 0.37 1
+sp|A6RW62|NST1_BOTFB Stress response protein nst1 OS=Botr... 96 0.37 1
+sp|A7EMM3|NST1_SCLS1 Stress response protein nst1 OS=Scle... 96 0.37 1
+sp|Q869T2|Y7634_DICDI Putative uncharacterized protein DD... 92 0.37 1
+sp|A1DC51|PAN1_NEOFI Actin cytoskeleton-regulatory comple... 97 0.37 1
+sp|Q960X8|HRS_DROME Hepatocyte growth factor-regulated ty... 94 0.37 1
+sp|Q5BJY9|K1C18_RAT Keratin, type I cytoskeletal 18 OS=Ra... 91 0.37 1
+sp|Q6BUT3|NST1_DEBHA Stress response protein NST1 OS=Deba... 96 0.37 1
+sp|A1CD74|PAN1_ASPCL Actin cytoskeleton-regulatory comple... 97 0.37 1
+sp|Q09202|YP23_CAEEL Uncharacterized protein AH6.3 OS=Cae... 87 0.38 1
+sp|B2GUV7|IF2P_RAT Eukaryotic translation initiation fact... 96 0.38 1
+sp|A5F4W4|ZAPB_VIBC3 Cell division protein zapB OS=Vibrio... 68 0.38 1
+sp|Q9KNP5|ZAPB_VIBCH Cell division protein zapB OS=Vibrio... 68 0.38 1
+sp|C3LSB5|ZAPB_VIBCM Cell division protein zapB OS=Vibrio... 68 0.38 1
+sp|P97820|M4K4_MOUSE Mitogen-activated protein kinase kin... 96 0.39 1
+sp|P34099|KAPC_DICDI cAMP-dependent protein kinase cataly... 93 0.39 1
+sp|O95819|M4K4_HUMAN Mitogen-activated protein kinase kin... 96 0.39 1
+sp|P11115|CPC1_NEUCR Cross-pathway control protein 1 OS=N... 88 0.39 1
+sp|P42777|GBF4_ARATH G-box-binding factor 4 OS=Arabidopsi... 88 0.39 1
+sp|A3KMR8|MAFA_DANRE Transcription factor MafA OS=Danio r... 89 0.39 1
+sp|O60132|TEA4_SCHPO Tip elongation aberrant protein Tea4... 94 0.39 1
+sp|Q7KQM6|PERQ1_DROME PERQ amino acid-rich with GYF domai... 97 0.39 1
+sp|Q9ZLW8|PGBA_HELPJ Plasminogen-binding protein pgbA OS=... 91 0.40 1
+sp|O25249|PGBA_HELPY Plasminogen-binding protein pgbA OS=... 91 0.40 1
+sp|Q13164|MK07_HUMAN Mitogen-activated protein kinase 7 O... 83 0.40 2
+sp|Q1DXU0|EIF3A_COCIM Eukaryotic translation initiation f... 95 0.40 1
+sp|O14964|HGS_HUMAN Hepatocyte growth factor-regulated ty... 90 0.41 2
+sp|Q0CUP6|EIF3A_ASPTN Eukaryotic translation initiation f... 95 0.41 1
+sp|A5DXA0|NST1_LODEL Stress response protein NST1 OS=Lodd... 97 0.41 1
+sp|Q4WA21|KAPC_ASPFU Putative transcription factor kapC O... 88 0.41 1
+sp|Q54GQ1|MTMR_DICDI Myotubularin-related protein DDB_G02... 96 0.41 1
+sp|P23614|BASP1_CHICK Brain acid soluble protein 1 homolo... 87 0.41 1
+sp|Q8SSQ0|GEFR_DICDI Ras guanine nucleotide exchange fact... 93 0.41 2
+sp|Q7Z4S6|KI21A_HUMAN Kinesin-like protein KIF21A OS=Homo... 97 0.41 1
+sp|Q2KI00|F107B_BOVIN Protein FAM107B OS=Bos taurus GN=FA... 80 0.41 1
+sp|Q08014|MEDB_GIALA Median body protein OS=Giardia lambl... 94 0.41 1
+sp|Q9M7Q5|AI5L4_ARATH ABSCISIC ACID-INSENSITIVE 5-like pr... 90 0.42 1
+sp|Q09458|YQ37_CAEEL Uncharacterized protein C09F5.7 OS=C... 90 0.42 1
+sp|Q6MG48|BAT2_RAT Large proline-rich protein BAT2 OS=Rat... 98 0.42 1
+sp|Q9WU62|INCE_MOUSE Inner centromere protein OS=Mus musc... 94 0.42 1
+sp|P26043|RADI_MOUSE Radixin OS=Mus musculus GN=Rdx PE=1 ... 92 0.43 1
+sp|Q12234|RUD3_YEAST GRIP domain-containing protein RUD3 ... 91 0.43 1
+sp|Q98TA5|CA1AA_XENLA Chromatin assembly factor 1 subunit... 94 0.43 1
+sp|Q07E15|CTTB2_MUSPF Cortactin-binding protein 2 OS=Must... 76 0.44 3
+sp|Q1MTN9|RLF2_SCHPO Chromatin assembly factor 1 subunit ... 90 0.44 2
+sp|P07197|NFM_HUMAN Neurofilament medium polypeptide OS=H... 94 0.44 1
+sp|Q6IP50|UBX1A_XENLA UBX domain-containing protein 1-A O... 88 0.44 1
+sp|Q922Y1|UBXN1_MOUSE UBX domain-containing protein 1 OS=... 88 0.44 1
+sp|Q5JR59|MTUS2_HUMAN Microtubule-associated tumor suppre... 84 0.45 2
+sp|P14918|EXTN_MAIZE Extensin OS=Zea mays GN=HRGP PE=2 SV=1 73 0.45 2
+sp|C1D8X2|IF2_LARHH Translation initiation factor IF-2 OS... 94 0.46 1
+sp|Q7SAF6|CEF1_NEUCR Pre-mRNA-splicing factor cef-1 OS=Ne... 93 0.46 1
+sp|A6VLC4|ZAPB_ACTSZ Cell division protein zapB OS=Actino... 67 0.46 1
+sp|P72929|Y1021_SYNY3 Uncharacterized protein sll1021 OS=... 86 0.47 2
+sp|O14273|YET4_SCHPO Meiotically up-regulated protein C8C... 92 0.47 1
+sp|Q6DGM8|JDP2_DANRE Jun dimerization protein 2 OS=Danio ... 82 0.48 1
+sp|Q8GT73|BH119_ARATH Transcription factor bHLH119 OS=Ara... 91 0.48 1
+sp|C1FXW9|THOC2_DASNO THO complex subunit 2 OS=Dasypus no... 96 0.48 1
+sp|P12270|TPR_HUMAN Nucleoprotein TPR OS=Homo sapiens GN=... 88 0.49 2
+sp|P29176|FOSX_MSVFR Transforming protein v-Fos/v-Fox OS=... 86 0.50 1
+sp|Q9UPN4|AZI1_HUMAN 5-azacytidine-induced protein 1 OS=H... 94 0.50 1
+sp|P78559|MAP1A_HUMAN Microtubule-associated protein 1A O... 75 0.51 2
+sp|Q5AVK6|NOP16_EMENI Nucleolar protein 16 OS=Emericella ... 86 0.51 1
+sp|Q9H098|F107B_HUMAN Protein FAM107B OS=Homo sapiens GN=... 79 0.51 1
+sp|P20226|TBP_HUMAN TATA-box-binding protein OS=Homo sapi... 88 0.51 1
+sp|Q08E13|RNF10_BOVIN RING finger protein 10 OS=Bos tauru... 89 0.52 2
+sp|Q9VL63|U430_DROME UPF0430 protein CG31712 OS=Drosophil... 87 0.52 1
+sp|Q13061|TRDN_HUMAN Triadin OS=Homo sapiens GN=TRDN PE=1... 92 0.52 1
+sp|Q9ES64|USH1C_MOUSE Harmonin OS=Mus musculus GN=Ush1c P... 93 0.52 1
+sp|Q86AF3|BZPH_DICDI Probable basic-leucine zipper transc... 92 0.52 2
+sp|Q9Y520|BA2L2_HUMAN Protein BAT2-like 2 OS=Homo sapiens... 98 0.53 1
+sp|Q9LES3|AI5L2_ARATH ABSCISIC ACID-INSENSITIVE 5-like pr... 87 0.53 1
+sp|Q55E93|BZPE_DICDI Probable basic-leucine zipper transc... 89 0.53 1
+sp|Q15147|PLCB4_HUMAN 1-phosphatidylinositol-4,5-bisphosp... 94 0.54 1
+sp|Q9QW07|PLCB4_RAT 1-phosphatidylinositol-4,5-bisphospha... 94 0.54 1
+sp|Q9QWW1|HOME2_MOUSE Homer protein homolog 2 OS=Mus musc... 88 0.54 1
+sp|Q98UK5|MAFB_DANRE Transcription factor MafB OS=Danio r... 88 0.54 1
+sp|Q9JJ89|CCD86_MOUSE Coiled-coil domain-containing prote... 89 0.54 1
+sp|Q499E4|DZI1L_MOUSE Zinc finger protein DZIP1L OS=Mus m... 92 0.55 1
+sp|P34618|CEC1_CAEEL Chromo domain-containing protein cec... 87 0.55 1
+sp|Q75JP5|Y2471_DICDI Calponin homology domain-containing... 95 0.55 2
+sp|Q1E1H4|NST1_COCIM Stress response protein NST1 OS=Cocc... 94 0.55 1
+sp|P05661|MYSA_DROME Myosin heavy chain, muscle OS=Drosop... 96 0.56 1
+sp|Q9UPA5|BSN_HUMAN Protein bassoon OS=Homo sapiens GN=BS... 98 0.56 2
+sp|Q55D99|PAKA_DICDI Serine/threonine-protein kinase pakA... 88 0.57 2
+sp|A5PKL7|LZTS2_BOVIN Leucine zipper putative tumor suppr... 91 0.57 1
+sp|Q7RWR8|CWC26_NEUCR Pre-mRNA-splicing factor cwc-26 OS=... 88 0.57 1
+sp|P35710|SOX5_MOUSE Transcription factor SOX-5 OS=Mus mu... 84 0.57 3
+sp|P24152|EXTN_SORBI Extensin OS=Sorghum bicolor GN=HRGP ... 75 0.58 2
+sp|Q9Z2Q8|FOS_CRIGR Proto-oncogene c-Fos OS=Cricetulus gr... 88 0.58 1
+sp|B4GIF2|EIF3J_DROPE Eukaryotic translation initiation f... 85 0.58 1
+sp|Q8I1E5|EIF3J_DROPS Eukaryotic translation initiation f... 85 0.58 1
+sp|Q9R269|PEPL_MOUSE Periplakin OS=Mus musculus GN=Ppl PE... 93 0.59 2
+sp|P35711|SOX5_HUMAN Transcription factor SOX-5 OS=Homo s... 82 0.59 3
+sp|Q9ZJP4|TONB_HELPJ Protein tonB OS=Helicobacter pylori ... 86 0.59 1
+sp|Q6NY15|TSG10_MOUSE Testis-specific gene 10 protein OS=... 91 0.59 1
+sp|Q9Y4D1|DAAM1_HUMAN Disheveled-associated activator of ... 93 0.59 1
+sp|P28741|KIF3A_MOUSE Kinesin-like protein KIF3A OS=Mus m... 91 0.59 1
+sp|Q9PTD7|CING_XENLA Cingulin OS=Xenopus laevis GN=cgn PE... 94 0.60 1
+sp|O94685|UCP8_SCHPO UBA domain-containing protein 8 OS=S... 92 0.60 1
+sp|P20482|CNC_DROME Segmentation protein cap'n'collar OS=... 94 0.60 1
+sp|P56095|AP1_KLULA AP-1-like transcription factor OS=Klu... 90 0.60 1
+sp|P51984|CREB_CHLVR Cyclic AMP-responsive element-bindin... 85 0.60 1
+sp|Q00969|ATF2_RAT Cyclic AMP-dependent transcription fac... 89 0.61 1
+sp|Q29GR8|MOEH_DROPS Moesin/ezrin/radixin homolog 1 OS=Dr... 90 0.61 1
+sp|Q10PR4|HSFA9_ORYSJ Heat stress transcription factor A-... 88 0.62 1
+sp|Q15642|CIP4_HUMAN Cdc42-interacting protein 4 OS=Homo ... 90 0.62 1
+sp|Q1LUE5|ZCH18_DANRE Zinc finger CCCH domain-containing ... 93 0.62 1
+sp|B0W6N3|EIF3A_CULQU Eukaryotic translation initiation f... 93 0.62 1
+sp|Q5XJV7|SETD5_MOUSE SET domain-containing protein 5 OS=... 94 0.62 1
+sp|B3EX63|CING_SORAR Cingulin OS=Sorex araneus GN=CGN PE=... 93 0.62 1
+sp|Q2UDY8|PAN1_ASPOR Actin cytoskeleton-regulatory comple... 94 0.63 1
+sp|Q5R7F9|MA7D2_PONAB MAP7 domain-containing protein 2 OS... 91 0.63 1
+sp|O88801|HOME2_RAT Homer protein homolog 2 OS=Rattus nor... 87 0.63 1
+sp|Q8R424|STABP_RAT STAM-binding protein OS=Rattus norveg... 88 0.63 1
+sp|Q6NS15|MED15_XENLA Mediator of RNA polymerase II trans... 91 0.64 1
+sp|Q6RFY2|PHAR3_RAT Phosphatase and actin regulator 3 OS=... 89 0.64 1
+sp|Q8C2B3|HDAC7_MOUSE Histone deacetylase 7 OS=Mus muscul... 71 0.64 2
+sp|Q54DE2|Y4323_DICDI Putative uncharacterized protein DD... 65 0.64 1
+sp|P41425|Y020_NPVAC Uncharacterized 8.0 kDa protein in E... 65 0.64 1
+sp|A3MZY9|ZAPB_ACTP2 Cell division protein zapB OS=Actino... 65 0.64 1
+sp|B3H152|ZAPB_ACTP7 Cell division protein zapB OS=Actino... 65 0.64 1
+sp|O88737|BSN_MOUSE Protein bassoon OS=Mus musculus GN=Bs... 98 0.64 1
+sp|B7GKC7|GRPE_ANOFW Protein grpE OS=Anoxybacillus flavit... 83 0.65 1
+sp|Q9CXK9|RBM33_MOUSE RNA-binding protein 33 OS=Mus muscu... 93 0.65 1
+sp|Q6CJZ6|MED2_KLULA Mediator of RNA polymerase II transc... 84 0.65 2
+sp|P14105|MYH9_CHICK Myosin-9 OS=Gallus gallus GN=MYH9 PE... 95 0.65 1
+sp|A1WLI3|IF2_VEREI Translation initiation factor IF-2 OS... 92 0.65 1
+sp|Q62736|CALD1_RAT Non-muscle caldesmon OS=Rattus norveg... 89 0.65 1
+sp|Q5F3P8|SET1B_CHICK Histone-lysine N-methyltransferase ... 95 0.66 1
+sp|Q96JK9|MAML3_HUMAN Mastermind-like protein 3 OS=Homo s... 96 0.66 2
+sp|Q5NVN6|CEP63_PONAB Centrosomal protein of 63 kDa OS=Po... 89 0.66 1
+sp|Q9ZKY5|PGBB_HELPJ Plasminogen-binding protein pgbB OS=... 89 0.66 1
+sp|P18850|ATF6A_HUMAN Cyclic AMP-dependent transcription ... 90 0.67 1
+sp|Q8N1L9|BATF2_HUMAN Basic leucine zipper transcriptiona... 85 0.67 1
+sp|Q9HD67|MYO10_HUMAN Myosin-X OS=Homo sapiens GN=MYO10 P... 95 0.67 1
+sp|Q0VF49|K2012_HUMAN Uncharacterized protein KIAA2012 OS... 89 0.67 1
+sp|Q9JM52|MINK1_MOUSE Misshapen-like kinase 1 OS=Mus musc... 93 0.67 1
+sp|Q90Z72|NFIL3_CHICK Nuclear factor interleukin-3-regula... 88 0.67 1
+sp|P23050|FOS_AVINK p55-v-Fos-transforming protein OS=Avi... 86 0.67 1
+sp|Q32PF6|DBP_BOVIN D site-binding protein OS=Bos taurus ... 86 0.68 1
+sp|Q10586|DBP_HUMAN D site-binding protein OS=Homo sapien... 86 0.68 1
+sp|Q60925|DBP_MOUSE D site-binding protein OS=Mus musculu... 86 0.68 1
+sp|P16443|DBP_RAT D site-binding protein OS=Rattus norveg... 86 0.68 1
+sp|Q66H89|CCD41_RAT Coiled-coil domain-containing protein... 90 0.68 1
+sp|Q54IE8|IRLE_DICDI Probable serine/threonine-protein ki... 93 0.68 1
+sp|B4RXT8|IF2_ALTMD Translation initiation factor IF-2 OS... 91 0.69 1
+sp|Q4R628|KIF3A_MACFA Kinesin-like protein KIF3A OS=Macac... 90 0.69 1
+sp|P46150|MOEH_DROME Moesin/ezrin/radixin homolog 1 OS=Dr... 89 0.69 1
+sp|A2QUR1|SFH5_ASPNC Phosphatidylinositol transfer protei... 88 0.69 1
+sp|P05411|JUN_AVIS1 Viral jun-transforming protein OS=Avi... 85 0.70 1
+sp|Q5ZIA2|MAP7_CHICK Ensconsin OS=Gallus gallus GN=MAP7 P... 90 0.70 1
+sp|Q09YM8|CTTB2_RABIT Cortactin-binding protein 2 OS=Oryc... 78 0.70 2
+sp|Q0CP15|NST1_ASPTN Stress response protein nst1 OS=Aspe... 92 0.70 1
+sp|A8MPH9|FOSLD_DROME Transcription factor kayak, isoform... 83 0.71 2
+sp|Q9QXS1|PLEC1_MOUSE Plectin-1 OS=Mus musculus GN=Plec1 ... 98 0.71 1
+sp|Q9WVE9|ITSN1_RAT Intersectin-1 OS=Rattus norvegicus GN... 97 0.71 2
+sp|A2QC41|MED21_ASPNC Mediator of RNA polymerase II trans... 82 0.71 1
+
+WARNING: Descriptions of 665 database sequences were not reported due to the
+ limiting value of parameter V = 500.
+
+NOTE: You might consider using a low-complexity sequence filter to reduce the
+ number of spurious matches that may be appearing in the output. See
+ the filter and wordmask options at
+ http://blast.wustl.edu/blast/parameters.html#filter.
+
+
+>sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspergillus oryzae
+ GN=hacA PE=2 SV=1
+ Length = 345
+
+ Score = 1765 (626.4 bits), Expect = 9.6e-182, P = 9.6e-182
+ Identities = 345/345 (100%), Positives = 345/345 (100%)
+
+Query: 1 MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG 60
+ MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG
+Sbjct: 1 MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWG 60
+
+Query: 61 QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ 120
+ QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ
+Sbjct: 61 QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ 120
+
+Query: 121 QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD 180
+ QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD
+Sbjct: 121 QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERD 180
+
+Query: 181 ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK 240
+ ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK
+Sbjct: 181 ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLK 240
+
+Query: 241 HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS 300
+ HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS
+Sbjct: 241 HHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDS 300
+
+Query: 301 EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC 345
+ EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC
+Sbjct: 301 EPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAGC 345
+
+
+>sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS=Emericella nidulans
+ GN=hacA PE=2 SV=2
+ Length = 350
+
+ Score = 1348 (479.6 bits), Expect = 1.5e-137, P = 1.5e-137
+ Identities = 262/332 (78%), Positives = 293/332 (88%)
+
+Query: 13 DSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP 72
+ +SLP TP+ EVPVLTVSPADTSL + +V Q KPEEKKPAKKRKSWGQELPVPKTNLPP
+Sbjct: 18 NSLPTTPSLEVPVLTVSPADTSLQTKNVVAQ-TKPEEKKPAKKRKSWGQELPVPKTNLPP 76
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM 132
+ RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE+EKI MEQQNQFLLQRL+QM
+Sbjct: 77 RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLESEKIDMEQQNQFLLQRLAQM 136
+
+Query: 133 EAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTP 192
+ EAENNRLSQQ+AQL+AEVRGSR +TP SPA+ SPTLTPTLFKQE DE+PL+RIPFPTP
+Sbjct: 137 EAENNRLSQQVAQLSAEVRGSRHSTPTSSSPASVSPTLTPTLFKQEGDEVPLDRIPFPTP 196
+
+Query: 193 SLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLS 252
+ S++DYSPTLKPS+LAES D+ QHPAVSV GLEGD SAL LFDLG+ +KH T D+ APLS
+Sbjct: 197 SVTDYSPTLKPSSLAESPDLTQHPAVSVGGLEGDESALTLFDLGASIKHEPTHDLTAPLS 256
+
+Query: 253 DDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIEMAH 312
+ DDDF RLF+GDSS+E DSS+ EDG AFDVL+ GDLSAFPFDSMV+FD+EPVTLE +E +
+Sbjct: 257 DDDFRRLFNGDSSLESDSSLLEDGFAFDVLDSGDLSAFPFDSMVDFDTEPVTLEDLEQTN 316
+
+Query: 313 GLPDETTCKTSSVQPGFGASTTRCDGQGIAAG 344
+ GL D +CK +S+QP GAST+RCDGQGIAAG
+Sbjct: 317 GLSDSASCKAASLQPSHGASTSRCDGQGIAAG 348
+
+
+>sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS=Trichoderma reesei
+ GN=hac1 PE=2 SV=1
+ Length = 451
+
+ Score = 303 (111.7 bits), Expect = 1.8e-31, Sum P(2) = 1.8e-31
+ Identities = 88/209 (42%), Positives = 112/209 (53%)
+
+Query: 7 KTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVP 66
+ + M + DS+ A S + V+ S S EKKP KKRKSWGQ LP P
+Sbjct: 43 RDMMTPDSV-ADIDSRLSVIPESQDAEDDESHSTSATAPSTSEKKPVKKRKSWGQVLPEP 101
+
+Query: 67 KTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLL 126
+ KTNLPPRKRAKTEDEKEQRR+ERVLRNR AAQ+SRERKRLE+E LE ++N+ L
+Sbjct: 102 KTNLPPRKRAKTEDEKEQRRVERVLRNRRAAQSSRERKRLEVEALE-------KRNKELE 154
+
+Query: 127 QRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLER 186
+ L ++ N L ++L + G + P S TL+ LF RD +
+Sbjct: 155 TLLINVQKTNLILVEELNRFRRS-SGVVTRSSSPLDSLQDSITLSQQLFGS-RDGQTMSN 212
+
+Query: 187 IPFPTPSLSDY------SPTLKPSTLAES 209
+ P SL D +PT+ P++L+ S
+Sbjct: 213 ---PEQSLMDQIMRSAANPTVNPASLSPS 238
+
+ Score = 61 (26.5 bits), Expect = 1.8e-31, Sum P(2) = 1.8e-31
+ Identities = 25/95 (26%), Positives = 45/95 (47%)
+
+Query: 253 DDDFNRLFHGDSSV---EPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNFDSEPVTLEGIE 309
+ DDD+ GDS+ P S ++ + + + + +A+ + N+ + L+ +E
+Sbjct: 361 DDDY---LAGDSAACFTNPLPSDYDFDINDFLTDDANHAAYDIVAASNYAAADRELD-LE 416
+
+Query: 310 MAHGLPDETTCKTSSVQPGFGASTTRCDGQGIAAG 344
+ + H ++ + S QP GAS+ CD GIA G
+Sbjct: 417 I-HDPENQIPSRHSIQQPQSGASSHGCDDGGIAVG 450
+
+
+>sp|P41546|HAC1_YEAST Transcriptional activator HAC1 OS=Saccharomyces
+ cerevisiae GN=HAC1 PE=1 SV=2
+ Length = 238
+
+ Score = 184 (69.8 bits), Expect = 9.3e-14, P = 9.3e-14
+ Identities = 69/214 (32%), Positives = 103/214 (48%)
+
+Query: 67 KTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ-NQFL 125
+ K+ LPPRKRAKT++EKEQRRIER+LRNR AA SRE+KRL ++ LE + +E N
+Sbjct: 23 KSTLPPRKRAKTKEEKEQRRIERILRNRRAAHQSREKKRLHLQYLERKCSLLENLLNSVN 82
+
+Query: 126 LQRLSQME----AENNRLSQQLAQLA--AEVRGSRANTPMPGSPATASPTLTPTLFKQER 179
+ L++L+ E ++ L + RG+ +T S ++S T TP+
+Sbjct: 83 LEKLADHEDALTCSHDAFVASLDEYRDFQSTRGASLDTR--ASSHSSSDTFTPS------ 134
+
+Query: 180 DELPLERIPFPTPSLSDYSPTLKPSTLAES-SDVAQHPAVSVAGLEG--DGSALPLFDLG 236
+ PL P TL P ++ +S SD + + E + + LP D
+Sbjct: 135 ---PLNCTMEPA--------TLSPKSMRDSASDQETSWELQMFKTENVPESTTLPAVD-N 182
+
+Query: 237 SDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDS 270
+ ++L +A PL DD D+S++ D+
+Sbjct: 183 NNLFDAVASPLADPLCDDIAGNSLPFDNSIDLDN 216
+
+
+>sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabidopsis thaliana GN=HY5
+ PE=1 SV=1
+ Length = 168
+
+ Score = 170 (64.9 bits), Expect = 3.4e-12, P = 3.4e-12
+ Identities = 46/146 (31%), Positives = 69/146 (47%)
+
+Query: 10 SSVDSLPATPASEVPVLTVSP---ADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVP 66
+ SS+ S +S P L + +D + E +E + + GQE
+Sbjct: 12 SSLPSSSERSSSSAPHLEIKEGIESDEEIRRVPEFGGEAVGKETSGRESGSATGQERTQA 71
+
+Query: 67 KTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLL 126
+ RKR +T EKE +R++R+LRNR +AQ +RERK+ + +LEN +E +N L
+Sbjct: 72 TVGESQRKRGRTPAEKENKRLKRLLRNRVSAQQARERKKAYLSELENRVKDLENKNSELE 131
+
+Query: 127 QRLSQMEAENNRLSQQLAQLAAEVRG 152
+ +RLS ++ EN L L RG
+Sbjct: 132 ERLSTLQNENQMLRHILKNTTGNKRG 157
+
+
+>sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanum lycopersicum GN=HY5
+ PE=2 SV=1
+ Length = 158
+
+ Score = 140 (54.3 bits), Expect = 7.0e-09, P = 7.0e-09
+ Identities = 35/95 (36%), Positives = 53/95 (55%)
+
+Query: 60 GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME 119
+ GQ P T RKR ++ +KE +R++R+LRNR +AQ +RERK+ + LE ++E
+Sbjct: 66 GQAQPSAGTQ---RKRGRSPADKENKRLKRLLRNRVSAQQARERKKAYLIDLEARVKELE 122
+
+Query: 120 QQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ +N L +RLS ++ EN L L A + R
+Sbjct: 123 TKNAELEERLSTLQNENQMLRHILKNTTAGAQEGR 157
+
+
+>sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos taurus GN=XBP1 PE=2 SV=1
+ Length = 261
+
+ Score = 150 (57.9 bits), Expect = 3.2e-08, P = 3.2e-08
+ Identities = 53/160 (33%), Positives = 81/160 (50%)
+
+Query: 60 GQELPVPK--TNLPP--RKRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENE 114
+ GQ+ P+ + +PP RKR + T E++ + R L+NR AAQT+R+RK+ M +LE +
+Sbjct: 42 GQQGASPEGASGVPPQARKRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQ 101
+
+Query: 115 KIQMEQQNQFLL---QRLSQ----MEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATAS 167
+ + +E++NQ LL Q L + + EN L Q+L + A V A T G+ A
+Sbjct: 102 VVDLEEENQKLLLENQLLREKTHGLVVENQELRQRLG-MDALVTEEEAETKGNGAGLVAG 160
+
+Query: 168 PTLTPTLFKQERDELPLERIPFPTPSLSDYSP-TLKPSTL 206
+ + L R PL+++ L + SP TL TL
+Sbjct: 161 SAESAAL----RLRAPLQQVQAQLSPLQNISPWTLMALTL 196
+
+
+>sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Homo sapiens GN=XBP1 PE=1 SV=2
+ Length = 261
+
+ Score = 150 (57.9 bits), Expect = 3.2e-08, P = 3.2e-08
+ Identities = 55/186 (29%), Positives = 92/186 (49%)
+
+Query: 16 PATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR 75
+ PA +V +L+ PA + A + P ++ + + S G +P+ RKR
+Sbjct: 10 PADGTPKVLLLSGQPASAAGAPAGQALPLMVPAQRGASPEAASGG----LPQA----RKR 61
+
+Query: 76 AK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLL---QRLSQ 131
+ + T E++ + R L+NR AAQT+R+RK+ M +LE + + +E++NQ LL Q L +
+Sbjct: 62 QRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENQKLLLENQLLRE 121
+
+Query: 132 ----MEAENNRLSQQL------AQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDE 181
+ + EN L Q+L A+ AE +G+ P+ GS +A+ L L + +
+Sbjct: 122 KTHGLVVENQELRQRLGMDALVAEEEAEAKGNEVR-PVAGSAESAALRLRAPLQQVQAQL 180
+
+Query: 182 LPLERI 187
+ PL+ I
+Sbjct: 181 SPLQNI 186
+
+
+>sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive element-binding protein 3-like
+ protein 2 OS=Danio rerio GN=creb3l2 PE=2 SV=1
+ Length = 519
+
+ Score = 156 (60.0 bits), Expect = 3.7e-08, P = 3.7e-08
+ Identities = 51/156 (32%), Positives = 78/156 (50%)
+
+Query: 4 DMEKTMSSVDSL-PATPASEVPVLTVSP-ADTSLNSADVKTQEVKPEEKKPA-----KKR 56
+ D E + S V PA+P VL V+P A +SL+S+ + T K + P +KR
+Sbjct: 210 DSEGSQSPVHPCAPASPTQTPAVLKVAPRAPSSLSSSPLLTAPHKLQGSGPLLLTEEEKR 269
+
+Query: 57 KSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKI 116
+ + PVP T LP K +EK ++I R ++N+ +AQ SR +K+ ++ LE +
+Sbjct: 270 TLIAEGYPVP-TKLPLSKA----EEKALKKIRRKIKNKISAQESRRKKKEYVDALEKKVE 324
+
+Query: 117 QMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG 152
+ +N L +++ +E N L QQL L A V G
+Sbjct: 325 TCSNENHELRRKVENLECTNKSLLQQLHSLQAVVAG 360
+
+
+>sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=Arabidopsis thaliana
+ GN=HYH PE=1 SV=1
+ Length = 149
+
+ Score = 127 (49.8 bits), Expect = 1.9e-07, P = 1.9e-07
+ Identities = 25/71 (35%), Positives = 45/71 (63%)
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM 132
+ R+R + +KE R ++R+LRNR +AQ +RERK++ + LE+ +++ N L +++S +
+Sbjct: 68 RRRGRNPVDKEYRSLKRLLRNRVSAQQARERKKVYVSDLESRANELQNNNDQLEEKISTL 127
+
+Query: 133 EAENNRLSQQL 143
+ EN L + L
+Sbjct: 128 TNENTMLRKML 138
+
+
+>sp|A3LYI0|NST1_PICST Stress response protein NST1 OS=Pichia stipitis GN=NST1
+ PE=3 SV=2
+ Length = 1234
+
+ Score = 148 (57.2 bits), Expect = 9.6e-07, P = 9.6e-07
+ Identities = 57/195 (29%), Positives = 95/195 (48%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ + +E+K +E++ KK ++ ++ K L ++ K E+E++++ E+ + Q
+Sbjct: 727 RIEELKRKEEEHKKKVEAQQKKEEEAK-KLKEERKKKAEEERKKKEEEKRQKELLKKQKE 785
+
+Query: 101 RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP 160
+ ER+RL++E ENE+++ EQQ L +++ N+L + AQL AE+ N
+Sbjct: 786 EERERLKLEAEENERLEKEQQE------LQELQESQNQLELESAQLPAEL-AEEINA--- 835
+
+Query: 161 GSPATASPTLTPTLFKQERDELPLERIPFPT---PSLSDYSPTLKPSTLAESSDVAQ--- 214
+ SP + SPT L +Q P + PT P + ++P P A SS V
+Sbjct: 836 -SPDSFSPTKNH-LLEQLYQARP-SSVSGPTTISPPIQ-FTPEAVPPVAAVSSVVPSVVP 891
+
+Query: 215 -HPAVSVAGLEGDGS 228
+ PA+S A L G GS
+Sbjct: 892 ISPALSGAILNGTGS 906
+
+ Score = 102 (41.0 bits), Expect = 0.11, P = 0.10
+ Identities = 43/168 (25%), Positives = 78/168 (46%)
+
+Query: 40 VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQT 99
+ V+ Q+ K EE K K+ + E K R++ + +KE+ R ER L+ A
+Sbjct: 742 VEAQQKKEEEAKKLKEERKKKAEEERKKKEEEKRQKELLKKQKEEER-ER-LKLEAEENE 799
+
+Query: 100 SRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ-MEAENNRLSQQLAQLAAEVRGSRANTP 158
+ E+++ E+++L+ + Q+E ++ L L++ + A + S L ++ +R ++
+Sbjct: 800 RLEKEQQELQELQESQNQLELESAQLPAELAEEINASPDSFSPTKNHLLEQLYQARPSS- 858
+
+Query: 159 MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTL 206
+ + G P T SP P F E P+ + PS+ SP L + L
+Sbjct: 859 VSG-PTTISP---PIQFTPEAVP-PVAAVSSVVPSVVPISPALSGAIL 901
+
+
+>sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive element-binding protein 3-like
+ protein 2 OS=Homo sapiens GN=CREB3L2 PE=1 SV=2
+ Length = 520
+
+ Score = 136 (52.9 bits), Expect = 6.4e-06, P = 6.4e-06
+ Identities = 44/146 (30%), Positives = 70/146 (47%)
+
+Query: 14 SLPAT--PASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLP 71
+ SLP T P+ P + + + L +A K Q P +KR + P+P T LP
+Sbjct: 228 SLPQTHSPSRAAPRAPSALSSSPLLTAPHKLQGSGPLVLTEEEKRTLIAEGYPIP-TKLP 286
+
+Query: 72 PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ K +EK ++I R ++N+ +AQ SR +K+ M+ LE + +N L +++
+Sbjct: 287 LSK----SEEKALKKIRRKIKNKISAQESRRKKKEYMDSLEKKVESCSTENLELRKKVEV 342
+
+Query: 132 MEAENNRLSQQLAQLAAEVRGSRANT 157
+ +E N L QQL +L V G + T
+Sbjct: 343 LENTNRTLLQQLQKLQTLVMGKVSRT 368
+
+
+>sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive element-binding protein 3-like
+ protein 2 OS=Pongo abelii GN=CREB3L2 PE=2 SV=1
+ Length = 520
+
+ Score = 136 (52.9 bits), Expect = 6.4e-06, P = 6.4e-06
+ Identities = 44/146 (30%), Positives = 70/146 (47%)
+
+Query: 14 SLPAT--PASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLP 71
+ SLP T P+ P + + + L +A K Q P +KR + P+P T LP
+Sbjct: 228 SLPQTHSPSRAAPRAPSALSSSPLLTAPHKLQGSGPLVLTEEEKRTLIAEGYPIP-TKLP 286
+
+Query: 72 PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ K +EK ++I R ++N+ +AQ SR +K+ M+ LE + +N L +++
+Sbjct: 287 LTK----SEEKALKKIRRKIKNKISAQESRRKKKEYMDSLEKKVESCSTENLELRKKVEV 342
+
+Query: 132 MEAENNRLSQQLAQLAAEVRGSRANT 157
+ +E N L QQL +L V G + T
+Sbjct: 343 LENTNRTLLQQLQKLQTLVMGKVSRT 368
+
+
+>sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive element-binding protein 3-like
+ protein 2 OS=Mus musculus GN=Creb3l2 PE=2 SV=1
+ Length = 521
+
+ Score = 136 (52.9 bits), Expect = 6.5e-06, P = 6.5e-06
+ Identities = 71/291 (24%), Positives = 120/291 (41%)
+
+Query: 18 TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK 77
+ +PA +P + + + L +A K Q P +KR + P+P T LP K
+Sbjct: 234 SPARAMPRGPSALSTSPLLTAPHKLQGSGPLVLTEEEKRTLVAEGYPIP-TKLPLTK--- 289
+
+Query: 78 TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN 137
+ +EK ++I R ++N+ +AQ SR +K+ M+ LE + +N L +++ +E N
+Sbjct: 290 -SEEKALKKIRRKIKNKISAQESRRKKKEYMDSLEKKVESCSTENLELRKKVEVLENTNR 348
+
+Query: 138 RLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTL-FKQERDELPLERIPFPTPS--- 193
+ L QQL +L V G + T T + + L F P+P+ +
+Sbjct: 349 TLLQQLQKLQTLVMGKVSRTCKLAGTQTGTCLMVVVLCFAVAFGSFFQGYGPYPSATKMA 408
+
+Query: 194 LSDYSPTLKPST--LAESSDVA---QHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVA 248
+ L P +P T + S ++ +H + + L +D GS L S+ A
+Sbjct: 409 LPSQHPLSEPYTASVVRSRNLLIYEEHAPLEESSSPASAGELGGWDRGSSLLRASSGLEA 468
+
+Query: 249 APLSDDDFNRLFHGDSSVEPDSSV-FEDGLAFDVLEGGD-LSAFPFDSMVN 297
+ P D + L ++S+E + + L LEG + L + VN
+Sbjct: 469 LPEVDLP-HFLISNETSLEKSVLLELQQHLVSSKLEGNETLKVVELERRVN 518
+
+
+>sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-binding protein 3 OS=Mus
+ musculus GN=Creb3 PE=2 SV=2
+ Length = 404
+
+ Score = 132 (51.5 bits), Expect = 1.2e-05, P = 1.2e-05
+ Identities = 54/194 (27%), Positives = 90/194 (46%)
+
+Query: 26 LTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQR 85
+ +T P + ++ + EEKK +K + L +P T LP K +E+ +
+Sbjct: 138 VTPLPGEERAAEQEMSRLILTEEEKKLLEK-----EGLTLPST-LPLTK----VEEQVLK 187
+
+Query: 86 RIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQ 145
+ R+ R +RN+ AAQ SR++K++ + LE+ ++ QN+ L ++ ++E +N L QL +
+Sbjct: 188 RVRRKIRNKRAAQESRKKKKVYVVGLESRVLKYTAQNRELQNKVQRLEEQNLSLLDQLRK 247
+
+Query: 146 LAAEVRGSRANTPMPGSPATASPT------LTPTLFKQE-RDELPLERIPF-----PTPS 193
+ L A V AN GS L P ++ + R +P E + PS
+Sbjct: 248 LQAMVI-EIANKTSSGSTCVLVLVFSFCLLLVPAMYSSDARGSVPAEYVVLHRKLRALPS 306
+
+Query: 194 LSDYSPTLKPSTLA 207
+ D+ P KPS L+
+Sbjct: 307 EDDHQP--KPSALS 318
+
+
+>sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive element-binding protein 3-like
+ protein 2 OS=Xenopus laevis GN=creb3l2 PE=2 SV=1
+ Length = 525
+
+ Score = 133 (51.9 bits), Expect = 1.4e-05, P = 1.4e-05
+ Identities = 45/156 (28%), Positives = 77/156 (49%)
+
+Query: 4 DMEKTMSSVDSLP-ATPA-SEVPVLTVSPADTSLNSADVKTQEVKPEEKKPA-----KKR 56
+ D E S SLP ++P S+ + + ++L+++ + T K + P +KR
+Sbjct: 218 DSEGGQSPTRSLPPSSPVQSQAGGKMAARSPSALSNSPLLTAPHKLQGSGPLMLTEEEKR 277
+
+Query: 57 KSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKI 116
+ + P+P T LP K +EK ++I R ++N+ +AQ SR +K+ M+ LE
+Sbjct: 278 TLVAEGYPIP-TKLPLTKA----EEKALKKIRRKIKNKISAQESRRKKKEYMDSLEKRVE 332
+
+Query: 117 QMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG 152
+ +N L +++ +E+ N L QQL +L A V G
+Sbjct: 333 NSSSENSELRKKVEVLESTNRTLLQQLQRLQAMVTG 368
+
+
+>sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element-binding protein 3-like
+ protein 1 OS=Rattus norvegicus GN=Creb3l1 PE=2 SV=1
+ Length = 520
+
+ Score = 131 (51.2 bits), Expect = 2.3e-05, P = 2.3e-05
+ Identities = 68/222 (30%), Positives = 102/222 (45%)
+
+Query: 14 SLPATPASEV-PVLTVSPA-DTS-LNSADVKTQEVK-PEEKKPAKKRKSWGQELPVPKTN 69
+ SLP P+S V P+ S A TS L +A K Q P +KR + P+P T
+Sbjct: 223 SLP--PSSPVRPMARSSTAISTSPLLTAPHKLQGTSGPLLLTEEEKRTLIAEGYPIP-TK 279
+
+Query: 70 LPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ LP K +EK +R+ R ++N+ +AQ SR +K+ +E LE + +N L +++
+Sbjct: 280 LPLTKA----EEKALKRVRRKIKNKISAQESRRKKKEYVECLEKKVETYTSENNELWKKV 335
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF 189
+ +E N L QQL +L V S+ + P A+ T T + L L +
+Sbjct: 336 ETLETANRTLLQQLQKLQTLVT-SKISRPYK---MAATQTGTCLMVAALCFVLVLGSLAP 391
+
+Query: 190 PTPSLSDYSPTLKPSTLAESSDVA--QHPAVSVAGLE-GDGS 228
+ P+ S S T+K +A S A Q P+ S+ + G GS
+Sbjct: 392 CLPAFSSGSKTVKEDPVAADSVYAASQMPSRSLLFYDDGAGS 433
+
+
+>sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper transcription factor F
+ OS=Dictyostelium discoideum GN=bzpF PE=3 SV=1
+ Length = 631
+
+ Score = 132 (51.5 bits), Expect = 2.4e-05, P = 2.4e-05
+ Identities = 57/233 (24%), Positives = 101/233 (43%)
+
+Query: 46 KPEEKKPAKKRKSWGQELPVPKTN----LPPRKRA--KTEDEKEQRRIERVLRNRAAAQT 99
+ K EE K KKRK + PV N L P ++E+ Q+R R+++NR AAQ
+Sbjct: 363 KKEEDKSIKKRK-FISSTPVKGENGGTTLIPTTDGGFNMDEERHQKRQRRLVKNREAAQL 421
+
+Query: 100 SRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA-NTP 158
+ R+R++ ++ LE + + N R+ + +EN + +QL L V + + + P
+Sbjct: 422 FRQRQKAYIQDLEKKVSDLTGTNSEFRARVELLNSENKLIREQLLYLRNFVTQAVSFSFP 481
+
+Query: 159 MPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAV 218
+ GS T SP+ F L P P L P ++ ++ A +
+Sbjct: 482 KGGSNGTNSPSGVADQFLNSILPPGLNS-PLPQGILPAGMNLQNPMIMSAIAEAASKNST 540
+
+Query: 219 SVAGLEGDGSALPLFDLGSDLKHHSTDDVA-APLSDDDFNRLFHGDSSVEPDS 270
+ ++G+ P+ S L +S ++ PL++++ N + +++ P S
+Sbjct: 541 FRQNIQGNLLGTPIPSPQSSLTSNSGNNSPNKPLNNNNNNNNINNNNNNNPSS 593
+
+
+>sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive element-binding protein 3-like
+ protein 1 OS=Mus musculus GN=Creb3l1 PE=2 SV=2
+ Length = 519
+
+ Score = 130 (50.8 bits), Expect = 3.0e-05, P = 3.0e-05
+ Identities = 68/222 (30%), Positives = 102/222 (45%)
+
+Query: 14 SLPATPASEV-PVLTVSPA-DTS-LNSADVKTQEVK-PEEKKPAKKRKSWGQELPVPKTN 69
+ SLP P+S V P+ S A TS L +A K Q P +KR + P+P T
+Sbjct: 224 SLP--PSSPVRPMARSSTAISTSPLLTAPHKLQGTSGPLLLTEEEKRTLIAEGYPIP-TK 280
+
+Query: 70 LPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ LP K +EK +R+ R ++N+ +AQ SR +K+ +E LE + +N L +++
+Sbjct: 281 LPLTKA----EEKALKRVRRKIKNKISAQESRRKKKEYVECLEKKVETYTSENNELWKKV 336
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF 189
+ +E N L QQL +L V S+ + P A+ T T + L L +
+Sbjct: 337 ETLETANRTLLQQLQKLQTLVT-SKISRPYK---MAATQTGTCLMVAALCFVLVLGSLVP 392
+
+Query: 190 PTPSLSDYSPTLKPSTLAESSDVA--QHPAVSVAGLE-GDGS 228
+ P+ S S T+K +A S A Q P+ S+ + G GS
+Sbjct: 393 CLPAFSSGSMTVKEDPIAADSVYAASQMPSRSLLFYDDGAGS 434
+
+
+>sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcriptional factor ATF-like 3
+ OS=Homo sapiens GN=BATF3 PE=1 SV=1
+ Length = 127
+
+ Score = 104 (41.7 bits), Expect = 6.0e-05, P = 6.0e-05
+ Identities = 22/77 (28%), Positives = 42/77 (54%)
+
+Query: 69 NLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQR 128
+ N P + + E + R++ R +NR AAQ SR+++ + +KL E +EQ+N L +
+Sbjct: 21 NQPQPQPQQQSPEDDDRKVRRREKNRVAAQRSRKKQTQKADKLHEEYESLEQENTMLRRE 80
+
+Query: 129 LSQMEAENNRLSQQLAQ 145
+ + ++ E L++ L +
+Sbjct: 81 IGKLTEELKHLTEALKE 97
+
+
+>sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcriptional factor ATF-like 3
+ OS=Mus musculus GN=Batf3 PE=2 SV=1
+ Length = 118
+
+ Score = 104 (41.7 bits), Expect = 6.0e-05, P = 6.0e-05
+ Identities = 21/63 (33%), Positives = 39/63 (61%)
+
+Query: 83 EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ + R++ R +NR AAQ SR+++ + +KL E +EQ+N L + +S+++ E LS+
+Sbjct: 28 DDRKVRRREKNRVAAQRSRKKQTQKADKLHEEHESLEQENSVLRREISKLKEELRHLSEV 87
+
+Query: 143 LAQ 145
+ L +
+Sbjct: 88 LKE 90
+
+
+>sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive element-binding protein 3-like
+ protein 1 OS=Homo sapiens GN=CREB3L1 PE=1 SV=1
+ Length = 519
+
+ Score = 127 (49.8 bits), Expect = 6.4e-05, P = 6.4e-05
+ Identities = 66/223 (29%), Positives = 101/223 (45%)
+
+Query: 14 SLPATPASEV-PVLTVSPA-DTS-LNSADVKTQEVK-PEEKKPAKKRKSWGQELPVPKTN 69
+ SLP P+S V P+ S A TS L +A K Q P +KR + P+P T
+Sbjct: 224 SLP--PSSPVRPMARSSTAISTSPLLTAPHKLQGTSGPLLLTEEEKRTLIAEGYPIP-TK 280
+
+Query: 70 LPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ LP K +EK +R+ R ++N+ +AQ SR +K+ +E LE + +N L +++
+Sbjct: 281 LPLTKA----EEKALKRVRRKIKNKISAQESRRKKKEYVECLEKKVETFTSENNELWKKV 336
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF 189
+ +E N L QQL +L V ++ + P A+ T T + L L +
+Sbjct: 337 ETLENANRTLLQQLQKLQTLVT-NKISRPYK---MAATQTGTCLMVAALCFVLVLGSLVP 392
+
+Query: 190 PTPSLSDYSPTLKPSTLAESS--DVAQHPAVSVAGLEGDGSAL 230
+ P S S T+K LA +Q P+ S+ + DG+ L
+Sbjct: 393 CLPEFSSGSQTVKEDPLAADGVYTASQMPSRSLLFYD-DGAGL 434
+
+
+>sp|O88778|BSN_RAT Protein bassoon OS=Rattus norvegicus GN=Bsn PE=1 SV=3
+ Length = 3938
+
+ Score = 136 (52.9 bits), Expect = 7.2e-05, P = 7.2e-05
+ Identities = 59/227 (25%), Positives = 102/227 (44%)
+
+Query: 15 LPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRK 74
+ LPA A E P+ T +P + A V P +KPA + G V + ++
+Sbjct: 2294 LPAGGAREEPLSTTAPPAV-IKEAPVAQAPAPPPGQKPAGDAAA-GSGSGVLGRPVMEKE 2351
+
+Query: 75 RAKTEDE--KEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME---QQNQFLLQR- 128
+ A ED K+Q ++ ++ R R + R+ RL+ E+LE E+++++ ++ Q L+QR
+Sbjct: 2352 EASQEDRQRKQQEQLLQLERERVELEKLRQL-RLQ-EELERERVELQRHREEEQLLVQRE 2409
+
+Query: 129 LSQMEA-ENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERI 187
+ L +++ +++ L QQ + A+ R L L +Q ++ ++
+Sbjct: 2410 LQELQTIKHHVLQQQQEERQAQFALQREQLAQQRLQLEQIQQLQQQLQQQLEEQKQRQKA 2469
+
+Query: 188 PFP-TPSLSDYSPTLKPSTLAESSDV---AQHPA-VSVAGLEGDGSA 229
+ PFP T P + LA++ H A ++VAG EG G A
+Sbjct: 2470 PFPATCEAPSRGPPPAATELAQNGQYWPPLTHTAFIAVAGTEGPGQA 2516
+
+ Score = 111 (44.1 bits), Expect = 0.039, P = 0.039
+ Identities = 47/191 (24%), Positives = 87/191 (45%)
+
+Query: 12 VDSLPATPASEVPVLTVSPADTS--LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTN 69
+ V PA P + P + S L ++ +E E+++ +K++ +L +
+Sbjct: 2318 VAQAPAPPPGQKPAGDAAAGSGSGVLGRPVMEKEEASQEDRQ--RKQQEQLLQLERERVE 2375
+
+Query: 70 LPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ---QNQFLL 126
+ L ++ + ++E E+ R+E + R+R Q +R+ E++ +++ +Q +Q Q QF L
+Sbjct: 2376 LEKLRQLRLQEELERERVE-LQRHREEEQLLVQRELQELQTIKHHVLQQQQEERQAQFAL 2434
+
+Query: 127 QR--LSQ--MEAEN-NRLSQQLAQLAAEVRGSRANTPMPGS---PATASPTLTPTLFKQE 178
+ QR L+Q ++ E +L QQL Q E + R P P + P+ P L +
+Sbjct: 2435 QREQLAQQRLQLEQIQQLQQQLQQQLEEQK-QRQKAPFPATCEAPSRGPPPAATELAQNG 2493
+
+Query: 179 RDELPLERIPF 189
+ + PL F
+Sbjct: 2494 QYWPPLTHTAF 2504
+
+
+>sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element-binding protein 3-like
+ protein 2 OS=Rattus norvegicus GN=Creb3l2 PE=2 SV=1
+ Length = 521
+
+ Score = 125 (49.1 bits), Expect = 0.00011, P = 0.00011
+ Identities = 41/130 (31%), Positives = 63/130 (48%)
+
+Query: 29 SPADTS-LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRI 87
+ S TS L +A K Q P +KR + P+P T LP K +EK ++I
+Sbjct: 244 SALSTSPLLTAPHKLQGSGPLVLTEEEKRTLIAEGYPIP-TKLPLTK----SEEKALKKI 298
+
+Query: 88 ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA 147
+ R ++N+ +AQ SR +K+ M+ LE + +N L +++ +E N L QQL +L
+Sbjct: 299 RRKIKNKISAQESRRKKKEYMDSLEKKVESCSTENLELRKKVEVLENTNRTLLQQLQKLQ 358
+
+Query: 148 AEVRGSRANT 157
+ V G + T
+Sbjct: 359 TLVMGKVSRT 368
+
+
+>sp|Q9WVS8|MK07_MOUSE Mitogen-activated protein kinase 7 OS=Mus musculus
+ GN=Mapk7 PE=1 SV=1
+ Length = 806
+
+ Score = 127 (49.8 bits), Expect = 0.00012, P = 0.00012
+ Identities = 71/258 (27%), Positives = 109/258 (42%)
+
+Query: 3 CDMEKTMSSVDSLP--ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKR---K 57
+ C ME S +LP + PA + LT+ PA + A K + + K A K K
+Sbjct: 429 CAME---SPPPALPPCSDPAPDTVDLTLQPAPPASELAPPKREGAISDNTKAALKAALLK 485
+
+Query: 58 SWGQEL---PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENE 114
+ S L P P ++ T E+++ R E+ R + A+ RE++R E E+ E
+Sbjct: 486 SLRSRLRDGPSAPLEAPEPRKPVTAQERQREREEKRRRRQERAK-EREKRRQERERKERG 544
+
+Query: 115 KIQMEQQNQFLLQRLSQMEAENNR-LSQQLAQLAAEVRGSRANTPMPG-SPATASPTLTP 172
+ + + L L + ++N+R L ++ ++A + A P P +P++A PT TP
+Sbjct: 545 AGTLGGPSTDPLAGL--VLSDNDRSLLERWTRMARPPAPAPAPAPAPAPAPSSAQPTSTP 602
+
+Query: 173 T-LFKQERDEL-PLERIPFPT--PSLSDYSPTLKPS--------TLAESSDVAQHPAVSV 220
+ T Q L P IP P P P +P+ T +S +A V
+Sbjct: 603 TGPVSQSTGPLQPAGSIPGPASQPVCPPPGPVPQPAGPIPAPLQTAPSTSLLASQSLVPP 662
+
+Query: 221 AGLEGDGS--ALPLFDLG 236
+ +GL G G+ LP F G
+Sbjct: 663 SGLPGSGAPEVLPYFPSG 680
+
+
+>sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive element-binding protein 3-like
+ protein 4 OS=Xenopus tropicalis GN=creb3l4 PE=2 SV=1
+ Length = 428
+
+ Score = 123 (48.4 bits), Expect = 0.00013, P = 0.00013
+ Identities = 36/129 (27%), Positives = 63/129 (48%)
+
+Query: 24 PVLTVSPADTSLNSAD-VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK 82
+ PV +P L AD + + PE ++++ QE NLP K +E+
+Sbjct: 160 PVCKSTPLPIRLTPADLIAVDALYPELHLTEEEKRLLSQEGVALPNNLPLTKA----EER 215
+
+Query: 83 EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ +++ R +RN+ +AQ SR RK+ ++ LE+ QNQ L +++ ++E N L Q
+Sbjct: 216 ILKKVRRKIRNKQSAQDSRRRKKEYIDGLESRVAACSSQNQELHKKVVELEKHNISLITQ 275
+
+Query: 143 LAQLAAEVR 151
+ L +L ++
+Sbjct: 276 LRKLQTLIK 284
+
+
+>sp|Q16520|BATF_HUMAN Basic leucine zipper transcriptional factor ATF-like
+ OS=Homo sapiens GN=BATF PE=1 SV=1
+ Length = 125
+
+ Score = 100 (40.3 bits), Expect = 0.00016, P = 0.00016
+ Identities = 28/90 (31%), Positives = 45/90 (50%)
+
+Query: 71 PPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLS 130
+ PP K+ ++D RR++R +NR AAQ SR+R+ + + L E +E+QN L + +
+Sbjct: 17 PPGKQDSSDDV---RRVQRREKNRIAAQKSRQRQTQKADTLHLESEDLEKQNAALRKEIK 73
+
+Query: 131 QMEAENNRLSQQLAQLAAEVRGSRANTPMP 160
+ Q+ E + L A+TP P
+Sbjct: 74 QLTEELKYFTSVLNSHEPLCSVLAASTPSP 103
+
+
+>sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-binding protein 3-like
+ protein 4 OS=Mus musculus GN=Creb3l4 PE=1 SV=1
+ Length = 370
+
+ Score = 121 (47.7 bits), Expect = 0.00017, P = 0.00017
+ Identities = 41/138 (29%), Positives = 68/138 (49%)
+
+Query: 18 TPASEVP-VLTVS--PADTSLNSAD-VKTQEVKPEEKKPAKKRKSW-----GQELPVPKT 68
+ TPA VP TVS P+D+ + V T+ P P+ + + Q L
+Sbjct: 119 TPALMVPDACTVSGLPSDSHRHILPRVSTRAPAPPAAMPSCQHHLFLTDEEKQLLAQEGI 178
+
+Query: 69 NLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQR 128
+ LP +E+ ++I R +RN+ +AQ SR RK+ ++ LE+ +QNQ L ++
+Sbjct: 179 TLPSHLPLTKAEERILKKIRRKIRNKQSAQDSRRRKKEYLDGLESRVAACSEQNQKLQRK 238
+
+Query: 129 LSQMEAENNRLSQQLAQL 146
+ + ++E +N L +Q+ QL
+Sbjct: 239 VQELERQNIFLMEQVRQL 256
+
+ Score = 92 (37.4 bits), Expect = 0.30, P = 0.26
+ Identities = 27/90 (30%), Positives = 49/90 (54%)
+
+Query: 70 LPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE---------NEKIQ--- 117
+ LP +E+ ++I R +RN+ +AQ SR RK+ ++ LE N+K+Q
+Sbjct: 180 LPSHLPLTKAEERILKKIRRKIRNKQSAQDSRRRKKEYLDGLESRVAACSEQNQKLQRKV 239
+
+Query: 118 --MEQQNQFLLQRLSQMEAENNRLSQQLAQ 145
+ +E+QN FL++++ Q++ + S + AQ
+Sbjct: 240 QELERQNIFLMEQVRQLQKLTAQTSSRAAQ 269
+
+
+>sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF2 OS=Petroselinum crispum
+ GN=CPRF2 PE=2 SV=2
+ Length = 401
+
+ Score = 121 (47.7 bits), Expect = 0.00020, P = 0.00020
+ Identities = 30/103 (29%), Positives = 50/103 (48%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRL 139
+ D + +R+ R+L NR +A+ SR RK+ M +LE + Q+ +N LL+RL+ + N
+Sbjct: 195 DPSDAKRVRRMLSNRESARRSRRRKQAHMTELETQVSQLRVENSSLLKRLTDISQRYNDA 254
+
+Query: 140 SQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDEL 182
+ + L A++ RA M L P +F+ E+
+Sbjct: 255 AVDNRVLKADIETMRAKVKMAEETVKRVTGLNP-MFQSMSSEI 296
+
+
+>sp|P97876|BATF3_RAT Basic leucine zipper transcriptional factor ATF-like 3
+ OS=Rattus norvegicus GN=Batf3 PE=1 SV=1
+ Length = 133
+
+ Score = 99 (39.9 bits), Expect = 0.00021, P = 0.00021
+ Identities = 19/63 (30%), Positives = 39/63 (61%)
+
+Query: 83 EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ + R++ R +NR AAQ SR+++ + +KL E +EQ+N L + +++++ E L++
+Sbjct: 28 DDRKVRRREKNRVAAQRSRKKQTQKSDKLHEEHESLEQENSVLRREIAKLKEELRHLTEA 87
+
+Query: 143 LAQ 145
+ L +
+Sbjct: 88 LKE 90
+
+
+>sp|Q5B3C8|NST1_EMENI Stress response protein nst1 OS=Emericella nidulans
+ GN=nst1 PE=3 SV=1
+ Length = 1125
+
+ Score = 125 (49.1 bits), Expect = 0.00029, P = 0.00029
+ Identities = 60/227 (26%), Positives = 99/227 (43%)
+
+Query: 31 ADTSLNSADVKT-QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIER 89
+ A + A K QE K EE++ K+ + +E + +RA+ E EK +R E
+Sbjct: 515 AQKAAEEAAAKAEQERKLEEQRKKKEEQRKKREA---ERKAQEEERARKEAEKHKRLREE 571
+
+Query: 90 VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA---QL 146
+ R A + RE+K E ++ E K + E++ + L ++ ++ E E +Q +
+Sbjct: 572 RERQEEAERRQREQKEQEKKRREEAK-RKEREERELREQKAKQERERKAQDEQSRRERER 630
+
+Query: 147 AAEVRGSRANTPMPGSPATASP-TLTPTLFKQERDELPLE-RIPFPTPSLSDYSPTLKPS 204
+ A+ + RA P SP + P + TP + K P + R P S S SP + S
+Sbjct: 631 VAQEQAKRAPNLQPVSPVSPPPESATPVVSKAPT---PAKGRRPSQQGSHSS-SPRSQ-S 685
+
+Query: 205 TLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPL 251
+ AE+S V+ A + GS++P + G + H +PL
+Sbjct: 686 ASAEASQVSPRSAPLS---QSSGSSIPKYGSGHPILHPHPGAPMSPL 729
+
+
+>sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-binding protein 3-like
+ protein 3 OS=Mus musculus GN=Creb3l3 PE=2 SV=1
+ Length = 479
+
+ Score = 115 (45.5 bits), Expect = 0.00030, Sum P(2) = 0.00030
+ Identities = 38/115 (33%), Positives = 59/115 (51%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ +EKK K G LP T LP K +E+ ++I R +RN+ +AQ SR++K+
+Sbjct: 214 DEKKLLAKE---GVTLP---TQLPLTKY----EERVLKKIRRKIRNKQSAQESRKKKKEY 263
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS 162
+ ++ LEN QNQ L +++ +E +N L +QL L A V S + G+
+Sbjct: 264 IDGLENRMSACTAQNQELQRKVLHLEKQNLSLLEQLKHLQALVVQSTSKPAHAGT 318
+
+ Score = 47 (21.6 bits), Expect = 0.00030, Sum P(2) = 0.00030
+ Identities = 12/42 (28%), Positives = 19/42 (45%)
+
+Query: 15 LPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKR 56
+ LP+TP E P V + +++ T + PEE + R
+Sbjct: 130 LPSTPCPEPPRTQVQESSVAIDLDMWSTDTLYPEEPAGSPSR 171
+
+
+>sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-binding protein 3-like
+ protein 3 OS=Bos taurus GN=CREB3L3 PE=2 SV=1
+ Length = 456
+
+ Score = 120 (47.3 bits), Expect = 0.00032, P = 0.00032
+ Identities = 63/240 (26%), Positives = 102/240 (42%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ +EKK K G LP T LP K +E+ ++I R +RN+ +AQ SR++K+
+Sbjct: 213 DEKKLLAKE---GITLP---TQLPLTKY----EERMLKKIRRKIRNKQSAQESRKKKKEY 262
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS----- 162
+ ++ LE QNQ L +++ +E +N L +QL +L A V S + + G+
+Sbjct: 263 IDGLETRMSACTAQNQELQRKVLHLEKQNLSLLEQLKKLQAIVVQSTSKSAQTGTCIAVL 322
+
+Query: 163 ----PATASPTLTPTLFKQERDELPLERIP---FPTPSLSDYSPTLKPSTLAESSDVAQH 215
+ P+++P F R E P + P F +D + + P T A S+ A
+Sbjct: 323 LFSFALIVLPSISP--FASNRAESPGDFAPVRVFSRTLHNDAASRVAPDT-APGSE-APG 378
+
+Query: 216 PAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFED 275
+ P + L+ P + + T + D D + L G+S E D + D
+Sbjct: 379 PGPNTGALQERSPGSP----PGEWESQDTRALDNSTEDLDNSTLVQGNSVKELDQATLLD 434
+
+
+>sp|Q6NW59|ATF4_DANRE Cyclic AMP-dependent transcription factor ATF-4 OS=Danio
+ rerio GN=atf4 PE=2 SV=1
+ Length = 339
+
+ Score = 118 (46.6 bits), Expect = 0.00032, P = 0.00032
+ Identities = 31/138 (22%), Positives = 69/138 (50%)
+
+Query: 18 TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK 77
+ TP E + S +D+ ++ V + +P+ + K + + P L R +
+Sbjct: 204 TPKEEQNISDCSDSDSGIS---VSGSPAHQSDLEPSSRAKPYSRPDPEASPALKGRVKTS 260
+
+Query: 78 TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN 137
+ + K +++++++ +N+ AA R++KR+E E L +E ++E++N+ L ++ + E
+Sbjct: 261 SGAPKVEKKLKKMEQNKTAATRYRQKKRVEQESLNSECSELEKKNRELSEKADSLSREIQ 320
+
+Query: 138 RLSQQLAQL-AAEVRGSR 154
+ L L ++ A+ R S+
+Sbjct: 321 YLRDLLEEMRTAKQRKSK 338
+
+
+>sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Rattus norvegicus GN=Xbp1 PE=2
+ SV=1
+ Length = 267
+
+ Score = 116 (45.9 bits), Expect = 0.00032, P = 0.00032
+ Identities = 26/64 (40%), Positives = 42/64 (65%)
+
+Query: 73 RKRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ RKR + T E++ + R L+NR AAQT+R+RK+ M +LE + + +E++NQ LQ +Q
+Sbjct: 52 RKRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENQ-KLQLENQ 110
+
+Query: 132 MEAE 135
+ + E
+Sbjct: 111 LLRE 114
+
+
+>sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcription factor ATF-4 OS=Mus
+ musculus GN=Atf4 PE=1 SV=1
+ Length = 349
+
+ Score = 118 (46.6 bits), Expect = 0.00034, P = 0.00034
+ Identities = 42/148 (28%), Positives = 69/148 (46%)
+
+Query: 18 TPASEVPVLTVSPADTSLNSAD--VKTQEVKPEE-KKPAKKRKSWGQELPVPKTNLPP-- 72
+ TP+ + +SP ++ L S T P+ P R S P PK PP
+Sbjct: 212 TPSDNDSGICMSP-ESYLGSPQHSPSTSRAPPDNLPSPGGSRGS-----PRPKPYDPPGV 265
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM 132
+ AK + EK ++++++ +N+ AA R++KR E E L E ++E++N+ L ++ +
+Sbjct: 266 SLTAKVKTEKLDKKLKKMEQNKTAATRYRQKKRAEQEALTGECKELEKKNEALKEKADSL 325
+
+Query: 133 EAENNRLSQQLAQLAAEVRGSRANTPMP 160
+ E Q L L EVR +R +P
+Sbjct: 326 AKE----IQYLKDLIEEVRKARGQKRVP 349
+
+
+>sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcription factor ATF-4 OS=Homo
+ sapiens GN=ATF4 PE=1 SV=3
+ Length = 351
+
+ Score = 117 (46.2 bits), Expect = 0.00044, P = 0.00044
+ Identities = 31/98 (31%), Positives = 53/98 (54%)
+
+Query: 66 PKTNLPPRKR---AKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQN 122
+ PK PP ++ AK + EK ++++++ +N+ AA R++KR E E L E ++E++N
+Sbjct: 258 PKPYDPPGEKMVAAKVKGEKLDKKLKKMEQNKTAATRYRQKKRAEQEALTGECKELEKKN 317
+
+Query: 123 QFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP 160
+ + L +R + E Q L L EVR +R +P
+Sbjct: 318 EALKERADSLAKE----IQYLKDLIEEVRKARGKKRVP 351
+
+
+>sp|O35284|BATF_MOUSE Basic leucine zipper transcriptional factor ATF-like
+ OS=Mus musculus GN=Batf PE=2 SV=1
+ Length = 125
+
+ Score = 96 (38.9 bits), Expect = 0.00045, P = 0.00044
+ Identities = 26/90 (28%), Positives = 45/90 (50%)
+
+Query: 71 PPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLS 130
+ PP K+ ++D R+++R +NR AAQ SR+R+ + + L E +E+QN L + +
+Sbjct: 17 PPGKQDSSDDV---RKVQRREKNRIAAQKSRQRQTQKADTLHLESEDLEKQNAALRKEIK 73
+
+Query: 131 QMEAENNRLSQQLAQLAAEVRGSRANTPMP 160
+ Q+ E + L+ + TP P
+Sbjct: 74 QLTEELKYFTSVLSSHEPLCSVLASGTPSP 103
+
+
+>sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus GN=Fosb PE=2 SV=1
+ Length = 338
+
+ Score = 116 (45.9 bits), Expect = 0.00053, P = 0.00053
+ Identities = 43/151 (28%), Positives = 65/151 (43%)
+
+Query: 72 PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ PR+ T +E+E+RR+ R RN+ AA R R+R ++L+ E Q+E++ L +++
+Sbjct: 145 PREETLTPEEEEKRRVRRE-RNKLAAAKCRNRRRELTDRLQAETDQLEEEKAELESEIAE 203
+
+Query: 132 MEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPT 191
+ ++ E RL L + P PG A T K++ L P P
+Sbjct: 204 LQKEKERLEFVLVAHKPGCKIPYEEGPGPGPLAEVRDLPGSTSAKEDGFGWLLP--PPPP 261
+
+Query: 192 PSLSDYSPTLKPSTLAESSDVAQHPAVSVAG 222
+ P L S P L S + H V V G
+Sbjct: 262 PPLPFQSSRDAPPNLTAS--LFTHSEVQVLG 290
+
+
+>sp|Q90888|MAFB_CHICK Transcription factor MafB OS=Gallus gallus GN=MAFB PE=1
+ SV=1
+ Length = 311
+
+ Score = 115 (45.5 bits), Expect = 0.00059, P = 0.00059
+ Identities = 36/137 (26%), Positives = 68/137 (49%)
+
+Query: 29 SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQ-RRI 87
+ +P+ +S +S ++T + + R S Q + + L R T+DE + ++
+Sbjct: 171 TPSTSSSSSQQLQTSHQQHPPSSSVEDRFSDDQLVSMSVRELNRHLRGFTKDEVIRLKQK 230
+
+Query: 88 ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA 147
+ R L+NR AQ+ R ++ + LENEK Q+ QQ + L Q ++++ E + + +LA
+Sbjct: 231 RRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVTRLARERDAYKLKCEKLA 290
+
+Query: 148 AE-VRGSRANTPMPGSP 163
+ + R + + + P SP
+Sbjct: 291 SNGFREAGSTSDNPSSP 307
+
+
+>sp|Q90370|MAFB_COTJA Transcription factor MafB OS=Coturnix coturnix japonica
+ GN=MAFB PE=1 SV=1
+ Length = 311
+
+ Score = 115 (45.5 bits), Expect = 0.00059, P = 0.00059
+ Identities = 36/137 (26%), Positives = 68/137 (49%)
+
+Query: 29 SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQ-RRI 87
+ +P+ +S +S ++T + + R S Q + + L R T+DE + ++
+Sbjct: 171 TPSTSSSSSQQLQTSHQQHPPSSSVEDRFSDDQLVSMSVRELNRHLRGFTKDEVIRLKQK 230
+
+Query: 88 ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA 147
+ R L+NR AQ+ R ++ + LENEK Q+ QQ + L Q ++++ E + + +LA
+Sbjct: 231 RRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVTRLARERDAYKLKCEKLA 290
+
+Query: 148 AE-VRGSRANTPMPGSP 163
+ + R + + + P SP
+Sbjct: 291 SNGFREAGSTSDNPSSP 307
+
+
+>sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mus musculus GN=Xbp1 PE=2 SV=2
+ Length = 267
+
+ Score = 113 (44.8 bits), Expect = 0.00071, P = 0.00071
+ Identities = 27/79 (34%), Positives = 45/79 (56%)
+
+Query: 73 RKRAK-TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQN-------QF 124
+ RKR + T E++ + R L+NR AAQT+R+RK+ M +LE + + +E++N Q
+Sbjct: 52 RKRQRLTHLSPEEKALRRKLKNRVAAQTARDRKKARMSELEQQVVDLEEENHKLQLENQL 111
+
+Query: 125 LLQRLSQMEAENNRLSQQL 143
+ L ++ + EN L +L
+Sbjct: 112 LREKTHGLVVENQELRTRL 130
+
+
+>sp|P51145|FOSL2_RAT Fos-related antigen 2 OS=Rattus norvegicus GN=Fosl2 PE=2
+ SV=1
+ Length = 327
+
+ Score = 114 (45.2 bits), Expect = 0.00084, P = 0.00084
+ Identities = 41/158 (25%), Positives = 76/158 (48%)
+
+Query: 68 TNLPPRKRAK--TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ T + R+R + + +E+E+RRI R RN+ AA R R+R EKL+ E ++E++ L
+Sbjct: 109 TTVGRRRRDEQLSPEEEEKRRIRRE-RNKLAAAKCRNRRRELTEKLQTETEELEEEKSGL 167
+
+Query: 126 LQRLSQMEAENNRLSQQLA------QLAAEVRGSRANTPMPGSPATASPTLTPTLFKQER 179
+ + +++++ E +L L +++ E R S + + T S + P + KQE
+Sbjct: 168 QKEIAELQKEKEKLEFMLVAHGPVCKISPEERRSSPTSGVQSLRGTGS-AVGPVVVKQEP 226
+
+Query: 180 DELPLERIPFPTPSLSDYSPT-LKPSTLAESSDVAQHP 216
+ E E P + + + +KP ++A + P
+Sbjct: 227 PE---EDSPSSSAGMDKTQRSVIKPISIAGGGFYGEEP 261
+
+
+>sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-binding protein 3-like
+ protein 3 OS=Homo sapiens GN=CREB3L3 PE=1 SV=2
+ Length = 461
+
+ Score = 116 (45.9 bits), Expect = 0.00090, P = 0.00089
+ Identities = 52/180 (28%), Positives = 82/180 (45%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ +EKK K G LP T LP K +E+ ++I R +RN+ +AQ SR++K+
+Sbjct: 218 DEKKLLAKE---GITLP---TQLPLTKY----EERVLKKIRRKIRNKQSAQESRKKKKEY 267
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATAS 167
+ ++ LE QNQ L +++ +E +N L +QL +L A V S + + G+ A
+Sbjct: 268 IDGLETRMSACTAQNQELQRKVLHLEKQNLSLLEQLKKLQAIVVQSTSKSAQTGT-CVAV 326
+
+Query: 168 PTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDG 227
+ L+ L P P T S D++P S + ++ A +V G E G
+Sbjct: 327 LLLSFALIILPSIS-PFG--PNKTESPGDFAPVRVFSRTLHNDAASRVAADAVPGSEAPG 383
+
+
+>sp|A4R2R1|NST1_MAGGR Stress response protein NST1 OS=Magnaporthe grisea
+ GN=NST1 PE=3 SV=1
+ Length = 1319
+
+ Score = 121 (47.7 bits), Expect = 0.00097, P = 0.00097
+ Identities = 41/170 (24%), Positives = 85/170 (50%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK--EQRRIERVLRNRA--AAQ 98
+ Q K EE+K K+ + +E + +RA+ + E+ EQ R R + + A +
+Sbjct: 675 QRQKNEERKKKKEAQRKAEEEERQRKEAERLRRAQEQKERQAEQDRKAREAKEKEKKAKE 734
+
+Query: 99 TSRERKRLEMEKLENE-KIQMEQQNQFLLQRLSQMEAENN-RLSQQLAQLAAEVRGSRAN 156
+ +++R++ E E E + + E+ ++ L++ ++++AE R +Q+ A+ A++ + AN
+Sbjct: 735 EAKQREKAARELKEREARERKEKADKERLEKEAKIKAEKEAREAQRKAERASQKATTLAN 794
+
+Query: 157 TPMPGSPA---TASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKP 203
+ P+P PA + +P P L + ++ + ++P P+L KP
+Sbjct: 795 VPVPTGPARRQSQAPNPAPALPQSQQASVASPQLPTAVPALPKLPTPQKP 844
+
+ Score = 87 (35.7 bits), Expect = 5.1, P = 0.994
+ Identities = 26/108 (24%), Positives = 52/108 (48%)
+
+Query: 35 LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNR 94
+ L D +T++ K +++K A+KR+ + + RK A+ E+ +R E R
+Sbjct: 614 LAQEDRETEKRKAKKQKEAQKRRDKALQKKQAQAEEKARKDAEKAAEEAERLAEEQRRQE 673
+
+Query: 95 AAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ Q + ERK+ +K K + E++ + +RL + + + R ++Q
+Sbjct: 674 EQRQKNEERKK---KKEAQRKAEEEERQRKEAERLRRAQEQKERQAEQ 718
+
+
+>sp|O57342|MAFA_COTJA Transcription factor MafA OS=Coturnix coturnix japonica
+ GN=MAFA PE=1 SV=1
+ Length = 286
+
+ Score = 112 (44.5 bits), Expect = 0.0011, P = 0.0011
+ Identities = 29/85 (34%), Positives = 48/85 (56%)
+
+Query: 83 EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ +Q+R R L+NR AQ+ R ++ + LENEK Q++ Q + L Q +S++ E + ++
+Sbjct: 201 KQKR--RTLKNRGYAQSCRYKRVQQRHILENEKCQLQSQVEQLKQEVSRLAKERDLYKEK 258
+
+Query: 143 LAQLAAEVRGSRANTPMPGSPATAS 167
+ +LAA RG T P +P T +
+Sbjct: 259 YEKLAA--RGFPRETSPPAAPKTTA 281
+
+
+>sp|O60675|MAFK_HUMAN Transcription factor MafK OS=Homo sapiens GN=MAFK PE=1
+ SV=1
+ Length = 156
+
+ Score = 103 (41.3 bits), Expect = 0.0012, P = 0.0012
+ Identities = 42/159 (26%), Positives = 73/159 (45%)
+
+Query: 47 PEEKKPAKKRKSWGQELPVPKTN---------LPPRKRAKTEDEK---EQRRIERVLRNR 94
+ P+ K K +K G+ PV + L R T++E +QRR R L+NR
+Sbjct: 5 PKPNKALKVKKEAGENAPVLSDDELVSMSVRELNQHLRGLTKEEVTRLKQRR--RTLKNR 62
+
+Query: 95 AAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ A + R ++ + E+LE ++++++Q+ + L + S M E + L + L R +
+Sbjct: 63 GYAASCRIKRVTQKEELERQRVELQQEVEKLARENSSMRLELDALRSKYEALQTFAR-TV 121
+
+Query: 155 ANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPS 193
+ A P+ +P+ + T T+ K EL +PF S
+Sbjct: 122 ARGPV--APSKVATTSVITIVKST--ELSSTSVPFSAAS 156
+
+
+>sp|P15407|FOSL1_HUMAN Fos-related antigen 1 OS=Homo sapiens GN=FOSL1 PE=1 SV=1
+ Length = 271
+
+ Score = 111 (44.1 bits), Expect = 0.0012, P = 0.0012
+ Identities = 54/184 (29%), Positives = 88/184 (47%)
+
+Query: 64 PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRL------EMEKLENEKIQ 117
+ P P P ++ E+E E+RR+ R AAA+ RK L E +KLE+EK
+Sbjct: 88 PPPGVRRRPCEQISPEEE-ERRRVRRERNKLAAAKCRNRRKELTDFLQAETDKLEDEKSG 146
+
+Query: 118 MEQQNQFLLQRLSQMEA--ENNRLSQQLAQLAAEV-RGSRANTPMPGSPATASP--TLTP 172
+ ++++ + L ++ ++E E +R ++ + A E GS + T P +P P +L+P
+Sbjct: 147 LQREIEELQKQKERLELVLEAHRPICKIPEGAKEGDTGSTSGTSSPPAPCRPVPCISLSP 206
+
+Query: 173 -TLFKQERDELPLERIPFPTPSLSDYSPTLK---PSTLAESSDVAQHPAVSVAGLEGDGS 228
+ + + E P TPSL+ ++P+L PST E A + S +G D S
+Sbjct: 207 GPVLEPEALHTPTL---MTTPSLTPFTPSLVFTYPST-PEPCASAHRKSSSSSG---DPS 259
+
+Query: 229 ALPL 232
+ + PL
+Sbjct: 260 SDPL 263
+
+
+>sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-binding protein 3-like
+ protein 3 OS=Rattus norvegicus GN=Creb3l3 PE=2 SV=1
+ Length = 470
+
+ Score = 115 (45.5 bits), Expect = 0.0014, Sum P(2) = 0.0014
+ Identities = 38/115 (33%), Positives = 59/115 (51%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ +EKK K G LP T LP K +E+ ++I R +RN+ +AQ SR++K+
+Sbjct: 214 DEKKLLAKE---GVTLP---TQLPLTKY----EERVLKKIRRKIRNKQSAQESRKKKKEY 263
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS 162
+ ++ LEN QNQ L +++ +E +N L +QL L A V S + G+
+Sbjct: 264 IDGLENRMSACTAQNQELQRKVLHLEKQNLSLLEQLKHLQALVVQSTSKPAHAGT 318
+
+ Score = 40 (19.1 bits), Expect = 0.0014, Sum P(2) = 0.0014
+ Identities = 11/42 (26%), Positives = 19/42 (45%)
+
+Query: 15 LPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKR 56
+ LP+T E P V + +++ T + PEE+ + R
+Sbjct: 130 LPSTACPEPPRTQVHESSVAIDLDMWSTDTLYPEEQAGSPSR 171
+
+
+>sp|Q03173|ENAH_MOUSE Protein enabled homolog OS=Mus musculus GN=Enah PE=1 SV=2
+ Length = 802
+
+ Score = 117 (46.2 bits), Expect = 0.0015, P = 0.0015
+ Identities = 57/225 (25%), Positives = 97/225 (43%)
+
+Query: 9 MSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQE-LPVPK 67
+ M +++ L + A++ V T + T+L + + PA+ + QE L + +
+Sbjct: 105 MHALEVLNSQEAAQSKV-TATQDSTNLRCIFCGPTLPRQNSQLPAQVQNGPSQEELEIQR 163
+
+Query: 68 TNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQ 127
+ L ++R K E E+E+ ER+ R R + ER+RLE E+LE ++ + E + +
+Sbjct: 164 RQLQEQQRQK-ELERERMERERLERERLERERL-ERERLEQEQLERQRQEREHVERLERE 221
+
+Query: 128 RLSQMEAENN-RLSQQLAQLAAEV----RGSRANTPMPGSPATASPTLTPTLFKQERDEL 182
+ RL ++E E R ++L QL E R R + P S ++ S P +
+Sbjct: 222 RLERLERERQERERERLEQLEREQVEWERERRMSNAAPSSDSSLSSAPLPEYSSCQPPSA 281
+
+Query: 183 P----LERIPFPTPSLS-DYSP-TLKPSTLAESSDVAQHPAVSVA 221
+ P + I P + DY+ T P T + +H A A
+Sbjct: 282 PPPSYAKVISAPVSDATPDYAVVTALPPTSTPPTPPLRHAATRFA 326
+
+
+>sp|P53539|FOSB_HUMAN Protein fosB OS=Homo sapiens GN=FOSB PE=1 SV=1
+ Length = 338
+
+ Score = 112 (44.5 bits), Expect = 0.0015, P = 0.0015
+ Identities = 42/151 (27%), Positives = 64/151 (42%)
+
+Query: 72 PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ PR+ T +E+E+RR+ R RN+ AA R R+R ++L+ E Q+E++ L +++
+Sbjct: 145 PREETLTPEEEEKRRVRRE-RNKLAAAKCRNRRRELTDRLQAETDQLEEEKAELESEIAE 203
+
+Query: 132 MEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPT 191
+ ++ E RL L + P PG P L P + D P P
+Sbjct: 204 LQKEKERLEFVLVAHKPGCKIPYEEGPGPG-PLAEVRDL-PGSAPAKEDGFSWLLPPPPP 261
+
+Query: 192 PSLSDYSPTLKPSTLAESSDVAQHPAVSVAG 222
+ P L + P L S + H V V G
+Sbjct: 262 PPLPFQTSQDAPPNLTAS--LFTHSEVQVLG 290
+
+
+>sp|Q2VZV0|IF2_MAGSA Translation initiation factor IF-2 OS=Magnetospirillum
+ magneticum (strain AMB-1 / ATCC 700264) GN=infB PE=3 SV=1
+ Length = 872
+
+ Score = 117 (46.2 bits), Expect = 0.0016, P = 0.0016
+ Identities = 36/107 (33%), Positives = 57/107 (53%)
+
+Query: 16 PATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR 75
+ P PA PV +PA + +T+E + EE++ AKKR + + PV +T P R+
+Sbjct: 188 PVAPAQPKPVAAAAPAGDATAVPRARTEEEEEEEER-AKKRAAAHKPAPVKRTE-PRRRT 245
+
+Query: 76 AK---TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME 119
+ K T+ + R ER R+ AA + +RER+RL+ + +EK+ E
+Sbjct: 246 GKLTITDALTDDDRSERG-RSLAAVKRARERERLKHMQKGSEKVIRE 291
+
+
+>sp|Q61827|MAFK_MOUSE Transcription factor MafK OS=Mus musculus GN=Mafk PE=2
+ SV=1
+ Length = 156
+
+ Score = 102 (41.0 bits), Expect = 0.0017, P = 0.0017
+ Identities = 42/159 (26%), Positives = 72/159 (45%)
+
+Query: 47 PEEKKPAKKRKSWGQELPVPKTN---------LPPRKRAKTEDEK---EQRRIERVLRNR 94
+ P+ K K +K G+ PV + L R T++E +QRR R L+NR
+Sbjct: 5 PKPNKALKVKKEAGENAPVLSDDELVSMSVRELNQHLRGLTKEEVTRLKQRR--RTLKNR 62
+
+Query: 95 AAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ A + R ++ + E+LE ++++++Q+ + L + S M E + L + L R +
+Sbjct: 63 GYAASCRIKRVTQKEELERQRVELQQEVEKLARENSSMRLELDALRSKYEALQTFAR-TV 121
+
+Query: 155 ANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPS 193
+ A P+ +P + T T+ K EL +PF S
+Sbjct: 122 ARGPV--TPTKVATTSVITIVKSA--ELSSTSVPFSAAS 156
+
+
+>sp|P29747|CREBA_DROME Cyclic AMP response element-binding protein A
+ OS=Drosophila melanogaster GN=CrebA PE=1 SV=2
+ Length = 516
+
+ Score = 117 (46.2 bits), Expect = 0.0018, Sum P(2) = 0.0018
+ Identities = 45/147 (30%), Positives = 72/147 (48%)
+
+Query: 8 TMSSVDSLPATPASEVPVLTVS--PADTSLNSADVK--TQEVKPEEKKPAKKRKSWGQEL 63
+ T SS S A+ +S +T + P T L S+ K T + E++ KR +
+Sbjct: 370 TRSSSGSASASGSSTSSTVTTTRQPIHTPLISSQPKGSTGTLLLTEEE---KRTLLAEGY 426
+
+Query: 64 PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQ 123
+ P+P+ LP K +EK ++I R ++N+ +AQ SR +K+ M++LE + +N
+Sbjct: 427 PIPQ-KLPLTKA----EEKSLKKIRRKIKNKISAQESRRKKKEYMDQLERRVEILVTENH 481
+
+Query: 124 FLLQRLSQMEAENNRLSQQLAQLAAEV 150
+ +RL +E N L QL +L A V
+Sbjct: 482 DYKKRLEGLEETNANLLSQLHKLQALV 508
+
+ Score = 38 (18.4 bits), Expect = 0.0018, Sum P(2) = 0.0018
+ Identities = 8/12 (66%), Positives = 9/12 (75%)
+
+Query: 10 SSVDSLPATPAS 21
+ S VDSLP +P S
+Sbjct: 71 SDVDSLPDSPKS 82
+
+
+>sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocricetus auratus GN=FOS PE=3
+ SV=1
+ Length = 381
+
+ Score = 112 (44.5 bits), Expect = 0.0019, P = 0.0019
+ Identities = 54/176 (30%), Positives = 74/176 (42%)
+
+Query: 74 KRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ +R K E +E+E+RRI R RN+ AA R R+R + L+ E Q+E + L +
+Sbjct: 125 RRGKVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEI 183
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LP 183
+ + + E +L LA + + P AS LT P E +E LP
+Sbjct: 184 ANLLKEKEKLEFILAAHRPACK-IPDDLGFPEEMFVASLDLTGGLPEATTPESEEAFSLP 242
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS-VAGLEGDGSALPLFDL-GS 237
+ L P P PSL AE D PA S +G E ++P DL GS
+Sbjct: 243 LLNDPEPKPSLEPVKSISNVELKAEPFDDFLFPASSRPSGSETTARSVPDMDLSGS 298
+
+
+>sp|Q9TUB3|FOSB_CANFA Protein fosB OS=Canis familiaris GN=FOSB PE=3 SV=1
+ Length = 338
+
+ Score = 111 (44.1 bits), Expect = 0.0019, P = 0.0019
+ Identities = 37/141 (26%), Positives = 60/141 (42%)
+
+Query: 72 PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ PR+ T +E+E+RR+ R RN+ AA R R+R ++L+ E Q+E++ L +++
+Sbjct: 145 PREETLTPEEEEKRRVRRE-RNKLAAAKCRNRRRELTDRLQAETDQLEEEKAELESEIAE 203
+
+Query: 132 MEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDEL---PLERIP 188
+ ++ E RL L + P PG A K++ P P
+Sbjct: 204 LQKEKERLEFVLVAHKPGCKIPYEEGPGPGPLAEVRDLPGSASTKEDGFSWLLPPPPAPP 263
+
+Query: 189 FPTPSLSDYSPTLKPSTLAES 209
+ P + D +P L S S
+Sbjct: 264 LPFQTSQDAAPNLTASLFTHS 284
+
+
+>sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive element-binding protein 3-like
+ protein 4 OS=Homo sapiens GN=CREB3L4 PE=1 SV=1
+ Length = 395
+
+ Score = 112 (44.5 bits), Expect = 0.0020, P = 0.0020
+ Identities = 30/94 (31%), Positives = 55/94 (58%)
+
+Query: 54 KKRKSWGQE-LPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE 112
+ ++++ GQE + +P ++LP K +E+ +++ R +RN+ +AQ SR RK+ ++ LE
+Sbjct: 192 EEKRLLGQEGVSLP-SHLPLTKA----EERVLKKVRRKIRNKQSAQDSRRRKKEYIDGLE 246
+
+Query: 113 NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL 146
+ + QNQ L +++ ++E N L QL QL
+Sbjct: 247 SRVAACSAQNQELQKKVQELERHNISLVAQLRQL 280
+
+
+>sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive element-binding protein 3-like
+ protein 4 OS=Macaca fascicularis GN=CREB3L4 PE=2 SV=1
+ Length = 395
+
+ Score = 112 (44.5 bits), Expect = 0.0020, P = 0.0020
+ Identities = 30/94 (31%), Positives = 55/94 (58%)
+
+Query: 54 KKRKSWGQE-LPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLE 112
+ ++++ GQE + +P ++LP K +E+ +++ R +RN+ +AQ SR RK+ ++ LE
+Sbjct: 192 EEKRLLGQEGVSLP-SHLPLTKA----EERVLKKVRRKIRNKQSAQDSRRRKKEYIDGLE 246
+
+Query: 113 NEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL 146
+ + QNQ L +++ ++E N L QL QL
+Sbjct: 247 SRVAACSAQNQELQKKVQELERHNISLVAQLRQL 280
+
+
+>sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcription factor ATF-4 OS=Rattus
+ norvegicus GN=Atf4 PE=1 SV=1
+ Length = 347
+
+ Score = 111 (44.1 bits), Expect = 0.0020, P = 0.0020
+ Identities = 30/97 (30%), Positives = 51/97 (52%)
+
+Query: 66 PKTNLPP--RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQ 123
+ PK PP AK + EK ++++++ +N+ AA R++KR E E L E ++E++N+
+Sbjct: 255 PKPYDPPGVSVTAKVKTEKLDKKLKKMEQNKTAATRYRQKKRAEQEALTGECKELEKKNE 314
+
+Query: 124 FLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP 160
+ L ++ + E Q L L EVR +R +P
+Sbjct: 315 ALKEKADSLAKE----IQYLKDLIEEVRKARGKKRVP 347
+
+
+>sp|P79702|FOS_CYPCA Proto-oncogene c-Fos OS=Cyprinus carpio GN=fos PE=2 SV=1
+ Length = 347
+
+ Score = 111 (44.1 bits), Expect = 0.0020, P = 0.0020
+ Identities = 58/256 (22%), Positives = 109/256 (42%)
+
+Query: 6 EKTMSSVDSLPATPA-SEVPVLT--VSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQE 62
+ E ++SS +P A S P L V P +S+ ++ + P P K + G +
+Sbjct: 39 ELSVSSASFVPTVTAISSCPDLQWMVQPMVSSVAPSNGGARSYNPN---PYPKMRVTGTK 95
+
+Query: 63 LPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQN 122
+ P +N R + +E+E++R+ R RN+ AA R R+R + L+ E ++E +
+Sbjct: 96 SP--NSNKRARAEQLSPEEEEKKRVRRE-RNKMAAAKCRNRRRELTDTLQAETDELEDEK 152
+
+Query: 123 QFLLQRLSQMEAENNRLSQQLAQLAAEVR-GSRANTPMPGSPATASPTLTPTLFKQERDE 181
+ L ++ + E RL LA + S + +P+P + ++T ++
+Sbjct: 153 SALQNDIANLLKEKERLEFILAAHKPICKIPSSSVSPIPAASVPEIHSITTSVVSTANAP 212
+
+Query: 182 LPLERIP--FP-TPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSD 238
+ + F T S + T++ S L + + + ++ A LE ++P DL S
+Sbjct: 213 VTTSSSSSLFSSTASTDSFGSTVEISDLEPTLEESLE-LLAKAELE-TARSVPDVDLSSS 270
+
+Query: 239 LKHHSTDDVAAPLSDD 254
+ L + + P ++D
+Sbjct: 271 LYARDWESLYTPANND 286
+
+
+>sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Homo sapiens GN=ENAH PE=1 SV=2
+ Length = 591
+
+ Score = 114 (45.2 bits), Expect = 0.0021, P = 0.0021
+ Identities = 35/112 (31%), Positives = 57/112 (50%)
+
+Query: 35 LNSADVKTQEVKPEEKKPAKKRKSWGQE-LPVPKTNLPPRKRAKTEDEKEQRRIERVLRN 93
+ LNS + + + PA+ + QE L + + L ++R K E E+ R+ER
+Sbjct: 111 LNSQETGPTLPRQNSQLPAQVQNGPSQEELEIQRRQLQEQQRQK---ELERERLERERME 167
+
+Query: 94 RAAAQTSR-ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEA--ENNRLSQQ 142
+ R + R ER+RLE E+LE E+++ E+Q + +RL + E RL +Q
+Sbjct: 168 RERLERERLERERLERERLEQEQLERERQERERQERLERQERLERQERLERQ 219
+
+ Score = 102 (41.0 bits), Expect = 0.045, P = 0.044
+ Identities = 33/109 (30%), Positives = 55/109 (50%)
+
+Query: 37 SADVKTQEV-KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK--EQRRIERVLRN 93
+ SA + EV +E P R++ +LP N P ++ + + + EQ+R + + R
+Sbjct: 102 SAMMHALEVLNSQETGPTLPRQN--SQLPAQVQNGPSQEELEIQRRQLQEQQRQKELERE 159
+
+Query: 94 RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ R + ER+RLE E+LE E+++ E+ Q L+R Q RL +Q
+Sbjct: 160 RLERERM-ERERLERERLERERLERERLEQEQLERERQERERQERLERQ 207
+
+ Score = 96 (38.9 bits), Expect = 0.20, P = 0.19
+ Identities = 38/132 (28%), Positives = 66/132 (50%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKE-QRRIERVLRNRAAAQTSRERKRLE 107
+ E++ ++ + ++L + ++R + ++ E Q R+ER R Q +ER+RLE
+Sbjct: 177 ERERLERERLEQEQLERERQERERQERLERQERLERQERLERQERLDRERQERQERERLE 236
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNR-LSQQLAQLAAE-----VRGSRANTPMPG 161
+ +LE E+ + E+Q Q L+R Q+E E R +S A + E V G ++ PG
+Sbjct: 237 --RLERERQERERQEQ--LER-EQLEWERERRISSAAAPASVETPLNSVLGD-SSASEPG 290
+
+Query: 162 SPATASPTLTPT 173
+ A + P TP+
+Sbjct: 291 LQAASQPAETPS 302
+
+
+>sp|P47930|FOSL2_MOUSE Fos-related antigen 2 OS=Mus musculus GN=Fosl2 PE=2 SV=1
+ Length = 326
+
+ Score = 110 (43.8 bits), Expect = 0.0023, P = 0.0023
+ Identities = 41/158 (25%), Positives = 78/158 (49%)
+
+Query: 68 TNLPPRKRAK--TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ T + R+R + + +E+E+RRI R RN+ AA R R+R EKL+ E ++E++ L
+Sbjct: 108 TTVGRRRRDEQLSPEEEEKRRIRRE-RNKLAAAKCRNRRRELTEKLQAETEELEEEKSGL 166
+
+Query: 126 LQRLSQMEAENNRLS-QQLA-----QLAAEVRGSRANTPMPGSPATASPTLTPTLFKQER 179
+ + +++++ E +L ++A +++ E R S + + T S + P + KQE
+Sbjct: 167 QKEIAELQKEKEKLEFMKVAHGPVCKISPEERRSPPTSGLQSLRGTGS-AVGPVVVKQEP 225
+
+Query: 180 DELPLERIPFPTPSLSDYSPT-LKPSTLAESSDVAQHP 216
+ E E P + + + +KP ++A + P
+Sbjct: 226 PE---EDSPSSSAGMDKTQRSVIKPISIAGGGFYGEEP 260
+
+
+>sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcription factor ATF-7 OS=Pongo
+ abelii GN=ATF7 PE=2 SV=1
+ Length = 483
+
+ Score = 112 (44.5 bits), Expect = 0.0027, P = 0.0027
+ Identities = 45/153 (29%), Positives = 72/153 (47%)
+
+Query: 26 LTVSPADTSLNSADVKTQEV--KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKE 83
+ + V A T + + ++Q + P+ PA+ + S Q P P T +R +T DE
+Sbjct: 277 MVVGSASTMVTARPEQSQILIQHPDAPSPAQPQVSPAQ--PTPSTG---GRRRRTVDEDP 331
+
+Query: 84 QRRIERVL-RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ R +R L RNRAAA R++++L + LE + ++ QN L ++ + E +L Q
+Sbjct: 332 DERRQRFLERNRAAASRCRQKRKLWVSSLEKKAEELTSQNIQLSNEVTLLRNEVAQLKQL 391
+
+Query: 143 L-AQLAAEVRGSRANTP-MPGSPATAS-PTLTP 172
+ L A V + T SP +S PT +P
+Sbjct: 392 LLAHKDCPVTALQKKTQGYLESPKESSEPTGSP 424
+
+
+>sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcription factor ATF-7 OS=Homo
+ sapiens GN=ATF7 PE=1 SV=2
+ Length = 494
+
+ Score = 112 (44.5 bits), Expect = 0.0028, P = 0.0028
+ Identities = 45/153 (29%), Positives = 72/153 (47%)
+
+Query: 26 LTVSPADTSLNSADVKTQEV--KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKE 83
+ + V A T + + ++Q + P+ PA+ + S Q P P T +R +T DE
+Sbjct: 288 MVVGTASTMVTARPEQSQILIQHPDAPSPAQPQVSPAQ--PTPSTG---GRRRRTVDEDP 342
+
+Query: 84 QRRIERVL-RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ R +R L RNRAAA R++++L + LE + ++ QN L ++ + E +L Q
+Sbjct: 343 DERRQRFLERNRAAASRCRQKRKLWVSSLEKKAEELTSQNIQLSNEVTLLRNEVAQLKQL 402
+
+Query: 143 L-AQLAAEVRGSRANTP-MPGSPATAS-PTLTP 172
+ L A V + T SP +S PT +P
+Sbjct: 403 LLAHKDCPVTALQKKTQGYLESPKESSEPTGSP 435
+
+
+>sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS=Homo sapiens GN=MAFB PE=1
+ SV=2
+ Length = 323
+
+ Score = 109 (43.4 bits), Expect = 0.0030, P = 0.0030
+ Identities = 42/152 (27%), Positives = 70/152 (46%)
+
+Query: 14 SLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR 73
+ S A+PA ++P P + SA E+ R S Q + + L
+Sbjct: 174 SSAASPAQQLPTSHPGPGPHATASATAAGGNGSVED------RFSDDQLVSMSVRELNRH 227
+
+Query: 74 KRAKTEDEKEQ-RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM 132
+ R T+DE + ++ R L+NR AQ+ R ++ + LENEK Q+ QQ + L Q +S++
+Sbjct: 228 LRGFTKDEVIRLKQKRRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVSRL 287
+
+Query: 133 EAENNRLSQQLAQLA-AEVRGSRANTPMPGSP 163
+ E + + +LA + R + + + P SP
+Sbjct: 288 ARERDAYKVKCEKLANSGFREAGSTSDSPSSP 319
+
+
+>sp|Q9UQ88|CD11A_HUMAN Cell division protein kinase 11A OS=Homo sapiens
+ GN=CDK11A PE=1 SV=3
+ Length = 780
+
+ Score = 118 (46.6 bits), Expect = 0.0032, Sum P(2) = 0.0032
+ Identities = 50/173 (28%), Positives = 79/173 (45%)
+
+Query: 42 TQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR 101
+ +++ K +K K+++ W + V + RKR + E +K +R ER R A + SR
+Sbjct: 92 SRKEKVHHRKDEKRKEKW-KHARVKEREHERRKRHREEQDKARREWERQKRREMAREHSR 150
+
+Query: 102 -ERKRLEM--EKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA-QLAAEVRGSRAN- 156
+ ER RLE K E E+ EQQ + Q+ + AE R ++ +++A R R +
+Sbjct: 151 RERDRLEQLERKRERERKMREQQKEQREQKERERRAEERRKEREARREVSAHHRTMREDY 210
+
+Query: 157 -TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAE 208
+ + S + SP P +ER EL R P + +P KP+ L E
+Sbjct: 211 SDKVKASHWSRSPPRPP----RERFELGDGR----KPGEARPAPAQKPAQLKE 255
+
+ Score = 39 (18.8 bits), Expect = 0.0032, Sum P(2) = 0.0032
+ Identities = 12/45 (26%), Positives = 21/45 (46%)
+
+Query: 259 LFHGDSSVEPDSSVFED-GLAFDVLEGGDLSAFPFDSMVNFDSEP 302
+ LF G+S ++ + VF++ G + + G S P + F P
+Sbjct: 622 LFPGNSEIDQINKVFKELGTPSEKIWPG-YSELPVVKKMTFSEHP 665
+
+
+>sp|O43889|CREB3_HUMAN Cyclic AMP-responsive element-binding protein 3 OS=Homo
+ sapiens GN=CREB3 PE=1 SV=1
+ Length = 395
+
+ Score = 110 (43.8 bits), Expect = 0.0033, P = 0.0033
+ Identities = 39/129 (30%), Positives = 67/129 (51%)
+
+Query: 63 LPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQN 122
+ L +P+T LP KTE E+ +R+ R +RN+ +AQ SR +K++ + LE+ ++ QN
+Sbjct: 159 LILPET-LP---LTKTE-EQILKRVRRKIRNKRSAQESRRKKKVYVGGLESRVLKYTAQN 213
+
+Query: 123 QFLLQRLSQMEAENNRLSQQLAQLAAEV-----RGSRANTPMPGSPATASPTLTPTLFKQ 177
+ L ++ +E +N L QL +L A V + S ++T + + L P ++
+Sbjct: 214 MELQNKVQLLEEQNLSLLDQLRKLQAMVIEISNKTSSSSTCILVLLVSFCLLLVPAMYSS 273
+
+Query: 178 E-RDELPLE 185
+ + R LP E
+Sbjct: 274 DTRGSLPAE 282
+
+
+>sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcription factor ATF-4 OS=Bos
+ taurus GN=ATF4 PE=1 SV=1
+ Length = 348
+
+ Score = 109 (43.4 bits), Expect = 0.0034, P = 0.0034
+ Identities = 35/133 (26%), Positives = 65/133 (48%)
+
+Query: 19 PASEVPVLTVSPADTSLNSAD--VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR- 75
+ P+ + +SP D+SL S T P + + S G P P PP ++
+Sbjct: 210 PSDNDSGICMSP-DSSLGSPQDSPSTSRGSPNKSLLSPGALS-GSSRPKPYD--PPGEKM 265
+
+Query: 76 --AKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQME 133
+ AK + EK ++++++ +N+ AA R++KR E E L E ++E++N+ L ++ +
+Sbjct: 266 VAAKVKGEKLDKKLKKMEQNKTAATRYRQKKRAEQEALTGECKELEKKNEALKEKADSLA 325
+
+Query: 134 AENNRLSQQLAQL 146
+ E L Q+ ++
+Sbjct: 326 KEIQYLKDQIEEV 338
+
+
+>sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcription factor ATF-7 OS=Mus
+ musculus GN=Atf7 PE=1 SV=1
+ Length = 413
+
+ Score = 110 (43.8 bits), Expect = 0.0035, P = 0.0035
+ Identities = 36/121 (29%), Positives = 59/121 (48%)
+
+Query: 26 LTVSPADTSLNSADVKTQEV--KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKE 83
+ + V A T + + + Q + P+ PA+ + S Q P P T +R +T DE
+Sbjct: 277 MVVGTASTMVTARPEQNQILIQHPDAPSPAQPQVSPAQ--PTPSTG---GRRRRTVDEDP 331
+
+Query: 84 QRRIERVL-RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ R +R L RNRAAA R++++L + LE + ++ QN L ++ + E +L Q
+Sbjct: 332 DERRQRFLERNRAAASRCRQKRKLWVSSLEKKAEELTSQNIQLSNEVTLLRNEVAQLKQL 391
+
+Query: 143 L 143
+ L
+Sbjct: 392 L 392
+
+
+>sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Arabidopsis thaliana GN=GBF1
+ PE=1 SV=2
+ Length = 315
+
+ Score = 108 (43.1 bits), Expect = 0.0037, P = 0.0037
+ Identities = 30/79 (37%), Positives = 48/79 (60%)
+
+Query: 79 EDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL---LQRLS----Q 131
+ +DE+E +R +R NR +A+ SR RK+ E E+L+ + +NQ L LQRLS +
+Sbjct: 218 KDERELKRQKRKQSNRESARRSRLRKQAECEQLQQRVESLSNENQSLRDELQRLSSECDK 277
+
+Query: 132 MEAENNRLSQQLAQ-LAAE 149
+ +++ENN + +L + L AE
+Sbjct: 278 LKSENNSIQDELQRVLGAE 296
+
+ Score = 81 (33.6 bits), Expect = 3.9, P = 0.98
+ Identities = 38/127 (29%), Positives = 64/127 (50%)
+
+Query: 23 VPVLTVSPADTSLN-SADVKTQE----VKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK 77
+ VP+ V+P T+LN D+ + + VK E + +KRK +E ++ L RK+A
+Sbjct: 191 VPMKPVAPG-TNLNIGMDLWSSQAGVPVKDERELKRQKRKQSNRE-SARRSRL--RKQA- 245
+
+Query: 78 TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN 137
+ E E+ Q+R+E + + + +R E +KL++E ++ + LQR+ EA N
+Sbjct: 246 -ECEQLQQRVESLSNENQSLRDELQRLSSECDKLKSENNSIQDE----LQRVLGAEAVAN 300
+
+Query: 138 RLSQQLA 144
+ L Q A
+Sbjct: 301 -LEQNAA 306
+
+
+>sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive element-binding protein 3 OS=Bos
+ taurus GN=CREB3 PE=2 SV=2
+ Length = 368
+
+ Score = 109 (43.4 bits), Expect = 0.0038, P = 0.0038
+ Identities = 56/212 (26%), Positives = 97/212 (45%)
+
+Query: 20 ASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTE 79
+ A P+ PAD + + T+E EK+ +K G LP LP K
+Sbjct: 105 AQMTPLRVEEPADQEIARL-ILTEE----EKRLLEKE---GLTLP---GMLPLTKM---- 149
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRL 139
+ +E+ +R+ R +RN+ +AQ SR +K++ + LE+ ++ QN L ++ +E +N L
+Sbjct: 150 EEQVLKRVRRKIRNKKSAQESRRKKKVYVGGLESRVLKYTAQNLELQNKVQLLEEQNLSL 209
+
+Query: 140 SQQLAQLAAEV-----RGSRANTPMPGSPATASPTLTPTLFKQE-RDELPLER--IPFPT 191
+ QL +L A V + S ++T + + L P ++ + R LP E +
+Sbjct: 210 LDQLRRLQAMVIQTANKASSSSTCVLVLLFSFCLLLVPAMYSSDTRGSLPAEHRVLSRQL 269
+
+Query: 192 PSL-SDYSPTLKPSTL-AESSDVAQHPAVSVA 221
+ +L S+ P L+P L +E + +P + A
+Sbjct: 270 RALPSEDPPQLEPPALQSEVPKDSLNPELQAA 301
+
+
+>sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-binding protein 3-like
+ protein 4 OS=Rattus norvegicus GN=Creb3l4 PE=2 SV=1
+ Length = 367
+
+ Score = 111 (44.1 bits), Expect = 0.0038, Sum P(2) = 0.0038
+ Identities = 29/87 (33%), Positives = 50/87 (57%)
+
+Query: 60 GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME 119
+ GQE ++LP K +E+ ++I R +RN+ +AQ SR RK+ ++ LE+
+Sbjct: 170 GQEGVTLPSHLPLTKA----EERILKKIRRKIRNKQSAQDSRRRKKEYIDGLESRVAACS 225
+
+Query: 120 QQNQFLLQRLSQMEAENNRLSQQLAQL 146
+ +QNQ L +++ ++E +N L Q+ QL
+Sbjct: 226 EQNQKLQRKVQELERQNISLVAQVHQL 252
+
+ Score = 37 (18.1 bits), Expect = 0.0038, Sum P(2) = 0.0038
+ Identities = 9/18 (50%), Positives = 11/18 (61%)
+
+Query: 19 PASEVPVLTVSPADTSLN 36
+ P S+VP L S +D LN
+Sbjct: 29 PPSKVPGLQKSESDDFLN 46
+
+
+>sp|P54842|MAFB_RAT Transcription factor MafB OS=Rattus norvegicus GN=Mafb PE=1
+ SV=1
+ Length = 323
+
+ Score = 108 (43.1 bits), Expect = 0.0039, P = 0.0039
+ Identities = 41/152 (26%), Positives = 70/152 (46%)
+
+Query: 14 SLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR 73
+ S A+PA ++P P + +A E+ R S Q + + L
+Sbjct: 174 SSAASPAQQLPTSHPGPGPHAAAAATAAGSNGSVED------RFSDDQLVSMSVRELNRH 227
+
+Query: 74 KRAKTEDEKEQ-RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM 132
+ R T+DE + ++ R L+NR AQ+ R ++ + LENEK Q+ QQ + L Q +S++
+Sbjct: 228 LRGFTKDEVIRLKQKRRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVSRL 287
+
+Query: 133 EAENNRLSQQLAQLA-AEVRGSRANTPMPGSP 163
+ E + + +LA + R + + + P SP
+Sbjct: 288 ARERDAYKVKCEKLANSGFREAGSTSDSPSSP 319
+
+
+>sp|A5PKJ4|MK07_BOVIN Mitogen-activated protein kinase 7 OS=Bos taurus GN=MAPK7
+ PE=2 SV=1
+ Length = 781
+
+ Score = 113 (44.8 bits), Expect = 0.0039, P = 0.0039
+ Identities = 67/243 (27%), Positives = 94/243 (38%)
+
+Query: 3 CDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKR---KSW 59
+ C ME + P PA + LT+ P + A K + + K A K KS
+Sbjct: 429 CAMESPPPAPLPCPG-PAPDTIDLTLQPPPPASEPAPPKKEGAISDNTKAALKAALLKSL 487
+
+Query: 60 GQEL---PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKI 116
+ L P P ++ T E+++ R E+ R + A+ RE++R E E+ E
+Sbjct: 488 RSRLRDGPSAPLEAPEPRKPVTAQERQREREEKRRRRQERAK-EREKRRQERERKERGAG 546
+
+Query: 117 QMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPT-LF 175
+ + L L + ++N+R L + R +R P +PATA P P
+Sbjct: 547 VSGGPSADPLAGL--VLSDNDR---SLLE-----RWTRMAQPPAPAPATARPPSPPAGPA 596
+
+Query: 176 KQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDG--SALPLF 233
+ Q LP P P P+ P P T A S +A P V GL G S LP F
+Sbjct: 597 TQPTGPLPQPACPPPAPAAG---PAA-PQTTAASGLLAPQPLVPPPGLPGPSALSVLPYF 652
+
+Query: 234 DLG 236
+ G
+Sbjct: 653 PSG 655
+
+
+>sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus musculus GN=Fos PE=1 SV=1
+ Length = 380
+
+ Score = 109 (43.4 bits), Expect = 0.0040, P = 0.0040
+ Identities = 65/247 (26%), Positives = 101/247 (40%)
+
+Query: 2 SCDMEKTMSSVDSLPATPASEVPVL--TVSPADTSL-NSADVKTQEVKPEEKKPAKKRKS 58
+ S + T++++ + P P L +V+P+ T + + TQ + K S
+Sbjct: 57 SANFIPTVTAISTSPDLQWLVQPTLVSSVAPSQTRAPHPYGLPTQSAGAYARAGMVKTVS 116
+
+Query: 59 WGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQM 118
+ G+ + + + + +E+E+RRI R RN+ AA R R+R + L+ E Q+
+Sbjct: 117 GGRAQSIGRRG---KVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQL 172
+
+Query: 119 EQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLF 175
+ E + L ++ + E +L LA + + P + AS LT P
+Sbjct: 173 EDEKSALQTEIANLLKEKEKLEFILAAHRPACK-IPDDLGFPEEMSVASLDLTGGLPEAS 231
+
+Query: 176 KQERDE---LPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS-VAGLEGDGSALP 231
+ E +E LPL P P PSL AE D PA S +G E S +P
+Sbjct: 232 TPESEEAFTLPLLNDPEPKPSLEPVKSISNVELKAEPFDDFLFPASSRPSGSETSRS-VP 290
+
+Query: 232 LFDL-GS 237
+ DL GS
+Sbjct: 291 DVDLSGS 297
+
+
+>sp|O13024|INCEA_XENLA Inner centromere protein A OS=Xenopus laevis GN=incenp-A
+ PE=1 SV=1
+ Length = 873
+
+ Score = 113 (44.8 bits), Expect = 0.0045, P = 0.0045
+ Identities = 35/137 (25%), Positives = 65/137 (47%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR-----NRA 95
+ + +E +KK A+ ++ QE + L ++R + E EKE+ E+ L+ RA
+Sbjct: 629 REEEELERQKKIAEAKRLAEQERE--RQLLAEKERLRAEREKERIEKEKALQLQRELERA 686
+
+Query: 96 AAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA 155
+ A + ++R+ E K ++ ++EQ+ Q +++ E R +++ A +AA
+Sbjct: 687 AQEKEQQRREAEERKKREQQERLEQERLRKEQEAKRLQEEEQRKAKEQAAVAASAPVMNV 746
+
+Query: 156 NTPMPGSPATASPTLTP 172
+ M SPA S +TP
+Sbjct: 747 TVDMQNSPACESYEMTP 763
+
+ Score = 97 (39.2 bits), Expect = 0.26, P = 0.23
+ Identities = 29/86 (33%), Positives = 52/86 (60%)
+
+Query: 67 KTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENE--KIQMEQQNQF 124
+ K N P + KTE EKE++R++ LR + A+ R++K E +K + E K++ E++ +
+Sbjct: 484 KRNTPLKTDPKTE-EKERQRLD-ALRKKEEAELQRKQKIEEGKKRKQEELKVRREERLRK 541
+
+Query: 125 LLQ---RLSQMEAENNR-LSQQLAQL 146
+ +LQ R+ Q+E E + + Q+ AQ+
+Sbjct: 542 VLQARERVEQLEEEKKKKIEQKFAQI 567
+
+ Score = 85 (35.0 bits), Expect = 5.3, P = 0.995
+ Identities = 35/124 (28%), Positives = 58/124 (46%)
+
+Query: 38 ADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRA----KTEDEKEQRRIERVLRN 93
+ A K K EE + +K++ + L V + R+ K +E+E R +++
+Sbjct: 584 AKKKMTAKKQEEVECRRKQEEEARRLKVKQMEEEERRHQELLQKKREEEELERQKKIAEA 643
+
+Query: 94 RAAAQTSRERKRL-EMEKL--ENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV 150
+ + A+ RER+ L E E+L E EK ++E++ LQR ++E QQ + AE
+Sbjct: 644 KRLAEQERERQLLAEKERLRAEREKERIEKEKALQLQR--ELERAAQEKEQQRRE--AEE 699
+
+Query: 151 RGSR 154
+ R R
+Sbjct: 700 RKKR 703
+
+
+>sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS=Macaca fascicularis GN=MAFB
+ PE=2 SV=1
+ Length = 323
+
+ Score = 107 (42.7 bits), Expect = 0.0050, P = 0.0050
+ Identities = 42/152 (27%), Positives = 70/152 (46%)
+
+Query: 14 SLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR 73
+ S A+PA ++P P + SA E+ R S Q + + L
+Sbjct: 174 SSAASPAQQLPTSHPGPGPHATASATAAGGNGSVED------RFSDDQLVSMSVRELNRH 227
+
+Query: 74 KRAKTEDEKEQ-RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM 132
+ R T+DE + ++ R L+NR AQ+ R ++ + LENEK Q+ QQ + L Q +S++
+Sbjct: 228 LRGFTKDEVIRLKQKRRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVSRL 287
+
+Query: 133 EAENNRLSQQLAQLA-AEVRGSRANTPMPGSP 163
+ E + + +LA + R + + + P SP
+Sbjct: 288 ARERDAHKVKCEKLANSGFREAGSTSDSPSSP 319
+
+
+>sp|Q5KGK5|EIF3A_CRYNE Eukaryotic translation initiation factor 3 subunit A
+ OS=Cryptococcus neoformans GN=TIF32 PE=3 SV=1
+ Length = 952
+
+ Score = 113 (44.8 bits), Expect = 0.0050, P = 0.0050
+ Identities = 55/195 (28%), Positives = 78/195 (40%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ K +E K + ++ KRK +E + + ++ K E+E Q+ E RAAA
+Sbjct: 747 KIEEEKAQLREKVIKRKREEKERKLKEAREAEERKRKEEEEAAQKAEEEA---RAAAALE 803
+
+Query: 101 RERKRLEMEKLENEKIQMEQQNQFLLQRL-SQMEAENNRLSQQLAQLAAEVRGSRANTPM 159
+ E E + E E Q Q L+R+ +Q E E L ++ A+ AA G A P
+Sbjct: 804 AEAAAAEQRRAEREA-----QRQSDLERIRAQQEREEEALRRRQAEKAAATSGGSAYRP- 857
+
+Query: 160 PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDY----SPTLKPSTLAESSDVAQH 215
+ P T PT +P L R S SP PS A +S A +
+Sbjct: 858 PARAGTTPPTASPAPSSGGPSWLA-RRKAMEAQSAGGAPVASSPKPVPSNSAAASAPASN 916
+
+Query: 216 PAVSVAGLEGDGSAL 230
+ S+AG E + AL
+Sbjct: 917 GPESIAG-EAEKPAL 930
+
+
+>sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scrofa GN=FOS PE=3 SV=2
+ Length = 380
+
+ Score = 108 (43.1 bits), Expect = 0.0051, P = 0.0051
+ Identities = 51/175 (29%), Positives = 73/175 (41%)
+
+Query: 74 KRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ +R K E +E+E+RRI R RN+ AA R R+R + L+ E Q+E + L +
+Sbjct: 125 RRGKVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEI 183
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LP 183
+ + + E +L LA + + P + AS L+ P E +E LP
+Sbjct: 184 ANLLKEKEKLEFILAAHRPACK-IPDDLGFPEEMSVASLDLSGGLPEAATPESEEAFTLP 242
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GS 237
+ L P P PS+ AE D PA S G ++P DL GS
+Sbjct: 243 LLNDPEPKPSVEPVKKVSSMELKAEPFDDFLFPASSRPGGSETARSVPDMDLSGS 297
+
+
+>sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein OS=FBJ murine osteosarcoma
+ virus GN=V-FOS PE=3 SV=1
+ Length = 381
+
+ Score = 108 (43.1 bits), Expect = 0.0052, P = 0.0051
+ Identities = 55/176 (31%), Positives = 75/176 (42%)
+
+Query: 74 KRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ +R K E +E+E+RRI R RN+ AA R R+R + L+ E Q+E + L +
+Sbjct: 125 RRGKVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDKKSALQTEI 183
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LP 183
+ + + E +L LA + + P + AS LT P E +E LP
+Sbjct: 184 ANLLKEKEKLEFILAAHRPACK-IPDDLGFPEEMSVASLDLTGGLPEASTPESEEAFTLP 242
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS-VAGLEGDGSALPLFDL-GS 237
+ L P P PSL AE D PA S +G E S +P DL GS
+Sbjct: 243 LLNDPEPKPSLEPVKSISNVELKAEPFDDFLFPASSRPSGSETSRS-VPNVDLSGS 297
+
+
+>sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS=Schizosaccharomyces pombe
+ GN=pcr1 PE=1 SV=1
+ Length = 171
+
+ Score = 100 (40.3 bits), Expect = 0.0057, P = 0.0057
+ Identities = 40/163 (24%), Positives = 69/163 (42%)
+
+Query: 74 KRAKTEDEKEQRRIERVLRNRAAAQTSRERKR---LEMEKLENEKIQMEQQNQFLLQRLS 130
+ K+ + +DEK +R +ER NR AA R++K+ E+E+ N + ++ Q LL +L
+Sbjct: 4 KKKEVDDEKRRRILER---NRIAASKFRQKKKEWIKELEQTANAAFEQSKRLQLLLSQLQ 60
+
+Query: 131 Q--MEAENNRLSQQLAQLAAEVRG-----SRANTPMPGSPATASPTLTP---TLFKQERD 180
+ Q ++ L+ Q Q + ++R A+ + P P + +
+Sbjct: 61 QEAFRLKSQLLAHQGCQCSVKIRSVLTDFQTAHNALHSQHMAYRPVQPPPGDNMLESVVS 120
+
+Query: 181 ELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL 223
+ P + P + P + PS+ +SD Q S AGL
+Sbjct: 121 VSPTQMHPSLQGLPPNQHPQMPPSSQQPNSDDVQQHMFSAAGL 163
+
+
+>sp|Q90596|MAFK_CHICK Transcription factor MafK OS=Gallus gallus GN=MAFK PE=1
+ SV=1
+ Length = 156
+
+ Score = 98 (39.6 bits), Expect = 0.0062, P = 0.0062
+ Identities = 40/159 (25%), Positives = 73/159 (45%)
+
+Query: 47 PEEKKPAKKRKSWGQELPVPKTN---------LPPRKRAKTEDEK---EQRRIERVLRNR 94
+ P+ K K ++ G+ PV + L R T++E +QRR R L+NR
+Sbjct: 5 PKPNKALKVKEESGENAPVLSDDELVSMSVRELNQHLRGLTKEEVIRLKQRR--RTLKNR 62
+
+Query: 95 AAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ A + R ++ + E+LE ++++++Q+ + L + S M+ E + L + L R +
+Sbjct: 63 GYAASCRIKRVTQKEELERQRVELQQEVEKLARENSSMKLELDALRSKYEALQTFAR-TV 121
+
+Query: 155 ANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPS 193
+ A P+ +P + T T+ K E+ +PF S
+Sbjct: 122 ARGPI--TPTKVATTSVITIVKSA--EISSSSVPFSAAS 156
+
+
+>sp|Q504L8|MAFB_XENTR Transcription factor MafB OS=Xenopus tropicalis GN=mafb
+ PE=2 SV=1
+ Length = 316
+
+ Score = 106 (42.4 bits), Expect = 0.0063, P = 0.0062
+ Identities = 35/137 (25%), Positives = 66/137 (48%)
+
+Query: 29 SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQ-RRI 87
+ SP+ +S +S ++ + + + R S Q + + L R T+D+ + ++
+Sbjct: 176 SPSGSSSSSQQLQNSHQQHQNSSAVEDRFSDDQLVSMSVRELNRHLRGFTKDDVIRLKQK 235
+
+Query: 88 ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA 147
+ R L+NR AQ+ R ++ + LENEK Q+ QQ + L +S++ E + + +LA
+Sbjct: 236 RRTLKNRGYAQSCRFKRVQQKHHLENEKTQLIQQVEQLKLEVSRLARERDAYKIKCEKLA 295
+
+Query: 148 -AEVRGSRANTPMPGSP 163
+ R + + + P SP
+Sbjct: 296 NTTFREAGSTSDNPSSP 312
+
+
+>sp|Q1DQC1|PAN1_COCIM Actin cytoskeleton-regulatory complex protein PAN1
+ OS=Coccidioides immitis GN=PAN1 PE=3 SV=1
+ Length = 1485
+
+ Score = 114 (45.2 bits), Expect = 0.0065, P = 0.0065
+ Identities = 69/271 (25%), Positives = 102/271 (37%)
+
+Query: 16 PATPASEVPV-LTVS-PADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR 73
+ P P+ +V +T S A + +S + EEK+ A K++ QE + L
+Sbjct: 1009 PPPPSRKVRTDVTESVEAKKAEDSVVASKARAEQEEKERALKQEQEAQE--AERKQL--E 1064
+
+Query: 74 KRAKTEDEKEQRRIERV-LRNRAAAQTSRERKRLEME----KLENEKIQMEQQNQFLLQR 128
+ AK ++E+ R E R RA + R+ K + E K + EK E++ + QR
+Sbjct: 1065 DEAKRQEEELAREKEAAQARLRALEEQVRQGKIKKQEEKRRKQQAEKEAKEKEARLAAQR 1124
+
+Query: 129 --LSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPT---LTPTLFKQERDELP 183
+ L +A L +QL + E S P+ +P T++PT + P F Q P
+Sbjct: 1125 AELEAAQARERELQRQLENMGEEESSSDDEGPIEITPQTSTPTQSQVLPAPFPQPSP--P 1182
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHS 243
+ +P P D +PS S P E + S P F L S
+Sbjct: 1183 TAALPVPAIQEPDQDVAREPSPTLPSPVETPEPVKQTLPPETE-SRNPYF---RQLSQQS 1238
+
+Query: 244 TDDVAAPLSDDDFNRLFHGDSSVEPDS-SVF 273
+ A P + FH + E S S F
+Sbjct: 1239 APSAAQPTHEMQSTNPFHRLAQQESTSKSAF 1269
+
+
+>sp|P54841|MAFB_MOUSE Transcription factor MafB OS=Mus musculus GN=Mafb PE=1
+ SV=1
+ Length = 323
+
+ Score = 106 (42.4 bits), Expect = 0.0065, P = 0.0065
+ Identities = 41/152 (26%), Positives = 70/152 (46%)
+
+Query: 14 SLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR 73
+ S A+PA ++P P + +A E+ R S Q + + L
+Sbjct: 174 SSAASPAQQLPTSHPGPGPHATAAATAAGGNGSVED------RFSDDQLVSMSVRELNRH 227
+
+Query: 74 KRAKTEDEKEQ-RRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM 132
+ R T+DE + ++ R L+NR AQ+ R ++ + LENEK Q+ QQ + L Q +S++
+Sbjct: 228 LRGFTKDEVIRLKQKRRTLKNRGYAQSCRYKRVQQKHHLENEKTQLIQQVEQLKQEVSRL 287
+
+Query: 133 EAENNRLSQQLAQLA-AEVRGSRANTPMPGSP 163
+ E + + +LA + R + + + P SP
+Sbjct: 288 ARERDAYKVKCEKLANSGFREAGSTSDSPSSP 319
+
+
+>sp|Q5A2K0|NST1_CANAL Stress response protein NST1 OS=Candida albicans GN=NST1
+ PE=3 SV=1
+ Length = 1399
+
+ Score = 113 (44.8 bits), Expect = 0.0078, P = 0.0078
+ Identities = 42/189 (22%), Positives = 84/189 (44%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ K +E K +E++ KK ++ Q+ L +R K E+E++Q+ E+ + Q
+Sbjct: 800 KIEEQKRKEEEHRKKVEAQ-QKREAEAKKLKEERRRKAEEERKQKEEEKKQKELLKKQKE 858
+
+Query: 101 RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPM- 159
+ E+++ E+ + + E+ + ++ + +R M +++ L++Q+ +++ + AN P+
+Sbjct: 859 EEKRQKELLRKQREEEKEKEAARLEEERTKLMVNDDDELARQIEVEKSKLSAAVANNPLL 918
+
+Query: 160 -------PGS-PATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTL-AESS 210
+ PGS P T S P L + L F S P T +S
+Sbjct: 919 NHLYQPSPGSAPTTPSTANLPALSPLQSASAKLMSQQFEQQHQQQVSQEKLPQTSNIQSP 978
+
+Query: 211 DVAQHPAVS 219
+ + HP++S
+Sbjct: 979 NQQPHPSIS 987
+
+ Score = 86 (35.3 bits), Expect = 7.0, P = 0.9991
+ Identities = 28/115 (24%), Positives = 62/115 (53%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ K +E+K ++K K K Q+L K RK + + ++E++R+++ + +A +
+Sbjct: 729 KERELKKLKQKEKAKEKKRLQQLA--KEEERKRKEEELKAKEEEQRLQKE-KLKAEQKKR 785
+
+Query: 101 RERKRLEMEKLENEKIQ----MEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ +E RL+ E+ + +KI+ E++++ ++ + EAE +L ++ + A E R
+Sbjct: 786 KEEARLKKEEEKKKKIEEQKRKEEEHRKKVEAQQKREAEAKKLKEERRRKAEEER 840
+
+
+>sp|Q8VCH8|UBXN4_MOUSE UBX domain-containing protein 4 OS=Mus musculus GN=Ubxn4
+ PE=1 SV=1
+ Length = 506
+
+ Score = 108 (43.1 bits), Expect = 0.0079, P = 0.0079
+ Identities = 57/225 (25%), Positives = 92/225 (40%)
+
+Query: 19 PASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKT 78
+ P S+ L +PA + + S E + + Q T R K
+Sbjct: 146 PESKNTELCETPATSDIKSDTATGGECTGHDSHSQEPHGCSNQRPAEDLTVRVERLTKKL 205
+
+Query: 79 EDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN- 137
+ E+ +E++R E R + ER++ E L+ ++ Q E+ + +L+ S+ +AE+
+Sbjct: 206 EERREEKRKEEAQRE---IKKEIERRKTGKEMLDYKRKQEEELTKRMLEERSREKAEDRA 262
+
+Query: 138 ---RLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTP---TLFKQE---RDELPLERIP 188
+ R+ QQ+A AE R +R A A+ LT T K+E RD + RI
+Sbjct: 263 ARERIKQQIALDRAE-RAARFAKTKEAEAAKAAALLTKQAGTEVKRESTARDRSTIARIQ 321
+
+Query: 189 FPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLF 233
+ F P S ++ PS A + Q A +V G+ S +F
+Sbjct: 322 FRLPDGSSFTNQF-PSD-APLEEARQFAAQTVGNTYGNFSLATMF 364
+
+
+>sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive element-binding protein 3-like
+ protein 3-A OS=Danio rerio GN=creb3l3a PE=2 SV=1
+ Length = 428
+
+ Score = 107 (42.7 bits), Expect = 0.0080, P = 0.0079
+ Identities = 50/195 (25%), Positives = 86/195 (44%)
+
+Query: 8 TMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK 67
+ T + ++ A PA+ P LTV D L+ +V + + + + L
+Sbjct: 138 TQCASETPQAQPATGFP-LTVK--DLLLSGTPETAAKVSQQSYQELILTEDEKRLLAKEG 194
+
+Query: 68 TNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQ 127
+ LP + +E+ ++I R +RN+ +AQ SR++K+ ++ LE+ N L +
+Sbjct: 195 MTLPNQFPLTKYEERILKKIRRKIRNKQSAQESRKKKKEYIDGLESRMAACSAHNHELQR 254
+
+Query: 128 RLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERI 187
+ ++ Q+E N L +QL +L A V +N P+ L+ TL LP +
+Sbjct: 255 KVFQLEKCNISLMEQLRRLQALVMNG-SNKPVQAGTCVLVLLLSFTLIL-----LPNLK- 307
+
+Query: 188 PFPTPSLS---DYSP 199
+ PF +S D+SP
+Sbjct: 308 PFTDTKVSQHGDFSP 322
+
+
+>sp|P10158|FOSL1_RAT Fos-related antigen 1 OS=Rattus norvegicus GN=Fosl1 PE=2
+ SV=1
+ Length = 275
+
+ Score = 104 (41.7 bits), Expect = 0.0081, P = 0.0080
+ Identities = 51/185 (27%), Positives = 84/185 (45%)
+
+Query: 64 PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRL------EMEKLENEKIQ 117
+ P P P ++ E+E E+RR+ R AAA+ RK L E +KLE+EK
+Sbjct: 90 PPPGVRRRPCEQISPEEE-ERRRVRRERNKLAAAKCRNRRKELTDFLQAETDKLEDEKSG 148
+
+Query: 118 MEQQNQFLLQRLSQMEA--ENNRLSQQLAQLAAEVRGSRANTPMPGSP-ATASPTLTPTL 174
+ ++++ + L ++ ++E E +R ++ + + G ++T GSP P P +
+Sbjct: 149 LQREIEELQKQKERLELVLEAHRPICKIPEEDKKDTGGTSSTSGAGSPPGPCRPV--PCI 206
+
+Query: 175 FKQERDELPLERIPFPT----PSLSDYSPTLK---PSTLAESSDVAQHPAVSVAGLEGDG 227
+ L E + PT PSL+ ++P+L PST S + + S GD
+Sbjct: 207 SLSPGPVLEPEALHTPTLMTTPSLTPFTPSLVFTYPSTPEPCSSAHRKSSSS----SGDP 262
+
+Query: 228 SALPL 232
+ S+ PL
+Sbjct: 263 SSDPL 267
+
+
+>sp|P97875|JDP2_MOUSE Jun dimerization protein 2 OS=Mus musculus GN=Jdp2 PE=1
+ SV=2
+ Length = 163
+
+ Score = 98 (39.6 bits), Expect = 0.0081, P = 0.0081
+ Identities = 43/152 (28%), Positives = 71/152 (46%)
+
+Query: 16 PATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR 75
+ P+ A +P L P T L S+ + T+E+K + + + L V K P+
+Sbjct: 9 PSVTAGSLPGL--GPL-TGLPSSALTTEELKYADIRNIGAMIAPLHFLEV-KLGKRPQP- 63
+
+Query: 76 AKTE-DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEA 134
+ K+E DE+E+RR R +N+ AA R +K+ E L+ E ++E N L ++ +++
+Sbjct: 64 VKSELDEEEERRKRRREKNKVAAARCRNKKKERTEFLQRESERLELMNAELKTQIEELKL 123
+
+Query: 135 ENNRLSQQLAQLAAE--VRGSRANTP-MPGSP 163
+ E +L L + VR TP G+P
+Sbjct: 124 ERQQLILMLNRHRPTCIVRTDSVRTPESEGNP 155
+
+
+>sp|Q78E65|JDP2_RAT Jun dimerization protein 2 OS=Rattus norvegicus GN=Jdp2
+ PE=1 SV=1
+ Length = 163
+
+ Score = 98 (39.6 bits), Expect = 0.0081, P = 0.0081
+ Identities = 43/152 (28%), Positives = 71/152 (46%)
+
+Query: 16 PATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR 75
+ P+ A +P L P T L S+ + T+E+K + + + L V K P+
+Sbjct: 9 PSVTAGSLPGL--GPL-TGLPSSALTTEELKYADIRNIGAMIAPLHFLEV-KLGKRPQP- 63
+
+Query: 76 AKTE-DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEA 134
+ K+E DE+E+RR R +N+ AA R +K+ E L+ E ++E N L ++ +++
+Sbjct: 64 VKSELDEEEERRKRRREKNKVAAARCRNKKKERTEFLQRESERLELMNAELKTQIEELKL 123
+
+Query: 135 ENNRLSQQLAQLAAE--VRGSRANTP-MPGSP 163
+ E +L L + VR TP G+P
+Sbjct: 124 ERQQLILMLNRHRPTCIVRTDSVRTPESEGNP 155
+
+
+>sp|P15408|FOSL2_HUMAN Fos-related antigen 2 OS=Homo sapiens GN=FOSL2 PE=1 SV=1
+ Length = 326
+
+ Score = 105 (42.0 bits), Expect = 0.0086, P = 0.0085
+ Identities = 37/125 (29%), Positives = 64/125 (51%)
+
+Query: 68 TNLPPRKRAK--TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ T + R+R + + +E+E+RRI R RN+ AA R R+R EKL+ E ++E++ L
+Sbjct: 108 TTVGRRRRDEQLSPEEEEKRRIRRE-RNKLAAAKCRNRRRELTEKLQAETEELEEEKSGL 166
+
+Query: 126 LQRLSQMEAENNRLSQQLAQLAAEVRGS---RANTPMPG-SPA-TASPTLTPTLFKQERD 180
+ + +++++ E +L L + S R + P PG P + ++ + KQE
+Sbjct: 167 QKEIAELQKEKEKLEFMLVAHGPVCKISPEERRSPPAPGLQPMRSGGGSVGAVVVKQE-- 224
+
+Query: 181 ELPLE 185
+ PLE
+Sbjct: 225 --PLE 227
+
+
+>sp|O42290|MAFA_CHICK Transcription factor MafA OS=Gallus gallus GN=MAFA PE=1
+ SV=1
+ Length = 286
+
+ Score = 104 (41.7 bits), Expect = 0.0087, P = 0.0087
+ Identities = 26/79 (32%), Positives = 43/79 (54%)
+
+Query: 89 RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA 148
+ R L+NR AQ+ R ++ + LENEK Q++ Q + L Q +S++ E + ++ +LAA
+Sbjct: 205 RTLKNRGYAQSCRYKRVQQRHILENEKCQLQSQVEQLKQEVSRLAKERDLYKEKYEKLAA 264
+
+Query: 149 EVRGSRANTPMPGSPATAS 167
+ RG P +P T +
+Sbjct: 265 --RGFPREPSPPAAPKTTA 281
+
+
+>sp|A1C9M5|KAPC_ASPCL Putative transcription factor kapC OS=Aspergillus
+ clavatus GN=kapC PE=3 SV=2
+ Length = 288
+
+ Score = 103 (41.3 bits), Expect = 0.011, Sum P(2) = 0.010
+ Identities = 33/159 (20%), Positives = 67/159 (42%)
+
+Query: 66 PKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ P+ +L ++ KT ++ +R +NRAA + R+RK + LE + E +
+Sbjct: 83 PQPDLSGQESPKTYGKRPLSTSKRAAQNRAAQRAFRQRKEAHIRDLEGKVKAYETMGE-- 140
+
+Query: 126 LQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-MPGSPATASPTLTPTLFKQERDELPL 184
+ + ++AEN +L + + L + + ++ P +PG+ + P +
+Sbjct: 141 --AIKALQAENYQLREYIINLQSRLLDTQGEVPELPGNIDLSQPRGDIPVPAPPTSGTST 198
+
+Query: 185 ERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL 223
+ +P P P+ + A + D+ ++VAGL
+Sbjct: 199 SAVPVPPPTAPQQPQPAQNQASAPNDDMNSLNRIAVAGL 237
+
+ Score = 38 (18.4 bits), Expect = 0.011, Sum P(2) = 0.010
+ Identities = 8/17 (47%), Positives = 10/17 (58%)
+
+Query: 299 DSEPVTLEGIEMAHGLP 315
+ D+ +TL E HGLP
+Sbjct: 269 DASELTLPKQEPTHGLP 285
+
+
+>sp|P0C865|MK07_RAT Mitogen-activated protein kinase 7 OS=Rattus norvegicus
+ GN=Mapk7 PE=1 SV=1
+ Length = 806
+
+ Score = 109 (43.4 bits), Expect = 0.011, P = 0.011
+ Identities = 69/258 (26%), Positives = 106/258 (41%)
+
+Query: 3 CDMEKTMSSVDSLP--ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKR---K 57
+ C ME S +LP + PA + LT+ PA + A K + + K A K K
+Sbjct: 429 CAME---SPPPALPPCSGPAPDTVDLTLQPAPPASELAPPKREGAISDNTKAALKAALLK 485
+
+Query: 58 SWGQEL---PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENE 114
+ S L P P ++ T E+++ R E+ R + A+ RE++R E E+ E
+Sbjct: 486 SLRSRLRDGPSAPLEAPEPRKPVTAQERQREREEKRRRRQERAK-EREKRRQERERKERG 544
+
+Query: 115 KIQMEQQNQFLLQRLSQMEAENNR-LSQQLAQLAAEVRGSRANTPMPG-SPATASPTLTP 172
+ + + L L + ++N+R L ++ ++A + A P P P++A PT P
+Sbjct: 545 AGTLGGPSTDPLAGL--VLSDNDRSLLERWTRMARPPVPAPAPAPAPTPKPSSAQPTSPP 602
+
+Query: 173 T-LFKQERDEL-PLERIPFPT--PSLSDYSPTLKPS--------TLAESSDVAQHPAVSV 220
+ Q L P IP P P P +P+ T +S +A V
+Sbjct: 603 NGPVSQSTAPLQPAGSIPGPASQPVCPPPGPVPQPAGPVPAPLQTAPSTSLLASQSLVPP 662
+
+Query: 221 AGLEGDGS--ALPLFDLG 236
+ +GL G G+ LP F G
+Sbjct: 663 SGLPGSGAPEVLPYFPSG 680
+
+
+>sp|Q15424|SAFB1_HUMAN Scaffold attachment factor B1 OS=Homo sapiens GN=SAFB
+ PE=1 SV=4
+ Length = 915
+
+ Score = 109 (43.4 bits), Expect = 0.013, P = 0.013
+ Identities = 32/95 (33%), Positives = 52/95 (54%)
+
+Query: 50 KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-ERKRLEM 108
+ K+P K R S ++ R +A+ E E E+ R+E + R R A Q R ER+R+E
+Sbjct: 609 KEPRKSRDSESHSRVRERSEREQRMQAQWERE-ERERLE-IARERLAFQRQRLERERMER 666
+
+Query: 109 EKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQL 143
+ E+LE E++ +E + + +R+ + E E R Q+L
+Sbjct: 667 ERLERERMHVEHERRREQERIHR-EREELRRQQEL 700
+
+
+>sp|O60841|IF2P_HUMAN Eukaryotic translation initiation factor 5B OS=Homo
+ sapiens GN=EIF5B PE=1 SV=4
+ Length = 1220
+
+ Score = 110 (43.8 bits), Expect = 0.014, P = 0.014
+ Identities = 60/257 (23%), Positives = 109/257 (42%)
+
+Query: 7 KTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPE--EKKPAKKRKSWGQELP 64
+ K+ +VD+ PASE T + A+ N D K ++ K + EK+ +K K G
+Sbjct: 282 KSKVTVDT-GVIPASEEKAETPTAAEDD-NEGDKKKKDKKKKKGEKEEKEKEKKKGPSKA 339
+
+Query: 65 VPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQF 124
+ K + K E+E+++R E R E KR E E+LE EK + ++Q +
+Sbjct: 340 TVKAMQEALAKLKEEEERQKREEEE----RIKRLEELEAKRKEEERLEQEKRERKKQKE- 394
+
+Query: 125 LLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPL 184
+ +R +++ E L++ +Q A R + A + + P+ +D LP
+Sbjct: 395 -KERKERLKKEGKLLTK--SQREARAR-AEATLKLLQAQGVEVPS---------KDSLPK 441
+
+Query: 185 ERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL-EGDGSALPLF-DLGSDLKHH 242
+ +R + L+ ++ES ++ V G+ E + + P+ + D +
+Sbjct: 442 KRPIYEDKKRKKIPQQLESKEVSESMELCAAVEVMEQGVPEKEETPPPVEPEEEEDTEDA 501
+
+Query: 243 STDDVAAPLSDDDFNRL 259
+ DD A SD++ ++
+Sbjct: 502 GLDDWEAMASDEETEKV 518
+
+
+>sp|Q5RDE1|IF2P_PONAB Eukaryotic translation initiation factor 5B OS=Pongo
+ abelii GN=EIF5B PE=2 SV=2
+ Length = 1220
+
+ Score = 110 (43.8 bits), Expect = 0.014, P = 0.014
+ Identities = 61/260 (23%), Positives = 110/260 (42%)
+
+Query: 6 EKTMSSVDSLPA--TPASEVPVLTVSPADTSLNSADVKTQEVKPE--EKKPAKKRKSWGQ 61
+ E+T+ S +L PASE T + A+ N D K ++ K + EK+ +K K G
+Sbjct: 278 EETVKSKVTLDTGVIPASEEKAETPTAAEDD-NEGDKKKKDKKKKKGEKEEKEKEKKKGP 336
+
+Query: 62 ELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ 121
+ K + K E+E+++R E R E KR E E+LE EK + ++Q
+Sbjct: 337 SKATVKAMQEALAKLKEEEERQKREEEE----RIKRLEELEAKRKEEERLEQEKRERKKQ 392
+
+Query: 122 NQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDE 181
+ + +R +++ E L++ +Q A R + A + + P+ +D
+Sbjct: 393 KE--KERKERLKKEGKLLTK--SQREARAR-AEATLKLLQAQGVEVPS---------KDS 438
+
+Query: 182 LPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL-EGDGSALPLF-DLGSDL 239
+ LP +R + L+ ++ES ++ V G+ E + + P+ + D
+Sbjct: 439 LPKKRPIYEDKKRKKIPQQLESKEVSESMELCAAVEVMEQGVPEKEETPPPVEPEEEEDT 498
+
+Query: 240 KHHSTDDVAAPLSDDDFNRL 259
+ + DD A SD++ ++
+Sbjct: 499 EDAGLDDWEAMASDEETEKV 518
+
+
+>sp|Q9M7Q3|AI5L6_ARATH ABSCISIC ACID-INSENSITIVE 5-like protein 6
+ OS=Arabidopsis thaliana GN=ABF3 PE=1 SV=1
+ Length = 454
+
+ Score = 105 (42.0 bits), Expect = 0.015, P = 0.014
+ Identities = 47/145 (32%), Positives = 72/145 (49%)
+
+Query: 14 SLPATPASEV-P-VLTVS--PADTSLNSA-DVKT----QEVKP-EEKKPAKKRKS-WGQE 62
+ S PAT EV P +L + P + +L A D KT V P + P KS
+Sbjct: 291 SQPATQCQEVKPSILGIHNHPMNNNLLQAVDFKTGVTVAAVSPGSQMSPDLTPKSALDAS 350
+
+Query: 63 L-PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ 121
+ L PVP RK ++ +RR +R+++NR +A SR RK+ +LE E Q+++
+Sbjct: 351 LSPVPYMFGRVRKTGAVLEKVIERRQKRMIKNRESAARSRARKQAYTMELEAEIAQLKEL 410
+
+Query: 122 NQFLLQRLSQ-MEAENNRLSQQLAQ 145
+ N+ L ++ + ME + N+L + L Q
+Sbjct: 411 NEELQKKQVEIMEKQKNQLLEPLRQ 435
+
+
+>sp|A9V549|EIF3A_MONBE Eukaryotic translation initiation factor 3 subunit A
+ OS=Monosiga brevicollis GN=33388 PE=3 SV=1
+ Length = 1052
+
+ Score = 109 (43.4 bits), Expect = 0.016, P = 0.015
+ Identities = 41/140 (29%), Positives = 65/140 (46%)
+
+Query: 39 DVKTQEVKPEEKKP-AKKRKSWGQELPVPKTNLPPRKRAKTEDEK------EQRRI--ER 89
+ D +E E +K K + Q + K L +R + +EK EQRRI E
+Sbjct: 764 DAYIEEKTAERRKEYMAKLDDFKQRMQEQKIRLEREERERKREEKRRAEEEEQRRIKQEE 823
+
+Query: 90 VLRNRAAAQTSRERKRLEMEKLEN-EKIQMEQQNQFLLQRLSQMEA-ENNRLSQQLAQLA 147
+ R + + RE++R E KLE E+ +ME+ + QR Q+ A E +LS AQ +
+Sbjct: 824 EDRKQREREAKREQERQEQLKLEEAERKKMEEATKLQRQREEQVRAREQEKLSNLSAQTS 883
+
+Query: 148 AEV--RGSRANTPMPGSPAT 165
+ R +R++ P +P++
+Sbjct: 884 QPTWKRSARSDAPTTAAPSS 903
+
+ Score = 90 (36.7 bits), Expect = 1.9, P = 0.85
+ Identities = 35/141 (24%), Positives = 63/141 (44%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEM 108
+ E+K A++RK + +L K + +K +E+E++R E+ RA + R K+ E
+Sbjct: 768 EEKTAERRKEYMAKLDDFKQRMQEQKIRLEREERERKREEK---RRAEEEEQRRIKQEEE 824
+
+Query: 109 EKLENEK-IQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATAS 167
+ ++ + E+ + EQ+ Q ++L EAE ++ + RA S +A
+Sbjct: 825 DRKQREREAKREQERQ---EQLKLEEAERKKMEEATKLQRQREEQVRAREQEKLSNLSAQ 881
+
+Query: 168 PTLTPTLFKQERDELPLERIP 188
+ T PT + R + P P
+Sbjct: 882 -TSQPTWKRSARSDAPTTAAP 901
+
+
+>sp|Q9UKV3|ACINU_HUMAN Apoptotic chromatin condensation inducer in the nucleus
+ OS=Homo sapiens GN=ACIN1 PE=1 SV=1
+ Length = 1341
+
+ Score = 110 (43.8 bits), Expect = 0.016, P = 0.016
+ Identities = 53/190 (27%), Positives = 88/190 (46%)
+
+Query: 46 KPEEKKPAKKRKSWGQELP--VPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-E 102
+ K E K+ K G+E+P P+ + R + ++++++ R R R++ A+ S
+Sbjct: 294 KSREAPILKEFKEEGEEIPRVKPEEMMDERPKTRSQEQEVLERGGRFTRSQEEARKSHLA 353
+
+Query: 103 RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN--RLSQ--QLAQLAA--EVRGSRAN 156
+ R++ E E ++ E++ Q L + + RL++ + A L A E S
+Sbjct: 354 RQQQEKEMKTTSPLEEEEREIKSSQGLKEKSKSPSPPRLTEDRKKASLVALPEQTASEEE 413
+
+Query: 157 TPMPG-SPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSD--VA 213
+ TP P + +SP P L +E E P+E P P P L SP P+T A++ + V+
+Sbjct: 414 TPPPLLTKEASSPPPHPQLHSEEEIE-PMEG-PAP-PVLIQLSP---PNTDADTRELLVS 467
+
+Query: 214 QHPAVSVAGL 223
+ QH V GL
+Sbjct: 468 QHTVQLVGGL 477
+
+
+>sp|Q63ZM7|STABP_XENLA STAM-binding protein-like OS=Xenopus laevis GN=stambp
+ PE=2 SV=1
+ Length = 416
+
+ Score = 104 (41.7 bits), Expect = 0.017, P = 0.016
+ Identities = 52/179 (29%), Positives = 77/179 (43%)
+
+Query: 39 DVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR---KRAKTEDEK---EQRRIERVLR 92
+ D KT V PE+K+ KK K E+ PK + KR K E E+ +QR+ E
+Sbjct: 79 DYKTANV-PEKKETLKKLK----EIAFPKAEELKKELHKRYKKEYEEYSEKQRKEEEERA 133
+
+Query: 93 NRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL-LQRLSQMEAENNRLSQQLAQLAAEVR 151
+ R A Q + ++ + L+ ++ Q EQ F + R ++EAE R+ Q ++ E
+Sbjct: 134 RRLALQQQLDAEKQRVALLKQQQEQQEQVQAFEEMMRRKELEAERLRILHQFSK--DEPE 191
+
+Query: 152 GSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS 210
+ +P+ P P +TP L P P P D S LKPS+ +S
+Sbjct: 192 AEPLGSPL--IPGMNEPPVTPLL--------PSYGTVQPHPPAVDRS--LKPSSYGSNS 238
+
+
+>sp|Q4QRL3|CC88B_MOUSE Coiled-coil domain-containing protein 88B OS=Mus
+ musculus GN=Ccdc88b PE=1 SV=2
+ Length = 1481
+
+ Score = 110 (43.8 bits), Expect = 0.018, P = 0.018
+ Identities = 49/182 (26%), Positives = 76/182 (41%)
+
+Query: 6 EKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPV 65
+ EK +DS E + + +T SA K E+ EE + ++R L
+Sbjct: 281 EKAEQLLDSQAEVQGLEAEIRRLRQ-ETQALSAQAKRAELYREEAEALRERAGRLPRLQE 339
+
+Query: 66 PKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ + +A E K Q ERVL A ++LE+ + + ++ Q+ L
+Sbjct: 340 ELRRCREKLQA-AEVFKGQLEEERVLSEALEASKVLLEEQLEVARERSARLHETQRENLL 398
+
+Query: 126 LQ-RLSQMEAENNRLSQQLAQLAAE-----VRGSRANTPMPGSPATAS-PTLTPTLFKQE 178
+ L+ RL + A+ + L QL QL E + R+ P PGSP AS P P+L +
+Sbjct: 399 LRTRLGEAHADLDSLRHQLEQLVEENVELELELQRSLEPPPGSPGEASLPGAAPSLQDEV 458
+
+Query: 179 RD 180
+ R+
+Sbjct: 459 RE 460
+
+ Score = 92 (37.4 bits), Expect = 1.6, P = 0.81
+ Identities = 24/81 (29%), Positives = 42/81 (51%)
+
+Query: 74 KRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQME 133
+ +R + E E+ Q + V R R Q R R + +LE E+ Q+E Q+Q L + Q++
+Sbjct: 1164 RRLQNEHERAQMLLAEVSRERGELQGERGELRSRLARLELERAQLEIQSQQLRESNQQLD 1223
+
+Query: 134 AENNRLSQQLAQLAAEVRGSR 154
+ RL+ Q +L ++R ++
+Sbjct: 1224 LSACRLTTQ-CELLTQLRSAQ 1243
+
+
+>sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo sapiens GN=FOS PE=1 SV=1
+ Length = 380
+
+ Score = 103 (41.3 bits), Expect = 0.019, P = 0.018
+ Identities = 50/175 (28%), Positives = 72/175 (41%)
+
+Query: 74 KRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ +R K E +E+E+RRI R RN+ AA R R+R + L+ E Q+E + L +
+Sbjct: 125 RRGKVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEI 183
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LP 183
+ + + E +L LA + + P + AS LT P + E +E LP
+Sbjct: 184 ANLLKEKEKLEFILAAHRPACK-IPDDLGFPEEMSVASLDLTGGLPEVATPESEEAFTLP 242
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GS 237
+ L P P PS+ E D PA S ++P DL GS
+Sbjct: 243 LLNDPEPKPSVEPVKSISSMELKTEPFDDFLFPASSRPSGSETARSVPDMDLSGS 297
+
+
+>sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus norvegicus GN=Fos PE=1 SV=1
+ Length = 380
+
+ Score = 103 (41.3 bits), Expect = 0.019, P = 0.018
+ Identities = 51/175 (29%), Positives = 71/175 (40%)
+
+Query: 74 KRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ +R K E +E+E+RRI R RN+ AA R R+R + L+ E Q+E + L +
+Sbjct: 125 RRGKVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEI 183
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LP 183
+ + + E +L LA + + P + S LT P E +E LP
+Sbjct: 184 ANLLKEKEKLEFILAAHRPACKIPN-DLGFPEEMSVTSLDLTGGLPEATTPESEEAFTLP 242
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GS 237
+ L P P PSL AE D PA S ++P DL GS
+Sbjct: 243 LLNDPEPKPSLEPVKNISNMELKAEPFDDFLFPASSRPSGSETARSVPDVDLSGS 297
+
+
+>sp|P19880|YAP1_YEAST AP-1-like transcription factor YAP1 OS=Saccharomyces
+ cerevisiae GN=YAP1 PE=1 SV=2
+ Length = 650
+
+ Score = 96 (38.9 bits), Expect = 0.019, Sum P(2) = 0.019
+ Identities = 36/131 (27%), Positives = 61/131 (46%)
+
+Query: 28 VSPADTS-LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRR 86
+ VSP + + + E++ E ++ + G++ PK K +K +D + +
+Sbjct: 13 VSPGSLAEFEGSKSRHDEIENEHRRTGTRD---GEDSEQPKKK--GSKTSKKQDLDPETK 67
+
+Query: 87 IERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL 146
+ +R +NRAA + RERK +M++LE +K+Q + Q Q E E L QL L
+Sbjct: 68 QKRTAQNRAAQRAFRERKERKMKELE-KKVQSLESIQ------QQNEVEATFLRDQLITL 120
+
+Query: 147 AAEVRGSRANT 157
+ E++ R T
+Sbjct: 121 VNELKKYRPET 131
+
+ Score = 53 (23.7 bits), Expect = 0.019, Sum P(2) = 0.019
+ Identities = 25/114 (21%), Positives = 50/114 (43%)
+
+Query: 160 PGSPA---TASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHP 216
+ PGS A+ P+L + ++++P P + + L+P + ++S + +
+Sbjct: 438 PGSTGIGNNAASNTNPSLLQSSKEDIPFINANLAFPDDNSTNIQLQPFSESQSQNKFDYD 497
+
+Query: 217 AV-SVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPD 269
+ + EG+ LF G L+ D AA +SDD+ + + + + EP+
+Sbjct: 498 MFFRDSSKEGNN----LF--GEFLEDDDDDKKAANMSDDESSLIKNQLINEEPE 545
+
+
+>sp|Q8CH25|SLTM_MOUSE SAFB-like transcription modulator OS=Mus musculus GN=Sltm
+ PE=1 SV=1
+ Length = 1031
+
+ Score = 108 (43.1 bits), Expect = 0.019, P = 0.019
+ Identities = 30/84 (35%), Positives = 49/84 (58%)
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSR---ERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ R+R + E+E+R ER+ R R + R ER+R+E E+LE E+I++EQ+ + +R+
+Sbjct: 644 RERIRIIREREER--ERLQRERERLEIERQKLERERMERERLERERIRIEQERRREAERI 701
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGS 153
+ ++ E R QQL + E R S
+Sbjct: 702 AREREELRRQQQQL-RYEQEKRNS 724
+
+ Score = 103 (41.3 bits), Expect = 0.069, P = 0.067
+ Identities = 33/117 (28%), Positives = 64/117 (54%)
+
+Query: 39 DVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAK-TEDEKEQRRIERVLRNRAAA 97
+ D + +E+ P EK ++ + K + R+R + E E+ +R R++R R
+Sbjct: 597 DYRRKEILPFEKMKEQRLREHLVRFERLKQAVEFRRRKEIAERERRERERIRIIREREER 656
+
+Query: 98 QT-SRERKRLEME--KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ + RER+RLE+E KLE E+++ E+ + +R+ ++E E R ++++A+ E+R
+Sbjct: 657 ERLQRERERLEIERQKLERERMERERLER---ERI-RIEQERRREAERIAREREELR 709
+
+
+>sp|Q9NWH9|SLTM_HUMAN SAFB-like transcription modulator OS=Homo sapiens GN=SLTM
+ PE=1 SV=2
+ Length = 1034
+
+ Score = 108 (43.1 bits), Expect = 0.020, P = 0.019
+ Identities = 30/84 (35%), Positives = 49/84 (58%)
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSR---ERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ R+R + E+E+R ER+ R R + R ER+R+E E+LE E+I++EQ+ + +R+
+Sbjct: 645 RERIRIIREREER--ERLQRERERLEIERQKLERERMERERLERERIRIEQERRKEAERI 702
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGS 153
+ ++ E R QQL + E R S
+Sbjct: 703 AREREELRRQQQQL-RYEQEKRNS 725
+
+ Score = 100 (40.3 bits), Expect = 0.15, P = 0.14
+ Identities = 33/117 (28%), Positives = 65/117 (55%)
+
+Query: 39 DVKTQEVKPEEK-KPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAA 97
+ D + +E+ P EK K + R+ + + + R+R E E+ +R R++R R
+Sbjct: 598 DYRRKEILPFEKMKEQRLREHLVRFERLRRAMELRRRREIAERERRERERIRIIREREER 657
+
+Query: 98 QT-SRERKRLEME--KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ + RER+RLE+E KLE E+++ E+ + +R+ ++E E + ++++A+ E+R
+Sbjct: 658 ERLQRERERLEIERQKLERERMERERLER---ERI-RIEQERRKEAERIAREREELR 710
+
+
+>sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Homo sapiens GN=HLF PE=2 SV=1
+ Length = 295
+
+ Score = 101 (40.6 bits), Expect = 0.020, P = 0.020
+ Identities = 39/151 (25%), Positives = 67/151 (44%)
+
+Query: 2 SCDMEKTMSSVDSLPA---TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS 58
+ +C M+ + LPA TP+ P P + AD+ + +E +KRK
+Sbjct: 142 NC-MQSPIRPGQLLPANRNTPSPIDPDTIQVPVGYEPDPADLALSSIPGQEMFDPRKRKF 200
+
+Query: 59 WGQEL-PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQ 117
+ +EL P P RK +D K+ + R +N AA+ SR+ +RL+ ++
+Sbjct: 201 SEEELKPQPMIK-KARKVFIPDDLKDDKYWARRRKNNMAAKRSRDARRLKENQIAIRASF 259
+
+Query: 118 MEQQNQFLLQRLSQMEAENNRLSQQLAQLAA 148
+ +E++N L Q ++ + E + LA+ A
+Sbjct: 260 LEKENSALRQEVADLRKELGKCKNILAKYEA 290
+
+
+>sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus musculus GN=Hlf PE=2 SV=1
+ Length = 295
+
+ Score = 101 (40.6 bits), Expect = 0.020, P = 0.020
+ Identities = 39/151 (25%), Positives = 67/151 (44%)
+
+Query: 2 SCDMEKTMSSVDSLPA---TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS 58
+ +C M+ + LPA TP+ P P + AD+ + +E +KRK
+Sbjct: 142 NC-MQSPIRPGQLLPANRNTPSPIDPDTIQVPVGYEPDPADLALSSIPGQEMFDPRKRKF 200
+
+Query: 59 WGQEL-PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQ 117
+ +EL P P RK +D K+ + R +N AA+ SR+ +RL+ ++
+Sbjct: 201 SEEELKPQPMIK-KARKVFIPDDLKDDKYWARRRKNNMAAKRSRDARRLKENQIAIRASF 259
+
+Query: 118 MEQQNQFLLQRLSQMEAENNRLSQQLAQLAA 148
+ +E++N L Q ++ + E + LA+ A
+Sbjct: 260 LEKENSALRQEVADLRKELGKCKNILAKYEA 290
+
+
+>sp|Q6CBW0|NST1_YARLI Stress response protein NST1 OS=Yarrowia lipolytica
+ GN=NST1 PE=3 SV=1
+ Length = 889
+
+ Score = 107 (42.7 bits), Expect = 0.021, P = 0.021
+ Identities = 43/157 (27%), Positives = 72/157 (45%)
+
+Query: 74 KRAKTEDEKEQRRIERV-LRNRAAAQTSRERKRLEMEKLENEKIQMEQ-QNQFL-----L 126
+ +R + EKE+R E + R + RE++RLE E++ENE+++ E+ +N+ L
+Sbjct: 489 ERMRLAKEKEEREKEELRARQQQEEDERREKERLEEERIENERLEAERIENERLEKEREQ 548
+
+Query: 127 QRLSQMEAENNRLSQQLA-QLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLE 185
+ QRL + E E R+ ++ Q E R RA+ +P S T P + L
+Sbjct: 549 QRLEE-EKERQRIKEEREKQKLEEEREKRASMSIPLSKPLPGKTQIPA----SQPGTSLG 603
+
+Query: 186 RIPFPTPSLSDYSPT-LKPSTLAES--SDVAQHPAVS 219
+ + P P + +P + P + + + QH A S
+Sbjct: 604 GLQQPVPQAAPVAPVAMMPQSPSPQLPPGLTQHVAQS 640
+
+ Score = 104 (41.7 bits), Expect = 0.045, P = 0.044
+ Identities = 43/158 (27%), Positives = 75/158 (47%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-ERKRL 106
+ EEK+ A+ R+ + + + K +R K E Q++ E R + + R E +RL
+Sbjct: 477 EEKRLARIREM-EERMRLAKEK---EEREKEELRARQQQEEDERREKERLEEERIENERL 532
+
+Query: 107 EMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA---NTPMPGS- 162
+ E E++ENE+++ E++ Q L + + + R Q+L + E R S + + P+PG
+Sbjct: 533 EAERIENERLEKEREQQRLEEEKERQRIKEEREKQKLEE-EREKRASMSIPLSKPLPGKT 591
+
+Query: 163 --PATASPTLTPTLFK---QERDELPLERIP-FPTPSL 194
+ PA+ T L + Q P+ +P P+P L
+Sbjct: 592 QIPASQPGTSLGGLQQPVPQAAPVAPVAMMPQSPSPQL 629
+
+ Score = 91 (37.1 bits), Expect = 1.2, P = 0.70
+ Identities = 42/181 (23%), Positives = 72/181 (39%)
+
+Query: 44 EVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRER 103
+ E K +EK+ K + E K ++A+ EKE++R+ R+ + ++E+
+Sbjct: 441 ERKQQEKEREKAARKAASEA---KQKARQEEQARLAREKEEKRLARIREMEERMRLAKEK 497
+
+Query: 104 KRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSP 163
+ + E E+L + Q E+ + +RL + EN RL A + R
+Sbjct: 498 EEREKEELRARQ-QQEEDERREKERLEEERIENERLE------AERIENERLEKER--EQ 548
+
+Query: 164 ATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL 223
+ K+ER++ LE S+S P KP ++ A P S+ GL
+Sbjct: 549 QRLEEEKERQRIKEEREKQKLEEEREKRASMS--IPLSKPLP-GKTQIPASQPGTSLGGL 605
+
+Query: 224 E 224
+ +
+Sbjct: 606 Q 606
+
+ Score = 84 (34.6 bits), Expect = 7.0, P = 0.9990
+ Identities = 33/120 (27%), Positives = 59/120 (49%)
+
+Query: 37 SADVKT--QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNR 94
+ +A VK Q+++ E+K ++++ Q+ K ++A E+EK + ER R +
+Sbjct: 368 AAQVKAELQQMEEEKKTLDLEKEARDQQRRERKKEKKRAQKAIKEEEKRKAAAEREEREK 427
+
+Query: 95 AAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ A+ + ER RLE E+ + EK E++ R + EA+ ++ A+LA E R
+Sbjct: 428 REAEEA-ERLRLEAERKQQEK---EREKA---ARKAASEAKQKARQEEQARLAREKEEKR 480
+
+ Score = 76 (31.8 bits), Expect = 0.85, Sum P(2) = 0.57
+ Identities = 27/101 (26%), Positives = 48/101 (47%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE 102
+ +E + ++++ KK K Q+ + RK A +E+E+R E R R A+ ++
+Sbjct: 389 KEARDQQRRERKKEKKRAQKAIKEEEK---RKAAAEREEREKREAEEAERLRLEAERKQQ 445
+
+Query: 103 RKRLEM--EKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQ 141
+ K E K +E Q +Q + RL++ E E RL++
+Sbjct: 446 EKEREKAARKAASEAKQKARQEE--QARLAR-EKEEKRLAR 483
+
+ Score = 61 (26.5 bits), Expect = 0.85, Sum P(2) = 0.57
+ Identities = 25/91 (27%), Positives = 38/91 (41%)
+
+Query: 129 LSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIP 188
+ L+Q A++ L +L +TP PGS + + TL +L + + P P
+Sbjct: 633 LTQHVAQSQILLDRLTPDPTSRMTPERHTPSPGSTTSNAKTLLDSLLRPAQG--PSTPPP 690
+
+Query: 189 FP-TP--SLSDYSPTLKPSTLAESSDVAQHP 216
+ P TP S+S +P T+ V Q P
+Sbjct: 691 GPGTPRSSISHVAPVGAIGTIGSPGQVNQQP 721
+
+
+>sp|Q498L2|SLTM_XENLA SAFB-like transcription modulator OS=Xenopus laevis
+ GN=sltm PE=2 SV=1
+ Length = 998
+
+ Score = 105 (42.0 bits), Expect = 0.022, Sum P(2) = 0.022
+ Identities = 26/84 (30%), Positives = 48/84 (57%)
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSR---ERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ R+R + +E+ ++R+ R R + R ER+R+E E+LE E+I++EQ+ + +R+
+Sbjct: 607 RERERIRIMREREELDRLQRERERLEIERQKLERERMERERLERERIRIEQERRREAERI 666
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGS 153
+ ++ E R +QL + E R S
+Sbjct: 667 AREREELRRQQEQL-RFEQEKRNS 689
+
+ Score = 47 (21.6 bits), Expect = 0.022, Sum P(2) = 0.022
+ Identities = 15/56 (26%), Positives = 25/56 (44%)
+
+Query: 29 SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLP-PRKRAKTEDEKE 83
+ S +S+ D ++ + EKK K+ K +E T +P P K E+ K+
+Sbjct: 456 SKTQSSVKKDDRRSSD--KAEKKDGKELKKDSKEKSESATTVPSPESSKKNEERKK 509
+
+ Score = 44 (20.5 bits), Expect = 0.045, Sum P(2) = 0.044
+ Identities = 16/78 (20%), Positives = 32/78 (41%)
+
+Query: 6 EKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPV 65
+ E++ + V+ L +E S D +D++ +E + +EKK QE+
+Sbjct: 120 EESATFVNVLSTEEENETK--QTSHFDNPERGSDIQAEEAEEDEKKDVTGSGDVTQEISK 177
+
+Query: 66 PKTNLPPRKRAKTEDEKE 83
+ P + + ++E E
+Sbjct: 178 PLHSGDNESELRIKEEME 195
+
+
+>sp|Q1E554|CGR1_COCIM rRNA-processing protein CGR1 OS=Coccidioides immitis
+ GN=CGR1 PE=3 SV=1
+ Length = 130
+
+ Score = 89 (36.4 bits), Expect = 0.023, P = 0.023
+ Identities = 32/124 (25%), Positives = 60/124 (48%)
+
+Query: 9 MSSVDSLPATPASE-VPVLTVSPADTSLNSADVKTQEVKPEEKK----PAKKRKSWGQEL 63
+ MSS + PA PA E P +PA + ++ + K P K + S+ + L
+Sbjct: 1 MSSTEPAPA-PAPEPAPAPAAAPAAAAAAPKGMRKNGKNWHDVKTPFRPTKGQTSYARRL 59
+
+Query: 64 PVPKTNLPPRKRAKT-EDEKE---QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME 119
+ K +++ K ++EKE QRRI+ + ++R AA+ +ER EK+ ++++
+Sbjct: 60 EERKAMAAIKEKEKEMKEEKEAERQRRIQAI-KDRRAAKEEKERYEKMAEKMHRKRVERR 118
+
+Query: 120 QQNQ 123
+ ++ +
+Sbjct: 119 KRRE 122
+
+
+>sp|Q91496|FOS_TETFL Proto-oncogene c-Fos OS=Tetraodon fluviatilis GN=fos PE=3
+ SV=1
+ Length = 374
+
+ Score = 102 (41.0 bits), Expect = 0.023, P = 0.023
+ Identities = 38/136 (27%), Positives = 59/136 (43%)
+
+Query: 15 LPATPASEVPVLTVSPADTSLN-SADVKTQEVKPEEKK-PAKKRKSWGQELPVPKTNLPP 72
+ L A+ AS VP +T L V P + P S+ + + + P
+Sbjct: 47 LTASSASFVPTVTAISTSPDLQWMVQPLVSSVAPSRRAHPYSPSPSYKRTVMRSGASKPH 106
+
+Query: 73 RKRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQR 128
+ KR + E +E+E++RI R RN+ AA R R+R + L+ E Q+E + L
+Sbjct: 107 AKRGRVEQTTPEEEEKKRIRRE-RNKQAAAKCRNRRRELTDSLQAETDQLEAEKSSLQND 165
+
+Query: 129 LSQMEAENNRLSQQLA 144
+ ++ + E RL LA
+Sbjct: 166 IANLLKEKERLEFILA 181
+
+
+>sp|Q9ESN9|JIP3_MOUSE C-Jun-amino-terminal kinase-interacting protein 3 OS=Mus
+ musculus GN=Mapk8ip3 PE=1 SV=1
+ Length = 1337
+
+ Score = 98 (39.6 bits), Expect = 0.023, Sum P(2) = 0.023
+ Identities = 40/152 (26%), Positives = 69/152 (45%)
+
+Query: 62 ELPVPKTNLPPRKRAKTEDEKEQRRIERVLRN-RAAAQTSRERKRLEMEKL------ENE 114
+ E V K L K+AK + E + +E L+ ++ A T+R R E+E + E +
+Sbjct: 455 EQEVLKGELEAAKQAKVKLENRIKELEEELKRVKSEAVTARREPREEVEDVSSYLCTELD 514
+
+Query: 115 KIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS---RANTPMPGSPATASPTLT 171
+ KI M Q+ +F ++++ E N+ ++L +L VR + RA+ P T+
+Sbjct: 515 KIPMAQRRRFTRVEMARVLMERNQYKERLMELQEAVRWTEMIRASREHPSVQEKKKSTIW 574
+
+Query: 172 P---TLFKQERDELPLERIPFPTPSLSDYSPT 200
+ LF P +R +P+ ++ SPT
+Sbjct: 575 QFFSRLFSSSSSPPPAKR-SYPSVNIHYKSPT 605
+
+ Score = 57 (25.1 bits), Expect = 0.023, Sum P(2) = 0.023
+ Identities = 18/58 (31%), Positives = 25/58 (43%)
+
+Query: 8 TMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPV 65
+ T S+ + TP S VP V+P + SL K K+ +KR S E+ V
+Sbjct: 266 TPSTTGTKSNTPTSSVPSAAVTPLNESLQPLGDYVSVTK-NNKQAREKRNSRNMEVQV 322
+
+
+>sp|P53450|FOS_TAKRU Proto-oncogene c-Fos OS=Takifugu rubripes GN=fos PE=3 SV=1
+ Length = 376
+
+ Score = 102 (41.0 bits), Expect = 0.023, P = 0.023
+ Identities = 63/245 (25%), Positives = 104/245 (42%)
+
+Query: 15 LPATPASEVPVLTVSPADTSLN-SADVKTQEVKPEEKK-PAKKRKSWGQELPVPKTNLPP 72
+ L A+ AS +P +T L V P + P S+ + + +
+Sbjct: 48 LTASSASFIPTVTAISTSPDLQWMVQPLISSVAPSHRAHPYSPSPSYKRTVMRSAASKAH 107
+
+Query: 73 RKRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQR 128
+ KR++ E +E+E++RI R RN+ AA R R+R + L+ E Q+E + L
+Sbjct: 108 GKRSRVEQTTPEEEEKKRIRRE-RNKQAAAKCRNRRRELTDTLQAETDQLEDEKSSLQND 166
+
+Query: 129 LSQMEAENNRLSQQLA--QLAAEVRGSRANTPMPGSPATASPT---LTPTLFKQERDELP 183
+ ++ + E RL LA Q ++ S+ +T S + SP L+ T+ Q + +P
+Sbjct: 167 IANLLKEKERLEFILAAHQPICKIP-SQMDTDF--SVVSMSPVHACLSTTVSTQLQTSIP 223
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHS 243
+ T S S ++ T S + SSD +S A + S + + DL S + S
+Sbjct: 224 --EATTVTSSHSTFTSTSN-SIFSGSSD----SLLSTATVSN--SVVKMTDLDSSVLEES 274
+
+Query: 244 TDDVA 248
+ D +A
+Sbjct: 275 LDLLA 279
+
+
+>sp|Q05682|CALD1_HUMAN Caldesmon OS=Homo sapiens GN=CALD1 PE=1 SV=2
+ Length = 793
+
+ Score = 106 (42.4 bits), Expect = 0.024, P = 0.023
+ Identities = 33/148 (22%), Positives = 74/148 (50%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE 102
+ Q +K EEK+ A++R+ +E K R+RA+ E+E E+ ++E RN+ Q +
+Sbjct: 343 QRIKEEEKRAAEERQRIKEE---EKRAAEERQRARAEEE-EKAKVEEQKRNK---QLEEK 395
+
+Query: 103 RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS 162
+ ++ ++ K++ EK++ + + +++ ++ +A+ ++L + + E +G++
+Sbjct: 396 KRAMQETKIKGEKVEQKIEGKWV----NEKKAQEDKLQTAVLKKQGEEKGTKVQAKREKL 451
+
+Query: 163 PATASPTLTPTLFKQER---DELPLERI 187
+ PT K E+ D+ P E +
+Sbjct: 452 QED-KPTFKKEEIKDEKIKKDKEPKEEV 478
+
+ Score = 97 (39.2 bits), Expect = 0.49, Sum P(2) = 0.39
+ Identities = 42/168 (25%), Positives = 66/168 (39%)
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM 132
+ R+R +TE E E ++++ + A ++KR E K+ E+ Q +Q + R +
+Sbjct: 541 RRRGETESE-EFEKLKQKQQEAALELEELKKKREERRKVLEEEEQRRKQEE--ADRKLRE 597
+
+Query: 133 EAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLE-RIPFPT 191
+ E E RL +++ + AE R P G P F + L +E R F
+Sbjct: 598 EEEKRRLKEEIERRRAEAAEKRQKMPEDGLSDDKKPF---KCFTPKGSSLKIEERAEFLN 654
+
+Query: 192 PSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDL 239
+ S+ S A S + + +EG SA P SDL
+Sbjct: 655 KSVQKSSGVKSTHQAAIVSKIDSRLEQYTSAIEGTKSAKPTKPAASDL 702
+
+ Score = 85 (35.0 bits), Expect = 4.7, P = 0.991
+ Identities = 23/91 (25%), Positives = 47/91 (51%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE 102
+ + ++ EEK+ A++R+ +E K R+R K E+++ +R+ A R+
+Sbjct: 315 ERMREEEKRAAEERQRIKEE---EKRAAEERQRIKEEEKRAAEERQRIKEEEKRAAEERQ 371
+
+Query: 103 RKRLEMEKLENEKIQMEQQNQFLLQRLSQME 133
+ R R E E E K++ +++N+ L ++ M+
+Sbjct: 372 RARAEEE--EKAKVEEQKRNKQLEEKKRAMQ 400
+
+ Score = 40 (19.1 bits), Expect = 0.49, Sum P(2) = 0.39
+ Identities = 13/53 (24%), Positives = 23/53 (43%)
+
+Query: 32 DTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQ 84
+ + L +A +K Q + K AK+ K + K + K K ++ KE+
+Sbjct: 425 EDKLQTAVLKKQGEEKGTKVQAKREKLQEDKPTFKKEEIKDEKIKKDKEPKEE 477
+
+
+>sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos taurus GN=FOS PE=2 SV=2
+ Length = 380
+
+ Score = 102 (41.0 bits), Expect = 0.024, P = 0.024
+ Identities = 50/175 (28%), Positives = 72/175 (41%)
+
+Query: 74 KRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ +R K E +E+E+RRI R RN+ AA R R+R + L+ E Q+E + L +
+Sbjct: 125 RRGKVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEI 183
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LP 183
+ + + E +L LA + + P + AS L+ P E +E LP
+Sbjct: 184 ANLLKEKEKLEFILAAHRPACK-IPDDLGFPEEMSVASLDLSGGLPEAATPESEEAFTLP 242
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GS 237
+ L P P PS+ AE D PA S ++P DL GS
+Sbjct: 243 LLNDPEPKPSVEPVKSVGSMELKAEPFDDYMFPASSRPSGSETARSVPDMDLSGS 297
+
+
+>sp|Q56TT7|FOS_PHOCM Proto-oncogene c-Fos OS=Phodopus campbelli GN=FOS PE=3
+ SV=1
+ Length = 381
+
+ Score = 102 (41.0 bits), Expect = 0.024, P = 0.024
+ Identities = 52/176 (29%), Positives = 73/176 (41%)
+
+Query: 74 KRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ +R K E +E+E+RRI R RN+ AA R R+R + L+ E +E + L +
+Sbjct: 125 RRGKVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDHLEDEKSALQTEI 183
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LP 183
+ + + E +L LA + + P + AS LT P E +E LP
+Sbjct: 184 ANLLKEKEKLEFILAAHRPACK-IPDDLGFPEDMSVASLDLTGGLPEATTPESEEAFSLP 242
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS-VAGLEGDGSALPLFDL-GS 237
+ L P P SL AE D PA S +G E ++P DL GS
+Sbjct: 243 LLNDPEPKTSLEPVKSISNMELKAEPFDDFLFPASSRPSGSETTARSVPDMDLSGS 298
+
+
+>sp|Q0CEI3|KAPC_ASPTN Putative transcription factor kapC OS=Aspergillus terreus
+ (strain NIH 2624 / FGSC A1156) GN=kapC PE=3 SV=2
+ Length = 286
+
+ Score = 100 (40.3 bits), Expect = 0.025, P = 0.024
+ Identities = 39/161 (24%), Positives = 67/161 (41%)
+
+Query: 66 PKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ P+ P++ KT ++ +R +NRAA + R+RK + KLE Q++ Q + +
+Sbjct: 85 PQPEPAPQESPKTYGKRPLSTSKRAAQNRAAQRAFRQRKESYIRKLEE---QVKHQ-EAI 140
+
+Query: 126 LQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-MPGSPATASPTLTPTLFKQERDELPL 184
+ + + AEN +L + + L + S+ P +PG+ P TL E
+Sbjct: 141 TEEYKALHAENYQLREYIINLQTRLLDSQGEVPELPGNIDLNQPRADLTLSAPELQRGNA 200
+
+Query: 185 ERI-PFPT-PSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL 223
+ P P P P + + D+ ++VAGL
+Sbjct: 201 ASAGPAPAGPGPQQSQPNQNQG-VGPNDDMNSLNRIAVAGL 240
+
+
+>sp|Q6P9R4|ARHGI_MOUSE Rho guanine nucleotide exchange factor 18 OS=Mus
+ musculus GN=Arhgef18 PE=2 SV=1
+ Length = 1021
+
+ Score = 107 (42.7 bits), Expect = 0.025, P = 0.024
+ Identities = 61/246 (24%), Positives = 101/246 (41%)
+
+Query: 9 MSSVDSLPATPASEVP--VLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVP 66
+ M S +SLP E+ V T+S SL + + Q+ E ++ A + + L
+Sbjct: 628 MPSTESLPTVLELELVHRVQTLSQLLLSLQAV-IAQQDSYVEMQRTAIQEREKQFRLQST 686
+
+Query: 67 KTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLL 126
+ + NL E E+ QR E+ RA + + + R E ++ E E+ + +Q+ +
+Sbjct: 687 RGNL------LLEQER-QRNFEKQREERAGVEKLQSQLRQEQQRWERERARQQQELELAG 739
+
+Query: 127 QRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLER 186
+ RL + E E ++ Q+L Q E+ R + +ER+ L L R
+Sbjct: 740 ARLQEREGEARQMRQRLDQERTELERQRQAYQHDLERLREAQRAVD----RERERLELLR 795
+
+Query: 187 IPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGS-ALPLFDLGSDLKHHS-T 244
+ F + L P LAE+ + P+ + GLEG + A GS + H +
+Sbjct: 796 -RFKKQNT--VPGALPPEVLAEAQPASHPPSFNGDGLEGHSAPAKAPGTQGSAMLHGTGP 852
+
+Query: 245 DDVAAP 250
+ D+V P
+Sbjct: 853 DNVERP 858
+
+
+>sp|P29681|IMPE2_DROME 20-hydroxyecdysone protein OS=Drosophila melanogaster
+ GN=ImpE2 PE=1 SV=1
+ Length = 466
+
+ Score = 103 (41.3 bits), Expect = 0.025, P = 0.025
+ Identities = 45/186 (24%), Positives = 86/186 (46%)
+
+Query: 8 TMSSVDSLPATPASEVPVLTVS----PADTSLNSADVKTQEVKPEEKKPA---KKRKSWG 60
+ + + V +LP A ++PV V P SL +VK +EVKPEE KP +K K
+Sbjct: 14 SQARVLNLPKE-AIDIPVAIVEDKEPPVALSLVKEEVKAEEVKPEEVKPIAQEEKAKDLK 72
+
+Query: 61 QEL-PVPKTNLPPRKRAKTEDE-KEQRR--IERVLRNRAAAQTSRERKRLEMEKLENEKI 116
+ +E+ P K + + + +DE KE + I+ L+ + Q + +E L+ + +
+Sbjct: 73 EEVKPEIKPEIKEQPKPDIKDEIKEDLKADIKEELKEKIEEQINELPNAKPLE-LKEKSL 131
+
+Query: 117 QMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE-VRGSRANTPMPGSPATASPTLTPTLF 175
+ + E++ Q + + + Q E + ++ ++ E + + P + + L+P
+Sbjct: 132 EAEEKPQEIKEEVQQPE-----IKKEATEIKEEPAQNILKSLPAEETVVVPAEELSPNPV 186
+
+Query: 176 KQERDE 181
+ +QE+ E
+Sbjct: 187 EQEQSE 192
+
+
+>sp|A2AJI0|MA7D1_MOUSE MAP7 domain-containing protein 1 OS=Mus musculus
+ GN=Map7d1 PE=1 SV=1
+ Length = 846
+
+ Score = 106 (42.4 bits), Expect = 0.026, P = 0.025
+ Identities = 37/143 (25%), Positives = 58/143 (40%)
+
+Query: 7 KTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVP 66
+ K+ ++ + PA PAS P SP TQ + E PA P
+Sbjct: 530 KSRAAEEKEPAAPASPAPSPVPSPTPAQPQKEQSSTQ-IPAETAVPAVPAAPTAPPTAAP 588
+
+Query: 67 KTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLL 126
+ P + A T D +E R+ R +A Q RE + +++ E +K E+Q
+Sbjct: 589 SVT-PSKPMAGTTDREEATRLLAEKRRQAREQREREEQERKLQA-ERDKRMREEQLAREA 646
+
+Query: 127 QRLSQMEAENNRLSQQLAQLAAE 149
+ + ++ EAE R +Q A+ A+
+Sbjct: 647 EARAEREAEARRREEQEAREKAQ 669
+
+ Score = 95 (38.5 bits), Expect = 0.41, P = 0.34
+ Identities = 41/180 (22%), Positives = 81/180 (45%)
+
+Query: 6 EKTMSSVDSLPATPASEVPVLTVS-PADTSLNSADV------KTQEVKPEEKKPAKKRKS 58
+ E + +V + P P + P +T S P + + + K ++ + + ++ ++RK
+Sbjct: 570 ETAVPAVPAAPTAPPTAAPSVTPSKPMAGTTDREEATRLLAEKRRQAREQREREEQERKL 629
+
+Query: 59 WGQ-ELPVPKTNLPPRKRAKTEDEKE-QRRIERVLRNRAAAQTSRERKRLEMEKLENE-- 114
+ + + + + L A+ E E E +RR E+ R +A A+ E++RL+ +K E E
+Sbjct: 630 QAERDKRMREEQLAREAEARAEREAEARRREEQEAREKAQAE-QEEQERLQKQKEEAEAR 688
+
+Query: 115 -KIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA-NTPMPGSPATASPTLTP 172
+ + + E+Q Q + + E E ++L ++ R S A T + TA+ P
+Sbjct: 689 SREEAERQRQEREKHFQKEEQERQERRKRLEEIMKRTRKSEAAETKKQDAKETAANNSGP 748
+
+ Score = 92 (37.4 bits), Expect = 0.048, Sum P(2) = 0.047
+ Identities = 37/148 (25%), Positives = 67/148 (45%)
+
+Query: 7 KTMSSVDSLPATPASEVPVLTVSPA--DTSLNSADVKTQ-----EVKPEEKKPAKKRKSW 59
+ KT ++ LP P + ++ PA S++ K++ P E KP++ R S
+Sbjct: 58 KTATNPKQLPLEPGNPTGQISPQPAPPQEECPSSEAKSRGPTPTATGPREAKPSR-RSSQ 116
+
+Query: 60 GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME 119
+ VP ++ PP K+ + E+ ++ + R A + +K + +EK E K E
+Sbjct: 117 PSPTTVPASDSPPAKQ-DVKKAGERHKLAKERREERAKYLAA-KKAVWLEKEEKAKALRE 174
+
+Query: 120 QQNQFLLQRLSQ--MEAENNRLSQQLAQ 145
+ +Q Q +RL + ++AE R + + Q
+Sbjct: 175 KQLQERRRRLEEQRLKAEQRRAALEERQ 202
+
+ Score = 56 (24.8 bits), Expect = 0.048, Sum P(2) = 0.047
+ Identities = 20/72 (27%), Positives = 30/72 (41%)
+
+Query: 133 EAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTP 192
+ E +N+R S+ + S A +P+P SP A P +Q ++P E P
+Sbjct: 524 EDKNHRKSRAAEEKEPAAPASPAPSPVP-SPTPAQPQK-----EQSSTQIPAETAVPAVP 577
+
+Query: 193 SLSDYSPTLKPS 204
+ + PT PS
+Sbjct: 578 AAPTAPPTAAPS 589
+
+
+>sp|Q5R452|SAFB1_PONAB Scaffold attachment factor B1 OS=Pongo abelii GN=SAFB
+ PE=2 SV=1
+ Length = 914
+
+ Score = 106 (42.4 bits), Expect = 0.028, P = 0.028
+ Identities = 32/95 (33%), Positives = 53/95 (55%)
+
+Query: 50 KKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR-ERKRLEM 108
+ K+P K R S + ++ R +A+ E E E+ R+E + R R A Q R ER+R+E
+Sbjct: 609 KEPRKSRDSESHRVR-ERSEREQRMQAQWERE-ERERLE-IARERLAFQRQRLERERMER 665
+
+Query: 109 EKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQL 143
+ E+LE E++ +E + + +R+ + E E R Q+L
+Sbjct: 666 ERLERERMHVEHERRREQERIHR-EREELRRQQEL 699
+
+
+>sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive element-binding protein 3-like
+ protein 3-B OS=Danio rerio GN=creb3l3b PE=3 SV=2
+ Length = 428
+
+ Score = 102 (41.0 bits), Expect = 0.029, P = 0.028
+ Identities = 36/123 (29%), Positives = 61/123 (49%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRL 139
+ +E+ ++I R +RN+ +AQ SR++K+ ++ LE+ N L +++ Q+E N L
+Sbjct: 207 EERILKKIRRKIRNKQSAQESRKKKKEYIDGLESRMAACSAHNHELQRKVFQLEKCNISL 266
+
+Query: 140 SQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLS---D 196
+ +QL +L A V +N P+ L+ TL LP + PF +S D
+Sbjct: 267 MEQLRRLQALVMNG-SNKPVQAGTCVLVLLLSFTLIL-----LPNLK-PFTDTKVSQHGD 319
+
+Query: 197 YSP 199
+ +SP
+Sbjct: 320 FSP 322
+
+
+>sp|Q9D439|CCD11_MOUSE Coiled-coil domain-containing protein 11 OS=Mus musculus
+ GN=Ccdc11 PE=2 SV=3
+ Length = 514
+
+ Score = 103 (41.3 bits), Expect = 0.029, P = 0.028
+ Identities = 29/114 (25%), Positives = 55/114 (48%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE 102
+ Q+++ E K +KR+ G+E + L R+ + EKE R+ ++ + A+ RE
+Sbjct: 319 QDLQDEADKKKQKREEMGREQKIYNDYLMQRREEEKAQEKELNRLLEDIKAKKLAEKDRE 378
+
+Query: 103 -------RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE 149
+ RK+L E + K+Q++++ Q L+ ++ R+S+ L L E
+Sbjct: 379 LALQRAARKQLMNEVMNTRKLQVQERLQRKLREQEELALHEQRISESLKVLHQE 432
+
+
+>sp|P48755|FOSL1_MOUSE Fos-related antigen 1 OS=Mus musculus GN=Fosl1 PE=2 SV=2
+ Length = 273
+
+ Score = 99 (39.9 bits), Expect = 0.029, P = 0.029
+ Identities = 51/185 (27%), Positives = 83/185 (44%)
+
+Query: 64 PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRL------EMEKLENEKIQ 117
+ P P P ++ E+E E+RR+ R AAA+ RK L E +KLE+EK
+Sbjct: 88 PPPGVRRRPCEQISPEEE-ERRRVRRERNKLAAAKCRNRRKELTDFLQAETDKLEDEKSG 146
+
+Query: 118 MEQQNQFLLQRLSQMEA--ENNRLSQQLAQLAAEVRGSRANTPMPGSP-ATASPTLTPTL 174
+ ++++ + L ++ ++E E +R ++ + + G +T SP A P P +
+Sbjct: 147 LQREIEELQKQKERLELVLEAHRPICKIPEGDKKDPGGSGSTSGASSPPAPGRPV--PCI 204
+
+Query: 175 FKQERDELPLERIPFPT----PSLSDYSPTLK---PSTLAESSDVAQHPAVSVAGLEGDG 227
+ L E + PT PSL+ ++P+L PST S + + S GD
+Sbjct: 205 SLSPGPVLEPEALHTPTLMTTPSLTPFTPSLVFTYPSTPEPCSSAHRKSSSS----SGDP 260
+
+Query: 228 SALPL 232
+ S+ PL
+Sbjct: 261 SSDPL 265
+
+
+>sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS=Xenopus laevis GN=mafb PE=2
+ SV=1
+ Length = 313
+
+ Score = 100 (40.3 bits), Expect = 0.029, P = 0.029
+ Identities = 36/140 (25%), Positives = 67/140 (47%)
+
+Query: 29 SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQ-RRI 87
+ SP+ +S +S + Q+ + + R S Q + + L R T+D+ + ++
+Sbjct: 171 SPSGSSSSSQQLHHQQ-QHSSSSAVEDRFSDDQLVSMTVRELNRHLRGFTKDDVIRLKQK 229
+
+Query: 88 ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA 147
+ R L+NR AQ+ R ++ + LE EK Q+ QQ + L Q +S++ E + + +LA
+Sbjct: 230 RRTLKNRGYAQSCRYKRVQQKHNLEGEKTQLVQQVEQLKQEVSRLARERDAYKIKCEKLA 289
+
+Query: 148 ----AEVRGSRANTPMPGSP 163
+ + R + + + P SP
+Sbjct: 290 NNNSSNFREAGSTSDNPSSP 309
+
+
+>sp|Q54RZ9|BZPG_DICDI Probable basic-leucine zipper transcription factor G
+ OS=Dictyostelium discoideum GN=bzpG PE=3 SV=1
+ Length = 372
+
+ Score = 101 (40.6 bits), Expect = 0.030, P = 0.030
+ Identities = 24/80 (30%), Positives = 44/80 (55%)
+
+Query: 74 KRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQME 133
+ K ++KE +R +R+++NR +A SR+RKR + LE+ ++ + + + LS +E
+Sbjct: 268 KELSQVEKKELKRQKRLIKNRESAHLSRQRKRERLTDLEHRVEELSSNSIDINKTLSSLE 327
+
+Query: 134 AENNRLSQQLAQLAAEVRGS 153
+ EN L ++ QL + S
+Sbjct: 328 NENLILKAEVGQLFEVINDS 347
+
+
+>sp|A0JMK9|CAF1A_DANRE Chromatin assembly factor 1 subunit A OS=Danio rerio
+ GN=chaf1a PE=1 SV=1
+ Length = 863
+
+ Score = 109 (43.4 bits), Expect = 0.030, Sum P(2) = 0.030
+ Identities = 57/229 (24%), Positives = 99/229 (43%)
+
+Query: 1 MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTS-LNSAD-VKTQEVKPEEKKPAKKRKS 58
+ +S + S + S P P+ P +PA TS +N+A+ VK + +K +++ K+R+
+Sbjct: 208 LSTGSTSSASVIASSPE-PSKSAPT---TPASTSRINAANKVKRRSLKSVQEQEEKQRQR 263
+
+Query: 59 WGQE-LPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERK-RLEMEKLENEKI 116
+ +E L +K+ + KE++ E+ + + RE+K R E EK + K
+Sbjct: 264 DEKERLKQEAKAAKEKKKEEARKMKEEKEREKKEKKEKDEKERREKKERDEKEKADKLKA 323
+
+Query: 117 QMEQQNQFLLQRLSQM--EAENNRLSQQLAQLAAEVRG-----SRANTPM-PGSPATASP 168
+ + EQ+ + +L + + E RL ++ ++ AE + T + P + A+A
+Sbjct: 324 KEEQRQMKIEAKLEEKRKKEEEKRLKEEKDRIKAEKAEITRFLQKPKTQLAPKTLASACG 383
+
+Query: 169 TLTPTLFKQERDELPLERIPFPTPSLSDYSPTL-KP-STLAESSDVAQH 215
+ P K PL R+ L D L +P STL D H
+Sbjct: 384 KFAPFEIKAHMSLAPLTRVQCEDSVLEDLDRYLAQPDSTLNGLKDWTGH 432
+
+ Score = 40 (19.1 bits), Expect = 0.030, Sum P(2) = 0.030
+ Identities = 16/51 (31%), Positives = 19/51 (37%)
+
+Query: 236 GSDLKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGD 286
+ G L H DD DDD + D P + E A + EGGD
+Sbjct: 524 GESLSHSEGDDDDEAGEDDDDD-----DGFFVPHGYLSEGEGALEDEEGGD 569
+
+
+>sp|P18625|FOSL2_CHICK Fos-related antigen 2 OS=Gallus gallus GN=FOSL2 PE=1
+ SV=1
+ Length = 323
+
+ Score = 100 (40.3 bits), Expect = 0.031, P = 0.030
+ Identities = 39/146 (26%), Positives = 70/146 (47%)
+
+Query: 68 TNLPPRKRAK--TEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ T + R+R + + +E+E+RRI R RN+ AA R R+R EKL+ E +E++ L
+Sbjct: 108 TTVGRRRRDEQLSPEEEEKRRIRRE-RNKLAAAKCRNRRRELTEKLQAETEVLEEEKSVL 166
+
+Query: 126 LQRLSQMEAENNRLSQQLAQLAAEVRGS---RANTPMPGSPATASPTLTPTLFKQERDEL 182
+ + +++++ E +L L + + S R + P + + + KQE E
+Sbjct: 167 QKEIAELQKEKEKLEFMLVAHSPVCKISPEERRSPPTSSLQSVRTGASGAVVVKQEPVE- 225
+
+Query: 183 PLERIPFPTPSLSDYSPT-LKPSTLA 207
+ E IP + L + +KP ++A
+Sbjct: 226 --EEIPSSSLVLDKAQRSVIKPISIA 249
+
+
+>sp|A2R346|KAPC_ASPNC Putative transcription factor kapC OS=Aspergillus niger
+ (strain CBS 513.88 / FGSC A1513) GN=kapC PE=3 SV=2
+ Length = 283
+
+ Score = 99 (39.9 bits), Expect = 0.031, P = 0.031
+ Identities = 36/159 (22%), Positives = 69/159 (43%)
+
+Query: 66 PKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ P+ ++ KT ++ +R +NRAA + R+RK + KLE + + + N+
+Sbjct: 85 PQPEPTGQESPKTYGKRPLSTSKRAAQNRAAQRAFRQRKESYIRKLEEQVKEFDNTNE-- 142
+
+Query: 126 LQRLSQMEAENNRLSQQLAQLAAEVRGSRANTP-MPGSPATASPTLTPTLFKQERDELPL 184
+ + Q++AEN +L + + L + + S+ P +PG+ P ++ P
+Sbjct: 143 --TMKQLQAENYQLREYIINLQSRLLDSQGEVPELPGNIDLNQPRNDISV---PPPGAPA 197
+
+Query: 185 ERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL 223
+ P P P + + A + D+ ++VAGL
+Sbjct: 198 ATGPAPGPGGAPQQMQVPNPGAATNEDMNSLNRIAVAGL 236
+
+
+>sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis catus GN=FOS PE=2 SV=1
+ Length = 381
+
+ Score = 101 (40.6 bits), Expect = 0.031, P = 0.031
+ Identities = 50/175 (28%), Positives = 72/175 (41%)
+
+Query: 74 KRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ +R K E +E+E+RRI R RN+ AA R R+R + L+ E Q+E + L +
+Sbjct: 126 RRGKVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEI 184
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LP 183
+ + + E +L LA + + P + AS L+ P E +E LP
+Sbjct: 185 ANLLKEKEKLEFILAAHRPACK-IPDDLGFPEEMSVASLDLSGGLPEAATPESEEAFTLP 243
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDL-GS 237
+ L P P PS+ AE D PA S ++P DL GS
+Sbjct: 244 LLNDPEPKPSVEPVKSISSMELKAEPFDDFLFPASSRPSGSETARSVPDMDLSGS 298
+
+
+>sp|P26042|MOES_PIG Moesin OS=Sus scrofa GN=MSN PE=2 SV=3
+ Length = 577
+
+ Score = 103 (41.3 bits), Expect = 0.034, P = 0.033
+ Identities = 26/103 (25%), Positives = 52/103 (50%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTNLPPR-KRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ EKK + + +++ K L R K+ + + +K Q+ +E R A + R+R + E
+Sbjct: 326 EKKKREMAEKEKEKIEREKEELMERLKQIEEQTKKAQQELEEQTRRALALEQERKRAQSE 385
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV 150
+ EKL E+ + E+ + LL+ + +L+ ++A+L A +
+Sbjct: 386 AEKLAKERQEAEEAKEALLKASRDQKKTQEQLALEMAELTARI 428
+
+ Score = 102 (41.0 bits), Expect = 0.043, P = 0.042
+ Identities = 30/97 (30%), Positives = 51/97 (52%)
+
+Query: 66 PKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ P T + +A+ +EK Q+++ER L E+K+ EM + E EKI+ E++ L
+Sbjct: 297 PDTIEVQQMKAQAREEKHQKQMERAL-------LENEKKKREMAEKEKEKIEREKEE--L 347
+
+Query: 126 LQRLSQMEAENNRLSQQLAQ-----LAAEVRGSRANT 157
+ ++RL Q+E + + Q+L + LA E RA +
+Sbjct: 348 MERLKQIEEQTKKAQQELEEQTRRALALEQERKRAQS 384
+
+
+>sp|Q2HJ49|MOES_BOVIN Moesin OS=Bos taurus GN=MSN PE=2 SV=3
+ Length = 577
+
+ Score = 103 (41.3 bits), Expect = 0.034, P = 0.033
+ Identities = 26/103 (25%), Positives = 51/103 (49%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTNLPPR-KRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ EKK + + +++ K L R K+ + + +K Q+ +E R + R+R + E
+Sbjct: 326 EKKKREMAEKEKEKIEREKEELMERLKQIEEQTKKAQQELEEQTRRALELEQERKRAQSE 385
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV 150
+ EKL E+ + E+ + LLQ + +L+ ++A+L A +
+Sbjct: 386 AEKLAKERQEAEEAKEALLQASQDQKKTQEQLALEMAELTARI 428
+
+ Score = 101 (40.6 bits), Expect = 0.056, P = 0.055
+ Identities = 25/80 (31%), Positives = 45/80 (56%)
+
+Query: 66 PKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ P T + +A+ +EK Q+++ER L E+K+ EM + E EKI+ E++ L
+Sbjct: 297 PDTIEVQQMKAQAREEKHQKQMERAL-------LENEKKKREMAEKEKEKIEREKEE--L 347
+
+Query: 126 LQRLSQMEAENNRLSQQLAQ 145
+ ++RL Q+E + + Q+L +
+Sbjct: 348 MERLKQIEEQTKKAQQELEE 367
+
+
+>sp|A5FV21|IF2_ACICJ Translation initiation factor IF-2 OS=Acidiphilium cryptum
+ (strain JF-5) GN=infB PE=3 SV=1
+ Length = 887
+
+ Score = 105 (42.0 bits), Expect = 0.035, P = 0.034
+ Identities = 59/225 (26%), Positives = 89/225 (39%)
+
+Query: 48 EEKKP-AKKRKSWGQELP--VPKTNLPPRKRAKTEDEKEQRRIERVLRNR------AAAQ 98
+ E +P A R S G P + R+RA E ++E R+E R + +AA+
+Sbjct: 60 ETGRPSAPSRASGGAAAPRGLTAAEQAARQRAVVEQQREAARLEAERREQEKISILSAAE 119
+
+Query: 99 TSRERKRLEMEKLEN-EKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT 157
+ +R + E E E+++ E++ +R + EAE R ++ AA + A +
+Sbjct: 120 EARRKAEEEARAAEEAERLRAEEE----ARRREEEEAERRRAAEASQATAAPPAPAAAAS 175
+
+Query: 158 PMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPA 217
+ P PA PT P P R P P + S TL+ D + A
+Sbjct: 176 PRAAMPA---PTAAPA----RPGAAPARRTA-PVPPATSASETLRLRAARTGRD-EEEEA 226
+
+Query: 218 VSVAGLEGDGSA------LPL-FDLGSDLKHHSTDDVAAPLSDDD 255
+ A G G+A +P +G D + + DV A LS DD
+Sbjct: 227 SRPARRPGSGAAPSRKPSVPAPKKVGDDRRRGARIDVQAALSGDD 271
+
+ Score = 94 (38.1 bits), Expect = 0.56, P = 0.43
+ Identities = 54/219 (24%), Positives = 81/219 (36%)
+
+Query: 27 TVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRR 86
+ TV + + +++ V+ E +K K+ + G E P P R +
+Sbjct: 27 TVDAGSVRQSFSHGRSKVVQVEVRK--KRGGAAGAETGRPSA--PSRASGGAAAPRGLTA 82
+
+Query: 87 IERVLRNRAAAQTSRERKRLEMEKLENEKIQM-----------EQQNQFL--LQRLSQME 133
+ E+ R RA + RE RLE E+ E EKI + E++ + +RL + E
+Sbjct: 83 AEQAARQRAVVEQQREAARLEAERREQEKISILSAAEEARRKAEEEARAAEEAERL-RAE 141
+
+Query: 134 AENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDELPLERIPFP 190
+ E R ++ A+ S+A P A ASP PT P R P
+Sbjct: 142 EEARRREEEEAERRRAAEASQATAAPPAPAAAASPRAAMPAPTAAPARPGAAPARRTA-P 200
+
+Query: 191 TPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSA 229
+ P + S TL+ D + A A G G+A
+Sbjct: 201 VPPATSASETLRLRAARTGRD-EEEEASRPARRPGSGAA 238
+
+
+>sp|A6SCT6|DBP3_BOTFB ATP-dependent RNA helicase dbp3 OS=Botryotinia fuckeliana
+ (strain B05.10) GN=dbp3 PE=3 SV=1
+ Length = 592
+
+ Score = 103 (41.3 bits), Expect = 0.035, P = 0.034
+ Identities = 52/186 (27%), Positives = 84/186 (45%)
+
+Query: 32 DTSLNSAD--VKTQEVKP-EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE 88
+ DT LNS D +K K +EKK K++KS +++ P T P + + E KE RR
+Sbjct: 8 DTELNSGDNDIKISSKKSRKEKKDKKEKKS--KDVEEPTTESTPIE-VEVES-KEARRER 63
+
+Query: 89 RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAA 148
+ + L+ AQ + E++ E EK E I+ + +AE RL + L +
+Sbjct: 64 KRLKKEKKAQEA-EKETEEEEKSGVEAIEPASDANAAADAKAAKKAEKARL-KALKKEGK 121
+
+Query: 149 EVRGSRANTPMPGSPATASPTLTPTLFKQERD--ELPLERIP-FPTP---SLSD---YSP 199
+ E + + +PA+ +P T + ++ + LP I F T +++D S
+Sbjct: 122 EEKADSTKSIETAAPASVTPQQNGTTYTEDPNLSGLPQSEIDSFLTTHFITITDPLSTSA 181
+
+Query: 200 TLKPST 205
+ TL+P T
+Sbjct: 182 TLRPLT 187
+
+
+>sp|Q7PGE8|EIF3A_ANOGA Eukaryotic translation initiation factor 3 subunit A
+ OS=Anopheles gambiae GN=eIF3-S10 PE=3 SV=4
+ Length = 1121
+
+ Score = 106 (42.4 bits), Expect = 0.036, P = 0.035
+ Identities = 47/146 (32%), Positives = 65/146 (44%)
+
+Query: 35 LNSADVKTQEVKPEEKKP-AKKRKSWGQELPVP-KTNLPPR-------KRAK--TEDEKE 83
+ L DV Q++K E A+K K + Q L K L R +R K E E+E
+Sbjct: 754 LPDRDVYWQQLKNERGNQFAEKLKQFNQALEEERKRRLADRVVKRREERRMKWLKEKEEE 813
+
+Query: 84 QRRIERVLRNRAAAQTSRERKRLEMEK-LENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ +RRIE LR + E R+E E+ E +IQ E+ Q ++L+ E R ++
+Sbjct: 814 RRRIEEELRKQ-----KEEADRIERERRAEERRIQDEKNRQLAEKQLAIAEEVERRRREE 868
+
+Query: 143 LAQLAAEVRGSRANTPMPGSPATASP 168
+ L Q+ E G R P G PA P
+Sbjct: 869 LEQMK-EADGRRERRPAAG-PAEPKP 892
+
+
+>sp|O77788|NFM_BOVIN Neurofilament medium polypeptide OS=Bos taurus GN=NEFM
+ PE=1 SV=3
+ Length = 926
+
+ Score = 105 (42.0 bits), Expect = 0.037, P = 0.036
+ Identities = 51/193 (26%), Positives = 86/193 (44%)
+
+Query: 39 DVKTQEVKP-EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAA 97
+ +VK +E + EEK+ A++ ++ PV K P K + E E+E+ + E AA
+Sbjct: 488 EVKEEEAEEKEEKEEAEEEVVAAKKSPV-KATAPELKEEEGEKEEEEGQEEEEEEEEAAK 546
+
+Query: 98 QTSRERKRLEME-KLENEKIQMEQQNQFLLQRLSQ---MEAENNRLSQQLAQ-------L 146
+ E E E E E+ + E++ + + + EA+ + ++ A+ L
+Sbjct: 547 SDQAEEGGSEKEGSSEKEEGEQEEEGETEAEGEGEEAAAEAKEEKKMEEKAEEVAPKEEL 606
+
+Query: 147 AAEVR---GSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKP 203
+ AAE + +A +P+ SP T SPT K + P + P ++ SPT K
+Sbjct: 607 AAEAKVEKPEKAKSPVAKSPTTKSPTAKSPEAKSPEAKSPTAKSPTAKSPVAK-SPTAK- 664
+
+Query: 204 STLAESSDVAQHP 216
+ S A+S + A+ P
+Sbjct: 665 SPEAKSPE-AKSP 676
+
+
+>sp|Q9JTB5|IF2_NEIMA Translation initiation factor IF-2 OS=Neisseria
+ meningitidis serogroup A GN=infB PE=3 SV=1
+ Length = 962
+
+ Score = 105 (42.0 bits), Expect = 0.038, P = 0.038
+ Identities = 41/169 (24%), Positives = 69/169 (40%)
+
+Query: 17 ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR- 75
+ A PA++ P T + A+T+ +A+ K E EK A K S P K P +R
+Sbjct: 151 AKPAAQKP--TEAKAETAPVAAETKPAEESKAEKAQADKMPSKKPAEPKEKAAKPKHERN 208
+
+Query: 76 AKTEDEKEQRRI------ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ K +D K+ + + V+ AQ E +R + E + E+Q + +
+Sbjct: 209 GKGKDAKKPAKPAAPAVPQPVVSAEEQAQRDEEARRAAALRAHQEALLKEKQERQARREA 268
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQE 178
+ + +AE + Q A+ + A P +PA + + P K+E
+Sbjct: 269 MKQQAEQQAKAAQEAKTGRQRPAKPAEKPQAAAPAVENKPVNPAKAKKE 317
+
+
+>sp|Q9JYD2|IF2_NEIMB Translation initiation factor IF-2 OS=Neisseria
+ meningitidis serogroup B GN=infB PE=3 SV=1
+ Length = 962
+
+ Score = 105 (42.0 bits), Expect = 0.038, P = 0.038
+ Identities = 41/169 (24%), Positives = 69/169 (40%)
+
+Query: 17 ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR- 75
+ A PA++ P T + A+T+ +A+ K E EK A K S P K P +R
+Sbjct: 151 AKPAAQKP--TEAKAETAPVAAETKPAEESKAEKAQADKMPSEKPAEPKEKAAKPKHERN 208
+
+Query: 76 AKTEDEKEQRRI------ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ K +D K+ + + V+ AQ E +R + E + E+Q + +
+Sbjct: 209 GKGKDAKKPAKPAAPAVPQPVVSAEEQAQRDEEARRAAALRAHQEALLKEKQERQARREA 268
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQE 178
+ + +AE + Q A+ + A P +PA + + P K+E
+Sbjct: 269 MKQQAEQQAKAAQEAKTGRQRPAKPAEKPQAAAPAVENKPVNPAKAKKE 317
+
+
+>sp|A1KV51|IF2_NEIMF Translation initiation factor IF-2 OS=Neisseria
+ meningitidis serogroup C / serotype 2a (strain ATCC 700532 / FAM18)
+ GN=infB PE=3 SV=1
+ Length = 962
+
+ Score = 105 (42.0 bits), Expect = 0.038, P = 0.038
+ Identities = 41/169 (24%), Positives = 69/169 (40%)
+
+Query: 17 ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR- 75
+ A PA++ P T + A+T+ +A+ K E EK A K S P K P +R
+Sbjct: 151 AKPAAQKP--TEAKAETAPVAAETKPAEESKAEKAQADKMPSKKPAEPKEKAAKPKHERN 208
+
+Query: 76 AKTEDEKEQRRI------ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ K +D K+ + + V+ AQ E +R + E + E+Q + +
+Sbjct: 209 GKGKDAKKPAKPAAPAVPQPVVSAEEQAQRDEEARRAAALRAHQEALLKEKQERQARREA 268
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQE 178
+ + +AE + Q A+ + A P +PA + + P K+E
+Sbjct: 269 MKQQAEQQAKAAQEAKTGRQRPAKPAEKPQAAAPAVENKPVNPAKAKKE 317
+
+
+>sp|P0C5H8|KAPC_EMENI Putative transcription factor kapC OS=Emericella nidulans
+ GN=kapC PE=3 SV=1
+ Length = 278
+
+ Score = 98 (39.6 bits), Expect = 0.039, P = 0.038
+ Identities = 36/147 (24%), Positives = 65/147 (44%)
+
+Query: 17 ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRA 76
+ A P P T SP D + + + P + PA+ + E P
+Sbjct: 49 AQPHHLQPTATTSPRDQNNIDPAISGGAMLPPSQPPAQPEPTVEDETP------------ 96
+
+Query: 77 KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN 136
+ KT ++ +R +NRAA + R+RK + KLE E+++ + + + Q ++AEN
+Sbjct: 97 KTYGKRPLSTSKRAAQNRAAQRAFRQRKESYIRKLE-EQVK---EYEVMSQEYKALQAEN 152
+
+Query: 137 NRLSQQLAQLAAEVRGSRANTP-MPGS 162
+ +L + + L + + S+ P +PG+
+Sbjct: 153 YQLREYVINLQSRLLDSQGEVPELPGN 179
+
+
+>sp|Q80YR5|SAFB2_MOUSE Scaffold attachment factor B2 OS=Mus musculus GN=Safb2
+ PE=1 SV=2
+ Length = 991
+
+ Score = 105 (42.0 bits), Expect = 0.040, P = 0.039
+ Identities = 50/163 (30%), Positives = 81/163 (49%)
+
+Query: 5 MEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ-----EVKPEEK-KPAKKRKS 58
+ ME+T+ +D P V + S D S S D K++ ++ +K K ++R+
+Sbjct: 610 MERTVV-MDKSKGEPVISVKATSRSK-DRSSKSQDRKSEGREKRDILSFDKIKEQRERER 667
+
+Query: 59 WGQ-ELPVPKTNLPPRKRAKTEDEKEQR------RIE--RVLRNRAAAQTSR---ERKRL 106
+ Q E + +T R+R + + E+EQR R E R+ R R Q R ER+RL
+Sbjct: 668 QRQREREIRETE---RRREREQREREQRLDAFQERREKARLQRERMQLQCQRQRLERERL 724
+
+Query: 107 EMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE 149
+ E E+LE E++++E++ + QR+ + E L +Q QL AE
+Sbjct: 725 ERERLERERMRVERERRKEQQRIMR---EREELRRQQEQLRAE 764
+
+
+>sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodopus roborovskii GN=FOS PE=3
+ SV=1
+ Length = 381
+
+ Score = 100 (40.3 bits), Expect = 0.040, P = 0.039
+ Identities = 52/176 (29%), Positives = 73/176 (41%)
+
+Query: 74 KRAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ +R K E +E+E+RRI R RN+ AA R R+R + L+ E Q+E + L +
+Sbjct: 125 RRGKVEQLSPEEEEKRRIRRE-RNKMAAAKCRNRRRELTDTLQAETDQLEDEKSALQTEI 183
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLT---PTLFKQERDE---LP 183
+ + + E +L LA + + P + AS LT P E +E LP
+Sbjct: 184 ANLLKEKEKLEFILAAHRPACK-IPDDLGFPEDMSVASLDLTGGLPEAATPESEEAFSLP 242
+
+Query: 184 LERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS-VAGLEGDGSALPLFDL-GS 237
+ L P P SL AE D A S +G E ++P DL GS
+Sbjct: 243 LLNEPEPKTSLESVKSISSMELKAEPFDDFLFSASSRPSGSETTARSVPDMDLSGS 298
+
+
+>sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS=Xenopus tropicalis GN=mafa
+ PE=2 SV=1
+ Length = 289
+
+ Score = 98 (39.6 bits), Expect = 0.042, P = 0.041
+ Identities = 26/85 (30%), Positives = 47/85 (55%)
+
+Query: 83 EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ +Q+R R L+NR AQ+ R ++ + LE EK Q++ Q + L Q +S++ E + +
+Sbjct: 203 KQKR--RTLKNRGYAQSCRYKRVQQRHILETEKCQLQSQVEQLKQEVSRLAKERDLYKDK 260
+
+Query: 143 LAQLAAEVRGSRANTPMPGSPATAS 167
+ +LA+ +R + P G+P A+
+Sbjct: 261 YEKLASRSFTTRESPPQ-GNPGKAN 284
+
+
+>sp|P26038|MOES_HUMAN Moesin OS=Homo sapiens GN=MSN PE=1 SV=3
+ Length = 577
+
+ Score = 102 (41.0 bits), Expect = 0.043, P = 0.042
+ Identities = 26/103 (25%), Positives = 51/103 (49%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTNLPPR-KRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ EKK + + +++ K L R K+ + + +K Q+ +E R + R+R + E
+Sbjct: 326 EKKKREMAEKEKEKIEREKEELMERLKQIEEQTKKAQQELEEQTRRALELEQERKRAQSE 385
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV 150
+ EKL E+ + E+ + LLQ + +L+ ++A+L A +
+Sbjct: 386 AEKLAKERQEAEEAKEALLQASRDQKKTQEQLALEMAELTARI 428
+
+ Score = 101 (40.6 bits), Expect = 0.056, P = 0.055
+ Identities = 25/80 (31%), Positives = 45/80 (56%)
+
+Query: 66 PKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ P T + +A+ +EK Q+++ER A E+K+ EM + E EKI+ E++ L
+Sbjct: 297 PDTIEVQQMKAQAREEKHQKQMER-------AMLENEKKKREMAEKEKEKIEREKEE--L 347
+
+Query: 126 LQRLSQMEAENNRLSQQLAQ 145
+ ++RL Q+E + + Q+L +
+Sbjct: 348 MERLKQIEEQTKKAQQELEE 367
+
+
+>sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattus norvegicus GN=Hlf PE=2
+ SV=1
+ Length = 295
+
+ Score = 98 (39.6 bits), Expect = 0.044, P = 0.043
+ Identities = 39/151 (25%), Positives = 66/151 (43%)
+
+Query: 2 SCDMEKTMSSVDSLPA---TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKS 58
+ +C M+ + LPA TP+ P P + AD+ + E +KRK
+Sbjct: 142 NC-MQNPIRPGQLLPANRNTPSPIDPDTIQVPVGYEPDPADLALSSIPGPEMFDPRKRKF 200
+
+Query: 59 WGQEL-PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQ 117
+ +EL P P RK +D K+ + R +N AA+ SR+ +RL+ ++
+Sbjct: 201 SEEELKPQPMIK-KARKVFIPDDLKDDKYWARRRKNNMAAKRSRDARRLKENQIAIRASF 259
+
+Query: 118 MEQQNQFLLQRLSQMEAENNRLSQQLAQLAA 148
+ +E++N L Q ++ + E + LA+ A
+Sbjct: 260 LEKENSALRQEVADLRKELGKCKNILAKYEA 290
+
+
+>sp|A0JMT0|CA1AB_XENLA Chromatin assembly factor 1 subunit A-B OS=Xenopus
+ laevis GN=chaf1a-B PE=2 SV=2
+ Length = 885
+
+ Score = 104 (41.7 bits), Expect = 0.045, P = 0.044
+ Identities = 32/114 (28%), Positives = 56/114 (49%)
+
+Query: 29 SPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIE 88
+ S + SL+S DV+T P+ G+ +N ++ KT+D+ E+R+ E
+Sbjct: 216 SSSPVSLSSPDVQTGSKFTNGSSPSTSTTPTGKAT----SNKTSAEKKKTKDKAEKRQAE 271
+
+Query: 89 RVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ + R A + +R K L +K E E+ Q E+ + +R + +AE NRL ++
+Sbjct: 272 KEERE-CARREARAAKDLAKKKREGEREQREKDKKEKKEREDREKAEKNRLKEE 324
+
+ Score = 103 (41.3 bits), Expect = 0.058, P = 0.056
+ Identities = 47/206 (22%), Positives = 91/206 (44%)
+
+Query: 8 TMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPK 67
+ T S S TP + S A+ + ++ + EE++ A++ ++L K
+Sbjct: 234 TNGSSPSTSTTPTGKATSNKTS-AEKKKTKDKAEKRQAEKEERECARREARAAKDLAKKK 292
+
+Query: 68 TNLPPRKRAKTEDEKEQRRI-ERVLRNRAAAQTSRER-KRLEMEKLENEKIQMEQQNQFL 125
+ +R K + EK++R E+ +NR + +E+ + LE ++ E K + E++ +
+Sbjct: 293 REGEREQREKDKKEKKEREDREKAEKNRLKEEKKKEKLEALEAKQEEKRKKEEEKRQKEE 352
+
+Query: 126 LQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPM-PGSPATASPTLTPTLFKQERDELPL 184
+ +RL + E R+ + A++ ++ + TP P + A + P K+ PL
+Sbjct: 353 EKRLKE---EEKRIKAEKAEITRFLQ--KPKTPQAPKTFARSCGKFAPFEIKKGMALAPL 407
+
+Query: 185 ERIPFPTPSLSDYSPTLKPSTLAESS 210
+ RI F + + L+ T +ESS
+Sbjct: 408 CRIDFEQEASEELDIFLQEQT-SESS 432
+
+
+>sp|Q6Y7W6|PERQ2_HUMAN PERQ amino acid-rich with GYF domain-containing protein
+ 2 OS=Homo sapiens GN=GIGYF2 PE=1 SV=1
+ Length = 1299
+
+ Score = 112 (44.5 bits), Expect = 0.045, Sum P(2) = 0.044
+ Identities = 40/140 (28%), Positives = 73/140 (52%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ EE++ ++ + +EL + K K A+ E+E+ QRR+E NR + R R E
+Sbjct: 824 EERRREEEERRKQEEL-LRKQEEEAAKWAR-EEEEAQRRLEE---NRLRMEEEAARLRHE 878
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEA----ENNRLSQQLAQL---AAEVRGSRANTPMP 160
+ E+ + +++++++Q + + QR Q EA + + QQLAQ+ ++ G ++NT
+Sbjct: 879 EEERKRKELEVQRQKELMRQRQQQQEALRRLQQQQQQQQLAQMKLPSSSTWGQQSNTTAC 938
+
+Query: 161 GSPATASPTLTPTLFKQERD 180
+ S AT S L ++ER+
+Sbjct: 939 QSQATLSLAEIQKL-EEERE 957
+
+ Score = 39 (18.8 bits), Expect = 0.045, Sum P(2) = 0.044
+ Identities = 9/33 (27%), Positives = 18/33 (54%)
+
+Query: 1 MSCDMEKTMSSVDSLPATPASEVPVLTVSPADT 33
+ M D+++ +S + S A+P +P +P+ T
+Sbjct: 429 MVADVQQPLSQIPSDTASPLLILPPPVPNPSPT 461
+
+
+>sp|Q8WYK2|JDP2_HUMAN Jun dimerization protein 2 OS=Homo sapiens GN=JDP2 PE=1
+ SV=1
+ Length = 163
+
+ Score = 92 (37.4 bits), Expect = 0.046, P = 0.045
+ Identities = 36/123 (29%), Positives = 56/123 (45%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKR---AKTE-DEKEQRRIERVLRNRAAAQTSRER 103
+ EE K A R P+ + KR K+E DE+E+RR R +N+ AA R +
+Sbjct: 33 EELKYADIRNLGAMIAPLHFLEVKLGKRPQPVKSELDEEEERRKRRREKNKVAAARCRNK 92
+
+Query: 104 KRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE--VRGSRANTP-MP 160
+ K+ E L+ E ++E N L ++ +++ E +L L + VR TP
+Sbjct: 93 KKERTEFLQRESERLELMNAELKTQIEELKQERQQLILMLNRHRPTCIVRTDSVKTPESE 152
+
+Query: 161 GSP 163
+ G+P
+Sbjct: 153 GNP 155
+
+
+>sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive element-binding protein 5 OS=Mus
+ musculus GN=Creb5 PE=2 SV=3
+ Length = 357
+
+ Score = 99 (39.9 bits), Expect = 0.047, P = 0.046
+ Identities = 28/92 (30%), Positives = 49/92 (53%)
+
+Query: 52 PAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKL 111
+ PA ++ Q + P+ R+R ED E+RR + + RNRAAA R+++++ + L
+Sbjct: 194 PATQQMQPTQTIQPPQPTGGRRRRVVDEDPDERRR-KFLERNRAAATRCRQKRKVWVMSL 252
+
+Query: 112 ENEKIQMEQQNQFLLQRLSQMEAENNRLSQQL 143
+ E + ++ Q N L +S ++ E +L Q L
+Sbjct: 253 EKKAEELTQTNMQLQNEVSMLKNEVAQLKQLL 284
+
+
+>sp|Q9C0A6|SETD5_HUMAN SET domain-containing protein 5 OS=Homo sapiens GN=SETD5
+ PE=1 SV=2
+ Length = 1442
+
+ Score = 106 (42.4 bits), Expect = 0.047, P = 0.046
+ Identities = 45/204 (22%), Positives = 87/204 (42%)
+
+Query: 2 SCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQ 61
+ +C ++K + LP P P L A+T A K E++ + + + Q
+Sbjct: 410 NCPIQKRNPNATELPLLPPP--PSLPTIGAETRRRKARRKELEMEQQNEASEENNDQQSQ 467
+
+Query: 62 ELPVPKTNLPPRKRAKTEDEKEQRRIERVL---RNRAAAQTSRERKRLE--MEKLENEKI 116
+ E+P T + +EK + E V+ N A ++ +RE +++E M EN +
+Sbjct: 468 EVPEKVTVSSDHEEVDNPEEKPEEEKEEVIDDQENLAHSRRTREDRKVEAIMHAFENLEK 527
+
+Query: 117 QMEQQNQFLLQRLSQME----AENNRLSQQLAQLA--AEVRGSRANTPMPGSPATASPTL 170
+ + ++++Q L Q S +E + ++ A +EV S +N +P +P +
+Sbjct: 528 RKKRRDQPLEQSNSDVEITTTTSETPVGEETKTEAPESEVSNSVSNVTIPSTPQSVGVN- 586
+
+Query: 171 TPTLFKQERDELPLER-IPFPTPS 193
+ T + ++ E+ +P P P+
+Sbjct: 587 --TRRSSQAGDIAAEKLVPKPPPA 608
+
+
+>sp|Q92575|UBXN4_HUMAN UBX domain-containing protein 4 OS=Homo sapiens GN=UBXN4
+ PE=1 SV=2
+ Length = 508
+
+ Score = 101 (40.6 bits), Expect = 0.047, P = 0.046
+ Identities = 58/224 (25%), Positives = 98/224 (43%)
+
+Query: 22 EVPVLTVSPADTSLN--SADVKTQEVKPE---EKKPAKKRKSWGQELPVPKTNLPPRKRA 76
+ E+P + + +DT+ SA T +P +++PA+ + L L R+
+Sbjct: 156 EIPPTSDTKSDTATGGESAGHATSSQEPSGCSDQRPAEDLNIRVERLT---KKLEERREE 212
+
+Query: 77 KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN 136
+ K ++E EQR I++ + R + + KR + E+L K +E++N+ ++ A
+Sbjct: 213 KRKEE-EQREIKKEIERRKTGKEMLDYKRKQEEELT--KRMLEERNR----EKAEDRAAR 265
+
+Query: 137 NRLSQQLAQLAAEVRGSR-ANTPMPGSPATASPTLTPTL---FKQE---RDELPLERIPF 189
+ R+ QQ+A AE R +R A T A A+ L K+E R+ + RI F
+Sbjct: 266 ERIKQQIALDRAE-RAARFAKTKEEVEAAKAAALLAKQAEMEVKRESYARERSTVARIQF 324
+
+Query: 190 PTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLF 233
+ P S ++ PS A + Q A +V G+ S +F
+Sbjct: 325 RLPDGSSFTNQF-PSD-APLEEARQFAAQTVGNTYGNFSLATMF 366
+
+
+>sp|Q5R4I3|UBXN4_PONAB UBX domain-containing protein 4 OS=Pongo abelii GN=UBXN4
+ PE=2 SV=1
+ Length = 508
+
+ Score = 101 (40.6 bits), Expect = 0.047, P = 0.046
+ Identities = 58/224 (25%), Positives = 98/224 (43%)
+
+Query: 22 EVPVLTVSPADTSLN--SADVKTQEVKPE---EKKPAKKRKSWGQELPVPKTNLPPRKRA 76
+ E+P + + +DT+ SA T +P +++PA+ + L L R+
+Sbjct: 156 EIPPTSDTKSDTATGGESAGHATSSQEPSGCSDQRPAEDLNIRVERLT---KKLEERREE 212
+
+Query: 77 KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN 136
+ K ++E EQR I++ + R + + KR + E+L K +E++N+ ++ A
+Sbjct: 213 KRKEE-EQREIKKEIERRKTGKEMLDYKRKQEEELT--KRMLEERNR----EKAEDRAAR 265
+
+Query: 137 NRLSQQLAQLAAEVRGSR-ANTPMPGSPATASPTLTPTL---FKQE---RDELPLERIPF 189
+ R+ QQ+A AE R +R A T A A+ L K+E R+ + RI F
+Sbjct: 266 ERIKQQIALDRAE-RAARFAKTKEEVEAAKAAALLAKQAEMEVKRESYARERSTVARIQF 324
+
+Query: 190 PTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLF 233
+ P S ++ PS A + Q A +V G+ S +F
+Sbjct: 325 RLPDGSSFTNQF-PSD-APLEEARQFAAQTVGNTYGNFSLATMF 366
+
+
+>sp|P14233|TGA1B_TOBAC TGACG-sequence-specific DNA-binding protein TGA-1B
+ (Fragment) OS=Nicotiana tabacum GN=TGA1B PE=2 SV=1
+ Length = 242
+
+ Score = 96 (38.9 bits), Expect = 0.049, P = 0.048
+ Identities = 25/63 (39%), Positives = 40/63 (63%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRL 139
+ DE E++R R++RNR +AQ SR+RK+ +E+LE++ M Q L +++ + AEN L
+Sbjct: 181 DEDEKKRA-RLVRNRESAQLSRQRKKHYVEELEDKVRIMHSTIQDLNAKVAYIIAENATL 239
+
+Query: 140 SQQ 142
+ Q
+Sbjct: 240 KTQ 242
+
+
+>sp|A9M1D5|IF2_NEIM0 Translation initiation factor IF-2 OS=Neisseria
+ meningitidis serogroup C (strain 053442) GN=infB PE=3 SV=1
+ Length = 962
+
+ Score = 104 (41.7 bits), Expect = 0.049, P = 0.048
+ Identities = 41/169 (24%), Positives = 69/169 (40%)
+
+Query: 17 ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR- 75
+ A PA++ P T + A+T+ +A+ K E EK A K S P K P +R
+Sbjct: 151 AKPAAQKP--TEAKAETAPVAAETKPAEESKAEKAQADKMPSKKPAEPKEKAAKPKHERN 208
+
+Query: 76 AKTEDEKEQRRI------ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ K +D K+ + + V+ AQ E +R + E + E+Q + +
+Sbjct: 209 GKGKDAKKPAKPAAPAVPQPVVSAEEQAQRDEEARRAAALRAHQEALLKEKQERQARREA 268
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQE 178
+ + +AE + Q A+ + A P +PA + + P K+E
+Sbjct: 269 MKQQAEQQAKAAQEAKTGRQRPAKPAEKPQAAAPALENKPVNPAKAKKE 317
+
+
+>sp|Q554P0|BZPJ_DICDI Probable basic-leucine zipper transcription factor J
+ OS=Dictyostelium discoideum GN=bzpJ PE=3 SV=1
+ Length = 787
+
+ Score = 103 (41.3 bits), Expect = 0.050, P = 0.049
+ Identities = 27/99 (27%), Positives = 52/99 (52%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRL 139
+ +EKE ++ R+++NR A SR R+++ +E +E + + Q + +L+ ++ EN L
+Sbjct: 546 EEKELKKQRRLVKNREYASQSRSRRKIYVENIETKLQKTNQDCASIKSQLNSVKEENKAL 605
+
+Query: 140 SQQLAQLAAEVRGSRANTPMPG---SPATASPTLTPTLF 175
+ +QL L ++ + + G SP + T + TLF
+Sbjct: 606 KKQLYSLTNTLKSNPSLAEAFGKIFSPIGNNKTSSATLF 644
+
+
+>sp|Q8N9W4|GG6L2_HUMAN Golgin subfamily A member 6-like protein 2 OS=Homo
+ sapiens PE=2 SV=2
+ Length = 650
+
+ Score = 102 (41.0 bits), Expect = 0.051, P = 0.049
+ Identities = 27/105 (25%), Positives = 56/105 (53%)
+
+Query: 43 QEVKPEEKKPAKKR-KSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSR 101
+ +E++ +EKK K+ K W QE L ++ E E++ RR E+ LR + +
+Sbjct: 279 EELREQEKKIRKQEEKMWRQE-----ERLREQEGKMREQEEKMRRQEKRLREQEKELREQ 333
+
+Query: 102 ERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL 146
+ E++ E +KL ++ QM++Q + + ++ +M + ++ +Q +L
+Sbjct: 334 EKELREQKKLREQEEQMQEQEEKMWEQEEKMREQEEKMWRQEERL 378
+
+ Score = 85 (35.0 bits), Expect = 3.7, P = 0.98
+ Identities = 25/93 (26%), Positives = 46/93 (49%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRL- 106
+ EEK ++ K W QE + + R++ + ++E+R E+ R R + RE++++
+Sbjct: 361 EEKMREQEEKMWRQEERLWEQEKQMREQEQKMRDQEERMWEQDERLREKEERMREQEKMW 420
+
+Query: 107 -EMEKLENEKIQMEQQNQFLLQRLSQMEAENNR 138
+ ++EK+ EK EQ+ + Q E E R
+Sbjct: 421 EQVEKMREEKKMQEQEKKTRDQEEKMQEEERIR 453
+
+ Score = 84 (34.6 bits), Expect = 4.8, P = 0.992
+ Identities = 21/108 (19%), Positives = 54/108 (50%)
+
+Query: 35 LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNR 94
+ L + K +E + + ++ K+ + +EL + L +K+ + ++E+ Q + E++
+Sbjct: 302 LREQEGKMREQEEKMRRQEKRLREQEKELREQEKELREQKKLREQEEQMQEQEEKMWEQE 361
+
+Query: 95 AAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ + E+ + E+L ++ QM +Q Q + + +M ++ RL ++
+Sbjct: 362 EKMREQEEKMWRQEERLWEQEKQMREQEQKMRDQEERMWEQDERLREK 409
+
+ Score = 82 (33.9 bits), Expect = 7.9, P = 0.9996
+ Identities = 26/108 (24%), Positives = 58/108 (53%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQ--ELPVPKTNLPPRKRAKTEDEK--EQRRI-ERVLRNRAAA 97
+ + ++ +E++ ++ K W Q ++ K K+ + ++EK E+ RI ER + R
+Sbjct: 404 ERLREKEERMREQEKMWEQVEKMREEKKMQEQEKKTRDQEEKMQEEERIREREKKMREEE 463
+
+Query: 98 QTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEA---ENNRLSQQ 142
+ +T RE++ +M+K E E + +++ ++ QRL + + E ++ +Q
+Sbjct: 464 ETMREQEE-KMQKQE-ENMWEQEEKEWQQQRLPEQKEKLWEQEKMQEQ 509
+
+
+>sp|Q8N300|CCD23_HUMAN Coiled-coil domain-containing protein 23 OS=Homo sapiens
+ GN=CCDC23 PE=2 SV=1
+ Length = 66
+
+ Score = 77 (32.2 bits), Expect = 0.051, P = 0.050
+ Identities = 17/54 (31%), Positives = 33/54 (61%)
+
+Query: 71 PPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQF 124
+ PP ++ KT+ ++ R+E+ + ++A Q ++R+R E+ L ++EQQ QF
+Sbjct: 3 PPARKEKTKVKESVSRVEKA-KQKSAQQELKQRQRAEIYALNRVMTELEQQ-QF 54
+
+
+>sp|O81025|P2A03_ARATH Putative protein PHLOEM PROTEIN 2-LIKE A3 OS=Arabidopsis
+ thaliana GN=PP2A3 PE=2 SV=1
+ Length = 463
+
+ Score = 100 (40.3 bits), Expect = 0.054, P = 0.052
+ Identities = 38/120 (31%), Positives = 65/120 (54%)
+
+Query: 41 KTQEVKPEEKKPAKKR-KSWGQELP-VPKTNLPPRKRAKTEDEKEQRRIERVL--RNRAA 96
+ K ++ K E+ K R ++ G++ +P T RK K E+++ R ERV+ +NRA
+Sbjct: 174 KDEKKKVEQVKQLLARVENVGEQTGGIPYTYQLHRK-IKEENDERLREEERVIESKNRAE 232
+
+Query: 97 AQTSRERKRLEMEKLENEKIQMEQ-QNQFLL------QRLSQMEAENNRLSQQLAQLAAE 149
+ A+ + ++ L MEK EK+QME+ +N+ L+ ++L + E NR +LA + E
+Sbjct: 233 AELAEMQQNLLMEK---EKLQMEEAKNKQLIAQAEANEKLMEQERAKNRAETELAAVMVE 289
+
+
+>sp|O35763|MOES_RAT Moesin OS=Rattus norvegicus GN=Msn PE=1 SV=3
+ Length = 577
+
+ Score = 101 (40.6 bits), Expect = 0.056, P = 0.055
+ Identities = 26/103 (25%), Positives = 51/103 (49%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTNLPPR-KRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ EKK + + +++ K L + K+ + + +K Q+ +E R + R+R + E
+Sbjct: 326 EKKKRELAEKEKEKIEREKEELMEKLKQIEEQTKKAQQELEEQTRRALELEQERKRAQSE 385
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV 150
+ EKL E+ + E+ + LLQ + +L+ ++A+L A V
+Sbjct: 386 AEKLAKERQEAEEAKEALLQASRDQKKTQEQLASEMAELTARV 428
+
+ Score = 95 (38.5 bits), Expect = 0.26, P = 0.23
+ Identities = 23/80 (28%), Positives = 45/80 (56%)
+
+Query: 66 PKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ P T + +A+ +EK Q+++ER L E+K+ E+ + E EKI+ E++ L
+Sbjct: 297 PDTIEVQQMKAQAREEKHQKQMERAL-------LENEKKKRELAEKEKEKIEREKEE--L 347
+
+Query: 126 LQRLSQMEAENNRLSQQLAQ 145
+ +++L Q+E + + Q+L +
+Sbjct: 348 MEKLKQIEEQTKKAQQELEE 367
+
+ Score = 81 (33.6 bits), Expect = 8.9, P = 0.9999
+ Identities = 29/99 (29%), Positives = 49/99 (49%)
+
+Query: 73 RKRAKTEDEK-EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ-NQF-LLQRL 129
+ RKRA++E EK + R E A Q SR++K+ + E+L +E ++ + +Q + ++
+Sbjct: 379 RKRAQSEAEKLAKERQEAEEAKEALLQASRDQKKTQ-EQLASEMAELTARVSQLEMARKK 437
+
+Query: 130 SQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASP 168
+ + EAE Q+ Q E + T M +P A P
+Sbjct: 438 KESEAEECHQKAQMVQEDLEKTRAELKTAM-STPHVAEP 475
+
+
+>sp|Q9Z220|TSG10_RAT Testis-specific gene 10 protein OS=Rattus norvegicus
+ GN=Tsga10 PE=1 SV=2
+ Length = 712
+
+ Score = 102 (41.0 bits), Expect = 0.057, P = 0.055
+ Identities = 52/182 (28%), Positives = 76/182 (41%)
+
+Query: 44 EVKPEEKKPAKKRKSWGQELP-----VPKTNLPPRKRAKTEDEKEQRRIE-RVLRNRAAA 97
+ +VK E + +KK EL V TNL K +E +E L+N +
+Sbjct: 361 KVKQENQALSKKLNDTHNELSDIKQKVQDTNLEVNKLKNILKSEESTNLEVNKLKNILKS 420
+
+Query: 98 QTSRERKRLEM--------EKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE 149
+ + S R+ +E E EN+ Q+E +N L L EAE NRL +++ L E
+Sbjct: 421 EESENRQIMEQLRKANEDAENWENKARQLEAENNTLKLELITAEAEGNRLKEKVDALNRE 480
+
+Query: 150 VRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPS-LSDYSPTLKPSTLAE 208
+ V N A TL +L K E + L+++ F S L+D S T + +
+Sbjct: 481 VE-QHLNAERSYKSQIA--TLHKSLVKMEEE---LQKVQFEKVSALADLSSTRELCIKLD 534
+
+Query: 209 SS 210
+ SS
+Sbjct: 535 SS 536
+
+
+>sp|Q32N93|INCEB_XENLA Inner centromere protein B OS=Xenopus laevis GN=incenp-B
+ PE=2 SV=1
+ Length = 892
+
+ Score = 103 (41.3 bits), Expect = 0.058, P = 0.056
+ Identities = 38/144 (26%), Positives = 70/144 (48%)
+
+Query: 39 DVKTQEVKPEEKKPAKKRKSWGQELPVPKTNL-PPRKRAKTEDEKE---QRRIERVLRNR 94
+ +++ Q+ E K+ A++ + +++ K L R+R + E EK QR +ER + +
+Sbjct: 651 EMERQKKMAEAKRLAEQERE--RQVFAEKERLRAERERERIEREKALQLQRELERAAQEK 708
+
+Query: 95 AAAQTSRE--RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRG 152
+ + E +KR + ++LE E+++ + Q + +RL E + + +Q A AA V
+Sbjct: 709 EQQRREAEERKKREQQQRLEQERLERLRTEQEV-KRLQ--EEQQRKAKEQAAAAAAPVMN 765
+
+Query: 153 SRANTPMPGSPATASPTLTPTLFK 176
+ M SPA S +TP +K
+Sbjct: 766 --VTVDMQNSPACESYEMTPKSYK 787
+
+ Score = 91 (37.1 bits), Expect = 1.2, P = 0.70
+ Identities = 26/86 (30%), Positives = 52/86 (60%)
+
+Query: 67 KTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQF-- 124
+ K N P + K+E EKE++R++ LR + A+ R++K E +K + E++++ ++++
+Sbjct: 502 KRNTPLKPDPKSE-EKERQRLD-ALRKKEEAELQRKQKIEEGKKRKQEELKLRREDRLRK 559
+
+Query: 125 LLQ---RLSQMEAENNR-LSQQLAQL 146
+ +LQ R+ Q+E E + Q+ AQ+
+Sbjct: 560 VLQARERVEQLEEEKKKKFEQKFAQI 585
+
+ Score = 87 (35.7 bits), Expect = 3.3, P = 0.96
+ Identities = 32/132 (24%), Positives = 61/132 (46%)
+
+Query: 46 KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKR 105
+ K E++ +++K + + + + A+ E + +R ER+ R +A Q RE +R
+Sbjct: 645 KKREEEEMERQKKMAEAKRLAEQERERQVFAEKERLRAERERERIEREKAL-QLQRELER 703
+
+Query: 106 LEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPAT 165
+ EK + + E++ + QRL Q E R Q++ +L E + +A + A
+Sbjct: 704 AAQEKEQQRREAEERKKREQQQRLEQERLERLRTEQEVKRLQEEQQ-RKAKEQ---AAAA 759
+
+Query: 166 ASPTLTPTLFKQ 177
+ A+P + T+ Q
+Sbjct: 760 AAPVMNVTVDMQ 771
+
+ Score = 83 (34.3 bits), Expect = 9.0, P = 0.9999
+ Identities = 34/129 (26%), Positives = 62/129 (48%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTN---LPPRKRAKTEDEKEQRRIE--RVLRNRA 95
+ K +EV+ K+ + RK +++ + L +KR + E E++++ E R+
+Sbjct: 610 KQEEVECRRKQEEEARKLKAKQMEEEERRHQELLQKKREEEEMERQKKMAEAKRLAEQER 669
+
+Query: 96 AAQTSRERKRL----EMEKLENEK-IQMEQQNQFLLQRLSQM--EAENNRLSQQLAQLAA 148
+ Q E++RL E E++E EK +Q++++ + Q Q EAE + +Q +L
+Sbjct: 670 ERQVFAEKERLRAERERERIEREKALQLQRELERAAQEKEQQRREAEERKKREQQQRLEQ 729
+
+Query: 149 EVRGSRANT 157
+ E R R T
+Sbjct: 730 E-RLERLRT 737
+
+
+>sp|Q95XZ5|NPBL_CAEEL Nipped-B-like protein pqn-85 OS=Caenorhabditis elegans
+ GN=pqn-85 PE=2 SV=2
+ Length = 2203
+
+ Score = 107 (42.7 bits), Expect = 0.058, P = 0.056
+ Identities = 58/197 (29%), Positives = 94/197 (47%)
+
+Query: 32 DTSLNSADVKTQEVK----PEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRI 87
+ D+S+ S+ K E + +E+K ++RK QEL + KR + +EK
+Sbjct: 177 DSSVISSHQKLYEEQCRQIEKERKEQEERKR-KQELEEQRKRNEELKRLRIAEEKRLLEE 235
+
+Query: 88 ERVLRNRAAAQTSRERKRLE-MEKLENEK---IQMEQQNQFLLQRLSQMEAENNRLSQQL 143
+ ++ LR + + E KRLE +LE+E+ +E Q Q +LQ+ M+AE N+ ++
+Sbjct: 236 QQRLREQMERERLAEIKRLEEAARLEDERRIAADIEAQKQAMLQK---MQAEQNKHIAEV 292
+
+Query: 144 AQLAAEV--RGSRANTPMPGSPATASPTLTPTLFKQERDELP--LERIPFPTPSLSDYS- 198
+ + +E+ R +R + PM TL T F LP L+ IPFP S+ D +
+Sbjct: 293 ERQRSELEERFARVSQPM---------TLVGTHF------LPNFLDMIPFPYESMVDSTL 337
+
+Query: 199 PTL----KPSTLAESSD 211
+ P + + S + ES D
+Sbjct: 338 PQVFDMERDSAILESCD 354
+
+
+>sp|Q6CT90|EIF3A_KLULA Eukaryotic translation initiation factor 3 subunit A
+ OS=Kluyveromyces lactis GN=TIF32 PE=3 SV=1
+ Length = 925
+
+ Score = 103 (41.3 bits), Expect = 0.061, P = 0.059
+ Identities = 28/102 (27%), Positives = 55/102 (53%)
+
+Query: 74 KRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ---NQFLLQRLS 130
+ K A+ E+ K+QR IE+V + R A+ + + +E E E E + E++ + +R++
+Sbjct: 801 KEAQLEEAKKQR-IEQVRKERYEAKVAEIQAAIEAEAAEKEALAKEEELAKRRAERERIN 859
+
+Query: 131 QMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATA-SPTLT 171
+ + E R +++ +L + GS ++P+P +P A +P T
+Sbjct: 860 KERDEIARKQREIEELLEKKNGSSRSSPVPSTPTPAPAPAQT 901
+
+
+>sp|Q5F489|TAF3_CHICK Transcription initiation factor TFIID subunit 3 OS=Gallus
+ gallus GN=TAF3 PE=2 SV=1
+ Length = 930
+
+ Score = 103 (41.3 bits), Expect = 0.061, P = 0.059
+ Identities = 60/236 (25%), Positives = 98/236 (41%)
+
+Query: 4 DMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPE---EKKPAKKRKSWG 60
+ D EK P S P L + P + SL T P P K +
+Sbjct: 634 DKEKVKDKSKEDKIKPPS-AP-LVLPPKEMSLPLFSTPTAMRLPSMLPSLSPMLPEKLF- 690
+
+Query: 61 QELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ 120
+ ++ PK +K K + E+E+ + E+ +++ + RE+K E EK ++EKI++E
+Sbjct: 691 EDKEKPKEKKKDKKEKKKKKEREKDK-EKEKKDKEKERKEREKKEKEKEKHKHEKIKVEP 749
+
+Query: 121 ---QNQFLLQRLS-QMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFK 176
+ ++ RL+ ++ A +++ A E + + TP+ P T P +P
+Sbjct: 750 VVPAPSPVIPRLTLRVGAGQDKIVISKVVPAPEAKPA---TPV-SRPKTPPPVPSPV--- 802
+
+Query: 177 QERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPL 232
+ P+ P P P + PT+ P+ L +S PAVS AG GS P+
+Sbjct: 803 ----PAPVHVTPPPAPVPAPPQPTVSPALLPPAS-----PAVSAAG----GSKAPV 845
+
+
+>sp|P42775|GBF2_ARATH G-box-binding factor 2 OS=Arabidopsis thaliana GN=GBF2
+ PE=1 SV=1
+ Length = 360
+
+ Score = 98 (39.6 bits), Expect = 0.061, P = 0.060
+ Identities = 29/81 (35%), Positives = 44/81 (54%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM--EAENN 137
+ +EKE +R +R NR +A+ SR RK+ E E+L + + +N L +L Q+ E+E
+Sbjct: 246 NEKEVKREKRKQSNRESARRSRLRKQAETEQLSVKVDALVAENMSLRSKLGQLNNESEKL 305
+
+Query: 138 RLSQQ--LAQLAAEVRGSRAN 156
+ RL + L QL A+ G N
+Sbjct: 306 RLENEAILDQLKAQATGKTEN 326
+
+
+>sp|Q55EQ3|Y9086_DICDI Uncharacterized abhydrolase domain-containing protein
+ DDB_G0269086 OS=Dictyostelium discoideum GN=DDB_G0269086 PE=1 SV=2
+ Length = 937
+
+ Score = 103 (41.3 bits), Expect = 0.062, P = 0.060
+ Identities = 41/145 (28%), Positives = 66/145 (45%)
+
+Query: 18 TPASEVPVLTVSPADTSLNSADVKT-QEVKP--EEKKPAKKRKSWGQELPVPKTNLPPRK 74
+ +P+S + T S T+ + +E KP EE KP + PV + + P +
+Sbjct: 283 SPSSNINTTTTSTTTTTTTTTSSPVVEESKPVVEESKPVVEESK-----PVVEESKPVVE 337
+
+Query: 75 RAKTE----DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLS 130
+ +K E D KE+ ER+ + AAA+ +ER +EK E E++ E + + +
+Sbjct: 338 ESKPEPVVDDSKEKEEKERLEKEEAAAKLEKER----LEKEEAERVAKEAEEKRIKD--- 390
+
+Query: 131 QMEAENN-RLSQQLAQLAAEVRGSR 154
+ + EA+ N QQ A AA+ R
+Sbjct: 391 EKEAQENLEKQQQEAAAAAQAEKER 415
+
+ Score = 102 (41.0 bits), Expect = 0.079, P = 0.076
+ Identities = 44/176 (25%), Positives = 80/176 (45%)
+
+Query: 13 DSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP 72
+ +S P S+ PV+ S + ++ + K ++ + E+++ A K + E +
+Sbjct: 324 ESKPVVEESK-PVVEESKPEPVVDDSKEKEEKERLEKEEAAAKLEKERLEKEEAERVAKE 382
+
+Query: 73 RKRAKTEDEKE-QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ + + +DEKE Q +E+ + AAA E++RLE E E +K++ E+ + +
+Sbjct: 383 AEEKRIKDEKEAQENLEKQ-QQEAAAAAQAEKERLEKE--EADKLEKERLEA---EAAAA 436
+
+Query: 132 MEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERI 187
+ +AE RL + A AA+ R + A A L K+E D L E++
+Sbjct: 437 AQAEKERLEAEAAA-AAQAEKER----LEAEAAAAVQAEKERLEKEEADRLEKEKL 487
+
+ Score = 90 (36.7 bits), Expect = 1.6, P = 0.80
+ Identities = 39/125 (31%), Positives = 58/125 (46%)
+
+Query: 67 KTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRER-KRLEMEKLENEKIQMEQQN-QF 124
+ K L A + EKE+ E AAAQ +ER ++ E E+LE EK++ E Q
+Sbjct: 639 KERLEAEAAAAAQAEKEKLEAEA----EAAAQAEKERLEKEEAERLEKEKLEAEAAAAQA 694
+
+Query: 125 LLQRLSQMEAENNRLSQ-QLAQLAAEVRGSRANTP-MPGSPATASPTLTPTLFKQERDEL 182
+ +RL EAE +Q + +L AE ++A + A A+ L K+E + L
+Sbjct: 695 EKERL---EAEAAAAAQAEKEKLEAEAAAAQAEKERLEAEAAAAAQAEKERLEKEETERL 751
+
+Query: 183 PLERI 187
+ ER+
+Sbjct: 752 EKERL 756
+
+
+>sp|Q54LU8|Y8646_DICDI Probable serine/threonine-protein kinase DDB_G0286465
+ OS=Dictyostelium discoideum GN=DDB_G0286465 PE=3 SV=1
+ Length = 1221
+
+ Score = 98 (39.6 bits), Expect = 0.062, Sum P(2) = 0.060
+ Identities = 23/79 (29%), Positives = 43/79 (54%)
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM 132
+ +K+ K EKE + E+ + Q ER++LE ++LE ++++ EQQ + L+R +
+Sbjct: 1105 KKQEKENKEKENKEKEK---KQLEKQKQLEREKLEKDRLEKDRLEKEQQEKDCLEREKFL 1161
+
+Query: 133 EAENNRLSQQLAQLAAEVR 151
+ E E Q+ +L E++
+Sbjct: 1162 ENERLEKEQEREKLEKEIK 1180
+
+ Score = 52 (23.4 bits), Expect = 0.062, Sum P(2) = 0.060
+ Identities = 17/79 (21%), Positives = 32/79 (40%)
+
+Query: 7 KTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVP 66
+ K S S +T S+V + + S + +S +S+ + K K+
+Sbjct: 536 KESPSSSSTTSTSTSQVLIKSDSDSSSSASSSSSSSSSSSSSSSSSLPKSKNKSNRSKDN 595
+
+Query: 67 KTNLPPRKRAKTEDEKEQR 85
+ ++ L P KR T+ +K +
+Sbjct: 596 QSKLDPEKRLLTKLKKSMK 614
+
+ Score = 46 (21.3 bits), Expect = 0.25, Sum P(2) = 0.22
+ Identities = 9/28 (32%), Positives = 18/28 (64%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNL 70
+ ++ K +EK+ K+++ G+E +PK L
+Sbjct: 755 EKEKEKEKEKEKEKEEEGEEGNIPKEKL 782
+
+
+>sp|P94517|YSCB_BACSU Uncharacterized protein yscB OS=Bacillus subtilis GN=yscB
+ PE=4 SV=2
+ Length = 221
+
+ Score = 94 (38.1 bits), Expect = 0.068, P = 0.066
+ Identities = 47/170 (27%), Positives = 78/170 (45%)
+
+Query: 29 SPADTSLNSADVKTQEVKPEEK--KPAKKRK--SWGQELPVP-KTNLPPRKRAKTEDEKE 83
+ S + S VKT P+++ K KK K S + P T L RK AK E EK
+Sbjct: 22 STSSESKVETTVKTTAAFPQKELEKELKKLKPVSLDMKFESPLATELGKRK-AKEEAEK- 79
+
+Query: 84 QRRI--------ERVLRNRAAAQTSRERKRL-EMEKLENEKI-QMEQQNQFLLQRLSQME 133
+ QR+I ER + + + ER+RL E + E +++ + E+Q + QR + ++
+Sbjct: 80 QRQIAAEKKLEKEREAKRKKQQEEKAERQRLAEQQAAERQRLAEAERQAELERQRQAAIQ 139
+
+Query: 134 AENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELP 183
+ E +++ Q A+ + + A + P ++S T+ +Q ELP
+Sbjct: 140 KEQKANAEKKRQSQAQRQQTEAPSSNSQDPPSSSSQTDKTI-QQPASELP 188
+
+
+>sp|Q2UKG6|EIF3A_ASPOR Eukaryotic translation initiation factor 3 subunit A
+ OS=Aspergillus oryzae GN=tif32 PE=3 SV=1
+ Length = 1038
+
+ Score = 103 (41.3 bits), Expect = 0.069, P = 0.067
+ Identities = 30/127 (23%), Positives = 60/127 (47%)
+
+Query: 54 KKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLEN 113
+ K+ + + + + + +K+ + ++ +++RR ER R A + E +R++ E+ E
+Sbjct: 799 KRHEEFERRRKAAERDFEAKKKQRIKEVQDRRRRERAEREEAERRQKEEEERIKREE-EE 857
+
+Query: 114 EKIQMEQQNQFLLQRLSQMEAENNRLS-----QQLAQLAAEVRGSRANTPMPGSPATASP 168
+ + E++ + L + ++ E E +L Q+ + AE R + T P PA A P
+Sbjct: 858 RAAKEEERRRVLAEEKAKREEERKKLDEIALKQKQREEEAEARRASRKTGFPEPPARAEP 917
+
+Query: 169 TLT-PTL 174
+ T P L
+Sbjct: 918 ERTAPRL 924
+
+
+>sp|Q9Y592|CCD41_HUMAN Coiled-coil domain-containing protein 41 OS=Homo sapiens
+ GN=CCDC41 PE=1 SV=2
+ Length = 693
+
+ Score = 101 (40.6 bits), Expect = 0.071, P = 0.069
+ Identities = 44/183 (24%), Positives = 79/183 (43%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE- 107
+ EK +K+ W +E + R+ K KE+ + + + + + + KRL+
+Sbjct: 517 EKTLEEKQIQWLEEKHKLHERITDREE-KYNQAKEKLQRAAIAQKKRKSLHENKLKRLQE 575
+
+Query: 108 -MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATA 166
+ +E LE +K ++E +NQ L ++ E + RL ++L + R+ +P P TA
+Sbjct: 576 KVEVLEAKKEELETENQVLNRQNVPFE-DYTRLQKRLKDIQRRHNEFRSLILVPNMPPTA 634
+
+Query: 167 SPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLA---ESSDVAQHPAVSVAGL 223
+ S + P F Q +P +PFP P + + + S L E + Q + G
+Sbjct: 635 S--INPVSF-QSSAMVPSMELPFP-PHMQEEQHQRELSLLRKRLEELETTQRKQLEELGS 690
+
+Query: 224 EGD 226
+ G+
+Sbjct: 691 SGE 693
+
+ Score = 83 (34.3 bits), Expect = 6.7, P = 0.999
+ Identities = 31/119 (26%), Positives = 54/119 (45%)
+
+Query: 32 DTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL 91
+ + L + +++ E+ +K K G E V + ++ ++ + E QR R L
+Sbjct: 192 NVDLTKDSKRVEQLAREKVYLCQKLK--GLEAEVAELKAE-KENSEAQVENAQRIQVRQL 248
+
+Query: 92 RNRAAAQTSRERKR----LEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL 146
+ A S E ++ L E+LE E +QN FL+ +L + E E N LS ++ +L
+Sbjct: 249 AEMQATVRSLEAEKQSANLRAERLEKELQSSSEQNTFLINKLHKAEREINTLSSKVKEL 307
+
+
+>sp|Q6Y7W8|PERQ2_MOUSE PERQ amino acid-rich with GYF domain-containing protein
+ 2 OS=Mus musculus GN=Gigyf2 PE=1 SV=2
+ Length = 1291
+
+ Score = 111 (44.1 bits), Expect = 0.072, Sum P(2) = 0.069
+ Identities = 67/271 (24%), Positives = 111/271 (40%)
+
+Query: 13 DSLP--ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNL 70
+ DSLP +E + T + L+ V+ + + PEE++ + G+E ++
+Sbjct: 284 DSLPEWCLEDAEEEMGTFDSSGAFLSLKKVQKEPI-PEEQEMDFRPVEEGEERS--DSDS 340
+
+Query: 71 PPRKRAKTEDEKEQRRIERVLRNRAAA-----QTSRERKR--LEMEKLENEKIQMEQQNQ 123
+ + AK D+ +R E+ R A A QTS R + E Q E++++
+Sbjct: 341 SHNEEAKEPDKTNRREGEKTDRAGAEASEEVPQTSLSSARPGTPSDHQPQEATQFERKDE 400
+
+Query: 124 FLLQRLSQMEAEN---NRLSQQLAQLAAEV--RGSRANTPMPGSPATASPTL--TPTLFK 176
+ +++ + E EN N LS ++ E + +TP+P P TASP L +P +
+Sbjct: 401 PKAEQVEKAEEENRSENSLSAKVPSRGDETVPASQQPSTPLP--PDTASPLLILSPPVPT 458
+
+Query: 177 QERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLG 236
+ P+E P +S S +P + Q VA L+ SAL L
+Sbjct: 459 PSSASRPVETAAVEAPGMSSVST--EPDDEEGLKHLEQQAEKMVAYLQD--SALDDERLT 514
+
+Query: 237 SDLKHHSTDDVAAPLSDDDFNRLFHGDSSVE 267
+ S L+ H V+ PL + + ++ D E
+Sbjct: 515 SKLQEHRAKGVSIPLMHEAMQKWYYKDPQGE 545
+
+ Score = 111 (44.1 bits), Expect = 0.091, Sum P(3) = 0.087
+ Identities = 40/140 (28%), Positives = 72/140 (51%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ EE++ ++ + +EL + K K A+ E+E+ QRR+E NR + R R E
+Sbjct: 825 EERRREEEERRKQEEL-LRKQEEEAAKWAR-EEEEAQRRLEE---NRLRMEEEAARLRHE 879
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEA----ENNRLSQQLAQL---AAEVRGSRANTPMP 160
+ E+ + +++++++Q + QR Q EA + + QQLAQ+ ++ G ++NT
+Sbjct: 880 EEERKRKELELQRQKDLMRQRQQQQEALRRLQQQQQQQQLAQMKLPSSSTWGQQSNTATC 939
+
+Query: 161 GSPATASPTLTPTLFKQERD 180
+ S AT S L ++ER+
+Sbjct: 940 QSQATLSLAEIQKL-EEERE 958
+
+ Score = 39 (18.8 bits), Expect = 0.091, Sum P(3) = 0.087
+ Identities = 13/39 (33%), Positives = 20/39 (51%)
+
+Query: 10 SSVDSLPATPASEVPVLTVSPADTSLNSAD--VKTQEVK 46
+ S S P P + P+L +SP + +SA V+T V+
+Sbjct: 434 SQQPSTPLPPDTASPLLILSPPVPTPSSASRPVETAAVE 472
+
+ Score = 38 (18.4 bits), Expect = 0.072, Sum P(2) = 0.069
+ Identities = 7/20 (35%), Positives = 12/20 (60%)
+
+Query: 246 DVAAPLSDDDFNRLFHGDSS 265
+ +V +P D+ R + GD+S
+Sbjct: 1169 EVESPYEVHDYTRAYLGDTS 1188
+
+
+>sp|Q8X229|FCR3_CANAL Fluconazole resistance protein 3 OS=Candida albicans
+ GN=FCR3 PE=3 SV=1
+ Length = 399
+
+ Score = 98 (39.6 bits), Expect = 0.072, P = 0.069
+ Identities = 21/62 (33%), Positives = 40/62 (64%)
+
+Query: 75 RAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEA 134
+ R +E +E+ +++R +NRAA + RERK ++++LE + + E++ Q LL L Q++
+Sbjct: 202 RDDSELTEEELQMKRKAQNRAAQRAFRERKESKLKELEAKLLASEEERQKLLDELEQIKK 261
+
+Query: 135 EN 136
+ +N
+Sbjct: 262 QN 263
+
+
+>sp|P26041|MOES_MOUSE Moesin OS=Mus musculus GN=Msn PE=1 SV=3
+ Length = 577
+
+ Score = 100 (40.3 bits), Expect = 0.072, P = 0.070
+ Identities = 25/103 (24%), Positives = 51/103 (49%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTNLPPR-KRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ EKK + + +++ K L + K+ + + +K Q+ +E R + R+R + E
+Sbjct: 326 EKKKRELAEKEKEKIEREKEELMEKLKQIEEQTKKAQQELEEQTRRALELEQERKRAQSE 385
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV 150
+ EKL E+ + E+ + LLQ + +L+ ++A+L A +
+Sbjct: 386 AEKLAKERQEAEEAKEALLQASRDQKKTQEQLASEMAELTARI 428
+
+ Score = 95 (38.5 bits), Expect = 0.26, P = 0.23
+ Identities = 23/80 (28%), Positives = 45/80 (56%)
+
+Query: 66 PKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFL 125
+ P T + +A+ +EK Q+++ER L E+K+ E+ + E EKI+ E++ L
+Sbjct: 297 PDTIEVQQMKAQAREEKHQKQMERAL-------LENEKKKRELAEKEKEKIEREKEE--L 347
+
+Query: 126 LQRLSQMEAENNRLSQQLAQ 145
+ +++L Q+E + + Q+L +
+Sbjct: 348 MEKLKQIEEQTKKAQQELEE 367
+
+
+>sp|Q9TW28|MYOM_DICDI Myosin-M heavy chain OS=Dictyostelium discoideum GN=myoM
+ PE=1 SV=1
+ Length = 1737
+
+ Score = 105 (42.0 bits), Expect = 0.074, P = 0.072
+ Identities = 57/223 (25%), Positives = 92/223 (41%)
+
+Query: 55 KRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL-RNRAAAQTSRERKRLEMEKLEN 113
+ KRK ++ + + +R K E E+++R E+ L R R + ER+R E EK E
+Sbjct: 941 KRKEEERKKELERQRKEEEERQK-ELERQRREEEKELERKRKEEERELERQRKEEEK-EQ 998
+
+Query: 114 EKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPA---TASPTL 170
+ E+ + E++ + ++ + E E R ++ + E S + + SP+ T + T
+Sbjct: 999 ERKRKEEEKEQERKKKEEKEIEKKRKEEEKKKKKNEQNLSLPSLDITNSPSLINTTTTTT 1058
+
+Query: 171 TPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSAL 230
+ T T PL P PS PS+ + SS P+ L S
+Sbjct: 1059 TTTTTTTNTSSPPLSPPISPRPST--------PSSTSSSSSTTSSPSTKKQLLFKFNSIS 1110
+
+Query: 231 PLFDLGSDLKHHSTDDVAAPLSDDDFNRLFHGDSSV--EPDSS 271
+ L L L H S+ D++ N +GDS++ DSS
+Sbjct: 1111 NL--LSKSL-HGSSHSDKNSKEDNNSNNNNNGDSTIILSSDSS 1150
+
+ Score = 101 (40.6 bits), Expect = 0.20, P = 0.18
+ Identities = 46/164 (28%), Positives = 75/164 (45%)
+
+Query: 46 KPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL-RNRAAAQTSRERK 104
+ K EE+K +R+ +E + R+ K E E++++ ER L R R + +ERK
+Sbjct: 943 KEEERKKELERQRKEEEERQKELERQRREEEK-ELERKRKEEERELERQRKEEEKEQERK 1001
+
+Query: 105 RLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPA 164
+ R E EK E E+ + E++ + ++ + E + + Q L+ + ++ N+P +
+Sbjct: 1002 RKEEEK-EQERKKKEEKE--IEKKRKEEEKKKKKNEQNLSLPSLDI----TNSPSLINTT 1054
+
+Query: 165 TASPTLTPTLFKQERDELPLERIPFP-TPSL--SDYSPTLKPST 205
+ T + T T T L P P TPS S S T PST
+Sbjct: 1055 TTTTTTTTTTTNTSSPPLSPPISPRPSTPSSTSSSSSTTSSPST 1098
+
+
+>sp|Q9NZ53|PDXL2_HUMAN Podocalyxin-like protein 2 OS=Homo sapiens GN=PODXL2
+ PE=1 SV=1
+ Length = 605
+
+ Score = 100 (40.3 bits), Expect = 0.077, P = 0.074
+ Identities = 68/283 (24%), Positives = 109/283 (38%)
+
+Query: 32 DTSLNSADVKTQEVKPE--EKKPAKKRKSWGQELP-----VPKTNL--PPRKRAKTEDEK 82
+ D+SL+ V P+ EK + + S QELP +PK NL PP E+E+
+Sbjct: 107 DSSLDLGPT-ADYVFPDLTEKAGSIEDTSQAQELPNLPSPLPKMNLVEPPWHMPPREEEE 165
+
+Query: 83 EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ-NQFLLQRLSQMEAENNRLSQ 141
+ E+ E R + + E + E+ + + + + Q F L SQ +
+Sbjct: 166 EEEEEEE--REKEEVEKQEEEEEEELLPVNGSQEEAKPQVRDFSLTSSSQTPGATKSRHE 223
+
+Query: 142 QLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFK---QERDELPLERIPFPTPSLSDYS 198
+ A+ G + M P+ P++TPT Q+ E P L
+Sbjct: 224 DSGDQASS--GVEVESSM--GPSLLLPSVTPTTVTPGDQDSTSQEAEATVLPAAGLG--- 276
+
+Query: 199 PTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFD---LGSDLKHHSTDDVAAPLSDDD 255
+ ++ E+S+ A A ++G + ALP F S +H D + + S
+Sbjct: 277 --VEFEAPQEASEEATAGAAGLSGQHEEVPALPSFPQTTAPSGAEHPDEDPLGSRTSAS- 333
+
+Query: 256 FNRLFHGDSSVEPDSSVF-EDGLAFDVLEGGDLSA---FPFDS 294
+ + L GD + P S+ ++ L +LEG A P+DS
+Sbjct: 334 -SPLAPGDMELTPSSATLGQEDLNQQLLEGQAAEAQSRIPWDS 375
+
+
+>sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive element-binding protein 5 OS=Homo
+ sapiens GN=CREB5 PE=1 SV=2
+ Length = 508
+
+ Score = 99 (39.9 bits), Expect = 0.078, P = 0.075
+ Identities = 28/92 (30%), Positives = 49/92 (53%)
+
+Query: 52 PAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKL 111
+ PA ++ Q + P+ R+R ED E+RR + + RNRAAA R+++++ + L
+Sbjct: 345 PATQQMQPTQTIQPPQPTGGRRRRVVDEDPDERRR-KFLERNRAAATRCRQKRKVWVMSL 403
+
+Query: 112 ENEKIQMEQQNQFLLQRLSQMEAENNRLSQQL 143
+ E + ++ Q N L +S ++ E +L Q L
+Sbjct: 404 EKKAEELTQTNMQLQNEVSMLKNEVAQLKQLL 435
+
+
+>sp|Q5HZG4|TAF3_MOUSE Transcription initiation factor TFIID subunit 3 OS=Mus
+ musculus GN=Taf3 PE=1 SV=2
+ Length = 932
+
+ Score = 102 (41.0 bits), Expect = 0.079, P = 0.076
+ Identities = 55/202 (27%), Positives = 87/202 (43%)
+
+Query: 14 SLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPR 73
+ +LP S V V + PA + + + ++ KP+EK+ K +K
+Sbjct: 664 ALPLFSPSAVRVPAMLPAFSPMLPEKLFEEKEKPKEKERKKDKKE--------------- 708
+
+Query: 74 KRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ---QNQFLLQRLS 130
+ K+ K E EKE+ + ER R + RE++ E EK ++EKI++E ++ RL+
+Sbjct: 709 KKKKKEKEKEKEKKER---EREKERREREKREKEKEKHKHEKIKVEPVIPAPSPVIPRLT 765
+
+Query: 131 -QMEAENNRLSQQLAQLAAEVRGS----RANTPMPGS---PATASPT-LTPTLFKQERDE 181
+ ++ A +++ A E + + R TP P P SPT L P L Q
+Sbjct: 766 LRVGAGQDKIVISKVVPAPEAKPAPSLNRPKTPPPAPVPIPVRVSPTPLQPPLLTQAA-V 824
+
+Query: 182 LPLERIPFPTPSLSDYSPTLKP 203
+ P +P P P+LS P
+Sbjct: 825 CPA-LMPSPAPALSGIGSAKAP 845
+
+ Score = 80 (33.2 bits), Expect = 4.4, Sum P(2) = 0.99
+ Identities = 38/160 (23%), Positives = 76/160 (47%)
+
+Query: 72 PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ P+++ + +D+KE+++ + + + + RE++R E EK E EK + + + ++ +
+Sbjct: 697 PKEKERKKDKKEKKKKKEKEKEKEKKEREREKERREREKREKEK-EKHKHEKIKVEPV-- 753
+
+Query: 132 MEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPT 191
+ + A + + + ++ A + +P A +P+L R + P P P
+Sbjct: 754 IPAPSPVIPRLTLRVGAGQDKIVISKVVPAPEAKPAPSLN-------RPKTPP---PAPV 803
+
+Query: 192 PSLSDYSPT-LKPSTLAESSDV-AQHPAVSVAGLEGDGSA 229
+ P SPT L+P L +++ A P+ + A L G GSA
+Sbjct: 804 PIPVRVSPTPLQPPLLTQAAVCPALMPSPAPA-LSGIGSA 842
+
+ Score = 50 (22.7 bits), Expect = 4.4, Sum P(2) = 0.99
+ Identities = 21/87 (24%), Positives = 40/87 (45%)
+
+Query: 4 DMEKTMSSVDSLPATPASEVPVLTVSPADTSL-NSADVKTQEVKPEEKKPAKKRKSWGQE 62
+ +M T + S +P + P+ L +S DVK +++K E K KK++
+Sbjct: 485 NMPPTFPYISSPSISPPTPEPLHKGYEEKAKLPSSVDVK-KKLKKELKTKLKKKEKQRDR 543
+
+Query: 63 LPVPKTNLPPRKRAKTEDEKEQRRIER 89
+ + N ++R+K +D+ +R E+
+Sbjct: 544 ERERERN---KERSKEKDKMREREKEK 567
+
+ Score = 48 (22.0 bits), Expect = 7.0, Sum P(2) = 0.9991
+ Identities = 20/59 (33%), Positives = 27/59 (45%)
+
+Query: 17 ATPASEVPVLTVSP-ADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRK 74
+ A P+ + P+L +P A + L A K E K K K S GQ+ PK L P +
+Sbjct: 240 APPSPQPPML--APFAKSQLPIA--KPLETKSFTPKTKTKASSPGQKTKSPKAALSPAR 294
+
+
+>sp|A0LE19|IF2_MAGSM Translation initiation factor IF-2 OS=Magnetococcus sp.
+ (strain MC-1) GN=infB PE=3 SV=1
+ Length = 949
+
+ Score = 102 (41.0 bits), Expect = 0.080, P = 0.077
+ Identities = 34/144 (23%), Positives = 63/144 (43%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIER-VLRNRAAAQT 99
+ K +E+ EEKK A K G+E + + P AK ++ + +R+ E R +A +
+Sbjct: 70 KPEEI--EEKKEAPKSPKRGEERHILRPLTPEEIEAKQKELEAKRQAEEEAARQKAEQEA 127
+
+Query: 100 SRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPM 159
+ +R+++ E + + E+ + +Q Q + EA + ++ A+ AA + P
+Sbjct: 128 ARQKQEAEAARRKAEQ-EAARQKQ-------EAEAARRKAEEEAARAAAAAPAAPVAAPA 179
+
+Query: 160 PGSPATASPTLTPTLFKQERDELP 183
+ +PA P + Q E P
+Sbjct: 180 EAAPAVPVAVAEPVVVAQPAPEAP 203
+
+
+>sp|Q869E1|DNLI1_DICDI DNA ligase 1 OS=Dictyostelium discoideum GN=lig1 PE=3
+ SV=1
+ Length = 1192
+
+ Score = 103 (41.3 bits), Expect = 0.081, P = 0.078
+ Identities = 45/187 (24%), Positives = 84/187 (44%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTN-LPPR-KRAKTEDEKEQRRIERVLRNRAAAQ 98
+ K +E K +++K K+++ +EL K L + K K +++KE+ E+ + + +
+Sbjct: 246 KEKEEKDKKEKELKEKELKEKELKDKKEKELKEKEKELKDKEKKEKELKEKEKKEKEEKE 305
+
+Query: 99 TSR-ERKRLEM-EKLENEKIQMEQQNQFLLQR-LSQMEAENNRL-SQQLAQLAAEVRGSR 154
+ + E+K E+ EK E EK + E + + L ++ L + E + L S + + R
+Sbjct: 306 KEKKEKKEKELKEKEEKEKKEKELKEKELKEKELKEKELKEKELTSPKKETIDISDLFKR 365
+
+Query: 155 ANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQ 214
+ AN S T++ + T KQ+ D P P+P L T +T +S
+Sbjct: 366 ANAEAKSSVPTSTSKNSKTNKKQKVDHKPTATTKKPSPVLEAKQSTTTTTTTTTTSTATT 425
+
+Query: 215 HPAVSVA 221
+ + S++
+Sbjct: 426 ISSKSIS 432
+
+ Score = 88 (36.0 bits), Expect = 3.5, P = 0.97
+ Identities = 44/189 (23%), Positives = 82/189 (43%)
+
+Query: 32 DTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL 91
+ + L + K +E K +EKK +++ +EL K K K + EKE + E+ L
+Sbjct: 227 EKELKEKESKEKEKKEKEKKEKEEKDKKEKEL---KEKELKEKELKDKKEKELKEKEKEL 283
+
+Query: 92 RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ +++ + + K + EK E EK + E++ + L ++ + + E ++L + E++
+Sbjct: 284 KDKEKKEKELKEKE-KKEKEEKEKEKKEKKEKELKEKEEKEKKEKELKEKELKE--KELK 340
+
+Query: 152 GSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLS--------DYSPTL-- 201
+ SP + ++ LFK+ E +P T S D+ PT
+Sbjct: 341 EKELKEKELTSPKKETIDISD-LFKRANAEAK-SSVPTSTSKNSKTNKKQKVDHKPTATT 398
+
+Query: 202 -KPSTLAES 209
+ KPS + E+
+Sbjct: 399 KKPSPVLEA 407
+
+
+>sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+ Length = 1549
+
+ Score = 104 (41.7 bits), Expect = 0.085, P = 0.081
+ Identities = 29/104 (27%), Positives = 53/104 (50%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ E+++ ++RK +EL + L K+ ED ++++ +E+V R Q RE++R E
+Sbjct: 736 EKRRQVRERKYLEEELQQEEDRLQREKQLLREDREKRQYLEKVELQREEEQLQREKRRQE 795
+
+Query: 108 MEKL--ENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE 149
+ E+ E E ++ E++ Q+L + E E R + QL E
+Sbjct: 796 RERQYREEELLREEERLHRKEQQLQREECEKRRRQELERQLEEE 839
+
+ Score = 97 (39.2 bits), Expect = 0.49, P = 0.39
+ Identities = 33/130 (25%), Positives = 64/130 (49%)
+
+Query: 30 PADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQR---- 85
+ P D L +K QE++ ++ + K +E + + ++ E+E +QR
+Sbjct: 122 PQDRQLEERRLKRQELEELAEEEELREKQVRREQRLQRRE---QEEYGGEEELQQRPKGR 178
+
+Query: 86 RIERVLRN--RAAAQTSRERKRLEMEKLENEKIQM-EQQNQFLLQRLSQMEAENNRLSQQ 142
+ +E +L R Q RER+RL++E+ + ++ ++ E+Q + LQ+ E + RL ++
+Sbjct: 179 ELEELLNREQRFERQEQRERQRLQVEQQQRQRGELRERQEEVQLQKRETQELQRERLEEE 238
+
+Query: 143 LAQLAAEVRG 152
+ QL + RG
+Sbjct: 239 -QQLQKQKRG 247
+
+ Score = 96 (38.9 bits), Expect = 0.63, P = 0.47
+ Identities = 28/115 (24%), Positives = 61/115 (53%)
+
+Query: 35 LNSADVKTQEVKPEEKKPAKKRKSWGQELPV-PKTNLPPRKRAKTEDEKEQRRIERV-LR 92
+ L + + Q + E+++ ++ K + +++ + + L +R K E+E++ +E+V LR
+Sbjct: 428 LQREEEQLQREEREKRRRQEREKQYLEKVELWEEEQLQREEREKRRQEREKQYLEKVELR 487
+
+Query: 93 NRAAAQTS-RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL 146
+ Q RE++R E E+ EK++++++ Q LQR + + R Q L ++
+Sbjct: 488 EEEQLQRQEREKRRQERERQYLEKVELQEEEQ--LQREEREKRRQERERQYLEKV 540
+
+ Score = 94 (38.1 bits), Expect = 1.0, P = 0.65
+ Identities = 26/101 (25%), Positives = 55/101 (54%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTN-LPPRKRAKTEDEKEQRRIERV-LRNRAAAQTS-RERKR 105
+ EK+ ++ + + +++ + + L +R K E+E++ +E+V L+ Q RE++R
+Sbjct: 498 EKRRQERERQYLEKVELQEEEQLQREEREKRRQERERQYLEKVELQEEEQLQRQEREKRR 557
+
+Query: 106 LEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL 146
+ E EK EK++++++ Q LQR + + R Q L ++
+Sbjct: 558 QEREKQYLEKVELQEEEQ--LQRQERQKRRQEREKQYLEKV 596
+
+ Score = 93 (37.8 bits), Expect = 1.3, P = 0.74
+ Identities = 26/101 (25%), Positives = 56/101 (55%)
+
+Query: 49 EKKPAKKRKSWGQELPV-PKTNLPPRKRAKTEDEKEQRRIERV-LRNRAAAQTS-RERKR 105
+ EK+ ++ K + +++ + + L ++R K E+E++ +E+V L+ Q RE++R
+Sbjct: 470 EKRRQEREKQYLEKVELREEEQLQRQEREKRRQERERQYLEKVELQEEEQLQREEREKRR 529
+
+Query: 106 LEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL 146
+ E E+ EK++++++ Q LQR + + R Q L ++
+Sbjct: 530 QERERQYLEKVELQEEEQ--LQRQEREKRRQEREKQYLEKV 568
+
+ Score = 91 (37.1 bits), Expect = 2.2, P = 0.89
+ Identities = 25/109 (22%), Positives = 56/109 (51%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTN-LPPRKRAKTEDEKEQRRIERV-LRNRAAAQTS-RERKR 105
+ EK+ ++ + + +++ + + L ++R K E+E++ +E+V L+ Q R+++R
+Sbjct: 526 EKRRQERERQYLEKVELQEEEQLQRQEREKRRQEREKQYLEKVELQEEEQLQRQERQKRR 585
+
+Query: 106 LEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ E EK EK++++++ Q Q + E R + +L E + R
+Sbjct: 586 QEREKQYLEKVELQEEEQLQRQEREKRRQERERQYLEKVELQEEEQVQR 634
+
+ Score = 89 (36.4 bits), Expect = 3.7, P = 0.97
+ Identities = 25/81 (30%), Positives = 42/81 (51%)
+
+Query: 75 RAKTEDEKEQRRIERVLRNRAAAQTSRERK-RLEMEKLENEKIQMEQQNQFLLQRLSQME 133
+ R + E+E ++RR + Q E + RL+ EKL+ EK + E++ Q+ R +++
+Sbjct: 366 RWQLEEESQRRRYTLYAKPAQREQVREEEQLRLKEEKLQREKRRQERERQY---REVELQ 422
+
+Query: 134 AENNRLSQQLAQLAAEVRGSR 154
+ E RL ++ QL E R R
+Sbjct: 423 REEERLQREEEQLQREEREKR 443
+
+ Score = 89 (36.4 bits), Expect = 3.7, P = 0.97
+ Identities = 23/93 (24%), Positives = 50/93 (53%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTN-LPPRKRAKTEDEKEQRRIERV-LRNRAAAQTS-RERKR 105
+ EK+ ++ K + +++ + + L ++R K E+E++ +E+V L+ Q RE++R
+Sbjct: 554 EKRRQEREKQYLEKVELQEEEQLQRQERQKRRQEREKQYLEKVELQEEEQLQRQEREKRR 613
+
+Query: 106 LEMEKLENEKIQMEQQNQFLLQRLSQMEAENNR 138
+ E E+ EK++++++ Q Q + E R
+Sbjct: 614 QERERQYLEKVELQEEEQVQRQEREKRRQERER 646
+
+ Score = 89 (36.4 bits), Expect = 3.7, P = 0.97
+ Identities = 30/114 (26%), Positives = 59/114 (51%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ + Q + E+++ ++R+ +EL + L ++ E E+E+RR ER R
+Sbjct: 631 QVQRQEREKRRQERERQYLEKELQRQEERLQEEEQLLRE-EREKRRQERE-RQYLEKVEL 688
+
+Query: 101 RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ +E ++L+ E E EK + E++ Q+L + +++ + RL ++ QL E R R
+Sbjct: 689 QEEEQLQRE--EREKRRQERERQYLEKE--ELQRQEERLQREKEQLQREDREKR 738
+
+ Score = 88 (36.0 bits), Expect = 4.7, P = 0.991
+ Identities = 28/117 (23%), Positives = 62/117 (52%)
+
+Query: 40 VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIER---VLRNRAA 96
+ ++ +E++ +E++ ++++ +E + + RK + E ++E+ R++R +LR
+Sbjct: 711 LEKEELQRQEERLQREKEQLQREDREKRRQVRERKYLEEELQQEEDRLQREKQLLREDRE 770
+
+Query: 97 AQTSRERKRL--EMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ + E+ L E E+L+ EK + E++ Q+ + L + E +R QQL + E R
+Sbjct: 771 KRQYLEKVELQREEEQLQREKRRQERERQYREEELLREEERLHRKEQQLQREECEKR 827
+
+ Score = 88 (36.0 bits), Expect = 4.7, P = 0.991
+ Identities = 29/125 (23%), Positives = 62/125 (49%)
+
+Query: 32 DTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL 91
+ + L + + QE + ++ +KR+ + + K L ++ + E E+E+RR ER
+Sbjct: 650 EKELQRQEERLQEEEQLLREEREKRRQERERQYLEKVELQEEEQLQRE-EREKRRQERER 708
+
+Query: 92 RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL--SQMEAENNRLSQQLAQLAAE 149
+ + + R+ +RL+ EK + ++ E++ Q ++ +++ E +RL ++ QL E
+Sbjct: 709 QYLEKEELQRQEERLQREKEQLQREDREKRRQVRERKYLEEELQQEEDRLQRE-KQLLRE 767
+
+Query: 150 VRGSR 154
+ R R
+Sbjct: 768 DREKR 772
+
+ Score = 87 (35.7 bits), Expect = 6.1, P = 0.998
+ Identities = 31/111 (27%), Positives = 57/111 (51%)
+
+Query: 40 VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQT 99
+ V+ QE + +++ +KR+ + + K L ++ + + E+E+RR ER R +
+Sbjct: 596 VELQEEEQLQRQEREKRRQERERQYLEKVELQEEEQVQRQ-EREKRRQERE-RQYLEKEL 653
+
+Query: 100 SRERKRL-EMEKL---ENEKIQMEQQNQFL----LQRLSQMEAENNRLSQQ 142
+ R+ +RL E E+L E EK + E++ Q+L LQ Q++ E +Q
+Sbjct: 654 QRQEERLQEEEQLLREEREKRRQERERQYLEKVELQEEEQLQREEREKRRQ 704
+
+ Score = 87 (35.7 bits), Expect = 6.1, P = 0.998
+ Identities = 29/115 (25%), Positives = 59/115 (51%)
+
+Query: 40 VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQT 99
+ V+ QE + +++ +KR+ ++ + K L ++ + + E+E+RR ER + +
+Sbjct: 568 VELQEEEQLQRQERQKRRQEREKQYLEKVELQEEEQLQRQ-EREKRRQERERQYLEKVEL 626
+
+Query: 100 SRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ E ++++ E EK + E++ Q+L + L + E RL ++ QL E R R
+Sbjct: 627 QEEE---QVQRQEREKRRQERERQYLEKELQRQE---ERLQEE-EQLLREEREKR 674
+
+
+>sp|O70191|ATF5_MOUSE Cyclic AMP-dependent transcription factor ATF-5 OS=Mus
+ musculus GN=Atf5 PE=1 SV=2
+ Length = 283
+
+ Score = 95 (38.5 bits), Expect = 0.088, P = 0.085
+ Identities = 30/93 (32%), Positives = 48/93 (51%)
+
+Query: 63 LPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQN 122
+ LP P P A T +++Q++ ++ N++AA R+RKR E E LE E +E +N
+Sbjct: 192 LPSPARPAPYPSPASTRGDRKQKKRDQ---NKSAALRYRQRKRAEGEALEGECQGLEARN 248
+
+Query: 123 QFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA 155
+ + L +R +E E Q + L EV +R+
+Sbjct: 249 RELRERAESVERE----IQYVKDLLIEVYKARS 277
+
+
+>sp|Q39140|TGA6_ARATH Transcription factor TGA6 OS=Arabidopsis thaliana GN=TGA6
+ PE=1 SV=2
+ Length = 330
+
+ Score = 96 (38.9 bits), Expect = 0.089, P = 0.085
+ Identities = 20/55 (36%), Positives = 38/55 (69%)
+
+Query: 77 KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ +++D+ +Q+ + R+ +NR AA+ SR RK+ +++LEN ++++ Q Q L QR Q
+Sbjct: 38 RSKDKLDQKTLRRLAQNREAARKSRLRKKAYVQQLENSRLKLTQLEQEL-QRARQ 91
+
+
+>sp|Q68EL6|NFIL3_DANRE Nuclear factor interleukin-3-regulated protein OS=Danio
+ rerio GN=nfil3 PE=2 SV=1
+ Length = 462
+
+ Score = 98 (39.6 bits), Expect = 0.089, P = 0.085
+ Identities = 42/152 (27%), Positives = 70/152 (46%)
+
+Query: 73 RKRAKTEDEKEQRRI-ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ RKR DEK+ ER +N AA+ SRE++RL LEN+ + + ++N L L
+Sbjct: 52 RKREFIPDEKKDNLYWERRRKNNEAAKRSREKRRLNDMVLENKLMALGEENASLKAELLS 111
+
+Query: 132 MEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQER-DELPLERIPFP 190
+ ++ +S A A EV+ +T A ++P+ K +L R+
+Sbjct: 112 LKLRFGLVSS--AAYAQEVQNISTSTA-----ALYQDFMSPSATKDSYPSDLEPTRLTSS 164
+
+Query: 191 TPSLSDYSPTLKPSTLAESSDVAQ-HPAVSVA 221
+ S+ +SP S ++SS V Q P ++++
+Sbjct: 165 CISVIKHSPHSALSDGSDSSTVTQGSPLINIS 196
+
+
+>sp|Q55FW7|GLE1_DICDI Nucleoporin GLE1 OS=Dictyostelium discoideum GN=gle1 PE=3
+ SV=1
+ Length = 837
+
+ Score = 101 (40.6 bits), Expect = 0.089, P = 0.086
+ Identities = 30/107 (28%), Positives = 55/107 (51%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKT--NLPPRKRAKTEDEKEQRRI-ERVLRNRAAAQT 99
+ QE K +++K K+ K Q+ + L K K + EKEQ++ E+ L+
+Sbjct: 390 QEQKEKQEKLEKEEKEKEQQEQQKQLLIKLAKEKEEKEKFEKEQQQQKEKELQKEKELLQ 449
+
+Query: 100 SRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQL 146
+ +E+++ E EKL+ ++ Q +QQ Q Q+L Q + + N+ + L +
+Sbjct: 450 QKEKEK-EKEKLQQQQQQQQQQQQQQQQQLQQQQQQQNQQNNNLGYI 495
+
+ Score = 89 (36.4 bits), Expect = 1.8, P = 0.84
+ Identities = 26/98 (26%), Positives = 52/98 (53%)
+
+Query: 48 EEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ E+KK +K++ QE + L K E EKEQ+ ++ L + A + E+++ E
+Sbjct: 377 EQKKREEKQRQLQQEQKEKQEKLE-----KEEKEKEQQEQQKQLLIKLAKE-KEEKEKFE 430
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQ 145
+ E+ + ++ +++++ + L Q+ + E E +L QQ Q
+Sbjct: 431 KEQQQQKEKELQKEKELLQQK--EKEKEKEKLQQQQQQ 466
+
+
+>sp|Q3TLH4|BA2L2_MOUSE Protein BAT2-like 2 OS=Mus musculus GN=Bat2l2 PE=1 SV=2
+ Length = 2828
+
+ Score = 89 (36.4 bits), Expect = 0.096, Sum P(2) = 0.092
+ Identities = 30/106 (28%), Positives = 54/106 (50%)
+
+Query: 43 QEVKPEEKKPA---KKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQT 99
+ +E + EE++ A +K K ++L + + P + + E EKE+ ER L +
+Sbjct: 468 EERRMEEQRKAACAEKLKQLDEKLGIIEKQPSPEELREREREKER---ERELEKEKEREL 524
+
+Query: 100 SRER-KRLEMEKLENEKIQMEQQNQFL--LQRLSQMEAENNRLSQQ 142
+ +E+ K+ EME+ ++ ++EQQ + LQRL + E E Q+
+Sbjct: 525 EKEQEKQREMERARQQEKELEQQREKEQELQRLREQEKEGEPKEQE 570
+
+ Score = 70 (29.7 bits), Expect = 9.4, Sum P(2) = 0.99992
+ Identities = 33/143 (23%), Positives = 55/143 (38%)
+
+Query: 7 KTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVP 66
+ K SS D TP S V A ++ +S+ + TQ P K P K + QE P
+Sbjct: 345 KESSSEDQTAKTPESTENRKEVDEASSTKSSSQIPTQP--PVTKSPYGKGPPFNQERG-P 401
+
+Query: 67 KTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLL 126
+ ++LPP + + +R + R S+ E + + Q + + +
+Sbjct: 402 SSHLPPPPKLLAQQHPPPP--DRQIPGRQGPFPSKPPVPDNDEIWKQRRKQQSEISAAVE 459
+
+Query: 127 QRLSQMEAENNRLSQQLAQLAAE 149
+ + + E E R+ +Q AE
+Sbjct: 460 RARKRREEEERRMEEQRKAACAE 482
+
+ Score = 67 (28.6 bits), Expect = 0.096, Sum P(2) = 0.092
+ Identities = 33/138 (23%), Positives = 52/138 (37%)
+
+Query: 140 SQQLAQLAAEVRGSRANTPMPGSPATASPTL-TPTL-FKQERDELPLERIP----FPTPS 193
+ S + LA+ + + ++P P ATA P++ TP + +PL P P
+Sbjct: 1816 SASIPILASALAPATVSSPTPVVSATAVPSISTPAVPASAPTASVPLAPASAASTVPPPG 1875
+
+Query: 194 LSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDD-VAAPLS 252
+ L P P T ES+ + + G ++P L D VAAP
+Sbjct: 1876 LDSADPDPDPQTSPESTRLPSAQTSNGTDFVAAGKSMPTSQSHGSLTAELWDSKVAAPAV 1935
+
+Query: 253 DDDFNRLFHGDSSVEPDS 270
+ +D ++ S +P S
+Sbjct: 1936 LNDISKKLGPISPPQPPS 1953
+
+ Score = 52 (23.4 bits), Expect = 3.0, Sum P(2) = 0.95
+ Identities = 15/53 (28%), Positives = 22/53 (41%)
+
+Query: 158 PMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESS 210
+ P+P S + P T + P +P PTP L+ S T+ L +S
+Sbjct: 1768 PVPTSASAPVPASTSSPVTASSSSQP--SVPAPTPVLASASTTVSVPILTSAS 1818
+
+
+>sp|Q04323|UBXN1_HUMAN UBX domain-containing protein 1 OS=Homo sapiens GN=UBXN1
+ PE=1 SV=2
+ Length = 297
+
+ Score = 95 (38.5 bits), Expect = 0.096, P = 0.092
+ Identities = 35/146 (23%), Positives = 69/146 (47%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL-RNRAAAQTSRERKRLE 107
+ E KPA + QE L +K+ + E+ +E+ +ER R R + S R+RL+
+Sbjct: 81 EGKPALSEEE-RQEQTKRMLELVAQKQREREEREEREALERERQRRRQGQELSAARQRLQ 139
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSP---- 163
+ +++ E++ + + L+ + ++ + A+ A + GS + P P +P
+Sbjct: 140 EDEMRRAA---EERRREKAEELAARQRVREKIERDKAERAKKYGGSVGSQPPPVAPEPGP 196
+
+Query: 164 ATASPTLTPTLFKQERDELPLE-RIP 188
+ +SP+ P K+E D+ ++ R+P
+Sbjct: 197 VPSSPSQEPPT-KREYDQCRIQVRLP 221
+
+ Score = 77 (32.2 bits), Expect = 9.9, P = 0.99995
+ Identities = 44/142 (30%), Positives = 64/142 (45%)
+
+Query: 74 KRAKTEDEKEQRRIERVLRNRAAAQTSRERK-RLEMEKLENEKIQMEQQNQFLL---QRL 129
+ K A +E+E+ Q + +R+L AQ RER+ R E E LE E+ Q +Q Q L QRL
+Sbjct: 83 KPALSEEER-QEQTKRMLE--LVAQKQREREEREEREALERER-QRRRQGQELSAARQRL 138
+
+Query: 130 SQME---AENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLER 186
+ + E A R ++ +LAA R + A + ++ Q P+
+Sbjct: 139 QEDEMRRAAEERRREKAEELAAR---QRVREKIERDKAERAKKYGGSVGSQPP---PVAP 192
+
+Query: 187 IPFPTPSLSDYSPTLKPSTLAE 208
+ P P PS SP+ +P T E
+Sbjct: 193 EPGPVPS----SPSQEPPTKRE 210
+
+
+>sp|P23922|HBP1A_WHEAT Transcription factor HBP-1a OS=Triticum aestivum PE=2
+ SV=1
+ Length = 349
+
+ Score = 96 (38.9 bits), Expect = 0.097, P = 0.092
+ Identities = 29/97 (29%), Positives = 49/97 (50%)
+
+Query: 59 WGQ--ELPVP--KTNLPPRK-RAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLEN 113
+ WG PVP + +P R + DE+E ++ +R L NR +A+ SR RK+ E E+L
+Sbjct: 223 WGATGSSPVPAMRGKVPSGSARGEQWDERELKKQKRKLSNRESARRSRLRKQAECEELGQ 282
+
+Query: 114 EKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEV 150
+ ++ +N L L +++ E L + L A++
+Sbjct: 283 RAEALKSENSSLRIELDRIKKEYEELLSKNTSLKAKL 319
+
+
+>sp|Q9C5Q2|AI5L3_ARATH ABSCISIC ACID-INSENSITIVE 5-like protein 3
+ OS=Arabidopsis thaliana GN=DPBF4 PE=1 SV=1
+ Length = 262
+
+ Score = 94 (38.1 bits), Expect = 0.099, P = 0.094
+ Identities = 23/65 (35%), Positives = 42/65 (64%)
+
+Query: 71 PPRKRAKTE--DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQR 128
+ P RKR E ++ +RR +R+++NR +A SR RK+ +LE + ++E++N+ L+R
+Sbjct: 176 PGRKRVAGEIVEKTVERRQKRMIKNRESAARSRARKQAYTHELEIKVSRLEEENE-KLRR 234
+
+Query: 129 LSQME 133
+ L ++E
+Sbjct: 235 LKEVE 239
+
+
+>sp|Q54TD7|DDX24_DICDI ATP-dependent RNA helicase ddx24 OS=Dictyostelium
+ discoideum GN=ddx24 PE=3 SV=1
+ Length = 940
+
+ Score = 101 (40.6 bits), Expect = 0.10, P = 0.097
+ Identities = 26/114 (22%), Positives = 60/114 (52%)
+
+Query: 32 DTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQR-RIERV 90
+ D + N + + +EVKP++K +K++ Q+ P + P +K K E +KE+ ++E
+Sbjct: 168 DDNDNDFEDEEEEVKPQQKLQKQKQQEQKQKQPQKQPQQPNKKNNKKELQKEEEEQMEEE 227
+
+Query: 91 LRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNR--LSQQ 142
+ Q E K ++ + ++ +K++ ++Q + + ++++E R +S+Q
+Sbjct: 228 KEEEEVQQEEEEEKEIK-KPIKEKKVKTQKQIEAAKKNINKLEKIKKRKEISEQ 280
+
+
+>sp|Q5F797|IF2_NEIG1 Translation initiation factor IF-2 OS=Neisseria
+ gonorrhoeae (strain ATCC 700825 / FA 1090) GN=infB PE=3 SV=1
+ Length = 943
+
+ Score = 101 (40.6 bits), Expect = 0.10, P = 0.098
+ Identities = 43/162 (26%), Positives = 68/162 (41%)
+
+Query: 17 ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRA 76
+ A PA++ P T + A+T+ +A+ K E K + KP +R G++ P P
+Sbjct: 151 AKPAAQKP--TEAKAETAPVAAETKPAEPKEKAVKPKHERNGKGKDAKKPAKPAAPAVPQ 208
+
+Query: 77 KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN 136
+ +EQ + + R RAAA R E L EK Q+ Q + + Q +AE
+Sbjct: 209 PVVSAEEQAQRDEEAR-RAAAL------RAHQEALLKEK----QERQARREAMKQ-QAEQ 256
+
+Query: 137 NRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQE 178
+ + Q A+ + A P +PA + + P K+E
+Sbjct: 257 QAKAAQEAKTGRQRPAKPAEKPQAAAPAVENKPVNPAKAKKE 298
+
+
+>sp|B4RMZ3|IF2_NEIG2 Translation initiation factor IF-2 OS=Neisseria
+ gonorrhoeae (strain NCCP11945) GN=infB PE=3 SV=1
+ Length = 943
+
+ Score = 101 (40.6 bits), Expect = 0.10, P = 0.098
+ Identities = 43/162 (26%), Positives = 68/162 (41%)
+
+Query: 17 ATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRA 76
+ A PA++ P T + A+T+ +A+ K E K + KP +R G++ P P
+Sbjct: 151 AKPAAQKP--TEAKAETAPVAAETKPAEPKEKAVKPKHERNGKGKDAKKPAKPAAPAVPQ 208
+
+Query: 77 KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN 136
+ +EQ + + R RAAA R E L EK Q+ Q + + Q +AE
+Sbjct: 209 PVVSAEEQAQRDEEAR-RAAAL------RAHQEALLKEK----QERQARREAMKQ-QAEQ 256
+
+Query: 137 NRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQE 178
+ + Q A+ + A P +PA + + P K+E
+Sbjct: 257 QAKAAQEAKTGRQRPAKPAEKPQAAAPAVENKPVNPAKAKKE 298
+
+
+>sp|Q86AH4|Y8592_DICDI Putative uncharacterized protein DDB_G0271982
+ OS=Dictyostelium discoideum GN=DDB_G0271982 PE=4 SV=1
+ Length = 629
+
+ Score = 99 (39.9 bits), Expect = 0.10, P = 0.099
+ Identities = 47/192 (24%), Positives = 80/192 (41%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ K +E + E++K +K K +E K R+R + + + +R ER +
+Sbjct: 310 KEKEKEKEKEKEKEKEKEIEKEREKEKEREREREREREREREREREREREREREKEKEKE 369
+
+Query: 101 RERKRLEMEKLENEKIQMEQQNQFLLQRLS-QMEAENNRLSQQLAQLAAEVRGSRANTPM 159
+ RER+R E E+ E E+ E++ +F +R + E E +L+ + +R + + +
+Sbjct: 370 RERER-ERER-ERER---EREKEFEKERREREKEREREKLNITKDKEKQVIRETTIDETL 424
+
+Query: 160 PGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVS 219
+ PT T K P+ P PS++ YS +L PS S A S
+Sbjct: 425 -NKETPHKPTPHITTKKSPNLTPPISSTASP-PSVTTYS-SLIPSIPTPQSAAATTTTPS 481
+
+Query: 220 VAGLEGDGSALP 231
+ A L + +P
+Sbjct: 482 SATLTAVSATIP 493
+
+
+>sp|Q8IIG7|YPF05_PLAF7 Uncharacterized protein PF11_0207 OS=Plasmodium
+ falciparum (isolate 3D7) GN=PF11_0207 PE=4 SV=1
+ Length = 964
+
+ Score = 101 (40.6 bits), Expect = 0.11, P = 0.10
+ Identities = 33/134 (24%), Positives = 69/134 (51%)
+
+Query: 39 DVKTQEVKPEEKKPAKKRKSWGQELP--VPKTNLPPRKRAKTEDEKEQRRIERVLRNRAA 96
+ ++K +EVK E K+ ++ K +E+ + + ++ K E ++E + I+ L+N +
+Sbjct: 616 EIK-EEVKEEIKEVKEEIKEVKEEIKEEIKEVKEEIKEEVKEEIKEEIKEIKEELKNDIS 674
+
+Query: 97 AQTSRERKRLEMEKLENEKIQMEQQNQFLLQR-LSQMEAENNRLSQQLAQLAAEVRGSRA 155
+ ++T++E K E +K E EK + + + Q+ L + E N +L +Q + E+R
+Sbjct: 675 SETTKEEKNTEHKKEETEKKKFIPKRVIMYQQELKEKEERNLKLLEQQRK-EREMRLQLI 733
+
+Query: 156 NTPMPGSPATASPT 169
+ + G+ +T P+
+Sbjct: 734 RSKTQGTSSTFIPS 747
+
+
+>sp|B2KI97|THOC2_RHIFE THO complex subunit 2 OS=Rhinolophus ferrumequinum
+ GN=THOC2 PE=3 SV=1
+ Length = 1576
+
+ Score = 103 (41.3 bits), Expect = 0.11, P = 0.11
+ Identities = 49/188 (26%), Positives = 88/188 (46%)
+
+Query: 36 NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRA 95
+ NS+ ++ VK +K+ K+++ +E P T P R +D KE+ + ER ++
+Sbjct: 1257 NSSSNSSKTVKENDKEKGKEKEKEKKE-KTPATT--PEARILGKDGKEKPKEERPNKDEK 1313
+
+Query: 96 AAQTSRERKRLEMEK---LENEKIQMEQQNQFL--LQRLSQMEAENNRLSQQLAQLAAEV 150
+ A +T + + EK + EK++ E+ + ++ S E E + + +A E+
+Sbjct: 1314 ARETKERTPKSDKEKEKFKKEEKVKDEKFKTTVPNVESKSTQEKEREKEPSRERDIAKEM 1373
+
+Query: 151 RGSRAN------TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPS 204
+ + S+ N TP+ GS SP + + ER++ + P+PS +S T+K S
+Sbjct: 1374 K-SKENVKGGEKTPVSGS--LKSPVPRSDIAEPEREQKRRKIDTHPSPS---HSSTVKDS 1427
+
+Query: 205 T--LAESS 210
+ L ESS
+Sbjct: 1428 LIELKESS 1435
+
+
+>sp|Q9UM54|MYO6_HUMAN Myosin-VI OS=Homo sapiens GN=MYO6 PE=1 SV=4
+ Length = 1294
+
+ Score = 102 (41.0 bits), Expect = 0.11, P = 0.11
+ Identities = 37/146 (25%), Positives = 69/146 (47%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE 102
+ +E++ E K+ + K +E + L + K E+E+ ++R + R +A +
+Sbjct: 931 EEMEKERKRREEDEKRRRKEEEERRMKLEMEAKRKQEEEERKKREDDEKRIQAEVEAQLA 990
+
+Query: 103 RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGS 162
+ R++ E E + ++ E++++ L R++Q EAE L AQ +R S + P+ +
+Sbjct: 991 RQK-EEESQQQAVLEQERRDRELALRIAQSEAE---LISDEAQADLALRRSLDSYPVSKN 1046
+
+Query: 163 PATASPTLTPTLFKQERDELPLERIP 188
+ T P +TP +E E L R P
+Sbjct: 1047 DGTR-PKMTPEQMAKEMSEF-LSRGP 1070
+
+ Score = 85 (35.0 bits), Expect = 8.2, P = 0.9997
+ Identities = 35/145 (24%), Positives = 69/145 (47%)
+
+Query: 11 SVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNL 70
+ S+D+L A S + +T ++ VK+ E + K+++ + L + +
+Sbjct: 877 SIDTLMAKIKSTM--MTQEQIQKEYDAL-VKSSEELLSALQKKKQQEEEAERLRRIQEEM 933
+
+Query: 71 PPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENE--KIQMEQQNQFLLQR 128
+ ++ + EDEK +R+ E R + + R+++ E +K E++ +IQ E + Q Q+
+Sbjct: 934 EKERKRREEDEKRRRKEEEERRMKLEMEAKRKQEEEERKKREDDEKRIQAEVEAQLARQK 993
+
+Query: 129 L--SQMEA--ENNRLSQQLAQLAAE 149
+ SQ +A E R ++LA A+
+Sbjct: 994 EEESQQQAVLEQERRDRELALRIAQ 1018
+
+
+>sp|Q3KQU3|MA7D1_HUMAN MAP7 domain-containing protein 1 OS=Homo sapiens
+ GN=MAP7D1 PE=1 SV=1
+ Length = 841
+
+ Score = 100 (40.3 bits), Expect = 0.12, P = 0.11
+ Identities = 53/211 (25%), Positives = 88/211 (41%)
+
+Query: 16 PATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKR 75
+ P TP+ + T T L A+ + Q + E++ ++R ++ + + L
+Sbjct: 583 PVTPSKPMAGTTDREEATRL-LAEKRRQAREQREREEQERRLQAERDKRMREEQLAREAE 641
+
+Query: 76 AKTEDEKE-QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEA 134
+ A+ E E E +RR E+ R +A A+ E++RL+ +K E E E+ + QRL
+Sbjct: 642 ARAEREAEARRREEQEAREKAQAE-QEEQERLQKQKEEAEARSREEAER---QRL----- 692
+
+Query: 135 ENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLE-RIPFPTPS 193
+ E + QQ Q E R R M T ++ T KQ+ E P P +
+Sbjct: 693 EREKHFQQQEQERQE-RRKRLEEIMK---RTRKSEVSETKQKQDSKEANANGSSPEPVKA 748
+
+Query: 194 LSDYSPTLKPSTLAESSDVAQHPAVSVAGLE 224
+ + SP L+ + + + Q P S+ E
+Sbjct: 749 VEARSPGLQKEAVQKEEPIPQEPQWSLPSKE 779
+
+ Score = 87 (35.7 bits), Expect = 3.1, P = 0.95
+ Identities = 36/128 (28%), Positives = 51/128 (39%)
+
+Query: 16 PATPASEVPVLTVSPADTS-LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRK 74
+ PA P E P +P D + L S V P + + L K +
+Sbjct: 555 PAPPQKEQPPAE-TPTDAAVLTSPPAPAPPVTPSKPMAGTTDREEATRLLAEKRRQAREQ 613
+
+Query: 75 RAKTEDEK------EQRRIERVLRNRAAAQTSRERKRLEMEKLE-NEKIQMEQQNQFLLQ 127
+ R + E E+ ++R E L A A+ RE + E+ E EK Q EQ+ Q LQ
+Sbjct: 614 REREEQERRLQAERDKRMREEQLAREAEARAEREAEARRREEQEAREKAQAEQEEQERLQ 673
+
+Query: 128 RLSQMEAE 135
+ + + EAE
+Sbjct: 674 KQKE-EAE 680
+
+ Score = 83 (34.3 bits), Expect = 8.4, P = 0.9998
+ Identities = 34/136 (25%), Positives = 64/136 (47%)
+
+Query: 16 PATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKP--AKKRKSWGQELP--VPKTNLP 71
+ P +P+ +V P + S S++ K++ P P A+ + Q P VP ++ P
+Sbjct: 68 PESPSGQVGPRPAPPQEES-PSSEAKSRGPTPPAMGPRDARPPRRSSQPSPTAVPASDSP 126
+
+Query: 72 PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ P K+ + + E+ ++ + R A + +K + +EK E K E+Q Q +RL +
+Sbjct: 127 PTKQ-EVKKAGERHKLAKERREERAKYLAA-KKAVWLEKEEKAKALREKQLQERRRRLEE 184
+
+Query: 132 --MEAENNRLSQQLAQ 145
+ ++AE R + + Q
+Sbjct: 185 QRLKAEQRRAALEERQ 200
+
+
+>sp|Q14244|MAP7_HUMAN Ensconsin OS=Homo sapiens GN=MAP7 PE=1 SV=1
+ Length = 749
+
+ Score = 98 (39.6 bits), Expect = 0.17, P = 0.15
+ Identities = 39/146 (26%), Positives = 67/146 (45%)
+
+Query: 14 SLPATPASEVPVLTVSPADTSLNSADVKTQE--VKPEE--KKPAKKRKSWGQELPVPKTN 69
+ S PA P + +P+ T SA VKT PEE + A+KR+ ++ K
+Sbjct: 441 SAPAPAPVPTPAMVSAPSSTVNASASVKTSAGTTDPEEATRLLAEKRRLAREQRE--KEE 498
+
+Query: 70 LPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRL 129
+ R++ + E +K + +RV R + E +RLE E+ ++ Q+++Q + R
+Sbjct: 499 RERREQEELERQKREELAQRVAEERTTRR-EEESRRLEAEQAREKEEQLQRQAEERALR- 556
+
+Query: 130 SQMEAEN-NRLSQQLAQLAAEVRGSR 154
+ + EAE R ++ A++ E R
+Sbjct: 557 EREEAERAQRQKEEEARVREEAERVR 582
+
+ Score = 92 (37.4 bits), Expect = 0.12, Sum P(2) = 0.11
+ Identities = 25/119 (21%), Positives = 57/119 (47%)
+
+Query: 75 RAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEA 134
+ R + E E+ QR+ E R R A+ R+ + ++ E E+++ +++ + +++R + EA
+Sbjct: 556 REREEAERAQRQKEEEARVREEAERVRQEREKHFQREEQERLERKKRLEEIMKRTRRTEA 615
+
+Query: 135 ENNRLSQQL-AQLA-AEVRGSRANTPMP---GSPATASPTLTPTLFKQERDELPLERIP 188
+ + + S Q +A + G + +P +P P +P + + ++ +E P
+Sbjct: 616 TDKKTSDQRNGDIAKGALTGGTEVSALPCTTNAPGNGKPVGSPHVVTSHQSKVTVESTP 674
+
+ Score = 51 (23.0 bits), Expect = 0.12, Sum P(2) = 0.11
+ Identities = 22/70 (31%), Positives = 32/70 (45%)
+
+Query: 11 SVDSLPATP--ASEVPVLTVSPADTSL------NSADVKTQ-EVKPEEKKPAKKRKSWGQ 61
+ S+ LP TP S +P +V A + N VK + +V+PE+K P K+ +
+Sbjct: 335 SLPHLPGTPRPTSSLPPGSVKAAPAQVRPPSPGNIRPVKREVKVEPEKKDPEKEPQKVAN 394
+
+Query: 62 ELPVPKTNLP 71
+ E P K P
+Sbjct: 395 E-PSLKGRAP 403
+
+
+>sp|P29596|ATF3_RAT Cyclic AMP-dependent transcription factor ATF-3 OS=Rattus
+ norvegicus GN=Atf3 PE=2 SV=1
+ Length = 181
+
+ Score = 90 (36.7 bits), Expect = 0.12, P = 0.11
+ Identities = 29/99 (29%), Positives = 48/99 (48%)
+
+Query: 62 ELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ 121
+ E+ V K+ + P EDE+++RR ER N+ AA R +K+ + E L+ E ++E
+Sbjct: 73 EMSVTKSEVAPE-----EDERKRRRRER---NKIAAAKCRNKKKEKTECLQKESEKLESV 124
+
+Query: 122 NQFLLQRLSQMEAENNRLSQQLA--QLAAEVRGSRANTP 158
+ N L ++ +++ E L L + VR TP
+Sbjct: 125 NAELKAQIEELKNEKQHLIYMLNLHRPTCIVRAQNGRTP 163
+
+
+>sp|Q5TM26|BAT2_MACMU Large proline-rich protein BAT2 OS=Macaca mulatta GN=BAT2
+ PE=3 SV=1
+ Length = 2160
+
+ Score = 104 (41.7 bits), Expect = 0.12, P = 0.11
+ Identities = 49/196 (25%), Positives = 84/196 (42%)
+
+Query: 18 TPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRK---SWGQELPVPKTNLPPRK 74
+ +P SE+P + A+TS + + P+ P R +WG P PP K
+Sbjct: 380 SPNSELPPPKTAWAETS-RPPETEPGPPAPKPPLPPPHRGPAGNWGPPGDYPDRGGPPCK 438
+
+Query: 75 RAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEA 134
+ EDE E R +R R +++++ S +R + E E+ E++ ++L +++
+Sbjct: 439 PPAPEDEDEAWR-QR--RKQSSSEISLAVERARRRREEEERRMQEERRAACAEKLKRLDE 495
+
+Query: 135 ENNRLSQQL-AQLAAEVRGSRANTPMPG------SPATASPTLTPTLFKQ--ERDELPLE 185
+ + ++L A+ AA P P +P SP PT K+ E + P
+Sbjct: 496 KFGAPDKRLKAEPAAPPAAPSTPAPPPAVPKELPAPLAPSPASAPTPEKEPEESAQAPPA 555
+
+Query: 186 RIPFPTPSLSDYSPTL 201
+ + PTP ++ +PTL
+Sbjct: 556 QCT-PTPGVAA-APTL 569
+
+
+>sp|Q0IHP2|INCE_XENTR Inner centromere protein OS=Xenopus tropicalis GN=incenp
+ PE=2 SV=1
+ Length = 898
+
+ Score = 100 (40.3 bits), Expect = 0.12, P = 0.12
+ Identities = 42/152 (27%), Positives = 71/152 (46%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTED---EKEQRRIERV-LRNRAAAQ 98
+ Q+ + EE+ +K+ + + L + R+R + + EKE+ R ER + A Q
+Sbjct: 642 QKKREEEELERQKKIAEAKRLAEQRQAEQERERQREQQLLAEKERLRAERERIEREKALQ 701
+
+Query: 99 TSRERKRLEMEKLEN-----EKIQMEQQNQFLLQRLSQM--EAENNRLSQQLAQLAAEVR 151
+ RE +R EK + E+ + EQQ + +RL ++ E E RL ++ + A E +
+Sbjct: 702 LQRELERAAQEKEQQRREAEERKKREQQERLEQERLERLHKEQEAKRLQEEQQRKAKE-Q 760
+
+Query: 152 GSRANTP-------MPGSPATASPTLTPTLFK 176
+ + A+ P M SPA S +TP +K
+Sbjct: 761 AAAASAPVMNVTVDMQNSPACESYEMTPKSYK 792
+
+ Score = 85 (35.0 bits), Expect = 5.5, P = 0.996
+ Identities = 31/112 (27%), Positives = 56/112 (50%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPP--RK-RAKTEDEKEQRRIERVLRNRAAA 97
+ K +E + E+K KK + QE + RK +AK +E+E+R + + + R
+Sbjct: 589 KVREDRMAEEKAKKKITAKKQEEVECRRRQEEEARKLKAKQMEEEERRHQDLLQKKREEE 648
+
+Query: 98 QTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE 149
+ + R++K E ++L ++ Q EQ+ + QR Q+ AE RL + ++ E
+Sbjct: 649 ELERQKKIAEAKRLAEQR-QAEQERE--RQREQQLLAEKERLRAERERIERE 697
+
+
+>sp|Q9NQS7|INCE_HUMAN Inner centromere protein OS=Homo sapiens GN=INCENP PE=1
+ SV=3
+ Length = 918
+
+ Score = 100 (40.3 bits), Expect = 0.13, P = 0.12
+ Identities = 39/136 (28%), Positives = 66/136 (48%)
+
+Query: 18 TPASEVPVL-TVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRA 76
+ TP+S P V P T L++ + Q + P KS+ K N P R
+Sbjct: 478 TPSSPCPASKVVRPLRTFLHTVQ-RNQMLMTPTSAPRSVMKSF------IKRNTPLRMDP 530
+
+Query: 77 KTED-EKEQRRIERVLRNRAAAQTSRER-KRLEMEKLENEKIQMEQQNQFLLQ---RLSQ 131
+ K EKE++R+E + R A Q R++ + + +LE K++ E++ + +LQ R+ Q
+Sbjct: 531 KCSFVEKERQRLENLRRKEEAEQLRRQKVEEDKRRRLEEVKLKREERLRKVLQARERVEQ 590
+
+Query: 132 MEAENNR-LSQQLAQL 146
+ M+ E + + Q+ AQ+
+Sbjct: 591 MKEEKKKQIEQKFAQI 606
+
+ Score = 94 (38.1 bits), Expect = 0.58, P = 0.44
+ Identities = 28/116 (24%), Positives = 58/116 (50%)
+
+Query: 37 SADVKTQEVKPEEKKPAKKRK-SWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRA 95
+ +A K +EV+ K+ + R+ W Q+ + + ++ K E+EQ R+ + +
+Sbjct: 627 AAAKKMEEVEARRKQEEEARRLRWLQQEEEERRHQELLQKKK---EEEQERLRKAAEAKR 683
+
+Query: 96 AAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ A+ RE++R E E+ E E+ + E++ Q ++ Q+ + R Q+ Q E++
+Sbjct: 684 LAE-QREQERREQERREQERREQERREQERREQERQLAEQERRREQERLQAERELQ 738
+
+ Score = 91 (37.1 bits), Expect = 1.2, P = 0.71
+ Identities = 29/118 (24%), Positives = 56/118 (47%)
+
+Query: 39 DVKTQEVKPE---EKKPAKKRKSWG-QELPVPKTNLPPRKRAK-TEDEKEQRRIERVLRN 93
+ D KT++ K E E+K KK + +E+ + +R + + E+E+RR + +L+
+Sbjct: 607 DEKTEKAKEERLAEEKAKKKAAAKKMEEVEARRKQEEEARRLRWLQQEEEERRHQELLQK 666
+
+Query: 94 RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ + + R RK E ++L ++ Q ++ + Q + E +Q QLA + R
+Sbjct: 667 KKEEEQERLRKAAEAKRLAEQREQERREQERREQERREQERREQERREQERQLAEQER 724
+
+ Score = 90 (36.7 bits), Expect = 1.6, P = 0.80
+ Identities = 40/144 (27%), Positives = 70/144 (48%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK-EQRRIERVLRNRAAAQT 99
+ K +E + E + A + K ++ + R++ + E E+ EQ R E+ R A +
+Sbjct: 666 KKKEEEQERLRKAAEAKRLAEQREQERREQERREQERREQERREQERREQE-RQLAEQER 724
+
+Query: 100 SRERKRLEMEK--LENEK---IQMEQQNQFLLQRLSQMEAEN---NRLSQQLAQLAAEVR 151
+ RE++RL+ E+ E EK +Q EQ + L ++ + E + +L ++ + A E
+Sbjct: 725 RREQERLQAERELQEREKALRLQKEQLQRELEEKKKKEEQQRLAERQLQEEQEKKAKEAA 784
+
+Query: 152 G-SRA-NTPMP-GSPATASPTLTP 172
+ G S+A N + SPA S +TP
+Sbjct: 785 GASKALNVTVDVQSPACTSYQMTP 808
+
+ Score = 84 (34.6 bits), Expect = 7.2, P = 0.9993
+ Identities = 35/165 (21%), Positives = 77/165 (46%)
+
+Query: 34 SLNSAD-VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVL- 91
+ ++++ D V +E++ E ++ + S EL +PKT P +K + +++RRI V
+Sbjct: 25 NMDNKDLVWLEEIQEEAERMFTREFSKEPEL-MPKT--PSQK-----NRRKKRRISYVQD 76
+
+Query: 92 RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ NR + R++ +L + +++ + +++L+ + EN + +++ + AA
+Sbjct: 77 ENRDPIRRRLSRRKSRSSQLSSRRLRSKDS----VEKLATVVGENGSVLRRVTRAAAAAA 132
+
+Query: 152 GSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSD 196
+ + P SP SPT+ K E + + +P +S+
+Sbjct: 133 AATMALAAPSSPTPESPTMLTK--KPEDNHTQCQLVPVVEIGISE 175
+
+
+>sp|Q5HZY0|UBXN4_RAT UBX domain-containing protein 4 OS=Rattus norvegicus
+ GN=Ubxn4 PE=2 SV=1
+ Length = 506
+
+ Score = 97 (39.2 bits), Expect = 0.13, P = 0.12
+ Identities = 67/279 (24%), Positives = 116/279 (41%)
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQM 132
+ R K E+ +E++R E R + ER++ E L+ ++ Q E+ + +L+ S+
+Sbjct: 200 RLTKKLEERREEKRKEEAQRE---IKKEIERRKTGKEMLDYKRKQEEELTKRMLEERSRE 256
+
+Query: 133 EAENN----RLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTL---FKQE---RDEL 182
+ +AE+ R+ QQ+A AE R +R A A+ L K+E RD
+Sbjct: 257 KAEDRAARERIKQQIALDRAE-RAARFAKTKEAEAAKAAALLAKQAEAEVKRESSTRDRS 315
+
+Query: 183 PLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFD----LGSD 238
+ + RI F P S ++ PS A + Q A +V G+ S +F D
+Sbjct: 316 TIARIQFRLPDGSSFTNQF-PSD-APLEEARQFAAQTVGNTYGNFSLATMFPRREFTRED 373
+
+Query: 239 LKHHSTDDVAAPLSDDDFNRLFHGDSSVEPDSSVFEDGLAFDVLEGGDLSAFPFDSMVNF 298
+ K D AP + +S+ P SS G + +L G L +PF ++
+Sbjct: 374 YKRKLLDLELAPSASVVLLPAGRPATSIVPSSS----GDIWTLL-GTVL--YPFLAIWRL 426
+
+Query: 299 DSEPVTLEGIEMAHGLPDETTCKTSSVQPGFGASTTRCD 337
+ + ++ P +T+ + +S +P AS+++ +
+Sbjct: 427 ------ISNFLFSNPPPAQTSARATSTEPSNSASSSKSE 459
+
+
+>sp|Q90595|MAFF_CHICK Transcription factor MafF OS=Gallus gallus GN=MAFF PE=1
+ SV=1
+ Length = 149
+
+ Score = 87 (35.7 bits), Expect = 0.13, P = 0.12
+ Identities = 32/106 (30%), Positives = 53/106 (50%)
+
+Query: 63 LPVPKTNLPPRKRAKTEDEK-EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ 121
+ L V + N R +K E + +QRR R L+NR A + R ++ + E+L+ +K+++E +
+Sbjct: 32 LSVRELNHHLRGLSKEEVARLKQRR--RTLKNRGYAASCRVKRVCQKEELQKQKMELEWE 89
+
+Query: 122 NQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATAS 167
+ L + + M E + L + L R A+ P P ATAS
+Sbjct: 90 VDKLARENAAMRLELDTLRGKYEALQGFARTVAAHGP-PAKVATAS 134
+
+
+>sp|Q6ZSZ5|ARHGI_HUMAN Rho guanine nucleotide exchange factor 18 OS=Homo
+ sapiens GN=ARHGEF18 PE=1 SV=2
+ Length = 1173
+
+ Score = 101 (40.6 bits), Expect = 0.13, P = 0.12
+ Identities = 42/154 (27%), Positives = 69/154 (44%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRL 139
+ +++ QR E+ RAA + + + R E ++ E E+ Q+ + RL + E E +L
+Sbjct: 851 EQERQRNFEKQREERAALEKLQSQLRHEQQRWERERQWQHQELERAGARLQEREGEARQL 910
+
+Query: 140 SQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSP 199
+ ++L Q AE+ R + ++ER EL L R+ + +P
+Sbjct: 911 RERLEQERAELERQRQAYQHDLERLREAQRAVER--ERERLEL-LRRL-----KKQNTAP 962
+
+Query: 200 -TLKPSTLAESSDVAQHPAVSVAGLEGDG-SALP 231
+ L P TLAE+ + P+ + GLEG S LP
+Sbjct: 963 GALPPDTLAEAQPPSHPPSFNGEGLEGPRVSMLP 996
+
+
+>sp|Q7PS12|MOEH_ANOGA Moesin/ezrin/radixin homolog 1 OS=Anopheles gambiae
+ GN=Moe PE=3 SV=4
+ Length = 624
+
+ Score = 98 (39.6 bits), Expect = 0.13, P = 0.12
+ Identities = 26/118 (22%), Positives = 61/118 (51%)
+
+Query: 36 NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKE--QRRIERVLRN 93
+ ++ DV+ + + ++K AK+++ +L + +K+ + ED Q +ER N
+Sbjct: 299 DTIDVQQMKAQARDEKNAKQQEREKLQLALAARERAEKKQQEYEDRLRSMQEEMERKQAN 358
+
+Query: 94 RAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ + AQ + R + ++ +++ K ++EQ+ L + + ++E N + + A+L E+R
+Sbjct: 359 LSEAQDTIRRLQEQLNQVQAAKEELEQRQNELHEMMQRLEETKNMEATERAKLEEEIR 416
+
+
+>sp|P12957|CALD1_CHICK Caldesmon OS=Gallus gallus GN=CALD1 PE=1 SV=2
+ Length = 771
+
+ Score = 99 (39.9 bits), Expect = 0.13, P = 0.13
+ Identities = 41/144 (28%), Positives = 63/144 (43%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEK---EQRRIERVLRNRAAAQT 99
+ + +K EE+K A + K +E K R+RAK E+EK E+R + R AA+
+Sbjct: 261 ERLKAEEEKKAAEEKQKAEE---EKKAAEERERAKAEEEKRAAEERERAKAEEERKAAE- 316
+
+Query: 100 SRERKRLEME-KLENEKIQMEQQNQFLLQRLSQME---AENNRLSQQLAQLAAEVRGSRA 155
+ RER + E E K E+ + E++ + +R E A R + + AAE R RA
+Sbjct: 317 ERERAKAEEERKAAEERAKAEEERKAAEERAKAEEERKAAEERAKAEKERKAAEER-ERA 375
+
+Query: 156 NTPMPGSPATASPTLTPTLFKQER 179
+ A L K+++
+Sbjct: 376 KAEEEKRAAEEKARLEAEKLKEKK 399
+
+ Score = 98 (39.6 bits), Expect = 0.17, P = 0.16
+ Identities = 44/188 (23%), Positives = 81/188 (43%)
+
+Query: 31 ADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERV 90
+ A+ +A+ + + EEK+ A++R+ E + R+RAK E+E++ ER
+Sbjct: 278 AEEEKKAAEERERAKAEEEKRAAEERERAKAE--EERKAAEERERAKAEEERKAAE-ERA 334
+
+Query: 91 LRNRAAAQTSRERKRLEME-KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE 149
+ + + + ER + E E K E+ + E++ + +R E R +++ A+L AE
+Sbjct: 335 -KAEEERKAAEERAKAEEERKAAEERAKAEKERKAAEERERAKAEEEKRAAEEKARLEAE 393
+
+Query: 150 VRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSD-YSPTLKPSTLAE 208
+ + M A L KQE D+ ++ SL + PT K + +
+Sbjct: 394 KLKEKKK--MEEKKAQEEKAQANLLRKQEEDKEA--KVEAKKESLPEKLQPTSKKDQVKD 449
+
+Query: 209 SSDVAQHP 216
+ + D + P
+Sbjct: 450 NKDKEKAP 457
+
+ Score = 82 (33.9 bits), Expect = 9.7, P = 0.99994
+ Identities = 44/196 (22%), Positives = 76/196 (38%)
+
+Query: 52 PAKKRKSWGQELPVPKT----NLPPRKRAK--TEDEKEQRRIERVLRNRAAAQTSRERKR 105
+ P +K ++ +EL PK N R K E +++ + A +++R
+Sbjct: 472 PEQKAQNGERELTTPKLKSTENAFGRSNLKGAANAEAGSEKLKEKQQEAAVELDELKKRR 531
+
+Query: 106 LEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPAT 165
+ E K+ E+ Q ++Q + +R + E E R+ +++ + AE R P G
+Sbjct: 532 EERRKILEEEEQKKKQEE--AERKIREEEEKKRMKEEIERRRAEAAEKRQKVPEDGVSEE 589
+
+Query: 166 ASPTLTPTLFKQERDELPLE-RIPFPTPSLSDYSPTLKPS-TLAESSDVAQHPAVSVAGL 223
+ P F + L +E R F S +KP+ T A S + + +
+Sbjct: 590 KKPF---KCFSPKGSSLKIEERAEFLNKSAQKSG--MKPAHTTAVVSKIDSRLEQYTSAV 644
+
+Query: 224 EGDGSALPLFDLGSDL 239
+ G+ +A P SDL
+Sbjct: 645 VGNKAAKPAKPAASDL 660
+
+
+>sp|Q08DA8|ATF1_BOVIN Cyclic AMP-dependent transcription factor ATF-1 OS=Bos
+ taurus GN=ATF1 PE=2 SV=1
+ Length = 270
+
+ Score = 93 (37.8 bits), Expect = 0.13, P = 0.13
+ Identities = 20/58 (34%), Positives = 38/58 (65%)
+
+Query: 76 AKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQME 133
+ +KT+D + +R I R+++NR AA+ R +K+ ++ LEN +E QN+ L++ L ++
+Sbjct: 206 SKTDDPQLKREI-RLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKTLK 262
+
+
+>sp|Q94126|CES2_CAEEL Cell death specification protein 2 OS=Caenorhabditis
+ elegans GN=ces-2 PE=1 SV=1
+ Length = 211
+
+ Score = 91 (37.1 bits), Expect = 0.14, P = 0.13
+ Identities = 33/123 (26%), Positives = 64/123 (52%)
+
+Query: 26 LTVSPADTSLNSADV--KTQEVKPEEK---KPAKKRKSW--GQELPVPKTNLPPRKRAKT 78
+ L + P D SL + ++ T+++K E++ P R S P+ + P RK +
+Sbjct: 52 LGILPFD-SLPTTNLLTPTKKIKLEDELCASPVSSRSSTVSSSHFSSPQRS-PSRKMSVP 109
+
+Query: 79 --EDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN 136
+ E++K+ ER +N AA+ SR+ +R + E++ ++ +E++N L ++S +E E
+Sbjct: 110 IPEEKKDSAYFERRRKNNDAAKRSRDARRQKEEQIASKAHALERENMQLRGKVSSLEQEA 169
+
+Query: 137 NRL 139
+ +L
+Sbjct: 170 AQL 172
+
+
+>sp|O66547|Y157_AQUAE Uncharacterized protein aq_157 OS=Aquifex aeolicus
+ GN=aq_157 PE=3 SV=1
+ Length = 162
+
+ Score = 88 (36.0 bits), Expect = 0.14, P = 0.13
+ Identities = 30/102 (29%), Positives = 60/102 (58%)
+
+Query: 34 SLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRN 93
+ SL+ A V T +V E K AK + EL + L ++ E +K+ +++ L +
+Sbjct: 21 SLDFACVDTNKVIRESKFIAKAQT----EL---RKELEKYQKLIQEKQKKLEALKKSLES 73
+
+Query: 94 RAAAQTSRERKRLEMEKLENE--KIQMEQQNQFLLQRLSQME 133
+ +A ++ ++E+K E+E+LE+E K+Q+E Q++ L ++ +++E
+Sbjct: 74 KALSEKAKEKKAKEIEQLEDELRKLQVEAQSK-LSRKKAELE 114
+
+
+>sp|A6ZRZ0|NST1_YEAS7 Stress response protein NST1 OS=Saccharomyces cerevisiae
+ (strain YJM789) GN=NST1 PE=3 SV=1
+ Length = 1240
+
+ Score = 101 (40.6 bits), Expect = 0.14, P = 0.13
+ Identities = 32/112 (28%), Positives = 61/112 (54%)
+
+Query: 35 LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNR 94
+ L +++ +E + ++ + AK++K +E K L ++R + EK++++ E + R R
+Sbjct: 681 LEEREMRRREAQRKKVEEAKRKKD--EER---KRRLEEQQRREEMQEKQRKQKEELKRKR 735
+
+Query: 95 AAAQTS-RERKRLEMEKLENEKIQMEQQ-----NQFLLQRLSQMEAENNRLS 140
+ + RE+KRLE EKL+ EK + E+Q + Q+L++ + N LS
+Sbjct: 736 EEEKKRIREQKRLEQEKLQKEKEEEERQRLIAEDALRKQKLNEEQTSANILS 787
+
+ Score = 92 (37.4 bits), Expect = 1.4, P = 0.74
+ Identities = 47/193 (24%), Positives = 78/193 (40%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ K +E K KK ++R+ +E K RK+ DE+ +RR+E R +
+Sbjct: 669 KREEEKERLKKELEEREMRRREAQRKKVEEAKRKK----DEERKRRLEEQQRREEMQEKQ 724
+
+Query: 101 RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP 160
+ R++K K E EK ++ +Q + ++L Q E E + +A+ A +R + N
+Sbjct: 725 RKQKEELKRKREEEKKRIREQKRLEQEKL-QKEKEEEERQRLIAEDA--LRKQKLNEEQ- 780
+
+Query: 161 GSPATASPTLTPTLFKQERDELPLERIPFP--TPSLSDYSPTLKPSTLAESSDVAQHPAV 218
+ T++ L+ F + P+ P T D S ++ L + VA V
+Sbjct: 781 ----TSANILSAKPFTENGVGNPVSSQSHPNMTNYQEDNSCSINDEILKMVNSVAASKPV 836
+
+Query: 219 SVAGLEGDGSALP 231
+ S G LP
+Sbjct: 837 SPTGFNVHDLLLP 849
+
+ Score = 86 (35.3 bits), Expect = 6.1, P = 0.998
+ Identities = 25/110 (22%), Positives = 55/110 (50%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE 102
+ +E + + +K KK+K +E + ++ K + E+E+ R+++ L R + +
+Sbjct: 633 EEKRKKREKEEKKQKKREKEKEKKRLQQLAKEEEKRKREEEKERLKKELEEREMRRREAQ 692
+
+Query: 103 RKRLE---MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE 149
+ RK++E +K E K ++E+Q QR +M+ + + ++L + E
+Sbjct: 693 RKKVEEAKRKKDEERKRRLEEQ-----QRREEMQEKQRKQKEELKRKREE 737
+
+
+>sp|P53935|NST1_YEAST Stress response protein NST1 OS=Saccharomyces cerevisiae
+ GN=NST1 PE=1 SV=1
+ Length = 1240
+
+ Score = 101 (40.6 bits), Expect = 0.14, P = 0.13
+ Identities = 32/112 (28%), Positives = 61/112 (54%)
+
+Query: 35 LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNR 94
+ L +++ +E + ++ + AK++K +E K L ++R + EK++++ E + R R
+Sbjct: 681 LEEREMRRREAQRKKVEEAKRKKD--EER---KRRLEEQQRREEMQEKQRKQKEELKRKR 735
+
+Query: 95 AAAQTS-RERKRLEMEKLENEKIQMEQQ-----NQFLLQRLSQMEAENNRLS 140
+ + RE+KRLE EKL+ EK + E+Q + Q+L++ + N LS
+Sbjct: 736 EEEKKRIREQKRLEQEKLQKEKEEEERQRLIAEDALRKQKLNEEQTSANILS 787
+
+ Score = 92 (37.4 bits), Expect = 1.4, P = 0.74
+ Identities = 47/193 (24%), Positives = 78/193 (40%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ K +E K KK ++R+ +E K RK+ DE+ +RR+E R +
+Sbjct: 669 KREEEKERLKKELEEREMRRREAQRKKVEEAKRKK----DEERKRRLEEQQRREEMQEKQ 724
+
+Query: 101 RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP 160
+ R++K K E EK ++ +Q + ++L Q E E + +A+ A +R + N
+Sbjct: 725 RKQKEELKRKREEEKKRIREQKRLEQEKL-QKEKEEEERQRLIAEDA--LRKQKLNEEQ- 780
+
+Query: 161 GSPATASPTLTPTLFKQERDELPLERIPFP--TPSLSDYSPTLKPSTLAESSDVAQHPAV 218
+ T++ L+ F + P+ P T D S ++ L + VA V
+Sbjct: 781 ----TSANILSAKPFTENGVGNPVSSQSHPNMTNYQEDNSCSINDEILKMVNSVAASKPV 836
+
+Query: 219 SVAGLEGDGSALP 231
+ S G LP
+Sbjct: 837 SPTGFNVHDLLLP 849
+
+ Score = 86 (35.3 bits), Expect = 6.1, P = 0.998
+ Identities = 25/110 (22%), Positives = 55/110 (50%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE 102
+ +E + + +K KK+K +E + ++ K + E+E+ R+++ L R + +
+Sbjct: 633 EEKRKKREKEEKKQKKREKEKEKKRLQQLAKEEEKRKREEEKERLKKELEEREMRRREAQ 692
+
+Query: 103 RKRLE---MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAE 149
+ RK++E +K E K ++E+Q QR +M+ + + ++L + E
+Sbjct: 693 RKKVEEAKRKKDEERKRRLEEQ-----QRREEMQEKQRKQKEELKRKREE 737
+
+
+>sp|A3BYC1|HOX25_ORYSJ Homeobox-leucine zipper protein HOX25 OS=Oryza sativa
+ subsp. japonica GN=HOX25 PE=2 SV=2
+ Length = 320
+
+ Score = 94 (38.1 bits), Expect = 0.14, P = 0.13
+ Identities = 62/269 (23%), Positives = 107/269 (39%)
+
+Query: 24 PVLTVSPADTSLNSADVKTQEVKPEEK----KPAKKRKSWGQELPVPKTNLPPRKRAKTE 79
+ P LT + + L D+ + +E+ A+KR+ +++ + + KR K E
+Sbjct: 48 PFLTTTHDELELQMEDLVDELYGVDEQGSSSAAARKRRLTAEQVRALERSFEEEKR-KLE 106
+
+Query: 80 DEKEQRRIER--VLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENN 137
+ E++ R + + A R R + ++LE + ++ + LL + + A+N
+Sbjct: 107 PERKSELARRLGIAPRQVAVWFQNRRARWKTKQLELDFDRLRAAHDELLAGRTALAADNE 166
+
+Query: 138 RLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDY 197
+ L Q+ L +++ + +P P SPA A T P + LE L D
+Sbjct: 167 SLRSQVILLTEKLQAN-GKSPSP-SPAPAEQTAVPAA-PESAKSFQLEE----GRRLYDA 219
+
+Query: 198 SPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALP--LFDLGSDLKHHSTDDVAAPLSDDD 255
+ + + +T VA PA VA + P F S DD SDDD
+Sbjct: 220 AGSTT-TTNGGGGGVAM-PAARVAAARAASNDSPESYFAGARSPPSSSEDDCGGAGSDDD 277
+
+Query: 256 F---NRLFHGDSSVEPDSSVFEDGLAFDV 281
+ + + L D+++ D+ FE +A V
+Sbjct: 278 YPSSSVLLPVDATLVGDA--FEHAVAATV 304
+
+
+>sp|B1AZI6|THOC2_MOUSE THO complex subunit 2 OS=Mus musculus GN=Thoc2 PE=3 SV=1
+ Length = 1594
+
+ Score = 102 (41.0 bits), Expect = 0.14, P = 0.13
+ Identities = 44/182 (24%), Positives = 83/182 (45%)
+
+Query: 36 NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRA 95
+ NS + VK +K+ K+++ +E P T P RA +D KE+ + ER +
+Sbjct: 1257 NSGSNSNKAVKENDKEKVKEKEKEKKE-KTPATT--PEARALGKDSKEKPKEERPNKEDK 1313
+
+Query: 96 AAQTSRERKRLEMEKLENEKIQMEQQNQF-----LLQRLSQMEAENNRLSQQLAQLAAEV 150
+ A +T + + EK + +K + + +F +++ S E E + + +A E+
+Sbjct: 1314 ARETKERTPKSDKEKEKFKKEEKAKDEKFKTTVPIVESKSTQEREREKEPSRERDVAKEM 1373
+
+Query: 151 RGSRAN------TPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPS 204
+ + S+ N TP+ GS SP + + +R++ + P+PS +S T+K S
+Sbjct: 1374 K-SKENVKGGEKTPVSGS--LKSPVPRSDISEPDREQKRRKIDSHPSPS---HSSTVKDS 1427
+
+Query: 205 TL 206
+ +
+Sbjct: 1428 LI 1429
+
+
+>sp|Q9H254|SPTN4_HUMAN Spectrin beta chain, brain 3 OS=Homo sapiens GN=SPTBN4
+ PE=1 SV=2
+ Length = 2564
+
+ Score = 104 (41.7 bits), Expect = 0.15, P = 0.14
+ Identities = 51/210 (24%), Positives = 80/210 (38%)
+
+Query: 6 EKTMSSVDSLPATPASEVPV-LTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELP 64
+ E+ +D LP P P L +P D +A+ E+ +P +R QE
+Sbjct: 2186 ERLQPRIDRLPEIPGRVEPAALPAAPED----AAETPATPAAAEQVRPRPER----QESA 2237
+
+Query: 65 VPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQF 124
+ LP R+R + ++ +Q E R R Q S E + L + QME++ +
+Sbjct: 2238 DRAEELPRRRRPERQESVDQSE-EAARRRRPERQESAEHEAAHSLTLGRYE-QMERRRER 2295
+
+Query: 125 LLQRLSQMEAENNRL---------SQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLF 175
+ +RL + E+ + LA + +++ A +P P+ P P
+Sbjct: 2296 RERRLERQESSEQEMPIRGDLVKGKATLADIVEQLQEKEAGPGLPAGPSLPQPRELPPGR 2355
+
+Query: 176 KQERDELPLERIPFPT-PSLSDY-SPTLKP 203
+ ELP ER P P P D P +P
+Sbjct: 2356 LPNGLELP-ERTPRPDRPRARDRPKPRRRP 2384
+
+
+>sp|Q2UNX4|KAPC_ASPOR Putative transcription factor kapC OS=Aspergillus oryzae
+ GN=kapC PE=3 SV=2
+ Length = 284
+
+ Score = 93 (37.8 bits), Expect = 0.15, P = 0.14
+ Identities = 49/213 (23%), Positives = 86/213 (40%)
+
+Query: 16 PATPASEVPVL---TVSPAD-TSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLP 71
+ P PA++ P + T SP D +++ A + + P + + GQE P
+Sbjct: 44 PQPPAAQPPHMQPNTTSPRDQNNIDPAISGAAMLSGPPQTPPQPEPT-GQESP------- 95
+
+Query: 72 PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ KT ++ +R +NRAA + R+RK + KLE + + + ++
+Sbjct: 96 -----KTYGKRPLSTSKRAAQNRAAQRAFRQRKESYIRKLEEQVKEFDTMSE----AFKA 146
+
+Query: 132 MEAENNRLSQQLAQLAAEVRGSRANTP-MPGSPATASPTLTPTLFKQERDELPLERIPFP 190
+ ++AEN +L + + L + + S+ P +PG+ + P T Q P
+Sbjct: 147 LQAENYQLREYIINLQSRLLESQGEVPELPGNIDLSQPR-TDLNVPQPGAGPATTSSSAP 205
+
+Query: 191 TPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGL 223
+ P S P A + D+ ++VAGL
+Sbjct: 206 APP-SGAQQAQPPQGAASNDDMNSLNRIAVAGL 237
+
+
+>sp|Q9JJ50|HGS_RAT Hepatocyte growth factor-regulated tyrosine kinase substrate
+ OS=Rattus norvegicus GN=Hgs PE=1 SV=1
+ Length = 776
+
+ Score = 94 (38.1 bits), Expect = 0.15, Sum P(2) = 0.14
+ Identities = 34/100 (34%), Positives = 52/100 (52%)
+
+Query: 82 KEQRRIERVLRNRAAAQTSRERKRLEMEKLE--NEKIQ--MEQQNQFLLQRLSQMEAENN 137
+ +E+ R E+ LR RAA + R+R+ +KLE +K Q +E Q Q +QRL + E E
+Sbjct: 487 REEHR-EK-LR-RAAEEAERQRQIQLAQKLEIMRQKKQEYLEVQRQLAIQRLQEQEKERQ 543
+
+Query: 138 -RLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFK 176
+ RL QQ + ++R P+P + A PT L++
+Sbjct: 544 MRLEQQ--KQTVQMRAQMPAFPLPYAQLQAMPTAGGVLYQ 581
+
+ Score = 48 (22.0 bits), Expect = 0.15, Sum P(2) = 0.14
+ Identities = 23/79 (29%), Positives = 35/79 (44%)
+
+Query: 6 EKTMSSVDSLPATPASE-VPVLTVSPADTSLNSADVKT-----QEVKPE----------E 49
+ ++ M + A P SE P+ + +P SL S+ V + +++ PE E
+Sbjct: 277 KERMRQKSTYTAHPKSEPAPLASSAPPAGSLYSSPVNSSAPLAEDIDPELARYLNRNYWE 336
+
+Query: 50 KKPAKKRKSWGQELPVPKT 68
+ KK + RKS PVP T
+Sbjct: 337 KKQEEARKSPTPSAPVPLT 355
+
+
+>sp|Q2KII1|ATF3_BOVIN Cyclic AMP-dependent transcription factor ATF-3 OS=Bos
+ taurus GN=ATF3 PE=2 SV=1
+ Length = 181
+
+ Score = 89 (36.4 bits), Expect = 0.15, P = 0.14
+ Identities = 29/99 (29%), Positives = 47/99 (47%)
+
+Query: 62 ELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ 121
+ E+ V K + P EDE+++RR ER N+ AA R +K+ + E L+ E ++E
+Sbjct: 73 EMSVTKAEVAPE-----EDERKKRRRER---NKIAAAKCRNKKKEKTECLQKESEKLESV 124
+
+Query: 122 NQFLLQRLSQMEAENNRLSQQLA--QLAAEVRGSRANTP 158
+ N L ++ +++ E L L + VR TP
+Sbjct: 125 NAELKAQIEELKNEKQHLIYMLNLHRPTCIVRAQNGRTP 163
+
+
+>sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcription factor ATF-6 beta
+ OS=Homo sapiens GN=ATF6B PE=1 SV=2
+ Length = 703
+
+ Score = 98 (39.6 bits), Expect = 0.15, P = 0.14
+ Identities = 39/135 (28%), Positives = 62/135 (45%)
+
+Query: 17 ATPASEVPVLT--VSPADTS---LNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLP 71
+ A P S +L V P S L ++ Q P P +RKS P+P + P
+Sbjct: 260 AVPPSTTVLLQSLVQPPPVSPVVLIQGAIRVQPEGPAPSLPRPERKSI-VPAPMPGNSCP 318
+
+Query: 72 PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLEN-------EKIQMEQQNQF 124
+ P D K +R +R+++NR +A SR +K+ ++ LE + Q+ ++N
+Sbjct: 319 PEV-----DAKLLKRQQRMIKNRESACQSRRKKKEYLQGLEARLQAVLADNQQLRRENAA 373
+
+Query: 125 LLQRLSQMEAENNRL 139
+ L +RL + AEN+ L
+Sbjct: 374 LRRRLEALLAENSEL 388
+
+
+>sp|Q7TSC1|BAT2_MOUSE Large proline-rich protein BAT2 OS=Mus musculus GN=Bat2
+ PE=1 SV=1
+ Length = 2158
+
+ Score = 103 (41.3 bits), Expect = 0.16, P = 0.14
+ Identities = 58/227 (25%), Positives = 93/227 (40%)
+
+Query: 18 TPASEVPVLTVSPADTSL--NSADVKTQEVKPEEKKPAKKRK-----SWGQELPVPKTNL 70
+ +P SE+P P T+ N+ +T+ P K P +WG P
+Sbjct: 378 SPGSELP-----PPKTAWTENARPSETEPAPPTPKPPPPPPHRGPVGNWGPPGDYPDRGG 432
+
+Query: 71 PPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLS 130
+ PP K EDE E R +R R +++++ S +R + E E+ E++ ++L
+Sbjct: 433 PPCKPPAPEDEDEAWR-QR--RKQSSSEISLAVERARRRREEEERRMQEERRAACAEKLK 489
+
+Query: 131 QMEAENNRLSQQL-AQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF 189
+ +++ + ++L A+ AA P P +PA +P L P + K+ L P
+Sbjct: 490 RLDEKFGAPDKRLKAEPAA---------P-PVTPA--APALPPVVPKEIPAAPALPPTPT 537
+
+Query: 190 PTPSLSDYSPTLKPST-LAESSDVAQHPA-VSVAGLEGDGSALPLFD 234
+ PTP P P A S VA P VS G + ++ F+
+Sbjct: 538 PTPEKEPEEPAQAPPVQAAPSPGVAPVPTLVSGGGCTANSNSSGSFE 584
+
+
+>sp|Q4I877|NDE1_GIBZE Nuclear distribution protein nudE homolog 1 OS=Gibberella
+ zeae GN=NDE1 PE=3 SV=1
+ Length = 583
+
+ Score = 97 (39.2 bits), Expect = 0.16, P = 0.14
+ Identities = 46/161 (28%), Positives = 74/161 (45%)
+
+Query: 80 DEKEQRRIERVLRNRAA---AQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN 136
+ + K + IER + + RE+ R+E ++L E ++ + + L + + E+ +
+Sbjct: 137 ESKYNQAIERAVMMEEEIKIGEQEREQLRIESQRLREELGDLKIEAELLQDKFKKQESRH 196
+
+Query: 137 -NRLSQQLAQLAAEV-RGSRANTPMPGSPATASPTLTPTLFKQ-ERDELPLERIPFP-TP 192
+ + +S L+ LA+ G A+ PGS A++ TPT K D L +P P +P
+Sbjct: 197 LSTISTDLSVLASPTFDGHPAS---PGSTASSPLITTPTDSKSMTEDGDTLSELPDPPSP 253
+
+Query: 193 SLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEG-DGSALPL 232
+ +SD S L P +A S A VS + L D S PL
+Sbjct: 254 PMSDVSAPL-PK-VAASRPSAHRRTVSRSRLPSTDISTTPL 292
+
+
+>sp|Q84WU4|GOGC3_ARATH Golgin candidate 3 OS=Arabidopsis thaliana GN=GC3 PE=1
+ SV=1
+ Length = 712
+
+ Score = 98 (39.6 bits), Expect = 0.16, P = 0.15
+ Identities = 35/122 (28%), Positives = 64/122 (52%)
+
+Query: 74 KRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQME---QQNQFL---LQ 127
+ +R ++E KE+ R+ +N+ + + S+ R L+ + LE + +QM+ Q++ + ++
+Sbjct: 218 ERKRSESFKEELESMRLDKNKTSMEISKMRSELDAKLLEIKHLQMKLTGQESHAIGPGME 277
+
+Query: 128 RLSQ----MEAENNRLSQQLAQLAAEVRGSRANTPMPGSP-ATASPTLTP-TLFKQERDE 181
+ L + +E ENN L + ++L A + SR T P AT S T P TL K++ +
+Sbjct: 278 HLKEVNKALEKENNELKLKRSELEAALEESRKLTNSKVFPDATESLTRHPSTLDKEKPES 337
+
+Query: 182 LP 183
+ P
+Sbjct: 338 FP 339
+
+
+>sp|Q499N6|UBXN1_RAT UBX domain-containing protein 1 OS=Rattus norvegicus
+ GN=Ubxn1 PE=2 SV=2
+ Length = 297
+
+ Score = 93 (37.8 bits), Expect = 0.16, P = 0.15
+ Identities = 43/181 (23%), Positives = 78/181 (43%)
+
+Query: 19 PASEVPVLTVSPADTSLNSADVKTQEVKPE-------EKKPAKKRKSWGQELPVPKTNLP 71
+ P + P+ T P L +++V PE E KP + QE L
+Sbjct: 46 PDVDEPLET--PLSHILGREPTPSEQVGPEGSGSAAGESKPVLTEEE-RQEQTKRMLELV 102
+
+Query: 72 PRKRAKTEDEKEQRRIERVL-RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLS 130
+ +K+ + E+ +E+ +ER R R + S R++L+ +++ + ++ L
+Sbjct: 103 AQKQREREEREEREALEREKQRRRQGQELSAARQKLQEDEIRRAAEERRREKAEELAARQ 162
+
+Query: 131 QMEAENNRLSQQLAQLAAEVRGSRANTPM--PGSPATASPTLTPTLFKQERDELPLE-RI 187
+ ++ + R + AQ GSR++ P PG P +SP P K+E D+ ++ R+
+Sbjct: 163 RVREKIERDKAERAQKYGGTVGSRSSPPATDPG-PVPSSPRQEPPT-KREYDQCRIQVRL 220
+
+Query: 188 P 188
+ P
+Sbjct: 221 P 221
+
+
+>sp|B4PPK2|FOSL_DROYA Transcription factor kayak OS=Drosophila yakuba GN=kay
+ PE=3 SV=1
+ Length = 552
+
+ Score = 81 (33.6 bits), Expect = 0.16, Sum P(3) = 0.15
+ Identities = 20/73 (27%), Positives = 36/73 (49%)
+
+Query: 72 PRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ P + E+EQ+R R RN+ AA R+R+ + +L E Q+E++ + + +
+Sbjct: 201 PNRSTNMTPEEEQKRAVRRERNKQAAARCRKRRVDQTNELTEEVEQLEKRGDSMRKEIEA 260
+
+Query: 132 MEAENNRLSQQLA 144
+ + N+L LA
+Sbjct: 261 LTMSKNQLEYCLA 273
+
+ Score = 53 (23.7 bits), Expect = 0.16, Sum P(3) = 0.15
+ Identities = 21/59 (35%), Positives = 27/59 (45%)
+
+Query: 183 PLERIPFPTPSLSDY--SPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDL 239
+ P +RI P S + TL T A S + Q P S A + G GSA P+ GS +
+Sbjct: 382 PSKRITLPPMSTMPHVHMSTLMTPTGASSGSL-QTPITSTAPV-GFGSAFPVTTNGSSI 438
+
+ Score = 42 (19.8 bits), Expect = 0.16, Sum P(3) = 0.15
+ Identities = 13/34 (38%), Positives = 20/34 (58%)
+
+Query: 10 SSVDSLPATPASEVPVLTVSPADTSLNSADVKTQ 43
+ S V+SLP PA +V + S ++ S N++ TQ
+Sbjct: 95 SGVNSLPIQPAYDVNLAQGSDSEDS-NASYNDTQ 127
+
+
+>sp|A4R8N4|PAN1_MAGGR Actin cytoskeleton-regulatory complex protein PAN1
+ OS=Magnaporthe grisea GN=PAN1 PE=3 SV=1
+ Length = 1431
+
+ Score = 101 (40.6 bits), Expect = 0.17, P = 0.15
+ Identities = 48/191 (25%), Positives = 79/191 (41%)
+
+Query: 37 SADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAA 96
+ +A E KP P++K +E K +R E E++QR++ + A
+Sbjct: 1022 AASAPKTEAKPPPPPPSRKAAP-DRETAAKKAE---EERLAQEQEEQQRQMREM---EAK 1074
+
+Query: 97 AQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRAN 156
+ A+ + E E +E+Q L R ++EA R + QL E +
+Sbjct: 1075 AKAEEDALARENSAAEARLKALEEQEAKLAARRQEIEAAKRREEELQRQL--EAMNEEGS 1132
+
+Query: 157 TPMPGSPATASPTL-TPTLFKQERDELPLERIPFPTPSLSD-YSPTLKP--STLAESSD- 211
+ + PA +P TPT+ QE LER P P P +++ + + P L++SS+
+Sbjct: 1133 SSDDDEPAQITPQASTPTVGSQE-----LERKPSPPPQVAEPKTESRNPYFRMLSQSSEG 1187
+
+Query: 212 -VAQHPAVSVA 221
+ + P SV+
+Sbjct: 1188 PTSVSPQASVS 1198
+
+
+>sp|B2AWS3|PAN1_PODAN Actin cytoskeleton-regulatory complex protein PAN1
+ OS=Podospora anserina GN=PAN1 PE=3 SV=1
+ Length = 1441
+
+ Score = 101 (40.6 bits), Expect = 0.17, P = 0.15
+ Identities = 48/180 (26%), Positives = 80/180 (44%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRK---RAKT-EDEKEQRRIERVLRNRAA 96
+ K + + EE+ A+K + E + R+ RAK EDE + R E R +A
+Sbjct: 1024 KVDDRRAEEEAAARKAEEGRLERERGEQERQTRELEERAKDQEDELAKERAEADARLKAL 1083
+
+Query: 97 AQTSRERKRLEMEKLENEKIQM---EQQNQFLLQRLSQMEAENNRLSQQLAQLAA-EVRG 152
+ + R+ K + E+ +K M ++Q L QR +++EA R + QL A +V
+Sbjct: 1084 EEQVRQGKLKKEEEKRKKKAAMAEAKEQEAKLAQRRAEIEAARKREEELRKQLEALDVED 1143
+
+Query: 153 SRANT---PMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAES 209
+ S ++ P +P ++PTL + ++ P P P P S P + S+ AE+
+Sbjct: 1144 SSSDDDEGPEQITPQASTPTLGGSQVGGSQELEPAPPTPVPAPVQSP--PQIVTSSPAET 1201
+
+
+>sp|Q92545|TM131_HUMAN Transmembrane protein 131 OS=Homo sapiens GN=TMEM131
+ PE=1 SV=2
+ Length = 1834
+
+ Score = 102 (41.0 bits), Expect = 0.17, P = 0.15
+ Identities = 45/200 (22%), Positives = 83/200 (41%)
+
+Query: 21 SEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTED 80
+ S++ L + D + D EV E+ P+ KS G+ P+ + PP+K+ + E
+Sbjct: 1296 SDITSL-IEAMDKDFDHHDSPALEVFTEQP-PSPLPKSKGKGKPLQRKVKPPKKQEEKEK 1353
+
+Query: 81 EKEQRRIERVLRNRAA----AQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN 136
+ + + + E L++ A + T+ E + E L E + ++ Q + ++ ++
+Sbjct: 1354 KGKGKPQEDELKDSLADDDSSSTTTETSNPDTEPLLKEDTEKQKGKQAMPEKHESEMSQV 1413
+
+Query: 137 NRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSD 196
+ + S++L + E+ P P++ TP L ++R LP +IP PT S
+Sbjct: 1414 KQKSKKLLNIKKEI-------PTDVKPSSLELPYTPPLESKQRRNLP-SKIPLPTAMTSG 1465
+
+Query: 197 YSPTLKPSTLAESSDVAQHP 216
+ T S V P
+Sbjct: 1466 SKSRNAQKTKGTSKLVDNRP 1485
+
+
+>sp|Q38W81|IF2_LACSS Translation initiation factor IF-2 OS=Lactobacillus sakei
+ subsp. sakei (strain 23K) GN=infB PE=3 SV=1
+ Length = 937
+
+ Score = 99 (39.9 bits), Expect = 0.17, P = 0.16
+ Identities = 48/198 (24%), Positives = 75/198 (37%)
+
+Query: 4 DMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQEL 63
+ + EKT+ + ATPA+ P +P A K++ K + K A +R+ +
+Sbjct: 41 NQEKTLRAAFQTKATPAASKPATPAAP------KASEKSESGKIKINKTAIRRRPEADKK 94
+
+Query: 64 PVPKTNLPPRKRAKTEDEKE--QRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ 121
+ P +N P+ A + Q R N +A+ + R N + +
+Sbjct: 95 PAQHSNNRPQANANRNGQASNGQNRTNNARPNNNSARPNNSRPNTNSRPNNNSQNRSTSA 154
+
+Query: 122 NQ--FLLQRLSQMEAENNR----LSQQLAQLAAEVRGSR--ANTPMPGSPATASPTLTPT 173
+ N L +++SQ A R + QQ Q A+ + R AN P P + AS P+
+Sbjct: 155 NHPMSLQEQISQANARRQRTQERIQQQREQREADEKKRREQANRPRP-TRNNASNN-RPS 212
+
+Query: 174 LFKQERDELPLERIPFPT 191
+ K P P PT
+Sbjct: 213 NGKPTNGARPTTNSPRPT 230
+
+
+>sp|Q789F3|MAF_CHICK Transcription factor Maf OS=Gallus gallus GN=MAF PE=1 SV=1
+ Length = 359
+
+ Score = 94 (38.1 bits), Expect = 0.17, P = 0.16
+ Identities = 25/82 (30%), Positives = 47/82 (57%)
+
+Query: 83 EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ +Q+R R L+NR AQ+ R ++ + LE+EK Q+ QQ + L Q +S++ E + ++
+Sbjct: 276 KQKR--RTLKNRGYAQSCRFKRVQQRHVLESEKNQLLQQVEHLKQEISRLVRERDAYKEK 333
+
+Query: 143 LAQLAAE-VRGSRANTPMPGSP 163
+ +L + R + +++ P SP
+Sbjct: 334 YEKLVSNGFRENGSSSDNPSSP 355
+
+
+>sp|P49716|CEBPD_HUMAN CCAAT/enhancer-binding protein delta OS=Homo sapiens
+ GN=CEBPD PE=1 SV=2
+ Length = 269
+
+ Score = 92 (37.4 bits), Expect = 0.17, P = 0.16
+ Identities = 32/130 (24%), Positives = 57/130 (43%)
+
+Query: 19 PASEVPVLTVSPADT--SLNSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRA 76
+ P S +P + A T SL +A T PE + + ++ P P KR
+Sbjct: 131 PGSLLPAQVAACAQTVVSLAAAGQPTPPTSPEPPRSSPRQTP----APGPAREKSAGKRG 186
+
+Query: 77 KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN 136
+ E R +R RN A + SR++ + ++++ + +++ +N+ L QR+ Q+ +
+Sbjct: 187 PDRGSPEYR--QRRERNNIAVRKSRDKAKRRNQEMQQKLVELSAENEKLHQRVEQLTRDL 244
+
+Query: 137 NRLSQQLAQL 146
+ L Q QL
+Sbjct: 245 AGLRQFFKQL 254
+
+ Score = 88 (36.0 bits), Expect = 0.49, P = 0.39
+ Identities = 29/98 (29%), Positives = 48/98 (48%)
+
+Query: 60 GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE-RKRLEMEKLENEKIQ- 117
+ GQ P P + PPR + R E+ R + S E R+R E + K +
+Sbjct: 153 GQPTP-PTSPEPPRSSPRQTPAPGPAR-EKSAGKRGPDRGSPEYRQRRERNNIAVRKSRD 210
+
+Query: 118 -MEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ +++NQ + Q+L ++ AEN +L Q++ QL ++ G R
+Sbjct: 211 KAKRRNQEMQQKLVELSAENEKLHQRVEQLTRDLAGLR 248
+
+
+>sp|P81269|ATF1_MOUSE Cyclic AMP-dependent transcription factor ATF-1 OS=Mus
+ musculus GN=Atf1 PE=2 SV=1
+ Length = 269
+
+ Score = 92 (37.4 bits), Expect = 0.17, P = 0.16
+ Identities = 20/57 (35%), Positives = 37/57 (64%)
+
+Query: 77 KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQME 133
+ KT+D + +R I R+++NR AA+ R +K+ ++ LEN +E QN+ L++ L ++
+Sbjct: 206 KTDDPQLRREI-RLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKTLK 261
+
+
+>sp|P23091|MAF_AVIS4 Transforming protein Maf OS=Avian musculoaponeurotic
+ fibrosarcoma virus AS42 GN=V-MAF PE=1 SV=1
+ Length = 369
+
+ Score = 94 (38.1 bits), Expect = 0.18, P = 0.16
+ Identities = 25/82 (30%), Positives = 47/82 (57%)
+
+Query: 83 EQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQ 142
+ +Q+R R L+NR AQ+ R ++ + LE+EK Q+ QQ + L Q +S++ E + ++
+Sbjct: 276 KQKR--RTLKNRGYAQSCRFKRVQQRHVLESEKNQLLQQVEHLKQEISRLVRERDAYKEK 333
+
+Query: 143 LAQLAAE-VRGSRANTPMPGSP 163
+ +L + R + +++ P SP
+Sbjct: 334 YEKLVSNGFRENGSSSDNPSSP 355
+
+
+>sp|P18846|ATF1_HUMAN Cyclic AMP-dependent transcription factor ATF-1 OS=Homo
+ sapiens GN=ATF1 PE=1 SV=2
+ Length = 271
+
+ Score = 92 (37.4 bits), Expect = 0.18, P = 0.16
+ Identities = 20/57 (35%), Positives = 37/57 (64%)
+
+Query: 77 KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQME 133
+ KT+D + +R I R+++NR AA+ R +K+ ++ LEN +E QN+ L++ L ++
+Sbjct: 208 KTDDPQLKREI-RLMKNREAARECRRKKKEYVKCLENRVAVLENQNKTLIEELKTLK 263
+
+
+>sp|Q07283|TRHY_HUMAN Trichohyalin OS=Homo sapiens GN=TCHH PE=1 SV=2
+ Length = 1943
+
+ Score = 102 (41.0 bits), Expect = 0.18, P = 0.16
+ Identities = 28/120 (23%), Positives = 65/120 (54%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ + Q +K E+++ ++R +E+ + +R K E+ +E+RR +++L++ +
+Sbjct: 586 RQQRLKREQEERLEQRLK-REEVERLEQEERREQRLKREEPEEERR-QQLLKSEEQEERR 643
+
+Query: 101 RERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP 160
+ +++ R E ++ ++++ E++ + L QRL + E E R Q+LA+ E R + +P
+Sbjct: 644 QQQLRREQQERREQRLKREEEEERLEQRLKR-EHEEERREQELAEEEQEQARERIKSRIP 702
+
+ Score = 101 (40.6 bits), Expect = 0.23, P = 0.21
+ Identities = 31/116 (26%), Positives = 59/116 (50%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRA-KTEDEKEQRRIERVLRNRAAAQT 99
+ + Q +K EE+K ++ + +E + + R + K E+E+ Q+R++R R +
+Sbjct: 546 REQLLKREEEKRLEQER---REQRLKREQEERRDQLLKREEERRQQRLKREQEERLEQRL 602
+
+Query: 100 SRER-KRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ RE +RLE E+ ++++ E+ + Q+L + E + R QQL + E R R
+Sbjct: 603 KREEVERLEQEERREQRLKREEPEEERRQQLLKSEEQEERRQQQLRREQQERREQR 658
+
+ Score = 100 (40.3 bits), Expect = 0.30, P = 0.26
+ Identities = 30/112 (26%), Positives = 61/112 (54%)
+
+Query: 40 VKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQT 99
+ ++ +E K +E++P ++R+ +E + K +R + E+E++Q+R+ R + R +
+Sbjct: 253 LRKEEEKLQEEEPQRQRELQEEEEQLRKLERQELRRERQEEEQQQQRLRREQQLRRKQE- 311
+
+Query: 100 SRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ ER+ + E+ E ++ + EQQ + Q+L + + E R QQL + E R
+Sbjct: 312 -EERREQQEERREQQE-RREQQEERREQQLRREQEE--RREQQLRREQEEER 359
+
+ Score = 90 (36.7 bits), Expect = 3.7, P = 0.97
+ Identities = 31/108 (28%), Positives = 57/108 (52%)
+
+Query: 48 EEKKPAKKRKS-WGQELPVPKTNLPPRKRAKTEDEKEQRRIER--VLRNRAAAQTSRERK 104
+ EE+K +KR++ +E + P R+R E+E++ R++ER + R R + ++R
+Sbjct: 241 EEEKEWRKRETVLRKEEEKLQEEEPQRQRELQEEEEQLRKLERQELRRERQEEEQQQQRL 300
+
+Query: 105 RLEME-KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVR 151
+ R E + + + E+ + EQQ + Q+ + E + R QQL + E R
+Sbjct: 301 RREQQLRRKQEEERREQQEERREQQ-ERREQQEERREQQLRREQEERR 347
+
+ Score = 90 (36.7 bits), Expect = 3.7, P = 0.97
+ Identities = 29/119 (24%), Positives = 59/119 (49%)
+
+Query: 41 KTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTS 100
+ + ++ + ++K K+ + G+E P + K+ + E+E +Q E++LR +
+Sbjct: 956 RERQYRKDKKLQQKEEQLLGEE-PEKRRRQEREKKYREEEELQQEE-EQLLREEREKRRR 1013
+
+Query: 101 RE-----RKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSR 154
+ +E RK+ E+++ E E++ E++ + LQ + E L Q+ QL E R +R
+Sbjct: 1014 QEWERQYRKKDELQQ-EEEQLLREEREKRRLQERERQYREEEELQQEEEQLLGEERETR 1071
+
+ Score = 90 (36.7 bits), Expect = 3.7, P = 0.97
+ Identities = 32/119 (26%), Positives = 59/119 (49%)
+
+Query: 43 QEVKPEE-KKPAKKRKSW-GQELPVPKTNLPPRKRAKTEDEKEQRRIERVLR----NRAA 96
+ QE + + K+ ++R+ W +E + RK+ D++E+RR ER L+ R
+Sbjct: 440 QERREQRLKREQEERRDWLKREEETERHEQERRKQQLKRDQEEERR-ERWLKLEEEERRE 498
+
+Query: 97 AQTSRERK-RLEMEKLENEKIQMEQQNQFLLQRL---SQMEAENNRLSQQLAQLAAEVR 151
+ Q RE++ R E E+ ++++ +++ + L QRL Q+ E +QL + E R
+Sbjct: 499 QQERREQQLRREQEERREQRLKRQEEEERLQQRLRSEQQLRREQEERREQLLKREEEKR 557
+
+ Score = 89 (36.4 bits), Expect = 4.7, P = 0.991
+ Identities = 33/111 (29%), Positives = 55/111 (49%)
+
+Query: 43 QEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE 102
+ ++++ EE+K AK+R QE KR + E +++ R E++L+ R Q R
+Sbjct: 1297 EQLEREEQKEAKRRDRKSQEEKQLLREEREEKRRRQETDRKFREEEQLLQEREE-QPLRR 1355
+
+Query: 103 RKRLEMEKLENEKIQMEQQNQFLL--QRLSQMEAENNRLSQQLAQLAAEVR 151
+ ++R + + E E EQ +FL QRL + E E L ++ QL + R
+Sbjct: 1356 QER-DRKFREEELRHQEQGRKFLEEEQRLRRQERERKFLKEE-QQLRCQER 1404
+
+
+>sp|Q4X1V0|NDE1_ASPFU Nuclear distribution protein nudE homolog 1
+ OS=Aspergillus fumigatus GN=nde1 PE=3 SV=1
+ Length = 621
+
+ Score = 95 (38.5 bits), Expect = 0.18, Sum P(2) = 0.17
+ Identities = 39/131 (29%), Positives = 63/131 (48%)
+
+Query: 107 EMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMP-GSPAT 165
+ EM E E+ ++ +NQ L LS ++ E + ++L AE++ SR P+ SP+T
+Sbjct: 178 EMRAGEQEREKLRIENQRLRDELSDLKIETEIIHEKLRN--AELQNSRRRKPISLRSPST 235
+
+Query: 166 ASPTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHP-AVSVAGLE 224
+ TP LF + P I +P S +PTLK S ++ ++ P + S + L
+Sbjct: 236 PQ---TPDLFNRS----PASSI-VSSPLFS--TPTLKTSLMSATATPPSPPISESSSSLR 285
+
+Query: 225 GDGSALPLFDL 235
+ +A+P F L
+Sbjct: 286 KSMNAMPGFPL 296
+
+ Score = 84 (34.6 bits), Expect = 4.6, P = 0.99
+ Identities = 33/134 (24%), Positives = 62/134 (46%)
+
+Query: 80 DEKEQRRIERVL---RNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAEN 136
+ + K IER + A + RE+ R+E ++L +E ++ + + + ++L E +N
+Sbjct: 162 ESKYNVAIERAVLLEEEMRAGEQEREKLRIENQRLRDELSDLKIETEIIHEKLRNAELQN 221
+
+Query: 137 NRLSQQLAQLAAEVRGSRANTP-----MPGSPATASPTL-TPTLFKQERDELPLERIPFP 190
+ +R + ++ + S TP P S +SP TPTL + + P P
+Sbjct: 222 SRRRKPISLRSP----STPQTPDLFNRSPASSIVSSPLFSTPTL---KTSLMSATATP-P 273
+
+Query: 191 TPSLSDYSPTLKPS 204
+ +P +S+ S +L+ S
+Sbjct: 274 SPPISESSSSLRKS 287
+
+ Score = 44 (20.5 bits), Expect = 0.18, Sum P(2) = 0.17
+ Identities = 12/40 (30%), Positives = 22/40 (55%)
+
+Query: 81 EKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQ 120
+ + R +E L A S +R+RL EK+++ K ++E+
+Sbjct: 40 QASSRELEAELEKDIEA--SEKRERLLKEKVDSLKYEVEE 77
+
+
+>sp|Q8R1H8|BATF2_MOUSE Basic leucine zipper transcriptional factor ATF-like 2
+ OS=Mus musculus GN=Batf2 PE=2 SV=1
+ Length = 277
+
+ Score = 79 (32.9 bits), Expect = 0.18, Sum P(2) = 0.17
+ Identities = 15/59 (25%), Positives = 35/59 (59%)
+
+Query: 77 KTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAE 135
+ +T+ + Q+++++ +NR AAQ SR++ + + L + +E+QN L + + ++ E
+Sbjct: 12 ETDLGESQKQLKKKQKNRVAAQRSRQKHTSKADALHQQHESLEKQNHALRKEIQALQTE 70
+
+ Score = 52 (23.4 bits), Expect = 0.18, Sum P(2) = 0.17
+ Identities = 20/68 (29%), Positives = 27/68 (39%)
+
+Query: 137 NRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPF----PTP 192
+ N +QL RA PG + SP L P+L + + R P P+P
+Sbjct: 117 NGCQEQLGLFQTPGSSPRAQHLSPGPCSHESPGLLPSLLPSLAFDPLMVRTPLAQLSPSP 176
+
+Query: 193 SLSDYSPT 200
+ LS SP+
+Sbjct: 177 VLSASSPS 184
+
+
+>sp|Q66J36|NFIL3_XENLA Nuclear factor interleukin-3-regulated protein
+ OS=Xenopus laevis GN=nfil3 PE=2 SV=1
+ Length = 456
+
+ Score = 95 (38.5 bits), Expect = 0.19, P = 0.17
+ Identities = 35/132 (26%), Positives = 62/132 (46%)
+
+Query: 31 ADTSLNSADVKTQEVKP-EEKKPAKKRKSWGQELPVP-KTNLPPRKRAKTEDEKEQRRI- 87
+ AD+ + + V + + E + + LPV K++ RKR DEK+
+Sbjct: 11 ADSRMENILVLSSNIPDMSESMDSSNDMLYSDGLPVKNKSSSCRRKREFIPDEKKDAMYW 70
+
+Query: 88 ERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLA 147
+ E+ +N AA+ SRE++RL LEN+ I + ++N L L ++ + +S A
+Sbjct: 71 EKRRKNNEAAKRSREKRRLNDMVLENKLIALGEENASLKTELLSLKLKFGLISS--TSYA 128
+
+Query: 148 AEVRGSRANTPM 159
+ E++ ++T M
+Sbjct: 129 QEIQKVTSSTAM 140
+
+
+>sp|P13816|GARP_PLAFF Glutamic acid-rich protein OS=Plasmodium falciparum
+ (isolate FC27 / Papua New Guinea) GN=GARP PE=4 SV=1
+ Length = 678
+
+ Score = 97 (39.2 bits), Expect = 0.19, P = 0.17
+ Identities = 33/142 (23%), Positives = 65/142 (45%)
+
+Query: 36 NSADVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRA 95
+ N ++ K ++ + EE +K Q+ K K+ K ++EKE+++ E+ +
+Sbjct: 242 NISEDKKEDHQQEEMLKTLDKKERKQKEKEMKEQEKIEKKKKKQEEKEKKKQEKERKK-- 299
+
+Query: 96 AAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRA 155
+ Q +ERK+ E E + +KI+ E++ + ++ + + N + Q +E +
+Sbjct: 300 --QEKKERKQKEKEMKKQKKIEKERKKKEEKEKKKKKHDKENEETMQQPDQTSEETNNEI 357
+
+Query: 156 NTPMPGSPATASPTLTPTLFKQ 177
+ P+P SP T TP K+
+Sbjct: 358 MVPLP-SPLT--DVTTPEEHKE 376
+
+
+>sp|P38749|YAP3_YEAST AP-1-like transcription factor YAP3 OS=Saccharomyces
+ cerevisiae GN=YAP3 PE=1 SV=1
+ Length = 330
+
+ Score = 93 (37.8 bits), Expect = 0.19, P = 0.17
+ Identities = 17/67 (25%), Positives = 39/67 (58%)
+
+Query: 76 AKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAE 135
+ A E+ + + ++ +NRAA + RERK M++L+++ ++ E+ Q LL+ + ++
+Sbjct: 137 AHNENVPDDSKAKKKAQNRAAQKAFRERKEARMKELQDKLLESERNRQSLLKEIEELRKA 196
+
+Query: 136 NNRLSQQ 142
+ N ++ +
+Sbjct: 197 NTEINAE 203
+
+
+>sp|Q3UIW5|RNF10_MOUSE RING finger protein 10 OS=Mus musculus GN=Rnf10 PE=2
+ SV=2
+ Length = 804
+
+ Score = 99 (39.9 bits), Expect = 0.19, Sum P(2) = 0.18
+ Identities = 51/209 (24%), Positives = 87/209 (41%)
+
+Query: 80 DEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRL 139
+ D+ E+R+ +R + +A + RER R+EME EN++ + L+ L Q A N+
+Sbjct: 588 DDIEKRKRQR--QKKAREERRRER-RIEME--ENKRQGRYPEVHIPLENLQQFPAFNSYT 642
+
+Query: 140 ---SQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIPFPTPSLSD 196
+ L + E G+ + +P+ SP + + L L P F SL D
+Sbjct: 643 CPSDSALGPTSTEGHGALSLSPLSRSPGSHADFLLTPLSPTASQGSP----SFCVGSLED 698
+
+Query: 197 YSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHHSTDDVAAPLSDDDF 256
+ SP L + + A + D S +P + SD + ++D V P + F
+Sbjct: 699 DSPFLSFAQMLRVGKAKADGWPKTAPKKDDNSLVPPAPVDSDGESDNSDRVPVPSFQNSF 758
+
+Query: 257 NRLFHGDSSVEPDSSVFEDGLAFDVLEGG 285
+ ++ + ++ D+ D L+ D GG
+Sbjct: 759 SQAIEA-AFMKLDTPATSDPLSED--RGG 784
+
+ Score = 42 (19.8 bits), Expect = 0.19, Sum P(2) = 0.18
+ Identities = 11/57 (19%), Positives = 27/57 (47%)
+
+Query: 1 MSCDMEKTMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRK 57
+ MS D+ + + LP T + L + P S + ++ + +++ +++ KK +
+Sbjct: 546 MSEDVRQRHRYLSHLPLTCEFSICELALQPPVVSKETLEMFSDDIEKRKRQRQKKAR 602
+
+
+>sp|P23923|HBP1B_WHEAT Transcription factor HBP-1b(c38) OS=Triticum aestivum
+ PE=2 SV=1
+ Length = 332
+
+ Score = 93 (37.8 bits), Expect = 0.19, P = 0.18
+ Identities = 24/59 (40%), Positives = 36/59 (61%)
+
+Query: 73 RKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQNQFLLQRLSQ 131
+ R R K D+K RR+ + NR AA+ SR RK+ +++LEN ++++ Q Q L QR Q
+Sbjct: 37 RSRDKNGDQKTMRRLAQ---NREAARKSRLRKKAYVQQLENSRLKLTQLEQEL-QRARQ 91
+
+
+>sp|Q9D5R3|CCD41_MOUSE Coiled-coil domain-containing protein 41 OS=Mus musculus
+ GN=Ccdc41 PE=2 SV=2
+ Length = 692
+
+ Score = 97 (39.2 bits), Expect = 0.19, P = 0.18
+ Identities = 44/182 (24%), Positives = 78/182 (42%)
+
+Query: 49 EKKPAKKRKSWGQELPVPKTNLPPRKRAKTE-DEKEQRRIERVLRNRAAAQTSRERKRLE 107
+ EK +K+ W +E + R+ + EK QR + ++ + +R + +
+Sbjct: 516 EKTLEEKQIQWLEEKHKLHERITDREEKYNQAKEKLQRAATAQKKRKSLHENKLKRLQEK 575
+
+Query: 108 MEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATAS 167
+ +E LE +K ++E +NQ L ++ E E RL ++L + R+ +P P TAS
+Sbjct: 576 VEVLEAKKEELETENQVLNRQNVPFE-EYTRLQKRLKDIQRRHNEFRSLILVPNMPPTAS 634
+
+Query: 168 PTLTPTLFKQERDELPLERIPFPTPSLSDYSPTLKPSTLA---ESSDVAQHPAVSVAGLE 224
+ ++P F Q +P + FP P L + + S L E + Q + G
+Sbjct: 635 --ISPANF-QSAVTVPGAELSFP-PHLQEEQHQRELSLLRKRLEELETTQRKQLEELGSP 690
+
+Query: 225 GD 226
+ G+
+Sbjct: 691 GE 692
+
+
+>sp|Q9QXL2|KI21A_MOUSE Kinesin-like protein KIF21A OS=Mus musculus GN=Kif21a
+ PE=1 SV=2
+ Length = 1672
+
+ Score = 101 (40.6 bits), Expect = 0.20, P = 0.18
+ Identities = 39/164 (23%), Positives = 77/164 (46%)
+
+Query: 35 LNSADVKTQEVKPEEKKPAKKRKSWGQE-LPVPKTNLPPRKRAKTEDEKEQRRIERVLRN 93
+ L +A + + + + K+ K Q+ + + KT + K+ K E EK R+ RN
+Sbjct: 737 LQTAQKEHARLLKNQSQYEKQLKKLQQDVMEMKKTKVRLMKQMKEEQEKA--RLTESRRN 794
+
+Query: 94 RAAAQTSRE-RKR-LEMEKLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLA-QLAAEV 150
+ R AQ ++ RKR ++ LE +K E + + ++ + + +S ++A ++ ++
+Sbjct: 795 REIAQLKKDQRKRDHQLRLLEAQKRNQEVVLRRKTEEVTALRRQVRPMSDKVAGKVTRKL 854
+
+Query: 151 RGSRANTPMPGSPATASPTLTPTLFKQERDELPLERIP-FPTPS 193
+ S + P GS A + T Q++ +P+ R+ PTP+
+Sbjct: 855 SSSESPAPDTGSSAASGEADTSRPGTQQKMRIPVARVQALPTPT 898
+
+
+>sp|Q9UPT6|JIP3_HUMAN C-Jun-amino-terminal kinase-interacting protein 3 OS=Homo
+ sapiens GN=MAPK8IP3 PE=1 SV=3
+ Length = 1336
+
+ Score = 95 (38.5 bits), Expect = 0.20, Sum P(2) = 0.18
+ Identities = 38/152 (25%), Positives = 69/152 (45%)
+
+Query: 62 ELPVPKTNLPPRKRAKTEDEKEQRRIERVLRN-RAAAQTSRERKRLEMEKL------ENE 114
+ E V + L K+AK + E + +E L+ ++ A +R + E E + E++
+Sbjct: 454 EQEVLRGELEAAKQAKVKLENRIKELEEELKRVKSEAIIARREPKEEAEDVSSYLCTESD 513
+
+Query: 115 KIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGS---RANTPMPGSPATASPTLT 171
+ KI M Q+ +F ++++ E N+ ++L +L VR + RA+ P T+
+Sbjct: 514 KIPMAQRRRFTRVEMARVLMERNQYKERLMELQEAVRWTEMIRASREHPSVQEKKKSTIW 573
+
+Query: 172 P---TLFKQERDELPLERIPFPTPSLSDYSPT 200
+ LF P +R P+P+ ++ SPT
+Sbjct: 574 QFFSRLFSSSSSPPPAKR-PYPSVNIHYKSPT 604
+
+ Score = 51 (23.0 bits), Expect = 0.20, Sum P(2) = 0.18
+ Identities = 18/58 (31%), Positives = 25/58 (43%)
+
+Query: 8 TMSSVDSLPATPASEVPVLTVSPADTSLNSADVKTQEVKPEEKKPAKKRKSWGQELPV 65
+ T S+ + TP S VP V+P + SL K K+ +KR S E+ V
+Sbjct: 265 TPSTTGTKSNTPTSSVPSAAVTPLNESLQPLGDYGVGSK-NSKRAREKRDSRNMEVQV 321
+
+
+>sp|P16884|NFH_RAT Neurofilament heavy polypeptide OS=Rattus norvegicus GN=Nefh
+ PE=1 SV=4
+ Length = 1072
+
+ Score = 99 (39.9 bits), Expect = 0.20, P = 0.18
+ Identities = 57/248 (22%), Positives = 93/248 (37%)
+
+Query: 6 EKTMSSVDSLPATPAS-EVPVLTVSPADTSLNSAD-VKTQEVK-PEEKKPAKKRKSWGQE 62
+ EK S V PA + P SP S + KT +VK PE K PAK+ +
+Sbjct: 784 EKAKSPVKEEIKPPAEVKSPEKAKSPMKEEAKSPEKAKTLDVKSPEAKTPAKEEAKRPAD 843
+
+Query: 63 LPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQN 122
+ + P+ P K EKE+ R E+V + ++ E E++ E K ++E++
+Sbjct: 844 IRSPEQVKSPAKEEAKSPEKEETRTEKVAPKKEEVKSPVE----EVKAKEPPK-KVEEEK 898
+
+Query: 123 QFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANTPMPGSPATASPTLTPTLFKQERDEL 182
+ + E++ + ++ + AE + P SP A K+++
+Sbjct: 899 TPATPKTEVKESKKDEAPKEAQKPKAEEKEPLTEKPKD-SPGEAKKEEA----KEKKAAA 953
+
+Query: 183 PLERIPFPTPSLSDYSPTLKPSTLAESSDVAQHPAVSVAGLEGDGSALPLFDLGSDLKHH 242
+ P E TP+ KP AE + A+ P+ + +P D K
+Sbjct: 954 PEEE----TPAKLGVKEEAKPKEKAEDAK-AKEPSKPSEKEKPKKEEVPAAPEKKDTKEE 1008
+
+Query: 243 STDDVAAP 250
+ T + P
+Sbjct: 1009 KTTESKKP 1016
+
+
+>sp|Q60765|ATF3_MOUSE Cyclic AMP-dependent transcription factor ATF-3 OS=Mus
+ musculus GN=Atf3 PE=2 SV=1
+ Length = 181
+
+ Score = 88 (36.0 bits), Expect = 0.20, P = 0.18
+ Identities = 29/99 (29%), Positives = 47/99 (47%)
+
+Query: 62 ELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRERKRLEMEKLENEKIQMEQQ 121
+ E+ V K+ P EDE+++RR ER N+ AA R +K+ + E L+ E ++E
+Sbjct: 73 EMSVTKSEAAPE-----EDERKRRRRER---NKIAAAKCRNKKKEKTECLQKESEKLESV 124
+
+Query: 122 NQFLLQRLSQMEAENNRLSQQLA--QLAAEVRGSRANTP 158
+ N L ++ +++ E L L + VR TP
+Sbjct: 125 NAELKAQIEELKNEKQHLIYMLNLHRPTCIVRAQNGRTP 163
+
+
+>sp|Q9N0J3|CEBPD_SHEEP CCAAT/enhancer-binding protein delta OS=Ovis aries
+ GN=CEBPD PE=3 SV=1
+ Length = 255
+
+ Score = 91 (37.1 bits), Expect = 0.20, P = 0.18
+ Identities = 28/104 (26%), Positives = 51/104 (49%)
+
+Query: 64 PVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQTSRE-RKRLEMEKLENEKIQ--MEQ 120
+ P P + P +R+ R ++ R + S E R+R E + K + ++
+Sbjct: 142 PTPPASPDPPRRSPAPPAPGPAR-DKAAGKRGPDRGSPEYRQRRERNNIAVRKSRDKAKR 200
+
+Query: 121 QNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRAN-TPMPGSP 163
+ +NQ + Q+L ++ AEN +L Q++ QL ++ G R +PG+P
+Sbjct: 201 RNQEMQQKLVELSAENEKLQQRVEQLTRDLAGLRRFFKQLPGAP 244
+
+
+>sp|A5DLJ8|NST1_PICGU Stress response protein NST1 OS=Pichia guilliermondii
+ GN=NST1 PE=3 SV=2
+ Length = 1107
+
+ Score = 99 (39.9 bits), Expect = 0.20, P = 0.18
+ Identities = 42/202 (20%), Positives = 91/202 (45%)
+
+Query: 39 DVKTQEVKPEEKKPAKKRKSWGQELPVPKTNLPPRKRAKTEDEKEQRRIERVLRNRAAAQ 98
+ D + + + EE+ ++ + +EL + R K E+EK +R E L+ A +
+Sbjct: 632 DEERRRKEEEERAREEELRLKQEELRAEQKRRKEEARQKKEEEKRKRIEELRLKKEAEKK 691
+
+Query: 99 TSRERKRLEME-KLENEKIQMEQQNQFLLQRLSQMEAENNRLSQQLAQLAAEVRGSRANT 157
+ E++R E E K + E+ E++ + ++++ Q++ E +Q + +
+Sbjct: 692 KQEEKERKERELKEKKERESKEKEEREMMEKKEQLKKEQQPKVEQTQE--------KPQA 743
+
+Query: 158 PMPGSPATASPTLT-PTLFKQERDELPLERIPFPTPSLSD-YSPTLKPSTLAES--SDVA 213
+ P P + ++P+++ P +Q+ L+ PT L + S L+ +L + S ++
+Sbjct: 744 P-PSQTSQSNPSVSDPISSRQDNSVSSLD----PTHDLQNAISSGLEQLSLGQQPMSHIS 798
+
+Query: 214 QHPAVSVAGLEGDGSALPLFDL 235
+ P+ S++ L + P D+
+Sbjct: 799 SQPSQSISQLPIQPPSQPFLDM 820
+
+WARNING: HSPs involving 915 database sequences were not reported due to the
+ limiting value of parameter B = 250.
+
+NOTE: You may want to consider using a low-complexity sequence filter to
+ reduce the number of spurious matches that may be appearing in the
+ output. See the filter option at
+ http://blast.wustl.edu/blast/parameters.html#filter.
+
+
+Parameters:
+
+ ctxfactor=1.00
+ E=10
+
+ Query ----- As Used ----- ----- Computed ----
+ Frame MatID Matrix name Lambda K H Lambda K H
+ +0 0 BLOSUM62 0.309 0.127 0.355 same same same
+ Q=9,R=2 0.244 0.0300 0.180 n/a n/a n/a
+
+ Query
+ Frame MatID Length Eff.Length E S W T X E2 S2
+ +0 0 345 345 8.6 80 3 11 23 0.50 34
+ 33 0.45 37
+
+
+Statistics:
+
+ Database: /misc/data0/databases/Uniprot/uniprot_sprot_wu.fasta
+ Title: uniprot_sprot_wu.fasta
+ Posted: 9:42:10 AM EDT Apr 12, 2010
+ Created: 9:42:26 AM EDT Apr 12, 2010
+ Format: XDF-1
+ # of letters in database: 181,677,051
+ # of sequences in database: 516,081
+ # of database sequences satisfying E: 1165
+ No. of states in DFA: 594 (126 KB)
+ Total size of DFA: 363 KB (2145 KB)
+ Time to generate neighborhood: 0.00u 0.00s 0.00t Elapsed: 00:00:00
+ No. of threads or processors used: 8
+ Search cpu time: 26.59u 0.08s 26.67t Elapsed: 00:00:04
+ Total cpu time: 37.32u 0.15s 37.47t Elapsed: 00:00:05
+ Start: Fri Apr 16 09:13:43 2010 End: Fri Apr 16 09:13:48 2010
+NOTES ISSUED: 2
+WARNINGS ISSUED: 2
+
+EXIT CODE 0
diff --git a/demotic/fasta2profmark b/demotic/fasta2profmark
new file mode 100755
index 0000000..c972ff1
--- /dev/null
+++ b/demotic/fasta2profmark
@@ -0,0 +1,11 @@
+#! /usr/bin/perl
+
+use demotic_fasta;
+
+while (&demotic_fasta::parse(\*STDIN))
+{
+ &demotic_fasta::profmarkout(\*STDOUT);
+}
+
+
+
diff --git a/demotic/fasta2tbl b/demotic/fasta2tbl
new file mode 100755
index 0000000..f840da6
--- /dev/null
+++ b/demotic/fasta2tbl
@@ -0,0 +1,10 @@
+#! /usr/bin/perl
+
+use demotic_fasta;
+
+while (&demotic_fasta::parse(\*STDIN))
+{
+ &demotic_fasta::tblout(\*STDOUT);
+}
+
+
diff --git a/demotic/h22profmark b/demotic/h22profmark
new file mode 100755
index 0000000..84c8b01
--- /dev/null
+++ b/demotic/h22profmark
@@ -0,0 +1,10 @@
+#! /usr/bin/perl
+
+use demotic_h2;
+
+while (&demotic_h2::parse(\*STDIN))
+{
+ &demotic_h2::profmarkout(\*STDOUT);
+}
+
+
diff --git a/demotic/h22tbl b/demotic/h22tbl
new file mode 100755
index 0000000..f30be04
--- /dev/null
+++ b/demotic/h22tbl
@@ -0,0 +1,10 @@
+#! /usr/bin/perl
+
+use demotic_h2;
+
+while (&demotic_h2::parse(\*STDIN))
+{
+ &demotic_h2::tblout(\*STDOUT);
+}
+
+
diff --git a/demotic/hmmer2profmark b/demotic/hmmer2profmark
new file mode 100755
index 0000000..19e1830
--- /dev/null
+++ b/demotic/hmmer2profmark
@@ -0,0 +1,10 @@
+#! /usr/bin/perl
+
+use demotic_hmmer;
+
+while (&demotic_hmmer::parse(\*STDIN))
+{
+ &demotic_hmmer::profmarkout(\*STDOUT);
+}
+
+
diff --git a/demotic/hmmer2tbl b/demotic/hmmer2tbl
new file mode 100755
index 0000000..08e8d8a
--- /dev/null
+++ b/demotic/hmmer2tbl
@@ -0,0 +1,10 @@
+#! /usr/bin/perl
+
+use demotic_hmmer;
+
+while (&demotic_hmmer::parse(\*STDIN))
+{
+ &demotic_hmmer::tblout(\*STDOUT);
+}
+
+
diff --git a/demotic/infernal_tab2gff.pl b/demotic/infernal_tab2gff.pl
new file mode 100755
index 0000000..058d933
--- /dev/null
+++ b/demotic/infernal_tab2gff.pl
@@ -0,0 +1,269 @@
+#!/usr/bin/perl -w -I/groups/eddy/home/jonest/Demotic
+
+# TAJ 6/23/08 last mod 7/10/08
+# Purpose: flexibly convert "cmsearch --tabfile TAB.out" output to GFF format
+# Based upon my "blastn2gff.pl" script.
+#
+# OUTPUT GFF2 format:
+# ------------------
+# CONTIG METHOD TYPE START END SCORE ORI FRAME GENE "genename"; note "free text"
+# $contig $method $type $GFFstart $GFFend $score $ori "." $gene_name $note
+# na "Infernal" "Infernal_hit" na na na na "." ::$cm_name[i] "" # Defaults
+# na -m -t na na na na na -g -n # Options
+#
+# Todo List
+# -----------------------------------------------------
+# (1) Allow for GFF3 format output
+# (2) Possibly all switch to produce separate GFF files for each report
+# -----------------------------------------------------
+
+use strict;
+use demotic_infernal_tab;
+use Getopt::Std;
+getopts ('E:s:G:l:m:t:g:n:u:d:b');
+our ($opt_E, $opt_s, $opt_G, $opt_l, $opt_m, $opt_t, $opt_g, $opt_n, $opt_b, $opt_u, $opt_d);
+
+(my $script = $0) =~ s/^.*\///;
+my $USAGE = "
+Parse cmsearch tabfile output, filter hits on user-supplied cutoffs, and output hits
+in GFF2 format.
+======================================================================================
+ USAGE: $script <options> tabfile.out > foo.gff
+======================================================================================
+ tabfile.out ==> Output file created by using cmsearch switch '--tabfile tab.out'
+ from Infernal rc1.0
+
+OPTIONS
+--------------------------------------------------------------------------------------
+ -E Eval_cutoff (E)-value cutoff -- reject hits with E-value > Eval_cutoff
+ -s score_cutoff (s)score cutoff -- reject hits with bitscore < score_cutoff
+ -G GC_cutoff (G)C percent cutoff (0..100) -- reject hits with GC < GC_cutoff
+ -l len_cutoff (l)ength cutoff -- reject hits with length < len_cutoff
+ -m method (m)ethod. Default is 'Infernal' # for GFF output
+ -t type (t)ype. Default is 'Infernal_hit' # for GFF output
+ -g gene_name (g)ene name. Default is CM query name # for GFF output (1)
+ -n \"a short note\" (n)ote. No default # for GFF output
+ -u X (u)pstream pad -- add X NTs to BEGINNING of all hits (2)
+ -d Y (d)ownstream pad -- add Y Nts to END of all hits (2)
+--------------------------------------------------------------------------------------
+
+NOTES:
+ (1) == Default behavior obtains a (non-unique) 'gene name' from the CM name. For
+ multiple CM queries having the same name, Infernal differentiates the models
+ by adding a '.N' version (eg CM.1, CM.2, etc). Specifying the gene name by '-g'
+ results in the same gene name being used for all hits in all reports contained
+ in that tabfile.
+ (2) == The values always add to the length of the feature. X and Y cannot be negative!
+ It's highly recommended that you use the '-n NOTE' feature to annotate the
+ changes made to the GFF start and end sites due to these flags. Script warns
+ when padding beyond the 5' end of the contig (and sets it to 1), but cannot edge
+ detect for the 3' end of the contig.
+
+************* While this script can parse 'tabfile' files with output from
+* WARNING * multiple queries (possibly containing very different CMs), only one
+************* GENE name, METHOD and TYPE will be added to all GFF lines created!
+";
+
+my $CMs = 0; # number of CMs in tabfile
+my $hits = 0; # number of hits within current CM
+my $Eval_cutoff = 10000; # arbitrarily large E-value default cutoff
+my $score_cutoff = -1000; # arbitrarily low bitscore default cutoff
+my $GC_cutoff = 0; # minimum %GC cutoff
+my $len_cutoff = 0; # minimum length cutoff
+my $up_pad = 0; # add X NTs to upstream/start of hit NB: applies to all hits!
+my $down_pad = 0; # add Y NTs to downstream/end of hit NB: applies to all hits!
+my $pass_filter = 0;
+
+# get cutoff & coord padding options (NB: opt's m,t,g,n obtained during sub print_GFF2)
+$Eval_cutoff = $opt_E if ($opt_E);
+$score_cutoff = $opt_s if ($opt_s);
+$GC_cutoff = $opt_G if ($opt_G);
+$len_cutoff = $opt_l if ($opt_l);
+$up_pad = $opt_u if ($opt_u);
+$down_pad = $opt_d if ($opt_d);
+if ($up_pad !~ /^\+?\d+$/) { die "Illegal pad: '$up_pad'; must be a whole positive number."; }
+if ($down_pad !~ /^\+?\d+$/) { die "Illegal pad: '$down_pad'; must be a whole positive number."; }
+if (($up_pad > 100000) || ($down_pad > 100000)) {
+ die "Whoa, whoa! Slow down their Feyman. You're being a bit excessive with your pads. --mgmt";
+}
+
+
+# =========================================================
+# | demotic_infernal_tab -- Parameters |
+# =========================================================
+#
+# Returns SINGLE STRING; applies to entire tabfile (regardless of no. of CMs)
+# ----------------------------------------------------------------------------
+# $model_num # number of CM's used in the search # check
+# $command # command line used to run search # check
+# $date # date search was run # check
+# $db_recs # number of records in target DB # check
+# $db_size # DB size (in MB) # check
+#
+# Returns LIST; 0th position in list corresponds to 1st CM in the tabfile
+# EX: $cm_name[2] # name of the CM query used in 3rd report
+# ----------------------------------------------------------------------------
+# @cm_name # Covariation Model(s) name; 1st model is 0th in array # check
+# @time_expect # expected run time (quoted, not converting into hr:min) # check
+# @time_actual # actual run time (quoted, not converting into hr:min) # check
+# @num_hits # tracks number of hits for each model # check
+#
+# Returns 2D ARRAY [i][j];
+# "i" = list of CMs in report (as above); frequently only 1 report, or i=0
+# "j" = list of _hits_ for each CM (0th -> 1st hit), in order appearing in report
+# EX: ${$GC[1]}->[3] # GC value of 4th (3+1) hit in the 2nd (1+1) search
+# ----------------------------------------------------------------------------
+# @t_name # (2D); target fasta record name # check
+# @t_start # (2D); start location in fasta target \___ For "-" ori hits, # check
+# @t_stop # (2D); stop location in fasta target / t_start > t_stop # check
+# @q_start # (2D); start location in CM query \___ Regardless of ori, # check
+# @q_stop # (2D); stop location in CM query / q_start < q_stop # check
+# @bitscore # (2D); bit score # check
+# @Eval # (2D); E-value // can be in scientific notation # check
+# @GC # (2D); %GC # check
+# =========================================================
+
+
+# Parse infernal 'tabfile'; possibly involving multiple query CMs
+die $USAGE unless (@ARGV == 1);
+my $tabfile = shift;
+open (TABFILE, "$tabfile") || die "Can't open $tabfile. You fuckin' wif me?";
+&demotic_infernal_tab::parse(\*TABFILE);
+close TABFILE;
+
+$CMs = $demotic_infernal_tab::model_num; # number of query CMs
+
+# For all hits, for all CMs in tabfile report -> print in GFF2 formt if passes all cutoffs
+foreach my $rep_num (0..$CMs-1) { # looping over i CMs
+ $hits = $demotic_infernal_tab::num_hits[$rep_num];
+ foreach my $hit_num (0..$hits-1) { # looping over j hits from ith CM
+ $pass_filter = &filter_hit($rep_num, $hit_num);
+ if ($pass_filter) {
+ if ($pass_filter) {
+ &print_GFF2 ($rep_num, $hit_num);
+ }
+ else { next; }
+ }
+ }
+}
+
+
+############# Validation -- Make sure I'm parsing hit list for all CMs properly #############
+if ($opt_b) { # Thouroughly embarassing parse dump, for manual validation // not complete
+ foreach my $rep (0..($CMs-1)) {
+ my $name = $demotic_infernal_tab::cm_name[$rep];
+ $hits = $demotic_infernal_tab::num_hits[$rep];
+ print "------------------------------------------------\n";
+ print "Model \#", ($rep+1), " ==> cm_name: [$name] containing $hits hits\n";
+ print "------------------------------------------------\n";
+ foreach my $j (0..$hits-1) { # looping over all hits for that CM
+ my $contig = $demotic_infernal_tab::t_name[$rep]->[$j];
+ my $start_t = $demotic_infernal_tab::t_start[$rep]->[$j];
+ my $stop_t = $demotic_infernal_tab::t_stop[$rep]->[$j];
+ my $start_q = $demotic_infernal_tab::q_start[$rep]->[$j];
+ my $stop_q = $demotic_infernal_tab::q_stop[$rep]->[$j];
+ my $score = $demotic_infernal_tab::bitscore[$rep]->[$j];
+ my $e_val = $demotic_infernal_tab::Eval[$rep]->[$j];
+ my $gc = $demotic_infernal_tab::GC[$rep]->[$j];
+ print "#", ($j+1), ": ", $contig,
+ " Tar:S-E: ", $start_t, "-", $stop_t,
+ " Que:S-E: ", $start_q, "-", $stop_q,
+ " Score: ", $score,
+ " E-val: ", $e_val,
+ " %GC: ", $gc,
+ "\n";
+ }
+ }
+}
+
+################# Subroutines ######################
+
+sub filter_hit {
+# INPUT: Index to _i_th CM in tabfile, _j_th hit for given CM
+# OUTPUT: 1 if hit passes command line criteria, 0 if it fails the filter
+ my $CM_i = shift;
+ my $hit_j = shift;
+ my $evalue = $demotic_infernal_tab::Eval[$CM_i]->[$hit_j];
+ my $score = $demotic_infernal_tab::bitscore[$CM_i]->[$hit_j];
+ my $gc = $demotic_infernal_tab::GC[$CM_i]->[$hit_j];
+ my $begin = $demotic_infernal_tab::t_start[$CM_i]->[$hit_j];
+ my $end = $demotic_infernal_tab::t_stop[$CM_i]->[$hit_j];
+ my $len = 0;
+ if ($begin < $end ) { $len = $end - $begin + 1; }
+ else { $len = $begin - $end + 1; }
+ if (($evalue <= $Eval_cutoff) &&
+ ($score >= $score_cutoff) &&
+ ($gc >= $GC_cutoff) &&
+ ($len >= $len_cutoff)) {
+ return 1; # passes all cutoff criteria
+ }
+ else {
+ return 0; # does not pass all cutoff criteria
+ }
+}
+
+sub print_GFF2 {
+# INPUT: Index to _i_th CM in tabfile, _j_th hit for given CM
+# e.g. $demotic_infernal_tab::foo[$i]->[$j]
+# OUTPUT: Infernal hit in GFF2 format (see following)
+# contig method type start end score ori frame gene "genename"; note "blah blah"
+# $ctg $method $type $GFFstart $GFFstop $score $ori $frame $gene $note
+
+ my $CM_i = shift;
+ my $hit_j = shift;
+ my $ctg = $demotic_infernal_tab::t_name[$CM_i]->[$hit_j];
+ my $start = $demotic_infernal_tab::t_start[$CM_i]->[$hit_j];
+ my $stop = $demotic_infernal_tab::t_stop[$CM_i]->[$hit_j];
+ my $score = $demotic_infernal_tab::bitscore[$CM_i]->[$hit_j];
+ my $frame = "."; # used only for CDS
+ my $ori = "";
+ my $gene = "gene \"$demotic_infernal_tab::cm_name[$CM_i]\""; # default
+ my $method = "Infernal"; # default
+ my $type = "Infernal_hit"; # default
+ my $note = ""; # default
+ my $GFFstart = 0;
+ my $GFFstop = 0;
+ my $over = 0;
+ if ($opt_g) { $gene = "gene \"$opt_g\""; } # change default?
+ if ($opt_m) { $method = "$opt_m"; } # change default?
+ if ($opt_t) { $type = "$opt_t"; } # change default?
+ if ($opt_n) { $note = "; note \"$opt_n\""; } # change default?
+# Note: Unlike blastn, target start/stop dictates ori; while query_start is always <= query_stop.
+###########################################
+# ========>>>>>>>>>>>>>=========
+# | |
+# (target) start stop
+###########################################
+ if ($start <= $stop ) {
+ $ori = "+";
+ $GFFstart = $start - $up_pad;
+ if ($GFFstart < 1) {
+ $over = ($GFFstart * -1) + 1; # distance beyond 5' end of contig
+ $GFFstart = 1;
+ warn "(${ctg}:${start}-${stop}) couldn't be padded the full $up_pad NTs! START set to 1.";
+ print "\# For following hit; pad overshot $over NTs beyond 5' end of hit; START set to 1\n";
+ }
+ $GFFstop = $stop + $down_pad; # Can't warn against overpadding; I don't know end of ctg!
+ print ("$ctg\t$method\t$type\t$GFFstart\t$GFFstop\t$score\t$ori\t$frame\t${gene}$note\n");
+ }
+###########################################
+# ========<<<<<<<<<<<<<=========
+# | |
+# (target) stop start
+###########################################
+ elsif ($start > $stop) {
+ $ori = "-";
+ $GFFstart = $stop - $down_pad;
+ if ($GFFstart < 1) {
+ $over = ($GFFstart * -1) + 1; # distance beyond 5' end of contig
+ $GFFstart = 1;
+ warn "(${ctg}:${start}-${stop}) couldn't be padded the full $up_pad NTs! START set to 1.";
+ print "\# For following hit; pad overshot $over NTs beyond 3' end of hit; START set to 1\n";
+ }
+ $GFFstop = $start + $up_pad; # Can't warn against overpadding; I don't know end of ctg!
+ print ("$ctg\t$method\t$type\t$GFFstart\t$GFFstop\t$score\t$ori\t$frame\t${gene}$note\n");
+ }
+ if ($GFFstart > $GFFstop) { # meager error checking...
+ die "Illegal GFF coords: GFFstart ($GFFstart) > GFFstop ($GFFstop)\n!";
+ }
+}
diff --git a/demotic/regress/fasta-profmark.out b/demotic/regress/fasta-profmark.out
new file mode 100644
index 0000000..4c1656c
--- /dev/null
+++ b/demotic/regress/fasta-profmark.out
@@ -0,0 +1,180 @@
+2e-70 265.5 sp|P55685|Y4WG_RHISN sp|P55685|Y4WG_RHISN
+3.6 33.0 sp|Q7SY73|ABH6B_XENLA sp|P55685|Y4WG_RHISN
+2.8e-111 403.1 sp|Q1XGE2|HAC1_ASPOR sp|Q1XGE2|HAC1_ASPOR
+7e-84 312.1 sp|Q8TFU8|HAC1_EMENI sp|Q1XGE2|HAC1_ASPOR
+1.6e-13 78.7 sp|Q8TFF3|HAC1_TRIRE sp|Q1XGE2|HAC1_ASPOR
+9.7e-06 52.0 sp|P41546|HAC1_YEAST sp|Q1XGE2|HAC1_ASPOR
+4.5e-05 49.2 sp|O24646|HY5_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.0013 45.1 sp|Q3SZZ2|XBP1_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.0015 45.8 sp|A1L224|CR3L2_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.0022 45.6 sp|Q54WN7|BZPF_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.0026 43.3 sp|Q9SM50|HY5_SOLLC sp|Q1XGE2|HAC1_ASPOR
+0.0062 43.8 sp|Q66HA2|CR3L1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.0079 43.4 sp|Q9Z125|CR3L1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.01 43.1 sp|Q96BA8|CR3L1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.013 43.9 sp|A3LYI0|NST1_PICST sp|Q1XGE2|HAC1_ASPOR
+0.016 42.4 sp|A2VD01|CR3L2_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.018 41.9 sp|Q08CW8|CR3L4_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.018 42.2 sp|Q70SY1|CR3L2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.018 42.2 sp|Q5RCM9|CR3L2_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.026 41.7 sp|Q8BH52|CR3L2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.029 40.6 sp|P17861|XBP1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.031 40.8 sp|P13346|FOSB_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.056 38.8 sp|Q8W191|HYH_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.064 39.8 sp|P53539|FOSB_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.069 40.3 sp|Q6QDP7|CR3L2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.08 39.9 sp|Q3SYZ3|CR3L3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.091 39.3 sp|Q9TUB3|FOSB_CANFA sp|Q1XGE2|HAC1_ASPOR
+0.11 39.1 sp|Q06507|ATF4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.13 39.2 sp|Q5FVM5|CR3L3_RAT sp|Q1XGE2|HAC1_ASPOR
+0.16 38.4 sp|Q90370|MAFB_COTJA sp|Q1XGE2|HAC1_ASPOR
+0.16 38.4 sp|Q90888|MAFB_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.2 38.3 sp|O97930|FOS_PIG sp|Q1XGE2|HAC1_ASPOR
+0.22 38.5 sp|Q91XE9|CR3L3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.22 38.1 sp|P18848|ATF4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.23 38.1 sp|O88479|FOS_MESAU sp|Q1XGE2|HAC1_ASPOR
+0.26 37.9 sp|P01101|FOS_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.27 38.2 sp|Q68CJ9|CR3L3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.27 37.9 sp|Q8TEY5|CR3L4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.27 37.9 sp|Q99090|CPRF2_PETCR sp|Q1XGE2|HAC1_ASPOR
+0.28 38.2 sp|Q5R9C9|ATF7_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.28 38.2 sp|P17544|ATF7_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.3 37.8 sp|Q5UEM8|CR3L4_MACFA sp|Q1XGE2|HAC1_ASPOR
+0.37 37.2 sp|Q9Y5Q3|MAFB_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.37 37.4 sp|P01102|FOS_MSVFB sp|Q1XGE2|HAC1_ASPOR
+0.38 37.2 sp|P51145|FOSL2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.4 38.4 sp|Q9UQ88|CD11A_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.41 38.4 sp|Q9WVS8|MK07_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.41 37.4 sp|Q502F0|CR3LA_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.42 37.0 sp|P15408|FOSL2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.45 37.3 sp|Q8R0S1|ATF7_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.47 37.5 sp|P29747|CREBA_DROME sp|Q1XGE2|HAC1_ASPOR
+0.47 36.8 sp|Q2PFS4|MAFB_MACFA sp|Q1XGE2|HAC1_ASPOR
+0.52 36.4 sp|Q9R1S4|XBP1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.53 36.6 sp|P54842|MAFB_RAT sp|Q1XGE2|HAC1_ASPOR
+0.54 36.7 sp|P47930|FOSL2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.55 38.0 sp|Q2VZV0|IF2_MAGSA sp|Q1XGE2|HAC1_ASPOR
+0.55 36.4 sp|Q0CEI3|KAPC_ASPTN sp|Q1XGE2|HAC1_ASPOR
+0.56 36.9 sp|Q61817|CREB3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.56 36.7 sp|Q9ES19|ATF4_RAT sp|Q1XGE2|HAC1_ASPOR
+0.6 36.5 sp|P54841|MAFB_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.6 36.7 sp|O77628|FOS_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.62 36.3 sp|A1C9M5|KAPC_ASPCL sp|Q1XGE2|HAC1_ASPOR
+0.67 36.3 sp|Q504L8|MAFB_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.7 36.1 sp|O57342|MAFA_COTJA sp|Q1XGE2|HAC1_ASPOR
+0.72 36.3 sp|Q3ZCH6|ATF4_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.75 36.3 sp|Q5UEM7|CR3L4_RAT sp|Q1XGE2|HAC1_ASPOR
+0.77 36.4 sp|P12841|FOS_RAT sp|Q1XGE2|HAC1_ASPOR
+0.77 34.7 sp|Q16520|BATF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.84 35.7 sp|O35426|XBP1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.86 36.2 sp|P01100|FOS_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.93 36.0 sp|Q8K1L0|CREB5_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.95 37.9 sp|A4R2R1|NST1_MAGGR sp|Q1XGE2|HAC1_ASPOR
+0.96 36.0 sp|Q9D2A5|CR3L4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.98 36.0 sp|Q8HZP6|FOS_FELCA sp|Q1XGE2|HAC1_ASPOR
+1.1 34.2 sp|Q9NR55|BATF3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.2 36.1 sp|Q02930|CREB5_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.2 35.4 sp|P42774|GBF1_ARATH sp|Q1XGE2|HAC1_ASPOR
+1.3 35.2 sp|A2R346|KAPC_ASPNC sp|Q1XGE2|HAC1_ASPOR
+1.3 35.2 sp|O42290|MAFA_CHICK sp|Q1XGE2|HAC1_ASPOR
+1.3 35.7 sp|O43889|CREB3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.4 37.1 sp|O60841|IF2P_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.5 36.7 sp|Q5KGK5|EIF3A_CRYNE sp|Q1XGE2|HAC1_ASPOR
+1.7 33.5 sp|Q9D275|BATF3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.7 35.4 sp|Q1LYG4|CR3LB_DANRE sp|Q1XGE2|HAC1_ASPOR
+1.7 34.9 sp|Q6DE84|MAFB_XENLA sp|Q1XGE2|HAC1_ASPOR
+1.7 37.7 sp|Q7TSC1|BAT2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.7 36.1 sp|Q99941|ATF6B_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.8 36.3 sp|Q54Y73|BZPD_DICDI sp|Q1XGE2|HAC1_ASPOR
+1.8 34.9 sp|P18625|FOSL2_CHICK sp|Q1XGE2|HAC1_ASPOR
+1.8 35.1 sp|Q56TN0|FOS_PHORO sp|Q1XGE2|HAC1_ASPOR
+1.8 33.5 sp|O35284|BATF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.9 34.7 sp|Q16534|HLF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.9 34.7 sp|Q8BW74|HLF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.9 35.2 sp|Q63ZM7|STABP_XENLA sp|Q1XGE2|HAC1_ASPOR
+2.1 35.2 sp|P29681|IMPE2_DROME sp|Q1XGE2|HAC1_ASPOR
+2.2 35.7 sp|O35451|ATF6B_MOUSE sp|Q1XGE2|HAC1_ASPOR
+2.3 33.6 sp|Q09926|PCR1_SCHPO sp|Q1XGE2|HAC1_ASPOR
+2.3 36.0 sp|O13024|INCEA_XENLA sp|Q1XGE2|HAC1_ASPOR
+2.3 36.0 sp|A0JMT0|CA1AB_XENLA sp|Q1XGE2|HAC1_ASPOR
+2.3 36.4 sp|Q5RDE1|IF2P_PONAB sp|Q1XGE2|HAC1_ASPOR
+2.3 34.4 sp|Q4U1U2|MAFA_XENTR sp|Q1XGE2|HAC1_ASPOR
+2.4 34.4 sp|Q64709|HLF_RAT sp|Q1XGE2|HAC1_ASPOR
+2.4 34.8 sp|Q54NF3|Y6434_DICDI sp|Q1XGE2|HAC1_ASPOR
+2.5 35.1 sp|P15336|ATF2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+2.5 36.2 sp|Q553B1|DDX46_DICDI sp|Q1XGE2|HAC1_ASPOR
+2.8 37.0 sp|P48634|BAT2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+2.8 37.0 sp|Q5TM26|BAT2_MACMU sp|Q1XGE2|HAC1_ASPOR
+2.9 34.2 sp|A3BYC1|HOX25_ORYSJ sp|Q1XGE2|HAC1_ASPOR
+3.1 34.7 sp|P16951|ATF2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+3.1 35.4 sp|Q96RN5|MED15_HUMAN sp|Q1XGE2|HAC1_ASPOR
+3.3 33.8 sp|Q2UNX4|KAPC_ASPOR sp|Q1XGE2|HAC1_ASPOR
+3.5 36.6 sp|Q80U35|ARHGH_MOUSE sp|Q1XGE2|HAC1_ASPOR
+3.5 35.2 sp|P0C865|MK07_RAT sp|Q1XGE2|HAC1_ASPOR
+3.5 32.9 sp|P97875|JDP2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+3.5 32.9 sp|Q78E65|JDP2_RAT sp|Q1XGE2|HAC1_ASPOR
+3.6 34.1 sp|Q8SQ19|CREB3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+3.6 33.6 sp|P48755|FOSL1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+3.7 35.3 sp|A2AJI0|MA7D1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+3.7 34.6 sp|Q00312|RBF1_CANAL sp|Q1XGE2|HAC1_ASPOR
+3.7 35.7 sp|O35413|SRBS2_RAT sp|Q1XGE2|HAC1_ASPOR
+3.9 32.5 sp|P97876|BATF3_RAT sp|Q1XGE2|HAC1_ASPOR
+3.9 34.4 sp|O93602|ATF2_CHICK sp|Q1XGE2|HAC1_ASPOR
+3.9 35.3 sp|Q5F489|TAF3_CHICK sp|Q1XGE2|HAC1_ASPOR
+4.3 35.1 sp|Q6CBW0|NST1_YARLI sp|Q1XGE2|HAC1_ASPOR
+4.3 35.6 sp|Q9CXK9|RBM33_MOUSE sp|Q1XGE2|HAC1_ASPOR
+4.4 34.9 sp|Q554P0|BZPJ_DICDI sp|Q1XGE2|HAC1_ASPOR
+4.4 35.1 sp|Q55EQ3|Y9086_DICDI sp|Q1XGE2|HAC1_ASPOR
+4.7 35.8 sp|O75037|KI21B_HUMAN sp|Q1XGE2|HAC1_ASPOR
+4.8 34.5 sp|O14273|YET4_SCHPO sp|Q1XGE2|HAC1_ASPOR
+4.8 34.5 sp|P19880|YAP1_YEAST sp|Q1XGE2|HAC1_ASPOR
+5.1 34.5 sp|Q6IPM2|IQCE_HUMAN sp|Q1XGE2|HAC1_ASPOR
+5.3 33.4 sp|Q98UK4|MAF_DANRE sp|Q1XGE2|HAC1_ASPOR
+5.3 35.4 sp|Q556Q3|IRLF_DICDI sp|Q1XGE2|HAC1_ASPOR
+5.4 32.9 sp|P14233|TGA1B_TOBAC sp|Q1XGE2|HAC1_ASPOR
+5.4 35.0 sp|Q8CH25|SLTM_MOUSE sp|Q1XGE2|HAC1_ASPOR
+5.4 33.8 sp|O81025|P2A03_ARATH sp|Q1XGE2|HAC1_ASPOR
+5.4 33.4 sp|P20226|TBP_HUMAN sp|Q1XGE2|HAC1_ASPOR
+5.5 35.5 sp|Q4WG58|PAN1_ASPFU sp|Q1XGE2|HAC1_ASPOR
+5.5 35.5 sp|B0YC95|PAN1_ASPFC sp|Q1XGE2|HAC1_ASPOR
+5.6 33.9 sp|Q00969|ATF2_RAT sp|Q1XGE2|HAC1_ASPOR
+5.7 34.1 sp|Q8N8S7|ENAH_HUMAN sp|Q1XGE2|HAC1_ASPOR
+5.8 35.9 sp|Q6MG48|BAT2_RAT sp|Q1XGE2|HAC1_ASPOR
+5.9 33.0 sp|P0C5H8|KAPC_EMENI sp|Q1XGE2|HAC1_ASPOR
+6 33.7 sp|Q9M7Q3|AI5L6_ARATH sp|Q1XGE2|HAC1_ASPOR
+6 34.8 sp|Q6P9R4|ARHGI_MOUSE sp|Q1XGE2|HAC1_ASPOR
+6.1 34.8 sp|Q9NWH9|SLTM_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.3 34.6 sp|O60308|K0562_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.4 32.8 sp|A2Z0Q0|HOX25_ORYSI sp|Q1XGE2|HAC1_ASPOR
+6.4 35.1 sp|Q6Y7W6|PERQ2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.7 32.8 sp|Q4WA21|KAPC_ASPFU sp|Q1XGE2|HAC1_ASPOR
+6.9 35.3 sp|Q9QXL1|KI21B_MOUSE sp|Q1XGE2|HAC1_ASPOR
+7.2 34.2 sp|P21127|CD11B_HUMAN sp|Q1XGE2|HAC1_ASPOR
+7.2 33.0 sp|Q789F3|MAF_CHICK sp|Q1XGE2|HAC1_ASPOR
+7.3 34.4 sp|Q6A000|K0753_MOUSE sp|Q1XGE2|HAC1_ASPOR
+7.4 33.1 sp|P23091|MAF_AVIS4 sp|Q1XGE2|HAC1_ASPOR
+7.4 33.8 sp|Q5RCJ1|CIP4_PONAB sp|Q1XGE2|HAC1_ASPOR
+7.5 32.8 sp|P23050|FOS_AVINK sp|Q1XGE2|HAC1_ASPOR
+7.5 34.5 sp|Q80YR5|SAFB2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+7.5 34.7 sp|Q6ZSZ5|ARHGI_HUMAN sp|Q1XGE2|HAC1_ASPOR
+7.7 32.6 sp|O70191|ATF5_MOUSE sp|Q1XGE2|HAC1_ASPOR
+7.9 34.9 sp|A6NC98|CC88B_HUMAN sp|Q1XGE2|HAC1_ASPOR
+8 33.6 sp|B0WYY2|MOEH_CULQU sp|Q1XGE2|HAC1_ASPOR
+8.3 32.9 sp|P11939|FOS_CHICK sp|Q1XGE2|HAC1_ASPOR
+8.4 33.1 sp|Q9XUS2|MED29_CAEEL sp|Q1XGE2|HAC1_ASPOR
+8.6 32.4 sp|A1D9Z7|KAPC_NEOFI sp|Q1XGE2|HAC1_ASPOR
+8.7 32.2 sp|P29176|FOSX_MSVFR sp|Q1XGE2|HAC1_ASPOR
+8.7 32.9 sp|Q09458|YQ37_CAEEL sp|Q1XGE2|HAC1_ASPOR
+9 32.7 sp|P23922|HBP1A_WHEAT sp|Q1XGE2|HAC1_ASPOR
+9 34.1 sp|Q5R452|SAFB1_PONAB sp|Q1XGE2|HAC1_ASPOR
+9 32.2 sp|O02756|CEBPD_BOVIN sp|Q1XGE2|HAC1_ASPOR
+9.2 33.9 sp|Q03173|ENAH_MOUSE sp|Q1XGE2|HAC1_ASPOR
+9.4 32.7 sp|P54843|MAF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+9.4 32.2 sp|P49716|CEBPD_HUMAN sp|Q1XGE2|HAC1_ASPOR
+9.4 33.4 sp|Q15642|CIP4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+9.4 32.7 sp|Q54RZ9|BZPG_DICDI sp|Q1XGE2|HAC1_ASPOR
+9.6 34.3 sp|Q5AXH3|TOF1_EMENI sp|Q1XGE2|HAC1_ASPOR
+9.6 34.1 sp|Q498L2|SLTM_XENLA sp|Q1XGE2|HAC1_ASPOR
+9.6 34.6 sp|P0CB49|YLPM1_RAT sp|Q1XGE2|HAC1_ASPOR
+9.7 32.5 sp|Q39140|TGA6_ARATH sp|Q1XGE2|HAC1_ASPOR
+10 33.4 sp|Q8N9W4|GG6L2_HUMAN sp|Q1XGE2|HAC1_ASPOR
diff --git a/demotic/regress/fasta-tbl.out b/demotic/regress/fasta-tbl.out
new file mode 100644
index 0000000..8aa88fd
--- /dev/null
+++ b/demotic/regress/fasta-tbl.out
@@ -0,0 +1,180 @@
+2e-70 100 1 181 sp|P55685|Y4WG_RHISN 1 181 sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=R
+3.6 24 41 164 sp|P55685|Y4WG_RHISN 65 189 sp|Q7SY73|ABH6B_XENLA Monoacylglycerol lipase abhd6-B
+2.8e-111 100 1 345 sp|Q1XGE2|HAC1_ASPOR 1 345 sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS
+7e-84 78 13 344 sp|Q1XGE2|HAC1_ASPOR 18 348 sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS
+1.3e-14 31 7 344 sp|Q1XGE2|HAC1_ASPOR 43 450 sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS
+1.3e-06 32 63 270 sp|Q1XGE2|HAC1_ASPOR 16 216 sp|P41546|HAC1_YEAST Transcriptional activator HAC1 OS
+4.5e-05 31 6 167 sp|Q1XGE2|HAC1_ASPOR 3 167 sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabid
+0.0013 29 16 206 sp|Q1XGE2|HAC1_ASPOR 10 196 sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos ta
+0.0015 32 4 152 sp|Q1XGE2|HAC1_ASPOR 210 360 sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive element-bi
+0.0022 24 46 270 sp|Q1XGE2|HAC1_ASPOR 363 593 sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper tra
+0.0026 36 60 154 sp|Q1XGE2|HAC1_ASPOR 66 157 sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanu
+0.0062 25 4 290 sp|Q1XGE2|HAC1_ASPOR 214 499 sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element-bind
+0.0079 26 4 232 sp|Q1XGE2|HAC1_ASPOR 215 445 sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive element-bi
+0.01 26 4 232 sp|Q1XGE2|HAC1_ASPOR 215 445 sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive element-bi
+0.004 26 41 332 sp|Q1XGE2|HAC1_ASPOR 727 1001 sp|A3LYI0|NST1_PICST Stress response protein NST1 OS=P
+0.016 31 4 152 sp|Q1XGE2|HAC1_ASPOR 218 368 sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive element-bi
+0.018 26 24 200 sp|Q1XGE2|HAC1_ASPOR 160 330 sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive element-bi
+0.01 23 14 297 sp|Q1XGE2|HAC1_ASPOR 228 517 sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive element-bi
+0.013 23 14 297 sp|Q1XGE2|HAC1_ASPOR 228 517 sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive element-bi
+0.0021 24 18 297 sp|Q1XGE2|HAC1_ASPOR 234 518 sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive element-bi
+0.0011 28 16 187 sp|Q1XGE2|HAC1_ASPOR 10 186 sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Homo s
+0.031 25 9 222 sp|Q1XGE2|HAC1_ASPOR 76 290 sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus GN=F
+0.056 35 73 143 sp|Q1XGE2|HAC1_ASPOR 68 138 sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=A
+0.064 25 9 222 sp|Q1XGE2|HAC1_ASPOR 76 290 sp|P53539|FOSB_HUMAN Protein fosB OS=Homo sapiens GN=F
+0.018 23 18 297 sp|Q1XGE2|HAC1_ASPOR 234 518 sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element-bind
+0.0081 26 48 275 sp|Q1XGE2|HAC1_ASPOR 213 434 sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-bi
+0.091 28 72 237 sp|Q1XGE2|HAC1_ASPOR 145 332 sp|Q9TUB3|FOSB_CANFA Protein fosB OS=Canis familiaris
+0.11 28 18 160 sp|Q1XGE2|HAC1_ASPOR 212 349 sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcriptio
+0.045 26 48 284 sp|Q1XGE2|HAC1_ASPOR 214 438 sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-bind
+0.16 27 29 163 sp|Q1XGE2|HAC1_ASPOR 171 307 sp|Q90370|MAFB_COTJA Transcription factor MafB OS=Cotu
+0.16 27 29 163 sp|Q1XGE2|HAC1_ASPOR 171 307 sp|Q90888|MAFB_CHICK Transcription factor MafB OS=Gall
+0.1 28 9 237 sp|Q1XGE2|HAC1_ASPOR 55 297 sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scrofa G
+0.073 27 48 258 sp|Q1XGE2|HAC1_ASPOR 214 432 sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-bi
+0.22 31 66 160 sp|Q1XGE2|HAC1_ASPOR 258 351 sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcriptio
+0.23 25 2 237 sp|Q1XGE2|HAC1_ASPOR 57 298 sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocricet
+0.26 25 2 237 sp|Q1XGE2|HAC1_ASPOR 57 297 sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus muscul
+0.16 26 48 236 sp|Q1XGE2|HAC1_ASPOR 218 404 sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-bi
+0.27 29 54 199 sp|Q1XGE2|HAC1_ASPOR 192 329 sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive element-bi
+0.27 28 80 198 sp|Q1XGE2|HAC1_ASPOR 195 312 sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF2 OS
+0.28 26 26 168 sp|Q1XGE2|HAC1_ASPOR 277 424 sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcriptio
+0.28 26 26 168 sp|Q1XGE2|HAC1_ASPOR 288 435 sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcriptio
+0.3 29 54 199 sp|Q1XGE2|HAC1_ASPOR 192 329 sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive element-bi
+0.37 28 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS=Homo
+0.37 25 2 237 sp|Q1XGE2|HAC1_ASPOR 57 297 sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein OS=
+0.38 23 12 216 sp|Q1XGE2|HAC1_ASPOR 38 261 sp|P51145|FOSL2_RAT Fos-related antigen 2 OS=Rattus no
+0.4 28 42 208 sp|Q1XGE2|HAC1_ASPOR 92 255 sp|Q9UQ88|CD11A_HUMAN Cell division protein kinase 11A
+0.075 27 3 236 sp|Q1XGE2|HAC1_ASPOR 429 680 sp|Q9WVS8|MK07_MOUSE Mitogen-activated protein kinase
+0.41 26 8 199 sp|Q1XGE2|HAC1_ASPOR 138 322 sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive element-bi
+0.42 24 4 222 sp|Q1XGE2|HAC1_ASPOR 39 253 sp|P15408|FOSL2_HUMAN Fos-related antigen 2 OS=Homo sa
+0.45 27 26 143 sp|Q1XGE2|HAC1_ASPOR 277 392 sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcriptio
+0.47 30 8 150 sp|Q1XGE2|HAC1_ASPOR 370 508 sp|P29747|CREBA_DROME Cyclic AMP response element-bind
+0.47 28 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS=Maca
+0.41 27 51 190 sp|Q1XGE2|HAC1_ASPOR 23 183 sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Rattus n
+0.53 27 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|P54842|MAFB_RAT Transcription factor MafB OS=Rattus
+0.54 24 4 216 sp|Q1XGE2|HAC1_ASPOR 39 260 sp|P47930|FOSL2_MOUSE Fos-related antigen 2 OS=Mus mus
+0.55 33 16 119 sp|Q1XGE2|HAC1_ASPOR 188 291 sp|Q2VZV0|IF2_MAGSA Translation initiation factor IF-2
+0.55 23 14 223 sp|Q1XGE2|HAC1_ASPOR 37 240 sp|Q0CEI3|KAPC_ASPTN Putative transcription factor kap
+0.017 26 1 207 sp|Q1XGE2|HAC1_ASPOR 107 318 sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-bi
+0.56 30 66 160 sp|Q1XGE2|HAC1_ASPOR 255 347 sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcription
+0.6 27 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|P54841|MAFB_MOUSE Transcription factor MafB OS=Mus
+0.6 24 2 237 sp|Q1XGE2|HAC1_ASPOR 57 297 sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos taurus
+0.62 20 66 223 sp|Q1XGE2|HAC1_ASPOR 83 237 sp|A1C9M5|KAPC_ASPCL Putative transcription factor kap
+0.67 26 29 163 sp|Q1XGE2|HAC1_ASPOR 176 312 sp|Q504L8|MAFB_XENTR Transcription factor MafB OS=Xeno
+0.7 34 83 167 sp|Q1XGE2|HAC1_ASPOR 201 281 sp|O57342|MAFA_COTJA Transcription factor MafA OS=Cotu
+0.72 27 19 154 sp|Q1XGE2|HAC1_ASPOR 210 342 sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcriptio
+0.75 33 60 146 sp|Q1XGE2|HAC1_ASPOR 170 252 sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-bind
+0.68 27 8 237 sp|Q1XGE2|HAC1_ASPOR 54 297 sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus norve
+0.69 28 71 172 sp|Q1XGE2|HAC1_ASPOR 17 125 sp|Q16520|BATF_HUMAN Basic leucine zipper transcriptio
+0.59 27 51 190 sp|Q1XGE2|HAC1_ASPOR 23 183 sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mus mu
+0.33 28 9 237 sp|Q1XGE2|HAC1_ASPOR 55 297 sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo sapie
+0.93 27 52 168 sp|Q1XGE2|HAC1_ASPOR 194 315 sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive element-bi
+0.14 22 43 227 sp|Q1XGE2|HAC1_ASPOR 675 868 sp|A4R2R1|NST1_MAGGR Stress response protein NST1 OS=M
+0.2 29 18 146 sp|Q1XGE2|HAC1_ASPOR 119 256 sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-bi
+0.68 26 9 237 sp|Q1XGE2|HAC1_ASPOR 55 298 sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis catu
+1.1 28 69 145 sp|Q1XGE2|HAC1_ASPOR 21 97 sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcripti
+1.2 27 52 168 sp|Q1XGE2|HAC1_ASPOR 345 466 sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive element-bi
+1.2 30 31 149 sp|Q1XGE2|HAC1_ASPOR 176 296 sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Arabido
+0.48 22 16 223 sp|Q1XGE2|HAC1_ASPOR 44 236 sp|A2R346|KAPC_ASPNC Putative transcription factor kap
+1.3 33 85 167 sp|Q1XGE2|HAC1_ASPOR 201 281 sp|O42290|MAFA_CHICK Transcription factor MafA OS=Gall
+1.3 30 63 185 sp|Q1XGE2|HAC1_ASPOR 159 282 sp|O43889|CREB3_HUMAN Cyclic AMP-responsive element-bi
+1.4 24 7 183 sp|Q1XGE2|HAC1_ASPOR 282 455 sp|O60841|IF2P_HUMAN Eukaryotic translation initiation
+1.1 30 48 230 sp|Q1XGE2|HAC1_ASPOR 735 930 sp|Q5KGK5|EIF3A_CRYNE Eukaryotic translation initiatio
+1.7 33 83 145 sp|Q1XGE2|HAC1_ASPOR 28 90 sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcripti
+1.5 25 25 199 sp|Q1XGE2|HAC1_ASPOR 161 322 sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive element-bi
+1.7 26 29 163 sp|Q1XGE2|HAC1_ASPOR 171 309 sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS=Xeno
+1.1 27 18 222 sp|Q1XGE2|HAC1_ASPOR 378 571 sp|Q7TSC1|BAT2_MOUSE Large proline-rich protein BAT2 O
+1.7 24 17 241 sp|Q1XGE2|HAC1_ASPOR 260 503 sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcripti
+1.8 26 10 157 sp|Q1XGE2|HAC1_ASPOR 315 458 sp|Q54Y73|BZPD_DICDI Probable basic-leucine zipper tra
+1.8 24 68 271 sp|Q1XGE2|HAC1_ASPOR 108 311 sp|P18625|FOSL2_CHICK Fos-related antigen 2 OS=Gallus
+1.4 23 2 291 sp|Q1XGE2|HAC1_ASPOR 57 353 sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodopus r
+1.8 28 71 160 sp|Q1XGE2|HAC1_ASPOR 17 103 sp|O35284|BATF_MOUSE Basic leucine zipper transcriptio
+1.9 25 2 148 sp|Q1XGE2|HAC1_ASPOR 142 290 sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Homo sa
+1.9 25 2 148 sp|Q1XGE2|HAC1_ASPOR 142 290 sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus mus
+0.51 29 39 210 sp|Q1XGE2|HAC1_ASPOR 79 238 sp|Q63ZM7|STABP_XENLA STAM-binding protein-like OS=Xen
+2.1 25 8 181 sp|Q1XGE2|HAC1_ASPOR 14 192 sp|P29681|IMPE2_DROME 20-hydroxyecdysone protein OS=Dr
+1.7 23 16 241 sp|Q1XGE2|HAC1_ASPOR 259 500 sp|O35451|ATF6B_MOUSE Cyclic AMP-dependent transcripti
+0.23 25 74 223 sp|Q1XGE2|HAC1_ASPOR 4 163 sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS=Schi
+2.3 25 41 172 sp|Q1XGE2|HAC1_ASPOR 629 763 sp|O13024|INCEA_XENLA Inner centromere protein A OS=Xe
+2.1 22 8 210 sp|Q1XGE2|HAC1_ASPOR 234 432 sp|A0JMT0|CA1AB_XENLA Chromatin assembly factor 1 subu
+2.3 23 7 183 sp|Q1XGE2|HAC1_ASPOR 282 455 sp|Q5RDE1|IF2P_PONAB Eukaryotic translation initiation
+2.3 30 83 167 sp|Q1XGE2|HAC1_ASPOR 203 284 sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS=Xeno
+2.4 29 16 148 sp|Q1XGE2|HAC1_ASPOR 163 290 sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattus no
+2.4 18 22 170 sp|Q1XGE2|HAC1_ASPOR 171 321 sp|Q54NF3|Y6434_DICDI Uncharacterized protein DDB_G028
+2.5 27 15 143 sp|Q1XGE2|HAC1_ASPOR 278 412 sp|P15336|ATF2_HUMAN Cyclic AMP-dependent transcriptio
+2.5 21 16 275 sp|Q1XGE2|HAC1_ASPOR 149 410 sp|Q553B1|DDX46_DICDI ATP-dependent RNA helicase ddx46
+2.8 27 18 228 sp|Q1XGE2|HAC1_ASPOR 380 575 sp|P48634|BAT2_HUMAN Large proline-rich protein BAT2 O
+2.8 25 18 251 sp|Q1XGE2|HAC1_ASPOR 380 589 sp|Q5TM26|BAT2_MACMU Large proline-rich protein BAT2 O
+2.9 23 24 294 sp|Q1XGE2|HAC1_ASPOR 48 314 sp|A3BYC1|HOX25_ORYSJ Homeobox-leucine zipper protein
+3.1 27 15 143 sp|Q1XGE2|HAC1_ASPOR 260 394 sp|P16951|ATF2_MOUSE Cyclic AMP-dependent transcriptio
+3.1 19 5 221 sp|Q1XGE2|HAC1_ASPOR 119 331 sp|Q96RN5|MED15_HUMAN Mediator of RNA polymerase II tr
+1.4 24 16 223 sp|Q1XGE2|HAC1_ASPOR 44 237 sp|Q2UNX4|KAPC_ASPOR Putative transcription factor kap
+3.5 24 19 214 sp|Q1XGE2|HAC1_ASPOR 838 1039 sp|Q80U35|ARHGH_MOUSE Rho guanine nucleotide exchange
+1.3 26 3 236 sp|Q1XGE2|HAC1_ASPOR 429 680 sp|P0C865|MK07_RAT Mitogen-activated protein kinase 7
+3.5 27 16 163 sp|Q1XGE2|HAC1_ASPOR 9 155 sp|P97875|JDP2_MOUSE Jun dimerization protein 2 OS=Mus
+3.5 27 16 163 sp|Q1XGE2|HAC1_ASPOR 9 155 sp|Q78E65|JDP2_RAT Jun dimerization protein 2 OS=Rattu
+0.59 25 20 221 sp|Q1XGE2|HAC1_ASPOR 105 301 sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive element-bi
+0.53 26 44 232 sp|Q1XGE2|HAC1_ASPOR 72 265 sp|P48755|FOSL1_MOUSE Fos-related antigen 1 OS=Mus mus
+3.7 24 4 149 sp|Q1XGE2|HAC1_ASPOR 527 669 sp|A2AJI0|MA7D1_MOUSE MAP7 domain-containing protein 1
+2.3 23 36 229 sp|Q1XGE2|HAC1_ASPOR 263 449 sp|Q00312|RBF1_CANAL Transcription factor RBF1 OS=Cand
+3.7 26 18 229 sp|Q1XGE2|HAC1_ASPOR 220 425 sp|O35413|SRBS2_RAT Sorbin and SH3 domain-containing p
+3.9 30 83 145 sp|Q1XGE2|HAC1_ASPOR 28 90 sp|P97876|BATF3_RAT Basic leucine zipper transcription
+2.4 25 13 143 sp|Q1XGE2|HAC1_ASPOR 275 394 sp|O93602|ATF2_CHICK Cyclic AMP-dependent transcriptio
+1.2 26 14 232 sp|Q1XGE2|HAC1_ASPOR 662 845 sp|Q5F489|TAF3_CHICK Transcription initiation factor T
+4.3 28 48 194 sp|Q1XGE2|HAC1_ASPOR 477 629 sp|Q6CBW0|NST1_YARLI Stress response protein NST1 OS=Y
+4.3 27 5 169 sp|Q1XGE2|HAC1_ASPOR 749 921 sp|Q9CXK9|RBM33_MOUSE RNA-binding protein 33 OS=Mus mu
+4.4 27 80 175 sp|Q1XGE2|HAC1_ASPOR 546 644 sp|Q554P0|BZPJ_DICDI Probable basic-leucine zipper tra
+4.4 27 18 154 sp|Q1XGE2|HAC1_ASPOR 283 415 sp|Q55EQ3|Y9086_DICDI Uncharacterized abhydrolase doma
+4.7 26 41 173 sp|Q1XGE2|HAC1_ASPOR 723 857 sp|O75037|KI21B_HUMAN Kinesin-like protein KIF21B OS=H
+4.8 22 26 217 sp|Q1XGE2|HAC1_ASPOR 1 186 sp|O14273|YET4_SCHPO Meiotically up-regulated protein
+4.8 23 28 297 sp|Q1XGE2|HAC1_ASPOR 13 259 sp|P19880|YAP1_YEAST AP-1-like transcription factor YA
+5.1 22 34 268 sp|Q1XGE2|HAC1_ASPOR 455 686 sp|Q6IPM2|IQCE_HUMAN IQ domain-containing protein E OS
+5.3 31 83 175 sp|Q1XGE2|HAC1_ASPOR 243 326 sp|Q98UK4|MAF_DANRE Transcription factor Maf OS=Danio
+5.3 17 6 186 sp|Q1XGE2|HAC1_ASPOR 661 844 sp|Q556Q3|IRLF_DICDI Probable serine/threonine-protein
+5.4 39 80 142 sp|Q1XGE2|HAC1_ASPOR 181 242 sp|P14233|TGA1B_TOBAC TGACG-sequence-specific DNA-bind
+5.4 35 73 153 sp|Q1XGE2|HAC1_ASPOR 644 724 sp|Q8CH25|SLTM_MOUSE SAFB-like transcription modulator
+5.4 29 4 149 sp|Q1XGE2|HAC1_ASPOR 135 280 sp|O81025|P2A03_ARATH Putative protein PHLOEM PROTEIN
+5.4 24 91 212 sp|Q1XGE2|HAC1_ASPOR 43 161 sp|P20226|TBP_HUMAN TATA-box-binding protein OS=Homo s
+5.5 23 38 257 sp|Q1XGE2|HAC1_ASPOR 1078 1294 sp|Q4WG58|PAN1_ASPFU Actin cytoskeleton-regulatory com
+5.5 23 38 257 sp|Q1XGE2|HAC1_ASPOR 1078 1294 sp|B0YC95|PAN1_ASPFC Actin cytoskeleton-regulatory com
+5.6 26 41 143 sp|Q1XGE2|HAC1_ASPOR 288 394 sp|Q00969|ATF2_RAT Cyclic AMP-dependent transcription
+2.2 31 35 142 sp|Q1XGE2|HAC1_ASPOR 111 219 sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Homo s
+1.5 24 18 229 sp|Q1XGE2|HAC1_ASPOR 378 575 sp|Q6MG48|BAT2_RAT Large proline-rich protein BAT2 OS=
+0.42 22 17 274 sp|Q1XGE2|HAC1_ASPOR 49 268 sp|P0C5H8|KAPC_EMENI Putative transcription factor kap
+2 31 14 145 sp|Q1XGE2|HAC1_ASPOR 291 435 sp|Q9M7Q3|AI5L6_ARATH ABSCISIC ACID-INSENSITIVE 5-like
+0.99 24 9 250 sp|Q1XGE2|HAC1_ASPOR 628 858 sp|Q6P9R4|ARHGI_MOUSE Rho guanine nucleotide exchange
+6.1 35 73 153 sp|Q1XGE2|HAC1_ASPOR 645 725 sp|Q9NWH9|SLTM_HUMAN SAFB-like transcription modulator
+6.3 25 70 317 sp|Q1XGE2|HAC1_ASPOR 217 472 sp|O60308|K0562_HUMAN Uncharacterized protein KIAA0562
+6.4 24 53 294 sp|Q1XGE2|HAC1_ASPOR 21 254 sp|A2Z0Q0|HOX25_ORYSI Homeobox-leucine zipper protein
+5.7 31 48 180 sp|Q1XGE2|HAC1_ASPOR 825 957 sp|Q6Y7W6|PERQ2_HUMAN PERQ amino acid-rich with GYF do
+4.7 23 66 216 sp|Q1XGE2|HAC1_ASPOR 75 214 sp|Q4WA21|KAPC_ASPFU Putative transcription factor kap
+6.9 25 41 169 sp|Q1XGE2|HAC1_ASPOR 724 856 sp|Q9QXL1|KI21B_MOUSE Kinesin-like protein KIF21B OS=M
+7.2 27 41 208 sp|Q1XGE2|HAC1_ASPOR 96 272 sp|P21127|CD11B_HUMAN Cell division protein kinase 11B
+7.2 30 83 163 sp|Q1XGE2|HAC1_ASPOR 276 355 sp|Q789F3|MAF_CHICK Transcription factor Maf OS=Gallus
+7.3 25 39 269 sp|Q1XGE2|HAC1_ASPOR 542 766 sp|Q6A000|K0753_MOUSE Uncharacterized protein KIAA0753
+7.4 30 83 163 sp|Q1XGE2|HAC1_ASPOR 276 355 sp|P23091|MAF_AVIS4 Transforming protein Maf OS=Avian
+1.1 25 29 186 sp|Q1XGE2|HAC1_ASPOR 294 463 sp|Q5RCJ1|CIP4_PONAB Cdc42-interacting protein 4 OS=Po
+7.5 22 2 291 sp|Q1XGE2|HAC1_ASPOR 12 294 sp|P23050|FOS_AVINK p55-v-Fos-transforming protein OS=
+2.3 26 5 245 sp|Q1XGE2|HAC1_ASPOR 610 858 sp|Q80YR5|SAFB2_MOUSE Scaffold attachment factor B2 OS
+7.5 25 80 267 sp|Q1XGE2|HAC1_ASPOR 851 1029 sp|Q6ZSZ5|ARHGI_HUMAN Rho guanine nucleotide exchange
+6.8 28 8 155 sp|Q1XGE2|HAC1_ASPOR 155 277 sp|O70191|ATF5_MOUSE Cyclic AMP-dependent transcriptio
+3 28 6 186 sp|Q1XGE2|HAC1_ASPOR 276 466 sp|A6NC98|CC88B_HUMAN Coiled-coil domain-containing pr
+8 23 36 151 sp|Q1XGE2|HAC1_ASPOR 294 411 sp|B0WYY2|MOEH_CULQU Moesin/ezrin/radixin homolog 1 OS
+8.3 22 2 291 sp|Q1XGE2|HAC1_ASPOR 57 339 sp|P11939|FOS_CHICK Proto-oncogene c-Fos OS=Gallus gal
+8.4 26 112 243 sp|Q1XGE2|HAC1_ASPOR 13 152 sp|Q9XUS2|MED29_CAEEL Mediator of RNA polymerase II tr
+5.3 23 66 223 sp|Q1XGE2|HAC1_ASPOR 75 231 sp|A1D9Z7|KAPC_NEOFI Putative transcription factor kap
+4.2 23 2 222 sp|Q1XGE2|HAC1_ASPOR 33 242 sp|P29176|FOSX_MSVFR Transforming protein v-Fos/v-Fox
+8.7 23 30 227 sp|Q1XGE2|HAC1_ASPOR 29 229 sp|Q09458|YQ37_CAEEL Uncharacterized protein C09F5.7 O
+9 29 59 150 sp|Q1XGE2|HAC1_ASPOR 223 319 sp|P23922|HBP1A_WHEAT Transcription factor HBP-1a OS=T
+6.3 26 23 143 sp|Q1XGE2|HAC1_ASPOR 572 699 sp|Q5R452|SAFB1_PONAB Scaffold attachment factor B1 OS
+5.6 26 19 163 sp|Q1XGE2|HAC1_ASPOR 119 245 sp|O02756|CEBPD_BOVIN CCAAT/enhancer-binding protein d
+9.2 25 9 254 sp|Q1XGE2|HAC1_ASPOR 105 350 sp|Q03173|ENAH_MOUSE Protein enabled homolog OS=Mus mu
+9.4 30 83 163 sp|Q1XGE2|HAC1_ASPOR 287 366 sp|P54843|MAF_MOUSE Transcription factor Maf OS=Mus mu
+9.4 25 19 163 sp|Q1XGE2|HAC1_ASPOR 131 258 sp|P49716|CEBPD_HUMAN CCAAT/enhancer-binding protein d
+1.4 22 29 272 sp|Q1XGE2|HAC1_ASPOR 294 542 sp|Q15642|CIP4_HUMAN Cdc42-interacting protein 4 OS=Ho
+9.4 32 80 146 sp|Q1XGE2|HAC1_ASPOR 274 340 sp|Q54RZ9|BZPG_DICDI Probable basic-leucine zipper tra
+5.2 25 48 270 sp|Q1XGE2|HAC1_ASPOR 936 1166 sp|Q5AXH3|TOF1_EMENI Topoisomerase 1-associated factor
+9.6 31 73 153 sp|Q1XGE2|HAC1_ASPOR 607 689 sp|Q498L2|SLTM_XENLA SAFB-like transcription modulator
+8.5 20 19 227 sp|Q1XGE2|HAC1_ASPOR 858 1076 sp|P0CB49|YLPM1_RAT YLP motif-containing protein 1 OS=
+9.7 36 77 131 sp|Q1XGE2|HAC1_ASPOR 38 91 sp|Q39140|TGA6_ARATH Transcription factor TGA6 OS=Arab
+10 24 41 154 sp|Q1XGE2|HAC1_ASPOR 277 386 sp|Q8N9W4|GG6L2_HUMAN Golgin subfamily A member 6-like
diff --git a/demotic/regress/h2-profmark.out b/demotic/regress/h2-profmark.out
new file mode 100644
index 0000000..6328f82
--- /dev/null
+++ b/demotic/regress/h2-profmark.out
@@ -0,0 +1,170 @@
+3e-47 173.5 sp|O29458|DCDA_ARCFU Orn_DAP_Arg_deC
+1.2e-46 171.6 sp|Q9UQW9|DCOR_SCHPO Orn_DAP_Arg_deC
+8.4e-44 162.1 sp|O27390|DCDA_METTH Orn_DAP_Arg_deC
+2.3e-43 160.6 sp|Q9I8S4|DCOR2_XENLA Orn_DAP_Arg_deC
+2.5e-43 160.5 sp|P09057|DCOR_RAT Orn_DAP_Arg_deC
+3.8e-43 159.9 sp|P14019|DCOR_CRIGR Orn_DAP_Arg_deC
+3.9e-43 159.8 sp|P00860|DCOR_MOUSE Orn_DAP_Arg_deC
+3.9e-43 159.8 sp|P27119|DCOR_MUSPA Orn_DAP_Arg_deC
+8e-43 158.8 sp|P27118|DCOR_CHICK Orn_DAP_Arg_deC
+2.8e-42 157.0 sp|P27120|DCOR1_XENLA Orn_DAP_Arg_deC
+3e-42 156.9 sp|P11926|DCOR_HUMAN Orn_DAP_Arg_deC
+2.1e-41 154.1 sp|P27117|DCOR_BOVIN Orn_DAP_Arg_deC
+1.6e-40 151.2 sp|P07805|DCOR_TRYBB Orn_DAP_Arg_deC
+2.6e-40 150.5 sp|Q9X1K5|DCDA_THEMA Orn_DAP_Arg_deC
+3.7e-39 146.6 sp|P49725|DCOR_PANRE Orn_DAP_Arg_deC
+6.6e-39 145.8 sp|O22616|DCOR_SOLLC Orn_DAP_Arg_deC
+7.3e-39 145.7 sp|P27121|DCOR_NEUCR Orn_DAP_Arg_deC
+8.2e-39 145.5 sp|P50134|DCOR_DATST Orn_DAP_Arg_deC
+4e-38 143.2 sp|P08432|DCOR_YEAST Orn_DAP_Arg_deC
+9.1e-38 142.0 sp|Q8A2B1|SPEA_BACTN Orn_DAP_Arg_deC
+1.9e-37 141.0 sp|Q9HUX1|SPEA_PSEAE Orn_DAP_Arg_deC
+2e-37 140.9 sp|Q7NU27|SPEA_CHRVO Orn_DAP_Arg_deC
+2.5e-37 140.6 sp|O69203|DCDA_ACTPA Orn_DAP_Arg_deC
+2.6e-37 140.5 sp|Q8S3N2|DCOR_CAPAN Orn_DAP_Arg_deC
+3.1e-37 140.3 sp|P00861|DCDA_ECOLI Orn_DAP_Arg_deC
+3.1e-37 140.2 sp|Q7NE10|SPEA_GLOVI Orn_DAP_Arg_deC
+3.8e-37 140.0 sp|Q58497|DCDA_METJA Orn_DAP_Arg_deC
+5.4e-37 139.5 sp|Q5LIQ3|SPEA_BACFN Orn_DAP_Arg_deC
+5.4e-37 139.5 sp|Q64ZT8|SPEA_BACFR Orn_DAP_Arg_deC
+1.3e-36 138.1 sp|Q87VU3|SPEA_PSESM Orn_DAP_Arg_deC
+2.2e-36 137.4 sp|P40807|DCOR1_DROME Orn_DAP_Arg_deC
+2.3e-36 137.4 sp|B0U1H6|SPEA_XYLFM Orn_DAP_Arg_deC
+2.3e-36 137.4 sp|Q9PH02|SPEA_XYLFA Orn_DAP_Arg_deC
+4.1e-36 136.5 sp|O05321|DCDA_PSEFL Orn_DAP_Arg_deC
+4.7e-36 136.3 sp|B2I6M1|SPEA_XYLF2 Orn_DAP_Arg_deC
+4.7e-36 136.3 sp|Q87F25|SPEA_XYLFT Orn_DAP_Arg_deC
+6.1e-36 136.0 sp|Q8DHY6|SPEA_THEEB Orn_DAP_Arg_deC
+6.8e-36 135.8 sp|O67262|DCDA_AQUAE Orn_DAP_Arg_deC
+1.3e-35 134.8 sp|Q88QC7|SPEA_PSEPK Orn_DAP_Arg_deC
+4.2e-35 133.2 sp|O14977|AZIN1_HUMAN Orn_DAP_Arg_deC
+4.2e-35 133.2 sp|Q5R7K3|AZIN1_PONAB Orn_DAP_Arg_deC
+5.1e-35 132.9 sp|O35484|AZIN1_MOUSE Orn_DAP_Arg_deC
+5.2e-35 132.9 sp|Q50140|DCDA_MYCLE Orn_DAP_Arg_deC
+5.5e-35 132.8 sp|A6L012|SPEA_BACV8 Orn_DAP_Arg_deC
+6.8e-35 132.5 sp|P19572|DCDA_PSEAE Orn_DAP_Arg_deC
+7.9e-35 132.3 sp|Q8YRP3|SPEA_ANASP Orn_DAP_Arg_deC
+1.2e-34 131.7 sp|P23630|DCDA_BACSU Orn_DAP_Arg_deC
+2.2e-34 130.8 sp|Q9ZBH5|DCDA_STRCO Orn_DAP_Arg_deC
+2.4e-34 130.6 sp|Q8K9C4|DCDA_BUCAP Orn_DAP_Arg_deC
+2.7e-34 130.5 sp|Q0ACK8|SPEA_ALHEH Orn_DAP_Arg_deC
+6.8e-34 129.2 sp|Q949X7|DCDA1_ARATH Orn_DAP_Arg_deC
+8.1e-34 128.9 sp|Q94A94|DCDA2_ARATH Orn_DAP_Arg_deC
+9.9e-34 128.6 sp|P0A5M5|DCDA_MYCBO Orn_DAP_Arg_deC
+9.9e-34 128.6 sp|P0A5M4|DCDA_MYCTU Orn_DAP_Arg_deC
+1.7e-33 127.8 sp|P41931|DCOR_CAEEL Orn_DAP_Arg_deC
+1.9e-33 127.7 sp|O50657|DCLO_SELRU Orn_DAP_Arg_deC
+2.4e-33 127.4 sp|Q9KVL7|DCDA_VIBCH Orn_DAP_Arg_deC
+3.1e-33 126.9 sp|Q6ZG77|DCDA_ORYSJ Orn_DAP_Arg_deC
+3.6e-33 126.7 sp|Q55484|DCDA_SYNY3 Orn_DAP_Arg_deC
+8.1e-33 125.6 sp|Q9JXM2|DCDA_NEIMB Orn_DAP_Arg_deC
+1e-32 125.2 sp|Q8P448|SPEA_XANCP Orn_DAP_Arg_deC
+1.2e-32 125.0 sp|Q54UF3|DCOR_DICDI Orn_DAP_Arg_deC
+1.3e-32 124.9 sp|Q9Z661|DCDA_ZYMMO Orn_DAP_Arg_deC
+2.6e-32 123.9 sp|Q9JWA6|DCDA_NEIMA Orn_DAP_Arg_deC
+3.6e-32 123.4 sp|P40808|DCOR2_DROME Orn_DAP_Arg_deC
+5.1e-32 122.9 sp|Q8PFQ5|SPEA_XANAC Orn_DAP_Arg_deC
+9e-32 122.1 sp|P56129|DCDA_HELPY Orn_DAP_Arg_deC
+1.4e-31 121.5 sp|Q89AC6|DCDA_BUCBP Orn_DAP_Arg_deC
+1.4e-31 121.5 sp|P78599|DCOR_CANAL Orn_DAP_Arg_deC
+1.8e-31 121.1 sp|Q8DA54|SPEA_VIBVU Orn_DAP_Arg_deC
+1.8e-31 121.1 sp|Q7MK24|SPEA_VIBVY Orn_DAP_Arg_deC
+1.8e-31 121.1 sp|A4Y5Y9|SPEA_SHEPC Orn_DAP_Arg_deC
+1.8e-31 121.1 sp|A1RKK8|SPEA_SHESW Orn_DAP_Arg_deC
+2e-31 121.0 sp|P57513|DCDA_BUCAI Orn_DAP_Arg_deC
+2.1e-31 120.9 sp|Q9RTK2|DCDA_DEIRA Orn_DAP_Arg_deC
+2.2e-31 120.8 sp|B8CR70|SPEA_SHEPW Orn_DAP_Arg_deC
+3.2e-31 120.3 sp|A3QDD8|SPEA_SHELP Orn_DAP_Arg_deC
+4.1e-31 119.9 sp|B8EAI2|SPEA_SHEB2 Orn_DAP_Arg_deC
+4.1e-31 119.9 sp|A3D3G2|SPEA_SHEB5 Orn_DAP_Arg_deC
+4.1e-31 119.9 sp|A6WM65|SPEA_SHEB8 Orn_DAP_Arg_deC
+4.1e-31 119.9 sp|A9KY70|SPEA_SHEB9 Orn_DAP_Arg_deC
+4.5e-31 119.8 sp|P27116|DCOR_LEIDO Orn_DAP_Arg_deC
+6.6e-31 119.2 sp|Q083L6|SPEA_SHEFN Orn_DAP_Arg_deC
+7e-31 119.1 sp|Q8EFU5|SPEA_SHEON Orn_DAP_Arg_deC
+1e-30 118.6 sp|B1KRD4|SPEA_SHEWM Orn_DAP_Arg_deC
+1.1e-30 118.5 sp|Q7V3M9|SPEA_PROMP Orn_DAP_Arg_deC
+2.2e-30 117.5 sp|A8FWJ3|SPEA_SHESH Orn_DAP_Arg_deC
+2.5e-30 117.3 sp|Q0HJY2|SPEA_SHESM Orn_DAP_Arg_deC
+2.5e-30 117.3 sp|Q0HW78|SPEA_SHESR Orn_DAP_Arg_deC
+2.7e-30 117.2 sp|Q63764|AZIN1_RAT Orn_DAP_Arg_deC
+2.9e-30 117.1 sp|Q9ZME5|DCDA_HELPJ Orn_DAP_Arg_deC
+3.1e-30 117.0 sp|A0KVN8|SPEA_SHESA Orn_DAP_Arg_deC
+3.1e-30 117.0 sp|Q8ZHG8|SPEA_YERPE Orn_DAP_Arg_deC
+3.5e-30 116.8 sp|B5XUB1|SPEA_KLEP3 Orn_DAP_Arg_deC
+3.5e-30 116.8 sp|Q12LW6|SPEA_SHEDO Orn_DAP_Arg_deC
+3.6e-30 116.8 sp|A2BNH3|SPEA_PROMS Orn_DAP_Arg_deC
+3.8e-30 116.7 sp|Q87JS8|SPEA_VIBPA Orn_DAP_Arg_deC
+3.8e-30 116.7 sp|A8H5G3|SPEA_SHEPA Orn_DAP_Arg_deC
+4.1e-30 116.6 sp|A3PA96|SPEA_PROM0 Orn_DAP_Arg_deC
+4.6e-30 116.4 sp|P41023|DCDA_BACMT Orn_DAP_Arg_deC
+4.8e-30 116.4 sp|B0TQX3|SPEA_SHEHH Orn_DAP_Arg_deC
+4.8e-30 116.4 sp|Q31DD8|SPEA_PROM9 Orn_DAP_Arg_deC
+4.9e-30 116.3 sp|Q96412|SPE1_DIACA Orn_DAP_Arg_deC
+5.9e-30 116.1 sp|A1S712|SPEA_SHEAM Orn_DAP_Arg_deC
+8.8e-30 115.5 sp|A8G243|SPEA_PROM2 Orn_DAP_Arg_deC
+1.1e-29 115.2 sp|Q7VEG4|SPEA_PROMA Orn_DAP_Arg_deC
+1.3e-29 114.9 sp|C4K6F4|SPEA_HAMD5 Orn_DAP_Arg_deC
+1.3e-29 114.9 sp|B5F5L1|SPEA_SALA4 Orn_DAP_Arg_deC
+1.3e-29 114.9 sp|Q57K30|SPEA_SALCH Orn_DAP_Arg_deC
+1.3e-29 114.9 sp|B5FUJ7|SPEA_SALDC Orn_DAP_Arg_deC
+1.3e-29 114.9 sp|B4THH1|SPEA_SALHS Orn_DAP_Arg_deC
+1.3e-29 114.9 sp|A9N4N1|SPEA_SALPB Orn_DAP_Arg_deC
+1.3e-29 114.9 sp|B4TV55|SPEA_SALSV Orn_DAP_Arg_deC
+1.3e-29 114.9 sp|P60659|SPEA_SALTY Orn_DAP_Arg_deC
+1.3e-29 114.9 sp|P60658|SPEA_SALTI Orn_DAP_Arg_deC
+1.3e-29 114.9 sp|B4T5J3|SPEA_SALNS Orn_DAP_Arg_deC
+1.4e-29 114.9 sp|P44316|DCDA_HAEIN Orn_DAP_Arg_deC
+1.4e-29 114.8 sp|P22220|SPE1_AVESA Orn_DAP_Arg_deC
+1.5e-29 114.7 sp|Q9X5M1|DCDA_MYCS2 Orn_DAP_Arg_deC
+1.9e-29 114.4 sp|Q9KLD1|SPEA_VIBCH Orn_DAP_Arg_deC
+2.2e-29 114.2 sp|Q8XCX9|SPEA_ECO57 Orn_DAP_Arg_deC
+2.2e-29 114.2 sp|B5YQD6|SPEA_ECO5E Orn_DAP_Arg_deC
+2.2e-29 114.2 sp|Q8FE34|SPEA_ECOL6 Orn_DAP_Arg_deC
+2.2e-29 114.2 sp|B1LDE8|SPEA_ECOSM Orn_DAP_Arg_deC
+2.6e-29 113.9 sp|Q0T0V3|SPEA_SHIF8 Orn_DAP_Arg_deC
+2.6e-29 113.9 sp|Q83Q93|SPEA_SHIFL Orn_DAP_Arg_deC
+3.3e-29 113.6 sp|B9M6H6|SPEA_GEOSF Orn_DAP_Arg_deC
+3.4e-29 113.6 sp|P21170|SPEA_ECOLI Orn_DAP_Arg_deC
+5.7e-29 112.8 sp|B5EIW4|SPEA_GEOBB Orn_DAP_Arg_deC
+5.7e-29 112.8 sp|C6E3V4|SPEA_GEOSM Orn_DAP_Arg_deC
+8.2e-29 112.3 sp|A1AS90|SPEA_PELPD Orn_DAP_Arg_deC
+8.6e-29 112.2 sp|A2BU00|SPEA_PROM5 Orn_DAP_Arg_deC
+6.4e-28 109.3 sp|Q8RQM6|DCDA_COREF Orn_DAP_Arg_deC
+8.9e-28 108.8 sp|B4F1A4|SPEA_PROMH Orn_DAP_Arg_deC
+1.5e-27 108.1 sp|P74576|SPEA1_SYNY3 Orn_DAP_Arg_deC
+2.6e-27 107.3 sp|A5GB52|SPEA_GEOUR Orn_DAP_Arg_deC
+2.9e-27 107.1 sp|Q7U3S0|SPEA_SYNPX Orn_DAP_Arg_deC
+3.9e-27 106.7 sp|A0A4W3|SPEA_GEOSL Orn_DAP_Arg_deC
+4.8e-27 106.4 sp|Q39X78|SPEA_GEOMG Orn_DAP_Arg_deC
+5e-27 106.3 sp|A1TY02|SPEA_MARAV Orn_DAP_Arg_deC
+6.4e-27 106.0 sp|Q9RXR4|SPEA_DEIRA Orn_DAP_Arg_deC
+1e-26 105.3 sp|P09890|DCDA_CORGL Orn_DAP_Arg_deC
+1.5e-26 104.8 sp|O82475|SPE1_BRAJU Orn_DAP_Arg_deC
+1.6e-26 104.7 sp|Q39827|SPE1_SOYBN Orn_DAP_Arg_deC
+1.6e-26 104.7 sp|Q7N121|SPEA_PHOLL Orn_DAP_Arg_deC
+1.8e-26 104.5 sp|B3EAF3|SPEA_GEOLS Orn_DAP_Arg_deC
+1.8e-26 104.5 sp|A5GWM2|SPEA_SYNR3 Orn_DAP_Arg_deC
+2.5e-26 104.0 sp|Q7UTS2|SPEA_RHOBA Orn_DAP_Arg_deC
+3e-26 103.8 sp|Q9KCM5|DCDA_BACHD Orn_DAP_Arg_deC
+3.1e-26 103.7 sp|Q96A70|ADC_HUMAN Orn_DAP_Arg_deC
+6.5e-26 102.6 sp|Q43075|SPE1_PEA Orn_DAP_Arg_deC
+2.6e-25 100.6 sp|P72587|SPEA2_SYNY3 Orn_DAP_Arg_deC
+3.7e-25 100.2 sp|Q7TUJ9|SPEA_PROMM Orn_DAP_Arg_deC
+1e-24 98.7 sp|P49726|SPE1_SOLLC Orn_DAP_Arg_deC
+1.1e-24 98.5 sp|Q9PII5|DCDA_CAMJE Orn_DAP_Arg_deC
+1.5e-24 98.1 sp|A2CDK1|SPEA_PROM3 Orn_DAP_Arg_deC
+1.7e-24 97.9 sp|Q8BVM4|ADC_MOUSE Orn_DAP_Arg_deC
+8e-24 95.7 sp|Q9CL60|SPEA_PASMU Orn_DAP_Arg_deC
+1.5e-23 94.8 sp|O23141|SPE2_ARATH Orn_DAP_Arg_deC
+1.6e-23 94.7 sp|Q9SNN0|SPE1_ORYSJ Orn_DAP_Arg_deC
+8.9e-23 92.2 sp|P31851|TABA_PSESZ Orn_DAP_Arg_deC
+1.2e-22 91.8 sp|Q9JT25|SPEA_NEIMA Orn_DAP_Arg_deC
+1.2e-22 91.8 sp|Q9K0U3|SPEA_NEIMB Orn_DAP_Arg_deC
+1.8e-22 91.2 sp|Q7XRA1|ADC2_ORYSJ Orn_DAP_Arg_deC
+1.5e-21 88.2 sp|Q9SI64|SPE1_ARATH Orn_DAP_Arg_deC
+2.2e-21 87.6 sp|C4L9A9|SPEA_TOLAT Orn_DAP_Arg_deC
+1.3e-18 78.4 sp|A0KIP8|SPEA_AERHH Orn_DAP_Arg_deC
+3.6e-17 73.6 sp|A4SPD6|SPEA_AERS4 Orn_DAP_Arg_deC
+0.0018 23.1 sp|P55709|Y4YA_RHISN Orn_DAP_Arg_deC
+1.1 -9.6 sp|O81160|SPE2_THECC Orn_DAP_Arg_deC
diff --git a/demotic/regress/h2-tbl.out b/demotic/regress/h2-tbl.out
new file mode 100644
index 0000000..0dbc01e
--- /dev/null
+++ b/demotic/regress/h2-tbl.out
@@ -0,0 +1,170 @@
+3e-47 0 1 123 Orn_DAP_Arg_deC 285 391 sp|O29458|DCDA_ARCFU Diaminopimelate decarboxylase O
+1.2e-46 0 1 123 Orn_DAP_Arg_deC 307 426 sp|Q9UQW9|DCOR_SCHPO Ornithine decarboxylase OS=Schi
+8.4e-44 0 1 123 Orn_DAP_Arg_deC 292 398 sp|O27390|DCDA_METTH Diaminopimelate decarboxylase O
+2.3e-43 0 1 123 Orn_DAP_Arg_deC 284 405 sp|Q9I8S4|DCOR2_XENLA Ornithine decarboxylase 2 OS=Xe
+2.5e-43 0 1 123 Orn_DAP_Arg_deC 285 408 sp|P09057|DCOR_RAT Ornithine decarboxylase OS=Ratt
+3.8e-43 0 1 123 Orn_DAP_Arg_deC 282 402 sp|P14019|DCOR_CRIGR Ornithine decarboxylase OS=Cric
+3.9e-43 0 1 123 Orn_DAP_Arg_deC 285 408 sp|P00860|DCOR_MOUSE Ornithine decarboxylase OS=Mus
+3.9e-43 0 1 123 Orn_DAP_Arg_deC 285 408 sp|P27119|DCOR_MUSPA Ornithine decarboxylase OS=Mus
+8e-43 0 1 123 Orn_DAP_Arg_deC 275 398 sp|P27118|DCOR_CHICK Ornithine decarboxylase (Fragme
+2.8e-42 0 1 123 Orn_DAP_Arg_deC 285 409 sp|P27120|DCOR1_XENLA Ornithine decarboxylase 1 OS=Xe
+3e-42 0 1 123 Orn_DAP_Arg_deC 285 408 sp|P11926|DCOR_HUMAN Ornithine decarboxylase OS=Homo
+2.1e-41 0 1 123 Orn_DAP_Arg_deC 285 408 sp|P27117|DCOR_BOVIN Ornithine decarboxylase OS=Bos
+1.6e-40 0 1 123 Orn_DAP_Arg_deC 283 406 sp|P07805|DCOR_TRYBB Ornithine decarboxylase OS=Tryp
+2.6e-40 0 1 123 Orn_DAP_Arg_deC 257 362 sp|Q9X1K5|DCDA_THEMA Diaminopimelate decarboxylase O
+3.7e-39 0 1 123 Orn_DAP_Arg_deC 294 416 sp|P49725|DCOR_PANRE Ornithine decarboxylase OS=Pana
+6.6e-39 0 1 123 Orn_DAP_Arg_deC 308 424 sp|O22616|DCOR_SOLLC Ornithine decarboxylase OS=Sola
+7.3e-39 0 1 123 Orn_DAP_Arg_deC 326 471 sp|P27121|DCOR_NEUCR Ornithine decarboxylase OS=Neur
+8.2e-39 0 1 123 Orn_DAP_Arg_deC 308 424 sp|P50134|DCOR_DATST Ornithine decarboxylase OS=Datu
+4e-38 0 1 123 Orn_DAP_Arg_deC 329 460 sp|P08432|DCOR_YEAST Ornithine decarboxylase OS=Sacc
+9.1e-38 0 1 123 Orn_DAP_Arg_deC 346 558 sp|Q8A2B1|SPEA_BACTN Biosynthetic arginine decarboxy
+1.9e-37 0 1 123 Orn_DAP_Arg_deC 354 567 sp|Q9HUX1|SPEA_PSEAE Biosynthetic arginine decarboxy
+2e-37 0 1 123 Orn_DAP_Arg_deC 343 556 sp|Q7NU27|SPEA_CHRVO Biosynthetic arginine decarboxy
+2.5e-37 0 1 123 Orn_DAP_Arg_deC 309 415 sp|O69203|DCDA_ACTPA Diaminopimelate decarboxylase O
+2.6e-37 0 1 123 Orn_DAP_Arg_deC 312 428 sp|Q8S3N2|DCOR_CAPAN Ornithine decarboxylase OS=Caps
+3.1e-37 0 1 123 Orn_DAP_Arg_deC 279 397 sp|P00861|DCDA_ECOLI Diaminopimelate decarboxylase O
+3.1e-37 0 1 123 Orn_DAP_Arg_deC 346 557 sp|Q7NE10|SPEA_GLOVI Biosynthetic arginine decarboxy
+3.8e-37 0 1 123 Orn_DAP_Arg_deC 305 410 sp|Q58497|DCDA_METJA Diaminopimelate decarboxylase O
+5.4e-37 0 1 123 Orn_DAP_Arg_deC 346 558 sp|Q5LIQ3|SPEA_BACFN Biosynthetic arginine decarboxy
+5.4e-37 0 1 123 Orn_DAP_Arg_deC 346 558 sp|Q64ZT8|SPEA_BACFR Biosynthetic arginine decarboxy
+1.3e-36 0 1 123 Orn_DAP_Arg_deC 354 567 sp|Q87VU3|SPEA_PSESM Biosynthetic arginine decarboxy
+2.2e-36 0 1 123 Orn_DAP_Arg_deC 276 391 sp|P40807|DCOR1_DROME Ornithine decarboxylase 1 OS=Dr
+2.3e-36 0 1 123 Orn_DAP_Arg_deC 343 555 sp|B0U1H6|SPEA_XYLFM Biosynthetic arginine decarboxy
+2.3e-36 0 1 123 Orn_DAP_Arg_deC 343 555 sp|Q9PH02|SPEA_XYLFA Biosynthetic arginine decarboxy
+4.1e-36 0 1 123 Orn_DAP_Arg_deC 285 390 sp|O05321|DCDA_PSEFL Diaminopimelate decarboxylase O
+4.7e-36 0 1 123 Orn_DAP_Arg_deC 343 555 sp|B2I6M1|SPEA_XYLF2 Biosynthetic arginine decarboxy
+4.7e-36 0 1 123 Orn_DAP_Arg_deC 343 555 sp|Q87F25|SPEA_XYLFT Biosynthetic arginine decarboxy
+6.1e-36 0 1 123 Orn_DAP_Arg_deC 353 564 sp|Q8DHY6|SPEA_THEEB Biosynthetic arginine decarboxy
+6.8e-36 0 1 123 Orn_DAP_Arg_deC 290 396 sp|O67262|DCDA_AQUAE Diaminopimelate decarboxylase O
+1.3e-35 0 1 123 Orn_DAP_Arg_deC 354 567 sp|Q88QC7|SPEA_PSEPK Biosynthetic arginine decarboxy
+4.2e-35 0 1 123 Orn_DAP_Arg_deC 282 406 sp|O14977|AZIN1_HUMAN Antizyme inhibitor 1 OS=Homo sa
+4.2e-35 0 1 123 Orn_DAP_Arg_deC 282 406 sp|Q5R7K3|AZIN1_PONAB Antizyme inhibitor 1 OS=Pongo a
+5.1e-35 0 1 123 Orn_DAP_Arg_deC 282 406 sp|O35484|AZIN1_MOUSE Antizyme inhibitor 1 OS=Mus mus
+5.2e-35 0 1 123 Orn_DAP_Arg_deC 336 449 sp|Q50140|DCDA_MYCLE Diaminopimelate decarboxylase O
+5.5e-35 0 1 123 Orn_DAP_Arg_deC 346 558 sp|A6L012|SPEA_BACV8 Biosynthetic arginine decarboxy
+6.8e-35 0 1 123 Orn_DAP_Arg_deC 284 389 sp|P19572|DCDA_PSEAE Diaminopimelate decarboxylase O
+7.9e-35 0 1 123 Orn_DAP_Arg_deC 395 606 sp|Q8YRP3|SPEA_ANASP Biosynthetic arginine decarboxy
+1.2e-34 0 1 123 Orn_DAP_Arg_deC 301 409 sp|P23630|DCDA_BACSU Diaminopimelate decarboxylase O
+2.2e-34 0 1 123 Orn_DAP_Arg_deC 286 403 sp|Q9ZBH5|DCDA_STRCO Diaminopimelate decarboxylase O
+2.4e-34 0 1 123 Orn_DAP_Arg_deC 275 393 sp|Q8K9C4|DCDA_BUCAP Diaminopimelate decarboxylase O
+2.7e-34 0 1 123 Orn_DAP_Arg_deC 345 558 sp|Q0ACK8|SPEA_ALHEH Biosynthetic arginine decarboxy
+6.8e-34 0 1 123 Orn_DAP_Arg_deC 351 459 sp|Q949X7|DCDA1_ARATH Diaminopimelate decarboxylase 1
+8.1e-34 0 1 123 Orn_DAP_Arg_deC 356 464 sp|Q94A94|DCDA2_ARATH Diaminopimelate decarboxylase 2
+9.9e-34 0 1 123 Orn_DAP_Arg_deC 311 424 sp|P0A5M5|DCDA_MYCBO Diaminopimelate decarboxylase O
+9.9e-34 0 1 123 Orn_DAP_Arg_deC 311 424 sp|P0A5M4|DCDA_MYCTU Diaminopimelate decarboxylase O
+1.7e-33 0 1 123 Orn_DAP_Arg_deC 286 407 sp|P41931|DCOR_CAEEL Ornithine decarboxylase OS=Caen
+1.9e-33 0 1 123 Orn_DAP_Arg_deC 266 371 sp|O50657|DCLO_SELRU Lysine/ornithine decarboxylase
+2.4e-33 0 1 123 Orn_DAP_Arg_deC 286 391 sp|Q9KVL7|DCDA_VIBCH Diaminopimelate decarboxylase O
+3.1e-33 0 1 123 Orn_DAP_Arg_deC 356 463 sp|Q6ZG77|DCDA_ORYSJ Probable diaminopimelate decarb
+3.6e-33 0 1 123 Orn_DAP_Arg_deC 332 440 sp|Q55484|DCDA_SYNY3 Diaminopimelate decarboxylase O
+8.1e-33 0 1 123 Orn_DAP_Arg_deC 276 381 sp|Q9JXM2|DCDA_NEIMB Diaminopimelate decarboxylase O
+1e-32 0 1 123 Orn_DAP_Arg_deC 343 555 sp|Q8P448|SPEA_XANCP Biosynthetic arginine decarboxy
+1.2e-32 0 1 123 Orn_DAP_Arg_deC 328 450 sp|Q54UF3|DCOR_DICDI Probable ornithine decarboxylas
+1.3e-32 0 1 123 Orn_DAP_Arg_deC 289 394 sp|Q9Z661|DCDA_ZYMMO Diaminopimelate decarboxylase O
+2.6e-32 0 1 123 Orn_DAP_Arg_deC 276 381 sp|Q9JWA6|DCDA_NEIMA Diaminopimelate decarboxylase O
+3.6e-32 0 1 123 Orn_DAP_Arg_deC 276 390 sp|P40808|DCOR2_DROME Ornithine decarboxylase 2 OS=Dr
+5.1e-32 0 1 123 Orn_DAP_Arg_deC 343 555 sp|Q8PFQ5|SPEA_XANAC Biosynthetic arginine decarboxy
+9e-32 0 1 123 Orn_DAP_Arg_deC 270 377 sp|P56129|DCDA_HELPY Diaminopimelate decarboxylase O
+1.4e-31 0 1 123 Orn_DAP_Arg_deC 275 393 sp|Q89AC6|DCDA_BUCBP Diaminopimelate decarboxylase O
+1.4e-31 0 1 123 Orn_DAP_Arg_deC 324 468 sp|P78599|DCOR_CANAL Ornithine decarboxylase OS=Cand
+1.8e-31 0 1 123 Orn_DAP_Arg_deC 355 571 sp|Q8DA54|SPEA_VIBVU Biosynthetic arginine decarboxy
+1.8e-31 0 1 123 Orn_DAP_Arg_deC 354 570 sp|Q7MK24|SPEA_VIBVY Biosynthetic arginine decarboxy
+1.8e-31 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A4Y5Y9|SPEA_SHEPC Biosynthetic arginine decarboxy
+1.8e-31 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A1RKK8|SPEA_SHESW Biosynthetic arginine decarboxy
+2e-31 0 1 123 Orn_DAP_Arg_deC 275 393 sp|P57513|DCDA_BUCAI Diaminopimelate decarboxylase O
+2.1e-31 0 1 123 Orn_DAP_Arg_deC 253 357 sp|Q9RTK2|DCDA_DEIRA Diaminopimelate decarboxylase O
+2.2e-31 0 1 123 Orn_DAP_Arg_deC 350 566 sp|B8CR70|SPEA_SHEPW Biosynthetic arginine decarboxy
+3.2e-31 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A3QDD8|SPEA_SHELP Biosynthetic arginine decarboxy
+4.1e-31 0 1 123 Orn_DAP_Arg_deC 350 566 sp|B8EAI2|SPEA_SHEB2 Biosynthetic arginine decarboxy
+4.1e-31 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A3D3G2|SPEA_SHEB5 Biosynthetic arginine decarboxy
+4.1e-31 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A6WM65|SPEA_SHEB8 Biosynthetic arginine decarboxy
+4.1e-31 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A9KY70|SPEA_SHEB9 Biosynthetic arginine decarboxy
+4.5e-31 0 1 123 Orn_DAP_Arg_deC 509 682 sp|P27116|DCOR_LEIDO Ornithine decarboxylase OS=Leis
+6.6e-31 0 1 123 Orn_DAP_Arg_deC 350 566 sp|Q083L6|SPEA_SHEFN Biosynthetic arginine decarboxy
+7e-31 0 1 123 Orn_DAP_Arg_deC 350 566 sp|Q8EFU5|SPEA_SHEON Biosynthetic arginine decarboxy
+1e-30 0 1 123 Orn_DAP_Arg_deC 350 566 sp|B1KRD4|SPEA_SHEWM Biosynthetic arginine decarboxy
+1.1e-30 0 1 123 Orn_DAP_Arg_deC 355 574 sp|Q7V3M9|SPEA_PROMP Biosynthetic arginine decarboxy
+2.2e-30 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A8FWJ3|SPEA_SHESH Biosynthetic arginine decarboxy
+2.5e-30 0 1 123 Orn_DAP_Arg_deC 350 566 sp|Q0HJY2|SPEA_SHESM Biosynthetic arginine decarboxy
+2.5e-30 0 1 123 Orn_DAP_Arg_deC 350 566 sp|Q0HW78|SPEA_SHESR Biosynthetic arginine decarboxy
+2.7e-30 0 1 123 Orn_DAP_Arg_deC 282 406 sp|Q63764|AZIN1_RAT Antizyme inhibitor 1 OS=Rattus
+2.9e-30 0 1 123 Orn_DAP_Arg_deC 270 377 sp|Q9ZME5|DCDA_HELPJ Diaminopimelate decarboxylase O
+3.1e-30 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A0KVN8|SPEA_SHESA Biosynthetic arginine decarboxy
+3.1e-30 0 1 123 Orn_DAP_Arg_deC 372 588 sp|Q8ZHG8|SPEA_YERPE Biosynthetic arginine decarboxy
+3.5e-30 0 1 123 Orn_DAP_Arg_deC 345 561 sp|B5XUB1|SPEA_KLEP3 Biosynthetic arginine decarboxy
+3.5e-30 0 1 123 Orn_DAP_Arg_deC 350 566 sp|Q12LW6|SPEA_SHEDO Biosynthetic arginine decarboxy
+3.6e-30 0 1 123 Orn_DAP_Arg_deC 355 574 sp|A2BNH3|SPEA_PROMS Biosynthetic arginine decarboxy
+3.8e-30 0 1 123 Orn_DAP_Arg_deC 354 570 sp|Q87JS8|SPEA_VIBPA Biosynthetic arginine decarboxy
+3.8e-30 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A8H5G3|SPEA_SHEPA Biosynthetic arginine decarboxy
+4.1e-30 0 1 123 Orn_DAP_Arg_deC 355 574 sp|A3PA96|SPEA_PROM0 Biosynthetic arginine decarboxy
+4.6e-30 0 1 123 Orn_DAP_Arg_deC 301 409 sp|P41023|DCDA_BACMT Diaminopimelate decarboxylase O
+4.8e-30 0 1 123 Orn_DAP_Arg_deC 350 566 sp|B0TQX3|SPEA_SHEHH Biosynthetic arginine decarboxy
+4.8e-30 0 1 123 Orn_DAP_Arg_deC 355 574 sp|Q31DD8|SPEA_PROM9 Biosynthetic arginine decarboxy
+4.9e-30 0 1 123 Orn_DAP_Arg_deC 491 605 sp|Q96412|SPE1_DIACA Arginine decarboxylase OS=Diant
+5.9e-30 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A1S712|SPEA_SHEAM Biosynthetic arginine decarboxy
+8.8e-30 0 1 123 Orn_DAP_Arg_deC 355 574 sp|A8G243|SPEA_PROM2 Biosynthetic arginine decarboxy
+1.1e-29 0 1 123 Orn_DAP_Arg_deC 355 574 sp|Q7VEG4|SPEA_PROMA Biosynthetic arginine decarboxy
+1.3e-29 0 1 123 Orn_DAP_Arg_deC 346 562 sp|C4K6F4|SPEA_HAMD5 Biosynthetic arginine decarboxy
+1.3e-29 0 1 123 Orn_DAP_Arg_deC 345 561 sp|B5F5L1|SPEA_SALA4 Biosynthetic arginine decarboxy
+1.3e-29 0 1 123 Orn_DAP_Arg_deC 345 561 sp|Q57K30|SPEA_SALCH Biosynthetic arginine decarboxy
+1.3e-29 0 1 123 Orn_DAP_Arg_deC 345 561 sp|B5FUJ7|SPEA_SALDC Biosynthetic arginine decarboxy
+1.3e-29 0 1 123 Orn_DAP_Arg_deC 345 561 sp|B4THH1|SPEA_SALHS Biosynthetic arginine decarboxy
+1.3e-29 0 1 123 Orn_DAP_Arg_deC 345 561 sp|A9N4N1|SPEA_SALPB Biosynthetic arginine decarboxy
+1.3e-29 0 1 123 Orn_DAP_Arg_deC 345 561 sp|B4TV55|SPEA_SALSV Biosynthetic arginine decarboxy
+1.3e-29 0 1 123 Orn_DAP_Arg_deC 371 587 sp|P60659|SPEA_SALTY Biosynthetic arginine decarboxy
+1.3e-29 0 1 123 Orn_DAP_Arg_deC 371 587 sp|P60658|SPEA_SALTI Biosynthetic arginine decarboxy
+1.3e-29 0 1 123 Orn_DAP_Arg_deC 345 561 sp|B4T5J3|SPEA_SALNS Biosynthetic arginine decarboxy
+1.4e-29 0 1 123 Orn_DAP_Arg_deC 285 391 sp|P44316|DCDA_HAEIN Diaminopimelate decarboxylase O
+1.4e-29 0 1 123 Orn_DAP_Arg_deC 355 532 sp|P22220|SPE1_AVESA Arginine decarboxylase OS=Avena
+1.5e-29 0 1 123 Orn_DAP_Arg_deC 336 449 sp|Q9X5M1|DCDA_MYCS2 Diaminopimelate decarboxylase O
+1.9e-29 0 1 123 Orn_DAP_Arg_deC 354 570 sp|Q9KLD1|SPEA_VIBCH Biosynthetic arginine decarboxy
+2.2e-29 0 1 123 Orn_DAP_Arg_deC 371 587 sp|Q8XCX9|SPEA_ECO57 Biosynthetic arginine decarboxy
+2.2e-29 0 1 123 Orn_DAP_Arg_deC 345 561 sp|B5YQD6|SPEA_ECO5E Biosynthetic arginine decarboxy
+2.2e-29 0 1 123 Orn_DAP_Arg_deC 371 587 sp|Q8FE34|SPEA_ECOL6 Biosynthetic arginine decarboxy
+2.2e-29 0 1 123 Orn_DAP_Arg_deC 345 561 sp|B1LDE8|SPEA_ECOSM Biosynthetic arginine decarboxy
+2.6e-29 0 1 123 Orn_DAP_Arg_deC 345 561 sp|Q0T0V3|SPEA_SHIF8 Biosynthetic arginine decarboxy
+2.6e-29 0 1 123 Orn_DAP_Arg_deC 371 587 sp|Q83Q93|SPEA_SHIFL Biosynthetic arginine decarboxy
+3.3e-29 0 1 123 Orn_DAP_Arg_deC 346 561 sp|B9M6H6|SPEA_GEOSF Biosynthetic arginine decarboxy
+3.4e-29 0 1 123 Orn_DAP_Arg_deC 371 587 sp|P21170|SPEA_ECOLI Biosynthetic arginine decarboxy
+5.7e-29 0 1 123 Orn_DAP_Arg_deC 425 561 sp|B5EIW4|SPEA_GEOBB Biosynthetic arginine decarboxy
+5.7e-29 0 1 123 Orn_DAP_Arg_deC 425 561 sp|C6E3V4|SPEA_GEOSM Biosynthetic arginine decarboxy
+8.2e-29 0 1 123 Orn_DAP_Arg_deC 425 561 sp|A1AS90|SPEA_PELPD Biosynthetic arginine decarboxy
+8.6e-29 0 1 123 Orn_DAP_Arg_deC 355 574 sp|A2BU00|SPEA_PROM5 Biosynthetic arginine decarboxy
+6.4e-28 0 1 123 Orn_DAP_Arg_deC 324 437 sp|Q8RQM6|DCDA_COREF Diaminopimelate decarboxylase O
+8.9e-28 0 1 123 Orn_DAP_Arg_deC 347 563 sp|B4F1A4|SPEA_PROMH Biosynthetic arginine decarboxy
+1.5e-27 0 1 123 Orn_DAP_Arg_deC 396 615 sp|P74576|SPEA1_SYNY3 Biosynthetic arginine decarboxy
+2.6e-27 0 1 123 Orn_DAP_Arg_deC 346 561 sp|A5GB52|SPEA_GEOUR Biosynthetic arginine decarboxy
+2.9e-27 0 1 123 Orn_DAP_Arg_deC 351 570 sp|Q7U3S0|SPEA_SYNPX Biosynthetic arginine decarboxy
+3.9e-27 0 1 123 Orn_DAP_Arg_deC 425 561 sp|A0A4W3|SPEA_GEOSL Biosynthetic arginine decarboxy
+4.8e-27 0 1 123 Orn_DAP_Arg_deC 425 561 sp|Q39X78|SPEA_GEOMG Biosynthetic arginine decarboxy
+5e-27 0 1 123 Orn_DAP_Arg_deC 350 566 sp|A1TY02|SPEA_MARAV Biosynthetic arginine decarboxy
+6.4e-27 0 1 123 Orn_DAP_Arg_deC 372 586 sp|Q9RXR4|SPEA_DEIRA Biosynthetic arginine decarboxy
+1e-26 0 1 123 Orn_DAP_Arg_deC 310 423 sp|P09890|DCDA_CORGL Diaminopimelate decarboxylase O
+1.5e-26 0 1 123 Orn_DAP_Arg_deC 390 585 sp|O82475|SPE1_BRAJU Arginine decarboxylase OS=Brass
+1.6e-26 0 1 123 Orn_DAP_Arg_deC 401 596 sp|Q39827|SPE1_SOYBN Arginine decarboxylase OS=Glyci
+1.6e-26 0 1 123 Orn_DAP_Arg_deC 347 563 sp|Q7N121|SPEA_PHOLL Biosynthetic arginine decarboxy
+1.8e-26 0 1 123 Orn_DAP_Arg_deC 346 561 sp|B3EAF3|SPEA_GEOLS Biosynthetic arginine decarboxy
+1.8e-26 0 1 123 Orn_DAP_Arg_deC 355 566 sp|A5GWM2|SPEA_SYNR3 Biosynthetic arginine decarboxy
+2.5e-26 0 1 123 Orn_DAP_Arg_deC 460 592 sp|Q7UTS2|SPEA_RHOBA Biosynthetic arginine decarboxy
+3e-26 0 1 123 Orn_DAP_Arg_deC 301 409 sp|Q9KCM5|DCDA_BACHD Diaminopimelate decarboxylase O
+3.1e-26 0 1 123 Orn_DAP_Arg_deC 286 409 sp|Q96A70|ADC_HUMAN Arginine decarboxylase OS=Homo
+6.5e-26 0 1 123 Orn_DAP_Arg_deC 494 609 sp|Q43075|SPE1_PEA Arginine decarboxylase OS=Pisum
+2.6e-25 0 1 123 Orn_DAP_Arg_deC 375 587 sp|P72587|SPEA2_SYNY3 Biosynthetic arginine decarboxy
+3.7e-25 0 1 123 Orn_DAP_Arg_deC 355 574 sp|Q7TUJ9|SPEA_PROMM Biosynthetic arginine decarboxy
+1e-24 0 1 123 Orn_DAP_Arg_deC 291 492 sp|P49726|SPE1_SOLLC Arginine decarboxylase OS=Solan
+1.1e-24 0 1 123 Orn_DAP_Arg_deC 270 375 sp|Q9PII5|DCDA_CAMJE Diaminopimelate decarboxylase O
+1.5e-24 0 1 123 Orn_DAP_Arg_deC 355 574 sp|A2CDK1|SPEA_PROM3 Biosynthetic arginine decarboxy
+1.7e-24 0 1 123 Orn_DAP_Arg_deC 286 408 sp|Q8BVM4|ADC_MOUSE Antizyme inhibitor 2 OS=Mus mus
+8e-24 0 1 123 Orn_DAP_Arg_deC 357 573 sp|Q9CL60|SPEA_PASMU Biosynthetic arginine decarboxy
+1.5e-23 0 1 123 Orn_DAP_Arg_deC 481 596 sp|O23141|SPE2_ARATH Arginine decarboxylase 2 OS=Ara
+1.6e-23 0 1 123 Orn_DAP_Arg_deC 401 598 sp|Q9SNN0|SPE1_ORYSJ Arginine decarboxylase 1 OS=Ory
+8.9e-23 0 1 123 Orn_DAP_Arg_deC 278 383 sp|P31851|TABA_PSESZ Protein tabA OS=Pseudomonas syr
+1.2e-22 0 1 123 Orn_DAP_Arg_deC 343 559 sp|Q9JT25|SPEA_NEIMA Biosynthetic arginine decarboxy
+1.2e-22 0 1 123 Orn_DAP_Arg_deC 343 559 sp|Q9K0U3|SPEA_NEIMB Biosynthetic arginine decarboxy
+1.8e-22 0 1 123 Orn_DAP_Arg_deC 381 547 sp|Q7XRA1|ADC2_ORYSJ Arginine decarboxylase 2 OS=Ory
+1.5e-21 0 1 123 Orn_DAP_Arg_deC 385 584 sp|Q9SI64|SPE1_ARATH Arginine decarboxylase 1 OS=Ara
+2.2e-21 0 1 123 Orn_DAP_Arg_deC 433 566 sp|C4L9A9|SPEA_TOLAT Biosynthetic arginine decarboxy
+1.3e-18 0 1 123 Orn_DAP_Arg_deC 348 564 sp|A0KIP8|SPEA_AERHH Biosynthetic arginine decarboxy
+3.6e-17 0 1 123 Orn_DAP_Arg_deC 348 564 sp|A4SPD6|SPEA_AERS4 Biosynthetic arginine decarboxy
+0.0018 0 1 123 Orn_DAP_Arg_deC 324 439 sp|P55709|Y4YA_RHISN Uncharacterized protein y4yA OS
+1.1 0 1 123 Orn_DAP_Arg_deC 341 406 sp|O81160|SPE2_THECC Arginine decarboxylase (Fragmen
diff --git a/demotic/regress/hmmsearch-profmark.out b/demotic/regress/hmmsearch-profmark.out
new file mode 100644
index 0000000..a0ae509
--- /dev/null
+++ b/demotic/regress/hmmsearch-profmark.out
@@ -0,0 +1,930 @@
+4.2e-39 138.8 sp|P06485|US02_HHV11 US2
+2e-38 136.6 sp|P13292|US02_HHV2H US2
+1.6e-35 127.2 sp|Q05106|US453_GAHVG US2
+2.3e-35 126.8 sp|P32517|US02_EHV1K US2
+3.3e-33 119.8 sp|P28964|US02_EHV1B US2
+2.1e-31 114.0 sp|Q08099|US02_BHV1S US2
+1.8e-17 68.9 sp|P24382|US02_SUHVN US2
+1.4 14.3 sp|Q9ZK80|ATPG_HELPJ US2
+1.4 14.3 sp|P56082|ATPG_HELPY US2
+1.5 14.2 sp|B2UUP1|ATPG_HELPS US2
+1.5 14.2 sp|B6JMX3|ATPG_HELP2 US2
+2.6 13.4 sp|Q17Y79|ATPG_HELAH US2
+3.6 13.0 sp|B5Z8D1|ATPG_HELPG US2
+3.9 12.9 sp|Q1CSD4|ATPG_HELPH US2
+3e-40 142.2 sp|A7Z4E5|MURG_BACA2 Glyco_transf_28
+3.6e-40 141.9 sp|Q65JY0|MURG_BACLD Glyco_transf_28
+7.6e-40 140.8 sp|P37585|MURG_BACSU Glyco_transf_28
+3e-39 138.9 sp|A8FCY1|MURG_BACP2 Glyco_transf_28
+7.6e-39 137.6 sp|Q812W5|MURG1_BACCR Glyco_transf_28
+1.1e-38 137.0 sp|A3MY90|MURG_ACTP2 Glyco_transf_28
+1.5e-38 136.7 sp|A0RHT1|MURG2_BACAH Glyco_transf_28
+1.5e-38 136.7 sp|Q636B6|MURG1_BACCZ Glyco_transf_28
+1.5e-38 136.7 sp|Q81JG5|MURG1_BACAN Glyco_transf_28
+1.8e-38 136.4 sp|Q732F8|MURG1_BACC1 Glyco_transf_28
+2.7e-38 135.8 sp|B7GGI2|MURG_ANOFW Glyco_transf_28
+2.9e-38 135.7 sp|A7GRN6|MURG_BACCN Glyco_transf_28
+3.7e-38 135.4 sp|B0BRH7|MURG_ACTPJ Glyco_transf_28
+3.7e-38 135.4 sp|B3GZK8|MURG_ACTP7 Glyco_transf_28
+3.8e-38 135.3 sp|Q6HEQ4|MURG1_BACHK Glyco_transf_28
+9.4e-38 134.1 sp|O07670|MURG_ENTHR Glyco_transf_28
+1.6e-37 133.3 sp|A7FM66|MURG_YERP3 Glyco_transf_28
+1.6e-37 133.3 sp|B1JK81|MURG_YERPY Glyco_transf_28
+1.6e-37 133.3 sp|B2K4E6|MURG_YERPB Glyco_transf_28
+1.6e-37 133.3 sp|Q66EK5|MURG_YERPS Glyco_transf_28
+2e-37 133.0 sp|A1JJJ3|MURG_YERE8 Glyco_transf_28
+2.2e-37 132.8 sp|A9MQC2|MURG_SALAR Glyco_transf_28
+2.3e-37 132.8 sp|P64869|Y1526_MYCTU Glyco_transf_28
+2.3e-37 132.8 sp|P64870|Y1553_MYCBO Glyco_transf_28
+3.1e-37 132.4 sp|Q65RY6|MURG_MANSM Glyco_transf_28
+3.5e-37 132.2 sp|B2VD91|MURG_ERWT9 Glyco_transf_28
+3.6e-37 132.2 sp|Q4QLF8|MURG_HAEI8 Glyco_transf_28
+3.8e-37 132.1 sp|A5UIR2|MURG_HAEIG Glyco_transf_28
+4e-37 132.0 sp|P45065|MURG_HAEIN Glyco_transf_28
+4.7e-37 131.8 sp|A9R124|MURG_YERPG Glyco_transf_28
+4.7e-37 131.8 sp|Q1C214|MURG_YERPA Glyco_transf_28
+4.7e-37 131.8 sp|Q1CMM7|MURG_YERPN Glyco_transf_28
+4.7e-37 131.8 sp|Q8ZIE9|MURG_YERPE Glyco_transf_28
+5.7e-37 131.5 sp|O07109|MURG_ENTFA Glyco_transf_28
+5.8e-37 131.5 sp|A3QIM1|MURG_SHELP Glyco_transf_28
+6e-37 131.5 sp|A8G9S7|MURG_SERP5 Glyco_transf_28
+6.3e-37 131.4 sp|B7LWF6|MURG_ESCF3 Glyco_transf_28
+7.1e-37 131.2 sp|A7MIE5|MURG_ENTS8 Glyco_transf_28
+7.4e-37 131.2 sp|C6DEU3|MURG_PECCP Glyco_transf_28
+8.3e-37 131.0 sp|Q88V81|MURG_LACPL Glyco_transf_28
+8.9e-37 130.9 sp|Q8Z9G9|MURG_SALTI Glyco_transf_28
+8.9e-37 130.9 sp|B4F111|MURG_PROMH Glyco_transf_28
+9.9e-37 130.7 sp|A0L1P2|MURG_SHESA Glyco_transf_28
+9.9e-37 130.7 sp|Q0HZR6|MURG_SHESR Glyco_transf_28
+1.3e-36 130.4 sp|B5BLC2|MURG_SALPK Glyco_transf_28
+1.3e-36 130.4 sp|Q5PDC8|MURG_SALPA Glyco_transf_28
+1.3e-36 130.4 sp|Q9K9T0|MURG_BACHD Glyco_transf_28
+1.4e-36 130.3 sp|Q8Y5M2|MURG_LISMO Glyco_transf_28
+1.7e-36 130.0 sp|A9MZL9|MURG_SALPB Glyco_transf_28
+1.7e-36 130.0 sp|B4TJ87|MURG_SALHS Glyco_transf_28
+1.7e-36 130.0 sp|B4TXH8|MURG_SALSV Glyco_transf_28
+1.7e-36 130.0 sp|B5F7W4|MURG_SALA4 Glyco_transf_28
+1.7e-36 130.0 sp|Q8ZRU3|MURG_SALTY Glyco_transf_28
+1.7e-36 130.0 sp|B4SU50|MURG_SALNS Glyco_transf_28
+1.7e-36 130.0 sp|A1REZ6|MURG_SHESW Glyco_transf_28
+1.7e-36 130.0 sp|A4Y2N6|MURG_SHEPC Glyco_transf_28
+1.7e-36 130.0 sp|A6T4N3|MURG_KLEP7 Glyco_transf_28
+1.7e-36 129.9 sp|B5RH64|MURG_SALG2 Glyco_transf_28
+1.8e-36 129.9 sp|A8ALK6|MURG_CITK8 Glyco_transf_28
+1.8e-36 129.9 sp|Q57TD0|MURG_SALCH Glyco_transf_28
+1.8e-36 129.9 sp|A6WID1|MURG_SHEB8 Glyco_transf_28
+1.8e-36 129.9 sp|A9KY29|MURG_SHEB9 Glyco_transf_28
+1.8e-36 129.9 sp|B8E698|MURG_SHEB2 Glyco_transf_28
+2e-36 129.8 sp|B5Y1U7|MURG_KLEP3 Glyco_transf_28
+2.2e-36 129.6 sp|A3CZM1|MURG_SHEB5 Glyco_transf_28
+2.4e-36 129.5 sp|Q7U336|MURG_HAEDU Glyco_transf_28
+2.4e-36 129.5 sp|B7VJ03|MURG_VIBSL Glyco_transf_28
+2.5e-36 129.5 sp|Q0I1D3|MURG_HAES1 Glyco_transf_28
+2.5e-36 129.4 sp|B5FI72|MURG_SALDC Glyco_transf_28
+2.6e-36 129.4 sp|A2RJQ4|MURG_LACLM Glyco_transf_28
+2.6e-36 129.4 sp|Q02XY0|MURG_LACLS Glyco_transf_28
+2.7e-36 129.3 sp|B7MNU9|MURG_ECO81 Glyco_transf_28
+2.7e-36 129.3 sp|B7NHJ6|MURG_ECO7I Glyco_transf_28
+2.7e-36 129.3 sp|B7UIE0|MURG_ECO27 Glyco_transf_28
+2.7e-36 129.3 sp|Q0TLP9|MURG_ECOL5 Glyco_transf_28
+2.7e-36 129.3 sp|Q8FL64|MURG_ECOL6 Glyco_transf_28
+2.9e-36 129.2 sp|A1A7D5|MURG_ECOK1 Glyco_transf_28
+2.9e-36 129.2 sp|B7MAL3|MURG_ECO45 Glyco_transf_28
+2.9e-36 129.2 sp|Q1RGA5|MURG_ECOUT Glyco_transf_28
+3.1e-36 129.1 sp|Q6D0I3|MURG_ERWCT Glyco_transf_28
+3.1e-36 129.1 sp|B5YZC6|MURG_ECO5E Glyco_transf_28
+3.1e-36 129.1 sp|Q8X9Y8|MURG_ECO57 Glyco_transf_28
+3.1e-36 129.1 sp|A7ZHI1|MURG_ECO24 Glyco_transf_28
+3.1e-36 129.1 sp|B1LG27|MURG_ECOSM Glyco_transf_28
+3.1e-36 129.1 sp|B6HZ67|MURG_ECOSE Glyco_transf_28
+3.1e-36 129.1 sp|B7M133|MURG_ECO8A Glyco_transf_28
+3.1e-36 129.1 sp|B7N7W3|MURG_ECOLU Glyco_transf_28
+3.1e-36 129.1 sp|Q326E5|MURG_SHIBS Glyco_transf_28
+3.1e-36 129.1 sp|Q3Z5R9|MURG_SHISS Glyco_transf_28
+3.2e-36 129.1 sp|Q32K02|MURG_SHIDS Glyco_transf_28
+3.2e-36 129.1 sp|B2U295|MURG_SHIB3 Glyco_transf_28
+3.2e-36 129.1 sp|B1IR88|MURG_ECOLC Glyco_transf_28
+3.2e-36 129.1 sp|B1XC67|MURG_ECODH Glyco_transf_28
+3.2e-36 129.1 sp|C4ZRI5|MURG_ECOBW Glyco_transf_28
+3.2e-36 129.1 sp|P17443|MURG_ECOLI Glyco_transf_28
+3.2e-36 129.1 sp|A7ZW42|MURG_ECOHS Glyco_transf_28
+3.2e-36 129.1 sp|A4TQ83|MURG_YERPP Glyco_transf_28
+3.5e-36 129.0 sp|Q9CF92|MURG_LACLA Glyco_transf_28
+3.7e-36 128.9 sp|B5R2M4|MURG_SALEP Glyco_transf_28
+3.8e-36 128.8 sp|Q0T8A7|MURG_SHIF8 Glyco_transf_28
+3.8e-36 128.8 sp|Q83MN4|MURG_SHIFL Glyco_transf_28
+4.1e-36 128.7 sp|Q8CX35|MURG_SHEON Glyco_transf_28
+4.3e-36 128.7 sp|B8DBP8|MURG_LISMH Glyco_transf_28
+4.6e-36 128.6 sp|A0AKD5|MURG_LISW6 Glyco_transf_28
+5.2e-36 128.4 sp|Q9ZBA5|MURG_STRCO Glyco_transf_28
+5.5e-36 128.3 sp|Q929Y2|MURG_LISIN Glyco_transf_28
+5.8e-36 128.3 sp|B8F3B6|MURG_HAEPS Glyco_transf_28
+5.9e-36 128.2 sp|Q0HE83|MURG_SHESM Glyco_transf_28
+6e-36 128.2 sp|C1KWY8|MURG_LISMC Glyco_transf_28
+6e-36 128.2 sp|Q71XX8|MURG_LISMF Glyco_transf_28
+6.4e-36 128.1 sp|A1S2F9|MURG_SHEAM Glyco_transf_28
+9.6e-36 127.5 sp|A5UCW8|MURG_HAEIE Glyco_transf_28
+9.8e-36 127.5 sp|Q03QH5|MURG_LACBA Glyco_transf_28
+1e-35 127.4 sp|Q8DEL0|MURG_VIBVU Glyco_transf_28
+1e-35 127.4 sp|Q7MNV1|MURG_VIBVY Glyco_transf_28
+1.3e-35 127.2 sp|Q3IFY0|MURG_PSEHT Glyco_transf_28
+1.3e-35 127.1 sp|B7LFW0|MURG_ECO55 Glyco_transf_28
+1.4e-35 127.0 sp|B1KKX7|MURG_SHEWM Glyco_transf_28
+2.3e-35 126.3 sp|Q49929|Y2348_MYCLE Glyco_transf_28
+2.3e-35 126.3 sp|Q7N147|MURG_PHOLL Glyco_transf_28
+2.3e-35 126.3 sp|A8H984|MURG_SHEPA Glyco_transf_28
+2.6e-35 126.1 sp|Q820F6|MURG_STRAW Glyco_transf_28
+2.8e-35 126.1 sp|Q1WTA0|MURG_LACS1 Glyco_transf_28
+3e-35 125.9 sp|Q9X4H4|MURG_STRCU Glyco_transf_28
+4e-35 125.6 sp|Q12SC6|MURG_SHEDO Glyco_transf_28
+4e-35 125.5 sp|P57817|MURG_PASMU Glyco_transf_28
+4.3e-35 125.4 sp|Q87SG4|MURG_VIBPA Glyco_transf_28
+4.4e-35 125.4 sp|B0TQN7|MURG_SHEHH Glyco_transf_28
+4.7e-35 125.3 sp|C4L5U5|MURG_EXISA Glyco_transf_28
+5.3e-35 125.1 sp|A9M2H3|MURG_NEIM0 Glyco_transf_28
+7.1e-35 124.7 sp|Q6LMF6|MURG_PHOPR Glyco_transf_28
+8.4e-35 124.5 sp|Q5E2Q0|MURG_VIBF1 Glyco_transf_28
+8.7e-35 124.4 sp|P64865|Y1524_MYCTU Glyco_transf_28
+8.7e-35 124.4 sp|P64866|Y1551_MYCBO Glyco_transf_28
+9e-35 124.4 sp|B5FB35|MURG_VIBFM Glyco_transf_28
+9.6e-35 124.3 sp|B2GB78|MURG_LACF3 Glyco_transf_28
+1e-34 124.2 sp|B6ELH5|MURG_ALISL Glyco_transf_28
+1.1e-34 124.1 sp|B8CWJ6|MURG_HALOH Glyco_transf_28
+1.1e-34 124.1 sp|A7MXR6|MURG_VIBHB Glyco_transf_28
+1.2e-34 124.1 sp|A5VJ33|MURG_LACRD Glyco_transf_28
+1.2e-34 124.1 sp|B2G6K5|MURG_LACRJ Glyco_transf_28
+1.4e-34 123.8 sp|Q182Y6|MURG_CLOD6 Glyco_transf_28
+1.4e-34 123.8 sp|Q2NVV1|MURG_SODGM Glyco_transf_28
+1.4e-34 123.8 sp|Q07WI5|MURG_SHEFN Glyco_transf_28
+1.4e-34 123.8 sp|A1KVL3|MURG_NEIMF Glyco_transf_28
+1.5e-34 123.7 sp|Q9K0Y2|MURG_NEIMB Glyco_transf_28
+1.8e-34 123.4 sp|B8CNL1|MURG_SHEPW Glyco_transf_28
+2e-34 123.3 sp|C4LA25|MURG_TOLAT Glyco_transf_28
+2e-34 123.3 sp|Q9F1N0|MURG_SHEVI Glyco_transf_28
+2.6e-34 122.9 sp|A5F5M9|MURG_VIBC3 Glyco_transf_28
+2.7e-34 122.9 sp|Q03W35|MURG_LEUMM Glyco_transf_28
+2.8e-34 122.8 sp|A3Q1L8|MURG_MYCSJ Glyco_transf_28
+2.8e-34 122.8 sp|A1UI54|MURG_MYCSK Glyco_transf_28
+2.8e-34 122.8 sp|Q1B6X1|MURG_MYCSS Glyco_transf_28
+3.3e-34 122.6 sp|C3LQU6|MURG_VIBCM Glyco_transf_28
+3.3e-34 122.6 sp|Q9KPG7|MURG_VIBCH Glyco_transf_28
+4.3e-34 122.2 sp|A8FQA0|MURG_SHESH Glyco_transf_28
+6.8e-34 121.5 sp|B4RQC5|MURG_NEIG2 Glyco_transf_28
+6.8e-34 121.5 sp|Q5F6L8|MURG_NEIG1 Glyco_transf_28
+7.6e-34 121.4 sp|B1I4C4|MURG_DESAP Glyco_transf_28
+8e-34 121.3 sp|Q6A9Q2|MURG_PROAC Glyco_transf_28
+8.6e-34 121.2 sp|B3WDY2|MURG_LACCB Glyco_transf_28
+8.6e-34 121.2 sp|Q039R7|MURG_LACC3 Glyco_transf_28
+9e-34 121.2 sp|A4J2B1|MURG_DESRM Glyco_transf_28
+9.5e-34 121.1 sp|Q47VQ9|MURG_COLP3 Glyco_transf_28
+1.1e-33 120.9 sp|B2A2H2|MURG_NATTJ Glyco_transf_28
+1.7e-33 120.3 sp|Q6NGC8|MURG_CORDI Glyco_transf_28
+1.7e-33 120.2 sp|B4RWX9|MURG_ALTMD Glyco_transf_28
+1.8e-33 120.2 sp|Q9JSZ7|MURG_NEIMA Glyco_transf_28
+1.9e-33 120.1 sp|B0KFS6|MURG_PSEPG Glyco_transf_28
+2.5e-33 119.7 sp|A4XQS4|MURG_PSEMY Glyco_transf_28
+2.5e-33 119.7 sp|Q48EF8|MURG_PSE14 Glyco_transf_28
+2.6e-33 119.7 sp|Q8R9G6|MURG_THETN Glyco_transf_28
+2.8e-33 119.6 sp|A5W8Q0|MURG_PSEP1 Glyco_transf_28
+2.8e-33 119.5 sp|Q1I5B8|MURG_PSEE4 Glyco_transf_28
+2.9e-33 119.5 sp|Q87WY5|MURG_PSESM Glyco_transf_28
+3.4e-33 119.3 sp|C3L230|MURG_CLOB6 Glyco_transf_28
+3.5e-33 119.3 sp|A1WC06|MURG_ACISJ Glyco_transf_28
+3.5e-33 119.3 sp|B9MFR2|MURG_DIAST Glyco_transf_28
+3.6e-33 119.2 sp|B8ZQQ0|MURG_MYCLB Glyco_transf_28
+3.6e-33 119.2 sp|O69552|MURG_MYCLE Glyco_transf_28
+3.7e-33 119.2 sp|Q893R7|MURG_CLOTE Glyco_transf_28
+3.8e-33 119.1 sp|A7GGX9|MURG_CLOBL Glyco_transf_28
+3.8e-33 119.1 sp|B1IKH3|MURG_CLOBK Glyco_transf_28
+3.8e-33 119.1 sp|C1FUF9|MURG_CLOBJ Glyco_transf_28
+3.8e-33 119.1 sp|A5I5J5|MURG_CLOBH Glyco_transf_28
+3.8e-33 119.1 sp|A7FX11|MURG_CLOB1 Glyco_transf_28
+3.8e-33 119.1 sp|Q4ZNZ0|MURG_PSEU2 Glyco_transf_28
+4.3e-33 119.0 sp|A4XI04|MURG_CALS8 Glyco_transf_28
+4.6e-33 118.9 sp|A0R016|MURG_MYCS2 Glyco_transf_28
+5.1e-33 118.7 sp|A8YUN9|MURG_LACH4 Glyco_transf_28
+5.6e-33 118.6 sp|A1SL80|MURG_NOCSJ Glyco_transf_28
+5.8e-33 118.5 sp|Q88N76|MURG_PSEPK Glyco_transf_28
+8.3e-33 118.0 sp|B1KYH7|MURG_CLOBM Glyco_transf_28
+8.7e-33 118.0 sp|Q24TE6|MURG_DESHY Glyco_transf_28
+9e-33 117.9 sp|Q3K744|MURG_PSEPF Glyco_transf_28
+9.4e-33 117.9 sp|B1J3L2|MURG_PSEPW Glyco_transf_28
+1e-32 117.8 sp|B0K3H0|MURG_THEPX Glyco_transf_28
+1e-32 117.8 sp|B0K8K7|MURG_THEP3 Glyco_transf_28
+1e-32 117.7 sp|A3DE27|MURG_CLOTH Glyco_transf_28
+1.4e-32 117.3 sp|A1TAW8|MURG_MYCVP Glyco_transf_28
+1.6e-32 117.1 sp|B8FT56|MURG_DESHD Glyco_transf_28
+2.3e-32 116.6 sp|Q9RWP0|MURG_DEIRA Glyco_transf_28
+2.5e-32 116.5 sp|B2I1J5|MURG_ACIBC Glyco_transf_28
+2.5e-32 116.5 sp|B0V9F5|MURG_ACIBY Glyco_transf_28
+2.5e-32 116.5 sp|B7GV73|MURG_ACIB3 Glyco_transf_28
+2.5e-32 116.5 sp|B7ICE5|MURG_ACIB5 Glyco_transf_28
+2.5e-32 116.5 sp|A5D145|MURG_PELTS Glyco_transf_28
+2.9e-32 116.3 sp|A3M9Y1|MURG_ACIBT Glyco_transf_28
+2.9e-32 116.3 sp|A9KK83|MURG_CLOPH Glyco_transf_28
+3.6e-32 116.0 sp|C3KCT0|MURG_PSEFS Glyco_transf_28
+4.5e-32 115.7 sp|Q03EY2|MURG_PEDPA Glyco_transf_28
+4.8e-32 115.6 sp|A0QF52|MURG_MYCA1 Glyco_transf_28
+5.3e-32 115.4 sp|Q04B72|MURG_LACDB Glyco_transf_28
+5.3e-32 115.4 sp|Q1GAT5|MURG_LACDA Glyco_transf_28
+6.7e-32 115.1 sp|Q4K6J3|MURG_PSEF5 Glyco_transf_28
+7.5e-32 114.9 sp|B0VNZ9|MURG_ACIBS Glyco_transf_28
+8.8e-32 114.7 sp|Q5FKV2|MURG_LACAC Glyco_transf_28
+1.1e-31 114.5 sp|A0KPX2|MURG_AERHH Glyco_transf_28
+1.2e-31 114.3 sp|A1WYU3|MURG_HALHL Glyco_transf_28
+1.2e-31 114.3 sp|Q73YQ8|MURG_MYCPA Glyco_transf_28
+1.2e-31 114.3 sp|B1MXW0|MURG_LEUCK Glyco_transf_28
+1.3e-31 114.2 sp|Q604V7|MURG_METCA Glyco_transf_28
+1.3e-31 114.2 sp|B2V1X5|MURG_CLOBA Glyco_transf_28
+1.7e-31 113.8 sp|A1U3F8|MURG_MARAV Glyco_transf_28
+2.1e-31 113.5 sp|A8MH36|MURG_ALKOO Glyco_transf_28
+2.1e-31 113.5 sp|B2TLE0|MURG_CLOBB Glyco_transf_28
+2.6e-31 113.2 sp|A4SI56|MURG_AERS4 Glyco_transf_28
+3e-31 113.0 sp|C4Z1B5|MURG_EUBE2 Glyco_transf_28
+3.1e-31 113.0 sp|C1DQ99|MURG_AZOVD Glyco_transf_28
+3.1e-31 112.9 sp|Q6F703|MURG_ACIAD Glyco_transf_28
+3.2e-31 112.9 sp|B1YIT7|MURG_EXIS2 Glyco_transf_28
+5e-31 112.3 sp|C1CW40|MURG_DEIDV Glyco_transf_28
+5.1e-31 112.2 sp|Q47QW9|MURG_THEFY Glyco_transf_28
+5.3e-31 112.2 sp|A0Q182|MURG_CLONN Glyco_transf_28
+5.3e-31 112.2 sp|A1KKJ6|MURG_MYCBP Glyco_transf_28
+5.3e-31 112.2 sp|C1AQ69|MURG_MYCBT Glyco_transf_28
+5.3e-31 112.2 sp|Q7VEP8|MURG_MYCBO Glyco_transf_28
+6.3e-31 111.9 sp|B0S0Z5|MURG_FINM2 Glyco_transf_28
+7.7e-31 111.7 sp|B7UZJ0|MURG_PSEA8 Glyco_transf_28
+7.7e-31 111.7 sp|Q02H28|MURG_PSEAB Glyco_transf_28
+7.7e-31 111.7 sp|Q9HW01|MURG_PSEAE Glyco_transf_28
+7.8e-31 111.6 sp|A0PTI7|MURG_MYCUA Glyco_transf_28
+8.2e-31 111.6 sp|A6VB85|MURG_PSEA7 Glyco_transf_28
+8.5e-31 111.5 sp|A9KER3|MURG_COXBN Glyco_transf_28
+8.6e-31 111.5 sp|A9NA44|MURG_COXBR Glyco_transf_28
+8.6e-31 111.5 sp|B6J2Q3|MURG_COXB2 Glyco_transf_28
+8.6e-31 111.5 sp|B6J5K3|MURG_COXB1 Glyco_transf_28
+8.6e-31 111.5 sp|Q820X3|MURG_COXBU Glyco_transf_28
+9.1e-31 111.4 sp|Q042P9|MURG_LACGA Glyco_transf_28
+9.6e-31 111.4 sp|B2HGR6|MURG_MYCMM Glyco_transf_28
+1e-30 111.2 sp|Q0VS02|MURG_ALCBS Glyco_transf_28
+1.1e-30 111.2 sp|Q0RNP1|MURG_FRAAA Glyco_transf_28
+1.2e-30 111.0 sp|Q2RK79|MURG_MOOTA Glyco_transf_28
+1.3e-30 111.0 sp|Q1IXV9|MURG_DEIGD Glyco_transf_28
+1.3e-30 111.0 sp|Q74JY4|MURG_LACJO Glyco_transf_28
+1.5e-30 110.7 sp|A5MZ55|MURG_CLOK5 Glyco_transf_28
+1.8e-30 110.5 sp|A1TKD1|MURG_ACIAC Glyco_transf_28
+1.9e-30 110.4 sp|B7J0L2|MURG_BORBZ Glyco_transf_28
+1.9e-30 110.4 sp|O51708|MURG_BORBU Glyco_transf_28
+2e-30 110.3 sp|Q15Q17|MURG_PSEA6 Glyco_transf_28
+2.1e-30 110.3 sp|A7A179|ATG26_YEAS7 Glyco_transf_28
+2.3e-30 110.1 sp|Q1D0T0|MURG_MYXXD Glyco_transf_28
+2.5e-30 110.0 sp|Q1QVG7|MURG_CHRSD Glyco_transf_28
+2.6e-30 110.0 sp|A4VIH8|MURG_PSEU5 Glyco_transf_28
+2.7e-30 109.9 sp|Q38XM8|MURG_LACSS Glyco_transf_28
+3.3e-30 109.6 sp|A1SU19|MURG_PSYIN Glyco_transf_28
+3.4e-30 109.6 sp|Q31I59|MURG_THICR Glyco_transf_28
+3.4e-30 109.6 sp|Q04ET0|MURG_OENOB Glyco_transf_28
+3.4e-30 109.6 sp|Q2KVG0|MURG_BORA1 Glyco_transf_28
+3.6e-30 109.5 sp|Q5R0M1|MURG_IDILO Glyco_transf_28
+3.7e-30 109.5 sp|Q5WAE4|MURG_BACSK Glyco_transf_28
+3.7e-30 109.5 sp|Q2JD50|MURG_FRASC Glyco_transf_28
+3.8e-30 109.4 sp|B5ELC3|MURG_ACIF5 Glyco_transf_28
+3.8e-30 109.4 sp|B7J3V2|MURG_ACIF2 Glyco_transf_28
+3.9e-30 109.4 sp|Q0SM88|MURG_BORAP Glyco_transf_28
+4.2e-30 109.3 sp|Q4FQV9|MURG_PSYA2 Glyco_transf_28
+4.5e-30 109.2 sp|Q730T5|MURG2_BACC1 Glyco_transf_28
+4.8e-30 109.1 sp|Q1LSW5|MURG_BAUCH Glyco_transf_28
+5.4e-30 108.9 sp|Q9WY74|MURG_THEMA Glyco_transf_28
+5.5e-30 108.9 sp|B1L9S1|MURG_THESQ Glyco_transf_28
+5.5e-30 108.9 sp|A5IKI9|MURG_THEP1 Glyco_transf_28
+5.9e-30 108.8 sp|A4FLW0|MURG_SACEN Glyco_transf_28
+6.6e-30 108.6 sp|Q9RNM6|MURG_ZYMMO Glyco_transf_28
+7.1e-30 108.5 sp|Q06321|ATG26_YEAST Glyco_transf_28
+7.2e-30 108.5 sp|Q9PF81|MURG_XYLFA Glyco_transf_28
+7.9e-30 108.4 sp|Q5GW41|MURG_XANOR Glyco_transf_28
+8.9e-30 108.2 sp|B2S3B6|MURG_TREPS Glyco_transf_28
+8.9e-30 108.2 sp|O83535|MURG_TREPA Glyco_transf_28
+9.2e-30 108.2 sp|Q0AJE1|MURG_NITEC Glyco_transf_28
+1e-29 108.1 sp|B3PCM0|MURG_CELJU Glyco_transf_28
+1.2e-29 107.8 sp|A5G8K0|MURG_GEOUR Glyco_transf_28
+1.2e-29 107.8 sp|A5U4I0|MURG_MYCTA Glyco_transf_28
+1.2e-29 107.8 sp|O06224|MURG_MYCTU Glyco_transf_28
+1.3e-29 107.7 sp|Q4JW95|MURG_CORJK Glyco_transf_28
+1.4e-29 107.6 sp|Q97GY4|MURG_CLOAB Glyco_transf_28
+1.5e-29 107.4 sp|Q9Z702|MURG_CHLPN Glyco_transf_28
+1.6e-29 107.4 sp|Q1Q944|MURG_PSYCK Glyco_transf_28
+1.7e-29 107.3 sp|C0RE70|MURG_BRUMB Glyco_transf_28
+1.7e-29 107.3 sp|Q8YI66|MURG_BRUME Glyco_transf_28
+1.7e-29 107.3 sp|Q3BXF2|MURG_XANC5 Glyco_transf_28
+1.9e-29 107.2 sp|B2S6Q4|MURG_BRUA1 Glyco_transf_28
+1.9e-29 107.2 sp|Q2YLY5|MURG_BRUA2 Glyco_transf_28
+1.9e-29 107.2 sp|Q57C78|MURG_BRUAB Glyco_transf_28
+1.9e-29 107.1 sp|Q660A8|MURG_BORGA Glyco_transf_28
+1.9e-29 107.1 sp|B8I6H3|MURG_CLOCE Glyco_transf_28
+1.9e-29 107.1 sp|A5VRH7|MURG_BRUO2 Glyco_transf_28
+1.9e-29 107.1 sp|B0CHM0|MURG_BRUSI Glyco_transf_28
+2e-29 107.1 sp|A0JV94|MURG_ARTS2 Glyco_transf_28
+2e-29 107.1 sp|A6TS61|MURG_ALKMQ Glyco_transf_28
+2e-29 107.1 sp|C5D4C2|MURG_GEOSW Glyco_transf_28
+2e-29 107.1 sp|A9M690|MURG_BRUC2 Glyco_transf_28
+2e-29 107.0 sp|Q8PPA8|MURG_XANAC Glyco_transf_28
+2e-29 107.0 sp|Q8CY39|MURG_BRUSU Glyco_transf_28
+2.2e-29 106.9 sp|A1WRL1|MURG_VEREI Glyco_transf_28
+2.7e-29 106.7 sp|Q812T8|MURG2_BACCR Glyco_transf_28
+2.9e-29 106.6 sp|B0U4Z7|MURG_XYLFM Glyco_transf_28
+3.1e-29 106.5 sp|A4IJS4|MURG_GEOTN Glyco_transf_28
+3.2e-29 106.4 sp|Q2NZB8|MURG_XANOM Glyco_transf_28
+4.6e-29 105.9 sp|A5FIY3|MURG_FLAJ1 Glyco_transf_28
+6e-29 105.5 sp|Q39JX0|MURG_BURS3 Glyco_transf_28
+6.9e-29 105.3 sp|C1A0X5|MURG_RHOE4 Glyco_transf_28
+7.3e-29 105.3 sp|Q748D6|MURG_GEOSL Glyco_transf_28
+8.2e-29 105.1 sp|Q820Y4|MURG_TROWT Glyco_transf_28
+8.2e-29 105.1 sp|Q83HK1|MURG_TROW8 Glyco_transf_28
+8.3e-29 105.1 sp|A4QFM3|MURG_CORGB Glyco_transf_28
+8.5e-29 105.0 sp|Q39YL9|MURG_GEOMG Glyco_transf_28
+8.5e-29 105.0 sp|A1R0I9|MURG_BORT9 Glyco_transf_28
+8.7e-29 105.0 sp|Q3AAE6|MURG_CARHZ Glyco_transf_28
+9.1e-29 104.9 sp|Q8NNN5|MURG_CORGL Glyco_transf_28
+9.1e-29 104.9 sp|Q0TNP7|MURG_CLOP1 Glyco_transf_28
+9.1e-29 104.9 sp|Q8XIQ1|MURG_CLOPE Glyco_transf_28
+9.4e-29 104.9 sp|Q0SRB4|MURG_CLOPS Glyco_transf_28
+1e-28 104.8 sp|Q5YYX9|MURG_NOCFA Glyco_transf_28
+1.1e-28 104.7 sp|A7HH67|MURG_ANADF Glyco_transf_28
+1.1e-28 104.6 sp|Q82VS3|MURG_NITEU Glyco_transf_28
+1.2e-28 104.6 sp|B0RVA5|MURG_XANCB Glyco_transf_28
+1.2e-28 104.6 sp|Q2SZI3|MURG_BURTA Glyco_transf_28
+1.2e-28 104.5 sp|Q11GS5|MURG_MESSB Glyco_transf_28
+1.3e-28 104.5 sp|Q4UQX0|MURG_XANC8 Glyco_transf_28
+1.3e-28 104.5 sp|Q8PCK0|MURG_XANCP Glyco_transf_28
+1.3e-28 104.4 sp|A3NZL5|MURG_BURP0 Glyco_transf_28
+1.5e-28 104.3 sp|Q98KB3|MURG_RHILO Glyco_transf_28
+1.5e-28 104.2 sp|Q0A6K2|MURG_ALHEH Glyco_transf_28
+1.5e-28 104.2 sp|A5IGA6|MURG_LEGPC Glyco_transf_28
+1.6e-28 104.2 sp|Q5L3H6|MURG_GEOKA Glyco_transf_28
+1.7e-28 104.1 sp|A0LTM3|MURG_ACIC1 Glyco_transf_28
+2.1e-28 103.7 sp|Q3A2G6|MURG_PELCD Glyco_transf_28
+2.2e-28 103.7 sp|Q0AYQ8|MURG_SYNWW Glyco_transf_28
+2.5e-28 103.5 sp|Q1LIM6|MURG_RALME Glyco_transf_28
+2.6e-28 103.5 sp|Q92NL9|MURG_RHIME Glyco_transf_28
+2.8e-28 103.4 sp|Q72JP9|MURG_THET2 Glyco_transf_28
+2.8e-28 103.4 sp|A1R5F8|MURG_ARTAT Glyco_transf_28
+2.9e-28 103.3 sp|Q87AF9|MURG_XYLFT Glyco_transf_28
+3e-28 103.3 sp|B2I9B3|MURG_XYLF2 Glyco_transf_28
+3.3e-28 103.1 sp|A6WZQ6|MURG_OCHA4 Glyco_transf_28
+3.3e-28 103.1 sp|A1V0R8|MURG_BURMS Glyco_transf_28
+3.3e-28 103.1 sp|A2S5U5|MURG_BURM9 Glyco_transf_28
+3.3e-28 103.1 sp|A3MR63|MURG_BURM7 Glyco_transf_28
+3.3e-28 103.1 sp|Q62GS7|MURG_BURMA Glyco_transf_28
+3.3e-28 103.1 sp|Q63QJ7|MURG_BURPS Glyco_transf_28
+3.3e-28 103.1 sp|A3NDW4|MURG_BURP6 Glyco_transf_28
+3.9e-28 102.9 sp|Q3J789|MURG_NITOC Glyco_transf_28
+3.9e-28 102.9 sp|Q8K9T4|MURG_BUCAP Glyco_transf_28
+4e-28 102.9 sp|B9M172|MURG_GEOSF Glyco_transf_28
+4e-28 102.9 sp|B5EBQ1|MURG_GEOBB Glyco_transf_28
+4.2e-28 102.8 sp|Q3JND8|MURG_BURP1 Glyco_transf_28
+4.2e-28 102.8 sp|Q1IKH0|MURG_ACIBL Glyco_transf_28
+4.2e-28 102.8 sp|P74657|MURG_SYNY3 Glyco_transf_28
+4.4e-28 102.7 sp|B1YSS4|MURG_BURA4 Glyco_transf_28
+4.4e-28 102.7 sp|Q0BIK1|MURG_BURCM Glyco_transf_28
+5.7e-28 102.4 sp|Q6HDR3|MURG2_BACHK Glyco_transf_28
+5.7e-28 102.4 sp|Q81JE6|MURG2_BACAN Glyco_transf_28
+6.2e-28 102.2 sp|Q0K6M4|MURG_RALEH Glyco_transf_28
+6.4e-28 102.2 sp|Q5WY98|MURG_LEGPL Glyco_transf_28
+6.5e-28 102.2 sp|A0RIN0|MURG3_BACAH Glyco_transf_28
+6.7e-28 102.1 sp|Q7W4B4|MURG_BORPA Glyco_transf_28
+6.7e-28 102.1 sp|Q5X6U5|MURG_LEGPA Glyco_transf_28
+6.7e-28 102.1 sp|Q5ZXC4|MURG_LEGPH Glyco_transf_28
+6.9e-28 102.1 sp|A6M1F0|MURG_CLOB8 Glyco_transf_28
+7.7e-28 101.9 sp|B8D7B9|MURG_BUCAT Glyco_transf_28
+7.7e-28 101.9 sp|P57311|MURG_BUCAI Glyco_transf_28
+8.3e-28 101.8 sp|Q7VUQ3|MURG_BORPE Glyco_transf_28
+8.4e-28 101.8 sp|Q7WFS2|MURG_BORBR Glyco_transf_28
+8.7e-28 101.8 sp|B2SYX6|MURG_BURPP Glyco_transf_28
+9.7e-28 101.6 sp|B0B8Y7|MURG_CHLT2 Glyco_transf_28
+9.7e-28 101.6 sp|B0BAL6|MURG_CHLTB Glyco_transf_28
+1e-27 101.5 sp|B8D914|MURG_BUCA5 Glyco_transf_28
+1.1e-27 101.5 sp|Q47AA4|MURG_DECAR Glyco_transf_28
+1.2e-27 101.4 sp|A4JB94|MURG_BURVG Glyco_transf_28
+1.3e-27 101.2 sp|Q2Y638|MURG_NITMU Glyco_transf_28
+1.5e-27 101.0 sp|B2JHG0|MURG_BURP8 Glyco_transf_28
+1.5e-27 101.0 sp|O84766|MURG_CHLTR Glyco_transf_28
+1.5e-27 101.0 sp|Q3KKT1|MURG_CHLTA Glyco_transf_28
+1.8e-27 100.8 sp|A1AU61|MURG_PELPD Glyco_transf_28
+1.8e-27 100.8 sp|Q2LR48|MURG_SYNAS Glyco_transf_28
+1.8e-27 100.7 sp|Q2G995|MURG_NOVAD Glyco_transf_28
+1.9e-27 100.7 sp|A5EY03|MURG_DICNV Glyco_transf_28
+2e-27 100.6 sp|Q8FNU0|MURG_COREF Glyco_transf_28
+2e-27 100.6 sp|A9AI96|MURG_BURM1 Glyco_transf_28
+2.3e-27 100.4 sp|Q21SW9|MURG_RHOFD Glyco_transf_28
+2.6e-27 100.2 sp|B5YFT4|MURG_THEYD Glyco_transf_28
+2.7e-27 100.2 sp|A7KAK6|ATG26_PICAN Glyco_transf_28
+3.1e-27 100.0 sp|Q46WZ4|MURG_RALEJ Glyco_transf_28
+3.1e-27 100.0 sp|Q13TZ2|MURG_BURXL Glyco_transf_28
+3.3e-27 99.9 sp|C6DZK6|MURG_GEOSM Glyco_transf_28
+4.4e-27 99.5 sp|A8GVJ7|MURG_RICB8 Glyco_transf_28
+4.4e-27 99.5 sp|Q1RI55|MURG_RICBR Glyco_transf_28
+5.2e-27 99.2 sp|B5ZWJ4|MURG_RHILW Glyco_transf_28
+5.4e-27 99.2 sp|B0JFZ1|MURG_MICAN Glyco_transf_28
+5.8e-27 99.1 sp|Q31KS7|MURG_SYNE7 Glyco_transf_28
+6e-27 99.1 sp|Q5N140|MURG_SYNP6 Glyco_transf_28
+6.4e-27 99.0 sp|Q14I26|MURG_FRAT1 Glyco_transf_28
+6.4e-27 99.0 sp|Q5NGM4|MURG_FRATT Glyco_transf_28
+6.5e-27 98.9 sp|Q493Q1|MURG_BLOPB Glyco_transf_28
+6.5e-27 98.9 sp|Q92I58|MURG_RICCN Glyco_transf_28
+6.5e-27 98.9 sp|C3PND5|MURG_RICAE Glyco_transf_28
+6.5e-27 98.9 sp|C4K2A6|MURG_RICPU Glyco_transf_28
+6.6e-27 98.9 sp|B2S1A8|MURG_BORHD Glyco_transf_28
+6.6e-27 98.9 sp|A8GRZ6|MURG_RICRS Glyco_transf_28
+6.6e-27 98.9 sp|B0BXF6|MURG_RICRO Glyco_transf_28
+6.7e-27 98.9 sp|Q3SMH3|MURG_THIDA Glyco_transf_28
+6.7e-27 98.9 sp|Q21MG9|MURG_SACD2 Glyco_transf_28
+8.7e-27 98.5 sp|B1IAM4|MURG_STRPI Glyco_transf_28
+8.7e-27 98.5 sp|Q04LK0|MURG_STRP2 Glyco_transf_28
+8.7e-27 98.5 sp|Q8DQM1|MURG_STRR6 Glyco_transf_28
+8.7e-27 98.5 sp|B2IN77|MURG_STRPS Glyco_transf_28
+8.8e-27 98.5 sp|C1CQG5|MURG_STRZT Glyco_transf_28
+8.9e-27 98.5 sp|C1CD52|MURG_STRZJ Glyco_transf_28
+9e-27 98.5 sp|Q634T3|MURG2_BACCZ Glyco_transf_28
+9e-27 98.5 sp|A1VST6|MURG_POLNA Glyco_transf_28
+9e-27 98.5 sp|A6UB85|MURG_SINMW Glyco_transf_28
+9.2e-27 98.5 sp|B9DNZ7|MURG_STACT Glyco_transf_28
+1e-26 98.3 sp|B4E6J2|MURG_BURCJ Glyco_transf_28
+1.1e-26 98.3 sp|B1JV78|MURG_BURCC Glyco_transf_28
+1.1e-26 98.2 sp|C1C649|MURG_STRP7 Glyco_transf_28
+1.1e-26 98.2 sp|Q2S9Z2|MURG_HAHCH Glyco_transf_28
+1.1e-26 98.2 sp|B5E2Z9|MURG_STRP4 Glyco_transf_28
+1.1e-26 98.2 sp|C1CJF3|MURG_STRZP Glyco_transf_28
+1.1e-26 98.1 sp|A9I4V2|MURG_BORPD Glyco_transf_28
+1.3e-26 98.0 sp|B0RIJ3|MURG_CLAMS Glyco_transf_28
+1.4e-26 97.9 sp|P0CB60|MURG_STRPN Glyco_transf_28
+1.4e-26 97.9 sp|B8ZMZ7|MURG_STRPJ Glyco_transf_28
+1.4e-26 97.8 sp|B3PTW0|MURG_RHIE6 Glyco_transf_28
+1.5e-26 97.8 sp|Q0SHS1|MURG_RHOSR Glyco_transf_28
+1.5e-26 97.7 sp|Q313Q3|MURG_DESDG Glyco_transf_28
+1.6e-26 97.7 sp|A8F1I4|MURG_RICM5 Glyco_transf_28
+1.6e-26 97.7 sp|A6H195|MURG_FLAPJ Glyco_transf_28
+1.7e-26 97.6 sp|A0K486|MURG_BURCH Glyco_transf_28
+1.7e-26 97.6 sp|Q1BZG3|MURG_BURCA Glyco_transf_28
+1.7e-26 97.6 sp|Q12EL5|MURG_POLSJ Glyco_transf_28
+1.8e-26 97.5 sp|Q8UDM8|MURG_AGRT5 Glyco_transf_28
+2e-26 97.3 sp|B7K5Z6|MURG_CYAP8 Glyco_transf_28
+2.1e-26 97.3 sp|Q2NCZ0|MURG_ERYLH Glyco_transf_28
+2.1e-26 97.3 sp|Q9Y751|ATG26_PICPG Glyco_transf_28
+2.1e-26 97.3 sp|Q5P6Z6|MURG_AZOSE Glyco_transf_28
+2.3e-26 97.1 sp|B6IRG2|MURG_RHOCS Glyco_transf_28
+2.4e-26 97.1 sp|A7TF84|ATG26_VANPO Glyco_transf_28
+2.4e-26 97.1 sp|Q2S528|MURG_SALRD Glyco_transf_28
+2.5e-26 97.0 sp|B2SGS8|MURG_FRATM Glyco_transf_28
+2.6e-26 97.0 sp|A4IX64|MURG_FRATW Glyco_transf_28
+2.7e-26 96.9 sp|Q67Q48|MURG_SYMTH Glyco_transf_28
+3.1e-26 96.7 sp|Q6C8M8|ATG26_YARLI Glyco_transf_28
+3.1e-26 96.7 sp|C1AU55|MURG_RHOOB Glyco_transf_28
+3.2e-26 96.7 sp|B3E3Y2|MURG_GEOLS Glyco_transf_28
+3.2e-26 96.7 sp|A0Q766|MURG_FRATN Glyco_transf_28
+3.2e-26 96.7 sp|B1WVP7|MURG_CYAA5 Glyco_transf_28
+3.8e-26 96.5 sp|B0TY93|MURG_FRAP2 Glyco_transf_28
+3.8e-26 96.4 sp|Q68WW7|MURG_RICTY Glyco_transf_28
+4.1e-26 96.4 sp|Q6GGZ0|MURG_STAAR Glyco_transf_28
+5e-26 96.1 sp|B9JH51|MURG_AGRRK Glyco_transf_28
+5.6e-26 95.9 sp|Q6BN88|ATG26_DEBHA Glyco_transf_28
+6.1e-26 95.8 sp|A7NDC0|MURG_FRATF Glyco_transf_28
+6.1e-26 95.8 sp|Q0BL37|MURG_FRATO Glyco_transf_28
+6.1e-26 95.8 sp|Q2A2I7|MURG_FRATH Glyco_transf_28
+6.5e-26 95.7 sp|A5CS51|MURG_CLAM3 Glyco_transf_28
+6.6e-26 95.7 sp|Q9ZDC0|MURG_RICPR Glyco_transf_28
+7.1e-26 95.6 sp|Q9ZK59|MURG_HELPJ Glyco_transf_28
+7.7e-26 95.5 sp|B7KGH1|MURG_CYAP7 Glyco_transf_28
+7.9e-26 95.4 sp|Q4L6C8|MURG_STAHJ Glyco_transf_28
+9.3e-26 95.2 sp|B4UES1|MURG_ANASK Glyco_transf_28
+9.8e-26 95.1 sp|B9JY54|MURG_AGRVS Glyco_transf_28
+1.3e-25 94.7 sp|Q1ME33|MURG_RHIL3 Glyco_transf_28
+1.4e-25 94.6 sp|A8EZ14|MURG_RICCK Glyco_transf_28
+1.6e-25 94.5 sp|Q5A950|ATG26_CANAL Glyco_transf_28
+1.6e-25 94.4 sp|Q2IG27|MURG_ANADE Glyco_transf_28
+2e-25 94.1 sp|B8J8E8|MURG_ANAD2 Glyco_transf_28
+2.1e-25 94.0 sp|C3MEM9|MURG_RHISN Glyco_transf_28
+2.1e-25 94.0 sp|Q1CSB1|MURG_HELPH Glyco_transf_28
+2.3e-25 93.9 sp|P59424|MURG_BUCBP Glyco_transf_28
+2.3e-25 93.9 sp|Q2K6C1|MURG_RHIEC Glyco_transf_28
+2.4e-25 93.9 sp|O25770|MURG_HELPY Glyco_transf_28
+2.4e-25 93.9 sp|A0M527|MURG_GRAFK Glyco_transf_28
+2.4e-25 93.9 sp|B2UUR4|MURG_HELPS Glyco_transf_28
+2.4e-25 93.8 sp|Q3K2P3|MURG_STRA1 Glyco_transf_28
+2.4e-25 93.8 sp|Q8CX15|MURG_STRA5 Glyco_transf_28
+2.4e-25 93.8 sp|Q8E6P0|MURG_STRA3 Glyco_transf_28
+2.4e-25 93.8 sp|Q7U346|MURG_BLOFL Glyco_transf_28
+2.7e-25 93.7 sp|Q5HPC0|MURG_STAEQ Glyco_transf_28
+2.7e-25 93.7 sp|Q8CMM3|MURG_STAES Glyco_transf_28
+2.9e-25 93.6 sp|Q01Q48|MURG_SOLUE Glyco_transf_28
+2.9e-25 93.6 sp|B5Z8F1|MURG_HELPG Glyco_transf_28
+3.1e-25 93.5 sp|Q5L524|MURG_CHLAB Glyco_transf_28
+3.2e-25 93.5 sp|Q255W4|MURG_CHLFF Glyco_transf_28
+3.2e-25 93.5 sp|Q820E0|MURG_CHLCV Glyco_transf_28
+3.3e-25 93.4 sp|Q8XVI7|MURG_RALSO Glyco_transf_28
+3.6e-25 93.3 sp|Q4ULT6|MURG_RICFE Glyco_transf_28
+3.9e-25 93.2 sp|Q49XM9|MURG_STAS1 Glyco_transf_28
+3.9e-25 93.2 sp|Q119X8|MURG_TRIEI Glyco_transf_28
+4e-25 93.2 sp|Q03L97|MURG_STRTD Glyco_transf_28
+4e-25 93.1 sp|A0L5N1|MURG_MAGSM Glyco_transf_28
+4.2e-25 93.1 sp|B8H091|MURG_CAUCN Glyco_transf_28
+4.2e-25 93.1 sp|Q9A5A1|MURG_CAUCR Glyco_transf_28
+4.4e-25 93.0 sp|A8GNC7|MURG_RICAH Glyco_transf_28
+4.7e-25 92.9 sp|B5XMA2|MURG_STRPZ Glyco_transf_28
+4.8e-25 92.9 sp|B6JMZ5|MURG_HELP2 Glyco_transf_28
+5e-25 92.8 sp|A7ERM5|ATG26_SCLS1 Glyco_transf_28
+5.1e-25 92.8 sp|Q7V466|MURG_PROMM Glyco_transf_28
+5.7e-25 92.7 sp|A2CDG1|MURG_PROM3 Glyco_transf_28
+5.8e-25 92.6 sp|Q5M0D4|MURG_STRT1 Glyco_transf_28
+5.8e-25 92.6 sp|Q5M4Y1|MURG_STRT2 Glyco_transf_28
+5.8e-25 92.6 sp|A6QGX0|MURG_STAAE Glyco_transf_28
+5.8e-25 92.6 sp|Q2FYL5|MURG_STAA8 Glyco_transf_28
+5.8e-25 92.6 sp|Q5HG02|MURG_STAAC Glyco_transf_28
+5.8e-25 92.6 sp|Q6G9E3|MURG_STAAS Glyco_transf_28
+5.8e-25 92.6 sp|Q8NWR4|MURG_STAAW Glyco_transf_28
+5.8e-25 92.6 sp|A5ISU9|MURG_STAA9 Glyco_transf_28
+5.8e-25 92.6 sp|A6U1N8|MURG_STAA2 Glyco_transf_28
+5.8e-25 92.6 sp|A7X2A2|MURG_STAA1 Glyco_transf_28
+5.8e-25 92.6 sp|P65481|MURG_STAAM Glyco_transf_28
+5.8e-25 92.6 sp|P65482|MURG_STAAN Glyco_transf_28
+6e-25 92.6 sp|Q2YY01|MURG_STAAB Glyco_transf_28
+6.2e-25 92.5 sp|Q7MAW5|MURG_PORGI Glyco_transf_28
+6.3e-25 92.5 sp|A2RDL0|MURG_STRPG Glyco_transf_28
+6.4e-25 92.5 sp|Q5XB05|MURG_STRP6 Glyco_transf_28
+7.5e-25 92.3 sp|Q1JAT5|MURG_STRPB Glyco_transf_28
+7.5e-25 92.3 sp|Q1JKY5|MURG_STRPC Glyco_transf_28
+9.4e-25 91.9 sp|B2RIF1|MURG_PORG3 Glyco_transf_28
+1e-24 91.8 sp|C0M6J2|MURG_STRE4 Glyco_transf_28
+1.3e-24 91.5 sp|A1UTC5|MURG_BARBK Glyco_transf_28
+1.3e-24 91.5 sp|C0MD54|MURG_STRS7 Glyco_transf_28
+1.4e-24 91.3 sp|B4U1U4|MURG_STREM Glyco_transf_28
+1.4e-24 91.3 sp|A5CWW1|MURG_VESOH Glyco_transf_28
+1.5e-24 91.3 sp|A1A2E9|MURG_BIFAA Glyco_transf_28
+1.5e-24 91.2 sp|P65483|MURG_STRP1 Glyco_transf_28
+1.5e-24 91.2 sp|P65484|MURG_STRP8 Glyco_transf_28
+1.5e-24 91.2 sp|Q48SK9|MURG_STRPM Glyco_transf_28
+1.6e-24 91.2 sp|Q1J5S6|MURG_STRPF Glyco_transf_28
+1.6e-24 91.2 sp|A8Z3Z7|MURG_STAAT Glyco_transf_28
+1.6e-24 91.2 sp|Q2FH20|MURG_STAA3 Glyco_transf_28
+1.6e-24 91.2 sp|Q1JG11|MURG_STRPD Glyco_transf_28
+1.8e-24 91.0 sp|Q17WB5|MURG_HELAH Glyco_transf_28
+1.9e-24 90.9 sp|C6BYG6|MURG_DESAD Glyco_transf_28
+2.3e-24 90.7 sp|Q6G2Q5|MURG_BARHE Glyco_transf_28
+2.3e-24 90.7 sp|A9IWA5|MURG_BART1 Glyco_transf_28
+2.8e-24 90.4 sp|Q8CUL4|MURG_OCEIH Glyco_transf_28
+2.8e-24 90.4 sp|A6LEU3|MURG_PARD8 Glyco_transf_28
+3.1e-24 90.2 sp|Q6AE64|MURG_LEIXX Glyco_transf_28
+3.3e-24 90.2 sp|A1K3U6|MURG_AZOSB Glyco_transf_28
+3.9e-24 89.9 sp|Q9PLG2|MURG_CHLMU Glyco_transf_28
+4.1e-24 89.9 sp|Q1GRX9|MURG_SPHAL Glyco_transf_28
+4.2e-24 89.8 sp|Q751Z4|ATG26_ASHGO Glyco_transf_28
+4.4e-24 89.8 sp|A4VTK4|MURG_STRSY Glyco_transf_28
+4.4e-24 89.8 sp|A4VZT9|MURG_STRS2 Glyco_transf_28
+4.6e-24 89.7 sp|B3QWT7|MURG_CHLT3 Glyco_transf_28
+4.6e-24 89.7 sp|Q6AJ53|MURG_DESPS Glyco_transf_28
+5e-24 89.6 sp|B9K6P7|MURG_THENN Glyco_transf_28
+5.9e-24 89.3 sp|Q8K6R7|MURG_STRP3 Glyco_transf_28
+6.9e-24 89.1 sp|Q54IL5|UGT52_DICDI Glyco_transf_28
+7.5e-24 89.0 sp|B3DQN1|MURG_BIFLD Glyco_transf_28
+7.5e-24 89.0 sp|Q8CY50|MURG_BIFLO Glyco_transf_28
+7.8e-24 89.0 sp|Q6MIG1|MURG_BDEBA Glyco_transf_28
+8.4e-24 88.9 sp|Q7U3U6|MURG_SYNPX Glyco_transf_28
+8.9e-24 88.8 sp|B7GQ78|MURG_BIFLI Glyco_transf_28
+9.3e-24 88.7 sp|Q0UY53|ATG26_PHANO Glyco_transf_28
+1.2e-23 88.4 sp|Q8DVE2|MURG_STRMU Glyco_transf_28
+1.2e-23 88.4 sp|Q6N411|MURG_RHOPA Glyco_transf_28
+1.2e-23 88.3 sp|Q6CUV2|ATG26_KLULA Glyco_transf_28
+1.3e-23 88.3 sp|Q1MPB9|MURG_LAWIP Glyco_transf_28
+1.3e-23 88.3 sp|Q8R5N5|MURG_FUSNN Glyco_transf_28
+1.4e-23 88.1 sp|Q3ANV3|MURG_CHLCH Glyco_transf_28
+1.4e-23 88.1 sp|A8AW15|MURG_STRGC Glyco_transf_28
+2.2e-23 87.5 sp|B8DP79|MURG_DESVM Glyco_transf_28
+2.4e-23 87.4 sp|Q728U8|MURG_DESVH Glyco_transf_28
+3e-23 87.1 sp|Q8NJS1|ATG26_LEPMC Glyco_transf_28
+3.4e-23 86.9 sp|Q5KK25|ATG26_CRYNE Glyco_transf_28
+3.5e-23 86.8 sp|Q8YZI3|MURG_ANASP Glyco_transf_28
+3.6e-23 86.8 sp|B9DUV6|MURG_STRU0 Glyco_transf_28
+3.8e-23 86.7 sp|Q3M935|MURG_ANAVT Glyco_transf_28
+3.8e-23 86.7 sp|Q7VDZ2|MURG_PROMA Glyco_transf_28
+3.9e-23 86.7 sp|Q0I6M0|MURG_SYNS3 Glyco_transf_28
+4.2e-23 86.6 sp|B2J8J9|MURG_NOSP7 Glyco_transf_28
+4.2e-23 86.6 sp|A5GPC2|MURG_SYNPW Glyco_transf_28
+4.5e-23 86.5 sp|B4RFS0|MURG_PHEZH Glyco_transf_28
+5.2e-23 86.3 sp|A1VBE8|MURG_DESVV Glyco_transf_28
+6.2e-23 86.1 sp|B7IHN7|MURG_THEAB Glyco_transf_28
+6.3e-23 86.0 sp|Q7S1I0|ATG26_NEUCR Glyco_transf_28
+6.7e-23 85.9 sp|Q3AVX2|MURG_SYNS9 Glyco_transf_28
+7.2e-23 85.8 sp|Q4WID6|ATG26_ASPFU Glyco_transf_28
+7.2e-23 85.8 sp|A1CYS1|ATG26_NEOFI Glyco_transf_28
+7.8e-23 85.7 sp|Q8DHY4|MURG_THEEB Glyco_transf_28
+8.1e-23 85.7 sp|Q11RH5|MURG_CYTH3 Glyco_transf_28
+8.2e-23 85.6 sp|A9BDG0|MURG_PROM4 Glyco_transf_28
+9e-23 85.5 sp|Q73L91|MURG_TREDE Glyco_transf_28
+9.7e-23 85.4 sp|C4XK69|MURG_DESMR Glyco_transf_28
+1e-22 85.3 sp|A1BAL5|MURG_PARDP Glyco_transf_28
+1.2e-22 85.1 sp|A3CLN6|MURG_STRSV Glyco_transf_28
+1.2e-22 85.1 sp|A4SV74|MURG_POLSQ Glyco_transf_28
+1.4e-22 84.9 sp|O67238|MURG_AQUAE Glyco_transf_28
+1.6e-22 84.7 sp|Q2U0C3|ATG26_ASPOR Glyco_transf_28
+1.6e-22 84.7 sp|Q3STS8|MURG_NITWN Glyco_transf_28
+1.6e-22 84.7 sp|A1BJX8|MURG_CHLPD Glyco_transf_28
+1.7e-22 84.6 sp|A1AWE8|MURG_RUTMC Glyco_transf_28
+1.7e-22 84.6 sp|A1CFB3|ATG26_ASPCL Glyco_transf_28
+2.1e-22 84.4 sp|B8IN64|MURG_METNO Glyco_transf_28
+2.2e-22 84.3 sp|Q6G124|MURG_BARQU Glyco_transf_28
+2.2e-22 84.2 sp|Q2W0H3|MURG_MAGSA Glyco_transf_28
+2.8e-22 83.9 sp|Q0CKU4|ATG26_ASPTN Glyco_transf_28
+2.8e-22 83.9 sp|B1ZU31|MURG_OPITP Glyco_transf_28
+2.9e-22 83.9 sp|A6L071|MURG_BACV8 Glyco_transf_28
+2.9e-22 83.9 sp|Q1QNU3|MURG_NITHX Glyco_transf_28
+3.8e-22 83.5 sp|B2V7Y8|MURG_SULSY Glyco_transf_28
+4.9e-22 83.1 sp|Q3AGT7|MURG_SYNSC Glyco_transf_28
+5.2e-22 83.0 sp|Q5B4C9|ATG26_EMENI Glyco_transf_28
+7.1e-22 82.6 sp|A5GW69|MURG_SYNR3 Glyco_transf_28
+7.4e-22 82.6 sp|A4YZK3|MURG_BRASO Glyco_transf_28
+7.6e-22 82.5 sp|Q2RVU4|MURG_RHORT Glyco_transf_28
+7.8e-22 82.5 sp|Q2JW21|MURG_SYNJA Glyco_transf_28
+8e-22 82.4 sp|A5EPK4|MURG_BRASB Glyco_transf_28
+9.4e-22 82.2 sp|A7KAN4|ATG26_PENCW Glyco_transf_28
+1.1e-21 82.0 sp|Q2JJR4|MURG_SYNJB Glyco_transf_28
+1.2e-21 81.9 sp|A2QNQ5|ATG26_ASPNC Glyco_transf_28
+1.3e-21 81.8 sp|Q0AMW7|MURG_MARMM Glyco_transf_28
+1.5e-21 81.5 sp|Q812Y1|MURG3_BACCR Glyco_transf_28
+1.8e-21 81.3 sp|B4SH49|MURG_PELPB Glyco_transf_28
+2e-21 81.2 sp|B4S6Q9|MURG_PROA2 Glyco_transf_28
+2.5e-21 80.8 sp|A8G2K3|MURG_PROM2 Glyco_transf_28
+2.7e-21 80.8 sp|Q89FU7|MURG_BRAJA Glyco_transf_28
+3.5e-21 80.4 sp|A0RHC3|MURG1_BACAH Glyco_transf_28
+3.7e-21 80.3 sp|Q6MBS7|MURG_PARUW Glyco_transf_28
+3.9e-21 80.2 sp|Q0BXU2|MURG_HYPNA Glyco_transf_28
+4.2e-21 80.1 sp|Q8KGD4|MURG_CHLTE Glyco_transf_28
+4.2e-21 80.1 sp|B3QLW4|MURG_CHLP8 Glyco_transf_28
+5.4e-21 79.8 sp|A6T2F8|MURG_JANMA Glyco_transf_28
+7.8e-21 79.2 sp|A5CEL6|MURG_ORITB Glyco_transf_28
+7.9e-21 79.2 sp|Q8D2Z6|MURG_WIGBR Glyco_transf_28
+9.1e-21 79.0 sp|B0UFC7|MURG_METS4 Glyco_transf_28
+1.2e-20 78.6 sp|Q163J0|MURG_ROSDO Glyco_transf_28
+1.2e-20 78.6 sp|A4G8T8|MURG_HERAR Glyco_transf_28
+1.3e-20 78.6 sp|Q28NN5|MURG_JANSC Glyco_transf_28
+1.3e-20 78.6 sp|Q31CY4|MURG_PROM9 Glyco_transf_28
+1.3e-20 78.5 sp|B1ZGP4|MURG_METPB Glyco_transf_28
+1.5e-20 78.3 sp|Q5LU63|MURG_SILPO Glyco_transf_28
+1.6e-20 78.3 sp|B3CRE9|MURG_ORITI Glyco_transf_28
+1.8e-20 78.1 sp|Q1GIV1|MURG_SILST Glyco_transf_28
+2.1e-20 77.8 sp|Q1GZ01|MURG_METFK Glyco_transf_28
+2.3e-20 77.7 sp|B3ET95|MURG_AMOA5 Glyco_transf_28
+2.4e-20 77.7 sp|Q8A258|MURG_BACTN Glyco_transf_28
+2.6e-20 77.5 sp|Q211T8|MURG_RHOPB Glyco_transf_28
+2.9e-20 77.4 sp|Q2IYK8|MURG_RHOP2 Glyco_transf_28
+3.9e-20 77.0 sp|B1LXZ4|MURG_METRJ Glyco_transf_28
+4.4e-20 76.8 sp|A2BNZ2|MURG_PROMS Glyco_transf_28
+5.1e-20 76.6 sp|C0R2W7|MURG_WOLWR Glyco_transf_28
+5.1e-20 76.6 sp|Q73I55|MURG_WOLPM Glyco_transf_28
+5.9e-20 76.4 sp|A9VWV3|MURG_METEP Glyco_transf_28
+6.1e-20 76.3 sp|B7KSC1|MURG_METC4 Glyco_transf_28
+6.5e-20 76.3 sp|A2C027|MURG_PROM1 Glyco_transf_28
+6.7e-20 76.2 sp|A3PHS8|MURG_RHOS1 Glyco_transf_28
+7.9e-20 76.0 sp|A4SH02|MURG_PROVI Glyco_transf_28
+7.9e-20 76.0 sp|Q3J4M2|MURG_RHOS4 Glyco_transf_28
+9.5e-20 75.7 sp|Q7V388|MURG_PROMP Glyco_transf_28
+9.9e-20 75.7 sp|A3PAR5|MURG_PROM0 Glyco_transf_28
+1e-19 75.6 sp|Q07PT3|MURG_RHOP5 Glyco_transf_28
+1.1e-19 75.5 sp|Q133X1|MURG_RHOPS Glyco_transf_28
+1.2e-19 75.4 sp|Q5LIJ7|MURG_BACFN Glyco_transf_28
+1.2e-19 75.4 sp|Q64ZM1|MURG_BACFR Glyco_transf_28
+1.3e-19 75.3 sp|A6LLF1|MURG_THEM4 Glyco_transf_28
+1.6e-19 75.0 sp|Q46HH6|MURG_PROMT Glyco_transf_28
+2.4e-19 74.4 sp|A4WQD5|MURG_RHOS5 Glyco_transf_28
+3.2e-19 74.0 sp|A2BUH4|MURG_PROM5 Glyco_transf_28
+6.6e-19 73.0 sp|Q5GS79|MURG_WOLTR Glyco_transf_28
+1e-18 72.4 sp|Q7NPZ9|MURG_CHRVO Glyco_transf_28
+1.2e-18 72.2 sp|Q1AVX3|MURG_RUBXD Glyco_transf_28
+1.3e-18 72.1 sp|Q7MBC4|MURG_GLOVI Glyco_transf_28
+1.6e-18 71.8 sp|Q7U322|MURG_HELHP Glyco_transf_28
+2e-18 71.4 sp|Q3B129|MURG_PELLD Glyco_transf_28
+4.3e-18 70.4 sp|Q30PK0|MURG_SULDN Glyco_transf_28
+7.3e-18 69.6 sp|A2SCY5|MURG_METPP Glyco_transf_28
+1.2e-17 68.9 sp|A0RP87|MURG_CAMFF Glyco_transf_28
+1.6e-17 68.5 sp|B3CM87|MURG_WOLPP Glyco_transf_28
+3.5e-17 67.4 sp|A5FUL0|MURG_ACICJ Glyco_transf_28
+5.3e-17 66.8 sp|Q7MAD4|MURG_WOLSU Glyco_transf_28
+8.9e-17 66.1 sp|B2KE54|MURG_ELUMP Glyco_transf_28
+1.2e-16 65.6 sp|B3EIK8|MURG_CHLL2 Glyco_transf_28
+1.4e-16 65.4 sp|A5UZT7|MURG_ROSS1 Glyco_transf_28
+3.1e-16 64.4 sp|Q5FUJ5|MURG_GLUOX Glyco_transf_28
+6.5e-16 63.3 sp|A6Q722|MURG_SULNB Glyco_transf_28
+1.6e-15 62.0 sp|B8E325|MURG_DICTD Glyco_transf_28
+2.2e-15 61.6 sp|A6Q579|MURG_NITSB Glyco_transf_28
+3.4e-15 61.0 sp|Q0BV25|MURG_GRABC Glyco_transf_28
+4e-15 60.8 sp|Q5PB22|MURG_ANAMM Glyco_transf_28
+4.1e-15 60.7 sp|A7I265|MURG_CAMHC Glyco_transf_28
+6.3e-15 60.1 sp|A9FI55|MURG_SORC5 Glyco_transf_28
+8.2e-15 59.7 sp|B5YEL3|MURG_DICT6 Glyco_transf_28
+1.2e-13 56.0 sp|A8FM88|MURG_CAMJ8 Glyco_transf_28
+1.5e-13 55.6 sp|Q5HU62|MURG_CAMJR Glyco_transf_28
+1.5e-13 55.6 sp|A1W027|MURG_CAMJJ Glyco_transf_28
+1.5e-13 55.6 sp|Q9PNQ2|MURG_CAMJE Glyco_transf_28
+3.5e-13 54.5 sp|A7H2Z9|MURG_CAMJD Glyco_transf_28
+7.2e-13 53.4 sp|A8F4X1|MURG_THELT Glyco_transf_28
+1.8e-10 45.7 sp|Q72R84|MURG_LEPIC Glyco_transf_28
+1.8e-10 45.7 sp|Q8F4J1|MURG_LEPIN Glyco_transf_28
+4.2e-09 41.3 sp|Q4FPK5|MURG_PELUB Glyco_transf_28
+7.7e-09 40.4 sp|Q04V94|MURG_LEPBJ Glyco_transf_28
+7.7e-09 40.4 sp|Q04Y82|MURG_LEPBL Glyco_transf_28
+3.4e-07 35.1 sp|Q8TTI1|Y452_METAC Glyco_transf_28
+2.3e-06 32.4 sp|Q8TTI0|Y453_METAC Glyco_transf_28
+2.4e-06 32.3 sp|Q8PWF3|Y1636_METMA Glyco_transf_28
+7.8e-06 30.6 sp|O34539|YJIC_BACSU Glyco_transf_28
+2e-05 29.3 sp|Q53685|OLED_STRAT Glyco_transf_28
+2e-05 29.3 sp|Q8PZB2|Y582_METMA Glyco_transf_28
+7.8e-05 27.4 sp|P21686|CRTX_PANAN Glyco_transf_28
+0.00056 24.6 sp|Q54387|MGT_STRLI Glyco_transf_28
+0.00067 24.4 sp|Q01330|CRTX_ESCVU Glyco_transf_28
+0.012 20.4 sp|O31853|YOJK_BACSU Glyco_transf_28
+0.013 20.2 sp|B1YIY4|MTNA_EXIS2 Glyco_transf_28
+0.016 19.9 sp|Q0WW21|UGAGT_ARATH Glyco_transf_28
+0.021 19.6 sp|Q9Z565|ILVC1_STRCO Glyco_transf_28
+0.022 19.5 sp|O05496|YDHE_BACSU Glyco_transf_28
+0.022 19.4 sp|Q9FBT8|ILVC2_STRCO Glyco_transf_28
+0.023 19.4 sp|Q9SBL1|HMNGT_SORBI Glyco_transf_28
+0.067 17.9 sp|B1I2P1|MTNA_DESAP Glyco_transf_28
+0.08 17.6 sp|A8AZU1|MUTL_STRGC Glyco_transf_28
+0.085 17.6 sp|Q01198|LIGD_PSEPA Glyco_transf_28
+0.087 17.5 sp|Q83RR8|NPD_SHIFL Glyco_transf_28
+0.089 17.5 sp|C5D7U5|MTNA_GEOSW Glyco_transf_28
+0.11 17.2 sp|A3CR14|MUTL_STRSV Glyco_transf_28
+0.12 17.1 sp|Q88M09|MTNA_PSEPK Glyco_transf_28
+0.13 17.0 sp|Q5L1E6|MTNA_GEOKA Glyco_transf_28
+0.14 16.9 sp|Q8X8E0|NPD_ECO57 Glyco_transf_28
+0.14 16.9 sp|P75960|NPD_ECOLI Glyco_transf_28
+0.14 16.9 sp|Q5V467|MAMA1_HALMA Glyco_transf_28
+0.14 16.9 sp|C0MAS4|MUTL_STRE4 Glyco_transf_28
+0.14 16.8 sp|P0A2F2|NPD_SALTY Glyco_transf_28
+0.14 16.8 sp|P0A2F3|NPD_SALTI Glyco_transf_28
+0.15 16.8 sp|C0MGC4|MUTL_STRS7 Glyco_transf_28
+0.15 16.8 sp|Q65KK2|MTNA_BACLD Glyco_transf_28
+0.15 16.7 sp|B0KTX5|MTNA_PSEPG Glyco_transf_28
+0.16 16.7 sp|B1J5G5|MTNA_PSEPW Glyco_transf_28
+0.16 16.7 sp|A5W7G2|MTNA_PSEP1 Glyco_transf_28
+0.17 16.6 sp|A4ILL1|MTNA_GEOTN Glyco_transf_28
+0.18 16.5 sp|B4U0J7|MUTL_STREM Glyco_transf_28
+0.2 16.4 sp|Q8FIM4|NPD_ECOL6 Glyco_transf_28
+0.21 16.3 sp|B2GFJ7|ILVC_KOCRD Glyco_transf_28
+0.21 16.3 sp|B1VZ72|ILVC_STRGG Glyco_transf_28
+0.22 16.2 sp|Q59818|ILVC_STRAW Glyco_transf_28
+0.26 16.0 sp|Q731R7|MTNA_BACC1 Glyco_transf_28
+0.29 15.8 sp|B1GZW3|TPIS_UNCTG Glyco_transf_28
+0.33 15.7 sp|Q2IWS4|GLYA_RHOP2 Glyco_transf_28
+0.36 15.5 sp|A7GS56|MTNA_BACCN Glyco_transf_28
+0.37 15.5 sp|B7KF23|ILVC_CYAP7 Glyco_transf_28
+0.39 15.4 sp|A5W1E8|RNZ_PSEP1 Glyco_transf_28
+0.45 15.2 sp|B3QSP0|ILVC_CHLT3 Glyco_transf_28
+0.46 15.2 sp|O31662|MTNA_BACSU Glyco_transf_28
+0.51 15.0 sp|C1F6Z5|ILVC_ACIC5 Glyco_transf_28
+0.55 14.9 sp|Q2G3S7|PYRB_NOVAD Glyco_transf_28
+0.57 14.9 sp|Q96LB3|IFT74_HUMAN Glyco_transf_28
+0.58 14.9 sp|A9AZM5|ILVC_HERA2 Glyco_transf_28
+0.64 14.7 sp|B8HSQ9|SURE_CYAP4 Glyco_transf_28
+0.68 14.6 sp|Q3SPL2|UVRC_NITWN Glyco_transf_28
+0.68 14.6 sp|A7Z3X0|MTNA_BACA2 Glyco_transf_28
+0.69 14.6 sp|Q38W65|EFTS_LACSS Glyco_transf_28
+0.69 14.6 sp|C3JYK1|TIG_PSEFS Glyco_transf_28
+0.71 14.6 sp|Q1GZA6|BIOB_METFK Glyco_transf_28
+0.71 14.6 sp|Q635P7|MTNA2_BACCZ Glyco_transf_28
+0.71 14.6 sp|O48676|HTGT_ARATH Glyco_transf_28
+0.72 14.6 sp|Q8YRC9|THIOG_ANASP Glyco_transf_28
+0.73 14.5 sp|Q8DW43|ILVC_STRMU Glyco_transf_28
+0.73 14.5 sp|Q81MJ6|MTNA2_BACAN Glyco_transf_28
+0.74 14.5 sp|Q6N693|GLYA1_RHOPA Glyco_transf_28
+0.75 14.5 sp|B0C915|MURD_ACAM1 Glyco_transf_28
+0.76 14.5 sp|Q2KA25|GLYA_RHIEC Glyco_transf_28
+0.77 14.5 sp|Q214H7|GLYA_RHOPB Glyco_transf_28
+0.79 14.4 sp|B9DW70|MUTL_STRU0 Glyco_transf_28
+0.8 14.4 sp|A0RI38|MTNA2_BACAH Glyco_transf_28
+0.81 14.4 sp|Q6HED3|MTNA2_BACHK Glyco_transf_28
+0.83 14.4 sp|Q1QIR5|UVRC_NITHX Glyco_transf_28
+0.84 14.3 sp|A8AVN4|ILVC_STRGC Glyco_transf_28
+0.86 14.3 sp|Q7V5V5|MURD_PROMM Glyco_transf_28
+0.9 14.2 sp|Q47SB6|ILVC_THEFY Glyco_transf_28
+0.9 14.2 sp|A4FMQ5|ILVC_SACEN Glyco_transf_28
+0.91 14.2 sp|Q5V3R4|TRM56_HALMA Glyco_transf_28
+0.91 14.2 sp|B8GW68|ENO_CAUCN Glyco_transf_28
+0.91 14.2 sp|Q9A7J9|ENO_CAUCR Glyco_transf_28
+0.92 14.2 sp|Q5V3F0|MAMA2_HALMA Glyco_transf_28
+0.96 14.2 sp|B1LZ88|GLYA_METRJ Glyco_transf_28
+0.98 14.1 sp|P94966|BIOB_METSK Glyco_transf_28
+1 14.1 sp|Q3SHE4|ILVC_THIDA Glyco_transf_28
+1.1 14.0 sp|Q07MT9|GLYA_RHOP5 Glyco_transf_28
+1.1 14.0 sp|A9VRK3|MTNA1_BACWK Glyco_transf_28
+1.1 13.9 sp|A9GW78|ILVC_SORC5 Glyco_transf_28
+1.1 13.9 sp|Q5YRW2|ILVC_NOCFA Glyco_transf_28
+1.2 13.9 sp|A3CQ86|ILVC_STRSV Glyco_transf_28
+1.2 13.8 sp|Q21AW5|UVRC_RHOPB Glyco_transf_28
+1.3 13.7 sp|Q81IK7|MTNA1_BACCR Glyco_transf_28
+1.3 13.7 sp|Q5FNN2|PYRG_GLUOX Glyco_transf_28
+1.3 13.7 sp|Q2S9V9|ILVC_HAHCH Glyco_transf_28
+1.4 13.6 sp|Q17QH8|D39U1_BOVIN Glyco_transf_28
+1.4 13.6 sp|Q2J6V2|ILVC_FRASC Glyco_transf_28
+1.4 13.6 sp|A1WUW3|ILVC_HALHL Glyco_transf_28
+1.4 13.6 sp|A8LMD0|PUR9_DINSH Glyco_transf_28
+1.4 13.6 sp|C5BAT0|GCSP_EDWI9 Glyco_transf_28
+1.4 13.6 sp|C1B2M1|ILVC_RHOOB Glyco_transf_28
+1.4 13.6 sp|Q0S2H3|ILVC_RHOSR Glyco_transf_28
+1.4 13.6 sp|A0R946|MTNA1_BACAH Glyco_transf_28
+1.4 13.6 sp|Q81ZC2|MTNA1_BACAN Glyco_transf_28
+1.5 13.6 sp|Q6HP54|MTNA1_BACHK Glyco_transf_28
+1.5 13.5 sp|Q1MIU5|GLYA_RHIL3 Glyco_transf_28
+1.5 13.5 sp|A8FCG5|MTNA_BACP2 Glyco_transf_28
+1.6 13.5 sp|Q63CV4|ILVC2_BACCZ Glyco_transf_28
+1.6 13.4 sp|A4J179|ILVC_DESRM Glyco_transf_28
+1.6 13.4 sp|Q9V030|PAAD_PYRAB Glyco_transf_28
+1.7 13.4 sp|Q81F27|ILVC2_BACCR Glyco_transf_28
+1.7 13.4 sp|Q03IJ9|ILVC_STRTD Glyco_transf_28
+1.7 13.4 sp|Q9F0I7|ILVC_STRTR Glyco_transf_28
+1.7 13.4 sp|P26166|YBCC_RHOCA Glyco_transf_28
+1.7 13.4 sp|B8I1T8|ILVC_CLOCE Glyco_transf_28
+1.7 13.3 sp|A4VXL3|ILVC_STRSY Glyco_transf_28
+1.7 13.3 sp|A4W3V8|ILVC_STRS2 Glyco_transf_28
+1.8 13.3 sp|Q3B594|ILVC_PELLD Glyco_transf_28
+1.8 13.3 sp|B1I8F2|MUTL_STRPI Glyco_transf_28
+1.8 13.3 sp|B2IS10|MUTL_STRPS Glyco_transf_28
+1.8 13.3 sp|B8ZKC9|MUTL_STRPJ Glyco_transf_28
+1.8 13.3 sp|P0A3R1|HEXB_STRPN Glyco_transf_28
+1.8 13.3 sp|P0A3R2|HEXB_STRR6 Glyco_transf_28
+1.8 13.3 sp|Q04MR4|MUTL_STRP2 Glyco_transf_28
+1.8 13.3 sp|C1CI68|MUTL_STRZP Glyco_transf_28
+1.8 13.3 sp|C1CP43|MUTL_STRZT Glyco_transf_28
+1.8 13.3 sp|Q8ZQE4|MACB_SALTY Glyco_transf_28
+1.8 13.3 sp|Q57R58|MACB_SALCH Glyco_transf_28
+1.8 13.2 sp|Q64550|UD11_RAT Glyco_transf_28
+1.8 13.2 sp|B9JCX4|GLYA_AGRRK Glyco_transf_28
+1.9 13.2 sp|Q8Z824|MACB_SALTI Glyco_transf_28
+1.9 13.2 sp|O94475|YC67_SCHPO Glyco_transf_28
+1.9 13.2 sp|P59837|RDH12_BOVIN Glyco_transf_28
+1.9 13.2 sp|Q5PGK9|MACB_SALPA Glyco_transf_28
+2 13.1 sp|Q02CM4|ILVC_SOLUE Glyco_transf_28
+2 13.1 sp|Q669P6|NPD_YERPS Glyco_transf_28
+2 13.1 sp|Q8ZFR1|NPD_YERPE Glyco_transf_28
+2 13.1 sp|B9KYS1|ILVC_THERP Glyco_transf_28
+2 13.1 sp|B4UAN4|ILVC_ANASK Glyco_transf_28
+2 13.1 sp|B8J829|ILVC_ANAD2 Glyco_transf_28
+2 13.1 sp|Q2IJB7|ILVC_ANADE Glyco_transf_28
+2.1 13.1 sp|Q0RDI8|ILVC_FRAAA Glyco_transf_28
+2.1 13.1 sp|P0ABQ0|COABC_ECOLI Glyco_transf_28
+2.1 13.1 sp|P0ABQ1|COABC_ECOL6 Glyco_transf_28
+2.1 13.1 sp|B2J2U6|ILVC_NOSP7 Glyco_transf_28
+2.1 13.0 sp|Q89DG9|UVRC_BRAJA Glyco_transf_28
+2.1 13.0 sp|Q2S0M9|ILVC_SALRD Glyco_transf_28
+2.2 13.0 sp|Q7NH80|ILVC_GLOVI Glyco_transf_28
+2.2 13.0 sp|Q8G6V1|ILVC2_BIFLO Glyco_transf_28
+2.2 13.0 sp|Q2W698|ENO_MAGSA Glyco_transf_28
+2.3 12.9 sp|Q63GN3|MTNA1_BACCZ Glyco_transf_28
+2.3 12.9 sp|B0JRP2|ILVC_MICAN Glyco_transf_28
+2.3 12.9 sp|C1CBX8|MUTL_STRZJ Glyco_transf_28
+2.3 12.9 sp|Q3SLY0|BIOB_THIDA Glyco_transf_28
+2.4 12.9 sp|B5E6C5|MUTL_STRP4 Glyco_transf_28
+2.5 12.8 sp|B2J6I3|MURD_NOSP7 Glyco_transf_28
+2.5 12.8 sp|Q5LXV0|ILVC_STRT1 Glyco_transf_28
+2.5 12.8 sp|Q5M2F2|ILVC_STRT2 Glyco_transf_28
+2.6 12.8 sp|C6A5E6|VATD_THESM Glyco_transf_28
+2.6 12.8 sp|Q2RIS6|ILVC_MOOTA Glyco_transf_28
+2.6 12.7 sp|Q3M859|THIOG_ANAVT Glyco_transf_28
+2.6 12.7 sp|Q5GS59|RLME_WOLTR Glyco_transf_28
+2.7 12.7 sp|B8G7X1|ILVC_CHLAD Glyco_transf_28
+2.8 12.7 sp|C5C2I2|ILVC_BEUC1 Glyco_transf_28
+2.8 12.6 sp|Q5SJ03|ILVC_THET8 Glyco_transf_28
+2.8 12.6 sp|Q72JC8|ILVC_THET2 Glyco_transf_28
+2.9 12.6 sp|Q4JUN9|ILVC_CORJK Glyco_transf_28
+2.9 12.6 sp|Q2J0X3|UVRC_RHOP2 Glyco_transf_28
+2.9 12.6 sp|Q02YY8|ILVC_LACLS Glyco_transf_28
+2.9 12.6 sp|B9EBF4|ILVC_MACCJ Glyco_transf_28
+2.9 12.6 sp|Q43716|UFOG_PETHY Glyco_transf_28
+3 12.6 sp|A5GUT4|SURE_SYNR3 Glyco_transf_28
+3 12.6 sp|Q1ARE4|ILVC_RUBXD Glyco_transf_28
+3 12.5 sp|A6W7N6|ILVC_KINRD Glyco_transf_28
+3 12.5 sp|Q11039|DEAD_MYCTU Glyco_transf_28
+3 12.5 sp|Q13BM0|UVRC_RHOPS Glyco_transf_28
+3.1 12.5 sp|Q8YMT3|SURE_ANASP Glyco_transf_28
+3.1 12.5 sp|Q319M0|SURE_PROM9 Glyco_transf_28
+3.1 12.5 sp|A9VFD5|MTNA2_BACWK Glyco_transf_28
+3.2 12.5 sp|A1JRP2|NADA_YERE8 Glyco_transf_28
+3.3 12.4 sp|A2RKQ6|ILVC_LACLM Glyco_transf_28
+3.5 12.3 sp|Q32DZ9|MACB_SHIDS Glyco_transf_28
+3.5 12.3 sp|A5CPY6|ILVC_CLAM3 Glyco_transf_28
+3.5 12.3 sp|B0RIN6|ILVC_CLAMS Glyco_transf_28
+3.7 12.3 sp|Q8K5J6|MUTL_STRP3 Glyco_transf_28
+3.7 12.3 sp|Q99XN7|MUTL_STRP1 Glyco_transf_28
+3.7 12.3 sp|B5XJ09|MUTL_STRPZ Glyco_transf_28
+3.8 12.2 sp|A2RGV3|MUTL_STRPG Glyco_transf_28
+3.8 12.2 sp|Q5X9H5|MUTL_STRP6 Glyco_transf_28
+3.9 12.2 sp|Q3JYM6|MUTL_STRA1 Glyco_transf_28
+3.9 12.2 sp|Q8E2R5|MUTL_STRA3 Glyco_transf_28
+4 12.2 sp|Q9MB73|LGT_CITUN Glyco_transf_28
+4.1 12.1 sp|A8G678|SURE_PROM2 Glyco_transf_28
+4.2 12.1 sp|A9WP08|ILVC_RENSM Glyco_transf_28
+4.8 11.9 sp|A9WC26|ILVC_CHLAA Glyco_transf_28
+4.8 11.9 sp|B9LGM7|ILVC_CHLSY Glyco_transf_28
+4.9 11.9 sp|A2BSJ2|SURE_PROMS Glyco_transf_28
+5 11.8 sp|Q9LR44|IABG1_ARATH Glyco_transf_28
+5.2 11.8 sp|O57731|VATD_PYRHO Glyco_transf_28
+5.6 11.7 sp|A3PEA4|SURE_PROM0 Glyco_transf_28
+6.8 11.4 sp|P75831|MACB_ECOLI Glyco_transf_28
+7.6 11.2 sp|Q83LR7|MACB_SHIFL Glyco_transf_28
+7.7 11.2 sp|Q3Z3Q4|MACB_SHISS Glyco_transf_28
+9.5 10.9 sp|Q8XED0|MACB_ECO57 Glyco_transf_28
diff --git a/demotic/regress/hmmsearch-tbl.out b/demotic/regress/hmmsearch-tbl.out
new file mode 100644
index 0000000..b979e53
--- /dev/null
+++ b/demotic/regress/hmmsearch-tbl.out
@@ -0,0 +1,972 @@
+4.5 0 88 116 US2 50 78 sp|P06485|US02_HHV11
+1.1e-43 0 2 126 US2 111 247 sp|P06485|US02_HHV11
+9.8e-43 0 1 126 US2 110 246 sp|P13292|US02_HHV2H
+5.9e-40 0 1 124 US2 1 116 sp|Q05106|US453_GAHVG
+1.1e-39 0 1 124 US2 111 265 sp|P32517|US02_EHV1K
+1.7e-37 0 1 112 US2 111 245 sp|P28964|US02_EHV1B
+9.8e-36 0 1 110 US2 105 208 sp|Q08099|US02_BHV1S
+8.8e-22 0 1 125 US2 135 255 sp|P24382|US02_SUHVN
+7.1e-05 0 51 107 US2 208 262 sp|Q9ZK80|ATPG_HELPJ
+7.1e-05 0 51 107 US2 208 262 sp|P56082|ATPG_HELPY
+7.8e-05 0 51 107 US2 208 262 sp|B2UUP1|ATPG_HELPS
+7.8e-05 0 51 107 US2 208 262 sp|B6JMX3|ATPG_HELP2
+0.00013 0 52 107 US2 209 262 sp|Q17Y79|ATPG_HELAH
+0.00018 0 51 107 US2 208 262 sp|B5Z8D1|ATPG_HELPG
+0.0002 0 51 107 US2 208 262 sp|Q1CSD4|ATPG_HELPH
+1.3e-42 0 1 138 Glyco_transf_28 3 142 sp|A7Z4E5|MURG_BACA2
+4e-41 0 1 138 Glyco_transf_28 3 142 sp|Q65JY0|MURG_BACLD
+4 0 13 106 Glyco_transf_28 203 234 sp|Q65JY0|MURG_BACLD
+4.9e-42 0 1 138 Glyco_transf_28 3 142 sp|P37585|MURG_BACSU
+2.4e-41 0 1 138 Glyco_transf_28 3 142 sp|A8FCY1|MURG_BACP2
+7.9e-40 0 1 139 Glyco_transf_28 3 143 sp|Q812W5|MURG1_BACCR
+7e-41 0 2 138 Glyco_transf_28 6 142 sp|A3MY90|MURG_ACTP2
+7.9e-40 0 1 139 Glyco_transf_28 3 143 sp|A0RHT1|MURG2_BACAH
+7.9e-40 0 1 139 Glyco_transf_28 3 143 sp|Q636B6|MURG1_BACCZ
+7.9e-40 0 1 139 Glyco_transf_28 3 143 sp|Q81JG5|MURG1_BACAN
+7.9e-40 0 1 139 Glyco_transf_28 3 143 sp|Q732F8|MURG1_BACC1
+3.2e-40 0 1 138 Glyco_transf_28 3 142 sp|B7GGI2|MURG_ANOFW
+7.5e-40 0 1 139 Glyco_transf_28 3 143 sp|A7GRN6|MURG_BACCN
+2.5e-40 0 2 138 Glyco_transf_28 6 142 sp|B0BRH7|MURG_ACTPJ
+2.5e-40 0 2 138 Glyco_transf_28 6 142 sp|B3GZK8|MURG_ACTP7
+2e-39 0 1 139 Glyco_transf_28 3 143 sp|Q6HEQ4|MURG1_BACHK
+7.1e-40 0 1 138 Glyco_transf_28 3 142 sp|O07670|MURG_ENTHR
+4e-39 0 2 138 Glyco_transf_28 9 145 sp|A7FM66|MURG_YERP3
+6.1 0 38 108 Glyco_transf_28 266 342 sp|A7FM66|MURG_YERP3
+4e-39 0 2 138 Glyco_transf_28 9 145 sp|B1JK81|MURG_YERPY
+6.1 0 38 108 Glyco_transf_28 266 342 sp|B1JK81|MURG_YERPY
+4e-39 0 2 138 Glyco_transf_28 9 145 sp|B2K4E6|MURG_YERPB
+6.1 0 38 108 Glyco_transf_28 266 342 sp|B2K4E6|MURG_YERPB
+4e-39 0 2 138 Glyco_transf_28 9 145 sp|Q66EK5|MURG_YERPS
+6.1 0 38 108 Glyco_transf_28 266 342 sp|Q66EK5|MURG_YERPS
+2.5e-39 0 2 138 Glyco_transf_28 9 145 sp|A1JJJ3|MURG_YERE8
+4.8e-39 0 2 138 Glyco_transf_28 9 145 sp|A9MQC2|MURG_SALAR
+5.2 0 38 108 Glyco_transf_28 266 342 sp|A9MQC2|MURG_SALAR
+8.1e-40 0 1 138 Glyco_transf_28 3 144 sp|P64869|Y1526_MYCTU
+8.1e-40 0 1 138 Glyco_transf_28 3 144 sp|P64870|Y1553_MYCBO
+1e-39 0 2 138 Glyco_transf_28 8 144 sp|Q65RY6|MURG_MANSM
+3.7e-39 0 2 138 Glyco_transf_28 7 143 sp|B2VD91|MURG_ERWT9
+1.3e-39 0 2 138 Glyco_transf_28 7 143 sp|Q4QLF8|MURG_HAEI8
+1.3e-39 0 2 138 Glyco_transf_28 7 143 sp|A5UIR2|MURG_HAEIG
+1.3e-39 0 2 138 Glyco_transf_28 7 143 sp|P45065|MURG_HAEIN
+9.8e-39 0 2 138 Glyco_transf_28 9 145 sp|A9R124|MURG_YERPG
+5.3 0 38 116 Glyco_transf_28 266 350 sp|A9R124|MURG_YERPG
+9.8e-39 0 2 138 Glyco_transf_28 9 145 sp|Q1C214|MURG_YERPA
+5.3 0 38 116 Glyco_transf_28 266 350 sp|Q1C214|MURG_YERPA
+9.8e-39 0 2 138 Glyco_transf_28 9 145 sp|Q1CMM7|MURG_YERPN
+5.3 0 38 116 Glyco_transf_28 266 350 sp|Q1CMM7|MURG_YERPN
+9.8e-39 0 2 138 Glyco_transf_28 9 145 sp|Q8ZIE9|MURG_YERPE
+5.3 0 38 116 Glyco_transf_28 266 350 sp|Q8ZIE9|MURG_YERPE
+6.2e-39 0 1 138 Glyco_transf_28 3 142 sp|O07109|MURG_ENTFA
+4.3e-39 0 1 138 Glyco_transf_28 7 144 sp|A3QIM1|MURG_SHELP
+6.2e-39 0 2 138 Glyco_transf_28 9 145 sp|A8G9S7|MURG_SERP5
+6e-39 0 2 138 Glyco_transf_28 9 145 sp|B7LWF6|MURG_ESCF3
+7.6e-39 0 2 138 Glyco_transf_28 9 145 sp|A7MIE5|MURG_ENTS8
+7.1e-39 0 2 138 Glyco_transf_28 9 145 sp|C6DEU3|MURG_PECCP
+2.4e-38 0 2 138 Glyco_transf_28 4 142 sp|Q88V81|MURG_LACPL
+1.5e-38 0 2 138 Glyco_transf_28 9 145 sp|Q8Z9G9|MURG_SALTI
+3.5e-38 0 2 138 Glyco_transf_28 9 145 sp|B4F111|MURG_PROMH
+4 0 38 116 Glyco_transf_28 271 355 sp|B4F111|MURG_PROMH
+2.5e-38 0 1 138 Glyco_transf_28 8 145 sp|A0L1P2|MURG_SHESA
+2.9 0 54 117 Glyco_transf_28 285 357 sp|A0L1P2|MURG_SHESA
+2.5e-38 0 1 138 Glyco_transf_28 8 145 sp|Q0HZR6|MURG_SHESR
+2.9 0 54 117 Glyco_transf_28 285 357 sp|Q0HZR6|MURG_SHESR
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B5BLC2|MURG_SALPK
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|Q5PDC8|MURG_SALPA
+4.1e-39 0 1 138 Glyco_transf_28 3 142 sp|Q9K9T0|MURG_BACHD
+5.2e-39 0 1 138 Glyco_transf_28 3 142 sp|Q8Y5M2|MURG_LISMO
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|A9MZL9|MURG_SALPB
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|B4TJ87|MURG_SALHS
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|B4TXH8|MURG_SALSV
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|B5F7W4|MURG_SALA4
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|Q8ZRU3|MURG_SALTY
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|B4SU50|MURG_SALNS
+2.6e-38 0 1 138 Glyco_transf_28 8 145 sp|A1REZ6|MURG_SHESW
+2.6e-38 0 1 138 Glyco_transf_28 8 145 sp|A4Y2N6|MURG_SHEPC
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|A6T4N3|MURG_KLEP7
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|B5RH64|MURG_SALG2
+1.1e-38 0 2 138 Glyco_transf_28 9 145 sp|A8ALK6|MURG_CITK8
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|Q57TD0|MURG_SALCH
+3.9e-38 0 1 138 Glyco_transf_28 8 145 sp|A6WID1|MURG_SHEB8
+8 0 54 116 Glyco_transf_28 287 356 sp|A6WID1|MURG_SHEB8
+3.9e-38 0 1 138 Glyco_transf_28 8 145 sp|A9KY29|MURG_SHEB9
+8 0 54 116 Glyco_transf_28 287 356 sp|A9KY29|MURG_SHEB9
+3.9e-38 0 1 138 Glyco_transf_28 8 145 sp|B8E698|MURG_SHEB2
+8 0 54 116 Glyco_transf_28 287 356 sp|B8E698|MURG_SHEB2
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B5Y1U7|MURG_KLEP3
+3.9e-38 0 1 138 Glyco_transf_28 8 145 sp|A3CZM1|MURG_SHEB5
+8.1 0 54 116 Glyco_transf_28 287 356 sp|A3CZM1|MURG_SHEB5
+1.6e-38 0 2 138 Glyco_transf_28 6 142 sp|Q7U336|MURG_HAEDU
+8.7e-39 0 2 138 Glyco_transf_28 8 144 sp|B7VJ03|MURG_VIBSL
+1.1e-38 0 2 138 Glyco_transf_28 8 144 sp|Q0I1D3|MURG_HAES1
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|B5FI72|MURG_SALDC
+2.4e-38 0 1 138 Glyco_transf_28 3 142 sp|A2RJQ4|MURG_LACLM
+2.4e-38 0 1 138 Glyco_transf_28 3 142 sp|Q02XY0|MURG_LACLS
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B7MNU9|MURG_ECO81
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B7NHJ6|MURG_ECO7I
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B7UIE0|MURG_ECO27
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|Q0TLP9|MURG_ECOL5
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|Q8FL64|MURG_ECOL6
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|A1A7D5|MURG_ECOK1
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B7MAL3|MURG_ECO45
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|Q1RGA5|MURG_ECOUT
+2.2e-38 0 2 138 Glyco_transf_28 9 145 sp|Q6D0I3|MURG_ERWCT
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B5YZC6|MURG_ECO5E
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|Q8X9Y8|MURG_ECO57
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|A7ZHI1|MURG_ECO24
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B1LG27|MURG_ECOSM
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B6HZ67|MURG_ECOSE
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B7M133|MURG_ECO8A
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B7N7W3|MURG_ECOLU
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|Q326E5|MURG_SHIBS
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|Q3Z5R9|MURG_SHISS
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|Q32K02|MURG_SHIDS
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B2U295|MURG_SHIB3
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B1IR88|MURG_ECOLC
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B1XC67|MURG_ECODH
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|C4ZRI5|MURG_ECOBW
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|P17443|MURG_ECOLI
+1.7e-38 0 2 138 Glyco_transf_28 9 145 sp|A7ZW42|MURG_ECOHS
+6e-38 0 2 138 Glyco_transf_28 9 145 sp|A4TQ83|MURG_YERPP
+5.3 0 38 116 Glyco_transf_28 266 350 sp|A4TQ83|MURG_YERPP
+4.7e-38 0 1 138 Glyco_transf_28 3 142 sp|Q9CF92|MURG_LACLA
+5.8e-38 0 2 138 Glyco_transf_28 9 145 sp|B5R2M4|MURG_SALEP
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|Q0T8A7|MURG_SHIF8
+2.3e-38 0 2 138 Glyco_transf_28 9 145 sp|Q83MN4|MURG_SHIFL
+1.2e-37 0 1 138 Glyco_transf_28 8 145 sp|Q8CX35|MURG_SHEON
+2.6 0 54 117 Glyco_transf_28 285 357 sp|Q8CX35|MURG_SHEON
+1.7e-38 0 1 138 Glyco_transf_28 3 142 sp|B8DBP8|MURG_LISMH
+1.9e-38 0 1 138 Glyco_transf_28 3 142 sp|A0AKD5|MURG_LISW6
+2.3e-38 0 1 138 Glyco_transf_28 3 142 sp|Q9ZBA5|MURG_STRCO
+2.1e-38 0 1 138 Glyco_transf_28 3 142 sp|Q929Y2|MURG_LISIN
+2.1e-38 0 2 137 Glyco_transf_28 6 141 sp|B8F3B6|MURG_HAEPS
+2.5e-38 0 1 138 Glyco_transf_28 8 145 sp|Q0HE83|MURG_SHESM
+2.2e-38 0 1 138 Glyco_transf_28 3 142 sp|C1KWY8|MURG_LISMC
+2.2e-38 0 1 138 Glyco_transf_28 3 142 sp|Q71XX8|MURG_LISMF
+2.3e-38 0 2 138 Glyco_transf_28 10 146 sp|A1S2F9|MURG_SHEAM
+3.5e-38 0 2 137 Glyco_transf_28 7 142 sp|A5UCW8|MURG_HAEIE
+1.9e-36 0 2 138 Glyco_transf_28 4 142 sp|Q03QH5|MURG_LACBA
+1.6 0 63 130 Glyco_transf_28 295 355 sp|Q03QH5|MURG_LACBA
+3.9e-38 0 2 138 Glyco_transf_28 8 144 sp|Q8DEL0|MURG_VIBVU
+3.9e-38 0 2 138 Glyco_transf_28 8 144 sp|Q7MNV1|MURG_VIBVY
+4.4e-38 0 1 138 Glyco_transf_28 5 142 sp|Q3IFY0|MURG_PSEHT
+6.7e-38 0 2 138 Glyco_transf_28 9 145 sp|B7LFW0|MURG_ECO55
+4.2e-38 0 1 138 Glyco_transf_28 10 147 sp|B1KKX7|MURG_SHEWM
+7.4e-38 0 1 138 Glyco_transf_28 3 141 sp|Q49929|Y2348_MYCLE
+1.7e-37 0 2 138 Glyco_transf_28 9 145 sp|Q7N147|MURG_PHOLL
+1.4e-37 0 1 138 Glyco_transf_28 10 147 sp|A8H984|MURG_SHEPA
+1e-37 0 1 138 Glyco_transf_28 3 142 sp|Q820F6|MURG_STRAW
+3.4e-37 0 2 138 Glyco_transf_28 4 142 sp|Q1WTA0|MURG_LACS1
+1.4e-37 0 1 137 Glyco_transf_28 3 141 sp|Q9X4H4|MURG_STRCU
+1.3e-37 0 1 138 Glyco_transf_28 10 147 sp|Q12SC6|MURG_SHEDO
+1.1e-37 0 2 138 Glyco_transf_28 9 145 sp|P57817|MURG_PASMU
+1.9e-37 0 2 138 Glyco_transf_28 8 144 sp|Q87SG4|MURG_VIBPA
+2.5e-37 0 1 138 Glyco_transf_28 10 147 sp|B0TQN7|MURG_SHEHH
+3e-37 0 1 138 Glyco_transf_28 3 142 sp|C4L5U5|MURG_EXISA
+2.1e-37 0 1 138 Glyco_transf_28 6 143 sp|A9M2H3|MURG_NEIM0
+2e-37 0 2 138 Glyco_transf_28 8 144 sp|Q6LMF6|MURG_PHOPR
+3.1e-37 0 2 138 Glyco_transf_28 9 145 sp|Q5E2Q0|MURG_VIBF1
+2.8e-37 0 1 138 Glyco_transf_28 3 143 sp|P64865|Y1524_MYCTU
+2.8e-37 0 1 138 Glyco_transf_28 3 143 sp|P64866|Y1551_MYCBO
+3.1e-37 0 2 138 Glyco_transf_28 9 145 sp|B5FB35|MURG_VIBFM
+4.4e-36 0 2 138 Glyco_transf_28 4 142 sp|B2GB78|MURG_LACF3
+9 0 72 114 Glyco_transf_28 201 243 sp|B2GB78|MURG_LACF3
+3.6e-37 0 2 138 Glyco_transf_28 9 145 sp|B6ELH5|MURG_ALISL
+4.3e-37 0 2 138 Glyco_transf_28 4 140 sp|B8CWJ6|MURG_HALOH
+4e-37 0 2 138 Glyco_transf_28 8 144 sp|A7MXR6|MURG_VIBHB
+5.8e-36 0 2 138 Glyco_transf_28 4 142 sp|A5VJ33|MURG_LACRD
+5.7 0 64 129 Glyco_transf_28 299 357 sp|A5VJ33|MURG_LACRD
+5.8e-36 0 2 138 Glyco_transf_28 4 142 sp|B2G6K5|MURG_LACRJ
+5.7 0 64 129 Glyco_transf_28 299 357 sp|B2G6K5|MURG_LACRJ
+5.6e-37 0 1 138 Glyco_transf_28 4 143 sp|Q182Y6|MURG_CLOD6
+6.3e-37 0 2 135 Glyco_transf_28 9 142 sp|Q2NVV1|MURG_SODGM
+6.4e-37 0 1 138 Glyco_transf_28 11 148 sp|Q07WI5|MURG_SHEFN
+5.3e-37 0 1 138 Glyco_transf_28 6 143 sp|A1KVL3|MURG_NEIMF
+5.3e-37 0 1 138 Glyco_transf_28 6 143 sp|Q9K0Y2|MURG_NEIMB
+9.9e-37 0 1 138 Glyco_transf_28 10 147 sp|B8CNL1|MURG_SHEPW
+2.5e-36 0 2 138 Glyco_transf_28 6 142 sp|C4LA25|MURG_TOLAT
+1.1e-36 0 1 138 Glyco_transf_28 10 147 sp|Q9F1N0|MURG_SHEVI
+1.2e-36 0 2 138 Glyco_transf_28 9 145 sp|A5F5M9|MURG_VIBC3
+1.7e-36 0 1 137 Glyco_transf_28 3 141 sp|Q03W35|MURG_LEUMM
+7.9e-37 0 1 138 Glyco_transf_28 7 146 sp|A3Q1L8|MURG_MYCSJ
+7.9e-37 0 1 138 Glyco_transf_28 7 146 sp|A1UI54|MURG_MYCSK
+7.9e-37 0 1 138 Glyco_transf_28 7 146 sp|Q1B6X1|MURG_MYCSS
+6.9e-37 0 2 138 Glyco_transf_28 9 145 sp|C3LQU6|MURG_VIBCM
+6.9e-37 0 2 138 Glyco_transf_28 9 145 sp|Q9KPG7|MURG_VIBCH
+1.4e-36 0 1 138 Glyco_transf_28 10 147 sp|A8FQA0|MURG_SHESH
+2.9e-36 0 1 138 Glyco_transf_28 6 143 sp|B4RQC5|MURG_NEIG2
+2.9e-36 0 1 138 Glyco_transf_28 6 143 sp|Q5F6L8|MURG_NEIG1
+2.8e-36 0 1 138 Glyco_transf_28 3 142 sp|B1I4C4|MURG_DESAP
+1.4e-36 0 1 134 Glyco_transf_28 4 137 sp|Q6A9Q2|MURG_PROAC
+1.2e-35 0 2 138 Glyco_transf_28 4 142 sp|B3WDY2|MURG_LACCB
+1.2e-35 0 2 138 Glyco_transf_28 4 142 sp|Q039R7|MURG_LACC3
+1e-35 0 2 138 Glyco_transf_28 4 142 sp|A4J2B1|MURG_DESRM
+4.1e-36 0 2 137 Glyco_transf_28 17 152 sp|Q47VQ9|MURG_COLP3
+3.6e-36 0 1 135 Glyco_transf_28 3 139 sp|B2A2H2|MURG_NATTJ
+4.2e-36 0 1 130 Glyco_transf_28 6 135 sp|Q6NGC8|MURG_CORDI
+5.1e-36 0 1 138 Glyco_transf_28 5 142 sp|B4RWX9|MURG_ALTMD
+6.5e-36 0 1 138 Glyco_transf_28 6 143 sp|Q9JSZ7|MURG_NEIMA
+9.2e-35 0 1 130 Glyco_transf_28 8 137 sp|B0KFS6|MURG_PSEPG
+7.8 0 34 55 Glyco_transf_28 209 258 sp|B0KFS6|MURG_PSEPG
+8.9e-36 0 1 137 Glyco_transf_28 5 141 sp|A4XQS4|MURG_PSEMY
+9e-36 0 1 137 Glyco_transf_28 5 141 sp|Q48EF8|MURG_PSE14
+4.6e-36 0 2 138 Glyco_transf_28 4 142 sp|Q8R9G6|MURG_THETN
+8.3e-35 0 1 130 Glyco_transf_28 8 137 sp|A5W8Q0|MURG_PSEP1
+5.5e-35 0 1 134 Glyco_transf_28 8 141 sp|Q1I5B8|MURG_PSEE4
+1.2e-35 0 1 137 Glyco_transf_28 5 141 sp|Q87WY5|MURG_PSESM
+1e-35 0 1 138 Glyco_transf_28 4 141 sp|C3L230|MURG_CLOB6
+1.2e-35 0 2 138 Glyco_transf_28 52 188 sp|A1WC06|MURG_ACISJ
+1.2e-35 0 2 138 Glyco_transf_28 52 188 sp|B9MFR2|MURG_DIAST
+6.3e-36 0 1 138 Glyco_transf_28 31 175 sp|B8ZQQ0|MURG_MYCLB
+6.3e-36 0 1 138 Glyco_transf_28 31 175 sp|O69552|MURG_MYCLE
+3.6e-35 0 1 138 Glyco_transf_28 5 142 sp|Q893R7|MURG_CLOTE
+1.2e-35 0 1 138 Glyco_transf_28 4 141 sp|A7GGX9|MURG_CLOBL
+1.2e-35 0 1 138 Glyco_transf_28 4 141 sp|B1IKH3|MURG_CLOBK
+1.2e-35 0 1 138 Glyco_transf_28 4 141 sp|C1FUF9|MURG_CLOBJ
+1.2e-35 0 1 138 Glyco_transf_28 4 141 sp|A5I5J5|MURG_CLOBH
+1.2e-35 0 1 138 Glyco_transf_28 4 141 sp|A7FX11|MURG_CLOB1
+1.3e-35 0 1 137 Glyco_transf_28 5 141 sp|Q4ZNZ0|MURG_PSEU2
+7.7e-35 0 1 138 Glyco_transf_28 8 147 sp|A4XI04|MURG_CALS8
+2e-35 0 1 138 Glyco_transf_28 17 161 sp|A0R016|MURG_MYCS2
+3.5e-35 0 1 137 Glyco_transf_28 3 143 sp|A8YUN9|MURG_LACH4
+9.9e-36 0 1 139 Glyco_transf_28 3 143 sp|A1SL80|MURG_NOCSJ
+1.3e-34 0 1 130 Glyco_transf_28 8 137 sp|Q88N76|MURG_PSEPK
+2.4e-35 0 1 138 Glyco_transf_28 4 141 sp|B1KYH7|MURG_CLOBM
+2.7e-35 0 1 138 Glyco_transf_28 3 142 sp|Q24TE6|MURG_DESHY
+3.1e-35 0 1 137 Glyco_transf_28 5 141 sp|Q3K744|MURG_PSEPF
+3e-34 0 1 130 Glyco_transf_28 8 137 sp|B1J3L2|MURG_PSEPW
+2e-34 0 2 138 Glyco_transf_28 4 142 sp|B0K3H0|MURG_THEPX
+2e-34 0 2 138 Glyco_transf_28 4 142 sp|B0K8K7|MURG_THEP3
+2.7e-34 0 1 138 Glyco_transf_28 3 142 sp|A3DE27|MURG_CLOTH
+4.1e-35 0 1 138 Glyco_transf_28 32 175 sp|A1TAW8|MURG_MYCVP
+1.3e-34 0 1 138 Glyco_transf_28 3 142 sp|B8FT56|MURG_DESHD
+4.1e-35 0 1 137 Glyco_transf_28 4 141 sp|Q9RWP0|MURG_DEIRA
+3.1e-34 0 1 135 Glyco_transf_28 12 146 sp|B2I1J5|MURG_ACIBC
+3.1e-34 0 1 135 Glyco_transf_28 12 146 sp|B0V9F5|MURG_ACIBY
+3.1e-34 0 1 135 Glyco_transf_28 12 146 sp|B7GV73|MURG_ACIB3
+3.1e-34 0 1 135 Glyco_transf_28 12 146 sp|B7ICE5|MURG_ACIB5
+4.4e-35 0 1 138 Glyco_transf_28 3 142 sp|A5D145|MURG_PELTS
+3.1e-34 0 1 135 Glyco_transf_28 12 146 sp|A3M9Y1|MURG_ACIBT
+1.1e-34 0 1 134 Glyco_transf_28 4 137 sp|A9KK83|MURG_CLOPH
+1.3e-34 0 1 134 Glyco_transf_28 5 138 sp|C3KCT0|MURG_PSEFS
+1.7e-34 0 2 138 Glyco_transf_28 4 142 sp|Q03EY2|MURG_PEDPA
+2.2e-34 0 1 138 Glyco_transf_28 34 178 sp|A0QF52|MURG_MYCA1
+3.7e-33 0 1 137 Glyco_transf_28 3 143 sp|Q04B72|MURG_LACDB
+7.8 0 71 102 Glyco_transf_28 204 235 sp|Q04B72|MURG_LACDB
+3.7e-33 0 1 137 Glyco_transf_28 3 143 sp|Q1GAT5|MURG_LACDA
+7.8 0 71 102 Glyco_transf_28 204 235 sp|Q1GAT5|MURG_LACDA
+1.6e-34 0 1 134 Glyco_transf_28 5 138 sp|Q4K6J3|MURG_PSEF5
+1e-33 0 1 135 Glyco_transf_28 12 146 sp|B0VNZ9|MURG_ACIBS
+8.8e-34 0 1 137 Glyco_transf_28 3 143 sp|Q5FKV2|MURG_LACAC
+1.3e-33 0 2 138 Glyco_transf_28 6 142 sp|A0KPX2|MURG_AERHH
+2.4e-34 0 1 132 Glyco_transf_28 6 137 sp|A1WYU3|MURG_HALHL
+5.5e-34 0 1 138 Glyco_transf_28 34 178 sp|Q73YQ8|MURG_MYCPA
+3.9e-34 0 1 137 Glyco_transf_28 3 141 sp|B1MXW0|MURG_LEUCK
+6.1e-34 0 1 138 Glyco_transf_28 5 142 sp|Q604V7|MURG_METCA
+4.2e-34 0 1 134 Glyco_transf_28 6 139 sp|B2V1X5|MURG_CLOBA
+6e-34 0 1 137 Glyco_transf_28 9 145 sp|A1U3F8|MURG_MARAV
+4.4e-33 0 1 138 Glyco_transf_28 3 142 sp|A8MH36|MURG_ALKOO
+9.3e-34 0 1 136 Glyco_transf_28 6 141 sp|B2TLE0|MURG_CLOBB
+2.7e-33 0 2 138 Glyco_transf_28 6 142 sp|A4SI56|MURG_AERS4
+2.2e-33 0 1 137 Glyco_transf_28 4 140 sp|C4Z1B5|MURG_EUBE2
+1.2e-33 0 1 136 Glyco_transf_28 5 140 sp|C1DQ99|MURG_AZOVD
+3.2e-33 0 1 137 Glyco_transf_28 12 148 sp|Q6F703|MURG_ACIAD
+9.4e-34 0 1 138 Glyco_transf_28 3 141 sp|B1YIT7|MURG_EXIS2
+2.1e-33 0 1 137 Glyco_transf_28 4 141 sp|C1CW40|MURG_DEIDV
+3.3e-33 0 1 132 Glyco_transf_28 3 136 sp|Q47QW9|MURG_THEFY
+1.6e-33 0 1 138 Glyco_transf_28 6 143 sp|A0Q182|MURG_CLONN
+9.4e-34 0 1 138 Glyco_transf_28 38 185 sp|A1KKJ6|MURG_MYCBP
+9.4e-34 0 1 138 Glyco_transf_28 38 185 sp|C1AQ69|MURG_MYCBT
+9.4e-34 0 1 138 Glyco_transf_28 38 185 sp|Q7VEP8|MURG_MYCBO
+1.8e-33 0 1 138 Glyco_transf_28 3 142 sp|B0S0Z5|MURG_FINM2
+8.7e-33 0 1 137 Glyco_transf_28 5 141 sp|B7UZJ0|MURG_PSEA8
+8.7e-33 0 1 137 Glyco_transf_28 5 141 sp|Q02H28|MURG_PSEAB
+8.7e-33 0 1 137 Glyco_transf_28 5 141 sp|Q9HW01|MURG_PSEAE
+1.4e-33 0 1 138 Glyco_transf_28 22 166 sp|A0PTI7|MURG_MYCUA
+8.7e-33 0 1 137 Glyco_transf_28 5 141 sp|A6VB85|MURG_PSEA7
+2.6e-33 0 1 135 Glyco_transf_28 4 137 sp|A9KER3|MURG_COXBN
+2.6e-33 0 1 135 Glyco_transf_28 4 137 sp|A9NA44|MURG_COXBR
+2.6e-33 0 1 135 Glyco_transf_28 4 137 sp|B6J2Q3|MURG_COXB2
+2.6e-33 0 1 135 Glyco_transf_28 4 137 sp|B6J5K3|MURG_COXB1
+2.6e-33 0 1 135 Glyco_transf_28 4 137 sp|Q820X3|MURG_COXBU
+5.2e-33 0 1 137 Glyco_transf_28 3 143 sp|Q042P9|MURG_LACGA
+1.7e-33 0 1 138 Glyco_transf_28 22 166 sp|B2HGR6|MURG_MYCMM
+4.8e-33 0 1 132 Glyco_transf_28 5 136 sp|Q0VS02|MURG_ALCBS
+1.9e-33 0 1 133 Glyco_transf_28 5 139 sp|Q0RNP1|MURG_FRAAA
+3.7e-33 0 1 131 Glyco_transf_28 3 135 sp|Q2RK79|MURG_MOOTA
+2.2e-33 0 1 137 Glyco_transf_28 4 141 sp|Q1IXV9|MURG_DEIGD
+9.8e-33 0 1 137 Glyco_transf_28 3 143 sp|Q74JY4|MURG_LACJO
+6.9e-33 0 1 138 Glyco_transf_28 4 141 sp|A5MZ55|MURG_CLOK5
+6.5e-33 0 2 138 Glyco_transf_28 8 144 sp|A1TKD1|MURG_ACIAC
+7.6e-33 0 1 139 Glyco_transf_28 7 148 sp|B7J0L2|MURG_BORBZ
+7.6e-33 0 1 139 Glyco_transf_28 7 148 sp|O51708|MURG_BORBU
+7.4e-33 0 2 138 Glyco_transf_28 16 152 sp|Q15Q17|MURG_PSEA6
+1e-32 0 2 138 Glyco_transf_28 743 878 sp|A7A179|ATG26_YEAS7
+8.5e-33 0 1 137 Glyco_transf_28 4 142 sp|Q1D0T0|MURG_MYXXD
+4.5e-33 0 1 138 Glyco_transf_28 9 146 sp|Q1QVG7|MURG_CHRSD
+4.6e-33 0 1 132 Glyco_transf_28 5 136 sp|A4VIH8|MURG_PSEU5
+1.5e-32 0 3 138 Glyco_transf_28 2 143 sp|Q38XM8|MURG_LACSS
+1.5e-32 0 2 138 Glyco_transf_28 8 144 sp|A1SU19|MURG_PSYIN
+1.3e-32 0 1 138 Glyco_transf_28 4 141 sp|Q31I59|MURG_THICR
+1.5e-32 0 1 138 Glyco_transf_28 3 142 sp|Q04ET0|MURG_OENOB
+6.1e-33 0 1 138 Glyco_transf_28 6 143 sp|Q2KVG0|MURG_BORA1
+1.3e-32 0 1 138 Glyco_transf_28 4 142 sp|Q5R0M1|MURG_IDILO
+1.8e-32 0 1 136 Glyco_transf_28 4 139 sp|Q5WAE4|MURG_BACSK
+2.4e-32 0 1 131 Glyco_transf_28 5 137 sp|Q2JD50|MURG_FRASC
+1.6e-32 0 1 138 Glyco_transf_28 5 142 sp|B5ELC3|MURG_ACIF5
+1.6e-32 0 1 138 Glyco_transf_28 5 142 sp|B7J3V2|MURG_ACIF2
+1.4e-32 0 1 139 Glyco_transf_28 7 148 sp|Q0SM88|MURG_BORAP
+1.9e-32 0 1 138 Glyco_transf_28 6 143 sp|Q4FQV9|MURG_PSYA2
+5.1e-32 0 1 138 Glyco_transf_28 4 141 sp|Q730T5|MURG2_BACC1
+4.6e-32 0 2 138 Glyco_transf_28 7 143 sp|Q1LSW5|MURG_BAUCH
+1.7e-32 0 1 139 Glyco_transf_28 4 146 sp|Q9WY74|MURG_THEMA
+1.7e-32 0 1 139 Glyco_transf_28 4 146 sp|B1L9S1|MURG_THESQ
+1.7e-32 0 1 139 Glyco_transf_28 4 146 sp|A5IKI9|MURG_THEP1
+2.6e-32 0 1 138 Glyco_transf_28 22 160 sp|A4FLW0|MURG_SACEN
+2.3e-32 0 2 138 Glyco_transf_28 8 142 sp|Q9RNM6|MURG_ZYMMO
+3.5e-32 0 2 138 Glyco_transf_28 743 878 sp|Q06321|ATG26_YEAST
+2.2e-32 0 1 138 Glyco_transf_28 15 152 sp|Q9PF81|MURG_XYLFA
+1.4e-32 0 1 138 Glyco_transf_28 21 158 sp|Q5GW41|MURG_XANOR
+2.5e-32 0 1 139 Glyco_transf_28 15 154 sp|B2S3B6|MURG_TREPS
+2.5e-32 0 1 139 Glyco_transf_28 15 154 sp|O83535|MURG_TREPA
+3e-32 0 3 138 Glyco_transf_28 2 137 sp|Q0AJE1|MURG_NITEC
+1.8e-32 0 1 138 Glyco_transf_28 6 143 sp|B3PCM0|MURG_CELJU
+3.6e-32 0 2 139 Glyco_transf_28 4 143 sp|A5G8K0|MURG_GEOUR
+2.2e-32 0 1 138 Glyco_transf_28 38 185 sp|A5U4I0|MURG_MYCTA
+2.2e-32 0 1 138 Glyco_transf_28 38 185 sp|O06224|MURG_MYCTU
+2.3e-32 0 1 130 Glyco_transf_28 13 144 sp|Q4JW95|MURG_CORJK
+5.8e-32 0 1 137 Glyco_transf_28 6 142 sp|Q97GY4|MURG_CLOAB
+4.5e-32 0 1 137 Glyco_transf_28 8 142 sp|Q9Z702|MURG_CHLPN
+5e-32 0 1 138 Glyco_transf_28 6 143 sp|Q1Q944|MURG_PSYCK
+9.8e-32 0 1 137 Glyco_transf_28 10 145 sp|C0RE70|MURG_BRUMB
+9.8e-32 0 1 137 Glyco_transf_28 10 145 sp|Q8YI66|MURG_BRUME
+6.7e-32 0 1 138 Glyco_transf_28 22 159 sp|Q3BXF2|MURG_XANC5
+9.8e-32 0 1 137 Glyco_transf_28 10 145 sp|B2S6Q4|MURG_BRUA1
+9.8e-32 0 1 137 Glyco_transf_28 10 145 sp|Q2YLY5|MURG_BRUA2
+9.8e-32 0 1 137 Glyco_transf_28 10 145 sp|Q57C78|MURG_BRUAB
+7.2e-32 0 1 138 Glyco_transf_28 7 147 sp|Q660A8|MURG_BORGA
+6.7e-32 0 1 137 Glyco_transf_28 3 141 sp|B8I6H3|MURG_CLOCE
+9.8e-32 0 1 137 Glyco_transf_28 10 145 sp|A5VRH7|MURG_BRUO2
+9.8e-32 0 1 137 Glyco_transf_28 10 145 sp|B0CHM0|MURG_BRUSI
+7.1e-32 0 1 133 Glyco_transf_28 8 142 sp|A0JV94|MURG_ARTS2
+7.2e-32 0 1 138 Glyco_transf_28 3 142 sp|A6TS61|MURG_ALKMQ
+7.1e-32 0 1 137 Glyco_transf_28 5 142 sp|C5D4C2|MURG_GEOSW
+9.8e-32 0 1 137 Glyco_transf_28 10 145 sp|A9M690|MURG_BRUC2
+1.1e-31 0 1 138 Glyco_transf_28 21 158 sp|Q8PPA8|MURG_XANAC
+9.8e-32 0 1 137 Glyco_transf_28 10 145 sp|Q8CY39|MURG_BRUSU
+8.9e-32 0 2 138 Glyco_transf_28 8 144 sp|A1WRL1|MURG_VEREI
+2.4e-31 0 1 138 Glyco_transf_28 4 141 sp|Q812T8|MURG2_BACCR
+8.4e-32 0 1 138 Glyco_transf_28 15 152 sp|B0U4Z7|MURG_XYLFM
+9.4e-32 0 1 137 Glyco_transf_28 5 142 sp|A4IJS4|MURG_GEOTN
+5.8e-32 0 1 138 Glyco_transf_28 21 158 sp|Q2NZB8|MURG_XANOM
+1.3e-31 0 1 137 Glyco_transf_28 6 144 sp|A5FIY3|MURG_FLAJ1
+2.8e-31 0 2 139 Glyco_transf_28 9 146 sp|Q39JX0|MURG_BURS3
+1.7e-31 0 1 138 Glyco_transf_28 10 155 sp|C1A0X5|MURG_RHOE4
+3.3e-31 0 2 138 Glyco_transf_28 4 142 sp|Q748D6|MURG_GEOSL
+2.4e-31 0 1 137 Glyco_transf_28 4 140 sp|Q820Y4|MURG_TROWT
+2.4e-31 0 1 137 Glyco_transf_28 4 140 sp|Q83HK1|MURG_TROW8
+2.3e-31 0 1 129 Glyco_transf_28 3 132 sp|A4QFM3|MURG_CORGB
+3.1e-31 0 2 138 Glyco_transf_28 4 142 sp|Q39YL9|MURG_GEOMG
+2.2e-31 0 1 139 Glyco_transf_28 7 148 sp|A1R0I9|MURG_BORT9
+3.5e-31 0 2 137 Glyco_transf_28 4 141 sp|Q3AAE6|MURG_CARHZ
+2.3e-31 0 1 129 Glyco_transf_28 3 132 sp|Q8NNN5|MURG_CORGL
+3.5e-31 0 1 135 Glyco_transf_28 6 140 sp|Q0TNP7|MURG_CLOP1
+3.5e-31 0 1 135 Glyco_transf_28 6 140 sp|Q8XIQ1|MURG_CLOPE
+3.5e-31 0 1 135 Glyco_transf_28 6 140 sp|Q0SRB4|MURG_CLOPS
+3.4e-31 0 1 138 Glyco_transf_28 17 162 sp|Q5YYX9|MURG_NOCFA
+2.6e-31 0 2 138 Glyco_transf_28 4 142 sp|A7HH67|MURG_ANADF
+4.7e-31 0 3 138 Glyco_transf_28 2 137 sp|Q82VS3|MURG_NITEU
+2.4e-31 0 1 138 Glyco_transf_28 22 159 sp|B0RVA5|MURG_XANCB
+5.2e-31 0 2 139 Glyco_transf_28 9 146 sp|Q2SZI3|MURG_BURTA
+3.2e-31 0 1 137 Glyco_transf_28 6 141 sp|Q11GS5|MURG_MESSB
+2.4e-31 0 1 138 Glyco_transf_28 22 159 sp|Q4UQX0|MURG_XANC8
+2.4e-31 0 1 138 Glyco_transf_28 22 159 sp|Q8PCK0|MURG_XANCP
+6e-31 0 2 139 Glyco_transf_28 9 146 sp|A3NZL5|MURG_BURP0
+2.9e-31 0 1 137 Glyco_transf_28 6 141 sp|Q98KB3|MURG_RHILO
+6.2e-31 0 1 138 Glyco_transf_28 5 142 sp|Q0A6K2|MURG_ALHEH
+6.1e-31 0 1 137 Glyco_transf_28 5 141 sp|A5IGA6|MURG_LEGPC
+4.7e-31 0 1 137 Glyco_transf_28 5 142 sp|Q5L3H6|MURG_GEOKA
+5.2e-31 0 1 135 Glyco_transf_28 3 139 sp|A0LTM3|MURG_ACIC1
+7.6e-31 0 2 137 Glyco_transf_28 4 141 sp|Q3A2G6|MURG_PELCD
+9.8e-30 0 1 136 Glyco_transf_28 3 140 sp|Q0AYQ8|MURG_SYNWW
+1.3e-30 0 2 138 Glyco_transf_28 7 143 sp|Q1LIM6|MURG_RALME
+3.7e-30 0 1 137 Glyco_transf_28 6 141 sp|Q92NL9|MURG_RHIME
+3.9e-30 0 1 135 Glyco_transf_28 2 134 sp|Q72JP9|MURG_THET2
+5e-31 0 1 138 Glyco_transf_28 14 153 sp|A1R5F8|MURG_ARTAT
+8.6e-31 0 1 138 Glyco_transf_28 12 149 sp|Q87AF9|MURG_XYLFT
+8.8e-31 0 1 138 Glyco_transf_28 15 152 sp|B2I9B3|MURG_XYLF2
+9.9e-31 0 1 137 Glyco_transf_28 6 141 sp|A6WZQ6|MURG_OCHA4
+1.5e-30 0 2 139 Glyco_transf_28 9 146 sp|A1V0R8|MURG_BURMS
+1.5e-30 0 2 139 Glyco_transf_28 9 146 sp|A2S5U5|MURG_BURM9
+1.5e-30 0 2 139 Glyco_transf_28 9 146 sp|A3MR63|MURG_BURM7
+1.5e-30 0 2 139 Glyco_transf_28 9 146 sp|Q62GS7|MURG_BURMA
+1.5e-30 0 2 139 Glyco_transf_28 9 146 sp|Q63QJ7|MURG_BURPS
+1.5e-30 0 2 139 Glyco_transf_28 9 146 sp|A3NDW4|MURG_BURP6
+1.6e-30 0 1 132 Glyco_transf_28 5 136 sp|Q3J789|MURG_NITOC
+1.1e-30 0 1 135 Glyco_transf_28 6 140 sp|Q8K9T4|MURG_BUCAP
+1.4e-30 0 2 139 Glyco_transf_28 4 143 sp|B9M172|MURG_GEOSF
+1.9e-30 0 2 139 Glyco_transf_28 4 143 sp|B5EBQ1|MURG_GEOBB
+1.9e-30 0 2 139 Glyco_transf_28 9 146 sp|Q3JND8|MURG_BURP1
+1.5e-30 0 2 137 Glyco_transf_28 4 140 sp|Q1IKH0|MURG_ACIBL
+2.6e-30 0 2 138 Glyco_transf_28 8 141 sp|P74657|MURG_SYNY3
+1.7e-30 0 2 139 Glyco_transf_28 9 146 sp|B1YSS4|MURG_BURA4
+1.7e-30 0 2 139 Glyco_transf_28 9 146 sp|Q0BIK1|MURG_BURCM
+3.9e-30 0 1 138 Glyco_transf_28 4 141 sp|Q6HDR3|MURG2_BACHK
+3.9e-30 0 1 138 Glyco_transf_28 4 141 sp|Q81JE6|MURG2_BACAN
+2.3e-30 0 2 138 Glyco_transf_28 8 144 sp|Q0K6M4|MURG_RALEH
+2.6e-30 0 1 137 Glyco_transf_28 5 141 sp|Q5WY98|MURG_LEGPL
+3.9e-30 0 1 138 Glyco_transf_28 4 141 sp|A0RIN0|MURG3_BACAH
+2.9e-30 0 1 138 Glyco_transf_28 6 143 sp|Q7W4B4|MURG_BORPA
+2.6e-30 0 1 137 Glyco_transf_28 5 141 sp|Q5X6U5|MURG_LEGPA
+2.6e-30 0 1 137 Glyco_transf_28 5 141 sp|Q5ZXC4|MURG_LEGPH
+2e-30 0 1 136 Glyco_transf_28 6 141 sp|A6M1F0|MURG_CLOB8
+2e-30 0 1 135 Glyco_transf_28 6 140 sp|B8D7B9|MURG_BUCAT
+2e-30 0 1 135 Glyco_transf_28 6 140 sp|P57311|MURG_BUCAI
+3.6e-30 0 1 138 Glyco_transf_28 6 143 sp|Q7VUQ3|MURG_BORPE
+3.6e-30 0 1 138 Glyco_transf_28 6 143 sp|Q7WFS2|MURG_BORBR
+6.3e-30 0 2 139 Glyco_transf_28 10 147 sp|B2SYX6|MURG_BURPP
+2.9e-30 0 1 137 Glyco_transf_28 7 141 sp|B0B8Y7|MURG_CHLT2
+2.9e-30 0 1 137 Glyco_transf_28 7 141 sp|B0BAL6|MURG_CHLTB
+2.6e-30 0 1 135 Glyco_transf_28 6 140 sp|B8D914|MURG_BUCA5
+4.2e-30 0 1 138 Glyco_transf_28 5 142 sp|Q47AA4|MURG_DECAR
+4.1e-30 0 2 139 Glyco_transf_28 9 146 sp|A4JB94|MURG_BURVG
+4e-30 0 1 138 Glyco_transf_28 5 142 sp|Q2Y638|MURG_NITMU
+4.6e-30 0 2 139 Glyco_transf_28 10 147 sp|B2JHG0|MURG_BURP8
+4.6e-30 0 1 137 Glyco_transf_28 7 141 sp|O84766|MURG_CHLTR
+4.6e-30 0 1 137 Glyco_transf_28 7 141 sp|Q3KKT1|MURG_CHLTA
+6.2e-30 0 2 138 Glyco_transf_28 4 142 sp|A1AU61|MURG_PELPD
+6.3e-30 0 1 138 Glyco_transf_28 5 144 sp|Q2LR48|MURG_SYNAS
+5.6e-30 0 2 138 Glyco_transf_28 9 143 sp|Q2G995|MURG_NOVAD
+7.5e-30 0 2 138 Glyco_transf_28 9 145 sp|A5EY03|MURG_DICNV
+3.6e-30 0 1 130 Glyco_transf_28 10 140 sp|Q8FNU0|MURG_COREF
+8.1e-30 0 2 139 Glyco_transf_28 9 146 sp|A9AI96|MURG_BURM1
+6.9e-30 0 2 138 Glyco_transf_28 36 177 sp|Q21SW9|MURG_RHOFD
+8.8e-30 0 1 138 Glyco_transf_28 3 142 sp|B5YFT4|MURG_THEYD
+1.2e-29 0 1 138 Glyco_transf_28 790 924 sp|A7KAK6|ATG26_PICAN
+1.2e-29 0 2 138 Glyco_transf_28 8 144 sp|Q46WZ4|MURG_RALEJ
+2e-29 0 2 139 Glyco_transf_28 10 147 sp|Q13TZ2|MURG_BURXL
+1.9e-29 0 2 139 Glyco_transf_28 4 143 sp|C6DZK6|MURG_GEOSM
+1.4e-29 0 1 138 Glyco_transf_28 4 135 sp|A8GVJ7|MURG_RICB8
+1.4e-29 0 1 138 Glyco_transf_28 4 135 sp|Q1RI55|MURG_RICBR
+9.1e-29 0 1 137 Glyco_transf_28 6 141 sp|B5ZWJ4|MURG_RHILW
+1.8e-29 0 2 138 Glyco_transf_28 9 142 sp|B0JFZ1|MURG_MICAN
+2.3e-29 0 2 138 Glyco_transf_28 9 141 sp|Q31KS7|MURG_SYNE7
+2.4e-29 0 2 138 Glyco_transf_28 15 147 sp|Q5N140|MURG_SYNP6
+2.9e-29 0 1 137 Glyco_transf_28 8 143 sp|Q14I26|MURG_FRAT1
+2.9e-29 0 1 137 Glyco_transf_28 8 143 sp|Q5NGM4|MURG_FRATT
+2.6e-29 0 1 138 Glyco_transf_28 7 144 sp|Q493Q1|MURG_BLOPB
+1.9e-29 0 1 138 Glyco_transf_28 4 135 sp|Q92I58|MURG_RICCN
+1.9e-29 0 1 138 Glyco_transf_28 4 135 sp|C3PND5|MURG_RICAE
+1.9e-29 0 1 138 Glyco_transf_28 4 135 sp|C4K2A6|MURG_RICPU
+1.8e-29 0 1 139 Glyco_transf_28 7 148 sp|B2S1A8|MURG_BORHD
+1.9e-29 0 1 138 Glyco_transf_28 4 135 sp|A8GRZ6|MURG_RICRS
+1.9e-29 0 1 138 Glyco_transf_28 4 135 sp|B0BXF6|MURG_RICRO
+2.7e-29 0 2 138 Glyco_transf_28 9 145 sp|Q3SMH3|MURG_THIDA
+3.1e-29 0 1 138 Glyco_transf_28 32 175 sp|Q21MG9|MURG_SACD2
+1.2e-28 0 1 138 Glyco_transf_28 4 143 sp|B1IAM4|MURG_STRPI
+1.2e-28 0 1 138 Glyco_transf_28 4 143 sp|Q04LK0|MURG_STRP2
+1.2e-28 0 1 138 Glyco_transf_28 4 143 sp|Q8DQM1|MURG_STRR6
+1.2e-28 0 1 138 Glyco_transf_28 4 143 sp|B2IN77|MURG_STRPS
+1.2e-28 0 1 138 Glyco_transf_28 4 143 sp|C1CQG5|MURG_STRZT
+1.2e-28 0 1 138 Glyco_transf_28 4 143 sp|C1CD52|MURG_STRZJ
+4.3e-29 0 1 138 Glyco_transf_28 4 141 sp|Q634T3|MURG2_BACCZ
+3.1e-29 0 2 138 Glyco_transf_28 8 149 sp|A1VST6|MURG_POLNA
+6.1e-29 0 1 136 Glyco_transf_28 6 140 sp|A6UB85|MURG_SINMW
+9.8e-29 0 1 138 Glyco_transf_28 4 143 sp|B9DNZ7|MURG_STACT
+4.6e-29 0 2 139 Glyco_transf_28 9 146 sp|B4E6J2|MURG_BURCJ
+4.6e-29 0 2 139 Glyco_transf_28 9 146 sp|B1JV78|MURG_BURCC
+1.2e-28 0 1 138 Glyco_transf_28 4 143 sp|C1C649|MURG_STRP7
+5.3e-29 0 1 135 Glyco_transf_28 6 140 sp|Q2S9Z2|MURG_HAHCH
+1.3e-28 0 1 138 Glyco_transf_28 4 143 sp|B5E2Z9|MURG_STRP4
+1.3e-28 0 1 138 Glyco_transf_28 4 143 sp|C1CJF3|MURG_STRZP
+4.4e-29 0 1 138 Glyco_transf_28 6 143 sp|A9I4V2|MURG_BORPD
+2.3e-29 0 2 137 Glyco_transf_28 5 142 sp|B0RIJ3|MURG_CLAMS
+1.9e-28 0 1 138 Glyco_transf_28 4 143 sp|P0CB60|MURG_STRPN
+1.9e-28 0 1 138 Glyco_transf_28 4 143 sp|B8ZMZ7|MURG_STRPJ
+2e-28 0 1 137 Glyco_transf_28 6 141 sp|B3PTW0|MURG_RHIE6
+5.8e-29 0 1 138 Glyco_transf_28 10 155 sp|Q0SHS1|MURG_RHOSR
+5.4e-29 0 1 139 Glyco_transf_28 4 143 sp|Q313Q3|MURG_DESDG
+5.4e-29 0 1 138 Glyco_transf_28 4 135 sp|A8F1I4|MURG_RICM5
+4.5e-29 0 1 138 Glyco_transf_28 6 145 sp|A6H195|MURG_FLAPJ
+4.6e-29 0 2 139 Glyco_transf_28 9 146 sp|A0K486|MURG_BURCH
+4.6e-29 0 2 139 Glyco_transf_28 9 146 sp|Q1BZG3|MURG_BURCA
+6e-29 0 2 138 Glyco_transf_28 35 176 sp|Q12EL5|MURG_POLSJ
+7.9e-29 0 1 137 Glyco_transf_28 6 141 sp|Q8UDM8|MURG_AGRT5
+6.1e-29 0 2 138 Glyco_transf_28 5 138 sp|B7K5Z6|MURG_CYAP8
+1.4e-28 0 2 137 Glyco_transf_28 9 142 sp|Q2NCZ0|MURG_ERYLH
+1.3e-28 0 1 138 Glyco_transf_28 763 897 sp|Q9Y751|ATG26_PICPG
+7.5e-29 0 2 138 Glyco_transf_28 5 141 sp|Q5P6Z6|MURG_AZOSE
+7.6e-29 0 1 137 Glyco_transf_28 6 140 sp|B6IRG2|MURG_RHOCS
+7e-29 0 2 138 Glyco_transf_28 760 895 sp|A7TF84|ATG26_VANPO
+3.1e-28 0 1 138 Glyco_transf_28 8 147 sp|Q2S528|MURG_SALRD
+1.2e-28 0 1 137 Glyco_transf_28 8 143 sp|B2SGS8|MURG_FRATM
+1.2e-28 0 1 137 Glyco_transf_28 8 143 sp|A4IX64|MURG_FRATW
+1.1e-28 0 2 139 Glyco_transf_28 4 143 sp|Q67Q48|MURG_SYMTH
+1.2e-28 0 1 138 Glyco_transf_28 997 1131 sp|Q6C8M8|ATG26_YARLI
+1.2e-28 0 1 138 Glyco_transf_28 10 155 sp|C1AU55|MURG_RHOOB
+1.2e-28 0 2 139 Glyco_transf_28 4 143 sp|B3E3Y2|MURG_GEOLS
+1.4e-28 0 1 137 Glyco_transf_28 8 143 sp|A0Q766|MURG_FRATN
+8.7e-29 0 2 138 Glyco_transf_28 5 138 sp|B1WVP7|MURG_CYAA5
+1.2e-28 0 1 137 Glyco_transf_28 8 143 sp|B0TY93|MURG_FRAP2
+1.5e-28 0 1 138 Glyco_transf_28 4 135 sp|Q68WW7|MURG_RICTY
+1.3e-28 0 1 138 Glyco_transf_28 4 143 sp|Q6GGZ0|MURG_STAAR
+2.4e-28 0 1 136 Glyco_transf_28 6 140 sp|B9JH51|MURG_AGRRK
+2.1e-28 0 1 138 Glyco_transf_28 1050 1184 sp|Q6BN88|ATG26_DEBHA
+2.8e-28 0 1 137 Glyco_transf_28 8 143 sp|A7NDC0|MURG_FRATF
+2.8e-28 0 1 137 Glyco_transf_28 8 143 sp|Q0BL37|MURG_FRATO
+2.8e-28 0 1 137 Glyco_transf_28 8 143 sp|Q2A2I7|MURG_FRATH
+1.2e-28 0 2 137 Glyco_transf_28 5 142 sp|A5CS51|MURG_CLAM3
+2e-28 0 1 138 Glyco_transf_28 4 135 sp|Q9ZDC0|MURG_RICPR
+2.2e-28 0 1 138 Glyco_transf_28 3 142 sp|Q9ZK59|MURG_HELPJ
+2.5e-28 0 2 138 Glyco_transf_28 9 142 sp|B7KGH1|MURG_CYAP7
+2.4e-28 0 1 138 Glyco_transf_28 4 143 sp|Q4L6C8|MURG_STAHJ
+1.6e-28 0 2 137 Glyco_transf_28 4 141 sp|B4UES1|MURG_ANASK
+2.4e-28 0 1 137 Glyco_transf_28 6 141 sp|B9JY54|MURG_AGRVS
+7.8e-28 0 1 136 Glyco_transf_28 6 140 sp|Q1ME33|MURG_RHIL3
+4.5e-28 0 1 138 Glyco_transf_28 4 135 sp|A8EZ14|MURG_RICCK
+6.7e-28 0 1 138 Glyco_transf_28 1017 1151 sp|Q5A950|ATG26_CANAL
+2.9e-28 0 2 137 Glyco_transf_28 4 141 sp|Q2IG27|MURG_ANADE
+3.6e-28 0 2 137 Glyco_transf_28 4 141 sp|B8J8E8|MURG_ANAD2
+9.3e-28 0 1 136 Glyco_transf_28 6 140 sp|C3MEM9|MURG_RHISN
+7.3e-28 0 1 138 Glyco_transf_28 3 142 sp|Q1CSB1|MURG_HELPH
+7.9e-28 0 1 134 Glyco_transf_28 4 137 sp|P59424|MURG_BUCBP
+2.4e-27 0 1 137 Glyco_transf_28 6 141 sp|Q2K6C1|MURG_RHIEC
+7.3e-28 0 1 138 Glyco_transf_28 3 142 sp|O25770|MURG_HELPY
+1e-27 0 1 135 Glyco_transf_28 7 143 sp|A0M527|MURG_GRAFK
+7.3e-28 0 1 138 Glyco_transf_28 3 142 sp|B2UUR4|MURG_HELPS
+8e-28 0 1 138 Glyco_transf_28 5 144 sp|Q3K2P3|MURG_STRA1
+8e-28 0 1 138 Glyco_transf_28 5 144 sp|Q8CX15|MURG_STRA5
+8e-28 0 1 138 Glyco_transf_28 5 144 sp|Q8E6P0|MURG_STRA3
+8.6e-28 0 1 138 Glyco_transf_28 8 146 sp|Q7U346|MURG_BLOFL
+8.5e-28 0 2 138 Glyco_transf_28 5 143 sp|Q5HPC0|MURG_STAEQ
+8.5e-28 0 2 138 Glyco_transf_28 5 143 sp|Q8CMM3|MURG_STAES
+1e-27 0 1 138 Glyco_transf_28 14 149 sp|Q01Q48|MURG_SOLUE
+8.8e-28 0 1 138 Glyco_transf_28 3 142 sp|B5Z8F1|MURG_HELPG
+1e-27 0 1 138 Glyco_transf_28 8 144 sp|Q5L524|MURG_CHLAB
+1e-27 0 1 138 Glyco_transf_28 7 143 sp|Q255W4|MURG_CHLFF
+1.2e-27 0 1 138 Glyco_transf_28 8 144 sp|Q820E0|MURG_CHLCV
+6.1e-28 0 2 138 Glyco_transf_28 14 150 sp|Q8XVI7|MURG_RALSO
+1.2e-27 0 1 138 Glyco_transf_28 4 135 sp|Q4ULT6|MURG_RICFE
+1.2e-27 0 1 138 Glyco_transf_28 4 143 sp|Q49XM9|MURG_STAS1
+1.2e-27 0 2 138 Glyco_transf_28 29 162 sp|Q119X8|MURG_TRIEI
+2.3e-27 0 1 138 Glyco_transf_28 7 146 sp|Q03L97|MURG_STRTD
+1.3e-27 0 2 138 Glyco_transf_28 9 147 sp|A0L5N1|MURG_MAGSM
+7.5e-28 0 2 138 Glyco_transf_28 6 141 sp|B8H091|MURG_CAUCN
+7.5e-28 0 2 138 Glyco_transf_28 6 141 sp|Q9A5A1|MURG_CAUCR
+1.4e-27 0 1 138 Glyco_transf_28 4 135 sp|A8GNC7|MURG_RICAH
+2.6e-27 0 1 138 Glyco_transf_28 5 144 sp|B5XMA2|MURG_STRPZ
+1.4e-27 0 1 138 Glyco_transf_28 3 142 sp|B6JMZ5|MURG_HELP2
+1.8e-27 0 4 138 Glyco_transf_28 945 1076 sp|A7ERM5|ATG26_SCLS1
+2.1e-27 0 2 137 Glyco_transf_28 5 137 sp|Q7V466|MURG_PROMM
+2e-27 0 2 137 Glyco_transf_28 5 137 sp|A2CDG1|MURG_PROM3
+3.6e-27 0 1 138 Glyco_transf_28 7 146 sp|Q5M0D4|MURG_STRT1
+3.6e-27 0 1 138 Glyco_transf_28 7 146 sp|Q5M4Y1|MURG_STRT2
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|A6QGX0|MURG_STAAE
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|Q2FYL5|MURG_STAA8
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|Q5HG02|MURG_STAAC
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|Q6G9E3|MURG_STAAS
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|Q8NWR4|MURG_STAAW
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|A5ISU9|MURG_STAA9
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|A6U1N8|MURG_STAA2
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|A7X2A2|MURG_STAA1
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|P65481|MURG_STAAM
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|P65482|MURG_STAAN
+1.9e-27 0 1 138 Glyco_transf_28 4 143 sp|Q2YY01|MURG_STAAB
+3.7e-27 0 1 137 Glyco_transf_28 12 150 sp|Q7MAW5|MURG_PORGI
+3.8e-27 0 1 138 Glyco_transf_28 5 144 sp|A2RDL0|MURG_STRPG
+3.8e-27 0 1 138 Glyco_transf_28 5 144 sp|Q5XB05|MURG_STRP6
+4.4e-27 0 1 138 Glyco_transf_28 5 144 sp|Q1JAT5|MURG_STRPB
+4.4e-27 0 1 138 Glyco_transf_28 5 144 sp|Q1JKY5|MURG_STRPC
+3.7e-27 0 1 137 Glyco_transf_28 12 150 sp|B2RIF1|MURG_PORG3
+4.2e-27 0 1 138 Glyco_transf_28 5 144 sp|C0M6J2|MURG_STRE4
+4.9e-27 0 1 138 Glyco_transf_28 7 143 sp|A1UTC5|MURG_BARBK
+5.3e-27 0 1 138 Glyco_transf_28 5 144 sp|C0MD54|MURG_STRS7
+5.8e-27 0 1 138 Glyco_transf_28 5 144 sp|B4U1U4|MURG_STREM
+4.7e-27 0 1 137 Glyco_transf_28 8 144 sp|A5CWW1|MURG_VESOH
+7.3e-27 0 1 135 Glyco_transf_28 7 143 sp|A1A2E9|MURG_BIFAA
+9e-27 0 1 138 Glyco_transf_28 5 144 sp|P65483|MURG_STRP1
+9e-27 0 1 138 Glyco_transf_28 5 144 sp|P65484|MURG_STRP8
+9e-27 0 1 138 Glyco_transf_28 5 144 sp|Q48SK9|MURG_STRPM
+9e-27 0 1 138 Glyco_transf_28 5 144 sp|Q1J5S6|MURG_STRPF
+5.4e-27 0 1 138 Glyco_transf_28 4 143 sp|A8Z3Z7|MURG_STAAT
+5.4e-27 0 1 138 Glyco_transf_28 4 143 sp|Q2FH20|MURG_STAA3
+9e-27 0 1 138 Glyco_transf_28 5 144 sp|Q1JG11|MURG_STRPD
+7.1e-27 0 1 138 Glyco_transf_28 3 142 sp|Q17WB5|MURG_HELAH
+6e-27 0 1 138 Glyco_transf_28 4 141 sp|C6BYG6|MURG_DESAD
+1e-26 0 1 136 Glyco_transf_28 7 141 sp|Q6G2Q5|MURG_BARHE
+9.9e-27 0 1 135 Glyco_transf_28 7 140 sp|A9IWA5|MURG_BART1
+1e-26 0 1 137 Glyco_transf_28 7 144 sp|Q8CUL4|MURG_OCEIH
+1e-26 0 1 137 Glyco_transf_28 6 144 sp|A6LEU3|MURG_PARD8
+5.6e-27 0 2 133 Glyco_transf_28 5 138 sp|Q6AE64|MURG_LEIXX
+1.2e-26 0 2 138 Glyco_transf_28 5 141 sp|A1K3U6|MURG_AZOSB
+1.1e-26 0 1 137 Glyco_transf_28 8 142 sp|Q9PLG2|MURG_CHLMU
+1.6e-26 0 1 138 Glyco_transf_28 7 142 sp|Q1GRX9|MURG_SPHAL
+1.6e-26 0 3 138 Glyco_transf_28 781 913 sp|Q751Z4|ATG26_ASHGO
+2.4e-26 0 1 138 Glyco_transf_28 4 143 sp|A4VTK4|MURG_STRSY
+2.4e-26 0 1 138 Glyco_transf_28 4 143 sp|A4VZT9|MURG_STRS2
+1.6e-26 0 2 138 Glyco_transf_28 4 146 sp|B3QWT7|MURG_CHLT3
+1.4e-26 0 1 137 Glyco_transf_28 9 147 sp|Q6AJ53|MURG_DESPS
+1.7e-26 0 1 139 Glyco_transf_28 4 146 sp|B9K6P7|MURG_THENN
+3.3e-26 0 1 138 Glyco_transf_28 5 144 sp|Q8K6R7|MURG_STRP3
+2.2e-26 0 1 138 Glyco_transf_28 1166 1303 sp|Q54IL5|UGT52_DICDI
+3.3e-26 0 1 135 Glyco_transf_28 8 144 sp|B3DQN1|MURG_BIFLD
+3.3e-26 0 1 135 Glyco_transf_28 8 144 sp|Q8CY50|MURG_BIFLO
+3.3e-26 0 1 137 Glyco_transf_28 7 145 sp|Q6MIG1|MURG_BDEBA
+2.7e-26 0 2 137 Glyco_transf_28 5 137 sp|Q7U3U6|MURG_SYNPX
+4e-26 0 1 135 Glyco_transf_28 8 144 sp|B7GQ78|MURG_BIFLI
+6.8e-26 0 2 138 Glyco_transf_28 956 1089 sp|Q0UY53|ATG26_PHANO
+6.4e-26 0 1 138 Glyco_transf_28 6 145 sp|Q8DVE2|MURG_STRMU
+2.3e-26 0 1 138 Glyco_transf_28 7 143 sp|Q6N411|MURG_RHOPA
+5.6e-26 0 2 138 Glyco_transf_28 739 872 sp|Q6CUV2|ATG26_KLULA
+3.6e-26 0 1 138 Glyco_transf_28 5 140 sp|Q1MPB9|MURG_LAWIP
+3.5e-25 0 1 135 Glyco_transf_28 7 135 sp|Q8R5N5|MURG_FUSNN
+6.7e-26 0 1 139 Glyco_transf_28 3 147 sp|Q3ANV3|MURG_CHLCH
+1.2e-25 0 1 138 Glyco_transf_28 4 143 sp|A8AW15|MURG_STRGC
+1.1e-25 0 1 138 Glyco_transf_28 4 142 sp|B8DP79|MURG_DESVM
+8.2e-26 0 1 138 Glyco_transf_28 4 142 sp|Q728U8|MURG_DESVH
+1e-25 0 2 138 Glyco_transf_28 960 1093 sp|Q8NJS1|ATG26_LEPMC
+1.1e-25 0 4 138 Glyco_transf_28 1039 1170 sp|Q5KK25|ATG26_CRYNE
+1.8e-25 0 2 135 Glyco_transf_28 9 139 sp|Q8YZI3|MURG_ANASP
+1.8e-25 0 1 138 Glyco_transf_28 5 144 sp|B9DUV6|MURG_STRU0
+1.4e-25 0 2 135 Glyco_transf_28 9 139 sp|Q3M935|MURG_ANAVT
+1.4e-25 0 2 138 Glyco_transf_28 5 138 sp|Q7VDZ2|MURG_PROMA
+1.4e-25 0 2 139 Glyco_transf_28 5 139 sp|Q0I6M0|MURG_SYNS3
+1.7e-25 0 2 137 Glyco_transf_28 9 141 sp|B2J8J9|MURG_NOSP7
+7.5e-26 0 2 138 Glyco_transf_28 5 138 sp|A5GPC2|MURG_SYNPW
+8e-26 0 2 137 Glyco_transf_28 6 140 sp|B4RFS0|MURG_PHEZH
+1.8e-25 0 1 138 Glyco_transf_28 4 142 sp|A1VBE8|MURG_DESVV
+1.8e-25 0 1 139 Glyco_transf_28 4 144 sp|B7IHN7|MURG_THEAB
+2.3e-25 0 4 138 Glyco_transf_28 1016 1147 sp|Q7S1I0|ATG26_NEUCR
+2.1e-25 0 2 138 Glyco_transf_28 5 138 sp|Q3AVX2|MURG_SYNS9
+2.7e-25 0 4 138 Glyco_transf_28 907 1038 sp|Q4WID6|ATG26_ASPFU
+2.7e-25 0 4 138 Glyco_transf_28 916 1047 sp|A1CYS1|ATG26_NEOFI
+3e-25 0 2 138 Glyco_transf_28 8 141 sp|Q8DHY4|MURG_THEEB
+4.2e-25 0 1 137 Glyco_transf_28 9 147 sp|Q11RH5|MURG_CYTH3
+2.9e-25 0 2 138 Glyco_transf_28 5 138 sp|A9BDG0|MURG_PROM4
+6.4e-25 0 1 139 Glyco_transf_28 4 151 sp|Q73L91|MURG_TREDE
+1.7e-25 0 2 138 Glyco_transf_28 5 141 sp|C4XK69|MURG_DESMR
+4.1e-25 0 1 138 Glyco_transf_28 7 144 sp|A1BAL5|MURG_PARDP
+7.3e-25 0 1 138 Glyco_transf_28 4 143 sp|A3CLN6|MURG_STRSV
+4.4e-25 0 1 136 Glyco_transf_28 6 141 sp|A4SV74|MURG_POLSQ
+4.6e-25 0 1 139 Glyco_transf_28 2 137 sp|O67238|MURG_AQUAE
+5e-25 0 4 138 Glyco_transf_28 897 1028 sp|Q2U0C3|ATG26_ASPOR
+7.8e-25 0 1 138 Glyco_transf_28 7 143 sp|Q3STS8|MURG_NITWN
+5.7e-25 0 1 138 Glyco_transf_28 3 146 sp|A1BJX8|MURG_CHLPD
+6.4e-25 0 1 137 Glyco_transf_28 5 141 sp|A1AWE8|MURG_RUTMC
+5.7e-25 0 4 138 Glyco_transf_28 913 1044 sp|A1CFB3|ATG26_ASPCL
+8.9e-25 0 1 135 Glyco_transf_28 8 141 sp|B8IN64|MURG_METNO
+9e-25 0 1 135 Glyco_transf_28 7 140 sp|Q6G124|MURG_BARQU
+8.8e-25 0 1 138 Glyco_transf_28 8 144 sp|Q2W0H3|MURG_MAGSA
+9.4e-25 0 4 138 Glyco_transf_28 903 1034 sp|Q0CKU4|ATG26_ASPTN
+1e-24 0 1 138 Glyco_transf_28 4 141 sp|B1ZU31|MURG_OPITP
+1e-24 0 1 136 Glyco_transf_28 7 144 sp|A6L071|MURG_BACV8
+1.2e-24 0 1 138 Glyco_transf_28 7 143 sp|Q1QNU3|MURG_NITHX
+1.8e-24 0 1 139 Glyco_transf_28 4 141 sp|B2V7Y8|MURG_SULSY
+1.9e-24 0 2 138 Glyco_transf_28 5 138 sp|Q3AGT7|MURG_SYNSC
+1.8e-24 0 4 138 Glyco_transf_28 901 1032 sp|Q5B4C9|ATG26_EMENI
+2.5e-24 0 2 138 Glyco_transf_28 5 138 sp|A5GW69|MURG_SYNR3
+1.3e-24 0 1 138 Glyco_transf_28 8 144 sp|A4YZK3|MURG_BRASO
+1.3e-24 0 1 136 Glyco_transf_28 19 153 sp|Q2RVU4|MURG_RHORT
+3.1e-24 0 2 138 Glyco_transf_28 15 147 sp|Q2JW21|MURG_SYNJA
+1.4e-24 0 1 138 Glyco_transf_28 8 144 sp|A5EPK4|MURG_BRASB
+3.1e-24 0 4 138 Glyco_transf_28 889 1020 sp|A7KAN4|ATG26_PENCW
+4.7e-24 0 2 136 Glyco_transf_28 15 145 sp|Q2JJR4|MURG_SYNJB
+3.9e-24 0 4 138 Glyco_transf_28 902 1033 sp|A2QNQ5|ATG26_ASPNC
+4.6e-24 0 1 134 Glyco_transf_28 6 138 sp|Q0AMW7|MURG_MARMM
+9.2e-24 0 1 135 Glyco_transf_28 5 137 sp|Q812Y1|MURG3_BACCR
+7.1e-24 0 1 138 Glyco_transf_28 3 146 sp|B4SH49|MURG_PELPB
+7.7e-24 0 1 138 Glyco_transf_28 3 146 sp|B4S6Q9|MURG_PROA2
+7.8e-24 0 2 135 Glyco_transf_28 8 137 sp|A8G2K3|MURG_PROM2
+1e-23 0 1 137 Glyco_transf_28 7 142 sp|Q89FU7|MURG_BRAJA
+1.5e-23 0 1 130 Glyco_transf_28 5 132 sp|A0RHC3|MURG1_BACAH
+1.5e-23 0 1 135 Glyco_transf_28 5 140 sp|Q6MBS7|MURG_PARUW
+1.7e-23 0 1 138 Glyco_transf_28 10 146 sp|Q0BXU2|MURG_HYPNA
+1.3e-23 0 1 138 Glyco_transf_28 3 146 sp|Q8KGD4|MURG_CHLTE
+1.4e-23 0 1 138 Glyco_transf_28 3 146 sp|B3QLW4|MURG_CHLP8
+2e-23 0 2 138 Glyco_transf_28 5 141 sp|A6T2F8|MURG_JANMA
+2.4e-23 0 1 138 Glyco_transf_28 4 140 sp|A5CEL6|MURG_ORITB
+2.2e-23 0 1 133 Glyco_transf_28 8 140 sp|Q8D2Z6|MURG_WIGBR
+4.2e-23 0 1 134 Glyco_transf_28 8 140 sp|B0UFC7|MURG_METS4
+3.9e-23 0 2 137 Glyco_transf_28 2 137 sp|Q163J0|MURG_ROSDO
+6.9e-23 0 2 138 Glyco_transf_28 5 141 sp|A4G8T8|MURG_HERAR
+4.4e-23 0 2 137 Glyco_transf_28 7 142 sp|Q28NN5|MURG_JANSC
+4.3e-23 0 2 135 Glyco_transf_28 8 137 sp|Q31CY4|MURG_PROM9
+5.6e-23 0 1 133 Glyco_transf_28 8 139 sp|B1ZGP4|MURG_METPB
+2.7e-23 0 2 137 Glyco_transf_28 7 142 sp|Q5LU63|MURG_SILPO
+4.8e-23 0 1 138 Glyco_transf_28 4 140 sp|B3CRE9|MURG_ORITI
+4.2e-23 0 2 137 Glyco_transf_28 7 142 sp|Q1GIV1|MURG_SILST
+9.1e-23 0 2 138 Glyco_transf_28 6 142 sp|Q1GZ01|MURG_METFK
+1.4e-22 0 1 137 Glyco_transf_28 3 143 sp|B3ET95|MURG_AMOA5
+2.2e-22 0 1 137 Glyco_transf_28 7 145 sp|Q8A258|MURG_BACTN
+9.7e-23 0 1 138 Glyco_transf_28 8 144 sp|Q211T8|MURG_RHOPB
+9.8e-23 0 1 137 Glyco_transf_28 7 142 sp|Q2IYK8|MURG_RHOP2
+7.2e-23 0 1 137 Glyco_transf_28 8 143 sp|B1LXZ4|MURG_METRJ
+1.4e-22 0 2 135 Glyco_transf_28 8 137 sp|A2BNZ2|MURG_PROMS
+1.8e-22 0 1 137 Glyco_transf_28 3 130 sp|C0R2W7|MURG_WOLWR
+1.8e-22 0 1 137 Glyco_transf_28 3 130 sp|Q73I55|MURG_WOLPM
+2.5e-22 0 1 133 Glyco_transf_28 8 139 sp|A9VWV3|MURG_METEP
+2.5e-22 0 1 133 Glyco_transf_28 8 139 sp|B7KSC1|MURG_METC4
+1.7e-22 0 2 138 Glyco_transf_28 5 138 sp|A2C027|MURG_PROM1
+6.3e-22 0 2 137 Glyco_transf_28 7 142 sp|A3PHS8|MURG_RHOS1
+4.9e-22 0 1 138 Glyco_transf_28 3 146 sp|A4SH02|MURG_PROVI
+6.3e-22 0 2 137 Glyco_transf_28 7 142 sp|Q3J4M2|MURG_RHOS4
+3e-22 0 2 130 Glyco_transf_28 9 133 sp|Q7V388|MURG_PROMP
+3e-22 0 2 130 Glyco_transf_28 8 132 sp|A3PAR5|MURG_PROM0
+1.8e-22 0 1 138 Glyco_transf_28 7 143 sp|Q07PT3|MURG_RHOP5
+5.3e-22 0 1 137 Glyco_transf_28 7 142 sp|Q133X1|MURG_RHOPS
+4.4e-22 0 1 137 Glyco_transf_28 16 154 sp|Q5LIJ7|MURG_BACFN
+4.4e-22 0 1 137 Glyco_transf_28 16 154 sp|Q64ZM1|MURG_BACFR
+4.4e-22 0 1 139 Glyco_transf_28 4 144 sp|A6LLF1|MURG_THEM4
+4.2e-22 0 2 138 Glyco_transf_28 5 138 sp|Q46HH6|MURG_PROMT
+1.4e-21 0 2 137 Glyco_transf_28 7 142 sp|A4WQD5|MURG_RHOS5
+1.1e-21 0 2 130 Glyco_transf_28 9 133 sp|A2BUH4|MURG_PROM5
+2.7e-21 0 1 135 Glyco_transf_28 3 128 sp|Q5GS79|MURG_WOLTR
+4.4e-21 0 1 133 Glyco_transf_28 6 138 sp|Q7NPZ9|MURG_CHRVO
+3.8e-20 0 19 139 Glyco_transf_28 2 121 sp|Q1AVX3|MURG_RUBXD
+2.8 0 1 24 Glyco_transf_28 165 188 sp|Q1AVX3|MURG_RUBXD
+4.2e-21 0 2 134 Glyco_transf_28 7 136 sp|Q7MBC4|MURG_GLOVI
+5e-21 0 1 137 Glyco_transf_28 2 140 sp|Q7U322|MURG_HELHP
+3.5e-21 0 1 138 Glyco_transf_28 3 146 sp|Q3B129|MURG_PELLD
+1.2e-19 0 3 136 Glyco_transf_28 5 140 sp|Q30PK0|MURG_SULDN
+2.4e-20 0 2 137 Glyco_transf_28 7 145 sp|A2SCY5|MURG_METPP
+5.3e-19 0 1 136 Glyco_transf_28 2 139 sp|A0RP87|MURG_CAMFF
+6.7 0 2 41 Glyco_transf_28 171 210 sp|A0RP87|MURG_CAMFF
+1.1e-19 0 1 137 Glyco_transf_28 3 127 sp|B3CM87|MURG_WOLPP
+1.4e-19 0 1 135 Glyco_transf_28 9 145 sp|A5FUL0|MURG_ACICJ
+1.9e-19 0 1 131 Glyco_transf_28 3 135 sp|Q7MAD4|MURG_WOLSU
+4.9e-19 0 1 135 Glyco_transf_28 4 139 sp|B2KE54|MURG_ELUMP
+4e-19 0 1 133 Glyco_transf_28 3 141 sp|B3EIK8|MURG_CHLL2
+2.5e-19 0 3 138 Glyco_transf_28 20 177 sp|A5UZT7|MURG_ROSS1
+1.3e-18 0 1 134 Glyco_transf_28 5 142 sp|Q5FUJ5|MURG_GLUOX
+7.8e-18 0 1 135 Glyco_transf_28 3 137 sp|A6Q722|MURG_SULNB
+5.5e-18 0 1 138 Glyco_transf_28 4 135 sp|B8E325|MURG_DICTD
+9.9e-18 0 1 138 Glyco_transf_28 3 142 sp|A6Q579|MURG_NITSB
+2e-17 0 1 133 Glyco_transf_28 10 144 sp|Q0BV25|MURG_GRABC
+2.4e-17 0 1 135 Glyco_transf_28 4 137 sp|Q5PB22|MURG_ANAMM
+3.4e-17 0 1 137 Glyco_transf_28 3 141 sp|A7I265|MURG_CAMHC
+1.1e-17 0 1 138 Glyco_transf_28 4 145 sp|A9FI55|MURG_SORC5
+3e-17 0 1 138 Glyco_transf_28 4 135 sp|B5YEL3|MURG_DICT6
+3.8e-16 0 1 136 Glyco_transf_28 3 140 sp|A8FM88|MURG_CAMJ8
+5e-16 0 1 136 Glyco_transf_28 3 140 sp|Q5HU62|MURG_CAMJR
+5e-16 0 1 136 Glyco_transf_28 3 140 sp|A1W027|MURG_CAMJJ
+5e-16 0 1 136 Glyco_transf_28 3 140 sp|Q9PNQ2|MURG_CAMJE
+1.1e-15 0 1 136 Glyco_transf_28 3 140 sp|A7H2Z9|MURG_CAMJD
+3.1e-15 0 4 138 Glyco_transf_28 6 142 sp|A8F4X1|MURG_THELT
+7e-12 0 1 138 Glyco_transf_28 4 142 sp|Q72R84|MURG_LEPIC
+7e-12 0 1 138 Glyco_transf_28 4 142 sp|Q8F4J1|MURG_LEPIN
+1.3e-11 0 1 138 Glyco_transf_28 5 138 sp|Q4FPK5|MURG_PELUB
+2.7e-10 0 1 137 Glyco_transf_28 4 141 sp|Q04V94|MURG_LEPBJ
+2.7e-10 0 1 137 Glyco_transf_28 4 141 sp|Q04Y82|MURG_LEPBL
+1.8e-09 0 10 103 Glyco_transf_28 13 111 sp|Q8TTI1|Y452_METAC
+5.5e-08 0 10 113 Glyco_transf_28 13 118 sp|Q8TTI0|Y453_METAC
+2.2e-08 0 10 112 Glyco_transf_28 13 117 sp|Q8PWF3|Y1636_METMA
+4.8e-08 0 6 93 Glyco_transf_28 11 104 sp|O34539|YJIC_BACSU
+1.2e-07 0 1 59 Glyco_transf_28 10 75 sp|Q53685|OLED_STRAT
+8e-08 0 10 112 Glyco_transf_28 13 117 sp|Q8PZB2|Y582_METMA
+3.9e-07 0 11 126 Glyco_transf_28 14 131 sp|P21686|CRTX_PANAN
+2.2e-06 0 9 54 Glyco_transf_28 33 78 sp|Q54387|MGT_STRLI
+2.9e-06 0 15 125 Glyco_transf_28 18 125 sp|Q01330|CRTX_ESCVU
+0.00065 0 1 53 Glyco_transf_28 4 56 sp|O31853|YOJK_BACSU
+7.7 0 30 98 Glyco_transf_28 189 270 sp|O31853|YOJK_BACSU
+8.6e-05 0 19 70 Glyco_transf_28 201 251 sp|B1YIY4|MTNA_EXIS2
+7e-05 0 2 55 Glyco_transf_28 15 74 sp|Q0WW21|UGAGT_ARATH
+0.00011 0 1 54 Glyco_transf_28 20 70 sp|Q9Z565|ILVC1_STRCO
+9.1e-05 0 2 49 Glyco_transf_28 5 52 sp|O05496|YDHE_BACSU
+0.00011 0 1 54 Glyco_transf_28 20 70 sp|Q9FBT8|ILVC2_STRCO
+7.8e-05 0 1 55 Glyco_transf_28 13 83 sp|Q9SBL1|HMNGT_SORBI
+0.00034 0 18 62 Glyco_transf_28 199 242 sp|B1I2P1|MTNA_DESAP
+0.015 0 55 127 Glyco_transf_28 194 265 sp|A8AZU1|MUTL_STRGC
+6.1 0 105 136 Glyco_transf_28 315 346 sp|A8AZU1|MUTL_STRGC
+0.00034 0 20 91 Glyco_transf_28 173 244 sp|Q01198|LIGD_PSEPA
+0.0021 0 2 31 Glyco_transf_28 209 239 sp|Q83RR8|NPD_SHIFL
+0.00042 0 19 69 Glyco_transf_28 205 254 sp|C5D7U5|MTNA_GEOSW
+0.017 0 56 127 Glyco_transf_28 195 265 sp|A3CR14|MUTL_STRSV
+8.4 0 105 136 Glyco_transf_28 315 346 sp|A3CR14|MUTL_STRSV
+0.00066 0 19 69 Glyco_transf_28 211 260 sp|Q88M09|MTNA_PSEPK
+0.0008 0 18 69 Glyco_transf_28 203 253 sp|Q5L1E6|MTNA_GEOKA
+0.0033 0 3 31 Glyco_transf_28 210 239 sp|Q8X8E0|NPD_ECO57
+0.0031 0 3 33 Glyco_transf_28 210 241 sp|P75960|NPD_ECOLI
+0.00037 0 1 50 Glyco_transf_28 10 61 sp|Q5V467|MAMA1_HALMA
+0.0012 0 50 127 Glyco_transf_28 189 265 sp|C0MAS4|MUTL_STRE4
+0.0025 0 3 36 Glyco_transf_28 210 244 sp|P0A2F2|NPD_SALTY
+0.0025 0 3 36 Glyco_transf_28 210 244 sp|P0A2F3|NPD_SALTI
+0.0014 0 56 127 Glyco_transf_28 195 265 sp|C0MGC4|MUTL_STRS7
+0.00085 0 18 70 Glyco_transf_28 204 255 sp|Q65KK2|MTNA_BACLD
+0.00089 0 19 63 Glyco_transf_28 211 254 sp|B0KTX5|MTNA_PSEPG
+0.00072 0 19 64 Glyco_transf_28 211 255 sp|B1J5G5|MTNA_PSEPW
+0.0009 0 19 63 Glyco_transf_28 211 254 sp|A5W7G2|MTNA_PSEP1
+0.0015 0 18 69 Glyco_transf_28 203 253 sp|A4ILL1|MTNA_GEOTN
+0.0014 0 56 127 Glyco_transf_28 195 265 sp|B4U0J7|MUTL_STREM
+0.0033 0 3 31 Glyco_transf_28 210 239 sp|Q8FIM4|NPD_ECOL6
+0.0013 0 1 55 Glyco_transf_28 20 83 sp|B2GFJ7|ILVC_KOCRD
+0.0012 0 1 50 Glyco_transf_28 20 66 sp|B1VZ72|ILVC_STRGG
+0.0013 0 1 50 Glyco_transf_28 20 66 sp|Q59818|ILVC_STRAW
+0.0052 0 19 65 Glyco_transf_28 205 250 sp|Q731R7|MTNA_BACC1
+0.0011 0 10 85 Glyco_transf_28 119 194 sp|B1GZW3|TPIS_UNCTG
+0.011 0 13 108 Glyco_transf_28 25 121 sp|Q2IWS4|GLYA_RHOP2
+0.0025 0 19 66 Glyco_transf_28 205 251 sp|A7GS56|MTNA_BACCN
+0.0015 0 1 61 Glyco_transf_28 20 76 sp|B7KF23|ILVC_CYAP7
+0.0018 0 23 126 Glyco_transf_28 138 237 sp|A5W1E8|RNZ_PSEP1
+0.0028 0 2 52 Glyco_transf_28 20 67 sp|B3QSP0|ILVC_CHLT3
+0.008 0 19 63 Glyco_transf_28 205 248 sp|O31662|MTNA_BACSU
+0.004 0 1 60 Glyco_transf_28 20 75 sp|C1F6Z5|ILVC_ACIC5
+2.3 0 63 125 Glyco_transf_28 93 143 sp|Q2G3S7|PYRB_NOVAD
+0.09 0 22 47 Glyco_transf_28 199 225 sp|Q2G3S7|PYRB_NOVAD
+4.2 0 56 96 Glyco_transf_28 349 387 sp|Q96LB3|IFT74_HUMAN
+0.044 0 28 87 Glyco_transf_28 505 562 sp|Q96LB3|IFT74_HUMAN
+0.0028 0 1 57 Glyco_transf_28 20 73 sp|A9AZM5|ILVC_HERA2
+0.0069 0 18 59 Glyco_transf_28 19 69 sp|B8HSQ9|SURE_CYAP4
+0.0043 0 14 73 Glyco_transf_28 601 661 sp|Q3SPL2|UVRC_NITWN
+0.005 0 19 63 Glyco_transf_28 205 248 sp|A7Z3X0|MTNA_BACA2
+0.078 0 21 118 Glyco_transf_28 40 134 sp|Q38W65|EFTS_LACSS
+2.5 0 27 122 Glyco_transf_28 177 262 sp|Q38W65|EFTS_LACSS
+0.0033 0 44 126 Glyco_transf_28 121 199 sp|C3JYK1|TIG_PSEFS
+0.003 0 11 97 Glyco_transf_28 131 219 sp|Q1GZA6|BIOB_METFK
+0.0044 0 19 66 Glyco_transf_28 205 251 sp|Q635P7|MTNA2_BACCZ
+0.0032 0 1 73 Glyco_transf_28 12 87 sp|O48676|HTGT_ARATH
+2.5 0 16 33 Glyco_transf_28 15 32 sp|Q8YRC9|THIOG_ANASP
+0.25 0 87 133 Glyco_transf_28 315 361 sp|Q8YRC9|THIOG_ANASP
+0.019 0 1 54 Glyco_transf_28 21 70 sp|Q8DW43|ILVC_STRMU
+0.0041 0 19 66 Glyco_transf_28 205 251 sp|Q81MJ6|MTNA2_BACAN
+0.014 0 13 107 Glyco_transf_28 24 119 sp|Q6N693|GLYA1_RHOPA
+0.0035 0 16 73 Glyco_transf_28 14 69 sp|B0C915|MURD_ACAM1
+0.0061 0 13 108 Glyco_transf_28 20 116 sp|Q2KA25|GLYA_RHIEC
+0.011 0 13 107 Glyco_transf_28 32 127 sp|Q214H7|GLYA_RHOPB
+0.0067 0 65 127 Glyco_transf_28 203 265 sp|B9DW70|MUTL_STRU0
+0.0046 0 19 66 Glyco_transf_28 205 251 sp|A0RI38|MTNA2_BACAH
+0.0046 0 19 66 Glyco_transf_28 205 251 sp|Q6HED3|MTNA2_BACHK
+0.0042 0 14 73 Glyco_transf_28 602 662 sp|Q1QIR5|UVRC_NITHX
+0.0085 0 1 50 Glyco_transf_28 21 66 sp|A8AVN4|ILVC_STRGC
+0.024 0 17 68 Glyco_transf_28 40 90 sp|Q7V5V5|MURD_PROMM
+0.0043 0 1 50 Glyco_transf_28 21 67 sp|Q47SB6|ILVC_THEFY
+0.0032 0 1 47 Glyco_transf_28 21 64 sp|A4FMQ5|ILVC_SACEN
+0.0022 0 30 121 Glyco_transf_28 11 103 sp|Q5V3R4|TRM56_HALMA
+5.1 0 24 67 Glyco_transf_28 105 146 sp|B8GW68|ENO_CAUCN
+0.066 0 13 48 Glyco_transf_28 184 219 sp|B8GW68|ENO_CAUCN
+5.1 0 24 67 Glyco_transf_28 105 146 sp|Q9A7J9|ENO_CAUCR
+0.066 0 13 48 Glyco_transf_28 184 219 sp|Q9A7J9|ENO_CAUCR
+0.0049 0 1 54 Glyco_transf_28 4 59 sp|Q5V3F0|MAMA2_HALMA
+0.0086 0 11 45 Glyco_transf_28 24 60 sp|B1LZ88|GLYA_METRJ
+0.0038 0 11 97 Glyco_transf_28 128 216 sp|P94966|BIOB_METSK
+0.0043 0 1 70 Glyco_transf_28 19 81 sp|Q3SHE4|ILVC_THIDA
+0.015 0 13 107 Glyco_transf_28 25 120 sp|Q07MT9|GLYA_RHOP5
+0.0047 0 17 63 Glyco_transf_28 202 247 sp|A9VRK3|MTNA1_BACWK
+0.01 0 1 54 Glyco_transf_28 20 70 sp|A9GW78|ILVC_SORC5
+0.0079 0 1 59 Glyco_transf_28 21 75 sp|Q5YRW2|ILVC_NOCFA
+0.01 0 1 36 Glyco_transf_28 21 51 sp|A3CQ86|ILVC_STRSV
+0.013 0 14 72 Glyco_transf_28 611 670 sp|Q21AW5|UVRC_RHOPB
+0.0061 0 17 63 Glyco_transf_28 202 247 sp|Q81IK7|MTNA1_BACCR
+5.6 0 15 31 Glyco_transf_28 21 37 sp|Q5FNN2|PYRG_GLUOX
+0.34 0 2 45 Glyco_transf_28 137 183 sp|Q5FNN2|PYRG_GLUOX
+0.0076 0 1 55 Glyco_transf_28 19 82 sp|Q2S9V9|ILVC_HAHCH
+0.0042 0 2 79 Glyco_transf_28 3 75 sp|Q17QH8|D39U1_BOVIN
+0.0057 0 1 47 Glyco_transf_28 20 63 sp|Q2J6V2|ILVC_FRASC
+0.038 0 1 54 Glyco_transf_28 19 69 sp|A1WUW3|ILVC_HALHL
+0.0093 0 15 70 Glyco_transf_28 20 71 sp|A8LMD0|PUR9_DINSH
+0.0091 0 1 37 Glyco_transf_28 215 251 sp|C5BAT0|GCSP_EDWI9
+0.011 0 1 48 Glyco_transf_28 21 65 sp|C1B2M1|ILVC_RHOOB
+0.011 0 1 48 Glyco_transf_28 21 65 sp|Q0S2H3|ILVC_RHOSR
+0.0062 0 17 63 Glyco_transf_28 202 247 sp|A0R946|MTNA1_BACAH
+0.0062 0 17 63 Glyco_transf_28 202 247 sp|Q81ZC2|MTNA1_BACAN
+0.0062 0 17 63 Glyco_transf_28 202 247 sp|Q6HP54|MTNA1_BACHK
+0.011 0 16 108 Glyco_transf_28 23 116 sp|Q1MIU5|GLYA_RHIL3
+0.0078 0 19 65 Glyco_transf_28 205 250 sp|A8FCG5|MTNA_BACP2
+0.013 0 1 68 Glyco_transf_28 19 79 sp|Q63CV4|ILVC2_BACCZ
+0.0084 0 1 68 Glyco_transf_28 20 81 sp|A4J179|ILVC_DESRM
+0.0039 0 1 55 Glyco_transf_28 3 76 sp|Q9V030|PAAD_PYRAB
+0.014 0 1 54 Glyco_transf_28 19 68 sp|Q81F27|ILVC2_BACCR
+0.05 0 1 52 Glyco_transf_28 21 68 sp|Q03IJ9|ILVC_STRTD
+0.05 0 1 52 Glyco_transf_28 21 68 sp|Q9F0I7|ILVC_STRTR
+0.0082 0 14 90 Glyco_transf_28 88 168 sp|P26166|YBCC_RHOCA
+0.0067 0 1 54 Glyco_transf_28 20 70 sp|B8I1T8|ILVC_CLOCE
+0.066 0 1 35 Glyco_transf_28 21 50 sp|A4VXL3|ILVC_STRSY
+0.066 0 1 35 Glyco_transf_28 21 50 sp|A4W3V8|ILVC_STRS2
+0.0079 0 1 59 Glyco_transf_28 19 73 sp|Q3B594|ILVC_PELLD
+0.026 0 65 128 Glyco_transf_28 203 266 sp|B1I8F2|MUTL_STRPI
+0.026 0 65 128 Glyco_transf_28 203 266 sp|B2IS10|MUTL_STRPS
+0.026 0 65 128 Glyco_transf_28 203 266 sp|B8ZKC9|MUTL_STRPJ
+0.026 0 65 128 Glyco_transf_28 203 266 sp|P0A3R1|HEXB_STRPN
+0.026 0 65 128 Glyco_transf_28 203 266 sp|P0A3R2|HEXB_STRR6
+0.026 0 65 128 Glyco_transf_28 203 266 sp|Q04MR4|MUTL_STRP2
+0.026 0 65 128 Glyco_transf_28 203 266 sp|C1CI68|MUTL_STRZP
+0.026 0 65 128 Glyco_transf_28 203 266 sp|C1CP43|MUTL_STRZT
+0.016 0 16 59 Glyco_transf_28 184 248 sp|Q8ZQE4|MACB_SALTY
+0.016 0 16 59 Glyco_transf_28 184 248 sp|Q57R58|MACB_SALCH
+0.0064 0 15 92 Glyco_transf_28 45 123 sp|Q64550|UD11_RAT
+0.011 0 13 108 Glyco_transf_28 20 116 sp|B9JCX4|GLYA_AGRRK
+0.016 0 16 59 Glyco_transf_28 184 248 sp|Q8Z824|MACB_SALTI
+0.0047 0 43 134 Glyco_transf_28 80 181 sp|O94475|YC67_SCHPO
+0.39 0 19 73 Glyco_transf_28 56 108 sp|P59837|RDH12_BOVIN
+1.7 0 34 79 Glyco_transf_28 211 265 sp|P59837|RDH12_BOVIN
+0.016 0 16 59 Glyco_transf_28 184 248 sp|Q5PGK9|MACB_SALPA
+0.032 0 1 48 Glyco_transf_28 20 64 sp|Q02CM4|ILVC_SOLUE
+0.019 0 3 21 Glyco_transf_28 208 226 sp|Q669P6|NPD_YERPS
+0.019 0 3 21 Glyco_transf_28 208 226 sp|Q8ZFR1|NPD_YERPE
+0.009 0 1 69 Glyco_transf_28 20 82 sp|B9KYS1|ILVC_THERP
+0.023 0 1 48 Glyco_transf_28 20 64 sp|B4UAN4|ILVC_ANASK
+0.023 0 1 48 Glyco_transf_28 20 64 sp|B8J829|ILVC_ANAD2
+0.023 0 1 48 Glyco_transf_28 20 64 sp|Q2IJB7|ILVC_ANADE
+0.0091 0 1 45 Glyco_transf_28 20 59 sp|Q0RDI8|ILVC_FRAAA
+0.013 0 18 54 Glyco_transf_28 24 61 sp|P0ABQ0|COABC_ECOLI
+0.013 0 18 54 Glyco_transf_28 24 61 sp|P0ABQ1|COABC_ECOL6
+0.0085 0 1 64 Glyco_transf_28 20 76 sp|B2J2U6|ILVC_NOSP7
+0.011 0 14 73 Glyco_transf_28 598 658 sp|Q89DG9|UVRC_BRAJA
+0.009 0 1 63 Glyco_transf_28 17 73 sp|Q2S0M9|ILVC_SALRD
+0.0086 0 1 59 Glyco_transf_28 22 76 sp|Q7NH80|ILVC_GLOVI
+0.0081 0 1 54 Glyco_transf_28 21 71 sp|Q8G6V1|ILVC2_BIFLO
+0.059 0 15 53 Glyco_transf_28 186 224 sp|Q2W698|ENO_MAGSA
+0.0097 0 17 63 Glyco_transf_28 202 247 sp|Q63GN3|MTNA1_BACCZ
+0.0096 0 1 54 Glyco_transf_28 20 70 sp|B0JRP2|ILVC_MICAN
+0.027 0 65 128 Glyco_transf_28 203 266 sp|C1CBX8|MUTL_STRZJ
+0.0097 0 12 80 Glyco_transf_28 114 184 sp|Q3SLY0|BIOB_THIDA
+0.027 0 65 128 Glyco_transf_28 203 266 sp|B5E6C5|MUTL_STRP4
+0.011 0 16 55 Glyco_transf_28 14 60 sp|B2J6I3|MURD_NOSP7
+0.05 0 1 52 Glyco_transf_28 21 68 sp|Q5LXV0|ILVC_STRT1
+0.05 0 1 52 Glyco_transf_28 21 68 sp|Q5M2F2|ILVC_STRT2
+4.1 0 66 100 Glyco_transf_28 13 47 sp|C6A5E6|VATD_THESM
+0.17 0 29 87 Glyco_transf_28 104 160 sp|C6A5E6|VATD_THESM
+0.014 0 1 67 Glyco_transf_28 20 80 sp|Q2RIS6|ILVC_MOOTA
+0.13 0 87 135 Glyco_transf_28 315 363 sp|Q3M859|THIOG_ANAVT
+0.013 0 24 93 Glyco_transf_28 58 124 sp|Q5GS59|RLME_WOLTR
+0.0049 0 2 54 Glyco_transf_28 21 70 sp|B8G7X1|ILVC_CHLAD
+0.016 0 1 52 Glyco_transf_28 20 68 sp|C5C2I2|ILVC_BEUC1
+0.022 0 2 54 Glyco_transf_28 20 69 sp|Q5SJ03|ILVC_THET8
+0.022 0 2 54 Glyco_transf_28 20 69 sp|Q72JC8|ILVC_THET2
+0.019 0 1 49 Glyco_transf_28 21 66 sp|Q4JUN9|ILVC_CORJK
+0.013 0 14 72 Glyco_transf_28 607 666 sp|Q2J0X3|UVRC_RHOP2
+0.028 0 1 36 Glyco_transf_28 21 51 sp|Q02YY8|ILVC_LACLS
+0.016 0 1 57 Glyco_transf_28 20 70 sp|B9EBF4|ILVC_MACCJ
+0.011 0 10 43 Glyco_transf_28 23 56 sp|Q43716|UFOG_PETHY
+0.0099 0 15 56 Glyco_transf_28 20 60 sp|A5GUT4|SURE_SYNR3
+0.012 0 2 64 Glyco_transf_28 20 76 sp|Q1ARE4|ILVC_RUBXD
+0.033 0 2 48 Glyco_transf_28 21 64 sp|A6W7N6|ILVC_KINRD
+0.25 0 23 52 Glyco_transf_28 129 158 sp|Q11039|DEAD_MYCTU
+0.017 0 14 72 Glyco_transf_28 607 666 sp|Q13BM0|UVRC_RHOPS
+0.0085 0 18 105 Glyco_transf_28 19 127 sp|Q8YMT3|SURE_ANASP
+0.015 0 16 54 Glyco_transf_28 20 58 sp|Q319M0|SURE_PROM9
+0.017 0 19 66 Glyco_transf_28 205 251 sp|A9VFD5|MTNA2_BACWK
+3.5 0 47 107 Glyco_transf_28 15 73 sp|A1JRP2|NADA_YERE8
+0.37 0 85 132 Glyco_transf_28 226 276 sp|A1JRP2|NADA_YERE8
+0.032 0 1 36 Glyco_transf_28 21 51 sp|A2RKQ6|ILVC_LACLM
+0.019 0 16 110 Glyco_transf_28 184 298 sp|Q32DZ9|MACB_SHIDS
+0.018 0 1 59 Glyco_transf_28 20 74 sp|A5CPY6|ILVC_CLAM3
+0.018 0 1 59 Glyco_transf_28 20 74 sp|B0RIN6|ILVC_CLAMS
+0.024 0 57 127 Glyco_transf_28 196 265 sp|Q8K5J6|MUTL_STRP3
+0.024 0 57 127 Glyco_transf_28 196 265 sp|Q99XN7|MUTL_STRP1
+0.024 0 57 127 Glyco_transf_28 196 265 sp|B5XJ09|MUTL_STRPZ
+0.024 0 57 127 Glyco_transf_28 196 265 sp|A2RGV3|MUTL_STRPG
+0.024 0 57 127 Glyco_transf_28 196 265 sp|Q5X9H5|MUTL_STRP6
+0.019 0 63 125 Glyco_transf_28 201 263 sp|Q3JYM6|MUTL_STRA1
+0.019 0 63 125 Glyco_transf_28 201 263 sp|Q8E2R5|MUTL_STRA3
+0.021 0 1 54 Glyco_transf_28 9 63 sp|Q9MB73|LGT_CITUN
+0.02 0 17 54 Glyco_transf_28 21 58 sp|A8G678|SURE_PROM2
+0.046 0 1 48 Glyco_transf_28 20 64 sp|A9WP08|ILVC_RENSM
+0.0085 0 2 54 Glyco_transf_28 21 70 sp|A9WC26|ILVC_CHLAA
+0.0085 0 2 54 Glyco_transf_28 21 70 sp|B9LGM7|ILVC_CHLSY
+0.02 0 17 53 Glyco_transf_28 21 57 sp|A2BSJ2|SURE_PROMS
+0.026 0 1 32 Glyco_transf_28 6 38 sp|Q9LR44|IABG1_ARATH
+0.068 0 26 86 Glyco_transf_28 101 159 sp|O57731|VATD_PYRHO
+0.027 0 17 50 Glyco_transf_28 21 53 sp|A3PEA4|SURE_PROM0
+0.019 0 16 110 Glyco_transf_28 184 298 sp|P75831|MACB_ECOLI
+0.02 0 16 110 Glyco_transf_28 184 298 sp|Q83LR7|MACB_SHIFL
+0.02 0 16 110 Glyco_transf_28 184 298 sp|Q3Z3Q4|MACB_SHISS
+0.029 0 15 108 Glyco_transf_28 183 296 sp|Q8XED0|MACB_ECO57
diff --git a/demotic/regress/ncbi-blastp-profmark.out b/demotic/regress/ncbi-blastp-profmark.out
new file mode 100644
index 0000000..002fb9f
--- /dev/null
+++ b/demotic/regress/ncbi-blastp-profmark.out
@@ -0,0 +1,19 @@
+1e-88 325.0 sp|P55685|Y4WG_RHISN sp|P55685|Y4WG_RHISN
+3.8 31.0 sp|B2VCH7|MTLD_ERWT9 sp|P55685|Y4WG_RHISN
+7.3 30.0 sp|Q9CZP0|UFSP1_MOUSE sp|P55685|Y4WG_RHISN
+0 602.0 sp|Q1XGE2|HAC1_ASPOR sp|Q1XGE2|HAC1_ASPOR
+0 416.0 sp|Q8TFU8|HAC1_EMENI sp|Q1XGE2|HAC1_ASPOR
+2e-15 84.0 sp|Q8TFF3|HAC1_TRIRE sp|Q1XGE2|HAC1_ASPOR
+1e-07 58.0 sp|P41546|HAC1_YEAST sp|Q1XGE2|HAC1_ASPOR
+0.01 41.0 sp|O24646|HY5_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.12 38.0 sp|Q9SM50|HY5_SOLLC sp|Q1XGE2|HAC1_ASPOR
+1.5 34.0 sp|Q61817|CREB3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.6 34.0 sp|A1URL3|PYRD_BARBK sp|Q1XGE2|HAC1_ASPOR
+1.9 34.0 sp|Q3SYZ3|CR3L3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+2.1 33.0 sp|Q68CJ9|CR3L3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+2.6 33.0 sp|Q5FVM5|CR3L3_RAT sp|Q1XGE2|HAC1_ASPOR
+2.9 33.0 sp|Q91XE9|CR3L3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+5.7 32.0 sp|Q8W191|HYH_ARATH sp|Q1XGE2|HAC1_ASPOR
+5.8 32.0 sp|Q3SZZ2|XBP1_BOVIN sp|Q1XGE2|HAC1_ASPOR
+9 32.0 sp|Q5UEM7|CR3L4_RAT sp|Q1XGE2|HAC1_ASPOR
+9.3 32.0 sp|Q9D2A5|CR3L4_MOUSE sp|Q1XGE2|HAC1_ASPOR
diff --git a/demotic/regress/ncbi-blastp-tbl.out b/demotic/regress/ncbi-blastp-tbl.out
new file mode 100644
index 0000000..283ddf4
--- /dev/null
+++ b/demotic/regress/ncbi-blastp-tbl.out
@@ -0,0 +1,19 @@
+1e-88 90 1 181 sp|P55685|Y4WG_RHISN 1 181 sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium sp.
+3.8 32 42 93 sp|P55685|Y4WG_RHISN 52 97 sp|B2VCH7|MTLD_ERWT9 Mannitol-1-phosphate 5-dehydrogenase
+7.3 34 111 154 sp|P55685|Y4WG_RHISN 129 172 sp|Q9CZP0|UFSP1_MOUSE Ufm1-specific protease 1 OS=Mus musculus
+e-171 87 1 345 sp|Q1XGE2|HAC1_ASPOR 1 345 sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspergillus
+e-115 67 13 344 sp|Q1XGE2|HAC1_ASPOR 18 348 sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS=Emericella
+2e-15 88 58 100 sp|Q1XGE2|HAC1_ASPOR 93 135 sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS=Trichoderma
+1e-07 68 63 100 sp|Q1XGE2|HAC1_ASPOR 16 56 sp|P41546|HAC1_YEAST Transcriptional activator HAC1
+0.010 33 60 139 sp|Q1XGE2|HAC1_ASPOR 65 144 sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabidopsis
+0.12 32 60 139 sp|Q1XGE2|HAC1_ASPOR 66 142 sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanum
+1.5 28 80 150 sp|Q1XGE2|HAC1_ASPOR 182 252 sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-binding protein
+1.6 40 227 292 sp|Q1XGE2|HAC1_ASPOR 205 267 sp|A1URL3|PYRD_BARBK Dihydroorotate dehydrogenase OS=Bartonella
+1.9 28 80 150 sp|Q1XGE2|HAC1_ASPOR 235 305 sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-binding protein
+2.1 28 80 150 sp|Q1XGE2|HAC1_ASPOR 240 310 sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-binding protein
+2.6 26 68 150 sp|Q1XGE2|HAC1_ASPOR 224 306 sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-binding protein
+2.9 26 68 150 sp|Q1XGE2|HAC1_ASPOR 224 306 sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-binding protein
+5.7 26 73 143 sp|Q1XGE2|HAC1_ASPOR 68 138 sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=Arabidopsis
+5.8 29 68 143 sp|Q1XGE2|HAC1_ASPOR 52 137 sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos taurus GN=XBP1
+9.0 26 80 146 sp|Q1XGE2|HAC1_ASPOR 186 252 sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-binding protein
+9.3 26 80 146 sp|Q1XGE2|HAC1_ASPOR 190 256 sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-binding protein
diff --git a/demotic/regress/phmmer-profmark.out b/demotic/regress/phmmer-profmark.out
new file mode 100644
index 0000000..16e0686
--- /dev/null
+++ b/demotic/regress/phmmer-profmark.out
@@ -0,0 +1,221 @@
+1.9e-115 387.7 sp|P55685|Y4WG_RHISN sp|P55685|Y4WG_RHISN
+1.7 13.5 sp|A1VDW9|HEM1_DESVV sp|P55685|Y4WG_RHISN
+2.1 13.1 sp|Q72C23|HEM1_DESVH sp|P55685|Y4WG_RHISN
+2.8 12.7 sp|C0ZYA2|RIMP_RHOE4 sp|P55685|Y4WG_RHISN
+2.9 12.7 sp|Q98G87|UBIG_RHILO sp|P55685|Y4WG_RHISN
+3.6 12.4 sp|B2VCH7|MTLD_ERWT9 sp|P55685|Y4WG_RHISN
+4.5 12.1 sp|A1WE19|RLMN_VEREI sp|P55685|Y4WG_RHISN
+4.6 12.0 sp|Q2J713|RLMN_FRASC sp|P55685|Y4WG_RHISN
+5.4 11.8 sp|Q9CZP0|UFSP1_MOUSE sp|P55685|Y4WG_RHISN
+7.4 11.4 sp|Q21KT6|RLMN_SACD2 sp|P55685|Y4WG_RHISN
+7.5 11.4 sp|Q7W7U1|NADD_BORPA sp|P55685|Y4WG_RHISN
+7.9 11.3 sp|Q8C6Y6|ASB14_MOUSE sp|P55685|Y4WG_RHISN
+8 11.3 sp|Q8Y3H7|Y003_RALSO sp|P55685|Y4WG_RHISN
+8.1 11.2 sp|A4G4J9|RLMN_HERAR sp|P55685|Y4WG_RHISN
+8.8 11.1 sp|B8F3W8|LEUC_HAEPS sp|P55685|Y4WG_RHISN
+9.6 11.0 sp|Q07074|YH007_YEAST sp|P55685|Y4WG_RHISN
+9.7 11.0 sp|A6SZX3|RLMN_JANMA sp|P55685|Y4WG_RHISN
+9.7 11.0 sp|A2SHB8|RLMN_METPP sp|P55685|Y4WG_RHISN
+2e-228 762.1 sp|Q1XGE2|HAC1_ASPOR sp|Q1XGE2|HAC1_ASPOR
+1.2e-169 568.8 sp|Q8TFU8|HAC1_EMENI sp|Q1XGE2|HAC1_ASPOR
+1.5e-26 98.4 sp|Q8TFF3|HAC1_TRIRE sp|Q1XGE2|HAC1_ASPOR
+1.3e-12 52.6 sp|P41546|HAC1_YEAST sp|Q1XGE2|HAC1_ASPOR
+6e-11 47.1 sp|O24646|HY5_ARATH sp|Q1XGE2|HAC1_ASPOR
+4.6e-07 34.3 sp|Q3SZZ2|XBP1_BOVIN sp|Q1XGE2|HAC1_ASPOR
+7.8e-07 33.6 sp|Q9SM50|HY5_SOLLC sp|Q1XGE2|HAC1_ASPOR
+1.7e-06 32.5 sp|P17861|XBP1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+9.6e-06 30.0 sp|Q8W191|HYH_ARATH sp|Q1XGE2|HAC1_ASPOR
+2.2e-05 28.8 sp|A1L224|CR3L2_DANRE sp|Q1XGE2|HAC1_ASPOR
+6.8e-05 27.2 sp|Q9D2A5|CR3L4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+7.1e-05 27.1 sp|Q9R1S4|XBP1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.00017 25.8 sp|Q54WN7|BZPF_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.00023 25.5 sp|A2VD01|CR3L2_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.00023 25.4 sp|Q99090|CPRF2_PETCR sp|Q1XGE2|HAC1_ASPOR
+0.00028 25.2 sp|Q5FVM5|CR3L3_RAT sp|Q1XGE2|HAC1_ASPOR
+0.00029 25.1 sp|O35426|XBP1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00031 25.0 sp|Q61817|CREB3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00058 24.1 sp|Q91XE9|CR3L3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0006 24.1 sp|O57342|MAFA_COTJA sp|Q1XGE2|HAC1_ASPOR
+0.00063 24.0 sp|Q5UEM7|CR3L4_RAT sp|Q1XGE2|HAC1_ASPOR
+0.00077 23.7 sp|Q08CW8|CR3L4_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.00091 23.5 sp|Q90370|MAFB_COTJA sp|Q1XGE2|HAC1_ASPOR
+0.00095 23.4 sp|Q68CJ9|CR3L3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.001 23.3 sp|Q1LYG4|CR3LB_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.0011 23.3 sp|Q502F0|CR3LA_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.0012 23.1 sp|Q90888|MAFB_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.0013 23.0 sp|Q3SYZ3|CR3L3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.0014 22.9 sp|Q5RCM9|CR3L2_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.0014 22.9 sp|Q9Y5Q3|MAFB_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0016 22.7 sp|Q70SY1|CR3L2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0017 22.6 sp|Q6DE84|MAFB_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.0018 22.6 sp|Q9Z125|CR3L1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0018 22.6 sp|Q8BH52|CR3L2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0021 22.3 sp|P54842|MAFB_RAT sp|Q1XGE2|HAC1_ASPOR
+0.0021 22.3 sp|Q6QDP7|CR3L2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.0021 22.3 sp|Q16520|BATF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0023 22.1 sp|P54841|MAFB_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0027 21.9 sp|Q2PFS4|MAFB_MACFA sp|Q1XGE2|HAC1_ASPOR
+0.0029 21.8 sp|O42290|MAFA_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.003 21.8 sp|Q9NR55|BATF3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0037 21.5 sp|Q96BA8|CR3L1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.004 21.4 sp|Q66HA2|CR3L1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.0043 21.3 sp|P17544|ATF7_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0053 21.0 sp|O43889|CREB3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0054 20.9 sp|Q8R0S1|ATF7_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0057 20.9 sp|Q5R9C9|ATF7_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.0068 20.6 sp|O35284|BATF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0084 20.3 sp|Q8SQ19|CREB3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.0089 20.2 sp|Q8TEY5|CR3L4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0097 20.1 sp|Q9D275|BATF3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.012 19.9 sp|Q504L8|MAFB_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.012 19.8 sp|Q5UEM8|CR3L4_MACFA sp|Q1XGE2|HAC1_ASPOR
+0.016 19.4 sp|Q4U1U2|MAFA_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.018 19.3 sp|P23091|MAF_AVIS4 sp|Q1XGE2|HAC1_ASPOR
+0.018 19.2 sp|P81269|ATF1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.019 19.2 sp|Q789F3|MAF_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.02 19.1 sp|P29747|CREBA_DROME sp|Q1XGE2|HAC1_ASPOR
+0.02 19.0 sp|P18848|ATF4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.024 18.8 sp|P54844|MAF_RAT sp|Q1XGE2|HAC1_ASPOR
+0.024 18.8 sp|O75444|MAF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.024 18.8 sp|P97876|BATF3_RAT sp|Q1XGE2|HAC1_ASPOR
+0.025 18.8 sp|Q06507|ATF4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.025 18.7 sp|A7Z017|MAF_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.026 18.7 sp|Q0V9K1|MAF_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.028 18.6 sp|Q08DA8|ATF1_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.029 18.5 sp|O60675|MAFK_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.03 18.5 sp|P54843|MAF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.036 18.2 sp|P18846|ATF1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.039 18.1 sp|P42774|GBF1_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.039 18.1 sp|Q61827|MAFK_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.046 17.9 sp|P14233|TGA1B_TOBAC sp|Q1XGE2|HAC1_ASPOR
+0.051 17.7 sp|Q6NW59|ATF4_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.067 17.3 sp|O24160|TGA21_TOBAC sp|Q1XGE2|HAC1_ASPOR
+0.07 17.3 sp|Q98UK4|MAF_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.071 17.3 sp|A3KMR8|MAFA_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.078 17.1 sp|Q90596|MAFK_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.079 17.1 sp|Q3ZCH6|ATF4_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.086 17.0 sp|P97875|JDP2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.086 17.0 sp|Q78E65|JDP2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.092 16.9 sp|P12959|OP2_MAIZE sp|Q1XGE2|HAC1_ASPOR
+0.093 16.9 sp|Q8K1L0|CREB5_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.093 16.9 sp|Q39140|TGA6_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.098 16.8 sp|P23923|HBP1B_WHEAT sp|Q1XGE2|HAC1_ASPOR
+0.11 16.7 sp|Q00322|CEBPD_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.11 16.6 sp|Q39163|TGA5_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.12 16.5 sp|Q54RZ9|BZPG_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.12 16.5 sp|Q8CF90|MAFA_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.13 16.4 sp|Q9ES19|ATF4_RAT sp|Q1XGE2|HAC1_ASPOR
+0.15 16.2 sp|P43273|TGA2_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.16 16.1 sp|Q98UK5|MAFB_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.17 16.0 sp|P16951|ATF2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.18 15.9 sp|P27925|CREB1_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.19 15.9 sp|P15336|ATF2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.19 15.9 sp|O35451|ATF6B_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.19 15.9 sp|Q2VZV0|IF2_MAGSA sp|Q1XGE2|HAC1_ASPOR
+0.21 15.7 sp|Q6ZDF3|TRAB1_ORYSJ sp|Q1XGE2|HAC1_ASPOR
+0.22 15.7 sp|Q6P788|ATF5_RAT sp|Q1XGE2|HAC1_ASPOR
+0.22 15.6 sp|Q02930|CREB5_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.23 15.6 sp|Q66J36|NFIL3_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.29 15.3 sp|Q8NHW3|MAFA_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.37 14.9 sp|O88479|FOS_MESAU sp|Q1XGE2|HAC1_ASPOR
+0.38 14.9 sp|P23922|HBP1A_WHEAT sp|Q1XGE2|HAC1_ASPOR
+0.39 14.9 sp|Q90595|MAFF_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.39 14.8 sp|P53450|FOS_TAKRU sp|Q1XGE2|HAC1_ASPOR
+0.43 14.7 sp|Q00969|ATF2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.43 14.7 sp|O97930|FOS_PIG sp|Q1XGE2|HAC1_ASPOR
+0.51 14.5 sp|P79145|CREM_CANFA sp|Q1XGE2|HAC1_ASPOR
+0.52 14.4 sp|Q99941|ATF6B_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.53 14.4 sp|P01101|FOS_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.54 14.4 sp|P15337|CREB1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.54 14.4 sp|P16220|CREB1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.54 14.4 sp|Q01147|CREB1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.57 14.3 sp|O93602|ATF2_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.63 14.1 sp|Q90889|MAFG_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.64 14.1 sp|P79702|FOS_CYPCA sp|Q1XGE2|HAC1_ASPOR
+0.64 14.1 sp|Q8X229|FCR3_CANAL sp|Q1XGE2|HAC1_ASPOR
+0.65 14.1 sp|P12841|FOS_RAT sp|Q1XGE2|HAC1_ASPOR
+0.71 14.0 sp|P49716|CEBPD_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.72 14.0 sp|Q554P0|BZPJ_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.74 13.9 sp|Q55E93|BZPE_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.75 13.9 sp|P51984|CREB_CHLVR sp|Q1XGE2|HAC1_ASPOR
+0.77 13.9 sp|P01102|FOS_MSVFB sp|Q1XGE2|HAC1_ASPOR
+0.81 13.8 sp|O77628|FOS_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.82 13.8 sp|Q8WYK2|JDP2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.86 13.7 sp|Q60925|DBP_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.9 13.6 sp|P14232|TGA1A_TOBAC sp|Q1XGE2|HAC1_ASPOR
+0.96 13.6 sp|P16443|DBP_RAT sp|Q1XGE2|HAC1_ASPOR
+0.97 13.5 sp|Q68EL6|NFIL3_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.98 13.5 sp|P01100|FOS_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1 13.5 sp|Q9C5Q2|AI5L3_ARATH sp|Q1XGE2|HAC1_ASPOR
+1.1 13.4 sp|Q5FW38|NFIL3_XENTR sp|Q1XGE2|HAC1_ASPOR
+1.1 13.4 sp|Q8HZP6|FOS_FELCA sp|Q1XGE2|HAC1_ASPOR
+1.2 13.3 sp|Q9SJN0|ABI5_ARATH sp|Q1XGE2|HAC1_ASPOR
+1.2 13.2 sp|P42777|GBF4_ARATH sp|Q1XGE2|HAC1_ASPOR
+1.3 13.1 sp|P15407|FOSL1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.3 13.1 sp|O15525|MAFG_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.4 13.0 sp|P40535|ACA2_YEAST sp|Q1XGE2|HAC1_ASPOR
+1.5 12.9 sp|A7YY73|MAFF_BOVIN sp|Q1XGE2|HAC1_ASPOR
+1.6 12.9 sp|Q8PY58|PSMR_METMA sp|Q1XGE2|HAC1_ASPOR
+1.6 12.8 sp|Q56TN0|FOS_PHORO sp|Q1XGE2|HAC1_ASPOR
+1.7 12.7 sp|P23050|FOS_AVINK sp|Q1XGE2|HAC1_ASPOR
+1.8 12.6 sp|Q9LES3|AI5L2_ARATH sp|Q1XGE2|HAC1_ASPOR
+2 12.5 sp|Q84JK2|FD_ARATH sp|Q1XGE2|HAC1_ASPOR
+2 12.5 sp|A5PJV0|MAFG_BOVIN sp|Q1XGE2|HAC1_ASPOR
+2 12.5 sp|O54790|MAFG_MOUSE sp|Q1XGE2|HAC1_ASPOR
+2 12.5 sp|Q39234|TGA3_ARATH sp|Q1XGE2|HAC1_ASPOR
+2.2 12.4 sp|P07049|CPPB_NEIGO sp|Q1XGE2|HAC1_ASPOR
+2.2 12.3 sp|P11939|FOS_CHICK sp|Q1XGE2|HAC1_ASPOR
+2.5 12.2 sp|P29176|FOSX_MSVFR sp|Q1XGE2|HAC1_ASPOR
+2.5 12.2 sp|O54791|MAFF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+2.7 12.1 sp|Q8TI88|PSMR_METAC sp|Q1XGE2|HAC1_ASPOR
+2.8 12.0 sp|O08750|NFIL3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+2.8 12.0 sp|Q76MX4|MAFG_RAT sp|Q1XGE2|HAC1_ASPOR
+3 11.9 sp|P20482|CNC_DROME sp|Q1XGE2|HAC1_ASPOR
+3.1 11.9 sp|Q90Z72|NFIL3_CHICK sp|Q1XGE2|HAC1_ASPOR
+3.2 11.8 sp|Q9VWW0|CREBB_DROME sp|Q1XGE2|HAC1_ASPOR
+3.2 11.8 sp|Q8BKJ9|SIRT7_MOUSE sp|Q1XGE2|HAC1_ASPOR
+3.3 11.8 sp|Q56TT7|FOS_PHOCM sp|Q1XGE2|HAC1_ASPOR
+3.3 11.8 sp|Q6IMZ0|NFIL3_RAT sp|Q1XGE2|HAC1_ASPOR
+3.5 11.7 sp|P38749|YAP3_YEAST sp|Q1XGE2|HAC1_ASPOR
+3.7 11.6 sp|Q08D88|NFIL3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+3.8 11.6 sp|Q16649|NFIL3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+3.8 11.6 sp|Q9C7S0|BZI60_ARATH sp|Q1XGE2|HAC1_ASPOR
+3.9 11.6 sp|P78962|ATF21_SCHPO sp|Q1XGE2|HAC1_ASPOR
+4 11.5 sp|Q1LZH5|CREM_BOVIN sp|Q1XGE2|HAC1_ASPOR
+4.2 11.4 sp|B1MX63|THIE_LEUCK sp|Q1XGE2|HAC1_ASPOR
+4.6 11.3 sp|Q5AVK6|NOP16_EMENI sp|Q1XGE2|HAC1_ASPOR
+4.6 11.3 sp|Q9ULX9|MAFF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+4.6 11.3 sp|P53567|CEBPG_HUMAN sp|Q1XGE2|HAC1_ASPOR
+4.8 11.2 sp|Q2V2M9|FHOD3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+4.9 11.2 sp|Q03060|CREM_HUMAN sp|Q1XGE2|HAC1_ASPOR
+4.9 11.2 sp|O68007|BACB_BACLI sp|Q1XGE2|HAC1_ASPOR
+5.1 11.2 sp|Q5VPE3|HOX2_ORYSJ sp|Q1XGE2|HAC1_ASPOR
+5.1 11.2 sp|Q84U86|HOX2_ORYSI sp|Q1XGE2|HAC1_ASPOR
+5.4 11.1 sp|Q65US7|THIE_MANSM sp|Q1XGE2|HAC1_ASPOR
+5.4 11.1 sp|P07948|LYN_HUMAN sp|Q1XGE2|HAC1_ASPOR
+5.4 11.1 sp|Q16534|HLF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+5.5 11.1 sp|Q9XGJ4|GGM13_GNEGN sp|Q1XGE2|HAC1_ASPOR
+5.8 11.0 sp|P27921|JUND_CHICK sp|Q1XGE2|HAC1_ASPOR
+5.9 10.9 sp|Q5XHX8|THEG_RAT sp|Q1XGE2|HAC1_ASPOR
+6 10.9 sp|P18847|ATF3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.1 10.9 sp|P24068|OCS1_MAIZE sp|Q1XGE2|HAC1_ASPOR
+6.2 10.9 sp|P20393|NR1D1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.3 10.9 sp|P13346|FOSB_MOUSE sp|Q1XGE2|HAC1_ASPOR
+6.4 10.8 sp|P42775|GBF2_ARATH sp|Q1XGE2|HAC1_ASPOR
+6.5 10.8 sp|Q09926|PCR1_SCHPO sp|Q1XGE2|HAC1_ASPOR
+6.9 10.7 sp|P24813|YAP2_YEAST sp|Q1XGE2|HAC1_ASPOR
+7 10.7 sp|Q64709|HLF_RAT sp|Q1XGE2|HAC1_ASPOR
+7.3 10.6 sp|Q02100|SKO1_YEAST sp|Q1XGE2|HAC1_ASPOR
+7.7 10.6 sp|P50198|LINX_PSEPA sp|Q1XGE2|HAC1_ASPOR
+7.7 10.6 sp|Q6DGM8|JDP2_DANRE sp|Q1XGE2|HAC1_ASPOR
+7.8 10.6 sp|A2Z0Q0|HOX25_ORYSI sp|Q1XGE2|HAC1_ASPOR
+7.9 10.5 sp|Q9UPR3|SMG5_HUMAN sp|Q1XGE2|HAC1_ASPOR
+8.1 10.5 sp|Q41558|HBP1C_WHEAT sp|Q1XGE2|HAC1_ASPOR
+8.2 10.5 sp|O02756|CEBPD_BOVIN sp|Q1XGE2|HAC1_ASPOR
+8.6 10.4 sp|Q63315|CAD22_RAT sp|Q1XGE2|HAC1_ASPOR
+8.7 10.4 sp|Q9WTP5|CAD22_MOUSE sp|Q1XGE2|HAC1_ASPOR
+9.3 10.3 sp|Q5FUV3|ATE_GLUOX sp|Q1XGE2|HAC1_ASPOR
+9.5 10.3 sp|Q99091|CPRF3_PETCR sp|Q1XGE2|HAC1_ASPOR
+9.5 10.3 sp|Q8BW74|HLF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+9.9 10.2 sp|Q9JLC6|TEF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+10 10.2 sp|Q92172|TEF_CHICK sp|Q1XGE2|HAC1_ASPOR
diff --git a/demotic/regress/phmmer-tbl.out b/demotic/regress/phmmer-tbl.out
new file mode 100644
index 0000000..a85d3a9
--- /dev/null
+++ b/demotic/regress/phmmer-tbl.out
@@ -0,0 +1,261 @@
+7.5e-120 0 1 181 sp|P55685|Y4WG_RHISN 1 181 sp|P55685|Y4WG_RHISN
+0.00026 0 63 108 sp|P55685|Y4WG_RHISN 39 86 sp|A1VDW9|HEM1_DESVV
+1.8 0 36 50 sp|P55685|Y4WG_RHISN 185 199 sp|A1VDW9|HEM1_DESVV
+0.00033 0 63 108 sp|P55685|Y4WG_RHISN 39 86 sp|Q72C23|HEM1_DESVH
+1.8 0 36 50 sp|P55685|Y4WG_RHISN 185 199 sp|Q72C23|HEM1_DESVH
+0.00077 0 36 76 sp|P55685|Y4WG_RHISN 93 131 sp|C0ZYA2|RIMP_RHOE4
+0.53 0 40 65 sp|P55685|Y4WG_RHISN 167 192 sp|C0ZYA2|RIMP_RHOE4
+0.016 0 101 123 sp|P55685|Y4WG_RHISN 44 66 sp|Q98G87|UBIG_RHILO
+0.02 0 71 103 sp|P55685|Y4WG_RHISN 122 156 sp|Q98G87|UBIG_RHILO
+0.00046 0 44 96 sp|P55685|Y4WG_RHISN 54 100 sp|B2VCH7|MTLD_ERWT9
+2.8 0 40 77 sp|P55685|Y4WG_RHISN 248 282 sp|B2VCH7|MTLD_ERWT9
+0.0004 0 56 119 sp|P55685|Y4WG_RHISN 304 362 sp|A1WE19|RLMN_VEREI
+6 0 77 108 sp|P55685|Y4WG_RHISN 135 156 sp|Q2J713|RLMN_FRASC
+0.00027 0 42 119 sp|P55685|Y4WG_RHISN 324 395 sp|Q2J713|RLMN_FRASC
+0.0004 0 107 155 sp|P55685|Y4WG_RHISN 126 173 sp|Q9CZP0|UFSP1_MOUSE
+3.6 0 17 37 sp|P55685|Y4WG_RHISN 192 213 sp|Q9CZP0|UFSP1_MOUSE
+1.4 0 74 156 sp|P55685|Y4WG_RHISN 105 129 sp|Q21KT6|RLMN_SACD2
+0.0011 0 67 115 sp|P55685|Y4WG_RHISN 324 366 sp|Q21KT6|RLMN_SACD2
+0.00035 0 105 152 sp|P55685|Y4WG_RHISN 146 193 sp|Q7W7U1|NADD_BORPA
+0.02 0 124 158 sp|P55685|Y4WG_RHISN 216 249 sp|Q8C6Y6|ASB14_MOUSE
+0.26 0 131 166 sp|P55685|Y4WG_RHISN 320 355 sp|Q8C6Y6|ASB14_MOUSE
+0.68 0 149 178 sp|P55685|Y4WG_RHISN 522 553 sp|Q8C6Y6|ASB14_MOUSE
+0.00044 0 64 101 sp|P55685|Y4WG_RHISN 22 59 sp|Q8Y3H7|Y003_RALSO
+0.77 0 93 133 sp|P55685|Y4WG_RHISN 14 53 sp|A4G4J9|RLMN_HERAR
+0.46 0 136 153 sp|P55685|Y4WG_RHISN 101 118 sp|A4G4J9|RLMN_HERAR
+0.0085 0 67 117 sp|P55685|Y4WG_RHISN 321 365 sp|A4G4J9|RLMN_HERAR
+0.00057 0 88 168 sp|P55685|Y4WG_RHISN 135 218 sp|B8F3W8|LEUC_HAEPS
+0.00041 0 142 173 sp|P55685|Y4WG_RHISN 32 62 sp|Q07074|YH007_YEAST
+0.76 0 93 133 sp|P55685|Y4WG_RHISN 13 52 sp|A6SZX3|RLMN_JANMA
+0.49 0 136 153 sp|P55685|Y4WG_RHISN 100 117 sp|A6SZX3|RLMN_JANMA
+0.0066 0 67 117 sp|P55685|Y4WG_RHISN 322 366 sp|A6SZX3|RLMN_JANMA
+1.3 0 95 116 sp|P55685|Y4WG_RHISN 135 156 sp|A2SHB8|RLMN_METPP
+0.00042 0 66 139 sp|P55685|Y4WG_RHISN 319 387 sp|A2SHB8|RLMN_METPP
+8.7e-232 0 1 345 sp|Q1XGE2|HAC1_ASPOR 1 345 sp|Q1XGE2|HAC1_ASPOR
+5.8e-173 0 11 344 sp|Q1XGE2|HAC1_ASPOR 16 348 sp|Q8TFU8|HAC1_EMENI
+5.8e-30 0 47 119 sp|Q1XGE2|HAC1_ASPOR 82 154 sp|Q8TFF3|HAC1_TRIRE
+7.1 0 209 234 sp|Q1XGE2|HAC1_ASPOR 287 308 sp|Q8TFF3|HAC1_TRIRE
+0.52 0 315 344 sp|Q1XGE2|HAC1_ASPOR 421 450 sp|Q8TFF3|HAC1_TRIRE
+5e-16 0 67 119 sp|Q1XGE2|HAC1_ASPOR 23 75 sp|P41546|HAC1_YEAST
+2.7e-14 0 59 153 sp|Q1XGE2|HAC1_ASPOR 64 158 sp|O24646|HY5_ARATH
+2.4e-10 0 68 145 sp|Q1XGE2|HAC1_ASPOR 52 139 sp|Q3SZZ2|XBP1_BOVIN
+3.7e-10 0 72 148 sp|Q1XGE2|HAC1_ASPOR 75 151 sp|Q9SM50|HY5_SOLLC
+9.4e-10 0 72 186 sp|Q1XGE2|HAC1_ASPOR 58 185 sp|P17861|XBP1_HUMAN
+4.9e-09 0 72 144 sp|Q1XGE2|HAC1_ASPOR 67 139 sp|Q8W191|HYH_ARATH
+1.5e-08 0 14 155 sp|Q1XGE2|HAC1_ASPOR 221 363 sp|A1L224|CR3L2_DANRE
+4.1e-08 0 76 147 sp|Q1XGE2|HAC1_ASPOR 186 257 sp|Q9D2A5|CR3L4_MOUSE
+4.2e-08 0 73 127 sp|Q1XGE2|HAC1_ASPOR 52 106 sp|Q9R1S4|XBP1_RAT
+1.1e-07 0 46 175 sp|Q1XGE2|HAC1_ASPOR 363 498 sp|Q54WN7|BZPF_DICDI
+1.6e-07 0 60 157 sp|Q1XGE2|HAC1_ASPOR 281 373 sp|A2VD01|CR3L2_XENLA
+9.1e-08 0 77 162 sp|Q1XGE2|HAC1_ASPOR 192 277 sp|Q99090|CPRF2_PETCR
+2.2e-07 0 77 154 sp|Q1XGE2|HAC1_ASPOR 233 310 sp|Q5FVM5|CR3L3_RAT
+1.7e-07 0 73 127 sp|Q1XGE2|HAC1_ASPOR 52 106 sp|O35426|XBP1_MOUSE
+1.7e-07 0 80 151 sp|Q1XGE2|HAC1_ASPOR 182 253 sp|Q61817|CREB3_MOUSE
+2.3e-07 0 77 154 sp|Q1XGE2|HAC1_ASPOR 233 310 sp|Q91XE9|CR3L3_MOUSE
+8.7 0 156 180 sp|Q1XGE2|HAC1_ASPOR 69 93 sp|O57342|MAFA_COTJA
+2.3e-07 0 85 167 sp|Q1XGE2|HAC1_ASPOR 201 281 sp|O57342|MAFA_COTJA
+4.8e-07 0 78 148 sp|Q1XGE2|HAC1_ASPOR 184 254 sp|Q5UEM7|CR3L4_RAT
+3.5e-07 0 24 151 sp|Q1XGE2|HAC1_ASPOR 160 284 sp|Q08CW8|CR3L4_XENTR
+1.8 0 115 178 sp|Q1XGE2|HAC1_ASPOR 15 81 sp|Q90370|MAFB_COTJA
+1.4e-06 0 53 149 sp|Q1XGE2|HAC1_ASPOR 195 292 sp|Q90370|MAFB_COTJA
+6.1e-07 0 77 161 sp|Q1XGE2|HAC1_ASPOR 237 321 sp|Q68CJ9|CR3L3_HUMAN
+7.4e-07 0 78 160 sp|Q1XGE2|HAC1_ASPOR 205 286 sp|Q1LYG4|CR3LB_DANRE
+8.1e-07 0 78 160 sp|Q1XGE2|HAC1_ASPOR 205 286 sp|Q502F0|CR3LA_DANRE
+1.8 0 115 178 sp|Q1XGE2|HAC1_ASPOR 15 81 sp|Q90888|MAFB_CHICK
+1.7e-06 0 52 149 sp|Q1XGE2|HAC1_ASPOR 194 292 sp|Q90888|MAFB_CHICK
+5e-07 0 77 161 sp|Q1XGE2|HAC1_ASPOR 232 316 sp|Q3SYZ3|CR3L3_BOVIN
+9.1e-07 0 54 159 sp|Q1XGE2|HAC1_ASPOR 270 370 sp|Q5RCM9|CR3L2_PONAB
+8.3e-07 0 72 148 sp|Q1XGE2|HAC1_ASPOR 226 303 sp|Q9Y5Q3|MAFB_HUMAN
+1e-06 0 54 159 sp|Q1XGE2|HAC1_ASPOR 270 370 sp|Q70SY1|CR3L2_HUMAN
+0.52 0 115 182 sp|Q1XGE2|HAC1_ASPOR 15 86 sp|Q6DE84|MAFB_XENLA
+1.7e-05 0 70 143 sp|Q1XGE2|HAC1_ASPOR 211 285 sp|Q6DE84|MAFB_XENLA
+1.3e-06 0 59 160 sp|Q1XGE2|HAC1_ASPOR 271 366 sp|Q9Z125|CR3L1_MOUSE
+1.1e-06 0 55 159 sp|Q1XGE2|HAC1_ASPOR 271 370 sp|Q8BH52|CR3L2_MOUSE
+9.1e-07 0 72 148 sp|Q1XGE2|HAC1_ASPOR 226 303 sp|P54842|MAFB_RAT
+1.3e-06 0 59 159 sp|Q1XGE2|HAC1_ASPOR 275 370 sp|Q6QDP7|CR3L2_RAT
+9.3e-07 0 71 135 sp|Q1XGE2|HAC1_ASPOR 17 78 sp|Q16520|BATF_HUMAN
+9.1e-07 0 72 148 sp|Q1XGE2|HAC1_ASPOR 226 303 sp|P54841|MAFB_MOUSE
+1.1e-06 0 72 147 sp|Q1XGE2|HAC1_ASPOR 226 302 sp|Q2PFS4|MAFB_MACFA
+8.7 0 156 180 sp|Q1XGE2|HAC1_ASPOR 69 93 sp|O42290|MAFA_CHICK
+1.1e-06 0 84 167 sp|Q1XGE2|HAC1_ASPOR 200 281 sp|O42290|MAFA_CHICK
+1.3e-06 0 70 143 sp|Q1XGE2|HAC1_ASPOR 22 95 sp|Q9NR55|BATF3_HUMAN
+2.6e-06 0 60 156 sp|Q1XGE2|HAC1_ASPOR 272 362 sp|Q96BA8|CR3L1_HUMAN
+1.6e-06 0 59 160 sp|Q1XGE2|HAC1_ASPOR 270 365 sp|Q66HA2|CR3L1_RAT
+4.4e-06 0 46 141 sp|Q1XGE2|HAC1_ASPOR 310 401 sp|P17544|ATF7_HUMAN
+3.6e-06 0 77 150 sp|Q1XGE2|HAC1_ASPOR 169 241 sp|O43889|CREB3_HUMAN
+2.1e-06 0 46 140 sp|Q1XGE2|HAC1_ASPOR 299 389 sp|Q8R0S1|ATF7_MOUSE
+5.4e-06 0 46 141 sp|Q1XGE2|HAC1_ASPOR 299 390 sp|Q5R9C9|ATF7_PONAB
+3e-06 0 71 135 sp|Q1XGE2|HAC1_ASPOR 17 78 sp|O35284|BATF_MOUSE
+4.8e-06 0 79 151 sp|Q1XGE2|HAC1_ASPOR 149 221 sp|Q8SQ19|CREB3_BOVIN
+5.5e-06 0 78 150 sp|Q1XGE2|HAC1_ASPOR 212 284 sp|Q8TEY5|CR3L4_HUMAN
+4.6e-06 0 81 143 sp|Q1XGE2|HAC1_ASPOR 26 88 sp|Q9D275|BATF3_MOUSE
+1.3 0 116 182 sp|Q1XGE2|HAC1_ASPOR 16 86 sp|Q504L8|MAFB_XENTR
+1.2e-05 0 54 147 sp|Q1XGE2|HAC1_ASPOR 201 295 sp|Q504L8|MAFB_XENTR
+4.8e-06 0 78 150 sp|Q1XGE2|HAC1_ASPOR 212 284 sp|Q5UEM8|CR3L4_MACFA
+1e-05 0 85 167 sp|Q1XGE2|HAC1_ASPOR 203 284 sp|Q4U1U2|MAFA_XENTR
+1.4 0 114 168 sp|Q1XGE2|HAC1_ASPOR 15 68 sp|P23091|MAF_AVIS4
+0.00013 0 85 148 sp|Q1XGE2|HAC1_ASPOR 276 339 sp|P23091|MAF_AVIS4
+1e-05 0 75 131 sp|Q1XGE2|HAC1_ASPOR 204 259 sp|P81269|ATF1_MOUSE
+1.4 0 114 168 sp|Q1XGE2|HAC1_ASPOR 15 68 sp|Q789F3|MAF_CHICK
+0.00015 0 85 148 sp|Q1XGE2|HAC1_ASPOR 276 339 sp|Q789F3|MAF_CHICK
+1.6e-05 0 64 149 sp|Q1XGE2|HAC1_ASPOR 427 507 sp|P29747|CREBA_DROME
+1.3e-05 0 75 155 sp|Q1XGE2|HAC1_ASPOR 270 346 sp|P18848|ATF4_HUMAN
+1.2 0 113 168 sp|Q1XGE2|HAC1_ASPOR 14 68 sp|P54844|MAF_RAT
+0.00013 0 85 148 sp|Q1XGE2|HAC1_ASPOR 286 349 sp|P54844|MAF_RAT
+1.3 0 113 168 sp|Q1XGE2|HAC1_ASPOR 14 68 sp|O75444|MAF_HUMAN
+0.00017 0 85 147 sp|Q1XGE2|HAC1_ASPOR 290 352 sp|O75444|MAF_HUMAN
+1.2e-05 0 81 143 sp|Q1XGE2|HAC1_ASPOR 26 88 sp|P97876|BATF3_RAT
+9.7e-06 0 63 155 sp|Q1XGE2|HAC1_ASPOR 254 344 sp|Q06507|ATF4_MOUSE
+1.4 0 113 168 sp|Q1XGE2|HAC1_ASPOR 14 68 sp|A7Z017|MAF_BOVIN
+0.00017 0 85 147 sp|Q1XGE2|HAC1_ASPOR 294 356 sp|A7Z017|MAF_BOVIN
+1.2 0 113 168 sp|Q1XGE2|HAC1_ASPOR 14 68 sp|Q0V9K1|MAF_XENTR
+0.00021 0 85 146 sp|Q1XGE2|HAC1_ASPOR 267 328 sp|Q0V9K1|MAF_XENTR
+1.9e-05 0 74 131 sp|Q1XGE2|HAC1_ASPOR 204 260 sp|Q08DA8|ATF1_BOVIN
+1.2e-05 0 78 166 sp|Q1XGE2|HAC1_ASPOR 45 134 sp|O60675|MAFK_HUMAN
+1.3 0 113 168 sp|Q1XGE2|HAC1_ASPOR 14 68 sp|P54843|MAF_MOUSE
+0.00019 0 85 148 sp|Q1XGE2|HAC1_ASPOR 287 350 sp|P54843|MAF_MOUSE
+2e-05 0 74 131 sp|Q1XGE2|HAC1_ASPOR 205 261 sp|P18846|ATF1_HUMAN
+1.5e-05 0 77 142 sp|Q1XGE2|HAC1_ASPOR 216 281 sp|P42774|GBF1_ARATH
+1.5e-05 0 78 165 sp|Q1XGE2|HAC1_ASPOR 45 133 sp|Q61827|MAFK_MOUSE
+2.3e-05 0 80 140 sp|Q1XGE2|HAC1_ASPOR 181 240 sp|P14233|TGA1B_TOBAC
+3.4e-05 0 47 144 sp|Q1XGE2|HAC1_ASPOR 230 327 sp|Q6NW59|ATF4_DANRE
+6.1e-05 0 82 133 sp|Q1XGE2|HAC1_ASPOR 165 215 sp|O24160|TGA21_TOBAC
+5.2 0 115 165 sp|Q1XGE2|HAC1_ASPOR 16 65 sp|Q98UK4|MAF_DANRE
+8.2e-05 0 85 144 sp|Q1XGE2|HAC1_ASPOR 243 302 sp|Q98UK4|MAF_DANRE
+4.2e-05 0 85 165 sp|Q1XGE2|HAC1_ASPOR 225 305 sp|A3KMR8|MAFA_DANRE
+3.5e-05 0 84 164 sp|Q1XGE2|HAC1_ASPOR 52 132 sp|Q90596|MAFK_CHICK
+5.2e-05 0 75 145 sp|Q1XGE2|HAC1_ASPOR 267 337 sp|Q3ZCH6|ATF4_BOVIN
+3.5e-05 0 77 145 sp|Q1XGE2|HAC1_ASPOR 65 134 sp|P97875|JDP2_MOUSE
+3.5e-05 0 77 145 sp|Q1XGE2|HAC1_ASPOR 65 134 sp|Q78E65|JDP2_RAT
+5.8e-05 0 85 159 sp|Q1XGE2|HAC1_ASPOR 227 301 sp|P12959|OP2_MAIZE
+2.9 0 141 170 sp|Q1XGE2|HAC1_ASPOR 19 48 sp|Q8K1L0|CREB5_MOUSE
+3.7e-05 0 51 143 sp|Q1XGE2|HAC1_ASPOR 193 284 sp|Q8K1L0|CREB5_MOUSE
+6.4e-05 0 77 131 sp|Q1XGE2|HAC1_ASPOR 38 91 sp|Q39140|TGA6_ARATH
+7.3e-05 0 73 131 sp|Q1XGE2|HAC1_ASPOR 37 91 sp|P23923|HBP1B_WHEAT
+8.1e-05 0 98 169 sp|Q1XGE2|HAC1_ASPOR 195 263 sp|Q00322|CEBPD_MOUSE
+7e-05 0 79 131 sp|Q1XGE2|HAC1_ASPOR 40 91 sp|Q39163|TGA5_ARATH
+8.4e-05 0 80 149 sp|Q1XGE2|HAC1_ASPOR 274 343 sp|Q54RZ9|BZPG_DICDI
+8.2e-05 0 85 168 sp|Q1XGE2|HAC1_ASPOR 262 348 sp|Q8CF90|MAFA_MOUSE
+5e-05 0 74 155 sp|Q1XGE2|HAC1_ASPOR 265 342 sp|Q9ES19|ATF4_RAT
+0.0001 0 79 131 sp|Q1XGE2|HAC1_ASPOR 40 91 sp|P43273|TGA2_ARATH
+1.5 0 132 182 sp|Q1XGE2|HAC1_ASPOR 36 86 sp|Q98UK5|MAFB_DANRE
+8.5e-05 0 73 144 sp|Q1XGE2|HAC1_ASPOR 259 331 sp|Q98UK5|MAFB_DANRE
+0.00015 0 64 125 sp|Q1XGE2|HAC1_ASPOR 316 376 sp|P16951|ATF2_MOUSE
+3.2 0 140 211 sp|Q1XGE2|HAC1_ASPOR 20 94 sp|P27925|CREB1_BOVIN
+0.0002 0 78 131 sp|Q1XGE2|HAC1_ASPOR 262 315 sp|P27925|CREB1_BOVIN
+0.00016 0 63 125 sp|Q1XGE2|HAC1_ASPOR 333 394 sp|P15336|ATF2_HUMAN
+0.00018 0 38 137 sp|Q1XGE2|HAC1_ASPOR 283 383 sp|O35451|ATF6B_MOUSE
+0.00014 0 13 118 sp|Q1XGE2|HAC1_ASPOR 185 290 sp|Q2VZV0|IF2_MAGSA
+0.00015 0 64 139 sp|Q1XGE2|HAC1_ASPOR 210 287 sp|Q6ZDF3|TRAB1_ORYSJ
+0.0002 0 73 141 sp|Q1XGE2|HAC1_ASPOR 200 265 sp|Q6P788|ATF5_RAT
+8.3 0 141 171 sp|Q1XGE2|HAC1_ASPOR 170 200 sp|Q02930|CREB5_HUMAN
+8.8e-05 0 51 143 sp|Q1XGE2|HAC1_ASPOR 344 435 sp|Q02930|CREB5_HUMAN
+0.0004 0 63 130 sp|Q1XGE2|HAC1_ASPOR 44 113 sp|Q66J36|NFIL3_XENLA
+7 0 29 51 sp|Q1XGE2|HAC1_ASPOR 196 218 sp|Q66J36|NFIL3_XENLA
+0.0002 0 85 167 sp|Q1XGE2|HAC1_ASPOR 255 335 sp|Q8NHW3|MAFA_HUMAN
+0.0003 0 79 234 sp|Q1XGE2|HAC1_ASPOR 134 294 sp|O88479|FOS_MESAU
+0.00024 0 64 137 sp|Q1XGE2|HAC1_ASPOR 232 306 sp|P23922|HBP1A_WHEAT
+0.00018 0 84 167 sp|Q1XGE2|HAC1_ASPOR 52 134 sp|Q90595|MAFF_CHICK
+0.0003 0 73 144 sp|Q1XGE2|HAC1_ASPOR 112 182 sp|P53450|FOS_TAKRU
+2.3 0 17 42 sp|Q1XGE2|HAC1_ASPOR 316 340 sp|P53450|FOS_TAKRU
+0.00044 0 64 125 sp|Q1XGE2|HAC1_ASPOR 316 376 sp|Q00969|ATF2_RAT
+0.00031 0 79 146 sp|Q1XGE2|HAC1_ASPOR 134 200 sp|O97930|FOS_PIG
+0.00033 0 80 131 sp|Q1XGE2|HAC1_ASPOR 299 350 sp|P79145|CREM_CANFA
+0.00045 0 37 138 sp|Q1XGE2|HAC1_ASPOR 285 387 sp|Q99941|ATF6B_HUMAN
+0.00033 0 79 146 sp|Q1XGE2|HAC1_ASPOR 134 200 sp|P01101|FOS_MOUSE
+0.00021 0 78 131 sp|Q1XGE2|HAC1_ASPOR 278 331 sp|P15337|CREB1_RAT
+0.00021 0 78 131 sp|Q1XGE2|HAC1_ASPOR 278 331 sp|P16220|CREB1_HUMAN
+0.00021 0 78 131 sp|Q1XGE2|HAC1_ASPOR 278 331 sp|Q01147|CREB1_MOUSE
+0.00044 0 66 129 sp|Q1XGE2|HAC1_ASPOR 319 380 sp|O93602|ATF2_CHICK
+0.0003 0 84 165 sp|Q1XGE2|HAC1_ASPOR 52 134 sp|Q90889|MAFG_CHICK
+0.00039 0 66 145 sp|Q1XGE2|HAC1_ASPOR 97 175 sp|P79702|FOS_CYPCA
+0.0004 0 81 140 sp|Q1XGE2|HAC1_ASPOR 208 267 sp|Q8X229|FCR3_CANAL
+0.00052 0 79 145 sp|Q1XGE2|HAC1_ASPOR 134 199 sp|P12841|FOS_RAT
+0.00052 0 82 159 sp|Q1XGE2|HAC1_ASPOR 192 253 sp|P49716|CEBPD_HUMAN
+0.00028 0 79 148 sp|Q1XGE2|HAC1_ASPOR 545 614 sp|Q554P0|BZPJ_DICDI
+0.00029 0 85 146 sp|Q1XGE2|HAC1_ASPOR 248 309 sp|Q55E93|BZPE_DICDI
+0.00043 0 76 131 sp|Q1XGE2|HAC1_ASPOR 184 239 sp|P51984|CREB_CHLVR
+0.0004 0 79 146 sp|Q1XGE2|HAC1_ASPOR 134 200 sp|P01102|FOS_MSVFB
+0.00052 0 79 144 sp|Q1XGE2|HAC1_ASPOR 134 198 sp|O77628|FOS_BOVIN
+0.00035 0 78 145 sp|Q1XGE2|HAC1_ASPOR 67 134 sp|Q8WYK2|JDP2_HUMAN
+0.00092 0 38 135 sp|Q1XGE2|HAC1_ASPOR 210 307 sp|Q60925|DBP_MOUSE
+0.00058 0 85 125 sp|Q1XGE2|HAC1_ASPOR 74 114 sp|P14232|TGA1A_TOBAC
+0.00092 0 38 135 sp|Q1XGE2|HAC1_ASPOR 210 307 sp|P16443|DBP_RAT
+0.00059 0 71 131 sp|Q1XGE2|HAC1_ASPOR 50 111 sp|Q68EL6|NFIL3_DANRE
+0.00069 0 79 144 sp|Q1XGE2|HAC1_ASPOR 134 198 sp|P01100|FOS_HUMAN
+0.00059 0 70 133 sp|Q1XGE2|HAC1_ASPOR 175 239 sp|Q9C5Q2|AI5L3_ARATH
+0.00083 0 71 132 sp|Q1XGE2|HAC1_ASPOR 60 122 sp|Q5FW38|NFIL3_XENTR
+0.00076 0 79 144 sp|Q1XGE2|HAC1_ASPOR 135 199 sp|Q8HZP6|FOS_FELCA
+0.00076 0 70 141 sp|Q1XGE2|HAC1_ASPOR 340 411 sp|Q9SJN0|ABI5_ARATH
+0.00074 0 77 134 sp|Q1XGE2|HAC1_ASPOR 181 238 sp|P42777|GBF4_ARATH
+0.00072 0 64 202 sp|Q1XGE2|HAC1_ASPOR 88 234 sp|P15407|FOSL1_HUMAN
+0.00059 0 84 152 sp|Q1XGE2|HAC1_ASPOR 52 120 sp|O15525|MAFG_HUMAN
+0.00098 0 85 133 sp|Q1XGE2|HAC1_ASPOR 427 475 sp|P40535|ACA2_YEAST
+0.00069 0 84 174 sp|Q1XGE2|HAC1_ASPOR 52 139 sp|A7YY73|MAFF_BOVIN
+0.075 0 110 154 sp|Q1XGE2|HAC1_ASPOR 26 70 sp|Q8PY58|PSMR_METMA
+0.15 0 115 194 sp|Q1XGE2|HAC1_ASPOR 255 332 sp|Q8PY58|PSMR_METMA
+0.0012 0 79 142 sp|Q1XGE2|HAC1_ASPOR 134 196 sp|Q56TN0|FOS_PHORO
+0.0011 0 79 140 sp|Q1XGE2|HAC1_ASPOR 88 148 sp|P23050|FOS_AVINK
+0.0011 0 68 126 sp|Q1XGE2|HAC1_ASPOR 207 268 sp|Q9LES3|AI5L2_ARATH
+0.0014 0 66 133 sp|Q1XGE2|HAC1_ASPOR 197 264 sp|Q84JK2|FD_ARATH
+0.0009 0 84 151 sp|Q1XGE2|HAC1_ASPOR 52 119 sp|A5PJV0|MAFG_BOVIN
+0.0009 0 84 151 sp|Q1XGE2|HAC1_ASPOR 52 119 sp|O54790|MAFG_MOUSE
+0.0014 0 77 131 sp|Q1XGE2|HAC1_ASPOR 90 144 sp|Q39234|TGA3_ARATH
+0.0013 0 108 151 sp|Q1XGE2|HAC1_ASPOR 147 194 sp|P07049|CPPB_NEIGO
+0.0015 0 79 140 sp|Q1XGE2|HAC1_ASPOR 133 193 sp|P11939|FOS_CHICK
+0.0011 0 80 144 sp|Q1XGE2|HAC1_ASPOR 111 174 sp|P29176|FOSX_MSVFR
+0.0011 0 84 168 sp|Q1XGE2|HAC1_ASPOR 52 133 sp|O54791|MAFF_MOUSE
+0.075 0 110 154 sp|Q1XGE2|HAC1_ASPOR 26 70 sp|Q8TI88|PSMR_METAC
+0.28 0 115 190 sp|Q1XGE2|HAC1_ASPOR 255 330 sp|Q8TI88|PSMR_METAC
+0.0021 0 69 129 sp|Q1XGE2|HAC1_ASPOR 58 119 sp|O08750|NFIL3_MOUSE
+0.0013 0 84 149 sp|Q1XGE2|HAC1_ASPOR 79 144 sp|Q76MX4|MAFG_RAT
+0.0025 0 85 152 sp|Q1XGE2|HAC1_ASPOR 1197 1264 sp|P20482|CNC_DROME
+0.0021 0 70 130 sp|Q1XGE2|HAC1_ASPOR 59 120 sp|Q90Z72|NFIL3_CHICK
+0.0022 0 78 131 sp|Q1XGE2|HAC1_ASPOR 296 348 sp|Q9VWW0|CREBB_DROME
+0.0019 0 74 164 sp|Q1XGE2|HAC1_ASPOR 19 111 sp|Q8BKJ9|SIRT7_MOUSE
+0.0025 0 79 144 sp|Q1XGE2|HAC1_ASPOR 134 198 sp|Q56TT7|FOS_PHOCM
+0.0023 0 69 129 sp|Q1XGE2|HAC1_ASPOR 58 119 sp|Q6IMZ0|NFIL3_RAT
+0.00037 0 81 140 sp|Q1XGE2|HAC1_ASPOR 142 201 sp|P38749|YAP3_YEAST
+0.0022 0 70 129 sp|Q1XGE2|HAC1_ASPOR 59 119 sp|Q08D88|NFIL3_BOVIN
+0.0023 0 70 129 sp|Q1XGE2|HAC1_ASPOR 59 119 sp|Q16649|NFIL3_HUMAN
+0.0026 0 80 142 sp|Q1XGE2|HAC1_ASPOR 137 199 sp|Q9C7S0|BZI60_ARATH
+0.0022 0 74 143 sp|Q1XGE2|HAC1_ASPOR 261 327 sp|P78962|ATF21_SCHPO
+0.0027 0 80 130 sp|Q1XGE2|HAC1_ASPOR 299 349 sp|Q1LZH5|CREM_BOVIN
+0.0029 0 189 227 sp|Q1XGE2|HAC1_ASPOR 139 177 sp|B1MX63|THIE_LEUCK
+0.0026 0 29 114 sp|Q1XGE2|HAC1_ASPOR 136 219 sp|Q5AVK6|NOP16_EMENI
+0.0022 0 84 152 sp|Q1XGE2|HAC1_ASPOR 52 120 sp|Q9ULX9|MAFF_HUMAN
+0.0023 0 90 147 sp|Q1XGE2|HAC1_ASPOR 58 112 sp|P53567|CEBPG_HUMAN
+0.0081 0 56 167 sp|Q1XGE2|HAC1_ASPOR 412 524 sp|Q2V2M9|FHOD3_HUMAN
+0.0028 0 80 130 sp|Q1XGE2|HAC1_ASPOR 299 349 sp|Q03060|CREM_HUMAN
+0.0045 0 181 256 sp|Q1XGE2|HAC1_ASPOR 353 428 sp|O68007|BACB_BACLI
+0.003 0 106 251 sp|Q1XGE2|HAC1_ASPOR 160 302 sp|Q5VPE3|HOX2_ORYSJ
+0.003 0 106 251 sp|Q1XGE2|HAC1_ASPOR 160 302 sp|Q84U86|HOX2_ORYSI
+0.0026 0 135 238 sp|Q1XGE2|HAC1_ASPOR 95 196 sp|Q65US7|THIE_MANSM
+0.0034 0 36 87 sp|Q1XGE2|HAC1_ASPOR 15 67 sp|P07948|LYN_HUMAN
+0.00042 0 21 145 sp|Q1XGE2|HAC1_ASPOR 163 287 sp|Q16534|HLF_HUMAN
+0.0026 0 74 147 sp|Q1XGE2|HAC1_ASPOR 92 165 sp|Q9XGJ4|GGM13_GNEGN
+0.0036 0 71 139 sp|Q1XGE2|HAC1_ASPOR 230 298 sp|P27921|JUND_CHICK
+0.0034 0 117 205 sp|Q1XGE2|HAC1_ASPOR 218 300 sp|Q5XHX8|THEG_RAT
+0.0034 0 76 158 sp|Q1XGE2|HAC1_ASPOR 82 163 sp|P18847|ATF3_HUMAN
+0.0034 0 84 149 sp|Q1XGE2|HAC1_ASPOR 25 90 sp|P24068|OCS1_MAIZE
+0.0043 0 83 197 sp|Q1XGE2|HAC1_ASPOR 173 288 sp|P20393|NR1D1_HUMAN
+0.0039 0 69 164 sp|Q1XGE2|HAC1_ASPOR 142 236 sp|P13346|FOSB_MOUSE
+0.0051 0 80 152 sp|Q1XGE2|HAC1_ASPOR 246 322 sp|P42775|GBF2_ARATH
+0.0079 0 74 145 sp|Q1XGE2|HAC1_ASPOR 4 73 sp|Q09926|PCR1_SCHPO
+0.0045 0 64 121 sp|Q1XGE2|HAC1_ASPOR 29 80 sp|P24813|YAP2_YEAST
+0.00076 0 24 145 sp|Q1XGE2|HAC1_ASPOR 166 287 sp|Q64709|HLF_RAT
+0.0047 0 79 120 sp|Q1XGE2|HAC1_ASPOR 425 466 sp|Q02100|SKO1_YEAST
+0.0045 0 138 190 sp|Q1XGE2|HAC1_ASPOR 164 217 sp|P50198|LINX_PSEPA
+0.0039 0 76 141 sp|Q1XGE2|HAC1_ASPOR 62 128 sp|Q6DGM8|JDP2_DANRE
+0.0036 0 53 173 sp|Q1XGE2|HAC1_ASPOR 21 140 sp|A2Z0Q0|HOX25_ORYSI
+0.0052 0 112 173 sp|Q1XGE2|HAC1_ASPOR 800 860 sp|Q9UPR3|SMG5_HUMAN
+0.00044 0 77 131 sp|Q1XGE2|HAC1_ASPOR 183 236 sp|Q41558|HBP1C_WHEAT
+0.005 0 74 164 sp|Q1XGE2|HAC1_ASPOR 171 246 sp|O02756|CEBPD_BOVIN
+0.0068 0 254 299 sp|Q1XGE2|HAC1_ASPOR 713 759 sp|Q63315|CAD22_RAT
+0.0068 0 254 299 sp|Q1XGE2|HAC1_ASPOR 713 759 sp|Q9WTP5|CAD22_MOUSE
+1.4 0 177 224 sp|Q1XGE2|HAC1_ASPOR 2 49 sp|Q5FUV3|ATE_GLUOX
+0.0033 0 137 193 sp|Q1XGE2|HAC1_ASPOR 48 102 sp|Q5FUV3|ATE_GLUOX
+0.0068 0 77 132 sp|Q1XGE2|HAC1_ASPOR 190 248 sp|Q99091|CPRF3_PETCR
+0.00051 0 23 145 sp|Q1XGE2|HAC1_ASPOR 165 287 sp|Q8BW74|HLF_MOUSE
+0.0066 0 52 134 sp|Q1XGE2|HAC1_ASPOR 201 282 sp|Q9JLC6|TEF_MOUSE
+0.0059 0 54 139 sp|Q1XGE2|HAC1_ASPOR 214 299 sp|Q92172|TEF_CHICK
diff --git a/demotic/regress/psiblast-profmark.out b/demotic/regress/psiblast-profmark.out
new file mode 100644
index 0000000..df2b96b
--- /dev/null
+++ b/demotic/regress/psiblast-profmark.out
@@ -0,0 +1,139 @@
+2e-73 276.0 sp|P78283|SECY_VIBCH A3CM55.1
+3e-73 275.0 sp|P43804|SECY_HAEIN A3CM55.1
+1e-72 273.0 sp|Q9HWF5|SECY_PSEAE A3CM55.1
+4e-71 268.0 sp|Q59912|SECY_STRGB A3CM55.1
+5e-70 264.0 sp|Q05217|SECY_STACT A3CM55.1
+1e-68 260.0 sp|Q59916|SECY_STRGR A3CM55.1
+3e-68 259.0 sp|O33006|SECY_MYCLE A3CM55.1
+4e-68 258.0 sp|P38376|SECY_CORGL A3CM55.1
+5e-68 258.0 sp|P77964|SECY_SYNY3 A3CM55.1
+2e-67 256.0 sp|P27148|SECY_LACLC A3CM55.1
+3e-67 255.0 sp|Q8CNF3|SECY_STAES A3CM55.1
+3e-67 255.0 sp|Q5HM19|SECY_STAEQ A3CM55.1
+3e-67 255.0 sp|P46785|SECY_STRCO A3CM55.1
+4e-67 255.0 sp|P49977|SECY_STRLI A3CM55.1
+4e-67 255.0 sp|P93690|SECY_SPIOL A3CM55.1
+5e-67 254.0 sp|Q7A086|SECY_STAAW A3CM55.1
+5e-67 254.0 sp|Q6G791|SECY_STAAS A3CM55.1
+5e-67 254.0 sp|Q6GEK3|SECY_STAAR A3CM55.1
+5e-67 254.0 sp|Q7A468|SECY_STAAN A3CM55.1
+5e-67 254.0 sp|Q99S39|SECY_STAAM A3CM55.1
+5e-67 254.0 sp|Q5HDX8|SECY_STAAC A3CM55.1
+5e-67 254.0 sp|O08387|SECY_STAA8 A3CM55.1
+7e-67 254.0 sp|P58118|SECY_LACLA A3CM55.1
+9e-67 253.0 sp|P0A5Z2|SECY_MYCTU A3CM55.1
+9e-67 253.0 sp|P0A5Z3|SECY_MYCBO A3CM55.1
+9e-67 253.0 sp|P43416|SECY_STRSC A3CM55.1
+2e-66 252.0 sp|Q9XQU4|SECY_PEA A3CM55.1
+2e-66 252.0 sp|P0AGA5|SECY_SHIFL A3CM55.1
+2e-66 252.0 sp|P0AGA2|SECY_ECOLI A3CM55.1
+2e-66 252.0 sp|P0AGA3|SECY_ECOL6 A3CM55.1
+2e-66 252.0 sp|P0AGA4|SECY_ECO57 A3CM55.1
+8e-66 250.0 sp|Q05207|SECY_BACLD A3CM55.1
+8e-66 250.0 sp|O63066|SECY_MAIZE A3CM55.1
+2e-65 249.0 sp|P16336|SECY_BACSU A3CM55.1
+7e-65 247.0 sp|P38375|SECY_BACHD A3CM55.1
+7e-65 247.0 sp|Q38885|SECY_ARATH A3CM55.1
+1e-64 246.0 sp|P0A4H1|SECY_SYNP6 A3CM55.1
+1e-64 246.0 sp|P0A4H0|SECY_SYNE7 A3CM55.1
+2e-64 246.0 sp|Q6ZG25|SECY_ORYSJ A3CM55.1
+8e-64 244.0 sp|P51297|SECY_PORPU A3CM55.1
+1e-62 240.0 sp|O66491|SECY_AQUAE A3CM55.1
+1e-62 240.0 sp|Q4UMQ9|SECY_RICFE A3CM55.1
+3e-62 238.0 sp|Q68W98|SECY_RICTY A3CM55.1
+4e-62 238.0 sp|Q92GY6|SECY_RICCN A3CM55.1
+6e-62 238.0 sp|Q1RHP1|SECY_RICBR A3CM55.1
+7e-62 237.0 sp|P38397|SECY_PYRSA A3CM55.1
+9e-62 237.0 sp|Q9ZCS5|SECY_RICPR A3CM55.1
+1e-61 236.0 sp|P28539|SECY_CHLTR A3CM55.1
+1e-61 236.0 sp|Q1XDJ1|SECY_PORYE A3CM55.1
+2e-60 233.0 sp|P28527|SECY_GUITH A3CM55.1
+3e-60 231.0 sp|Q89A85|SECY_BUCBP A3CM55.1
+6e-60 231.0 sp|P57571|SECY_BUCAI A3CM55.1
+2e-58 226.0 sp|Q8K969|SECY_BUCAP A3CM55.1
+9e-58 224.0 sp|Q59548|SECY_MYCPN A3CM55.1
+2e-57 222.0 sp|Q9PJN1|SECY_CHLMU A3CM55.1
+3e-57 222.0 sp|P33108|SECY_MICLU A3CM55.1
+7e-57 221.0 sp|O52351|SECY_MYCGA A3CM55.1
+2e-56 219.0 sp|P10250|SECY_MYCCT A3CM55.1
+3e-56 218.0 sp|P47416|SECY_MYCGE A3CM55.1
+9e-56 217.0 sp|Q9Z7S5|SECY_CHLPN A3CM55.1
+6e-55 214.0 sp|O25879|SECY_HELPY A3CM55.1
+7e-55 214.0 sp|Q9ZJS9|SECY_HELPJ A3CM55.1
+6e-54 211.0 sp|O59442|SECY_PYRHO A3CM55.1
+7e-54 211.0 sp|P49976|SECY_BUCAK A3CM55.1
+8e-54 210.0 sp|Q870W0|SC61A_NEUCR A3CM55.1
+1e-53 210.0 sp|Q9V1V8|SECY_PYRAB A3CM55.1
+1e-53 210.0 sp|Q8U019|SECY_PYRFU A3CM55.1
+3e-53 208.0 sp|Q54XK2|SC61A_DICDI A3CM55.1
+5e-52 205.0 sp|P49461|SECY_ODOSI A3CM55.1
+8e-52 204.0 sp|O51451|SECY_BORBU A3CM55.1
+1e-51 203.0 sp|Q5NVM7|S61A2_PONAB A3CM55.1
+2e-51 203.0 sp|Q96TW8|SC61A_HANAN A3CM55.1
+2e-51 203.0 sp|P78979|SC61A_YARLI A3CM55.1
+3e-51 202.0 sp|Q9JLR1|S61A2_MOUSE A3CM55.1
+3e-51 202.0 sp|Q9H9S3|S61A2_HUMAN A3CM55.1
+3e-51 202.0 sp|Q2KHX4|S61A2_BOVIN A3CM55.1
+3e-51 202.0 sp|Q90ZM2|S61A1_DANRE A3CM55.1
+3e-51 202.0 sp|Q8AY32|SC61A_GADOC A3CM55.1
+4e-51 201.0 sp|Q98SN8|S61A2_ONCMY A3CM55.1
+5e-51 201.0 sp|Q5EA68|S61A1_BOVIN A3CM55.1
+5e-51 201.0 sp|P61621|S61A1_RAT A3CM55.1
+5e-51 201.0 sp|Q5R5L5|S61A1_PONAB A3CM55.1
+5e-51 201.0 sp|P61620|S61A1_MOUSE A3CM55.1
+5e-51 201.0 sp|P61619|S61A1_HUMAN A3CM55.1
+6e-51 201.0 sp|Q7T278|SC61A_HARAN A3CM55.1
+6e-51 201.0 sp|Q7T277|SC61A_DISMA A3CM55.1
+7e-51 201.0 sp|Q8AY36|SC61A_PAGBO A3CM55.1
+7e-51 201.0 sp|Q8AY35|SC61A_NOTAN A3CM55.1
+8e-51 201.0 sp|Q8AY34|SC61A_HEMAM A3CM55.1
+8e-51 201.0 sp|Q90YL4|S61A2_DANRE A3CM55.1
+9e-51 200.0 sp|Q8AY31|SC61A_BOVVA A3CM55.1
+1e-50 200.0 sp|P38377|S61A1_CANFA A3CM55.1
+1e-50 199.0 sp|Q9P8E3|SC61A_CANAL A3CM55.1
+2e-50 199.0 sp|Q6FRY3|SC61A_CANGA A3CM55.1
+2e-50 199.0 sp|Q752H7|SC61A_ASHGO A3CM55.1
+2e-50 199.0 sp|P25014|SECY_CYAPA A3CM55.1
+3e-50 199.0 sp|Q6CPY9|SC61A_KLULA A3CM55.1
+4e-50 198.0 sp|Q6BN08|SC61A_DEBHA A3CM55.1
+4e-50 198.0 sp|Q8AY33|SC61A_BORSA A3CM55.1
+5e-50 198.0 sp|Q98SN9|S61A1_ONCMY A3CM55.1
+1e-48 193.0 sp|P46249|SECY_CYACA A3CM55.1
+2e-48 193.0 sp|P32915|SC61A_YEAST A3CM55.1
+4e-48 192.0 sp|Q25147|SC61A_HALRO A3CM55.1
+5e-48 191.0 sp|O26134|SECY_METTH A3CM55.1
+5e-47 188.0 sp|P38379|SC61A_PYRSA A3CM55.1
+8e-46 184.0 sp|Q37143|SECY_ANTSP A3CM55.1
+1e-45 183.0 sp|Q60175|SECY_METJA A3CM55.1
+3e-44 179.0 sp|P28540|SECY_PAVLU A3CM55.1
+5e-44 178.0 sp|P79088|SC61A_SCHPO A3CM55.1
+6e-43 174.0 sp|P28541|SECY_METVA A3CM55.1
+5e-42 171.0 sp|Q9YDD0|SECY_AERPE A3CM55.1
+7e-42 171.0 sp|O28377|SECY_ARCFU A3CM55.1
+3e-40 165.0 sp|P28542|SECY_HALMA A3CM55.1
+4e-39 162.0 sp|Q9HPB1|SECY_HALSA A3CM55.1
+2e-37 156.0 sp|Q977V3|SECY_HALVO A3CM55.1
+2e-32 140.0 sp|P49978|SECY_SULAC A3CM55.1
+9e-30 131.0 sp|Q9UX84|SECY_SULSO A3CM55.1
+7e-29 127.0 sp|P38353|SSH1_YEAST A3CM55.1
+1e-25 117.0 sp|O42965|YGMH_SCHPO A3CM55.1
+5e-20 99.0 sp|P72179|SECY_PARDE A3CM55.1
+1e-12 74.0 sp|P28620|SECY_BACST A3CM55.1
+1 34.0 sp|P0C6V7|R1AB_BEV A3CM55.1
+1.1 34.0 sp|P0C6F3|R1A_BEV A3CM55.1
+3.2 33.0 sp|Q49VR4|LTAS_STAS1 A3CM55.1
+3.6 33.0 sp|Q5HR16|LTAS_STAEQ A3CM55.1
+4 32.0 sp|Q8CQ10|LTAS_STAES A3CM55.1
+4.4 32.0 sp|Q6P6T5|OCLN_RAT A3CM55.1
+5.7 32.0 sp|P94493|YNCC_BACSU A3CM55.1
+6 32.0 sp|Q7A1I3|LTAS_STAAW A3CM55.1
+6 32.0 sp|Q6GBB1|LTAS_STAAS A3CM55.1
+6 32.0 sp|Q6GIS3|LTAS_STAAR A3CM55.1
+6 32.0 sp|Q7A6U1|LTAS_STAAN A3CM55.1
+6 32.0 sp|Q99VQ4|LTAS_STAAM A3CM55.1
+6 32.0 sp|Q5HHV4|LTAS_STAAC A3CM55.1
+6 32.0 sp|Q2G093|LTAS_STAA8 A3CM55.1
+6 32.0 sp|Q2FIS2|LTAS_STAA3 A3CM55.1
+6 32.0 sp|Q2YSL2|LTAS_STAAB A3CM55.1
+6.7 32.0 sp|P0C6V8|R1AB_BRV1 A3CM55.1
+7.6 32.0 sp|P0C6F4|R1A_BRV1 A3CM55.1
diff --git a/demotic/regress/psiblast-tbl.out b/demotic/regress/psiblast-tbl.out
new file mode 100644
index 0000000..b956383
--- /dev/null
+++ b/demotic/regress/psiblast-tbl.out
@@ -0,0 +1,139 @@
+2e-73 25 1 307 A3CM55.1 76 400 sp|P78283|SECY_VIBCH Preprotein translocase subunit secY OS=Vibrio
+3e-73 21 1 307 A3CM55.1 76 397 sp|P43804|SECY_HAEIN Preprotein translocase subunit secY
+1e-72 22 1 307 A3CM55.1 75 394 sp|Q9HWF5|SECY_PSEAE Preprotein translocase subunit secY
+4e-71 22 1 299 A3CM55.1 73 391 sp|Q59912|SECY_STRGB Preprotein translocase subunit secY
+5e-70 19 1 299 A3CM55.1 69 383 sp|Q05217|SECY_STACT Preprotein translocase subunit secY
+1e-68 22 1 302 A3CM55.1 72 393 sp|Q59916|SECY_STRGR Preprotein translocase subunit secY
+3e-68 20 3 323 A3CM55.1 74 418 sp|O33006|SECY_MYCLE Preprotein translocase subunit secY
+4e-68 21 1 305 A3CM55.1 73 397 sp|P38376|SECY_CORGL Preprotein translocase subunit secY
+5e-68 21 1 302 A3CM55.1 79 397 sp|P77964|SECY_SYNY3 Preprotein translocase subunit secY
+2e-67 22 1 308 A3CM55.1 69 397 sp|P27148|SECY_LACLC Preprotein translocase subunit secY
+3e-67 21 1 289 A3CM55.1 69 373 sp|Q8CNF3|SECY_STAES Preprotein translocase subunit secY
+3e-67 21 1 289 A3CM55.1 69 373 sp|Q5HM19|SECY_STAEQ Preprotein translocase subunit secY
+3e-67 21 1 302 A3CM55.1 73 394 sp|P46785|SECY_STRCO Preprotein translocase subunit secY
+4e-67 21 1 302 A3CM55.1 73 394 sp|P49977|SECY_STRLI Preprotein translocase subunit secY
+4e-67 19 1 302 A3CM55.1 190 497 sp|P93690|SECY_SPIOL Preprotein translocase subunit secY,
+5e-67 22 1 306 A3CM55.1 69 391 sp|Q7A086|SECY_STAAW Preprotein translocase subunit secY
+5e-67 22 1 306 A3CM55.1 69 391 sp|Q6G791|SECY_STAAS Preprotein translocase subunit secY
+5e-67 22 1 306 A3CM55.1 69 391 sp|Q6GEK3|SECY_STAAR Preprotein translocase subunit secY
+5e-67 22 1 306 A3CM55.1 69 391 sp|Q7A468|SECY_STAAN Preprotein translocase subunit secY
+5e-67 22 1 306 A3CM55.1 69 391 sp|Q99S39|SECY_STAAM Preprotein translocase subunit secY
+5e-67 22 1 306 A3CM55.1 69 391 sp|Q5HDX8|SECY_STAAC Preprotein translocase subunit secY
+5e-67 22 1 306 A3CM55.1 69 391 sp|O08387|SECY_STAA8 Preprotein translocase subunit secY
+7e-67 22 1 308 A3CM55.1 69 397 sp|P58118|SECY_LACLA Preprotein translocase subunit secY
+9e-67 20 1 323 A3CM55.1 75 421 sp|P0A5Z2|SECY_MYCTU Preprotein translocase subunit secY
+9e-67 20 1 323 A3CM55.1 75 421 sp|P0A5Z3|SECY_MYCBO Preprotein translocase subunit secY
+9e-67 21 1 302 A3CM55.1 73 394 sp|P43416|SECY_STRSC Preprotein translocase subunit secY
+2e-66 17 1 302 A3CM55.1 171 478 sp|Q9XQU4|SECY_PEA Preprotein translocase subunit secY,
+2e-66 23 1 307 A3CM55.1 76 399 sp|P0AGA5|SECY_SHIFL Preprotein translocase subunit secY
+2e-66 23 1 307 A3CM55.1 76 399 sp|P0AGA2|SECY_ECOLI Preprotein translocase subunit secY
+2e-66 23 1 307 A3CM55.1 76 399 sp|P0AGA3|SECY_ECOL6 Preprotein translocase subunit secY
+2e-66 23 1 307 A3CM55.1 76 399 sp|P0AGA4|SECY_ECO57 Preprotein translocase subunit secY
+8e-66 20 1 303 A3CM55.1 68 388 sp|Q05207|SECY_BACLD Preprotein translocase subunit secY
+8e-66 17 1 302 A3CM55.1 195 502 sp|O63066|SECY_MAIZE Preprotein translocase subunit secY,
+2e-65 19 1 306 A3CM55.1 68 392 sp|P16336|SECY_BACSU Preprotein translocase subunit secY
+7e-65 22 1 300 A3CM55.1 68 385 sp|P38375|SECY_BACHD Preprotein translocase subunit secY
+7e-65 18 1 303 A3CM55.1 193 501 sp|Q38885|SECY_ARATH Preprotein translocase subunit secY,
+1e-64 21 1 301 A3CM55.1 83 394 sp|P0A4H1|SECY_SYNP6 Preprotein translocase subunit secY
+1e-64 21 1 301 A3CM55.1 83 394 sp|P0A4H0|SECY_SYNE7 Preprotein translocase subunit secY
+2e-64 17 1 303 A3CM55.1 198 506 sp|Q6ZG25|SECY_ORYSJ Preprotein translocase subunit secY,
+8e-64 22 1 309 A3CM55.1 62 376 sp|P51297|SECY_PORPU Preprotein translocase subunit secY
+1e-62 23 1 307 A3CM55.1 71 393 sp|O66491|SECY_AQUAE Preprotein translocase subunit secY OS=Aquifex
+1e-62 19 1 325 A3CM55.1 70 407 sp|Q4UMQ9|SECY_RICFE Preprotein translocase subunit secY
+3e-62 18 1 325 A3CM55.1 70 407 sp|Q68W98|SECY_RICTY Preprotein translocase subunit secY
+4e-62 18 1 325 A3CM55.1 70 407 sp|Q92GY6|SECY_RICCN Preprotein translocase subunit secY
+6e-62 18 1 325 A3CM55.1 70 407 sp|Q1RHP1|SECY_RICBR Preprotein translocase subunit secY
+7e-62 22 1 303 A3CM55.1 68 370 sp|P38397|SECY_PYRSA Preprotein translocase subunit secY (Fragment)
+9e-62 18 1 325 A3CM55.1 70 407 sp|Q9ZCS5|SECY_RICPR Preprotein translocase subunit secY
+1e-61 21 1 303 A3CM55.1 73 405 sp|P28539|SECY_CHLTR Preprotein translocase subunit secY
+1e-61 22 1 309 A3CM55.1 62 376 sp|Q1XDJ1|SECY_PORYE Preprotein translocase subunit secY
+2e-60 19 1 303 A3CM55.1 68 378 sp|P28527|SECY_GUITH Preprotein translocase subunit secY
+3e-60 20 1 307 A3CM55.1 77 400 sp|Q89A85|SECY_BUCBP Preprotein translocase subunit secY
+6e-60 23 1 307 A3CM55.1 76 397 sp|P57571|SECY_BUCAI Preprotein translocase subunit secY
+2e-58 23 1 307 A3CM55.1 76 399 sp|Q8K969|SECY_BUCAP Preprotein translocase subunit secY
+9e-58 21 3 303 A3CM55.1 85 406 sp|Q59548|SECY_MYCPN Preprotein translocase subunit secY
+2e-57 20 1 303 A3CM55.1 73 405 sp|Q9PJN1|SECY_CHLMU Preprotein translocase subunit secY
+3e-57 19 1 303 A3CM55.1 73 394 sp|P33108|SECY_MICLU Preprotein translocase subunit secY
+7e-57 25 3 303 A3CM55.1 82 401 sp|O52351|SECY_MYCGA Preprotein translocase subunit secY
+2e-56 21 1 303 A3CM55.1 93 424 sp|P10250|SECY_MYCCT Preprotein translocase subunit secY
+3e-56 22 3 302 A3CM55.1 83 403 sp|P47416|SECY_MYCGE Preprotein translocase subunit secY
+9e-56 20 1 303 A3CM55.1 73 405 sp|Q9Z7S5|SECY_CHLPN Preprotein translocase subunit secY
+6e-55 23 1 307 A3CM55.1 62 382 sp|O25879|SECY_HELPY Preprotein translocase subunit secY
+7e-55 23 1 307 A3CM55.1 62 382 sp|Q9ZJS9|SECY_HELPJ Preprotein translocase subunit secY
+6e-54 16 1 304 A3CM55.1 72 431 sp|O59442|SECY_PYRHO Preprotein translocase subunit secY
+7e-54 21 1 265 A3CM55.1 76 356 sp|P49976|SECY_BUCAK Preprotein translocase subunit secY (Fragment)
+8e-54 15 1 319 A3CM55.1 76 460 sp|Q870W0|SC61A_NEUCR Protein transport protein SEC61 subunit alpha
+1e-53 15 1 304 A3CM55.1 72 431 sp|Q9V1V8|SECY_PYRAB Preprotein translocase subunit secY
+1e-53 16 1 304 A3CM55.1 72 431 sp|Q8U019|SECY_PYRFU Preprotein translocase subunit secY
+3e-53 13 1 304 A3CM55.1 75 441 sp|Q54XK2|SC61A_DICDI Protein transport protein Sec61 subunit alpha
+5e-52 22 1 303 A3CM55.1 66 383 sp|P49461|SECY_ODOSI Preprotein translocase subunit secY
+8e-52 18 1 303 A3CM55.1 72 381 sp|O51451|SECY_BORBU Preprotein translocase subunit secY
+1e-51 15 1 321 A3CM55.1 75 462 sp|Q5NVM7|S61A2_PONAB Protein transport protein Sec61 subunit alpha
+2e-51 15 1 304 A3CM55.1 76 442 sp|Q96TW8|SC61A_HANAN Protein transport protein SEC61 subunit alpha
+2e-51 13 1 303 A3CM55.1 76 441 sp|P78979|SC61A_YARLI Protein transport protein SEC61 subunit alpha
+3e-51 15 1 321 A3CM55.1 75 462 sp|Q9JLR1|S61A2_MOUSE Protein transport protein Sec61 subunit alpha
+3e-51 15 1 321 A3CM55.1 75 462 sp|Q9H9S3|S61A2_HUMAN Protein transport protein Sec61 subunit alpha
+3e-51 15 1 321 A3CM55.1 75 462 sp|Q2KHX4|S61A2_BOVIN Protein transport protein Sec61 subunit alpha
+3e-51 13 1 321 A3CM55.1 75 462 sp|Q90ZM2|S61A1_DANRE Protein transport protein Sec61 subunit
+3e-51 13 1 321 A3CM55.1 75 462 sp|Q8AY32|SC61A_GADOC Protein transport protein Sec61 subunit alpha
+4e-51 13 1 321 A3CM55.1 75 462 sp|Q98SN8|S61A2_ONCMY Protein transport protein Sec61 subunit alpha
+5e-51 14 1 321 A3CM55.1 75 462 sp|Q5EA68|S61A1_BOVIN Protein transport protein Sec61 subunit alpha
+5e-51 14 1 321 A3CM55.1 75 462 sp|P61621|S61A1_RAT Protein transport protein Sec61 subunit alpha
+5e-51 14 1 321 A3CM55.1 75 462 sp|Q5R5L5|S61A1_PONAB Protein transport protein Sec61 subunit alpha
+5e-51 14 1 321 A3CM55.1 75 462 sp|P61620|S61A1_MOUSE Protein transport protein Sec61 subunit alpha
+5e-51 14 1 321 A3CM55.1 75 462 sp|P61619|S61A1_HUMAN Protein transport protein Sec61 subunit alpha
+6e-51 13 1 321 A3CM55.1 75 462 sp|Q7T278|SC61A_HARAN Protein transport protein Sec61 subunit alpha
+6e-51 13 1 321 A3CM55.1 75 462 sp|Q7T277|SC61A_DISMA Protein transport protein Sec61 subunit alpha
+7e-51 13 1 321 A3CM55.1 75 462 sp|Q8AY36|SC61A_PAGBO Protein transport protein Sec61 subunit alpha
+7e-51 13 1 321 A3CM55.1 75 462 sp|Q8AY35|SC61A_NOTAN Protein transport protein Sec61 subunit alpha
+8e-51 14 1 321 A3CM55.1 75 462 sp|Q8AY34|SC61A_HEMAM Protein transport protein Sec61 subunit alpha
+8e-51 14 1 321 A3CM55.1 75 462 sp|Q90YL4|S61A2_DANRE Protein transport protein Sec61 subunit
+9e-51 13 1 321 A3CM55.1 75 462 sp|Q8AY31|SC61A_BOVVA Protein transport protein Sec61 subunit alpha
+1e-50 14 1 321 A3CM55.1 75 462 sp|P38377|S61A1_CANFA Protein transport protein Sec61 subunit alpha
+1e-50 15 1 304 A3CM55.1 76 442 sp|Q9P8E3|SC61A_CANAL Protein transport protein SEC61 subunit alpha
+2e-50 14 1 304 A3CM55.1 75 442 sp|Q6FRY3|SC61A_CANGA Protein transport protein SEC61 subunit alpha
+2e-50 13 1 304 A3CM55.1 75 443 sp|Q752H7|SC61A_ASHGO Protein transport protein SEC61 subunit alpha
+2e-50 20 1 310 A3CM55.1 109 441 sp|P25014|SECY_CYAPA Preprotein translocase subunit secY
+3e-50 13 1 304 A3CM55.1 75 443 sp|Q6CPY9|SC61A_KLULA Protein transport protein SEC61 subunit alpha
+4e-50 14 1 304 A3CM55.1 76 442 sp|Q6BN08|SC61A_DEBHA Protein transport protein SEC61 subunit alpha
+4e-50 13 1 321 A3CM55.1 75 462 sp|Q8AY33|SC61A_BORSA Protein transport protein Sec61 subunit alpha
+5e-50 13 1 321 A3CM55.1 75 462 sp|Q98SN9|S61A1_ONCMY Protein transport protein Sec61 subunit alpha
+1e-48 18 1 303 A3CM55.1 62 368 sp|P46249|SECY_CYACA Preprotein translocase subunit secY
+2e-48 14 1 304 A3CM55.1 76 443 sp|P32915|SC61A_YEAST Protein transport protein SEC61
+4e-48 15 1 321 A3CM55.1 75 461 sp|Q25147|SC61A_HALRO Protein transport protein Sec61 subunit alpha
+5e-48 15 1 298 A3CM55.1 73 413 sp|O26134|SECY_METTH Preprotein translocase subunit secY
+5e-47 16 1 304 A3CM55.1 78 447 sp|P38379|SC61A_PYRSA Protein transport protein Sec61 subunit alpha
+8e-46 19 1 303 A3CM55.1 62 364 sp|Q37143|SECY_ANTSP Preprotein translocase subunit secY
+1e-45 14 1 304 A3CM55.1 69 399 sp|Q60175|SECY_METJA Preprotein translocase subunit secY
+3e-44 19 1 320 A3CM55.1 66 396 sp|P28540|SECY_PAVLU Preprotein translocase subunit secY OS=Pavlova
+5e-44 13 1 304 A3CM55.1 76 442 sp|P79088|SC61A_SCHPO Protein transport protein sec61 subunit alpha
+6e-43 14 1 304 A3CM55.1 68 400 sp|P28541|SECY_METVA Preprotein translocase subunit secY
+5e-42 13 1 304 A3CM55.1 73 417 sp|Q9YDD0|SECY_AERPE Preprotein translocase subunit secY
+7e-42 11 1 304 A3CM55.1 73 452 sp|O28377|SECY_ARCFU Preprotein translocase subunit secY
+3e-40 13 1 304 A3CM55.1 73 449 sp|P28542|SECY_HALMA Preprotein translocase subunit secY
+4e-39 12 1 304 A3CM55.1 72 450 sp|Q9HPB1|SECY_HALSA Preprotein translocase subunit secY
+2e-37 11 1 304 A3CM55.1 73 449 sp|Q977V3|SECY_HALVO Preprotein translocase subunit secY
+2e-32 12 1 304 A3CM55.1 74 426 sp|P49978|SECY_SULAC Preprotein translocase subunit secY
+9e-30 13 1 304 A3CM55.1 73 432 sp|Q9UX84|SECY_SULSO Preprotein translocase subunit secY
+7e-29 15 1 304 A3CM55.1 78 448 sp|P38353|SSH1_YEAST Sec sixty-one protein homolog OS=Saccharomyces
+1e-25 10 1 300 A3CM55.1 76 442 sp|O42965|YGMH_SCHPO Uncharacterized protein C19G7.17
+5e-20 18 186 297 A3CM55.1 1 111 sp|P72179|SECY_PARDE Preprotein translocase subunit secY (Fragment)
+1e-12 35 247 303 A3CM55.1 1 57 sp|P28620|SECY_BACST Preprotein translocase subunit secY (Fragment)
+1.0 11 135 232 A3CM55.1 3061 3154 sp|P0C6V7|R1AB_BEV Replicase polyprotein 1ab OS=Berne virus GN=rep
+1.1 11 135 232 A3CM55.1 3061 3154 sp|P0C6F3|R1A_BEV Replicase polyprotein 1a OS=Berne virus GN=1a PE=1
+3.2 13 70 149 A3CM55.1 11 91 sp|Q49VR4|LTAS_STAS1 Glycerol phosphate lipoteichoic acid synthase
+3.6 9 60 149 A3CM55.1 1 91 sp|Q5HR16|LTAS_STAEQ Glycerol phosphate lipoteichoic acid synthase
+4.0 10 60 149 A3CM55.1 1 91 sp|Q8CQ10|LTAS_STAES Glycerol phosphate lipoteichoic acid synthase
+4.4 8 42 155 A3CM55.1 142 270 sp|Q6P6T5|OCLN_RAT Occludin OS=Rattus norvegicus GN=Ocln PE=2 SV=1
+5.7 13 44 146 A3CM55.1 332 436 sp|P94493|YNCC_BACSU Putative metabolite transport protein yncC
+6.0 11 70 149 A3CM55.1 11 91 sp|Q7A1I3|LTAS_STAAW Glycerol phosphate lipoteichoic acid synthase
+6.0 11 70 149 A3CM55.1 11 91 sp|Q6GBB1|LTAS_STAAS Glycerol phosphate lipoteichoic acid synthase
+6.0 11 70 149 A3CM55.1 11 91 sp|Q6GIS3|LTAS_STAAR Glycerol phosphate lipoteichoic acid synthase
+6.0 11 70 149 A3CM55.1 11 91 sp|Q7A6U1|LTAS_STAAN Glycerol phosphate lipoteichoic acid synthase
+6.0 11 70 149 A3CM55.1 11 91 sp|Q99VQ4|LTAS_STAAM Glycerol phosphate lipoteichoic acid synthase
+6.0 11 70 149 A3CM55.1 11 91 sp|Q5HHV4|LTAS_STAAC Glycerol phosphate lipoteichoic acid synthase
+6.0 11 70 149 A3CM55.1 11 91 sp|Q2G093|LTAS_STAA8 Glycerol phosphate lipoteichoic acid synthase
+6.0 11 70 149 A3CM55.1 11 91 sp|Q2FIS2|LTAS_STAA3 Glycerol phosphate lipoteichoic acid synthase
+6.0 11 70 149 A3CM55.1 11 91 sp|Q2YSL2|LTAS_STAAB Glycerol phosphate lipoteichoic acid synthase
+6.7 11 108 241 A3CM55.1 2926 3042 sp|P0C6V8|R1AB_BRV1 Replicase polyprotein 1ab OS=Breda virus 1 GN=rep
+7.6 11 108 241 A3CM55.1 2926 3042 sp|P0C6F4|R1A_BRV1 Replicase polyprotein 1a OS=Breda virus 1 GN=1a
diff --git a/demotic/regress/ssearch-profmark.out b/demotic/regress/ssearch-profmark.out
new file mode 100644
index 0000000..748a56a
--- /dev/null
+++ b/demotic/regress/ssearch-profmark.out
@@ -0,0 +1,165 @@
+1.4e-78 292.6 sp|P55685|Y4WG_RHISN sp|P55685|Y4WG_RHISN
+4.1 32.9 sp|Q7SY73|ABH6B_XENLA sp|P55685|Y4WG_RHISN
+1.6e-109 397.3 sp|Q1XGE2|HAC1_ASPOR sp|Q1XGE2|HAC1_ASPOR
+2e-82 307.2 sp|Q8TFU8|HAC1_EMENI sp|Q1XGE2|HAC1_ASPOR
+1.7e-15 85.3 sp|Q8TFF3|HAC1_TRIRE sp|Q1XGE2|HAC1_ASPOR
+4.9e-06 52.9 sp|P41546|HAC1_YEAST sp|Q1XGE2|HAC1_ASPOR
+0.00016 47.5 sp|O24646|HY5_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.0042 43.3 sp|P17861|XBP1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0048 43.1 sp|Q3SZZ2|XBP1_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.0068 43.6 sp|A1L224|CR3L2_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.0083 41.6 sp|Q9SM50|HY5_SOLLC sp|Q1XGE2|HAC1_ASPOR
+0.0097 43.1 sp|Q8BH52|CR3L2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.01 43.3 sp|Q54WN7|BZPF_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.021 43.3 sp|A3LYI0|NST1_PICST sp|Q1XGE2|HAC1_ASPOR
+0.028 41.6 sp|Q66HA2|CR3L1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.035 41.1 sp|Q3SYZ3|CR3L3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.036 41.2 sp|Q9Z125|CR3L1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.045 40.9 sp|Q96BA8|CR3L1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.045 40.9 sp|Q70SY1|CR3L2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.058 40.5 sp|Q5RCM9|CR3L2_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.071 39.9 sp|Q61817|CREB3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.074 40.2 sp|A2VD01|CR3L2_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.076 39.9 sp|Q08CW8|CR3L4_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.082 40.0 sp|Q6QDP7|CR3L2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.12 38.9 sp|P13346|FOSB_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.14 39.2 sp|Q91XE9|CR3L3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.14 40.7 sp|Q5A2K0|NST1_CANAL sp|Q1XGE2|HAC1_ASPOR
+0.17 37.2 sp|Q8W191|HYH_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.17 38.3 sp|Q9TUB3|FOSB_CANFA sp|Q1XGE2|HAC1_ASPOR
+0.19 38.7 sp|Q5FVM5|CR3L3_RAT sp|Q1XGE2|HAC1_ASPOR
+0.2 37.8 sp|P0C5H8|KAPC_EMENI sp|Q1XGE2|HAC1_ASPOR
+0.25 37.8 sp|P53539|FOSB_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.29 37.6 sp|P79702|FOS_CYPCA sp|Q1XGE2|HAC1_ASPOR
+0.3 39.3 sp|Q0D9R7|ARFS_ORYSJ sp|Q1XGE2|HAC1_ASPOR
+0.32 37.1 sp|P15407|FOSL1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.37 39.0 sp|Q5B3C8|NST1_EMENI sp|Q1XGE2|HAC1_ASPOR
+0.38 38.5 sp|Q9WVS8|MK07_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.4 37.3 sp|O97930|FOS_PIG sp|Q1XGE2|HAC1_ASPOR
+0.41 37.1 sp|Q06507|ATF4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.59 36.5 sp|Q90370|MAFB_COTJA sp|Q1XGE2|HAC1_ASPOR
+0.59 36.5 sp|Q90888|MAFB_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.7 36.8 sp|Q68CJ9|CR3L3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.73 35.3 sp|Q09926|PCR1_SCHPO sp|Q1XGE2|HAC1_ASPOR
+0.74 39.8 sp|O88778|BSN_RAT sp|Q1XGE2|HAC1_ASPOR
+0.77 36.8 sp|Q8VCH8|UBXN4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.79 36.3 sp|Q9D2A5|CR3L4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.79 38.1 sp|A4R2R1|NST1_MAGGR sp|Q1XGE2|HAC1_ASPOR
+0.85 36.1 sp|P18848|ATF4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.92 36.1 sp|O88479|FOS_MESAU sp|Q1XGE2|HAC1_ASPOR
+0.94 37.1 sp|A5PKJ4|MK07_BOVIN sp|Q1XGE2|HAC1_ASPOR
+1 37.9 sp|Q1DQC1|PAN1_COCIM sp|Q1XGE2|HAC1_ASPOR
+1 35.9 sp|P01101|FOS_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1 35.8 sp|Q6NW59|ATF4_DANRE sp|Q1XGE2|HAC1_ASPOR
+1.1 37.9 sp|Q76LL6|FHOD3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.1 35.9 sp|Q8TEY5|CR3L4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.1 35.9 sp|Q99090|CPRF2_PETCR sp|Q1XGE2|HAC1_ASPOR
+1.2 36.1 sp|Q5R9C9|ATF7_PONAB sp|Q1XGE2|HAC1_ASPOR
+1.2 36.1 sp|P17544|ATF7_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.2 35.8 sp|Q5UEM8|CR3L4_MACFA sp|Q1XGE2|HAC1_ASPOR
+1.3 35.4 sp|P51145|FOSL2_RAT sp|Q1XGE2|HAC1_ASPOR
+1.3 35.6 sp|P01100|FOS_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.4 36.6 sp|Q03173|ENAH_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.4 35.3 sp|Q9Y5Q3|MAFB_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.5 34.9 sp|Q9R1S4|XBP1_RAT sp|Q1XGE2|HAC1_ASPOR
+1.5 35.4 sp|P01102|FOS_MSVFB sp|Q1XGE2|HAC1_ASPOR
+1.5 34.9 sp|P10158|FOSL1_RAT sp|Q1XGE2|HAC1_ASPOR
+1.6 37.1 sp|Q6Y7W8|PERQ2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.6 35.1 sp|P15408|FOSL2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.7 35.4 sp|Q502F0|CR3LA_DANRE sp|Q1XGE2|HAC1_ASPOR
+1.8 34.7 sp|A2R346|KAPC_ASPNC sp|Q1XGE2|HAC1_ASPOR
+1.8 34.9 sp|Q2PFS4|MAFB_MACFA sp|Q1XGE2|HAC1_ASPOR
+1.8 35.2 sp|Q8R0S1|ATF7_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.9 34.6 sp|P48755|FOSL1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.9 36.1 sp|Q9UQ88|CD11A_HUMAN sp|Q1XGE2|HAC1_ASPOR
+2 33.4 sp|Q16520|BATF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+2 34.6 sp|Q0CEI3|KAPC_ASPTN sp|Q1XGE2|HAC1_ASPOR
+2 34.7 sp|P54842|MAFB_RAT sp|Q1XGE2|HAC1_ASPOR
+2 35.4 sp|P29747|CREBA_DROME sp|Q1XGE2|HAC1_ASPOR
+2 34.7 sp|P47930|FOSL2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+2.1 35.1 sp|Q63ZM7|STABP_XENLA sp|Q1XGE2|HAC1_ASPOR
+2.1 34.9 sp|Q91496|FOS_TETFL sp|Q1XGE2|HAC1_ASPOR
+2.1 34.4 sp|O35426|XBP1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+2.2 34.7 sp|Q9ES19|ATF4_RAT sp|Q1XGE2|HAC1_ASPOR
+2.3 34.2 sp|O02756|CEBPD_BOVIN sp|Q1XGE2|HAC1_ASPOR
+2.3 34.6 sp|P54841|MAFB_MOUSE sp|Q1XGE2|HAC1_ASPOR
+2.3 34.4 sp|A1C9M5|KAPC_ASPCL sp|Q1XGE2|HAC1_ASPOR
+2.3 34.7 sp|Q8SQ19|CREB3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+2.4 34.7 sp|O77628|FOS_BOVIN sp|Q1XGE2|HAC1_ASPOR
+2.4 35.7 sp|Q6NS15|MED15_XENLA sp|Q1XGE2|HAC1_ASPOR
+2.5 33.9 sp|P94517|YSCB_BACSU sp|Q1XGE2|HAC1_ASPOR
+2.5 34.4 sp|Q504L8|MAFB_XENTR sp|Q1XGE2|HAC1_ASPOR
+2.5 34.2 sp|O57342|MAFA_COTJA sp|Q1XGE2|HAC1_ASPOR
+2.7 34.6 sp|P12841|FOS_RAT sp|Q1XGE2|HAC1_ASPOR
+2.7 34.6 sp|Q8HZP6|FOS_FELCA sp|Q1XGE2|HAC1_ASPOR
+2.7 34.6 sp|Q56TT7|FOS_PHOCM sp|Q1XGE2|HAC1_ASPOR
+2.7 35.7 sp|Q2VZV0|IF2_MAGSA sp|Q1XGE2|HAC1_ASPOR
+2.8 34.4 sp|Q3ZCH6|ATF4_BOVIN sp|Q1XGE2|HAC1_ASPOR
+2.8 34.9 sp|Q5HZY0|UBXN4_RAT sp|Q1XGE2|HAC1_ASPOR
+2.8 35.6 sp|P0C865|MK07_RAT sp|Q1XGE2|HAC1_ASPOR
+2.9 33.9 sp|Q9N0J3|CEBPD_SHEEP sp|Q1XGE2|HAC1_ASPOR
+2.9 34.4 sp|Q5UEM7|CR3L4_RAT sp|Q1XGE2|HAC1_ASPOR
+3 35.6 sp|A0JMK9|CAF1A_DANRE sp|Q1XGE2|HAC1_ASPOR
+3.2 35.9 sp|Q96JK9|MAML3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+3.2 32.7 sp|Q9NR55|BATF3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+3.2 36.2 sp|Q9C0A6|SETD5_HUMAN sp|Q1XGE2|HAC1_ASPOR
+3.4 35.2 sp|B3DM43|SOX5_XENTR sp|Q1XGE2|HAC1_ASPOR
+3.5 35.4 sp|A5FV21|IF2_ACICJ sp|Q1XGE2|HAC1_ASPOR
+3.6 34.0 sp|Q8K1L0|CREB5_MOUSE sp|Q1XGE2|HAC1_ASPOR
+3.6 36.9 sp|Q9H254|SPTN4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+3.6 36.0 sp|B2AWS3|PAN1_PODAN sp|Q1XGE2|HAC1_ASPOR
+4 32.7 sp|Q61827|MAFK_MOUSE sp|Q1XGE2|HAC1_ASPOR
+4 32.7 sp|O60675|MAFK_HUMAN sp|Q1XGE2|HAC1_ASPOR
+4.2 35.9 sp|Q4QRL3|CC88B_MOUSE sp|Q1XGE2|HAC1_ASPOR
+4.3 33.9 sp|P53450|FOS_TAKRU sp|Q1XGE2|HAC1_ASPOR
+4.4 37.2 sp|Q9UPA5|BSN_HUMAN sp|Q1XGE2|HAC1_ASPOR
+4.4 37.2 sp|O88737|BSN_MOUSE sp|Q1XGE2|HAC1_ASPOR
+4.5 33.5 sp|P42774|GBF1_ARATH sp|Q1XGE2|HAC1_ASPOR
+4.6 34.9 sp|Q7ZVN7|MED15_DANRE sp|Q1XGE2|HAC1_ASPOR
+4.6 33.4 sp|O42290|MAFA_CHICK sp|Q1XGE2|HAC1_ASPOR
+4.7 35.2 sp|A9V549|EIF3A_MONBE sp|Q1XGE2|HAC1_ASPOR
+4.8 32.0 sp|Q9D275|BATF3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+4.8 34.4 sp|Q5RCJ1|CIP4_PONAB sp|Q1XGE2|HAC1_ASPOR
+5 33.7 sp|O43889|CREB3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+5.1 32.0 sp|O35284|BATF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+5.1 33.2 sp|Q2UNX4|KAPC_ASPOR sp|Q1XGE2|HAC1_ASPOR
+5.1 34.0 sp|Q02930|CREB5_HUMAN sp|Q1XGE2|HAC1_ASPOR
+5.2 35.0 sp|Q6P9R4|ARHGI_MOUSE sp|Q1XGE2|HAC1_ASPOR
+5.3 34.9 sp|Q5F489|TAF3_CHICK sp|Q1XGE2|HAC1_ASPOR
+5.3 34.9 sp|Q5HZG4|TAF3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+5.4 35.4 sp|Q9UKV3|ACINU_HUMAN sp|Q1XGE2|HAC1_ASPOR
+5.4 34.9 sp|Q5KGK5|EIF3A_CRYNE sp|Q1XGE2|HAC1_ASPOR
+5.5 33.5 sp|Q56TN0|FOS_PHORO sp|Q1XGE2|HAC1_ASPOR
+6.1 34.5 sp|Q3KQU3|MA7D1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.1 34.0 sp|Q15642|CIP4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.2 33.5 sp|Q1LYG4|CR3LB_DANRE sp|Q1XGE2|HAC1_ASPOR
+6.4 33.0 sp|Q6DE84|MAFB_XENLA sp|Q1XGE2|HAC1_ASPOR
+6.6 33.0 sp|P18625|FOSL2_CHICK sp|Q1XGE2|HAC1_ASPOR
+6.7 36.0 sp|Q3UHR0|BAHC1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+6.8 32.9 sp|Q8BW74|HLF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+6.8 32.9 sp|Q16534|HLF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.9 33.9 sp|Q9NZ53|PDXL2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.9 35.7 sp|Q7TSC1|BAT2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+7.1 34.0 sp|O35451|ATF6B_MOUSE sp|Q1XGE2|HAC1_ASPOR
+7.2 34.0 sp|Q99941|ATF6B_HUMAN sp|Q1XGE2|HAC1_ASPOR
+7.3 34.2 sp|Q3UIW5|RNF10_MOUSE sp|Q1XGE2|HAC1_ASPOR
+7.5 35.2 sp|Q6C908|PAN1_YARLI sp|Q1XGE2|HAC1_ASPOR
+7.8 35.0 sp|Q9W705|NCOA2_XENLA sp|Q1XGE2|HAC1_ASPOR
+7.9 34.7 sp|O60841|IF2P_HUMAN sp|Q1XGE2|HAC1_ASPOR
+7.9 35.7 sp|P15205|MAP1B_RAT sp|Q1XGE2|HAC1_ASPOR
+8.3 33.2 sp|Q9M7Q3|AI5L6_ARATH sp|Q1XGE2|HAC1_ASPOR
+8.3 33.2 sp|Q69022|EBNA2_EBVA8 sp|Q1XGE2|HAC1_ASPOR
+8.3 34.2 sp|Q9ES64|USH1C_MOUSE sp|Q1XGE2|HAC1_ASPOR
+8.4 32.5 sp|Q4U1U2|MAFA_XENTR sp|Q1XGE2|HAC1_ASPOR
+8.5 33.2 sp|P29681|IMPE2_DROME sp|Q1XGE2|HAC1_ASPOR
+8.6 34.0 sp|Q54Y73|BZPD_DICDI sp|Q1XGE2|HAC1_ASPOR
+8.6 32.5 sp|Q64709|HLF_RAT sp|Q1XGE2|HAC1_ASPOR
+8.8 35.3 sp|Q6MG48|BAT2_RAT sp|Q1XGE2|HAC1_ASPOR
+9 34.2 sp|Q54HX6|MYBI_DICDI sp|Q1XGE2|HAC1_ASPOR
+9.1 31.5 sp|Q90596|MAFK_CHICK sp|Q1XGE2|HAC1_ASPOR
+9.2 33.7 sp|Q4VYS1|FOXP2_XENLA sp|Q1XGE2|HAC1_ASPOR
+9.5 32.8 sp|Q54NF3|Y6434_DICDI sp|Q1XGE2|HAC1_ASPOR
+9.5 34.7 sp|Q0CPW4|PAN1_ASPTN sp|Q1XGE2|HAC1_ASPOR
+9.7 33.3 sp|Q8N8S7|ENAH_HUMAN sp|Q1XGE2|HAC1_ASPOR
+9.7 33.2 sp|Q00312|RBF1_CANAL sp|Q1XGE2|HAC1_ASPOR
+9.9 35.2 sp|P48634|BAT2_HUMAN sp|Q1XGE2|HAC1_ASPOR
diff --git a/demotic/regress/ssearch-tbl.out b/demotic/regress/ssearch-tbl.out
new file mode 100644
index 0000000..f0ec10d
--- /dev/null
+++ b/demotic/regress/ssearch-tbl.out
@@ -0,0 +1,165 @@
+1.4e-78 100 1 181 sp|P55685|Y4WG_RHISN 1 181 sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=R
+4.1 24 41 164 sp|P55685|Y4WG_RHISN 65 189 sp|Q7SY73|ABH6B_XENLA Monoacylglycerol lipase abhd6-B
+1.6e-109 100 1 345 sp|Q1XGE2|HAC1_ASPOR 1 345 sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS
+2e-82 78 13 344 sp|Q1XGE2|HAC1_ASPOR 18 348 sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS
+1.7e-15 31 7 344 sp|Q1XGE2|HAC1_ASPOR 43 450 sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS
+4.9e-06 32 63 270 sp|Q1XGE2|HAC1_ASPOR 16 216 sp|P41546|HAC1_YEAST Transcriptional activator HAC1 OS
+0.00016 31 6 167 sp|Q1XGE2|HAC1_ASPOR 3 167 sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabid
+0.0042 28 16 187 sp|Q1XGE2|HAC1_ASPOR 10 186 sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Homo s
+0.0048 29 16 206 sp|Q1XGE2|HAC1_ASPOR 10 196 sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos ta
+0.0068 32 4 152 sp|Q1XGE2|HAC1_ASPOR 210 360 sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive element-bi
+0.0083 36 60 154 sp|Q1XGE2|HAC1_ASPOR 66 157 sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanu
+0.0097 24 18 297 sp|Q1XGE2|HAC1_ASPOR 234 518 sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive element-bi
+0.01 24 46 270 sp|Q1XGE2|HAC1_ASPOR 363 593 sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper tra
+0.021 26 41 332 sp|Q1XGE2|HAC1_ASPOR 727 1001 sp|A3LYI0|NST1_PICST Stress response protein NST1 OS=P
+0.028 25 4 290 sp|Q1XGE2|HAC1_ASPOR 214 499 sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element-bind
+0.035 26 48 275 sp|Q1XGE2|HAC1_ASPOR 213 434 sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-bi
+0.036 26 4 232 sp|Q1XGE2|HAC1_ASPOR 215 445 sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive element-bi
+0.045 26 4 232 sp|Q1XGE2|HAC1_ASPOR 215 445 sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive element-bi
+0.045 23 14 297 sp|Q1XGE2|HAC1_ASPOR 228 517 sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive element-bi
+0.058 23 14 297 sp|Q1XGE2|HAC1_ASPOR 228 517 sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive element-bi
+0.071 26 1 207 sp|Q1XGE2|HAC1_ASPOR 107 318 sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-bi
+0.074 31 4 152 sp|Q1XGE2|HAC1_ASPOR 218 368 sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive element-bi
+0.076 26 24 200 sp|Q1XGE2|HAC1_ASPOR 160 330 sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive element-bi
+0.082 23 18 297 sp|Q1XGE2|HAC1_ASPOR 234 518 sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element-bind
+0.12 25 9 222 sp|Q1XGE2|HAC1_ASPOR 76 290 sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus GN=F
+0.14 27 48 258 sp|Q1XGE2|HAC1_ASPOR 214 432 sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-bi
+0.14 20 32 334 sp|Q1XGE2|HAC1_ASPOR 788 1145 sp|Q5A2K0|NST1_CANAL Stress response protein NST1 OS=C
+0.17 35 73 143 sp|Q1XGE2|HAC1_ASPOR 68 138 sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=A
+0.17 28 72 237 sp|Q1XGE2|HAC1_ASPOR 145 332 sp|Q9TUB3|FOSB_CANFA Protein fosB OS=Canis familiaris
+0.19 26 48 284 sp|Q1XGE2|HAC1_ASPOR 214 438 sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-bind
+0.2 22 17 274 sp|Q1XGE2|HAC1_ASPOR 49 268 sp|P0C5H8|KAPC_EMENI Putative transcription factor kap
+0.25 25 9 222 sp|Q1XGE2|HAC1_ASPOR 76 290 sp|P53539|FOSB_HUMAN Protein fosB OS=Homo sapiens GN=F
+0.29 21 6 291 sp|Q1XGE2|HAC1_ASPOR 39 319 sp|P79702|FOS_CYPCA Proto-oncogene c-Fos OS=Cyprinus c
+0.3 22 1 237 sp|Q1XGE2|HAC1_ASPOR 530 774 sp|Q0D9R7|ARFS_ORYSJ Auxin response factor 19 OS=Oryza
+0.32 28 44 232 sp|Q1XGE2|HAC1_ASPOR 72 263 sp|P15407|FOSL1_HUMAN Fos-related antigen 1 OS=Homo sa
+0.37 24 43 340 sp|Q1XGE2|HAC1_ASPOR 528 798 sp|Q5B3C8|NST1_EMENI Stress response protein nst1 OS=E
+0.38 27 3 236 sp|Q1XGE2|HAC1_ASPOR 429 680 sp|Q9WVS8|MK07_MOUSE Mitogen-activated protein kinase
+0.4 28 9 237 sp|Q1XGE2|HAC1_ASPOR 55 297 sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scrofa G
+0.41 28 18 160 sp|Q1XGE2|HAC1_ASPOR 212 349 sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcriptio
+0.59 27 29 163 sp|Q1XGE2|HAC1_ASPOR 171 307 sp|Q90370|MAFB_COTJA Transcription factor MafB OS=Cotu
+0.59 27 29 163 sp|Q1XGE2|HAC1_ASPOR 171 307 sp|Q90888|MAFB_CHICK Transcription factor MafB OS=Gall
+0.7 26 48 236 sp|Q1XGE2|HAC1_ASPOR 218 404 sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-bi
+0.73 25 74 223 sp|Q1XGE2|HAC1_ASPOR 4 163 sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS=Schi
+0.74 26 15 236 sp|Q1XGE2|HAC1_ASPOR 2294 2524 sp|O88778|BSN_RAT Protein bassoon OS=Rattus norvegicus
+0.77 22 19 337 sp|Q1XGE2|HAC1_ASPOR 146 459 sp|Q8VCH8|UBXN4_MOUSE UBX domain-containing protein 4
+0.79 29 18 146 sp|Q1XGE2|HAC1_ASPOR 119 256 sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-bi
+0.79 22 43 227 sp|Q1XGE2|HAC1_ASPOR 675 868 sp|A4R2R1|NST1_MAGGR Stress response protein NST1 OS=M
+0.85 31 66 160 sp|Q1XGE2|HAC1_ASPOR 258 351 sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcriptio
+0.92 25 2 237 sp|Q1XGE2|HAC1_ASPOR 57 298 sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocricet
+0.94 27 3 236 sp|Q1XGE2|HAC1_ASPOR 429 655 sp|A5PKJ4|MK07_BOVIN Mitogen-activated protein kinase
+1 23 5 265 sp|Q1XGE2|HAC1_ASPOR 989 1264 sp|Q1DQC1|PAN1_COCIM Actin cytoskeleton-regulatory com
+1 25 2 237 sp|Q1XGE2|HAC1_ASPOR 57 297 sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus muscul
+1 22 18 154 sp|Q1XGE2|HAC1_ASPOR 204 338 sp|Q6NW59|ATF4_DANRE Cyclic AMP-dependent transcriptio
+1.1 25 7 235 sp|Q1XGE2|HAC1_ASPOR 509 759 sp|Q76LL6|FHOD3_MOUSE FH1/FH2 domain-containing protei
+1.1 29 54 199 sp|Q1XGE2|HAC1_ASPOR 192 329 sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive element-bi
+1.1 28 80 198 sp|Q1XGE2|HAC1_ASPOR 195 312 sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF2 OS
+1.2 26 26 168 sp|Q1XGE2|HAC1_ASPOR 277 424 sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcriptio
+1.2 26 26 168 sp|Q1XGE2|HAC1_ASPOR 288 435 sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcriptio
+1.2 29 54 199 sp|Q1XGE2|HAC1_ASPOR 192 329 sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive element-bi
+1.3 23 12 216 sp|Q1XGE2|HAC1_ASPOR 38 261 sp|P51145|FOSL2_RAT Fos-related antigen 2 OS=Rattus no
+1.3 28 9 237 sp|Q1XGE2|HAC1_ASPOR 55 297 sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo sapie
+1.4 25 9 254 sp|Q1XGE2|HAC1_ASPOR 105 350 sp|Q03173|ENAH_MOUSE Protein enabled homolog OS=Mus mu
+1.4 28 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS=Homo
+1.5 27 51 190 sp|Q1XGE2|HAC1_ASPOR 23 183 sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Rattus n
+1.5 25 2 237 sp|Q1XGE2|HAC1_ASPOR 57 297 sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein OS=
+1.5 27 44 232 sp|Q1XGE2|HAC1_ASPOR 74 267 sp|P10158|FOSL1_RAT Fos-related antigen 1 OS=Rattus no
+1.6 24 13 267 sp|Q1XGE2|HAC1_ASPOR 284 545 sp|Q6Y7W8|PERQ2_MOUSE PERQ amino acid-rich with GYF do
+1.6 24 4 222 sp|Q1XGE2|HAC1_ASPOR 39 253 sp|P15408|FOSL2_HUMAN Fos-related antigen 2 OS=Homo sa
+1.7 26 8 199 sp|Q1XGE2|HAC1_ASPOR 138 322 sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive element-bi
+1.8 22 16 223 sp|Q1XGE2|HAC1_ASPOR 44 236 sp|A2R346|KAPC_ASPNC Putative transcription factor kap
+1.8 28 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS=Maca
+1.8 27 26 143 sp|Q1XGE2|HAC1_ASPOR 277 392 sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcriptio
+1.9 26 44 232 sp|Q1XGE2|HAC1_ASPOR 72 265 sp|P48755|FOSL1_MOUSE Fos-related antigen 1 OS=Mus mus
+1.9 28 42 208 sp|Q1XGE2|HAC1_ASPOR 92 255 sp|Q9UQ88|CD11A_HUMAN Cell division protein kinase 11A
+2 28 71 172 sp|Q1XGE2|HAC1_ASPOR 17 125 sp|Q16520|BATF_HUMAN Basic leucine zipper transcriptio
+2 23 14 223 sp|Q1XGE2|HAC1_ASPOR 37 240 sp|Q0CEI3|KAPC_ASPTN Putative transcription factor kap
+2 27 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|P54842|MAFB_RAT Transcription factor MafB OS=Rattus
+2 30 8 150 sp|Q1XGE2|HAC1_ASPOR 370 508 sp|P29747|CREBA_DROME Cyclic AMP response element-bind
+2 24 4 216 sp|Q1XGE2|HAC1_ASPOR 39 260 sp|P47930|FOSL2_MOUSE Fos-related antigen 2 OS=Mus mus
+2.1 29 39 210 sp|Q1XGE2|HAC1_ASPOR 79 238 sp|Q63ZM7|STABP_XENLA STAM-binding protein-like OS=Xen
+2.1 24 15 248 sp|Q1XGE2|HAC1_ASPOR 47 278 sp|Q91496|FOS_TETFL Proto-oncogene c-Fos OS=Tetraodon
+2.1 27 51 190 sp|Q1XGE2|HAC1_ASPOR 23 183 sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mus mu
+2.2 30 66 160 sp|Q1XGE2|HAC1_ASPOR 255 347 sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcription
+2.3 26 19 163 sp|Q1XGE2|HAC1_ASPOR 119 245 sp|O02756|CEBPD_BOVIN CCAAT/enhancer-binding protein d
+2.3 27 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|P54841|MAFB_MOUSE Transcription factor MafB OS=Mus
+2.3 20 66 223 sp|Q1XGE2|HAC1_ASPOR 83 237 sp|A1C9M5|KAPC_ASPCL Putative transcription factor kap
+2.3 25 20 221 sp|Q1XGE2|HAC1_ASPOR 105 301 sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive element-bi
+2.4 24 2 237 sp|Q1XGE2|HAC1_ASPOR 57 297 sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos taurus
+2.4 20 30 297 sp|Q1XGE2|HAC1_ASPOR 282 540 sp|Q6NS15|MED15_XENLA Mediator of RNA polymerase II tr
+2.5 26 7 183 sp|Q1XGE2|HAC1_ASPOR 28 188 sp|P94517|YSCB_BACSU Uncharacterized protein yscB OS=B
+2.5 26 29 163 sp|Q1XGE2|HAC1_ASPOR 176 312 sp|Q504L8|MAFB_XENTR Transcription factor MafB OS=Xeno
+2.5 34 83 167 sp|Q1XGE2|HAC1_ASPOR 201 281 sp|O57342|MAFA_COTJA Transcription factor MafA OS=Cotu
+2.7 27 8 237 sp|Q1XGE2|HAC1_ASPOR 54 297 sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus norve
+2.7 26 9 237 sp|Q1XGE2|HAC1_ASPOR 55 298 sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis catu
+2.7 23 2 291 sp|Q1XGE2|HAC1_ASPOR 57 353 sp|Q56TT7|FOS_PHOCM Proto-oncogene c-Fos OS=Phodopus c
+2.7 33 16 119 sp|Q1XGE2|HAC1_ASPOR 188 291 sp|Q2VZV0|IF2_MAGSA Translation initiation factor IF-2
+2.8 27 19 154 sp|Q1XGE2|HAC1_ASPOR 210 342 sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcriptio
+2.8 24 73 337 sp|Q1XGE2|HAC1_ASPOR 200 459 sp|Q5HZY0|UBXN4_RAT UBX domain-containing protein 4 OS
+2.8 26 3 236 sp|Q1XGE2|HAC1_ASPOR 429 680 sp|P0C865|MK07_RAT Mitogen-activated protein kinase 7
+2.9 26 19 163 sp|Q1XGE2|HAC1_ASPOR 118 244 sp|Q9N0J3|CEBPD_SHEEP CCAAT/enhancer-binding protein d
+2.9 33 60 146 sp|Q1XGE2|HAC1_ASPOR 170 252 sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-bind
+3 25 1 215 sp|Q1XGE2|HAC1_ASPOR 208 432 sp|A0JMK9|CAF1A_DANRE Chromatin assembly factor 1 subu
+3.2 22 8 250 sp|Q1XGE2|HAC1_ASPOR 390 619 sp|Q96JK9|MAML3_HUMAN Mastermind-like protein 3 OS=Hom
+3.2 28 69 145 sp|Q1XGE2|HAC1_ASPOR 21 97 sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcripti
+3.2 21 2 331 sp|Q1XGE2|HAC1_ASPOR 410 760 sp|Q9C0A6|SETD5_HUMAN SET domain-containing protein 5
+3.4 23 95 327 sp|Q1XGE2|HAC1_ASPOR 224 436 sp|B3DM43|SOX5_XENTR Transcription factor Sox-5 OS=Xen
+3.5 26 41 255 sp|Q1XGE2|HAC1_ASPOR 41 271 sp|A5FV21|IF2_ACICJ Translation initiation factor IF-2
+3.6 27 52 168 sp|Q1XGE2|HAC1_ASPOR 194 315 sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive element-bi
+3.6 22 6 203 sp|Q1XGE2|HAC1_ASPOR 2186 2384 sp|Q9H254|SPTN4_HUMAN Spectrin beta chain, brain 3 OS=
+3.6 23 16 333 sp|Q1XGE2|HAC1_ASPOR 1015 1335 sp|B2AWS3|PAN1_PODAN Actin cytoskeleton-regulatory com
+4 26 47 193 sp|Q1XGE2|HAC1_ASPOR 5 156 sp|Q61827|MAFK_MOUSE Transcription factor MafK OS=Mus
+4 26 47 193 sp|Q1XGE2|HAC1_ASPOR 5 156 sp|O60675|MAFK_HUMAN Transcription factor MafK OS=Homo
+4.2 28 6 180 sp|Q1XGE2|HAC1_ASPOR 281 460 sp|Q4QRL3|CC88B_MOUSE Coiled-coil domain-containing pr
+4.3 25 15 248 sp|Q1XGE2|HAC1_ASPOR 48 279 sp|P53450|FOS_TAKRU Proto-oncogene c-Fos OS=Takifugu r
+4.4 25 16 189 sp|Q1XGE2|HAC1_ASPOR 2328 2510 sp|Q9UPA5|BSN_HUMAN Protein bassoon OS=Homo sapiens GN
+4.4 24 16 189 sp|Q1XGE2|HAC1_ASPOR 2336 2518 sp|O88737|BSN_MOUSE Protein bassoon OS=Mus musculus GN
+4.5 30 31 149 sp|Q1XGE2|HAC1_ASPOR 176 296 sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Arabido
+4.6 20 58 297 sp|Q1XGE2|HAC1_ASPOR 322 573 sp|Q7ZVN7|MED15_DANRE Mediator of RNA polymerase II tr
+4.6 33 85 167 sp|Q1XGE2|HAC1_ASPOR 201 281 sp|O42290|MAFA_CHICK Transcription factor MafA OS=Gall
+4.7 27 41 231 sp|Q1XGE2|HAC1_ASPOR 770 966 sp|A9V549|EIF3A_MONBE Eukaryotic translation initiatio
+4.8 33 83 145 sp|Q1XGE2|HAC1_ASPOR 28 90 sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcripti
+4.8 25 29 186 sp|Q1XGE2|HAC1_ASPOR 294 463 sp|Q5RCJ1|CIP4_PONAB Cdc42-interacting protein 4 OS=Po
+5 30 63 185 sp|Q1XGE2|HAC1_ASPOR 159 282 sp|O43889|CREB3_HUMAN Cyclic AMP-responsive element-bi
+5.1 28 71 160 sp|Q1XGE2|HAC1_ASPOR 17 103 sp|O35284|BATF_MOUSE Basic leucine zipper transcriptio
+5.1 24 16 223 sp|Q1XGE2|HAC1_ASPOR 44 237 sp|Q2UNX4|KAPC_ASPOR Putative transcription factor kap
+5.1 27 52 168 sp|Q1XGE2|HAC1_ASPOR 345 466 sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive element-bi
+5.2 24 9 250 sp|Q1XGE2|HAC1_ASPOR 628 858 sp|Q6P9R4|ARHGI_MOUSE Rho guanine nucleotide exchange
+5.3 26 14 232 sp|Q1XGE2|HAC1_ASPOR 662 845 sp|Q5F489|TAF3_CHICK Transcription initiation factor T
+5.3 27 14 203 sp|Q1XGE2|HAC1_ASPOR 664 845 sp|Q5HZG4|TAF3_MOUSE Transcription initiation factor T
+5.4 25 46 283 sp|Q1XGE2|HAC1_ASPOR 294 535 sp|Q9UKV3|ACINU_HUMAN Apoptotic chromatin condensation
+5.4 30 48 230 sp|Q1XGE2|HAC1_ASPOR 735 930 sp|Q5KGK5|EIF3A_CRYNE Eukaryotic translation initiatio
+5.5 23 2 291 sp|Q1XGE2|HAC1_ASPOR 57 353 sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodopus r
+6.1 24 16 258 sp|Q1XGE2|HAC1_ASPOR 555 812 sp|Q3KQU3|MA7D1_HUMAN MAP7 domain-containing protein 1
+6.1 22 29 272 sp|Q1XGE2|HAC1_ASPOR 294 542 sp|Q15642|CIP4_HUMAN Cdc42-interacting protein 4 OS=Ho
+6.2 25 25 199 sp|Q1XGE2|HAC1_ASPOR 161 322 sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive element-bi
+6.4 26 29 163 sp|Q1XGE2|HAC1_ASPOR 171 309 sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS=Xeno
+6.6 24 68 271 sp|Q1XGE2|HAC1_ASPOR 108 311 sp|P18625|FOSL2_CHICK Fos-related antigen 2 OS=Gallus
+6.7 23 8 338 sp|Q1XGE2|HAC1_ASPOR 860 1230 sp|Q3UHR0|BAHC1_MOUSE BAH and coiled-coil domain-conta
+6.8 25 2 148 sp|Q1XGE2|HAC1_ASPOR 142 290 sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus mus
+6.8 25 2 148 sp|Q1XGE2|HAC1_ASPOR 142 290 sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Homo sa
+6.9 25 32 294 sp|Q1XGE2|HAC1_ASPOR 107 375 sp|Q9NZ53|PDXL2_HUMAN Podocalyxin-like protein 2 OS=Ho
+6.9 27 18 222 sp|Q1XGE2|HAC1_ASPOR 378 571 sp|Q7TSC1|BAT2_MOUSE Large proline-rich protein BAT2 O
+7.1 23 16 241 sp|Q1XGE2|HAC1_ASPOR 259 500 sp|O35451|ATF6B_MOUSE Cyclic AMP-dependent transcripti
+7.2 24 17 241 sp|Q1XGE2|HAC1_ASPOR 260 503 sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcripti
+7.3 24 80 285 sp|Q1XGE2|HAC1_ASPOR 588 784 sp|Q3UIW5|RNF10_MOUSE RING finger protein 10 OS=Mus mu
+7.5 26 16 311 sp|Q1XGE2|HAC1_ASPOR 1113 1403 sp|Q6C908|PAN1_YARLI Actin cytoskeleton-regulatory com
+7.8 22 61 333 sp|Q1XGE2|HAC1_ASPOR 1188 1460 sp|Q9W705|NCOA2_XENLA Nuclear receptor coactivator 2 O
+7.9 24 7 183 sp|Q1XGE2|HAC1_ASPOR 282 455 sp|O60841|IF2P_HUMAN Eukaryotic translation initiation
+7.9 21 12 323 sp|Q1XGE2|HAC1_ASPOR 595 900 sp|P15205|MAP1B_RAT Microtubule-associated protein 1B
+8.3 31 14 145 sp|Q1XGE2|HAC1_ASPOR 291 435 sp|Q9M7Q3|AI5L6_ARATH ABSCISIC ACID-INSENSITIVE 5-like
+8.3 24 10 209 sp|Q1XGE2|HAC1_ASPOR 236 424 sp|Q69022|EBNA2_EBVA8 Epstein-Barr nuclear antigen 2 O
+8.3 23 15 333 sp|Q1XGE2|HAC1_ASPOR 386 687 sp|Q9ES64|USH1C_MOUSE Harmonin OS=Mus musculus GN=Ush1
+8.4 30 83 167 sp|Q1XGE2|HAC1_ASPOR 203 284 sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS=Xeno
+8.5 25 8 181 sp|Q1XGE2|HAC1_ASPOR 14 192 sp|P29681|IMPE2_DROME 20-hydroxyecdysone protein OS=Dr
+8.6 26 10 157 sp|Q1XGE2|HAC1_ASPOR 315 458 sp|Q54Y73|BZPD_DICDI Probable basic-leucine zipper tra
+8.6 29 16 148 sp|Q1XGE2|HAC1_ASPOR 163 290 sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattus no
+8.8 24 18 229 sp|Q1XGE2|HAC1_ASPOR 378 575 sp|Q6MG48|BAT2_RAT Large proline-rich protein BAT2 OS=
+9 17 36 252 sp|Q1XGE2|HAC1_ASPOR 628 845 sp|Q54HX6|MYBI_DICDI Myb-like protein I OS=Dictyosteli
+9.1 25 47 193 sp|Q1XGE2|HAC1_ASPOR 5 156 sp|Q90596|MAFK_CHICK Transcription factor MafK OS=Gall
+9.2 20 10 321 sp|Q1XGE2|HAC1_ASPOR 36 373 sp|Q4VYS1|FOXP2_XENLA Forkhead box protein P2 OS=Xenop
+9.5 18 22 170 sp|Q1XGE2|HAC1_ASPOR 171 321 sp|Q54NF3|Y6434_DICDI Uncharacterized protein DDB_G028
+9.5 24 16 268 sp|Q1XGE2|HAC1_ASPOR 1032 1284 sp|Q0CPW4|PAN1_ASPTN Actin cytoskeleton-regulatory com
+9.7 31 35 142 sp|Q1XGE2|HAC1_ASPOR 111 219 sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Homo s
+9.7 23 36 229 sp|Q1XGE2|HAC1_ASPOR 263 449 sp|Q00312|RBF1_CANAL Transcription factor RBF1 OS=Cand
+9.9 27 18 228 sp|Q1XGE2|HAC1_ASPOR 380 575 sp|P48634|BAT2_HUMAN Large proline-rich protein BAT2 O
diff --git a/demotic/regress/wu-blastp-profmark.out b/demotic/regress/wu-blastp-profmark.out
new file mode 100644
index 0000000..0ae92c3
--- /dev/null
+++ b/demotic/regress/wu-blastp-profmark.out
@@ -0,0 +1,506 @@
+0 897.0 sp|P55685|Y4WG_RHISN sp|P55685|Y4WG_RHISN
+1.34707 60.0 sp|Q07074|YH007_YEAST sp|P55685|Y4WG_RHISN
+5.29832 74.0 sp|Q8XVA0|Y2931_RALSO sp|P55685|Y4WG_RHISN
+5.29832 74.0 sp|P33890|TIR2_YEAST sp|P55685|Y4WG_RHISN
+5.52146 78.0 sp|A7HGP8|CH602_ANADF sp|P55685|Y4WG_RHISN
+9.21034 58.0 sp|Q608F1|Y1541_METCA sp|P55685|Y4WG_RHISN
+0 1765.0 sp|Q1XGE2|HAC1_ASPOR sp|Q1XGE2|HAC1_ASPOR
+0 1348.0 sp|Q8TFU8|HAC1_EMENI sp|Q1XGE2|HAC1_ASPOR
+0 303.0 sp|Q8TFF3|HAC1_TRIRE sp|Q1XGE2|HAC1_ASPOR
+9.30367e-14 184.0 sp|P41546|HAC1_YEAST sp|Q1XGE2|HAC1_ASPOR
+3.39995e-12 170.0 sp|O24646|HY5_ARATH sp|Q1XGE2|HAC1_ASPOR
+7e-09 140.0 sp|Q9SM50|HY5_SOLLC sp|Q1XGE2|HAC1_ASPOR
+3.2e-08 150.0 sp|Q3SZZ2|XBP1_BOVIN sp|Q1XGE2|HAC1_ASPOR
+3.2e-08 150.0 sp|P17861|XBP1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+3.7e-08 156.0 sp|A1L224|CR3L2_DANRE sp|Q1XGE2|HAC1_ASPOR
+1.9e-07 127.0 sp|Q8W191|HYH_ARATH sp|Q1XGE2|HAC1_ASPOR
+9.6e-07 148.0 sp|A3LYI0|NST1_PICST sp|Q1XGE2|HAC1_ASPOR
+6.40002e-06 136.0 sp|Q70SY1|CR3L2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.40002e-06 136.0 sp|Q5RCM9|CR3L2_PONAB sp|Q1XGE2|HAC1_ASPOR
+6.50002e-06 136.0 sp|Q8BH52|CR3L2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.20001e-05 132.0 sp|Q61817|CREB3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.40001e-05 133.0 sp|A2VD01|CR3L2_XENLA sp|Q1XGE2|HAC1_ASPOR
+2.30003e-05 131.0 sp|Q66HA2|CR3L1_RAT sp|Q1XGE2|HAC1_ASPOR
+2.40003e-05 132.0 sp|Q54WN7|BZPF_DICDI sp|Q1XGE2|HAC1_ASPOR
+3.00005e-05 130.0 sp|Q9Z125|CR3L1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+6.00018e-05 104.0 sp|Q9NR55|BATF3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+6.00018e-05 104.0 sp|Q9D275|BATF3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+6.4002e-05 127.0 sp|Q96BA8|CR3L1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+7.20026e-05 136.0 sp|O88778|BSN_RAT sp|Q1XGE2|HAC1_ASPOR
+0.000110006 125.0 sp|Q6QDP7|CR3L2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.000120007 127.0 sp|Q9WVS8|MK07_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.000130008 123.0 sp|Q08CW8|CR3L4_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.000160013 100.0 sp|Q16520|BATF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.000170014 121.0 sp|Q9D2A5|CR3L4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00020002 121.0 sp|Q99090|CPRF2_PETCR sp|Q1XGE2|HAC1_ASPOR
+0.000210022 99.0 sp|P97876|BATF3_RAT sp|Q1XGE2|HAC1_ASPOR
+0.000290042 125.0 sp|Q5B3C8|NST1_EMENI sp|Q1XGE2|HAC1_ASPOR
+0.000300045 115.0 sp|Q91XE9|CR3L3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.000320051 120.0 sp|Q3SYZ3|CR3L3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.000320051 118.0 sp|Q6NW59|ATF4_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.000320051 116.0 sp|Q9R1S4|XBP1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.000340058 118.0 sp|Q06507|ATF4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.000440097 117.0 sp|P18848|ATF4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.000440097 96.0 sp|O35284|BATF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00053014 116.0 sp|P13346|FOSB_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.000590174 115.0 sp|Q90888|MAFB_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.000590174 115.0 sp|Q90370|MAFB_COTJA sp|Q1XGE2|HAC1_ASPOR
+0.000710252 113.0 sp|O35426|XBP1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.000840353 114.0 sp|P51145|FOSL2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.000890396 116.0 sp|Q68CJ9|CR3L3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.000970471 121.0 sp|A4R2R1|NST1_MAGGR sp|Q1XGE2|HAC1_ASPOR
+0.00110061 112.0 sp|O57342|MAFA_COTJA sp|Q1XGE2|HAC1_ASPOR
+0.00120072 103.0 sp|O60675|MAFK_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.00120072 111.0 sp|P15407|FOSL1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.00140098 115.0 sp|Q5FVM5|CR3L3_RAT sp|Q1XGE2|HAC1_ASPOR
+0.00150113 117.0 sp|Q03173|ENAH_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00150113 112.0 sp|P53539|FOSB_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.00160128 117.0 sp|Q2VZV0|IF2_MAGSA sp|Q1XGE2|HAC1_ASPOR
+0.00170145 102.0 sp|Q61827|MAFK_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00180162 117.0 sp|P29747|CREBA_DROME sp|Q1XGE2|HAC1_ASPOR
+0.00190181 112.0 sp|O88479|FOS_MESAU sp|Q1XGE2|HAC1_ASPOR
+0.00190181 111.0 sp|Q9TUB3|FOSB_CANFA sp|Q1XGE2|HAC1_ASPOR
+0.002002 112.0 sp|Q8TEY5|CR3L4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.002002 112.0 sp|Q5UEM8|CR3L4_MACFA sp|Q1XGE2|HAC1_ASPOR
+0.002002 111.0 sp|Q9ES19|ATF4_RAT sp|Q1XGE2|HAC1_ASPOR
+0.002002 111.0 sp|P79702|FOS_CYPCA sp|Q1XGE2|HAC1_ASPOR
+0.00210221 114.0 sp|Q8N8S7|ENAH_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.00230265 110.0 sp|P47930|FOSL2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00270365 112.0 sp|Q5R9C9|ATF7_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.00280393 112.0 sp|P17544|ATF7_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.00300451 109.0 sp|Q9Y5Q3|MAFB_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.00320513 118.0 sp|Q9UQ88|CD11A_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.00330546 110.0 sp|O43889|CREB3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.00340579 109.0 sp|Q3ZCH6|ATF4_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.00350614 110.0 sp|Q8R0S1|ATF7_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00370686 108.0 sp|P42774|GBF1_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.00380724 109.0 sp|Q8SQ19|CREB3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.00380724 111.0 sp|Q5UEM7|CR3L4_RAT sp|Q1XGE2|HAC1_ASPOR
+0.00390762 108.0 sp|P54842|MAFB_RAT sp|Q1XGE2|HAC1_ASPOR
+0.00390762 113.0 sp|A5PKJ4|MK07_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.00400802 109.0 sp|P01101|FOS_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00451016 113.0 sp|O13024|INCEA_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.00501254 107.0 sp|Q2PFS4|MAFB_MACFA sp|Q1XGE2|HAC1_ASPOR
+0.00501254 113.0 sp|Q5KGK5|EIF3A_CRYNE sp|Q1XGE2|HAC1_ASPOR
+0.00511305 108.0 sp|O97930|FOS_PIG sp|Q1XGE2|HAC1_ASPOR
+0.00511305 108.0 sp|P01102|FOS_MSVFB sp|Q1XGE2|HAC1_ASPOR
+0.00571631 100.0 sp|Q09926|PCR1_SCHPO sp|Q1XGE2|HAC1_ASPOR
+0.0062193 98.0 sp|Q90596|MAFK_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.0062193 106.0 sp|Q504L8|MAFB_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.00652122 114.0 sp|Q1DQC1|PAN1_COCIM sp|Q1XGE2|HAC1_ASPOR
+0.00652122 106.0 sp|P54841|MAFB_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00783058 113.0 sp|Q5A2K0|NST1_CANAL sp|Q1XGE2|HAC1_ASPOR
+0.00793137 108.0 sp|Q8VCH8|UBXN4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00793137 107.0 sp|Q502F0|CR3LA_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.00803217 104.0 sp|P10158|FOSL1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.00813298 98.0 sp|P97875|JDP2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.00813298 98.0 sp|Q78E65|JDP2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.00853633 105.0 sp|P15408|FOSL2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.00873807 104.0 sp|O42290|MAFA_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.0100503 103.0 sp|A1C9M5|KAPC_ASPCL sp|Q1XGE2|HAC1_ASPOR
+0.0110609 109.0 sp|P0C865|MK07_RAT sp|Q1XGE2|HAC1_ASPOR
+0.0130852 109.0 sp|Q15424|SAFB1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0140989 110.0 sp|O60841|IF2P_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0140989 110.0 sp|Q5RDE1|IF2P_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.0140989 105.0 sp|Q9M7Q3|AI5L6_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.0151136 109.0 sp|A9V549|EIF3A_MONBE sp|Q1XGE2|HAC1_ASPOR
+0.0161294 110.0 sp|Q9UKV3|ACINU_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0161294 104.0 sp|Q63ZM7|STABP_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.018164 110.0 sp|Q4QRL3|CC88B_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.018164 103.0 sp|P01100|FOS_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.018164 103.0 sp|P12841|FOS_RAT sp|Q1XGE2|HAC1_ASPOR
+0.0191828 96.0 sp|P19880|YAP1_YEAST sp|Q1XGE2|HAC1_ASPOR
+0.0191828 108.0 sp|Q8CH25|SLTM_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0191828 108.0 sp|Q9NWH9|SLTM_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0202027 101.0 sp|Q16534|HLF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0202027 101.0 sp|Q8BW74|HLF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0212236 107.0 sp|Q6CBW0|NST1_YARLI sp|Q1XGE2|HAC1_ASPOR
+0.0222456 105.0 sp|Q498L2|SLTM_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.0232686 89.0 sp|Q1E554|CGR1_COCIM sp|Q1XGE2|HAC1_ASPOR
+0.0232686 102.0 sp|Q91496|FOS_TETFL sp|Q1XGE2|HAC1_ASPOR
+0.0232686 98.0 sp|Q9ESN9|JIP3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0232686 102.0 sp|P53450|FOS_TAKRU sp|Q1XGE2|HAC1_ASPOR
+0.0232686 106.0 sp|Q05682|CALD1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0242927 102.0 sp|O77628|FOS_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.0242927 102.0 sp|Q56TT7|FOS_PHOCM sp|Q1XGE2|HAC1_ASPOR
+0.0242927 100.0 sp|Q0CEI3|KAPC_ASPTN sp|Q1XGE2|HAC1_ASPOR
+0.0242927 107.0 sp|Q6P9R4|ARHGI_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0253178 103.0 sp|P29681|IMPE2_DROME sp|Q1XGE2|HAC1_ASPOR
+0.0253178 106.0 sp|A2AJI0|MA7D1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0283995 106.0 sp|Q5R452|SAFB1_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.0283995 102.0 sp|Q1LYG4|CR3LB_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.0283995 103.0 sp|Q9D439|CCD11_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0294288 99.0 sp|P48755|FOSL1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0294288 100.0 sp|Q6DE84|MAFB_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.0304592 101.0 sp|Q54RZ9|BZPG_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.0304592 109.0 sp|A0JMK9|CAF1A_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.0304592 100.0 sp|P18625|FOSL2_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.0314907 99.0 sp|A2R346|KAPC_ASPNC sp|Q1XGE2|HAC1_ASPOR
+0.0314907 101.0 sp|Q8HZP6|FOS_FELCA sp|Q1XGE2|HAC1_ASPOR
+0.0335568 103.0 sp|P26042|MOES_PIG sp|Q1XGE2|HAC1_ASPOR
+0.0335568 103.0 sp|Q2HJ49|MOES_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.0345914 105.0 sp|A5FV21|IF2_ACICJ sp|Q1XGE2|HAC1_ASPOR
+0.0345914 103.0 sp|A6SCT6|DBP3_BOTFB sp|Q1XGE2|HAC1_ASPOR
+0.0356272 106.0 sp|Q7PGE8|EIF3A_ANOGA sp|Q1XGE2|HAC1_ASPOR
+0.036664 105.0 sp|O77788|NFM_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.0387408 105.0 sp|Q9JTB5|IF2_NEIMA sp|Q1XGE2|HAC1_ASPOR
+0.0387408 105.0 sp|Q9JYD2|IF2_NEIMB sp|Q1XGE2|HAC1_ASPOR
+0.0387408 105.0 sp|A1KV51|IF2_NEIMF sp|Q1XGE2|HAC1_ASPOR
+0.0387408 98.0 sp|P0C5H8|KAPC_EMENI sp|Q1XGE2|HAC1_ASPOR
+0.0397809 105.0 sp|Q80YR5|SAFB2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0397809 100.0 sp|Q56TN0|FOS_PHORO sp|Q1XGE2|HAC1_ASPOR
+0.0418642 98.0 sp|Q4U1U2|MAFA_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.0429075 102.0 sp|P26038|MOES_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0439519 98.0 sp|Q64709|HLF_RAT sp|Q1XGE2|HAC1_ASPOR
+0.0449974 104.0 sp|A0JMT0|CA1AB_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.0449974 112.0 sp|Q6Y7W6|PERQ2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0460439 92.0 sp|Q8WYK2|JDP2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0470916 99.0 sp|Q8K1L0|CREB5_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0470916 106.0 sp|Q9C0A6|SETD5_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0470916 101.0 sp|Q92575|UBXN4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0470916 101.0 sp|Q5R4I3|UBXN4_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.0491902 96.0 sp|P14233|TGA1B_TOBAC sp|Q1XGE2|HAC1_ASPOR
+0.0491902 104.0 sp|A9M1D5|IF2_NEIM0 sp|Q1XGE2|HAC1_ASPOR
+0.0502412 103.0 sp|Q554P0|BZPJ_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.0502412 102.0 sp|Q8N9W4|GG6L2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0512933 77.0 sp|Q8N300|CCD23_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0534008 100.0 sp|O81025|P2A03_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.0565704 101.0 sp|O35763|MOES_RAT sp|Q1XGE2|HAC1_ASPOR
+0.0565704 102.0 sp|Q9Z220|TSG10_RAT sp|Q1XGE2|HAC1_ASPOR
+0.0576291 103.0 sp|Q32N93|INCEB_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.0576291 107.0 sp|Q95XZ5|NPBL_CAEEL sp|Q1XGE2|HAC1_ASPOR
+0.0608121 103.0 sp|Q6CT90|EIF3A_KLULA sp|Q1XGE2|HAC1_ASPOR
+0.0608121 103.0 sp|Q5F489|TAF3_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.0618754 98.0 sp|P42775|GBF2_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.0618754 103.0 sp|Q55EQ3|Y9086_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.0618754 98.0 sp|Q54LU8|Y8646_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.0682788 94.0 sp|P94517|YSCB_BACSU sp|Q1XGE2|HAC1_ASPOR
+0.0693501 103.0 sp|Q2UKG6|EIF3A_ASPOR sp|Q1XGE2|HAC1_ASPOR
+0.071496 101.0 sp|Q9Y592|CCD41_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.071496 111.0 sp|Q6Y7W8|PERQ2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.071496 98.0 sp|Q8X229|FCR3_CANAL sp|Q1XGE2|HAC1_ASPOR
+0.0725707 100.0 sp|P26041|MOES_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0747235 105.0 sp|Q9TW28|MYOM_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.076881 100.0 sp|Q9NZ53|PDXL2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0779615 99.0 sp|Q02930|CREB5_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0790432 102.0 sp|Q5HZG4|TAF3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.080126 102.0 sp|A0LE19|IF2_MAGSM sp|Q1XGE2|HAC1_ASPOR
+0.0812101 103.0 sp|Q869E1|DNLI1_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.0844692 104.0 sp|P22793|TRHY_SHEEP sp|Q1XGE2|HAC1_ASPOR
+0.0888312 95.0 sp|O70191|ATF5_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0888312 96.0 sp|Q39140|TGA6_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.0888312 98.0 sp|Q68EL6|NFIL3_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.0899247 101.0 sp|Q55FW7|GLE1_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.0965109 89.0 sp|Q3TLH4|BA2L2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.0965109 95.0 sp|Q04323|UBXN1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.0965109 96.0 sp|P23922|HBP1A_WHEAT sp|Q1XGE2|HAC1_ASPOR
+0.098716 94.0 sp|Q9C5Q2|AI5L3_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.102033 101.0 sp|Q54TD7|DDX24_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.103141 101.0 sp|Q5F797|IF2_NEIG1 sp|Q1XGE2|HAC1_ASPOR
+0.103141 101.0 sp|B4RMZ3|IF2_NEIG2 sp|Q1XGE2|HAC1_ASPOR
+0.10425 99.0 sp|Q86AH4|Y8592_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.105361 101.0 sp|Q8IIG7|YPF05_PLAF7 sp|Q1XGE2|HAC1_ASPOR
+0.116534 103.0 sp|B2KI97|THOC2_RHIFE sp|Q1XGE2|HAC1_ASPOR
+0.116534 102.0 sp|Q9UM54|MYO6_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.116534 100.0 sp|Q3KQU3|MA7D1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.116534 98.0 sp|Q14244|MAP7_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.116534 90.0 sp|P29596|ATF3_RAT sp|Q1XGE2|HAC1_ASPOR
+0.116534 104.0 sp|Q5TM26|BAT2_MACMU sp|Q1XGE2|HAC1_ASPOR
+0.127833 100.0 sp|Q0IHP2|INCE_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.127833 100.0 sp|Q9NQS7|INCE_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.127833 97.0 sp|Q5HZY0|UBXN4_RAT sp|Q1XGE2|HAC1_ASPOR
+0.127833 87.0 sp|Q90595|MAFF_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.127833 101.0 sp|Q6ZSZ5|ARHGI_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.127833 98.0 sp|Q7PS12|MOEH_ANOGA sp|Q1XGE2|HAC1_ASPOR
+0.139262 99.0 sp|P12957|CALD1_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.139262 93.0 sp|Q08DA8|ATF1_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.139262 91.0 sp|Q94126|CES2_CAEEL sp|Q1XGE2|HAC1_ASPOR
+0.139262 88.0 sp|O66547|Y157_AQUAE sp|Q1XGE2|HAC1_ASPOR
+0.139262 101.0 sp|A6ZRZ0|NST1_YEAS7 sp|Q1XGE2|HAC1_ASPOR
+0.139262 101.0 sp|P53935|NST1_YEAST sp|Q1XGE2|HAC1_ASPOR
+0.139262 94.0 sp|A3BYC1|HOX25_ORYSJ sp|Q1XGE2|HAC1_ASPOR
+0.139262 102.0 sp|B1AZI6|THOC2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.150823 104.0 sp|Q9H254|SPTN4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.150823 93.0 sp|Q2UNX4|KAPC_ASPOR sp|Q1XGE2|HAC1_ASPOR
+0.150823 94.0 sp|Q9JJ50|HGS_RAT sp|Q1XGE2|HAC1_ASPOR
+0.150823 89.0 sp|Q2KII1|ATF3_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.150823 98.0 sp|Q99941|ATF6B_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.150823 103.0 sp|Q7TSC1|BAT2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.150823 97.0 sp|Q4I877|NDE1_GIBZE sp|Q1XGE2|HAC1_ASPOR
+0.162519 98.0 sp|Q84WU4|GOGC3_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.162519 93.0 sp|Q499N6|UBXN1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.162519 81.0 sp|B4PPK2|FOSL_DROYA sp|Q1XGE2|HAC1_ASPOR
+0.162519 101.0 sp|A4R8N4|PAN1_MAGGR sp|Q1XGE2|HAC1_ASPOR
+0.162519 101.0 sp|B2AWS3|PAN1_PODAN sp|Q1XGE2|HAC1_ASPOR
+0.162519 102.0 sp|Q92545|TM131_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.174353 99.0 sp|Q38W81|IF2_LACSS sp|Q1XGE2|HAC1_ASPOR
+0.174353 94.0 sp|Q789F3|MAF_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.174353 92.0 sp|P49716|CEBPD_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.174353 92.0 sp|P81269|ATF1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.174353 94.0 sp|P23091|MAF_AVIS4 sp|Q1XGE2|HAC1_ASPOR
+0.174353 92.0 sp|P18846|ATF1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.174353 102.0 sp|Q07283|TRHY_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.18633 95.0 sp|Q4X1V0|NDE1_ASPFU sp|Q1XGE2|HAC1_ASPOR
+0.18633 79.0 sp|Q8R1H8|BATF2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.18633 95.0 sp|Q66J36|NFIL3_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.18633 97.0 sp|P13816|GARP_PLAFF sp|Q1XGE2|HAC1_ASPOR
+0.18633 93.0 sp|P38749|YAP3_YEAST sp|Q1XGE2|HAC1_ASPOR
+0.198451 99.0 sp|Q3UIW5|RNF10_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.198451 93.0 sp|P23923|HBP1B_WHEAT sp|Q1XGE2|HAC1_ASPOR
+0.198451 97.0 sp|Q9D5R3|CCD41_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.198451 101.0 sp|Q9QXL2|KI21A_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.198451 95.0 sp|Q9UPT6|JIP3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.198451 99.0 sp|P16884|NFH_RAT sp|Q1XGE2|HAC1_ASPOR
+0.198451 88.0 sp|Q60765|ATF3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.198451 91.0 sp|Q9N0J3|CEBPD_SHEEP sp|Q1XGE2|HAC1_ASPOR
+0.198451 99.0 sp|A5DLJ8|NST1_PICGU sp|Q1XGE2|HAC1_ASPOR
+0.210721 98.0 sp|A5DHL9|EIF3A_PICGU sp|Q1XGE2|HAC1_ASPOR
+0.210721 92.0 sp|Q6NXA9|UBXN1_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.210721 91.0 sp|O02756|CEBPD_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.210721 97.0 sp|O88735|MAP7_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.210721 95.0 sp|Q99105|MYSU_RABIT sp|Q1XGE2|HAC1_ASPOR
+0.223144 94.0 sp|Q9M7Q2|AI5L7_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.223144 95.0 sp|Q9HCM9|TRI39_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.223144 95.0 sp|Q1XHU0|TRI39_PANTR sp|Q1XGE2|HAC1_ASPOR
+0.223144 93.0 sp|Q7SHT5|PXR1_NEUCR sp|Q1XGE2|HAC1_ASPOR
+0.235722 71.0 sp|Q32LJ0|CCD23_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.235722 71.0 sp|Q99LQ4|CCD23_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.235722 71.0 sp|Q4KLG3|CCD23_RAT sp|Q1XGE2|HAC1_ASPOR
+0.235722 99.0 sp|Q54XG7|DIMA_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.235722 86.0 sp|Q54CY3|Y4489_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.235722 100.0 sp|B0KWH8|THOC2_CALJA sp|Q1XGE2|HAC1_ASPOR
+0.235722 96.0 sp|Q7Z4V5|HDGR2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.248461 102.0 sp|P15205|MAP1B_RAT sp|Q1XGE2|HAC1_ASPOR
+0.248461 92.0 sp|Q98UK4|MAF_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.248461 108.0 sp|O75037|KI21B_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.248461 96.0 sp|Q02040|SF17A_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.248461 96.0 sp|P82179|TRDN_CANFA sp|Q1XGE2|HAC1_ASPOR
+0.248461 95.0 sp|B0WYY2|MOEH_CULQU sp|Q1XGE2|HAC1_ASPOR
+0.261365 99.0 sp|Q556Q3|IRLF_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.261365 87.0 sp|P18847|ATF3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.274437 95.0 sp|Q5RCJ1|CIP4_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.274437 92.0 sp|Q1RM35|CC104_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.274437 90.0 sp|A2Z0Q0|HOX25_ORYSI sp|Q1XGE2|HAC1_ASPOR
+0.274437 94.0 sp|P15336|ATF2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.274437 97.0 sp|O88453|SAFB1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.274437 99.0 sp|B0YC95|PAN1_ASPFC sp|Q1XGE2|HAC1_ASPOR
+0.274437 99.0 sp|Q4WG58|PAN1_ASPFU sp|Q1XGE2|HAC1_ASPOR
+0.287682 99.0 sp|A6NC98|CC88B_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.287682 99.0 sp|A6R7X5|PAN1_AJECN sp|Q1XGE2|HAC1_ASPOR
+0.287682 98.0 sp|Q05D44|IF2P_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.301105 92.0 sp|P54843|MAF_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.301105 92.0 sp|O75444|MAF_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.301105 92.0 sp|A7Z017|MAF_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.314711 89.0 sp|A5PJN1|TAP26_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.314711 93.0 sp|O24160|TGA21_TOBAC sp|Q1XGE2|HAC1_ASPOR
+0.314711 96.0 sp|Q54Y73|BZPD_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.314711 93.0 sp|Q5FW38|NFIL3_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.314711 91.0 sp|Q39163|TGA5_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.314711 85.0 sp|Q90889|MAFG_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.328504 95.0 sp|O35451|ATF6B_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.328504 107.0 sp|Q9QXL1|KI21B_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.328504 97.0 sp|Q5RG44|K1211_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.328504 100.0 sp|P48634|BAT2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.328504 96.0 sp|C0QTL9|IF2_PERMH sp|Q1XGE2|HAC1_ASPOR
+0.328504 96.0 sp|P53352|INCE_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.34249 92.0 sp|Q8BKJ9|SIRT7_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.34249 91.0 sp|Q5XIB5|CCD86_RAT sp|Q1XGE2|HAC1_ASPOR
+0.34249 93.0 sp|O93602|ATF2_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.34249 93.0 sp|P16951|ATF2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.34249 96.0 sp|Q5QTY8|IF2_IDILO sp|Q1XGE2|HAC1_ASPOR
+0.34249 84.0 sp|Q6FUQ5|FYV7_CANGA sp|Q1XGE2|HAC1_ASPOR
+0.34249 97.0 sp|P37934|MAAY3_SCHCO sp|Q1XGE2|HAC1_ASPOR
+0.34249 92.0 sp|Q99089|CPRF1_PETCR sp|Q1XGE2|HAC1_ASPOR
+0.356675 93.0 sp|Q3ZBU9|UBXN4_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.356675 94.0 sp|P34511|YMX3_CAEEL sp|Q1XGE2|HAC1_ASPOR
+0.371064 96.0 sp|Q8C0Q2|ZHX3_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.371064 98.0 sp|Q5B5B0|PAN1_EMENI sp|Q1XGE2|HAC1_ASPOR
+0.371064 95.0 sp|A2AG50|MA7D2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.371064 98.0 sp|Q4PBP6|NST1_USTMA sp|Q1XGE2|HAC1_ASPOR
+0.371064 95.0 sp|Q7KZI7|MARK2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.371064 89.0 sp|Q03484|CEBPD_RAT sp|Q1XGE2|HAC1_ASPOR
+0.385662 96.0 sp|Q80VM7|ANR24_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.385662 91.0 sp|P54844|MAF_RAT sp|Q1XGE2|HAC1_ASPOR
+0.385662 96.0 sp|B1ZDQ8|IF2_METPB sp|Q1XGE2|HAC1_ASPOR
+0.385662 94.0 sp|Q99LI8|HGS_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.385662 90.0 sp|Q6BUE3|PXR1_DEBHA sp|Q1XGE2|HAC1_ASPOR
+0.385662 96.0 sp|Q7RWT1|EIF3A_NEUCR sp|Q1XGE2|HAC1_ASPOR
+0.385662 90.0 sp|Q6ZDF3|TRAB1_ORYSJ sp|Q1XGE2|HAC1_ASPOR
+0.400478 98.0 sp|Q8NI27|THOC2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.400478 98.0 sp|B1MTK1|THOC2_CALMO sp|Q1XGE2|HAC1_ASPOR
+0.400478 93.0 sp|Q8N4C8|MINK1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.400478 91.0 sp|P42776|GBF3_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.415515 89.0 sp|A1D9Z7|KAPC_NEOFI sp|Q1XGE2|HAC1_ASPOR
+0.415515 94.0 sp|Q4G091|MICLK_RAT sp|Q1XGE2|HAC1_ASPOR
+0.415515 89.0 sp|Q6P788|ATF5_RAT sp|Q1XGE2|HAC1_ASPOR
+0.415515 89.0 sp|Q9Y2D1|ATF5_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.415515 90.0 sp|P43273|TGA2_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.415515 88.0 sp|Q795Q5|YTTA_BACSU sp|Q1XGE2|HAC1_ASPOR
+0.430783 93.0 sp|Q32LP2|RADI_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.430783 93.0 sp|Q9PU45|RADI_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.430783 93.0 sp|P35241|RADI_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.430783 93.0 sp|P26044|RADI_PIG sp|Q1XGE2|HAC1_ASPOR
+0.430783 98.0 sp|Q2KHR3|QSER1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.446287 91.0 sp|Q54NF3|Y6434_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.446287 89.0 sp|Q99091|CPRF3_PETCR sp|Q1XGE2|HAC1_ASPOR
+0.446287 102.0 sp|P30427|PLEC1_RAT sp|Q1XGE2|HAC1_ASPOR
+0.446287 96.0 sp|Q553B1|DDX46_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.462035 96.0 sp|Q5AXH3|TOF1_EMENI sp|Q1XGE2|HAC1_ASPOR
+0.462035 90.0 sp|Q0V9K1|MAF_XENTR sp|Q1XGE2|HAC1_ASPOR
+0.462035 96.0 sp|A6RW62|NST1_BOTFB sp|Q1XGE2|HAC1_ASPOR
+0.462035 96.0 sp|A7EMM3|NST1_SCLS1 sp|Q1XGE2|HAC1_ASPOR
+0.462035 92.0 sp|Q869T2|Y7634_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.462035 97.0 sp|A1DC51|PAN1_NEOFI sp|Q1XGE2|HAC1_ASPOR
+0.462035 94.0 sp|Q960X8|HRS_DROME sp|Q1XGE2|HAC1_ASPOR
+0.462035 91.0 sp|Q5BJY9|K1C18_RAT sp|Q1XGE2|HAC1_ASPOR
+0.462035 96.0 sp|Q6BUT3|NST1_DEBHA sp|Q1XGE2|HAC1_ASPOR
+0.462035 97.0 sp|A1CD74|PAN1_ASPCL sp|Q1XGE2|HAC1_ASPOR
+0.478036 87.0 sp|Q09202|YP23_CAEEL sp|Q1XGE2|HAC1_ASPOR
+0.478036 96.0 sp|B2GUV7|IF2P_RAT sp|Q1XGE2|HAC1_ASPOR
+0.478036 68.0 sp|A5F4W4|ZAPB_VIBC3 sp|Q1XGE2|HAC1_ASPOR
+0.478036 68.0 sp|Q9KNP5|ZAPB_VIBCH sp|Q1XGE2|HAC1_ASPOR
+0.478036 68.0 sp|C3LSB5|ZAPB_VIBCM sp|Q1XGE2|HAC1_ASPOR
+0.494296 96.0 sp|P97820|M4K4_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.494296 93.0 sp|P34099|KAPC_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.494296 96.0 sp|O95819|M4K4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.494296 88.0 sp|P11115|CPC1_NEUCR sp|Q1XGE2|HAC1_ASPOR
+0.494296 88.0 sp|P42777|GBF4_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.494296 89.0 sp|A3KMR8|MAFA_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.494296 94.0 sp|O60132|TEA4_SCHPO sp|Q1XGE2|HAC1_ASPOR
+0.494296 97.0 sp|Q7KQM6|PERQ1_DROME sp|Q1XGE2|HAC1_ASPOR
+0.510826 91.0 sp|Q9ZLW8|PGBA_HELPJ sp|Q1XGE2|HAC1_ASPOR
+0.510826 91.0 sp|O25249|PGBA_HELPY sp|Q1XGE2|HAC1_ASPOR
+0.510826 83.0 sp|Q13164|MK07_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.510826 95.0 sp|Q1DXU0|EIF3A_COCIM sp|Q1XGE2|HAC1_ASPOR
+0.527633 90.0 sp|O14964|HGS_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.527633 95.0 sp|Q0CUP6|EIF3A_ASPTN sp|Q1XGE2|HAC1_ASPOR
+0.527633 97.0 sp|A5DXA0|NST1_LODEL sp|Q1XGE2|HAC1_ASPOR
+0.527633 88.0 sp|Q4WA21|KAPC_ASPFU sp|Q1XGE2|HAC1_ASPOR
+0.527633 96.0 sp|Q54GQ1|MTMR_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.527633 87.0 sp|P23614|BASP1_CHICK sp|Q1XGE2|HAC1_ASPOR
+0.527633 93.0 sp|Q8SSQ0|GEFR_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.527633 97.0 sp|Q7Z4S6|KI21A_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.527633 80.0 sp|Q2KI00|F107B_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.527633 94.0 sp|Q08014|MEDB_GIALA sp|Q1XGE2|HAC1_ASPOR
+0.544727 90.0 sp|Q9M7Q5|AI5L4_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.544727 90.0 sp|Q09458|YQ37_CAEEL sp|Q1XGE2|HAC1_ASPOR
+0.544727 98.0 sp|Q6MG48|BAT2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.544727 94.0 sp|Q9WU62|INCE_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.562119 92.0 sp|P26043|RADI_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.562119 91.0 sp|Q12234|RUD3_YEAST sp|Q1XGE2|HAC1_ASPOR
+0.562119 94.0 sp|Q98TA5|CA1AA_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.579818 76.0 sp|Q07E15|CTTB2_MUSPF sp|Q1XGE2|HAC1_ASPOR
+0.579818 90.0 sp|Q1MTN9|RLF2_SCHPO sp|Q1XGE2|HAC1_ASPOR
+0.579818 94.0 sp|P07197|NFM_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.579818 88.0 sp|Q6IP50|UBX1A_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.579818 88.0 sp|Q922Y1|UBXN1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.597837 84.0 sp|Q5JR59|MTUS2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.597837 73.0 sp|P14918|EXTN_MAIZE sp|Q1XGE2|HAC1_ASPOR
+0.616186 94.0 sp|C1D8X2|IF2_LARHH sp|Q1XGE2|HAC1_ASPOR
+0.616186 93.0 sp|Q7SAF6|CEF1_NEUCR sp|Q1XGE2|HAC1_ASPOR
+0.616186 67.0 sp|A6VLC4|ZAPB_ACTSZ sp|Q1XGE2|HAC1_ASPOR
+0.634878 86.0 sp|P72929|Y1021_SYNY3 sp|Q1XGE2|HAC1_ASPOR
+0.634878 92.0 sp|O14273|YET4_SCHPO sp|Q1XGE2|HAC1_ASPOR
+0.653926 82.0 sp|Q6DGM8|JDP2_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.653926 91.0 sp|Q8GT73|BH119_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.653926 96.0 sp|C1FXW9|THOC2_DASNO sp|Q1XGE2|HAC1_ASPOR
+0.673345 88.0 sp|P12270|TPR_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.693147 86.0 sp|P29176|FOSX_MSVFR sp|Q1XGE2|HAC1_ASPOR
+0.693147 94.0 sp|Q9UPN4|AZI1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.71335 75.0 sp|P78559|MAP1A_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.71335 86.0 sp|Q5AVK6|NOP16_EMENI sp|Q1XGE2|HAC1_ASPOR
+0.71335 79.0 sp|Q9H098|F107B_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.71335 88.0 sp|P20226|TBP_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.733969 89.0 sp|Q08E13|RNF10_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.733969 87.0 sp|Q9VL63|U430_DROME sp|Q1XGE2|HAC1_ASPOR
+0.733969 92.0 sp|Q13061|TRDN_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.733969 93.0 sp|Q9ES64|USH1C_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.733969 92.0 sp|Q86AF3|BZPH_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.755023 98.0 sp|Q9Y520|BA2L2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.755023 87.0 sp|Q9LES3|AI5L2_ARATH sp|Q1XGE2|HAC1_ASPOR
+0.755023 89.0 sp|Q55E93|BZPE_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.776529 94.0 sp|Q15147|PLCB4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.776529 94.0 sp|Q9QW07|PLCB4_RAT sp|Q1XGE2|HAC1_ASPOR
+0.776529 88.0 sp|Q9QWW1|HOME2_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.776529 88.0 sp|Q98UK5|MAFB_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.776529 89.0 sp|Q9JJ89|CCD86_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.798508 92.0 sp|Q499E4|DZI1L_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.798508 87.0 sp|P34618|CEC1_CAEEL sp|Q1XGE2|HAC1_ASPOR
+0.798508 95.0 sp|Q75JP5|Y2471_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.798508 94.0 sp|Q1E1H4|NST1_COCIM sp|Q1XGE2|HAC1_ASPOR
+0.820981 96.0 sp|P05661|MYSA_DROME sp|Q1XGE2|HAC1_ASPOR
+0.820981 98.0 sp|Q9UPA5|BSN_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.84397 88.0 sp|Q55D99|PAKA_DICDI sp|Q1XGE2|HAC1_ASPOR
+0.84397 91.0 sp|A5PKL7|LZTS2_BOVIN sp|Q1XGE2|HAC1_ASPOR
+0.84397 88.0 sp|Q7RWR8|CWC26_NEUCR sp|Q1XGE2|HAC1_ASPOR
+0.84397 84.0 sp|P35710|SOX5_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.867501 75.0 sp|P24152|EXTN_SORBI sp|Q1XGE2|HAC1_ASPOR
+0.867501 88.0 sp|Q9Z2Q8|FOS_CRIGR sp|Q1XGE2|HAC1_ASPOR
+0.867501 85.0 sp|B4GIF2|EIF3J_DROPE sp|Q1XGE2|HAC1_ASPOR
+0.867501 85.0 sp|Q8I1E5|EIF3J_DROPS sp|Q1XGE2|HAC1_ASPOR
+0.891598 93.0 sp|Q9R269|PEPL_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.891598 82.0 sp|P35711|SOX5_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.891598 86.0 sp|Q9ZJP4|TONB_HELPJ sp|Q1XGE2|HAC1_ASPOR
+0.891598 91.0 sp|Q6NY15|TSG10_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.891598 93.0 sp|Q9Y4D1|DAAM1_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.891598 91.0 sp|P28741|KIF3A_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.916291 94.0 sp|Q9PTD7|CING_XENLA sp|Q1XGE2|HAC1_ASPOR
+0.916291 92.0 sp|O94685|UCP8_SCHPO sp|Q1XGE2|HAC1_ASPOR
+0.916291 94.0 sp|P20482|CNC_DROME sp|Q1XGE2|HAC1_ASPOR
+0.916291 90.0 sp|P56095|AP1_KLULA sp|Q1XGE2|HAC1_ASPOR
+0.916291 85.0 sp|P51984|CREB_CHLVR sp|Q1XGE2|HAC1_ASPOR
+0.941609 89.0 sp|Q00969|ATF2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.941609 90.0 sp|Q29GR8|MOEH_DROPS sp|Q1XGE2|HAC1_ASPOR
+0.967584 88.0 sp|Q10PR4|HSFA9_ORYSJ sp|Q1XGE2|HAC1_ASPOR
+0.967584 90.0 sp|Q15642|CIP4_HUMAN sp|Q1XGE2|HAC1_ASPOR
+0.967584 93.0 sp|Q1LUE5|ZCH18_DANRE sp|Q1XGE2|HAC1_ASPOR
+0.967584 93.0 sp|B0W6N3|EIF3A_CULQU sp|Q1XGE2|HAC1_ASPOR
+0.967584 94.0 sp|Q5XJV7|SETD5_MOUSE sp|Q1XGE2|HAC1_ASPOR
+0.967584 93.0 sp|B3EX63|CING_SORAR sp|Q1XGE2|HAC1_ASPOR
+0.994252 94.0 sp|Q2UDY8|PAN1_ASPOR sp|Q1XGE2|HAC1_ASPOR
+0.994252 91.0 sp|Q5R7F9|MA7D2_PONAB sp|Q1XGE2|HAC1_ASPOR
+0.994252 87.0 sp|O88801|HOME2_RAT sp|Q1XGE2|HAC1_ASPOR
+0.994252 88.0 sp|Q8R424|STABP_RAT sp|Q1XGE2|HAC1_ASPOR
+1.02165 91.0 sp|Q6NS15|MED15_XENLA sp|Q1XGE2|HAC1_ASPOR
+1.02165 89.0 sp|Q6RFY2|PHAR3_RAT sp|Q1XGE2|HAC1_ASPOR
+1.02165 71.0 sp|Q8C2B3|HDAC7_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.02165 65.0 sp|Q54DE2|Y4323_DICDI sp|Q1XGE2|HAC1_ASPOR
+1.02165 65.0 sp|P41425|Y020_NPVAC sp|Q1XGE2|HAC1_ASPOR
+1.02165 65.0 sp|A3MZY9|ZAPB_ACTP2 sp|Q1XGE2|HAC1_ASPOR
+1.02165 65.0 sp|B3H152|ZAPB_ACTP7 sp|Q1XGE2|HAC1_ASPOR
+1.02165 98.0 sp|O88737|BSN_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.04982 83.0 sp|B7GKC7|GRPE_ANOFW sp|Q1XGE2|HAC1_ASPOR
+1.04982 93.0 sp|Q9CXK9|RBM33_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.04982 84.0 sp|Q6CJZ6|MED2_KLULA sp|Q1XGE2|HAC1_ASPOR
+1.04982 95.0 sp|P14105|MYH9_CHICK sp|Q1XGE2|HAC1_ASPOR
+1.04982 92.0 sp|A1WLI3|IF2_VEREI sp|Q1XGE2|HAC1_ASPOR
+1.04982 89.0 sp|Q62736|CALD1_RAT sp|Q1XGE2|HAC1_ASPOR
+1.07881 95.0 sp|Q5F3P8|SET1B_CHICK sp|Q1XGE2|HAC1_ASPOR
+1.07881 96.0 sp|Q96JK9|MAML3_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.07881 89.0 sp|Q5NVN6|CEP63_PONAB sp|Q1XGE2|HAC1_ASPOR
+1.07881 89.0 sp|Q9ZKY5|PGBB_HELPJ sp|Q1XGE2|HAC1_ASPOR
+1.10866 90.0 sp|P18850|ATF6A_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.10866 85.0 sp|Q8N1L9|BATF2_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.10866 95.0 sp|Q9HD67|MYO10_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.10866 89.0 sp|Q0VF49|K2012_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.10866 93.0 sp|Q9JM52|MINK1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.10866 88.0 sp|Q90Z72|NFIL3_CHICK sp|Q1XGE2|HAC1_ASPOR
+1.10866 86.0 sp|P23050|FOS_AVINK sp|Q1XGE2|HAC1_ASPOR
+1.13943 86.0 sp|Q32PF6|DBP_BOVIN sp|Q1XGE2|HAC1_ASPOR
+1.13943 86.0 sp|Q10586|DBP_HUMAN sp|Q1XGE2|HAC1_ASPOR
+1.13943 86.0 sp|Q60925|DBP_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.13943 86.0 sp|P16443|DBP_RAT sp|Q1XGE2|HAC1_ASPOR
+1.13943 90.0 sp|Q66H89|CCD41_RAT sp|Q1XGE2|HAC1_ASPOR
+1.13943 93.0 sp|Q54IE8|IRLE_DICDI sp|Q1XGE2|HAC1_ASPOR
+1.17118 91.0 sp|B4RXT8|IF2_ALTMD sp|Q1XGE2|HAC1_ASPOR
+1.17118 90.0 sp|Q4R628|KIF3A_MACFA sp|Q1XGE2|HAC1_ASPOR
+1.17118 89.0 sp|P46150|MOEH_DROME sp|Q1XGE2|HAC1_ASPOR
+1.17118 88.0 sp|A2QUR1|SFH5_ASPNC sp|Q1XGE2|HAC1_ASPOR
+1.20397 85.0 sp|P05411|JUN_AVIS1 sp|Q1XGE2|HAC1_ASPOR
+1.20397 90.0 sp|Q5ZIA2|MAP7_CHICK sp|Q1XGE2|HAC1_ASPOR
+1.20397 78.0 sp|Q09YM8|CTTB2_RABIT sp|Q1XGE2|HAC1_ASPOR
+1.20397 92.0 sp|Q0CP15|NST1_ASPTN sp|Q1XGE2|HAC1_ASPOR
+1.23787 83.0 sp|A8MPH9|FOSLD_DROME sp|Q1XGE2|HAC1_ASPOR
+1.23787 98.0 sp|Q9QXS1|PLEC1_MOUSE sp|Q1XGE2|HAC1_ASPOR
+1.23787 97.0 sp|Q9WVE9|ITSN1_RAT sp|Q1XGE2|HAC1_ASPOR
+1.23787 82.0 sp|A2QC41|MED21_ASPNC sp|Q1XGE2|HAC1_ASPOR
diff --git a/demotic/regress/wu-blastp-tbl.out b/demotic/regress/wu-blastp-tbl.out
new file mode 100644
index 0000000..3ee41b8
--- /dev/null
+++ b/demotic/regress/wu-blastp-tbl.out
@@ -0,0 +1,369 @@
+9.1e-90 100 1 181 sp|P55685|Y4WG_RHISN 1 181 sp|P55685|Y4WG_RHISN Uncharacterized protein y4wG OS=Rhizobium sp. (strain
+1.3 48 141 173 sp|P55685|Y4WG_RHISN 31 62 sp|Q07074|YH007_YEAST Uncharacterized protein YHR007C-A OS=Saccharomyces
+5.2 28 42 167 sp|P55685|Y4WG_RHISN 107 231 sp|Q8XVA0|Y2931_RALSO UPF0135 protein RSc2931 OS=Ralstonia solanacearum
+5.4 24 29 149 sp|P55685|Y4WG_RHISN 89 209 sp|P33890|TIR2_YEAST Cold shock-induced protein TIR2 OS=Saccharomyces
+5.6 27 39 151 sp|P55685|Y4WG_RHISN 317 431 sp|A7HGP8|CH602_ANADF 60 kDa chaperonin 2 OS=Anaeromyxobacter sp. (strain
+9.0 34 34 101 sp|P55685|Y4WG_RHISN 6 80 sp|Q608F1|Y1541_METCA UPF0350 protein MCA1541 OS=Methylococcus capsulatus
+9.6e-182 100 1 345 sp|Q1XGE2|HAC1_ASPOR 1 345 sp|Q1XGE2|HAC1_ASPOR Transcriptional activator hacA OS=Aspergillus oryzae
+1.5e-137 78 13 344 sp|Q1XGE2|HAC1_ASPOR 18 348 sp|Q8TFU8|HAC1_EMENI Transcriptional activator hacA OS=Emericella nidulans
+1.8e-31 42 7 209 sp|Q1XGE2|HAC1_ASPOR 43 238 sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS=Trichoderma reesei
+1.8e-31 26 253 344 sp|Q1XGE2|HAC1_ASPOR 361 450 sp|Q8TFF3|HAC1_TRIRE Transcriptional activator hac1 OS=Trichoderma reesei
+9.3e-14 32 67 270 sp|Q1XGE2|HAC1_ASPOR 23 216 sp|P41546|HAC1_YEAST Transcriptional activator HAC1 OS=Saccharomyces
+3.4e-12 31 10 152 sp|Q1XGE2|HAC1_ASPOR 12 157 sp|O24646|HY5_ARATH Transcription factor HY5 OS=Arabidopsis thaliana GN=HY5
+7.0e-09 36 60 154 sp|Q1XGE2|HAC1_ASPOR 66 157 sp|Q9SM50|HY5_SOLLC Transcription factor HY5 OS=Solanum lycopersicum GN=HY5
+3.2e-08 33 60 206 sp|Q1XGE2|HAC1_ASPOR 42 196 sp|Q3SZZ2|XBP1_BOVIN X-box-binding protein 1 OS=Bos taurus GN=XBP1 PE=2 SV=1
+3.2e-08 29 16 187 sp|Q1XGE2|HAC1_ASPOR 10 186 sp|P17861|XBP1_HUMAN X-box-binding protein 1 OS=Homo sapiens GN=XBP1 PE=1 SV=2
+3.7e-08 32 4 152 sp|Q1XGE2|HAC1_ASPOR 210 360 sp|A1L224|CR3L2_DANRE Cyclic AMP-responsive element-binding protein 3-like
+1.9e-07 35 73 143 sp|Q1XGE2|HAC1_ASPOR 68 138 sp|Q8W191|HYH_ARATH Transcription factor HY5-like OS=Arabidopsis thaliana
+9.6e-07 29 41 228 sp|Q1XGE2|HAC1_ASPOR 727 906 sp|A3LYI0|NST1_PICST Stress response protein NST1 OS=Pichia stipitis GN=NST1
+0.11 25 40 206 sp|Q1XGE2|HAC1_ASPOR 742 901 sp|A3LYI0|NST1_PICST Stress response protein NST1 OS=Pichia stipitis GN=NST1
+6.4e-06 30 14 157 sp|Q1XGE2|HAC1_ASPOR 228 368 sp|Q70SY1|CR3L2_HUMAN Cyclic AMP-responsive element-binding protein 3-like
+6.4e-06 30 14 157 sp|Q1XGE2|HAC1_ASPOR 228 368 sp|Q5RCM9|CR3L2_PONAB Cyclic AMP-responsive element-binding protein 3-like
+6.5e-06 24 18 297 sp|Q1XGE2|HAC1_ASPOR 234 518 sp|Q8BH52|CR3L2_MOUSE Cyclic AMP-responsive element-binding protein 3-like
+1.2e-05 27 26 207 sp|Q1XGE2|HAC1_ASPOR 138 318 sp|Q61817|CREB3_MOUSE Cyclic AMP-responsive element-binding protein 3 OS=Mus
+1.4e-05 28 4 152 sp|Q1XGE2|HAC1_ASPOR 218 368 sp|A2VD01|CR3L2_XENLA Cyclic AMP-responsive element-binding protein 3-like
+2.3e-05 30 14 228 sp|Q1XGE2|HAC1_ASPOR 223 433 sp|Q66HA2|CR3L1_RAT Cyclic AMP-responsive element-binding protein 3-like
+2.4e-05 24 46 270 sp|Q1XGE2|HAC1_ASPOR 363 593 sp|Q54WN7|BZPF_DICDI Probable basic-leucine zipper transcription factor F
+3.0e-05 30 14 228 sp|Q1XGE2|HAC1_ASPOR 224 434 sp|Q9Z125|CR3L1_MOUSE Cyclic AMP-responsive element-binding protein 3-like
+6.0e-05 28 69 145 sp|Q1XGE2|HAC1_ASPOR 21 97 sp|Q9NR55|BATF3_HUMAN Basic leucine zipper transcriptional factor ATF-like 3
+6.0e-05 33 83 145 sp|Q1XGE2|HAC1_ASPOR 28 90 sp|Q9D275|BATF3_MOUSE Basic leucine zipper transcriptional factor ATF-like 3
+6.4e-05 29 14 230 sp|Q1XGE2|HAC1_ASPOR 224 434 sp|Q96BA8|CR3L1_HUMAN Cyclic AMP-responsive element-binding protein 3-like
+7.2e-05 25 15 229 sp|Q1XGE2|HAC1_ASPOR 2294 2516 sp|O88778|BSN_RAT Protein bassoon OS=Rattus norvegicus GN=Bsn PE=1 SV=3
+0.039 24 12 189 sp|Q1XGE2|HAC1_ASPOR 2318 2504 sp|O88778|BSN_RAT Protein bassoon OS=Rattus norvegicus GN=Bsn PE=1 SV=3
+0.00011 31 29 157 sp|Q1XGE2|HAC1_ASPOR 244 368 sp|Q6QDP7|CR3L2_RAT Cyclic AMP-responsive element-binding protein 3-like
+0.00012 27 3 236 sp|Q1XGE2|HAC1_ASPOR 429 680 sp|Q9WVS8|MK07_MOUSE Mitogen-activated protein kinase 7 OS=Mus musculus
+0.00013 27 24 151 sp|Q1XGE2|HAC1_ASPOR 160 284 sp|Q08CW8|CR3L4_XENTR Cyclic AMP-responsive element-binding protein 3-like
+0.00016 31 71 160 sp|Q1XGE2|HAC1_ASPOR 17 103 sp|Q16520|BATF_HUMAN Basic leucine zipper transcriptional factor ATF-like
+0.00017 29 18 146 sp|Q1XGE2|HAC1_ASPOR 119 256 sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-binding protein 3-like
+0.30 30 70 145 sp|Q1XGE2|HAC1_ASPOR 180 269 sp|Q9D2A5|CR3L4_MOUSE Cyclic AMP-responsive element-binding protein 3-like
+0.00020 29 80 182 sp|Q1XGE2|HAC1_ASPOR 195 296 sp|Q99090|CPRF2_PETCR Light-inducible protein CPRF2 OS=Petroselinum crispum
+0.00021 30 83 145 sp|Q1XGE2|HAC1_ASPOR 28 90 sp|P97876|BATF3_RAT Basic leucine zipper transcriptional factor ATF-like 3
+0.00029 26 31 251 sp|Q1XGE2|HAC1_ASPOR 515 729 sp|Q5B3C8|NST1_EMENI Stress response protein nst1 OS=Emericella nidulans
+0.00030 33 48 162 sp|Q1XGE2|HAC1_ASPOR 214 318 sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-binding protein 3-like
+0.00030 28 15 56 sp|Q1XGE2|HAC1_ASPOR 130 171 sp|Q91XE9|CR3L3_MOUSE Cyclic AMP-responsive element-binding protein 3-like
+0.00032 26 48 275 sp|Q1XGE2|HAC1_ASPOR 213 434 sp|Q3SYZ3|CR3L3_BOVIN Cyclic AMP-responsive element-binding protein 3-like
+0.00032 22 18 154 sp|Q1XGE2|HAC1_ASPOR 204 338 sp|Q6NW59|ATF4_DANRE Cyclic AMP-dependent transcription factor ATF-4 OS=Danio
+0.00032 40 73 135 sp|Q1XGE2|HAC1_ASPOR 52 114 sp|Q9R1S4|XBP1_RAT X-box-binding protein 1 OS=Rattus norvegicus GN=Xbp1 PE=2
+0.00034 28 18 160 sp|Q1XGE2|HAC1_ASPOR 212 349 sp|Q06507|ATF4_MOUSE Cyclic AMP-dependent transcription factor ATF-4 OS=Mus
+0.00044 31 66 160 sp|Q1XGE2|HAC1_ASPOR 258 351 sp|P18848|ATF4_HUMAN Cyclic AMP-dependent transcription factor ATF-4 OS=Homo
+0.00045 28 71 160 sp|Q1XGE2|HAC1_ASPOR 17 103 sp|O35284|BATF_MOUSE Basic leucine zipper transcriptional factor ATF-like
+0.00053 28 72 222 sp|Q1XGE2|HAC1_ASPOR 145 290 sp|P13346|FOSB_MOUSE Protein fosB OS=Mus musculus GN=Fosb PE=2 SV=1
+0.00059 26 29 163 sp|Q1XGE2|HAC1_ASPOR 171 307 sp|Q90888|MAFB_CHICK Transcription factor MafB OS=Gallus gallus GN=MAFB PE=1
+0.00059 26 29 163 sp|Q1XGE2|HAC1_ASPOR 171 307 sp|Q90370|MAFB_COTJA Transcription factor MafB OS=Coturnix coturnix japonica
+0.00071 34 73 143 sp|Q1XGE2|HAC1_ASPOR 52 130 sp|O35426|XBP1_MOUSE X-box-binding protein 1 OS=Mus musculus GN=Xbp1 PE=2 SV=2
+0.00084 25 68 216 sp|Q1XGE2|HAC1_ASPOR 109 261 sp|P51145|FOSL2_RAT Fos-related antigen 2 OS=Rattus norvegicus GN=Fosl2 PE=2
+0.00090 28 48 227 sp|Q1XGE2|HAC1_ASPOR 218 383 sp|Q68CJ9|CR3L3_HUMAN Cyclic AMP-responsive element-binding protein 3-like
+0.00097 24 43 203 sp|Q1XGE2|HAC1_ASPOR 675 844 sp|A4R2R1|NST1_MAGGR Stress response protein NST1 OS=Magnaporthe grisea
+5.1 24 35 142 sp|Q1XGE2|HAC1_ASPOR 614 718 sp|A4R2R1|NST1_MAGGR Stress response protein NST1 OS=Magnaporthe grisea
+0.0011 34 83 167 sp|Q1XGE2|HAC1_ASPOR 201 281 sp|O57342|MAFA_COTJA Transcription factor MafA OS=Coturnix coturnix japonica
+0.0012 26 47 193 sp|Q1XGE2|HAC1_ASPOR 5 156 sp|O60675|MAFK_HUMAN Transcription factor MafK OS=Homo sapiens GN=MAFK PE=1
+0.0012 29 64 232 sp|Q1XGE2|HAC1_ASPOR 88 263 sp|P15407|FOSL1_HUMAN Fos-related antigen 1 OS=Homo sapiens GN=FOSL1 PE=1 SV=1
+0.0014 33 48 162 sp|Q1XGE2|HAC1_ASPOR 214 318 sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-binding protein 3-like
+0.0014 26 15 56 sp|Q1XGE2|HAC1_ASPOR 130 171 sp|Q5FVM5|CR3L3_RAT Cyclic AMP-responsive element-binding protein 3-like
+0.0015 25 9 221 sp|Q1XGE2|HAC1_ASPOR 105 326 sp|Q03173|ENAH_MOUSE Protein enabled homolog OS=Mus musculus GN=Enah PE=1 SV=2
+0.0015 27 72 222 sp|Q1XGE2|HAC1_ASPOR 145 290 sp|P53539|FOSB_HUMAN Protein fosB OS=Homo sapiens GN=FOSB PE=1 SV=1
+0.0016 33 16 119 sp|Q1XGE2|HAC1_ASPOR 188 291 sp|Q2VZV0|IF2_MAGSA Translation initiation factor IF-2 OS=Magnetospirillum
+0.0017 26 47 193 sp|Q1XGE2|HAC1_ASPOR 5 156 sp|Q61827|MAFK_MOUSE Transcription factor MafK OS=Mus musculus GN=Mafk PE=2
+0.0018 30 8 150 sp|Q1XGE2|HAC1_ASPOR 370 508 sp|P29747|CREBA_DROME Cyclic AMP response element-binding protein A
+0.0018 66 10 21 sp|Q1XGE2|HAC1_ASPOR 71 82 sp|P29747|CREBA_DROME Cyclic AMP response element-binding protein A
+0.0019 30 74 237 sp|Q1XGE2|HAC1_ASPOR 125 298 sp|O88479|FOS_MESAU Proto-oncogene c-Fos OS=Mesocricetus auratus GN=FOS PE=3
+0.0019 26 72 209 sp|Q1XGE2|HAC1_ASPOR 145 284 sp|Q9TUB3|FOSB_CANFA Protein fosB OS=Canis familiaris GN=FOSB PE=3 SV=1
+0.0020 31 54 146 sp|Q1XGE2|HAC1_ASPOR 192 280 sp|Q8TEY5|CR3L4_HUMAN Cyclic AMP-responsive element-binding protein 3-like
+0.0020 31 54 146 sp|Q1XGE2|HAC1_ASPOR 192 280 sp|Q5UEM8|CR3L4_MACFA Cyclic AMP-responsive element-binding protein 3-like
+0.0020 30 66 160 sp|Q1XGE2|HAC1_ASPOR 255 347 sp|Q9ES19|ATF4_RAT Cyclic AMP-dependent transcription factor ATF-4 OS=Rattus
+0.0020 22 6 254 sp|Q1XGE2|HAC1_ASPOR 39 286 sp|P79702|FOS_CYPCA Proto-oncogene c-Fos OS=Cyprinus carpio GN=fos PE=2 SV=1
+0.0021 31 35 142 sp|Q1XGE2|HAC1_ASPOR 111 219 sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Homo sapiens GN=ENAH PE=1 SV=2
+0.045 30 37 142 sp|Q1XGE2|HAC1_ASPOR 102 207 sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Homo sapiens GN=ENAH PE=1 SV=2
+0.20 28 49 173 sp|Q1XGE2|HAC1_ASPOR 177 302 sp|Q8N8S7|ENAH_HUMAN Protein enabled homolog OS=Homo sapiens GN=ENAH PE=1 SV=2
+0.0023 25 68 216 sp|Q1XGE2|HAC1_ASPOR 108 260 sp|P47930|FOSL2_MOUSE Fos-related antigen 2 OS=Mus musculus GN=Fosl2 PE=2 SV=1
+0.0027 29 26 172 sp|Q1XGE2|HAC1_ASPOR 277 424 sp|Q5R9C9|ATF7_PONAB Cyclic AMP-dependent transcription factor ATF-7 OS=Pongo
+0.0028 29 26 172 sp|Q1XGE2|HAC1_ASPOR 288 435 sp|P17544|ATF7_HUMAN Cyclic AMP-dependent transcription factor ATF-7 OS=Homo
+0.0030 27 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|Q9Y5Q3|MAFB_HUMAN Transcription factor MafB OS=Homo sapiens GN=MAFB PE=1
+0.0032 28 42 208 sp|Q1XGE2|HAC1_ASPOR 92 255 sp|Q9UQ88|CD11A_HUMAN Cell division protein kinase 11A OS=Homo sapiens
+0.0032 26 259 302 sp|Q1XGE2|HAC1_ASPOR 622 665 sp|Q9UQ88|CD11A_HUMAN Cell division protein kinase 11A OS=Homo sapiens
+0.0033 30 63 185 sp|Q1XGE2|HAC1_ASPOR 159 282 sp|O43889|CREB3_HUMAN Cyclic AMP-responsive element-binding protein 3 OS=Homo
+0.0034 26 19 146 sp|Q1XGE2|HAC1_ASPOR 210 338 sp|Q3ZCH6|ATF4_BOVIN Cyclic AMP-dependent transcription factor ATF-4 OS=Bos
+0.0035 29 26 143 sp|Q1XGE2|HAC1_ASPOR 277 392 sp|Q8R0S1|ATF7_MOUSE Cyclic AMP-dependent transcription factor ATF-7 OS=Mus
+0.0037 37 79 149 sp|Q1XGE2|HAC1_ASPOR 218 296 sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Arabidopsis thaliana GN=GBF1
+3.9 29 23 144 sp|Q1XGE2|HAC1_ASPOR 191 306 sp|P42774|GBF1_ARATH G-box-binding factor 1 OS=Arabidopsis thaliana GN=GBF1
+0.0038 26 20 221 sp|Q1XGE2|HAC1_ASPOR 105 301 sp|Q8SQ19|CREB3_BOVIN Cyclic AMP-responsive element-binding protein 3 OS=Bos
+0.0038 33 60 146 sp|Q1XGE2|HAC1_ASPOR 170 252 sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-binding protein 3-like
+0.0038 50 19 36 sp|Q1XGE2|HAC1_ASPOR 29 46 sp|Q5UEM7|CR3L4_RAT Cyclic AMP-responsive element-binding protein 3-like
+0.0039 26 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|P54842|MAFB_RAT Transcription factor MafB OS=Rattus norvegicus GN=Mafb PE=1
+0.0039 27 3 236 sp|Q1XGE2|HAC1_ASPOR 429 655 sp|A5PKJ4|MK07_BOVIN Mitogen-activated protein kinase 7 OS=Bos taurus GN=MAPK7
+0.0040 26 2 237 sp|Q1XGE2|HAC1_ASPOR 57 297 sp|P01101|FOS_MOUSE Proto-oncogene c-Fos OS=Mus musculus GN=Fos PE=1 SV=1
+0.0045 25 41 172 sp|Q1XGE2|HAC1_ASPOR 629 763 sp|O13024|INCEA_XENLA Inner centromere protein A OS=Xenopus laevis GN=incenp-A
+0.26 33 67 146 sp|Q1XGE2|HAC1_ASPOR 484 567 sp|O13024|INCEA_XENLA Inner centromere protein A OS=Xenopus laevis GN=incenp-A
+5.3 28 38 154 sp|Q1XGE2|HAC1_ASPOR 584 703 sp|O13024|INCEA_XENLA Inner centromere protein A OS=Xenopus laevis GN=incenp-A
+0.0050 27 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|Q2PFS4|MAFB_MACFA Transcription factor MafB OS=Macaca fascicularis GN=MAFB
+0.0050 28 41 230 sp|Q1XGE2|HAC1_ASPOR 747 930 sp|Q5KGK5|EIF3A_CRYNE Eukaryotic translation initiation factor 3 subunit A
+0.0051 29 74 237 sp|Q1XGE2|HAC1_ASPOR 125 297 sp|O97930|FOS_PIG Proto-oncogene c-Fos OS=Sus scrofa GN=FOS PE=3 SV=2
+0.0052 31 74 237 sp|Q1XGE2|HAC1_ASPOR 125 297 sp|P01102|FOS_MSVFB p55-v-Fos-transforming protein OS=FBJ murine osteosarcoma
+0.0057 24 74 223 sp|Q1XGE2|HAC1_ASPOR 4 163 sp|Q09926|PCR1_SCHPO Transcription factor pcr1 OS=Schizosaccharomyces pombe
+0.0062 25 47 193 sp|Q1XGE2|HAC1_ASPOR 5 156 sp|Q90596|MAFK_CHICK Transcription factor MafK OS=Gallus gallus GN=MAFK PE=1
+0.0063 25 29 163 sp|Q1XGE2|HAC1_ASPOR 176 312 sp|Q504L8|MAFB_XENTR Transcription factor MafB OS=Xenopus tropicalis GN=mafb
+0.0065 25 16 273 sp|Q1XGE2|HAC1_ASPOR 1009 1269 sp|Q1DQC1|PAN1_COCIM Actin cytoskeleton-regulatory complex protein PAN1
+0.0065 26 14 163 sp|Q1XGE2|HAC1_ASPOR 174 319 sp|P54841|MAFB_MOUSE Transcription factor MafB OS=Mus musculus GN=Mafb PE=1
+0.0078 22 41 219 sp|Q1XGE2|HAC1_ASPOR 800 987 sp|Q5A2K0|NST1_CANAL Stress response protein NST1 OS=Candida albicans GN=NST1
+7.0 24 41 151 sp|Q1XGE2|HAC1_ASPOR 729 840 sp|Q5A2K0|NST1_CANAL Stress response protein NST1 OS=Candida albicans GN=NST1
+0.0079 25 19 233 sp|Q1XGE2|HAC1_ASPOR 146 364 sp|Q8VCH8|UBXN4_MOUSE UBX domain-containing protein 4 OS=Mus musculus GN=Ubxn4
+0.0080 25 8 199 sp|Q1XGE2|HAC1_ASPOR 138 322 sp|Q502F0|CR3LA_DANRE Cyclic AMP-responsive element-binding protein 3-like
+0.0081 27 64 232 sp|Q1XGE2|HAC1_ASPOR 90 267 sp|P10158|FOSL1_RAT Fos-related antigen 1 OS=Rattus norvegicus GN=Fosl1 PE=2
+0.0081 28 16 163 sp|Q1XGE2|HAC1_ASPOR 9 155 sp|P97875|JDP2_MOUSE Jun dimerization protein 2 OS=Mus musculus GN=Jdp2 PE=1
+0.0081 28 16 163 sp|Q1XGE2|HAC1_ASPOR 9 155 sp|Q78E65|JDP2_RAT Jun dimerization protein 2 OS=Rattus norvegicus GN=Jdp2
+0.0086 29 68 185 sp|Q1XGE2|HAC1_ASPOR 108 227 sp|P15408|FOSL2_HUMAN Fos-related antigen 2 OS=Homo sapiens GN=FOSL2 PE=1 SV=1
+0.0087 32 89 167 sp|Q1XGE2|HAC1_ASPOR 205 281 sp|O42290|MAFA_CHICK Transcription factor MafA OS=Gallus gallus GN=MAFA PE=1
+0.011 20 66 223 sp|Q1XGE2|HAC1_ASPOR 83 237 sp|A1C9M5|KAPC_ASPCL Putative transcription factor kapC OS=Aspergillus
+0.011 47 299 315 sp|Q1XGE2|HAC1_ASPOR 269 285 sp|A1C9M5|KAPC_ASPCL Putative transcription factor kapC OS=Aspergillus
+0.011 26 3 236 sp|Q1XGE2|HAC1_ASPOR 429 680 sp|P0C865|MK07_RAT Mitogen-activated protein kinase 7 OS=Rattus norvegicus
+0.013 33 50 143 sp|Q1XGE2|HAC1_ASPOR 609 700 sp|Q15424|SAFB1_HUMAN Scaffold attachment factor B1 OS=Homo sapiens GN=SAFB
+0.014 23 7 259 sp|Q1XGE2|HAC1_ASPOR 282 518 sp|O60841|IF2P_HUMAN Eukaryotic translation initiation factor 5B OS=Homo
+0.014 23 6 259 sp|Q1XGE2|HAC1_ASPOR 278 518 sp|Q5RDE1|IF2P_PONAB Eukaryotic translation initiation factor 5B OS=Pongo
+0.015 32 14 145 sp|Q1XGE2|HAC1_ASPOR 291 435 sp|Q9M7Q3|AI5L6_ARATH ABSCISIC ACID-INSENSITIVE 5-like protein 6
+0.016 29 39 165 sp|Q1XGE2|HAC1_ASPOR 764 903 sp|A9V549|EIF3A_MONBE Eukaryotic translation initiation factor 3 subunit A
+1.9 24 49 188 sp|Q1XGE2|HAC1_ASPOR 768 901 sp|A9V549|EIF3A_MONBE Eukaryotic translation initiation factor 3 subunit A
+0.016 27 46 223 sp|Q1XGE2|HAC1_ASPOR 294 477 sp|Q9UKV3|ACINU_HUMAN Apoptotic chromatin condensation inducer in the nucleus
+0.017 29 39 210 sp|Q1XGE2|HAC1_ASPOR 79 238 sp|Q63ZM7|STABP_XENLA STAM-binding protein-like OS=Xenopus laevis GN=stambp
+0.018 26 6 180 sp|Q1XGE2|HAC1_ASPOR 281 460 sp|Q4QRL3|CC88B_MOUSE Coiled-coil domain-containing protein 88B OS=Mus
+1.6 29 74 154 sp|Q1XGE2|HAC1_ASPOR 1164 1243 sp|Q4QRL3|CC88B_MOUSE Coiled-coil domain-containing protein 88B OS=Mus
+0.019 28 74 237 sp|Q1XGE2|HAC1_ASPOR 125 297 sp|P01100|FOS_HUMAN Proto-oncogene c-Fos OS=Homo sapiens GN=FOS PE=1 SV=1
+0.019 29 74 237 sp|Q1XGE2|HAC1_ASPOR 125 297 sp|P12841|FOS_RAT Proto-oncogene c-Fos OS=Rattus norvegicus GN=Fos PE=1 SV=1
+0.019 27 28 157 sp|Q1XGE2|HAC1_ASPOR 13 131 sp|P19880|YAP1_YEAST AP-1-like transcription factor YAP1 OS=Saccharomyces
+0.019 21 160 269 sp|Q1XGE2|HAC1_ASPOR 438 545 sp|P19880|YAP1_YEAST AP-1-like transcription factor YAP1 OS=Saccharomyces
+0.019 35 73 153 sp|Q1XGE2|HAC1_ASPOR 644 724 sp|Q8CH25|SLTM_MOUSE SAFB-like transcription modulator OS=Mus musculus GN=Sltm
+0.069 28 39 151 sp|Q1XGE2|HAC1_ASPOR 597 709 sp|Q8CH25|SLTM_MOUSE SAFB-like transcription modulator OS=Mus musculus GN=Sltm
+0.020 35 73 153 sp|Q1XGE2|HAC1_ASPOR 645 725 sp|Q9NWH9|SLTM_HUMAN SAFB-like transcription modulator OS=Homo sapiens GN=SLTM
+0.15 28 39 151 sp|Q1XGE2|HAC1_ASPOR 598 710 sp|Q9NWH9|SLTM_HUMAN SAFB-like transcription modulator OS=Homo sapiens GN=SLTM
+0.020 25 2 148 sp|Q1XGE2|HAC1_ASPOR 142 290 sp|Q16534|HLF_HUMAN Hepatic leukemia factor OS=Homo sapiens GN=HLF PE=2 SV=1
+0.020 25 2 148 sp|Q1XGE2|HAC1_ASPOR 142 290 sp|Q8BW74|HLF_MOUSE Hepatic leukemia factor OS=Mus musculus GN=Hlf PE=2 SV=1
+0.021 27 74 219 sp|Q1XGE2|HAC1_ASPOR 489 640 sp|Q6CBW0|NST1_YARLI Stress response protein NST1 OS=Yarrowia lipolytica
+0.045 27 48 194 sp|Q1XGE2|HAC1_ASPOR 477 629 sp|Q6CBW0|NST1_YARLI Stress response protein NST1 OS=Yarrowia lipolytica
+1.2 23 44 224 sp|Q1XGE2|HAC1_ASPOR 441 606 sp|Q6CBW0|NST1_YARLI Stress response protein NST1 OS=Yarrowia lipolytica
+7.0 27 37 154 sp|Q1XGE2|HAC1_ASPOR 368 480 sp|Q6CBW0|NST1_YARLI Stress response protein NST1 OS=Yarrowia lipolytica
+0.85 26 43 141 sp|Q1XGE2|HAC1_ASPOR 389 483 sp|Q6CBW0|NST1_YARLI Stress response protein NST1 OS=Yarrowia lipolytica
+0.85 27 129 216 sp|Q1XGE2|HAC1_ASPOR 633 721 sp|Q6CBW0|NST1_YARLI Stress response protein NST1 OS=Yarrowia lipolytica
+0.022 30 73 153 sp|Q1XGE2|HAC1_ASPOR 607 689 sp|Q498L2|SLTM_XENLA SAFB-like transcription modulator OS=Xenopus laevis
+0.022 26 29 83 sp|Q1XGE2|HAC1_ASPOR 456 509 sp|Q498L2|SLTM_XENLA SAFB-like transcription modulator OS=Xenopus laevis
+0.045 20 6 83 sp|Q1XGE2|HAC1_ASPOR 120 195 sp|Q498L2|SLTM_XENLA SAFB-like transcription modulator OS=Xenopus laevis
+0.023 25 9 123 sp|Q1XGE2|HAC1_ASPOR 1 122 sp|Q1E554|CGR1_COCIM rRNA-processing protein CGR1 OS=Coccidioides immitis
+0.023 27 15 144 sp|Q1XGE2|HAC1_ASPOR 47 181 sp|Q91496|FOS_TETFL Proto-oncogene c-Fos OS=Tetraodon fluviatilis GN=fos PE=3
+0.023 26 62 200 sp|Q1XGE2|HAC1_ASPOR 455 605 sp|Q9ESN9|JIP3_MOUSE C-Jun-amino-terminal kinase-interacting protein 3 OS=Mus
+0.023 31 8 65 sp|Q1XGE2|HAC1_ASPOR 266 322 sp|Q9ESN9|JIP3_MOUSE C-Jun-amino-terminal kinase-interacting protein 3 OS=Mus
+0.023 25 15 248 sp|Q1XGE2|HAC1_ASPOR 48 279 sp|P53450|FOS_TAKRU Proto-oncogene c-Fos OS=Takifugu rubripes GN=fos PE=3 SV=1
+0.024 22 43 187 sp|Q1XGE2|HAC1_ASPOR 343 478 sp|Q05682|CALD1_HUMAN Caldesmon OS=Homo sapiens GN=CALD1 PE=1 SV=2
+0.49 25 73 239 sp|Q1XGE2|HAC1_ASPOR 541 702 sp|Q05682|CALD1_HUMAN Caldesmon OS=Homo sapiens GN=CALD1 PE=1 SV=2
+4.7 25 43 133 sp|Q1XGE2|HAC1_ASPOR 315 400 sp|Q05682|CALD1_HUMAN Caldesmon OS=Homo sapiens GN=CALD1 PE=1 SV=2
+0.49 24 32 84 sp|Q1XGE2|HAC1_ASPOR 425 477 sp|Q05682|CALD1_HUMAN Caldesmon OS=Homo sapiens GN=CALD1 PE=1 SV=2
+0.024 28 74 237 sp|Q1XGE2|HAC1_ASPOR 125 297 sp|O77628|FOS_BOVIN Proto-oncogene c-Fos OS=Bos taurus GN=FOS PE=2 SV=2
+0.024 29 74 237 sp|Q1XGE2|HAC1_ASPOR 125 298 sp|Q56TT7|FOS_PHOCM Proto-oncogene c-Fos OS=Phodopus campbelli GN=FOS PE=3
+0.025 24 66 223 sp|Q1XGE2|HAC1_ASPOR 85 240 sp|Q0CEI3|KAPC_ASPTN Putative transcription factor kapC OS=Aspergillus terreus
+0.025 24 9 250 sp|Q1XGE2|HAC1_ASPOR 628 858 sp|Q6P9R4|ARHGI_MOUSE Rho guanine nucleotide exchange factor 18 OS=Mus
+0.025 24 8 181 sp|Q1XGE2|HAC1_ASPOR 14 192 sp|P29681|IMPE2_DROME 20-hydroxyecdysone protein OS=Drosophila melanogaster
+0.026 25 7 149 sp|Q1XGE2|HAC1_ASPOR 530 669 sp|A2AJI0|MA7D1_MOUSE MAP7 domain-containing protein 1 OS=Mus musculus
+0.41 22 6 172 sp|Q1XGE2|HAC1_ASPOR 570 748 sp|A2AJI0|MA7D1_MOUSE MAP7 domain-containing protein 1 OS=Mus musculus
+0.048 25 7 145 sp|Q1XGE2|HAC1_ASPOR 58 202 sp|A2AJI0|MA7D1_MOUSE MAP7 domain-containing protein 1 OS=Mus musculus
+0.048 27 133 204 sp|Q1XGE2|HAC1_ASPOR 524 589 sp|A2AJI0|MA7D1_MOUSE MAP7 domain-containing protein 1 OS=Mus musculus
+0.028 33 50 143 sp|Q1XGE2|HAC1_ASPOR 609 699 sp|Q5R452|SAFB1_PONAB Scaffold attachment factor B1 OS=Pongo abelii GN=SAFB
+0.029 29 80 199 sp|Q1XGE2|HAC1_ASPOR 207 322 sp|Q1LYG4|CR3LB_DANRE Cyclic AMP-responsive element-binding protein 3-like
+0.029 25 43 149 sp|Q1XGE2|HAC1_ASPOR 319 432 sp|Q9D439|CCD11_MOUSE Coiled-coil domain-containing protein 11 OS=Mus musculus
+0.029 27 64 232 sp|Q1XGE2|HAC1_ASPOR 88 265 sp|P48755|FOSL1_MOUSE Fos-related antigen 1 OS=Mus musculus GN=Fosl1 PE=2 SV=2
+0.029 25 29 163 sp|Q1XGE2|HAC1_ASPOR 171 309 sp|Q6DE84|MAFB_XENLA Transcription factor MafB OS=Xenopus laevis GN=mafb PE=2
+0.030 30 74 153 sp|Q1XGE2|HAC1_ASPOR 268 347 sp|Q54RZ9|BZPG_DICDI Probable basic-leucine zipper transcription factor G
+0.030 24 1 215 sp|Q1XGE2|HAC1_ASPOR 208 432 sp|A0JMK9|CAF1A_DANRE Chromatin assembly factor 1 subunit A OS=Danio rerio
+0.030 31 236 286 sp|Q1XGE2|HAC1_ASPOR 524 569 sp|A0JMK9|CAF1A_DANRE Chromatin assembly factor 1 subunit A OS=Danio rerio
+0.031 26 68 207 sp|Q1XGE2|HAC1_ASPOR 108 249 sp|P18625|FOSL2_CHICK Fos-related antigen 2 OS=Gallus gallus GN=FOSL2 PE=1
+0.031 22 66 223 sp|Q1XGE2|HAC1_ASPOR 85 236 sp|A2R346|KAPC_ASPNC Putative transcription factor kapC OS=Aspergillus niger
+0.031 28 74 237 sp|Q1XGE2|HAC1_ASPOR 126 298 sp|Q8HZP6|FOS_FELCA Proto-oncogene c-Fos OS=Felis catus GN=FOS PE=2 SV=1
+0.034 25 49 150 sp|Q1XGE2|HAC1_ASPOR 326 428 sp|P26042|MOES_PIG Moesin OS=Sus scrofa GN=MSN PE=2 SV=3
+0.043 30 66 157 sp|Q1XGE2|HAC1_ASPOR 297 384 sp|P26042|MOES_PIG Moesin OS=Sus scrofa GN=MSN PE=2 SV=3
+0.034 25 49 150 sp|Q1XGE2|HAC1_ASPOR 326 428 sp|Q2HJ49|MOES_BOVIN Moesin OS=Bos taurus GN=MSN PE=2 SV=3
+0.056 31 66 145 sp|Q1XGE2|HAC1_ASPOR 297 367 sp|Q2HJ49|MOES_BOVIN Moesin OS=Bos taurus GN=MSN PE=2 SV=3
+0.035 26 48 255 sp|Q1XGE2|HAC1_ASPOR 60 271 sp|A5FV21|IF2_ACICJ Translation initiation factor IF-2 OS=Acidiphilium cryptum
+0.56 24 27 229 sp|Q1XGE2|HAC1_ASPOR 27 238 sp|A5FV21|IF2_ACICJ Translation initiation factor IF-2 OS=Acidiphilium cryptum
+0.035 27 32 205 sp|Q1XGE2|HAC1_ASPOR 8 187 sp|A6SCT6|DBP3_BOTFB ATP-dependent RNA helicase dbp3 OS=Botryotinia fuckeliana
+0.036 32 35 168 sp|Q1XGE2|HAC1_ASPOR 754 892 sp|Q7PGE8|EIF3A_ANOGA Eukaryotic translation initiation factor 3 subunit A
+0.037 26 39 216 sp|Q1XGE2|HAC1_ASPOR 488 676 sp|O77788|NFM_BOVIN Neurofilament medium polypeptide OS=Bos taurus GN=NEFM
+0.038 24 17 178 sp|Q1XGE2|HAC1_ASPOR 151 317 sp|Q9JTB5|IF2_NEIMA Translation initiation factor IF-2 OS=Neisseria
+0.038 24 17 178 sp|Q1XGE2|HAC1_ASPOR 151 317 sp|Q9JYD2|IF2_NEIMB Translation initiation factor IF-2 OS=Neisseria
+0.038 24 17 178 sp|Q1XGE2|HAC1_ASPOR 151 317 sp|A1KV51|IF2_NEIMF Translation initiation factor IF-2 OS=Neisseria
+0.039 24 17 162 sp|Q1XGE2|HAC1_ASPOR 49 179 sp|P0C5H8|KAPC_EMENI Putative transcription factor kapC OS=Emericella nidulans
+0.040 30 5 149 sp|Q1XGE2|HAC1_ASPOR 610 764 sp|Q80YR5|SAFB2_MOUSE Scaffold attachment factor B2 OS=Mus musculus GN=Safb2
+0.040 29 74 237 sp|Q1XGE2|HAC1_ASPOR 125 298 sp|Q56TN0|FOS_PHORO Proto-oncogene c-Fos OS=Phodopus roborovskii GN=FOS PE=3
+0.042 30 83 167 sp|Q1XGE2|HAC1_ASPOR 203 284 sp|Q4U1U2|MAFA_XENTR Transcription factor MafA OS=Xenopus tropicalis GN=mafa
+0.043 25 49 150 sp|Q1XGE2|HAC1_ASPOR 326 428 sp|P26038|MOES_HUMAN Moesin OS=Homo sapiens GN=MSN PE=1 SV=3
+0.056 31 66 145 sp|Q1XGE2|HAC1_ASPOR 297 367 sp|P26038|MOES_HUMAN Moesin OS=Homo sapiens GN=MSN PE=1 SV=3
+0.044 25 2 148 sp|Q1XGE2|HAC1_ASPOR 142 290 sp|Q64709|HLF_RAT Hepatic leukemia factor OS=Rattus norvegicus GN=Hlf PE=2
+0.045 28 29 142 sp|Q1XGE2|HAC1_ASPOR 216 324 sp|A0JMT0|CA1AB_XENLA Chromatin assembly factor 1 subunit A-B OS=Xenopus
+0.058 22 8 210 sp|Q1XGE2|HAC1_ASPOR 234 432 sp|A0JMT0|CA1AB_XENLA Chromatin assembly factor 1 subunit A-B OS=Xenopus
+0.045 28 48 180 sp|Q1XGE2|HAC1_ASPOR 824 957 sp|Q6Y7W6|PERQ2_HUMAN PERQ amino acid-rich with GYF domain-containing protein
+0.045 27 1 33 sp|Q1XGE2|HAC1_ASPOR 429 461 sp|Q6Y7W6|PERQ2_HUMAN PERQ amino acid-rich with GYF domain-containing protein
+0.046 29 48 163 sp|Q1XGE2|HAC1_ASPOR 33 155 sp|Q8WYK2|JDP2_HUMAN Jun dimerization protein 2 OS=Homo sapiens GN=JDP2 PE=1
+0.047 30 52 143 sp|Q1XGE2|HAC1_ASPOR 194 284 sp|Q8K1L0|CREB5_MOUSE Cyclic AMP-responsive element-binding protein 5 OS=Mus
+0.047 22 2 193 sp|Q1XGE2|HAC1_ASPOR 410 608 sp|Q9C0A6|SETD5_HUMAN SET domain-containing protein 5 OS=Homo sapiens GN=SETD5
+0.047 25 22 233 sp|Q1XGE2|HAC1_ASPOR 156 366 sp|Q92575|UBXN4_HUMAN UBX domain-containing protein 4 OS=Homo sapiens GN=UBXN4
+0.047 25 22 233 sp|Q1XGE2|HAC1_ASPOR 156 366 sp|Q5R4I3|UBXN4_PONAB UBX domain-containing protein 4 OS=Pongo abelii GN=UBXN4
+0.049 39 80 142 sp|Q1XGE2|HAC1_ASPOR 181 242 sp|P14233|TGA1B_TOBAC TGACG-sequence-specific DNA-binding protein TGA-1B
+0.049 24 17 178 sp|Q1XGE2|HAC1_ASPOR 151 317 sp|A9M1D5|IF2_NEIM0 Translation initiation factor IF-2 OS=Neisseria
+0.050 27 80 175 sp|Q1XGE2|HAC1_ASPOR 546 644 sp|Q554P0|BZPJ_DICDI Probable basic-leucine zipper transcription factor J
+0.051 25 43 146 sp|Q1XGE2|HAC1_ASPOR 279 378 sp|Q8N9W4|GG6L2_HUMAN Golgin subfamily A member 6-like protein 2 OS=Homo
+3.7 26 48 138 sp|Q1XGE2|HAC1_ASPOR 361 453 sp|Q8N9W4|GG6L2_HUMAN Golgin subfamily A member 6-like protein 2 OS=Homo
+4.8 19 35 142 sp|Q1XGE2|HAC1_ASPOR 302 409 sp|Q8N9W4|GG6L2_HUMAN Golgin subfamily A member 6-like protein 2 OS=Homo
+7.9 24 43 142 sp|Q1XGE2|HAC1_ASPOR 404 509 sp|Q8N9W4|GG6L2_HUMAN Golgin subfamily A member 6-like protein 2 OS=Homo
+0.051 31 71 124 sp|Q1XGE2|HAC1_ASPOR 3 54 sp|Q8N300|CCD23_HUMAN Coiled-coil domain-containing protein 23 OS=Homo sapiens
+0.054 31 41 149 sp|Q1XGE2|HAC1_ASPOR 174 289 sp|O81025|P2A03_ARATH Putative protein PHLOEM PROTEIN 2-LIKE A3 OS=Arabidopsis
+0.056 25 49 150 sp|Q1XGE2|HAC1_ASPOR 326 428 sp|O35763|MOES_RAT Moesin OS=Rattus norvegicus GN=Msn PE=1 SV=3
+0.26 28 66 145 sp|Q1XGE2|HAC1_ASPOR 297 367 sp|O35763|MOES_RAT Moesin OS=Rattus norvegicus GN=Msn PE=1 SV=3
+8.9 29 73 168 sp|Q1XGE2|HAC1_ASPOR 379 475 sp|O35763|MOES_RAT Moesin OS=Rattus norvegicus GN=Msn PE=1 SV=3
+0.057 28 44 210 sp|Q1XGE2|HAC1_ASPOR 361 536 sp|Q9Z220|TSG10_RAT Testis-specific gene 10 protein OS=Rattus norvegicus
+0.058 26 39 176 sp|Q1XGE2|HAC1_ASPOR 651 787 sp|Q32N93|INCEB_XENLA Inner centromere protein B OS=Xenopus laevis GN=incenp-B
+1.2 30 67 146 sp|Q1XGE2|HAC1_ASPOR 502 585 sp|Q32N93|INCEB_XENLA Inner centromere protein B OS=Xenopus laevis GN=incenp-B
+3.3 24 46 177 sp|Q1XGE2|HAC1_ASPOR 645 771 sp|Q32N93|INCEB_XENLA Inner centromere protein B OS=Xenopus laevis GN=incenp-B
+9.0 26 41 157 sp|Q1XGE2|HAC1_ASPOR 610 737 sp|Q32N93|INCEB_XENLA Inner centromere protein B OS=Xenopus laevis GN=incenp-B
+0.058 29 32 211 sp|Q1XGE2|HAC1_ASPOR 177 354 sp|Q95XZ5|NPBL_CAEEL Nipped-B-like protein pqn-85 OS=Caenorhabditis elegans
+0.061 27 74 171 sp|Q1XGE2|HAC1_ASPOR 801 901 sp|Q6CT90|EIF3A_KLULA Eukaryotic translation initiation factor 3 subunit A
+0.061 25 4 232 sp|Q1XGE2|HAC1_ASPOR 634 845 sp|Q5F489|TAF3_CHICK Transcription initiation factor TFIID subunit 3 OS=Gallus
+0.061 35 80 156 sp|Q1XGE2|HAC1_ASPOR 246 326 sp|P42775|GBF2_ARATH G-box-binding factor 2 OS=Arabidopsis thaliana GN=GBF2
+0.062 28 18 154 sp|Q1XGE2|HAC1_ASPOR 283 415 sp|Q55EQ3|Y9086_DICDI Uncharacterized abhydrolase domain-containing protein
+0.079 25 13 187 sp|Q1XGE2|HAC1_ASPOR 324 487 sp|Q55EQ3|Y9086_DICDI Uncharacterized abhydrolase domain-containing protein
+1.6 31 67 187 sp|Q1XGE2|HAC1_ASPOR 639 756 sp|Q55EQ3|Y9086_DICDI Uncharacterized abhydrolase domain-containing protein
+0.062 29 73 151 sp|Q1XGE2|HAC1_ASPOR 1105 1180 sp|Q54LU8|Y8646_DICDI Probable serine/threonine-protein kinase DDB_G0286465
+0.062 21 7 85 sp|Q1XGE2|HAC1_ASPOR 536 614 sp|Q54LU8|Y8646_DICDI Probable serine/threonine-protein kinase DDB_G0286465
+0.25 32 43 70 sp|Q1XGE2|HAC1_ASPOR 755 782 sp|Q54LU8|Y8646_DICDI Probable serine/threonine-protein kinase DDB_G0286465
+0.068 27 29 183 sp|Q1XGE2|HAC1_ASPOR 22 188 sp|P94517|YSCB_BACSU Uncharacterized protein yscB OS=Bacillus subtilis GN=yscB
+0.069 23 54 174 sp|Q1XGE2|HAC1_ASPOR 799 924 sp|Q2UKG6|EIF3A_ASPOR Eukaryotic translation initiation factor 3 subunit A
+0.071 24 49 226 sp|Q1XGE2|HAC1_ASPOR 517 693 sp|Q9Y592|CCD41_HUMAN Coiled-coil domain-containing protein 41 OS=Homo sapiens
+6.7 26 32 146 sp|Q1XGE2|HAC1_ASPOR 192 307 sp|Q9Y592|CCD41_HUMAN Coiled-coil domain-containing protein 41 OS=Homo sapiens
+0.072 24 13 267 sp|Q1XGE2|HAC1_ASPOR 284 545 sp|Q6Y7W8|PERQ2_MOUSE PERQ amino acid-rich with GYF domain-containing protein
+0.091 28 48 180 sp|Q1XGE2|HAC1_ASPOR 825 958 sp|Q6Y7W8|PERQ2_MOUSE PERQ amino acid-rich with GYF domain-containing protein
+0.091 33 10 46 sp|Q1XGE2|HAC1_ASPOR 434 472 sp|Q6Y7W8|PERQ2_MOUSE PERQ amino acid-rich with GYF domain-containing protein
+0.072 35 246 265 sp|Q1XGE2|HAC1_ASPOR 1169 1188 sp|Q6Y7W8|PERQ2_MOUSE PERQ amino acid-rich with GYF domain-containing protein
+0.072 33 75 136 sp|Q1XGE2|HAC1_ASPOR 202 263 sp|Q8X229|FCR3_CANAL Fluconazole resistance protein 3 OS=Candida albicans
+0.072 24 49 150 sp|Q1XGE2|HAC1_ASPOR 326 428 sp|P26041|MOES_MOUSE Moesin OS=Mus musculus GN=Msn PE=1 SV=3
+0.26 28 66 145 sp|Q1XGE2|HAC1_ASPOR 297 367 sp|P26041|MOES_MOUSE Moesin OS=Mus musculus GN=Msn PE=1 SV=3
+0.074 25 55 271 sp|Q1XGE2|HAC1_ASPOR 941 1150 sp|Q9TW28|MYOM_DICDI Myosin-M heavy chain OS=Dictyostelium discoideum GN=myoM
+0.20 28 46 205 sp|Q1XGE2|HAC1_ASPOR 943 1098 sp|Q9TW28|MYOM_DICDI Myosin-M heavy chain OS=Dictyostelium discoideum GN=myoM
+0.077 24 32 294 sp|Q1XGE2|HAC1_ASPOR 107 375 sp|Q9NZ53|PDXL2_HUMAN Podocalyxin-like protein 2 OS=Homo sapiens GN=PODXL2
+0.078 30 52 143 sp|Q1XGE2|HAC1_ASPOR 345 435 sp|Q02930|CREB5_HUMAN Cyclic AMP-responsive element-binding protein 5 OS=Homo
+0.079 27 14 203 sp|Q1XGE2|HAC1_ASPOR 664 845 sp|Q5HZG4|TAF3_MOUSE Transcription initiation factor TFIID subunit 3 OS=Mus
+4.4 23 72 229 sp|Q1XGE2|HAC1_ASPOR 697 842 sp|Q5HZG4|TAF3_MOUSE Transcription initiation factor TFIID subunit 3 OS=Mus
+4.4 24 4 89 sp|Q1XGE2|HAC1_ASPOR 485 567 sp|Q5HZG4|TAF3_MOUSE Transcription initiation factor TFIID subunit 3 OS=Mus
+7.0 33 17 74 sp|Q1XGE2|HAC1_ASPOR 240 294 sp|Q5HZG4|TAF3_MOUSE Transcription initiation factor TFIID subunit 3 OS=Mus
+0.080 23 41 183 sp|Q1XGE2|HAC1_ASPOR 70 203 sp|A0LE19|IF2_MAGSM Translation initiation factor IF-2 OS=Magnetococcus sp.
+0.081 24 41 221 sp|Q1XGE2|HAC1_ASPOR 246 432 sp|Q869E1|DNLI1_DICDI DNA ligase 1 OS=Dictyostelium discoideum GN=lig1 PE=3
+3.5 23 32 209 sp|Q1XGE2|HAC1_ASPOR 227 407 sp|Q869E1|DNLI1_DICDI DNA ligase 1 OS=Dictyostelium discoideum GN=lig1 PE=3
+0.085 27 48 149 sp|Q1XGE2|HAC1_ASPOR 736 839 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+0.49 25 30 152 sp|Q1XGE2|HAC1_ASPOR 122 247 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+0.63 24 35 146 sp|Q1XGE2|HAC1_ASPOR 428 540 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+1.0 25 49 146 sp|Q1XGE2|HAC1_ASPOR 498 596 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+1.3 25 49 146 sp|Q1XGE2|HAC1_ASPOR 470 568 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+2.2 22 49 154 sp|Q1XGE2|HAC1_ASPOR 526 634 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+3.7 30 75 154 sp|Q1XGE2|HAC1_ASPOR 366 443 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+3.7 24 49 138 sp|Q1XGE2|HAC1_ASPOR 554 646 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+3.7 26 41 154 sp|Q1XGE2|HAC1_ASPOR 631 738 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+4.7 23 40 151 sp|Q1XGE2|HAC1_ASPOR 711 827 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+4.7 23 32 154 sp|Q1XGE2|HAC1_ASPOR 650 772 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+6.1 27 40 142 sp|Q1XGE2|HAC1_ASPOR 596 704 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+6.1 25 40 154 sp|Q1XGE2|HAC1_ASPOR 568 674 sp|P22793|TRHY_SHEEP Trichohyalin OS=Ovis aries GN=TCHH PE=2 SV=2
+0.088 32 63 155 sp|Q1XGE2|HAC1_ASPOR 192 277 sp|O70191|ATF5_MOUSE Cyclic AMP-dependent transcription factor ATF-5 OS=Mus
+0.089 36 77 131 sp|Q1XGE2|HAC1_ASPOR 38 91 sp|Q39140|TGA6_ARATH Transcription factor TGA6 OS=Arabidopsis thaliana GN=TGA6
+0.089 27 73 221 sp|Q1XGE2|HAC1_ASPOR 52 196 sp|Q68EL6|NFIL3_DANRE Nuclear factor interleukin-3-regulated protein OS=Danio
+0.089 28 43 146 sp|Q1XGE2|HAC1_ASPOR 390 495 sp|Q55FW7|GLE1_DICDI Nucleoporin GLE1 OS=Dictyostelium discoideum GN=gle1 PE=3
+1.8 26 48 145 sp|Q1XGE2|HAC1_ASPOR 377 466 sp|Q55FW7|GLE1_DICDI Nucleoporin GLE1 OS=Dictyostelium discoideum GN=gle1 PE=3
+0.096 28 43 142 sp|Q1XGE2|HAC1_ASPOR 468 570 sp|Q3TLH4|BA2L2_MOUSE Protein BAT2-like 2 OS=Mus musculus GN=Bat2l2 PE=1 SV=2
+9.4 23 7 149 sp|Q1XGE2|HAC1_ASPOR 345 482 sp|Q3TLH4|BA2L2_MOUSE Protein BAT2-like 2 OS=Mus musculus GN=Bat2l2 PE=1 SV=2
+0.096 23 140 270 sp|Q1XGE2|HAC1_ASPOR 1816 1953 sp|Q3TLH4|BA2L2_MOUSE Protein BAT2-like 2 OS=Mus musculus GN=Bat2l2 PE=1 SV=2
+3.0 28 158 210 sp|Q1XGE2|HAC1_ASPOR 1768 1818 sp|Q3TLH4|BA2L2_MOUSE Protein BAT2-like 2 OS=Mus musculus GN=Bat2l2 PE=1 SV=2
+0.096 23 49 188 sp|Q1XGE2|HAC1_ASPOR 81 221 sp|Q04323|UBXN1_HUMAN UBX domain-containing protein 1 OS=Homo sapiens GN=UBXN1
+9.9 30 74 208 sp|Q1XGE2|HAC1_ASPOR 83 210 sp|Q04323|UBXN1_HUMAN UBX domain-containing protein 1 OS=Homo sapiens GN=UBXN1
+0.097 29 59 150 sp|Q1XGE2|HAC1_ASPOR 223 319 sp|P23922|HBP1A_WHEAT Transcription factor HBP-1a OS=Triticum aestivum PE=2
+0.099 35 71 133 sp|Q1XGE2|HAC1_ASPOR 176 239 sp|Q9C5Q2|AI5L3_ARATH ABSCISIC ACID-INSENSITIVE 5-like protein 3
+0.10 22 32 142 sp|Q1XGE2|HAC1_ASPOR 168 280 sp|Q54TD7|DDX24_DICDI ATP-dependent RNA helicase ddx24 OS=Dictyostelium
+0.10 26 17 178 sp|Q1XGE2|HAC1_ASPOR 151 298 sp|Q5F797|IF2_NEIG1 Translation initiation factor IF-2 OS=Neisseria
+0.10 26 17 178 sp|Q1XGE2|HAC1_ASPOR 151 298 sp|B4RMZ3|IF2_NEIG2 Translation initiation factor IF-2 OS=Neisseria
+0.10 24 41 231 sp|Q1XGE2|HAC1_ASPOR 310 493 sp|Q86AH4|Y8592_DICDI Putative uncharacterized protein DDB_G0271982
+0.11 24 39 169 sp|Q1XGE2|HAC1_ASPOR 616 747 sp|Q8IIG7|YPF05_PLAF7 Uncharacterized protein PF11_0207 OS=Plasmodium
+0.11 26 36 210 sp|Q1XGE2|HAC1_ASPOR 1257 1435 sp|B2KI97|THOC2_RHIFE THO complex subunit 2 OS=Rhinolophus ferrumequinum
+0.11 25 43 188 sp|Q1XGE2|HAC1_ASPOR 931 1070 sp|Q9UM54|MYO6_HUMAN Myosin-VI OS=Homo sapiens GN=MYO6 PE=1 SV=4
+8.2 24 11 149 sp|Q1XGE2|HAC1_ASPOR 877 1018 sp|Q9UM54|MYO6_HUMAN Myosin-VI OS=Homo sapiens GN=MYO6 PE=1 SV=4
+0.12 25 16 224 sp|Q1XGE2|HAC1_ASPOR 583 779 sp|Q3KQU3|MA7D1_HUMAN MAP7 domain-containing protein 1 OS=Homo sapiens
+3.1 28 16 135 sp|Q1XGE2|HAC1_ASPOR 555 680 sp|Q3KQU3|MA7D1_HUMAN MAP7 domain-containing protein 1 OS=Homo sapiens
+8.4 25 16 145 sp|Q1XGE2|HAC1_ASPOR 68 200 sp|Q3KQU3|MA7D1_HUMAN MAP7 domain-containing protein 1 OS=Homo sapiens
+0.17 26 14 154 sp|Q1XGE2|HAC1_ASPOR 441 582 sp|Q14244|MAP7_HUMAN Ensconsin OS=Homo sapiens GN=MAP7 PE=1 SV=1
+0.12 21 75 188 sp|Q1XGE2|HAC1_ASPOR 556 674 sp|Q14244|MAP7_HUMAN Ensconsin OS=Homo sapiens GN=MAP7 PE=1 SV=1
+0.12 31 11 71 sp|Q1XGE2|HAC1_ASPOR 335 403 sp|Q14244|MAP7_HUMAN Ensconsin OS=Homo sapiens GN=MAP7 PE=1 SV=1
+0.12 29 62 158 sp|Q1XGE2|HAC1_ASPOR 73 163 sp|P29596|ATF3_RAT Cyclic AMP-dependent transcription factor ATF-3 OS=Rattus
+0.12 25 18 201 sp|Q1XGE2|HAC1_ASPOR 380 569 sp|Q5TM26|BAT2_MACMU Large proline-rich protein BAT2 OS=Macaca mulatta GN=BAT2
+0.12 27 43 176 sp|Q1XGE2|HAC1_ASPOR 642 792 sp|Q0IHP2|INCE_XENTR Inner centromere protein OS=Xenopus tropicalis GN=incenp
+5.5 27 41 149 sp|Q1XGE2|HAC1_ASPOR 589 697 sp|Q0IHP2|INCE_XENTR Inner centromere protein OS=Xenopus tropicalis GN=incenp
+0.13 28 18 146 sp|Q1XGE2|HAC1_ASPOR 478 606 sp|Q9NQS7|INCE_HUMAN Inner centromere protein OS=Homo sapiens GN=INCENP PE=1
+0.58 24 37 151 sp|Q1XGE2|HAC1_ASPOR 627 738 sp|Q9NQS7|INCE_HUMAN Inner centromere protein OS=Homo sapiens GN=INCENP PE=1
+1.2 24 39 151 sp|Q1XGE2|HAC1_ASPOR 607 724 sp|Q9NQS7|INCE_HUMAN Inner centromere protein OS=Homo sapiens GN=INCENP PE=1
+1.6 27 41 172 sp|Q1XGE2|HAC1_ASPOR 666 808 sp|Q9NQS7|INCE_HUMAN Inner centromere protein OS=Homo sapiens GN=INCENP PE=1
+7.2 21 34 196 sp|Q1XGE2|HAC1_ASPOR 25 175 sp|Q9NQS7|INCE_HUMAN Inner centromere protein OS=Homo sapiens GN=INCENP PE=1
+0.13 24 73 337 sp|Q1XGE2|HAC1_ASPOR 200 459 sp|Q5HZY0|UBXN4_RAT UBX domain-containing protein 4 OS=Rattus norvegicus
+0.13 30 63 167 sp|Q1XGE2|HAC1_ASPOR 32 134 sp|Q90595|MAFF_CHICK Transcription factor MafF OS=Gallus gallus GN=MAFF PE=1
+0.13 27 80 231 sp|Q1XGE2|HAC1_ASPOR 851 996 sp|Q6ZSZ5|ARHGI_HUMAN Rho guanine nucleotide exchange factor 18 OS=Homo
+0.13 22 36 151 sp|Q1XGE2|HAC1_ASPOR 299 416 sp|Q7PS12|MOEH_ANOGA Moesin/ezrin/radixin homolog 1 OS=Anopheles gambiae
+0.13 28 43 179 sp|Q1XGE2|HAC1_ASPOR 261 399 sp|P12957|CALD1_CHICK Caldesmon OS=Gallus gallus GN=CALD1 PE=1 SV=2
+0.17 23 31 216 sp|Q1XGE2|HAC1_ASPOR 278 457 sp|P12957|CALD1_CHICK Caldesmon OS=Gallus gallus GN=CALD1 PE=1 SV=2
+9.7 22 52 239 sp|Q1XGE2|HAC1_ASPOR 472 660 sp|P12957|CALD1_CHICK Caldesmon OS=Gallus gallus GN=CALD1 PE=1 SV=2
+0.13 34 76 133 sp|Q1XGE2|HAC1_ASPOR 206 262 sp|Q08DA8|ATF1_BOVIN Cyclic AMP-dependent transcription factor ATF-1 OS=Bos
+0.14 26 26 139 sp|Q1XGE2|HAC1_ASPOR 52 172 sp|Q94126|CES2_CAEEL Cell death specification protein 2 OS=Caenorhabditis
+0.14 29 34 133 sp|Q1XGE2|HAC1_ASPOR 21 114 sp|O66547|Y157_AQUAE Uncharacterized protein aq_157 OS=Aquifex aeolicus
+0.14 28 35 140 sp|Q1XGE2|HAC1_ASPOR 681 787 sp|A6ZRZ0|NST1_YEAS7 Stress response protein NST1 OS=Saccharomyces cerevisiae
+1.4 24 41 231 sp|Q1XGE2|HAC1_ASPOR 669 849 sp|A6ZRZ0|NST1_YEAS7 Stress response protein NST1 OS=Saccharomyces cerevisiae
+6.1 22 43 149 sp|Q1XGE2|HAC1_ASPOR 633 737 sp|A6ZRZ0|NST1_YEAS7 Stress response protein NST1 OS=Saccharomyces cerevisiae
+0.14 28 35 140 sp|Q1XGE2|HAC1_ASPOR 681 787 sp|P53935|NST1_YEAST Stress response protein NST1 OS=Saccharomyces cerevisiae
+1.4 24 41 231 sp|Q1XGE2|HAC1_ASPOR 669 849 sp|P53935|NST1_YEAST Stress response protein NST1 OS=Saccharomyces cerevisiae
+6.1 22 43 149 sp|Q1XGE2|HAC1_ASPOR 633 737 sp|P53935|NST1_YEAST Stress response protein NST1 OS=Saccharomyces cerevisiae
+0.14 23 24 281 sp|Q1XGE2|HAC1_ASPOR 48 304 sp|A3BYC1|HOX25_ORYSJ Homeobox-leucine zipper protein HOX25 OS=Oryza sativa
+0.14 24 36 206 sp|Q1XGE2|HAC1_ASPOR 1257 1429 sp|B1AZI6|THOC2_MOUSE THO complex subunit 2 OS=Mus musculus GN=Thoc2 PE=3 SV=1
+0.15 24 6 203 sp|Q1XGE2|HAC1_ASPOR 2186 2384 sp|Q9H254|SPTN4_HUMAN Spectrin beta chain, brain 3 OS=Homo sapiens GN=SPTBN4
+0.15 23 16 223 sp|Q1XGE2|HAC1_ASPOR 44 237 sp|Q2UNX4|KAPC_ASPOR Putative transcription factor kapC OS=Aspergillus oryzae
+0.15 34 82 176 sp|Q1XGE2|HAC1_ASPOR 487 581 sp|Q9JJ50|HGS_RAT Hepatocyte growth factor-regulated tyrosine kinase substrate
+0.15 29 6 68 sp|Q1XGE2|HAC1_ASPOR 277 355 sp|Q9JJ50|HGS_RAT Hepatocyte growth factor-regulated tyrosine kinase substrate
+0.15 29 62 158 sp|Q1XGE2|HAC1_ASPOR 73 163 sp|Q2KII1|ATF3_BOVIN Cyclic AMP-dependent transcription factor ATF-3 OS=Bos
+0.15 28 17 139 sp|Q1XGE2|HAC1_ASPOR 260 388 sp|Q99941|ATF6B_HUMAN Cyclic AMP-dependent transcription factor ATF-6 beta
+0.16 25 18 234 sp|Q1XGE2|HAC1_ASPOR 378 584 sp|Q7TSC1|BAT2_MOUSE Large proline-rich protein BAT2 OS=Mus musculus GN=Bat2
+0.16 28 80 232 sp|Q1XGE2|HAC1_ASPOR 137 292 sp|Q4I877|NDE1_GIBZE Nuclear distribution protein nudE homolog 1 OS=Gibberella
+0.16 28 74 183 sp|Q1XGE2|HAC1_ASPOR 218 339 sp|Q84WU4|GOGC3_ARATH Golgin candidate 3 OS=Arabidopsis thaliana GN=GC3 PE=1
+0.16 23 19 188 sp|Q1XGE2|HAC1_ASPOR 46 221 sp|Q499N6|UBXN1_RAT UBX domain-containing protein 1 OS=Rattus norvegicus
+0.16 27 72 144 sp|Q1XGE2|HAC1_ASPOR 201 273 sp|B4PPK2|FOSL_DROYA Transcription factor kayak OS=Drosophila yakuba GN=kay
+0.16 35 183 239 sp|Q1XGE2|HAC1_ASPOR 382 438 sp|B4PPK2|FOSL_DROYA Transcription factor kayak OS=Drosophila yakuba GN=kay
+0.16 38 10 43 sp|Q1XGE2|HAC1_ASPOR 95 127 sp|B4PPK2|FOSL_DROYA Transcription factor kayak OS=Drosophila yakuba GN=kay
+0.17 25 37 221 sp|Q1XGE2|HAC1_ASPOR 1022 1198 sp|A4R8N4|PAN1_MAGGR Actin cytoskeleton-regulatory complex protein PAN1
+0.17 26 41 209 sp|Q1XGE2|HAC1_ASPOR 1024 1201 sp|B2AWS3|PAN1_PODAN Actin cytoskeleton-regulatory complex protein PAN1
+0.17 22 21 216 sp|Q1XGE2|HAC1_ASPOR 1296 1485 sp|Q92545|TM131_HUMAN Transmembrane protein 131 OS=Homo sapiens GN=TMEM131
+0.17 24 4 191 sp|Q1XGE2|HAC1_ASPOR 41 230 sp|Q38W81|IF2_LACSS Translation initiation factor IF-2 OS=Lactobacillus sakei
+0.17 30 83 163 sp|Q1XGE2|HAC1_ASPOR 276 355 sp|Q789F3|MAF_CHICK Transcription factor Maf OS=Gallus gallus GN=MAF PE=1 SV=1
+0.17 24 19 146 sp|Q1XGE2|HAC1_ASPOR 131 254 sp|P49716|CEBPD_HUMAN CCAAT/enhancer-binding protein delta OS=Homo sapiens
+0.49 29 60 154 sp|Q1XGE2|HAC1_ASPOR 153 248 sp|P49716|CEBPD_HUMAN CCAAT/enhancer-binding protein delta OS=Homo sapiens
+0.17 35 77 133 sp|Q1XGE2|HAC1_ASPOR 206 261 sp|P81269|ATF1_MOUSE Cyclic AMP-dependent transcription factor ATF-1 OS=Mus
+0.18 30 83 163 sp|Q1XGE2|HAC1_ASPOR 276 355 sp|P23091|MAF_AVIS4 Transforming protein Maf OS=Avian musculoaponeurotic
+0.18 35 77 133 sp|Q1XGE2|HAC1_ASPOR 208 263 sp|P18846|ATF1_HUMAN Cyclic AMP-dependent transcription factor ATF-1 OS=Homo
+0.18 23 41 160 sp|Q1XGE2|HAC1_ASPOR 586 702 sp|Q07283|TRHY_HUMAN Trichohyalin OS=Homo sapiens GN=TCHH PE=1 SV=2
+0.23 26 41 154 sp|Q1XGE2|HAC1_ASPOR 546 658 sp|Q07283|TRHY_HUMAN Trichohyalin OS=Homo sapiens GN=TCHH PE=1 SV=2
+0.30 26 40 151 sp|Q1XGE2|HAC1_ASPOR 253 359 sp|Q07283|TRHY_HUMAN Trichohyalin OS=Homo sapiens GN=TCHH PE=1 SV=2
+3.7 28 48 151 sp|Q1XGE2|HAC1_ASPOR 241 347 sp|Q07283|TRHY_HUMAN Trichohyalin OS=Homo sapiens GN=TCHH PE=1 SV=2
+3.7 24 41 154 sp|Q1XGE2|HAC1_ASPOR 956 1071 sp|Q07283|TRHY_HUMAN Trichohyalin OS=Homo sapiens GN=TCHH PE=1 SV=2
+3.7 26 43 151 sp|Q1XGE2|HAC1_ASPOR 440 557 sp|Q07283|TRHY_HUMAN Trichohyalin OS=Homo sapiens GN=TCHH PE=1 SV=2
+4.7 29 43 151 sp|Q1XGE2|HAC1_ASPOR 1297 1404 sp|Q07283|TRHY_HUMAN Trichohyalin OS=Homo sapiens GN=TCHH PE=1 SV=2
+0.18 29 107 235 sp|Q1XGE2|HAC1_ASPOR 178 296 sp|Q4X1V0|NDE1_ASPFU Nuclear distribution protein nudE homolog 1
+4.6 24 80 204 sp|Q1XGE2|HAC1_ASPOR 162 287 sp|Q4X1V0|NDE1_ASPFU Nuclear distribution protein nudE homolog 1
+0.18 30 81 120 sp|Q1XGE2|HAC1_ASPOR 40 77 sp|Q4X1V0|NDE1_ASPFU Nuclear distribution protein nudE homolog 1
+0.18 25 77 135 sp|Q1XGE2|HAC1_ASPOR 12 70 sp|Q8R1H8|BATF2_MOUSE Basic leucine zipper transcriptional factor ATF-like 2
+0.18 29 137 200 sp|Q1XGE2|HAC1_ASPOR 117 184 sp|Q8R1H8|BATF2_MOUSE Basic leucine zipper transcriptional factor ATF-like 2
+0.19 26 31 159 sp|Q1XGE2|HAC1_ASPOR 11 140 sp|Q66J36|NFIL3_XENLA Nuclear factor interleukin-3-regulated protein
+0.19 23 36 177 sp|Q1XGE2|HAC1_ASPOR 242 376 sp|P13816|GARP_PLAFF Glutamic acid-rich protein OS=Plasmodium falciparum
+0.19 25 76 142 sp|Q1XGE2|HAC1_ASPOR 137 203 sp|P38749|YAP3_YEAST AP-1-like transcription factor YAP3 OS=Saccharomyces
+0.19 24 80 285 sp|Q1XGE2|HAC1_ASPOR 588 784 sp|Q3UIW5|RNF10_MOUSE RING finger protein 10 OS=Mus musculus GN=Rnf10 PE=2
+0.19 19 1 57 sp|Q1XGE2|HAC1_ASPOR 546 602 sp|Q3UIW5|RNF10_MOUSE RING finger protein 10 OS=Mus musculus GN=Rnf10 PE=2
+0.19 40 73 131 sp|Q1XGE2|HAC1_ASPOR 37 91 sp|P23923|HBP1B_WHEAT Transcription factor HBP-1b(c38) OS=Triticum aestivum
+0.19 24 49 226 sp|Q1XGE2|HAC1_ASPOR 516 692 sp|Q9D5R3|CCD41_MOUSE Coiled-coil domain-containing protein 41 OS=Mus musculus
+0.20 23 35 193 sp|Q1XGE2|HAC1_ASPOR 737 898 sp|Q9QXL2|KI21A_MOUSE Kinesin-like protein KIF21A OS=Mus musculus GN=Kif21a
+0.20 25 62 200 sp|Q1XGE2|HAC1_ASPOR 454 604 sp|Q9UPT6|JIP3_HUMAN C-Jun-amino-terminal kinase-interacting protein 3 OS=Homo
+0.20 31 8 65 sp|Q1XGE2|HAC1_ASPOR 265 321 sp|Q9UPT6|JIP3_HUMAN C-Jun-amino-terminal kinase-interacting protein 3 OS=Homo
+0.20 22 6 250 sp|Q1XGE2|HAC1_ASPOR 784 1016 sp|P16884|NFH_RAT Neurofilament heavy polypeptide OS=Rattus norvegicus GN=Nefh
+0.20 29 62 158 sp|Q1XGE2|HAC1_ASPOR 73 163 sp|Q60765|ATF3_MOUSE Cyclic AMP-dependent transcription factor ATF-3 OS=Mus
+0.20 26 64 163 sp|Q1XGE2|HAC1_ASPOR 142 244 sp|Q9N0J3|CEBPD_SHEEP CCAAT/enhancer-binding protein delta OS=Ovis aries
+0.20 20 39 235 sp|Q1XGE2|HAC1_ASPOR 632 820 sp|A5DLJ8|NST1_PICGU Stress response protein NST1 OS=Pichia guilliermondii
diff --git a/demotic/test.pl b/demotic/test.pl
new file mode 100755
index 0000000..38d60d0
--- /dev/null
+++ b/demotic/test.pl
@@ -0,0 +1,15 @@
+#! /usr/bin/perl
+
+use demotic_blast;
+
+$swiss_wu = "/misc/data0/databases/Uniprot/uniprot_sprot_wu.fasta";
+
+open(BLAST, "blastp $swiss_wu example.fa 2>/dev/null |");
+while (demotic_blast::parse(\*BLAST))
+{
+ for ($i = 0; $i < $demotic_blast::nhits; $i++) {
+ printf "%.2g\t%.1f\t%s\t%s\n", $demotic_blast::hit_Eval[$i], $demotic_blast::hit_bitscore[$i], $demotic_blast::hit_target[$i], $demotic_blast::queryname;
+ }
+}
+close BLAST;
+
diff --git a/devkit/00README b/devkit/00README
new file mode 100644
index 0000000..2ea1648
--- /dev/null
+++ b/devkit/00README
@@ -0,0 +1,5 @@
+
+
+Generating a list of all keywords (functions, macros, etc) in a codebase:
+ find . -name \*.[ch] -exec ctags -x {} \; | ~/src/easel/trunk/devkit/ctags-fix | sort | tbl-pretty -f3 > 00INDEX
+
diff --git a/devkit/autodoc b/devkit/autodoc
new file mode 100755
index 0000000..d865277
--- /dev/null
+++ b/devkit/autodoc
@@ -0,0 +1,315 @@
+#! /usr/bin/perl
+
+# Usage:
+# ./autodoc <C file>
+# ./autodoc -t <C file>
+#
+# Input is a C .c file with my structured function header convention.
+# Output is .tex file suitable for inclusion in my LaTeX documentation.
+#
+# Requirements:
+# 1. .tex file needs to have \sreapi environment defined;
+# see hmmer, squid, infernal, etc. "macro.tex" to get a copy.
+#
+# 2. .tex file needs to have \ccode command defined, to produce
+# courier (or whatever) computerese font for variables, macros,
+# etc.
+#
+# 3. Functions must use headers according to my conventions, for example:
+# (defined as sre-insert-my-function-header() in .emacs LISP)
+#
+# /* Function: function()
+# * Synopsis: A short (half-line) description.
+# * Incept: SRE, Tue Nov 30 19:36:17 2004 [St. Louis]
+# *
+# * Purpose: Given an <argument>, carry out an important
+# * function, and return an answer.
+# *
+# * Args: argument - some text, or NULL
+# *
+# * Returns: <SRE_SUCCESS> on success; <SRE_FAILED> on failure.
+# *
+# * Throws: <SRE_MALLOC_FAILED> on an allocation failure.
+# *
+# * Xref: STL8/p.159.
+# */
+# int
+# function(char *argument)
+# {
+# etc.
+#
+# The Function and Purpose blocks are required.
+# Only the Function, Synopsis, Purpose, Returns, and Throws blocks are used.
+#
+# The exact spacing of the beginning of each line is important;
+# for example, the parser depends on seeing "/* Function" at the beginning,
+# " * \S" on a line starting a new block of info, and " * " or
+# " */" on a line that continues a previous info block. The exact
+# spacing style of "int\nfunction(char *argument)\n{" is also essential.
+#
+#
+# SRE, Tue Nov 30 19:43:47 2004
+
+use Getopt::Std;
+
+&getopts('n:t');
+$cfile = shift;
+
+if ($opt_t) { $show_api_table = 1; }
+if ($opt_n) { $modulename = $opt_n; } else {
+ if ($cfile eq "easel") { $modulename = "easel"; }
+ elsif ($cfile =~ /esl_(\S+)\.c/) { $modulename = $1; }
+ else { $modulename = "foo"; }
+}
+
+$text = `cat $cfile`;
+$nfuncs = &parse_function_documentation($text);
+$nsections = &parse_api_subheads($text);
+
+if ($show_api_table)
+{
+ $j = -1;
+ printf("%% Table generated by autodoc -t $cfile (so don't edit here, edit $cfile:)\n");
+ printf("\\begin{table}[hbp]\n");
+ printf("\\begin{center}\n");
+ printf("{\\small\n");
+ printf("\\begin{tabular}{|ll|}\\hline\n");
+ for ($i = 0; $i < $nfuncs; $i++)
+ {
+ if ($insection{$function[$i]} != $j)
+ {
+ $j = $insection{$function[$i]};
+ printf("\\apisubhead{%s}\\\\\n", $apisubheads[$j]);
+ }
+
+ if ($synopsis[$i] ne "") {
+ printf("\\hyperlink{func:%s()}{\\ccode{%s()}} & %s\\\\\n",
+ $function[$i], $pfunction[$i], $synopsis[$i]);
+ } else {
+ printf("\\hyperlink{func:%s()}{\\ccode{%s()}} & [Description]\\\\\n",
+ $function[$i], $pfunction[$i]);
+ }
+ }
+ printf("\\hline\n");
+ printf("\\end{tabular}\n");
+ printf("}\n");
+ printf("\\end{center}\n");
+ printf("\\caption{The \\eslmod{%s} API.}\n", $modulename);
+ printf("\\label{tbl:%s_api}\n", $modulename);
+ printf("\\end{table}\n");
+}
+else
+{
+ print "\\begin{sreapi}\n";
+ for ($i = 0; $i < $nfuncs; $i++)
+ {
+ printf("\\hypertarget{func:%s()}\n{", $function[$i]);
+ printf "\\item[%s %s(%s)]",
+ $returntype[$i],
+ $pfunction[$i],
+ $args[$i];
+ printf("}\n");
+
+
+ print "\n";
+ print $purpose[$i], "\n";
+ print "Returns ", $returns[$i], "\n" unless ($returns[$i] eq "");
+ print "Throws ", $throws[$i], "\n" unless ($throws[$i] eq "");
+ print "\n\n";
+ }
+ print "\\end{sreapi}\n\n";
+}
+exit;
+
+# Function: parse_function_documentation
+#
+# Purpose: Given <text> from a .c file, parse it for my structured
+# function documentation. Returns <n>, the number of
+# documented functions found; and it populates the following
+# global arrays:
+# function - verbatim name of the function
+# pfunction - name of the function, protected for LaTeX (\_ not _, for example)
+# returntype - C return type; for example, "int"
+# args - C argument list, from the func def'n
+# purpose - Text documenting the function
+# synopsis - OPTIONAL: short half-line description, else ""
+# incept - OPTIONAL: date/name/place, else ""
+# argdocs - OPTIONAL: table documenting the args, else ""
+# returns - OPTIONAL: documentation of returned
+# information or codes; else "";
+# throws - OPTIONAL: documentation of returned
+# abnormal error codes
+#
+# Each of these is an array indexed <0..n-1>, for the <n>
+# documented functions.
+#
+sub
+parse_function_documentation
+{
+ my ($text) = @_;
+ my ($comment, $n, $first_funcname);
+
+ $n = 0;
+ # /* Function: text \n double \n foo ( args ) \n{
+ while ($text =~ m|(/\*\s*Function:\s*.+?\*/)\s*\n(.+?)\s*\n(\S+)\((.+?)\)\s*\n\{|gms) {
+ $comment = $1;
+ $returntype[$n] = $2;
+ $function[$n] = $3;
+ $args[$n] = $4;
+
+ # Delimit end of each block in the comments with a \n@*, for
+ # convenience in getting out the individual blocks.
+ $comment =~ s|\n \* (\S)|\n@\* \1|g;
+ $comment =~ s|\n \*/|\n@\*/|g;
+
+ # Remove leading comment symbols and spacing.
+ $comment =~ s|\n[ \t]*\*[ \t]*|\n|g;
+
+
+ # Now, grab all the individual blocks of info from a structured
+ # function header comment. Required fields:
+ # Function:
+ # Purpose:
+ # the function and its args.
+ #
+ if ($comment =~ m|/\* Function:\s*(.+?)\n@\*|ms) { $first_funcname = $1; }
+ else {next;}
+ if ($first_funcname =~ /^(\S+)\(\)/) { $first_funcname = $1; }
+ if ($first_funcname ne $function[$n]) { die "parse error; $first_funcname != $function[$n]";}
+
+ if ($comment =~ m|\n@\* Synopsis:\s*(.+?)\n|ms) { $synopsis[$n] = &process_comment_text($1); }
+ else {$synopsis[$n] = ""; }
+
+ if ($comment =~ m|\n@\* Incept:\s*(.+?)\n|ms) { $incept[$n] = &process_comment_text($1); }
+ else {$incept[$n] = ""; }
+
+ if ($comment =~ m|\n@\* Purpose:\s*(.+?)\n@\*|ms) { $purpose[$n] = &process_comment_text($1); }
+ else {next;}
+
+ if ($comment =~ m|\n@\* Args:\s*(.+?)\n@\*|ms) { $argdocs[$n] = $1; }
+ else {$argdocs = ""; }
+
+ if ($comment =~ m|\n@\* Returns:\s*(.+?)\n@\*|ms) { $returns[$n] = &process_comment_text($1); }
+ else {$returns[$n] = ""; }
+
+ if ($comment =~ m|\n@\* Throws:\s*(.+?)\n@\*|ms) { $throws[$n] = &process_comment_text($1); }
+ else {$throws[$n] = ""; }
+
+ # protect _ characters. $function contains original name, for use as
+ # hypertarget tag; $pfunction contains the protected function name, for output.
+ $pfunction[$n] = &latex_safe($function[$n]);
+ $returntype[$n] = &latex_safe($returntype[$n]);
+ $args[$n] = &latex_safe($args[$n]);
+
+ $n++;
+ }
+ $n;
+}
+
+
+# Function: process_comment_text
+#
+sub
+process_comment_text
+{
+ my ($text) = @_;
+ my (@s); # old text, as chars
+ my (@s2); # new text, as chars
+ my ($newtext);
+ my ($n);
+ my ($i);
+ my ($state); # 0 = text; 1 = math; 2 = code. Finite automaton.
+
+ @s = split(//,$text);
+ $n = $#s + 1;
+
+ $state = 0; # start in text state
+ for ($i = 0; $i < $n; $i++)
+ {
+ # State transitions in the text/math/code mode automaton
+ #
+ if ($state == 0 && $s[$i] eq '$') { $state = 1; push(@s2, '$'); } # enter math state
+ elsif ($state == 0 && $s[$i] eq '<') { $state = 2; push(@s2, split(//, "\\ccode{")); } # enter code state
+ elsif ($state == 1 && $s[$i] eq '$') { $state = 0; push(@s2, '$'); } # back to text state
+ elsif ($state == 2 && $s[$i] eq '>' && $s[$i-1] ne '-')
+ { $state = 0; push(@s2, '}'); } # back to text state on >, unless it was ->
+
+ # No state transition; deal with processing other characters according to state.
+ #
+ elsif ($state == 2 && $s[$i] eq '_') { push(@s2, '\\'); push(@s2, '_'); }
+ elsif ($state == 2 && $s[$i] eq '%') { push(@s2, '\\'); push(@s2, '%'); }
+ else { push(@s2, $s[$i]); }
+ }
+
+ $newtext = join('', at s2);
+}
+
+
+# Function: latex_safe
+#
+# Purpose: Given a <string>, substitute any unacceptable characters
+# for LaTeX, as follows:
+# _ becomes \_
+# % becomes \%
+# # becomes \#
+#
+sub
+latex_safe
+{
+ my ($string) = @_;
+
+ $string =~ s/_/\\_/g;
+ $string =~ s/%/\\%/g;
+ $string =~ s/#/\\#/g;
+ $string;
+}
+
+
+# Function: parse_api_subheads
+#
+# Purpose: Given <text> from a .c file, parse it
+# for structured API subheading documentation:
+#
+# /********************************************
+# *# 1. The <ESL_RANDOMNESS> object.
+# ********************************************/
+#
+# Keys off of the /***** line, followed by a line
+# starting with " *#" followed by a number and a period;
+# the rest of the line is taken to be the title.
+#
+# The title is processed, so <> and math mode are allowed.
+#
+# Returns n, the number of subheadings found;
+# and it populates two global arrays:
+# apisubheads<0..n-1> : one-line section subheadings
+# insection{$funcname} : which api subhead $funcname is under
+#
+sub
+parse_api_subheads
+{
+ my ($text) = @_;
+ my (@lines) = split(/^/, $text);
+
+ $n = 0;
+ $armed = 0;
+ foreach $line (@lines)
+ {
+ if ($armed && $line =~ /^ \*\#\s*\d+\.\s*(.+)$/)
+ {
+ $apisubheads[$n] = &process_comment_text($1);
+ $n++;
+ $armed = 0;
+
+ }
+
+ if ($line =~ /^\/\* Function:\s*(.+)\(\)/)
+ {
+ $insection{$1} = $n-1;
+ }
+
+ if ($line =~ /^\/\*{12}/) { $armed = 1; } # can expect a subhead line next,
+ else { $armed = 0; } # or not.
+ }
+ $n;
+}
diff --git a/devkit/c2optlist b/devkit/c2optlist
new file mode 100755
index 0000000..8770daf
--- /dev/null
+++ b/devkit/c2optlist
@@ -0,0 +1,58 @@
+#! /usr/bin/perl
+
+
+# c2optlist <main .c file>
+#
+# From one of our "standardized" main C files containing an
+# ESL_OPTIONS block, print a table listing each option.
+# Only the first block in the file is parsed, if multiple
+# ones exist.
+#
+# Crosscomparisons with man2optlist and sqc2optlist allow verification
+# that the options in a main .c file are documented in a .man page
+# and tested in a .sqc unit test file.
+#
+# Options are looked for following a line
+# static ESL_OPTIONS ...
+# until a bare
+# }
+# is found on a line by itself.
+#
+# SRE, Tue Sep 15 10:04:30 2009 [Janelia]
+# SVN $Id$
+#
+
+
+while (<>)
+{
+ if (/^static ESL_OPTIONS/) { $in_optionblock = 1; next; }
+
+ if ($in_optionblock)
+ {
+ if (/^\s*{\s*"(-\S)",\s*([^,]+),/) { $option = $1; $arg = $2; } # short option
+ elsif (/^\s*{\s*"(--\S+)",\s*([^,]+),/) { $option = $1; $arg = $2; } # long option
+ elsif (/^\s*$/) { next; } # blank line
+ elsif (/^\s*\/\*/) { next; } # comment line
+ elsif (/^#if/) { next; } # allow conditional compilation of options
+ elsif (/^#end/) { next; } # allow conditional compilation of options
+ elsif (/^\s*{\s*0,\s*0,\s*0,/) { last; } # empty vector: end of options
+ else { die "unrecognized option line:\n$_"; }
+
+ if ($arg eq "eslARG_NONE") { $optarg = "-"; }
+ elsif ($arg eq "eslARG_INT") { $optarg = "<n>"; }
+ elsif ($arg eq "eslARG_REAL") { $optarg = "<x>"; }
+ elsif ($arg eq "eslARG_CHAR") { $optarg = "<c>"; }
+ elsif ($arg eq "eslARG_STRING") { $optarg = "<s>"; }
+ elsif ($arg eq "eslARG_INFILE") { $optarg = "<f>"; }
+ elsif ($arg eq "eslARG_OUTFILE") { $optarg = "<f>"; }
+ else { die "unrecognized option argument $arg on line:\n$_"; }
+
+ printf ("%-20s %s\n", $option, $optarg);
+ }
+
+ if (/^};/) { die "Reached end of option structure without seeing empty 0,0,0,... vector"; }
+}
+
+
+
+
diff --git a/devkit/cexcerpt b/devkit/cexcerpt
new file mode 100644
index 0000000..b1da0c0
--- /dev/null
+++ b/devkit/cexcerpt
@@ -0,0 +1,100 @@
+#! /usr/bin/perl
+
+# cexcerpt <file.c> <dir>
+#
+# Extract tagged code chunks from a C source file for verbatim
+# inclusion in LaTeX documentation.
+#
+# Processes C source file <file.c>; extracts tagged excerpts,
+# and puts them in a file in directory <dir>.
+#
+# An excerpt is marked with special comments in the C file:
+#
+# /*::cexcerpt::my_example::begin::*/
+# while (esl_sq_Read(sqfp, sq) == eslOK)
+# { n++; }
+# /*::cexcerpt::my_example::end::*/
+#
+# The tag's format is "::cexcerpt::<tag>::begin::" (or end).
+# We match it with:
+# ^\s*\/\*::cexcerpt::(\S+)::begin::\*\/
+#
+# The tag is used to construct the file name, as <tag>.tex.
+# In the example, the tag my_example creates a file my_example.tex
+# in <dir>.
+#
+# All the text between the cexcerpt tags is put in the file.
+# In addition, this text is wrapped in a {cchunk} environment.
+# So in the example above, my_example.tex will contain:
+# \begin{cchunk}
+# while (esl_sq_Read(sqfp, sq) == eslOK)
+# { n++; }
+# \end{cchunk}
+#
+# This file can then be included in a LaTeX file, with
+# \input{<dir>/<tag>}
+#
+# For best results, the C source should be free of TAB characters.
+# "M-x untabify" on the region to clean them out.
+#
+# Cexcerpts can't overlap or nest in any way in the C file; only
+# one can be active at any given time.
+#
+# SRE, Fri Feb 25 08:40:19 2005
+# SVN $Id: cexcerpt 1531 2005-12-13 20:53:46Z eddy $
+
+
+$usage = "cexcerpt <file.c> <dir>";
+die("Wrong number of command line arguments.\nUsage: $usage\n") unless ($#ARGV+1 == 2);
+
+$cfile = shift;
+$dir = shift;
+die("C source file $cfile doesn't exist.\n") unless -e $cfile;
+die("C source file $cfile isn't readable.\n") unless -r $cfile;
+die("Directory $dir doesn't exist.\n") unless -e $dir;
+die("$dir isn't a directory.\n") unless -d $dir;
+die("Can't write files to directory $dir.\n") unless -w $dir;
+
+open(CFILE,$cfile) || die("Couldn't open C file $cfile.\n");
+$in_cexcerpt = 0;
+$linenumber = 1;
+while (<CFILE>)
+{
+ if (/^\s*\/\*::cexcerpt::(\S+)::begin::\*\//)
+ {
+ if ($in_cexcerpt) {
+ die("Can't start $1 at line $linenumber; $tag started at line $startline.\n");
+ }
+ if (($n = grep(/$1/, @taglist)) > 0) {
+ die("Already saw tag $1 in this C file ($n); tags must be unique.\n");
+ }
+
+ $tag = $1;
+ $in_cexcerpt = 1;
+ $startline = $linenumber;
+ $outfile = "$dir/$tag.tex";
+ push(@taglist, $tag);
+ print (" extracting $tag.tex...\n");
+ open(OUTFILE,">$outfile") || die("Couldn't open $outfile for writing.");
+ print OUTFILE "\\begin{cchunk}\n";
+ }
+ elsif (/^\s*\/\*::cexcerpt::(\S+)::end::\*\//)
+ {
+ if (!$in_cexcerpt) {
+ die("cexcerpt $1 can't end (line $linenumber) because it never started.\n");
+ }
+ if ($tag ne $1) {
+ die("tried to end $1 at line $linenumber, but $tag is active (from line $startline).\n");
+ }
+
+ $in_cexcerpt = 0;
+ print OUTFILE "\\end{cchunk}\n";
+ close(OUTFILE);
+ }
+ elsif ($in_cexcerpt)
+ {
+ print OUTFILE $_;
+ }
+ $linenumber++;
+}
+close(CFILE);
diff --git a/devkit/cexcerpt.man b/devkit/cexcerpt.man
new file mode 100644
index 0000000..d04a075
--- /dev/null
+++ b/devkit/cexcerpt.man
@@ -0,0 +1,73 @@
+.TH "cexcerpt" 1 "@SSDK_DATE@" "SSDK @SSDK_VERSION@" "SSDK"
+
+.SH NAME
+.TP
+cexcerpt - extract tagged code chunks for verbatim inclusion in documentation
+
+
+.SH SYNOPSIS
+.B cexcerpt
+.I file.c
+.I dir
+
+
+
+.SH DESCRIPTION
+
+.I cexcerpt
+processes a C source file
+.I file.c,
+extracts tagged excerpts,
+and puts these excerpts in a file in directory
+.I dir.
+
+.PP
+An excerpt is marked with special comments in the C file, as in
+this example:
+
+.nf
+/*::cexcerpt::my_example::begin::*/
+ while (esl_sq_Read(sqfp, sq) == eslOK)
+ { n++; }
+/*::cexcerpt::my_example::end::*/
+.fi
+
+.PP
+The tag's format is "::cexcerpt::<tag>::begin::" (or end).
+The tag is used to construct the file name, as
+.I <tag>.tex.
+In the example, the tag my_example creates a file
+.I my_example.tex
+in
+.I dir.
+
+.PP
+All the text between the cexcerpt tags is put in the file.
+In addition, this text is wrapped in a {cchunk} environment.
+So in the example above,
+.I my_example.tex
+will contain:
+
+.nf
+ \\begin{cchunk}
+ while (esl_sq_Read(sqfp, sq) == eslOK)
+ { n++; }
+ \\end{cchunk}
+.fi
+
+.PP
+This file can then be included in a LaTeX file, with
+\\input{<dir>/<tag>}.
+
+.PP
+For best results, the C source should be free of TAB characters.
+"M-x untabify" on the region to clean them out.
+
+.PP
+Cexcerpts can't overlap or nest in any way in the C file; only
+one can be active at any given time.
+
+.SH OPTIONS
+
+Currently none.
+
diff --git a/devkit/ctags-fix b/devkit/ctags-fix
new file mode 100755
index 0000000..22c041f
--- /dev/null
+++ b/devkit/ctags-fix
@@ -0,0 +1,25 @@
+#! /usr/bin/perl
+
+# To be used in an idiomatic pipe for listing all keywords in a codebase:
+#
+# find . -name \*.[ch] -exec ctags -x {} \; | ~/src/easel/trunk/devkit/ctags-fix | sort | tbl-pretty -f3 > 00INDEX
+#
+# ctags apparently prints a %15s %4d format
+# on keywords >15 long + linenumbers > 3 digits long, ctags merges the
+# first two fields, as in:
+# esl_msa_FormatDesc1221 ./easel/esl_msa.c esl_msa_FormatDesc(ESL_MSA *msa, const char *desc, ...)
+# We try to detect this as best as possible; the possible ambiguity
+# is when the keyword name itself ends in a digit. To dismbiguate, we
+# assume no files have >=10000 lines.
+#
+# we also assume ctags has been called in a pipe from 'find',
+# so all filenames start with './', as in:
+# find . -name \*.[ch] -exec ctags -x {} \; | ctags-fix > foo
+# This allows us to unambiguously find the true third column.
+
+
+while (<>)
+{
+ if (/^(\S{16,})(\d{4})\s+(\.\/.+)$/) { printf("%s %d %s\n", $1, $2, $3); }
+ else { print; }
+}
diff --git a/devkit/esl-dependencies b/devkit/esl-dependencies
new file mode 100755
index 0000000..a4dc126
--- /dev/null
+++ b/devkit/esl-dependencies
@@ -0,0 +1,155 @@
+#! /usr/bin/perl
+
+# esl-dependencies :: determines module dependencies in Easel source code
+#
+# Usage: esl-dependencies [options] <Easel .c file> [<additional Easel .c file>...]
+#
+# Options:
+# -1 : show one-line summary of module # required, # required in testdriver, # augmentable
+# -r : list of required modules (used in Makefile to construct test driver compilation lines)
+# -a : list of augmentation modules (used in Makefile to construct test driver compilation lines)
+# -f : list of augmentation flags (used in Makefile to construct test driver compilation lines)
+#
+# SRE, Mon Jun 11 11:15:31 2007
+# SVN $Id$
+
+require "getopts.pl"
+&Getopts('1afr');
+
+if ($opt_1) { $show_summary_table = 1; }
+if ($opt_a) { $list_augfiles = 1; }
+if ($opt_f) { $list_augflags = 1; }
+if ($opt_r) { $list_reqfiles = 1; }
+
+while ($cfile = shift) {
+ $past_start = 0;
+ $in_testdriver = 0;
+ %included_module = ();
+ %with_module = ();
+ %driver_module = ();
+ %required_module = ();
+ %augmented_module = ();
+ %driver_required_module = ();
+ $nrequired = 0;
+ $ndriver_required = 0;
+ $naugmented = 0;
+
+ if ($cfile =~ /esl_(\S+)\.c/) { $thismodule = $1; }
+ elsif ($cfile =~ /(easel)\.c/) { $thismodule = $1; }
+ else { die "Can't open $cfile\n"; }
+
+# Set $included_module{} hash to 1 for every module that this .c file
+# includes (both required and augmented), except easel itself.
+#
+ open(INCLUDES, $cfile) || die;
+ while (<INCLUDES>) {
+ if (!$past_start && /^\#include [<"]esl_(\S+).h[>"]/) {
+ $module = $1;
+ if ($module eq $thismodule) { next; }
+ if ($module eq "config") { next; }
+ if ($module eq "mpi") { $with_module{"mpi"} = 1; next; } # special case of HAVE_MPI instead of AUGMENT_
+ $included_module{$module} = 1;
+ }
+
+ if (/^\{/) { $past_start = 1; } # Stop looking at headers when we see the first function start.
+
+ if (/^\#ifdef (esl.+_TESTDRIVE)/) { $in_testdriver = 1; $flag = $1; }
+ if ($in_testdriver && /^\#endif \/\*\s*$flag/) { $in_testdriver = 0; }
+
+ if ($in_testdriver && /^\#include [<"]esl_(\S+).h[>"]/) {
+ $module = $1;
+ if ($module eq $thismodule) { next; }
+ $driver_module{$module} = 1;
+ }
+ }
+ close INCLUDES;
+
+# Set $augmented_module{} hash to 1 for every module that this .c file
+# might be augmented with.
+#
+ open(AUGMENTS, "cat $cfile | grep \'^#ifdef\' |") || die;
+ while (<AUGMENTS>) {
+ if (/^\#ifdef eslAUGMENT_(\S+)/) {
+ $module = $1;
+ $module =~ tr/[A-Z]/[a-z]/;
+ $augmented_module{$module} = 1;
+ }
+ }
+ close AUGMENTS;
+
+# Set $required_module{} hash to 1 for every module that this .c file
+# requires, except easel itself.
+#
+ foreach $m (keys(%included_module)) {
+ if (! $augmented_module{$m}) {
+ $required_module{$m} = 1;
+ $nrequired ++;
+ }
+ }
+
+# Set $driver_required_module{} hash to 1 for every module that the .c
+# file includes inside a TESTDRIVE ifdef, but is not an augmentation
+# or a module requirement.
+ foreach $m (keys(%driver_module)) {
+ if (! $augmented_module{$m} && ! $with_module{$m} && ! $required_module{$m}) {
+ $driver_required_module{$m} = 1;
+ $ndriver_required++;
+ }
+ }
+
+# Count the different augmentations
+#
+ foreach $m (keys(%augmented_module)) {
+ $naugmented++;
+ }
+
+
+ if ($show_summary_table)
+ {
+ $req = join(',', sort(keys(%required_module)));
+ $dreq = join(',', sort(keys(%driver_required_module)));
+ $augreq = join(',', sort(keys(%augmented_module)));
+
+ printf("%-12s %3d %3d %3d %-20s %-20s %-20s\n",
+ $thismodule, $nrequired, $ndriver_required, $naugmented,
+ $req, $dreq, $augreq);
+ }
+ elsif ($list_reqfiles)
+ {
+ foreach $m (keys(%required_module)) { print "esl_$m.c "; }
+ foreach $m (keys(%driver_required_module)) { print "esl_$m.c "; }
+ print "\n";
+ }
+ elsif ($list_augfiles)
+ {
+ foreach $m (keys(%augmented_module)) { print "esl_$m.c "; }
+ print "\n";
+ }
+ elsif ($list_augflags)
+ {
+ foreach $m (keys(%augmented_module)) { $m =~ tr/[a-z]/[A-Z]/; print "-DeslAUGMENT_$m "; }
+ print "\n";
+ }
+ else
+ {
+
+ print "Module requires:\n";
+ foreach $m (keys(%required_module)) {
+ print $m, "\n";
+ }
+
+ print "Driver requires:\n";
+ foreach $m (keys(%driver_required_module)) {
+ print $m, "\n";
+ }
+
+ print "Augmentable with:\n";
+ foreach $m (keys(%augmented_module)) {
+ print $m, "\n";
+ }
+ foreach $m (keys(%with_module)) {
+ print $m, "\n";
+ }
+ }
+}
+
diff --git a/devkit/man2optlist b/devkit/man2optlist
new file mode 100755
index 0000000..82084cd
--- /dev/null
+++ b/devkit/man2optlist
@@ -0,0 +1,41 @@
+#! /usr/bin/perl
+
+
+# man2optlist <.man file>
+#
+# From one of our "standardized" .man pages, generate a table
+# that lists each documented option.
+#
+# Crosscomparisons with c2optlist and sqc2optlist allow verification
+# that the options in a main .c file are documented in a .man page
+# and tested in a .sqc unit test file.
+#
+# Options are looked for as a two-line sequence:
+# .TP
+# .B <-option>
+# or
+# .TP
+# .BI <-option> " <optarg>"
+
+
+while (<>)
+{
+ if (/^\.TP/) { $nextline_is_option = 1; next; }
+
+ if ($nextline_is_option)
+ {
+ if (/^\.B\s+(-\S)\s*$/) { $option = $1; $optarg = "-"; }
+ elsif (/^\.B\s+(--\S+)\s*$/) { $option = $1; $optarg = "-"; }
+ elsif (/^\.BI\s+(-\S)\s+" (<[nxfcs]>)"\s*$/) { $option = $1; $optarg = $2; }
+ elsif (/^\.BI\s+(--\S+)\s+" (<[nxfcs]>)"\s*$/) { $option = $1; $optarg = $2; }
+ else { die "unrecognized option line:\n$_"; }
+
+ printf ("%-20s %s\n", $option, $optarg);
+ }
+
+ $nextline_is_option = 0;
+}
+
+
+
+
diff --git a/devkit/rmanprocess.pl b/devkit/rmanprocess.pl
new file mode 100644
index 0000000..bde3a77
--- /dev/null
+++ b/devkit/rmanprocess.pl
@@ -0,0 +1,77 @@
+#! /usr/bin/perl
+
+# rmanprocess.pl <rman LaTeX2e output>
+#
+# Example:
+# rman -f LaTeX2e foo.man | rmanprocess.pl > foo.tex
+#
+# Converts a man page to a HMMER User's Guide section.
+# Written to operate with PolyglotMan v3.0.5, by Thomas Phelps
+# Obtain from ftp.cs.berkeley.edu:/ucb/people/phelps/tcltk/rman.tar.Z
+#
+# - removes document declarations
+# - removes See Also and Author sections, if present
+# - converts sections to subsections
+# - adds a subsection declaration for program name
+#
+#
+# SRE, Mon May 25 11:06:58 1998
+# SVN $Id: rmanprocess.pl 1531 2005-12-13 20:53:46Z eddy $
+
+while (<>)
+{
+ if (/--/) { s/--/{-}{-}/g; }
+
+ if (/^\\documentclass/) {
+ print "\\setlength{\\sresavei}{\\parindent}\n";
+ print "\\setlength{\\sresaves}{\\parskip}\n";
+ next;
+ }
+ if (/^\\begin\{document\}/) { next; }
+
+ if (/^\s*\\section\{See/ || /^\\end\{document\}/) {
+ print "\\setlength{\\parindent}{\\sresavei}\n";
+ print "\\setlength{\\parskip}{\\sresaves}\n";
+ print "\\newpage";
+ last;
+ }
+
+ if (/\\begin\{itemize\}/ || /\\end\{itemize\}/) {
+ s/itemize/wideitem/;
+ print;
+ next;
+ }
+
+ if (/^\\section\{Name/) {
+ while (<>) { # get one-line "foo - a program to do bar"
+ if (/^(\S+)\s+-\s+(.+)$/) { print "\\subsection{\\texttt{$1} - $2}\n"; }
+ elsif (/^\\section/) { last; }
+ }
+ }
+
+# while ($line = <>) {
+# if ($line =~ /\\begin\{itemize\}/) { last; }
+# }
+# while ($line = <>) { # get item
+#
+#
+# last;
+# } elsif ($line =~ /^\\item\s*\[(\S+)\s*-\s*(.+)/) {
+# print "\\subsection{\\texttt{$1} - $2}\n";
+# last;
+# }
+# }
+# while (<>) {
+# if (/\\end\{itemize\}/) { last; }
+# }
+# next;
+
+ if (/^\\section/) {
+ s/section/subsubsection/;
+ print;
+ next;
+ }
+
+ print;
+
+}
diff --git a/devkit/sedition b/devkit/sedition
new file mode 100755
index 0000000..4037075
--- /dev/null
+++ b/devkit/sedition
@@ -0,0 +1,67 @@
+#! /usr/bin/perl
+
+# sedition <keyword> <replacement> [<key2> <replace2>]... <file>
+#
+# A wrapper for "sed", allowing editing a file in place
+# instead of in a stream.
+#
+# Replace all instances of @keyword@ with <replacement>,
+# @key2@ with <replace2>, etc.
+#
+# Note that all keywords to be replaced are enclosed by @@ in
+# the text where they are to be replaced, but the @@ delimiters
+# are not in the sedition command line. This allows you to run
+# sedition on scripts and Makefiles that themselves contain sedition
+# command lines, without inadvertently clobbering those command lines.
+#
+# Replacement strings should generally be one-liners.
+# See sedition-pp for a paragraph-wise replacement script.
+#
+# Note the restricted command line use: sedition, unlike
+# sed, must be run on a single specified file.
+#
+# Example:
+# sedition FOO "foo replacement" BAR "bar replacement" myfile
+# converts all instances of
+# @FOO@
+# to
+# foo replacement
+#
+# Moved to ssdk, SRE, Mon Mar 31 19:24:19 2003
+# SVN $Id: sedition 1531 2005-12-13 20:53:46Z eddy $
+
+sub choke {
+ my ($mesg) = @_;
+
+ if (-e "$filename.sed.tmp") { system "mv $filename.sed.tmp $filename"; }
+ die ($mesg, ", stopped");
+}
+
+
+$filename = pop;
+if (! -e $filename) { die "$filename doesn't exist"; }
+if ( -e "$filename.sed.tmp") { die "already have a tmp file $filename.sed.tmp"; }
+
+$sedargs = "";
+while (@ARGV) {
+ $key = shift;
+ $replace = shift;
+ $sedargs .= " -e 's!\@$key\@!$replace!g'";
+}
+
+if (-w $filename) { $writable = 1; }
+
+system("cp $filename $filename.sed.tmp");
+if ($? != 0) {die "failed to make tmp copy"; }
+if (! $writable) {
+ system("chmod +w $filename");
+ if ($? != 0) { choke "failed to make $filename temporarily writable"; }
+}
+system("sed $sedargs $filename.sed.tmp > $filename");
+if ($? != 0) {choke "sed failed"; }
+if (! $writable) {
+ system("chmod -w $filename");
+ if ($? != 0) { choke "failed to make $filename temporarily writable"; }
+}
+unlink "$filename.sed.tmp";
+
diff --git a/devkit/sedition-pp b/devkit/sedition-pp
new file mode 100755
index 0000000..8d2b3f6
--- /dev/null
+++ b/devkit/sedition-pp
@@ -0,0 +1,89 @@
+#! /usr/bin/perl
+
+# sedition-pp <keyword> <ppfile> <source file>
+#
+# Replaces occurrences of @<keyword>@ in the source file
+# with the text found in <ppfile>. <ppfile> may contain
+# multiple lines of text. In the <source file>, the @<keyword>@
+# must be on a line of its own - it may have leading and
+# trailing comment delimiters, but that's all. That's because these
+# delimiters will be replicated in the multiline substitution;
+# see below.
+#
+# Note that the <keyword> is surrounded by @@ in the text
+# where it's to be replaced. These delimiters do not appear in the command
+# line; this allows you to run sedition-pp on scripts and Makefiles
+# that themselves contain sedition-pp command lines, without clobbering
+# those commands.
+#
+# sedition-pp preserves and replicates leading and trailing context,
+# permitting language-independent substitution within comments.
+# For example,
+# sedition-pp FOO foofile foo.c
+# finds in foo.c (C code) a line like
+# * @FOO@
+# and replaces it with the text of "foofile", which might
+# result in:
+# * An example license for foo.
+# * Copyright (C) ...
+#
+# Whereas a (shell or Perl script) line like
+# # @FOO@
+# would become
+# # An example license for foo.
+# # Copyright (C) ...
+#
+# And an HTML section like
+# <!--
+# -- @FOO@
+# -->
+# is replaced with
+# <!--
+# -- An example license for foo.
+# -- Copyright (C) ...
+# -->
+#
+# modified from licenseadd.pl in ssdk; SRE, Mon Mar 31 19:39:50 2003
+# SVN $Id: sedition-pp 1531 2005-12-13 20:53:46Z eddy $
+#
+
+$keyword = shift;
+$ppfile = shift;
+$sourcefile = shift;
+
+if (! -e $sourcefile) { die "no such file $sourcefile"; }
+($dev,$ino,$mode) = stat($sourcefile);
+
+open(PP,$ppfile) || die;
+$nlines = 0;
+while (<PP>)
+{
+ chomp;
+ $ppline[$nlines] = $_;
+ $nlines++;
+}
+close(PP);
+
+open(TMPFILE,">/tmp/tmp.pp.sedition") || die "Fatal: can't open /tmp/tmp.pp.sedition : $!\n";
+open(SOURCE,$sourcefile) || die;
+while (<SOURCE>)
+{
+ if (/^(.*)\@$keyword\@(.*)$/)
+ {
+ $start = $1;
+ $end = $2;
+ foreach $line (@ppline)
+ {
+ print TMPFILE "$start$line$end\n";
+ }
+ } else { print TMPFILE $_;}
+}
+close SOURCE;
+close TMPFILE;
+
+# Replace the original file with the new one, and restore the original
+# file's mode.
+#
+unlink $sourcefile;
+system("mv /tmp/tmp.pp.sedition $sourcefile");
+chmod $mode, $sourcefile;
diff --git a/devkit/sqc b/devkit/sqc
new file mode 100755
index 0000000..5a1980d
--- /dev/null
+++ b/devkit/sqc
@@ -0,0 +1,701 @@
+#! /usr/bin/perl
+
+# sqc ::
+# quality control script for exercising code, regression testing,
+# and benchmarking.
+#
+# Usage: sqc [options] <level> <command file> <top_builddir> <top_srcdir> \
+# [<old_top_builddir> <old_top_srcdir>]
+#
+# level - an integer >= 0. Higher = more testing, more time.
+# command file - an sqc command file. See below for format.
+# top_builddir - top of the build directory - where executables will
+# be searched for. In .sqc command files, any path
+# @foo@ is looked for in ${top_builddir}/foo.
+# top_srcdir - top of the src directory - where scripts and datafiles
+# will be searched for. In .sqc command files, any
+# path !foo! is looked for in ${top_srcdir}/foo.
+# [The other two arguments are optional, and are only used if the
+# command file contains regression tests:]
+# old_top_builddir - top of the build tree for an old version of
+# the same software distribution, for regression tests
+# old_top_srcdir - top of the src tree for an old version for regression.
+#
+#
+# Available options:
+# -v - print verbose output, including each command
+# after various substitutions.
+#
+# -x <n> - only run test number <n>, where <n> starts from 1.
+# Useful when debugging individual failed tests - saves
+# having to rerun the whole testsuite.
+#
+# -V - Run 'valgrind' test types. Caller asserts that valgrind
+# is installed on this system. This option may also be
+# set by setting environment variable SQC_VALGRIND nonzero.
+#
+# -M - Run 'mpi' test types. Caller asserts that mpiexec is
+# installed on this system. This option may also be set
+# by setting env variable SQC_MPI nonzero.
+# Examples:
+# % sqc 2 exercises.sqc .. ..
+#
+# (Allowing -M, -V to also be set in the environment simplifies life when
+# we're calling sqc via a 'make check', where we don't really have control
+# over the cmdline options, but we can control our system environment.)
+#
+# For each (non-prep) test in the command file, a one-line summary
+# of the result is printed. The format of this line is:
+# <testtype> <test #> [<test name>]... <status>
+# where <testtype> is exercise, valgrind, mpi, regression, benchmark, or
+# fail; <test #> is a counter, separate for each type; <test name> is
+# the one-word name for this test; and <status> is the result of the
+# test. The format for <status> is described later.
+#
+# Format of sqc file:
+# Blank lines are ignored. Lines beginning with # are comments and
+# are ignored. All other lines have format:
+# <level> <type> <name> <command>
+#
+# level: an integer >= 0. If the sqc level is less than this test's
+# level, the command is skipped. This allows quick, less
+# extensive tests and long, extensive tests to be configured
+# in one command file.
+#
+# type: One of the following keywords:
+# prep, exercise, valgrind, mpi, regression, benchmark, fail
+# See below for description of each.
+#
+# name: One word, <=20 characters, naming this test.
+# Makes it easier to track down a failed test.
+# sqc does not verify that names are unique, but it's
+# a good idea.
+#
+# command: Command template to run. (remainder of line, usually
+# more than one token/word).
+#
+# A command template is subjected to three types of
+# filename substitution (@@ = executables in the build tree;
+# !! = scripts and data in the source tree; %% = temp files
+# managed by sqc).
+#
+# No token may contain the string REGRESSION; this is
+# reserved for regression tests (see below).
+#
+# valgrind prefixing, regression filename substitution,
+# path substitution, and output redirection:
+#
+# @@ path substitution for binaries (in build tree):
+# Tokens enclosed in @@ in the template are interpreted
+# as executables to be found in the build tree. The token is
+# prefixed by ${top_builddir}.
+#
+# With no token at all (@@), the ${top_builddir} is
+# substituted; this special case is used to pass the
+# ${top_builddir} as an argument into integrated test
+# scripts that sqc is running. This leads to an
+# idiomatic incantation for integrated tests:
+# !testsuite/ixx-test.pl! @@ !! %TMPPFX%
+# by which the builddir, srcdir, and a tempfile prefix are
+# passed along to a script, which is responsible for
+# printing "ok" and returning 0 on success, and die()'ing
+# on any failure.
+#
+# !! path substitution for scripts and data (in src tree):
+# Tokens enclosed in !! in a command template are
+# interpreted as scripts or datafiles to be found in the
+# source tree. The token is prefixed by ${top_srcdir}.
+#
+# As above, with no token at all (!!), the ${top_srcdir} is
+# substituted.
+
+# %% tempfile substitution for output generated during sqc:
+# Tokens enclosed in %% are interpreted as a tempfile to
+# be created during the sqc run. sqc is responsible for
+# deleting the temp file. Each token in an sqc command
+# file maps uniquely to the same file name throughout an
+# sqc process, so the same token may be used in more than
+# one command; for example, a "prep" command can create a
+# file that subsequent "exercise" commands need as input).
+#
+# It is a common idiom to pass a tempfile name into a test
+# script, where the script then uses the name as a unique
+# prefix to create a number of temp files with different
+# suffixes, a la %TMPFILE%.1, %TMPFILE%.2, etc. Such a
+# script cleans up the suffixed temp files it creates; sqc
+# cleans up the original %TMPFILE%.
+#
+# output redirection:
+# ">/dev/null 2> <TMPFILE>" is appended to the command
+# template, to redirect all output away, and save
+# STDERR diagnostics to a <TMPFILE> (for instance, valgrind
+# report goes to this file).
+# If the command template already includes a ">", only
+# the STDERR redirection is done; it is assumed that the command
+# is deliberately keeping its output (probably in its own tmpfile).
+# If redirection is done explicitly in the command template,
+# the template is responsible for stdout. sqc always handles
+# stderr itself.
+#
+# regression filename substitution: ["regression" test types only]
+# In a "regression" test, the same command is run twice;
+# once under a "new" build and once under an "old" build
+# of the same software distribution. Any tempfile tokens in
+# the command template that start with REGRESSION (such as
+# %REGRESSION.OUT1%) are considered to be outputs that
+# should be absolutely identical between the old and new
+# software versions. These are compared by "diff", and
+# the regression test fails if the diff isn't clean.
+#
+#
+# Types of tests:
+#
+# prep: Creates tmp files that other tests will need.
+# If a prep command fails for any reason with nonzero
+# exit status, sqc dies at that point.
+# prep commands create no output lines in the sqc report.
+#
+# exercise: Run a command that is expected to succeed with zero
+# exit status.
+# Return status is tested; if nonzero, a failure is
+# recorded. Crashes versus clean failures are reported
+# differently in the output message.
+# The format for the status in the output line is:
+# ok.
+# FAILED [command failed]
+# FAILED [crash!]
+#
+# fail: Run a command that is expected to exit cleanly with
+# *nonzero* exit status (for example, testing that a program
+# successfully detects bad input, rather than crashing).
+# Possible results for output line status are:
+# ok.
+# FAILED to fail
+# FAILED [crash!]
+#
+# valgrind: Check for memory problems and leaks.
+# Like exercise, but the command is run with "valgrind
+# --error-exitcode=99" prepended, so valgrind runs the
+# command.
+#
+# Return status is tested; 99 indicates an error detected
+# by valgrind, other nonzero codes indicate a failure code
+# reported by the application. The stderr that sqc
+# captured is examined for valgrind leak reports. The
+# format for the status in the output line is:
+# ok.
+# FAILED [valgrind reports error(s)]
+# FAILED [valgrind reports leak(s)]
+# FAILED [command failed]
+# FAILED [crash!]
+#
+# Valgrind tests are only run if -V cmdline option is used,
+# or if SQC_VALGRIND environment variable is set nonzero.
+#
+# mpi: An MPI-specific exercise.
+#
+# The command includes 'mpiexec'; for example,
+# "mpiexec -n 2 ./my_mpi_unit_test"
+#
+# MPI exercises are only run if the -M cmdline option is used,
+# or if SQC_MPI environment variable is set nonzero.
+#
+# Output line format is the same as for an exercise.
+#
+# regression: The same command template is processed and run twice;
+# once under a "new" build (<top_builddir> and <top_srcdir>)
+# and once under an "old" build of the same software
+# distribution (<old_top_builddir> and <old_top_srcdir>).
+#
+# Any tempfile tokens in the command template that start
+# with REGRESSION (such as %REGRESSION.OUT1%) are
+# considered to be outputs that should be absolutely
+# identical between the old and new software
+# versions. These are compared by "diff", and the
+# regression test fails if the diff isn't clean.
+#
+# Possible outputs:
+# ok.
+# FAILED [regressions differ]
+# FAILED [new command failed]
+# FAILED [old command failed]
+# FAILED [new crashed!]
+# FAILED [old crashed!]
+#
+# benchmark: Runs a command and measures how long it takes.
+# The output status field is the user CPU time in seconds.
+# Like a prep command, if a benchmark command fails, sqc
+# dies immediately at that point.
+#
+#
+################################################################
+# SRE, Tue Aug 6 11:16:39 2002
+# SVN $Id: sqc 1796 2007-01-03 22:36:44Z eddys $
+
+use Getopt::Std;
+
+# Parse our command line options
+#
+getopts('vx:VM');
+if ($opt_v) { $verbose = 1; }
+if ($opt_x) { $only_do_test_num = $opt_x; }
+if ($opt_V) { $do_valgrind = 1; }
+if ($opt_M) { $do_mpi = 1; }
+
+# Parse our environment
+#
+if ($ENV{"SQC_VALGRIND"} != 0) { $do_valgrind = 1; }
+if ($ENV{"SQC_MPI"} != 0) { $do_mpi = 1; }
+
+# Trust but verify
+#
+if ($do_valgrind)
+{
+ $output = `valgrind --version 2>&1`;
+ if ($?) { die "couldn't run valgrind. Don't set -V cmdline option, don't set SQC_VALGRIND env variable."; }
+}
+if ($do_mpi)
+{
+ $output = `mpiexec -V 2>&1`;
+ if ($?) { die "couldn't run mpiexec. Don't set -M cmdline option, don't set SQC_MPI env variable."; }
+}
+
+# Parse command line arguments
+#
+if ($#ARGV == 3)
+{
+ $setlevel = shift;
+ $commandfile = shift;
+ $top_builddir = shift;
+ $top_srcdir = shift;
+ undef($old_builddir);
+ undef($old_srcdir);
+}
+elsif ($#ARGV == 5)
+{
+ $setlevel = shift;
+ $commandfile = shift;
+ $top_builddir = shift;
+ $top_srcdir = shift;
+ $old_builddir = shift;
+ $old_srcdir = shift;
+}
+else
+{ die "Usage: sqc [options] <level> <commandfile> <top_builddir> <top_srcdir> [<old_top_builddir> <old_top_srcdir>]\n"; }
+
+$tmp = &tempname;
+$| = 1;
+
+print "sqc: running $commandfile.\n" if $verbose;
+
+open(COMMANDS, $commandfile) || die;
+$nbench = $ntest = $badtest = 0;
+$tot_benchtime_cpu = $tot_benchtime_wall = 0.;
+$linenum = 0;
+
+COMMAND:
+while (<COMMANDS>) {
+ $linenum++;
+ if (/^\#/) { next; }
+ if (/^\s*$/) { next; }
+
+ chomp;
+ ($testlevel, $testtype, $testname, $cmdtemplate) = split(' ', $_, 4);
+
+ # Skip test is it's harder than our set level.
+ if ($setlevel < $testlevel) { next COMMAND; }
+
+ # Make sure it's a valid test type;
+ # print the first part of the output line.
+ #
+ if ($testtype eq "exercise" ||
+ $testtype eq "valgrind" ||
+ $testtype eq "mpi" ||
+ $testtype eq "regression" ||
+ $testtype eq "fail" ||
+ $testtype eq "benchmark")
+ {
+ # In verbose mode, if any test calls for valgrind but we're not set up to run
+ # valgrind, issue one warning. Ditto for mpi tests. It's easy to forget
+ # the need for -V/SQC_VALGRIND, or -M/SQC_MPI.
+ if ($verbose && $testtype eq "valgrind" && ! do_valgrind && $valgrind_ntests == 0)
+ { print ("[WARNING: valgrind commands not running: use -V or export SQC_VALGRIND=1 to enable valgrind tests]"); }
+ if ($verbose && $testtype eq "mpi" && ! do_mpi && $mpi_ntests == 0)
+ { print ("[WARNING: mpi tests present but not run: use -M or export SQC_MPI=1 to enable mpi tests]"); }
+
+ if ($testtype eq "valgrind") { $valgrind_ntests++; if (! $do_valgrind) { next COMMAND; } }
+ if ($testtype eq "mpi") { $mpi_ntests++; if (! $do_mpi) { next COMMAND; } }
+
+
+
+ $ntest++;
+ if ($only_do_test_num && $only_do_test_num != $ntest) { next COMMAND; }
+ printf(" %10s %4d [%21s] ... ", $testtype, $ntest, $testname);
+ }
+ elsif ($testtype ne "prep")
+ {
+ die "No such test type $testtype at line $linenum of command file\n";
+ }
+
+ print "sqc: evaluating line: $_\n" if $verbose;
+
+ # Filename substitution.
+ $cmd = $cmdtemplate;
+
+ ($status, $cmd) = &build_substitution($tmp, $cmd, $top_builddir);
+ next COMMAND if &check_status($status, $testname, $testtype, "FAILED [@@ substitution]");
+
+ ($status, $cmd) = &src_substitution($tmp, $cmd, $top_srcdir);
+ next COMMAND if &check_status($status, $testname, $testtype, "FAILED [!! substitution]");
+
+ $cmd = &tempfile_substitution($tmp, $cmd);
+
+ print "sqc: after filename subst, cmd is: $cmd\n" if $verbose;
+
+ # Valgrind prefixing.
+ $cmd = "valgrind --error-exitcode=99 $cmd" if ($testtype eq "valgrind");
+
+ # Regression substitutions, $cmd splits into $cmd (new) and $cmd2 (old)
+ if ($testtype eq "regression") {
+ $cmd2 = $cmdtemplate;
+
+ die ("FAILED;\nno <old_builddir> argument on command line; can't run regression tests\n") if (! defined($old_builddir));
+ die ("FAILED;\nno <old_srcdir> argument on command line; can't run regression tests\n") if (! defined($old_srcdir));
+
+ ($status, $cmd2) = &build_substitution($tmp, $cmd2, $old_builddir);
+ next COMMAND if &check_status($status, $testname, $testtype, "FAILED [@@ substitution]");
+
+ ($status, $cmd2) = &src_substitution($tmp, $cmd2, $old_srcdir);
+ next COMMAND if &check_status($status, $testname, $testtype, "FAILED [!! substitution]");
+
+ $cmd2 = &tempfile_substitution($tmp, $cmd2);
+
+ ($nregressions, $cmd, $cmd2) = ®ression_substitution($tmp, $cmd, $cmd2);
+
+ print "sqc: after filename subst, regressed new cmd is: $cmd\n" if $verbose;
+ print "sqc: after filename subst, regressed old cmd is: $cmd2\n" if $verbose;
+ }
+
+ # Output redirection substitution.
+ # stdout is sent to /dev/null unless command already is handling it.
+ # stderr is saved in a tmp file.
+ # (stderr from the old cmd2 of a regression test is sent to /dev/null)
+ #
+ if ($cmd !~ />/) {
+ $cmd = "$cmd > /dev/null";
+ $cmd2 = "$cmd2 > /dev/null" if ($testtype eq "regression");
+ }
+ $cmd = "$cmd 2> $tmp.stderr";
+ $cmd2 = "$cmd2 2> /dev/null" if ($testtype eq "regression");
+ print "sqc: after output subst, cmd is: $cmd\n" if $verbose;
+
+ # Run the commands;
+ # collect exit status in status1;
+ # additionally, for regression test, old executable's status is in status2.
+ #
+ # If our command fails "cleanly" it has an exit code of 1 by Easel convention.
+ # Because of the way Perl handles status codes, this becomes 1<<8 = 256.
+ # All other nonzero codes are called "crashes" because they probably are.
+ #
+ # The `(true; $cmd)` stuff is because a segfault gets reported by shell,
+ # not the process itself; we want to redirect that output too.
+ $startwall = time;
+ $startcpu = (times)[2];
+ print "sqc: running cmd: $cmd\n" if $verbose;
+ `(true; $cmd) 2> /dev/null > /dev/null`;
+ $status1 = $?;
+ print "sqc: return status $status1\n" if $verbose;
+ if ($testtype eq "regression") {
+ `(true; $cmd2) 2> /dev/null > /dev/null`;
+ $status2 = $?;
+ }
+ $stopwall = time;
+ $stopcpu = (times)[2];
+
+ # Deal with exit status and output.
+ if ($testtype eq "prep")
+ {
+ if ($status1 != 0) { die "prep command [$testname] at line $linenum failed with status $status1\n"; }
+ }
+
+ elsif ($testtype eq "exercise" || $testtype eq "mpi")
+ {
+ if (($status1>>8) == 1) { print "FAILED [command failed]\n"; $badtest++; }
+ elsif ( $status1 != 0) { print "FAILED [crash!]\n"; $badtest++; }
+ else { print "ok.\n"; }
+ }
+
+ elsif ($testtype eq "valgrind")
+ {
+ ($has_valgrind, $has_leak) = &check_valgrind_status("$tmp.stderr");
+ if ($has_valgrind == 0) { print "FAILED [no valgrind output?]\n"; $badtest++; }
+ elsif (($status1>>8) == 99) { print "FAILED [valgrind reports error(s)]\n"; $badtest++; }
+ elsif (($status1>>8) == 1) { print "FAILED [command failed]\n"; $badtest++; }
+ elsif ( $status1 != 0) { print "FAILED [crash!]\n"; $badtest++; }
+ elsif ($has_leak) { print "FAILED [valgrind reports leak(s)]\n"; $badtest++; }
+ else { print "ok.\n"; }
+ # Important to check for leaks last above. On app failure, we're allowed to return a nonzero
+ # exit code without scrupulously free'ing everything.
+ }
+
+
+ elsif ($testtype eq "regression")
+ {
+ if (($status1>>8) == 1) { print "FAILED [new command failed]\n"; $badtest++; }
+ elsif (($status2>>8) == 1) { print "FAILED [old command failed]\n"; $badtest++; }
+ elsif ( $status1 != 0) { print "FAILED [new crashed!]\n"; $badtest++; }
+ elsif ( $status2 != 0) { print "FAILED [old crashed!]\n"; $badtest++; }
+ else
+ {
+ $nregress_failed = 0;
+ for ($i = 0; $i < $nregressions; $i++)
+ {
+ system("diff $tmp.REGRESSION.old.$i $tmp.REGRESSION.new.$i > /dev/null");
+ if ($? != 0) { $nregress_failed++; }
+ }
+ if ($nregress_failed > 0) { print "FAILED [regressions differ]\n"; $badtest++; }
+ else { print "ok.\n"; }
+ }
+ }
+
+ elsif ($testtype eq "benchmark")
+ {
+ if ($status1 != 0) {
+ die "benchmark at line $linenum failed with status $status1\n";
+ }
+ $cpu_elapsed = $stopcpu - $startcpu;
+ $wall_elapsed = $stopwall - $startwall;
+ printf "%6.1f cpu %4d wall\n", $cpu_elapsed, $wall_elapsed;
+ $tot_benchtime_cpu += $cpu_elapsed;
+ $tot_benchtime_wall += $wall_elapsed;
+ $nbench++;
+ }
+
+ elsif ($testtype eq "fail")
+ {
+ if (($status1>>8) == 0) { print "FAILED [0 status]\n"; $badtest++; }
+ elsif (($status1>>8) != 1) { print "FAILED [crash!]\n"; $badtest++; }
+ else { print "ok.\n"; }
+ }
+
+ last if ($only_do_test_num && $ntest == $only_do_test_num );
+
+}
+
+# Summarize output.
+if ($badtest > 0) { print "\n$badtest of $ntest exercises at level <= $setlevel FAILED.\n"; }
+else { print "\nAll $ntest exercises at level <= $setlevel passed.\n"; }
+
+if ($nbench > 0) {
+ printf "\nTotal of %d benchmarks: %.1f cpu %d wall\n",
+ $nbench, $tot_benchtime_cpu, $tot_benchtime_wall;
+}
+
+
+# Print info on system, date, etc.
+#
+print "\n\nSystem information:\n";
+print `date`;
+print `uname -a`;
+
+
+# Clean up.
+#
+foreach $tmpfile (keys(%used_tmpfile)) {
+ unlink $tmpfile if -e $tmpfile;
+}
+unlink $tmp if -e $tmp;
+unlink "$tmp.stderr" if -e "$tmp.stderr";
+
+
+sub check_status
+{
+ my ($status, $testname, $testtype, $errmsg) = @_;
+ if ($status != 0)
+ {
+ if ($testtype eq "prep") { die "fatal: prep command [$testname]: $errmsg\n"; }
+ print $errmsg . "\n";
+ $badtest++;
+ }
+ ($status);
+}
+
+
+# build_substitution(tmppfx, cmd, builddir)
+#
+# Perform @@ substitutions for builddir;
+# check that token exists and is executable.
+#
+# Return (status, cmd).
+# status != 0 means token doesn't exist or isn't executable.
+#
+sub build_substitution
+{
+ my ($tmp, $cmd, $builddir) = @_;
+ my ($status, $token, $newname);
+
+ $status = 0;
+ $cmd =~ s/\@\@/$builddir/g; # special case of "@@" replacement
+ while ($cmd =~ /\@(\S+?)\@/)
+ {
+ $token = $1;
+ $newname = "$builddir/$token";
+ if (! -x $newname) { $status = 1; }
+ $cmd =~ s/\@$token\@/$newname/g;
+ }
+ ($status, $cmd);
+}
+
+
+
+# src_substitution(tmppfx, cmd, srcdir)
+#
+# Perform !! substitutions for srcdir;
+# check that token exists.
+#
+# Return (status, cmd).
+# status != 0 means token didn't exist.
+#
+sub src_substitution
+{
+ my ($tmp, $cmd, $srcdir) = @_;
+ my ($status, $token, $newname);
+
+ $status = 0;
+ $cmd =~ s/\!\!/$srcdir/g; # special case of "!!" replacement
+ while ($cmd =~ /\!(\S+?)\!/)
+ {
+ $token = $1;
+ $newname = "$srcdir/$token";
+ if (! -e $newname) { $status = 1; }
+ $cmd =~ s/\!$token\!/$newname/g;
+ }
+ ($status, $cmd);
+}
+
+
+# tempfile_substitution(tmpprefix, command_template)
+#
+# Uses a global, %used_tmpfile, which is a hash
+# that is TRUE for each tmpfile names that we'll
+# try to delete upon exit.
+sub tempfile_substitution
+{
+ my ($tmp, $com) = @_;
+ my ($token, $newname);
+
+ while ($com =~ /%(\S+?)%/ && $1 !~ /^REGRESSION/) {
+ $token = $1;
+ $newname = "$tmp.$token";
+ $com =~ s/%$token%/$newname/g;
+ $used_tmpfile{$newname} = 1;
+ }
+ return $com;
+}
+
+# regression_substitution(tmpprefix, new_command, old_command)
+#
+# Any tempfile token that starts with REGRESSION is
+# now substituted by <tmpppfx>.REGRESSION.{new,old}.{n},
+# where {n} is an index {0..n-1} for <n> regression
+# tmpfiles in the command template (usually 1).
+#
+# Unlike normal tmpfile substitution, these constructed names
+# ignore the exact %token% used by the command template;
+# but there is no possibility of name clash, because the
+# entire token namespace prefixed by REGRESSION is reserved.
+#
+# The reason to do it this way is that now the caller can
+# enumerate (and diff) all regression files just by knowing <n>.
+#
+# Returns (<n>, <cmd1>, <cmd2>).
+#
+sub regression_substitution
+{
+ my ($tmp, $cmd1, $cmd2) = @_;
+ my ($token, $newname1, $newname2, $n);
+
+ $n = 0;
+ while ($cmd1 =~ /%(REGRESSION\S*?)%/)
+ {
+ $token = $1;
+ $newname1 = "$tmp.REGRESSION.new.$n";
+ $newname2 = "$tmp.REGRESSION.old.$n";
+ $cmd1 =~ s/%$token%/$newname1/g;
+ $cmd2 =~ s/%$token%/$newname2/g;
+ $used_tmpfile{$newname1} = 1;
+ $used_tmpfile{$newname2} = 1;
+ $n++;
+ }
+ return ($n, $cmd1, $cmd2);
+}
+
+
+# Function: check_valgrind_status
+#
+# Look at a file containing stderr from an executed command.
+# Find valgrind report, and look for a memory leak report.
+#
+# You'll see below that code for checking "still reachable" has been
+# commented out. System libraries may do harmless global allocations
+# without deallocating, and these show up as "still reachable", yet
+# are outside our control. This is especially noticeable on Mac OS/X.
+#
+# Return ($has_valgrind, $has_leak):
+# $has_valgrind: 1 if report is present; else 0
+# $has_leak: 1 if valgrind report shows an unsuppressed memory leak.
+#
+# If $file isn't present at all, returns (0,0).
+#
+sub check_valgrind_status
+{
+ my ($file) = @_;
+ my ($has_valgrind, $has_leak);
+
+ open(VALGRIND, "$file") || return (0,0);
+ $has_valgrind = $has_leak = 0;
+ while (<VALGRIND>) {
+ if (/^==\d+== Memcheck/) { $has_valgrind = 1; }
+ if (/^==\d+== definitely lost: (\d+)/ && $1 != 0) { $has_leak = 1; }
+ if (/^==\d+== indirectly lost: (\d+)/ && $1 != 0) { $has_leak = 1; }
+ if (/^==\d+== possibly lost: (\d+)/ && $1 != 0) { $has_leak = 1; }
+# if (/^==\d+== still reachable: (\d+)/ && $1 != 0) { $has_leak = 1; }
+ }
+ close VALGRIND;
+
+ if (! $has_valgrind) { $has_leak = 0; }
+
+ return ($has_valgrind, $has_leak);
+}
+
+# Function: tempname
+#
+# Returns a unique temporary filename.
+#
+# Should be robust. Uses the pid as part of the temp name
+# to prevent other processes from clashing. A two-letter
+# code is also added, so a given process can request
+# up to 676 temp file names (26*26). An "esltmp" code is
+# also added to distinguish these temp files from those
+# made by other programs.
+#
+# Returns nothing if it fails to get a temp file name.
+#
+# If TMPDIR is set, that directory is prepended to the
+# name.
+#
+sub tempname {
+ my ($dir, $name, $suffix);
+ if ($TMPDIR) { $dir = $TMPDIR."/"; } else {$dir = "";}
+
+ foreach $suffix ("aa".."zz") {
+ $name = "$dir"."esltmp".$suffix.$$;
+ if (! (-e $name)) {
+ open(TMP,">$name") || die; # Touch it to reserve it.
+ close(TMP);
+ return "$name";
+ }
+ }
+}
+
+
diff --git a/documentation/Makefile.in b/documentation/Makefile.in
new file mode 100644
index 0000000..5ea0b8d
--- /dev/null
+++ b/documentation/Makefile.in
@@ -0,0 +1,205 @@
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+SHELL = /bin/sh
+
+AUTODOC = ${srcdir}/../devkit/autodoc
+CEXCERPT = ${srcdir}/../devkit/cexcerpt
+
+# Installation targets
+#
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+mandir = @mandir@
+docdir = @docdir@
+pdfdir = @pdfdir@
+mandir = @mandir@
+man1dir = ${mandir}/man1
+man1ext = .1
+
+# Each module in this list obeys three documentation conventions:
+#
+# 1. It has a .tex file documenting its API.
+# These are handwritten, in the source directory with
+# the .c and .h files.
+#
+# 2. It can be processed with autodoc_functions to
+# produce the function documentation appendix to
+# each module. These appendices go to the
+# autotext/ subdir.
+#
+# 3. It can be processed with cexcerpts to extract
+# verbatim code fragments for inclusion in the
+# documentation. These fragments go to the cexcerpts/
+# subdir.
+#
+MODULES = easel\
+ esl_alphabet\
+ esl_buffer\
+ esl_cluster\
+ esl_dirichlet\
+ esl_distance\
+ esl_dmatrix\
+ esl_dsqdata\
+ esl_exponential\
+ esl_fileparser\
+ esl_gamma\
+ esl_getopts\
+ esl_gev\
+ esl_gumbel\
+ esl_histogram\
+ esl_hyperexp\
+ esl_keyhash\
+ esl_minimizer\
+ esl_mpi\
+ esl_msa\
+ esl_msacluster\
+ esl_msaweight\
+ esl_normal\
+ esl_paml\
+ esl_random\
+ esl_randomseq\
+ esl_ratematrix\
+ esl_regexp\
+ esl_rootfinder\
+ esl_scorematrix\
+ esl_sq\
+ esl_sqio\
+ esl_sse\
+ esl_ssi\
+ esl_stack\
+ esl_stats\
+ esl_stopwatch\
+ esl_stretchexp\
+ esl_tree\
+ esl_vectorops\
+ esl_weibull\
+ esl_wuss
+
+# esl_mixgev
+# esl_msafile
+# esl_swat
+
+TEXFILES = \
+ codestyle.tex\
+ copyright.tex\
+ doctricks.tex\
+ format_a2m.tex\
+ format_ncbi.tex\
+ format_stockholm.tex\
+ format_wuss.tex\
+ install.tex\
+ installation.tex\
+ intro.tex\
+ macros.tex\
+ main.tex\
+ statistics.tex\
+ titlepage.tex\
+ typography.tex
+
+
+.PHONY: pdf install uninstall clean distclean
+
+pdf: current.pdf
+
+current.pdf: symlinks.stamp autodoc.stamp cexcerpt.stamp apitables.stamp
+ @for prog in pdflatex bibtex; do \
+ command -v $$prog >/dev/null 2>&1 || { echo >&2 "The $$prog program is required to build the Userguide, but it's not installed. Aborting."; exit 1; } \
+ done
+ @echo " LATEX current.pdf (see latex.log for output)"
+ @pdflatex -interaction=nonstopmode main > latex.log 2>&1
+ @bibtex main >> latex.log 2>&1
+ @pdflatex main >> latex.log 2>&1
+ @pdflatex main >> latex.log 2>&1
+ @mv main.pdf current.pdf
+
+# symlinks.stamp: if we're in a build tree, symlink the tex files.
+# if we're in a source tree, no-op.
+symlinks.stamp:
+ @if test "x${srcdir}" != "x."; then \
+ for texfile in ${TEXFILES}; do \
+ if ! (test -e $$texfile); then \
+ ln -s ${srcdir}/$$texfile . ;\
+ fi ;\
+ done ;\
+ if ! (test -e figures); then \
+ ln -s ${srcdir}/figures . ;\
+ fi ;\
+ fi
+ @for module in ${MODULES}; do \
+ if ! (test -e $$module.tex); then \
+ ln -s ${srcdir}/../$$module.tex . ;\
+ fi ;\
+ done
+ @echo "symlinks created:\c" > $@
+ @date >> $@
+
+autodoc.stamp:
+ mkdir -p autotext
+ for module in ${MODULES}; do\
+ ${AUTODOC} ${srcdir}/../$$module.c > autotext/$${module}_functions.tex;\
+ done
+ @echo "autotext created:\c" > $@
+ @date >> $@
+
+cexcerpt.stamp:
+ mkdir -p cexcerpts
+ for module in ${MODULES}; do\
+ ${CEXCERPT} ${srcdir}/../$$module.c cexcerpts;\
+ ${CEXCERPT} ${srcdir}/../$$module.h cexcerpts;\
+ done
+ @echo "cexcerpts created:\c" > $@
+ @date >> $@
+
+apitables.stamp:
+ mkdir -p apitables
+ for module in ${MODULES}; do\
+ ${AUTODOC} -t ${srcdir}/../$$module.c > apitables/$${module}_api.tex;\
+ done
+ @echo "apitables created:\c" > $@
+ @date >> $@
+
+install:
+ ${INSTALL} -m 0644 current.pdf ${DESTDIR}${pdfdir}/
+
+uninstall:
+ -rm -f ${DESTDIR}${pdfdir}/current.pdf
+
+clean:
+ if test "x${srcdir}" != "x."; then \
+ for texfile in ${TEXFILES}; do \
+ if (test -L $$texfile); then \
+ rm $$texfile ;\
+ fi ;\
+ done ;\
+ if (test -L figures); then \
+ rm figures ;\
+ fi ;\
+ fi
+ for module in ${MODULES}; do \
+ if (test -L $$module.tex); then \
+ rm $$module.tex ;\
+ fi ;\
+ done
+ -rm -f symlinks.stamp autodoc.stamp cexcerpt.stamp apitables.stamp
+ -rm -rf cexcerpts
+ -rm -rf autotext
+ -rm -rf apitables
+ -rm -f latex.log
+ -rm -f x.log
+ -rm -f *~ TAGS
+ -rm -f main.log main.out main.pdf main.aux main.toc
+ -rm -f main.bbl main.blg main.brf
+ -rm -f typography.log typography.aux typography.out
+
+distclean: clean
+ -rm -f Makefile
+ -rm -f current.pdf
+
+################################################################
+# @LICENSE@
+################################################################
diff --git a/documentation/codestyle.tex b/documentation/codestyle.tex
new file mode 100644
index 0000000..8a63dc2
--- /dev/null
+++ b/documentation/codestyle.tex
@@ -0,0 +1,1872 @@
+
+This chapter describes Easel from a developer's perspective. It shows
+how a module's source code is organized, written, tested, and
+documented. It should help you with implementing new Easel code, and
+also with understanding the structure of existing Easel code.
+
+We expect Easel to constantly evolve, both in code and in style.
+Talking about our code style does not mean we enforce foolish
+consistency. Rather, the goal is aspirational; one way we try to
+manage the complexity of our growing codebase is to continuously
+cajole Easel code toward a clean and consistent presentation. We try
+to organize code modules in similar ways, use certain naming
+conventions, and channel similar functions towards common
+\esldef{interfaces} that provide common calling conventions and
+behaviors.
+
+But because it evolves, not all Easel code obeys the code style
+described in this chapter. Easel code style is like a local building
+ordinance. Any new construction should comply. Older construction is
+grandfathered in and does not have to immediately conform to the
+current rules. When it comes time to renovate, it's also time to bring
+the old work up to the current standards.
+
+For a concrete example we will focus primarily on one Easel module,
+the \eslmod{buffer} module. We'll take a bottom up approach, starting
+from the overall organization of the module and working down into
+details. If you're a starting developer, you might have preferred a
+bottom-up description; you might just want to know how to write or
+improve a single Easel function, for example. In that case, skim
+ahead.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Table: Easel naming conventions
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{table}
+\begin{minipage}{\textwidth}
+\begin{tabular}{l>{\raggedright}p{3.5in}l}
+\textbf{What} & \textbf{Explanation} & \textbf{Example} \\ \hline
+Easel module
+ &
+ Module names should be 10 characters or less.\footnote{sqc assumes
+ this in output formatting, for example.}
+ Many modules are organized around a single Easel object
+ that they implement. The name of the module matches the
+ name of the object. For example, \ccode{esl\_buffer.c} implements \ccode{ESL\_BUFFER}.
+ & \eslmod{buffer} \\ \\
+
+tag name
+ & Names in the module are constructed either using the module's full
+ name or sometimes with a shorter abbreviation, usually 3
+ characters (sometimes 2 or 4).
+ & \ccode{buf} \\ \\
+
+source file
+ & Each module has one source file, named \ccode{esl\_}\itcode{modulename}\ccode{.c}.
+ & \ccode{esl\_buffer.c} \\ \\
+
+header file
+ & Each module has one header file, named \ccode{esl\_}\itcode{modulename}\ccode{.h}.
+ & \ccode{esl\_buffer.h} \\ \\
+
+documentation
+ & Each module has one documentation chapter, named \ccode{esl\_}\itcode{modulename}\ccode{.tex}.
+ & \ccode{esl\_buffer.tex} \\ \\
+
+Easel object
+ & Easel ``objects'' are typedef'ed C structures (usually) or
+ types (rarely\footnote{\ccode{ESL\_DSQ} is a \ccode{uint8\_t}, for example.}).
+ & \ccode{ESL\_BUFFER} \\ \\
+
+external function
+ & All exposed functions have tripartite names \ccode{esl\_}\itcode{module}\ccode{\_specificname}().
+ The specific part of function names often adhere to a standardized API
+ ``interface'' nomenclature. (All \ccode{\_Open()} functions must follow the same standardized
+ behavior guidelines, for example.) Functions in the base \ccode{easel.c} module
+ have a bipartite name, omitting the module name. The specific
+ name part generally uses mixed case capitalization.
+ & \ccode{esl\_buffer\_OpenFile()} \\ \\
+
+static function
+ & Internal functions (static within a module file) drop the
+ \ccode{esl\_} prefix, and are
+ named \itcode{modulename}\ccode{\_function}.
+ & \ccode{buffer\_refill()} \\ \\
+
+macro
+ & Macros follow the same naming convention as external functions,
+ except they are all upper case.
+ & \ccode{ESL\_ALLOC()} \\ \\
+
+defined constant
+ & Defined constants in Easel modules are named
+ \ccode{esl}\itcode{MODULENAME}\ccode{\_FOO}. Constants defined
+ in the base \ccode{easel.h} module are named just
+ \ccode{eslFOO}.
+ & \ccode{eslBUFFER\_SLURPSIZE}\\ \\
+
+return codes
+ & Return codes are constants defined in \ccode{easel.h}, so
+ they obey the rules of other defined constants in the base module (\ccode{eslOK},
+ \ccode{eslFAIL}). Additionally, error codes start with
+ \ccode{E}, as in \ccode{eslE}\itcode{ERRTYPE}.
+ & \ccode{eslENOTFOUND} \\ \\
+
+config constant
+ & Constants that don't start with \ccode{esl} are almost always
+ configuration (compile-time) constants determined by the autoconf
+ \ccode{./configure} script and defined in \ccode{esl\_config.h}.
+ & \ccode{HAVE\_STDINT\_H} \\ \\
+\end{tabular}
+\end{minipage}
+\caption{\textbf{Easel naming conventions.} }
+\end{table}
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{An Easel module}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Each module consists of three files: a .c C code file, a .h header
+file, and a .tex documentation file. These filenames are constructed
+from the module name. For example, the \eslmod{buffer} module is
+implemented in \ccode{esl\_buffer.c}, \ccode{esl\_buffer.h}, and
+\ccode{esl\_buffer.tex}.
+
+%%%%%%%%%%%%%%%%
+\subsection{The .c file}
+%%%%%%%%%%%%%%%%
+
+Easel \ccode{.c} files are larger than most coding styles would
+advocate. Easel module code is designed to be \emph{read}, to be
+\emph{self-documenting}, to contain its own \emph{testing methods},
+and to provide useful \emph{working examples}. Thus the size of the
+files is a little deceptive, compared to C code that's solely
+implementating some functions. In general, only about a a quarter of
+an Easel module's \ccode{.c} file is the actual module implementation.
+Typically, around half of an Easel \ccode{.c} file is documentation,
+and much of this gets automatically parsed into the PDF userguide. The
+rest consists of drivers for unit testing and examples.
+
+Module files are organized into a somewhat stereotypical set of
+sections, to facilitate navigating the code, as follows.
+
+The \ccode{.c} file starts with a comment that contains the {\bfseries
+ table of contents}. The table of contents helps us navigate a long
+Easel source file. This initial comment also includes a short
+description of the module's purpose. It may also contain miscellaneous
+notes.
+
+For example, from the \eslmod{buffer} module:
+
+\input{cexcerpts/header_example}
+
+None of this is parsed automatically. Its structure is just
+convention.
+
+The short description lines in the table of contents match section
+headings in comments later in the file. A search forward with the text
+of a heading will move you to that section of the code.
+
+Next come the {\bfseries includes} and any {\bf definitions}. Of the
+include files, the \ccode{esl\_config.h} header must always be
+included first. It contains platform-independent configuration code
+that may affect even the standard library header files. Standard
+headers like \ccode{stdio.h} come next, then Easel's main header
+\ccode{easel.h}; then headers of any other Easel modules this module
+depends on; then any headers for modules this module can be augmented
+with, surrounded by appropriate \ccode{\#ifdef}'s; then the module's
+own header. For example, the \ccode{\#include}'s in the
+\eslmod{buffer} module look like:
+
+\input{cexcerpts/include_example}
+
+Next come the {\bfseries private function declarations}. We declare
+all private functions at the top of the file, where they can be seen
+easily by a developer who's casually reading the source. Their
+definitions are buried deeper, in one or more sections following the
+implementation of the exposed API.
+
+\input{cexcerpts/statics_example}
+
+The rest of the file is the {\bfseries code}. It is split into
+sections. Each section is numbered and given one-line titles that
+appear in the table of contents. Each section starts with a section
+header, a comment block in front of each code section in the
+\ccode{.c} file. These section headers match comments in front of
+that section's declarations in the \ccode{.h} file. Because of the
+numbering and titling, a particular section of code can be located by
+searching on the number or title. A common section structure includes
+the following, in this order:
+
+
+\begin{description}
+\item[\textbf{The \ccode{FOOBAR} object.}]
+ The first section of the file provides the API for creating and
+ destroying the object that this module implements.
+
+\item[\textbf{The rest of the API.}]
+ Everything else that is part of the API for this module in its
+ baseline (unaugmented) form. This might be split across multiple
+ sections.
+
+\item[\textbf{Augmented API, if any.}]
+ Any functions that are only available with one or more augmentations
+ are split out into one or more separate sections.
+
+\item[\textbf{Debugging/dev code.}]
+ Most objects can be validated or dumped to an output stream
+ for inspection.
+
+\item[\textbf{Private functions.}]
+ Easel isn't rigorous about where private (non-exposed) functions go,
+ but they often go in a separate section in about the middle of the
+ \ccode{.c} file, after the API and before the drivers.
+
+\item[\textbf{Optional drivers}] Stats, benchmark, and regression
+ drivers, if any.
+
+\item [\textbf{Unit tests.}]
+ The unit tests are internal controls that test that the module's API
+ works as advertised.
+
+\item [\textbf{Test driver.}]
+ All modules have an automated test driver is a \ccode{main()} that
+ runs the unit tests.
+
+\item [\textbf{Examples.}]
+ All modules have at least one \ccode{main()} showing an example of
+ how to use the main features of the module.
+
+\item [\textbf{Copyright/license information.}] Each file ends with a
+ \ccode{@LICENSE@} tag. This placeholder is automatically replaced by
+ the correct license statement at packaging time. This gives us the
+ ability to package specially licensed versions, in addition to the
+ usual open source version. Automatically generated Subversion
+ \ccode{SVN \$Id\$} and \ccode{SVN \$URL\$} information often appears
+ here too.
+
+\end{description}
+
+%%%%%%%%%%%%%%%%
+\subsection{The .h file}
+%%%%%%%%%%%%%%%%
+
+
+%%%%%%%%%%%%%%%%
+\subsection{Special syntax in Easel C comments}
+%%%%%%%%%%%%%%%%
+
+Easel comments sometimes include special syntax recognized by tools other
+than the compiler. Here are some quick explanations of the special
+stuff a developer needs to be aware of.
+
+\begin{table}
+\begin{tabular}{l>{\raggedright}p{3.5in}l}
+\textbf{Special syntax} & \textbf{Description} & \textbf{Parsed by}\\ \hline
+
+\ccode{/* Function: }\itcode{funcname}
+ & Function documentation that gets converted to \LaTeX\ and included
+ in Easel's PDF documentation.
+ & \emcode{autodoc} \\ \\
+
+\ccode{ *\# }\itcode{x.\ secheading}
+ & Section heading corresponding to section number x in a \ccode{.c}
+ file's table of contents. This is automatically extracted as part
+ of creating a summary table in the PDF documentation.
+ & \emcode{autodoc -t} \\ \\
+
+\ccode{/*::cexcerpt::} ...
+ & Comments that marking beginning/end of code that is extracted
+ verbatim into the documentation.
+ & \emcode{cexcerpt} \\ \\
+
+\ccode{ \$}\itcode{keyword}\ccode{\$}
+ & Subversion keyword substitutions
+ & \emcode{svn} \\ \\
+
+\ccode{@}\itcode{keyword}\ccode{@}
+ & Configuration variable substitution
+ & \emcode{sedition} \\ \\
+\hline
+\end{tabular}
+\caption{{\bfseries Summary of special syntax in Easel C comments.}}
+\end{table}
+
+%%%%
+\subsubsection{function documentation}
+%%%%
+
+Any comment that starts with
+\begin{cchunk}
+/* Function: ...
+\end{cchunk}
+will be recognized and parsed by our \prog{autodoc} program,
+which assumes it is looking at a structured function documentation
+header.
+
+See section XX for details on how these headers work.
+
+We want all external functions in the Easel API to be documented
+automatically by \prog{autodoc}. We don't want internal functions tp
+appear in the documentation, but we do want them documented in the
+code. To keep \prog{autodoc} from recognizing the function header of
+an internal (static) function, we just leave off the \ccode{Function:}
+tag in the comment block.
+
+%%%%
+\subsubsection{section headings}
+%%%%
+
+The automatically generated \LaTeX\ code for a module's documentation
+includes a table summarizing the functions in the exposed API. This
+table is constructed automatically from the source code by
+\prog{autodoc -t}. The list of functions in this table is extracted
+from the function documentation (above). The table is broken into
+sections, just as the module code is, using section headings. The
+comment block marking the start of a section heading for exposed API
+code has an extra \ccode{\#}:
+
+\begin{cchunk}
+/*****************************************************************
+ *# 1. ESL_BUFFER object: opening/closing.
+ *****************************************************************/
+\end{cchunk}
+
+Section headings for internal functions omit the \ccode{\#}, and
+\prog{autodoc} ignores them:
+
+\begin{cchunk}
+/*****************************************************************
+ * 10. Unit tests
+ *****************************************************************/
+\end{cchunk}
+
+%%%%
+\subsubsection{excerpting}
+%%%%
+
+This book includes many examples of C code extracted verbatim from
+Easel source. These {\bfseries excerpts} are marked with specially
+formatted comments in the C file:
+
+\begin{cchunk}
+/*::cexcerpt::my_example::begin::*/
+ while (esl_sq_Read(sqfp, sq) == eslOK)
+ { n++; }
+/*::cexcerpt::my_example::end::*/
+\end{cchunk}
+
+When we build the Easel documentation from its source, our
+\prog{cexcerpt} program extracts all marked excerpts from \ccode{.c}
+and \ccode{.h} files, and places them in individual files in a
+temporary \ccode{cexcerpts/} directory, from where they are included
+in the main \LaTeX documentation.
+
+%%%%
+\subsubsection{subversion keyword substitution (\$\$)}
+%%%%
+
+Comment lines containing Subversion \ccode{Id} and \ccode{URL}
+keywords appear in the table of contents section:
+
+\begin{cchunk}
+ * SVN $Id: esl_buffer.c 662 2011-02-22 16:33:08Z eddys $
+ * SVN $URL: https://svn.janelia.org/eddylab/eddys/easel/trunk/esl_buffer.c $
+\end{cchunk}
+
+These started out as
+\begin{cchunk}
+ * SVN $Id$
+ * SVN $URL$
+\end{cchunk}
+
+and their contents get substituted by Subversion, our revision control
+system.
+
+If you add a new file to Easel and it has Subversion keywords in it,
+you have to manually activate keyword substitution.
+
+\user{svn propset svn:keywords "Id URL" }\itbfcode{myfile}
+
+%%%%
+\subsubsection{configuration variable substitution (@@)}
+%%%%
+
+At the bottom of every source file is a comment block:
+
+\begin{cchunk}
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+\end{cchunk}
+
+When we build a distribution package, the \ccode{@LICENSE@} tag is
+replaced with by the appropriate copyright and license text by our
+\prog{sedition} program. The command line appears in
+\ccode{Makefile.in} in its \ccode{make dist}; it directs
+\prog{sedition} to replace \ccode{@LICENSE@} tags with the contents of
+the \ccode{LICENSE.tag} file (which is itself constructed
+automatically at \ccode{make dist} time).
+
+For example, the standard Easel release uses the Janelia Software
+License (functionally identical to the BSDL), so in distribution code
+this comment block something like:
+
+\begin{cchunk}
+/*****************************************************************
+ * Easel - a library of C functions for biological sequence analysis
+ * Version 0.42; February 2011
+ * Copyright (C) 2011 Howard Hughes Medical Institute
+ * Other copyrights also apply. See the COPYRIGHT file for a full list.
+ *
+ * Easel is distributed under the Janelia Farm Software License, a BSD
+ * license. See the LICENSE file for more details.
+ *****************************************************************/
+\end{cchunk}
+
+Autogenerating these license tags allows us to package distributions
+under other licenses without having to edit every source file.
+
+\ccode{@LICENSE@} is the only configuration variable that Easel
+\ccode{.c} or \ccode{.h} files currently use. It's possible we would
+add others in the future.
+
+
+%%%%%%%%%%%%%%%%
+\subsection{Driver programs}
+%%%%%%%%%%%%%%%%
+
+An unusual (innovative?) thing about Easel modules is how we embed
+{\bfseries driver programs} directly in the module's \ccode{.c}
+file. Driver programs include our unit tests, benchmarks, and working
+examples. These small programs are enclosed in standardized
+\ccode{\#ifdef}'s that enable them to be conditionally compiled.
+
+None of these programs are installed by \ccode{make install}. Test
+drivers are compiled as part of \ccode{make check}. A \ccode{make
+ dev} compiles all driver programs.
+
+There are six main types of drivers used in Easel:
+
+\begin{description}
+
+\item[\textbf{Unit test driver(s).}] (Mandatory.) Each module has one (and only one)
+ \ccode{main()} that runs the unit tests and any other automated for
+ the module. The test driver is compiled and run by the testsuite in
+ \ccode{testsuite/testsuite.sqc} when one does a \ccode{make check}
+ on the package. It is also run by several of the automated tools
+ used in development, including the coverage (\ccode{gcov}) and
+ memory (\ccode{valgrind}) tests. A test driver takes no arguments
+ (it must generate any input files it needs). If it succeeds, it
+ returns 0, with no output. If it fails, it returns nonzero and calls
+ \ccode{esl\_fatal()} to issue a short error message on
+ \ccode{stdout}. Our test harness, \emcode{sqc}, depends on these
+ output and exit status conventions. Optionally, it may use a flag
+ to show more useful output when it's run more interactively.
+ (usually a \ccode{-v}, for verbose).
+ The test driver is enclosed by
+ \ccode{\#ifdef esl}\itcode{MODULE}\ccode{\_TESTDRIVE} for
+ conditional compilation.
+
+\item[\textbf{Regression/comparison test(s).}] (Optional.) These tests
+ link to one or more libraries that provide identical comparable
+ functionality, such as previous versions of Easel, the old
+ \prog{SQUID} library, \prog{LAPACK} or the GNU Scientific Library.
+ They test that Easel's functionality performs at least as it used
+ to, or as well as the 'competition'. These tests are run on demand,
+ and not included in automated testing, because the other libraries
+ may only be present on a subset of our development machines. They
+ are enclosed by \ccode{\#ifdef
+ esl}\itcode{MODULE}\ccode{\_REGRESSION} for conditional
+ compilation.
+
+\item[\textbf{Benchmark(s).}] (Optional.) These tests run a
+ standardized performance benchmark and collect time and/or memory
+ statistics. They may generate output suitable for graphing. They are
+ run on demand, not by automated tools. They typically use
+ \eslmod{stopwatch} for timing. They are enclosed by
+ \ccode{\#ifdef esl}\itcode{MODULE}\ccode{\_BENCHMARK} for
+ conditional compilation.
+
+\item[\textbf{Statistics generator(s).}] (Optional.) These tests collect
+ statistics used to characterize the module's scientific performance,
+ such as its accuracy at some task. They may generate graphing
+ output. They are run on demand, not by automated tools. They are
+ enclosed by \ccode{\#ifdef esl}\itcode{MODULE}\ccode{\_STATS}
+ for conditional compilation.
+
+\item[\textbf{Experiment(s).}] (Optional.) These are other reproducible
+ experiments we've done on the module code, essentially the same as
+ statistics generators. They are
+ enclosed by \ccode{\#ifdef esl}\itcode{MODULE}\ccode{\_EXPERIMENT}
+ for conditional compilation.
+
+\item[\textbf{Example(s).}] (Mandatory). Every module has at least one example
+ \ccode{main()} that provides a ``hello world'' level example of
+ using the module's API. Examples are enclosed in \ccode{cexcerpt}
+ tags for extraction and verbatim inclusion in the documentation.
+ They are enclosed by \ccode{\#ifdef esl}\itcode{MODULE}\ccode{\_EXAMPLE}
+ for conditional compilation.
+\end{description}
+
+All modules have at least one test driver and one example. Other tests
+and examples are optional. When there is more than one \ccode{main()}
+of a given type, the additional tags are numbered starting from 2: for
+example, a module with three example \ccode{main()'s} would have three
+tags for conditional compilation, \ccode{eslFOO\_EXAMPLE},
+\ccode{eslFOO\_EXAMPLE2}, and \ccode{eslFOO\_EXAMPLE3}.
+
+The format of the conditional compilation tags for all the drivers
+(including test and example drivers) must be obeyed. Some test scripts
+are scanning the .c files and identifying these tags
+automatically. For instance, the driver compilation test identifies any
+tag named
+\ccode{esl}\itcode{MODULENAME}\ccode{\_\{TESTDRIVE,EXAMPLE,REGRESSION,BENCHMARK,STATS\}*}
+and attempt to compile the code with that tag defined.
+
+Which driver is compiled (if any) is controlled by conditional
+compilation of the module's \ccode{.c} file with the appropriate
+tag. For example, to compile and run the \eslmod{sqio} test driver as
+a standalone module:
+
+\begin{cchunk}
+ % gcc -g -Wall -I. -o esl_sqio_utest -DeslSQIO_TESTDRIVE esl_sqio.c easel.c -lm
+ % ./esl_sqio_utest
+\end{cchunk}
+
+or to compile and run it in full library configuration:
+
+\begin{cchunk}
+ % gcc -g -Wall -I. -L. -o esl_sqio_utest -DeslSQIO_TESTDRIVE esl_sqio.c -leasel -lm
+ % ./esl_sqio_utest
+\end{cchunk}
+
+
+\begin{table}
+\begin{tabular}{llll}
+\textbf{Driver type} & \textbf{Compilation flag} & \textbf{Driver program name} & \textbf{Notes}\\ \hline
+Unit test & \ccode{esl}\itcode{MODULE}\ccode{\_TESTDRIVE} & \ccode{esl\_}\itcode{module}\ccode{\_utest} & output and exit status standardized for \emcode{sqc}\\
+Regression test & \ccode{esl}\itcode{MODULE}\ccode{\_REGRESSION} & \ccode{esl\_}\itcode{module}\ccode{\_regression} & may require other libraries installed\\
+Benchmark & \ccode{esl}\itcode{MODULE}\ccode{\_BENCHMARK} & \ccode{esl\_}\itcode{module}\ccode{\_benchmark} & \\
+Statistics collection & \ccode{esl}\itcode{MODULE}\ccode{\_STATS} & \ccode{esl\_}\itcode{module}\ccode{\_stats} & \\
+Experiment & \ccode{esl}\itcode{MODULE}\ccode{\_EXPERIMENT} & \ccode{esl\_}\itcode{module}\ccode{\_experiment} & \\
+Example & \ccode{esl}\itcode{MODULE}\ccode{\_EXAMPLE} & \ccode{esl\_}\itcode{module}\ccode{\_example} & \\
+\end{tabular}
+\caption{{\bfseries Summary of types of driver programs in Easel.}}
+\end{table}
+
+
+
+
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Writing an Easel function}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+Documentation of functions, particularly in the structured comment
+header that's parsed by the \emcode{autodoc} program, is described in
+a different section of its own.
+
+%%%%
+\subsubsection{conventions for function names}
+%%%%
+
+Function names are tripartite, constructed as
+\ccode{esl\_}\itcode{moduletag\_funcname}.
+
+The \itcode{moduletag} should generally be the module's full name;
+sometimes (historically) it is an abbreviated tag name for the module
+(such as \ccode{abc} for the \eslmod{alphabet} module); on occasion,
+it is the name of an Easel object or datatype that has not yet budded
+off into its own module. Long versus short \itcode{moduletag}'s are
+sometimes used to indicate functions that operate directly on objects
+via common interfaces, versus other functions in the exposed API. The
+long form may indicate functions that obey a common interface, such as
+\ccode{esl\_alphabet\_Create()}.\footnote{This is a clumsy C version
+ of what C++ would do with namespaces, object methods, and
+ constructors/destructors.} Miscellaneous exposed functions in the API
+ of a module may be named by the three-letter short tag, such as
+ \ccode{esl\_abc\_Digitize()}.
+
+The function's \ccode{\{funcname\}} can be anything. Some names
+are standard and indicate the use of a common {\bfseries interface}.
+This part of the name is usually in mixed-case capitalization.
+
+Only exposed (\ccode{extern}) functions must follow these rules. In
+general, private (\ccode{static}) functions can have any
+name. However, it's common in Easel for private functions to obey the
+same naming conventions except without the \ccode{esl\_} prefix.
+
+Sometimes essentially the same function must be provided for different
+data types. In these cases one-letter prefixes are used to indicate
+datatype:
+
+\begin{tabular}{ll}
+\ccode{C} & \ccode{char} type, or a standard C string \\
+\ccode{X} & \ccode{ESL\_DSQ} type, or an Easel digitized sequence\\
+\ccode{I} & \ccode{int} type \\
+\ccode{F} & \ccode{float} type \\
+\ccode{D} & \ccode{double} type \\
+\end{tabular}
+
+For example, \eslmod{vectorops} uses this convention heavily;
+\ccode{esl\_vec\_FNorm()} normalizes a vector of floats and
+\ccode{esl\_vec\_DNorm()} normalizes a vector of doubles. A second
+example is in \eslmod{randomseq}, which provides routines for shuffling
+either text strings or digitized sequences, such as
+\ccode{esl\_rsq\_CShuffle()} and \ccode{esl\_rsq\_XShuffle()}.
+
+%%%%
+\subsubsection{conventions for argument names}
+%%%%
+
+When using pointers in C, it can be hard to tell which arguments are
+for input data (which are provided by the caller and will not be
+modified), output data (which are created and returned by the
+function), and modified data (which are both input and output).
+
+For output consisting of pointers to nonscalar types such as objects
+or arrays, it also can be hard to distinguish when the caller is
+supposed to provide pre-allocated storage for the result, versus the
+storage being newly allocated by the function.\footnote{A common
+strategy in C library design is to strive for \emph{no} allocation in
+the library, so the caller is always responsible for explicit
+alloc/free pairs. I feel this puts a tedious burden of allocation code
+on an application.}
+
+When functions return more than one kind of result, it is convenient
+to make all the individual results optional, so the caller doesn't
+have to deal with managing storage for results it isn't interested in.
+In Easel, an optional result pointer is passed as \ccode{NULL} to
+indicate a possible result is not wanted (and is not allocated, if
+returning that result required new allocation).
+
+Easel uses a prefix convention on pointer argument names to indicate
+these situations:
+
+\begin{table}[h]
+\begin{center}
+{\small
+\begin{tabular}{cp{2.5in}p{3in}}
+ \textbf{prefix} & \textbf{argument type} & \textbf{allocation (if any):}\\
+none & If qualified as \ccode{const}, a pointer
+ to input data, not modified by the call.
+ If unqualified, a pointer to data modified
+ by the call (it's both input and output). & by caller\\
+\ccode{ret\_} & Pointer to result. & in the function \\
+\ccode{opt\_} & Pointer to optional result.
+ If non-\ccode{NULL}, result is obtained. & in the function \\
+\end{tabular}
+}
+\end{center}
+\end{table}
+
+
+
+%%%%
+\subsubsection{Return status}
+%%%%
+
+%%%%
+\subsubsection{conventions for exception handling}
+%%%%
+
+Easel functions {\bfseries should never exit except through an Easel
+ return code or through the Easel exception handler}. When you write
+Easel code you must {\bfseries always} deal with the case when the
+caller has registered a nonfatal exception handler, causing thrown
+exceptions to return a nonzero code rather than exiting. The Easel
+library is designed to be used in programs that can't just suddenly
+crash out with an error message (such as a graphical user interface
+environment), and programs that have specialized error handlers
+because they don't even have access to a \ccode{stderr} stream on a
+terminal (such as a UNIX daemon).
+
+This means that Easel functions must clean up their memory and set
+appropriate return status and return arguments, even in the case of
+thrown exceptions.
+
+
+%%%%
+\subsubsection{Easel's idiomatic function structure}
+%%%%
+
+To deal with the above strictures of return status, returned
+arguments, and exception handling and cleanup, most Easel functions
+follow an idiomatic structure. The following snippet illustrates the
+key ideas:
+
+\begin{cchunk}
+1 int
+2 esl_example_Hello(char *opt_hello, char *opt_len)
+3 {
+4 char *msg = NULL;
+5 int n;
+6 int status;
+
+7 if ( (status = esl_strdup("hello world!\n", -1, &msg)) != eslOK) goto ERROR;
+8 n = strlen(msg);
+
+9 if (opt_hello) *opt_hello = msg; else free(msg);
+10 if (opt_len) *opt_len = n;
+11 return eslOK;
+
+12 ERROR:
+13 if (msg) free(msg);
+14 if (opt_hello) *opt_hello = NULL;
+15 if (opt_n) *opt_n = 0;
+16 return status;
+17 }
+\end{cchunk}
+
+The stuff to notice here:
+
+\begin{itemize}
+\item[line 2:] The \ccode{opt\_hello} and \ccode{opt\_len} arguments
+ are optional. The caller might want only one of them (or neither,
+ but that would be weird). We're expecting calls like
+ \ccode{esl\_example\_Hello(\&hello, \&n)},
+ \ccode{esl\_example\_Hello(\&hello, NULL)}, or
+ \ccode{esl\_example\_Hello(NULL, \&n)}.
+
+\item[line 4:] Anything we allocate, we initialize its pointer to \ccode{NULL}.
+ Now, if an exception occurs and we have to break out of the function early,
+ we can tell whether the allocation has already happened (and hence we need
+ to clean up its memory), if the pointer has become non-\ccode{NULL}.
+
+\item[line 6:] Most functions have an explicit \ccode{status} variable.
+ Standard error-handling macros (\ccode{ESL\_XEXCEPTION()} for example) expect it to be present,
+ as do standard allocation macros (\ccode{ESL\_ALLOC()} for example).
+ If we have to handle an exception, we're going to make sure the status
+ is set how we want it, then jump to a cleanup block.
+
+\item[line 7:] When any Easel function calls another Easel function,
+ it must check the return status for both normal errors and thrown
+ exceptions. If an exception has already been thrown by a callee,
+ usually the caller just relays the exception status up the call
+ stack. The idiom is to set the return \ccode{status} and go
+ immediately to the error cleanup block, \ccode{ERROR:}. We use a
+ \ccode{goto} for this, Dijkstra notwithstanding.
+
+\item[lines 9,10:] When we set optional arguments for a normal return,
+ we first check whether a valid return pointer was provided. If the
+ optional pointer is \ccode{NULL} the caller doesn't want the result,
+ and we clean up any memory we need to (line 9).
+
+\item[line 13:] In the error cleanup block, we first free any memory
+ that got allocated before the failure point. The idiom of
+ immediately initializing all allocated pointers to \ccode{NULL}
+ enables us to tell which things have been allocated or not.
+
+\item[line 14:] When we return from a function with an unsuccessful
+ status, we also make sure that any returned arguments are in
+ a documented ground state, usually \ccode{NULL}'s and \ccode{0}'s.
+\end{itemize}
+
+%%%%
+\subsubsection{reentrancy: plan for threads}
+%%%%
+
+Easel code must expect to be called in multithreaded applications. All
+functions must be reentrant. There should be no use of global or
+static variables.
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Standard Easel function interfaces}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Some function names are shared and have common behaviors across
+modules, like \ccode{\_Get*()} and \ccode{\_Set*()} functions. These
+special names are called \esldef{common interfaces}.
+
+\begin{table}
+\begin{minipage}{\textwidth}
+\begin{tabular}{l>{\raggedright}p{3.0in}ll}
+\textbf{Function name} & \textbf{Description} & \textbf{Returns} & \textbf{Example} \\ \hline
+ \multicolumn{4}{c}{\bfseries Creating and destroying new objects}\\
+\ccode{\_Create}
+ & Create a new object.
+ & \ccode{ESL\_}\itcode{FOO}\ccode{ *}
+ & \ccode{esl\_alphabet\_Create()} \\
+
+\ccode{\_Destroy}
+ & Free an object.
+ & \ccode{void}
+ & \ccode{esl\_alphabet\_Destroy()} \\
+
+\ccode{\_Clone}
+ & Duplicate an object, by creating and allocating a new one.
+ & \ccode{ESL\_}\itcode{FOO}\ccode{ *}
+ & \ccode{esl\_msa\_Clone()} \\
+
+\ccode{\_Shadow}
+ & Partially duplicate an object, creating a dependent shadow.
+ & \ccode{ESL\_}\itcode{FOO}\ccode{ *}
+ & \ccode{p7\_oprofile\_Shadow()} \\
+
+\ccode{\_Copy}
+ & Make a copy of an object, using an existing allocated object for space.
+ & [standard]
+ & \ccode{esl\_msa\_Copy()} \\
+
+ \multicolumn{4}{c}{\bfseries Opening and closing input sources}\\
+\ccode{\_Open}
+ & Open an input source, associating it with an Easel object.
+ & [standard]
+ & \ccode{esl\_buffer\_Open()} \\
+
+\ccode{\_Close}
+ & Close an Easel object corresponding to an input source.
+ & [standard]
+ & \ccode{esl\_buffer\_Close()} \\
+
+ \multicolumn{4}{c}{\bfseries Managing memory allocation}\\
+
+\ccode{\_Grow}
+ & Expand the allocation in an existing object, typically by doubling.
+ & [standard]
+ & \ccode{esl\_tree\_Grow()} \\
+
+\ccode{\_GrowTo}
+ & Reallocate object (if needed) for some new data size.
+ & [standard]
+ & \ccode{esl\_sq\_GrowTo()} \\
+
+\ccode{\_Reuse}
+ & Recycle an object, reinitializing it while reusing as much of its existing
+ allocation(s) as possible.
+ & [standard]
+ & \ccode{esl\_keyhash\_Reuse()} \\
+
+\ccode{size\_t \_Sizeof}
+ & Return the allocation size of an object
+ & size, in bytes
+ & - \\
+
+
+
+ \multicolumn{4}{c}{\bfseries Accessing information in objects}\\
+
+\ccode{\_Is}
+ & Return \ccode{TRUE} or \ccode{FALSE} for some query of the
+ internal state of an object.
+ & \ccode{TRUE | FALSE}
+ & \ccode{esl\_opt\_IsOn()} \\
+
+\ccode{\_Get}
+ & Return a value for some query of the internal state of an object.
+ & value
+ & \ccode{esl\_buffer\_Get()} \\
+
+\ccode{\_Read}
+ & Get a value in the object and return it in a location provided (and possibly allocated) by the caller.
+ & [standard]
+ & \ccode{esl\_buffer\_Read()} \\
+
+\ccode{\_Fetch}
+ & Get a value in the object and return it in newly allocated space;
+ the caller becomes responsible for the newly allocated space.
+ & [standard]
+ & \ccode{esl\_buffer\_FetchLine()} \\
+
+\ccode{\_Set}
+ & Set a value in the object.
+ & [standard]
+ & \ccode{esl\_buffer\_Set()} \\
+
+\ccode{\_Format}
+ & Set a string in the object using \ccode{sprintf()}-like
+ semantics.
+ & [standard]
+ & \ccode{esl\_msa\_FormatName()} \\
+
+
+
+ \multicolumn{4}{c}{\bfseries Debugging}\\
+\ccode{\_Validate}
+ & Run validation tests on the internal state of an object.
+ & [standard]
+ & \ccode{esl\_tree\_Validate()} \\
+
+\ccode{\_Compare}
+ & Compare two objects to each other for equality (or close enough).
+ & [standard]
+ & \ccode{esl\_msa\_Compare()} \\
+
+\ccode{\_Dump}
+ & Dump a verbose, possibly ugly, but developer-readable output
+ of the internal state of an object.
+ & [standard]
+ & \ccode{esl\_keyhash\_Dump()} \\
+
+\ccode{\_TestSample}
+ & Sample a mostly syntactically correct object for test purposes
+ & [standard]
+ & \ccode{p7\_tophits\_TestSample()} \\
+
+
+
+ \multicolumn{4}{c}{\bfseries Miscellaneous}\\
+
+\ccode{\_Write}
+ & Write something from an object to an output stream.
+ & [standard]
+ & \ccode{esl\_msa\_Write()} \\
+
+\ccode{\_Encode}
+ & Convert a user-readable string (such as ``fasta'') to an
+ internal Easel code (such as \ccode{eslSQFILE\_FASTA}).
+ & [standard]
+ & \ccode{esl\_msa\_EncodeFormat()} \\
+
+\ccode{\_Decode}
+ & Convert an internal Easel code (such as \ccode{eslSQFILE\_FASTA})
+ to a user-readable string (such as ``fasta'').
+ & [standard]
+ & \ccode{esl\_msa\_DecodeFormat()} \\
+\end{tabular}
+\end{minipage}
+\caption{\textbf{Standard function ``interfaces''.} }
+\end{table}
+
+
+%%%%%%%%%%%%%%%%
+\subsection{Creating and destroying new objects}
+%%%%%%%%%%%%%%%%
+
+Most Easel objects are allocated and free'd by
+\ccode{\_Create()/\_Destroy()} interface. Creating an object often
+just means allocating space for it, so that some other routine can
+fill data into it. It does not necessarily mean that the object
+contains valid data.
+
+\begin{sreapi}
+\hypertarget{ifc:Create}
+{\item[\_Create(n)]}
+
+A \ccode{\_Create()} interface takes any necessary initialization or
+size information as arguments (there often aren't any), and it returns a
+pointer to the newly allocated object. If an (optional) number of
+elements \ccode{n} is provided, this specifies the number of elements
+that the object is going to contain (for a fixed-size object) or the
+initial allocation size (for a resizable object). In the event of any
+failure, the a \ccode{\_Create} procedure throws \ccode{NULL}.
+
+The internals of some resizeable objects have an \ccode{nredline}
+parameter that controls an additional memory management rule. These
+objects are allowed to grow to arbitrary size (either by doubling with
+\ccode{\_Grow} or by a specific allocation with \ccode{\_Reinit} or
+\ccode{\_GrowTo}) -- but when the object is reused for new data, they
+can be reallocated \emph{downward}, back to the redline
+limit. Specifically, if the allocation size exceeds \ccode{nredline},
+a \ccode{\_Reuse()} or \ccode{\_Reinit()} call will shrink the
+allocation back to the \ccode{nredline} limit. The idea is for a
+frequently-reused object to be able to briefly handle a rare
+exceptionally large problem, while not permanently committing the
+resizeable object to an extreme allocation size.
+
+At least one module (\ccode{esl\_tree}) allows for creating either a
+fixed-size or a resizeable object; in this case, there is a
+\ccode{\_CreateGrowable()} call for the resizeable version.
+
+\hypertarget{ifc:Destroy}
+{\item[\_Destroy(obj)]}
+A \ccode{\_Destroy()} interface takes an object pointer as an
+argument, and frees all the memory associated with it. A
+\ccode{\_Destroy} procedure returns \ccode{void} (there is no useful
+information to return about a failure; the only calls are to
+\ccode{free()} and if that fails, we're in trouble).
+\end{sreapi}
+
+For example:
+\begin{cchunk}
+ ESL_SQ *sq;
+ sq = esl_sq_Create();
+ esl_sq_Destroy(sq);
+\end{cchunk}
+
+%%%%%%%%%%%%%%%%
+ \subsubsection{opening and closing input streams}
+%%%%%%%%%%%%%%%%
+
+Some objects (such as \ccode{ESL\_SQFILE} and \ccode{ESL\_MSAFILE})
+correspond to open input streams -- usually an open file, but possibly
+reading from a pipe. Such objects are \ccode{\_Open()}'ed and
+\ccode{\_Close()'d}, not created and destroyed.
+
+Input stream objects have to be capable of handling normal failures,
+because of bad user input. Input stream objects contain an
+\ccode{errbuf[eslERRBUFSIZE]} field to capture informative parse error
+messages.
+
+\begin{sreapi}
+\hypertarget{ifc:Open}
+{\item[\_Open(file, formatcode, \&ret\_obj)]}
+
+Opens the \ccode{file}, which is in a format indicated by
+\ccode{formatcode} for reading; return the open input object in
+\ccode{ret\_obj}. A \ccode{formatcode} of 0 typically means unknown,
+in which case the \ccode{\_Open()} procedure attempts to autodetect
+the format. If the \ccode{file} is \ccode{"-"}, the object is
+configured to read from the \ccode{stdin} stream instead of opening a
+file. If the \ccode{file} ends in a \ccode{.gz} suffix, the object is
+configured to read from a pipe from \ccode{gzip -dc}. Returns
+\ccode{eslENOTFOUND} if \ccode{file} cannot be opened, and
+\ccode{eslEFORMAT} if autodetection is attempted but the format cannot
+be determined.
+
+Newer \ccode{\_Open} procedures return a standard Easel error code,
+and on a normal error they also return the allocated object, using the
+object's error message buffer to report the reason for the failed
+open.
+
+\hypertarget{ifc:Close}
+{\item[\_Close(obj)]}
+
+Closes the input stream \ccode{obj}. Should return a standard Easel
+error code. There are cases where an error in an input stream is only
+detected at closing time (inputs using \ccode{popen()}/\ccode{pclose()}
+ are an example).
+\end{sreapi}
+
+For example:
+\begin{cchunk}
+ char *seqfile = "foo.fa";
+ ESL_SQFILE *sqfp;
+
+ esl_sqio_Open(seqfile, eslSQFILE_FASTA, NULL, &sqfp);
+ esl_sqio_Close(sqfp);
+\end{cchunk}
+
+
+%%%%
+ \subsubsection{making copies of objects}
+%%%%
+
+\begin{sreapi}
+
+\hypertarget{ifc:Clone}
+{\item[\_Clone(obj)]}
+
+Creates and returns a pointer to a duplicate of \ccode{obj}.
+Equivalent to (and is a shortcut for, and is generally implemented as)
+\ccode{dest = \_Create(); \_Copy(src, dest)}. Caller is responsible
+for free'ing the duplicate object, just as if it had been
+\ccode{\_Create}'d. Throws \ccode{NULL} if allocation fails.
+
+
+\hypertarget{ifc:Copy}
+{\item[\_Copy(src, dest)]}
+
+Copies \ccode{src} object into \ccode{dest}, where the caller has
+already created an appropriately allocated and empty \ccode{dest}
+object (or buffer, or whatever). Returns \ccode{eslOK} on success;
+throws \ccode{eslEINCOMPAT} if the objects are not compatible (for
+example, two matrices that are not the same size).
+
+Note that the order of the arguments is always \ccode{src}
+$\rightarrow$ \ccode{dest} (unlike the C library's \ccode{strcpy()}
+convention, which is the opposite order).
+
+
+\hypertarget{ifc:Shadow}
+{\item[\_Shadow(obj)]}
+
+Creates and returns a pointer to a partial, dependent copy of
+\ccode{obj}. Shadow creation arises in multithreading, when threads
+can share some but not all internal object data. A shadow keeps
+constant data as pointers to the original object. The object needs to
+know whether it is a shadow or not, so that <_Destroy()> works
+properly on both the original and its shadows.
+
+\end{sreapi}
+
+%%%%%%%%%%%%%%%%
+ \subsection{Managing memory allocation}
+%%%%%%%%%%%%%%%%
+
+%%%%
+ \subsubsection{resizable objects}
+%%%%
+
+Some objects need to be reallocated and expanded during their use.
+These objects are called \esldef{resizable}.
+
+In some cases, the whole purpose of the object is to have elements
+added to it, such as \ccode{ESL\_STACK} (pushdown stacks) and
+\ccode{ESL\_HISTOGRAM} (histograms). In these cases, the normal
+\ccode{\_Create()} interface performs an initial allocation, and the
+object keeps track of both its current contents size (often
+\ccode{obj->N}) and the current allocation size (often
+\ccode{obj->nalloc}).
+
+In at least one case, an object might be either growable or not,
+depending on how it's being used. This happens, for instance, when we
+have routines for parsing input data to create a new object, and we
+need to dynamically reallocate as we go because the input doesn't tell
+us the total size when we start. For instance, with \ccode{ESL\_TREE}
+(phylogenetic trees), sometimes we know exactly the size of the tree
+we need to create (because we're making a tree ourselves), and
+sometimes we need to create a resizable object (because we're reading a
+tree from a file). In these cases, the normal \ccode{\_Create()}
+interface creates a static, nongrowable object of known size, and a
+\ccode{\_CreateGrowable()} interface specifies an initial allocation
+for a resizable object.
+
+Easel usually handles its own reallocation of resizable objects. For
+instance, many resizable objects have an interface called something
+like \ccode{\_Add()} or \ccode{\_Push()} for storing the next element
+in the object, and this interface will deal with increasing allocation
+size as needed. In a few cases, a public \ccode{\_Grow()} interface
+is provided for reallocating an object to a larger size, in cases
+where a caller might need to grow the object itself. \ccode{\_Grow()}
+only increases an allocation when it is necessary, and it makes that
+check immediately and efficiently, so that a caller can call
+\ccode{\_Grow()} before every attempt to add a new element without
+worrying about efficiency. An example of where a public
+\ccode{\_Grow()} interface is generally provided is when an object
+might be input from different file formats, and an application may
+need to create its own parser. Although creating an input parser
+requires familiarity with the Easel object's internal data structures,
+at least the \ccode{\_Grow()} interface frees the caller from having
+to understand its memory management.
+
+Resizable objects necessarily waste some memory, because they are
+overallocated in order to reduce the number of calls to
+\ccode{malloc()}. The wastage is bounded (to a maximum of two-fold,
+for the default doubling strategies, once an object has exceeded its
+initial allocation size) but nonetheless may not always be tolerable.
+
+In summary:
+
+\begin{sreapi}
+\hypertarget{ifc:Grow}
+{\item[\_Grow(obj)]}
+
+A \ccode{\_Grow()} function checks to see if \ccode{obj} can hold
+another element. If not, it increases the allocation, according to
+internally stored rules on reallocation strategy (usually, by
+doubling).
+\end{sreapi}
+
+\begin{sreapi}
+\hypertarget{ifc:GrowTo}
+{\item[\_GrowTo(obj, n)]}
+
+A \ccode{\_GrowTo()} function checks to see \ccode{obj} is large
+enough to hold \ccode{n} elements. If not, it reallocates to at least
+that size.
+\end{sreapi}
+
+%%%%
+ \subsubsection{reusable objects}
+%%%%
+
+Memory allocation is computationally expensive. An application needs
+to minimize \ccode{malloc()/free()} calls in performance-critical
+regions. In loops where one \ccode{\_Destroy()}'s an old object only
+to \ccode{\_Create()} the next one, such as a sequential input loop
+that processes objects from a file one at a time, one generally wants
+to \ccode{\_Reuse()} the same object instead:
+
+\begin{sreapi}
+\hypertarget{ifc:Reuse}
+{\item[\_Reuse(obj)]}
+
+A \ccode{\_Reuse()} interface takes an existing object and
+reinitializes it as a new object, while reusing as much memory as
+possible. Any state information that was specific to the problem the
+object was just used for is reinitialized. Any allocations and state
+information specific to those allocations are preserved (to the extent
+possible). A \ccode{\_Reuse()} call should exactly replace (and be
+equivalent to) a \ccode{\_Destroy()/\_Create()} pair. If the object is
+growable, it typically would keep the last allocation size, and it
+must keep at least the same allocation size that a default
+\ccode{\_Create()} call would give.
+
+If the object is arbitrarily resizeable and it has a \ccode{nredline}
+control on its memory, the allocation is shrunk back to
+\ccode{nredline} (which must be at least the default initial
+allocation).
+
+\end{sreapi}
+
+For example:
+
+\begin{cchunk}
+ ESL_SQFILE *sqfp;
+ ESL_SQ *sq;
+
+ esl_sqfile_Open(\"foo.fa\", eslSQFILE_FASTA, NULL, &sqfp);
+ sq = esl_sq_Create();
+ while (esl_sqio_Read(sqfp, sq) == eslOK)
+ {
+ /* do stuff with this sq */
+ esl_sq_Reuse(sq);
+ }
+ esl_sq_Destroy(sq);
+\end{cchunk}
+
+%%%%
+ \subsubsection{other}
+%%%%
+\begin{sreapi}
+\hypertarget{ifc:Sizeof}
+{\item[size\_t \_Sizeof(obj)]}
+
+Returns the total size of an object and its allocations, in bytes.
+\end{sreapi}
+
+
+%%%%%%%%%%%%%%%%
+ \subsection{Accessing information in objects}
+%%%%%%%%%%%%%%%%
+
+\begin{sreapi}
+
+\hypertarget{ifc:Is}
+{\item[\_Is*(obj)]}
+
+Performs some specific test of the internal state of an
+object, and returns \ccode{TRUE} or \ccode{FALSE}.
+
+\hypertarget{ifc:Get}
+{\item[value = \_Get*(obj, ...)]}
+
+Retrieves some specified data from \ccode{obj} and returns it
+directly. Because no error code can be returned, a \ccode{\_Get}
+call must be a simple access call within the object, guaranteed to
+succeed. \ccode{\_Get()} methods may often be implemented as macros.
+(\ccode{\_Read} or \ccode{\_Fetch} interfaces are for more complex
+access methods that might fail, and require an error code return.)
+
+\hypertarget{ifc:Read}
+{\item[\_Read*(obj, ..., \&ret\_value)]}
+
+Retrieves some specified data from \ccode{obj} and puts it in
+\ccode{ret\_value}, where caller has provided (and already allocated,
+if needed) the space for \ccode{ret\_value}.
+
+\hypertarget{ifc:Fetch}
+{\item[\_Fetch*(obj, ..., \&ret\_value)]}
+
+Retrieves some specified data from \ccode{obj} and puts it in
+\ccode{ret\_value}, where space for the returned value is allocated by
+the function. Caller becomes responsible for free'ing that space.
+
+\hypertarget{ifc:Set}
+{\item[\_Set*(obj, value)]}
+
+Sets some value(s) in \ccode{obj} to \ccode{value}. If a value was
+already set, it is replaced with the new one. If any memory needs to
+be reallocated or free'd, this is done. \ccode{\_Set} functions have
+some appropriate longer name, like \ccode{\_SetZero()} (set something
+in an object to zero(s)), or \ccode{esl\_dmatrix\_SetIdentity()} (set
+a dmatrix to an identity matrix).
+
+\hypertarget{ifc:Format}
+{\item[\_Format*(obj, fmtstring, ...)]}
+
+Like \ccode{\_Set}, but with \ccode{sprintf()}-style semantics. Sets
+some string value in \ccode{obj} according to the
+\ccode{sprintf()}-style \ccode{fmtstring} and any subsequence
+\ccode{sprintf()}-style arguments. If a value was already set, it is
+replaced with the new one. If any memory needs to be reallocated or
+free'd, this is done. \ccode{\_Format} functions have some
+appropriate longer name, like
+\ccode{esl\_msa\_FormatSeqDescription()}.
+
+Because \ccode{fmtstring} is a \ccode{printf()}-style format string,
+it must not contain '\%' characters. \ccode{\_Format*} functions
+should only be used with format strings set by a program; they should
+not be used to copy user input that might contain '\%' characters.
+\end{sreapi}
+
+
+%%%%%%%%%%%%%%%%
+\subsection{Debugging, testing, development}
+%%%%%%%%%%%%%%%%
+
+\begin{sreapi}
+\hypertarget{ifc:Validate}
+{\item[\_Validate*(obj, errbuf...)]}
+
+Checks that the internals of \ccode{obj} are all right. Returns
+\ccode{eslOK} if they are, and returns \ccode{eslFAIL} if they
+aren't. Additionally, if the caller provides a non-\ccode{NULL}
+message buffer \ccode{errbuf}, on failure, an informative message
+describing the reason for the failure is formatted and left in
+\ccode{errbuf}. If the caller provides this message buffer, it must
+allocate it for at least \ccode{eslERRBUFSIZE} characters.
+
+Failures in \ccode{\_Validate()} routines are handled by
+\ccode{ESL\_FAIL()} (or \ccode{ESL\_XFAIL()}, if the validation
+routine needs to do any memory cleanup). Validation failures are
+classified as normal (returned) errors so that \ccode{\_Validate()}
+routines can be used in production code -- for example, to validate
+user input.
+
+At the same time, because the \ccode{ESL\_FAIL()} and
+\ccode{ESL\_XFAIL()} macros call the stub \ccode{esl\_fail()}, you can
+set a debugging breakpoint on \ccode{esl\_fail} to get a
+\ccode{\_Validate()} routine fail immediately at whatever test
+failed.
+
+The \ccode{errbuf} message therefore can be coarse-grained
+(``validation of object X failed'') or fine-grained (``in object X,
+data element Y fails test Z''). A validation of user input (which we
+expect to fail often) should be fine-grained, to return maximally
+useful information about what the user did wrong. A validation of
+internal data can be very coarse-grained, knowing that a developer can
+simply set a breakpoint in \ccode{esl\_fail()} to get at exactly where
+a validation failed.
+
+A \ccode{\_Validate()} function is not intended to test all possible
+invalid states of an object, even if that were feasible. Rather, the
+goal is to automatically catch future problems we've already seen in
+past debugging and testing. So a \ccode{\_Validate()} function is a
+place to systematically organize a set of checks that essentially
+amount to regression tests against past debugging/testing efforts.
+
+\hypertarget{ifc:Compare}
+{\item[\_Compare*(obj1, obj2...)]}
+
+Compares \ccode{obj1} to \ccode{obj2}. Returns \ccode{eslOK} if the
+contents are judged to be identical, and \ccode{eslFAIL} if they
+differ. When the comparison involves floating point scalar
+comparisons, a fractional tolerance argument \ccode{tol} is also
+passed.
+
+Failures in \ccode{\_Compare()} functions are handled by
+\ccode{ESL\_FAIL()} (or \ccode{ESL\_XFAIL()}, if the validation
+routine needs to do any memory cleanup), because they may be used in a
+context where a ``failure'' is expected; for example, when using
+\ccode{esl\_dmatrix\_Compare()} as a test for successful convergence
+of a matrix algebra routine.
+
+However, the main use of \ccode{\_Compare()} functions is in unit
+tests. During debugging and development, we want to see exactly where
+a comparison failed, and we don't want to have to write a bunch
+laboriously informative error messages to get that information.
+Instead we can exploit the fact that the \ccode{ESL\_FAIL()} and
+\ccode{ESL\_XFAIL()} macros call the stub \ccode{esl\_fail()}; you can
+set a debugging breakpoint in \ccode{esl\_fail()} to stop execution in
+the failure macros.
+
+\hypertarget{ifc:Dump}
+{\item[\_Dump*(FILE *fp, obj...)]}
+
+Prints the internals of an object in human-readable, easily parsable
+tabular ASCII form. Useful during debugging and development to view
+the entire object at a glance. Returns \ccode{eslOK} on success.
+Unlike a more robust \ccode{\_Write()} call, \ccode{\_Dump()} call may
+assume that all its writes will succeed, and does not need to check
+return status of \ccode{fprintf()} or other system calls, because it
+is not intended for production use.
+
+
+\hypertarget{ifc:TestSample}
+{\item[\_TestSample(ESL\_RANDOMNESS *rng, ..., OBJTYPE **ret\_obj)]}
+
+Create an object filled with randomly sampled values for all data
+elements. The aim is to exercise valid values and ranges, and
+presence/absence of optional information and allocations, but not to
+obsess about internal semantic consistency. For example, we use
+\ccode{\_TestSample()} calls in testing MPI send/receive
+communications routines, where we don't care so much about the meaning
+of the object's contents, as we do about faithful transmission of any
+object with valid contents.
+
+A \ccode{\_TestSample()} call produces an object that is sufficiently
+valid for other debugging tools, including \ccode{\_Dump()},
+\ccode{\_Compare()}, and \ccode{\_Validate()}. However, because
+elements may be randomly sampled independently, in ways that don't
+respect interdependencies, the object may contain data inconsistencies
+that make the object invalid for other purposes. Contrast
+\ccode{\_Sample()} routines, which generate fully valid objects for
+all purposes, but which may not exercise the object's fields as
+thoroughly.
+
+\end{sreapi}
+
+%%%%%%%%%%%%%%%%
+\subsection{Miscellaneous other interfaces}
+%%%%%%%%%%%%%%%%
+
+\begin{sreapi}
+\hypertarget{ifc:Write}
+{\item[\_Write(fp, obj)]}
+Writes something from an object to an output stream \ccode{fp}. Used
+for exporting and saving files in official data exchange formats.
+\ccode{\_Write()} functions must be robust to system write errors,
+such as filling or unexpectedly disconnecting a disk. They must check
+return status of all system calls, and throw an \ccode{eslEWRITE}
+error on any failures.
+
+
+
+
+\hypertarget{ifc:Encode}
+{\item[code = \_Encode*(char *s)]}
+
+Given a string \ccode{<s>}, match it case-insensitively against a list
+of possible string values and convert this visible representation to
+its internal \ccode{\#define} or \ccode{enum} code. For example,
+\ccode{esl\_sqio\_EncodeFormat("fasta")} returns
+\ccode{eslSQFILE\_FASTA}. If the string is not recognized, returns a
+code signifying ``unknown''. This needs to be a normal return (not a
+thrown error) because the string might come from user input, and might
+be invalid.
+
+
+\hypertarget{ifc:Decode}
+{\item[char *s = \_Decode*(int code)]}
+
+Given an internal code (an \ccode{enum} or \ccode{\#define} constant),
+return a pointer to an informative string value, for diagnostics and
+other output. The string is static. If the code is not recognized,
+throws an \ccode{eslEINVAL} exception and returns \ccode{NULL}.
+
+\end{sreapi}
+
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Writing unit tests}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+An Easel test driver runs a set of individual unit tests one after
+another. Sometimes there is one unit test assigned to each exposed
+function in the API. Sometimes, it makes sense to test several exposed
+functions in a single unit test function.
+
+A unit test for \ccode{esl\_foo\_Baz()} is named \ccode{static void
+utest\_Baz()}.
+
+Upon success, unit tests return void.
+
+Upon any failure, a unit test calls \ccode{esl\_fatal()} with an error
+message, and terminates. It should not use any other error-catching
+mechanism. It aids debugging if the test program terminates
+immediately, using a single function that we can easily breakpoint at
+(\ccode{break esl\_fatal} in GDB). It must not use \ccode{abort()},
+for example, because this will screw up the output of scripts running
+automated tests in \ccode{make check} and \ccode{make dcheck}, such as
+\emcode{sqc}. \emcode{sqc} traps \ccode{stderr} from
+\ccode{esl\_fatal()} correctly. A unit test must not use
+\ccode{exit(1)} either, because that leaves no error message, so
+someone running a test program on the command line can't easily tell
+that it failed.
+
+Unit tests should attempt to deliberately generate exceptions and
+failures, and test that the appropriate error code is returned. Unit
+tests must temporarily register a nonfatal error handler when testing
+exceptions.
+
+Unit tests should test all possible combinations of augmentations that
+may affect a function.
+
+Every function, procedure, and macro in the exposed API shall be
+tested by one or more unit tests. The unit tests aim for complete code
+coverage. This is measured by code coverage tests using \ccode{gcov}.
+
+Write unit tests. Remember that the purpose isn't so much to test
+whether your code works; the purpose is to test whether your code
+\emph{still} works, months or years from now when someone who didn't
+take the time to understand it fully has to make modifications. If
+that someone breaks your code and the unit tests fail, they know they
+need to do more. If someone breaks your code and the unit tests don't
+help them notice, it's your fault as much as theirs.
+
+
+%%%%%%%%%%%%%%%%
+\subsection{Using statistical sampling or randomization in unit tests}
+%%%%%%%%%%%%%%%%
+% First instituted in stats: SRE, Sun May 27 09:31:12 2007
+
+Some routines are tested on statistical samples. For example, we test
+a maximum likelihood parameter fitting routine by fitting to samples
+generated with known parameters, and testing that the estimated
+parameters are close enough to the true parameters. The trouble is
+defining ``close enough''. There is always a finite probability that
+such a test will fail. We don't want tests to fail due to expected
+statistical deviations, but neither do we want to set p-values so
+loose that a flaw escapes notice.
+
+Easel tests drivers that use statistical sampling assign a
+\emph{fixed} random number seed by default, to make the statistical
+sample invariant across runs. This makes statistical tests more like
+regression tests. Manually, we use the test driver to determine that
+the test passes; in subsequent automatic use, we just check that we
+get the same answer.
+
+To facilitate the manual testing phase, these test drivers often take
+optional arguments. A \ccode{-v} option toggles verbose mode, so unit
+tests display internal information. A \ccode{-r} option toggles
+``random'' mode, seeding the random number generator with the current
+time. A \ccode{-s <n>} option sets the random number seed to
+\ccode{<n>}.
+
+%%%%%%%%%%%%%%%%
+\subsection{Using temporary files in unit tests}
+%%%%%%%%%%%%%%%%
+
+If a unit test or testdriver needs to create a named temporary file
+(to test i/o), the tmpfile is created with
+\ccode{esl\_tmpfile\_named()}:
+
+\begin{cchunk}
+ char tmpfile[16] = "esltmpXXXXXX";
+ FILE *fp;
+
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal("failed to create tmpfile");
+ write_stuff_to(fp);
+ fclose(fp);
+
+ if ((fp = fopen(tmpfile)) == NULL) esl_fatal("failed to open tmpfile");
+ read_stuff_from(fp);
+ fclose(fp);
+
+ remove(tmpfile);
+\end{cchunk}
+
+Thus tmp files created by Easel's test suite have a common naming
+convention, and are put in the current working directory. On a test
+failure, the tmp file remains, to assist debugging; on a test success,
+the tmp file is removed. The \ccode{make clean} targets in Makefiles
+are looking to remove files matching the target \ccode{esltmp??????}.
+
+It is important to declare it as \ccode{char tmpfile[16]} rather than
+\ccode{char *tmpfile}. Compilers are allowed to treat the string in a
+\ccode{char *foo = "bar"} initialization as a read-only constant.
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Easel development environment; using development tools}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Easel is developed primarily on GNU/Linux and Mac OS/X systems with
+the following tools installed:
+
+\begin{tabular}{ll}
+{\bfseries Tool} & {\bfseries Use} \\
+\emcode{emacs} & editor \\
+\emcode{gcc} & GNU compiler \\
+\emcode{icc} & Intel compiler \\
+\emcode{gdb} & debugger\\
+\emcode{autoconf} & platform-independent configuration manager, Makefile generator\\
+\emcode{make} & build/compilation management\\
+\emcode{valgrind} & memory bounds and leak checking\\
+\emcode{gcov} & code coverage analysis\\
+\emcode{gprof} & profiling and optimization (GNU)\\
+\emcode{shark} & profiling and optimization (Mac OS/X)\\
+\LaTeX & documentation typesetting\\
+Subversion & revision control\\
+Bourne shell (\ccode{/bin/sh}) & scripting\\
+Perl & scripting\\
+\end{tabular}
+
+Most of these are standard and well-known. The following sections
+describe some Easel work patterns with some of the less commonly used
+tools.
+
+%%%%%%%%%%%%%%%%
+\subsection{Using valgrind to find memory leaks and more}
+%%%%%%%%%%%%%%%%
+
+We use \emcode{valgrind} to check for memory leaks and other problems,
+especially on the unit tests:
+
+\begin{cchunk}
+ % valgrind ./esl_buffer_utest
+\end{cchunk}
+
+The \ccode{valgrind\_report.pl} script in \ccode{testsuite} automates
+valgrind testing for all Easel modules. To run it:
+
+\begin{cchunk}
+ % cd testsuite
+ % ./valgrind_report.pl > valgrind.report
+\end{cchunk}
+
+
+
+
+%%%%%%%%%%%%%%%%
+\subsection{Using gcov to measure unit test code coverage}
+%%%%%%%%%%%%%%%%
+
+We use \emcode{gcov} to measure code coverage of our unit
+testing. \emcode{gcov} works best with unoptimized code. The code
+must be compiled with \emcode{gcc} and it needs to be compiled with
+\ccode{-fprofile-arcs -ftest-coverage}. The configure script knows
+about this: give it the \ccode{--enable-gcov} option. An example:
+
+\begin{cchunk}
+ % make distclean
+ % ./configure --enable-gcov
+ % make esl_buffer_utest
+ % ./esl_buffer_utest
+ % gcov esl_buffer.c
+ File 'esl_buffer.c'
+ Lines executed:73.85% of 589
+ esl_buffer.c:creating 'esl_buffer.c.gcov'
+ % emacs esl_buffer.c.gcov
+\end{cchunk}
+
+The file \ccode{esl\_buffer.c.gcov} contains an annotated source listing
+of the \ccode{.c} file, showing which lines were and weren't covered
+by the test suite.
+
+The \ccode{coverage\_report.pl} script in \ccode{testsuite} automates coverage
+testing for all Easel modules. To run it:
+
+\begin{cchunk}
+ % cd testsuite
+ % coverage_report.pl > coverage.report
+\end{cchunk}
+
+
+%%%%%%%%%%%%%%%%
+\subsection{Using gprof for performance profiling}
+%%%%%%%%%%%%%%%%
+
+On a Linux machine (gprof does not work on Mac OS/X, apparently):
+
+\begin{cchunk}
+ % make distclean
+ % ./configure --enable-gprof
+ % make
+\end{cchunk}
+
+Run any program you want to profile, then:
+
+\begin{cchunk}
+ % gprof -l <progname>
+\end{cchunk}
+
+%%%%%%%%%%%%%%%%
+\subsection{Using the clang static analyzer, checker}
+%%%%%%%%%%%%%%%%
+
+The clang static analyzer for Mac OS/X is at
+\url{http://clang-analyzer.llvm.org/}. I install it by moving its
+entire distro directory (checker-276, for example) to
+\ccode{/usr/local}, and symlinking to \ccode{checker}.
+My \ccode{bashrc} has:
+
+\begin{cchunk}
+test -d /usr/local/checker && PATH=${PATH}:/usr/local/checker
+\end{cchunk}
+
+and that puts \prog{scan-build} in my \ccode{PATH}.
+
+To use it:
+
+\begin{cchunk}
+ % scan-build ./configure --enable-debugging
+ % scan-build make
+\end{cchunk}
+
+It'll give you a scan-view command line, including the name of its
+output html file, so you can then visualize and interact with the
+results:
+
+\begin{cchunk}
+ % scan-view /var/folders/blah/baz/foo
+\end{cchunk}
+
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Documentation}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%
+\subsection{Structured function headers read by autodoc}
+%%%%%%%%%%%%%%%%
+The documentation for Easel's functions is embedded in the source code
+itself, rather than being in separate files. A homegrown documentation
+extraction tool (\prog{autodoc}) is used to process the source files
+and extract and format the documentation.
+
+An important part of the documentation is the documentation for
+individual functions. Each Easel function is preceded by
+documentation in the form of a structured comment header that is
+parsed by \prog{autodoc}. For example:
+
+\input{cexcerpts/function_comment_example}
+
+\prog{autodoc} can do one of three things with the text that follows
+these tags: it can ignore it, use it verbatim, or process
+it. \esldef{Ignored} text is documentation that resides only in the
+source code, like the incept date and the notebook
+crossreferences.\footnote{Eventually, we will probably process the
+\ccode{Args:} part of the header, but for now it is ignored.}
+\esldef{Verbatim} text is picked up by \prog{autodoc} and formatted as
+\verb+\ccode{}+ in the \LaTeX\ documentation. \esldef{Processed} text
+is interpeted as \LaTeX\ code, with a special addition that angle
+brackets are used to enclose C code words, such as the argument names.
+\prog{autodoc} recognizes the angle brackets and formats the enclosed
+text as \verb+\ccode{}+. Unprotected underscore characters are
+allowed inside these angle brackets; \prog{autodoc} protects them
+appropriately when it generates the \LaTeX. Citations, such as
+\verb+\citep{MolerVanLoan03}+, are formatted for the \LaTeX\
+\verb+natbib+ package.
+
+The various fields are:
+
+\begin{sreitems}{\textbf{Function:}}
+\item[\textbf{Function:}]
+ The name of the function. \prog{autodoc} uses this line to
+ determine that it's supposed to generate a documentation entry here.
+ \prog{autodoc} checks that it matches the name of the immediately
+ following C function. One line; verbatim; required.
+
+\item[\textbf{Synopsis:}]
+ A short one-line summary of the function. \ccode{autodoc -t} uses this
+ line to generate the API summary tables that appear in this guide.
+ One line; processed; not required for \prog{autodoc} itself, but
+ required by \ccode{autodoc -t}.
+
+\item[\textbf{Incept:}] Records the author/date of first
+ draft. \prog{autodoc} doesn't use this line. Used to help track
+ development history. The definition of ``incept'' is often fuzzy,
+ because Easel is a palimpsest of rewritten code. This line often
+ also includes a location, such as \ccode{[AA 673 over Greenland]},
+ for no reason other than to remember how many weird places I've
+ managed to get work done in..
+
+\item[\textbf{Purpose:}] The main body. \prog{autodoc} processes this
+ to produce the \TeX documentation. It explains the purpose of the
+ function, then precisely defines what the caller must provide in
+ each input argument, and what the caller will get back in each
+ output argument. It should be written and referenced as if it will
+ appear in the user guide (because it will). Multiline; processed by
+ \prog{autodoc}; required.
+
+\item[\textbf{Args:}] A tabular-ish summary of each argument. Not
+ picked up by \prog{autodoc}, at least not at present. The
+ \ccode{Purpose:} section instead documents each option in free text.
+ Multiline and tabular-ish; ignored by \prog{autodoc}; optional.
+
+\item[\textbf{Returns:}] The possible return values from the function,
+ starting with what happens on successful completion (usually, return
+ of an \ccode{eslOK} code). Also indicates codes for unsuccessful
+ calls that are normal (returned) errors. If there are output
+ argument pointers, documents what they will contain upon successful
+ and unsuccessful return, and whether any of the output involved
+ allocating memory that the caller must free.
+
+\item[\textbf{Throws:}] The possible exceptions thrown by the
+ function, listing what a program that's handling its own exceptions
+ will have to deal with. (Programs should never assume that this list
+ is complete.) Programs that are letting Easel handle exceptions do
+ not have to worry about any of the thrown codes. The state of
+ output argument pointers is documented -- generally, all output is
+ set to \ccode{NULL} or \ccode{0} values when exceptions happen.
+ After a thrown exception, there is never any memory allocation in
+ output pointers that the caller must free.
+
+\item[\textbf{Xref:}] Crossreferences to notebooks (paper or
+ electronic) and to literature, to help track the history of the
+ function's development and rationale.\footnote{A typical reference
+ to one of SRE's notebooks is \ccode{STL10/143}, indicating St. Louis
+ notebook 10, page 143.} Personal developer notebooks are of course
+ not immediately available to all developers (especially bound paper
+ ones) but still, these crossreferences can be traced if necessary.
+\end{sreitems}
+
+\subsection{cexcerpt - extracting C source snippets}
+
+The \prog{cexcerpt} program extracts snippets of C code verbatim from
+Easel's C source files.
+
+The \ccode{documentation/Makefile} runs \prog{cexcerpt} on every
+module .c and .h file. The extracted cexcerpts are placed in .tex
+files in the temporary \ccode{cexcerpts/} subdirectory.
+
+Usage: \ccode{cexcerpt <file.c> <dir>}. Processes C source file
+\ccode{file.c}; extracts all tagged excerpts, and puts them in a file
+in directory \ccode{<dir>}.
+
+An excerpt is marked with special comments in the C file:
+\begin{cchunk}
+/*::cexcerpt::my_example::begin::*/
+ while (esl_sq_Read(sqfp, sq) == eslOK)
+ { n++; }
+/*::cexcerpt::my_example::end::*/
+\end{cchunk}
+
+The cexcerpt marker's format is \ccode{::cexcerpt::<tag>::begin::} (or
+end). A comment containing a cexcerpt marker must be the first text on
+the source line. A cexcerpt comment may be followed on the line by
+whitespace or a second comment.
+
+The \ccode{<tag>} is used to construct the file name, as
+\ccode{<tag>.tex}. In the example, the tag \ccode{my\_example} creates
+a file \ccode{my\_example.tex} in \ccode{<dir>}.
+
+All the text between the cexcerpt markers is put in the file. In
+addition, this text is wrapped in a \ccode{cchunk} environment. This
+file can then be included in a \LaTeX\ file.
+
+For best results, the C source should be free of TAB characters.
+"M-x untabify" on the region to clean them out.
+
+Cexcerpts can't overlap or nest in any way in the C file. Only one tag
+can be active at a time.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{The .tex file}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Portability notes}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Easel is intended to be widely portable. We adhere to the ANSI C99
+standard. Any dependency on higher-level functionality (including
+POSIX, X/Open, or system-specific stuff) is optional, and Easel is
+capable of working around its absence at compile-time.
+
+Although we do not currently include Windows machines in our
+development environment, we are planning for the day when we do. Easel
+should not include any required UNIX-specific code that wouldn't port
+to Windows.\footnote{Though it probably does, which we'll discover
+ when we first try to compile for Windows.}
+
+
+% xref J7/83.
+\paragraph{Why not define \ccode{\_POSIX\_C\_SOURCE}?} You might think
+it would be a good idea to define \ccode{\_POSIX\_C\_SOURCE} to
+\ccode{200112L} or some such, to try to enforce the portability of our
+POSIX-dependent code. This doesn't work; don't do it. According to
+the standards, if you define \ccode{\_POSIX\_C\_SOURCE}, the host must
+\emph{disable} anything that's \emph{not} in the POSIX
+standard. However, Easel \emph{is} allowed to optionally use
+system-dependent non-POSIX code. A good example is
+\ccode{esl\_threads.c::esl\_threads\_CPUCount()}. There is no
+POSIX-compliant way to check for the number of available processors on
+a system.\footnote{Apparently the POSIX threads standards committee
+ intends it that way; see
+ \url{http://ansi.c.sources.free.fr/threads/butenhof.txt}.}
+Easel's implementation tries to find one of several system-specific
+alternatives, including the non-POSIX function \ccode{sysctl{}}.
+
+
+
+
diff --git a/documentation/copyright.tex b/documentation/copyright.tex
new file mode 100644
index 0000000..d0917cb
--- /dev/null
+++ b/documentation/copyright.tex
@@ -0,0 +1,20 @@
+\vspace*{\fill}
+\begin{flushleft}
+Copyright (C) 2016 Howard Hughes Medical Institute.
+
+\vspace{2em}
+
+Easel is open source. Easel's source code and documentation are
+freely redistributable and modifiable under the terms of the Berkeley
+Software Distribution License (BSD 2 Clause;
+\url{https://opensource.org/licenses/BSD-2-Clause}).
+
+\end{flushleft}
+
+
+
+
+
+
+
+
diff --git a/documentation/doctricks.tex b/documentation/doctricks.tex
new file mode 100644
index 0000000..895d598
--- /dev/null
+++ b/documentation/doctricks.tex
@@ -0,0 +1,49 @@
+\section{Tricks used to produce the documentation}
+
+\subsection{autodoc - extraction of function documentation}
+
+
+\subsection{cexcerpt - extraction of verbatim code examples}
+
+This guide includes many examples of C code from Easel. These examples
+are extracted verbatim from C source files using SSDK's
+\prog{cexcerpt} program. The \prog{cexcerpt} program extracts tagged
+code chunks from a C source file for verbatim inclusion in LaTeX
+documentation.
+
+The \ccode{documentation/Makefile} runs \prog{cexcerpt} on every
+module .c and .h file. The cexcerpts are stored in the temporary
+\ccode{cexcerpts/} subdirectory.
+
+Usage: \ccode{cexcerpt <file.c> <dir>}. Processes C source file
+\ccode{file.c}; extracts all tagged excerpts, and puts them in a file
+in directory \ccode{<dir>}.
+
+An excerpt is marked with special comments in the C file:
+\begin{cchunk}
+/*::cexcerpt::my_example::begin::*/
+ while (esl_sq_Read(sqfp, sq) == eslOK)
+ { n++; }
+/*::cexcerpt::my_example::end::*/
+\end{cchunk}
+
+The cexcerpt marker's format is \ccode{::cexcerpt::<tag>::begin::} (or
+end). A comment containing a cexcerpt marker must be the first text on
+the source line. A cexcerpt comment may be followed on the line by
+whitespace or a second comment.
+
+The \ccode{<tag>} is used to construct the file name, as
+\ccode{<tag>.tex}. In the example, the tag \ccode{my\_example} creates
+a file \ccode{my\_example.tex} in \ccode{<dir>}.
+
+All the text between the cexcerpt markers is put in the file. In
+addition, this text is wrapped in a \ccode{cchunk} environment. This
+file can then be included in a \LaTeX\ file.
+
+For best results, the C source should be free of TAB characters.
+"M-x untabify" on the region to clean them out.
+
+Cexcerpts can't overlap or nest in any way in the C file. Only one can
+be active at any given time.
+
+
diff --git a/documentation/figures/evd_basic.pdf b/documentation/figures/evd_basic.pdf
new file mode 100644
index 0000000..55044ce
Binary files /dev/null and b/documentation/figures/evd_basic.pdf differ
diff --git a/documentation/figures/evd_location.pdf b/documentation/figures/evd_location.pdf
new file mode 100644
index 0000000..9dd1e9b
Binary files /dev/null and b/documentation/figures/evd_location.pdf differ
diff --git a/documentation/figures/evd_scale.pdf b/documentation/figures/evd_scale.pdf
new file mode 100644
index 0000000..4561412
Binary files /dev/null and b/documentation/figures/evd_scale.pdf differ
diff --git a/documentation/figures/gev_density.pdf b/documentation/figures/gev_density.pdf
new file mode 100644
index 0000000..e22b759
Binary files /dev/null and b/documentation/figures/gev_density.pdf differ
diff --git a/documentation/figures/gev_logdensity.pdf b/documentation/figures/gev_logdensity.pdf
new file mode 100644
index 0000000..c9885d7
Binary files /dev/null and b/documentation/figures/gev_logdensity.pdf differ
diff --git a/documentation/figures/rna_elements.ai b/documentation/figures/rna_elements.ai
new file mode 100644
index 0000000..346167c
--- /dev/null
+++ b/documentation/figures/rna_elements.ai
@@ -0,0 +1,851 @@
+%PDF-1.4
%����
+1 0 obj
<<
/Type /Catalog
/Pages 2 0 R
/Metadata 47 0 R
>>
endobj
2 0 obj
<<
/Type /Pages
/Kids [ 5 0 R ]
/Count 1
>>
endobj
3 0 obj
<<
/ModDate (D:20030327085622-06'00')
/CreationDate (D:20030327085620-05'00')
/Producer (Adobe PDF library 5.00)
/Creator (Adobe Illustrator 10.0)
>>
endobj
5 0 obj
<<
/Type /Page
/MediaBox [ 0 0 612 792 ]
/Parent 2 0 R
/PieceInfo << /Illustrator 7 0 R >>
/LastModified (D:20030327085620-05'00')
/ArtBox [ 107 312.92773 459.53711 477.16699 ]
/Group 38 0 R
/Thumb 39 0 R
/Contents 41 0 R
/Resources << /ColorSpace << /CS0 32 0 R /CS1 33 0 R >> /Font << /T1_0 34 0 R /T1_1 36 0 R >>
/ProcSet [ /PDF /Text ] >>
>>
endobj
7 0 obj
<<
/Private 8 0 R
/LastModified (D:20030327085620-05'00')
>>
endobj
8 0 obj
<<
/CreatorVersion 10
/ContainerVersion 9
/RoundtripVersion 10
/Options 9 0 R
/AIMetaData 10 0 R
/AIPrivateData1 11 0 R
/AIPrivateData2 12 0 R
/AIPrivateData3 14 0 R
/AIPrivateData4 16 0 R
/AIPrivateData5 18 0 R
/AIPrivateData6 20 0 R
/AIPrivateData7 22 0 R
/AIPrivateData8 24 0 R
/AIPrivateData9 26 0 R
/AIPrivateData10 28 0 R
/AIPrivateData11 30 0 R
/NumBlock 11
>>
endobj
9 0 obj
<<
/OptionSet 3
/Compatibility 5
/EmbedFonts true
/SubsetFontsBelow true
/SubsetFontsRatio 100
/Thumbnail false
/EmbedICCProfile true
/cCompression true
/cCompKind 3
/cCompQuality 2
/cResolution false
/cRes 300
/gCompression true
/gCompKind 3
/gCompQuality 2
/gResolution false
/gRes 300
/mCompression true
/mCompKind 3
/mResolution false
/mRes 1200
/CompressArt true
>>
endobj
10 0 obj
<< /Length 1144 >>
stream
+%!PS-Adobe-3.0
+%%Creator: Adobe Illustrator(R) 10.0
+%%AI8_CreatorVersion: 10.0
+%%For: (Sean R Eddy) (Washington University)
+%%Title: (Untitled-2)
+%%CreationDate: 3/27/03 8:56 AM
+%%BoundingBox: 107 312 460 478
+%%HiResBoundingBox: 107 312.9277 459.5371 477.167
+%%DocumentProcessColors: Black
+%AI5_FileFormat 6.0
+%AI3_ColorUsage: Color
+%AI7_ImageSettings: 0
+%%RGBProcessColor: 0 0 0 ([Registration])
+%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set)
+%%+ Options: 1 16 0 1 0 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4
+%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 ()
+%AI3_TemplateBox: 306.5 395.5 306.5 395.5
+%AI3_TileBox: 18 20 594 776
+%AI3_DocumentPreview: None
+%AI5_ArtSize: 612 792
+%AI5_RulerUnits: 2
+%AI9_ColorModel: 1
+%AI5_ArtFlags: 1 0 0 1 0 0 1 0 0
+%AI5_TargetResolution: 800
+%AI5_NumLayers: 1
+%AI9_OpenToView: -85 619 2 1578 917 26 0 1 10 73 0 0 1 1 1 0
+%AI5_OpenViewLayers: 7
+%%PageOrigin:18 20
+%%AI3_PaperRect:-18 776 594 -16
+%%AI3_Margin:18 -16 -18 16
+%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 1
+%%EndComments
+endstream
endobj
11 0 obj
<< /Length 6430 >>
stream
+%%BoundingBox: 107 312 460 478
+%%HiResBoundingBox: 107 312.9277 459.5371 477.167
+%AI7_Thumbnail: 128 60 8
+%%BeginData: 5978 Hex Bytes
+%0000330000660000990000CC0033000033330033660033990033CC0033FF
+%0066000066330066660066990066CC0066FF009900009933009966009999
+%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
+%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
+%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
+%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
+%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
+%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
+%6666006666336666666666996666CC6666FF669900669933669966669999
+%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
+%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
+%9933009933339933669933999933CC9933FF996600996633996666996699
+%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
+%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
+%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
+%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
+%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
+%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
+%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
+%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
+%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
+%000011111111220000002200000022222222440000004400000044444444
+%550000005500000055555555770000007700000077777777880000008800
+%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
+%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
+%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
+%524C45FDD2FFA8A8A87DFF7D527D7DA8A8FF7D52A8FFA8A87DFFA852FFFF
+%7DA8A87DFF7DA87D7DFFFFA87D527DFF52A87DFF7D52FD52FF7D7D7D527D
+%7D7D52FF7D7D52FF7D7D527DA852527D52FF527D7D7D527DA87D527D52FF
+%52FD067DFF527D52FD52FF5252527DA87D527DFF52527DFD0552FF527D52
+%52FFA8527D527D7D7D527D52A8FF7D5252527D527DFF7D5252FD6FFF7DA8
+%FD61FF7DFD7FFFA8FD34FF7D52FF52FD3DFF527DFF7DFD06FFA8FD34FF7D
+%7DFD3FFF7D7DFFA8FD05FFF852FD34FFA852A8A8FD3DFFA87DA87DFD05FF
+%277DFD37FFA8A8FD3FFFA87D7DA8A8A827FD3AFF527DFD3EFF7D527DFFFF
+%7DFD3AFF7D7DFD0BFFA87DA8FF7DFD2EFFA87D7DFFFFA8FD09FF7DA8FF7D
+%FD2DFF2752527DFD0AFF7DA8FFA8FD2EFF7D52277D7DA8FD09FFA87DFFA8
+%FD05FF52A8A8FF52FF7DFF7DFFFF7D7DFD04A87DFD18FF7D52FD09FFA87D
+%7DFD30FFA8FFFF527DA8FD09FF527DFD07FF7D7D7D527D7DFF527D52FF52
+%7D7D7D527DA87DFD17FF2752FD08FF52FD33FF7DFFFF5227A8FD07FF7DA8
+%FD09FF277D5252527D527D52A8FF7D527D5252527D7DFD18FFA87D52FFFF
+%FF5252A8FD34FFFD05A85252FFFFFF7D27A8FD10FFA87DA8FD08FF7DFD1A
+%FF7DFFFFFFA852FFA8FD39FF52FFFFFF7D7DFFA8FD09FFA87DFD2DFF7D52
+%FF27FF5227A8FD39FF527DA827A87D27FD08FFA87DFD7CFFA87DA8FD2FFF
+%527DFFFFFF7D52FD3AFF527DFFFFFF7D52FD05FFA8A8FD30FF7DFFA8A852
+%FF7DFD3AFF52FFA8FF52FF52FD04FF7DF8A8FD31FF7D527DFF7DFF7D7DFD
+%39FFA8527DA87DFF7D52FFFFA8F852A8FD39FF5252FD3EFF7D275252FD3B
+%FF7DFD14FFA87DA8FFA8FF7D7D7DFF7D7DFD04A87DA8FF7D7D7DFF7DFFA8
+%52FF7DA8A8FF7DFF7DFD09FF52FFA8A8FD10FF52A8FF7D7DFFA87DA8A87D
+%FFFF7DA8A8FF7DA87DFD17FF7D5252FD12FF7DA87D527D527D527DFF7DA8
+%7DA87D5252527DA852527D5252527DFF7D527D527D52FF7DFD08FF7D527D
+%7DFD10FF52527D527D52FF527D527D52FF527D527DA87DA87DFD2BFF7DFF
+%527D527D52527D7D527D7DFF5252FD087DA87D52FF7D7D527D527D52A8FD
+%08FF7DA87DA8FD10FF7D7D527D7D7DFF527D7D527DFF7D527D7D7D527D7D
+%FD10FF527DFFFFFF7D27FD35FF7DFD04FF5252FFA8FF5252FD1AFF7DFD0A
+%FF7DFD11FF7DFFA8FFF8FF7DFD3AFF7DFFFFA827FF7DFD38FFA8527DFFFF
+%FF7D52FD33FF7DA8FD04FF7D5252FFFFFF527DFD17FFA8FD1FFF7D27FD04
+%FF5252A8FD33FF7DFD04FFA827FFFFFFA85252FD17FF7DFD1FFF7D7D7DA8
+%7DFF7D52FD35FFF852FFFF7DA87DFF52FF527DFD16FF7DA8FD1FFF527D52
+%FF52FF527DFD35FF5227FFFF527D52FF52FF7D52FD16FF27F8FD5DFF7D52
+%A87DFD07FF7DA8A8FD13FF277DFD1EFF7D7DFD07FF527DFD35FF7D527D7D
+%A87DA87DA8A852527DFD13FF7DFD14FF527DFD09FF527DFD06FF52FFA8FD
+%05FFA87D27FF5252FD07FF5227FD17FF527DFD07FFA8A87D52FD06FF7DFF
+%A87DFD04FF7D52277D52277DFD05FFA827277DA87D7DFD11FF7D7DFD09FF
+%5252FD06FFA8527DFD05FF7DFFFFFF7DFD07FF7DFD19FF7D7DFD08FFA827
+%52FD06FFA85252A8FD04FF52FFFFFF7DFFA8FD05FF52FFA8FFFFFFA8FD11
+%FF5227FF527DFF7D527DA85252FD09FF527D52FF5252FF7D52FF527DFF7D
+%27FF5252A87D27A8FD16FF27527D5252A85252527D27277DFD07FF7D5252
+%7DA85252A8527DFF7D52A85252FF7D277D5227A8FFFFA8FD14FF7D52FF7D
+%FFFF7DFD0BFF7DFFFFFF7D7DFD07FF7DFFFF7DA8FD1CFFA8527DFF7DFFFF
+%7DFF7D7DFD07FF7D7DFFA8FF7D7D7DFD05FFA87DFFFF7DFF7DFD05FFA8FD
+%14FF2752FF7D52A8A852A8FD09FF525252FF52A8FD07FF7D52FF5227A8FF
+%FFFF5252FD16FF7D5227FF527DA8A8527DA8A8FD05FFA8A852277DFF527D
+%A8FD05FFA8527DFF52277DFFFFFF7D27A8FD0EFF7D7D7DFD2BFF7DFD12FF
+%7D7D7DFFFFA8FD08FFA8FFA8FD05FFA8FD07FFA8FD05FFA8FD05FFA8FFFF
+%FF7DFFA8FD0EFF52FD05FFA8A8FFFF7DFFFF7DA8FD0AFF7DA8FF7DA8FD07
+%FFA8A8FFA8A8FD04FF527DFD11FF7DFD04FF7DA8A8FFA87DFFFF7DA8FFA8
+%FD05FFA8FFFF7DFFFFA8A8A8FD05FFA87DA8FFA87DA8FFFFFF7D52A8FD0E
+%FF7D52FD04FF7D7DFFA87DFFFF52FD0BFF52FFFF52A8FD07FF7DA8FFA87D
+%FFFFFFA85252FD11FF527DA8FFFFA87D7DFFA852FFA8527DFF7DFD05FFA8
+%A8A852FFFF52A8A8FD05FF7D7DA8FFA87DA8FFFFFF52527DFD13FFA85252
+%A87D27FF527D52FD09FFA85252A827FD08FF5227FF527D52FFFFFF527DFD
+%16FF7D5252A85252FF7D5252A8A8FD06FF7DA8527D7D27FFA8FD05FFA852
+%52FF7D5252FFFFFF7D52A8FD14FF7D7DFF7DFFFF7DFD0BFF7DFFFF7DA87D
+%FD06FF7DFFFFFF7DFD05FF7D52FD16FFA87D7DFF7DA8FF7DFF7DA8FD07FF
+%A87DFFFF7D7D7DA8FD05FF52FFA8FF7DFFA8FFFFFF527DA8FD11FF7D7DFF
+%527DFF5227FF525252FD09FFA852A8525252FFFF52A852FFA85227FF527D
+%7D5252A8FD16FF527D7D7D52FF5252A85227527DFD07FF7DA852FF527D52
+%A8FF527D7DFF7D5227A87D527D5252A8FFFFA8FD11FF527DFD0AFF527DFD
+%04FFA85252FD08FF7DFF7DFD08FF527DFD17FF7D7DA87DA8A8A87DA8A8A8
+%7D527DFD05FF5252A8FD05FF7DFF7DFF52FFA8FD05FF7D7D7DFFFFFFA8FD
+%11FF5227FD0AFF7D52FF52A852FF527DFD08FF7D7D7DFD08FF5252FD17FF
+%2752FD04FF27FD04FFA8527DFF527D52FF7D52A8FD05FFA8FFA852A8FFA8
+%FD05FFA85252FFFFFFA8FD1DFF2752FF7DFF7DFF7D52FD31FF5252FD04FF
+%7D5252FF7DFF7DFF527D7DFD05FF7DA8A87DA8A8A8FD05FFFD06A87DFD20
+%FF7D7D7DFD33FFA8F827FD04FF7DFFFFFFA852A8FFFFA8A8FD08FF7D52FD
+%65FF7DFD06FFA87DA8A8FF7DA87DA8FD0AFFF852FD63FFA87DFD0AFF7DFD
+%0EFF5252FD63FFA8FD1BFF7DFD80FF7DFD5FFF7DFF52FFA8FF7D7DFD78FF
+%527D7D5252527DA87DFD0FFFA8A87D52A87DFF7DFD05A852FF7DFF7DA87D
+%A8FD53FF7D7D52FD047DFF7DFD0FFFFD067D52FD057DFF7D7DFFFD057DFD
+%6BFF7D527D52A852A8527D525252FF52A8527D527D527DFD7EFF7DFD8EFF
+%FF
+%%EndData
+endstream
endobj
12 0 obj
<< /Filter [ /FlateDecode ] /Length 13 0 R >>
stream
+H��W�n�}7�P
� �%�")A J�&2c×]l�!�8��j�W��u�>���-�=A�}\�
y�Tu�ݟ�nNe�=�Szx�G��e�.Ǯ?��w�4�0�f����g�ђ�����k��{��>��e�]{����{'?��S�>�]�ݵ�c2>�7ڷ��h�ߵ�y�N���1�6/G�R�?�^|θ'?����
+.��wZx4$^�/���{}�����"���QB]��\���L[ݎW}��ÐuM��^ڔ�_��EX�}]6o�Ο����Z�k�OZW������u��ٶ
=n�����G��>�uq��ҍ
G�
+n-������j���k�X����wy����ޕn
��^�?�S3���A
��{�
�rgVk�(�_NB'�~a����
�^?�g�Q/rq��r�8�Z�m2���K�Co�v׀=6�4�g̣ 3��Ep�=x,�<!��y`��R��νO]����~����q�O$d^��݃�&�n-q��*� ���h�G���J�}ָ-�G=��]3����`��4m�Y>kC�pr���m��=�i�p����D�%���Vx��r�84��v�j��
+|���Ǻ=��8���r��k��O��,l�!_>�����Q
+�L�}]
8,��7{�x�J��|A�5������*�&9�m �{�Jh��y����!�;>����&��S7�Gh��p��/�h/��j�
��y�[�Z=�5�4�n�կ��G����o�
�����} 4>u�P���)��������y�/�F��6
�g���ӸiU�n�a����Bc������>��۲G�:�N�U�^;
5���?UhF����î�
����u�y��?��/�}(хB
�����vϳϾ���u[�0����l�n�wO��{ی`X��rc�X��oXN�?��
@����z�����4j;�B�oת
�n�mtU7M O(̽�-����ű��u*{ؘǧ���b̋�&ė�p%]D�ʦt����/���G�5��5��2W{�
�u�B\�t.�:j|�?ـps�
.�����ҝ�ro�E�wͳ94�w˅�����no��ۼ}�z�E㻨��t���>�ʺt�˽���Qj�����v�����ޮvZ�ӪW!꽎
�
�9�n9S�2�f��]U�͂cr���4�8ϴ�yvۣ�yY>>�U�O����JX}�{�_T��̸q����������e�_��7������'}��� �<S
f
���eϵ���a��y�G�+$u�u� �3�^ڮU>�&�-&�;&����
�w��������O+ۉ����x�c?�7�8�G�B�J��V�g��V#�r��Jɭ(Ha�
���D!�p���a����a���!!�B"�'��H����D���@iD�TИ&TҔf4�`)-p�0"���E<Q
%���(�TT��Q1��Y�R����4�3�y���+ ��BP�� [...]
+)e&�4L�T�I��EF2��L
0���,R�� )���H��ȋ���o�EQ(|ΰ*�C�
�a�B)��L�J�����+UD�*ȋ\�y��i.�$���@d�G9� `�"SY�eY��,�b���QFq�0
�"Ui�ӧ��-b܅�
w�)��@]YH%s�5ō��
���A���HT���$I
�8Њ�rA\�
+(f�RQ��r�e�Q�3�" �
��B����W�%2s�
2
!���Y�r�!���y�8@���Qf�`H
+�$� o�C��0
+hAؕ�el��;�E�!R��98��� 8+�^S�9$AX��9���� j@�*���RL@:QG�
�XP{
���(��
��9��9��'"��}ڻc
�ܿ��c�vo0�ܿ���U8o�
����ն�L�yF�LHߘ��n�X̠4?��Xf#�ڂ�$�EX�0+��i 6N��Ʀ��ÁI�K�y�D9�V�Yb+b>
�#Gd��~0d�Y��8v, l�
�d���-&�&�&�Nb;��Y�L ��G�X* ,!
%
-
1��3A�Ė(�,�[̒�YZċ"Z�Ѿ�^��Be(�ץD]9a,2�S��:��@Y��r���K+Gi���$�k]`8�Rf�B�V�v(��Pr��;^b�Ǒ�%gt��\��"\��^��R�jF
x/Xέ�6.۶M˵�5�/q~�U�o5���վa��b�4�}���Wx���%�
+�_ayhar������X.�l����
��������r���U�D+O�7'+����_ʫ,�n
�O��E
%��Z���L $��U�M��
.ID�t۱)z���$j
-=Y��Z��pN/
>�J�����ڕ�,<���>j~��D���
�o�pfL�VxvL��<!�&�.�>��a� r�2b�W�u�0o�g
�3�5�
�
� ty�wmr���Q>F�/���� )_���K 6�W����� Հ���|,�,��������ф)Iz.VV��V`\v���v��05� �x��g�۳��Hq0Bl /����襂��Q1��".�
/<��qTlL
+�d>��]���k
��'�Ȥ ��텭��3Pވ�Ft��$��
+�� ᎖���1s�0O �$�qs�l�B7��
�Ux:���#�ő#j��bF�F!���*���Cd�� Tf�#
�"
��
�o��
l�㵧4����X�\���28���
����t����?{�����Ϯ'�ɟ]���/���m�����G���}��e��e���u�SI
���V���QΏ:j�
�Wj�J�`�c�mv���S�i�ԊzuK�.� (9¦�{�/lg�������U\/��̴�itْ����
���jZ���c8��wy�Ɋ=�&����Xd���D�� ����_���1����w��ŕ�'Y�lʑ�('r.ٗ
.�+�t$��$A}4��=+N2J����!���(BP���( +�����YǗ�_U��jf���6�6�`+Mj��ݳ
�X���i%rʧ��=W��ycj~
� �+:����/����B��^��$W���rm�g�$�]��M�T�3���1
�%r�Xص/x������؉�A�]ݿ���<@�� ����$/
+O��K��&�S��!��]R at f�G����$54=\4/Y��i�v��iꈩ��E�?�/���)ۅ�9x"��n���ܬ�[s�$9s�\[�4���^�Cg��ቢw��,7^D����%���C�
Z��`+�j���)a
�St�S_]�� ��Ġm��'f���}E־�r�s��N���oT�=*�3w!\B8s
��k�Y*M���?��j
.��7>��&��,�Ev��Ew���m��%O���:��U�
�m������'��k��ٚcC���αՄ"
C���V_�܁=/����_0�3�`D�z�'�bwl`�P%|���?�
+|�KZW@y]�{w��'ޭ&���;(����/�-�ݳo�M��{)�Zݔ;-qΑ4�//ϓ�ң���a���9�����T�3�����?���e��*2�o�mj쪕6�;�����AO&�d�e�l����j�)�N�ש
�>y��xt6~�p��ƾkǿ��%���0�L|:;'[��+�9��8ڎS @Z��W�q��;��Ȇd�H��8:�/�ҋM
P4Fm|�T\&oXrF�Yu��zWn�C��f���x84�kq�bJe�#ac"�9#S�|gL�8���9��z����ݽ�<�>��y�ԥ?
���π]
+���'� ��`M��A>P�1
��w�m�[}�@�t�x���Oe�
��i
�
n��x��{����9֎��p���M3N��(|��*l�\dEE�4<�
+�
!1�
l�g����UeM[CM���O&�c?O
�ք
/0���q��.Vd>�_{�?��������ߚ~q_Ձu�H�7�{�ޙ��,fp�O��
�p��z�E�mf���P��ܩFyi����i�f{�j����zQ^z�Z(><44���B����p=\\.:#
m
���u�P��ˑy�q��)�����C;H{iw��,�x`�����]>
ۍ���e�F��U�E�
~<?���Ȟf��"�UQ���
&���F�N���x���~�`%��d��`G�Kr&)���]@FC�����|���n��K�('�JHr�3��Y��y�t�7yy~<_�_.<�\rV�\Z����Q��B�0�*Z��$�J�f����=�G`Q��!�j���Sݶ^g�:��=�D�պ��~���S���Y�J��R{5�K�ЭEw��sʽWnn����1�g�^
��{��ܳ��T��g8h��,��ź��JA'ƅp�2Cx��T0�4�(�
Aǯ�װ
�
���;���V`H
����(r|�
�@'���TT��.p�������N/��#��z}o]���8�p,�X��lc�殩�n 2
MM3ȃN��
��3q����l��-6?��)����.�7%ؔ~��K�8�ѬTdegP>z\�L�N�J���S�L��1I?�����sMs�\�����'���D/�DI�4E���G�;=�W>�a���I��z�����r�|-����
���5�
Ow���C���@D+�G�R���
�����;l]��7����.�������w�4��_������zS� �e�;u^R�!e3-DQ}�
��iSQ�N�z�g�
$��
�E{D+o1�q %ʖ�QQQ��f��2�A|�S�������Mo G9�`�&�D�����K�x� W2�u���
+
6S���]{�_ꭋ���;�vv��w�w��캇ݡ~?Xy��/`j��K�~po������n�w���p;��v;���U�7���m�.v���n��_�J�A|ǣ`笄e�t��٭�ZcWma4b�(����ut��7�6U�jU���E�>��ԕX�[ק��L���k�U�ֽ���&���Ske����_�O�\,@1#@8�
������ՙ
����U�ݓ=��o�;�������{��e5��KP~qc��~����`��c�x"�|����/�
¦�{��(��?��T77z:����Żѹѷѵm�ktk��}]<�
+�̟m����
z2�%������܉x�pbۯ.�wƮ��
����C�oŵ�{9�/n,�vc���͓���n�Z�Է����R�����I����:�R}٧'[ݷ,/g������ܭ�G��}[�n^P[��;�V壶���Z���k�T�xSv].�El���F]�U�F�vUR�J��d|�D�X�]�!�#5�H�Tir�M�E
+�J���j�Za�=�8\��]���6���
f4�n��]+�lꝥp�f�\�Z~H�Ϫ�,3
+���$�������DVV�R�d#��
��K|�@F��,�X at U�R��{a�p
�i�?I��Ɔ-�Ѡ3an��R:`�&�P�~�ش
W ́�^�D���:a?'co
�;�
�(�2JZf�l��g���� N�Ey0V#�bo/�
)�� ��P_.�rG�
�;�F��ؼ��fH
o���Y
+$�
���~�����
����vX�h��bwW�a�7h����Q5�Ӳ�^0M4�
��f�bO��r�-Y�P�.��8�Ez��;zz��'�v�V�jc���p�
S;�ϒ��ß�_���,�k*�N4{�YY��^�j��**�*�<�Ne���U���U'�&W�j
+s�KY��&e=�jP
�5U�Z
��?8��|��r���4r��f�Fږ���Vݥ�t��S�^�z��� �_��z��V��k�Zz�
�j�5������
���/L�_o�9F���x_��6�ᥡy;���
�_��q�t��o
؏��o
l���o߾x
����3?�W_s�;�g���6Au�U��_�9��"�
ߏ�5�:��w8��8s�Z�!�F����<�����8��o��u�nO�����O�~�����~���������_��;��1����z6uT5�h
ܺD�'b?�|�w��J%�DWT��|�]0�|���x��
+ �}!�g��,j���Q���'�ݪK��щ|����/�,�
�s��Z2>gO��yd<��;��`�����
�;����P8�-2�}����
��ȡqX� �,�������H�N�@F$�ғܚ>#�vbߩ=�;w�)�^t��.��6ˮ!Jw^X�(�K��di�Q�/Q���v��; n m��.���vA�B�$� h-V�A�u��m��'��Q�ׯnr���._�#�q�/��6���_c��R�.���-�s4�h���̻���ί��̢��������F�6n���t˷j�R���^�Ǖ���g�-���xǍ��
�̙ѵ���Yv�j��<�l̍�_���Z�X����TJF)�27�j�D3����*�SsI�.��͎u�Of�e�s�?=��2N5�%g�Q�����}}8Б��fC��
T�b��
�|��'z{��e-Zz���E��]͵�|l2cW37rF
s,���m�6Z�5yӉ��A��c[f�f:ษi��EM�O�(����p��^3��TQo4����a#,��+m��j@�
njNpE�0ΰ�9 {�A�F
�T�N�V����9W�
�4��e��
t�G�.`̃�iY
����BB
+8 �mk3r�����_8(0S��X
0�f�hq�W�$��Ԭ��U�|v��7#�6z���v��\�r�
$G�`�`��ν���HN��J�p�p�'�p��xW�'�������ц�#X���D �r�
%�hi-��
Z�$h0S� 1!�D���f�/��_
���A��ݡ�a
�t
�
�� y�p��`� ;q��� �1ة#z_$�L�Z�r�9����n
b���L.�dž � L�_ at K�>�3��X�i��U���8���aL�O���R�o��S���K���9ǯ�MQ
p/*�E�0/W��lT+�m��J�E�����X��
��Z@=�I�� �t��F+X7zQl0�B��
�L<��V )��V�IQW�YxL�6"��
g�р1�b0
jBw �A��ϊ/�c6A � N�搶�]
��R�G��p���4
��I�;n�
��
#h�����u<K��Q-����9c�*�n��������ڟ�Y9]TvZ�{&�#9t�
1$JX#\
K�u�^N��<�lƜ?"zN�g�
H��
��r��N�:`�v�:�s�9��1��.oXc�7Y�di��M�5.j��q9�bƥ�
�hB�e���!
�:J�[����������d���lI�S����!�T��A̧XN��e�O�1��8J8_X��2�S�)���S������
z��zg�zG�����%ԆGLp����Z�6���N�9W�9�p��I�&�ѐ�JWI���6S9��k�ta/o���t��a�OQ:v��Z$��Ju�كH�>��,t��r3m���R7�9��Fy\&g6s�2K�����
�f%�k����
�^������T�@T��Ҍo9͚��^�z���/̿X�F=�Wc�pew�e����L��7<?�ROU�VT�nU�����0j�T���A��k/{_ߞ�7��w������ç�O��_�?~zJ�}s���o����?=������쪿�������程9��4-_)�xKb��$R�H&�L �>�<$��<�:"q8m8i4&�DN�
+'��%�5�,N*،D
N
+F �
$2p*HD�4I� �gȮ���0�߁_^u0 &�Lz�&���E�B�ɭ$�$
:,Tk.s���9�)ˆ�&�I�a-���
�Tx��,�����32~�ڎA����q��w��n�MB� �C
9�
�ào�>E���lj����n�
+[Ů_~ݝ��5ޟ�ݩYOT�_"P�O'O�N'N�M'�6����3��2ң��S���I�)� ����ЩPDHg:
: �F�NN~!�Ӟ��S�^��n`�FuNtFs���zdG��T���kZ��%G�Z����̀�m@�Y;�Y�5�`+8�1�Tk�
7 �'oF0��߆�
+�a�w`#kDbO��
j�`�
�x�v � �N��
ޮ
܆�
+�p
w�� FO��
vk7�`=��
��,
۰��
������4���|��Ɍwց�g;����'®�hI�CZ��p�_�M.&<�E�ֶ��y{k\o�kt��ܐ�Ⱦ�$G3 �V���|`��o
��w�7�
-g���C���&|�Y %4e)4��NZ|7���g����b 5���h�5"��
KBl��^2�Z�A���������k�7�p0�$d�i�d��8��
�6F���q8�Nt7(����m��6(�����Dd�������j#���k1��+���JD�4�$%�A��DN��DLNK;)�$BZh-QQ
���F@������c��Ǩ�r���fD#��'ы�K��XB1�D��c�/1L
�_V�����y�?ɘ���E�q�
eZ������n��_�t���n4a�!��:��5Ή>w�ٺ��M��\��
��l�z͍��5��,hMhm6t3#�������hk�4��6�@�t6S��1mݚ��ܜ.ٞ٠�ѢI��M�Q�Y���Uv9<�]�Ͱ6ѲnѴ�f[�h\[���E7�K���1Z��M,N�m����V��V�hd�ƺ�UO��]̾�u�Ͱʦ��G������GJ�
J6����~��Hn[A�>�|��H.�DQ�C �
rvn9F�6��|�T�#)�[Rώ��X=`a�h�l�^�_�c����ʝV<�����]zYf�O]� �昆�.�ݧ���!RK$ J{gkl�M�@���#�M�b�*���y�����6��sK;��`��NԸ�k���J��\�]��F%�4""!ѳ�-'EF
����J^����A�9��l�d8 zYr2�1�X��Lp����Yt1©\�á
+��g
+p%G*���N$��At��C�i�;t�wH���5�>#��/tz
���BW���wy
+
�~B7 p�\D
B��{�w�s$�ػƥgD�(����%��� A���i��,J��
��� �Z�v �UP]���B�
�8@��� T��i��P-T�v�#B�}&��A�`V.(1g+e��7(
��3�w�^r�(���*-��
SL
e�
�RCPn�
fe�R����b�7�mRDP��
aQ�p`vi�):�Ơ\1w�#�E�E
�E�d���ML
�((i
�3�F��Q)q4#��b<��=|N�.q�(j�Mt��,�Rns�L���0�S���a�XU���F_�6��q��#e�BT���i�]� m
)b����9��ˠ�7�a+"K��->F�L�.�-Wզܦ���/L�늿ʊI'���ԁ��MV�'��C|��byU
�Q��B�.Vo�v5��tP���
++^��a�}
V����}������Ad�1�A���M^�"s
+��R����s��.b-�w��7=�
Gj[
��6�a���mB3�x�!�0� �n`�
��0�
hh�����
�
`�
����
����f ����bC�Q�12�����0LE���`�x�ľ��'ʼn
�)(R�WcE�=*ZLh��EP��1�BƢ�1*ht�����S�X7F���
1hŎ��>��1)|�m
U� K
!C�!�MY��H"�biP�T�]5�/~{9����_�=��U�j}/�%V���n�ؗVܯq��.Wٮ��0_x��u��unֲu6w]Ű�_%�a"S����
��H���
{�u��!��ޱu����o�|�g�8��q��ǎq�r
�\��q��c��/���Єy����F���9L�ЕU+��Y�FփȺ*�^��
/�MU�ğ�/���_�����^���tX7
�t�כ��^
+��߳���~���:��i�k]�����6
�կ�nKg��
+�eX�����
���e��m��}�H/�}�.�
@������?}�����ç��O����S��_~��������/����O?���移a��e� ռ�F.x��
M��O֧c��O=���ŧջ_�ݮ>i�7���gT���>���
�D
W���1��ϻ�-y��c���?@ �1�J!�QH�D"�E�F����J��"������Q�R�)F*d��|CZ!��X�Y0�5��
��B�!Ðb�1$�L#�!ѐi*q
ɆU�oP�O���Hg�
"�^�c��4m���7�SaE�k��;|K�g�O��?��{<�����n8/�8hb��tQV�gym�K�J
Q�{/~�Sn
+�����]��~+
~��t���{Yv3��7D�����D��b!�!b�k�@� �Z�X���D
+)R�Pa�"�-,\(^��,bXȰ�aACQCa�↓{Y3���ew
+
����
&�_BCD�F�W
��˭BIP0a4�5H��I��Q�G\)YJ���R)�Xժ��]VaS�р�n�%v\d�U�*��c�H��؍�rUj�^kKH�O'��h?��uȍ�h��]�t�}�T
��b~
[
�c�x�y"�One f
+f
��5$s8�l�������h�%$CHv`F ���
�h M6�!5�Z�Y۫�Clw5zlrkp�V�ݩ��ֳڹT#{�p���ղl�E
�Ԕ�Z�
׃(G�%�v���JP��+5� &���#(u �:��6�
���#xw
w ���5��
F���0b�
+�I�p���<-s�vpU�e
hl�-]d�1�H�H at dO�7�_��i��*���,��i�a����(5T� EL������rv:�\���rA�I�8�d��A�)��R
�N�,
X�$�!����H�M$�߈�h{�ע|2~!��D��x��{�{)n'����Ndވ�+��l�G
�
���l�h���=���
\�7B�=��GO8�F���+#z�G�`�����Y
V�Zgt܈���}ؠ=�ҡ?
\��~
ѷ=�7���G_;t8)�Ǒ�:͋&N G�9*f���¬;L�k}7
�)���Fԙe
���Ͻ
1�+�U
7�{���oOV�
�A]H��zt^|����0
i����n�pk�5"/�q�zj>k�I��
g��b)t
+�ы��5�ڑ
9�!�%;[+z#�U��26'���-��6e�Z��Y�]ٰhY�$�Z�Mkm�Ƶ�e�}���U
/��I5�f^ۙ
���5�""fc����;~���lqkr{��Z��Ά��gӳ�[��5���j,x5,�@
0��4Z����
��B9rVM2�� �衉^����FQ�=�#S��'!g�N�8)�9�
e:a����I1�0�tJ4��R�Bh�+�Cb�$DI�B8�@sb ��W� ����D�"�!!� ���G��9�G��cŎ:�
�!�Q�5����8M�V&��R�A�0 �<? C��U�ձ�1�� ͐m����ʜ�|�h�.�����&�5���lMfk*��,&1aO�
�����ц�~��@ �tv�CAފ�
o{$��xK��+DޘA"1�@�a�wh�ț�
q�<~
�(�t TM�Y�[�.�v#��-��̛���m��|��[�����F����Q�)�ܡfL����� �uLR���_��+t�sC���:*7i7D�ѩ$z�}/]��dD
�
+�9SV�i��@=��/
g��S��\��y�����'i%*:1��F��
+u����y�8�5m\��H��[5@��^
{-�JX���� �0=`~FM$U4�Ps^�M��mO�/���(%%r �Jl&{�ª��يWz�D��b.RK���p���إ3�◀�%e�x)�
á<�2n��O<C���
�.���h��^D6%4E��D�C$��ԍY\��mj����[R��)�9��NY��"�T�,Ns���3yL�8�E��a�����2&
�Ńa=aR!η�'\�
A�v�����_�:�
G� ��! 9����zȫ� [�%� �ACkH��ƍGf�t/�+�� w9�ӝ�q㜃���Rb{�i�O:�yҤF;g1�8�'��Nz��������������Gr�2Q=��(H ������x�\�0�p�G���p�ܐ�ٰf&�L�����ّX�q'�h���R�3}��y�Cz2H&Ld���!ԁ=�9�7
+IC)C �N'�c'��F3�DH��Y��7��69g3��@:�?F�Q&%
�!$e��3�N%�%��Ej���8����S)&�A^܌]d&a�$����I���'N(e��|��U�W9��i��M/�N�H��ͱ�d��''�g����ӽQ�Ŏ>�ۛM�EZަ��Ȥ�A�
'�μ������}}�0e���^�vq1�㤍���6�F�D_㟈��n��[��m�cɽ��uiy���{�J��Y%���������K��-}?�;ǎ�i�{�^�3�w�Mz+�;&���{~; �&�闱����T���m���~�>��d'#߬{y��/ߙ3�"=|�]?yF��=�}����.��|��'��a\�����x~������ן?��~���˯��gy��?>��_?z��~����������}b���,8��Y�&RP+���?��������
���(\�&-�#][��s(*F�^_�]���'��� j�C D
+R�R}�T&R��0�L�R��
�YY��T
���X��\Űk2�Z�_+l#�
1YqL��'�'
���
+!m4P� k
�M�ƥ�,�vf�B!��Q���"]"� ��k4���y�8'��xb{k��"�A#���o(
6��h�!X�HGH�Ȋ����
+��
aAI����\���!#���������0�(I�$FV����'b+�����
+���p��&:
+<����56��a���%�u��L��3[���$�Y�Y�U�{\
Z�f�����S�k�[_/챾�=�[��欴�m܊܆�أ��
�l�1սŎx
~�gkx�ҋ�m!��%�ج����f�Ƶ7y��xj."�&�HǤA���$s���[N�r"�L<%+�e�hY9[V�����.���c�|��";]L���ˎ�Yh��8Ȝ��%W%�G��. �hiԩrD5B�V5�
{(F�=���.��ː�
+�D
+:
��� ����lF�Fȥ҈O�T�Dž�u'9,.
��2�MUr\q\p��'( ���+��V��Ƚ��o�;L�x��p�����г/����*#����t��a���L|ԁ���9dy}��}
�
+�
+"
+%�A�K&�&
��c���.E���c�
+H
+K���h0�y���%a��P/
�ɰ����/���=��tz�
�
�a\�G���O
G4�]C����:.���x
DՐ�#�n���[k]�\� ��ږD��
��q,
E��u�{�}U��^��aѶ_�!�I4-�&���h�h�hE7��k;zC�-�F=OV��iLo�ڜw���
h
�hZhpl�tpxXm��
����HsÚW�x�x= ��49�� 8�,�_�QH`�
���;_!ᗁ���nv��
��J� ����֠ �zD2H"̑�P�Y��,j�����h���.�Ʈ,f�i�) ��Z̖�̂
y�
�,,�
Ș��݀�!#�
�Z�0H<���#>�E����R�
(T�T�)�K�I��V�T�F�\�\�N����
+�+�K�j������u�����
ZC~]<6/U/�/ـ
+�*�J�
��XB(��1�u�͚������I�e�݈���Z�i"j�Y�Ka��� �#��Y�T]z-K�j�DGqH�鑨��w��E��텸>�7yO$W
G.�+�;���o��=��7�.��
+�;����%b��M�)<�\ۆ>pJ�G�%�xA�O����!�d����1k���ۣڴ�rԙV�
�Օ����v�)Ԋ�T�z�j�Z�:�*�QA��'�t3�5<K
Ko���[UkT���j��h���� d0��D5��LJ�p{�)MY�
+BO�j0��J���l �P�~�%�2��<�p �[f!��5�9�)�,����ٯ���@��,����X>9�SAT��U�u�Q�(�Z�V����4����(
��i[�^�^��\sD��������9i@�'e{���p�e�B~(�e���[�i�y�-onlj�Dlee�I�I�eƗ�n#���@��t����O
O��E�p�h��*H{�Ѱ���р��th����a�O��]��G�q(S Sp�N�G��9�ٞc�{�
t٨x:�_
��b9L +�4Z�p$Q at i�P!fo�P3��\D�uM2������ȉx�)�*z�4'u�!�l�
D�lcN�r��\c�
�:�z��d������E&^v,�B����A�D?؍��� ڎهi���
d �1
哃C����k'v� ��
+8K2*H�T
T!܀5
G�� �P
�!�TQQ%Q�IEQU�dlzQU]M�K��&���H�
+�+�J�i$E�
�4�DvV��U(��g(�J� �*%���!�箽��]{��U|�'ڛ�=�CwMvMuQ1T�*���*�Uqg���ȭ����i-����K�
��z�M�T�\��B��P}�=�ٍ�3Ss
+�F����
T���2QM2�����0
H�x
���|��G
���Tx4�O>�A_�
6
=D��ǑG#KM2�M�7j����_���r��-v�SXf��g�4)Z:CZ���/曓�f1�����/���|s5T��g�JJXf��M��ze�deD�m0�x�8�0C� ���ؑȑ�A�X�H� `(0I��Be����W5���~M�]m����GӂhBX��a4b�"����6cmGoȶ%Qè���65��Y�3�Ӛ��{�q|��i���an���a�Q�w�f��W �
k^��
����4���أ���~�F!�17 at S��|��_B�c���G�zD�*�[����v[�&D�� �0G
dC fR��
�I�Z����n&�
����e���H�jY0[X0
r�A2��T�\Ps c: �w����r�k��� ��V���%���SH�{�P�RͦT.U'�
+ZeR��r�r�:�V>�W*X�X.Y�Y.Z�Z*[�-��
+j
�u��T�T�T�d*`�`*ar�*b �PB�D��
7kZ�b&$r&���w#
^
j�����KdM.U�MW&8�@H�R��f=Ru�,a��
�!�G��B�߉�!~ ���LL߈��=�\q
�d �� >z�
�� ��P�j+h���3#�P�=27a���bXpm��Q\(�
-���y>!�����?��ʻ�H�9T
��+n�j�Z�QgZe��د�
��#x���.�@r8
27~99�`�`�
�����{f��U�+ �aِzZΛ��St�Y��U1�8���'E�`Iq�(�3���g��O��6��h>M���z���F�
�=b����{��ᇟ��k˿������44��M��q��#�u�b?5H���7
����
��i
+��\��7��}o����}SW��
���o���������߾|��}�|������_
?����_�����W���N?}�p��}�����٤>�gl��SG�������7Lr��p�Nܧ5�4�S�c�1sKfR`õ����e����B%'NC<�J�ƸG#E�1=�H>F�X�L�Mp�R�a_�\��
+�0zt�$��b���N1�X^��&�8q;G������6�.j�����ƎjO���Wt��9�!%vx��!]^����[OǞ�%�wt
HU�'�r��J-��
�T��w���ڜ�c�b�P�X:�j��Ėc!�oN�|b
�������Wu��л��ǹ�%�v�n>�����9��tn�S;�ɽ�8�I>�6X���q�vػ�{
�>�N�{]��{^�
2?��o<�p�L�N�|�UXC%�r�k��Ã'�=��E�*F����
+�s��5;��
G1�G�t�t�]pGC_�
*$*GC��\��� ]��O
{G�����^>юAo�P�#T� 5�j
o�"|��>Cɏ���@X�Ala���m�g�/���a��j
��M��#��g�P��; =�V�
�of{�L|%�x����&q5DR����eK#C ����"tJ�<� ��`d��c�9
>ni�I�;��e��G[F^`�a�?���VZ�(���ho�)��s�w�c�
�t�da�"<�
jħ�<����?����G�����}}���Ј�h���.ʇ��N�������o>�{m^w��h$��(+�������A1.,��A���K��-�˶2�*-�l�l�4�D��nE`n��d��eq�gq�,(,!#ka�fQ�,&�dmN�sQ��t���Y���
+�٘:�
h���pt����Ŝv�� �w�͛
+��z�S�kܰ�USQ�&Mk|�چ���d:�Ha����UNk�[��Uf�j�
+��d,%�q���5E�n3G�}�つ[BC��0$p���m؇�W`#
�I��;�%�iK�:
� ���{|� �
A�3�u��げ����p e���T����H
,��`���=�ʟ�;F���T6��Un��ڍE˭��;�<��h��
4�
94���
+$xϥ�3[N��.�KGr�t$�ȅ�9�,���\=[�f����f��u9͇,L
y�A�G4D�;�W��Kw8E�w�H�rN�����{�?@6-�ǀ
Hs���ſm�H� ��D!���m?�؈@A�w����d���<�5���y�ص�Q+֬�d�i�� �,��z�M��V6[����*�X�l�,�6�C��Lf+KL'�pN>*�(��X�܋��=v��q
;���6����t��D��c���]�m���A������$����J�
(07
+̅x���Df��T�(5[i �&n�%��N�N���"<k�qD|��(?#�KP�
E�~�ߐ���Z��B��Z~�����T�Y�JM��IK������ݩGڟ��I��I�~loI{���Z���>��J�kU]�k5S�0�Z�n�5�^Z��U�BZ���٭*��O�GO
�����m�Q��=��{0y��k �
@Z��3�v�&�z��� ���f+ 0�9#���1,
��wl��:�q#ĀE�c�:
y�!��Й1S�cH�#GB�o�0�t��?�����f�+��^����K�%瞳?�_*�5(U(u(��Z�j�
�����*�}���t`�FX
+T�aLe�fљ���d� �J�5 Ѯ2�
Fm"��ޕ�� ��,܀�w��*�~�.�"��U�7F*t���+Fdl�_�O-��Z�6&jwx|Ye1���)l
�Cm+�� S�h���Nw��u/|�uI����ʼ������]K�����W�Pbb���z6�<�2�:�y�yHY�Y(�x{��
�1(rY#�f�l���Y�����T�i�uP�
+�u�DuI�e*�j���d�Ձ"�,T!UA&U��j�.��hrUŪ�o��p�� UHUZ�X5��4���S �_��ʼn�dE�Mf�\�Lٖ.9�
٠�D��lS�
k
�2�F��ΐ��ƴ�[˚�Qu�ak�Ťf{z1�������S� ���>�(]
��M�p��� �d��$��${�T1Ix����\�ڗcͱ]�'�E
��d�gg\�3���ᄟ�g�n���A
*�*�u��R'����CI�"d+�T��S�X �BlԸX��
��BA�2���P �5��{��_8����_c������զ��|�����ĉ�
�X��b c���3�� ��
:���X!�ѻ�l_�|��Q3{n�}���hK��l�#�r�
A��C$#�"X�,����,��sL9�
ɂ�Éb7��9�t�l]gҘ�+�WOL��<�&f� ���Vd2|n����j�����_6~.��[�w6}�|fq.�?�bu���o�����*�DŽez�e{^0>�S��yG�; [...]
!U9�R[�u���p�ºN��T;���&������dG�����3�hƛ3�v�D�����nh����
+ک�u���ք���Z�6�3�ޑk����.��vqB
"Vo��nC����
�2�: �=b�l��k����3�
s:t6F�q(S�h8:�a�yHy
N��D
OS�s1q6���_{�G��:':+�1��3�1�l�F�$�����&
�O�
+7��Md�ɉ|1���66�? \ a
endstream
endobj
13 0 obj
18391
endobj
14 0 obj
<< /Filter [ /FlateDecode ] /Length 15 0 R >>
stream
+H��WM��6���e����(2X,@�d��"�=
��`�C6�[�Hɲ���E
�jlM�E�z�W��n
����
�8
�
s��\�� :��u.��9�
~�fX� P��!�O@$�� 9&��0���cjD�8
�2-y m�aü��a;0�
�
+v�܄~
Q�\�����/o���rH!�g� �
��
��vv��^���3�gFwlnL���9�.��k�`�^p����HV����
�
+���%0b���]����w~yV~Hk\b���Q�
+؞��
��&�*;֒�J��{OX*d�l
=�Q�1\�jRC���
�@;�m�Xl�)
6�Pp�
�x��� PV�FT�
��DD�{<ȷ��0�bۺ
�5`�ۇ�.�m`�;��
+��ꆷ��am3�
���!vqt��G���<4p��p;���[p������6�
�G�8�9�E&"�h�-T�Fuրa�H�v(��HMmȄ� �6i�4�IcbPmܐ
t<PT�#
ā�Cް\�\#֛h�CP�e�������������N�>�?���A�`N8�����u���1'��|R�俎�O���`�����C>�N:�E�\�:�ӤN~��yz�wv~���rr�HM-3׳�:���g���p��~gfyڪ(q�nb���!��7g��~�?�9#?�ߦ�����?�<~{z�k\�O_�=��~9�����?�
O_ǥS�?7/��ɝ�#3b��Ҁ�r�
�-����������M�a��:�](8�KL�� ��4d�
��+=�VJ�^x(=";���𬲳�L�)Cp�b3QfDb2e��2c#QL
�c
B�)�y�4x=��=~�#���hkJ�@�*j�Bq�݄��� ��m1���a�6�Ŗ̄`�S�U���כ���p� [...]
+�a^�,zA�|�CC��[F����
�鐡��Т5d.Y���Y=K�E�;�A�+���.�PJ�
���9]�v�q6u�?Jw�@��l��h�$*ڼʝ)� ���c/�/d at 8��A��d#�j���Df�K~�!����V�Uș���\"{�_ �¢'�¥#���
+�
FT�\���\g�-�
�
�'�3�1
l�+�
ف����̌��X�!�Y��)���1�3�y31w:�#�"�{V䒀i�G0{ ��y}v ��D
��V �`]{Fg��sH�)��
�\�U��T�DL�bQ�`:X�,~F@"� h��-����|���3B j�"�L�"�V�nS)T�*��-~��^��aF9�������&��d��zXO��$=�|.�����t��=-jd��G�C�Cal�w�2(�PJ�C)�R�K�BYK(o��9�h09�}P�_
�cB�
(�
E�a0�%(쐊�[PZjT��
�p��(o�VaU�l�
f0k�����z�.��0�2W-�����I��$��ie�3�8�aףtY4ܶ2D�����r�
+�H
E�+
+_���]�)�]!��`�U
+E
�
jV�FQ�ܥː�U
�O��t,�[��f��Y�����f������B�B�!�F
�]i��
e��t=������BG�b�ꊈ#��X�1&�y����w!��oK�nYD���b��,������1#Yݛ�{�-#�I���ŵU4�I\}�ι�
�tm�œV��u86��tl��īu���K���ę��ы��͔>�v��ԭC߁�{ ��wv/
ޛ}�
+��x��l������wE�Ǽ9����!�<Bw {�@� o�݂��Bn�~�^����L�@�P�βG�C����7�߅�h��;��
�مt�:��E�n�~#^;�
O�#y�G�t��i�#nds"��{��?��U��کS�&����T���X�s{��m҆�qD��ܬ��v���i�
j�%g������g�;��
w=�c��aZ��j�;��A���u�zl� �����v<�6�cD*8�g#��oz�c�&qa��o������_
�==�5�䧯ߞ�k��~�����O�����)�������f��s�=���S�M�0�}}��i�J�v��Ewy֩���ոm�m�kݤ��,��K��0�p��]Q
e�v�ҞMÜ��
�#ƬѐZ��&�W�
)���M��9�g]�О:TGU�P(�Z�Ya5�Z6a7�Q�X�����Y�l���5�neV-�XR���*DzNI�j0F�a���K��y�s�uA�
t�C�"���������}�; [...]
+�>�7x�P���
�РVhT�hX��Qx�6���,ښG{����9A�;@$��,�G��h�k0
:�P��*4S�cĈ��5Z� Z�)�&ъ5Z�[=.��z��}��}
+HJ4s
>[4wfC�����o6���9X���h ���q���6����-&n1q����
����@r��j�0���O������ׯy&=���Ȉ�����
�f�
�Ri��[�4}�1���|�������j�?�zwy�g߃��?�uu�}3�_n_���ѝ�NK�/r.���3x�߇��r�c�^
�z�t��`��J$뒤Q�b��%�������
��mQ4�J
�,�I)����T���N�<��y_���Ob>$�_���̬g�g�߉��ub:�|C
�ubx ��٧`��=ؼ�O�:
���1�!�W
����S�Ӏ��<-4�
+�%���2>
#i
+�!�D��dꣷ�ۋZwQ���-&n1q���a�����f?���9��������p�����V?�O����[z�����aw���Z����nx�1�IY���h�
�"}sD��>{���߿��v0�����p��={Bϧ����=#�.ߘi�Y?7���lZU�Ѻ8�KE3L|���r�vx��Ьe��y2
L\"�FcD
�3m�~�H
��Qf�i&^/
#�,#��S���ү4��J��&ϚL_s�S�oc�!/".N�QGր�M��{�.7�gM������}�S%��
@}�d�XR�E�)w�U�伊&�iA�y��u�
�8M�^�I�X$�̚E�L�2Ϛ�?a�wK�4�gM1�aO�H&W��]�^͓yʬ ��{�Y�
� x�`��<\�1O��r S�<k֜yчݠ �Þ˳��5�
)�\�R�T�����Ew���} 4Ic&��nɓ>x�4�{BH2��5��"h�����&}+h�t��.C)�5��<!$}���hB�@ڶ3�k�
B���x��<k�����Ѧ��8�˹����x{���//��;:i+��^���xU�x������ɴ^�)�/�?�!��|�:���(Rt�BZ�K(��b�!���X�g�
R� ����&ӾM0S��P
#d��}heln,Y���[�%(S����1qڬ�e#�F���u�iv���(E
�
+�SH��(���#�P
RՌӌ^��Yj5� 5[@
�k�LqI��������c�
{��.�a�wa+9�,��fL���"�-��YS'����U�.L7
+��;h���
�jK�,^on���� ��(�s��Qc�M�
��(� �h�q{Y�
�q%���sI at 8��´H���;8J\Z�%l-��6�r�����>l�x� ��I]����Y�B1�8��^�:��+
.Z���
����E�4vi7�b�Jܛ�v
��,�Qn����:34�;_X�-���Pԟ�{�B�YH�Ep��
�%)�
+��΅�lʌ��!4=%*騑�6��'���r;Cg�Ϥ�sk1` �n�,ŢM�7 ���
R�f5�j;�A�{�ð���Z���ՙ� 9��L�.agƄ#@I~/�XՙЗyk�v���+(7Y�nawT���'C� ��[R��v��*ĥݵ
v�
Q��-���qlh�t����FI�?���%��l;7:��s_d����3K��<����B�; A
wf�UC(�g'��4�u��
�)E٧:���CT��M�Gj�g�����e�I�S
[E�zh���.�A��pn��{;�\ ŭB_�yn[�%W&U�
���H�7N.l 8[��|z�>
\e�)�f�7�K�v��5�w���w/^]�Lt2H�� <Ili�a� @T�yX��a�������)/��g�4��u���sM���S�'9�'Y�j�"I�$0�������-�^c�����(��2�V�J3��YG�Q�"/��@�:+�O�%�^SX�
�d��4�}݂����qus8�zq�z��
���±��ٖ�j��p���
�>ݽ�n{�"p�n
��NC�����p����j��|�=lۉ�l~����}�:0frY�M����?dHw j
\
�dQ5�ڣ%m��p#�.�Ir��"�>w%u ���֎c/�'ހ���i���WC��T��$�dv(R�&
�� ��ʆnO1�Y�e�8 ���I�f'v�4���+���l&�{K�s�hRͨ�����:��ķԘo�eP�3)�3� [...]
�]1ۭ�4pk��=�HIW����"pftFW���CJ5?���,�.�������/��%U7�.����/��-$�-�'��@�S�xS�y������<���������ۻ��_�����W)�iM!��$�협<�Z��9T_���Ї�ۜ6X;a����y-�����N�O��^�ULx�C�z�ݵoM�5އv�\G�{⦋��d+&#P8r��Yt���i,Y`�)�fД�
^劥�n�~��M��u�A���0�;[�L8�ɡ�Vɸ`�
]�0;x��m�h��tO���%a��/A��̀"��I�T)�Q��e��|���
o���F�|������G�(AŤ+э����bƆ�s��!�I��20=�,<�ȡi��$vRZ�h�\r���lˇ'I2�X�w�5�_J
w�m�ɔ��H'߮�f�a���w����Ø�-#���t��F�tN�t*
V�
���T��.��[~��ǻ��oJCi�W�͘�����t��BgU���qɿ�/c+8tJE���# [...]
� � 5-�������Tc���Py>�� e4�Ԧś�O18�!Т�
����3$���3Dd�3
�1���
)�@�� IHDU�D۔ũ���Cet�{Q���DG�4�
���,��*�?���q^�C9t��`�@�+oJ�Fo�>���|�Lsü��EJ0*8t
4W�.pF�*X�G�L���G�T
o���%�VC�d
��\x�h
+��?����@Ԑ:9��G�
d������>]��|}����]�c�(㐄^�C��d�[���e=��L
:6;��O�k`�&~8�Ҳ
�-���p���XB
�"�!Ay���"��X��5.K]Y�a�\'XSe$�nT��~�����45�*-U[�%m@,��ONY�^
��D�n�>)��
CX���קD4�&�L��-˒n戀���#�{Y��j`a_�i���#��,w
Q�0�O��@�'W$߯�(l
+C�T���$9�Fp�EBx)��3��{�5�;�6Wo���d�X�!`p��U4G�0������5_�#���p'E=p^�)q�t �]�"�[���Z�����I��q^�x��t^@{x���$!�em2��5-���
2��y
>Z�(18����@
y^{
L�?j�>���YtA/�"ߢ]0�
c�J�]-Y��4�x�� ���=������?���
�˜:���ë���R��?~��?�Y?�z��ͫC���D�{���ç����;�ƑPV�n
Y���"&�h�x�Ad � ���^!�!���z���'��.a���(S��f���&�0�|(sf}��mc�5�"���6 K&g
��%��e���rqY����-�T@ 2����� �����}�r��E�n�:F���%�2;x�}ab�O�u�������O��ƃh��8>����`����I�^�(�l��
:��
+�Jh��s��z1R1FI��VГ��+#��PM�g�6�X���+f�-���D[S��T��;��FzXTL'��F�˵*�ğ^�!�5�ԲnU
�u�x2|_ڼe
\{w�����)@�Ay]%E
_@)"���D�"���W�Y�T3
+y彞"`�
AE�$Q48F�2����*�
��~�hbi�h`L����Z����u�� ΅��-����^�V<�
wm3����H�a�dIN�&
+�n����S��s���s������rE�wi��?C��&���,�Q��.4�ϷĞb� l�.��,�)t�Fc��E 0��$H���e
"��r�B���
�3h��Ɨj/`�wD���٢��rE ͗��|3���$�}o#Qԇ���\�,
�c
+5b�L�����\�DzKx
靑*w�J���$�
+�
�J<���V�r���V�X���iK�-]oq{[���F�fZ6�[R�a�P
;%�K�Nߞ�DŅ���V�/���}��n�t�u���|,R3+�>6��A�^����"�R�\Ǖ:�ѠF�~�:2O�A�A�ѳz0���3l�!�7��)���f���u�A]��D.I���HF�,���.1���d�����
Dr+�_%�̶-/wu��������D�x~CXcNr�fZ5t&7��U.��:�����R0��}s1�C{�)&_�LQns$�v���W;���&L�b�Z�����ss�
����|�~I2_`)�z�6�Ilk]C��
����f�jƜ�.;
�!Y[y�
+�"�s��(m��#�
Nn��#�6ȷ2��ݒ�%��&���poU�Y�x ���S-�ԏU���XaC�9�c�
�
�Z�!�k���6�K���m��#����M�)
�d�)�m��i'50�&�q����Ѥ��s��K����
n9�'�iٟ��]�t��
b{ɭ�yCa�j���E�W��1�hK�[�ܒxK�]�oed��%ϛ�]m�Av�fӔ���m<bN�R?S�X�Հ���T<���l�
U����WNk�?W���pY(�[��&:W�-۹قU�q��?I����K�Pט��
�_�י�}`S�'�Tmi
e$�3��[>�d�% ���B��
+�fe& �P(oԓ
+�cҵ<���I���!j�&BP�!?c�4�PX�ĉr�>��MP��7.�9N�k
%��C>����A��g��}�?�-|G����Tf��jL��
�ͬ�|^��U),���ڎ:eϭ,k_�I }��\m���^R�
DC��'�:
�cM'����䃄����!/��
䆏G�2��:�a�t~#����`'>��>���m���U�bWrC���o3`C�S_��de;Y$t&a�C�x<��:m������Tu���%̳\W������ɻ�(g�:bpےׄ���%
{_������ [�
�Q����,�7A�aidxE���U�/���Z��mpR�7��Ѝ�j
K�%����Y�/�f�
�4��
hY
$lɖ�Qy�=S�|8��,نɨB
�����2����I��L�~�#�D�U
+`��!I+�pn��a�{�+xh����
�B�R�'�U3++HE��t�֝���ϩ��`���,.L�
e�l>?��,���� &��������*s�g�o�
����%�
wMg1ݤ^C6����:䩃g��E�/TiU�E�9��� �s��rGPr�
9;=�Ƹ-v��O�ZqOY��<� �MO,����_�����.��;�
b�۶�I�Ij��f�M�3���W6��dܡ�h��]�G�0����mz��43u �T�l��~��1(6t�H���1z����8��^*Ūl����m}���<=�ړ�?J�!��f��e��O�=$��TH)Z�*D�H],�B����(�]�_^��_���/��qf,fɄ�%�W]�j��Q`��4
+9U����qM���
+Ǒ)��\����l��-�}+�n���Z2�Ъ�KX�z�`����=5AnD�5:���\�0������v��u
+��q$��tF��P*��4�, �
�R��V���
�5zW�v�&.E�-f�|+
j5������G)�
+#�̸
��I��2l��9W�nT�� BO��8w��Xw�%h
%D@*�w��Q�T1c�_���KX/�s���
})�ms�ges��fL1��*������ ܶq�
�?
�G�i*n�5�
p�C")�i�N������0��K]B�[z����D�b2��*��MV�'���f�;Y��{\'5m��q�e�c�U{y�t�p�a�05
�O��mU�'$
R�y&�]�
�(/��j��u��^fU�C�w��0���R
w��v�8�7䮯7���6��U�a,�����Qk1
0���Hkȭ����r��wo�;� ui�-g�rJ
&꾫7�_ÒB.�͒��$�l��}���c�
J�Q�a�
�+
��͏7�������o��x�͋?�7���������o
����<i֗�?|��ڟ~����u����szQ�z���ɧs1�?���?�a�|
+�?���Os� g^��kW��m@������~����%�,�T�`_���R�����Ĕ�n
���\�X}L���6
�!"�r[S�͛�^�?��㻇��ܽ����[����o!"��&}v��o��>���|��ݻO�~yx[?;��
�]��߀y�*03/@
&)���9�(�_
�5��h����|7B�S?�K�R�v��A�o����I)�{t�e8�v���d*����S��CF�KI<�B~D��
+��p��y�Y���d��L�g�C�����i��zc�
���ۤ_���!�kv�QUd��Ԟ��Q"5u1q�� [4خ�pIć�w�+�?�Bxu�7&�(����GW����J4�:�<Rc����`CSՀ�-
�^�l�6r�C^s�ZԀ����P
���t7�T�=8�#�K]
�'�c��8���a.{Cӭg����-L6���QگH�.?2�����6 ]���d�&`�aC��`�2
�f�������3,�
-&x��3�c#��X�6Ј�
+��'
K���ث*�F���b,�L��
x�~@�R�D�P@��-�MF}�+r��Y�JEC��
FkyH��A+^��|�
��m�';�[/W�
+���lT�Y�A�ᠲ����:�<Ġ:��ܡ؎YxM�!�
QfL4y���,
��*TÎ�� ��5�A˷]��}�j�:#�jnJf�9O�
��nL֊1gv0�؝�l��Fx�Yݺ�*�k�+
_�q 61�H���1j�Έj
^
+�Z
�1�5�W*��
�512 at r�R}yy^��~y%�1���AP$��)��
cZ����
C���
���p��pI�V�Q�`�hΐpe�l�!v�B�_h�g'.0[՜��p�����#�8 1\,x+=�o>N
T���e�ö%�[�=��d�*:��Mx0� at^ԁ�]_��?@l6�����j/l�4�Y���Tkutrm�uh
����.� E�)�2U�M""�����Ҝt���_�� ��G7:�}ØNUՈzs�e����
۵9M�<]M�K�DY�M^=�q�tUj��Y
��R`c��w��3Lu�Ś>�Y��l�J
_��O���=��2wq#�j���/j]�(V��E��-�K.{�B9��
�q�JE
X|>��
��BW
�t�ps�B;����3���/i
e�Y�[헢����ب��X8�� ��B�D)Xe��ZQt���
�耺�2:�o
�F����W����B�i#�
+ }!��L�bסK��oV�8m�����^�IX�<��+�����2��߶�%�O�]������o/Z[��:��^uT�0��d"�.ͣL�\�0iNY���\��XM!h�ˤ�Ί蓐8��
�&��=�I��I�2�r�^5Z��B
k�8�M���3�4��p0�!:�yg
y�}'=��+�m� V�"��^
7�aQ
�}jyL�nī�:
+n��K::
����i���ea��0@��<�zrVb�ƶ�pj�gc������`t)�/�
�-�<��� y⫈���Ɋ���n
��X&���������s�Ո�HW5�Ӎ�(t�+��"�:
8
�����b��Z�ix �ꁹ���(���R簣~�� �|
V���^���H3eҘĞ[�3D+sy�����7 ��Һ�P�/�U�,���@���������A���G�?pč����y\Y4�j������y}J�v��<L�����zG�[OI������t�5?�*hB���d"[��#WnϢUa����N�y6���<d�a��r.p��J�X����i�\�q]
��0�Cp;�!P����� �0�[#F�
@�z2�Y����Mp�KW�7�z,�{
+�$wk^��Zg���<_��O3%���s���Z�ȍ�+G�s�;���)i�UC�ly��Q���풣
N���Ǥ�p�b�֚<�������-ȓ�\�0��Ρ�gn4��m��-�4h�y��ݧ�!��_Ms�4H��p
p~[���0��7�Wo�I�7�q��~�/��L)I����
s�{�=�\}�t�/�
]K�Ϳۑ�N$�[j�rg��'��_{���4�K�r7�
+���p�͠ͅV�lE{�G����xE�[d�\2|#�|]� �|kԌ
+H@�3xDZ��l�_ڄ�����;{}���[�{�:z����@�
+�9��w%�V`�@����ç����ǟ��9wb����Σ�[, ��VJ�{��4\�[f7
���
U��=�:�,zH�
�ǔ+��⫒P�0�y��Χ[N����$;UOI�w���Buu�5
�X�n.��z�q��6��
+�hZ��$�
x�3ĶP�,'��{��~86�DM�{���+�{����
Rü��$,�[+�a�#C�FU��ԅ�
+
g
x��$���ĭ!ܖo�VJ�m��s��Hv���<}����e���U8V��Σiƥ=��Aq�C
t�
6-����&�dE��'j+�_��MC[L(@�ӫ6�˕~����?��ub���De'���~pS
G���{}�f� ��˷���9�<�^�5V�0
E$�o� Y�8�*�'�u�Dל1ȯE~�V�)ck{t��y�G�^��O�~��bNZ��hcV7m
���x/�6��X��q��cV��:�jБR��zw��l�WC������֚m%hۘ��
+"�I�a
d�xp��6��p���X�oN4͍UȄR��3L1��b��0��1R��b��=�
ֺ�sO�dZ�m�!"z7��{W@�P�t�ϠTЬ��z�e��@�,���CAGd��l p�&��z��k�KY��S���
�'CƏ�����|+� ��ߺ�s��A㡎�4�s���")��E�b+$!_��_.Vn�
�
���ΙHN&�J��m� � r�a�f��(��
��ERl>T��o+z�j{)����
�
+
f�@�����!*R
+�F|�|�Ҟ
c1xVB���?
��r>��=�Z��j�!��
P�n����XL�\�m��x�
+Gdb�����P{P�az'��
+m`��b�%J�C�(k��a���
+^y䆭#*l���ûZ�@2�{>^$=b,
lLy����[G����� yg���( }��Bu�����E��qR�&���Lf��E4�x�oQ��k����t�ˀ
�
��:� ª���̩�F�
��{����c;z4#�����\�3����q�&Xt�_/�
ls�"����ǥ��{�5��P�u��N�Jc��q���Y75ɎfBa�JM$ %lfΨ�4\'�[���anД1n�f�����~����Ѭ�r<L��ߛ;��NҔF�_��^�},rF�g��ME� �&���l����h��pDC�u���/��{\�
�0
\P狿������ε�ݐ�
�
�f���3lK��nz�H�㍎�
ޫ����E��J��m�����~�~ [�
�>�?��\U
�~|�ŏ�Ɍ�qP�Os�)���CRn$z'F�'hn8igL
�gGiS*�/�❵R��ܩ��{w�~֡���@�Hw���
_����0��p��{h_�dR�yօ~�Z��Ȭ��
�c[�������W�������N5�5�e�
\
��]�q�'M
(�`��81.t"^��$��`�
++:��s�jD���n$�������
+{"L)$}�3��u孠2���U|n�ߌ[Xq�fv�������G�4I��<� �˜�
+�b'd��W����YI���
+�ώK}e݂,�Tq@���vV�#)L�zrF�
�6 at U<���(ǐ����zxO:���(0UJg(�:Y�?��$� "8^1
̩���e6�V͗�;"��quhr��[�jS�)��5߄92f�9�c��v���E�[w����Fak3E`�]Q�����q�!j�[J(�"�lbQ�
���y��pBE�sd��X��x�Ȇ���s�N���"��
.!�+p̶瀠`'1x�3*�lE�m?��v:����f�+��ȷ�72�b���-[�
�p
�M:��M%��}�r����lR�փ
DL�$�B�aI�?�8L�M�ؑ�>;䅇V�X7(�ߔ�jD? �<�Lp����z���o®[�� �'_kC�g�DkN��vB^���
���j�#8;2��7h�,��KA��F�I�͛{u����'�aO��d����rz��N&�Z
+iT�懸���ak}�_��]�),���2����E*���!K^�YA����~��+��������q!T�R�M���
[>k*�/s�GO������P�Q�w��H{�O'��l�n �E���5*���~[�$�~om��h�i��UJ�z���:!�D���
�9��[����>��3 �穇
+�c���g�-��^�g.�+�}�>�o��x������� ��@����b�^k$4�
|���}���P�Ik��G{��Xu���0 HF�V����D� �d�`@B���S]u�/�@4N^pԯn/Uga�bջ��sB��`1�ŵ�b<-���K�GR�S�Q뉶
�w4QX8rL�
�V��ǫ�>u��` M'_r���
V�� ^�r�� f�����#e��v+�/M:&�'w�GMB�k�o��gj�2Y{F���m���iiq�"�/z��9 Tqp���6vk�5��L@#QYE_��a����
�����J&��
�|
�/G�|��&�DM�p8�X��r�.ϒ
/��v KL-eK(�����C-�\��k
���� �W
��,���
+���k�K�
+��:%2p\�f7�F���؈P�͇HR���4TY���%�ɬ��=��i��A�[
ƛt�����A�Sz� wB�`���o[a�`���
(KqёD�]��r�jZ츺�D�y_"�Kx���)�%<�x���N?.����-�3���8�v�5f��Y�
+�-�����hG�<,r�"굂�UΞ�B�=
��-s���1�
+J�v�n��%-F�it��z&/�����M8@�8����\��yG�]�<Z�^(=��,f]8y'C��� |���9�_H���
G��V"s�"�n7p������ >U�%&%Tƞlv
+�+�$۽�y���P1#�b��^ln]
D#D��S }�/f
A���%�?�
#���]�j�}�$�*�#�8��1�M���]��S������L�K�����+L���K���_Ť�Đֽ[�RaVg��<Y��Ɗ@���`|�k
+�@�>�n��0��栄���m�++�2�>�A����O���)wRM�K�C�����N8[�'�5�u�?6��Zp�ĩ �.8��c��2O<r
��hdo����+��N=/�"mښ}N��-�P��$Z�Y|),����3�nK �#�+>+�k-��
�4��p���QH�}
�����xѦ���Q)֨ O��0��F��[*���NqV��y+
+���:�
�/�6�����^a�&HoI��T�$�U����N�*m����
Jy��!|�����m�ue];
+H����&�Ӫ�m��O�{�fN5
+� �����=������v�*3�B�La8��������x�.a�
��h��<
������#�
�s�z��<�8��Q��
lmp��
�"4������50�
�'�h���RcrY��%�O3^uYV��S�Q��L>���]ӗ͙�
�3�ֵ�������q��]�"F��Ų$0�T J���AY� M��!�-@�NY3ߘV��2�g\4�1�g�}�t�J�t
��kD��ڜ�Kpb���n� �m���p����\FQv�Nw {�z� xZ-��
�^�I�+*�.���wc��a�r�ro�pf��O,>�J*� cT1�j 侳�"����
���y�Ԩ�m
�)�������tK��t
��3��>�m����1�\��Ԣ0r��Xh=��ճ��j�y�V{�
J�9Y�s��l�d1��l�.��K�
��[�_��mږs�ge�݃q0_��'�qi��v�G����Ѡ�p�9=��Bz�lb &�eghb[z�4�bT,j��;R
+A�kS�U N3tҟ@�@Ƽut˔ž��=L_ܬ��#5�oɅ��LG�_��z�x�5z��82�L)*st-��h3�`>
)�9""�N��[e8/�O={����/���p����_�����O�߽x��
��������_>~����۷o>|������u�˛�u���~��`[ԁ�#.��V�t�=RX<}�%TC>��� �\n
���p�{<G�z�
�5e��V�GK���[.� �
ۢ�
*�
+X�������ң�]'��\�!�\2�>}����F{��ћyD���7X�yUQ������u�3�'��
�T�Q��oyx�
�����ߩ���1T����6:0�u9<4q��nԐ���PbR��+;V&ɭ�poC�=� �J�A
endstream
endobj
15 0 obj
16389
endobj
16 0 obj
<< /Filter [ /FlateDecode ] /Length 17 0 R >>
stream
+H��W]�
�
}7���
ٻ��R}$O�$ �6���1����g�����T�s��f��x*�H:R��q˧�RY����~���B40���5������*G�@����N��
N�VNT��+
7���@ž�3-7����n�u��o��fK��҉9����3�N5䢇C-�
�S(I��Im�S�Ŝ�J
+ҩ�
+��
\���1K��y��D�l1��
˙��ʴ��>p
��v#"���N�����fc��BJ� ��-ה�0[�a��n�e
����Yn��p
+-mh��Tc��2G��ϙ�ٍu���,6=m1{ܐx;˹�� �^��bP����8+y'�v?�P�0N�� y �� ��VB�QqO���,,��1D���Q� �̷@^8��{��ɥ����-^ ��5;��@�'��Rbt�bQl��bHdTPlݮ�3i���z��9�K��
d0o�"Ǣx�����F%�b
8b��
y�f��~��cs���UU��JڴU1=̑X��퓹:ؼц_Ӆ��Љ8�`P���P��О��J$�V/K�\e��5n
�T�Uʢ��&x q&8$��P��BZ=%%�g,�b �9-�-��-=�p�uEk�MA7y��V�g.ћŤ�@ج6/��)�i
-n
��֢�P��:�*
`$�Iu
UF�yg�
�����Aw4��@ӹ��'4Zv�����y��ᐌ�`RV ��3pH��VH����q4�0)�3���Y�v=�eh��9j�g�)q`��+!�d���s�E�ϫ���~�����n���x���O˯��<}��+���jz�|�����~X��|������o~�#��/������E����dX�w��HBЦ7�|"�żd���j�ŒmM�)g���J�!��3�x0�ݡ��qX�.����w'T����4}
�L�GB�(}
EcZ�(���6���2e�brT����jC�:u�VB
���X^�
+x�v����ho[�� v?��
W\�c�\w��Ɋ\�tOv
+lNخ v}�� 1+�k��]��\]Y'�^�n]
�Y]
��t�(��ksq24�ԧ�H��8EԼ�)�s4��c1��䂶
���m��ȫ_(z�`��1Æ<��z� �9G�ո$;�<{
Q�Ώ�8W��(H�����@T�o�k���)E��
u
+����(8Xlk�+�Z���iK�(]��ׇ�Xs�T�x} s�cU[��)u�a����T��
eVj3���%zU�a�w�1���c
�{�ڛ%)G��}��z1�3�h���s�+{XYd� /N�
�ݶ���|q-#�ѕ\N)˨�x��lٶ+%���i�.�&�G�m���h}
4j<����{gϗW�_���}{����_~���������w8&�˷?��{�?���O�}Z��'ay!?^}�z����O�����O�����
��Ӓ�?.�GX���_��f��Qk�r�7��
+���B��Cp�廫��N]�3~`&�[<.�*O� ���؎�ɆA���Փ�0H���|��[��0}W���T�*E��ZG��Kx��Ꚗ�u�:����xB�q�k]�v̤��h�2�i>S��*B
�gh���R�" ��\t9͢Hl`�.a���@��qR�C��W}���1�C/�{���[q��5�V9���ƻ�핰'�V�B
���'�w���G�|`��W�"�x���"+�L
�����P�����6E
wO� �v>�T�YR
�l1`L��J_d1�Q�طO� �졫
�\i��Xu;B��*�|�u�qt����҇UJ ��S�f`��px�'�\&�y�����mX[�N�<3�h��}F?�G���U���Ɂ�mV 0qb�a_֮NJ�,p�
x�g�e{Ui�Jy�a[�htI���Yf�
���`�
^� /2��ʵ<�s�G��x
�
+ۛ��Y�{Ҽ�"�m5(n%?X_u��4K��(��f
+*��o��K�l�}
�3~�%Z� <'� #7�$l���{�tl֙����츂cH
�dphI�<ʷJ�%_ȁ�����8Bq���ק�`�nK^��ӿ9,��ǵ/�
�:Tk���������p["v�9�*2pBZ�S��p�����8�>��3{]8���\�ڜ���
��0�G�^b����/��� �#$?m�d�7��i���X���A�c�`���a��
��dc�q��x��5hI��!N�uEz�U��xP�X�b]��C�fŚ
��6�]Џ��]_N����a����
�1;�
� ;
+�+���s�K�)�.�9�C5�
Ŗ��Q��yҏ�
K��� y2��
Qۺ��!�%QCª�F���.r��Z�-�U5�e+[�Xl���ܽ~�T���Rf�{�]?� �ђ3���=����/d9�N�&l,� @O�X5��d�v��\�ᬩ�\)5:f�
{�:x�����ix��Xd:�/����o7Nl3!t5\�� m":�E�b�~�|����b'�
����j�,�pa۰��Ԏ�
c.�\h�s��?S8��ܦd2L��0kX�!�+^�Yí
J ��M\Z��L�����7��}��w2^knG�SW�e�څB��x
<O��&�� ��b�\j�
]xԮg!f`
l��ƖRW�G
.�۸�)!�Q�,�e
hq~
���joI
���$�4*
+V��G at V�c����X����tB� ���ȋox�W�Nh���b5��m�L�.s��_�z�P<\,����^%��
Gt�P�P��y�<,��
��A��cZ-�z!K��O
�u�f�g�
�{��f�p�ĉ�,j��W�}�����r�?��"
�x�?������X�F��P�U�gv�%S����I5r��I�`�y�C�l��C�T��G��:w��Wf����%�wT>��;C;��N�5P`������w����I�K [8��]ⴐRT'���'�,]&D�FZh[�Ig9�҆�y/k��gH�|���ęC}
���i�����O���6/�q�
�t�yp<�<h�� ��)�rXY�}�V�`�[N]���F�dT����$.�JD���JF׆W�
+.�
��\W�}�Y�%���|�ވ���%ъ��S&)�E-�r*B�$iKc,��0�[����F�$)-��d��k� Pڼs
I�^
s��*����Qd��W��zH�&_�̾�c<���
+{�?Z��:�=�^���k��Q�ò�6���F�(�ٻ�\��ő
+�$�/F'mm����B�6e[�r�B_��v���؟��f����!L:���d�7)QLs)!������$Z��}+1� �}���B��ի����=�
�S�_yU��=aL��n�C�D*���
�i��qqi����[`t{-I-Kyޓ^+�=�V�:�KՋ=�LAm9v5FQ�57
+H�/�Ȅ�8��a���{i�5��hI*���hV��9���
5����(b���,�ŝrrE��3У���{%�Yn���J�[-����<%
q�N
+�ӿ&;B��"p�Yu�d�.�BbN�1�͒s�)��ŠgSԣͧ��:Q#E������d`�
UW��ڻ$|
^���ۋ#m*$=�?�s
+"Pe9�S��Z��_�{��
#
����'�is8.
�0.M[冹?�ί���Λ���0��+�SRs��6Ļ�+�ɶ
c�p��ā.R%wU^HU1�$TV���@��gw�n�h��=ċ��fxO�A����D��{��qA�fw�En�d��D��e���R�'s��3�2:{װ�a���d�1Lv1y���Q��-���R
�K_n&�1��1���S?����קw?���+$^�4�x�Ҫ�,c$
�u�C/�g�f���b����P�z�a�7��ܓ�B��b��p0FU�աnF.o at 2�����SjP
+ʗ3 ��YUc
+r�6�2��)�S%��]��P��'ٵ#�!����,�d�Ec��]'ܒ�7�S��s�n%
��S����NhC���w��MT+��B�
�"��1U��۔�u�ש��Ȫ�h7�a
�?F(;
Y�6�>ߑ����AL^d�Z"�<#V�e�8o�J�8�j�XKҤ88�Ƣ�֝�2�W��|q���2l���
+0F��0������?L�TӮi��c�v!?3�W�L��2�����h���Y�\k��d��ߒ���cm�kF�
c�כ��*j�)�w��
)��8م�T�8��͋�����]�{+R-H/�
�{}j����<1ej�nci��W�p���*eHr��-��(j���� �z#)ú�
����
^����cU[ݽ<���j��r
ۮ����e\���u�W\� \<~��K�������k��Qro,�fK|Vd���.@��J��k3 $�oI&�B��"��~,�
�M.���� ��5P�
o:I���r�F�����o����b���@?c߷��DK�]�}��Q8�7H���݆�I�+�2�I
+^�u5���>�B�\||h]�zF�?����Q['�n��o��|}���W&�
�H�s��!��@�gff se7�c6���olyڣ�M��Y�|
���/7u; �a,u0U$�cc���M��jy]ޘ��@/!Y;�IN����֑�"3<b�����7֍�
�J�FW�>"*�iY%q�O$��
+�"�Eн�[d�(�Z��a���!����
�L�\\�2*�(m���Jb�pE�Qל�u����JH��*i�\<����k}<�bw
���|�+�8���u� ���0�,Y�� �k�u��ͼx�k����%+G�{H��@H\�.��P��+R�a� �)����K_K�^��J���% �,�XKsݥb{�������G(� �
j�۰�&�F=�$
][9�P}5���R:E���m at g=k�B3'e=��M���ъ�r�|�:Z�W�Ei��
>�'Ȧ�����
+��PN���"s�����9ӛ�SG[&�7�c�9&��G> �����8E�D�g1�h��R|xb�o�
+"�.���P��N�M�,��L�v�k���HG�B��Y�
u�H���K�Q�*]hB��zu>�_I�.����G��I�&���:,h���RT�j��� ���²�\縉��+��2�HǓ�wX�0j�i���y���4��J;���3L�wMY�
e��<
E3���R=G��&/���|sU3�9*N�t4�-� �#��9�
S��R&��V�G��3�lV�56[��$�#F5�����z�$
+�Rl�z�G�_lA���Q��r0�!G;��R?���U����C���Yɢ
$K�;�WM�D���#/y q7䡎�5�")U��/�
�6�x�
H���n{v�v*6ЯgCSf�`�ab�����
\�(K'VE����]�/��<<X��J�u;��u�M�,ߏ�
s�y���g|)��lzvyFL�I!Ps��R��:د�
�й�{��0��J�f���w{��ɀ}D��RbiiJ��"'s�6a_x%�-��
��0��VЗ'T
qc��ó� +=u�k�Y��� �'Ov4sv,O�@�r�Yz|M�جB�,���ʵ���+��Fj
2�Xka��
��ר�A
͢���� o����I}+�Dk�N������_��}u���k��o����������ᇏ�:�c����O�������v���;w������ӻO�
@��?�����?��tN�?���7w�g���È
|���,��p���n�rz�}h�6~:�G"G��tM�#�1@�+~iy��� �l :<Q�#�X�� ���~wp�w
+d��c��_:��x5���Y8�
��mFmJ����y�#�%Q�y������==���^--�^7po��p7�dc�����,nHB3䁧 ����}�Tҹ��۫�����|:��T*�
+7��M���
+�gL�ض�s�R�_U�(q�k�w��L�9�7�����t|�:�V����}��;
Ƙ\tb}i;.�������0]�Br�����^��U� <BBS%q3�����F��Z�^��������(������$���C�|�o��K�R��3!c-eM]e�B:
�N� ̪��b� ���M�mq�IL�Lt�wqXNT>��[P��e�X�_7xx[]�1��8��Z!�[����d!�%4F�:�%���K�c���8���Tm��>�F-�r���<Ī�P�[�
�5���b^
/
5Ѩ�:�nƗl��*�ލ�Gx���d��C
�����k���c�
S�-@��^d �n�Q���t[q 0�2��F<�H&�A�$��/�7�*�U";����%(���
v3�� V2��k[�;&^&��e$���% J��Y�
+d�nc1 ��h[=p>����)!��RWh�綛WC�C��Tw�-Ņ?W=�8��_'ʌ��=1Å]��h!�
+�.
�W�b�I9U�Üg��9s՛�"y�˶�JGӀ�sN�;��� .��Ne �u��J�m
:���rD��r
萒�b��2��$�f0����2�
�R�-s�i��Qq#�&�Vԯ��2jw.���w��<)|��tz�HJY�a����&
��Ýq�'�M�M����yS�
�*;�O��b��T
�����|��O2�&'!����^CF��W�Y�����%Co�?��s����GQ���x�����X+P��y�j:�coX�
&
+�Ϣ�:!��HQ������}���
�j
���IK)ێںᇒ�90$r�"42b��~�<z��r:��s�4B
��T���x�iq�/���d�5�<s/���FV��N*�=���E���`�q�(�[^���r�;�d�*d�^��
C
gKM�:
.�7�DA��U�W2�ڂ��vƞ护�b�N��u�ڂ�n3�4�ς�ɡ
㥗bi@��C&$\n�W at 2iT�X�,6���%@N0���Ŭ�&��=,� �bH1�03k��.�f�W2�g�饌(?��
��2��
�eM���IK��ڂu3/� dڶ�c��]ժ��˶<u0�u
Tq��
;��E.�-�
��b['i��w
�<�<�f�w��y���
��2���T]�DŽ9��p�K�@[M�LY*�u6�3�am���ŲK����;���i>��ʿGDÄ
Ա�*��E�0E&p�;Li
��(��"(I���-
�KA��@���b��Pw������!�
+�$�YA�;V�R����g\g��I�z
c�y"($�U+n*64q
��U.~�^���T�
�l�c:tFl���9�rX�=�F� ��98�A#�u���?eC)���
`?T
�d�����a>�2IU��TmM�[�b�~Bֺ��'G�}?AW�SE�N�c���:da��0��;
7���Ӄ����W)�bX#�
�b/r��$^
+�#�tbJ���
+.x�&G�,9it�:�b7��gy�m,<�z0=ʥ',��?��/��1��3l�Y���:���
���2
?E�K3Ƨ����\�1�m���"AlU-��˥�b�&<w#�}�o�
�0?�ӗ�
�
��v �0؏`�\^��
(��S
��FW|��\⊓��}��ƛ��^?�c�
�e!�Va�jof[��x���;��to���_}����>}������ǟ������
�2�ۏ���K���==�����%��<|���~������.��������ӿ��ti�?\���t�����
��%p:�9��@
��0w8r
o��%> (M�\_��%���Ӄ��#����{���U0�� �=%���Ȱ\
+�8��xdC6�B��:��c|�I�s���k
��
lP
���
� �$�,0�5�A��u������.�z%1�֣1�e����,�C��)����bK���-�1V{��!�ǰ Bp��QX�;��ª? �B��
�U�h��rF���f i���+^��ۄ�5m�
+t�
̩;�ɦZ��s��S1
|�t\
�@ �*�8义�.Qkx�i�^=�
g�l���M,���XKx!N¦y;A}n�CBa�5
����Y;����F��(�7Rx�z��5r� �G_R������6��ԅ����q�+e:�ah���uf���6�a�j�Mi6e$:�
ӱc87���Dҟda�kwӞS`��������k�9�y�ٟ���L��bښ��nn��M�0�h�SPk��� b���&�erg��՚0��0��}�
J����(�(�F���s��r�}ԟϻ��p5��r=(
���
k�0��[������$�b1`��
�\����]�O�
+���~4V�M��Y�\��y�
�[%:X�Vl��2�O��J?�����&��ᗁ���X�K��Z4V-���jZ����o�u{٩l�)�q�u���k>'�)�S�!g�O,
Dž�f{�b,���,~� 2�:|�ï+=;kmYڒq
XS�@�7Fe�F
(�J
ã�`���%��x_�����M�8���
�D��Y�ͫ�ؾh�uT,���{�G���=
��N�D`��ۣ�����jo7
>�й�
�����ʈ���<�m���,a{�e`h'�:w��!����N
+�2<j��
���)�`w7 ��wIly��
g�q |�p!�|Oߏ1nv�����]��=�z�
�����(1��
��E�\6�Z����M'4�U��ڈ��X)݃�X_F[�&� �)2�m�
�/�U�$�®������z�s��s��F�zzz��Dq�0I4
�ëm�aD�w�
�z�x��
+���`����m���$��d ����j�t�=��NI��b�
�6"��
��q�;�Z7{"l�(�5�D
%
L��0�2z�9F��}��)�5
�.���*D��.�
�����Xkp�8N�� ���6q�y����
~���/�,
>yv��l�r�
zV8b\s��D�n��UaV; 4'���a�a�5@:�4����D�F����U�&9��F��B�]?�ʻ�3�/ҳ�5I�#pAk
ֱݯ���N�H���]�ȗ��I�� ��*1c�^\�$�m����k��`�+A�ƽ���G�9������0��9�� �2� vj�掚�T�
xw�������O�Я��譐�~���PZ��
F ���\67�9t��wF>�1����is/;��KCH߹G�+WGм8)�NV�͒�y;#�w����k ��%�h)��_'_d���̝�>_�qG_� ʵ�z�iQ�y���b��'�� ߊP�q�|<��j�5�����n=|?�� Y�_�Y���,���
a��
��Ne�<�;���2¡/�������0���A來{�a�N)�~7Pv�Œ$a����h'��d��s蠖i�HY�0
9�.���Y�펕α��_�PNJ�Y���y��hW
��O�P����"{��h0�BL|� :��x��k
=A,5N*MkQt���]��ug�!h �1�����u.#�+�
#�k�"*̦&gdZ{�^��Xy\OA��;����\���5��T�(�F�ca���0��hsI�;�ʊRE�����־��?d,��5L����@�2��3碉����t�KN���Ǿs������bb0�y�aeb�(%btM�>��r�������
0�
�s���!��I.���ݨ�p��n� �81��e�Q
��K�
V�k�k�b�zd]>֡*���X�Km�X,���xg<o��
[��&���gn��.`i�vв�T-_}&�@)B�Y_��g
`R�6�����$Ly,�s��j��N�:�u��R�[�����}�!�=�Az ���IK�
b� ����_�eʆ��b�sU��p|\�u\�]/x��A:��7�&��b��y���w�vsq��sq�&혚���Zv��96x��T��rY��.�>�}��雁�^�
+�%8$4��v7������˨��T���f5���2(K����RX�M����l��[
p���6z��
P���Lo������ !1���
�p��S]E�KH�E���dP����X$����+��
�J! ��U��_|Lᤞ �}zۻ[D���K
�I(�.! �I�=<�w>���^���ﰻ�/� [��h ����w
Z7ݪ��
��=@���
�F����o�n���"�=2��u$˭g)A��A�>Y���A���њ��{�_��g�m��UP,W W
v�e�f�|�P�
V/���.�M{O��A�Z@4�_ۃ
m��3�����ȶ�"���2��
`i
j\6tŭ�4�����m�gQ���ot���ɨ�ӏ[��\U,�w�%m9NR�㻧�9e�=
}:�ٿ��)��Z�8ez}�쩷/f.�L�}�:��z��sL>�7>����VN�G�P�ͽ����������ˢ��9x�[�կU��������r�p�
H^���ۍ+������
\��o �<"�'��t=�ޒ�
����֗�6�M���HM�Ã���냕
+h3{�C12X�p ��xB'%e
�� }��C��R�n��\.��J5���Jk����ce^�-
_z;{#x�
̃g�+<3�;���<���
�v�.�wb/)���?����(����:Fż$���Ow��R�}��o�)��]
x
��"�Nܧ�Q�
�B���1��Zqm�%�q�<<�`��3�v��ݿJ-��'�\F
Q�E�5 bו���X6�][#�ux�5�'8��e
�s�mA��y���dt
ё���n�TDž:���n)_�#<<*5Kq�[#V.g-7��%�Z'��-�����VU��B�<Ӭ�J�8~�N�w@�X\��6}<.f���N
7|'"�f�o)TrH�)��wK�3܌
+��IoS��/�.��&F���_ "�γ�@]4�~��l2��<-�N�I��;���>^!/g.%ܟ�� �m�ͣ
���MͰ��*�� ��B��Ȧ0���W��B��
�us�Il�s� �_�f&�7j�
�$����y�h�<zk���X��3
H�
7pF�<��G'�[xb�'
��
}�q�
�y6B�˘D��"�DCXUvv���
+���
=�>Z�{��#�'�-?u���/��`�v����͞�}�L��O
�����ᵄ��m(t߬�����d�WV�p��|&k�����wv�f?满�q�2��;d��-Ӣo_$[t��|��=���d�&�+�;��o}��X=
s��)�������GUؑ���K�ˏ��0��3�����h
���3��� �/u�K�?�dx�5L�?�U$�o�>�g ��g��v���DΔ�ux3�*�gŲo����ד\J��؎<�-�R1��l�p�a�#xZ*����ݴ
˗S%���Y�-Nh:;G�y
�����lc� ��e%�a8��pa] �Y��LpeZ`�������h~�\�Q/}AɁ�ʔL
+8�����(|
��-�T}���S�|ϡ���]�ȕ�8�*:A ��]�?@�e���N ��e:�H)>psq{`r�(�(#����T����gC���M���>����<��������܉�18$� ���Α0To*{��UM��؉��e�>��x'���]r��f.+� ��SaI�.nz�6� S�λ^玄y��s?ь�1}�$
O]v�
���u
��)�c
+A8���Y7Ȝ�Vg�Mg�UL8
�[㆑Jl������~S��g����i=�_����i�
po3�s�`[ɥ�#V� w���`^|��%����h^��X]�$=" ��.�!�c��P4�zT@��R؎d�Fm��bK}��?I����E��M*�
�\�����S�1�v_�W��J��չ~_��m
+��ŝP���k���^ �t�$o�7����f�_�X�B+Z���9��e-����l���
�>��Vx��a����l�
?.������1�}JV���y�%�e�멤�
�Q���q�dl1*�ۀ�R��LJ��h��Z7��d��
x���sE���Ńv����bR{<���o��2�u��"
[鎙����OC냹v4�'� ��3G�b�������w`��?����A��O�z@��En�^�gl��9��?������ou.�BN�A;�{�Ю� �G!tb�Ct��d]�
��J��u��0w������0��<al�\�G�����b��0c$�u;�.{s6
J�`o���xv�!��Λ69���[�I
7��iMf�6(WW>g�.�@��]�w�&�D�c�u��
�6qH�
+C-�v��O�f�vI<���� �-X�Es�
y�^Uz0��
+��E�3?+�e|�87\�S ^Y>߅�x/V�����q�g>����+���,dQ>�{��PX��]�c1��۩��V!��n�'3F��
o
�����w�rj����
�nk��q��&'�C�s.�P�&��(����N���$�G�b ��Uq�(AӶ�
+�g�r{B 0���S��ǟ؞��k�ep�����o��o����Y�S�uU�{?�z��r}����M��Xĝ�_��P9~��"����fp��
��y�Y4�
o�8c�u�Js���
��ʵb�
v�E{�0(���\�ӟ��LG$mQ]��
�
��X�
o�'pW�*�>��
�Gٓ#m�` н�3��\��
+u�_ΰ,(�\�uG�'�%tU�۠*�� ㎿�
� ?�4P�5�
L��/�A@�y
�"����/���(�鮡uPF�H��6��Q�
/��֟K��=����zY�-��܋ۓ8��KI=
��K�����^̏�w~�^�]���J
21
+�b/?.�؏�W��u"����݊.W�K
0�iE�/�O����f��\�DL*�6%8�
+ ���ΧCp'ӺF���җ>�om���^Њ*���fշ(��)��,�%{�j4���+�/�%
7�[��TfV�=آ���� -
�>}[����ܠ������ݎ��W`���tg}�rn�NJ
�'���� Oi�
֦ۅ��v�[��?�c�ѹN�
�蔻�KFW/�
�����5�w��+8bO
�_3|�F
+g���[jr�.-O��@�"!�I�wp��Gþx×��UÉ�Ϲ9غ0�%� l�b�Hk�T�qr�����=�����O�Ow�p���.
j-�'Vb�RQԭ4�W�Y��.<��IP��
+L2
]:|V��O4�0��
+l�2��_��������;����Fp��LW>��2eDݓ=w]R<�4�>UW���T�
q��X�~1��3��
�I��;��I����@ޜ&
���;yL�nk��)�ҕ�C�}��Dl��*3 |�l��E_i�G�G�$ث�y
%�%c�lB�mU �=
F�)a�)����ڶ��A��Ie%;T|l�=.���v�i�v�O�$Z�y�
,��/�������͒�����x��u�
+F��'���E��Ƭ�P؏o��>�s�0��R�G�:ȷ��8�O9�G��+�V��݇���b�e"��18V�+H�TF�մC�&w�g��;()�������$8E[P�e���'
#�I�ߣa4�h�l;�ٶ=�o68?"�̹l�?�.��Xʊ��~VPd?�p����I�_��X:��s
�
��ڠ��'u��eS��}�{��<p/'�1��z���Ӟ�-.�t
���j�� �t����|�
ή�1�ݻ�S�L]@8<�������
�� ��Ԏ���6��}�_]�
�a���W.��i��GP�oz��Ћ�� �n���mPbS�S���5��5�Tb�N���Y�:�*��~�
+�{����e�h��{��8��E�/�طv⌂n���S��&�n
Q86��6���߱+B���sr"��?��
�0�=��n9v��_vp��>�ߟ�� ��Ig
�ax�����h��=�;g��3YvE*(��9$4hf^
� �z
w������<���<�.4�ϳ��!�
@Xl�U
�S�ж������!��Ct���Ǒ�M
+B���u���x�ۛ�x��E�n�
��S&s���2�JR{J=���1����C��,�Of�x#3�&}
�o��~[�
��%�(�W���>G�e���"Z?��a�j3�=�y�P��M0AI]���v ��|4tpGB�M��B
K��7���hr4>F$��ݲ�
�!���>J�����r���!Y�;�� .�.��5��%�������b�G6�
/�_ʫ�ծ����8/��K����Ǚ��EDd��Q!�a�a��{����H�:���VUW�bP^_���Y�ɚȆk�v�HQAHf��}vQʪ�דi@�K=�/��Ɯ�f����`��
y�RPF�ƅv]c!d߯ϻ
k�ʚ:?0�;e�E�i��
��"F� ܟ��\��;`ɀ4�b9���y��JTtH��1�A�d$j�S���[��m ̳�rY����c�g�~�Mu���͟M��Eɮ��7��,�j7��QX>yuu� ��A)8N
��`�ٞ��f��J#�c���p%��1�^�lP�&��*�.2\ �.�)P����R�
��<�*��
��� 4�ar��{��5Af�������<Cp����0#��rFk�<V/ �/��������~
��V��);�kY��
�5\ �0�JS�x�-��S�n�:x�q&�7�f�vF���D�s��;�t�z���7�Z�z��;/&ۻ�#a����qzQ�z�Ж\���M�?J3_�
�
��!�6fa�Z
H
��Xk7��w�pn5�nO���Fҝf](�ݑ}���
+%�2�EF��1F;
ZL��x!gN;�WETt(MrE��W��c�ä�OO%t�r�S�,"�c˫N�t]&�*��\���C����
a؊�ƪJo ^�(S�
K�Y��<��|�~o���
�A<��[�Z��yj^ޚ�wK2gu�v��P�m.S-χr=����� x4DSLP�A3n�
x���jgހgS��hiwv�Ė��,N�0� Š���J�i� l����t{d0w��m�¡hۨ6ר&Z��9�J�2ƥ�b�jz7`}����`b� 7�����j��χ
��f��\���F�5B6�
��5B9|>%�fZ �Y��I�tK�����+�._1L3��Jh�>���8~:(>��Y�)
����
+�:߮h�b8����*�V�
?ٟ/1�N
�c�k�T�%v���^+{���fs��F��J�ٗǜJ9XV0u��XTm_]8,W5�k�_B��[d�)�oh��C`�v�B��˨k�iv2���71�:dj���?��e�i���r -�`D#)Yx�,��C&
���Y����X�OvY��Wܓ�+�>��]�<}K�� >�x
�ro�(��Xm^6-��\��GS5�
��������;�*�6��d�ծ,m�Ev;��N�-�N�_ɪY�����
I|�9��(�'~o�`��z�7�؏/(�� ��Z#�4��';~CS�5�B�� ��6C��AG�g�Z� �d�H8i�[������6̨H��K+��Lg�4�f�H<Y��?5A�ڹ8��W ��� ;X�RG�t����
�X�v��5���'��.&�ߍ5��0w+<лsb60G�:
vF*b��6���u�L��.L߂����f=Šڝa\8u/�m�{3RN���oo�����S���-ȟ��~z'�~zzWב��_}����_�}��ǟ���?���O�|{z'�������
�����_?���-[������ӻ�qm�����?��r˷�����p��3��8���[/6�ZO�T�!z9A ��������ߞ؏���_�R�� 8��A/�+�$ [...]
KD�u�x�
|����p���f�J������% -�`����ɏC�F&���\�FH
�����>xg��g�\!!�jU�
��u��x�Jf��
0�O�6��d�8{V^!���z��h��נ�{�/u(�iޝZ�
+��K��{_'/u���.���^
DG-�C#g�L���$g��GߖǶ�Τ�:�y�8��\��
S�{�������L3,�o���J$��b�:�m��Rk�à��˝�t�0��{@���.���%?�$s��G5�-�m�]h�T���쩵Lh 1�һ%�� gϰ�a�#��@fN�L3�u1i�����V��d�X�����
�;��d�[F*
o���m*ޛ{�JK�ѓ�ź�
+f�R +㗲�أjܖ���Y��6�ɇ1zG� �wiy�BH�ܥ�1�
+�* q�
��ѩ�ca�Y�dA�����w�WQoY���b)t:
��d�Q)��5�aq7y���\�t����Ѧ䶵�-d�[��*���'[�
3M�)��C�K�� B��a�j��W߷�9<m
�A�7�܍ӚN�ذ�^i!��BR>��3(�Wo��h����c���Q�w5�/�]����
d��+[�
ѫ9�h��ɵ>0���� Nz�����~��Nf��nS���&�(�J
+�����2';$)��֠�����}�;��HNH
dX%��i�~ g���kܻ�^<~�i��%kq�8����ҾAp⍕�^D����VA�S���k�����X�^�ٱ\ӡ
O�L]���J�.1gM} ��F�N�8u)רQQ|?r��5�SN��;8Y!y�dz�r���
�E_�x�vfk��av��G���v[�6�����5���#ͤ��.���z�E�!��
[�B�'�
|u�����0�K�d,��>ĺ�VNԯ>_2��k:wyT#�z�ޅ卤�0��%$��V�W�;
�)�DkU
��X��,��֔#jԐ�4��� C�����
� ����a�;ÍF1��K?q �H
`��9H
0�D�
º�
�R ��_�f[`��q[��"��m��/~�.u�{��G)d��@F���}���2D�hdV�'@�ۜ住��S79���лR�|���Y�B=
�����,�����N������
��8����*�Uܾ4wu|�ԗ8g�6�l��
�GF�b��y �
'l2��;0��Z)0�������x�#�u����*$A2�tcW9v<�O��qVC<�3Uk�h4�ƶoM�{��uf���o�%
��I�� ���G��{�NP�˯��J��H���퇫�R|E��td�=Q
�����Ѵ�c� ���-j��d_(?���V�x���$Y�:��5vNQ�)��v,Z����p����`bW��v5z㐽�%�dU�{sc9�a� 8�L�&i<7o������)��|�klOm.��j-Ʋ��P�ۣ!n����QB#8�?|rO���yJ=�)e���Թ �)
\�fLŲ#��Ͱy����}���éoƹ�&�/�_{�~M ;Y@�L��rQVO�cg7?
�[ؒ���>}�c"��
�v�[1лQU�98�:��Қ_ڸIy���"�6�w���RF/�O���N�
A
����\�o|�1��dN+��썎c�A��mQ�Ʉŕ����j/`���,
��h�^B�\���r
^D�WDv��R�d�0�wZ��2�.b��TMĆ5>��3a
9L4�.(+~�Y 7�x�
<q �s��ĺB�c6�Y�i����J��-���i�� ]+�V7+;j�uGb����,�zws���?�?
d��H����:8�ܢ��i��Q�ٿN]n�RR
+��c66�N����(��n6G��
����Y�a�5ؾ�J�*#�Qk�h�汽;�G��(�꽏ǽX��^@�(8�����`�xu�"�R���rp�H��*����L��&��べ��*7a໑
�W�v� ���F^'�U����)�lRar�1V�`E�^(
�J�R�as�+��V
+�d��y��g����E�c�6ְ.��Щ*R��R{;�+�W�p����0D�)`��u�KnO��>v �k��2N/
��{.A�����e�9N
�U.)��PO
kM� ��q��Y�ٻO�
2o)���?}�����c���F(�A�U_�qJMe��S;^څ��+��v�cWt�L�W�:x���Mٙ�,��-�&�@|7h���
xh�R�J��5�ئ������6�~���݉�9
+Ӛ��v՟_pR�/��[��cҀw��6 3
����!8�/�W�3�c3�Z�����1�k`զ��$��W�Q��PAR�\%O�=��_����;�֩7�M������
�����U��mW煊NLy|6����~�͉�<)̜9��-C��2ȳ*l�
g��|�� UN��נ��Y�����*eZ�}dRz���_���iyE� �l��+��]�?�ZkF��vM�;�!P|��m� m:(7�y�{ѕ�Tʈ��5�(N�[T4]���1��Y PL�`�� [...]
+/5�����1" �C����ebd)�֫��eA^��O
+Wq�#�D �dRy}��;�W�p���T �襽(%�ky�{��D�g3�t�P
�y��������7���X�Ŧk��'sf�,�=��5miٹ��8��'������7uX�7{ZOH�� +��0�9����d�_�u����6���
�j��1��K#��J�X6� �`s��:��)N�V.+��/���+�6�5�����O�[���iE��=��Ga�/���
�/
�5
[�p
GN�{L�
WI,
�M�S�6^ �!�3<��� ��(>���
�#͜�.�㈀�>%�ڴ�M
�4��s��ݬ������j��
�v��N��������.EȿS�
pJoZ���eN��A��e�o�X�b~_�7�������_�a��klk`����t�a�>�l2-4���؋5#�i�@�:��1�
+� �<�NVƼ�>
����m�o���;�����{��:�J�g��|�4�����Gc ֯�!����f��=���}l���
���O#�(��ҥ��V�a���
<�eR�'�<���E�m�/V^'
fT_e1Z��K������\���e�� 7������Ԩ��ɦ�
��4�^�
+��M�?
+�iY ����эf��E��l
�)a�Dr}�:`��
E����l���R[����� C
�<�Y��zn�6
+�:.���[��p�
7+V���H*��
+ƫ �Ӕ 9��T��cF�����6,~X�j�
1�(ݒ�
��
���`��y�o�m�0�Y�كgQ�j������q1
Ù�<Pr�눓���H���.��mp'��6HXI�{"��z�
d.SL6�����
���E�� 6t���!��n��E��Z��E
�L�D�>B1��1
���=���R�u�S�` {<VO
endstream
endobj
17 0 obj
19451
endobj
18 0 obj
<< /Filter [ /FlateDecode ] /Length 19 0 R >>
stream
+H��WM�e�
���p7��@.�,��r�&��
+ �&
!��?& T-&3
��9��{_��Mv��y�c}(��J���$�oj���"���s�<@ޥ+9(J}{�<N{�Ln!I雃�)�r�M�`�3��}�<|������Ҹ
��<��s�*{�j�J�k�g��
+�afz�7P�h��,�
�f��xύ�9�xJ��w������,m��
Q�,Ԧ
9yy��9hVj�� ���X
���/��u/�>O\�H��Z��\
��9�R);�R�il�,m����4�&�3�v��V
peO���ڶ��C�I����é}Ϲ���x���8X
j�����iO-YvTw$�F*�s���b&uD
2B9@͵:HYf&o�;XY��L�-/�@��ל=:�
��[��Wp�9��Yd�P�M���D � ��*��+%S�k�I�n�kq^
+�礐�J
PS)��I�
�O_�f��e긧�7���M'�7�(\��V�J�r���쬓�J�|������X���b�8
A �4�L�� ̨��U���:N���g���Ò����
�2���ߑ�
9-�wCr$Of"n��Dh����KBu
��:
\�%�Qv�]5��a��=N1|��܇4
UO@o��Ϻ����{����/��H�
),e��
iA,x�'�o����Z�z���J%�Z���2�`�?
ݻ�[Tk�^8u���/,��2���^�5�;;Y���$iɗ�D`.)���1mg%�[S~��>b+�G��i���>
���.jձ^E#�G�Ī���h�:q+��W��Ԣ���&���4n�Zqz����t3�={������pH]�Q�L=�Ŋ0`9<��n���]둟�������qX4RX)�7`�w��+�Q�@
+
S��HB��P�
]�h�o�{����%m�8.Sa�
#��H���]�H �8
�6_�e?
Ik�<�iI�*�/1��Ž�ݤ����?]
h����
`��8����/sQs���2�:��Y{y
����(\�6ٍGqZłQZ�.L�
�3R�ׇ�3f����ʃ+�t��z�-
�4|7I�T#�ij��T�xwy�9��8��X�s�C5.�sc+J�BYXŷA
N1&�\�
Dn���ր��k��9
��^���#)s�����cM��L��5W�
+\S�.W����([�^zq����V4ܥl��:ˤ��T�CS�t�v��!e���)�<]�>�M��k��͓�0Og
�
+�Y5a6'���ރ
E[EK
��,'
[A
��C�e�R�l�
�;}z2|j!����
�T�
Vʺj·W>ϰ�-#����%���_�i��U�w9Z����Uͪ�
Yld��B���+�_�2�
� �'�1~�K�3F퍣�wdmj
B�=�
�>,�A)��+��
�1-XR��2e#�!�}�+gZ� �;���74
�:�6����8��t�������<����ߵ����ӷ?�����Ï?~����0�o?�ϗ��W�^^><����x��7����/?]�_�hK�����_~�_���&����-m�p���\e+�eC7DŽm��r��K�+��5�������=���
�<K��G�Cµl�'�
�^����k]�����?�/�i���-���wB�i�w��/,%�j�~������Xwy
^�2��`����Pw
%h��i����.�
����
í:H(���n�j{@� ���@�}��(5,^�aM��0���eɍ�+�X��?�Gk���g��?.S'M�
��ԽM\�[�]S�h�9��ý^�
����X�Vm��,��!Vsi� 2V�㽌x���;��Å1ަ
���s��Q�d<�:|�!�
:i�m�Hە��B�JR�!�8),�`��b��W9?W$�q˪�#�؈�v
���ÂyۉC����#��$໔����$hNH��]
�jX��F6���L��S.d���s]�ec���w�O�!�x�i�_ C!��6_̆�Lb��2Zô�G���\F"�ى�8�f�&-
-if�p
u���<
����SDe��x�1f�+��
-�@LJ���0��y�}U��Z����Ēlm>f�
/�NN��q5�j=��"9E���"Yyj^l���θ8I��~)�
�ϾZ�{
�`����y
�8�-
lub��
��
+^�'�
�s�Sݦٰpϡ��3����8�%
+%�zX�G�t�(�10g'
�eNC�
�h0�TG":&a�hC#�=M!@�ƧQ�0��f��0�l4�P|Fn"
�'��J�ٙ�RH�3����0P�i��T��l�N"nq� ?�V��̮r��#�D5�ф�&
ϙbU�gE���� Հ�i���`�(��:���n����
��ԢӦq�xά�e
����/����������E͒f8�-s
�K���vK%�
�gׯ�~�
���:�>0����,���
�Vs��
[���bx0z���&Z����'�
+�+Y���Z]�T�N' �w���wmT%��ߩx�Gk��a�9�($l
�`c/*
F���^--z]Gpo������Jg����`"���q� ������}Ҍ���G5���ӏ���`0
�Zu�wF��?-
]�5}z��}������kE C+8)���I�!w��{A�6{U�I�l�Ƽ�~,5+ ٟ
ۓ���lK�il4�:B�X2�q�ش'����Q1
pP�M��V<5�6���a�;�r�`�o���QY�Y��za��ǻr�0�"��1���)U���h�����i������Hh�d��h��̞�x�Ei���~%>�\���, Ul��!����s��P��N�EG�����ka��
�C���ңJB�������`[:�U�T��i��TI�}(��XK��<
R{M����
8���>
�D�U��E���}������ܾ��ݫw?��J����aZ��V~r|�������p<~����퇷����?9~ˣ�_�оv%I�T]�oM0�|B~����6t���/0��>��}�'�>��$�}�..Yñy�z!l���U6Ɵf��4�y��5P���ݡ
\ۛ���ېP���
�$��RoA,�{�M�']6
%$��XB����T���T���=*�MI���q���v�� ��
��g��� �=��k9
��aڢgtUs�#p4����>�'�<{�D�w�DyY�0M��|���C>��'��������C
&S��j��f���%��S���eg:�6��<�E�P�
�P��W�g��_5�
+ aw?9F�Tc��B�!n�H��V���ZP!��<��\=������l�6t���c��i�Y�n�{��t�5�S�̝�O�h�+O֘%Q8[�%��-�����be
�h�Rc���X��,O��Hrb��U�u靶>{��9�
�83��!SH7a )�m-
�u��nݯ��JM���7b�l*UD��%�k��2�@pG��=�QP:
+Ÿ2�¥�)�l X�א�{c�LmFi�-�s�l�ѥ-�)3���V���
1��;W�>{�Ԟ��7p�F�ꔄ�l�b`�
*L�
4W�E������v���NZr�
[�
KTQ��9��(_@�ǩ�
~�|��(�����n"�
x
�(���j��'�j���b�lyV�y�ߑҹ��+��ͧ}�cgf�c�z{V C���t��&�����Z���M��쳝�������1v$��ױ
���Τ/�ϱ^�٠���l���rr�o[�j��U�(�PG�s�����k#�:q� �[ia��FY�̈́�0PW��J��1�.K�'�s��-7�F�p���K��XA��֧��F��;�����A��GS�As�7���Mߏyn�А�\O�AHl
�����R����zWڔλ"�U���Q��'q;|B�P��I�:�e�!N}ax�%�V�T�e�+ at Q
+��w� ������H�u
�;%T�:90�a�� *k]`��nJ�n��J��S
���,cX�����"u4��
+6�8��
�P�M,I\s<���,��µѽ
l����pJQX�Hf�`d�%��z��\#�5�x�j��ZsR�'�����S�ɪ�۶�X�y`Q��
lx;Κ�
ދ۔ʻd.f-%�D�ڶD
������H
�7���)C7
�� ��a�+��у��g�.��,�1�.:@�i/}�������:h�S)�^
�M|]��;
�U��!�{�9���
f]6Ss5I]L�h�����E��
,��@��Bʡ���IP��G<�9O52�?J�jr�`�HQE=K.t��Ϧ����}���O�����,<��y��/���}1.G�N��O�?~������W����F�>���7w㏿��{����G}B����˟
}���ܛ?�����?�~:����J�k�y�
"7B
��dW{�xap���~���l�3����r��<�rp5T�%o�k
�����u��Mfr�k���xI�p�����r��v<聭�
�
,|CE�"�lGq35�`ݿ�[���+3VM�ڪY�lo,�]8���
j��>�U�Z�>R����|��ֺ
�4��~b��N���.��|IV��8�t:��l�:�����y� �1(�T�M��xi�qp��@r
�,�+��K��!�畜v���Oܫ+1�
�h���1<� ��s�"5�i?ܫ,`��#̎8\g���!o�,HdP����B�D;nPq|Z�,�����ƍ� ���ұ��F�s��8�#{z�P_v�EJC ��r0
+��$r
l:�qgF��� |��G��pP�X�"W��X�#�S�+:�l�t�{��%��2|s)L63=����+n9�(�aIؚ�4�4yV����atG���Vd�������_Q�m��gQn�E|��Ӳ`�v���`v
j&X
0F��2_n����UP6Z�qث�kg�d�T
fn����̎�:� �H�(ZdGa�hnu�37�����.a �,
{�y<��G%�z����5p�}+ǽ���ǧ��]R�Z�I<`������-Y�IQ1$y�>�Vq�
�K���f
�-�aSբVau��P6��N�7/Uo胓���C�_"�.��,�=�#�IX���5� �m�4�w��e/�_�r��\]kΧE� w 0q���ů#XCs�݃���ĸ�8
aQe���A�5��j|AFn�J�a�|3�Qk}&uo��ʅ`?�Ҏ
ǕX�:����D��;�XRjj5�{
e���FT�G�G��]+����x�s�7�������)��X5&����j]|1��ɛlHkn���
+;�B
+���+��k�+W���;d'��&]�95�v
p�Eû����J��aX+)�5���]��
��t�$�
=^�
\Zi0k
+�cv�s���-
�t�������fl}mK�,�q�q^�F�r]�Uӂ�㱸��M���q�QT]3J5�|�pw6,/����p�w�>�A'|����J�b��H��Z�D1���
u"#q̉�4^�� ��
���m�y�"pM���wؙ��n��a�
K� R� ��4!LD*����;v$�S���A
p8����v�U},�qp�)�ae9@c��]�L�z�w��%&
+� ,+6�./@垏��� 8P�� t��w�N�ӊRp�G[w
�$���N��V.1�8����h�$�Gx�2��xx-.i���}��w��F�ؓ�W'���ki
+��n��[���
�L_8i-�ZY��N���*sk����o\6��G��IH«�v�)q�>
f�ܷO
�cK႙��G!��ʀ��qA@
�����SL�w��6��ff���U���Oaˑ8���Sw
�� Zk���^ ��ݠ��Ɲ<\ˡ5
�%�S��$m���F(�n��G��4i�"<AK�&��[DȪ�Û�j�q�c�Slb�����X��pn|q{
7���jɗ���{G/R�r
�����ٸ�Q�<���x���<�i��h��ec�^�;4��܍����W�ˡ�m�����ы����e�B��gE�1��
���T�c��������^G��)�E.�y]�37^�`x��G�+�u�
� K���e\�V�l���v���y�6u�Q]"B��멅=d�P�@Blzَ�*�Z����V�e��G��$,k�+��+]y��J��[#z{m���h�~�
Hy��
��D�%��L��
��mV�7֦$7�H�ͽ��t�����\�\�|�r�[�
F2��an�A_��[��/��:u����˹�anf�z�*P��GK���IU���h3zG}@Q�hسs��ؚ��"���A~�h��Vb��.>]�-�F��nM
J���
[6¤�O^�"hwn���V;��ij ���ˮ�[c�d��
+��O@g���i%�"jt���ED�^�j`���K�~����
Mشo���m�67��q�'��Vo�'�m���/�E��K�S���� R[�+T�7����L#
�N�K���a�yWD��A��ʷ����4x�:��7�~| ���ÃU���e�*�)j��SQ�c�~��i��
'c�oV��H�-��S�٥���x�fʠP�G�`l�6��
�Vͮ�(�i�#��`��*�
#x���BK��`+i_j
��^�T�7�\��sLT9}�
X�ڬ�$�QBp0�Q
+
x&��TM#hį�N������Fog�P�h�
���Iq
"ʙ剷g�o�O%���1: v
�fy�>",�n�^y�[��k
TA9vV����b�ț 1�M4o-Ǫ��v[�n��d
j��@�Ts�;&��Ư6��&�hA�<s��b���o�� �9�D>i��gQS�\���fs�n�]{���s\��-w
�[���8���W[
�
+���O�&ձ�ʳP8SQ똃��̲.�E���<|s+��!�Z���
d ؠ2�t�.P��S|\A�M4���m�
�fe,E@�4���oJ�ن�0
���
{��`�
�rQҤ������՛Y�Ѥ��qn�>TM
+����Uc=f_��>��,D9W8���<N�@�B�;�*�,S��G<7���WS���8�j����
y��B&��b;�
�G�p��H6�-��
ˋ�r�sP��Cߛ�dG����h�
���r�2
��^��Ʒ��듍6ʣ��O�%
+ү![ �[�}/\?6I� ��B���
Qqކ��
h���Gٺ�q�e�n��a�a��o�U��Q�0
���LNke�U�U�6���q{�W��)�"��&&KKD��#��7TKC��2NM����^h5o7��O��Y/Y��J
�j_���(7cGՕf
`�Z���a�K����⭽t%�
i���^�
ۊe<�}CqW�5eM9{�JG�I\K�8�yw�r${��6d�Īm����f�
�ֺ�{]��'>l*��I�~b���� /@�.
+�ȏ�q=n�p��5m}��ʺyx���5�xc��%�R��ϰq��] tx&��J��$��
a߇Í��h������ʾM_�^��I�{^��LD�>dV# ��Ͱ�[ld��f�� 7n�xq�W�:,oO��o�>� �#��������\��
+�]��N�:9�#
/���)��p�l��h!�Ķ~O�m�@�Z�X�|�q*b���ʟR��m��b�9�����X��h�.��)���3n�W˵P�;V�z`�ʂB
,��$�����;�r������^�~���Đڟk�A�8�÷�u��9,�`���Z
`��h�`�|�\�����~��m_w
#��k���
C
�� �4���g��'{�l�y��v�����&9�Fh��1�E0��[��sP���U��`�j1B�� _5S.�N�����(��9��s�,�ɗ��w�ս���3;0�Ւ�5�4�˝5�c�U�W��2�ͫ��^q�F�����_���\��[lܶ��q�u�X��7����DFj�W��e��JePBʲw8�V�Rx��ӧ�:ʎ�:
+��r����ʩj�]q�
���܌v5�C�Wm
U��Y4���Il0�xD� ����s �Z�^H& �\2� �����^-ɑ�8�}��@W�KI뚥o������ _��<�q��z��
+��؛z�!�b.�ZnX6ra���kc
x
9����n��� W�����C±ȣ�˓K.�!1�3�
���[1{?��[M~?z�f\� �YL"W?|cP�
X�a1�/x�*�{���1\�����^8�bX#g�-�_0�~p�Eo먚�8����x8��Q"��;���f
<�-��3
��g��+ԅ�����r��1����ӂ,�-F�R~�e��B}�a��:}(/MLUm�1 �iq��ǭn��˅���զ|
��$��YЖ�|��K��6�fM3#u&`p�Tdr��U��<�eW���R�ݡ�:�y[;k�̃��j��g
�
A��t_���D�Y�6tݼ35j�(��4�6R`yڦ�|�*u���4
�b�P�>�RK�Wؼj
+^��Tύ�!��
+�W�;�^Z
rBv�Q��6�i��I36Y��X�Al;W'��.�ۅo���l�
�s/D�X�J��]�x.�v���-6O�K2|l�˷�r^
3�b�;�&xH#��;<=m�X�u� 覡�6�n.9��!~u9��?UR�!�Nl�R-j !s��hG��&���eP
A���L ZHt�ݦ�х����J
RA��}R���u\���eDZ ڑ���z�Ql8ȶ�]������
B�=��e������=��R��Zr��L����<��glt^ m�)
��pF��L�t
/*�[�C�����*
�bz�T�����w�]'��r�,�R�Z�(w�
�� �@py�|∀�e̦{x"wϙrh�>�8Y{v���¨yv��H�Z��m�R�RN߅/�Y�.�q#'�N�/��?�\�Ǟ��~��Q��s#Hx�%'�Ōg��20�T�0#
���]�8���Np���>c�j�O�j�ӌg��,H�wpa�{,<��W�<���.|b
Q���xC�M�:sa�
{h��M�|�?���s�t�
}@���3d��]�����"��9�-�
+,좈
�GZ�رPk��Ι
�S���- at pD�M�ʡ5�/
<�X?�+���^�Px7�!c��F�
��$��7x�t�H�l
7Ё�)/Ћ(�m)`�ۘ2�j��
�xʃ����%6�wVYF\
�A�bs�͛Z�Ǒ
�$X��W5:g���8Я��p��m ���gO�x ���Խ/
xSo
����`���c��ӫ]L؝6�Y�
���*�$
�\�TBvj*z��7���ݜ�65�樸�x>�F�0�)���J3�H�h��.�������
P�Q��Rp��{��9�0�[=����:f���p �
�^d\�\ca��T��!�u)@!� �Ǚ�
s�zT�=���g'���+�*�
+f�����O"6���Y0�G���XQ��Rj �l�]B
���M�-1\���̿Lb�m{P3��h���]��
�K��!42�Z�XW��
�5,]@��
�RDnfY�#�
��I�
A\v�!Z��N�
Z
BX���7:>�~T�
�mv^ 'ń�*1�w����X��U����PS����Vr��RD�
,Cm
�M�2t�8�[��_l�f�MCZ~|f���v�/}���yW�R&@���5h�^%�����]�i�2�t�����}J���Ύ��a }j����[�ӱֹQV�z"��is{�e�B��/�[�XWV��~���u��u��v��Q�TX?૦�w�j�Wo��o�|0٠�����b�熻�|$�
+
�c·�ͮ�����ىO2
�Qiq|�T�1�
L�h��u����z��D�5j%��
${�
�
+����c>_�5���Ar��_�v��
�)�
х�'K�B/~�Lݠ�8��n|
X}�R�����<?�
��&`)
+�+i�ׇ'�i`fxB���d?,$Ҡi�\�S(�wC�k
28^���]�|J��Q���!�殺^ϊ�fG��{
�#s `qv#����4ѵ0�`��E��ٱ
���Z-�dC�
��
�6��E�bc�
�Xi�!m��P 1�%S���>�
v���fX�
�
+�QXX2 ��_L_G��^�+}GS%�
B8|�}�ﰏ*�e�RPf��RGoO�#��p�)9Ȇ
�+df�J���{�1Z��Se��)������"�mop�$��c���-Y�;A�||���JaH�������i7t�E��� {�����w�v�E3���X��Ip��؟�+p�E�b7k<
�u[�ͭ��oo�x��nk��o���N�
+Y�jrG��N`n�3�n�z�Du��^N��7�"��u
+pN������/�~tM\�� �S8�������]�͠��<5����/YYY ��X��
�$�F�|Ȧ��(MĨ����֛K8�"�6�Օ
�`#1e��o��Ύ0lf�.@�F��s����*۽�X�
䂊��=��lU5���S��r�]�s��z�E(h���T�D(6���M
+�ݎ&��d�8�?%��
w'�u�γTl�v�t^w�`5~Y��>!/n��ly7�(pO���f�]�p�&Wր�9�y5�g��n�
+d�Q�ŅQK��U����%�ʩ]~��X�S�`Ϯ�}��N�Ć;��1��|�D]u̩u�.P�A2 �)]u���H�x�^n���}�U'W@��Q�,m��vm�B��C>bNE�y�|��S�rpF7+�i���ܧ��
�i�
�/R �IoE�����I�[���K� ��
�Ξ&0���у��j��
F-趭����O��Ehք���c�3��|=���?«�����
��&0��P/�c9�d��!!`�!�`l�t/&c���
IG����i�էR����������8q�pd"�)�s �&�
+N�v���6�
���Q��x<M{PRa4+�({�Q��v�C�}n���n8�hS�{$a����W�
�&U'):8�p��:U������
~$H"����{JT�
��Tk9��D�jDE�����Ϣ�q����]ӭ���Uz�УKIì����ope��n{ہaXO�ɀC�p�6
��3�Z����W|*Ώ�a4�s�C$�f�����0��qsz�$M��y�!}-%�z�Ä�ԑ�76�9O�% 6���͙�%5��qy��SF�x]�<���`��I >�I^
��'Y�|� [�6��1N�8n���7���NL��[�ӄ�s�s��]�����~v�t{acA���b�X����[�*�C}X�4e(���1���{L�De� �N���[��
h���=�p����
~�b�)
2j�i
'�j�
x�>�,���Ӫ��t�{�^-�Qx���V�qc����⮠Q��1�a?�Y�vI�a*d �w��d
߯�rk�e��l1Tr�4g\ul-���&��)'��T 0�(�̴K>rP�߬��|�+X�V�į�0&cV-
�mIv�uy�cH%n@h�[��69�)�T�͐0#o�;$_b�A�I�I���ͫ��I'�ER�vy-��a9�m����pH&أ��Ξ�}�0ʩ�
��2j�|����e删��B;ZYqL�Ep���D:b��]
ۈ7���"3}T� �8�e���"�J�qj���b�;�95]ƈg�q���������'j����F�
+Iq��g�u[�Ko{��U��qN_c���,�Nv�
߽�Ģ�����e��`H�UL
i�yi�L0��<t�y*�hp�k����}����pTK��<�A����/��'�y�즓�B>
+� �K"���ѳ�_���k�%&o-���N�%s�+B��^�Kx���Ntm�e�:;[mp�����[��iEJ��TXuA�w��J��l�m0����ĩ�#+U�3"IٙA1(j}<�NL�o[|��$�h��z�@��p`ˏߛ5Pj4^λ�6�K5�W��-z���9��J��K�u{d���Q��`+q��<�j���z��1F�/�#�Y��Wo��V�K��ݻ ҕ�,Pd��P!
+�.94�пI/�rޢָU%
z�ř���ٞN���
+�b��Mnذڔ\�A�ߋ&�1�8����8�O�~療�wXu�J�Zy2�O�`b��oA�G
��IJ�_��ju�y���"XP�F�C����� ��Yb�,�Y�Y�� �_{�G
f��y�;?���
z�؊r����#'����]
��X�� ��y�ц�[�ȇ�>\.����>�M���*�ܻ
n�*�S��z6�w�] m��� ,9�=3A�*\�V��=�wp}�Nu
{5[N;�,��u
+nH
#��Qks�3�/
܅BHk+�=�S��
ؽ��U�ǟ_���d4g��w�l���c�n�ig扜x��f}��{��߾}xs�aeJ��u�.���=2�jH�ơ��Ϸ�Q�{#
+b�D�X�G�n��/p�������p+�X��n2 ���W}��-Ą�Թ����R����;0�b�_��PP���/Z�=SA��1�拏Z���.��w
���eR}EЋW����Ȃ�ʸZ[l)���e)�ީ�d�.���rX�þb�$�r�!Z0N�p�+c��o�
��C��c�>��F��P�
B|�
��+�#�
�Ñ9�J �9��YU�o�:@�Y����F�Y�ْ��d���W������Y��BfG� �,�����Ϟ�@
�?�q�5�v���i#
��@�d�$�'%.b��X��P|v܇)���q]Hy �}��-���¶�uqiFa
���
D���
+m�����}�Gl#K��m~�����`�57`
+Y<0͔ �Ѩջr�n��ʦ1
D%�.���^���%v�ҽ�5���+�˫����2
��-+&PK�!�/�d��6 S������T��~
+
�i��5��<"
n���
h�����"jd��(F�� �V*�c�-�on��xnd�Zf,����
.N�#�h��&ɔ4k�v����/�
+N�
}/7�TJ��S����;�z5nj���+c��gjO
+�>�
���J���K��أ�w7�2Y���aߤ�<�q�7n����E�*c(�D�Q�"� ���yt�#ׁ���
.�;����5(0S}�[I$AI.� nb,}7x��g^���W�5W�W#x<���
ͱ�ؔ��=ҫ����W��A�k��q���̷��ͷ�w}xs��7��~��w/�������?��駗�7�����~9�}yy����E�U�����7�>C��K���������ri�?^���t��w�}Z�`� ��F��8^�PP+��tƱ���|��r����˃G�'
N��p��G +h��?���
+��N��jP
=@;������S 8�R4{4Um���Z1e��^�ACպ!z�@l��gƦ�����n�uK20�䖨=;�Ah�yx�0펧R=h����锷�����o�H��k0�����m=���c�ex35�q�L�����}-
3+"ع�q�e���� �r�yE����{<?"Ь
+��(#��"uXy>�%� p���J��(
\%/�CcRL�\G s5:�Y�XX 6�`
+�*�?��S�!�2����m��T7W c U*ߙ�6�j����5S�d�}�o
�C\i�
�{
,+;֥��4����bZ��݃��Zv$�m��&�
e��D)^��e��0�^�hL��
>t�{�;�BÀa�f�"yx��Y��(w*�r���x,%������� ��yH�`��Q��2
.c{ݓ_n��
Þ>
A��T�k&�����
f �8" ��ks���0*e�S"&����᠊4A�:'�
g������5#ǹw7�LW�S�Y��Xӣα��+dg;��+�xf-�'��4��W��
DZ�
n5f29?HMZ�I%�[����:2���X�;ܯ
X�ձ:��,�0ѣ���6Ug�3 ���[���sz�@q�=ZsKɍ��P�u��Cf��6��_k��k�P�mȎ�.���A��
��T���E�?�ѧ��WI0�)��ti�;}'w��LU����#\ �%?
��
��Q�A�ǾJЬ9
��JnKX�B+m.���z�!��@�������h��:Lc�:|�
+���=������B��6��rI#�B�GI�/xp�X5��
oa��$ڝp��v;��09���ӫ`Q���V
����2�ꆜ_ �[����6�ɖ��|��k��UO}2Zq���s���\-X�-3���3I2��+�^U�����~������߿�����{�4��?�
��?�~���o_����_����?o����j����j���k�BU����B�ߝ7Y{҃�
+�&>dbn�ۥ�2q_�s�
?�yyz"��=�sTL ��:���>R�
�V��ٌu�w�/�*Fekq��2-M�@�=� ��M])�7����_�
|c�=.:{ގ���L��IdN�by��|zC-
�j�;�]�pUK�\��i�؝<��\k���)�)k-Hn</�e�G����Q�"��%�戲�`MA���,��
���G����aR��՜>?E�O�y�
���z���<�Wݘ�����zle��i�B
���q
�·@�|2)w(!ߢP�����
�=�d�F5�� �Ad;�$p��X�z�
Ƥ�@���v�Zr�]0=`t��j�#��a-����Cw������-\�y_��Jzx�Ogd�T;_����C���~6��~���V�R�t��>Fh���j,�~�5BD-�ݏr��Z�;H=�KA��[�#/�N��Vc���=�<t��[(oo����ĉf@����rM���>�_���o��k'�ڳs�M�G{l
�\.����Y��?`�֎
�˘
�|%��ڻ!<9G�������v�*�yi�A
��v�
M�v��V6�
>}��I��q�|��&46<$��
+�!�����ťϓlw��(��f�n�.$�
{z����{�=��G�!���|�O?O����=�o�F�}��mT��`Snn
��Q�c�����U��O=}�_
C+،�\n̙#��]a�c�Ȁ�A�ԁ�:��t�_ql�,Kkn
L�PeK�&��U
,�����V
�{��^Zy��tW��X5Z�:��<�P.P�5 [4��EŔ�d��F�!k?k)�L��H�F b��qK��S֘
�r�c+r�����g��5�0H�y�nG"���jl~�)g�m�Z!�Ğ���u�%*�,� /K��#*]V�2�F�} �Б�Y��
�C �j5Y�9��su���<����(����0�1w�0f�
y���ϟ|i�U>dFwH��z�$[�&
�落�H��-�2
��LQ������,�N)%�R}�x���m�~���u����P���X[��-�w#�d�>q�3Q�R{����k���Mr�F���)����?CY���<��@�9�w�qΰR�SH��
Ƶ�0N�,{/k!
�g~�;�
�����Ij9G��ef�[���b� �
$[0D�i�A�m+�H�.��:��cT[�]l��PK�Uj�X
p�bb=t.�5=�Nk��
+ϖsX�)�-£�R������g����S���9�=Wz7 ��d�\[8�&/����e�bW�
2C��8�i[�h�2��
+�D�r&0
�LcK��� ~
ţQP���ٓSo��$�P)4��e���J"�Xfݽ@0��9����p�
+�9g����� ��mR��H�X��Oj��q0t�
+Y�j8�������8k �n,
Ü����U緎��
+.�
4
p��i�-/%1���%�&lT���=��9� �CW���aF�
+s`28�jrP#YO`���*-�x,r��q�X�����'�BQF�¾TS�I�Á�� �Z�/
+�th{���00�x_�lzY9�ċ7N=͢�b�"*�V�G*�3;%�W�&x<#@��t�� �T�1������?����<
@b��Tgߥ̲��}'z
���X���[�J-���[Z� �1��ѹ����ٹ��ak�s7�� ms
*�
�?e'ma[�{Rp}$>Z��oJ���������on���5�v�p*��#�3��H��
+J��qHeF ��
�ᾱ�4��?}��K�o<�45v��� �6�kEs,��s%�n�|�*�g�o��M�n���8G���Ѵ�j9OB���uβ7��Zz��?}���� �
?��*�DS��R�|�O�S�*��^�qa���~�E+�F�xh
�pCyd0�ZiUj��t#�r� J�kUp�
*���U��CŜ��ð>�0V�pmԽ5��̂z
}
J�6#e�4s�V²Pyx
1�6D
�~sr�D\��
[=�i�;
��N1vp:.�
W#�ʭ �9�p��"ș�J��
��9��_--�
7to��p7{s������E�
� !��g�n/
&�>�JR���/>�
�4���T*��Muq���
��ob�4C��b�I+E at 4��$<kBc�\��L�Hy�
l�c�� �9��Pt
��2��Q�mj(��z*�,������(�N�[�$E�
+ �[�
+E�(P
r�MF�6��ZX ���Ж+��Y5�D4
�0��%e�W��n���q�Sl�":�T�|��X*� �[\Y�T��\Y�NH�d}�Xv]�֭W�b�����SQ&?��Y�����y�l���D�p��AF�>k���*`�21��1�g>���?����А���{�=�͐���ք�=+U�ˤ fdVU��%ފ�"��iD2� ��=;}�ʜy��Z�+�Z
&
ދ4�"
+����i��m��k�K�H ��Yp���F��:���w�g����ƶ
/K&����E,���9->NbG
�j�`����@�seVFM��\dш�R����
j
K�и2V̧"2�yTm]�Ӧ�������`g
1H�� ��XYAr�� gNm��q0'Nòb!�lL��9|�RglA���
f� �n�
�&}�Q4�-3
+�d�+�-��������_�p=
�#�Κ
+�
+�<���,�h�.�[��Ӛ}�a_�������2�Po)d �W>�+u5L{Ka�6ژ�> h��~�&��"�q)ë@�:��F�a�ulQ,�U��*�����
�=l��Үk���}��,
+}�\��?�;0��zNz����"UU2���H�ٳKf.����"���e7�JV3h�o��nL�H
+*w��ʹs��,�φ��ۓ�q"��,hl�&FH�=,s�
5��ρ#��W�aɻIc�����s
+��V ��Ut
���1�U�����`�v���4���5\ܜ);+s�
�y��+%�P�;�����"�&��D
���/R-B��^:>V�飼�f@����
ƙ�u �F��5R�[�
M���
N�8j|FS1�h��i*a�?�I�O�M+��w"�עo2(`2JѦ�x
�`�I1�]��[o�|EWi��x��
+N��eA�&M�
���5W��/[g��u���)�C�*�
tO�M9�2mR9�P]�E�Qfn�(Bk��0�v�'���齫�J��7r�v���~׃Kq���$�]�٣F�Ⱐ�ƞ���Q
{���w��|�p��꩸�8aV�l���e�͖�m�=�I��M{���n7�ufpv֕��nN�I��g�禪��C%X7�聆�
�����z�7�%�i��O�����$-�> iNoo�a���ua�v�=��;�Вd
/
%�d���⺝P�q�=&�jKaЖ����U�l�ï������-H���y�~�ۨ���5� c�-G���N�{�WR
e��|r!��
u�sH�]�d�,y�R��-�(�
O@\״�U�u} ��
Y�SpjkB�������˕,��^�<�6����f��(;�*Y/����bj��{Hv���>Fu�L�$�����D�<j��������
"c��.Xӳ ���VHm2Ʋ�,1
����v�b�o�x��]���M_*M�?NeG�[5�Z���o�R�)ea����ԃ�xWi�X��\H
+��v���*�O����a��U��`����6� r{#��
�Pr�nB�~SܥűMf}<Qp���/ݣ~?(#7
+E��w\"!S�������V�H-tS8\w�
�V��gpYB59�)��a-�Zq�͉�^�i�^�DZ�����4�w�jY�
�&�Z�~ɀ�xwP|��h���c _����ݱG�ukCm�v��.;YU�.�.����5$�$�X
���&
�v-�ϛ��h����q}c�
�k�N���Y
���6��#z��+nΖ�*���{�ё�(W��#�����3A��K3A�X�9����-`oe8�o;�g�|ТC���a�篁�$�3z��0��� ��ܻ�b���j5
5��OrQv�S���P���Ɂc�pQI{�|,S�+(5�d���SO�-'Qf�FH���%�ŧ)��.FF���������-�A�o����1lL}ܚ�ֶ���k��q�|���@��x���f���+p�r����h�R�Q&��+NeocƋQ~�|�~�~9�W�t.T�w?�U�����_�]}4���[�w�B�!.�Щ����2�;4�˲ A
jV����G8+ [...]
�Ah%�|I'�<D�im5 �B��F��͚�v
���?wX]d8F϶(�\����N���m4 T+�Ek�]�<�
M�٦oR�%1x<Z�ϗJeඹ�^�R_�\M)��(��'
��
+��7Uf�>Iܶ한��`Z����{A0�5��"OY\�z�br�
ue"2F
�swMA>'gX��(��(���CIv|�P�
�5��&>��Ftj�Xu���h��:��
`�˳
2x�
}�T._sy���k
#�� ���ǧ�Ұ�������}��ݏ����?}��O?��kE�������߿�|��x)�T����~����秕��������~���.���|���?#q����FE������/�i�|����'���5|�yi!�����'4�
�P�^(��R(�uw�{�u�vYm=���X"��J��D1� �}b��5�*���]�5�J�ϓY�S�^
������K��~1
lHr����y���`��U3V����)A�ZM��d<� ��2�H��.�ܐ�8�Kl}NN��C�npv�06�����rS�����R��+Ch��d
cPm�
3�r#3`�
%��!�XT'P?�X�$�ꄧs3h���?� 77������
�R��]��!�mn�)O �c��
endstream
endobj
19 0 obj
19606
endobj
20 0 obj
<< /Filter [ /FlateDecode ] /Length 21 0 R >>
stream
+H��W]���
�7�xo
kH��C3%W�-))I
J1��q��kخ1��}4��=^;7��8'��j�G��?�=��G����ḣ��f��D��!��
��ˮ`H�K�[hM�@�:��p�='R
��=~��������뷷�w���
=~y�M��d{��������ٳ���w7���_�����^�S
<px��}dnL��-
́e2HoW�u]�!0���k�E�?"�+
�J�W��lpNB��\zS0
2-�(����I��<�BT#�S�
Z�-�N�� �dx��y<���>
��,����
� ΩZ�J��iq�
wJw�yj�!̒���lP��}A��]�
�V!�V�Y }��0ҡ�f#�ȡ��1̽d��e
�(���e3�5r��dr��
��dװ[��?���BT�8�F5h��=H�xk%�:y��A��
��*��8��ȩY���C*cx�e�g=T�ӛq�Z{��,
uoG�b� ��?�;�vh���d�x�"�窘rwٚF6��#32n ������0������!��R��BT��=��b��aa�쒩.ʡ�
�jq�^cz U�N��guV����1n/��ֳCս��
���M����\Cx4�����6v>�@�^%L(-̲�X���F4ʮ �
x����![K�N��k���Y���9
|�k�vw��ܨ9٬���9�2�N^/�Q�x��u�+����
+2w{��%jGl�cl;
�,�mfl�L�ѩƄ^�=H�<�:7�M����($u�����G�,�[��
,��]%
+���!K�Gtt�AYc�
_3���Zļ�
��\e��WkY/ro���fw��0�0�U�a�2 U�<`g����:��@�Ÿ�)\h���6���E�� �В��v�Ϳo���"�*[���מ�#�3�.��-�~P�_���=
X��3��j��rN�w
U�zu+{4�;r5L{3vsp_V�ah�t
GG��*H��UvCA��+<(U��
ؘ\�, �
&po݅ї!ܚ8(�r��= ���#��`��w�Q�]����"B\�.-��n���VuD��
|�T�
�� '}sfޗ��(_��;uH
�6�e�.q4
��FA��
����Rs���9p���X��`�B�>�Md�_�v,�T7,7X�Q�HjF�L���G�|3f�8��ЮV�
ʞT�
N�{ұ�G!�YSM��#Q�vF�e�~)��&��Z����`����L�'����yPe���%y�x?W�|��1��%(vK{ �%+l�$+َ�
v�U���
��!�m8�b
D`��qеa�C�&yè�9�v2ךMd��F
3��A�.w�d��r�(�d[%��L��
�ŬTP�Esc�8���bul�
d��l�
ZKq#x\����ubB�
p������8��+f���iH|��L�bg[6��e��1�1A�*���]l��O&2��3�j�0�c�Uk��if�v4��}K����=hy�ɳ50ӈ�#Й:
h誤9�+�E bm os�yѿ����b�O�Kߗ�m�T
g�=�ھ�9����S��ǀ(�H잘`]�
{��O�k�%?���ԫ�G����CU� ,A f�tsNa°C �9T{Ku�D�˗^-l��|�m"�&!;Z��`?_�1����\)��]'h�w��
�)�ߠy�����ZP+G�i�8�5���.�չ�[~l}kGCX���$��a�
��d
+I3��
�̸=�1l�����~a���hq_�ݦ��) Sk�p B�=�Ζڢ�;�+�g��>bgd�@����"�~��Ր-�i]y
+�5!��<(�P��G��N�a����h���OeO����'�=����s��s�/uh��7������ �
���Çu�Č��jR��Z](�Tn[n����Zg5��q#�$��W+]��8x�`����p~p�vH;�������Pj�v�+/J�뮀Z�c
5�>pα�z����������%6ވT����a��!\S��
+�i2�ΗB��%�l%\�+`<�1��
���,���ݵ�S��z��{�~���Ӌ�������^�}ؾ;{���y:��ޟlO����}��?{vqu������K�}�}����k�;�-��&p0��q��-+uݲ
nТaCcMT�@��`C�"�k�6�g#�_��7�I�
V�6}��^\}�0�r&�����?
�||���Ϸ��ݽ���~y���_(�����ۏ��_no/o^��&�9���Q�.���
�;{w�����ϋ������F�߶�+m� ��������̱�
m>�?�I+�����x�'�rJ���C��\0aͥZ�\E��)�
����L�?>�Z��J�%�텺��
+O�?����c����E!�S�)�͙��i�(��BH��:��:����nl���J�8OOQ5eV����V�q��U�
V��b
+��L<��,�U���,��i�\��h;����e���qD�����sS�/����^ZInS
+N�J)�$�[6���o�s�e)��J��}��;;s�w� 5���� ��ڢ!*|�*��s�� ���烤W�a@�2�s�~�4-
����t�NK�7-oh�k�=�E ���F�_���u�ݶ��z�M��H�(��C�
+`�)��t���R��R�͜b$i�7z���B"Q寐�d7Ŏ}����4l"��i���1��N�c��I)�Zo8�v�`M�Qz�NQ]
fb9�u� ��q�f��[�����NP����tĜ)7�Gv��~��T�����N��fe�?����؋*%�5֞t�?�K�1�Aق�
4�36O�Y�Nl�A����a�9Pr��ϑsB���h/�e�,T\W�v-�
+:�
h��:~
+��8f m�
*�Kr-
��
+W5v�3��zV�bħ��@�N3b\ܛ�
�Zg�Ȏs�x������
'�
+B�ָzy)Tz�QU9 v���N��Yn T��e�#m� ��[eG�
����Pn�n��a�5�/_��7�ϩ'�/L�t|����q��������>��
�}����������H�*UK���-
`��#@\�i�ԨBGC���PY��N5
�!��k��i� �Y�9*7s.y�t���x��6��Y�6��m��1��
+�h���ΐ�����q�Y�S�N�Cc��T�]AJ�Λ�A�&�6*��L�6oj�� S���[Cm
T��+��ê
�w��$R��L��;��9ZQ�M_��@>�jB]fC�Ќn[��}5�W%6��R���Bu�ai�ކ�!^��ǩ�+�e�����Q�*������4 ;�����nG���P�m�d�-łv��o�/�P��LI�H:
p�>tl4J��r�� &##���9,3�4}a�Ѽ������v\ġ���v��(��g���
����M"BM��W]���e
���Dc�-P�6�6
D��Q��<�Gx,�(�΄g��kc6�}i����� Ӊ)j3��`��A{�[�iYQ�Gy��Q�YE�!<�dž>
4 ��*
�&��1�{X�Z!��]Xr� ��A����"��KF|�j
`���>�/�+�6�V�
:ሠ
+���`5m�
{:��V�� �xD
j�9�Zv��ioC�Tm1��D�LS�����e��@�O(/�t1�K�;�>����̄|p
�N�M�:�aY+��
��������{�sb�ԕ�1Й��1��H����j��.�8��Ğ�jCK��Z�1�c��
��<�_�^۠��݉��"�s�[1�������7����0�T
B��*� (�F�I,g�M��Ӈ��A��r�j,���U�0]'���
��f'���<���zKwS���������^\������o_�����g�Q��
����?�=�_���{��������C��N�
/����[Nb�=��_�F엣
:���t�`���6�!]E�
u�u��^5���q��./t�����R��>w/�����3����g~���O�Ou;���o����6�)q�E�ji�ll�J�ب��r0�
+���Z������p˂1f��t.uD��cT���㰅ߩ�< x(Ӵ
l�z@
+R��S�P��]Bkװ>䔶��t9A�gv�ޫ����S��V��EgZN��71�C��A�����m�6��j"6X0���%
+�D��{�
+�k���Ǩ���
��n<ϔ#�js�;�G4��jܻR��%�S�A��݆ԥ�v`L�M��Ω���$f^��f��,��LݳP���p�o��y$/��"��Ԋ�TL=�q\��
�m�[f�08c�u��͞����S��O0���̬�lΤI
������M�Y�;�)U�1��Y���m:wA)��^6<`�XJ�x��ٔW�
Yu���jd�
+E����q4�
+�
�^�.(^"<�
�?����� ��!X��i��9>��Ҭk0��>���M���(GI�D'R�G�JՊ�g\�f+��2�%�W�vb)W\��X
��.+�j�����4taq�w_𨗿ev
+��������ݏ�������o����?���]=Bq=�����ba\��G�/��C�Ҝ� ��
+o��t*���g,�D�P� �uz���V��W�Sw�<:{g��P쁆�C>aB2.�qt�P�.H��
i��ȩ�v@"_�o�
}�ekCsz'�9�56��A�SM��/������q�?zy�`��_���zs{wDx���X��/������_�Kێ����L+�Ȁ�j�� �Q��6��\��n�
Bog�)0L
�*�*����w$�R:�^��]i�$�l�^Y� �R-��" ����2<�/^����H@��D �Sr��BBQV\�*Q���
3kn e<��\���C"��{����80��8���<����-�)[�Q�z)&Lx
�
j�
t
����y�M��9-��s�w(����A!|8�T"؆L�}�`�(���+�O�u�]9�(��2���)�'��b�
(ui-G���N�:^<��U\T��
��w�'��<Nt�+��lQGI�����a��t��f
�BP2�ľP#���a��d`�
e���
�ک6N?�mή�HJv�lFg�ik0��} YJ�l�H�6���u��5Fs�R��k���\������f�s����t@Б� X��D��p��b���[Q"����߳
��C�
���ѩ�
�=
���hul8&&�%� ?c������h��M?lv����:N�RX�V4b���`��x)�z�`�
љ�F��&��H6ʬ�ꋻ�!=H�b ��c�~�C��A=�h��5m�-U�Y��{�Ÿ����T4P% ��c���
)�}��Ә�G�$zS�|6�@l69&Ϥ\ήM֠�j��/���c��Z�<��{`��y �Y��gzf
e�@BB��� �`V���Z�mI�ߧ�6�^$ǂ�h��ΙKwuu�ڱj
!A{�2
�Zh��W�G����Դ��]'ke�v�_P9��wms�{�kՔ�����kK:4��t�ỏMDžj�a� � �}{6ܐK�rs��l;��C��j:t�A[cs�)�M�f�,g
+ ��a�R�Na
B#��r[W
=-6�~C^�j��,!dd��Z�1��#��ris�
��kgal:���l�eKC��:}���tg��و mH� �>WԌT���D�z�N�Ż�̐U
�/.�V
�Q���A��
��}~}����2���̱��g
+�:�_$��Ǧ��Yȩ6�H[v;B���u
+�%#VWu��9�
�ͥPDK�|�IU����1r�L6W��c).��}��!ɶ�P���u��O����&��c
���|�=J�����a���vK��
ܗ���ZAǾ:�iE�S-*AX!m�&��u=*Kި2|`��
�`S#Ր^9
UI�̞
���#ě��:�P�ڬ��Z �
��p�UO�N�1\Z�J
^��4v@���̅X
���R�Q>����i����P�H��K��1W���DcA�Kɪ)� Q�k$.C�� _*i`Uj-���
���#6a��m�[
9� �ŦClq�G�Ğeq�� z�:���+{V�`=㲘����ͪY�:�1
���Y\���2�T�|�M�2�x��֪�T����7��A��A�7�N���z���o�V�up<�M���Ez01���
+b.��
Zi�u����W�m�W�-̆=�Y붼|�"Q���Ʉ��N?�SP��\��&E��Ѯ#�K-�k�fU��GR���->�z�7�ʺ��b-��
�×�@��=�wnn�"(\=x��ձ�j����t�:M�m�m��wSt���,͚j�,���{�9nI�pVm\��1�g�iT��gS�U�R@���Ns��|,�Uw}
�]�&�n�w��7[�M�Y�|�c�1�y��M^C��d|j��Ӄ;���}�����؉
���8!{�
07��<�
P)��!<��}?�n�e7����vd�8䗨��Ř��o5IW"s�Apu7&Ȑ����aҼ�;x�.
���I-n,.uq,�[T� X�r��~;Tcj7ە�1^�E�
T���ラ�s���f���4�q#��������
�K�F��㻔HYAJ��k薘�Z�ټ-�/���`o��+U��;+'�m�3���!�ux9w~��*Λ��"�U9�U��u�ۙj:X��
6!�i�{����E9����l- at O��i|PJ=T
9Ҁ��S�I)�4�R!SŦ����ԳTJ[#[�0����Xud_̓����E��G$+�ɮ S7F]
�kXo�ދ]�I�P���f:�{�
�����E�ƺ�k5F*D�ߡt<Ӕє8���W�����]���<�_�����,� ��.yte�k��aΫݸJ�UТW�
<�s���S��ȿ_�+�> �)w�k�8��j��N�G����>N�X�� ��4B� 8����8�Xq��g�8�p�^�JN_|yz?'���,B]�/(cKV�R<L|�B��H ]���6JZ(�Q M�`Ҷ JL�
+�`
x
��qQ���)5d�۸�غA.{u���t�X�^KTn�E�
��D�[�f��|,��e�����ЏXg/����5���� �
�
�Zm�b�Կ���NU�J�_�[�s�DSO�<(0�'O
�5�
á$�75[��h5�~��A:?C�Z�
j�{���ʷ���
+�ĵ� �bWx�-��хH j���oi�#�.���<�Ie��m���*�/9� :�6l��v$S7CG��
���e S��N$�հX
o_ս�h%gǽ�Yd~��������0��`�aI�
��"��Ƌ=V�ET��
m�K�S!�[Nv�H�=]3�
U��W��H@�sq��Um6Cʯ�If� v��{�C���� ��p at M`^B��2sg}
+�uE;��igU��^�ޓ�>������u|���������W?������p��j�g����n���77߽x��d�S�OD_j���O^;q�)����o�^���O������b͓o6�H��y��?ލ��+(>������{7//��.WkJ��iG�m��`�_|��t���z܄G�}N�n�SA�\
�����;W���#�b���;����r��5'�A[
�d��z�U�
�P�e�2�|Kȃ�zNG���|�@��j�l�ƈr`
��
F���aܟ1ȼ��;���cm�a�L�P����*7�C�
p�|��V�D��5�PEK|%���j�q5�'���I aN���L�hе
��\�߯k�����
� O�3&�φ-f`gZ�/�0&½ �$7��>{�
�8�S3R\zͱ5�kR�]UZ>����ur>K�������
S~\������ϒFA�\�ijzw�� B�w�-��[i&3�8Gu�)>dn鉃��A�94b��J��4 at W��?��
�@>k�l�&8t��L���-Rۚ
7���|�C\��
j}D��b
+�U�DűiT��~t�Ӛ�3�,�
T���^0�qb!Q��#�F��Mƞ�(�
>o��tf�����v|�Y(�ˮБ�f��
x;��d
+���>��"��'EP�'
�n�
ƒ�^�;��}�
+�|u�^�p˘]�O)���r�A�a^�
QE��#;c�(k��U,c���k֧2I����h�̅�ƫ2��#� �u�@2dNc�#� ��NE�d�xBйa,[=���a,^rp���Vq�
Z�Yhy�M�):j���'���
usv�S�
:=�����\�n#xݡOP�<,�
�'0
x!��|}G�9���vI���+�/��!2R�kzO�,"��<�
+��88�� |�R:���5��2���<�k��&Q���Q*�(�����xh���$s<�K��:���h7B��f"��Ⰿ�I���2H�.�+�O�oO�s0�f^��1���
��z�N9�r�p�����e� 퍐xH'@|}�O��џ[c VB�7�g��t��c�v5K� n�`>0�w���C�p7k��Ý�f�=툃Li��F�S="$��ј�[�8���
�f�[t�^�=�g
�q���fU����j�?�x�D��E��
� f�Du��_� ���3�
k�_#�B����a����ժbW
VWդ���32R�wϬ��gV��T�í��Y�h�U�5���ܙ5����a3�v�aE��ʫz�W���h�
�84?
��t?e'����a�T�<+E]�y9J�"0�g!���R�忙��C �ٵ�B�{�`����
�qm/O�?�����5,0__��uO�!�G�g������1PXi��M�S
�jw��|���VG��7�ay�و]��U�X�������K� N�S���s3�[���
cM))���#f��Ҵ�:~z�v��Mem?XJ���U� �ʎ5�Z|�f^����(G��
�x�k����K8���>�Q�����j֭�.e
+Cׂܱ����=\߁��7��o��d� YR�x-����
H>~������
���7�#�Pܖ�U�K���1�2�K*+�'��/Q
+���R��kc^ϼyci���r��-w���4�������^GC����qM8��zZ�\q3Oͧ����Y�e��S�bS��I�r�
�b�h�~6�7h�_��.�څWD>}Մ��G�ҍo�v{���8�6M��Ї�S����N�j,
�V�J�`̍���-2�G�^�B<Ot��2�\<�/����2L�R���N���;���۷@nRz'�UrngBy�9Q� ��|}���oS��,��T��n�+W]�vJ�G�Y��-����[�Υ���C���!/1���xW(X
�,j(����IIV������]�GP��a�O��
�GK��O�
,�O��)P�=�GR~)v����:{\�#��"�Ӈm��bfbk&
���ס|��5>��Ѧ�݈X/]�7HJi�����dA��2�6S��b�i.��m�4# ��P�V#>�]�OJE3��� �
�
>l˥1>�
�>��0�I�6�=���A�,�eaxjN=�%i�'��!�,�%���U�^�ue�'sJ�����%S�s�eL�����kG�<\�S3q¦Xݧ'��t!%���L��m�c��.hUlsFr̝u�:}_�O��|�����Ʈn�E=�Z��wf
� �y��aOm�9���N�EL���.��
u�����k�j%�
D%
]�lO,���C� `��#�\�}�!
�b|.���ʄފ~�V���9,�\���̜�һ�ǥ\�i)�2��z�.��yY
'`͢�
���o$��LL�^%e�_'N�
��Zy$�gm��p,�Z�Q��4<��T�VVS�J�=�u
�y��+����eT�m�7�!5n֓�q�[�pD�BV�
r%��Q��'[�$?
�5��6a,�9J�SSǕZ˸cf{i�"
��R��3]�`�$vq�X����IECX�O\��
-�o71�8)��a�S���a�~)�Oio5�W�?� �PU�
��J��9l��lJ��M�ܥ��e58G�Lj�`L;e���J(S��z��?��j�ڭo�����*?5�rxE��^q^���~��N��bX��(�nj\=6���o�-��7bT%��l�Y\�]
+_R���0�Q»��ퟓ��c���0\����� 4QP.�@-.����Iy�5����ލ��X
{�P�0g�/�M9D8��P�K�3n(9�M�M��gpz��aG�S⇿�^I�j��$v��� +�z���(�m-ʛ�a��@4���y��}���zQ��P�b,C�q�/>�N��<W������
/fwĘz��VH���
������f�⏟�m�Wn��������]l�S��"Č���T;��)Ӿ���*�)N
��3�T
N��-'�A�C`e��a�s�U
@[P#��O���o�
��h
\��K��-�sRV���}�?��xT�1:ZA�)m|�U��L��I�aMs
0�H+,v*�kVD0�^���$mMz=����)��Ƃ$>�Sc���+t'_5���3M��b�L=�gm 2iZu�g;i��Ү� ��2��#>Q�>X��D��Dm���F�<�%���T�)���b�U�T#&�D
s6��L����P=���}����\y���d(��z��js��w˅�
_���ӹ������H�S�w�R���F�<@{�Õm
2X�:ݨ���kT�}�5?��rH� �!L�Y��]���X�q�K�;
+iU
�4�4�a4��4��U�7V�-p�-WS7 O�{8�ķ
R�1�]�)|���wX5�T�3B;Q�F��ݳC�"w ��5*2R
���6'�u�X�I(�g�n۸CКhBM�����rr���Ғ�b��q�k9��#�R�7_�M��>�c�&�W=��-��(G�m�!w2����h��f�>� '7�
�����@�!p����>���\�AS3��<C�Q]"j舘�d�[q}
+�����ʲ�eLW�O]Ʀ��︢�#�
w1#�?����wU���{�����{���t��U�]~5�hY勻�Gb�&g�Puh�o���(���C0�e`�KD
ڄ<n��I�\ַSK��Y�;i�)�� �Q��u�'b��s֮�.���y[C�u���=5�qO�XJe[��A"�'%���N�{�J�������#7�z���_�Kq�u�a����? _Ҷ)�_�5
_�t���i<�ɫ��f�)7`Fƥ���~���m,�� �z ��5��l�l� $q ��}3hie��H���_�ٝ�%)������Kb
��9;3gjr�h_�n� �� ���2дg�Ȣ�q�TX`�9�<��Q{Kch�����<
F���/D�j=
���"�i��b�X��u�v����ڭ���u�Mhb���A�Z���CR.����l���䜂��K��`�J�݅�w�[����&)~�J����y�����M����i�|��K!���6'$���a�4����oW�'d� ͅ
�;�eH��^�T��m���!T7(� �t�����{��]�����<�ٖ�E��Ѐd��o�K
���W����-
��Z�'e�M�"W�u8R�#�eQh���T,��B�^!x��.�=須�*UB�Cf�y���;,�:�f`�p��T)��
���J';�e��P�&�T)Q���-���
v
���,0!G�Z�Z�]�z:K�-t=`��A�� PD�;�����-D���mh �O�&
+�^t�� / Pb
+|�n�X�j+� =�t/ C
׀�Ŭ����
��T��Ѝi-'�(�PĀ6U��Ɓ:�T��'�ޝ�G���"z��&�c �a�Hbm_F ��xQ=�nx>}�F-�bQ
+>��P��k�`���
+�ɻ��O9C�@H��x�Ff�t_�L��m������0�ۊ�S
�g�(���/>�e]bf\_f!puc����h
j}
z̉T�Qi�w��-!��١ה��úF`*����Z!�%=��.B��O�)P
�E�C�nk���P�G5la`7�����A�&�R6��R�ŨxT��Mf�S#�%�D��r ����=��5w�PV�=�z�@�y,B�}��-��9�bv#�
VA�
��i�*�n�cn�?4]�<U�M��v���1�W�0�FX�4*^;^��pL��
��PV�Z"K(�"���)�pK� G
RROR�B!�.S�\�@ZB�AuPR%,m]��!^�}4r��!-*�%WQ�fE4���J��v�F�a���=��� }$A9��"Q�ѫZN�ހ
ɫ�/*|-��n�����x6�~�`�Hӱ�ՈQ�Z�r at W
��6�H�h4S1�]�$t]$hK�|������7P�B�Z�ȼLWs!�q [...]
+����B�Uh�8ƹO"j\�p��5������xb
0��N�TL�m�i�ݸB�
���;�E ԍ�t�c���'m�2з�
�x���`C�IH�}2%z#�'y,�/�8#�[�
��$qHb���� �d���Tkw=*�[��t��Q���i�N�D�3k��dԴ�����Zm4�7�6��ի8�ٕ
��V^�F���R��緳�o��_��UQ��qU�";{VOXo��ه"ɪ$�??'��O����g�7������ׯ�\�=��O~�_���}����Ki�ir1�������:����'������g�v?��5>g��7Y�}Z=n���eQď�/�uqW�<�����͉�*I���u2��<��~����ὨƐ4���5��1(�"��+^ʃ�q�T�N�� �F��
�..����U��?����Ꙅj+�mpY���W�'��2�$X1�UR�W�tPY>��M�։��/�ƾ��|��ˤ2��l41��.��uoV�ܤ�$Y��l�9̥;�6�|Ë��G��p��� {�]��=h��I�������>��ɢ"���BQo�Y��~5.�LC���1�b����t��o�I�D�!*W�߲���|^]�u��SW�P�
\�5^\����i���W�e�rM��IyZ�L_���˹&�:�r�]�˝v��.w��0L�~N���.g��8�rOc�{
�e���UZ���Ue#[��Z٥k�\��sb�"WV�k�)������t#���f�,�h
�nӊ��%�����5�q�kT�,v��Ÿ�5
��]>��y���[!� �q��<ɪ����#��xI���,�j⠥��3
Ŏ���q�i��{��<M�1(%P�M=tΨ1XV�)�����4/~��J����$$%�
��X�s>��{`�ԉ���F��<��xA2�X���i��U�@�5�� [...]
/�*
���<
+�&��*`��.��*����o�4�>���TzrD` �} �ER�ּ2��:d���;
+�('��a�`�b`;08OKh�x{���,
���
/��`��i��i��|�,yu��Clz̡|@1<����*���w���^:��8z���ܤ}�3�Ó���9YT�����������j|0
�
+��,F�\����x:[ŋ��Q
+A�?BB�|9y ng��~��/��[����b����~���8��x���x��oH`
g泌�{�(�Y^s~�nV�I�h�vs��:
'$�p�����^�U>ڊ/IWC��(����X������'3��̪�����$
'�289���rY��*<"q���fe�Zݨ�b���i
��P_t@,Fg��s�$"�n�uqW�<�1�
�nF��,�y���4jz4n����j�o -�� i��%U�jh��ַ�R�[�oc���
4�'>.�=�`����TVI5_}L�=@e�L�6 ['�C&�Qx���N�M���gջxc�:��� ��E\
endstream
endobj
21 0 obj
14146
endobj
22 0 obj
<< /Filter [ /FlateDecode ] /Length 23 0 R >>
stream
+H���n�H���w�� `��d+��,k"�� �{g�Ȣؙf7�ٔ�<��ԑ�uذFb�jS��U�W��a�D������^��4���R��*�Ϭ���7�Z�U�߿�2؟�\.l
r}b�-Õd:{���,4$�w��O�3y���Ϸ5�0��n��i9O��[�h�nK�����ᲇ��
�)$�
���
�B�
\&%�)���(�=%���,��X�O����|���P��p#���˂:���[b�m���)��� ��GQKP��M;��Y���Hi��tH�5�DH��tZۯV��n�GJ�[���m�� �LE���
\J�<�%Լj�V�
�f����QԒk�ـ��=&����#Xp&%�
E.���P�.%���,�Q(E�E�7�`��r-��,F4=Z���"�V�\
�^z�
,+�BQ�~�RIR�v(=�e�����̢ŵ�^0P�g�"UP;�Y��+��
R0���uʨQe�5g����j]�l>�@�6�
+c
ѹ(��������b��E����3��"�Xg�;-��z�W(ī7� b�G�ߡ��d� G��A��hf&
H
���
�Y�J�
��Q)3�
��Q1���W��ĒQ�����!�����K�ס��Dƍ���E*���iJl)���PRu��ǵ�|�,�@� � ��eط�@J�LY��dK$V|J���GѰ�zp�� � �2J�H�����|�c�>Q�˫ϵR� |�&��l$�r
�Pz¢sK�����}��ʖ
ZwFCR�;+4
R EM'������k�[�#%�-���6fap&�"D��y�V�� }J �x)�"O�=�g�3P
R�ZZ��e?=G'�
�{�Gǯ��nh%��Ip���5� v}���'UJ�>W�u����F�FW�Z�N
@�I1,�
��6.������Q��q��]|��K������wOJ���V�dN�
����D��+Xf�BiG�����j�K� 6{3�5��?�2~��]~,L~]�@���*��#��}5�y���-�
�j�5>ILU�-k�ܢĴ�*R<�͌Bӷms�
)��K�بt���{y"���n|��������5�v���J��� [...]
+t�
[�+��fZk\���W��\�T�^���Y�ɡ��S2$0���rG)E��묟�P?�����(�џ�R�h���k/#&��L��C�~��h�h�Ԃ������G)���mu�N�ۏ�ﴢ����� z�E�r˓�ܝ|L��u�*��Z�2YBo:�n�Q"9�a1aMT� |�%��Kϥ�e�^(*[[*ZP��sX��
/��C;��hq�g�4�i�B1��V�
+j�<�4�9LJ=Z�ќ��̌*�
�68\�Ң�)F;��{�F�T��P[p/|�Q
+Nq����`V
��� ��ũ��PC��4/t��x���|��ڕ �
;��mD>�e�i9��U��f��-JP��,��A3����X��_�
P-�
�A���v at p\;�
������2��)�����78J$��
CYIPe�0ܢ
�
+?֛c�k�C�&9=�Q
����?O&����t�O��������{�ȗ >
+�z�u�v�0
.
�ϒ� %S��`��
+�
��%%�H1�'���V�T�:������ z����m�WyK~]�u2�=Fz���F���S�2���C�>�R1��N�����-C�mw�1�@�ү-��%�C|��vH%��
֤°�\+c��g/=�~�z��`fm�$)�8��òmnx��
Z�/�E�k�=K�!0L��g�"UP;�Y��+L���a�9
�Up;.mpx4ܑʻ�G/�cgr(p|���T�ڂ{ỌRp�.�������,N�m�J�{
��g�@R�I+?�F�q� ��k"�f/k��5�
+�P���a5@>W�W�@�=P��9)��,lbS
�,%)����'5�5[[V��5[[��5[[���W�db#<3��>��8��C)4�sN��{�q����N6�j������
-e��"(�z_�D�U�%���룉UgI�P;��0�f+|��S�I+ύ���P2�t�X(���WT���"K �RU�
�`+B=S��
=�L}��]@��<�
!�V,�Wa��q�q�V"O�nN�d�Zv6艔�� 5l��5�
�3�~,�`��L�I!o�r����c��W�z�4G� Uآ�}R[��Y�R
�][��E�HI`�"����A�
+��lq�kK%I�ա�
�ms�K��� }�O��v�
�4>�1��V�
+j�<�4�y���C
+f�9
�Up�����%/-��b����6�Ɍ�Ll�g�
+���}D�%~ ��C��@wα�q/4.>)�!E�����I �G8�I���/�(J�Y�>��*p�>K�ډf�i4]�F�O )-=���_K?��$
8bp9�e�J&}
$e:y�Y�J���\�k�˪?z
yP�������,�[;Q?|9�eE��P[p/|�QBJ�gy���
+�P�����e�T'X'�X3���М������6߫3�;N�%�� �ܸ
Z�2��?w(�1.֛c��()�n���ᶀ�wZ
���
)6�
�ERu~Nc$:�7͑����
i1��
I��͑�)�qz��c�Gǯ��L*6�Ʌ
|R�����F�����G��Q��SY)�s�v�,
.
�ϒ� %S��`��
+�
��%%�H1�'���V�T�:������ z����m�Wy�J~]�m�Y�ɡ����sNU�-���(e�Kͬ<&�����#Xp?�"�i�G�;
' 4��ˆZ��Q/* G�dlrFPV=�
++[Ck���ʆ�
�f���khh�-���zxk�ܺ��P_=�.���S��;�����Ș
U�o6�
�kJD͆F.ɚ
-��lj-�fCk6�fCk6��74ܼ_u��Q����ݛ�2��m�?�˧7m
�_��I
����6�'��a��+2�i\96s��}����^O�Ȼ�9�������A��s�F��3��É'��E�����
D��Ҝdj5��D�V
�>���M ?y�gF�PY��QC�v�:�k� .{9b��[7�x7��
sJ�s7 ij��
+&i' �H^�9���aլP/m]�P^�ݸI%
j��dc�~Zw:ڞ�N�<��f�*@���LHo�}�"8�`�X+J���w��"tSs}
J�����\2҆� O-=pJmaE�����,n_z��e��VK�w� �o_7\;�>�f�!N�D��/Tj�<DZ2bF�e��E.T���ȁ����T���YhB
�KT�SO�(5� &
.�E+�HQ���h&&額N�x�M�⇻
/
�Ip�4��|�E�Ti5[C��?v�ւa�ov�MKU�?g;X4yW�?vj\;q���l�XS��j�b�\8W!�Z2M��IL�Xj�'(E���~�b8Ŵ.�h���va{W�gF�PY��QC�� ����-.n����ݸ�.���d��_O��[�2fÎj
"A�"c� �{�����b�:��}��;�S�ɦ����i=�|[�Ċ�"�xf�l��H��@6�}���
�H�h��#��qu�]c�:��s�;n�[h�«�(^
���` �Y�
endstream
endobj
23 0 obj
3636
endobj
24 0 obj
<< /Filter [ /FlateDecode ] /Length 25 0 R >>
stream
+H��W�n�H}��K�3��f7�<�26��ă�'��bPd�b�"5���_����P���6
r�Y�Su�Tu�i�G��������(ˋD
Fu]����[��M}?��O�}�3�7����~�����z�@�ɣ�~�Mݔ��C7Q��S�y�1������,��(�a�%�����tc0�����J����F��}'*�R�@-��-oFq
��:�Yk>�eLU����2�6 �=u�&l
����������*�E�.���"^�2��N
�|�hiN:q�Q6
Fv�!�x��(��(;A���I����n�mغ�濶)kd�n� ܭB�M��M�g00�
��z�P����
�64��W�0�r���%Hz��
"��6��ѯ��4�E�g���;D��&���h�N
m��$��t��S1p>��ޗ�3�܊jw��Z,m6�QSUi�g�cE�����x��6�eݖ��m��^�nsh�mP� TU'��&������-F�����`P�N:����l��/T9�$�"����52�t_N�j�d��$龝�n
�:ˊ��tO�Z�{\d�UҵC�[�e����D'��dס�E�_
m*�Q����kU
Tb4.���̈���>�=� '{�L!X�U�Eխܚak%�`�����W�()nO�k�d
};M������`<�ʭQ�Q^� l��njdB[�[3�E�H�x� �\�ː�����
vo�i�ݍ��6�>L�2��b�h-� ��
Ѭ�.4� �E/�6�5X�{��/�2�?)r5����&h+���͊f����Qef�9��ug�v�~�{p��?x��E�dQ�����u�&��ls/��3��*�e�U
ض����A�2�z7.r��"d�Ȭ� [...]
��~�
y����A�2m��_f��z��l�
�v�Ѯ���l�
�6��(�k.�{����r1T�>��Q6
F6��
�-H����q�ج
?�M�U�l�~��<����MGae�Q��H���ORܙ�2�W4e,l�m��N�Y����J��������"�&PK�/c˛�tˍ|�k��j��|TU�u<�L�
P�EO�� �B���'EV��"8w��R>�
��q;%o
?�0�8ʬ��&�*�
$�A�gݧ��&�d��4����b�x�����Ŷ����Tܤ��� �ڄh1�7��`P��z��>��m���e�X[%ݗ�C��ɚ
Eҹt�9�Jd�[�أqQ�u�
+kw�[������,���m���Os��Z�,�*Ƣ��s�l��`�����i[[��B[�Y%
Z��k�N��B�k.�����j
����8k���Y��`F
���3�
Xd�_d<U'$� � ͇�`�K�����:���A�U�v���
���k1{��n�|^�
s��VA��=��Ъ���Y��96�eG������m��.:i�v��҈@��4� �
+~Q1eT�זv�> �Y�փO��~,-X�j���K��}k��'lJ���Q�ٔ��'�6�����!F�m����
+��
��U�iR;�`�. &�e0C�^���64��W����ǯ�,�二��2�)�f�(��Ӻ��X��>.�<�S�E[�= �
��T
��^}���y��r~��W6_��~.��[
���X\���7�>�'~ԗ��Q�� Yǐ�2ʯ�
�BΑ�su{�9�?ȹ�&����U$-�خ����O��v�P���� '�G��8xuȃ0t}yN���(pF3Ba � t�sG)f���*w)��~
3���y�rߣƭO�Y��@����9��0w}�+;qI�0
rC��B�
�ϔ�
�h|�8
�� ���\ڱ˱�^�����<�^qqm�2�|�D=ϑ�#e�!b*����?n蹄�227��м��.
+8թ�0��K<cbD?����9D������ts8�|g��`�� ���C(�u1U�
� ��L�
`
��uee^��D�}bB`:R��ˈo�B9R1T
��
p9P!p��a�&
p%"���>
%�L:�����QH����%�>�
�O�`�؟</K*)� 6
�p`�=� �sN�
+C�"�62
�$0�茡�(.@&�O�(��ύ>
�����O��$����7Fn��ih�</�1�~�
Š�Ae>�P*�8 ��"D at S�� ڈ�~d��Ì"��4�Ȉ":�ແ� P����N�B@�Bt���������5�nZm�#��
��\
�D�?�~5Vb���yYZ�0���r���%�C(&J&e��Qj�~ŔiUb��i TqQ�J
�Q8 6��ax
)�H���@`D�$I�)��CӒgM}Ė��5h�&v._1!��SV� 6���|!|]\
�j���s�Yȶ��i0� =�6��a��
�v�:k�h���e &R=��'��x
����
�S��H���A�X�zb:�0�ui0Cd2]6e��T[�9J�]�n��{�
�H�����!�*#i�s���(h3
}��0Te�
�XG m;�*�.
�Q&��
��3L�t< �`"3��잖���$�"S2$S�_Ō��q0��Aݹ�
y��
�J��6$�h��
$u� t!�T
.��,_A<O�����ֺ�#�ݠ�p�$H����J>IviZ�J�b�X�2��>k^��{e�FX�F���̚5kE�l�^��9�6��
ـ�'�6�[�v(:b�9
I9x�|��Xȁ0�GQ�
�{�.H���`$
r��C
�R>���rѶ���r���I+ƃ!Q��G�M�
+�P���\��6���"�=�$nf�I[7l6��6pr�n�
�Cy�8���(>�r�6�;Q�`��,hS�U���4
(T��)��H���
���w��i� Ұj��z��2e"�YUԦ��c�h�%h���B&g���'�s/XL�9ĩt[[ Ob�����7����i4Ĕ��҃�����*y�)�\�&e����ks84�_0$�
��# �y�&�eA3�J�^��:�F7�5̾��+Q��|\H�([ۄ�\��� z"��SC�������А���@B���s_?��C@嬿
�}���VA����*$�D2�b Ocj�T�i�V�߁j�r�ܲ
0j��=��F�����<(L��8:m^ыM�P�_��5@�s���^�QN˕o���
U�&�AiEGKH�+cJ%�BvC,�;�>)D7D��
���uHM(��O(#��J�
�'l�Y�8J�n�y��+
��N'l�.M��м�fPp��)�Hʌ1�hw��P�
��넋����h
#T��B�E!
+��fPs� T���N�y>jpZ2�ˌ
m>��F�̪T��h�<d����L�Pї���
+�ZvS,}v$�
���
8�
;�T{#� ��L�j�T>��L� ���
+��L-��u�!����.�����"�u�֦��=�e�3O���Rl� ��I
��+f��gZ}r�͠���Y1IhO 7�
�|1 �8�/���?���=\��^�^~8zr|q�=���٫����w�����n������%/>]��?�y�}�x�IJ�e�3�,���-�2��"WYE� �dH,(�4�5�� ��k�1z���1˄�*ÂI7�d�5���[=ղ�jP)jo�� U�8Y�y�)R��<���Lj.6�1��?
٭@��1|�-L�&Bdo�=���N��PP�[�G5���[�z)h�, �h�Y�B77�݁U�h
n{^����T��,A��L� ���
������U?�dC`
��sX�����l)��Y��i
+U���u�����z
+�.IN#���9�4�I��&`�9�d�3�%2KJF^hy �mf,�ٍ.��FrOJ2^9�M|!c:8�
&�b֡�ʊ��
1"<
�0̉��.7��4ư��'d�߁$��0e�:k�ơ�&�l�3S���4�3����1�a,9o�jm�|ld�C&ƆQt���&'~"mql��
�4�� (��
��,6�c��,�
�5uqK��f���q�
ƍO`�kr
����I�
A�)_ at .�ϣ���.��u���Qa9�_ig�$UE��N��Y�E0��2��G�k1�:/4���
+x�Q&�P|�Փ�H)��r [��î��ϒ'�E`�_D�r�)w����Wh��ļ X�pAs���
��h���Ld7���F�%��&�ŸC�f"���
>�*;@�5�>�N���4
oCjh��C�����:$�!D���`�8v���
@�%��
�\�� ��&�
+�����o<�.h
[�LE�б�\�H���-��XT1��Y=[�c�4e��f�S�u)��N7
�
�3�c&��ܹ��.i}ȝת!�M��\�Z��>Hʭ1wR�N�aP�<`q�C�
ڠ��>��n��~j'�!��x�.⡧���ӣ�6=3��Q�
�������ǃ�CK
��v��Ľ �&
_�M^��|ķae�~~<8��.��
Wʹ����q����ɫ+#�1��������}dF���_6Sx��x�
�Y�5o��<�ɹ��6������Z���*h�s��������i�M�Mq��.���u��f���ͦ�3�� �nB0��j��3����|��ȱ:XU4xp2c�B��t��6(7�;X
�ᑷ��`
+ܿ��fv��:�f�ç�
M��ud5ּ��Oe�}�q��Y���q�ރ�襒�r�ָm�D�3>~��3-�9�\iM��8���Y��s����h�9�H;T
�Z����m
+F���[���8�-&�u
�M�#:D�[HLSD��(
�ă�!'PƎm%�lR9��7e6�l7�U3�$��A
&K��L����P�^���K��N�47��>�L���^����k�LN�h�R]�@�'
f�'X�#�F���4)�����a�<آ��`N�;��K�K&@�
)D
�Nu�R�����^\�
��n/�?/?
=9�8aOP�;N�g�
�o�-'��g�ݧ��w���t��W���~�~ ��Y9x�V$���,f�5� �n�j������[�
�&Z
�!�\
}�J�X��z,
�q"+
�]��]F�
��0n��u�� =���>�P3DP�� EA% 3�Oe0R�F��}f������Z���q�BT���j�
+�����))
�mW���i7�;whtPT��'�Tb�V�l��~<>�9���ܾ}�����l!��w
:9���͇�S�{�s=
_�?��a������؎���Eध�X���
ޟ5�W��_��c������ ��#��~���
e:Ԫ0��c��i
+����e�ug�
l@���P�¶������kl�3�0�oV�������~�Ͳ��u��;�_�����_~�:�pu����~a�8��W����㕯:��/����a���������q&U<�Zٴ_Z��Lh�
�s��/
u��}�&�&{�T�*z
zZ�Ix�?�/�
��#
+�#�8/H %�_��bʼn�X�(HQ�0�
�k<�ſϪ����ǎ�C�A�̚:����ݵ����(8�aO�D�c�X�A�.�l�Ⱗ��2�c���j�6�,}%>���}��z�W��^ߜ�g��敡�\:N�����~��>�|�G�C��
�=�z��?��qq�ۛ
X^.)���ּyż��
�*��2E�+(^�6ȍ�Xp^��E�N���8�j
�n�h�0w1mY��%���zg_k����l��^3k"עV�# �)a/�4v�d�
�
�2�[mgJ�H�q��)�
qu��3S��$c���@��+�;�8AG
IkD-A�N
J�̊9���,@�5�ZW�\�JwX��txƎ� '�T��`L8lj
��>�Jk����F{��s0B�!� <]�8���{w#k��Qk�@E�ԫ?ٴ*J{�T[Ls�[�Z��y� \��頻q��9�p�!
���:����͙N�ewm��1_�F��r�7m
*
+Wd�c
+\�����oi��5ש�A�l�gڂ��
�Y��Q�
^K3i�
-�*�3���;��/
ZL=���)�O~��旦�j�m��8`U���-mr��G�]��e\�>\������)g$J%x�=}�)Wj�גL����`�!�a4*�[
Ҁ��#��i\,
ۧL�1u����ɴy�7�#/+���(T#��-�;�K1lI��V��~�y�ՔJ���OqQ
���*���@�⤇�j9��Z���R4���B�q!
��%eA�B}�q�ɚB�F�D]La��0�
wҖՈZ�@�z���Vg�k��|����M�\��]
3Y��jI�W{Q�b���5`]j�訍S���+:&�.�`˘����!�&\�M�{(�����g5��0���e�%X�6�)aj
l�g�ka&둂���
1+XqV��H���\�2���
+v�@�S�6{?va��56YU
�[�(d�e�5��
���k`�]�� �51���hy_�V�'Z.�����G�V\�@
�;��Փ�[�0
Lώ�-4�𪎤j\sN�{ݴ�����6�V�P�t���F���ǧ E�̜��
��Oqq�|o��&��@��ڒ�*f���":Q7\�q��ߍ['&}qU
����TKw;pE:�eBî�g�������i�(5H�����LK�b�q�a�
�(�����G�W�߯�ǰ݇��D�����oQrἾǴ���<h#+i���
��h��7
#kb� =|+����w
�H���Z
�W��)N�\�
^
3Y����.����\
����v��A�n�
q䍵(�%{�[I�Yi�p�%��|JF�!]M�,���l��K�S��Ԭ�x����x�Vf�
(\�sa�JO��v֩���흑M���_p�Z�.��vep4Mڙ�Κ�8Ѣ��=si*%�i�(5۩���崄
KM[
S�l�`��f�
9(�\�]p��N׃����[��yG�|s��et
p�ti�ɲ�����,5�=p̥��+����s�
��S[69
F4| ٧OmA=�\�1)�KW�t�W'�Hف�
�N���d��#ț�d�ߜ�h�rۣ�6��JwT�>F��qu���C�{0�>v\ٳQ*�3��@��d�/�vi�a�����u��BO�An��֫g�����|�@{*t�ƴȊ>H�=
�*�R�5]Vu|��(h+�+[�
Z�q�XY��%L���ďӴ�˻��0Ņ6�=�,xe=RP�4s)���0je�n��.F�V�
}�:YG��:��ղ+�����8�:�c��c㛬S���qND2FM�r��г"����).��VlֺҞP�b��!���b�v��J��
+�VΚj,
��-�9Dm`țd���ʼL�"
+�������v�Z�
;T/��kZs�[
S�t�`l�\�5q�A�� V��ǺX�
l
�s����f/k+7ɛ3
�e&�B`�#�i���Մn�̒�P<�F]9��L_�:F�,�_�GK�y�`�
n�g�f�+��OW?
n�?��6�w�~�b��
n�/������\���p��u�'C,��Ѝ8IF2)[05l�=���i�T����i��_�j���Ԃm�Y�J{�0P�������/n_�{�������?{p���ї�7��~wz���?\?�����ϟ߾������F�_1��?\k�է��������zw��������������S�K/q�̗������ӿ_�{p���7�'z�i�����\��s�H +
�c̜_�����U��Ě/��~Hq�����%�o���u��S8�7����RU��;��d���7���v��Eq&�� ��z�}���-
+-�Ti���"���c��m������3���:�A�M������:���g�Vd`{
~
���8F���;%T�O�u�k�m3�rp\C���ZN�m����gᆒ&30TƐ��F0/����9��
�ߣ ��+�l�G��^�����n�S����N�
��w�υ���XY�
�r�,�`��j�M�
2ȼR�&3_�j��uT6- O���`3S� ���QZE.N7|.��^̅���F�
���x< �5�4������닮gh����'�=��ۗ_��ͻ�<�G�߽~�҃�7�~���g��
�3H�<����O��
G��o
Go;���
�ϧt�����K|����e��=
r�U}�2����Ğ��t2nE�K⹊<��2A�{��;�
�m�<V4T�A
+l "�^������,���Q�ޙ���X]nB��Ǒ���B�09�&������k:�H|��]����`
㶉r�v�����h����߿�.���(���ঝԱp
=+]U^ {�|
{uu�ω'�JW�
Z
����`1�
X�>�)���jk��(��������K�<ƍ���x at D� �x�hȿ���zf�}6�d��5�t���&����^�ڍ�MI�!�m��
A�j$����{
U�o��X��]�
��8T���)���U�2��ɎŔw���Bf���G;��;�L�ڃC�ȶ%
4c���-�!oS����=Zgiy����G �����w&QB �g=
���Vcf�cGB*���ȥX�2\o|-j'�
i=�8 ϝR/s�Qۢ�����:���Y9HNH
+�)��<ڗϫG+���Q��cБ5ʔF����=�F����Y;���T�*ʠ��K�ۈ�
f��l�l�i_(�������] \��L�38�ǻ8���9lý7Y�f/��Јf�1�ykeA|�)�r.�Z�9
���ڷ/8
�u��x`%{b�&�A>�&J.74-N����`�@EEv�
Z'�B9��p�Ji�3VB�Y���=�N�h"1�C�p���1W,�R��T�e��lX{0� E��2��. �߿��$�����m�����&�)����e1
���lO)G��b�QJ��%1�рb
��й�=�+�D&*�[V����g��GlŃKOA1J"�Z��6j�@�두
}��������'��
ҽ[ڇ�}��S
��dրޚ?2�M�\lX/�eا��8�]͠ ��a�w�w܋��'ߐS�2�5I*�0O���;.p�h�_��j�OZ�>�V�ŭ���s�G�wA�?
?L��
�ӛ�
;t$��,���4�
*P k
����
��ʶlD�j��D//Q�O�*q��j65YMi�F;A)�ec
&�]:���E#� ���I �9"��
��h�k߅����
��t��
}���eq��T��$D�)��Y�wc�Z���m
��^��&&R��m-�WR�sK�}��Cリ�9�����(�B�6cs��x7�^ǟ昃P,S��/\[�4��C��,���Ŷ�H��.�+-�2w��H�;l�;l��-l�Ӛ�9��p���uU�ds�
�:)%1�{O
�:�.{�}ù�M��k��O�*:\�z�\��8lI��1
]-��7/�?�"N����݅�qv=�1v ��7�P��
h�a8���z�6z
+��;�W�k�������tg��9���A
)�Nq&
6����ߐJ�x86�'�d?JI¤
���
+�^+a�����`Tw�BW�;w�a������^����v�0��
j����
#�{s�?�
o`87���l]L"�jI'�ʒȬ��5�H�o�B�1�D��F�j��NYl2冋`����< g<1��W�LS�/8P�k�-
+Z�amk��4h��; ?���h83�B
wXWQ�
܄�\���t 6�?G�7|?�qps�ݲ/�4��kL���cf8E
��ʺE��,k tk
��'�L
M���4qP��6c
�16a�����=
��pj�ċ
bA[��YJ�M*��F��P���&���%-g�#&���.�G?�R�b��:�n<��5D.\h
~]�r,|D_��kƣ-� 0�Zy
ԥt&��saW��2X���5�g
���7e�tXsRr ��2Y*m�H����I���zn�AgG at x���d4�D�-�*r6F��f�hI���6;$)9[��Q�/����V�
[���x�I�5Xn[�,b���&�5.p�|�����
�?|؏/�z|��/^���o~U�_~��w����_�����������������������������<~��ץ"�b����Gş�|~���l������~����s?>��7�?��<�Í����]�QW��
[!i�x���9�
�F�L�d�}3y�,b�Yy;i�$|1suߟ��o�f�
x�
s�ZLoE�7�]�Ŭ�#�j���<r��ENP�[:��*
;��mJ>dt�hyAc3�3a����9�=���9�g-�1�Fpw=��<
>7�,
�� �ЫyàO4�#�5y��=��UZ���l+��o(a L2��2RU'��
B�(����K�)�!��p�����Ð8K�������ö
{ZR �.aw�����
3.�$��`�/.\ �q�_�^�T ��y�����^4U�qP��6��Զ�Ө�yP���W$
P��M���=g��Tu0Ҍ�
+�ex��+�m�~ �)K��No{svR˳�sҞӟu��w�S����Fݭ_n_��8 ��Ɏ�x�{(�i2{��T��&=�
W�\�E�
��lJOj����Dx��0�i+ք
���2�> �Ib����n�$��_yC�2]�5�Cs���H,*�V%��.�k�}��b�j�4H��
�P���3�,ht��XU
� ����m4kx���K�%��=s[hH��Tӈb�ў �t_�
�
�?�T�QX�
j
pq�h�lc��792�
�ԝ�͆��\^���Vb��uYGE
+&�[�+т�dp���}n%��2mDm�>�7���{��x��m��c
�7�T�jWל�\�ԫ>T
{6� ����� �X��c�'���2UA�
F��`K{���\����îfYGS"����%�&ON��%������ˏ��s*�z`^ �P�r5j�Dz���{(��� |�
�c:�jhˬ���2p�T+��N��J��
+��"@�5>��2��I��
ly�R� 4L���.�ʔ
7XC�{AJ7,�>ü��l�;���L!y����֒�x�F0� �x���m��|³���/w�D��g-���-SCc�
&c� �vcжPg�=m
E��IԘs���jY�fl-�9V�{Igz��[�y5�c���"N/�N�R�'��
m=z���sf��TV�w���ji��(��@�÷ D���ݥ+M6�F����0�f at c�ɿ�T�S��(2̭�~���r�
��F��i��87.u���z��qɌnKy�-��z�Y�_�;��Q�Z�ب1e���ȑ
��*�yk�7�^ 0�H"l���U��~Ԓ��_������$>;�^
�},�4r4���� ��
�u�&<�qЭKo�����]�4ѸIa9-_�
+�D�c�j���W[�t����+�Ɖ߹$�o��ZT0�v3��
rp� i+�?I��b�(j
v�`ğ
j�řͬ����j/�����]�DepXk��C��s�M2�\�Kh9w
D�b����\������VX�
�v�h��/��l��52
\M4*
x�+m������%��7��Y��E"�6%`_�#1ü���)��6�kR�9�od��i+��sA
�� AB�KJ��<"l=����o
|uŀ��%8���������8��Pl��@4��
F+���R7�p?q;����'��} c�z���Vv�$���ʝ�D24��ͦn��!�ǖ��
B��(�� ���d
'�厄������q�<�����:}[6#��� a�,
5��#3��ȼ��7������}���۩�z��nN6�r[8w[�qK���*b)�v^���nls�^�gh
��Dg�ۙl�Fo�і@.R�<��afQN
~����'�W,��ǻSz�8^t����VKYI���4��`�G e�Yq���~����&Ż�_���#�X�Q
wFՍ���lX�QF�O�����
Y���0�Еf���̠��2��0����r�
��;-ʡ��b�txX, �En�xU�_7��a���C���g��Jz���\�n,
���rCJ}�H.�(�0�\;��4tY�ܾUh�R��m�%��dtp_�vd�;���H#|�{�e$���e3�N<Z|��x��n\� [...]
+����pLw�ϩx^�gh�^�������<a �������sP��lL�˅�
ST=�6c���Yf:|��jK� W���=����[��Qa1Y��h���H�*��[��khI�ԦV.
�$L����� ]#�kş��P klr��O"(�#� e��SIVm��-i13��d�f �l����(5�d�椦�
mO�
�`/5��|�p�C�U�qF��PGҀ�^`
�L9
l��ӗdy�=H�\�i�R{v��D�_�
�q�ܴ��'��d��Q�|$�=��5�u��X�����h�&���<��"�
1�2e�g���&^��Q j0徹X�K-��mm+jS7���٨e�/�Y���//
'ԍ �p�/�
�Ŏq��z� uc��1��[�zI
�{���fQ%V0��Ug|Y3>���Ό9U慎��>e�4���N��u�GW�����J�q��
+
sJ�GvM?��-�"����6�=oX3 �:=��=.
�*hƥ�?O!�m��߮A��pߣ����,G��YFP>aֽTE�p�W�Lqw���R�>��ue�>tԴ
�ܝd���\�v�*�H�]�6R�xu����}��ٵ�?�n�Rrz��Ͽ���?���ۏ�?}��O�~���w���_~��������ǟ����w?������᧿��ݧ���6�������?Щ���V�
�7`�@-@ �WA������
����;|����į�M��fUbkŮ�W�퐘^�R��/��+��%�sޑ�3���\��C��H$�)�C��
B��CH6�A��:yP�&m��U,`��2��h��B�
�d�g/%
�E�~��8ȅU)F�U�
���(���xVYe>��/�
+%�f�g^��f;��⁆Ѻ�Y3u3K���
+y����B�e�!�5�i��� �ېq��y
Nc��h�z��%ǹ��9zV,�
�"�y�
��h
{%J
�b4̃'63Z=�Yz�풋��8x�L��#)g\@*�Zr�@��"��K�
+q��`�e�`�1�6Z�I2�s�
D
+�ܨ���&L;K�h����
�XPd��}�<�}�0�:T��U�|���=o8�hFv�m�l�S3-�=0��|?� ��/~��Mk�����b�� ���
m�m{:��)�ظ���$I�a�<�$�r� k�c��Av�5e�@�g�9�N��^6Ӥ�:��� [Rڤ���`jx^k$Y/I����8\��o��In�v|
��=���SL�h��-���
~��k�z` (-�.|by�m���{?�5ɘkO�}�MU�
��
l:p�<[������8� ���p�
+�a
+�S�����
2��G���pb��1OȄ�m�L3RH
�ۃ�-GOG�{�J^����!c{d|6E�z*�8+���2���sf 03TLM#v�T46ɏ|EJ� �%Ks�H�={w]�
�Qk�A��lط��}��Э+�u�!c�xF�a'{�\T��wZ�e�VZ;��W7�E)t��*��
�"&�R,CX'�ɮ�Ia7�R��Y�� ;���
endstream
endobj
25 0 obj
13987
endobj
26 0 obj
<< /Filter [ /FlateDecode ] /Length 27 0 R >>
stream
+H�\WK�$7��
�� �)���
�n0���̬6�i�S1�
�֟��������;>g�L�?g����Q�
'�O�L��ܟ�f�k�|t�ϯ6�'f���o���Ď7��ח|�z=�C�|��=�WG[�
+2��+��t~�Њ�l܂�h^y�K�6 s�R�G��@�̖,�����ˍ`�|"���R�9֏e �r�Ep��
�8�u!
�1��z �j�� o�O�f~
+����,��C?R�**�v��Q�ޠ�Hp~���U8.Z�����*�0U �K�YP�ׇ^��Ɋ����#�70��_�)��]��ϒalEeh��Z�
�e�ު��8�!���LCX
�'�I����VeuM:�&k�>�W��Rz+Qm�o!��~��5p���ѹ��8�C�g
�r�
J��"PF�n��$���1=�4��F�w'�@��~;{F�I�/�����rV��A0�N� A�9���>����QO�������)���c�A'м��1n��,�0ʈ��lC��}�1�$�i���
9~<��أ��� b!�����3(yė�.E2�
t���J �Y���ZU/�>�S��Ŀº���P�N�����ɵ�ˁ짋c�'�����g��f�>5���S0�v�N��h���H����љ���-�H�`��|��e�x�`�ì��7�����LkbX]�Y1,�+c�Sp�u�,�ox|�.lN������s��3\F�X�Zd�+/
��k [...]
+
+�
�j��6�{��
.�m���j���t������� m�
��@e!5B16��B�DW�낎{s�b��͑�����m��r`2�
y-�}�-)�GW~����@&�����A
��;x at Vα,����XQ`.P
{G�Ԙ�������x�{,�]� �0���ܣ
��
uwM1ӵZs�>�����0T��[�_�,O�k at o�J���ƺ=�o�H\"G�:��B=ɛ�:�p��1�
������p���X�f�lxg;ku���k�d��T
ۻ ��9G�
�w�r<5Z,L�ؗZ�Н�m
oeU�u��@~
i�o�Hi������8K
+�FIN|o�h�5UIK���Õ_C�� r��Hg�v����:��R��1��Ly����"o�Wpu�����2�Vb8����X�
t{
�Z������ݠ^��
���stҖ���]��VH��%�s|�����U艫z����{2��@i[j$�%������{t��_prD|��p$h�����5�W���U�.h�$������9�w!&Hes�̮�J7W��5���Y7`��+��<��0A�2�FN�j���R�{���"�C��=��4���^�n�r#A���'NG�W��D�i�� :��8�@K��Fyx��fop�<\~�#�d7���¸gm�7
�ܼVj�o�U�'�6��d��
�g-��
B)��˦i����%���̈́�w��m�rx�3�{�0�:_u�$`m;/����l�.��F(P�o�#�&y}����
+��f�P�\ION�M�y@�nV(������~U��@�oW �ο����A��6'FM��%��?�k�=���8�ܣ-~Ə��J�?���?��K�_�����u6�P�o�C���4���S�jP��ν�ޜ��*ҜO㑖w���)-��}
�3vs�N
�73
"7�7VO5��
�Ԡ>���^�����Ř��z�&�X
�*� ����s-1��^�y-���^Ͳ]ݒYٵ�[u����Ϲ�7E*�5�%0j�s5��zd��.g�yʃٻ�E
�3����hkl��{s�n��*�ĖU��Dr�WX:y��[��ͮ
+�Xo�
)���O���[��*U��L�^�P7���O������ai���z��?.���0Ћo�;e�(��*4�Kܿ� �O�[#6�,>�Hu����E��"Y��t�{�T�S���K�>1x]
��Pta�vm��rd�9鲎˵�Q�on�_6�n=x����jɵ섁�H���@"0���m��Q�̲��>U�
�[�t�q
ǘ���w
3D��D{�c�9}�HR��yX�;���rJ��ߚ~��Zi�j!�Y�Y<{�u��f�ŒdD�ױ���CHk�,P��0
g7�� �(;?K��~��`�&�s�,Cm�ݮZ�G�7��� ٽF
�i��hq0h�@��Ľ��{�|Ok}�B�5t�/��1
�
��)��=2����z*(A��
�x��t�$䖝�Lm��L`ɬ�=����E"���4(�j@
h���UL��S�z|���
Vf��Ý�M .ǰq�Z�����{YRn�Vr
+w�U��
�=!�E&���"p��D\'x����
�%h)�6�|`fg2c�3�?/1
Bll�;���=�c����ZH�=��|<��y�
�
xs>fX�i�������G��e�=��M]��Ct|���
�鉲`�>�
��dR)&�)4s�ypr�Y��B�F
h��ă�d�ѻ?��Dw��x�2Xʼn$��<u�۫0�i�q+� �C� h��
#��𥹼Ĵ�a�Pb��{t���P�����~����8v
�I��A!q6�+�[� jd�Z=ZJ�� ��h���;�%C�c�p
5^-{6
�q�|���z��ǩ�����C�}��
��VT8;�DSP��P���>a�Ȯ�����~��w�9t��w(�/��yVXa�8���Weͻ}KU��y�?��}
Ԙ���s��Dc+��緺3��
�
�9����@
�X�B����No�
Բd�9:�
+8�X������=�
�g] ��l7�'�gf|k|3G`��Z�W`�b����[�Nn�BqV���+��mIR0����G�>~�h�
k�9�Py
`�\d^nI�{�ߗ�*4*t�b8�(��1����Gd\���� �l�5T�㞇�4�ݎRƫ�d�8�8Vڅ�h�&u
�_� �%�1 u�t�}��+t���
�3��NJ-y�Y`-
���8�5ʠ�� ���L���+o���͍�,F
xkz����n��C��b
�F
Ɠ�,mZa��^-ϕ��^n�W�Ϊ��6rq�%��
�EY)i��%�ކ�\��3hi_ETw�
�w+d����r�E�X�� V�)4�0+��s�`�y�@�>l��v�q��ו�t*DƂ[�3A8��|Fg+�TH~4_*;ë��kVe�9X�m�#�y�t�F$��z^p
�O����@cJ9!@Qi<yg�8�)�>@�4 =e=�g�G�q*���
�dz���[��+��uM���{�r,�+���1r���@��"����v��w{�]�է^���(��-���Xش8Y �|��`��j��8;�lª�/>�H1,p����|�#n�5�LmԜ�q��5}$7��2Ј��z��@��'X�V����]��"-�%
45�fV�wb$bQ�x^$��<��H�j8x�n)�LR�-JEf�fa�]�b����D�x#M��k�<�Sm�BKoCW|��r at K�E{�:�z_P��lL��
Z/J2E!����n��u�;��>� [...]
+��w��I�p
^��� ^��0��I���� /�'쩕��hBp�Z�vQ���8I0�%ӜG�%L܇g�nj/���
����{�;|t����M�%�X�Y���*N�
+���.�W�5l,Ah���*��8����@�"@Q
+��w1�3f�
!L7 at Q0w�c�y����c���cH�ު
+�ȴ$�n��5�����w
<��Z�-��"�����4�c�5�0g��|��|��4a�5E?{�[�y& +Ƹ-�� �E�w������!�>���[OO����L�W
<�?��5�O3�
`ٞ�a��9�}?�WX>��X�����v��y_��M�����\�#����G�����i{HGx��3���#�n��Rڄ�5A$�Y��Ւ�#��-�^㆖Ε=�#!8�_��xc{%Kp���[؛6@�[�f
�DZ�
�إ��%�%�V��*bP��zN�1���<
+�fR�] �K��v��d�3�V�J0�
��� q}颜!<`9JAbi;��z�d��{�+��Qr��=�/G��'ʨ��3��3f��r
�CX_��N�.�����w��s*D
�ֳ�T�.I&l"��
Yˆ��Er�D|OO�{#@�� D&�2�8������d���z�( ��! �=���������$;Ϗkԍ�9՝���
6�{0����
Tފ�
�6kN�ȴ������:G[��Cq����~�r���2��;
xY�
>5t����r�+�����l���q��ǡd��
+�2����9>�`rf�P���.�K2�d�
+�f.0G_M �Y~V�o`�).��.��`��kc wA-
+��W�?����%�u��<ó��~/��^�P:
L^����W�r������ӎ��?��Ï9�/Tȃ����y}J
++��P
�m�)xD��ZE�j2j����Pf{4}
����k$؆i���
@��Fn�J�� LY4�����F٪|pɷa/{D�
+� �377��ZH00a'����5�b���|�
�I �"��L����{.���{y�!\".⸌[�Ϊ�jEWɨӖ��!��4��R�)���K^ d����&�v��z?.�1�-
��Rؚ:�@�<�����<lXe���=����mp�]��=8/+���DT�[�T`�^���#Ȱ����xp5�幯[ �Ђ�ܾ��f�5�u���}���0v94��]Ÿ��6�0{��eKv=�H�&]�݇�H�S�����,K��${�Շ�:ʠ��s�����_*B�\�jg��`?�����;dp���Z�3K|����ӳ$~8
XY�u���t}�����|)\yH���^o
+��V��I`)۶��d�m�=�
u�
?W�`p��9����`V^�<�sw�� 7��=�
&�5�@(dA��ChU���'��
��1�0�����eqV�1^�_��>�� l��5�P�1k����%B��\D�Z�ך�
蚲G�½�Q�L������! T�~�KŎ��b'�=�t���\�N�o|���tn�A`>Tj�����k�I�|p_���E��C��"�K�n.b�vI��Pԥ�ԑ�M^
�������>?�
�e���w
ҋ@���%�;����Ct-��%
��.�w�y�s���~����o&N�J<�M�п�� �P!���ˈ�h����
+�G,� �og���7�*�
w��(�6���WY�e_.�}zR
����
��:� ;�d��S�� W�.��2@����c�����A�A�_3E��bm�ei\������G��� BWb3)/� y�I�͎�e�%:�?+x�����&�
d�K|5�K��(���I�Q��rSVT��(�"p��ľ�\��� g��R`
����뵦���|=5�n��Rj���а�K��v���N�э����9��!�h4v �1߁��� 뱐̻Ĭ*�vg�r:���]b���m|)�[�o�*6� ����@?W��g�}4Uq�-a�yۋ�8���5�R%L�9����
�,2����"���#�}Am�+��O i���P,\���c���yҞdN��g�)Y(!]+J��
u��k�AJ7��=K��o�]�a����~�ż
�|B{%��m
Q��<!���
+��i�,�p�y����j���
j��8{�*9ƭ?3���AF����
8��}z
}��*ci�)MQ�����6��.��MW�;�w;��"�H&���*�9��xp@��{^`�}�`_l��>�\`�<Z�|��DS�=�8�%��U�R��N%�u
Ԁ�p?!�RmV�_�C1>c/
b0w�0�[n�i`�!��"
c����L/*�)��|ԣ@�0f��b�4 �����;��B�k�s��n�[a'��E�ʸ�K��L�ٜT`gW�����T
�:�AQ�Kݏֿ }) ��>6���M��l%߾�eM�W
0�K�m
��v�;x�+�R�8��V� �"�{>bM|�����b� �*�i�{����w��Ѧ| �@7#��,�
��F1���bx�
J�w���1�?>R�{�u1�ӨVW���ֵ�ڻp� ]b�t��
+�
;J�JLR��!蝋�E�*���h5+�h ¶��
+�_�У]3H5�e?���_/I(Gk�,��Qި�Z��7�X%�O�M����/o
D��r���O�$��F8�eהZf�J
S�l�7�
�gq%�N�<�g*��:W{�QJ��;Ô9�Xl�Q���/�!$!�y���f�]`��;i��)7�d}$�a���$~�����Y�
w����z���fB�
t��b��~���*�'@T���@l��{�/E�eB�K
�^��E�:��m�z52�b���~�;�]��$g��x)�0W:������ �` lN�R(g�W��̴���O��}��M'����Vr�yg�^�dia���fu��ٷ�D�Yd8��e}��N����1��5?ڱ�
�r �W� [�� �^+m�I0zz���#۫^1A��)��
kޯkȖ�!fN_���p�> f�:�ݪ�(�|���_����l-.� j�Dh����z2����ג!���WlU�}�6��
�C�)��
+�C��w=�
�J0
+t��o;�-
7��Ǵ ����%�����u�G�I
�ؚ��
�
n��I��w�����
sZT��Þb�ic6�E��Eʙ?Tf� �ź⦱�g�� _�/�0���i��$#��"d
U��N'���. ��`�VA�˽��J��[�x���^�a@�/�b�ı�]8#�5����c[�! ܹh��`?�[5ݽ�=:.E�[�dg`,�
e`�Q�2<L��Di�Jr@��.^�!��6����_�v�
�5�fj勓�P�v�`��'g�r�v @OI�"̸�&��C��+bGX������"��E?p�g{k��k�)���Ԯty/�${�[�p��
W%�)�iy�5 \�?9�x9A6(&���]��.����l����]��FlԾB��a��z_��g���
<ܳ�ke��-T�嶗i�sPNmǎ�Q��N�i��Iw'A.���ٲ�vLp-%X�~R���E/y�/�Q
Pn&�ſ����^�lOug���V�!�`:�4�w�� ȡδrb!�5JM[K�Ro��(\f;4��5m����n��~B�9���jH�,��l]V���Z�?��h,X
��5;v�i�ڟ���k �����e�0e
����(x���
��V�)�|��
�+����&f�)�q�ۨ�V
%�/
��^N$t�
�.C��;h��ȓm�,�V�z�Zn�J(�rh
���(��s88�S�4
�����(��֊�F��K�Bޝ>���]�
��h��I[:)�1���O�������7Y�%����k]D�Z�8"}����+ Ʋ�1�h��I��.��JO��LLj���i{��MgY�B�N=UR|�/w�1�)��."��6h
�*b�F>Ċ:?�(|.3G��tp�0L�}]��.�
�n%��� ��b���Ɋ
we�������fÿ����>sC��x<>vw=Uw���(�Q����
�ț��2-�ueZ��(7�f�h�aV!
e
�h���r�#Of�i��=Ʊ��
�!�Ŷ�\�W{D�pC���jO� C�;`U$}G?�
r��
�^S��R�t^v�z�doE�8I�q�$$(�[
�kjz
3|
6cόJ9��k؝��S����cB���H��
�1�c�o�j�*�tq]e�R�*#o�
V#�q.�G����&��|��������}z������O��}����o
�|�������>�����~����^��}�k~��5�~����~�? �PH
P�L��6��)��9���0
f
���&����C�
�BD�1��}G��
ޥiW:5s!%�h��
+���~-n�H���B��8�o)-M
+���������7
����L
�|��#�n����7S��
�<�����܇��Y�r��֩��Hz�V���j�jv�.�F��q9�y�S�T�&��SYq����V/^0^�V�R �MɇM
+
�
���IGF'�e��>B��jufq�ty�n�:4_�&��Z��h��5����OL�@����o0��?�j�_�J1����rI��+����6� ��NG�,P�
��l����$4��H�v�������&k����
I�t��5Y�^v F�k=�xg�t�--
��F
�a����3XEr@�!%m��G��<���sʰA
e#��ˮ��f[����_�{��9ȍ����}
�{
�l�"Q�A�"if�j=�5��R�e�s
���\�|F3��sNgcM ���R��
��$=H���XY��S ���p��1��]z,�� �&�vV�s_1#�Z�/aף�R����eGS��*+�u�1b�LZ��
�ӤE��Ђ�*��<��}�c)����uY
+~�U�V�+�5.��g찎��N�s��#/���d�I���=S�-0\:��f��z��p$
1va��>���<�
��F
A���Bx)�߬G$�����^�6�Ai[҉G�
۶���B�����ǂ�6F�5�u�$:�
�$q�P$祿���UI^F���7�2^�^ �k����Y<�� qvh!
�a*�hđ�ƙP���
P�~Y[�O
kll=�?��k|-�WND��,O 10bּ��G�Wm;�k&�;���7�l��~��F���w^ma'��;sC��
0�f/G_[������+���<��йR�{�p�?2�X��GiN
�*��D���J
���5�����f���&a�fMd����|���(V���PvQB
/�h&K%Y̡�[kt��s�s�hI�b_~(��X鉚&o��}}�-;��jy�$�
�bb�;����[]4��<pg��5���
�,�q���d[Ao��(��ˑ�?3��B�GW`�C�;�1Y���w��ˋ��١FLsuϱ=�z��m�M�$��0�N��%���kZt�E�;��k&47�z
��u��X\RY�
C�sN�0�k��4;�W���5Fv���p*�#
�W3�Nw���!e��bd����hL�j�\�3N����GWt�/���|YAH�.Z�o w�
�_�[�+�
�$
�C�I<>1Y��Nؒ�����`��@ҥ��0��y&ҦwE�}툅����c��&Mr�L6)W�
��o�����&�Q�5�0�
Z�����i
+3�T�!ڸ$B
���DWE� ���Q�����Y�����)'Y���v���Wxd�����xg����� ��!����m�%�+c똕Y
�jS�u�� ������ȑZ�Q��--����̲x����J��K�zL�nݏiݒ��+�Vj���Q�cM���%�9(S�
�{�,8��a0�ymP��d�֙��u��v�+��ֿ1n�w2��� �:_�
Á�zܻ���3&Ǯ�P�n
�[��ӕ�n����T�
|;����mF�oa��Z�Ej� G�
L*�c�+0��Ɇ�S��Nm[�+�tpD�̚ظGس�8 ,�ʭ�h��?\�X�/��%˓��%�f.V6���
�����4�|9�
>?�6_�8�C��|�;ޢb��
&����-��WV�����U���e�kX#��,�Vr>4<�!�Gr1ڠ���ɏ�r�
+���!�8"��6���&L]O����g��
�3
��%ֶ�%��.� WS��3ly�@'N۲���5��Uk(�p�&+���XtL�~��GL�b�37u�u &-I��H9"��\�8��6��㾨nn��s2q�J����A�87�<�T;;��p�i������e��F
�-9��
րv�G\v�l�[�Y{2�\�����/j�V#S��
�tK-5{vD�����@��Q����X �e4��*�
��~����cp���0��6������(��D�{UX���[g��l�#@���k�����9$����O7��3���y�����3
=?���1.��P{�n1�SGO��f���=�w��2�n��
�ZS��-QC��K���fsh
�mȨ4$93p��s�����W_
^���קw_������^�^�y������o>�����?���w~z�������_�����{����x��X+U|���W���_�o�+N�F�?sf���x��a�٣��$�g[I�u��
�cJ���@d2ٔ����W�Գ�I7@�i|�PW
wt��.�19 �iܑ�u��`�K�4k;�6R]cD 1e_�)��x�|X<-1����e)���yn�f'�-]`�9<��
E�(��&�u at Z��LK����[-;�J[�HJ�+S��� ~�^Y�?֫����
���}�ٝ�D���"�i)�VJ���̙�=i�+ I������3�u���~��+;l�P6��gzƈ� ~ک� ��m-��\�W<䙟}���Q��ll_,i
������6
�r��"|*�U/�HzVrb��BR�<mJِ� ���~G [...]
+��`�K�d�C�u��l%�j�N�'=Zwr��d��G�= �9��s�_�E����7���K�[�z�K��g&6[6����6�ۓn�$��|�1d�������t
���
���RR��d_W�ui���~
��4�̀�m���Y��l��e쏸[,
(Inwg��ⓢЮYu�j��w�����
1D}��yn��>O\��D�Q�����y��B
������9����ϩN� ��0����L�9g۳��İW:+ at dh|��z�rt9�"��E��4�T8��3�N6�*SbpK?
�r�x%
3�
�����Lo�^"����G��l��
���@x&�:��{��PR=]="�%��=c���8�������zu�1ԸSsҤWE<�
�zu�3������T[�����{�njY�M�M?3��gp�L6�P�"V�p��SH�}+C��^JK�W�:������K�:p�6.t�Ƽ����
+���
=9Z=�d |v���veֶa�����
�Ԝu��j]����� Х�ޡ�q\U�
���`>DKk���恾ܽA3.����<�� �f����;��x����ew�Tg q� xΉ��v�r1�.87hk�� Ę�ӭ{w�AQ\���2N%����7��O����"�P�����`\���v�y�x������/y���C���K!��4CW��~<�oc�_�W�_5�8M��Gp�/��p��)�8��
3����P;T�մM\<�bC��$��]��:a���b
Z���������"h;?�ُ��"���sD�⍿J�~�="����O����^������O>�uo��7_���������⫯��MA����3��s���wo>��ͷo~����w�Gg7���?��w/��/�s{�gz�{�����
+��
o��(�A}� �=�H]
����I�S��r4��#q �w��X���@�͵�V�(Pf�~� ��y���q
+��=��E�͝���5
�ms�>z��9/��0��}��Srx�W�d��_P�.u��t���+� V��
�]�+f��:c_��@l�|zzJ���H�&�!M��9��ә��� �ʳ���9X�w��N�t�L�'O�SZ�Tj9s�����
��+��17��q}[�v��v��l���~�{�9�}�;�{5c1����
VO�?>,JxM��fi�$�x-��1�و&�M�+�>N�^P�:�v�G/��Dg����� �d&x�
!��Xi.1S�f�V ��P���7<��������E���WY�i1ͯ>����1[�w�7}�^F��ɿ`3���|%x�������
�M;ʀ]9Į6g�Ձ����h�T���+
�e����Y9S�Z
qT ����ص��X�iT�c�\��h$9�q��Zը�i�p�����"A�^B�tf�2�m���cW\�VnϤ�m��P�-�PaU�h 8�ce��d^C4�A
�[R0H~���W���d�dos��m� ��ls�d�z8���k�Y���-9�_K��vջ���mm
�Qt\
�)������0 ����.e�1V���){���#����r��� V��
��j�o�p7�t�r$C� ���g�Npj6%�M�l!-,���&� ���\�uX#�;>�(?����<+
�w����5�(Z�����7�-O0��n�j��+�
`�>DN���̧�F�EGs�A�m݄�]m�4^��PX�|���Ķ÷}W�>9Z���g@'�3��g��:Ok��r�uÙ?��Z��(4��w�-L��fXk?�
<
�>u�V9$�ҙ/ ��愩�h����X���E��
�W��
b���X��d�n�}�
���:&VNk%i�����`��f�M<�*qY;6Q
2�ԙ����z6�Ze.����'�����BR����o�{y��U'��X
���4�Uu�I"L�~�v��2��H@ ��Af|
�3���� =~5�ZX,����u�\0/'�S��&ڼ�T1��n�f��W�b}4����= W�#��}��3`.ݻ����l�C����6�k��w��je Vv�?$�� u�y@�݀aJ��g��>�Y�9�f�-J� �
0����\��ѹXf� ����
f��|ĝ���t���;�&>
�>���}�Rp���w�[�N�:�����~�~��
l��փe}�
c��F�b ]
m�h�Ļ�R�}�F��Ѕ�`��h!�2�$�"#��ڢ��܄�n}�8�����qP���6�Q
̌�!�z�a�n�w���8�O�|a{�
v�e��3Y���(|���4�;?�
���A��ڪy&�&�绂��x�UY�6��T1���&��}
_z�{kJwXŝE��I��xeZ�)����Z�����5�t�y ��Zg[����1�"�UW?���h`ߓ�*e�
+����xcl�8���u��E�i��>�}q��(�O
�:��7��]�w���� b�+�G��X�
�ӲyG�"�4`ѧ�>
́�d��5+����0P� 7P|Am {��|�?i�pH��N�{�
�cO�,�Y����j���k�ʚ�]�3�2���I�m38�`�`�cė���]THK�_���7���
��R���=��g�"D@E�LD� (������ݽ;��y0�
k�棧����ܺt���3��6�0o#�& $))�)(#�BV��A�i�*;�m��vq.`���n�d��ml��~kx肩�!g=���\���sj����q���gV�E��e���T� �&��ָ��X�h�b%U��6�mCӆIN�-R7!`�jY�|K�<�y�S5��<r�
F��$z���nW\h �n!���܍�^�Xt�J%��
fh�$B�������"�kf ��DA*
zP���E��Qs2���sO��G���|�M�0ʙ���8S)A��(��h ��*T��>��T���b�~qL��Y����
+�8�
x�� NQ�oL\"�~��S
9�#���&����J
O\��B���� w�c#��]�wGOϾ:�����������ݧ�wGO�������������v�������l
�|�m�GOh:��?���O��,%4���Z�7�Ԡ
�%(�$g���X�,����$S���W��!$�YG^:݈Rc.C]X��h�f�jN�N��uS�:_�IWg1���G/
���C,���!��7o9F�^�ޞ�\������]_��O��t
h�c(@(��=�0p�x��
+�OE�,
C��Pdt����Ib���t�D�̀�!�I�<Zd�m܃��
�������]0y
�Ye�C����+7X�p+4m.
����
#a���
���f�s�M�M���~f����'���������o����O�NO�����_��pw#�l?_��GO
����,ow�Yk�P�.���ԁ�;X������ U
,���w�J�����
+�DR�XV5Y�^XQ��l��/&��"�(�!�M���������3�&��e�@gY��K����T=SL� ���;�hR$�X㓴G�C
wc
�:�Dl
w����B�z�t��?K��l0`&���0 �E�V���0����2
{�[,��Шl{��, 3 2��h�Р~[ �E�B1ׅNC�]w��u
��;ss�^���
N!-}�-D�.�nf��د%����/�$`7\��|��~��6� �
*F�?^k����_A��ddD���Og �`��to�s+F��
^(���^~���n�x��d�}JM�\��O��u��W����=9
苿I�R"���]^r]��5�`��/"�s&R-3��<���!Z�|�2G>�t��P1Y�����N��l�
���!(5>����A�LC��35�~/���:�V�FI�;
���{��������
���W���I�q�n
�*#��9.�_��T���
Q4.��w��KA�z!E-�,�:�����LZ�C�*aܱ
��E��MTm�\�R7�+�fp�t�!T��),��A�
Y�TJ�-&N"�I\�k����b���/
(/��yӃ�j�`����
e�dž�v$��/Z��Gb�%1��TZ���.��0�;�# XZ]���[�&\X��U�� �4p(�(��Ŕd]�V�ѺSa���v�\�=��g�V0.����N?;������1��gOˤ�
CJe|
+�P�=�2!��k� ن�{Ԛ���٨ Cs���
����l��Gmz�|z�7����rg�}������1��˫�[���������۫���݇]>g;�7?
=�x�a8�aP�K�������'�����OаOӏS�����7��Do^jy2u�.�o��J-C�a[����$�����~|�v�
|���m��s[���F�e�)'��
e�:��
�
��eRaJ��
��\���1'Dr(m�A:����
�3�j�Ɲ��,��1����[3�����
L3�zk-�Ŷfx>�<�|���
;�#=cz)��G�dJ��A�U$�byw�_�
sBS��|^cFI��jF,Y]�Y]�SkTvW�owRe�c��y�[�jF���3��\������c�9�{u�锔G����� ��R�ܼك)Ƥ�#T�Lc��n/
�0���Kxk0���
ݢ��l��w6jf���h_I-ɼ
bD���:��9�lg�'�Y,�������u�=�j5VG�Wp�A�OJԴ�T�ki�{hi���X�z
+D�S���V`]F}
owaP��4�C66Q������c(�5؎<O�μ�^ O�Y-��O���� "�j�Gb'�
�@X~����h
�B��0p��L��v�B�'��8��o�9�AC°@�v��X��P$��Mk,^�˚�zĮ��� �Tz�!X)��J�z�~ލKkX/z�
��h�1���ʮ�8�%Z6�Q,�Y�o
O��v����ELD�7�%Z`3�61A�����zpZ��I-VH�9�5�9#��G����Y�
Ga�XcϜU,щ��X�a����'��*��"nPoSg�ͧ��v�K���`��2��,e��,��%�vؿR �Ǩᩝ�2E�>g�a���Ŷ�H��9��V�c=��1��������.V�cY�#�>�t��z�V�{"Q9<�$�7P3�O���*V|��xl�'I���
��I_{�/�b[�7��X7,7p���u�yz���d��1� ���i�B�.,g|z&�j�z ;*�덽��K���
�h6���9�A˚�2���/2�i�ً�{!���ƥ�
"F�8i��'*��S�
W�M�}
`2.,�� Y���9Prl�����v~��1��Y�rR��p���
b�A���&Z���
��K�P8)�Z� ���ߘ�hX�H��� ��
N���A;�e��=����P�΅1W��-�ẃĔ����� �?�d)�f�TClD�ļ�)2���2�'��u� [...]
Զ
��qԚ$G
�j� �'-�ְ������_�y��Ϳ߾|���sӟ|����7�߽y��ۓo�{���������_}������o
}��ͧ~a�������
<�d�9�}�
px6
p
I
+�+�$�OnO��V�h^�[_��}ѠC|u�u���ӓ�j�f��X(\?6���5Ҍ����k xtrϼ�(��M^�!>��ܞ���J��QYe
�xy��^��qj���O�U��fu��a�a:p�v��1�w҃�����^Q�O�ۓ��6��1����/~�/vֽ���:��{?�����7�������۷��/��!�!Ǻۯ
q�{��~�z̧�v��<�n�zğ�v����1g�ۗ�u��=�~G����Nݟbu�=h�S$q$�Y�WY�
��ƨ��k�h |�bϜq�ueqPRk��VyRw�[[I]S�|�:�{�XK>+�fڋxw�h��;s�J�uφ�T��[���8%���"q��e)�B�4��k
<y���Uz�\T
�^!���9vӛL3��9�"�8�(}�Ao#{� Hs�jT�s�*��f�"���[���g�{J%F��k�-�yr�U3V��C����*�$�:r4}� l_-�����͢"�o|#���B��&��aJ-� ��� [...]
��iL=�8u���C\]g�l"�"��h��
8P��L�C{q��m�E�^&�7�f�R�՟_�i8#�'l�>�;��Iֳ��_煿@�Jq�p�^+X����R�
+͢8+�k
+L7nq�k�����GE�x������nj� ��"��� *z��?�4�>W+��qT�6`0��d�c�!��ڦ�����J.!7�h���� i�j%v���]s]��\:s�Ѩ�F�昗���_!m�Z�i��F�3��Ł���
�J�4cS��XE�ᦅWS7���B��
+�A��
ݢ���� ������JI��KE
a��
�6�a��i��qx5#,�
�V�/�J (O�K,���p���Y ]�6�Zw�ᢔ���ٙ`f�%O��T�1����2r�j��C,�@ ]4B���#�*E��A�<
%�P@)�(P���M|P:ۅ��ǮF���T"q�Y�<L�FuݽШ���*Z��F]m�ďV |��`
6ˣ�d�X=����KNG�|"�O�{|��"�x!�v�:�;R�eG4�
Q�y�>BB�İW�Doq�[I�n٢��X7�0!����x�k��L��T+�$�����u
&o~ӫ[<9��g�v�
�;�ۧJ6�8SJ�3��xX�8��KX��P*��NbRuV��.pXBX��s=@��T�i�iS#��T�3�S�I���8��֭�]��L�G�/�u.
L
?���&Zam^L8����
+�1þ�)k�0o/�FRbX[���h���6G
&��Z�x�N�i���-5�I�V����$D���
�J A{k�ȞZ��m�s�<
%�����J�����
6��w��
?�
4��� �Qfؓ�kp�9!i<:���.�
̴9*��+�8���\1�q�ᜈ�/��K8�����6�0^Lc�+XY�(Q-3X�"� �h��!V�3��w�I6���
1�2�,�5� ��
\�2����ͥLe���Ke#Ş�0n�F����\Z0���&�Ԙ�y��D㒕 q@��J-;�vF����k��l,I�뮢v&�x��Ve:�:���*�
+���|]� 4k9Zj�׳@Qᕋ������v:]�>�n(�T!
4�Խ<��؝z���0s������W�J�0QW7/1]�?體m�3
�}�E�E7�F�lQ�q�0 �<��{c*C
x��ЇR4�XܭyCn�ݣ�ZU<�~������I��6��@�j�� U-�8�Y)�� ��4Q�����ä�\o3V`E�g�c!
�ȩ��3�֢�۠#����
+ĕՠ�S
++�L�vd�~
~��G��LҮ��
'
+$m��0��̓�[�A��e
������*
h�P��$��0�M%s�*ي�9n�l����>>�,q�^!�0��r�\��$��o�3*��B��KY �V/i�XRj���!I��%�
%QnB�e�.�K-�҉��v)��j#�G��7���)ic�����C�YA���aA3 8��,Uȥ�8d��o8�A3���3��E�{�F���e��
������T��wr�
��{�E.\�\�݇�7�JL
����{����p�d�4S5f5�D�
��yP�*9�M�9��W�ZT�"?�ʧX2
��#��b�y���]]6�r��EsF�.A����r�f� ���
���f�� Դ^B���H��/�|w�A'G�A��!��x#y�Bn��d� q:�9s��5̭R��%�I�j��5ߖ5�� ]��.
�鍇�p)ev�[��
>�m"��kN��ĉ�>��D%=�Hm��[�C$d�I�{3�z��F���������98���B��~������LjR���IM�G-���+�
�&;j#��� �C�$>
�ġ��z��i���I ���"g56C��L�J*�烤�53B�1��g"x[&�-���uJ� iէɣz�������2H����UrII�s�����PHN�w�1�ݶ
�WZi,m7�b�G�,��L-�Ԃ�S��k���1����X�
�����>�0Q=�x��9�@h�F�)�G��(�_���M
�&���h���Lz����aȫ�{�գh.�t��2���_p�ۭs�P�3�
:� [...]
�4���yS��O3|��b�s�]���S��4F��#�(EB�
+H����v��@¬V�6 Mc[��䑮��SI�F��8>��4AF2�x���;,���hG��
��$
6�<Z��k������d/D�=���%��$A��!q�O������5F�@��ж�C8zNg���{����� {+#�����t�l�l�8��
�Rģޮ�4]����z.~/�~�4��>0�gt%���t0w���a���[x�h
�ϸ����4��C�#ρ��7��ʥ�>,,����pKaY�r�����e���(o4E�]�w� ����(�l��ݦ�nk��,�.�d�H�I&
m�R��\e�V���)m��I0�β*I�E�s<��p?��%��[Y/���od��k��v�|n�i'�O��iӴ�!צ/۩4�%�å�7@�l ���B��}Q-����z��#�
X���v�`-�A��N�
���&�N,]Ҡ�K1�K6�l���r�&<����u3��R��=���aȤ
o�4)��1>w��hǫg��������u�6�T�{�A� [...]
�Y��{9J��py�M�`P�i�|[πf%u���Į�I�҉O|o�m�W|*
�ο�~�M��ȌY< C� �rN���]�RO|ѳ a��Qhݻ��J�Ĝgq�� v�G����Szwд|2��|�9��'�<���h�LZ9ށ�����ѕZ����ZH��L����M%�����&�d
�1�G��$��%�IEG�H<��� �u�Pm�+)��h�� �Qa�+x�`�,��`�3K2j�&��=
.k��3�A�Ĕ,�ͱu�;�=4; �Z���)}�ݐ��U�#z�
W�G�6�Sa3
bj�bJU��`�tH�L�&�2�<Ki(����W'a��͂RϙG֮����!�AIy-Ƨ�㙇A���'S.�$�O�dt|��$x�ez�������I��p����Q5��H/�x}�
+@���
�ea_�3���N�TBg��f�y�v]�$�ͱ�_��Ff�3�߇G<
+*�;��kC绁kL��ֺ�l&~�ںE!��x�`�]>|�C�ر�83o��IM�H�O
�IgN��b�_�$&���}f�v���SI�X�Yl�5�`������e��N(�0��N��.,Y�������eK��t�����W}z��c����
��M�whJM�`ꦧ�ȇ*#��Vd�>�N}���^j�Du���f��ε6�;�58�P�t�}��N�
c�V�<'վC��P��(�V ˸��W"�������R�6�5֜7I�p>֦}�DP8`O'�d��[�e�W"�C��4
O�Hx:��� ��K���{�
�j��U,�
�:�2A�Ǥ��F-u�� p��^pCm��F�������@�VɄ��{�\R:��i�����n��>G6�q�MZ��
��V�w0��`�g�&�S?P�e�ǏMsXg�-F��y� �$A�p\M&i(�K+&��Ȥ0�ˤh�����Z��8�GK�K��T>T�:�E���Զ�,! �1��qЏJ���g��$�?ib��H�/$&*���K2�5)*ɦU!��w�tt��z�������f�-�I�~�{^J�
R�
�w�#�w�r�\*��8j�\)���^Zgk2z�'�a�kZϮ�3;\��Wq��
�ɍ�w��/���1�� 9��ч� e�7��:�p�?���&�lM��
+M�g��ǵ=�]4�Ye�_Bj�DH������k/|��L�["�\��]})Fm����4~��2\~-U
�3�m�ɞ�5��L��Y���E¨��K~
q2,�p?c$�u�9t�3��Ι9
��
2'a���vA�`�I%��[�t�3�����q�������5���)�J;�4w��ׇ��{1���0�Z�5��l�\��R��`rC�Y�I�
{H�|Y���2��`�
�}�\��
+OVߕ�L/�Tg-�������VY�'u�:�U�}i��
�.����L�.��0�
p�m��!�H�yZ�%H;3 M-:Ṫ8��V�����
3"`��
�����R��t��pf���/8%�h(�Of[��+�-�%�������
j
�z����5�O�7��uЃ� ~f2c8�ɫ����q(-9ʅ,,��er��x�0�y[>��PG��鴈|X���֨Վ��}��l��v��46�J��=��S��zb�r ڹ��$��*� ��v��C��Z����p�/je��sV�v>�^V�D�b�2K��ńM�S�B��Ɯa���x$��m������S�b4�$�Cw�f�e����њ��X��b��@8
+:���imڤ�K
+F�+��xb��`��w���[����b��7���h����].9 � ��O��"2j�e'
�Vo��Q0�6�M�.wq-� )�%O��>n��o���F.T+<����y� ���K��@R3H�;�X85A�ǻRtTQU0���?�i}S�L����UV�:��e-Q�Q�0�&I��%]{
+P���
+��V
*���W�� hvdV���O.�� �����(&�>T�ͪgI⋵m���]�> ��fg
endstream
endobj
27 0 obj
22447
endobj
28 0 obj
<< /Filter [ /FlateDecode ] /Length 29 0 R >>
stream
+H�l�K�(� E�z���?�� O-K�y�SDf�[�ׯ�U8\�]���G��?�\�zU����Jg�:<�
z�R-��MG3��c�Peh��b=Q�AqQ�K��-H�n������ �����Ź<�����W ���b|��B<�y[\w_�(L��,Gi��`�c�@'�y��Z��wS��#b�/�K7}�
+���E�yH���;$`B�N|���edu5�V� 2��O�u�
+T�ŨT"K"E at mq!}" @��0��A9*sl��H��a�X,�R�[�� uɥ[����}3�~r3+l~=S9Z�^��t�fQ�OQ�� ��d��9K�h;�KD^V�'�Rg�^,T���⾰-�
���#��
��2|ґը�`F-��)@=v�����H�����_��%����e�����������}�wKo �3r)�"-��pެ�RGd(
pA/&�gTQ�}���!�e͝�uEs�r
A��2����%���1
{q�w�qMT?�q�>�
�
+
�%��[l~䵘\Q�JZ�ق�Y,�g�agai?]ai��
���Y���z�p�19!2X�j�"��\�'鈭����Ԉ���%�h�-�o�X�Ź"��b�K��]�kQc X>\
+ZXGN
�P����l
���?��H�<h�MG��&�F\Q�����o�e� ���i���W��!��OP7�>��R��T�(�@cA`K�Pn���2�֍|�DB%�#7���?�/�2��&`ƪ��Ok��L���C֗�}E�LFB}4i.���L��)���7s��o��S��I�
/�2e�ä�6����e�7T4d ��բ���qλ ����90��?�:���L�bЇk���97\P(�P�j֦�a� �;��<�M���<�ʸ���V';��PY� �Q�U�=mQ�
��d�
�6����KM%ꦗ�_M%
�T��c]��?��EC҆Ru�-�B{��Q6#��A��jY�c��d��>
�8�ߺ[��ܞ
�F�6!�\!w|MQ�D��k�+���KY6�m
^
$d�r)�q��,�A.�к�$
��ў�����Cg�5 �
����_ӻu��O�Պ�y��W�($�
+1X���1{UN<`��ИG�[{3q�Ŧ���+�%
C�46��7 �W�e���ښ&�(4DS
���&ѐ&�_�Tl$�\��/���L�$�H�|�AR�Ӂ6r�A���z���oQ�>}8�p
+�Ε���H�U.uYC���}�q�Z#:�j��m\U�@�L�\Q� �\Ϟ�:O�"sK��P
+�}qeZ;��0%3��R�,�D���F�խ<�2��A�
+�o>���1��
\�����#��[���T�Ө6h��S��P⾲d�I�9��,�qJ��||��4GF�w|3�ys��)�:��;���@M��cS�*u�,^�K�(�n��(M��W�o�c�i$�O:�V������-[ђ�N霞e�,��P�+�ݪ�raU�Fӫ�f�
N�W���5�Iv�
��k�A���J0��e�.��6�N�V�xM�
��
+d����;�R��q�G$�u�D��I9��'
s����{k����eRz��I+�~����
%�:�.�H�o
�
+6��,�&'7�
��G���Z�Ylm|�G�L�
�_��
ZY at C������-[�&�.��xy���j�|�Xx�=;J́U?D�m{��Ѫ�w���r|l-n
���G~�Z���eq|��|C�����]��-(�S��ͬ�$ vi�M������D��H�f���Md�h n;>8��ѹ��`�@,��Q�}�8��?=�ܗ��H��aL�
����~
����5��O �-��]
���P��\�'����D
o���A��֜�b�3~�^��H�~�H��$��1Y���3�%ߢ���N
+m�� i]���3����䳸|�w�l�t�_��I7rg�zD{�=��(�Hپ/�p#z��&S.��YE�E��KJ�>e�L
�^#\o ��3d^"�3h��nJ� \ϻ���݁V���L�
Q:���Qd�FU�8�X���j9�5R`��{@�d�kQT������ 6�I'l��A�E-�t}�F��d�E�C (Vi]Ґ��b�XJ�U�w��#3��`��5���R �de*s�DŽG�R�N ��2�vow��N�3g�d@��y|LR�B\W`ؓ��?T�A"Q�Ծ't}��=c�OA���GjNK)W�3��f\pz�1j&ҭLE�Ne����~�P�˯C�/�z� i7r3��$T�2���0Rwx�*�m�Π{��A�dT:Х�Yc�`m/�����1�G
G��d�2ߠ�q{��$
� �i������雿���L:�i����ä���9
+](��8^��l@�5��|�&��M�ZL݄��p=��+U��G�1z;-�" �{
[�C`����B��%N
���t����ڏd��E�v��P���ӎS��l����Z��ն[ՑD�-��/Hv4��_f�| ̠ �E2�q�mD� �����ݻ���
�{�v�Z��J
�Z%k[)Q0B>�4��Y�ShED��IxFe���h7�N���$TZ�Va�f��g�eY
��
+�*�j����8�*�b��eQu�U�D{%�?�kf���J
�Ek3W�2�+��>�ft2 ˼H!WcU<+��b室;F���r!5D]Jݸ��e+���ف����'���x5ٷ�L$�8�N(�*x�u�î�
U��6���qf��]ȸkƘ��X�Jj��(ԜJ]��QSUO��
�H"�䛥�
)�����K
+]�2\m�T
+)�����`�&�Q͕�/Q�m�gT���
q�"ZWsQ�BL!��$�B�8�[�
�SH�Y at hx/�ʸOk� ��<KC�,W�S� (��MhT�7M@�+�KsB�v��]ιt��}[�MC��e� "
�ċ��p�gI\7��U&v��Go�
�;���]�ޜz���9x����hz������������/O>\�\�<�������b��/�����R��A�6o6T����ϋ�A����/�����w�==?
c���%|8�<�W+��WRN���x���rv���}_FL����E����Y�'u�Z|�(�J�Ίi�����}ti
��� JC
+35��[!啛 �M֞
�,r��R�Ս��V0)��Iu<.�l�U�7 t���OF@X�C�gfZ���
�,' �&f�� i�֠U4LI�Լv F��"�<�Zigߦ
.�T�$� ���=7.i.+��.�~�
�'��EIw�~rr���_���;'�e��lt�7��+
j�:�
s��v�`��XPh.��^����Ǒ+ �
�%I�$[/���l��mc
R�����!�i�(���
H�)
+cO<@=HUi�k
��ř$#t��_��f�k-~|t�L��?�\�~�~w��8�|uS���.�zy���҄�m�ysp���|w�9��YmK4�0
+<
��H����郌�iuײjz��� �yrӋ����t"ܾ���މ��$u�x�^�fG�2��E?{�� ��b��4/A��ƙ�㹄Q��Z��
�ܮo6�+e��'�n�C�鴻��x{s1�I�g����\�bq�"�R�і��
�E�&��
2�m�R�rV�yĔ��R��x���=
��u3M��tXuilW�Z",M]�7Ph/_<M��K�4�RՀ�ּ�M��>��a}u��(���x�*��QF1
+Fi,
y��C3
�46��y|�ۓ]�si����͞�������q
R�ծLyJG�fpR�b�k�L����A���Kcgm��t����z5K�崤�a��N�0�!�����4tE�����x>;au���ҝӃqKw��c���rCZ�B�{��`ts�s`��G��|(Wh������j���úh��f!�a�E�a��$�h/r�
+�H�[��{B{s��״(��PI} ��*K��J�A�ے�wF+�\߆9�0��i��EG�
�ț��]ӱ�z˸V��ऒ��
]hڸ�X���yi�����1��� �
9��SL茣���R�
�U�V`Ȋ����M�����7�s_.�`oE��P5VHLA�̛A�?K�1ȁ��0���3u,j
'@��>c���YŭJ#�3nfc���*�Rc�5]�ӣ�k�����@�%�NQ��c���6.d1N��
*\8���
ؘǸI�=���#(y����i0�c0�3,<��rbR����̓X�5�K���
S�lZ�� [8�z�Y���\u��+�\���e��D�� A�ݮz�8��Sف(��(guXy /%��
+�c5�m��em�j��1�Ry��{g���`Q���D�X�|3t2 "�$����謐|��]_ٶ#���6k*Ʈ�R�����=Xъ��:��<�:�t�L.M"�`�C^�X��z݁���@\�[T�6�0���]cc�#Ռ�Kc��I����Cf\(6rdh��sy�;�=o���}>�P��8C���Fp�"���
�ϱu:W��K���^ci1ͭ�z Ij=�/��a\@e�t4�K�7��i� ��t
ZdQ���P���@9�/���2 ����Mz�����4�
%1�u �F�=$Zc�c�f�i��FpWgTZ�#��\��9����tF�^�J
l�H{|�K(�]c!��d�=�
���d����4s��6|y�
��@�|������&O�G�������#:��n.^?\����8�|uS��W�����#:�1}�~�
�o�7j��Ύ2�C[�(�#d ]��F�߷��@���o�@�=�O �<�����oj����0�X�$e���T!e
�8�TZ%LzY3�#9�<���Q�7�A��6̎ϥ��3:�y�*��>���j��b�9
2x�
+X|
+��\�z�Rn��
ZS�f��9�`MȾ��#M����Hn8�x]V�]XFa����-kT�ry
�B���٦�eI@}[����淡묏_��9��;�
�4=��`�Nw�i�Pq
l[8�;�]v�.
�
a ~*/�{s�R
���$C�y
+&�O,�C��.�k�k����A���i��܁d��z0��Ve��A��1
+��NfG���%g�
�4|����ء₀F.��B�0�*�##���
+�Ŷ
+�����������
`yW����37`q���\Fl��5�
R��I���M��>����8�a��]c�D���������j�����%�]��/�l#@Q ��u�
W�k�AU
+���pH�p�U�4�. �t�ˏCr�s
n��O����V
����FX��A$Ჭ�$�
,�
��Sw���xl����
Km��q� ����1f
(��yXb��24"@��c��fV_,�me�h/ �-&c��q3֊Lɥ3��
(!T,2��7:��=�l�.j�b�i�
Ą2B���{��<(2�2>D�d�Q3�
�ϗʴe���J��G )��=�8NiB]_0a��[�t:3ۏc��Lʠ���a鳐��X����0
�+.�:)9F>9d��C�l��:CX8|<�
G���JJG4e�)p�@<"��醡]
�һ�T��k�[�����m3n��8��G�b�����n
��ٵ["�p�y²�
V.rf�g1
ӹZ
��
q�QHE�Iv�����)�8�_�'�h�l�`�� ��Pig�b��cB$V�ɀg�y-�W�
���\L��Y<����~;��թ����[�,��980p')��p4ŏ�q?�Z^��b�����Z L�''��l�Y���f]��=
�G3
f���Z{DJ��{kS��� ���f]��J��^"�!>A�Z�K�c]���$��L~ݫ���_�N?�ܞ�^����}�P�F��%h)�Q��E-���Ԩ���+D*��w* ʘ#T㻹��8&�]��2�� ���$��R�!K�=�^���ӕ>�:W������~��G���tJO7W b���^4:(���s����s;6����TZ�C;0
��'��Hl(����ۃ�W6��A?��L�
�竇�1;���z�B[2 ������+Rk9��\��x�,~uy{����ݛ�_�~:������������
~�
������߾�{����N�6�I��?}�Q�˫�{��������
�p���_��O��
Ս�<��_EFu�����{>��d&���?��K�)/u���C
+nL�^ԫPsL;�����+MZ�
�aL���&N�_�����0T+jc��g
�e��k}�[���&ڱ����t�����a�_o��4���3
>w|�
��)��9֕�%S�V�T�w��X�Ty�5C�!H~p������ �t�a�Gb� ��@u�/
��Ū-���
>���`��-
�e�=�Go�Wn!|Ż�ړ�ga�w��K��pIe�u�k�M%�$'�ԃ�
(��r583�X�IM鴰F�/�Ŷ�$�j8Y���A�l�@����4�
4����¶���.��S�y
�zʒ�Vq�4�9Qf�y屵8�rg��N %�h483h�0)��A���cX�^�*���y
+�T�-%�
�����5�._7��b0� x�5G;��Lf
ɤ��hbzM&]l$�c�d&
�h
ϐd��d`V
�x�PD�
�9rtF�W��a<��E{R"Pp�Y7
,��*����¶ l�]>ͱ�S�y�hU�
�_�M�4R�@1
+�d���G���Y��8��f��0m([�i@�Ku���r�y��
��Ւ�4B��Z7��H���5���W���:�Yy���ƅ
y�"�hT�<�RF��T<E���
��������DѨ�S�
+�#C����7_�!%%�#��;H(W��ր[
_/��h�y8�rl�A���k�"SNM2C������&����)=�"S�sI� �*
Es9q�Ё�1���ݴ)%%�hk��c%���[�p
��+��֜�<
3�cE�c) zHSIK��-�RYZ��zUTq
�+g���ffA����^��ҹq���!�y��WL��{�l��x6^^-h#0��v�5�:K�!����4�|D�Ӆ7i�.�rsG�<bV��^�0�ԇ,���q����58�<�r�E��ڵ'%%��QBߍ�Rvawk�-�����[s��<�dvZ-B���}P"tr�ԼxV����Lf�=�7o�
�C�.r�R��u�+
��ln����K�AAI����g�2�V�1�ݭ�n^n����0��Y�Δ��2)e�+��
�q�@��p@{nˆ-�\�N�
+J�PNA7���#�7���C�KG`˚����+��Dž�CPP�9�5��d��Y~N�^�V������.a��`\�����L�/|QN�����/_~��͉�t���h�LϾ����B�λ��sOƫ>u�n{������}� ���O�������͛{����W)*y�=g�ݏR���S���~���u��.Мw�6i@�Z�Nn��W'�e*����)�~Њ-DZ��\�0�9͉ ����#�@3�b���%XsэOcRdL`?
SG�@���`������"��xP�+�
��s`�
,J�f5GVkm
�/ы_�&a�C����Cfd�
��qF�2�2]�+b�{�$�:�q��U=�W�*��eq�AH�8�,#���xm#>q���F��+����y&��僂<�h,*��(
���b9�)R�r
R �
+ãIB��.>
+����]b�
~i�Ȳ�А4蠞Q �2�mϨʕ�d�ad��.���s*fӦ'�F`|�Pj�4��N�����
ij�w���i�&k^� � ����Z��=" u�Q�:k�ct�j�4y�=�>25O
�E�;�s��/�O�'����50$Z�%���{`pt���]��E/�k ӣ��N?�"�h�
��Jy�k9q9��A�t���s�� =�Ú`�j$!�Lٙ9V��3*Icb<�Q��w鉊&��S5�J��.��S�
ă��*$"��LX,I���{�V�\��s:_Sdd��zqh���Ёy_���K<q\YV2���،7ϭ�p��㚳0z�����U�K������oDRjA�|Q�����TI�c���`
1LI�+����q�Pf�����̅�l T�?lWK�^��
�?|������w-�!�B Ɠ1!gl�Cd'
a��sN=�~3i�շ���<d4�F"'�����Z�P�l��&Я�cK�FO���ӓ�E �5-,�*��ea�>�
�%{�w�ԥ����F$�&l�\��gb��mMq���|k�b�
+
A�A�-
}Ԡ����S��K� �l�L�3�<!j ��{�~��z�6�=;?��T�c��n+J�_=CLa�33-����W�Z]}��*�@
F��x�;�k���wX�4l��w�
U�6���N�ٝ
M+��(�eEw���c�]�����w��!i���x�, >��<��O�ӓ�<4���TO�_�X�' ��D
$2#�ʅ��V@��e�[��U��$��-x%�U���|�Z]Z�����Z��8wu��-_HY���:�y����XQù�F65&�0��[^�q�j����̞;Ȭ1$y �ݯ!�ō��m��Sd��I������2��-�W�\&>iL��MÈ�BUo2#����2���
{���
��@ ��p(.Ns��>e@�x{�h�p�+nC�_���t
�y`�!�|H
��s/p���Ә
���x�,�;gM����U3�Al�:�W�� �3]Bk�aKC�S;x�~$^`$��� ~�HU�Kv�:O+Fat��'�9���
?�������2�������7o��Of����(�ÅA��Q
�@vwORHISb
+��q
�c�W��s���ٖ.q��h'HJY�
$x�T1�*#��A�n��W����D��+qӯ̚mE���^=@>
7���A�I>�W�Ů."�h�i�r���(�y��4Y%�~��Զ�����TO����8чe���g�x��
+2+���u%
�Ңu30�����n{��A䙗��4T��J�@T�`ȴ��{`�"
NqX���с~�[�ϔ�gg�(���U��MC�
��l$f>U�AL�8ie�+ Au���
W �L�m,�T��)o����@֎�F��C ��TA�Ff��u-B"w��C158(d`z&���2,s�%H
#�
8d�!īkM
/F��vŹN�k0
�T�?��+~�V��~��Nn������aP0
Y�j�/EЍ�e��
�~��/�v��n�]Eyq�|
Vp�g��+���\"���K���d"����A��g�W����%�
d�wS�K
+��{�HZ�[��ne���)���gsFA�<��6��p�1.0.ő���/�M�_���%Hp�
_����+ZnHs� O��q��w��ia�>y����-=
�*��E��?�a+�[��H�b�a����I
�q��oq�0��
����D��:\��4�VCF���pJ<t��r+u�Z��{��%vv^%h�5��l�ItQ�M�v}��x��b:��fi��W�
�� .
ǝ���M]����q�f��
+�y���j���a�P{b҃Ͼ��0��7ث�
��ƕL��t��Ʊ^��Ao_|y{��ûW?�������?}�����3������J苯��ǟ��K4��=�x����LJ���?�����ͻXGe�7#�8�^m[o���Ͽ�?����o������=�}����
߇lg-���S��<+A�y�p�61�,����XL�'�Mi;��J���tI
�Qg d�3$- ��-�ҞD�[�0fc:�0O �;KM{�:a%,Oo����\�.�q �Xs2���e�%y���;�
�.��K�.�-,��*缾-�37vВ�R�>g��ɥ�g�^T�ϰ�+���l.7ں����� P<�1�ժ�7��9|��x�!һ�k
o�Z
��+��dS8�<'h_+:�v��}��`V
+��za^,����_�n���#�;iC4bA:Rl�[x�
+ǥ[�UJX�Z��1�8q��;�Y�_'f��D^SlUJ�ky0�a���Hr:�I#�(I|
֣:��1�
F�۱�x�`[�P�KiG��5\.p9�:4���b���$�w
�_u�3�k��^�0�#y�� >e�c�x�>{p1����`��ER
�k�A�ߤ� �\,��k���*�9�/J�
��¹�X��Kx+����(�x]
FwkB1ƕ�H���/q|��3P>Z�q��;CWӻgbZ�n>qc��mx�C�v"x�D��{�p0�
�E�
+Y�b��/��a���:SC�h�3�#C� �i;��(3Mns�-��*��Y��2�QrVG`���G�Tq|�/�l�1
W�gRPD4�U�&5��ul1~��l�rY���x/t�
���|1W~��
+�1�6�A�y�
Һ��s`��rJY{`x����dl
�َ'A���*Ѥ�r�I�̘ jD� R�������ؔ]QZ�m�D����cZ���f��f�/%�W�@�ЦN"IU)R%������MS��#��
�KV�7@�
�k�%�Xv`��^��Xa5�����tV��0F�Ŧ����=�akY��̤��
+�Ⱥv -w��=w(�E�u
Y�#&|���qM��{.~�������
+C&��M�� dfBԋ�U6�aɌ�,�V��� V
+���GK$!�-D_�K�t:�s�2���<e/�y_� ��49 �����$R�ۚ���Я��0@�栨}�S�F'��t�����J2l�J���zi���Q���A!���9�n��E-���a�5?��Zn�?m
+x"t��X��ly�Q�3��y���3L�l
�-� llk���o��>X�: 5n����֎@�P���n���z57�!�!n�������Fc���������7fk1
�G���|0��hx�N�Y����C�t� ��*f)7�����'RR+d���y��V��"�} ��| $ LwW?��SfAE�ŀHw�1c��{ת���2�� ��S�O���X��1�&}����yM�0h�zd��N
�xZ�%#�r0��g��)��e��0C�1���&��@*0����2����k�0��#&
��%���b�uT�vf�z��(n�~�Y��A�
m�S=M~v�aQ��}Fק���~ˉ�u��!y�,�䫚����z�bM���� M��c���m�Q���+��
3����S�ՠ�p�TZ�
��f
��[2�ΝRO��tZ��;P�ww��f���x���X���w����o��)�Z;kP(�N:moh_8HL�zt�2XFTK�*
pP��<\�2��&Fdi�{p�UG�sD�]T�F�x�3+�$Z�}f'7�u���&V�ni�z�
V
qV�A`߈}@"�V9�����h����ɖ���O�b���;�#y�~�eWD�#8|ĆAߊ
2s'�A���y���(�G?�H:cBf0܂�5������܀
���]���ݍ�x��u��U�dz� t �<΅jTW
��n=A���
S�5�ou�
�Є(��8�q��s����jX���}��j��~�������&�
�u����W4�f���ސ!�JQ�+�2]����xPV;<
i+C0|5�:\25ؠ���� ����g��>
+
��gA�/�z*�6�<uc
�;,h֓��qL���0gw �,�r��#U��Rbj� n�}�L�=��
�3E
��z�IM�
��k�,��_�~�\$;pA@�@G��:�S
ι,�x��t<Ҥ\d�:���*T�e�ܠ��Cd���
+��<����$�~(�.�v�ur�#�ꁴt'sx��ׇ[jX�]��|8���A
r� ֥Y0-0W�^K����t^�e#�r� z�)h�tmu8|��b:��Bi;5���cxD���bއ�Kw��>
P�S
+[���&c�&��F�2vƟ+dh^J}� ���i#�
n7�����s
�+�(
hb���OV�JF���V8el��ϗn�
��:�,
���f��Vb�e��=���ՕϚ5se��'�!�'.A��µ���S�`F��=q���������@6�m�-�j�m8:��5a��D��/S���)lM�;��ap�
�,�x�)�
�J�H(������
��-��R��'�$�7 Ir���`Y�>��J���Z��J6=�]
�\�@����w��9�)E���|����OF�ڀA�K�iW�'�D?D�r�w���e6Qk�X at I��/��=�#�:��fs��uI`P�L���F^�s@�a3ߨ�D�a
e���L�ưe�Ȁ?L냡{(��b�G��Ul��q���wr4ʻ�S�+jIYЀg
���Y%
� (!�io���>��rS�O
+��́�o�T��`�X�9�pq��3�i��I�
�v�?uz]3���`:��5�����%EZ�V
��[.ܧ�C�D[�NCϦ�M�qB�qx9�;-��q3��g�.�R,�����)��)���.hR�P��d@�
+Lj+Rb�1"����X��|�a<����|���ǯ�>||���_�t�9�Ͼx~�����~��۳o�{����x������_}���3;�{���S���/,��&�����q))���Wl1ݗ�l�|�B�{�n��%^h1�� ve:���z�BM�
+��t9G� ���"�4�&H�n6�Q���C��&�2��3�:c�A0����a{�a�m�A҉��uH;Lk�`t�#5�;����;ju��-FJd� M�?���#�w��I��I���`��Z�} ce�>Y�z�:����`Kq=4�iAoed�
�x�[���eE�%�Y�mRH��j1��2*���y=�9ʁ�s�����ڥ�h����
+�㣹D
9d���?�'A����U�X�嚙�Y���(�guK�0k�iهSӀ
n�e��l?�
7���cC��X2Sk�K�
��R�ԗ�J�jփ:3�Wj�b@^���!�im��"�Y p���>?Z�e�hJw5dž�� �nEG���,�%�mf��Z(R��[GK���
!�
W��c�=���ȶ���/.g�@��$��da�C<aD$e���k4=��k���*�Xc�J�H��V��5��l:�M��
�؛P����DY�;E
��3���s��#
�oϞ�^���g����䏗?>��'��;|�o�_���{���~����؏�~����)�o���ׇ���@�W
�+�
��e����nIx� �W�+�7!ȶ�ˢ
+Ɣ�չ�
@�Ou���ۡ�~i�]N
�A��
R���
�R�
AȄ��M� ��<��+�5���@j�q��"�-+U�
�����fȘ#�����뾑�����T�
+ɔ ��1GJ����Tg$m�g
�
Q�ޚ*�i���b62�ä�Fˎõ�a6)�wam�VlJ�>6
/{��l�e�kd�!'>yph��yZ5�`q{���kf�� �u1��j���9g���k�˳��
�JCS_�虠�S�����A�@�`� �&�`O���FWj Q ��(�bԐ����\��5��i� �q����D��cL��)O�,�#��@a48��E@Ν�����`n�N�H?wLm
-�t+Xc��О
۪�5(�P��ar�i� 8|��t�5�
ߟ�8NJ�4{M`P���X�K��lj+y� ]�&FF�+�VWHXm�� +��V�N)��[���v+br�㘺����(٭!�'�X�t at N@,=/ T���!�P�n�I�ZER�,� �Xi9���=[
�����|
�
�dp���M?�qciā�;c�#؇WƂ.����Ƞ��T�;C�Yص�oQB)�~gB�����.�!B�^�#@HY{��k�G��r2=4
I�*d��0��Z�0gJz;Ż~:]w�
+�c�r����s���#�[�
+�yV��^��E��mHx��S�����{}�RY��ֈ�q /?��&��ʣp�'������X�zU�<T�z,�v0��Bi�(
d K����}L&��[�2�$�g�;�,m
�ڢg����;�˦e��5s������P���Ͻ
��d!ﮒ�YF�83V��+)4�}�c�e����<��ɱ�b"�9��|W�
�슪Q�OMok���p(�:|���z��ݣe�[�
�'�/��u��Gϟ!���~PŞ/?�UI�q��+?҆���-*,I�s��m�E�m��Y�Й݉��ݴ�d�+B������/4.�m�2V�CS�1�iO�[�O��uf�)m%X�@ULK��cڇ���gH�|/ڪߒ��;;{=��Vah�GQN_����2�����&���T
G}����a�
��{����)EJ�,IZ�i�dF:�4G����=��Ӳ*����es��t�0�>jz���-��r���}�
��B�{�~���m\�����g�Z?3�F_'�媞�\������"ŦP�b [...]
+:��c��
+o�<��(D�2_i��^`t����у9Ol�o�p\]G
_��"�b��h��؛�lE� �l�8�x�e���U,��[�]|h ��c
t�Q
+����o[F��{˹��Lw=
+�Y������vo�,��h���
פ�}k�`&p��l�gw�Np)�_�R�&�<��4�E؉fE��Sf����!O�L� ��j�(
4T�t�3�"�b�؟�����-G�w8�S���7�i���W�v3 �Ql]`��A�� U,y�#y��<ū
��=�l�� $d����ϰ�\A��[9�{Z��^dz��p��e$Ƒ�M�"��ޏ�DUga3�'}�
+��'ZL�K�<��@of��0��[�a����G\�5*�k�J�"k��%��pI��O6�/ �+���S�����'��2+��|n
�"\���j�˂"�����Q�$U�:j;O*�f��h�V��Cz���E�u�
���4-Pd�,^d�oH
�vw;����!�"��Nq�s-����x�<�>!��� s�
+���=nXJ�;�@��8I5�s?��b�X5�a�����S��X3�"Ӫ��T�\\:�묕����&�Z 1�f^O
+Ϫ��B/nH�*JY?�!7IeQ�u_���g����np9)W���gق���A�9̜�/�M�l6ʫ6��H
8�Oꡋ3�ةY�2��c+����;���:y�v?�NgP����3�w !���ط@�fPL��w�2�UQC}b��B�2�dk?L3���v:���#
|�@�ʯ/��Y��>��/F�ͪ}��ɢ����{6۰ɕZ�-wbB�U8��,=\Xjv�{.n�����$u�sI}�s73����n���A�x��S���(.m�
X�V9�i��Wv
S�WY���
�G*J��E�hZ��� ~,q֑]5�P8�������E ���ˍ���
���y.O����v<"k;&9
+��
+��8��UJ$ي�7X��ck�;���h`�I�a����l�������v����!�n
ٯ�����JJ\�b�s�����!�nQjLE?:b8���Y�
+���t�l}�;-/����;38�VH�
t�e|�hj�\�o��U)�y�N��s��r
����v�橫1u�'��h,7�����Z��_L�Tޜ�Sx�qq�eP�;%�s�(�^�8�X�!=�$h��/���}�N
�����:�\7S��3
+I!Dţ��3��R���ȵ�u�V<��^�$��6緇
N�
)2�/��q�v��6�3<��ұ���h7s�#k��-ps�����t�
����D �!Ae�,�3
=!8j)���ųO�$k?�ʋV�2{v0J7�a��HǪ��}qV�;�'X�l�����nI�Ε�1��W5�oL\���V��u(�fE#��*J��»��ͦ����T�'�$'§�J�Р��Y�����~���hJ��\E:8�ɫ8ų�e�.k���T�
+��#u�I��ܐٌ/n
�Y�l�,+�e=Luo���Q�$j�c�Y!#�#h��p9�ƣH��Q��$��"KX�r���D���R/ I;�h����X0d
�g5���x�[�&W��c��FV�
�����$�4%�u��P�6��F�4Z`!���T�@�
�eq��h���C�v�w�H������z�\�N
(j
+�[�n�j�@�]��S'u�a�(Ֆ��"�a)�q���Y ���T)� 7
��\�R��K� �ߴr~-X
GU�
���
+
α����G�c���}��7%�����"�S at z)Y�}���c����c�ˌ�����y�꼽L�A���RB[
*C�|�n2BN�V.���q����F�Ȭ��'�rt4��gw�V�z�5U;ZR�4�H��Мmɋj�{��f׆N��o�0��R(�Q�t�����
�]a���K��rR
�rWM
��9�Ҽ�Y}ZI��S1d�l���
%�M�q�cz`)���'�]�ǃI���V ��
��
���ؘ�1>�x�rUP�2A��Go>�������?_�|�����v7�Vܡ�g�s8ًI������ѳ*�� ���]���ʧ�)��!��Z-K�MG+i�������t�ԨKѐ�D&7�
��.qC\�Q�?���c��tf
+I�I�y{�yι�9�}]��Q
LjAl�
��J�Bp�lT#�I��;U����Ś(i���K@�H"s�-Ⱦ����;�ܽ��5�ܽR����U8-�<~
�)\�������ȣ�
�sU� ���<BWe��;&9�d�f��Av��|
iR��HL�x�v�3�oe~5$�%(,SNKُqJh���r��|R�5���( hD�����?<w���'/�>n����������×/�>�\7sxi����gϝzz��ҁ}�ݗx�����ƕ
�:���1�:22
����_M�}j4����n��hjf����
���<�fy0�~�i��
ڒ��暽��}&��=�����t���_�~}�z����^����}��~�=��>�D����B�D�
�>&���$��{�ީHR�P���&��~��@�j�o���wx�v�s���! Q����Ԃ��^6�ˮ������E�.j���^(C��~0[9�zch�dL.�B>B~�^�<�
��AS7�seT�T
/ĽZ��a�ĭ4�M�15
��F8��ݤ�-(�#n�.!3,=�nhf��/<2�x*����%(�;r�J9vʜeV
+�A h�h�4�s�H,��`�T���hR��=�'�mar��~l ���H~��
��������F�'q�%���Ti]qV94 �̾K�c��/a
�Y)�پ^1�,�Vs� j�k��g@��z��m4�Y(��%7�ľ���l?�d� z���P�I�V�fRG���f݁-|���dʻII���r\p��A�
8(�����뀻�� ����ܞ!��y0��FV>B��������Fq�X�����%JH1�t؞�
�8`�ci�UJRo�
��%�$�qG�%�=��λC�� F14�/kk<AU�9��ߑ�{p�IV�c�f�o�d
&�N����M����m��������,F�
\�r�$���D���F&�cal%�q��� ��Jߛ�l�P�L�C�v6�?"
�2m� ������,V�\L�hZC�%g
ݹ �[�ћ@���f)�+�n�eg�ʡυJ���tc� ȋI�Re} ��� Ŋk��Wh<1��V2/�>���Wn�8�70h[R
j����VV$��K���9�NJ��P�mG �0|���)+b�ICix�/ژk��ĉ�q���U�:->쯸$�TձE
F��l�7&Fl����
������X�
l
n�
Ɓ�$g~�brQ!��2�6�q��O����fi�e�Y��^���6N�H2��ׇ��n��E|��B�8"i,�JTߤq�`7�p I�ӱ�Ig X��l�njs%�ϫ�
��m��q0���X^
+�8��x#%(�#�ܭ��
��10��n�dO<�,%�����@,���
���{�&д�$�Z%$c�`
��k;�@�
Odv(d�9�U9��pIl8f�
+��?4@�����2���"}��
�"f81|(5J��lai~��u�<r�Vݧk�B\BE����嫙�6ۑJ��VR
�Լ��Q�
+eKe�8�7�"م��n�ڿ�A�۾%�Sia�2�
�,�HQ�a� E��;XtcQ��R-^Gr�jk�D�:"�
š$VչZ�"��Rן!f��H$�D��X����t-�.�Ak��z�T�Pc^�"���}�S&+�,L���VѰFߙl��05�7�$�U�I�\�����\�$�5�4�jg�
+q�j�2I����NW�:��xH(�:�،=Q�.\1�
�z�rr�)���P<z��\�6A�AWu%v���c�dI��]BT/�
��bdUc+b����
+�K����*>q�R\y��
��BG����K�N��q
s�A�]�phe���6
�V]v-�>�聾CR�A�p$^�����MP�9�
+� �8�Ũ�SU�w�!p����9�a������DGR�*�Ac���V�Ft�ߛ�D*%���TI83�ܚΪ��0N,7*)��rZ��0^�)�Vn���~��~/Gȉl��qQ����V�m�F�J�
+��ڨ(e}�I`���k|���I��/a�D{�8#^��$���[`���֦��K��<2���l7t4ud4=w���_9w��'ΟMI����N�k���K��gN.-���͝<�x���h�ts�1��h���n�E����
+�e��#�,g��o �_��=�o�#�b���cϚ��{����D[Fb�v8{M��7�t�F��v"8��ǂ�>�����'%�fX�I*<
�U_m,��}�M��N<�s�8,F7_
���>�<�v�ǟ�x���$��
����ޛ��*/��V�#�ō|k��
���?}f���Y��¥ˋ�5�4쫣�cz��V0x�=ہ���t�K7
B!&������?
O��./<�ec�?0��Ϟ�g��k���s�l��l �I �7��1����b��bX' ��XW ��� �c� w1L�a#�}`���¸�aի��� 6x���
P� ��0���06 ��0V|��bX�SZ�!�-��
���U̫��O ��'_ ���g��_o �*w1�Y��X5�O
�I`���$�O��V����U��f����I L��q k�v � ��p�0�
+��a�-�[��
�Of���4�lƳi�g��m�Ѷ���m�t)�;�mYy�gv�]z饥�_��J ��:��?�����W�y��G���{���_^��m�c��/��χ���o����+����o����w_?��� ni,0����&�������ߓ�
gv쵿��ooNpf��ܿ��o�q~��w�i�=
}����� �'q��מ����Ύ'~���>t�$c7o��߽��
+�c�{��_�rp�=[�Y6�>x��/�}�;�y`���l�����}����y�k�s�l�|��?�����������I"㻻!H�XP��u����qܯ�6
[ڦI�N�5�I
+Z3���j�k�6�)Q�N���fm��M�Q��ݡ(
+�}�=�y���<w1�R�k�z������\0��gg��?
��5
;�����E�'��YںGF/��do�j�
�t�/R�B#��Su:�Y<����|��զ�Ռ����訥#�P��ۼ�OoE��
xٚ��1�� e)ⵙO�̕�Bh
�;O
�$c�
i#��f�Oo���R�t:����ʉBL�h����7��f4n:�.�a}�e�
����
H�I����k���Ͼ䣮�� Fg�{
mh:�gu����
+/���N``qy;rh��\,��?Y��:S�
ܕݖ��������W����Q�@V�W7K��0�W#:7�����ih�����/�%��D�ɀ
>� n��|��#Z�8�v�P}|��V?j��WO���UWqeȱ1a��Lq�ejtE�?��.6���檓SCd@��%ey���h�����1�lUb$����p���~��~����X!?��Aͧ=�m���
Nn-C���
�=�䆤�mhl�P�?h�%�_� B����Ȓ��u;V�����
�u;�&���pcI%>p�C����b<��nuwMɅ�D�s����ߥ�r<�V��yI�8�] �~Xz_���䊛�i�����X&Bq9�ͼ���:k�F�Sg��@���Z�֪�W��\͚t���w:{gƃcsc�Y�����}�m���
�ݝ�͗�G���n�ڡ�#vC��1� n��>��� ��?��� )�<OL�f��ɲ
�3<M
+4�q�$G
��3��8+�4E��� %e�%��J�7r
��8Et?������|���iM
ϑ,��:�x�.���i �5Ɍ�@�"���@�
C�Bw���и�Ȑ��� 6�4�
endstream
endobj
29 0 obj
20725
endobj
30 0 obj
<< /Filter [ /FlateDecode ] /Length 31 0 R >>
stream
+H��W�o���.@��^[�"��Zr7A
X~$���\�
c%Rc�(*>�C����"��-�N�F�D������㷖I��[�k1�4\Ʃ�LK�ƙc�^�2Kg�iٶ�4�9�
]ө�H����(��z�5�[��,s5�������[���Z�n��*�dk�
V3ʘ�ڎA��T�9E��1n�N\���i"��(��,�u5�릲�Lוb���n`!��'.��^Y�U"fޚ����a��2\{Vm�X��LGwX&k3ws��tC �\
+2]��9�V:գ��q���4�#�<����эN�QJj��Nz�pO"��b�a��u�
+���W�bj���,؆f9&�
�n[��6���K���T�V'ן���G7�Q���R�X��
�P��@p�s�4�(E͒�ڐ�R
�]w�q8D�� �1���G�\�B%�d����\��1��ZH�f2H�{e�b�N-.8EE�yō�"�H�L���J�E�m�R�a�:�þK�
�t�E�i��g�X���S͢�]�V��[ݪ�ܩrUN�^�G7��U^V���e���T5H�S�����E��%r�U+��2?B#o�"��0�ƨ�����͇8j'A��m���[�m�9�ʇ��1�k����~�{i�R;��OZ�d< �E$n��\&���71�➈0
n1�L�c
�Mb�QJ�0��5�u�����"%�HQ85���&²�ҵ|��/جܤ �t)�7/�zn{.��4�p��ҕ˶ �� ����L8�^ G;�HJrJׂ��PD�����K����b�O�����/�;�I�:�(�t�&�(������"
�ȶ����e����Hz�� {>��uJW��B郝땽���a�L)W;�$C��.�@ [...]
+� ����iP�C�m"@�,$Q�(��X[�
+�
+s�Tf��]S��xfks��P~PN���خ���
��g>1*=ɼ�(#0�\�4
��˔/
<d
+��ݩ�-e}��n8��C~�Jԧ����!,Þ��jm���@M<��ǦL��XsT�m�c�(;x&�8r
�X��q�I�9CUT���8�ɫ�N�E21�J�
�@�)G�ލ-O�9k
S��
��yx����ͨy�l0q��g��LA��
>�
T�Y��onc�S�/ ��j�%6�?���{KȔ���y��೮�z�k桧ӽ1���n_�?�=x�(��[e��.Ps�7a|#�[���*Y��J�.+}��$�Gu,Y�j
��U�d�p��l tM����Hv���qQx��x~K�U!���
^Ո��f)�
+�C��X��\��eaJ��[��9�i����
!��"ّ��9�u���֒k�z?�2v���
G�Y�[
Y���Y�"��Is>'�'�9�6
�}c��C��H��{��)��Ҏ�9
��%MՔS��<�t�0��]�q7ԎS����e1smj���(��U��Ak��?�V��F�}$��kt���s����+
n{�y�ǽ4��Oś'�p�h�<��ZA� "JD��kf2��/��D���˶٭%�#���c�a�i �Ƒ l��+�'
�+rQAXwY��w�&�R�����O_�v��=��N�*�䵇{�}�T+�6�_�����'�}�g�����$�
�f�7���I���V�G�N�J
����~��)4�6|�*aʗ�2Ʉ7{�
���I�
�K<F���,��3;�#o��
}D��~�y{���Ú�?��mQL�b�E�B�?�σ ����AZ�|$���x$a]F�$\�8�CD��Q�$��.%��An����q�a�]�j_D�kS�
���l�1�,�-r�bn������i-�l,���n�=���B�v���]lw�=1����,�v��=��p�g�u��;B&�}O���QJj�HE'��<k��\��srq��)����_X'����'�?���7���A��W�fc ��X>����ƿ����;="�B�`�bh�&ЀWF��!,��/�p��K��+��M�_2,� �~yZX��8�|��@ދ��bD$��t�z���pcyL���^0�$lܶ�
+
&>y�?΅�e��=��x�Ynk�����bi
�
j��r�#� ��݇u��5��M�5��H���914��n���nݢ�V�yF�j@�I<"������Tb��@3��BS;�����7?I%��Zx7��Y�n8I����4O$w�2E�G��ST�F"H
ݢ����I�D~2^��
{u��l
�i�M��v]���#�����w?N������)i�`_L�su��h�6�Sd�Ǫ�2
�a=�4�&�F�臼Si�A]�=��N
�RWs\fÏnqs�ek�w�&&w0�4
��)���Y������sv��l����L�l�����)����7��=$���
\�
��]Gw���6�U��D������$��w`�|T�
����{�l(ي�zXK���t�,
��W@�
�[R;
ƣP<�י1��V��F�qw
��TQ-�D�
x������v��*���B�L- �@��&��D��3�d�L`&s{:'�5C����k|LD4���p� ����_�Mm#I��U�PR�)�J�Fﺫ�*���l��I6�T�Kc[AH*i��_ό�ep`C����VO�>-���
+�ZS�n
���� w�a�Lʋ��r6�
��d^/av1�b���������f��zхӪ�$����C2KI��R���r��.��#��H����:��%mC��?$�5~X���b� �г>.���� 2��s �%���n�
3�
��
��$�|QhZ{��5�J��xg��'�]e
C�5C�?�?~<l��������\/s�\��HVtK]��hy�#�. ���{[��}cٶ�wL�!JE�
�S�w#�;/3m�L�
�Z�v��;X��3
�Y �d[(Ҭ
�*�k�8�NSB%(�y7j��S��a���%MSZ�x���SԼ迆4�8�?��<�� ��'<[~��a��Wt�
+T}���I%�I���$h����W�Qժ|o�7�G��|#�K��j7�m�>~�*G�{��M+
+�2��G܌�"�
+ �FWan뺘&~D}W��IB��{Ѓ�\���a�ňi�Q�$��V�xy����[g�� ��lU-,��b��N�
� �g ����~��s�
dj��K�;�+P��ʕ�ɘ&��:�U���LC�f��T��L�)�[V� ��9�a��k���DS�(�p N�p&�
�i
�k����O'_G��RC�6��~a���%���x�kU*Z1�eVDQ�E��FQv
���R�U��x���|��5S��>�����@�� cF C�$���q
�@@^�+����s�Z�B�=���J��ҟ'"Ք
P�"k��J�9
���0�4�Ø�O��צm� �gLO��P��7�X��w��h/�K�e�ٱ�0�!b
+*B)*/�~?�b�E��
��ǡe�9܉��G���&W�e)�_�5`�
+l���F�x_z�Ⱥ���SS,�nȺ ɚ�Z߶��=��t�
���Zw�=N �=�.�g�q}�]�^T�<���d� ̻=S<�o���~!�NNl�tx\�O�������ӛ��/m�=��O�3�z������e�c�������������Kw��E�~,��+�[���YJ}W��頏jO���-=/��4���K3
��>�NSB�20��/.�uk}C9�eI0?Xn])��Y�t0"ZPZ���xEg��%^H�t?�^��'id��'�R���]�����g��㭓��}o��;v2 ��#|������ft�
)��M$IzA�w�܇D
�>�^�˳��%�B�Ɨ�G�h%�$�h"�8t�M
+CR��0�I�2��Iw
��7/e9��Ȫ��𡙊-�S��f���h� շ9H�1lk���Zۼ�SA�<5T�`�!2İm>EsD~X��3�6���.k�nn�qnES*
pJ��
{���Y
����Ju
ՁZtT�����^n��I1X������P at j
.l��8�(!D:�S1(�FX���ت�c]\� 02q�4U�/F��-�D9gC�*8UC���qj��Qe�B�^/������H���I��ѠJ����2]Ӂ�5�;��k:#^n��q��1<��<�gǓ`�ͅc����C�d�lO������A6�<��} �'!��`��Śq��
��xprb�����z?��y�u~~ӳ��ύ�
\̈���������/<�Y�4�6�d��>
!�<�rv��F,�����1d�(.1u�����؆�
z���(��oP. Ղ���$�&˄�o� �+&
N΅����-$��b�
��x���@(u��a�
��z�����m�3�q�/�.8�/�ꂵ 0�ٯ ��V�m"T�h
�6���w✽�^B�)'�t�6
+� ���ի��'��C
J�0j8i��y\)M0�ʗ}~��9�u0t�w���OI���!2���SY;�j��C���c�|���;N�u!�l�AF��v&���T��K��gs*�em�Ф��ª�3�"�m��e%� KJ�7
��&E�
��i
��
�
�{CDQ,f�Xs?����b4�c���4�% 6G�G�M\�n�Ґ�
��";H�r���k��+D���͂�Y�)^�E4n\.e֬j
+�� ޗ-kG7;2����Z&V[FC0"�,űy
5O�Ke^�G�� ��.<�
y�G5
U��*�Zv
����6����O�P
aV�#���
C� yz�b*�i&����q-+rD�*�x����E�Ұ���BȰ�����[(�U�o8�,
r4K���
a���U+!�+�<��|[|)B�}��-l`:y�k�����Fi
+�R)o5N�Pm ��W ������#<}�Y��+��4s�p�yЅX��A�T!CGj��I/I�+?<ڹ���P
+#��**F��o4��2T�<T��i��i����8�n�
MK��v!|��O�s襔���W#�?c#��/�V�\h)��?���K��J#��8�U�B����(�
��BM�V�
�A�NX��E����vo�K|�"�T��
�g��:�
�[t����߈�I ���;���~C���\S�E�� r���_�ޚz*n.�K�k7���']c�����Y�6�ďI[�+�(����:J��\A�&K � �iFC���+PYB�
+M�q����6�A)?+`�@�
�2��c���~Q'ҋ�P�!>'�|��0˒���&Ή��}�I2��M�{p-
�+N(c!���|?���qq�hJ��1�o|@C�b*�f4�=��H�ze�9<��,eo
��6�7�
{/�R�������q#�Ϟ���͵�MB� H��'Ŏ]_����Ɲ��(:bC�:�r����o�D1V͍'�v�X�>�
�<�'Q���TD=�SM���
eT�q�$�n��P<�5��
ߍe�8�L�99Y��cيC���?w3٣�̝d
2��]�����_E�{,OH ����<�O��"xȸ�w� �އ+�����rq!��ć>���N�L$��^�Rs��q�K���"�
��GQX��
�r(x6g�EJ�`�I�O�0
>��r����1^.�f�6��x���C�b���A ��u@��O�"�h��V�)n�%���\��&~8��x�`.��~-�J_j\X�/�Gn� �W�(���6�`c�J8R,����g�|y���H���K?ߝ
+�"/
��?��7Wo#8�t��47?&'ؗ�P9�:`�
?
8{��3��6xp�;DZ8�������b�dM�;����S�`Q�
Ń.
�7~��M$��������p��Y'�S8�રJ1�g�س��^$�
V�g~@���
�m�џɝ��h�r��:�e)R�*�
z�e���d���T�m����� \~+��n-
�}�MM��"a�}��[$���¾&Y$��Ɛsc�����5`H���n�����j�2��h{�+���qr���#e�
j����w�=�
+�k�gZ���}���K0Mg[ˤ��lc/S�s�Jo��f[��
�k�9l/�+��Jp�p����wq ������WQ�o9��د�
��ҷw۲v��O��[��E�t�4���9�t���ȍ�ċ�(&���]���/��5�T�4)�b�-Ub�5Uc�5��vۮA:4Hcw�,]���+S��
+Oz���r�.�F���2'��� Z�[��UJ��$����$�~�+e�a�&��Yߔ;x�dV$f�M�����
�������"��h�N�w�蒌ViT�W�m�����=���
@(���|/��L��]x
���D�4
>I��閦IG��VF
k/
�P��2��>�}S�����O�?^��3���
��V m�H��?l6�ϣ��n
�#`���O��(
�#p�7�q���j���4}����P�̯�B���N�P���}�=�g�7k�v����І &���-�"�KL͋�?�`=9y��qCݡ��� ��Q�~���%|`�����,?N����Ϡ����RZ�w��=�+�я
����_�!�O�4A0Q{59<8���8&W����]-���$�Y߁�ˌ�w`C�U�w�:���
~����G
+�&y�������W��w�)bƿ[5��ү��?��B8yC��o�La�Z��dv��
�ܝ�;+��
"`U��T��p��^.�@p at V�7�&5iƱL��nW��w��r�$N_�������;����?���pn�о}�eg��i�2��?
PP_�9;O��#����
���َC���0?
��W���_q�k
�:���~lՄ��ٖ�t�ZS��-�S���9�^lv��o�[��5�V��M�14F�U)
�B�M����Qv4��Ts
��+�"N0
�k��tRP��r�x9�������pر�
,3��g�L��ָ�$��.N����|����s0ʤh�L�RV�A�l��er$Ƽ*��b.�/E�L�
V�t!�.g�W%�U���2ZS&n�
�)��0�H�J�V�$
+*�ܰ�H��d!,m �ʅ�����\���l Yj�!I7"Y#�0��iə������e�
��ۓ�v���.�P�5Te
m���XC묡]��*k���`
m���YC[��Xc��߅���6�L�4
�dƍ�N��B�
or�W\�֨��LG�h,�-4��R�
+[!p:��h��`�e�r
ՠ��
�&sT��+�4K�a+Ffˏٱ�ي�pT�����ȷ����-~�M�B��\_�ml��
���y�Щ��pަ7t����
JGS��:q֠�-?�c5ڊ�5�����ȷ�N��N��ubf�N�j�
L*M�\�+�-
%(WS��x�N������X+&ިS37�#߮:Q�[�a���=�w��1�s�ڻ<�t��vO�&t�5��ש�w�:
*ME�JWP�tT��\M�&\
�Ԥ��w��[1�
j6s�:���:9V/5�q]�Ss�C��&5���S
^_�\��\�I.�"�� �h�K4�%:�%��-r�r��D�\�ܼ�|;�Eu�G��
iP��Ο֫�a�jF
Z�*��(�EE�c]9��Q�VՌz�fTw�~*M�Z�+c��5k��u��U3��� ���j���
����I����{��0��2�)\�z���hp
^U��}���h騠q���u��u���S4��j>+Ge�z��M���/+��?����#|�AVܶg�K
�dVSs
���DӴ���!�
������$�5�[��,��܂@u3���C��ei�a��-
ם��Z��P`�/��
�KMK����l����ye��>������(�Ƕ4�[�n
r��C�q�`Ϟf���`�^��(ø�1��VJ�Q�n
+��xh�2��S�u�|n�qR�6
�F(.�����l�rn[=~��QG;�<q�
l
�-��K��q���A
K�u�i�!F����P�J8��m�����L�ĘWe⺞ϕ�KQ-�b#RP��r�xUb[�_�^+�5e��q��L
��d�D��aUH��"�
��$t�B�!Y����e��Z;��{��A/C 0����� I`!!�&
y
�F�4� ������J�[�6
S�]���NMƧ��\��er�\�$]��oC:����+�o����o�cw!���L=��)j�54C
5��s�P5t�:E
�PC
j�
5Ԡ���ƻ�eݎ�:�}�vDY�|
Qv>44�y�nc
e"8�|'����*}�U�9Y�h�����:ύ
�X��'NC�ض�x�#�,��s��zu]��m�
���o'�{NK����
NԔ�:���)��8���\G�sC��Қ�n�NsYN־1�D�+�d����y� ��d�L��dC~GEC Fk'u�9���Fu�Q㓛�i
۶o�N��tS?Q�u�o����B�oR�
�7�J$��Okz4�o�i�
��`0I&�L�R��u��h�v9��q�
ױ��x�yl�N�=h�ehކ���y���мMa4K�$�����We�K�
+
p�9�B��Wh���
+
p�9�B��Wh���Ƕ���W�K�:��n�U����*��f��j����;[>7\`T4�c�vR��g5Ki�g�L�&��Өht۴5��z5��m�6˻��eKr���@��_w�tB^X~�)���Wa=7Xgcα.�s\�HF��*F'E#�s���fX��Y�;�_nN�Qш���z�`����G�l���r�!*N+vvM�r�Wy�3�;\����˝C"V���;����5� ��,S����T˯S����'�ύ���}�q�z�3�:�%���8���r����H�W��|*DJb��I�e��x��xIx�s�.#SJ��P�}��a��H=��x�xIx� �N<Kk�xC�k�n
bI<�N Ʒ�f%
+��Ȗ$<ҳ/� ���(� E8
˛�c�֎� a䠗�1�D��*`գ�B�9�j,V�����TSip�k��D�gk��'p��;��*/&�>NZ�9/nS��s����''Q�������>TcT_��Ģ�\)B&Ynqʂ(��Z�mS�}Or��v�V���}���<7��=���7��`=
�`7��Q�a��0 {��v����x�d֎�;�<�&+lP�/�&���
�co��Zi��څ!���?
6��~]Y+��$Q8���/����������:><��w+H6��F�o
�*I
+�ì�eV\���_�������'�?=}�ŎK�&��]���mZ�1.j}���n��� /��.)?>�>��5N��.V��և������p��Rɺ(����������o��R� q�םBuy7�/w`�M�I�T#�ǵ�-+yI�J/�+��ҘdA������L_l\�T�
��!�)��e�b�F�U���)�l
��e�[�
�-!
�'e6������~x�e��g�M��T=u��c��Q/�~�c��B2�ă��࢝��#ZH<8g�ly
,�WU&�\Y��$tW(��N%�"��oD/���+��� g�8��:ȑS���X�4נ�X�Tp"���cR�)[?�ހ�Y"G�!rU��)���qJ�`�>ād�
+�3,e��K����T|8{��ŵ��G�r9���d�G,c)b;${5��`e$<�)q�{a2�<)��C���
j`��>���l
�k���"�*ts�b�k�z�� � ,LI�P](!S2R�����3<$�_�IFN���0�;�+����*MV{m
���Jb.i�
�� �
a}趫��'���R2�~�%���RL� S!#�Q��bqr��_sl*� 0�1!��Y���K
1�H�9ey(�4W�E��/Du� 7N'
$�М���H���<�Ӆ�̝<�ڰ��\\M����u���$҃�z�c������5���h0�b�x��\�4�L,� �>I�����J�\ƌ��$
2#�
a4R*HJ)�
+g�W A���st�W��
� �,AlK ���:e���0<�
+ �y�4d=�+JT��p
�y�vM�
]6 3J���I�L
A�
��E�
F5`k$���5�nvƔ��$R����W'�8/}�Cy'_틬
v�
�n9�b�-�j
\J�ɕԋE��"��88�8��^��2�0mg�$_S(��"a*F4�y��N
4�?~{�ջ��������v���!x��������a�Y�?n��[m
��7ϻ/�����;>?
��?=�%y4>x��������
@��
endstream
endobj
31 0 obj
10400
endobj
32 0 obj
/DeviceRGB
endobj
33 0 obj
/DeviceGray
endobj
34 0 obj
<<
/Type /Font
/BaseFont /HRJEYJ+Courier
/Subtype /Type1
/Encoding /WinAnsiEncoding
/FontDescriptor 35 0 R
/Widths [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
/FirstChar 0
/LastChar 255
>>
endobj
35 0 obj
<<
/Type /FontDescriptor
/Ascent 803
/CapHeight 572
/Descent -249
/Flags 34
/FontBBox [ -6 -249 639 803 ]
/FontName /HRJEYJ+Courier
/ItalicAngle 0
/StemV 56
/XHeight 434
/FontFile3 45 0 R
>>
endobj
36 0 obj
<<
/Type /Font
/BaseFont /FTJXWN+ArialMT
/Subtype /Type1
/Encoding /WinAnsiEncoding
/FontDescriptor 37 0 R
/Widths [ 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278
278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278
278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 556
556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015
667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667
778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 333
556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556
556 333 500 278 556 500 722 500 500 500 334 260 334 584 350 556
350 222 556 333 1000 556 556 333 1000 667 333 1000 350 611 350 350
222 222 333 333 350 556 1000 333 1000 500 333 944 350 500 667 278
333 556 556 556 556 260 556 333 737 370 556 584 333 737 333 400
584 333 333 333 556 537 278 333 333 365 556 834 834 834 611 667
667 667 667 667 667 1000 722 667 667 667 667 278 278 278 278 722
722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556
556 556 556 556 556 889 500 556 556 556 556 278 278 278 278 556
556 556 556 556 556 556 584 611 556 556 556 556 500 556 500 ]
/FirstChar 0
/LastChar 255
>>
endobj
37 0 obj
<<
/Type /FontDescriptor
/Ascent 922
/CapHeight 716
/Descent -250
/Flags 32
/FontBBox [ -222 -250 1006 922 ]
/FontName /FTJXWN+ArialMT
/ItalicAngle 0
/StemV 88
/XHeight 518
/FontFile3 43 0 R
>>
endobj
38 0 obj
<<
/Type /Group
/S /Transparency
/I false
/K false
/CS /DeviceRGB
>>
endobj
39 0 obj
<< /Height 60 /Width 128 /BitsPerComponent 8 /ColorSpace /DeviceRGB
/Filter /FlateDecode /Length 40 0 R >>
stream
+H��W=N�@L��8�t))B�� �"U:J((R"D!���.m
+J�pN�r��o�QF�]{�;�²����ٷog�h�
~_K<??�q����lG#
��z������9�'
W�s(��_�?��:��7&A���O�&KP"���gggP�j;��~
}p����#�Y�A�J::�D������ �A <�>F�Ed�q(��:ڠp
)�a���C�Ә�fM��-SM�R
+����rC�Nl
�F������
�f�����M�R���������b*��S@ ���ǹ���I�A ,}oӁ�4�^^^���(���a
p�6n�o)�g;)��ȳ
+�cD-۸!��6�
+8�~-���h��,�;v�M�u#sp�ka����� ���'b
C�
h�p
+�Bio��a���G�C��B����-��
���*Y�#N�^UN�����Z+> �)�3�N�D*M�r �u�����M-jY��D
+p��9/pM-�^��j��v�k
+
+Q� (�_oPP��#`������v���@&hު�#�Z"7F�QԦCJNdR@�omm���5^��<\�Q�CA�������
�U��v@����`����f#��](O�H˯%xxщo���Q��6Z:m��
�y��P���H{*���b�
߲��f��Z��>g`:6Z�
g�}�#��W �æ�� �����PNƠ�Y:�qB�6
��Vsq
���/ϡL~f����̽D���c�����O*�E���K,�:��d
��C�(d
+[��L��
����D��?�P���z��v�/)�R��f�����v��,bM.m~~���1�X+����Q�u��_u����Q�Z{{{[}� �rqE��(��-_k�Pp��c}vww���W�R���&��%��WtD������j�k�U�_�l�@�Q�uH}J��W�?y��:)G��|Gk
���oU�;@�3F&g���ü
r�p��h�x��ϩ,7����Y
��wt0���S�}
+S�,���
+�#/Z�P!��-�X
+~�<��ʢ�
��ٱ�w4}%e���a+�R }$������N�h�F�&�/..
+ht(�š��
+���Vj��U�L�@
�1k:5P�D
+��v���$�������Y��e���
+:���A���#;f`�(�O��\���F���ӧ�����1
+��W�(N�b������W�36OOے�G೦U�bW,C��\�v1?������J����Q��4��C!��C��?�j��wJ�k
�yyI8*���}�U��Y��R�-(�)8X�)��Ϣ�SH�ߡ�>�`+RQX
�F����H(�0i����1�*���F�-�L�)$��Pp<j���a̓�@���%
�+�O<9�y;��J����05��@�O!���jO
+����(��A
�g1e��n�}||�.;i�����������`�>)<==9��g�k��̺�<\�9��/���G�����D
+�~ߧ@%-��#�_�<s&��gJ�D7VԴU��ȣ���v@��y֡p}}��,��
�RX��`�5�V(`����^϶��(�����/�"r��=���
+��Ս&gkk��_g�ȣ���
����A& �c5)2A�t%£u:��`PS����
�
�������v����(°O��k�:�)h:�V�^�(쭸>Ǩj�M�����
n�3��yV-4��
�3�+�u�|��6�º�� ğDK�_h
�
y�KhL
ܸ�l{�m��N�N
+��j�
q��y�#�p����O� P�U�
endstream
endobj
40 0 obj
1810
endobj
41 0 obj
<< /Filter /FlateDecode /Length 42 0 R >>
stream
+H��Wێ7}�W�[��Y��{����lm^�`�����&���-RR��F}#���<U�:�X\^?6O����������7��Ϳw���C���
+X������fw2�
+M/_^�,��Z����M���nS�8���˟�߶��e�{�T˛�������ͧ�~���}�o>
W���{\|^�}�������
@V���VJ(
���zpw�v�[?|�m��<4
m/_���Z,o
��j���G�n��m���*���b����B8��?mv�m���@�~�^�;���qw�X����p W_ֻ�����6���������������ֿ$h�����~��l*�}�Oͪ���oߪ��Cg!��-�����<���pT��
f�T����
+��}���
~L����~�����_oV�7�ߛw�K�J]
���x^g��PFD���W�l���?�ps�E������3��\��ΚZXm��G
�X�+׀+[3e�kW6��,kW.���������v�{����¥_!v�V����CܟD��Ґ��_��"�����=���E������C�+�0pp�Z5UGF'�m�^\
�drZ��x'�N���~
s� r����!�k4�+~;2�f`#��%c�~�%�S�%_yE��J�
�����K\7$��
�\�
k��g���P�h���\'��r�Z9n�ʵ�r�+�R���Y�����Eu*-�++��P1H*6��(��sk
2�v���C2�n�]����;���n �
d���n�������L7��:���n�� ��A�18I컖����"��
+�}��;
+�{t�k���3B���d(�jL����r�iIjl��JH��f��8z�Ԅ�
_5��5r7�¡�w�ۚ�^]Kõ�>TO��*_
��A�mJ�Ћ˒���
�T�K��7�@�.Ј.�����Jg����N�S�R�3���,�I*�'I�*K����.ʤ���I
+�' J~��'��h�M�z�I�lzʠF���Μ
�s�*0Gh�
�u+MI���t���h����2G�'J~�OR��|��!�bNs1'��s��r*s2�=�g1��ʈ(|f����^kӢ�P.i'i�e
����@��J4%���V{.J���jt�e�O��J��Z��6�C�e;��mW����
Z�PFt;��mW��p|���W_ֻ����u [������m���7�0Y
iV��*=7��}Pܳ��%�ق�,՝-��R�ق�lIw��;KugK��Tw��;�oS:�>�f��\�١�Y������Z�?Y9ʅ��բ��]�֩^b�UN�'6$p-i�߄]�a0G�)��1>F�Uȷ)
B/vq3WWϡJ5�
+�1��(��)��JL�"C�?��*�PFh�s�Q��D��P��RGV�(�iGA[W�є(;��b�h�f
�ю�-�P���,�(�v�oS:�CGa�L����������W���ǟY� o{_li������I:�U;���"�1)�R��
T8�Ѫ�\�o��5�PI�1l&
~����J�� |x�î�ON
+艣¸�ݰ1͘Zi���h��v��;W��%F�%�U'�C}�F��
�Hl�Lk9!�eDR�q���/���,2�R�M�
FZc��ZXm ($�X.��km�]D�ve�o���۟K�e��
;�?xi���pk��l�V����C����Ґ���E��.q�̭�8?uc��}Ye^ۚ
�|�%��Bg��`'��Q?��P�2����!�k4�+~;2�f�0L2v���uʰ�+��U��>Ɛ0�d^�!��e���o`X��<�H�$W��E����:��_�������t�U�]g�K��)NX�rI
�~��:���ޕ���c��V�$�
�N�SX�`��X[��*���C
+2�n�]����;���n �
d���n�������L7��:���n�� ��A�Q>_��
��d�C�P�T�R.�1�%�S��H멱d(��4}�
+e�Uj�H���yD&���L��Gi]���+�"�\�$œ%��Ƨ�#��oS:�~w ���T�f�B15n���]�]ߣ*����tpF�ɟ�t=e(�>�� o�'�TO@�
+%^���2i��z�zN�x�/���ͷ)
B/=�F:��2�z���3'C��
.
����0m��DSR�hl+
�"!Z�)s�y@�Á�A�/��eͷ)
B/�0��9��N�~9�99ʈ
쳘��
ex!
3�J�QFDF[ô(2�KZf��e������J4%���V{.J���j�I�e&(�(�4>I�L�mJ��K�z>-뮖�Ȩ�����b�,Z�]-�°Z^^}Y��>���l�[7_��p��^�t�d5p�Y�j���XG�Aq��N�t�
��Tw��;Mu�
��%���4՝.�NS���h�M�z�Κ�;W`v(oA��S��݈ ��
�RWw��.�)�
��]i�vt�p�4�ߔ]�QvYK�)��m|.I��۔������gP��=�dsLh9��~*9�c%�F�����Nϡ�
e���YN�s�Q��D��P��bGq��H�HG�bSTvb<u�.�(��Q��
�ڡL����l���|��!
:�P���LURp��:�p���c Ъj��2� [...]
+�����$W��<�#Q�p��ǿ���?�~�o��-�˯���ѿO��ϋϿ�{]�?=8�e��7=(��+�M�3�+��HGO��˒�u�;��ÿ
d�=?�+�}]���8A�y����;�=1�o��Ģ��w���^�ץ�>�#�e�Ȣ����z%��bk�G�_ކq��M3����}醑�]���}�����}0g�M5�{�Ĭ�����D���T��煈�;��ɩTTe�Vv���[��C@� �����%�䷑���}Y���vI
�
+6�����Cߨ�ⶑ:��խ�$u#��
+�S�lᰪIq�H��{�K�,]8lb�AY��A��ͣT
[n��!F�b�n.�|eK�@HC����<B��4g(��=��
eLn>J��*�̘�F�%Y.=LS��M
ag%�$�U��B
u@[���Բ:�����B �$��a+n�8�1���&(�E�]�)�?���֦z��1Z�č9FԐ=���[w�����������JM
$�Q�t?e^
�l�=���� �o\ ����T"$Qf�K���
�:�<{
+g��'
�%0T�i�-w ���]�����v'\� }�Y�W�6�:�Z&D
c4s�c�'�X�çO��
���d��s�?y�467��(���l�r���Cbs�9���v�,fx(X
g�hq
Ȩ ��QҐ(�e"������� >��
{�o
��[$0��5
+U�PH�H�\Y�IS����ՙ�4
^1h�'θC[~6�)���1{ zB�%Y�
�/�W��+e'
P��`B�#z]臻AJCY�Xِ@�7��9���t��v��D:)�n�8]�҇O6,�1x������4�Gq����:�z4��s���-
L��8��7�/�&�%���dDV�i��<��f���ʜ02Ȱ�{���MqD�~@�c�z��W�-:��D5��IS8
/
=�&�|�a;g��4r��9�<9�'S�L�}��W�&�s5h݆4_]�3H�Юj>�&+^���>8u�
ZBll�����Xyu�h�aeMq?Y��ٚI���|�x!�V��g��S����:�"�x�J�K�$���X�Њ�+�1i����O��N
+��<�` *�1�
endstream
endobj
42 0 obj
4213
endobj
43 0 obj
<< /Filter /FlateDecode /Length 44 0 R /Subtype /Type1C >>
stream
+H�L�{Tw�3I�AK�2���-(Zm�T�� p�Q ����HLR
.B�Xb�PԊ�E��"h�"[��6x��
]O�xz�����$u��̜���7��{��b"�X�a�i 骵�Ǚ�Ii~)��(�)���~��P�;~}#�&�7�����CEb
��0�M��y6*{6�`��s�Q��qI �
�K�8�a��M-7[�Ef���l��h0i-z�,WXȦ�if6Eo֛J5`��7�Z�b���EZSk�a���l���`)7��/)��I��/�Mz
�_�Z��֧���V[�c���I�����D}�Y_�'��2��&<"�H/�'%IE��d�g"�(DĊNb�X:�.
'��#�^rF�I3������5]�n�a�`��>��
�/�@9pY�Pn ?��_�Ў��8G��$�:p���k�S�̆��+��)�h�VD+�J��fí�4Ya������zmga��>�s��6�����gh��tivm���Y [...]
g�eU
] �遵��
4�HY��H��N�]�|�
��`��р#v�VU^�X�N����^8"��{����Ӥ
�X��*un�9�`���ӜB�Vy`����I�(H�o���5$�P�
���l�i0���h�Q�a�.��Z�dDRShj**D�M�w/B�X����r��8�e>*��
��[��FuK��F�XFp�γ0�q�6z�����;��"��s�L��+
���` -pa�f
6� =����}l\E��_���
?�3��Ɔ,
+-\�ơ�譿�k��'��&�<��n�S�V�.�(So�d/
��
�
>�SUz�
��'_i�(jD���{N|�Ŵ���R�^>�
�|�d%�KK�-���D4
�"v
M���}�_����hVDյS��J�ä[�ћ�P��O�
]`�oQS��'�LLA�m�Bv��W��� #�q��0����c
t[��S.
+0ۜ"}ρ��qY��W�V
K�r�v&�0P�$d� 9\
+� ?�?�ğJ�gJ��BS�R����݁�B�n��wr8�u
y
xwmG��y�b�%�ў5j�8�#:��~q�v
�n�~�-�p��50
�5'3�PN�(Q��Q�U�
c�I�'���/� 5
92(�uw��tg㕓��l�2$�{�k�vK�_���z*oYul��=,`�<�
���u�� ��%��鵮a�
jh��������+ Q�)�[�|K�&:+uG|��1O[�����K
(MR�l�XZ�V�@���
�ݟ�\O�F9{�x�ɞ�o(�A�!2
dh�<]���o�;M���r� �z������L�l��U4�M�9���Bባ����
�~[�� �Z���O>n�[�AuE��T�qCv�94M6�_g�C�铴rU]"`
���_⏣p'�ؑSQq}d��9�3� ��`й�ϑ�T��_
�D?�ʘ��}U��*�
翭�
�A�ҫ��
b^N�cr��m�
+Jmk��@?7��B�� $�`�mt�Xdj>��S{Xؼ{��
+��+Gv�e�ܰ1Ⴁa<9ּ����2�QMei
��ON�
}
+8�Dw�M�5'4��y��O��}�7Ǝ�LM/4Q�AXi������?H��K�<�W<
!!ܾ�W������
<(X
endstream
endobj
44 0 obj
1672
endobj
45 0 obj
<< /Filter /FlateDecode /Length 46 0 R /Subtype /Type1C >>
stream
+H�T�[HSq
���c%m.a'w�]��dV�
+Qf�Դ��T.���V�ɶ4!S,A���*S��E)��VT;��f���/��
1_���
=������� &F� ��������xw��N߸�B�LE$QC�$!f
��8�&z`�8���f=x'��F�Plu�պ �j��x�j}�rW at J.�%�efd��̴F��(�G�
��(3�l�w�SZ[�8+�Rne��W��m 8
�����HE��~���w��U�_e��)�4f�̤3.&V]�h�f %�r�5�ٺz
��Wv��߈RM��.��Z����w�K�g�-���=6��:�.�6��;]~*|
+��[_V ���I�����e�y���v�l�ͳ��Y��Vj���Ա�ȋ�N���0��x�a
Y�
C��%Ͱ�����N�h���f�uЋ���C������2?��8����Cd�&�lנ �� vPԵb�0�Ď�� \���a�s
+.橃Y�"�t��������V�p,\��(�Β��0���&� �ۃ�n=�O�j7%b��b
%��5��
+� ï�<��{�,�Ņ|�i�ܖ
'J�6���\���΄��o��"ѽ�1��Ĉ��
��0=&C
+M����e���Xڡ��Wi���[�寕�8�&''ѩt!M�@���ի���E��UkR�ш�j�aT}�ʿ�
��l���<�Qi�xio�b�0 L�����`v�ݲ��=�pg �
����<1�K^G�j
����dȔ�u�>�.��
���tN>w��
4
m��s��_���O��$2
�W� ��e
endstream
endobj
46 0 obj
800
endobj
47 0 obj
<< /Type /Metadata /Subtype /XML /Length 936 >>
stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d' bytes='936'?>
+
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
+ xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description about=''
+ xmlns='http://ns.adobe.com/pdf/1.3/'
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ <pdf:CreationDate>2003-03-27T08:56:20-05:00</pdf:CreationDate>
+ <pdf:ModDate>2003-03-27T08:56:22-06:00</pdf:ModDate>
+ <pdf:Creator>Adobe Illustrator 10.0</pdf:Creator>
+ <pdf:Producer>Adobe PDF library 5.00</pdf:Producer>
+ </rdf:Description>
+
+ <rdf:Description about=''
+ xmlns='http://ns.adobe.com/xap/1.0/'
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'>
+ <xap:CreateDate>2003-03-27T08:56:20-05:00</xap:CreateDate>
+ <xap:ModifyDate>2003-03-27T08:56:22-06:00</xap:ModifyDate>
+ <xap:CreatorTool>Adobe Illustrator 10.0</xap:CreatorTool>
+ <xap:MetadataDate>2003-03-27T08:56:22-06:00</xap:MetadataDate>
+ </rdf:Description>
+
+</rdf:RDF>
+<?xpacket end='r'?>
endstream
endobj
xref
0 48
0000000004 65535 f
+0000000016 00000 n
+0000000087 00000 n
+0000000151 00000 n
+0000000006 00001 f
+0000000318 00000 n
+0000000000 00001 f
+0000000691 00000 n
+0000000770 00000 n
+0000001172 00000 n
+0000001582 00000 n
+0000002780 00000 n
+0000009264 00000 n
+0000027737 00000 n
+0000027760 00000 n
+0000044231 00000 n
+0000044254 00000 n
+0000063787 00000 n
+0000063810 00000 n
+0000083498 00000 n
+0000083521 00000 n
+0000097749 00000 n
+0000097772 00000 n
+0000101490 00000 n
+0000101512 00000 n
+0000115581 00000 n
+0000115604 00000 n
+0000138133 00000 n
+0000138156 00000 n
+0000158963 00000 n
+0000158986 00000 n
+0000169468 00000 n
+0000169491 00000 n
+0000169519 00000 n
+0000169548 00000 n
+0000170762 00000 n
+0000170982 00000 n
+0000172203 00000 n
+0000172426 00000 n
+0000172518 00000 n
+0000174472 00000 n
+0000174494 00000 n
+0000178785 00000 n
+0000178807 00000 n
+0000180574 00000 n
+0000180596 00000 n
+0000181491 00000 n
+0000181512 00000 n
+trailer
<<
/Size 48
/Info 3 0 R
/Root 1 0 R
/ID[<bd63a2b892ece086f7bc09074fb768c6><8c2ae81d3a89b7e1aaf1a83323203ad6>]
>>
startxref
182532
%%EOF
\ No newline at end of file
diff --git a/documentation/figures/rna_elements.eps b/documentation/figures/rna_elements.eps
new file mode 100644
index 0000000..de8491b
--- /dev/null
+++ b/documentation/figures/rna_elements.eps
@@ -0,0 +1,6594 @@
+%!PS-Adobe-3.1 EPSF-3.0
+%%Title: rna_elements.eps
+%%Creator: Adobe Illustrator(R) X
+%%AI8_CreatorVersion: 10.0
%AI9_PrintingDataBegin
%%For: Sean R Eddy
+%%CreationDate: 3/27/03
+%%BoundingBox: 0 0 353 165
+%%HiResBoundingBox: 0 0 352.5372 164.2393
+%%CropBox: 0 0 352.5372 164.2393
+%%LanguageLevel: 2
+%%DocumentData: Clean7Bit
+%ADOBeginClientInjection: DocumentHeader "AI10"
+%ADOEndClientInjection: DocumentHeader "AI10"
+%%Pages: 1
+%%DocumentNeededResources:
+%%DocumentSuppliedResources: procset Adobe_AGM_Image (1.0 0)
+%%+ procset Adobe_CoolType_Utility_MAKEOCF (1.13 0)
+%%+ procset Adobe_CoolType_Core (2.12 0)
+%%+ procset Adobe_AGM_Core (2.0 0)
+%%+ procset Adobe_AGM_Utils (1.0 0)
+%%DocumentFonts:
+%%DocumentNeededFonts:
+%%DocumentNeededFeatures:
+%%DocumentSuppliedFeatures:
+%%DocumentCustomColors:
+%%CMYKCustomColor:
+%%RGBCustomColor:
+%%EndComments
+%%BeginDefaults
+%%ViewingOrientation: 1 0 0 1
+%%EndDefaults
+%%BeginProlog
+%ADOBeginClientInjection: DocumentProlog Start "AI10"
+%ADOEndClientInjection: DocumentProlog Start "AI10"
+%%BeginResource: procset Adobe_AGM_Utils 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright (C) 2000-2000 Adobe Systems, Inc. All Rights Reserved.
+systemdict /setpacking known
+{
+ currentpacking
+ true setpacking
+} if
+userdict /Adobe_AGM_Utils 60 dict dup begin put
+/bdf
+{
+ bind def
+} bind def
+/nd{
+ null def
+}bdf
+/xdf
+{
+ exch def
+}bdf
+/ldf
+{
+ load def
+}bdf
+/ddf
+{
+ put
+}bdf
+/xddf
+{
+ 3 -1 roll put
+}bdf
+/xpt
+{
+ exch put
+}bdf
+/ndf
+{
+
+ exch dup where{
+ pop pop pop
+ }{
+ xdf
+ }ifelse
+}def
+/cdndf
+{
+ exch dup currentdict exch known{
+ pop pop
+ }{
+ exch def
+ }ifelse
+}def
+/bdict
+{
+ mark
+}bdf
+/edict
+{
+ counttomark 2 idiv dup dict begin {def} repeat pop currentdict end
+}def
+
+/ps_level
+ /languagelevel where{
+ pop systemdict /languagelevel get exec
+ }{
+ 1
+ }ifelse
+def
+/level2
+ ps_level 2 ge
+def
+/level3
+ ps_level 3 ge
+def
+/ps_version
+ {version cvr} stopped {
+ -1
+ }if
+def
+/makereadonlyarray
+{
+ /packedarray where{
+ pop packedarray
+ }{
+ array astore readonly
+ }ifelse
+}bdf
+/map_reserved_ink_name
+{
+ dup type /stringtype eq{
+ dup /Red eq{
+ pop (_Red_)
+ }{
+ dup /Green eq{
+ pop (_Green_)
+ }{
+ dup /Blue eq{
+ pop (_Blue_)
+ }{
+ dup /Cyan eq{
+ pop (_Cyan_)
+ }{
+ dup /Magenta eq{
+ pop (_Magenta_)
+ }{
+ dup /Yellow eq{
+ pop (_Yellow_)
+ }{
+ dup /Black eq{
+ pop (_Black_)
+ }{
+ dup () cvn eq{
+ pop (Process)
+ }if
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }if
+}bdf
+/AGMUTIL_GSTATE 22 dict def
+/get_gstate
+{
+ AGMUTIL_GSTATE begin
+ /AGMUTIL_GSTATE_clr_spc currentcolorspace def
+ /AGMUTIL_GSTATE_clr_indx 0 def
+ /AGMUTIL_GSTATE_clr_comps 12 array def
+ mark currentcolor counttomark
+ {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put
+ /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop
+ /AGMUTIL_GSTATE_fnt rootfont def
+ /AGMUTIL_GSTATE_lw currentlinewidth def
+ /AGMUTIL_GSTATE_lc currentlinecap def
+ /AGMUTIL_GSTATE_lj currentlinejoin def
+ /AGMUTIL_GSTATE_ml currentmiterlimit def
+ currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf
+ /AGMUTIL_GSTATE_sa currentstrokeadjust def
+
+ /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def
+ /AGMUTIL_GSTATE_op currentoverprint def
+ /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def
+ /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def
+ currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf
+ cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf
+ /AGMUTIL_GSTATE_ht currenthalftone def
+ /AGMUTIL_GSTATE_flt currentflat def
+ end
+}def
+/set_gstate
+{
+ AGMUTIL_GSTATE begin
+ AGMUTIL_GSTATE_clr_spc setcolorspace
+ AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get
+ /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor
+ AGMUTIL_GSTATE_fnt setfont
+ AGMUTIL_GSTATE_lw setlinewidth
+ AGMUTIL_GSTATE_lc setlinecap
+ AGMUTIL_GSTATE_lj setlinejoin
+ AGMUTIL_GSTATE_ml setmiterlimit
+ AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash
+ AGMUTIL_GSTATE_sa setstrokeadjust
+
+ AGMUTIL_GSTATE_clr_rnd setcolorrendering
+ AGMUTIL_GSTATE_op setoverprint
+ AGMUTIL_GSTATE_bg cvx setblackgeneration
+ AGMUTIL_GSTATE_ucr cvx setundercolorremoval
+ AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx
+ AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer
+
+ AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or
+ {
+ currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne
+ {
+ mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark
+ } if
+ }{
+ AGMUTIL_GSTATE_ht sethalftone
+ } ifelse
+
+ AGMUTIL_GSTATE_flt setflat
+ end
+}def
+/AGMUTIL_str256 256 string def
+/AGMUTIL_src256 256 string def
+/AGMUTIL_dst64 64 string def
+/AGMUTIL_srcLen nd
+/AGMUTIL_ndx nd
+/rdline
+{
+ currentfile AGMUTIL_str256 readline pop
+} bdf
+/rdcmntline
+{
+ currentfile AGMUTIL_str256 readline pop
+ (%) anchorsearch {pop} if
+} bdf
+/filter_cmyk
+{
+ dup type /filetype ne{
+ 0 () /SubFileDecode filter
+ }if
+ [
+ exch
+ {
+ AGMUTIL_src256 readstring pop
+ dup length /AGMUTIL_srcLen exch def
+ /AGMUTIL_ndx 0 def
+
+ AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{
+ 1 index exch get
+ AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put
+ /AGMUTIL_ndx AGMUTIL_ndx 1 add def
+ }for
+ pop
+ AGMUTIL_dst64 0 AGMUTIL_ndx getinterval
+ }
+ bind
+ /exec cvx
+ ] cvx
+} bdf
+/AGMUTIL_imagefile nd
+/AGMUTIL_imbuf nd
+/read_image_file
+{
+ AGMUTIL_imagefile 0 setfileposition
+ dup /DataSource {AGMUTIL_imagefile AGMUTIL_imbuf readstring pop} put
+ exch
+ load exec
+}def
+/write_image_file
+{
+ begin
+ { (AGMUTIL_imagefile) (w+) file } stopped{
+ false
+ }{
+ Adobe_AGM_Utils/AGMUTIL_imagefile xddf
+ Adobe_AGM_Utils/AGMUTIL_imbuf Width BitsPerComponent mul 7 add 8 idiv string ddf
+ 1 1 Height {
+ pop
+ DataSource dup type /filetype eq{
+ AGMUTIL_imbuf readstring pop
+ }{
+ exec
+ } ifelse
+ AGMUTIL_imagefile exch writestring
+ }for
+ true
+ }ifelse
+ end
+}def
+/close_image_file
+{
+ AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile
+}def
+/consumeimagedata
+{
+ begin
+ currentdict /MultipleDataSources known not
+ {/MultipleDataSources false def} if
+ MultipleDataSources
+ {
+ 1 dict begin
+ /flushbuffer Width cvi string def
+ 1 1 Height cvi
+ {
+ pop
+ 0 1 DataSource length 1 sub
+ {
+ DataSource exch get
+ dup type dup
+ /filetype eq
+ {
+ exch flushbuffer readstring pop pop
+ }if
+ /arraytype eq
+ {
+ exec pop
+ }if
+ }for
+ }for
+ end
+ }
+ {
+ /DataSource load type dup
+ /filetype eq
+ {
+ 1 dict begin
+ /flushbuffer Width Decode length 2 div mul cvi string def
+ 1 1 Height { pop DataSource flushbuffer readstring pop pop} for
+ end
+ }if
+ /arraytype eq
+ {
+ 1 1 Height { pop DataSource pop } for
+ }if
+ }ifelse
+ end
+}bdf
+/addprocs
+{
+ 2{/exec load}repeat
+ 3 1 roll
+ [ 5 1 roll ] bind cvx
+}def
+/modify_halftone_xfer
+{
+ currenthalftone dup length dict copy begin
+ currentdict 2 index known{
+ 1 index load dup length dict copy begin
+ currentdict/TransferFunction known{
+ /TransferFunction load
+ }{
+ currenttransfer
+ }ifelse
+ addprocs /TransferFunction xdf
+ currentdict end def
+ currentdict end sethalftone
+ }{
+ currentdict/TransferFunction known{
+ /TransferFunction load
+ }{
+ currenttransfer
+ }ifelse
+ addprocs /TransferFunction xdf
+ currentdict end sethalftone
+ pop
+ }ifelse
+}def
+/doc_setup{
+ Adobe_AGM_Utils begin
+}bdf
+/doc_trailer{
+ currentdict Adobe_AGM_Utils eq{
+ end
+ }if
+}bdf
+systemdict /setpacking known
+{
+ setpacking
+} if
+%%EndResource
+%%BeginResource: procset Adobe_AGM_Core 2.0 0
+%%Version: 2.0 0
+%%Copyright: Copyright (C) 1997-1999 Adobe Systems, Inc. All Rights Reserved.
+systemdict /setpacking known
+{
+ currentpacking
+ true setpacking
+} if
+userdict /Adobe_AGM_Core 205 dict dup begin put
+/nd{
+ null def
+}bind def
+/Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def
+/AGMCORE_str256 256 string def
+/AGMCORE_src256 256 string def
+/AGMCORE_save nd
+/AGMCORE_graphicsave nd
+/AGMCORE_c 0 def
+/AGMCORE_m 0 def
+/AGMCORE_y 0 def
+/AGMCORE_k 0 def
+/AGMCORE_cmykbuf 4 array def
+/AGMCORE_screen [currentscreen] cvx def
+/AGMCORE_tmp 0 def
+/AGMCORE_&setgray nd
+/AGMCORE_&setcolor nd
+/AGMCORE_&setcolorspace nd
+/AGMCORE_&setcmykcolor nd
+/AGMCORE_cyan_plate nd
+/AGMCORE_magenta_plate nd
+/AGMCORE_yellow_plate nd
+/AGMCORE_black_plate nd
+/AGMCORE_plate_ndx nd
+/AGMCORE_get_ink_data nd
+/AGMCORE_is_cmyk_sep nd
+/AGMCORE_host_sep nd
+/AGMCORE_will_host_sep nd
+/AGMCORE_avoid_L2_sep_space nd
+/AGMCORE_distilling nd
+/AGMCORE_composite_job nd
+/AGMCORE_producing_seps nd
+/AGMCORE_ps_level -1 def
+/AGMCORE_ps_version -1 def
+/AGMCORE_environ_ok nd
+/AGMCORE_CSA_cache 0 dict def
+/AGMCORE_CSD_cache 0 dict def
+/AGMCORE_pattern_cache 0 dict def
+/AGMCORE_currentoverprint false def
+/AGMCORE_deltaX nd
+/AGMCORE_deltaY nd
+/AGMCORE_name nd
+/AGMCORE_sep_special nd
+/AGMCORE_err_strings 4 dict def
+/AGMCORE_cur_err nd
+/AGMCORE_ovp nd
+/AGMCORE_current_spot_alias false def
+/AGMCORE_inverting false def
+/AGMCORE_feature_dictCount nd
+/AGMCORE_feature_opCount nd
+/AGMCORE_feature_ctm nd
+/AGMCORE_ConvertToProcess false def
+/AGMCORE_Default_CTM matrix def
+/knockout_unitsq nd
+/AGMCORE_CRD_cache where{
+ pop
+}{
+ /AGMCORE_CRD_cache 0 dict def
+}ifelse
+/AGMCORE_key_known
+{
+ where{
+ /Adobe_AGM_Core_Id known
+ }{
+ false
+ }ifelse
+}ndf
+/flushinput
+{
+ save
+ /CompareBuffer 3 -1 roll def
+ /readbuffer 256 string def
+ mark
+ {
+ currentfile readbuffer {readline} stopped
+ {cleartomark mark}
+ {
+ not
+ {pop exit}
+ if
+ CompareBuffer eq
+ {exit}
+ if
+ }ifelse
+ }loop
+ cleartomark
+ restore
+}bdf
+/getspotfunction
+{
+ AGMCORE_screen exch pop exch pop
+ dup type /dicttype eq{
+ dup /HalftoneType get 1 eq{
+ /SpotFunction get
+ }{
+ dup /HalftoneType get 2 eq{
+ /GraySpotFunction get
+ }{
+ pop
+ {
+ abs exch abs 2 copy add 1 gt{
+ 1 sub dup mul exch 1 sub dup mul add 1 sub
+ }{
+ dup mul exch dup mul add 1 exch sub
+ }ifelse
+ }bind
+ }ifelse
+ }ifelse
+ }if
+} def
+/clp_npth
+{
+ clip newpath
+} def
+/eoclp_npth
+{
+ eoclip newpath
+} def
+/stkpath_clp_npth
+{
+ strokepath clip newpath
+} def
+/stk_n_clp_npth
+{
+ gsave stroke grestore clip newpath
+} def
+/npth_clp
+{
+ newpath clip
+} def
+/graphic_setup
+{
+ /AGMCORE_graphicsave save def
+ concat
+ 0 setgray
+ 0 setlinecap
+ 0 setlinejoin
+ 1 setlinewidth
+ [] 0 setdash
+ 10 setmiterlimit
+ newpath
+ false setoverprint
+ false setstrokeadjust
+ Adobe_AGM_Core/spot_alias get exec
+ /Adobe_AGM_Image where {
+ pop
+ Adobe_AGM_Image/spot_alias 2 copy known{
+ get exec
+ }{
+ pop pop
+ }ifelse
+ } if
+ 100 dict begin
+ /showpage {} def
+ mark
+} def
+/graphic_cleanup
+{
+ cleartomark
+ end
+ AGMCORE_graphicsave restore
+} def
+/compose_error_msg
+{
+ grestoreall initgraphics
+ /Helvetica findfont 10 scalefont setfont
+
+ /AGMCORE_deltaY 100 def
+ /AGMCORE_deltaX 310 def
+
+ clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto
+ 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto
+ 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath
+ 0 AGMCORE_&setgray
+ gsave 1 AGMCORE_&setgray fill grestore
+ 1 setlinewidth gsave stroke grestore
+
+ currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto
+
+ /AGMCORE_deltaY 12 def
+ /AGMCORE_tmp 0 def
+ AGMCORE_err_strings exch get
+ {
+ dup 32 eq
+ {
+ pop
+ AGMCORE_str256 0 AGMCORE_tmp getinterval
+ stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt
+ {
+ currentpoint AGMCORE_deltaY sub exch pop
+ clippath pathbbox pop pop pop 44 add exch moveto
+ } if
+ AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show
+
+ 0 1 AGMCORE_str256 length 1 sub
+ {
+ AGMCORE_str256 exch 0 put
+ }for
+ /AGMCORE_tmp 0 def
+ }
+ {
+ AGMCORE_str256 exch AGMCORE_tmp exch put
+ /AGMCORE_tmp AGMCORE_tmp 1 add def
+ } ifelse
+ } forall
+} bdf
+/doc_setup{
+ Adobe_AGM_Core begin
+
+ /AGMCORE_will_host_separate xdf
+ /AGMCORE_ps_version xdf
+ /AGMCORE_ps_level xdf
+
+ errordict /AGM_handleerror known not{
+ errordict /AGM_handleerror errordict /handleerror get put
+ errordict /handleerror {
+ Adobe_AGM_Core begin
+ $error /newerror get AGMCORE_cur_err null ne and{
+ $error /newerror false put
+ AGMCORE_cur_err compose_error_msg
+ }if
+ $error /newerror true put
+ end
+ errordict /AGM_handleerror get exec
+ } bind put
+ }if
+
+ /AGMCORE_environ_ok
+ ps_level AGMCORE_ps_level ge
+ ps_version AGMCORE_ps_version ge and
+ AGMCORE_ps_level -1 eq or
+ def
+
+ AGMCORE_environ_ok not
+ {/AGMCORE_cur_err /AGMCORE_bad_environ def} if
+
+ /AGMCORE_&setgray systemdict/setgray get def
+ level2{
+ /AGMCORE_&setcolor systemdict/setcolor get def
+ /AGMCORE_&setcolorspace systemdict/setcolorspace get def
+ }if
+ /AGMCORE_distilling
+ /product where{
+ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and
+ }{
+ false
+ }ifelse
+ def
+ /AGMCORE_in_rip_sep
+ /AGMCORE_in_rip_sep where{
+ pop AGMCORE_in_rip_sep
+ }{
+ AGMCORE_distilling
+ {
+ false
+ }{
+ userdict/Adobe_AGM_OnHost_Seps known{
+ false
+ }{
+ level2{
+ currentpagedevice/Separations 2 copy known{
+ get
+ }{
+ pop pop false
+ }ifelse
+ }{
+ false
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ def
+ level2 not{
+ /xput{
+ dup load dup length exch maxlength eq{
+ dup dup load dup
+ length dup 0 eq {pop 1} if 2 mul dict copy def
+ }if
+ load begin
+ def
+ end
+ }def
+ }{
+ /xput{
+ load 3 1 roll put
+ }def
+ }ifelse
+ /AGMCORE_GSTATE AGMCORE_key_known not{
+ /AGMCORE_GSTATE 21 dict def
+ /AGMCORE_gstack 32 array def
+ /AGMCORE_gstackptr 0 def
+ /AGMCORE_gstacksaveptr 0 def
+ /AGMCORE_gstackframekeys 8 def
+
+ /AGMCORE_&gsave /gsave ldf
+ /AGMCORE_&grestore /grestore ldf
+ /AGMCORE_&grestoreall /grestoreall ldf
+ /AGMCORE_&save /save ldf
+ /AGMCORE_gdictcopy {
+ begin
+ { def } forall
+ end
+ }def
+ /AGMCORE_gput {
+ AGMCORE_gstack AGMCORE_gstackptr get
+ 3 1 roll
+ put
+ }def
+ /AGMCORE_gget {
+ AGMCORE_gstack AGMCORE_gstackptr get
+ exch
+ get
+ }def
+ /gsave {
+ AGMCORE_&gsave
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gstackptr 1 add
+ dup 32 ge {limitcheck} if
+ Adobe_AGM_Core exch
+ /AGMCORE_gstackptr exch put
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gdictcopy
+ }def
+ /grestore {
+ AGMCORE_&grestore
+ AGMCORE_gstackptr 1 sub
+ dup AGMCORE_gstacksaveptr lt {1 add} if
+ Adobe_AGM_Core exch
+ /AGMCORE_gstackptr exch put
+ }def
+ /grestoreall {
+ AGMCORE_&grestoreall
+ Adobe_AGM_Core
+ /AGMCORE_gstackptr AGMCORE_gstacksaveptr put
+ }def
+ /save {
+ AGMCORE_&save
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gstackptr 1 add
+ dup 32 ge {limitcheck} if
+ Adobe_AGM_Core begin
+ /AGMCORE_gstackptr exch def
+ /AGMCORE_gstacksaveptr AGMCORE_gstackptr def
+ end
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gdictcopy
+ }def
+ 0 1 AGMCORE_gstack length 1 sub {
+ AGMCORE_gstack exch AGMCORE_gstackframekeys dict put
+ } for
+ }if
+ /currentcmykcolor [0 0 0 0] AGMCORE_gput
+ /currentstrokeadjust false AGMCORE_gput
+ /currentcolorspace [/DeviceGray] AGMCORE_gput
+ /sep_tint 0 AGMCORE_gput
+ /sep_colorspace_dict null AGMCORE_gput
+ /indexed_colorspace_dict null AGMCORE_gput
+ /currentcolor_intent () AGMCORE_gput
+ /customcolor_tint 1 AGMCORE_gput
+ end
+}def
+/page_setup
+{
+ /setcmykcolor where{
+ pop
+ Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put
+ }if
+ Adobe_AGM_Core begin
+ /setcmykcolor
+ {
+ 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput
+ 1 sub 4 1 roll
+ 3 {
+ 3 index add neg dup 0 lt {
+ pop 0
+ } if
+ 3 1 roll
+ } repeat
+ setrgbcolor pop
+ }ndf
+ /currentcmykcolor
+ {
+ /currentcmykcolor AGMCORE_gget aload pop
+ }ndf
+ /setoverprint
+ {
+ pop
+ }ndf
+ /currentoverprint
+ {
+ false
+ }ndf
+ /AGMCORE_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def
+ /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def
+ /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def
+ /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def
+ /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def
+ /AGMCORE_plate_ndx
+ AGMCORE_cyan_plate{
+ 0
+ }{
+ AGMCORE_magenta_plate{
+ 1
+ }{
+ AGMCORE_yellow_plate{
+ 2
+ }{
+ AGMCORE_black_plate{
+ 3
+ }{
+ 4
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ def
+ /AGMCORE_composite_job
+ AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def
+
+ /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def
+
+ /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def
+
+ /AGM_preserve_spots
+ /AGM_preserve_spots where{
+ pop AGM_preserve_spots
+ }{
+ AGMCORE_distilling AGMCORE_producing_seps or
+ }ifelse
+ def
+ /AGM_is_distiller_preserving_spotimages
+ {
+ currentdistillerparams/PreserveOverprintSettings known
+ {
+ currentdistillerparams/PreserveOverprintSettings get
+ {
+ currentdistillerparams/ColorConversionStrategy known
+ {
+ currentdistillerparams/ColorConversionStrategy get
+ /LeaveColorUnchanged eq
+ }{
+ true
+ }ifelse
+ }{
+ false
+ }ifelse
+ }{
+ false
+ }ifelse
+ }def
+ /convert_spot_to_process where {pop}{
+ /convert_spot_to_process
+ {
+ dup dup (None) eq exch (All) eq or
+ {
+ pop false
+ }{
+ AGMCORE_host_sep
+ {
+ gsave
+ 1 0 0 0 setcmykcolor currentgray 1 exch sub
+ 0 1 0 0 setcmykcolor currentgray 1 exch sub
+ 0 0 1 0 setcmykcolor currentgray 1 exch sub
+ 0 0 0 1 setcmykcolor currentgray 1 exch sub
+ add add add 0 eq
+ {
+ pop false
+ }{
+ false setoverprint
+ 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor
+ currentgray 0 eq
+ }ifelse
+ grestore
+ }{
+ AGMCORE_distilling
+ {
+ pop AGM_is_distiller_preserving_spotimages not
+ }{
+ Adobe_AGM_Core/AGMCORE_name xddf
+ false
+ currentpagedevice/OverrideSeparations known
+ {
+ currentpagedevice/OverrideSeparations get
+ {
+ /HqnSpots /ProcSet resourcestatus
+ {
+ pop pop pop true
+ }if
+ }if
+ }if
+ {
+ AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not
+ }{
+ gsave
+ [/Separation AGMCORE_name /DeviceGray {}]setcolorspace
+ false
+ currentpagedevice/SeparationColorNames 2 copy known
+ {
+ get
+ { AGMCORE_name eq or}forall
+ not
+ }{
+ pop pop pop true
+ }ifelse
+ grestore
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }def
+ }ifelse
+ /convert_to_process where {pop}{
+ /convert_to_process
+ {
+ dup length 0 eq
+ {
+ pop false
+ }{
+ AGMCORE_host_sep
+ {
+ true exch
+ {
+ convert_spot_to_process and
+ }
+ forall
+ }{
+ false exch
+ {
+ convert_spot_to_process or
+ }
+ forall
+ }ifelse
+ }ifelse
+ }def
+ }ifelse
+ AGMCORE_host_sep AGMCORE_will_host_separate not and {
+ /AGMCORE_cur_err /AGMCORE_color_space_onhost_seps def
+ AGMCORE_color_space_onhost_seps
+ }if
+ /AGMCORE_avoid_L2_sep_space
+ version cvr 2012 lt
+ level2 and
+ AGMCORE_producing_seps not and
+ def
+ /AGMCORE_is_cmyk_sep
+ AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or
+ def
+ /AGM_avoid_0_cmyk where{
+ pop AGM_avoid_0_cmyk
+ }{
+ AGM_preserve_spots
+ userdict/Adobe_AGM_OnHost_Seps known
+ userdict/Adobe_AGM_InRip_Seps known or
+ not and
+ }ifelse
+ {
+ /setcmykcolor[
+ {
+ 4 copy add add add 0 eq currentoverprint and{
+ pop 0.0005
+ }if
+ }/exec cvx
+ /AGMCORE_&setcmykcolor load dup type/operatortype ne{
+ /exec cvx
+ }if
+ ]cvx def
+ }if
+ AGMCORE_host_sep{
+ /AGMCORE_get_ink_data
+ AGMCORE_cyan_plate{
+ {pop pop pop}
+ }{
+ AGMCORE_magenta_plate{
+ {4 3 roll pop pop pop}
+ }{
+ AGMCORE_yellow_plate{
+ {4 2 roll pop pop pop}
+ }{
+ {4 1 roll pop pop pop}
+ }ifelse
+ }ifelse
+ }ifelse
+ def
+ /clip AGMCORE_key_known not{
+ Adobe_AGM_Core/AGMCORE_&clip /clip load put
+ /clip
+ {
+ current_spot_alias{
+ currentdict/InksUsed known{
+ [
+ InksUsed{
+ dup map_alias{
+ /Name get exch pop
+ }if
+ }forall
+ ]
+ /InksUsed xdf
+ }if
+ }if
+ AGMCORE_&clip
+ }def
+ }if
+ /eoclip AGMCORE_key_known not{
+ Adobe_AGM_Core/AGMCORE_&eoclip /eoclip load put
+ /eoclip
+ {
+ current_spot_alias{
+ currentdict/InksUsed known{
+ [
+ InksUsed{
+ dup map_alias{
+ /Name get exch pop
+ }if
+ }forall
+ ]
+ /InksUsed xdf
+ }if
+ }if
+ AGMCORE_&eoclip
+ }def
+ }if
+ }if
+ AGMCORE_in_rip_sep{
+ /setcustomcolor
+ {
+ exch aload pop
+ dup 7 1 roll inRip_spot_has_ink not {
+ 4 {4 index mul 4 1 roll}
+ repeat
+ /DeviceCMYK setcolorspace
+ 6 -2 roll pop pop
+ }{
+ Adobe_AGM_Core begin
+ /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf
+ end
+ [/Separation 4 -1 roll /DeviceCMYK
+ {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul}
+ ]
+ setcolorspace
+ }ifelse
+ setcolor
+ }ndf
+ /setseparationgray
+ {
+ [/Separation (All) /DeviceGray {}] setcolorspace_opt
+ 1 exch sub setcolor
+ }ndf
+ }{
+ /setseparationgray
+ {
+ AGMCORE_&setgray
+ }ndf
+ }ifelse
+ /findcmykcustomcolor
+ {
+ 5 makereadonlyarray
+ }ndf
+ /setcustomcolor
+ {
+ exch aload pop pop
+ 4 {4 index mul 4 1 roll} repeat
+ setcmykcolor pop
+ }ndf
+
+ /has_color
+ /colorimage where{
+ AGMCORE_producing_seps{
+ pop true
+ }{
+ systemdict eq
+ }ifelse
+ }{
+ false
+ }ifelse
+ def
+
+ /map_index
+ {
+ 1 index mul exch getinterval {255 div} forall
+ }def
+
+ level2{
+ /mo /moveto ldf
+ /li /lineto ldf
+ /cv /curveto ldf
+ /knockout_unitsq
+ {
+ 1 setgray
+ 0 0 1 1 rectfill
+ }def
+ /level2ScreenFreq{
+ begin
+ 60
+ HalftoneType 1 eq{
+ pop Frequency
+ }if
+ HalftoneType 2 eq{
+ pop GrayFrequency
+ }if
+ HalftoneType 5 eq{
+ pop Default level2ScreenFreq
+ }if
+ end
+ }def
+ /currentScreenFreq{
+ currenthalftone level2ScreenFreq
+ }def
+ level2 /setcolorspace AGMCORE_key_known not and{
+
+ /AGMCORE_&&&setcolorspace /setcolorspace ldf
+ /AGMCORE_ReplaceMappedColor
+ {
+ dup type dup /arraytype eq exch /packedarraytype eq or
+ {
+ dup 0 get dup /Separation eq
+ {
+ pop
+ dup length array copy
+ dup dup 1 get
+ current_spot_alias
+ {
+ dup map_alias
+ {
+ begin
+ /sep_colorspace_dict currentdict AGMCORE_gput
+ pop pop pop
+
+ [
+ /Separation Name
+ CSA map_csa
+ dup /MappedCSA xdf
+ /sep_colorspace_proc load
+ ]
+ dup Name
+ end
+ }if
+ }if
+ map_reserved_ink_name 1 exch put
+ }{
+ /DeviceN eq
+ {
+ dup length array copy
+ dup dup 1 get [
+ exch {
+ current_spot_alias{
+ dup map_alias{
+ /Name get exch pop
+ }if
+ }if
+ map_reserved_ink_name
+ } forall
+ ] 1 exch put
+ }if
+ }ifelse
+ }if
+ }def
+ /setcolorspace
+ {
+ dup type dup /arraytype eq exch /packedarraytype eq or
+ {
+ dup 0 get /Indexed eq
+ {
+ AGMCORE_distilling
+ {
+ /PhotoshopDuotoneList where
+ {
+ pop false
+ }{
+ true
+ }ifelse
+ }{
+ true
+ }ifelse
+ {
+ aload pop 3 -1 roll
+ AGMCORE_ReplaceMappedColor
+ 3 1 roll 4 array astore
+ }if
+ }{
+ AGMCORE_ReplaceMappedColor
+ }ifelse
+ }if
+ AGMCORE_&&&setcolorspace
+ }def
+ }if
+ }{
+
+ /adj
+ {
+ currentstrokeadjust{
+ transform
+ 0.25 sub round 0.25 add exch
+ 0.25 sub round 0.25 add exch
+ itransform
+ }if
+ }def
+ /mo{
+ adj moveto
+ }def
+ /li{
+ adj lineto
+ }def
+ /cv{
+ 6 2 roll adj
+ 6 2 roll adj
+ 6 2 roll adj curveto
+ }def
+ /knockout_unitsq
+ {
+ 1 setgray
+ 8 8 1 [8 0 0 8 0 0] {<ffffffffffffffff>} image
+ }def
+ /currentstrokeadjust{
+ /currentstrokeadjust AGMCORE_gget
+ }def
+ /setstrokeadjust{
+ /currentstrokeadjust exch AGMCORE_gput
+ }def
+ /currentScreenFreq{
+ currentscreen pop pop
+ }def
+ /setcolorspace
+ {
+ /currentcolorspace exch AGMCORE_gput
+ } def
+
+ /currentcolorspace
+ {
+ /currentcolorspace AGMCORE_gget
+ } def
+
+ /n_color_components
+ {
+ dup type /arraytype eq{
+ 0 get
+ }if
+ dup /DeviceGray eq{
+ pop 1
+ }{
+ /DeviceCMYK eq{
+ 4
+ }{
+ 3
+ }ifelse
+ }ifelse
+ } def
+
+ /setcolor_devicecolor
+ {
+ dup type /arraytype eq{
+ 0 get
+ }if
+ dup /DeviceGray eq{
+ pop setgray
+ }{
+ /DeviceCMYK eq{
+ setcmykcolor
+ }{
+ setrgbcolor
+ }ifelse
+ }ifelse
+ }def
+
+ /setcolor
+ {
+ currentcolorspace 0 get
+ dup /DeviceGray ne{
+ dup /DeviceCMYK ne{
+ dup /DeviceRGB ne{
+ dup /Separation eq{
+ pop
+ currentcolorspace 3 get exec
+ currentcolorspace 2 get
+ }{
+ dup /Indexed eq{
+ pop
+ currentcolorspace 3 get dup type /stringtype eq{
+ currentcolorspace 1 get n_color_components
+ 3 -1 roll map_index
+ }{
+ exec
+ }ifelse
+ currentcolorspace 1 get
+ }{
+ /AGMCORE_cur_err /AGMCORE_invalid_color_space def
+ AGMCORE_invalid_color_space
+ }ifelse
+ }ifelse
+ }if
+ }if
+ }if
+ setcolor_devicecolor
+ } def
+ }ifelse
+
+ /sop /setoverprint ldf
+ /lw /setlinewidth ldf
+ /lc /setlinecap ldf
+ /lj /setlinejoin ldf
+ /ml /setmiterlimit ldf
+ /dsh /setdash ldf
+ /sadj /setstrokeadjust ldf
+ /gry /setgray ldf
+ /rgb /setrgbcolor ldf
+ /cmyk /setcmykcolor ldf
+ /sep /setsepcolor ldf
+ /idx /setindexedcolor ldf
+ /colr /setcolor ldf
+ /csacrd /set_csa_crd ldf
+ /sepcs /setsepcolorspace ldf
+ /idxcs /setindexedcolorspace ldf
+ /cp /closepath ldf
+ /clp /clp_npth ldf
+ /eclp /eoclp_npth ldf
+ /spclp /stkpath_clp_npth ldf
+ /f /fill ldf
+ /ef /eofill ldf
+ /s /stroke ldf
+ /sclp /stk_n_clp_npth ldf
+ /nclp /npth_clp ldf
+ /gset /graphic_setup ldf
+ /gcln /graphic_cleanup ldf
+
+ currentdict{
+ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and {
+ bind
+ }if
+ def
+ }forall
+}def
+/page_trailer
+{
+ end
+}def
+/doc_trailer{
+}def
+systemdict /findcolorrendering known{
+ /findcolorrendering systemdict /findcolorrendering get def
+}if
+systemdict /setcolorrendering known{
+ /setcolorrendering systemdict /setcolorrendering get def
+}if
+/test_cmyk_color_plate
+{
+ gsave
+ setcmykcolor currentgray 1 ne
+ grestore
+}def
+/inRip_spot_has_ink
+{
+ dup Adobe_AGM_Core/AGMCORE_name xddf
+ convert_spot_to_process not
+}def
+/current_ink
+{
+ dup length 0 eq{
+ pop true
+ }{
+ Adobe_AGM_Core/ink_result false put
+ {
+ dup /ProcessCyan eq{
+ AGMCORE_cyan_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /ProcessMagenta eq{
+ AGMCORE_magenta_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /ProcessYellow eq{
+ AGMCORE_yellow_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /ProcessBlack eq{
+ AGMCORE_black_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /sep_colorspace_dict AGMCORE_gget dup null eq{
+ pop false ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ /Name get eq{
+ 1 setsepcolor
+ currentgray 1 ne ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ false ink_result or Adobe_AGM_Core/ink_result xddf
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ pop
+ } forall
+ ink_result
+ }ifelse
+}def
+/map255_to_range
+{
+ 1 index sub
+ 3 -1 roll 255 div mul add
+}def
+/set_csa_crd
+{
+ /sep_colorspace_dict null AGMCORE_gput
+ begin
+ CSA map_csa setcolorspace_opt
+ set_crd
+ end
+}
+def
+/setsepcolor
+{
+
+ /sep_colorspace_dict AGMCORE_gget begin
+ dup /sep_tint exch AGMCORE_gput
+ TintProc
+ end
+} def
+/sep_colorspace_proc
+{
+ Adobe_AGM_Core/AGMCORE_tmp xddf
+ /sep_colorspace_dict AGMCORE_gget begin
+ currentdict/Components known{
+ Components aload pop
+ TintMethod/Lab eq{
+ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat
+ LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll
+ }{
+ TintMethod/Subtractive eq{
+ NComponents{
+ AGMCORE_tmp mul NComponents 1 roll
+ }repeat
+ }{
+ NComponents{
+ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll
+ } repeat
+ }ifelse
+ }ifelse
+ }{
+ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get
+ aload pop
+ }ifelse
+ end
+} def
+/sep_colorspace_gray_proc
+{
+ Adobe_AGM_Core/AGMCORE_tmp xddf
+ /sep_colorspace_dict AGMCORE_gget begin
+ GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get
+ end
+} def
+/sep_proc_name
+{
+ dup 0 get
+ dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{
+ pop [/DeviceGray]
+ /sep_colorspace_gray_proc
+ }{
+ /sep_colorspace_proc
+ }ifelse
+} def
+/setsepcolorspace
+{
+
+ current_spot_alias{
+ dup begin
+ Name map_alias{
+ exch pop
+ }if
+ end
+ }if
+ dup /sep_colorspace_dict exch AGMCORE_gput
+ begin
+ /MappedCSA CSA map_csa def
+ Adobe_AGM_Core/AGMCORE_sep_special Name dup () eq exch (All) eq or ddf
+
+ AGMCORE_avoid_L2_sep_space{
+ [/Indexed MappedCSA sep_proc_name 255 exch
+ { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx
+ ] setcolorspace_opt
+ /TintProc {
+ 255 mul round cvi setcolor
+ }bdf
+ }{
+ MappedCSA 0 get /DeviceCMYK eq
+ currentdict/Components known and
+ AGMCORE_sep_special not and{
+ /TintProc [
+ Components aload pop Name findcmykcustomcolor
+ /exch cvx /setcustomcolor cvx
+ ] cvx bdf
+ }{
+ AGMCORE_host_sep Name (All) eq and{
+ /TintProc {
+ 1 exch sub setseparationgray
+ }bdf
+ }{
+ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and
+ AGMCORE_host_sep or
+ Name () eq and{
+ /TintProc [
+ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{
+ cvx /setcmykcolor cvx
+ }{
+ cvx /setgray cvx
+ }ifelse
+ ] cvx bdf
+ }{
+ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{
+ /TintProc [
+ /dup cvx
+ MappedCSA sep_proc_name cvx exch
+ 0 get /DeviceGray eq{
+ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx
+ }if
+ /Name cvx /findcmykcustomcolor cvx /exch cvx
+
+ AGMCORE_host_sep{
+ AGMCORE_is_cmyk_sep
+ }{
+ Name inRip_spot_has_ink not
+ }ifelse
+ {
+ /pop cvx 1
+ }if
+ /setcustomcolor cvx
+ ] cvx bdf
+ }{
+ /TintProc /setcolor ldf
+
+ [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ set_crd
+ setsepcolor
+ end
+} def
+/setindexedcolorspace
+{
+ dup /indexed_colorspace_dict exch AGMCORE_gput
+ begin
+ /MappedCSA CSA map_csa def
+ AGMCORE_host_sep level2 not and{
+ 0 0 0 0 setcmykcolor
+ }{
+ [/Indexed MappedCSA
+ level2 not has_color not and{
+ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{
+ pop [/DeviceGray]
+ }if
+ HiVal GrayLookup
+ }{
+ HiVal
+ currentdict/RangeArray known{
+ {
+ /indexed_colorspace_dict AGMCORE_gget begin
+ Lookup exch
+ dup HiVal gt{
+ pop HiVal
+ }if
+ NComponents mul NComponents getinterval {} forall
+ NComponents 1 sub -1 0{
+ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range
+ NComponents 1 roll
+ }for
+ end
+ } bind
+ }{
+ Lookup
+ }ifelse
+ }ifelse
+ ] setcolorspace_opt
+
+ set_crd
+ }ifelse
+ end
+}def
+/setindexedcolor
+{
+ AGMCORE_host_sep{
+ /indexed_colorspace_dict AGMCORE_gget/Lookup get 4 3 -1 roll map_index setcmykcolor
+ }{
+ setcolor
+ }ifelse
+} def
+/ignoreimagedata
+{
+ currentoverprint not{
+ gsave
+ dup begin
+ 1 setgray
+ 0 0 ImageMatrix itransform
+ Width Height ImageMatrix idtransform rectfill
+ end
+ grestore
+ }if
+ consumeimagedata
+}def
+/add_csa
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_CSA_cache xput
+ end
+}def
+/map_csa
+{
+ dup type /nametype eq{
+ Adobe_AGM_Core/AGMCORE_CSA_cache get exch get
+ }if
+}def
+/add_csd
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_CSD_cache xput
+ end
+}def
+/get_csd
+{
+ dup type /nametype eq{
+ Adobe_AGM_Core/AGMCORE_CSD_cache get exch get
+ }if
+}def
+/get_csd_by_name
+{
+ dup type dup /nametype eq exch /stringtype eq or{
+ Adobe_AGM_Core begin
+ /AGMCORE_CSD_Name xdf
+ AGMCORE_CSD_cache
+ {
+ dup /Name get AGMCORE_CSD_Name eq
+ {
+ exch pop exit
+ }{
+ pop
+ }ifelse
+ pop
+ }forall
+ end
+ }if
+}def
+/cachepattern_level2
+{
+ 4 dict begin
+ /comparebuffer exch def
+ /holdbuffer exch def
+ /readbuffer 1024 string def
+ /LZWFilter holdbuffer /LZWEncode filter def
+ {
+ currentfile readbuffer readline not
+ {pop exit}
+ if
+ dup LZWFilter exch writestring
+ LZWFilter (\n) writestring
+ comparebuffer eq
+ {exit}
+ if
+ }loop
+ LZWFilter closefile
+ end
+}def
+/cachepattern_level3
+{
+ 3 dict begin
+ /comparebuffer exch def
+ /readbuffer 1024 string def
+ /DoEOL false def
+ {
+ DoEOL
+ {
+ (\n)
+ /DoEOL false def
+ }
+ {
+ currentfile readbuffer readline not
+ {pop ()}
+ {
+ dup length 0 eq
+ { pop(\n)}
+ {
+ dup comparebuffer eq
+ {pop ()}
+ {/DoEOL true def}
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ } /ReusableStreamDecode filter
+ end
+}def
+/add_pattern
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_pattern_cache xput
+ end
+}def
+/get_pattern
+{
+ dup type /nametype eq{
+ Adobe_AGM_Core/AGMCORE_pattern_cache get exch get
+ }if
+}def
+/make_pattern
+{
+ dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform
+ exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub
+ exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub
+ matrix translate exch matrix concatmatrix
+ makepattern
+}def
+/set_pattern
+{
+ dup /PatternType get 1 eq{
+ dup /PaintType get 1 eq{
+ false sop [/DeviceGray] setcolorspace 0 setgray
+ }if
+ }if
+ setpattern
+}def
+/setcolorspace_opt
+{
+ dup currentcolorspace eq{
+ pop
+ }{
+ setcolorspace
+ }ifelse
+}def
+/updatecolorrendering
+{
+
+ currentcolorrendering/Intent known{
+ currentcolorrendering/Intent get
+ }{
+ null
+ }ifelse
+
+ Intent ne{
+ false
+ Intent
+ AGMCORE_CRD_cache {
+ exch pop
+ begin
+ dup Intent eq{
+ currentdict setcolorrendering_opt
+ end
+ exch pop true exch
+ exit
+ }if
+ end
+ } forall
+ pop
+ not{
+ systemdict /findcolorrendering known{
+ Intent findcolorrendering pop
+ /ColorRendering findresource
+ dup length dict copy
+ setcolorrendering_opt
+ }if
+ }if
+ }if
+} def
+/add_crd
+{
+ AGMCORE_CRD_cache 3 1 roll put
+}def
+/set_crd
+{
+ AGMCORE_host_sep not level2 and{
+ currentdict/CRD known{
+ AGMCORE_CRD_cache CRD get dup null ne{
+ setcolorrendering_opt
+ }{
+ pop
+ }ifelse
+ }{
+ currentdict/Intent known{
+ updatecolorrendering
+ }if
+ }ifelse
+ }if
+}def
+/setcolorrendering_opt
+{
+ dup currentcolorrendering eq{
+ pop
+ }{
+ begin
+ /Intent Intent def
+ currentdict
+ end
+ setcolorrendering
+ }ifelse
+}def
+/cdndf
+{
+ exch dup currentdict exch known{
+ pop pop
+ }{
+ exch def
+ }ifelse
+}def
+/cpaint_gcomp
+{
+ convert_to_process Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf
+ Adobe_AGM_Core/AGMCORE_ConvertToProcess get not
+ {
+ (%end_cpaint_gcomp) flushinput
+ }if
+}def
+/cpaint_gsep
+{
+ Adobe_AGM_Core/AGMCORE_ConvertToProcess get
+ {
+ (%end_cpaint_gsep) flushinput
+ }if
+}def
+/cpaint_gend
+{
+ newpath
+}def
+/AGMCORE_ctm_stack bdict
+ /push_ctm {
+ stack length size le{
+ stack dup length 2 mul array
+ dup /stack exch def
+ copy pop
+ }if
+ stack size 3 -1 roll put
+ /size size 1 add def
+ }
+ /pop_ctm {
+ /size size 1 sub def
+ size 0 lt{
+ /size 0 def
+ }if
+ stack size get
+ }
+ /stack 1 array
+ /size 0
+edict
+def
+/save_ctm
+{
+ matrix currentmatrix AGMCORE_ctm_stack begin
+ push_ctm
+ end
+}def
+/restore_ctm
+{
+ AGMCORE_ctm_stack begin
+ pop_ctm
+ end
+ setmatrix
+}def
+/path_rez
+{
+ dup 0 ne{
+ AGMCORE_deviceDPI exch div
+ dup 1 lt{
+ pop 1
+ }if
+ setflat
+ }{
+ pop
+ }ifelse
+}def
+/rdcmntline {
+ currentfile AGMCORE_str256 readline pop
+ (%) anchorsearch {pop} if
+} def
+/set_spot_alias_ary
+{
+ /AGMCORE_SpotAliasAry where{
+ pop pop
+ }{
+ Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf
+ true set_spot_alias
+ }ifelse
+}def
+/set_spot_alias
+{
+ /AGMCORE_SpotAliasAry where{
+ /AGMCORE_current_spot_alias 3 -1 roll put
+ }{
+ pop
+ }ifelse
+}def
+/current_spot_alias
+{
+ /AGMCORE_SpotAliasAry where{
+ /AGMCORE_current_spot_alias get
+ }{
+ false
+ }ifelse
+}def
+/map_alias
+{
+ /AGMCORE_SpotAliasAry where{
+ begin
+ /AGMCORE_name xdf
+ false
+ AGMCORE_SpotAliasAry{
+ dup/Name get AGMCORE_name eq{
+ save exch
+ /Adobe_AGM_Core currentdict def
+ /CSD get get_csd
+ exch restore
+ exch pop true
+ exit
+ }{
+ pop
+ }ifelse
+ }forall
+ end
+ }{
+ pop false
+ }ifelse
+}bdf
+/spot_alias
+{
+ true set_spot_alias
+
+ /AGMCORE_&setcustomcolor AGMCORE_key_known not {
+ Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put
+ } if
+ /customcolor_tint 1 AGMCORE_gput
+
+ Adobe_AGM_Core begin
+ /setcustomcolor
+ {
+
+ dup /customcolor_tint exch AGMCORE_gput
+
+ current_spot_alias{
+ 1 index 4 get map_alias{
+ mark 3 1 roll
+ setsepcolorspace
+ counttomark 0 ne{
+ setsepcolor
+ }if
+ pop
+ pop
+ }{
+ AGMCORE_&setcustomcolor
+ }ifelse
+ }{
+ AGMCORE_&setcustomcolor
+ }ifelse
+ }bdf
+ end
+}def
+/begin_feature
+{
+ Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put
+ count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put
+ {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if
+}def
+/end_feature
+{
+ 2 dict begin
+ /spd /setpagedevice load def
+ /setpagedevice { get_gstate spd set_gstate } def
+ stopped{$error/newerror false put}if
+ end
+ count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse
+ countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse
+ {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if
+}def
+/set_negative
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_inverting exch def
+ level2{
+ currentpagedevice/NegativePrint known{
+ currentpagedevice/NegativePrint get Adobe_AGM_Core/AGMCORE_inverting get ne{
+ true begin_feature true{
+ bdict /NegativePrint Adobe_AGM_Core/AGMCORE_inverting get edict setpagedevice
+ }end_feature
+ }if
+ /AGMCORE_inverting false def
+ }if
+ }if
+ AGMCORE_inverting{
+ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer
+ gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse
+ fill grestore
+ }if
+ end
+}def
+/lw_save_restore_override {
+ /md where {
+ pop
+ md begin
+ /pmSVsetup{} def
+ /endp{}def
+ /pse{}def
+ /psb{}def
+ /orig_showpage where
+ {pop}
+ {/orig_showpage /showpage load def}
+ ifelse
+ /showpage {orig_showpage gR} def
+ end
+ }if
+}def
+/pscript_showpage_override {
+ /NTPSOct95 where
+ {
+ begin
+ showpage
+ save
+ /showpage /restore load def
+ /restore {exch pop}def
+ end
+ }if
+}def
+/driver_media_override
+{
+ /md where {
+ pop
+ md /initializepage known {
+ md /initializepage {} put
+ } if
+ md /rC known {
+ md /rC {4{pop}repeat} put
+ } if
+ }if
+
+ Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put
+}def
+/driver_check_media_override
+{
+ Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne
+ {
+ Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix
+ }if
+}def
+AGMCORE_err_strings begin
+ /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def
+ /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def
+ /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def
+end
+end
+systemdict /setpacking known
+{
+ setpacking
+} if
+%%EndResource
+%%BeginResource: procset Adobe_CoolType_Core 2.12 0
+%%Copyright: Copyright 1997-2001 Adobe Systems Incorporated. All Rights Reserved.
+%%Version: 2.12 0
+userdict/Adobe_CoolType_Core 60 dict dup begin put/Level2? systemdict
+/languagelevel known dup{pop systemdict/languagelevel get 2 ge}if def Level2?
+not{/currentglobal false def/setglobal/pop load def/gcheck{pop false}bind def
+/currentpacking false def/setpacking/pop load def/SharedFontDirectory 0 dict
+def}if currentpacking true setpacking/@_SaveStackLevels{Adobe_CoolType_Data
+begin @opStackCountByLevel @opStackLevel 2 copy known not{2 copy 3 dict dup
+/args 7 index 5 add array put put get}{get dup/args get dup length 3 index lt{
+dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch/args
+exch put}{pop}ifelse}ifelse begin count 2 sub 1 index lt{pop count 1 sub}if
+dup/argCount exch def dup 0 gt{exch 1 index 2 add 1 roll args exch 0 exch
+getinterval astore pop}{pop}ifelse count 1 sub/restCount exch def end
+/@opStackLevel @opStackLevel 1 add def countdictstack 1 sub
+ at dictStackCountByLevel exch @dictStackLevel exch put/@dictStackLevel
+ at dictStackLevel 1 add def end}bind def/@_RestoreStackLevels{
+Adobe_CoolType_Data begin/@opStackLevel @opStackLevel 1 sub def
+ at opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt{{pop
+}repeat}{pop}ifelse args 0 argCount getinterval{}forall end/@dictStackLevel
+ at dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end
+countdictstack exch sub dup 0 gt{{end}repeat}{pop}ifelse}bind def
+/@_PopStackLevels{Adobe_CoolType_Data begin/@opStackLevel @opStackLevel 1 sub
+def/@dictStackLevel @dictStackLevel 1 sub def end}bind def/@Raise{exch cvx
+exch errordict exch get exec stop}bind def/@ReRaise{cvx $error/errorname get
+errordict exch get exec stop}bind def/@Stopped{0 @#Stopped}bind def/@#Stopped{
+ at _SaveStackLevels stopped{@_RestoreStackLevels true}{@_PopStackLevels false}
+ifelse}bind def/@Arg{Adobe_CoolType_Data begin @opStackCountByLevel
+ at opStackLevel 1 sub get/args get exch get end}bind def/doc_setup{
+Adobe_CoolType_Core begin/mov/moveto load def/nfnt/newencodedfont load def
+/mfnt/makefont load def/sfnt/setfont load def/ufnt/undefinefont load def/chp
+/charpath load def/awsh/awidthshow load def/wsh/widthshow load def/ash/ashow
+load def/sh/show load def end userdict/Adobe_CoolType_Data 6 dict dup begin
+/AddWidths? false def/CC 0 def/charcode 2 string def/@opStackCountByLevel 32
+dict def/@opStackLevel 0 def/@dictStackCountByLevel 32 dict def
+/@dictStackLevel 0 def end put}bind def/doc_trailer{currentdict
+Adobe_CoolType_Core eq{end}if}bind def/page_setup{Adobe_CoolType_Core begin}
+bind def/page_trailer{end}bind def/unload{systemdict/languagelevel known{
+systemdict/languagelevel get 2 ge{userdict/Adobe_CoolType_Core 2 copy known{
+undef}{pop pop}ifelse}if}if}bind def/ndf{1 index where{pop pop pop}{dup xcheck
+{bind}if def}ifelse}def/findfont dup systemdict begin userdict begin
+/globaldict where{/globaldict get begin}if dup where pop exch get/globaldict
+where{pop end}if end end def/systemfindfont/findfont load def/undefinefont{pop
+}ndf/copyfont{currentglobal 3 1 roll 1 index gcheck setglobal dup null eq{0}{
+dup length}ifelse 2 index length add 1 add dict begin exch{1 index/FID eq{pop
+pop}{def}ifelse}forall dup null eq{pop}{{def}forall}ifelse currentdict end
+exch setglobal}bind def/copyarray{currentglobal exch dup gcheck setglobal dup
+length array copy exch setglobal}bind def/newencodedfont{currentglobal{
+SharedFontDirectory 3 index known{SharedFontDirectory 3 index get
+/FontReferenced known}{false}ifelse}{FontDirectory 3 index known{FontDirectory
+3 index get/FontReferenced known}{SharedFontDirectory 3 index known{
+SharedFontDirectory 3 index get/FontReferenced known}{false}ifelse}ifelse}
+ifelse dup{3 index findfont/FontReferenced get 2 index findfont ne{pop false}
+if}if{pop 1 index findfont/Encoding get exch 0 1 255{2 copy get 3 index 3 1
+roll put}for pop pop pop}{findfont dup dup maxlength 2 add dict begin exch{1
+index/FID ne{def}{pop pop}ifelse}forall/FontReferenced exch def/Encoding exch
+dup length array copy def/FontName 1 index dup type/stringtype eq{cvn}if def
+currentdict end definefont pop}ifelse}bind def/SetSubstituteStrategy{
+$SubstituteFont begin dup type/dicttype ne{0 dict}if currentdict/$Strategies
+known{exch $Strategies exch 2 copy known{get 2 copy maxlength exch maxlength
+add dict begin{def}forall{def}forall currentdict dup/$Init known{dup/$Init get
+exec}if end/$Strategy exch def}{pop pop pop}ifelse}{pop pop}ifelse end}bind
+def/scff{$SubstituteFont begin dup type/stringtype eq{dup length exch}{null}
+ifelse/$sname exch def/$slen exch def end{findfont}@Stopped{dup length dup 21
+add string dup 4 3 roll 0 exch 128 string cvs putinterval exch 1 index exch
+(_was-malformed-so-was)putinterval cvn{findfont}@Stopped{pop/Courier findfont}
+if}if $SubstituteFont begin/$sname null def/$slen 0 def end}bind def
+/isWidthsOnlyFont{dup/WidthsOnly known{pop pop true}{dup/FDepVector known{
+/FDepVector get{isWidthsOnlyFont dup{exit}if}forall}{dup/FDArray known{
+/FDArray get{isWidthsOnlyFont dup{exit}if}forall}{pop}ifelse}ifelse}ifelse}
+bind def/?set{$SubstituteFont begin/$substituteFound false def/$fontname 4
+index def/$doSmartSub false def end 3 index findfont $SubstituteFont begin
+$substituteFound{false}{dup/FontName known{dup/FontName get $fontname eq 1
+index/DistillerFauxFont known not and/currentdistillerparams where{pop false 2
+index isWidthsOnlyFont not and}if}{false}ifelse}ifelse exch pop/$doSmartSub
+true def end{exch pop exch pop exch 2 dict dup/Found 3 index put exch findfont
+exch}{exch exec exch findfont 2 dict dup/Downloaded 6 5 roll put}ifelse dup
+/FontName 4 index put copyfont definefont pop}bind def/?str1 256 string def
+/?str2 256 string def/?add{1 index type/integertype eq{exch true 4 2}{false 3
+1}ifelse roll 1 index findfont dup/Widths known{Adobe_CoolType_Data/AddWidths?
+true put gsave dup 1000 scalefont setfont}if/Downloaded known{exec exch{exch
+?str2 cvs exch findfont/Downloaded get 1 dict begin/Downloaded 1 index def
+?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1
+index add ?str1 2 index(*)putinterval ?str1 0 2 index getinterval cvn findfont
+?str1 3 index(+)putinterval 2 dict dup/FontName ?str1 0 6 index getinterval
+cvn put dup/Downloaded Downloaded put end copyfont dup/FontName get exch
+definefont pop pop pop}{pop}ifelse}{pop exch{findfont dup/Found get dup length
+exch ?str1 cvs pop ?str1 1 index(+)putinterval ?str1 1 index 1 add 4 index
+?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add
+getinterval cvn 1 dict exch 1 index exch/FontName exch put copyfont dup
+/FontName get exch definefont pop}{pop}ifelse}ifelse Adobe_CoolType_Data
+/AddWidths? get{grestore Adobe_CoolType_Data/AddWidths? false put}if}bind def
+/?sh{currentfont/Downloaded known{exch}if pop}bind def/?chp{currentfont
+/Downloaded known{pop}{false chp}ifelse}bind def/?mv{currentfont/Downloaded
+known{moveto pop pop}{pop pop moveto}ifelse}bind def setpacking userdict
+/$SubstituteFont 25 dict put 1 dict begin/SubstituteFont dup $error exch 2
+copy known{get}{pop pop{pop/Courier}bind}ifelse def/currentdistillerparams
+where dup{pop pop currentdistillerparams/CannotEmbedFontPolicy 2 copy known{
+get/Error eq}{pop pop false}ifelse}if not{countdictstack array dictstack 0 get
+begin userdict begin $SubstituteFont begin/$str 128 string def/$fontpat 128
+string def/$slen 0 def/$sname null def/$match false def/$fontname null def
+/$substituteFound false def/$doSmartSub true def/$depth 0 def/$fontname null
+def/$italicangle 26.5 def/$dstack null def/$Strategies 10 dict dup begin
+/$Type3Underprint{currentglobal exch false setglobal 11 dict begin/UseFont
+exch $WMode 0 ne{dup length dict copy dup/WMode $WMode put/UseFont exch
+definefont}if def/FontName $fontname dup type/stringtype eq{cvn}if def
+/FontType 3 def/FontMatrix[.001 0 0 .001 0 0]def/Encoding 256 array dup 0 1
+255{/.notdef put dup}for pop def/FontBBox[0 0 0 0]def/CCInfo 7 dict dup begin
+/cc null def/x 0 def/y 0 def end def/BuildChar{exch begin CCInfo begin 1
+string dup 0 3 index put exch pop/cc exch def UseFont 1000 scalefont setfont
+cc stringwidth/y exch def/x exch def x y setcharwidth $SubstituteFont
+/$Strategy get/$Underprint get exec 0 0 moveto cc show x y moveto end end}bind
+def currentdict end exch setglobal}bind def/$GetaTint 2 dict dup begin
+/$BuildFont{dup/WMode known{dup/WMode get}{0}ifelse/$WMode exch def $fontname
+exch dup/FontName known{dup/FontName get dup type/stringtype eq{cvn}if}{
+/unnamedfont}ifelse exch $deepcopyfont exch 1 index exch/FontBasedOn exch put
+dup/FontName $fontname dup type/stringtype eq{cvn}if put definefont}bind def
+/$Underprint{gsave x abs y abs gt{/y 1000 def}{/x -1000 def 500 120 translate}
+ifelse Level2?{[/Separation(All)/DeviceCMYK{0 0 0 1 pop}]setcolorspace}{0
+setgray}ifelse 10 setlinewidth x .8 mul[7 3]{y mul 8 div 120 sub x 10 div exch
+moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave
+Level2?{.2 setcolor}{.8 setgray}ifelse fill grestore stroke}forall pop
+grestore}bind def end def/$Oblique 1 dict dup begin/$BuildFont{currentglobal
+exch dup gcheck setglobal null copyfont begin/FontBasedOn currentdict/FontName
+known{FontName dup type/stringtype eq{cvn}if}{/unnamedfont}ifelse def/FontName
+$fontname dup type/stringtype eq{cvn}if def/currentdistillerparams where{pop}{
+/FontInfo currentdict/FontInfo known{FontInfo null copyfont}{2 dict}ifelse dup
+begin/ItalicAngle $italicangle def/FontMatrix FontMatrix[1 0 ItalicAngle dup
+sin exch cos div 1 0 0]matrix concatmatrix readonly end 4 2 roll def def}
+ifelse FontName currentdict end definefont exch setglobal}bind def end def
+/$None 1 dict dup begin/$BuildFont{}bind def end def end def/$Oblique
+SetSubstituteStrategy/$findfontByEnum{dup type/stringtype eq{cvn}if dup
+/$fontname exch def $sname null eq{$str cvs dup length $slen sub $slen
+getinterval}{pop $sname}ifelse $fontpat dup 0(fonts/*)putinterval exch 7 exch
+putinterval/$match false def $SubstituteFont/$dstack countdictstack array
+dictstack put mark{$fontpat 0 $slen 7 add getinterval{/$match exch def exit}
+$str filenameforall}stopped{cleardictstack currentdict true $SubstituteFont
+/$dstack get{exch{1 index eq{pop false}{true}ifelse}{begin false}ifelse}forall
+pop}if cleartomark/$slen 0 def $match false ne{$match(fonts/)anchorsearch pop
+pop cvn}{/Courier}ifelse}bind def/$ROS 1 dict dup begin/Adobe 4 dict dup begin
+/Japan1[/Ryumin-Light/HeiseiMin-W3/GothicBBB-Medium/HeiseiKakuGo-W5
+/HeiseiMaruGo-W4/Jun101-Light]def/Korea1[/HYSMyeongJo-Medium/HYGoThic-Medium]
+def/GB1[/STSong-Light/STHeiti-Regular]def/CNS1[/MKai-Medium/MHei-Medium]def
+end def end def/$cmapname null def/$deepcopyfont{dup/FontType get 0 eq{1 dict
+dup/FontName/copied put copyfont begin/FDepVector FDepVector copyarray 0 1 2
+index length 1 sub{2 copy get $deepcopyfont dup/FontName/copied put/copied
+exch definefont 3 copy put pop pop}for def currentdict end}{$Strategies
+/$Type3Underprint get exec}ifelse}bind def/$buildfontname{length $str 1 index
+(-)putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname
+length add $str exch 0 exch getinterval cvn}bind def/$findfontByROS{/$fontname
+exch def $ROS Registry 2 copy known{get Ordering 2 copy known{get}{pop pop[]}
+ifelse}{pop pop[]}ifelse false exch{dup/CIDFont resourcestatus{pop pop save 1
+index/CIDFont findresource dup/WidthsOnly known{dup/WidthsOnly get}{false}
+ifelse exch pop exch restore{pop}{exch pop true exit}ifelse}{pop}ifelse}forall
+{$str cvs $buildfontname}{false(*){save exch dup/CIDFont findresource dup
+/WidthsOnly known{dup/WidthsOnly get not}{true}ifelse exch/CIDSystemInfo get
+dup/Registry get Registry eq exch/Ordering get Ordering eq and and{exch
+restore exch pop true exit}{pop restore}ifelse}$str/CIDFont resourceforall{
+$buildfontname}{$fontname $findfontByEnum}ifelse}ifelse}bind def end end
+currentdict/$error known currentdict/languagelevel known and dup{pop $error
+/SubstituteFont known}if dup{$error}{Adobe_CoolType_Core}ifelse begin{
+/SubstituteFont/CMap/Category resourcestatus{pop pop{$SubstituteFont begin
+/$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt
+and{$sname null eq{dup $str cvs dup length $slen sub $slen getinterval cvn}{
+$sname}ifelse dup/CMap resourcestatus{pop pop dup/$cmapname exch def/CMap
+findresource/CIDSystemInfo get{def}forall $findfontByROS}{128 string cvs dup
+(-)search{3 1 roll search{3 1 roll pop{dup cvi}stopped{pop pop pop pop pop
+$findfontByEnum}{4 2 roll pop pop exch length exch 2 index length 2 index sub
+exch 1 sub -1 0{$str cvs dup length 4 index 0 4 index 4 3 roll add getinterval
+exch 1 index exch 3 index exch putinterval dup/CMap resourcestatus{pop pop 4 1
+roll pop pop pop dup/$cmapname exch def/CMap findresource/CIDSystemInfo get{
+def}forall $findfontByROS true exit}{pop}ifelse}for dup type/booleantype eq{
+pop}{pop pop $findfontByEnum}ifelse}ifelse}{pop pop pop $findfontByEnum}ifelse
+}{pop pop $findfontByEnum}ifelse}ifelse}{//SubstituteFont exec}ifelse/$slen 0
+def end}}{{$SubstituteFont begin/$substituteFound true def dup length $slen gt
+$sname null ne or $slen 0 gt and{$findfontByEnum}{//SubstituteFont exec}ifelse
+end}}ifelse bind readonly def Adobe_CoolType_Core/scfindfont/systemfindfont
+load put}{/scfindfont{$SubstituteFont begin dup systemfindfont dup/FontName
+known{dup/FontName get dup 3 index ne}{/noname true}ifelse dup{
+/$origfontnamefound 2 index def/$origfontname 4 index def/$substituteFound
+true def}if exch pop{$slen 0 gt $sname null ne 3 index length $slen gt or and{
+pop dup $findfontByEnum findfont dup maxlength 1 add dict begin{1 index/FID eq
+{pop pop}{def}ifelse}forall currentdict end definefont dup/FontName known{dup
+/FontName get}{null}ifelse $origfontnamefound ne{$origfontname $str cvs print
+( substitution revised, using )print dup/FontName known{dup/FontName get}{
+(unspecified font)}ifelse $str cvs print(.
+)print}if}{exch pop}ifelse}{exch pop}ifelse end}bind def}ifelse end end
+Adobe_CoolType_Core/findfont{$SubstituteFont begin $depth 0 eq{/$fontname 1
+index dup type/stringtype ne{$str cvs}if def/$substituteFound false def}if
+/$depth $depth 1 add def end scfindfont $SubstituteFont begin/$depth $depth 1
+sub def $substituteFound $depth 0 eq and $doSmartSub and{currentdict/$Strategy
+known{$Strategy/$BuildFont get exec}if}if end}bind put}if end end
+%%EndResource
+%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.13 0
+%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated.
+%%Version: 1.13 0
+systemdict/languagelevel known dup{currentglobal false setglobal}{false}ifelse
+exch userdict/Adobe_CoolType_Utility 2 copy known{2 copy get dup maxlength 25
+add dict copy}{25 dict}ifelse put Adobe_CoolType_Utility begin/ct_Level2? exch
+def/ct_Clone? 1183615869 internaldict dup/CCRun known not exch/eCCRun known
+not ct_Level2? and or def/ct_UseNativeCapability? systemdict/composefont known
+def/ct_MakeOCF 35 dict def/ct_Vars 25 dict def/ct_GlyphDirProcs 6 dict def
+/ct_BuildCharDict 15 dict dup begin/charcode 2 string def/dst_string 1500
+string def/nullstring()def/usewidths? true def end def ct_Level2?{setglobal}{
+pop}ifelse ct_GlyphDirProcs begin/GetGlyphDirectory{systemdict/languagelevel
+known{pop/CIDFont findresource/GlyphDirectory get}{1 index/CIDFont
+findresource/GlyphDirectory get dup type/dicttype eq{dup dup maxlength exch
+length sub 2 index lt{dup length 2 index add dict copy 2 index/CIDFont
+findresource/GlyphDirectory 2 index put}if}if exch pop exch pop}ifelse +}def/+
+{systemdict/languagelevel known{currentglobal false setglobal 3 dict begin/vm
+exch def}{1 dict begin}ifelse/$ exch def systemdict/languagelevel known{vm
+setglobal/gvm currentglobal def $ gcheck setglobal}if ?{$ begin}if}def/?{$
+type/dicttype eq}def/|{userdict/Adobe_CoolType_Data known{Adobe_CoolType_Data
+/AddWidths? known{currentdict Adobe_CoolType_Data begin begin AddWidths?{
+Adobe_CoolType_Data/CC 3 index put ?{def}{$ 3 1 roll put}ifelse CC charcode
+exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put
+stringwidth 2 array astore currentfont/Widths get exch CC exch put}{?{def}{$ 3
+1 roll put}ifelse}ifelse end end}{?{def}{$ 3 1 roll put}ifelse}ifelse}{?{def}{
+$ 3 1 roll put}ifelse}ifelse}def/!{?{end}if systemdict/languagelevel known{gvm
+setglobal}if end}def/:{string currentfile exch readstring pop}executeonly def
+end ct_MakeOCF begin/ct_cHexEncoding[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09
+/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C
+/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F
+/c30/c31/c32/c33/c34/c35/c36/c37/c38/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42
+/c43/c44/c45/c46/c47/c48/c49/c4A/c4B/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55
+/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68
+/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B
+/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E
+/c8F/c90/c91/c92/c93/c94/c95/c96/c97/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1
+/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4
+/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7
+/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA
+/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED
+/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def
+/ct_CID_STR_SIZE 8000 def/ct_mkocfStr100 100 string def/ct_defaultFontMtx[.001
+0 0 .001 0 0]def/ct_1000Mtx[1000 0 0 1000 0 0]def/ct_raise{exch cvx exch
+errordict exch get exec stop}bind def/ct_reraise{cvx $error/errorname get
+(Error: )print dup( )cvs print errordict exch get exec stop
+}bind def/ct_cvnsi{1 index add 1 sub 1 exch 0 4 1 roll{2 index exch get exch 8
+bitshift add}for exch pop}bind def/ct_GetInterval{Adobe_CoolType_Utility
+/ct_BuildCharDict get begin/dst_index 0 def dup dst_string length gt{dup
+string/dst_string exch def}if 1 index ct_CID_STR_SIZE idiv/arrayIndex exch def
+2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub{dup 3 index
+add 2 index length le{2 index getinterval dst_string dst_index 2 index
+putinterval length dst_index add/dst_index exch def exit}{1 index length 1
+index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval
+pop dup dst_index add/dst_index exch def sub/arrayIndex arrayIndex 1 add def 2
+index dup length arrayIndex gt{arrayIndex get}{pop exit}ifelse 0}ifelse}loop
+pop pop pop dst_string 0 dst_index getinterval end}bind def ct_Level2?{
+/ct_resourcestatus currentglobal mark true setglobal{/unknowninstancename
+/Category resourcestatus}stopped{cleartomark setglobal true}{cleartomark
+currentglobal not exch setglobal}ifelse{{mark 3 1 roll/Category findresource
+begin ct_Vars/vm currentglobal put({ResourceStatus} stopped)0()/SubFileDecode
+filter cvx exec{cleartomark false}{{3 2 roll pop true}{cleartomark false}
+ifelse}ifelse ct_Vars/vm get setglobal end}}{{resourcestatus}}ifelse bind def
+/CIDFont/Category ct_resourcestatus{pop pop}{currentglobal true setglobal
+/Generic/Category findresource dup length dict copy dup/InstanceType/dicttype
+put/CIDFont exch/Category defineresource pop setglobal}ifelse
+ct_UseNativeCapability?{/CIDInit/ProcSet findresource begin 12 dict begin
+begincmap/CIDSystemInfo 3 dict dup begin/Registry(Adobe)def/Ordering(Identity)
+def/Supplement 0 def end def/CMapName/Identity-H def/CMapVersion 1 def
+/CMapType 1 def 1 begincodespacerange<0000><ffff>endcodespacerange 1
+begincidrange<0000><ffff>0 endcidrange endcmap CMapName currentdict/CMap
+defineresource pop end end}if}{/ct_Category 2 dict begin/CIDFont 10 dict def
+/ProcSet 2 dict def currentdict end def/defineresource{ct_Category 1 index 2
+copy known{get dup dup maxlength exch length eq{dup length 10 add dict copy
+ct_Category 2 index 2 index put}if 3 index 3 index put pop exch pop}{pop pop
+/defineresource/undefined ct_raise}ifelse}bind def/findresource{ct_Category 1
+index 2 copy known{get 2 index 2 copy known{get 3 1 roll pop pop}{pop pop
+/findresource/undefinedresource ct_raise}ifelse}{pop pop/findresource
+/undefined ct_raise}ifelse}bind def/resourcestatus{ct_Category 1 index 2 copy
+known{get 2 index known exch pop exch pop{0 -1 true}{false}ifelse}{pop pop
+/findresource/undefined ct_raise}ifelse}bind def/ct_resourcestatus
+/resourcestatus load def}ifelse/ct_CIDInit 2 dict begin/ct_cidfont_stream_init
+{{dup(Binary)eq{pop null currentfile ct_Level2?{{cid_BYTE_COUNT()
+/SubFileDecode filter}stopped{pop pop pop}if}if/readstring load exit}if dup
+(Hex)eq{pop currentfile ct_Level2?{{null exch/ASCIIHexDecode filter/readstring
+}stopped{pop exch pop(>)exch/readhexstring}if}{(>)exch/readhexstring}ifelse
+load exit}if/StartData/typecheck ct_raise}loop cid_BYTE_COUNT ct_CID_STR_SIZE
+le{2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put
+}{cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1
+exch{2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop}for 2
+index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch
+1 index length 1 sub exch put}ifelse cid_CIDFONT exch/GlyphData exch put 2
+index null eq{pop pop pop}{pop/readstring load 1 string exch{3 copy exec pop
+dup length 0 eq{pop pop pop pop pop true exit}if 4 index eq{pop pop pop pop
+false exit}if}loop pop}ifelse}bind def/StartData{mark{currentdict dup/FDArray
+get 0 get/FontMatrix get 0 get .001 eq{dup/CDevProc known not{/CDevProc
+1183615869 internaldict/stdCDevProc 2 copy known{get}{pop pop{pop pop pop pop
+pop 0 -1000 7 index 2 div 880}}ifelse def}if}{/CDevProc{pop pop pop pop pop 0
+1 cid_temp/cid_CIDFONT get/FDArray get 0 get/FontMatrix get 0 get div 7 index
+2 div 1 index .88 mul}def}ifelse/cid_temp 15 dict def cid_temp begin
+/cid_CIDFONT exch def 3 copy pop dup/cid_BYTE_COUNT exch def 0 gt{
+ct_cidfont_stream_init FDArray{/Private get dup/SubrMapOffset known{begin
+/Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2?{
+currentdict dup/SubrMapOffset undef dup/SubrCount undef/SDBytes undef}if end
+/cid_SD_BYTES exch def/cid_SUBR_COUNT exch def/cid_SUBR_MAP_OFFSET exch def
+/cid_SUBRS exch def cid_SUBR_COUNT 0 gt{GlyphData cid_SUBR_MAP_OFFSET
+cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub{
+exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch
+cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll
+GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put}
+for pop}if}{pop}ifelse}forall}if cleartomark pop pop end CIDFontName
+currentdict/CIDFont defineresource pop end end}stopped{cleartomark/StartData
+ct_reraise}if}bind def currentdict end def/ct_saveCIDInit{/CIDInit/ProcSet
+ct_resourcestatus{true}{/CIDInitC/ProcSet ct_resourcestatus}ifelse{pop pop
+/CIDInit/ProcSet findresource ct_UseNativeCapability?{pop null}{/CIDInit
+ct_CIDInit/ProcSet defineresource pop}ifelse}{/CIDInit ct_CIDInit/ProcSet
+defineresource pop null}ifelse ct_Vars exch/ct_oldCIDInit exch put}bind def
+/ct_restoreCIDInit{ct_Vars/ct_oldCIDInit get dup null ne{/CIDInit exch/ProcSet
+defineresource pop}{pop}ifelse}bind def/ct_BuildCharSetUp{1 index begin
+CIDFont begin Adobe_CoolType_Utility/ct_BuildCharDict get begin/ct_dfCharCode
+exch def/ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge{pop
+0}if/cid exch def{GlyphDirectory cid 2 copy known{get}{pop pop nullstring}
+ifelse dup length FDBytes sub 0 gt{dup FDBytes 0 ne{0 FDBytes ct_cvnsi}{pop 0}
+ifelse/fdIndex exch def dup length FDBytes sub FDBytes exch getinterval
+/charstring exch def exit}{pop cid 0 eq{/charstring nullstring def exit}if/cid
+0 def}ifelse}loop}def/ct_SetCacheDevice{0 0 moveto dup stringwidth 3 -1 roll
+true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto}
+def/ct_CloneSetCacheProc{1 eq{stringwidth pop -2 div -880 0 -1000 setcharwidth
+moveto}{usewidths?{currentfont/Widths get cid 2 copy known{get exch pop aload
+pop}{pop pop stringwidth}ifelse}{stringwidth}ifelse setcharwidth 0 0 moveto}
+ifelse}def/ct_Type3ShowCharString{ct_FDDict fdIndex 2 copy known{get}{
+currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup
+maxlength dict copy begin FDArray fdIndex get dup/FontMatrix 2 copy known{get}
+{pop pop ct_defaultFontMtx}ifelse/FontMatrix exch dup length array copy def
+/Private get/Private exch def/Widths rootfont/Widths get def/CharStrings 1
+dict dup/.notdef<d841272cf18f54fc13>dup length string copy put def currentdict
+end/ct_Type1Font exch definefont dup 5 1 roll put setglobal}ifelse dup
+/CharStrings get 1 index/Encoding get ct_dfCharCode get charstring put
+rootfont/WMode 2 copy known{get}{pop pop 0}ifelse exch 1000 scalefont setfont
+ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold{
+currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth
+setlinewidth stroke}{ct_str1 show}ifelse}def/ct_Type4ShowCharString{ct_dfDict
+ct_dfCharCode charstring FDArray fdIndex get dup/FontMatrix get dup
+ct_defaultFontMtx ct_matrixeq not{ct_1000Mtx matrix concatmatrix concat}{pop}
+ifelse/Private get Adobe_CoolType_Utility/ct_Level2? get not{ct_dfDict/Private
+3 -1 roll{put}1183615869 internaldict/superexec get exec}if 1183615869
+internaldict Adobe_CoolType_Utility/ct_Level2? get{1 index}{3 index/Private
+get mark 6 1 roll}ifelse dup/RunInt known{/RunInt get}{pop/CCRun}ifelse get
+exec Adobe_CoolType_Utility/ct_Level2? get not{cleartomark}if}bind def
+/ct_BuildCharIncremental{{Adobe_CoolType_Utility/ct_MakeOCF get begin
+ct_BuildCharSetUp ct_ShowCharString}stopped{stop}if end end end end}bind def
+/BaseFontNameStr(BF00)def/ct_Type1FontTemplate 14 dict begin/FontType 1 def
+/FontMatrix[.001 0 0 .001 0 0]def/FontBBox[-250 -250 1250 1250]def/Encoding
+ct_cHexEncoding def/PaintType 0 def currentdict end def/BaseFontTemplate 11
+dict begin/FontMatrix[.001 0 0 .001 0 0]def/FontBBox[-250 -250 1250 1250]def
+/Encoding ct_cHexEncoding def/BuildChar/ct_BuildCharIncremental load def
+ct_Clone?{/FontType 3 def/ct_ShowCharString/ct_Type3ShowCharString load def
+/ct_dfSetCacheProc/ct_CloneSetCacheProc load def/ct_SyntheticBold false def
+/ct_StrokeWidth 1 def}{/FontType 4 def/Private 1 dict dup/lenIV 4 put def
+/CharStrings 1 dict dup/.notdef<d841272cf18f54fc13>put def/PaintType 0 def
+/ct_ShowCharString/ct_Type4ShowCharString load def}ifelse/ct_str1 1 string def
+currentdict end def/BaseFontDictSize BaseFontTemplate length 5 add def
+/ct_matrixeq{true 0 1 5{dup 4 index exch get exch 3 index exch get eq and dup
+not{exit}if}for exch pop exch pop}bind def/ct_makeocf{15 dict begin exch/WMode
+exch def exch/FontName exch def/FontType 0 def/FMapType 2 def/FontMatrix
+matrix def/bfCount 1 index/CIDCount get 256 idiv 1 add dup 256 gt{pop 256}if
+def/Encoding 256 array 0 1 bfCount 1 sub{2 copy dup put pop}for bfCount 1 255{
+2 copy bfCount put pop}for def/FDepVector bfCount dup 256 lt{1 add}if array
+def BaseFontTemplate BaseFontDictSize dict copy begin/CIDFont exch def CIDFont
+/FontBBox known{CIDFont/FontBBox get/FontBBox exch def}if CIDFont/CDevProc
+known{CIDFont/CDevProc get/CDevProc exch def}if currentdict end
+BaseFontNameStr 3(0)putinterval 0 1 bfCount dup 256 eq{1 sub}if{FDepVector
+exch 2 index BaseFontDictSize dict copy begin dup/CIDFirstByte exch 256 mul
+def FontType 3 eq{/ct_FDDict 2 dict def}if currentdict end 1 index 16
+BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put}
+for ct_Clone?{/Widths 1 index/CIDFont get/GlyphDirectory get length dict def}
+if FontName currentdict end definefont ct_Clone?{gsave dup 1000 scalefont
+setfont ct_BuildCharDict begin/usewidths? false def currentfont/Widths get
+begin exch/CIDFont get/GlyphDirectory get{pop dup charcode exch 1 index 0 2
+index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore
+def}forall end/usewidths? true def end grestore}{exch pop}ifelse}bind def
+/ct_ComposeFont{ct_UseNativeCapability?{2 index/CMap ct_resourcestatus{pop pop
+exch pop}{/CIDInit/ProcSet findresource begin 12 dict begin begincmap/CMapName
+3 index def/CMapVersion 1 def/CMapType 1 def exch/WMode exch def/CIDSystemInfo
+3 dict dup begin/Registry(Adobe)def/Ordering CMapName ct_mkocfStr100 cvs
+(Adobe-)search{pop pop(-)search{dup length string copy exch pop exch pop}{pop
+(Identity)}ifelse}{pop(Identity)}ifelse def/Supplement 0 def end def 1
+begincodespacerange<0000><ffff>endcodespacerange 1 begincidrange<0000><ffff>0
+endcidrange endcmap CMapName currentdict/CMap defineresource pop end end}
+ifelse composefont}{3 2 roll pop 0 get/CIDFont findresource ct_makeocf}ifelse}
+bind def/ct_MakeIdentity{ct_UseNativeCapability?{1 index/CMap
+ct_resourcestatus{pop pop}{/CIDInit/ProcSet findresource begin 12 dict begin
+begincmap/CMapName 2 index def/CMapVersion 1 def/CMapType 1 def/CIDSystemInfo
+3 dict dup begin/Registry(Adobe)def/Ordering CMapName ct_mkocfStr100 cvs
+(Adobe-)search{pop pop(-)search{dup length string copy exch pop exch pop}{pop
+(Identity)}ifelse}{pop(Identity)}ifelse def/Supplement 0 def end def 1
+begincodespacerange<0000><ffff>endcodespacerange 1 begincidrange<0000><ffff>0
+endcidrange endcmap CMapName currentdict/CMap defineresource pop end end}
+ifelse composefont}{exch pop 0 get/CIDFont findresource ct_makeocf}ifelse}bind
+def currentdict readonly pop end end
+%%EndResource
+Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end
+%%BeginResource: procset Adobe_AGM_Image 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright (C) 2000-2000 Adobe Systems, Inc. All Rights Reserved.
+systemdict /setpacking known
+{
+ currentpacking
+ true setpacking
+} if
+userdict /Adobe_AGM_Image 65 dict dup begin put
+/Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def
+/nd{
+ null def
+}bind def
+/AGMIMG_&image nd
+/AGMIMG_&colorimage nd
+%%don't initialize AGMIMG_&customcolorimage, it wrecks havoc in a nested environment
+%%AGMIMG_ccimage_exists not {/AGMIMG_&customcolorimage nd} if
+/AGMIMG_&imagemask nd
+/AGMIMG_mbuf () def
+/AGMIMG_ybuf () def
+/AGMIMG_kbuf () def
+/AGMIMG_c 0 def
+/AGMIMG_m 0 def
+/AGMIMG_y 0 def
+/AGMIMG_k 0 def
+/AGMIMG_tmp nd
+/AGMIMG_imagestring0 nd
+/AGMIMG_imagestring1 nd
+/AGMIMG_imagestring2 nd
+/AGMIMG_imagestring3 nd
+/AGMIMG_imagestring4 nd
+/AGMIMG_imagestring5 nd
+/AGMIMG_cnt nd
+/AGMIMG_fsave nd
+/AGMIMG_colorAry nd
+/AGMIMG_override nd
+/AGMIMG_name nd
+/invert_image_samples nd
+/knockout_image_samples nd
+/img nd
+/sepimg nd
+/idximg nd
+/doc_setup
+{
+ Adobe_AGM_Core begin
+ Adobe_AGM_Image begin
+ /AGMIMG_&image systemdict/image get def
+ /AGMIMG_&imagemask systemdict/imagemask get def
+ /colorimage where{
+ pop
+ /AGMIMG_&colorimage /colorimage ldf
+ }if
+ end
+ end
+}def
+/page_setup
+{
+ Adobe_AGM_Image begin
+ /AGMIMG_ccimage_exists {/customcolorimage where
+ {
+ pop
+ /Adobe_AGM_OnHost_Seps where
+ {
+ pop false
+ }{
+ /Adobe_AGM_InRip_Seps where
+ {
+ pop false
+ }{
+ true
+ }ifelse
+ }ifelse
+ }{
+ false
+ }ifelse
+ }bdf
+ level2{
+ /invert_image_samples
+ {
+ Adobe_AGM_Image/AGMIMG_tmp Decode length ddf
+ /Decode [ Decode 1 get Decode 0 get] def
+ }def
+ /knockout_image_samples
+ {
+ Operator/imagemask ne{
+ /Decode [1 1] def
+ }if
+ }def
+ }{
+ /invert_image_samples
+ {
+ {1 exch sub} currenttransfer addprocs settransfer
+ }def
+ /knockout_image_samples
+ {
+ { pop 1 } currenttransfer addprocs settransfer
+ }def
+ }ifelse
+ /img /imageormask ldf
+ /sepimg /sep_imageormask ldf
+ /idximg /indexed_imageormask ldf
+ currentdict{
+ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{
+ bind
+ }if
+ def
+ }forall
+}def
+/page_trailer
+{
+ end
+}def
+/doc_trailer
+{
+}def
+/imageormask_sys
+{
+ begin
+ save mark
+ level2{
+ currentdict
+ Operator /imagemask eq{
+ AGMIMG_&imagemask
+ }{
+ AGMIMG_&image
+ }ifelse
+ }{
+ Width Height
+ Operator /imagemask eq{
+ Decode 0 get 1 eq Decode 1 get 0 eq and
+ ImageMatrix /DataSource load
+ AGMIMG_&imagemask
+ }{
+ BitsPerComponent ImageMatrix /DataSource load
+ AGMIMG_&image
+ }ifelse
+ }ifelse
+ cleartomark restore
+ end
+}def
+/overprint_plate
+{
+ currentoverprint{
+ 0 get
+ dup /DeviceGray eq{
+ pop AGMCORE_black_plate not
+ }{
+ /DeviceCMYK eq{
+ AGMCORE_is_cmyk_sep not
+ }if
+ }ifelse
+ }{
+ false
+ }ifelse
+}def
+/imageormask
+{
+ begin
+ SkipImageProc not{
+ save mark
+ level2 AGMCORE_host_sep not and{
+ currentdict
+ Operator /imagemask eq{
+ imagemask
+ }{
+ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{
+ [/Separation /Black /DeviceGray {}] setcolorspace
+ /Decode [ Decode 1 get Decode 0 get ] def
+ }if
+ image
+ }ifelse
+ }{
+ Width Height
+ Operator /imagemask eq{
+ Decode 0 get 1 eq Decode 1 get 0 eq and
+ ImageMatrix /DataSource load
+ AGMCORE_host_sep{
+ currentgray 1 ne{
+ currentdict imageormask_sys
+ }{
+ currentoverprint not{
+ 1 AGMCORE_&setgray
+ knockout_image_samples
+ currentdict imageormask_sys
+ }{
+ currentdict ignoreimagedata
+ }ifelse
+ }ifelse
+ }{
+ imagemask
+ }ifelse
+ }{
+ BitsPerComponent ImageMatrix
+ MultipleDataSources{
+ 0 1 NComponents 1 sub{
+ DataSource exch get
+ }for
+ }{
+ /DataSource load
+ }ifelse
+ Operator /colorimage eq{
+ AGMCORE_host_sep{
+ MultipleDataSources level2 or NComponents 4 eq and{
+ MultipleDataSources{
+ 4 {pop} repeat
+ /DataSource [
+ DataSource 0 get /exec cvx
+ DataSource 1 get /exec cvx
+ DataSource 2 get /exec cvx
+ DataSource 3 get /exec cvx
+ /AGMCORE_get_ink_data cvx
+ ] cvx def
+ }{
+ /DataSource /DataSource load filter_cmyk 0 () /SubFileDecode filter def
+ }ifelse
+
+ /Decode [ Decode 0 get Decode 1 get ] def
+ /MultipleDataSources false def
+ /NComponents 1 def
+ /Operator /image def
+ AGMCORE_is_cmyk_sep{
+ currentoverprint InksUsed current_ink not and{
+ currentdict consumeimagedata
+ }{
+ invert_image_samples
+ 1 AGMCORE_&setgray
+ currentdict imageormask_sys
+ }ifelse
+ }{
+ currentdict ignoreimagedata
+ }ifelse
+ }{
+
+ MultipleDataSources NComponents AGMIMG_&colorimage
+ }ifelse
+ }{
+ true NComponents colorimage
+ }ifelse
+ }{
+ Operator /image eq{
+ AGMCORE_host_sep{
+ /DoImage true def
+ HostSepColorImage{
+ invert_image_samples
+ }{
+ AGMCORE_black_plate not{
+ /DoImage false def
+ currentdict ignoreimagedata
+ }if
+ }ifelse
+ 1 AGMCORE_&setgray
+ DoImage
+ {currentdict imageormask_sys} if
+ }{
+ image
+ }ifelse
+ }{
+ Operator/knockout eq{
+ pop pop pop pop pop
+ currentoverprint InksUsed current_ink not and{
+ }{
+ currentcolorspace overprint_plate not{
+ knockout_unitsq
+ }if
+ }ifelse
+ }if
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ cleartomark restore
+ }if
+ end
+}def
+/sep_imageormask
+{
+ /sep_colorspace_dict AGMCORE_gget begin
+ /MappedCSA CSA map_csa def
+ begin
+ SkipImageProc not{
+ save mark
+
+ AGMCORE_avoid_L2_sep_space{
+ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def
+ }if
+ AGMIMG_ccimage_exists
+ MappedCSA 0 get /DeviceCMYK eq and
+ currentdict/Components known and
+ Name () ne and
+ Name (All) ne and
+ Operator /image eq and
+ AGMCORE_producing_seps not and
+ level2 not and
+ {
+ Width Height BitsPerComponent ImageMatrix
+ [
+ /DataSource load /exec cvx
+ {
+ 0 1 2 index length 1 sub{
+ 1 index exch
+ 2 copy get 255 xor put
+ }for
+ } /exec cvx
+ ] cvx bind
+ MappedCSA 0 get /DeviceCMYK eq{
+ Components aload pop
+ }{
+ 0 0 0 Components aload pop 1 exch sub
+ }ifelse
+ Name findcmykcustomcolor
+ customcolorimage
+ }{
+ AGMCORE_producing_seps not{
+ level2{
+ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{
+ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt
+ /sep_tint AGMCORE_gget setcolor
+ }if
+ currentdict imageormask
+ }{
+ currentdict
+ Operator /imagemask eq{
+ imageormask
+ }{
+ sep_imageormask_lev1
+ }ifelse
+ }ifelse
+ }{
+ AGMCORE_host_sep{
+ Operator/knockout eq{
+ currentoverprint InksUsed current_ink not and{
+ }{
+ currentdict/ImageMatrix get concat
+ knockout_unitsq
+ }ifelse
+ }{
+ currentgray 1 ne{
+ AGMCORE_is_cmyk_sep Name (All) ne and{
+ level2{
+ [ /Separation Name [/DeviceGray]
+ {
+ sep_colorspace_proc AGMCORE_get_ink_data
+ 1 exch sub
+ } bind
+ ] AGMCORE_&setcolorspace
+ /sep_tint AGMCORE_gget AGMCORE_&setcolor
+ currentdict imageormask_sys
+ }{
+ currentdict
+ Operator /imagemask eq{
+ imageormask_sys
+ }{
+ sep_image_lev1_sep
+ }ifelse
+ }ifelse
+ }{
+ Operator/imagemask ne{
+ invert_image_samples
+ }if
+ currentdict imageormask_sys
+ }ifelse
+ }{
+ currentdict consumeimagedata
+ currentoverprint not Name (All) eq or{
+ gsave
+ knockout_unitsq
+ grestore
+ }if
+ }ifelse
+ }ifelse
+ }{
+ currentcolorspace 0 get /Separation ne{
+ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt
+ /sep_tint AGMCORE_gget setcolor
+ }if
+ currentoverprint
+ MappedCSA 0 get /DeviceCMYK eq and
+ Name inRip_spot_has_ink not and
+ Name (All) ne and {
+ imageormask_l2_overprint
+ }{
+ currentdict imageormask
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ cleartomark restore
+ }if
+ end
+ end
+}def
+/imageormask_l2_overprint
+{
+
+ currentdict
+ currentcmykcolor add add add 0 eq{
+ currentdict consumeimagedata
+ }{
+ level3{
+
+ currentcmykcolor
+ /AGMIMG_k xdf
+ /AGMIMG_y xdf
+ /AGMIMG_m xdf
+ /AGMIMG_c xdf
+ Operator/imagemask eq{
+ [/DeviceN [
+ AGMIMG_c 0 ne {/Cyan} if
+ AGMIMG_m 0 ne {/Magenta} if
+ AGMIMG_y 0 ne {/Yellow} if
+ AGMIMG_k 0 ne {/Black} if
+ ] /DeviceCMYK {}] setcolorspace
+
+ AGMIMG_c 0 ne {AGMIMG_c} if
+ AGMIMG_m 0 ne {AGMIMG_m} if
+ AGMIMG_y 0 ne {AGMIMG_y} if
+ AGMIMG_k 0 ne {AGMIMG_k} if
+ setcolor
+ }{
+ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def
+ [/Indexed
+ [
+ /DeviceN [
+ AGMIMG_c 0 ne {/Cyan} if
+ AGMIMG_m 0 ne {/Magenta} if
+ AGMIMG_y 0 ne {/Yellow} if
+ AGMIMG_k 0 ne {/Black} if
+ ]
+ /DeviceCMYK {
+ AGMIMG_k 0 eq {0} if
+ AGMIMG_y 0 eq {0 exch} if
+ AGMIMG_m 0 eq {0 3 1 roll} if
+ AGMIMG_c 0 eq {0 4 1 roll} if
+ }
+ ]
+ 255
+ {
+ 255 div
+
+ mark exch
+ dup dup dup
+
+
+ AGMIMG_k 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+
+ AGMIMG_y 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+
+ AGMIMG_m 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+
+ AGMIMG_c 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+ counttomark 1 add -1 roll pop
+ }
+ ] setcolorspace
+ }ifelse
+
+ imageormask_sys
+ }{
+ write_image_file{
+ currentcmykcolor
+ 0 ne{
+ [/Separation /Black /DeviceGray {}] setcolorspace
+ gsave
+ /Black
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ }if
+ 0 ne{
+ [/Separation /Yellow /DeviceGray {}] setcolorspace
+ gsave
+ /Yellow
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ }if
+ 0 ne{
+ [/Separation /Magenta /DeviceGray {}] setcolorspace
+ gsave
+ /Magenta
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ }if
+ 0 ne{
+ [/Separation /Cyan /DeviceGray {}] setcolorspace
+ gsave
+ /Cyan
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ } if
+ close_image_file
+ }{
+ imageormask
+ }ifelse
+ }ifelse
+ }ifelse
+} def
+/indexed_imageormask
+{
+ begin
+ save mark
+
+ currentdict
+ AGMCORE_host_sep{
+
+ Operator/knockout eq{
+ /indexed_colorspace_dict AGMCORE_gget /CSA get map_csa overprint_plate not{
+ knockout_unitsq
+ }if
+ }{
+ AGMCORE_is_cmyk_sep{
+ Operator /imagemask eq{
+ imageormask_sys
+ }{
+ level2{
+ indexed_image_lev2_sep
+ }{
+ indexed_image_lev1_sep
+ }ifelse
+ }ifelse
+ }{
+ currentoverprint not{
+ knockout_image_samples
+ imageormask_sys
+ }{
+ currentdict consumeimagedata
+ }ifelse
+ }ifelse
+ }ifelse
+ }{
+ level2{
+ imageormask
+ }{
+ Operator /imagemask eq{
+ imageormask
+ }{
+ indexed_imageormask_lev1
+ }ifelse
+ }ifelse
+ }ifelse
+ cleartomark restore
+ end
+}def
+/indexed_image_lev2_sep
+{
+ /indexed_colorspace_dict AGMCORE_gget begin
+ begin
+
+ currentcolorspace
+ dup 1 /DeviceGray put
+ dup 3 [
+ currentcolorspace 3 get
+ {
+ exch 4 mul 4 getinterval {} forall
+ AGMCORE_get_ink_data 255 div 1 exch sub
+ } /exec cvx
+ ] cvx put
+ setcolorspace
+
+ currentdict
+ Operator /imagemask eq{
+ AGMIMG_&imagemask
+ }{
+ AGMIMG_&image
+ }ifelse
+
+ end end
+}def
+/OPIimage
+{
+ dup type /dicttype ne{
+ 10 dict begin
+ /DataSource xdf
+ /ImageMatrix xdf
+ /BitsPerComponent xdf
+ /Height xdf
+ /Width xdf
+ /ImageType 1 def
+ /Decode [0 1 def]
+ currentdict
+ end
+ }if
+ dup begin
+ /NComponents 1 cdndf
+ /MultipleDataSources false cdndf
+ /SkipImageProc {false} cdndf
+ /HostSepColorImage false cdndf
+ /Decode [
+ 0
+ currentcolorspace 0 get /Indexed eq{
+ 2 BitsPerComponent exp 1 sub
+ }{
+ 1
+ }ifelse
+ ] cdndf
+ /Operator /image cdndf
+ end
+ /sep_colorspace_dict AGMCORE_gget null eq{
+ imageormask
+ }{
+ gsave
+ dup begin invert_image_samples end
+ sep_imageormask
+ grestore
+ }ifelse
+}def
+/spot_alias
+{
+ /mapto_sep_imageormask
+ {
+ dup type /dicttype ne{
+ 12 dict begin
+ /ImageType 1 def
+ /DataSource xdf
+ /ImageMatrix xdf
+ /BitsPerComponent xdf
+ /Height xdf
+ /Width xdf
+ /MultipleDataSources false def
+ }{
+ begin
+ }ifelse
+ /Decode [/customcolor_tint AGMCORE_gget 0] def
+ /Operator /image def
+ /HostSepColorImage false def
+ /InksUsed [] def
+ /SkipImageProc {false} def
+ currentdict
+ end
+ sep_imageormask
+ }bdf
+ /customcolorimage
+ {
+ Adobe_AGM_Image/AGMIMG_colorAry xddf
+ /customcolor_tint AGMCORE_gget
+ bdict
+ /Name AGMIMG_colorAry 4 get
+ /CSA [ /DeviceCMYK ]
+ /TintMethod /Subtractive
+ /TintProc null
+ /MappedCSA null
+ /NComponents 4
+ /Components [ AGMIMG_colorAry aload pop pop ]
+ edict
+ setsepcolorspace
+ mapto_sep_imageormask
+ }ndf
+ Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put
+ /customcolorimage
+ {
+ Adobe_AGM_Image/AGMIMG_override false put
+ dup 4 get map_alias{
+ /customcolor_tint AGMCORE_gget exch setsepcolorspace
+ pop
+ mapto_sep_imageormask
+ }{
+ AGMIMG_&customcolorimage
+ }ifelse
+ }bdf
+}def
+level2 not{
+ /colorbuf
+ {
+ 0 1 2 index length 1 sub{
+ dup 2 index exch get
+ 255 exch sub
+ 2 index
+ 3 1 roll
+ put
+ }for
+ }def
+ /tint_image_to_color
+ {
+ begin
+ Width Height BitsPerComponent ImageMatrix
+ /DataSource load
+ end
+ Adobe_AGM_Image begin
+ /AGMIMG_mbuf 0 string def
+ /AGMIMG_ybuf 0 string def
+ /AGMIMG_kbuf 0 string def
+ {
+ colorbuf dup length AGMIMG_mbuf length ne
+ {
+ dup length dup dup
+ /AGMIMG_mbuf exch string def
+ /AGMIMG_ybuf exch string def
+ /AGMIMG_kbuf exch string def
+ } if
+ dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop
+ }
+ addprocs
+ {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage
+ end
+ } def
+ /sep_imageormask_lev1
+ {
+ begin
+ MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{
+
+ {
+ 255 mul round cvi GrayLookup exch get
+ } currenttransfer addprocs settransfer
+ currentdict imageormask
+ }{
+ /sep_colorspace_dict AGMCORE_gget/Components known{
+ MappedCSA 0 get /DeviceCMYK eq{
+ Components aload pop
+ }{
+ 0 0 0 Components aload pop 1 exch sub
+ }ifelse
+
+ Adobe_AGM_Image/AGMIMG_k xddf
+ Adobe_AGM_Image/AGMIMG_y xddf
+ Adobe_AGM_Image/AGMIMG_m xddf
+ Adobe_AGM_Image/AGMIMG_c xddf
+
+ AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{
+ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer
+ currentdict imageormask
+ }{
+
+ currentcolortransfer
+ {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll
+ {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll
+ {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll
+ {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll
+ setcolortransfer
+ currentdict tint_image_to_color
+ }ifelse
+ }{
+
+ MappedCSA 0 get /DeviceGray eq {
+ {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer
+ currentdict imageormask
+ }{
+ MappedCSA 0 get /DeviceCMYK eq {
+ currentcolortransfer
+ {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll
+ setcolortransfer
+ currentdict tint_image_to_color
+ }{
+ currentcolortransfer
+ {pop 1} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll
+ setcolortransfer
+ currentdict tint_image_to_color
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ end
+ }def
+ /sep_image_lev1_sep
+ {
+ begin
+ /sep_colorspace_dict AGMCORE_gget/Components known{
+ Components aload pop
+
+ Adobe_AGM_Image/AGMIMG_k xddf
+ Adobe_AGM_Image/AGMIMG_y xddf
+ Adobe_AGM_Image/AGMIMG_m xddf
+ Adobe_AGM_Image/AGMIMG_c xddf
+
+ {AGMIMG_c mul 1 exch sub}
+ {AGMIMG_m mul 1 exch sub}
+ {AGMIMG_y mul 1 exch sub}
+ {AGMIMG_k mul 1 exch sub}
+ }{
+ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}
+ {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}
+ {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}
+ {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}
+ }ifelse
+
+ AGMCORE_get_ink_data currenttransfer addprocs settransfer
+
+ currentdict imageormask_sys
+
+ end
+ }def
+ /indexed_imageormask_lev1
+ {
+ /indexed_colorspace_dict AGMCORE_gget begin
+ begin
+ currentdict
+ MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{
+
+ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer
+ imageormask
+ }{
+
+ MappedCSA 0 get /DeviceGray eq {
+ {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer
+ imageormask
+ }{
+ MappedCSA 0 get /DeviceCMYK eq {
+ currentcolortransfer
+ {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ setcolortransfer
+ tint_image_to_color
+ }{
+ currentcolortransfer
+ {pop 1} exch addprocs 4 1 roll
+ {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll
+ {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll
+ {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll
+ setcolortransfer
+ tint_image_to_color
+ }ifelse
+ }ifelse
+ }ifelse
+ end end
+ }def
+ /indexed_image_lev1_sep
+ {
+ /indexed_colorspace_dict AGMCORE_gget begin
+ begin
+ {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub}
+ {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}
+ {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}
+ {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}
+
+ AGMCORE_get_ink_data currenttransfer addprocs settransfer
+
+ currentdict imageormask_sys
+
+ end end
+ }def
+}if
+end
+systemdict /setpacking known
+{
+ setpacking
+} if
+%%EndResource
+%ADOBeginClientInjection: DocumentProlog End "AI10"
+%ADOEndClientInjection: DocumentProlog End "AI10"
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndProlog
+%%BeginSetup
+%ADOBeginClientInjection: DocumentSetup Start "AI10"
+%ADOEndClientInjection: DocumentSetup Start "AI10"
+Adobe_AGM_Utils begin
+2 2010 true Adobe_AGM_Core/doc_setup get exec
+Adobe_CoolType_Core/doc_setup get exec
+Adobe_AGM_Image/doc_setup get exec
+%ADOBeginClientInjection: DocumentSetup End "AI10"
+%ADOEndClientInjection: DocumentSetup End "AI10"
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndSetup
+%%Page: rna_elements.pdf 1
+%%EndPageComments
+%%BeginPageSetup
+%ADOBeginClientInjection: PageSetup Start "AI10"
+%ADOEndClientInjection: PageSetup Start "AI10"
+Adobe_AGM_Utils begin
+Adobe_AGM_Core/page_setup get exec
+Adobe_CoolType_Core/page_setup get exec
+Adobe_AGM_Image/page_setup get exec
+%ADOBeginClientInjection: PageSetup End "AI10"
+%ADOEndClientInjection: PageSetup End "AI10"
+%%EndPageSetup
+Adobe_AGM_Core/AGMCORE_save save ddf
+1 -1 scale 0 -164.239 translate
+[1 0 0 1 0 0 ] concat
+mark
+/0
+[/DeviceGray] add_csa
+/CSA /0
+/1
+[/DeviceCMYK] add_csa
+/CSA /1
+/2
+[/DeviceRGB] add_csa
+/CSA /2
+cleartomark
+800 path_rez
+% page clip
+gsave
+newpath
+gsave % PSGState
+0 0 mo
+0 164.239 li
+352.537 164.239 li
+352.537 0 li
+clp
+[1 0 0 1 0 0 ] concat
+%ADOBeginClientInjection: BeginPageContent "AI10"
+%ADOEndClientInjection: BeginPageContent "AI10"
+gsave % PSGState
+0 0 mo
+353 0 li
+353 164 li
+0 164 li
+0 0 li
+clp
+false sop
+0 0 0 rgb
+%ADOBeginSubsetFont: Courier Initial
+%!FontType1
+16 dict begin
+/FontInfo 15 dict dup begin
+/Notice (Copyright (c) 1989, 1990, 1991, 1992, 1993, 1996, 1997, 1998 Adobe Systems Incorporated. All Rights Reserved.) def
+/version (004.000) def
+/FullName (Courier) def
+/FamilyName (Courier) def
+/Weight (Medium) def
+/ItalicAngle 0 def
+/isFixedPitch true def
+/UnderlinePosition -224 def
+/UnderlineThickness 52 def
+end def
+/FontName /Courier def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+ def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ] def
+/FontBBox { -6 -249 639 803 } def
+/XUID [6 44052 ] def
+/StrokeWidth 0 def
+currentdict end
+currentfile eexec A0B00ED5187D9C0F1ECDF51878C3AA5CAA3EC9EBBC6A5E
+2825687306A156DACC32FBF07CD53FCFA5F8BEB4C85C022641C2817904D210EE
+C1B9CB391931A7DA79E981F6D449067CB22BBBC1C7E17F31494A030C64C3D168
+01AD7EA9844289C5FBF13E87EB38D47EFECDFD90987CE63AEE2F73A41DE9D88E
+47972B7D71DFE3C0971C15A0A2EA71DB75E8BDC8C575FCE75767F0757BD4C3C5
+8EF2FE5165B8546C92942358A58A418D001D670BAC478494625C3F163F0CD28E
+7A310B1DCF9DE24EAA3915D162715D989E4195F752D98AA3F931758A7593B8D3
+EC8B0E6F0595582B46C09C38DE491876FDE8215B3EE34EDD4786C0C7A3CE5DF1
+8A700014C8A22ABA9A86068E22E576F8F99D9E02926B326829224A29008B6A42
+68E0572B16A9483D4982E08663803B6B595CE202EC34889AD55E68C1517B0147
+AAD37FD80C565A7442B8F0EB1481B8237F6BFE35261E22DC029FEE4D3F209D80
+2EF7B2A2864A8B0A54139C8EBAEDBF9E51A55C608E32A4923E2C1FCA43DCD5C1
+779278E12954773FFC02D1AC37E82896B5600D237CDF49D06665F52AAC93A099
+EFC6D65BD9857E2326543E4C47F9CAC6F3585FB5A3669036ECF0F6C47CA5A928
+5E52478ABFFDF5B789B97FB56E47A38537631B551770393C1118D978F755B1F7
+4E8DA30A09AA5EB90487A9405862EA007BF66633C9F580B996E8D0A275B43BE8
+1189FE61073FC03A9B1F3CEC85EC476BF67B6C47746321F58F096D099F9B11EA
+1A831B62ABEC9959ACE371407E1CB3C0FD111DE17536B349BA959E0BEABDCE76
+3683EB04F536BFDAFDCD692AA7019CEFDDB9D8BA507FA146D8BD2A2A55FC80F6
+6637AD8EA0CEB1BDD84A60BD5C13B07F9A0B4036A0EFCC76A9511C476D839F68
+3323611F9D9EA6F9724485B677B50B645AE76E53584D93A7CD7573E43D0FFBF2
+74F321FD07CF320580AD97B00988306FCD048D6087241B4034BFF6672B8E649C
+84F1C4A6CE4C8A5AF0DB83D8CFF7689E8698F7A29A60E951FA4397A9A53702C9
+2C21745DDE740EC662DEC80CF9B610531B7CF950A029E51A236B17C9E9F3FFAA
+0AF4C58A51B1E01EBC8C990EEE5C9B9ED9F97FA152087C87997AF19E9600C4B9
+8CCB0DB1DFF49F41E6C74B96D496BF9AC15254F424F86FA2958DF294EB62F4FB
+4D9E274C00EFDC6BAB7E4D7F2C4CE074BBD7FD6D03304D718AD80FEBBDA6BE1B
+6422CDA2B7143B6FB19A24A1B4155C3F289A692A41430A3B00AADBBB832E1CF9
+65E2BBEACDED81B3E7D3F7C0EA441754AD2419D6F7B9FB92A9EB440E60431A99
+A2909BF6280F444E04D15F8ADF0F355A53C3B1A27DDB57388E194357F2F872FF
+8CCFEAB306C4004426398C2A6EA105D100192328D5C0F7FDCA875F673927EB95
+4D88E506BD3E184BDF09551E01FD095818CED7AE3FE4C9BFE1810F02ABCB97F1
+8892C6EA45D3611DF6736FDBD05BE05C269120B0F0721C756C028060050A2F53
+005C8406D99AE74D9A82CEB53399FCDB0E34EC3FFCD1853EEF964FF3E79365AE
+2F074713342E1DE752D1FE3B62481D6003BDDB64535A61B22C44D432004DA354
+352C585641C5D50553C105B50C5335043686AB9B62E88A0ACC26B45A85BC8153
+A096C00968110C1D5FAA7C106CAE657BA442022B722BF32A2B84250F34A3CF22
+5B33D0746E3BC4C30D3993A2B2011F23203AFD0DBE639D13A9E8F51C411B046D
+15E72C38C42D2D99E004E0A2688F5C8B6FDE40D784CAB4BBF31C973B353D893C
+FE510F88EDE3858228EEB7DE76F0865068704569F04FDAF9FAC67ABE36D36ED1
+D656D61D00160365F4F65F3EE22ACAFCF456E8121BEC649985EE7A0E2A555B95
+A862A3F7A2F88E6A13715B605FCC01A0B1DA2AED0528D0FAD252917C23C4BC4B
+EA1F35CCA75FD34CBE7FAC66DE590E32CF3FB5E534D3B8D49CFD4D6EF1947C1A
+1DDBF061B43537C973C8862CD3F9374419BA451D6BC80AA72EED19F9AEB0302E
+777C3AED7FDD18F0C69652182A0CF97067AE10167AB30134D691DD67C451DA00
+A88CB867940EE3C7BD7BFB3595CAFE3D85EAD141D8FD04D825E9430448666AD7
+32C50CDD1A19DFE58A023670A3D6494316BA229AC33FA5156AAEF81CDDAF9A88
+33FDAEA2351DF58D8994855A8B40660B88FFCB204BF8BB4212D25E96C45241C4
+B12702D5139739EA0D8DA9502846EAB7C945ED385BEB01FF11433E055DC9DC1E
+5E775594DA9CFB49056F25EC15609C12C4B91661D8572CAE917A35066D4AC3D4
+4E4E9A309F66FC5DD4C520FE1F4B7363DC608EC00A50BB5C63D141A54E75C347
+0284637F3AD1A6717CBFB4EE47A166E581A1C78EE225F6A292C548315FAE75CE
+A0EDE520FB1F350E10260F63DDA78F57
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/Courier findfont /Encoding get
+dup 65 /A put
+dup 71 /G put
+dup 85 /U put
+pop
+%ADOEndSubsetFont
+/Courier*1
+[
+65{/.notdef}repeat /A 5{/.notdef}repeat /G 13{/.notdef}repeat /U 170{/.notdef}repeat
+] /Courier nfnt
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+43 91.333 mov
+(A) sh
+38 100.86 mov
+(A) sh
+57 91.333 mov
+(U) sh
+62 100.86 mov
+(G) sh
+53.5 89.7803 mo
+54.3286 89.7803 55 89.1084 55 88.2803 cv
+55 87.4521 54.3286 86.7803 53.5 86.7803 cv
+52.6714 86.7803 52 87.4521 52 88.2803 cv
+52 89.1084 52.6714 89.7803 53.5 89.7803 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+%ADOBeginSubsetFont: Courier AddGlyphs
+
+
+currentfile eexec A0B00ED553D88C5C0C79D03A57EC9671B1D399F226CD7C
+D65ACF5F52191B6189AD006088DC248B070400A2FF50090550BDD59C4446787C
+36C6E6DF3FBF7A9A4DAD53ACCA57616FFD3E7C1C1A87B388892CC4BDF41FF3A4
+C6F6848B0EFB4E4E3A271A45CE29514393F5A9592F4992EFD9218BDCA0823462
+B1F6698B4CF7C2F36BEA9C60E9BE5A785D6DF5030D473A344B60FD225DD93A0F
+6A2EBF54692182D3BB513E143D45245281160E4B2F6FF2E195EB8EA18496277B
+A659A2E8378FAC658A98331B480590028B0FF2914BF42BD1AFA9811122DADACB
+F1B1F7A8E131A05CDC992607B19E4150F4588170D1E81B5E8F6F8B5665F1BF5C
+0C57648A28EC35FEAEE4D4BEB632DA54170FA33130E3B8351E81E7EB5EC921E1
+EC88BA82C86B3A3BF7D479964DA514A8E06214893CC325D112345F6E79534221
+78B554FBF4C1EB0BC924326E30CB02D1984819F32AE9F6590A0F097954E446C3
+719D5B25858EDC6CDB11DA317EEF88C0DC6AD70824905387662FF0002DB58D4E
+8DA4CC64
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/Courier findfont /Encoding get
+dup 65 /A put
+dup 67 /C put
+dup 71 /G put
+dup 85 /U put
+pop
+%ADOEndSubsetFont
+/Courier*1
+[
+65{/.notdef}repeat /A /.notdef /C 3{/.notdef}repeat /G 13{/.notdef}repeat /U
+170{/.notdef}repeat
+] /Courier nfnt
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+43 81.3335 mov
+7.403 0 (GC) ash
+62 72.3335 mov
+(G) sh
+53.5 79.7808 mo
+54.3286 79.7808 55 79.1094 55 78.2808 cv
+55 77.4526 54.3286 76.7808 53.5 76.7808 cv
+52.6714 76.7808 52 77.4526 52 78.2808 cv
+52 79.1094 52.6714 79.7808 53.5 79.7808 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+43 63.3335 mov
+7.403 0 (GC) ash
+53.5 61.7808 mo
+54.3286 61.7808 55 61.1094 55 60.2808 cv
+55 59.4526 54.3286 58.7808 53.5 58.7808 cv
+52.6714 58.7808 52 59.4526 52 60.2808 cv
+52 61.1094 52.6714 61.7808 53.5 61.7808 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+43 53.3335 mov
+(C) sh
+38 45.3335 mov
+(A) sh
+33 37.3335 mov
+(A) sh
+57 53.3335 mov
+(G) sh
+53.5 51.7808 mo
+54.3286 51.7808 55 51.1094 55 50.2808 cv
+55 49.4526 54.3286 48.7808 53.5 48.7808 cv
+52.6714 48.7808 52 49.4526 52 50.2808 cv
+52 51.1094 52.6714 51.7808 53.5 51.7808 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+67 127.386 mov
+(C) sh
+59.667 135.386 mov
+(U) sh
+67 110.386 mov
+(G) sh
+70.2998 117.333 mo
+71.1284 117.333 71.7998 116.661 71.7998 115.833 cv
+71.7998 115.005 71.1284 114.333 70.2998 114.333 cv
+69.4717 114.333 68.7998 115.005 68.7998 115.833 cv
+68.7998 116.661 69.4717 117.333 70.2998 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+34 127.386 mov
+(G) sh
+41.25 135.386 mov
+(A) sh
+50.5 138.386 mov
+(U) sh
+34 110.386 mov
+(C) sh
+37.2998 117.333 mo
+38.1284 117.333 38.7998 116.661 38.7998 115.833 cv
+38.7998 115.005 38.1284 114.333 37.2998 114.333 cv
+36.4717 114.333 35.7998 115.005 35.7998 115.833 cv
+35.7998 116.661 36.4717 117.333 37.2998 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+25 127.386 mov
+(G) sh
+25 110.386 mov
+(C) sh
+28.2998 117.333 mo
+29.1284 117.333 29.7998 116.661 29.7998 115.833 cv
+29.7998 115.005 29.1284 114.333 28.2998 114.333 cv
+27.4717 114.333 26.7998 115.005 26.7998 115.833 cv
+26.7998 116.661 27.4717 117.333 28.2998 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+16 127.386 mov
+(U) sh
+8 132.386 mov
+(A) sh
+16 110.386 mov
+(A) sh
+8 105.386 mov
+(A) sh
+0 118.886 mov
+(C) sh
+19.2998 117.333 mo
+20.1284 117.333 20.7998 116.661 20.7998 115.833 cv
+20.7998 115.005 20.1284 114.333 19.2998 114.333 cv
+18.4717 114.333 17.7998 115.005 17.7998 115.833 cv
+17.7998 116.661 18.4717 117.333 19.2998 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+76 127.386 mov
+(A) sh
+89 132.386 mov
+(U) sh
+76 110.386 mov
+(U) sh
+84 105.386 mov
+2.39799 0 (CC) ash
+79.2998 117.333 mo
+80.1284 117.333 80.7998 116.661 80.7998 115.833 cv
+80.7998 115.005 80.1284 114.333 79.2998 114.333 cv
+78.4717 114.333 77.7998 115.005 77.7998 115.833 cv
+77.7998 116.661 78.4717 117.333 79.2998 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+101 127.386 mov
+(G) sh
+101 110.386 mov
+(C) sh
+104.3 117.333 mo
+105.128 117.333 105.8 116.661 105.8 115.833 cv
+105.8 115.005 105.128 114.333 104.3 114.333 cv
+103.472 114.333 102.8 115.005 102.8 115.833 cv
+102.8 116.661 103.472 117.333 104.3 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+110 127.386 mov
+(C) sh
+118 132.386 mov
+(U) sh
+126 123.386 mov
+(U) sh
+110 110.386 mov
+(G) sh
+118 105.386 mov
+(G) sh
+126 114.386 mov
+(C) sh
+113.3 117.333 mo
+114.128 117.333 114.8 116.661 114.8 115.833 cv
+114.8 115.005 114.128 114.333 113.3 114.333 cv
+112.472 114.333 111.8 115.005 111.8 115.833 cv
+111.8 116.661 112.472 117.333 113.3 117.333 cv
+0 0 0 rgb
+f
+1 lw
+0 lc
+0 lj
+4 ml
+[] 0 dsh
+true sadj
+64.7476 45.9541 mo
+68.9902 41.7114 li
+27.3906 26.4238 mo
+31.6333 30.6665 li
+0 0 0 rgb
+s
+0 0 0 rgb
+%ADOBeginSubsetFont: Courier AddGlyphs
+
+
+currentfile eexec A0B00ED553D88C5C0C79D03A57EC9671B1D399F226CD7C
+D65ACF5F52191B6189AD006088DC248B070400A2FF50090550BDD59C4446787C
+36C6E6DF3FBF7A9A4DAD53ACCA57616FFD3E7C1C1A87B388892CC4BDF41FF3A4
+C6F6848B0EFB4E4E3A271A45CE29514393F5A9592F4992EFD9218BDCA0823462
+B1F6698B4CF7C2F36BEA9C60E9BE5A785D6DF5030D473A344B60FD225DD93A0F
+6A2EBF54692182D3BB513E143D45245281160E4B2F6FF2E195EB8EA18496277B
+A659A2E8003D3837B9825544141CA39B39A028185D0F1B9A8ACE9E8D362B13C3
+0C748D2820FE7BC93228B8D35EE6B0963141FAB1C762DA897ACB3E2AEF7365F5
+E0972CF7FBDC589114AC452C374059C4DFB83382251758E4571694D9D39BE593
+CCBD0CBBD944E8C0D94F977749D66725D3DA5BD9D4785C0500607106B2903596
+583DEA9A9E75A8FAB1F4AD1D4AFF356D6EB6B56801A054C52BDB02F7EA12E992
+3FAF115542E6B8248CC6CCBA1970AA52D6E7CD0B9DD90F78ACB18EE89ACCC68A
+94FF17C652111D4EBD77A6D6247DF4065B9501BA65FF1D1A7ED3E4FF00D2A468
+4B3B45DF6C72AAF8A3B528542D12A6963EBE28884AAC7303CBFEB1D85AA2B6C1
+C17D480798EF976114861B37F7BD8D632635995628525F4AC853ECF262B36B0B
+EABC18BA1B763E3639C8E2814E498DC9AF35AF278628592ABEC9D8AC975369B2
+1031687BFD8D207563B5553EFA65ECA30A6B688E7068C6092DD2C1305276D188
+FC24070DA4FA78EDEEE54D3E7DB74DF13EDFA659DB8A783B3CC77D59329B0023
+B0D00BA26992175DD1015B3C4FEDDAE2C7AD006435128E7211B5831E1F5C1797
+D816125DF6970B565688AF0218E1694D9737A5164998
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/Courier findfont /Encoding get
+dup 51 /three put
+dup 53 /five put
+dup 65 /A put
+dup 67 /C put
+dup 71 /G put
+dup 85 /U put
+dup 169 /quotesingle put
+pop
+%ADOEndSubsetFont
+/Courier*1
+[
+51{/.notdef}repeat /three /.notdef /five 11{/.notdef}repeat /A /.notdef /C
+3{/.notdef}repeat /G 13{/.notdef}repeat /U 83{/.notdef}repeat /quotesingle 86{/.notdef}repeat
+] /Courier nfnt
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+19.8931 26.6665 mov
+(5\251) sh
+70.5601 41 mov
+(3\251) sh
+222 91.333 mov
+(A) sh
+217 100.86 mov
+(A) sh
+236 91.333 mov
+(U) sh
+241 100.86 mov
+(G) sh
+232.5 89.7803 mo
+233.328 89.7803 234 89.1084 234 88.2803 cv
+234 87.4521 233.328 86.7803 232.5 86.7803 cv
+231.672 86.7803 231 87.4521 231 88.2803 cv
+231 89.1084 231.672 89.7803 232.5 89.7803 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+222 81.3335 mov
+7.403 0 (GC) ash
+241 72.3335 mov
+(G) sh
+232.5 79.7808 mo
+233.328 79.7808 234 79.1094 234 78.2808 cv
+234 77.4526 233.328 76.7808 232.5 76.7808 cv
+231.672 76.7808 231 77.4526 231 78.2808 cv
+231 79.1094 231.672 79.7808 232.5 79.7808 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+222 63.3335 mov
+7.403 0 (GC) ash
+232.5 61.7808 mo
+233.328 61.7808 234 61.1094 234 60.2808 cv
+234 59.4526 233.328 58.7808 232.5 58.7808 cv
+231.672 58.7808 231 59.4526 231 60.2808 cv
+231 61.1094 231.672 61.7808 232.5 61.7808 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+222 53.3335 mov
+(C) sh
+217 45.3335 mov
+(A) sh
+212 37.3335 mov
+(A) sh
+236 53.3335 mov
+(G) sh
+232.5 51.7808 mo
+233.328 51.7808 234 51.1094 234 50.2808 cv
+234 49.4526 233.328 48.7808 232.5 48.7808 cv
+231.672 48.7808 231 49.4526 231 50.2808 cv
+231 51.1094 231.672 51.7808 232.5 51.7808 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+246 127.386 mov
+(C) sh
+238.667 135.386 mov
+(U) sh
+246 110.386 mov
+(G) sh
+249.3 117.333 mo
+250.128 117.333 250.8 116.661 250.8 115.833 cv
+250.8 115.005 250.128 114.333 249.3 114.333 cv
+248.472 114.333 247.8 115.005 247.8 115.833 cv
+247.8 116.661 248.472 117.333 249.3 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+213 127.386 mov
+(G) sh
+220.25 135.386 mov
+(A) sh
+229.5 138.386 mov
+(U) sh
+213 110.386 mov
+(C) sh
+216.3 117.333 mo
+217.128 117.333 217.8 116.661 217.8 115.833 cv
+217.8 115.005 217.128 114.333 216.3 114.333 cv
+215.472 114.333 214.8 115.005 214.8 115.833 cv
+214.8 116.661 215.472 117.333 216.3 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+204 127.386 mov
+(G) sh
+204 110.386 mov
+(C) sh
+207.3 117.333 mo
+208.128 117.333 208.8 116.661 208.8 115.833 cv
+208.8 115.005 208.128 114.333 207.3 114.333 cv
+206.472 114.333 205.8 115.005 205.8 115.833 cv
+205.8 116.661 206.472 117.333 207.3 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+195 127.386 mov
+(U) sh
+187 132.386 mov
+(A) sh
+195 110.386 mov
+(A) sh
+187 105.386 mov
+(A) sh
+179 118.886 mov
+(C) sh
+198.3 117.333 mo
+199.128 117.333 199.8 116.661 199.8 115.833 cv
+199.8 115.005 199.128 114.333 198.3 114.333 cv
+197.472 114.333 196.8 115.005 196.8 115.833 cv
+196.8 116.661 197.472 117.333 198.3 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+255 127.386 mov
+(A) sh
+268 132.386 mov
+(U) sh
+255 110.386 mov
+(U) sh
+263 105.386 mov
+2.39799 0 (CC) ash
+258.3 117.333 mo
+259.128 117.333 259.8 116.661 259.8 115.833 cv
+259.8 115.005 259.128 114.333 258.3 114.333 cv
+257.472 114.333 256.8 115.005 256.8 115.833 cv
+256.8 116.661 257.472 117.333 258.3 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+280 127.386 mov
+(G) sh
+280 110.386 mov
+(C) sh
+283.3 117.333 mo
+284.128 117.333 284.8 116.661 284.8 115.833 cv
+284.8 115.005 284.128 114.333 283.3 114.333 cv
+282.472 114.333 281.8 115.005 281.8 115.833 cv
+281.8 116.661 282.472 117.333 283.3 117.333 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+289 127.386 mov
+(C) sh
+297 132.386 mov
+(U) sh
+305 123.386 mov
+(U) sh
+289 110.386 mov
+(G) sh
+297 105.386 mov
+(G) sh
+305 114.386 mov
+(C) sh
+292.3 117.333 mo
+293.128 117.333 293.8 116.661 293.8 115.833 cv
+293.8 115.005 293.128 114.333 292.3 114.333 cv
+291.472 114.333 290.8 115.005 290.8 115.833 cv
+290.8 116.661 291.472 117.333 292.3 117.333 cv
+0 0 0 rgb
+f
+243.748 45.9541 mo
+247.99 41.7114 li
+206.224 25.6323 mo
+210.467 29.875 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Courier*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+198.894 26.6665 mov
+(5\251) sh
+249.56 41 mov
+(3\251) sh
+224.633 46.6665 mo
+224.633 29.396 li
+210.633 29.396 li
+210.633 46.6665 li
+224.633 46.6665 li
+cp
+248.3 73.3335 mo
+248.3 64.396 li
+239.967 64.396 li
+239.967 73.3335 li
+248.3 73.3335 li
+cp
+231.344 140.667 mo
+226.677 139.333 217.795 139.147 219.011 134.667 cv
+221.633 124.999 229.633 105.999 216.011 100.333 cv
+214.472 99.6924 214.01 94.333 217.01 92.999 cv
+219.344 91.999 230.677 94.667 233.011 94.667 cv
+231.967 94.667 li
+234.3 94.667 245.633 91.999 247.967 92.999 cv
+250.967 94.333 250.473 99.6201 248.967 100.333 cv
+236.3 106.333 244.3 120.999 245.967 134.667 cv
+246.528 139.274 238.3 139.333 233.633 140.667 cv
+231.344 140.667 li
+cp
+219.967 128.667 mo
+219.967 102.999 li
+194.3 102.999 li
+194.3 128.667 li
+219.967 128.667 li
+cp
+279.633 133.333 mo
+279.633 97.333 li
+262.3 97.333 li
+262.3 133.333 li
+279.633 133.333 li
+cp
+313.32 133.333 mo
+313.32 97.333 li
+295.987 97.333 li
+295.987 133.333 li
+313.32 133.333 li
+cp
+0 0 0 rgb
+s
+0 0 0 rgb
+%ADOBeginSubsetFont: ArialMT Initial
+11 dict begin
+/FontName /ArialMT def
+/FontMatrix [1 1000 div 0 0 1 1000 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+/FontInfo 1 dict dup begin
+ /OrigFontType /TrueType def
+end readonly def
+currentdict
+end
+
+systemdict begin
+dup /Private 7 dict dup begin
+/BlueValues [-15 0 600 650] def
+/MinFeature {16 16} def
+/password 5839 def
+/ND {def} def
+/NP {put} def
+/RD {string currentfile exch readhexstring pop} def
+2 index /CharStrings 1296 dict dup begin
+/.notdef
+<10bf317005b6d50bd3b903bc9f60e6e804630266f839393d56ae50a85fbe
+ffec110deebde9f8a007323688ac> ND
+/space
+<10bf317079c7734bf7> ND
+/hyphen
+<10bf31705995db6ed81c8e93e5d1d568f767c41aee4b2647d0> ND
+/a
+<10bf31705d64e193f9f1f8a567d03549fa73483ae9b672d7b7797200c526
+6d55e0abf05d082c89da2ef3d2f91996aeea18b52bf494757c5251c9374c
+9401f98b0cace0d4875f7ed6fd1c3b2afb70e988b112b201a9d47e0c13f4
+1047852d209bb94beef969307b8c216c427c9903125ecb96a03389115b44
+edc7e2e2478a1fd25f07acc3624f3ed1b5defe5adc0d2b5c9f2461afba44
+82f331b79ca3a770e50164bc5ea7976dee8e016d390d83fcc1fa4202137b
+503516f93235eba4c56226d091ad7f8be6c874f34a5fb2592031776db147
+88325910cfdd12dfbef218194f528860b4df22c468e92140ddaed77110f7
+ac35f3eb45ccb9aa77fa9fad75c6eb6c0fb7ca> ND
+/b
+<10bf31703e65fd7e1217c9f29c64bb1b9e17851bf25dd0466fa484e27564
+2ef62da05fc0e561425aa7c0cf759f2df2fed9f5cab4e563d9d485ca6e49
+6a23023cc7d5336a38ed163f6d25eac0416c891913363ad8aab5312feed7
+de0b0bbcc0db8b66958d96174480f5040af2cfb1590a9410022fc6398cb1
+d4435f6325a11aad4c77347983eb4748b4ada02263a3> ND
+/c
+<10bf317040c2e74a5fc1787aadb34082a8ba9190bcda4e6309e8a2068a81
+15bfd146d0733468211951e54d63b47a4bb20769a10fe2c7ab6af1003e92
+c307e62580c4fc4fcb30f321670fe8ea6fc382860db4ab478167543744c2
+7eee42bb190b50ff8a3de3702b096b5a0dbc687d9934d27330861f8f151c
+46c0261f0a9972bb3873263c80a2161987b9c9> ND
+/d
+<10bf31705fc19346123ea144938c3fcda937cd4a672f67877e80be643ef8
+5a01cff57f62859595ad9c2a1ef16f4c22144c6fc4d200f23642de52d57f
+47e47c78a8b6713f5cb6dcd4a475047f70e7386f0baddd9f1c37f1598f60
+1bc5b6005acf2115ed4aa52ed6ed621e5045f115e6c8ed146247e81ce086
+3c881ef71e6e234403d5f37c528c6ebb0616bbdc05a29ca9d830ed27448f
+> ND
+/e
+<10bf3170422fdb64737aa996af2c16aa574465e2c930c2d6c70f2c72ffe1
+f5ae975a706a2cc8ae00b6163837b6e50d4221eaf76eb409c442c6352c58
+b6f53cd585b0d4d507cc48acee66f883df189a3c8bf101622dd4022876bd
+14603c08f3944b80e2f5e4e7a62999282a391fd9d657c5f0af2673747752
+c83501ca742ca70911b84f52143e873794bcaff697373392d39b09bb> ND
+/g
+<10bf3170599a82ae9f38a9e935b4e0f3d7776326ecd8d725592828643987
+c2e996bcd7d71545c3eb62141100b3029b5db47d5a1c74ff1f384da4be0e
+6cf0ee7a06a6ed308265b547c61245dd74ea50abb0d2d3cd2399420ee06e
+7956a28a86fe6b998b8722a5746802f533a367725615f062015db919f3df
+3c1161274e44726519555c137d48159ae02477eb468fd9fc7a3d8570c8a3
+e043f93c86fb8138e2b07c9d11fc45f70eb798bfa21ffadc315e7d76733b
+5b2c49936a2059f2200afe935aa8ae6d77bf03212f2cde46> ND
+/h
+<10bf31703f932f5ecb68c849e33d1fed17c766a03dcb89fd4259247501b2
+92adfc2297be69c7091e34ced000096d0ca29850717d0ee8abe567011317
+96a4072dab7df40090735d5712990fb13b0847093cc929cc1cd64c87dd80
+565b94c081eb> ND
+/i
+<10bf31703f9c43ec382ac71b0be91f29c503cae1b1e6095503cc0fe0ac65
+3b18436e1776> ND
+/l
+<10bf31703962bf7b2e903c47f674adcdf4f2bfaa638a> ND
+/m
+<10bf31703f92f56d921ff977e5d6963369571a0659b0c0d4b90a5d6fb9cf
+6faeef66a6b161cb3d25beb050c083e79f2022ade1c13065af4f750db4fe
+1ad2e1c991cb72a1a606eb51e0d41e91fb4441b42920d1b3a1093a55a67e
+1a1fd7d653f510dbcf49e0790e917a5508d455454558a59585ba63bcbeb1
+95200dede71b995b075a583acbe0294673e1e62af20184e1e4ef7c875961
+9374c008bd7ea0a3f8> ND
+/n
+<10bf31703f932f5ecb68c849e33d657776fc326fe2f54f4bc03b7f3fa95b
+3e37550287a3822f66bab52dc802d77dcc608442caba0a099550a895735f
+067f96366abd71cd4bfcf52bc4da085550e8eac7df2e04a58377ae472993
+06a8805e14d9bcbf32aaef31> ND
+/o
+<10bf31705e921373942a1df751ebc6db4ec72c05404f7de2844dacd3e4cf
+31126a38f288b6ae9b7d8f2dfbc6da8ac0d7c81b1e33f3b0d42a36c4711f
+eaf8cb9fa6d4a4a92b6ac2214800466fb64367d9087f85fe66540f2cdace
+637f2d8f1a779e763ea7643d7ab1f37b5e7c3da5a24dc2e927da3937c07b
+4fef169bc767237647c3151dea42fc9d1c> ND
+/p
+<10bf31703f932f5ecb85f9f26ec0d7d79e55a006319a903b4934e0296676
+bb7a5df970714192f29a85860f4cb191aa4b83ebc5b58328ecf58ed9d6ff
+d0d3a63dd21733d64450e3abce2a149390b0894b2fb0fce1ee78d045f446
+04c31c787e13fdae7e79785a1956f734ed54b976e123646b63ce5bee0b68
+59b26a26c2ad993325ab7bd77cdd1be893a8ccd1451854fed772889a0d7d
+7791ac97d81ac7> ND
+/r
+<10bf31703e6aa4be08d01c511eaadd0473a3483c7b936ed6e6cf91cffcbd
+a815b8df60ae150c20432c17a46c0682480f6226770a8905e960aec3fe5e
+934f4cc994b08abf0fc9d432168086e4> ND
+/s
+<10bf3170586c182310772ef569c52e8a28e70ab0d8a07df40f23a570f6b8
+110b6ca531096c401daf049a20dcabf79d56164e73db3a474a30573096a7
+404eb97e5ce29f730842fc393ad09b95ed0671e10fb71efb1a363521b013
+915cc88b3ac6f0ba589395594814da911281623368756fb16579fa9358a8
+75b177830c9cbc6555453d35bc648383a53ae4cf9040fc62716099ee082d
+9b7578cf9dde30b64249b8b9795ff42c9c8ae9907909c29f306594b1c23c
+555bcd231348fd1800442f0eb86aff30c0e412f71e22a228c30832473ba4
+3b655be973df9c78943b851583a400b4a0e41168da8a907e9f2f> ND
+/t
+<10bf31706fd71d386b6c99b1d09bb1ad104eda9ab80d9f94a735d54116f5
+9c58b6bda429b5392910a11f88b68881d1c7fdb07e40a06d14aa641d6e68
+4a64544555b97e482a6c7cb4aa6fb83472e09b52ff42b290b85900fae15f
+7904eb69f44b98bcd014> ND
+/u
+<10bf3170396d6c263643d7ba7494b52feb74e74b6fa68562a82a97fbbf5e
+bed8907781d8ac84572229182c5c4b88be68c16550f8f2c56a1aafc9bc96
+2dd9615eeaed29124f4b67a26151f4cd2e0ab6ff1b11f4d5d3a9d63d9288
+f75e43ea4479033e77ce4d726627ff6cb14d9150> ND
+end
+end
+put
+put
+dup /FontName get exch definefont pop
+end
+/ArialMT findfont /Encoding get
+dup 32 /space put
+dup 45 /hyphen put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+pop
+%ADOEndSubsetFont
+/ArialMT*1
+[
+32{/.notdef}repeat /space 12{/.notdef}repeat /hyphen 51{/.notdef}repeat /a /b /c
+/d /e /.notdef /g /h /i 2{/.notdef}repeat /l
+/m /n /o /p /.notdef /r /s /t
+/u 138{/.notdef}repeat
+] /ArialMT nfnt
+/ArialMT*1 findfont [11 0 0 -11 0 0 ]mfnt sfnt
+225.967 11 mov
+(unstructured single strand) sh
+119.633 75.3335 mov
+(multi-branched loop) sh
+274.967 43.8335 mov
+(b) sh
+281.348 43.8335 mov
+(ulge loop) sh
+189.633 156.001 mov
+(stem) sh
+256.967 160.667 mov
+(interior loop) sh
+294.967 75.3335 mov
+(hairpin loop) sh
+226.967 14 mo
+225.3 24.3335 li
+0 0 0 rgb
+s
+225.936 26.8286 mo
+226.691 25.2759 227.317 24.2881 228.054 23.063 cv
+223.074 22.2603 li
+223.221 22.7646 223.672 24.7886 223.9 26.5 cv
+224.146 28.332 224.252 29.9746 224.216 31.0225 cv
+224.51 30.0161 225.126 28.4902 225.936 26.8286 cv
+0 0 0 rgb
+f
+272.3 47 mo
+254.279 60.3345 li
+0 0 0 rgb
+s
+252.963 62.5474 mo
+254.597 61.9849 255.737 61.7295 257.124 61.3853 cv
+254.174 57.2939 li
+253.92 57.7544 252.807 59.5034 251.758 60.8755 cv
+250.636 62.3438 249.548 63.5791 248.78 64.2935 cv
+249.7 63.7905 251.216 63.1484 252.963 62.5474 cv
+0 0 0 rgb
+f
+307.331 79.5049 mo
+305.664 89.8389 li
+0 0 0 rgb
+s
+306.3 92.333 mo
+307.056 90.7803 307.682 89.7939 308.418 88.5674 cv
+303.438 87.7646 li
+303.585 88.2686 304.035 90.2939 304.265 92.0049 cv
+304.511 93.8369 304.616 95.4795 304.58 96.5283 cv
+304.874 95.5205 305.49 93.9951 306.3 92.333 cv
+0 0 0 rgb
+f
+205.244 79.9995 mo
+211.74 88.2061 li
+0 0 0 rgb
+s
+214.01 89.4229 mo
+213.375 87.8174 213.068 86.6885 212.663 85.3174 cv
+208.707 88.4482 li
+209.179 88.6807 210.976 89.7158 212.393 90.7021 cv
+213.91 91.7568 215.192 92.7881 215.941 93.5244 cv
+215.397 92.6279 214.688 91.1416 214.01 89.4229 cv
+0 0 0 rgb
+f
+200.245 145.54 mo
+203.499 135.591 li
+0 0 0 rgb
+s
+203.259 133.028 mo
+202.271 134.444 201.499 135.321 200.581 136.417 cv
+205.375 137.985 li
+205.309 137.464 205.179 135.396 205.218 133.669 cv
+205.26 131.819 205.411 130.181 205.611 129.151 cv
+205.163 130.101 204.317 131.513 203.259 133.028 cv
+0 0 0 rgb
+f
+279.886 148.997 mo
+274.867 139.812 li
+0 0 0 rgb
+s
+272.835 138.231 mo
+273.189 139.921 273.301 141.085 273.47 142.503 cv
+277.896 140.085 li
+277.472 139.776 275.875 138.454 274.645 137.243 cv
+273.326 135.946 272.236 134.714 271.623 133.862 cv
+272.007 134.839 272.456 136.421 272.835 138.231 cv
+0 0 0 rgb
+f
+grestore % PSGState
+%ADOBeginClientInjection: EndPageContent "AI10"
+userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse
+%ADOEndClientInjection: EndPageContent "AI10"
+% page clip
+grestore
+grestore % PSGState
+Adobe_AGM_Core/AGMCORE_save get restore
+%%PageTrailer
+%ADOBeginClientInjection: PageTrailer Start "AI10"
+%ADOEndClientInjection: PageTrailer Start "AI10"
+Adobe_AGM_Image/page_trailer get exec
+Adobe_CoolType_Core/page_trailer get exec
+Adobe_AGM_Core/page_trailer get exec
+currentdict Adobe_AGM_Utils eq {end} if
+%ADOBeginClientInjection: PageTrailer End "AI10"
+%ADOEndClientInjection: PageTrailer End "AI10"
+%%Trailer
+%ADOBeginClientInjection: DocumentTrailer Start "AI10"
+%ADOEndClientInjection: DocumentTrailer Start "AI10"
+Adobe_AGM_Image/doc_trailer get exec
+Adobe_CoolType_Core/doc_trailer get exec
+Adobe_AGM_Core/doc_trailer get exec
+%ADOBeginClientInjection: DocumentTrailer End "AI10"
+%ADOEndClientInjection: DocumentTrailer End "AI10"
+%%EOF
+%AI9_PrintingDataEnd
+
+userdict /AI9_read_buffer 256 string put
+userdict begin
+/ai9_skip_data
+{
+ mark
+ {
+ currentfile AI9_read_buffer { readline } stopped
+ {
+ }
+ {
+ not
+ {
+ exit
+ } if
+ (%AI9_PrivateDataEnd) eq
+ {
+ exit
+ } if
+ } ifelse
+ } loop
+ cleartomark
+} def
+end
+userdict /ai9_skip_data get exec
+%AI9_PrivateDataBegin
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Adobe Illustrator(R) 10.0
+%%AI8_CreatorVersion: 10.0
+%%For: (Sean R Eddy) (Washington University)
+%%Title: (rna_elements.eps)
+%%CreationDate: 3/27/03 8:56 AM
+%AI9_DataStream
+%Gas/p>H]?pFe/ED!<.b%*XG:rLK%M6DZ*%^VG5uF,"Tk*0FT*[,EaOT=OjRWQGk*4^Rsu<l6[t%Y\B6U<I:p7)):<AA&Q$u%tFB'
+%O5GCgmlp[;V]Ys7X1&r">E7t8W8[,Wr<KMJrp[\8qt9sNJ+l;p*iZQVUPp:]g`eu>IN3.p=+9l5qY'[\_rkBTqKVCG^A7)Umlu9t
+%k,Yt`^7X"ArqYIOr8WRYr:s,P]pnJ?q-3m]s*jk2O5GD4[m0ieO8\4qYJ5PdDQj*3O8n8WjmR]umf!.\a%sIBTASpp_t/ZZn"6f`
+%]5Qj#p/c1Y5C`Fj^\Dc]s*!d:nPjl6iqNBL2p^Bg^OQ7E2uE2ZhO#sTIatY%o2#DaFhW/0c[YrR^]/W[mbKgo5L%OC5(<8KJ*E$n
+%j;7L4Qi:TH4hpmu+3*L5T>0;;hgW$&q<e(*?_6EI:Huf_If at O"0/*%.?i)5.4MOnlUA3REIJH\:nt5p%5PY4B5DoI?5Q05ar$VM)
+%^#c``bP1r"=$Q:<d[)%pgC&M%^AEWZ+26ZYl/s3q_r'n>J,OhFhN(t':k)a,ngOM3TDnZ`+(]B)Qqr3)iN8(!XgS#]?iJ/Vp-67F
+%s6H_ps0Chaj0nsJe*#W$qu><_MJ9M]^AHqtJ,=\EqR[:,1l<r92SQ9i00cW<rl`$(pZk%n5G+MEZ^6";qn&KqmJQUgr>@]sq#4Ka
+%rN!CK^Akg[q=aR_n,1*&oZd+P3<&nq^YU&]qshEb&,N&-Gc]k]Q.Fh^CiAR]I`:g-nt5=#pE/U;qn(a8lJjY7_W(Rge%=MNqs`.B
+%5%!Y)s8B.`fDF%#p\"?_+7\MFfX#N]MY6igpa)"#jd5b[2h*7,n'(PkIsSU'AAp.6oe6@<]_RWcTDd[Brr9]Z6'gj.kPa@$e,N2c
+%emEq)^"]<7r:$U$r!.W.rQ!fDpU>YKQfmi4c>UJsDI];'q";730<]:YIH!W."pK7I\'L\\h/D3;n,N?I^TO&Uok0<`J,SXk5PiLu
+%G]*Q at 8+FXYO+6s@_XZ[%:As[;J,O(G0(^rYnZ0/![b'80^AXTa&aNLEHkk:a0fhPo?[qn=(F[A0eFAiO$0;D at o$?0@@[TH0qSQZg
+%s69RYiT't7n1T:hfDFBZFn:6(leAW#rX-:7TAT'Dr9V%fqR:s/0teSt.-YUKcaWl!f0?qHQ!a(95CC/:^Pi*er361n?bZO7p"MXe
+%J$]1Jh7`WV[ibOk2tN[8ZT/!]07Ws[s7Y?!&EDMkGC=p%?*YP7+9.60pID at Rq/[YA]>+4jbY3-SMsltt0Afm5p$ors5J4+Hs5:*[
+%k2YWKf7*UT^]+$$+#(N\q#'h%f3bgiIJc=4>'U$.56%1Fs3Ar?fB9p'oABN6fqGn4r8F-kqtK!\JZU"YIJja[gZumuDa/OIrpA<d
+%ni(JHg&CV>r9:tGMP#Cqrr(`uh`oHW/GO_iJbf1en,Mm,r/q#f^HDKKpNlT$n,N at D^AI'Un, at U9?bQ?\L-4&]r:)F(chHn2T7$Fi
+%qi,)JJ+Rq,0\H-g53uX)r8ugfbWe_apih5^gOFHlrSn+a_AiC=?gSBih`im.niZC`NTg2us2=1>:#CEk)'bN at efXqMq<MD4GMh(G
+%ps[8GruV44n%YBb5J?sW\,RN%dI0p.qg\GaDr3eDGNS\>'`[s/56ZfAj[Xhi3lYCK"0fuKqJRGQ4&:85M7<?\hesY8D=;u2f+2mM
+%+l>/:E:+s at 4cd2"lWuHM*:>hI at u'Z7UE+(A4_ at 8s*b0s;O*'H(?D4cMe8pj\i[hWpI?tN6Hd6p/H.7#'1E?!KoB+Lo3EM/$c#o#S
+%Y0t>BAYtcrI\^8p,P7:_^!",jQjZ7/q<DqU@=uYmbk\8q:Q5+ZY8WE86KW3,Da!V+iGN5i<^Npr:O]P(EJ1p?;-+h%jJUJPleM$k
+%Q#hB@],n;t]M#kOkG_U;=_j%+SB!U(4VuFcm=!j3^hlu\7p%4"\6J2\XZG1]kL&9u6/jA2h/aSg`),#7lY^q&j1au(V^&!#G.h&)
+%A&`N,G.5tJM"+.pVMchJM,cQ>jq23#Ze^1&8L9==p,)3kNoOR`g2XRV/llJSB:8L>SG0u]#$-b^>dIG=@a6"JCAXGOm)`W*A)irs
+%e_A=@8n5T<Oo%=3\ajb0#3fCEd>jJr=T(q*cFAm_p6+*kej at RC5'K'M*CE!- at Mr<_Ck\LRI0LH:O/n?=W5l(>#RBLUcb"tuMX4*N
+%#QIogW[qGWPNUVHc>J'tHlWt"=[tX_4$Q*\aqc(iC)o_)SpJ?g$I at I"l?q$b=cOA%gY1;kWuboGH/'pVS24P%]8SONH^)[uc;OI_
+%bbIq)4eLt]Z.CQIKl&BD#ki;'\?Y:CT;`n`6,l6P^167T6Vgco=3o)4Z)"Y#fJ!:b7V+sTX*<.gb_tA[]3]^8W<Ia6a69!/EGKh]
+%I-Xo!hD)E@=fs9/CU*VB?*0F,E+QbJDoq76GfuV^i>SPbf=oQj at ucJVO4[o&l[:YIYHi--cL]UoY-VUf/FHnCYD]7E0kBX"oR:0`
+%jY$:I^KB*9ACp6Ok8j"pYAt0OHAN!&`+/Leijj2-XL.'@feY/^gWY1;kPI$npUJeGlqKHW/ET,K>_tTaf,[=T)+R6L\b;9r4"qTj
+%cj&W1bB;&l!K;3Y^1<81iE>*ZiD8ifFWUNmhsR8`H-OSmVMNKmY.'EP&jM+`Zgk/+es/Zefa<1ANMBK=A?WAX"C=^6#%%WehJ9NG
+%^G&J(YV"8ik1;l"G3%NOabsJ5.`dG7`4.]ea6"I&YeqRS^ZCuF4k5]uq6OQ!f9m9&R*#`RXj)_[+=a4TnPFD7A#PC;mbt6_n:RiJ
+%A+r"9 at Wjr]*\lO,5iC3cAALb<^X at CXQ1kku3'6JI<*T\^)eG9Plcu!O%3*'t2"Al$lWA"'d(#]1ed65P7u]rU+<bZbC0oqSD1Pm%
+%6p at etGPHE@@+3 at uD14Pe)cR9OT.Q?t8 at WX0`.RT)2dWfcVfZ6-)ig?Eb_1_n+"\V4kF+Z.]J#kVM%Jj4A)$ia=r4,m?Y*JthhqeV
+%MJ$baD"UJ5"&`4;$%^b8L>4.R"F+O(N$?3%feA,,h*=XrYqhtkVGo8IElC.:N,)jr=2iQr]Q+3mer!s4!+GD/i7P)9G8lVlhL@/p
+%_;.c)VDVsZ4\bVr0C48RKV)Q?A.-_tneG%Uf^"f<mU1=T(Q6*J6_W6!o=iXq't+5*aYukEP6R*iRlQLsn_,5]eBZ.E?'3YcBnKmm
+%@h'<Ha$6Fh\A9<pBjnD9C`Jp=i2m8[qZ$s5/XCY!qLXH9efF%k:Xd2$9-Gp<0Dqa=7KJ0Y"CU!u-AX15CU_o$F1LRY&3CO*=9Oa*
+%fYl,DRpJlQoh9aK4TLbQ1tJnV"uN+rGmi!iWi$r$"5Xk$ehQQ??W_O2_+//d*nU5FIBa/9iedl>Y+NprkJB5g*Ocu6&g5rJ_\%%O
+%c+_N1Je8gO`_N]6!YT6Z9o.nR@:-r7re`qRL^hDPHOUj.-]Wk=1\%dfoHaU:l.UM9FCF%AFQ0d54^Z#r$`rVXBn:M4BEDUn't+hR
+%44nkR^oWZb::Gc.HJWo8fSbe4B3YJd"L:t+3-2_Fk]cR*`9R[Q&FU!8J at GiEn\1A]!pacV-,u=mXLXqs$Gb`5Lc-uIF0oq;Pl+Rs
+%Z)0\t`m&sLE;Uc)-Veac1Z/n3"7"hnJFD=0Q2H"MO3(16$m`"fDI*[ADuocW at 1JQ!=XLk4n7Sd8biUn:&[=7,k,<>$m-pMQH^P'*
+%<ZrB6Q*!&/nU>+Q>gQ,I4g"dL_X:/#4$Omh)?&\rj'lT:Yp-H>kb$-p1uO-"8DnL,cJK:T3m\/h,i8B"@H88HP9`EuE!['lUk\Mu
+%!W:k(`3[#-,l[!7F^>.O&YXm`AqkfPfm!KjVNdi]K_<<1YS_S>(?#!7G(=?Kf;jlM4!?H,&`@_S4rY++,/2(n`M/3DKLkn#C25a1
+%3KIA`mk]1-eY/1N5);4="-=?J.g2OJAT8RF!g\F:>gP_E%n,EpE*=GM1`=`rO1d.G\Q<9H#$fcK at rM-3N@]";cj?3^^m"(IN'$Q-
+%$1?70URa2PU(/,4:kocn\2P+WaG^c55%EV%V0(Q!C9edbSgC[e9Y+P`Mc'UWdBFWTW/l'B'k`'>!j!q8%&EK?EC7Ak^3p,,*W0<C
+%,\\rL4X=k])*kiY0W87t-c)\<Ud4^;5l^-Q=MZ^S)Lqo7Lml3$>_N#H\;-LA6>L+@>@[nVB;c\4I#Dh!fYbQ11&-P,pe at 2<S9RDC
+%JWgPO6=+(#E&r]k#(,i%\-"'5mi+rRq-MYnrR$Obd9[qigCOhaOE_lsKC?Uh0#!oRE:SDS)*ni7"9S+pTn$:X7m(>B<-e"r:eJ8S
+%+]'jVDF.4#:jYld([dF[!O_]FW54%1UC4:nQM/HnTE7QM$3#<c""V5%>65DhDVi+;e2Q#_qN)>A*>d&ZNgBIGJ1D=MMFE1RZf/"C
+%)$)6`E!L8%KDum`%$T>$p;5$VkBUC;E>$f!&\q3doEPX/33H13Su?9a)LNnT!S\GP>TA#f0l_Aod$b_38:8+s]g->VY!M$l2&F2E
+%&cIR&E+#VQ-pTL!KqRZSL2e$6^@GdTV32rVfI*I*s24hS`$4DO+SFA0"9U295r-/r)Cs0&Hm-l<"!Q7":*V"3i40F)J;-=0)Gblo
+%!WK at 5Id]A91\c1R2-ajjrl47*Yct&(B[a=rXRIUM!J_m^*108m)&k2S3*XS8+UrJ-j.naZEN+"&,6LIGiu\jP`kDFWCh5nW_-WW6
+%ZQidWHkR:%M)JE]3eF(;GITn(>o$9-#'&8t!-`s^1 at ZJg-6*co*@^=JXp]9+dICLP.t',i6G^5.?BB&4o::Xc1B=bkbCJ5G[O*1t
+%Dg^`:OEGq_`##/;bm&tJk\q_M&h'T8=a-"O*:Y.pUB(WSq;0g\4;bl(-R.e%5$]9uX!"3M'[$bA"'VuL at 3D9-!>^c9aLa8Lr<_<A
+%Jt_*W*G.ZtK_HZ^fJ<(;(dZ)+!O6If.7,59&7BGG2!F(ibM]4!cQYZ*cL"%SgaDU7=&^"?%%'`mpXW/e&:>'p/*$/=9#Ag_f+ at k+
+%IITq=Ee7YP!+?qt[=gN`de=2H#V$#)"rHCMiFAtJ%B<*()mfm:JLqHGZX9Ooa++F)),UJ/_j83"?q%ER"iEJ!>qS\g9S,6Z^^"g4
+%N'!mTn?8<0]%Lnuk^@@nI03C;qt&f5Ns`5-fX659@@E\#h-EKkUY$Lt&C-^_6Bfd13ZihAL%#ho)!(+:OCWp)fSd6'GqTI%LrWW(
+%AGcP%`\6k@'CuIo#8)iD7?#*U1MH48$bM8('%kLdI7 at O?q#n1\aPH2uThG/Cf&-[j449:YJDETl#p!`c+`cKFM62D$eH,%;=L/OZ
+%AY^VJ)5%*9i9<FCXBjf=0rd!3'YG\X7j/C^R4Z9bXlBNj>:;@\'djcP<>mP```>s[#Ef_PeC7Sln8,eRBi_:=/e`?W`$Xho?4 at 0+
+%/@,:("l]h>(]1d!KF[n at 7HsmY>QG\e!'ZhPA-rMj'G'=7iD(L>[)7t-/Ir,!SfM`0,rC:hkiifF=D&-?'^H#;!)2<8Tgm;Jg[HP?
+%,CfgJ\Wd18m0n^NBh6nb-CJ7(2ut"/6^ee/p$gnB&SQ.u=]R-?``:&if8'9V[38)Bp-S,D$RI[%co25%&=$(qlSt_8&/W1f$5f&\
+%Hh,+6:[<]&M>!Ef5O*jNL&daj'V8pqqJg/"l/61sMte`ea<qSV"rL/K6!+=^("l/f"!.^@V?USV=kLlV0SPKRX-!gP8*F-mhNJ1%
+%h;aT1m+]<0mKJVG?\6VV(`K[g'-oE=h[%JsAjOfE#9>"-&^C)jUi255g%QC]?78nhm0AN$Imb7GAHcIr+qAcD\JI>cKK!mMgXe(c
+%/.e,&dBR'J/9j(]L_'T%0%L#M4o:WK5`Zc@<?fN&[TlWs_!UEcjlQRX at 0XUN/4p;eb5ntm at PohMLBWtj9MCem8NRi4&cSIVU)Kml
+%O]Z8,k(:G>H;VW"V$PBp%RhKDX,3R-:k]C;#BhKs',+#gFafIn-7Ip2KP6DLH=9#E4[C]F9&(X5#Rj$]D`Cce!Uu(.kgJ8+NCZC!
+%^^1=sV&EFX*<?A_c at kTf.g8e_C98'S`3SCu\E)Z$&Gi:K!F*'QN[F#0'=$_PO+AK2GL;sOKF"cCVr34469i8rmMl-B+Wc_aggV<D
+%,Jj!Yd,:"D[oAXsl]&u$oZ:,s at VQ12S-aS"E8$,Yr)ErKi(+t%9FF><P\4F!l2);_0<VRRos-Db!['6;oGo"6qhN`/3NC=0pXu,E
+%`WP*d0L\dTY>CIn3(\I13/[uP%0O_.+Q/1DXEY)>l]K.AnA40H.KE2Qo>htMGVTNH1nn*,e3biBT/=Mqp&nJ5i6*>F19XI2"Xf.9
+%`+i*Wh^&QcKPRqj](8D\[^^lc[cEA\j<TO%(OhDX_/X5`j='O'fO/+7@`knX&;$8Vm6D^ZUJZH$??@nGi(Om2ai6UG:/<==.!?.S
+%,.sY@=t]g.9-D$P#&h^XlQmn`=%ZqSq"9h1LH-W3r`$LQ^>m@`f*O$&j$3o$&Wa:7TX[,I<j<ltJ26Jo[[B9j,jZ^gM44culjbti
+%mT;mldtm%<e4X0"Y%&K&+1h!*\?h:$f1<+tfFbJR at 0Jna3_k(l`0LXXeo#p=L25F'$0or+e1R!?,NLpr,T at p=!%k8`%ti@@ec;lq
+%E+uC(&:cPV#XWLgDn#l[^UnIfceHTd!XQM]'g<*bK)081695NDBSUlNU]J%E_XOr#K"@RM0O7N;_%3sX8SrE=eE:*mA/4R#4Q#Z1
+%d6p3[eG+d_E at cSAgBH=.!knu6g;LtUG[cE1Q']fs at I4>Rfs(`pK*6<:JceYHDRNVtm<X*>#8H2&)tJ(>&N=,\Zj^Rm?qBD\6$*-^
+%_j=^AM9Y)Ob-9q0,iC$=(FX[J#!k1ikX)PH7&2kg?bgQ_l8^=jK4FMNlrfT._.2K[TG2t4:he&Z04aN5!3eDr?guJg7NNP?*\P+c
+%`]k$K;[WgaENR(g+ at -:1<>TZ<QRDD5DK-j,\e:D'!]2f)6gt)Q.t<m^#g&88Q,kuEkq4I%*7ok"_%55[+>3a>clG4^Tc^1a#8!ga
+%IKub>:t6gfb^q&8%(tWT;3C at tIXo*E]+]5lYbTBoj(f9(fQG%p'H!B``,ZN;QV"/$iYESd]R\Qf+:?Ojb\Gu/=i7t1F[Wu at UXkWq
+%#D3:6G%`3*0_)_mP6)lGp8FQr^LX-R-DGA\0O^Oo!CD:pU-sA%SA.E-(#B$9e,\83J&Y%"=Um0Ti7 at s8BJh!I_jg.!j]O5JKVF43
+%:Bf;YD/MH:;*P+pHsPt'\.8G&TU?+u":!F!$UT#fO2Sbu7BUaNedS'&'cd$uNBl9,)s2O$h_`5m:0)rhK=qAUB7ldOS;7Ed'G6gY
+%kNcM?CsB^@'Sl<f!pPh"Cd-$pJh3i<]Ko[24(6+teE8YO7M"5+"r'bR")Vun0Z:la'67D&c/@62=eRUu,/h%NBc42_2RG3N.EEde
+%*<u,*3O7)7%9?/U!S&*.Pb<nl at r;.L#CXC<E@\0^Ju8am(bC;PIJal?]SLR)<*$RPn[81o$&qDl#OHS"<gK/n![n_;HH2[&UsJ)=
+%7$*0R2E2;r)61W at 24/h3W[S(]Nm_@\">uoCfu!?4N1Yq4!3TZ0)[!Wind2]H55)o^+k:hcHCAUQjKY^UO9&<K4ePh%%4YdTVaOr;
+%VKq8 at 4Vi]7AK25X)j&tT$aCX&'%74\Nch8#agU+saBIfHQ$Irsd"a.RlC')OWZ7*EEPkH\ke\-%_KAC5i]43B'k!&@+si$B*D9 at 7
+%'#3DsSNr7%n*E.lVl\T7DF`HB,AYrEIJ*gT@!6fH&eRY.7Jt*FC5+SXG>PPKFdeoBBtSjT#29Yq%el"GGS`odU,H-Qo!Fpp_&6h%
+%r5P9$`chEH&^U>s&]8$KSgNt7)-sl6J/Z9Jm]lo^2kdP`@C%Xa>`W/;;/5)c4.WbZ-6C2o:VhDE!dS*8ZSM3kYFC(&@9Iq8aRbDp
+%TV-:DM#sJ1Q5;`IiB.r`JDe6&_,>lg.>2S>Ii'Cs^iojWLcq-F+F`485-PR2gjfOnN/Oo!T]^=@%VnL8Su at 1^1\V']@p'^F262HE
+%5lJGQ7`]Z.0EtH6GQg9#+G]d_bBR&HlO.F:49:8"kc?ZCGq)E>b2k9t=?no<^2et#5^S>E+TTi:'j]cPnUn<E1b,PY=0^9^4jal#
+%lna(nJ(bi at A(CC.fDn>Wb4ZqlecZPY7fYlaMZl4]ph[T;+5YfupIP'tZa:a7- at cru(/P*_<X!^hOatRk?pARB&u:@Pm8`pX?dh,<
+%35OAr-\5%JX<Nc/'u`6Ie-Rg:*muo."OT"ZikFs96NJtbJt?\5L.>nOOo^E+!"kkqGnlVI?13VG2BU*tYf=W/5bK3^HbLQUL90ot
+%(ejNlRSP^;aO^GAf2-]%+rFaL4^qL@%9+"ADE\G&%@9.H!ku*7^NM,l+^/lbL0Ym/*HfP(Rd[;\"-(.NTIV?cX%0_=kp\lS*oM_Z
+%!Q;T<0p&N,m-E%dG(L%t!Z!(bNR(Wgke at gVYTmE#O(3B(KK.Ka$S!#C6%E2X\&D8]+g:BjM84:Y81El@)?L^knsZ/X'+M`#hY(>[
+%<[?O0Osd]K=Sr6n_Zj6_0\Nfb)RU05Y(N?=9(!?c0+%W6%LpfQ_dHeo2 at jfZ$VN6NN1.tDH8C-):"`F&_H4)?pH_n/*f86<@YAia
+%*gdQ<GCq+l1LaGEQ0&:fd"YCGih[;]MNRK0M";\Wh"aR@:8Jq;k%QdcLOqpG*O&$Rh!AD4%=Qds2FAACSc:r%;"sklgml.s_$)M+
+%["ZaiCFV'j'7N3SH+o:1i_MAAcU6_<(P.!.(`P(:(-kRhqEWt#EKPXU6UKMOrEdVP^^@@_YdNL@;"5ic4/(eeC5%#\CU6\BP.c%`
+%QffH,2;uQ-VdL6r8auiYl,AEEa+9EF.<@M@\q/X[PT>'BSUf/(rpUQa])ZiaJIUP%%>VqI-tXSSpV at WkVi^0ZZ.T[T16JN]-_a'Q
+%n5pVS5R4"7(@Mqo5u\+/cUU<$%mYW'KGj4JRM[/3ld>#!#s3n4^[pHe_Ng-$?of<4>fC4in(<KAF*PpB#Z3/hXHpX3gRW:fkr!eq
+%49n1u]5%ln#mT1T(2uFE'AFMN>"H+K$T/NVMEmFOF\k1II.W/O@"$=Klj]&K5T)o?.\J/1Y>caXj)?%[HJ6aXE<%5&LPEbR!WIG3
+%CaL(cKEsPWARbuiBAH;4Q!\pjk!^p?"L6+^/F9tpUd;)C7LM`EPrqZ+"Ue5HX;D33`)@8F&`bq[Rt.so.cu["JsB4=!Wh;Ujl(U]
+%-$BmVPJo%kO6E",a#MTX=(p`SNu:(T3RSMjnVA,7ER&jr at 6k>T=A(hm$AI:r4;eU.G8S'71LRrm."W"<=S[n'n^O3``%>@6B`go`
+%/.19)gogV+&ZQk%/Pn_Ib_dr&g]g;69lga$&L5DerJ2k8cPinH\pYQi:Tn]#s#Gmaa\uE8)>F5m#:Prh0qH?Z%4-Q2kUP&'@#%dZ
+%=GR/]\taiT#(<1=/-t1@@#C-j'2>YuK#DXMIN:^*!VeZXe:YUp]3tjIgLP?#QNl2MLR#S=)"*m4[T!)JYQIHN&hq_O\lCNk^(2+s
+%hMK:t4<-%H>UhU8g7hXsh;N7i!UIS_h>dn1qdB*TdkE_H4_(lKoGa)rJ9W.3_YVV(i7S9J"1e9RBF?(5rWe/<'/=%DH!$5eT/8Y8
+%GQDD=/hjlqfmHDC6D1K;g-!.@!O+/C:rZCsad?f`eoTQ"4]lM7M*XPhLd>0FQdtW=3OZ6pZ3(8b21ggm\(;(^68=h[(fNeX(=0/l
+%\BMs]a>_n$cj\?q(b32.RW8m",h]p;_ at RVJb[eSIPi1:@3gMIU0CMlE+p8X$)/.$^4C">n.,JmfF_m-O-S]+JOLe,<&bmP*#j:p1
+%T]`mO3S%roLks>02uCfH6/HmHD>4RgPR)[-]ANi`eq#&kiur27FcW4pA`F)M$D;X_"Yf#f/e97a%#"Bce\<Eu.kZE'ZlI11]e!3O
+%gk>.sS0%epRq at 1>X/W$RYK;]k;M$Kj1(\Vph=)\Bk5c+G*YeJDAFk(t"`6c:Xtq7ai"QH=<V?kuF\@cHV/)sd at 1aM[igH1Q3!`+.
+%.^ih%.?jft?WiB@@'5?j$gen)MW[8r,t\c?>]]h,:b*G6SQgB5$lT7fY25,s"Eql4mBH]5Kh1Td3=E>R1h_6!Ed4g?"_'W2hIrMC
+%&X,9h(Hb(FTbaBU@[Q82CQ1MQef at b9b7aRWX)(oAp^W2f"s":21!^"b8[(#(i!E0[c)Uc(X5F#9')_>Tn'`i%,ZlCm:"@DX+@#pA
+%^3I%2AB3k,IL[#7`M0150o"!1T_Jg6Wl`37.h:%G[qVKJ/Q*JpMnr"g_h^a,pg>*i*j^g!9tISKA22&==iS?C=B>d`k'lkl[>8-8
+%DqBc0lHhE([O6S+W$@$=4;LV9?QO0RegAHK0HDc_F^$YSmZX(uQ?rdr`.2CVbn*c\^*n at q4Kr.Y3FmXVf?)T6KCJuO<$1WW&:Z,5
+%Ls#aMM*BG"6,H\nr59C,KU<be+m+=B_oa]1,!$QF;pQ5:+FEkk$Tepbk!J3 at I>VHB)E*D$5TobTZ9-Q=;=&WW1ggMockJGtN"sds
+%/U'\YiPDI;,!6P]5+4V/YrmrrR[=8Ofl@"TpBdirLbAebl;l+7*K=p/MI;GV.%G++V:D5IW`GBfeOaEbgB*8u[b?XIZ`sq,[\k(2
+%?F[1>?_*O=1SP$#FWug\OoZ#^Z*9FYq8-niV at ZdY4t7&k[h at t6=ZR+QM)J.iiV*GdlrNDkD"rXD-:1`t>-<4EL+ at jl:6qP at Jg$9m
+%7aNeW5.V&sdhT)Y+6lu3l$*ma6I7U9Ea+>0-LYFo4V)$b,^!`mW/qCkDIap[>08(:-WYugM$d.%pBb;P,bE9iL4u6rYNlAj7HDMr
+%LlXuj'ID_kMO'M/HtF!Zf"M6l]A=/GZd#'I@>?sT$b3b/]C7*tlSO4/56t#s!mGH?<6*Pm2XI7V(&]Uo=c4Y&RIJAmQ'=D\-(87/
+%WBlPa*r,,^([$61746#Ka_Acd/2AJ!!WoTS((lB2%^9!O&:r'MAn1 at KAJhH.]F*5$$c*8Q7YUmW*Y5q8Y1u.dEg849 at L`+i:%Xm/
+%Uuohmq\YB][SiN4B,(QCV]C"bnRNtiP^D'V7&[qGkd=R9"N at peGL-[6K%iG$,83HOkA1 at u+l/7DXn02t3d/^f#mj2M[2%86mOf-5
+%#2LJbK,Tjg7uMXJ'Oj<bVJ8.$/WA.2.5c>Q4<rA%C*?]Od.)qtM^DS=!c:Xl]M&M26=B(F/)[J0-(L%k.\5\/+WJcJCK!R],M==j
+%Ob`E3qZV<krnTgi`.`?RVUS7A(_)6W#9NquO/EE=_Wer/:TN>*:EE3jG5`&T_I'#C&H_)<NO5)F[P0#(3.*9aJij;g!s=+5'b$8@
+%:j/qdYp9-S\^tBr?;r,5-Z<ChiZ481r"V2X]>a4V;%BjV=_*sPKH\2P-^9(KABX+:TK1U,7h+-BiTimA2bQA#mqU_()E9-7KIuX3
+%I(dL2,#6-1idG>=5K6q'e6U_$Kcs16-<[_$\itFcHHOom)&$NS`o!!c_<d8Pd\ETU7lA*fGXR6Ere)E5ln8`VLgqi!":^D34`SH.
+%m>Aa[fRXMb at Lc0gQ@p)HAIZs'Cj>0I^!)7!F=c&!T),1T$K`PU/\I7EM?*!A)7;6(@rD%d`">!&]g2(--Z*TaUbCS=(p^aYV!0"l
+%RT<^\j;(LM%"^)]Q;4fekDD7)H=A3T!DW1T+KPmKAOo#l;%[0T,Zng&3bqXP`?"=q?a=pnN:a]+;191Y"d5X<0!!,AWu:_\?ssug
+%5]kLn[lukp$*ZHt7h<7bUA2sB1lN5M>\.,H&*BWI!JdfkK?P^40`p:NdieXGRCI0'O;1o0Z=KhFPm9T4"d=`Ob%K:N at 7ef(<BEjF
+%3E52KW!P+petUk4Z$8QU at 4]lU[r%H5qe"<0#JR(]$*hG_W"TO.UsL5^W).T/:=]eG_59.l$LIM'2h at _P%"pa1,5QRu\?1EKY%#*%
+%MpMPChq=1t(s at GHoMX=N_ at t>WC"0BoA""1j$_=h)1ui6j88`N*EW_n*YX6A2a32\ta.rlROL,8^B\HGiYWns>QYGFj+L]Y%lH*hH
+%pA9C7gqXFOpTt>/- at J1t:LqA[oBlVWW#jT_nE=TND at d5;@>@P=q[*Ub>oZlG at 4c<;;32K.`+GLSZ;r+mg/(A-Fm=XG(Bb(<"\oU9
+%Qoc5G-o^u,n:=9$`89,`T6h'o]M+a2^?oir(OVTP!5X2n5gV5A)"il?JAB"1!Q at J]]p&^6dbCdCZl<DEZUJluH:m]snHZL8eSQVB
+%g23Z1iWN%4YucR\Cl)'MbDJGf#O!rJl4_-\q(k.[Q_![q'2O.c@?Z>oL)P0g9hbE=/":WN[1.pUJ+dn+P2U at i>_pbSk"tV;PAd*&
+%^Na>62BnoQ($OG/7H6Sq"Ca9)4TkI=L1#NB6K&/m7sMq\@4G88YZV5U)_joRClIQ#LmiQ#I$#.;`?XBZ)Ia&l!N_/499dUXY2!Uk
+%3j(@n)0p%PFgC3A8-uThANRs;*U@:m$EFS(:<2V6f'<tI/eJ4N`X/""3 at s,"0=HY<c;nqGg_#nCe6(9IP/IhQ,o_Fu(<<qd at .fc%
+%L8CYQLC#R:P[_`l<u61Yj`,.C)8qtQCjVq"P^p[.)I$]&3kF-dJi&s*"5U)>p^\)dk*]%#%E6_6D%g=%KI7I02M:HT1i^6+a>YYo
+%-EEj.13c\IBJ&S/QI+Yr`>F?G=9&Ib=5p*9m+!3_*HJt at fPlE#YlFn-'[J,MoB&"*HLn@/'*IU`%osX at p_#2#,0(2/cF"I_-TVk^
+%jeGZ&nXcWD9pl4O(bb9mdOh`[`"qE=V^<*X;p17i?j!'l`;^*VG7R9+g[_Q\D.JJ]pLGM.2=>Z^TEoiLJ3.-kFtGt^7bK-r*8u8R
+%o*Wj:WQrP]TF;!sQ.5;'ksZHK489q/hITEnrC%_]%#)-OS1o.S)'CYG*;%;pFB`a+R*Zb[SW65<U"OL;bucl,0k]h`WX^_-1*!"]
+%33]g)J-6Bp5/]?BA/%qKD4ncBrIDf=\[Wg.BVq4"J;bb_>j3r7TT2,d]-3DW@%LJ5Xe9F?*S0ON4#+r4()M%\/_7[R''$;lC!LuG
+%-84ie$G=M8B%do^0q.OXd/[4(,BjT3cpK.EN&`21MEj;8=Vj(*5-V+0a0;G]SW\+t;)c=;Z&r(\+kWJ(r'7WUL<oEigf1?9T_QrD
+%.)6Ds6HXr`d`bn9gNjWa]:``I4fKgt0-jj[f]@5\WJWQH!&f<0ZNE3]K\b1]j&t^UiFel(c:\>BbOYUf('Yr/<Tus!JWeeB!S.$d
+%&XN<n7nJige8. at XVW1<pNV-%3q/)S]I,J)&_.&(s&M7CRm=lhhTnr(GW/kMR at Gi#[X9U6\1;]HkN=R_YnoQt^Vfn7XLX@^0Vg.(8
+%dYn1V"-3po!\8Ge;\?g_'^JlE7SgXML=+!c*hFC(8-lh([*dmB$q8(!5Y`3Ac"<t4fZ(7)l'8?(CJB7:fElNlp2fpYQ:qJBZ&+-I
+%k4*tq"1u?-IW9UqAKPBm\h/sH.;RsM6m[/FcDhO<4^Yo'\')Zu/XQtIAMJYiVm>=dPQmH#-d]2K%4".(3Wh/ZKo+J:2oPT==]p>R
+%,4)LT*XS*>9.CHs'b at 8LC@EbOcE:eN*+!11ARHO=Va at +_`'YMsn<jlE-7`EEDPG#a'1gmR*00H/>'7R5/7<NV at i$N$1nfWF4pDe[
+%][g?@+.4\9=e87NfbPZ!?p3q2=RG$)O;h;.S<+bC79Yj17,aGB/8&&Li5JM=$t at kRBjV<524k4u^>lLC1YZPlg)0lD^Rdlu;Q#@Z
+%2ARH^MQN_n<_F=B[3i-S`5>9-?IsopD$qV!]<0MiXQS-8`)E?mjVJ%Sp8epq&n!pR!HM98T5D-tFSJ\)83h7 at -krI+8mhYUgVg=5
+%TA?fYDUjr!coK_^_Zj88!3lum84hGf,b,K%^_WVXh;bd89S,/4 at Tc0eoGM/"gRna+YkC-TPJE`T4kV#_$?4$9?FIfUGB0VuE!XrS
+%mj!#<AB=u_K2k5Vfc&p.J]7-Q>-,J/_??)_D36-!R5KOB9Xu-=-[Lei*lO#!#:a*g5_b^/?D%o2+u[58U'oT%NG[[RJ6X[2Q6nt[
+%dI23\1i<Xlh8#U8-rVA7#bqD at 5hm[*.'$(;_3gR+C2a[<-fK3(P8O!_FVj`n1%fVk)gde)BqsCuJgsFX5T$n&K^+U+g&+p'8V#`]
+%j$;NL]BTaEmjT/j2F(i=_+mM7S*I>*n7sBt[WpNWQf[!McNh!pB-R\Uh$LS8)M-2h1L!iFI=`+u;aZ5>'B[]0Au7[39)()`!<8)4
+%^5p/a<ZYUGL$kEG)rpfqV0;Rc]AS_r-L?jSF:eU,X?fedS#;N\js(-mp&Ifpn?foY:JBZ#0`:8+7,0O,'MFVdGV0YlEp8P$IJ at Fc
+%"[ZuL55k`G"Jj`e8M8?Q^q at 8G4H52I:>95(^9Im8&WQi59$="#gG?:5SfJC+adtu3q&077,t_B&#tLrWiX*0sQCY4b9ir['QN2mI
+%-YO1AXK>!g6AI;LBK%_31Hej2r2&R%`HJRbVo=5CDRXG-l<unF[<iX42,ht#?H>5KaT<GAhK$(aDH7O3o7aLnok\G5$_Fpjg/mr?
+%^q9!/G)X4#Sm:UCq)_&X8*bhZmYu[--*dCQpI!004P2g8(9(7q3<]H/GhM3;(l`;D\U[M$-TeRq4DQVOih0R5R(?q;Ca=t^6CdCV
+%H*WPd=pLMNj#YZ<Iu?B>'hJ-LpUB7]JX*ZhO/K!1Ta_:;h-t%rD".FC6*3!l at V@E=^3Y$t73HGZIm$=L1'&!1:7qdtB7is;DhD\I
+%[MO_T8$)p@`3-GjRg=R0ibt^8D!RQLo^P<h!mlHdLpekhARc,&jAuXoD3u*.G#@l&I+N4UbL<4ZFcQ*s.RMMHlupG&$b%j6]EMY[
+%7l5X(.krH,FkK<3 at tHSmLTG:HQLNnPP.kp>b6AED8-dcc0ce)LapGt5D,8VmoK4.O$="46&iaD at eR>AYVe`3n+92dR(%#VZqaiB2
+%e"Hr#h3G4kDQ/U1I40)V]>YVYXMC:Z[UBU/d3k(T[LTZjJ2mi_dJ.KuUQCbSDi!J.T1g]`$1Ed'q!HIa9P7T()K9K@`.b=PBF.5(
+%e97A4:*gjUi;h.k\8;ue+PCoT!lc-"CkFbnN201O069#;U'TR-m@(6A'Js('NNROiEYJ8g?OW_6^Lld at Or-I(_Rf[og\f75[dI_i
+%+RoWTL=oNVq_BQgfX$qP%+r3C+orN>\IHZ6Nm3PJjJVep/\<PtO^p&3O?c8$W,%b#4]:rDX2+X at Q?KO,<K6dug^0]FDZn!$Urc*E
+%b6I'u+fMl8.?K>5XW$]V at m:Hbs,opn_!_\m>pd`dN!PU&b<ngB'&hn*cO:CoV:[b3_QhF!XWga8K(JAA0cs&C)-)`*q45)?C=-QG
+%[RSasfJZ-aca%o[3HTi4=Kr.dLANC+^lEd351$78%VtFm#H0MD8*G;-2\JS5iaZ at .n`^*7Zt$p:Oj&aFB9Clk*jIB1/W8Ff:'7c=
+%c168n`_eSS]O!:F<KksDWZ\niME7QcZ88)TJ>Xlq_j"4]1_P9]FP4Sji\hCCp^n(jA!j/^'q^(T0+5/SS$esV3/*KoAj7%(SqiY?
+%k:D3%N5AVLpVY!T&3ZqgrkUXgBZ/dJD8G.SLb:)PQ37EsUs+X$$,C+DY6^>C)@b[nZSnfUM#e3(/H3(-[9*J7>Ji*(+;lh,j5kj(
+%4O(3uql,Na'd7+t9.8.%pgBA`>E'"45U=5EcJ/1HhAG>WaE\o6cbje;j)dO_29Tl3pH!+d2eD=.%mMAl_I&q2$L`ga[AU=M6C9`n
+%-i/Cf&J%T$G`CuMRrHak`*.>ao4m)=ZnJZFG++I/$98fUI'mmA!_i:MDj.;CRaHRp9HWSg+9]YPK&?GOCOL6R0HN.+Nm[)ZNHRI"
+%ebM689oaP;h)hEW=[$V2Moh]pVV\Ob at M;.<[L=.$eni,Y=%u?mK;E4Hi&)%O6%lVL%]I=&Bj_QkV#1ZH?M;2Z['2ZO]EE:$!8iKu
+%?)YU;e9DP>,LIf!OU,L9SWiXKEk9X<//Qg[PO9[#%&nLH1bQ+9>K2TK*Qaa=<bo@(VorV]NR]pWTOYbuB/W`TkO-6V9IHC at G[M9c
+%]"5afHY<nc,Bg\4^n9Ybp,5OGe!UiZ>*4Wj<XT,d53'3[hO^2B/d.A<:CA;S?ZTBj28<+]r0o<)Qnu"^GX17#\6*t.%LX;BT9&(R
+%VmAF0_9.YfT6cM!Jo9/YhDn^bgcl_P6c(Zcnp)@&eR59mIlM1aHpQS%`c?gW9JkC&*VRr5<-';f8<"9BVi33of'f`,.JCr3(5s."
+%DE<OXJ?cB__$W)P5KY0QF_pfkJX)l1Z!!,A*TfW*5Bhl23C:if_Xj;q/>sXRZ*gZ'$L'QRH\r4."-?=Z_D&Lm#e8QEYc`p6$ChjN
+%%LuT/K4+dIG*edr!>-Z+3<nXMVnc:c35!_RdPg90fYE/58!"rRqf4E>a<SV'-r!KKp#SKC[DAa,T",t3e=jm#YQPF"4L,'ao!0qa
+%E>qcFa9'Cjm*eR:()$UgWZec7Z]1qF&HLo%kao4h&GtdWd\o[K4ijn#?fNH:*r1cR)+YKs;_7VgTg11o at 1$&uZlc)j/pAZQ&/:"]
+%RO(5kD/jIfG]i23H%'7on<\Gi.nUE1:]hXGTsPK6[P7kfN1J]gBo="h",5.%M3F8%!XJ3N4-0ii?*%IY*"f@)\pa13,^UQjP;&u6
+%C";_^VUk-Y+?C1WM%M;Jh8u7achfK"BNJF'&$0'[pIDC\j*CoR+T7J$MZp<Te6s"4:F1pScKGEFd?*psb1hb)dNg[72F"YHX$,Q8
+%LB=#s6ZAEpH(s7;PA&QqZMP=!mZrU[d0XblX*<a2Hse+hc]UGq\I)]#BYLTM5G9n^h[riKOJX=I>Hi,h`/&66ZMM\,^qC_mJ]sQ`
+%6!gJLW,O(6B@!.9!4eF"?)Nl5*!0bMA[5AFqE"%tcO[JcS)?";BZ=P^!kO("Hu<rd(I%u#XjbE8Q7^i>FhB%(%p<Pi&G4Ecq`Sf(
+%BC"5mhA/TH?oFB1N[Ss5D-eqc at d62I'(Aih(C-'[*l4:m.r_8SE?,Mr\*o?[1>ujV*bl7H'a8)VFa:9#GfbD060nV3QEAuPF'UC/
+%9ju'"T;HiIbNBG%J7^5i,ru/B\bS4T<fPDQ>(C:MLZcY]5#j$-*gM/h&Z6AfH(#B#m=i?Sc(a;r"96\20f*";MT_"oLB?+'GrL?!
+%D7mq4$',kHD;WW-KA`k>P'u9Ch4gZ[UitVYbO'sNGQO"Q&JVFlZ&LGm3]meBp-TSD5C30L/.O at B6QKr`=jtk@!d!"jpb\p/1X3)S
+%IOgJB':1C-=>ttJ="@/?7W-lQ(/51nT'2IJSckinH%+L9!95FlFObSbR=_Cr3ph6*Hak8QH@#:Sjo21dr/;HY/2,MK4c)?*2T0dm
+%EG*<<MDdOZkim<Jcf>preQFHl?3D+2Y<#W,3B!"r4.g$38"?(7j]sDl#C-j^-hPs;QSi%"]@cAbMqN:qpg5#KAu?O[R=^,BRZ2_T
+%b97f`,VVd:MK/2B[H9"rbM^Wf_L^\5NpFmUg+7,j3BP+\I`#=!,Su-sqQuLGh\daH,'Z`*:3=R?<?!7sU932i997BGJ2uX)d&Y&?
+%:e3K+M%JhPM=n)Vp];VT;2l'V6mJ(W1QO/)in_G78E]!"ie77M8ll'l:d#mj#9?K=3Sk+FE1(ngFt%d<k--p?^Ese#D1ip*Tb+Kd
+%@U)6e^/&9u&UR:/%e,<`2V9:<#KV+QrElIEGRBYC*W++e+N/kEliuMRC,CZ4a`+Y!.CjoqBLMWB=%P[^M>HJBnD3V\#HDEh"1IG3
+%>bb;hLhmj-=9lZ0H2n(r\&L:T3E?R]p07q<KF:Li.i">ZesV^l#(3RRQ)?"[ODJ-IJ/15[q5DkB\'5:o_`\%!OEi_L,>KTr?;;"r
+%>#n-"B'TP*po9#Y._Z6Rg-dGW_L*Ad at O7.FjocI.D;^e[_t%V%@e]5ML*[X?ACNBCf+e&0ASG_1s5 at 0?i,;CjSbqX0`6$Jmere0^
+%9?Q)S;,$nTG9l0MI=p+ZLgiB8i3msUj<[4Z6od6f"Jp^@T-qHa>*9n60$]c(r_"ngED2TG>F6'Shb?H\0mNG1Se':0&kqCuWC1o[
+%7j#_8V_8 at rl@]3AhG]pYO(!ke:.bYu4/=j5A(d3aQJuH=[V$f>Bb_#+G"/"<S2n0c''!@pV*=-%BN-*<3Np?2H1SkLHm-r7SpI*P
+%]J]644F'j/Q"Lr&)BZjp!R_d1F""u#YBu(W*h#5\K?YjFQ(MA=HbKd9!UbJ2gTUQ4l\P<f?G5CrG&n4.IC^BcM>%FqK;V%?.(;/@
+%l`b9uMJUij*YI'K8s%s>/7DpKWuZ2>=F8_#EB&UUYBn-AAHc0MS8=0'L<Y;H);**7Qr^F?\N$W'EoYFhA6OBWT<Ikq?:."fouQV;
+%D.AXX^AtSh+<gUC'I#@KTj/MXF'L(\g-Ia\R5ZD0Rhj01TbD^@D)/s6Cb7o0'C/sRphGgR"IFj<_E[(QO/3N`H%:peh,#qEn2:LP
+%JHi5P4s-U*@U1$LZU\%0ld$/`2Ebun.jjG<8d-X>eElX82e>SIWAP_mL(BlU=sAJJc]LXcbfS9VidsNoiD,qn6pV0G2c:qbV&Og6
+%+C[BWdn5&O%t'fDb?q,I#iI:E?6e1TL(`e#JS"#n_OQhc[b%fLG$(nZPqVJ-%uJR9S>)S;_p3dI:HG!7EU;c5\Nk*f8eJ+],;JP'
+%3^BX(=L>fgOWJ!+Z0_"2fh:g#$6*"dnDnkdo.Q":g<Mqt_-(L9BXU%GSef6qcbr/cm%MI[R^B-g1ehqr3hMj*V]/o;NEP0&["+E%
+%c56_ at DF:1l9?[UnU4_[;4ODA-K"AWtj*o710PX=`pTl$MGe5cGoX3[8PlS^P^Gt53f-?)'ff-QVJkW(P5HLJ&@[aZY<u&>c)D(jO
+%Z9c;G,+XeYGr(V2H;^JDJ.KQ2/3pS3JhV at 2>oCiE1mio<W?*-_:Mi%BgF?=OT^m+gbuJb:1Rua`7-6QDg8qZ`f%0m\ck`3cU=(0u
+%NaB.-jg*Od[W9^RgR,1nEPKm6;AnhX&,8FdVbAi at 3acA6=.-tDrF5)JAc(gpF5h,C*VudNNpmGeW))_N$P$ikk++;_#?9(j$t0k6
+%\MC$$1 at JS99-ju9pu>JbYZSmdiXk7GiRZ*k(;`'WAnEUHEunsY3fs#KFgGBnN5AM2e$2._./?j2L1e\jC_A(A%br[[bmZlJ.m7aC
+%YDU6:`,eW=#hd at YncTJYiM0hqc_q7VCg_6]Y&^>90EMt-eR^9b at 4"B4JdmK.D:Ssu0?=#J"(`Y:\8e5.k4Ok\c>L.DofQhoUSASV
+%g-F<Ei011I`iSAp:QNC"diWb?5!=Y<[R,G'*F5(8NC:"Ilp@,*'4\Nm='7Zb!dT&.9;l:[Wq-AsGn>.Enqf7+H/n4p]ch1gc8BUO
+%U(KTZB[nTQM#@I_J'Y>aK!WL^Vpbn4a@%E>FuNV?(0_Wu&SJ=ZW7_Yc/IZi*B6UEk*1"9m[G=YY:P_l?f\,4'5!,erm54KL-]V\r
+%+a=KUngFY at cHjnY?op^H"n'&JEag'7 at W?(C_V:)qqu09o"dD>DEFs`VX`2'A`%dG$k9MpH\WtdTF$aRNNo/S8(IuS8b>fN2"id>!
+%LNQ+r!6]R5#`fD1;d_0>.3:i*?]HmGVu_;+2L1"69__jU&-/dpQt(9A-O[/rbAl<15?O#G*kMM:*H$4+3eh>g]Sr+m)QbT="CX7n
+%e?#'B+80hXP_k0[*b#^>.Tg;[ANGSM/T;bCj^8CM"^(sHcdi)(\0TY%l=o5-Z0;X*@1egSB5BQDO,LDj+]o9ZYZq/`ll>U!ol.Dp
+%:\gdiX;GaH['!lti6:K2nWsLGa*,nE:R.MaR8$t9];`U[6V(j8b083P&<5iA9_RoD&;Cqm,nT'r,]M1C#?@';![^Sc>Tc&B5GC<%
+%hR4*6[ajco).f.uARm%r#+aJ^VtHA*5TriI,(^,)#aBAD#`.%QS<d$YqREsOA;n`F5E\I>hEgY<1U>PS5P4tXa2ni(BTX+@?,)h#
+%fg9mG+.cA8iaO"ubW==#?7%B:TWFkR+J>D+Z6R:0^i1*kG<!b#+g:CQ<k#KN<k9=&3Gc`*#!8&4"f\eLLJ,&CfIY"U__\KR1pI?&
+%rr at YAL:K2$dt9TdK"U"Vm9>:/i8<'0:(Z8#Eb?X1 at YbW\bLq_5.2m8tn__P6'<RQ at A'm^231W@"<?0QZfZtre*NrNLBNb#[fS8X<
+%(f^NSBII3Mba at Ksr961Oe&QD9[W>QoDI&"'Bq71'T(+_\_7B&:O"R!)>te_C"85Y?"[60L6?st;SKj<QeEV$!^GMrBHM7UFX at RMl
+%cok^8U=6Xn-E-BlSe5u0 at a=^fk(A.ABaqi[h2^BSmitP0 at 9@!D;\#f^&OJFkDS)'#Z*4Q(D49O#erZT&T:5XtHG)WN[c*on:@$Xd
+%:$4135#NnrhuRWKG+J^sY\H[5&7$l$Y5[tQ-m[e*Rn7:Dg;0WQQKZ`KlINat^hGUf:(L*c^`LlQs6,7OVsZN]HT@]?Ef"OjLdpj2
+%\=hJ%TH9XEJ\C)^:<[o5CFB/q'&)1hN!m7XT'Js[X(j[PLkW1Q])r2.Z5ljV#X5aG^B;[`a'd]SG1)b5FJ-5*i^^8MS^gqt8:Z"L
+%N,r4OHk<lI4iGE_F0Sc32SC?hg'=I6`VDJ;,'r!`'g/Cl+2m at OmoYT&1-np1P^oL4.stGq'HD>pP.<R,Jt;*8F!pHG$(:s@:>;Aa
+%X*Bm164,qE>nCfY$NtFhXAmqR<J at M6"N`33>#%D)[%Rr%2J1sZg>-=0bP<37F5WXA at k6$*FU<8r("4=LcqX;];'Efud\)9Nn2:i2
+%$uH<tTPD45Ol=7<p<8]PGr]@I3YmT3M`AZ+ER=FS34n^n4ndRP(5[IoT*mqj+i!0gct7o[m*6oi]dR9kg\SM>XTreY?3qGq>dN$Q
+%L*I@=Tm at kbmQ1:rUb>RIFLN9kh121Tg9&,r!J&7CG8=s?dtE)'4L'$=[f7rj<j(f],:sfTD!h!Q`A)rrML^L7<eTID^Od+]drOgP
+%nj#CpfP2[6Z3%\'2jOmG``k\.e/7;jcQlQl`>MKJbPZKNF%kpUUploud&2F:f5\ap$'DHK]%D'b&>91CKNL=7@<qa/4nC09I&42G
+%.KQh2GnLjs77YN=M&DU'5 at 3Ko6r8Y;<<A8g(u$iHiUdb7H8P(]RU_E(hOWnF&9Lh1XX<[Fh2L[a(_rrXC[T[1i+;rrlX5q$1QUYa
+%SgAV,6e(^$*0ZlF`kc&p':R"S,@$BGT\<6BQQ"T.LUIUXWekDBLfmrOn0"ukZ*jeU5]#1r;,A<'!]6GZLSi>\[Y!*;G&<W?ojeTE
+%k4(-VAj?bYH6rB at W)omDM8sdoF*Ei['^p'Q_m72ok6Ce at hhRc[E!^'RMf0Q)*J?D>I4gh(<f\NMnCi"Jd;ZoX;(/,H!KI;,C-1&V
+%,3A<;#$06154N[=]4W&BV5"8#@hD3`jRr(SlgeX(4?>GJl10(%f'Zp!.qhbJ[O%ul*Ff?[GIXZ4WZ?0-`n;6o\O1`6LWf*kk at IEO
+%7"sTIc^;u'm;4_dq;6scY^P*5#7HjOl(o46ZZ at 0MZZ3_(j7X$Na(^7/??Z@>$=q7-I!(5M:fAL2hHmhQ![P)[&/0F3g$W5Wd1=CL
+%Xr#C:V?`UoGDHfbK,0),ZX3.7B,]ZE];XbR at AP#7+hl<"LBXM:-mH<lYB@)1n/<H:QZMK*LrB4I8O#:b:ANccaV%%_\oa=1QfQZW
+%*@m0'4\S.S,?j#D+BN1frN^igQ;E0gcI%(F+:$j0>d at N$0XZ'H`X1S$SK]sKN2PC43<?iRI*tkLWcuNr9\:n4Un[VNa$4AU;E(n]
+%eSBe4gNoJ=%WL0-9W=>;5(/5Ap!^pAA+j at 2lFjG>k?WXV:_!_F2+[MBcAo33G-Len:3fPJTc^+aeJAm^kYS2,bN)1G<r^n'8n9rZ
+%D8J\K&*0e.dDLD at 3h:>aSc at SC!>`o_1+`>!UQGcu2gRKq2&a]>1*,qKbj:^UYm.AcYCVDZR9nRQlX4X8+dQ?1;_EuQ*O\Znka*8#
+%c>=LI1qk':R=09Y2P3X(aQa+U%M6Asd+rYFX7855GWiG>^-.8ak6uMbD_0@'Kf1'JV?li(`8a/SG.uLj%^dW7R at X:c(0-J=UaV+&
+%2A)h7SA]VrJ34jQ,G"/LAm`)=G4Z#*f'*Uk:gt7uhV+HXDdcu7+4C,A8jI.n/PiXK8+MYL9Ql5j`J$[;K=p>TGb`2@*6/&RPih1i
+%ncVMi- at EWNa)i;Qm;i7hCW$CV([>BN^o[^"*#8n9BFaKeNffNE!%*_D_E)L"KWa)mTC^0k2n)neFPB4$$_uOJ`3ld]jtlG0%$9ke
+%4U=Y=/6$_WS(oPUo$7B<o<8bBqGVK902C>=5^%W_N`NCF>=n8iI<&S&lV<XTq],CN_K^A4I:,!ij@#;3+X>h=Q-,1=52,]Y=Dm]j
+%6U<ehZcJpLqlg1A8[LB[@N(o*OaU=u at V;$1'/7t!R*Ol!:?B4[!M&'#I%=)D1SJ;O:I,Q0P("Xk&U*l"J5iFH-\FQp"]1<;?Z9,1
+%G1KoNLXs^rWCHCM3$#eYa?7ILXICF]/7`s1<j5f"-Qc2XB;^>a))VC1<Y]@t3D(C1l_%l%hE+01/LgLL=Zj*YC7Sl'=Ip*-\!N^Q
+%$;e<HZ"4Y#jEpZ95JRYSE)b2M!7[NblnFmOWqQ]V[c,WRA'9;fi9hWi5s)ukHGD7MQfjgZ\qfWS/B>nW.i96S%.u$/$I=$2[5</4
+%^MLMfF^WC.^o8>a[1:5mGqA-gi1l[aYV@>HgONVAJQ at jZZEo4)82;4pP^4m_#R$8#Dptp,ela(Q7\7rJg3,)'L^21S-Aji;c.T?=
+%$W6fCS$)$YB2;9Z"5AaGXNL+>"D\JAmUqK4\(=dJ)c+(Gd6HK4"\D-,_CdGGBNP[H]L.S_E&qXP*e/:SiKO^cP\m=ej2p=g0]a*1
+%l/a*C5klVGa-&IH'8kt at j_84J7H^+^Kkik0&C\hu!*PBi,6i>nEQd at RSt=>T/G2s0^Q=@6g at ULYVlEc:?u`&rD5cdO^3Y<076<.F
+%*8Vcl!DbSlEp1NlomkmUhk)Q+%@q?"]XPu*`/`E at 4/r(qk>j]F02Eo3XkB'"G^mg,Q[)ib28u7JNhiUee2&:nX[gVi</Y=Fh/h+m
+%\O+AOQ:qmdg2lQsIT;?%(>Tg[]au<U)mj\T3/9:u=H[)#UiQbOq#\<]`S+,,CH-prdCdp<OPq1;?2,LsZ"6_ZSMGb\'C>*8[b,GD
+%daXl278#pbY:&(WXfIJf!]nu53P6C6q0Y=]>_/S*O^g'\`"F8M^r1HL(r_ at uOI?6k]><q3'"$9]P)7r`qsBfqe-TVcNe&+/]NS+;
+%)ZEr=G1*Qmd8P-"T.?8B/Br3`n&7p2U2MF0>u%mTqA-E6$f^CkPKq=*Kjt&43q>brIa;n;UNbLD=L.>8g)!<LkoGF.iD?a(cQ$#n
+%I&_BpE#lj2bo7GNURX2'(FrYbJ$:lu>4tuAJj!=,3%e7MBXu4?@-pd95tA%mF%.G`&t`;K.9hW=i8_Bl=b^QB*)KsmgQan#`YhVZ
+%Aum$DKT\eM5t[lRg=Bk1n#K'P'jluHF$c8=r8-!26@//(L.KNE<1ur)8cX]BcKjh'h[!4=?8s(Ko(72KN^4lcL$-IV-S^jiXm9LN
+%c=m;ikSH'p9TZ^ln$RN-C5`<M<UUCt#tqaula0Y9#.VV[p$[iE1ITSlT\5IA?5u71o0t_.E%H1k3+300YocC-&0K0HSpL^E.k(^j
+%H`6Jf2"-BEne&'PGSiXp=FNSRm.iB"MmKj5QlLa_1l'3.G)W1O:N*&8dP=/:MoQ/[Af\f:?]!!j.8(FRH]U,jV?;Y1\N\)tdc9AS
+%Do;$:<oAJFC0T"3fQ;5=pQ\l?(LO%=8+Z9U8B7sBg4\70_d-5b(>j>_QlU;f0#Wl"lY(FbZ.l2QS5tC?gf+:SSdkm5O$R/ul@%D#
+%kB/uliF/L-3[]F=2*s8L^0u3?$1"]R at _doilihRn:l75T0936)h.+`?S9Qmqi3cpP)fuLl2lBi(dElI*H_lUqf'6>[i%ah<'gEtB
+%)g)0%9D$IV3UCWYF+!I#0;Wupgd+jX*=_>VRmF,fE at bacms3K/GI5tV>t,'HXm1"P&'/VU[C\(2:^K'e-0&9eL"5^2$1i27S3!Tr
+%H)L#?9$,phJg6u(]Q5nAA(i_ciorO,c?Du2M"D+Wod2m.4aDG_"M`TH.,"(D]5)?2?a<UULXUik1?G?*%hA[I_^Nm.!4#FWQ#lZQ
+%Geq8Aom/QXA$6%5ndHU/"5mT)mnDO>mKfos?>iKO0./t&pXji&X2>.SajTPT:t.S,rNb80'MrF^cqf%08O9==D-^"/-;t>_^DH5L
+%nf8UkZY&mZ3kno]iu,o?%-F?+%;d0&;=7aj`kHeuEI+7Gh(lgooDl/)*6^>h8&<"U=_t8GJqH:/''s.aoO at Eqjt1_9=^`&#*Oetm
+%G'H/Sp%G`Wh7Dcj,j+2Rd-];O"!%[ai![GcNY67lo[)O*1Rh/&fAQ'>S:b14"*fm)UcNC+'Ysp8F$^m&qV3sn/@kXl`<2E]B at b-J
+%Voi.F?tG*PT6M+2PAZ%d at -gq33d`r4InPLle7rX?EtFEr9<BLu;#CUWN6H56KL5sdOc$j/Q,eIKeRsi]Gp`-t0OaFe9D3M4cn]3O
+%7-)2NZF.rd%gWTRiKY\-/+L:FF=E"GCs^H/5Z7m5WLN!VBcdl'Zr><X,n?)D`2GJ=Q-6U?1cTa&+tf)U_db.r$gD25,Ceu9D8Ed8
+%c3d,a4l7\lo&(Ac4*t+_'+_I.f++HeV_`/692$usn at iT2)b-*`02!94N$iD)_g5%\+aY,mVPW<R"?8m#.5\]JpII:j^]=Ek>6Ha?
+%GANY7L=5P.o3=iDE*@iToC12mLb/]_g8'$&1SWHHK<*^JM>MT*(/jUC+>-Or<al-eM_OOOKNEb.\##k^%s3^C%W<*<F8/E3^FW<)
+%6 at L$.0S(=Yb`/fSmUm@`E!jksSo&$(%E$#FDsmo"3XG3HZD:pt(GUg:_7IM7H[dg1;C9HKKKU@>hM#,s#CHNA4Uf at P<M?N)X9EEj
+%loCH4LMeo)KkB#H\_:fl_E-3mCLpg5=7<,G2D.(Dk-W^8=@>:e'*sZj1=p2&&4VO\-%NiJ^%;\FS'Ck`=f9gd4)DHk\d";U1fsmc
+%GB4M&:gRboYr%saGsfB!JjJk=_%'A&)/j(WI,X,:O58[V;%Z5m[BD>XS$K6dZ9R6R6hH6A(ur'feDdEG=*pMsZKjKB8a-DTM>J)n
+%M&l,'\d5'\B&f7i;Dp*c)*ZH?qG;f/,2@/q`Bk/l;=$d!N.si,m2^NP2"n3rO<qg2YoF%>]X#Qck+%)UmbKd1G`ZdKl<.A`dg88f
+%jRM#rZ+XM)e[/QAGhD4q4;Ye&Z+*!(:7[R)r at Wp#"C;;h`nm'mpMOVJq_7j2+=IcWRMC1^WJ/(8$RI?lF:`ilhCE9=j#s#jCHgCF
+%JZ6j at qHOer]*7H`Ylt9qiQMQ<(n at PJ^S1].-@"H)(X^fg]o7+hA?bWJgr5HuW<>Wt^tWq`bMYPRiYA9M)^XaF/2j,/4i-u<.kD]?
+%II%a]C-AL)eJN.QNnI+'^b`&'joP!f.+&+1H(+"8^Z]5D[oIk=+Xd:oRlC/Z/J[2%M)gn);jpE9]Y+9n"E2"UhVKq_^%+:42=GDY
+%bfY0cs0D!qPA*$d,r/T\mk)%np9G"ks1*mDk0_$'gTdXql at 5a7*MmZ at dOf7g%d!D)i$U,M>g, at t_0)':o[3e6e-ucZjT+rE\NG`d
+%lfLBZDn]Fs+MYlXhDf^`-0]t&T at tGNp-p)5)(A?GQ,BG#IY=oVQf-aL-caPZGmJ*K/=^GbRgA9G!qlabmlGQL7#aTLDr]lCVq4`#
+%`ED8^c*S9,]?,i(b41PO\KSc^_Ao]I*ZK^dZIt`7^%*#(L\1g:*PIfZF'i_!m2C+jjN=s\i?2lXTrF)SG4W3+4!<U)U1EfV[B$fc
+%fg/JqX[io_BL at Eh':(2Mhp&3BTCZQ2-,+Cj?9CB`^@dnD@#h8A at 5FL;"=s^+r$\Ce=^:Rt_X/(Y#>Tik]?]s=$Wlee$c'l//hJ5_
+%S"[6nO>X at l)PFk4(d%,]ZJ68%6u4E_.O!l/5t0m8Y3GW1bN<-lY2)9a3@=t_"gtUcc;$!b"A6^8?K&HI2L9:n9koGro][6=R%O8L
+%'EkqZ=3NYMB`%d;>4$+jf5i)@3aCrj<n76L2U94c>J>*4kJgNb<YkGpRW]%RgOj89EnZ:-59o'MK;1QHik=_VA+NHJk8(RVHf'^'
+%7]_r)i#+6YhHcIn0upDUODGqI-#W/epV9!TI`&^9OHK at EIb8pR]VS+u%PPk$!2AM^?18=dENoM_6!tS^XHeV+,hg-3'`0pgSTdW6
+%,6tJNMZp-Rs1o1'f]/RC7FqBW3XB^FD4Z at .fmGAbJqJX`2bp>(cM&Stg=ZPs5VsHbhJWOm'nb?iCb$RT!(4H5kW!2'aVKms+S%^X
+%TLKUA>TC9o"1Z%A7R0LF_SE5A7[*b`^RT6$'`,rOG?PO7&tO78Zq?.`FZqA]-]gZaVY/+7%r0EUc"J1<&T[)i?E`?OQX21+]I(rt
+%i+5+.Mj#]`^p1PE>Vge=K at e$$J"BV!9t7ZF>)SXko=:^6S!I27,%1$-h/mtY&sIs]ih:>Q'o38-QCho=#.a3FgKO-[]itgGZN`s/
+%oTZ5\bLr4g+aSKr0*L:rD8`"WUXmdb*ach*<V.=@SC=_O:t+crUX>9:3s\M1T_l<Vk_t8XOYCb<UnWb-H>pe,u$(]m)7jRn+j[
+%dt-S-a\&.UHHS(U=M<\SL?f;E1)^t*V_%4OK@@iP#=2bnMG=U2,C;EW^EruH%<pQpW\Zq'aRZpLf!46+b+?KP4ot5_TCOFdQ6.[a
+%jkb1UJh"pjOe)E=aie'dlg`1d6H66foA954AYO?@FIT"j:71C,a]:m4m+_a4W/VU>6um^$EfMRW]3H>;F^>>8fKin2.o+uEamO8*
+%l2>`J/'C4I_OsW[*_a.hVaY:-,sURc]6d#40C&[tSaFCT:O5KX.P2m7D+&gc$4'9X(sS'C/%-OpZ-7DcQFbieZ^0Vt*a>It#@,Oq
+%GQp4toiu").,_MO9<\%5C0MtI"Hb5kE]EaV5QmmpP@>'Y]F]4tQNO!rptO!8UoYDr$Iih5&GJFEfG90WYX+<,#7j23i*HLYFpduX
+%2p)+m9AI!ta,4FpSF^;S'O9e#YYDb#c+87dj]ta,Mgq6^[;GU)?6-MW`F&R(>)?$Ad6DUNF$K,[;q%@9I@@_p,IYeGo=9b3)fgP4
+%A:U:@gsr"dgDcZ7e"d`,+ at 13t*=G]mYg_jI.G&mPgS>UWb\-##-rWH]M'bi?juo74e09S#91pG/4#aF+=Q\0-_'okS02M:CL?@kr
+%CgW\*oL&oc)6nUa$aa9lY!>3&Y7,WXhB8,c<;,H+7j+ at gJ3N--?:8(614]NtJ"`E9+T#BfHGND8;-&\u%R;d3:1%s./c%KV$=9%Y
+%r+g5?G$)CenNE6fK,).'T[TBi)`Zc;G6dJZOo=tt^P4Ffm[Wkg%;)9AcfHURYgV$8kN4)tbg&H/"k?8-T4ZlEX]9qu\*81p[]V`6
+%#,N0abM'ii%)a+][TR)F!SN]schc(+O\Z8=0O*U. at QAeL,')BEnn*cP&]8D\DFg0h`QN2t/X?T)$&,TUgqB:m3fU176G7Xc[#`Zs
+%qD1VqH>euU at 68T36<0X7QF1peQdWHikpk*bc9&[,9,i&ue$-1?IYcl9g@\-fldg\<^I'^bgRC-i=W(s?,7o7!AQN3Lg=%O2HU/Qg
+%k5t"c2Pf?M&1,P_5)70R>rnbZ;Qm]XU?uVB*mI!"_qP^[C:C2>#84>17_m+bVJi.!G!*RKFjGsr#k^q73\:i%cYT;M5/f&99l+c3
+%oGo)Ji&g%o?>=Y0X#32o"+A$;K(nmm32b5NDoQlIEIR>"F-`DmeTGIWRd*7H<KW;a!uUsfH>:Ef[AOepQ?XXdq3O7:BbcC>`nSp<
+%U:2i^OoN"p8;-,rYLF[_c^!-[a/rD/Alpe3!$G023n2Y4]Y(htS#,pg:N/&-,<4KM1?@-U$*=5/[XiH\VUOc;DU]-b=Is0)6aK,P
+%)-:UW&'-cE-)E^k0qlZp)IAs[AKcR6k63BmA/W12ielPglUoHr9&=^GT52*8#)5cOi:+;hpj-/1QCcBN+o[N<:Z<J]f at u<Y(sbA)
+%7snV!/8UM,f'eHP41U!aOks8;3$Q at GeSk(&`i.jYU7!rreZ?4T361S4po^MLpG0`Fja+<.bK?pM$o:EQ4(@Bo:SD^l&=2\`Olc(V
+%DhpeZ>.7t=hmC$r?+$8.k(pRn[!Z'*f2a%,!/Ze\nTYMr[eeIu1WNl9n!#iN;f at OjP@^qraA,I]VP$U`=ZCQkI+<X<$THEq:2;.;
+%YZd.>LK@^Jdo(FpdVC#\[R/MN0l2oACUP#^M3fM<(GF/)$UdiH:LP"Y:aC at W&>3p?DK'2=kepB=;[QR<3BVpr:4$Vf5VuK9'?@aK
+%H8l5]b;'eQ"kEeL<bFJ#jXhAAW=#kXcS1QGB6YcC7AAkEX(pJ)<FQ!Sk5!'bC^gWDjqS,.^L&;k+l85#6fMQ#?HQ.e'*rg'c,p>s
+%O4_%ad&*X\ft,G+\j'FX=.-faSVb[j4nVLG,HqO at lRdaLZ6#pEYR&?_i8H1G]GA^D\<94X!@4BY:;35,h!ngR!:+^C0V)P\-Hq1O
+%JgfBi&>hYXb&n4M$Ne6_qrA&s,C0pZBl:pkVAEt:;Usj]oZ1E'.:i'7%+fTa'-k//qf3[h7gRBK)Q/??k*r)8b>1s`jd]$H7Tb(^
+%44f^n21n;)n?C]k0>-W$,&Rd(lZ88n=1hP2-U3:j<\pI(]#C$H61RM=n6Gps4fp&?2(,4MgB`I7\oi4i5ZIh0^`;eFQUV7*.k3qK
+%3IqQFK=k<*qck$Zc0Y98*cT'r>je1,*i[uASQtZ=(JsHHJ1oH\?E[?Qk2SI+N)(1VF,@'pe=^#)Idlo70jn at m;ZRlWB\gUQm^4>d
+%55.cSR&[%c%o2"MgH;9u4\^;XIWetn;Uc0$NGm*mFio+g<T6j8mMM,cgm3V'S!e=khJN/f at G].(-dcg4B3:_uU3Z`bH&.Y)mV$P.
+%rEN9::')&_FD8p6_5e5c%0k)sH^X08a_[o\7(uI8s'\J@&f)C9/o^k2nL8]aY+lF:$ib$,$t^UtbD!a?72.9:XI]%K-A^;q93Zp1
+%LJu1PWTbjVYOZ[;<-Z6(*6 at g.n7\;XF)\#K'Nh\O)1,es9]Z-Om(HP_/6R"aqlBe_5K!p1$.*,WT!o at L(WaZ`BG"b_ at M=?2j.bIA
+%eH*#%.A!6T!n%$Rla,t"&NNgsWhh):/%Rd:11P:\K at r$7Ao"4EeIMKgP7SFJ2Aaggik9etQ#E0er/.pV.$EZ#(gn%k')_M3]B.ps
+%AE:FHC+C>I%KSI(9hh4 at WN7j:MQ[e+$&&"[:/K<<&XK?Z39?$O(jsksEMuDQZpffn8[cStm36iX\LuejjCpTpm5&@]K;";-=mArH
+%6qCO`FM[$1CC<XNN[cQt.7`3u:bg2J6A5QG;-u*-$(O!qJWcX at o;4AT[lqrR!`*6EjM)MP4=fQ0!%9#,5ZFRn6'3)VPHlub;sAf^
+%r(+SiK0 at .S)$9Y<@+hK?W&mc$Xa4-kO$4HVfC<kEp^.!/KMKn<2$0`eD`d,_ci\-F2bIRASO`EB_7VHb&q+/!\NScTXp8G0*rRGk
+%'bcP/'DgZD,ni$lKCbra)Bugnl\bP3mM8D`\es?0Ur+6L1r5eW_[Lcf>Fiq2DFHFH>'6V"'E4sBaD(^q_hd\^iME>m=N`%&,Kuo&
+%)Ate$9e(IuEo`,7.=HiOOBq2Vh.cOJ9G(uL%5aK7H0nIF/$s7jKPR*Z#bA-JlqtX;)'$dWK%?B03k#agY9fpE7&loSJVV*Y0X;pl
+%(`'4SI8[9+;c616$Y!i/7?%UQX]i]p[ZM-kOdi5'?gabPoRZ%s)[moCaFS(</92F4j:qiY'kECd"kABlJ#q]_'RQ$J&7Y$?169;d
+%PuID?+;KXh61L;#d7D/DG%<K8Qurdr>Om/aM7O>ObM'`8WL1k\Ch$!k4h"OjOObkEZL!o\;lWQY!o3!jqBVJDU at l=LMf?*T!nD8Z
+%6(F\mS<OcRQQ`G$fg^Y1[,R4Lcpq"(6UdQ@*T'JO:_SG2)8N;Lh'8k?a;I/Ra<NcT-p^+3^S)fl"OC9A\isC^o#OJie1Fjb'`Du-
+%[ihB#[HEcM!D7or;.&`-H8B4?Vn#OSN*r<6^D2Uf!McU$Qr-k_-pDW?W&Hfj/S?m]"FIb>'MCkBd?2jC;c_O9Rt\E<@ACu$QI<*,
+%:Q9a*,qT`!!f/u>S1+eq/0mTon*+A=Z[tNYG.tcJ!R+70f at 3%nX[D00F)D##qE"o;._:T\Oao]5/<=-f9[U.q/'?*l<\n%[>3]YD
+%>ZQA#!53\,`Fl3P.KZRd4eLYs6)msi""e0ind7BgF=BqM;1Kes[ci6DFOpoG(7HX_BIM\&b]kfs:F\%=RSuU_1ARkEcD=JS"!$D6
+%<0u(>K;P<hK;'q`5r_9LA+?+k at 9D!0,#o=T(X<Yp0@=B;*kr(f2arf8DJE67Kr;eoo)4ZQ/W`g=d(,k0m,0*_(=-t5]pK!PnoF5S
+%_8)p]U37Lr\4gqA at c(6X!YgtdB:gQ^RZ-_V,eBa/'.)?N'3P>mdH0KR3OUUYK&:BWQUOc<J>0:$N;1jqY!he&"NSBD'0RUuO6Nj1
+%l!$\Z.dU0r3\'&X/oEcWTT5i`mgGh"cgdKt!bLdF$KY2ta^t+#_iqr:R\4e[!uKN?!V0)<-L`cLS1S`"=f[9X4,]j,8pQa)>KgE9
+%=/(ieR%m`.qNho2Xrb9$)&.LU`PLSF[T0 at uiJG?7$CGLd-pgOg`#l)+BPA?4N^,02^`@&e#m!L"P4B"l9t1jMGIZap('B>T$"UtX
+%[T*u\kh1721/5!f&`Mr-U$,rd.)ct&(sW0F!FIAL0!MuTSC)&_qLOk9dNH+b$W+3AW%RIJ?ZFIKN00n0L%A_`ZF#'<&)b`%fL)8F
+%7YS,:]M[i\2L2.r8:f\U+O=ARd8_%4PiO1DQSM<:AhKeIbjj'dIhsE0Z4-dZ9cdO[&2AM8WN^stM,R[s;)X$J?3+4>q&iJMBo#Hn
+%5Wh_Qh5[aPne3cIa?M>*[A+\.i#Z2!9Elf3VE#;^0dYMB/6k4\Yr=1RX&P>n'G_DTT95T9M0e5o"?n=gP9lLW_3Z>jg6Fo2[L<2%
+%%[kbq7-U=8R:J/=JkV1?(h'q5l3)Zu4B<0SaRoAYcq?OBUhE!dErQejba>9k4qU>?94f?m9lSHW'gK_ at q'Bo3+:R[7[q(0M)=Zk4
+%b';7dDQn4k.u$W(0k*\HJS5`W6AgY]'$t0ZdL*a.a5L^'+YKH<!WG2uX\(j^Ds8`TXm!edCAA'(^V+?L$8,7^XMM8ib^sLW5+FE5
+%f8>&8ln\D/g^+Ju.$%Im3k7eFH<WX<*eX00LF3_i7V#[>Ha3u"2[flh?.iNNlEM<WX[bhklJ;UB]3I5S+HmP%l2MRlikQe'8O>/W
+%)5@&K&-muB!ei,r@`gh_Y'$PljlU5]+(_^T,TQ,?%>nJpD;.qF.H&)-^d:sI`2Ag`q<1]]m/0OKTqIA90u,ssX$NRe0lA+"e at a#S
+%XB:>Q?#?E1GX5#++Nm`+Zd?"??l%,o'4@:aO"7=TMYaEI7]VWV)suMbSOipo3o,Ccb'Zh&>'6&Cam6j^2cDW5"mQB!;a8MRODE>Z
+%UI#_5er$!X0GoZ^,[@aFKk<0cR7^>4S$Y$TXno=T'RFGd\71&"EXS*Xl at oih_W%KD`8%$H(CW7)77H:777DKFU"t:Z9DWcDTg,%S
+%MS;65+Nk$RS6!(N`!!eObu`n7($I6c<6iT.=4U55+69hK4]&@u)X1[b^5V)nD)rqiHADb.2Kd3$2N=SJ*fJ7W(0s_BCI(7=-9Qul
+%O;>pX%9cmj\1*RW6r5llk#ik)lUOK@,=3'W*0LMZgrY)6_2&Hr9I3K3p_amDa;SpR?8eqrPV at 0]>&dm)$l9Vg:rr9]!9SfL9QIF@
+%FVGT6%90#!$=$,'1icRM'hIO$2'>TmGbC$_Y#,e%LKddj<Bs-J%qd`^$jsCEe at P@9g:e^s<t">^2MGN]XZ=p"e1'7;JTn8r/tbk6
+%AI7Ba?MmD"@tr$ETbRcS*s!85A at 4tT2o,-1)(o5CLe`u#-JqLo&9`_pj$/=AUi8\u1(VY?`=7`&Kc%qI/3d;hGl]AFXMLZn1'p_A
+%W\gm"&MM#c*E'L4FL[O$j3nC7i=`MSZk[dJPLZkHpPaJZ9Hr!+dDA&i4iRQF7u45Qa'#N`*0uqC.)e7P5`?s&jtGq;'[h9jKd\Y;
+%BH'Mq$D0-^Lp3R#:P:RRUs`giKGEj]B%:3'#2)**#_?*6joc+j82Vc at YU^>$KL<6Lq-51g6+e(a1"tUk(s>t4^59:"]"gAOW5CmI
+%FF'#^Uma0_1jX94.5?o?L#Jr(k5_iZ$'F^8g?o-?+Y<_0djRBnfQ9Yg]?*TJ"5S!RKd1;$OgS#9k2(?H'Y+5D*FP!#Bj,pE?($[%
+%'U:)_4*\=bGG\9C-S_f?Q5A\8&F;`2,HYoX_TII,gb;&&3KNb7XmAXhp"J_m>++*)*-%1eFHMb8"fA&(5WeSeF;tSTi,2%Z'D=<I
+%(9=M]>>&0hVDc%Oc#BOqfHW__Q0Tmn5lhh?7e_Ul8O2DE;P,R96F`P7/Y#&-n?HbK0*3Z8>jWmKSl`;("OL#M=fG*^oc;$#^Ba]k
+%>Z`EI_%8]Qf!Po^MroQBEjALU*iKQtp5seK#bDT_6G"<4=O<Xk9d3q52lP6<T^P]&$Xs%g5u><;'$1m)0TT%NVAaZ1b'"LX6^A5U
+%O;\$(q at bk<e(XDXda:894"h"u=-<kC,SF/!$PnVfTN,)bS"T0YBqn!oc41G+Ph"gP_XaF0T'.(CBXBW8M?-";qM%\(Fu:1I9e3-`
+%1<6c&nl>>UaCT%AEWdCSda8nlS2B;U;$6/nK@&4q<-(UapK%,.;dPubWoW[MT.d5jdJ#qVf7I6s?"#YaA-ZVmMUhcpSoIW[+X!4%
+%5;G;[d(?)4B%WaZB@*$m)A/A*.0nI.PL4t$7#4q=Tq+XrW'KQEpe547d<)=Ym^W`V4o-U]QrZZVrmdEC+K-SLH;"Dh<VAtlRp_OS
+%g6K*RZL3jS(pN$XB^t<rb;=fXomV3aB^lr/eJ%W2?'%!*N:O&1(t2Eho,GNG&cP<im@'JO4UKgI)CcF at i-s7OipH6Q6.\R,`<,4!
+%Zj;[q2dCodV5D.h;8A>Dk!e6bnB6hJ4N-hA7+qu*1D5":P6oEh9N[a^cOFt%`i7(.F)\HhFC'=Sa0WpP64sk[P6$$i""eA<Rd6m_
+%eYaiA+^G/Y9p(,aM2f?hDnZR(f5dP9RAtN<OOdaXD/f>p-iXqpLFhpWT_(EmHH+=+2f[e:NS`seL6Q](YdJ78(;umBY&]9.+RoG*
+%f$``37/2CJgNC>geQ5%V`Nk-(PJ^JbTcKS]]Etl1<4lbmMO!;E+E2Ke_C at u]C0ZLR<_pY<-WF4g#8ef\XO'AIR%u)B;D:RS,>QT!
+%_);l:2dIH`!5b/I_$+:)ep%`cV'9cIKgX3,&qYmn;BNY-D\Ysj8Q/Cg$7D+m6*TnO0P)QOTs]@EiY=ci0=\e`MKV0H9q?>Je.M6#
+%JN<euonn5k*Anm[]%"Glh+aN#ra-7A+ at AAGrfLlifF7GR.>-62(`%RbU?OL at bJhA52W-_1.2AT*!`#8E+_C#M[$djgf!\5UFU4HV
+%oH!!?T\,=pO=/MaUV75/"+<%p=peW8`1asb!N!%;]%&bH83(4$kjhJ3Gm-V[P^I5_-;*M(N2('UY50OM.$T82R"Ch<)J-^'l\;-\
+%!*^g<ZZ:j3qsFUGqCK8.d6o1J)<j0P*$q^,n.b11l=b[$^/:rDdgQNsamC5/a0q7Qadr@]&5YG*ji.V:6/R5-_#\F&`2>qf,GOg1
+%cCWUjM at qHs#T!>Y:npk),G\12J2/5j']o$JSHF`Y'JO,c,UC`HB2[p4rdmVP6]$ImS[PC>f*in%+?:X`L%Z');!;7pE'fm.WLG#k
+%.$uefg:dXVO;D/!Ju at s-8.WOD..GWI9NCDJcE\"5d?MGl^ENnNTd0J2'@ff\/P57<JU=<P*`bCRepHKeS!`#!PW5ikEg%d*3L4*;
+%"iP\n9!eVGMJ$I\6!l>6F#6O]_itiLUQON=ZjV!FV?TZ(+VTI(_Jp9]CE]SUi?'DoK/L>>\D^^CGXI%H`laE^RW. at fMTgeG$j`6P
+%!ZoeV7saB5qU,%'*Ju\`S[sN4G*sP`MI\bn,#T]o**`r0KScHHANZ&.&9nVL6<<`OrScus5olf".h"]YoPcoJ<1/V;i>Q.i;A\Zh
+%-;A$)oR3?g/5Vak3PcSEmDOol-5eL`2c/idirj'QI(:<P1$IX0Sf>R("NUi3A6n9)7geRp0<dqnNZ`[(p5%W2`JPmG9?G<s,(_S8
+%>_Cu(8jgk'3HRe`HUM,s8('7?4.#)#cm:.^]E5ElbQMb]'*;k:(<]LqFY)6r.r at fbi(r9cb"4ECAE$2,^fueYaKiTSAR$j.>D;p<
+%RN3,0R"*(s&=NlON0%g()C1S?=-KN^QQB#6g0i2tFA0lF"]-9e"S;ei6q,qMMS_%F06k;>EaT#8a^b&8H,;J9K;cT%#.P?kIrl>\
+%(L#K1V;MLPBgOATGE3_);\4R&d:%WSe:]qX<AAQr'*aC0jY,=eg8PJNXdmPN.%m''\S2gC0`<pjRgRrOk[->D[r?\b33:)'3om!B
+%#8JON[j;-/lCSG@,*(T@:+K't9HKjeX3 at 2&?%l]3!G9<P<B:t1lo(7mMD6Lef'_%#b%3k+j/p*lVFhq#d3fO"g`-'!1sQmuTL+2,
+%H9p%\/s1!<9AUhd3br,qQ;s?FR7'Gs[i5NNg66%Sjc^#qFI4 at CTRs6J5a:LJ"XZK5>+K>jV`>[+m#G'Tp%2ef8i/6>4ptHcP`<8]
+%Vq5E1CEYK".9MrKQC'ZR9(753csjoRWiO\LP!u&3`)BDiHJORXfaF;ac2pSN;t,@'P>NkfnKBU:#D#b>PpIQM2*fg$d/#"D0khRJ
+%d+.Xm:32hU at 3-ut?%CN6;^al.?!RpI('S5tSK3Q#qI+OP)Tej!0fmcg1<\a"\j6fk@>1;<C@)oHF">4P<JFobAA`(;5eN"%LosFm
+%NY?Z0K"adl0rRU^4,stEb]9eB1D)]R1lNqA&[Ge2&)DoYgOcWVVU[67DE9:[EBnLN%(*8^<=>&gcNoQQY:@ua+=*!;T[f1PWLAWq
+%7[j9V)Z!J9!aTa*0F!f;$5;.[45hDSOV#/\qI6E%(&U>'$>UuZB?Nh=#pD\iVlqV1eoD1OUjN;9U8$eO&9NT_-;Yl9;h,B%]\LfZ
+%8.tPhJVHYH30K,%&XdC;Oo(:2T,gs&B"]$sgosP"%b5P`P>tZ52Goqg"R_3K`<AVq8:q2r3gru6Iitj!][W1eX?/r67p*l4<k&WM
+%]`oD1BMff%LlOl!2,<BmM_rhFT0\K;315r,c5;\ND.'`6H&%dp(=N9o4Tnln:q%WZ at 6jC\g8oSX4GE^"J1usDZn_mPrL"Aid"CQi
+%7Aga*i)*Dqd,94Y=+t#T"pFdmOcgm)&pld<Cs2.md#!k_-%Tc1A/$(_O0G?T-LZ4&ZEQXr=:eWl4U9+Ch]T!doajPD'p`^'3<1$-
+%0FaI4D(lh561pA_7W\nOqE2+b=L_<XG*ToL\@O%E<OC$Q<>'(M'"Kbfc5^:l`?A9^K_3WcGR/=p)T4"W\K9]l\52A5MDFrOa5;\G
+%.J!$I5("62g"DM-]"gJsd:>c5HRp-J6D!(;oaO%bJp&qa3L;VT#FZ&Q[kZ>%13q6#O>"ZMMC(Ee5 at I:-VDMkj(98Pr>TptX)#[U2
+%dtjgZ8je/"Wa;/g0dE0cc5fJe).OgE!J\<2h4-5jOpUD)?#ZKbIhd3rB^0'ONl\O-.hKj*TLbCqQ&kPOEfR_`L^\J4O%/M&Z at XQ[
+%jOC--6G-3.e9WiNR(j$l;IP+d7WEb*g6l1_bqpp2ap3KZ*kGK0(R=,C=_=>#YW+LSZM?:s9*ba^p%26*7\1+M(fg_o32#9ppGFFT
+%\8nrAD9*!e.[:']R;WS0FFbKiNe,boP_VC,W.?b>"WBT.?o\T)E$S0]6[;l!P+VV;3.]oj^M4bk\S'&u!hgA4#7-Y&jZAo^ZnW+.
+%?9=%<Jc#n?da5!:g8Eo)[$0SC#YjiBpt!*>\R'FSS9u(ZIVIMk'-PX[5jP4X?VlUoNN at 2kLek>9/Xa/Wd[o\;Xr!2RP,!2U6KLI\
+%6QI]B*)ImMm=g/b3QWgK*eq%aG(jg(e"R4:_-0^?LEXE:=gE<pKZ at R]kZcD\-9$SZ7%j'M^+#5B-\\#Mp>TPqKLXD2k2Dh!@@$Vq
+%k-\"3a/6t=+)/PTJH(AL:U3I\W$VY,,^;gJ?+/e+;)X#@&0X^Xab#fl=YQ3^(?jO5+9mW]mI at Tj\4a<l9G8+LfSMk0+bpL5-:Hc+
+%c1r*j at kE&<*PlQU7N#W`9Q40S_I"F;R:5J'"d0EIJe^9uE>8ZgUo?N?C\$lRi$c[N<,rg+q at 6J*6e3#U<o%L:fSKC^[5ceG$Z*N^
+%F:9SR?S%_%nC27:+L+&nMWNnSBdaXjoPi)W).O0OLf+Rsb31dI5.,-1GmZSLb$$B^)rU>IBRY!8i/f[t_f;:gh$Ak/lp:+B-%!]O
+%oOS]d+W_p8b973L"=-%h+,S8'cQTl&WOSe;UnGE?iNf6%V<:e^6*LAN4W4d/;_"$i+<N7MWW<_&j6UR09!-ogON!X/VG\*s#X#oP
+%el-W?7g#`3KKMgs8^M+Cfbe:0q.S8DWH)9"0qqu9bnc:i(YK>+;pj!jiMOh3?p5:*laO/56DgRG-URBWrfQU^OodVD4G>]Cg,$1n
+%C2t'G;$.`tO]EBt(PNUq0GNl]<[J^2.3cQ3[.0h#7,u?SVG55kB:oi+">\.`*_u%+Vc.:9#EM'KhPp1[:b`"9dFsqPp!DL6*aske
+%4='<*4bp;hg-D8S"Qk(-_\<a[5R,f5V)%h&$J$98GD]?&@Cr5^V6err95$dF8DtgjaFN](DtMP.OsQ?"eZ<F:"I=_'@!eY=-Yc(F
+%&AQ\k%:2uo5D at c0j,f"cf(1p8nBE8sQi\G6.CKMEU91A](s3[Iigtg%[DKWQTR.cBKI.)0BR:./+WuSB7[1UI[O?ptje6X at ZD^<r
+%jq3l/Ps0:u+^2?7DM$\D,:qJ*=#lp"BH<b0-]8:bqLkcq_Vc(J?023*$*P\^mn!%S<k0'EQ3!*_aU2IUS1qe]:E$FRIn"ml+q)_B
+%m]**+F</RG_Wii%l!5&&^n)JndTN<]?IU"3FPnOWklCZKR1BkWP at rmF6A$em/V=15.`Yt#6b<ndJXq.lM]eZ.D'uujC[O0cXkH2`
+%=XsVU33&'PVMI2S`7'jB=t"flXuoOS.`e5P1pX&A,:XMn,k[gt$G*f+5\Q[%r.V+kL%uut$?!]Qd?E,jJQ"$4C=%g++:(:i at eK:C
+%<6`QLNAQ?%k[Go7&*^o_Hc,'AAr]mMqOnG_TGU at qS8u&so;J1a\g/Z^r6.`?7iAAL>bGRu`DN.bfNMCB0M,cjq(Vm^D>&A+9YDoU
+%7hZb]3`n at m`WX.^7 at +>:2l%r-_.3qpk>;\[JVPrEBiW?/$R*J8aB6RI#k.)F,:\8i+W?Ho>.c2:'8!&G?!5"\*=>%%RIWg6jdbKd
+%aAT*:)j[.N^1f1!&Sil.Oq(Y)Pf[%US2,9QN`&sk]:NG9+%[VMoAE1"NMJ[`[*"mr,<:$4aMX*r)Qc8dWeT::eoX'lK-MRQ`Mf+8
+%VP=Y;GX.,/6?2*t^&1]QlRaCR.$IS[-e(ScNZ;Fnn-'^[as">;VlcqLWZn_7#PniOnK)E&n$O?P>n"uF"&,Z,2Unc*+il3!%PK)-
+%T2olscndZbfcKE#lO;ZE#;ae;EWZ?BfkP1"aHU_LePj+s78%/BF?R>80t+Al&G)RL)F:-7H$_T^.=fd2es><k1t%6A:u85%+ at U/P
+%$N,Fo at okB?d%XAnU8sb[4I>^nI^.E"-u\6>WMKUXP!JYI4YCj,d+,lR"R"ll*7]'`La_C>/IoaK>/9^ABG6kkMl0_f[\(HR9VZ8T
+%3G4fpRa,C!J\4_DN0"%qH@\3_M6K^sYE`30bdkftoG#fM.AoE3dB@\G5S-@/9g4^jQ%ME`jr05M23?c+qV;;-`Ms)rk()^%Fcb+n
+%%O)M\",A<VUf!$dhE[!sLCITUdSl#S\BIOP_C\aM'P(oX.H"AYY::+?BTBnT`;^O2Buh\B;%/h'SHL)HkUp>Aj[+*N!pR:MC@^]-
+%RKBu&$=/Nq:e9j8YF$cQ>G8$\@n_PPI4-kIpjW:LJ/"0LENX6macl?q8$Gd;Zp%_k7Cu,.,12\4dG!!j(82%8$r(BM8E$\`*NAiq
+%c5`73K):f*5_,3R/"'(.?YF,Gc=REJg1p6#UKbW`&9o1ATX]1W\N*as([CRiUdXB0P]D;,#,-m,rZM,hZ<h5CU+.r9rU^)65*6Wa
+%V]=kgaK/lSN4s&"W'<uXBJjL$7O5kc#BE at 3.#VCldaU%Ye+qcDWZd-:aWZU1V?]^_;E/'[#9:QK6-#ZORQGb<4WTJtq#P)s^*cPV
+%8X(oPU)Qu'S+oI]76u$k&0O:[W*feF>aSe%[SB:lP;[WrI0@(p)8WiBqLd+nRnuTtfqIf=FqB_WL6_o>?SPW_!O6)h:JH]d/fN2\
+%?uWX[_3fcc'pR[928O:6@#8u1VO8/?Ig(u*ou3kjOd>=k$kp at 1<brgSJhipWKa&H;fV$^][?3?BV(UsdR/8M7SnjJ^kh^EF_PG`)
+%VIZ"q*-T"M3g+>O8:`9nP^c9c;(:L#i,JAuk5n!umrDMEF[;PPV-[P/d%X9=FN>U/3J#^)Hq4I8T[@3bGaT[@-([VYS-XB`cX)\8
+%)fnNP%X$DA!KRTN*o1pA%Fg$(j.cTqTeU;A/3hD98mpq,3N5?D!)[Q<kYFI?;*0_/#EF<'XU5ijDBX$MJiT?)drVNK&5m^4.h*HW
+%mu"J7d:o`bMZrBr9J-'2`s[QM1h"fO,1@>a/6A\Kg1b3pXT)"tp)lQPE>%a21()`_P)kpBe..7,H)@RMeZI7++Ohk#(QF[k68N,"
+%MK#--dt,&`JZ-%762HG"LK'o9'QkYCAVeR36PC30"/"^;p=oq?Y&(]0//NUP6'l!kI.(2*PVdP$<oSh1-n8Qa')D\*QV9LmmP9^A
+%]=T,EgoN1g"Cn[fN]kJF>OGH&.U<5KD32\ZLj1?uFGM-ZNqbEXME)6U#/hi81`ll3a:5=>QPpbNYADZ9^BON^U?R?Z<m4`V'k*Le
+%0g0Ad*PLUlEgVkr<e2M61ck+_jD0^Y`.`ZeBLAU'GCUI1^bK[4'+An\IL0p:cp5\q>]V3",\Yk.W8_I#9'W24U]dL#p,UlcNnOXb
+%;,"sq:gl@(aaIsL:`HdgaKBlR3smhCUf?Qp+CdY]3b27])M1,Ceu8^C5nlBQACGl`WZEunbc"&t"WM\.r#A*/S<<Pfj="i6C"0q-
+%Y$lu2S;MVb3&@'Z$6KFK$;5"%R2etDSO:@1lqu`7JPR:!*8rjafU%*k`jGBKUF[/&9E?r&[\:W*^IM%)_'`-(86#b58j%?u^#?lQ
+%\7NXNH-/ZeacWgmB\NSgF2B<jJi<<J(q-Z]:le)&\rV0:i_n`,R$&Y^TgDYa`66b$9)".'3'389S.hE4PMl=?"ScH`CRZU:!o7!/
+%$X7e)]+/&R5g7*-&0i at Y?YCEKJ27j?dt*;2$J%_*5V'U)4PR\c]6'A*eJah.=6*4-mE0J'"f\JW:h02(.(WJ3 at hes9iU4MU;'Rfj
+%s$@>2-L)'kdNQ%A.huc&YB52*7mqqR<-Umi$71]f2aA`]Sn?-donuFXJa>6cFsO9sk1(s).+Y"?.DJ,X#H.G=p<c]hpYtOIJ>SC9
+%*Jug(X[e9D#05l/"e'1 at g#ZNOZP/#6N5\&a+-l[ZgWF1;oFs-b$>5nuqe+I==[iI!IFk3-d>is-"N=H at mX4+9/`W/Tel]OqP4t-G
+%'6G at iV@jN4[Z'k96Df[Z*:X)%1qJo/Pn=`33DeFoW-KQU#**E)+hA^;+RDR2f-9O5:0hOjkc`Sr&DiNS!Ljmg4pg@==EDUP,#h*$
+%^\1Y+2S*iFOCYA4 at 1lb"k!HKKEl*>#jJ&RX-h0G&5,&_6U!.NbZkq(,(7hiq'i3e[mLpIP.-ChM"(`QDK&I"_7h*(HD4nWTNXAL4
+%r%7"81FYF9r8fKoMp,H9BP?UY6<]@6*$XT3\!8kY0Er-po\F7l_8%eBj%Fhn(gYPRO;<P#YVAglk<T*N6HUL>36J.ed]9d5$ab"P
+%Sg)mGIYRQS/-BaZ!B+f6mLTCLejG<4f(`"%2BFWeb^'^Tj>g[6VTs'*L4Jh^="EpKE_bX76\-LZ?5\K:81]GU+F6KS$FX*N+8Ub-
+%,m#c_b1L_123K^0XQY"+[UJ8G9KD5'EjIodf2JQagE at _NZqmo>opgHODYQ'0;::Dr"bT%*jX[WT"%7%PfGP7Q.uHn]bnHISrLuZ/
+%Xj6"s4<dp'@44aIZD#(eZB!`AM9Qp\IGKY/_72fU5j+Jm!=Ue)lh4<14#4#1=bPNb58hnT#Zi*Z';YtDXW at 15fB&r4d!A9.k%pQ)
+%HFkC[?B#:oj+*m9+QZWoEbEa+])Ztda8S=+1."`5Bp0*ql02h'_%DCD3+,UVeRK,g;5TXY!Bar\MX,u0oZp2[+eT,[fH,QCW(fZt
+%Ood?F(oD>H#,:-;:^1*#NWYeLDhV at gTklF"/-bu44R*Y&]W&fRa\9dRB%0HfS1,3WF=FAC``b)A2.;s25kdc]anA"+LNU$JljFms
+%LPZA\ktt]EU2#sATrnYaW^*kI.Mk)eV?>X1Z5aaTLmLC`A+Ac/d&AATdnR+OOF1`#"B\L#l%F>m(JDUY^Er0pSA$.432#"rl<[?(
+%\GBss7S at BJCJjLkOhdbM,FCcZ&2 at NX;k0k1aFH>h&4rtta?douNKEk/d]$&.OeJ(?7>tKp,(hAP";d(sft:ad%89$=&$I7#oab'&
+%ML/q,oJW*qm37qG]*1)#3XSH>:i&0:LnS*J-Ai9RcV`5C'UZbd`HO.QE`e\;"b7)A.&]E*:$\H1E&=DLI,MYt/l9N7g9"$A;pD(K
+%dc&94]BPuoQ*1S&$843(j>20DEXl:+'e-!dl'F(;*Q[L9!eg^oM.#r]O<!UA>r9UCP[nXU at Go?h&BFL&XGar]+WAZ^.cfF,TnYh]
+%$pB?#Cg5j4>fl>"%ZKQO"l"SX>:X<\C(b6r_Ioa6atAEfK)0%$RDc7ik>'b0oO&.S=G=t\-g:EGB_4r)M_;.7)UHFZYq@"K#H16W
+%"p-,kLMEeX(K-X#`S4Ol[,Q!p+p:PP1*f7,E`TgV\Xt'u,oC*W)q(mS?(m;"aW3"];*keD#]O`7=hg(fj+KnL593[+h:-.PGA->(
+%f:`(mDp[@h>7)(R/:IU5La1#1/<FG[2MWutQL\j;S>b?QZ*,3,d".?5J+*`\Gc7Z+pQ.s?b/WX7TLrC%Hgg=*JNSui*CP[g,)$_a
+%OH6IE-"q;($N!CK`m5@)bJ3$lAbY<Gk.GA-b;ICUc95hmAMX+?S_@!s_V#^dO53?Lq7t[ZQbu,<K?Su+9C*IPKCjWgh8sfnb_%8n
+%:,ae/H?6J4P=XYd28](@k&aR!BVM>S/0hq>JLDEN'Z_lDJWj--&/<6jpiFHVW.8qPJHYfMLIc!GgnsRtJ.OIDZ59Q<dmDXgKJpb]
+%Sa\X&BQ47E;X7"2[_N"sedr`S+Z;BCaC^JE&QOqoou)qcB#RXAKshVIc\"gK!N5&,;5ieWj%[6#LQ1fY$F7m+9J$5O0Tjt=&B4LC
+%'HL18/XIuU2ElH0ak4(+JuH$>WXldn3"d?U(+Sg-Z$V#'/>:-Gg"CVEZb*-Q',;e"gh>f<cuLn&9jJFl4!U&0.]=@URSC\98$4"^
+%l83(gW]jc%["aYl-RrR\"R-8R8*YS8oK=T47[ju-m2=mH$Kdlo2TleDRF'2]W"#H%7dF2j+NQ<_jOIo/[M*%%<0PF\cP.dh[HP^M
+%dJbQ,M=;#RW3QP]&QM:;k]Bts^<BF1(:[k](/Ph*!)guG.mskd6>%=`!qnq><'4>K^>LYeO>0jW7$Q)'iW,7/K=c%gTLceXU`(4K
+%E,3$b(.!RHoi!-:8X!YW\;QN24<#4O$MU@^$5g_!oKj4fQG?,N>"SA6/f\9*Tn>qh3)Erj!i1fcTN.K$aouoC#WG9;:]bZm_LRC_
+%"3iI`A1fm1U!Zg?qbfqb5"3LJcoOW'&%36]%CGm\aW:e>.;Kn/^$3h(^SSM&b.]&(#fC#"]\T]s/1()roHYG'5@[Ki&fa=oocn._
+%6t6 at Qn;V65N]j$I6#S4bnk*Qg+SR/J2](Zt'uEnF#AN7p5`,1kABlTtTMfIn"nai8g,'Zp6'kt`9HBRc#ko=GTqGRVokT+Keocd,
+%%MZYZ1BK>`>0\r=bLuZ*WR)@tCTg0'+j6Vq-I9NN[`BdEne)p=86Rg?HmnHb%Uut6?]F%t+cQY:,tbn`Fk)1dTJYkJA at 6A_)W;8h
+%7X;b:-%g^_faL/ia(]L'T=H#_3sl->rJ"UE at k'm(7oH2UjZ#6aTht/=c37)1CfAoIC6Mj]oEkHso"@lT$DUN`Q>&8inu%up))kYI
+%d0]nP#Tpr at kH+EQ&0L/2[FZcAbDJ,<atSJM\odKWI=P"eP.-1%cNtfW"B at Hj47IHOFL]X&FAQd7<#N<uOZ*j(=lG/)NCQOO7V4lY
+%;Qpjh&/"?J at 6c&aU,YeQ0(U`g\]3;P(+/\'!(20?F(L*ii^@g>Jfej(je0H at c9Od1JeJnt!SMCBgE[=e"`g==KTdIJnNTm`%mN&%
+%4UM3HAtuPS1fVX]$5o&EBc-RpPt".^Kd;1IYcNsj1o[j@;(D"-!ubl4nd&q4PN:FCZ^62#$kdQ5inC'H+N#<k14ZHRKXhs=V1f"p
+%XK-0$&@.e->GGp?jdPj7ZB6YsG7GoUC6fTNbMj]sclZZOJnmeV4i-B_SOSMQ,\o(7F/T7.Gd-HWR?WhV!KS5R%^O#0s",-)fp7:8
+%REQFM$(=AaZfH)QBGCHE">(i,B--TpEJ99>!BL<BU+*qc8l"\=RAPm=H1[N=Prr2&5mQ)+m$aj>%TPJ3a[q5L6E@<n,i5D<OY-!S
+%=5Y1`6jN[\RJ(n$7(IsSq^*sPiAbs-nN\geQA]4fS7 at 4gVU@`D"tGq0[?YMj6SUiP<i^B$c3jjd`@\#!$!5FEJO&-TE2&E9!(ulH
+%M=t(lLE[)SBdML`^G"2hGV8>QFMlM/9_L^uR.Eug3#":YLrhl(5a;L&Xbsb4B;k;LoULuN(1M%EC&D"RV,aI*4t&\E73SWBGWYm$
+%1+e>4)0B\nYbk>Wkg$aA8KLj"KT]k:M%);T,`]R"fVl7_9=2R"1;QC665W#g!(?r0\U:o[oP"fS#$BSh(?kHB#mRjQJm]uOFdE7`
+%3QOc.3*'^^<WIj%Off]Z$B57!*P-8h)"c-g#E04`A98Kjd&CWG$q,W>!C^q)GX6$"oV(q"$e8@`p.tN!6ohXCW^>CdWc<DckTH*I
+%YnSCEE]gF3U-O[AZpt=,[N)/P>".5.0b at OJAV$Xr+MHe=:oJ9S&@cG"AP*[uGs4hC[)eCFd:s:ALeHtkQB,*4UkK+*,*X*K8q<cP
+%JTS0"=\sF;RLS+oJbQ>!rQTAUe:\S/*W&_``u7D[EJ&nsTTdd$3LtU(=]J02[A7KU0BeeN$:mH>%'GHpdHi:#Z*r`0.8,ga3qOY#
+%V at urT6CDm]6BSc]S!<WO:mqG#Egjkr/8?pE%OOt.6l-'aHFW&$AK3-f6Z^3SkKuCJ5cm<QO'</[MA2.(k\u[-`9.;>6HN9?,l8_2
+%,;`GpgRHndOL^'t%J^Z^^Yu`QKli2Ej;ee1-G,aXC1JjR5_A$T-Lq2:6mNZTPWic+8,e'WJ40RN:q/ECLFO+D+lff#a+o;l[0P[J
+%"8TH!BdP,2!c4Am6^*o\@"C-8.6%aEP<UDO!6pM9,4[0*A9pS`apTI#`@f_!!rnW'cp0%!2pVUEn=^&YB]Vb"@:m9:(7.atEmB9O
+%V+9J!Od8;f<IdA4,"7`Y!cAKS1Vupu123Le&KZQK436(]5Yp6(bF=@QTR.n^9kBbHLT%F at XDlmVKo#mO0pLqD^gVId'TSmL0iM"B
+%nlWneU;oY^:?WCS%1.JH88./BkgZ.,F6ll:po0PB_a_ur)bt8AU<%':AbA47.72Xj\;bo>:oTrN-q$%S'S,n'Ogc+CdU*Z9^C`^S
+%Iu:8N!6KoL\DH3V*MpP86&ZB=(D1')S"SDq?1<_,]L"abH?f%7<.n`&_Z8B*.R<,=nq0!01L4U;DWP,rIF1#,<47#P:q?04V%_'?
+%&,Qr=fap"kILMZGPft<,.WF]ecDF9/[RN[]gmhH6.qH7TIJ=^f4.03)F?DG#<%N/J at mTQ2'MO+]m&cGaWL+#6b`(/,*%;fL*<`aJ
+%A]dHXL.u]qJ;mU`MC(<Q.9`B;O+X>_&brQ@'?IWdBb'/+(G,Q/'pr)84^Nj,/8GXjTtELC64%57"eEm\W'Q^\R38X+5_=:@TW`TR
+%\4=\#?plc,.hA>FYSj/NJui/G8FPe0A3K-E',IUd6!^0>R/SZcj]Ci,9R1_MfVKVN&??LE+<Tk4Q\a"Q<p1QcK%#mKcXtI24'Uo[
+%lSr?>:1QXIQECpM(p1id=?Qtd/F,&48:?m7S<c1d=U8u at fr;3aHUV[g_oQL"qD($KKmGgf:p6^96u\SOktnajW[A\E4X.TOHI,ks
+%WHX=MW at 9/,<3B9p,*,9A1mXT!m)^@XP48ltBoFAb6m4bddY2ug5,qGel<k2RLu"#IV\&QlN#*q-.!%`\AVA:[e)d6FTX_2'HG0W@
+%Y!E.YF@$_)$noh8LHtq[Us]@iB;RI;B5Fm>IFbU_GNn4CC3u[X7:?hJ:`?=uAJjCQ#p]#*7-(4N)25T3C>;c:bbW51*?iWm#*>2h
+%g'oXM_F(R7J[A)e*$=bK`cFV89FJMU?GRR?+=0Cr28`Y]+_l`RNCFif7_kn<&(t@=+fJj`>_9\QZ7-]XUQH:4mZ+8A$G"3^C5"()
+%37-[kLU^%-%-?>\[3?!V,EP+SV$b,^h*eV0MOaZ\-fHR='@nXeC+F[5*@/!qn:MiJj_GklEY./OIRK4+(<V't$b[Fl#;&u)lU!t2
+%(\1VV-'o/$2pmp98ZX=QN00t=:*o*.Q,VA-BKe-&&-kP2%bm#@*%#;4R'bFt-Xbe#i$]68E84tJ'FOYHhFiN/EKj`h\B2pr/_Z=u
+%Oh^OM&AWQsH\e%i)-G6%keL+i6H3G';LiqcZ-Zs>WjT_<.P(Xnr^*OL!aCBPQ],'t2O]piWkJg6!]1-7_+Fc_8[Vm"`c&<BeOZkt
+%eZhFZOD5r-SY2s8-*n-O+M_,31o=hMAlsOTNY="`EnW0tg)<C6Ofg*`2%#XQIr]_0dma(R,cUupP]E.bf=*Y39d3P$@iYU66AU4:
+%oSI<[-K5V5m<M+kQI`\KDcSPETnts3:X>k-1mLD=1adT/+Glq\[3grf0MFH`j2^?qW7L7RqIGWIj>lJAe#cL at _>0N>'t'DlT*Rfq
+%`ahJd9JK3Ri.hA,pG@"4rOR!&i_8m..596>#;mn7l97RtWc4+Q;Q9U.S6-?*7=V[/Mub]<JoiR:[K(\RS>C["i/IjQALe*_ at Frni
+%R'_)F"gGQAmA&'tqc at Mgj`=uM'Hkfq*opHJ>+sY1Yia(&'oIB4IRTSQ0.D\CN=?k#U5NJ^'pI74_9eVb>+M>alg#757^F8]-Rfnu
+%_:S03#_l<WX@@FQi*:kVQ6R)4'_GJ/(qe.9?36"Z\7c#CKR>8&`pQ)5U3L2n'OZs7L/6Z\L,/iFJ^b"+T0/g-%SO2R**5kJO7o]4
+%XtC3pWbFCX&22M/*M_qS`>L3ug+4GcckA_XL6'j5dL+K8q-#V7kk^^pYbG]RU'MKn!W(S!"bMslNEeD*D3YS:b%V*<(=4Yk/:gtN
+%R%!Q5R;PWB4pV8VWlspi#cS(<a]c%0.R7bQ+\Wa-'R8:3qU5$^a&WYd6HX]go'8"RirI$ILBgog+=^;0UMXVE>/&IO^h[">BrGSK
+%W+foIodEh7:Z+82(_D.=AC?<=JGp.cDPDHdaEuMo:F*;D46]meYT_=VURg.d$?oc at LM2d7R>`Q.Vd`,hW)G77.f:N%:19mh,GuJ[
+%p*f4WT8Ru.\FpYF.hjNKk)f9$%MTIAgQQ292"5!*6#]sB/Qam6<db5GZ,1fD*?tm`3$CO at p9q5>+bA2lbBqi$U?=L%*smVeBO3%Y
+%_.ir)0s6,d<S0U\<qA>faZh#?N?K?;pm)R[EXjLY,:=bL.poFrA]3tsW2,j?,+%7.R3nkOWCX,(O]4f(Au*l6):XZlQO0/[BZpYp
+%Y3D]9f!6>%l<5Ygk`IItmjMf\^bnm8?62q**3_i8=/K_aXse?h5^+AaR$7^Ie4+^O\7!gW;,+(sk.2U7C^rK`!\=$RM at SV+.*Fou
+%.&$d$G394UCp1s8JQ/C1.DG3cJOJ#8'^"U(,E1e>pqk at 5#8*th'UYa.e5JGNc:1Re, at iPE'p&^WK84#r2Yu+S>+s9))kle#>OXmR
+%M2XIJbEsa:Om.S at ELe:jP&bK:X0kna'r8J^*g!B&5nWol.%VmXSLOg'F15%p`')HW.R-B_9Fh<h1^c$mQ#A-.`([+hNg031Kld&H
+%F7(%;;WOc(MYMi*&fbs5#X]Y[JGNc;&Oao%BZg3t622hE?'Ps,(g;EQ,"p1DGLbn$,F(#iKhN;F&I,&+^4XQ\'MtM]q$Xd^Y5got
+%oW9Pb7[1p/cI*h'So^jaE<V67:?[WdDfcG%+46V,."ZHe4i$jsd>_Uc.aq"`3]uG[?"MTKE?Rt:5usWS*m0h*10l)08hs$TRT`LU
+%odScHW1RV>661dFGhIr5:gMBU(Q+qKC5"VcV1H/:4NOhjHnXPh17`O`%&?N4`*m*0ng&SA6&<%g>\G"+k4E,6<)"OT[E&U]8u"[J
+%!Kc5&$:41WN2`;ZY[SHD6<^t["gjF++IOX+N[W&qe5Ip:`\^l=%P at j^Guq$e!8Semgj:G:OB[g%+$Bdc>,W\S4(B<s(Lf.ZACTg'
+%kL;DApAfNB;KXADeG-C,2)fL<U(*!pdOeW!W$2?f?9uP]-9S#=)<sWS at Tj7F9F-F4@n&Fd0olC;W4A\[UR*5%[_R_@!F(?aaaX^u
+%chX@?UW$2HUm\V6(6a]a-DD5Bbi(<>FqYL$8UCO7'-\[DPc3"eDQQ+rREfAIhW>*O"sUL6r)I2Vp6;<\@m]:WX at _&B?@Q:UE5?)_
+%grSp*m)!/b_<!pC*:p!L6^FV"^-UI`*![n&bA,JZX^O5_\04+2`<UckMYH0U.Pr5Y>tMCh0.&1p88ELW$$fl-mV2XK!6?@+BP%q=
+%c]t8b6*O[5G+9p>^P.Vgh\hG![,U3=TM=cbPP at W4QK/q::DkmhgW6AnBRF"'NCu?tTJG=JSbADYG1%)M7WYCk3`4$-dsO)hPP#3P
+%:`="`kfsdjFK=qNU%9H-Z3Za^/BXre$q`OaV:i)'ZoDLX-um\`'<!)XYB5'Tni.p at HsCFJ\;lkrPa#r=/SX268Zn91:(Y;M?)E5*
+%JH>l>#S(&rhV-SDjFF#=0.<P^/>]'m1fL.0i;f`d",cn")sXcKLUpu9,4_e+Y#FWR&GZWOU7c)@am>t6+Y4$?la8C*r'S7V;hU#J
+%'D0Rh96pcr)G2tR@;5u+_&s+FNLg2ZWlgI:8)#^:lXQZ;7E\$s8'ZbH'tR'&(W&qBDG'gj3Z)2(?]k&'-6]MmRjNHMjUS>T&PuTP
+%o9^/GhnA$7E<. at a[G%+1Ra<L[KeW4`Om at j)D#mOJM1*oS(*Xbb;Eg&7e"EYjdo:2RMZg8C%I4UCH7J808s[AmeQ$i(!<G0F_fA"4
+%d)/$OYo`[),e2E&:<%C=(j0#2n51NCIo5j]P_sdt"sgrs6(ud?RGS&NK[AD8lp.)0P:5U#8"*[=jO5mtjh[//7^ns#:N:s/`Zs5:
+%]Lf25,)W\("Eq)S;oO`ZaR)([Wfs:c!Tose1.p#,p8N:eBhOgp_atn9L/PN['0qr+Tq7B)8%D;l<5AdK6Uh64mZTbm)G at RC".aj'
+%SU9';=Z]]#7UKH^B4Y%%hf&ZY.Zfb.UbF!>lm]-5Vb-2HE(?L(%KsIR)6t\"kaS=0V%on&V\'W?1L8/%cV2m`S:!Y]mHNG][?g;_
+%RqeVi2c,:Y_ps at Y.1%(d<uqhHX.nCg&V5mCi<[Cr'WT6qoFM6>cVf4H?sf]<=hA!uX+pu3*>2r3)V"'39^dTmH"`R).1@?f:52QQ
+%@Wp7\b(%R\H/X!:?SXUO@`M:cilFsD1<K0",3VA:(2[0eF+tH;2EjU4</U=3]UPh%a*<n`:XI$Knpj_(XtXXQ].I!",;1/U0L/)S
+%1UGG5BtEI at FP$,7CegD0JR/A7D+qu8-3qrZ6rRXD^9i?p+P]X at 5u/H^W3qcu_QCYs<&fG.qujZUnD$joD&b>d_lrJCTdme.Sm.;'
+%btu%YOnQA/C5>TMQ#iCcL*Kq\(.quA:cL4=ac42:fWi^u4dOL*ZUt#O(eCJt,b27L'@kS5:<lH;n&VrYER`>qe?4.m#mD?k7+5e^
+%`eqla(.90&Tr2C2,cRIc"7cXV*JB$"L&Q9*O at q2:d*[OLI1auC5a2CQXl:D?a9Fr_<&i=GP>81--u3RkOq+8$SWhW2U"BX]410<`
+%,/KshqWh.R#Tq<aI;Tt5F at 4JF,/:#:6*IJK6'A/a-H4e(X_a6Qk8C+oXE=l61?Ua=M,(-E.lP<V<2O`08BI#=Ti'd+I$=q3d2<GK
+%"-o&?^6":e?^0'-A8'A7:h%m)$]XhZfbY,)>(RJ<"NA55 at A>.b16d5^Z<BE9c3RhePfaBtHcg&U.MWe^Pk7dQ,01?$P?``)Km(1(
+%c0^<t(km[T?93tNiWa'5d$,AG0nmH<_-OIbOp,P?,X31+?9(X0,6ZI]K0W0Z:EBsX5!sK4Pc:M9BfD?nVp[ee3WqmCZ;hlZ6LQ`'
+%$6+*%1KB\b75Q#R^8pMgl!jhg3aPb$d0"goKL&GG-L`R4UTdb?Z<,P,(#L;\3`HU%217k@*JgmJY(us?pFEN_Q%o4!-8&GRC.>VR
+%TQ?-bU4Z,Q'[Tds9rFkp'Drmh"^&5++&8u+VCsH+lEi!Cbd at CbD$ffYh5'I-TFh3q[5n=qb2NT#3<UjQT+IP9[l;4Z8.s^r?Y2pH
+%[1sE(*+4]H9-.6R"+5MIHGQ%r`GG+?V/ecSR>.Kc?#qpdd$*WU!`BlhdC`'=Jpp(RB'$sOKF3ZZ4u`]mrC(s6=HBEuOkT+9U?W[H
+%.+L4_(S=/"C-555OYF&'O at -D]8jN3R).H4sH&XAtMA./R*j1=-3kBnkHQP8b6)TT-'((..a,):m[aeEBP>3BA8kO'SCOQc!fH<Xg
+%999/i=<\HJ.DCnE66KCW4M[%Qek\BG,6q\*3OCTeRU%a]kd](O-:6.4mUt+0[RmpY\W.FGri<5aa==]/*!E5UT4f.ACY#YY7eh*t
+%Ig+a:J+i)^on9-p(s\"-=^;*:cpFgI$IFkOl'D#`1kn=)1sQ[WS+N"*qF&"ik*J`;1VjGH#7(DmIooN'(e?$lS$gZiX7'2s-Hcnq
+%OmnphX^>b*df,6F)B7e;+bJ<q#`T-_+q?uB_IQB5CX>!IEYF6T7"Q06&IT='0qho["ktK8Xt0.t_q\2 at YORbBd$69@`"0[lnnOa;
+%3Z77O1+Lr^F;rTo/[D5uC,V2M'DBrTe]&p]UX+0%afiQp#BLNS#ZRp7;HK7)aI7:-N_m>1VSmfE\q8(c1T'ee/Y$Hcpg at X?[.k>6
+%ac=hemnmHXd-9+V'Pa"KpdXP1UMDOm<%1!$^756Km5_tk4DVnATrc,PPR(=,&4^jlJnd*m.VMPolCd[ts)[*gc(iVo"ZocU,\Q?*
+%eef##]aUHdIa"i)`%&'c?^_ItJJta$#:``uK\Z_F5=;<D6Jq"71ZeeQ"i<<b=:17qSZk,k-49E$W`7^3PZjF$Ji-*n?&t_LN.BC<
+%@"\mk!(&/hg^a`5!k>HK$7Bi1.1#>VOs>?cMA5+3NO6'5&;![;M!1tlSBsEYF7@^n4ijeA\W)IZOu(R?5b%3WN=g(7.;B]$P1I^m
+%%KiOD,e*"e;1+8*./^`^CWmBW.,,+7s"_tRP=*]=eXR,$RIhnB'@A,,GP6n/'W>W.[cI,F3 at fo__a4Wm1Yn!09L_boRkT^RK_8AK
+%;a3;_PjB"+GW;6%gmVp-,h'tZe;)*IDuagUGN*X"b at FFNjF'!F)n;`$A;AOr/52c$\'g>4XV$Zdd%ja`-5.puoinI([1!g\5q`N)
+%_7;8n6aK]#SAKh?TsmXM%]Jh1n2d5VX>J'ERPIX)A/6R<PmQW8V:-D]:ec\rUPoP:Hfku1Mr_Y67VMGPfGlm[:%8>pTWo-kC0<42
+%YCn;.W"0S95k^%odUo0##XNA4.]?)V6sO;BSLG_lDP1$6k+m2 at s-[PtV5jp8i)53O[n_S2JV"7-U+U5U&5\ZHonm1Alqp9:$M5VO
+%2S>+Y1>8Ds?6T/r_g$L&iLKPVkf+1mT_soN#K8,T9t6Y_7DKZN?tbJYCf;;:pd[/>@u>Th#Z1)*+"f'dWHmFg8A8'kB1*,0Y[g1q
+%,]_2$'ohrZ0b\3u'^Fo9Hp^@7KP(;mI2(Hk[*HaScHp&N?6:T3#q-BuFrI4IPaA&q3b`^ELak51$J-]D_=Vuf.+QO:d87:pVZaRG
+%l>rC7"UgE4#rdR#oDkcp*MPhcD]5::l=F9;\sSSk('rCC,Q"N<(C=[TGq*;8(g%ajSl(Unh>!N4+P#BVUP4;$f_df9,6Y]se\m,$
+%_%N?&It9bJ_\-55(p%m$^VN4ls5#utr8e%[YP<Y4Bc0*_q=qksl(>]c[nk310-<D1Isf"[F82fNHMB0YIf/]sS&<M<Vt\*Xhu3!<
+%rU>SReZXuT5(5Nk)m;7RhnB'*X8_7k^$,%XD[nB?kP*Glj8ASjj2`bD7pc,f_[jr\r2K7+g[BXdduV[,>lE[NL+f1Us6K4La6p-R
+%Z&6he*KTOdq#@O(If"CoFEObXn`mUX9DeBDKqqebreKaeq]ET:'/%$\SNbbo*T+se[#_KlgV;e-_t7qts5CSbOSs1ooP+*BDQPu]
+%r?`Qbm<J6S)B$6^puBtLf7,oc+$Ucqr:o=G#uAU2VtV:!0-?6N+,>.=jU]D$+$T\_`@n.Lc1L\XbMSo*^42U?^)oNnr;Y`!r\uOf
+%roWJ0lfTpn##3p_\%bMlraGToq7- at go_n=Bg[Y6/ViTk6?^CBn?.LZWS'COXH]u/BqtKeA?$j-=E:r$>+6-4:A*BdSkT()Ve+2J0
+%0AdlOj59j6X8g]HplBZIkDl/u5!9pAH/@HSM_=n!QCk=`g7I`IT0E8LPKh(Q(P_O*kq2?gHs&Z3@<gM/hZi%onc$-h(GU>%I^a^8
+%I,5r/fRIt]?Walu[O-7A=9#TB`*dZ,GCEl49Z-M9E5<XQ:Wr9hHH!X5[.q$mra4O.)N-g$hlk5PkN17's+?<HgY]aClS<m0pu?@A
+%s']+XhS%chIs]@r\UN)Rhql-IQ1*T)S\7euqlp"ANrsGKKR-T_EVuLn%F,tO at _lD7j3LMf=6f&Bo^VP$hZ(X`U=]-8:G9I7]9hCj
+%ol9\2alfFI<0C\;LSh3oUXtQObjhXX93lbC>&/OL]$T2-3D0:f;n5QXCeq+`?hJ<gl"AMD,^WOna-cM"U,NnebkePIlq`Hk$:b9V
+%a2E;TF5]po,bKKY5p*+V;[c1R#Q(Jb$,a/Xkt4l&7p#=3hQGDn5L%>aaLDAd8P#2_'O?dVVh'Ya[iL)RLNc.1%(U<f0'SF&d`0FQ
+%7?5!?ftOc@;n^fKo4->OE%h(0L$G.QWXqe3\W&phJ*Q\W%9:o3"pTgS\[+B\C"e"Nqt;g^GHNCHcm`;J^R>gAJmrB)%#o)eFF,l[
+%5`/hr"(V)!je3'*RR1BRZd[H:qi`YRC]&==?FF#aeN4]_%AE+\JaIOR&\E2ea$):I\g)W#YSTC(6nacBfD#]lgJ=t$`V(fVkrX<P
+%X%0d&m`I7()IG&r(V'O[eZhGW>kB1V),C'TI(l<m'JB3:p=- at E\9k@$d-G>'m;hkgY)R8D.#)6>.q?r9Bi^BTN,C9 at D)1JpY#PDE
+%/_0G(C;pB0om,<<[c6Xf at f<dd-?uP;ZdnGbqi7ep<-7u9q\;Z25A:hFb_C)5rmc^A'uB?s`j>5nQ>pAfkbU<..ta>j'q<smgtW7$
+%\M]?c=/i5t`6]i&"16<WfVXh"EOl3W>[&iII-8.Z6s&,t<6T*,daMTRdLqPnR*OB2hlMJB[WXQuL+Q9r*>8%fW;2=^l,3qs2?(jP
+%KZl(#WmULEV-2U:?/@J%Z_!NoTn?Hp)tSG.D2 at cU1L!*!qtWh<fN7+sH43&MBX"-H+;V2uIG7<jjK^U84QZ,X[Xpa>[SHK_EL%BC
+%(1Bc-F.^"iQ3&^ZOY&4*ijSaV7kN3J[H,si4[89[Sc(mabsW;D at _9Uf17cDpj't;Hf9U-YnT&qcW-i0gV<O="R./8mBVmU:\/m5=
+%/]o2OCffoq/(N)*Y#P;<Bhu9O7CX>GM6jfip2_/aB4KFD?9sh4Q1n_Z>%ERC]@$mj\%`HfCJTT]8Y_9iNc!%l[Ycc9JW\MY%dj+%
+%O%I[[M^l'`gQKSQ at qo,;p&QpbqNF7Uk!J?E^$.l0lV3SY,"pZB@^7h'k/]@f]knZlo_M<P?ScI^Huk^%`X$:K*HhfTeXVU]%(ib0
+%2j<LP].pbMa=ulP4niQ\Ukup1 at I?8'dbCA#mg(i.:Rc at b>'Q;ZDO\mXYor$VGbFdM4Q+>i_\hdAVtb;J8-K[b6oCdu(2a&!GAGs=
+%]=n2[URh8QBPWcJ[*?jBF$71*60amR.FkjSZetb4IDA]KF#(2J;B%^hBTXkYCs]jiS&WQT"3X5BT^-:2>\go,r+'l1_g)_Kl8AkN
+%=/bA*B:%_K8SOsj_P1H%FJB[W*#'0BklW6mH:A3H!t:,`9Gi4s5f='p(+%V%$DFeu5&FZ>D=7s-i6>PH5L[&:X'nB(V*8eSVh&JU
+%Nf9IZ*4^6:!$)9[@Fi7)R.W at f4N3U@$1*cPQ@?dS9!9e'p0om@)`/am*>7a3qm/_Jc(aENYUELQg0JlY0#]@KAl/iP[q0'`.,#<@
+%V^XOuPl:<^SD=m/@O6;<<b-i6\1"urfW,m?Hs)WW(-%D:()YeL1J+Z6Zho'@rUAJtF40cmXr#\#hIn5sH/%L7CgP_af2ucl*i,hc
+%B1]Sg/5qX_D#lg)39rJu#SJ]uA8B#K:$p]9[P<4p:!ThIo5O%'n6SeXOY*b">]39dXJn8`1gDjZJoQbcJs9loZTZ:>#2[R;V7&Lq
+%YPf2OVS%L4*?24"i5:,[_qX*Hhg(Q*bjC6iQIqd]]&2HhK>?&"&Gq2.h\h=7Y84JZrn>?I;nOWJ)eR(Bca$srrE!rTW9a+T at MWcc
+%+hZ1kppOok*p;(;Y7-lS$sL=][)@E@@F0BXBVAj_5&Zo1Zg9+X)X,G)D(&@jlm`!j-/T,^a#F7YO@:)Ap03&ul*InZSM.G.hR-I?
+%\U at Pb"[MPQ[M at Z0D-RMtL'GTQ3V-pe4lII\p.O$7p+i!3o6].L)WM$jhpl,^ik&`NduJl)bP,O";_R]3HQt4jTCWl"(t6$"e_I5U
+%[P9]XZs-P^D,rO%<K*tpL<DIl=OaaoMP%UWZTSJAE31l/KUQfM=B]kB12U:pd`Z6ee?!E*1M-ee8(b%+'C8]XrP8I#BA'A$2Or0r
+%.WDQi>,th6m19FEk*C;PqhB.u3cUi2s!YJ[Hu!?12PgEaNDo$lDN?Aa,,unnjW:2@\&SJbr\Ob)C;<L:(2 at J9GE6G-NB$dg(,?/6
+%>B$'q]R%HAmnXB at 1b016aL3pm5=96Toumb)cYmJ+r1FEg%4hX+1"Idi3Il"*%]TPmWK"q>'3ma`&([pVSFg_o5n<'LGjCjoo@)fd
+%0CZjO'Q,6E?U+GZY4M)SFlrXLr`$7hnuqq^=(s0/Q0ipUAKIGse)7\H,rbi=>07*B`KC at U@&H0=27?3`i+GXD[f-Prp*FEZ>V!Wk
+%mC"i=q\)8L9*V(Vh0udCjCqhTjm!.KCk'Sd&UBI^_Nm"``gS,38[o=[CM$_X$ctT??c?EW,.$^#=iY>--D?nIm=TH:fq%]3^,`.9
+%2UI2bTC)4@^0=4CH:$Q#4XH"e8qYlPg[EC?'\asF0H-%p543bBV7'+BSUiXL1Y',>W@%NS$+J2ahB=bG`%JOD(@)`n?bh!@2Ht:s
+%'(R!r]C<=@nAr_UMfILVJQJH2X8;Zq\$(m#[I,)bYpgqo"1m'ZRGIHdl%9WphujFV]t7HQS%Z/8`?'!,6*[\p(0M5=Rf2PU=qf6`
+%TY^j&U&<^:U2QMfIkcZ0]REK\&i?t7Or-!p/Q3#IZ:nuMXX&buE\_lOJ,tLP^IHYE5gs<klQq>7(54!5,aMj7S(Zofs#KE:p_q9Y
+%Yj`1jMk7o#QZt#s0lI(e1e4t0/9ooe]sM@``A$ADL^o4X/W7ZqL)kMRTYB0$Y)M7uq=B@:2q1m3:g4khB)tE)kW.5(@t$m)RT$mF
+%2$cfbE`1S"qljN.CD1&-8Z'e$IILYQ$1W+aijere-(+lsC`tV@:6#E4!ltl=Vr*YO+:?:Ba">Dt/kMr4/BJUO+^t6O31#`rS<Y:o
+%r0&:4BMg-KVXeMd9Vm)Oa1_Y#mEX$oSA>qG6]X%T![u+;QEDI'b[%[hWa:uc^F^B?.AhULFbq,Kd"39(9[`oJp`R&aO6%DWfs$(i
+%JiNBF]#.-_i=+"I_j"arH&dGmJA0tTB8QLt.aPO>"Q)maf2<]l]aZHS"Tal%En0#%2DK.'^@'7jBVY6B20(@6RGj=Q,_[3)%$`BC
+%-\*`H%-MTF7.p=M4.9kSfXHf<ZkR>]TA.FTS!2]8aVl<+qI6!!pEH8+m2*>X!rBVmV[/+m at l$@18GMGY4-/c]/>nR/fP]qTXL$O3
+%n)oM&Se6h&%?[G,OgKDMg62'I?aBkAf3/rUlofUHLZUmNWk0YOL1&bU$nnkqTQX:DE7MpNAk+WHEdDjK0ZKDr at -00#B$]1f=YnZ<
+%>:J+nV]3_8l2NK9>$g<A3Ao5trm4Eg]T%bb^N;[.$!g29E%q#=)4Y\N`6"FeQ?b>I^R8G'/\qV$/"bSB%Jo\GEY<1&^I<Eb1P_:P
+%YuluJ7?9lQ;#t;j"DRX@%3!h6g3R at T>A>,`KlPR'2CrMLN/8oUjRafH97BuJ?-Sa=C5%Y(`U2AuLDE]!dXjF6"WD?-'[<`1Q<_88
+%[L`#<SLBSij4)G]HLZA4`\Ij)(4a**SY3?B#$WtoSqTc&8Tlr[\"&M7$p)mOCP7Ah[VX"ffLi/`ZU*PM]%&>J2Q/X^WT=<Z!)"uO
+%6ZbPl*B.j:)n8pU%T_G\H#K"#MZepqK\?b]jspb;URa>u"qid$*'Eo-9qg%&D9gAYT#/if!H<S2G]#J#SE8(a7SbS-g at 9aq*bX^a
+%&1aHarJY:mYn#qghQr,pM-A]N*0;E0mHB7`]GW;6=\/+BV8^fp3sYJ^ZR'D-Ibl*S1kcq[Zl$Y=!'l?Zh"K$sY["B;mTu5db+?0p
+%jm9<2$OrAO[qe':`/q9>\!:-#0#cL%9C:nS1J4l_pk4!Of2"@&_$dE;QBpJ35NK%3g]*eISo#QK_ppPdp at aG$/WFW06FSPa#]W8K
+%<4:T5^'`_BbFH6r[\)D6#iP*<\)^CJe8?ls*c&BABV'sr9ua1BhK0gY?XX4IV6=C$p[aI;/K<id4=,Kj5IF=f-&1d9YO+A+,b--d
+%amIrme[F"aO2NVp"piH'^nj?)L)QFDD46d<`(.A@/U'^&R\2_<4l+Nbc->FKCh3rP$gr3TEW(j>D9oGD)9\@`of'plU!n-a_H$<r
+%[YW/g[mT\#\`n9GmF7a92Eqd,0[8u=NO/1#+M?2ENc.52YK8pYHLe.Ra6JW_<,'YHMo at KtoD^i)^K]+=\`QRIS<mDb'=Bp:kWRnG
+%9=OX$1&RWlbAMgBI(>QR]kW&1^4_3e*OgVAP*l+?jkJjgm)@`61uZ2FV6a->93\kFoZO^Xak2OG\,#u>H%0$A#P@:uok6#8h\PiB
+%k7(d:8b2B5\+N7<nc#tA^;su+gJ/8dO#k1]=7>TNkP*LkF`V at CHhIBPEdhBR4<V&%a'3ImcLg]+NV,Cb(.<+Fp=<fpUV1i#=0JT@
+%/&N,o9E2\S(Ghu at mdI_K^FLD\rd=<C2?S0dGA3Jp'_^uF[D%&r2?B.Eo'kqYhKkNjHG+KOfAhd'_c4;E4raLArI'"8jkD=M+X?[B
+%)qb>T]E_t_[QS$FFj'6fIM]n/cASuu(T!\k3.mB4^5iRKk>`rq]BrFr<%A6;O*gi6I'a^YD`]VpS@?IR7eHBNfQ(P-P\2e[f/?sZ
+%PlC="6-nD;B_B)(If/_=750FQh]+g5?[`ulJ'o_1O12k1hs0\1rVaBVqW at 9o'(@j[r:T*:jg4scZlJsjoA->'%uY7%GP-`2pq5C`
+%:EO-rgMc8[rGHn,HN3$gpRcSXoC1R[bGX`_rdHZ:s"o0&@=;>Yp#a<Ve!KMfIf2BVQuDt4)ErTIE:_o;pJ:M9:WrUrk-kj$kk<^-
+%6D%o:5J@*bq_.-9[$U4\dJbtOeSi4XBIJV]hqotLfT.]STB>7tbGScTXCV0HoD- at l[Pr\@DW[!eSsI]phh/^^roa3.q4p+OI(]9V
+%0r$!P;W%@cq(Vb8aF?!pqY3k0LN3*"-V?>plYe1Th*1GZ]IlF]s.Dq,.(jj%ptbg]Gl$q"bK]cGrV6?^iT?=db%KPa1>i!`9O--r
+%S",riT>#d*4266Yq=60\5C_4V^&Rllk0*LkQKA$O_t<WFEq at 1M!:,XCDPh7(5&FJ8H+?55o^Ti\*P.mcL<n?#-bH*Vq;X\h*Br^N
+%4T0_R>2+7;^\l;igs)rQ"3SR:2r7lck%u'pg[j7YEW\80%l\^e-/:W8gM\/"c.$92^&?pf^>H;!rMG"^Dm!F<S+CD:^3kG%p\'=;
+%R,>>2r3j;t[o[MCD7c\&T&9:[f;C:jIsh+Wk-ptT=;1_Ehp=Tr2uhpgS,`$VY5d2Spq,uZIaVt655h,h4$J),);5l;qu$q)miL1a
+%&*FH at CcI12B%i#MBl at A4V_=Aql_Bd;qqee`]l1*#J+XQFc`^J.*$<lNIV^\;\6m_*X#GF]??1MPr;I5qq*c6]YO/H!gGaP/G!03Y
+%n+is]q25^%:]%?13W/<]/4iJ6p"SAPrqaP'2oi\b6JAN!oc!2*lu.pAmem7NG(\]0m(YXV(,V]U]Dq>hh*.BHiU8sY?%-FOg;!Cj
+%mll4!Ue<jg5OAifk;W:q3pQuplO0hBrUPs8e%aGbrARI9(Ybj;s!)O]natf:-3*'?o1t.\Ilom9h#?Kss7lTlQf\#"p$:T$5CITt
+%o at L>p*)EnDibneRs.fVoFoStDIJEN_-i.J:E:o%5*pMsP[n#*meK-jaI:D*iDNBuEme"#ua+GFo4R=9G5BLZG4X-%kF@`0H78'Hu
+%[sFQ$W$cfPme(gDO*6qO%OsM44\@+k&":^[rQ3smHiN"G&_0;7/!uiM.%uAZgkJb;$hlrf1d(&h at .t"jVXkc8Zi]bUhSoBe&0DQ0
+%VZC7uKJ7)3:?aCeVaoRMLVYS*9M=RuhrP*QV%h*$r$],*Ea.tSI<hn((?u5Ym&Ajn8)4Z,e"shHn+m7u::O$-jnAEAme623:@V:Y
+%rTWbBGj"PD?+ITGk+DaupEpDQI&IR")DqI2+7iufllT#apQ(Bm*<';L'9A38&,P`VrUs9AX*R3`9R:R&45=??nG)MBE;snOE-f$B
+%kk/*?+[76#C3]4Ym\.7B]RRH+^V at BFh;@)`pJp*UoZcVahM6H]@INV*miLobn*]U=GIMep?.JUZ?"LYV\ls=0SK:Q;VgD_Jl#`u<
+%W4J=C9"Lp>o"$b3h:p!)LYI13lUc<UhcAQYf)8*uK%D8lrF>lSheQat)BVp;@(/`65kJA-f@@q<TM`AN=Pdd\Fc?YYBmc[Ffk[\$
+%nlQqimW[cg)<`pg7C/,6O;iKVV9=qq+l@(L:AIpH=#6B80F.ihGdFP-4f/J/nX\h=<\n&>o/T+^7,'5^+cfeEpKA^fXcm)WV.e[M
+%@2!%*Md:Q9%pE7_>%P0HD3b$]em8^Ql$9DOc9H&\hJ8+BZrVOU=ZVh3<cRW-Bm/oA/,W^hrM4R3>;7+-8NR%.#%;65/PW/:ObR,Q
+%9>dL;QV at r:5RZIlIp!G7=VH9f'7X-u^M$?[j'R4]C=1n0;f_T)r*02p^]&kYbdVNinaq*VQeVLUIj!_ at r-bdJbWAVp)b(IYg(DcZ
+%TVf>^5:U%A-uI:$;XE%,bM!024mM_hp;ku5fjk%0fJIiBMY>]lND7TkJHMdI9bIC\;=/@=O+)FTH^*o[[mr3p&T';X5Mc`3Qrn"*
+%UpCAVZq4kumgZWXfh==<hB(3t:#6q*>6+R?X?r)H^n\4>_3/KTJq_SnVeq!l8%"'!(/$QiQ#+i]g$C'Ffd=;a7d!M<HlG4^)r53I
+%^"uATD(!.D<o1aEQF^n5!r\'pXL>O01MU.[?<c`+gZoXNe>j#oXCfV`g!rR(]@q(fm1q?ZmV:3V2I:=.QT7Okjt,l*Zu*VE9t8M>
+%HF=R_c1nN&]#K(=bKY-siA.`^0j;h4?'"[MEIQA9;5Ek@`p,-sFZ*>?dmkA+h-cdJQH%@mo[S2XY"VpMG#3E<Q5:3X]Bt;1QFe<P
+%*m<B0m;)WGFmnWWCb'g=b;Q*l=?_*+mC#[QWuVhV5&'o$p:0tCqt at S`h/ReL40!uUYBG[a]U;gPU8JdFR#u4rR554im^>UnI.f7m
+%5<nG`UKftQeRJumoSMs<I.7Kg*raF))^4*aO/F$S)f8]Z`7jh/X]FRUlgmlSoj00ATmsEWB6Y80-98 at L[A("YFcg1:EmOZYn4_,2
+%ra'JH\3UW&d;GQ7ok$*b:2FPp;)s"UFhUNLi:b)RG6.o)EqBnqZ,+nS1>*LNgY,i at Je=@g)'ght0,):^+/'94%Rim3NuEHo(PA`a
+%.8UYbkh-s06 at p[(ZsLQ0QET=cp\aV*;"J@!aR[+h#6CDEfTS!mQoG*iL4l&V1ASNYI4QsHFBb[LBBL<ghJNAS]fq7Fd95*=/TAZ!
+%&NnoRpis!GH*g#uMRP8p=s-tTgO"ZY]:XWE5p9g;-0ibB^g!?[9VfA!ihV.a"s4OkG$<*r`\#n,lcs@=gDo,(m-\r\[ops6TA+1"
+%oCuuT\BeO9Ar^$CI%TS\q/SAldH2k3*;/(Q0Jeb*pH+k.2BTp#Tso;T%Nb>KHn/%nfeEAH'r^T]s'kV3h;04Of42"HIl6Yt7m.2Q
+%^)lr+`r(hdIVZ;Jf%N438,L8-gIT(#kI3q6`qUFQe!T:chg:`7psY:Zb<oe9nD\HfluDdZEB6=%c]<O%i7S9_bo9q0"q"9*Va7er
+%q'^01au*O;h?nc*?p<n*_Z5!",.r0Z?i!Ru1QUAG[7;sd?FJbRX2f[9d2m#.RIPG&NLSZXLXYs(gP>a&G3EGB\[G]0cMrAL`,OG3
+%o;uF+r[eoZ<*O)(hhEMAJRAXJqF(5\2?F6OIf8<cg%5.aREGi;J]mZPkOXHHA@%Q`&BoH07Br^@R:$&la6$iZYlJADDCqs>VUIlK
+%>'P+eO1*&(>49GI8OCPE6HOTA%t[@G9<o,7PP;U8FOVkp>dY/g[45NJ:2`74T0<%o]!XEM*r4K8rOEZteuPm;XjkNt^"m.a8eL8I
+%Ak?42(q(jS3T at Wi>\+9_pNXS_n<Pbl0\8Jiq;;4M]^_rH*rYo.nNAQ'e+U<+*p.JPn]SB3fR0/E/*j[s+I]]4p,2bH%Gg_jO4UK%
+%]u:hL#+)R1Aq`2$\(flNrL^0rG(KA*'nZ?pO,'?Q4C16=7sX+iiN=5NHgLdNmBJ7#/P9iscm$OH9kmAHn"%\siVi2h!tpe])XqOi
+%W]+kKr*co(;TpXl>=l<4Y3qa&e>grcgIL2J3\5OQBYZ7`S&;RBJa3DhX5e^hNWHRUJFaAgq#J2KEq^f/C.A8I!+:r>^#A]U9E)Em
+%J$]ZNYEJphdf5OtL at inE4r^>Fo,s*K,Wa\^hXEqcp2\l+7BugJ/ASA2N72B#mPgrXit8qD7bZ-s]S6i<FKd!C*@:&CTqR/L0q;)C
+%rs&'=ngUkZq2?ElgTusiNT:NfT>1P`\\-n'@TX$(.\o]MDaV%fn80mbMk.T:XL\;9=no<.\Cs:\D=tY'>kpD0p*OC`+>t-o1q$JA
+%m2VhtCdRU8FPacrb`fG\(*?o1qh?/p,Mma,GiQaEZNnbShS3cS2sX*cg,XM!AUUake*@9`:Z,NVn1I9pB2Rg/(/nPfGe,>^%-&-#
+%]hIRrSaOcb2P,,*3Ub+=:VO4]?gZ#-^>/JFIR$uD4kb'ngSt'V^#+k9a at SO8a4mkiCOs%XYM'$6rb-Yh4kbHn[2?Zf^"mjUgYmA&
+%m.=nP2gamLC])rp?eaLNIIia&XlkZ"%bAi2lP"J8I(.egArem?g`GX_I(.A4I;UsSrNhn)X&.,TRsf._S*dr'7]pB^gh&=5B6(Jd
+%fCQMsiNp(Qc`Ci!*Kg:VHi!Ns3;%<bH>QY8a/TY_gM.M>3^2Ph4j2T)p7!?fSO]f-Y\W-]2W)IZoOmK/MV9e3>dmksAgoA&?*hHc
+%)go-6*IF<#*U?.%%6Y(<HGOj_?,qBi[pbGE(&dY53950%"('%)e/TG&/'h\@F#;N'aGX36T#9A[?LPkV:42II[iK^]8*fTRpr3,3
+%Ids7Igiq,ZF"S5UZf0/!?J4lJCA&]->OKe(,@=UGgDt!ukN^d(2kPA`VgXSqc-NSN`e=npa5_)N5VA2omU_l+h7[N\_""&+>Lr)U
+%%c<,UM7\VUM7JJQ*RXR6`_O:S'LSMf-d+:%GWa=K^!$dhZA$U41p2`n0$*AtTCl:I)EUj'or([!'Q2]u1S&mTo=;??p)',RS">me
+%'^Ji5G`D]jcZnP/Y,mi!>2/$&/bCaSHL3B^BDuB3'itX5Ns9:cm22(?:l[k&%-9I5"4:R$9<r'TBEm>JiMa(nmiDpV;6Fldo-h*%
+%TkUdi-eZm]4 at d$/cr\gC?9:]k[k-U^N`0j*VcCo=(->RA>=p3qnS5;dK]-W"nY69 at pNG33EU1_eU:hSYeh'e^kVX5=N0[-0FpREB
+%kkWU9 at im7cG@sFO-d0X*(/o92>:d!OG!I"k,r2E&],]@)XSlhAIW#J"*8-pdE[d;+YqqJhcAV%7O=^^SYVU)^I.rADn#eDd]k++b
+%3PU\_*+N=cZEK=pc\L1Ta4]&Lg6X&Oo:`V4r,T$T*GqE]+J)*;4-02d]R;fu^)V.I+h'r)iB4-LkOHdZOn at fKg^h"Ma5*'an#I[O
+%NR6e>qf;1S3Vn4%h!Tc\Y7Pcmbd+2AG'^VBkNAae4*nU\L0pS->n4gOq:+iKU7f+MDfRiR^Dr3edJ.(+&cQ\s7X,ejR$GBLLVB:e
+%h47?;gNhQHWE\rsqmfqASA&8t*7%F=p/<qp5)%b:hl]`3:0Y*4T==2B;r19u_McKlZ\SO-MGK0BY0MX&ijfjQR$Y[K=!sBHrl=Vu
+%n>/gR?Ceh!pZ8kTmlK%SYJ6[T#1F at Z?(sOWm/$H:4M;c'lI!:+M7pU6LW`uU4W'a*5)Z>>..oVrNRt)&kIGhc&+s]8TARK\qO_2_
+%5PNCnlK%PLn^Zak/,sl6"7FdUSS2<S(AH9H4(!AT_W]8Am&,fokDXOJCD='fViBGVj#PjHUUe8qi"8f"KqX/m,bJ8_Q%4QR`#a(I
+%.uSa0b]DAgL_%(]OD^sjkOYSBM:5[AHi(A&jlGZH^:0[&)33Crq!QirlS\tEh5@=&ebs$$]19KFG&MB4-Xk'_IW"O:g-(t0s5gfF
+%s6ckT:t+OoStB8ZcRnOEgm1`OGI-1"]9E1Wln3DYfk0>d#Q+1$B-shJQM/It9DqbuH<a>qmcnfF0X`OV1 at 1)!/Ut/m:03MB\u(gZ
+%9pb.B6nWW*@p^j"X)bdtZq at 7>G.hG3+3l`>pKQaC`d4tkVlTZSri-<?YOf8'HK5P8?NqZYf6pbEl!,0McB@>7pWNG at q>Sj.mgnRZ
+%h&2WObkGI,s4R-bR-`4>lgF_Dqu>gbi0(i#)%eM=T\*jn.);S4>K]4CNQ*"j7Xg@&MOiV"Xbt8.<DhT*))qW1hl<WH at fuH6+'_lD
+%AW-0/FoBgM'K#i6QPFR2F)HnrY2c;+)qYV\#&XON<PrUF[EajP3";+<LqD!>eF6VsYaHZ at D/O7YFS8sL-$RhbfEI1M8;p[_p=bY]
+%gH">AX(;)f%*#6</;&%6 at G`%W3)!i]n>sX0DC=+=8F-Kq]@9oQchiZ]B?+QG\qmDPT?`M`<I\0ImS`Rs7Ut%m:\M$HVhW4ba6ckI
+%eFQkB$RX'ClCrG)&@_T,F+j6,WP,I'HAUCZ/#Vg\\VJZ0EI7BB?TdV37sXXWZ64ldcIGqXPD6d5BrcP8#Lbi:II^T?3,TI-Bfl)@
+%=*7@<<^"p;9!'#scJmha'6U:3lF%l1>A[*8Nk3_1AW+0)Q'BfjaZ&+KCSacA;r4,sVB/n\hl<R?iLa+F`U.n3DtR%06)D9FWi1)J
+%IbJP90%Eo3)c5b,l5d@%lYoj,Q+#tXCt2P)lDq"lkIb[c=l\f]UZW(H0@,TKfD7Tk3R[>??LdX"k,5u>1VTmcH(Ja*EfF+j\t;T%
+%nr:u]J"BX?=X<rXf%2[<c73K\F[48'JY(HprTW%:1NLn@?Rk78B3Af\SaPS1Bu#01d*;[c1Oq(WJ'Jo"fj]HQpVS9JCDs/NrOOQT
+%=+ at A.ld)WTg+!6^XN^P4lE[d$Y:?kbQ,N]F-ej%8rYg4trkGW`>nhV`d)SWSW3S)VMnO?#d3Q12"Q(/ss,`:"0V&^1ak`l-e]nSD
+%49KrC, at IbnZqE!3G.UpI>8Lt&rUO3=aP`DQQ'ErEE`PHjqG'I5)!'Yd?f4/1k^<qjJ*d4Q>(>oY5*h(]0lhk`"4s\dpskd6kl1rG
+%Ud(M1#s;LWH2B)sTXP0;%lOW($h_:s0HY7\e8b=P-!WC1l="&uR]#>Pmb#nd;s6I#8RlTjQu`b,O8cHJ7l%uHjUgEM3=u-rC!I4"
+%8+fs\JH(2#97<G+e55&U"@!7LOeGMmD6k,UQ-]&JPmRn&kR1V5gDs7_laK6LQ2V.-JY)IVWP8#P0210rgY_r.4%S,As7Skh->>gb
+%ojGqCP!9qXB/dheaYS9>C1<Qi"QD,'>pC.U;h8 at iMDtjS4>So at JuiREot'4mH!7.lDUdM+(WPngScdEmGO/AkdL$H(eFTrD0>(8K
+%gW$S6n=!t4ThMZ%_X?\6Sfl&&2-dq>E<1t"fK/O-"5g>%XRDL7]D`eGZ\i"SfJkSUcGhk08fdHGaMe2[FGTh<cAA5^!0.A+B9ka:
+%]6eO50_W?:2:Sh1F"28dMdM1@<U:o1+'%[U0Id^f3>?fU^Oh@*L!<,)8Qua)R8^@p"E"dX)]P#Z`E[!Vir,CATOIA$7,0+:I/$0*
+%LMMda85ctNQk&TJJ?GT"U$Af;ee-ea]&F)MN#(k,0(ItXq$6EbJn5AGf/nL@/g,>.XtHBFS3WFr5jSdAb`5splKGn83pOAh1NuST
+%%Eh66J4r9?06>QIFO>qb!Yapd,d>fn(RObTE>OJ*@Q%4OJt4sg(?:JcONVC%Hoaf$>Y8e)nsg].9+Mu`?#sJA,PQj_]X.%&)jBPh
+%N6u+E>IG$;.=H!!*3>!*PulCj"70;)Za8SW,PC2d+GgB8*RR+l at 51AbBKXlZbCqKu4`R5VL+SHp at q<o*5[fP2dmu*N9"rc!/fTj6
+%U60:T1)8618C,?hT!t7o!L!d+ND at GKmZAXm43/7]2+hM+,lL"%D`"c?,Dfd&HFih$8[lY21sr%_KT"q6a>OZI[99 at Uc=97g3&XU8
+%q%)X.L["*B=oLTUmb)*VH>BUck!h"_7d5!$nL-._1Wp.d)S:A*43-+;]%LEWFOejjkD0O;/r>+HY:Q%&Ur\@X@?#QhC=YpF<p)JA
+%j;qGKjG64H%mdXMMl\h3IG^O<OOj.hU<WHu9AD+2m!uL2/B,)gM&Z9tV]8sHc?BoV$1#WlMnfd:-b2LY+HIC60bphX^/KT01^KD-
+%j.0_$FpF+$b!f[3LnX$kadWG88Nmn5MNSkVJ1(!UT8c8<E:\YAos<=#!"_16E'W-5Ue09i7>bPBq^%Qq\`g at mnRd\OJ`?Gtir7Oh
+%j!DimMK(c!rdQb*/$W<<.+K:7J%Jb"0%c*<7hd:)1C(0q$Y*:%nMcYkfr/8Al:"C^7M]7M]mYrfq9qjICgoA2&pJV%l5%>LQ,`!O
+%m(K.,qCHIIXBeff3BhLhGGf6O<$WuB6uP8Zj#Bj)SDu[1n^+LK\\dSdStRG;HH80h%/XU]8(:nN@&!eYB5u3$RVBW&k1Qe0gIA:%
+%TU[e^ej[=CS#Bu)Eo0INOCesT*:SP_Jod/;WQCqaMqqT:A[-ZAoipe?N\fhE#2XXRW\UdJl,HB$Z"HE[41-Vk5/me$0^aX at h,i'4
+%:%mn>4[>=SK1q#ZXLrkcQ@::Ig at l&c_nY[I)S_sDR`rAKfZVg2c8OR4m$S/rV&NqBl^n,CS*/]-+1G=$pYE$&r5[^m!DK-Z-^8g4
+%(/WSMc^K#2Jt<_O<%skJm3;%&d;C%d49`Fl8!JiY!tk5mbQEMJ at NN@=9G#s?E!ak%0ej&D'uVMjMHDeeAG&sjXPb>/#%.k:e-Ro6
+%@0aXXL_U1?+?%#/!#\$Ls8A&8+SeeYKOL<$&:Vu+.F\qs(c]a%_W+0'`;i+4La-=9KDElc2QA=1Fd at mkhO?mimTK%j<R&pG*a2e=
+%.?%!?ij8.R<S%UJI.#=D(f'>VBAP at KIVVNd?o>fbYcBjIVlT#]okN6^@]7obk0H*JI,``+FY'H6W)]?!q78f6$EDp!?+FOs`*.,m
+%4+)N)L[SH#%!"&@VA.'dK*DoD1i2Yjd,<Y(-+tG>ouTGE"PLL3%/1.55KaWTe_sJ+pT(L\7mrkdPAP;-j"^\m9/Ns:+H7otb'fCW
+%,e7eer%:t5YfN<ajWFWF55WHk]Vgfh1c2a!&fuVYrdp2ep6##Vf88TPNkLn\a$kahSnFD1P`^*p[9Qj-Q*'AZZ\$S\'$]b=XN#gU
+%B^1=g-F3WR\RB5W'76CX!aCfK'[%M`2fP:nrjgX^23Y;"Z,J5_>F=cl$HY7LO]dn)\C&h-4`k7DF:Xq]L!JOIB5P,KXaTOe/[4Q)
+%*M48tG(UC-pW1.K,(\IGqdR1_Y*)ten!Hf]P6)NM0PC/%R?QeHcbPp(/a`++)d9<bO;.r,<s&P6CNX8Q`-?/V"1>=BB0*hK$F1UY
+%2BS(/6nAOJRDAlM+m'srgG0OWc9u9Vm#'iC6G3XAIstr$?Xq$HpH8?m)=cNdq3R2<pG3KlSct(D'C=d`>1r0S//_$F\r*l3>[4FN
+%\h;QMl6BX52blcP*)/0C;Bmc-k\Xt7=,qnQ#b,k)Vdsb9$4c=@,)E at qfXOCCR3n2e\<)hLL&-IBYFQ\Yef*V/E-<ZV*UH-</R;9'
+%ZUn!69:1QHftZL<-Une)8d*=!c0?BrrL;#[1cY]9 at Q%;8VIc)BfuO_+8d<NYqQ#=5&KLs'k0t>QfFnS2Z5`F(`_N3;XS#(Q18kHe
+%Sk(]!+WUXU(f6k1c:obOM=g"g"FAPL,W6'?5[T&Q!,W<X(f6Jm;m?*,ckN-$@LT=(IhYfu:_99AibntR6'Ob#`_87]U_tE<iQjkq
+%rGrhGhguF3Z]?NYjP@'5DV07Z)g3/A48T;Y_2AIQrp4UaC!:f?2g1SY_TKb:2nftZ(b6r'\<J!s0Z)h&@"ll&[X%<cC9b"^,0Lt?
+%3bbZ3.KqpTNd[o8E1AbtJ"pi at IDfXZW>C6DNAYXnW[0pa=Qh(DIs,Ck at -=NKJoshF1Q(5gYkisbm[!0fF0511=!-tSIt./Q]s!KA
+%YI,P!f at rpcYPe"iLpJ;rDSC?S?VKU?;u$%"SDHH^n_$%%-SptWPAG#Q&@]K@(UD1iSFa.#G^[\)cf^83A*gtsa\hC1RZD#_pc0_k
+%q4'MUc<TqFcD/l</:=s&k0WTp"Rp6jag90KWQ/kR)RI8q;@]B>DacNi75J]9_,o$C$PW^,Kdd3b(W4m(N6Ci[b#q<*VNka%MXaSj
+%TjbZM^:;XZ*A&'SGdtq%3o3lfGEp^YXN)5l$0h(&D(q6D65g0m[RC7(E&U3N[Zj;H!6n$3]R;m$e+_6l[:>O#,K2r`?@0+j4aeEu
+%$a\;BEmmVPAt5`?kn]:"I4ESXEmJ)4PtF!M/0ac^JlpMUNWf=L5Q0`:TtgKThuE,bJ,0)Q&.Q4&qOksm`4nb[GsWQt7N0s"rMMHB
+%D3<f?6JQeU`C at jl-7Ad=_=[U5p?00^$a(:VYWk4Mh&KcJEBGOgYgh&HNdF^Gp+1Dia^^W"L at d4]O"Q!*`%P:$R&#g$.omo->:Rmu
+%4 at 0\&]b^B[+221*KObaZ:.RPl$"[YhhI2fmacrW,=ilth=K)d at QHkpZCR,l;hJ;QG/QQV$RR(/f]1p^I=t6f>\_>TMKl91bf(oL3
+%f%tJ;RiBYWV2H8PN.s at Q:GS9fo>?`"nJS[PF4WTYmtQ`i^@p9pld^'hGV+ZaQX4=.Z<eOA[IZhj-Cu$n5ARXpMq_g6ih;]s]Z,Hl
+%@e(IZkKEl&R at +;hht/:ej&^NC?L.!)8pOh;!UJW-dJmlX+_E$0W"InK3+40ilKrQfI#aE4E1/;\R:7;0kh3,*2UCWZHA!G;*8SGI
+%B<\u5$J(K)#L.QUYZRUN^6hfn%9/Kgktfdf+]P_+\qSrbMa;D9'P>/(EBt3'+GQ5iB;*mPUBt,OX-u]]+G4IAPlJ4oI$BsY7:EHg
+%]YaBJXbQEK/'uBB[$U?TPF5`*X\H+gF&M1Bd]K)#9-iYdad,_&'me&l5T@=%-OZi05VFb+368p at I.?/p$0^JOKoJg#+6"YOXhMfP
+%!!RYUb0O9o'W?W0%5h-aCVjgZ==jic/O?HEpEWORr7JQ)[lTe'L2&a;^5Tfh?cKr^L6$]+?@Q.TT0;?%.mFiRiNZH"FbsYs=hsjH
+%Hdfum8FD7O[dVq>94"Es:QCASj4KWCH]g\SM!&USMcGY,J)=4J@/!+TaAA.Kf/7.ggj&HjjhAbr-sLi++%K2;7u8_\^*m`>1M*RW
+%_&eKAFH`C#MB-94Ml`l)7FgN[C7/l;l$MgGH_\9L`Ml+?"Y<g\L2ZGeD0t[,R,`#KZ8g=hEKmW;Q-rZY^nl9Uct`=#e8'?f>4tk/
+%^+H1^\1\+f,Ji(;UM/1+=Z'rWf\R`gl*'WMKrVL<G/jnnVe!dr5(.p4r1A&Va`9LFirQkNF%4Ir#VfV,EN%WB?IM`G!TD"khuZ5<
+%6ZM2g3sp<#,m])0Lai(gd6dsBoq%pBn..(;J62k>#rt$f\GmX`ok=<'#Hg<,9Ld>[$QtHk$^:A5g9/11#TcA"pc)9JU?JV(mP*g2
+%,\YD>$^8QMV*(8k(,=e7+26\^X#st+N?0=ERlKXD?*`j^BQ^Zee&>I3ZtR'1)]e=kk\)')hT]KWcDp-d/6^`Ekb'>PS43>?X.E>K
+%Oog]>`8`9:39k9LY1 at KK4`\)'#ik=sbG`WKC9in8lp[qYCXL0aY.SYq5'jB?:>OL,e6+a'eOO3DO/AZJW273Y!QbBBQlba:'1Fhm
+%(.KY2a>[Z$eWO.X!p3I)$l?_?)O^fhGG4V6ka[=O27lsP!-%md_VI;N<0GJ"h$m(k6g8;5r<sc%VGo8.7f+$7mB7>:D2l#Q%(VS\
+%"*ZN5diO5a;a,T(77tX(EGrG!,gO,K%Qb^c+(N9L[gA7C^s:n7A&Sp*<fEsm)mBS?Z!bJ.$bO^5JdmYL[eFma%GQpp+*/MW;nh=*
+%PqHD;B4m=^ebE;MPsB3fFoj']jql(k`sLia28"GrLP'l<=u)RQmSIpIfu9Z/BT4Wg.)S0c;.V4K^C)U-4Sn=Q]B_/]gho4=;P+?&
+%Z/2d>o0A<em;i\@]<GS+/?8HaoKm[Z,Bl)L`r'jIS/H1>rUW''[O%9Znp.#/<$'o>Qb8*t4C,\^U[?#^1A42GhPe`"c>_6 at C)";>
+%A5Z,D9r?R.XZg/,*;;R0E$aR<I<B at uh:mWBQ&.GFj$<XCr(-\LE`ZOiU^pNfpXD)!F at S:Gd7JQSd2cM7\VDe\+a[>Hl_>QTE3G>*
+%AC!6fRELSAe7Xbj37iq$]r9L8:3A5XoWDJI<(HeU]$[!.ch!T29OUn"UodGI at t+jK7gRO_XaMXaBW@C`oR\3ZOKL[Y$!4*2G6/Fb
+%)DAH]p9Gg=Pcf'Lo]:X!quDdQ@:U6ojtO(hTis2EV$Q`6FnYIpk>8DqrT2`j;!eXa at d!X&0RW.-If/`JcencnlCSo8jWK.i"3&55
+%AbFo&Q?Sm216``@!WdKQ_&+:[:e*aj^FS6Cd5UOa2kQfElVd`Tes(<*cr-uNN`?Ii-7ti@`Sn at 4.^o5LepenndM>QB1@\6jhNj$@
+%`Sqt!#HFsZWYeW+<W%\O:pmOkeP*.Y><Mmn.3OZP#h\o+9SMO at LJ/HL3)J99J&<(Fbp+C"6PR%/a[)U-*J$e$p=q,m!Z1']oJ*$^
+%#.hmnYN:@3c02/>);!^n!Qtc9S'eM)fU8BoQ$jBGRg)5n."k.u?$`=%9=`Z'm)c372Pm2<L6!u\&%1D--V]diGnMK;@?O%#d5lIW
+%O^c$U=?1uO7k%;'K&\C?EchiW(L>2UgKK]ICqkgj1udIBKE"o=rdC<h_eD;cKio"#7A-L<^94[pUKK*Bc7tk_l2I[-Ub1O)Ygf/t
+%7 at DhtO`Nm at U&t&uV\u4Bh<-3'ohl497%?:_A4sl*]didR(oMdF\nt6=WUNuZ,(Fg^\[@h&bu4'-IO]2oq&Ja'OM^R`1j.kInNeBG
+%@9gt!heK-9D5LaqBh6Ws.5 at B];G-J)9.(gI[Mi)TktX</0jVssgL.+m:n1:%oK92Yi9'_EkAhmnk_Q/n<<@V/TWFcc7^j9p/GVmW
+%;r+5Z%7=E1+Xg1Y?8g)g=CMktl4cl2N;=dAcRG;")gi18BCsn4&]LUJZ]-:q<*[!nM at PG9F4Ztjn'8UdC6$S$?%gXlknh:Mf*Z_8
+%;Rqm]ofD'7F.=U5ZsG!4FfosT]R-c"f?`dena7,h&F:?Rb0g[l]G<^dq2-C)"CAa\eF!S_miS\+\.;?kj'24"P8CcL)^Or#9:tq*
+%U##ER5E(*&'6`cZ/j6S<n%/-qc_eIgoMm!Ik)ZRX)>idg=sf4MdFnu!]0Y>\p\C,AIdoVr/J24Vn3BY8k2C`SUcHmN8P.DlJO+*1
+%6B"IuU:r6XMB#.s-RorRX'I,AIQ*N9+33h=LT_f.bIZ4o,o64LV*QAge)-W>fFK-[Zd$b*Nf1$M7\%B!0c*>>FF5^"\%s'.?,-)9
+%pX3q(.aWQ"^-FW2SZQ1RArkl at Z-!gJ8$j)HSgg:[\Kpk^Pno[oE`8M4gF[,JKd\YCWd>2Kn>TB<NBi<cW:N2QCn92*MPqG9_)0*u
+%f$ZTR$0o3\5H.7U8)t!)Jke`[mUT.G)^_pl]AT1uV]?b0ZF3K>`D/a at la5%]-YbcdkjcB$Tf.+8s6u#-:t`9TgW*JD&eE;#:eM/i
+%?LYU4DQ<0Ce94`+o:f2IQrjM2WF5ZIU0=fLUf.lGET3+U_aeg#ND18W-`-:@=RS]7]!W+V(E-+N[H<tPPMH%`DE^)?&,OS?pk-tA
+%19cI>D#AA1*jP>Z;gH3TjTV]A2IHm0VrG"fFSkURp^,ik62ui!TRBkX]@H0%lL\t:HFGrK>FjWQ:@D5]GH93)e`koToPSet[lV3,
+%S_gJDmoH?1X4+]2l.tXsQ<#AlnI/OmNf2e7`O]jB+>g@,;&f2[js\P/H>JJQoSM9%;qr]Y!:Kb#_F.&S3pf(8YE/\Ik at i'm*J!#G
+%iX)N%h1EtVq,Ve5<T!,Wp3Zc(^@tX>q?Go'D'+eirqacC"UW5%T$T4NJ&/W"CBD$W#8KCDq>=Tp(MkMA9M6^IE`24[SfEB[?iebS
+%b at al>+'?$6e:9N;RTVC=e<J(p6nIV3NL41doPD)Y7a%l&bJlDhW:#^Grh0_B^-8dZ,V7Md2'An(,T!F6M2d\YNtbKmI'p+P[ctBN
+%lh82<\%,2aU- at T8Hmsi<qb*Hkcjqr,fZhN[_n4&\DCi\gG^kYFV'!+6Uc\O-G,RW-i:2^C-fM?GN1q?iDiNSjZnkD4_rs5lhdZ"^
+%_fs-%q3)R-\6RQhZU&sU`Q*,AqWkZZofDd:ip0K\BYO>!-OB1.)!H^T6AjmKcAJ/9:<[Zh0/5Ec6!Y795HQAP(upA26;Hr_?TSaF
+%1adS*gVDPdqjZ9,;9]To0'aR"5Ke2IkIn>$/UK[)I5jB/hu!8Il,qb]>el3 at KiQ&,aHRqE<8"WO9l at F0>uP9JXZ<\jpJE:On*K[5
+%Cr1QiC\5;))h$6\/sE_nr+ZH(=;@BqHsG7'kZ-.egsh<AY1r'L6hf<*dN<g!R*0Xh^UU at eU!\.:YWi(lVSo#S2EET>k$/4V/V,qQ
+%, at eT[S>i($2GYZ(\)^,SdC.5obnt?]4K2c#[<YY.;p+5pYp$UB=HO,dk"M0m.1^7KV<k0CXt,8 at i'MDRVsotV`4BJZ8b(6-,u!Fk
+%k&Qs7P`VSjV_dC^a52%,IE-g1*LkLl]8CQ])T!4<#ZrPse:H^GkF1F<p`qA507PGk=7LG%_^F\sOY\Ht<5eX-JQCp;T)3Xkr:L#b
+%$)W1'@9(EN&+R&BT&4:.ISC_kEStFA-gt*5Dcj^GnKoJ_E[/0 at T"!]*)F-eTbYS at X9T0]>7;:s1ZA9q:,'eW=jl'#:e#RF*<OaS<
+%;PoA7<j958TlLkp<rp`!$^5P^cc$G(gSA^Zgs"TK$7t^'MZOg.3]UBqYE_sTXir[P!Oc0Di0"P=#(\2f0BI9l<I>M1S\=?!9h/@B
+%^5aV/h\k>JWOV at CRccsODd-D3'^\Y;;8p8AN.7F!kH"i0D^PYFE at UWh%"KG65u36QQ at _mO!NElPC'#C&4)Ffs`ZTWH1UI`aC['^q
+%<m]IX^Jb%i)KRp,0C)g at f,-8u0lq`cpmrEV?D3(LYg>$@3/<Vp^2\P^h8t0ge_F;>o/WW<!lJ!4VjKW`n9HgI7VTC]MHqEIq2NBI
+%IH8faiP&fL59O>VQVpZSpCAARFFbQJ*"s4,n(#5Y#Bn&F/</j9%d2)oZtsM_?VoVQALO[4[Y_RMCAh9A1Fh%QHHf(6*-p!:K8l<W
+%PcMDF#3Wh$9C<LL_o<ZQribISH_nh+%D<Sm,OMFaQu+nWG^,r>7PjJP4?5e'Ke[JP0EuZ#QPc7#n+R`SA)hOZ8=U9M6fjd)9KZ)!
+%Or4"(8W8!JM/d%D:QEW_N;d&nj5C]CF%HLWVUGZ:\qmt(`6WidN4JTBSI1eJ?5%b1+SP?=381!STn00GlCIab3EBo06[>&N0:LSi
+%36IkXO'Hr/hNU3d_C*G>4crX?UY&/%67:OtKYN!4rilN)6SN$c`]B'DYiSQ<>JG[f-t[3UW/XoY&M5m"V/FhG?]5 at 7h=k:qdUEW[
+%*.u1)NTd>R5;aX`k+Z9Mb6r5&WB^rcg^,OCQk"6<`8FHJ+P"<)Eks!qjUX"E=g4Jj-ojk]'e55af%OI(^t5S=AZr^fE.:kEb0-W[
+%fBH1]Kp;aUK=6Y(^X1<6.L^I)8^E:3&n\>]./$+^JbHu7Q.;0_LY;,`lqM/A5;kl6(B7 at aIM=_E+mn+h_i$IrWt.h8:]4sMiO,\@
+%kuL5f'iWep^36K[I4D=kg-sOe/6Gl:d.o!1,AE3r[R>GsRjtA6#--7FAT:_kS9LmsWBUIgip">A<POftU-feM-3Ujsc\M9ZLB$;Z
+%"t0-W9e+2:OfLFZMFhCFm6]%_=S`Z,2/H:DiP?)<lWgc+ktk8X4Zt6lJXn'-6:[SoUUPo+=P],0:OStg(Fk<t=[`rLks:R[`4_10
+%2G#,$##*m*^!C*W+6[j`J"V7pabMR,`Fh<&nLDdC`1:WIrmV7(<nn;)`bO3](t14tlp%!0V-Putm-k.+Tk>o235Vp]8t-64bR$Lm
+%)&Q(.j2IRfo at b_8Zaq+mA[r[i=g<Km3 at YM4k)ni0kBd6nFg27s;qJ0Is',q]p;*k[\CDBSPeaC[%NDoQ*kB6/\#P,4s(7HL1`ZZ#
+%_hU!,H[u at 0B7KmpZ#OZfJfaefXG3_O3QH_Ce^$Tsc)CFER.CnX7`:Y3[6AL4"7FHaDGSlD?;7W'=5aOL%XeUS.idt,n4L9GXhfA1
+%YI\:&:MV%]7GbmI)O-%d'g>h(EE;q]C7co'SK at 3!^SM9HB!l5Nqb at G9;t\%"oN+KEmZa:T-[!HZ4=L"!r>J;S3>LO&[HE/$KCY7(
+%IGQ^:*<Y.Qi#Mo9o\h5;gmYQ4S$Rl9]4u8;gDe,/bM=29MU>c-m[:5)Rka78dMkNE?DHB)E3F-_XC[AH0_O_0go9<Y\hTjF#P at 3S
+%Le`lX-OY'q+8WI$)pO+^->DhgPd*HR1!C]..`#"-=AK*"[q>g#3G!4$_iGH3c4TahfMcd*4RVQM2u[siWN5d+YQk5'AZPup<kQk@
+%pL\0_>F3pRUHu(g;5sut&VIV^.<V+q,^auelI%T*lZN6]lPs at 0V9]gX9IAu$.+):PfiDLPH8"6DhK))dd&*\[8_\eF18P=o!-"A\
+%o20ii4^boUR4b<t'@ASGg6*=Vm?ZH9adOU1c`?2$g+,kMPO%>%\hL2E<S,FS;8;JGr>jR?<S\(40s%!Ac,+8Y^06bIC\Mu<lI\t?
+%S%=eo,o\pZG-8#S4mc=>Fsp%2 at orZBP+A(^bdh!Qb at T^gf>qF3DWV?(-1%f.m.KB%eM"OFJ,;Qe:4;RleLd?33m@,1rBs"RVo.?(
+%l+<Ch:E&T\"7BO8*M]qG]0nEkaN]Yp+^"Qulk#O>rR<-4DfU at W#Xho"P4:JOr[qa^hm8=)<r8HDYU-2VTSd7_gIpmhp=KkU at sI;(
+%,OYT%Xe+kOi`Oec]@?*M!@3iI+ao_Jp;Wq6Y_OZ'_s%,VaemEXZ<`gG*#^ST?%,W)ion"5f'T<;=#5+8,7%f3[h%Vk?EN"63Nq/J
+%;5,;'Y,L0gC,=oiF5?,(2dQ1L`D3i4p$oS.f3!#7[J+7aqu4=un,*+`)rKPp[Ho;Kd?0XF at B_1BE6&"V<R04,9[;KJI#qUU&4[\]
+%&M=$V(*4MYA5*"hDfN4hI*L.<?Ae2GR$DqkH(,g3_)(I`aif23Q%s"UPC<0U7sJU at nEe#Ae`1$&B!;*G+s">+foOM^fes-UZ)9L:
+%qupfq>mMTTJk[G=5oTPJM4 at fUP'Ankc^[IB'?TE:ni<-9G.8QdE=W\G;%X9D`@[QcL-p;>=J52M)Jc>:j<)*=)L1+YbHM5QXYC`=
+%qO90-/C)Xs];BF,(Y%/N)<h7CHeYSAB/c&t8BLnhnGf],+_#FNY',<,0kG-$pQkce>PWc/JNR<5rDME[r;U`0aoC8 at 09)to]@H$N
+%B37X at 2K/JV7(U&YekMpq3XN<$"7(!?gSI5!&+tBLc=[g7Ck0&R`g:`\fY]BGF0k2[kh;DUeJQMF\;;p[OeDGP=&7!!N0mFG>Ap[I
+%B57HDi>[ai]mgkne0nX&>H(KL.,2Q`DDZC*.7K:YWT0jQU^s?=)F]jM2JX"*>$5<raO8"1J)FiaN%s_PiOGW*7rH(2[GUC"LPBqZ
+%%*(ffL7uUqn_ot.b<ha8enoEA2Bi5Tr^*H>WQmrkcH[Za>C&@IXGDHS.Oi.P_n4mfV7.Mq51,D9]U87S>#\\XnV?'!$uEf1"'U!Q
+%<t#e`:iReYG8Qi/_PntmiaI)Y9qbXD@=;og_o\7*Fh;HBCW6>0?q9Zi$lO_T*@PV`NX_,,+rgKS"^`E_H:hbRO[0uI0b^Lp$69k>
+%4 at YY30C2SZYtl)LM*.&g.s"8BTj#Rf2c)VLAa13O[iVm'3H03H.[F.AI:f at +i$N+*@`FuR3:'=DoCYd)6/,'%Aoj'$dd4-+j_EqX
+%QS'lse4fIL.1LB;b%A2`[$T-.>I@@%L2$1`om2uuED8;i9j'2onVj\0>G)#<S-5c^/lg=B,76*8kE%J,rZIK2U(Oi=\gXSQKFHNb
+%+I:g8;)[upDQqCO"&!I(7SK&B`qFW?32:Z_,c+ at WTsV4OkU]E_dN0@]T3AijRj7K7CB"pBKV;*&J>B)1NOEl!>UZ.K9_[Ft(eoQN
+%C90XtSsCfii2KbF\!*>4P!YM;P;2-&\+,9?YPAkgIOa&Qff0MFP;DJ#K"-(NF*ps/j2&eY,_6 at Q6u*AR=l`PEQqQIBM.Dc at Ss2dk
+%njrfQIS,gH,EjsYP/q>/C0SBGr,FJ%R"gmQZ8-T'^)sAUFq$A%WDVRe\$6!p3ORHDC<W&M)c?k\\j.?8I&pWrV1W6e#.A,Dmk9-U
+%hT:&T*8F:b-@$lElctFJ<H6X+c->RgkV7Nb-Yd$"W0uCfE[J%=o0e:?qi+eZ7?;l)3kp`EYF+lBl8h'u^L!H/G,B,)`67f?1/3+i
+%%eZW'%QZK<iBEi*hTU\3Cjga at FQ>-rHaQBaIcMYFGiKST[tCcG$g$bl8E2V$E=QWG:_.[?T7];Te);@=:B?f6Cs7^#j6pkMG#:AE
+%0t`DiIDKrjc]:g_lGHn71uIO1A5'F,bO1_JeF0qRJ!RWNs!g`Rhf7Wr-f/k&*@IGr$'?a!fmJ,'&YpRj`/Y[)7u5l]i98peqhR1Z
+%;cB=Aa1dO0=ZlC<I-_eqe$gh"D)sM.,XE,9hZ/HW\M]Kp+"tWs1lWhb at S&PB"QN$,SnZ-*]\#u"H#Z&r at hq$p'kj]O03-r,p at DP`
+%=mA.GeXh$gUu(_!;Wl`%_s;<FofNC&/K$1EXRD,"o]LL.o">h/T1:JBD'gN.XP$YOi>\b(X\FMFEcom3eW!c at 8\Jl=<ZS#7p!dHL
+%cV[D5;6*VSDNf,Pp7uo&GfPYbS9W)2(ZE<SE5fhkNT"IKcY1I(Cg$_/,*^`oB^F.d`maOpf?T0LjK%O*0/W.qO8nn=hgYSIY&8aa
+%maM1DG+Im,Xl8tkd!7S6]GktL't&8Ir>d9BET.udhV=dqf(.Dgh"$NPa at REC5QCF95Q8-aIf8;FJ,SClIJ^.3TBs=?puZMp)?2;8
+%^\tY1If%mgJ,6F.<]C'9msb-4lL4R4rrS at KrH[N'Fe\n/Q2_A,qR[7l>PZ-Cr/kUkTDROGT+:h;<P8/]=9$nPI9c^`n,()]_7u&)
+%53kuaoFZQ;nE)+Tni/jl5C^U[s,NY-j;Xp:0tMtO\:K-Pf-O`$U#-k$)'3.F5 at a`HQ&)L!Y at B]K'a!nOppX$Y5l[7@,=jX%72ZVS
+%K3u1_ at 9gI.7nT*+n8EQD]F#fAVE?^_Lc><kb]t`VrkuY?S9;uP))G*\coZBe3/3jjme`oi_>f^s`ng6>nc-U^__Fr3m,WCl-D2G)
+%&&i68\E([mkCG!jmGq7QTliNBSB$.6kCIiL(%5[onZh?=c,(Hu7H:;3g#,ZZAU/%Ws1f(h)aa%>H"tQCT(]r/r$a_0e(.Zo-7obO
+%,Kki"hdiL[03qUe=s9Dh4>eHFcZu/gh1!Rh*p>PSPmNC at b#8\Rd`N['Zjdf#FkU>6jf*7/:4)=4:7J\PpDS6hqL4("osAU'46G5?
+%FJ'N\_0ZB at aP.8Xs!LU%]B<l=%)JRAh)]DDokDi0B-eYkT$4"GId+-FdgG%ZjJalMH-QLZkk8MXo/L&g2UrEO96M(uSZ+n4(p]Yd
+%H/$sPH"tQ#Vu7,J*gj9WDTmKNcYDp_qtur at rT]1,rondf[,r0Fr"?0*We"`brl+4=#5ClAl/NnU`:<K'NrJ2%0>p9Y.u,*A1H,PI
+%57j`F8O!GmiDANtg]B(\IdnFQBpJbgc(Co#N;&d_N#DW["(qG;kcRD$[n&5>OR5H>`#>,,"%9>8I8=<gj(8.X?PN*SWPPc&p#Y4J
+%1BgA<U4f;!s*nEAPU:T_SeKGcFf>HFUd!P*n[c70$16G6>u6#VWseL!@ndbG$"k+9+EK&T4M:B%q%9cF$-MrA;Qdjq$+GJfk4IE?
+%l_AT-- at RG[G`<*YLHb#"X"Qh8;',d?5FLIYrBOU8J#(Q>I!rpcC(UV\=M$2 at n%7u`a7dh`Im\Teb5;m'Q0T[VI+>tS"(@RHp1)Yg
+%"C<L-`Jt6ZoSJ+UoCTB_!MYp++Y7iR0;AN0F)\%LWA!,%b=f'_mCL_d-%"<p#?R]"mc\\H4Jm3lZd2Fo7t/Y[SHKs=443Tj[sb.U
+%H!YnTVKp>Ql-g?fTC5]CM^b0GgD(EqXE#DY\sUdXbsi"52RC`\FhR&;gEM:P)/4K4%P=R,mg8Fs8>t5AdriBNqIsqRJ8tWPd&4,D
+%D3'b[q2k88\pfu@^[30Z(a!8 at B0PAHdh,UhJm`97'NZ_H/>_kDV)1[<2cohf-diY).Hsfu.1?0-QND$fCY:R]RSq\.G1H^nEmbh*
+%MjrT;Kb5H2@=N&onbq_HZk3Y at c0>S!@u[CY\D<)g![O;WJ5EE at o6pIP&PI\2I<\\ACt/-e`F+BSQH.KVV<-1pl)6"lcVjsick54.
+%gE&rf.Y[,7dar[A4cp]b16(3t()"JKL#SoZOX:MA-GTHFdCTUr??,2WVpbDWbATp>G(&48(Bs$+S*R7OWAD)0rnRhJpaQd\0O^\m
+%s/+fVK"LsIT3<bK]E#Q[jW](]7kLBUVr(dqF9fQNJ\ZO=bb=i1et8X at ql4aEJ>(/*STUc(8TOO&hnF5:VG'X5)5=%n$QANOolnHs
+%+>c]@?#I`k+7\DR>l]ntr_?a*b5@>&h0&48jM#.NAp=)W3[3X\X,X?&h+GAD?&j#;j<rCqV%QC<?7pm0a5?gir?"9&k4:fh#WdEb
+%Uu,q--eD^n3ecrL>E=581?=$Sl3YS/mcrr,GJ`6Ynu3$F_gc:CIsU:Q"nIQX\BJOh:65F2PJ!eRZ&L0I=Tm+b"\]__kQ[2+UP-=E
+%`Q4gb-ijM`\*>o![:eRQ=1sg6d#Q?0,m-4n3'*=NjP at kS?0An`:Ml+tT#;WkpBbXSE..DSBGl;@o@%XHJ,SW@^])K=hu32fX8`Xe
+%Irb\Hr:JH^r-*Y`2ui-_hd66dq"t)?oiHYCr=Aqu]AN<J3q3$=rmUh\i2qK's)+J+X7k.HJ+NELrTVourmU]%qsT"2SUJlagOK7k
+%++O&,AgIB\s$ur/3()HK:J(U>Qq?eF%Df at G!JlNt"XmMe]^&'3JS`md?L8ZIB4`Irlj*HeDI0s-O3k^9f+Fk[7C2^p9Eq"'55$et
+%(n&rV^OA,YT?V8p$'msL`M^V+PT>ms]@cY>NcG9iW=^mI;)T9t=Pl!-7i"\dBfmEKbal2_1>g(o*,^%"hYVaYr[3M8c7_[TJ/76X
+%mHi4+I<S;RO+tFsK\(pe7q6u??cLK<jcSah/([<)APHL4+C32O5Up?O#?[g3C<G].&Kgl/2Gkk!$KnkQ.6nlTk4s"Bj'Tf7GTD:t
+%?sc/@Ea;"Bp-:;c2C?0i=]aIkA6aA!]6or:;&sif:kkJ]O86A09q3*>r9f'dLS0Q8\]aUO,.p%EKs#YW=&Inrr]#rSfWi(iQ&t4o
+%NpJAt`odCYIrY(>!lQ6TS=Z$js#WCRW at s>$,eg$a=/))s$*[obBeIX\?:`(E1G&pjdu=En+mm`aV[c&o>Mf>IqDa-47&1Di#'"u+
+%6JCZd#]N+OH$hXa5jdTX+9XYEM"U08N_`&nP[j1E'-Y-td<3^m83#`C*Q)@qFhUe)0]iqFpi/D09dHb#m=-!dif-on!X_8NZO2il
+%ntd[B&d(5AW*,.39!\]B]du!S%+C1ERmpZ?rKhLZhF*>'1M%3M/O2!`Q+/AO_JK3SB:*R)@.?;=]_'7PDb$62M<W<8mfu7^&^pam
+%A(-+V!hAad/Ksh<LqRN6;h3>aleC<XLg#D-,9jo0o4 at IY&J9rMFJAg``7Lip7q@&D?c!D#\]+D0s6dpWqVh<%Gl'^TO"lM"jJjl>
+%6^N7*_ at p8t5=%Yak.`7.I-k:3d'fZu"`*_uVJnr';TaGPY'<9U at RiFYoEd:%X[*YdA/9-/E#;9!^]"4_rHiW;1>UmJZVjL$9]/0@
+%.fNq.8.Kr5HY1'C5_JkS5#;7E07JbVH1b6gIJ&NunR_Ui?bZR%YPV[VqX2Dm^\dQd^]4-8g8l;3lqjsN+Qm-(4F$BY=?$r)2Wm5N
+%\W:/:oWs,=a==*U[nSQ%p2Mm[DRbAE9_#\,'D$g[e at n)QhUaA<N/]=P&aB1=e3G]"J\^1DRg,1Q!<TOT#C$=a)18l81kkf1#SB-g
+%,?V&T1[dcZ5CVNV0`VL=ZH%>R#Iu<,KuGFrZ^m6)f@;geEOBbA\.D2k`[CZcm-j3(b'5riNJ;Cho9qDSC$oJj/h\Nd&rJ@<W+J^W
+%k]H4"Djks^n#$kMjTo@^[@ko!41>4K4^s52&#[ab\;`36FZDWm>e&U_]9f:b]d/===+W*n4,=E&"c0>o'*(5QJN+eRDE$r)58[(t
+%(bLK,aAM#N"(EV__[..(Ya<#I_F,!E`J8)gA/Ptfi"00qnFKT5!f4I at D3o_R_Q2`[n/3+b[l]KZL9cBtcBj7`lGM6khWrL2ZaL_H
+%/=J19c<iDgc?,SRUVi=,#<Ns<jX>SGfD<8\nYbh>s8&)';"X3EGoMF9[P]eu<KWJ)(<orN[6MWj^Peb4;0hq0EK`ApX>39J-K<B^
+%,!VHAIukCu:_G%9&]FbK:T9J/.-Z5/#jF,t]W(phH)5pZ5fpm,JDoaH#LpE8YgA@/PGA,q/*rVT=2]hd(-:OqWY$&%Mu#[8):,G<
+%G5],`l_JhH6a!;LEWc*?*kc>VGDcpdD;L$8_P7%2TtBrh209X&iBL?+DF<7I'Y=b"pXn<rf\Q;Sh=oRX=2aO4_Tf?t`*4O2(Dt_M
+%m-]5emX+<gHgL/>a6pYg]t;_-h>[&YJ,*G4emJCCpO?"b("sWJ=3q-5l5+sFnBLDcOL&C3#t87p?%fO..g`<7QEKU^6Z&YMW5A`@
+%DZY&ZQH1N/_0lW5&.2rO8*Z`h5Q're_,L36fWpF2fU+/0Ei!Q?5_]"M)':%O,7]+\5`C,`^&oqg$uPq`SLf$lZDnq_]"A^s:H?qM
+%`>VLUmo#ccLZO%YC'W9aVY[Cp"4=HiE'4.,T.caUFd3?m:2d;+A)R+&]`8EKlgO),%akRi#-:Ht(8u??d[CDc-haOC(X/QQ4uEE<
+%e.E.?l.SWK+M`snY7<`=[h7R9/H`f6Md#84^%[53&I`C[FG/!@#/bJ#oO/=_LE-YifT&54"Org)E-t"GZ8/+P:&%JR/Mrp6HU2ms
+%":O-OL[FQ2*,'+KF$,K*"*?Lj^`aQ>=9N^<i5l`_*j58Obp)!^]S^=GBlS]8.3,+l!#YTj=3ob32fGsu:[M4*^b^UX:BjfaS9fTm
+%n0?>14SEPX>b'.LM6(@V_tCrRb(m\FU,_ph?j/ZA at n/tU8OZPeXV#@ecaoliU/*5c]M-%8&P_,hi*StVn$="UdSZ"n0*`]PKN!7&
+%qRHK038;`3";jDi$o5/dn>J95!$cu3h`fB]dq"sE#f.=05af at 2bTZW'Oni$bQMm/2=SH1:H/3tVl=9kka!(E=D&[En.gXT"Tf#\8
+%d(CiIY)rpVj\*1idon+!l<tL=+':5*0Ie!om05+FO8sZg"pq;=B at Yf>2_boW/u&R+!Agus[kN/To6N3W$=dI'"R$MjFp':DQd.H\
+%+>B%55qM;q:#@H$Jp^.GdCC`V)8eY[_3;8IpF6eA;Zg4*JLe#1-QJ"Q,+[)b$_FSd1VSkQ5OZ-Z&2MTXlCh;dG7GrMBZXZ:%GE[_
+%(kh4#_OtnO[O:RmES[5R/JU6BN&)Upla0*t/\59*mHm3lSXAe:?egslrggKDK)t+VlmU8QAF8U8CRBpP\=b6g^)dN1T+4V'YU9q6
+%V$"7k])-Q_,77ZGE?[7j"`i4Cftp;h.\O%YcN9$;XO>?=Y)pj3Jf<FCoYZg4eDZZA7@)E[(VQ'Oe:S?*J1L2XRmDkhS%[5a6U:D[
+%<qMf:l\5TQ>%KV_[-<0)`*X-f%Vn=lj8LOX(,g+W!ZQQ36up6h6R9.:pI/V]Z#,Dc]?e%[kq=70T:TE7B=PnG)7mX&5ETHp0X%B_
+%@&!J6J[MQlo5PZchQAZ at o5PKBR20u`gp\?%%+RBsLFEgdKNH"HG"'(H_][;lk8LG+fa/NjX%SgHMUS7H,icR+Sok+pE=B':&U)qi
+%7'SqRPYR^l+)j85oXQHsaY!^-?0:(*4ZMo^f.c5 at buf1>OGk2#\j3R0jD at Nq:IK9[I_/3Vr7N7I"e=B-mgdaSMgT5/[X35PkL9-#
+%9O^YT[tK*$j^5u`%>((?T?`%+]fe6qY3ZHNr+8!MRD6^W*?2VV6QXDGkVl[?Q/q&je\TI^^+1X%$ur<^Unk[#8PBY,!*E"02i=t@
+%'j.Sgff*HW):_'8*Nb at iS[Y$%iO&RU`N(aq+LI;-^EkbKqs1,-'dm9Xg]de:C3!seH%EhMWUZ9lT4n.joT(l`,1%+U0&bn-M7;]_
+%>NJL>ZJE.A5&[meE4%8&fs-tT;u-i$^0I"*"/10rNFLUk(q:t0e)?E<:'W?ZFiBkCrm(37ap@^BDfkf(UsL@&.$4)"*TZR>G;\4D
+%VXIFKB-4o"hHtt8e=[m!Wt$$_1Nf7(1s[E2NLl`f8Sp(']1VO4Y)#WqkqE3La'18'2Y-liGUN8 at W'-5=YR[_i5SX<k:oIN&hGPLo
+%-DU"h=RbpZJ#2pj_;@Wlo<8Ppp%(IU%H.f$r-^/,jc+lAGM844:1'V&\CqgO\qga5Ka?)t;&0:LB,8om at Oj[IF`bMg*#lsa=(a'Z
+%])L&3P0kbC.8?39 at 90">A[CIk^hah`iiWE:ftQM<M2?n\T$997Et)=nE4(Pq%tY8\D6f8d?2Ie;U./V+]_g_[,o)6[iJYi+m5_Sc
+%K0@[mQ^CSK69]or^jRa3\E'5a:Dc:n-mj:j*+%QgAA#h8/=bT*lX6)tE0NBQSO7"iEC_/:ik5XKB7b9[LdBe(<,bVe\$U9NKhiD0
+%h2">1 at C<%V=sDHgoZ5<-+O(@HSblD&meL[":U)n%bB[^ub>LN);P'u#rj9n9[\V)j%RNn[D9rB:cXq^iYm;mUVpNt:k[$RErb)sf
+%+%gG!iZ>-Q#g6%&iW-,b9S.i*fYTe%%e@[Ih+hoF]:B"()2\WsJndO/FhSa[#-fr\_O.\nVgB^9+:hfY9=9G'G:@^X>&p5)0,?Rg
+%_crNUK<FW_*;\O-^DIZ1L1`9)'YiR5Ca=nDlh20'QE2DT-o96/0BN(1\l%(ZYhJ&e2+1^jDq!ad8Tt_UQm=p^ioKZh2_t>q:QW=l
+%.2S$rn;21.TXq1gF9uo[?0:!gk^EuGH/7qmTj=R=3dJ-RRVp^U_Ck46FL1E`$ooPmn[e.Yi`kmI-!0uh/\cAaDk4<mne_o+c51kO
+%*,ch>k"KSGE0%%=]RIO010,Z`5kTDbeY,lt#\Ad/FcnnA`oTl=+pm@)i;FKo1ffOkl0tU7O:FFLp=/T66SJN,kKTLA+p.-e9,NMY
+%O(-WL`m:j":8`+Fdp^@l at bSDB?fdb]=6&n//F[-8QM8g.m'\KWEN5H*c"[D<+7h(qAn"uYHac8<[9O766nSl*In;I`8Yh;f.ASiW
+%jJGh2+Ch_>^lG4]UD@<M6?'D-DaQ02Ok(N^^.>GO`-of5c9,US9+:f:OaVF'FpI5rd3WV"_$Cs=a,4,9I3u.Gi63IU at ohM^g;X-;
+%nNr at KbpfrsM+;am+_;Gom[8U%lkX@`VP1UU@@tILXjL![;+90EM".$`!6-3Jh at pR\@86!A`peSU<_=6T3btr,@\ZaY;MmlsQ(.Q3
+%H#C/RnQ<&J$G^-d7H@`)qT)/;;5?%.EKV.f'+:)Dp9BUH!df0fjUF5+2oMW05gX5S8Foi5a;P1n!h at hlZ#+1-'4GQ)[VjK=q`1!,
+%rObHm/`mtU[Z>7Z7)=;*IBa,jk]i"J6LB]Ye#,^W]6%LhKLf'1Y`A.i,`6&[Z3%PfA]ebC1ZrHPa4Vsg6EWhaOTs$"17FR[iDUs\
+%Xm.(!!ne%u)GJL^d6/N/EUpD,jF]GOaZ(OH>fY29]XdhXkTRajJ`KU-=1t-hU8EI$"=$Ob&;t,S^.P+ZIH_Y-BKg1GJG[=BDTlu'
+%:Rf&;qFkmOgUP.<K]7]!`dQq./k0jtQoF&U$0']nqjh4!:H1&epD/nb.(@+??[^S4'(m06q9G9n?".GNhRDU0-]Yd0l3['kKOIM?
+%/s)PSC"a3)mErIhc?:T+I!e^o3_9ofB"_jC3uQsX+9(4dP:@IMn,Xd&++F.L*-_FgGl1K*r]V%Rm/ul/>OA)_11=-R:`U$o#QfK\
+%i=8I$e0uGg!uas6:d0Qm?iAG7<e.ac<Se03"+jQ]R#_:X\Y&sT)KY%QPXej0I:8V[qA+Z)N\6NU=u:_OH[GAKe*fL#h/@c>*S`bY
+%R=R:n$iub=2=S at g#^p4KBT4UeKKLTad/5\_6+@^L:(skT7H',A%'?gdfXH</mplDd?i&2Ib7uZ;>;cimj5Z"R%'ThT-R:A$a\(Z>
+%0K]QX5TCINC2$lMjN at shN0%6N at g;mVZ-ALD4q(Y$'js9;#JQ+ED1T?8 at g&5RW2bX).29KT*3h1/o,>_5S"go)b_uJ_]@uFEphPbF
+%FmNj^RFeF=V=$sa3m5afT))]:k*QNrV^"Hm&)H#5igY#Y4 at 3+P_UWN2GAmM@Ki'Zl-s_pqm!+eM1"s`c0M-li(\1lLfReLoU"]qn
+%FV]I)Uk0$0(V]^RFY;V)Iff5'07jToh@#])JWfedX7M0V8>cb28sA`.pP-o]#-*65RH.k68"AK:k'P\TE]B5-lXtbj\M1ENlJZtG
+%29YN*Z=fLg&kfVd$&Do*G"'JP5C`h-79244!BL<m*/;*r^(oGFFFH<*At[b>!F!*E9s&Fk>fnm-n-liU-_knjVHUp%"3qdT_%FX,
+%e3['Ae7XmRJV-oq_#@E,>0a6UD3t"A2t/#GL4Q(`HUS=-KET4Eo4IlS!;5B#PFI-Lnu,-MI"ct"If^UDm1Da<E,R$Q5u=P6W#Q^l
+%?:&L,&7=mOPW,KT?&G[TNIX<D(3ifsn72q.`#&`Q.4ddL.O'^0.YfVs%>AiCjp5T-)'"JJq at jh"pP0=ogQ(J'%Ee1&n5'g[.i"nT
+%'-_80H8+lA[bpf at RnS\ScHlZSpoNDnNn4heSLXGC$!<]2@')PAjW,B04o9NXH at hpSWl+\6h#uU2$R&5+$)9+n:c"H"+jjemEBY(P
+%]^c=.`ZQ5?Z5Nk].Mqa8[(__9>\):C_(83_,A0K-g("bHg,45H4]H8t!mnM4V?\R8!)YJM2'O45VX,0:7gLB!:liOcSdn5deqnM/
+%H,U[G07KsQ[hQ`2FSDL[,'1ab&6F,"ZtP75!p<[]K'CL1#P!qUF]4^W,7E*@q^Om9#u$1<J4=Qf?in*CdII at QKks4T3BbKpCjIlO
+%-HWQ33ClgMedT/(4CN at G!lnCilp)X\3]Jn:(FquR$lE1Z_9ES_L%*+?cAdIL/AuSMP3QAE#C1+%$Y`55.\oEh437D8+ol_==B$Vt
+%K40ZA!to)dJ#Fc\k!e_m+*c0XPfUG"!Fg*+8/qcN*+sTP6)4j<[0klp^5`f258^PY'-]mcF4[1KdY-:b'#N[$ck1f!0tD%<9_i",
+%+T6/V6j>Pn#[oh"RK]Y.`F)d/hX$bei%SgaPh>8G\jhO&jG4Y?'@rVFHRT,rJH$odTFIJrrIF$`^p/7fWG/HDZBED+Ag'1uhr+SK
+%<&RTO,g#n-IhZTL-72St-P=lQl#JA#oB$;!6\pXKioBt+Shjr;Jh!IZE@^(;'6+E[VUuPiETl7WS`68h@;`aQlNH)B$PNbk_BsTV
+%*WUKh-[Y/",D&k\^d8]1 at 7MNDK?1"Jl\+9_="j#loC%;E1Eq/Ln&+q;c?:`FGSIYC?.A$Z#Hl5:l-SHg<HUfWDu7D\rhLG]0TAgV
+%d'q=.B;5K38H9$R?K(i3XR!_^V!JQfV+j<GNA6Mhk;]KIlGg\VNCGua7#aTUM,u79aj!E/PiWI\@JT+TYtE,35nC_L>-oW4HkHf_
+%%)++2+WRp9TKF^2TJ_jM<b84/_EEhi9`2T3<F#f:kGeis6>He5ZRaoQNrq,J1oiEmFXYKG#[VTYl;\1W at n[:nSB*Tc#m:Ai2pimk
+%-BY3N0G'*q"c>>@&*is\GCi0+kHFQfna[_R.I1e>rsl-[6`c0Hm_LYWLC"+adT+>l+fQ'9!^?^A=q*,Z$k2JpZm\(4>jMGT<"iu&
+%?3[M:SJo^-c)N9b+n;TGdftCs/8$(`:;F]VRU^qLPl,h_<p0gokf="neeorIaf2:VDTl@,N:(MY%-f1u`3@##!4&&`LK+BCN3]t]
+%#\f6Z<0.n9_]78PBC3bA7%Z?!c),[=%e'9B$;YYu?e8;M,U^2.!QJ),<&i)oMM9U0+_P<s=dc`(P1QG\>[5<8_,=*7`4U[p7S$Q"
+%qp81KU9dlch[qt6R]?ju.`920o_?5,'+(+Z?f=NaQIJp!aM<G[L*]5N5O at i+F?!e6ZTkORPsgpSH55Y<3Wb&ldPh82j_r?-D4l,U
+%J05#k-2.`tLDmPm=D(Y&)&`5#.*L^D3 at Pq\`>BM8!/pa,."Q'Q0V0XQP"9Bl(k[uQJGUZU39nc!*[9R0<Z!gg=&99HJ=;,[':s';
+%#R9":0rPDSc@`J]aljLN@\@MRO=3!oJVOn&f at 7#.Gm9*Q()#:8+hX at UbQD#7#ag5akn]0I(^P[@@]!02*RK3nLa+Sn!pWOTO at kHV
+%.M]lMoYGiQ(33q5QN6hqE at V`J(Oq.D'L<X('dO;@2V$cE!FpluhM(i&B at en'd<IcRHm<#4F%]q.!FI7pfu'f6'lGV'.f1^^[uE[V
+%Im-LKD_C4STD2R)_D49Z&n]gj0O>im^Cet#U:oo.*;hr)EBuKcUERZ!JTNhqD\Oc6<C0t;VtT/'rGqsL$4"9?_PLQ7PKAF,aZd"'
+%%R$LP<eJIollIH\QFoBqd+D^EN^j:C71X":5<gL1M/T-P at 25rk!cMg'7ZP=#/2jqAP7X+`TN7c_XUsA`FJg0Len;r;dq>rlQ!3`o
+%1UFPKN^,d2'U9_M/,aSAP]mokKX_>fi=M$I35I;cU-XikC4t]]^[hljI!_Uqk<N.ip-N;1P4)gh-eo[EkXDq?C5RXbVSZpGDiriA
+%=;Lt2_9;.l:-.`(LS'-f%4[6'j0ND];6=iZ&0FmcdN'C.K:?l;)Wb-Z;D2cO1t*5i$6%$V7R44!G<3NS9`s?@]T:-oBg8%"F)WCr
+%7eaniN-+:?U)S_U?Pj'Mc\q]7YFPfJQ$,uB4;sOqDmele7s3Qcd'r)K8&GrH[SA#lMpbT+L0Y;RCqE%>n/<,URMc)OCP&nhd"+1`
+%9An%';F*,RBaZ7H7c;Wn<1#Gu)qjoip2aid=\!$V/e=&_q$r>;6t5Ok=4L0eqE'qF(!?aj7Wc:CYr/3U8iZqGVVj?'9h')r`ebtp
+%mtCHrQ7B]J_]tuC6O#M:'GJ>;*u:1*+n\]m6AjpqR)B&0f[s at Nm#.\i-<0q:O/hX)3'L_`ELsNlHG6Dj(R(pO*l+fD#9=qfE.B8W
+%?.pH($&3#6]7U'ubF[<QF>];UFC9+0Hd^aW&]Dj#De!!?+gsi.Wm)E_8Rb(VDYGRK+f?hS<\q5/L at Ya4&<%^pA`nUpWQ'=(eShT%
+%m86:pQ;EUqJ/F4+2j7U_"&fkke<)Gl*"Har.lj*cn+7/A6ATmuDH9?0Ybf&S<((tILQ2pti8g"l#]*>]>3t-<BLAPVD;HP9RR'kX
+%b`cea'2p2U3+ZrKR-7@??]eA*5_EMjU, at g$W<8:WY[4!"L$!JbY_YaqOo?bLI`T"G]W-dZ9_nV!f)Ra*0)e?ahM4.iQ-<ujVig=M
+%0ET`9,Z>Z?_]@boIfSE[#ltjMWI\>C9gWABC[kSueJM)3-f!j'6MEIfoeNa3#,:KP7rT)Y-$JMgc2L806dqJX8A*Dr^3K0G2RZrn
+%'-*-?ZBNptkNq/_)/'-]`BrU$fttWm:KuEHk$ge72C-LSq"u,*)!3,,CHP-&"#1RMhi at WcF)P!Q71M`h&)ba=R3M"+E]oY68(P*Y
+%.r$"O5rh1t'8`a$AE%FE7+3:Mjq/jdg^[/Rd'c!Kafa2Eob"%FA8S82#d_NQ%A-FsB'7,Ccj#UA.W5DcUR=pneId\DS</EN)K`Y*
+%E\)9F`WL&dgG"3t]KKC&lZ#`ccDicZ)?Do]1SSZh.?5rsClU'c&_Nlu7JR/GY]WN>&]9l)9=^/eW^M[)-*_Ts^T2(Q`/p0D\>X88
+%AU5?(WTba-*o1h7'cl at d-7*F;8"l\X4U1ri*0;gK/eJY2>Zi?/G3B3<K6O&+-31^d@$0f6!#3%3,XSFSYZ:rWHW4&bn!/+toV9iF
+%S&PbKeVk!_7H<lnh-Tk/#LP4tgk<EE>`?.Sm&?&O58'mpj\#bOLQ!m at K9dg"/5fH%Ss4[jAR#f&*sI+LqkOOra^jaJ8X<o&VKJVJ
+%YZCW2`t2)p!ZL=ZZADr\rfG619F'BI65WI"I2Bf_e=`1_g;9j`@W5tra/les-@:2*)'P#WFraVhfNH2,hLRsmmc_ZRAVkmV_'Lca
+%Y=_+mg,'54-A)+g2W%aa9TfEX3EkCJ^p at ud5Jh['6bSkjd?a?J@@3ZqU10"?<"MMH>+Ol:CikERlPX5c*Pe\b]imQMN[TH6H\<Ra
+%d66=\AHHeo,iRZ&b-2gE$pH15d$Sh&Z5s0%W!i`VZZ'K*LCcQQR?tcj'4l<WhtZ?k`2,kXSfX?"F>.Dp36$O_V/@:)(9(.?!P:24
+%A7p,pJYjdU9iB*ui*mtUS![UfPtk3*k3#%AY8W*bRBQ\`C2]cT2un-)*T^!uB+U'LM<ZerOnUSqA5Wko[brC/WB,PaA at -<`_H82C
+%XQ#`<;ZRDq-kQRSWWmg'_9Ju$FqpDF=M0`q&ZH6/>R(^514\(!\8&fVNV<]Y4FLN["T4?2.Wt#e8\rk"2c??L)A@>uW94c3=j/=$
+%L\5gJ at Hj&OrFcZ]/&qoI8<KT8M)53+_nf^Db8_eiatgOXZ%i<$&eB?P45#4GlKY[QKJ_l5M- at l9bl]rcM.8I]!(YBb;J?,k&14T3
+%m0q<U_F\E"J.X'<F3$fV'L"[]/_*/_-kS3p6i_b/<S/_f'``:Q#-kc(#Ycn&.>>VtO&(u1cn:E'6?aJ_J?1qo7bVKt5V+bkK"Q.)
+%<*(s"MEF/B?mL%>2N:6S[-^`PSdS\D=OBA?cJRkaMi#P?e at kqPK11, at B8CNVjg2[l9<(@%Q/j]l"][p/c1o\WfIm7V]"-'<Wuaq\
+%,5lf0XFc"u-=I'aL_2Tcm'5dD."7t\%[f]79Jf8-*Uoq*ACTV>-93.^Vd,3.:EugN:BB6iViU+`BC\L\&cEr>^AL:m[T./F"Dla?
+%&JpoBc9]>\d<H-d8);jc'N*$mmu5D>AhtLEX0g+4,Td3HKH.8]UO#,9KN*LV_XB50ZdQj$rjJJh(5Y-b:t.>1+n,aI%LWqu'T;4.
+%%q1qJ at h\=B6rl_`ETS:EjBSTY$]`MJJLW/o`H0.P%MZ*((LaiflkPFJ,21ot5s5BWNbni.3I-EMF=>M#;DhI<a"1]cBiT_?5s0_J
+%`X'-`REPa5PJA,L^^R;2L.hnG30ur'3Aq'!bstp`gh!m767mqfPS]R76e/%b`AJX5%96DlLidr#LiZB6Z5(cbd)Ig8P$.rA2tBgk
+%XsU5-Ah40<OI0]@;m.5[nh4R-6ePH\2Cha"*X+*g1IaT)VAu/n#2JGRIp,OUR=4T:Oa+qQih6Gt7Yd6_687 at -ofAL32oM[cJZ!![
+%"H!V^Q9oCVal3o_,fM4n1.3S[KKtd>Gog?!.dU]^q)TgbI[Ddq(/i\a2uj`akf=ftW+9CDNLV2-*I#6]GE/=,e2_]8eshS<=Y2au
+%8CqL.ZQgtm#RYHl'%;T^b)?.hQ#B)_gr3\^<]6sWE1XsOJ)uORIMT/4;`\#oD at umh`rlH_GkZ&hE00p]@Re$iBK.IL#<Ssc[_'&L
+%%&u6D4]eBM=BJr^^O/dEi*1(7otlaC":5j?"Zh9;itbs--Na*5lZqeR6J"[Aqi7fkQVh<ic(fg0!CtH0\0'gl9c)=^_b)+pC5]uG
+%ih8ka!5d8/i>`S7#+uVUQM_St at GcBR6W@pX;l6/;TduWn9C[Xq$J#?^dYKK!+BS=TcH=DIDa!bM6:h5.em'98B%_2jKSnI!)Bk3!
+%!^_rE'k9aa+i6YM!cPrN5Y(/uf2TO\2Ojk-AA+4-_i/-?cuJ at oU@;b8faV)>'rHYtPo(oLUJfMoQUkGH48EKFBS1&K>l?Mujafc(
+%YVN_0EaFqt+4S5@>o*5cQP#kc8;\<h"YIT[GrQ*B at Il_!Hr5fA+Rpt-l3g@&QrHS+11b8h:#`;@s,<g^k3F:J5`*cpUfY<JL%:TN
+%9cYOi*e9E%dr2CbQGokl,=&K?IPOq1Ps+/bk7P?ua0N;t=?67+?>BfRJ at j#M+_I.b!%3cHJo\n:72'L\>,jjTfMKg`1/B)!''$YQ
+%9,CWV/>A*d*6/'Ckar(3%2q)K/WrCcTC9t>-kIi:'WW[OZmICs4.5Sqg('c<A5X-co-+D0r%fPDH&TQVJe2L<"ATSAES3tcbj<9Q
+%_G2idMHqOV1"R!I;6WJWKDsDV=qSHsFsKM at p8VQo!:LP``!rs_%X$Pq6ciZ+2d%_ at lm$c#7SOK3ASA]HQ!HiCok0M<aL7cCTF:H:
+%`jA/.iq$X-W"dM`2\m-`0j8hG5W.32Au%D\/cr:Kr`5&;jG6_TTq?4"HQ7l at fHim1&2q=WC)0+Qbb651<Np0'_.p46q$UjJ<!4d_
+%J;slI at ru3=jWkJ.4i.K]B5sLbcg&?&(q at cE/"&+O,RdhEW3719#_g at 1W<-hmC*O/7jRZg0"p:>q6BEss_+%p#DZ:R4E'h=HlJ0H@
+%F'=;t%,uitX8$sYoL\LCD[aon!ui?RE0u_XoJ,nB8"YhjKBu9%?rC=Rk73&`-`2Cb#d-t:Lp]0gR=f%I%tuodZ38]<O:Vf2Mp7u9
+%R4ieh('D4;_Q^seS<n[mW.H,2rTROQkQNSdTEC*Q-jbZpDJ`6ViD)TIqM'78W.0bt8007HA[Q35):g08&>Epo5*"RA&Rl#RY at 0\q
+%HG6ee_V_kR/HD8nXW,m(LKl*e"A&^5DWXZWWJE6R)dkWlPFdq+7qPurA0$3H<U2fG`;jj"+"@qJZ8O.grC+qp\6qXo&t>UWYY!gt
+%l<?;7?Uj#I?>Js<Z7eZu"A2)8.!GdJ.G;e4T_(35Q?]J\-GHLW/9)21'j_A;K#"ErnNh7f;1(N[;/"aMi;,`?0cD0G1I+rbNMD/S
+%]:LgC(u=k$EeY/9X at 4KnI1*h^CNG;A$4aaN""6r(!(R\C,&>^\4G>8Yf-VeX-.FYC<R3Pd,A9=L^qJ>F,Kf*Kb3-1NQ[D,],N1)L
+%PFiBJ9Y"?&8tqP!iuKISN0<dB)H`]%,/QP?cABb<VK3RXQ'4b&*Y!79_ at _fj`_W01cs0&:[rbcBiDE,ER4/o=Xp6`PJH2&a>&]3U
+%!]@E/\<<eLTd4E[9lq)47Cnt!J.g0,0E=c"!(R:s/>Y]HS1&iN#0deAX>tO at 6:Wl8=B#?4=ir22j at nR`'">`[,F!ro780LiW/[1p
+%n:+!(UtV>0>ZqR>mT%^Y8!N$)?3b%=/lXVY;iMcSm#D44b4sYG7+!J>\a.%>;$qq0Fh%(;i`K3k=WC"BnHPse at ZNCl#=L]!e<WO^
+%#MEjZh&fPUZF]!4*GW^Wqd>IK![VT_3Yh-F]9`dh/aip"T%A5[S4)e'>-`lY%>_Mk%V\WhNou=Ap,"piT^@W&7$/6=?CJB)/J&-'
+%^;OK$MPI0Zl at HluRRbn<M?N2Y`Y$^RKR3oh]HZR\,&/&#*ie8D3T3)*d*K:@,+8\3O<[Smqj>m8",Nd(:^f/]0uK7<gK6/UPc)^s
+%;WG*ViJNbg=S"!HE=P9i6??[$WHC`t;)JLZaj^BWE7M+m?#$&87Sqj*njM\&iP\s(4c)Gb(YmsLG6!@Ad=*<a!8o%0%IGf7.K-b+
+%FH&6f]rN2d%[CrR_1ePa+&V)&7`e-&K"@>ETke$I'h,].6]2A<Xt+j9TfT"WON5]sTp5=#0/j_%ejci8q1=tcW`Kon26hMPQDV,L
+%AT]OZ`A6C;CN!>"S7iqnjb.0hVuStAZiTW)M/Yg2l3u5i%Bs??an^WT_^@$W*1rIKWd?a]+IWZ:BbR=97gi)d<18>m<PH9EN];e:
+%MFn0:FJ"ogD,$3s&Y/[XB=.`NTJio!^"4Ru-O^D:`g\$/V6?ge-$<s9e5>la#]Q3KS(h;.#u/[^HNE";KLR,q=#4J.Sna5bh2LsV
+%gJNL/M*i;"(c9Y"WC@;JdFe(>E/Dl";M>O*&#CJigX;l>Ofq+,7M2q0\E5$Qn_ASOjj#U?)M+E-#=-D&9-g=jaV55m.lS6NTPQQf
+%/R:IidZBq%c"Q4Z4JHR8'sjQ/bG3c:Q#HR9>:JWZYa(A%B4 at dY,\GIaK!1jQ%\m#Jqq7a[R>E4N;VtsFmh'0VEW6d>OX4<i:#\FB
+%32_oWenKPfW%oIq4_s7*7mkh8-kUSkqT4h>.!%rPE+ at fnNDY614"03W-#t5,!A=G17m5;bifUM=Kc'#6NY)W1CPF(c2oVX.C7*6j
+%2?:o,MNa%-+/f`QK3 at ndYlgUdh*p'Y$Ru9KM:Ko*-WYk/\UXt&FJd&M#%d_>Yoa_S!LP,Z-SZH*Xih9/>o*s*1?C,3_Vu,A2NebB
+%@"g[B/0&4^i,+*GaS)(fJmA81^;9,t658!.&A::@GC(%6jDcHQ<l0H&.Mu5_V#APi#o]+h4/!ll'Flb!fZk"iT)-&Uj4p^h+@?^&
+%;g^'?<+Cb_rrTH)UTZ?mFC=R9m4CmoGQ>*#NMK3T<BssoNiXQ*"A5$"THU-75LdX=aB8PiHS&An).rXj%ID#88tFV5E$BXn7qi2V
+%0L_FO*X9eYo?o&jNI,-d8G3t]+!p4\qZe,#g.>K6!oRQ3`Q>e at 3IVh+7\N<PF$Y:@*A9jIJ<Y?(m?!X)6g>H=?OisK;0J,NM%ii$
+%>dW><Kb4Non4p92!'U`lTd>ODpBWC:m#ml5d'?^l-58g>_Q-'jc'\X)BE1=:#iSTSWHp at N(94?MO+VaG>dlH9h\`<SdP)m5TV at VW
+%j4_VQ;ARQrI>3L$Lqj*lid4)c7b83M<oo%&auYbSWs_5#(m2,LonW&tBV$ZgeThn:V/L?QbEdE676Ega,hL[%H*A>l]P31Z\1]t6
+%.5Al3(%(r-5`RW\M'?jiPsNZJ6X1_1$OkNeE0A=r;7Va659!.g<5F3IDgZ#gR\c]+'DjAFFW6X/Q-!?G(3]=^@BT\'.Q]Hr=2CA_
+%m3YDd7:;;-fr9#'g4%g]0- at QlF?2pJQ)<ZD:(tI,,g7M&E$Fq93Y/G?2hnDE!IBP<@B@:&D:F$Ud]k*s%&\.j(D.0SY(qq*lK/(?
+%WkUqNDcFoas$mFmjT.h.Jn28YW.<tt%&S>3\Chl$OYd?P,dfErl^.Zs;)t)YKi!>YWG<[f5d))(<u\u7!'b3]9B,bN"XbQ_$4bd+
+%H'ETmjes)Nae=VhN/LEN8V;Da/[DO5ZYM\mb8ug]$=Y9h at R.=9V&9'^SNO/),;.^mUVoo=%M=KE/=Q4ZM8K9A[n:s>PkH7#m#.eS
+%*aX3RAVh!RS.3WsE%Y"N1/^)`PGj]sMpjooPj(*6bh#3toL>i^!'m_rmV0&'p-qmrV0)d`Ed*[M+Vg!qO`?a=LKCiTaLN/U1=9:i
+%ASaq+gSeRrjY99$g8H>`_hp!PfWP\BOskM,lhcGJDkJB070J$AcpPEPk4s)c_R]8tI_/Q_ag,m.,fSYdVDN3dbFFk89N[i`8X[(Y
+%T]ZJ]O+D,P[%#.Io`Qk!JI`pV9H9`&2&B7cC at J;L*^A>6rmT*J<9&J/7SA3tZfJ9,rY^1P\h/'@F5LmB68u'OT.8h1mm/e'`rW2s
+%oTD`AkS at hQVHunP2<_RBRO3X#Ig5Nun++UCT_V^>qWc]Jfh(BZQt'"fN_o>nMd:p>CU%VuG+cDlVSu":?-;IH\Wp&o+hD\<@U8*U
+%QCOg#V'n65B\^[D$N)stTu?WJ5Dd4I]QU0o at ak`aVB$o"m0%-`Bj*G^4:jNXd4d+XR6iMWm&c\oqni0?a]jW]i,^8]m/&F)E2`)S
+%UGGSfl1:X!H<l;-Y`I6`\_is47^BMO['i?.*.:R^U6Z=\M=%eXC*+%!/G2f9arK*N"M/hgdneAoXj(t"68K58aCeOq+,;<)?oXJV
+%KDfH_7Fm(1@(#/tcJ3a1PIO8q3"Dl_OBb at McQ#T84\ts>3I,]%^U[/!fKZ]WA,icU+ at hj&bPpaARX._9CA\$"n]'aS7KK%t.8_CP
+%apq6^T2$-&abWq:m6j4_3iX8;g5rSl'PM'3640CM$jnF[>.3oDN,f1-pdqFe,M9MOC]\9\gsK!N)H=35*^mq.h#c8"BS"&RVm58Z
+%&biqOEeIcJ;Y,i`\cj%sgu7`?iRR_-ClKKho02SdI.sJ(Q=[g]lXFf+!;GW_$0Er/NnsDf^5 at q"SdCi6+le_3![hA!><#U4VQ/C$
+%d[WI)%\)hn4i#,i"m(l;k%,hJoDlCg0-dN(!+U.2"[R83Y01a$N_s`gj'7O!i2jujHoBRK+6R;W34fa"<KlNo9rmFJ=k>erdtK at S
+%3Dl8-Tf1*F4NbI/IGF8cmR&Y0b0.lQV\^oWF+j$58:E7;@d+>nE+e,$DCu6M^aMI.b!;UYDKO/8!9JJc_81%^G&ksGF!eXN`,6];
+%.U3Ko?E7m0YRI&530#BsrY/,ARLb2LNmgLJ(!/Y19-r9S1V>m;-d$BU""Yt''P"HYgC;nckbV;4YMZqBV_):KEnUU_G'4"'9?gd1
+%YsJ".X*i$"p\cZ&3CWj4OkV!1cnGsGe$3fB7FE,#s7"AHC%I&'VXdGP)$X+HWFu<7*PB<Q:`4[0!\\QlVs3&d%B2H1ZHj=&`Pcbt
+%1YPTPrQNO<]91[Y5JOgoI\-)cf?c1,VkVJW at +o@aX;@(tSjSOQ<&FfgKQS?kXoMj-kPro9V)Z%01 at UKTWROZu2\2s;<u.!(a;7r.
+%Nfe<j1!<+Xi")N/-n&*2:",:13??g4qu"]_?U;D$kN)5gL"-@^b\55VWSc*Ns)C?Y at -pp-a#Jf;Ar3fR*S5GNGHW83LP-p&aZ.f(
+%QA=kFPfap$?I[H37Z,,D at H.EG@-*3;-tQm/)$',#07Wm,!cZ0Nca&r0CGgccZt\Y.K)&?t#<IA/86.\poqU.p,TtuY"O$eG>WPt'
+%:>tWN/t`&6"FqmIU5$<aZuckC5rN4t]D/+je6hM)(Hm$VdEmp_3[W$V_4a2eL_utn$Q6\+<=gAi')<<fP)[\N*LO3B!0"]>e2nts
+%qCZNi,&%j&2)R?K;[$;p.#c#_fpEDA0r>d$OBLRO/?5Mr:"p("ST*c6iY6)E`c7Z6"[6cfI'Esr]);^.2!@[-o?GDC!cs1[DVMlp
+%f/Tn^0KQ at p\lnq%2Q:n7YsmsOSa;Y(qrZH\2fG at oiGG]F-e%"nA;D1O1)Uu]f]('Y[pICqM[GEIR4roGPiK\B3:7%53>JrF6#a9"
+%S=2DR+Sg.ZM#jpb75Mj+8`I6^dZ00qR!_PX5()33Q0S1 at lDERo+\^^d.7Za#.%QC)UgS)Jk="!X4]D^">M)e#gEOCA*)Sl8f_,VS
+%Y$h-S'Yb]U!en/jdF,7 at Lk`*$;pX4f<>s8!76c\b\*B8uH#M=_%^5(]agJghW=U+:dN`?bZV(lc8^X at OPLObGO6rSQr'fM;&!_Rk
+%0rRV2OSJjS%Hjae'-Ju>4[G7]L%'J#&WFMV8b'U#Y2V+:8g#Cda%Qp>I/S>^fV,[TL]q20MK\X\'!9qeeVb\t9<YghrPSmulsZ$B
+%c=jsS*uBsck1"7/kOpJ,lGJrDqor/HgpZeaD_^402X6Z7,QL!>B5q?5=Bq"UFs>+f0a\`aHji4iY+>phSn.9qb=*nfUK;*fVXF$:
+%I-N^S+6MCY^ITNVjCCc*[T)NlP,QA5UPH&l'+u+6luuFoAI_$0#GriGV(9@)8b&>/jn-t,*eVZb%Q8;^+A3n]no)=4PVeVk;nirh
+%)Yqrf+]Fo4rgDfE;kb1E,XlYi2ZOo"/."giV[&,eeYlNd"Y-K\>eCJNV<%3ZkZ<b,^]R>6?F<Wu!t()K[dfs?rN#;9-V(H0in:BF
+%F$H:&e\d)(Dm"t]B2$t;bk=CWXic+kSlk?ca*Zhbhn%4M_Jnmq;fq;YjBiAJ*&@r1<\?%m22Noi6:jT3+SlB;IoVYhpA[\=dZK%o
+%LR++SN%9ZO]`Bekof*bERn_FfFQFoW$#mFpdA!]L3CKaNUM]RU+3FbHhn3VW]&@'n:&SnG/Y(Oj at h0[P1$hlegjJhF$1N%M$]UhU
+%K:MipoS6lqrFde<DVS<MR\qfE!tXb(lk]*- at dc6f]7m0]<]jJ.&ekl%d0n\_LOD_32LJsUBX*C(R'C$e''s*<:&t\L/E#&a[7H3J
+%4/CV?-jaW9Ie-^,MDK>-ZEZ43]9AGl*8!c4mgf)X$LB1\QF^nsckc@/*L-Mb3h=%7NhjXm]&C^Lf"GYd^\V=^gOAmC,sQ'9;[tAU
+%/7t'@iLM=R%%J!+\dW5r@)G,16EGE2$QS'WpBH=7'e_R@):ARYP1X>(-:3/Ydbnd'-P, at +=:EC73`s2(Teh<*Y?/#-!XTI\2bFO<
+%4>L_F'Q5l'@ohiWCD9$[6rPP&bD\c26Rj8hE&5mHBPO/M27]4W2Ws3^Fg&44*9:$1LHDX8/*54gol<3f<fk4$Gm[dg(4n/Z248aH
+%7?5aYUeS^(\6''a^J%0'&LpcO,tGRq=Za\jo59lQ+b59B+OH+:AcQP(HIJ1p0]?Ms=jTV7+BN(uI&EHJ%%uZd)ZTHK?fe-$bTXne
+%q9I:fY>H&]E4,'!-'KKBl)t1SY#(]mVn<]AQ&<OkDH<LRBO!^03/sHm(b7&(:,D;.If5f124N2.d^VnSp-;9Ibe(91o%1,A1SQ9%
+%DR!r7Il"6B<7J4VqOuY<fP]=:6_ at JGc2*tH>N[p5ND=>3%^m`sGJ%7YT,*T5.-RHIiap)Z)KIX?;1q?"6e_3)<ZdRIjC0%V-_A[\
+%'=?)Q\jP]qqVPSGn)IL6)G0M"b!?4-5)TnK*PNT=*(.83;?-k_P[\,_Uuo5Mb9(2C=Ona2QH-WdJc-+%1_V!<c+\O%e]uYB)ZT<G
+%]g'2!UJj'Lg<KTgSJioci/1!<SagHQJ>X:"ejE\&=0Y`kpS4="WKu\F/j9;'QGe0K&\HHrFoK2(]PRS_j'%A\%H at i&+j.IfU.LQP
+%'iX at c<gd'eq_`iao/kGV[[GKcila:G[kC:UhnC.mh'"g"\@W-TrMoH!JLa]F!A'D/Qpr&)_46h#6"?fNpaoLgW3QkPrd<(HG'k%l
+%b`^rL=C-^@4^8cTBi7s4dNKY_c_KsUH-VIX',5J5MrO_J8g),HP*8X)$PQiITWBZ=/!.,,Lf]erq4K<1IWo57O'`h?12/5BT3Om#
+%SoleW+C*uhO(90[9%"SZLaBPWCW#]6qn=g&A:B;/IP[U0b8\OHK2s^t2_A`tgA1=rd=<,/\#8;?Sp1&\^N/3sl_/7 at CtAV;DA<)E
+%Ht\AqW^We89X+eUJMN$uJ@\,(!]\`.5X0:P\.*>X)3_L"WnL,q:)-&e)1_m'He$nK0#IkcCF\"bi8-#**-LiV-'sJ.U?!X,PKHt-
+%7Q`^EX6s4\m%!ebdKGK/VgUF:PE)*do?H at IJl$6#OE+\%YHaam^\"k8i+Z1D/`3qb\c]:%Y</sG#]*0>Qg>,V)^XhdS893,[:O+p
+%Q_gp=4MBceDQd]%JApjjX(5P`,gJqpY at tO0,c-_t).UK<8jK at Z<Yt+r_5ZJmOQ+[`d!>p._F<lgcuuoYf/RfLHt@;;;\'SNLe.:F
+%()2]I;D"T?22M&<"9PgQnd%O-)aY`rbE=,5pl+iDWMAA(Ht4N%@Q?.i/0em1.S*,XWsmY>3it)T.Q at Mb&#CU9?\isB$a7!CnMNA7
+%=k-9gi"UR)IAp0Y(it*p8;'@%%]3_GeTbP9`GZLAH4=kEK\541$;J6jQ";qJ9J1QUO at mQ%R(p"!bDN;=IA+?8!oFXU/P3]Fs3Jmj
+%fF$jqq9Zu7E'd[_jone]'8>6OFqZ,_TP1Te1HAJk^#5WZOYd:3dV,6#cl6E'<!n*>3)C>'#Sm\;et&-9Wi'C(o*b,F^&Ir[KCeMs
+%L^S:<N:R6$;/hQ_e50+ped1R[OnE5-Kc"%8"TsTHgf!\eF.8MFXO([N[emViHs*-@\_F:YG"8-uAgc$9-'FTClB_?S+Olb'rg$As
+%8BN!-^0K4kh2a*QTF\nd1hMhjs1oRpN,g-]@KV(d-I,t1gebd8-3<ZtbO!;Y;dSK2>d2GhF[p/'K at Cuhe#6hiR=*A-q_OH1>&&/b
+%g2fVuCYt0cmBS\R,+j%#*+X%/E$.<T(aM<+JiA:-OFTW\]7PZnj/D<ROoU+*RbrOQS9OP,I(lhk_s=UtdVeK>5',n[\_tVuB(f5Z
+%s$D09ndGSgZe9YX>qfc<'Y(YrMUmlAdTDa\$RK(6<IKFJO83U"!'7$cB<9LjM'ufZFT<T"Q:Wp'$kaqmg7KDf^jVq-WD[e%!cjrT
+%ibeq3O8^'h,LApFmLF\jA,0IP1`Ftfp>oOuqA_SBr4K6pn9,W#_1qX+Lt8/1I)hc89OBWHDF9A+<9ls2me1=kNpY*Z>hI*aVJe2"
+%O%Uk=e#=oE;+]Z5IVoJZN[R\`l)uVJEiQ[UYI<Ha[8qmFB7uQS=Y%0p5pcUq%T(]%rM-OU).Xea;CbRS"fJ.p;f`[0OT%1TDp9W$
+%:;!MQ!Z7:MOqQIa@>k39POEP1eK7cl+?<*Oqnn-(IukM,^6Oq8"aLVB%<iBXc\>*rG.c?J>lZU#THDiOW]F#fN<p*cf$i:Bd]ko2
+%?4i"'Ao2O9=)cl5it*Y2M.-d+X+(h_PWL^2<1]GcSd.43=rh7_Ft2Uo\#,oS>Uo/NS\r7YIbrfRf&XddLqX8qep2(W.@/>YHCJYq
+%AH<6*g?OQ7.T6]nI2<Ydiq0g2W.,AC(dn;lQ:E>F?Zh%ClH<U"Kh)L(aRE9X^]M#erl')u+W87^/fg6S\RfD9S@*0d/imFAXEY`7
+%($8_8k_*M%3^N$Z6Y4rEnH at Q3]2VHE$U2\R</3:eVo:RaciA+m[<4Oc[-%IEItS$(X,8#0!RK:b)F:a,aL*kpFb,1 at -/'4a(*OOe
+%PMc\B`PGVH=[b=KfJoj''e9!Kf0N at Nd(UO=Qc&4Ca(mXuYf7ZuYnQZ:BY&$caJkjjm/_o at d0n8Q7qVlt.IB($Une$m)@[%GL;k7m
+%!=2!L^uO at JZ/OOenaSm'IN7;(`n)?.<A<UOgUu#gko;)J9_1m'[,dF^Qm-scE3_Y.[+`I9FJUt!JOZMfD?f_h6=8^1"3-/P%d^bE
+%CN2p,[D<\^md=:Qd%H-K\3Y"cFc$gY,mi$+&QBnNge?NXLg7mJphQR(]*8D4m1&$N6udgQ+9X>R*?M3D4^pcLj*<*Z&"eBC_e9+V
+%dW]8>qS'%]/ki&:V at gBS&&Oj0'@MI$JnYAkUIt;8Jd/*fnMp[<"6Q?K`%(NRL-7%ne$U+=lVNur6]6dGnd,M!Y6JumXRc`#`$7go
+%&9VlD[u((pFc/!1!l#/jMan?5"FNSra=JatN+rQEE",_0H!UTtTn&:a5Vo,:SL13G\q7V\&0ANN*i:j\nS"]oGTcGkc9X.Ii"Vr<
+%CWYW\-S>l0Rjn$?6.h/R!gNWtU'!GdV)+6g$s&a:_V67V8i.iI6M#dQZCb)E`[[GH%8nr9-^h./H77+?5fu<Slu0-`'/gTBQU4sd
+%-I'*)YB+fO*?QQ"-(4HPU\F!HEkX7_"6UM+O8t,r'iPkBHVl;lY9(n8YidKWn]qJXQm%ukmu>g3W1Q%i6P+!1Sa-P6h>Z!_.mjhl
+%_B9lb.+/q5MkNXsG(E>YhlF,;i.=h"in^FHnm0P;AuWN])(3f98jQD87MT,CG'/ISD0.SBIDYHo:.nJPNXPVNa38cDOenr]@[Le+
+%V+]K+)7P6rObhBY(%S,Z?DXM[d8dJ\n1;)`IWTS:N`pZ&pSSj,-Pum/kK'mWDtZK/mJ8$?-BG7a/tj.%BkMC^S!SSC7'.)`$@!S"
+%Xj:*9Z?)J/h)q?a*gFb5^na\>4L>.."n"e2O+ZU+G!,jGlYI,o,-W;r6T2T'7o:]pYJY)2Kni$WkSk#7g$&V#I,G6fAb3PA6<@D-
+%K,d]-Y<eSZ5>8a[J6J&kfQS[*RhZDoBBM?A+#KB-Cg[)c"*j*_!lU>fUJ%7?=8KMR:'_+oaU6j[*Mdo[c-/3YC at DBl%n/&Mk1*Ds
+%K%-=pZ33Zn#N.R'^_7L)>a!sc5]g.n3A5t:&%%usEOYu8J9%^'4=HT7'+R'n;INkoV,9c*VJFDIJRl*>4]61b*$u?ZU5?27%Q;0)
+%>F#3\Q"3)Ti1M./UIZT^_1 at CF`0T2g&7Y2t at Sckt8B0R"[$MoLQehp<hPbZYC/qNE!Ekm:O^c];-'/F`4.JZ\QqH;(8RUp>DNkEC
+%MLtR5/.$sdcq"o1R=RCdE+m!OB--oBo0Qui[=)_lAiR_(;c""N;4:!UVl'g"pbjS/NcJfqDl`$rOqDa8$'UPj+=Z]n8.tN;%<Q_&
+%m]5K#s,FuprQ,d+7LsR8m[l*\WBIWDXUC#N1b`M;4)S]b'q>J7P"^4ZOfSP`;LHe2eBS8j0+Hppd/!iKgT^*kC"afU6/fRP,8?kk
+%nA3bd9aBkh0MX/ddghdsbZ:RIdh44U>'m`q4,6PUZ\[+T$>MQl0e-T+_[1WE7JpI%H(p$i/o&_>^;GYN"q0qp1iq$`AEJkD1u[WE
+%(4(d*o>7@#m(#[tpA-'[huSSK_W`;4+Rse=9o4bLK=!)jNfD$53Tg'VEZ&1=nPZ)Rh"&*STa86]#F5IrrX.hMHI.X*I0<4J=bR%j
+%KceBj=BGlLm5i at Rq!B(gRD7,)P="?M&dGd$o$URE;"fUBBH&6e_PT[2m373THYHO0hjCrEm!3qZ2Q]Z!dbSR7I+I+d]mePg^W$cR
+%%mU'gh<46VH0*grK,>>\?YkYa=orYu^7AOV"(U"M`g=tp.Rc*%pu;e/\WSZ;30/+eDT<pd`?i,b=(rd$Xu#@WVbl3<*Jb^GdI$nn
+%,.rHh%I`\RN"@P,6[(iUAqtquP;?GTNn'=)%a#nW%=/J8\tCRX%'guW;q/i42(V-L)Q"PZSq4o.lTFAQ#fIYT33Ru]`cdtCG&gh6
+%m#2l>G0&g/D?rJ">n4`.=sB&`_+ONrr=UgB^-LNIaF+t at jQ%0eb`Q;,1]dG?7cb)4;%G9iMf9`&>4^2&\7XBR`!L8U!;SGo6[1C^
+%Yf]_HMN.+E1n7Y1:^'OK"N6n$#Y[KX&Vu47[t?cMFuV=pol>,O;iQ;fd+j/nK-l=<lt#l_k)_i`7!JgaT7G:$JaUMN<!_eL:G?TO
+%T[0D/"6%bG]`Z+;PA.H/Eh-l7?kW*7Sr:B.4O^EmF?Y;eL,]M\7R9Ap/>6Ot6,d-Fn(4C&-cZAJJMt3)2#/Qh89e(<,!:Ln157LJ
+%h2FUXX[$8adioHC&8FmHlpgLn?kh@/)G!a<Lg6AQ7`gI:OO6T$_o-Y)0ZPEJ1r;!j1r/WC:_[=@@NTgt*\H[$5ShXmF+Q4C-ueA1
+%rdrrEEJqX19u'Gp$plEe;^2dNj1:$sg^Z.cd&l635u<M1'Gu7#"$`F0&*qY3`Kb8pgk=Q",Jh_09!F&jV`AK2XNq]s'>*)jO<>oo
+%T][dIoR:&Gk"!5g"=IBUk,DVVUVJ\XIn"YqP1=ITW?$O-$oL.$`1I^I\S+I88\hnCdGm/NIDsoN:e.kR5/-mk&HdT:kB2?+5u2!R
+%N_+>eGePg63I,"SE;V\)+p1!q'ccff,ULobC(MV/UiH*55kG1H1O.U[Lir_/=Q*KZPiaO$Z*YCK#6]YM at 2b%*2OGtPP)mW/+3ACp
+%.C at e?T5r"2U)qRcD1Q]`*D!'c:":k)K/?keQ``%+'IjW_;A3GNb<4B+rBKL&*Ctas_Mk?U"T%0r-5_Z]1(Y"^$lo<Y'uH_FGfK>K
+%,TF`7"pH>A)*#YZPU=fOEf4bf?]atSiX&P50*ITZ4%>);_CCofE6i#0QK9f0*eB\\6a/1K$c^%>r-4Cr&R?=$UXP`n'7:)eA+4k.
+%&m1tJ8>H at u=@dFj^mkhh,LJ<."Ke,!k-OPOa6;JO7sc5+cN9KVMS-#KcU9+E-9uD$9U%&]1mTgM,D3FR[IS>G;/XmlLk%)I!"Q<R
+%a!-*oKB[;KEc47t"U$qLR0*4W#Pl(IG(X[!iYOk]Gm_D(jG]W)QjO@#5"'9P6n15W0UEYP+<9bj%*Bnkm23Wk^\?)N44%,-#tu+W
+%"?)=>A:Yf$5/D9fK**';0F,E`bm]PbGmHDQ#j<1V>(rOH,U3H/4Q+12aUH187G at BV"[:&N`+qehr7]IHN$]^L%>Y/gUH=jGp!kZ=
+%q)T[BGY1rZ%E+3VJm^\^!tV(JN&V&#L170%\=CSFQ,tHH0+FKZETa,#o0TOO&6a$nbZu4L]n"g-;fGS<#gBWJ?QR\oFVP1%TQ=*t
+%\4 at U=LMp\1VEnEka7:6RHk9C9$abZoYnLR-?ti_HqpMu/+Vhfl>`aDipBKV>fLMp^TWO;D$n[">(bC^*^giDojEZEWkg4ku#X?#'
+%nGj_&4+KlU,gpcOZje6B_);CTJUQne!RY,i"2M&b(6XMoi2D$L!eiII(K$O.#gFcm!?Qj?aF`VJ7f\,9i5:HNM>5(X,g"8`Qb^Pf
+%:h\p\TG!D]>loY1='0(i7<j\A$R#Pk"TiaR=?nU1DU\\lA<hZLVBZMobDNs(n.&i>U"at0/kc at mLM:i7!J+=LJNGq**'<d)YS2u>
+%;Bqnm!?L,Z'RO]nD2mo7a:]JG:(ZppkO*25D+U&ZYW7:/+*qB]143=%SQYYW3ZO`R%1D)b+Kcl>K-LC"3UjfXN`^'c<pcp9,gEAJ
+%?o7ZR??Danq&(%f+)B,PRl6H=^kE"t0H*EVA(b:qgbTpZbBIO+.)1O`0Y!9$UZG0*(OR&qUH<=KP*b#;Mr6uUVt"4gd=WVq9J*EE
+%G"?dUWS]^3>GCgbXkI'K?qV5<qt&0lG`8,AT2/Z8e\lX3q.f^[1mHg5,KH7-W]j0JhSS;NbN?n-a&;UIiS,WroU,2f>eFr3%puSM
+%BBB"u9V,IHV]K*XiSecm_o<5al?dV5`()8F8k7dU$c2`_&AETpQATr;@rt5cPZP>>ftp%e-oRqCc:.Uo='DodLJiLWbQb,CF/O]I
+%Nd(bOp:qoP^qB[!B-SEPN/G't3Y#=ii0JFm.55;Ws21 at Lr*!Hl>>?ZG*)AVZl+Gg&+Y4'in&JQN_"%k;UF*_q?Ll_J`=j^')9;.V
+%6lff?9ZYfC6eJ_)>e')Y@@=1uBq_/lr6 at eA"'Up89_s>_.4c#896<2"-/?>u.46_VmmffQYR<VR(Z)C8QDYZnB_>qQ%`jO at oc[Rf
+%!tSq/ln7p_E[SW9fK1Er;pE&$D4HOCq&MHMR;Q"@QX4s)8*eek#-"d>D at p:5EC\?&TVoB1oftnT&,4mHJHO7.k`RC%<upp<D5RSE
+%H^,'8gR_$;F=QX_A\Cs-"GGU#*:FndF]Jh)KRB5AP7]#EeU`P1<u<)Nk7rQHP7*ErEH$G.p?Bu"b6#O4D\Jf62.TI@<b4\g'YTqU
+%WDVl9PA&OkNG(Vl]%=121o:i,`"]PEkFgKH)LUXF$Q5hAbsgf,mGs83aF4']3"I`28M7 at N56`J`\[0)jn8Gn^X4CRd-82_?08XE)
+%0O\H;gNF-p1t9<m=uIOB/UR=N)?RI6:e4a\CHlDoL+ktD/l4l!%H+-R<a_0P&_gKV=G:ss)4bC*5aHboE,o0KYcTG*hhV1Per]jD
+%8on:ndm6X<B]WQ;Ui]/fe#pB,9O/^Wnp>1.'`pXe9j[e,20m#]F^`3#BXsM7\G^$dj/$Fi=H7`P0 at HN,p_iXb'QhF#>YO at P2OPA;
+%4EX@[aKQG!C_ftKctNl*XetJ`IBb-i5('VH2d9;DRbSW`O._ipE!%TE4h/,+oG(uY"IOh`#4IL.EN8j/,94$'eQWS#pd!';`gk<@
+%nht\%^!eU+A+6Jcom@;\\@p\5Ka'AO at 713p^!1+mR(2?_Nsm!bJ1JY,StuYH=Trlh<*clXAs&k]J<mJ>Q6__pn,bCSSQ)[hDE81m
+%lKbB[6l2Y]L:NAt=hJ,.Qs,VF1r,cD28!<\:*stsPih(8TYgU^>;WbSKih<)))gBM(:`9;A[[D-1V%JP=-le`O"GsFJ2L^uP7R%7
+%?:Oa7._6Md)E2tsG$)rQJGYMhn)[`\UsQ!rl7:!MpUl<Kd*/9$Y3'&ejlV#VA at T!1\%H^0$K#+J2F\qRML^d=Dps/QfWnX6l$SIo
+%--DbJ!lF!?.8E>rX^s?)42\5iM;)UHWfjh!:A_>-cc!Lup at 1-O.o9HuJgM&3apgLGaH!80h=ftq/Gc):fA&/LYJ=UJ0F!G^`D#M3
+%o9'GVH9^!5c)/^'7>0]Zp<mY;JT_Ik-"bo]O$b`fl)N*>2Kh3':T7icYH3Z+<*"rfhbQ`_IETg^,oKn0*_u!l5F*C@;15]\JrOV#
+%Y+nXb\ib\uXYqdR*tMs'fV,*[XXoB=lGQd4!uL1;PVj8ceq_HTgsu-_S0"\YRLYp$/LtFf-]c4T>i+:,`cn.;$LtCV&Z0gs.d'kW
+%*msRjm<[!8NERu?[dD&C%\+=)[=;_%/`sNNgTDa4X>'.&X\Um&![RZ/a5JIeHFFqHdbD5QN377kqCM6FC6G)SrnqtjBF]`U=,Q1A
+%6'`CYS\LN*<GCGmjXB`3;%<_+-R*@;^E24:U4 at mY;IgP15%O0)[[Z6^[(T.;gWLlhCLIsk`(eLFV>7Zu#Zkmoc at jR!-DZoSn(=V_
+%0*=u[OF$!DjWV*$>'9k>f>U$mR?HCsGS%i"gcW%[10sCYT8S_3KK`^7()^ROMVcX%8K7SX$12l:LJHWd<b<JXpR3OQD:TrLUC'F3
+%[jp:$_\PM)&Cj<h!;#ZM.tM.m7_Fm[%^S"M\!^R#?*pq6*Cu"c@`';Q/^cE@^1f`'fFin9`u:uH,d1EJB$3<th48\"R%M)o?(5N[
+%bjD7]dF.$'C3EYb]7fU;=V/<`Xf'@ASBREW_Fh$628.M8QgE<Z2//FH\+P`G+#.OaF"3I(C$pr]3OfXGAuE>DgQK6,kfk!D\W69_
+%(oVH7c*21rG9.dXC6)YVc6^FPbnHS%PhnA6Y;<^X`$#PuZ'Q)"[M0nlGVCs.jIu0EEr9,9P$^"i8-X:ko&R?p-01.E#8cbB;n6pF
+%k9FbD^(!A\1G"(#pQOcVEbs8=#8CmUE/>OT-(^8Hm*I7`*P6"0*M[@J(ksCZ(\[K:S;:YH(3H`'5j?-7Q^]ajph`DdGqg17-Prr*
+%M)5,R`@O/oaM6'd=(NY?T2tgdjNDoWCJd4J%?P72jN8lLV.q#4RVT`TfYf#`eaAQtg33Y".O'$%(SPl59Y.5NnRY*B:bI`EaJP67
+%1sf)S?OY-Pha7hii[LI[k"qbNm at WtEPa3V"6U,]A<pqQ1i-_cebJ=q&pN,HOaJ!1^6QJ_XW4RbtPXcjOZdlt;_TAbt]%[QfE[27h
+%EpOP[@^dCE6JuN:o`o]sd5X)RgG\bHMnBX$eSm`37+<q+#M\(`86aCO>>&S>JbPHNl_2$SE\o2'i1aQO%D_4qRhBn`LaZY$d1/67
+%1lZ*^5BT31A[j78ITeb[;Y4F/q$%3>^HNsHgj935O=e4*o=9 at D*"$fA3BjjS,SE&FG=,O_[p27ID+2\gh#8`],,.ig)5=MR.[Io$
+%lA(BFZEbXtm"cGZIAh_KA]UIM%Y''.g<dQ&El(`k5'H+2"kq/u.(aQmKt?:VbN9mZIf(s.#),Rq:$#OMd6$Ht>ZtNgp0\kD]ph,I
+%@n$=6^aP461su)a`@_oR at j*n_h72Q?N#W2BjAQ]se"oQNaCOpeR;f01nps0R(Rjf,CjrF'9G&+SPhKlOF<F0^9km*s*("l(QClaE
+%#rCTO18PS*+@,PeHUJ7d.=Cn^Z+A,X[F%EW0XY2g[Sk^pJM+pUl+pW;PCmB]g96bq,o at 0"0B'o4#4/hTn5tk&@qsfH$tR&)"b(Tl
+%+isTPAPeq$GWdN4j:-=CdfRm06#?a8a2)XRAAIWLOXZpVl?4t^]8($V\58')CbuEV%EYL`;Amjcju1p$ZYI`"Yopm6?D!ql:`d32
+%XFul/-hBU_fk]C4$eP5A0EXYP`YJiap;Wdnk!6<_[c>HoKerWn..>pl#=+fNbcPO:G4$"?4#iuOOudR]E`Q^cL6oou%'D=+Ll*h(
+%F_Tl$01IukgcT`bTbckO^penq3i6`PMS?2kRtNtjO^MI(6`+^0=U7=*]#Oot5%g$%b6urYhT['`993g`IWFJRTV^8Eh7o`moS0SS
+%3NS;=pRf&D`M;.&oO0j$^"H/7X>-pQn)K"'N#>DA]<L%W2q1/g46/u9#=ElYqpE>'?.a2m9+5+#N\,]qrH$!fej;_;>:<qbbMTSR
+%;dbg+"(jU)C^i@*X\RJR'%:X9[^AKS!C!Y?s+c!7rbLZIHgF)S>`m_.a].5!F2B at 0;1+:O9)eP_kAI9=Age84Z]aq:6_e\^GW$qY
+%(iLZU"/JQF#Pt./h^TE2r9.Fg;mp:8UXp!G`d%!_%chAR8aW>1WFiid.`SD at A,!;$/\X+V6at.bLg8c8f;B?01&n>06#.RKn!-=+
+%/l\pa,3JBg(3K7#Eg%s==p'h`4SBqQ?R&n5h64lE=nWZg9c[$@:W`9Gl$-`or7Xi'5"G8D5a6d`@#fJjreU&=[iBCoR]!"IGi%d[
+%BT at tF5j/3f*51HSG).+9NJ8:t(1__X!kX[=XqDYYK4b0nk/A/ARI?;Qkm\MKG=- at h:To3"7H*:tiqX]DInbfH^^P]3=3%SX:P,J$
+%aF`Gil4LcgSmC&'Moi"Pj?)2c1!cJ7+[Q6r>Z$7dL'-ZoQ%I`I$I-+9()*iVaKcP%e`OrX1X,5WN]<E at d_$Q[\$d?E(ZESDb@?@*
+%EJ5j`am/Zs!*S:F19++SP1DYPX''tPEJl4ND*Ne'J-/<@?]@SH5S7H^^hgU2>-s)e>)!JbHVEY#30s+PHQ)[:1P[&o;*3jV46"oh
+%1?+$tkU;a*Ri%$LZm/mKAh%2T>)cmXS=.)s9XYVu3)WL&R\d(/nlu_/^MTgrqnpV0.cAt=n_rpW'.X>+Ns$-]\*OET1RY;A+,8m?
+%4O_^#g>r+9Vap=$dLcIk4LYl(:]Xh.E5]eC=q1;%9ITe6Q/-$TW.m&DXBu at 4Z.U\!A+crpR at b$!Wh8XI]I;(L:9bV'H^RU,r0XtX
+%Mj%pWDPpc%;j-9bfUKu&W4=*S at Cr$^UPT<ob&?ZpDUf0Qla2h. at r#\s-#dQ]i:?)sL8YFWC5*:#R0cAu at C9-h@nj$9Qc$J3#m3UK
+%#epKPb/2ieSRI9h;1Us_Y\T]O+]Qq&YV[19#B5^`dOqr5"7\!YoTT(VA;iSg'#/O)RcqWShHQKP960(Ce.PuA'n)Rh0L6A1l=M4]
+%n<YaBY7NL0UMIKbmWKbG4*Fpd/d:j&Ku9Q(HuSo%]RKgt[nbmMEf$i<9M^EfqC.uA(c:8ON'HJ0XU.Xe*g&1tkAjgd8.tP!oUnot
+%=IRH2.6%VT/,)WV at 636m7pE8?n_bieNQ/?94O[$)K4Db5[3b=)eq:L^-F9]Ld,4:A.kc;JPe>(a>Gu=3`X at R0?B6*7mDm+Kle1Pk
+%HG(gncEN_2mQGaT_8LNs;T67^-asqG8o'[3EH+X.Z4[[RGfj8N0(8)j4#j]g?op<>2!mW`Wl];C(j]JcB=4dW.e'H>I.7gi=))NU
+%e^FYSp. at q5o9Ao!:So<$Z-L0l'+suRJ$1G4+E_#gk]W?4 at b?iTdn\UuSW4248sdN(khKnVGHAnu$P.ZdoZ"Kp2ehXna")*Hb"c2b
+%A6NV3rTN8"rWkG%RDWI(b+1bo*00n%,*K^ad5iK?N9"3/M]NPCr%-6(-<5[TM38j4T)\DU^CQsiCKF;\gVPs%LTL`@):P<A*BM'c
+%qSJYt4;gN@*;%s!"#&D,WdMu96C+[YY-LLAo,>:*iQ5#V<Q0UYTT?i/X+bn\8II]Pp3Wa*QS:-7Vnp%f/L\TMj&S*IMc=MN.,YkD
+%Q`&a7ComtgRsT]Xi`<[rj=!alq`2C!$?,dh*F]a(4ZrA\"LHhL#X/r793D9hd9F]BiU0!C@^LO+X")m]i2G`jnP(r)R'\r*=qME(
+%5%fA+CjkomdICq9fL77AIXOTlZcNlZ\B]+F#mXH7Z9r,&T&/>@a(*RUkZX0ccK]';+u%1N/i6p>(n<EG5I:q7^"(-QL*r(":6aQS
+%8%d&.%:[]NDQ07g6CDu]@pG":5-fij78]F_ at lm=RZnV,f?5mae(%0GVqmF<6b3X(*E1 at sq$H7;$=eU].U&c;3Ffm+_9L-h=N2P_<
+%3ZQ@,B&Be?F\OjAU'Jbs11)&?'C0M%Y:`;PlcR42NV6ang5+/Tn<N1d1okQK9R<j&:9P!</>&B_]%IFM=7'I3Mg^PoZ3_>EVL$5h
+%0D6VZFJ*eGCe,lD).Kap!HJ2%/OCXF at B]]*TE\'f4-52*OCCTQKO0eVh^ZB21*701*Sn00YHpQr<@a:R*7YY8UmIGpBGT'n@;V*<
+%8KhNnW`:QZAaJ#WlJq>qZt"QO<:p%n\%CZ)lD0TP_M):s)Vn2:au^Hkcu5V\c1H47bHI41gpHb\"'Q4%ft2n3;_>&'UI?MciP8+j
+%TMIm7n2eG`d5OL9bl7n)JN'W6:cdAm]Okj(8Cjm1WsT(DhNkPR\j2<3#@$'F'S5E(Rtlp2UL/8N at 8`Bn;+[%<ke^<p#fs`54jl)J
+%e,2QboVg:M)A1l$8S:aNJ\%U-7_[R94 at IH*qmeq5G[<<K<s+7s/nEPBm1Q3CgeV9ZBpC\HQ9XQ8X"W-q=AY?jUp(`P<gh%09 at 0*/
+%1/dABA%RN_=lb=26'CIq!@g=T1(>SB at PSnI4)W\#CB6Q(O%G,Op2alXT-mN$No=JPNZ(?@Q4M.n06jX at 49Z[k;-bMkC9k)m4I_ at b
+%D?.S&m:#)7](^+j*hCU3F6JDAe-i at N*lZ'h1Vu%Od^LJ#rbVc[5g9q?O8\+#5-ItpRYa>Rg/IXX,aT`t!X\PkS*rRcgD@@Bhc813
+%'<d!ahu4,%*Ak,(S, at R7c]5U*lfg90HiNY?R0];Pcg)b?U.TV-ofngs!mjDQobec%86^VS8(M&'3A,I'HU-Ff$LOgaT?kd^_3C at U
+%FKd%6X+e85B*DL0-@=sES5]TVG,G&JR<U2o'`]"W'RctH8_&QqF#I1_VfLhLXIB:u9VLFAfa?,cn7e[]d9sTbqT#R>9Im+3^p7=5
+%=a6lQECH2nrVQ0dM64W%nJIsWn64=ieJ-Pm/S^hM=<b:bXOARtc,c+s%fItbWWkp\4-bKM/<@<Ske!^*V`uU#GoqP`.F1P_[8PK[
+%#3H1ARX%FUPTt'_fl%9#)b=42U3naM%6A-BR)*CB0uB'bE%Mhmg_:*/_Oid75YaqqD_*unSbYmD!D\,6DDFi/lE'[."+OV9j2`/q
+%E at n1M*4YGG9+Wgc'/&(d\\W^9.YR;JfFRQ9-<!b.n+WG-rV=:@U'&`kq"$@CY=M%$3lU8NdVW\3^`,+=Nq^I[_5!#[m\*mLeD3d;
+%"PU,ef<_<&1_n`_0=<3k8O\,V,SejU<$VDA8-dUNQ*t1\4Tp50,%-%'SLRBQ3s46G;,`XiOt*bC%T*@&q_c\jGd.>G#`.SrJerNr
+%eOG;?>Embj2bIDd+?cRPia"e!^kaUB3bG]"i4^n(24+rR/ZM^-/lX!Ea9?23Jd,@>gi5Pe+5=bj4<\c0H at ei#(rI`#KPY]KVF&%t
+%r"pc^o#s#`8qrDST=upZd]&EqbUUpi0=_0"-YSeM)<J5DH?bgZ=Z>qW8=.bQ&/nlC%$@4".3*9F_Y)VJXu/EiJ,;G%D`B;m6.WpC
+%<opK'q23T91NX0'^4Np9En4_G63,F`mR)sE$/^1d(9K??h#<9\"FS=+?bW:?^@V5:;quML]i0KR$U5aA1b(gRpm,X&pYYi"1QoTr
+%oTJ"n`@0q=6&s1']]lI]H*,>s:&NZ8e9Lr at 2SPsfS$g&u&10q7kXeur)DcN;2J.hnX6i^lg#U2*=O7'qo*9tnpLnm%+>;*^(-X-N
+%V[hTq7KNY3PoIur\,pT4'=XM[;mLpb<ETI%Hs+3Y3fJJc,ZRLgY_6nrSG"CL(,s;*CjVeOkk[EMEG)qQ7@&8f-f;^D48OYQW75;)
+%J0K[0JIF/t47'e]j=Pm5"4H,,S^SEtFt0_;pK;:aTG<%$gKES2C<>pI5ngi5k=a8_<5e(d5,W2lo(hHT[1X70LJ4G9)TII-aCBXc
+%cXlY[LZ%#ar'FDJGqku3?a(4WTbV1*>MI1mjU-]M5nbjg.jnDT`A`tLWta75Eh.NWW)gKRiO!=\,tJ:B`pd&7=$;6T,L`ABic!R/
+%Wt_Ju"(gB<A!A1CA&9kQU,#UEhLgm<)Gae.mDuLL*`_m5\gbkETXC:]@/tZBo]KXl<'!Zm<$@]]'?.m?ACmIRfF'2#Q))KJ6).Jf
+%ln$*PpSZ9V^[T+N;GOh at kYc#sNB"Of)[9]&H)3kl#iCe171f%!p>[Ead)>U9Qr-kI1`cO\>.;lIm6^V%$f3fpFJmU]E>A:;H4KsZ
+%=e/QTXip2+eqMT5$?`H<DM`0NJ#Cfc[Y,UhOCtG4fOZC&XL;(3'?!g5*'P6T-ENtL11TUqY<RO%f/aI%ZZ'L?Vb'Ok(gA8,qBHoM
+%P,<VA)fioZgGqRQh33P%k2?*n(]IO^9i'QR*dm;XeKoSlBf,9&NNb]D!XMG.;Ia4EL-$t'o+ufg7H]!(XGYM"@U8oe9%kY2I5pm0
+%Y6o("OV":3p.iM$p)3aZ&]]_j1&g%J9eaoD=ndYHn*2ctU?QL8gIIDV)fklo%s4VN]6r4>gmU7259&#Q-M"66-ReL<4=`3+R^9#l
+%q)J>g><D\8EeGl#&ON4OHWY8a$iq/79uNt#WFQR_KLkn`WlTsc'I`/6L?V+7?TZo=''epKpt3$,*rT.!);"#*osX'MDLL7BE\Ni)
+%h-1M1+N8YE#d')]dSbSZ:3G8GJVbh?bubq_(kH?:o#ZCMgZc-koDk)S6J\Z1o at T(U`jA-pW%GNCS@>7Ar-!BBb#%Voknl]U(On(1
+%B_L/6kZa48APpM_qoQ*$R9+i(&?sKE!aBU6CGVSA`k#\+U).M;fDklcrpj-#J+<tdjo92iOB6i- at X425>n]Ku>>uMU#>Y?q&#.<m
+%8%eW3q[9rf5d.PEllu<(Q\n1Vk_8[_ at 0HfRS*UUr%Il_.U^hK+(\UQ%+SqP9n>C_p$jbIG=*D05F0cOWbjN?g^LgHS!IU'L\%UW2
+%J+q2H*$j?i:/#E:RqNGI=tX,hkOEqi7%/m![dMW&.?))qKBN1"'IBZd$5/:MDCY9D'_h>NM=EgSh`!@i]I]+Zpq56tF7qn7?]4j]
+%h=LPa>-%GG%3qgWKZ$*YI>G)@`c$40Y7#\qo at eNtJ&]-O"6f[QZ?4-`AjISNKX]6]Ld"LPR,97g;[krBcI47l\)NJ'j)H<W:E&E(
+%^$I/llYQ]5 at Op)U%;t?OV5j8<AU]It`qgRtN(uAua[cKqlY<(,1Y&u1VD./e$\tl,^S]TX/'lIDfb&Ic]al at MqgdFi>n-qkqtc!D
+%@5/jjrOY5`\=jtQhJJ^l'Rd]MpNOq^bEYWDEUXU1krm!aH5;_<a(689b%-Zcct:RW!A<P"QO?8d4 at KL'pOp&CbY+Y]gZU*aWVNUQ
+%rAf:BWR)c'nl@,`'\t:`*q6QDq3pS#f]NH+Y8e at Wk:]/o"#b,Q$%'X0gZEd6ICC.;\*i9'IpY&clngNoFH'TR0^aULfm[+jn!5XN
+%M8Pa`4WsG#N2G`<IJp5na+?Y18k-+MQ&gVAF)6G*SKc:N*/rnsrA"n<s-fGMf.g)=Rt*%lkDp.o+(q?V(%T4,k81c(_!8&LY]mQi
+%_*(hZJ[O&-E#UrV\];DZ\<1X1XMt'?jo%%4AkjBpn,&N]OHOZBNsT.<:A-jf-;rQ#mX#^he,Jr.g0a^kL`]Ii@$u$`^UMsbZ;@_/
+%iHkIP-`Oee\RJBi-aIlqQVCe4C?5mbYNqRi>N_nIn[s.=G1qHEbC+q$O>%mI;t2h[hb>cTbS\1%-C9&6J.5`;ZeP%B(t4rakM/7N
+%4 at +gLD>&7(+.(u$boW2&dLWdOPaj_9%&Ct`m!'<C]CBh4crQ=C^CR[#^%!][@h%c7k?9^qW%qB/RC at mD5HeP;]Ro(qkcMlI:H%n#
+%O6hY>6\c_/IN.FXI?Q2>Ee%7TVPSo!YT0<@Q9"8iC*mb>]oAZ$)#nRK]CWL+p4g&F[2k`ID3WLuI%-G+CEMa/51r^>o57LaLAr!C
+%;0Vjpo,q0E/hGV5;4/N(V)YW;16?IFIpBjXQ0QEgr,%]Z$u_sp<RU&U%oU'hhIe?Nj^DbnQJfC:H<f4F?#Z:>#FkQJIke-P3PD6a
+%JWCG%HAK#81?Q1XeF&Z`L&8<)oRN276)o!oE!h)0^0\6pH2G)o8:>>5_aDL/jKYm?YPbp'q6iWe+`Lf6Vfi#WO$)g-a,P;4jTh"G
+%2R?aG)5_[QS`3HXmrpcOE?H6=:t<H\paGHW at ouaXA3Hpl@!+i=:/j<KpY\9<YGGH2.Qrc__H8Kf4Lfj18He@=P'Heal/s'0V[_^[
+%Loa,9U3^C;>I159?%bBH*5ZP?S6#QrD&tXgGJ!BblTT4WgU]OMe[Ht9Ie`e^5:k!%95"ORoELbh.=pj9?5iUDQ9e$#<dgQG+qaD@
+%Ga;>tqOc at s`(saAlGS1Q9X(.]#!cV`JND8)qq0oXmNFPKCDh&mhn"p1rU\<X/b]8RcA#?ggAPn*4mfcBXnf>bhbECj3+JX'-KT7D
+%*[gda>O>'g?C)iAV2a1c3 at Uo).YFY1c^6dE7QHKWrF;a-ipJ at D&=Ur&Ir"b(>R)]d>\CPgcJMZeg0GXL0rSjm$505>]lgufTlKU&
+%n]aZjmY]'`o<d1G<qU<ciU4BTa4%DD2oPlpO"Yc'D^Wa`W,j2=Y?`0EM(2q-1,"m``te)?f4Mdeji8Zm>.^\ThSurLSMos19VBiC
+%s*LNM+X+,rKitPSg\juZTe[kR'qWt7"n(6>C8dYf_O"GlY[`0A"2u$?e\]8Jj?S.oA.D]'^$qrHA!cZ8FY,RXK0Vd@<39'Aep1=4
+%eWOtap83pLfMe4%Cl#[1V]Ur(5P4Ml38Y2DELn4aoPOH"CG.gc0>J:FimCYRQq\0cS';$:oJ%ANqI.,+G4keM at SV3T$nhmK]?7FA
+%-E*WMkdm*dOkig<]dPZAg&Tdb_UES,ZIfN_UiNreWh_#I-RhCW;WnQgQ"N3=DX/-FHX-0shRHA(pX=>Yk1bRFNU$Df^Ee;rVoK[g
+%9n*TMBWerUeM61<&D^#OmsPDo=NIC)-4NF"_aA)0$'p,,D4hHrKh(`MFEFb"EE\=STP,_heMcBl>\q^/>/c1IKa2,TRRjfU3u>0!
+%=KU?;LAYI-4RSW8%JFC5hhUkNq8417:"F/j5;Y#g_X7ioOeCi8"#$j79:;<QA-K.Jk,(/GPV8A_ at k[=>@eo?a'%u44A'iq^W3%Bl
+%W?AZ:Q!%uOdqG8;N#l)4:`Aui<P!#5N]J<R82H6G!s4[YD]T?'Hj,J.$^!L06GmTS6-A/b\F5';RJWk,hHj!)n]dfBO8^Z\jZZ\*
+%PPWN*=9PK2a;qc.^W&'EI^0;D at Mf+$DgN.XrN&R='n"+Ti?7Ap\oeuDZt!:GUQ0Y-f9Cd1(5mW'U#,XOA:A=,LDb"V.m<P[%)X_-
+%068q"\L_r4JrcUJJ??Ep#t3\=J]I0KYcf,Bi1!=:500oj8[nNjB',\_g"tLWEdDF?jZr"T:H184B;K(:8)L(Pgn]:C\k^DkNZHb%
+%UMueT8iOGi[\LB0<Lt$p'ZTaZFl^$C/9XY\oEMEYp;!m]4W<5acq!'8V*V4d^019LKmqelO8J+Se[@np)rHu/k[?(bBC20+DFim\
+%Df\D?[okaNf(0/g[WS5ZiMTS7Zd;"ljunWhhuI;n$XZs,+4'K;Jip0j_]j#Og4H3Pmt')>oTp'MBI141m<hUcgtDEkLEZQmYb_eS
+%mept26^Ylf&;5u at MdAs>6:XQFWLgW'#qoo&:a$h-:V7^7!iOticZb<$fPK?3Z'1 at q=2CQf:%>eW_jt^V6[/\lE>-'>mYr1t.TlWD
+%gRjWnG4]cFcf9MFXDb!/D%5.,l"c:a=klg%ndZT\\-e<Z5uWOIbd at s[G.4L/It<euChTthrJZMoB!b)2NdskI3u<4rQa\^=&2Z-I
+%4i(3h$LLVu3P-8fe1[L=B2lG^>*^^,45)5+6O*43&O3Z2*`i2aCYYfJ]@m'nRP48T2lZ7e(N\ju$ncb&<Hd1`Mm2njk:aDOYOP10
+%=VmCb)UfV&(Le.*1]+2JSOtTBA^>G+PnRYd'>8?aC#J-B#tDX)9?fn?d?kf7VYao*hj7u:jgLD7C];TXGhPdIm('Ss^:UB5e+0>1
+%50VtEZi.<h+.CjK#q?^>hC10;[;/[s$4J[EHpC6Sr?OT[KJUm/n7\COAk67-X+b`4=0m("PMB#a20X>l?;HfCa_F(p1mu87d=pVi
+%T*YrMAC;WEP]5./\&'3AIG[0TYc$m`Aea.7s.s(J)!g4`Ho$Hl#j8$iJR)nTo7-V#fg5C*j0YoIQa?LnC0S<("IFM^NiN._JN(OZ
+%i=9\`Z'5pMS/FoeRc,l$N.6!FhM8uqd5uP#"37pNEA[O3!-Pgs]#-U"Vm'"uE+(6+>J*ss*aqoDGVJTEql-/Mm"C-Go=2KjbiS`k
+%^GLENF7hAhh^sB?p\S+#-)<V<FSS%G!R_U62#f/D8#Rfl6634!m+8c'q0Xub4gV/Ie1#CDSUtE2X(>0F%!qc*\O:iGL2OTl>]UQ9
+%E=/#*X75kCGSYUAK\^97)T2L]DBs:*hedqbrUR>#Si5OcR."P_P5K#XhIl5fq/%65o.MI3=9CLVb=[M'2!j>kJMW'.%0,q'i]:<q
+%#A_%.CI_f?Vq5PY_%],:a5b<*/b?E;G?22d;%21I4TX@"=nhU(>lNCNIqIQGq/#6P)%VB]QS6"Ylo<Q??S6Bq?8BjCKWN4;nd<D(
+%b;E$Fgm>Zmba3*dkJEQcWtrA3"rf=^a1]h!nc?IXIhOI!lgX=Fh;:sn7?o[++Do_[ec)ofk:3B?Rf9NM?UA%=LT]u=1Oj53?)J0G
+%kjjR3SlI--Ufirk>qRE3S-c-q%s@\/ANT\V1qeqXn_L3.Xmk at OGal($];tifJ`08gl!Q?hMe9j#H?Aj%e=S@'DQV^p"4r,j.o"Z5
+%<j4Gl5'u6F1t.'F#/Z*_Xg[/>KTMU&(*stYS6<<-O8-QOl9$ZYo9)?+O)K3igT3R5bAT0R1V9O6osssQ8;A*jlf;MsG#>2YHM\/\
+%ZZ62(*;bp+Nb/gp.F[.$dS9!G<5C2'Sn?B4QVLC.Zp)Y^P13<#l/-)oR!_O*[QG^_>g%n&s)*aBZ_-Y)ml&./e,D6UgSK4g_5F9H
+%/^&q)94K77$W_aEm_B$gYO.cMM]WbGL[82*32B_UZs97ETfAR5c5hYC<ES&3L#Y*oMR'GhALF`^')pg<jeaug]rN at c:HQ^j2p`%1
+%iN^aF$Q!&25SrR':ggl]T@"4YTbdD-YQRe-R)7mR>YF`'l-n*6g[b5rI+Yq>S,D\CJ")_mcJGJgH*Y1h)5g9iF606)jf_^ratU1c
+%q)e20NcJm=BVBVAIn!"),8Hd\WXn0nRO8qqTk0FP8;r&??i#KjR!91dR5FjW@$u8!Nb=7b\GCD%T<+kD%o`"F`MnX^4D7=#8l+aM
+%B=>k@?@(=I:E/ro8q.dn3,0OIj`1:6S*XR\-X/"'1<mlmK:>JU"X`SToc/c3KU^L(k?P0F6u0T=oDSdq*Brf=0m6>L%VIh."hd;l
+%cBJ?WJ<iXOR1.YU(>:*)6GobRZ?)7lH"Y3I]l=4,@/G`&rNJ5pfgYWeGB0XsO7>m&L\Z1b\aQD@\?bc34OF\F=n"<c4s30"U[hhp
+%/_]ns%=$P_?AAr-2.HNoE%qLom5.&1alDYLXRprb/-EgkE;fFU?09LbDk7^''HVrgrV:t:A<htq)X1%&_^d2T,*udSLRE4'al+ON
+%Kpae#@9\NpQG_aTGYd2nqX\<ChgXQXmcmu@/UskOG9C:h8U74(`L*4.KR0C4IIg at f^o=&DJ]ufdBjn=dq).HX7YbL6#@eI3;507E
+%i')WF/!#nm\1IB"q1D7dR-a./h6$,Br1,#G74A7[#@8bT;](bhe3MXt6aYHiTaPtB\tUEM&b2-QMY(g+dRt]nC9`&H7T7sVe\;K5
+%3#V/5r at .R&g,ptHj+9M`Npl\hgS?uWe8H!;*d)+e6;Y0]2<B4"dT%`GNArgOJc(WAP9VWCOrFt-'>r4OnFE'D,DF\8<GRS>(UYI2
+%p_)0?$$)f.(/^HMp@:b!cUC)hF\J+?P at H8Y02RHH(\;(g^Y'ggCo<&JGFRXuO8<^&_rKo6\Lqg4Y/2sgL.ZSRL$%g^QeH;k0bTGD
+%8sRTH_TT at q,$pM7 at dad.9OV@/<h]8%/64r`.nJGuMYD7LGgYQG4Y6%\>N'SV4DqCXUj_%SiOA?,.>2]5X/AP&YJ>p@['-BnFQ!g#
+%&AsoP()l^*XWR&E_Pe;]Hc^-^1aRRP\ou9<B-7'leo:Uf,Qoek`W?B9?a23?6U_h)/FG`DM(ErK*QQ?uo3N>j<h7Cbf/@j`&VWNT
+%aQgDW'&R>Al4TG/*!!=7%p.Vf'*$=[^MTFd'DDt0\.bLCm@,DL)u`ol=`.121oK6V^S0H&`h]kPLYi1[k'(\7WZ"W4iDt0TNpr/]
+%B;4ApL`U(0^$Xk1'^(j+15j!#B?-H=iSj@/:k%1(QZ1(Vr7^t.W9f&0mB22&-B\B=MiMGm<203o)rP/6I'^"oHgp)@^Q%\TnqY>3
+%S at 7nK\8-j[l$'4kPo+fPO28,Y%^%]`V0T%h7N`pMk--PY`X*t*LHS,KIl,%RC[p5\h3RiNroJY/Vn`.0rp?ohnlOH>T,stN7O#Mr
+%#7j(PDYXh;hg5jIO!%]u>A+m0TbL8mi\bG:<gtK`c<ZMC%9T!,[!_h^*O>3YX!cSs#:K?8mV_\SYkp!@dI>bVU]V at .<k>poC't<"
+%R1Y,>Bg+NO/"DBSi"[\IF%..Wqo;ZSMiI65A]$jId)_qp-MWdSdeiT=gSh;XbR:nH*V7-"ZgGP"HM)48SSpRjIrA)HE2^AIlV)_*
+%b+@()<t7l!_qPl5:]6o8q5_uY]%.oc:>&S#O1k>&a7mtE9uFG=p,'P1/+L,_cg1J<'-=&&p=*OH at Z(=N,.5 at tC-fVd?BQ1oTOs0R
+%q=S3QcUdt'<#/PX`oPi>79[#N0Y%&MiY]\4<WC5XC_2jqNL12KS=,oC;n8ij/\kT#2?JeJfJ\1`["f,;'6F6U50_!ocFOca^&;L"
+%Yrq[IE?sENqf.W;BCia7IpAnl'n%"o[r_1$Rnlt4d93P0ErNcm2.\#dC=%Y/!G,hEV0#R/.IqeTjEhknN.`,>P5Zp.(JVu0&@]ms
+%*_9>KR*J]?RaMB!J01kVF>t;I(61bYcSPW<V9FUK/\Yts.kR'p`Itm?pUmk2Dpo9P.lPoS35>Im1<tC at Ek`d4rP-9k]0X"+dpN)S
+%E,Mk^((ksVY\k*G??4ucI$/tcjT^A(-ICq`SaYY&Fq!_SWuso\Z]'S:>66ID3K.8l566`j\M\F,:NB\cYJMR9V3?3;R;W7qaT5Z-
+%*tC-A^cn,DQ=-9"&8>[MS#ba(&)beP0W,;8*=r\n='?s;Aeu&5Ss+eiiiB6>,q=POeV9l>ODWM=rqQ4gFun7XB,:@&/;5ahDaG;2
+%Ii7_iEiikS]\&>#h;I`_EmTs@[<((5&.T"2lnm;E8le+'5.fLS740(hL7S/_g*a6%uX-q4k/Be!$iKoS3QRI+HCXCS/6TEb1j
+%#!@"rF47F>E[L<NO!'SW<:<9Pq,t>Va":-9Mca=XHf2Qt#<s7I@)m0A-A$Y,q?=n.H>s31FMX74_r,qp)X_t+$lr`W)D at Z1!5q>s
+%$V%\i!1Uh"$bebrg&Mf'1<Om_1cKg*f:.0fq5@"M`!s'ap at 7*/aS#3MWY.5:d2K0-*l>.PS_U'Ua*ATC?H7fM[i]"l9u,q/i%)c'
+%HJ[<\E*I at 3><_"R$`/I_ciJs,l'at<IAh]gMXtT9"^l/S>8Gtj,6-PRVE]o)5?^`i[lo$KL]1st"'p/=&Y-LG$Jbpsgu/o\XRXj_
+%_C4h<]c?7uOCYS"USBshn4X<Ue5V(Fh1XRl(#>'-EE!/V:+7O(E$["&?k0UQrJE>'Q"?:.@>P2W31HFm`$>Gcllsb/25,8(?+Aj<
+%/_dK;[.m1Z5_%f(p1f^_d=alV?jT3b[CmR/HU6>J+3I`B!3*To^i%7T=N%u at 0s(u$$+r:G2$4-D-$4qH&j&0qTZbK>3cMLP#.iHr
+%P9\p!ILHEDhqb_Rfg7)_h]pMM#c"&TC4&-)($4bt18BOsKO2^,qhZ(>fk?KBii(f20qd.7)08V3P at YBL3jA=o"HSm3Bd4J8)2RD`
+%qE?e))3iZ2Rirr,=m!S4=Km0XhD6R4S^(c'3e5u.pbWJRALA$ATS9/!Os._EihHR#V)'lo[_d@@,4[B'`]=GJ4Q@(NPaocSo;RO'
+%O)ItZP-qfV',%aJi<,s/ouER,&<6baoaCs/]qc"P*3/]DEFHnVRJ%m%3/F[dk0"a7UQJ/lkaCGq$OGA07^seK9K+XkF*HQRYhI.)
+%8XP)SaDUqo1f2qE+L5tDf=q(J8;$d88MS^o#Fcm3R?oBjGgn(;ZiN'klbSrW_A1jDm6nE9Y0NW$<ns2N<P!J\V=[)7j\KU5,?;lT
+%4C?#p[/lIClZI5VSBR:f`kp(i36Fs1ojn1:Z<<XAJ.`BUXdkcVc!`,Ek=#Khi*X:@E-R3W9G-9k?k_0tEs<&j,*@DPMi#j&35g.&
+%/nHgF8+;<[,Z"?&rCBCaeh`\p"P%K$D<n8cKB*6+q)/E.P]7apgGCVmN1[tKfZ(:LEgIuq7RO40 at f,js>^ef(pr4,o#$:bU4DH)G
+%kA/?j#%o>AE$]'iUD$_],^=1*cFt0OgkqA-8Z($iV(`j3%Q0N`fs)*28g>?.f&7aV0dpHu233CQ12Y:cH*a-%:ZGLh-bolTO_)%]
+%[B>k#AQq-lZ:"O?!QNH at oWPMP#J at ddlKp;c3W==9L-I-[qB\mmq,,Q6/#e:'=N,u.<b)5EHUEZJ(X_R)3.[KV at s1G/b)a6A$Gq0A
+%nh-1>g;#>?=hFOGT3G4"cG-pBKsui!#LECIs7.92j$3J%?iU)NJ,K3Drnm_K+9(`drn#bco"Y+7+%GG`H4&hbs4`%u5Q:0prr0\2
+%h/E>]5Q.M[q"*Z5IJrX7r?)'j55t;kr at dm/s(;:>0=8KK-0`>t<7('&_0]r9M\l5#WDn+CbT8<"(<"#kAi@<BE4WN(1<nc*?/Y-]
+%(t:QZb7 at jc7^4gBgGJ)MmCTGdnt8IXm4<#LPSqqu)Sn(t.._lb!2"C<+q(OSB>5uXXHEUnd0R(qaqhY$jFN\!O^4mcMG,.ZV_j+Y
+%hn]gXI<,t$^L6\TF09,JAGqGk]"n/6_JVS]'ToUG4>ADZ9D+l86C2mTPgD.q.,!JC+rj?FXPhCe"*IW8M&-";M3ES9,-3XL_=VP+
+%M,NdVH5ni77,hH17l>#1/'@e;LR]W;>DSodEk/HK.k.MT/57\g(uj:S1RPlB'sk\*2h>@,9a;/Sj!V-j,p'gs/J=@Q2(%/9ROEH+
+%1R08XF_<U+>3]R1SV+"&Xr0r9\Q=_(]L&e;$b at A>Cs4?"ShKoTXhU1RX?ZtR0!JaB)RL"_M6qZ$Id6B/B5c3Ee6l#dkIH>+)Qbt,
+%f\(C8'qPD6H5WhN$<5A:9nH2N%V)qoWOg"FfiZm22m]_FS4'8`mnuh(OcO//^Ak1oSc0%:q#pMJ#t]K2ipCPKSKYJ(51I at b8Yei9
+%:]jJ*"pUiSDV]Nb03(a%4bI6d`u=2uPPN0Hn%;S')'#<9lgsCbE]ihpp60RU2><?aAi:kDr3`tYl1lKc!<1hS)BZCVUh%MXi\S%O
+%M:j\dgE6DMD-_364;o%1\Z&'\i4!UUK5NAc4`*>9#+ZOd#o at eg@="HY)JH at n$id\S/8EiU^M^$:dQ="K50")Xr,nf>_mRl\C['sh
+%-SUC:A1<i0VdFiC)7A8ga+)`RqU!+1'c`Sc\@fpeS<ubMfrEIBgILA_MN+XU\"Hk, at 4A@:gD9Y9qUBRch!3)i:8b;J-*>R/f-ee6
+%Z&m4)[i_2!dqKfW%9CcMfe^^]Es^:N$-4'0R3bUkiH+%9T8>W(;[p,%/qI9Db7.n-[o-(eQuDc(KJ'K&%QIF/Jtj%_"7)?]AZ/g6
+%:3J!][[5H,CI>PAacCCHij;ksA7g83.d3giG%S\9`8jSK<dK-%CDM*$c2"/VmC!S at HDssVEh<iQO"]1<Mm&AjoGlJCYL`N*-N!4M
+%T.]r%4gXB?GOJ.7[SP<V/bk,_+CfCbNVER)cPeNogD&V[hV07Wn^3&=@d5V`;W8!D[ND37>9LUb4Y)Bn;Pq%s1].]Qeh!!Eg2ZbP
+%*er[MT'WN$U>2poPEXb1_T;m_Khea at cII]0NHuEmk!6kt-/MfHnIfOphpCL[T/9O'Fio^+9EIS%?45m/lP-)#L-cfY?LAc8R"P&#
+%B#qmO@'-k at FTZ/s@!*slf>/L)X;l*B><]Q6%1ZO[N$qf&/fd&#GRbnC]Kus`ls3^(WV]S_KUobV"e'ul-[F2Cp?V"Tk!e`DO^[n"
+%+&K8oX$:BKb#Iecq`?@jp%uq$,[Yhne(Jpe-J"]H>n%cS1_>"op[DT'Xi0U4*+7;[J-5/87NcSE&,JBPC4P*r&bHKl,+"\o+C at H^
+%5#8TuNpE$Z_;XXVfdEI>;a+Rk4XM^Q%hr's#KK/FgWp-J at OEgR(EhanY2Ctl8+YE at 6QTTM's+&]\L4+:84*-+GSOcW\jZ^IR<hpJ
+%XU>osfU+!QDSp+3a^r,0_#)ElHc`UqrhC&KV]H)6O%@dj(!Lso+?Pf"S[G?pK0_\8$P]18dtJ2:h6cE"e^o:79j,/b[f:J4A^rHO
+%'7EtRljVV&R0D=S*8'/lK7rRGk*<9sre\r!/cOUJ(J');T'%cK/N])86Gf1qGs[,i%p"[6`!'D5Mp`ob at 7^\ZRnYdrq49]-oW\WC
+%/?;!p/\t6]V(kagfrRS^BQ&VF-SDL at +8:bKaS(f8O9`apA_sH_Gqr8Pmp1apFldT[?dW,VM'Jamf)Z"6\9TcpGK"O!%Znu'YZ;Af
+%_,L0Zo'&)G!mAibE73e^S)`.3j"<Pm;IeTg5toAWg'IsEbE_\i]iB&n"N;#DPDk$.B/PuB++"kK^W_>#Ah-LPmL at 34B%?i293:MC
+%.[]0TFLb61?G]!O[!YX>RK^oA6tZHq$_pe3&:&iXm*Nf6<4_fi;f6L5/rI)J.EF'?A&YLlF4"uDLG3ZEo@]L:aN>#,2W_3X[B!Xk
+%*6R[Q4"Gs!1s480o\/KiXq6.bG,/&@SJ)$lXAfue9ND`_f*N+5E=n+J>>3WDA'iY"4](%[Zj3\gm&7dZUbWMmF[5a*9aJ?.&hb$m
+%RLH.cectHDmgXd5m30J%!'nQl:b)X$fb=p''WVs_6YPH.A<T3BfH'DAKflPHJLXql8H9lJD49_`YrcpmQhGK)Gl%4e4)u$ZN"sGU
+%Os_##HfaT;+fe+-Qm$OlnddTCZ5[/b.%G'GQ,0MO8ssNQY9EV#R4*LL>0O94pSUQn$nO:B3Qgh*C+GIH;\8L"!Ad5kmR!bR^j at fN
+%OhGBkU4ENOU)(/\^c5m566Nd^iN`VbfD1Gqbmrnj`?`=1I%(3lIXel$^J*FOP_fTRH-,m=kVij'aCVMI6:L.%biG1@)T'PG\CiBd
+%D0sO+=6PM15UL)SX/f:DOIkF:f=!\7k90CKFgK!MFlfJ6!mVhL9>LAT%fEYjBYp9oZ4qb at dJdn7N[><rS>C^hXj1jSApm2Z*J]rT
+%ASdS!oha<n-Wo!5#j:Z1k)&+d5fB[\[8D1l`%0Al_)m^mk;"?Jo^Tu!QhOSi!5#ab5[C^sY_$Z!J/fj$3l8:oHmA0KHmYFkTp;(N
+%LChF/pP/@)L1?%`kL[I/[[gt",(e62HE;t_'"bPR<+L-*F6RFW!B,B%F6sbCXegB*'dr_cI&Q&cLR3"WSoq:#0)7%bRW&DF-,@&[
+%<m?tr(XRRJQ^#T+`-43rT-s0;U1Ub5B at S5PA";T[q3W0KpE:p.S at +QXlMlY_@lG#42QXRq/jnr1^lFj)>e8 at D>r1/6nn3::</#2!
+%.\.T"_^XYSiTuL?Go`ZlZ(Z^2;OQgdG.YN%fSuRU@]uX<cu]((fVSRg6pJ)"d1MS)[CT8[*Al]Z'k62#L5hAIF<%q6r;MF)80gV)
+%3A$Z,'PX>%f6R][c4gmgd&`0C!)-_hR<NLfVk3MVX_>OX!364q;\6%%\qN=MH6%])(NDmQqPau1B$I:#=[@Cj(Y/t1L\bE26kGB<
+%LMW"W=SAV at Z:<%>Bq#Xqn_8hO:B9"gnb7]j[g#IP51Yq8jcrglY-?9+?7o:T^"Cq2>AU9Xd-D at 0_>#bf+4h<A8GIKdE5bRsgh&D7
+%Sf`'3\<*]ML6Tl=2mZFDT0+'u_/o^eh*MDYKLB^GRh9ZU6o8/IH=aN(C>(%C6Np.H:0#O$`mWimSQWr/&l)h#YCq<%BGln'VUC%a
+%D#+S$\>Y),'RK`t+/c[;^F.O'l$klK(,%OBMOHTnPNLGQ5O#>mpJjK;!oB&<5\GQ1Q97B)1*g4FQ+i_nF3;".V[J55/LU/:"q+BQ
+%RiruAgL0h>[h@?,$rte<es9<57a!Wh>#_>co)Y66QKcS5RI-,MOU+GoLLWCq\?Mp:>Wp4Q<rjFo$QJE$D#jWFC-JJ9DD]tbhtQIr
+%#Ra`V<fbs+HUU57>@PUdp?WrU;n#H@#;2OgLMp'0`;hN\#nrn64V16!"fto-IFiE7<UT$lD2mk>9j+Jbp_;e+>+S2&InnAAeb03h
+%Wr9ABCL6OC/_-]n%_Om`_WH8af,1ZA'm6uY8_Peu72s&V3Hkj:%BCi4!@BL-L)<#U0Tl6/BC-`L<Te*</q]9^\0NVqZBK!:ldVV^
+%gTHejaR'=OD0rOIP8;apW1M]9>kLe5$[ZNX)$&1^<+Q at D."l1"I&M`+5U&.)K)EQ[)\UK_U3SH36>RUohJh?i8!4[[f1B^-'B[TL
+%+6l'uTG>0'gP4gp>9W[=0e`49iIZ%(#net#="KT[L:'9gIliIS<f]P:aq)@%LD^8L<k+ at .`8?V"0:\uO9Sht;4*1%:fU\'^i4:%l
+%R]c]Mo%M'UH=a^-X@#=BU'1.G(9$dZn3eG;M)*tS=dq+l?@.c`T/KBXR87(W%,Dc!!V9E`RoJnb1lJS2_'2Ge_Bl,(a<umb4)5=#
+%A4,G[`X=7)PL[SmoQC$-eE"joHupJjb`.j%fZUeeD8X<9`q<A/?3&XjDLt8ph(58"bT.<l1ujE&Ii+0FXbQ.2^b6lH[SsF!U)?t^
+%[c]Pelng#g.hP?!..[\?Nh(hjd,p7Q6U?=KLDj8pO2nd6+2-iKA`4&.J=YB4Ir$V$6]Ao5#O%BqDCkcNC5;jGc%TTC)B2eVr@,)c
+%LH<eO<b at c-R`F(b*\GHK?s9iAX9#31G8H^c0FNV1fM(H48.'3\VNDXCiU;$if)VM;VnAO6I16SKd.Ql'!h[jqE:$s0J8rUJ at 4:&c
+%,N5L[^,2XNBR*RbXLNiE'Zf3(FP&\M;WaMF)i$#h\0C:,"Y#rB-6Im.02ZJ?$Q<6IF?qF\B]0)(B"1a>l!kkW%jGW_9t1=k9WSE`
+%6ArVIYUIk.4'%u:ZYnD);k+7`p])/Zg,s6taGFcqe8,fCPUY5o^eAbUG<-!e>cr4m:u6Si/QQ_TZl:k4NR&;dfd=WF`jT"V#eCUM
+%RF[&r1W3+X_27:BQ6P7&faB'1N#$Z]fi;pj_mq55Ts8SWYf at 0MVe_cIU"p6R!,uZmE/G+fn=*s]RmM at Y)Wis*<QkQZ3'I6ZN>=#<
+%#Yd8l)IA.B6h>hcZ\j3V,]%bSp at TK)>:gN#a.Nk#$jd!j$Fn*KH.)CtD_3NNDC\Ql%ai,Fof[mb2_1uf=&]#[h;(_l+mq'2s,Cqq
+%*36eK[[UcbCe&:o$okca^F>E;L,T46A?iBl)E0Ni'/+6hrL!/Q_k#d_nqTpM!p&`MZ7K6AqNj8pE8_j4%JrRg"!oLW9i^KA9g(S<
+%ma[Na\FnV<DFcU>mV>cV@:X($G0!n3GZJOO,TmUf$VaZWJ=JdPTiU8-kTeB\-2WETFFn>^I\#=%/+M3GVN$.IJ25XJ9e-f61X*;,
+%9=KbFPOEYGa2-jhF^l@<T[dCi]`e`U)VG0W3rSum7d:d_A3V$7KrI&e_;!?ecTsa6?AA^n;P)$U2Ad>a*\%*$*uY:h?/-tHAk*jK
+%:q=T&"r',?]84/\i=0)4B;$Jk'HLsZI>rs-gLl;:D':[iE2KtQ,#P=3G]p$0\Zearjr(#j':t6ei1<0GBO<Yt6N%'lW3Jol\3B9>
+%XItS1R:WECl=)jL(oJ-?8F7d>8]f]\=dQC#k7A9RfoP6gT9Cq?rdO9<Sam+l4?Ap*$r0eBGS:jWXPdURA&CO)I8+p/1n5`s20(p$
+%UT[h\8M\ddO8$^(Q@&+7qON+(LWeqM,gB/AQXr[hjSgcQUE]]-1c0+49Td'4IoP>1K91%^IXpU<QWR+=!\G3?.)&l["j8:V=kfn2
+%(7]8?)+#Z+,`f$N8g0>WpX(LG.S];IBG:,?;j/eeZsJVb_2A2ClhR=qMYNlDBUf^lf6d/h'\/i*3e"b1(gQ#PYOXl2a&dXAVn.<#
+%J/QJUIQYR#5L]ZFK70d)@=s9_A+9];j8A:=YF%\Yn--=<$@#'[Q"3k.qrBppEU4BJ0)E&_,P at 3T5)Q2uLdK[J?u at gfklFTbe>gc%
+%)Do#34/5Nd&G\fKpu\bQ$]#n5?Q$7Jobk1\+gYdV)UM11%5ca,$iD_r$Lur3Derha?siG;let.6O7S6SfSe,\/adrFkU60LK:n,J
+%PWi`OUaC'>g'VbIGNJE4?Q+9o:r9`e5bK<jTQ)I+J#M,GQ0jA'0[s[EjUIc*HX^.Y,Wh at 7H@&%>o76`hW8D_@=o@@1KTOEnI[e:Y
+%a(fa at +oo$;JMcP<:D9%o`Gd?_0l3OP$]N_(8G%,8.ti6IH=P,JfS$tnd`iU&`EQrfk[DpIOkV"l-T>5cB\5m8OZTnE at DXsMoRL`)
+%"ENdVE'cupj_Dlq]"<.4R*02Z%a,E$9Nd7*\@o'`](Lg\V6A0fbDst1'd_U70Z/ceMk6SqJAG8L\n#,m<WF(0nSBksCVc'_WFD-P
+%;4#5XmabdA$Q)rTd5/YMeUgn4L%6^8WuA?ldFngYnDWJ0ZtNYtR925,?IGs4W&HX2 at VUM:NZ-LCR=/,fE<`@FFH#0&>7AqOh&F2W
+%oE<ILqY$#ej_#Yc5KS"oSSDRl)k/,<X+5P(_CUd\2igb/(3d,]#`fu at 9&Y[`G!QZ]H.)\c%eKOfa*BON/sr2U`:M:Z8(0,..LLg)
+%OBMK:7PM-=F^nT<ZJT!Z>j.-Ps2+#kYLSd:97NOud3mTYXTk7cdEX8ES_0SANbu+1pcd*.Zk<$fKNSMkYg*.i6)3sT^%OCkm&[ZB
+%E>C#u$R\- at oX:@24-c+DKqkK#D-act$?3<a5B_ at m4H43J6@YPGDp*;+V=c:(_c,LS.<,`a/VFeX\i,2]B&==X]uD7tj:e`Y?jg!<
+%WnU!B"LVsk[^3up;^*0V.5)SK.ij?%^;_A3nlu$u<`-E\Q`C5uHKAYg+s at uqVHVslV,IpINd,!'U*<&[T:,`D/jkh*&1?)YI(b3p
+%#`!U*E<[(cNgR!a]]^.T0+!hN*Bh[h55lIG9Eu[^+Bsu1b3P^4OHUeMG3uE!Qptn#(rh9"N%+:R2Y`Xqg*RrAq?7I,OIDEfBb[^E
+%*LO/kac7+QKAl)oo[=_o*"q+`UOqkjQe1G0#+2N',M90gC8oX6]fef2Ml#JUHoiC^YfdXK4M1TS&5h"RV*:k)/#`]O_BR=$^?%DM
+%nq/^r;O"r+S>MY;3s*Nh.4o:%4-]+h3J4L2j3PosmW&RR%P3uob\sHPm-/M5atcEC-"5>p,u0+o'<\(_Z=k).NDk;AU[_87m#8&O
+%i#jZt9U:>c-A3UKlm(l@@`0OgCM)R3;hglQ.IKRL)%5$to3&3-9oD3D/&XV8PSUR'R]TTRCKmEVW4RHR\fYCgh#^NmS<CDHkO<T%
+%`0?k#l8oTkm&VX?[]Y&H&*9I;gV#",H^`5J9/i85HZU?oSAIqZHT*aCk('qVA;)%fs3"qGq(ceO_2L:3$(qY2"aYaNL(,^<B at pu9
+%;_*)nC+/EW%P!B>RN`9J3BjM2%$q5K\DGKS[&7JNFCK3b=Y+XtSJ^Yu/8AA[l%WUBY/qQU2W9cXkS+pVY<^;#alu4LV2gOk55;O\
+%eQf3[f,F6 at kLmCO=crjjaUG1QH.]2!5&tHF:&9"Ef:<=D]0uHnFm#m/Gc4bF/UT2"0CjNg1WA+YG,qRC8l]o?87'Pah&4tBT;en%
+%k+ at O``=,P>1l]R_[K^.<3q79e]i at iA@,BZWLMZI?LTG>J)B1$aYoXk5$)[[N1-!#2&&'9Q!X<0GfU-Uk=KLDGDSIg$p:eu&m<PtH
+%kgIe3K;]br^CTAnl/D7KYjh"eW)g-G>I`h^j\tuc`uDK)Pm/;cNsrg)Pj*"`!7^Y\T!L9F,"6DZW;8.=Q at Ho<1W>LiMVXk^0R'W<
+%bRSRMM7,$@RS,d0B'aZ:b1LJJ8Hb%Wdc>>FI;nkMQp"dUZ)a*6h!Dd&AepCB%sh9Wpj0q\F,%NL&c4&+8hME"N?%KPSB0\T43+&]
+%I"k!?EUoJh\"E!5[+5,5M^[/?7#$jnPlcAh-:@jL(ZRJ$rMtTaZd5'V%"T!(mS*+S*]M&@.@)/l1MH*NIZ5CD^+FFbqe0C[>S#s_
+%\>L[$SOrf2S)8M67Geo6HWiTZ5 at Ph$KP%;[LUN9<#K#qE38td>n at -];M?PrVI[o6N[LSd)`#R[IVFR"'k+#28Z(hIhYDf#lNhfke
+%1cp%H.*SZ_[$XL_9,1;2s0?IEJ44 at +M=9_FqoE!cE(<MraHoda43\Tg8#pI.P;pR9rnc9nN2/X^;Ds27/$mOcc^fk(k\W?#E^oA0
+%?mtljbH\l^L at 76edtN3_*VEgHSo&]/*/n]!R@=sQCJ%bo\ZSW?&jPe at 8M$%2Fr(j)9434S@?o=!/&#NPr1]ij6Z1fJE+e^-&BgX*
+%QG<+.%e\8jF:6etg9PKo<&?jl"u#$C\hFLZ,(4;$T`!H9=SjtQrB8`S5[NqL(S;=ng^B['^b-iJSTEe\"0Qlf)WG-=R9HPY\!&*l
+%7!rZ:"]`V"NmF,sjq at l=e,[m1$8rH7rpXS[WUG3h,Nis?dlrb5R&iE,$$L()(sY!MS2R-aNbb=5B-kt<4KY.f1mO(t%j(,DE)2Op
+%TXL]0n&NNuMWib)dLYTZW`fEAWKt%j$S**`V*@2OJ at QO+Wk:_nCA`Xa%dkagU^^8?dP@]\nm%0SFK)hB;#SSUPs=*CQ3BV$8;fQN
+%1^,*%>)PR8mkt/r74(^fdBKRSGZ,;Nh8K?u^DN=!ge"qa!-<fT.bI63c<t[j\Lk;4mZ4l17'UfhB at tR-R/\j=,jDdZp"W5g\p9>]
+%X4N/_OG[MYBBM/l1K.<<`aDrpbfmb=RfSF%3G=g!M6=18$#%$&CRZ:eDP,=Ue2e4\gTG)bp0KZKZ&A;1q1Y6FXFOTXa.Z_+F$H3o
+%D6FF'?`F[;baiKc_C3;aRfM?T]IR`]9kW:G]';oaGjFi(3.(X.SiUKTfGh]%@SuZ![fnr>UV3*WeoT+c_:T#&V&<DJFXSQW%"u#`
+%hF7:VA6-#?\6_n.!o$r:4t\Ao9*Hke#KBXM(k1UEcXDY(Fikmf"^^WaW1;@8SK^YV*OfD(E;LHkXsZ"cj(TASV3&Hg9PsU5rV5JF
+%YV7:V*Ej4K)t.2e#;ao5a#+n=b,VVI=iuRmM+;P.*.;Ue5.u:R6 at 5N%G?ggPe5XJM/]]<"-20")LHHOk%HOV--$dReo*ak*(jUSb
+%"e7n*NLE=/;'"n1=j]i$GOi#Ud<VQ,KFD>"DQKa at 0sK?@4]p266hUG'Y0lN>rA9Ya5`b/,Lsga36QV at FEJ0H4/h'#?6UglO:0rb6
+%?0^$%pt-n), at 2C.qF&H.HotG2F[R"6"Y-g<o\<5q><=4.!aUik;])k^:?@](]6L<3WWs20<o(0*-p8].^Zh!IA+D`KP;"2/SDM4W
+%,.%K*P[cQ)7QhRVc=gT9P0!X5%71_Ai(>h)-QjnRA3DX*eXPOK0.MEi4GPCpWY'kdlX[i].HaI2if7joEMkH0WfZNT9d%4<mh)o\
+%7q at Cmd(1SXeWP&s)i=i6M$9TZNt`Cu]uL`Z[ZtQ*M$!)V?NAGdRoqd;3s_*D3Q$1oC51G%7A]Y1COCG+\:]5T8e]fGEYoD%g#[GP
+%;4P\Iip;Asm[*hYZDWbS5Vg;Fks"8_+TqCDbn+%ANJ5ZA5jS@?OD at Gp:emM-3;7'p_A%""9r=l?Vf3mYa*'qn[9G at MDe&Z,hs&_C
+%dWYAQMP6(Z<m35'Ge7,r"8A"p[;el[p2WuH[Z)[hcb=ooBN^42`]eOjN?e@?9o1WDID4M0jtEJcBB&pdP'g8T?=kdePQeT\`hq!=
+%/3g\3JH5SsnqUC^Z*TtS+^/42,De7W\uS*X#_$S,>B>O'BYkIEUW71HCW8-V_aPm_inOcRMDEgAAaI=DQK'nUj[0MTIr*%+ZM8pp
+%SI<u4kquP\>"m!BlKeB@)V_fZeBR`@aMG?d2EZW$/uWhKb3K`WTb/1lGodacHBH^Y<4;%m'bPi.[A+\a*9^$-9#%mNAH'aKI,I`q
+%.65e=4MDRHgV'0$ag:>k3gA<Z"0n^-Z^?MRZ^gS[%J0]_`!^AAhK^Ml>Kqr?gbr]/G'i)#1pHlkOaJnj$bRFW8sbgX\40)_2)$5$
+%jh!//?%;2\JjW+u?6)#U0;doZ^NNdGY`a;TV!;IP0q'l@)M>EU3eol#JYL$ud?PFQOstFr/K5r:6,u$agU*jDbt3Y>+Hn#9(1uTP
+%g;osN2VT[OUh>DH<"2YqE55W/WA`AQ&;+AbQ\A at Bbi=`2d\U.mW97%,.%p:1N!9CdEaD at H>Wm8hUfCV5DC3:^^EdGka.gJoZYN0J
+%8n!@\-K[)fAToV-N=f3>bL!VOASIR?\9\X0R%aVL$V,GQm+3FRHL*K#n%-;DGoHj,`iWBDKaF"/4pdo=6aJek9[$7uiTQQsjcmQ)
+%,W4XP;P[XeR(D6lCiL^T,n^`8%\M1)VR#4<qf-nt^Y7q7+I2MsQQo!RqbAs6;)2tX[$J3!g<:<_fupMa\<>!2^=VV/rRB!S`GR;X
+%/`=e^%_BCnKki\&,C2*@0P)K7_Uaps,OKWTF&r*7mRA^^ZI0VRp0rPC'R+jO#Y-pePq+q(B<'Y2<Fp'==_t]RE'i[BLS::&DL2Y[
+%%L>F&<k7<`B-,5Neo%.I8Bsf]5uEmFkSOi3f;O#]HKkSQf!bt"Cm at 1[L^NQ5&%Y202uucaqo!-'2sAf*REI(LCTpW\]O(1*Og/]1
+%EZ"J(XIW>-bNt.,lm1#ddp!8g]1'kKcDhpcqH3T"'lNKTJ!gE!QHqmonB`p&EGEu=V6fo;7\53SOfI79M?inO.T>HIKYF^OV_F.U
+%fr1NIr,Bt(?]=_s>r8t&hFcrjh,"TK+kDT.0CUb]B57XjqY[4Yc])Gq8K5a!1llq[5bpUOmW"hV],\[!_A;8!VYi[NpM]G*$mns^
+%ioKi$SfI'&PheFA5es[A5`L&?CO'\c"*6.F<HrgT4+9Ia>Js^=0FK@(&OjGbfYA=O1kiTCb_aL+pT_"AjWSU,)XX2#_jGF,_t-\-
+%3Fmt_JW at OQ7kXl`ltVGt#a5-7h,$88ku(CX(2Q_TFj;cE&>Ge'00Gu<7;*6HB!pRmTpYPpS?SDI7)o>-!p>;o3hF5prceoq1M3?l
+%F2<1hh&/Hof2^<Hm4'h)5Sk?,4"lh<7[)+K^/M$Z&)N0u,WoO#e3L!b,<H,^<ZKsiJd_op+C8sTe?`hu7G0mmC%bf"\n>!pAYuZV
+%Yid[Xhs1[ij<?=B(4o4Dl)pI7KW3[f1[<CdcrjNFlp<sd:?M/;3D=hQZFNKQLF>gICLjR]*.k(LEY)*uIL=I6=.+@\E'48:apip!
+%GrScRfV%6=T,OCkA69'Nej at W]g3'%W6sFLLVmTCHB_#O]B5=F[>=kbhCV.!^n"_BG at k/P1?i;ZhDX5]7!i[qnqrn`-h%@>EUN/fg
+%DEhRijJ#;9Y,<#=;P"R34nR=+l`HOr_#7P#oferskjU.e,^9PoKr53oc6UTN'P!%n3C>cuHJ!I!3F[@hP>96EPur2Yi.!YFnB:oS
+%OmmO(bBEgUFAUK(>%g7/P&KSK\G%tGe11mAG=54Y.9j/4+h#,]7hh+--o]`RfoMc#+G-S8*jS]r6IbbCs89LN`e)dB)q3k:r^(h"
+%6FbO/UsdBl!sQQ$V9rqK^)g%f8f;R!['NW,9)*7pCL+OQq)j_j at oi>0Q1:sX'l,^CV*)Pt]9!*?XL<-9KDR*Dq.Bp%>2>n*M2H=B
+%doY%ph<4=6#;"Mf>L3<A^.&;lSDX[Zb99\0.M*g%RTSO8^GQZ*^%M8!khm.0EQAUn+c`dV$&mo)mMn]u&EW$aVOBK"[shm3O"B;`
+%/YEgJQ[h-ZQW9tH#<uW!/cM@'iKN,]+2hJ_g:^i8qsTp`B=kbZU'^o22n&E%oO&YjYS/Y6=@0Zg1NLbo_Vfj]cP6HmRL:k^<AY5X
+%_7mAU\e\]WGG'\o82R(WZtqWhX9I3h8E!RaJ\q5>C.;"Ah"OG(($;b^,[OX3Oa;IEjk.6O(N!PB&l[Q(+n<(%jJQTH_1>VIP<J[\
+%*[=G2!np$FA6J;3Rs`uEA#M0&WtDYk@)gqH`M<lE.PmX2. at MP*f4g],"<EU,-d`/1d"Fk'a=ScE>=M>^?!=?Oi@>fcm6c*b(NoFg
+%[XMQ><6Ao+iV4&D0=jH"+cH10(:D%i!oXV3T>@!$(gIk4%1dkl,<s\k>jjn,?0)06f..u4iruR;10JZ_-26Nnh`ReQ5d at N6chdR:
+%H/JWk9t7)*mW2KjVs!1R.U7gXeene,Ne55Cq]"%k%H#Qhio^uCofs4/g[4_[\36Qgl at K?"A$]A3C_iPZ'["Cp+o2BoKRS`Of7IWB
+%lKNX(U3GCA5!%8i!n(J&Ne#RH!VKJ<G[nVIoBB`l^VM'RW\B$M8bT*CWuD,6#FkrX?M<8`HR=/bWqOPZPQ[4l38*B6.Xn_i$($k6
+%R6@!)@BI-Ikj`.+LM$>+*kS'O[2PLejfGk).!Eli>ud%6r!FsU;'i!c at Z#I#AZa2ko3pP=J7L&q+)cP)EuE<3$U=C0omdTm']GE>
+%\u8V,q1E6a12FSum>lQP;7qdH0N;$6M7fU@^uEq#Lo9?uO4PUL$q"V%3;k:j<DUZnLVHYlRe^monZFa0!p$_:(3hdhZk5&o]^P3R
+%KYp!aK1m&R at p(+C\$#_c6,D.%0/##?TO8e at 8<-54M-BcjM*E>gWiOA at AT&#ks2aY,97U`P:tt^cS-#!4$fTBD.Ji1`10>1Oqc3e&
+%3`Q$s3q^(jiX_9*7-E-WJ-[n!?U?bl&s,&dlQ&4HfT=#h[LPfe.4CaY7M1cD,W";N5#u2*Uc8pNr*1j"4Fhd0TZgZ.Uia&iDrj/g
+%W!L,oT9?PMaq-g6L#R[!P]s\8>Ml1,-/c-=eLn_[c)S>9fcX%\Of&]"\TI66LB8:^?18F8j<,tWLhN%H]`"K[Wtb_*BoM3_YUf/g
+%85VIEU:LpjMC)TFL=YDI?=ic&(>aKo\l)>ufK<^afHm5,`FB(6i#ib8G:lMlR"@7 at X`SJA<l3#ai[Pn0>\(p%6Em)'LQd$P\EYq>
+%p=;nGC'5;H61NjX?>9OJnuD"H7+o'l%O3'8XLEB4_,^Y4Y$=ZfF0(8\H)$nC[e*d_Z5'.Ha<Ce("&=Zsa-+e:IjrHXn%m%nVmoTb
+%Iku^:b*/+PH7aJi*Re=;T;*T]%KQ;k2A#NDX_%OW$XMB!S[kg$S!^h'g#ds%`h2M.NZa)#PJhSes1HL0,=CIAF)'hVn[TBEo(ns$
+%b=V%?Zk,?lQ+*%+KD_=2i]T(/#faA/'+%4A_5BW`=]*K"=lo?%5@"AD.E^RTZ4(,+"0aLP\Oh627k"[=IHH:UO54+D8%_@:6#`.u
+%KlI"fQcmK#S\/9K8XG'pdGu]p&B!@?LV,O0H&p8BQ7<Maj3JN$l3jg^0/BT8i85L?<]fgFr]KuO(D?([:8g)Opl*B1,fEs56T+H0
+%W at RL$[j_>n"2]1?KkecO47Ukl*;ttI>Sf-Bh2DO368EJcFRTL'Yk%PMBS>$3lHh31RJ'*c9DmH45TuZC?%!\SDq)bLYZb9AYT4N@
+%&NX#$r=Ru)!j6GJIpVlIF!;MR5?J8RY%@^Blp>?mfg>C at TH)Wh!,.f/o1C2k>U2P at r<FCkZ-aOrmd<llh(*IW;YNFIC?!K/`Et.V
+%V=]Za<0IdHibq/H4W:XlNJ2>97.G5.c at S3V;\]u<BGC/C]D0+h4LK-M&gY4#)0E>kIPIgdrT+6Wji`0p=o%[7Q[.X[ibCF1Xps$9
+%\N+/2ZGPQmDGKrL6jm!oSmHmNR2@"R/.i0:"?.T1N<]4^j^gnenFbg0J+odBb<Tf`[u`-u(,XEsoTk4P4%N<;^.alUkB\irL^dm.
+%#g at lbik3f9ME;7%!5,)-+(>["6bJu3lcC;neniE45Cg8n6Xq`BB!UAg`NY<GlZGD^5n`)>r3I^`LG0nk0'eF+_]JO6T6nidpZOBV
+%'@<^";ui1+r at _SLW](2dbsTMe#2H;XhKlLSiT&lm.*0s>JaGj(d=p&YNecZ0-<ft+KPMqG4VlVLmo3id6?4F=BGnYj[bHXo.4AU<
+%$,d]/A-7Pe;4n%JR@$\^'^*\83U"TrF0IoCBP:[6`7?$.D0DbJ_:WNR9nb)oB,>lKK7E,STPU=4a2Y<G669TK3:-n,(2&0j/e"t%
+%gX-]L4r2E=[Ef;LgGFsMTdIU/a67<BK0J]3_-n,A3a],D1QYQ:VOXQGjY#2,i+dCC!se=(Ie)03_)J-=M)FdSA![_h5B1,:**j@%
+%jFuDSFa?-Z387*Abm?YD>[!\f7bI-h1*Q!?f@)Y9bh,p>bj,[2U6/fk_.4)i_bGSofq0?c4nd=sjgM5(/8;HqZc/<`Q0\aiiU37b
+%ak[KH$]D+JQ@\X at V#C2n$=#s]H`>it04hpn^WA7<J'9N%)VfWoCG5CSAZV]?c,=EEh^!K>RC6d6k:Wr+9mC at 6o9U!KCuAX%F&9(O
+%HU[`kHGs5fZQEn#O#d at 9p#CTA7h[LSr9Z(rj'XTt.a&NVl:uhgHcUk8Z>)]6RuDZ.Q7Ws8`I'`X?6k3;^\>6&U!JA,G-lM5KVmG7
+%fs6$AU<kKXa(b>Ddl5db6`6:.In<n9ESS-0Nn@/)C\L'M`G"=6DC9I8-bLQSSWm:CSZI(n?U$dLo%(r:m\O(IGe\4T6n^-Xl!c;/
+%N[*c5. at 3+5_WPtj^V6'3G9%LbhT`pjH2kO)e, at 5Qs5GmX]RtLeID%kbGjmrdhfiLH4LOd]-T#]Edl<6]iWpD5/sK+*a$)%YId6.1
+%SNg7+)mpAtd>i5Mki?=E.^Cb(;4$Be<iuMPfUOn7o$4ue3,8PthrOik"Ne:oW:1RIaOQbCbZ]VSF<&\[L$'SL[&/fXCS=te`%j6W
+%-!,^Hq0m!jP+T=$#k2tAXea\sr95+[4&]4/>6i7D3cKS]J$0=\fZl/+pqA/Ya`R6uNX[e&(=BV-qo>X/E+*AqgQ#aQgs)nUFU6/_
+%lYRI2nA;Pl62K*JVrVT'gXZ";\@?("hadDkG65?>bG_>AHq?M6cDMh68m[B9"EYn**pnA87_+W+BCeJ"D#*=*rRs^8f!SjJp)1TY
+%ldhKp<h9ftq:i(&g%smmCP84,]nU at 0pQ(I5s3ua04 at X[9;9r>)P^L0Z[jl>s+Dc+0#e_qjrQ at P^16A]e:@am9qXiX"?TL`F at .hU=
+%pNK^Qnq?:6Ie#IQL\>3GckZIuDZI\+Hda*qgY$Lmn%u878BV+'k:V3T^;`;0k4:3Lq";s[45\01c7e%2HD$VV6bDcGaSR6$E.Ej.
+%_C,L]dYZ#)9.td%:tt[8;nr>.r'MF#!5ZjL:S'iG-*]c7?9DN4i2[fE>,^M(=j-;J[nYNEP'7-DhG-J]kQ$jZnKkQjk>#YqO@[(G
+%Y>[S&4i\\MGmR-RqiW?%6.QWI=pOVHfK_auPKOuB`F[5u_7#OF_U at P:oe^tWCPuV)%D$dMFo2kU0`8HUY$[B)--PfOdD_%sj96;c
+%FOsgE0!r"`mBf$3bDrsq7D.Gd_&FrW2&`Umie[9AVM[)F5+UR(2RHF#(g'O[kqcQ-87gX,QGMN]i.UH*7i&-YKJRg-;!u2/3AE/Y
+%]Z6q0oI%7sE$\V:e[sbT-ZAb"3!<LP64Zau$lKFu(!`!:rUJJ0TD[+sN9kQ?7qN&RfF+"bcnL:N<^@goFiG/@SiO%?'eq>D<(Qo8
+%8ZJ>:huAn"r&<O1TbK#D-QN/=:d8TJqJ!Y)#kdZ)p5Yf]EVnCs0EPu/mpcn-A6"%\`:F[&>>IHmmIQh9J+5C!4%f'e8-U*71*94Z
+%3U`%9Qffi:4o^[*Gt=gt%Eba'\&?U:H$:)=s1#Oj*s9j<^K_,?mFSO-*3;nhl3RD$3f8[l^":qDHBgEm]T41r`S5%pp+_L5.bPh,
+%1/)G;RX$Eh"X`a*0U<"sDe1>O2>p!!%.;_F@?hg]J.3 at a%5'n7H<n%@I_D'9X73173A3g*V]Njl9<HOB4[-XVr)[*8qfa^Jc9ohO
+%3(;gJ3g>XJNL1;?NA1-+bJ/?Q^$;&+_'oXQQ]L at T3-F%;Dr62=ApHcIheN9ukjct^a:G[te6]?K9k.+;DaV;4lk^1\R)LrK.;"X7
+%%mq"SZgqZ=q2#qpl"boXMnp\UH9(Uj3$\/,Ed5"3H7:k0PC2U,LIQj=oA!#O9Z.gSJA->d-SiSFma^V7Ak^2g5(j6)Msha6%1jIt
+%j?)+%k#uIq9>-ff\3T8(!5b?#V&,[l$P#hu^ZHER&C0R at _NR+Rq!Hd<$JC#Vm9Pc6J(MMTB<@DD[[G<"Oomsp*E1l8-Q$@,6,Y.*
+%'@\5-jG:@LI4TMga$WY98jJg?<3I4G?+^/YXXu1@^R2lbe31 at r)K@#+f_4,5]ca@)K&B\GQebtkfHFpK.gt_#Wg0ZfUd\YiS0)(*
+%[>,_hnaI>o_Oe_3i&XZ/f;0Od8`LR at 8,uGK_G""&$*T66(rl2q"r4a<"-.E`o$Xr7*/\N]HersIbE?>pGH6ns$ir#;=bBrF[F>jV
+%5kFl>^/nXX[]-Yf*uf_#d*<Yc1 at WqfGI%D%N`-&8cj!C\\7Pr`X,g25\&PpF4`32j7I_-tBFOI"*0no(I,43*6KD:C=kE$F"_$Kb
+%Gi9LAUUqmj^d(_G#npA#,qRJi9o^6XbnPV&UG>6/euU9t2PHC7@,j,qB)@q:1;km*U["+V+2\/&!.GYLuM((E#_d]P+R9]>Qg
+%or55RL3&4$hp.ign8e&[S)/s%NlHK\,]qkkg:YK<DF%ctRqsi&T"NaFkBV]TX)7D%K*hc<kam[Y#r.&;*_2OJ$:Wu_OeYeLe0SNt
+%MqZ?!\j+`\KOOT&J!on at d$=!u&e4KZh*`Ru>_gd5Rp)BPSf><_9[Jt)DXdob'gCs;/#\O'*FO,>"Wqroqd$ee2s%1QX[q8<(CWh`
+%Z+GJ7Yr1bJZ*@JP<pX>XD,gT3R*_"O4XWu,2PKq39=rH#*O,Z1Lo;5267;X66A;a,=C[\.?1'6O.]pQtkI=7<Mp*r6Gi_!H$-09^
+%lT?VeA*D!=>=?Pb&E`d]k-mAj0INc2g9!fp,4AQ!MP^WoqREO23IQ?k&t3TgFcaPq>GWdP>XACmp-M8I:k5,"i8f%O)DpO_<iVq)
+%g[lXN+Nq[hWJ/Ca+CCcL;<@ae%fKj`$ag_>U+#2Naj!Y`oU!rYer3R.o<r3N[dZ;@d,jm[/BaU/qKP_[[0j$qHOkS58NC6.[dGS<
+%b-N(l'J:B]T8H+Y$g49P-KBn_a%N+#l1!EI`LIiYQV5L2AB5Vqr/fUn"KMCsk4Q:A.]DuE2CC=ON>raeQ:E8Q2;_4.IP%e<aGU(m
+%Da"t`=XSm'$n6f4Y8[[HEmIehf#i''R[#qEcf(Mag9Km#Qk8^Q3VFX at D>0hh:"EmBo;43hCu//$,T%X"qicCY"V2T#S!VLLjX[mK
+%>dWM_2eZg51eY9'=MV@*;ST?ce7@#VGTZ.Am6=K:,.8U9T1XPP;'CS%7&r0$#CR>Lj>bFEP:)-T`'7!_)E1>Z7]YYZWVpAo6rn'+
+%qA:?986%6j9aE-Da!lKqm-a((kqF#'TT(-rPaal*o]4-*\]X1sBEmR8*k;rlXj]odg1;5X_V-%tB1a/dJu++i9La2rZ_D at cWn$!\
+%bXT=\K%r44\R%taKC(4 at 4]5d(b-7CUVc6%9QukTM8gLU0L4:.F["uJcr"rEoXI1DEfnliYJ#U?OY8>^d>^u(H&LRoA_Rt7l#C"Jc
+%n_7WW]\`TJqc;k3juj=RUn^`&GV\a[DR!K^j\ZNnNblaI at l`^r+4kRA'jbKdIp=q0"-5>$/(9pR[;JWsEbB`UF#g)'X5T"*Zg/<9
+%jLfFEOSF:j!lIC":VadDH%_6D7NCU?=dS.TH'nh[$%,A%Q<G=J80!*!J/T'Oh!#5d<1 at Qh8c7;6d;hPRc=&VHs6]dF/7ir>.OW-p
+%OdgiC9-!>CN8'A\:/3aX_t3-5LF#fo[.(mO`a=Y%/0AR#e/e)rQ\'YM\Q.UffI]?@572lKYsm=_>bc;ej0>+R@<%'JCb&kPNr(^'
+%s2BsNZ_b6MrUk%65l>mDG7ahh[ITlYc2?SnL;e?b]l6%I"g7s/a`m]Y/EU6GimkO(F<b&FrNi8XZ!4/U at pHT//m=gTO7_FS#,jW?
+%$YRbB>o2FCb0p4m]4?RNG5:p#=22Xi"TJQZ>EYlC4 at SF^B-ncdIfJ`#oUcM]D?\4dID%./iFuUtoQCGnQ\MYj]0<ZT^"a>!it?S"
+%>8R9dbEmC;HM[:WcVY9$iFub1 at pOIh[]pFk43uN(\"Csh>8Mb]f%b#2=)Nt:[!(c/N2K?Smd#W[7=7I7g<%LjqVWPsPLiOGS>XOO
+%ELK+04WoqQp&EX9h)B*scE?N7'8b5.h!;R:n*PKM=$(p.=`7mDP>V>PXom><GFL5BD6s^DZhF^Yp#F1[h0'Ihqs^Z<nSA5t#KaQq
+%2s]]Vl`Gde=VeR?`@SY17b[2aEGllmo at 4^S.RtC)I at k6rfirpb>C>kibce2 at 0LS)&Y.G74l=s2!Egj^<M),3EDt7*g^YYPT7l`_*
+%im?'NYS,)R+C'k+-R*o-b]1p<*1?b>e<KA+e*.>6hLT$]@V-ll>.L<fIXarW']GD1M4prq`chjdG$`%c"??#!*)1UE`R94IKKpoI
+%O12_'6:Pk<i(G]k[D'?/Aj(L435n at 5\`VWdZ+#"l]dXtNYHcc5O5Tm\r5o.2>K('>Y)HCCC.G(r+F!5fTK at tCk'jNXIoi?\d<U$3
+%4$Uh+*)*mq9MIfC:taI<*:eB\Kj_90q#Fq-?ikh&1!stLonqV:A`Q4'_QIt)GSD$dpPFZ=+uldkMV#U=Mj$8!j[]W^X0-b*!>5HO
+%_hpK(cf6Jcrd`("3?Pm8:ro]Hla@;<HD,Id[@+edmXN:?/U?(Sf?\rSqN>PRNSg\+&gM\1X?3lJ5G(1?o<"7Q8;8+Q?]mJYp*G@/
+%%L(iEB:#Q:T_,Ro-B<uEVi@\j_=RKWX\ouFD#%meK,R'HVL(?ddJF>BN..[:?1m9@'o\5:o",mA.XXf2L4+GI_:Aj9281$MaVU3V
+%V$J?Qb92NaCg<#Dfc-];X^5Ue3m4p&:LVj\E>n8:ne$Bd-7b![9o-o:nCAfpC at nC-0%4s.;f/,5hD`<Yg)a<jI9n;ko'MRs7_=-,
+%D^#!uQ?cAif1B(A8$lpeij6+44Yg];@u>EV at SpLGT7rST-Mgjd?:r,se5<ELKt<h\?Yi_E:cDa!qCfs3RN/,t+Kp]3Xmp!=]S(@G
+%ESUU<<Yi;(qpE:JkPjU>[^rTr,3RG7`Oga5#?u[./dm.ahBNrWk;UZ`C9q.,[=7j#bih7JH?oI8WPn(qO^EK/4PU7sf*dOt?gi1B
+%j_oo1 at W2-SY:+.tC,j@#h_i5VLA)d;3213+gYBC<5LtljrKf?]5;7*<UqnZLb5:qJg at g>\l@%3)eLWrj>qEVZ;XTJ5U&o3As5K&C
+%)If&]54s:f5#.Z]$FqNr'ggA,[IbXbHS$k0-u&A&%40ofqtB?^d$mp:]n_`'/n8EfqU=WB\h)^DKBg+O`T8;k>$Qb1m#ZWSS:^LY
+%8j:DjfNJB-IQL:"V:C$@q:rRTlOV>^a/S+fo`/o6lh(!3 at W1AS#/\Fs83BZDk=bAk]H:Y)l-ds'IX]bkTDpl*^gZ%,_BsOACPo;"
+%s1A3_bb)Qm-*k_aOSP',=HdY>`VFQc?9cO,*r<ji>WSbT]A'24oM,gIS:2"JZTD7Al#+5Cqb'qfgIJ"eVgd`Lnni-YQtmf;PU=+]
+%nBmR6%U1g]f^c4@$rrIJZ+*m>_3`)qK92%#o]/8b0t:h+`!kX<6g3kT0!)*D.XHaM/0>AD`iZpbppNV'WPN8ZRu&i79EQrO#@\ii
+%E:6e`V%"/X(=ccSRT`PRA0'=U]?NV&h:6Q6XX3!'beM0`d%inO8ZXS=f1iL\eS$CJq1eEXNC^]p&r?(=*_PS0cJgL#178BNZ.Dak
+%7JgU$a7H]2,pR3KOep+u_qpk?f6(>4U at 4,hJ&$seg_#nBc8i6(,XJ9<^.f,8E`Ka3`XN(SJekot6Hqg)lIXqkes(Fa&;L63D3DpL
+%>L[,RgmKZKf0&Q2Zc!ZT1J(DJ:scHb9Y%as3$WP#jJ]e_/2;1$0f%*,[Q2LV21^4DI.^DHj=GFqMF"pQqn;bo1E+!g/b<p6glRJG
+%P^c":Lr!midqVaa5PRq]2!K+d#D;L:KJoiNK8oO%%g#H)I.l63o(suth&]S7]2Z]Z2=:bgqiOErLXNiCM.Q2*/MN4?<GMkTZeP^+
+%e%Bou"n2EooU#7!YD?@HhC-$gKJM>&*uHJO>-q.'j*lmoor""9:?/Ma:'K<qL1J&c(0"7)KKmso2W9B^.eF=C4:0eMM<rXnbfpML
+%H7J0nB+&XQeS#k!9?mc at J\Gru*Ak%=d7gsc"1K:&7>p.-eoW>7^K]KP+O)lVGg"O<8m=G3DV>MqV?jCQB`P>:R<aCQlH\$Y[Jc:^
+%[Y1b']PeL0/efMS_R/&!C+e8X[6ZZ"3BQVS`Ao[V>k0)[#U*u=#F')1Q##Q/9UhbXT[RU6Qgjum!I7]?6FnJ'>>UWec+u0E>R)tI
+%DVR3TH-CM2dPPVNb"W6,]M%%6mC`TJ3dmp]2\7:7S+cHJEcc4eYk3.*e)2Q>Mo:rS_m?A0BF=jU*/5oHO;m+H7<$=oc0Mn9:+uf$
+%Risa.2Rj0H]Y,N$k*"90`!6)VE7[A?Q0lUB+_@%1CS5 at P!.C/.8R24GJ<:e!;A3L)2iZAjFjYBHJNFC:,aWZ/KtICf6t?+i^oZA#
+%:n,]ED3ca?JP_`[>4!^G5\@#KM`R6J"Bj'')EVqK5h%_e7=*=b8C<!`2`A=*+mV-7IQcIeL3jN+_Qe9m-"j<lo+GUB+^*,kS=VU:
+%Dn.@<M?6CC;]aqNdh_LWN;=P)j1)NHFd.AH5bU"72AZP\IFMRqeq47tYl\VbMU*k+8S]PC at q(HuV$dp0I;hl`*F#N8,]@I\'3dFn
+%E8O*1^D at W*LNXLd6a8uD#um0+dS6^k":HqT,>3g(pV1r(,.Y&.IVq[`TX7N:n#de7aVn;[K4MeGjN/Y\8*\h4(o=E.QVYI1J?Da^
+%A?mO6Fs,2$9igXB6U8J.j\AE'_kJ+<8oGS'GTh`RP3e(m3;OgaC?*>_PQ&?7\HH+=AG%-^n1f/*4>fCcp3:qGrr,]YDC)'q91:gl
+%9:OV79q_o*=itWlm`A\BQs('n;irF.$GXFsWeR=D9jXetR*?2)s!BNY?%Pk`/1)FE5[:4qa:,Q?Xk[*ApT%f'!7!bJ]Pe^\=g-uZ
+%*Y$n$5?Aa1<t<>(rJ[/qb2"I6o?blsOo+-9<"eYus+RnjNSLAbH#<^.8ESdL:5\-=Nm]aOeR$&@1P]D`-D1Du!(rN%#&54lJr=Fq
+%L$omK9jSZ=>S(:9;+DsKKB=AE%$JG#b8eskSSi]2/l3%c&@CmY7ISq=4sbj5AqNb,(VL5b1U?)BYSi3uV32PU?IoaGQN`.&ekk];
+%9.)2lE)&.j2-H9JAK>#X%KdV[<OGAkFrhO.M_^W`jZ,t4P*0%]B*!!D9(&J[26-V9k/32uJ%A11FlY/Y92Z"-WD9+'k?JqONDk-/
+%Q at _:Zhb7_%=KbfMeYr6]V`k.M=@"]aBsUOf="@LAnLZ[c`9qAg2<ee+gU`Aa]$=K#JlehY7eUSc>>$N_396g5p<f2r(c-)LYR:Yu
+%[97+'A'#i`'5P5,$)kQ<n&ia=&Hik\s#r7CApGGOgM"_BqS-TI6HS$?cTr=I=dMcn&<P+T,!HM?=G'A>=b''iIh(RM+SSB)&UMYD
+%_E_C[+sA4!^Ql>[,%+!QS`Qsc4;i=Q5u\(]p]V&adM(:k(>hM8cSbmB=VTu/>!K)&<C/\O-lk6tn8)n0$TgIr'@I6C0,umjT7[[I
+%5BJSZI?\6./u8jF?&U>?Ic78q=krtGius&)n[-gN(X[6-0^E^B[64(8X"9*]6nV!OGVCF='L'C%5+K&`QeHjtpJ1RN($o)khMp?N
+%"iYC+gG<6.^MOBjfT:oj=pi*&JJ"DE,fuk$$q>qf%<#CcSjV7Z]K:>rm2'F$QMiHW]R(t!?J`;33bD,eqhcoL*!1^l`(nK at A<E#(
+%E1YD3=(FTgqebbTeo?KY*a+"N1Z+(Ml[BD,*1T,YPYP*Zk<-ruXCtBqCIm#h1qBT23)O4X!B$WSR6at"l'e.f-\g(-+:<Fgl9Sn<
+%V!)6Y!>UJAbF2b;PB:3oH7oE^'\ZHY#r@&B'.G037fL!-K;CJfWZqdUOYLAd, at se.Oi!Q`d3KMKVf.d=_+Gf=:GBI='D3S;^V^H&
+%/?H9?(>"F&?ID<pqF2LDBn at I%P<-'$hi8X"F0A9=Vb$8l0!R^%YGE[i`6"t15o$*g\'a9.jRmQFBKO)i0cNH-LKO6"`P?%13uk>b
+%%18f-7Te%rOt at 3YYucTk0_#Y_[^i#H<!Blu!+hTif at 77Y61e[05AXajH`Er3n0I!<*c3I^RiI\Oq%Yd<-O:P_p-M2*D$nR"Z%s2t
+%^/A]0(We$sk>s/<9H7u-g'^*EPX&P[3UYlB>s`*k[<djj^+^VfK5@\NmZe6Y-f'35FqnRhO,-91EssK;Cg5+/U:p[EX-9E[IZ[3!
+%5#^T[=qmDO'!o^0XKl2m79d;pMgG]"=Dt8/G at _DWCgijA:V\IYV58#Z"*;j2`(cJu-`f/gb)48h*ZYj"^Nk[9anXN<p(>:[?sRVY
+%Wi;7t0A9g>=W,C$)O<'=@&mgBJakYbc&8*tFK/>PYZHA]DbLUM+doG:Tqtm=+>o.06=MNnM1 at p%@@(^UI\B_'lILd1Csg)<7BsD&
+%Q3UeU$3;NHbn-@@SjfbkNEQRlBhCFk0*j&W0(1()?g-s&a6oSkY4(gbm+uUH`rX%7]R8$&"1caNAh[usr.M/(ZpXs.LHJM9TkH$;
+%M]F4)-2V;8FHOGE%.q at _aBW)?-^McuPjO]WL;9ACQQ^@DTOBY*-eZaU%83!)MTYmWHY5-.4VVb_\L"`mi_>;G&S`)h&XrC$Z40]"
+%\fA]m0r[2\^,#&K37Y(O<\1k*:-Q(]S-KsR;iXrP.&$U=aeGI'g4/>EYc*e]6A$/6O[d3^_4;tr`jTL(TGK64`4.7tfIt-kf1+R-
+%T"q/2MEW.Yp).2n(7P.$b7<`B<'/cPPnK>iC=Vg3WT15edq+Fe\1/82g3032TNN4%$E"rROkJ77Z`734+51+kbV6:Rb/5Vo6Z.G%
+%jK2_#bp37kBR7uVZO)"'nAfk3j`6N$N")E?.*uU%n>DcFLg1^#r22Hl*mjiN(ZK4#_u$J%p/?Hm6?A\IC7s4o at 7Ue);(g5fnb3J<
+%)L_ed9.)n<@<#SI!\F$mq_r>^%I*of%$o+k_b=f3LMO:R(/tR`,^WFA.5J-&fPW#<4'Hl*R>;=]TYu(Cn0Wg_ILmuck\-mmep+Xc
+%U&ZJ76"5aENXB;33+AU_e2(;['g(aN+EbTTNuPEQNKQl#[u/g)X>`i.R;!a2OQ_u+MOjio9l*k[", at .(`2]ui%)*ng&R?R4QUHh0
+%#VhG.6qM at sPdLqb!ZpnD:gB`QdJpRECO<?T!RrjNj?Y.'Ic6Qd%E*rmWYCfKf*.3U;`LDZG=,)UXKFBos.^g)&Gq`L=XdS]Cb=uB
+%8B".#K=lqoMb9CRg@;,YN,q]$72s=/SQ]"'fI-&C^edZ<5,'b\F!R]6FG%2A:L.F at K#fCJ"BS#/(!\tu2\\/eb\De&oTF?scSYn:
+%eaEle;MM)V6<jP-.Dn'_JpKi\+?!=FOP^1`hma;(LQ;bg2*I)Wf_*=E5`21-S?*uZFkqhcO=^?fISQ^e]7fo#.QccXP`dNbZ5&ig
+%*Ou\Wd$H4OP*_11"$7&A^=:9L(W`K,B6Mt5Z_C9f8V\H?:*@I`#R;V8?DpLGA^Z,SB8alq@:^TCY2]j3U0$T"6HRY6eEjtC'Nc#V
+%cP3QpV$&:igS27h1Wup%`D]caVR<^+N+2W7SA;*Med)[rHQm-^=CcE"E\i3i_Mt8r:*&Sk.\$X8+IU@\,3pc\Qcr3%A7..'JnLhZ
+%is(dc1EDoSF`]D*J5Fq2-/"DhA?dE>7nuPt?B*^2&=e&\F;PGW8]Ct1S*ZoAI0&6]_$-0hhuDZSl]^4SnHZOn>hn36E;Se:Z]eJJ
+%TDrkUEc_-EE[raZ8pgclmM?Z2+(s2]%<NI9#n(]=`1`-PU?_<KQ3S^3nDYiQ-of=P-\[X_:DYC:I6GAY9^J9ATUUKM'o<#eN7sGK
+%aX'Aod]oKjZKKl5.e]X3D%fNq><3<84m&[p9E.mi#=F6K`t,(H$;UdQHZh9go*qWBT^PI"$0Dpg4R417(Ki=K+`lCTGpK'QZiV>o
+%d0t4)WA+l#lg1N;dL?I6QkbkkkeI/oZ\=VFe27KJ+fuCV&W$dI&?I`6L4Fp7@)S]Z5"%(r%H1fQ:=U+ZeYNsP13aB<'::90'k+&#
+%eG"pq;5R_iW<Gc\,S=L-11[$#!KenWJ4(r/@&K), at q?S*B?1__!rC*'DXO\rNX$8gGsPaRBV\bi8.o+&b$`OA=,E)p_BuaJ\:7s,
+%M'Isi!k`4oQkC[]QU,*7P39>O7O.5.Z#OQj$cT7SjsWdfR61T59,!tEgih$&if<W at L<M,VFsR)6r#mYl\$`uJb`O-Q%Im[#a@'=F
+%MQTEUkNH*el3)CP=L\jd;OOcl+ZqPfD^K(CMQP,sbds==!A2$)T+Rfr>X"WO at pWhm(2Hu_X:Xp".Z at uDV%T68><<KNo!(Ld(Q65a
+%d]*paO6CJMNP\1?Z_3>fp_;+JMTISAQ$_?'P)971#pF_5f0q0A)b8T?pIj!>1i]Z`qoCN(2:jJQpEGJa1i:@GJ<Gas+]?"ZpCtEa
+%Zp=cbD2-9C;%c]oIZ<@C3tS+J$6sm*iQt"$.e6FGIc-JTnmDSX#N:.NGY((*P'J15_.kj_,smHmiJ!7XBVE]!?-_ScG)8b]g\*Qf
+%P"cpoTSON=RU4]Qe9/<EPD?o!'/"JN*1K*a&I]Zs\P`'\5'DIOB!g12Z-\*Dhgmd<C&RBN>nX&<RUIV+K,YRIC-p8?Ld\CR/Dg\4
+%qI at t0%IoKq!KNkaRd_YYHal%m=8C[joIt*W:us3a6Va^=:FM`m9\jTRcCmiUP%e>B_*JG&JC)Wd*S#rjb;+$U&BX4mPoA#Si75Ii
+%42,JY3eO=G57CjTlA+EN#i1a;^$cBjpH*=T[J-g;T=Aa?pmlM9pice/Y4?7>cXrom;)/3&\d=.,8!_)kS+GD=TBAL*\i]]pMq]29
+%cJ%e8p^?e(GW+p\2]=./o1$QUV8iM+a\0sqKj?)pC"^(cW"kqdK.9H`$n(pOLGuX^19bO*NIf5aV.`'WCLiP?mn,QNb?cPf:"WlP
+%I4+%:3>ES\3]ft.M'4<-$>MtYMM2iHo#BBp/CK-&\MOhMF_:se:/-Af]lI&3hBFt]U4dFSXMp=c%$ac7FqC9I,4;7Y!qH*'Suem(
+%:HK,iGF5X#CNd:GOOWo\7=(@FW8fY__>SujLB6V__%m6t4'Z&bNoM&aW;bq0RR0<#QXWpQi0.`;"\K(1n'm')YFSD;,TJ&!Z7cNu
+%U(l*$mB]EqE:pS;<(V!RIrq@%Z2k>t_a$#&Do=FS9Vi'."il67nmt4o=iAS;1#CQ2MtWR\(k4q65fXLoHF/d#Q']YQ#^q\`'O=.*
+%ZLsI at Mo4s&T=DB`"0(*(!ECA[A]QFLAEFU^6dcf,?d*Tt0nN\,*W%`^;(3eZ:/$rkWoe4&1_JgWR7LY$b[a9ih=mp2(;B,l$5<Pf
+%2]9YD!J<P:P',"AF'1I2R'K3o*A4XFP2o4J--5p.Z@$/SV$J\B([i!ORRA`tIo:PJETCMDA#!EX.S<P%s.:!*+_FU#1#Ub6!ac%:
+%UnnN=Q(J_m1*U.UeA78QX(2e#3s2eN]fbOS(E*L-I@$f(#usLZn)WF)<OFfl\nYriK#`?7.,ohPCZOGd4F28CM?qV+Yd^Cbh_$='
+%^519Kod>0INnnLoTrKmQ*^WDj&9>U5k,;?B$k7"<>Ha;$9NXc6fnOX+3Q9I!Q2=_kBkGO/kQ21R![jaE(:jJfXW/!*)$K[\OFr;Z
+%![7-NSarPibNt0GLmJf&\0bZ,21#0t-.ba]SeJe:;<e:\']8k<%eOsP:.)aH=lRWjb88L9M"(?b^="b9j3BB/rTT(X'1N_+1^'q7
+%:"W8g@*<L.GD,2]"j'_lC'`R.<J[1a3^';fa;#:+1k;1=!E9d>=(XXh'EY"$94n&%5/sHhO<icoR#A(Id$A,XWn67\njR-PR#9Kl
+%"PDi9+IA3/lHm5;&oM?.)6'A?h7LZ-`C*$C3?c:Zl6)3IHETGH%[ZZ^fbV'q&R]Scm*,2O)dH?Gd02o5GN at n@<!$,1",2/UKVW$(
+%@+c=&abrk:Z.k<F;fQ8.JAk]k'tp7JI8<J'MYTqU;Yp]$rk`+R*bPs=DJb,i"KXpSP'5N%cq/RdJcZTUU;6O?7sInZ\<G3EFKZjN
+%*oJPa=!HmJreO&tUH6LM*8V*!#2t/BSi'?k-.[SK_L0H$fl%R=65Ot-92'AAPm.I;fO@?!fq/+.641gL,J5<Im7J4FLn`R7p2KS1
+%[2>PIPY=+H/`>0tMHr+"*8UiJ,'[SBgI!B2.Yu$d*#8sP=,-_o+M:ZcN*UCS,ndAYnS1qF?HjT,6#ra(Xt*&7`=^?7"9mu<$9UpL
+%J17^/g;96H<D!li.uNL2Wd/J+\O_#IJ2(!T&0<WR7+oK&*$H'0`pAlh)#2+);[I>m4dqqEGekUo#T&aOU4A^$C^6$]pUH90LdU_m
+%!lQZ(SMK^X!je5H at 5IC#)p8FA]GV<A,6bM)LTek<6BL(@.(3`V/+Vm3o+(SEiIthlI*J?d9ckRRg2$hrZOrSC?3.@&'kSil5!L9Z
+%p.`XTPG'*<jffN,,P(GXOKOa]&;*7;Z^qZ#<&V0U*]tB9$Q0;aA]I(8PuLnV\+a;:bF&IVnS0?g.R:`YI#HFidOWVN$E'O4(Dl?a
+%e)*MIbA(O&CmBO,i[$iI.li>HZ^A'-*/5O`"_mOJa\%l<0[U<k(U7?.r]DN]K;fW4_M_VN9)KS2M&(M1Pc;g/:0]5m[>DR#'qnb-
+%C*Up7S$*T"=_>W"EGtUk-$uA[Oj>_\YHIH0n</),26;m)&fdfp$3I2eBB1;5i.NIgGuPD\NVRjAjn#L'TY\FPPn22J\.fuIRi0':
+%>qe>d>87^Z>4Q4"MaGddplWVt.T_lXL-%f(2TDfK'GVP0EP"D*]+s1).\[l9cnsNXll'u_c*1$'*+]L+$-:P!9JlCA;H$!h_W/l=
+%*$Sh0;jN.>T5'QGdi^A9QRU![-AC)YUX)q."*),=L<#m40\bTPSo%beM`\)_oijaEhEemRidK":HR]VXoLf<1<Y)on at l@^QjV(4(
+%qA at 209@?;-81&NO%10,^?)p6EEfna[T"7s_a&bL2-m[/.Gs9r>6]*h4RN)BYPC_]n%tTrAIoNbZB*TaNM:c_$*!*:Zi at KVF-=-8[
+%C32^UQ4.r,3qB$`PQ`.e78LHFZ(?L)<rT%8OA8jAf#2M5WZ"Y_PmnM86^&iG*%X_MGqWX+TpbhjKM[pL5p5A#"XJA:UAX$lkPBXF
+%jTs)q%on4R5jqQ)d7C&(,'k\^$tQCNb-!cB1SSX8*1Y!UJgDZV-NBrE":cjjVJpL>3?&Ht'@..AIuOO_/doU.$&'TUK[,/.^ToF;
+%lBS(H1+%E'U(@QQ&deH1)U(5o%h,WS2?u^e at C(k;k/^r8l]GI[A$(C:MO]<k:)-le>-)*Vg9r[KK2 at j:7_60*/E$RL:=^O7^b(Wf
+%6A&bdR-kbFl*7I[9L_,tJNUmm`pUs_f=TMP,=[1jb<o#WCgQ\r/88p&'OQVFoZE(T5A;lp;U"?a_ at u)k68B1Ok+KkYpE8G0B/<;>
+%jQiZuq$>\#c(0HP&FCF-B^H1OM&ffV[>;4L3g1mU9uRU=3XBGN'Zp^92"EitE&8W0nq__crqLpQ/4+\i+IM0D)BW=a72aeh7G'm;
+%,teCCn:pEX,S,4([(9_30bJ,OX\aCCYk!I?A%b_F8Gc^FoI?pi]s]Z#Jimk$XCK*j\eI"g3=YVW#`b#(qE;ci(C:*eKhm4Z8A*LF
+%!i*(46=Ub0*Ea"]cD&MHD%)^Aco=]R4",F$#=m/q$Y?^Wf'QKRIX at 4G/XaoWe0HuE%DuB8QV=ra;g6(l,s2XVBf9m^Rj12r8"E$t
+%3.Tkc/Nd`b*+UabhI2-NGHk'g*uQd7Mt;X8pdpeq@:pWUVV-sA]B5a:nCgaAJT\i_E<b3s[med0i:UP,:67d_@\Slf^RCu'22H+q
+%]8G38mHC#FC*_`mW3',qB3r0Kdbr4"Z$l-68Dm":=\Mn3HV3-I=lI at _5O%)XUmVmhM:ND$(AhrUFIXl$Ae%C?8]YHLi^R(*I2O:h
+%/J<W4QEe;@$++6;(dI<"F'_82cXOoK7FM&s46E#Q?25S<.7;E,DiQ4F%=<0gkSC<Z_$F8B(SA3^&W%f&1CmX$K2spaBfLDa@&'.(
+%J,kfZ(4E29nY<?NG)8eko4pdt`5 at 8I@V*rrSs,1Rf5$l^N$NKg(_2.\GoV\Z6p8c=2L/@;A;ercGMg-llX:nc@(Y\R%UcH*pOl49
+%P'`'o)(SJs[>Y=XG"F0e8LeD at gn_.cW9pVp;gLjCLYBBkH_Fkfim8A&hJ2h*>b@=4A3)KHTOS`TVHd?/aWUpDP<`FWS?V$KLm/%i
+%3"6Q&o at B"F$OB&J?4*-K6l%Nb8>\(F$Y^3*#((hKY+(r&\Oa,X%[\Fl/Ak&FlK!q4$YUH$%1jPGRmbUTRE[)>U7bUOa+_,X<76q-
+%3pa")X!C2&P>abLrq6pr397r0[""V->iN`>2&\tR_I`gh.WeY<(68.L;n*qH,AsqVM-rnCd.6]JI%9rhS'V*4]l>$F\*qgRh5E\e
+%5;1`J[bsd_],pk8 at H3ZT7c1_K!N/n]79(bGgmgi;MesET0bQShfgfW=?/u:XPcXohZoS]V5l:V&Uh"F.V/-_\!n]RGdD3Cd#0189
+%KY<`nZ]0Zh]mCuAs8Jth-\o6VVI,r2L0h"KAP8:':ipBP2s-*1Rk!K1.7$P!3)qNi<N8q?eVpn28GF=7(3*bL^:LV#HFA*F8I/hE
+%<A#"O*pY*]#Ds5%+O>A^-p at +k\e3#;))s:eKfSTREmkRp^(bL27M;i$Csm,$J$.;pPO^/N0NT$$R%dBK6ti?qGNI&n3XV`pbn`Yj
+%9JSh9Ng^`CP[rGtb(4M`&-ZRMc&#?U(]ioY9j*BU_Yijk`Ie&R]j6c\eb1'BHPSAtfAgAR*q)dtO4W<b]*@R60mASlQLuV/">[;C
+%;2!/)/kXKT2rbDu13(-Y?s]XMZq=_a&;5^sIN at c8nq,]4@[Vh)ct`h2A^[!oc:MCJC/Ama8$r+]RWr[m/?.+>$!FlEH`n(EVh_d+
+%,[R)[Jpqn=nn6%5H<fHo,Y+nFTq4l!,>FCX87'rt5#i!D"0.Y(V$-/P_>-1Ah]+?K_$b\jR616Af(ar_QDa1"B`8M$H%Y#MfH&m)
+%!Tim4V52pAV-Pn^pAJjsisp$s[eF<s!MmSGnf\YJ9'-Ti:T3>]CK`"6M9cH=Ml^t)jb5L7V"VQ(H!*IIVui^C.Z2M#_kpBN:;$<r
+%6\osFP"4\+(Tc14Kjb[h_"AZtf*<d%&@q(7Arjrc:7r>VP3i]cj7lCm68H94</BM]NE4S@%pYETW9l(b)ft$(H"cpk\Y=H!X9t2h
+%il3=@po;03/lqEu9!]muaBB%rTM`(pfN5Er%f+slJtTK32TZ-mC9Rn&."]8J+eLc"iIPQ<(;$qC<T6F9)l9Lo7[G.B$?A+kL,OnS
+%g+f!j>]>:@4]t)oH=(ZX5IMm&LUhFc(>b at qC?ENIpip/jKKRbnN*L.J at D<GI!XG4W;0`OdQaiDPQ at egR)_!\!9ojk?L/LHS&US$s
+%I%O8HZ<!BZ![/#\$i:49'EDX9A4GWl at 3=#<:ggQRicD0PMn<)905=rO(G(ASi)JQjp6JQNOTZ<OKOe/W,c54T1 at WW#8Z3P+AS:u6
+%q7n3;B#m9FN[V&U6+,$r*/(BHZUO[9H=V$N'pU#PU89kbFOO3,RgM;\]j%X^;GgjGC at Tjf9Om9c84)73iiNM4+p<>/Cog>D1<llE
+%<lH4b2BCYDBJ&keT[/skY^;uq[`L&5!/hpoNC1Vi_&Dm+*PX9lp`pe2EY-[+d'-HY83,M3.%"fY@>lh,bh4hWS1^3ucB^md_s*>h
+%TMlW'X)c>WeB4LgEcfF)8jGZaO/eP*aV``pEPrl'Z=N6b*4o.M2fD"'H#AqVOM0f%nf8Bs0?Q8q__DY!/FqAe&.9I2LOGG]'TFo)
+%>fqfBd*GiOmDSg;6-#ODnUnuerkLYd1lFGb1'R\^13To!DcmICnTPKTV-RGg48IdPW2V*l1)Xul&"M&q8=t8_=:--0QJr[GlHb'Y
+%pkoI'DF\;^mn[J;3th/AaU_\<o0)%I/D68AG[_I/Lka`%_,5+f[M>CE'4!4,EsGf[H$[Nt]TTa6!Hgc+c;7uiHF!e4'^PYOSl;QT
+%K'PNpn!JSlT-tBe-VSi$N`&]cZd!H$rS$6=.Of"+9Yem&LeLQ?Gibc=:()6\cIZb>!k^2f<uU6rKDj="a/0lmbr#q)[,<\+['^o:
+%.$l!)"8a)orjFPWn;U/;AS9j$2<oe&K:YL>,#6cV,;*SJe&hg'K:Q`Gf^P9Y@%.N@?sBX*3H&VEs,%\M([UeO`!iFG&O=>m\S4m+
+%I;T,2$QJ$/LG at ntg%##8bk-hM3%04s*45jm1onGN(GNY5<1 at pbda%i90r$]%Ap\+L7SbNR2gPOCguo&.DY,dQ\C&bD`f8hCjYV5?
+%I%#3Y2qKbAdt5WIe(/^3E3W>`kIldTBt#Y\/34cl)H!Ul/pZT?"-g;jpJ]VaUmoOJ@,k3*F'9ej?5f0/NPVTEJ`>m-eC5%Q5uU=f
+%@]HUhC-WL!mf^.r\MT"=B7asq=%t2pDLaH'B/2bE7nVk8ri]XdnX;gn3L5mFc+Iqu2u9?eHd>[4%gcW<(P(l+XUje"Dp5Lm]]m[C
+%NC-\]XlW4;*\6M`O0l@<FienffY#jgZbl;ha.C-]'B1XW"Mpd,F00VCB^NY`GZqIj):[AVoe@"-Y\3b!.M'NZI47d`%8rZIPp@^R
+%P1M6G6pMHq#JN"=5,@(cAS^)3Y#Luq48qt+2*6dLgUrkaQpWdiC-S/ilGhEc7N"?iQK^<1.84:M at Q,s98uXU[B8YLHA+,u>jnD+-
+%;UMoTW97pSK*DNc6[n\RO7*,6O.Yj4o3q9oj&0V[Dm!r/4#U!j.4f;bliQ]`G_qsNG-, at YY5_h)PjS,aT0;s!;,a3tWH\Vaha>Xr
+%mGek-Ht at Y^LHR[c^V8qO;dI=$](+ at N]d[#??+?!A[0[54<jE#RdlT0T[1+1`+%W_qqS9FJZC9<&EamoA;:[Df!H1['$Tu;3qZu)s
+%1X'ao1GgE-?K!5!J%G(\1AJhINK)P7^tm:FDTcuHj>I-i9!B,A-0<QodA\n$H<p!37;g3Je=]tARQT(R.3g\eo)K(]1%#Z!"n'fo
+%CRm+QfF-hNWs,aPhPQ\WnST.*n53#=\ERt/!=;oU9q.2K/:-VIX&`5kbo[:UR at ipIi7"<thIV*WD'1`rFKjXH/qS7u1=IgjD</D"
+%]%7Lif:&L"'F;i\5V!PR$Z/H`$i.2@'e!e]7?=>:Ok2&n3,o0U*7&M(cK3d"1d^,s)D+%Lr.ahDAUb,I)a at oO6g8%_#sIj>DY3dN
+%YE#/13*+E..58oVM'*QdEmc<QUNbkOO2?NXdgW8s1+rBtYl7_!pRWUHg&=1F_tG?:46=@+q/!<H1.8dQTY;mCMRSU@,u(B<EL]ap
+%OLd6WIP_HLmR"mM7R?<;'T][KPZO$qlmO_FQgif6n'%mU7G^A%%5HFT=;SMEHNKdN62%)!^=Xkdj%L[l,2d'G3eJ%,[R=9/+5lOO
+%kRs49SIuob2tj9"p._-Oe$VVQj/(uHNDJud]LaE_7Q2LRO;,&'L]0&sBp7"`7cWLg1!+u(SWu](\]SbU.B'VD%#PR0_KSU52r*23
+%l>bV34A?Gbj],#f at t1Et_^bcNZfCWR_%&V0K)0M)--iZ5SmS@!F=$,[?n:d@?t&E,k8ip52b&"^;D'\G9cG*io,FJMH$b![H;J<\
+%q0 at N?feF1hB?[UbGcZRfKnp+\]]#D+^=EqN8Y)L7K.Ze9["L?.KRJ!Bq at kj(."i.s>j9\aP(RM)ngU>7YeYHH.Mp["6inu>Krl/j
+%^IXn'B&um9 at Ss5mn1$i^qH051&Zm$r1#5noZGmqhU[*40lU7Uje7aZ^9eu+[KYG5L*+Km70+Sf8gOKN7,OX^(<m;m9'Zsd!GVM*1
+%o.u&r7eJK43eZ;qDo8RKYjG$Lb\88/#b&.W?H-'S*sP/n>jk1n&c4DY&_ZD-qG%6>4<He/a71u`/'Bor5VA3kjGNhk:$m>VmP<dc
+%3-:ffZ3<RRKn7PQ$cUBq_6TC_Wg&c,iQ<gn)p:oS%#"t^d+a0ClW"!5Uc>Too at .,kL-r8pQI"'O?jGPu0nSqHc(3#SiTe4'5nqps
+%Jf]u$X]c?'V0ZYQMAm[A(^(b!7!/tJ8Ljs^1s4#Q;$M1K\JGoSd]h=NOa(f3ON&j+T/6SF)7IrO,3o+uJW#BS#00eB*15nZYM!pe
+%;7*n_Hs at DNSos=0)QR,3<%,]F*/gVa1E,1[YALLQ.-J"K*H7Gr at 9,:rnRBn+X,=#/2>a*U])?W6q$rG.[W1j1-ji$FN1"Q,;:00A
+%K-pFLUs;qI32,X0%RBuGMp;a8KUDiNTce4qK)EI`l;jo\_:E!p1BSn`=UdpG0]po>Go>!XA"9JVR%g66bk_C`$8[PNZfI at H9ntT#
+%5+l"G(_U(P%55tj+^.!K#>`:J.K0lLA=o[M65r+.ib?j\a+OZ%fZ5$o&a-jD=Nc%\pYkWcoE+49h\\SYCNmT8QYJ6q/#Yr,@@=,Q
+%a?DMt)f*1eR8i#9Nonp0;.0:'4^HRqrd1I#X"@n58_K)@_qq^-OrlpE5NgKUJ7UY0]N#1!<`lRW"QLEaJS[6_m$a#>.\u`:\\/-C
+%6`1'01O+!#o3Ar#!uAP\XJkl\_&)_3lc(>)]86cMMWW*:\!Qk(-i`=:eq6dXNiMD=]PZlbbT8MuHn_]H4jLi-U7"/c;g8U"+rG<_
+%P(O$sX_EC]C[/noR:M\4X#o78'dmFd7<'iI70Nl0i[tGmhUD-O-r;`Bb:hO^0Q]5c8DIpIUp7!UHt<ptm5-&s,8P7L;aUmjSLiGu
+%T at Cj@6KO&kdi`PZ0JE$RAo2'[EI]fX6f)ZZRuZV.12*>o"(Ejod$[<HZndPTT+_%gYW!B.9iMU2.FW&:M&jkL<DVPu8nJp"h#*3^
+%HE_`!5Ck?IL!"jrF-B"F"UqF7_Y^la=HQ?!A,HtXdmo[^%BaR'NN]Y+YmD9t1522:]I")^TMk&b#4<jn#&5PT4Kbg)4%n7C_7-dS
+%&QWW;:T$*,ibcp)]p_Kbj)To"\1L,5nihCU+KQ7`nferIQEt6/*u_X^QR at ON8hN_X49W8SGY.aVh/GKMpD`FaC<;b0(@A6.#L;p/
+%Y!KY4hb>`9]3g]6ml,S[$!'BDka*7%KZWQnE?Zp_Nf.Tn7LptW#-_grP[bjq&1'`'8dK,tg$P2PCb3M<KG<)e$C<(m<]'d!1#-`M
+%j-P&U"%QnN)Q&Goch#]37f!a!&[r]/UbC!b2Ab%]oeUm=XG:U*F!kr<Ro$:-6K#U720Ti;fC*19R.e!tR@)oDk,*B2MfrF)\GE,s
+%1qfo;K\*+oa/$Tk;&2*A,?_]=SJTtj;!bt8Y>pInC^W&1qPQQ==LSqtoEb1[g$m8U^MRRnV>[QS^!Xg6GguC-=6<uoMQ&&JVRO]5
+%9T\S+Ge4D_"Dp-6/\Y>e&U#3d`>5<B,1g'n<%BkI#6q203';1j$'ZWOX-H)q`6hH+2'f.(_8T8t#$%e^%h/n5_O7]m,qANK._69a
+%.l?s,9?gggDl\#j:1US=E+_P.:BJ.#P[:Y[.'\!pB1afnmVKd65dn[ldR>>De8`tn`U]`D!-d@*o/tPVF<9[;`eQ at XRXK#T::9jc
+%B]g"S#WkR^.Qok1Z),5lQ,3mk]Bd[b:-/MY*>7WPJOfe#;Xu$Z)0M'r[b7pY[^2$W@'[2NZa"AH2s%Odr<Q0VApX:UqkRc\l$.i!
+%::![AX:=%k+cr5_\s4k.>M:oqP?K><rXbd'E_kZX,n$\'*,u^qZNZH5ot;JnU:ee)f)"@lP,f"<**7N at 4.nS;f$`&E31Zo_nIZ70
+%WFu9'W(Cra<gfh804%]:%1^X3Y9.Q8LL*1,Gf-!K-d>B^N"hq.VW*.``58>(BfVjG4E27GHBPMh-maLR8q>uNAdjWjh)mU#i^&3\
+%Qh54'Y#8a4,t"7Qa"6!J!r7";PlWL@/k/Qd5=lOGEa2#(UpkMZMGU,bH1TskNsDtFS0F4[djtYG#:sRKZ'1+m5^QrSU5/IU1f$n;
+%"r:Z"pJnFB@"tpd[P$,p#W=ZYN9:P;QCp:sPdAOuQ'6hufjZPPTSXBM+%/sNWG_*(UFtj\Y>1Bk4U!c*hGITq?naHukHR at d+kKAD
+%h*+Y2`cF-gS%u@!DOs-_>Bh3ajY_!aG6E.n-PNf%o,4:NC9^H;(8_Y6&rYl]e0IA.ZA)@u"E6]eKRaE,`bGLaYb$rj-dBbm(ubeU
+%";%k>aI6,/#j"3'9Q+\,T$B6FNZC'4E^JM-m][a\6\HZZrCGCTbQ`;ZKe'8lS(&_#VCeL!KSsd;*d4Et$%jq0ZRdq1(0h#\W^(Q:
+%f"@/O__SRb(D:Q49Q=VK)kWkC>aljn>EHc'7Y1/hU_i@/`(=uiU_6As^!gRQ8.q2pJSDM`?N@#p;G[>bLrmRal%rT@$sE*\BTfm7
+%.j-)JAf7 at 2e$m]pW9KGNUk&b'm4cQqJt=oIGYK9$HuGWr0"9<Z'5d2I+Y:\V5#]&p^HVnF67$qH2VnTJZ at o^962q0V at J:RM"+jsQ
+%O!n<#TJ-OL.0o7?:.\&"]==(aXtTTEPEcg>3s(&\&E[rZ4RmrlXn:C*3&@!^JVd)<4#9:b+u%tQXEDg at qD<&6ZoJ0XQmJJorULA$
+%\8s,:RQdce,#7(iR7;[Z]2H+bH#>%9`%HmSH191r3?O]k\B,#LdP^6%Osu[gn0'-gVBltQ[#k\u7R3gG5TZ?/>2*FP+p/9e3i&LA
+%0bKPj+X'<XY#Aqm22EelHr(%d,?;S.gF^WD]DKF(j.,8D#\?KpkTFH)BU-00d?'!K\aF\EfWUP]0<EnT%L=qH(J\Xm:<En%KW??b
+%VhNqQQpdY^o;ns^+B23YR]IKf?@3EDjPCSL74=p7mFh-g2Po?S:$%+[hBXD:9!7bf6$XJrh?IaB6o.pqF=c!m'1Ol4'*b5>gnk"D
+%c8?oRT?;lB!p&?U+bh?oh$5!;<?5l`nG7b*g'j^;^hb=^e5.*Ae?dd3#.PUh#$kH;1R"ZA;n"BJR(al:T<YK4CmD]fWN<G=[1W..
+%kpN!:dStLa6Q%dol/A[^\M;2-Z\59.^*PLo;/=LaXU,\*O2Zgp6#W9BWA:faQ`G(D+/=uEWGVdRAs4tlRar_a)6E<hJQ;G`f*&t2
+%Qj`,tU2=^MJuD!P8qWrA.>3e3a-?oh^0ba(Uo)](M3lr6!up/>#@LP#V3k^GC0 at gHY3P0rllWlQf"4r_kpEDM*Mec;`@D(RK;n=T
+%"r;BJYWI*u[!/YRJQa6gGC2FdHFZdE*Q=.lAo:(+LKFDt8MolrVT"c+c`ZELc5/u&RooCA7tn"+DL4Ke(_qOk4eE&E2kEXJRGIel
+%j at ZlN<",)UPtfT1N8K]j=3(2rZh0-;7U9Tb3597"FZbmoEcH94;)JCNm at S9'r8m%jMq;#`rr1u8^raGQs352kq9olHGAcBSr8p6C
+%p$8[E51O;\q7Z_E--:W9[m*(Te*XJ7r:tQ_#s;37qrc5sMuK&=n:*,o;JEH8J,SF'oc*mWGOkVq]Qh-c\$*4&h=&+'q==H]h(N.7
+%p!(\KhHXF%\@DHj^An!GEUj"Xos:!O>^>`2Rl/qYQH at UgI<iSSIG[f>;Z1rJl85SLS!R46]m5&%M?`dh):QkMH?o>Oc1UCT[^;pV
+%kd%\,oA05CbHG8Zrgu+iq`ioK/&WX5BieN>hqm.H2`H6#G^]Q9IW3WYr0k&OYBtUlY?kSL^A.]2=4[[nlG`-L1jVlCgK=LUp%H5V
+%H[gKiG'ihumAm;>CF4=.0CCujDf4IF]X[mkQfgS\Is&#ne%'e0HfM88h"<YX9C?K<gDd^%iUZ++le?d>p"_"jX6aCKqu5dLOSa>(
+%g&LH.n?Ibqs76?I_EW7Rn;jV_YO<[b at iK;gf1'<$gRJ$<o'5]$h_-7WD)]&m*=DT.hQ;1qLMsr;ro*bGDr$j?KSAkK;,UQrrPd=Q
+%qZVf1n,E(C`To0qhn43b7t#Z0f/rk02RfrRHV!2c^UefAo(c.Jqq4u[k:b/njEgd&gT+CGAT$nXgo>&<qpXZdR^R at gjc6q-;3sB0
+%E^sF'W69$q at r9rG;4$%gj]3Zu*-Je&6^R]%o/EjZ?(Jb*o(pTa[=Y#NZD"2#VRs-0XuT=@qsNl.=d:3*lLhKe/q:Nsk#NRe]!Js<
+%GLd*"r;?AkbBqQTh9T\MQg>=Qjd(qe/X1'OYNFO:ddO3mb-O7Zn$Do1hf\>FT+?2.hu%G=n`K]Gj\ptKI3636U]/I(eVi$T%hW]/
+%7='%TQ%%.-mq#YNSTp5opEZkW(OPecs13[rIVjl1?U'mViR?e>Y<'f%o:*A3XbmS%HMu=crJm=^TtO5SDQdtcrqCniJ%$Tp<tZcm
+%(H\+5oCD_Q`T9#pk6L?n<O$;./)T$HYf)%ek7>$T/mfT-DctWQG*[X0#1%0o]R#!Ta9L8+^TmWZ(4&.WGK1$siMSum%rpF,eme5b
+%H>l&C$Lg>A4:e4if2o0UEdi-Y=8Lh\_$]G\j+tMHbH'7Phd!m%f8\N-"reNYcb$88P8eR;42H5ep2H?([amUO4aRGVQCs*-md/p3
+%pV*dnp]iLn5 at 2)%q_,o*pO*t[raGE[FW0SL*o[D#85<]T;T3)-nK,DdpaklKnFl1*1jPJ!HY&[kGSF(]f1$f!`O)r,4>)NUbKCt\
+%YJ9o4r7UI%<gf<F!Cut`nb2&Thqqbtrr$/Lodd>HQfl\thV91jk"]!CrN*'VeU'Mcqq$H0'<Bj->o&9L[J4B9fB;I?1Yo1L+$a::
+%FZ9WQe3/EWOc6E(N32DP4X/[%:&?m_Y8&/)K8A,L&M1Mn;g?5Z?^6([VsEDoB<eIrlq at 17+O'N#\me'WHGJQ)VSrMia0IoUrXbO+
+%Xs`cGU9uV)nNCIVYA.#)0<9S&_0hkQ<rY7&crFAe#>(4g?+p*nqY]@Dk46LW5G%nZ at Li$%OmBW,q5Y^kLP4ilm"t(ebW4aXYNe7D
+%M98&RI=M7U`T?bOQe.Q?LZnM?XD(2:X5Ddk5MpU5s0eg'mB1nnPo^Y%^T))Eb2W<UNTHZR%HEN4IGDN]j0^C"2fIHi#H$dfl>Ab>
+%GHT(4n/2&HW]%/Dl-Mcb(]B[6rU7kR+5OpYf<euBgcNuo?_K$j`X:!u>i"1P^0^tZI=?<eI=O':o('OrAObZjD]cKKq\(R[^2WcB
+%lWsE<He[8ncE2P at Hh1["k44D=p[S+R_m7!a^"[mYG!B.*?+PqDs#Oc^2gZh,/j3P=nb2stfABk@]sp13<M](cq at 56i\9N)djt5H=
+%fc]ut<RbklqTcO at 4hH#gp#H"?H?i*5UfHg*f"OYII!u"bJB4PPJ"6PGWX!)chqle*B]sNP5dm];aI;RaZ[OO-iO\+:7qb)e at U5&B
+%HrdY;I at AJDPq?4*>]_N$p<c:&>cd4"4lX/YCEj at L7&atU`%_ndj,-6-fb8W6d9;f&nCT;]*mnP!-J;l[b(oPjNj0uS&&DS;A+24X
+%-nBWg%u`q[f6J?G;*NN4PZ=\Ea&nRe.2HK+,jl8WF&f+!a&m"U[?:2$MrKc%.).rs4+nr^lNTP)-EP?hn/.UuWf8"31t/cqQC*"U
+%\QRPGIdeZYn5!M)cJVLn,h?)!j8FXir!\-(LSV)VWrh#XS(XlX%hC>]kLObma5VP_)uRU_B=GA%?`l""r7IiFroR=tnF><.^qsHZ
+%ZAUlWHJo+W=Q*a=S+SQC3JZ#NY6Zf=Y3PR!la![MY2qNHN?_^jd^=:mCTG%Z8%Q,U]!a)SGGK"Y]=NB8H`'I''..Mp!jirD[3J[5
+%8o$qsp5r4[<F+DkT;m;^i?dq,#I(3fPBVugq"`dmI+7&V$:i-L[)Q`XeoX>]qM\I/UC[;@I3`C-?=)LDhH=N'7:iY4N43pWmW6.5
+%\CCP.3U-S@]`5PBoCMqt-YqGt'Oprqnm6_Bs6WS"XKf4c+n_Yd\k9t)Y+X:F+&GjM:&?pdPe*>(*XbU=<6XZ_5h!l25LGrq`Yt
+%W86!^B:$rJ?<jVUkr#UCIL5_ce1a).`g>SbXH30e$?rUg/!!F4=d=a8aJ=p(gRB:&?enH+4qIe"\i]VA<%pIt5JOaEn at C$`!C[c)
+%lr;Y:DrG*-b+0>ioe)MjP7"Dal+ABYYc;6Pa-2,jMJJ7r#3RYC?@RHGq0H<Lmd;.,s*9sGB%#VgZkKNbB+K2LM7)cfmFfB_5rC1;
+%6H4=qp2L&$?e6 at s".8.(J,4Tak>g>n[HEMjk!o9leNY^js)NPee$nX0m\c9_[qD%O4+='X*6UoW'rRLdIa>nkqL=S*?erqWra38(
+%n,W at Io@;[pUX/[unbF5q#lQO1mca8Ub at Y_cq>QnR3Vn,a52T^=Ps"nj=1+<gcZc)a?X5gEroVbm;j?2()`m7q8%jkjo@)gop$Ft-
+%s81!_b86fF-[b`8B7O'5^]")NX4us`f:TgjI.mC'bOZNoRR'/GL$`&M_ikI-s'F1RhM9[*D#J\0g5]@k;/87.D85'J4^;e"lDgKF
+%Mq:`8WUom8b"S/RrAt7 at ds4q?heCn.PjZ;hDVc at 2.^Z?n8%.d]YM.<uT!(lkI(3M^N:j#)mH,"\q$M>P=$(p'np-QA^,`.Zd&O*s
+%Dm"IX>\E]$h7b"praEdjln!VcM`U4O<jf8nKl?GF+Ph!@NF(*%[Q!^$!m!;b>[DMXi8r?uFL2qQ#huQpZ->fJ87XbBg5M%MUSH)t
+%BJ[4_g5M%MURulh8"7n]C,7n9A%d?7(0736*c58"g!S4 at oc@sWY=.nb=[qLYp9/\G)S$C"Co$7`0E:sDbC#)tNRkMJS`Sb:_8?^l
+%X!0U:bMV173uX6mhRo`a4kbM[OeeAJPTG97'`O<@00^5A=;N8cED;W%dt6ndf7,fq\s)r=E.hVY^<U5NM9RWS8rS+)Obm)K1*9V/
+%@U80dYTabHg;?:89RJ,0EK,q<4n-Ej^%98u`g$o08*7<rJp+62[#R9h.kpq=Tgp2!"f>9TZB)-adToXg2874CoqfnrY-%uR7oFd"
+%=DhNk9$Q)&e9Cb2h^)'J<ODL_H2<#>rqt=.Wag6:WDJCT3Y"ulQ^?$!7gSO/4jWQ`/\J7KQ<<V$*psY%f"-Wd*gN4%J_$q"JKC]M
+%I%2RjG$jJ=Y'PQgrV<eSIiPNgrb?cB;+"OsO]a3j5AFl;WP#)K*At4S?*^5[[_&fUVL:R'6X/.`NZ-VK6T]$r7h+k5)VY/.qh[t\
+%>n]^%ORN(GpY%OqceV=nj6G;@abk(@eOF*"gRJ$<nrUN?hmotoh<;/R\+<@<N)f[mNcp?l_iF9=2_VpmF+*lDcGC16g-d#YD5)5)
+%e+;DkX37\R?N-QUrH?u8Y1HdPkP<<US,8s2:KNhFbA5tkam7[`p9CV1qcNBKP']G7O^le7T6!6;U.KQ-mUOY??cIi0^M)%C<GCY?
+%ncuAq*o&l-H%,;[r;'3u=6iK4*7MWs=lj*u51t^\eh:(#PhfnC5=Eq(Xm!."q!Gc.G]WK>r]#?h+J*jaV,?B/Df=pkl`8VRhuEB7
+%qLDkb\G_.OYA%nol[OH4 at pRDQC`VtV!<5SF<`aGWHRSQlo#WBTnh-2'*ctHo1R5[<?Wiudd82<BF#9+FSmWY9/\Jf9-S*U[%MZ7S
+%V)<,PI0nWN7k/5V.]DH-'!skp)0KfGi@(OOZ;Trg7/s`3_T.:\?IlN<LPNMnle9E)6XEg%S&^5q$u,Xo];j3t[CN%jpBbMS+-uBY
+%'A)DJQ#?R"e at ARrl_r)Le[_G9G?!aclJ,7->I+BQ<9NtTF/uTk+4[n46_4,,W\LS6U$uQpa)D$\>2**O&ZBn'/$USSm9!CuI2D6K
+%.k>T>&\*8D4^/@53*%a25jDj,I=6Hhn"omrWRdc:mVh at 9pn>Cjea6p4TE"/+DQV6)]=@h#J,es5r8Kq*5 at Mq+&*Fa1YCHE;/$hjk
+%Y28shI3chWp"d8V:&m8hFM$t3IC'dFG9u:QW%c6ElCQKmnjU:PSr?IAU%#6qBDLhM\hlW7`'jE:db4N$"uU"!=743P(4UVcf5au=
+%aAq?):$^ZmdeSAuh7Pbd>T[!X$+=F&s)=$bJbum]_Z$j%:_m*AS%\+(S!VII0.t#M3'TZD=Ol0\>ksD>JC/jiqgs(ArIe`V>ME<Y
+%rYK_0Tri'B)[kQ[e[7q&:Yqu:N/derqj!FpfO"S>968u],LN8GpE%;a2;O at h1j>2H4qVLHV+m*@XLeFob!C=^s74JXDI6Wi+pb<.
+%aQtPZXpoiIP2>WlO$_77Bu44+4oBCMr%[tm'mk4mi9QGf&q#YSI+epU:"sq%+]tN4mSQC1r8lJpmr'g[<p&U`5MgnH'n.iJ+KT9)
+%=RXNVmLhBY.Z at iM4+"IfOa=.m&GGJLrqF.04nqg>3NeL,*;SUJAc<om>W"Zk(iN[2*Zi<?f>ZVh`Z*O;LPPB=A$<_hZK8KL2Epb2
+%I/#(q7LA+ACbp;eiU[F!mXs7QXOaoX at -R[IbI/nrrnY^0IC*!dfB(pQeg7o^TQ,DWnrMs^gqDs$CFA4&Dqi6d7E!eLnfC*7s0XN?
+%eQ\b3<^jl>0aEfMP=>J_mnX-jduJQ`mn>&l[NZe8PC0`<IIYT*Y[`ZO&,5n$os-a?rVUrk<gUF)d/bO?SubPnG[QMf-``sA%k9@)
+%OZ3eO.Dn=.h;_W,lMnH$R\l/9*3Pcs*@'o711>L2:Zsr=KiR65^DCnDXfHs<,6_gkX at QIglc\l9YFbbt'emCOoA\ce<rA$iZC\`n
+%s)),4ID><2QMDVX)//riWf5:D97Q-:N_B)La%NkP96OK6QBP<cl-\,LbMtHah_fHs1bh(lU^%:"J*V.!f2jV,[A?Igr$4uYCH\"S
+%?8_G1XDLms:G#g_f%8=AEJtKX:S_Zpn+OH7,<gdVd0Y;BID$u'*6pPdJsZXf5]0l at C*(k.Bl0>aGTW`gY)PQL&(8UDo=-tTs7>sX
+%g#$/.YD^pPRioi1BG73!IdmZPI/>QMSlmipJgGr]rR:.l^\#3:+d=>Us75aL="i^Nq<U%iqEa;<^\m5lS*t6u3O[o;jKI`"rr1e=
+%qos0P"odt/s7kq>Da*4]/gl,Q8-?QphnP]aU-W.9q[*;rs7APSmgf688Nch/aoD8</LSm@:]L-,TDdnDWND_g["OX3g2^A_H?,e=
+%ASJQ)CHJXk.OPX`/d#-Mqu7SNb%WEKnaBc/-Pu^XHs0F(12ZSE2P8"35^2Ku#U_k,i,Y9,,.Kl127l&^/^%l"#qK]R[$?ki#5g+I
+%e`Qk_\`>64lO.I4'u8X>EIg;TrFp)- at Au*->"`4(U".`C*-4/$UYhF"1bAjM&m`H&>Yk7s at Cn+]qGICro4\S$[ae!6n)nf(e.NWV
+%_%iOaT)'S&m.oi'["KR^QC.%5r<o;1\k=-MUm#Y'5E%//gbI-Ze<_?m`)@Id#CnJ8aoYJboX2Cbn!X6/j-'XQh)*$tP%T%1Z at q#"
+%^<g8;RXGg]`3R`Tf2&I)*M/r!NWWHOl).As%5+XK+_-+%q at WOJo"TEg5Ossl8O&?E6p at j-O\9ntcdhImTr_UXKa4L(i;9/-K(Xta
+%rZ4Re/(<,!pVn_)_,\%=0$j`LqGLeX\Y4GdFK$+E>nnVq\&<8RMl4260j-lkX'b2 at VXsVG#PXu&=jEb:O"Nd)qH=#hCJ"Y%c52nW
+%f[BW@$T0V_aY(\^892]G;033ZYhuA0O,A*c]p#d99>@?O:MYGLRGL;83[X^94?1A-TCBqSG\@#_/^\0$VcBlk^KR&?eh;,RP]`]s
+%I?b+rpR\!KXtf5FrL34Kl$"Pu"IU>`"8aqji1b..$-T]+i1oK0?i#,7'..0V5bE[lV+hTRht6NdQIEhGOis_2qXuudU at T?8gJR,'
+%8'jm-:inEJ<QZ`o- at rP,aAaV\GLU`>/b%]tZ\<9+AoNk:p'\NXgO\faU<D&:\AaK at hc[d(>4NH5A$%u<E=imkn-Qc6^;t^\R%r9d
+%@H#_4Gm1>"`/!Y>Fd:L#H<$h(Z[lu;:h%rmqO=Hj^6X-UEpMq+#dqkGA1nk_(imn]L40d\Z_dXJ+s8%n+=rEmFGc*.hH+HN./.pa
+%*V5$@l&!&8T9mDbj7;2p]4<;0O;=UnrHBst%R/5G8.e`uJf!P\3]SBneTV[BB("$)13UOp.UCd-Er5+Mcq^'?96+fPULPj'j/tCK
+%6%?=8X#bGRN`d7VWu!hRs/cVa/]Jk.p8a at ER6>Y:@'ZS8b8gn/OX"(\HN$kZC=fZ%X#`W4e at j5QI?UK^IfM8Mq?>U.[j3rsc_`BM
+%FJS1)mBg at c1;PP9Rdg\+!lGd$Qq^uI=U6q4.4i&+&0"=TR82[V!hQjEOI4#\MnjG;IklaI:SB"?=fgpW0h&b]NS\>5d'3!H2CLZC
+%7&0N_C_.f)K^**&gp3Tc2.[Z-',Q+@`1.$;:Af-bk7[r-=Qh+*A'BYq&^_qS$6;JW&.6/NCbm2 at Y'iOg(8ESZl8k';Yp5>-V#(LW
+%nEpd._Jhi$<FBt.(CG&T"Iu9KUeE0r-bR46=;^73n,a<,$RnAB.l'gHTo?u0]o!MqWBI&47BS4SDut.<<mX:Qb\6Ws#qRb'LXV;5
+%n3u].RAI2AD=[YnQOXY&>a\>"jO+fm:OH_?O at f?&\!+KFpIl+AH+J&;*`J?/Xt3G4\C^q4'nVg%Q9#&l,W3S9M'c'/+?*n at d0"Tn
+%5C,U]?V2/E9#k2q7g_8E#u[+0Kb#hj:B:i.]\k*5TIcc9>G@\]=6"S2S]pkrZFo;ApGfW\-^VGDf#?K_Qf+%ee+Lj9keLYhB<s-q
+%"[eTX!UO_K%-!J;TSL_*mlMX1JJ2e:gG,cC+i-FGToPalGp/`C6iN7,>jWsqDl&rYpjqP at e1Mru9o_jZK_oAeX\VN!gQJ,1+m)4S
+%$[bTZkU[j')-du?UcYf\Gb(U2+AkISNig<8(GuMS?BWb at X*i_V<=N(H`ptT]H*k2RYtC>^TMX`$U3%bsM-8$]>nX0m\Wg_ZeEL3T
+%YJDO?448QTi`%)DM8bUij<u\"O\A;T8%#B7EK_#V+V3Z'rTn9XW*ZX'+KlrA-?<G0"h!M]e<&Un$eQr@'L)8?"m](Y4W0 at LopM!$
+%NX=$rd<Y1k%@J:P,R6!>[I4K%kpodV#9/N1MHZs#OU)*uRtF-s#KX_9YY.\_'L6lTo(/.`,tfHMJtb?cO3=Man]6r[-cdG1:>#@T
+%Qn2g1TH`Ak9Y@]\kWAmk]VKN^Q7U\]/ld7\;8`L%P)9?G]\ro9eHUrt?R+!FA+Zc\OeV^@of,)U#YRhNKL.+3/M173+$?]926pU7
+%!\S at .o]L\p+RJ\&V3k*.TR1:e:'I3RO,:"g*B#6HT]gV#]+gT"-%_^;k7a. at 0mZnDRO&OPAIDA#$m57pGEG-'kAS-6r>.+oDd%R<
+%qsEjD5U!pYRg`&!Iegt%`LE?H]6ugDrdO_rN&okM;Dr[<)b#oC.X!4/Joj8p+2kG'@'ur]f%"Qj,HajB.4_Y]LeH/%[d\EL/8%cT
+%IO>O%4R9e'B0BCnWFj3#)(I?K&7)K0a^q[2,1#gZ#u">8(.DdF92]U\AsIAEY](\UZZiYoMWa*^mtT>RKJ@\R9m?I"cX^%9p#.Mk
+%G']u'g1#)'+SuW6-=,SOI!]U%WcsW>MCpdReT=cQhEZS^_R`^5r<"2O0;'jbJ8qQ_NQs=F$6g>mcQ4<5Bi7sEbEQ`2U4&4?L`(1M
+%1DJ at P@8?(PZ$oHdL';UjWh)r1M[5sQI[C+/e`Zh++!Z)G[oS3QcLqKGpM.\jl\CRWk1*]K]M9$m,,1ri&n&3%7D]lm3&'p-8fED.
+%:%jGs*4_m6+fM-Y<X>liBlp at j#8+[2`gAE`<\>=9?=E"n7*9Pa2E:rKCk.O^*=QUj91-ni.hoGA>*Gd at +\s,rSb_S?U9B3;6:nR@
+%FFiCVhQo9k$m-;5=!s3[,:6gf_q5Q/H`8c?bY9dYJeu!==k:T`n*7Gg\;lD(;&&0hi7Us6IuHsX\4b>(h0M_qVXMu.3lr!4Y&e).
+%`ni*KFWJXf#K`Ds=A<>j<3<9IN(rXOS_Y\!mdl;q(=`s"APtsOc at T/qgg'n3p>8)M-boOs-\)#c0SP9n3Vh[r+<r2:8BMQ>Qdg0*
+%hOZT84I/?CZh,SU'\4A<I(_MYHY7>^)D;F0,^ANM+q+SfTUZAsA=]g<,hXNd!?*hJMc^UX0&AEfD^W7o7JoQZ.=f<L3N[KVTg7HZ
+%jTQuogf0s"6Go54%bO5d1>>Bl.\&1jGS.6>E**r664uY]O3EOZ)KIAQA>`rFIfEm&9H at NbAF@pWPK6Am2$#%PL(OWi1S(6#36TUQ
+%3u1 at pAT]QfpGKlXFYKOLZA*Y@[Y at OD;\6'TiQ&?a"[Z"MbJ[?P$R'.">Mo=;_B%n&$5VER'Fc\1CpU(a6`6LQE&Flf"JJEr.JQpQ
+%Ee:#q'lROm_[O^t?C?Okc&K9'K6CQZ@@^dWbn-[Y]NikK$16#S(g2E#6"_,Y9Mot&61pm%QF at K#PA9HKfETbIgBIcjTs1dK"ab_n
+%E=8g/-ZCfCn0Vo;$?s<mm4LT'&DuS`rE`lKHNQ7&a5HG8[B/[r&kdCRaD\e1*fgBiKo1_!@r.,nm^3D[G9XO]pfrOEWih5_j[BTo
+%?'T8rped]$6D)jHgdt:P6NXfn6tmOSNADLBNZNWC+C6p]RD$/Mhf[&5J*'M?pgKe-;J'>V/&Y_4^mf1#KX.>u.XB!$:u\S-CB5 at 1
+%Ri66^Ck.irCsG%KnpS-9!`tlI4=RY:OP8gu'KD&aa`!1[S!k\[`P;Xui4n"]>]bBJA_l^'6S-3<06aN%V`*amKa%]!APDI8fGr]!
+%A3S=#").osK>@@r6;[q1Z][OpErc\)m-mon38Mq<g\02OG. at KkpWY1LH)kUC)$9Mk_E79!<Csl]!0UcqZ\cV4'E!;&JZ[k`1qQoO
+%$NS07J$QmZm at aDj/M&BSPitMMGOP`?W4XAC$F7p]m0E)E0q*ZD/4=j,FQ*(or+*EX29BV3'%N,8iC]d!<nC;ToNbR3@$ltW-iq2E
+%?C^Fb<Cg6/U*3qYM=dIu*:Cir7*QS'V9;_'Aut?,.V[NHWk'VeoIm`YrN/QZ9%7O/#oGuF&fUY>ZM84o at W:W4$oK!i;cm++bJZD0
+%^[."9AJJh,^P*IRnjsqfRK-V0E$ksI`IC2fe'J0j-IDp3X@<ANE<OR^11hqNZY"9]A*XlJC%g?rG8<]o2B(JMF$h<G?1'[Wjk_BP
+%Hde>"E-%edDR%>-OVNU0\0Ue="EN,`k.73gj[(,"_bSM=7!jKuRk6rIK<?q`*"3F*q]l^Ui[[-`k'Uo:'--n:eS3C1;i_VSLhVU^
+%E<2m<CE53m#0BmWLt94q'T:b&.&q>[Ao.`@=0;r6?4\;g7pc]]n>V;je)rAeNjp4!`NYHg<^PTYJMP6`a[>N^Pm<Brhh5=\O#V at U
+%B).mM(#Z*\p7J\?9>,J2DneENqrA6qf1bi3J3T(`-jaYB)s?kU46/p!$$,n0\+h&g'>OL3!hT6QqYTaU%-gqZ8>\hH-Cn2265\>]
+%eJ&,iaM'>V^_$kFgM`^gpOE](A74,Ei>m8D84ZRuku9b]jC4I*]oZU<e6OteOnE,Po4.r&MuIb4aEj4KVTJBq<)C?/s/Ou+V+njD
+%"(SW^TCg;gYK!)VpW`Hq5?rY_IJMmU?d<#.s+df=;Z,s4gc=N#)PktTIIZsohJn$-8#a;Y0/&sT^:`76B69#8Cn=GRD]Z"dX?f"P
+%<UA[KIoH5)6ud6;3$HNKB+udRh^5"j'e[1agZIuXU\)Uq2^]Y3?&-ZZrh_JkM=@g-aec>":o<P4TH13gHQG at fI8%;3O1-5'(VeHc
+%J+<I0jid%4mSr1M,8hui9nYd^#t-l3oCTL6r]SYi>>P6l&,r9KrLo;NThg*-%p_q8,g212omIeXDugj>)r^?/8'K^=FV--fX$2T^
+%'R31b5QK"?F3L$SBV'0&:aF_$JTe'QV\t-/f'LKH1hN;/\qFLZAp at grG+KG(kLf<@.o=kXk+"A"N_PKNG7hVO-2_D)$`=Pn(8qXe
+%`[Rk?-;L7mLa,"jC!aX,8![UN#b-)O*\63U26,B,5`:FHm"H:/@=X\Ph_FL$e0UKi?6b*79]\-FLhH+$eg]L)>C_6Y(-lXU")U\@
+%\t.(r3Y>E$M9_-.TG'8,67:Q4gZ[u,=c=5t?f?Q3JO:?@+C?ZT&M)!04:QU(4DU8j1k^2$GLm$$7kS`tQVBOBFUa(%JN!m"S>QOb
+%K!71>K#.^ePA_C-a1eE2GEF"mNJN1:K at VJX;dU.+)S-tJiALG at K3*&S;WP3C"0^uL/aV at qBpnT$">OPLkG_b%@0=.D/RCb#lnK?;
+%)@6uqdnW/6K6_T/4CKWhSD1E=*.!P\>Cuq]Anf*Qi3B\(g0HfhC-biV(m\%B1nin^-Id4 at B*YihW=Q3nZ[`QGoTuRG22"ShD5X,a
+%,N=PCbQ9T5\j4)<2AC_B''5oF%Zl-EE2m:Q#tTqOSe5)IhRSWL)phF(/"Hp+/PX^^mU&i6J]0E;M^Lstg,bqWpVYlVBpSs+'T;#R
+%s3/_'*762J&r)ZP-hnqFOgcVs'FGPU#)]%Ca23C0f]lt1%[\k6d&LK,a#V^]F\3cKEFPP!i4phEFWNYg29i^j!l8WEW9bD&q1R8L
+%18>O%n2<m#o+Jqq3MgZ&i"SKoeZoiO)uf^+NHOFl_iU?qL=%<O`QH1u<XO1g`iKhMQZ/Yg#m*Vm;%";WaO=`.`3rU@,oCIn8nbd,
+%fWh\qem0gT<nTsOJDCT67Ap:0SIc2'o/:("Wl!W&m+O_+^gTN&B$H:FLcHgeO_H6AI"DZ6@;\c.A'(o+p)oiI!pUC,Yl[G2PMjEW
+%"gVTI4-_G7?j![EClKGSRqCKqJg(t-W#`-,,Xne*<fdRk at KU__9uJ6/JO=dHKOc.V!J_C?(A$QI-`1)T)rY';+7fULbW98^V9Qit
+%g00BkS9=mT%2MDUE5W!<Z-T9N[[bNi at grW!eFJ4S_..90[(CQZe;BJZW9qH&BT-:1[GV@]n at PG(R*8ke#@?2%_u$5Z\>Btj0(/A[
+%;BUM+%(2e[Z8!'a,00T8N"\`G5/QS12#op#=n0XUAu&Q4$*)VG)fX^m1#3\!a.B/BG7bsBoqfY7Y9IdK566US_"r`9]R+KOLDdnN
+%gP,9N=,"Q..Rm)>59Q_HeLT\Yi[:BALZH+Z3>cZg34Cp8"I(cG0Uok?O'!]L9W&'6JcnHp)@SUP9+.<rO0).*mc$O[/!:[s=63q2
+%$%]9;@!P(W._GG`03S4)%RI0TgMkalpWCQ*E/'@jX_G^hha3]\L0r90U+mDaDt<\CX:nEr at -AWW=$mXDer8N5aW@]%(iX^pBY!`m
+%Z*A#o>q at CI7HdY91-^E at Jq*4riQTP5<tr*I4-JJ>\_D#1_627hW6?eoQ3`T*-$00EV(k_1hHHPS`4.ZAVRR?#k-Pe`QXD]U!@+'[
+%<&GrlXI56R>hE/1!=*d`fGZkq2GLf9"[T:Y"QD\Ln?c,uZN`TP@@#R&(1p&J60aMETN:$c'Chmb9VTI_A-qb>,]g#&U^k`\TP0p2
+%0I#j7X$ikVJ?fC.N<N'[)d[O-dfNf]>Yhd4!uc'&_=QTi[;"?#4=G5Yin]5lrccLXSFGk#[YA"Rgs`pS4)_Rd?L<nXXXO.2Xc&k#
+%V%&Mo((>D.+R,_=*3eZSR!a3XNJf'+[`\,83[[8,q[_]aFb:.!DN,XJRAScq\tTnbI;gr/.8+%X`eXqtYkMt.'Ia$&;@N^$bn_-.
+%Jk[+ce]ahN$hH+C*tP#QQ-t1A"uc[N[(JEb"I'Xgc67/LPS!d]VZjd_'k1L%!Cn+;X28AJm;&/4#6f]^,lLL_Jl(.CU/s]7pctp!
+%AQupOLud1c%bU;h[c!rH0$;)3VD5WXlF%%TD_"X\>;ue1 at k]4?0Wu>"%\PGj:oeO<3-)N]9ac&'ae,gq(iZ-+jit'ZL<$C-=A\(Y
+%R1![K&jd64%'49^DGAlc0$5eWM72qki)ZMT,&%H9EiGKq95'bK]\MM/&>11J!aDS=?(GFTbquK;q"pr6#nV\c<P7m]<0'>Y?2AgK
+%%_U4nkJ>VRa0aS,:peLpXs)CT&\R%&R*Z3>[uJu<5D`L"-00VZJ]!_Ri;nahE0?f],esq!,,4>1.5&7WTe^WU`>FR3B$XUZA(gt5
+%243*kn3#RA:.r^P.AVq\(soMA/H&]V:Ku+#RFoB/i`?l";J1EZM<G-9H,;4VjA#P16orHHElq>%T>6RITE.&=K:NPh'f7J;`>L#T
+%9c>iQL*F9(Z<G8<"/lS]\QIf.N`\cRc3bq7/*nIa'c:m4\#-:Ddsf?E]1BGV>GU>?S,:;J:@8SdK3[2-*pqnBKKmDg4YQS=cL"WC
+%[f?:^Nj<]fNUHgop=XAi3kKn9`O"=f/l1u5':S7;J"shcYPR!\qA^)En34FdB%h_q3Esem5NOC3)<UM\`Kq)!H=L4[q6KHRT)TDY
+%hS3 at 1QN-=IH1\_dlgj/hgHWZWjQCm`]M.2[6gd*;Z&m0=ag&ES\:cjcKN+*XOH,cf7]A:aoejZFNZ2J;CfNhJGh=bu=Gdl0=L.$1
+%[NKk(0%['H5UV>]]/e,OKWBi#,'Blm3d"7gB5*KIg72=$5`AUOaG]5W+k55&LNBmZ9;hj?n_q1QAe0q#BBH*9gDbnmF+W?l7)&'I
+%4Fp?hFV9"F_B_=WB\kF`qem/eq7Ekupo;G-%6TANenPdaG*7S:;b$F>.1)MXVe3!.F<X],,HCER.8EdnS^jI.Cc2djmD;O,Jtam:
+%E at r#!RqVAbn$Juam0L9.k/pmZV,&n[]N4?kA7dEQZ at RP8+W-YVkN0ls"7H^,Yrd;Xqs)_Rrs_l60@"H]NcS=d4-^GR*%r[[F)kl&
+%!QLY.HVRJfi)/MA"K40>\@P`^Ba5MUY0ml5RWD@/VFc(C&tiJC+2+KbRstYaPpo(?gd&gOEb5S,8M!`E#*nLk!Cu95<=@1"WG*@j
+%S!o;B81k9f-s&tAq[\URJ17bXBdAMpZj]npn<%^c"TX(ne-%`TIK5+.EhIV0c@<Le/?U:C#(IlG2MKqbH!F;Df[f<"QE"ms&ef\W
+%'FM^i-?5?nZ0TXolRfH@"-Y!M5YkcH*!*AG.=_3<Ug9k2eNu!@:.aY<WgAMb6,M-VM&>TV!)B"+G]N(S;r8kNctXqTd4f1bKH&qI
+%$)K,W#SH/;'qR0n^EPPfoH1cOrKTkR2D0,<=,7?5=:iY"KiTJ3*tgR)&=?E!(K1E6S/1jmRrr>oS<,VCJ>j1_fm&7mi$IRq`A/%r
+%j>_b`RcSrK;9H/;CdJjY;3<CP.]cKXB>hhaKIjZJEhr2&`/>m8jY(B&oV:8E9]eX\5+ at FU\d-P- at Mn3),\cumA:bi3SfEnVfEg'H
+%jaX&?.'bsJZ9hnSfqdgg650f=<kAbS3G5d)b4"Ih#UIbV*@th.F]u8;[F?.GGR%l-h\'i>g7TLo8*kaufn)o?:W]oW0M7NCd$moJ
+%EC#6;Kb.-R]Auc]ik]6ZJh,tE2+0J^F$71L)n#_9&Lpmj>hGs7ZN?5(N[XD at -K)5a)U&]cH.qX#(d[$^gPQXlFqY8/aPF@'dNVd;
+%EMKIij.n#%QajnAYrIYUpbe(aP"^?+o3J&IFmK*m(]u82-5$&PaTmt7]]Ale`>!TAaf71SE_])>5'q='T:%,iM#O>+'M7A#T$=BO
+%7@,S/N%hM2\=q-9dF$3dS*7E\JF_3C'h>),_,XLHS!DeQg[3Y!PW):+mB9;7M4IefY,[d!-?h$[;%SKt_b8Or`Aac2f9WEKSBVBm
+%;3&$:[a``_#g5Y("hYRPCg,m&bZ6G\MGO??K&lfC\-&EuP5pGqmD\,DMjs2Bo8CpmKOr:\VK+E650U`IX>V at Ws.V,G#m\=Q"OAr7
+%..J,](OG6Y==%pfHIXkYKrtl:*i4$f at S]4l6!r"fU]`?Wa9.Z<1RSAj!oapVP3$4'Wp`kd7$-\>."2^sm4?SKQ5H4;"=[+V^luH&
+%*'`>6)^fR$%T]apBkWk07T=M,mV=u9&gO6/J;,U-3R2<giMaDS-9PptG/=Ec>1#"cXT#BF&Y%^U6V<&^Y6k.X2<Y&o<WZ1JQQ\5#
+%Zu=+)8=iiU78:Usb?&8^?\I-47!2C_'5H+bbB0#m8YQ,Rf!7+7>FMh2Mo,#F2rTM`CdB>,93dj-cuC@@YpLebVXfWZhk7!Q]^*Kn
+%M=Kek_Kog1ghEY`FP"Q-,JEqD^"2%U;(!#+qWFjpfseJ)Cg9\]Fd+6TOr(O40(K?HclrciMnACpGfU;_n4CLH3lmSeT\SbE+PD?8
+%o;6`Q="TI_KkDf,N at UqN,SH at bN56<-8YXeHTn46#;5+esJ/)2u+8LKAe^Vq<C[S8"(6cs=LQq,tEhb8QdO'jI+u*om9nR;'d896X
+%WTq*/YSjn--K#?`8r=/fiYF-k_%NiL>lAe;iiU[mHE[Bg9abLhiSL(Rs%-,;3%GH=;K,3B2`['?R0Fj\G\#5iL2IVCUD5\VQ(sG2
+%fI)mi.'baGTFJ(>jhO?:>@"PW`E[]#\]0iH305#$i.a+B>!rtJI.2-3`LM5]Y?G at h#6lgRRVPut^"$m68]e<%AmAOe7a?7\MDe>)
+%OYlKX.L<;!FIQc)K]-3M2fPkehk</gGZ(;U`Bs6U*OD`UDB`WP.-ukp+TmYP:]c1iq3IL`YSjn-L,b9Q//XgjFs:s(b##[3=qWBr
+%$/+)(bhOW`NC!.$d%KnbVIW+D*!85"LetIG=.f/qi\icP<rrjJ]51</6I#a2<&D%EE,]de;ms:T%RDp>ALj1,V=V]a,jV=+ETqdY
+%2J0t,Uhr""BV'"fij$:R-Hbaa;.eI3)gtBuhFM72_*S2>WM!<n6IodM\8X-:W7 at cQ'k<*[F7*"T\h-dSHH"Jql5:bi<s`]?]"e`4
+%QICH@?@Iu$CZ:_G\u=Qh/e=qo8M!%56(!7[JlUBFS8g077au`KPk%Ln5[o*17]<Ut&iIcb9Wt5SMBI7c31O]Pn<kf3>`9K]nt<*o
+%ql7MK(_KAZ@<O8L;:I5ZpkbU,6!(%A#'^dabJU68eV82rHbaFgUQc20eZ_+cN2O(NSs at rQV*]&5I?TPiRHPdd-io[AE'g8IntrFq
+%Ch$oCU^aP:c.U<=>/b0nY]+AD<tpkFdTIdgTiQl7RjZ>ckb at XWr]4cpG)2,Pb:\o!TB10]-[(Z*Q=C9,R7FD>%;;h7RBX^!09i;Q
+%[RFR0S.mnkVLeMD(F='*#V[1+"i&ooo'u.fmB<_>D_>DQD:d?pM[&99j"72DquT#r1"T>5LRYn!+I+:6+t1SmVPdL<.Tt[tf(qNT
+%NCl<@&ojQ9kFnbcDR.Y*ZNn>2`:`@c'ebkD`8qa7N2*g,_C8H$c^)^N]b[>>'.B,.92[=*Wofl:"=aj*:XEfXNLIEje)Ci#oii_t
+%BaJ6M+e*,mc\Yb$LT)M;H<iBQ^+EdC444JR,j\XT?R_TOK1'TT?FW]6,#lT5o$4=eTsN1YMj6Du&;r(@;Ad\FLY at hfEn%HlB-)qD
+%!X,`lXf,SH8%Gi*5pbO`=b3QPYtf)B;2ng.?:;)2SZ+C+3 at bi\7H1_ji2Qra6hR>'EHqqlMAt]l.#]/t9j*!7gX at LV&ftbGWXTNK
+%Z5G]*i)Gt?Altjl0GtC3!j@(%jR")T-oC7XS[2G"Korl:$c=go^iT+8&Y6l%\%"Q))Nd?%*F+RZ:tVS,hElq`c]kaf<SsBKPs^]S
+%B;(L9hQ*O"*_A=nLN#Kq-crcI],M+PQ)U(ePB)M,o&[Gof(d2Xlco;pVA,&C5a%aUJC'/bF:*FShHj]RGh(kkZcQoX+R)](Cf)CX
+%g*f.EM//?+Td=>?60 at 1jXg*,k^lY9m!:#@aUAbgh+_lD1J'E<X40&;s.8P_M6Qm!q+-'U6JjdifJ at dm#[A\,bG$=.+1rIbAg\"J4
+%)o`VU2$l#&4c at D-dklo4JiI<HFig?1f.n_U"Y$<=ShnJ,-E5E1I7T9,@[m*$fdME%.)50aaH#ZS=Q_bEH&:6(crbY(M^Ti-JI&6:
+%&LABt9P'tJ0r.AQB'E7p;'fri%`rVrjNQH$hJA[3$S10S(T[:0P28NB&O\KYq8.\tGk4qN92Yo%Wju"d#0jHPl7Z"t#b[e(S4-,\
+%pfpgXK?JqdB5 at -Qbi#H%Y"_/i<bsng5tqiIGjK1I792:I%<Z^.3q]mXU$JMcOOGHn.tgp1oNOb?f-KVHZ5-47i'jn2%DX[_!3qBJ
+%ipMD<="&oGNXKKb1,(=HqHB#a.3l0\Sa*>Z!YQ$Wm&Wj'qCrq(/P6?kYY7&W6A"a5M60B3F(sDWk at Z%ln/Zn<9URrSNS;I1`th77
+%.,sH!J$ZWTXcAt!N`&GCg$08T=0"2E@>M+-#hiC4.S"1`Tp-n7T3&h:Y=1*1 at 3kqPM56N$$RUe&IO&u3N@)%Y>!8i>/#BIaKsHr^
+%g.X"Vdk)tTogjqkE_p=EfiVJ/i.6/*Y$"7#4HY82P#'X3O/S$JQ9f#.dmd#R"InGo\>E]LiXUKY7KV]S;]uA-`JZ0UY/FJ.M:QK<
+%$t)@@$4p%H!js0O)PYH"M+_,?QP%4C=ODdn236_A3#)]jMQj]<l3&@I>lpOX??028'_O(U!,].'e`/Dfh-/bggn at 1g2qfXUR&_"&
+%Y-2F'+ZKoV;IP:e%qi^g'fT3V&$qE^'(a*G?E51+4\@L=B+?8'4J5HPrn=6lG1(&]C3V>1o5YF)>Th]c;J-i`;=jR2YXg7r'Gf4@
+%WI?q49!+&/MpATE*(OkOA.bUk]IhjK9`dZ>3D2Da(2ugNX+loUe=S6/-)C;$Xc[9,HqBVM5msRBC>Y#jmW%*Nk1Q#5C2q=0-REuV
+%0KUk$maqAe!msb1&tE(+,,b._.rS(Ll[NsBHq;E18n%QIrZGKGDFS7G at nj,s at YJ,D4/QE`F;c"Ug*irE+h1 at TTU5/oqm7hH6'`CF
+%"J\J>[=)LeNeh/Lp3f at sglMj-25eGqm3JFF%C6eE"C%;j"i9;pOYbC!#=DB#3@&grnh\F>WKWdR5Dc'Q_F8'&"u)rm'c#GC&t4Ab
+%`K>Y<do<MSIDom(P-)BqQ_l4l>&?7&qJJ_&+ldIhb05Hh3g?j2BX2:!H!t at DX9sB[TQoIJAGUD+:7ums$V.DR"L/Yd[2NS+l2`2f
+%V3NH_!6&DLjrcBn3MI"=WU_\7PU'Y`g9O_li'aZJ>\St/P&2pr-UWu#bjK0_Jq<1$ehW=)Z52A7>T9)>6G(CE&bV at W;X.(VlKg,;
+%m`gB at UGV>Z)K&,0T%F0sb:(WP$:fd%'"E3p)3.gXeYGlQb<W&P*3;ME0ML_!N\5OS6NO#32nq/B:aJ20/\8K4p+*&bO+\b5&c.la
+%K@*gIj:^<Q`E$al/8Y-IF*'tMUS9Nl`=,#8cI"0`':A87.H`E)UnbSc4Op,pAcgR_WMAB_&M#uhI<&Ye8u3:,b+WJOdDDKQN;T3I
+%U:T\VJS((28.U;"e^<'5Mm$h3je=J@\7NKU2Af8b_PMeb[IoY^Ksk(o352V!lE\WVNO%&!C>M"mk.4*cT!!3Ld'-SN+`:/+hDe)b
+%0e:CT#DsLQ_:`h#KuFg(VZJ!j:6_fjUB"*u>*_Xf,4-lB'9*.G;^cdqFn!VbBFWCCNT,t$]Ks6k]]c^B;$Ak`N+t:HK/:<#=Lb#-
+%/NbOu;012J!]!L9[u<p>gC.6MC'7;fOfumeki\ZJcql.A!,MmVV4_S#I,acM(*gWhK6=4+knc7*j3.p=Uqi8&,bbGFcBQPA2aak%
+%?@74_+I!2,>/@.BY_KV[gc\XlNeYHG@?C*p>6-\W-08!!bc._#!flUYL7a$%e:n+WLT.tC2GO^UL-ZYeT+_sfC/-gUd&1E+Cc--_
+%p-,9aW(D=Q6oO1+(X8nDa/2Had6tW>mI(1t<^TF86/pLkhIS1U5IM-VE^]E:"]#EF2U]%<Y>b;>8Ae.OmOb.om4BW(#`.RTK<)l-
+%.nn at i<P+9M$4GXJ<;5=\<?gNR1lWlHfF@,#@a4]-ghNa%>K<RP]?*r,S754S4_q$<E?#FF^p+>NJ/4RE at Vhb*B'EkF,X%U-:":pu
+%+9lMdFQ'Gtgn`NNih]cX0_:.RKHu:.]nb<'[Z-;&?;hVI)I&^a8hH'WHSN\FJorE^UYCm$6"3K at S,l-t2%bda!biGe<=IeT4^NFf
+%Li'=mpp?BLHT/7;g9=ot,o?.*<([VEP#^".c8!T7rC&8\eA#'e)!2g[2/#S!5iLYJnRM0#!Rg]QgXXS=c'!N2?P3BsRA"TUGFKa;
+%X\-!WUePX_PHbt>VF8+S>WAl`e%hUnX<T=?;KJ&TVRe4,jL-eg`k!]=9@@:[p21JKMO#M3*tstuN3%Gt(sZ^h:O@>:S#%@36c
+%(TD2.,SO#P]rchp@:Yi>"#epC:!CXW3LtAkfm;[-E+_nQNtl$O9r4Y\QldAj$4u#4%0sk`.mltVcC3.n'c(dm1h`"tBpQ<jMte%8
+%W-)(;Qp:1`_9o9lhPW%RDb2&_V2Z2&GLGi:/3DOR`)c7G"Q<*gJ/O/mDmq'-qucRaa["dLHX=N&h1Nb91ikqK4j=[bbcXYU[@(e\
+%)i6:_fi]UIbhA3b<oaPDih6N,8eT,4d7G/g']*4$*u8RT(5L*L<NEqk:tFL;Ss\E`cUJWU;m411\*YTWGY:ra=77YF;iAh6d_1t*
+%Ob0N:79CPH^hnk#C8-!*b>&u8,)m%_=QcdO$tMtE;e+BL%+a_bfsE9Z:V9_ZA!)a#W_($JVb/;Z>2%)6]K#!QMMoVsPg#L<MEB$R
+%9gb09;T#7f2Ql=MV at Z`d^#l-u)qY'PjSt(bkX^$-;f\]/dN%FsfEB@$*%Rd>X0=M&Q3Me19bJ+%LEbGncFVbeW+re<1p0LV/D?Gm
+%95e^F#P&]h at A[c2*Nl6Y`ts)qM),q6pM,4MAjaU10A8D49C+2%Xjf%5nf_6HU9'&raK-gDMSi;)JVt8EAC6ImZ.2.k70ofV0?OAB
+%!Z:Q,ipgugj=8T3)>$=dP&#P%lpa(T=pA'"LbB2oH7%nl<h`SP5`cbl[38Y_h*hg9oKZn99jG3<#":ag!g[H95^\^6DJo%5J71pT
+%bA0-J+^+]f<)jjCpl%`^%Hd!t]de#eQ+<5Q,'Do0,k$#Aj9]RACO;.>M;"b*%5:Vc*E&-u`l)_:=]C.'c9Sq"is[K8hc[pq*4HVh
+%$A4^=H)g'a8HKZB!L+BN,9nd7+JfN_.c<nQBk?Z9(ae<9ljsb>H2(;P2k*8_ZW0`'9auSW_-l?j,gCm7UVIEu)]!L4$X(H$c6Yn<
+%dHGU5R]HtJafJtcL`pR_#)#I+67,c\e//gXFXlk\9UjCt1M+5uTZSOj/AreWoNN4ET'=RT[rMb-R4k#;enRst;D]r49T;%5f4#,A
+%T/?_Of6dSQJX9;#'Hb2uc>3OgDZ^l?L`'jqQ&-_m`RL&.jt.+=0Pog9;.[f+VTraRV9#WD::K)>#s+W=W#mV9_O\EJhcu@(Z=kqU
+%B+?1#/Cq]Jk\usrfrQ:c8<+\,(`XUVEc)Y_'1Ubs1XTce=A__+Goq*2 at 6<#h!&"OeMFeF!,q^S95%Pm8UKnC8G/A##&N83bSWe6t
+%TWg:NV/6En32ST8:1k,V$"Bm^W:D4eTf<(Z,hCpMK,W/p9LE*3c(_INS."=[U!O67 at HNTlXJ@L8Q_5'm-0(PI\Z0mPk583K4-;#T
+%FfZAV84I(X.'!,/VUROmp,)=,;Jg1%6IMUg8\BFnORGY:fpPSXQFJiapJePJ65Kr&o92#^Vf:(bX[(DOM!RtdW06[e.L>sAeV)pC
+%*C:H97PsQj]dZZ%WFFM8a&2b-EUl(6QW.j#iiGBLE^`9M)&e0mN1^q].?k.5h9]$lQWh7AmYou``'";2LKt(P,(.oh;3E7REI1[m
+%[aE%W3,,[pNQ`FhWcDp<+.5r3RO(fBP9u-30g7j:V=Z#n79E0Pf2r\:A]mS:1W3.u=%5NjLm(Q%\jCC1K`kSPd!*q%Mp-@@!MgQb
+%i27HM*H70>'NCiI&W8mm=niug_Vn)H3Vi]I]m&eMofB5Xh[T'>S/243JUKZL(\ABO'rN'g_grLN2B!$Vg7i/&o14U&`UU^hWi at eR
+%k-rng7Inf[+/0mT<;cGphmI'%7ZCi\,.0 at _\hSqpW7u,:_99_V#4'2 at A\Rq'1rE)EFEKbfR.#h8qb.79TC-3n0e7t"l23Vj&9/$4
+%eBrYph'rWp3&)DKFt0 at P".t8A3<bpG$KdR2ee$PQU8jeh9M(mbp(Y;Sj'VU/E6>*aQH9`.&tYCa(_?qgL:rr"E=-4[8G%dkULgET
+%XIHN4VPE_M5bQ^ddHq'''8+^>B[\C9S8"%+7</=&/"F8'FYKb<&_P>lOS0o2$PX.Y_hD^m at eqiCrt.MQ?f^1-kAn4KpN_7&[@pjU
+%Nfusj=Z=KKS3<O_]/U!c>F?bCi$`q=%OoM'J?Z>7SY9Q+]Fl_V*Ck;$R;hl`[dS;;63psYF9_S$".=J=PhVah6^K]C-/%GOp/^^B
+%QUS0i\M;;$GjlFn3b08_YJd`O67g!*:'Xl\T787FCu?r]+l]F2,-n6od?F`@!Sj=$E<hZOR]9UNVB<7QbX?GL*\8-bL/fl)(/R7O
+%i_).PoFDp_YaBj[QKO&l!Ta;B4[YBP;RoWt4 at b!GruG`)d-8#n1-<lYe+#q["0$1^KJb1ei0=]27G]es`m^F*'$:]YLO_[Va&:5l
+%#&C<D)!08R,&i=]$(fkO7pO(9W"=kc#A?F!,nm3#W!E\ahdp:HmD.^-4Ib\'N'NOAAHc5Qe%lgj/RJ[L/J],g(NMYZQf9I`e``SP
+%<RYg*hffm at Pb?8kZT.,kRC>Mm,H]ch0";S/Y#G,;Ir6mogC6,u)B3#/gP^$DIn3s&m.o[nI;h3/c+Z:1 at U:aJ4[N6MEgmFk0$ES)
+%L_8m"(.)RJN<QED&dI)/:-[O%&4mpCK!`6hQW%q0hPn:2M"ZN0Bg at 9=;2.KR+(H8!dtUnYaB]Pi$NT6OP at rIkL<#q^pB(G2FcKLf
+%dB)iYY.._a-pY#<nMR6=h$6AG[iV"ldK*8dmWk&:_]_uhnT0l7Q'qu1*@)(AO^Z]$8+?c*Roj)sls6%afl8*mo4J>)&%64![#t4;
+%1KR,:A&boA1$"/4=jU2#a5lXY6KVC9%9^7Z<2-3Hgk?6'=b0WHN?n5/6>H^kOl/Qbk_9C^1Z1(4e"Ur+h"Bjs?.-Zj3VLC\T+&8"
+%TEM08 at XSF*Xpj1njjN'=LBm/9G^uFQk?OLL="Hn-D`qauQratoUgENdh'8VQIJ!>'6bJS,UUQ>khOFYdGcTIXktX&mo.prV]\+qG
+%&?/b>GdFmF9rF2>EdGE)2Kjb\WZ\nS"us at RX0IOPYPS;uKlD'&dNq-@[^u:*J:9oZTH.\sT1UE'ZR1c0!+%\$MO^<5\mfnY8T=ig
+%2!GnnrTWt5TO/6Ye6YOF;>XD:hVCDQ6,95]U\K3`pF+j5bVSL`Fs&+Or"Ms9SB>,nA+BMSQUNC$$Q.G^RYp?3J06 at nQ<7?f5)G4!
+%jBGU%>Dm2JEJMFNmrHT+jdgc79A_GRN!#HtCeF;:W2V"Db4J$k_M?8c+TCpX6Erhl.h;&/;=C(T=h^ZrOC2#n'k0!;/@8#/;SZ*C
+%:-U],83T*!O+#5N\f!f;gu`p;N!O8'@>?&2`2CW$TeCpp1SD3+`ou(^`ka^tC*0O&=MIYWQX/LmBL>O<PuAgFSqM^q=HX)c=3b,'
+%7aYRoV(l6-\Kr\,bLI((Qj/f'6*@1>[3+d[U:#<n"<4$"-q50 at fK.6=nb9Ha"42_s2oVF9_E\Y_aD#ce@:0jBrV%QG6f+;M<]!5:
+%mt\T"@lZ4FKcGYXH)RFh%L]f/JV,ENl!t8k)l*h5aQOu]#)-XAb"J0%CGt9]9P"cJ"gtB,5-5G*OC([RV4FP?W`:pOe0?ljNbh0+
+%lM#7%=a,%L=5#N.K`Oc=,23kr9oQG.8dN^fEhZ3F\/QTnVS?]7WMW1*)`!>'R^X$3P?!]*-F2/MK$6++7k+8DO[)oX#oe+(bW&$%
+%TFfR_iLq<[*)Ug`90&S6C/u5D!/W@=FnWl14tCHEIN.e=.YWhV!D-_Uc^/W_&r8"Yh_0S0NqkjNrI]nto!7Df6e$,l*1O^f'uT\X
+%;@\$>U)%-2Mhnj-]^rB)nJlce"BaIdk3E<0-#6%HQte at UPSj-IE>(=#;(]lp#]%jZ.'s]/5f;8-XdY=V(^qClf1h\J1j&E'#0Z7B
+%+.j6Zragc7ArBY7XKe,&.L!fZHMGg^3*.hp at 9A(j5eO,FKYml0F'M8HV>-!U"9PD1hGQj(,TDdmN9DuH\Lrl3J_BLem]R$mSP`oD
+%O7DkhP-\Ln6->F at e*o72^mhU!TL!%+N#dlkU;N;[ZiZ&m at f]erpLnp2'VKn$0Q>eYJ<NmVMInWR#*pd/8m%,TP(89[ajLPUB*W:(
+%9K*5:FH at P<>>AmGopha78$,kZ?@:0D'u/it>"=JgFVj:OHJ"on*]B4+gMFnDG9l"JaprEMdd%AYNE#?s3MNK62QeIBd;0i1B#W2C
+%mm7Y&+EO`:AlLVeDenpC<)*NdSLfG\Pa)iqT0t0RCqYu?J2It9Hh'X+=sjXrRD]SH/`i3a^@#s$`d)$=hh!%^'?\%dO/QfJ=]ktP
+%.\^GHf14i['M="9 at qAgnT@p8C]/e!A&Qp_oet9JSWlQ\I5BeKgiNPm`Zgkmd=V0EQbn:f4:)/2BE!cmt=33tc+Kk>&W:s&]"6t:2
+%FN_PHBZBNG`rNKhQUJgb^2\Ns.MVoMf*0nP)\?n]QMkVsU1]*'k;WRsg(-_?`Ld70W]#@6:;C1="H]eBMH4cjNHl)rAD[WUg-/cm
+%`CfPr"?hF5X7)99U^8QKWjO*0*7_j&fPU-5DZM`,]-0Mc3/7H<n/f't,tfD4pQdo`j7#A2*F#bPg_Leg[b3;fV;gB22_ZFV!'bc#
+%5qOsWQr.3$5DQn!'1M4fE#tYVDI.W$?Nd72Aph]$$Rd:&.3\8<bZ^ubBVT4Jgsc:p3;FG>gtDSV.u9dFZpOR$l:Huoj*o-/A4@!n
+%MB=Js+'`,_dIeLrYRiO*p0T_a&8 at AmN--p%PogA2lIlJg$=ZMZ&6*Oa]/\\;[F$G&9ucq'I+aL`&U_9YK>#77rJOcjrEIRgMkM(G
+%65o2Ep1%`O*Cu?T9p?Z_OWt1E("0q'@Q"B(Da3_Ln$n/%&Q$p^>k)$d+<=;?lUa)X81Q!+&+U_sa!0RS9NO3Q9UO6jGiGSR>9.L[
+%3!b&/\77"m#67_o^@;RRIrcpS;&M*hR at Nqr3]t(/-L/A'd at Dgh"2mc^X.f_C6W?1S0d$/tKY(h,B at IesHbl[(41F14Cj[3^/a$4V
+%hR+q!Q7]fWV;NR5>hV.\BSM#o=\k6n76ZBR^blfMm0aKCd%,0i4"dWsDGrY$ie(ZLh-Q9&_)&[2?A4MdZ[#38S at Qfco$?1B\+DuV
+%h_*'sE+C_p2*,_8?+&GHk:iQ9hh*JN@>?=NXK/=kc,_U%TNr#<UM@'Odoh.1Z2mLj3.+K1H:K#Yb_*#6"3nESs*XLUiG,F1aKX"D
+%8o?Og)n=^j)%1EW=m-Wl;&Pe/cF(0e'U#pUfn&#]p>Z><T:JdZ\@-f at c_>E['0kgDk(K(=b8\<7]Ls&#\4JHl8=FDlhp48<P"lc&
+%aXXCF5nTY`X.H6u(?=LQr`64e@:P4<q.;4Prc&SZC[lFRjSmCDA6!_]-9VaqRH^5LQD-?X*BC'hZ=aQm=B^R/YD+^H2B")FQ6*De
+%^@3IG,ZQkm(/fYb.[E'N^CNGf>gC1i4'cPUd"?W>R(6JdfN'j2ZI<9mYes1J\h:eAr?f`\oC4.-OefWcgM&5U@?^@LbU&VFJBWuj
+%=epjY<bPPI\0GP0s-Zkf#0PD?7[3t?K\nT,6'uSH]P(]+P,i#6S'Aqn"8&s'(S3-2'T38 at KiaA8RrGcf=JKnO;]G]AGqO^mEY2?1
+%P>Vc8EHK8_0m$s,GB%7.\"36oOQZ[8%-./[dAPs^VuerQ1a'?I$G>Q>Qse-/`jaoj#0IgP&aLo53rfIuHM(t;qC&oX`__,Pe#>mL
+%228d-:*u%i<Kua35MDTu1m5,=)/j52kj;:\k6DKKK;55'A`A at SPLrk/iMcWPA24[)3g_*+ at t'/PY\UG=2Eq;VVStr^Cf+7)MN*$K
+%9k.>nUu:SE3QD3HU'/\K&;.%<BD$^C7M_,-86ZTXW\u(qJ.X!aNC=,\0b$-T`KYKFIif at T/D5+e,sQW8]1LZMhchC%1G&NQ!L-uZ
+%hRQo at 7O^3CT1AKb\GpM&Msan#-j#[lKU@<-2Og8^hR.r at 7.;Lr1d/oU;ES<Rm at Y8()a'ZhOJLZnEOj at 4J+UPML%SYbr>oP*DT'Q2
+%pnBWr0'm at njs4.KjI%NCK:bJ=dMJi-1`U1*cJn$u!C,*L(^!gIY:[636(1;I1?m%lp*cE?NAjfMp9G%B2X0'a;li%9lL6W$,+U-\
+%8O(`j;\?6,bK%n#l7&C?PpY='^`mG(j-cHX%*TFk=D=gTj()4r!N6M#`oNm at bQ1[?lmPWK@=,*,\3L&VEbk6k%%jfP"qOWp[eH[u
+%"fSX?>Z19!k<*jVKZ4lShBSUpp(t3Yl]E3seVmPc=5^![UOk0O$LAC'/e at k&!-TDBC"XC:L,AX?,Hc]bPiCb&PDjFNeC8IO&t8ep
+%!LEX69qG*Ta)B*)H@)+`XhnOBZ76]MQqU%OI5<)l6eQ;e`h5_-TCu91(W\>F'Jfe0qFpMYU,.2N$rn_W6eG-^$rS3TOm\iqZ!pu6
+%GaE:6=s*p'3/'W;RN>qVX#RQJ(r1q#b'+`0,^KgN at 4?B-nn\";-6X-3=f;R-AhQ(/p44ZtS6!1hb&Uu\]3g2256\jS7"(7e/[CQe
+%^];.iU-H'%/tkZq^&UcunuahT86G#L\;X%I#Uq"H8I-aE$Ou`4cntZdUY[.(""inb_mOP*_3PI>aF3(A;NJOS?_lh+*qRkiRu.qM
+%s-m]QkoC4e,WQ>I_`Q;^hlcl#6'3I*@g&dh6I"M'ePAl1N,bPkho;rIAl]%9!We>.k-2@[rM#%Gc:@^=]YOjsD6iejnb+qiEX2 at .
+%_AT.<8W=;"?B7-$cjDs at go*=X[j at pS(4\H%E_^2+H6U(('TBp2aP\gJ+3%^i(_i."EcKeJq7bRq)[tDWEDVVP<_ml`ZmBAo+o2C&
+%oa41@'EqCIM->%Ng#+10]<LM,aTn?2_d,jc1M1T)'OI'7$\Lm8Q=L'E$_Tt8?MH^:oi\ElMSQo:9+H>=R'=%0HQmVUNM at 3ue?41k
+%ZZ6611%I>,k^1/_:=aigXN2N16.07R2ZskGPg#SuK:meuQ;@m1(O'Dt:BP3>34XZ*VU<H'.q$X%kl`\soGR^,/<0_rJJQN[e>=5o
+%JG<V8mBlk]c,N<Z2Z+8NR0`R1*GdZ^@bX at 1L^g&@ngJ=OPA at 7)hLj&?U*,H],Q`S6ILWTO";Ha3mg!&l at Z<l4HIE1Xgt9)gAh(XC
+%3Wo-#"hK\%-n'D*U*G9gAor^[+%MVH9u<)9!th6jIrN8d,C at Uh6hKt<qZejrE>,9Ji+2$*7N9sYj<ZDC9Y*i-#K&"76e/3B)*sQh
+%8OpTA]slJc9S95<D+kojec(-u(l-1c*iP5`lE5R8I*k&X9bN:>'EoV0J8X!>#6a[ENsHSo*"FK1I>Dc!;4W7)keo;U*as0DCiUoL
+%h=G`g9&gM5LO)B_<s'9,W#\#4Oab'Dk&k-QF;QPiWK:P%VN,(S%"lXh;?Eg at 1[Z$Q8Xf&6?r#'l6WKM9,$4^WD9s"5TesYY0+=np
+%cu(aG?r5!,#HYaYUI01<1%?LUNeeCE$_ng6o+#;VGMKqMJST3G*ALSik%^.>$a;a7jk+N9-_P?NOERA.U&udjcLl''n\A>o,t;Rd
+%FE6 at Bb@<as'S1PF=LF(GB99%/ql#aHN\U8H3B=-;Ej?H1lPT/dO\NcCejZCpi!$AQB:p)!R<Tfq"(Lb)$g$DbkS at g873Wu"U97V?
+%8[Z>Q at ca&2Fe\_,W9/f+cr+3B?7qM)i3'+,\^16p'E6jXVTnFi,m[bUf:f3ehkR;<Gdc[%f:1,`0oFreZoKa\.O>dI=uMT'iHp)n
+%Nsu\8;g8*8,6Hat4XYC_ at k5qi7lj9*$3WjUUP\YFWVIuVGR,NdGOhma0&%>SVPC-9ca4SM(lXi?Bn8>pNY?2o at 7FJ8E-#0L&<M7c
+%r.[LmBRBN\^l72%0Uo-EQ?%7q<S*XDTb]8-dNK at S@9,/s#+9a(8%]a-KS at c@WrmbFbapd+/KiV!,8G*2TUg,9bUpn+Fddqs4f^*e
+%7-u8d`Vd;EY99 at fhEBN:/?=Rgn)0Cs[s4(8_u?fYI6<>0o$"ruqkRMC1 at mEYULA7iaTF$,I>E!u7#ordEs<j0e;dAG"uSl25OV!b
+%lr<fD`CosNJrj5F"Pq.3/qEb9i\kap->::%p,=e]Ku"OCBqq8rI8hR6LqSatI45^[mWqq at 7(,?70*Pj`OfTZ4?/VT&CpMKQ_<0*m
+%-nKI)('r=3=BQ\0(dnjE5rUfF1Lde!iL>9'I,s*38Y7#-:hb,>WI;]2,AncR+B&o'HCi#D+%FH4=J6BJ`7IlZ8B:dOkahU8X/]35
+%_@*lG*a2!-AtY*8X2IF at N//7,:G8?EgnBD+==dG,a/PZIq4*(\@/8Zo]G0_*"bf"5K6CWagU5r0aV"1,.?-Y+.T\Ts\UtIP?rL,@
+%8'a<$9(<J<encRhG)QGnZpT_>@sm%/RDbI!n]6K;b[?^+P2p3XjA\A)`3UYmF?5htq(5h0H7m&@0P/)2?8LI+!El4m/_\=HWVZ+/
+%k1ug.CpctnOt at q^dDJb2*-*LX>.W1G-$sVb7em=&["i-4EeT`tpR0=gif&0n9Ki5cE=o);TPu(2ZCk<,:7JDr0^!(/YU81Ib>W;T
+%A?&fd%UG^H;3"9L0si_"o.CZ(7jP(('2Ut^`CAmkSPqcC(,cDCpGdX.YW/60X&Mo];(P>6ge5HW[P,eslS+pV=MS'[k^4<5C$"_,
+%^IpXSS/sGDg#o:o)^p%O]#DQ+EB52br88.dd*U#BQJ'<]5-3M0W`ccRhd*PVDmD)"\i1T_'aR9&g,r(C;'dDjbG#Jfi)JP)HE1f-
+%2=dRVF&dV?Dq]kmi#EkB5)`(sBpr4_-PJ+W`rU=n[<2UC!EEc,:0k._7:R4pk$g_lg5VZA:OtUFYntFUp)qN"?Mj1lYB,qZJYKOQ
+%]OQ,Wdg7`tj]elDeOpiiE+[#@GLFk`eNO.q</+6EHf+uE'5"!.V-r$qoMa=0L01GdBD6(QDMLY]l`Z_=+%We75)bJd)nk"?!p;A/
+%BmQ//he6NEo-"!t4K\7N]h_4[B'g]XO_m"S<EMaZUidkgJFBH+aEZ5SUu-27QRf+U8l^sVrPU*82Y&l>-H=!X:C at X8b#?eiO3[Ta
+%\HF$!d[X4*8Y^:&-Qi<2#Vgq4;[%%fP!PKr=/&iJK10^nErc>qF=<6%3)`WW:.uoH#G8-":rsTkiC^)!FrEAT/*!61qp3CUiH%04
+%A\@.bdRp.&*UZ&DV):E_<7SHi:ks,fXRL0h+4=OUV.T3]-RW)=*f(X=kuMp\j"LXeF^Z;\Xs59#mWJaL%(U)nm?\RU?J-oXKlCcP
+%IZaWDELnXlIoeRL&jW-?!AUOC\]Q]iK7N!">t:b6#hrjD8VnEHDF987ff\%p0'GB.I)?'@jR at 8rq[,`4c?__l37k at T"3(d_=1,UQ
+%>#_mCI0#F7X<<G#mV>3NC7c>q`TD at +_^qrdj5ZOgP)B_YC1>TH7\$ejZ9oSa)uL,_e4'OALMgR#2]WIG3=!13!9=Ab\MXmh7$j]%
+%)pMs70Xp8c(Pe_`cZ/g:VEWtSm!+jd?P at p,*30`mBlk(5h]Qk%JU".6g=?OFOjG<4*UCF2c?B!LP9EH1`J)Xo#pI+\W at 1AG[+Xbb
+%!@H!^<sfM8Sp>.[nS1K"\pQ&f_A6)Q8(Uk:1_(aj<u7kQql5?d5W[EP%\1H-`kB.af`s#-(GI($:3khH:4X$Z8J-EUi>#-9r8Qj9
+%Ys8d:&:I,)@bR9',1)m at QsDah<m)0o=[+SACr$8\=l1IU>p2!r,)f\gh`0O at K:3(kmZNt6LcZip96,0>nc#7LJj!.;=uq#pd&QP0
+%#cN>!)$_Y5h_Q&KEK,)>nIuL;KBCEq'uZIV2XXEV)N/m;%,>@D9<\fT=Y,SpPQT;abf7(2$Xg>E(a<o#^^&+p"1`R_5S#=Rf,5)R
+%\SB9-$H_OC at FE87rYg<a>8keBA!I$s93<t.?MGjW3`4Vc,RSScl7joi+mHJ_c;=tCKWrrl-']sTQ\&9;8S,0Z)A#!=o?A>9a<XV+
+%#+qP,&$\'Q=`lA2D&kr^'?\82R?F at 5C"`>BlY7'*/K9c>#-!'Wl:>R:?Y>h"Ch*hG<H*6^W6lf_&NBm"aLA2YN)9J9Q3hdK+Bn*E
+%-ZV9sC\j7'q6155aT1P52MoeFIN]f7qn.W7!A&%q#$1o0lfc0bnJlX?7JY(<co6s<32K6a!r9\'Gn[FbO#90DX+qJ]:#Njd&T>ZI
+%Kbs3>K6:Z`U0`fp]*OWR%A"?hK!NFVIc(?*I9$@t(OuMWhXiO&K/sDh(b+H-<e.)/`+'-3`MRiq:S^<;VK0'd5)CCQ0li9j=#FP9
+%i<+&Bo!P<C?k"7NdO7_h_rYRF2lf??c+Y1 at FAbA3+I"]_BW,.]R+P<^O=rTO0odm`G#X'oTfDkhS1FiBER8rjm3g1a9LoYdbru.m
+%-m[-rS62+r36)G5%#$""dZG<S_/!'cgI.2KF)sDgH2$<3gcEq'(3A=PUrCO;mVHaeB.h!,/Gjt<Fu\V>fc7?'O".N+-Z-Mq'$(CO
+%&7\%H0h7.I3Mo$q at ua1^GWcq;b.If.I94bqaqR\CF58RB4I!-sSRcT[1KBhTc/I at hk\W4fkms_DA(7&oIN/pDRU"+tY-3>/$5B6H
+%fM]=S-FG+DJLN#anH/Ln(!t+G`#[>[n-@\C*b<mEdV9Ui/A)TheNL/X/Vm0DCn7l!/9O5t6`N[@Nl0YdSCg6+*X-N4kt!Tb\N6'U
+%mNte33P[m`q4N1KL2u5-7r+GY(g=72,t*7Ig$9SP<d/NEYe(nR.5<k<?<thZYI'/C]jn//_gS!>P+IatLAgIn8Qs:%ea;ZMLE9f]
+%DV,N=g4O7CK0<uG=I>-@'dckE5iGBdUuGXDe*?b#NE+"$368g[dCI">%(s8$-KD1FF at Rf*Za?dEh(;/s3Q?2&RQoP]LD;.="XK".
+%b6;4CQO=3PC:(RuKWnX]@!-NBPmkrQ!8]M3"?i\.l+]+!I-+G].k]q=\VP2p5c4XHe+Ks],?[Fq[$@ICja0T&\J"13S;CbPP``b#
+%UUoA.gCcYDT=(oP)PBF(<tS@^U5ZV)0dUQX<N'NQ:nlE&Tj/ub3HBO6W%K:o<<3R+?(n^)$5NZ1[mMg$BO&C8mL,(G!aa12S_\A/
+%!]F\F[92!`9O>k=%O#UWEG$T/#XV0SWsicFl,W4e`fct+6_^Tb2!\!%5=VZIRKW2OB5_:2A$Y>7B/V64($"t7e#0p/MqlO+qXNZZ
+%9N`_"Ef,(@=&Ig':/!\N,'88A)C,m(V$jRTfRr*!=u$Qji5M/:-B`eA\A@)c9`\Crg`3_,*"iIYC`mQ%QiU1q"k%f7R2#$Sh9s3!
+%X2k\mr>tVngRd!/1E60Y(s4ba:]>eS-Bo>X?6o@^+1*^T4#npnZa]<=o&_r3D6h$5]255S0R]Oj=<#0p?pQf.`;P)PK*HVmc!+nU
+%?BIS/=ODGSTMRBI]2FN$0k4nMIB+:4emY6eFKkTS(VHU$'U:7('qT,(8]r(50:*i\:AZ7n'pp3=;W*Z*k*+0q!Id(=<Y.<jYH]Z#
+%*-_7I"s>(h2KFI0B-JCI(nH[Y%X8=$^\=<-fkZM4`0H`PiAIRlkL$SsK1DCeD\tDY=6Rko4(hl;.?o$,-<i)m"':c8M-.kE9'UrY
+%[+L?C5q%o<7]G8[E$]V!4FB5P)J%8mXRmX[aDrXVfoDhHdnHhSZg_55PbRba%?l=bR2U4(`ij2*B,9V\DmlBm?!/E^-(;Wi0"\5#
+%K7aF%HA<"JJhTIS.+;%.7h\/Q+.RKC at _M]KQmOrjjGkEA[Hkapk$eXYC$E!5$8W1?amBrR'Oj=\m1JGc.:47I9<P*<Q0ZZ\?E*WB
+%1,C&rke;&X]IW7LJYZMDj4hjoL3t)/Y)8dE)N[r>c*_9IA`_cu11(G(+iW4V;MBq"CH'hQL?\jg,=nT=&(W5JAG,lNkp=18 at j)"K
+%/3<4e+U-T%;?jA0b#H;/Jr3f8N^6TQ?FYGaP+^k6i!kc5"/T/+#X%NmYK30n!*. at 2%<:62.Krpec(o6;K=g/'#[^SomXsts(@?*r
+%g,;9^S;fFu<@Y_$nr at r>>K)j3$f':3K46?R$*E4K!m00F_8I#`f96k+OKm2n+n9kXjBb;CMa*QqPD+396u;>iac;er=sCmMM*VZ2
+%(7Gpd,ZpAMF]2+T`8#RB7)E"RjuR+9bUjj1iZ1ODYadXI>XT"#]B5&Y=sa2?nX,r:drH)r\P<X(iVM6N+iarAiLLiS84f"jEQ=(/
+%/SFO>@$uEE/nK)S8*`rta1Seb$bYi;Mg7Z::ISh8<8Ze0=qed<P"C/urlT*hoFB(N6$mat%Z-kV<47gpj#TeEN8iJ(dIcG4bq2S&
+%RKolW,2q^hN:'C3PtWg`OYFa3YdKf!gJKcR]:';1;=eRL>@Ee)QX<M.02oCJR$?LP/3,FDW2QEGmEIgOWpGn8(692kRIG6;oV+s[
+%0i;A'qJ6SbUQ^[P`7usRFmN5bitS'GCj;Q_^Fj]!K[Y4AaqI78Hd:h83U<>!`fk*RQRkWL2O.$sJSF8CR)!gGT58Z!&bkn4G%;tV
+%mI'FTAt`AYOqOlUcFWEBo&%LuO?!%^I?_#s_iEHDc4kTO/!5Q4bsQf;L%5o`d74S_gp+aG/1\Gkblo)i<B9"q0M%#`elj$;A>.hc
+%!/*3 at LV^\#W$@R?6pnt%=jh<R-\J:]-\k?'kW"uS at _a7kS"q3l[;U.8?8F+SHlm4V&1-_LHoPl8)Qdjbs*;Ooo)8V;WY at sJ]+Fg$
+%mVom-DNu]:G=rfqZ=T31<FR4Fb2V+Kb/l at C*C%7imup8oKBM;`YKlK.oKdm*V=@#K#U)>e'h.INJQT.YP"gQt&e-/eX8K'!(NED4
+%QU?!JnFbj9n&G$:7Y%lmi6ED9m?m\_19F#V2[J.`8F;U;CQ%*3_NpO>PgG.HF!8D9*t.F0YW#BIe3`]M1*U07)(5aE_SINV9*hSs
+%`(<2P^r9er1qsiL9?"=QLNbJ)-`^PZdl<7<&!CWW$MI(K&p7Vm6d_gt9^K'kDEcoO`%+$NM(li+B_R?<?tY(Y6S>uE^V_s18.mDm
+%N<:\jLJ>4=Fmdh7]/<6E3XrqkCpp"Zo$BdWr+GHKq#5HPo.+fkB/3dRU8`LU(pO'QiAEE[c8=Xad=)G=0:f6[8!]F]7N4BYN$5JO
+%%CECXO[guS*]n5G;`8'1XM&0S$Z2XB]k=bl[o^#[LRO0Wff!3]VTYN9%u&SW%/ZLa%\=j]aE=Q'pG)U^be`k0r5mU37Z.j+h(TKK
+%<A:L0%J9LM9Qjj*4#gNBC.Sh$$,IDdim/1.<apZ;\`Db]OONB;FOYfFIQIR&+FBk/K5e!T*"A#'.Isqg#Wk4Qfgh^$1*)?+WFAg/
+%VJelQ*EjkYNC-%WRI!C+ at hkt&?o&ONeg>JVAa+3.SR_E.>"S at O*Y"A&UUjik37UGMJm<_^.>b2$<0$qu4qX')-lfDP+T>c at 8U&7u
+%;?#YpODL%(+mDIglIn0$mRLo_NG2F7mjLnK8j)Et0YC]Dq0)QZe&1<k[nZ!:;Vp4VFldu"!\F>u"E&g.;EUgFk1Y8$/@at5X,i<?
+%?(q*;Cj'4EnsLmQT3c'>SIFg,Tpi>NEpLn1(gKA"i_EQ$@$ILZ?O@\pgenFW.*KGka>r;b4FiB[E6qJX&OtV4MN-KI>sL\L%eS2j
+%-E3HHCD;CL9F[5[JuS`_Hm;O^pS=X$NH*r:0S>G'"Gb;Ro#:^D_cOQJL]t9($c0LeEL':)=(<T05V.R.Q?MsF2,]ETdpB?2#WP'U
+%H-^FpkNNKm;)A>d#m49jeT.-123>aaRAR at c8o0!I:9e>775uZs_:Wc*+KDiRU8 at q%!h#fc/@gBu<C9HtM^sLo;_+Yb#0r#*<!Hso
+%:i#6o'1QEMVt[$e)4oBWDt3S?:J1p#T>h.7e;*MVgH$pYrqN$"62,[/8]qc[Hu/g"dYGku0=r5q>qeV9J_pn/8#5dcRI#G\<ZkI"
+%a;Ad85^%dJ&+2q],2\Ouceg701.H>6E30f:aWm@!@?KtbMMK,J,^@oq at N;^0q&],Qi7sl3N=)up&gA"KjT)DoSCkZXiiX-b)(LCE
+%- at s/,Zm+on<^e*;lDpm+FT$/Ad\H5eliLQiS(3^K)=>c*]gJ.)7d/OUADX>fh3f9k!$AXb=jb]E`sQs--*7PlC4#Ah%]"TP@'t$R
+%XW1[YiLN<a\<nTsT5ID&0(WA)\@PRuqY.nM6F0EHN7;;+d^#p#C(HsW[*1Ye(+Q26;1s=^_rp+_Fd`dmdtSGkeRn%S6OMRsM5%8C
+%1ZbX+jkKhc`&[<s]e<8?@MVJ:X&\S)/@\YhTRUNtKl,Yq]neMbE:0*";g\Eh\ZK5QDH/g(5&)P:O"$P(^[>r0CfR?I%]+/F;o.ft
+%j,rW-dcUiZ@&64pBuaJeihm*hjEQ=lpBl(S<HY^]NnW at R(P_!:R$GGl[[1^eI:^H;m\]OBWG9mGk- at 9V2l:d7 at R+6Xi8lD5F7lT$
+%,#u569eN3O8P*<A!"pNSTIp5ZOR]*ZE`:sf*0iN)=L[3!"'n]8UOO'V=?W`n-?>1fD[4lOPI\R0KA[:1QodiH;._'::Xec!?j'<A
+%=r&dL65jtg,L&dB`!bqr_mlkF<7tN2LK4\.aB(k8]=D=&B&jgL9Dg9j.AWiXOcEkc#e0Yrb^!&T^l at CE3Zlf^Y\]q(O:!m2LYWPI
+%(&NaHDp+Q<d:ebRjE-\?Q$=VkI/8 at 2+0Db3,RW466_*i)A>X.7#gsEeDt:f]/8ol^hY7pN<q#]e?mIj82fJmS&sD0/<[Ymi\H-Ur
+%mpEJb/Jr&k?O7(F.HEOt&W^Td*U#<gNf:eP[DEq'CqL0fomh*u+dop/]h5#Dd&n<E9Zi?2!mID?Gm_)V(UUffJ875j58;FU<+6VC
+%>NJn?,bBtNRu\VGJAG\46<+LGQc5b\:*Z;#oq7&$o&fXI(H45Wp$m-)XK6a.dJC]6=F=1Mi`:NkSjPp]Tq2pNni\*JYMOiZR9b%P
+%jFbVFd-,24X+^aO;Wj>M8"*S10CQB"A'k"4+,W+if"NJ\5E<].7O@;h)NDa7N0<5u!WX<_3!aF-MMd[8>Dj%?F#A^aKb#^"pZL?%
+%IDOHJ3bTTm#Y%c1G8u<[\gsa:/.V;1:G9hW)e.UOo[#^7A\Tn1$dj\U"mldLo'=?kXC!h=X]bZG^Y>EF.u$js_!2m9/&cLDd@$3C
+%+isL7\K^K_-lT5Q$1;ae8]A,9muVi^$?6sYT)/!:-4bX)mtTi+XH9J;JW#QkJ05mZSV3!$IK`r7U]<;YH!]1AD>:ORl1mhEOad+_
+%+c\>ia,3"YbpS!!hYm)mhu2A\QNMF/f:RHef/\9YT76O(?i95F?iU,+gCe8rm*";ce*guHl$r^'Ma.-MXRrLiT>18i:]B^ATD\5C
+%^\FT%YJ7b at 32_!#jn at U2^ROUthR.QWoBuYSJ()$egs50QIP1Zg[oW![=o4)Rhp!2372[RHJBfB>.7[>9BW]6q"L4,\<T9`1?Ed4(
+%=@+MWU.T+q69?;S_A6rBa3Z8N*6WVDS^Aj!i2Y-?()BIZ_AlV$<05)3^WZ\>%p)-9AI[sO:u at SOM97&!BR5^B at lrSG1<`KmDs)*A
+%dos#bkNC+uS*$k)-)t#B;4^R8E#RHjJhBb$5"B7X?FdpV$+3gq#.49(TN1&fXs&5jDlcj$@%GUZRHr1u]\JF3CY/-uA[;T<n:!0F
+%6<?9hVi%V-&\TW>MekE3`jsN41^nON4*Y'fK;X1D1MU&4NY[8SblCq'e2!##-=!gGTUu7H;oqkmIVCl`]T!(rgJ9;/U3Sn))&8S]
+%fP4#MEEb3llI1>D,5%2KC2St@$+]l<Q_I!&s)*EaI#3#/@sRT?M!Vot-]\U^KDKn^;pKtkFm-5t`l[<-?nls*Br([31a;)S\03&&
+%JW8[=14W-jeSp1U!O\ge$U(VPU\`m*m[NhChE:98m;jI(RuKt at CAq:l34hWf-_lL8U9SPZ\uAhPB/s[]_T&_K4^%ct/V9qh&->d`
+%#p6BL#/*D6\U`k1$J.%7YSikoA?m*-Frf6NbY,g^KE]@R&=-3k%?=73-fHN:LQj!0*;O2^Hr5r>mm+E."Y%t%WTV2VP:&CKD[+X(
+%16Q5FT?&O_d:29K/(m(M1(\T#bNj6Pb?6>@lg:heQ8q at cK(SB;j`?W(_;(u-1:eFshQ!<k.6u\im)Zjf^,G(0nNM!>Lhfu:kf(f'
+%'YFp6c<bcG:@Kp<E316"XTFIR_JPdpre^, at i)k\QOgDE at 0j!N#*$_N_FG=F#\FO/QnB*LdT!#HA<sPO=cRclfIMj6:Nh3lp(NB96
+%OTFYkf998/d`Uq4N5=b\$/]IpZsFZPD8MPtP[T2C at tIh0rr0?70HTXGOh[SWX57'qn)MV)m#tobP!>Y?<Cei*:#]B:qYL$)@rSrq
+%,s%qMIF9Br:DYQQbp^ddS+<np^f%uiS$ERKD5&&,iKICJ1td"Z)?$bU\5Q#XZKqtdF(LRZ($KLoN3OktEp27Ma!2klIIu<jM(?CW
+%*/F0;+tCg0PEL`I<)i(fG=&=I_rp$I-0??h0)=jECCB(c9N4\@p0X<ck]t.aUH$;68JKpmrNt$kOrmdTWRRf%7@[MYC/,e+^mmaj
+%SM?%$2^e11W7))]%`\IZ!NC'U.b@%bRLVLD at E>q>!]_r8ddD9+G#`lBj:gA]%@1(=JiP#@*P=D1krP7dHHO^I1/d)!q;rsUGUR("
+%Z=$)/XuE8?5=;E"r2,n;J9&)@,(A]O[#M(/qcsF.<@Zcf7pupW5UI^sF?":'(C+X+EQ(K%BKW4CYs at E<RqdLl^[$l'SSY6<$u_$M
+%@:VZb[!Z((?2N%B_`+61aO>pCXd6L&P:USJ9cA-]jd?Sc^/J'u.dmc4b0"Jm*)=X#>/=99H:&7S9#G*A89e"jE&c\3<X-'B7\,Z#
+%T7_UN`n'8^WnV]j,HQS>'Io;@)m.*eer\_Ri]B()3el(-H[I3*gfc*HqPdQm.=6JtN4X!e<loQ@;OP"h<BHBY01KufEk@?*A+Gc;
+%XBnq.d*L_)Rnd,O at r_p6@<c4o=o,LK`e<b;UD5Uq$c'4=$bATB[7Q_.:*Nj'o7W-<R<E;$#Vt^2MFk'8d6sPYbWWMVWXY&GE<dko
+%j_/sKTo^H%DlJ5He;YU2L$#M$lXG&BmXcfKdKgQ^[+d>fcL`=U*bI"Y>>s7cd6Cq[Zdqpb'f.<ASl`/(/0p9GUX'`0jRo%fY+HFr
+%ZW-E6Z&:1c6K1OYh&c)h/20t\l[!nZNG(m5#:g>?_6hl-.Hr:SMQE>DH/X.G4D3?8(q!B4!VNCji@`8hJ-XTXJ^V0-%9Z*\>2[-j
+%<+B^P=Pjs$eX0,XC at 6M<SHEC?I4JI.1;oHG%X[KYL;KS9!U>McB2#KSE(J/)g9V at NEKM(&G.3jp9Z8[reW0teRil_b%X),.!H?]7
+%$P$c)=obGgC%_e0_mU<K00/F_nr#"Al*OF*f7%H<Q;$F5Z6%c%If2V1D6$q8VYcGbBY2dXb!XEO4L#(:E5m[h6Q=54Yk>I^>;2P@
+%qt)3n%h]R![O0d`IMb&LN[fh:g"]O`)-nCP&tQ,XVB3;8NUi>bh#I(]=AE@>ksIEI!5-b6Bn]'K#<]V#%^JI=?K1ike>4[_IYqh>
+%X&7=gY9<6"V^nA<Km!V6RQ!Xl<Jghk^6DUR>3*&-BqN%idP`'YQUY:%WV1.u7'<#;ArYAPs/CRL9/b4P>qkfe1i:mt0N"Im0e8G/
+%CT$N"SWN6eDG%"b';C&2jDb1OBd-ufZKS/Q7OBJu%Rpe#h/7Nn&e$S]=G.TLQBU<#[;./pKYRrNJ$'VIljN2Aq.HFk#!*I:GuiGS
+%Natm8P14'40iBA69Y3=,57.G9j2[;n((,A':g?r<H+]`X[`_E=4Q2Pt*ktrE8$^fAY$qaCX!/0:hNXNfC7s7ifr%+6 at YFjb]*.?u
+%0pW<LJK>71Bf[iOJ9!V=:<^"3eP at mf.9GKE\!Ce,^1Srl.91Wd3c)-(alY%aeU[kHQH2`p`oY5Rn[B4[s75%9J%baDVn`'+YJ:#5
+%e%ab3hu;OM?iTFn?[a%d>ta>Uh5C9(s7^0_hO,o1/!f at NG;iP(ZIdL%!a0<_J0n.,2bsige:Xu3Wk?;bRFgN,%^KoTdG+AM]-PVn
+%bDFemmY\T]"(/IK<n#!WP75Md_Ed661>sOR5O$6f-q;6]ScDDKDWpTZ]3B7Oo?Vk;pZSNir8$hUq!dB`hYm-Y?i9&Y^AQg=n&h9;
+%HP.IbmJ->AknX:l&LM at 1m:tZ_Rp#M6X>eHLp[De0]qJ>aD=9[cm3dD7-/"P9WoBi8`N/s'8]Y&"gD1[,ohD*n\!KJqVd&$QGIL(A
+%'.-_Nl;5K]rRP>ZP"[D$(*G7T at JK3^L]?jVht`%G0+905XM,t]b\,KMJ+qW/qA0,+Dt[Q9niJN&I37'Jrqsqm^A=<P^Ac#7r at e!<
+%G<^NToWS9NhMM:+&&8.^#Q&^-TC7!Xg04>U1lNL5k7=XG5/-r5IjX(F9tg)q^%n at Nb?+Z#!T%o5DgkZ(IXZ3aV/Lh2s(2c2B<3T?
+%p/2O#:t%t8 at Elf!ZIeOl8mF0_S6puo$IXT/mcfIah?VqX\!ECmIUfVgh^pCbd0QoZ)mbi`[(1>B\h[,5_7\sT8gR)?Ee@:T^use+
+%LWJM>k,F2>"\&I(EUeP,"\ST\*cMAsb7F,n2'LVP>*Z[)MYp\L^+--L1\!A=f4g6"N+uEV?kEg1\=k7EUB76=r7dL%QW5*a/K>C1
+%=4IcYd,4fg49"Z\`G`6[H_A6UnbW9*J)B)\JH^PWkh691TeT'5*PA"!g?faA2&cF27SUDJq`u0!W[C(sN]rjr@&XjPj[^j(XEr)J
+%h',Ac589oZP:,Vm7.DJ:,*.GT?i`h#j1:'"9Y/#93+=rGE#\cs4J7Z!(7)IkNMdgS>GZPp!Ep]Uq*`n3GCYPnqr%<N![Y-?&&LmG
+%R/iIUVu'l6[Ad,bURkuf'QM,lWsP&qAB]."3M:ZX<"m^KI*W[HB,+rEbBZBQA3:G2Fa"e=K/_!]6`K&T<F>QW\AP3q0>btLA?#F]
+%[[Jbdi*2k?A\ZPZMPUn0V74VZBD>H;+AHd$DbYi/^?r1dIliOP4J]Jg"McB\6(H at 6qpj$,l`]Rn9qTYmjE(5`Y40'7_JPek[]N2R
+%k6(&(b$elSH#UB00/ka(_6XZ4<f8m,8T(7Bn#W5s`@09)1skE)7daeRoueTb`rU_*766g5FLIiV"L$BGmG>iq+'&`6:AHEWk<<I^
+%fHj0kaZ'39Db]*EL4:"HLt8/\(u.m?-Y^_,S6b>Up+nC]&hj;n.&HQi)n0=-6g=@Mau!sQk6BH*9A?t/>QW?B at rZB,H#5.erfs^+
+%5`0fJLL3PIE8u>!D1Q'XPqAJgI@(g9.S1A&:m']#a4p)2I:3d#0R]Y[)J#Kgjo;?QX-,j,_H$TAW,gtgJ+?=^g1IP.OJ71V9*0-T
+%@Jo:-J(^ZsUp4lU-D[_LmK`^QBA`)8GBU at bLA^%\,TldZ(B4;paoD6rY@%<,n=%,eq at C@@s1`qL:F<2(_6s6s@%%=^o$_N/<Q\:b
+%)otX"0A4iZ?EsX\6YGP"VtGsD^AjJ2r6oTan`sQ^nZ-"]?@uM%h`dS,"6]'\+[YQ21\?Kf9'&/7E+^6KVj('5hH3%2*:!VM*K?(u
+%IQZ35S3A;92AtaQ#7IQ$SabO'gb(O4r;8a(hmVPfBQq[_Fi07t`6I at drN4OlS5u$;$=_,edc9LDGNI(ZIEf:N at DbICs7mGSbJ%M0
+%?H;*h at D)X9j&f[[Qka^I3B10ZRVd,VXI'F:HMqt'*SSSI"oHL!WtK3do8hc9gNch.NUr2Gj#W6.^YG#3O7bBj5!OEBl:s/5aP1\3
+%<1I`3cDY6bR3Dtn4ClD_)&>`o6.gRbiDF$*TV(b#e*K%Y&d?5mR\KB<phL[UnC,'ZJ%<$IT.sV!0+l50r63lGiB=?]bV(gERUZB5
+%2ocHbho=ign*Z)r%XZKBnJb\]gFm1+&3^tberYaZm;[/9- at j-Fo@o:6@@7#%F!NH*OCFoCXW9WL0s:,N?d17uAg+utAFD\B'LGR%
+%Ee%#(hWQ$F4Od6@]]<2S\2j(h%la(TnO>.fGhZ#0])D423[YDh#b*t]!WpuI1T<"L5FQ+>dPM?S6*1Kt>9[oO:`l'C(lbg$$-IE"
+%f/ARTHg_(UB'L=&=:PcBM3>6%Kq-@!H#+KOf,7Fjm)0*VQF*M&HCuQ)p`RZE$,kqu(P$*rIZNJSfHu:.*UJB=6E?Sk"knYQru;/u
+%fbJ3Rm(Y_VWjZlPRo"%2]9CJ>D8mL:<AW8"f9CD)NT8M.[\/5(E at EPbp:+oFH9 at t\r=NSH0r\LIjk(%PMq^FcRO9/<NfhO?Ni2+N
+%;^S,]qCbp^]dQ!!;qm0GatO'H*+(m*8X1"gB!8Ag,, at Hg\"j5oU8#bE5pQ,^C*?DLC1"rF/t50^7ijD6g5Ob at D6NBnFThY*G#s=n
+%lPWO-naQ_0rFte[HjCAD_hTFP#:Q!)YV:dtp6N8a/DPb^AY76O`j9jC/$!`*kt?LIRlQLL/kWNAT"sqVSCiarf71I3Il\IHPW5A9
+%o$D2edY#nGYOO!4g[3EDeCtYo7[<Xts+Z]JMFa0=4kn_m==KGg3K5dHDQg2p0gR9>"V?&ur"l[R^^Zj%@7&@<OHCY<PP;Zi$IOR5
+%ni>!u(qm[,o0DiBZegO"QugQR;1]Z7UA,W]j"Y at Pq^)59h])b+g$t:dY2ahs6Ia^b,8V.t1J"C9s+ZF>nB'qua$S at J)OFeF#?:O\
+%cHd<!\1P at hQhu8Pg]6<OYR1*b<[gncW,LHoEH]@HG<?*NYo%Zq9RLCqRV9U^g)A)_ET37.H2KVOr/^fPBcJ4uR]=/_o>Q+=&jjKk
+%Dg>_G:"t+qNAB+i3$#$*dc-o<[!$Np`Qss5W$[ah85+4jD'+lW^&dik7UJO0-*(;^(LDc*Y-&VLesi;!Y47K=Q_45t6^L%5gu at gq
+%I(h5Y!@1Z'po]8;?oq]R*g at VE&:?"Dp(*5a-A<j^j+O/B^js=bJHOZ"BmboLFjG2SoZ$&Dlh^7BkZH>0poWo`p)"&Z[oP$bkB/u;
+%.]^[ZB5+HE[WoFor&9CeEl-tBf\#1mZkbj8n[O_baR+!BJ7,W+8?'Y\0uBea>0)QjNZ.l&S-O92j#/jnP2:R9hu6+DfM"e"q>?Sg
+%TCQG#b=+r"`FE2U_>L:'k^/S*hV>A"HGB<2h<JMEWfQ&:^1j59k[!JCp8F&/TtXrbqWQc"j7fEhg6k-N?i&D\l/VN6O5H*!h=dUd
+%jM;YAO;+O(H]W, at N5QN4Ns,[CHm2o/!%)KTeCTO.Eb(%>[7;m]OfMRU'?A3g2opL7MDg<4qC9q)M]4%r?^jmip^0W'AeSM(Q&Me)
+%<-=^r(?1ESMb<?/33hD2ag*hGDC at l,gR6MEZ7 at .f6D!CI$`k%WpXpY$+t?,$@SC2mL,?lpq1i>p1^7`Do4(P&^pn5DhA]^@XDI?-
+%c'8E[X]<$[:,5hC>@9qP*#H%fh9U!$8Z%u9fdnk$5j5U at _c9M/f;0sop6IX=$ob1*:&9YNDij7GCRG!\#3M/uN*6(SPX0V&aGJ7o
+%A!:C4?V!A/![*8"1;L?BgZM,2X4[t2\P>S7LT.U>`MU&^2Y^Y'0,d:>L329.>En%WQUW[fnC(eXc)7h*B:$J/.rb2;s%.bDL$4o/
+%:3'4Dde?-Zm7(H6%!pA.e?ERn7XOp_PWgV'7AsIq5Jsf#h3dS72Rqk%EX36^GpSVE0?/1$-].7_4MC*n11PK:UH=P-I&@">*bk!W
+%;/r&,+!-8$"EKQ at m`%E<D2UfG]lMapROK8s%D`#r<_cJ9m\h at e]d![4:e'0\[MIC/W.SW3'`Ub)3>>J.E(LFq(YTF[<..BNk,Pp!
+%huP"aC[MYmD. at F>Wps;]HguiRMHL"MNKK8;F&Qh^2Yd!EA:Vs9U_!`-A&6cm&o>9IXVf2Pe-H`N=phu>n&$Q:;*SV$527/-iMAR;
+%NYAM9[,U4->`GJ0TM(:9R*TM*Su?7]@VN2WeLo#1,bQi6Ih-tkaZ7FI9K/EsBYk^":nF\7qHCC^j;q=\+(aAlbB6/="NjZV0fcLT
+%BZ_TQF4B/IEeUhIJnsZL/I.9H4/HZhY0'@`XoR0*eNYWb\HWe^]H*g\3KZ&J"F18s9Agm+kX^LsJ`^>0.1W6U4,N$(BpQXg[8(dU
+%UPiXob6n5&<_DX*H_E)XBjaC#iRfkVVsh9\PJ]B6b&Wq9j!+fdGfrb__2feCDIkjYar=-?[;`$cqhc0VmXOf%B at R=B2kA+G:.b?p
+%S^JtA[jJk'ELNVli<;lGY)@"NUB8GJq_Xh+ at ISGU_)n)IqOsA67ls&Ume6W6dGQ:2n?\W8^]b'^BQ at sFZk?]+M*%J%N'5W31aiWJ
+%Q0)M&6=`2+i)N"i.$(a*&:%Po*FJ.EpJ_L]SN4rM13%O1<O)od?_J98b$EW/5mBeCdH0b-PJNFN=fH)I;Jl;jI/F\>297)V:I6"%
+%lJK^Cc)GLo[Fu3Q-&BT>?HrBY[MpAqn::O8I%Mtak7Z4F"'hWH-_mImVh@`3/gA==APjb!]j<$F$'D7`C(M_Kj05\NG%#\V'VcpS
+%Hh':92hn_nV5c6pGZ$so:]D%_4lODZPaq!*"WS,&($b">X at S?8dR)qkg%>R1K7ra$5[<!=;^]=aSZ5tN7mXf4Bj3A;=OXm3B_`rh
+%=@sVH5,l'9eqfW at _6I^$"@nnuEGBWM:U9e)e%!QelB>UofhB's(O5;4c)-4o.Wbu6qCM>ndb+-D]LSmj[Snq5(cWgmk_E)goX33<
+%j;Qf&-!/0LVZ@<Qq\]s5*E$<R2)a$l(d3'lMOG$`8]*`\VC68-6+Lr([7;*c(+0]n,jK]bap3LeWu`MuB:&2O$kfN]<*IA%@$XcK
+%EMpjnn at m\e:hsk)iDk4,QU<Qs)FJh&^i>!\?>MVi/B&#'C!85'`C+JhqOnZ+;7(>FT6(N&ALS&("_Emp0u%7Pn)>d.n;`t(TGmF$
+%1o;WCf&G1`)rX_XJJ_H4m^k2#>">[$Ca<@M,ES/PQEn%INtE:"9'$u`fsk87g6PST%#-4aWj+.'<Q<=Y2c_',iD`'"+>Df at cNUC_
+%>/HS%a&_In?N;;.gI.LT#169/+E&fR<?&!(m45U]<Mep3#[JfG2G3JQGlB\IlRe;?9nu4n`bI5L$@_hBD"\<*$ZOUUcr-8b!#?65
+%0D"1pQJU-TMBnq)Z13Yl<9m0'9;PdO8VqL[<6-$'<@oR0\\aCHc<[DY at 32RUA>-Z=>)NoR>[>M,/kL?"l&oR(0%;eD;VuADbYiq`
+%Wu<U$QUo!*9Ie?mj,f8AbX/&D]Y^Q%-UDQ at lsk*jk5)9jS'7i:W!j#S7*m;LF'6%t#PgK:;/SsGL1(EDC9/`j2=W/PZbkXS`6!^e
+%)ohj"\^mQUYW1C at SE%?#$?hd&eD.N-%hikb:o(?J(eZs9_3EO#/Wo at 0p54OCP<(2Zaqq/_`NO_(*-"4q*mJ=8^Sl%1Got4,e0m.-
+%?;+XjDs!es,bgkDAL`tl0u%6[_"(\kL6(CY[mF();MW^Q2(*_6JD4n(E-8A&B$P at LF.jf%)qZ.q&`mDTd7M,m.O#12/tW\PCirdk
+%:/NFnX?P_g$IVnu_I7CHQuO#0^/Y&-Q'68Xi7rrk8N#nY-<1ZB)MRP%G2mj_.K\XNMdC$[W&ust85\Z\)k.'9*&C1f=u+6rq[/=*
+%:$XcfF^*Ms;IS^]W!P7XNEt]Ef'/Md[O"4NA$/:)Y,"pJfnO9X*B-9Of/SmaXTqF,HA/ud^uIYjQ$^"4QEKT at LKeMP?.?Kr=+Y7/
+%EAI7P192^S5UNnAUoKP?KpD]k=-00d5X=l+Znt<MWK%r4)Wgj=Q^!CkYjJPe8T_8e?;^&I)tB^miZ[5(YUu&AcsGEK7j;KKV&5Y,
+%XY28B`I14K<8ReW,TX'T@/rA at V,Sr4k]3Pid\-#15T;H#pbdoq(&9EX6DJm^"E7Kjk8q`u+uE's$<m3[/_ST6P>>6jID+/jjtY(>
+%]G5Mr5$W$=("@p3*pNAgUJBg\8".?N=*CtOF\1`ZP&')S]gJu4[1ItR/V at -;:^9s2c:/Wfps!q"BYZ._J5#a&[aArq6mH=uEbP81
+%JgJ%aPj[a[]8<D'^t$Yb>]%1[GI>ksGC,OrEir*HK#2CsgW\Lmkso?/3EA,2Aj_F6O=EcP3BBAB`?3!\@Pj3a2*-_qQ>d%uf:qK@
+%f9g)8P1'Dpj&Z$4k'Y_a4(:'fe<:527<*B]lnhV_1e*US)/ZJ.lZ2.<8`u5*dq)f*$N6+"-K1"R<mLZk.<I6lk,-SE*2o%#"o1u"
+%G\3*C;L'!=N at GBL"/dpf2rV5d4$Gdo(1e&e:o7tnRT)s)8EPC43d`N&-RLh"XqMWPr1qD=V[<X at SUq\Y3/%TVYIn)VYcnb?8'WMd
+%TMV[8MdR,t3]HK;/,VuhAT`0W1niV8K.SA3?)UuA\qY&ncI]q4 at 59l>^b6Xl)Ka39fkXRu9p#V`+0;-4\PsJh8B.j7`ceB'&87Jk
+%=l12sgIT=T?_ju+NS)>fhIKeNNS;bl+uOP0aZ1RKRKg!Y8Ak`?Vf7f"Yf]ZGTM!NnD<,S6_j#8C,s(puj-0!cW#_&P at UrM&,=o*m
+%OI!fI30HK@'Xp!V*i&fq$G<O1CuF>':?VsPAp6f[bZ,mfo"u=ANML&8hOA*++2UO4]oJcNJHM+]e at h!/cKYZj at h'YbD<^.SA&#f2
+%&jAoP at 4=!DI$@fI0]V@\.im[(;/-`!#:`!("Kj`:F]9.!$YK%6NKpGU-g+j71r;Rcns3d2dk;.VX>%+_--rAkl4S&;\s:j`0,YsH
+%2,C_^M:T22]$k at an2<l;EGuYnTN.hZR]QZ/AYl9h`PK:>.hL`_V62\8og:kUV%R>jIW?snGSQGU5tQO5j4hI+,tur!Io^&Y"_b,2
+%;aULWaF4m46M^7i-4m;&H8aI8'7:?XG%I!][)i;7/20+?'K4ciZG/25R++-bXWp_A5rSI1L>3BE:j48$NK.Y?$ZS(U4CC4-b_hQ*
+%X at SHV$3GhUk:ELOLG`I%7,tYd;s5(q;,F:Agld"&WLe7B-2gBj/XbIg>ct+?AIrKi"Gs3^ZRPI\B_:[uA`_V/p"bB@^jd3W0`@11
+%">reifN0b[N`Nq=Hna4UcpH4NjA!%[OO<.l'<oOk><Q'kBJ"LL;p%d'0eXVAY`c&nZ<kmsA`i5\3YM><b?1Z?:&V#R;lR9r,5`+S
+%9F:(-X4#Q^-9L=6-PKL:eOVa33*;on)q>>R\RZW!+\I-/Fq#s4FDO$mW0H>e#peqDb1duZ']7i3,]!gSPhQ6cS[MQYiJO<g0fP`,
+%2[8R[C=@g"^u at VR\gqsa5LCHi;iI[.Mm7jr;2ik??M]J+!AHM^rG*_K@"NoRH;@P", at ebu,%KhU!_gp5\3;71(MQtdNPem[U\!*]
+%5kHm\KeYY/%D+DCIgA57;R!+IH:d342V:8'QqIJ`6r(6,KF[(JQRm"BbRZaLe:V'#S89V1I$13?e9s/?KQj#Y/nH(\>\Pn^8rZ:-
+%#_&*2m8]CLPU-%n86UrfNsLVLF[uZG8^V-h8<SMeq3PTB$G;:%/G!3X;X at k&c:*\B8O3$gSO!<cCaPII(e,'jV\4JTq?_jW`SVnW
+%gJQ3.mZ:&TKAKj"AN$bc.u1"*YZ"a7T,LWeV9H at WP<r'>@$X[c<f0WG8/(g;FR`3[4_51sWTlTn;PEJ[?lkph,uLQJP%p<A?i[E>
+%9)p3Hbm8SVBdO&bLJ$$6hfO'+@&Ygt?`+a9OteDt.1;6g\8cC`fZ8"R++9%DUtPp[5I-D1Qqn?+C&0(uq<;R2. at A8+;Xq0sB5'qW
+%-H>!O+]+C9=@+8c$du at nhgVkHgLd_:fFL;5 at dN.%*5nqLP%?`IJ;!5I#Ln-Y2OU4jm!#b_#+E=7JBC:Jj0^6*X;-NX[`Nr"lNP#<
+%Rd`lg1`+mV7e&=j=Q-3C>qm+.`$c);a=O69((D*V at 6o_[&[,9m7eFcbE\LB''b0`(N0_bZc`lQ*(rn(rG`1hFJL7o^PBGh9pmGIJ
+%/iZVf'Du.E8rPdL71F23&*Xa.:)hhTWcZcX]&[b.!+Id<"H)*OM3_mc>;D2IpQWU at CEF;RCiNl5^6?VFM3W!4-PbPQD&YLJMP at ng
+%+O6)UT+[F3,0%45s3+1#_!VFM^kVIq8)$%uJT>unEbr?D<g?T$KclSM"8^s0]1tI(g<48X.nakXrfN2HGGjtng++*#MC/Cp,%Ub^
+%bf&/m"J3qq1,Kn,RjmrCV:o]YV%).1$$j(V(bWrVOjkr[Xj/*64-/s08*VRB&!,5Y4bZCXNjs8NniT>.$b6g15TM>@_5c at lh+?>9
+%1+ at k%1$sG<(q]JfAJnH]]YiAU#n+,Ts#j<XlL[-cJ'/MA[X1X:6O=(QMOp69.21ArH,I)B6;i3kRuj2*X^;WYK]u&Hfq:5Who_'V
+%)R^+9KGk at YfT"-T^-"N"j^4I4*6*$S&Xh"4O[?QRWnToSG*M\M?sXV^,j1>s\au=DCj??@2qB,;X<00s8l<^_&>W=p'0pO(m1=W_
+%=fdN_9%4ntS9 at HP5iqF!C*2N\cS"S8i0o^CU-Ree=QrVJ;"]`EHh/s,4iC5Z at MoQAd'Li>7R&!T(%OM4BEi at PI7/GqfhGEiQ+?kH
+%,<gYSVfs&ka64fTh1[F&H`Z3sh(+JMn3rEd:LR"XQ#\4f;JIbN`cT(f:k)Y]Xh82f<)ru@"W(n0:9(;d,cNMP;Pa at H/?CLW`N-.W
+%@p2Cpk;;:,G>6!-e4GG7:!ur\T<u=R/T87uZddeVS"jb^*rJL<:.\pN2.9g*^NX*_n=!#?\P;gWVOtBI8[BXbCD0;M;n0WKM%clS
+%CgRp at BA",%gb5W6Y2O$8e2re at C",ii`Q;_CPVM>\'V^63^UQob9G,oZ<gmBq2B3[C`dSjU)0F*pd8S7T\Hurnph$m/*t)2BFSkQT
+%`d`<PBR%0M0T)a"o._#'q_NWFgGCSNH0)u3-oG(n4^:VMTNu<d-H.*NUsW,'TY:KV2oEpVm5gLWIl!4'onu>5PYaI4M$j?aDR^s/
+%7Cc(.]P$mKkN6),X)*fjf'G\@@:)NQ=h3b@*(Mc,UStI>f=8)]IAD<=_57qo5U!N*cB6lk4MB)L%q(u,"?7-*GS6CMmaWbr[9[E5
+%J,ueLbME_)A9?@2cC"\GC/3Nq-X$\GKuOc-T_\]Oij-T`./%N`fh!Lqf<Pj[&mG]0M=#n;$5_X#*rR_Ci7a'Y$TA3>1<`DF/(i59
+%hZ65mn0;lKTlddf!M"i_WY>'96[2X>6c4d8a_J6W>pQ2RQ*/M*A3_c%i7t2fr>]_!RN,5&A:W9Jc!ggS0UfAEA7dP/U6/dbDN.O>
+%bP5ocAFJY=mW$;99>$)39;*#7^^UO$eXAs3@`aoP;mcum0[6_WaE/R?_c`5NOh^(`Y9G?(J],f_Zf7g$4+*.TTUWhVFUJ(tK>DOb
+%a6d[bne:?nb/`8A.=qdj%o8RCb!k39iS]u+\CA5%4daK at c4S]"83at=V%pGg/3 at l4glR"k%6tUB-jm5WWM1^fitm_s(&(jjH>Dde
+%.*XPL3a5mG-B!FS@;KGXD!0*"+BD)#`jnEOaR*lW&47u!gJ_?[V2i*HWmnp,J\>B9[js1AK7:7f%jZ?i!(8=H><cRA64gHGFc/aF
+%`D2]:MM@\\_UTJOJ78INmBcVe>L%je^iU8UJXTk"c,4$al(h5FcCnk8B51,3p$Ka9U;l8ocCiOfet-,caq(@?mt4]P05dgdC,191
+%Vpo:M$DOtG[:STaNu3#??5bHq-l;N?N%24j?lOo2auOjP_X!2)EmIdZ\omF&E?o"QNV)QSE>#aH.Ac2Vdi`[@lc_p;2Ze#bCA(O>
+%]3RE.49K7i's*lgW\H<dk?H_\Pitj+fY3SJr*ZRK<+E8tOW+d'&_OgLp9W"(/OpTDaV9K8%F&EForHZkRTI7`J1,)(N_P#H;q5$(
+%kSMQ\)na4>dk*(>hUbk`h+,i0mYUR\;,>pn;Wb/=PG at M1G%JG at 5Ts,WCc?W;#a#8CkH8MOU*]J0R?@#A1IhaaJXicC5pbeUKhocE
+%eDXPf3>!);&4(K$=<V<loJIEe97tkDl5XSs3O-inL>op=:X,%_.V)aAW\[Dfd/htSe2Ml9""r8bG,rU+C=kdo8(@[%n;/&-8j4)@
+%aYGS:\8[J\.FVl"VbFW'#'N1;-I(X1%dp_ahd\CnHM. at j8`Zsd/]O1WeBsE,\\`@qb+L7K(`_uabOZ`\dN"I*:39/b]bQQa:;7]:
+%bpaoV)[$Hn3YM]2qZ9QtR>CTO<g%I3<([60hh.I,BTF"`<*o6F[],jYX^E3lji"c^e4^?)b#+F;`u.DT.Bu5D1]*E6Ph=CR0?sZ0
+%QtSl]4).?X1DLN.FU&0!IoP#*eKYGnEFL[l:;NUO+u]ha[fr1HF%aG!2)e-t<XuT<)@PG>-5,q>HPDbfB0!<%5uHPdOLs9;l.]YQ
+%1YS at sY-9kN#GgV:#/LVT<7t':bDW\U/\!)2Y+jmA#Z&d?mO]W1Lf6fCSgor`(.*\+7Q%)A/Id^+.<Wd3L5K>5K=_FWVWtgRQa33/
+%_1dtbZ0@;eAD=V;j#PnB*&9[":qhOh5IH=U4`d;?Z:9oa2hHNa?qZ^#\`9X;%n,PpT9[gO0N+<E]nn8BWS>U'O&!&s:1ns<.Cis2
+%A;L^)jGZ]I\TUg>96.dL8Ff;=q]cB>N1aL91WU"Zj(<cOi.J\#E$$Aah?T\DVGF2nQ(h%mK%N+dD;1kYW1h:00RopB;Nhlck#^Ts
+%Me?Gb*X1BO5WonJTIUkoF8Q(..cK]dS4Xq998in`XR>YWKu6]b>]G'0F[ic5"@Y>DEloR\YOA0Nkm&sIN`1fIKadcTf$QNPY4\e?
+%N'*IY)k8[mAaqY&(p at YF)MNhli?;6/_58T".!R;@FX^\r/t-Df-Ek7gIg;CmbtC=`?3Zr:O'Kf''d[Dn".8^,S3,D at PM@;h4U!]8
+%REf/N$_,+aI!;I at TZ++YEc3^`Vk?>NRaF5Gl<XnG0>&KcS*XriL0\`l9U?0&j5uN,7?,ON]VJLeRK at o[=J.[#"5BgQ>0Ca//PkB;
+%F1JCYHGr(p/L`5=G9?_u0QSCi)T8eJEVY8P.b+#9[u>u9X0>^k!/&C-hr at F17_1doa"P"VLcR#rMB`-W'u;^s3M']Xo#>G$TGsFQ
+%/D]hjA'h'pdYCVuoJE'$,\$<:]E$W4oI4_UU_`#_6`+kfP-S("e/`5-m/u_`'d2m41P&6Xmi)Hg2'^,#Q*&-DL,+pPZI#gi6l9oV
+%j<ee at 7j,l:C`ka.)HAV!F0\+6:#DAp\f6K!))35/4CX!JC0&Cpg4B)QkN$S(bYqN2r/W,/:W,jM<OtV9-8-SGgV-"Pde&PKVptcX
+%'\:"b1+p at 3Mc6?p;8FZC%H\]F[!<uVZANkYN,V4LVd2iQBY>=BWQ#4A7"",(!:^9&Z5r93]"WuFbX\2!4,o\W0M[$/k%\1sTQ<;0
+%30U*t-(Q%'Hb`3d.5uD?$Vr[="EdE#67mCOMukZ8j3&uE>M>_h8]43FA]40@"fMX(Z`T$sKZYa.llej+q#qFFO'+>#>Lj6Q+n,Nj
+%+oqq575n-ViH-#1Fe?P'8MgSiA#'s8Wt,(H7_5M+$^/<*ij-IGT)uH3<D0OERqN?dkuPEVa-[YY8:cHrOh;N at 35o&1C2?D6gX:=(
+%,IeNY)j!'CE%qku`I3nIRaWX\"2m?5ZO3Up%8EP#M`np+)1kW"XFkpAhSXsr-"CsfB82."5#nG]!=_[&F."$oRNJLF!P4$TcNeC&
+%0q9\uLu(e56+0u[DQ,h8;=nAl.'$cUX[G-I]s''lTgfil;^Q6a.AEX'UK at +Od"6#ukSN?tZ5WMg`4#V-e>s?pVG9'K%(s-PnpBSN
+%DGI,OPI$c"P;$tflo5$P=n-*@Ddk;.hfE^H2,CW`6H?Ek_HVu:a.B@>WlC3^h)-k8Y;JeI4!L_VhB6l0W8pKDGNWp8`o<ZZ#W'g@
+%Ha;K]c?r5B1\"k;T_37.DWfr13t?NSc+25[=7t-*(?dQ#V"9U;>rF3f4k0UXICV10oG%c_-m^5"9:H?t"0==\j,F)fH4L,RL-L9!
+%pb:PQ"A[$kL5dLp+h9r(FaWrGhb_Cmb at c7*[\1Y"&-+Dql*t%\nht'j14*<PhdkH=@O.`9K`=!k4<OX3DI7[0C_ at F$,63B-*lU:j
+%a`C_*7FNL;K$:/?-1BeGS[88[1Zi-l6j]Bf6"dUP#=>j6e>19N9_V)'R7iA\KMFNa<"P0&PK1UX,98CRcAiNJ7f'/hN1I-]kJ%A6
+%7gq!a:9f'(#F,N2Oe at M"LkdCG4V^/QA$Vqm-r$4+pLJP+[Z5+''I4Q]]=ujUI0F_j]?-AT"/1?*lmC,d"&p-8N693q_#NP"*]bBX
+%S0VCs!oYoh.eV:MB99O4K6.RJX2a;@Uq10s![e<t at sE/dN]$=c)sstE116oDcXn7b&s-)%>Mt4f7YY%89$81D$Y"V&4IH\OYSuhR
+%MG&Z.0[4Zij6 at 2Zl8\s[%AR<G$*1,kfZK^4TL+5tpU;m&;rA2pgJ0N]LJmD`muA_rEq7KUUe(,7#"QKSaD%"\T8'I9k[[AA@[uTi
+%YE at tGSK(HC!`1+u2^EQ]"0k*),rgC;C%9gu2_G9*Q(PULU<k<nV>DNj\>gRuG1o at KLa[YNp"l[\m?9A=U//AfKniI0(diXQ_Y2q`
+%WO\bD+gTK%H6r>g&/X]\YF(8OSB9.&"ajBlY&tsj:ETu[,>$=(:pm5W05H_3a+0PWU+oS5?P^*8PR&s=DO[3qoP at -rp=;0H[1XM,
+%a/m1ZY+?4;2#pa1og=&YjD)g*0k8pR<]%IhO[S'?7X[;@a?%J*H7lnTk4$><#HC<b$hVV,Le0O72^.Tp%Wu"^W3hueb.!2t/(5l3
+%Fm+1XFcYt4%)A/#oDA>)n'$l,c:?0*B/:1I5A\Igj;pl;4M;!LU6f,fnV1o'H_#%H,se0:)HE;jEXha;QoS1`30?i0@\/"4!5tJB
+%/]#GR`B8^F4$8jN.)*\OYs;lQ%dCI4>%!K$n\F,/-kOP^3Tgu&fe-gr3"G\c-s/,IWI[\l/>Sp2jalZ,[5U<PoioZHIL?<>0q>b*
+%4,b.Y4Xfihe%Rgu/lr0dI:ZRN'2GOsf1$qS(1]`MAMekaG>@8qOD=[AZ4M8r&#'V:q[\gBYcIX,5mY'7+"RY:[Jpdm#X$:kOFj]@
+%p+\lFs)'S'^\l$')mTi1h#@,=:]>0,(rBfWhoT6?drkZ1TBj<[mJ^I2CC'IHc1U4`PQ,9lQCdb6o4PO_lggZKj1jLN4MCE[Jj].!
+%s#0fjrZco!mT)!%LTg@'?eo2]bFcp[iRctsAr:$pm9 at G_U@QkFWJ`-8?RNeq)S7V7YrT'j+WV\uR*E+pQ%YpaOf]a;Dir]2Ru:4I
+%Lp>?9BCa;K&?9G`^<;<IaJOS=h^:*ZLhV3]6%MH.#i"@tWjMFNm1 at 8-<1V-mI20KM6KXGeG<%!Sp2Imq*g1SrK0rndjR;U[IbSN)
+%Ug1dGIJS3=5Psfrf at N69q"aBnr^%+/^?>1tFZ0"6FnQnjT,:V79=NYFp<mNic":K7\./)ppR'iaZLNi#E$I)3O,"F<DcCo"_jdah
+%%Gmn34/s`X%0Zd:a3TZ]l3'J1N^clUFZ=D(L[s]I?21l*/0X%*DFraY2IGNp^TS:>hgFtEQVW,(jbMST*jpMeW'-W=Z-(H2Y<,Ul
+%fbh8/VGa+,;Feqq5b2L*WL5p4mU(%M1LEAMluOM/Z't4A>O6?KoLYr2*2j.c`J>9&j2!2Gfc!IoAZpGj25@<ng+s7?$-7lP]>"[0
+%nsZ at uJ,.^2qtf,EjdEi0rV_M$rr!pgpR?C,6aiS1++F6Z0-<AHSQ4kj+d&M5;t%'5P_8X7@/`Os:^/07n"h6Fg`+?GmI*E at 3,JNa
+%m!h4E5L4fBnjCT/j-')\p<*,>B3'k6B[_ at h@N,7+QbSgpU!;nslg at Tun@[JHq-5!P/J$I>;gmu[`I*0%hR9i()iqJ.4ZoJk'bWXh
+%mC%$/h!sRF%ip,_FBa+Pcen`p<?G$9=L-f^3j-0/EM at C+GjXblk8@rob^.La!C0:60TL(k%^P_C=;l[4+MQGdYdT=>Rn8*cEIQ at c
+%'F[-,W[5+rB.IuqmEiV_HV\&KlHVLMYkY- at DV+p$5BIkuV2[g"G4`WOXQ1]t1J))hkr-\'*pesB=$:Elr)1DE%1RY=lM+f!>@?.i
+%E503DmmC1^qCMr=[HspJjKeL@$3Y\N`kgbr<Qj,E;#Fk3X`Q9-R3[#2hVEc;(U/L-#=$:X7 at -g6Y3cj8`!T3hK%FMuEPE_0HLi#a
+%H0.W+Lf`nLl-unKf)Z)N^CK/2<;W+,?W&`2YP;l>A-(,cbWK)ra/-T4$\/5 at hjqfm_r57N'o63i`4rl[bP at DFO3GAO(%1m7>POTG
+%cUkFGmKhSRZ&?Ghg"gtl`@3V,_kI&B.'>[e!:LooO0`X%`@p>F5JfI2[/;n/.kbV9h'.BSm`],ZBUMG(5Ubu-ChC$nFkB'`I&qsb
+%,pA]nc'57 at R<s5Fi9&io?r*uGAk(,FBeOIFH+^G<S+'q-=JOM1%CUo7ToZGHO<Q`EBKKLZbuT)'?X^HBf-meM4e)W53-&>+W0lbt
+%Wn+K8hIq\, at iqK')tBF%)F2OR5?LDP9>*-!5DRDh6I3'\5f/.bJ=s6Q[XBFnC.#D3^N$3Z at 2%4f'V$@S$ON2$45aT[Y*6-7l?n!s
+%K9dO7`"c]s7e#O4BA/8DXfk2Crq3l<Q at d]-_[80n#ARegs)7CM<VEAC0X%$(h(lIiqYe7d=[-33Ju3fO7boQcE39"gSCi!-OrMBV
+%f'D3P`*"&f&68>Ai6,-L\hV*WdECG$T"?'!*(O*t4>VrL#`+NV.UpA<"afQiNDX#!qF-.NTNOJl*""=K0qq$)n<k6o:"B=7H>oVB
+%a-_EA$fa:K6t)]:.)jXY)a]kEMfHG at _DXJ\lm0V0Ti27D/_^-kb8Z5f\(7Y<E!!BSiZsf$K+Ib[2a6#Ml?@&>6c_fSWVmRB\"o`8
+%b67"FkY<Qk*]u,^U!$pCkV+XT;Y]qh]CJj158YBMa`<BA0qUi`LHQh%0fnb+=VqA%3,ZYpF<Wc, at llS;L#:o[*l`#Ui+%>`H#ZOD
+%LJ`(+!(@FY1i;.I'kC]`>1IY8c9&3FhS%_a?b&\/a+IkpSBb@=\53*ZMj]aY]mfrDlX$2U`U(@P/+<K!P:%R,TVnG!mmEb@^)ku&
+%Y\tuL00]42jh(Qh`BW02l"=B$qQY:#RU*7>eZ.?N!`g,-Td"B5md'echn*X$b^2(N<G$?[%+Xe>-Zg=G_Al$cP/6 at qG1G-J@W44_
+%=Ga5:8LI8G`RrF!74T[>_N#%[<)T^iiUUPPUhlm;&>2d.!N=Y;2oPpC#]8V=.<-eMW)S`+bf==X6mj,F<nI_+UZ]s?@Dg`ND)?M\
+%R^?p?e4=F`mZ/2"CS:nTE%IPMl3#tJD21eBZ=HR%7n5bWa]NCb!\8r[-`k6WTs0GP>L[)/jpJJj_K%XkeS3.cH5gOF]t4`36QKC\
+%88N<O-h"E5\Q(_sR8(^NnFt2K5h-8(Tl0J3NRAS"(*Rrab$&PLD;$N.!j4gh#%tY3GaRj at e^tE3QudsV)VX48Wq].kQT%D\_k"^-
+%CA3?";*]^k^dV4d:N>,>b>VH43r`HPF%/BQW%JB>`iO at hT17`V:?2"ns2;b2 at +=*)'d,t0A+rhY%-7bU'8s'bHH32^2\1Ad=Ia7r
+%*"BjB!l:RiWq5qQ^KAM7EOgh)rN0QOD=s]p;&H9u at V1Qp\9%L9UJd+tk:c1UMBRJd=:@IX"a+mJ@]/-84m?O/0\V*(=0LrUIKs at G
+%aT\JMA!-uXY at Si]0.RT[`Dc9;NR\PN%'Pj<Z5VVePg2f8.$`#`n,HX3fG:s8*K[M7l[7f6:<.pPa*9V3:J<Is/[Yg.G[+s)."k at 6
+%>S!DQ(OC?i-[(A$7VH_oC'q8Or+K'iZFd3bVd[F']/q^1I2P0 at FEb25-f[UVV5 at S<aG,q<T0cA%g>=kl#.t_'6#2P/L1jJ(T5>\,
+%fqNnY!XR+'RDCS4:G!bAYc7I75$s8n&<"^,RAdct]E)Gg^:T<D_.-D/nRB+7eP@@TK[:^YCk\7+AP-Y^U_ea/C-m;_SAQZO&9c/,
+%</qQBdgg-A_cEl_rBH^hhd5eufY93=0`$')i.[VrHo9+.&%[fS`f7cbIa)cM<diVTJVNT/MH]U1Qd5a,YO:f,G[eBrob(eRZs/uq
+%"K#7q^]$&Ro0q,*nE[p8?mHPXOJ)@=\A2fK<U-e?Et_*L.Z;p!&Ckb)a2.aX*32EOq(?8?5"m-K"Z#a1GWRi[I"4iY)/j8pH at FL"
+%GO.0WcJ1!jQk_j]e_R(h:l2j_(pOls]fblYcAt@]H*0u6=_\Y0!,4r&?p9$V>e)ilk?.Fe//EA6U>"qUA0*]_m9%2s4-,?e]!@0^
+%^lf>6WM!+SQelEjD."GRNu))j5%)(pNsLTX`JmDN1"&pGeKGZ%4*'r_j1FsLc)a[6N^"dNrT>j6nF#CrhgPIb++EsOTmD`fPGOqh
+%l(UnN;mfg6:QV=udJiq?8ZE3?.thRM!sa>FNBZZ>hDRGrE]8T)RrKCBUBQ5%Gk8Fs[ff]^m:L8`hYG#q"=)HLrU*@nZEhLmDuW&T
+%/3C\C65j8$G!V3:^$MA=0&QLZ;)`@)$aK&RqgY<N@"XIu'b.WBnVM/fnah7Fg0\W'5#]!3\[.rfk at Mc>nb9SGs,68:19mhc?'FL1
+%pttl437IIi^SG!&nbRB^Da[NPp1&Y4J,8EQbF?QNbnja%ro8M*rF]L:_sdVE=%)o,kCsMuVu*A'_Km/5,H%T&9,)lea1j%JMCbHu
+%F]6=9C>gN\X<n,O7c%YFfK,OC*\LhKKLrH<@C4MQ-2_,kXELon_cU!]A\69:;t1JiXq>;p*$3^U/GsHG^AV47BL(B<orLCVLRUfG
+%J(-ETq"_XZZQ9SecL+JWjkn7l^#]\e`YX$(-hnNCn?H<X5GesI:OWeQ`,;!7`"TUC/dXEmf\W_fVDUl3mJXg>ZcNkSKt/hbHNdXk
+%'=bn5b4K^t>,\[O:u134IFJf:p?!?Sr`YsI(C*SBNlel9H5J<5E7j2uA(gIr*q-rr-G\u.A`4.5+U=)^Wq*5,[Y;fk\<W_q"3'ec
+%BUb-ISD4*mHXk],Vm'%$g7rN;7:$#+352EJ*mP5l.CdbUb9.%GK=+0_6JfFkfIgeJju?LNo";!C>OZq^f$-N`.GDA[*Y<. at n=`An
+%r=gA.@;DDd.?5A_D8=D93"JQdQ_q*/Tj<W"*p(;9@@tM]k$m#kSBiA(JO[\f-'Rt\K=*2p'c\cO(bb&kfT-]+AWKK2]FV1^7aPs'
+%(@;4_B$,mW]:%(b4`4jVjA`,:57dj*,g8=ei^Y`?.F!\2K2DrBdZNV+5(h;&=-Y`Z7Fa@")C(V,DMgDUC=]B7bG&FWS3WI&PDqG\
+%bBgf)Y?,2)I8T3jKKt?cV3<[\gR*eEO\s42%'X4]*_L/;@Mm1QW48l_T5qhXQX4Y*6!p]S\r0k6):7RnfPJ4*ENfF1<Tj<cp+Tgu
+%iO$W3a0K\r%l`J850h]C]mo'+DPUFp.M''7bS>=@\rHud.gE'1E`f([<6^&PE^1Jj3LUb-O`dU/\AGNQJ]s<2,gLs101G''<R<^M
+%/)/EaQXp]fjW%$BS8^$+>h\4d\@\*Yj)+WYgWe5br-_ at fSN#"3=`fn)P$(^l0]auQBd"-h1'06OL4_UIZB[FB,4)<]T8:"^<JU)(
+%03;,W1SE-BTcc=UK;BTATupL10O at N5[)`!^ZH&4nhM'Q3a,TSe885+#HRYFB'QE&4!oI:"q"FlKP8P%/`>O,C5n"G<ATSVt0&!\R
+%mlfV`(RG_l2$M$VhLPViD6N;#'^I`sYra7`d::_UGb2`[5L)0Q4YH'Z(>R_8qa]0Wghrn^7hu!WkAA-cX at T-6ng_e`APMj%,D'VK
+%Q!Z![LJc5@^@<7f&7Sn1*Rh!GiuDaN]p'O+b:goP_A8js<TgZCnT#+J5>F2(4YH-l5.k2>"Y:WC&Pm9RM69f*bs29P6t:P(S%4OV
+%QZh,/gU;/:AEqB?j+R!\.lVt3Ma\kWA]HVBm`RW;Lg,uP*#0"@:.0.SHPeF!&GG.;A(fnj*q.#4&"&$!W,d95NT6ca*$8PFpuq"_
+%J&p?`^\PZcqXiZe@(BVDeMdshfB]'O=afnWZ at M5Bb&`S6)E@*W\k#s/U2IgN]p,9[*H\bO5c%Su[GGDe]Rm[/6)f8;e,W%Y-2:MY
+%q#VVFR6gfBDeo?pj"KLXdq5dOjtCQ;6JHjATP0r/lKB_eP1UY,7'Xno\\qJi81J047REpfRR&MQp25,U0"pb7-$hfnk<rf>L]!Kl
+%-AEdI_7AuH%,ER(&>F'=B:PWd`N;8J=G>k,9tF,E`^8m0bL0a2mj85`G-LO.0?mn?U0:V=q$Ap!l!UZh6#<W at b5<X00/$!DPf?*9
+%o*ts28bGf6<RN'"O%>22;R*=SZ(iU)0FGC5C<.24OM"c"E-T!g8onEVTFj&f(GoYN at il\n`c%a(`A2oA_HdRo=ibH5anCEP=Tp*n
+%EEBY'Y/]!d7f-8GF=10KH6f3TRP_7jW_D*0+u76aW[9ti3`Q)2LCRD0B\pd/-(N4!T:N9'K(W@$gW8#+9`J3J/IBW"ht(6]CI;.K
+%/m2MPR_[@MH?(Ztr[<l]NTJkl>iQpXq=88`4IJUA7ZRt62&@'1/Z;'K<_0Z\937b,m5b,.2^6kpl_ at pB94s*P0<(dNBG^177T)D9
+%`DF2a"H4,<Pmg(#=(jVl8^ksSKbuDT^<g2Z2_n)0=\XujRH2]Fn]SA&N at L9ZA)WC8_ZW)I+TgooaNC2',;r9eX^c4[[iUnkR\4CA
+%ci!ZES?qT=^"j9-2tOqLmC-2//[KpSVdTGQ$HL&M4H*.kcaWeSXO'"8)#.bV6!IXs8#K/HN^dA4U-Rab?t+eTK-UT:^\U8Y<6S?'
+%`6M(,V8dX==/6OM@`.X1_[-i at Yi3D5BZkOh`M.KAIRuF601A\<>`;J[fuipD at H/2eNYj8iYc_`XEq2sCAjk&F\,Z.Pk21M#L9MQ:
+%d<(&G8oF;P#,#q?i]Y9LqH(_a[[Ol$$U9`Y;>DI(Q*Qc'jDCn0pa_EjD!CB38h.5I:oMdKj[hrC'mZRTC6e(P/g8pCCpAs'Smh\2
+%.Fg at c`-e7gWCj*8V[REYEAj5m3*l>]>XI!&bap.-,:4JfTp+7o&8itI!hYnI[4sI_IYQ1XoM?ta4d=`m_eBJK9=^k*ncrksU$49D
+%8LaBA4j)[Ri,!f"\t9Gh-SiV0FUhpXbc/6;Gc\gX\mALf8 at E5(qNmqnAC:9r9qFXF%@r5Z0m$:k#<-d0+![[jBq?[QRQZ9(8oPs&
+%=tZX%A01t$McDPNp.6K/NVD_n[UAZfT?JU$W,OrTB.4=^o0!uXAI@(WJMbPHQW,6Oj9-coLP;W09tY0.%--,kp(S,A;*>&MKnHF8
+%+<s5[BFWfC0d`Mff$W%U4.4bM(2=(A78O_?2iWTUY*@?Rc7M?0?/GJ'P"f8 at A$gFj64kQ!H\QY+0EIFLoOXQ$Dm!:f<R5P2YA+/_
+%QE)lQKFm[BJBs#l1NV5[%aBg&B8.+d(f>-c<\3ab)a.2nDNXPM$THoii;7d+3Y`_RBfBrD[CBIYUF=mW*Um9s(hj6iW0<?MljY"H
+%OX!i=X=9W2,.ojO`N!+b"T'0cNHdsdP_2h"2$j;[V(4*,F7533CVIc#A,Oi/.GQKU=94/acKVer03!o at B`ol, at l+RPVXF=UXBhC>
+%5WV]daY>5>ou=\]?.7RL=bX)^#>5a41em$#1^%>O#[M7SHKbpAS#5<4qd at R"gas1aQ5/,N1s%SC-b[25lVQZ/_p(og6KuSM\!8-;
+%Te]KS!pM3S_\s\K[VaC@^+2_aLq%?#J9b>*?#BX\N%AA)LO:Lj-6N!t at iTA$T?roF/U:D8J-,Bh2JH$?$!Wp[DQ at 6Bcpk8e^&AdI
+%`cUcl"&u9[fOsU\c041fkJ.Td5mbM"GM:E6!p,sLdV70To-h:H^0sWI]j*2o6O0K\pWDlR!EBR\L<6>97VpQ.]1"SD,W-fEm/#pc
+%[k4<f&l;3G4?N[p3'L=o>IC+4rS_jFBs_P7l&O"83T'8MBok. at rFq9_O<?E\>*Fd\<_qpA;mJ[W9gUF,);4uY'!5GE^/MUqQ>!3n
+%_;nXN0i"S7Sb/Zi2d2 at m.qbn_:'rqY&&L4JY[bUF,"<NIN?+aDl5$t;2F7X6,)/hbYFHs(3Jn>ebMEPdf=dY#qk)]u@@-cOF3l9[
+%6\_[dIW+^"+u(K^AReqf8><\C9rt:[[ZaRa>67hPbICTNoG,#tCMq7=UjF3p8PAth^7<5F<YmDi`9h_bBH1W$_[a3eiERm:k*=+R
+%XpXc at c+``ZpNDDH>eD$`,U'?=E.p17 at J&i.Bp:??`ro&0fEfH0%V+,h3:9B_)6G7dZ0L_A,<9t<!f[-4j)j>6j17^A#s?uGCGk$e
+%Bt1E5Ijs$E=aupIR8tV5:r1QHed9CPXH`<"_V'C*mCQ`YN$V*HDA9qBJ>!tV)%+Io)H at e#GPZg'<o%"ie6=\rHSq&Y$tpGL'QB(<
+%S6*tF\!dA(NRr5mq^q?hYtk16QRYPKe[\MVh]:@RJ4(7GmSJYkQUT_TG6VJ_-MM/mPnG`d\ocS,M4DMXc>qQkFfFl:><rNBA0.5W
+%1EbbD^gPsN/na>/o,2'/r;&>,^GrD-5jn*!l2KT-I9Ve<a*F6V=<^IT--'Pt.#ofF3?S?hYW1He\kaDFP)Ti8;$%%0!(BEmK,VrD
+%J0ANKf!D]U^kY$3:/st8FJ=quFH7urQE3'Q,:P&hjWmU$o&^0=ISClS(KVZ@#H'%Hm.>enm[5kt]`K\k$Nf,ZVb`r!r8%>GJ,0)e
+%h-\eSo\)+]NGC4cYd4Pt%<S-RRM:uSK3UOImHTLIqDI*rMWDdJip8rGXuO5P!Icb1"N??>F98Q*/guf:HM;Ib!H:869`R0D/'A0o
+%ie/@lF=FJnAWaj4juf_i.-cJ9;fN3o$OgufPCa0-W/@Mi"K at _?gF1q*TaGNG`?J+"i)YB[_HJ5+G?ne-(E>Vq!D&Iu&?nt>XNV7M
+%%UJqalND9H7j!B;)i55;$u]scdrN>U"iGjJ(4Jr&$YM3Y:>e=\C(GP040qnNYED at E>8Ec,b)J;jZ+\]XaoH_k,I&F02b!9AWMU7'
+%a_.Sd2(/8'AR1NpN8];GYi8(m'fES"Zq28uWN;:3NL4I6'+AAZ8MgVF70[ej[%JF:U[(7Z?aH8!WXs;sPXn)WAOJ,Q?%umc8kE;f
+%aQDCd`>rLiYuG*X8]<T>,(hh`&Lol=Ohl]WU^0_Aq9!t`IuiX^gIa2>[-/MqTqj,V^;'li1^8X/Jmd"UBfkB[EK5\<M]ua97Y_9l
+%'=KTW!UVaU(Q7lM/;EBNI'^#prsghC8D87qo>_?YW_T>IQ;,S,_qHC:#'[?na.2O)"/;TcNkk,D0N&M`7%P0PXcHU$6(MX7*JOh9
+%<HNJZ)T\f^Z\D%8*ko?2;&)9lgT.<]O=_bFEhI3*G&dXe8R*M9e9l;cE0>7G%YA`4M`FPCi%P.;a])0`G!%sI&^YVe2(22`E7-FB
+%KkHB:Gl=^V5[mF)m[9VrQsU\FJ/6^`#]XbQWfF!(R?3qRnQ&YO=#S61U+E0';(fE:C%.^+U?$;KA7H$)!-a=W:REXGO'C_fook23
+%JKWs`88b;U)/@CTUhU6CN5>j76\&K_Jh;Mg,9BcaFT8"6AnFkW9`5)f?Z=nMXX'p7N&Er>0QS"&H+[s*QcNqj.2\L[8(gIb(f:a[
+%fGMi;V-%FJV-j?a!pM'j(`\0b=KoIAB\"(kX0,&B3s-]'.7oRQ3ZSkiZ$XnDT--9d.4JluN8PVkVT<Hi4D1u$=GjClU*re<F/poQ
+%7fu(u746V`8RgXtHphde6`\Y`(-ug!.0DRmk'0?TBLssdf+GCCF4tiZYU[pSP/1B:N)=[.0j54KM4ZZDoMq_Q&pr2.WT?HSMR2V%
+%YY?]O+d*P at 2TqWD\=e(ql;h"VC_t$*;]J05AciAY*tWQ4o+KZNVP78[R.(60nm`,n[MdK?>`?^9Kffp35j>:nR(u7i5nIgA'pI at g
+%gH:+p'T>jiUQpmm&Q-V1'/*ktY#a/Kee8nB1 at C*/jlYo+Aul">V:Uf,PDEX6q5BW*4.ti='[$VmQ\[6_'o06K<q&dc/+'+B'UpBs
+%-0X_-Ff'fu%doFCSI2W>l0JZ45"^;/6ns0po(%^QWIfs./%6:9$s,-)M=k?+dc-QmVn>iFij3G+L.*Xrb62;>dh_0mPo$Q$$2SLf
+%3EVP;<%C at DK1I1s4,;YF)/0[4!Dq^]2H`TP)^.Z5CG>nuTIVuX<2)2ZngLR'&Gr49mD>_7/R'NO*t5-/q0Eo*T>OZ#Q'G7?J-k%%
+%r!#>P_"(5`",dHHVa1d&&c]GH.:iFoSF6T&L6Ob9bat8_VL1ASS5IWHph^U;Tglhq*?8]qo,(:>(Ne*)X["irc&OlAhB,Gn(#^#k
+%0/=-tig<oU]o*QJ at _`5jrMZ5YelYap3VJS))\`laTu<YY)mSP2N=1Os,7r:o at MP<[4D0c<<!oB at Pm>;9eh*K7E?_ef*#QU3d1CfI
+%3,sQebD;<<jldYU>[ht"iFRa&Ngd;*!3rW5jonN5Mni/G\HLr15l++ZX0m)'D([BoB!(#,W_#r3U+30"PFM[g_SRas)L at HC%gqlX
+%&<<_M4BP+9([.5H51&9$;R6-K<%pUgZ(_A0aGU`FA1J;8j2k>3SoC?hJg8Ki1uNCc9*)WeJ[(^h2i9")P>MI&/7h7'$/uO)A(%n$
+%BJ9qeL#\?<+W!S_Jnp21AQl/9er[<,"C?:4C-7a!FA<k(m%VW+aH?rN3#g0iBE;='SYUde^7p6S\q?1AhL[MkR(0QYPaW;B'Q"S@
+%5)fX!qrn:j1#4C%_ic016^V0L.`0ptl'=WhM7\Y//BGmVI(EchLr=(3hNsl>G"a;U)%^Rk>6u/-3MOba`oX35en%W:Z1\GT<kr<*
+%KP)k>%Y?h-aF-fmJNS3Y+a@?f3U_&hVRu&HKn'D'L_?j:^q8fh!B:Ek"/&39X:.T$m0WED6\%W!IO>muml];X.rq!@8. at a3<AaLh
+%_WV`5A:U6#R=rbNlZLL7%_AOq1dbAfr!==&RO#c2$bK at F<!+9^F)P_dWEl9j[)@n':+LqS3^HqlFC<-^JQF&j.M?\8_bk#\:6]`u
+%):q`Fp_k[mM`MNY!EO58 at lea=hR1i5H.**6F2ugYGDuS*-DIWm,gf-8Rlu`r]OHD$JBs;[>(SgBk!JWrY;t]S[!A>1,PbtTp2$nN
+%klu#<S;7cjf1>0/baBZp/h#.<&B[O at M/KlpJmBS'.\JpR72"#t:DJ*^EoAe-M1A+t,FE_6;n7G-TOpWZM3]);a&6ksjiEdLV+^r)
+%`>"Ct_NG^m<Ie(AXpT"j8NBtd;8hrM>KaEO,(%H=;GfcO3"2*KGg;r!VK#p5L+r8P/m_)I?#j4:D[%_#Tj%BW?qiZ8O1ZIC?pDSL
+%Zo'9Ui[Ac789F$sj`"^k&m1>]#5R3QNPm(CiZ'Hp#?_ojnC$gg=c,.k'4WBUZmdRSgeQ5+#G/GqmgB/"%.3_^[IJWQVS,/>lN.Fp
+%@F<!$:(Def;'p-'i(k4<nU_MEl-SX]=k"[2Hqaif/J2T61aroLpBa@#;Bhe[irs$n,L7Q$CR)>"b7US.'M:cp[:*O!Q3LR,(\8dH
+%+JE"Fc!.1f@\Bs,%',uk7"C^@9!BH_:A"om4\MdVn6DfL"Us>!25*[9MfJoGglW7D&L6E=n<Za>g0-akYma$SVd2gLDdn6:<+l<f
+%ZbT5oSoK?^VKA)BG\)f%]!.2 at g4==m!ba at d6PU3(LXN"S&b2Ee[]kX>g?=ekF"?403^Rk>_O=L^gigkObuL:KQTS'/,lD^'56Z;^
+%<Q#5gOouLEI*Y24Q]YO-iE at HA'u'MEOjT.O\>U0LS9:Tu$l\KblDJkC`-g at 9^=/fW!.C]0o]:YsUXMQSknZOh;(@EM.4+_41n(.&
+%'f at sR<mI)/(R0+Vk?IQ#VZX(5X8^$L)4H%-,1%/^hDbjUk.!NJ;9U>?PL9J*iF`b1"O2 at PF]7M-.^13V\g5W?)=p\VU/NVKE47l;
+%9i:>]NmnNP60*Vue)cQIG:Nq$7Q,Wbc-'4ZBX!U;5XjTg];LPIKD@)K?IG/$'@`PG]"s\c,p2H/a_<;.MkZq?"FNWtCih">LB[uf
+%crbD<.!`NP'N)aKYmrX_^h"N4<chV71j'1i6GB$j7uWJ;&DC?Fp6U1YbF28UM#0"Td^1KE.cIRe:)Du5`Q;A8[?*+WTD&tN7^1AJ
+%N+H:$"^bq++Zp;LE\o3.X]6'T"E_lor]50i9BKVNmL at Z+[^i(EX-D\N:9u8Yc$S,?81N==IsE>#q%WXfdK*h(M[ZCBn;<)\36<JI
+%:l3$JP:d3ia`:k?N5&*"GTOPADVkIb,.J'XJDf.7e:=cS<fW=e!rok807omVBjka['<"d;j at 2OEJ1n.'%O".RNDm?i38-iDkp-\F
+%oP!:d?sYa:;AGkJ/ZcHH`:u_uqjJ at eK/j9R<c2CAG@!W[E@[=<nA>:EHb=kO!msnf2BX6-WD'n>2c63m3`)E1Q_?YR&<Y4SSc^HO
+%*T=G"=p<PtfgH.0L_DmSUBk?3M1Q519&jqeib0948$NaBIXGpQ0j?f<'GgM?Ed91VaoTpajZ#3+AMlHg6QFVW7%,H%$\/:.X+QZi
+%E.b at R)[YWUQ>uN6HI7@(h!,832AT>W<2O0:4P6B!]XB<X3?E8*nMVcCZ-93oh'hW'1973CYq5hbCKAIEDO at 1u!RqDZ^;:\6-NTJZ
+%krXGE:c1j-aaiU)fJZ<f.+gaEaT^=Z1gZkm6(1p0T at gaqLkO_:2&%q@:IW&_YbSNYX<[uQ[iCo8X%?L<)Spf79lt@[,$F1_(h]"5
+%M%a@^P0O:WLf[40C_i5B(nYXb at 4cqV&;oE%fLF%=7uhSMGs^^!!Wi\+m.!pj!1PdFWhg1mH&$qeFS)&bQrY;?*Z,:mIAe$%0HZ9P
+%N8Tkm!+&VtE06sDn:lr-1kqs'auN+21+'T^K:#\"L6f.!8"paqO_?&:.i.gsPc>-:1*_TS`@aE1X`N^s+R*$7A]Am6b3BFZ1rco@
+%2]DBK'#P?@)aOo^%`OldDX;MCi at T\Fm6L0qQLE*u!HGU.iGO at eh2@$"(CYL@(@GKWgpK\_>Cgb&io"^._-MtNpIl,dV.I)3.En<)
+%Td>D\CIXT4@=Ac=gJakUd%b&,E.ahoC'Go>3Z&hZ#(WSt!HMp_M1[/";:9Z9?I!97^Yi*k`a"?>@R6n^R^8HR<_tg!77f(8<%'O.
+%c*>[2MXFq=2C)@UW#3i&MIgi4a&$eJ6D4I9=(QHEO_>+o-Na37RMq,"k?:/K>B4Nok/ZI"$F2J:<l9*1!7&t,#E%(IUNt?ulDppI
+%O#>_i.5i%p/Tm#ce!*nMYmQ&<S=J*6>C7g0CN1I;1gNZ^*:f%mQkMt9a56;87q+b,&CqdmBL:fl at g'>0.tPNLTbui`T at 3IZ_-F5k
+%V5.Rp&u%!fU,5_P)@?S+22(:PVHpQ at DdC-eTU7Xi>/_Ua8Wk7?VRi_CW at Hb0K?PkV7=e[2LtT[jc:X3E0b>jU"3Lcm#Y$HlN[KOd
+%S/9F[i*doH7+ZdIi+ip<,<o88LY3lRVHP7bJuf9+PSBjG#*IW[&2i%FZKt/ig3YJ_:rJSWMX@()n.%;$"!.t4`P-1C29+D;Gs[OG
+%,Hdu`,f2iW0Xj.N5U9p:L!ZBX8djj1N'R#:+Y at XKUKkY^`ioa]/.5W<gDD1UCC"!5!@;kl6?SQdL)EGiX0pU*.MB5MEQhYm>(>ci
+%@YD3=3[Fei-PQo0abpT6]/k:)Li<Tr*cK`d6L_`Up8Au6[$N,b!efElI21nIN(HA3Fm-nEMQ;/*H]FkfqkVSS#)*W4"YfE]9%!o`
+%cjLIZ2YQ'nA_(7/5*C.>?oqSs%BAoOoV,_bfi-+3WhDcHUFHONKMTOD]\C6okiAaK>L.9pk^7 at S:.3_Q&Z*qgKGpI_S;=0j223HB
+%+ at K@*B,+R;:c4qE>Zq95:hc,Eb:RVjGV[AmXlR_04lo;&)%8!:?pIN+RTlseE'[X at Y]>)`cslWsZe5gcQf>V[QLXf;rlK+e+mUkf
+%U-SrMFj(cfdI:)`OeoIK(6H*LO0$LEAf8^*=^.`o6dIGE7GQ=!N=*]t+H"3R at s;akP,9-RCGE\g/S.]dlUXoO3"CaRSJ16Vas:^:
+%A:MNB$hI<F<i]>a:0)[+1b^d/9m*!HKPSl,Kh%PfnIN;%cj-<YEt3s__`;=F<eL'm!Cj5")LEc0#S"Qs!6+M`N=*S"j*=QB3o3I`
+%!Wm=>`<*d?e8R6j\\a\ecTn)KR/sd#0i[,*>;/q*(Q=pDRfL%nSrjB&;@X)X<Y+Bp+"Oc4?O]MAJ;T:J2MLnY,2m9grD,L8mAsu(
+%C3%)l at e-osbDtb\;7uQak(Kr6d_UqK&;W]_Thr&;gi>\_./A#P_hV>8FKd19+\P4X(Vi+fb-ANM/Rt`=KPt?e;\BX>"Is.Yb$9J7
+%L]B1ig6gh&M:Tk7>Lt"O_U`uA1^mAXg^7nk\8m*Qo#d$&_%jMQGTCj at 3q+.AjLhEA!COYY4uuh+:)!P9;D;R^,`G`#^a,QK,dKa;
+%;B'&cd"e*b7!r5J226L_EDP at M@:*Zf`H#,@?+hLtok`cNHTaFEdI!tI_1f_&^_^'d8\eDkIidakMTf$Sr(#"5=eXC4:5]!^U,Hgc
+%b:qD<!?=S+aEO/1Ui\qi#nsk3>[-F?:hE3EgWoldV(1Q/L9;<Q]IqqW>Qq7(;kP?0)a(5>5*8Vkni at q=7Gor>#=QeYn^GXtc'D-U
+%FK8U\H<:H#eqhZTKhFi1!Hic-+XK7M`tc0'AerA$)XNSnF6j?BP<JTE:dmJr0[:GhUe:3VAl'<7[e;a_+:cnQ58gkJkWg.O*G at sB
+%"JoBL=o]HnfW(>giPZN:U:]tX)Q1o`3FIS#0 at oZG(,as\=B5YSI-n8h`fZ`=p]3(3M2t:9:K/j5Kj*s\;MJ>Id^lQTG9S):?B>`X
+%7"F&g5#3(?\'c:XJ\?17bQFSK/I9Y5d);[f_i)roX4RMAOu<,g1fJKs0q9]tjH)"J;@](9f[V64Qf?.Y&JUN7HdBQX3cIC=05PgT
+%,b`%h#(uCHV2;giQO at +?2*QmMZ,s^RRD3SN\"a9n(?BL8Z8`SS)p]Ig0nOI-Wp1ffQ_dYs at OrfEq4V2]pn20I3B44T&c_uV<.OS_
+%7&U/WZ#l:^(ZGW2[La`j.n"dIgu347Wf?@,5)pE8LZ<q5f/!\dM=J$c-s;W[I#>V at q3nB`n,grC]>`LfVgq1S2Oh5LjYbOqP"JHI
+%`L02':f)bA4*?qi,)6"far4+*-TBGAj,`-.'(nrCYr([`OqGlpiH=W4NYN\<3I+oB;L6ROegWJegiA>:,*#MeE@*(`(*aC>X9juS
+%V-KW\7$.Xq0h&r?`uBenq3FYS0u/nq4:T^9TF-Sf*-B2W-WWN>Mr<>%Zca,[!<@UY(Jt4ch%ne^<-k(]*(\7Pa4;^K])fAmnd at f"
+%S#.=4ggM%8W!Y_l0JahoJRf'H$DN6sE`;MbUFGLG*a%@)%_ErTPh4h!)=Lg`Xpc?m\f".9Ni;FWoQsgX3m+Em/n-Ls>mp/=A4f]c
+%=,?O"GJME'fh`:IOhc/8(ki(>74QHU"AFOsQo^;\`e[3t8jt*IN0?sp.3dL,9UY;`GepF at CbSE!Ji$RX\r5faJWENVfu9=$"G%5P
+%E?!pI&+.=fG"&^2KiXYecA3/J[sGJ0 at e.,tb*Jmb.a`i>W$6O=l_Do,:=iu)??&ae<#NLB&PjH:!Yc\K):UUl$#%8^c^>@/][P8R
+%'SrRL`'_aZ9u'fXI_q[T5U7.,>K-@]+/9H"_dCDli(*mq08V[ufTAR@,?HK>@=)BT/[F-%(d3#cLBmY=9+pr,6K3u]_;oDeL&lp5
+%WM92%,\h"11nS_63=Ll_]<]bjJXk!fkbTu>fYPU-KS9)M`.Y#s)KSgON*CF,XG6m.\JgS!%HeI:7>X)/)(J2K-ehdcGZYneF$(gd
+%SQ7:<GQZ5Z@\Rq"1(tDq+VX18,bI?IW;Lq,7`>.UO&t[pTTn&j8EZEdjO\K*+?Us+IjfHpkR$\h'RuX+'Z'<1lN^:Iq&#cs0tG^o
+%klHQN5if(E]ORbSdcV/SjQqVI59FeY"[c+sR$Re`#4g%E#q?+tqhd*4;(=#i'+!V[6VqqTF')PhU$IMq&TtrsK$V,mk9]oKdUe`#
+%'(kS3Obi5<J2)=)Khaa!!4Gkh!"]:s%L-W]P;3cXApdFsjjHfk"RN)h,)ZU6h]acB+fiEM5pc9*^aFMj#m76HbGT<T[OXpV.*!$1
+%+HQCO)9+ogT-ab:*]p7;K:HCQ[H'm[dsG@]0u"G)`Q_ULh"*L*/=IBo8rmCpnXNL"`=>W+l75N>P[dmI5r<bF at Sg'6MKIGN^LA^?
+%6eKNV8Fg>6arpFq;Rf3+#WRu<6&BJWdB%kuGWMa)*J3PqC)7:^<4&F4.>Lnqn,g2;((<bWOoMZ!OdAeeXuGTK6kZ!-2XmS684-c2
+%'g8:O&:c57D,Jml7`1-W6U`P!06j+b9]`#S2k5!>C<_Wb_]H!P[&%$DU5qj=A,&fi[=FMXi9m2$Z.@(*WebOBCdBLA_jap?7<20O
+%/]bQ:AbtI36s5%+:R+`uiF])0do#o`B2$R^[^ZFtd8u6G$5CBjim#i-$8":E'g1Sg?Ad`/i$l3#<Oj046$L_SM7:"1TNZ/?>$T/l
+%oW<:>aiKA[FpmJt.E077D<l:=PtDN>G(Rc@[`Z%G1@"TXrYS&)=WSP/hEDL/le&fX,9pY,hGnT_[7[m<^r,LP(#.[)WoE9A_(0o5
+%JZ^\G"L0%1&e. at G=[D\#&sH`EH#CP=3<'#hg2U"DkaFmVPYOjTMurBgT(j\,9Oep7On5#:>F4G9W^L>&G\sJ)N_=.5e\&[j_iSl`
+%mOBEbaJM_[]4H0<e:h#("NF/tH1<(f,:ZM53I*@?1Q!aE.0qY!/79V0S,d;j at WOiJ"?^F<^>nPL at S_".Ea,b&*='O.l8fPnXs#aF
+%>OZ(*m,+XnlR823*TP,`'On!J#"HId:DHiN=&K0^_qh=0X9/&CHjEQa4e,Of`P'Z5[660IhB41oD!;\Hn??I1El\0er;;SgCRMmE
+%hccV`?$Op-IA_P%]TMTuX-W!3p8MWo/j*l[aEQcB.mhJ*]kR</fs*1^Q/.-A/IOJKn=sPLC<'Yf9](O7/^\e&6-C;*\c45Nd;HU0
+%RD''d=f1ZCF7u4$c0g(u)nV^KDdid;"UT)oJ"TfJ'AfsoYikpZPfC51r(`X0bXqL_a;e9fPOKk$"_;BeI`D_Fk\jQK2e0d']m?^;
+%=M.nH?3Nl)`(&:Y\3u0/ja:#Rhn32/oo91IJ-Tr>UlnW3/p(EokMW!a7Dq`9_6+Pa9YSW!P:X;&5cP7Yb%uP`L2V?Dd'+K_cu>J4
+%):g>D<[/kd65Be7ZDqA)TP0h!*.j6pQuTH/H/R=b#_D;N(O5PlHmFD64#0nlJDI#'=Dp=&+(BO'e?3e'&r:K[`L2qg!U;Eh$=`iQ
+%5RaY++Ec+JW/,)G\jT=N(GRMpFTNT$P"UKP"?<-^=p'SLp.+?I?nF.V4Q+>WeBsRuhZTf]8hSf6PCI0fLcjPiQu/rLfI!c:M>ou/
+%:3FJ[Ae[eVg/Pj:?qd(5j!F.8GcV\=pmQ%:,.=heN#.6i8bul:o/*G)'ORkg'fAX+:Ib'Y-&3Q_aVELp42OI#pdDD;,ANeo',Md2
+%YfdW1 at T%4O0`B%5188T;DN2J,!J<]nb!j.W-fHNJOD!&?RJ=FY4;e=?F$]"N-(JsD9UC]EH_+q(?=C_38i"C1RdhQLT06Ge_"?Pm
+%PO4Dd>1njofSQkj2 at ESZ[R0;T6QIjY):b%pNt^aD\8#MC?uO"D%#RhXfgMKP:iKGfe!Y4R1H:K+>/Yg<3E*H!=F;f(3\*B-]G+Z+
+%`(DC,GTZOf(ifdB5s?HWV!09@(am+9<@l4!ib/NKd%47 at CidI@0Qcc+"eh2h$P9b'Ei6cs<W`1&Ii"N(SN=OuNSd`5apW*=Tnm^j
+%p(1=I9:0 at f+qh[8"3@'],=_0[%^eSU'2h14dj"iB"$pHtA`SR!aYg[S_42GerdG,C`S6.b#>s#U.)qE.N$=,0Quo0Yqf-1M!A%?2
+%E$Hd*e$iRi5[Pg*":IC</"1ZNfV1BA&0f/[r&S*h<eU#p2jSU1oF:5XN%%fI>nJd8pgoI`EH&t*&8fWNjhNI4""QK\0EX-9?,$cq
+%Ys:ZlQIlbqeEICc^:'!C-Fbk!,gikp+GR?B(,+(o7jfZ9*=LK at dgYa$9*(?BXfdOpjKLsmR at 6sH_A4!@bKHoQXGd`3Z%4d-L\h4%
+%!\d6<r$r5MW7&n9XV_UT5VN4bd>M9Bh#Y"i0PCg1Va*:Ng+G"Y[2/BNjASjYf.QYe2Y8n-UjIG_`ufqTH5RPtE.N]/FciLR5pIY:
+%75n/gM2O\1qpEnJf"t=6YfOqN:/&3s/;;_*HkXN1`7-EB@%b\Z%)I"d6 at 8m;P5>DBG2^5O'A`,i+>3i65[n8g:rmISFTdE;$oE&J
+%89dCmRrP%Y3c/J/KQ%CD^:nSo7cu<W3tU9''N$U7E.'1WU#^jMJgdHDN<sal]8.u5=SgNfXAfodHBp`&n``;,k;oKEpM<P:)]L+d
+%dB']R)6gb")\1u+1"(M3ZGA3'8d8c\9u@`HAJT($$:4E]ki0U2OVi6c2NjNY6/]AT9Vs,qm!R/7EE"I,0cbXF<HM"\^L9t$31Yb`
+%=]_hja)JHq&:bV=YDTVbEst.#m_YY*Mr8B%N\6?pR&CIFV:"K6^6V at T%^ftbo;FF/.30YG<9t6&7_$#bDVsB\@Ob,:VBaFt_?dJ7
+%+<<bHj#?lk8Q4_rJ\ltB="Z9sEukfJJ&KjN'WV9qXB;G*D\C:sXQ%/>>)Pc`j'#jVdHi at -r]1@,"\bjIg0"F/O=]AS6#B$dEjZSs
+%PmkIYeGLYX:8:KQre]8_<b-de.p9Po#WT?7OWB0F&^ib2j&@h)_%F'@YRABc-EQ#jcf7 at i270MHeRm;YJ.mkee]g5dXJ"EYnu6<I
+%Xd,[dFX`)@V1n'Oc?Cr&;@ZTZh=EfK#S at 8t,/Djd_>A7%TM(sE'_bs6DK0+*(dcJ5kV1<8Q7p9Uhi&msMKsa5U="UK;F=p'U5d`]
+%YRVPHfR!'Z$EHM?b\U2,Z1O*;7Ukkr;)rK6"Y/X07]>Ja9a_jo7Wep*-/Q)CGT2nf$g5JH)`@1Uk>(]8Q"o!S$aV%CChp3=;OeOd
+%k,Lfk?KX+O9uc.GdnfZFE1_5GXPsj>s%=3HCc;P#@*Q`&aa$4W$`(sdnP[i+KMEc"_NsaA]QgL3m<<HUHc+F6:8b_/dEJ\r.CliH
+%_ZG+0Q'A?is,`@KD*KWl,-kt:8ME6nl3&,FDiAn-S9<bu_`=),WLL43Ofo9q[(S2bdneNr8Xq9HS=L@](uLY,Uh*MFUnc9=*j"NP
+%kp<reV3`@h[Ou\QDcn at V4srLMFA>d`h9IKAj-/>ce$rt%ArQ8*@$OI.$.HHl;F[ob^kOP$GEGnl[<'$1pB1=TEm:HS`i(s->Q`^"
+%X3W=[ne+_V>q="Me9\Y?2C]8M>$#Xe/-7(H7fW=NJLp1'Q7g&scibE/\"7Gtg)k!.W"luAlm%"fKqG!`I^W.'Dh!4b`m9'O^ccJQ
+%r!(r/Ao+:Eqq[45[pf<*nXp=%g at 0aLL4*gPesiqJ%G49/mQgs;\)H1#i'A<jdY<,%]S"RiS[DmES+3-\4+@'5[GaCRmd]Udfms$7
+%l97(5lcn)6#&LO^pRhueS$DJ!qqHig+/PM;_VR1\B7k.6R^([,mpJHm?lPQ"mn!V)er66Y!mg=Z"6*N+[,L3BDE;srJ01"6Co&!W
+%+5]]P>ArnP]0F'kNX'X;KdY`_Iri2d#&Nhm^,KF1S$AFelq'!VhgeujA$6fTj(@Xp"1HsCrHS2T)m`W=^Ff=C'RnoIV4U+F*a2`n
+%kf?ds++EG$UY[)@oV'0\MuMAhB5[\=0Aeh^^3:W$e:<;qJ)R$tRm6_4J,<#+FmPY,C-M9m&,s]nrn3qDq4IVPYC6!3LZZ)An=q*&
+%et;r6^\l:Tq`k,E++<Wa$d(YVn]a;qIpicci_P'q at m;]_&_ecSg at 4#"iiff?L=!DZr5\j'0E1]HqA.*;V/Q at bs7+uqIg]c[[_qQ=
+%*rc-\I=#pVnQ``oD*RUJ(Ou$`DOAJQ0ZRTI/q!&U0E:E`Cl*?WrTG'4F8O(7[o2qH]0>l`G at 1BsK(7j+%mTm4Dggk[O8[..qO,P#
+%8)F-[YC5H--[tV at r:u1n]jjeb6g&pcqnMdf$dZ`:F!%Z:@nnu#2#l8OreGEAm42NR5@=9;gZk>Nb.dbj^\W_8r3*i>\85985Q:Yi
+%n,M8%J*FhE2B720-iWh'-XQYhYJ:"r:G1kcO`s!<l;K@,H0K*OJ+9Gn5(Ce:]^se+J,&,4](DsTs4/\.B(!`%O+7"I^\a!lc[PLf
+%^AIb^J,ICHoJ9YIiHH@?o]P*/6LX(Y5B6Rms0JarGrFUDd<CSVh4]V\GP-#qIfAFBO$<+n?hidXIZXhdB&qXC>!J;h54[q%f73N&
+%0-=O^EobW/IcV*S7g&\N07W(6?hruRrkXkI73-^LM4<E!p?`Md7fo_kYC?<5?_t&8q<G/3o/D0^]>&aid3Df%BA`L`)eU6#PXFna
+%DtU3Es5MR5_ne#)Mf7F!+qDhjLQ:6hm5LHR&&7.15Jb&0lT\rE^%UH`5Pr,QcGk_DMnecehn8S&qL%Lg%+^Pbqn&KfI;J<*=iGs(
+%^A\@UI/)N]'7+?6s5Itsb(WL'RT4b1Z0/n$B"p?/ZqN+&]l.>uLUc\P^\RFr^V)@iDu]'gJ,Ll6T02kfpYL/k-\(dI[i_'PHpbTV
+%^[oF*rRA*Ahu9b.lA;9s"V0YUgM$'7G9d'i4a-OYhttE+DLCa1dNNGYGJ<e at pIoHu8)Ek-YC>Z"-Q`97-Z6ZoTE"Sfs5MB'pgIFA
+%he[HGX8$G.,&k=NJ+(W8%dh[f*jj6WrRcA68&DmCBnmaE4hnRKTmAAnW3Gm-rpP:@q&q9"FQ3#'^NJRMi1%WFr2o#JHOm6WYk*>7
+%$fCt.n6):U,>6'arke-<:2G"H*C'C\,DYMF at .hhJs$$-1O:E9po'g-:?N0klT=aq`B#gu'\:i`:ipEY9I*]DHIf%%OIa=3jDh$`j
+%c[C-)"qQDPs8CjND#_q=TD[q$5P4JIhY?g5IdY\*Vf2'$p^@-$5CMuZhWV_%qt7. at kI]VtrT^XjB0fYlT7$Sr^@r`Li6?1hkI]XI
+%g?U[m5<ets#b/p at 0D45tqU`LYV:T)MpkS!i#)=9-IJV;\T7?j8++3'2mp7,W^f\;9;:lL&QI24,r6YAds6.k.f2fZlC$Cb\+(9)d
+%5S7A%F6Fc;JVNOdVXRA;Q4P5PHq=h(&A2%H%XbAZ(2?j$%1"Ng6?<-uW%YD]Pp%Ou6T>U)#o4^5"q3l#CEYdbX?^2DPl^aC0gEDB
+%[Y!N\pkKc&*<6^l+9;VU3Kl3V#i1.<H#_oS'F.I5ATjH[O9Ln?0dNZoN.S#O340Ve?=QIcf>g\pU&14>,?>0@"WR^e?SAdH$nf"G
+%/"?2\<SADmEoG%>`*=B6c6K&OOp<[+.WAu;0CoISO#lD+Vhd!`E;&<[bfl0#NtT.!MV/H+1G^/.73$f!LQ06*OlMuO09!(&<B4B&
+%7a0VKe"\ELPjfDLpW$eP'd1tE(dN=#qArt7&M@@r:-Q9JC)mCpe5g4d\j"bO>A7q>9QY&mYVHdu4go#<!DH=OO>. at 7[KuJ.eeoL]
+%IEWXRg96`bEn4uioT,")81=hBX[rA%g7"fjVQJ"9f3k+^A]!))T`7`h:.W4AlVis,2HT,'2qqZ6P-8ohX- at AObrV+uhp"bVHL3a=
+%']hW?lW*)Y\ROfm?*.8.@^iC=;M=FLh+E:C?*%;jaka/VUY"MjNS.DQl^.H1D$<io?3nU&Ynu!Bg8j%p<`R<eLA>Xn">'1pa.rOc
+%o7OH/_qs+G[s%A]M;5p-s(:MXkL]5c:Z#IEDh``p>^rU))+=[_e&0Fi>HR)BC[IVI at I(dLV)pfRkfX`iH`#WfpMLJqlaM0\/p_(_
+%kau[Zf(u=f#mU+aS>+&.U#j>a!='.*laKBdGn4<10PdBKKfe[N?Bj`Drd^:>(0 at YU-qe\[q\MJ+$Yd3e^"d=_Jma;/W%KNG3Xk(Q
+%]61jB^+lao'YDk$l*UVS?66M0=ZNL_;>MN,X6m=G\ScV+"/OGWr`oNl3$!nL]<.:Pa4]RH?+\q(]T2W0eNu!jlg/Sp/g\E@]<FcO
+%*a.0Sh6g"]5JIWWFll_OfGV%4PWcLdd[aHkl8mTZ)jYqdkPWJoC%pAS\N@,k`iGFf_a2$J]kMnh4m]S[L[dLa?+W,.,u7mdEE\k&
+%QEYI,0RjO,KFb2km>Y=Y;n+q.%W6J,5C]ATHb9p?26H)]63$@VG9\fiibHg3gD_(pWiM><IJ*c0gT,s'naY0cmk:@fj1EJulr6^Y
+%K=r[;;t*Yl:<H=)jgYt4TgCFM7#>T2&C4d!A)Ik$N[Xg*nSO&9,"O@&;OE0E#9p,49%2D`]=n.qN3CKO]kAk[LTNok+Ni9HZ77Pq
+%.K&)Sga@$F-esVklW\m[!<Fa5S0iV31k+qfLRr%`4muA(QFK<.G at -?cE!>q;s.!UKZ&#.cIqnnbfT2?7ScuaVgjuW<JJ`+GK,oG)
+%M<kk0)dBuABV<Na^ol$44.)5I3$@:\Q8ACo`n;\%d2>TP8e#nIiQ^oedd]Q('?D#aQ-ctT"iLnt83 at ga]Wq:32UP^)M/TeG6-PSP
+%jjDWN$T+3L_BTGW\C^W($kWL:&qpt`=niYt_r?0C^qY1G:#>.#PDDTpY94=W[.#0MF[+cC+qk>Wh"d[EL-?FGGJE%-A5*qf)rD)5
+%XnVS_8c5 at 8LRu+E@KXMt>N4-Q^,np2r9fl+_,mphDQ2N?]h5.o@[Tp19>;cghjeN)+53u%AIoT;4!2%:9jrTlZ6_PM$)!4o8;qL@
+%)?c5iA8CIW5;"2`:GtV?Hf#II.S*3Qal.]UB"#WBXbAgrUEnm,b][1#f8F[8,``<HL&XnhAPPdfC?@J:j>S>NjPQlOi$g2MB$07Y
+%$nkg`Y$(AnBrS?n\uNfbTml.]Rg)s^qXBp)`Gcoh\k#Rknmn6kJ.AB>T`ESY#TCS^B!^\(m`jgglfeJZo5eN=Q>R:d-?UHRkkCr!
+%F;8-/#s7aJC;JVDC$&CV+KJ1el(\s[.bj7J:3Mnk^'e0*jjDn5G at Tm"P94!J]Xiii5biX!SH.>aF0s>!l,j>@\%U-7d%m6qeJ\&J
+%FCXj)B3=8AY1JFj_?WUgkcM7k#a(1sY/t835Q.j+Om(TWraT/XgZ`n6&[Q,eYPeWcjEft8rP@\q[kel(KR&8iT`Q9feh$.KQ=38p
+%iaN)JftGdZWjVIilWC51e^pL+VZV:SNkM[EIJQ]_mD@!Qd[t8_1L!Y/7o!B,%nBP[Mf?>@l7LSK\m'!U?WhkV%C7!;^DFhFo=L^d
+%6iY#b$SUoc'hhnk2Y/nP%@am84]\8sH:j51*dN,[ZSu]1cHZjL<]5<"=WQ><\F'+YO2F6Ojm7b8T)MEmZO(KB0<pDs(3R2!42hl8
+%(N8t9JL/n$qm&XbN[1/9='k8'qh/gW'g<DS)^@I5QJ9+Gcl1W?!O,&I7:j>;=*gMU>WD5'hcJFgjL`oYLUH#G]/c43G.==(kB/];
+%2aqu7"l?Q#>?,H'<n`,X=5mDhpMj]2hlX#o at ZM&OXe2>I+kjma3kpRh0:uE^YD5p*eo@*b]@_n(4h3"Hm%[5)ZG1iuqMr>p[_=+k
+%c0"GZp8EDMpDW_kjQW8#5BZeGZd3rE2E\<toc8HCr4L?_*rbO'?TZa6O?!N;m8Gr=I%lrks%IjgruE3(^&JfG<^52aq8D1f0T6IT
+%Bc at K3(n,)hf\7C7B80gsSine&ofX.X.o3g&,7VPsmSh;iY at POM%=92/Ku8MW_*9$tfs&i^EGkBUfC$)=CN&!GNX1+.oSjeU\t=D(
+%SEknKbB=^lbOGVuHE^c65I#4/$[H(_LWs`&RDIh>>\NQOEO:WeFoURVHZE?FmbR7%od$f4^'/Qh4b.D[_p[h)h8cSV at +I(=Z\]!<
+%I-UoGmO at IfJcml06ls9]DF0Vd:Z%WdM`)]^PI<+$C9J%PD=0[BQa:n/Yo:'^$Ul64emS:,nM/1WmVmgn`EW-1rn>M>OmDtj+VcF5
+%Trk\W\)f?=%+a/RU!TI7[sQ#0Dp`+k3\qVUFb^p\0cKq8p*`YbZ=T0U8oKFp[d-GDI:TS5^"XF+?>j-;oktqB9m]YhPS\5mf]\>L
+%F&J4XZ7fiHgK4nhA[N1K1)Sg!TG:Q9A[UE"4jGDaY/sbr7dC<M:'J1tWsle84FtjNU at KU^fL#kCfpAg(]PAOT0en@=c`kJJ.[M;A
+%%X:Va;jde*:j5_M>6e6aRs([h;2:;+U+^)Ur6)58\#q45n)GS]"!A+LP6$q1Nh0h?UP6RW.P7eiL^:M?dbe8+3dA*^D4TN'U.Y+8
+%k^G6Z at Z0[<;e/8nHI30C$Z5j055'*5hco"%B"8i+p,:M!mCW"1m$QqHM08#15BVBad,,fTe[US9 at W)G2Kh:i*]"OTB7cTb=lLn0@
+%S=11qKhOi%6?U0eh3W>.Z+Pj)1.`g_g7fn)i7Wm)\X/*@hASY6mBqomKAl)0,D^`tHFhq#,Htc[Cipc:]l57CZ:TISS1.MEGIem,
+%G&]?mr/$r&lXapSoupgWfA.#.(TH`6[>T[og1YjE%^0.UXGUaI<]h@\g8")DZe_+gDKfUUGN:0qh^ukfhF=F!%o#4=mYh?l9sqsY
+%G8Im/:3Wueptbc&>'G:PT9rR;-`5KTm,$r]4mVB4l6j&hK>+k+G.SJYX*)!<BM[*7Dg$#R?XnrGI)72%OIEV*[t04!OMFMR"kRXf
+%0tAr,$r.LP9t'icYFE=[*TFmFnR..)`=DEgf- at K2H-?coe1*V:j4.spcP4+J@!FPuh'X`.DgpT)@mkll-Uf])s3U"/idMpg.<"0V
+%B',[6b>tO!gk17@#PVWZO$06l$FSim7V*9Kb?8WV(>U_5QWYUeM7kjK:rbcM]D5Y-B!Y9ahYL4Kk3W(dJSf7RZC?MM=bB\4A)oQ6
+%QJsicleAK!M:";"f^5;'A<jU'hTF+2FtB3]U&H'Rbr[<]ieL=+)qN`I2]23KX\6 at nf*?*c9XFVK at eJV'Xm,a[e401F'V%;tbm3ge
+%fJCu0`]_kTnG/J1hm`ul`cn:`bsR-H.H=2fF5csGQU3POBT50\B[BQ;nNEQTa*?CJGs)"4:MQaHS#78[QHKN>G]7;8gXZjfCjBgA
+%k<\Zd4G^04DacDC;@l2r^eaOL1T(bDf at g=.j*eO[m`1T'V]NuQ]4G1sLbL`uehb")<IHtkD>2 at 2A\V<Zh8^91f&i3B^?h,6^`<[&
+%74h83`.0hoY(o5pL]1]Qk,m".DR]Y`IcbPrg@^$'nNGR`T-)j&@rtUOBoGe:9i8;nP]jU=!D7=a(qmZoWWsbH1^43@*0?S'D^%\i
+%9gk$@h'nJ]kB7V$]#T//q*83=_.oDWmWZE6U^%:jJa&sZIV`nPh;i$h5E$r`2breV#qc#m+iWU0bu)6bQ2nF<B#1(;A?0KoS+3dC
+%DZS<]Z'iEEF00$GjAqa]U.:&V2po"H12?P2>q9uc[@1g9Ng5 at U]scDebQB0[&)W+g\MNSX^YZ`[3nJiRSf4WteT/!UjedoLl]$>1
+%<_(n'F7C)jd3Iu"X53I`>a/ig3Pe]np'I^8gRX<0"d+rm'Mr/kCRn\i'Tf-15&Wtj`p&-#dJdAEmqMPS3g=?^_7e'c.3?C1.gjA+
+%&:AkdU7;]UP$)p8F<1+oj\T$GU4YGDAkpOj+-f;'L%F`j3*cE$S6LUbUXkk,`[IOj*0BL'!s at Z`=fJgZjK2j18brM_o#eeH!l6*l
+%/`0oCgB4NU)S7pL,k,0\SJuaaXg>^#d9nrQ.mEuV%eSOY*EuP`"c5L_aC2")J9,#Y`&f4hq'%&`BdFL\*33":8SrTFS5uPU<mjgd
+%=teW&`HkTD7bh$]l=Es6SU\PBf-[R3V6Y$hb\*A=&&`)/J_4X^+?#]!`&kS/)IDl>R\DWTDf,Q4Hg>d'Et30N=L"DI&TtW?-/qkL
+%^2iQ5CSuRCL%j8]TBW_6q"TD:Y:Ih2[/UL,+$R4]:Up3c at el^_=:V'Olb6gYWeTY&:"*@+ at k5PC&R2MtqMki`LgIWMd1p<;6aq7g
+%#]4\[_m/oZ_L[.8p3,_Z^;&F\97bsVm#PJuGJVJ9eb+CF"_VGCfX52n:XR.cUQ3?_M5`q8?<bMaM_*.MEj=HhN^d;heA^a;NB?j^
+%V,1o:1i1(.]R1^6])!<R_Sd6,44F%Q%.aS^hrZ+DAJ*j=QOVc%1gm_Gs%t,6_DtG%\bHu5HY1pE/!"[$[R*LYAH71=E at L-*5'7p.
+%P$7[f;rL!%SK;6+5Uqe2o-G/W0)1:MP$%^2U\M_$n7+0?@uh<mKeYDD#VF0gJ7Usm)h^eO.-OL,6Nrh"nYSuB5W;2%OG)+1I*.L-
+%B&]N[dAk5Ng$SNBMj.;iAC7VC.2pp*[;+\5Gl_JO_T)+E/o0#46eZ&0c&1YP at 20MG+#uq_.oSD-MZD'-'sPV`<De*/V'Pbb\ho@\
+%5+?g$4:3BoHqDYB)U1T@]@^,PfDOSFJJc?)C&T,'kof(=(;a\&M*9IFrGW+).8!iE6rkCVTZLee,.?F79APlOBZRlIHVI28@`,Lf
+%ar_f]d#t!NQsGOr2,<LZmEI_t5rG?E8fsQ[jP4.qh14&0mDbjlbk%P(SpleNe?U`<V5Xo#-gi.jB#eP!liGPKA<%r2DD5,>8_"P=
+%65)42.aoH76t(lTb52IMcQq,7Da%lkc0 at .AN[LA=gDmBjj.M^:pK'D at 7$<f%%XYDQeo(40H&7IbbTf6U0&&VF5t6KSp#?uaCmc2?
+%0?9Kn0PmrKlqV at 3]GoOW(@*?FB&^(LgBER>j&'t?_K4r>/O".%L7aL%j>/Vi=DEu;bO0cQmJAmE%\c)X(KNZkRB2Zd#4(S!+jHuU
+%MIfRiHKK;W at U?4TB"?jiZ*H038'Zu".\]74/$9$>)=eiW/oRn0^gXOAJjt$ale$:7PqYD>0T"WZ>3eclcSr;nBKc;[XRbB,@=,Dk
+%ZGh,fBmb/P8@*S]I/Kb/O>[A,5^Ma#mE+EF=OA"Bl+bVa")DhOP.WnXE9ajU at Gna?"E(I^@h1g>(JcEP15_+HbBJ.o8<%+Go[6.7
+%f$a3W;G0%*kgG\\onGiL;?OX\.Eaq1bmq':4nmg]\81oMX&i6hVB5.Z4.n(ebKG*2Y7LJ+e_?nM=2M+p?._QG2U(Z0Yd)UP8:/js
+%79T)sD.Eb?c?:W]3.;&$R&MIC:L;rF?U'Q at EPHk[>^*SMp!KVqD#68A#b+NRI![Fr.2q%105M,EmGk]DL4SRD$MVltWD3[<H)0u(
+%a(%j$EU$Q8S3JeLCp$"7G%7b at AWFFR_COG3N#eaU/UA[=chHi5&[2%hWuOi.7bJ\5+IOS<2)2`1<aIO='lGOM\Z<kc#1(To5/(]:
+%r:5Hk:.\+9Reg$3=n at LGmstMLd0$?mS.U"2PTI*@Yf2F1=Ro]tE\$MfHOuiNV(kL*dqa0=rP<e=d3Af7?s[X[f=*Rr\.![&X(b6_
+%9)O)f<J?,ibaO/+jo=T@=mM#*i3S']k%]*WFLF=>o$Yp$-\VQs$M^!f@?>I$\b"."c6#7kqjA0OScsChB!oAh8t:E]5W+MsQ(us.
+%(V%r6HO,q9=dtY*5J"HZ?_9Fq%e8f.=RD.&A7*u;/(BS`EJK`Y?g\!&fE#^._.^p'*fm3sWGpA[=,,Ng.5f5p=jaG]"]8]L`3;c$
+%h>=*ml2quBd-JN:\IWbpNP8+D*$3j$CQCW`[W/D_KUK[A;_q&/:"T,J>,3[tV?am4^n!(N1N;Qt_=$CimYhhAEU(hp,E,"Jjl^W*
+%((T-mE283ilCa/AhO/(/dN<RKK6h9 at 8(YUXiLk?l3jJ^tZ(6='i30&\O4_B)Cts:.rgou+rEeZhFd-?r/e9jqSaL2'g^eAe-<bkB
+%ED);>bI+K^^:XQU'^j7+4;W37'aM'8T:+Q2="-MZ_T at C_OJYn\Z>6Y`/2*"Nh;VBe$YR_LbM(J.5kaYIb#d'Ui:Xo7#bpLo2b"U<
+%4hU&4m&IQ^*2l%Zqf/hMmVobN<R1!F4gOda)k",;8^:LLGs"kc>IW>(dIfeP\C0XNqL`3L[>%Pm>?LMEf`eicpj/B)X%VhmQdo4X
+%()G0LYd!Wik(2>>2o0T4!&<B_gL1jYGJbAH/$0WnGP#'\*eTXAW2ne=X`!j[+[pSNP\U7k?.^.!DiS"f0]RNK2([FleAZCVoT6 at g
+%%mAP#\@(O_#'Yl%D<RC0XGYF%lb2E%5.(4#NChhRjs[-V7&]8 at p.BK=3;%+ReE1EUS!VFf+qC at t=uZ;NFBo8!1rOtnmW8I@]lh$E
+%Dm+;\%-Z>"!tJ`\F[%\9 at aPXl2Df_:;7b6FXbXFlrQ8aSn(eBS\EK(J@<\J.][L^,mW=6MT]VIdb)C8a;0ggL5/%nhG'(39^3cd4
+%NrsS]pFr)(^4lkrG03)3CP29M<c8F/0\GTK\uGBm"dsScKGO80fLrfN9sT)L7HAjnDKeXc?Ff=-W`pr(1ibU\5WsT;c17QM.pUHI
+%YOT%`RW_`EnEa:ChSdjo6KtC]E3FuTiN)"<U"@(BMb[tf?\O!5$n+RTc%Y,a`nP'C^mX9kU0Cp6Zh2>(Mtl%GbjfO_d2519a51,#
+%psLB7YFPt9L)tG4[=!5"Y$3:GEb0XS\oIm[\Nq*%i9ur_O>8!a+r^Bm\k.Ni5C2^brn[6OQT)*dN'>T\^HWgCr[iNk'Yj\5H2RG/
+%r:^klT.^bnBO<ns]sFgkB@<8,]_t8)%VT-n7_4)GLJN!SFnfHM=)K2K(VoK'r;S+/^!]D#qT)rf't!t\>?=!%>'0,[6iQJq"j$.V
+%m!.j]MiB_GD9GmrfbD`VR$;GgkfO'mI-cRSeQ4D?i%ssTKT5mD/-uQqrPhp^`k/7Y$5Bma[!.A*>Sq2DQO=b2o"i4&*@MDilfCa(
+%^6P:l$[ENRQ]LWdXd<<ASX$I&<X!rnlK?Lco([$9gK=>7N?/6u\?Rl%c.+Kgk^bU.pfqBlmji@'6:O$0baIin;-B.ThE`Zmi7d?q
+%0#NL9dc8e%7%B)P7]LM!K84AURVEi&1/1\M'_3g)+$\o:Pfgd8`%(7D<^2)2Q_u:8o(qCe:8:<8VQ!O,O/Ih]Wbc`%,7t-\<%a.U
+%I)ng`<7U&#.R,hSno8IkA!o#QW=&R]`^V_s4?[K#laINP)(Dm];U6B*0kT2^Vha*61hp at YgYI<GCJDKt'o)+"62.jsr^o>5CNRiZ
+%3p.DE_)8g?20td.oJE_u3S3JbC\.b]kQ]Z&EN[[uY0h=#V@!^@%-u_"1MbXO\L4t"n/O<^RTo%Mc9c2UW-DX&M^Gp5Q??L1QE`<=
+%d4i8!?OjAM)/2 at 7Y`N at mif!q8K-cOmU?UbnkGjds$5BL2hSo\GbUo0HWj4t";3.:=2VVo/<"tfbdC7Dcr_As\;D"F:"iEB(TjJ;X
+%gnM@:hSQ]9S0>o at +Zi!)(U2A_';d=Mlr;[FFt+G0=&,1AZG?aM,2nd][Z$bL1Vlh_DUbGZ]M1?=A1#rCZ>Z9_rLLr'7di&n6%uq@
+%-Y&Y;ADG*c"iA3F,YAuc7$I/#(!.0.[q5/Ab)(C!VGWDBni"s1;`QR.PC;ajl0l!)dUqH#D/VQd=S(VqY'F^>Jr/AkL![\O06a5o
+%jrs)7]3rm&OuHK!*<"p!$*q?+)^J$bQ:)CPMA6HL`OBE[)$GS3f$n9+SoW!.b!qle"D^d+XYZfgdob'PB$K_f;sb at +k4X&U04rJr
+%<EQ:jXJqITa^$QTgD<NOMjV[`@4jdd>e\$ZIL:/l#'9T3k42H<b>0m[D_RNM_Hagk>^hjH-MuA^dbcLtV$k%o\[HQbT2PLQc75qq
+%A'VI0j)YEXnaX^LE>12IO*.IYV^&l,c'_VOpmgTCSua;:db>Bd[](+9ZUWh5;u/RmcCg32]UrlNpoN3#qUHp/#hJ?NKfK(D]'N,T
+%nq+btHPJl6"%2F0f6,L%Ffd!84V/t8.T$iQ-(==:X at Uu'^+JO at H@jc!jL$V8A1MHdMO5lNbq>Ht5"S+Js4L*`YGoA*$7;h_pO#fL
+%KZ.0EL".g-FeJmlm"s:SW93X`8;<uo6<RNGLCEE"_Mu[*0N2QI6:2,RAUjE-VQf0JI;KZ^N<Nt^NDj[.a6]#E]?5opS1DJ25^:9[
+%e#E7T[T+iF3#3q"[j<p4I++Zj#>Ak*e2gu0^ME.cW at +bKVM*Gl?6u=sS$FI)jb%76kqfC4e$Ge=kP@!8!*nMhV<Y^Pc`4bk=oJ8d
+%?65_uD&[DCVpV7g`sM=Y5$J1uCA-"(+N'SJ!ngC+&SFEEoC>2SL at gm6qXN7;nYc5)X$@ZiXGkK*^^jTHr0^l_VRXe7c`I6^PSqrW
+%pJq=_BkA)NUEN#BXJhMQ&,AacQ%&G.*ui>G.Zd+TQ17ulpq_rLA9rNIerJ@#-Ur-J<<,O0^T7L at 9CAcZ^d*,<dOG7OmOkUC4N;[c
+%fBA`?FNuaiJnoI\C\0U<k\4:sF0<nNfB<ODd1*8+j'8>u>VjDM!&+e-.Wq6/m_)U#>Icg]g">FEfiYc?<ct2=@9hm:-rD\BBIl?E
+%MHI_hDbFQ<YnP`"@jeJ%)'sXaj>Aqt'V!pk-9#U:[u=d7e[QrFmTs*$9TU=ifIDFMhVAXtKWV,f::cs'VhY&l9Mr*`L+4fU,b,M)
+%QEcY)'C=5Y*LS@#.+>\?V2A`g9p;+pC"(^+mBMc[/)95KWM]@.-p'.ZC=7El;:<Ob8aB*N8>\X0XZ&^D=Dpl#@q2D"F\G1"P:DI7
+%DH^rsZt],2/@ODO:QJA>HYXA3(@J#!!*ct"<WR<mfpu-Y'MX3[\E$AgAhe#(as`*LMFiG#W^sY&BH!sG0k%:A`MC="UL\;41g$T3
+%@^DO.Ws3DZCV%Kd\NN]fp/hWW/_j""J>nESYR24+Kt5taF1DKr\LGba)U.:iREJ<5/iUmWY/+@\$?N`^F1Fm)Rd=6k8q3`nQX?\"
+%hTg7l9'*ZIX6QRZeC85BcK`FF>u*KBl\6r%/!B.qS!m5Od#?;=T at B*;Pk6juW@:OV`F_%dV%).c3CBk(*o9]8 at e!U/Xn<(+DL6+5
+%^b5)P<<0YDQW=.Ro'WR\TOXGOF\kDanN%6$q'r.-m`T:fUT(!/lZJECCHoZ$FlQY,:V$DRN at SJ>..V[IL"GYX=To3`q#-RW!3UoP
+%Muk+=C2La7TU)]/8].U/jjL\95mcsfHBq8*:1[cOGAh:!E%A?)G.Y-g^qcr#g"E,:7a2e[_oKGoc&#k"W_1*h^bF$1ai"'k29mC`
+%/AVK1-bCp3+gjqoIj0JTcYk;hEfH8>N@#21o7n+o2o5cFQ8D73"FVk.T<\-&fi8M1<H^GUCV3jfWXaUnka'TQV:=HI]_6X9+N+C5
+%8(A1pCa_g[(INMGEp9m.GXYS_$*2M59san.=lXXP3>5#d#9S$BAoIKV'fXf5HU+>qYO^,ScuL*VU>Y6lV3rA2c)0VqQ*>r*M=b+Y
+%V-67r<*#IADbESM(FkU at ZBQkZ<UaMGb3et8R\,Jt)%I"S_6F+iU"0_HAb;'X9B[ZZ)/$,$R*5Icb/P&H#8fdVUZZ?PP_qL1Nu-6k
+%Bf(4Chl(<?-1JJ^L+#b1=sC)+S"4Q)!D]E[Zi0gTq6Z-X;M0S/0_q1O/\Ru3_CYIs"teBXW,DlWA(iPMGc"+mDdT!=M4VA'C=m=r
+%T=Y/5>iEF2L,-G-#hQ?+[>iRQZSU;TFs4R5EA%>o*+8?D/b80NcN)!DiaTV;Is&(^lCGFKKEQncL&JhqI66mP?L^:6mDd at qch6\U
+%$N+41$Z"Sbhs>6mc+4\a!cN\D<n<7-GBI,l%TaNO0$5clCiU'U,C>(%[[R^^aTof_.0UR2p"nDg?81h=28\>W=WGa%bpSV'nH?G9
+%1kX%mObB8>7?+O*Q17tV+h/]^T"YDg+8 at f\)us#CGrVJ`Ea_\0rigaMJp-$jiYGOnO]E9/"9tUO"VhG]*;8';XX'Sq;h:i;T[ZD-
+%@Omt9PJb>*0!q^5-q[;pLY^<lPR:A!/cmGU=cY`^W[t87B&O<=@c99$#?9 at +TcQC6-i;\e2 at t9-R6L*Tmuef(aM8%31^LUGN/C(X
+%)#,4peda:6,lsud'gWJ5d&<m*?H442Znb0$;01_^&P_4V6.i*?$I>[Ym?_6C%Ae%h#H[R/7Tp*#J7:-U/:\&V3CDN+b#W'Ie?uT&
+%oXaN&[`iOV!XB%:XN2l-I77dejU6]-;L"lMo0u`1.'*h'JjXApc;:I>:nHAphX/UqZ'[KD:ro:J\qY*U6%VHN[)9G;SL;4k2fJ2Z
+%JLlqJnX+nT=ppLP,7aupNE7*s.<D0'/]-)gp(Dc?Jg<_8CLHTp&M;E4ldd+(90jI#NKnjl.PQb_.1Cp'cj?d(9Krh^Ybcr@:7sS(
+%rsZ[;as+h$!]gZDM6Gu+%oGAa$J.rgNY64U:m3(bp-b6/;he^5bD.Qi=jjMZQ7#6.r3=Cri`0b1<nglN:D.:Om%H$GL*17SNLqZY
+%Suj/iL*upf=hucr%M&D/$56c%dfBF.=G8(M:BFI&@o[duQB6=lmL=;MBb&%(VQhn/;I5`JdZlBG_IC?1^_F[>>4X?[`l?qs(FXE_
+%Og/>A/@?.L:DaY$`N6&\^uIOPIZW?m/R-J;GG^A=gqbY\Kb7_bnTL]'2 at 4XLC:*?\b3A^hY96JppS__%^c&.E%_GhC=HnLi%Dm8H
+%A"C>e`=Q?l4W9G:Y7Fi'E5E`'*A!78dgC12Wl(nTZCfKCJDmbb#QS8*5XN!j&lN[Sg7krg8X]WO?tX^m&8Z%f_pVT.TS-Mtlf:?c
+%/.o>dYc!'67F;^$entj:?]@6nV at CK!EJNZ@@3!.\9=^Lor*bkErB]K:+RFah2L:U,a]aQ,%+YFS$fH2@?sXkUAlBCcHRQNr6Fc,V
+%GkC"@L.].`:2<AG6)d&qk[Fe!!C&ub10&._<TonWgHnJ1<bk&i%r]tY5!]E1*bkmK4Kq1e@;r8dA87:79i9==L/LIV(FX<W$C&t"
+%jq6t)A=kq^`W=-YHj7lV0Fs!>Hh:eEB(sHPh<P0?`6F;8*IokN)iWLGmX"X8TNiV7A<=B@%:02F4;8ksHM$G0kE[1bs5f!h-i~>
+%AI9_PrivateDataEnd
diff --git a/documentation/figures/rna_elements.pdf b/documentation/figures/rna_elements.pdf
new file mode 100644
index 0000000..e3654a7
Binary files /dev/null and b/documentation/figures/rna_elements.pdf differ
diff --git a/documentation/figures/rnaseP-bsu-alignment.ai b/documentation/figures/rnaseP-bsu-alignment.ai
new file mode 100644
index 0000000..013f684
--- /dev/null
+++ b/documentation/figures/rnaseP-bsu-alignment.ai
@@ -0,0 +1,592 @@
+%PDF-1.4
%����
+1 0 obj
<<
/Type /Catalog
/Pages 2 0 R
/Metadata 31 0 R
>>
endobj
2 0 obj
<<
/Type /Pages
/Kids [ 5 0 R ]
/Count 1
>>
endobj
3 0 obj
<<
/ModDate (D:20030327114710-06'00')
/CreationDate (D:20030327114707-05'00')
/Producer (Adobe PDF library 5.00)
/Creator (Adobe Illustrator 10.0)
>>
endobj
5 0 obj
<<
/Type /Page
/MediaBox [ 0 0 612 792 ]
/Parent 2 0 R
/PieceInfo << /Illustrator 7 0 R >>
/LastModified (D:20030327114707-05'00')
/ArtBox [ 115.56201 306.38086 497.55957 661.31592 ]
/Group 24 0 R
/Thumb 25 0 R
/Contents 27 0 R
/Resources << /ColorSpace << /CS0 20 0 R /CS1 21 0 R >> /Font << /T1_0 22 0 R >>
/ProcSet [ /PDF /Text ] >>
>>
endobj
7 0 obj
<<
/Private 8 0 R
/LastModified (D:20030327114707-05'00')
>>
endobj
8 0 obj
<<
/CreatorVersion 10
/ContainerVersion 9
/RoundtripVersion 10
/Options 9 0 R
/AIMetaData 10 0 R
/AIPrivateData1 11 0 R
/AIPrivateData2 12 0 R
/AIPrivateData3 14 0 R
/AIPrivateData4 16 0 R
/AIPrivateData5 18 0 R
/NumBlock 5
>>
endobj
9 0 obj
<<
/OptionSet 3
/Compatibility 5
/EmbedFonts true
/SubsetFontsBelow true
/SubsetFontsRatio 100
/Thumbnail false
/EmbedICCProfile true
/cCompression true
/cCompKind 3
/cCompQuality 2
/cResolution false
/cRes 300
/gCompression true
/gCompKind 3
/gCompQuality 2
/gResolution false
/gRes 300
/mCompression true
/mCompKind 3
/mResolution false
/mRes 1200
/CompressArt true
>>
endobj
10 0 obj
<< /Length 1618 >>
stream
+%!PS-Adobe-3.0
+%%Creator: Adobe Illustrator(R) 10.0
+%%AI8_CreatorVersion: 10.0
+%%For: (Sean R Eddy) (Washington University)
+%%Title: (E:\\src\\infernal\\documentation\\userguide\\Figures\\rnaseP-bsu-alignment.ai)
+%%CreationDate: 3/27/03 11:47 AM
+%%BoundingBox: 115 306 498 662
+%%HiResBoundingBox: 115.562 306.3809 497.5596 661.3159
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%AI5_FileFormat 6.0
+%AI3_ColorUsage: Color
+%AI7_ImageSettings: 0
+%%RGBCustomColor: 0.0039 0.5765 0.4667 (Aqua)
+%%+ 0.0392 0.3137 0.6314 (Blue)
+%%+ 0.502 0.4823 0.5333 (Blue Gray)
+%%+ 0.2078 0.6667 0.8039 (Blue Sky)
+%%+ 0.498 0.1176 0.0078 (Brown)
+%%+ 0.0588 0.0667 0.4667 (Dark Blue)
+%%+ 0 0.2392 0.098 (Forest Green)
+%%+ 0.949 0.7804 0.0667 (Gold)
+%%+ 0.251 0.6157 0.1529 (Grass Green)
+%%+ 1 0.549 0 (Orange)
+%%+ 0.851 0 0 (Red)
+%%+ 0.549 0.0941 0.5333 (Violet)
+%%RGBProcessColor: 0 0 0 ([Registration])
+%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set)
+%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1
+%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 ()
+%AI3_TemplateBox: 306 396 306 396
+%AI3_TileBox: 18 20 594 776
+%AI3_DocumentPreview: None
+%AI5_ArtSize: 612 792
+%AI5_RulerUnits: 2
+%AI9_ColorModel: 1
+%AI5_ArtFlags: 1 1 1 1 0 1 1 0 0
+%AI5_TargetResolution: 72
+%AI5_NumLayers: 1
+%AI9_OpenToView: -90 624 2 1578 916 18 0 1 10 73 0 0 1 1 1 0
+%AI5_OpenViewLayers: 7
+%%PageOrigin:18 20
+%%AI3_PaperRect:-18 776 594 -16
+%%AI3_Margin:18 -16 -18 16
+%AI7_GridSettings: 80 5 80 5 1 0 0.7529 0.7529 0.7529 0.8765 0.8765 0.8765
+%AI9_Flatten: 1
+%%EndComments
+endstream
endobj
11 0 obj
<< /Length 11690 >>
stream
+%%BoundingBox: 115 306 498 662
+%%HiResBoundingBox: 115.562 306.3809 497.5596 661.3159
+%AI7_Thumbnail: 128 120 8
+%%BeginData: 10982 Hex Bytes
+%0000330000660000990000CC0033000033330033660033990033CC0033FF
+%0066000066330066660066990066CC0066FF009900009933009966009999
+%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
+%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
+%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
+%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
+%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
+%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
+%6666006666336666666666996666CC6666FF669900669933669966669999
+%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
+%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
+%9933009933339933669933999933CC9933FF996600996633996666996699
+%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
+%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
+%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
+%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
+%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
+%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
+%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
+%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
+%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
+%000011111111220000002200000022222222440000004400000044444444
+%550000005500000055555555770000007700000077777777880000008800
+%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
+%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
+%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
+%524C45FD5CFFA852A8A852FD28FFA852A852A8FD44FF7DA8FD08FFA87D7D
+%7D52FD28FF7D7DA87D7DFD41FF7D52A87D52FD07FF52A8FD0CFF52FD08FF
+%A8A87DFD12FF7D52FD46FF5227A827527DFF527D527DFF5252FFFFFFA852
+%FD07FFFD057D27FF527DF8A852FD12FF7D52FD04FF5252FD30FFA87DFF7D
+%52FF52A8FD09FF52FF52A8FFFF7D7D7D52FFFF7DFFFFFF7D52FD07FF7DFF
+%52FFFF7DFF7DFF7DFF7DFD18FF5252FF52FD2CFF527DA852A85252FF5252
+%FF52FD0BFFA852FFFFFFA827FF7DFD0CFFFD047DA852FF52FF52A852FD13
+%FF7D7DFFFF7DA8FF5252FD2CFF527DFD08FF5252FD09FF7DA87D52FFA87D
+%FFA8FFFF7D7DA852FD08FF7DFD09FFA87DFD13FF527D7D7DA8FFA8A8FF7D
+%52FF52A8FD24FF7D527DFD0CFF5227FFFFA852FF527D527DFFA87DFF7DFF
+%5252FF527D7D52FD29FFA87DFFFF7DFFFF7D52FF527D7D7DFD23FF527DFD
+%0CFF5252FFFFA87DA8527DFF7DFFFF7DFF7D527D52FD30FF527DFFA8F8FD
+%05FF527DFD21FF7D52FD10FF7D52FD04FF52FF7DFFFF527D5252FD32FF52
+%5252A8FD10FF7D27FD17FF527DFD10FF7D52FFFF52FF7DFFA8527D527DFD
+%35FFA8527DFD06FF7D527D5227FFFFFF527D5252FFA852FD12FFCABCCAFD
+%13FF7DFF7DFFFF527D527DFD41FF527D5252FFFFFF527DFFFFFF7D525252
+%FD10FFCAC3C3FD13FF7DFF5252FF527DFD3AFF527DFD07FF7DFFFFFFA852
+%A8FD07FF5252FD26FFA8527D52FD3DFF7D52FD06FFA8A8FF52FF7D7DA8FD
+%09FF527DFD0EFFBCCAFD14FF7D52FD41FF52A8FFFFFF5252FFA8A8FF7DFD
+%0BFF7D52FD0EFFBC9AFD14FF5227FD41FF527DFF7D7D527D527DFFFF7DFD
+%1BFFBCFD15FF5252FD44FF527DFFFF52527D27FD0DFF52A8FD0DFFC3BCFD
+%60FF5252FD0DFF5252FD23FF527DFD43FF27A8FD1BFFCABCCAFD06FFBCFD
+%14FF7D52FD42FF5252527DFD05FF7DA8FD0CFF7D7DFD05FFCAC3C3FFFFFF
+%A8FFC3C2FD58FF7DFFFF2752FD04FF527DFD0CFF525252FFFFFFBCC3FFCA
+%BCFFA8277DFFC3C3FD12FF5252FD45FF522727FF52FFFFFF52A8FD09FFA8
+%7DFFA87D7D7DA8BCC3FFC3BC52F8A852FFCAC3FD12FF7D52FD46FF7D7DA8
+%52FFFFFF5252FD08FF527DFFFF7DFFA852A8FD04FF7D277D52FFC2CAFF7D
+%FD0FFF7D527DFD48FFA87D7DFD05FFA852FD04FF52FF527DFFA8A8FFA8FF
+%7D7DFFFFBCCAA852FFFFBCC3FFFF52FD0FFF527DFD50FF7D52FF52A85252
+%FFFF7D527DFF7DA8FF7D52FFFFBCC2FFC3BCC3FFFF7DFFCABCCAFD0BFF7D
+%7DFD55FF5252FD05FF525252A8FFFF7DFFFFFFBCFFFFFFBCC3FFFF7DC3BC
+%C3C3A87DA852A8A87DFFFF52FF527DFD5DFFA8527DFFA8A8FFFFBCBCFFC3
+%BCFFFF27A8FF9ABCFFFF7D7D7D527DA852A85252FD63FF52A8FD06FFBCC3
+%FFFFA8C3C3FD71FF5252FD04FFC3B5FFFF52FFFFC3BCFD72FFA87DFFFFFF
+%BCBCA8FFA8CABCFFFFFFBCFD5BFFA852A8FD12FF7D7DA8FD04FF7DA8FFBC
+%BCFFFFBCBCFD59FFA852A87D7DFF52A8527D52A8FD0DFF7D27FD04FFCAC3
+%FFFFFFBCFD5BFF7D52FFFFFF5252A87D52527DA852FF527D7D527D7D7DFF
+%FFFF5252A87DA8FFC3C3CAFFBCBCFD61FF7DFFA8FFFFFF7D7DA8527DFF52
+%7D527DFFFF5252FFFFA8A1C3FFFFFF2727A852277DFD58FF7D52FFFFFFA8
+%A8FF7DFF27A8FF7DFFA8FFFFA8FFFFFF52A85252FF7DFFC3C3CA7D522727
+%FF272727FD58FF7D52FD06FF7DFFA8FFA8A8FF7DFFFF7DFFFFFF527DFFFF
+%FFA8A1C3FF52F85227FFA827277DFD5AFF7D52FF527D527D527D7D527DFF
+%A8FFA8FFFFFF52FD06FFCABCFD64FF527DFF52FD047D52FF527DA852A87D
+%A8FFFF7DFD0DFF52A8FD46FF52A8FD0AFF7D52FD10FFA8FD04FF7D52A852
+%A85252FD08FFC3C3FFC3BCFD0452A8FD44FF7DFF52A87D527D52FF7D7D7D
+%527DFD10FF52275252FD06FF7D52FD08FFCAC3FFBCC37DFF7D52FD06FFA8
+%275252FD0EFFF87D277DA8FFFFFF52A8A852FD21FF52FF527DFF7DA87DFF
+%7DFF7D527DFD10FF277D5252FD10FF7DFFFFFFC3C3CA7DFD08FFF82752FD
+%0EFFF8525252FFFF7D7D52527D52FF527DFD1EFF7DFF7DA87D52527DFF52
+%FF7D7D52FD11FFA8A8FD08FF5252FD06FFA8FD04FFCAC3CABCCAFD06FFA8
+%27A827FD0EFF27FF277D7DFF527DFD05FF7D52FD1EFF52A8FD0BFF52FD1B
+%FF5252A87DFFFFFF5252FD04FFA8FFCAC2A1C3C3CA9ACABCC3C3BCC3CA9A
+%C3B5FFCABCFFC2C3FFBCCA52A8FD047DA8FD09FF527DFD44FF7D27FFFF7D
+%7D7DFF7D52FD04FF52FD04FFBCC3CAFD04C3FFBCC3C3C3BCC2FFC3BCFFBC
+%C3FFC2C37D7DA87D7D7DFD0AFF527DFD44FF5252A8FFFFA852FFFFFF527D
+%5252FFFF52FFA8FFFFFFA8FD07FFA8FFA8FD26FF52FD08FF7DA852FD28FF
+%272752FFA852FFFF7DA87DFD04FF527D7D52A852FFFF7DA8FFFFA8FFFFA8
+%FF7DFFFFA8FFA8FD09FFA8FFFFA8FFA8FD0AFF7D52FD0BFF527D7DFF27FF
+%FF52527DA87DFD27FFA852277DFF7D527DA8FF7D7DA8FD07FF7D7DA8FFA8
+%FFFFFFA8FFFFA8FFA8FFFFA8FFA8FD09FF7DFFFFA8FFA8FD0AFF7D52FD0B
+%FF7D277D7D52FFFF527D52FF52FD27FF5252FFFF7D7DFFFFA87D7DFD0CFF
+%7D7DFFFFFFC3CAC3BCCAC3FFC3C3CAC3FD09FF7D27A8527D52A8FD09FF7D
+%7DFD0BFF7D7D7DA827FFFF7D7D7DA87DFD28FF5252FF527D7DFFFF7D52FD
+%09FF527DFF527DFFFFFFBCC3BCBCC3C3CAC3BCCABCFD09FF5252A87D5252
+%7DFD09FF527DFD0BFF52FD0AFF52FD29FFA852FFFFFF7DFF52FD07FFA852
+%7D527DFD11FF7DA8FD0EFF52A8FD05FF7D27FD42FF7D7DA8A8FFFF5252FD
+%07FFA8527DFD04FF527DFFFFFFC3C3FD06FFCABCCA7DFD07FF5252FD05FF
+%52527D52A852A85252FD09FF5227FD36FFA8527DFF7D5252A8FD0DFF7D7D
+%7D52FFA8FFBCC3FD06FFCAC3C3A8FD07FF7D52FD07FF7D52A87D7DFD09FF
+%52FF5252FF7D52FD31FF527DFF527DFFFFA8527DFD08FF7D52FFFFFF527D
+%FD10FF7DFD1CFF7D7D5252FFFFFF5252A852FD2DFF52A8527DFFFFFF7D7D
+%7DA8FD09FF527DA8527DFFFF7D27FFA8FFBCFD07FFC3C3FFA8FD08FF52FD
+%05FFF852277DA8FF27FD07FF527DFD07FF7D52FD2DFF5252FD07FF527DFD
+%0BFFA8527DFFFF5252FFFFFFC29AFD06FFC39AFF7DFD07FF5252FD05FFF8
+%522752FFFF27FD05FF527DFD0BFFA852FD46FF7D7DFFFFCABCCAFD06FFCA
+%C3FFA8FD0EFF27FF277D7D7D27FD05FF527DFD0BFF7D52FD2AFF527DFD08
+%FF7D527DFD0FFF527DA8A8A8C3C3FD06FFC3BCFF7DFD08FF527D7DA8A852
+%FF527D527D7D7DA87D527D52FD39FF527DFD09FF527DFD0BFF522727FD11
+%FFA8FD08FF527D527DA87DA8527D7D52A87DFF527D7D52FD0EFF7D7DFD29
+%FFA852FD09FF527DFD0BFFA8FF52FF527DA8A8A1BCC3FD06FFCABCFF7DFD
+%0DFFA8FFA8FD07FFA8FD10FF7D52FD29FF7D52FD09FF527DFD0BFF527D27
+%FF7D7DFFFFFFBCC3C3C3FD04FFCAC3CAA8FD0AFFA8FFFFA8FFA8FFFFA8FF
+%A8FFFFA8A827FD0EFF7D7DFD41FF52277DFD08FFC3BCFD07FF7DFD0AFFA8
+%FFFFA8FFA8FFFFA8FD04FFA8FF7DFD0EFF7D52FD2BFF7DA8FD05FFA852FD
+%0DFF27F827FF7D52FFA8CABCCAFD06FFC3C3FF7DA8FD09FF52527D52A87D
+%7DFF52A852A8A8527D52A8FD3AFF527D527D7D527D7D52FD0DFFA8FFA8FF
+%527DFFFFCAC2A1FD04FFC3BCCA9AFF7DA8A8FD08FF5252A8527D527D5252
+%A8527D7D52A8527DFD0CFF7D7DFD2EFF7D52FF527DFD13FF7D27FFFFFFBC
+%FD05FFC3C2FFFFFFA8FD1AFF52A8FD0BFFA87DFD46FF5252A8A8A8C3BCFD
+%06FFCABCCA7DFFFFA8A8FD06FF7D7DFD0EFF5252FD0AFF7D7DFD46FF527D
+%FD05FFC3C3FD05FFCAC3C3A8FFFFFFA8FD06FF527DA87DFD0DFFA852A8FD
+%08FF527DFD46FF527DFD05FFC3BCFD08FF7DFD04FFA8FD07FFA852A852A8
+%5252FD08FFA8527D5227FF52A8FF527DFD56FFCAC2FFA8FD05FFA8FD04FF
+%7DFFA8FFFF527D7D52FF52FD09FF5252FF7D7DFF527DFD48FFA852FD04FF
+%CABCCAFD05FFC3BCFF7DFD06FFCABCFFFFA8FF7DA8FF7DFFA8FF5252FF52
+%7D7D52FD54FF7D52FD04FFCAC3C3FD05FFCAC3FFA8FD06FFC3BCFFC3C3FF
+%A8FFA8A8FF7DFFFFA8FF527D7D52FD56FFC293FFBCCAFD07FFC39AFF7DFD
+%08FFA89AC3BCBC527DFFFFA8FF52FFA8A8FFFF7D527DFD54FFBCC3FFC2C3
+%FD09FFA8A8FD06FFCAC2CAA8FFC3BC7D52FF52FD05FFA8FFFFFF527DFD60
+%FFCABCFD09FFBCC3A8A8FD05FF52527D527D52FFFFFF527DFD61FFC3BCFD
+%0CFFA8A852527D7DFFFF7D527D52FF7D7D7D52FD05FF53FD66FF9ACAFFFF
+%7D27527D7D5252FD05FF527DFD06FF5354777EFD59FFCAC2CAFD08FFC3C3
+%FFFFA8A8FF7DFF5252FD0AFFA87EA8FFFFA253FD5AFFBCC3FD0CFF7DFD04
+%FFA87DFD0BFF537EFD04FF5354FD57FFC3C3CAFD08FFC3C3FFFFA8FD10FF
+%7E7EFD05FF7E53FD57FFCA9AC3FD08FFBCC3FFFF7DFD10FF7E53FD54FFA8
+%27F827FD15FFA8FD12FFA852FFFFFF7EA8FD13FF5252A8A87DFD08FF52FD
+%07FFA8527DA8275227A85252FD1CFFF85227FD06FFCABCFD09FFBCCAFFFF
+%7DFD0FFF5353FFFF7D7E4DFF537EFD13FFFD047D527D5227527D52A87D7D
+%527D27A87D7D7DFF277DFF52527D7D7D527DFD1AFFA827A827FD06FFC3BC
+%FD09FFC3C3FFFFA8FD0FFF7E53A8A8FF7878FD16FF52527D52527D52F852
+%52527D7D52277D27A87D27A8A852FFA8527D277D525227FD11FFBCCAFD1B
+%FFCA9ACAFFFF7DFD0DFF7E547EFFFF7D7E7EFD18FF5252FD04FFA8527DFD
+%07FF7DFFA8A87D7DFFFFFF7D7D527D7DFD0FFFBCBCFFC2C3FFBCCAC3C3CA
+%C3FFC3C3C3BCFFC3C3CAC3BCBCFD08FFCAC3C3FFFFA8FD0EFF53A87DFFFF
+%A97EFD18FF277D27A8527D7DA85252FD047D5227277D7DA87D7D52FFFF7D
+%52A85252FD0FFFC3BCFD04FFBCC2BCC3CAC2CABCC3BCBCFFBCC3C3BCC3BC
+%FD0BFFA8F85227FD0CFF53FFFFA87D7EA8FD18FF527D2752527D5252527D
+%52FD057D527DFD04527D7DFFFF5252527D52FD0EFFC3C3FD05FFA8FFA8FF
+%FFA8FFA8FFFFA8A852FFA8FFFFA8FD09FFC3C3FFF87DF8FD0BFF7E7EFFA8
+%FFFF787EFD45FFA1BCFD05FFA8FFA8FFFF7DFF7DFFFFA8A87DFFA8FFFF7D
+%FD09FFBCC3A827A8F87DFD05FF52277DFF5353FFFF527E53A8FF7E53FD44
+%FFC3C3FFFFFFC3C3FFBCCABCBCFFC3CAC3CAC3BCFFC3C3BCC3FD14FF5252
+%7D7DFF7E53FFFFFFA97E7EFF53A8FD44FFC3BCFFBCFFC3BCFFBCC2C3BCFF
+%BCC3BCC3BCBCFFBCC3C3BCFD08FFC3C2FFFFFF7DFD05FFA852A87DFF7EA8
+%FF7DA8FD06FF777EFD46FFC3C3FD14FFC3BCFD05FFC3C3FFFFFFA8FD05FF
+%5227FFFFFF537EFFFFA87EA8FD04FF7E53FD5CFF9ABCFD0AFF7DFD06FF52
+%52FF53FFFF52A8FF537EFD65FFBCFFA8A8CAC3CAFFFFA8FD08FF7E7EFFFF
+%FFA853A9FD05FF7E7EFD5FFFC3BCFFFFCABCC3FFFF7DFD0AFFA852FFA87E
+%7EA97EA853A97E54FD5FFFC3C3FFFFFFC3C3FFFFA8FD07FF7E7EFFFFFFA8
+%7E7EFFA27EA87E7EFD61FFBCC3A87DFFBCC3FFFF7DFD05FF7E54297E7DA8
+%FFFF537EFD67FFBCCAFFFFFFC3C3FFFFA8FD06FF78A2FFFF7DFF53FD69FF
+%BCC2A87DFFBCC3FFFF7DFD05FF53A9FF7DA8FF7E54FD64FF27277D52FD0A
+%FFA8FD05FF787EFFFFA853FD66FF2727527DFFC2C3A87DFF9AC3FFFF7DFD
+%07FFA8FFFF7E53FD0AFFA8FFFFA8FD08FFA8A8FD4DFF27A8527DFFBCC3FF
+%FFFFC3C3FFFFA8FFFFFFA953A9FFA87E7EA8FD04FF78A97E53FF537E53A9
+%FF7E537E7E7EA97EA954537EA8FD047EFD4DFFC3BCFFA8CABCCAFFFF7DFF
+%7E7EA87E7EA8FFFF537EFFFFFFA8537EFF7EFF7E7E7EFFFF7E7E77FF7E7E
+%777E7E7E777EFF7EFF7EFD3FFFF85252FD0BFFBCC37D7DCAC3C3FFFFA8FF
+%7E7EFFFFFF7DFF53A9FD04FFA854A87E78FF7E7E7EA9FF7E7E7EA87E7E7E
+%A87E787EA27E7EFF7EFD28FF52FD16FFF85227FD14FF7DFD08FF5453FD46
+%FF27FD17FF27FF27FD0AFFCABCCAA8A8CAC3CAFFFFA8FF7E7EFD4DFF527D
+%FD23FFCAC3C3FFFFCAC2CAFFFF7DFF537EA8FFFFFF7E7EFD48FFA852A8FF
+%7D527D7DFFBCFFFFFD04C3FFBCFFBCCAC3C3CABCC3C3C3FFC3C3BCFFFFC3
+%BCCABCCAFFFFC3C3CA7E537E7EFFFF7D7D78A2A253FD48FFA8527DFF527D
+%7D52FFC29AFFBCC3A1BCBCBCFFBCBCCA9ACABCC3A1BCFFBCA1C3BCFF9ABC
+%CAC2A1A87DCA9AFF5354537EA8FFFFFF537EFD59FFA8FFA8FFA8FD07FFA8
+%FFA8FFA8FFFFFFA8FD0AFFA8FFFF52FD5AFFF8A8FFA8FFA8FFA8FFFF7DFF
+%7DFFFFA8FFA8FFA8FFFFFFA8FD0AFF7DFFFFFF7E78A27E7EFFBCCAC3C3FD
+%3DFF7DFD15FFA8FFA8FFA8FD07FFA8FFA8FFA8FFFFFFA8FD0AFFA8FD04FF
+%53A2537EFFC3C3CAC3FFBCCAFD38FF7D7DFD12FFCA9ACACABC9AC3FFC39A
+%C3B5CA9AFFCABCFFC3BCBCC3FFBCC3FD0AFF7DFD0EFFBCBCFD38FF7D52FD
+%12FFCAC3C3C3BCCABCFFBCCABCC2CAC3CAC3BCFFBCC3BCCAFFC3C3FD0AFF
+%A8FD4AFF7D52FF527DC3C3CAFFBCCABCFFC3C3CAFFBCFD16FFC3C3FD0BFF
+%7DFD0FFFBCFD3AFF7D52FF527DCAC3FFC3C3CAC3CACAC3FFC3C3FD16FFBC
+%C3CABCFD09FFA8FD0EFFC3C3FD64FFC3BC7D7DA87DA87DA87DA87DA87DA8
+%7DA87DA87DA87D7DFFFFCABCFD67FF9AC3FFC3C3CAC3FFBCBCCAC2CAC3C3
+%FFBCCACAC3A8FFBCC3BCFD67FFC3BCFFBCC3C3C3CAC3BCFFBCC3C3BCFFBC
+%BCCAC2CABCBCFDFCFFFD1FFFFF
+%%EndData
+endstream
endobj
12 0 obj
<< /Filter [ /FlateDecode ] /Length 13 0 R >>
stream
+H��W�o��
���a�m">�WP�^{9t7A
{؞�@�GXY��{�_�!)ۊŶ@/���p~3��̐~����
]���^����ݻ�3��vW�c�u=�CgYgw�F��J�k�4I~2]_���~-��{S4�]����<8���_�f5�M��T_-d؞[�j�
�gW�E�-��y1]SԋE�.ǵi�b ���؛n5V�Y,�j5v�_,@�7���xQ�ժ��Eu�� �b 4$"D4��*��`%�vlJp+n�1
(�A�d�9��?Uw�?�d�X�K*�iqɘ� ��3eq���m�.M�'m�v�U�l!$���R���u�-��b�e���f ٟL��
ղ�k
���/�.���6��s��u���}4�4��G��fOyU8�u1�
���On��=�
6i?;�x�^��
�̻�{'�Q�� �!�``�3"�Ep��s�PE`��
+8�Qpף�
0d�#I��PJ�z�+�{!���p�]Jk�K�9��G�
�
�Yܵߚ�/LZ �xgӢ��
�ּ��A�L?�7�
��nZH�ԝ���8�˰�3k3��v���+¬���+��!$��-��
t:Q�)��8}���
�������AïwfU�
���s_�����~���
�Լc=�lR�q8�?7��
+�m7�
F 9yq�
�^��mj��o�� b�s�
�mǙ�Y�`֛z�+l[��xw"���e at P�T�[<T��Z�oW�Ƕ1S��n�����1 �"�n�M
���)�mij0s��u�h�x(���=��8��+vF>��[c;�l�lL��~r^^(�l�䷂ػ(�~:��Y�Z���
+�[(훮ZU͕
�O
�t[lLwg����!Z.j��>��
��
+a>���]U
څ���n���� }ט
Ӗ!~�`���dM��k{Z�k���
${ݮ���ĭ�����������v0=8U�@�p�_M�)�-<�5��AV��Ϟ]���X
�b�2�4�z��:Ƞ���
B̆�v싦
�E�6!\u��]��!��
1��2@��
'�:�M:���/=��
BӔp�f톡�KBI�f
�
��GF=�5a�����d�
+?���^V�A�o�%D�G�r�:�,�0��s�~1�sW �2�ɇ�v��tv�YWM� \��7RݴC��ݼ�&�\�`���u
�
+gn�-ȱ�om?BЪ�
�W��Y�
�GHj:^��cwږ���n�*u� ��E�
k瑔v��0��kQ�x��"�vi ����g��}|�~��n �Y�L.�������l���k/u�M\�d��2��~tA͍�x��
p�}�����M�
o�����nC�
�8?�Q����k�A�x4�j}Xx��n?�
]x��^I��Q�p�
��p㵛T�=��R���f&����p4�`��O�
�N"{\Y}�,�c���[��3�1[�<�`lw�ӓ��wN���Cw��j�O��dͲ��ʫ�i�(�?�~
�� �{��?N�&h[;=����ݘ�������)��p&�GX��ͣ����߈�^������7�r��������\��
+�A��E�e���
��}!�K��k5����9&A\��鯧'y�gy�'y��\�29�Y
�4'9�Q�gY�fIg:S��D�3�E�H�3��i��i�ƩNU*OOR��QJS��%y�%i�$q���D$<aI�Є$8Aq
gq'q
�X�21�Y
�4&1���չ�t�
k���Zh���4�Dc�T�2��D�J+���+x2(x at +���e&S��Xj�$�(���HRI$�H�"�HD,�PB
+xt&"AX ��<�1�\q�|`<��9��r���%,f�)&�`�11���P�GY�FIG:R��D�#E�H�#Ds�є&4��*
+>RA9e4�76��-��$#)IHL4QDA8a$"�� �9�p�
c��X`x��SL0��#��Dp (F4�F
�k�#�@�o �{�;�
6I�)r�{ȶ�+�.���g��8��{���!e�]�d�>���,MaS;�? uD�;��bF���(���-�7D���
���~@�)�h�������H�!1���FyDLjc�[-��KDG�����i�8��4�)�;�
Aye����r�]�iWvʕ�->�
+���F��ӓ��PG����^Kr�:��*��PE��]DQ�����5 Eiv�^���&q�
+�@7؞�Rc��l�ʆ=ش��Ȅ4�6Nl�
�m���g�������$*q~�@�+vC&6�ġ�r0D�E��Q)�8,b��$*���ruڳ����C�X��qbW�i�Ҫ*�Qg�
\(;4�
������Ү.b�}��������}`djc������Ğv7�n_f^ݺ`gj^Y�gƅ_ܶ�L��?��Mk���HT��S�> o�E�zZ�
~���i`O
�L�fc�&�e�����.;��͓��� �GM~��������1� N|7��·O���������L4<0=0?��M�������@~Î����
�'�;�3r��7�#�>�X��oHlp��=?�?P�p<P
8Q�����qM�N��%.Db%!c8����.P��/Y\,��aK<�8����c2���s�P�qS��Z����
;�$�J`��O 2���P}������L-�1��C#���H�L���Ȅ��^G�1����PK?v��S�{�c�ް.�C���/e�
+���ʼ�8*nsmA��.�tet�xa���^�+So��PP�J
�.��f������p�r*^�a,��
��p;�?|/Ch�U���\r�[F�f�{fH��Ԋ"5XL`]�T
8C�tW�7����6½|<C�R�(mC�
+����� 9 C�"�({C�
+�
3rCD~�
�$2_ �
+J�Y�a��
$!�d4C��*�jo�eFr�H0)o�2;�|@
g�
aӁݵ��;ig�H�H�����H쇝] �oT�D���qG�z����ʝ��H�nTf�Oj0Py
Ֆ����=���D�Djf��)��i�Xd���ڰTTl���#�
^��N�ʐ�<-�Cl#軀e&MM��-�O=�{�/�^0�H�}e��� ����� A���K4�l�� Z���hc��Q>�7f�d9R�J)�̏.&�o��=W_^�Z��H���2�����'�~K~[N�%0jc�s���Ao^�7
j�m�zVߓ�i�S�{�6$XͰ�L.a�~t���}7�製(�
?�?�9t
\�Þ�~�u
Z�M�7>q8s�����sG'��
�>?� �3ȧ��!�DZ��W�k���[[s�
��#��j$l4�L#؍���P�J��h ��h�V!f!v��2��J�H�F����4��nOy��8Q����,��P9N�
1
i��D�J�ɴ"1#�MZ�nb?hNՆ�8v�(j���'����?u|-be
f�"�>g0��"4s������܍:z�
�/-�d�;ڥc�q:6h�4SG�8h�����Q�2\�E���t-,�W�� w
�ʠ�ν���`0֝����X�?�mg��&��1�=u���,�l�a6���i�51?)�
,�L4G�i1���$F�i��E
gD>Mb\��Ï��@��F�H#J��̏��,�0k�թ�aX�h�����&�O1�� ��ĭO� m�
W�v������c#ٓ^-Wp�E�1<���G�
Cd6�3FZ
�c$�H��D���G2�+G�v!q�#�=F� ��(c�=Dv3 [...]
�L���:��^�������P�K�D<-���
��+�-uF�aR�L��7���ĉ:=
��9}��sN}���\�tu�"�=��E9Q�;h���Pd��U�
�5s)MaW���c�{���+aU���m6��'�;��Di�T�J8�珪r
z��#h��l%iL�� ƨ�,�!���*�&�!X��!O!Ъ��=(�88�e �X?hbE�9���H|5�C�Q�A�-Ls���� �/�mDF���A�AJ��H�jr!,Ir�.O&�'%�
i�3�b��!WE%�\hc��D��&�A���ؙ��b=��&FE�A
��U��W�G��94���6����ߋ��b�wN�M�r����g�9�M���ٝ/���IY�����
+T^.N�����C� #
+cB�Xc�H!�Jt#��چU#��ѯ�Vi��}L���W)����K�_�:�r���B Kǔ�pM��)�+7MTS�*a5
�r_�;97��Y9��.����.�T�<�G�0{���8;�c�x���A��9ȋr�|�ʃqpX�7���<X��҅5�E.��
kXW�i�jj%��VO*W ��D�"�HV�Ԇ;2�U&���/1 J.���b~�̔�07�Nɠ�H�dU&Wɱ�jqGз"-�q�$dnF3tf�^�e�ܿ^���
��
�fXL��{�A��t���/���� �I_�_����z.S�C6�\�a}4��p>����@6�)��dT0�S2(�
�#��^��\�XF�@8�o�r
+$�=�r�J�]OFz �;C��;�#W��w�t���D_����#��,���ʷ���l�Y3��K]�O.������8�uȶ�nV��X�6���Q̟�5SHx����i���zkZX�B��`��10&H����|�-FL��s�L�(�y�#��C����J
� ��W|ΆVx(נ[!�s׀]�/"�����x���۶۷߉훇�k�y_�e!��ՠ'�zp_�����[���
�z�}��ǫv_���h�� '�o�ot��@~�;�?�����y^~�0�O|.t�W�kP�s!�z����T�үW���)1������<v���o N��z����)!R�ړ�Y2����9
eB�̔Izʔ�ܝ9�eRo\v�,������
!�%�/vx�?9�_0H'x��Y�D\i�CU�U���v��jp��mCp������
�0��
�� .����^��
��3l.��R at F( wD28SC;��
3�� 9"#O䊊|��v�4�0#�GB
+�H#��"�44j at Z�w��wE�ِdv$�����<��f䞈����2�PA��HG
�, -�HM�)!Ee��r��V��0�,sF��_ ;IF"+Hf �a�����2]F�+�zٯ�v@�
w�′`��ձP�p,͕�jM\K��ʥe���\hd��Z?VPj�U�:.\��� ilcE��RՃ+*�ھh�Rߙ+Xd���״ݪ}p��cZե�k�̵/��Z��_u-r
I�]��0/������u����
?�b9��������ꏝYl�h��vuUFfdD/c8:
+�L#%��hT2��a��d;;dž茲���*��8�(K�8^��n�7L���,��
+?C�EÑHKC�xQb*T�k�|J�7B�0&ʽ�(E? m�-ĉ���I��H=*�`5�*`
*A#��reٲ�5���Y��1s�g�d�r�,"��eS��ϫe�rk�e~-�-ϖi�'�+���>{�}�?����``�o�.����B���4�n��u�+��
�͐+���14{�b�G���v �h���qt�
i���6�;G�]?8�c� �0m5`U�Wx%7�+��%\R�
�_���՛�7�wL�wUH�%�����
]�������D���"������Y{'�
~jB���'�X�-���5Z�
�W~��|����g�N�W7�W���'
�R�sۅN���P/?n�۞��ƟӇ�������ק?��|���T������/����K���돯_�>*!�A5��(:�>��s�=g�s�ZU�1ZH��$�M{��;4��Nj�Q$'�BփS��k�
�� ���?ۀ�[��фG
+�A��5aT[
�ޤV��-��(� ��K�VdW|&�v�u�^��z�ت-J~�����Z%�Z��
�\!f��
�uИ_1����@�Q�
TED5���?k�F��r�6a��d>������9 �V�Z���'�Go�)�E�������������b5�آ�
��I�P�j��j8�'q�R'th(����#}F���L��dh���E�1�*#�=��"���p�E�n:
pB��X8����5�(��c+��U��Q!�������zn���gn�������J
hVϪ�R�V��VK���:��C�z�ٞY3
+� X�S�2�g ���N��W� �hY����(8C:���f*-[@
+E
�� 1l��ǃ���� #���I�&@�B�AW��
;�\��a�n�B�f���y�G�<@6�tU�"
2I[���h*p�6_�G����J�`�e��I��ր�2c��/Q�Dd��R�`<�"G��(�z�Ϻ�s[Ƀ�r��&�H��\���+#����H{&��tƂ�������C%$��far�K
t��`�^]���,R�;��3zl@�u0# ���A+����&���B��:�j�����B��I�EG�03�
+� (Q���1lة����"$��P��
�
�U����15����ٚ|�r'��3co����D�fU�6�##{s���Q R�Y�b�F��"�=�2���g�2��1,���p�%�Ą2�n�t#(8�n����I�b��[0S�M�y��%�$mP�Gq�+�4k%�*�A�@-��bş*��=�}��ۗ�O��o/���������c��
�0�`�!R����
+�2A+Qo
@��5��
+���{U�Q3�(�թ�#ٟ�lyB�H�X$�����EM👅�+�0�2Hm�FRɳ�;�)�|Q�6�Z�\��Qu(� *-�<�(M�0�d�@C
�i�;���E��ũ32��]��-�b���Z�Cs�م!H¥a�$� 7
DL�d��}���@a�* Y_��"dB�dn�n�Ղ�3vڀ3v߀�(/�C�䶈،�Hi$�ERc�%�AB#Kf$P�d�D�X��J
Ց�9�Ej��و�З��k��(,��"R�Ƥ�T�
0m(��ӄ�-B���j$��&~v�s�h_���6��v���~YTߕ(�j#k�j�g��Qd�.����������U0*�U�\m�
R�D�q��0�^k����5���v3�6��\\��X$�&�ATD��4��
�2�����S~_���n��
�!���j�٠Ә+C�̆��8p
n��E�}̃����UڻR
��J���+�jى7uhY:I�S=Z��1��. ����S-�QRԤDRut�j����(U�ܢJ����dx��e�x��.�ʬ2��
�
+b�$�0�q
PK��2��p�TX��4�I�q WN2�A�ݠ!:p�L$�,< �5���=�6O���BJ0p'6'���WS��ܙ���I��r�y��#{�
� �{�A�kPJ�
0HV*.fJ�E���y�x�VXy��������n$�j�j
+k���&�M`��6�
��N�\j��6�-��K�ݺ����LCU������B�,n��b���2�5l���Vr�e��,�z�Y�U�:�L�цu'+�lv�B�`
�[����:��%
�QӞ�q��
+^�r���]�ML[�-L@
��;v�=&�f��O�9ER���VL[طǿ�������<z����˾�!�����n�r:�9���0��Y���O��g�,�O�`W�B�Sԇh<Lo�
���D��0�.�O�i���`�̈Ze��:]����iZ�b '��U�S�y�O�&���+ ϊI���Z�(K�#3k�`�k�"���,��"�1KmLR
�]�Q�c�Ɋi�B�ז��#
��BX<@��_�e��i�0+��%PG�� ��Y�8�;����Jj�<
��W�!����8�Sf¬A�=(��5HU|Z��j���Zy�Z~�\�y��^ NI>��Gr����I�kr$M��I�1k2p*`��Is at 3@�?��G���9?:�/����s|-V'��*���@��Ϣ=Q=g�yO{�S����Ug�:-�7���_
����g�6|M��|��8|�e�NL71߉e���>��!q{��7~?Gs'�M�7�6��:GÝo"[`�|��&�;��ĺV\����m��]u�����C�w��n�)�R��VU��c}Y���_�%�
�(����7����;�=Ī�/15��!Eު�悡k�`ݵ��ڞNǗ���k������{� k>�Q`O
���-S���s��<=�����������
��w?]~���ӿ�^�y���������r�>]~|����X���a��m7��K%kQ5��+�U�
+�W g�B�&��@�
&�L -.~� �<�K
�9�R��0����_v-zY�����Fj�[R�}��-�Uȅq�!�dq���oU��ZR�=����`�;����:��)�� Ӛ`^
LlS��ak
�ͦ��C��1�Z^�"��I�wU�a����:�'ܿ0�������i^L�'
��+&�.�
e�'w�.�1|j�'��^�Ie�O��R�,��5{�����b��Y_��s�zR>k���;=���5�%K
�a���S6�?1��Y�c�ю�*�ۦ���-�A�!
+j/Y�q�'w�iW������x.ї]b����q�'n��3|�T.T��O5�SM��n�%�
8C����n�&T��6
0�ʅ�R���Pc�)�f��I�+|��+_�Z��X1�I$��,�Y���Ҋ�i���گs%�pXq_��*�{��!�|����Ȼٹ�<
+�q�U�ٚ�վF'�qa��\�Y���ҦF
X���Ԁz����U��*Ժ�McIm at g}�
+�5«D�T�純�p��fCR۳���]�kyb�e�Cj��ͧ���BjK�
����1���-Oo>�]қ��
#%������3�G
��Ó��m�/����C;:ę�,��p���
"FԞ3�
+� ك4_ �EM�A}��D��B@�v��Ƚ��0�-,vUS�rzON �V ��&�v)�xQx�=
+͇^���4���\�=:tҀ~��W�
�SÙ �C����I��Ҙ�p=�jqc�l,�N���f`Өs:ɟ�s��O
��i��A��@����F��`'Á`d�?Rӳ%'�b���Zn�����̥�Ky����O({)w��R��0����SM��O�
+^��q����������[��U�w��}�O��E��v��
�3��s�'i����B�KG�#Gb�PH����F�a5}6$�}8�x�0
�Q���0"
I
��0 l�Mb4 ҅1"��$�H�Á!��1+l���� �,
��
�� ���u7x{
]m�-��S>h2��.v�:�Q9u
"��Q�"��-�����̶0���4!/M��ڠ�����\�7+�i�����.�]�;ި�����d}Vo
���,p���i���:�#ٍRIC�-���~Vę�S�̑���"�I�b�M
�r҆
���.!ꭺݨ�+��l����
�}z�2PZ(ݨ
+F�f
+�
�����f������$~t�
�
+l���{�1C37[��<����Wo>��wW������w�*C_�<ş���2/?'\���zW����m
u��GSY�
���i�*��g���M�W�������݇��
���L���{��}{���������~x|������������]�k,�ܦ�RI[,{)w��X����o����KL\^��n���c
���J�Y�Ϝ�����O���;��Vi��2��9��O��?�����^Qd���VO ����c�L�I�sО�` ��x��C
`���Y���MTp��1�@(���������+lg�����
��e-
�0��6%�Y���'C��4�H�ǐb\H0&%�%K/x[!�x��e�eO-^��<�)�tA����Mi%��1�ĔB��)�
�5�HT!�Vŧ�Q%�Aņ|R"���P��P�Q�����j.�.�R�2���=���"X���NyY��
+�s�j
eS�UbE���8V��tO���x��*��
�w\��i;�wDr��ɬ=���x�1!�W��x��I�d��~�,�\��,��|�_t�l�R��KUH"_r�/r`��o^���e.�l��6 �'����
+b &-D�A\z�����+�����Q
Qr�
+� T��!Y+f���HY
Qs��
B7B�f�̊)� ���B�A`�R9A2�7�k���(����|NcJ� ���g�.�2��|&��<�{T
�i,f�:�=��
�'�<
�l*�����ɫ���O]/�\���(Sy��
R���
+�
+eca��n/��*;�b<�kUۥ�B-y�����PS��K
�
+��z)��p1!๚B�B]�
++b��qHk�����s+�q�u �"�y��!�Xq�o
ެ��Fp#�ڈl6�a��f�h 4L�4��L`F,�1�2�A��A)`į9��+&\e\l�)�ܐt�d;�uJ�!�B�f�g^ �yH렇6�����k;�Ed��汭؆�U�l
=օ~i�
���_�39�,��c ��
r���t%�xŨ��T{
���ZB��L�v�B�l`�
M������ۈby؉Е#�s�u��˝F!�=��>P��w���
�r�蹵t0jd+���'�σ�xD7��x�<L�J�ܨًѕ�r��Z��ȝ[�w'��G�̝�z�|pJ4/F��h��|�i���(����7��oӵ��ptz6
��N=˩��\�d�<�U������Q[���������D�n�
�C
�9�|�I� �9ڼA���bЬ�5C�6n$���[��кQ�Ɇp[�wW�]#=.�t�VZ�s�����&zP�'�֦
�]r�Sg��j��f��j�Z��;����\��+�g��Nj͑����g���������wǎ��'�Sϙ��>�{���ya�)�B���R�
�*%���e`�O�����,�˕"�#�K�:P�z�y�,e�+C��6|�-�ty��@�e�,S�s�i�y��o�ݡwi/�T%����+z|�ޣ�����M./p�>+o�EQ�(4X��W��"'�ą����4Kf���)�pkh�hG�)��<cj'�.Ir����<���5�K��S�27� �
z0��FQ'��D�'�|�>s�L
+On�F�$X4�� E[)~�t��+�Tm�M��B=d���_�z�~4���(~����*~47�߫���x���g�2��`��ag�������S��"/?�_��}�v�~oU��ں��u��[wΟ�_ﯜ��N`�W�������݇��
���L���{��}{�ꇷ�~��ϯ���G,�nӃ�FJx��Mh[
gW�+�|������ǘ7(�1�}��:>�M�^a�QϠ/�E��0+�!�͇�X�X�&WE� ��+���6�f������BQK C
+�{
+A����O�^��j�W�I��+��Z#�hTG
)�F��PV�YC�t;\�1[4`
�\�x��C���M��G�%�9�V
��/�
�q$���;䦶Q%r��u�^������'E
���Z�ѝ�h�������
5�-��*�&1
�E�X�^ή�v�����o_qKeW�?���T�.n1v6Vܞn7��g۟�x��u1���<[�{�p{���}��\Jw���֨���u/�/�>^���>U�Y�Uhymn�V�������x~�o���S{21�\Aa˂֨�e�je)�X�)P
��
����^�������^����
4ދ���A㽘�r�
4���曯7V|w^?2�\����9�o�;wS�{� F-�����bŧ��Y}i��U����_�}�
t�鍿�},�Tc��<�O+���qe�AY��kW+��V��b�e��.+o��K�R�+Z2U��Oݩ�^�;����t��\Y�6�B��X�W��ʔ*�TV)�(��ӦN�MR&�d�d�d�d�d�4J�L�Zt�T(k��菩π��<�
S�t&Ii
��i�)���T�Ŕ�t�Te�����hI����d
1A?~�(�1�
+����3���P�b
-��bg;�s
UĞu����N�����
��c�N��h)V\���7Y=�r��=/���0
��{���~��n��z��p�_^�/~~w�WGg?U����4>]���]�}.:Vy�=3
+^*=ո+����'�kJ��b�Xq��FR�W�T~�
�8� '����� 84�9ڶB�
s5ő ����y똺��@
�ef
G�22��@��Sϴ:Z��
fxb�=0���rG�W����O���i�<���
+O�t�b��&�c�����)��8���`��7
�
y���nZ`� O���b����u;l��
_p�����
��Wl�Ӗ�BSAoV-TOot�O����0<T�L��<م�Ż&�NJ����pQ��v������x^�a2:1����/+[�.Z�E�m�7[q��]����^
��
Czm�db�����y����
�Á!�
��a^�
+:#|�z�Q(1�Da��bx1�f
5���D���?�n��{~�����o��{��R����>WSڮ�TY��K���?����+濥���uȖ��3~��3
�a���za�
��h�)��Ay�r���3��v����}�d����;ϫv�k��}��:�
���JK�3Ğt�!���ΌY�=s�j�m�G��kJ�̟?h��b��&�i�fM�MR��4j��|DM� �?��Al���s�H ��Fc�V4Nl�Ņ
�,؈'�Ը�����1
7��\�1��
�[8��p���h�R���Uz|��|���b�o��On=�o��x�?|����+'�+�j<�t��T˩Hd':\�u�e�T��V(�}�NN՟j8���t��v���N5��N�I��
��)�+G�9I���e�Fi�+O�JT 昔�8)%+�l�)]
%_M9as��JY=�y�QYkA�W4�)qu0n}��ޤ�<t�N��������9�Q��b�hi,�`&%2��T��:�P�l�����%4?wW�P����ꢳ:��
9�5�Ζh�o�i[�ڀC4ִl;*�.%ߺ�p�2�';D^���
�i��ѧ:��Ѓ
R~ߝnh�����/��e^i�[Z�5��㛰��2�P���=ZԸ{p(��(߳;��u�Չ-WO��Q��f;����]���������]����dPV�I����b�m���\�{
�ߝ�]u�Ig����O;��Je.Ŋ翌�����u�i��
/3���Fi��Y�5^<�\�V�C��
+
Z!ߕ�kqƄ�L�x�Π"�j
�Z��9X�&���j�i�j˞�V�t�������J����BYg��X������}�/��
��lw�~�++n'�����w6���7������9+���:��]�5_�����
��e����Y�Q�.cb]ȲΚ�$
��_���L%M�VP�lѲ����Ѻ���eP�l��FsA
'�̨�PO��:�͇��&�v at s��g[��
+U-ʟ#:
ǜA;�E�%�m��F��h@�=
�A�+�`�Lx��<����*N�a�
8��1�4"���{tJ�qY�%
�d§$�ʠ���aZ�Lc�A�;)�F\O���f
�*��ʴ �4�BI�AZ�ng|ֈߊ��=�É��e�mV�M�x�o��s[�]�{Gg�w��|��:g����G.��R� 5���
0�J!ð1U&���7�٘�2���T�!�,r2��&�N���O/<�
S^�2d97ۀ�i�f�
��2C[R@�8�\�
y�=C�3��G(�i
���Qa�"�.
��MC���ju�$A����X��X�Mv
��_x
�
ǭ��L�%
+!�0m����Q�)
+߆pø����:�`xw2 �Po�_��Y�5I�l�
����5��� eP;��E�sҔ��v�f�
OL��/����8��7����p6��T���
Ou=M�>�����|��V(��J�Z�(s:n7՚k-�
�֭���ʹ�"m�Z]�P��5Ԋ�R���b�I�m��ԣV�]�U�����.�
��+��K
VO����������j�����}����w{��Y�9A\�y��'{��q�����q^�+�>n{�f��U*_�|�����a����.��b*���8z��Y|������t�K��Oa�_q��U�{��
�<�9
+�;h�Ϯb��:
+y
+�a0�]E��YĊ�L4'g����MQ��� C�
I0��W�z+�bj��Q
l���_[�1'K�%G����*�3f��`'�8��3Y8�H;��sf��8��IN�����dl�q֞��@���ɂiYy at G�<]
to���nN؈�ޮ
��מ�z�
AA
�X@��Q9��AM =8J�iW
�Z�G�<�
�o � <N�r��#w փ� ~p�����"��{����IHL��d,L�J�
㙜���L��T���c^�_Ǽy�.0}S��� 3�0�+��V���w`��<1�
3�
M�M�`��l˃a��9�����o�K�
�������~5�{��{�o���Wh~F��~���?_���_at���s.�z�O�m�V�b�����l�g���;�5�����9{��+�?��k
���!�
����~��m�A�n������ �"��̢͔�E���i�ԇ ���k?ȥH
+:
+4�X�W�f��
�%|��t��ŷ�4u����
��[yM��>"����U��L��'��
�]էO��١�ϥ3L��^�h�y�������_�?~�#������oO������������LJ�
䞆��hYV���^S=����L�DL�0OCZA��HE�C�%�)d��Y*��r�����R2����Y2R.��d��ɈTD6r2�xJ��ۜ�HFr�\
4=���1G����{
��0��$
��i�ŇU�����#�G�m���A�������CO5��(��;�Vз��3w����~������'��
}�F�-<J�7�Ja��U�t�TYw��\¾
����.^]~�D����4y���:\���np������N�'.��v�=_�df'���/\��SJ�
.V&�B~R?����,�������o�}/��-��.�W�W��$Z
+/#1� V*5sfN������W�@K���--�!_fe���X��r��BɌ�FHx"e�Q҅�R��Eg�Z��QoR{`�Ie�
+�T]Ҷ���� Iӎ�$-II�QTT
���������t����L�]�NQ�4�R��
+F
UE(x$%UGI=�=�S���Ot%eE[Q���Qՠ��,�HjK*R.�ꤻ(_��#���
����$��M`^���D� ɓ�p���p�{�'B;M~j�I�h����ڴ��/=}�ټ�$�+�[y�˪ۤF���J]̟��RŎgm��Iy\��n�Ԭ8�=�����w��x(ޏ�`R��9�k�AE�R
+`���8��N�`�%
��
+%
!� &7 A0��
���+�
+�I�cC�G
"hfEO��0F
�/\lN쐳V���Rqj�A\p���5��\��Ug�X����渌�\̼���#
+._YPITEE�E��]��
���R��ݶ+��2��4�R�E���$��g�2D\F
����.�9�cW
�(HҰ��Ip�xȱ�=9�|��!��t:>l���::�0��3 ��#�Pjy�6:^e��l]�6Y1^�ъ����~�p��������Jӵ�=�v�v��0����X��[ƫ���iu�:a}>b!���lĶ:V��z����'B
}FPI|>v��[;o4�����iW����N\jK�>t��%wíj��6�x&N��Lw��ى�g�
SΚb����ɵu7���S�li�$vIg��R+[F�7g�:F�Eƀ-J��1������j������>��l)�e[R��qE��1ňO�L1���]
+��V��NՎz���L*;U��꒶
t%U(H�v�'iIJ����j4�$
L��
�T�f��ʄ��t�ʥ���7W0j�*BAjɽ�()�9�zJVXZ���;y���qW�Ua�
n�gn�7������O�x4�*V��p�\9�xa'�����Ɖ����ni]۰^W�Pڱ�<�2��;�%�6m�ْ=�k[v불k+c�.��Y��gі*Z�۳ز=/��h�ݛ�-�Y۲
/X|h�xc�xqt��q̶��wO�'B;M~j�I�h����ڴ��/=}�ټ�$�+�[y�˪ۤF���J]̟��RŎgm��Iy\��n�Ԭ8�=�����w��x(ޏ�`R��9�k�AE�R
+`���8��N�`�%
��
+%
!� &7 A0��
���+�
+�I�cC�G
"hfEO��0F
�/\lN쐳V���Rqj�A\p���5��\��Ug�X����渌�\̼���#
+._YPITEE�E��]��
���R��ݶ+��2��4�R�E���$��g�2D\F
����.�9�cW
�(HҰ��Ip�xȱ�=9�|��!��t:>l���::�0��3 ��#�Pjy�6:^e��l]�6Y1^�ъ����~�p��������Jӵ�=�v�v��0����X��[ƫ���iu�:a}>b!���lĶ:V��z����'B
}FPI|>v��[;o4�����iW����N\jK�>t��%wíj��6�x&N��Lw��ى�g�
SΚb����ɵu7���S�li�$vIg��R+[F�7g�:F�Eƀ-J��1������j������>��l)�e[R��qE��1ňO�L1���]
+��V��NՎz���L*;U��꒶
t%U(H�v�'iIJ����j4�$
L��
�T�f��ʄ��t�ʥ���7W0j�*BAjɽ�()�9�zJVXZ���;y���qW�Ua�
n�gn�7������O�x4�*V��p�\9�xa'�����Ɖ����ni]۰^W�Pڱ�<�2��;�%�6m�ْ=�k[v불k+c�.��Y��gі*Z�۳ز=/��h�ݛ�-�Y۲
/X|h�xc�xqt��q̶��wO�'B;M~j�I�h����ڴ��/=}�ټ�$�+�[y�˪ۤF���J]̟��RŎgm��Iy\��n�Ԭ8�=�����w��x(ޏ�`R��9�k�AE�R
+`���8��N�`�%
��
+%
!� &7 A0��
���+�
+�I�cC�G
"hfEO��0F
�/\lN쐳V���Rqj�A\p���5��\��Ug�X����渌�\̼���#
+._YPITEE�E��]��
���R��ݶ+��2��4�R�E���$��� 2,�
endstream
endobj
13 0 obj
17353
endobj
14 0 obj
<< /Filter [ /FlateDecode ] /Length 15 0 R >>
stream
+H��Wˎ
Kܷ���#،��@)����
+��,]��J�A���dfuUw��6;ϙ{g<]u*3#*ND�1�)�8ǚdR�C��$�|
+)��J���2�l��!ǜs��$&5��N~�S��i�j�E[\ %�\J�g1��aV��
���B/<�x��� �\����:�R��k���ꫫ����������\�i�s���
:<C�r��Ϟ���u��x����)�QL�-Xs�������IcOr��{��ӄ���s���pXi�i��L8��"N���,�M'�S�b[�q�1�裋6����2�P����C
+1`��l0Ad�␊�|��G���[o���K/\�Q7�쒋.8�8픓k��ζ��f�l��z묵�j����T at R�d�I&�`�q�c�QF���uѓ�:騱F��V���R
Uլ��TVIE�WNYe�VJI%d��,r�Y&e�^:i��Z*)%�( � "
����X�@s!�`f���N\r�_p�2���D�)�j"�{\
��(s���r�B�����n�y�K.��}�t�~�y�m�����؛{�s2W
�g�w�]��z/(F���m�pQ�N-W����㙺�h�-��d��R\�k
�Kӗ����hKW���\(�
�r<��|���
�%|_u9
p���eOY�Ӗ��<ҕ�*M�N�5e��^ޥ��J�����h��&�3�L(����%lp%T3$L
�IX��cC�c� 8�k�a��L�
v�p{i&,����z.��F�aGFB��ئD�
�6+ƴh��
ۆ.���P����&�ݦ͑�:�ސ�
je�g� ��,�b��
�0b��;�UV�R9V��N]
�Pq�ij5Va�
��E�2c�+�h+�#��Y��
+{��}�)�G��H���iY����E�gZp�˓8�s�@��L2�)@ g�MH���
�F ��r��8b
X�����`I[*C
Y� k�"ؕ���U
��4h`�FNFp3��L�8X 85�k�B
l���GҀ[�68k؞6"獉G��9����s�HPlj�G��Q�8�3���Fx6J"o`�4"���h8�xN% o�DɤT�&=�XN%�Ev��.3�� 0L� �c��DH�Es
�:��'~pbÉŝ����^�Q�M۰k���u�9�6?+õ�[[
��n6j��>��۫����^OZݕy|le�������ݨ�Yu4���1��jL�#Qi��#(H�"(k9yFLv�䑘�*%
��*)�!$$#��($$"����*"giB2S��b"{�h��
D��v9�։������L̐�-Oe�6C����Y�K���V*��*l�jg�d�ٌY6f��i
(
Q`Y��TmT��ufؙc�,[�
Bɣ�sm�m/
/�lp�rt��v��`ZY�g�eU`q�1��v1��Y�Y��Q�D1��I`Q�f�{21�x��јӸ�z�Q���ZA���1�"���P�
cU�-���z#��Ȋ� �����^ �upF_\�^t
X����k\b�Zw��3�Uo���0��
a�6��
c7!����
+�?8�N
��w\��QN�-:�?��'q��O����\������g���z�����W�7�+�q�m�O�$��P�n��ܺ]���Y��%�ɍ)�S�l���ڿzf����gv�v��}�
V�zfO�v/���!�{̳{���<�ϒ��̳�[��y�%<�ٽ�#����-�
�D����]��}?��_>�������������oO����O����ӯN�����O�'>��x�� �!��Oi!p.�<
��t�5G�]����:���S��)3J�D��w���^��*�
+
ݦ�3;��)�|��U�*W�D���<e9I�U��
�|� ��'˩)��TzZjY�pVZ'���FR�9 ��rҒ�V�h��m>z����F:Z���JGb���HH��(��
+�|mꕗ�Z����
+.�K]�fNj����fU�3�
q+�9�7.�'��yY�j�Xc�d�Ve9��Ks��d��o��%�
�����F�m��i�Ż��^�|�]��kG&:�߷���&���:^���|�J�ȅKF� �x'%bLnr�NJ|1'"^$��s��{z�JuQ�3vL�s�e�؋Y�?��E�M�tJ蘖�5m�\Լ�!���e�t��~��ҭv2'�$�@��$�f��IƵ�z|q7j
+�R�a�᳷�&t�ۢ�?���7v}]���s�ϗ~ڵs�ONWvnkClu�d���k+�ٸX���ؐ�
!C�7���nK�1�lL�5!s��'dPȢ��
<]E�*ݬ�U�&,vemX�e��ʲ���
۲6.d]J7.dZ�e�x�ɬ�U�lS^���DF��� R1A2*�CAH,%@^2�f�+l��
��!Ns�+��[HX��e�Z���B���@�<d0A
��B$��@6
�3��!SSٮ��/Ca�$�Cjv��4��'�Ix6siOB�a�L&P�
ׁl��ۧ�%���!�nʎQ
8cz
�3ք6�>
66umT7V��lj3�����Ԭ'��
+�!�=0O
s�u�<.���Q�1��j��p/@\ �-�/�b��
g���rG7a���cm��Fí}ťڨ�}��ȳ<�Zi
�dS��w�
�]��\�a��ƣ�i�(����$�I��%F%���qix\J#�8y��66-�M
N�D���+��5�4�(� _
������
+�݁%ڲ<q�$_BL*�
ĭD�f�f��Hd���K�TZ�����lN�k�8
*p_�� ���/�((�a�xg
�S�(���c�lv$7� |7�w��C�ş⑿W�t�aal������UŞ�ٖ�v'vZ��f���_�?��H
⸠�QM]�� G���s ����OP�
\~��*p�
+-FTd�xP��}o��
+�����n��q��:�m�O�?�x����1�ݷL�G��ծ⿴�̺�9�{�}�"�q�:tw������Mo�
#g(��
�s�(
��3�M
��YG�#�œ�+b?�+�.p]��mp�s����X
������N�6Vc4:w��n���
=�[��a������
��2��N0� �l�M�{�T�s�L��f.k�F)��f�?4a6_1[%���w;�=�f�� �=|����_��~��!<��.��C8�]�?<�^���:��^�e:�NV���T}MMͥ����BQkS[���������
Օ�J�������+�^����Zjkj/u4E 5����dݮ��Tjj(U��8��6���K-MU�ښ"��GW
�&A�Qľc>M�<y4
^�ط>fqv�'�Q(��'�e�i�a@
�Sze�ć�T����������o�����������?j����������**-��%9�L%�~�B�����D���VAȱ�9��@
+ at X[�"�4?��y�]�݈A��YFX�����$-�R�r�%
�E�G�)�X�9<5�-��"��!�XRC� /y�7B�"��H;B���P�=�Z�������+�%�CոZ���|(��Z���Z��,
��sy��3k-���V��\�'��6Al-�n��g}ߛ���p�������o��X-m'�A�~�@��>�� ֡�� ���>x����e/���v
Q
bb�I$/���{<f/˖�j�:Y�m�"��Q>�A�d�ԉ����!p��
Y�5���{�&[���,|*>� �MJ<�_��}Թ� x�����j.8Q�>n"?D\��J$��0��DD �.�
+�H(
����A@ ��Ck|�dm�@ ����vo p�h���%�vJ"r�Grǔ�G��c".|r�N�<��3IA�bU at RV���;�_R�
�i
P���?h#F�#l ��bl�{��{"6E�h�����
l
���C��Ӄl�����쑵�ճ�I;��bR��}����{��]�����ftt%{F��~�7���G^����{���ޝ��nj�n ��sa��
[t���m��������G�����y*���}
�W+
'��#���ps���`a�w������O=�Q��O��V��Uvg�u&P�{��tF�
3\��Ѿ����椛N�랺�
�����3
]̓N�
��i�0���)�����M�Y�
���\|z*y�
žD/q��I�R�^�jW9b�u�*{Y��H?oy܉�K���g
����i����k8nx�g��y�كګ�c�6��һ������wLP�����E������A��@]P!p_R=
+�(���N�� �'��Za,p�E�
#E
��K9���8��T0Hfx#�%��`��-Q��G�c�#�<��.�.�Y�~���A�`�~�}�|��7��
r�
O1��}�9�&��ܥ��4=Q��v5��C)}�
���}�ruP��\7���|$����g������ݦ<X��½��Ц��*-�܀��p�^q����>ܴW6��b+N��n��f<I��l��E$<kGrKN�uə�B�H���6��i�n�.ܢY�c�6�d�El��a":�K=�$�{���h�.��&�p���p/;*�A
c�R��<�^B�{p`&���;�]I>`D�K�xZ��9��c�6�����ԻbB��%R�;��I]Ӎ&��=�B��ӂf^������;Z|�)��o��N�:��d��p�8{%�A�laC;�
Fi�kBⱄ�+ ��%���Tʗ��(Ȯ�_��-W��gg��������������ƮMB�~���wRQU!���MUU���z��%alt�Ů-����B�?)����ċ<������r�Q^��ew��%g���S�H+��τ60+
B�y0/L:�_W
Ď6sr
��
�CeL�j�ڡ)N�G�c��DtZ
+]0b�|Rٰ�^z5WY�@w8���{$9�đ�|m�0ܣ&�ӄ
��~E�°�����&.B.$?n
v��# \e�~�
+ӗ�p�T� ��5_�
+_��8�#)8'8%`|� ��9A� �Q<�8�5%'|J d�8?O�)"U�\�ɢd��."_D�P��D?H�2"gԤY#�F��8"sx���v%y����t<:������6)�w2z|���y��N6���X�9���mm�f���b
b�S(��=��jS87s�x4�z����¥0�}�И�ʳ��l�j��:��m5��w��|~��6�96�m���rû�eЛ�r�d�$gM����E���U�I���-��-���NE)�pʅ������{=��q&��)�+��|�L��
�M�a��]���ϥ�bxIW\�z3��N�o�g`���� �q��;����|aө23\��Nwj6Ӫlp��M�R�%������R�c�i�V�N��������.m�D8k�p�\�TH$�h�ض�el�|�c��ϳX9����-vP��)������5�~����n�L���q_
t#�ro����؈�آ�yzG'��/֞����%)S@
��:/��mĻ݂�I��Ys��$�L� [...]
+^
��0��Tv�ݴ'��x�\H&kO-�hb�����wJ����t�(S�(�7Q���t���W9�;ө3�|o}ڣ�tkO]�-O%�d;��gGoa�|8.����V7)�Z�Jg锉eP�q�J�� _���5�V͆jM���Y*�/�,d�bݸn9�w�Q<�^�L
S�Lgm굼�<�Zֵ�{��� �~̶5�2�\|tW;���_���&�8���N��Ȁk
�D/X�)�2��9�8 ���9�"�]NAv�=~4��
Y)�E�#+I�%Ko;��Ꮋx/��ḧw/��|6Y��S�:a=��v��rW�nX'�
�;�U�>����D�m'm�l'l���\O����~�v�v�g�7���;�[���
�m�m�
�igec���R�������?s�\x:����x8A��8���֨>�����6���l�?yX�b������h
��JR3'��j5�}��p.�l���-�=��ɭ�nڷ��Wێ�F�G�w�M��"^��;w�"D���"�.;Y�g5
����ꪶ�ʞp�%(c�����|��
�6�Gx���W�W{~a��l��'f���>��L� M؍�tG�]�\�T��~x���w�Έ�u@�BϠ��-�6-3���X|I�X�
5x��i�SZ����[�<�bw����t�-~Z&o��!=�D�W~�)��
i( R��p�eM�"�JG��������ຨ ��[�K?��vQJ~�A����7�L��^z����t�Q��������t}qz���L�s���$9����o�~{����������������vq���֎^pShd~�6��@#tQ����� ��)N?M�~[��
��1���.�ep|����&:�t���>&�
�R��S��nO�?JF�BEO�����p
��DB-$^�c�<
�o���BfO>�X���䬃}k+�3PBY����8��Y0����:�������3��i�c����=v/�;�#�~w��\y�6_ǯ��xH�:�f�K��}�!OFHģ��Q�Q��鮹su���C�������/ [...]
+F
# ���:�CMV�#
+�G�#�%�(GRK
Q,��v�kE�A�F�-$�(�"
Q
�%0� �
�rFoعB��8�����Hf�#�ő�G�c�}w��#u���1�aF
��0Y�8�4�%00
�,�U��
Ɣ�w� 5�)
+�
U���P`ĤQLQ(�Y��1o���%<��N~�
$�
� �Z � Ytd
+�>�,R
�D�� 2�Y d��@G�Y �$I9筈9H���A2H�]"� Iz d�ә��s���`��C�K�H
+�d�%r$�A��9�� Iz ��H�`����S�M)����cHA�@Y|
4e�t�
�4PH&�^'Sl��}�_�<|�mB�oi<����
+1G�4{M<^�x�^h�nK���K
+5;��Ǽ=�o`
�g�C}�3�$`sX���Q�LJȃ���
�!q<����&��l���Z�#��ky�M�M�6�ˏH]�
?$��]Cs��
��D§_�Ӱ�Z!a���eGPBK
��'��q��i~�r^*9�Wn�❞�i��m�+�<�LmP��T��BpH�h�
Ɖ�����#�J��N
��-�b##~sܠw�m������Z�Ă�s!l���R���p0�4�m��HP�f��w�ٿ̒M
��X;c
���j�K�]
ֳ�������|�;��2Sv9�����5q8SW(Sqn��[���_*���a
9r��LU��By\R�ő7V�Útؿ�����
6�]�ڹ���gER����w
�P�W�7��=�:�����x������`&��^~ �/�K����X���I !�o1�����f�Ǥ�������f������GqQ�b�k���&R�.kH���T��X?���0�А`sN�ȕ�`�7��gc�g ZO1�d�SH�Nd�P0�A5
�;,IZ2T�y�\Т�)ఋ�jy;(/I�g�3߭V7=3������ĪG����s-�G]�~i=�d�Lb�K��Y��
�tq�s�m��:���&d,s����9��t���%`%�T_%iQ�9JU,�0�@�,�&�fP�I(���\
+
�
+�D�d�r�B�@���e��1ބ¡�M<�O(�bC��'c�B��QT=���Ai-slB�B��s�ox��`����RG��K�Tȼ�d,!������R
�^���+�
+BcY0KE��覲�Lwf�c���HQ%zvV���
^����-n�+�Fە�g��00,H涐���x?�<�8`�5Pɍ�R����/M=ds��)N$w� UV%r����8QN%�(�1��
+�l��X�:憸JWO��m����uPkR�|c��=�D�u��[�c�5(��pÈ�9�F�7J`�l� PdbҼ�A���#�Q�%T
�?Zf���*��0dˢ+Х�@4�Im!� �-���
�n�
x����V�V��
)�����4�겈�Ersh����/�ơ��IP[�=,v{x9٠=|ک�Q��H1��S�)%V�[�u!(6�6���u.������(��L
�쐁䚠�lv�8nh���K=��
+��Xc�zJU�ʔ�k�+�z8
�N��T|��ѪS� ��xa
/Ђ�BW�!B����`-���
+�F�M�ȻQ��nw�H���r�V�r]0֩k�1&cT��{� f8�:T������B����TWpfKތ��=���|"Ϲ�zXz�s���
U2Q��3;�@�IY6J"
�4���H��{S�ʜU�
k4�V
�5���RJ��m���22&[��p�[��vp��HգIF�� ��L��o�e¡Dݪ@�؇�*��`@
0�y�
WP �����(iȓ&��br
:����b�
�` �=�f\�#R����`Jw6˘?�Ţ]���&fl��l��x�^e�6���)�m�
4^H`o�I)�+ �N@���
+l���Z"x9(i�
O�
��@3�N��4Σj����@ߧfUtx��;,� �}�kdbVz�931{F_L�
`���0��H�!
"���}u%�<�J|B9����=x��cx~���ы����81��ۿ���Ë�9��|q:�_}wvkO� �PI_ at 7zf��=\��OK����-�x�
��8�4=�m�^v���='������ϒ�&:�t�������C���3��>
l��X
+>RH��^-;r�F�
��.��8���>Y���@�YPK�����;"�(fu�d����a�LFF�����ݳ��f2�ۤ��`��С�tj�s�{` [�����A�{��փ;5��Ͱ�����Yp�x]�*��zX�6ǫ
%���
�u��ײ���?���ld[
ppA~�O0��[ig�3�S�BI�~�~����|�R�
��
��0^W���3��1�bɨ��vfS�Wv wJW4���]���C�0^�C����������MbZ�+��ҕ�^�4w�eȢaArkGU8cOmc�u]��O�V]@�VMi�v{f��V���������gI����kI���V�����z�ڽ6~3�N��stT��lLr5��S���d�ε������_�ū�I"��E-{��W� M�85�`b���u��ѭƤg>I+l��+��! 5WlE;=����,�C�b
E�n3�v{\���P%C�;��P���uc�c���>=T���M���C�������]�/���s_�0��.I�'�na7�|�{
c��d{�K�4���qC����2kAA��;��֣�;����K蜺���G�G0�Ng�:��N�
�c���UV;^��\)��N�I������� ��^�pV��2r*8g95�
�jۙ�)�Y^'Y�AD�9eÝ�
��Ǯ˿?���/�y[�q���с�m�y�ſ��
��4tW=�ջ2q�u_{]��� [...]
+o}�j��a�*c�{��ٞ���u�tn�s��%k�� �#�jm���"�#J��Q[���s(B����%�]��!���1<{���eQ7�-Eԏu�
�Pc�I��G۬po���[;X�.�U(���هz�adpt�I�����oT?L�/_�P�mc�v�9��KK����N_�[��ύ}�Uy��D&k$� �{|�8%ħp?�K�j�j|
y��e`'w�"V�H�����U��R(�h�
+�
T�������K⣢� pp͕K���m�a�:q��]���}��C���>��`1^]�#����?<.�!9R�k�[���V��ﶌ�R�n���5�˯��u�%����*��Q2a�y�Mcɩq]�*�:�]<�r�0t0�_����
%s�*\ �T#Is@�����B.-5DBɐ}�Y:���Q�Cva,ݘg��^�j,
�������Ǧ����������ånzt�8 N����>��
)k*!
+
��qi,I4������k3�ZW�> Z�O�:����4X8��XQ��+\�+�%*�B�*p��
)`��@m�ĉ�/�\o_�'�U���@}+@� !�ɢ|:B���TA��01BnCLy�D�
�i��1(�X��!t�
!@��Ara��yh���@ �w���>�ϒixS����7��7�Z�o��
p��+pl����'b�b�d�'f�h��|��������<=|�$��2�v=:`�/�"��
��樿�V����F�H�X��
/
c|�*��\L[
|�;ݾ��w#$���JiEˋ����PlvKy[�ԅ.���td��-�s�+�0W8hL�)�A#�g[�P�
R�TiN<
'V�E'.��<~�����
+��
V
�xn
l3���������w�[����6�B�qܳ"�ڈ���b1����c��8,,U�E�b �D�l��?
h
g1�����'
+V�:
�y�<�ŏ��@�,�p� �{HD���1=BV�fAG�����n:7�}�"#EY5�OQ�tl5�qT��w��R���'r�q���rBh�|��yC��8�����w������� Kٷ6�왡��l�/mb�#��i��
�d�ʶfl���ԞS�#�^Q��T�F�BI�Pz˸ₚ��)^��z4qz�.����A�
��^��9ݶ`*}ˍě�:��d���NJ� y���3s
⨧��RN��
+�?�܇�{���r.�1�bxcF!��;@Pp� <#W*����vsl�1ϷWO�4��
���{�%���\B�LٶLPKs��S+�-3?�#c�8�{��b�U�W'[�$eP$��
��p(�@��xz ����0N��e�kD&��{��9̠�0�,�M`ofsf4c�%����hR����
�D���������M�+����B&ש��\\�L��#
)b�h�La^�z���bE�����`� j*�
+-�٭&ۍ���x��mGUz0�
u%�Ҁ��hSq�֑22위��{]gpBO at Fj5�2��Z�ԡ
�.Å��FB�Y��},�<�t�c��I�����Z���K�j'�+�Ol?F�4��h�Dl�SS�,:N�yV\V:;CA�&1Q�I��9J!؎��ͮ��؈�gg\�V[��
�o��
�Rhٴ�
����}
vL
r�.��Z.?`3�3*X� g�:��[���Y'��fx^�
��[��o�(��(���
�ql� C�������ri��8��>��p�����
ŋ��� � F�8���1��yߺt�7�b!М�/�U�U��O+�I�[/
+���TP�X��$�^���"��&L\Z�Y5����0�e>�U��%�|�5^�YӪ�U��W���evS2�z�B]�.�e��H ��EJj��P��,?�:��(E�-6b�ğ���(W�ɢ�� i�$������,5�b)��� ��O�+�/)���N��sso�
+�Eo�W�EM,��
1�F��=�<15~%YE�Y.ۂ%�¼��z4הP��"*4(b) �e,<�L�ك�@�A��Zq�硂0dL����
2a
+���8p�{7w�
+M�s�*7�
�`A�f�e�"!V�)i_��9No�|{4C��(�8���KXL��vZ�HIaCS���n_"W�x&V��:$[L>�cM�$4�,�XSXM����*jW"E�%��ƽ� �;ƙEz��m0�tQ���c��7'0~`�2$�I�V�D!_gZX���
+���� E����g�xA!�_TtZ��FE#��5����P�A��h=(d`��vʘ�
��ҷݝ3��ꠁ�+42Ґ��]8Q������<OF�MW^�Y�0D3+k�f�r�
�m^�,=aB �y������1��FŶ}:oTԝ�7�`?q#)V�
H�7�&���:%�n���S���#�80a���� �y��py%t�Fӎ�x��stޠ4n���)݁��
8*#�g+qPWV6%*F�Q���T�$���#9q@�;q4v�ލ�[��ā�qF
8��==�2���fh���9��g�
���i���qZݠ��Ӱ�����
"�lŎʆ9:v x��V�@�1jN�@�1B�; �����
%
;*+Fs�2R��
�<:
B�!��y����w~�G����<"�'�6�T��!>j%����Q����zi�F"R���T���Z�
ت�$+z@�ʒ)�p*���D��G#t$C���]
�њ�
�
�:�4Ω: C��{ &'
����z͓=,�=���gu
���NB
ؓ�P�BN'y�$oQ�A�h!���̣�aQ�� ���0�=�s�C1��(9:|T��lSe�ae�.��g�a/�����w`0)|��;~��T�/�J19}@�w�O�hQ���F��飱���9�C%�Hl��>���
V�>
-;}@*)9} �\��c��=9| z���ƌ�+}`h(��>���F���)S飳'HN�.7��o��q��U�n3�c��E2��X��h�ѵ�<��gi$�?:3:@Z���N�-9t
��)~k��(�t���2pW6 Z�
+��+J �dm
��C�m}��B
��ds �I=� ���1 ̾�d0e�5� �!���HH�d�U>]���W:
@ ��
@�y�^^����T��"���S��~OaW�2��!z��2�j:�`:{#����c�� �]rW��z��A�6�� �X�A,N�P�#�A$r�C��*��^�!�3$�C"���
B8D*��"�� A�eG���9Gt���¨Oy�9�r
+!�= ���|��BHg`L�V��B��رE
+���PHW
2
+�gR
�
U�$��.i:�@��݊q���9�V�C�M+o|��K|~����/�}�����?>������
�����?������ǟ~��w�t!ᱽ�
gp㟱q���π߂�{�����a�\����p���o^K껼��-��F�7?Ĩ��?
d����#N�Eli�d#�i�;6��V�������?�Va"��?
qXhM�RGQhy��
+zvԓ,�i�u��Q�����N�����`��ɩw�N%�g����W���
�۸�%���w��!t����lt5ѹ]�_��: ��
+��n[ф-]S^UU���*���Pm���p�5uUFƘQ�\����<���8�U*p��5HUJ���HV�)���8�M��E[���6�qE�X˝�=�!iZ���.�vTUDے�
z��"
+肥�#mwP��.�]�)GX��:�J�*�3MG�-��#8�<��
���K�Ͽ��u�^����.�W?��]W�~C])��P�����H����)"�,�]����}���u��mz��H�l�-��M�k1Y��no+��m5��4��Cw��s
�.�r�~���>�|v�8ͷ�t�E�6m�>ֿ��g��ZM&��kE����iY���=ʔ�c�/w
S��6�����>��ld����v�>�d���9b@?��4Z��I ��ٖRY���{����U�����ϫ�Fw6��D���������-���>�qu?a�yvy�u
���>�_w��x��{i��\�4�x&��`�
+d��e�u�����
�=��
�����{<��C�l�c�lڋ��죭�
B4�h�5���4��s���H
+�N)�@� m�ҩbH�^o����W`[Vv�@��5R��.��D6fp�DF"�P�]��T�F�M/G�\ۻ�B��
+�qBkrTaq���Z��%
e�$�J�r��2���
�M��a[�qõ�S��<Ƥ�B(ݏ�PP���[�n�ZHuH�/iϞ�\��N뤗�k�ZK�Na���ԴD�X6s�=_��m'��sB�
+��`�\�?Td��Rm�h7�`���M*,I
�&�B��L�Lò�wu����yS�����~��`|q���L+!܃�>_��]�Iy�`�{���,
�EJ2�V�* :�L_�¡�
o��R)���H7���$�B�Т��_n7���y��bV!��5J�kOͷ��m
�
o�+���I�k����C��h��?�����}4��lgG������&��
o���}�K"2<Kѓ�X� ��U��%EIHw6݆�[
t�N�/�Ap�k������6���PdF��n���%
+��K�
��Y���NF�k�xC�B�8�Ҍ�(��"C3ȫ�Uz��ň�"M���F�?q
�$����!S*\{���Odi�O[0:��i��VK�"�.�?�G}9���[
A
#�!D�d
f �{�Z��}� s���U]�]�jU�J��5�(�*r"у�
f�L��-�@E���:}�.��.�©Nt B�+U�
q at r4
yn �T8��3�������f ��}UQ��'��,xHLbHD�ݺ�.� ��� ����f��T諦�@����H$�;�0ֺ&3�`�E`�D���pA-�W6
�lB+��
�R`�76���T�R
�%�t1�%����t�,��䡚N�iYV/%��G=
����#�2�zw,�e�T($:�x;�
0D�x�)Ii4� �������uH�]�h��v�^"
� ٟ���w�GG��d
���}� �u�
M����9�y�����8��~�S4���1% sk�� B���&iM1 ��ۮ�vH�.oO���B儫�sIT���αd�?�ӄtYO*#����^����z�n����_���5
��S�3�,](�=/�d�*G
��^�k�7�4�e!R
��66 �nNtf^��W^�A}�@ O�\}�!O��םUxY��^�]
�1� U�+V5.i]�\ʳ
�\LyX/��ep`,��)
��������)Qj�Qk :f�r�Dhex�e�M�'�p%
+�~�Ԛ��!)�6���@���EU��(�ȴ
�`k��d�$�sC�����cZnj3RDLE�*�%�9�DsI
�N�zA&R�,Z��JM�����
i2�/;C�P��m�!c���r��H2D
)�#ж�X~�ƼF�u����
�$^�U�M�ڮ��]/^�TPX���I��j��1��$F^T�lc�,<����yW�A#�<�HY92��,��i,M@��4���W� #����e�7��3
�md�7�52����+�h��[��p�92�p{���Ή�9c��
+cA��"�=�*�����N4,1���
}��C!Bd�NY{#�
�2��f�=,�ӌT��:�An*����.P���1,8�o+L�f��'��c�3���
�:۳�o�
+�v}�O��l5�g������
+�fa2Ӡ�.I{�`}jK
5�u��l]pZ?�$e�
�Rv�������/�O}�e^�9l���O8FD2 O:��+�/�p�����%��FӪ��9�v�2N܈��͚E߫F'��� ;i
�KX�dz;���
>8��x��X
�ل�x�΄����
0
��xp�a܈�|j��{A<%��t��jѾW<4�`��<��Z�݇��}p_��7}3ܪ�6@(�<c��͘�LzdK��bJ���]`��k����z_۫��M<�$�ǎ���L���T�k�]1B�A[�{�����i��=^#!��HqH�i�k�J���\�L7l���-�����Ӥ̆�;Fo�rx���{q9>ώ��IT`f�v|�3�ȖW���O�O�7�,�n�be�[7���
�b��&�͡��5�*�,�&� M����f
��&��F������gI�e
c�*Q��+���iD�� [�ba;��ZL��+��傂H���
(6����w
���eӍv�d�h���|��j>� ��ܨ�
��x��1�C���\lL#�X��fc�^ba��ƴ���ķ�� ��&:o�
2=Z���a��A�8��9i��1�$m�E�C �wY����M��] �3j!2g�wOo7�Y���~��>˗he_4�FU}��l���6͎�W��J>�âU<�1D+x\9b�*���F�w�S�G�#������.�ϴ�����u����Ƒ��kQ�J1�(͛���
�2�c��³�p
:�a�=0�G}�.�PN�u[��
���*�H
�������
�]��C!\���c�FZ��Y�9��ن��X�E����Vf��
�u[~Ǯ�V�f)${���\$m�B�W�~������x������P�m̩�ڤX���E
e)
��HZ4��'��"����duA�[4���������ԋ�V�y��
o_w�K3ę�R�`[�ʴ�̠
�1�
S�,�#�\�v(
aY
�
7����gj
3GR�BT6���1�ls�錁B�zL��Z(�Ny�W��Lg
ۿ�g�4f�#�)��b�KXS�XS�)���
����"����x
;�i�i�H�:l�T
k�&+a����*%�
�����Lo�������y��`�O|aW\���ph���ia
q"
;�
,�7
W�.ӂЗr����t��)��g����>>�K��
��N��0�b��L�0Q�l�r�*��<!}�z>Ά���j�|��R�)���v츝/|}�~o��
���s�Y
:r7�B
���,0��=H�6w���8Q8n�I���� ��h n�ړeNׇ �+��j(�m� �jRpN'��_|+i9�xH��
�KdF^��"0.?����Q�1,%�C�/��
yL癤]Zq��Ʃ
�^X�� 3
�')ž$�%�&�
��
/���Ĺd,��حiN[�w��8&X�T�R��MZ��on�rxe}/�8�vYo����~G�++�`Ob��
+��P4_��3���T̯���ء�N�OQ��O�����_>����������0~���o?��_?~����x��÷_���G�8��� 2�
��������N���7���3|�՟
���Ǘv������q���x#�����f���̾�S�oy���
+�=P���� ��[���,�����ԁ��
�p}r�� w~����Tb�DN �Y5D� [...]
~?�aҊ�>�Zzo��
5���o��'�������KT!�^\�O��ؕ0��
Y[�O�kݿ��4>?�n�q�B
�
+v��K�$#
�a�\ A z%�������Z�o0�NA�}?U
�A=&O�f�ZCQp�|]ˡ$�y�#;���X�8T5��a��%/��xo
��Ȑ���������h�p瓞C�+�Q
�M����a3�]3�+�K
�A�|,��t�EH��
.�g����6
ؗ sX�e
endstream
endobj
15 0 obj
18399
endobj
16 0 obj
<< /Filter [ /FlateDecode ] /Length 17 0 R >>
stream
+H��W[�]�
~�?��B[�0�K�'-���
5��}ZN9�.�$���ӌ4k��J�w��`��
m-�����'���fB,i
���ږL-�lњZ��{W�h���6�n5����%9����d���blK��y^}�{��M��m�n͛겟B�� %9�GUt������|���f�wU�
�$J�䉏*:N�l�Čn<Put���|���Y&x9��]�(]w���[�r�3
1�b��~W�!��cH3�^�C�1�j�B�� _�k�G
bl�{�N\�̨��3
+1�B
�\�8�q誨�eUT���};�ZUu*����[s�ZRU�zbT�O��g
l�ӱ�*V��gr9�c�UYEI�*FN\��JbT�*e�J
�8DtՉ�GHIw"rwHބ�����HT���<�}��l�s�m�V��I5d�.GՊD(���1�+֪�"��#�k��4] �
���V��*Xa�%1r���Z��V��
��%�ZQ֊�SW0���U�
+k��Al
"��~��+|��ữ^������߾f���|x͢�o�~����ճ�/ޚw���䳣d��B0ֹ"����X�d����!��������-n���w���zϿ���d�O�w=5ڼ�qt��5��������al�Z���[ć���)����.˹l�_�CŴ\�\Q��*Ê&���4*��p��hW�
4����J�6��4�?�
���l�E��j��vb���S�(���g�Q8��R丕A�
N�g2�"! ��N���i
��u��/�q |�q�є�w�q�o�ݰ7�+JtF��5��+�*1��N,p�>R�B3k��6���'�(���~`�{�k| �&�N{�����]w
��4$
+��>��R���.:���2�ı�������Z)��yhyah��n��H ��ãh�V%a�%"a�!�h�
�@���p]5
�
_��~�B�T
�����5�U���E���
��ۢ�dCwt�`C(���:p ��j�3$��\e�
`=
���
{4hjT`IKa]
���+T,A#E3�fw�d��Ŀ>� �Ĉ�(��O��T��3F�1K�
c6�0��D��lyty�O�^
+�0������eP"�4���Gy0�F����<c�c�B?�b��Eb��d_%L��FL��$��E��t-�ӥJl{�_ӵJ��T�
�b�LI��ypYR����K��t�Ig�����Jm�.zwsw�x�v0>;�+Ɇ�iWwK9-X�1�1
��9=a�D�`b^x�94
a�)�S�t�A�x� )'�=Q���
�'Wz���:J�L�^�zE5���+�p�ʢ5N)���x(lų�M�,z�� �����fS\��&��=2���;�5��j�3�������J)�?�T!ƎN
��/j8�
�^Y��\~�
��m[�ڬ�c
��58>j��5Mm+����qkV���Du�GNM����X�O�į#g��tC�
����
�䝡Ť�w۵�h����}��=�������lmo���J:�����iom����сZ�YEq�
�m�������pE鍭EG�R��~Xz���ް�矏j��"U!��
{,�ԍ?�A�9��D���ZkWK"Qj�zq��G���r'�撲ӏv;��R�QEߏp=�/�V�1|�L��g�_�>|q����y�"�A�9���w�y�,�Rt�����jkZ���)+
;�
���fbg�DK�q������z����0*�p�ǀ�����̦�ڹ)���Ne�ulsK���V�Th��/Z�kI՚�oۆ�e�l'�hXv��:�t�AF�3�kQS
���Q��G�
+X�3��<��TYt��{�<�."��e^�D<��S��M��L���o$B����iM[F�C(
�p*Xwu$L��@ۏ��?�B��3���ت�_�3;��[>�4 Ex�
Yda�!a���ޑ/�����,
+����e/"�[d+c((B�O�'�`̚>�8�uz�
i���B�o���v�lj,{�K�ݝ����)yW����O!A�7�L�m��aI�zw�q�`�_����go��h���
>�-8c�D� k����m��U�?;�0�=��WC�
��j��3��(�.�IX5����PتN?qrN���y�=#�4d,��z�
L��'Ϲ�˞�4z{Z�r-: =
��j�;&'}|Ap&; =��ֹtı��ּø�
��Fus�Q(`�GA^���ܓ�n���k�W�>�խ��
��F�im�/����w/߾y|����p�Q�����gxu�澤L^Ѱ;�P������5[�۾
H�S�A,��=�hc-F��с'�s�7'`N ��i#��]7
�A�ћ�̃T�e�`�
�������w� �������T%�s1K5N��F����B%Q
+t��S�L�F�KR/�$��0�^��
� S���T�І��9`べ�>`�<���rX;z�
ʹ
UD�r<#���2#���tDP豎�p@)��At at 1#�A�)�PL�H�w�̀�#3 ����R������K��3
�V��x:at<��f<ԁ�ăk�bR�xg�
ǃ����x\3���\�3 p�2�:
��}-������E��[6���ץ`a�v
�ղCt,��n������T$X�=�M�c���L�D;)Nv�����1��S��2�E�9~H}#+�,Ziw�ٸ����@�@K��c�(Ў�Y�,����2�Ĵ3���Q�d���
���y�
+���ܳ��G�_�B~(�#+ a:/YI@ ¯Y�wۚdz�����.t*-�.�����8+8DJ���l����
�z
o]kZ /S�FZ�Q��dD�&Y:��*�qZJ�/�U��6���s���[�@^�jI-�!n�^�ijċ�E�
�E/%�I��
I�R�Z���Ƣh�3g�y#���J
v%-V0� �=l����y�
+�G`����.P�:�
�u8�'�
�Hh��]�I0��e�ᢁYC�
��Ã@CM��H�
+E��4�L �>�2�,�2����j
��b�8x�P�`���aFG�
+R�xU�D�8��P5>�$�6'�2:Q�7�X4
'�u�"LH�������)��c�� �`jV ��,V@ �V@�KV��d�f% ҆�r�
+��6+��,�!qhX������~�x�b���ZhX�>;l�B�
|��b*��n�
��:��:6����/<]�� n���RL�=q=������Mc����Coơ�JS#Q'��3����C��
���K@=u5�`X�щ!T4�N�/�
)�p�JS�'��4��^/h��
3*#�r�
�����ߢ�殡G2r����
����n��y�PA�6���#IBRT at S��6!�_`��^��TDz�)*�eo(�
+��h*�b�T���PAw��
+��K���[aC]��TЍ�PA���
+��%z1�(A). Ń9ms1��p�x5\@�
zQ+-&�zED�pq&ʱ��:/����:�.읧OΖ߭���#YO껂WO�
�V�/%}9����_�UQ~�
��w�@f�/�o��
��G�G��O�o��_0G�b�g6�f�[��28o��n���'�!�����e�v
+Ƭ���2j<�7�tRU-Y��
ƭ?�" ���l���W/]�
���{��r����<�H� �g�w����;�&p�����rhg^9a�Pn�j�X �F����DhL�F P>u &�������#E]p��N�a�)�ՇK�-4L��A�߽�7P���
+A�����r>����L
,$��K>����ރƐs�7
�8�&@
s<�TLC���`���T={
+��
����>�\��m�Ea��%Ƈ�`��w4T���
�!�2T�hּ�k�|�RU*��dL椮��Y;���8AO#�^�őɄN
�O.��t q5�EB�88�k�t����l!E���Y��
+� �b�
FŊ[P�SA��
+TE�JF��Ǐ0�c0�:o%����5����ҩ��5�)��!�ҟ\߃�%���D�!�M�RU�
��s0�жm8���Sں��ħD�d&[ZT�8
3y�t���������J�fL{#$�j��s�����:�t��
+J
c�kkoE�Y��S��X�#�Z: t�PE�C�ʪ�gak�th"M�PJ1������d�M�Y��C����O�al�"
�!18�W��
7Q���e�z�Nb��?r��B2
6���c
�����a��d�h�5��6Q���ʫ����F��$n��T��zK��P
�9z��7�
вp�y �~�E!�h9g+�f%u%���@X��v�M:�9\��=p9KwRs^8#&�j[�F�܁Fs¢�p~E;�s���
+�I�t�8Ȫ��=�!�m�(�}JG�b�$�J�=�d`����2�28����@��ü|�T�>Y蟝�&�6T�g��@J�`F2�]W��,)���ފFV)����yO�F�����i^rt"/K.����������`�#rOIA�l!ʬ'�kiR��eW�gj5¤z�V��!��a�<�ж�
ҟȖ����W���(zB�
+1�5s2Q���-O ����rV� ]
$��lX�>����Y�(�<��L>����(Q�&�eoˍ0��.��y\&vu�@�)��ʮj&E߄lk ��̿�N���e6�0�5�
#~��g�
˼����ْ�R�w$�I}W�Ӽ���1�d����L
b[Ĝc���o=�s���n1B�ˬXw�{NH.��
+6�J�Z���'[&���zӖS3�k��Q*�z�ߘ��/�m��L(ߗ
+[����E���Vs
p�t�
�o: 6��+�g��d�y>ۄ�a�9��>�BAb6���j����s��˼�@e����H,�bUf�dΖ���o,�>�C}��8���%T54��z�m����9Ty�Xsb�4��zS0i�C���Z��:���X�V
^�Ǭf�~qh���3�չ(���
�;=W_�_2-��9�&\^9��EQ��>�(>)�Pv��
�+2I���
�گ�f�.�l�
^�
<�Vx�m�
�9�|���#��!�o>^��f��$/�T7�-Q�B2�����/�Nǩ�[�3k�'���u
G�
�~-��٪����Ҷ��O�qeSxh��MO?!C���]�뙩ߟ�������)�T�v�7ۙM)R��5�z8Z��!>~��Ɖ�}n<�o�~=�g�CCu���NӪ�g��QJ
M�J��/�;�\����� H\�֞sV�X)�=0<���y�A4�wҫ��^}ɳz�#`�w���p']�>lro��y��~�iy;�qb��SQ�e�_��eN�ݭI�
���5���[�&�?ev�ر����%�Ղ�&ӇQD�ϣ��a��
+&3g&
+!
ϑ�
o���][���xF~�'���
[Em�
+O���r��C�Z��Z2���N�3�ʿ$ה>J.ْK�]�
+�ajF�k� J�_��U휳��2�J��9�D�������W�m*��#�^�gƱ�x�-��ȫ�ڂU�ƏfV-Yf��N��U-���oM��:�@J�K`H���
���)+X9�@hKG��"/�S�ۺ�hUKq��yԑ��b�X�r�
+ܦ�����;��%���Z'�Ҹ>:3
�^/�<;�/�ն�DvE�]��T��s���� C���SI�e���`y���}.}���nI��r!��ӧ����8������o��]͗�����kә��]Ǐ(/����My�����b>p�����ǵ���~���S��;_�/��Ix����Dmv������T.
��\��ΛewqY�8����:_����.x�<{�����R�|v�<�;@o�����>}���xy�m�er�����C��
MGhM #����a8^��ˋ4�������.�>���1�Nq
zP[z:9`��q�urp=a���vp�Kn/祲� �~���_'���/��g������!շo��'��o`_
U�\����x?���Q؇X��t����������ã�Og^,
+_:)m�P��:UL?�_�P�3�_@�1�"F�N����O�/�>��^���u�r����8y��-|�ur \�#"'�ɓH4��im@���u1}�}1=�$O�x_L?�?8�\1���@�RxE��.��f��8<:wyq=[�Ϯ��������a��?�w�'�m
+����Aq�6<�1|���j������ӳN�<y��lv�X\_W��硻���ے)�oj�P&$�
+n\�����Y*.� %)�yW~�L@��a���
�1&�?o�O��C�?:��|��|y>;+,,װ܋�!����,օ�եa�$��
%��`�s���TqS
+.�Y�ɳ��P��P7��E�0�j���`��+�T
!���,�ծ�S�7 rke�0������ ���F
+0��
8BZYj#
%]�.c,qN�f���e�*$
t6��m05��t>p�P\$�"e�C\:��'��$���1u((�
]�x+;�V�:?�o��M�.��8�F��sE�h��pd�,�
ߙ��E)��52��0��T�c��ʘ�E��
�@]j�lѸ
+ �n�1!�hh0�:T^]���=_�!�ȡ�h�k5�!*a}�
j�h�
!�@�]N��
+3�+���r�����4M�d
�����
HzUJ#\�d
��Ds�d�}��Mj��3
�v�c�uS�L߬w��bw�L���C��;"�sۑ\����CR�;j;��
H�`I{Gmg���l��4�
�x�n"�{M�
S���Tw5%w'�E죊�JdGm�
�rTzX%��)m��'�y�hW�߬l�_ R:)�O-P��9~1�`��$V闰*UȌ
�����ܱ�*���
��*W4����X$oLHx�2�:V_]��q�Үcd�j�J{��4��I �J�
�������8���
�r��O�����&3�����m��C�=�i?�duo�;������pnk����*�
�b�%£�PL֑ɠ��O.��v+l�R�.�"��^��vp�$�cm�q�Ga�
��
+ȘC��w���&��Ճk��^7���=5�j � �AQZ�P��U���Ƅ̢�ɰ�Xe|u�*�M�A^r�c��۽����i�^�rO�oq�����}�����
S������"Xx��(+����w�Cv��p=KI�d{IZW2.�w0
�c��4I&��$K�.���w+Ftp����0����$�U��Dٱ�
+��:�&ѕ&��R��ʌ�����Ҏs=d+��%^ɽ�I� �j:��ʊ�p��z����q��b�T~)�<sc
��w8��Jɻ�b�QG��4�c�B�4g��e�VO��=ݚ}���u����O�a�%m��Z�y��E�*���V=�l<�aM}{귐��s��gd�g�ʲ�Me|j�2 qgg���A?3�MbT?��[�]{����R��K�ťv��|�'�o:��h����yD� �V�)V����E��QMh,�
J?6�
rJvӾ�$�ă��+H�@FI���
+�ል1L�[�{
�R�nQ�Xü��:Ý��Y�`�3�Ǒ�!D�wE4�0P[
+��c֚�!{7oSĘ�p�.R�3��Q�t��Ʊ"���)�$Y�I�� 8{�
�A�EI�&�*��C2
�H:٨�L2��G^������I\b5VvU&*�[{�*"��eo�=o�5I�����F�.�(�-2J���,"�S)O��e�-������|��
��"�����v��� ������y~�5C8����H�
�p�aϔ���H�К�:�����
�]���I#Qu��#��
jB�}z4�0��{ڴ�
�{QJo�vIk)i%��K�e�.
�f�B4e�T?�e^��8'�73$+��Dg2��ښh�f�>��S@�mF�'��N�>�R��A�hl}��m���ㆶ%a�+H�a��2a�6�ǚ�
�F�zI`k5]���>Ye��N#zU��DT4ii��ԟ�R
�s��7zD�H[5y��ʫa��Y�k��ڠ�˥��k\�R1�|5�8r�8��8x\HGɅb�RWB��Nf��K�|�Z`�� ��>h���U���TԔʍ�p���@��K�/|C�J&U`��f:�vV �˲vHl����$
+�
��̶9,d�)�c��F�fp���4��[��V>i��e���R� �d
g�l�"���j$0�5��*�� ��V��c�\���k(�#݁r��7��T�Z��fJ�Ȁ�Crflw��A$Bh���e�}��
�Ƽ�A����
(UǼrMC
���T
�?�#��HŸ�$
��iĔ��q�r�a,4���7�F��i�8N���I�RB�,
`ꌋڗb�&���+j���$y�����$G���l䭴�4IU(�ƈf��T*M�
.V�Z���2-0Ϋ.�S���}�=2Q,�# �M�k�)8��eJlxPY��dA�$ŠI
�Y�CrJ
~FvhU/R5��{[��& !N��W�ed��h�4R���*Yq69�O�w��Q�rl
���
���G���;�v-)u}
�'��*+�����t��E� 4{�� ��y�Yn
+T�n5�
���ͧ��n<��-'M!S�8�_`�((�2�&Q�s�����Uן�TX�v}��M�����p�`{jN]��)���x��E��Jn:�(U[sBG,QZ��Y6��[QV*�x<�L{���R+Y@�#�E(:Sdު�&)�ls���/��Q�D�R��<D�&-F4�jO�"[�{
�͒<6Ǎ���P@��
ţ8�s����IJ�"������lly�%+U�ñ��jDsdrpv>u�$B�5f��~U����t
�&_cc, lW.����A��@ �~H��|
+]}�!Bo
,O�}������oW��b������S�f��v��"U�� �+A �!G�ͬ��
�s
�)օ���
�~_�S<w�,c�;X+�>��
�L��L�
|���$ʒ|t�5ֶ �=��`-����~m/�lfP�p����݄
+
��/�<,��偤e{$Z����C>i���IC�(�S�U����ڼ�l�)�s|�v����c>Ei�E���un|
t��Xs�
�� }���z���hƝ���6�F
�XTg]�y�y��tW��� ���ou`��.�e��`�c�+�����Lc�_�O���ؙA�P[���<@�CtDn�NHU����-$p��j�웶�x�d :3z�[�Y{҅Ո�C:zڂ�
9;��W��� �@c4'"&F
I
�I:8,8�O������̀r�[�H�X.`v�r*
B}�ؐ��������Q���ǯ;%�{I�֠�JJc+Ĵ��l��:�}��G���Sk��{$�SW.����Py������Ԅ�E�|�=��+p>���j������8esK�����~nn
Up���N 9��uO6�r��!�tB����x6?�Ѯ���SɃ�V��e�{��]%�J����x۔O��TR�5S�b
+G?���=�Ї�(�b5YT�91� �2ė%�u8Eq1߆[��F�'�;`���B�R��3�T��J�0�2��� ҇��J����j3����[�HG_S+��WV
�K� m袕,\6۞��=M`F#�D��P�-))��X�r��(�&J��mƉ����1N���-q�e��*cX��N�(�ޥT,(
܊�cj�'��
�%����6!���b�1@�� ��W�I9����x��!t��z>� �fG�=JGM�R�Q:�p�\���g �
+�4ݞ O)䐮�i��q�,xxȸ�KD
�d�R`R-N�.�{�f����������4����z9@� R:�C�.�����
+[�@8�{�
+�
+��']?z_c=��Mh W�g��-�X�$�'�@��@y��ӱ��|�#�����]Zn@3��50��G{ϛ��Y�;R�w�����MW����Ld��R��1!{<�(�
��+B:���Is.&�8�m�y��Z�y�X$X�:��
�ց���bFl ��� 9�=�{�g��{�3��8n� �����=jU2���G��GF�q�u�(�o*jsr�
�p�O������3:rq��e+�V1&�s����s�*���Ʋ�;������6k�
+
�$�o�(b>>-lʸC"�:�n��S���?���{R����
�w&r]$����&���
hɂ��Mi\��P
�5��d�P3��j�X�Z�����&�L����s*l��04ԍW���yR+#�]�,W>�И�6�J�n:T�R�K�tr��
+CV�*�1:!^jB�B0�`٨�e*�)��3��,��K���:���p����Y�Q
+Y.�*�n��+%�
�� R�
���,�E��i&
���
#WB���
��+�
��Mc(�
�ub�lND�Um\dp����.N��p��+�?
����4��� q+��r�?�����Uڞ5�O7]{xG��#��)x����>�J)�V�'� �\+�-IΦ��]V��b�����M#
����S��NO�J�D�g�t{h�;��RmX�Ȃ�x�u�D��i�安c������¥��ƶp��PHV
&�l��y��LiP��KrWl^��h]������Xh�8��X\Jͽgch���ō�2�{E���i,%b���W0�����Y+����&�J�E*Ä��~�G��F>���o��|>�l�Y)K��
���1x%���̯«�ƫ�D�����΅FP*�|ﴄ�5��=Hm�#��
&�7Kr�r � R���01��Pǒ�LK��-zw��&�躒f0�4[��
D7&��?,hţ�ɉ�qV埔C ��Ǯ�&1�ڵ8j�ւ�4�z0鬕R1�T�V���[M��U��~���մ��� ����~���A1��=���[���d���^]cM��!�T~�)n���Gd��L�R\�3
|8K��y��h���_fF�[��ș=��
�X���Z����+AB#�
9�MFv%�xAM��8P�&@A%)�u�s��"��8TQ��^e�x�N�_�\ ����ӈ�b�6������1�������T{l�-D�49��9������NZ�����g
e�Q1��kPs���/�s��x���,J}�N���r�8�GM��r��QJ
��7����8�lb���c�h!ޒv�������Kc����u���y��d�=[���Y��ɤ�`]��
Z
��$#�ҥ�?��Ji%���5��W���Hῤ�=�Q�ZB��>�$�z�mbl�}fB
��l��1:�l�µ�2��JU�٭7���@ȼ���V�eH^�b
�So�H��
�M�
��G7� N�8���J
։�<
�@�Qp�ї�����r����{l��p��ơtί�m� �Q�?��ʛ��g�����>��3{���rUG��rn���c܄e1$��4ؑ��������O���C������7x��
�KBr/���
�5Q��{�q������-���p�s�ҧ*1[���,�?�ծ�� ��2��X(��Q�芴Q�TN�"��Y^��9��w{汳��,O����p��� �QMֳ�i�F��!�O�� gq4�'�lBa4`B�
�
����C�ߖ]�Ä�
��
+���֙���K���\�h\�1j��x��,�x��-9L��?<5��"�=��s�#�tWGk�ёC.F�QZ�W���Ë�BIA����UmՒ��5?�}�
+
���Zx�<����Mr qB?P�����R�J�n̑���*�r����ςN,����P��-A}$Ot�.���<Oy��q�^
�,X�k�Jv����|�
+~c�
�"+E
���w�9u��`��ׇ[
a2e�2R�z���1�S 3���Q�XjZ����l� Xj�� |�'3�U
�A��c���)gT�qJ*�z�<
As�4�v�]GUҿ
�m���9�wB���fek��dq��ԃ]�r5�ذ�`�˫
��k�L=u3�He�,�t��k�M3��Xv3�8��EmG�jF��p�3ft��(�N�x$=g���:�괌�L
�a ��\����J���G
aj�w
�{`o�6�0�L�2^ Hke��3�]�+�:��2���J�
�ʐiL>bPV�J�R���ځ�16��J�!��O�<�����K���\��m��`��J�1fݰwx�5o�.B� ��v���]+
�H|Fx�,W��9QN�����nq�l�Gw2��k���,�
+:I���H�8-W"%!��g����
(�s�^�D9!h"�Xy��2L^�m�5�N�(�+'��IBn�'�/��6�7s���ǛW��p�|(҉z��G��Y�%�2�?����Bj��
Ar�b�[�t����
���쎩�+�!/L���Yw�R����b����u|�
wܷ��~�k��߃V�/(z�= I�gHӘӂ'�G�:R�U��G��F~�B�3c\�5�$���j�������������+���ݪ}�ݼmu� ��l�� $�"���{ݥ��܋�
���q�ޒ� AT��
endstream
endobj
17 0 obj
12647
endobj
18 0 obj
<< /Filter [ /FlateDecode ] /Length 19 0 R >>
stream
+H��WɎ
����P7
����Q2@�
�4�<� MӠ����"��隮j��C5�dFD���������7��~|��_O�����.N�o��wjz�t�ӓ�?=qt���N��L����L�����H����,/�~:��fv̐�f�-O3�
S��
��]�
֜�~��
+Z�'ؠ��~wX>SMn�@�7�<S͑=O�a�(�F>��Ƭ5{��5�(=�������
����5a֎u�qZ���_<��[�AU�5�]��/}c�EZ��k��'�F��k�RqW�#���@�D�V�b�R�lHl�����
�
2�F
+����
���i`��A�Ϡ˹�E�����ޣ����q�oJ:m�Db�M���㸔���9l�ø����z� ()]
����f�e3{�
�Q�7
D
9�� �XI at K��Y��
y��4�34
ӳ5ތ�*R5>gP��?uQ@�/�Ɗ<gS�a�X{Qu���saAh��o
�}�/� ���mZג���V��C
,<nɧ�
+�P�(�2��f8ڎR���盦B�(�k*�
c��b��,TxQ�H��y�p����W ��#2���WT��]U�o("� �
*R�Y�4�X�TQ*F��o3x%�UtI��^�4�f_��@�\�.��m�ߩ"H�UFk*�y�S��-<���(�G�t]�bT!� �
��V�}��
B��F�:p~5�v�,)`4pH}�����6�����
���*��Q%5k �a�ڽL�}�QR�Z�#�Za?��
+�o4�6[Hq�>��;�� �J8�Z�����$��p���`�C��``Y���Ƶ���� �/K
�Cpjm̃�c���Y��
�;��l\�-(nb+T�X-ec�J�s
*��'��Ҳ��4��f���yjo��a���B�uk���ټ0�4A�0h�ֺ:r�J��9j=�U����a�� GA�����EWas�^R���+G���%�;
+J�e._����`�{��KB�u
�荾�T����
�/V��,���n5nv,l�ReA�0,����Ls P�R
sDH��4n�_Y?I2LV,��~.9�>� ��� �n��}�^ �.ʿ�z!d�E�
ƥ��
& U"{Y�.�RԳ�uA�Z�`6m�T���"tHu7v��ʋ�f��v}/
��
B�̕�����(������R���e��<��?:��J����-����+�wgZ��a �����^�4^;�w�j�ہ-����(O�9���EG��H��5}{�e��H
+�|�-c�%Qi_��[���x�&���s vWo��J�?�"��w�
o��[��\�E���+��
+�MLyk�F��L�垟���0��֣����by6&�4�*��
+
�
-f�S��&������e��
+�i<�
�"`�\��3h,}�{f
�x�
v'ࠨ^w���[25�N�oQ^
)be��*�
��d{�S���<�EB/�s���(�!Ec�X at y
Jg��k8�
�M-��c��&��)~h��;&��I
9=}�\&�r��,���$҈L
��2Ό���t4��H�ҽ�
�`�&�(O��+lH�X��5ӛ������$���+�nj����9)-��$zj�%aH�l �k�/�AO�����t(���6SO�5� 1�˘Ϛ�-#���y��@(G�H�g��"
����<��͢X-2n���U���+��\�A<����!Eq[�,�xP�#;n8���Q��.��X�9
m��>c@�GUv���]
�
D�;- �<[���
ő��F�Y!��J����:x\�\M��
WM����YPg�S~����&a���>�����l6�w���I�\
+f
4
-�w����UU��]�M�3E?��g��s��GC�څ�T��
��o�b�I��/AZ�,�G�N�\���*�co�;u����~�
�nS
��zT������D����Xӭ%�:
Rc6�9�-Ҏl�5M7#m� 5�d�9����j
�aϠ���nAX5��VsF����ĺk?
v�s,ʥ��U�ĺr_.�� f��@XT�[]�ؔ&���+x<DŽ�ץT�L,����$��6����+=��" ����d����,�A��m� �Q��Z1L�F
���l� ��8*��9��89�!�2p��4P�y�v`���<XUq�KpP����
+��_a����o���w�>��)�)F;�YV��
M��%��}�_0��~�{�:᠊���J�7�����3~=��#�c���LO?����
+Y�X
ٜ��
�q�1D�+�yσ
c������|qI����4:Yl55*;�nX�
@Y��X��DҘ9E�b�̕U��BfL������c�(+���&�p1+
�@ZjF|����+ q��+�,�
lb'
��5�f]C�@�� �)ُd}�&�(��Kb�o�x�����5�e�Z���
3ʶ�w�a��_O�W��%(�L�ׂy���+0�2���g��U��-bE�[�M����v��k��yS& �Ax��[ }�'�$��FTȘ��R�k�
\Jn$fJnH��N}�
m���o��`��QAʥ|
*�-@�c*���l�<;�
U���¼�ͼ)م��OBI m
6��!�Յ1�XL���
��;�b�UF�X> �( j��Չq�Bqժi�eC��j[V��T!V塼�{g��A�0n�3=��\�1O�
j�z���7Z
W愌�Z�]I�x�E
�+2O���oA;�AOCX��p���O�O}\ZyaƐ�B -uJ�媱r�6)�I��뙪��?֫h�a��
���|�Hr��}�(
�OC�h���J[&��'i�F
��u�ќ���s����v�>8�]��Hg���9��)�&J5�9)��k~
���-u��ܢ�D��:{�G����O��5mZ~
��θ�pw�0����XR�OH��8�H���-�VY��nh�ij��5"�SIx��I+Aqz�AF��[a(�yO�S4%7*�`XM�w[��Lp��$����l��6{�辙
]�8��ۍ�O�=j��j�SM��:� �p��4��%#�C�`u
PH\��iCz�!�E�|
+sh
�#��O������ԵM�CR�\�/���x�O]��-o2CG��i
y����w�1�Z���/�U�I��`�D��#:A^Ԫj�8��i2�u���Ww�eQ�-�oUM�(��F��,�*p���NYQ�M֨O�l*U7e�������P�@.�o&?
�5J�
endstream
endobj
19 0 obj
3254
endobj
20 0 obj
/DeviceRGB
endobj
21 0 obj
/DeviceGray
endobj
22 0 obj
<<
/Type /Font
/BaseFont /DAAXHI+Myriad-Roman
/Subtype /Type1
/Encoding /WinAnsiEncoding
/FontDescriptor 23 0 R
/Widths [ 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212
212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212
230 337 497 513 792 605 188 284 284 415 596 207 307 207 343 513
513 513 513 513 513 513 513 513 513 207 207 596 596 596 406 737
612 542 580 666 492 487 646 652 239 370 542 472 804 658 689 532
689 538 493 497 647 558 846 571 541 553 284 346 284 596 500 300
482 569 448 564 501 292 559 555 234 243 469 234 834 555 549 569
563 327 396 331 551 481 736 463 471 428 284 239 284 596 282 212
282 207 513 356 1000 500 500 300 1156 493 255 894 282 553 282 282
207 207 354 354 282 500 1000 300 802 396 255 863 282 428 541 212
230 513 513 513 513 239 519 300 677 346 419 596 307 510 300 318
596 351 340 300 551 512 207 300 319 355 419 759 759 759 406 612
612 612 612 612 612 788 585 492 492 492 492 239 239 239 239 671
658 689 689 689 689 689 596 689 647 647 647 647 541 531 548 482
482 482 482 482 482 773 447 501 501 501 501 234 234 234 234 541
555 549 549 549 549 549 596 549 551 551 551 551 471 569 471 ]
/FirstChar 0
/LastChar 255
>>
endobj
23 0 obj
<<
/Type /FontDescriptor
/Ascent 831
/CapHeight 674
/Descent -250
/Flags 32
/FontBBox [ -46 -250 1126 831 ]
/FontName /DAAXHI+Myriad-Roman
/ItalicAngle 0
/StemV 88
/XHeight 484
/FontFile3 29 0 R
>>
endobj
24 0 obj
<<
/Type /Group
/S /Transparency
/I false
/K false
/CS /DeviceRGB
>>
endobj
25 0 obj
<< /Height 120 /Width 128 /BitsPerComponent 8 /ColorSpace /DeviceRGB
/Filter /FlateDecode /Length 26 0 R >>
stream
+H��W�n��/�
��\��$Pc�+C.l���gUz�����{?x)X�`v�4��@V�:�G��p�y|9�;;K�H��A�,g����9�\�Vqqq���|_]]a0�m���h3���m�£�W�~xxxvv�ן;��̼�� ��o�A��lf���xv�`�}�xLv�"�noo��m�'#`���wOH��g
x�Q�j���d��Ӄ;��i����W���v�y����߾r�������|��w#����稇��*$7����g����zkk
�^����U}O��n\���~�%�a�T"@�>/2�e��������~:� �w>����őd��
+M~�j
+�̘�Le#7O�q������-|���8������I8�b]ˌI��y�+�n�?Q�ɼ�eq ��������z��mcʻ����y��d���x����m�8Mhklx�///�H�����4H
|�H at u�W�x��o��<���nw#���Į��ϗ��Th�#
�k�d����Ǜ�}��7I�����5��
1l�bKv�C�"�<}�,�(�_���柨[I��ӈ�[��eJ�_AA�(�4lM�����~[w�
ڀ�B�i{4�5�a�_�� wZy
+a˫���c�9JcX|���o�rl�d��ma�<OW��P������i�\��,2���v��#�)SU
+2���2�gJ�� �
��I��*0KXypp`�d���
������PL\���X��V�����
�z�����Gb�p~~�~ah2}�3�qqmm
kb�?�
Z>�C at TI�ͮ� �^���F!�&���J��?��`��C�/�h�9�����M9M
4kP!
���/�vmX�?qKNg��O�v 2I8�HS7���n)���������2��V�����9��(@R�En�jv����o���_�
�é+:k+İ� �9c5e�����S����C�߽{�税س�B%�TBv�� �p�� b�&��#�www9@,V-�-!����}x?VVQ�0��.l�v����x72*��2
������'�>���4�����
���u&n�d��S\g��&&����*�3����FUW$/��g�q���&?����#�M܈5�v{�����Pl��짶�����k0ψ0�>e>���s���f�jwLcM
nD8y�
@X8%����ʿ��%e��Ç���{����`��1t
+8 �R�Ǐ[Q�����U*���
+9��k@�y4bkd�&e*P���.b�
��������mZ�8o{����
hݝ,2��.�#č�$0*�`��w!�$��^I<��c'����[�V:�e�`{4 vcH��̧M��nt
4�O�6�ņ�@���X$� 2�Z����3���L�����3�AW�`Q2A�b;� ek
�����k��
���@i��hh5�]�1
^�������_S�.=�� (��P�^|-�7���1���1�R�p�f�ї��?Àwi@�a1
+,A!n��
�g4
$�Յ��]gz�aE`i��N1�¿��SݥO4��"��_��"xA5��ׂ$T����;��qle�Y"���s<D`bKg%w�m�
�#����kR-ʦ����v�i2���Je���k�
`oۃ���̴̓�_m].�0��Z�r�U�f�ʦ��@�l��%���嗶`尒z�G��Ge����
T6�tzz�S��e�,l��i���θ;j�R�2��?�E�����+���fZ�L*-���1���5���_d���"%A�'�L&'�'�
q��[P��u�Dž��-j3c09�
$��#S;P&셬��~�s
���9o��>}Z��LN�
+�� ���v ��������2>jaA�7�|� �U>j���L����.2p9Ni6�>�:�ha�$���S�F9�5����
r���,�J�բI�����V�
E�=�
��
�1 t�(��.ȕ�_����a����s4s�NA��QS���
�?�
0����o9v��e�2�� ݳ �O����=�l�l�T�/
��N
����Z��/Ҿ=�`a�@��9H��LV�J��gZ��=�xUj`��:�:.��7�K����t��(;HOk�n�G�fj)��P
]��#�/�#�,��_
8HLa����+w+�=��8��$N��N�J���
�������?Q��kٳ������|�2-
l(d�*r��`�����P]����w�����"�?�~?5�4�DnO�iΞe�|�Z�P����$��Q1�!����# ��ȟ.���h�0��+/��L�]�L>�
�P��w��"6?�H����! ��䢲d��;�.a~\�XbÈH.������j�<Ʋf~]
��%&<���t���t�L]����
�
+�5��|��T�?��_~ё�(���<0p�C!�Ƭ^�~jbĮ�Ђ�d�7��v0��
��P,H?5w��G
6_�*���}z�lX>�mz�vI�
rG[�f1��s;d��|
+�����w�*�ULu(8p��6�>��O�^���
S��[��2A�S � Ķ�mZJ^�qС` b��y����n|�K[;�B��������u��� ���
��7>��黃2_*���YR�0~�#���W�
ߜ�����X���B
��#}
d����^ĕ���k�t9Q��r�.�Q�P(8�u
+������x�W��ny�tN�� �'�lmmi��WE� 4 �>�Z��ʡ`�%
��
Kl'ȧo�J���Z�ku
�jJ#T�Q�� �do�w{�
�l0~ŋ�
+�ћ�.x
�t1� �E�c��_���S믩�^��[S�/�ī�E��y�7�p�Tw���L+
]!l�6��:����n��q�Οyk�0
+e���4l< �θ0X:
� �7;���R���7�0Z��W�<�X��:��/ۉ����^�p&?����H�
�Բ3�
�
ןx��ɐ�q�` hZ�?y�T�9�� e��������ب\
��3P
� �h�y�:9����'#����
+�[����.(;>���\���p
+����k� ec_[[�������A�Y
S:J]J��"�jB��
<P,�<qϋ��\0����t:z�^��������Lگ�a4���*0����Mu�E&G��y����@G��~��
+X�Q
T�4�A|�B
�>H:�����w��Ӹ���m['��ʡ��\�#-��!�V
+vC�7u��m�R����/y
�ߖ�`�*"iX)��As��*�l���p��A͕�w��۬
x�
+������}�Ǎ���gb�n�n{
��|Vsf� �ƏC̿�� ���x� ����r���D��[�x!^!�
��0��1��a"����4P�
���̍�G����i��% S���|;q�WWWH�/������G���
����,�p�5�,D�WP>0f��7/ҵ�G���Ts&<�Y]��U^^
+���A�֩ک����;;
+�һ�jm{T.f�C̏��
+���[v�]KY-`�2Y��P���1忛+�P���Qa!��<�L��x!^&L������;�R��������WQn�0;�������i���8 ��уp�N���}
-��X
X(JD����v��sLv2@���A 8
��y�UVէ�,�N�:�E�cV���4y
>?�*I�
V��<Ɏ�����.0\��!�o_�h�e�}�����
��]���TԪ'��������K�[6�h�� ��W���Öw,��Rvl�<�2b�G!���u�|��E !E�m
�H�o�t�R�r���
��v��wF|�<���|��AU�V�I�;,���Xw�Y��me
h� |�n_4>d�
Ӥ��
V�3�;�V/J����P�d'(���V�=q�V\��P�6&�
�3����b�R�������m> c8X}�@�$�ni��Q�X�W��ヵo�g��ډ:�)vG�*,�wC`���yy��f~������ mD'
endstream
endobj
26 0 obj
4047
endobj
27 0 obj
<< /Filter /FlateDecode /Length 28 0 R >>
stream
+H��Wio��>��?�H�}�"$l� yLxP5��d�
'�~�����{
�9�9u��w}u�>����}zz�����:�K��gw�!�HM�H�����.�k�D =~u�Z�I��9~i��vi��L�[��O���4Z_���Y�O���MvJڿ����t�����6��ç���GaLD�ie"%%� �v���몳�<9�I���Vaϟ_\]���G�a�~=�ҷ�)Ͼ��"|�(�1U��HP
-��i~ʶ����6�x[���1�'���ͫ
��H 0V�~__~N�/n*����憛A��l���<
����)�;��ۗ��!s���}d-�����&;�m�}I�{�鑽��>����,Z�I<
3+0�x8
_����=H�I>5
x�*�?%�m1B�~| �$Z�?
��GKǓ�x�
��E�����
we�,���lu��K�h��W��}�_={������R������YVBL�*�S IYC��ZYA�ԃm�/
+�n��7���ć�K�����
���u�K*�?0ί%�sR_ �r�z ���� �d�$@7��+
[�@ϻ
����(%�ka�{J>
�9H[�x 8�Y' �֩��j�^ @O����7R��ǹ��F��b2����п[R�Jʇ̨�r�TP�
�
�֢��v-��"
+6��_��3JK����A1���
NǮ�
+F�m��R���X4�ySt"R
+�bF���m���+��
�mt�F5��Rh�F[
�W���X[Pp6\����89��VQ��̙%ϭ�bI��UQQ���
���¿_����&Zq�c�8�=��j���R1�Ƃg��`=8�,��{
���4�3 at e��S�Y JP(��cύ���
+���� �?$8�`,C�������
��jtz"
��/G%3��R�B������3BU�`
+.D3��%x
�(�BA�p.be��1m��,e(���)��!F,刱�
����
����䅒]����o7���O6�������]�5�s�S:����bM� �2a��9��v����!���*,z��2%�
�Ok#��35�iO���B�������o��-�V��Q��[s��#����%
�ʅ�{d���pqB�����F���D�M����\���7��iv�;p�z�Tr�S��6:B?#��n�,��qHS
�:�[��z��
����@�����a9��d�����FG�
�� YP�du�Y藪���1��
8����������7#�_<ɫ�|�~����%s��B����
PƂV����#�Tn
�]��F[�=�
+CC�@n~k�0�⺆N���
ܾ���@w�y�c�;`�k��n��_���F�V��ɝ�s��S�ʸ%�ϑ����;;�
:F�
/�,��Z�u�x9t�~C(^
Y����3�>�]�` �T���
���Ѝ���7F�ܒ��a��=k����FAx
���EFk;X:?l�QNT5����z��~�x�O����Q]%��-�� �3��!@L������*�E�L�B[�9'���E�B�V�`,��T`cKu��
+ڮ��ܹ���{�&FT��ʹ&���?mm�V�����B\��
]�,��H���]c��.��#
%
�2P�t�~#�K� Y���(O0�w���(��Ą2F��`
]f�K��jt�
H�p��a��S��Ə
�V2:��B�SD��Kd�͌q5K��6ECS5�
&�i���Q��*1Q��%b�!
�r~J%a�G�Q�-�R6Zo�d�"@
Nq�0�f��������4?�]��CZ4LQ����G�榊
�T$W���$��4��XB���D���q�g�����8}cGs
E��X/`�3�J�o����
.��͂�BET�*��Jq�6mͩY,�P����m�&gmX匲tN���|G#���?3�#�;��G4��ڨd��
��Cm1|
0j�
��0�
+������QۿgJ����0!1U�l�&&
+ �ik�� ?c���\�0�����2G��6~|h�Z�`4g���}m
�
)��fi2X4Y(�
۬|�uKh5k�
�M����H��̓tF6���$ň3[���&�i��I&`S�l��(5U��_�0�K3W*2�d�����AuQN:�
8F=�쾈z�,h}���ܑߠc���~�,ќ������;t�~\1�ZH�G�?�k9�t�7�(�<V�q(t��~�,Tw�յ����*a�C��
+��/l���7d!�7�Օ�Z�p�|Vl٨�F�G���|R��
��
�#��_ZD~M�#��V���
8�v��F-��
ل�N�ĩ � 7�����s��t��IA�&Mn��]��0���{����bށcRV�b�#�IY����w�����Bj�4��żG6%h�
BA� �����G�F��Zj��ƿq���,�It�(����٤Op� zM5]�63� ع23)����7��g����@��Ƈ.3������c�ئ�v�J"����g
U�����(Ĝ-+�6O�P��T�M��"�����g�O�T,Թ!vjئ�
��+����Z�bn��m�'�0�U�sW,�
c�j+Be�j� �Wz��
f��v�xB��Q�i�2�
�;`�$�l,�U�0I�
+6+�lS2 "�h;/��C+1����MФ
�0�
X�P2�w��
ک�YV2���ᆀ�T
��Awgh=y3Xݬ��pK
�����z�����2�\$���ȦT� ��Bq���>ل��op�,�3wA
�M��DS�L�Ì�?�ծ$In����e���tΑB�
�ؘ�N��"��
%�H{
+�UM�5�Q�A �ѫ�J9q��q��)lB�3�Ѹ����G▹��e
j;�)��iu�|@�m.
�y�ܡ�������lJJA��~R����%��a�C{*?��ʑMsD�Ӳ�$o�L���6|i��6���%�G���k��m,rY�ݜ\
�4�p�>�����
���5Q�K����#�J�����)��� �sƮ�q��LN�l� v�Q�)߽����
�k��iȩ��rWU%�w`;K
����ZI?���d�����.�ᕂxs{.��� ��3 7��/�o�i���bvT6�E����_l��<�ʉ�aLf��ۜF��5����d��긺r*'��X�ЌObR���H
%ߟ!Y
+���x<V�� �Eaȓ�rfb�c"��EFaQ
�lGjn��\��6�&M�6��!L�td�;
s��T�y�So��
�8\G09r�c�THG���
f���fʳ��ۈ{�y�3vo����S1
�Fb�%����Isy:��A����7���o��
ܷD[~
�
X
�C���� ��Y$ӃDai|H����XF����S)l#��W����N
�#�@I�Jl�
��h+l�@"�
J�#v��U���E�g�y�_N$D��P1�
�뱷/���C��2->Ęz��g˯w�"1|=c�m��?�b�ue���McT��v�`VQ� ���M�B���3^� ��c��:=ؤĸ%G�D�$d):z
n)��96����Uc���Y�5��X��ZR����>�v�I����zZR�.2]*
+��~�r�(�u,Ef�31)l#1� L�i}�k{䳘�l���0������RS%���>
l�m%;�,��%��#�?������������o�������W��̰8�����?m��#�-\�5VZ
�*��� l����i�ʁ#Ø!��o��
��<��6��V��W<��i9���;�
C�:r�M��6��q��o ��2w
+�����_~��m`2�N�@9q�{ahk��($�������,�ǭ�8P��v��[��K�~z���
+P������n�bg�6'�l�`������~~�AҺ��-E;�Z25%�-���� �3�
��Ru��KTS�(��whT%8�J��"��2��#�@��m²c���t�m@,|��q3���L �M�
췛�O�&DQ�'��o����P��Q(1�n}�����I�x�d
��<��60�
tƚ W�5+�s]6��lZ�8�k��m�_ѭ}x�Aڻ߷��nUdd{�G`}���v����ot�m���
���<x�e�
�r��wR�9�n ����>
8��eQ
g���t�jl#1�%k�yz(kl#1�
q��X(�h�Ʀ�����D�JE�pU�
�����q�hwK!`�R]�<��Dm��F�:IQ�4��/D*!3��.+��*wYi`�b�]�
X�TAz!+��ĂŘU�M�
+�����|_��
�݃u~X��R*|�L= /O�(6k����%f�rd���㵞��e�n����Ĥ�
�
��VIw;�)�����-��{
Rȵ��,���|Xgr gd �$�ܡ�lf��`��
�z�b�l
�ρ|��}��-ݗ&!Ǹc�l�u���}�!Q�{v��Q�_�w���{�]h/j
��ͼёMk/��S�i�5`���>�MKP���ڂa��=�>��%�*��ϻ�M�b
+���g��"/�
+����t��k
f�f@�l=k^��s}a��Q��؋X�Sh�����䩐b��dX2��:�����?§�~{u���K̘�!�\>$Γ�C;M���ka���4*ױ����A�a1��ӅI;q`BG��3iU����"�0�d�/�~|�C ��;@dS�����u�����&�RL/^0!MΠq<|L�\�2���.L�7Ɋ����X��i彮xk��f�����'�ŭ�8��f���i4j�`����x��ՙ O)�����
+E��Ud�,j����c����^��y�<�Ia{��Ѭ���U�j(�s�9��\*'�.��E�Q6��f�����D;q �X;PI�����8,V��y�ʉ���`���
,~F��q�8P'`��2�%87�s
+�H.៱W8�ȋX�?�v�t
���B [b��3�<p
�#{�s�J����^z��6��Ϡk��LG�'�MX�A/ ���-&xh��ߟ^��ȕX
�r^\�vjl)l2Ŵ1*_n�0C�� GL�-��8 GQ�6�{�dĝwI���&�
��XC���W�Fr� �Vn3X�ã4��.��x�H�Jx�p��%��y.'�r��f�$��3�� bѰн� EG
x��E�M���-?��R8�XP�hw�a����,��&���l��Y�$�x���{�Mz
+YR��)D���C6��\�8{lp+�Q;
�R���ג-K�_��R�|Ǹc�����
Q�����W��n���E�}��fg<����3�8
�˯>��
��$[`XݟE$��
+��^Z�DN�gۛPY���=
DKaB�FK�7e�ƽ��nw`w���Dm��ӧ>����uE#%���yL�m��v
���B�dY���3�O�6�»�d�.�A��κ,+��*�-�,�#�U�v� �1zB;Bg�
$
�����UKa{����
W
R
+�f�|�:�q���q��
�IL
+��o�t
y�B�
ZE�ٜZE�ā�u �'q
|A7
���9\��x�@�
�2�t��
�d uga+� �
��z���
oB�Dc�<�ʉ�\�@�ǀ���@pQL��0%0�;z��۠�^�=oh]0���4n�o�d��D�˹�$Ӵȓ�)�uoBb�����
�mʓo�bݝ��5=���o^�!�NW珘ˉ�
�Ԋ��
Ȯ�{bR�@�SM��h�Z�5�UL����jY�䶁���>;�%� A����G�|W�
����w��^=d7Y�
�+A�HH �
�O$F��*�8/<���ڙa{�Ҏ!�$8<;Ѿ)��Ow4[��ƽ@�H�7+ʑ6N�4�qo��[�֝����3HSef�����
)oI����݊�e�FCiZ��jH�5 G��Op}�#扂Q|y
+4�5� �Q�pվ
_<x���
+UEOT1�`Q�R<�-N.H9���kxY��K�bH,
wۊ��ޭ�>�xG�q���G�����������c�"�y�(g"]�H
o��ƁR08��W��Hŭ��+~�6<���p��
p�
�Vk?5�/�5��%V;;/���9xѥ��Y��)(�Ψn�ǁ��(/S
^J�@zv��`\wŴ-qo��l1g[cO�
+f8C6�q³KΟ}�Հ��ܛAq�z�h�ٙ���+"����� {ӎ�,�C��'ȫW{�Ĥq��
��p)�ڛ����vA��+
�2��O\R��5�!�P�BE����4J��0p
+B���+S@_beÛ!�z�R������A�|2��\�
QV�I^��8�\-ď�
)����&�4.�.Q�r��'�
���6`
�@5lO"�-�"&v��_���f�I�z^
^Fl
�P����������H�%a����
+�i؈a��
DC��x�Q��`k�d���~.l�qB(����q��k�kw\%M���'H�|�}���cFۃJ�}��263�T��p���p[@����qZ���Khlz4�,A��R�t�fnD����h!��y8
+�I%��J��Oq �
+���îĤ*D�*ӂ�3�iؐ
#a��S��$��=8@���U���/��a� �K 8�bd=���5�YbR%ݛ!�e�\}Q�����-QkgGe~
�Ŭ�Tq
�s����Y9��|�
+_h��5�a�
8Q!ˌvu�GR��M�%�&��ɬ��Odh�}D4��2�]AW{�K�?�^��ڛa֖��,������ܟ�~���߳
+M1D&4����P�$��߿�G��������&�h�Gn������2���$��4�\�-ߟ���'�=d�S���
4|��Q|
s���A!C<�O<��@ �Tv¨L��$�ߎV�'I�����Ͻ�D�$Χr���鉱������������w
��F�c�
ɟ~c5��-g���Z�
�;N/wc������
~R��
�e7d6�a�S�x~�Rf��y�+��r��h�w��+�A@`{���J~�~�5�|;/|e�6�Y"����Є�'�h�䠊j!��#\�6r��ⰱě�;�p-DC�Y��\���ú�:ϐ�ȿʐ�K�!'�L�z��#Z��e��]�x<�WH�h�J����וx0>$G2+
���E��1�0=|��|�dLW�CaD4�@�9�dz
H�!�'?����uGSQ/A���5��:�U��q���n"����K��/�W����W
�!غS�"���T4B�~;ZS�zI��
G�ِ�����\�h{ï��(��)q���q�m��룵H����cv�@����
�<|y|��~�ۗ?��G�ę
+ܧ���
���v�����I�'J"�}�-qkS���8\Ҿ
o[����Q�nJ�ɧ���"����+g�&ڰ�v��!�+o�v�
�����9��
t<p�5
��ڔB�/�9��yա���ۏ�F��]T�a���r";M����|���.�ݨ�Nؓ��5�̷�b7��mS���a�DדAt`Q4+A�gDR5
4
�c���Q$���m� �;�j at C�
FC�4I'֨��%�~�k@E���^.͢��^#f�."� ��
��7CLN�/E�
�!9_Z�
o��H�-Ν��Y}��m`.*|Nޏ�b���,��g':!pgeIv���
9�ަ
@C*������k��!�$��J��� �CM/����ٕ���i�I�����Z�g<���e������nba���V�6�n�)�ׂa
�N�C��u���_������O|�? %
bsы���h�x�X
4����K�G�?�.C������%=�?x=/8�CNr4��A}�BlR
+3g'�F)X!-8?��Ѻ�
֕&t��]~a=P��Ahkc�}�
*g��Kd
���̉)~{�j}��=]e��p��Bk�X��w 1z��/Y���ڛA�SX���
�T��*g���-�e+�Z�
�z��P�� ���t�k
/�]���r��-o��_N�nY%
���5��V@纔�ü�c�i�0sa�{��r�=��`�|.��H?����&q)�8�����@<7��^/�՝)˥�X{3Ĕ<
��� ��Lǖ7�8IE�%P;x
��T;3d)�����D��X��̄�
�E*�߁]艻�r-�!�P���
6��R��p�E}�M1U*�/���~�ƃ��=��#B<�Ea�a!n�^�s^��N�Ma�!��z
u�
+���88Y�(;���5n��B�%�;��[��i�qd�
i��B �>Yp�-�Fc8G+U�6���<�m�����j���>��
�J����L
�?*�;��ߛ����2pG^����q��
�Y&g�[���G��
Y�I(Yi\n'�D2�t��'�DW�Җ�KU
q��Cyڼ}��ܰ��onhrZr�/��H�DU/���J���-yp�Hh5}��4#��C_`��<n��$�VH���:fyb��b����k1�u^B" eʜY��ʀ�{��W*�Ʊ�9x�����1Yz�m!ZNF���̃�4�
_����V�r� �a�FYr����B>3�N�RN�
��N%L�����/j%�<|�<���Vl��n��
ه����[�ثM�G���f�X��
G���*�>�D�ҀW�T93h���m�Y�H/�KC�vf���mpY���N�B����k��h
r��V�2P7�;�<�0��U�#�qC��+�����b}^
�s����1�I�fw��8���<J���GRu��6ޖ�W,���9U����6 �ev��ޒ�MM�Ϧ�Z���W�Ԇ�V�U��)J���H�B�%��)7��J<hjQ�T�h�V�t��#vؔh|�>4xk?������(���ֶ�W'�a
p���м���èa��$ъPm�B��im������<� Oy���i�*(rV�9�e�͙�@��#���~��ޒ�8OG��Gf}��F�R�s�:`��%�((��I
$qrLh�)'�X��7s at 3�S�M�S|H�~��V�1�s�@��ρ�lq_`��,ɑa
�xScg|��P��4X�yi1c���T�4�
*����W�3v>U,��������=�d"
$��C�q�CkY�l`�
|�e�oY��Z��-���
a��Gȓ�9~c=j9<�
ð����H��!�J�͵��#���1��u�XF���'Md��$��( �[�ސi���&k�=��"�].�wj{��Bt��p7<vL�P�~)3��7�Gg��a뤒2�b]�m�{4�X�ˀ�����۞o��}I���H�K�
������lO�[�w'��c� ������m���
��VsOb���^ˮ��R����cGrc�D�A�:G�M�½C&V{d����
���s�=Jkk=+���%����G+n�cG���6
"鬽i�lX�&%��d�ð�8vK�^�jx��%
�
��iܞ�5wo4<vԓtl�m�-
;�A?o�%�
��s�c��
+�J��
�{�S���
��g�3XW�ޮ�+�
� ͛�\�;^o
$���3&|�{��ٽZ
;�?��+��N���aXz���)m��������A�
z4�l��'��L5Ġ[t8����a2o_7��K�fI�j�'7��>FuDij�1$Y%V,���]�{G��ǞC7iL1��,֝��YoS^9�id"����cm�'k�`�����S�{�g�B�vd��co���n歶�}
�3��������:�7��U�.��:�3�;�)��pjX�h�.
����5��p҃l
G*�=Nkk
9ǹE7��pjX��'�� ��éa��VYI�6u�\��os�kx��
�ZcrD�6����0֑q���ؙe���>xmy숤vC��
�� �vء9Z������^z�11��]�ue���r��&ޅ������1��
w�憱���#
N*�
|.L
Wi
��l���V���k[��Y�(6�]�a�#�hs��f�U�W����Ye;�9g��[io�j�W�r`
+2��
`����N
p3<�}85�u�,�`(w'Nkk
q�<(� x���}��
����#�+��� X�Z�[=X�Q+����x��t�їӧ����F�X��
�H�
+|���^��
�8��d8_�ŏ��~8q����~�ڦx]�4D����)͑GL{�0�F����;cg|��Ջ�-��ł%��uAy0&h�re1������fYN����{�O��$F�e3���/m�uD�7��
PL��Ҋ}y��
lA�@�_���d��La�B�� �
+�HG��F��2�*���%�v���7}�8 �vL�b�@���qB������
+
{�p���&YN����[�k聦�g�V5��J,�k�hT_�&8>�ak�G�#��0�I���I,
+
/,���[�.(fC�C1h�
4��\L>N$��2����s�%-B�o͘�$�&�I(
�5�A��s�RN�Z�JD9��3چ"���Y�
+�R�Vx� �7d��t����Q��\i�*�)f�J��r�fn1q3nNW�&�R�*$�A�@T(ȧ��9>��lF��R s���Z�Ń�9Th}���
��
.NR�AAg�G+��;��k���w�_?��hF���N��E�q�d
+Z䋴�
+}Y���阉�lW�t����l|b�%Ͱ ZN�A�d*�e fb���>��SN���N%�&a�A���+��
0�uf&��ƙt� b`��%�3��$��!�@&p�D��.Q�8�,Ԩ�|����L%L�1����L��,�ҋ-��I��JO��
(�[T�D3��(h�6h���+�2�M������^t�f�&r��P�<i��V�`]��9���6h�+A
�L���h��{pL$D(2���e��-$|���:S����u3
K�nꝑaMЩj3���̜�I�LL�rB"�b
+��nֿ
�F�D�O
foi�X����N%�#1p��2(J�
�VԳ�3���X;��_hy��K�4�&����R)��c}M�8 ���Uj����|���m��?������~{}
-~���/3dĈ���������
+�?���X`��Y�������������˃��-�s�]W=<��M!�~7���ke�U�UJi�~�|��&��R4C��OAy:��{���Q�nd�v.���������E<N��{6<�Ey}�t���KW�c���$)�t��k�U˟:.WP���O'f��]l�Y���ऊ4Ԙ��
5�i�IX�I�4X����h7�J����H�8�X���k�5M'�9\\)}��"�ۛ>
�W.����"�a��<
���7�^!�d�A��}�����qیn~�i��D_*�(�3�Xh���o۲*��k
�)5~���x߆�+13�2��zY�Ng��Gy��^!kw�U���
+
��P�ƫ�A��3��c!ް�
ݥ��|D0d�Ѡ�!��ӏ�Z
=b�}Dy��O��5;���q0�؇G3X���%��t
>47��D��QE�LA"5�5��`�"�x��v�^�a�ƾ
�)�Xj���0X̥��1�H�pI�Jf��A�������ݸa�+��5L�z�
z齇"� � y i���ޕ�Ѯ�����MQ#��
+�^� c6��̃�����)o�/g��
�V ����1O�=�'`��z
F
�6��"������
+���]��"Lgΐm/I����<�V�K��}�gL���̌<�'�
�֡��O�������#&v�&Ϩ����N��ԙwN�
0��EO%�q�q��]� bUݞw��WA�0r��=z�
����D+�ĨH+�ʫ�����Y3�
�,ƌ�{�\
�2ɞ>ƽ���ff�e�q1<�p�e�u��5�윌��v�a0
+�c�~#p8=��b1�J�
�h��V��p���X�-ƹ�9u
�D�6���;�T��ֳhQg�ִ�q)��\v�ra���5�+c+��u�T�+��<�5���!4��CDŽXl��1����7����}Z� ᵫ���8z�kq����������ݥ��j�+��5�d�v�A?
A�l$7�������eئ6��9�j2]�
+rř6�� ��TA�IIc�h��x�%�$W�uCz�*b�׃.c��E��7;���iiL�����g0s���4�·��'Z�WH����<?W'��e�����
� �x{�����>'xď�
�F��al`N
�T?Ч]R��
[�Z;U���v��zט�9��ĵi�}��o��ߺ���f^F����ԑ�=��n@$���n<\1]��bE���IW�����5�;<ȥs���������H
�1��N������Ɗ�T�RIvo�
5NO��|���dJ�7ޣI�����F�÷�������C� c�@R
endstream
endobj
28 0 obj
12482
endobj
29 0 obj
<< /Filter /FlateDecode /Length 30 0 R /Subtype /Type1C >>
stream
+H�|UiPI����a1ڕ�
�b�ZtUfX�C
AQdו�����uluQ at h���`�X�C` /p$ԕZAE��]q��U���Ll���Ȍ̌��}������1�����o7n
����?Y��+��_
=#_���8���|�.�����/����7g��2�
+�x��&Ϙ�m�:^�La+spuu��Y�e�1{T���x��8�O�"F{ F+�W)�e��QQ���8Y�*N�M䥿� ����x�\��/�����?H���d�Ӫ"4�V�K4�2�J/����&N�Q�kb����K���1
�6��X`6f�2
[�a�a.���a��� �|1�ö�X� Sc�b�<L����X,v���c�3�-f�f&A��^�L-��DZ���$�&|�F�R�Z|W
�32?k>l�d�l�j1��If���;`) ���.�GuM\�Z�=Q|���躹�n������� �XP� �F��%�aѾ�Qd $���v| �,V���l��9#�pGF��D�c�t��F���11�٬���Q!9m�.p�.|�]���(��`��$̒�|��
��{w3��E%W��ܣ'�|lׯBnȑ��-
+Kt}p��}V0:�3N�n��+��
4,
�y����\6KLN=-�o�>�:��z�h�j��OTx�v�
z�run�~l�OA�
V��d�eF|���PI���c�n0��c�y.��������]�vA
�#
�SYbp��˅�
�D�&C����_
�놕�p0� 8/C�vB�
�����4P��+Y�L�Wz��¼l��(��^R
���B�z�-V�]�㎤�fK�U��3h��x�(���&[�PBƩX���gd�vs_߿,As��}
a�����,�r{��4�(&���
+�K%�EY��n��Z��٧
6/���Lc��fz�9��>t�F�G�����x at _�UM��^P͍���x۹��V5��/!�4����{�g�����
�&&��j�]�v�k�~?��';��*��
|Vs�~�t�� �bȱ�鏔�ζ=����.1Fm��]�
��!�\��<dG`�"� ��p����u�F� �.h��댐3&x��
+3ʲ*�{����n4o��
Ia��'� -p@� �c'��Sz���G�E�+�F�)14u���������]�&V!a{$�ة�2nWt �>�uh���+i�KF�
��x �@��5ՏԢ�J1��l��Ņ'�Ԣ�n�v�P��|ŜW�W���B��K�K톜����1� ��@u����4�
^��^�,��&}���/w�3���zk��9�N]�T� �u���
W��[)}N���6������]K�
+� ��ۧ���#
��2�ɬ�D���i��'\�8��х�h��Gp��S�x���C�>������4R�E���l�,���+g%�퇘^��!*ɪz������F���^`�vǒ�'�h���)X�>���GS�Yr�G&'s����i��X�vh
f7w���@�?���#+��i ���O�30
o��?��<��Q �:9��3+=n���aD��"���Ud��,׳LZFT��7���ވ���BH�����BY�s�j
�㛉8YX�QJ�<.i⩾Z��@z?�ioS��\���ږzBΎ�S�ܲ�Z���p��w,��f�9�JRx���}�oo
O�jԅ��r�^8h�����PG�ި��s������Qڜt3�����Ӂ~��w��T6I=�P�.0Ԟu$$�>�s������&jz���ٝ��%�� �1NӋ�h���2�v����%� [L�-�P� �jA�������7j��
+M�m@|�D�6�3�j]Gd"�~ ���F�m$�8G�MMFL!ۀ���)
U���&���
+�11ڒ��YH�no�WOsUm)�V�����������[�t<�X�qfϑ=
+?z����
����YI��W�ȭ�}IV#\
#�
0�"�g��E2�t����մ
����KV�G�܃5!Ql:�u"����������C����kݻ�u�ݮ�.�[�P�A������ {H5�ь��2�6f�,ul�Ѯ[��YY��5k�R�hf:�֛D�=�z��O��E�����s�\��^s��tg^
R�$�ԯkn���(j� XRE�� �hT#�l+��N[�F~
��v}�Pş��T���E
+�b>G����x��R<
+��
a0�C��
�^�l����asUj��G�h�l���=�}4D���q�q����7
zV�臈R����oz��Z�[k�)����
+ 4 �$��D�fݠ�u���\}��n�٭[�r���w���0�!I��
:�����'�-�~�q�.������>�}��²
]��Y
&]KZ�&--��;�H �2m���a�K��R��J����
+ƾ�$���
�� �Q
��}D��.&n��_}_~��N��F���bnf�dV�`�5i���ۇ���I����:+n�z�V��Z
<�|���퇊l����=| I_(�L,"��l��Z
+�0��NE[/��U^;�m,�@_(�y^
���U��6�^l�]����³;�i`'�X��ʻQ��?�=��Ikܑ�OO�tgs�B�{��AM�ݏ��MLz�<*��jGFM6�WU_�eΗ�{�� Q���4�5X<�@D�����qxl�n �I�OΑ͌�IKI��B.3�hLf�wv|��5�pJg<�km�Z��I�|,�xI�4Yo��R�Jy=)
t+[�7*"�n("(A
�Qj��" �c�[ʳO���G��GsUK
�Gs^
�"��j�tT=Fv��[��
?�]
endstream
endobj
30 0 obj
2864
endobj
31 0 obj
<< /Type /Metadata /Subtype /XML /Length 936 >>
stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d' bytes='936'?>
+
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
+ xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description about=''
+ xmlns='http://ns.adobe.com/pdf/1.3/'
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ <pdf:CreationDate>2003-03-27T11:47:07-05:00</pdf:CreationDate>
+ <pdf:ModDate>2003-03-27T11:47:10-06:00</pdf:ModDate>
+ <pdf:Creator>Adobe Illustrator 10.0</pdf:Creator>
+ <pdf:Producer>Adobe PDF library 5.00</pdf:Producer>
+ </rdf:Description>
+
+ <rdf:Description about=''
+ xmlns='http://ns.adobe.com/xap/1.0/'
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'>
+ <xap:CreateDate>2003-03-27T11:47:07-05:00</xap:CreateDate>
+ <xap:ModifyDate>2003-03-27T11:47:10-06:00</xap:ModifyDate>
+ <xap:CreatorTool>Adobe Illustrator 10.0</xap:CreatorTool>
+ <xap:MetadataDate>2003-03-27T11:47:10-06:00</xap:MetadataDate>
+ </rdf:Description>
+
+</rdf:RDF>
+<?xpacket end='r'?>
endstream
endobj
xref
0 32
0000000004 65535 f
+0000000016 00000 n
+0000000087 00000 n
+0000000151 00000 n
+0000000006 00001 f
+0000000318 00000 n
+0000000000 00001 f
+0000000684 00000 n
+0000000763 00000 n
+0000001018 00000 n
+0000001428 00000 n
+0000003100 00000 n
+0000014845 00000 n
+0000032280 00000 n
+0000032303 00000 n
+0000050784 00000 n
+0000050807 00000 n
+0000063536 00000 n
+0000063559 00000 n
+0000066895 00000 n
+0000066917 00000 n
+0000066945 00000 n
+0000066974 00000 n
+0000068196 00000 n
+0000068423 00000 n
+0000068515 00000 n
+0000072707 00000 n
+0000072729 00000 n
+0000085289 00000 n
+0000085312 00000 n
+0000088271 00000 n
+0000088293 00000 n
+trailer
<<
/Size 32
/Info 3 0 R
/Root 1 0 R
/ID[<d1bd0c2021c77ff39552c1d51c3f779d><1ef3a610dd2481b3e295166dd4ceadbc>]
>>
startxref
89313
%%EOF
\ No newline at end of file
diff --git a/documentation/figures/rnaseP-bsu-alignment.eps b/documentation/figures/rnaseP-bsu-alignment.eps
new file mode 100644
index 0000000..434e1d5
--- /dev/null
+++ b/documentation/figures/rnaseP-bsu-alignment.eps
@@ -0,0 +1,11407 @@
+%!PS-Adobe-3.1 EPSF-3.0
+%%Title: rnaseP-bsu-alignment.eps
+%%Creator: Adobe Illustrator(R) X
+%%AI8_CreatorVersion: 10.0
%AI9_PrintingDataBegin
%%For: Sean R Eddy
+%%CreationDate: 3/27/03
+%%BoundingBox: 0 0 382 355
+%%HiResBoundingBox: 0 0 381.9976 354.9351
+%%CropBox: 0 0 381.9976 354.9351
+%%LanguageLevel: 2
+%%DocumentData: Clean7Bit
+%ADOBeginClientInjection: DocumentHeader "AI10"
+%ADOEndClientInjection: DocumentHeader "AI10"
+%%Pages: 1
+%%DocumentNeededResources:
+%%DocumentSuppliedResources: procset Adobe_AGM_Image (1.0 0)
+%%+ procset Adobe_CoolType_Utility_MAKEOCF (1.13 0)
+%%+ procset Adobe_CoolType_Core (2.12 0)
+%%+ procset Adobe_AGM_Core (2.0 0)
+%%+ procset Adobe_AGM_Utils (1.0 0)
+%%DocumentFonts:
+%%DocumentNeededFonts:
+%%DocumentNeededFeatures:
+%%DocumentSuppliedFeatures:
+%%DocumentCustomColors:
+%%CMYKCustomColor:
+%%RGBCustomColor:
+%%EndComments
+%%BeginDefaults
+%%ViewingOrientation: 1 0 0 1
+%%EndDefaults
+%%BeginProlog
+%ADOBeginClientInjection: DocumentProlog Start "AI10"
+%ADOEndClientInjection: DocumentProlog Start "AI10"
+%%BeginResource: procset Adobe_AGM_Utils 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright (C) 2000-2000 Adobe Systems, Inc. All Rights Reserved.
+systemdict /setpacking known
+{
+ currentpacking
+ true setpacking
+} if
+userdict /Adobe_AGM_Utils 60 dict dup begin put
+/bdf
+{
+ bind def
+} bind def
+/nd{
+ null def
+}bdf
+/xdf
+{
+ exch def
+}bdf
+/ldf
+{
+ load def
+}bdf
+/ddf
+{
+ put
+}bdf
+/xddf
+{
+ 3 -1 roll put
+}bdf
+/xpt
+{
+ exch put
+}bdf
+/ndf
+{
+
+ exch dup where{
+ pop pop pop
+ }{
+ xdf
+ }ifelse
+}def
+/cdndf
+{
+ exch dup currentdict exch known{
+ pop pop
+ }{
+ exch def
+ }ifelse
+}def
+/bdict
+{
+ mark
+}bdf
+/edict
+{
+ counttomark 2 idiv dup dict begin {def} repeat pop currentdict end
+}def
+
+/ps_level
+ /languagelevel where{
+ pop systemdict /languagelevel get exec
+ }{
+ 1
+ }ifelse
+def
+/level2
+ ps_level 2 ge
+def
+/level3
+ ps_level 3 ge
+def
+/ps_version
+ {version cvr} stopped {
+ -1
+ }if
+def
+/makereadonlyarray
+{
+ /packedarray where{
+ pop packedarray
+ }{
+ array astore readonly
+ }ifelse
+}bdf
+/map_reserved_ink_name
+{
+ dup type /stringtype eq{
+ dup /Red eq{
+ pop (_Red_)
+ }{
+ dup /Green eq{
+ pop (_Green_)
+ }{
+ dup /Blue eq{
+ pop (_Blue_)
+ }{
+ dup /Cyan eq{
+ pop (_Cyan_)
+ }{
+ dup /Magenta eq{
+ pop (_Magenta_)
+ }{
+ dup /Yellow eq{
+ pop (_Yellow_)
+ }{
+ dup /Black eq{
+ pop (_Black_)
+ }{
+ dup () cvn eq{
+ pop (Process)
+ }if
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }if
+}bdf
+/AGMUTIL_GSTATE 22 dict def
+/get_gstate
+{
+ AGMUTIL_GSTATE begin
+ /AGMUTIL_GSTATE_clr_spc currentcolorspace def
+ /AGMUTIL_GSTATE_clr_indx 0 def
+ /AGMUTIL_GSTATE_clr_comps 12 array def
+ mark currentcolor counttomark
+ {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put
+ /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop
+ /AGMUTIL_GSTATE_fnt rootfont def
+ /AGMUTIL_GSTATE_lw currentlinewidth def
+ /AGMUTIL_GSTATE_lc currentlinecap def
+ /AGMUTIL_GSTATE_lj currentlinejoin def
+ /AGMUTIL_GSTATE_ml currentmiterlimit def
+ currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf
+ /AGMUTIL_GSTATE_sa currentstrokeadjust def
+
+ /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def
+ /AGMUTIL_GSTATE_op currentoverprint def
+ /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def
+ /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def
+ currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf
+ cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf
+ /AGMUTIL_GSTATE_ht currenthalftone def
+ /AGMUTIL_GSTATE_flt currentflat def
+ end
+}def
+/set_gstate
+{
+ AGMUTIL_GSTATE begin
+ AGMUTIL_GSTATE_clr_spc setcolorspace
+ AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get
+ /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor
+ AGMUTIL_GSTATE_fnt setfont
+ AGMUTIL_GSTATE_lw setlinewidth
+ AGMUTIL_GSTATE_lc setlinecap
+ AGMUTIL_GSTATE_lj setlinejoin
+ AGMUTIL_GSTATE_ml setmiterlimit
+ AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash
+ AGMUTIL_GSTATE_sa setstrokeadjust
+
+ AGMUTIL_GSTATE_clr_rnd setcolorrendering
+ AGMUTIL_GSTATE_op setoverprint
+ AGMUTIL_GSTATE_bg cvx setblackgeneration
+ AGMUTIL_GSTATE_ucr cvx setundercolorremoval
+ AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx
+ AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer
+
+ AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or
+ {
+ currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne
+ {
+ mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark
+ } if
+ }{
+ AGMUTIL_GSTATE_ht sethalftone
+ } ifelse
+
+ AGMUTIL_GSTATE_flt setflat
+ end
+}def
+/AGMUTIL_str256 256 string def
+/AGMUTIL_src256 256 string def
+/AGMUTIL_dst64 64 string def
+/AGMUTIL_srcLen nd
+/AGMUTIL_ndx nd
+/rdline
+{
+ currentfile AGMUTIL_str256 readline pop
+} bdf
+/rdcmntline
+{
+ currentfile AGMUTIL_str256 readline pop
+ (%) anchorsearch {pop} if
+} bdf
+/filter_cmyk
+{
+ dup type /filetype ne{
+ 0 () /SubFileDecode filter
+ }if
+ [
+ exch
+ {
+ AGMUTIL_src256 readstring pop
+ dup length /AGMUTIL_srcLen exch def
+ /AGMUTIL_ndx 0 def
+
+ AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{
+ 1 index exch get
+ AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put
+ /AGMUTIL_ndx AGMUTIL_ndx 1 add def
+ }for
+ pop
+ AGMUTIL_dst64 0 AGMUTIL_ndx getinterval
+ }
+ bind
+ /exec cvx
+ ] cvx
+} bdf
+/AGMUTIL_imagefile nd
+/AGMUTIL_imbuf nd
+/read_image_file
+{
+ AGMUTIL_imagefile 0 setfileposition
+ dup /DataSource {AGMUTIL_imagefile AGMUTIL_imbuf readstring pop} put
+ exch
+ load exec
+}def
+/write_image_file
+{
+ begin
+ { (AGMUTIL_imagefile) (w+) file } stopped{
+ false
+ }{
+ Adobe_AGM_Utils/AGMUTIL_imagefile xddf
+ Adobe_AGM_Utils/AGMUTIL_imbuf Width BitsPerComponent mul 7 add 8 idiv string ddf
+ 1 1 Height {
+ pop
+ DataSource dup type /filetype eq{
+ AGMUTIL_imbuf readstring pop
+ }{
+ exec
+ } ifelse
+ AGMUTIL_imagefile exch writestring
+ }for
+ true
+ }ifelse
+ end
+}def
+/close_image_file
+{
+ AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile
+}def
+/consumeimagedata
+{
+ begin
+ currentdict /MultipleDataSources known not
+ {/MultipleDataSources false def} if
+ MultipleDataSources
+ {
+ 1 dict begin
+ /flushbuffer Width cvi string def
+ 1 1 Height cvi
+ {
+ pop
+ 0 1 DataSource length 1 sub
+ {
+ DataSource exch get
+ dup type dup
+ /filetype eq
+ {
+ exch flushbuffer readstring pop pop
+ }if
+ /arraytype eq
+ {
+ exec pop
+ }if
+ }for
+ }for
+ end
+ }
+ {
+ /DataSource load type dup
+ /filetype eq
+ {
+ 1 dict begin
+ /flushbuffer Width Decode length 2 div mul cvi string def
+ 1 1 Height { pop DataSource flushbuffer readstring pop pop} for
+ end
+ }if
+ /arraytype eq
+ {
+ 1 1 Height { pop DataSource pop } for
+ }if
+ }ifelse
+ end
+}bdf
+/addprocs
+{
+ 2{/exec load}repeat
+ 3 1 roll
+ [ 5 1 roll ] bind cvx
+}def
+/modify_halftone_xfer
+{
+ currenthalftone dup length dict copy begin
+ currentdict 2 index known{
+ 1 index load dup length dict copy begin
+ currentdict/TransferFunction known{
+ /TransferFunction load
+ }{
+ currenttransfer
+ }ifelse
+ addprocs /TransferFunction xdf
+ currentdict end def
+ currentdict end sethalftone
+ }{
+ currentdict/TransferFunction known{
+ /TransferFunction load
+ }{
+ currenttransfer
+ }ifelse
+ addprocs /TransferFunction xdf
+ currentdict end sethalftone
+ pop
+ }ifelse
+}def
+/doc_setup{
+ Adobe_AGM_Utils begin
+}bdf
+/doc_trailer{
+ currentdict Adobe_AGM_Utils eq{
+ end
+ }if
+}bdf
+systemdict /setpacking known
+{
+ setpacking
+} if
+%%EndResource
+%%BeginResource: procset Adobe_AGM_Core 2.0 0
+%%Version: 2.0 0
+%%Copyright: Copyright (C) 1997-1999 Adobe Systems, Inc. All Rights Reserved.
+systemdict /setpacking known
+{
+ currentpacking
+ true setpacking
+} if
+userdict /Adobe_AGM_Core 205 dict dup begin put
+/nd{
+ null def
+}bind def
+/Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def
+/AGMCORE_str256 256 string def
+/AGMCORE_src256 256 string def
+/AGMCORE_save nd
+/AGMCORE_graphicsave nd
+/AGMCORE_c 0 def
+/AGMCORE_m 0 def
+/AGMCORE_y 0 def
+/AGMCORE_k 0 def
+/AGMCORE_cmykbuf 4 array def
+/AGMCORE_screen [currentscreen] cvx def
+/AGMCORE_tmp 0 def
+/AGMCORE_&setgray nd
+/AGMCORE_&setcolor nd
+/AGMCORE_&setcolorspace nd
+/AGMCORE_&setcmykcolor nd
+/AGMCORE_cyan_plate nd
+/AGMCORE_magenta_plate nd
+/AGMCORE_yellow_plate nd
+/AGMCORE_black_plate nd
+/AGMCORE_plate_ndx nd
+/AGMCORE_get_ink_data nd
+/AGMCORE_is_cmyk_sep nd
+/AGMCORE_host_sep nd
+/AGMCORE_will_host_sep nd
+/AGMCORE_avoid_L2_sep_space nd
+/AGMCORE_distilling nd
+/AGMCORE_composite_job nd
+/AGMCORE_producing_seps nd
+/AGMCORE_ps_level -1 def
+/AGMCORE_ps_version -1 def
+/AGMCORE_environ_ok nd
+/AGMCORE_CSA_cache 0 dict def
+/AGMCORE_CSD_cache 0 dict def
+/AGMCORE_pattern_cache 0 dict def
+/AGMCORE_currentoverprint false def
+/AGMCORE_deltaX nd
+/AGMCORE_deltaY nd
+/AGMCORE_name nd
+/AGMCORE_sep_special nd
+/AGMCORE_err_strings 4 dict def
+/AGMCORE_cur_err nd
+/AGMCORE_ovp nd
+/AGMCORE_current_spot_alias false def
+/AGMCORE_inverting false def
+/AGMCORE_feature_dictCount nd
+/AGMCORE_feature_opCount nd
+/AGMCORE_feature_ctm nd
+/AGMCORE_ConvertToProcess false def
+/AGMCORE_Default_CTM matrix def
+/knockout_unitsq nd
+/AGMCORE_CRD_cache where{
+ pop
+}{
+ /AGMCORE_CRD_cache 0 dict def
+}ifelse
+/AGMCORE_key_known
+{
+ where{
+ /Adobe_AGM_Core_Id known
+ }{
+ false
+ }ifelse
+}ndf
+/flushinput
+{
+ save
+ /CompareBuffer 3 -1 roll def
+ /readbuffer 256 string def
+ mark
+ {
+ currentfile readbuffer {readline} stopped
+ {cleartomark mark}
+ {
+ not
+ {pop exit}
+ if
+ CompareBuffer eq
+ {exit}
+ if
+ }ifelse
+ }loop
+ cleartomark
+ restore
+}bdf
+/getspotfunction
+{
+ AGMCORE_screen exch pop exch pop
+ dup type /dicttype eq{
+ dup /HalftoneType get 1 eq{
+ /SpotFunction get
+ }{
+ dup /HalftoneType get 2 eq{
+ /GraySpotFunction get
+ }{
+ pop
+ {
+ abs exch abs 2 copy add 1 gt{
+ 1 sub dup mul exch 1 sub dup mul add 1 sub
+ }{
+ dup mul exch dup mul add 1 exch sub
+ }ifelse
+ }bind
+ }ifelse
+ }ifelse
+ }if
+} def
+/clp_npth
+{
+ clip newpath
+} def
+/eoclp_npth
+{
+ eoclip newpath
+} def
+/stkpath_clp_npth
+{
+ strokepath clip newpath
+} def
+/stk_n_clp_npth
+{
+ gsave stroke grestore clip newpath
+} def
+/npth_clp
+{
+ newpath clip
+} def
+/graphic_setup
+{
+ /AGMCORE_graphicsave save def
+ concat
+ 0 setgray
+ 0 setlinecap
+ 0 setlinejoin
+ 1 setlinewidth
+ [] 0 setdash
+ 10 setmiterlimit
+ newpath
+ false setoverprint
+ false setstrokeadjust
+ Adobe_AGM_Core/spot_alias get exec
+ /Adobe_AGM_Image where {
+ pop
+ Adobe_AGM_Image/spot_alias 2 copy known{
+ get exec
+ }{
+ pop pop
+ }ifelse
+ } if
+ 100 dict begin
+ /showpage {} def
+ mark
+} def
+/graphic_cleanup
+{
+ cleartomark
+ end
+ AGMCORE_graphicsave restore
+} def
+/compose_error_msg
+{
+ grestoreall initgraphics
+ /Helvetica findfont 10 scalefont setfont
+
+ /AGMCORE_deltaY 100 def
+ /AGMCORE_deltaX 310 def
+
+ clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto
+ 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto
+ 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath
+ 0 AGMCORE_&setgray
+ gsave 1 AGMCORE_&setgray fill grestore
+ 1 setlinewidth gsave stroke grestore
+
+ currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto
+
+ /AGMCORE_deltaY 12 def
+ /AGMCORE_tmp 0 def
+ AGMCORE_err_strings exch get
+ {
+ dup 32 eq
+ {
+ pop
+ AGMCORE_str256 0 AGMCORE_tmp getinterval
+ stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt
+ {
+ currentpoint AGMCORE_deltaY sub exch pop
+ clippath pathbbox pop pop pop 44 add exch moveto
+ } if
+ AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show
+
+ 0 1 AGMCORE_str256 length 1 sub
+ {
+ AGMCORE_str256 exch 0 put
+ }for
+ /AGMCORE_tmp 0 def
+ }
+ {
+ AGMCORE_str256 exch AGMCORE_tmp exch put
+ /AGMCORE_tmp AGMCORE_tmp 1 add def
+ } ifelse
+ } forall
+} bdf
+/doc_setup{
+ Adobe_AGM_Core begin
+
+ /AGMCORE_will_host_separate xdf
+ /AGMCORE_ps_version xdf
+ /AGMCORE_ps_level xdf
+
+ errordict /AGM_handleerror known not{
+ errordict /AGM_handleerror errordict /handleerror get put
+ errordict /handleerror {
+ Adobe_AGM_Core begin
+ $error /newerror get AGMCORE_cur_err null ne and{
+ $error /newerror false put
+ AGMCORE_cur_err compose_error_msg
+ }if
+ $error /newerror true put
+ end
+ errordict /AGM_handleerror get exec
+ } bind put
+ }if
+
+ /AGMCORE_environ_ok
+ ps_level AGMCORE_ps_level ge
+ ps_version AGMCORE_ps_version ge and
+ AGMCORE_ps_level -1 eq or
+ def
+
+ AGMCORE_environ_ok not
+ {/AGMCORE_cur_err /AGMCORE_bad_environ def} if
+
+ /AGMCORE_&setgray systemdict/setgray get def
+ level2{
+ /AGMCORE_&setcolor systemdict/setcolor get def
+ /AGMCORE_&setcolorspace systemdict/setcolorspace get def
+ }if
+ /AGMCORE_distilling
+ /product where{
+ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and
+ }{
+ false
+ }ifelse
+ def
+ /AGMCORE_in_rip_sep
+ /AGMCORE_in_rip_sep where{
+ pop AGMCORE_in_rip_sep
+ }{
+ AGMCORE_distilling
+ {
+ false
+ }{
+ userdict/Adobe_AGM_OnHost_Seps known{
+ false
+ }{
+ level2{
+ currentpagedevice/Separations 2 copy known{
+ get
+ }{
+ pop pop false
+ }ifelse
+ }{
+ false
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ def
+ level2 not{
+ /xput{
+ dup load dup length exch maxlength eq{
+ dup dup load dup
+ length dup 0 eq {pop 1} if 2 mul dict copy def
+ }if
+ load begin
+ def
+ end
+ }def
+ }{
+ /xput{
+ load 3 1 roll put
+ }def
+ }ifelse
+ /AGMCORE_GSTATE AGMCORE_key_known not{
+ /AGMCORE_GSTATE 21 dict def
+ /AGMCORE_gstack 32 array def
+ /AGMCORE_gstackptr 0 def
+ /AGMCORE_gstacksaveptr 0 def
+ /AGMCORE_gstackframekeys 8 def
+
+ /AGMCORE_&gsave /gsave ldf
+ /AGMCORE_&grestore /grestore ldf
+ /AGMCORE_&grestoreall /grestoreall ldf
+ /AGMCORE_&save /save ldf
+ /AGMCORE_gdictcopy {
+ begin
+ { def } forall
+ end
+ }def
+ /AGMCORE_gput {
+ AGMCORE_gstack AGMCORE_gstackptr get
+ 3 1 roll
+ put
+ }def
+ /AGMCORE_gget {
+ AGMCORE_gstack AGMCORE_gstackptr get
+ exch
+ get
+ }def
+ /gsave {
+ AGMCORE_&gsave
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gstackptr 1 add
+ dup 32 ge {limitcheck} if
+ Adobe_AGM_Core exch
+ /AGMCORE_gstackptr exch put
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gdictcopy
+ }def
+ /grestore {
+ AGMCORE_&grestore
+ AGMCORE_gstackptr 1 sub
+ dup AGMCORE_gstacksaveptr lt {1 add} if
+ Adobe_AGM_Core exch
+ /AGMCORE_gstackptr exch put
+ }def
+ /grestoreall {
+ AGMCORE_&grestoreall
+ Adobe_AGM_Core
+ /AGMCORE_gstackptr AGMCORE_gstacksaveptr put
+ }def
+ /save {
+ AGMCORE_&save
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gstackptr 1 add
+ dup 32 ge {limitcheck} if
+ Adobe_AGM_Core begin
+ /AGMCORE_gstackptr exch def
+ /AGMCORE_gstacksaveptr AGMCORE_gstackptr def
+ end
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gdictcopy
+ }def
+ 0 1 AGMCORE_gstack length 1 sub {
+ AGMCORE_gstack exch AGMCORE_gstackframekeys dict put
+ } for
+ }if
+ /currentcmykcolor [0 0 0 0] AGMCORE_gput
+ /currentstrokeadjust false AGMCORE_gput
+ /currentcolorspace [/DeviceGray] AGMCORE_gput
+ /sep_tint 0 AGMCORE_gput
+ /sep_colorspace_dict null AGMCORE_gput
+ /indexed_colorspace_dict null AGMCORE_gput
+ /currentcolor_intent () AGMCORE_gput
+ /customcolor_tint 1 AGMCORE_gput
+ end
+}def
+/page_setup
+{
+ /setcmykcolor where{
+ pop
+ Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put
+ }if
+ Adobe_AGM_Core begin
+ /setcmykcolor
+ {
+ 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput
+ 1 sub 4 1 roll
+ 3 {
+ 3 index add neg dup 0 lt {
+ pop 0
+ } if
+ 3 1 roll
+ } repeat
+ setrgbcolor pop
+ }ndf
+ /currentcmykcolor
+ {
+ /currentcmykcolor AGMCORE_gget aload pop
+ }ndf
+ /setoverprint
+ {
+ pop
+ }ndf
+ /currentoverprint
+ {
+ false
+ }ndf
+ /AGMCORE_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def
+ /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def
+ /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def
+ /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def
+ /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def
+ /AGMCORE_plate_ndx
+ AGMCORE_cyan_plate{
+ 0
+ }{
+ AGMCORE_magenta_plate{
+ 1
+ }{
+ AGMCORE_yellow_plate{
+ 2
+ }{
+ AGMCORE_black_plate{
+ 3
+ }{
+ 4
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ def
+ /AGMCORE_composite_job
+ AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def
+
+ /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def
+
+ /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def
+
+ /AGM_preserve_spots
+ /AGM_preserve_spots where{
+ pop AGM_preserve_spots
+ }{
+ AGMCORE_distilling AGMCORE_producing_seps or
+ }ifelse
+ def
+ /AGM_is_distiller_preserving_spotimages
+ {
+ currentdistillerparams/PreserveOverprintSettings known
+ {
+ currentdistillerparams/PreserveOverprintSettings get
+ {
+ currentdistillerparams/ColorConversionStrategy known
+ {
+ currentdistillerparams/ColorConversionStrategy get
+ /LeaveColorUnchanged eq
+ }{
+ true
+ }ifelse
+ }{
+ false
+ }ifelse
+ }{
+ false
+ }ifelse
+ }def
+ /convert_spot_to_process where {pop}{
+ /convert_spot_to_process
+ {
+ dup dup (None) eq exch (All) eq or
+ {
+ pop false
+ }{
+ AGMCORE_host_sep
+ {
+ gsave
+ 1 0 0 0 setcmykcolor currentgray 1 exch sub
+ 0 1 0 0 setcmykcolor currentgray 1 exch sub
+ 0 0 1 0 setcmykcolor currentgray 1 exch sub
+ 0 0 0 1 setcmykcolor currentgray 1 exch sub
+ add add add 0 eq
+ {
+ pop false
+ }{
+ false setoverprint
+ 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor
+ currentgray 0 eq
+ }ifelse
+ grestore
+ }{
+ AGMCORE_distilling
+ {
+ pop AGM_is_distiller_preserving_spotimages not
+ }{
+ Adobe_AGM_Core/AGMCORE_name xddf
+ false
+ currentpagedevice/OverrideSeparations known
+ {
+ currentpagedevice/OverrideSeparations get
+ {
+ /HqnSpots /ProcSet resourcestatus
+ {
+ pop pop pop true
+ }if
+ }if
+ }if
+ {
+ AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not
+ }{
+ gsave
+ [/Separation AGMCORE_name /DeviceGray {}]setcolorspace
+ false
+ currentpagedevice/SeparationColorNames 2 copy known
+ {
+ get
+ { AGMCORE_name eq or}forall
+ not
+ }{
+ pop pop pop true
+ }ifelse
+ grestore
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }def
+ }ifelse
+ /convert_to_process where {pop}{
+ /convert_to_process
+ {
+ dup length 0 eq
+ {
+ pop false
+ }{
+ AGMCORE_host_sep
+ {
+ true exch
+ {
+ convert_spot_to_process and
+ }
+ forall
+ }{
+ false exch
+ {
+ convert_spot_to_process or
+ }
+ forall
+ }ifelse
+ }ifelse
+ }def
+ }ifelse
+ AGMCORE_host_sep AGMCORE_will_host_separate not and {
+ /AGMCORE_cur_err /AGMCORE_color_space_onhost_seps def
+ AGMCORE_color_space_onhost_seps
+ }if
+ /AGMCORE_avoid_L2_sep_space
+ version cvr 2012 lt
+ level2 and
+ AGMCORE_producing_seps not and
+ def
+ /AGMCORE_is_cmyk_sep
+ AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or
+ def
+ /AGM_avoid_0_cmyk where{
+ pop AGM_avoid_0_cmyk
+ }{
+ AGM_preserve_spots
+ userdict/Adobe_AGM_OnHost_Seps known
+ userdict/Adobe_AGM_InRip_Seps known or
+ not and
+ }ifelse
+ {
+ /setcmykcolor[
+ {
+ 4 copy add add add 0 eq currentoverprint and{
+ pop 0.0005
+ }if
+ }/exec cvx
+ /AGMCORE_&setcmykcolor load dup type/operatortype ne{
+ /exec cvx
+ }if
+ ]cvx def
+ }if
+ AGMCORE_host_sep{
+ /AGMCORE_get_ink_data
+ AGMCORE_cyan_plate{
+ {pop pop pop}
+ }{
+ AGMCORE_magenta_plate{
+ {4 3 roll pop pop pop}
+ }{
+ AGMCORE_yellow_plate{
+ {4 2 roll pop pop pop}
+ }{
+ {4 1 roll pop pop pop}
+ }ifelse
+ }ifelse
+ }ifelse
+ def
+ /clip AGMCORE_key_known not{
+ Adobe_AGM_Core/AGMCORE_&clip /clip load put
+ /clip
+ {
+ current_spot_alias{
+ currentdict/InksUsed known{
+ [
+ InksUsed{
+ dup map_alias{
+ /Name get exch pop
+ }if
+ }forall
+ ]
+ /InksUsed xdf
+ }if
+ }if
+ AGMCORE_&clip
+ }def
+ }if
+ /eoclip AGMCORE_key_known not{
+ Adobe_AGM_Core/AGMCORE_&eoclip /eoclip load put
+ /eoclip
+ {
+ current_spot_alias{
+ currentdict/InksUsed known{
+ [
+ InksUsed{
+ dup map_alias{
+ /Name get exch pop
+ }if
+ }forall
+ ]
+ /InksUsed xdf
+ }if
+ }if
+ AGMCORE_&eoclip
+ }def
+ }if
+ }if
+ AGMCORE_in_rip_sep{
+ /setcustomcolor
+ {
+ exch aload pop
+ dup 7 1 roll inRip_spot_has_ink not {
+ 4 {4 index mul 4 1 roll}
+ repeat
+ /DeviceCMYK setcolorspace
+ 6 -2 roll pop pop
+ }{
+ Adobe_AGM_Core begin
+ /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf
+ end
+ [/Separation 4 -1 roll /DeviceCMYK
+ {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul}
+ ]
+ setcolorspace
+ }ifelse
+ setcolor
+ }ndf
+ /setseparationgray
+ {
+ [/Separation (All) /DeviceGray {}] setcolorspace_opt
+ 1 exch sub setcolor
+ }ndf
+ }{
+ /setseparationgray
+ {
+ AGMCORE_&setgray
+ }ndf
+ }ifelse
+ /findcmykcustomcolor
+ {
+ 5 makereadonlyarray
+ }ndf
+ /setcustomcolor
+ {
+ exch aload pop pop
+ 4 {4 index mul 4 1 roll} repeat
+ setcmykcolor pop
+ }ndf
+
+ /has_color
+ /colorimage where{
+ AGMCORE_producing_seps{
+ pop true
+ }{
+ systemdict eq
+ }ifelse
+ }{
+ false
+ }ifelse
+ def
+
+ /map_index
+ {
+ 1 index mul exch getinterval {255 div} forall
+ }def
+
+ level2{
+ /mo /moveto ldf
+ /li /lineto ldf
+ /cv /curveto ldf
+ /knockout_unitsq
+ {
+ 1 setgray
+ 0 0 1 1 rectfill
+ }def
+ /level2ScreenFreq{
+ begin
+ 60
+ HalftoneType 1 eq{
+ pop Frequency
+ }if
+ HalftoneType 2 eq{
+ pop GrayFrequency
+ }if
+ HalftoneType 5 eq{
+ pop Default level2ScreenFreq
+ }if
+ end
+ }def
+ /currentScreenFreq{
+ currenthalftone level2ScreenFreq
+ }def
+ level2 /setcolorspace AGMCORE_key_known not and{
+
+ /AGMCORE_&&&setcolorspace /setcolorspace ldf
+ /AGMCORE_ReplaceMappedColor
+ {
+ dup type dup /arraytype eq exch /packedarraytype eq or
+ {
+ dup 0 get dup /Separation eq
+ {
+ pop
+ dup length array copy
+ dup dup 1 get
+ current_spot_alias
+ {
+ dup map_alias
+ {
+ begin
+ /sep_colorspace_dict currentdict AGMCORE_gput
+ pop pop pop
+
+ [
+ /Separation Name
+ CSA map_csa
+ dup /MappedCSA xdf
+ /sep_colorspace_proc load
+ ]
+ dup Name
+ end
+ }if
+ }if
+ map_reserved_ink_name 1 exch put
+ }{
+ /DeviceN eq
+ {
+ dup length array copy
+ dup dup 1 get [
+ exch {
+ current_spot_alias{
+ dup map_alias{
+ /Name get exch pop
+ }if
+ }if
+ map_reserved_ink_name
+ } forall
+ ] 1 exch put
+ }if
+ }ifelse
+ }if
+ }def
+ /setcolorspace
+ {
+ dup type dup /arraytype eq exch /packedarraytype eq or
+ {
+ dup 0 get /Indexed eq
+ {
+ AGMCORE_distilling
+ {
+ /PhotoshopDuotoneList where
+ {
+ pop false
+ }{
+ true
+ }ifelse
+ }{
+ true
+ }ifelse
+ {
+ aload pop 3 -1 roll
+ AGMCORE_ReplaceMappedColor
+ 3 1 roll 4 array astore
+ }if
+ }{
+ AGMCORE_ReplaceMappedColor
+ }ifelse
+ }if
+ AGMCORE_&&&setcolorspace
+ }def
+ }if
+ }{
+
+ /adj
+ {
+ currentstrokeadjust{
+ transform
+ 0.25 sub round 0.25 add exch
+ 0.25 sub round 0.25 add exch
+ itransform
+ }if
+ }def
+ /mo{
+ adj moveto
+ }def
+ /li{
+ adj lineto
+ }def
+ /cv{
+ 6 2 roll adj
+ 6 2 roll adj
+ 6 2 roll adj curveto
+ }def
+ /knockout_unitsq
+ {
+ 1 setgray
+ 8 8 1 [8 0 0 8 0 0] {<ffffffffffffffff>} image
+ }def
+ /currentstrokeadjust{
+ /currentstrokeadjust AGMCORE_gget
+ }def
+ /setstrokeadjust{
+ /currentstrokeadjust exch AGMCORE_gput
+ }def
+ /currentScreenFreq{
+ currentscreen pop pop
+ }def
+ /setcolorspace
+ {
+ /currentcolorspace exch AGMCORE_gput
+ } def
+
+ /currentcolorspace
+ {
+ /currentcolorspace AGMCORE_gget
+ } def
+
+ /n_color_components
+ {
+ dup type /arraytype eq{
+ 0 get
+ }if
+ dup /DeviceGray eq{
+ pop 1
+ }{
+ /DeviceCMYK eq{
+ 4
+ }{
+ 3
+ }ifelse
+ }ifelse
+ } def
+
+ /setcolor_devicecolor
+ {
+ dup type /arraytype eq{
+ 0 get
+ }if
+ dup /DeviceGray eq{
+ pop setgray
+ }{
+ /DeviceCMYK eq{
+ setcmykcolor
+ }{
+ setrgbcolor
+ }ifelse
+ }ifelse
+ }def
+
+ /setcolor
+ {
+ currentcolorspace 0 get
+ dup /DeviceGray ne{
+ dup /DeviceCMYK ne{
+ dup /DeviceRGB ne{
+ dup /Separation eq{
+ pop
+ currentcolorspace 3 get exec
+ currentcolorspace 2 get
+ }{
+ dup /Indexed eq{
+ pop
+ currentcolorspace 3 get dup type /stringtype eq{
+ currentcolorspace 1 get n_color_components
+ 3 -1 roll map_index
+ }{
+ exec
+ }ifelse
+ currentcolorspace 1 get
+ }{
+ /AGMCORE_cur_err /AGMCORE_invalid_color_space def
+ AGMCORE_invalid_color_space
+ }ifelse
+ }ifelse
+ }if
+ }if
+ }if
+ setcolor_devicecolor
+ } def
+ }ifelse
+
+ /sop /setoverprint ldf
+ /lw /setlinewidth ldf
+ /lc /setlinecap ldf
+ /lj /setlinejoin ldf
+ /ml /setmiterlimit ldf
+ /dsh /setdash ldf
+ /sadj /setstrokeadjust ldf
+ /gry /setgray ldf
+ /rgb /setrgbcolor ldf
+ /cmyk /setcmykcolor ldf
+ /sep /setsepcolor ldf
+ /idx /setindexedcolor ldf
+ /colr /setcolor ldf
+ /csacrd /set_csa_crd ldf
+ /sepcs /setsepcolorspace ldf
+ /idxcs /setindexedcolorspace ldf
+ /cp /closepath ldf
+ /clp /clp_npth ldf
+ /eclp /eoclp_npth ldf
+ /spclp /stkpath_clp_npth ldf
+ /f /fill ldf
+ /ef /eofill ldf
+ /s /stroke ldf
+ /sclp /stk_n_clp_npth ldf
+ /nclp /npth_clp ldf
+ /gset /graphic_setup ldf
+ /gcln /graphic_cleanup ldf
+
+ currentdict{
+ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and {
+ bind
+ }if
+ def
+ }forall
+}def
+/page_trailer
+{
+ end
+}def
+/doc_trailer{
+}def
+systemdict /findcolorrendering known{
+ /findcolorrendering systemdict /findcolorrendering get def
+}if
+systemdict /setcolorrendering known{
+ /setcolorrendering systemdict /setcolorrendering get def
+}if
+/test_cmyk_color_plate
+{
+ gsave
+ setcmykcolor currentgray 1 ne
+ grestore
+}def
+/inRip_spot_has_ink
+{
+ dup Adobe_AGM_Core/AGMCORE_name xddf
+ convert_spot_to_process not
+}def
+/current_ink
+{
+ dup length 0 eq{
+ pop true
+ }{
+ Adobe_AGM_Core/ink_result false put
+ {
+ dup /ProcessCyan eq{
+ AGMCORE_cyan_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /ProcessMagenta eq{
+ AGMCORE_magenta_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /ProcessYellow eq{
+ AGMCORE_yellow_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /ProcessBlack eq{
+ AGMCORE_black_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /sep_colorspace_dict AGMCORE_gget dup null eq{
+ pop false ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ /Name get eq{
+ 1 setsepcolor
+ currentgray 1 ne ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ false ink_result or Adobe_AGM_Core/ink_result xddf
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ pop
+ } forall
+ ink_result
+ }ifelse
+}def
+/map255_to_range
+{
+ 1 index sub
+ 3 -1 roll 255 div mul add
+}def
+/set_csa_crd
+{
+ /sep_colorspace_dict null AGMCORE_gput
+ begin
+ CSA map_csa setcolorspace_opt
+ set_crd
+ end
+}
+def
+/setsepcolor
+{
+
+ /sep_colorspace_dict AGMCORE_gget begin
+ dup /sep_tint exch AGMCORE_gput
+ TintProc
+ end
+} def
+/sep_colorspace_proc
+{
+ Adobe_AGM_Core/AGMCORE_tmp xddf
+ /sep_colorspace_dict AGMCORE_gget begin
+ currentdict/Components known{
+ Components aload pop
+ TintMethod/Lab eq{
+ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat
+ LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll
+ }{
+ TintMethod/Subtractive eq{
+ NComponents{
+ AGMCORE_tmp mul NComponents 1 roll
+ }repeat
+ }{
+ NComponents{
+ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll
+ } repeat
+ }ifelse
+ }ifelse
+ }{
+ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get
+ aload pop
+ }ifelse
+ end
+} def
+/sep_colorspace_gray_proc
+{
+ Adobe_AGM_Core/AGMCORE_tmp xddf
+ /sep_colorspace_dict AGMCORE_gget begin
+ GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get
+ end
+} def
+/sep_proc_name
+{
+ dup 0 get
+ dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{
+ pop [/DeviceGray]
+ /sep_colorspace_gray_proc
+ }{
+ /sep_colorspace_proc
+ }ifelse
+} def
+/setsepcolorspace
+{
+
+ current_spot_alias{
+ dup begin
+ Name map_alias{
+ exch pop
+ }if
+ end
+ }if
+ dup /sep_colorspace_dict exch AGMCORE_gput
+ begin
+ /MappedCSA CSA map_csa def
+ Adobe_AGM_Core/AGMCORE_sep_special Name dup () eq exch (All) eq or ddf
+
+ AGMCORE_avoid_L2_sep_space{
+ [/Indexed MappedCSA sep_proc_name 255 exch
+ { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx
+ ] setcolorspace_opt
+ /TintProc {
+ 255 mul round cvi setcolor
+ }bdf
+ }{
+ MappedCSA 0 get /DeviceCMYK eq
+ currentdict/Components known and
+ AGMCORE_sep_special not and{
+ /TintProc [
+ Components aload pop Name findcmykcustomcolor
+ /exch cvx /setcustomcolor cvx
+ ] cvx bdf
+ }{
+ AGMCORE_host_sep Name (All) eq and{
+ /TintProc {
+ 1 exch sub setseparationgray
+ }bdf
+ }{
+ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and
+ AGMCORE_host_sep or
+ Name () eq and{
+ /TintProc [
+ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{
+ cvx /setcmykcolor cvx
+ }{
+ cvx /setgray cvx
+ }ifelse
+ ] cvx bdf
+ }{
+ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{
+ /TintProc [
+ /dup cvx
+ MappedCSA sep_proc_name cvx exch
+ 0 get /DeviceGray eq{
+ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx
+ }if
+ /Name cvx /findcmykcustomcolor cvx /exch cvx
+
+ AGMCORE_host_sep{
+ AGMCORE_is_cmyk_sep
+ }{
+ Name inRip_spot_has_ink not
+ }ifelse
+ {
+ /pop cvx 1
+ }if
+ /setcustomcolor cvx
+ ] cvx bdf
+ }{
+ /TintProc /setcolor ldf
+
+ [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ set_crd
+ setsepcolor
+ end
+} def
+/setindexedcolorspace
+{
+ dup /indexed_colorspace_dict exch AGMCORE_gput
+ begin
+ /MappedCSA CSA map_csa def
+ AGMCORE_host_sep level2 not and{
+ 0 0 0 0 setcmykcolor
+ }{
+ [/Indexed MappedCSA
+ level2 not has_color not and{
+ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{
+ pop [/DeviceGray]
+ }if
+ HiVal GrayLookup
+ }{
+ HiVal
+ currentdict/RangeArray known{
+ {
+ /indexed_colorspace_dict AGMCORE_gget begin
+ Lookup exch
+ dup HiVal gt{
+ pop HiVal
+ }if
+ NComponents mul NComponents getinterval {} forall
+ NComponents 1 sub -1 0{
+ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range
+ NComponents 1 roll
+ }for
+ end
+ } bind
+ }{
+ Lookup
+ }ifelse
+ }ifelse
+ ] setcolorspace_opt
+
+ set_crd
+ }ifelse
+ end
+}def
+/setindexedcolor
+{
+ AGMCORE_host_sep{
+ /indexed_colorspace_dict AGMCORE_gget/Lookup get 4 3 -1 roll map_index setcmykcolor
+ }{
+ setcolor
+ }ifelse
+} def
+/ignoreimagedata
+{
+ currentoverprint not{
+ gsave
+ dup begin
+ 1 setgray
+ 0 0 ImageMatrix itransform
+ Width Height ImageMatrix idtransform rectfill
+ end
+ grestore
+ }if
+ consumeimagedata
+}def
+/add_csa
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_CSA_cache xput
+ end
+}def
+/map_csa
+{
+ dup type /nametype eq{
+ Adobe_AGM_Core/AGMCORE_CSA_cache get exch get
+ }if
+}def
+/add_csd
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_CSD_cache xput
+ end
+}def
+/get_csd
+{
+ dup type /nametype eq{
+ Adobe_AGM_Core/AGMCORE_CSD_cache get exch get
+ }if
+}def
+/get_csd_by_name
+{
+ dup type dup /nametype eq exch /stringtype eq or{
+ Adobe_AGM_Core begin
+ /AGMCORE_CSD_Name xdf
+ AGMCORE_CSD_cache
+ {
+ dup /Name get AGMCORE_CSD_Name eq
+ {
+ exch pop exit
+ }{
+ pop
+ }ifelse
+ pop
+ }forall
+ end
+ }if
+}def
+/cachepattern_level2
+{
+ 4 dict begin
+ /comparebuffer exch def
+ /holdbuffer exch def
+ /readbuffer 1024 string def
+ /LZWFilter holdbuffer /LZWEncode filter def
+ {
+ currentfile readbuffer readline not
+ {pop exit}
+ if
+ dup LZWFilter exch writestring
+ LZWFilter (\n) writestring
+ comparebuffer eq
+ {exit}
+ if
+ }loop
+ LZWFilter closefile
+ end
+}def
+/cachepattern_level3
+{
+ 3 dict begin
+ /comparebuffer exch def
+ /readbuffer 1024 string def
+ /DoEOL false def
+ {
+ DoEOL
+ {
+ (\n)
+ /DoEOL false def
+ }
+ {
+ currentfile readbuffer readline not
+ {pop ()}
+ {
+ dup length 0 eq
+ { pop(\n)}
+ {
+ dup comparebuffer eq
+ {pop ()}
+ {/DoEOL true def}
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ } /ReusableStreamDecode filter
+ end
+}def
+/add_pattern
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_pattern_cache xput
+ end
+}def
+/get_pattern
+{
+ dup type /nametype eq{
+ Adobe_AGM_Core/AGMCORE_pattern_cache get exch get
+ }if
+}def
+/make_pattern
+{
+ dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform
+ exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub
+ exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub
+ matrix translate exch matrix concatmatrix
+ makepattern
+}def
+/set_pattern
+{
+ dup /PatternType get 1 eq{
+ dup /PaintType get 1 eq{
+ false sop [/DeviceGray] setcolorspace 0 setgray
+ }if
+ }if
+ setpattern
+}def
+/setcolorspace_opt
+{
+ dup currentcolorspace eq{
+ pop
+ }{
+ setcolorspace
+ }ifelse
+}def
+/updatecolorrendering
+{
+
+ currentcolorrendering/Intent known{
+ currentcolorrendering/Intent get
+ }{
+ null
+ }ifelse
+
+ Intent ne{
+ false
+ Intent
+ AGMCORE_CRD_cache {
+ exch pop
+ begin
+ dup Intent eq{
+ currentdict setcolorrendering_opt
+ end
+ exch pop true exch
+ exit
+ }if
+ end
+ } forall
+ pop
+ not{
+ systemdict /findcolorrendering known{
+ Intent findcolorrendering pop
+ /ColorRendering findresource
+ dup length dict copy
+ setcolorrendering_opt
+ }if
+ }if
+ }if
+} def
+/add_crd
+{
+ AGMCORE_CRD_cache 3 1 roll put
+}def
+/set_crd
+{
+ AGMCORE_host_sep not level2 and{
+ currentdict/CRD known{
+ AGMCORE_CRD_cache CRD get dup null ne{
+ setcolorrendering_opt
+ }{
+ pop
+ }ifelse
+ }{
+ currentdict/Intent known{
+ updatecolorrendering
+ }if
+ }ifelse
+ }if
+}def
+/setcolorrendering_opt
+{
+ dup currentcolorrendering eq{
+ pop
+ }{
+ begin
+ /Intent Intent def
+ currentdict
+ end
+ setcolorrendering
+ }ifelse
+}def
+/cdndf
+{
+ exch dup currentdict exch known{
+ pop pop
+ }{
+ exch def
+ }ifelse
+}def
+/cpaint_gcomp
+{
+ convert_to_process Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf
+ Adobe_AGM_Core/AGMCORE_ConvertToProcess get not
+ {
+ (%end_cpaint_gcomp) flushinput
+ }if
+}def
+/cpaint_gsep
+{
+ Adobe_AGM_Core/AGMCORE_ConvertToProcess get
+ {
+ (%end_cpaint_gsep) flushinput
+ }if
+}def
+/cpaint_gend
+{
+ newpath
+}def
+/AGMCORE_ctm_stack bdict
+ /push_ctm {
+ stack length size le{
+ stack dup length 2 mul array
+ dup /stack exch def
+ copy pop
+ }if
+ stack size 3 -1 roll put
+ /size size 1 add def
+ }
+ /pop_ctm {
+ /size size 1 sub def
+ size 0 lt{
+ /size 0 def
+ }if
+ stack size get
+ }
+ /stack 1 array
+ /size 0
+edict
+def
+/save_ctm
+{
+ matrix currentmatrix AGMCORE_ctm_stack begin
+ push_ctm
+ end
+}def
+/restore_ctm
+{
+ AGMCORE_ctm_stack begin
+ pop_ctm
+ end
+ setmatrix
+}def
+/path_rez
+{
+ dup 0 ne{
+ AGMCORE_deviceDPI exch div
+ dup 1 lt{
+ pop 1
+ }if
+ setflat
+ }{
+ pop
+ }ifelse
+}def
+/rdcmntline {
+ currentfile AGMCORE_str256 readline pop
+ (%) anchorsearch {pop} if
+} def
+/set_spot_alias_ary
+{
+ /AGMCORE_SpotAliasAry where{
+ pop pop
+ }{
+ Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf
+ true set_spot_alias
+ }ifelse
+}def
+/set_spot_alias
+{
+ /AGMCORE_SpotAliasAry where{
+ /AGMCORE_current_spot_alias 3 -1 roll put
+ }{
+ pop
+ }ifelse
+}def
+/current_spot_alias
+{
+ /AGMCORE_SpotAliasAry where{
+ /AGMCORE_current_spot_alias get
+ }{
+ false
+ }ifelse
+}def
+/map_alias
+{
+ /AGMCORE_SpotAliasAry where{
+ begin
+ /AGMCORE_name xdf
+ false
+ AGMCORE_SpotAliasAry{
+ dup/Name get AGMCORE_name eq{
+ save exch
+ /Adobe_AGM_Core currentdict def
+ /CSD get get_csd
+ exch restore
+ exch pop true
+ exit
+ }{
+ pop
+ }ifelse
+ }forall
+ end
+ }{
+ pop false
+ }ifelse
+}bdf
+/spot_alias
+{
+ true set_spot_alias
+
+ /AGMCORE_&setcustomcolor AGMCORE_key_known not {
+ Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put
+ } if
+ /customcolor_tint 1 AGMCORE_gput
+
+ Adobe_AGM_Core begin
+ /setcustomcolor
+ {
+
+ dup /customcolor_tint exch AGMCORE_gput
+
+ current_spot_alias{
+ 1 index 4 get map_alias{
+ mark 3 1 roll
+ setsepcolorspace
+ counttomark 0 ne{
+ setsepcolor
+ }if
+ pop
+ pop
+ }{
+ AGMCORE_&setcustomcolor
+ }ifelse
+ }{
+ AGMCORE_&setcustomcolor
+ }ifelse
+ }bdf
+ end
+}def
+/begin_feature
+{
+ Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put
+ count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put
+ {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if
+}def
+/end_feature
+{
+ 2 dict begin
+ /spd /setpagedevice load def
+ /setpagedevice { get_gstate spd set_gstate } def
+ stopped{$error/newerror false put}if
+ end
+ count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse
+ countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse
+ {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if
+}def
+/set_negative
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_inverting exch def
+ level2{
+ currentpagedevice/NegativePrint known{
+ currentpagedevice/NegativePrint get Adobe_AGM_Core/AGMCORE_inverting get ne{
+ true begin_feature true{
+ bdict /NegativePrint Adobe_AGM_Core/AGMCORE_inverting get edict setpagedevice
+ }end_feature
+ }if
+ /AGMCORE_inverting false def
+ }if
+ }if
+ AGMCORE_inverting{
+ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer
+ gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse
+ fill grestore
+ }if
+ end
+}def
+/lw_save_restore_override {
+ /md where {
+ pop
+ md begin
+ /pmSVsetup{} def
+ /endp{}def
+ /pse{}def
+ /psb{}def
+ /orig_showpage where
+ {pop}
+ {/orig_showpage /showpage load def}
+ ifelse
+ /showpage {orig_showpage gR} def
+ end
+ }if
+}def
+/pscript_showpage_override {
+ /NTPSOct95 where
+ {
+ begin
+ showpage
+ save
+ /showpage /restore load def
+ /restore {exch pop}def
+ end
+ }if
+}def
+/driver_media_override
+{
+ /md where {
+ pop
+ md /initializepage known {
+ md /initializepage {} put
+ } if
+ md /rC known {
+ md /rC {4{pop}repeat} put
+ } if
+ }if
+
+ Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put
+}def
+/driver_check_media_override
+{
+ Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne
+ {
+ Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix
+ }if
+}def
+AGMCORE_err_strings begin
+ /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def
+ /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def
+ /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def
+end
+end
+systemdict /setpacking known
+{
+ setpacking
+} if
+%%EndResource
+%%BeginResource: procset Adobe_CoolType_Core 2.12 0
+%%Copyright: Copyright 1997-2001 Adobe Systems Incorporated. All Rights Reserved.
+%%Version: 2.12 0
+userdict/Adobe_CoolType_Core 60 dict dup begin put/Level2? systemdict
+/languagelevel known dup{pop systemdict/languagelevel get 2 ge}if def Level2?
+not{/currentglobal false def/setglobal/pop load def/gcheck{pop false}bind def
+/currentpacking false def/setpacking/pop load def/SharedFontDirectory 0 dict
+def}if currentpacking true setpacking/@_SaveStackLevels{Adobe_CoolType_Data
+begin @opStackCountByLevel @opStackLevel 2 copy known not{2 copy 3 dict dup
+/args 7 index 5 add array put put get}{get dup/args get dup length 3 index lt{
+dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch/args
+exch put}{pop}ifelse}ifelse begin count 2 sub 1 index lt{pop count 1 sub}if
+dup/argCount exch def dup 0 gt{exch 1 index 2 add 1 roll args exch 0 exch
+getinterval astore pop}{pop}ifelse count 1 sub/restCount exch def end
+/@opStackLevel @opStackLevel 1 add def countdictstack 1 sub
+ at dictStackCountByLevel exch @dictStackLevel exch put/@dictStackLevel
+ at dictStackLevel 1 add def end}bind def/@_RestoreStackLevels{
+Adobe_CoolType_Data begin/@opStackLevel @opStackLevel 1 sub def
+ at opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt{{pop
+}repeat}{pop}ifelse args 0 argCount getinterval{}forall end/@dictStackLevel
+ at dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end
+countdictstack exch sub dup 0 gt{{end}repeat}{pop}ifelse}bind def
+/@_PopStackLevels{Adobe_CoolType_Data begin/@opStackLevel @opStackLevel 1 sub
+def/@dictStackLevel @dictStackLevel 1 sub def end}bind def/@Raise{exch cvx
+exch errordict exch get exec stop}bind def/@ReRaise{cvx $error/errorname get
+errordict exch get exec stop}bind def/@Stopped{0 @#Stopped}bind def/@#Stopped{
+ at _SaveStackLevels stopped{@_RestoreStackLevels true}{@_PopStackLevels false}
+ifelse}bind def/@Arg{Adobe_CoolType_Data begin @opStackCountByLevel
+ at opStackLevel 1 sub get/args get exch get end}bind def/doc_setup{
+Adobe_CoolType_Core begin/mov/moveto load def/nfnt/newencodedfont load def
+/mfnt/makefont load def/sfnt/setfont load def/ufnt/undefinefont load def/chp
+/charpath load def/awsh/awidthshow load def/wsh/widthshow load def/ash/ashow
+load def/sh/show load def end userdict/Adobe_CoolType_Data 6 dict dup begin
+/AddWidths? false def/CC 0 def/charcode 2 string def/@opStackCountByLevel 32
+dict def/@opStackLevel 0 def/@dictStackCountByLevel 32 dict def
+/@dictStackLevel 0 def end put}bind def/doc_trailer{currentdict
+Adobe_CoolType_Core eq{end}if}bind def/page_setup{Adobe_CoolType_Core begin}
+bind def/page_trailer{end}bind def/unload{systemdict/languagelevel known{
+systemdict/languagelevel get 2 ge{userdict/Adobe_CoolType_Core 2 copy known{
+undef}{pop pop}ifelse}if}if}bind def/ndf{1 index where{pop pop pop}{dup xcheck
+{bind}if def}ifelse}def/findfont dup systemdict begin userdict begin
+/globaldict where{/globaldict get begin}if dup where pop exch get/globaldict
+where{pop end}if end end def/systemfindfont/findfont load def/undefinefont{pop
+}ndf/copyfont{currentglobal 3 1 roll 1 index gcheck setglobal dup null eq{0}{
+dup length}ifelse 2 index length add 1 add dict begin exch{1 index/FID eq{pop
+pop}{def}ifelse}forall dup null eq{pop}{{def}forall}ifelse currentdict end
+exch setglobal}bind def/copyarray{currentglobal exch dup gcheck setglobal dup
+length array copy exch setglobal}bind def/newencodedfont{currentglobal{
+SharedFontDirectory 3 index known{SharedFontDirectory 3 index get
+/FontReferenced known}{false}ifelse}{FontDirectory 3 index known{FontDirectory
+3 index get/FontReferenced known}{SharedFontDirectory 3 index known{
+SharedFontDirectory 3 index get/FontReferenced known}{false}ifelse}ifelse}
+ifelse dup{3 index findfont/FontReferenced get 2 index findfont ne{pop false}
+if}if{pop 1 index findfont/Encoding get exch 0 1 255{2 copy get 3 index 3 1
+roll put}for pop pop pop}{findfont dup dup maxlength 2 add dict begin exch{1
+index/FID ne{def}{pop pop}ifelse}forall/FontReferenced exch def/Encoding exch
+dup length array copy def/FontName 1 index dup type/stringtype eq{cvn}if def
+currentdict end definefont pop}ifelse}bind def/SetSubstituteStrategy{
+$SubstituteFont begin dup type/dicttype ne{0 dict}if currentdict/$Strategies
+known{exch $Strategies exch 2 copy known{get 2 copy maxlength exch maxlength
+add dict begin{def}forall{def}forall currentdict dup/$Init known{dup/$Init get
+exec}if end/$Strategy exch def}{pop pop pop}ifelse}{pop pop}ifelse end}bind
+def/scff{$SubstituteFont begin dup type/stringtype eq{dup length exch}{null}
+ifelse/$sname exch def/$slen exch def end{findfont}@Stopped{dup length dup 21
+add string dup 4 3 roll 0 exch 128 string cvs putinterval exch 1 index exch
+(_was-malformed-so-was)putinterval cvn{findfont}@Stopped{pop/Courier findfont}
+if}if $SubstituteFont begin/$sname null def/$slen 0 def end}bind def
+/isWidthsOnlyFont{dup/WidthsOnly known{pop pop true}{dup/FDepVector known{
+/FDepVector get{isWidthsOnlyFont dup{exit}if}forall}{dup/FDArray known{
+/FDArray get{isWidthsOnlyFont dup{exit}if}forall}{pop}ifelse}ifelse}ifelse}
+bind def/?set{$SubstituteFont begin/$substituteFound false def/$fontname 4
+index def/$doSmartSub false def end 3 index findfont $SubstituteFont begin
+$substituteFound{false}{dup/FontName known{dup/FontName get $fontname eq 1
+index/DistillerFauxFont known not and/currentdistillerparams where{pop false 2
+index isWidthsOnlyFont not and}if}{false}ifelse}ifelse exch pop/$doSmartSub
+true def end{exch pop exch pop exch 2 dict dup/Found 3 index put exch findfont
+exch}{exch exec exch findfont 2 dict dup/Downloaded 6 5 roll put}ifelse dup
+/FontName 4 index put copyfont definefont pop}bind def/?str1 256 string def
+/?str2 256 string def/?add{1 index type/integertype eq{exch true 4 2}{false 3
+1}ifelse roll 1 index findfont dup/Widths known{Adobe_CoolType_Data/AddWidths?
+true put gsave dup 1000 scalefont setfont}if/Downloaded known{exec exch{exch
+?str2 cvs exch findfont/Downloaded get 1 dict begin/Downloaded 1 index def
+?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1
+index add ?str1 2 index(*)putinterval ?str1 0 2 index getinterval cvn findfont
+?str1 3 index(+)putinterval 2 dict dup/FontName ?str1 0 6 index getinterval
+cvn put dup/Downloaded Downloaded put end copyfont dup/FontName get exch
+definefont pop pop pop}{pop}ifelse}{pop exch{findfont dup/Found get dup length
+exch ?str1 cvs pop ?str1 1 index(+)putinterval ?str1 1 index 1 add 4 index
+?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add
+getinterval cvn 1 dict exch 1 index exch/FontName exch put copyfont dup
+/FontName get exch definefont pop}{pop}ifelse}ifelse Adobe_CoolType_Data
+/AddWidths? get{grestore Adobe_CoolType_Data/AddWidths? false put}if}bind def
+/?sh{currentfont/Downloaded known{exch}if pop}bind def/?chp{currentfont
+/Downloaded known{pop}{false chp}ifelse}bind def/?mv{currentfont/Downloaded
+known{moveto pop pop}{pop pop moveto}ifelse}bind def setpacking userdict
+/$SubstituteFont 25 dict put 1 dict begin/SubstituteFont dup $error exch 2
+copy known{get}{pop pop{pop/Courier}bind}ifelse def/currentdistillerparams
+where dup{pop pop currentdistillerparams/CannotEmbedFontPolicy 2 copy known{
+get/Error eq}{pop pop false}ifelse}if not{countdictstack array dictstack 0 get
+begin userdict begin $SubstituteFont begin/$str 128 string def/$fontpat 128
+string def/$slen 0 def/$sname null def/$match false def/$fontname null def
+/$substituteFound false def/$doSmartSub true def/$depth 0 def/$fontname null
+def/$italicangle 26.5 def/$dstack null def/$Strategies 10 dict dup begin
+/$Type3Underprint{currentglobal exch false setglobal 11 dict begin/UseFont
+exch $WMode 0 ne{dup length dict copy dup/WMode $WMode put/UseFont exch
+definefont}if def/FontName $fontname dup type/stringtype eq{cvn}if def
+/FontType 3 def/FontMatrix[.001 0 0 .001 0 0]def/Encoding 256 array dup 0 1
+255{/.notdef put dup}for pop def/FontBBox[0 0 0 0]def/CCInfo 7 dict dup begin
+/cc null def/x 0 def/y 0 def end def/BuildChar{exch begin CCInfo begin 1
+string dup 0 3 index put exch pop/cc exch def UseFont 1000 scalefont setfont
+cc stringwidth/y exch def/x exch def x y setcharwidth $SubstituteFont
+/$Strategy get/$Underprint get exec 0 0 moveto cc show x y moveto end end}bind
+def currentdict end exch setglobal}bind def/$GetaTint 2 dict dup begin
+/$BuildFont{dup/WMode known{dup/WMode get}{0}ifelse/$WMode exch def $fontname
+exch dup/FontName known{dup/FontName get dup type/stringtype eq{cvn}if}{
+/unnamedfont}ifelse exch $deepcopyfont exch 1 index exch/FontBasedOn exch put
+dup/FontName $fontname dup type/stringtype eq{cvn}if put definefont}bind def
+/$Underprint{gsave x abs y abs gt{/y 1000 def}{/x -1000 def 500 120 translate}
+ifelse Level2?{[/Separation(All)/DeviceCMYK{0 0 0 1 pop}]setcolorspace}{0
+setgray}ifelse 10 setlinewidth x .8 mul[7 3]{y mul 8 div 120 sub x 10 div exch
+moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave
+Level2?{.2 setcolor}{.8 setgray}ifelse fill grestore stroke}forall pop
+grestore}bind def end def/$Oblique 1 dict dup begin/$BuildFont{currentglobal
+exch dup gcheck setglobal null copyfont begin/FontBasedOn currentdict/FontName
+known{FontName dup type/stringtype eq{cvn}if}{/unnamedfont}ifelse def/FontName
+$fontname dup type/stringtype eq{cvn}if def/currentdistillerparams where{pop}{
+/FontInfo currentdict/FontInfo known{FontInfo null copyfont}{2 dict}ifelse dup
+begin/ItalicAngle $italicangle def/FontMatrix FontMatrix[1 0 ItalicAngle dup
+sin exch cos div 1 0 0]matrix concatmatrix readonly end 4 2 roll def def}
+ifelse FontName currentdict end definefont exch setglobal}bind def end def
+/$None 1 dict dup begin/$BuildFont{}bind def end def end def/$Oblique
+SetSubstituteStrategy/$findfontByEnum{dup type/stringtype eq{cvn}if dup
+/$fontname exch def $sname null eq{$str cvs dup length $slen sub $slen
+getinterval}{pop $sname}ifelse $fontpat dup 0(fonts/*)putinterval exch 7 exch
+putinterval/$match false def $SubstituteFont/$dstack countdictstack array
+dictstack put mark{$fontpat 0 $slen 7 add getinterval{/$match exch def exit}
+$str filenameforall}stopped{cleardictstack currentdict true $SubstituteFont
+/$dstack get{exch{1 index eq{pop false}{true}ifelse}{begin false}ifelse}forall
+pop}if cleartomark/$slen 0 def $match false ne{$match(fonts/)anchorsearch pop
+pop cvn}{/Courier}ifelse}bind def/$ROS 1 dict dup begin/Adobe 4 dict dup begin
+/Japan1[/Ryumin-Light/HeiseiMin-W3/GothicBBB-Medium/HeiseiKakuGo-W5
+/HeiseiMaruGo-W4/Jun101-Light]def/Korea1[/HYSMyeongJo-Medium/HYGoThic-Medium]
+def/GB1[/STSong-Light/STHeiti-Regular]def/CNS1[/MKai-Medium/MHei-Medium]def
+end def end def/$cmapname null def/$deepcopyfont{dup/FontType get 0 eq{1 dict
+dup/FontName/copied put copyfont begin/FDepVector FDepVector copyarray 0 1 2
+index length 1 sub{2 copy get $deepcopyfont dup/FontName/copied put/copied
+exch definefont 3 copy put pop pop}for def currentdict end}{$Strategies
+/$Type3Underprint get exec}ifelse}bind def/$buildfontname{length $str 1 index
+(-)putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname
+length add $str exch 0 exch getinterval cvn}bind def/$findfontByROS{/$fontname
+exch def $ROS Registry 2 copy known{get Ordering 2 copy known{get}{pop pop[]}
+ifelse}{pop pop[]}ifelse false exch{dup/CIDFont resourcestatus{pop pop save 1
+index/CIDFont findresource dup/WidthsOnly known{dup/WidthsOnly get}{false}
+ifelse exch pop exch restore{pop}{exch pop true exit}ifelse}{pop}ifelse}forall
+{$str cvs $buildfontname}{false(*){save exch dup/CIDFont findresource dup
+/WidthsOnly known{dup/WidthsOnly get not}{true}ifelse exch/CIDSystemInfo get
+dup/Registry get Registry eq exch/Ordering get Ordering eq and and{exch
+restore exch pop true exit}{pop restore}ifelse}$str/CIDFont resourceforall{
+$buildfontname}{$fontname $findfontByEnum}ifelse}ifelse}bind def end end
+currentdict/$error known currentdict/languagelevel known and dup{pop $error
+/SubstituteFont known}if dup{$error}{Adobe_CoolType_Core}ifelse begin{
+/SubstituteFont/CMap/Category resourcestatus{pop pop{$SubstituteFont begin
+/$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt
+and{$sname null eq{dup $str cvs dup length $slen sub $slen getinterval cvn}{
+$sname}ifelse dup/CMap resourcestatus{pop pop dup/$cmapname exch def/CMap
+findresource/CIDSystemInfo get{def}forall $findfontByROS}{128 string cvs dup
+(-)search{3 1 roll search{3 1 roll pop{dup cvi}stopped{pop pop pop pop pop
+$findfontByEnum}{4 2 roll pop pop exch length exch 2 index length 2 index sub
+exch 1 sub -1 0{$str cvs dup length 4 index 0 4 index 4 3 roll add getinterval
+exch 1 index exch 3 index exch putinterval dup/CMap resourcestatus{pop pop 4 1
+roll pop pop pop dup/$cmapname exch def/CMap findresource/CIDSystemInfo get{
+def}forall $findfontByROS true exit}{pop}ifelse}for dup type/booleantype eq{
+pop}{pop pop $findfontByEnum}ifelse}ifelse}{pop pop pop $findfontByEnum}ifelse
+}{pop pop $findfontByEnum}ifelse}ifelse}{//SubstituteFont exec}ifelse/$slen 0
+def end}}{{$SubstituteFont begin/$substituteFound true def dup length $slen gt
+$sname null ne or $slen 0 gt and{$findfontByEnum}{//SubstituteFont exec}ifelse
+end}}ifelse bind readonly def Adobe_CoolType_Core/scfindfont/systemfindfont
+load put}{/scfindfont{$SubstituteFont begin dup systemfindfont dup/FontName
+known{dup/FontName get dup 3 index ne}{/noname true}ifelse dup{
+/$origfontnamefound 2 index def/$origfontname 4 index def/$substituteFound
+true def}if exch pop{$slen 0 gt $sname null ne 3 index length $slen gt or and{
+pop dup $findfontByEnum findfont dup maxlength 1 add dict begin{1 index/FID eq
+{pop pop}{def}ifelse}forall currentdict end definefont dup/FontName known{dup
+/FontName get}{null}ifelse $origfontnamefound ne{$origfontname $str cvs print
+( substitution revised, using )print dup/FontName known{dup/FontName get}{
+(unspecified font)}ifelse $str cvs print(.
+)print}if}{exch pop}ifelse}{exch pop}ifelse end}bind def}ifelse end end
+Adobe_CoolType_Core/findfont{$SubstituteFont begin $depth 0 eq{/$fontname 1
+index dup type/stringtype ne{$str cvs}if def/$substituteFound false def}if
+/$depth $depth 1 add def end scfindfont $SubstituteFont begin/$depth $depth 1
+sub def $substituteFound $depth 0 eq and $doSmartSub and{currentdict/$Strategy
+known{$Strategy/$BuildFont get exec}if}if end}bind put}if end end
+%%EndResource
+%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.13 0
+%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated.
+%%Version: 1.13 0
+systemdict/languagelevel known dup{currentglobal false setglobal}{false}ifelse
+exch userdict/Adobe_CoolType_Utility 2 copy known{2 copy get dup maxlength 25
+add dict copy}{25 dict}ifelse put Adobe_CoolType_Utility begin/ct_Level2? exch
+def/ct_Clone? 1183615869 internaldict dup/CCRun known not exch/eCCRun known
+not ct_Level2? and or def/ct_UseNativeCapability? systemdict/composefont known
+def/ct_MakeOCF 35 dict def/ct_Vars 25 dict def/ct_GlyphDirProcs 6 dict def
+/ct_BuildCharDict 15 dict dup begin/charcode 2 string def/dst_string 1500
+string def/nullstring()def/usewidths? true def end def ct_Level2?{setglobal}{
+pop}ifelse ct_GlyphDirProcs begin/GetGlyphDirectory{systemdict/languagelevel
+known{pop/CIDFont findresource/GlyphDirectory get}{1 index/CIDFont
+findresource/GlyphDirectory get dup type/dicttype eq{dup dup maxlength exch
+length sub 2 index lt{dup length 2 index add dict copy 2 index/CIDFont
+findresource/GlyphDirectory 2 index put}if}if exch pop exch pop}ifelse +}def/+
+{systemdict/languagelevel known{currentglobal false setglobal 3 dict begin/vm
+exch def}{1 dict begin}ifelse/$ exch def systemdict/languagelevel known{vm
+setglobal/gvm currentglobal def $ gcheck setglobal}if ?{$ begin}if}def/?{$
+type/dicttype eq}def/|{userdict/Adobe_CoolType_Data known{Adobe_CoolType_Data
+/AddWidths? known{currentdict Adobe_CoolType_Data begin begin AddWidths?{
+Adobe_CoolType_Data/CC 3 index put ?{def}{$ 3 1 roll put}ifelse CC charcode
+exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put
+stringwidth 2 array astore currentfont/Widths get exch CC exch put}{?{def}{$ 3
+1 roll put}ifelse}ifelse end end}{?{def}{$ 3 1 roll put}ifelse}ifelse}{?{def}{
+$ 3 1 roll put}ifelse}ifelse}def/!{?{end}if systemdict/languagelevel known{gvm
+setglobal}if end}def/:{string currentfile exch readstring pop}executeonly def
+end ct_MakeOCF begin/ct_cHexEncoding[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09
+/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C
+/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F
+/c30/c31/c32/c33/c34/c35/c36/c37/c38/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42
+/c43/c44/c45/c46/c47/c48/c49/c4A/c4B/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55
+/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68
+/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B
+/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E
+/c8F/c90/c91/c92/c93/c94/c95/c96/c97/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1
+/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4
+/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7
+/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA
+/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED
+/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def
+/ct_CID_STR_SIZE 8000 def/ct_mkocfStr100 100 string def/ct_defaultFontMtx[.001
+0 0 .001 0 0]def/ct_1000Mtx[1000 0 0 1000 0 0]def/ct_raise{exch cvx exch
+errordict exch get exec stop}bind def/ct_reraise{cvx $error/errorname get
+(Error: )print dup( )cvs print errordict exch get exec stop
+}bind def/ct_cvnsi{1 index add 1 sub 1 exch 0 4 1 roll{2 index exch get exch 8
+bitshift add}for exch pop}bind def/ct_GetInterval{Adobe_CoolType_Utility
+/ct_BuildCharDict get begin/dst_index 0 def dup dst_string length gt{dup
+string/dst_string exch def}if 1 index ct_CID_STR_SIZE idiv/arrayIndex exch def
+2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub{dup 3 index
+add 2 index length le{2 index getinterval dst_string dst_index 2 index
+putinterval length dst_index add/dst_index exch def exit}{1 index length 1
+index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval
+pop dup dst_index add/dst_index exch def sub/arrayIndex arrayIndex 1 add def 2
+index dup length arrayIndex gt{arrayIndex get}{pop exit}ifelse 0}ifelse}loop
+pop pop pop dst_string 0 dst_index getinterval end}bind def ct_Level2?{
+/ct_resourcestatus currentglobal mark true setglobal{/unknowninstancename
+/Category resourcestatus}stopped{cleartomark setglobal true}{cleartomark
+currentglobal not exch setglobal}ifelse{{mark 3 1 roll/Category findresource
+begin ct_Vars/vm currentglobal put({ResourceStatus} stopped)0()/SubFileDecode
+filter cvx exec{cleartomark false}{{3 2 roll pop true}{cleartomark false}
+ifelse}ifelse ct_Vars/vm get setglobal end}}{{resourcestatus}}ifelse bind def
+/CIDFont/Category ct_resourcestatus{pop pop}{currentglobal true setglobal
+/Generic/Category findresource dup length dict copy dup/InstanceType/dicttype
+put/CIDFont exch/Category defineresource pop setglobal}ifelse
+ct_UseNativeCapability?{/CIDInit/ProcSet findresource begin 12 dict begin
+begincmap/CIDSystemInfo 3 dict dup begin/Registry(Adobe)def/Ordering(Identity)
+def/Supplement 0 def end def/CMapName/Identity-H def/CMapVersion 1 def
+/CMapType 1 def 1 begincodespacerange<0000><ffff>endcodespacerange 1
+begincidrange<0000><ffff>0 endcidrange endcmap CMapName currentdict/CMap
+defineresource pop end end}if}{/ct_Category 2 dict begin/CIDFont 10 dict def
+/ProcSet 2 dict def currentdict end def/defineresource{ct_Category 1 index 2
+copy known{get dup dup maxlength exch length eq{dup length 10 add dict copy
+ct_Category 2 index 2 index put}if 3 index 3 index put pop exch pop}{pop pop
+/defineresource/undefined ct_raise}ifelse}bind def/findresource{ct_Category 1
+index 2 copy known{get 2 index 2 copy known{get 3 1 roll pop pop}{pop pop
+/findresource/undefinedresource ct_raise}ifelse}{pop pop/findresource
+/undefined ct_raise}ifelse}bind def/resourcestatus{ct_Category 1 index 2 copy
+known{get 2 index known exch pop exch pop{0 -1 true}{false}ifelse}{pop pop
+/findresource/undefined ct_raise}ifelse}bind def/ct_resourcestatus
+/resourcestatus load def}ifelse/ct_CIDInit 2 dict begin/ct_cidfont_stream_init
+{{dup(Binary)eq{pop null currentfile ct_Level2?{{cid_BYTE_COUNT()
+/SubFileDecode filter}stopped{pop pop pop}if}if/readstring load exit}if dup
+(Hex)eq{pop currentfile ct_Level2?{{null exch/ASCIIHexDecode filter/readstring
+}stopped{pop exch pop(>)exch/readhexstring}if}{(>)exch/readhexstring}ifelse
+load exit}if/StartData/typecheck ct_raise}loop cid_BYTE_COUNT ct_CID_STR_SIZE
+le{2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put
+}{cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1
+exch{2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop}for 2
+index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch
+1 index length 1 sub exch put}ifelse cid_CIDFONT exch/GlyphData exch put 2
+index null eq{pop pop pop}{pop/readstring load 1 string exch{3 copy exec pop
+dup length 0 eq{pop pop pop pop pop true exit}if 4 index eq{pop pop pop pop
+false exit}if}loop pop}ifelse}bind def/StartData{mark{currentdict dup/FDArray
+get 0 get/FontMatrix get 0 get .001 eq{dup/CDevProc known not{/CDevProc
+1183615869 internaldict/stdCDevProc 2 copy known{get}{pop pop{pop pop pop pop
+pop 0 -1000 7 index 2 div 880}}ifelse def}if}{/CDevProc{pop pop pop pop pop 0
+1 cid_temp/cid_CIDFONT get/FDArray get 0 get/FontMatrix get 0 get div 7 index
+2 div 1 index .88 mul}def}ifelse/cid_temp 15 dict def cid_temp begin
+/cid_CIDFONT exch def 3 copy pop dup/cid_BYTE_COUNT exch def 0 gt{
+ct_cidfont_stream_init FDArray{/Private get dup/SubrMapOffset known{begin
+/Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2?{
+currentdict dup/SubrMapOffset undef dup/SubrCount undef/SDBytes undef}if end
+/cid_SD_BYTES exch def/cid_SUBR_COUNT exch def/cid_SUBR_MAP_OFFSET exch def
+/cid_SUBRS exch def cid_SUBR_COUNT 0 gt{GlyphData cid_SUBR_MAP_OFFSET
+cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub{
+exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch
+cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll
+GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put}
+for pop}if}{pop}ifelse}forall}if cleartomark pop pop end CIDFontName
+currentdict/CIDFont defineresource pop end end}stopped{cleartomark/StartData
+ct_reraise}if}bind def currentdict end def/ct_saveCIDInit{/CIDInit/ProcSet
+ct_resourcestatus{true}{/CIDInitC/ProcSet ct_resourcestatus}ifelse{pop pop
+/CIDInit/ProcSet findresource ct_UseNativeCapability?{pop null}{/CIDInit
+ct_CIDInit/ProcSet defineresource pop}ifelse}{/CIDInit ct_CIDInit/ProcSet
+defineresource pop null}ifelse ct_Vars exch/ct_oldCIDInit exch put}bind def
+/ct_restoreCIDInit{ct_Vars/ct_oldCIDInit get dup null ne{/CIDInit exch/ProcSet
+defineresource pop}{pop}ifelse}bind def/ct_BuildCharSetUp{1 index begin
+CIDFont begin Adobe_CoolType_Utility/ct_BuildCharDict get begin/ct_dfCharCode
+exch def/ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge{pop
+0}if/cid exch def{GlyphDirectory cid 2 copy known{get}{pop pop nullstring}
+ifelse dup length FDBytes sub 0 gt{dup FDBytes 0 ne{0 FDBytes ct_cvnsi}{pop 0}
+ifelse/fdIndex exch def dup length FDBytes sub FDBytes exch getinterval
+/charstring exch def exit}{pop cid 0 eq{/charstring nullstring def exit}if/cid
+0 def}ifelse}loop}def/ct_SetCacheDevice{0 0 moveto dup stringwidth 3 -1 roll
+true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto}
+def/ct_CloneSetCacheProc{1 eq{stringwidth pop -2 div -880 0 -1000 setcharwidth
+moveto}{usewidths?{currentfont/Widths get cid 2 copy known{get exch pop aload
+pop}{pop pop stringwidth}ifelse}{stringwidth}ifelse setcharwidth 0 0 moveto}
+ifelse}def/ct_Type3ShowCharString{ct_FDDict fdIndex 2 copy known{get}{
+currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup
+maxlength dict copy begin FDArray fdIndex get dup/FontMatrix 2 copy known{get}
+{pop pop ct_defaultFontMtx}ifelse/FontMatrix exch dup length array copy def
+/Private get/Private exch def/Widths rootfont/Widths get def/CharStrings 1
+dict dup/.notdef<d841272cf18f54fc13>dup length string copy put def currentdict
+end/ct_Type1Font exch definefont dup 5 1 roll put setglobal}ifelse dup
+/CharStrings get 1 index/Encoding get ct_dfCharCode get charstring put
+rootfont/WMode 2 copy known{get}{pop pop 0}ifelse exch 1000 scalefont setfont
+ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold{
+currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth
+setlinewidth stroke}{ct_str1 show}ifelse}def/ct_Type4ShowCharString{ct_dfDict
+ct_dfCharCode charstring FDArray fdIndex get dup/FontMatrix get dup
+ct_defaultFontMtx ct_matrixeq not{ct_1000Mtx matrix concatmatrix concat}{pop}
+ifelse/Private get Adobe_CoolType_Utility/ct_Level2? get not{ct_dfDict/Private
+3 -1 roll{put}1183615869 internaldict/superexec get exec}if 1183615869
+internaldict Adobe_CoolType_Utility/ct_Level2? get{1 index}{3 index/Private
+get mark 6 1 roll}ifelse dup/RunInt known{/RunInt get}{pop/CCRun}ifelse get
+exec Adobe_CoolType_Utility/ct_Level2? get not{cleartomark}if}bind def
+/ct_BuildCharIncremental{{Adobe_CoolType_Utility/ct_MakeOCF get begin
+ct_BuildCharSetUp ct_ShowCharString}stopped{stop}if end end end end}bind def
+/BaseFontNameStr(BF00)def/ct_Type1FontTemplate 14 dict begin/FontType 1 def
+/FontMatrix[.001 0 0 .001 0 0]def/FontBBox[-250 -250 1250 1250]def/Encoding
+ct_cHexEncoding def/PaintType 0 def currentdict end def/BaseFontTemplate 11
+dict begin/FontMatrix[.001 0 0 .001 0 0]def/FontBBox[-250 -250 1250 1250]def
+/Encoding ct_cHexEncoding def/BuildChar/ct_BuildCharIncremental load def
+ct_Clone?{/FontType 3 def/ct_ShowCharString/ct_Type3ShowCharString load def
+/ct_dfSetCacheProc/ct_CloneSetCacheProc load def/ct_SyntheticBold false def
+/ct_StrokeWidth 1 def}{/FontType 4 def/Private 1 dict dup/lenIV 4 put def
+/CharStrings 1 dict dup/.notdef<d841272cf18f54fc13>put def/PaintType 0 def
+/ct_ShowCharString/ct_Type4ShowCharString load def}ifelse/ct_str1 1 string def
+currentdict end def/BaseFontDictSize BaseFontTemplate length 5 add def
+/ct_matrixeq{true 0 1 5{dup 4 index exch get exch 3 index exch get eq and dup
+not{exit}if}for exch pop exch pop}bind def/ct_makeocf{15 dict begin exch/WMode
+exch def exch/FontName exch def/FontType 0 def/FMapType 2 def/FontMatrix
+matrix def/bfCount 1 index/CIDCount get 256 idiv 1 add dup 256 gt{pop 256}if
+def/Encoding 256 array 0 1 bfCount 1 sub{2 copy dup put pop}for bfCount 1 255{
+2 copy bfCount put pop}for def/FDepVector bfCount dup 256 lt{1 add}if array
+def BaseFontTemplate BaseFontDictSize dict copy begin/CIDFont exch def CIDFont
+/FontBBox known{CIDFont/FontBBox get/FontBBox exch def}if CIDFont/CDevProc
+known{CIDFont/CDevProc get/CDevProc exch def}if currentdict end
+BaseFontNameStr 3(0)putinterval 0 1 bfCount dup 256 eq{1 sub}if{FDepVector
+exch 2 index BaseFontDictSize dict copy begin dup/CIDFirstByte exch 256 mul
+def FontType 3 eq{/ct_FDDict 2 dict def}if currentdict end 1 index 16
+BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put}
+for ct_Clone?{/Widths 1 index/CIDFont get/GlyphDirectory get length dict def}
+if FontName currentdict end definefont ct_Clone?{gsave dup 1000 scalefont
+setfont ct_BuildCharDict begin/usewidths? false def currentfont/Widths get
+begin exch/CIDFont get/GlyphDirectory get{pop dup charcode exch 1 index 0 2
+index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore
+def}forall end/usewidths? true def end grestore}{exch pop}ifelse}bind def
+/ct_ComposeFont{ct_UseNativeCapability?{2 index/CMap ct_resourcestatus{pop pop
+exch pop}{/CIDInit/ProcSet findresource begin 12 dict begin begincmap/CMapName
+3 index def/CMapVersion 1 def/CMapType 1 def exch/WMode exch def/CIDSystemInfo
+3 dict dup begin/Registry(Adobe)def/Ordering CMapName ct_mkocfStr100 cvs
+(Adobe-)search{pop pop(-)search{dup length string copy exch pop exch pop}{pop
+(Identity)}ifelse}{pop(Identity)}ifelse def/Supplement 0 def end def 1
+begincodespacerange<0000><ffff>endcodespacerange 1 begincidrange<0000><ffff>0
+endcidrange endcmap CMapName currentdict/CMap defineresource pop end end}
+ifelse composefont}{3 2 roll pop 0 get/CIDFont findresource ct_makeocf}ifelse}
+bind def/ct_MakeIdentity{ct_UseNativeCapability?{1 index/CMap
+ct_resourcestatus{pop pop}{/CIDInit/ProcSet findresource begin 12 dict begin
+begincmap/CMapName 2 index def/CMapVersion 1 def/CMapType 1 def/CIDSystemInfo
+3 dict dup begin/Registry(Adobe)def/Ordering CMapName ct_mkocfStr100 cvs
+(Adobe-)search{pop pop(-)search{dup length string copy exch pop exch pop}{pop
+(Identity)}ifelse}{pop(Identity)}ifelse def/Supplement 0 def end def 1
+begincodespacerange<0000><ffff>endcodespacerange 1 begincidrange<0000><ffff>0
+endcidrange endcmap CMapName currentdict/CMap defineresource pop end end}
+ifelse composefont}{exch pop 0 get/CIDFont findresource ct_makeocf}ifelse}bind
+def currentdict readonly pop end end
+%%EndResource
+Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end
+%%BeginResource: procset Adobe_AGM_Image 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright (C) 2000-2000 Adobe Systems, Inc. All Rights Reserved.
+systemdict /setpacking known
+{
+ currentpacking
+ true setpacking
+} if
+userdict /Adobe_AGM_Image 65 dict dup begin put
+/Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def
+/nd{
+ null def
+}bind def
+/AGMIMG_&image nd
+/AGMIMG_&colorimage nd
+%%don't initialize AGMIMG_&customcolorimage, it wrecks havoc in a nested environment
+%%AGMIMG_ccimage_exists not {/AGMIMG_&customcolorimage nd} if
+/AGMIMG_&imagemask nd
+/AGMIMG_mbuf () def
+/AGMIMG_ybuf () def
+/AGMIMG_kbuf () def
+/AGMIMG_c 0 def
+/AGMIMG_m 0 def
+/AGMIMG_y 0 def
+/AGMIMG_k 0 def
+/AGMIMG_tmp nd
+/AGMIMG_imagestring0 nd
+/AGMIMG_imagestring1 nd
+/AGMIMG_imagestring2 nd
+/AGMIMG_imagestring3 nd
+/AGMIMG_imagestring4 nd
+/AGMIMG_imagestring5 nd
+/AGMIMG_cnt nd
+/AGMIMG_fsave nd
+/AGMIMG_colorAry nd
+/AGMIMG_override nd
+/AGMIMG_name nd
+/invert_image_samples nd
+/knockout_image_samples nd
+/img nd
+/sepimg nd
+/idximg nd
+/doc_setup
+{
+ Adobe_AGM_Core begin
+ Adobe_AGM_Image begin
+ /AGMIMG_&image systemdict/image get def
+ /AGMIMG_&imagemask systemdict/imagemask get def
+ /colorimage where{
+ pop
+ /AGMIMG_&colorimage /colorimage ldf
+ }if
+ end
+ end
+}def
+/page_setup
+{
+ Adobe_AGM_Image begin
+ /AGMIMG_ccimage_exists {/customcolorimage where
+ {
+ pop
+ /Adobe_AGM_OnHost_Seps where
+ {
+ pop false
+ }{
+ /Adobe_AGM_InRip_Seps where
+ {
+ pop false
+ }{
+ true
+ }ifelse
+ }ifelse
+ }{
+ false
+ }ifelse
+ }bdf
+ level2{
+ /invert_image_samples
+ {
+ Adobe_AGM_Image/AGMIMG_tmp Decode length ddf
+ /Decode [ Decode 1 get Decode 0 get] def
+ }def
+ /knockout_image_samples
+ {
+ Operator/imagemask ne{
+ /Decode [1 1] def
+ }if
+ }def
+ }{
+ /invert_image_samples
+ {
+ {1 exch sub} currenttransfer addprocs settransfer
+ }def
+ /knockout_image_samples
+ {
+ { pop 1 } currenttransfer addprocs settransfer
+ }def
+ }ifelse
+ /img /imageormask ldf
+ /sepimg /sep_imageormask ldf
+ /idximg /indexed_imageormask ldf
+ currentdict{
+ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{
+ bind
+ }if
+ def
+ }forall
+}def
+/page_trailer
+{
+ end
+}def
+/doc_trailer
+{
+}def
+/imageormask_sys
+{
+ begin
+ save mark
+ level2{
+ currentdict
+ Operator /imagemask eq{
+ AGMIMG_&imagemask
+ }{
+ AGMIMG_&image
+ }ifelse
+ }{
+ Width Height
+ Operator /imagemask eq{
+ Decode 0 get 1 eq Decode 1 get 0 eq and
+ ImageMatrix /DataSource load
+ AGMIMG_&imagemask
+ }{
+ BitsPerComponent ImageMatrix /DataSource load
+ AGMIMG_&image
+ }ifelse
+ }ifelse
+ cleartomark restore
+ end
+}def
+/overprint_plate
+{
+ currentoverprint{
+ 0 get
+ dup /DeviceGray eq{
+ pop AGMCORE_black_plate not
+ }{
+ /DeviceCMYK eq{
+ AGMCORE_is_cmyk_sep not
+ }if
+ }ifelse
+ }{
+ false
+ }ifelse
+}def
+/imageormask
+{
+ begin
+ SkipImageProc not{
+ save mark
+ level2 AGMCORE_host_sep not and{
+ currentdict
+ Operator /imagemask eq{
+ imagemask
+ }{
+ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{
+ [/Separation /Black /DeviceGray {}] setcolorspace
+ /Decode [ Decode 1 get Decode 0 get ] def
+ }if
+ image
+ }ifelse
+ }{
+ Width Height
+ Operator /imagemask eq{
+ Decode 0 get 1 eq Decode 1 get 0 eq and
+ ImageMatrix /DataSource load
+ AGMCORE_host_sep{
+ currentgray 1 ne{
+ currentdict imageormask_sys
+ }{
+ currentoverprint not{
+ 1 AGMCORE_&setgray
+ knockout_image_samples
+ currentdict imageormask_sys
+ }{
+ currentdict ignoreimagedata
+ }ifelse
+ }ifelse
+ }{
+ imagemask
+ }ifelse
+ }{
+ BitsPerComponent ImageMatrix
+ MultipleDataSources{
+ 0 1 NComponents 1 sub{
+ DataSource exch get
+ }for
+ }{
+ /DataSource load
+ }ifelse
+ Operator /colorimage eq{
+ AGMCORE_host_sep{
+ MultipleDataSources level2 or NComponents 4 eq and{
+ MultipleDataSources{
+ 4 {pop} repeat
+ /DataSource [
+ DataSource 0 get /exec cvx
+ DataSource 1 get /exec cvx
+ DataSource 2 get /exec cvx
+ DataSource 3 get /exec cvx
+ /AGMCORE_get_ink_data cvx
+ ] cvx def
+ }{
+ /DataSource /DataSource load filter_cmyk 0 () /SubFileDecode filter def
+ }ifelse
+
+ /Decode [ Decode 0 get Decode 1 get ] def
+ /MultipleDataSources false def
+ /NComponents 1 def
+ /Operator /image def
+ AGMCORE_is_cmyk_sep{
+ currentoverprint InksUsed current_ink not and{
+ currentdict consumeimagedata
+ }{
+ invert_image_samples
+ 1 AGMCORE_&setgray
+ currentdict imageormask_sys
+ }ifelse
+ }{
+ currentdict ignoreimagedata
+ }ifelse
+ }{
+
+ MultipleDataSources NComponents AGMIMG_&colorimage
+ }ifelse
+ }{
+ true NComponents colorimage
+ }ifelse
+ }{
+ Operator /image eq{
+ AGMCORE_host_sep{
+ /DoImage true def
+ HostSepColorImage{
+ invert_image_samples
+ }{
+ AGMCORE_black_plate not{
+ /DoImage false def
+ currentdict ignoreimagedata
+ }if
+ }ifelse
+ 1 AGMCORE_&setgray
+ DoImage
+ {currentdict imageormask_sys} if
+ }{
+ image
+ }ifelse
+ }{
+ Operator/knockout eq{
+ pop pop pop pop pop
+ currentoverprint InksUsed current_ink not and{
+ }{
+ currentcolorspace overprint_plate not{
+ knockout_unitsq
+ }if
+ }ifelse
+ }if
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ cleartomark restore
+ }if
+ end
+}def
+/sep_imageormask
+{
+ /sep_colorspace_dict AGMCORE_gget begin
+ /MappedCSA CSA map_csa def
+ begin
+ SkipImageProc not{
+ save mark
+
+ AGMCORE_avoid_L2_sep_space{
+ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def
+ }if
+ AGMIMG_ccimage_exists
+ MappedCSA 0 get /DeviceCMYK eq and
+ currentdict/Components known and
+ Name () ne and
+ Name (All) ne and
+ Operator /image eq and
+ AGMCORE_producing_seps not and
+ level2 not and
+ {
+ Width Height BitsPerComponent ImageMatrix
+ [
+ /DataSource load /exec cvx
+ {
+ 0 1 2 index length 1 sub{
+ 1 index exch
+ 2 copy get 255 xor put
+ }for
+ } /exec cvx
+ ] cvx bind
+ MappedCSA 0 get /DeviceCMYK eq{
+ Components aload pop
+ }{
+ 0 0 0 Components aload pop 1 exch sub
+ }ifelse
+ Name findcmykcustomcolor
+ customcolorimage
+ }{
+ AGMCORE_producing_seps not{
+ level2{
+ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{
+ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt
+ /sep_tint AGMCORE_gget setcolor
+ }if
+ currentdict imageormask
+ }{
+ currentdict
+ Operator /imagemask eq{
+ imageormask
+ }{
+ sep_imageormask_lev1
+ }ifelse
+ }ifelse
+ }{
+ AGMCORE_host_sep{
+ Operator/knockout eq{
+ currentoverprint InksUsed current_ink not and{
+ }{
+ currentdict/ImageMatrix get concat
+ knockout_unitsq
+ }ifelse
+ }{
+ currentgray 1 ne{
+ AGMCORE_is_cmyk_sep Name (All) ne and{
+ level2{
+ [ /Separation Name [/DeviceGray]
+ {
+ sep_colorspace_proc AGMCORE_get_ink_data
+ 1 exch sub
+ } bind
+ ] AGMCORE_&setcolorspace
+ /sep_tint AGMCORE_gget AGMCORE_&setcolor
+ currentdict imageormask_sys
+ }{
+ currentdict
+ Operator /imagemask eq{
+ imageormask_sys
+ }{
+ sep_image_lev1_sep
+ }ifelse
+ }ifelse
+ }{
+ Operator/imagemask ne{
+ invert_image_samples
+ }if
+ currentdict imageormask_sys
+ }ifelse
+ }{
+ currentdict consumeimagedata
+ currentoverprint not Name (All) eq or{
+ gsave
+ knockout_unitsq
+ grestore
+ }if
+ }ifelse
+ }ifelse
+ }{
+ currentcolorspace 0 get /Separation ne{
+ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt
+ /sep_tint AGMCORE_gget setcolor
+ }if
+ currentoverprint
+ MappedCSA 0 get /DeviceCMYK eq and
+ Name inRip_spot_has_ink not and
+ Name (All) ne and {
+ imageormask_l2_overprint
+ }{
+ currentdict imageormask
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ cleartomark restore
+ }if
+ end
+ end
+}def
+/imageormask_l2_overprint
+{
+
+ currentdict
+ currentcmykcolor add add add 0 eq{
+ currentdict consumeimagedata
+ }{
+ level3{
+
+ currentcmykcolor
+ /AGMIMG_k xdf
+ /AGMIMG_y xdf
+ /AGMIMG_m xdf
+ /AGMIMG_c xdf
+ Operator/imagemask eq{
+ [/DeviceN [
+ AGMIMG_c 0 ne {/Cyan} if
+ AGMIMG_m 0 ne {/Magenta} if
+ AGMIMG_y 0 ne {/Yellow} if
+ AGMIMG_k 0 ne {/Black} if
+ ] /DeviceCMYK {}] setcolorspace
+
+ AGMIMG_c 0 ne {AGMIMG_c} if
+ AGMIMG_m 0 ne {AGMIMG_m} if
+ AGMIMG_y 0 ne {AGMIMG_y} if
+ AGMIMG_k 0 ne {AGMIMG_k} if
+ setcolor
+ }{
+ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def
+ [/Indexed
+ [
+ /DeviceN [
+ AGMIMG_c 0 ne {/Cyan} if
+ AGMIMG_m 0 ne {/Magenta} if
+ AGMIMG_y 0 ne {/Yellow} if
+ AGMIMG_k 0 ne {/Black} if
+ ]
+ /DeviceCMYK {
+ AGMIMG_k 0 eq {0} if
+ AGMIMG_y 0 eq {0 exch} if
+ AGMIMG_m 0 eq {0 3 1 roll} if
+ AGMIMG_c 0 eq {0 4 1 roll} if
+ }
+ ]
+ 255
+ {
+ 255 div
+
+ mark exch
+ dup dup dup
+
+
+ AGMIMG_k 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+
+ AGMIMG_y 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+
+ AGMIMG_m 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+
+ AGMIMG_c 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+ counttomark 1 add -1 roll pop
+ }
+ ] setcolorspace
+ }ifelse
+
+ imageormask_sys
+ }{
+ write_image_file{
+ currentcmykcolor
+ 0 ne{
+ [/Separation /Black /DeviceGray {}] setcolorspace
+ gsave
+ /Black
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ }if
+ 0 ne{
+ [/Separation /Yellow /DeviceGray {}] setcolorspace
+ gsave
+ /Yellow
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ }if
+ 0 ne{
+ [/Separation /Magenta /DeviceGray {}] setcolorspace
+ gsave
+ /Magenta
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ }if
+ 0 ne{
+ [/Separation /Cyan /DeviceGray {}] setcolorspace
+ gsave
+ /Cyan
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ } if
+ close_image_file
+ }{
+ imageormask
+ }ifelse
+ }ifelse
+ }ifelse
+} def
+/indexed_imageormask
+{
+ begin
+ save mark
+
+ currentdict
+ AGMCORE_host_sep{
+
+ Operator/knockout eq{
+ /indexed_colorspace_dict AGMCORE_gget /CSA get map_csa overprint_plate not{
+ knockout_unitsq
+ }if
+ }{
+ AGMCORE_is_cmyk_sep{
+ Operator /imagemask eq{
+ imageormask_sys
+ }{
+ level2{
+ indexed_image_lev2_sep
+ }{
+ indexed_image_lev1_sep
+ }ifelse
+ }ifelse
+ }{
+ currentoverprint not{
+ knockout_image_samples
+ imageormask_sys
+ }{
+ currentdict consumeimagedata
+ }ifelse
+ }ifelse
+ }ifelse
+ }{
+ level2{
+ imageormask
+ }{
+ Operator /imagemask eq{
+ imageormask
+ }{
+ indexed_imageormask_lev1
+ }ifelse
+ }ifelse
+ }ifelse
+ cleartomark restore
+ end
+}def
+/indexed_image_lev2_sep
+{
+ /indexed_colorspace_dict AGMCORE_gget begin
+ begin
+
+ currentcolorspace
+ dup 1 /DeviceGray put
+ dup 3 [
+ currentcolorspace 3 get
+ {
+ exch 4 mul 4 getinterval {} forall
+ AGMCORE_get_ink_data 255 div 1 exch sub
+ } /exec cvx
+ ] cvx put
+ setcolorspace
+
+ currentdict
+ Operator /imagemask eq{
+ AGMIMG_&imagemask
+ }{
+ AGMIMG_&image
+ }ifelse
+
+ end end
+}def
+/OPIimage
+{
+ dup type /dicttype ne{
+ 10 dict begin
+ /DataSource xdf
+ /ImageMatrix xdf
+ /BitsPerComponent xdf
+ /Height xdf
+ /Width xdf
+ /ImageType 1 def
+ /Decode [0 1 def]
+ currentdict
+ end
+ }if
+ dup begin
+ /NComponents 1 cdndf
+ /MultipleDataSources false cdndf
+ /SkipImageProc {false} cdndf
+ /HostSepColorImage false cdndf
+ /Decode [
+ 0
+ currentcolorspace 0 get /Indexed eq{
+ 2 BitsPerComponent exp 1 sub
+ }{
+ 1
+ }ifelse
+ ] cdndf
+ /Operator /image cdndf
+ end
+ /sep_colorspace_dict AGMCORE_gget null eq{
+ imageormask
+ }{
+ gsave
+ dup begin invert_image_samples end
+ sep_imageormask
+ grestore
+ }ifelse
+}def
+/spot_alias
+{
+ /mapto_sep_imageormask
+ {
+ dup type /dicttype ne{
+ 12 dict begin
+ /ImageType 1 def
+ /DataSource xdf
+ /ImageMatrix xdf
+ /BitsPerComponent xdf
+ /Height xdf
+ /Width xdf
+ /MultipleDataSources false def
+ }{
+ begin
+ }ifelse
+ /Decode [/customcolor_tint AGMCORE_gget 0] def
+ /Operator /image def
+ /HostSepColorImage false def
+ /InksUsed [] def
+ /SkipImageProc {false} def
+ currentdict
+ end
+ sep_imageormask
+ }bdf
+ /customcolorimage
+ {
+ Adobe_AGM_Image/AGMIMG_colorAry xddf
+ /customcolor_tint AGMCORE_gget
+ bdict
+ /Name AGMIMG_colorAry 4 get
+ /CSA [ /DeviceCMYK ]
+ /TintMethod /Subtractive
+ /TintProc null
+ /MappedCSA null
+ /NComponents 4
+ /Components [ AGMIMG_colorAry aload pop pop ]
+ edict
+ setsepcolorspace
+ mapto_sep_imageormask
+ }ndf
+ Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put
+ /customcolorimage
+ {
+ Adobe_AGM_Image/AGMIMG_override false put
+ dup 4 get map_alias{
+ /customcolor_tint AGMCORE_gget exch setsepcolorspace
+ pop
+ mapto_sep_imageormask
+ }{
+ AGMIMG_&customcolorimage
+ }ifelse
+ }bdf
+}def
+level2 not{
+ /colorbuf
+ {
+ 0 1 2 index length 1 sub{
+ dup 2 index exch get
+ 255 exch sub
+ 2 index
+ 3 1 roll
+ put
+ }for
+ }def
+ /tint_image_to_color
+ {
+ begin
+ Width Height BitsPerComponent ImageMatrix
+ /DataSource load
+ end
+ Adobe_AGM_Image begin
+ /AGMIMG_mbuf 0 string def
+ /AGMIMG_ybuf 0 string def
+ /AGMIMG_kbuf 0 string def
+ {
+ colorbuf dup length AGMIMG_mbuf length ne
+ {
+ dup length dup dup
+ /AGMIMG_mbuf exch string def
+ /AGMIMG_ybuf exch string def
+ /AGMIMG_kbuf exch string def
+ } if
+ dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop
+ }
+ addprocs
+ {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage
+ end
+ } def
+ /sep_imageormask_lev1
+ {
+ begin
+ MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{
+
+ {
+ 255 mul round cvi GrayLookup exch get
+ } currenttransfer addprocs settransfer
+ currentdict imageormask
+ }{
+ /sep_colorspace_dict AGMCORE_gget/Components known{
+ MappedCSA 0 get /DeviceCMYK eq{
+ Components aload pop
+ }{
+ 0 0 0 Components aload pop 1 exch sub
+ }ifelse
+
+ Adobe_AGM_Image/AGMIMG_k xddf
+ Adobe_AGM_Image/AGMIMG_y xddf
+ Adobe_AGM_Image/AGMIMG_m xddf
+ Adobe_AGM_Image/AGMIMG_c xddf
+
+ AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{
+ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer
+ currentdict imageormask
+ }{
+
+ currentcolortransfer
+ {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll
+ {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll
+ {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll
+ {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll
+ setcolortransfer
+ currentdict tint_image_to_color
+ }ifelse
+ }{
+
+ MappedCSA 0 get /DeviceGray eq {
+ {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer
+ currentdict imageormask
+ }{
+ MappedCSA 0 get /DeviceCMYK eq {
+ currentcolortransfer
+ {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll
+ setcolortransfer
+ currentdict tint_image_to_color
+ }{
+ currentcolortransfer
+ {pop 1} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll
+ setcolortransfer
+ currentdict tint_image_to_color
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ end
+ }def
+ /sep_image_lev1_sep
+ {
+ begin
+ /sep_colorspace_dict AGMCORE_gget/Components known{
+ Components aload pop
+
+ Adobe_AGM_Image/AGMIMG_k xddf
+ Adobe_AGM_Image/AGMIMG_y xddf
+ Adobe_AGM_Image/AGMIMG_m xddf
+ Adobe_AGM_Image/AGMIMG_c xddf
+
+ {AGMIMG_c mul 1 exch sub}
+ {AGMIMG_m mul 1 exch sub}
+ {AGMIMG_y mul 1 exch sub}
+ {AGMIMG_k mul 1 exch sub}
+ }{
+ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}
+ {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}
+ {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}
+ {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}
+ }ifelse
+
+ AGMCORE_get_ink_data currenttransfer addprocs settransfer
+
+ currentdict imageormask_sys
+
+ end
+ }def
+ /indexed_imageormask_lev1
+ {
+ /indexed_colorspace_dict AGMCORE_gget begin
+ begin
+ currentdict
+ MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{
+
+ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer
+ imageormask
+ }{
+
+ MappedCSA 0 get /DeviceGray eq {
+ {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer
+ imageormask
+ }{
+ MappedCSA 0 get /DeviceCMYK eq {
+ currentcolortransfer
+ {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ setcolortransfer
+ tint_image_to_color
+ }{
+ currentcolortransfer
+ {pop 1} exch addprocs 4 1 roll
+ {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll
+ {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll
+ {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll
+ setcolortransfer
+ tint_image_to_color
+ }ifelse
+ }ifelse
+ }ifelse
+ end end
+ }def
+ /indexed_image_lev1_sep
+ {
+ /indexed_colorspace_dict AGMCORE_gget begin
+ begin
+ {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub}
+ {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}
+ {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}
+ {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}
+
+ AGMCORE_get_ink_data currenttransfer addprocs settransfer
+
+ currentdict imageormask_sys
+
+ end end
+ }def
+}if
+end
+systemdict /setpacking known
+{
+ setpacking
+} if
+%%EndResource
+%ADOBeginClientInjection: DocumentProlog End "AI10"
+%ADOEndClientInjection: DocumentProlog End "AI10"
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndProlog
+%%BeginSetup
+%ADOBeginClientInjection: DocumentSetup Start "AI10"
+%ADOEndClientInjection: DocumentSetup Start "AI10"
+Adobe_AGM_Utils begin
+2 2010 true Adobe_AGM_Core/doc_setup get exec
+Adobe_CoolType_Core/doc_setup get exec
+Adobe_AGM_Image/doc_setup get exec
+%ADOBeginClientInjection: DocumentSetup End "AI10"
+%ADOEndClientInjection: DocumentSetup End "AI10"
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndSetup
+%%Page: rnaseP-bsu-alignment.pdf 1
+%%EndPageComments
+%%BeginPageSetup
+%ADOBeginClientInjection: PageSetup Start "AI10"
+%ADOEndClientInjection: PageSetup Start "AI10"
+Adobe_AGM_Utils begin
+Adobe_AGM_Core/page_setup get exec
+Adobe_CoolType_Core/page_setup get exec
+Adobe_AGM_Image/page_setup get exec
+%ADOBeginClientInjection: PageSetup End "AI10"
+%ADOEndClientInjection: PageSetup End "AI10"
+%%EndPageSetup
+Adobe_AGM_Core/AGMCORE_save save ddf
+1 -1 scale 0 -354.935 translate
+[1 0 0 1 0 0 ] concat
+mark
+/0
+[/DeviceGray] add_csa
+/CSA /0
+/1
+[/DeviceCMYK] add_csa
+/CSA /1
+/2
+[/DeviceRGB] add_csa
+/CSA /2
+cleartomark
+72 path_rez
+% page clip
+gsave
+newpath
+gsave % PSGState
+0 0 mo
+0 354.935 li
+381.998 354.935 li
+381.998 0 li
+clp
+[1 0 0 1 0 0 ] concat
+%ADOBeginClientInjection: BeginPageContent "AI10"
+%ADOEndClientInjection: BeginPageContent "AI10"
+gsave % PSGState
+0 0 mo
+382 0 li
+382 355 li
+0 355 li
+0 0 li
+clp
+false sop
+0 0 0 rgb
+%ADOBeginSubsetFont: Times-Roman Initial
+11 dict begin
+/FontName /Times-Roman def
+/FontMatrix [1 1000 div 0 0 1 1000 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+/FontInfo 1 dict dup begin
+ /OrigFontType /TrueType def
+end readonly def
+currentdict
+end
+
+systemdict begin
+dup /Private 7 dict dup begin
+/BlueValues [-15 0 600 650] def
+/MinFeature {16 16} def
+/password 5839 def
+/ND {def} def
+/NP {put} def
+/RD {string currentfile exch readhexstring pop} def
+2 index /CharStrings 230 dict dup begin
+/.notdef
+<10bf317079bb21e4> ND
+/space
+<10bf317079c757bf91> ND
+/one
+<10bf317005ace4116f46739a291c133ef5c0ce2c8299d65de3756bb6940c
+b4355dc475faba14c0bd0d8c1136c951297252e0da77fbc30bfee79150d7
+5cee48> ND
+/six
+<10bf31704faaa95022859bfa4d40a634d16b5c6e27e8179786696c20efcf
+f2088b8d3116daaeb3f47f771c5b59cc0afd89139a7c37c605cf8b53dc27
+380249aa5ea705e51497228cbe7f92dfdb05cb2c745bfad479a4a6102917
+98805f1e4ffd1913dac316084a3ad05d6714a918c36f9d6d45844ed149be
+369d7108e7fb694a36f8c56232e1bee9c1bea2fe67ff99030d5c6f5a581f
+b878427e68d526f4869e604a9c89abace85b55824dfe246365ef13eb1536
+bf4a0f83> ND
+/eight
+<10bf31704ab2181850c1a88d3f8fa202c5e0a8894b70ce17f00448b7f184
+829e93577c1d58c14cc019460ebe7600631f8f4acc93b4dd884803c9e3f1
+eb26f7c2cd1094133dc32c948b33940b19fa747b701ca51c9ee927a38f52
+04f2614165cbc422ca4714c03eef07c163ee39fa7bbff5cde214fd39a16b
+09cf85564b587c881bfef98a02ad1cc0a265a943373623af31c74485a733
+18d0f6f7f1d5ed232a51a44983dace620c95820f016744af813aa536566c
+47af1e2278efd37fbb5379807dfaa2e69d27f2b4a59d46b7d8d8efdb20e9
+60c77ba7077adbe4d33c0181893b161aacd6499116f6cdc8c2ee52d69d4b
+91aef33a637784e5f5c64baf9cca7942dfc3> ND
+/A
+<10bf31706d7ae346bffe29e0fb34e18312ccbb6302af22689ec4f2127a0d
+d6baf4773826f8362914832b0b84ca343a443e2c16a9118637ad6f1a2e1f
+aa1ebb04f7f1ef2a790258bcc86d11f5b7f6caa72bc1d0e46a538a95ab48
+ad3395878de6486f82> ND
+/N
+<10bf3170586d3968505ff87264be7ec883920688cca7d9d7ebef6b14adb4
+12cf47613ab238b5314909eaae4b807ef31a587fe4a79c426c98f895ee29
+85238abac441a7e05459a2603f6d28e75fb6badfa6e81418c0a638> ND
+/P
+<10bf3170599a82ae9dc9593cad300b7f3884414bb0569fe483f3acb617a1
+5ef395ef32cf0d220dc8440aff02a21bdf7646dba480081013ff057e6243
+9a50cbea5f9cb9a46c125151fa2dc458d75a798f192be2eb1f436a0d9567
+1d70b037f2931437b8312c06f4962bec94fe952154308850b7049bbc3ac6
+9301> ND
+/R
+<10bf3170422e6230a952872b5ad1dc4f16e3fc1704a02c61c5e992942e1e
+814f5a036cc714a19b83d8f9ec92957b9cc9c81e547da8ae77f074c9bd10
+73009734e431fccfd615ceda2428e8dccd0571a77f416f593adb1cae7381
+f103392cf96199bef077b31adee38fb7ba883b119f4671e1c9bf208bfda7
+5a094838b33f6ae85649043746a99b52c2cd46025fa2b9d4b4471e> ND
+/a
+<10bf3170599a125eccdb6ec27d3afe07da389ecbb305faf429012f717ba5
+d7a504001b7d2cf7722bd949e4b4b2e77bccdf0b2b1586d9915715766da7
+59741fe65bc64d6863ec1039a27d8da5681073bc991e2c740d0bf14aed2b
+81d80e811057a7a261d77619d9bcb0c3ef91c90a394016d3a96727d1d488
+dda1e7b4d3ff0a77767d899306fd13aca7aad2910e6e3aad69f172e3d8e3
+85dff5319dcca32104c930e0a4e2e49b8750bab4a9149ef2d730bda10f91
+592a2a46cc0c629469d818798f634569b83f99cf> ND
+/b
+<10bf31705374882f7387637dcbb704d72f8bd63b0bf65f4612fe0f27d529
+60722d7a45438cfde1168810ce04c91811250545cdbd6c10a87a474df160
+24b3215bec7af3c0b61e074082f1ba3141f39f480c2c5a76fd396a487a9d
+6a25d6aa36deda9c976e791661015e179d4f36b29dae4f0f04128d0e5ac3
+dde66d561d7806d481796866491fb9de890bfe> ND
+/c
+<10bf3170435d9d6bdc818a55004ae1aad80b146ef4640b9f7a82d0286ef2
+5db6c5bd65a97018eac616ec8d7499054c6ff6544566113eb456a3efeddc
+ccc8eb022ae4ed32a1cae1639526dcd4d63a5e0b6438bcaa9089a840ecbe
+5f5d623e9d44cd8703af9d371c430fcdb02e500bdbbffe37e3e86fac9735
+d4759aa66b0f12007edc114a586e0532e684a856c1> ND
+/e
+<10bf31705d647142da77f80383b39a2be6c45bc647b72e319ff73d610d1e
+62332d342ae09e16e6dc01192625d1af66f730c2b02413523b998639a5ab
+b7a878766d5d5ccb302e4a2339fd457ff9223aaf50bbf100079c44acb716
+0f80282571552fa2e287b218275ab71b88c3093968065977f1def2e827fa
+b94e763732c48dfc9ec49ad18a7a0f2ba5d9d70264> ND
+/i
+<10bf31705fce6507854bfd5453e743735818d40d67ec1532d846ec6eb57b
+a379fb65a427f99b32d98a51f57658ac9b227989b26d151d43cea1c989bf
+f139f48a1383fdef993f3563bc63dd976a127ddf8d3d4d> ND
+/l
+<10bf31705863e503408ecf9ecbcc5d318bb6318525c5b52ab08ec840ccd6
+ad0d498b316284b1f457be2054e4989ef3a09e1de6c846> ND
+/n
+<10bf3170573e563cfd092bc7aac9e949b8f7a4827fe0f5ce67cfeb547cc4
+0324c0c45558a88f1ea6ca3d00c7850dbdd4b3c992012bc75b427cf6ac8c
+46f4b1290c6a0924e21bd8fe2684be248ea4bd907856e7ca65331eac2fb6
+c7d64a4c51041fcdcbf442862c40d772e99c9a3d2660da8f8d1225eb9a38
+a0939af5d1> ND
+/o
+<10bf3170422f93576c717ee99d6736f12ef20213595672a3889f39fd79b8
+f8e03db4067972748506dd3e394e1ed21612adf9955de5d344645439263d
+16fe05d9f8432033df436bdbe971bdd0b4ca20ec935003ac05958f3374d5
+be4f84a5e6c035be86b4155b925e09a04220f0eb68246a69ca538a270f95
+b47c12aaed3b0426c82ce7bd8f92> ND
+/s
+<10bf317050d9b80120c19d821533341643354852ea9df97a99fd4ba774b7
+08c1fae708745f9328a1a9a5d21e169ff77ecdcd42f945703d067165d10e
+35df5f72d35341f01fb3026c906bf5dc9a4d1bcd00cb4fd389804aaed0c5
+179606cadf715c7fa2d902f17112979a83434b773005e3a14720c0ac9ccf
+50f62928be58f2d774787655c3e51c4ad2772c2dacd3e4a9b3e3d07c0e79
+b3bf6755ddd2a9f85c3008b885abd5da2aea4dd26daf39a061> ND
+/u
+<10bf31705374882f7c934ecd3b5e82940591cc2da5136b726bd97deea59d
+b5951369571544034f93f6e9e9bef396feae60a5b9c3456da1182921d60f
+51a03c79c508334f1146b564507198b89948780cf4b60418521ed73bbe7d
+3e228dcb5a9c016f8058dab9750074512ee3321a1b934119d8b6bef7f816
+c990fbfb206a15a63a5b88> ND
+end
+end
+put
+put
+dup /FontName get exch definefont pop
+end
+/Times-Roman findfont /Encoding get
+dup 32 /space put
+dup 49 /one put
+dup 54 /six put
+dup 56 /eight put
+dup 65 /A put
+dup 78 /N put
+dup 80 /P put
+dup 82 /R put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 101 /e put
+dup 105 /i put
+dup 108 /l put
+dup 110 /n put
+dup 111 /o put
+dup 115 /s put
+dup 117 /u put
+pop
+%ADOEndSubsetFont
+/Times-Roman*1
+[
+32{/.notdef}repeat /space 16{/.notdef}repeat /one 4{/.notdef}repeat /six /.notdef /eight
+8{/.notdef}repeat /A 12{/.notdef}repeat /N /.notdef /P /.notdef /R
+14{/.notdef}repeat /a /b /c /.notdef /e 3{/.notdef}repeat /i
+2{/.notdef}repeat /l /.notdef /n /o 3{/.notdef}repeat /s /.notdef
+/u 138{/.notdef}repeat
+] /Times-Roman nfnt
+/Times-Roman*1 findfont [11.2 0 0 -11.2 0 0 ]mfnt sfnt
+9.6001 249.84 mov
+(Ribonuclease P RNA) sh
+%ADOBeginSubsetFont: Times-Italic Initial
+11 dict begin
+/FontName /Times-Italic def
+/FontMatrix [1 1000 div 0 0 1 1000 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+/FontInfo 1 dict dup begin
+ /OrigFontType /TrueType def
+end readonly def
+currentdict
+end
+
+systemdict begin
+dup /Private 7 dict dup begin
+/BlueValues [-15 0 600 650] def
+/MinFeature {16 16} def
+/password 5839 def
+/ND {def} def
+/NP {put} def
+/RD {string currentfile exch readhexstring pop} def
+2 index /CharStrings 230 dict dup begin
+/.notdef
+<10bf317079bb21e4> ND
+/space
+<10bf317079c757bf91> ND
+/B
+<10bf31705d64d6cdd42bb9779be0e86f5463c50d39de4503a32a38432ef8
+03a82a198b57beba7d0e2cf1d169145c2fca29b941cd17eafb5127041a74
+4a42576c7ff804f144d8bac08830b984ff926f24c5ddc9d00af1f894ec60
+3a2f23b643e29ac1f79dcce3af9e0ba10b5f5ff9b631da0c21a11f0df8a9
+4a828ab5b3643d53851b0ff3fa42263b6174cf356840266da421770fb34e
+5a8782a1be3b9bd73e011ad0d21ddfd98f7bdba645cbc23007be2f42f4ec
+cd3eceec9d8357ad5017a49b620b8c4e3fa80f69ef> ND
+/a
+<10bf317040c2e74a508d6139dce14e3948d239d0634bbfaabf9e8d3c7573
+ed6fbf5dbea53ff369f531ee4a35d5d774411d751e898d06a82fb104c24e
+2e288c130578a51898d70e768e70e25015126de9836190adddf115525009
+d0b5cf5799cade59015ed746a61eea4e41b65101d4ece488aeb0eae27176
+fd995d93360fcb186f66fe5f540946011237ad8713367061b7184db6a67a
+996b98e53ecb5c8feb0582a80d88d56027b3ffcc55dfb4dc1ac3446fc8ff
+d6878cc714f800a67c3909395a6179cde4244303983fcb7be7e1a5e7> ND
+/b
+<10bf317050d929b04597d2887aaa3cb39da082bdf3ea60f85b72994c4851
+f08f3ee5204ae05f7d492a066ff24f84ba90afa1a601eeee0fe55a909ade
+2457ed9ad90a8f8cd020799924efeb4529d822d4bddca197310d22f8a6ff
+e732ca9da8e33fee470039f98bbf7aec1427462ba404fd435cadc484857c
+2cfd58ba2803a7f732e93dff70aa0b49357be72109830dc30de601> ND
+/c
+<10bf317040c23fc2eee4f57240df62f1391a1250ca71eb42052c6832a234
+04baa9e4ef1dec279a752431a80f654f5e0351e445249e6beb05a973cc41
+d8ead12d95f7556c161073e2684409ef6f29244cba09a6bb43b3bcffdfba
+d18d8daa29a3daa3e72edebd8ca6c6c1ffadc0e7cfd675d1eb71cae83aa4
+bb0d1ad30e10be4b78f720e6585f94cee8adb3f7cfca78> ND
+/i
+<10bf31705c397059959e269bc482cc232fb2cd355b1741c991d08977a1c7
+62a5e2889a63c2e040e22ffbaf41c04400cc31c3de7dcf350f3cdfb3edfa
+828dc964cb2f6eb442e0262df25f627edd720f9619db59fd5a8cd100c968
+4c5f4db9889b35c63fc8c08e> ND
+/l
+<10bf3170599590e4eca19c589f591b28c79c3ad915d374f9f929618cfd7b
+7292a0b167075ca805f5ad895e8e3b1ab4dbdd185639273e5baedc164de3
+0d0ee9bfd604> ND
+/s
+<10bf317050d9b8012f166408318a0ef0c2b3fc2c4bf046f43a31a13138cb
+3edd33b1e05a71393e8603bde246c06cf021e377498e36cd112cac2862cb
+d733c3012351e466a2c60874be76f3ffb0e88de0326be4951815ceb6e2b4
+a1c764b8b4750919db41ba568a843704ee79cbe791dd797a967fc4bf780b
+33396195d9608a7596aadb157b1c31c1f97e4cad9c00804f33d10c4f9e5f
+1e6e986043994c17686677d39f7196085e4700caad44794150> ND
+/t
+<10bf3170524a2d224620d65b924216aad176698198f7dbdeefeee3b7e580
+1e8252c00721d9a34af4c93982914cf535dd1a9978155b129f9b67696bf0
+657d3fef2c6bfe965ee59c94b9f93fb72b6a44> ND
+/u
+<10bf31705374882f7cad45500b0e5fc1923f9474edf8ae7c2afa92f5965f
+0bcd11cd39523ee039e5e47c732c2518eda5c63dbd537ee19396aa26dd3c
+9ca855b0af8601c8b03b7e99bc36c7e0756956abf922576b217fe237e605
+762d82cb64db160c556120838a3052e5b985f50e155c87442e0844e52fd7
+d391d6a97d97f2cb7c5822b12cf29083fbc643424ffc38d228> ND
+end
+end
+put
+put
+dup /FontName get exch definefont pop
+end
+/Times-Italic findfont /Encoding get
+dup 32 /space put
+dup 66 /B put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 105 /i put
+dup 108 /l put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+pop
+%ADOEndSubsetFont
+/Times-Italic*1
+[
+32{/.notdef}repeat /space 33{/.notdef}repeat /B 30{/.notdef}repeat /a /b /c
+5{/.notdef}repeat /i 2{/.notdef}repeat /l 6{/.notdef}repeat /s /t /u
+138{/.notdef}repeat
+] /Times-Italic nfnt
+/Times-Italic*1 findfont [11.2 0 0 -11.2 0 0 ]mfnt sfnt
+9.6001 261.041 mov
+(Bacillus subtilis) sh
+/Times-Roman*1 findfont [11.2 0 0 -11.2 0 0 ]mfnt sfnt
+81.4819 261.041 mov
+( 168) sh
+.980392 .0509804 .0431373 rgb
+%ADOBeginSubsetFont: Helvetica Initial
+11 dict begin
+/FontName /Helvetica def
+/FontMatrix [1 1000 div 0 0 1 1000 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+/FontInfo 1 dict dup begin
+ /OrigFontType /TrueType def
+end readonly def
+currentdict
+end
+
+systemdict begin
+dup /Private 7 dict dup begin
+/BlueValues [-15 0 600 650] def
+/MinFeature {16 16} def
+/password 5839 def
+/ND {def} def
+/NP {put} def
+/RD {string currentfile exch readhexstring pop} def
+2 index /CharStrings 230 dict dup begin
+/.notdef
+<10bf317079bb21e4> ND
+/A
+<10bf31706c4d8e6db23e4e7dd1042123534442eb7f8cee32689ada63ee09
+58823f2b2bd80b8cb54f7e8af1e8d4f10b0e131d22e003ae536d56abc669
+c65da4f461c503d44126b09469> ND
+end
+end
+put
+put
+dup /FontName get exch definefont pop
+end
+/Helvetica findfont /Encoding get
+dup 65 /A put
+pop
+%ADOEndSubsetFont
+/Helvetica*1
+[
+65{/.notdef}repeat /A 190{/.notdef}repeat
+] /Helvetica nfnt
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+184.851 217.841 mov
+(A) sh
+300.651 200.04 mo
+307.051 200.04 li
+307.051 191.24 li
+300.651 191.24 li
+300.651 200.04 li
+1 1 1 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+301.451 197.64 mov
+(A) sh
+.5 lw
+0 lc
+0 lj
+10 ml
+[] 0 dsh
+true sadj
+222.201 185.64 mo
+258.001 223.24 li
+258.001 344.641 li
+0 0 0 rgb
+s
+0 0 0 rgb
+%ADOBeginSubsetFont: Helvetica AddGlyphs
+
+systemdict begin
+/Helvetica
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/G
+<10bf317035a2615cb512b1acd8c36b3946ad235417226e7c6feda1fdef74
+15451c61806a71e65b7a339d50f1974c1bc4c34c3f930da0a6e9e3c37b22
+0a6e14e87efbddbec74bbcb62a658f0ec4a2c98ab177326480af33b18698
+75870b1cf019> ND
+/U
+<10bf31701b9d2e0e75dc1c6f9b5aea75bc3cfacfd128a955802855ea36c9
+10f8a868d77a647ceb09c04b8925af88dc46f95d195f8683dbe20f41ec> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Helvetica findfont /Encoding get
+dup 71 /G put
+dup 85 /U put
+pop
+%ADOEndSubsetFont
+/Helvetica*1
+[
+65{/.notdef}repeat /A 5{/.notdef}repeat /G 13{/.notdef}repeat /U 170{/.notdef}repeat
+] /Helvetica nfnt
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+121.65 322.44 mov
+(G) sh
+130.449 322.44 mov
+2.80081 0 (UU) ash
+.980392 .0509804 .0431373 rgb
+%ADOBeginSubsetFont: Helvetica AddGlyphs
+
+systemdict begin
+/Helvetica
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/C
+<10bf317030aa083cc281922089bc4994328331af6a654615083cfa8a590d
+c2a9c54536c70731aa752343a37dd604c4c28cec579aa316cc528b15cac7
+afb36b45f7a20bc9d34701f1c9f2574363d062989f34915e0d1f708b6ecd
+63a000a0329329f07c> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Helvetica findfont /Encoding get
+dup 67 /C put
+pop
+%ADOEndSubsetFont
+/Helvetica*1
+[
+65{/.notdef}repeat /A /.notdef /C 3{/.notdef}repeat /G 13{/.notdef}repeat /U
+170{/.notdef}repeat
+] /Helvetica nfnt
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+146.447 322.44 mov
+(C) sh
+154.454 322.642 mov
+(U) sh
+158.385 326.625 mo
+158.385 327.508 157.668 328.225 156.785 328.225 cv
+155.901 328.225 155.185 327.508 155.185 326.625 cv
+155.185 325.741 155.901 325.024 156.785 325.024 cv
+157.668 325.024 158.385 325.741 158.385 326.625 cv
+0 0 0 rgb
+ef
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+161.65 322.641 mov
+(U) sh
+164.401 324.44 mo
+164.401 329.641 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+168.851 322.641 mov
+(A) sh
+171.601 324.44 mo
+171.601 329.641 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+176.05 322.641 mov
+(A) sh
+178.801 324.44 mo
+178.801 329.641 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+183.25 322.641 mov
+(C) sh
+186.001 324.44 mo
+186.001 329.641 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+189.65 322.641 mov
+(G) sh
+193.201 324.44 mo
+193.201 329.641 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+197.65 322.641 mov
+(U) sh
+200.401 324.44 mo
+200.401 329.641 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+204.851 322.641 mov
+(U) sh
+207.601 324.44 mo
+207.601 329.641 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+212.05 322.641 mov
+(C) sh
+214.801 324.44 mo
+214.801 329.641 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+220.851 322.641 mov
+(G) sh
+224.401 324.44 mo
+224.401 329.641 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+228.851 322.641 mov
+(G) sh
+237.001 319.84 mo
+241.401 319.84 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+228.851 315.44 mov
+(G) sh
+237.001 312.641 mo
+241.401 312.641 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+229.65 308.24 mov
+(U) sh
+240.801 305.024 mo
+240.801 305.908 240.084 306.625 239.201 306.625 cv
+238.318 306.625 237.601 305.908 237.601 305.024 cv
+237.601 304.141 238.318 303.424 239.201 303.424 cv
+240.084 303.424 240.801 304.141 240.801 305.024 cv
+0 0 0 rgb
+ef
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+229.65 301.041 mov
+(A) sh
+237.001 298.24 mo
+241.401 298.24 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+229.65 293.84 mov
+(A) sh
+237.001 291.041 mo
+241.401 291.041 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+229.65 286.641 mov
+(U) sh
+237.001 283.84 mo
+241.401 283.84 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+229.65 279.44 mov
+(C) sh
+221.651 275.437 mov
+(G) sh
+212.853 269.835 mov
+(C) sh
+215.801 257.84 mo
+215.801 262.24 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+205.651 269.84 mov
+(U) sh
+208.601 257.84 mo
+208.601 262.24 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+197.65 269.84 mov
+(G) sh
+202.401 259.424 mo
+202.401 260.308 201.684 261.024 200.801 261.024 cv
+199.917 261.024 199.201 260.308 199.201 259.424 cv
+199.201 258.541 199.917 257.824 200.801 257.824 cv
+201.684 257.824 202.401 258.541 202.401 259.424 cv
+0 0 0 rgb
+ef
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+191.25 269.84 mov
+(C) sh
+194.201 257.84 mo
+194.201 262.24 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+184.05 269.84 mov
+(A) sh
+187.001 257.84 mo
+187.001 262.24 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+176.05 269.84 mov
+(G) sh
+179.801 257.84 mo
+179.801 262.24 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+169.65 269.84 mov
+(A) sh
+172.601 257.84 mo
+172.601 262.24 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+162.45 269.84 mov
+(U) sh
+165.401 257.84 mo
+165.401 262.24 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+155.25 273.041 mov
+(C) sh
+148.05 269.844 mov
+(U) sh
+144.854 262.644 mov
+(U) sh
+147.251 255.443 mov
+(G) sh
+155.25 252.247 mov
+(A) sh
+163.25 255.443 mov
+(A) sh
+170.449 255.443 mov
+2.0016 0 (UCU) ash
+191.25 255.443 mov
+(G) sh
+199.249 255.443 mov
+2.0016 0 (UA) ash
+212.85 255.443 mov
+(G) sh
+213.65 247.444 mov
+(A) sh
+213.247 239.445 mov
+(G) sh
+213.247 231.446 mov
+(G) sh
+213.65 223.447 mov
+(A) sh
+212.601 217.84 mo
+219.001 217.84 li
+219.001 209.04 li
+212.601 209.04 li
+212.601 217.84 li
+1 1 1 rgb
+ef
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+213.451 215.44 mov
+(A) sh
+213.652 207.441 mov
+(A) sh
+213.249 199.442 mov
+(G) sh
+207.251 194.64 mov
+(U) sh
+213.652 189.837 mov
+(C) sh
+213.652 181.838 mov
+(C) sh
+213.652 173.839 mov
+(A) sh
+213.652 165.839 mov
+(U) sh
+213.451 157.84 mov
+(G) sh
+213.652 149.841 mov
+(C) sh
+216.401 137.24 mo
+216.401 142.44 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+206.451 149.84 mov
+(U) sh
+209.201 137.24 mo
+209.201 142.44 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+199.25 149.84 mov
+(C) sh
+202.001 137.24 mo
+202.001 142.44 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+191.25 149.84 mov
+(G) sh
+194.801 137.24 mo
+194.801 142.44 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+184.851 149.84 mov
+(C) sh
+187.601 137.24 mo
+187.601 142.44 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+188.05 159.44 mov
+(A) sh
+181.801 156.64 mo
+186.201 156.64 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+188.05 166.64 mov
+(C) sh
+181.801 163.84 mo
+186.201 163.84 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+187.25 173.84 mov
+(G) sh
+181.801 171.04 mo
+186.201 171.04 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+187.25 181.04 mov
+(G) sh
+181.801 178.24 mo
+186.201 178.24 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+195.25 185.84 mov
+(U) sh
+187.251 190.642 mov
+(G) sh
+181.801 187.84 mo
+186.201 187.84 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+188.05 197.84 mov
+(C) sh
+181.801 195.04 mo
+186.201 195.04 li
+0 0 0 rgb
+s
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+192.851 204.24 mov
+(U) sh
+190.453 212.239 mov
+(G) sh
+176.053 217.841 mov
+(G) sh
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+171.25 212.239 mov
+(A) sh
+169.652 204.24 mov
+(U) sh
+172.849 197.839 mov
+(G) sh
+173.648 190.639 mov
+(C) sh
+173.648 181.042 mov
+(C) sh
+173.648 173.842 mov
+(C) sh
+172.849 166.642 mov
+(G) sh
+173.648 159.441 mov
+(U) sh
+166.448 161.839 mov
+(A) sh
+159.651 167.441 mov
+(G) sh
+152.048 163.841 mov
+(U) sh
+153.445 154.243 mov
+(G) sh
+161.048 152.242 mov
+(U) sh
+169.645 148.238 mov
+(U) sh
+163.244 144.235 mov
+(C) sh
+169.601 133.64 mo
+170.001 133.64 li
+170.001 134.04 li
+168.401 137.24 li
+168.001 137.24 li
+168.001 136.84 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+156.05 141.04 mov
+(G) sh
+148.85 140.241 mov
+(U) sh
+143.249 133.84 mov
+(G) sh
+136.049 136.237 mov
+(C) sh
+132.852 142.638 mov
+(C) sh
+129.655 149.039 mov
+(U) sh
+123.4 142.04 mo
+123.801 142.04 li
+127.4 143.84 li
+127.4 144.24 li
+127 144.24 li
+123.4 142.44 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+126.45 155.44 mov
+(A) sh
+120.201 148.44 mo
+120.601 148.44 li
+124.201 150.24 li
+124.201 150.64 li
+123.801 150.64 li
+120.201 148.84 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+121.65 161.84 mov
+(G) sh
+117 154.84 mo
+117.4 154.84 li
+121 156.64 li
+121 157.04 li
+120.601 157.04 li
+117 155.24 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+119.25 168.24 mov
+(C) sh
+113.801 161.24 mo
+114.201 161.24 li
+117.801 163.04 li
+117.801 163.44 li
+117.4 163.44 li
+113.801 161.64 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+121.65 175.44 mov
+(G) sh
+121.65 183.439 mov
+(A) sh
+117.647 190.639 mov
+(A) sh
+109.648 193.836 mov
+(G) sh
+102.448 193.836 mov
+(U) sh
+95.2476 190.639 mov
+(C) sh
+90.4453 183.439 mov
+(A) sh
+89.646 175.44 mov
+(U) sh
+92.8428 168.24 mov
+(A) sh
+98.4448 163.438 mov
+(A) sh
+105.645 161.839 mov
+(G) sh
+109.648 155.438 mov
+(C) sh
+113.651 149.038 mov
+(U) sh
+116.848 142.637 mov
+(A) sh
+119.245 136.236 mov
+(G) sh
+122.442 129.835 mov
+(G) sh
+120.044 121.836 mov
+(G) sh
+128.201 110.84 mo
+128.601 110.84 li
+128.601 111.24 li
+126.201 115.24 li
+125.801 115.24 li
+125.801 114.84 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+112.85 119.44 mov
+(C) sh
+105.65 118.641 mov
+(A) sh
+97.6509 117.841 mov
+(G) sh
+91.25 117.042 mov
+(U) sh
+95.9844 106.64 mo
+95.9844 107.523 95.2676 108.24 94.3843 108.24 cv
+93.5015 108.24 92.7847 107.523 92.7847 106.64 cv
+92.7847 105.756 93.5015 105.04 94.3843 105.04 cv
+95.2676 105.04 95.9844 105.756 95.9844 106.64 cv
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+84.0503 116.24 mov
+(C) sh
+87.8003 103.84 mo
+88.2007 103.84 li
+88.2007 104.24 li
+87.4004 109.04 li
+87.0005 109.04 li
+87.0005 108.64 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+76.8501 115.44 mov
+(U) sh
+81.0005 102.84 mo
+81.4004 102.84 li
+81.4004 103.24 li
+80.6006 108.04 li
+80.2002 108.04 li
+80.2002 107.64 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+68.8501 116.24 mov
+(U) sh
+63.2485 110.638 mov
+(U) sh
+64.0474 102.639 mov
+(A) sh
+70.4482 98.6357 mov
+(G) sh
+78.4473 101.033 mov
+(A) sh
+84.8481 101.833 mov
+(G) sh
+92.0483 102.631 mov
+(G) sh
+100.047 103.431 mov
+(C) sh
+107.248 104.23 mov
+(U) sh
+115.045 105.029 mov
+(G) sh
+122.447 103.431 mov
+(A) sh
+128.048 109.032 mov
+(C) sh
+134.449 106.635 mov
+(G) sh
+142.601 106.04 mo
+143 106.04 li
+147 108.44 li
+147 108.84 li
+146.601 108.84 li
+142.601 106.44 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+137.65 100.24 mov
+(G) sh
+145.801 99.6396 mo
+146.201 99.6396 li
+150.201 102.04 li
+150.201 102.44 li
+149.801 102.44 li
+145.801 100.04 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+133.65 94.6396 mov
+(C) sh
+128.048 88.2388 mov
+(A) sh
+120.849 84.2358 mov
+(G) sh
+129.4 73.8394 mo
+129.801 73.8394 li
+129.801 74.2397 li
+127.4 77.4395 li
+127 77.4395 li
+127 77.0396 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+115.25 79.4395 mov
+(G) sh
+109.648 75.4365 mov
+(A) sh
+117.801 65.2397 mo
+118.201 65.2397 li
+118.201 65.6396 li
+115.801 68.8394 li
+115.4 68.8394 li
+115.4 68.4395 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+102.45 78.6396 mov
+(A) sh
+94.4512 79.439 mov
+(A) sh
+87.251 77.041 mov
+(A) sh
+80.8501 71.4395 mov
+(A) sh
+77.6533 64.2397 mov
+(A) sh
+75.2559 56.2402 mov
+(G) sh
+82.6006 45.2393 mo
+83.0005 45.2393 li
+83.0005 45.6392 li
+81.4004 49.6396 li
+81.0005 49.6396 li
+81.0005 49.2393 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+69.6499 53.8394 mov
+(C) sh
+76.2002 42.2393 mo
+76.6006 42.2393 li
+76.6006 42.6392 li
+75.0005 46.6392 li
+74.6006 46.6392 li
+74.6006 46.2393 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+63.25 50.6396 mov
+(C) sh
+69.6006 39.4395 mo
+70.0005 39.4395 li
+70.0005 39.8394 li
+68.4004 43.8394 li
+68.0005 43.8394 li
+68.0005 43.4395 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+56.0498 53.0396 mov
+(U) sh
+48.0508 50.6421 mov
+(A) sh
+42.4492 45.0405 mov
+(C) sh
+40.8511 37.041 mov
+(G) sh
+50.4321 28.2554 mo
+50.4321 29.1387 49.7153 29.8555 48.8325 29.8555 cv
+47.9492 29.8555 47.2324 29.1387 47.2324 28.2554 cv
+47.2324 27.3721 47.9492 26.6553 48.8325 26.6553 cv
+49.7153 26.6553 50.4321 27.3721 50.4321 28.2554 cv
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+36.0498 32.2393 mov
+(U) sh
+44.8003 22.4395 mo
+45.2002 22.4395 li
+45.2002 22.8394 li
+42.8003 26.0396 li
+42.4004 26.0396 li
+42.4004 25.6392 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+31.25 27.4395 mov
+(C) sh
+39.2002 17.6392 mo
+39.6001 17.6392 li
+39.6001 18.0396 li
+37.2002 21.2393 li
+36.8003 21.2393 li
+36.8003 20.8394 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+24.0498 23.4395 mov
+(U) sh
+22.4517 16.2393 mov
+(U) sh
+28.0532 9.83838 mov
+2.0016 0 (CG) ash
+39.2563 17.0386 mov
+(G) sh
+45.6572 21.042 mov
+(A) sh
+51.2588 25.8442 mov
+2.8008 0 (UA) ash
+65.6587 30.6465 mov
+(U) sh
+68.0562 37.8467 mov
+(G) sh
+75.2563 40.2441 mov
+(G) sh
+82.4565 43.4409 mov
+(C) sh
+88.8574 38.6382 mov
+(U) sh
+96.0571 37.04 mov
+(G) sh
+104.855 37.8394 mov
+(A) sh
+110.457 41.8423 mov
+(G) sh
+116.858 48.2432 mov
+(U) sh
+119.255 56.2427 mov
+(A) sh
+118.457 64.2417 mov
+(U) sh
+124.058 68.2446 mov
+(C) sh
+130.459 72.248 mov
+(C) sh
+136.061 76.2515 mov
+(U) sh
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+137.061 68.252 mov
+(U) sh
+142.058 62.0527 mov
+(G) sh
+148.055 68.0503 mov
+(A) sh
+146.054 76.2515 mov
+(A) sh
+144.052 84.4521 mov
+(A) sh
+146.45 91.4502 mov
+(G) sh
+152.051 86.6479 mov
+(U) sh
+158.601 86.8398 mo
+159 86.8398 li
+161.401 90.0396 li
+161.401 90.4395 li
+161.001 90.4395 li
+158.601 87.2397 li
+0 0 0 rgb
+ef
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+157.65 80.2397 mov
+(G) sh
+167.793 82.6396 mo
+167.793 83.5229 167.076 84.2397 166.193 84.2397 cv
+165.31 84.2397 164.593 83.5229 164.593 82.6396 cv
+164.593 81.7563 165.31 81.0396 166.193 81.0396 cv
+167.076 81.0396 167.793 81.7563 167.793 82.6396 cv
+0 0 0 rgb
+ef
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+164.05 74.6396 mov
+(C) sh
+168.853 69.8374 mov
+(C) sh
+175.201 70.8394 mo
+175.601 70.8394 li
+178.001 74.0396 li
+178.001 74.4395 li
+177.601 74.4395 li
+175.201 71.2397 li
+0 0 0 rgb
+ef
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+165.65 62.6396 mov
+(A) sh
+164.052 54.6401 mov
+(C) sh
+164.052 46.6411 mov
+(A) sh
+165.65 38.6421 mov
+(G) sh
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+169.654 32.2412 mov
+(U) sh
+174.456 25.8403 mov
+(G) sh
+181.656 21.8374 mov
+(A) sh
+189.655 18.6406 mov
+(C) sh
+196.855 17.8413 mov
+(G) sh
+205.653 18.6406 mov
+(A) sh
+212.854 21.0381 mov
+(A) sh
+218.455 25.8403 mov
+(G) sh
+224.856 31.4419 mov
+(U) sh
+229.801 33.2393 mo
+230.201 33.2393 li
+231.801 37.2393 li
+231.801 37.6392 li
+231.401 37.6392 li
+229.801 33.6392 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+231.25 28.2393 mov
+(C) sh
+236.201 30.0396 mo
+236.601 30.0396 li
+238.201 34.0396 li
+238.201 34.4395 li
+237.801 34.4395 li
+236.201 30.4395 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+238.451 25.8394 mov
+(U) sh
+242.801 27.0396 mo
+243.201 27.0396 li
+244.801 31.0396 li
+244.801 31.4395 li
+244.401 31.4395 li
+242.801 27.4395 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+244.851 22.6392 mov
+(C) sh
+251.251 19.4429 mov
+(A) sh
+256.201 21.2393 mo
+256.601 21.2393 li
+258.201 25.2393 li
+258.201 25.6392 li
+257.801 25.6392 li
+256.201 21.6392 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+257.651 16.2393 mov
+(C) sh
+262.601 18.0396 mo
+263.001 18.0396 li
+264.601 22.0396 li
+264.601 22.4395 li
+264.201 22.4395 li
+262.601 18.4395 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+264.051 13.8394 mov
+(U) sh
+271.185 17.0234 mo
+271.185 17.9067 270.468 18.6235 269.585 18.6235 cv
+268.702 18.6235 267.985 17.9067 267.985 17.0234 cv
+267.985 16.1401 268.702 15.4233 269.585 15.4233 cv
+270.468 15.4233 271.185 16.1401 271.185 17.0234 cv
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+271.251 10.6392 mov
+(A) sh
+275.401 12.4395 mo
+275.801 12.4395 li
+277.401 16.4395 li
+277.401 16.8394 li
+277.001 16.8394 li
+275.401 12.8394 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+276.851 5.83936 mov
+(G) sh
+284.85 7.4375 mov
+(A) sh
+288.047 15.437 mov
+(A) sh
+284.85 22.6367 mov
+(A) sh
+276.851 23.436 mov
+(U) sh
+269.651 26.6328 mov
+(G) sh
+263.25 29.8291 mov
+(G) sh
+256.849 33.0259 mov
+(U) sh
+249.649 35.4238 mov
+(G) sh
+244.047 38.6201 mov
+(A) sh
+236.848 41.8169 mov
+(G) sh
+231.246 44.2148 mov
+(A) sh
+230.447 52.2139 mov
+(G) sh
+230.447 60.2131 mov
+(U) sh
+226.444 67.4131 mov
+(G) sh
+222.44 74.6128 mov
+(G) sh
+216.839 79.4155 mov
+(A) sh
+209.639 83.4185 mov
+(A) sh
+201.64 85.0166 mov
+(C) sh
+192.841 85.0166 mov
+(G) sh
+186.44 83.4185 mov
+(C) sh
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+178.441 80.2217 mov
+(G) sh
+172.839 85.0244 mov
+(G) sh
+168.44 90.2227 mov
+(U) sh
+173.639 96.2202 mov
+(A) sh
+168.037 101.822 mov
+(A) sh
+162.436 96.2202 mov
+(A) sh
+156.834 101.822 mov
+(C) sh
+151.232 107.423 mov
+(C) sh
+148.036 113.824 mov
+(C) sh
+150.433 121.024 mov
+(C) sh
+158.432 121.823 mov
+(U) sh
+163.235 128.224 mov
+(C) sh
+168.836 131.421 mov
+(G) sh
+176.037 134.618 mov
+(A) sh
+184.036 135.417 mov
+(G) sh
+192.035 135.417 mov
+(C) sh
+198.436 135.417 mov
+(G) sh
+206.435 135.417 mov
+(A) sh
+212.835 135.417 mov
+3.19681 0 (GAAA) ash
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+244.832 135.417 mov
+(C) sh
+247.601 138.24 mo
+247.601 142.64 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+252.051 135.44 mov
+2.0016 0 (CC) ash
+264.852 129.039 mov
+(A) sh
+271.253 125.036 mov
+3.19681 0 (AA) ash
+287.251 128.232 mov
+(U) sh
+292.054 133.834 mov
+(U) sh
+293.652 141.833 mov
+(U) sh
+292.054 149.833 mov
+(U) sh
+286.452 156.233 mov
+(G) sh
+279.252 159.43 mov
+(G) sh
+272.052 159.43 mov
+(U) sh
+264.852 156.233 mov
+(A) sh
+259.25 149.833 mov
+(G) sh
+252.05 149.833 mov
+(G) sh
+244.851 149.833 mov
+(G) sh
+244.851 158.631 mov
+(G) sh
+245.254 167.033 mov
+(A) sh
+246.65 175.234 mov
+(A) sh
+253.649 176.832 mov
+2.0016 0 (CCUUCUU) ash
+301.377 181.232 mo
+301.377 182.115 300.661 182.832 299.777 182.832 cv
+298.894 182.832 298.177 182.115 298.177 181.232 cv
+298.177 180.349 298.894 179.632 299.777 179.632 cv
+300.661 179.632 301.377 180.349 301.377 181.232 cv
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+300.851 169.64 mov
+(A) sh
+306.453 163.239 mov
+(A) sh
+313.652 160.042 mov
+(C) sh
+320.053 159.243 mov
+(G) sh
+328.052 160.842 mov
+(G) sh
+336.052 164.845 mov
+(A) sh
+340.854 170.446 mov
+(A) sh
+344.051 178.446 mov
+(U) sh
+344.051 186.445 mov
+(U) sh
+341.653 193.645 mov
+(C) sh
+336.851 200.045 mov
+(A) sh
+330.45 204.848 mov
+(A) sh
+322.451 207.246 mov
+(C) sh
+313.652 206.446 mov
+(G) sh
+306.453 203.25 mov
+(G) sh
+296.855 191.247 mov
+(G) sh
+290.454 191.247 mov
+(A) sh
+282.455 191.247 mov
+(G) sh
+276.054 191.449 mov
+(A) sh
+268.854 191.247 mov
+(A) sh
+260.855 191.247 mov
+(G) sh
+253.655 191.247 mov
+(G) sh
+253.655 200.845 mov
+(A) sh
+255.401 202.64 mo
+255.801 202.64 li
+255.801 203.04 li
+255.001 207.04 li
+254.601 207.04 li
+254.601 206.64 li
+0 0 0 rgb
+ef
+259.851 204.84 mo
+267.051 204.84 li
+267.051 196.04 li
+259.851 196.04 li
+259.851 204.84 li
+1 1 1 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+260.851 202.44 mov
+(C) sh
+268.051 204.837 mov
+(A) sh
+269.001 206.64 mo
+269.401 206.64 li
+269.401 207.04 li
+268.601 211.04 li
+268.201 211.04 li
+268.201 210.64 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+274.451 206.44 mov
+(G) sh
+276.201 208.24 mo
+276.601 208.24 li
+276.601 208.64 li
+275.801 212.64 li
+275.401 212.64 li
+275.401 212.24 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+281.651 208.04 mov
+(A) sh
+288.851 210.438 mov
+(A) sh
+289.801 212.24 mo
+290.201 212.24 li
+290.201 212.64 li
+289.401 216.64 li
+289.001 216.64 li
+289.001 216.24 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+296.851 210.44 mov
+(U) sh
+300.854 216.841 mov
+(G) sh
+299.256 224.84 mov
+(C) sh
+292.056 228.037 mov
+(U) sh
+284.855 224.034 mov
+(U) sh
+278.455 222.435 mov
+(U) sh
+271.255 220.038 mov
+(C) sh
+264.055 218.439 mov
+(U) sh
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+256.855 216.841 mov
+(G) sh
+250.454 214.443 mov
+(U) sh
+242.601 214.84 mo
+249.001 214.84 li
+249.001 206.04 li
+242.601 206.04 li
+242.601 214.84 li
+1 1 1 rgb
+ef
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+243.451 212.44 mov
+(A) sh
+243.451 221.642 mov
+(G) sh
+243.854 229.842 mov
+(A) sh
+243.652 238.439 mov
+(U) sh
+243.652 246.438 mov
+(A) sh
+243.249 254.639 mov
+(G) sh
+243.652 262.638 mov
+(A) sh
+243.249 270.839 mov
+(U) sh
+243.249 279.436 mov
+(G) sh
+244.048 286.636 mov
+(A) sh
+244.048 293.836 mov
+(U) sh
+244.048 301.036 mov
+(U) sh
+243.249 308.236 mov
+(G) sh
+244.048 315.436 mov
+(C) sh
+244.048 322.636 mov
+(C) sh
+.113725 .054902 .501961 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+251.248 322.636 mov
+2.00162 0 (GC) ash
+265.801 322.84 mo
+266.201 322.84 li
+269.001 324.84 li
+269.001 325.241 li
+268.601 325.241 li
+265.801 323.241 li
+0 0 0 rgb
+ef
+.113725 .054902 .501961 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+263.051 315.641 mov
+(C) sh
+262.453 307.44 mov
+(U) sh
+270.056 303.638 mov
+(G) sh
+280.633 304.641 mo
+280.633 305.413 280.006 306.041 279.233 306.041 cv
+278.46 306.041 277.833 305.413 277.833 304.641 cv
+277.833 303.868 278.46 303.24 279.233 303.24 cv
+280.006 303.24 280.633 303.868 280.633 304.641 cv
+cp
+0 0 0 rgb
+s
+.113725 .054902 .501961 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+273.851 296.84 mov
+(A) sh
+276.853 290.641 mov
+(G) sh
+280.856 285.04 mov
+(U) sh
+284.801 290.641 mo
+285.201 290.641 li
+288.401 293.041 li
+288.401 293.44 li
+288.001 293.44 li
+284.801 291.041 li
+0 0 0 rgb
+ef
+.113725 .054902 .501961 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+284.851 278.64 mov
+(A) sh
+292.201 278.041 mo
+292.601 278.041 li
+295.801 280.44 li
+295.801 280.84 li
+295.401 280.84 li
+292.201 278.44 li
+0 0 0 rgb
+ef
+.113725 .054902 .501961 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+289.251 272.64 mov
+(C) sh
+292.851 266.441 mov
+(G) sh
+297.048 258.644 mov
+(A) sh
+300.85 252.243 mov
+(G) sh
+308.201 252.44 mo
+308.601 252.44 li
+311.801 254.84 li
+311.801 255.24 li
+311.401 255.24 li
+308.201 252.84 li
+0 0 0 rgb
+ef
+.113725 .054902 .501961 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+304.051 246.64 mov
+(G) sh
+312.201 246.04 mo
+312.601 246.04 li
+315.801 248.44 li
+315.801 248.84 li
+315.401 248.84 li
+312.201 246.44 li
+0 0 0 rgb
+ef
+.113725 .054902 .501961 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+308.851 240.24 mov
+(U) sh
+319.186 241.04 mo
+319.186 241.923 318.469 242.64 317.585 242.64 cv
+316.702 242.64 315.985 241.923 315.985 241.04 cv
+315.985 240.157 316.702 239.44 317.585 239.44 cv
+318.469 239.44 319.186 240.157 319.186 241.04 cv
+0 0 0 rgb
+ef
+.113725 .054902 .501961 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+309.651 232.24 mov
+(G) sh
+316.851 227.438 mov
+(A) sh
+324.051 229.036 mov
+(U) sh
+328.054 235.437 mov
+(G) sh
+328.054 243.436 mov
+(A) sh
+320.055 248.238 mov
+(G) sh
+317.658 253.84 mov
+(C) sh
+313.654 260.241 mov
+(C) sh
+309.651 266.642 mov
+(G) sh
+318.248 266.843 mov
+(U) sh
+323.85 272.445 mov
+(U) sh
+323.05 280.444 mov
+(U) sh
+315.051 284.447 mov
+(G) sh
+308.65 282.05 mov
+(C) sh
+304.453 273.849 mov
+(A) sh
+300.054 280.25 mov
+(G) sh
+297.656 286.65 mov
+(U) sh
+293.653 292.252 mov
+(A) sh
+289.649 298.653 mov
+(C) sh
+285.452 304.852 mov
+(G) sh
+282.45 311.051 mov
+(A) sh
+281.65 319.454 mov
+(U) sh
+273.651 323.457 mov
+(G) sh
+270.051 330.455 mov
+2.00162 0 (GA) ash
+.980392 .0509804 .0431373 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+285.654 330.657 mov
+(A) sh
+293.653 331.456 mov
+(C) sh
+300.853 335.459 mov
+(A) sh
+303.25 342.659 mov
+(A) sh
+300.054 349.859 mov
+(A) sh
+293.005 353.056 mov
+(A) sh
+285.208 353.056 mov
+(C) sh
+277.604 353.056 mov
+(A) sh
+269.807 353.056 mov
+(U) sh
+261.21 353.056 mov
+(G) sh
+253.412 353.056 mov
+(G) sh
+246.616 353.056 mov
+(C) sh
+238.818 353.056 mov
+(U) sh
+231.071 353.056 mov
+(U) sh
+224.468 346.655 mov
+(A) sh
+221.668 337.058 mov
+(C) sh
+216.865 343.458 mov
+(A) sh
+211.264 337.058 mov
+(G) sh
+204.863 337.058 mov
+(A) sh
+197.663 337.058 mov
+(A) sh
+190.463 337.058 mov
+(C) sh
+182.464 337.058 mov
+(G) sh
+176.063 337.058 mov
+(U) sh
+168.863 337.058 mov
+(U) sh
+161.663 337.058 mov
+(A) sh
+153.664 337.058 mov
+(G) sh
+146.867 342.861 mov
+(A) sh
+139.264 342.861 mov
+(C) sh
+130.861 342.861 mov
+(C) sh
+123.258 342.861 mov
+(A) sh
+115.856 342.861 mov
+(C) sh
+0 0 0 rgb
+/Helvetica*1 findfont [7.2 0 0 -7.2 0 0 ]mfnt sfnt
+107.454 342.861 mov
+(U) sh
+99.8511 342.861 mov
+(U) sh
+237.001 277.24 mo
+241.401 277.24 li
+0 0 0 rgb
+s
+269.651 316.241 mo
+270.051 316.241 li
+272.851 318.241 li
+272.851 318.641 li
+272.451 318.641 li
+269.651 316.641 li
+0 0 0 rgb
+ef
+284.089 298.641 mo
+284.089 299.413 283.462 300.041 282.689 300.041 cv
+281.917 300.041 281.289 299.413 281.289 298.641 cv
+281.289 297.868 281.917 297.24 282.689 297.24 cv
+283.462 297.24 284.089 297.868 284.089 298.641 cv
+cp
+0 0 0 rgb
+s
+288.651 284.84 mo
+289.051 284.84 li
+292.251 287.24 li
+292.251 287.641 li
+291.852 287.641 li
+288.651 285.24 li
+0 0 0 rgb
+ef
+303.289 267.873 mo
+303.289 268.645 302.662 269.272 301.889 269.272 cv
+301.117 269.272 300.489 268.645 300.489 267.873 cv
+300.489 267.1 301.117 266.472 301.889 266.472 cv
+302.662 266.472 303.289 267.1 303.289 267.873 cv
+cp
+307.657 260.48 mo
+307.657 261.253 307.03 261.88 306.257 261.88 cv
+305.484 261.88 304.857 261.253 304.857 260.48 cv
+304.857 259.708 305.484 259.08 306.257 259.08 cv
+307.03 259.08 307.657 259.708 307.657 260.48 cv
+cp
+0 0 0 rgb
+s
+295.851 272.44 mo
+296.251 272.44 li
+299.451 274.84 li
+299.451 275.24 li
+299.051 275.24 li
+295.851 272.84 li
+0 0 0 rgb
+ef
+262.451 205.04 mo
+262.851 205.04 li
+262.851 205.44 li
+262.051 209.44 li
+261.651 209.44 li
+261.651 209.04 li
+0 0 0 rgb
+ef
+283.251 210.64 mo
+283.651 210.64 li
+283.651 211.04 li
+282.851 215.04 li
+282.451 215.04 li
+282.451 214.64 li
+0 0 0 rgb
+ef
+292.651 179.04 mo
+292.651 183.44 li
+285.251 179.04 mo
+285.251 183.44 li
+278.051 179.04 mo
+278.051 183.44 li
+270.651 179.04 mo
+270.651 183.44 li
+263.451 179.04 mo
+263.451 183.44 li
+256.051 179.04 mo
+256.051 183.44 li
+254.851 138.24 mo
+254.851 142.64 li
+262.051 138.24 mo
+262.051 142.64 li
+0 0 0 rgb
+s
+176.05 137.04 mo
+176.45 137.04 li
+176.45 137.44 li
+174.851 140.64 li
+174.45 140.64 li
+174.45 140.24 li
+0 0 0 rgb
+ef
+163.25 130.64 mo
+163.65 130.64 li
+163.65 131.04 li
+162.05 134.24 li
+161.65 134.24 li
+161.65 133.84 li
+0 0 0 rgb
+ef
+150.25 122.84 mo
+150.65 122.84 li
+150.65 123.24 li
+149.05 126.44 li
+148.65 126.44 li
+148.65 126.04 li
+0 0 0 rgb
+ef
+127.05 136.64 mo
+127.45 136.64 li
+130.85 138.24 li
+130.85 138.64 li
+130.45 138.64 li
+127.05 137.04 li
+0 0 0 rgb
+ef
+130.25 130.04 mo
+130.65 130.04 li
+134.05 131.84 li
+134.05 132.24 li
+133.65 132.24 li
+130.25 130.44 li
+0 0 0 rgb
+ef
+102.05 105.44 mo
+102.45 105.44 li
+102.45 105.84 li
+101.65 110.64 li
+101.25 110.64 li
+101.25 110.24 li
+0 0 0 rgb
+ef
+109.85 106.44 mo
+110.25 106.44 li
+110.25 106.84 li
+109.45 111.64 li
+109.05 111.64 li
+109.05 111.24 li
+0 0 0 rgb
+ef
+116.85 106.64 mo
+117.25 106.64 li
+117.25 107.04 li
+116.45 111.84 li
+116.05 111.84 li
+116.05 111.44 li
+0 0 0 rgb
+ef
+123.85 69.6396 mo
+124.25 69.6396 li
+124.25 70.0396 li
+121.85 73.2397 li
+121.45 73.2397 li
+121.45 72.8394 li
+0 0 0 rgb
+ef
+135.85 78.4395 mo
+136.25 78.4395 li
+136.25 78.8398 li
+133.85 82.0396 li
+133.45 82.0396 li
+133.45 81.6396 li
+0 0 0 rgb
+ef
+170.45 75.4395 mo
+170.851 75.4395 li
+173.25 78.6396 li
+173.25 79.0396 li
+172.851 79.0396 li
+170.45 75.8398 li
+0 0 0 rgb
+ef
+153.25 92.4395 mo
+153.65 92.4395 li
+156.05 95.6396 li
+156.05 96.0396 li
+155.65 96.0396 li
+153.25 92.8398 li
+0 0 0 rgb
+ef
+248.651 24.6392 mo
+249.051 24.6392 li
+250.651 28.6392 li
+250.651 29.0396 li
+250.25 29.0396 li
+248.651 25.0396 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+%ADOBeginSubsetFont: Times-Roman AddGlyphs
+
+systemdict begin
+/Times-Roman
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/three
+<10bf31704d4d67992b9ed68788587e5040da2286f83510cfc80f4a1e6fe6
+b09f97c944a087c4717928d782a2fb1bf0c721dd38a24ac2067564597d96
+92f97bc0abd49771e30c9491f8e5eab740a467cca2d53dd7c7249046b7bb
+4481eefce39557f10e129ce1987210441b69a70dd258cb6743bf9d7d1704
+979d6e3b6b3885eb27d4d4e5451b96ed7dfd7ce9e64ca73b4c877d5863ad
+c8641b65d41f66c4fc61f9c17255ecd286dcdef4a9a113d36ecac701c7a9
+417b48f1ad6bcdbabde10f6ff50ed870147c0d4cea98b8630a6ff4466ad4
+2983d01ca76121874525ba586aec14> ND
+/five
+<10bf31703bca56f2b2f1649faf9ba9948c035e867a5c8948b33268dbbfaf
+455551fd125b019c10a69d4b25668e31b838df4ee36a0f050ddfb933a970
+96a275ed8a7222f12ff901e86c1d4781a2a4d533d3dc87c499fdb840f1a4
+8285d60f1f88ace01bc52eacc7865a40753471dc909f282c74ed77f33b02
+ce7e21940182217d317dbb078d97be05356c56d5596c7eb8d464dec1827e
+46a37273fc66> ND
+/quotesingle
+<10bf317031d6cb38314a48a25f917a0bc84fa8560a9dde3392b0598a064d
+d972a4e02d28ccddbc17> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Times-Roman findfont /Encoding get
+dup 51 /three put
+dup 53 /five put
+dup 169 /quotesingle put
+pop
+%ADOEndSubsetFont
+/Times-Roman*1
+[
+32{/.notdef}repeat /space 16{/.notdef}repeat /one /.notdef /three /.notdef /five
+/six /.notdef /eight 8{/.notdef}repeat /A 12{/.notdef}repeat /N /.notdef
+/P /.notdef /R 14{/.notdef}repeat /a /b /c /.notdef
+/e 3{/.notdef}repeat /i 2{/.notdef}repeat /l /.notdef /n /o
+3{/.notdef}repeat /s /.notdef /u 51{/.notdef}repeat /quotesingle 86{/.notdef}repeat
+] /Times-Roman nfnt
+/Times-Roman*1 findfont [9.59949 0 0 -9.59949 0 0 ]mfnt sfnt
+115.65 316.641 mov
+(5\251 ) sh
+93.4468 335.839 mov
+-2.39987 0 32 (3 \251) wsh
+230.401 348.44 mo
+230.401 344.641 li
+291.401 344.641 li
+291.401 348.44 li
+0 0 0 rgb
+s
+218.251 151.44 mo
+222.051 151.44 li
+222.051 217.24 li
+218.251 217.24 li
+0 0 0 rgb
+s
+0 0 0 rgb
+%ADOBeginSubsetFont: Times-Bold Initial
+11 dict begin
+/FontName /Times-Bold def
+/FontMatrix [1 1000 div 0 0 1 1000 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+/FontInfo 1 dict dup begin
+ /OrigFontType /TrueType def
+end readonly def
+currentdict
+end
+
+systemdict begin
+dup /Private 7 dict dup begin
+/BlueValues [-15 0 600 650] def
+/MinFeature {16 16} def
+/password 5839 def
+/ND {def} def
+/NP {put} def
+/RD {string currentfile exch readhexstring pop} def
+2 index /CharStrings 230 dict dup begin
+/.notdef
+<10bf317079bb21e4> ND
+/one
+<10bf317016a461215dc2bc58955b35661fa832109bbf588b04481bf3cd7d
+6757617e8c0c9816948b05a2f38fa7d575d87daf4173819092e8a31c5c40
+e448> ND
+/two
+<10bf31704e7ce76dc21d92ed768461702e89179315ec586ed23b84b600e7
+3a8f14adaeefbd1a8ef4ea75ecc881acaee461c169f9135deb6066d93b22
+ee96d26cb12918588e0f074cbe4a50dbd8dee265fdf797758e390f627882
+1a348c2c9d448eec97692b7ef491db5d02d45177dd87c13938d098649ebe
+a4cc2faaaed0c7a2761825de7c345f0bfb9041ae2e00092351fa02c4> ND
+/three
+<10bf3170448bf7f9ab87993b613b3ec6872bb5d966efcdf9c783f7efc718
+a4be64d1751f3265cb60d9b5276469b557ce9ac8e0b3e36526e436641c45
+b03e0bbf21c62cc9320f6e43ee7f4cf80e4ba99cbef004b4c841b62fef40
+eb9e06429ecc6610f2f9981d2ba816746969ed66b8d8f4a43f88a0481912
+4ea05d3482e732407a96b011398ff3c43e92014a09adb230efe31fae5890
+b709d22daa136899f6cee93c165c965053839c1761be399dc17d19e6190c
+d1189af61ffb99fcba33a54bf70a760eb14d549829e16b73f3286e65e570
+e9c68df30501c2fc3708531fc7b7a7> ND
+/P
+<10bf31705ac93459811df9cbd49c2bf4b1dedea8f02dfae7024000d592d8
+626efab6b45ce7d12609750117a8b9f45cec5fbc19dabdf498132ae3871f
+7b30c381d86c65ed3471fcdb55def6123a3407152978bf6a0a519b305da6
+114f0efe0bd3c68f68cac1672ee085498a8e6fd32638d9a60604b744ec7d
+adf8080c> ND
+end
+end
+put
+put
+dup /FontName get exch definefont pop
+end
+/Times-Bold findfont /Encoding get
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 80 /P put
+pop
+%ADOEndSubsetFont
+/Times-Bold*1
+[
+49{/.notdef}repeat /one /two /three 28{/.notdef}repeat /P 175{/.notdef}repeat
+] /Times-Bold nfnt
+/Times-Bold*1 findfont [9.59949 0 0 -9.59949 0 0 ]mfnt sfnt
+186.851 313.041 mov
+(P1) sh
+215.246 301.041 mov
+(P2) sh
+184.047 246.641 mov
+(P3) sh
+252.001 265.041 mo
+264.001 265.041 li
+264.001 255.44 li
+252.001 255.44 li
+252.001 265.041 li
+1 1 1 rgb
+ef
+0 0 0 rgb
+%ADOBeginSubsetFont: Times-Bold AddGlyphs
+
+systemdict begin
+/Times-Bold
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/period
+<10bf317031d60d0d96d24999f918f780e1d8a9a0f7af8ae84fc38c94ec58
+3135f88e9212> ND
+/zero
+<10bf31705e925b80b4c8f1fcfb5b2fe440a74f62c796f3c02eb2da9ee8cf
+3e749c77619068400ca89c7ff72323032874cc719b493cec13438cfd7c60
+1a938141b249a6344fe7adba210563b145c5c7fdeb53dd40d430a2aa7888
+168bd4bf2698d90932777f16b7e6a801d452cb01444444badd4929588478
+5c2db1fce381dd65450cfad1ad35a39b11fd66b6c6b2> ND
+/four
+<10bf31705e925b80b4d4cbc4e928debcbc9ca1ce5a446752e420eab5615d
+cef61aee7d97d9eff1670763252051f2be6419a384475d66237624abe7df
+bf6e4102d5fa21a734cd00f0c9525ffcfc3a0b5db0af7e642e07c3025b71
+28> ND
+/five
+<10bf31704c1fb570da2787659fe061824d11502990202c6ca9b1b5da7d96
+0cdc349fd36ba74c839bb1f6ad5b2036aeda9f35d253d86da9773dd61de0
+422dfd536357960cb12f0db9ec77f07242af63d3096a64c3445c4655da1d
+3f19cb4456eb43ca711a9ea13df4ad219690fec0405819e631b49a78e94e
+67647654af6c2c1b1a75609742d0f8441ecfc35136febc44d8aae59aaf7d
+8b88b3651059> ND
+/seven
+<10bf31704e7ce76dc241686bc20501ea6e7c96a17170122b38ebad2a9949
+f6af8d4a89b98118652167542a74de2ba301ca2bc45e339e3ae683f4931f
+043d89fd8fa9850065> ND
+/eight
+<10bf3170599acabf992f0757d5e6110d0b202583f1f37eaa3993e2f1cd0f
+6e2622e3038d71367894f4d7032548bfcfce20f6b689fcb6b5a6254cd40a
+57f3279a61197186e879de36aa303e142e3645176933121430692e7d7ebb
+506cc17ee9a0b5fcbbc35b4e0ca4bc539673a52c07e974690d1b4e3e7b30
+414514c9c4a69719fb0eb20a52293f89414475f52809d90dbe81091c74fb
+4c4dadbb0d931073181f5593d9dca742706d4ab9098d680bf1c84eb32b33
+f14a05583e424b60d3cbfbb323701a5b41e6da60d0f26788ef39cc3d0958
+7823ca82721fbddff3435b5a34de0e71ff21dda5df3656efd4419938b2c4
+470fe8e64677cb89eb7c4f1b21ac33694d> ND
+/nine
+<10bf31705d64a97b18e1d0c26252f36d43809f58e8523f9ddf78e8047717
+f29066dc4d29840ee57ae4b42a94d32fb40701e46b2363001bb79897b78f
+07a6186b92686a103837d7cdc6e3e3744245ff59de2a1d399ca8540f1c30
+c9a8541a5212f9caf65fbd8253c13d1a37e50b3c931f53d63eebadb9b257
+d82f4a0ddd6c07d70303ef7dcaedbf224ad7acf31f562053f842644420fd
+b779b2493077d34338a3116b99be03d0552359238e501a8016fcea411abd
+1d0406> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Times-Bold findfont /Encoding get
+dup 46 /period put
+dup 48 /zero put
+dup 52 /four put
+dup 53 /five put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+pop
+%ADOEndSubsetFont
+/Times-Bold*1
+[
+46{/.notdef}repeat /period /.notdef /zero /one /two /three /four
+/five /.notdef /seven /eight /nine 22{/.notdef}repeat /P 175{/.notdef}repeat
+] /Times-Bold nfnt
+/Times-Bold*1 findfont [9.59949 0 0 -9.59949 0 0 ]mfnt sfnt
+252.051 262.64 mov
+(P4) sh
+196.451 127.451 mov
+(P5) sh
+/Times-Bold*1 findfont [0 -9.59949 -9.59949 0 0 0 ]mfnt sfnt
+171.601 190.64 mov
+(P5.1) sh
+/Times-Bold*1 findfont [8.43655 4.5777 4.57771 -8.43655 0 0 ]mfnt sfnt
+166.698 119.245 mov
+(P7) sh
+/Times-Bold*1 findfont [4.40726 -8.52861 -8.52859 -4.40726 0 0 ]mfnt sfnt
+108.938 148.31 mov
+(P8) sh
+/Times-Bold*1 findfont [9.5262 1.17877 1.17879 -9.5262 0 0 ]mfnt sfnt
+89.8564 125.389 mov
+(P9) sh
+/Times-Bold*1 findfont [8.29105 4.83913 4.83914 -8.29105 0 0 ]mfnt sfnt
+51.8052 62.5894 mov
+(P10.1) sh
+/Times-Bold*1 findfont [9.59949 0 0 -9.59949 0 0 ]mfnt sfnt
+165.25 111.04 mov
+(P10) sh
+/Times-Bold*1 findfont [7.0179 -6.55133 -6.55132 -7.0179 0 0 ]mfnt sfnt
+155.015 75.9165 mov
+(P11) sh
+/Times-Bold*1 findfont [8.74768 -3.95201 -3.952 -8.74768 0 0 ]mfnt sfnt
+240.226 16.2783 mov
+(P12) sh
+156.65 108.64 mo
+162.05 106.24 li
+162.45 109.84 li
+156.65 108.64 li
+0 0 0 rgb
+ef
+162.05 106.24 mo
+162.25 106.24 li
+162.25 106.44 li
+156.85 108.84 li
+156.65 108.84 li
+156.65 108.64 li
+0 0 0 rgb
+ef
+162.05 106.24 mo
+162.25 106.24 li
+162.45 108.04 li
+162.45 108.24 li
+162.251 108.24 li
+162.05 106.44 li
+0 0 0 rgb
+ef
+162.25 108.04 mo
+162.45 108.04 li
+162.65 109.84 li
+162.65 110.04 li
+162.45 110.04 li
+162.25 108.24 li
+0 0 0 rgb
+ef
+156.65 108.64 mo
+156.85 108.64 li
+162.65 109.84 li
+162.65 110.04 li
+162.45 110.04 li
+156.65 108.84 li
+0 0 0 rgb
+ef
+0 0 0 rgb
+/Times-Bold*1 findfont [9.59949 0 0 -9.59949 0 0 ]mfnt sfnt
+246.851 127.64 mov
+(P15) sh
+264.446 169.033 mov
+(P15.1) sh
+/Times-Bold*1 findfont [9.28151 2.44775 2.44777 -9.28151 0 0 ]mfnt sfnt
+261.931 225.923 mov
+(P18) sh
+/Times-Bold*1 findfont [4.92249 -8.24107 -8.24106 -4.92249 0 0 ]mfnt sfnt
+282.65 274.964 mov
+(P19) sh
+%ADOBeginSubsetFont: Helvetica AddGlyphs
+
+systemdict begin
+/Helvetica
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/space
+<10bf317079c7734bf7> ND
+/zero
+<10bf317040c2af124ea0a49a7bf41805b177f7c4498811bf81dd3becc7ca
+7a1e61bf5af20f14d3ba25cb845719681beff0dff1a88dee7823f826e8f0
+739d88e303e838311be2a57d9230228fb7> ND
+/one
+<10bf31702ce19e53b6f609b518076fe734884313e5cd7a86613dc6f2450b
+061a1ad1> ND
+/two
+<10bf31703a9b9e75ea81f4b86404c8c5b0ed48d346c9f9e1e61d1793fdf1
+09ba72c7c73f875dce1fed070846350ddda457812602713b0534321d272a
+eafbfd522ef367dbdfbcee610ab8b5> ND
+/three
+<10bf31703e65fd7e38478bb8cdc815f2e0f3a21edd060d037e033213cc37
+fb113e86d3e99697f293fc1e5b8128b557be09627a0c26ff6b1d5f3ab710
+a440daae1f921170ca40a3017a7e6559500868f56ea75da7c8a99018d093
+7b39791cb8dcd57666a113cd8b1bba494f8c69> ND
+/four
+<10bf317031d92f340665f9d57abf5ced23436d6488bc83fc9796703022f0
+1e775102213885082db74038803d6498914e3031d93bfd3b1dfe31f0e50f
+d402c8473500b13ddfa3fc45fa> ND
+/six
+<10bf317031d92f3425eda9786fee0115802f83ee2bdc48b38e5dc519e1dc
+c6118ccdf0f2a993ca95234f42293633db35d04ead9322d56bd4640afe6e
+cf0a84796425fe5cfb964a1b2eb8674fb6753c7544b8406bb3b18dd4e069
+08dc126a28d499cefa9312cde8e70aaf4f> ND
+/seven
+<10bf31702094ca827fc7642099017663cef908cd301efa28ee1bfc120575
+9bf89f8b49c3c14274> ND
+/bracketleft
+<10bf317010725340705c81366dc59ce1165f0649bc1a5038b23bc770834a
+d2c494e303> ND
+/bracketright
+<10bf317054ad3ad6de103c2ea88e0729d320fbf5c609d558099ba537941b
+a08d02> ND
+/n
+<10bf31702094ca827fd8441c0957d83ffd389f80f745b17010cbaca850e4
+b5efc2c5c2791c4590a7de7a9402e7d11d5027e291035e04625f59b98678
+9ec2395f091b27a1f72e02bb3010b5af4e13d941a458bc1fdf210f5db8e5
+879f> ND
+/t
+<10bf317065f8e1c4514de29c8c0648dd97151e5185bd64bac354fa8d1cf3
+eb2247ee5cd86f648e7a19bc8381fd380e262f145408a19e3e35c8745c47
+2d1157413020406b> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Helvetica findfont /Encoding get
+dup 32 /space put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 54 /six put
+dup 55 /seven put
+dup 91 /bracketleft put
+dup 93 /bracketright put
+dup 110 /n put
+dup 116 /t put
+pop
+%ADOEndSubsetFont
+/Helvetica*1
+[
+32{/.notdef}repeat /space 15{/.notdef}repeat /zero /one /two /three /four
+/.notdef /six /seven 9{/.notdef}repeat /A /.notdef /C 3{/.notdef}repeat
+/G 13{/.notdef}repeat /U 5{/.notdef}repeat /bracketleft /.notdef /bracketright 16{/.notdef}repeat
+/n 5{/.notdef}repeat /t 139{/.notdef}repeat
+] /Helvetica nfnt
+/Helvetica*1 findfont [12.8 0 0 -12.8 0 0 ]mfnt sfnt
+0 127.44 mov
+([102 nt]) sh
+313.601 17.8394 mov
+([37 nt]) sh
+330.401 145.84 mov
+([64 nt]) sh
+.113725 .054902 .501961 rgb
+%ADOBeginSubsetFont: Helvetica AddGlyphs
+
+systemdict begin
+/Helvetica
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/e
+<10bf31704ab2503030fec2f45e7e5cf47fc11d962739122c4e54474eff0e
+1255b3d1b22aec657aaa4e7d1bfca6994595e2e49e2858d732f38a805696
+e0fca4d794509958e8d5ada6b628c05ea9d2142ac2e719bc3979eacbf36c
+3a74f5814616cda1f804403494184f51057654c0eede1c814f65> ND
+/i
+<10bf317027e610bfa7f58864b8a844d682ae31b94e523457aa42d5ac0fca
+407a62ede509> ND
+/o
+<10bf317047276c4999ccbb3f4b024eb7736fff85ee898fa8dc5c493d73de
+8f82f4b642c44d2a87361f6250688ccf63358fd216a840baa63411d79901
+d9fada0454d7f87cd033ea90c8fac0d323> ND
+/r
+<10bf317036de1a736fd7044d328eb56610489f58e06f422d5d8826e2d999
+7d6966a26c649da538df984b0bc9f0adb2b3db3855728badd951de41862e
+1b15565642d18788d50ce6c0c354fae871a5368c291e4f40af513579> ND
+/s
+<10bf317040c2e74a50db8320b72aa362422c5115d7e36f2a575bee6ef5a9
+5b7f1ec07cceb340b8eafc033516a6d135450caf6b182cd4d156d706dadf
+7b0d04532d42adc5f90e3e8d4d7190e1e817490bbb6dc111a5ff60467263
+6f73f40380972f48fccf2a1a1743a966452a2354835f236c08012007bc24
+28ac92747a4323c158f91e70df679842ba2879a730649268d53d90ae684f
+619220009223761a805f27384176224b326fc5f1d462619e9a> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Helvetica findfont /Encoding get
+dup 101 /e put
+dup 105 /i put
+dup 111 /o put
+dup 114 /r put
+dup 115 /s put
+pop
+%ADOEndSubsetFont
+/Helvetica*1
+[
+32{/.notdef}repeat /space 15{/.notdef}repeat /zero /one /two /three /four
+/.notdef /six /seven 9{/.notdef}repeat /A /.notdef /C 3{/.notdef}repeat
+/G 13{/.notdef}repeat /U 5{/.notdef}repeat /bracketleft /.notdef /bracketright 7{/.notdef}repeat
+/e 3{/.notdef}repeat /i 4{/.notdef}repeat /n /o 2{/.notdef}repeat /r
+/s /t 139{/.notdef}repeat
+] /Helvetica nfnt
+/Helvetica*1 findfont [12.8 0 0 -12.8 0 0 ]mfnt sfnt
+301.601 308.24 mov
+(40 nt insertion) sh
+grestore % PSGState
+%ADOBeginClientInjection: EndPageContent "AI10"
+userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse
+%ADOEndClientInjection: EndPageContent "AI10"
+% page clip
+grestore
+grestore % PSGState
+Adobe_AGM_Core/AGMCORE_save get restore
+%%PageTrailer
+%ADOBeginClientInjection: PageTrailer Start "AI10"
+%ADOEndClientInjection: PageTrailer Start "AI10"
+Adobe_AGM_Image/page_trailer get exec
+Adobe_CoolType_Core/page_trailer get exec
+Adobe_AGM_Core/page_trailer get exec
+currentdict Adobe_AGM_Utils eq {end} if
+%ADOBeginClientInjection: PageTrailer End "AI10"
+%ADOEndClientInjection: PageTrailer End "AI10"
+%%Trailer
+%ADOBeginClientInjection: DocumentTrailer Start "AI10"
+%ADOEndClientInjection: DocumentTrailer Start "AI10"
+Adobe_AGM_Image/doc_trailer get exec
+Adobe_CoolType_Core/doc_trailer get exec
+Adobe_AGM_Core/doc_trailer get exec
+%ADOBeginClientInjection: DocumentTrailer End "AI10"
+%ADOEndClientInjection: DocumentTrailer End "AI10"
+%%EOF
+%AI9_PrintingDataEnd
+
+userdict /AI9_read_buffer 256 string put
+userdict begin
+/ai9_skip_data
+{
+ mark
+ {
+ currentfile AI9_read_buffer { readline } stopped
+ {
+ }
+ {
+ not
+ {
+ exit
+ } if
+ (%AI9_PrivateDataEnd) eq
+ {
+ exit
+ } if
+ } ifelse
+ } loop
+ cleartomark
+} def
+end
+userdict /ai9_skip_data get exec
+%AI9_PrivateDataBegin
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Adobe Illustrator(R) 10.0
+%%AI8_CreatorVersion: 10.0
+%%For: (Sean R Eddy) (Washington University)
+%%Title: (rnaseP-bsu-alignment.eps)
+%%CreationDate: 3/27/03 11:47 AM
+%AI9_DataStream
+%GatkKCTec!Q)=A*"8i[BJ2UeF`_tSI1=P-.Bihi"mP8T[oaD8HLl at .S#udXWUg/'VqX=#<\^05';Uom`N+Ik$\%G,1ore%K=DR"/
+%Idj[F?b[T,?[hOO=+C+h6]B2U%eZO^gI&+-g$K#/prDR4SSu7 at V9bHrr8M@7$Tm6P5?jGenrriONm$kZIdsFfrT/G&p,B0^p%dap
+%cX4A1p%lp/*e++_p@@1om0c*l&-)BOn`&*64oFY8l[Sa*2nsb5nh&bta8+_uoBl/+r9So_q#0e;kF3Rnm+%$an`sPqD(hLTO5Kd#
+%X"W5NNt:usYJ9r!`Uc+hs#KFAJ$o4=Qd9$_?bUjbAUF;N57?)4q+oTorpq)sNSF*oO73,6AUj7CR(qT4kP3SoI/`:)AGt!Mick"]
+%>DAFOMk9 at Gs7!@eJ,SNsX"UYDr8]#K(.-mR at p/-7+/RQ]iJ0Yrf<<qimT7FFnt,V$a1Ut5c*9D/n7ODgT'sFu"@"PDb.bqWh`lVc
+%LY(q^n%Y+(](pE.+$SFAl2=i$qoaaJBc,g8(tX(>(r,k)cX+B_\!J2>A_HuN\0'g]Z+jtUs75[L"aRQR2$]096Ul+1H-=a^q;FSc
+%nYXniPc)Ftn/n$m&!smrY;S#)-SC7Vj`]Lnq;a5YAar"r5Q%G2mH#-+L1Ko=^Als`iL&4u\Y^"sO41j+J+[9brR'ZLHu."k\UMj:
+%rp\\<`Uc$,?amMj?bQBtp!o]6Wnu"ZGOqkYs+"fqLAC"fI/*2hH+'n`]Y3(A_hW1#f=*tj\6mQHIH<P/Y$Wp=hTU+m%tF/rp37;o
+%rqUQps7[c9ju:'EfBIab2*@,b+n<nWFo9N\YM6T_YMK2,IehNPp3'b;0.LL;r:/+2YM]Y09\:CaGZa\1Yc^bDIR&GZfB;b_FM'No
+%lUMcfl0GgnHiDoBPoA,h\u3TXJ,Ansq>-^j51`[#n*Tk3r:R*F?eg(jn`RZ7dD!,Oc:<N(/NeLBp[.Vio.AnnlG_?bjA-iJVj%&1
+%YJ:!"gY_2[2c%KKs7B)oc'Q1poe4p>rci([;K8?F/:;+&YAr_"iF0ulK6NmRnUUVmh``''Fo6`AF8s_Tk?g?$q3,T=mY6l(oUGR)
+%I/VgQhu;]W][(h.j7_M8T>'f1Y5J8DhL+fcYs'AO5J2G/4oiUBOPg(Zh=tW`DXd$X[QAASoZ,uD1Oa9"cBjU%o:KBMT>16Nq%B6I
+%n2"nW-0G3deJF:=IX#j\``7Ebe`0>1DuB>)27`\Of<73U=$Se_q=+)8#kDRk]mg!&Z1q6Grni1r]-%&p]K2o3rA]6AIe%Hkr*=[F
+%k1@@s#_BHOHM2t5r;?6#I,u0sk"d%Icgh#C0a0(bod?a<,VpA9^@T<nq=W?`1p1TqqR-r&I?r=!Gi%=A*+$UjcTTsb?Cn>A!6sj.
+%nb#sZTDb%ce0fb at GjZY:E9?]Ujbpl<N-RVar4fu*dc\LYJ,\`6^GF2cIf&WPrZb41rt#-6Y5dqa]6O,,hqu);?bUe.)SCCpeLTF'
+%NmAafIer'C_f,M at Rg2W0^A]YOIeu7Br;+Bjs4Y3J9TOs<6lpgUlgK5'IJNf[hu<qqptt64 at QF1l5C3=kQd>[ia)@Qam=0REgP\#^
+%rr,&#rq,:g0.*!.^%K])RI:s<?d at QAHLq'OXrk^RmE^7]kNDds07h?&jmf+<]pLIn0BSbe?bCd_iL>Te4T#6WrStd;iq6[6lhW^C
+%rSr*Np$;>%_]SmILW(A5+dU)#s7+jI5Q9>3s7ZB8n,NC;j>9ZArqV%j52Q;7n_efVgEVPP>iYVT`tioJoUhO8RF&k?hR8cG]cQY"
+%\3BmdHiET<-[QaX%s>RGpXf.dp_URbh#B`E_o%eW+.qoaop;;":70cnTdqtik8up[^^je(F'TAAk&Pl1DtcJ+/K]H6T<?"TGj!["
+%^ARiH_u(Hpm$FnWD2bB:!1g$3r:c\9j#K>OIlkD_DdPa/S*.aDmSW$/Dh!.ZRfDRNqXsd:0-3_W+R<s7O^NAlA)9V,.IfgK)m\
+%[%o7[DDD1]_c_FX>^6SJXe.lnI[jf3_Jic>B8!UnVU$@hhg at J%pD_?6n`0A!HhZQ3_+LI-gd'Gt/e?jPoAC.Or$V#P+TQIBcC)-^
+%8)>G.DD;b6\8KC8cJ3j>c$e/M5Q<85quK/+Xm5cPc(EbV3Ni,VmEbCsI.m!eX&iXk4Q>H#dt`-VjQ#.4Gn6@)DgZY[Dts";D]ZUs
+%.IOA]StGWF;S`)!0ABjri?6?aEmOLO4hU[;qo$HhI,8V*T>)Qi2(\!<2?3 at .h(u8'ErL!eYjecuA)Qs:H2mS2mcNO_1H[>I5$cY7
+%CZ>NckaVImBA^CoGL-%-a*Esl3`u6o7pk2GQT9M0ls at i`VuOnAGZj#)`HTu"2\.:W$Db[s2d[X;m<J5ARH>=[Oh8X+l*>R4SI=\3
+%rS,5;rVG&mE'M)cA,l/eJ%8<:s#0cIo4QY]4h(H?g&C\i8KS!A[rb-dGG"mJZiAqpG;jJGo)i;Vs5o,Y at o$2*m,;h'rp.$ITat6&
+%r_*!\4HA!"?:)Hb4aWWoa(n8-LOX^9E81]aMmr.=>lWi^m57Mo3njP-`ui'sbED=%d/Ws4/&'='e^n`CbDW+42ie'd)u#9%*u`&s
+%k2#'G4O*bIhI$DV4Qf'Ok,+bV=8&YRs+0/-T,H at D7eY;^IK,Q[YIr0QjMC;7n'uf#Npgo[qWJN"Y;cK#+3==ZqU]@%%JS[>Ik65j
+%oH,a[UX-9=6+:0*hd^,f4kf^qF$BQbh<3BmY-H+[pYT3[qRPM[jDAepSO\Og;4N>Qn'^qMVL3cYV]XqJfYAlTqd>[20#hSph.sQ]
+%mIa`PkGqAfqRRmuo)5bq?iBM87`Y5YpRoC`hd:gS\p_bY"fb at H)#JZ'kOA:G-b7RHh>YQ\%=,P^0DhA+=Ots5O+Hll:>XmndpEsQ
+%GOM6s#r"QXh!GDcmjKPJT&Z"FYci8s*ZdM:DqsDrT<;2LD;bN\J,eRo]Ust7n%GLjoDef\Haphlj(XAlm`t at lSQk-<oUX2%rL]5C
+%J+i_$*3ae1%%[7Nqht=3)P+a#pG(`Ls7^]R-gq<.PIU45fH:/I5'_o6KpR5Wq%#+W'O8)-Du,(X$^[FhEd@[>L at X]epESeK4oF\b
+%=RRl3]?Kt1?N(e4io:JR?hfWrI:=E#1Zi\&FEfoQrTM]*D#a8]qo?1bKjIjXIKJCg2;%ophja*/6[><Q:Oqd&h]ZldpTf5?NutP#
+%l)fI2jD$n:br`)Acj&XiT"k4XL3KTe45UpWmru^jfmOBn:UcYH4, at l,h!`u2?:SX_s&[M>m#sB"?JLT\+0VmHcH"o7ao">WYPSi:
+%]_,_dp at A.Z5b;;p\d,9+m.X]O,P;`Z/pf at FIlqt:;>K76odqM0rU)DCkYn\bg0T02M"d,"AMZB>$_m*X at D1R9HZOHs5j;4Nq-Uqu
+%%jBor!oC8V%i"&fJ%p:&EO<I#hN+l#fscS/ZUZ2!gjK*ncJs:s-gUQHo at I%tQiDI3o'P15?b0L10._JX_\^:$jSOkg?9`o!_CU`1
+%rI+9tG]aPlO71k2I;9\f1uZ,WI([2ZlQ=u+6l^S@*s2<8g&!N"j;5SsmDXGe at ok)<ACi1WLW?#Mh=&=?4q-Z8dB5dH<%$])^X#]O
+%-UHe("6?ht&rY3;q-X/mGFs;b&V'fFj^5jgD]^UGpQDFGndrgepZD,7>9?'-j?$^p3n!bOr-4j[*`qUs_n5ftT)@RSM`nrkg\Kn7
+%rmR3 at T')_P]mft"qq6?r;NKf3:&CuIjf8!SfCRJ-Q"MPnSf$U:_uBRdTR/fT#?'X7TAnbgf0;0"c0!9YIWW7[A7AIR<ecBR++NmW
+%Ds=HL1jHOEr(`4GM"-?UcT_B[*I:.u(A$sh6X?5Z)t*I$g"q/h&)TF9XPr"6X,m#E4^WL\Hf%`9n%NcE^*S,uL?)iUr;QOWBOV5E
+%HR82frHmHmc0u%OIriZ&muG%urr;NRSo!>[d=*j&n$/u*F7 at 8A5D$*MTA<rU;o#tVikhQ_.Ju=NM[U\.TmW+[TPkm$n at S#7s'Lf_
+%msaNY5PF,h^o%P at cea*EmOq(UN5/4e'gr]Us8(m:LO].4"5I3ibc1X8jnl7\HWPUpl[O:`G:mp<8DFNmj*B8"=!#\:O0LqIJ_0[L
+%+,Q[eZ1=*G=s(IQ&3mc&O+6e^&),dAhd?eA``HMQ(A'?K-2-2dj5YV20CjH[PHTIs1#5Q0q"qrBL&P`s2+oRholmRuEOk%4!p1/C
+%^;'RCmDHCejRE^D./50koEXjBr:X%Ta(lJ%pVi'2!W4naV`U[Mf8iMepB7eBdJMckp?[.COlGqADX`(JqI@,1 at 6sZO\bcr/]qUR5
+%_=pXGLPU;^OE[>@nUL',pYYq1Nqq(hY7UCVIXIb<BWWA3TVo2pE*m&Lp])CrIUCddS\#ni&&!95-dNs8oD6J803asCLS_q!P^Vo[
+%m!UG>P&f6:R?irc]kf^jSC:eK4_?3iSiNn,\a3t]C>-_\it?^`0oTTagR;?K at nh6@]l!)DbrC`JC>5&NorW+QSYI14Q>Q'5loE*L
+%VsUR$l=%lDS1U at S3F^>+fOIND9kA4%0 at mroQ4UK(\%$?Lf\7!uA)GEMp;i/5h72Auf6F0=Sfr(,ftr'$QtP*q;YIKk4m&R\2\%Zk
+%B]7/a/7[2W7N*^rHeZ+_CX3r,5$L83?LrWc*"E0dl2<`n/8=IY*.ag:3C,`9:<Qi7aq1)F*Eu[5()bu:KXQ%.C!<)[c/iVa%qe$%
+%QM[!!Xc7C5BU:k%@@uL\di?E:T3L,=nZCLaIn_5D=E:TRZn8JlN$F"eV!U^`Qa6)8f!_b,Q+WX-XB\l]p>4*JpS70cm<1#h9\bYS
+%p:];9R_?=87Z?;:BKHlVm-.b8IO_HRC#SCin];qHi+SX+)d!//=P'l+Y462-Sbnh8AP9#qdb9]rCcUjic<+9-cchcQ^('g-q"DOg
+%KK-H'(lm)Z-Qfm?KJE at dqRN/D$@Op]h3W_APoY3D]1`'7):O]gqn]Jj^>uSb(lqYnJRKN,o9%)93K>DoPuhH'$O8nV/M\((*^WO`
+%Es9&+YcNFJ`K'1kVKEp6;<h&gA*1edpgO]+e?u,R_A\L,=F3/s4QAJ`a<6Pdr3YkH2Q"&-q7nZWhAOh=$#DbEl;;?blaiCe6uHfO
+%YqO`lUN^a(^$XVO\qE-6-&+R%^p7ne1\]RL37em(?$Au:?q$nF8!kI?N/]X,#=DE&o at pOW"WKV0?[VO^4sGI&pa*Z]PM&N9PhP.Y
+%Na"ZanBHMKj>eCd\ZG`"Qq*R$;_I5sYfQF+,;7)X?k7So$s<f`QC8\qI at c)e_gCCW(2RF!rMXejpQE*id$a4HnUqA?MO73$?mB\<
+%[0A_t1rreS(gOr'X)W.pgPK(k=#&YLN"),8[Y:Ddk5)lFifP061RBs0"qD#Vl_3'.:HWikC7jf)O)8^p//<D5ehf_Hf5PPiq-7hT
+%ok4pOMSL5L'Y+)-ED#I%F2J]3Z5ir3Z,I<"F5VlYa!euc"3!(gbQ-dJL=U=n\W=77;gDr9_TL+*05"QK]Ho6B2<U`QN?:P2YFdCA
+%Yc2-/SaXm&MRUQ]FMqJqVAoj*@+^kO(:R^0N8lX[Y,-%Vf=A^pZ,:YBoK("-A`FESTS#!L(eJ9o-9e`T*g\e9%Htt=]?>F506)qJ
+%dW#CZZS%G?*WTi4I1%$EbtD9/YEkU.in:dN&pHJAUoRnK&R+!+7R#>=]ak*j:MIu[A$pNb\)ek&qiYDn)tQ13pcb,0Yb*<2G9hnP
+%]NaDS at b<rnHBpgdM%!EKc=Lk*a5M*],9?*U*g8j/%Sfsn(4^2;`u-4)^MlV7gc")cb]n^Df[5]uQ>ITh0l>[j(#oO+#[,43/Rn"Y
+%?8d$TJU7I6NJTmF34UN!1k?/!m_F'5]UfHIOVVnK`?9=nmu4%72Abe"a%NYe<b at C)/EE73Abu.MJkV-g;K5Wp\U\#A8QqONZ=4>H
+%3F4p(hGaSBJWF6'K.*r[-W;5o&GY_:_6Jejqi26rMAXOJ*/)VISd[tt">N:!R>G3(M$8Oc(nh,r?>hpcXhU2k5jf5>iG(9PBN?+]
+%0NQi`1,30QQ^KuBOi4JWIC.)A,"?t2N\R+CoEPFUm,uSc,]GE,$C9'!`5Y]m!CJA*3Xd!<\W:=Uo3!cg at perN0t>MWXGf)8Xt\B#
+%DIn3)`6&t^dYuAss)I-N5QZnijd_c?-[]tiKUjj+$rWTteH#jfp_fB at n;GsbC19/_<C)(mA]LU6pD3$sVid+?\9E<N&B9>gDI:`*
+%eV-O"l#Cg,QY at fU$m9qV+Sd./@ciS.85R7Ieir%*O;!/SEeqa$,/4-5''KS//s1,]+;8iFbpDlVcJ6ufCYUc!`jIWS-1=L!r3:8k
+%3<6M.69m0MW&D/H&^CTXjtgK[ZfPB\V32-oV8,IPS/ZVg[^D>UZl.<n)ZqC)-^0"&,:#MFHuUk/Ggs9X\LkVYIK1N6:.[j:[0J$?
+%6Q8dP:>`YXMb=ULR'Zp79(3"SG6Jb;_'r14j2fO!<era)4G0/o&u)b)]g3Q]^RZ*'f]SDRFK"S83Np6(nEH*7>=nu5lEQj=21Er0
+%OBpK?GOi!Nn"<E at IUEHUK6[[\J at u[2,%Bo<QIrXCHNj`XDMY>[HN9GL(p at n2-Et8i_%7s+_*ddU+a\@d2hJh+b<5>hI':W[(na_D
+%*1WPh99EFLV/d1S1o%F:!--g=G0)=F4rDA0*H$7A-U)M-AMPE5P\]u&4U;ld&W7bInT;S3/DMri_-g`6Ge/Q at JYZ$b/cQI&-;834
+%_9bjmALmkHRi*i=-V]>:3:##/4TO6 at gqge'Kn+R%)aF]b0<l/11Iqu*R98um6*^RNQ?jWo1+S$k"+Gkpi#4;b[d45-0a#Q1g68uP
+%*l*R]9W[XN!<ObMMP3SZ.Wu=/>o4q#0qHJl=..:MAqnE*&#hV*"#'*P&&mh,=p=@(mE!K``X#MYgDPBf4X-cC=XQ<KXt]ED`EDO^
+%nL$L0>o at V\!P[WVCR5R?*ggO6#=F6)8 at O5&KmG:HZE]tf>R0JLo>(h/e=!=/<"O&"krNAP#0:AZ;%O8"Q:\/=A- at l'[W&\f[_.Pc
+%86]I_N!.Od0U^3'5^o at A(m]9Z!j[,f%IeLZ\e+.WT*><V&Ogq)C8r/#Yo8.B%;e*07lg7>70D="*!9+>D2<7'f0G2i:d2a/JgG=`
+%2Y>!qk./<R)gAOuJ1!)TK=^#C\B at DVN.b<2YVe:C4f!mqC.S=J[YU"C>f#S<`/,ir$0!lrE]Gg0e/Q3^26X8!I1.278=FBK#D%WA
+%`@I??a:"468pnE,lVRj7a*5#!86<=_/V3dg%q=<C7gKA>"I$_fq((/2Xoitj5gmZ^*g!!+LmS227!>sOg5tFR"]pU061NaG%>],F
+%NDLbQ*&Dliit`7/12dJh4O]JZKHs?r$8$c6g2M"9H3:(Ll].YY]SR'4Yq+n at E-(LNKZJ^;-dZe8qb#@lYArT4/OtX*-jsHP>AY6f
+%+%Y.\j.H7TEW:\^e.:'$o5MTl#Lg5!FU1C0,DltZM5`l.&1'jS>b=jrOd*e,-;[Ya9]\M_0d;E8,O6XG at ESrs%;<ogpkL'PMQeD;
+%pi_kuKuO:I;+^P:mk at W>*pT/<g\GD(Q9p!3Eg8^OGB2SnOGqTplUju?%W=M)3Rai2EPXnG&Fbm:T]\4A'qQ6Sa>fpP:t'h]_JT[3
+%58.H.3F=T$V/2RPNY,=;=usQL*agd+NE"W>%Ktrm$'S1_Ls!,+!3GR<44Z-Se]\F1q':M0`ekUeU(r3-Y'Y!/&Ve,a5kE_::k2(_
+%8!%5:g]Q4bM!@A'e.K_$/7-J)!4W;8cGOkRLlCXCD*c(BE!8eW4J3M/='ua,Wc]r at R$/+oeeo^0(e2LBb.m^8erel1GV"GW-XJQH
+%#TsV^J7r=,4tq!CV%ojMau$>g*I>celi9-k&=(U(gh'JuA%b\pf0,E+'W`meV[.''=U6-REEQ_6^B)Orj:>(?W9hEWiHt,H!#&pu
+%/r]Qa+U<??@Mt%g0'Em&W\lb$+ at K6/Ft>=Zr4ELi9 at -9MY/C/]i#D6GCW#QH`uX!cVLm4RL0iY/CaN\4Gh3.cOB5Zjh$H[12I]75
+%aqF@,8EU96re0\NUl/*1M-<ipqp1;u&OlKf!OmdMa+-B*LtO>8B/nW-r5)<M<r`S!7._s;^J0M.Jr*#!k+u>75TIRSn9Sm_k^_-Q
+%KQ]V#+p8JD*"PtR&k:Wk<6-FL5gl;!#+0=eMONJ#@5?2#dZncpBcm['o'X:d/&Z*gr*g5An.erTMF+1\f1Zpt=<3Qu5$/B)1E[?!
+%-J/uD5*5'6qA"hjL.\7C=9SDZ=YRV5,sI#VF,^>.Fs],+&\)Dt#sHECbb?ZOD(XrsINYm!F6-Sa1*5?JahA1^&A]#D,eY99TgaK%
+%";t/@J6mH\,RP at g7RD'Ean<44`h:frRa7tL_B!'=r7ogVM^#i at AmNgdD]@&&1^%^55rNfd;p%ea"Z=D'#(dm$WpnVk-am;6CJ4^O
+%#]kr`_2c<..`J"-J/A[pM^Z at LKA^mh927#C1]eMfh&I5Mb,*q`?%qMIItADeU/3WMDB7nl/4@!_PC6FX9ip`o'6nlJ(L8UuYToNP
+%L at 4Ds#.c&/"NFGA7`$Ao+IEud.*jpbmLQ54EuM,)#*.htg<"HsD+=ea)[@[*iEohV!Tc$Xi\Ik^b#I<\KJ2Bh01Eo;-qa)S1'N:$
+%SmbGD(MjY2JB.s;&kk-*6heu:!=V+JZkAY4>K'aTC=aW&>O0KJ_^Cu57&q4Gqa("On:=I?1Hr\/J8jQU&d@=??-<CP5R6bHW"/N0
+%M1[f63hE=@Z<Mnij!VXLi?CUC5/Q-\[fsWG,;silTnnISh[(6g_/C*fkE[T>O=4^/J=g]^/I3m!LrmX^\`q&KF2/3(RD$3l!``f<
+%ER;!??<h.QP02DiG"g,u!(+=!Y"5+K>Jf2TQN[p&82>iN_Qe0hQ%Kb)%\OjZSpX#;h?P0/OW6nnL4'V$0ZK+9^9?=("dXuR_e%hb
+%DH\dO8>$3S1/sEm:Fq0B6Q)@GbdEEj0#=_X3aemG1sh!O&K`@VJV:&6n3,d32"Hesl_^W)d?UG`3tj8kQp,m>Z%,kD3^V$JY6Z?U
+%o#1)3^h2)">bAQ8mjNl!h]UL?!II<`1ao:L4OG.&R>ufFG&^4dkk`>WhG&DeI1b\/4WRYWRPDc%nV)GHcjY/ZMo^Fh!\LUK-a$'X
+%cs at B=EHd7S:)"q;R,9X;$OFN?de<laLVmp/!8i)k@%?hA,Vn*Xoo)!u2(tI1\[Y<afS,<470DO$)G<rm\d*s\!::1rOk9:5K/p-E
+%M<!oA"/rbp*`YIm/LF*^KA/_jN`]Su6&Hib(`GC#^>oCjE\SZFD:8at&E8EU2/J]eg/QCK?ZSf_7;I,]Sd7odE-Z+=To2H^d>/D\
+%D+&Ktp-Aol/IY0#UllQ!P6foLd0^^OEucrYJue3V#S2Rl30Um9F:LSL>mGe3Va9r7`-+IUTf@]G^d!GW,pIXSUVI=Hia>pQ2qQi:
+%<W[maQjg>(\:Nf[.b6kP@%tP<E47.=MUVY>ATGq(TJRkBpqV"Y/.*-4$rrYY,8*4,k_Me5^q*\W!P8ST;5FGm8.=4G+fYr-UT4B.
+%VYppC.,]UaJ;^2<$WAlC2sC`gf<HaD"9;mLOOJk;GW!qcQ5X-?81/87\\OLXE)U#:KOo\EY*%l5Os:`&dg`;b$=S3G+hZg!&8&Y_
+%+>+-iDBr:a-0ZenI%3aG8aIWf at +1lgeTJ>1IXi\O"u3(pZ]Q<s!P1'o-0+A#"$WA+!],LE6bgE`(Xr[DdSUo#$@Yqs)/\V9G/5^`
+%Ea4be"".;K(kWc;/tq6'+=7(c&]XEOHUKJC+*J-CG:jrO"n[!-V6:c"ILq#qNj*JYcmDfo_VQJ&&YaFM7q[lVN0&t\"'4Um`WiEM
+%2CNuDlI7Xq;$P0D=&ZUl=!nhtVL.=l8DPL%ILkWE#R?b%eDPHQ8c`ou2]`Mqc?;n:)Y-.\hE__fo<t;g))BeLcQ1>UN<cFVTL<<7
+%%/:Et$QTL&i at fk&K'!)FJY$p3KS2AT]+*MY>s^g9<fUte&oSf#SZ?B.m#K8(Y*m+LD[ZuOlCQnih&.FWY/$Mppu"'=a_V&RSHC!f
+%dB"?\"6G(GF;Io_$SP?8NF8<5)b_WVMB9U/GF)rC8.OSt8iKT%DJp\iO<i$&d!'^HF>-=b0ic:Var$-O6/sH)&,.4F&L!LN.m>kC
+%/]PH'S28cpaFK"7i*N_meYgTJ8p+.r'S5'WE9lH97p=`'W.^*fDoCst?7Bb,K(+T^Zf#8JE<)nGo$0-q<.b"T#3a>AiCUgX*_c6_
+%"hprqJ5,E&ED>AAUbJ3-+%?e$6b*FA)bCuGHWsE*Y97S3aq><hecqQs.GWFgj]t\O#eP21Goj0rS0)a6)X-67%"*4#i">N6*Ve$:
+%OPoild9R+"q7s15-;F]^m-oFZ(,ni6hiJu%/a+VAm0:P3i$VdI"]g=5E&t64_QjQlWde.>FEr6#7"R<((Cfe)Nb1Rhe0P=n>MVR*
+%3]j.-_'UF9:Fip-Fns/s?jgt=PlPJ_]65q9k(S<hCOr6He0iHm^b[)f/j;`Q:a6b:M3H#Ec>0J3&:pQg,("GWL5BlE.MC'4#JBcB
+%$'U0AL1O?)V8JPVcu(C0B/VET;fO#p'#"^=L#isL+[F+E#U"-qH8uOp(oJ>;YU0qQk\cFuY6L<#p+-Fs#b&!0#dS8kRmDFAKmlNF
+%Do*J(_Ogf5OT`*i$)-i]IKm-/4=0?'Feee$m1PW!@U',Na%lfeUEDT(?@.M4,"E>PiG8\*:Xjug1/e>l&h__a!)cQ`"<3^ICc)5F
+%FhiBV>Ie,S at 2WQ=Yg.W3I3BG%dCZT8+W$5U>d8N)LDeet`=H2qnRIHm\H1DI1LFY1"\`.+41&Y$`:rN5o?-P2GPT-f="oVe*P56P
+%<?_kHhD#+CBA1QI.*S\1rmqW%n9k)OKipQi%rN$B\(!Ds>WUn:96*%o77\*aO-:g_!5D.]Kp`S!nYsp/'&?QR!B]bj30W]=J\;22
+%!LsP at jEn@ZX\g\kD?.a%]s6ne:=\%F<.HT)JV1`a4#;"O.CgNSRsB./e(lbR%i81G#\MEY,Fh+a,VTs*B^CI2,?7$0/-r//OoR^^
+%^%Re$#65>J'm5B6jI0jLVG3E6*9?A$.`3+"=6;LcYb;Gq'*+V.`GuEQTK/G_\D.U(0:EdlGZ7@/M-V6BbUES6(kEgn*EI@=i'XLF
+%T_0iJ0Ea_GnHWVX'lqg4mY%&>>#17[0QG!A8egX+,;rX$P];@!<#7TqmL&KOn@/d#BDdQC&3$9P695;e&N7Ll(]63))OKGME'1Vl
+%[P[nJ`=)U;I\XgcEb]1g(=*iDQ+NWiG#0(t&6B\lVa6a<fm',3:U6)AjoN7'eKmfs1H9QTKd_HV!lIj=GjHP;H4p/cJ@#_ at J7-/s
+%[gaL7i0$-C=#XNW>0[H^+>B,)+V9F_:?DbShjEMU*^bel-Nl(1rW%(8$p@\LOP()\#=Ce$m`DTRc at eY#1:$n1/h_f-ILEJa`c.Vr
+%`TK>*&qNASL.)cfcZltoa?(Du`>g^dbY at GT=H%b9Y&Kcj_B?ZAd@\T)qSbn'GR2?0^r#ek,Nck+i/e7^',m7D1A!19*XKWh1LkGe
+%m^>Ru?CEtM$!8<fKPS=2X-N*,?`@e@\,t'%`OZJ<E9BX%PFq4GSqKJI]D-k`#W`0C2Sm]ur*dQc&5Z;#O5bAu3[OOR3N*.un0^m7
+%L>K5"h-o9F(,)"X`-)YC<2;Ie]-LPm'_<FM at j*OWXWq0I0&3.Z*BFdNS,:l,^]^j]aVU<,RI+n?7U<3o2\7Pf(R5j/"o14.jt:M(
+%p8efT[lVfmAUqXkms'`uQ5El02.1IC7G`#mfZ@#IlWS7#_V]Ne4RNnboZFb#Nm[9HlbS6p89d*Xd5mNC/UV#4*,&qt+/'K1JDq2.
+%h%jd>IJs\0BRsVF8@?iG5k'qK/t8[G-a.DsBZQS2ZJGj`[;d/OG!R$k"IUAb"%nJc!B<boGEn7g07A^m%bS+GA%et^,N'V_K*rGn
+%atf%bN\d7<M.o;?+X\us6lO\Rg9oDW)X_\I/pK>8LKU1NjdmADJHK.Ip['St.*(%pX%WeB7BPV+pbk_NQ*N`iRGL+6B3F***bQdn
+%66FRepbEGNZ^O#Wlji&32Tq1JR[CVFL at pqU"W),^S63'Q44sb>ju+BV":<UDZ/oqqX2-_7a>*:Hou!AYc?N`Ei%In0]*N#%FdM<r
+%%*2%A^W.l&U(Itf%B$uZJ8n\<WE92L@[\%='/2-7'/cU:&Wd>@JL=q60#rT\kRlm:C_NuPC81#'BHY6*0\pOfE^396!#CPs9S+L0
+%X1;Zb@?0G;UV_.K;bq:X3;:\YK]j3(SE at X",pi[(!5K+>.=tbJ9(3MH(W41^NT#0nngdFudfSMB4$t?T9k$.h(]\j/Hd!]_"^P=o
+%@=G^!lNSh_NBVQ5P$_\oVp(T4#:??1C.2NO]7b,+_2ZpV\7A27WZ6`I!$?/r<seMDn-2YR2b-%L!`/rGLYjI'?J-)3r3?lnFI`ls
+%>CkVDhsfe3'0qAip65:Yh-is<3kr&3ktWpemTaI1(eIrmS%I2/6tNm at h`F5E?N:dZpPA_VF\a8ji6Y_r1a"j7dMrPfi1_!r^tI[h
+%:a`EUC:pSb4']"H+6^06\U_9%Rt[)!QRIle2?=:cN"9Hh()jN]Wac_lh`_BH&#pDWW\6fI-^K[YT"+">h;\P^QN/7c<R9ES&B7LA
+%:9&&5d84V"kAacRr`IKmiqq*+'0C;a\!o'=[-.$eYB;ejn.Gm-4 at H9o[SWk2EHPZiOL\e_S=;uZ]CH[q2dP6L""'aXeIWe/-=4)*
+%7=Ke?K$]n".=2fC`2%@]"sK1rLi^QT&9;]lB"L+<UDZ+s>-F4*"!5RsS=V`mJkLe+enX>`^"au8("]t+LU2Na\CFG<SFKEEAciOK
+%Ub+#\%lW(_3YWLQFB;rmE6fgOmQQ/f."9s#SqIu*3qI1W[R=dN/h1aVq#LLME'I*o\=^XF`7W$_UdgcB)bCWCZaV'ndUOIL=@9S&
+%qt;N^C(eq`$!8C)PUPaI=s0%]@E4Y.3M._QL5]6%^]hPJSA=(n at P<ss5DXc-"m!e)H%khojCE]Kq5E%u at hSkNd9?X(@D^8p3p4us
+%k>(7&IdoCZEk&AP)?3u8#@2ojVG(Jhk4(VT*#2nNDqljOQHR7[X!'\ZZ<t*Qd9Y6IP$hY,+`rn+3)*rtQNqL6cS:0jjgb)9"QoE6
+%Ip<81PcGu6-XuV7.UF-14'a;\kc4sj\pXVfG4G8uCr9eW[9+n&!YVr.>@G`a/Sc13#_4Y><FXN]ci?lrg_gG2Q\8plgRW=e.Q"$*
+%#Vho=8fV,`'Q=Tcg_R^^Rd#B)D=Q>j*`qo'Bs=gia2?_dC]n)H,3EUd&DQ, at 83o1mY3i7??,jtJ;p5=VBrW&%Ek!6rVlE1,0c3,I
+%G7`AagQ*<C:u&86o@(P4aq2o#!Mh]f#+atp at r65#[BL-mgZFB8ONnX2k<rp:d^Yn67TLpcEX4W32M02cd%tOKk/Q$%1c&djYS[G!
+%dpUZO35Ec_(He_P[O+acbR[(aA7?F\boLMVU;3'+Q8!*'S:I%7PNBMTaOr[S-l9T[>ms'604#khcQ2MOlk+!o$8DWB9EIJ:*LJRm
+%57]Ig*'!4I+niSrf1fL/ldnH)5'b'%nIue"TN4T=_XGQb-FF&eC0%Nc`pD.9C,S0YIoq%RZZ-4#OM\.q7phYJJX('6"[f9s^-qlj
+%0qW#,Ag*jG-jWIeG:WaO/h\=Y\>.l>I=33'F4=``1LLV<&UB8G>D/j4Xt'qHKNCd1CMD-66747,T]:iug#R;7*pc'u8ZTpjQ,&)D
+%JmrBeC>7l#j#CpQ$`aRpUaZCMbTLX)7Y44A`reXO*\.R8EXhAj"E+D_g]AOq3A]&LE(T/Ah!K!q1h4PI#Q<@G`GJGjh7Oco!=1CA
+%laS[AZQoan,ncu!9b<6cHDm4I[*gkK/g)(%5C/bdhA)HG.fhHj8D"bSkSb?"FCLs,j[0UVF;/BqA..e0a+:K"k-K1D@^i`T2ol6(
+%[bkHs)dotgld5YZ.N%I%#X?6H(rM_qmqqFYgkhqE^__`6c=D'pTj7u at cq:Cd^#5YpNPl$u#fSYO9EAgJXV3jECi5l]NkIN73+o1-
+%K=W1/ZeY3R*/GL[G`V:<*b`="'*>^q)Fl!\PSQES>gtZd\E8AWJ`gJ*&?k.=1Vr?uC\HP=)ckT.o*r)t$R#<QEXWdD3GrM2oE+BA
+%\-;lD1N-G0PX=MlA3>oTh-iX)+fWi2)7W&BiSsocFX[`_jPG_I&3a/eE'fM#_.(24CD[O at 4'pZLQip8&j%uYuKdMBPLl""#buJKs
+%W!M.HeH)(*e.W`o.6h6m4b/"e,Ra1W[>CC?Y/A&FJ]NJ[F?^>q5R\VnBsE>!YLh4giY!TIZDVb[a'n6jR(Ft01K[M7-fe&Tb2f'@
+%]_/M_U;Ko(RRLL%OA#^^Qi^XL&)_%hmKg0f\V>gq2LQhj'>j$H/p75l%*NmYq%)7nS;"e6W\o"<ghS,i2H*YLFn+0(AEL,7c4RT.
+%"?IW1#.kWr&4$nT_S6qg93d)B(r=(3RHe:fhMEu5LiTg)"r+q??oFLBR<(<,*Ber'3`9R#h_*51of9Q[Os0hG%R;"$+o:1Ed[9"A
+%?K$f]V!8!l$8&ie%0^:,gjfIXns./P/d8lq\F-50TQLf at -D+^HbW`DS%.e=k4oq?r<c+$\ge>'X\GKFp.fL=]qD^B,q/k<&=C_HN
+%_ossG3j#n7rh=Zp*\Ll<:n:n.7d)e5R,;lD\s]I<@,J-M@?qAORcos^DI2jbKJ<:h8A1C%La]`/i5k'AeS?UE3thYFE11%%`FZ)s
+%=t$lirrol/m/*UmLkS+"l,uJW$!'A#Vj[f:i;Nn$flf]N960M<Agne(oU3iC)o1S[d"X)B1:_;ng0lT\Oc0:c-s*>ZpB at EZrLg<T
+%#(XYQd<Y0B2\I?k.o'\G%)Q`(CJB%"q at ErQ+Q/=%:TV82ZBFX,ambWXn6=+S6hE(GkI!mgXWUk\Y0ca_3]R:Ih=Z&T<E]t:HH3:J
+%Ld\"!$kQW!XT/ZQcBP(!fqpE3)=]F](X6^SXRUD"O2Wct*K%B_:gB(YV:cPer"=gE!Iuq*dflgneK!cWeq0;M29UjX+GR&c<)A6V
+%gS4@!34J!`Mua\&5\#M8h0SV1[bXcV"^</`mr0sI)8QVom;b'jR'-d%Yd_Vl2V1=Y$>4.9j5)0_)M9B\E;.(AjR-uF`/Q'\(h/%>
+%+!uI1bfMDTgS<25QQ\.a[YcA;U+i`$]UZ'?amO19<1lV<f<IXgJdWUMDB1&:90il.Y4]lS](KP^X:P`#SXG,LN(!RR&GbQO7Sd**
+%iMbK#81o:!ZYd5bojA=7q2OX.&Ct.?`D;;t$fR#R$QhT/64$%,R>05V7$S<!30Yra0H3>:?qE=;3Y^t'fq^6<.KM;tY#u9gXT39p
+%!g\MA%Q%QNhZJ^F$?h<rnfc521V(J at hVD$':?[%go*q`G&]mG1 at o4QQRKH=D*XKEZR2t-&6O=67l[r#"-XL8Mje=6L%:BLi'RqVO
+%J5o//l$fD.Mq1Vm)lu"=E!2LrR7R94 at Q&'upK9D"6FS:V8!ei".-%EAqhC$AX5u_a[YP'+]uUpXUaQL^BI9;QnGjc+L+G;i at l*;r
+%`K)/MkOt?icbLh at 0P^:mrFr*1[XdM76KjhGg+hU_aQEo6bR.+$l,M8B>%#n^oI]F[<Te'?)8]SZ!QQ2rM%+&k/U&^9D3J+.p]oGF
+%_ui at l]JVHOKVRh0$NgHN&BN4.e]J$X"$)hp0]r.tW+QD`nU]GQ+NJ29l3WWI_#QN,i!(s*1WSh!'_#XN36&GEF20gR(2-FPCoXmk
+%cGPG>$5]56#?-@#)`=+giKh<q]oNc,?eZ\K]t=3#,'4EO)8?fr at l?s^Y(fK2AdrFH)C"d<%I^npW=,)G8Y->%r!X7S<C^#6R1Bf[
+%YaPSi=4];cTX[-u9lL5ic0CMED5LdZd at bMR2?)4&F;^G&-0G*1>cEc\UFTit4EE53)Pr#)L1Uk^W`sJbCg*6<QA]Jo?44*c0(IQG
+%?._D'>@3"90BZ0ZR5E\*!lQ?u20#KgpM<VS!oY5O`_MXt_:6b&9O)!K#FBNgs%lR0\HfS,Ag7s\W49ua_cSpNgBTA+Tn:PfK&2uQ
+%F/U)?[7TYkQq7M1VPYJWELLZRU&kfXQ-0Pj.gpM*2.,Kgn]^c/OP$Ma]ItR9Q&c()ZWXqV9qjXZ7V.B0#=I"N0=rLr'm(cZLL>B6
+%MUZ33F&X]LKm`%5"eQ46Zu?CU%U$cpqIuNOS?[,Y"H[41-W-/H#89P&o_X^M%j].=%mp%&;aM`d%\8B54)7()bcbS(6 at p.<W]=YB
+%2E$b&>Y8I)n7e-&=]IcXg*N2C79 at .Ah4W;s2)g.'f6/)YEnR\fX$DfP?cMASO\-^s71konMJul/0R-\-C(>3KCTWpi1J=.g*8Fkg
+%d4u%F'q-#NY3;B8JGU<6q?OZUpYUYtlr(f2md8E]3%o/D^u^&YWH&n"F(Yo$D^#Bb%KQnCma3:$@.P3pdU at QdFUH)m5^[lu>H$P$
+%=eHMn\I9]d2Z)64)iG0!9*DK(+QG50j?ai0A_#6B6.@\ppagWBiLC`DGS/,U!\%P^c.02lg7p6-N$Tb3>7eK6U=UWO/Ytn31LQor
+%$!66jf+P9P&Ss=#DBF4Yd;t$",:=:.E+nYK$@fQaL>SL?^jJn`b7IM$3?2396kKP4"TuV%(6j"Kn4_fSE,TDlY3l99+CE^I=f`.N
+%_S-@^'(%D)].XU\[plb6g!T866d=`<^>Yf74/HV9ZgOT^-?3h.Sbr&@SU_bDXio_e"S-N6cuX[_"d^CqZ8(:bkR,EXk*c>j]A%,*
+%^OBsWEJ@@K$geMYD0MP'TC5GT<umc/_D$/VMiZ]*9CiV?7?oMN"0fj)@2?p_e2CJB9)qd_0+DNBlHHD']0`ilb_bj1nApL("iu4h
+%h6I\Q2U!ja$N+a/[iTZP#r.>aWq\VGC[dh8ZF'soi:DjH,8$`Xl)4HqXRO,c:BJ`-b$`-o$ZJ8+l3Z:K]=\a]F1hnPVtE3=!(''"
+%(5&A:DGXBrbY0QHJbdQF6!9`GG"K)HDn(c6X4\[PDCuJi+p"2H:5g>T$`/L!5"a"nPcWOMn]lPG@#D0A,]:,6,f,?tY%TAhhZ,>T
+%1A,nR1t*M#K9 at c.=W#B5Tc,=a^'f6(KM9]TCY'=\3HR+J5T'V>beUg`NI_e`auW"gQaO_R\P8E1M,#Q,N@(2(Vh*>;br-*ps7+>C
+%_cs]DPls7L#<9W_KTX,ndraJAEO<a,&i.O/$$,4X`@W4jS4%sO2gmNmh6a\k,UZ;S`s+DU.^+(:)S"+/PPRn0g+ep]i'q33)o-0R
+%;M?E5QA.ZUi`1oQ<'XGFg:1>2bdii at ApZhGjN!uZ%\?-EK6(m)e`kfKf'3]F0cG%?m8cB#i!3MF_aK(gY'iA-k'@LNCS[!1^MlR]
+%c[=N>XS&ff$k,Lc";m#1)YSH2?57-D?m+htECh9hdBjSqU#94%0rq?\C`?)`*A^`Lnq*(X:;GrgXp)?'#EM[G"/JFPg2j7gSr:r%
+%^n+(t<"dF6WX3Y;UbA5Ko5h06dL6q`<p#mbZ[7\>goaXDJijAr016ld]U=L8G=`ZIMr8;O$ccH3NQ&ss&#%U6gl@^-q//e-;[6)T
+%@DN4#TEZ*dZdh0MPLT@/kiFM6]&g1pp>N%>?98+m1=%9le(r\?*cpcY>VmY-/U?(R)$7[[C,6tq.NWp#Ar=SfFmjuj0 at 6Q3QSrD$
+%T`sY2#.O`$qGlaB2%QY6kVouAP8o/&F]WpF9h%lZinY3!%"^J:PR4hUK:B^f3:7[RI3P=%P1(Fk4mOe9!%e:Q)Q#_3(lY'2cjfkV
+%>^s6'KmaYs:Mh'gP/Y5gqEo=t"D1Z;6 at JtDL23Z>4(+a.8%)O<bk]CfM(:C%h&W9Y^/@M)63/.S.`MYe`YE\WG]dd*)hBPNie3DI
+%5[tW;nM_6dV1n'uAS^B#oe_j:. at IIl&%FT8j\#IT!o1LX5 at HtW3/Q?C at 8&u5KBo_D^tREF4b:<5(?nmF/pCh9"Q]&Emr=6eZ?a$b
+%"3:SO'i/o&XAr&=@f;ZP+fi/.'9*jR4#WY`%-osX]p1EL%*$[Lb7SImVUuT98VYJD)X3-0$V8pOo&VPZ8:iGY%#ir,HjeM:'+VLj
+%E[u_H(3HCZRZ&'$`FEt9()C,V",3?e`@]5U2)IknNFnUc1"o</n0GPk.g&g at TkGT^'*\TO4,`?uRi?DqQ;(RT"?.1.ZkPX:m9^W-
+%3*hTO$kBLIj-=l/4WT0"i'q at La)61+9-+k,JA`"3G_1X5kUc$-\@hKLpOa`kfJS:igA<^k%C[(hE?)H/`QKb;NRKRLeMU+.7>C[k
+%FdQ*]cQi$iFqG57Ej at a?O-Q*J:tFZ!9i85jCT)EAM+Ti?p\ud=ldHYnpMnl^W%T6$_Ml16fP;ijZ5C6V:9(:#&8$,(!/_d+ZC$?(
+%75p#XemjtDMs`6m%&PUs>-X/8Q7Z;LNa=kSd=K*W'9-UphJ%g$T%C8.#$Zs;2lsK0R*g%.J7\&!LH?%p!m<bflSqUa9fn54<`S\N
+%2%_qN"7%HN>i5`<lF#B;YEIDK2OtEfjo<0ADFb-9"MJQIEPFOd\D7@;"7!Zt7L1K%0!GM at p!-9Q-?as=S!hl)p'dLTJ(sLdccso*
+%XF`LZ!l&8H;SnuK1P&eK>ATp>0j.Y1P;KDAcS19#&<Khr536bHj#/I^+?Jg`3+B4C('d;UE>d#%&W?_0[<7g:o2RLM/Hn(A,m?TK
+%Ea)c^HiUO))n>?pm_VI4C_m8/3.N]n)+)u[Tnu2&glLGe9/S)H<KY=93t?iKb!'d_]HJfJ#pmDYLq^Kdp0^Qpp_T15C40NAk4AX#
+%UGSWBm`2%31>MW:g3FB]ZIkAW3^C1H&I"i/oE<C<2`GH4?3FW>)bIgoTU?@6S=KA;0HDdeS7onHNjdK=Q9(D?N]9-$NbJ7N?p)%M
+%@K`"A]c)n at gG>`bf=B#=b[X)3o\'Y"$8%Cr:<LW*$eS%dL*^d+l.\J?6HF&B'5St^Jl6Hs"lKRrm^*&S1qs#S=RBTTVlA!5Y\iqk
+%1QSQU-C)B9pV(bUs5D*9(HiQ2!<Lj9c+ZS>)7l\IbS4>RFt^N?88PAX*NNf-)(nu"@Dr$mZ#lW3CiLE34sJA.-?sAcD1N`0b,_qg
+%@C=e><?p?rlZu6NJ_Co!r6F_&;DAgNAg^\iL*T$^VIM6$fLM[2/N8TG(FKItB*n[5JUtrm>!HQ79U(;cRR+2q:pm,<(4n^:LJ4J4
+%2VB*J)hFeuM$[/<Ut4U5S(oRJ3XWHK**M*l9PU5k^dY1dJO7#BjMAg0J]nkX852^4afSk0#(0uh&J%=8NBLaHS&I>WNNI:9EIquK
+%(-09tibl4APu;U5Ces"^#q"0S:<)ZURq*rM/Y+=hDFS0Ck*`_s2.1G8l"\4W&1",7Te5Z3<b/'VWa!-EWnk<V*$0ilCF>KB__.:!
+%6^h"VZ^:(eg0uk;juRq&qU-tU@)C_^asCh_;i0o0&n?iMm#i]Z]r[Gff^'!>,2,!8C5BlL&;R6g2Dd.qNI8=nj;-6q4_fhN2H]rd
+%:E9 at V/*g<@,pUJfiXSo(VG>_Mc)cK/6e>T+XJSB12aDBDi7P=)mKuL*-2_`Ded_`Oa'tlL3i2O`!(hl[[8?O:Zb]Qq<P$2pH4.+K
+%^6IkkC5b-IiP5p]L[>uQV1O)a2<C\RRddp+UZQ_O>2sMrE(e;)lm&ZV;)3]0!Y!ggpSkO_$E*@q>R*4(Fr?$GquUrEO24XoF5QEN
+%Zsn.Z*%sY5U^m32 at SWj1.*uM)=MB3\i5O>PYi+BN.B#!9+,Y\l>Otc*'ZE1[66\@7bgZ3<)^fiDA5Ofl/;djqOt--X2rH._OJ00b
+%egK(^Qka1>"LIJNRKa>@JA;cB"HS'O034<>RnCbD/Nqa:. at 8I#`s.9cf[:(qJEjBNQZ5F?Tc*G-LC9d<ejZj&#"Jg$/ZuI?8seH=
+%/g#XnLfNS3S at 0&d)>XaU7JCB_d1$UiR`0KW8ul^;Efm,tA'rg?mU<(;qQ5(Ah*i0I>9Nu`D/C5h4>=qo*iLqs$`itV/1*F%fBSa/
+%rCJo:,"<N.L#hZO%i`E3<T^m*bnT(:<tS27CrLp7 at Wp<fS$7dQ*%oZY/;Vif6,],R_JEE2Ha"F67L^I\0d8D&DQ&5)M-$rk*2U-t
+%)T+%SI&pT?6u8Y#`s5<?I*'V&C)]%3$#Y at sgc*<-NJDO<Dl*R"NUH0Z9B+bn*:C#-M at .9S2R`g`70A4&eVspGIG<(^,+nm(k%AS,
+%G9Ke%6$V-\'#nC5Vg1\^+KXll:I6P at 4B-`p at ifJ0S&[3q;"6VK'GT\ap2n3hgk3MA*7]9uZV.'4BnhAcYZ%!58s*eKc'VWg7I(^a
+%HRK`kP0%I[h9#`"b?a,eG)ub!"O.=hfeF('3MEJhAD&BMZFL`PXE6IHPVOCFA$_91`-`c:Mj27A[ru*j6gT=oCbmptD>,(lc)rnU
+%!q:PAHO,D/h9<=7rZAS'kIMR@&fT88eabM*U:R!.Dn=MFKjKZX0rt]+Y/'%/Ws[1-5_S,JG5YZ3`YGG([1G7Tq1gsu2Bi9)VgEa`
+%G at 832k&P(?p5qLkm$gHZ(N.FA>"D5io>Ghh5i'[G&9%mC\&j<WEWaINXU7D13 at .3pa9u1D:nM_1-8?P\Hkfil/t"L:h"0g.\%N>\
+%QaSar`X!"VZ=o91BE\F^3h09/%GT8S(3f^C0.qOVJs#LEM\jI.D^%X.Jt:lF[`M.r$7W at P$K8.?.LS'Dp>YrE;/dabgaH5)io@]?
+%^"f8(a;s7\,^Nji-4IcJU1p)jj="o_F(XFP(/2MYX36%,Q`FuBQ.fBbp2TD8j!^Q0QbD+s'eEecFR$b<@BM<#a9ZmRT-?hm)2GoZ
+%$Y[e^I#R8#cbi4+X8T8[gPt]`28Fg46 at d^;N5C!:]eZ$3!G=lI0%i.QeX\#i+b(MM-S\@pg6dM$C",?AYV'LhL6m0qln&+a0[KDa
+%ZReN;FW*lX$,hdWCTLk:@@=_jBP`rJbFkm<;'c]Pd&bnX!?Hhl>5c/$I<486)B:d*cA%n\(AJP*Hp:nE"&SB@\(GY18*[_$eN&5n
+%Y%ql^IG\R\p9HNe$2R;^gMm7=$EV((O]Q=bc*D"!SoA7Q_RdBk[AckV0Dul[l!TuBoG*UD^C8A+].MfTWYkuZ+E3b2.Ul'g(do?Y
+%_WP4o+:*O$X3'\L.S/n6cUAP:R#)S+qJi2oI7*"fc7Jrq&9IeNO^;UrnD%?]M%&(m)&j(PS!@Q_"n#b7eDNI*&'Kr65fc(g'.eug
+%gNhN%C_]9QM.5?E[m&MGn[hEYK?<kC+CN?%Yd"4X5L&I>;A*[?\e/B,CcfQF)"A%r>gX\3<5j2j9O:CNKdlPS=r,t-Nk^:Pkt7Fs
+%f8[FI#\JoU(7;9/"r(f<)+(X>8M>=+@&0W)BX9Ir&!7(fI>D)Geg3':fIs^K at i=o6Z/uT!]35Aq!AX[&I=n*c2:C'gRR*`9An79Q
+%l`HY>B9TM.X(LoR`kY?(%1&dPX%IH at p<@`)[i<T:FMj_l/]UQoMY7jm.05BnTOt2jZ'B-k:KN2_-tV6X5hcheY'G%B7&]Bgd12p>
+%dm/]Y*!H1OpY'CEpRHt9ZeHWX83Znb?JP&n,$`Ac/9j7e$e1KCX2Z*&>k%=?`\+E,>Q&&0eIKb(G@:pDQ7h]i:WQ8"%12AV#XL_C
+%!UGM%#)W_UZjcd^pT-+E$o6<9n)b++3SNjg9PqhX-9I@$JbXao+d<9\Lrb;)?+ISB6<ENQ<JlXVh7]iU.`Ji.e(-h[1&crWM^Rk@
+%_sDPn^N;P!_JHhIm-MEPd#'MX\F5P=Gs'$rXpk[G"U5j0<Hj?hHdc\lrA59o4RR(o<E")-`eSsBB/9T_c.rHU=1e9@<HGcQ7h?Wj
+%Bq0Fql at uV2#c>-Z(G$ds^$Xb_/]n2R(nnVK@:gXh^"\FM*8"e,k(3K`/9'.F]'Y!k6NGBC^p]JDkK2!&!>'#648d7lZ<YU>\C-3E
+%gq''0.c?DjbEtONES/!%@;<1t[L;uZo866oU.Yb4kj>5^>ogRpq%7H7gnB5_&Pcr7-oA:7-*mF"dHqZt3i:a"LiB:nP6\.faVI'L
+%eD)e:J`PR(`AC0P:0g/;]t"kD=KkAX/\Y(3F)`9+(4fp%a44_)Wi8rE],`n;3HRh1_Wd&R8ZEMeM^_KjL_I<MGd+a`mV3OK_;',h
+%S'@I]'lH=cR\=uZHY_:ieXZ at SoA7_%LODEN:WjY!IL`8jWi:=O8\bA%#Qp.^4g['$%88b]PrTgh$e`)t1*pqZGlWG5_K'R<&6\B4
+%?sNs1B7hbIBO,o+=/K%ca4f>hcn>#^`M_iuVmRE7Lu=JQ(-(5]I^A?cm4@'+WR>WcbM9r6bVZW>47&4MQcM[Ud9MQ>JgYa+MS8u/
+%llXp)>)(>^5,XJZ//tr:pVs1dOE4u^G.3go)9K$&'E)4TCu-Ze[b;:i\H]q>&$tfA=BG_c%#$sg![7I.U,`un(rbmU]u=bWc7U44
+%G2b-@;i/+D^-N<a1-3IF#RZP]?J,?C1c*,_=fZ[Z#4j>OKWDKbg3"=rc=@YO8OminiX'uSB%>jEfle149qG*>nP9"g"1:c6eU at dK
+%($A`UGUQBu[g:RiBO0G8M9]/=0It(J@\YrfY1oHH_0!NWlIpO6o.g.9=cUJKJSq;'ZD-#jNH%2M3,W5&QeAReT4r,E_h;n6Ik;Ws
+%R3ZjBLQtoA"+#Kb>->5PXG8%R)Tt=&^c/`T%RfBEAMIDIpPqC>A:_MYWuL6\eq6ni-dH,C>PinU%?IVsl1QMu2O'<*7Pk`gI$N=s
+%*$>7TOMqBs(Zmh4U"L7o_2HJPK+4W/5U),qpN+,cYj1=L$cC0.bm]tK(#*n8$toH"CmY6`SChGDE)nd,3$.%V_JjHu':1!2j,D),
+%Fi9&O?7+\7C7Od\4kfn$EC?mp<_SZHGU-5IX>EH;6)3UWiES9Bh\CM8[$nPUXi0-EA235#mMM!6MsbgI44^NW2ICP/R"D_;qc.eI
+%TBo*EE7\&"T52eN]%EQm"bIAmL8*N^NKXXiJDN6io&,$o#XhdfQ4JB/\)SqqZ[(`:mcQf/<cW$g5kt[4(-Pr'fXB^XUN*PJ(Jb<[
+%jXlrIHF'F]ndg1GUu[=BPa-%>KO5[AEN`F:\[uap\+B<&7^,T),h:, at L%iZV_u2pPnS.m`DY#3Z4[B(m4>Yd)fEK3l+u&"t1PlpB
+%@WF9#[b(h4FX%k`JXROeXlc[>&Uk1t9sZcpXQP$_(5m.:phME=UfiNBp]mCCmT+Q at qu8Ej``4VkS2q"/#bl=MA_Mq[Rm#,Ek61Rq
+%@[jW2^dRZQfrMN8f%!b>dk%r56m"'<itg#)@YkL0`mc10CPZ&Uo4?Q+G1tEphQY,a9hVm94t+2TLepG8'0qX4]FWHT`/LT(;0=g[
+%9/&M:]cj]R.-hIB+jJTXVP;cW')*J+db;oPZnOE\DX?%ebUV0h_OP!EdPE[S.pCQm)tr83;Crjq\snURd]e_PJ8i:Sgi!@.]Y?/[
+%EV1]uS;8e0!=aAtQgBS2ZLbGuIG4'Sd[<cbE`C9lOW?-@<@<HfW*Tk)CO7H(ePRrU3*\lscG4#M:%j9CYNsk>-%HUh(r'9Cj<)Q_
+%JTu=p&hQlBgClBc#c&6*JVP(Nkqrqb'=!a:kd+Joh;!S^[]oeliYkj5\9C<EEP6l&HLCLVi!dNc,%Fk^fLiWG`*1Fb!"KSD:m(1W
+%):El:Y/G.QMddhXg`US)Q4k5b;md'd=Q!"inLoboN#34`ZgUsO&nVS]C/<AjO6.#NY^A];F"rPTk3?m6VSkIc5bk'V>)`I%.c\M!
+%McT0%$:kBe(6Ial$S"gk6,k0>GO5la!A]7A\k\i5cog\m2sbS&[/%4b%X0#9]Yg$[8#a,&K\*S>:q")YqjLnS)BYA.m"26_1WAV[
+%3t#/^"dY[Z\JYiGJ4niek3&gh::DhbmS@)%k$!C*()&6/if_lA\)sK;@J1DA=4'-YI_orQ',B-$dp18Zh+e3o[5!GR//MbbnM=Dq
+%?1nh(<DSoSj8<Qq6ZY=oV&I9/GC'!8g*ms^K5q5%Fk[Z+<.`$]j/[#$I%lRFHGM'%)%dI<cY3DP!dPms*F0=F<VM^nMbl"_WgcG#
+%B=CFD0lPVtO2UhOl]BuH:q+?_KNpD%(_^Mc<$06aK%Y_qI<=*dh27b-Q6,/*PYG,n-/4H"g/oEU3Z at 1iUN,`T&iME$]M]iTlAuEO
+%WE6t]KYH8YKJuR1W=6Mo:"G)KS?<^%SS^]1\_DGAoRGH0MA?9f*d0?eo9IkMcS8C.g*6D<m(+G0 at q4:2W)nrm0lCr1H!("WM'[?(
+%:W5gp\;KG^lX?,gb9$#H=@!$n(Ii=\]cJ_Eb.<u$IOj"oSQf*HkYPNK8b76fMEN'g0$/Fj@%ZL.Lmr\Fg1L'c[p]f>&TM-B$,K;X
+%KTJk*mMV"72e!;Efk#XMFkYZlZ"[i/H-=3Y0N5i055<bm&@brQhU_D.mX2482M,`'9&)&GN"ni4aAdcU at QNE'P&&,#PF/<cO&W:9
+%95DCF"8H=eG>+,2Z..$ge=iO$C$j(QM9a-o%\eX8k/GnNHn at Z9\MJ%?_!5OL73>h;$"^c?GEd$TnYZmh_V_'qPB4&6Dm7Lg11OSs
+%ENX>]!DG9cbGpuiMZ:)>[JNW"(I;lcZ^U;FMG!AQ%;pg(;aPE?kO-[U0puVm+[t<1U:o:!`f?qsr9!Tj(9;RV[Xbj?!GH#u9m?"8
+%.KiC)YC49g/$oIDEPHd6WsN(3;gkk%1:,+ at K,%W"U7IILG>U=%'#]J0(CDpEJg702b(+s9lkMM00XEb7KV!(HB*?tI&!C\e?a)Ir
+%!UXmD`EqB=T7/YE]R'90,nV+YW&EI/Wbr#1HY,`_;XGG25V`ZHOc'RVeIpXZ?o[KlZ,7giY\:K&iI=U3G'"W60YO3!#a'0chI7Ge
+%bu(oS+BsW3+<KGP`Y+1B=)/J-q0KmMm2/MjpDH[#C2dea%VT:m%s5_06ssN)_paT/gZ4\0Tq##d1V5o.nXJc)gq. at G%Au3ugSNG.
+%=gQ<9)1=WleSNf[[LhhH;$_cXC[fke30\:kOV9=2m-8Ic4n]c_=-+-V;V`EfE"mX#6#7l%OdKd$0BR5cd"\^jkdRh(X#hdcc7Ss)
+%,NMkZK)lT;nOPV0!6o6?P,l:n\QI<pH'&O_m9Ajr>'K-V]=$rLZ\$AAE%rUL@\R,lF64#9s#.S1QF1*<et/Gu at 8h2j]+S1@&8V at S
+%fIUdO;@HAPKJ0"d1s;$I!E&4kK`s`3D5i<q+K,I-o5#/&Ql9Sm)9FIC%f7<jikfcOZMUZT0W<[8h/"1cXZMt8VZ>h'oe;:rlUGt_
+%rZ2*tn`a`iM$rFQpt"kge!t%RNk at 9&7D!CY=-]PjZt12K]$dpDlVV<6/3XOK+I78fb^@.M@<FXWc,KS1FrH$K)irK'A4B(2_\W'P
+%.:Om07;JV6/<>^O>9uPERYuL:[S+iro-s%?j%aNPX*GsSkG1dhco`gf80q*#O`cE?\>AN]8aY"f"o at G3'Y%d8TD%BF]8o:r/qRA3
+%c&2.%:KCOuPI+T]4s:ilU+C[#H"@"a\=U.h at P"5kG"j5M];Yh,aq_IK!<@)oVcb#uW0PXO:CaioLA at UB);#9LbcSB!?ojE3G.,j*
+%be$j`S#'Ajc.K'6CBfkk;Tr:PKR.S[4oh/aT1KTq'H/mN"YLqV\*aTllf5fn%+[?h[LNFcP%ADUnn)s.!@aN4'D_uU_=>\rHA*G9
+%jjQNn0fRWS*B!rkWABo9?L8e8h'r[W_Q?"\-fO$m[[_MeZ57t#p+7-%J5%SSAd_`RB5o7hJ\"0.7QW"t[t.u:N%8qqr+-ukd'2uD
+%-"[=5!;JJ\a".Oabe4<\=$8%q_k8pi=ZpTQe@/ZUd4;,`e".OC7'!h_ln_dPL>0[jOa>iHLg$qJ%i\S2Y at gO:B(cdE#[KZ5L=F\-
+%lWb1.6k0$b\uTZa4-Lq;!.rPNfM**5o@`lZ7ic_r0!*+$=Ydg40p0;$h\MJ])mZB_f5(UF&!^rO[PTjGA4L_T5UmNXST&@hnHh5,
+%g:BmR"C%(`U4'Io([To;gVN-,oqcQ49V9acD;2o_JZbu:Q"-RfggHR)D7>H7meaA(eok<#7fmjUFo48'V8"YV<aC0Zje>>4p:_iE
+%6B5nMQI/42d4p]_f_bp^\p&ogf>j7>M*?Hs=k4!Fn:'pDUle:mbk`<Gkg=V'cmooHdZPn%C+F:+QFeYcVb8FZ(?hcDq"'#l=OWmj
+%9V\lHkIhFNDPrcp@@55K$(R"0\90TVd0A#A+<`+hIlC@/Z]Z[KiEbo+Lb_gkdf at 2D0?N]n/OhJZV.-iM^"\a'$aT4ViQJD'josKG
+%^a?]^#7FPC>H[`Q8nPRu2%f1KjC["Jq`-@)c0,%bl]EjVm`c`q#F1\8&>fsQEM%%@kr(`dbe;'@d4c[^&A"<&PXYsa"_KjT(g2(S
+%l'cJ^H'@"Ud%`+Rcf]cl@)Ulge*`TR^g\(NmHe6>f9<K?Xk^+]G%d*+h;*NL`_Nij[(L\(A at A)SlR$F^('q,"DpPKCd>BPeI_--/
+%o@\qX%8UhqCaG".QC*sU53oKI,FJIiX4dn,=hO,h0Unc[rOH4am=PD_$q>@%$M4na9JM)D''2Ch7^&96BPj9qBNr!WblE&1fM:kP
+%<`mHJP-u2Hh8Q at nF?AkpU'fO(U`99>/db6Njd6Plpp!D^'hXPsa9StIJNrP=L2$qO0j<o'MbSOalKfR+gpP)[@qqn.K+c!7""""9
+%=$NO#a98+t_-&:9$=I3,&e0lggLA=O%Kf)%7\>dQ/G?lAO`/9t+YCigi?Oq]1=q*rF$=A%M8,8CCq!hA>mIDaY8l/Wc"H9Ba.kX*
+%b8C:RI*-&-_Zta%fI2[.Q?HN-4mT=*D?-t$:7mR,P76fh_jKfXC>t-8FuMiaL"/=P8:+5nqt8[8aG)"fjL)+%k at FJS`HBng$Mdg`
+%f3_8f+7ABW%$8pT6s35b!6N'+^^K9sn?O-/XpcMW=mXU;D9%Rb10LJX_CMak$Pq&`eF:^8,C$R+]h67uhq?5\\m'MiN?PNc3q[5`
+%Rr(V.q5)"L_-47[p`p-=c4(*8gS_$>[Nt0h[JG81H-*EcHF#o7q+AR(CF1OCD/1_NN\3rdZ<iTJF?Ef&9t&j0P_n,AWik,_[>4FE
+%iGN]S+%MY5HkFCQ at 6o=uh/uQ#1d"l0@=lMl(c`6K',/Er))Q!<7A%W0qN*H0D1W?8>VK+0Z=':SiF8+6e\Zf:VHGZp87_(;F4IkQ
+%a,]c00ANq-Q8lqMUBSlFc8P\fH/m?]I+qAX"07Ls&$,02Gp#9b$UKV8Y%(66U/oLN;ZmX:G+[\pI3shO.R&<u?:eiIfmV6.I[qol
+%.UY?T`E$7u\o(`.dpBTYcKIH5&4s8rjg],K]W(Y70s2m*1:b]l4P[`'T,*$t3,L;ib4V8qVA"j#inV3lbMs3KQ9P&d8MDM"4/u(F
+%b)<5 at Q8l!13Q=M>Wc<+\P>E#<rGHoWG^u?3]0%-GFi?J4A,,OucssPUYAN<D"<Xo`O2F5?SS<u-``u56ZP`)f9,=$QQ9HS]C.>ql
+%CLDa--t=49UQ1NIJ_drIrbN=^TJl&sp1CNtksdonn&`V;fb<ra.H]NuXES!s,Z.Ms;;HZ<:"FG=[3%!S=s<Mn/UObi6t*aYn]:?:
+%^VQu\+e)l!j!r6,";69&B4m;(X2GZ^o$IIR[U'[i0)F8Q(=UGj$>!iqRr*,ASc;d_;_acGgEPAbgV^CBS"U8t$R.6.3=jd0BI"#<
+%]f\AE(E`!pM_.u`h[6k6d>QRjV=&DaJXnu]N>Y<Kq'4-8L at Kh&OuPDBCdo$'k#$Q[XB0B._2?Z,OD`%f4(n5.q.'$$*K.U$0Gjik
+%Z"'as"L0(2\B>PsijQ)/6M0KEPnr+qA_ZkQ%(1+=Hj*k%!e<jU.[4#AE5b<0(5)C4hX"/B&W-QL;e5%k+8;89)fO]X(_,(l6;hZi
+%P#fSB)pR.H"<)s7j<eC&V<:[#mVR!lc#&MN8n5*;][+`/O:t#$U[X1*\&@X;DHD>OJ7VS1i(UB1<pR`,Cm]mt!2`0\4?E'abtR_k
+%AJTr'%*r%d$juAUo8M'P_3EO\K^Uf7e0073T:JlHT!,%I at 3:78j?4)[Ks>8'X;k'g&W_;pUO-J>E`Y2XO/DJn$XCgCWD(oB6[_e!
+%%h2FaSl[u(E>?_`&:eiF+f3V[6=BSlC95t0%[3_*)oMHthRT*U$F]AUs%l!>=$D11,J6OK`Drb_GPL$[GEPWU`gDQ=p at EEVB2n)P
+%V/]S7OPT'GF$G)!cXLY[H-Ng8/ZpIGF)HmlloqWR;K7EX=u,Ko>?=/h at JctIjg)icZ_b&;4j6,UF6sq%:7HKar5EJ^+2m,q"T[&#
+%507eHodk84]*J3]kI;J%lLcQ;Xq,nX`i\D6+.Xfg+.%$[!AETuI^@eUY+jSJfRb5ec_Ng`=pm8#U!XpV#L7XeZ::=h$k)a%mT58P
+%@!+W<]3$D!fHee=7i.c`#@)]*2'gi!LVlFu#%cN3_tJb6qI34q8FC^N9)ok(.Z+r)<_SH0mEXYO,>hVMVqi$t+*ZHT+7l'Cf:A(#
+%0!Z"6]b3B</\.Tia4k$Hj)W7PRn6`;C#3;X1,1u79$7B)lKo0$WX\aiP<[l*],J8%JTrX]\QQ*F'VoH_).Ve9aD)fUG3(o1P6-qD
+%?hHDaH*q;XYe.SCT/kA#.k"t^3c2=Fc!&>[?'mDe(7La'6[HGO'Q-b%X[s^FIde(?#f>KmdFnNHM^d=sMI-_m-l3sqA5oc?gA^IC
+%+_c9`=G%L at G*])0HOtB@:7m6WQpOKD?/$3BTDspP2A:ku%jsuXooH!.M+_'.Gnqo.3*`eGasV#87Ci8n!V^GZ:h$b%h^0;C:LMH0
+%LuQZ-o`>R_SFqLZg-QkR)m7a1AccQbI5.(8MYu4K4'Z[j=1_'H)$f%R?NLSI>)\j;bm*PoR;29F)iIK9&PHreO-81Sch_[?1;n.c
+%A'p`[T.5V,4j,O=om5DGI7fg1\t^"BHV.?\/!dVLS"b-KLu\YTO_'</M)51/]4pUa7n:i0_RStYCo(Mu;nR,dih9-mb?1C8Jn2/S
+%A[g5l_1/WA4Oh\4mRa'@!1.H_og8F7HlD$),A8i0LZJTJAs_OkRB*;\5,>taeXNc`[V:.fZ\*uo.Ao=H?j[!N%/WJcHckZj::>1,
+%I:g=bic<fMk(?ak5jIM+gG'MW3NpK12Z*H-Bu3<lh3rP$2E1PN,!o[gm8XEKpha;HM?gY14ZguKEZk(_+-4(aNj:"f+\i<gY2Ku3
+%m%80M\U?r'NBS0`ca7<`7eDE,DJmtRCDEls#Ttao,ssYsCVipUggaZ=m$9)<AtY[FK87Fo/"=?Oj<U?K(ef\<%i?b,X.,0r'V[K^
+%Y, at d!+2LcdYbI%A#2#rdme1^<VpC/iW5C'LcN)C%4qjV:WVEUtj)$Src0*^Oki0Fdb^:V?lmpu<.do"9i:a15kS)rpLibedUDCHi
+%Qo\UY,5P`_=oP.VR`I;S$9JV3T3\`\Jpk3+1:]Rc9P.[[Y(FlF%b'R&ipJ+"]qcN(eVuX-?kpt#b9Y]s:ZB0!eSYdjqZ"I`*Ml>b
+%/'.jAO4Aal+I3*8m=,FR^TsJX^,pD^l)r0f!6O'Ph;!rOlplj"B("88)dVp"`k>K:qXXh'*We;:(>]G8qeG^rn!rtX7e/>gXL0Q5
+%5,fV]25lm,0_ at eq]+$gtPiS1OSPCG(pb^f5W73.^jq65&;t`e]bUL<.-=R3eO&Z>3+1BP,S`?/ZakWWJP)m'49Rd:a^ILROacHP#
+%5rsik.1""sk(URVM1PO:Ur*Q(h/*!En/rr!f&gco[3s3KMG>Dlgoo4j/-ZB9%duQ#XD1buBB;BnL*d8g]-i)H=T,cOY"m:1E?bK*
+%c(OHu:5pkn4ZqE[$"Q^,/%A)]']eS0WBuf+MhRqnrr.#oO8RNYg%XK73!S"&LDccQO!_bY_7J`<kE?q[8Bc at BU<'Mclqt'ekNN at n
+%=ZqrAM<<m8-:oundbnP'nD[SkFD^5TJJ)IM3Ws(!SM'un@]/b^e^eSf=l($Z'Ft#_*gU/B$3H^boq"pX[iC,HRi'LdS[V"IUdU\q
+%<&dQ%2q/?G=4dCT7%5LcBTgk"n,mmIKh7>mD>^El;Mj39IQ<3dSj=r!q%]eNW6A*-3\7P&+J-shK*(qn[j*Y0DJA;ELP]W#7NF"2
+%5Kf9#"gnX"mjsgpjAL#o,[hmN0pO5Z1##1Hkf`q<I,+f)nHl)[rE6d1"'PYu\,<4lQW2[i6rqr<ClH[gQM#I+q3Q/&;R,lOFH:&4
+%Q^j at cSC#-QUOEI%IZf9Lc+o#CVXHnuYKAP3 at 2_IC]moKMN\emodapdq3<>\gMS23:oDq/=,Xt#,:6Q`?r<"2RNXPOZk`5p/:F0;P
+%M0A'Z)#%[+4]n.MJ>6]Z'Nof3(2-NlL69JgXEdT&C1Wq+E[82NeT?^Fp/;V2N$8ISajoJP?.S3<=_h6-,I%l"^FPKc`&6DJ8_EB^
+%T]&Vko3di*jm\d^`h#RL=s.H\pBS4rXcY7$B2?`2%(LARVhS=1`gt"LOYd,?8Jk\+2*'HoL9s_IMF7",cJ=RIg*AW72im$aD.oqt
+%L_J'?l49CiqVUI8$s!=/4*ortVV>4En!TCu!dF,QkAYOi(?O54OCfO5gO:ZP_+sEqa=X#i.KU at n7E"8MeXff*bY98RkSBR)#I_Nm
+%b['LaT!a^qffRaZj4^r5iXTlD)$je<&W9b=!X@(Yb=UO\2pWb'kH[*^M^=.kV?il7QcIQe,K773<:jdfRjs<*T&Jb4T>W6*22sV*
+%K%"a;1FakHQI=C7fZYFMkX"F$QM:rIh65KuDYNZBlgI+9Enf.d`,QWXjAQTD4</W_rc[9m?Y+F%Ugh.epoRE\bAk*kbS.Q+kGls(
+%=?kB0MTu:QigW]BXk=m9#4gi2-YfHKjaGo"V"@aF-eK+YRXeMiei^'N1d4'6Frm09;M&u<)ijd;om4b!Um0Phh\(PO9Y)?WI5GM_
+%c+3,>'AV^ts#k"]cJ?>ZPZLROSg-JK'kq at .Gpaq$\M`<;hq<TXb%XA4dU;()`J^o4^IkJ\L^q>bpm;+c_cpGpod%DCb5]R at Y09Dh
+%#@5g)o3H/",lPbl-"Ts20iPXa&!VdZ8kbUM6)dYsjp-;(@%!l_LugoW'H,S$P%@2[:j!p[-="Y":l>B6V]Nf,BKaa_%9-'m[a(LD
+%:K!T at B`I2,mp6"b:4c$)gWi+W45k'X%I9#g)oQ-^QaBQF3+HT+S3km]JH`<B^X/V_>BR4Hg]lH%Pjo\%W7tS0I`gS-HmG#PBQ^m+
+%*Jtl-2!s^?.lTh&- at 5?TH\Vm&H(J]3L")_hZ,N&8rIpU)l9df2bk&HDOL1H.^[e7g1^(0JN[Jc7%e at 0<]'"TQr&16m>$[QR9=f3?
+%%tR&dC?S>=h7l<Q$292+i0o^g"H0$12:jJ7?&Z>dYm\J*GA^>,_?:n(>#reK1O(1^SlRSiS[$adXiO(O;dq8EmZgf?>[N's1<5!0
+%1"DaR at D/YHhb)/8g+)p=b;@l'fCI+o8 at C$#06E[Hj*M-,X at +,TBBfg/36L>o)aBW&[VbkmEBa)1CeS[4it[`1P2*SeP-&l7):4Oo
+%oZQF0*/1E#SglVd`]D/o?_V^m$u4g2_/LVhMquDa3-!oPEa#A@'^<@PN185tSKf3C_-SCP"$;I$XN*IG9rQ#,<'2Upo"m!6mF,bT
+%,HPqG3=H%0*R!M/Dj.^rO6!'@@09qFNt#>m:S:^(59+HrV"]4u"'8K:L-M&cO/_Pq*B^9-D]sY7)mS-1`'g101flic":DMPZc6U)
+%!f$pEH(#:LDFJ#,VeL'NCnG=LQ.a+&c8p,cQ9<EFJ->\'\/@<Q]Rm3.n)'9?PMl%))&:"EIJ`&\kAl[Ba7<OI%=@<Q1C#L1e,O#)
+%&sUPi[BM1P]K^/H.J&lJl;G>Q*OqWu<!=#I^nSZ!]1,#/?o`-SP>Z#DI!Q18$/Z-"Q..tYIOI8=jt9A!Vp.i5Z*A2MJ_KR=g\g3E
+%Z)[14Eu.QueRJ"Lr?c1>ME^i4g7!TJ8_,2c+K1d7&Wt4dED[3ok"YP at riI)h3KHbU=5Ha@`'FSV+*2CR\Eo39_r=44:7I0&-qVl3
+%ARI^e>2EVS'!$T@/C6&R+L#!#k51**e:b'Gbj]#.Xi^/\':o4faeQrd5oR4":YtZFe"/;0GdTh"f+1fZ='e7nU"RjZSZ<(;]$Cl=
+%Z6tNPO2[FXZpRO8$7lIGfE:kVWNAJ*"G9nc,`%)thqWqH.8AC"G1AD"6cpSLd0YUh_5!at-)p=5!FAQ-Y"?p)-snQ]rg/"W>G\Ed
+%kX5nnip>Jb7P-pr)!giXofR9E!W`A^nDPn?fln9+*N#/sa9(Fc at SdNe0*]bfIrXTlR_3KrbGIUdHX"j.&KN86fVZ?O[q6I64/(hY
+%+`L3d*tkPu)QA3m:8Pc-',#2k;u-Eoq56OM&'"K\m.U:$rDPLM.AD5uIH[J(okqG/a<M9L:2'O\QUU?CCLr=Y+l2>IV+cU4D]&JO
+%Cj756?4Kiho-fpoo-RNXIY?HRm&^#bm'g!u8Z+H(V2WT:E!pp7lb(N_U*dupAZ<Z[1c[N;\s/F^G<p>YP_OW\@t__;a/8d=!M>k%
+%bn#[-:\-1bs7ifI"7C27p1ZIOS at o&cCZoO9er;;CWR[KAQ_^>\AT]JP=M;Jq73=%1q1>K\jjB,]?J675S at Z\2S(;eQioA0 at IDCu/
+%_?H*F;#nkj-oh+rmFo)KFrVsRC'S[/IN7gJ7lIU<H6@/OpCmb#%/I06KbY7CK,2e%[$L?(,ZY(\l'a:\ddPe^d3E('7V[spm,7ik
+%EaHib>J)(eS*H<]q4$Ta7q"Q%dD!/':"NcI$;$Y1No/;MW5kW#6LZ[4cX0I>3g\n0cX2iJUsW(Y#?1#s`_RU^jqW/GeB(A<m[*(p
+%3Xp702B,M%$B2e6a[c%8h`6^*!KtA'@WN^+k6dMlrPC)L\-TtbLOX6aCU(4qV\W$Zp4GSp4$U3SMQ(aTs'Qh3pXF#oTU"Y?k:&V8
+%fPd:79ugWPqR*/bE^o)"\SgNdcZ`Pf15Y-0$%pup>?CCZS*^S6WgN!?RI3]'?CCcgc4r0U\rfb48$C]a[@RH5?l+\t8\tk9QkTrT
+%GOUp!T)0gKW3bf4jmhIWCXTX65?h8pGlrm"e<FJ&N*:Ct;Hdrs0!TMq#Elms66"RWNs709N#LO&gVhBXnIcqXWE.\cJ!snOYY7B*
+%U_E$CHoP^?AX.;GG9rC>>U%>C(`_c.ZOKS3O)Em&1.D^t-!fi=g_qo'[R;OB'="'SEG,u(K-i3dW*Zg<JF9H!)E"=J`.T9m=HM=(
+%C%i8\X"U."cXRJ*lu-?Wj4mS,q1Un,%g9Cue6I:s$e8&_&/6Q"/4IB`fp6L)ESITi<$X-n0M,kHq\DQbrZ8h=)0OgM7VO_+FH`:k
+%(@IFS;_3-E'=gn%34^\->^>CKJp"IB]i^m*F4dT_]:"Y_HH_-Oj:B,V]&u_7O1+-hjgq&Uc*u_>cnib_j+1OINE"qFCC[tqf8GHZ
+%KAJSX)AqYhP*o99W!OF1d>(Y0*baP]gX]lpcp>mQj97+M**rU\`9NCm`]ZBl_HKBL:>Pb>d\9!K0Ml"$c!^::OdN9K/5u]BTr2;6
+%PE9r/ZkB6/;37N3lBKCV4bHnt+)O4aRY=)nU$lCo=9FcX^^JCi2Vl\P8+:+.`Bf[\8SV-n-YMp"(BnZU`^t5/kCTB%_)Q4!Q"NVX
+%c/!f<)HoQJ:c2[M'u6i(qSon1D,Vk3^<&'!;jC at P6mnJ0fns_"YB$eMC6C&'F`%[Pon8O&qBh!2i:F>j%UN\h8Q)e at 9mBG<7ua?e
+%Ia(K%A*?G<TmS4oi_)!Vop<<V7pJ]C<]k.]hrd\19bLs6PZg5Jh$tK47ma$&G%%"W>bslAVdFTT$_OQ\93^Q?2+!stV<=9KmCZj=
+%p1X.-PDjM;P<8@=c`,K\[slLX3BX/d5B`IT]]M[Y&5F?'jb4qH,j"F8M(&Zp$@_,q%[,SD9Jk"S,`Q<CfDcu6j<W__#IEMhjM-Ui
+%3OZc=g7+:lPER\;Y$]B94]h(4dX at f=kAaPOrN2Wsf9*6p.^SJY%Dp;n]D(?R!qBA at Q8:JR`Np4E=b-WXB2e?^d8=ULWC;4R<@!WZ
+%7n0Mu</:J/Fj.9n/O+[m9<'7h`dt>5HCr[:CSH*)c[B!#f*nt%Xc_hP*notiQ0/"&,`%\CYLS8:UEOb7?@;I2T9d^U>kTH-OFV:E
+%h%k- at 8ZKF?_5A%pbF^F_)_8HPQuC`V=3R&<1-:JP[A5a[HX)IOr$=i<R[Fa=F+s^1QjVnCo,_BGMKqAeVk0RP0;!HTOI3g&X$661
+%Itc\#RZc:PpKJ%Wo2IS\(`Y]-OKY at 4K0=q8;[2JR%U-H#NGXhdDW8kgJE8Uf:=3m5HUF#*B),=u&<k2K7Id-lG>DrcV/8QKN90R6
+%l*HVCUi^j+8Lh<?2@[s%8FfEo[-T'&)e<8gM6_anP3WUd7B'1E^::CDk*eV5?>B&ONbhi=jdlSj368)lrm;'uDN7,OAK[k.f#Wpc
+%at\NC%Le+So!gtP5ns!%5]2TGKu7b1j`bkJF0cR\Y<_Gq/oFgr\^?8Z,WE#$m;0*@oPj5K2W&jI.K<*42rr[X4)KU^8Xk1W_C-oo
+%^t:G_+>IU7BnDN^.2$ir4,50im9lqD#:)1fQ*N8"QFi4,$8q9)VNY:L\##R=^AQP4O`]jjm<P[h^+4M'J$FDsH<s25JSR2*1*I>N
+%*i9iIWN<Xu^q8d)>jUdXOX,aQ5!2"D^T<^6`G*c8fpp.,-5VQXNiK<ejO!!]*?8H:+pZ#u1t*tQ&eatU4Tf/*Q`MC]cj4u/3V80g
+%=f44?c17oK(_!J;,l7$M?KZ[D91[4gdi5M4di3*&e\`aE+?3.i:QmiVbp6:Y@%qsT_sBu8:NfIgDk3)sb_,ONQ0-6Dp`<Zn1,[e-
+%>a=LD at d&YNUE;>iAC_W=;Y,S4QTbiLEYB6Nheuq6KpGE9C3-0E0;rV<46:-%$X/RqArm\rnbsN`*@A1j-"Ls6c7N#=PilG0P!VHa
+%.-KqB>Rg;TG1f!^%bmjS`pY8HJ"7XYdEqR>(0LTTlnJpq&ur2A)(t(O;-kLVLj3pJr'ZDc_'<9)h=X%d):3%6PL?3.hI)b?_k1[^
+%T]>@);J`*eKAHgVPHE]>A7]XtZ at VV5Dtlqa42K=^'#AE]ocOjP;^;L25J;Qu]3,o]4s"&19sg*s"7f$N?\Tb2+rsY\jklTKD3Vcl
+%gh,c<%o\W%[;&01Ft]uMjA#B&5]iS:^"`UPI?R/B/rD$s(2TbA;!'b7gu$9s9$,]T)W0dMQWHQ*9WN!Lp+;F#\KR:mf]97eR:pp8
+%*(;8f>"#:5[Tk'jg11)g5D(Q5M:3;@S1@^V/Qdk&($S4DWCkL[Sp]t;DLLH1;+%LnqC^[uqKV1n^MA_1W_Ld/."c73bCfgH7m$S0
+%7JHAHg_:<lhe%rH$pJlsh)#0mWFP1p%*]9Fe?nbsBaM^$W!?G/T?0_`XE^_V"a94"nmP_hQ_D&g8+EiT#b35*2hl4moK5 at U=r,c@
+%k(5<phEl,ROkTDSG1IJAWMu:S6H;^`gR8-`d9M?8[2kgX^^V0AVabXHn*MXepr)A9WFYA7'fdXCINFR at 9t7B?I/&^>ioGFsHX:o:
+%(.T!<9*pJ=n"^*t-^c7M*IlKLB<ZC at NeGHg/+<4Dj"pohPOOc<=:-\MehbuK(f?+1>rs2Q5&eNJdBO'sSaZ:fl[r"]4)57FKSZnh
+%N!kG8!p!edmReo(nTjdZs#CY#mq,F(U7Y-L"S2jFl44k(`HJtY=7)e/0\;OXrM;hUP`-MlSuZ1f:+tY1 at J^0H_P`ekC@)"S#X.;"
+%#6cLP^H>j1qgnrU"M*>6Y78.#Q"@&n2e?>B4`8(aTq+276?QZ%!p!9,*c&"<LN);'c:U(?EFTcoTj?c,jf5']PO.#sPJ^%dC at 5-*
+%;m, at nOntU6(q^;:hg<j[Js+(Q.O^/03s3`l<sdM0>%MT^Xj*Yp$M5%uE6 at E[s*hRm3_>0cPL/Z(P3KA+>SeZkQdQ, at S3[f<Brt06
+%1Muc410jXr*TrYuVKjrkBK-?FFp`;F0F<jV2m7USCd]-d?'=FWm_sUVXC=9[J3^5GaWtNu(qH6maWO^R,jiW%?B/ALGoJp4KYsG$
+%7T5>COH_`Na]jbl+fB:3?hB.5%mOV\qcF8K?>;#o=CC6"Dh%OB-#Fi36?oi/FIX!,nJsU2><^DFcY;JpRR<TY@,@$7j&Dopcm?,h
+%WkNA6]a6o+$ogca,`Bm_cA.-UF5j^rBSm#Bh$e]5CsFC3p,\:]?L#r1^QYq-U$U6Pjm/BdBiBoAABrCZ34!"+*"rQ^<Km".bUEjd
+%iD/'S9k$o>0qb)EmD/=6heWL6A5iuDi3u%Ld,oT=>\nuuLNSS(nRAo1N!TB)-tVS[au4sH-Pd&ME*mk+XOpHtE>6Jkc6:c^Gdg>2
+%?5W;u\]>04X':&?-O9sTjm<hTegDJli5(q02P\q"JO7K0q$h!9A1G85(Y3F_p)ej#Q8ILAcSd.$#;Z;^4Y$]o15Hk`.^KL,dtS8N
+%aGSc@\1[,"T5E)*g!d[YK$1G7efWK.;^1^BaG2XL:M*lbUp:\Y6/<i at kFt>4lCN08cRTHX*Vj2.Ge4+pdUD,WRpq.25'#elc6\fh
+%Snj,S/D.fG#+o`.n?W0o=GpLbHq]:[B:.,L^o+h;!+0/#MgrKHQlPIm_fV$]?W\L!"FbnppcLWHqX5[?=t`rT^R^SXPk6>=P/<HN
+%&To3RkofS%nmXKBm=uD3>!%$+_/4L+-[G*5k9;A!*4&Vo.$:QqXH\uorbAns_p*BMWNp5Xk6V90-QC[U^Dr,846#6QBV#)n&mQ39
+%Pr[o)H at B^DigT>$"A/aXR3&_.5rq<l?[_kUW]bh5?&UtV[XQL4rbflEcBd'=1I7-KdAn.GIX0 at aTWFD'Rf#qjF*RgDWpR!MgQurX
+%;4t7T+-^#J!d8k5VoEFPj`L&o4(\9HRC.ND#BM>kL7K,6s4g-]Kq#nm2.C+tSA0tCoB=0s466D7eBabIqTrWR,k2/Z*E<'&2`<bM
+%-\jpWMl4kRI3R??a,]5-i64n>SK_l682:LC.Rr"+M.o?OVG;7%p^-a"$V/TpEUCL at MN4Fg-ugTAXk,jC1$HjhC_J_6ds3qFBjRuu
+%P>;r.:FWBVV0W(L)L-k1Wr:N)l=7OG&s>\T4#^U(E5*p$;I/1SHYO#"j:;uk2;1jmSWf9,%h0Z`hAX=QVXf9PZl>Pp?+BJ&Jsjpu
+%Bf9D%J&I/3iRerg;E.=P.C, at XFO!lfZ$`qlDf50MS]d:&'1e6 at LE0:8l%%(o@%b;eI9`_>*[`idYHjqhbiSH`N.RqW`?>%Ze3kW=
+%.805r((X=%]cn-ZVkEm/e(@1lDS!rdo!/:sc"=l[@W4u;6C7I<Pc*EH9DeP:!JeS:qZ3434!l-n?h43nY(h1#9^QF,V.>T6SYrWM
+%]cdPA/Cp"&*pt,(H"`B5r at lLG(VCDoPM;2W:J0rPi]=(YVkt.t6((1]4J\5IL%/[<K6$1T^C93GQBH>4Eh#])*B`1Y9ICG at i0Og/
+%ka@/M3<pOhp4Y!I7<J,YqRJ/D0"H9W9%mRPMBnmiAHFHfaI=PrK62D()r7g3roaU%"T=1lg\;-,:=8]653OPUheJYFFrg2!7Uga/
+%nB30FSmaH!HCAhp5A`ig6/3;0S"cE_ at IAq(3]$Kf at a@7QBcncP%n''\$3uE3%[n2>Qe.,OP^X'r%q'YSD(*741bO at 73GfHBO&XF#
+%Q!30!n1PpDDo7"*H[["jZ<9rcoM3N6Pf\n;'o at ZV.H>%i[,/IF5G[R&="m1t-X at 6@k2lCKl:LZ;9D/\l95^,SqCr[W%@Jk+AJI1u
+%*WtAN/31Je`/,p;\Ea9?XV5qF"9L[]F8j[LAGk,4?45"1CAcUY\"8HMr$9&!#n#0SBtQ*6DiDo$Yu)UBQfs4VH(mlEOqpi-aep7O
+%ia!16mZ\_--rU5 at am6(ij.q:%YP5Z^_&^Tp_:h'*RLL_WZ2iP,_$OntD%MnISuZPNaXYGn",aIT;r"QlqIo at EisK1qQ0`[B$98VD
+%QTF*;^7(e^?2]qO<V\Q-@!)7U"$Qi1??/@mil"pK3WZP^"bAG-I+9RoFs8O08Q7u$8"XtHDb^,7CXo'm=?LktKfdeFCDsocF35qG
+%dmbn)39BN^I\j%s8Y3XQWAYt;_mbDrG"u at M+oH?Cra,gpAP$`5B.o)c?f8SrRcY7q;kB3Da-f\m=Q[ZAI_#@J&/(`"ORD=j,%nL4
+%I#1E:Y/ReCg[,!J'^K:9a!6P='Q(:+bAnmloG$=Cd3k2f2+b^lc.*4@;1n!Ah/6OX<I@=%TP5Aa>a(m3l-/P(#8*&a4*)A(r>q0s
+%SWD?>kll:oj+\?IOGY:'Qc at E7j!mZU*0q,$3"W`B->EaS#1iR20,*+G4o4[4?Y6!'7dA@=nC*D[4e_e4LWpUlJ,gT?*[uo,=[l-u
+%F*/JNQf/-%grmQKh/BeZ)<[eO[m4LU([8'X#PgbulAH%hG5h%')LbB:&/eu<\L,4h'*2iY,HcsC;YdHD4J7.?[ag"H at D!h!0UO"c
+%03O4\>Cq(u[#k9Q</]8`9ChXs59)U79Sf%bB!D#tgRXjCq'jnsF^/e6bas\@&^7Kb;@g?>*[^Rp*hppg!o#f$bH@"\pCeV>S6fc4*4Gb?GMs;JU]*olX&u*-b)ADOKcf-P`1W[2#&Y#+WT,3+sh91U*!E
+%dRA:`!KuFZ/t`GmPP7YW)*`JTmp*N>p3`"@'k9':m[t]+]<e4^g]#ptfb7fN^J.f[b)AjrKcW!lM&/a^G,/q3?Y!/NbQKN4[Q*UL
+%=o,B!SQ#7,eS=k4F\E>k=kVW.D3BR[n0=RkeEu8YAeA.$\"d=JJfV>ic$h6D;OkR'3 at q`QS?p/aa*5Wn8OWOQ37G4uS]5NV2gL-W
+%]m`7:.2*4rZ5`s_qW:qBiOSGX>(Ste at s^MP<1U[:OF at P)5Xq_232t>0S;sZO)$cam%T[&U8#'9/]i6N!lb'oPAe:cf%*R"@:>Ega
+%l- at DFbjG2K`eZd at lVRe[[r"NpT?k[?9bnujA;JdW5Ui%VQE2%"olSpJVgqH!MP]H]?8CP&[4Cg"\`(3dL&+F`o4SrK&j]7n2OpS8
+%D*2Z_2iM_[6G4)"!tBoLm!@t'!J6A=D32W(bEI-bXX5Hc\Uu2bb0k=T.G8ll]*(0qd`l_e[p2e`(j7#:X>Yo\.ZPrhoXtD'OD'^l
+%Jcl0#?i-83W at sftl'/ocL(T!1>ambhkW;/*n(+fJ\HiF'*49*@a!?O7W[],<Q, at EHrWYN^eDFL4'>fru:F9r%8utp!@]_ at MNr*95
+%0\]88K6TCl[:@NCKmY/Z7&9Q8j%P=0+[:"-bf`.0ZQrCj3jnjBiiR"iN)NZ;2Z=F6 at .Y:4ph+IbaDm at 4lA/$`HSfQF0*MYJpOdUT
+%rTs]._9,/2ZN[=Yg9]V7.MbZl'pG&Y"IW<UGMA^>T"6_F3k7=s at GJUPL#,>6SRqs#no#s<MS\dBFhph;Jl2oNLgtOs^Rq$A>IfC>
+%P$"XdemK5M'-)GeeQGgee"VoM%]TleOMM?\8MmcM'!rpERDS&^2_Rj20JV4R[id$qMu0"!Bj1huC+r012XT`(5)f`6bsX.=Gcm2g
+%e6*^>O#Cqnjarj8N at k&#q)G?G'"eMr-5l`qN<`fCr-_<b4Y!ss*JHZO1I#ql="$V%i7<OfCm<79Rm!HW3J6`SIEFkPFVS^?[Oa7(
+%&L<VL%/Hd#K;sj$oSP\M89PF,"%SXl(=@WH&tuaC,(,j3'8^7,cY.5k!;i/;Bb<;J072EO#->3bK2B_OpPD:<mpu<4MUYrTA!$O]
+%Qp%@UHZ6VB;t<WYXHDu,0R`('+Os.u;9G\u.RsJ8T\6SYpQ7&O[pTT*:nY\H\_U?8n\h!nCOUs'<Zq-J"n`H[HrPh>r'2e&JOkNe
+%`C8 at 7+65`TUd:E_H6T;r/_)s]9h3&h1AsDGp'M9bYE0d>_fd1IGm^fd+a\P>X/Gs)"Ff+JaMlgF0#](s,^BqK7DWU1k-njjfQIOr
+%kJ9^UL)u\h2e!=^4*.u.\!&P0f(h=c_H(:n%qT&@qp*+"]t1r,Wq0U'7$*MKdm?*^CGS!!lX;+1Z-_K,L!eSOV"-R9*nrsdkm3)t
+%X5?NEi'K!N.c$+8J\fp,O*\,5A7'V[/kTQMhqr>$3>@Ldk0sLT4:=N_G#m]#S at r0WW:GMY^\6]6K%\.oV<0khgJ1L8iq1q;oY4jn
+%4:cBF6BDs%q*8,1?E>[<9<l&Z[bDGMp-ee9!e!i.Mm2;iN%[b3mG%tFKcfuXcR_kDYI8;e#<aK.EL<?38[PIJO[F/5Bm_J\\Q/mU
+%D<si>`5G#1K:[^P85WY3/dCdcaoTAi7H7fm2W2C:`dN)`pR1d`#sA=MGCD%let!(RnbA)UK'5-koM^Yhj/@!'dG#]m=0G#MJ/!u%
+%gXSkB8Yl#e1_W-b^8fHNU!(`:Y4A>O_;8.A*!QY!\D3a?r%_$!&FU7MEI*(mb$N@'7$%2)RmE=V,n&?73$LAF](qrADHl21$[L$n
+%mTJ,*cL3e1":CcWNMlnF/KWP$$U=;)L%s/F?U"!5&Wm*8*d+\9AY!A0A"'n$9#6$*q`.FB$egDn*BdEIM`R3rQ"1RS]6m*[+\kl\
+%#iESC^tUu)OW$CE*[_27^b]WSeO>le-u at hSYCFP.00AEYRV[POd=5=RJV#FUVBcM^R!Jo\&b6>i_=&d&pStllZ05`X?Om$g;7D=O
+%7nt;<0nNEK(Sk:1,h83UN!9'QSp\3<,-%s^@=G.jSo^@:JajLg8.(]Q#32T)q52H8L;99K8kjEV`_7#DCp%?N'5N`L=eF.7Ws-;n
+%5UmAm5R9[<47r"T;s?*6(rG;>HJ'$H;Vdubg1QaF9-Hk#@uUuO"YKsYW:Ja'+J+_D@%E<6.DJd_lVSP*k<kE'bOJ'SU1\3+Nhpnh
+%ci+)kD@;*hK^(hZ;3J60OA'J(&:n.5>]>KL`Vs'8nZBo#qp#ObB3J"3^KGA0lqqBVZ_\r0Q'QnSY&,ePbXe%/l_U;$,t&9'di<cT
+%V/1EG?;B'F0W`aU/D&1h8_F0V/YqK5?C&J1=>^JM;6XRDb6CY-!4M!MVp+MVj"2 at 5blABW]nElY,4K8.\rHaerD=61$,B'j)gr3[
+%r]hm3k5"=^lKY6A:P'd-kF,LI+Z7K$Xr%F.]:r_DoU?4dfb3`,,<<np0(X1Bg'i@,L7G5/BG4.L%aV+;`FeVOAs2]UUl]^Lm#RQm
+%Q2#\e8Bo_je"!>'fC[`FTm(6,rO0T--jAa)dei8&L#o1WNb*?OC><(ceF(0ON>Y?gX8Osiie\Jt`S0YUF*ST_=Lc=!($XSD at 3m<K
+%QL%#(Qbai*Wl$@N22`X^^Q$/3MR<2K]o`GY%k"IM$-mg&.G>OUKYdD./d(?GRmf/?#77"3(4&`M%t,:=V+=."P<=7GWq)BE*6g]B
+%*,]n'!q^;S]SD1jlcZ07oJB5GQ at .YeMcJs#_P7SlAO;lmY[L-&;GH76j<U4*hNfB>Z?P1,+dP\Ze*c(\g"t2cVS$3`2MG:/U&J\9
+%06"SM]hci1auT!fnrUW;;g?BfaeU06KCl,lAZf^l4M/g*oGqoqdHj^;/[Q*'oIkO%]]4?HOB%J)1b8%:+G\eEg_(O_RPWHcleSo^
+%&qAbG[jNhok7R^\o^oZ<jdp\]XF1C%r!;kdhqr8\6632uL3`:0Ek[B%d65PuYW?L>Qo_,B25I(oK%YDhG4$I+lM2US^(LQHb3Ls5
+%P>dS[Moi8a at .>hX2(o,4hoA1!-ZMJLE\RVeSEYB#e0Hj:,DUXrU)C&^i/ns#kC)&sG;CCmoP(Pfq3%"i2*!TFV:TQfT7:kg4S3'q
+%K]L$*QRMJ[!n"/^:Jo*OpX^dX2:\7(rf%-*TU_G%MP4'*'iS?!Js>&Je7OQF)R6/S*s%2IAjI<GSO%^/T&e02LerBR+"Q3#1476>
+%K\EQf_XV9kkO^+)6Y at Y\o6_sZd$R@'a!Wp)cO:#V5r9GVB<(bm"3'Xce^\T<Bj+$;H2BlnH7Rq/MBe?>S.'92'W;\(R^0tWn&oh:
+%R`]Y@?t')sS#._m$s"]&9/#IM=[Ao[Q8aWa>\Io$i*?t%/<B?E.adN=mm"d$15G!&bO"/a+PPksh=gInc($QNG8m<HS$u=:;3L'J
+%=B-t[Dmb+`2ggdsd`olk1aRO(_)KX)(J0da=UrPB4($`e>o5u=3`R;p1=V$"r[Z5.H5tc.\.7l-P*/&_KnX]A5?,8MmJE_f&kj,e
+%.e?R%C7(01?FY(j:OD;^EF/u"lcU at 1Q-dG0M5bgWNqI].$5d at MMIu*B1GAuO9CB=P.atJ(8Fg[m(9jJm;jhN:P3(S-6kB'Tp^#Xb
+%^Vn8_Y(-NX\R.eaQq)'cE\J"4:g"GG"/q+I>RNS;&!E``RuGJ^E&kUPW]'l,jT&V_`DUI1V%^prJ,(IO'jVpr>kqd>&\PJSLGJT.
+%h at TZl>*6M"I&%bLS5C&JkP=&V7@%uilp[O^mR[C/;9,IjSeI))/V at M?j0F$%pf.'.kN0H1=LN0a7HR9Aa@!pamAHdgG-]5Ae?lGT
+%o at Bg@pLQMMcF_l6(?T<Q<Q?>\'&hj;4JeX)nG\&;!R%A$2jHL-EP5P)<WgY?2tD\A,2?Wj)C)9EdBEC;+0B(ZOE]\j$Ei0u+Gq/-
+%gZg6\;VK"hVZE`K100:;j.*3G-,n9>9FgN?d&db--r:>Sk5:"*ST)m%aH'DQfJdDMGS/gVQaK`!cP+uj!(c<TC$F>'HKO]E5CZY;
+%er%"$/])R0<fI"tm(jHTpRlTDP_Oi]]01aTX]o^1)eCnfl at 1@Y"W,l40PN3EEDU6'fRqtq6"q]13KP6N4e3q4&,RN^R0,M1kX"@1
+%+Y3AB'NUh7OKa%.`=8]3c!fq>K*KjU6eN#D6(USt[M+nu.QB&lV]0L6<?$)29H.Z)@$Y!:-23tU`o(Q(kj^<DE`6Qhp5ll]3_%"4
+%^!Z.=:hK=@g4OJWgX2eH?[c1A4V8ob+"<0&;3E*Mi`af"2MC4j_CiFP4hhiO[-aGX\bGGOZiO;`5tM([?WEsC<o.^FGJ,Nu:N")i
+%&N(T#/Kb!:E;Al+iQ8mD8+F7hdr1E>.o at -1kCYYIP6B+JmN=P(I`3jNTgJ.:\Oh,]1/-#@9*q)WU*c;j;<LZ-kZOd=f9%P%F?0J\
+%^E;j*jdoB8#Z!KUD$q8[DcEhG)Ils;$NBhs9WKM:<"Gl,a8Kk#H at +":dP^K>b?)4b6rMBC''&5P1\8Htek)g"p^]No3m#e0_mA$Y
+%!ppkAcd[CSSB)#lK,Mj)'`8Ppnk'0u#6*b\Derl()^iIjg_l\.R93KN&gFjT;Z3rEG1P2GEQ;;i.%--?a_SJ:gV[0b_YPu8/gQpk
+%ENbW..M(tA9(]h1m1Q<\\MN\a6cc?@70h..ebq?A]T1!%NeCt*ks)!e%lF1GhZP8".IjoGZsW"Iq=A6m]B$X]O_#qO#+i_A"s;?.
+%D<-5"pJe*%Y=U9)JdMD5\dt56<n]b9*FP)#(>2&i:FAX>rS0.)7J0A)i`FFi4=MmZWVk,E=\YRI%r9NPMCYT>?G6kASQ(V*Rno./
+%b$;%r``.Df']]pF;sB;9D`NOd#E!2h*6[r#m`U'9ibpHG"h/$ae1A`VX&tj-rrhW(NRt&V4So9=R_'a#j>j=;Du&K8,PniM?eHmj
+%:D<gA8>bR:aHSVlD4*`pj7*g^)d`1!jCoPQ#ptCO0.hF+/Bd_p/nM/R02H47e_b6H\KH2$.oV>JCE?Kn.BkjXs'"dA#Scac^T"91
+%+)<Smi)//k0]?_!.\nGo0-rtXcCtg;oaY;&qUt_'5_/p?cbf33D7!.p$\l;+S#:l`o5??/pge-Rjrb^==)NYV**A)CSKcg?FqK+a
+%lBEl<?`nd12gDE&a%>Bkl"?iSipr1ehHt_OY\UfE at OK4Z#R3EcjI5PtFgM>HgKis`Z>bN'UGX!&hjX^mih%4OE$*bR_R(R$eF'uh
+%e05t.Sg[=`pG#O]JF4N@$k4OVC?7_(9F*2l0!:$QU3gVf!KH>s0he3liOQak,3mT;Aj&=*?7`u3`Os]i&hGr881FB%BY at Z#K&2r-
+%,'It(%R?\$:*Escq[1I'Di1q"ggec$#=[eRh"Er?cX_uBg"cOS'rk0(SB+oq^Sq'(I>.'aKGom9];@9-56;+;^.r#4Af?jG.5bh2
+%YPM//ZIf.iNO!W_9f56_/#CZD at O>;W<B6YIi0i86VOC][hP]k6iGt&\Y1 at E_doO"1L';;qYe>++$qK5^[rlFL-6s*rg-6(lPnTd9
+%5D at CG!l;dc;cEm4I%71MIB!.;>KSbmK?Tf,(F\fd')B\a(+%Lo69:7Y^-\Q1]=GX-/=HX`G2g`IoZ.hCLW=ecS7a\?Dc<!u"FF&M
+%jR9!am4[kK4G0Ud at s<*uk;G3E^NY#%mN:6k?)"d*rjHIX5IX\QHM:$L]Sr*Miq>qbgu>^B(2S)tj%]3lonS/AB9lf.eb\X(O6Q_5
+%MnV99q30Q*]!E'G=PuZ+7:0eoma1*-6KTn',%>Tb2&7AcQ$0s.W,Na^qW0p:ULV`$K4\q.N7kMY)fIDXV&cN`Islf$cWP171qZ`+
+%+HpmS$qLmY$R.V*MBf]9=D5(,<#pCq\PfU8_iT&`a",Wu-[.7g6)S_f!OLr[Q&[/X'`-9"!bk4XD@@?&/^_s5<-[U#\-&HhgfpnA
+%`,]=8=qQJ6l:t>mqV]*B7mZ.MNI0cN'<4L'CNF^e9.c8e^Jk0XF'6\KOJIK?lP_IL at e:Zbn;=T>UOF^1WhrhOoR=LWQ(U3.K.4ER
+%nk:,bq+\'TQPKIfKL$]gR/So,].,tSaTJg<RbolW`?+lDVfMea9]<b5]Tgok`;9UY?U-^Cg]D-8k^>4;$:;P2.00`^JAk#KR%PJ1
+%ON[LGH01Y$FW,[J+Apd^Nulm*^PD+09o?JVmJVfR00?MUNUtBM:cB>#ItX<^$]+L?S at E69gV+05kH>`<Q^F9bH<YX,d8ngjF!A.b
+%]?D2b@[SAs9S^hu3g%s]BYgAO;UNP,-2E\Yfli*CdfPup:TnD+fSf<i6VXlH];\]NY'CL!:)oh07es9,8N(k(5n.ATq\4qDZ.O,O
+%oA'u+HdDiNL=MNl:K%V7*@@F>s)_W=,#Vi%Z`0*]FMNME#0_,n4%Mcg)aImHmUTB"/(hYUIA.\X":n""X6^)B8M9hCdiE\s/8\_'
+%I(1MF-R8gmh`p\S.4"JB/&lY%5`2Fib)#qbLEF`=bEBJ1k9_)-enD,[F8MD6W\:1#k'-if<.1YW7:9.(mPhU`O",IQEj:+U(T#s1
+%T64lS,c`#:P?d4p at B44o,N[3Ocd!Aeh[MrMp>$84\rYq-`MA\YCn_rl+R at 7&J at BTF0c"TO*#7T0;U0S*M^=rHWDiS!Ihb:'e!!E`
+%&@MM);B.f?LW-\eWZ#8;f7</[RIgM6>n"S--dR3USQ"4s/H1lWCX_G#)m3PNE`jd, at Nr-M4[EK;, at d)0X\%.l2fJ0)008L$&R<]/
+%[@`9W6(,R,acFrj;dHcGOIO.2JokC#l3Pnaj^Dc-eiIr!'7m07r9[l(o^$--YI]KL]++S!2dK`rJmZ-=8%$$U/;Z:8fJptCZN0+t
+%/bC5#k>oTK=HRhfSKtIO65>)@RKKae&LI=Y1(R^5a%<tf+qUL<Q(q_LJ[1jHl4OiVb,NX=F)'9mB+Qb-$*g?g9IQC"/4'=3.aoT*
+%b]8;m at .p=Z&^VRGSV,1(W]\j(RW(2SM_b[]$LZiZG$LunB20;#,c[ZHeNC8^#]f,N1j_F[aj*JK[BZ*`&X6<u2LWs>r[+WRc9<aQ
+%$mJIBbVkV$M3Z&?kI"/liRDa1Ni8.VS9:=W.*A.gbFcJNFXgJaE.2GX1a+*s]?]M$^2Q*N\HhmX"H9p'M'SgrE4^UY1j1(YlWaWd
+%1.K/<AgdHk\3C at o5.L_G)jb1b\mGhQPS,pQ9oia at i82R?XjuA<+=Km^>[=J^l1?e2?<`#%^-b*K_:/gEm$W9SBb"hTe[hP"flWBj
+%5n'7)@_"H(di[jRaF*TB"0ld%Hc at 2=r&b_]aQHQE57;i]ig=hHQ^>$\rI:2^ArVjk+N:n%#L$U/[77t2/ME/H0^,0>`C^.-fWmAc
+%VP"oXADJ:6a4u'L#1igqf?[a"<,fe.VTr2W%fIc%/LfiJAKT0$9bCBC4R'fMCIPb`2nGjgRJj`s.'snU*hJU:o[8V<aR2KT+[t)0
+%.FB*s[egX'a[*42Dp\p,,CnpMAp<>#-O`.Z"$%)0e#%hV5ecPrZRTWCfku]>EaI%dYqfS<FLpkfYKDA+@,7\'89.T.dBj?T-*eTf
+%$0.?gHKs\M03.Y^r&ITSP:Xi!HBYqC]QP1_Y"n*0/6M![/;5pTU<q8ijt-gp%7\[#Pe$EUc1uu;X;S/t9%WnF>GI)-=LI6s0$4'K
+%,PcNY?d;:i`jE^&DEZ*'fCXT2aho^<;T%L#d2Ah4\L,iLh+%Rc0Kap.5`l$RNga+Fe^<.\90##R!=/E.7rldFCbDsT&(VX0S[<Fh
+%1WM7YP2?j75#&*`Npl<^HRbNffrRoSlelim3TU+(!&G2uX(_.9ZV9le]Uh^H`D''-YsDU?kH8\K:k;3^3SanebB`(2b^4s9;\U^1
+%cAt*UARBbFoglO(.UW%TPW'fdW,2tc3hP<?ZZ<FP>d)75=INgjn(hu:/]]i]MMWEV&t^6;`Mt7,\.Q=]#]$E&q at f*0^=9AI!#-I?
+%6a[ejrI-2I;`!m-h9stT^2)TL-hegh][k7 at hj;%&f:i8V9+CXs'PhZreY&.fH+k^XR;V.ii*S$?Ulr9E[@sL$&)Gn%<K$<]e&DYs
+%CfF*9VN7^#SZami#hQbXR8[E$51-E"<8cOsMNZqMeT(:tM-<+Ps1(HPEnK-3(i7`1j'J;GS$8'Z=coR&_[f4m01 at k4%GQ<4djF-6
+%!mp'7Oj>=B4q@=+F\VFgFZ><uk2,K!@S?hP)Wj-Knjfl.(o/0nb.Z$,96R!X#OhNOY1d/VkhH!b[E=\8PVd[-**(:X]&-C;DOc?K
+%Pq)6i%JDh'["BTd]FOKfHnkrF:<#6s_9^mc2s@#e[<7Koab]UnG8k4Vf[I:^F:SGHO^5=[jTr6//MJM;Wj<\?%@iJd;_I.UUopA4
+%Y:H"C&JUL at s.[e'lq^O.:is'@?CZ[+l"G7f:.HZLMT=lg$[V%r244FcnH_2o-S8ce(75jV_K;9>7c<EUDY@&/YY(VrX`JQM:':o.
+%J"n!nFJXR8h!=n*Ukf*k;H`*B*^jh.dlPp+Em]JqMA+]rVlm2U_6kG[_b+7p??4bg:o1&6WF1l&=>jK/i!1!$LF_O:TIMg59-QEo
+%4#.PS]d,C0%@+r)r[*`R8U"LN[<Wu2J7tXHe2Ya<lQneOIfX at qp9DMN];>O=MU`\4h-Ah5*[#$*,N1fkT+u=,F09WMWdqLqASgm%
+%Y\j=#>`H``:1!@%!ilVY<E:C/r1j1K`9*=#*nQE&:oiE.5qU]X9nnW9N(7b$fJa,XaZ at o)GJI8bPobSa0!REoSQXaV[Q/'C*M57X
+%IKTi.)6%WmPF-00+lZm0/D+\<4T+X!<%Yr6g`\0nEEIgU4Gn`)/R7#r3o1DE6A,()3[Pb at eanX0)k<8CF87,0:'mc:].VVWoeHSS
+%"=^=1S9`nrq?Z:VD26Lkh3Ekudholl4>Ta(COE2DYFC:/7<&GDU"'"oe4d]a6*cPoC,B=&q%P`5YnhTt8UNNEQ5lfug`XGE=rG%K
+%do, at W.?"mTm^5j.iWY\<5&F41Bu/Fo?2N1S8.a1nKA\DK\+8oK"]E`rHnX`Vm4!n^+P'oW;s]^(?*m#s]3#9Md"[^Eh:?0>5HJhL
+%iXg%ih9G%0Des#Po:hmD??8X4RkC`W#IR0rj]aTs;o.O"OpF'B-$OMWp\RhDL?,K0,89J:LAF>hB9M+(CRh]hSJU"WiB#pope)]r
+%,fQnFT[L@(;;`\l,*D"@kLCo;Rt\6bC"O\a4\;jfhkKYC^O2l+>43$r7]Kn=W;aNfjDB>p-#)9#N&=aQgh%(acn:?!6McE!D`a)`
+%$5G#XVb$rd4]BH\2f>,K1HulLAlC8/L&4X3TmV90.X=OPe at 9ak=B]/[i].f?o17`eIa_fJK!2F/-W<8Vj5_>ZpoV)FhagAkY9<XW
+%qgkLGCB$ADL[(C01>`?I0fAjB7/jph<j7=lal<_Om&!e[*/=YccU?21P$Coq%7;8JU(GNmcCG*GM4COo;JRj at _)@a4kHWL5qlZo&
+%qHiJ:O;>9 at EsW9Z-Kt3#:TE*2URW]8X;%*$XgZOI(M\Eo'&^i4A at I^XZlF+*GPh.TKS0!n$EpdqQC8jP._g\-=UNqH==2C[RrKKS
+%E^L at BVT*[pj_%JZi0f)o=_P:GAf/fmSRGjNfDLS![cA*F$F',4d%$/^K3+NKi2l&UL2[G(WP7cI=FVPi)=0M,RHA+D-0foY'qW"8
+%<]<r8d#q,rhmG'G,Z#up_MoGbqkmL6Cli\m;bicTI6$Sf$$#$o"l^Q$H%n'r1-ON/)AYs76"/q7QHKBfkaLeIWRc-0IU=D>P+(me
+%pL_]`r4ogT:2fLD#>d/]#pLY/@!?H4PVugP8`+RQ8I"r(JbeF](KkoDa]^?/^>u%7Z0!+hjj@[.k!ZqkG,lJ-a5m at t*VAoJ=[CAV
+%I$j_6f',4_7(Z9`g63S27uOUT?aRM$_iHpUj+-->nXHQES6"6\62oE!`m5[53hRJ&TANZ]1%Pt11;,pG9p\m],5kYb]"Z2_H:Oq_
+%DKb='*(@$eG4:u4J:-O$.TGk0Z7O`c<GL]I9slfHD4*/%<S&^MDo'<:(Lp%*GK0qZ\a^<<AURQA',2%j38^ff(MU(J at g8je7kV&\
+%?9SBcJE9+++eE[$JlDs*]US8%DT4CFW[D<a]O*?S.C80"SNhP.!:RTK)Ai at mq#g8S\oOIOe93m`]4$.B!eM@]nbee4 at K#18\!";E
+%j%kb3YT_027lW`bb(Om^Adh\=&]i1h(ZR-9NE&e=377I_/0a^PIDbh:a&%D!"KWA&DGr99lp3*(3TsL=V32Y\n^H5EDnE*'V%DJ<
+%]:dfhGnM-J9lYUpKHA,D[3Z!KZk_?UmdG,^JrQ#`ei;-^jH6\O$JPmj`roF at 9.L.l`<)&LQ0ph-XLf]>k]VD[bY+TA;`b.8VF50U
+%Q!T&GJR8W,0l+;[ec9;D!$fJ&AH^j-9Q3fQ3I0f.l#<aE at .VEZZO*q at 0?XokOWZ%e/#g\lf9D[2;:XbJrVM2*Eo?Z-BCIcsbu',^
+%*iiJ$h^Yc)>M>_6i)C7ps-1QA3li8$ao%sHS9%#Oan;_tI^UM6:)P>3E.k<qO(-J,5Bj17>7'J_O"Xe:2`I9Kh6MAXPdqFP(PTZB
+%"P-mqOsYRAr:ppV%Y1NX]G!NQ9+STVGE%M!D@&W`\\`XWQ$<k:eb@^77H!h6QqPJFkKUduO$2)O%mHDl?di.l=C%Vk2te>_[\\sG
+%`fh>D.Vt!'SEkQ[KZ?$=oUrL;RK,&h5#]qk/.XqB61)c\j%84?*N7]3n+[\H-ZM$VNPc,sV(6gCq-4GBFV+*Q"#XeuQkdB.-M0(T
+%[?F:::6(jrH(0Y/OfBp%DL=_,]22;O&td=]gn6gsX^:tZ[2aG]dJ=2$q"AW`n9kf`__n.&@4_X3*Xlc/r_)=a!s"Jg9bH`:XrEK;
+%S?C@`M:U!ca1>sXmaM-ec6Skhr1oh;d/g/^MRMG?&^23P%3nn)X+_Dh_b'U6R<1I+P-r9;I;ZeIEouBoG;WKtd.Gb`ZQG,q]#Yu'
+%?P>i)(=A<kGXa3)J+=$FG[B-Uq0#Gp)C[JT6lO8dRqSYDE"4bNESu%ub2[[Rc8fWW?_T;<[1af'[TV7\NdR6;`>"?F?$PJ-R'tca
+%Lsf?OkSsDV7DIfgK\D5+Jtjt[M7&"N\TU^XFjfGEm&B/lS_[LE&_;qXX\Y`0S!d\]E6k_(B?HXg=QHujQWF6?$)$TQem-+3I1j_Y
+%N`]%&-1i#Fp<i<N;g)g!2rO'sR:@^iS at S47,BhaP^OM4`k!_%sL(ji4-^>dl#%uLOA#>NU^-2Z9Z$c;aVhEVD/Z's'`7B:6 at nc%X
+%KsemV67[e>g2>qr93"idQ?WIQSm'EL10Yl*8iXK:-U3#*>Is/s]2+R[>NVA&](`Kn:J,O7mq\VMP0sa(ksIRX;iZ-C(KJAa9jJn/
+%1QoVN&1^IXc4GucaMTNuG[5jpqHFc;[3QcS1I6E3r?k7/i4Et$16To<`hH<Jj;;<,g']a0qq1KeF/?b-45JE9%'.ZMEoa8;R+EG@
+%L60!j6tVI(Qg&:s2k>CI"kI^kbh,7SeQQ4,`(MkBR'1hEbi[O6G6TkX(:4qJSF at 4@^PcTD-7c"!"X/L.:P)=P_HLX"dKWE##@cdP
+%5"VU3h,9+'?[g;L9Gmo5BbtW!_!g+t;rqKm#W>rCHnW\oigd0$?M\fgA8fq5$O4ot'*-p"b0mte.<_Vb[U=1G0#_PV"$;^]aJccl
+%;9kijje-abT2"WO[;ujrF2p$-$*Vhp3H-GO2_W3.W)O,M#KR'/(Y\Z+MVJa/7L)DGb0*5]Vn!O?1?Y%,S&PI%l7Zp_p4J1.k5/b_
+%LnF?LjHjM)lKGVL6(&8Q)HMInon2q-XWHcg-qjn2?ZI_A2N4CuF.(6[@/_p<3Q.U$C:<k'B?eK2bRTgf%tq)3V4ACpDPE^fHVCQg
+%gjtK/]HVAlT_e612+e^aijmXr>_jDV1#S8FD'<;U at 4X8h1+-TXHK6or2H2'#4i-oJ'b2kZocuNl46B(mMe!drm]I#18S<a%0_duQ
+%RLK`/MEG]:fi0iSWKNR.B-khUPt'%CrB;;P"U<,MQ0T.q]J="?A9`I=Zt/S^De9,W]m4XDgUaCEbr=8HN<V`/b.9cT:<T:^n57NF
+%\Fi_bh`s%S/,AOW`q3N8^ttBn5Mfp];lKq&=Su:2):C,r<KdQ[PX`4H^G!qYn&<;*Ysf9`l'2B`IOBDTm*H,3KN&R,_]Tm<8:A;R
+%L#qZd3kmOGTS36m;n](uW[;eR?.\-bRPrmG1p_6eg!:uS09\l39Uk++#jGXW<[^G'Q++7H95p`I402,#D/B"n3 at 5tQC/'DOs'YE7
+%oYZr\\>S37"Uj$q4]jSV]&1$6Uf*'5,gD>hp+HS&.Wa;0Z!W`Bm^u'-EmB>=U@@f=#-I/*ngjo/Til,HH,tB?a^h^jq6%NKVj]RM
+%r>Q<<V:,95$s7e7/W>$<K9W0ddh%<FF.Nk at K&rD5E`lPWo*5obpAf.1]q$?46KaOkQ>/;]c=(.)_cEGo(a'^c5_kBR7'\%t_T)HN
+%W++Qt@$-O+BUGPQj:!<b&.SFi^8bH8o\E^]5'mZ48/r2p^#8S.$?/Rf9B9&:k0+X<bK%.FkdJm'1X<6)OZKJ*d7U2aH(rK6^icN)
+%:Co[3G$0.S0I8A'cY/8>hmnhD^EOIK\,_:1M7OPFjoHe at kPXMZ,r698S(,dH9SQcj<YS\n>7t6qp.<@3].M\bZcgHDOj`MgnBdCW
+%D#ms'dj][1?d<2!P\*E,9-/'C7mNKVa%/pV[ZLp^iHgceQG8"q%;7mbnG3o)i*%1&OP&1/(p!Vs,SL5o3S;<(LT]g3\u]7an:AJ$
+%FABT1p5^8UG$Mn21)/5b>ANGpL+i4`e.,mEj$j8tjEm;E"pdtb%n+UQ-<#+n`72r4GVsu""/O7]D@)U/;&o.sB4<?EIs8N(I/Qgr
+%+tIn;%.`SE/_CN1mcBV`gJm7F)TMHDgJ>1l*7J%cHs`ke-5o'KeIiHoc3M2$63Rk at I/SZa4.l:kNbPrY+/2:+q3bWqj<*65qr$SV
+%96;hU-%BN(*N97`3KT\Pe^0SQoYp-`\iKSXK78',L%cKV7)h0A.n:M9f60S8?F&2"$6Y%U?+nd3hcn[hSO0LKDmPe"qIC.4aID3i
+%'9'ki44o2j(7rI[<t>5)d'6b9\G"Zcdu>El7NXD#DU/Q??jP3;#=4VfH9:#-p2]KeGBu\3;t2gLZ1!`pEaDp@?<a?#FM:jr3/&st
+%6GX%>"TB;^]Ld[f4dW8bNc#/=Mkch:\$.FpfR9`R-\qmSDFs>O=#fa$D05*F*g5WBo4OhS at 7r)bPj2L'K![U/*=!U3V+^e[6HG:>
+%q!mn?]X78N'+S8NS4c7r!\;<?OaV3(;_IaCO_Nn]`G&b=MYNO9QCj'[^V5LI)lqFuWJcj)i@*N\%oSXu.7aE&eE-FDTOn])h*DJe
+%,UJ7&"`%OF;_d?3TV&kG/%^c`C&T9.O)HLXI`+7ce(rJ*=^o^fs8)Fa"pe6a3m6O(-@:.<H8\e*'LR]i!19R;'#%.FDGJi%X5ks8
+%gE.=;lCj9D(<"=jRomNnP9Eq"J7p]F at rciMB)-8\mad;Tm0QF(JI[!ZNiFhL at 8H=<qQ)cPcHXI\FI!]h3SB4F>&KIf8P2dNXk,M!
+%R.tXc@"\aL4-cFJ8ie5K*0h5\Pg0'rbI:ad at VZHrC8j-'n=XK+$DYS1 at heESR=65'e'.BG:BPG(X&Cl$2DKD8q&[BrPA"5^jOOQq
+%[2OR[<$;RdY8SRXq9(_V6(Tpf"*gFss#trm83Fq#[1?V,q7TV.lm.`U%MAA%+=($2Uc'>1[Bm8)emhDiV%#mkK&^+,'>Hj-r(59?
+%Xp8k"ZnkH]m)^C:F,s[gda5BA?*>[lA1lg=NmdFmo8fcM?uY'1N.^I1#MuT/rUW at 8m@?^N9Ep,SDqn=XPamQm<_i5U@^#:f(XnB2
+%j-H0lFQCOh/u9h/aY>/`$ILiYUDuof38Febk`a- at T!FE+c1J/OBR40o#7$@!,T__Ygpu#i>KrW]KGLeNmIVE3)7VB6+f%pe^+$B+
+%=$JpVOlPF4T,8T]W:EZj\4k'CEG\9(n/9\k?I/FN.go)UH61l7ZHjF;E]2\(5f)BVAmaf at X<:<KBFcKGPYlS"B\7g5qPaG&+a6mo
+%m-)*$[Z=rp&eU;MDF1,Rg'>ZnkmqBBnCc,ZeD9]835V2A(,a_e^G>R-;>chce<=;n&oQe3PS5X$#kkpa);>HYr*Bb\k;:FdN'S)A
+%D<?=XEiH.egRl0gKQE\>RKE'50Vs#kB4Je`b#KXO2\2Ub*Ne43^$M<TSO#/f])?r(l48KXT:KJT=uf9SWHb"DNXIX"Ll$bk_E)tV
+%a[C4DTA5rQMb)2$,+fYHVAj3^EiUcc-8dJ0%E95P0.H-UJT`:`O?+VDZ#Nhhm80DA3e$g,XN2ZI,%*OF*oM("<30&7/f].O48HJ9
+%`B4$$p5<WV+^8f=@Fr.bD?`]'[i=^%ip4KS:RRfVKJa)c4,.05]OdXK"aeZb=gUOI<SRQ"*@UY]ii9%.)7`EICPRkLnORBr]?[l_
+%%)QcYPR+67bGfnp?,A_E`@!Ul8Un0BU[jh/Ms8T[Cm2';r%-_g7KXG\Rj=6Mj_1bt?I2!_q?CToeUSD*q\\J3$jer+S%FVa458Yr
+%;inl5KI)o\)c/1[ools*[SjZ5X+Aa6'pHUEO/(J(,R]<M^d01V58i\P3/N=t at .:$Jfo?'h`=U<5,LIfk at tN_1@"^Y$If1MEM3RER
+%=6J;7MEQ!-\N>4"qF_jK>,d1P^AT^=Q!((5C[OrH[&p["/Xak^@-A^m)i->M.(LUZ'\di2/\SoCY*e1<?7C11]R__eqb7ti$T?U&
+%:3IWP=Z1&m"=Ksd&ff_bfmYON8r30SiAK1Go87E*(2F\Qf!gS,$,)tFbLAsn,\nBNk*mP.ZUf\X(u/U0/\/$_<'.gD1=Le/T3"M\
+%&tsY0BDG[I\>Q2SQ.]\_H6D*EhB>p0W8%\Z;<M?hK]dSq^[`jFO at V4CeL2@AFc,M29eQ04*_<A&S,Q7^G&f"?o1+8;E+dHra^7.g
+%D9NrZ+3^lP4SXU&I&Vdk]`q1a8:JZ367ZAEJj$YI&e@:3f2ltE2YP3rio'SOm3&M!XF^8MOkr>=5c8lCVJqck^Kg6jGH"9)5Pc!s
+%1H&l0\.YL&_I]9;fNO]E@`U6VUF/D7+U=Sa4Akgfc]boUB at aJm^+f[)IIi)0FO!`Y64-Q6pdBu>M0u=O4Zc!O8uP1Yeu"i,`Osa_
+%R`eCF;PaD'Xif3_gD!`pBq9qhe?r,T5Oq[']Ri9ZJ%m<0B:hWgHCUrt-p&"gVRMX?T3o^JB'n4E at mp(^=/)1p0IKpV-#lek(t2H5
+%hbl/c><lGt:sN]hU244UGL2Qm_XFD)WTeFW=Njj.9iJ]Lml>l"<^+e#oL:5(2GR[kj;2:5M$3PcA@\-K#!<&_>JJC_0/g3[)W6Hj
+%$DBT@,8UjO]TK%8%=4'aH?f!16Gaph]H.C=2M"pW3g^D<'r7G=PuT[;;(jj`hX.B,ajMpJ]0>l;m0_8[KsAO93T`tBM%-c'AY[EX
+%QTiBfhir>b4(3Ea>\ei87fD?V4J:e/:&a+47b`fUj\7Vn8k$VSKf54q##Z at .e0FHjS!F`ga#RFA`4^jJA[7!5\Sa(P=Qh.]EM)1O
+%U\qAhiGTU"QF8h;jn#`UpK]+RgbU!`bi6b5gCgHJL5n%Tb>dHEm9Z88;dCWG2-"\^'1Y)`/;s8F+dMe+&-I4UKiOHk]2#qgDHJ%2
+%D;/XM)VW]OS=5pm+uahk9,iY%9>9VhXsT.*rCd6A,e\(%nLnDC^;9+>IOUdca/#4Lq5c8@$s0PnKURP\E(sFh?flaF#q*U6RdC'F
+%S(97DK]qsO]ecRjrpkIM&Sf""?k1&HkPHG=?/OEfa;+:*a0aC at Ke\01gaf!lrbVGaBPMF+U+Wd#1>GJZs8?/D;AU[Sd[!Ie0ke$7
+%WTIMOeWs-Sp8jfL(F:6Y^-G\*V':Ad!M4#HL=X'aHCY=Hk8jaB-psSU4BS[6%+'\t%]#5Foajbe>iho;9NNJT:^=5.OnY:Ss6*hO
+%[3FD"Je5ZbV$8bV)j9E_Ze74P+`ee/5 at -i<!Wi8TTa)bM;R0a.Yj6YX6j/<_H)*A^m?W6O'i'MbMdN5=hE,tNlP-GNW4_7EC%Cn3
+%b<I(ilM2a9-;3FPi],K)1&/_<PFL6]'tOY+B#$o[a9Thnbkq=l`T$d&'RZ"Gm8s<o"`ND2p"R>OrG+]IM7QJ!Y4?*2MqsrCFo_8W
+%&5#Y;dAO]s:e/[WjRkS_O$=&5o#=dc.K"e)dKXRfr2K`cZF(X$]i8_nD.U/%#C>o3_^kL2^WA'5V at I^jb at C*bpCpZ#&RZ=r1c4YM
+%\cEG'Os!99GN]K7;IGuYJ=G/7BW4!M%&_tu!)<+[f%s+6r2*_t&_'c]cc%XJqXoP_s%18kSX],.W,+1e_$St774+,RBMHC-"sW%4
+%k*^C%NHk\!FfmJ94/iB^3&PkNHm+eE)4PFkD,&.T,K7^g9$u=<o%RhEjfb9PVYM27%.5Reo]<=\4V&4RKZ[eq`*5!Zk%dVb@^7c;
+%B).*pL=f2Qn+hS)m'kD-Z9YbYA*#Kh\YQ0(TK[e+Hp<)c9?92=]qMXr#[>VAG7/>$qJeY\Cs$?oPlY2hF!90Y'd]Bsrsi_d$fEBm
+%p)MY=BL:#I at sOMbHEr%E4.63^S&0e!j$A<`Z3Ga#Hnq#*]@_Ne=JrZtc\U'Mg4-(IWgLhr5\TrT>#4G:9eeh>W$F1Z.G^bn2smTq
+%;Ym;%U1S,QL:bEuX&)GSAEo&QD#Hjg3B8jOARCJQNhlH%i[[CpXj(!]B?<8Y7[9_j)0\6OTFcb<;VT'9Ff!5p%<>m+2sDGjpW?NV
+%*^GUX4R:!%1Kcq-!EkIh''@$!lB!K9J79^FhUH"k6.%PiW$r#31[')tJ]B7^&\@6%,W$IRTRbt:#r"@R%jG<ELu=JG5VX at 1`?ZA_
+%qaMPl:%>jXQIE]ErL6F'NJ006Z&/`LQ+Lj^jg]f>WCk<&9\J.D7!%]+2a8kDL,_^Agk)2Yj:j\4V^Z95-&57A\'nH%g"N<G4j8*O
+%(.U':JbV]8r1<%E-p?;CH!tt/Pu\$7b.7M8]5]umUQ..^XM&lhg`s:U:srW3YOJrc<<"K=pLJs?826NF7/5.>L1Y=d^qTaMUX[aN
+%fTO<^HRWc=K,*_SVMn+_;$Xj%YXs$as7-?q)"Sscj9OoM;L$]FbJG['9lZGAFXsq*IVZ^G#*O4TrW-%NVL6b9R'52AUFA'b:E,#X
+%I.9KR.L2s%HceinWJ?Wer-ck*)VgS-]mG>GR!gNEK#`\RoZ].7\SU3+HHc;g``uoUQKY)kH$lStNaEpV5!'+n:5K.54g(e+%)RC4
+%/?.\TOUr9CFQTN3&?k=6^?HgF/d/G\F9K6*buS,Qb8boSgUBV[#'!uTE^uUJ at esVB/UADI4k.^*BY"/=&-am1WbF-j16oPT at 629\
+%]+[h3GbLe9O)MXOQ:e/c&rLd+P:(aa'gF#_VfG%Pn!D+1=ha&mc8bS#V<U_1mf?b<:%#2K1GYMgKBnLHOH9.u9PjoNEjC]Ns5_O:
+%@BQ3R2M\RD$15s3j^!TXdhnLfHQSGq)+=1#JMu?0UNl/5#nN('qIQRV3V&;.:"O5p5L1*%htl$jC(nBU,,6U8nY':K3HU0IGE^T0
+%(pN*0fcW;B>u7*kD#>p>9]m[>cQ/Ld-75Qa,u]5f9Zu6@^S&X at f>8^+*Jg'N^bbCH6b?>SM%'3SM>ILSL9^V<I4Iki2"&h=pK.K1
+%EXFZM:SR(n_JX.18Q]j*P$O5:*s#eF/`c]FitX$p]="O>`+Fg<3ZMC#R]K?u25MNgRVT's0^S#7<L35mNN+QGNK$&M(-k#:0L'US
+%8"WM5bR[*U`@XWp[@^`(LIkMCY:SBj%k:l\.u&15F8ksN4LdgU:qha2RpU!!.$[3X at ZBf`C%GX^F-9j-P7D-X at EI0UOia-6Ojakd
+%E8.;VkV`af3M6D_8KIn(:S--#(Q^(:82b[l??>c+S.rXmZ$`]WNT>9-dY!B`r_G.Y,5jGI6&FKLbEEWNUR%^sUc at I:hfNp:Ek'@t
+%K':B_S`%B_:>=Q9<1;]5</mI3mVMJiXafmCq4'!OnJi1SY6QlRU[V+umJ67[2d=!p^-TW at Ou:oZcc?AHT:Y4M3Me,m at rcLqQJ/ke
+%o#OR7KrWBTR3tqM!VIc\BZQo/JpSVG=*"tuai,F89%=^c0Y%IBTRd\'.cg%lc7-9G*Rf:UbW\;?iG/m\D]D7@/aY@'\>`WnF&nOP
+%G>3$9;FhLZqQQ^W1&[stdAG@"/YIN2fBFs7.sfP3c%2a<pQ5enIJYS+O3LW699hGPdDjFXhGT;2[0uQlS<FQup>D-q$s]87oT(.Q
+%YGju0-b')CB&"?bV$o/I9?=RF*.ei@>k3X3TO?(n"]$abh5H_'K'oV2)%bkoNI6cHp_>oeP'#K\pYN'a<FqnmP.\u`%Qrq5VN7Mc
+%`eJ+SBL7K@[-"?)LH7/P3Jm4uqp0[Kne.O08dGBibLJ'3/1#7?k0((ooHfNU(*i at 9d/o*\AL$(g)bfn"qn\RPkLo.YV[]11SDV?"
+%imCNi<'-68pL&.R[f#XfAC5fieFIdK^pK`k]UIV<`I;iW?1[`1DH"p;b+W?59lU["kX9^l_(>C0k;6N!F=LU5/#E2iO,)d<H- at Pc
+%O"=;(m75r'+3c!=c$?'bg?)tIq-#kRK>?#!E at 1qQ`,L"6#p\RD&g3H3r_aN&2:2LEM!$uLg&V4%,nJj;8'_KO*k(V*_5YRQ?I6T6
+%KULX2`6ZVl%jlZ&p@'/MqY3,IG*]n7+."sM4kI6X1h,@';"9IEs5DGTN]ia44q&*FBaY^eP;Gbp+(`1,#4muB+PD/dY<XnJj<%S.
+%)Juq?l8Q>GPk<W2'#Ue6iF9 at gE\JDqoj1SE7$'kr,WBaKC7V#tmJ2oMWUZbkc=u`pgW#g\Vner6D5STH3nIf.eeSu2Bhs%.GS?Mp
+%:Cc?K.OQqq0.82u!=BY*r"t:uVTI;8[+4R@=Qnm<kKI8K4U6jW\(O9M>"S5Sr at IS,%VC at gV>3W[HLsh]S_WJPdsW1a;BrI80l9.a
+%B:j4 at cBHAS2At)dJbC%YL3Z,>V5KdKF$o&qlMbU3_`>)n-%f0:ZkK':jd`5sU\.*?LuH<0>+N8(!>T\SkBP8Kb".cKeAnr at 6R%kC
+%rrVQab=n=VD8%dES=*Gn+_*M-^hT4*QILWIRd0u at DCI5k/CjaUf'H%rm8K$oMY)+$$hOud3q-D+_3HE5m;.SHr#BP>bWZmdqtf,/
+%=O(nO7fqVd,.?!,eDJRlS=EHNYUSZI"nOs(LSHOrbo=9`7?a4D)Wo"3H\N8*8+a%S,0]/5Uh3 at Ai[.[V@=e?C;K%t`mroCb6;(*+
+%d^:iRWhi#6=("=*.$c!qo4Bo^$\Y&rgJlk<NPS at eIArO4!Xn3WjN7YD1/1<9I$KW.2i[(X:;lFp<J"4.B6!+hP);.?Go0&dB9F'l
+%"oS at -P&:<t)GU+GXS,'1V>'KQB:F&Q$(aW!9bDWF31a5h4Oaq?^P"_+/B)]WF.<T-rfNH79AQhdf!U<`-0d^JQS$B,)s/d7adssF
+%2M1LXasCVMflW*E9'SQiRh]\DNkEKAG9+iSSFm#O,(ccnmZdN)Oa9C2^8>%J6MW=YHc[Z,PZ.60G#.(^2qUggDgc6ra^^aMCH7Z=
+%B$U?qU:6?s>NLdOG2#4:.!OSeP&X-SaA4`:*n)BIcU9@(Z#KD/->!+er<@$JJreV*.C7lSVmt_h7U,=Sij!+09lSH.LT4kAKLZXU
+%pTA"pghcI;GURJEHZg6S8ifgTg>BHOa[#>q%4.'s.RhG5=[q:8*3o4(.i8GsJBdnl;XU!I\b^ukN_2KG2aRFpP*TZ*C:A at 9Rtk;!
+%j9Ice[T.npK9YqQ.*_?,9cD6p9QEe"?!2;d1p)8!iqp7B+!F;6#8ADHM=.S"%\9FUD,+un\^.rD3q$Ts=@VJRVKb8br;b14*IWgq
+%nQ'oV<aNF[c115dD0V_W&lUh1;^fV7=`f-k%5lYE*43=Q_7TEdIl3[dDR%-q`dM"S$'6.Oq9>,C4 at YT=Dt];4c[b'XE=5]#QSG+K
+%b15cDP.t4GW4s67_5+iAjOB]gf)(eshSSN+ThEj6)bI%@-rJ"$8U+F8ICV^UO<Kb)R[:+m6Q\'Z2:W7-?^p=MM&uau8QVGnmeTL'
+%.F`Enm#b!d5#YBbZMa$PWaa7VK!]tg)\77"q<Ii3BpM'"2d5"lT=,l166jkIZ+-.aQ)')4OgD^`TXWhl7:D&oA`6DYO:l=b4^W52
+%K4*PRLNdbid,Ai"DH2,0"fj;"NjtY_2`,'P6N]jG,`Qlc$I;4784o=Q/<)"_-*R;F)_B@=J0pCpD2_>U#D3g'h7M:GB%AZHJZQuc
+%fh+F4aXBq at 8!4&_jgi=oP<klHGJVF*'Qj'FN[,BlYaSmrXj/.ed8cI`MXCCN^juWWZOl>(Nl7rFlfYQJB++_5dT,+$$DrC`7XrU@
+%Pa)#>(P44n!7A6397d7DWBCWg(4,%`J^r)'gZ14&^kU,t)o1N7"o6]H\kJO?CXY9u"\e)X1EBhT9J8iO2ZUPP%LjH0&2mU,Pin2R
+%rY4-o'>#i0/u^b\q&W#h)]G\neZhnq&jD"Cj7 at .-s03:'ls"X;/^'B`:Dlh@,=QFki*Xn=B&thUFn?SY9RKVdV-+kYeEK-"PBL`Y
+%_8;Gu,bSHIi6LG`c.:F6-[VQp":"C"Gc#H=MSQQYe[NN12XGk">nVS]L%U!I++SHA!Vh&AJl<<C0HLp?p?`6tV"D%<'Ts#ub"D$1
+%a]nF4n(l!BIDZ2rNl]X.6.jq$=dGtU?^W\J%>M5YEi5E5!\?XWgTRL.?2E5Hs/t/$I%.s\r-GIhjA=3ljpkJCFFiYZMjm=aU[q]O
+%N)Em-o1i"g&4OVu[:M)&HhHh^^_=khIO>;m%\3/mEi2I,-bjNj]Fk>:%<A[$+sfK<XKPMK'!r:5D-"`GaTFO>+2sPVKL)QrYX(/*
+%!F0&q*-HQ&L at PMHdHfCk;E?P;h<"K\6+]80ld)9X':T?\C"&c'gXZUoSpsL=GF'hgW?bZ9SH3,p:K-W8k"Po(F&i*BMTFbiNsi'@
+%Qd:cY_lCsW%l?tK89 at ItfiF,cJJ]2#T'<+dRqu:@b#!^'<E!WPJO^]!.:A5*g at Ttq@jb[I[_k6VPrn6CD97dNWGP[QeG$1[HhZ"l
+%L-&ZCcB$<31c<S]W6<Mqe3S/i3'+UEh_]c;0S\2YLWZ/QA$qC,,CnR=)50?2-bsM"B71o%JX'&;9Tr4p'WEPqK,64Yfr'Dqr?.Et
+%k+fV[7r;XuZ_`/Q9pF_9[:BAu.j^4sbqOmM&^I/cdKqhgq=/okSMjYeq4^o4;tZ_\IZc0"6Gck`UdXP7 at k*/mUg<Tr5;j/+O. at 7R
+%juh+gE[i7 at 45c;H(KZq"]<<Y<DR]VLZn%%epGD5SS^KDph5QCJm8K'*_'*HPmlg,mIEMDZH4\TOJ]Jqc-`&YRHqht at f5EKU=q&S/
+%k_IY'=J[QDi3QH]-a[0Ne0#&fI9Ud/G\'.FW&)Km?!*4HL]<enU$%gDimI-bB;t^PSeH5-[oF#a8^Mc]3WJ5PRZu=6@:WT7f_8dA
+%TZTdI8l</5"UdqA:7!E2]\nSd<!?"$#e`uXAKrbZd]s<p1Bl-gL[q92HQPlc2m&!Bf?seJ;ope--fBA[.TF]E-e%*T6HP&p?<H&b
+%-"Nbns+nnVMX>tFktp(OcC5j*F/b"oCt$3\kOe7T;g#G5HSht.MC7lR17^E=_</M at V!>0T:.$J&/rq,fqTe[mYi6]EQsA$S.\g)m
+%9msRi)3m%!Z`!b-3$jcqQctP@[j8uT%4:EM]=8YG/3'P"e>rqbKd1MMp4I6Dq<T7Xj"OA692.#II(VWWDH_kZ4f=.d%G/DW!<;s*
+%n13I*DZ/rJ^D:&;$/Zu:PmnY>9a3D7%GKT[o"T:\:HI:V=BU-4S:dk$?`W>P*i'\?`_'t+]Q++;0S at TJdD<S1 at NK!A<A\6NLN"6]
+%"!cW";0*YR*]Cd4Y)X<4-%D's$b;J^rKaXV8!Jt'4A4 at sm"g*b52t/'SeJ`K0c,157,I3UDAF9kiI&d=EbEL/VV:?@ceek/PNn_*
+%kk9S3_"=kD*lrDJ'K/4]JOfS>2Y[1YFOctSZlZgfab!3J:SIsF&'6b/-l\+/XBs9K!79R:R5s1Ud?d7n_#<T at h+$8HK3Ddp?.c,j
+%bhP5s^J&:[I's%1QYW$$r0$PekjAYHK at oITT4)6eUVS!7:'\-^AC!mkS5il4A`nAMaNLGM4Ys","68ak--6a&kJhYHA%0mP/5.H?
+%ORl-_b,bGh#rd*%?rH!8)$#`.10pn09V.01X):=hka at otBrUK6V!F6l2'kFp*daq,go:2\I(`(fO<!Yo%;p!OJ([$&8$/(K-$Toh
+%41UiGR,##gRQe4_NRrV3+7MD9*8]^LH(,GhINh^TdoIY;4U[%+2XGRVe.2';];8lWbGjZ2ISL0>&"6c8q<M2nQ9O?CIdd#MI9rHC
+%f*;*6''Y4L\0[Qf;)Ujd,1]1<s6J1=^MbuLaO at Xi,$gZ;Fg`cc;Kc:"%n#E*kc[a";_4,Y:D$kBL-^Al/jjS9<OBR3`8)Eu*!&O\
+%H#+oI3LrA[lIa$U5>Qo3Lp2rr;Ip^*/?Bftp5q8X'j<d4.e1rm7c%`?lm$M)k84gK&6K06^EmR`qW3Y'K87l[.Fqk\T!D39j;jj<
+%Qoa0\dJ\-])#R+>%.=5nr[>-?DD;kuJOf31ht\JcO;POO(;V9j?9QBZKIO&;/+\j%4u_onG>.8(5f=XH3sT8(+u`RpTCtrCBl\\K
+%_JnhdQL`_YVKps=cC!%QCN7'2UMYW5pi4s<3ljCGd:n=T\PW#7 at gE!Kmm$5ferLK#a<eJo1Zh-or#<#+OPX#MNod<W0R612!52-3
+%[t1%qoci at S6.Fn!E;k#m,9)YsSpI.s[)(M-eg1Lg8^O-kr)jl\_5J$><>^QBIpU_rjsiqeWA2A'E*\XCP<@@Y(0Hn6,[A^a;H>\D
+%-F+;_?-$e+Vo4Uj#,&*Ik]b5W&n-6Y-i(s[<i-+/)>2$.(5j7R=rBH3>rQMOI%:"eW*aVK/=TOCUS3kB^*N9]cubunip0/jq8IX:
+%Y^!s_b?B[5h$BS^BOX#.5;jlmUa,U\T\Rf,VYs,Ioi3CtHtGXaJf-khjA)4'(pos?S6IaaXtJ/nOWaWP6TJ&uHOTmI+uA2d[m`;N
+%)e6hna^m_al8<L;2Zl"o?@R:p0>H5KKBO`>S07CShO at P=U(be78L(Xjn;jHY99 at q`E<,oCVigm-+30]/q]@!Ve<>[DbpG7&<OP;I
+%,RD%^Q$*M7%kk=XkB46a.Y"'N6_=rXH-?k!UXY'K8J#iPEN1h0YgpImkblqSFC*%hU]5jO[12284gWiA606hYY]I3NHl./C\06c"
+%9R!M?F_nd_iPC5o'q"m[c!FS*0L7t1 at eHVZ<m<7Png1dE]mk`o>Cumt:#p\/;DbLTdTC1cm,jo$8of=&Q[Edo%8U7A#W,3tEfcWY
+%!RlD2lM7UO6_W_[4KY+$X[tEOY;`TbB1b?=oom[W_`I?KK4$`[s.uk,<L(cVFbPSO&%[,a/Xr at PX<R9#M7tcieVe6ek9a2:=k5X1
+%@;e?lGpM/>cCA8/&K:qtLB,X(Y_on_q43i9P2;K-Ti>S$@U#4(BKPR0GFMcp*)cCu9[3`b#q?YfWVf,H@:"Ba<dp85lC4X at 93ljJ
+%VTeG3;]:%!o(-`GZV?.GPkCRUTM+3XaWEV%)j9,sD5H*8dX[lcHaH9:K+;hjiO=*b,g05_Q*_8=;T4K4das40MCjXFbIP__[IH"2
+%a.'3\]_Krdr3SWa4)q<a65?=G'qZH/:Y;B7I$<oc?3aReLfLoQG8Ki!9Kag*N-DFU-1j@<3oia4pQV5_fc:nL'UWNW/(*-\Q\8)F
+%cM9MIjN0!s_$u/Zm7NR$!H-j>!KLkuV=I3X/;Z,Rhtk&WT`;Xfh:&#(aLQS9d/;lWSZ4%t1,VAU!7cXcr7OS(?9deLn[[gfj]?go
+%AG*LR)q:E?ZfP&Wn27PF"H.r*`5P3[,E[G_n$DUic1TiDCo&*kPj-ImgDoJOb0?Wn(g'jsn,timKU;\Y^69p<Ta:OV_[Q=>;fnk!
+%*#=&@`6hYTbR\_;\)?mM<@89Eqm7:OjKdPU]NWoN=?<'h^^oLEZi$pq55$pkY,O1SGf)k`pRU$@HC/fYbP:<EcPCO2\i$^+eOnI?
+%OJa1H8r4[K(1XaDjW9f+E1;@rWK>uQmorE,!6n$?esPbUr/l3Z.b'gV1s;]7E`5B"CpO_WgsJeE/o1PuWRV)2#q_U<3NWQZH*U(N
+%CG'+s#c$D/L3_"Rg#YubF"l=i[n4I"*Et'k;rBqj3?$j-b<@@0X.9fB#"=>7cc#7U4HenlNlU$LiH_]5?B2mUo$k=F=GR<t-cP57
+%->0TdHk*0VPcGV].?'3T-M1&VHZi-LB%r'1hoU^9od/4_S2e-f$&uKE8OsaCp')tdk>`ERk/KQV4^bVI3n_XiST,^6PWLU582!6C
+%VI7W9jHF[79efKL#'hhG;aB5,km3MM&?_;7=Dge4O'X`HL#6W[GL=m?_j4dbn%7u/k,H)cF)q=2p)0*#G:94?'A,^BpJ5f(-%jgI
+%Us,ES\nRRr2_D48E%E$)8JGB"\@%l5HcM_m?d\>:N+V?G)2-**Q!^-bN-.Ln<77mlB7MH4#kY+pZFJH?,IB?:jmBYZE6V#CnK)as
+%%[!Y8[W&?[d6Yc&+3#]Z[JQ[\^4$M<[$2-+S?cUpqhmaR3=18,\_.en`*BY(NlKVonc\F"7!Y,F_s-qo<7IXPPcS3iOY=a5"W3.C
+%*o+Gk5u'>Ns#-"#5dfBq2,fUrVh^<6L/bN>7Ga&!Ve]##VM5!)_'^`"'(D=TIg;kq]4#sNF549glW!\A5H-[:a-?DB0u9D47&FeH
+%lNIi"-)^Y^^IS#(O!rC0aLSUW9fh)W(+%Qm\=)I:9uD_.HC%$8aiVAgmYL@`h966XTrg!!34jK@>'ogDU=>NjOq<gYD)Rm]_U!M\
+%Z$WZ%%h0Q=HHn1Q3p?$b..Wk;+shu=)5`)O7.kRZHXEst7;9p5aUnr_$2@[CWK(^?L.$&[DMO\s[Fd&E&]7<aI$^1X:%")IlhS^m
+%!@."O5P_1_i`u67FW(p[;Q+t]D+8n+IIt-,J'o:qLmtl5j:f1mBXssM9"Yj$p!0J5],jCYf6d!H5_[C>b,9"k2V`>2Frk>VllLEC
+%>rIm>ngpZ5\9Qbg6e^G>DQZ$t\]dGo'HAO1n%"N==/P0PEq?9s<S!=s`(A at d.1u1"%1d\q_t4LOVQfalEb69(Xk+*:ESM2qQ9p!C
+%7kDKTe%#j@[gX<KZS8UD(q0#;V4i(H7/EgD29-#\j-L.s7=MS%fUC@'B0#-ii3oO#\Iu;K$Da&?S)9A[Q.3QqE)/?:6'LC%9V"41
+%+pW7u$_N%$NmU0Ll[XV>V>/MgeVJ^BmpBIs[=!Ve4P>&@L_a06-SB\PJGeDGI-:@L-SZ7?S^-Hq?4SA)qP&O3Gnqhgo(H%@f4/*"
+%5mL)t-eDFtTQNo@@7qS#!gDn([a+:*HXe)Q)-55Cbu;e5bK&FU_3<g`9PhbFBVjc<Ulnti&lI5cG>,H'YL^dK3Aft;Yc%=>JbuW*
+%E8l%>,8g2l6-h(9Z,C9%QK.Y#m3Z$>\P[AZAZ0shG"hIi>5>G6CIjC"OuR6]/tpggM+">CZH3L4VV-[ECI5kkn7g@!=<G>Q62l"0
+%H,)_UVHHNr4H`<HC`qRlCNtDZK,&T,OZ*qqB<`RNhUq_0MUP?-hSWK>e<R#HdADM,0LWXl3m@,74MH_:iJ6\V"foq.(%8SS1EXV^
+%DaRaVXmSlVZl)aN$s(ugmt(ps8_LqZe8RD(?GpH-(^ldhXXXFmXd\t<!)5)o5T<9-D%As.Q8/J7q-M++C']R)31cVQjnjZ,\K("\
+%6Y4l7BAp(lGg-,3GbPeQR6pi3UOt>C%c$N[B!?7.PB\&H^Y=J$hRa]!-FBTV/T3CUhJ"1j+=NrmZ]O]Z.A_re)EmgL`Hj;=<O/:C
+%4DdHJ4RaA!s'7'C"pa3Si^`b)O(GH2H.$3>(i*6PX35HV>pp54B7LV>ptdSEkPYl2Vr`FUQ((&]2f;J8%JhY7<ML23YR"hZ[!(m'
+%>\aEL#VKn)^IaL1MV(*JP3q)>,pO^A;3?P,;]er(GK(h9535,rmB%r*5$jgDlSU94n#74&9-KhF9eS/uY6`.6.P3+KC<k"B_5kVa
+%DbnYKhV6i()9,rC2S2LS/2/qhYhQs_aUOkg<J?^pE-)./;Jt[8iXT":Y.V?1^HBEZ1F9oU"?T0e5PeRjA]tj[JC56$K-S?^&n`i0
+%dFZ!LiFFpT4c.I$`UcXbQOpb6 at m,KXgG5c*;pT\BGg.bN)YtjZKn]6'H8d-C95G]^I"epL2"+N,^\j7ufDKt^$kEBMgK*f6(n&WU
+%5j at qCbSj,'CHm`PpqXF(+7rL"+sbJ;gMHZRWTWjMo+EJOUb4[Oi. at F=&lBX&\0i$P35;g!7oX3tIGF. at el(>N(ZbMEW%pBJ\aX^U
+%XBBLm%i3l at m.1fc@!/f\f^QM9N2HM!&qj+BHST@/1V9(K-=s"`+E@^Dp"pf-n_#_ppmDmU/'3k/p<__kT$!H/N62ZW!]bl-[[ZRu
+%ld1OR*;!0OEQa_mb,NT[C7=>-*c0pG6XK#W[%$ZfK/:fD63Op-8#c2;XCqfXhcr.[7GDYa-Ru#n'e8G=!s\M>EMoEfl\^ohc!oW9
+%iN+CI'Q$Vq9t=#+Jm)mmh73BqY4qKj+BgGU5Y[JuqYW5uNf.?gq'O57;<G$:/Y(1rg?m,Oe(O>Ff.3[h1Hj],QjgA*f&^sNMEe8X
+%,+8_4"RJ%LV_!f=p;g.o=KMT3T1]0[#4ht(&Q62(nuA[3!mac3>d%8;jr3Z/nVQPjglAr]Y$^on?"?G*k&_8IP'Hkhl&p6fdArU.
+%P2*#]R%O9&ajY60IoZrP!DZ=jY4_cs##1>cQ.:3O<$#qrq;j)geG5Jo;8rlVh"5`40((l0??:VX_FnFg6X;>9kJmoG\,2r'4\.D$
+%o6tdG_9(UCXgsnhZW[$o3)1NEnkbBpW!7W)4"!^uq@;`#mWfb'.1&A-L6RLPhepr3_\Qp&gY(gE4eGSVC(r(M">l/%7j[8f4grkm
+%S(;CJQ5lm/s0fWFBMl&p-R8N<Wqa[&"\;lsCIG at _d3-Um91ArW;b"C*ho!6G`iP\Mp>GW!<8r("mV/[o-;H+fiuYM7#>^F(?;AYl
+%pMB$ep\esj;PH)Gj^U5oh'!9/ooc?gW at mK>$,lJZmA_IGXGeidja;"<Y.U at G[UO;!=6;nsZfcV.&"ZIm2X<i5[;?8/^S&N3d2)`'
+%7Q04++7<\9>EFuZ^G+[3Ft!c5/q#G/PT8#0s)@RH+`!m1`<mVIY0oYLDuu2PK/2MDr"\TM>E:6"WU4'5_ at 98rFDL.e$ZK?1?'Jol
+%71LYOjYYSeVc/a]?KXpH4L$s"J7/8p*[?FoLO>bESj[lB]8 at ODeLNs[V<tWIT=k at DU_K!LIl9_ncg8<>Xtb%=Nf192/b:a*SWgX<
+%D<?2b8$pF^F=:K.:pkcWUPm[R4YtS%@SW)W at 1;SAW$R7l:]3Z0k+)E`(0:ngW%8u.JsO&U&t"4\O'UJi7lfc1^qp^-$3H\UZh)6.
+%GJ-m!&G]Vh]3>)&\SBsR\9Mr7c7:2`_ at ON+8om#OFsFeiRVB8!raV-Yq[Pi]#c*4&JZrUW:cX*nS#d0WV)*Qs+5(YCmpq5+T2RIq
+%I`2IH at EbH,dn=j<"uJF,'8pA#NMq00D0ZA":k7jYoXYAiUpK^LGul=O,b?YGDP+__hE7d/;c$AJ[Jo;miG3E(ir#9)/((4&g6aVe
+%RioR;nW_aH!oom$8DQ=&XGP)X28b++08V>jYa_QPl_i`6U&V>Cr0A<;%4,/,d=sMk9i.sE9?,WtFG$q%p]Gef5^e+D`OI]_Sk4uc
+%RlleP0I!4EpdD*lEO;D0:l/DPfYN]pl$0BpAPZc`lT:ARjZpe\%4HBQZ)7e?D)$bIL/P8GD'oG0=*]9o4pUTHY+.b;N3mV at Y^Up0
+%Pbs5b<H:=93Y(fDqMi/.eGj"sAaEIB+"*5+`&YGTh4uV_BbYnCF=EM$E:.4*fGF"CVc%Zs<_'JELM*0DAGb/,9<"h&7)Ug5I?P&)
+%r7S[CR4u%U3cYj;@D85W:6L;'T&IT-*F96q3=)]*f>eP_7?(Fn6_+>nr2>g]L at rl%/nL"nIjXCC4?EG<TPk/E_-ude=8&0+^ALlT
+%E7h3M22V7ll0qNI\@f*E1NNG#668&r`f=#:bb'4RTP9eG\m,!C;l2iOh"sPPJ%*L)H+!o<,8a%<h-S6`B&BR$XMA?Rh)B?)(@0TC
+%,*@N-Y^+('m&\;\#1JC>.;]Qb5,qjCon#r17"GN0ru>"M,Pff*>k/t3Y-1DV!WF0mECt)tpL\%f3.AM_s0;*#p61h(Ajmau+7:e5
+%+O at 7q=-8#>.2Ppk2oVj5f,^8Ib at XEQKm]cZ+iRc._CgT4K-F=m;p2Ql[?%;a<t,0JYG&Y_f3u^@qDNE^o4l_nrL"$%*4cu0CjDKF
+%kL:YjNlCn?%XFfI`k[*:AtbMia_N9NV._[<X88r/jB at S9FuV8c&rVDXZ2`rcq%mkc?$8;jBr8;eP&Gkp9(2ll"Q+:BAHFZch#_H0
+%C;u at Y9C@WbCmQ&+^u@/?ps,*>m/Q7_jE2eg]EjG*^N9,],F=nc'Gs>1oe#d[=nu2dTjGSfCps7T53rE?m*NtrApY0FFHomUj$P##
+%feU7Wc]kbGDOt)>J&-)T4?Lrg*2%r`mL(*aTB73o[W>q?_q=-QUfZiH9F.jUq*(G#f'NS.diQd#E*I)ZgsE-spA at W=P-9ZTaif*O
+%PHf&qj at lHU4B3H[9`lj[:ehB.":M0D#;hLs\4JVC^#Dd02.+Fr=JGBQ(Qt?0ls/(L-WlPi82Am*b<N$!PKX).<dN8'T at OY6*VQn3
+%Q)GFh4#a0TKW!*P_g-^S'Sdo!J4F9-HkL<R)5cP9`NZK"FY<AbXR-<f-21X[Lf7_]B(gpf/ONO/dG*kF5;Xa^J0B-eO/PZh9^a at L
+%'5a7<S/8g]Z%2(!9SCL5*I%A]O5F1eZ3Uim%u/0SBcnP[>$j`tUq!o$BPc.=2[ebnmQHD at j1lt]Ok2W?3DRg*_P><qS%BVmmQ[ep
+%5`\ml0AFeqDWIJ8C4UeQ"M1mPdMPfnV'c8,MO`takP-+I2oZhm/:C?K9,(a_Qbe;iWpV)RE- at 2bKD@Ce=lh>5)hEpgo!n9%?_Jb&
+%(4-'o%2T[5'3FL`\f8c+##SDccV:Wjrq1naab:Jl&W4>].;&!gjT9/3GR&Zh7.K`Nr>pK:UaS1n9.]f1bI;S&!0h6,f4kRb:s:*>
+%a*Msq3K&aJoIO<eA'&`cLnggSpa/%MR=ftn0K*,F",N3Sa`Iqd'q`6bWGgj$WtQq.;PF;p(Sn]V%JHXg]]Y at n"6'baIDFp<S:`m@
+%iQ2\DW]"h!9J5X'N6WmT#Y\msdm.$-Y>&@^bGZEOP!&neo)[+PD.Y/somI;hla:"_MmZ"BITp3bME!cNL2[oFF1ftFoeU%8jM!h%
+%D2Z-]M?'dRhZ at mL]ATPa^KCjhUbdcb=LfMMA+jeYRji8c!^>)sKqrOEOVVMc$PWQ6DS4 at t=)E]2g`o=QAJ8e4%C%u[k*f=]dRZ;n
+%gVpu3`D:KFCm)-pL^#:rnu<1\I"g6oK3iYje4=r'`U@;4o-E<C6uuW]@7KDY%>9/>ZlN8hY8Ib<NkQo.<K;GCoCJ#jR`\)['q!;%
+%QOpk9Kml)//Hm(r2TeIb:-YE!<pNF.1s9kC=u7lohkZC>/U8W!hs0TrS#O5Shpc9]]/)L9^I8NrT6ZTP%Ih=/V"'LFnP42rK&sOR
+%?,rP+eN$L&G+(M"WK;^VOBBp(eosZ4$Z"F6kH^U_6s?bq^G'0g0_*h,/$oD>p9RYc67;H\C"F\Wf:)Q1jP:+I9QG5i>AbO]1aa6K
+%DbO*+Nn$FI%@]$pDP[??ku&0-h3hV5\TB4Lf]a/5[t>dfgPOWhC3RW'@GF9/*5WD'B9(KJ,oUp=*O^A8-=\2F8oGu+bH>5Lo/V*_
+%WC-7%!q;h[SA1S^MM5Tdac.d\.J:PfRGgJslV>fjk=>H-dVX9,JJ^8Q7$hKYj?&f9C,uci6$h=tHKQs!5)BYX>EB+;;'j>)q`[UP
+%M4qccfC[T;bAGk5o'+8mBRH,-ZjWVs5nAjLeNP:*?="Ppn0^ILOgF?KXQpqWEsFq;#Gq:!RXJ6*HgjPNe_qVuqW=;qL=sn"r=VH"
+%PjKMlUJI#"8L6-;fG6F'_8>dr+*n<<Y3*V^<*S:sKFg8KEbS$OJ^&U'VtQ]S`>SmbfMii9iR_p![:2XgHA$RHh+D=ql1l<_VV:J.
+%;?EQe,iJnX=M+3]F.8!M<i-gQUio`pWWsIDU`?M[(l7Lj_J?;JXgT'FDrhifdr6t%"6s<n/oq9m4R`)MhT7h*gpe1OXk&%1YIf1d
+%$Fh&OA#cY,&(5$$H?0Fq>UC(GQTl)9Kc=0Xl#YU-Y2k6D1%N6jEt:EiGGai>F>L!lV<UaC**e7tJ)p</FRK^V^TW at Q#@_sc'ZNP<
+%KXr;eSZrm?GKp\jg#F$Nj$q@]h=IK<Yk*0^1Qlafd4f7Ma9n0&UVgk0<ZH_DPF$_HF,_]JaYmHX5O[O;?s9/pKB5lOc`k5P7mZ1Y
+%R.=7>1PX?I--2G)e$$d;Y[,cOpQo%UWrUCmq)2HXj^jYpk^Mg\G2f]r8BE?V<6$-enOfP"fD at 6+nm_#LjFtF?jba&c7.GJIGRYUW
+%CIqgMGFn!Hfac/SCL'hcI7,n^8I=)'%MLI0U^62IkO#N%]?9TgR5]ZZ.hDhj!`j.p)4+`!AB6K,CqgZ;!u0%eZCslq#61cCpJ/be
+%H_n;3\%(=BrcKqc=WdLDJp\a<K,7:4i\]5k;SA8V]b0`licO2eIXY5d"irl_Os2$5Nl6B//1FC&nf1^W[A^>TD1)"E$kB42Tk70N
+%9W.C at 3/Uq7d;]Y?PHM]aQalgGFm\;b)Of/-J"(&"hNNc/.o/CYkOiY(61fD`=]Y5i;gRA$dN/1O#Cd"WN@?`G]P9t7d>Z)+(`%99
+%c/j#(*F>9$2lg"amYmhq at s^9*X)20H[5M2j:/)c(QVh9)%C(PD5nZl^U3LZl3!W;$C>0LrDG-Gbj&fUm#?X>B6r*AWK(C(1fJ`YZ
+%pG&21<4]h91:RU9<uiY(pPZT$M91%V3&$/jXCr:5YN$nY7G0H,4_87+'Q.gJ`:1id#?19&9:df^0CkdoVO`-e[TW[A6HbA at anMI0
+%"Qae1(X!JKE+tWOcCAaP#O8*IN\spiN9&84ct["+D(5]Y"T_-0VS$Ub/!T at M#ZB,lE6\>`JiAae at gAmB53RM[AiDT at DZorZ"tO1i
+%m1gp!s4ib>juHRGA,_^!oNEg4,eE\T+JQ<fr%[k5?`1-F4_8+[B6):"lTH3g<]U4[<!%9CX.m?K4P<qoOE8hb61Fp00KAXknr<4p
+%#Mt,=iEi?Mbj57#@WlW49o!I04&;Q1))hf,R,h at QXdpg04')gfY7ugNV.iGn[+AZ;Gu)*'mhbasN!2G(A=^WcT*H0rLc#\O#uA;l
+%2torKC3 at eT-`/gkKb%g@?'3c/V*M*9\ad5[c3V"Yg**LM-i+K+6_4R#e^cJ>M>IITh9:CaC,ff^r%[f<hUK#e69AD9g/sRLiipV]
+%)o[M(>Rq$2EF[[MbVb+K at VE77MSCJJ-We:=%e<?s,KDb9%u$"-TBG'[NKRr&0UIG=0f_6Ba>DE^&!7iIMp0:J#8K#B_G*6 at n/[B]
+%jsg1N+";\lj,RAq66g7%/X1"X=9'o4mMmIWV77I\'0d'c^FSEgRL%?&BeO8ilA/9<G9-6'ni1Pg)fHeM_.Xr/F1L(\HI!=u#>'"D
+%=M]X<%+^-U`D4FfWhLY$4V_Z0b*kTeXcr6G09*0Xq_S%>4d*s89+iQtZ4K5A0>RcL"$=NH@%,A*p/##uY&q)hecukJBsk*k&oYZr
+%qL/$PS8gG>>-(9`Vic:PXHCb=b5 at 3HalPGSc4SP&5r^bM0U)Y#(gR=&chX!sEsg2#Ha/^=;tF>k)]ti7Ms>m-a4EK+.mW)<SOEY=
+%9Gp'/<qp:2_T,h7"_@,TZIN;pNgTYu;>@IYR7[NtoU>X++(MF4,^*bjZZAnKS:/Y7/.MiFQ,&V0c$\jSp::@LP;<i[#Ka_cQ!Em+
+%>%q/=:M^&i2m'6qZ^k"\g2C5ak=j:3^=,A+84,pL?aEcfJINNhM\l]jSAg#T9#XA]lH`3BRK</OLe#I3R0`np>iV;e^O'Fkg$#HY
+%$ARNOMN9_PMGCHi=!Z-=2?l*Ndjhs%[jc]0KUPpm;@4G\8uLdKC#GIF=RSZ-"9CP(q&[)1mi3sq%kJ6-_I)(m*dtK0L-A=<Lmh_0
+%TWBUVOsT?.=CnPo(]r4nJ[V)3<=tQYlnR/;WQb<Q*q[/q`gsHo[6'*"c'=0"!P,,mSM^ktOo5e.#YEH3>?pTg*li/HI<fud="#P7
+%Bi\/RJq!t;]DA+L;I0 at SLc*"<Qil8;BXiW!1WXrVa&[+.'D<K2I6QG*bbY.i"2k0JJh7U]NnHpm'QmjST6okk:GB'm<UGh0>igG?
+%VQa.S;*ie8,ng=ej at UVD2XJoE%UR;(7ZbFeJI9q*0oqOMEWLk-gN]^^Gh;&01*5-*+5=(KU$pY#f<asL2k!SE&52:FNZ'>R<4EEG
+%hIlC42H8!mVM,o;Od(K=S5=5Xn)Q&ISl*%//JB\+LL)p8]Q1;CTKlQEX-9'e/SjO&->-.aVg-)&S"Jne+OMIbk2^=hQghBqq7UFZ
+%>DAFL6u=1 at Cm,$dU,$<;g<"cEA0pJmcFF9oUKP;c/RZZ!F55q38T$D%]6;3M:>"&?cA0ZL:0=bWS]l7N$.FNl*Hf-TQ'[P#C9 at HW
+%.:,6PDgG_]S1Sa9V+1190ZtgQ;X<Wc#=<8b5MqG&Du at JAS2ETcWBsQ';p\OYlqcPM^0N\Cn$W[G@'!0&<F`I#<dR%m,Iu,%hEL%R
+%8cP&-3.'*t9N at H1q2rC@$(V9,*84p`)!tD,(;;52jsp%Lfi?G=hl$/_?_H?A;\af8Fo`V)9L#!dJ&IL8k(D+DO^j*2K9GpP2"6=N
+%gc,r=SA.j at 3QRL$i5[P4;oc at 0kba3bVbl0roRUW?_2(PQ2]\O^pOde[C!&<1 at rH;oZ+h"H$8+E_+)T7-at]>Wl636`%)mel;3/+o
+%CqOf`2!5k!DgO*PC^&46bK!g&PRM:2QN"6W\MRgO.- at B@m%[u+7**%l8X.e'rTq9]=4^Wb.!$u\*Olr*gOYAK\ZJ"@pSu$9>d0qV
+%:l%7)N(FF*3p0u:F.%X;"DXPBq_f&Xp_]Xg)^Y2)acOl^b[$D(mYY<eYd`nG?m%@"Q,3IB+j3*P=c"M4qUc$^Q*sWHW:*NKZ1b_,
+%AKAl2=/ln"ZqUH=okc$`LF-&PcaFWF<B41Y=5'HZEE5iK\Zu%h`\Q[5I+\M06P"A'+,+E+ne:gU?WMD)7TRhZGJ<IF*!RH&[)\]`
+%1#(FY<R1Oh>u3$&+m)iJD2d(93G=m(e[;Vf7])duP!NZZ;Q>'+S8)<\^,Igu"WMo#H,Hd?:\2;LX=u2Zmbeosnh"d8?=T/Q24D3l
+%HT at m;o at 6q(;,<dWrq;nd9Z6Si,agmB3U9Wu.^0H]9cMj/$Ic1V^:fZ!\WJHKk`bM!+Bp:IkPJ(HfGsZcX4Ql)ZNOsjTn*I-6c\Cb
+%0^kP,RKPu4efu9";'K\YB,^,95;h&p>J8gfV7s>@2^UWl+Qf2Ta6,GJDn#\4N:a.E'5"4mcgA8/ak31_c!PtALQHJNjOuin35P%$
+%>_*A7?fmTmK8`Ob(7]tk+7h8L^`m,?,IjA!r&`lr?3uAA#l6RQq7*M:59fK+cVa/g:nl^*g]K at 1AT.RNF];"Z.13i#jZjrA&B#Vd
+%^(s<'!LiQgOuj:6[Bt0"5"a=AP2kgtfJQ/LfDSh&hrL%+0%;>rETYn$!r#(qJq&"h4N97?*dD2g[6KX\JKGU5_`&;D*prf-WOaO3
+%fB"+c)uu+;['C$`Y(>KPL at TS-mmc-a_-r%PQs')\*rC`=c:0PXV3o9a`SS`..<b'Gj>`sNI4a&R"6?#+j*+Zk,j1U\DA>)`2%P57
+%4>1MTLTaGik:%ARU3DIX5:tp/iF2Eo?308n%A&51hWa+:'*0qW;^!+I9HM\!SC[*"<$1#;b`/-MI9q)]EXU5&3]D/"6LM$hM!=G9
+%Jlbtk648o4neXaS8h+#s-)V0E9Pd"6B6sC1JDQ"5O;Psl?.(^(g$QEb/\<;V4W1Y'?Lt.5os/8E8WVuSht<PgSF'eOh$G=4mSpEo
+%5<8s=73tA+EG0[,:N#MW`AI^UoT/Q+ke+DJ at tEZSXWOO$o8p!Jn at kZV]+b!+T?l,@%W(:)6l\2(40-;ah/!8_c[9Ps;EO]Eg[Zb<
+%m9o!t.Z!7cR^U#OFhS`-gM2)=\Smj7-'s'HKLp>Go$Ti=kcR^EOtkD*!%uoADRZ]Ng,W)F>.M8+c#^NFOmY`E1-oLT.c'apF8J[H
+%&qT<2OOM%o.YUj?;-OC.%I(c:7,FaHGRK[,kf=.EnBQ*sfQrB5A]E5M]8)iJ3O8>?f-i^'Z*4\2`BicA3&[EdkUZr=Er]9^2.!74
+%4no0JbEURuf/b):==.nU&""V!/;c1WJiAS:5`3ZW3Z+*Up<6Pd=WN=Je-J0n?,*u9f_1"ui-!-I3?PF%4U8!D2CXiN@[opK3M.c<
+%lJl>=-K3g#i"Di%8LJ!9Q84U`f$kB;gWNKa&`+mlgXo5&Wu)G'$NUAke`Ue1.RfGMNO]:rVS'9;9X[:=;U8G_9(^3rISsJ<<,(]8
+%CSJ$jb-C8N?7\!_2t9G-fsde(=]L^1lbU:lYF<'e.p\K0[U60MD^/_b"NIq3dW:%iFn:b7'pQtW,h!]1-5YW<:/lWs+cWq<:lhAc
+%"WK^tCEc(UHI'te;mr<8phVRsr4S7`*b6!F0nJ7Y02!1O.c?N[ei_HrI^pjue>Iab5h#@ubON[N]+Z-Za]9QOj.DkT+j]=iqRPZ`
+%)>qROefCR,T%C&0SpF_pn'=;lpoV+5aHuQniQfbsRu8aDrh::%Ula&g`1?OH^,HGE`9,QHWCN'gGJqdN+bGG<2X'NR4;uIme7FFI
+%R#NZ9^6eMS]^OlU'Ul+Q:+>NX2bF5r/c/0n7aGd>R^+;KBOCiEIjOlSH`er^3;/W0aoAG1N(S'h[?9hp$,?H6VRguu!'8p'=j*Ob
+%A=%IT5YWan\ouj#]ECNOUd6:k\*V<Z+d[2]QBJZj.uS+2^D)GA1rVNUG`6*td1>d2RdTl?VKm+%a1ea_ZR]=F7Ecfo/5d2/bhn$U
+%#h/"OZ&96.L;b:9j6Y^F%7@/]h^/h1^lq+bL=_r_s'Y__<2"DS`2W<j<$GP3O8,9s/TV>AhZA9c,=qj&d8CN9ioZ<4oj&3$)@8>4
+%0'qY>^oV2#IA45Kb at CQnZmiu)SshIJ]N8Y4,h5!0i*bB..__R8?RI>KagF)>19[N%Mn\mL!e1GpF1N.]C6dhi8n3fA^kIcf,hdU<
+%@=iSDkn<?S)jeHFS/c:&>`\GLZ#K<p%LDK)n.:E6"Y/jS":S=/7M;"NPjQ,bEZ=V4H$iBaRrePiRK1q))+=$-87P^lhT3tZQII[d
+%l1o!4KQV4!54#4?Jlf8F`\K240980AOK2XrJk>*8+-NSF.UsS*-4T+4"H8L\qeAc_gtti^Rln?eI8WY(9BC0V[m)L2AQ"DJ!^cJN
+%7KZ;>4`NR9-O4C(JIjfuM%L<C[nlLRE0jollS"gJ7PJdDM?Sa3F/NZQogb5ncud!Wc!ks9UdYPIc+'FXi9Vf#!DLCen"$gY at S9tG
+%8+>E%F*M,+-fdubk+/L("ZNETP&s9WfDI-\:am!SinbR.bP*o'j.V(;kC%7Qp?+k"k-b6F%;,bq?RiPn5,E-n?93AVQ;]OiI6n>W
+%KCI+8)gV4#3;Z$lNni+/^NGltpP6a)A!i1kiV7l+']kiaRXOaGNs*h(*U5*ZcN_lFZ!N(R,48Mk(@'$<$0]<Zl:-sja7 at aJl)Lk,
+%-%8A%.`lZjVqG^UDn[:lIF/lpgU(k>d7lg=9Td83'jF:YVGK9/dro_MpSBO3&gd38"dhOZ$4MPK@\Dmn.=Mdo>L^)c^5i_<?=ss`
+%XnFZi72s=hd"3[h3k<>2pkG=G$^!A1aQnrg.Akok:c_H40sR.caZ6DtYi/pOSa3pcB?A%d!h503!q\%A)@_<,WA_9Qi5\R:3#=uO
+%oa[2PeoKOHk3u;ehd[9phPd0NjMV,!q<V$"oeOaCU?dc>\_;>=M.&DF>gW%(5!IFgb,nYd50/0kNSfsSEV-^[+-Y2#eJCeE`1[%l
+%TBG(44>?+V,/4qH8BPp4*D)dAQ?7M)COAs=U$H[C4m6#m4]<"_l3m[I;XeNi_l&-JlU.uKl?F6IbH.gF/UV$55md%ie[@T`Npr8!
+%3qooNM;%TS#V\l"leR3S8XR'nl.d?73UN)m%Na[AUgd+"9Z1R2KufK?agd[7oPI)W#?Oo/:J,Dp.e6enTB9t(mA5Kp#_`,Dgg]XL
+%:a4FAVDLtmWR(lLE>&:*qaoF5St:\m/Z10Crn)l,4-)G-"QtpKEtqbElMR)G+A(=JG%t5_#k5q8f+u'R4POI#^:\qW)$,PQ,uWUO
+%]=l5cQ$$(r,&<(*8jWF4;rN/joFY6*V-cVrNBB5Vg:cEZDQZ:BE7L8"Zp3-7nK3@&?N&,?\$Fkn2\jg>[K)iXC.q1=r>6a at YT/^i
+%L#2'FKPnWf!N8jQ$)lZ=eMnm%n&IZ_q%I2Sd0df;msF2(-a;a;PC"0+2I78E1BNS_N`,;N$603pk<9_=L`7e?*'LKVH'st&c8 at o5
+%o7XX!5efA%(*aYE-ipW=9bOi=J`4K+U at WnflHc9Sge_5S^Du16 at dG&?F5071/$o3_-A/X2KUn,dpINkVB+j_L$%sm5hIOE+dTt9B
+%A\*N.7ioh)oIEkfYQD?+ at oMc2_)QQ^KXra=Tnr0ujRU\2XE'L<s"(W3XOHZ00MAB/?!g*7=9?M5i at Scr--sosc55i,%tN\8gh"5_
+%&Z:fV`5n&nWEOp(bCR$^(S>pi&G(nEa,clJ.kK475B[41[.sugj-3X#4uaYP\loJl(3H!P&a18Y^*D@!`P*efK+X,r9al$eQPB[B
+%0 at VhD85e7Vgb1)H$>Fe6qtDJbs2'&lVY>O6F,Ja(Xe)[Q8e*!d3X+4PUmgcg^^r'i&O&fd2RuELMd:C"X7`HrPlkG_^%'.Jaa`r^
+%[ruKiD()1QUUKWXMa`\-ZT$3p(lD&*P"/Jf;XCqI_.`mO:++S(L6+^'aX;Ch<Y<roNm[9;1(CUOL10"4<9`'XDUu#KnnMGkO4FH#
+%O#q,L<(\gRbmP"'dj!LQb4^lJ?tqA1hA!kQ;gH_4Ca9>pEUm?$mW<n'$8:[-RnZ_c2BGm=]h(mCCsNQl"%Dsk,FL<78UgVHalU%o
+%Y$2WX_)"*^/9Ge?W].]O>eSA`*sniMT9gnCdo[9]m\jA0\fs:fa_#i`cJ8:Zc82FD[2G;m$?jsAR:,-aT6UED!m/&M9sqX(Q*g=X
+%PJ!S=YEf/_IlIQ6pS22he!]bN:0-*(9Ue at S$ccPMHHAmM>]uD'`q%1imdui$$q9aY59o[SOX;[_i24<i;<^_YfS[ZFgl-+ at 3D3i/
+%]B2fMqjeNpm%g/<+F'K"_Tu(qA_r_+BoJ<9"U]J).<DKS9)?ceZ]uah5H#j<kb.<@$)A at Q$G,%Bj8pXno<fk^O at hb!Zu.0FnMHM<
+%Q//W]HA>G:Aru/3[e>'jA5$f(A4dU1CTSdl_O,6'r"/G4&hX5K)>WFX@,m8HTsn1dW'B\lah'LNVdS;j=N#nC`RBs!6O8*9GtY(T
+%;U^oQ0d'73fUO%QRPQprd#>ZI`4^;a6p^tLc_8V#1n_/ilh6)u1@^@`O$Q<W^<NfNs1mo3DN&]f`VCR.-_`gnAaa=bYSbKXjpDgt
+%VG7?7Ish_2SREHB&47`NUCI/PO#lrZV&K7`p`?E[E9lb5U=c@(#lmL&Q7T8fbG#X!/[LK2EWI"`kW at 2;a^tD:)poaenm%ZDVkjut
+%eoU7Nm1WBZ2dmbL;[$HMMr-LN3Lc?A<aKh>(2g^C%>Diq/X:=i;h at DV(rN3'T?ieHqd3L\-!5P9F,HH)J:oh.UNI/b[-#C^^!ttQ
+%XH<s7f\UKG-!c7P7g1sE6qST'%`s"0gV+Zr0.=0.Y:6gWgHh5e"cJ?^5"g1XS:%E4-'Nf/fhrHM,Mf0;^4^<5`R><G:A]A5OPPS"
+%FPUU,%!?;VmU(u5V5e[[K?fP0W4>eWW`!k4LrKVPO54#R8buELXN]P^,>KdL&,o7B6Srp2:D56^35/:>VB=qAmqVR0P/[i(BrO'k
+%D2EA#qJtT)Q'.;jp;fW!Z(F3rktkk\)3r.&?a`WqD/)_qCKGEEY5?@G849,XZ-I8FM;!4h_.uWI(IdV at 7UpVk1_l@GcbWEVUc;b%
+%An,.`HJ+*_<QD`<+!Os=&2(f83um-3=YKM12mAD?80-6#_I#?JjL`-C^Bo6*nhe2t%m(n,#il3r]X#&q<U,?9q)2.dY+$L_EDgHL
+%9nff8Wf\C.YN\Vkcu[cM0QlFQ&Niff))nrF9];QEKYYsec97SWk at jqT6=4p]-2Rnmq4E2'QUGe-o,NjMLHP^SGDbpIpBc%(M%;Z=
+%W<&+UnIa``dX2KdH#\3mDG!0!NaP&h#Wh>='FRKoe98Ek02,Cq%^)*W.6[pl=lN35ZH&h6.U4kZ_tjt=qY-=`GYX7q4a8JRccX?f
+%a&A%u`,'o:Z>bTBS1r8g9qs"g<'D=4F%M=ee5>fFbo!iCD)j57='efT:2p7.bre(rl#X%0R[8aPE1_DP3D:4rBs'l[:qgr?6LmW@
+%0Y7jRE^@'_I=C9lY+$Q<WH[M"Vk5i5/ib_+T5b\eV4 at I:+`l8,?q+o#,P/,jGXQ+iIKr6<i.J]**)]r(B'K8kQHpkMBsOjPb/piO
+%$sn$Qerb.h/iMN)^j3Q+$^\Sg9Cf=gUuc.<=$Lk8p/hs>Ou-:&e<3cJ=A!>Y'hkU5nA7ga8KR2sLY;N!#:6&fon[m_%D$);ST8/A
+%r41nI/7s)'*:otho\)Wacu(TlMq*QEc3?%Y"^ifi"(-Y2.-&;]3^6rnB*tW?dY-u=oYSk`,!/QXM*Tqoj<pMb#T$5[\_"sjG7X%(
+%C%=1a)gMMl*3</o6LjA'N9OZ]?gB<>gkGi7JTW_#^Q<8>MJgRW.9*@uHu!/Vj+m'sSPYiCKW\<,noC5 at V[C)r\s6dH=8<b&UNWY@
+%amBPr4>3-](1"83WLp`BU at VZtIf`N(eaW37miS+5*4h]L1=*FB2A7TX_eGRPXB%So.>hNC3d!rYZLT-.+j/Lk3jh;^I<]#MK?-,q
+%k#UfJhAqfYgh'9qmhQ$a>bfV[s0\e6lu>ejQDD]uB,;h%7tE5;FSQ>Y]r%TEa"_mH&d%dsD.'>nnq%s32<%(sYSad569rEH62E$q
+%!_W?Wp+L=0EVp;e$jj</HL_C%T8gX!dM\[(](tD[9fq%`Z9='03NUfsQNe1EmF<Cc$(E:?/bQKMO1gN4?eRD.1t/I78f1Hu=KiJ0
+%>LjiPr/a!(%i1]b93<SY$=2$ANM_r5d5ei+Y>p\#"8dY186aO/h)<HfqFj at CAXhiU-Fb&[hkd/G5:Vp(<&oPr*&gdp#=90:4\MtE
+%PK05O(9&cp`jN[Wr:Ji2_k_p%1Z.Vjs7RR&[;Kk5ah"#Z,8q%X`-$BtVD\_8H#o1LY\U7*`!Z=&5R4!)GKWV#2SH5<+dP&GYU^I@
+%?^CWX+H^1UTAsL%N?DqkShGVV]A6FG7P?Uni+dG3!GieSc>D2K27Lb%l)n<E4&nPdCOgd;;ENJ.QQL)>'o3TP5?0Jc at -X)RdWQ at B
+%r`,ucFnROf2bs=Rcb^NsgjMjbh*mm,Os0KY;61djKe_ZDHaW7q0hAt^3Y]C7+:aP)4>J1hX!;Fag'a8kSZ2a-.WGR!8tbIomCtZ`
+%SrB^>&ot]#'0U,!.HD9DPm[P2[bK)$U;grem<P"*iqu#0bFu&YfAG_aVX.K9m3(.mnaWE(Pu!M._&/Ji7rm,k at foR0SX+:1![oIL
+%j41nU+-HE0dnWM)\WW`N,j+_K(5Qd3c)Tkt]jUS]PuB\Xj4G^]J4CNApa!,0)"k#EOt=aY.u?JlX4(M`2TrQ::fMoioqe#nkgN19
+%m$];J3,J=gomb'?j?BpqfI1_g6$CerT:U)C\*-Tlq"Js0jIoq!DY+JRbelOYMGjVgU<B#:fa(IYYSONm!W>\c*Wk.$ViD%C"c@$7
+%FcnN68Y;lSR`sWa\OoG8j at KPT@B8au2]/o:C!Sq69F&anqK1#,h7hCn*(1WZ:^!d)oee+B%YZi[GgH>+Ztl;^hjZ^EJNUl_U%?^U
+%Ijl<XDQXgJWkXOt>;Q2G&Rg1Xjk&7H$;]5P4pdCI0p-[O5>$KY%p=1U,[]A[k-.L8"/]V=%]\jX+J6_bm$MjcK`RcnA^/dg&gfYN
+%B6KM4UJJt9"0;'B+%rY^V]Wne2V4;;j#_N00`+sL%3&qPJg]\./90;Fe at F;')COL)%p)BF]V9uWZR2"ljRE=\c=8It"?[]'e)2MJ
+%Co=FfLs,\=O#qS5iNX`H>/WuJb\o%#',%qZV/h`jAN]Z&8b:S#qbUG0lSpr<TeDOEDWbVE7e3-Eb-[&W4!AnVOF-A$-OL(>XDC!f
+%V!2u6,0o.\[rch$ejs!&I_^9QocNI%ooh!&ggEIqW[Jd at 4Xgaq>hd)&Z#n"P7+5a6E1*D%T6O!ALTuYkZmNC4RQOb'M-.NU[r[X*
+%jHK.:[*:'!o$*P"el8c)otJTZ2q*Zbak]]aDT:`^k<f@]hPP^cFZrkQ=-8al/]0h`-:H20cstkBR^Tk_JQ&03)4:&fkT^+4Gg,u#
+%*+^N!"[FZ(\T5:G9AioW+-A,BAdboc`_mq5-3:`1Yl54.::tjoK[4LmYC4O*C9Wr^3=@l9cp*(GN6pIN-PduS5Qt.cNfS=C0;pQH
+%MEB^Yr,rpuUN-u!cF'eM;IA^YA^'DlVu%S&M[i7HnOi2jI%thCO5.?T*NgZ=rYI=`!%@68ohY(Q"gC,!-4bjNrM4u%4'cgQ5-rEj
+%X:k`EkR`u@:Vij_o(/46A)pgWnQD2(T*M/*\k8fg1]EJA=Pg*m7r%[hbkmk&in]U:OUL@^+Rf^qZp$D)&".I\kVnf1N_bbrc*";7
+%9[b/=j^'.L0DZD4XOIi\e\omVY(IZsj/2D79NcGs>H5KsT4>-5=2C'Ma1%-/E:(d-lbn;!'No[ZRgBHkl<NDq^t..YMP:6m<AK.d
+%o,C?n2FTl/jj>HTPkSu7!5b0<%mjKojLS/B#1dhq36="e^&E2Ma/PV(nk8j4?f56B&C*`qj&Ud-_%7kn?d$YZS at R`3Y1RX=`,sU1
+%1[cG'+2OLbel3g%*h>5cQE9Bsh<HEN<Lr,'&mV[#OUUa7q_$\\i\!-HGS5t*GV0t7P+?8hSdHW&j3I3iVWpfHQClgN;9N6j8P&33
+%2Q0a(dj-"i9Hm\m:(j0gqFP]T#Ff6Aoo(j&!,9nrqlq_o`B.1G+.=^F<'@:`"Q!QYWbn[,9(K-cQMD]PUse>1c4a-22VFco(SDA]
+%T_1,K8p]mRbIt=u0N:SA.Kld&23/3_jUA0WSL<Ak*o1Sd5nRb/e+rmJC7?J=Ff60aD/X;n\W0Y>,H1Mu@,"^$RCiDJ/mEZh%-)EG
+%+o)Bq=CO]parU at R:U+N4Q-DtHT/hM&[c][A0CrcN8oU0soOrm2[=>+X?(,UT-h#<h2'tInGdVFjl,b"opcb7cqoW5@]#mT*:#)nL
+%1FE<6LukG.9d%,DXgu.#Ij_f@%-#r3nn_^nFagYGS-UXDs+<5Qgt5MlZB!T%Q!*_93-\H3#S\c>goUFq_ at -*_I,&-:435,&^HC"5
+%dD=gCLL':JP27QLe5B*\6Q&h2S>R@!-REXOeea"HWB%'SN)T<[.lR`e="HkP)aBB>@Z$I6N%l3BFIYm5#@`iKj^!%k[_E+62t]o5
+%AEQm:IlhsiSiNhcekk^9;?[d/2NaeO$1?D1 at H:<e3=QR`s'#ajE]/aK]lR`.PGIfR?0tUm&s(?$o)/W7\5La&hoSf%4\9,m-7nl*
+%WH[I)g-SIK]*#g2N&cI9SPLiAmY*H`S^i*g%*V[(K8gj&Mb:<[Q\:,pddbru#SXf`hifrnMo7T>1p'Z3#Jd#4V4OGM='<hHcI>fT
+%K+$@iEt15peB`%MkVmhu>a"GbV/4I at 10>JhUJ!:Lili0GFgrJr2O]KRAVckZS0re,P7=4#KCZeu%+!ZrpmeD`/2\'jT%mmU9)JSm
+%J\fN15$c*^+@"PW`2Z_t/>AjkhfEsS/sD?gc[BhP4Qj^IL@)fJm[u=:ZpPaWYsC`6aY=q^=#sF!>]kZKJP(Oa>5P6Q/+^ql_)$dU
+%/n9?UR<pFWZ8#dO7qhtj(F#8:*>d9(V<MX$&Mi9Mf7&!MWG[tO3B=q$FqcF`/!I7BKa+IO:6D#jYq\bk;bG=cf'%:rfC??K=3\!h
+%ZSr-in$TfCB!g=7X?B^,iM\lbV/4p at L=hmq\B0pjIBE3Sk(YIqe<WK987fo'3Y$5 at ga9%+qsBp7e4NY4*^T9slFCW9V71Yb7+LnV
+%M*;&Z=)@0MYcIV*XN<+f8bE1W^U^_%B)K;;Ok"IfEir/h>^TcHWu`DZTr=OSP09DBO;dmTh*8[#dln at F2k+F"Zu2\gY>oa<JiuWi
+%G\&[QVM'm2<E&%(nt%;7BG.*HS&<FCXQ<H!o"8<cm%sOZn[C9+&+T2NW.RY*c/jN8R][#e>K=fhe$iXi$45;F.IV?.85'PQ@\]I3
+%2lp=@H at M+\O_+F.]a<<"a^?e]iQBt[%Y]R[;KRn]#Zp)mPL3-%$G('Je=J)4P,jkJ]I;LCPtD59("5;5Qjqs3FXG/)Zjb[Ze&#Qj
+%B\">+)s=?j[;cK:_Y_pHRM.ENBcih%3t[UC7Db#_q%uDlUDl8W'X6cEAR&BR"rBD)'bPZUH[,Zt2m2`+:Tf4nmX64q)TY*&7="d<
+%:8,eYOs'G?S25QGmD_ce0,K_LHC8]BEg?R2Ks11)c]*t`68K6M`qUK09&uRc\rQnQ=b)B!GZ=oVl.^BCb[8J>q at oF!.!Jtd,)csX
+%nR,!!E!H,JQf_j&^K`Ysa at .Y9p4W)SV,PZQ$ae/U$:=2Diiuc;a!GD+l`g8ts-eXu[Zjff9Bko3J at E^'$N.OfPf\<Tr+isR,oN4>
+%AE#pI;*YVL?d:IqHaOubhu6s&4MQecZc&seKUMCt.PbT1bB=/jNSOj?/NJSp_, at E8aMVhLbeEjm36(b!Xb at F5\P1\W^Q?3Ud2&RU
+%On2%S6WYZNhFFD$A\h43]n%(.P]YLmr5=_Y2+81%HK320K_'4fcaL1Q&k=:%d<U;U]Jn#=>tm/oo'+`OgK\:a:56^QliT-eMp)bG
+%D<Lu":&bu=Y_r#SVeTU2n at R(.YFN$Q2)aPd.R_H4Up@?p9qkt3#3/;Q]?*@@3$S13W<?/2pjlXaM7JPNF31S#^>)>;Q=GT-eCd\p
+%V#@6JT8JWaDG>'r.X:BRgOBG4rJ\Dt.V[>UTdO?4r1_>B5;C\`cPbIU$0m.ohV\KEF8VoIBbqm/BqnCn':@.8]7IDrXKu5ZLc(t`
+%^4i(V'-ep?RCjoRdcW.LWZYo=Ei+X!Q5tZ-Y5jo]\aNH2M:5_DZSC[j?:]@W-E6Ol%_-e],iD%gR=NqZbkpKg-GJYX=IuNoE&15#
+%h6Ml4n!QFdUd"VU5E1W)CfR^dT4(5h^H1!SH^ug- at 6h-ZJ.n[``oYc;C7f/U&X?d%4pd"d`#GWee.S/CjPb&0WYXJ[*f=bQ&X?Tt
+%9oRjq at t#gR6"NXll\5QEgFC5p9'0LHF:uGP>Gn4E2ba3g(;h6Opf,8H)5Q\[1fo^ID at mUA@W-N<c(O@]d.\94h*^LnhW&P1^mC6i
+%dq`t7&SoberG>c#lFB`O%/;:4,Pnd6-W%)>0!XHa#S!Y'o<M:ah^Cp4O11(nU>)rR8[Zn^Gd=k'Z\6)X1h\bGgpW"@h9EeR,3;uT
+%li\u4q(2>gB at eeXSMqHlW(s,N*@Hqe]GGC(Yf#ZK<P[<2MYmYDXTu8rKn=Q_Xa0!\(M[t=c,]M3Ll*tr8C/P_6iiAZ8+Q&f1F&mm
+%_+qD`o!4()[`5\4s2nbqR at .K4IdTJ80DXQm\"ffM8dVEgMVsFpNlSS'^\bllCU\RnfoI:E]dX5>;Zfh(A*3j?D/#E)+AeVmVjDFl
+%M=>h[%q)[L'"=GnTUh11lLtjIJpNAO#%>?+1C?Lr/K_X&>S$V+?LV*gq&L"JF`9);dl(qt&8TUYagJ;*(+DKNA:tL-:-P(QI[bJJ
+%/UosV?aonSEK.[SrrY<2*9^:aN?k<<Tg`,U-n2QcIJ[\^-#_ibFXiMu\5T/dO]5!0q#jCpJSpZ at d2Af.7,)$B/\11h"cK,HS.Eca
+%0ZAX);pfqDT*bp<E8HcuP/+53,bD;aDk_$)ZhgG6<c+<4]f?pg$T:UMX0,B4TUD0E'9>r>p%45=W2KhH&,tmHrkMpcG<O'\jrcJ<
+%gAc!'CI7[EVDNL+0(q&'j+)E.+qA?)UjG[<95.FpPm0oe3kGn1;J5LSmt^9/>X)LRD''jC5HdBEgk7r`3hJTJ:>[\4T&38ukE2H:
+%Bs/m#P;Q_EYf^PKM47KAXUI&NR5!XU[+YT#nuYJM%nd>=OVJA1qY,1?!o#[rP-C+b5$#;aCbkaOR,BA^UaLn<9iTWh/<o+;,b1(s
+%ndCa`Jej4B[MPjgoN-&cK)N]RO\(YiVG);RDe[ZpJIGD;;#0]SHH&ot-LN'.,oS,oYVsd*)/aas8*/UFM(mIHDI!Wl]MbPfIX?.H
+%'!HcbDXq:$@kr24@'3duI&$$*Gg)M;+Ld%'An$2ql3r+_C.bK+*>97)@&T=9:2(Vc1ilfEFYf.=P7<VrAI6R*kH/K/Y`b/O(S(9C
+%]hXi,h0h>>qc#4Nl;[!f1rh.N"FK30;"5UQ\oHN"M#7rb,=Q<$VIdbDI89=gQ&f+B#sU=[b:1s_gG"._b4=Y,`GWFOs,685AAL@]
+%\<E*G;YoK?oK:Y$8G^EDm:2VK%N]."RFNRl`G"`MX?f2/F8m'bQn[r!6)H'Zf_&f;RYW(++ at fSh(`^&EWn&V/[jFF"1Y-qF2A]W'
+%&.hu$-_CHB>=X)iJI9X5K(VMQDfCq!9gW1e;7.BcSGBc&-TT+X+O'Z,06_c9RfU`[r";kjGu$"Mj=M]_2N..E8kE&Hpi4[i at J5l:
+%Shn[<VK.)YY"Vi>P at rmqBHO_FGidoh;'bGpQ<`*(.^6$1n=uu0Wan7/3S_g&l3p(CkIdZ)Ug7BaN+-t"*'Wq1hjf=J,EFD;H(nbG
+%g1),U2l++[=k%#1ZV3NL>S2=M<&F;66B/`J-V:r at -JrNC\GK3sM-bFeT&(X:0s<<..*-=c_1-C88u5m]TQF;gYn%ZgU!jPYfKJk+
+%O&i_@*J9I=r-cl&:7Kh8l$&lQ5tZ(,QX!;rkBXXj"F-,lE)KI],jSKCZYc1MOV'hgKgOp2h/t;/*ePGmA_p2jQ$f^mlU<,u0Qji;
+%RSYf=bN/GHdu5]+j3 at TQ.mV@Wq"S!q]WJ?]Jb3.tY1_.BdmWduW*4L]c<fZ8]din#lH at M",A=0XgOifCHbR[hg(K['Gd$?-,a[GB
+%*7Gaq(.)p*1L4;:/Loa"okVCN-?j[[*Qfs`RNje9lQrCOMr/%U'`U"TKWY8cq'3g at dfppPb-C$uZC`=::Fn'$d:Vb;1!76mJp=eq
+%/I/s<6r[B*5Jk,[9c>UT"Y.r%^'W9!'c5Rsrg(rIMW.B@[pM^pN-MQ2QPF3d5Y[6/ZhIQ8$ad9NU%7K=a)?9S\Ida*O,,05r8g&/
+%Hd*'h?#efphtbmZDg:SsPA+QBPqYV3,4LDa1IW&hi7,C at Y_\bh\f'.":OQnJ=g#2YoXo;,(A_+%Q))(6J6N]L4ITX^b:JjN)l/p$
+%X5cSgT=eOoK$F^_XW-f^SF$I+_Ag`^+Xc`jjdFl?::4g*VpHu3k,r"RBD.=O%B7mTNst10R:@n'Xn'n:[4-VeWa"?(.d`YZ0/iGs
+%?H+)O-)cg<NJ"ohN,09CbO$<+qAlY1`10en>.2)Bo-pkj6j[N&PHMhL<kYj<c#9u5d`I)HArFmof.$=&;tbT>^+uZR2n5Pk at a&#O
+%g+/`3Sm`kNnYFpUrg]pEe2!;$0X"9aOjcu7lS3V4g`hi[d`92I?pg)Zr1m<(Y9e/b\<:%kmW%P<A&H0e&bMn'_,4fO;Jgk&-iuY7
+%N19aK<)+4k;M3ZNcJLFpiH%0lOB_-O:?fhY$"V8rfJk9+&K^m0KpP`Ij9bA'48C0Y=T!2(TR)e!=qR)+IPDVLCq\9U\p9OKag2Kj
+%:IONb2"7EjGTu at 9hH8/%cGde',I_4MF'f?2;gIYjd1[\1S'Zc_=4a6Z/tR1T-:cq$X52S.g<04(NIMZf4Kr.>"rd^R<k,k-<rn1/
+%L1Q1;%oWN2PIV,1:Z].'S2Xm=]dN:;.jd4(KfOCfJ1moAFZUZt8&mO+%*[)kTXq:96a"2)ZZ7(k2cB3)#,TQgN_QAsF\=4KPe\!#
+%CSFDI4t;s!`+(ej2'a.._Y7Ub7%Mt_"Jk_.;%"%$d>&8%QB+qiW<cn/Prt1qQESHfEe]27>]$O0FWDnE9-+@!hf9<h8&<8t:UiY5
+%XXP4lT(A%aQcDn6Cu]k-'r/$GT/n;H?YM9?hB*@-U2c_C4a1B&s-UPK]<8HXR7`*&$*AjXm);eeLN>Z"a]5-3/^/hBKmo-1Yao#q
+%rk)=h"X>l at h!"-Q!k>=XJird"k<-$8TTM$T7&8gRi!kBB"p+iI1!dY>BK*/gc*>]lcGrHo)CoSlHc at L5<@_/1DTt1GhXZ"e(%N0+
+%_hje"mO\sY"J*23/]!YkWH35nJ2mfTaJ-U&(smDKYH&g]WfY.IL,Kk6\=aAjgA93;U&I=6(7O_P$4[YGaLAETh".WY?L>9tm'&#X
+%kN#o\AuSdhO$3sp;e at pHF7WJ.n'(0+/^Eiho at N3ld(.m(S;Fe2h:argFUs(`%1t at oB1a0(MrX]jaigm`CRIB6#H$]mpN.<2O@[Y)
+%r?rhd*(mcNjPC,['2[O;]Il`bWV4HCoE6%Hc3Yu:X at _G'm]^-kp(#r#heAcE3<,k&RST2r(n<RoI'hB4\M;:JWjEeb/R@^=aiJQM
+%#J105jh#8k'62M_]r:tn*9\j>9P#+gqAbWfB[X,q_M`Qr4&t"-e*p6$J+=IL at 2&@@WqVf(OI^bs9(5eE_43CdBp$t\.<JWq/f_\0
+%fU%R'*39aNYg]g0f;$""K??42XSZ<<3+:JZK2gkWJ4FTXe/jGHdM[rmTjUJp2B<MH.6BFUjVh#3')?*`&HMEFk%'$/F2pJb!Y)*0
+%S&tP+ZtV1.$R_K at ICnO_!IXHG0-^_EAAM=(G?&E)@+/3"Dq4On&A#tB:Jp=#EU73d:aZ]Pkd]k'Lh]L.#n\,\)U.l?.63sK2J^'[
+%`tnA0_<I2;eAdYIo- at kogf`Y,W, at 47RNkR)!_9IAI;S&Mp0#An7ci(N/Ybt0g:EIlj?bf&MhFi4?`$TQTIr!Z8)(jPI/d\GTsK57
+%D2E9(BajY!VkDfBF]V%qhf#i?%B#nC]k4L525riZ3 at 3L!AC+Te;4,F\/J[l94?3";>q_BBcA at -_%`9/X\F&?#!a:c4+#YYPkq$fV
+%P:#1OGsR<)Xl;/4Q:>0Zp-ZO^3lnu=i[;o$&:3nOXf#?1bpOp0'8'Cb+1;s3A/?G'^p8;^mP7QPT+i:HlLZ/Q](Q]=7HqGI*XV]K
+%*WMaX[G0A9a?TRbquh9ubTr"o,dM9D':5+]Z>FVR/knsZPd")\[M04DlW9("=+(GRle:FR'74:\be&.:Op:aqYru08]YQGVp<HL!
+%M"88LQHO$sD6Ih38[I]Fd'"O<gPe1,n`ETCOSu+<E+j\K)jCLdG=;e5+>QuPQXnATQBU@:O&+b5)jU/`1V;,h\:9<:c/q#$Mpt&5
+%c"!.FAA+<Y+ob`#j$KA6;c9d\;X#^p4Ip/jc)tbLpsn+,1ja6[PLTn(Qb89-r?.*8TkPS"o<.Vk$\r5t7dK%X?A2%/#)8]+^ClD3
+%dgcN/@b=ZdKk.r\A at 7IU\t8NW3(ZoGGLOgPFX3O5eWhV+0O"3!>Kq*NP`/qkkX;82U5sX#Jmj];J'0Rr_orG/HCQ?OB3X.Ofdocd
+%afWPR#^!+8(oTd_kN>i$E9UjepZ>=WD8BP"eCARG!b-c*o<]NgKrR`X?JaMB[$jY<BbD+q!=56n3C_ZubA-03+VKJ+db?jdi+7Qb
+%,+:BCAW#X.?J5W'D*:4OM1Z*nfIS[SEJo$MpXSKgR6iPf'P4[-pt:3lkf_^4\Pl(FHn>"sg71(V3pN_UB9.?CPW'^oU%?9`+I-8J
+%a!U#4cq\a5W at np:RU@@ET9s/:-ltl(ea^LC1!`)IGFt%:F^)8Rp;@OQW<ZAB+ImhWKD<cD`ck?A"]BBWplNoW)HT7uB:HfSccVc]
+%.n10rB,=Jl\[\^]$_a2N0P[o4CT$X?^KZQ?('6t?Nk>39(nnoWTCEAgfCr%on4UioR,Hn"gJJAF_]lp8LZjj+1OH75bm^I+M>3$*
+%XR[J!PSHR1rj9\L<-#iR+`[_ENV&Vr/[t/lK/RN?apHc3^Rmhl4um;!CkDHh<$!/q"&8n_o1W)3n=2YDWN\$T;!`$;!R0$D\^jX\
+%`<5BT`hMXXd(T)/f&l*+P;>UTpBr*Jo1#Wep+]ht1jX2h1r3=hG'_;S,nn,cdE/hgS;ii[3K^/m[_ at TY$.)!((('T6p6q`o<"`#i
+%]CU%/D98C\+eS"ZP8AW:Nlk"D;iNu4M_p7oRL%fo_KL^\+%;=H?3'J"mF^/ubE:J$J:gSi(<B!0kLNkb!4I!t-<DP_YC4WHDP.ee
+%i*jGm28?+Pf.n(,cd]*9NGB)9nnanC!o%nGQ<BCR>31tf%!FBBa[bcOVS^boj4jB5"e2:4Na%+U[pE*$f'aOd=E<%i3gc,McZ"0P
+%=qH#&.CS4O(`U[&N<LUS%4.UKj?Vpo&o\5=%uqpQ\h(d)(L+rPE&O5]4<YJ=H+l`VZKV6\'`gF<XrZ;dIgkD$[&jVsV\@DO(5&qm
+%Ks,'t4MU,PG9l6O$`lA_.1($pFreX#^2)/.l'/946'G6;Q*sAcR8;jrf4_D<g at W@&qK(-Fl/f7<qI8RB,__FOe1)Z?=<@/iJZrq,
+%@CJ#m<`.g`ra"2Hd;Cl=$Nb^4$0C>u$kPU>&pb]Z#4rjoBdd$8.gn71KO%[&YI9C=8I=9[;V-F at O4l'J(\qje7=-)I7qU]&Nn_A;
+%D'-d^q](,AGr]SA-8,QPUu"[@8?"sWpa*qn1-R)JbP"]kM.*EKpC[L>`ZVslhS_6 at _bH!Z*CfI=nok#d\EgX&KC^GO5`D!,<!rMT
+%RFiIg6CWb+7*an at n!u`4q+_Of1RE(@+)k.-qrkfJ>%[P=VY!MpIQ4mP-;$aWahWO,j$j%K#`e4+p#W`^(`e/o3QEN1DM!5G*RN'#
+%l^OZ>i-ON'\1tM+X91?_ahaX>@1`BhoaU-829UD0E^`ZLmsSpd>Jmt<A[!mq'(ZlL;qk`?;/tLFC#h+K;0,`YRZDn;qZoNrDDmt8
+%aK3?8h"F/$%JuPi*^RAK^mgD8*-q0H#]ZaQ`)ZtcERiX58]8Z%C(&]Ic$AUAHahAl(8U5"G6nfB8Yjn#WuU6mT+feXDGr7!FS^\<
+%h-RG:Kuh7gc=t=ji1%$LN]BkUf-:Nb94]=u./2$C49Nt_k8m$BfBJiqLK@`K"]mRdPlN!c\FQZ(nZp.EW@"'P!BnbK,e_PBh>YoN
+%eee2oD`rU.a,G6\%([*eVl2mZ9((N9V)m`W>=t$dfST"E41V6Vh%@Rs.9L`W<i'L_1Ap?p:G@*!??K'l!']lr%bgu1VbK"mm1[-7
+%L?sc,A&>#H8[7anl8qGIHn`1#$+2qHM)E_7\'#E`Vb.1:K&&%ic(r9G%+)2_+3O&Y8pf&eb$$9QW+#drpghkDFu4a&hlG^aVp$\9
+%:4d=Xi6;Fr["blZ</*Z;S+H)-4G6iZUqEo_<kP*Z/2lS.j9sY6^JL$]5Go[4\cohsU#_a at ouX)SFR_=nEm)m07$'cU1=@G!oukgt
+%H/#IhnY+i"eJT#m(cia>N=2M5Np1%+nhQ]N!oj'Z*_:+hJ__Blko`VDg1'W at a<MY^-*=om#>A@'UEn^Z>X/eUo*k@*(eAB?A+r]<
+%KA]8BEJbtK*EWa,K;=StSY5oO;EG?'ZdU\#P^*sK(Pd4oJpA\cZQ^AkUroJ4rc[6D-"j-,1;9"'D/(%<NWj!<2!0<V8uP=XVVd1F
+%CMN873]#snbHDGlbi=6IT(8T'RCOhFfSJg`NBEDN at IUpW=ApNBV#'aO]Y14ulB:1oM^rcicL^]k:Rh7td^m;S2).4l+rutb*\sGb
+%K0:?&:Al6XMEGksOnn8MgF,3#]#V:96E52m:A.tp_C,<*`9t"?R-H&AffBkOES8(aO_[uDq1k;)e\uEY_2cbFCepcJ2P#&tH#,EE
+%+/gBuK(Mog-8Xm;GkRl[7`9=.jo$Ii>_ihPKY0-/dQlIZ%RTq=J-8Yc*8oL-]bPC"_l\CU1"<I,`&S#"-1P[9fS at VI1h/L>/oiRC
+%drZg%$<IeQ<^,__MTithb/[OWi[m5t:b<*@%r@)6QJiXC at -,HCGb-m@>dNKK$[j at G4.kMZK/@.*U8f;ZZ.c`/V(0/$#YSlIDL.m`
+%9;Dk*(r+&Zd at q+,V#6&l;(aOo*'+)A1-mn9(qE';\aQ4b, at dhiQDErhqNHW>*0LB3Z.R9!]$>0(>Q83ek)9OtD`[i.W_qk at Cb,r8
+%ZA$=[75HnCcAkJ)&!nJpMf.D36\C%F,.Y/lCQCa3WR(J("/%cQ_V#!K>J_.]QDSWg6.IB01b71<-"-,Rcj*M0jHol^54Y-DBJV0.
+%TjnYmAbMBbRCeZ?nsf1,oaJ^U&,OYdVH*DZ$Me4r9X`+EThW/&'Opkk\K`Q736GSjHs'>5-dU$$&DBi.ms9!;g62^^K$ua'<[nA3
+%-E8GD"L#%m9BIrifN at co3@stHSU"@'C-]p.":M\Pl]Y"kV7<m(d!:6gnnf.;li]CbB2JB;dU)]#LE_DTabkD6$I/ScaA.1KB6t(D
+%nR9ufOmH67%jX.,/`6*Z\=QK^LsXA]=2cIc*P6`pGPh'0>OrA_9Ss,0[2P:^`sL6rk[nTE'aA=Wc:M']$,5Xgnt6B!3i6'E(K=?-
+%r1)]['WKR>rhC$GoK?=UZ[B%:4RY1X)/\anQAp&G;[L3L5o$T&4I:F at 9DltoWd,_%&D)?giR)FijmC!',+pD=rjd`FE#p8Z?Flp]
+%['!Ti)d9,BP\Z9tp@<ndpPp3&IXuU>UgrHh*1MaNFbFK+$cW6)eo(dOE_;Rq0Qj'cgkctuq?J76]c@!,AgY/Q719&b!V^Rp4.0,s
+%]QhY$VQNb0\iG+Ds0XS3=]hfS%GLCi&g(30FR)@0J,NXX*I=K_eV]=pTDqBaQGlaujKimiH>O9iXkTC6JnA[[/F2apLS'W]eXd#J
+%,?Zgq\0l/iRld4(H(B_(^?6<nT+aC0ikURB.PTEGc(]>12Y[b/:!Is3L>bhK+%i>1MEFqWfA+i?Z?,=Z_(Ms,gQPu9<%0aT:@O4Z
+%[n[*9on!GIR?t:!3B4OU8I3(*j6E5EGBnXlYt3FN.>Mb53G=)_lDXsESouBNBt)Y"nCs;W104.5nm7>R>^t$L1ID\3_h5g)U-C02
+%A(\-47n:X=.54]s/<B38>HL#`Q1BBq"BPc)`"DdU4[(2+9]&dc*AfA"!:S3f03Qu"U;f3"kp]Zua?7#V<-_BgkGp8+(8$4PeQc1(
+%3noO!.`8"..]arZ5D(`9$E0PR+!*B3qae7sVQfo[Ms:9!?=HM7d!scFr,Ok3f.:[i7F*"0aK\IGCW^OQ9(:D`9D1M>jcW5/\Wjk$
+%\Ee"o!`Na'kpbM33VQ!/np-%^qS?@](]@<uK8b-AHK99N[#g8b[m47P'69B>8]sa>8C"aQCbO\T"&mt(BF\qY"^qSqjeFH->.Sjp
+%4Bo,F+1=`;9KqS at 3jn_XgmDO*H!(G=X6&>MBB,k*+ at o_q9Vg#/L/[:DdL,>&'D!L6`8s1B29guca;`K3o9$egi`$-I0`9'"a:I^/
+%5\X0FRn7QX*P6IshSf7ja).54YZ.Y='Y[%j`s-asZ>#Nu+D'X2-6)8&Vi]$Xg8V3^!2/5]#;RXUjAkS/Irs:]Ts&;SM3sp]G=W`2
+%C;8]^TS<IO,s&JM8ft*NSiQ,([\fl$-@(C`W6?7X(tdSd0$$+aY8a%b1Q^@T[E at 8>C^8QIji7i[k>_ah-$Pm7c<d:CQQMFQ/'IjC
+%Yk]?=VHFS6SZ$uQ"(<uDI\CF[-UjXJIp%G-[,%-SgH//Uq,::B2I at C$I>eqk1VpfP]V%%l'L at kM7`+LrG9"\9[$pFtP]P]7pJACq
+%^&V^>k=F[-G%_[PT]us,+KCMgHdT/11jejS;5.K?j"WU2q3-ZH(NJr;OIa3oZ=^@R4ZJh*^Aj@@XBuuT0\NPf[UkmBPe>A-@(E.W
+%>$!!l)5.8I'85b0@:[7P*3s]Bj)pm,,gC5M.j<),C=pV6es%9IP)-)$rV%R7'8dX]eY^R-k^3R)?B]/fVnR*1eJkiDOD]MicnJ$I
+%3o7gu,1Y!>'$E=M]\Pp"SUcJ&_D=Q3FF!HY`n]7i@;.7\NK*(rjljZ4*1DeD`Zkq!X(&GUnetI&SLlNKV8LL;1-tprQb`l"*]iH_
+%!-d:i<DG^mTDgg!N(:pD4fT:?V7EdoP:>@?O)!#REU[Kr];s17@>^&6<]trS,W<Lg(2RZfDhaZ=UHE&c4L2W&PV[F[o$ZZDb1i;C
+%O\Dth_`tX`!At"/.!'4U,-GGD?/c\--72i=?<i at 9qao#3#[uB.$1K at b$n(MH5$'>=*4*;J09?(S)0+b<%Q#b$]Yk?Vrh3cnNb#Kf
+%kNM at BT$L at +_K*qIb;T9UMkWKeX7s]O=,.>UA6RK)K+_*q0>BV^V*IK4pdQIDJpA!BNdai2C4p+k_?9H"X=J_gRi,?b=g_sQq)Z'(
+%6S[9cY,jhLaGgn(#q/3_QJgY3)hGsJ"ue?=CF\`t?EHAi-?q/29+7a;1HQK5Wb8a0Xm$A`_VO)6R<21RMm'uYFaDXB>(l+'L4OoE
+%!("bIWWM7\D7PVV[PtPP&P,S;4(eqQbKDV4=?,$]5Wn]cD!2k&amlh&*RcaZ at Q[O?H.iJ=MA5hg\`XL4^RH0T*XGcOAZh>i*98_l
+%qUqMHm>bec[4dMi:d2hB"7#^m/@m2OGu)deOh?nIZj4C>HKDJS$6</N3SEE<S>i6kT=fK?PMDJ-<a1)DYmTZN1^crJ&Ds;#H&6I"
+%A?]-ahqP9GVRYi*dW:u[1*!.eQ8l^h.P]Zfo1f')=U]q5h9JL$S4lrBAY7^5Sj1Y5hB#+;KN5_uG4R,Q/3J=V at X@tuo$Mgm-K8B@
+%hR.%t)K9W23J\>k[1i>gI\qa^8=FV)B_P,bWn8"W_5aO+4S>=hs,(3j).5.B+cN$XZ=D*(h?L8#FQ6-V1M;6t+(d3/hqQk+kVb1e
+%.Ac_Qoblf6?MMbRM>>uI;h<J;!rauPP+GS..9Uc#KSRL."T-((N[4F76CVW:jO]C:e/-%X]ab=Njk;Oae-rst2i*.kdYk;sg8Uf!
+%DFDt[YC&TAdh5QY%A'>:,SJO[@:$[t%oNl3Hrag%?8qoKCWVjfFl'4QR,ksDe.j<M\8_;@G_Y1AC-a;jY"ln&dhK_SV59FWK0I92
+%-D-VZnjVH(TEP\?%>Y4).K:"r=+d(YpH_;Ldl#0&kTDkXZd_2cqspg$knA%0QQLF7\(R)#cq=fH[8hhj\fn?mq:^XB?4"cSQf)@k
+%;YP!!]uC^`no%Y&`lls[>Su'<FBuES8KO,MG at Sg\m(>Z`fNNASZN%(S]`Xq3HL`$Lf'q)=0u^DnV`^G6RJa0Z]pDI(e=7fMS?GDc
+%,um.0W]GaC[8h5Z(I0M?i3oIDoiZ?dG9bbBZb/rh]3DNtTDPn9S-KaCN(]'XnEo"Pk,_R3.?71D,<X_=B1:39#_7>ASnZ<4^HUlP
+%"jBl2AC"/N;*qh]KO7Z;C9]MnG!M@)Y`o)dL!*o"T!c!>XP?ThrL&/a.bRm-+Vf.ROG,M(&9#B9na10m/<;g^:1Z[YDu\QB1nm/u
+%>Q*BheSD3R)i>d1'4c0U(.)l8Vg=d!1HG_:drrrgSu at ddO_;go&_j9Lot%VQm at 5)4V+;*r0p<jm`t'igS=r'[42q/H=Y-p$9[a[6
+%1/BO!>#4h,&i5"f==m+^Alb'8*e-h5Z2/r+\fGUKnHoJ=1n&Lh=n[idBqE?1:*j:&::-hlE@*6<fi"/Bk at HiSiPuZU-.p9.[*8nW
+%?3Y[G6I^\WW#3#AgoC*V79;/QinY#/:$o*oi.%J4BdIFUY<uB'Tr^\oHJ*b+h4;j0DZfDOIH3`XA\<,!mpo#L!5#XX@\'ko+!aa]
+%5g?O#L2sWAq3'"3/N76?CiouV:st"=!iAlO&G>pXNimMQL5qf3gU=:a.qhMj)b<XnjKNG/SXX[>I393p(KQSZa>s0EGCuCTU at ACI
+%k!n*&8]FN1\th#-+aZp2QYfJi?HcsJMmhtg-NB%^Jdhpn1k at J`:(hH\a%gkJkZ`fZknnp4'Q$J="`gj[S6E41pW;O52t*88dh],&
+%+`tNjIgH?*@6Fp%luT5dU9GeV*]3e9O]FU*f"*GrL:C<Jfk\P`9BsVJX@^lt7`>"ue^gTAYg$&sm=/raFP=+\H(3A1mt7;,YUO0!
+%k1GT'h9.cg8I6J<Iic@:8\UBhcV'oC'3HtZM<H_)eTj6dGWFG.m-BF*D;isF+B@:=&i>rkdOtjX4Efh#`R'*QkkE1>cdb)NKIC$L
+%:Lj#h*&+!uR=rR[Q\Ei+@\Q-p_ep2t#RWpZqlS7Ng<Pr^.*GoSaTGWPT<bcob at Y"_8>\4UgEAePL(79Ge2c!EP%peu:X:K2\Z"im
+%j#"4+TKPjBB'C,shthLu<5`16?32ZLCG(pQbZ7cE&Kdj6P6 at 81PZ^=nfTIFP""fjN$!86-P8of8K<HrKos$,cMMeZsVJft/UI9W/
+%kL#6F8Gr!CI:Pf>7%KYI2o%oB,LM`SH.?.k/@8098=G^c/Yj`c,pF[=D%,:0`s)k$G@:D>]ojD_'XHVghlGJ(K4Ytt#b at 555D?N+
+%J0_;pU>34eD\'SBGAbu[OshAq?><o<<Dn*[q*@LBf0dS;LQ:3Aa1HCM$4A0f:.d-5kf at 6`#r5G<VO??h:nY+"Fq_A>E:hfhbGeTb
+%n1Y]HqRoJsq'*d1W_P&@&?kh'd[qklq+nKuWFW/DXZoT9?\-ERlSpuYAZgEX^1<#RIfs;=]MG)&[2VbOO#",W)<A6\,A2XM-$@j]
+%f'9/)P0!5hES#iYeD&`BV+Hn_es'""@Sua/9U:!rTkohUG1rmV-_<]V49$Ta+`FP,9fSXuH/==BcV at h2aii-3GitAcc3Nn:8jbD.
+%(/6a6T>G2L2B4RLZhXbrJ(>34\f5o%oEbAsUn*s$R+grN:Hs?>@f,LbhK,!lD7&u=8afB!''P8K4dkG`,)+7.Kq*>W1<M&=;ou7p
+%b[18VF2T3sil(6^_+p/ieOi/#8I;n%3uKpiJHl%>;H*e%)nA![0C,8R0&d)@Q3mES.[8eHe</[bQc)@;OIi_o"l(H)E5/jRo[qb$
+%nE"F[YQJN>2i>*l=_%?>Y;TO#5LnGM)rpfX]$Dhd[lK,PlSH4@\ZE9QeHG:;q^I$?pZ3=iNqoc0NaJ:'o(0p//I!bYMKdK&pQ>-k
+%gZ)>a;4<dR<_]1_2I+TbaBd"_(giBT,7Jr>k8sV#B?08i@*br=n0$9b"jVnogQtm.42p'Nn4[CV,F>\j4J$2tD-^JY>[<uuZ8[sk
+%SZ&t3laqPZ^#edLK?!YF44/j(ZIF6Cs,Ifl.;Mfcjj=BjG94Qi&["?Ds6]VJnm*rP2&[sMZMg'T=dJTOZ2Vf#]Cjm?,ZgH')rQ4u
+%"/l2+R&]fJ#^;?VRk?:O#,m:'V,e+'-oB^(gp;gZ,#]bn3bsQLn+1tAcQNfT;jtG5%AorF,gY/1#S2!_A`dT?M0ctjO,82g.(_lQ
+%_&hRA:!(It;T%#5H%]T2M*k'C['Z3:`,SarPNTk5H0&BlO'B2T<kEIn_1!7U=I2*1Aim&NC>)6K081bE<1!8O'?e9hm6+[ai(It5
+%JQc[DZ=M&8TiU8j#eGmZ!-tU#4`XZ(b at JB&D!hW].1P"Vfhhnu=OZ=m""i4,A-3Yf^f(n:Q``</7>['N+Hd(&!-+B"!e'FA[FOo4
+%IrOP:RlsY!AN9.Yi8?'?XRkfDBt3CA#;)()7=/MiVQm[#4]0"r&nW\`ga.Zu?NkE+?;DH!SQ.aH'4VuoDp"+Ag.rU4SbjRj*8.>+
+%dDti)]/L3mo(F/pRnm$r<ngXiG#\/Xi:>*N:_lVa\jR]S<IVp?U6CX:[BE.qmFgL1b;4!*RNqIQc]ILp/=!#aI%5u`KK at X6p^"Q;
+%!(I.8Aol%;EgXco+_S-)[-CLR[,[N at UB.u+`C^##9.K"T`ApWtJraAf,JRG!0U-<*2a6C]eCesSd[J:tVI4YQ>XO+IHBr:`,:b5o
+%[u(eZD%;->8>\TEU"G&K7KO+NPUr)DP'R04\FH"c-hammD#7&O8q3o<Lmh>k"2QB%+CM!aOXgBN`s:O+r_ at T@E(/IM6a?]^dc&DT
+%-$kf%8->R.W!!++o1jEH=8c#PUJ52-*'4YH^)Vu[3Z_=.o7am(DMgir0ai'5bU,$LnC7^\>>RDQ. at UG!c(^FuMS1T2AN;r+AY+MX
+%-0CL"!$,`m%_lQ)81_+LH[O7pZ9rFVK12pU,, at Ad8TQ<5k\@*@nS1-F62+nrac6nRF!NK?K6ZI1.B/VgQ;0RMnd2[t(rriq=_9N$
+%Q$O^Dh4tID at D3=cG(-O_T4W6V*@X3tP<%N'U-4>1C^UkJ7H_!o*/^=6XUaWn6O#&K//Xp;F&%<2cdHoq/`Hp&@e(KYfXB!q2NJnA
+%Ks!1)S;4$h)gVgd7&5XJGNaE6).^X%F##@QNpR1@=<f_p7IDdZ&m>.^]AsE6P%EU:5^_M*Le'>XC;kLXZW6@$d>$'b:60"PEC`kn
+%0SJ[7MdS(Cb8rFG',\eVC_YX?obPKPl9<r6YO0RM$SmR)FX:RUR$0X. at i<[FT;%&g+dA'cfdG4cZ557U;\;R/F?5\)hm2#InuKr@
+%]h#gX"kJ8cn.tFu<B/Se3;X/"h^qt"#UGi/ps_d+ at m>*F%=HoAr6QJSckQbKTjP*%cbQSkW+9,M1XR at -$<Yf10o'Zug(>*29o1eT
+%,*JLKRp8U`Kp[T>62[cCc9Um*)nYSVX!]HD=FNf$6H`0M,Kj7\E.%Y(kgiLbkW/KCSae%l_VWrM*\FR$U*W[#PFobD`P^_2Y`E$?
+%Hp3+?O$?T`W)bi?8dTa!9AhCQo<A5&=cg5g7>f`-[;D2MF^7TqeRMCP.Dr\,q'`6`NCNm/BrrVfb,R(cO-Q3AYLQ"]h+j=oS[+fa
+%:,(TX^gl22*4U97m8B:UE#).nkR(<:@N7\MVl`>GH>E[R=McWLfU,'UCdZ[['.O`=ZJ26OOu$A-hOFlPP at hkKedH;r?@k,&G.Ra"
+%<jD`8j,;F-C:u%("!1MLB/olOg8M&DO;dEoLM%X,WmN0p!dE)/9IJ-uUtom;%rIHM-]I@<EZT8_fR)NoD[Fr8$QIKf9!Ch8md3T5
+%\s6:':HYp<gb&e,2/X&;R"0GH`ga-K3 at 9TJZ@#DKS:'%<c_cj>E@';)Oi9JM2PWaT:#0Y92(<D,+lnKVm+1Zj6h9jV:`PJ*F$>*b
+%,p?A1#@=M9nk40D-6st<VmLgb6*.(2Q>MH`XKE'"Jo*h$D6MUa/a*W4IM)4WfH_?=B1n?EXD;mGH;8'ZOp/gF3%D@@=P.Ie32c=g
+%'$Hh.O[MB!qN,[7;E0F>bA<@cIG(/NZ-]<,D][7b/Sq'$Co"J9SJC*Aq,GE_MDM9p at GhANp8mU[PRW6!ZV?3LUH5S@;6oWm+[&3s
+%HIdd(Tk5SN4.gr0O:a.r:cFe]4u(ta$RU=dP&r0 at Yf20aV]p#Omo'5hq,\k,*fHfa8ds?Zk;Wi07T#\eb)rNLBC3=Ek/DV^e/T;K
+%2*ICLmY;#g[N at Li]Xr/'nD@@*l]RIK'ZS#lXU$=,&(PD'SO21.;?p$?8i#JNb[Y!&BQULTSeRKg="U.k-t.+")*^6?-\;r399Qk\
+%W3T2bA/9F)k!4E_Kd5DC225*'Vh&2V[n2mn492Np:U1;+VCQ.Y<\S`@Q"bqeduqT#P_P0EN"fef!i7C'AkFS5<&$V'^I5<7XPhAL
+%bq6Zb3ZPq=AZnfn$Inc#"J\l.A>tIN=Fl^+,#/L"7/1Th`f7t-\4u+_aasj>j`eVF at .(uIA%]'F.*>c8&#CJU_qF=)A'8BaP"UF0
+%if3^b1R3aTT^@.NJ3-?CdLI/E*%Yini&4/QZu$?$%]?Wdl$>X*1)LH.Uka/n2L at 7m)8XFQ,MAp8DW/.*B+4-bZ[P;gBHcf,V-tJ:
+%2T2Q&_n&G:$efX\n=!fMD;VOr1k`VKk.$(S2fa$n;lZ08.k>!kX=s%3#Mh/+JR)=>g8+:O$Ro=#/aJ!5EUJMI^"ophBN$(oKrad?
+%G\7Pj1!TEiQo"d$;'3^ga$VLYP-03?681Aj:rpJ<oTT>>9DspnT/.q8`O7Hn<(TQa9:_."=k4m7-VEU%b-?2o"IP=bT8_AK2ZcM_
+%GA*c)&pl"B4b:DY;JECP:d8'5h(<+m\VN at T%aU`H:U9\FB9@?'#71\kb at r6J&V2Wr=Dl9*hsB%>PB>+X)EE&3LXPl'9[u"5\NhT%
+%[h@/JFt;UKKOde;buE2/:]Sa<.eY&`NigFu:HJUk5]JlB?Y!]moghYeCEU-lgRXp]`*EuH9n0BtQCBWlE\--1\pB]7nfgkkG3eJ&
+%&$3s=!EHje(iKl,7(OHaJi&\1S>D,8BT5-,*s^$2)$kUFq'Nhk.cF]O)6>.qeQ"/q%f+hF,`,m;<A:Vn/c/D.HVRHdktk.pf[u?t
+%8DWf+]0-ZRp4Nd::'Y]e$A,/;aR$@H*-aKFa6 at AjIWjO-+D6rZliG&A#c)Lta:31:?RJ$%i2)$\*/"mo0.YuH*`ht$7dj8d8$_bD
+%c$Pd'UlNR`+NM-2V`6^J'li,smtc:7Kk;;7f)"a]1"bl?`UbD_RAAn)<IpDNEO\aYP]+S!8P47p-U,aBZh7'a<VNJkhWB(@Ub%Dg
+%&)u>Ffja(4-bJ1tcR&[7UQ7V9JDID:OJqC*;"r6iOfi`\/<ZL;2^bHXKHAcVl'h<KE at O/Tok]=PP<B-uEY!PEQ>hf$ZZiQknW;Ae
+%ahr,oC9/Xh.QY1drWOpdXdD`58M)V=2JonrLXT`XQ*.o3>+J6mo!<S46_[SO&,0j%P)N[PlL$>tX*BLpmWA']H#g!@$P,qIlEO$B
+%,tB%D:s3#0n,k(Fh%Wn)AJ8!9/6YA5I<)d;j2G at PKnjDG33OarG`Ygr3#"oHmth*r6ji,4;OBeDPn2.uCECp4-R[$,*?2o6JQ"")
+%;,=\2PFtp-rg\6<*ne]]h8$YX":8BV@<.rinhs:8k)cM^j`8gQ[DEI-%PKUa)a%<53NcO"Ol!]86T&+X*^Q2WZH*,"JO?mO?'8'h
+%q(<VC!KM-@/W?YLbVlkQIccqW9"'pn;'n;)31X"WNe,=Gph7IcQX`(7:.+guQ&!Ye3,]scKmHa?:5HTll:cap4FPN`G.p[KAgQ/N
+%IT(7J15 at +XGZqai(0bdW7u\dZ8>>:2*oudQ0;PSP"k(s76GpNhRMX`k."UFcB4/TM&C\''$0sO2nK%@:XWqi$)-V*F-<Ub+>>jZ6
+%ej^dFBi>D at 2Xe!)E]5IcSD#h*;Ft9;@SQHp6Lfua3JS0fs4H"k*.f$44<W]nD"-5]lSq5Bg_<V,iff&8/"S#=2&]2Re?K_G!QJsH
+%!qm^onlnj^'Yp2aYtC;p64,/n2#NMgG;]LL@[TUc<)77 at V'S_Q"4/3s&/sZrS5o4!g*>")>^>YFoUWpJ&Ju,lVl';G]=&tp"4o1=
+%P+S41];<]+:07rnZW!#Xg#KDZ*T.muYHPnj;806H>Dc\8'e'br41knA^<'Aa\d%Yo<EPQf80I8uVZP%I1)-RMgS<_"kt?QAb3rd,
+%^"l6jWNtRL at i9!$f+O"a6*:_&OdUIS0$/%5Ke'.!3.+qp)\Y&!&A-)`5dk9cWi`R7)*,PRdo#"Cp,kBKZ"hOZV.;$S)bu.a-$,A]
+%31*fb[$-a\0;Zgd at lrj)BH/.,=lMS,>ffR.F%`td9.u<eP]4*Na;1-?X>g at 8Z\($7N#WnoZP7^F+JQOYZ\sj.Hj[3m4;EdLqC!"c
+%!;AZg\#)EnNDjRGak=oZn&H&AE9lr-X!BZ[Hp)Pt/l"E?np7o5"09d66X?8G.PYn-r([j'8"CR&B5?<L+IAW)e?FOjGhOFh+GQG7
+%`1mgg,><78TN2U>oqD(rNpkd:%rkT+2ZkRR\P]S$Q%(Zoi'G&@7c(/C at jEej4AUe@QQ^"-r^\bOffh^GZ*5?Q/\&c_/l:c!*-6-G
+%8YLZ%@u'AQ,7]dMcVrkT/]IRr/J_e&mRsCHD,kn*QWHO609q_WTopEE:3*Y:foBU4o#Ea_\Z*5GK?A[%AgjH4*7&6gDR*aS<sshB
+%BQ0?XgLkVlpEVtDAhRqB#h2V+o4"VX=h^r'Z?[mC^H>.$&T"5(4$@pgl2dHR2S8fJ%P&!6#mQbPPUqA30`@+2j8tG2N_=7F5hTe:
+%KEH8s7obU]].W+-BcgNf=0;'=.r>&LkH_+/e"kq\5=uE08_L.JlVTR0ltn@<X[h)q=Vk]VqRG6!oIGi&ip;ug4N'8jp at F9j+[/QN
+%*01.#9F;oZ"otl0Z;eG%?Le>V:/D-ihKZ?R?ooIV]PV\kGk)9c<u+Y"I3QQt_W_1'q4%:S`F:65e+#O%Q-?'nZGLcE]u/<aIQBMR
+%7X34=1o+&VE-502!Z'aO$&>>O`<e?@]qi-S7Y\`CJL:e*!ig&!bgZWSDLG2GQ#'q%BhGRLKP95Qb$/-camE,Ck#Cal$)',KcC-/]
+%@'fMEP(V4AdRk/rc\6%&"0r6>VM1AhR%c9i7[HFg(s6R:2f5TI%jj*BGiJ`5R*=a[='nu at T%W(nQ&o*J\!?!q,6Qp5%apb4)drpi
+%AQ>:_Q*BsQ6DIF`E*0cO+"&J,rM,M_b:Y6s at 0+,6Lj:G5jX_Qh*B>Gi=f%(kh`u*-WN6ie,`,p;V/eP#Dh;c%S_X2p4'=0"D?l\;
+%f)c9u%F3ci-)]\QZYgiRnbFpdi_>#9?i6a at SV'T^72='N-?M.^=*a8Z)'k=7Ln\.dfG:Hfe\';e9%.QU*NNH3_]L5- at 4BKk`To7'
+%?_Zm_i"a&@9`n<6EcHniPgUf=XXJK_$:_>?[n3Z]8'U=.gbRGg$qb7YH5Goa9+C6W9i=ls:>9b;,WuOjdP3flN.6kh.<]9,[j;"n
+%JssZTAtid/n6ft8SLMYuA$*WNGeDJdpaQ)":TB3"FOA,.6fu7R7[u4e[rW`D\JNn/<Rq^F[S)KscCVXgaJan*A#fXk,\n>N4%W2K
+%N4+!n1pZ*;_bgp`a11SD@]N-7H(.u=gOX2q"DUOb1lqNpaappIC"7J at o72g+!+PPQ^GY1pVp9N0T9nK5cBCsocW1:R84cj/r%:K+
+%q]`Kaco,/]a=kf/i_HNW/A)`D^eU69N3J\?AKc4Kq]m#A1sdRFp&imGDj,St4pVWVol/HG<59+?D.t"\D,V'MP0kBH,Qh+h89-Fb
+%lt*V]KApbBml)q6ESdDCJdY9,Vp(6Un5qDRG&q?TO at pY-VilQ]$C<,pP3E1md4Y_\XT<Bto*g+12F*&1T\Mfo&PcDT.T:M]PKJiG
+%Ue2:+E,ToAmrfL.`PW<m=I$=<1 at lu, at AR3i:+$@tC+<s4T-2=Z*g5YR`KM<&pJb%iUFo-$UUc:6'=N6i:bL=H0KMB$)teH!+1KM$
+%376L]QJo=S9'fuXpZak/R_m]K!NO\<kRnkd>`Pf8&s[5)/C6$CXdEn-:+",/.7XW!:n=K, at B*6p*-EtPF"f&*`mhD5?D?F8<u7]9
+%Yt:PPB=G%mD^QmdH9/Qn<?3%F*`/RZKCk5[`fs6),cWI>cGG<n'Fd\F9=<4hE.[Dre0G8jKrH1OJ1,qS/"pK_4ZK.<\hhZ\#Rlnk
+%G.:kqW1CR\SiI7U2Q"?.]U&K:_,Xr_<h#dS`Aps(S5cr$mU"T5EjK at L4gQ,8QP`4>XX^[3AqoHd<jqsoS#BnUYBl53kZ5]Zd_7e:
+%$_X"$,Ee."T9E/4;Y:[K8ZnkH at Pd$@SJb8J"W/ISo4GV"S&E&/!ru:7(Et;6XL$g*Ojs1XR1*CbCESL\&lmo`WW+JH:$esUXRms1
+%,'1ftWI#EA'`gp>fcUTcZgb>H-5t-"'i=7;eIIEEH1p(Be>5-!O?jkY[]"kuY'-HR%md at r!1($01E/EUXH4oQ8m"$C\t\@U(ql,W
+%:2b%`Hf=77W(CkXI.QI)kTSCWLj*9eV#g_,S]<:6<:umE-9p6Z1:%l-V)DQLJ_&D9*EKL;OX6)5Tu[29.GI(mWC5Q^nIkJs4EE3*
+%YS4V""fidrj++>7DmA!>dr,(@re"KC]Gg'HOqC?([@.jBclKK\;q8DVEm=;L=W#BRC_6l:""B8@\SsC\0rW>G:W^WfkHD!V7sPeg
+%=tR"ejlHn:`elR*1q at STk?)B->.-(UCd>2594:JiVm`W'W7B#Zi'L<e86;i#33E7r-AitHXZ>eb0s/kbMbWakNET:<$1pD/Mh[ZG
+%M\J=TU,3A3K4]oiAQQF"S=Ah*o-L6QGpl:Y7'JH`,f1\?<B1qX"7.C0W\QW0];b at 9'NR:jD.M(mZJ,k*62^4L>S@%9(V*+u>*V6$
+%;Wi1F"j\WMY11-YcKs_`B_D#IBXK;=!i-KET!MO]<^Y-o3IlVdYOOF$)9t.,n]h&s:$U>R.-_W=LVT0L?9LXY+1%+L.unpJ/.Nq1
+%%s!nZL!B<[]KfA,f<,YiT at 7g_n[!KtC(B6kDPE?qR)LDBTe`uY_Y+U#Wss<.eOd2=k&d.?m<02t%Q5q"`\A[<D0Ts,>)isFXNmqO
+%&0j3JKfRs]OPakA57Stf*3q`WhSGO:Fp7(JO2L[(TAkCB>fb^QcU:*r9r2jKW>7QEioI9C:HQ1iGi7ZW</i%RQ8qsc4b at 258nP=u
+%*D)HNe\4Mg^l`6X\-Io-Z$PnI`AV;7E;%!5O-!)C=,5UA\M<82!E)RkMJYHI<>CGOST:6'47f-3Yh;K&?00A&/XX<p!]"t;3HUm6
+%[.]-pd%q at GQQqO'8+iCOpl!PR6ZumTCqdT08p/4='GY$>9`crX$6&[h],uXP.L!lmm#0TB#>a(t-/FM-W=crI6nK;ZMq`?e.EF:N
+%l5ooF*UJTsih&-C.:0t#8se,?k'q2G2.rr,#,8k\E:UqgOh4oUqlh03,f;?YN63]F/"][tB(7d)&MN=i'r)2b,+aH05$:nh]O7j:
+%;<QC/GI^%TS6TGeC,5BciY:W='fcPTqR)JufTrt1*/Nfh<0MmP=^R<qr_L'Bc[*)/(7+>jAjKRG(`Y=LUV%03M4UA(Kk#s+a-7e9
+%&Hm^]W7U>`^F.GhrEXP=Hi#/;[$)p?$-*?sd!:c_mj)gcNY at TqT6[ll*8>=Q7Q?U9?bs;&T&`_^CoG?:(>154'P8ke<0R##A\?Nh
+%O:5_e.L\H-_o(oD3M&,??qH,a/?17a4Ba?u/:J#n;MrF--cc"50OI^Xf%oab/qSe_T1E'.KCq\H$VVauP^1UCJ<T/s%O#V.fn#bL
+%30p/Tk7.=Rko(/i<.!;1K>"9OKLX)JJH]G&=d4G6Zd7r,.Ud,8'a[BiKe#8Xi*;V0TrZJ.8s:/e+CGAiY#3q!A04lo%oXG#b\Kb$
+%SE6A-eRc,nV$`a/<=@Q3#=qIp&hQJ6[li!iCetlhU,Y7C/pS=3DtU0-oZ7Fh1qWp15oiQhSh>rhg!5%lX(=RWN(^!mR%:L]8)Iq^
+%i8Z4"b35mOj at .QBF1&^X+t$kT*H^bZ7E2p75%a8h`l2W]SGSL_h26d^nUdlG;DKi2!H"$#9i`c<%0&.ee=6#)<f?%"/ImaW$eWIA
+%h`\`1WY]p0C;nA(K>3Vd:HHlZ&bNo2(nVKHH^C-4O?@ZQEHTf/)h,EB<1kqbiX&N&-^#ncZ)j6?HKTi+9.Z-[OqcZI@%Z8a=[ilP
+%K>_^7kr1]#nkF"E8%fVTOu'7^-`>HE<t<]>2of=m('MOR]1j?U.qVS!:f6NKD#)uiSH(rYW,Xa=p#[JBJ'@N;Sn?OD#(W at de@[e7
+%Ym,mH(8@)O(aM$q^a3asbt>e589'i/IT*Z*i[&9)S^JM9FI6*h7,Db<QXL,sk>Zj0nb=6d\geh[G<4jh/0CDK,?TsYpF at q3=`;`<
+%.+KKm160gEI>cZ%Z[!4&ZK4YuM='fR(fLhaAZTG)r89+IJ"J2^GcGSVgSt+NF2#0?5pikY)0`"h[dT>CCco6VB4s4]!HY:;'PC!7
+%b3.bXj^alXqR##,]NL8WrrWMS06Zrej?d*BGbmo*auSY0&P\2i#<h6r)VK29,1n+6X)t#@QE,DBC%J-Wb\4bR!!4Z;9:ebQA2=i7
+%D(TZh0f+?lD9*?GOO3D%'Hu##$3R3NDB@(Ll)-fU,j&2R"r_;cEdfG at Fib0a)Ge`*ElADLdI=aSk^?aHHeI4#<`9doWcL3>UMtmm
+%HD9e#2`[-t$;U-\kcq0KOM.:E_8@<Z:XuHM(UenRMOhJc5-G0FfM[0.O!(L!:*:R"ha!O;mPpk7B:l(+MM86$W#m';()KfYHbV%1
+%&$E]8_'T>e_Lg#71%JtHBnE[TncLb]M\:JdPWnc"4 at iCO*>bEFclRhfd$q][X&"_*\_q[p[=b_TXbj5C*:ieh3!XCtpOS_b]2J\4
+%\`hD1#flX8-$koOYW(4<=;8!",+HS-!T1DO=<phQis,]1dlM]^Si7&rYJYAao*C,qX!o$;_eNg:E]%cAF&@+u6QIA_,k__[BN%C1
+%]FDKG/E:^4H'0XFSk(*3\$gP&^4G:]<6V=hJd]ROUef\Ioo2`PYe-8grPmK+;i8#AQ<d%I#^8/49 at PWINMn*kUmJ,u,(NNa`!=)p
+%.Q097--!M9h=/L/=3T91S4-UdS=XBF;SCnNYLt:/I'P,i:$IN#9(91%DGDW#dQ-iDgK/t$Wj8sM37N at 3\QQr-#W/q_!com*7U6)A
+%O:W[XUEiji;_7j./<RjD5BGbSVBuhgkfY\"9>C]*D&H$CFr`^o%,hf4#3RCpFM at W_*-_&4e:ZiZ]W?$VNpbQV/orW$S%[BiqN`0j
+%iMo7N$e</^8\CR9g2EJAW9Q1%WdC8ih5?H44Y&B89a#Bt*Sn7dbf6>N-T]>t6Bk[\5Y!.:"-<Ko]%FD^k%:T]/)"Si$d[3`FB$oN
+%,%!IoK.%NBCfX]f*Y^W88XqH,51u75;pj^7_2fiQ=3>$AXZ9Y])-$?1=q7Vm#=#Lo!t=(!?Cij-_`h(oUj9d,W+dYj9MN6J2V(R$
+%D/&\Hp#qUr'?K)[?'hlpT8Q(/j)L[;.7^;oS3)[f#eNF>@c"F;!^ogNMF3iXR;&nP.RZ:=$_A2XFsqN*,j[-hWpMh[R3jL"(Z5Q9
+%O$c@#D;Q7IKCP>h709#-/H:Y.HhIDg_#GcGi;BJ(G9>]@Z+g+QX4o:VnK6Ums7#a,#QOS.rTi'Rr6&I)s7u=0qtjb"mFuP3Idt2O
+%dr0^22qQg8rS9,n?\Q8/cbKIV^O&+mrTee9r%+qQIdr?2He7S=f5KREIJqOgORN&Es/^/,9=uqBY>bGd/_q.!ie at F'lgN]^YBeB!
+%#cIDCKG9GJ1#B+ckD+EU6=,*%fDXa!nb0\5O.Te:IJ`rS5P96hq4dan5(366h>-@%m@/%nHj<0VqW^;ZrUB[MpV6X<\)72\h<V7o
+%s5EsDk?n&PnUL;jlhpK8s*[#tk5Li7^]2[\q#:8RDpGi\^4#m=HanNI^]2P;hq\6qTCDjZTDJHamSEcQa5?S$hgP+ at J#n.\qjp!o
+%Q+?qkf0=OdrT!3^rqt[Fb5]m3(X9GhpfFZVs240kqt3ag5FfL'O8@,urqQ:RI]2/:56'cifAH4IGl6bi^Ua3QDdL3Cs7H$`CELe!
+%QRqfjIeV1'Isq=T9n33BSt:E(\)6g:fAH>sYJ5PXr5SL*hqii%mbrBah_+NXiP*N#oC(T8jB]O'hqik[gY[TKGjTFmiJW3+ho#Bh
+%&a%tX^?ojQJ,TA=s86`sCS#JCX8hbeqXFB[&*G6'?:p/d0'$)@f])hbJ)CW>YMX_Us36>qk,RmQ:Ht5]rhoVhbm2#NH("T3q=j"@
+%pW$#+90YYRI<Y]Ckk.]Lr8"\f^&-iV^CS)B/<W*lQ.(`OGrZqTna]*Lq[UC3e8XTc`3Ikm3nb at Aht._+2=;Q7g&6uhI<4l7o8nCj
+%r#<`Vq'Si2oFq9#iSIo4`_X)8lh]SrlgOdY2 at 0'AjZWS,GP>_PGl=i'omco:3tSBUa3Xags30AGWfJ5^=F&]nT$*[XHsrX.U at c(D
+%ht"7+qtBoJ^Ka\9<ES_)N2c`t8%TbqYEn3t/DTlDs5D/ap:.s3-QDp2a74H at _M>62 at pKatij+(/kbm<foWK?#&d7[s7e3agh;u$(
+%LHFf0!kIdPScAZILW<nSp\I\Pl-J5IafabZhuCF)"/#J^s7Z?hY.sgXs7Yihp[c"@n+rLaO5JeYhV\(j5Q>^&n.,Klq$/Q:i<S6<
+%nV@!cG`0W"n#o6Rqt.L=?[_UfqM3p4"`P8:rV4,(a.N;-li("Z%pJ*sDnk[aUpogThtk+E5JH^bk4\h+$O]1F3>UJdmZ1GaiGMu9
+%GZjIlI!EB&:Y3T>]V?PiIsq"=lhU=52tAu4ir-frhYG^RCsZmW?Wt(.o).6lAM(Qrn9En^N:hu'^q8T,Qi$[Kg:arhpM$+(5?;[)
+%lgn]XpRb^3q5<]MrS>)pO2_(_?%)<e5C_S:5KkeKhtM3+rRLg4^Y=8;=MK?sUsC3=>C-(jO'hhfG5lhX4SF?l]&)+ at rHhV9)gf<i
+%=8.JqplDVqKK`c5V\_K[j_;.%nE0+fHh6dXo2BtHQMC+B:OdLI*fK^aLQA(2s67#ch7NOHq.Yms4h^Z$:5R5i2`Uj0ROauep[*/H
+%k2e2+LEE*'S0'jGlLE7=rXU*Cmc4,Rs5XDIJENKp3?iOnYND+`Xk/'Co)=\$m>I8.Ea_2GjEXhPDgL9VTAK%eHteV5DKc$Eai2OI
+%rq<UYO/qo6Y?idS_`E9=Lsu!g0)!9Q=+Bu4/_B%KGd+BCm/2-M5/6:@=7]YY>-7P>H_u at Cjf?,j0t6]#:KchXp_7%_N'HnggWPY'
+%IPX%h)u/Fa5$R.3M_SK7oNLBiHTcHIq6r!dHJT5Eo$b56]7)[tUMKbsB=u+1TATR:GPfc7ekpk+LU"Tq`i\?dTmZB8*qm'+gQ5e:
+%Gj"o"c^+8%e#,b4F=3\up%]+Lo#FP/o@[Q"27M>H]7"q7DsR4SIXU_om-E]4qu,XJAt-Fp]AWKn$ho!oqTZd%5PP'$hU/7as61nl
+%GX&=jq%;F)S)aL3>N7[4-^XMP^OOkms5*)5j)DU at TAc[Hq!"Ne\4.S!rDO,mg]*J.n=*2]pI3m5Ztpk8DnbuQ<sgYY]]VLtn`Si9
+%^V&gqd\gGu?HDd'f,2Z2O$E(^TC:b9LLGV$2E/nS-bK:*3\=,d1gf_c/,I+Nr^Y1Bmca04EV[SMo=O&E[i@&>M[Q(Wqrn-1g=5ok
+%=9$kCrj7oNBDR>BqW^!b359`;^\pA\?h<lMroK'=rR*MEIdJ(kTR["<_rin)\11kWPK!CoNVN-f5Inku>Do+3LiFq-mb9CbT?\,L
+%TD>os?i8jX098nRXOh[1k%2&M2SYUHlg]^J5'Sdq]t>DY_:(>]+2R6apNnKQQ$NoEe"2N]0,O(+._cBp5=,GCI8=k%4n\5=opa8C
+%n`_3DfrWJ#3mgaE0L,!aPIZ'ET_RWOq4I/uT0pKe"aiX&T-;2js8;BOA[Hp)hNujal:8\gePdgTZh`l>7N;)_U5m!<rGDg\n]uDt
+%5!8*HgnMOP3=J]>`QGroE'/L`TBH1On<%tg#l%1[H2R&"bOC#gT2N\,l^KR-r)6\8`@(;?6I3,h>*CVrnXHk6e"<qN)2e3pq&;)E
+%VmehHmmKU:(\Ht at js&'WPP"kSmU,%H"HA2o_RjJ4GpfA8rMShNL<!*anG)7KQV$2o]m]K"r:H%7DY^Y4Sfa,f@/Tq5:9T-=bNHA4
+%j at .CeoWu;]]$FG6+rV+Z5$mrq0:mTshscSJ^:8a/pu<I:poeVn^&IlWdsT<6T#1$pqBnEAToOKc?S8K at b7s=]@=BuuY<F=U:S7=u
+%'`%=_q"OFOQc?)Z]Uq'Wq,]p12Dono\:8o%aqq7%^HT<HID5KO52lb*e\Acnl:6'^'g5C;`togT1%u46n$fuZpmaJEkfZ@'+!3.a
+%\qco'd1b10;>0nW#?ThRC%(YV]Zc=!?2s)XfEM<.Pk^C?qnZ&g_\_P9rPS[5FQM?@s,0tQC]c=kqq27(`jS&qK.$$`_M*F;h8AW0
+%l*0<6R(hf6(&jV.lPVmQU&<Z&!WDN[L>U3Js*sjoJ+H,/p1HT)"MQDi]__EP]:U&(.0;`3Wd$A6j.G2cs73r('an:(:#pEql-6,m
+%r``J%puB,=<t?i;.hW?mo(9V,mZj\gJ&L!Sr.WbtMnd\q50(f!@VWXW(a-Q&qNl-sa=lh6n(qO]3/qjkSJLi1p(D]oS)`Tp:D`i5
+%X3&P7`g at gEY5A+`1PC4^LmfWVp?j;0nPjE$;$-?C4[4DlqSW8%531r<5%jB2^="rfqVdKnYqKl/pIFc5B`VR1iV5Z;s8!@]r_+G]
+%>.pPfA?UG/*1:'G`!/FBWaEWNcR%OGi9kZ.p5329JtI<:T-Nbl+WnID`rF?M5J?dJqofj0Sg!Gns7(/76#1ldJt?aPiDF$/q#R*P
+%rDD8+-P&<6)0kf_:0n$#qg:hKp/+?hPL&PG9<,\-EcH!].TbHX4W]Vn0+KG.]S7QPIVEsJ8MB"`F'DSseQjYc3I%s\U?WU'M2l.a
+%9A`NL(#,L_7[^hBV[cHlaOY-%J&ir$YZ8DliuLGNAt(\Wk#2uN:t3jCN9o5rm1a"&;-bL1mV';HT_9uYbM(.rjO$YV]'NFGMR:RQ
+%-L\!-Q>'Q6q71d`4.7Op@<])&b`9GTmD0:W:sY:Uh&df<Fh>YfQ<WWGVS4iG6rWBZe0HJ3ChIT?P-h8IRCG&^fMc$r/*D*<6f(4B
+%pR:HfMo13Lm&Pp$Q)dg*F-#WF`C'%]Xtk)I20CpK?n:?QN)OI+R8<Oa8K6r.\?iq1Sbpr8h`NTZ4PqCI?:qe.HrL2iZA0K2nW\Xg
+%OhB%F)e"Y_ZJT;dUKCFN:S(e0]skNFQL3="r(ds$/ucB:FP688R at JOh9$!Pr?59=i5t2(_gD&1O:>0$\#>j6F0\"BHJ3bLAOcmtU
+%\]AtT%f:.D at Lg]LASG](@@,a!ij$R\];gZ4-,?`.FR?Nt8)#SC<uKh;+Pu:SVpp.l`nLU)dh6">)bR).C9K*%XE6qH`>H$9q3ij7
+%@5nX07t+.`d^g+Y.6#B*7QcDPfOM,nD-O/l8t)qMdhl!a7YV.nM^/QV2H9,AfJbf8`[MEphfGeHc#0#UNa64Ndp#_Qh*3hO;A+dY
+%lHU[Df8sd<&!hY1A6"rKr+i4%IqGknpK((*%ggP6-d#ueVq`1nrD8HNSI.%A#iocmP$a]L4WQo'fe at n4V%oOPP@;P9?5EFsVp]8M
+%Be4.LgUXgO2)j3cO$82JE>MWcA<<(,<T^le_cUcG:m#<@V\?D(JdbDD[%U^.T3c[m*jC<FajE^=l;mBZG*[ip[F-$K`oNY/*1ae1
+%ppcOuH!MbpdBVamg:47hMc)d2EO1^.\_6*NYB6g<^WsEG at p@K`B9P?VO[<QY?8qOfS;F?t:+OVareh]fR)Mlra\LD,RVce;1N11&
+%Cs79$3JRiPflldT7Ye=j]hcZ!S]/H?XZ\!OUg/t=U8R^hKQS]S29/"[;cR?i?BVm)V(Zl"QZK.hb',GM;?b,npuEH?3G]%eX[b,7
+%\3%?@TDPU0!7rPJH&oCs8kH>0['hG6AOD at iO;7XlYOEs,\c=[lZo>Cmn-qfX*f8ZNi$+371$_qLe(*Q[;pH64\84m&=f3``FXd;i
+%AR)AnM_@[snp%Er@!gDQqibE+<<Le9/R-rrIU$`M`E[#ARi7W\4jIu4H&9ljA*c*3WCCmlS(#D>%MKB6.*N`\_!7)KG-4sPgTaD9
+%\4GPV$>l*1F at fCNe8_bL*c%`:X83]Dl>YO5oO\pTnZ/6aOm_!GHIIFa6;6,#4;qIum"eA?[rFpDnN at cjc:+%9<Pn5sa/(DVNMY>T
+%%\Y!-[9&,'92VH[ib(8#S\M,BBshPH3$fHH]6*9f%n4>aQEg[j3mTg-S[U4#<L,<u at sbK"FgY#heWIeiaY,2<V1hRuJo8K]2ALMu
+%jA>l!@=bmbG<8&[ep#tOGq]Ifn+);.U10^hn`M$d\"aOFCeC=.qs74pYR-:sFfL^5jcF#75UL\P<o[:;]V6U6A9H$W87%#YPTuAd
+%U6;`[D<t?t"b*eCbMI6Q?@B(fK;B6%qfXu:GUa1VLFut#]d^&VEnco_GHB^<?3X2s-^fQ2ajGt<^g]?>[lDUN<\MLjrpPUAa\'la
+%P:!1J\#p.Zi\ZMAphaC(+bO?*PKd.J7A7kF$Z2<;VQ?mu7V at r#^mUhN0YC[d9W4\r*cd1AV[Nt1H)s`*AJNOHeBpmCWR_8=.E,-n
+%p<^2[5?#B<EDC(Bou$TI%*(B?8MJQ`;Ud@`nGAHS$B/Eg?2IT"F.cAn;X'$QOL19dgh"\LP%okqA:J&i-.U,u;,JB2Xc=>tiaT7)
+%eaVF.[@_7q(+$@'M]5tIX)<FL.bbB$R$c42b20%(>?!7t+-N)O5L6YIalLfIAPaH7N&O9rKoLM\Wf?4Ra'icm/%=nVC/cJU*:gkf
+%H)N^/n7NA(AT`m^A&PO!(:G<FUgVBuh(n.nUQdFp0(/h<,I#t!lrV;:30"K]_Q`=)e=8m8nf"-CF4kFOGVqM%3_sT`K;#$Pl4TR#
+%<H at 9%DjTjpF\"tWQU>4:E%YJV1pdCpXV9q&rrXHBKo[p4baGQL'`j:#CL!%-9*m)09OaW'-bD4 at Q^u(lSF5FsZNDT`Sj23"S6Ja/
+%>H0-8Zd#jOd;3M42?bi:_5]B7egQ4j^n<YrJ,#e;\.os(lV<PE)fURDYSUAALcp]$SR/`W:-M7:6J04(j,gL1E"(*p;eifWFqg<7
+%E=k42(SRdu]Mn%G&YXc:@FYYCnj#ajHi]@=21f__'-]*TG'10\FU.eS,8S)t2nlnO]WL,>=cKIlcg0(VB8m[\7+ruQ(Z7$k:1':\
+%AjPP*GPVgt:8h76<i]Mj-aX%@fqU0PK01nt!AMXD__0q5"MPIc8S.[mO:t9]oSYLo&ca!l4$3K/PB>Lm.'*nj&k\Zl/CV<D%#aG<
+%-jds7pmne(6rA(-j]-LJSE<clF#DML`NN=-5@=jZgm09CD+H--Z&.!]_I^#EjTO at oF*f[m"NOeb_H,)/>g=ZC4RmPod$]?@[C<mh
+%\=fo+*a1HlG)`4U9tKt-J?)T\=h[P;Cr,_di22#DpekrMdP`C6'kc_rD-r]]CH,i=[]`h&7IgV$8suE.^a1[g0kaEj"i"^p,Df"o
+%^E.F".3DAs#uCk@;;c_h"+Q*[*GXa%:ZU/lkdb#"I3[hpp_pG)CnjC2P9'96@?-D6<@:Yo'0_au.UEG&=_/Hh<@IqlK.uu(H/^UT
+%1P[a0TWV5%H\H6n at nK,oB0?t(OgAVZd0-bk4t^J4L_a)#[XCi`L:BlJPj1RbPVrX:d\;t]4;D60)_m at 62J(Q5<^?f*`Y=\+QEZU@
+%OQWj#oV1*>%)n<f602s&i$l-a\Tkq7^DQ2C>9<N=805V3dW5I`LkR+fg^!%ek^l_LO!j+LG%D;^hpeJN;C%#(*mM=<\g#R^rT".u
+%;!kclfB#]L,=&1g/R0H-/ukA&#d=E,IDihei,6[-cSS(\ZQ`ah4j<B16\-7*TMI?('A;KYFr[igY?)P5\#)EM_E/7(T2Qa]X6da4
+%OK(p at Md=.UnumK^6&[K4VqBDBeYc>?o2^n:,`tjR?0i(W8O^Pup;'\K"Fp at A+YA?SJT>.NK(jHB^)rjI"#lUdm.&*@?4O3!HA`0?
+%MUd;'ZeF(o at 7XF!)ub]'NF[%\PrVX_,IE`i^2q=0(@l!&'Nd=f;U.V)WB[1P*-!1rMsQQVZl^CUmr8[mX80;2V^cn[bWW'-3XOKm
+%_cZRX*Ir0SnQNFQR8t!B]i[I4h)`fX_T6DWPT8+Xj#O8%a"&Go$&Y/a//KN3+C'IYBtbKWITF*(eQXA9+fQB;W$V[jG";9;p=kiI
+%'9(LU<q/r&Gt?Bc$tsh*mqf,KNi5^BJW)WT::a!60IUG%j/,N`<X/ho$mG?mKi/#<B-m]o)dbAjWQmRP6U'g7'L$JpYUVnneJr]E
+%.5&bD&:Fhf%]rf&5M;LVL!D6gHZh?0EfnrDYae\Mq)1-IE9ntS+96_Yr?mBf6\FPkg5]=$0!>NUE-)APe`)dVe%)J;$k`^kNPH"B
+%.Y.^Gr0YY\D?1s..d<H`YnWcP#1DsP6iSHR0IGX<=>.grg4kgI];!#toN&b#;,^B9HL_P;)&dKq%@7Q<?QFo[Ee7IH0LuKQc'XCh
+%FUCdB[sac%TJuPs`(X_>@U`@4L_-TqXX^5A.5NNC3:nT5c>DO/*LCFY#o6`/Jj(kMOoUZ0$I1`(gm,XEe3tN*=Zn(2iT'HVd^!%J
+%E\d%!N`'qWQ[G&8E.J-1i0CD>_MZGGC6BfG6n:LVVQK6OihTtD,X9Iq(mL`0@=';2^agP1Um7ai8uCH']]>s2YO[i<Bs&[^@lkBn
+%5+P;-43L1E-1p2iH)`"V9%o?H/KM1'fQ3 at Z*IB:q.9\G.AYh%[`#CW_:$^ZA,Mm6`a(,W:]X_cV.\@<[bG)/rEO)0qfP at hrJV*R;
+%6<6QrQ),"S(K%H?7:$U\6ntJ8`&&f\?6LP].bT?ZF`m9Qe--G1%V!DbalPI<$!$"L2DUUbqucn[<aG8Mn'8P/n6/?G6R#GMA6#ml
+%E"0$JoXd'sY&H4#KZs0rO/*sY&E'FM=AV(8mT1YIP[;<Vbm/jQ<B)4Bi>XHmH&EIf-7nkiV+2Se"b9bk9sM!E3MGj<dLMf%pdV)!
+%'tObR+.Ppk\TVG at F'__?#JNbj'ureEF'6eu/r%UoXdHD[Op6gGe4Bg$<G[/iT#b8=)j9NWW/Uu&&X<hV^h8nHJ`fM at _+IaP".ki5
+%(//$T4$+dspNGCIh*n"cM9EJk%YrFH$Ct>(1`C'X9%G$'X at PAK$,CfQ1*$aO1O7fNZA7cP'5Z/k,$FKO-F4C0f',J:7VZ0L^,5 at c
+%EHeW4amLKIgi6=OppsufWF3"`!7JcN'_4-u=YG',Mr]?H"Z!PERDh0,KMP[:rgEQiA20O;OA=+8>6]YM2".B##S0N&e]nPRpeu+r
+%&ZR%lG2Rk[4EeqWiDU?;:2W;%H5U>h"6ZWbL,8j&P-602'jujqMhs?2G$*:qjGj5W<K0B-\O]'5F]+^hq0U&.mh\ahO:Mfim+A;E
+%Hc6k7[S/]$@DF2BJ?W0FGRr5FT*J.PWtN9RS`/9K9c[+QYq=I;- at p9m.p#A/=Ic_qQB-g6)rUN`&(Y?P<,(cK-/U(`DGjUb;Q3Z<
+%WcY=0UnA^/Ag<MtRP#g6^pGI\7smkF%%0qGnWQ9>:(I;/RNXYS`$@8=iP6e0`CuXVk*c;JahZ<r$RY[WTXdYD%9jOKaNj*)k&I;?
+%XW-sie@!#H+rF<5d]SZ4Ci\<7AWhQcZmfB,qa`u(TEYp2Cm"#0U?$T&cqud at JOXq3GOt@#oYAJ#(Kl,*R`$)qa`:-=:==K%)<6nH
+%lK"@+Z^@1[_5g4]E%%/+ftK^]*=pH'SL[dTH3(SuBj-0_,sgff3:E>8OA1Q<Nu3-@;u#![ngW%$MBe4OS^o5Cola:DT5mQBMo50J
+%..Ba2A3G]_ at P#(;8.K=0NQ)ZO,fntV'@2&uI(Yg7\PuEPM at m!^icDf(nntY:?/Y0Am'/(L<<b`HbHj7Kri3p^>bQ<0:n,Q3GlhmV
+%fOcG!'Yp./?m-eYXH<pkmUJHC3KEqn'%[K\X6FP%_"X!F74!UCD7WKnLt1YVRsN`!FiK<.Qd3\2a.cZji(<')#<SD4P`rULhGL+*
+%>@_PA43eE`UXGa:WL<W9(.HlZm8?8(Wnb'T#aYP)?!?MR8Vrqo@\!Quc3?elT.a1Ejp;1KKFENEXiQL"gq<8]^g at HQUp/Tg80YGg
+%5QNt%:dh:r&oF.^,otm5a&U?S<HSN%88GrU4$hj#9gAa2CJ9S"Md at l*PCXu6P+3Z,-S3HjCESa'jl+SDR,[He.?M.jn&-6.U7 at .s
+%XIG`gdNA]2V[._/SEQC!+R-l?ZP5-iE\0g78k<7<dBhW/8<#Y0Adq]0%8qh<pIK]aI<"A$(E"L[72`+omApm+"(,;P6ZU at T%V"H^
+%`R(ou3L"G''*?f6aC@/djD%;O6pOUD1>K:r.(PU,*'pOO7\7n_<am4)!$j^-H,5b;6L#:!O%K0_ililBS'2aKD`/7AGX1OYDRln@
+%ZW?u_\&:b,7$LPS,Y8L!"mUZs=_0QrRrs!@aB<!b5OKPI*s'rVX-r-M-Pu:rObF$*>n+cI=QgY(fTM&@3Cf8&*<T`23oSs+2_CU+
+%=JHE\Ygl\)h6`>F<7&HbmdR5IK*f0p+VN6bk.t;#$;8MZ[5<.IaqlAm!dDNTnZ65)j;oXC9Eu`9kWs$LL50St:Z(7_d/i#BSMn6=
+%AA`#LD:_i/,)Dn`RG;f\N!o0.gY8V3gbFLLaIb2d3n9AR66Q(O7)g9IfNa%TAIfq#*Sumg^`(l5PU at ebNqAJ\P!#l3(U$I+J^8ru
+%25K;$-_<F;Urj6cmFA1Y6 at o#jGLnfSG&a9El=_rpdjhE]1J2iP1jt`]-KK7&ZHN.VZK9C)*SHEWV7X;N-WJD3TO#+H4n)Ai>D(e7
+%mR0jmeH3Mh5\.1N'eUnIjTb!L(gHN7;5EA,@@!3*AERO9CcL5!@;"RX:-iT^88:[4h55?VW,Hd=K%1:a/1iE1ordkN&%Mi6W`kW`
+%`WIGdBD4YbIC%Jp>9gEUrKF#s*k=khHl8IqEE7QgSJ)N1#.k1LN)Q"&Nl at 8\&D-*mZ\E7t$P;-kUoeoBPCs^5#PQ4G#A%oZ'20/&
+%fdg.OeX1!m!sPPEGE(;0U1CkQ]\p+":Y#P?ln^(7P\T_:]6e at t?@a*d+ at 7ADA@N_ZA8k6qVoEU<(?r>G&\noNJbGtJdLjYrMh"iK
+%$T7_rHX!?53op1#Rn at NT<No9B,";&.(3GhoS)j2c2HYB$a6cic#]i'i[q+`J7%jX@:5+\R"<LWXAgqFqHsRS8!e>kp;%-!]-a/CW
+%JKr88_e.gU8 at -?h4sl>/Rd"Fjb.+M+k:)Rl`bP<dP%>H9,^CJWkR3dpL:52F^!"jifgn28k[oUSF\Z*")W!a=<`oI(m4$N#Y:=j:
+%A=]:rZQ$rI2H;W9]pp@[-GjdJ7-PO^0%TtjWX_iLK%Epi>:];]e_p;1_$Amk2T)iAaf??%Z1;6qX&NKu at _le,DCWdpP-J7/Z-mjt
+%)^\e0=\"<fX0`>96L`r<gXP"'n,NR[Q(GdjaIm5&.77O^F\,3OB3<NG70oqo0QQV;*`\'jGoV6L9#FD at Dm6&!3Wc_f!/H64CbGsD
+%jjXLI%XcBTO4_:g2UKC+s'>$S;=>f*c"SVo03pM^&bK1+\I#8$:9H+2Q3H[I#`Dk3j4]/\31hZrN5BPPGSVX3fAtp6 at C8#>:!#5E
+%^U627R6Y5Mm,:TK$Q`ZXCu:uN<Kp<\2c!>dj$$&_jC6ef0Ii))Ens1+2Xsd`OU(!"FY%FcE`lnq.H./f(t$r?\gm)p at .I1CL^95L
+%VD=DnO6hV8hP-ej*m"!=)=B'$8!4(1S9K\((];@"WR]f+mW)IOjk,b_HCnef#.H%d^B')1T<.$YT(*n(Qip>"TP$3D!12JloS&j)
+%jKJ5!L`=8PpW<%pd'Z7$P0.N1L*7*&U1VP*($]X"_IG,EGOAUIgrYt'Fi5C;?Oo7FBa`$^"&H0 at e`C#V5F8?mbN"dH=UJQBcpkq`
+%n[?QV1usne&s;-W:98).)ji91EkI+T1,q9SDjFT#`:7pA"S#g]\Y#sA2W*0E@)<P6[,'@ZfIc#No&faWDW"/6Hh-,e=:VXRA),Z^
+%O&+fjM=L/V/7!:*[Vj,LabAh![8o@^8P3N<_R`a16P'EmCt7[P1>k+EP=JDcW!nIa\WX'kA+#B6n1RrPkrRQ\`6uhg)[,)h$@;In
+%(mtG9jP at sOlTso4@C:>p7.JaSCF@<8P+3Ym8qNUnBMPVt:mfbuIbS9Y(MS74XrdYGA4E35%4ZpR;7?TS7B2^a8lOY`lDbEn^uq`3
+%$IhJfWMqs0SVd-#"iDII6G`JZ2G+e949`2>RADs^!O%'U7c$`db]u:kHRUbmQ2If--FcXc\DR)S+PT`lgFO:FZn'2Nc2>c$.^=Ae
+%MN"P9j"6Y*D%2fIQ1<+_5Ao.cX&6sHA36B;1;k:Y*qCB%An.khG3G=CJVQqWbo at 6bKa/qoS&KAUc)qus.`'AsB$V3]7HJR#LUc3c
+%i2pb!6$(q at M?k8iK5s([=72BnY&,d!/o\.]M/e+"b1q5*9/4DZ^h((LN,P/EKBf)/cYSGF_HE$^<pg<Ir#TL)nQ(M+jV(]G at IjVJ
+%Fl0G]e/VFd;1eZna7b))nX>GbJ58MA*.EnB44Qb+fl at C*X1=G,ds1,r[OE15\VE4nq9!q^Ebe6SUdYbcS2S^&B=gm#$9X[ZGS5#<
+%Kk>&Q`XV%>4WQSm't at h#:5@#aN-6"Fi]IJ^m]?B<paA3o0Nn(<17Q>`ZCS&L<76dn8%UOuabX/XF:KQA"0<\q>nso(<TaAe^Z(@,
+%99k^"[iu(i?k7POWjP8!APOsR.^DSSp.\a]?=\aI;8A_o0l?T";arHE%SiBa=Y@<90I&TCfk!:E>YJDJ\Qq6V"^`]'%aS$V19b#T
+%5X:@/dlk%qlIOFM0AB(>./`:u`J5Xg(O/'e\q)+p707q0/;V_dPh??K-Et?rkt_Lu<`Ct.dW"&U$Ng$.m3e&gO6iIRM;(2A16c*R
+%Md$inJ:N;=HLe6*,i:kK[@X9EP10enR<qu-+U?E,'(RKADJAU>7j049*fFOG!74_l&uB\P3t`:mW^]TsIr^6?JV:fHibGfn:#\p"
+%iB$YjX6b2B[Lad*U"n%=b(g9qgj9Pnqel"-R2(cL!@#FUetn=SGY2k+J8<uB at L?W_]Qu$TTA.nKQ(M=d;VBD3*QMp:PP=1/QlgCq
+%d3,:(WVWS8Lk*IVeE)jo at C"FI3^kM6eR):#f*A5UFFcH1Hrg,VkmWBp<6A0.H<6c5mjc$0NeSH6Qe`>FCts.tAiCqb\do`0f5M[t
+%LXMb%Z#TH$*$"9bW\FS?PLaUpQstGK+g=<HHr:\j#(Rc$G6f=K_3!\HFm=?&A[<*qOHq44!MgIVA:Jhlgm6c3*[Me2/P(G/.8OZK
+%k&LAL(UXSbm/GH\f@@T3BuC`,>V5(['ms2(5G!%-:Pun&"e/*UH*n at k2S"dslkqMQWk*VE3ZLLbaDXk$j6%[/[oM^2*O+(R]rkL7
+%g2+>a'I0%tMbi'T$I2`5UrnFMc=4+BPGGRNNo-:$<1\"_F(t\#OdnOmK\M^3-<E*M%J2=7>`2*lM_\"D<N/XfAC0TG-HEuE=.N.o
+%cR`e+++(Mkm2,%3*&Bh^As!rmXu>>V1<ZgmL4o6067_?7mN0)O6PBA3eV\'OQ_X1VD?dPu-6*?TYXK1ZSRgY<A]*:m<D!k!\h!?u
+%h1)_+o<B,X!ST4R8%nh=pul#7fM:oQiZ^'Co3AY%$gj:oC:e,$]o-Zkn7EiMm<9VWO;R")e#43V_isfEUf2PZi^lr:Cu^hfi\d9G
+%*r(bh.``OME7bX_++S(lD=\mg5[hR4.:csRX>Y^L75l!jA+md?2gAi57MWoJO_gAG'Q:"QiA.+,*V=\W9Obo1a\-r+oSDZX]iXJ>
+%]L_*#2MHdup'('#<."m/-##7J)'@I=!$^;u!Z=Po&`cR at 8Wj'KpZQNoSkno<3u&N at Tf"aF7BulAaHAJ-[ObPYV at Wh&Y$M*jkYb-3
+%?u/Jo<2Op!8q%@HQ#N3?IPt7(YbJ&OK]fI:PsDsCi'qrmJW*71)o/0n_(qFYPg.cK@%af]TF=!cpoj2F8d_O3L$`0hB)B+:/QpR'
+%LrW5)Z4]6g!/FjKc^j\_\'%.Qe-X'%MM\Jb&^=Ob^I)?#BF$5G`7(d3r?Sc.'$JAO,XD'"oc@@1S3>pgmpO:]&oC>Q.Q6ap5EKbG
+%#G5G6 at PiH(+L8"mJPRD%/uMTH9!GEVX:_hrUOAT(Qc3L"0RG:%ZWeNZ.oBje6%o44RLUZE!.\&qnH69]LD6g7 at c^g^?+(P.$a*Ts
+%]*`7I16g/:#D_q`oN01];rNE6:bY1DnA(L9ffk.hFe5o.koR[n,0ope05uuRU4:^b\.\%P5qtA!@nOu3gQj\(I7,*RR5d[NHf@:Y
+%58(GM.3$B\gap)MG&1Md-RqdN>Yd4b(8\(IU at R<gV/@?L!o.c64#$;9P:P2bK^ljm7qE/H at L0M%#dr=;RB_KomaoZ!4<Lphp9Lel
+%$?q138EU+UjHc.LOQj'#>!;0o'/Q%QZHgY9i(^O5l\`,S5QW$3?edLer4]Hi;3Fl)9!QZEQ`c.2V`kD/8noNWT-CP\mcKi<GJ=k8
+%m$?.#hf4cBmL0(e_ZWZ-r\]f""f5$Wi?Nrn#Ul$MPsdRK7A"',72^-P*R[u34'i]sO4AU>Ia2Q&KcAF:#2pr8^4)@WkU)FY)2:bE
+%,YrHVb+]mBc`nG9-bMsT./S]uWj1_1 at +fA\lRXchVDbm3niT**VWlRD#/35oKlmQhpmc at STk(1F`lC2"LKV-,+A9#RE3\ZD#*?u6
+%AXb!sa(sl:h:W`d$pLAag]c?N9T"VKRkY91m_ZJ4ID+IBEd#AiOZ7nf=0phH;pr*0I%4LBaV*n`laGWc";q(//k<1U8Ii"!SX\Hd
+%Gr]F4iaK at aj!pEESYI;N&_ST7luep-R'mA_(Sg%P&:f"5_iU$lV"*8-s"%g9//snMW4*L8fW<rinM_ER=d]Y9/sR[oCFIf5/t--s
+%32iZWo8i1Se*74X+ at Aeq,>*u2Q-Dl?icJ"2eMI9dmX-,hK<3gf+/b/(Tm[cbM79;TC<,j((OPQ>.]On*LRZgIOs,gf"#r\[G[Qh@
+%JM5kWXBpWtq:1V"A;@dP$qiag?**#3)0O[>PXC=9bo8`1h.5hI5YKG3GIn3!6-%)u=[k%;i%;np#Z!`>/>3o>"SGke"<g4o3BOCe
+%@1'eMgVEeY,1[BW#`%K>d1MW&6#Tg<JL?;4es=@X7Gsb>e8e_ga3o_P4EA3:JofS[]Vr6NiSR1&'nR]SG^..VOu"Dl\XGCU9R\T%
+%48X4c3N!=BOK/FcCg@,7j]pACYArE<O;lMXR<&pA(>^H"n9&WS7 at 3B1K#JB3bDXZo^Y9''DG)H$!D3f3aHBmJCuh*O[MNrQp;iH3
+%4IKZ&QmWm]mM7q,+`I]TcCN0_!A;S]4`^(cc(a9V4;K!7,dY:LD";/h,73DElr.nJZ#E<Ggo`(\%hQ1QX9N=CNh?\])DQ@\oU`Mj
+%@?1C4r5:$#G-Q\b-M6&XYU'r01+#d:nI.ZrC\#N]ca0]UnlIn,4^K&<hfUhsH%a$r4+7Pf`\7):iiJT^ne?"@s68T!?C/(.X=>\k
+%_.M`K at HX-YqXuct<S?O=f5`dtKL+lu>2GP(igW*QZTS?X:m@@l(9NI<msH5./.PRhYQ-<dqiG at QO5W&tPpA&TkEKQa6d[f=K0scJ
+%Kid.5k-K=TC/"is,g'&Lj=*BZaGcIun;:u>U.^Ps1cqMQ[b at cPOM#sYfnTK/eQ+AGhmA%^\2_tZ,Cpq3ZE:R??"Jc.$h->4EtLMc
+%kok:W at 7$/I?:eg.R9KQ*2L8GcH&YqP,h</9%^IriXg4:"4n\st%.t0#R(0jrY#CTY#!*,!PQLKq;[jqZTu*h&#NG5)>K7Z45n;"Y
+%'`g)JWDkc@*I69TB_,#6BqFGQ7Bnl'Z\NSfX/GR7WS4E;YZS?uFTk^"rj)ACl<c,sCKgLac"BcD'-<U7%n'0/\fJ"Z<>?sk9\?/F
+%GJ(hrHHd)c!89L24!WE8pQ60R4I,q0#0sO";aAY9\nCS*,pLf-52r#)mO-DA^b4S+WDkqh9?+KU+uBpl$`*o,XQ%LGM(9*qOEc&h
+%%d%uf`cdajbQNfli%/"*BX:\fCb!M.8og+!ODAXpCoK'[EWL at E*Y6s:rc0T<?RAM+Fk[UBf[WJR,`PKt).ELO2/8r&Oa\@oNfcku
+%PPaHkKH1gubqDjO87m$$_,H%bZ4+k;P;Ren_lO!4f!%8]YWXesB47jF]n/1:Ahe5A;\8DCP_#p8Lfl=M/qV&]P!T]N:p)M+5H;K0
+%";L4>eV7W?C2CGlS>k;nSAT9 at W=n.5h@;a/CE:+rMKE,A6l:nS(?ij5#t'X*.>!(&LBq&!bE=!1.r7hcSltDBF[AkC`'d=MeNoL(
+%<dapLL)M6#,G.RZoo7bO_m`Q-joNcpAhCHVG+$/!Q0c&N[0Sk-0*>J=>([J1J4s at eV7L<Hp?kQ<=`j[X>6GK32geon0l^,sfAMsI
+%C(6Z1Ik%p-bBqoV+$2Y&o+"*n;_(7/7:0%(hrNeS0CE3N]APJO(C2id#Z=X.e#==+fd1M^"PWm%\;tkcSO>Js`%L&sA^sQkm7n]`
+%n,O3Fj6:EHK!8d8;ki8)7<.bTPIZfdmN)k:.\tcEaWpdjNMuB/fiIu*W,Pj%Q6XH]:D/B4]Af+3SH\G!$A&l<%s,rm($AN`Wfbi3
+%O=")5CF1MHIVtdWU=DQW:cIONj*<c>l[CSIi,V;1O^nD:G%]Wb>LF2T2$0a-[S&rk3H'M;iNmd_(S6_MkF=NZU>"Xh*"e'0\;3P#
+%R0Sf5b+=s[+-,Gp=6MMdCs1<5.BITZV#]N#C(i+JIGO)]RQ?@;J[fiT;=nr4`1!U!Y!cQ<J8JXg,eEBMQaBs?0TgPN$S16=0;g)]
+%[]'OecT8kX`?Ogu><[=Fg?^LpJROWMY?SF;S%FR\IfN*V*c.IPi28b3Y$`B\3l*XZa`0G7R-ItDI>u0(*"H+t2(XgjOP(2e([#^h
+%'*C192D3c.(5ZTJeK)cPSa@]1gij8dpG$e-RQA*A,u0FJ&,JEcZ6D<18eV:b7J=;j]>`qB,YE7R[m_UeA"GpFq!`=(#[?gqWa<hs
+%4S__T)pP^r3fBP0F'%PNM$Uf*PgL9;@A at k0>$s0P4fP2>=R3]\b>\r;A8#LF4;C5&;D6`;f]H9t$Y/^%W?)-3]&ImOeTPQHm`@Vq
+%4aXcp)GpeHFXTksWbOlEXaHCuoU(g<c58YD`sH\GrIA*eUPZu2l!,h[>L(Km+u#N"G[Vij?IlR8/_Zt0R[p at Wri[&5f``)-+?nhs
+%L*\oX at d[504bmI*^c'q$498<8Q7HqdeJ-l(bD<>M.MNJ^f@=C+h&=rmZ\.E^7irkeV:n."?H4:KD7Q4[Qu.niG]s.gCg;:VBBQ2Q
+%jnA4OG+%$\R+6Fa",W$p#h']$pCq'G7. at oY"nDpTI26tIfrS^lpeI"1!=mo>ifL4=ZWMeMgI[g)2-$r:,M3fG8+SKIL.Q\VVZ\-6
+%pL\Pd=Zr at a&V-7Z@)XL[Xn"GcQ-5>7cc3<6$_V at 5['Eu:apRV/J:1M%kVsR^cd!-XP)!&M$[YLH_eW_XO=eS-/#__8!`!.dg$&KK
+%gRTGJTsAP4TaD13f5l<Z'49c.<HN]C:2\oQO%tbd#&I=8`O>s4GrZ;Gps(lJ0O[Yln;k/[d=?</>^!djAH2te"\S-A,:MKN(0(PY
+%ZqTmt82Og?bV8N;(Q]ND$;*2QW2`<mUsej:196Tmlt28!KTWn.S$e?+O&O(tn.Vf'f;bK:R?;=U[%F90h;ZpY(fe!Q/&>-r*`FG0
+%B(AZ]Gj:_mMkuaiL[7P.,5<s],(j0ar<nW/7M<D-^kq+NA_g?/$p%Dh$T[J16$JXTi4oXGa.#@)^h<0ChgX&TcmEOCT"h?oZ"c-M
+%Wa\_]Kp8P8$H?nZQe5iHnfBcHdb&V9jTAOKbf_U&Ntc33CYZLm?8!bBW:=X]9$(b;?iYs'#f"'YiF_Q0)S-1efOpA_UFE4f/LmI!
+%E*EKm.0:/'o5HOP:d:5M>];7OOp7ca&cp50*6AhFKF=AI2.Q'i5%7R<$p(smMPH(igAe*Hj-"4'W*25H at p_,/8*j[+LW>=K)ce?=
+%m6JV//\BtIjQ#I$f_p!H2nCW56qUK'pB at ha!7I(c3j5nPCZ(#*%AchLKIQhO2oYE[paFNeXcqtTfTkB7@[^>paKnC=.q"D4 at -\s'
+%%A:/_qB:)bD]$CGVG],$Z0K(>8h:-M7<XHo3>o#`YZ1^Z_te?RR]B/^O>C+S0'Zbs=_=on=[@(.>,t5HSY?o.B,P)Z>dOT=V(8_E
+%AeqjJZ9c3LeN$q(=ZLbQd*>YW,iiTGWKX<=#Empod'A8p1'shPYF=H5hc)c3YR:jrgWXN/)I+</)rt6p<gYojK<6TU%K8o?gKGt;
+%#Ien8[bkc,G?O]BYA'H4D=7ralsS_qVO3XeA82o$:3Vp#Z+HO`A'H#4FIGWEP^5o_;og"Xa?4AgRoGmJ+GrQ3h/Ebs, at H*I6,>-\
+%kuq[!X+S7mgR(q4)/VJS6C_\$!>Gib+YnVK#TV-&T>_un%u;b=/06@@'aKp5o+[@8#DI"6+/DZD_dH6b+#\3YhuSOV"1aV!`o,H[
+%P6bk_1cCG'Pr2tk2^WT0*9&H8F5lJl>?JGiFXdEl15oLFNn*a>N1j+H,<D%'#@@eOSbVl$ADA<DK/C>F:r=e0O.d9Q[?GkaR0Go:
+%#TG\$>_V at Ol>I?f^)R:/"2B<dm4OZTY^Cg9\V>F]+I6:6gH?H6_^-a-hW4\bGc7[7VsTmNgX:8FJ.]!YaOrgnL3))3b*<P1U6I6f
+%PJ1QbGZS*9/2=BP4]a7 at YbtQj4\:O?i-qK;@(k5PnM17Pd9OpBEPc+m`UIV$>b^%V]lnOkE8UtH4^kLu,=ip"V"cp1!J8%+[6Eu2
+%4",s)Q$UN/Q6WIsL%9[`Ih7ibFZO3h#%<IGk0NOZl8dh/P4M2_JU]eZ]csdK5WBO7a1;%I-&N3*dS=to,SfVlCPOK0i@:XE(s*B1
+%IO^h'Hd4(,<?dFCX7Nfeh>Z&;2hd6H#Ll!B#CLfum?G0#)L`83&?HURip#EG*J6sUeah.lfiCG<o&uMMh6!j4+E-:.<f_.N'^n"9
+%^E0[p!Bb#C9gVl[Dr2OIR%k4ZX?gp,UD+=Z%HarI)#pV_\VeMSkW4geJ;:[?ERnMFr9d1&PJ./=HgJhac3>?!P<4SWXGJFbM at ke&
+%"eK5d0j[3KN[#TT*Wd.>>#Ru$hho,FVrTm)4[!r5S+HCOTo,`O>a="0(K+hri<0BV#na``B0:29&^)_Vb at D4S3b@T'YIePM#C,e(
+%Ef*Bk65\V!'a'QSQ6WCs#LpncB!\Q[l.PcWfW`ER!:0"Le_e=o at uS\X>E.EoROb%7rNF at Y&eA$j*FPb41D;cSJ(p7Yb/slX4RNKq
+%!WXI``4]09GAh#7lmdDeWP3Em-[U/I4'\/#%h>+VU;JbF_H at OJ>:98IhRg'Kp.5EM1>+fn,oM>f32`%_V6M&2jKgIdlkWjJ:'t^f
+%B)e7 at o:W(#(VqD;e`u5B-9'/SWQPZG"!GcO5t8/MoAFaQ;O\5D<c:?8ZT7R7fZc9"&pl>4, at Dhg'7;373T*4d6I!D'du!N8f#Gi"
+%DoZ[a/"S$NSLatql+'&hY1f9H!!R5;R.s at k!Fkg>noBi;l?oDVVqJC<r%_#6W3t[)bg2j'`FIP2I*CD.&'tf%Lus\%X.$Pk^ZK2F
+%>8MX$UAoC=I_V&I0 at BbFH)eHI[.2^a[f^3/b3?J"8eBEiX;9.B;%BGI<#$Xq1cIEi+;^OE:^rIje:%L#jLhI`DD,_IKiI88PcQAM
+%O0ptY[t,I66^Q-44&V/Vmqfh(Qdpb(*mgEPfE2A/7m\H48 at b&r#iU&M5O9.Y2W:V(l%HS[c<(Q'jXJ\/4U2o.*%.^R]>u\BK;s.u
+%"qE).ilNs-)CC*+F]^CMU*Nl"M69RR,WVjSjjA:eRe<k-IP2i.+\Rj7(d&+dM?ILU%h*tkDPRPk+Af1tagO'/V)IX^EEAH6F_VE8
+%2!QIc:5dB>UZn2`SkUdBgd=m?1rA`-ASLj!md^mVB1EmmfI`nuAmAKT6%9sj)eUtKi0#dZ$91nKQkUriT@#r>$uf;(h#=Oa9`d0+
+%R_^'+8&H1C5&PSOCfIqTG-D/]$[=u:M!%aW)E:=p+AnE#:t\M_<:6&54dq;0Go;&lOi"Ma]`"#%:!f%C=)a<?\Drui<3"L-=dqCG
+%'CM4CB(!o+gG)8:#:X2*!gC\/k\SE<mV:(''!*FCcBgt/.O$#4%J4HJ_IaQA>MZOP<GF/tI-fhAAS-L6EN#)ASc!tgVS+_$;C)@A
+%]H<!jH/e7M*W<o11[G86O$$r7(r;h]HVcepp''5fPa\>ONj]tRX:M%aC6>rb"D?PI>/SXqboN5=U`:.F4Ag&K2?X21JX2e/\3Q`S
+%Ca4VXZ82[@*:Cfsn.-+*nQjAh):@7C*rg)hX?tAY/)[Hhe]g:(MmFRu4E%VW#tpH'fbGds(Wl,SWhu+rg[#b.f4LrRb13#X0a((/
+%fa`(;2R(6]P=3c8ig05;\*CX#;<9BDoA!Da8E,7,eS2H0J^`>#mQA7/C_kVUmWjX,:I3K7jLs1[ootSrD")B^(mKsIf<KoC'd0t<
+%]ioa=GEP,BHW^<h at OP2?)_en]mV-!34Ta\1fLr1d\$JnJRCnn;TN>;gS*%^7/YOOJ%_4./doi>DDN_1-*\MWlOAO"^.2s]GZ4^"F
+%:^d&t3l0Wa):GD8eVTUr^V<B3&0*-Y-D<oW:2$ZYOfTuR/+-OQ9LZ65RaZM,U/bpb@="=q$JB;f(eEE-!b`-7/U at rC0&?mV!mZ!t
+%*@FRe$pp$gm)m;q/\A"8Rpf6B'S`lPClBMNa56q1=QWV8_<-!&nOVe%2F,/aOFu0gmFZI$C-G-<G$("-[NtE,=_L?tqqn^>G$?0t
+%+j_Ve=in9<inPdn at P.D1&91Rc%)N7@!)'dC,+4#'j)IIKbYHqff'tfn;J*h%haaD((!!`"Uir]7^R^kRU-)<sR3g1O6Z9pZR8BgJ
+%pE<i'V=+)Jm_hHhk!3moRnUq$fjBO<4D44!&Cp-d?lb-<B^:O'@Qtjn,=Euhmp=(pH"2Y]S;c"c*j1:k#.,_GOVe(;pcU;4>B_W:
+%-clN^g;[633gKjTj-**7#ii-p)i7-Jm$7Vcj&Y5Y_^-$hf$Yg9OIEu!1:`K!*e>q,MX&MZ=<`/9;2$F:h8lLLZcDNtUZ#^G29\Nt
+%gjuEPHZ1bf2I"!"q-_jj.Uh)@O;<12A:Im.q)PK]gZG])gNUfZdqV.<`%+sn#E0sc\IIY4H'F.f&3Y`2_Q,>$X7hjW6"%EaI1gVB
+%ffbd'F,oB0SofOcM4ZQeZ!Jp;VE,NmR?F at K_Zct[F0(GC+Pp at omDfa#(.F=&0ZA"(eljV/Ih&"r`u:`&FeAuPr&G`@WVZ\V\``X\
+%So3o?74(H^2fhZ5(G at R(*J%c)q'_a@;np'8&W?dEOjA'M&uXepCr-%8Q#[1gLM.b"CNB>A.;-1=4b<Z]%7PXFC!Ll&NhT;8 at R[M,
+%nE[ArNl9TD5g8UOCY:h'b+ouBL3<U-gdff^njs`".q at DI8o.)[QbU%6+lo=,Vj<-`R+Pun_ki#Hl*8H8nhN5KH:Yfg2_3tT0s^s&
+%p1BHpOaa]+%SSF_+VP9Oji0>=B93:WZu%a0>ah)4?GW=\PPbmfBNm)QFX+!IaoMmGDb_9Y2QJj4SXgJ0AuS(%?57]<dpPQCEnJ!V
+%,AaD%brIC1YESa<+PZF5?ru:D9(!Q&+GAOndN at 5Pn+OqYk]hbT;LNcO(=+@$5i1Yph^ksnegNNf6rX6EZ-^b at 6<P+j8Zs&SM9&*H
+%nLAQf3&04M]Xm8)@`*&fh0*F$XkTB(O*.$ISs:#IBm?j#=K]ai63*NGGWbt"_DKT.Zb at R:nDr*#N#!JIGT*qLpgEE8ZH5$d6-Dbe
+%#I`*-g+Fk.-cTDtgrUds[Ka&[JnG*LU/S%%,*PF>Cag7Elrr$rnR;r#BG75O?(IfofY4D&"XYQ`@Q4!;\Xh,9rf\B^='!T`1+\9]
+%SI,V0gaY;bg#nm+msr,#QBNF$j0J+hQWu]F&3`YGZrijTAr/E8o)$[gl33iam06dC<dE1M]6!br^peT@:P:oJ at gC<#/Q&Ol$_sl?
+%^`d,F%\98,]54]?8i^HY;,7^\4Sn,JjcD=iT$iBS`>:\ZGHd&0Al9]65??Gl!:%.k$G;`*e/e`6IfQ9bH,Lt;'^=]ljQs`uJAW0@
+%5A;o>ohq=u-jc at 3N07.Q?orT<Tdk3di&r+7OY:h^`OE`k"GpW`OD@!5:Hi1XJ2KBnfBdh!<=EMAjjD'r2n==H<-Bbm>_2?G-RFiF
+%W8%O/4O<`nbhJ=qr55*P[+T[-W8$q16$aJTH\!ZYRL!HH[E*47V-MmIn'.O?Vp9*!d]/b3N0[FRp>bkC1tLVlP=Fg=<"`^D+bP]i
+%9$Ka?#tHqd1eG(9="3FR42kj!"QjsMI$Pf+"W at GoZbo!#@OSnWN;5oD+G--fX5ZF.rF+CS6rE&"_*#Cim)>8T7Fs%lB':[#3Tm]K
+%XiEj$VJhW;$Tjh`o>9'9Dpg):LNhYWHS<[^[+XOm(+*N=fr32d`j+UIap.RqD9![#C"?.t=//H<<(4DP&eB#IIBcht&!U>NT!=kl
+%Nk)/Xq'"o`H0&'&"[qPih"OJ)7a?9!<gC4GE)o&$Q=NUZJ^JVtn_Ul8DeD@:dP<R/*!V=fk$0*Z*:pLpKrmc$aEFoM at NA#f]t:T;
+%:(=_=pXKcUE+,l\mG6j,huY+VC7 at E!cEWuL9::$>3"eudB]Z5LK'[nrqHiA#b<4tj+7C6_82e9D!7R.h,q&8R0L):rj2W/4fkZq1
+%ZW\oDIk6O$,=*OBZjSS1 at d29^Z?O^,L3Zbefr>:(VFII>QM/o<HQ(5?Go0HWGAu8Y0s>@?3#4/plui!&OA0!H,[Enm'!r6FGaaO!
+%[:pRBr[KG_QsJmj17*mjXP!`gD!YJ at 1*$9B2eRstN]dqQf-F/"%4K'2`dF at J9eNlY'!#02KJrud-%W?^Yg!>=jMscHjC47t:s,+t
+%8rY$qJm:Z&;=5h9dM-D(Y"OCP8L0jh>744CF6H at f"*I/NS>g#;lq(cH&ls!B5e^fp)a`PO2,AfK^,\d)X^`LgN^;sqK-3^%c?@A8
+%0oYm?EMTL48U5-:+ at 4DYga'ubq8(8]HQFtnScPCJo\%]66LRZFcgFAdC^PqRp^Q<>G+92r?_n="D9+^S*`^!-P</d`UM3oHU(&m=
+%J^N>Hd'9\=$'N?ce_rJl)_n"$'--V*#ESFr)QGUpZ%\baQtS^cB>S/Mm98,M#*^mO?7jCTIY+CKU_h$@:P.[%4PB.fZtT-^;p*WX
+%Wn_!9I*FT1b1L6O8KPGrT"8(m?Y,\BH[1c"7hNIYZcL'kFFr"#j;)>S<p_m6H$>e2Sh`[8EM1DE:7SP6S<uQ8`j86HlL`3Xfb\TF
+%.q&=fI+I-nBt14i2O<ZQO&cBS\[&?S,nZ8VT!4Kc[@N91g*5c]#OK!PK"d_&8<QTV-StHGkFl18")PAI9,`g_O\:?td(WXQ,58=m
+%D3^>"-Vl'NQ3'Rd/C#jf:2*AC=!h4;["em0/KU.t6oKl3\<1(K.d.$G[PAMuEZUt<9hb^&At9Ka`]>6id7q=.Ft)J%l>V_Q"db(B
+%9rJ\5%2C'47P8CuTAUYIO;HMH:%].'_P>gX5m1SP'.hF#94[@FP!*]\[52%l:e=Tl'tk3"SL%LCgZ,M_3"H6XCE?O/R'qS,B/^N/
+%B9Ps at K/l#;n13QeI`c88R)rE:,_g-Ga=9"b1!&#j4oj&<LQ"3f?h14\.0M^A4K_itANi5fa7$MYUp5',_88e91ghX*M/mWpNX>JE
+%r88G[cM3TDOeD-fF+Mj1fpD%QUkK#9iU@?qeb$nKH4!c\eS<-T$JC2N%N[mc>N8/L_k=(^BUs6)ACcYD0GPSaU:jrU(/]DH5b,:?
+%DTiaZ-Je]<Q9'RZ'!t&I@<qQF?S)HQ$eu15%6eN%GSNN$Zf+$a;s,_s8XQX:@'=!W"qT1Cq(*&?_@$PL45Fbr;6H]u%L_GP#8HSY
+%\#33]<mWVC>Wk8GF5*Q?\'=&C`E"Vhc,qgMfg:L*G5:8KokN2cmCDcb%5T5<lssUCPlP$APf`c<O2:W6$[]ji3iDZ'<F at RT4<C2H
+%&Y0k7P3Gt:=GgC._6Vl at J8:X&P2NoVM-'&Fl<&,`%UQa$S3uMI4k9-VK#HXdo&5/WDYnRbUInf%>CO at iRjA2abj5AdFpB7G;*9#I
+%>_ at C.C`+%<87DYCYY9<?5 at iSUQK1"8,jKS\%7uD>\/bJ8IgK[., at C<>]lSL7W\PgS,n_m3#.#9EFFRkV;$)%W[t<V%0&Ne.n?DA@
+%[JAbejN1=)37fIUn)_E-Vf98FUu4-DN&Fj#dd2*Oone&^U[(21VCRfDDDFg>/f":Q0G50R\*Z73'CQVO- at SF:odiX5;h?VjE'@C1
+%4rCdJ\.:Qqp'jV:C,m`h5"]fLFs\XGBo"Xg-BPp6PEq2Ch"OLFG>Jt(^i#='>Ye\LS0<)V$s/a2ch`*SF_RKp\p([nqnaVct6
+%lD>C0.(!,mc7MaObKl;A%)BK84c.D@*'LX3UcPbQOt^t[V[;WK1BD(-S?^a\^ea^%2+Qg>F8e0Y4(,XCC;SKg^+![(#HT$@LW92q
+%TplM:jpR#AeM03W3Z:fbH>^lhK0p-P+*XHI[1b_a!C4,NkAC+mmCt$Port`4!OL(b"n?6ceBr)E<iiP+TqniDbtghrh<aIh85Nbh
+%JO\j!#redQ],7#9MGIU&(Sl+M,WKfZ%gufk`$]OfJu7j4:/.28S:p.'cK2bfhjfuCWl[c9j&L,:2"DD#F9*\uSp;`W=Pj^Nhdh!b
+%."TQ%F<`H:aF*qCaF;AC#5'&o?eRF6W%-bPs+3e)>\@GXGeH-!F+STHDD-h`$#WhMh1dLKXL/U4bGTra#u5YQgVG=_Y3#*4],oPg
+%pSgegkR1'?WFhWToU_It.beTG/7KUga)050)D<PfE\I&^>FFNMU,Mi@*B<t1!pGGhEuo]%`OOtuQa"1?Zs%K]Sq,u-CGWI]Gf<^h
+%q,Hm0T%mk'R!CCOqu, at ekjTk:m[Rda<1Aaf2;5?6j\0p&M1DdiI/VWqq0sP#SK!m5>^iFjCFh/;_C%Z4gk;+:8%!HR0kHYZ1g\K1
+%B/R6flTpu'dQ^rNVsWG4/1*>*-$!.jUKQPXEmiLJ<+?S^ndI1X&42b_*R..D3Q=eX.'Rt5H#e9GUrWoKp at 0Qp+?"A]?LsUc-b<MR
+%CHqR[;+SAr at f!OT#9Tu^hE4(7pRnB^<un0hT,Rrr<8TU&/W1o(gLf5-F+$=VO;3t`?H)pH4Qfn180sXuUsar(f#q,iHpob+SlQQO
+%mE0)9ljLm'^b+c6S;!ibVf"b>clu,c'<E7T$2M5\<RY/H`.1G[=pQ18k5PTX,nd-B4u=XG>_;ZM6^/;)JN`gZZ6?9)A=S1U<$^I.
+%i(=K)$^a]1T:/Mf:u*,tnE*Csq#Eh1DnSW6B=@[Z at W.`:Hu?T"i0b7l-5g^sGlEOm:ML.%YVfuDG(!iKoC at UHSfj$YK;):4Vpa5>
+%4s&Hp7QY"H&p\=Ifru]&E&uM4`@X+tZnR[9M68*lOF<\1ihh+$,Au#g0i8Z:(.t2H(#O+16gfEteEOO%cYEcd'-M]&Qm"Ih1e;P[
+%S"uB3Q(i?"N_*,Dfp4U5On8M*.R*>Uh[N.>[rEJ>KSAH^G>F]:l*P)%]=g&J5CL(ibYK\!$p41[PhJZ/caU^k6$5fL8@#ts0.)/1
+%']UEgZN8EK;K1Xi3FPqe'o*F%QFYeA#?I<u-^RJ+f!uDl^RUeka^;/K5T=sVEjASr0ks97],qt)`aS<`2sV#2Xck-&g"Qj):1C%r
+%[+\<E]DC?X`-i3Kbe^8iT?_E<FS'^BF,l=^[I#h4AF at gcNSRdZpGVA^0Xtl8#326feOW]--0,`CM2s+?nd\6([AMOU`+TXs/TYE=
+%UWAl_E).Mqad/0g!Smc:SZH6qm,cs;8#-%DHK&^BEP('$-^]EE`SBLd^F<K0;@hJ^>LFl:U_LiEP6'`D3.cK0SLn]qQb6YAd6 at Gq
+%fAo/78WtU1;]f_B/Ck't0WmHg?gY at s_gG&'So$Zt22ZpV]^k1:aO-%8Xa*tCF,<5oeqZDD1IY?Rl'qO\l&d59>^:&%'.EnJY8A6=
+%Oa)diI9*B5J at sF6NKdmkq"n8F=eZnI+>9CSceCn:ZIoK/9,``>m5Mq)&6SB]l%p$OeU&,,naP]WPtpoGd#n`BH='%DKlm#[%V=Y%
+%M2oW>\<N`YYQWeQO7tr$4ZT`$9j4LBXB8^f\Ug"pU/KJ2/pk/mSO!-g_0 at D[W_;d;[EnPYdc!XdI7Zo-'9B#:#c\/0QF_p`$*tqu
+%k0l7YJ??S6[JcpB7r[g#kC.Y^=Pi1U11fNcUMV>2k"#Y at G>tkqfg..8@)2!CNed%!cfq`^I&3-7D\c6:;%j,SQJT-;l\5P6Wj#<M
+%e,621NBtqF+9qT%H`fb&M59=k%!.3Za[PaU8qLiOCB8_r7$!Tl>\*hE'JjQ;bhhB2&b&\D8chO-[g812:0@?l;D1h_b4o+,^e)[%
+%Z#H"2PXqmIUI_qEU^csNn11[u%jpsENj\oO'G3hB;710<8/WCnrq,8m'8#S]Q/l4g3QDg[cjOOZfn`1 at 4`.[i=dTHIb0!cpp?$sL
+%/N("[8VFA%2SV$k\'uo1\+nL2Kt``a!Um?d9O+AIMj%^%i_P(bW=_cPH07*Bb$7^J[eQp=k"ZJjan\$lB+JT)A[=jtk\,\EUQ^3F
+%)miC.d^IrUKn<uQNbtf32(6(Pos,DXmWu?ph<80WKn1CC7,!6;1B"qMg'AZjDGMG$e)Lb91Vgn,aI/kFpCXpio$s at t[F8_o(hB9-
+%fXpfZ$h[R1ZJ*A'k#q"W"Ti0i9thon]S)G at k9X[hn^UC56DNVLEC^k_d;$e&5PsNnIa7N=5l<@CAH%b/Ktg_$h7=HR]H#<)q'X at E
+%WENN<34M,tA(ean,GbSWDEEgEY)i;pG#r\2#^A.:8piaA@$Bl:Z1C]4\P>>&p7)qFiZeJjk%Z&J?JDihaX>\D\&C$LdsaTV.J>Bg
+%<(RD[L8K+lWXKjQ\8(U"(j9(Qe.?\@P at qqTqf(:chr_V$[(lW_O<4"L`]9:#9*2q3Vei"Yad_%&3g?7%[Y?)3ops<LLV<:Kl/PlD
+%:o0fo,TuUbJEJ-\[-&&I*<\T4`0bUiMRV1.'`nqEki^'[M.ql#[k4/hZeQ.B1-(#5$,T;BU'F\Mbiu95c-=99'[6Y5FZ;Y2d`deo
+%a;ufC\UaN'MQT?F9Ui[&D3`TI*d.:dNT=AQ%rqAqQG]uY4^,LcJ<l*Wq8#FU*:\Yu8%J>`Y$Cd**<W`SJR:uc=9)^jej-'c*\;RW
+%lbQK,DnC_fPLUef*\6WF(6)a;hGbuk@]^$E5X$c9(lnOO_$Jf->MD5\(f&m=F5m8l"oP2fqDBe07YE07A83Q)9XC8^ptI5D]"\In
+%SEteg3IqRC/Vc[MRm,5.=gq5=9LTlXdAAo+]n7F4bF_@"(,P+H"Ng;/pGJXI#^TO9mD+*I<^cA:PP3LnDR at _RQS0;6G\s`$:APR,
+%`[H^h at bug+=6.o\- at 6@[%3V[4$/)Z39l3TkLs]R(I9/**!fOO+Z&,HHSJ-dO/_q0m$7i=8X.jTX6c3<&Vi5885cdBPhjL43>5uc7
+%>;>.BNlKB.,M/<$$6W&'JT]%.5R8Xa_%%g8eL'A*%mocBN'RNoSbG3Q.RDsXc^WO%g%c%%3DZY.GoM+$l0@<<HI=(#S at 1MXB!j62
+%8Gm0K*)'g>=_Y.D97Yc>Ok at 4R:*oi.AFHL!]\)_d%@]9sqs0g&]nMp79;q:*.Ln#(]?Sn^K`I+:p7iG6V/G/Z[1Z.`d at tA2Oi$/0
+%E8Oe,*I3u0S6KY#;=$l$pa3>$^_UeUS*KLgf.WaDT7^rbH.`n(3EQSj(kG7.2*`DU2ZJUE(7uOd"K223!df.>eOg'#B,:HeI`.Bk
+%]C7'DLuSY,-QXPb'=Pf0m^lX,11Z&GGhD75Dp;$Ye&ieAOPcAaD*Aum=4%l]YDe.O]VU6r>t^nRLB2M");)Q"1e=c0p(Yi!QVZ]\
+%B#)/F`@g[?np;"O!lP_g!bZQum*R+UYnJJ>(2QAoE?g,50_ at mm]5t_cZCud7q(u-\X>)>C+EB0jDCmW/AWX_km8lI!?t(<B.2s0C
+%CR^6nK.&FP#!lDQ0<At9.&P@`r%iYZHW#?t)nQ!1E+BCPbdkdkZSm7._?jXA+3M3c0K(iM_q.trW9WVP!U`cHp'PH*4oZ2n9]Nt[
+%i;VdIjA,p4WE?n+?u6bYb4b)aB(;-f=oNt"f>W&7U?+-!"kr.QYDd=dCSuVkQU:ke"nRoQ=Ne)3#,MiJ7@\1S4 at s2#PP4r'?mI/R
+%`0uP[T.K9'eocS"7h4V":bDpuXY(^icN^(3Y;TL7Ylb at hj.hlsiIjueXsBo=_Z#*`OO at U%fl[9n?`(E1QEQQ&C^%sA\;;q=nKaqY
+%0 at oS:)\D?a[O!fXpn%FK&p/3Oh73u&70I.`lH;K<cb1d>-*u@=Eac\M:8q$Qg(N<lX68g*[Ut[P[GOe;\,)c<-46Hk%Qlf/R"5PX
+%T&#$(ooES:amEJ/8J`K\3&A[D7nS,l=(61"3'C?C/`bp8Qe/cdPOOTo8Z$:TjM&,AiVmYW91nF9Tq]-O"T,^)U'gW1YcsuoVM'ed
+%PB?_bLIeM:hkLfU at 7J*BJJ_f9F3'g9ZKJSJe'[2Dk>4htm8:L'Y8BqknK)R4)k!7!g8;X\<r.!CKlgN%e2WMR-Y"eoKO(U=@q1B6
+%(q\jofj7iCDisdbD'SGNWfrlMPYs*0GFh(XhOA<Y4ZV8AH&ZNkV>lP9FTU_^$)C?\EEc.Q[]/_*D^M:lgRoO>Q"Fo14ZJ\PFFu]l
+%>WHouQ561##JVR;"JGtkQQ8B`OcGU,5((Wf\B],G$A\lE9*?r at Bl(R<j8"V9YNa`@Yn!`EN6U0#G$oq at 9Md,g>:E+;>FS%^edmV'
+%ei,4h/j\j-l&-o?j>pNja>]IP[)Zk=Id`i6Rrq7o&gZi7b7iU=.s4;K5V_HG at ll7ujK)[9b,;E^+3:8-7*[M8,I$B,\3KT;c=t`q
+%G.`rL;uq's=:fHbrbs2KOt$5$h"PX^UK1e'5EjP3Pl*FUM^NI5+#ErUP)PGDk@"N;Fd\"[q=WHkA1YBhm*4cYY<h)J1]0"+0fqXY
+%cT>io".)CY<,KOtT]&"mNL.b"B`)lc%)Q5ZW3?#U*`A)H;H7/o9^.'_9>4FK:ClC/+%f8#3kcF35(-(sljS(Vc*[DU2T=)\c!+td
+%\*`?7[uM at HZbgoT>G<J=BsFcc0V$-%D!^q<8LB;`'L6n`4\e.&[OoK1`I_Pq)KX`1joF*8*8L6MpjFVbd`Wk1k4\!7Eo"(,:NCZR
+%R:Z4\>llT.j"8eO[h2AE+rBd at j,\^q99V;@r29M:OEk?&7kSDEqAg"09>Xhh_j+:+pVhbep3F=kI2Ga%$U4Jf/RcA\7u#D;"?jCb
+%gQZm#5W:j$k_M9-$:<JBQbS'$_kMs#82o+@?"dg?gbgOJ/<ua1+I>/ubggF90OCmd%(hRN.C+*m9_nU-g-K.\9S(ULEG!Mi`NFp9
+%.\^A^_,I4D"P&[N/6%2<EaD+<g&"7,p/GglKF5=/akYI&;X[B.S(tuXno]7WCeRRS6!P&ULKE'De'JU$"2Sk2+t"XOXX>I_'[H":
+%@h$5Sbmo0mNAH.\T2[n-MZg.![UV0Zlk)]-2S=#LARBn'O8FFg3Rbt4WA at Kq8W3[.H_O&'DY at _/iAXRm+7W2*Y>b-1LMT_6DEg)c
+%-ZQQV-74aXTC$bQOa<D+OXW+ at 5Gi0c/rDWMHN$VQfW/:tM?b4a29RC7KB5nN3LIB!I,A;4cDbuN9`8hq2pDZ[A_Inn/#\^(J\1cu
+%8MlF[qL23fa+sU*2ZEGFc$2D=,Tgdu-HqIh8Ld?0:c]C!Uj8B^Z2*asO8Il+[XXY`D^"j9$*a)iDWMuch^lBMJGM`l/:X#s!@l@>
+%p$Nt<K8u at H11%p_U&L_bcb`Q['/S_!2Opf\l5G52+P1I5<rA"UP2$Kl3q7N5`:Xp[P?W:mV0"JqlXiM7"&$AaC at 1LqaD;)Y5.:N(
+%""4^*a#k1)G]I4jrcUq_K79?pp[=hS8;cK>%gsiP:9H4W"S.JM"oUKNWJ.Ype.Kp[O%Q!]/l-kBCkB's2!/T!rDFg'@F:Ng6L&m7
+%1!,\R`b04BaIYntGYM;t:(dbUTCs at IaZTT.=;"Ll_ZNIXJGf65A6pY(%"/,64Wc39BA$"N&\($A1M&HC8"V$E,:upA@*=PfA!/B=
+%&!)oB1*>P5S7!A>,p=_2f`L\XF\@?I=)mG%>ScI0arAU?-6D?%03.SR8Z7b:kq<r#iqOYZGM(;?]RD1EP:cr%VeA?][<-1T\d:%W
+%Z'JQnr;6c=k5]M!S3f[#T_6$K2i2S8YoooC.prJte:e*?U.!p`@cMSM%PH7FD_*9+[WMrrULLLuKqV:52RjAn7\.a"aHu,JS at rU_
+%CdAoJRgjp.i,8K!IH:dl4eK8eod%5nRSoW5(ErlRXp(V,"8>?K,[KnfZfuas"]4N)AS/Qfp8p0o*laSn48J8N:u&$Af;Unsbt@;7
+%D_J:RLZ5e-5Ur7h+'i94S-_/^/h at Ym7MQR$=H.bY$O30gBF3Qfr9P#4<nT at l*.c#C7($*RCE6El><,Q(6]c-uITXZEKp_C/k27FJ
+%n\MARVXq_!OikFZc]HB'95b);.9e.>'$H:1r+icN)?Vo6g/tLJY5 at -kH!7t24p:SJ=%?lmYXd)]"Y5=R51Hqj$Y2<pn$/baa(Is!
+%r)n(L.`&`$kGgY8D,cR\^h*>_M^H$t5r:&Q[-3_F^M*d'clX**LH/_Tfche"fU"smarbrUgH+/=Qd4]+q5=p)@^Ot_jOcKH,`r2A
+%ne/1@[e?;@Tp:cPSR at l$&7DkK#I*BcodFjQhLp($DSBKDP7(@).40?&F/R^tjLa?UQ9ld0m*ukUmN2J8c7J[oY*RE*SI8N9e9fAd
+%aU<NYdR`Y/p-O]&B63_9T``u7I50@]GY+"W'3(lKoS]BXn,jFt/Wc3A)79_'=u4>LU+c1BZf/c?K'[YH+%S at MGtjCAium%1\M/N:
+%Jh/c6V4sr4^$tYd$9Y!AePl8VcRG%r%^1/mFDr91S0Pg'=#(VMmE%ki2:/J5rYrCo.sjbNjm&IjqQ>Hn#gYqh,544MG/+_D+]>d;
+%g9o+Cb+;kF_AHZ2QD$r[=r!^Pkih,snra._E6/RVG&X&+A$9r"5A3.od#q#>VYj[3,$9XEcV<mO!5ack1`_1(Ln'V9\ga<oM9bog
+%C3peBX1>Wh",-$<X[`V'a`a9!*"*t`#C\#@j;;e24MSP-VZK1,mtW,""[-nX$E*0=dS0;N00!0C_b,2G[RieJoaIH\?)EbiK)T".
+%=LLF!X6E&_QtlhQfa:m%*stX:Tk7]>QG94877Bc"hJA"U\OlZtd;O6:&$gJkMFEHm5eoKR=s_cGa+&4/^W1pW]Cc$@7,U2%@BYM\
+%:!2-L+iNg.4FUC^YYUA1s$Pg?DW,09F0%Of6ee"/m2M@<IR+>5e/sVB77rT53r:prFj=Ds.AbP*&im0,C4;W0 at j=+0o<+;4B5 at Ft
+%9?ht+NQY%@>#MmiC0EjHo;9uG?KK#*'e)%:D-59\WUh?g]Mu8VJV2f2kM8E(Q>KW=d`4D,NS9n!D@\afS$tu5loB"X9gL70B28Bm
+%Q>HR/g>TGL(G at 4Qak9=IcI8q]dVWINBh`YV at .!`g<O6o2okGQsGq_H@\LPR>TDZ6I\rT/)GpNTrac`\FfERB>C^q]/HmUJ#_01SC
+%3V)f?KS?O at 3_:<-8SA537<*@LZ]U^_*CSdcQ#b1G<j^S%Eka`T=TIU$XHi(dNA.Ua\@.S0e7;M^<aR!#QR'5*]Zj+,b:i$o/hll@
+%lfbj6f[YTa)`RY!V>TJNOiCi>\#mUC9aiVH"_T4'%Di)Z+7a7>.U'-[;(=t5+'LC':QY<4QIPo7^Reg.Cq79m43h)g_pIYA,-lb<
+%8NGptX05NTOt+(JCCKih%A6a81[cePAg]$r3inF.B;O;ES94o\ApkDAR'J`Vk.T(iKD:PW5Oarah`]N?;JTY98Y.;UE=GV(E`g,3
+%!'"NZ'^%@Jqq3qp#FhF].BYS;^/g/SZ at i'r%t]sB('a`==2&WB6ajVC\5<-P'a),%`@<hN_8n^hC<_qbG(&V1Y,Ie!cG+0^hitNc
+%U[_HeZUmC.K$%S);$.%6rBQPT4Se,?kbhXLl3N)\2IQthb3AdAOB0Y>q3AKRr7GB"'.5R6OT;352Y]OVnML'i-tDUd;$Eeb`fS\>
+%5u=7eZ=TimP:NJ5So4r<6God4GOh;3\WT`HXS9NReB2QhE/XDAj#Z=7c!n$>`baBH>3%&FCjulSG>!l$3Isc$ClBpJ1%tkBmFXJ`
+%*U2ZB$AnTX6m4s_O-FqTZq at IF=q8k9E_<o<I(53o6A;f02;$""l`f>CTSp_r.'i)CjB0'Ll7#*-Ljao8cRp$Tgk_#hHc9d%qHc1r
+%Y=+r)J'b0D-RB at p?OW1#)<L$rf5g<T?DR0##E5:m'mMDh/A;e8Zj#t^9M7G`MFT6DjJERC3P"O$_U]?!NKa.6,_.,),In1Mo/d?K
+%i]/Iuqih*"??doCIcZ?HHBk&@<QA.Q?LNKg)V=e.&P&G!N=Gqg/Jqdn7(g73>561R,r1RUbTSfs6cDBJ3+]_7PCsu\s2ZXtI(qq/
+%roYq199!oJa*&0ok.,;/cjhFuZ^WS`?rIe^4cM\_!/43MO!TaAZ<]61R2[rZgki?p7:DAJ?:dTj%@oPsgVqu/:H[9[-Q>@US;CT\
+%F<tXmauV!(54D2bnC2%Y_VLI?9<a71HWuF;,gNqoQAY+;S'k"_XBYm^<D/>/Zl%\-k3#h61u$B"A$AMM[B.D\9s\o15UMm_hZ`Un
+%Z#>#or^mpqk4Wd"b#;\;r#HH0=k'*.rZjS0.5=kP*WepW>!Su70#OBMgX&HlfaJN52V1D#>2+JIe"ebhZXAJR_4$oQnR7oDq)R!!
+%8+akc.b&A"Ds*Ze\)U^6;Gi.>H!(dZo=)bN!jTpp((3As4o at d*U""gPe9JT*F&>@(S:QFGeS>LAh:Ou$_D(Tl!g)#^F%1'faP=6%
+%kE!QLf$eD^VlcCKF*^b:9j<GNpm9<hi0GjNBJm9ZUoi$X%e$F/&QFoXQQ14U!WDC(.Kicc=qf!GDjo`5Ihl^>6$1D9Z]h]^"O_F^
+%;b&rrc\&#/Rbg4I7YuHe;Rr,XAA(kN#@_TE=4a6RUsVZn9.T/<%H:$gNd#HgGs.[1V.u>nMIXMsJZ6]NYr*S-M3FrOlY`7ZVD!W3
+%T0G^@3.Vn7jeZDZC8g9:p-,Aoai8f3 at 6)VCfVfXGQrih^4?7Zl*=7k@`bE^M at qt,ek,kZOZG/Bop/P8 at _5!ulg[\5m:L`</BAA?J
+%Q*PnO'@f$f>H.61XNH&NEWl!9#CAC1 at jhArmFGujW/[!=]M:66:>7`&+#A1fpD;@!:M_YK*E3(++WXSk%VV]FMD:ATS[7Ecj-$Dl
+%`M^ZF6n__r8.IZ*!SP!je:kUY5?Q1V0rFZg!hndC+_Ebt7$Sfgd1uhN!0:'r_N'=*V_gT at oE2gXT0j6$fq$QbiQ:7"55F^V&("^B
+%#*tWB"RL-!4sV-mrMbs4Hig9F3'G(2ZJN6uf]r#5o7hJ-A/"uP8Sq+T^/I>ZA,"YP5LpJMQ,-*7j[Do_%LeA"qEfn\<8_@@d*+7`
+%mR*OW=.WA&kX&KME)4uq.>6J:$]0r<"*^$ofQ`!r.unmo"fH<g[60mr4h."eD%>N^Sr[4.SKo)?n`D;*hm1DcdBK;22p2o4VPtQg
+%1K0=KN7/`"=gOgmQ;63dQ%X>0_l9$E7;s.=P/h%]:ce'`'s''h2b7!tdH@"eM_0Teeg12!T0?V@&a7';OsKHgiq!sGT;&=hfK5C+
+%ab<@H:L%g]'Yi__A*HsA9BWJL>^)o/(R:/X#5+]r at lg"&,4F)TZ?X>4Dam2h5Vc%u, at seHm]SI+Y+WXU1FI!TP'10nCSC(%i1U^+
+%(t4^)0r>R.7W7S&;8!0jY&:'7<2I09lg!$`jW66*(:`4SK.8CG4>T5%`\Vfbm\KF3n;e+8=P?P>4?[@QL3%/LF1+[nj\&IHb5mE%
+%O(%LV!V(7Uqh`!H0WFR!"a)3.eQ?LKcjWp<E&Q;p5ftuW at R+42B7$=o0I>sBk&`/GP.aeNd6#S&$/.Q/'Ta<\O1Y)?'&JUP%qN'L
+%FCMg,aYo9PR93(<TNiC,I!H,=R:g8#f79o_[)_J,+6:>'DQZ7.i/QfL+.bqGW?lCAoaA:(l9dGN-HNQ^=t3[3"Hl2 at jIRk-qt,!V
+%:Hl=P*O\S#1K>)_SUAHSA37"mp7ma64&^Eu.+5_edW-Tr#7iPU"FS8m>2dcgli\-U]Ejreq>UOqbik">#kZf69sLa9KU]rf0J>33
+%m-Q^`5 at o4f1h+cA9D6$,SDnFu>8&-AZ8/ZKeeNXeO)?R%qWX0jReN#?,F=WHdc(n0>[PQ]oDZ;h@&B0M2V"1e#;%TM?h^;rQ3r:o
+%&oD%Q at Yk(#=R at U3Q,OqV;SZKl"%lKW>+T9Ookgf@'j59C,ePIRMTZBQ?ZIm)jkHT]os4j"9?15EFRa5"A0hJ.SeSO!@eLbrFAp7b
+%WWq&]`pWGW#]>4:FnTG@?Vt1+rnX3k"sT6(M?[eg6pE&ap)\Us6 at f$n2IlZCUd4\`SL`m1-RGE`-M+SCSGOrR#-TBtlR`8;0BC9\
+%dH7)^PAHZbWt/#$T<!YdpO)N1 at GBsq=/p,i#`So),Vn-p&2/ng`=kkWD85XRYMhXtm[GPb_c5qq6?fRF!Y`'*Na6,<Mntn/rrr7p
+%ErY5KNAVSfn&H/NDG3ZV.j3QSHB-^%9OI.(J:qmH--G(XmDK6d\RVu4VB&.Fq<PBgVqu&<Io]<T](`b3YZ*rZ!>]?rp1d\&1)k"H
+%Wm%REDVd[D[hA3!aUUQ%ZD7iMkBXdafs_J`R6GNZ:N?huMc$PYWfZcd<fIC?SRhb;k9eGnlV/qqN'/44]*Y. at Ie?e:.F'UfnPX!3
+%$F_`ObgknhUl\kT17!GR$%f.do(<B^0l`%tgI0)KIa"3U[3g#C8?mXBE8tgL3.(EO+, at kdM^b/AA%a<kFD?^2M;[HYr4Bt]iGsP#
+%M$>t/_")5\?&8ESct^+9r,Dg1-rdr7(+jHa7oNf9U_9q%%NZq%a#`5O9Mo,%agL=%pV>HJ8>-7Z5?>%6%3,*j,pf1eoN'Rt,M]Y6
+%b9>L:lhQh$2"rH;o2lpdL!]n/e at 1!KSVEcK_DGs;BM?K]8\Z')<6W,?7Y08e#PH)WJFesQDWQo63-iX8QYe^anKVJ'NpU>A7$#0?
+%B*m5A$46W]_%FPmRr'D'Me6Ym?MSNWp?fuo4dTq&WS]9>FHWd.aXSV>GOs^?d:J*X(5M3sM,LEY\\-!?E;8XmE=EOYE[R@)o1E6p
+%^<FX?(JUlT*Q`\SYZ)V57WV<"9CH*Qj70&F['5?Z%aXqh_tIsjAhG(;9-a1T-ihi7cokH_Q?A?mP#>Tl9:Ke at ZqntR0LmA8X:'F=
+%P1(QpW*D:-?Ft?'Di07&QRk:>Z,pMoV3AGd!MX*uL%^1d#7Z._jL\T5)!9sSfrh:hBqI`5A5hC-#^pGZha9Ve(;T\64V#Qc\X71X
+%@J"B\ChW#m/CR2g-+slZR/]M1HK6NL46Dokoh$Np`4!+,')+npGNBF%,a5_N+HhA?s'F><]Kn%W&.>r'N]KH]@nL?)cTU+<<5*4X
+%G)8Pa!19+BU$#l3hRpcV)@Bldn^#,f/(Mo7>//?ebNsp2!d?!2f,/4Db339_q$m8t.)MaYRkgS*Q!Zpj]9k\U89o"<n'jkM[HE0D
+%)mO02[QtiN4^Jp8k\%&C'[AZu_i%5:QD]R8X\B?%Et/V"?>qoWCN:?'*'2TXC%glB?8Uuomj6VO8<jlte,EsT)(`;YbUE2[q<WA6
+%*6HrRSBN30h'@CsW6#AN^n%4<Y+M:uKfAh at KSkSclP4e8#"H=>5]"`c`g.g:[TJ"d32XH+<([Bd^HT^5,s!_<lE0a!85C/#m[`jp
+%(c"2iF8=:]diME!ZC%,eb=hCHc`Oe(SJ?L+;f<X!.]K052D(InhdmS6jh\V*fI,_(T_uBKf/Zq_"Uq!P8h-14i4P[%RsUPoirFHd
+%W58G^mj:+L#\WWF=AjW"FJ<J)QM`u7K`o=9cd9s.qFZK9mA7:N@)WE1ZFjT,SN/ZZhP at QMr.=UI6+P>h![Y6k[V6A,Ous*6*O=9Q
+%r<-/Ei/aF:PF^f18R^=cMXXIj6gWBlj;Jm1qsom*oSRZ,p:3K\iD/KWjh'#1)Y.d&L8IFAs'8RN`$RtU-*]6;Egj>rQ"X<J;\T%N
+%;`:ZV,Io1uI_M>DPD7PT(NM<P at 5hcrMO`7h=*4_a.d,?[q/6d>/V[f\?Ga]@HsQ/G5ON$5T(ekQ1j\QlNmUKM-"1qgIKdOtjfobg
+%<)qVK]Mj_OcUnQ0WV!<mfuW*ESRdWE:'l]m=ir0t.1\Vt99#`BdFPr0W.a3aChRS[K>^@7m,[g]M3K5f+Jm^b(H9r_nL5;lk:jPJ
+%+X$HEi6V3R0m[hHDggs$A1rcV-'4 at YOu[H?E>!R`c<?"q[YDL9eCnpK\F5QH0G0emI8c5l;p1D.ZVrNN(Q(EP.,)o+ba?B*h973J
+%k at S/N%aH[44(R2ji_tdp/$10&51Dp:_>LRq98%<J4V^Lg")8MEFg',8RWia+IC_Qrp3(QX(Wq7f&gLCfSMp"`ig48<^%8lK_WI=F
+%#Z=dccl!/GVcJ:2pf=k5<ccr49Kl.PTeXl8jdEDIFI$#fE!FE!qi6k`h0F)%.#E0QY!$K.616I)@mcpJ+7plLO`aD*1YA6_L=^L#
+%W[.aHQa6fB4EJQUIn>$e:@cP/(;7hh/J)ks31q*B;V5ntdVn\=;Wk`)6(Ze9WTM<a^9X/#YLB)X!H%*g+u<ST>=.8IkKH;`@Jn.5
+%+kPr,oUh$d,P^r&/iFYCp/RP>d\,5;VDPFsS%]%S(XNrU/KHC_+?R:G9B).O[#nGu3d^.S9JU:Jk:iZrY0#8#V1hT0Hc]IeYLd=N
+%[pK^DG7Hd4A3(EmBfj>XH`'B!ZE:C'rJk>6(-Gol=,8P?]CN6%2YkVOmjSj.mu*DemfcIh)8tG[GB at kZcPtg:4?S:_>]&i`@--J)
+%?7 at UN`NrTN:6 at 7-D?a2*N[0fMK'moED(;.6V$Cht)dXGcWI22Qa?YVWXK at 02K<4Ba9e+e;fZ_B&=WtiYIe:I+<`P=)-pX]s>BMt7
+%#OE-2!UlAPDVea^rKF.I#P'0tCB(+_:!u^L67a<PCO:-&S(L9IN=XgoM:E8X<or3Q$f at 4sN3L'%(8Z4]b at 4D-$\he8elg0mrck;"
+%L8F"E-UZ**=mY,9E_RoS[2$*h`,&XV-/\p8\)*,=83TWPLjEEW&rD,H>O_iQg`['Hetc@'U;%V6&`EE31rsNYkkMQ>a`)41D77_M
+%.#0XEW5543Q:/=f)_p[4ok9\UEe2+/(u#?YR,VC at 7c_5RcaWT,7"gIelt:%<]?(Qg3Gkouc]p]@L=Cp"Ck-Jdr]mHd$+Y<]._RuB
+%_0Y?WqO;,``(^3X,1/pi83(]a5L,K^\\:'-SLR8bIpckD?p=>Jk7>2WrR'j];g[btHV5.P4G"BOO=16Y_.M!brJ>=OpE*=Ia0Ns4
+%k/L-s<:iJp;%>5ene*@=pXo'fpH*(tUG$!*H]F2?K7[o`.qO9skXr\FamU[f!_A>NQHGqafU\Os3f`- at hF`6\^Sa*&_GQO)$4U/(
+%]lPM"Gc!Ko.8^#3&t(rr#^qjg8-)7Rje0?-UO,(P]=q*#aNF1<ZLdi>)'toX>_)EaNH(S<OPn`dK1b,b_(8D,on.[gIP%s$4-66I
+%n,Z]VVKhAmnf--N`hXkuSCb;*&"6md$eGj6nOSA:F2W\M\mompX9EB;[[,^bRrjrjbdkB>kWqt%Dr1>B7XsRoVVMP;H.Z5"GhJDZ
+%@(/8:`V,?]O+Y&0039iWce!*A8":qGG\Nh:@tjNG%ml at .,suO8H:[Db"XR.,n*<\$9LoD(N<D5Q8&tn!;*+O&I$B>P_pePF'p2Sa
+%mukFp1f'"SSc)[hU/_%i-s"c4D>/T[*Y;=^3PV'Und+4%\SX;D.:!qFTO$"!#o8B"2_#8rl;hL%UFha4q-EJRVoW4[ZAY7c-JJ(G
+%G`MB!%.nr8]_X7QQ%PeG at 1rQ7B+$1&l[j)33A]a.JE]Ipgp>ejQPT:qH]nNYoBA2>kKVQ]_8)SnY.&2Z^F_*t+&%8BLkrP&o-JZt
+%g6U]GFP>UTO]$a>&RrmggqZ[N3;fDQfeb=%p7 at Ku(:l)9OH$HP[qYtYae^LHH\8%cW)-:8IBOuU-6CUu^Q)o3,"HP$h8.IP8Q+H%
+%lr^f*\%FuUB2>\b/J<m)q5S_%a(os/`ep%u3d^Yp+?!@Z/BO^kgX#s-QH5b<B"3nFs*^,E4_KO"Qmlr&-#p/"%`hB"FGcW,<f(KP
+%2bO+L]sa2.pR+[a+iU.'<]Z:-_!5^R1D5fCeSMW-dUOD8"ViPrO,up(kZDI.s7`25"Us-XjI0]+pQ/ahS7p5"@;JY0R?4DETCbHV
+%]hC."%CTbr[PF,d]A5VDM2b[Vfn.A<,EQu.BhX2jFbl0.MS7S`MR%,1b>utq0RQgnOGj(WcDn.=i)i&!-Q1"Z;Rm?.>8jj*c(Yku
+%bGe^<b+`k=<nt7YM+([.Z)Nr"&<[foDG#ju=Z8).n<:L\fBKt%N/E9ESUm@%g--b'U,A at c=Q`ec>Iq=YFE%l"aF/WV(;./LZG]Mr
+%IO?^)"eMl9jZ?Gp_:o[[JsP!,+"t's&iHS>grc_+jt2H+#^<k@#RdW22q,`FM:]2ml]$3N[3RSKQ=02s;f]bubNDf'MdB&^Ipl^M
+%GsVZ3O`T.jHP^TuP(f at 1-1p$jN%dOk*4'PVoX!F6(M+?`3`D.0Acaal)K!`H,[5>OBEn`bjKRk-2(FS-B9Jgk<ar*[f at e@0]+,d]
+%H&eiH#A_#<ou1Mo6YuM*$(l]CX:4E2)L,I4aU9r\=V7V2YZt%.HRL-tM_"ebBcCb62FonU0e3S,FN`%40"bmD<]6XF-;tAk\;@N+
+%?*=9_B&t(\IXb.):0iM":@i&1k+"aOr7%W@`;Sfr'P=`Uc^RNhBDk<STr at S8eu5C_eglilPa/1T0,P!A878?FT3/OFLjs9dP'i.H
+%S=0GT]UGAU*4jU..4[iMB'ZROJ_?ZJG:I21O'BOt<Zh&'(OKoAcagQ,jW]Y=]Z6V>P[Z@$i9!U?4MV.JFl/CdTAN/q683e>rQ(K4
+%:`k(_m]dos'';jP.4KlE#;2;Jlu#u%>k=aOerDch#b&@8npX4QYFV70d&JlNX/$T5mDteu.L1%*Pu-dSXa)9X=giU4(QtSC![1H'
+%EEc7c-d2bLX<b/nN/=R`W(L_1/f7[+Q`):"d at e7tK^h`6/:$0aG73]c2&pSbljMPaKoemJn$<\7fi(D5Ga>o9=QpH,A_++6SR4f/
+%`)=f;A&9q+c5`!p`LT[\>H%UQjCF0DPYa74B]q"dW0FhIrS-XB;hqLImE_c.fpJuifpT9DWmI.Y=_UrHjtQVRq:YHL%p3'T1f*\O
+%PH&_-50L<!Fa'FLrV._Rm=\)J$9$>M>+l7Z/N)@oLER-#f5bgh9/ZPBbV4mCTQN'7!G7+\i:F0FD%2!R+r4&0Z&<OW^_0t(/NK5(
+%SGc4lJ at g6tA]j)!V9#]CVbrJhI'F+)#>_SIHNB/AF^Sg04Ai7DS;4kA<]"Fliq&$#,FGftC"f/*T+Y_c352acE]_!_C?)c#QJ,+S
+%iYadT\2nm?CGMAIkMbh=oRqUa\b<@k8NC!.^IAD&bY`Wb:Hap&0'uH3)Pf'ak^TifA&B0a*bd!`Z4[;r:-;#c19'H at I<.(ULorkB
+%5iE^")p<b-WkP2t?fms)&9(R_#A=1h">8)Ch_AHK-OKDbJ/0Y\\IUUn:IM]q at ._k@^`!tBoY\G$5AYP^OHKgp9!+A8j"M=HUX'oG
+%B3t1RXZo8pA)J*"DTp#tleAMQp$<s_L?-PH$=>&iC;>9WXt*F^K`F\`\V-&@11".68TT`2rjs'TI=;X(cV"YSZ_lTZV&ojKirh\T
+%Ak^BBNd9SJR at qh9Z6VecI@pCTX7eINaR^a\dat(>%.%T*X&1^)0ip9D2u-bm>=g at P?L at QchJ5:tc(+<$'rTU],s8!aiF$Y%;oZpQ
+%`+ELYY597hL3=f^"JhK,Q-X5t_(pjF#Non+27P]70_JH8;UYHIS-O>`'5lgP9.hdc8FhF5&,C*t!ZF[sb\f94Q;j&I=;3;rb;&p!
+%Ph<+dk at TS.,kVM\l(#*YAJD at BUU/OfCJSVjf5](.Hnmg@"\G:7$lC5_`G0'O#nlpQV^u7f1:fIjUghW3Bp6k^=jc%bK<PRd_L!,L
+%jNln3eLcUE0Q&Q(j-+i\g7G??H-*".JS8XT3NG5u\,_-TRfofGf7mPR/I""E*n9_oU^a at A?s96iME9e3J)>>X:7SoY[J;@i'k7gK
+%3$^\DFH9DE,4G8h-[S%/O-CRZQ(pI>YJCRI@<B.S8na at l*phU*9!6>jam.Du[<NRR9pP,l4Vp5P[uRqtkF0'V=i-V<i/4qc=,md!
+%Z/A at e+o#\?nQ*G/:ephAIiV(egV;cq[dWk%P=@1mK1*5]nOV7DaWJXhCR3P at Ac@3<O?I/dUL0>)]*20HG[+LXK;@4YlHk?6"eh+-
+%8<TX/9?;:ECJL<Elh4%6lbU=hi6H%-\kVT==#eaLEek7SXZ+9dl>(bGc"Leja#.ctH\3\75)H&"o]sMkKg8T[a;0l&9C]6E-4hQ$
+%PGI8odG"6P^#(VkT^M^pQTH"D.u.uk>kksNnu4a>DV?_ZQ,.GE+l[IV`Q5`raE=uRYF at 9+rY16'//q`_V^.Nihiti<U%QnkHmfH)
+%c&oKXM:4GOWF$0-rq3MGrVP`Y1:7CU`M^#fqTb'/CGet[W^eO,RbWe!*9C[Fa3^RR6f,KNqCW(?$WHD\'T0PfH[BQj_<4cmH";o3
+%49pVkZ*X0fkY=/Ek>N_uhX%7FJOC./6kTcl!'uY+HYHsDCeH7in7r,Mc0>(qkJh#uH8N,E#Y]f-ITkY##R^[e at fOp0-!/4T2?gS8
+%8YXFi+lm2/V-lIXYV?'ji.h,.+K at N61$!r="4-G6c6"aNjSt?Trn6P\msYANK'REl2o]@roZ$j,f0r;e2*aO\Z<.RHVdrPcn8=Y`
+%XhD80N=MFf6/2H>&hT22FXRP=<VHPufJF"=)!#-S?W.CVURQl7Tb'(=]!.K`H5$1$I=A%#3@>gjq7J.up!Xb`qI;bGBSi_nZem+9
+%SD;:jr`6oMB'a50*$p&(KK3CtOd<sLe:N&mKXUq at r\!3SP at AV]8$Uff6f>j14EI]CdO)0(_6%t<#iWn:q18D2+1^OOX&K[KD]VF/
+%23JJmnpOpGPpB+fOJ`+XjH[/S6'NWjD*@^g)7IIbA!*83"*Ps!Ln_#:^R`ToN2#pW*P)'6G=1ZIb#.3 at OgD8'o$7,=aA4/0FJ1U<
+%:ua6s5<+WjH[s>`,9oMSTN5E[3s at 2L_;*q$bb/:R0Ut4=?5[1L!a&k.;e%oIT!S!!(osUmn]nb<^^+8j?eQ'4Vp"$iqIW!]4*X[T
+%c"/0 at 0SRXN.LPVO_`!VF]86q'N5ICgA"5K%Q&01IODU6@,Gq"/Xh'W$386X9Y>VJ5/^Qeb at O5u`r';9aj_[c^ZhM+/8q2+`WO.k^
+%2$g-I>e&6EPB&QPX&][tO7U])@C*EX]UuAp!K)n&K"EPJ=B*'-3HbPEKj)QgI$n_2+RnbF at _#PGg,U505nZ"T$esi!='1godqHD6
+%^3NEG at M;qFA_nPQ3gP&iVYet-egXeGT>:L(ds,(]RV^(gQr;G%msrK#1U>0N?o^<>49MU)bV,I:G%Ao56_Cg;6c7t=Qc#H\+#,-H
+%#Ggi%b7I(*^iNBghl/Gjif*pgs0UQgj4o^C!sA"S9"M<YD_2dr*$"YB<0Lka7YqTa)[CcRP+fG8J0$A5#E-%%^QZG,ZC7S;N?EHj
+%l"kbWQH76ABh9W>1ZJ at IHdf=!kLW80k#Bf"A?.O%o9':K#'fm)H[_C^*#b.,`jTHE;j4KTG=t-0nbfK_CNef)Dh0%^%uBH2*RH/a
+%kX^!n02_,?Wd'[3o/KY_#Lhe$jF/_1&+*U"Ji]aVT7\<@]qW&RW>rAPPH'"PNt%YI#91Q"R*JiJJ>H*dUKuXgVQD[^o7a/2Zgg,C
+%hqA0V%c+iu$uL:jjF:0%L&Gbla^sa)^*BU_qm?;ZXrH=qnMJd:c:AK"/EEk1,L_mW>jSn1$'Z;!RJt-OW%YI`]V\%&6NXSa4%]bI
+%Xao;3cA[Zt6kV3<@p9tQ&MP8/gE\GGHX&_C`&H!ik!p8AB5K5fNTg/Z?#?8SKa\M\;0/<5RV6S-0s&V'W':cKKCu/Y`\GkOB-)P9
+%Z_*O4.6]8REjH=AM8giag;YUul3X]j.jRYjgDaoIh_)Y]`6)p>eqL0UXoq0%?:u1ErsFK99K[:`\ZI7.cr/JRao=:2"B4 at BOI_Gd
+%PFhCh at U1Ol3&pPCC9Q+<@U<M*25iIumn@#`HW1&;m!L'IP5sutU\GVVqXn7CYPt?O\Q5orHKHco::b9EEsIUQq/4<bfP?^s$k*M.
+%KoIEIJ-co&ZkQ2._Xl_JP*9u4'$u4*P.,/j#$%M"Y3]Rq:\:smYnZdM+'#N\F+?qmJk]/+))I1I=%b]OS&X(2NrQMXe92Iq(B'2M
+%%7q``c^N+19g[u*GE45.)RK#15p"dXV!'e'XG1_%5CV,]W at TBojH+7+"2WKoA4]_(.A4Lq)pHTGYT"A1?J%[7ht3T:Ot<u0/3$0_
+%acNIYM0?]k\UBJ.8j=01,ug#!@_*F*a8hY!C^JB9$eO_=?FT0)Ttmn&UV"2h%0Df\j.]55&&uYddmZs-#d><U:JW\>j+693o,&j.
+%oUVN+pY2KSa15V8[,&Zt",U1Fm<!ZTH$g*1MP&-O802W^I;jN72;pYSa[=s7$rntpeCnJFh2F\/o<UQ(hi'3p@'5UZ+E+k?O`0iQ
+%8uqY/n:@lQfpAuQUd>V=E-J.MD4Y`OmI<S>'*8e<L`m^`FtUo>1Q2iulsckbHe5E7cAaQ=F-r%Tl/T'q&B&Ws\Q#j=n\L?p_$[ae
+%*^6db#Yq+jQ7%10%-CKDm*m]d/j.+k8Ff%rrl'[CE63:DZ/8I`0E5R_mIh7tfIJlpe$Y9O(mC=j#Peb!FnoCu=,HIlK^eO^P0ts=
+%`-9c!4Gm*&8Dp69<[4m*[X%]:']]R6"7(gh%hXc"<,e[)c,W/P+HsoE-SLoN")!lNl.Uj6j83^+NP`]A/fM2`^"Jpp7"oW^WPOBh
+%R[oXP+J4)5%gd@@-FdNAkEF\LCA. at R#Xr&<leu5e\d`plJKSk`bN[d1mF?:1.1EC21l/je;spt*D4dl at Fri\I0RL7GBU'%T8PYRd
+%jh0B(p$4PZiWn*]TBH&/4ES6C at B4>UMqfb at S(5Ggfe/F1Fipo$3i`cD4bX>gSf7cmn!?\'ATKSQW9/2D<Wi".^Rg?gNqKm7&1e at D
+%'>s,bEn?Z2g:4%FDrN>jg(aSEXY:'mIpe4"I+a<ZWc+tIjnL#b3KI^>8u7PeBMiZu5qXW[k<2qh-WhUgV3ER)9KnC^WBO1 at F9(:[
+%:7W2@\/Z=V2Spa6'q!Tn1#)b?lhp\^$g6GQH'K>fd]GO%T.mhs"Gq%sKWKMXqM:D=SRqq-=QZ:X_<531VTbY"QH;RK]8:>Ms7CsW
+%A/a_mGnR$7TY)kI'A8BXfmD+E4Dk$Ac6o,.>eTb6;M[*HW1>fj(*NM<jW:qDR^-Lu]hNK$fWpY0Z6WaXqU"P'.%:&]c]<hiH-2m>
+%KqR7tI8]*KW[t-c]A9uTC[e;.G5PZeWf2At5rA<%I4forOk&<Sr5Gq43:Go/fWl$"KhDhZ!Xf(E!r<Q3;ga$*CtZ8_q=<GNqGAJO
+%\<*>QcEtD9(J32Jn.nhTf'/]^SgdM!'[.R]`0M)=ZWdNj3,glfW>SUIon4f4Od\%KQSqdjA:c,HfT\EhXpm;8+(X/72.jZSfZ-/@
+%[M9fWh28B4b;nF3<X][oU/MN]$RT[0b?(Q9;%9+#qYI at 1cGA[^<[)u'Zgp4N?;=1;+(BI20rQ)8P!"$hS%,B;s"c0/niqE7.9lq"
+%;Yqbi/oq--NhD^fBhc%2@>_=7jd0e_VB$'Lk$TdUNkmB/M<\?65[g]>LmV8imT[D=:@7c/3_1U>M7]1'jUMn&SYe*1Y2%sRo%Ott
+%_fP8[;m6c'KA^tQF at h^O'qHjH+s%W0WOT%AOlTa7]\%:%iuEVJ\-l(?crkDB7./WcFuag.B*d!;\O"Z8F$])a#>rEi?%_*bmN<"&
+%F2?Q*H2H^jeHOi[Zb6j@#(n#e=$CSpB(P=;&l=#ncE(r\Y!MU"L#JjdVLcTS1G+/md6B]kIHJOm[IS6CGLFNkK!e$X)C7R1NXp?c
+%G&;_&M8TQM at 4NGUMGdqQ539U/8TGXa>h,"g$+QWV1(m:m:dh,-33:E&:,j]WjTb+JaXlK#[0RIVebb^\).`$ZT/L.ld,bL[;T2dR
+%cH/Hm][so9Nh#j,3\FJi00dc3!-Hg3\5a^l&5Jjr\jA]"['h>t)X!E>EVY'eL!Ej8F>Z'#_6#@h$Li;l4h&4D^[lHmF2-E%kPS#1
+%KCFt.Bo^jA"!IK3YeDH6-%Cf5\[BZ1#<-uLj+So9Kp\+6YgD2Rk*V*.nZJ'Q(Ied>c=Q"PFJ1d4+61ID/gWgCb9T/p-mXc^RK:#a
+%m>IrTSSY5%O:p:Nn=.-1c^\%="D1Oe*D2PAY(JLQ0<$mq?P3\4KcKpbV%=Si8u73V4G;r'bYY&fK/3"p$@Z=+\tlmPKo7;,?$@-$
+%"MX9pjlP7Rr/pT&"PYfekXjJ*cfXC_h+fJq?oHeu7]rmhdLjT1lk3K$HF1;1o-&!9/M>5(+d(b:ksOoJP:p&%QC7K1GnZnC&_.WB
+%A(N8u&m[PZ,mWM(2Su^O32tW?q;#X*'RBftf)8>m9\9u[7irib](<h,%"i/ER/TOP5EU9;P-&S46A6lTbj=m7#Tc1IVY1_&F3[WQ
+%:HS`V-op9'M=0feZ4^@LpR]5d47U3r2(rR'B&`[4/V9?hd^4'`Hh_aT9_A#754"]#^NU;dalBR_1Rlm<IEV0)1&ghXgs%3Lfn8s*
+%B\Lr:kWa;cX5mDrl:E[2bm1`ri]e\>.6Q^r-b?W9-)6FR1(-Eq>63Ye,m(?Q=lo:8A^@].fpYKO%%5Up,8h^kZNj7f:2VQ#+L7bV
+%_<gC8K7q'(B5&I>ec6hfp?,YpKH?GZ0Dg_DH\YQ0$%&JaE at a/*$[q"W/Y_7Hotb9G:iUr)fTUr>*?,`1NbU]\blA<).<Ue/>(&;!
+%Ze6>)UsMZ\)2p.JU/M1tVQ,]"V1dorP\e<3UJ8*rEXa?R:J&ntC<E.b0R32t*LeKIL-RJAOHZ^PJ\5nq:8-!SR(sDG1(_-\Q^jNl
+%WTuKP2.fn*E&O[%Lm6t at 0CL,DoFc'&U[dGSVBiOaNq;C1F*9N>(=Z0T2ka'*W#IOpKWOLelV$k6K&,<[Tc1.@<M,X;>gAZj3"I&M
+%6:el<)[ReVA1nDj&m-Z<$mYA^&b^c)-r]Yq9sielcK9DKL/()'*7X_D!:tDM9:^:I'U<hT"nE81olD<.I\q/?mm3NLj"55)7=meH
+%"9f/pY^tO$F!=dNa4*.qP+A[nj)!lZ)c0[67*Rl8],==@@S5.pF5"C$;)-`cQ5E`+\I8_r>l2FT%eO3aNY;u$&Xppq)DThEQXi^S
+%ef4sZU2Lu'H.0jQJT=D8<T>!&809/0fT3gfRC5kLG\O(O(*UNq.C0jLI_87DRo?eA<S;%MK,eO=[R at VO#BogI.>K4.V?U`1`glgi
+%UtTI?Gn[r'6_&m"&XTkdgMtS,SGF,ho^,aOQ"h!\_HWaafdnI>jiNU#1=p,T:pur.8c35o8,rPr<;@<f4X^04*hDaOD,f5XMfafG
+%J,9`-SQg\4&ic6 at 2'mp83f,egn<jcPM_8n_706Ie=3iJ9<_j at nbfjpJ;fKjNUbI?f`O5DM*?N"(a3FlOj]:8]]QrTse83VN#3Xa_
+%\'@`<nB4ZZB<_<4?]arm+U05A1Kn.RFOrR?5jjl(q8ZHhYEfc'TZOK"\>\TUVnP`JOTJc^=E8CrVo"VgM719*U$ZZX"(j)loIFL`
+%4aBE..@"`*lao-!;$O:(;dW$?#gUY)YZt.j;WSb)]2Nd)(Q8H+^`8BC/PU#@(hB at n5rDHBlVP#;-MG4I.Kk>)n\&&%a;oEW8cGYp
+%;Bt#\5/^h/(EA+JkHY7;#/7"4+[0]]P&7MfLXUKQA3KK_Ej9P;5ke5LgAMHq"'^t:.'9aHd"=02GbG_0!k!'/.o\/8aoeW^-Ck<X
+%!W?0S&#:U4k1E?7Jfffd]Qia#&!@Vte?-"b;(.Mkqm at d_)lG&i1N&ohS=?FeSl>7r7"'_b)1224-.a[!1;=)l:C*BcYhP2mK*=1l
+%PAG8/UW#!uY1c:gdq-BOM!#kSdZ/uU#[2QuiH47!(gu,saZep"3MD*pc]+E2-WtKQ8*i1+dh8mfWLkFmCs+j0]FR#S<]\<T*:iDD
+%J5L=P4Jp:[]snTT2iY,u0H2eIUZOcHKdBTe4iaUr_$c))*:tNFf,VT]6aZ*Jab;s,IS$/[hdhmJfEpCn6e,a64XX49dt11@*AfXp
+%rc61G".7=Ik`Sh:CR%4V%P6&3leXL^H'tda(1hDN4k*u6Y9`)$8JC at I32\u%XkLO6[HM3CK7YeHaSp%/?;=h\\tt_A9OX#((q].<
+%gGIa-<l.)qP9?VTcD*@--RYF''_=URs'MMLRY((l$c0FcUDujo7a9k`P]QDsfWb\QiYTuSY1lc-RF8$]o6KKl3>lM+0&fG\o.SZ$
+%4C_Lk0U!Ts<Qfi#(u0QQ6&_,HAI0OdVS(R1,4%#;jd3dP7#sIgIHQiN!YW#cS0[hY!AMUX4:qp\j-nna;r>&X`h`kZDm\4ij(`r%
+%Bsp%Y])K'5IU(E$5h>"/"9D8jP][Y at o?@o!aTHTmGSi*-_jl2e^m<Ab'%n^9;KI7-e+U6C5S>t0G"A7)fTQ#:N49N\W@%j\"ar5n
+%s+tT@*7G*Q(Nue\O$m=im!"Xi848nG-B>bG`G\Z6iP@((gQBS%Q;:BiS&#qDb at .VQ-P-Ad>2Dj+dmL?EJR2A9*h1)+BRUFZY3iZ&
+%-W0+_77,TthFV:njVO+#39D>cYLfpS%TieU7OaR?mZHh</0i?->- at -[?WPTV8l8P2'..gaF/'C5=H%`_D\GHX41Bm$:"%5"[MnuL
+%,Ird7^uTgbPf]f!Qg8ihmB_dm:*o%f5ErNBIUfTSVj'A&>;i*$D_^-!GedKirX>K=AV!GHpM.8klYj=i57rPkZCX+h2QKoOBoODG
+%'E;[s!H&+^"@E<s]M$M=@J6,!.u`W'1D9Wn?2YJB<ndA8-\IB?2ko8Pr?;Y*GG^s2(H\6_"/qBGn3crXN>g<+VkJlJGJ(r5;uBS$
+%qJu-F=2;gd_%YVg\aI"P8PICGfllPk]_.bs/]i)@qh]_K,?Q5[gXI7f92'b`Pl!\hKOW;>rm4KEW8k9k!D=rEmrN%,,?7Tpdq1jc
+%hEIb=h3WM at HVA@F<1*#[m[H^n,+82FXE0=>:sBTX2t at M9>4T`*mjgk2cIeVRcRU3E02Om2mU<6?a=PjI6X.L2B6b?.Pnd^=WTq\L
+%acXXhH$J*f%]qcb8Tb&PArBHSWbta$M5dOEJCJi:)r)<o>AljR3StaDY at sBKb\7'u=nZGiP.sG05"G4W"&"un_j"ds+I1#i6:p%Q
+%+W:T5UC?-tYmfk:R@#M[SWDboVA_W>Wc:e1)j#$T43oC&Js<CCql)OjH0_$*aZ;*H6\t"m!%VMW:^j*'H;Sr67*kO.'#<iC>cG1k
+%R;q?`\u2j6F at YnUkZ=iRB>;+0kI5L<:b-Q/XM(B_kJ?9+k]+=j'FfWBVblF?*;eZui$d*UC3/W725l<"p*njeT\7Ci3J^'6<dM'.
+%AF![7r4R!Z:k<[<2kYJi\gE0/ihK/]rHV0$_QP%UaH`pSRRCr,8(!QcjZY**4:).WrWLrDYEOXO=OTehJ$#9T(PX:pPO\qUTDQ[m
+%M2fc4Z^9Ems%kVsCYXf"rLj5\jQ&lEOOJ at BAg)&&b[@a?$g1MkI\j4oNQ\=k]86]?EsanSnil`i(+]6<-sL`Fh#5Nt\nM_F(74s,
+%Oa92Oj_R,QNVfN3e8IA$FA2*a6&*>MPJm,J/u`(no8!HS&sDJ7>0=';7(4]Y[UTpsLfWi<JJCS'%Laf!Z2gbPEeZJhg-)m:;>Ge^
+%Yh8?SY9tW6Z!Nj!nM-Kt?sRX`RG$'C[gj$Z>`Fb>TK]eq9*fNd+.I?JbRYckE''9dR!*8ffGrc">2)6+mID),<&nJeYPY2`=jm5P
+%X.>`H0/P9Wp at iuk#RQm=72D:49g3e#f9 at tSe/=Xj]o6W\(T6aMMMW*KW_BhqBI>05()0?<m!t,^Q\;$dj!dh3H4c4p\]0bUQ8d'7
+%MuL*jjPtN]1s"]%$jT!=<fEQKK<!"9/K]_.NfFjdARWlTLWbE5T/+dj(kI\_'$.;Fl.cSM\XinmKIpIm>fY?(H+l6-";Ti`9:M#e
+%f83q1^l73apSg]t;r!Ue@*1-RD=/(A,"Ya^S_Rpm2Vu3u294gh.!_,nf6G>7/.#fI#))<R%Gfd70/[$mfP2`4*dSIrF at mq@2Y]G1
+%9soarH!-GDkB7oqAIQtG(0[<^qedr7%Yi[J/`U=nDnhUN%d]C;OFFM%"rZ1R$8`4i%,>b\4Y6nXfiK)A<5t)fMC.DqcHZ@!@X/p7
+%l@%gN=@O`f$B)T`h3T+T:AQ3%5(>;#F]V./IA$77P at X.Dl?'aESMn9*:jJh_>3$/N?&B`i)p<&B+2%_&250L8B'6^!q4'Jomj2$S
+%:X5eTC.Q5C,WWJu^eam5jIV=-%*`iCG"-TUQ-hTd%oR67qp^MG>A4E,!<Xe':<$ioU4^5P=S!CDqOUYC8YN(V at eMW>Y6`-E,@,q+
+%&W#D4KU%$5nuZHPX^n5,q%[`P'/q7Rrto/_!qZQ\j1dQ0VLc:nltTJVjRdnj0Q`fD]f?P2"1^(lG_1Z<MI;C(r at DN\/J!C9fkT%`
+%p%[A+<4Tbec?.kE(bYqDBR>Ts[eOf;W!qK_rbW.:7]%DA5=9L-J,orM*meB\ZuV&$Zs1h]:*%sA`h=/A7CBG%n#KI^l!ngrKS'e2
+%jsiTX?72GB\@X++1iN#69Mdq9D\e6[\_DZ[7LKNJdR<&=XQ9!_MI=kMfU/\(d<G]q5GNR"89u4B2l$,=&kXIn.uTYf at 4#@TnH?$m
+%/]Z$pV[%(siKKVt)JJ5B&O4s1^*n^"$>cmlU-L/?`faa?I\Zq2(P3$Y#M%se3"_$L>VQ*Ijf$s+R]5eMb\LdWp]LL/4]thsVIb%V
+%jR#R;!(`HGr+kV>g#o[*9C*.*mIeQXko1=YF=kgO\B56>1tUp&2[3RQWjcLDNKc09TBNo5<Jd6K4b$e9O$+t*+'K7BQ#jpp:(o(.
+%4"q'hMth648*0K3;N@%K4^SC)l9TL39/(49(uA0?kNK?]/JlQ6:?jjk]E/7FKq.=5jm^EE53^E!9!r0V.&Dt.PC+Qd8upqE1;?:e
+%?pO?6T-i49W21.&"]2>(-Mf97V`-',Qj:*aqSJ^oS68lsCqXb&5%Wp&[]TdV7hB).\^2_0JpphZB3LGD95?)f.PJ0_aikRc-\#&=
+%a at UV*a:`t)+BEi?a], at h::uXQWWB_";(7:u9FTgW]`9%O]$>^%*4Ot\ofc9.*slZml=p8s1KkF1KXjC[0TV;3B>PQG:0tkmV(077
+%Bao#p\#7sK)tB;H^&BUB(,!PB]['t!H;)Eg`0O1EEorodhaSgf_R"fhbF*+UZ7.:1b..t:doZ5C@&0 at 3_M0G-0:s&Lmi=BqO[8p5
+%NnU&(\0SW4!7*OfA?6H>c`a0ch%Pq';eYU]QJXoAcNMSYE`TIsM%,NZO=?]KhR;*_R$bW>o84jnjKK+@@(DBo*?7sPCh.BB2"$jM
+%mNGBp$0#?4,6%>*L[a41qT.X&PuRN;f.HeAiUu=*QZp#GX$-AbV%GO+5f/.1+?.-alok$\+LZ6:S6g6sa;3l\,T[rk'LBG3/0Qut
+%WIsFT4NUQn[g'=PMqqM[[BH3 at DWe,6T&5,50!:[('E(4B\A)#VkY0'p^'4YeG?_+OF$tg^n&R1rmK>99<L;ee2"#YaXgHrr5E_A)
+%Vt$ln0tl;'3iiaccD9mXBo?t5.3qQMY)=mq.8,n9OfM;J%UC(sq.4)eV*f+[gSUM5(=]EME%%4HHoKfNS'NYbE<)uKKk->VSqmc0
+%Gft0CKW.Pc[$@--PJl:T^!ar+-)iSBKo!04kW?QL at -C*X[3T0!,1r6+f5hb*'WL)EDpD85ga+:fPth8-&tED)7,W)(3n&V'd[0BK
+%kM3;7N]rcd2jET4glnM$D["7bFPO&;g26=,GT=ptUkC#H<6o1^1b;fKVAQ`8op]N".Z3C72OKi%UR,I-:k&=c_YpYQZ$i1tAZ,9n
+%)J`J*q8ecj_]ZOrUo<W/#BLER;3`a,B*C#,f&VnLWrh8)-)l/)<i(e4F!*-=9bs/kM^V&TDpgf^GT[,XYXY^r:0O9 at k/dA-M.cjf
+%A+j2n2"l>?o6`W+ik?bX1([.k-)SFN1Tt:d0"%Q-#<k0DKRiOP8i-=Wi?[M#k53o1c1rs+gr"RNoL#[\d`8:l/:"KfEsp13%V%g&
+%>]Ff<APg>.PQl<RLW#rG%:`.Ji;&GpSET"$1#8_G-`>[8QO at N&03>Ji:CU9#8SBA/\nLBCN8L&US&P\nZH0IRG`/JO-SYcPW?Usf
+%.;<gXMTt2ur-Rg1[XLtHfugu')ggk at Gq\I<p;DbZS__ at NebAfAZaE#[SF^"[@qqVsms$4Sj^MCl at O8mh%Ku7-Uk)2dpNOnP9,L7b
+%M*7I,5jN(77(8&<\ko\[488@@4QbK54bnJ6mi8PB;tlNl4>-c&$QJH,/1fr"GqX7[#f1BZZ2"7(Z]NjI65qUK+B;%Soq&b&a`4)>
+%H>+i!<Y-\P?3"W7IM>&*9W1"tr<?_ODLNt:`]5J\?bhuC_A$jmKX-!@$\S6r'C+$iSdo-E/_Yq1<"&NYqljL at 7QqQ]cL7fj\3gtB
+%VEIX=n7.H%SO9%Mn6Fg4m=>,tiC9$TJs:E+P2c/NC$All'(30M'<jl at Mcld\?d?8k+#*7JD(BKtI]3#:3>>g7;8$'%(MZ84jLPAV
+%;TZB)p,2HHJ$b#PndtpE)]o+LWBc*/X>qn3pOP(r'&^$^dqk7U*nCEbf)^=8Fnh^Va@@!L+SESu9a`Uk_ihFJ6_K2-&J%&M at Z&G+
+%??#eY]\*KN00hHBe^bMS[\9n1JOARaBCdonh6fOG.:3a_a:0LEEh%%5N`910g3jWD.%DRGUm0A5_f_O;K;@]F at 72aV6@72]L)DJq
+%W?pN+ at 7m(\h>dZ.!.d?UD[CfT+n1,q'f353Ng8N3&8/QH48fa,AgGA%YbfngCl'6I%HhH5F[G\aI23tbmYI$Gb,oEJi8ZK$lr.FO
+%A\;o,?=47 at OqO%g8!EfXKM1$lq+r.+2iV/*_Q54o-?&ERN)^cXVHZsCa68F19Ft=_p"+YXVJ<t]$D<mtX+#<1PbYX!;;X;7Tk@&!
+%<+F$JXFkueY#")Jbn7XjS??>K+csJX`1\DlP657fqi$uQ28>EFNXDq49E?qOZPd%2>7W74kr$j"Mq73c>LY)>m^!NG6:j0TCL1MJ
+%NS?q.Y<$7%es$SMa!G4[H!.+Xo%Vfg-$eEi,dHI2m+uV/m?cQjlMfS_(U<s<<'4jR>*@L;ATVn3CXe)?BtZ5X:1,8W:J<NT&uQOT
+%9eZ)@!`OsTRdS"X2rgHmF2X at uP(70!EG\C*?6hk[P8cu6N_Y,bR!P@'Rg.#Q9%;!K`CPqV>&*V"(4M+X-S91)9?W$@_l`Opg3,IL
+%'iES?"SnL-9aURA:u;<sb(N at rV^c]K\)ZmpaW>h;"9'6>Y/@%Xk^TKXg.uOt'Hgo!XEtMD8\!',5O\^AQLeZ"`$6RQo^R/uOA`2,
+%\Kfk6W9%he\jTaF_>]M=TBe<Kq9BZ\#+PEi*2AF+gTCgWm>rE+d&n$T&8Je>T=FdLBV.PCNsX(48BOm<^"7>77`d*)--im\G3-<?
+%dn%2fbRtR4&jh)iPsI+uRJ?YRru!k"$k;ZK*k$7;Hd+Rb2R6l8,=ckqDuroe"qb+r?M:P*oBaqQkcm"(I.ZtU9AE=QBlhsM.Zg*1
+%+\JgaXfP3Nf"f=301G>=HEu5oIhR#qC5\VAe at BKoII`t1TeV-f".!"Ko.F:`6OQ4lZg<%O<g[ok!GiA_M*uVA\[Tb:oiX#TEt6h8
+%>o&utPbpah]+ntE'Nih?'R::d+<G'^!:u[W&RLM&/OORl!8"2J=s.Drjp\9RI+V. at 1#7,-jM79a3qB(ZnSU1Mm&K]P4gPf&\`b1W
+%8[lf-LW6c!YU&e,E!EpV*eX2!ZrUd3-X[kZ4;TJf%CgHA,U>c`WRPe9S5ZPO?J9rVER'HHERV<Db;HR&9F7_Zkg&fDcV@;0J1![C
+%HC;PTV\,[uh0q,Q]I/Z'Dm,)&I)0:UZo^HPN'V[0!4uo3)k@'0Pe,FY,.flVi&be-<(GHbH*P"5NY4WU]-).t1 at T$j>59a0EtjcA
+%p!G3ed<?M=a_uMb*6]LC>gZ:EB8)YW_R`65[LWKeRXSDFb"i?c^(gT,anbHkA>sm&!K<MU`k7!eYNdWD7SEe/8SMe;3Lku>:-II1
+%+W.*-`n$=YpQY4!<i!Ale\`3k"ttbpG:oE7:7-^)@)qpMFqc3fI/RL$cUuBKigEIT/^G(\5Nn6V&._p92o4[&JAs_2eC):\?TXU@
+%LRp0EF?8nDT79"E_MoUT*Dej/b'EY+LQ^l2n!L56\9n$;VQ#4&ARq9[AKmYGf>kV8re)*]j%g4K=!3hWcakE\ml0(e<78T_L!k at A
+%&._UE/\g+J87h(8fEtPrd:EeaA#6Y=fhGY!=(ms?j]!iP5u@@s"R>CBems?/9$Yt+AWr$L`83]dmj-&8;X(6ETiMC9=h^I*ToG(9
+%Gd'lF2JqbgqZKdQmSlA#4.o'B2+LGnKIS-ekF.MTU^<9]8+<*c`&5]+A&[c(j`rp:agO.D02M/k%XP$I4"'dk=NMs(W,\ASJAd"N
+%HF"AiK+h,oRsDd'9XoUDE&*4*e0Y3 at 8ZSYlRaM:?8R1MlhA<<lA*ahK$?RMrldLKndJL()U"5P+JN]t"g..6-P"6=T'U?-B['e=L
+%D0o#3Bu]n6Z]o.X)W"$59EOP8;+[UP4 at VRW=(&:20T?9kek`$^fIHpG5S0S<%ks?+rctN_5j4`DU]eL^GNP\qMlC='S#-u?p,K)c
+%.J]=t7EYBqP+J*YZh1pF<OeJj5H^(G1.CMa*(b#V%e<j:T]H;a"UF1&SNN&g1pUUTZ+_Ou?AX0`gmE at bFQU=Clg(;:4LorT.tlg2
+%Hs_Vh(Uon>kg]BV2gnZV5RchfG!b.qegI;].,r,2Pc\T6NeQW(DiCub=],gD'Je$7`9uKS10mLN;Th+lq+b6SnMJf at h,E*MO5!_f
+%TU*B0)T6n8Xk5ZCI(>;-.Ul.Yg9g)S!c(Ae6!-DU8X[[?Ml8G1?dS\_Q>+Q,N8;Lr<\h->`Nqkap7$e);_PlB=+5euGn=$(g9FMk
+%!f*Gm\*m9";VFan%@;p(#Wq0J'mJD%51-fa]i0G&0=7i[;]lYsmt#k_rJ66):]eS#F58_GG?j00;l/Z3hJc`;Z=-[Vbe"s5 at eoip
+%EWG19rgN`;k'sbmN;"C]2T8(bg1SYFDkt0j=C-L>BP\1L)OpQh1E at k:rZai$Ek:0pRN*.%]>?+Hc-T*;7otZ3^p.)er=+*%K3e="
+%L\S"(6k=k4#:EqkWbt[[RC#N+ at kK7kj4XiIU#75b4"oS'fGG//Z];h>DF?&^e:d-r7\T.UE&h#Xif:Q'C[d^uPgG`-0J>YXU#96]
+%H"MOOadgjiTA\Jmc&K3 at 4r]nN9=mYQ7 at CU`-8)K#Y`ZIOl&S$P\I7A5>dhCnPScT'@]_?':I(&jSI-nq3jM`li]?H`Z'+)LN_[]G
+%dr"RLq\S^sNPg'6[OFhZVI/l!n<e%O+=Jgu"6^Sm!!JPm'`#3)F.eQ?S%H>o6Z:[eCF.W!<3XuSV=mTD^O*,$&CBCC[, at kJi#LfO
+%?84[kkHfGUk3[*.OLLq0Oe?C`Wfb[7e@:XNaHrl*P!aSfiT)<g;[;B at g,VJ#<Xq),_/D$=aA&PWFC at h[dfi2X\[b:r]?S9T06#pt
+%!(moZWm$b'7+RAGEe<qC)J5;)3o_C at V9J(=PhL1KoL^/h*=28)D$_CR^!bH;kr3eRE;&Yp#!*"@Ja\=G(BVSS"D6`VQ/@tbq]Ls%
+%O]g.2hA84Qq,JAk^m,V$dQ=^qk^fT at ZZ3BfcFi8B<?5h'o>e)ZD&mo),fhspdT0,>5l\e%p-qZt#J"j(K>V'-W(-hDX)Q_K$4MLT
+%TS/kqoWT*+/94pXVaaJPG&CAS[8f5s,e+VCs.&3O0l&t1cr9*jT.4DErb1>GB_+C^o2KQi#8P+XrcA at E1S-(]@U/2U!+_Ka'E@'<
+%H;Z1f"JKF$C=)ceX/d0q-Eru*W.Qh&f)%P at 7XMHP:7-$hIN"^CWO!st^4XZt^lX+/5t#7ke<!n>AR>^",c(aj2`,$g>p=]=ptGPD
+%2n]Iip!pM0eQFN5"SROf=dscd9")[t']nONF at BRF;C#G]q;oK>p:NVRF[))C(\O.]*8'[I9,&fU"]PM=?<LQ3NH"Irb#anjV(]Y%
+%L,ida2Oj<XO\^L<.\l=KMr8?"i_qX>9 at 6:$Bes\RQ,umpO-M$=Qs.u>3jNm[Vge?A5j;2hRON*ZK%[H4%O8BD>5]iPHOmoNCudY5
+%ku0aBBKW9V:+K_BoF6L!GpF-JiFCVppjSFXV=CkqcIgiS*(!]%D^c[#CtB6c2>=h1HIrRu[ne)0YDdos0J8&jh7mL;D6dMEH\."j
+%_e-#-Ln#QS<OlN$0 at e.XH:0;KFKNe>V at VJfo^Mo&!KTX`.i)]ha[2+>LF?Mh"#Org]V*a"$Znr[d2QE^3#CmGVrHBKi4_];_bVlR
+%O@<:Fe$`9fCpUs[HCH(OTI_Jc$Hu]#`&7'f;?^sV3D?;I9C3`Epi%\iL?s1BemD?,0.Q9OX\a&)^6<g&Yd-,F1m:Z):@5X,OSOe7
+%p8tE3QC]47^\]gW`(.(hKR/s<DU=bTn*(r4YXo([+!nik,5p;V,3B7!p#ZbHA8"3c'"l497+Hksci!B6?[WGK]R>4<(&YH+Ve/a,
+%lI"ZB467kXP^Qp8j8:,>C93^dfmp=Yr8u'_Q,*26`#K`,NM)ZWZ",hrA:!L^DTDB[fi([S[F!?9N4";o-Nc,l_Y1'*,N=[S4H'r:
+%\gI%9A?]J*GpQcq]?dTm.8Fo.H!45P,H?'1nnd=u>]3E+HguYGS-&g4*dIX^&1t$Q5e]h0>.<CRQaEBVPJ%jP<IUHm8P/]t+-(75
+%P$1$!m_a3daUpMABl?D5+nYo-Ek6!e$Iq`gk=BHWEZkU48uQZgQ*)+k at -"uDgkh=YF"-%^`DI\">0-M5C&Cbt<i;qm>,L-qC=J0R
+%QfF;$KaPI)@G=MP#U:krK8ri5=MINPmO at B2Ei)cZLK=Fif]Cps2N[LhaHsP8d]DmaUNnndQ47(P"j"#P8R8H[Sh#G=2RGL7n0![W
+%'72%fk*I!Tj]A"A"`#<Rota'sSjR!>FCf!WkJL_narS#a552UjB/((jZ"m*<1996=`<lXnMc<)1H%W6jWe/@!cBY5;YiZE;gCsob
+%PV4H[/+8_ at V#1>J^g-mtDG6:B;^2>7j8>llqTJ%*II$?Pj`6B6T%?1.DpC[GKLo<XhAAAm3\tm_-V at SM+,/*FY'j6P4Qkn0.JcsD
+%>!lNj9<8f72#sm*_9a6,Qo>RZb]0KfEI'Y6LTP8!P'Vt*L&U8"/*NNI*=J0G+A!m/j;?rs!__(pa-0K6"a[^S27IGTGFlf3X;nX<
+%?CKH8LCIL*3@&9:]+):+F$HN2E at Qe"7M^XrX7!+F-Ug+Dlt(o`^p?6`jXE#@5tA!eTU7J<\]?o6+J<G];\UBt5Oa8FRQR9;3`2#8
+%eP_FGTco<kF.,G.ec`20lEMS(5^9/,/.X,$SOVbq#QqAqDlMe=>bct_i6fH.;khkA=aSo"V,8R&k-BQ/?\(a())')=;cOE<.N+J<
+%W<JtY at -3e:(*RSVGE<Hk2tL$B4c/]#4HEfC at JGTb>ZtDGqhPS]N9/baUd)V2B<:\OU/5u[l:8>M9Ee;b0A$KNgUiA%VEN89:M6+W
+%Vbd2YJ!YY]Rkk\)OZs&dl^ak%Xi6f\e)9F]+GC)&@#+Zpp.1(?o3M.;ml9;W)%^h&\L3*::QF,7C=[>!ks=+tRhc3\P1qXnf,fb4
+%#gL)tk%a"aode@\62Ug)-bL$lg(St>KFq](>K9hf<CP.\+N\#$^DV.(Q&Ri12;L,TQEf83E0jd2Xnq5;k;Mn'a:AcF7'p1/#/;Ff
+%;n??n:GJr(O&c"BdY??-QEj[o^7J(!E#?*"+,p-kOW'5u:l6STW99K+[&tjl1tGI)dEh$%l1sH-1Y[#Aptb!tk)erILZ4?<\bi/$
+%Ht"[E*,*Y$T:DnY_5)KJON at hYBJQs#CMpW[o0<i at p5.=!cF4S%OMXM;1Jn7dc.Fod4nh$@4bn.i?na$N$;W/qC]7B*p.BW]mib8[
+%m,:mQ^`QTQo57LN%Yq#uGi#lOk at WD?Nb,;V/"6KZl7f*`9MA):T/V'<[L+W-Pe`&+L%"[RFHQ+uQ+`ZL^YL;IjFe at K-5\h#mi1]L
+%PoS(h3`e6`7^%ObgOV)ICY2uMod#YfMiX)0hf3Y at jTY0=-h9+=dg[(!$NPOH<ju4pZ^R at T!f/%o\6ptFM;%SHBH8:1([FC4;oL+*
+%U'C!NB?^3nSioHlougDZSr?"i<nr4p+S(jQ&kF&,4P;RX]8tj4'9lG;pkd*AX7/Ng,YN;)$+sW,X0L_PpVn2*]?W]D=qBg,>_.[T
+%Q4D=Fgi^A:KZ>/#[66G6!Ki:r)'Ss3^B at 5'4\LqB8#gH6rfPP?H8Q0KhF].-#rYh@!4tgn99cK$Y>Z=)U(XNZG<f;f0Si7+/>Vm6
+%PQ9'<]qc]-+2u3+:HOnqnp>*O$W?#5Is&n4SQ*'nWJ^J<"%hp)?`.9&+]WPik7[Yuq'dWQS/j at DYsGj=jSq?eR[@*+octMM2a1#\
+%YuRfV%77Pq5F1^h6#Ku[!U,#m7^aVr)NLH]+%!3]q7?<2-f%e27"QZigqcOZ^mPJ)O#;MI0?SNb%XBHqHTA4p;oiae_5rl8d-mH!
+%EOW=1PGY<ti&72#r:3#aoi_hYNTq4*K6mOA3+E7GbqUH9f.=t32=-.*\$3S%U?,^Ra8Rbr_LsP58$6GsZ2O6`8fdTdP74J`W>Dsp
+%i;Y(9D[MGkQ3X]/A"<FJ'MipF-QAoKHf\_;P\%4bo+K!.:N6-J$(]3-_=[QB.9*ipkULFK at LB+XM+^H!=!5Q7VGI/6DPt%aMT**T
+%8e,LC7EZ<dRYL@":N;L"^82=`9:b:(%%#d*k1RS0(8%4+^=8-S<>]`)>2]+=Lm2N\jjr[N5W;bDBPV!]!:51%]/d9qJYG0pc8EK;
+%_WiTb7h+7g-^?8"=kZ=mlg5\U`.e9LZS<M0"s+U$PWK%^PTtn:X0!S?Pq+tt^LpJiaof*UZo2LnofgrqnoH$,o^6>7q1Q>uoH_a^
+%ar]hB5)BhHhEUPUI'hgdG4C-^lh9'm=sWDSZ\6b$<&$%\'T<4*&ghZB!81&P6HV)>0D1aApO(\9?:IckS`iTKpH!-h-RW:b>kdc^
+%2gS"a0mi0mD at Dd\,OWC1FIA#G?."\_POP1=RN$M1)a0Ee9R0dcNu_Hd</qt"2(6I8d25DfDSW6Nf=O]iMYo!I#MN&hfd=26O6Yf+
+%;aVR@:C-gY*V=%i4nm/1p$NOTaR_SnRA'TDiT@>@4B[qB%-N9.kn7?Z#,4thcBAC\#J[d0+9X^^, at pqu7Of@JmT9Jf_N[0T>38T\
+%n+j"H_h2*`P at T3XhR!C/>=-dKS-tQV*4MYNdj.0Sis+un6&@Z\V9.aQ;or,"V*ktJ2rrW^C'p^^Xihs!dGD>I"MTC8!Ub:5d'19C
+%rZuV84l4H;I7hD`*1FoiTTXN2OsZ<jkgg6,TIr8S#.13/onfDTYQ-ejXpO(t at D/Qa<=;RT^Q$@E]uq*MgRCNnoVG9sqHsCO@&<W-
+%b\B_fFIH$!5;lUSZ/ijdkHX9u1e#^SX.$)[<1#FL&=U0$T6'"i at bQM>[K*[*OkL62`kJ;7^M:q8e6fsq=fqoJ77l2t!Fmc8F>C/X
+%.6?ERZ=TUr7_U=MYVpZ&fcL:C8-u5a\`=a:>g,K<Z!t03nK(Eu8Ts*-SG/;])-F\NDn7YFA/m#q>VhE'ein9%+jEL!0t5N0B]Ac(
+%N#Y at kl5oHRZllXF:]\,B5/"EmF8\06`Ic'Q)UdAJj>CeGp02JtF?#J0k:ZOpYHKafl&sc"c'tOs\MBt&csNd]eKa&\B_&+lQiKG0
+%onA.&.hqbf;G%3$1P-#d9BiJu>_?7","NDRG!1qS:(7Z(#^!_*Wa2_DotddbD'8IG+\Er?!sUF!^K;G26n:EmcO0&N+0XsqjVS."
+%=$iB*>k>=D2j5NlM(drZ,j5pl1gLl6QA;2FXnMO-N6 at G->FW%F\e(Lk;sP^)m0>[N[5:k-?NM]ZK at sa0c#h?ag.aF"R0F=`D)BZG
+%^qHb+cM]V)au*Ua6sa/r.0!]g&`ERN;^Eb&Cr6k/-g4'X^01'So3@>!0<S_*2DUUb]bWNA,loXn++J&&Z`"qX`:HOj+U?[,)k;P=
+%j]1],oqrfE5FI67:6L0h^TDaj3@"VcpGo2<=pnKsR-]-`?QN!8d'([XSo%d!a46]7luikB5)Toq`eobRn0*GV4QneG?OPC+rh*dL
+%<u)jh"fI'"5SE6MT!0r2$QQ"K0h_K#Pa#_S*]FDcVUio)Hi77kiImeqhJ1f.Ph:C_N6q7o0V#CD8,I1I-D[92.q at kIGPV^]R';a<
+%Pkk8o4g=&^O/:qP_8NbP+pm'VM4oUD^NJ*>$p=)do"n3,E[t%`dM,,jLIcD3%q_+C=\5'a'I#2.$p/e at o$odW*G8LqMuZT691ZXl
+%lj]lSAF;#lLEa_^>1]a/dr3qY?l]-cUJoV.q.VkN/J!RKZ)5f&BM&ttZ2frHe]`5Y/IVRVN!)$H27/tg$@aEDU"hs#\!&CZ$9^I@
+%.DG2akf<,5b_&=L20Vg)J43T?U4#fhc+Y[T(THtm)EY;=+/6jm^FqGAEgQ#`Hcr]\So`jFM(dd0A_;Eo6s>Q`F-RXZ$XRYD=@))J
+%dnD80D/#M;*d"IDh;IfmGDAO^5(!^/]ZMfsFZ,Al<aI&227In):2ZeP\Xtbp8\O8]r_?Qq9m.chjDC^^a=UisZ_t=Ek"%k[P3%O3
+%qY"$58KaZH>k'cdk7/m;K=]d[H_fgo#ElNTfZd_\/D\7VQ_3$1jaH2P-WN+MPP:OG*&"HG\<_G<q#X*[.s&N)VF!$h_W%CS])N'*
+%gPlj\9J]]XP+A2hc2r`n`d=G/01u<5>g(Nn$ZN0M*U`h240`GoI4f at h:(CI:",&e&f.k"pcsE]!TZ*b_@=39;XE0E^"?sRL$U_ck
+%nNr_EOSLTD8=\,\cfY;L=pgPh28WYefd!'miJBo,l5]iB/O`hhqj%Xi)6hM7AQZq'Y6#Qr0FY6g9>l1+ at Id@+=s$_6]ZY"FTdJ;!
+%:Anf#a&IT%A<*Es.s/9=j*`TRGm^ua0ZEL8lqf2+ at Cm;3n(obPN=&T."fLhaLOg:h_f>]YYneN,am.V59$^oVHTVci6k=?CYp28p
+%Tlu[:NneV9a+>=,Jj(SsnDU.#@/VdW3`U?0WEO&Z*MDkac at -DW[@kf*"&2Tg]<smZ!lg;0m[RL?"2NX_Op=f"4JLkR9rRD/5D=hd
+%S6JUVrlLM_gX!,GP`[&Wj;N8=?6_hi(>PN$RM20(rTZ]2ki at qE8qnd*6p0:Nc20B38j#XU3bSerDUOfn%8Lq'?q74V=7RK?mqrGJ
+%*H);c%Q7"*&)u:5N9u00%a02\X_PqK,`&[=cS+D1NC3>3:<CMC='Oh9);RtfO$s<RS'hE]meaV4F)uN>c]*oq-ZNO&GN/drF7`,d
+%ZoC3b@\WKG_/Y4_P6Yf*g8;`/5b"oB?Gqu`9DCp\iNqj;nd&_hEA)6Nc/E!q]*j6./F6pYCoRT\39='H-@?73Ed^u:$EAJ>>QO-h
+%RK_2Kl_HAF&fK>5._ITl=frs"cJX\E>]T!sk,5@/!P(S<PQH5FJX`!"Ih?I/Ylm=>E?QTkOsn/sg=+ at CjC]YuCfXl'-amC"#%Gd+
+%_h2Z6POfet1[HCg,^8n)1H.%9P'5R?iY0g'/caO'pdKNZP2euNj:NFeSh5G201`h!2b-6J.&J='9d\t="b8oD$^>5W$!sjg<!+.'
+%D\aiC)VN<7b\>2l"A.aq;/V$Ab>K]P$RV3&aj&MH-F[<!c6N^2SJluh!V>mEY_8Gf914ZPq(Wma`jr?3jRLKPE&fMc-/Y'E4sefN
+%abBJ2@#k=iNg'U#4r+4so5\52_E<gECQ;*=!'`'*&Pm-)\bW*<A9FgA`1))K4D&G)UTQ=lhGaFi_.K+=Dk`N5(kPiL at lmm7bLJW>
+%`*-Zs;q_kL:28Yr#@Eq6C/Q6b*+,k?h_t_^h_opFJ`WROP6fK(#p1LT*)A9 at +m1WF1]JpNgWKD$:X1*fPouAXf=%"J2/4D\`@>H6
+%=KnYHhU%%9 at DIaWMM(a;"0nhehf&H>O(_TM,oq%8pfeN@$0GfYB:A3k\Y at GbEV+RNTb$+Mi!b;g7k4mf`RM^k]%QctgA!Z/3"3Y#
+%WH:[?>b^IXTdZ19?tLnG*sMJ`8fqX5>eE3BIF-WmWPBS4;a)J*O;fJ"?7_/-#!BOFV at 1sgbJc.k2sB#`UE$&kJo/VS<RO+"lJck=
+%/eK0nV[ndN7_IZeG2Ke_2N9.T<Qr7Ma+O>@jduM at H8pF&cB&-UW-VSXH&,-&p&1/Fq;.oAEd:h35bG6L1RsO+hW&3im4PI90YFBW
+%#/(!,+sn=?kAgFQ`[n27o$A%llo+UOk!8=q=f+VDH/NkA"ukYZjCB%7I<po&>;o1_6js1Yft?F^e72A_T\JPe(Uq_DED]R[Qfn.d
+%p(TPcHot(K]U2+c[@_9;$?>)?AB4WPV^=eW\ZBCnO1!#0bqh=0k;X!K:T&OK5(6+K?:)1(-:rp9ldp2oD[Jt5'$pEt7u'?&^+]pT
+%q^&1U<&Zj&)kcds0rYhCQh`DS31iC*e:Q[]dMDsjLZFVrkh_C0$7tEG>_bPb at mUO:he1$WpD1REk1CY$r`l,iA9d64[q_KsoF+[N
+%W=ac!^Qb at XU.<XO$G856HEMBfC.ksZX at _Z/9 at A)mF8;1DMKQ<@E,6nB68>P:<%P]Zbb8'aZC"pqk%tYg,N4tJBOrG4NA)@YP!/\!
+%(C2GDG<OtPp\ZqB\^=#%E*)f129nmgHs,W,U,&2c+nPNN_]m'"S&4g1WYL??Kcu(@CY_ZG\a"Sb4s\[W/!lkRAXd9S82\6ECT>)F
+%^?9+ig&d'g`f`Z%n62iXc*'h5]'(H:\4Y<%M#str>+jib&38A;F8&i.QK3_WZ at -4YR@AN_``i,A"*nfpRMS_=LdDq."VZg0eA7)5
+%>K<V9F-.r at S`m#om0?RNA8JT;D48ijIsS#<gm_Q5PENs3[FMpbNSf$HfY?6HU?t86?g^<gkF1V+n2#Z\WI\fVdC8qKm5+4]Z3H.3
+%2l36sP at +HSV\,\BARgcMeb1AM[+D6+G-HMmD"X;;NHA*a+<<p]X$QFCk-'AMm_jVm54Um+'qrEN^$9q_-5ojnPP2/[u46Za1o
+%iB50 at 4YAahH!F>Da:6]GL'2:W0O_:_Tf:n6'q0qP7oO:%iZRDe at 9)"5gR12Fa#Z;i!ULWRfQH?^"dQNM=*jFCY029lRKIq9:A"9(
+%(\&]DjS;_DVA&bD[&nC]J)A!DR=s.<cI;(.U?K-nWK0pnZD(Z=Lc=')8#%?7rIKr-Q*^g5aHa$kc$d/:A68?an%$Ak<1A]%gL$hj
+%ilaApfd(U^KLT2=adJn9HVstoCkLT&c9qOg<Cqd$K9&Laka8K\j\3[uDF)b\W''_a;s\RF%4H>n2F>OAIQR(l)I14iMeiMF-T]$h
+%[qrG,IJi/ki:LaR?>JF81hBg/5)!(8/G?)jP4YbkH at qQ0:opt;Egb')hF;*$Z'%.u+0Z7KW\nN(&]D at 1NSUOd!R:**G=k^dYeX.n
+%6A%G1QJ4LeJg:(>G;OiH-NP&cjJ2uq-hF3%q3$J7@&E94`8Us.MtBKQ6K::*+!l2]-RFKTAsSD+9IHn:nlHH*&H0*:/3H/#?;#_N
+%+i(Q]cf!L_"B[=iNVn.6H_OKmVjIVg#_k/f^^+#)a]0O7ctRp.J_ZTDjhU<Ef\7b^R(AkOM/G0Jh(HiBAU.-h2.e,!]mS*Wf-T:$
+%3QRPlOA1bJbM`p".I0n_2tur%rlS.KM!$!OV<%gr'"Lnf,\TpZ"p41F4Y8OP7(6BBj%K'M-XaS.36$e;6*>N-/bnnE7 at 44jbcX\2
+%_(tbkFq6L!U[_h"gpQFI]2^8J-qKQCetIuC*CVS-;OjMrf^944Z,pib(d(R<'92s%cTktEX7s<);L$H-::PNUnq8(QCi0[O2s2du
+%IJTj6WsO7Rg%ZL+RR5nUodNe.?QU+bknq-nQ;4%=Y>i3&P@/mT[Ji at m@GdDicmYl0%-dq1+I&B<)GP;n$O`CcY:\(QP,#8hkCr!]
+%_Pe7=Z!s[M3NTdSU`/j]D&!811#%/R9s-PoM6gH1+cMNk)]7*\rI\Y2j\Ft)P<X;J$Gd'^%],q;8%1/o%@YP<<%7=e:+1U.s4Pja
+%22',ai2u74*d>HFqJmQ($KRlA`n)P_Er5j0Rnup%o'EWEb?OM%p)E'Pi,.KJq!@%7_S')blUQPAB9J)LJ3sgNZ<mF\V?[b"%q17@
+%BdM(RTb<l0Qf]>4)[[:iiJ9hrYPe/b!c!0:a/DLPIehKQFe:Je!4qnfpZZ:4OmoY!R2B\a9D^PWEaA&.V+AIU%4#Jp>YYZP(L*3D
+%kaOYY&n4W5J[,"I*/=Ok6>1+u`3hY@%(@npm^17P#m8s;G#N3(MC3e$\j7HY^1<>iFb@$e.8g5:T;8cnhI;T:2A-?JAEV]ApPbT+
+%Fm_f^8PsPuPFbZ.ZL-69^=R5RAP!$In&`[+4OM$hk6tr>9P:HCIAlMFd0%cN_[GG8A]FSl at qlM7)'B%f"Xbi`*V,Ajk)86OB&W3d
+%)n6e&*%-M<$#o8%678XsMt.4hQ*fYYP6p/=]jX#NpC^&nfT_Vc\/GY<)C,=;qOocoQ(9sU at KF54<l6g1<\.k.T\ks&4R00HO<]#m
+%<69_4cI_W,DBIoD-58)/dUFGAWjTgMUF\D2b];UjZ2'cP=3>">GXZX5ac'Id*oraY]]O6<)S.J%"Xs[IO(\L;"Z`t\o(/2Tp?n-Z
+%s&dSm&4Xf*k[l&QpYnUr>A.23!Tr:+(GX[Udo_N`(>IZ=C7fpF]RW;u19mgU#40:NN]br)h=HpulJ/fSL,.du3CiT$WnT]BlKuup
+%@>uXHI,d]9I?&Z#hYkt3++%L(0t:]V<L2h!Bd_I[\h<((eou!D>4BtIbO_C*n:&+Pjee#b4WKUN%.8EHlhk!^Zf-39R.NhViQB>!
+%PH<MYg!I&]6e#Z(#pd0"<0G$6(bHLFW4gT55<4N7)N\%`433SNn]eV;*FVKKEmP*jW,/'S6++C\(m'?[_8gfY0mcZ#$olI2#:P`W
+%?E#iNpuBX$C"pb:cZ64tWq's$<8\t]\TH*'3D at _Lh9XtgQcX(8WRb>G)"0^s2Hi,RDt5\W$Fl'N-=Q=J.\ERU7_XV!VZ(^DYAOY\
+%:&a;\RnSqQFFkVW#.A570O;uCCq8q$p]GB"mFnHNAEhb+(>m[G2;Z07oj4ndQsrF2)Ji+7!I\ta/og!8Ta at +@&](1c:88`KQV:se
+%R%!K&r:7AA>2Z3>=<@7MEif;gs0<Z$GFes9VDM%^^L8#R-<U^"7fA7Idi`KXm>F+ at G,>cdORob>[0kQN2>A[\nCi(0c4\p^%suA7
+%SA?+\$\H-3>)g.3ET\d8/;l`9iA4kYfV2'd3"f@(YYRRD--NSc]M"8M0tV/C74qbL]-O11V9=QZo&3L9jf)cbK2SY_*G9?FhVmI\
+%f]$gmMApF:RE`[<>U:oh=$`f0/1V<rk'lHFKEFnV3cD at IW+:C.Mo!m0 at XM5A9sm08M`E.<kF1=r09@`'RJk#_,35/=a7V7``Cdt`
+%fsViU]i,MQg5?0V(n at s<%bd'HAo'XmdI\3%R"'ifQ at e-Br*ONn(>@[sX,8ZSBC%hCT\OX:;@AlXT9_$05em5Q"I>9%f95^QeEBSS
+%8Fg\^kV'#f6a&\_o&Zm?bE`sSB`Rbe6W2Q8PF6."ohV^b1Et/Cat'Z4j7crig2+EaCuAAm/NU:e]ID%H0oVc at iCEe;^lLNNk:8?B
+%%p?>Sn`:]'c"n;kN*;FA`guC9`RkuZ;fa.Z-7=3E!P!MdUb:`E(7Af4YEBc6Ap4HLr=U.^I(:4pS&3Zs!*HqK,jVoedBuaq0"?'H
+%ENFHFnr.DsIDeC/j2AJl86_KOT:X%5pOq=`'U[!203iSn.q;fHWgf''%l)uoS;FO&\dZ,IP<aW&;j3bZN=b-CCC8&NLY.M\q-GJP
+%kf"tRY0/k. at gLRrD3Z"jJEJB2fB/gh6o?CtK-6'%^pa8 at Bb=dM%t3d<W0R2Egu)IHl'$`Y,s<0#(oEpRXqmPqF1\ep;OAa_Y0X)2
+%MDCU"p^5="/[P`<lo$`lZLS:Q#n/^2!@D2?CE3Qg^B)_7V-Dn7Q*:rnQ\TV,Obf,uU4D(iSr9sO]AD#&"M]p9KWR+(lc]UM,n:]i
+%(NZ&JVZS>HLYZ#-aWC'[3m6X/P>&rnWNrK4K8c8!TbF,g[dfTI;A*th3uC9US4RN4L8t[jVsg-j=Y5u7E1OqkO.oY^*ngkSX*I!n
+%(,[/8"D.6"a_p;=#KB]u>T-C.4n\lG>h\9%D1 at O2htpA!;!_auN+GKqMX]1i1]F45)$"[)rPK2kFedEnW,]#!<8.KunZSN9]HkP1
+%'u]C5SFcUq0I>'NQj%?0>Qf]P.9Ba\DKZP.!cgSR2jX/P23P at cDL-eZc8WH]$)A^711g?>qj<&6'[c8CBorI:kL=Kp;Jmr3;Hl)m
+%KM>fj.Pg^;<2QQdU3SBE1a();8Pu%i,3e;X'+,3p;P+p"Ce0a#2BY(h$K9KAE[9 at 9pR?AGh.>X-9:ekM92U5h5Y'R8j4G$,qsjiH
+%/cW8Y`t>]X*[mD'F9jX9!CQM73P*M]@:AKFE>!OWU[YM/KBOsiKHMkd5c!qolo<5P9sB"9]k(IuQ]Qc"DDuPT/F'$k^cS"Ia_,BQ
+%/=EbPrNkbgOjD50qj<f9A3VO?mNgNJ9!obBPj?Ck.3UV>2nr#!7P!mg3?mQaYVmWN\Q[^3:f[3OUHIco"k5115EB>R9Bi6JD4nlY
+%,rZMelWnZt5S%$jSn,'18s!t7,,cIC2a>D5WL[teVAJ!CTp`Cn2)^A:C[c";^K3#JM?RTVGtWrWauO\f@;Z:3n5[W#X?5gf4B%`c
+%LlGnj]28R_Yp])j?AEm9*7n-mpIumaO4kX,o`[E+-,?+:X^uoUiEu3j.sr$DY$rH7#P8u3Pc6?Y6$U+lfZeiIb?TPq^c[-+&]s<`
+%!m8 at nnZO[ZlslA1$24U;&4 at LZ6-u>a3,VsC6MG%l7d0834e4,%:.pU.iUl),kR&^+I8Y$WIo>c.*gKt7)bF$uJVHqb_D\4l[<+=n
+%($8boD]=#]^'<N/*seE^YU0&]VS-h!&%8%/$E^^Qn;g:(nN3Y[RJsn'bbucUqD3,BKPl5gWDP''W at O*RTB\crcOg,$X1a\uR*\<1
+%OnA;eKOF[HX[,:2JMU^fqg(9\8VO/B!\%$KC%*Cu:F3n+o`O'@#3gtn at 5FtH-fPUZN[+to_,,&WBUGl'gYB7,2%uhh]aj\1,=-4C
+%iZ?:$hRNAFp13T!\*[0N^#Vr?gq6u,&Z8qS\^LW$T&,_OQ>=Lp+Ge`,bm at 7rTR.P%h[,;D%s.S]Vg^1J)MfW.Cd/7k"'oPd=XRM<
+%9hE>sbstWVs'%L04nU>/NQU'I*AbMY8)e$NfNB0uSHe17C9L1Qf]XSa!e5N*kht=JQ_7R+Ok+(sjqB)\f&&Y4W.`(34md,.94S?8
+%HO]9'GY4IoIX`_<Oq]-l9_iiOEWSlo"kr^l1L4i:K=_hj#d4gAJG`0%XZgl"Fn/I7hal_X_-b[`H*u#1:j?2\=$,]k4;6`fOU6[G
+%"m3G%1EFrd_aNQPlqU!>r.iO`e:(1K*7:=p8m at 23.1\;Hh$bWok`JuFK4<.qcbWrZ@'5>U48J`GSp/5XVV:f-DgCkjm4QprmVEbo
+%VX,;b;mp3UG)pn^T-eQ82rBhU!aGFl+m6_r4n.=BQSJE_aYY*5n`XjqdPjmqI0nIu/5=].Tko3SZOCE?#I8?A$W^PU1oN];:VSG<
+%T(K9)#R8][0BkHY5;QY)n4L+g+hlWHf_&,4TU5q,-?E2lq]HFi9U1Jc"\QR0N_4=`+<5I?AB#=V>$'VVTr0%'V1@#*3)tedm4>(T
+%-AX/]?2>S@^Qr+\dU!r,(#(RTAnNP)F at t8;WH'c[[BW[/&u3uO.$k6NZl)Y&Mh&u50<[5f7HuQ7,tGcsQnWgAW=;^5>9:_[_jp%@
+%k)K:0,#`$?@a&tr\@0Lgq&?ka8K)3'q82J0bcttNVbGCb^=^u)8A+YXVdXdtIOpQSbnP*,E,4-;#;04s>_:qSZ=8LDc7s+SOjZc*
+%5L2)tfKZM_I/[3h>I[V[bmIrS.FEMf)EAXd]1r9o#gT4Lg-3*N_ZJ^Z9ksAag"?XLWVK0#C2)tn+F]al87T3+c"\S at lD^3cLllIF
+%@Zn==P+T9"/Eg?^24t`mb at tInA$WKgCuGY`#2SdAfdcaR6,PA+n[1(Z^BR/E.QW:G**b`BSSY][,Y65=IL<mQ at hDFYhYQ&.`+EL+
+%e-p_XMT"X95]a$XZIoCd<:f_9!Xk#[]MZ.&QXq3>YB]ei/?'BW3)`3\o=,g3Ih5qZ>bJcRhR"aOa/cqDcK0Y,3!%num>e33N8W0c
+%c]/Moo9mdmBD[\AAk`k at p4L`eDoFfp?>V)'P1.SH,h@%`G=_YF/Ii4W^a,a&#lo9V\,o_hh+&SNjh\Ef6YS>..3H!LfT71O;/1+L
+%!jOB[70*fe[E,k>AY%`>W7D$k[b:d.[BM'F#3"TMYB">E*-h7CJeDGb6"Z)a3-Wp%!53Pj*@MY'1,%pSpG^&kJmV7T[['GR=VX[0
+%G%neBqfdF=S4%74($)2g&"BVjOD=>n3M!Poc$E*C_6:D;]Y,*>bHu\oZEkf^fk=#D4u]R6o8g;EVhAp4NhB-2L1%7SBN;m`OqRY%
+%4bn^6eKh;<A(XT)Z`="K at L[uknd."e2s;M!7TUe,T.Q)#9%@b&j#sLah)sl"r51AfBoAuS@:[]pB4%kT_<n5rT-29U0"T8-,;phs
+%YK:>.<)D^?[iLd$mf3.C9RiLUQs8t<Tm^c<elF[!(3NFEn/,]%b.FOG5N?\\O_Xg/Vfg at N,ZaioP=I2oIkRg^Rtk]e4pp6Sr)kIc
+%-6\sCEE@`J!CK-P6EYe]H@?BNm0CeBHO?)CiTIp;b=.UI?R6SP541F2*[s<[`2q>kIg6.qHF!WFGXDVk?P4a`3G"Kh(WF2g):kdt
+%:(upL.I$0.$]u[$`]c5'dW:f`UA)"^r*WFQ"oN3Rh_Sd;e8rIX<#Q'$5MD*%GHF3[4bda)NS7SYjG>,`D at It;_/3?rk2#4r)tp?I
+%HpHOo:!;UE=k=p3U?otn-'&/7]Ub?=lm$sI)es81Id"\.S]]Fm\_JOfB7&,t$51M6*f\sE(MS6DYcSi5>#2(_%S1kSI2"%ZiHr_P
+%d$,Hp6!Z-&-?W80,:J#gJ^Tm]CmQV!"jZjZ2PF*sXg't6&"&-i!nWVUR"B#7>+)mhUR\Zp:'4b,/`2i)MBUEB+3Y:eLi5_C9f[RS
+%[mYe1?d=1.1)ZrUQkZ%`@U at 7T:`RSEgV."r+i\E:e&km./_pAtQ:d&2/h;7Vp4]`e5o2e>k!bF,]N?eud7/'_T!s\Pmu9k7/*Nfi
+%-gS>)-a,Y%5XYMW$$aR at G#Aj6a#T\]MBLD<$+<r:flST;*h^"[#eaJROfC61T&^E!Cd,Xi[>`7B$DFua#u)n<\nNTRL&kV at PTQ'`
+%)a(\\"`1c3UkAJ'H?Z+RM&+?\3OLqc/KuZXlC<Ke=\.\rX]=DfY^%Oh!W)#4nXu[8S8TVg=3;/V.JHPlAu2L!=NRe/H'1WM<\*G5
+%:0!<RdO51`X<$3@@WJAG]d7S=.?TXGmnU#ZNcN*<g(LB$,MJ_;5#q/h._+?XEZnbdbWDCXq3$9MC-.3aJ:;P,jkJVNr4h\RR#M/g
+%*o8o:rfUe#I6'm)L!%k2,2kB:%_aH7-!%)&JdF2GJ!B(':),GT+R`8^MeO1V&CePQ5!H>@mfF$BYKjE*&XR;#7UYCK:!BDF.FTeH
+%O#IeehH^'GgYA;a<u"0<EP?q^ilUS\Ui<c!7lZ(47BS+gou<7*Yrbc5,m9tjR]ZemnhOMlSNNIYP2Ft/+YZ+uAIUZobPbI<RqKAn
+%e+Sc`k>F[2B1SOu2SK:D^8b$K;#qqE'HDI@?Q`]mA[^81P",lA6oRc5j.3G,\%C_"p"l9u<!t1K(;sJ6h!i1(JeW!/$iCcmLrQ:X
+%H)DJF;3EtD?A:"I*Bl\1Ac?G at X>2)7oJ.0$hKRR,chTL2*>Zub5o_HP``@P-d&c:![o2V`?`W&uIqQ2"m?LYI-1RZ5%s>tfV==Su
+%*V3025g1TPHK?V'Mf#iN9JCV.X+Si5<"08Dn<U)/5#C5G2s-=#$os\NQR!`:Sp@"L3&Z83HNR at _,Bslol]bckAkD0_38\rNS9c&P
+%,7.6.dj<j(6'\p%OqIc(iN%rt:ioF+3VQ*)32e5(aE7VY<u0Nk6cjZs at XZpc`EOB@'@j?>)r].&M!JGd(\D_":fh8k.8W,niE<8?
+%#'k+mm_jr8Km;I"^)+NF93T+Q-qA?U!XABR'j],QB&s^2=4iCXWCc7Pf>p)5&h5k_q7'iD^rq*X=cMl*jk,fC>97GV4@/#=TUq:G
+%PH)9h&tN at 3"a[71L9/d`rZaL;g[IlhV>d(L8%MHqc"A'GcjO!2_]*0W/[a.[F!VA%nHZuX8uB>d\!>K008bcK",Le'82L!GGt6,Q
+%@8[WqmaSI2T+-rp:jXWR;?[3DSI)[4=qih;"l;fWhR89CKpAN\;Fg`CS_1]P[,mT$)o at YW="dY9)"%9#1esTVV!oAZ=;dsk8L[6=
+%3U%cRe?f&c8&h(3Qg#I(?ai$b!(hXh_58HrpQKh#YV/R59XpLTY7DPrn_(8f0UHO+Q7[pe.aN=8Nlar2/"^k$5oZ:G0&bd0)#I&>
+%8q=(!ArH[XW%kJ?@.$Stl&86\Wu=arcP'7n5!oQPX8lr:.5M2YVCsFU0`o.S(]r9fGha.,r)^:2(&0<cK%R"JIN43:.GjcahfE/(
+%Cm$TP]3*>_1Bb<IWO7 at L/!n;@b*AT\SKZ`YH,ZlV)Q1cj11`?/5-94/0V-AgP`YC^BmHTV8.=Q3GQ#'bIKU[Sr?cg+p?-mf(^k.;
+%$,+`S-<YO9 at 3*^Nih'"qHZq+e.)0VG1\e>gI49XZKn?QDT9_:AUk(Vj5 at EtV7Pdnu_&H0C("faS)pn4-qE`]Cpr;:8^4b,no<%p$
+%:sR$SYkV,DYMIl(+^CFAa;OkrSq0&C.iRg"F.%KNV at VK$M")V\ol[QEfKF+N0AE-Q5:_#O`4Tu$+?:2W$V at Im'pneO/g(7dDf-\`
+%l8*WckNNie'b3YY,Fj.@"Rpm11eiq=F0KZ>$&.Qr;oQnk`0t)\9,>E3=*]8d>`<ChI;"2'H2j/`_h5(@mu1V09[lec3M-q6feg?*
+%_(+L!7(q\TBt=L<]bCZrK]WG?PP!UM!&e$q-)[\U/L'Td]*<D"Q127\LJJ4l"l*&F3XYsiB3spHUW$gcch0^=Z:uBEn=+l976DP`
+%\sNO%jctZ5',+;2!;L%chE:NHlM2I at kR"%q<X(_=n,+UT#:7,!)u0f>Cm+/<h54Si3%!_B'&);?n0*eq6J[<cmoccRl*u>ucau9l
+%Y<VUV\fK":'#@N=%D5cPC.1AIB0./Sq3d.i!T<<&Ckf6)Wn'*%8]V3;#e]#7kJ)5`R/f?0A#Y2S%Xi(S.qs:lIAF7+Q>(:r>n54[
+%NYHMI6(@[J!h&U"Kp*a[jbd<,ho55GI,d]3,2%hk)AmO#r/K;DI$/LqVeJdZ*nhJ\9PeOu3k4YZF0H/ZSOd.3^!OK?1:usBb$c8a
+%8u%T]0Ln>Ak*7/<0\<O,L7QgO6A#-:cYSH_`%)f"5C*q>X*$OD6i3)FN";<842L\:`fI=?*s/\rV;fr(6.^Q(%H'U%E#8FhYS>`Y
+%K3FSuZB@@4G.Ii+e[N?3TH=!3(\';)9rR'/$3OtDaC=sX at C@Jg at L!kdq]8[2WRH("q3n'M5EDi5dL:[$kU%&,7\sYl^:@FCF(I7c
+%3`#J1%0#U7D(QY(aSETK`FlI:Ep"oG8ZCQF7%,>G]+KhP9m2JE!(J6sPdFQ?M8H;RTItJp#X>/n(f5Ta55Uq9r#9HPfuLKL at 7sgA
+%>O9dS"=u/h\#J;@D9&Yr*-B^)'M/<k'S'%ZE3sCek*,/@j at 82F-TN.+<Mk7h=EDM?"cYXaH/n7f_"q/iSI:"peC't^Rub5`NdY\J
+%2YD&J)B__8mlK+RQeX>C0lY=1#DRp3 at I@A71Zi;g8%O^Fm^:>On(DdKHiNl=07fV[@?-P/0:=-nJ^iLBm:]4.OSBH9jbsu1XsEt]
+%NN;RF7JaI8SffsU$7!Y^q-Dc(W at d2(jqF($_FgCq<FsL,8I\fQ]T,45<C7r/iE".sE<[$g0%RA at au%cXIZon]IZt#&M-Z6@/scVY
+%(j2&F(F#\b_nO<Bg?Fj3YSs"P%!r?Mr3Je[Jl?j&^\>,JI<\Ir;X\NFs)R:f-+k6OF5,3SW>gBe*2oOYFW-n0GQ-f7L_]CkKJ0Y6
+%Fo"Y[*u$Y9Zg78Bgo\YH;s!g?CYtJsb2YK\_Y"SiAFakAM@^^urI!e?k/.CoXHVOGF\.cU<cd\Q9t!Ylr,CB^a:m;c>rQe\-#!+G
+%h2bE(V at YiDYQ2FPE!<*crZk!-0C784Rgu1'a_F'>!mQ\S!Xb"tJ0Y,gZJ:"oqmBP>q?FRkj%_%YXi"P8_:H]n9*MQ4;i<IT9bcCV
+%=fVcuFIP_0>fS*LCdj,o'*=r2qh"_l+A>.W=o1/VW9g"+55DGYl3B+89C*LfH#aVW&sDf?qO:QkUZ_=iPu9b3YnN2Fn&[^t.]p4r
+%USh6Z9nkRtU3>GA8-0'G,I'6n at GsORq/U at pCWB\J9/Vs<Z#QT_i0uLiilCqm>-u1T6/Z($=pDu8/g=rJQh-109d4NTm6[Et%u;(=
+%<.2C]s#$Y^HqBXQ-Y5JAlGSBTMs<j7b&musAnV*?jBD'j%r@=An;JmKHaZbJUA7k(Li%M,3.#_!0Y_burH%mQ<igpB'<hRCMSA&\
+%RTfCS]<qA_b)+!3>k?:F.rdI+bBB0&qPF<KDEi2L/I%AqZh"g6p1I6jUmdIk5]D.T.:7$ehCCAg1Z/s->N5cBh/\8#Ob!tPUlN<1
+%8_UuQZETWfKYJ)&qu/08ZTRJ_E3&`Zk5I\<h[TTG<1G;EDj`X4Xl1cU_",Lj4'r2udc>r8Vj7_bbi$)tR?LUq5HVYs"`WBiZEHqn
+%F0-EsQIT/lAs4UKGq5irEd<_DC#LG]5,[L/b7S8Pp3_iUZ+24!#86ITbVD%pQ#c56jU+l;5>spUn([%WV4MqXe0ZR at Fkdh83j/kB
+%3@'RX*;\0N_'Yt$EoY:pWp8V-Zr#W[,mnu\=/r1.P3^oT3OW(gER[CkW'$EleE/i4RcA#Yqu%pp1R8U^o3u?<:T&\].^S3ASl9B>
+%7rW457niq\jK9c!2pU:"nnKiMZ(.6-%Ap%<$/Qq%J+ at D14aMq(j>\'TV[R%qG11#;kgG7)QnkijFS at X]c0K-",_h/'0R>Hf^eQrc
+%EEq7f(pF3g4uE at O,RXjh=J</GHm;WbA_#QE<ipEg_#!\;,f8E-6d#6jI=7PCgQ94G@&J/Pl6_VSWs?$s#p!f=$IiCrcc.r^\0C0F
+%4iu^Fo3XHueAABlT]NL]RFAIdMhk>E$*HHPM5_;S'CNN,ZLa)+#Zqm_H4k?B$.a[*p7X5]VEi7'NT(hjQ>6i7j,=2gdfJGN\iIL@
+%(UI>7Z8Cg![TdcN!YpESBaS5P2*%^!3W;WnBY;(h`+)P:F>u9nS\o[t3j/41YiaGZ_^jb^P!a[mGJnVY8C4h<4?TO6pb`<6T#aI6
+%GSo<B!6Fek5o2Abr9oba2#&!Nq3uFQ^@J]#ZjVL=nu1oIV$Mjm!dbHJn%_hE!QSZR8W<6t/Yl"aa"@O<E-olY47IfA_1Rm,AcpS2
+%)%TYmN,I,!=ek++4J9n/C(&C2Wu5+gDC*pK1!<EhOb`=rS<;9%/[O#"RG=q$]^(3qY[aaj6V/_f#t,Wk8i=[ejjXgT3=qYr[ihQ;
+%bAP%T.O+[N_=Ha`H<RPdeuSD?TUh;ClHqTVWJ;#e(BHJ)_Xqi=g at BOPWOlLA$HWB9"E,g^rc`MtbdcPR(X>/[L2.8I4d6\L2h*D>
+%o<#Pf5Pl\T*c'\UT>YQkmM+:i).uI?#4`Ejmq_Xm[8RZZ2rs.e3F!-<<i6R2IWj^2<DI4OB,<S.]c*n#*1H/JTp),@*lMt,L&?s/
+%R&dq=V52\dUCT97T3[LW0WUbQT_4SP4<N7 at V2GYtJk2%1f(9i<'iup$W at aU!I^lDO!9BI-'EtY]k9(XVimnc$n,=9$-WO(%&'D>7
+%`m48:"qUnkR%Wd!lg3u^XHr+(R1DY$>#STWbdZ,JW\a&cJSRIbbrJtYq+q*G&ckbh\Q#^"@%E/#\8N`^)]p"uU5P%'Xj+,^W4QCI
+%WB]!q7bp5HJl<NjP#m at YRSZ[j:2b`N`."f0(3W[joo_ at B9!A'^jkJtE%&OKRh""SSOMAOXO/D-'f^-qPfr!A$hJ at J!U-6hM`KLan
+%o=66&9XFRGkMQ2ng(Uf&41.RNprttSb!sI_l$!?YcM)_'pJngKa<nmD<a2223&Z5;&[._Br&[$_g3Gi at lHBiX8D)ik*>%-+1dSY`
+%X at s4u,72kYWnW1f9O\1bfVclCl-Z1Z5SVG6Fg*eES[,dI?i,:46qFIM`f9nPJTR0)(V4_O*?^_7L7B/E1Do at N-.KKsIO5=P<%4#'
+%e`308hod4"AG%2m#&1O$*@dmWU,e at XW6(6m\Qk;&&m7KgFhRV-cSu5CIHJ3<Bnq&X`,L%pEGZ_<r9RMXgfre)JR:6[PD^hD2q$'P
+%ee[dH?'[NtTlQ_t<E_VJA7A"LG4D,Me_'_61_[L3d,G9e"QF8b5XjLm\EW>giqKof`l'(Te^GU^H`>EU9_N#JO7\?)ak,fK_"t?W
+%W6-Ot1-;T*H>TW*(mI70Ud9.@@,_&ZUl7c3iX)2J@>KBVHJFfP5(VkdK1):tnt8iTPDh at P!,)+KE'i!Vaid8kYX#XXKJP?PbZ?Hg
+%p-`Y%,f%q^W0EZu#=H"`%uS:A*2Y7BcTmi9_H]@`m4)t,=J"pWmBK>Am&9+>N53b#]c>->/0>d1TjQ?+\aU\0L.L9fMic,>_>3k$
+%8Zdj1c$KE4Yc6n=G3.tObd6gMg$PDn&PWN7-c\S-lpD=nigM9djC0 at u>>hoVI*Wg[P"Uu(2[mL8ZE(eV1qLqcoG7uTFm^+OQQLP]
+%hL#KMl$6HFmZt4VKJpPiGo.u7Rt9n&ojNLuc!>lp3F$YoVQk9kP7qJJhf:$2`]naD9\=OlV!ls<,Ep5"KN((&W?=7aRV?Y9Y\(^!
+%S'LMOROUO<X=s#'VbrK-$4i\_"ku3)f/D)!^a4.$iR1NlM7dj<oAh4k8r78]BBTrX=VR,^Vi$\5h:>ru2;T0]@GTS-4L.E9I<L"$
+%8\b'>kVqXRbgQ+j`6.0A*fS?bS[STe9&FBS[+W%"GPYP6\&l5mG2%'Ro,n]A'3brM4V\6n45^gengnk-o$"2Zi at lO_i+(-VeZ6':
+%DjKJD0i$N+Dj#XYCO=LX.J^Un?o\WH$*id?B?o0OJ+r2R'jUA"5ag>b.<G&&Iu at Q9q$#k[fG)g1fh$?AQ4*-*$X!Ff7Zp&O32G\,
+%O.[;QB5uep;ZcLlS<LpbgCsqFOh=j*<H??IRlPI2;bBPrC6BZakPMQ)rpr&=<jXXa2*Q\BA7Q)oo&l$S!(K<96]_R at n1oB`2L*FV
+%OsZFWM2>$WdD8]ic:LQhW,;?Q1m:cM6[ALgM-6UJEa4(<dM#f%gFr7(W<a9/S0SV9Ph&;Em*ijB2VdJeI9D=GU="(8Y/Pmp_d]Go
+%#?>C^Y\^IT+t*Q"_ at D8[1W5E]<(ln&RgoEmNh2PQR)82_*j4r)MkHG:Ik>5c`qm_tH?kC>$QHNg&HA1Ok8!T,J>RaXg\@9=gACF:
+%.9s3nKDS,qQit"?inF\3jqfe8/VHIZ8KZPbpuo?NdO3Ihgk3&o=KB"qaFW4J5e-5PI^&6'abp!Oi%=CIQf%[M\r]0jHRhU3XpVps
+%b9"KMX)pkjZgtYJkY8=Ddk at +Pf>2M_%rognqq2d2Lh'Cm\DZ>U;@6,b$uBJi'e!>e,hA6)M1&aj<%b"9$dR5s,_R3Ocr+cp(sQpt
+%&KaF$3&S?pVctGT"c<GqiiP!&.Sl5dL4OVio\RuRo>W2E/`bV().H,&+clR6og<,5VG,T:_N=rDXXCAi\R."Bm4UaRq4cR0Z_<[<
+%(ppmIWcn=T"ma,FkU%.7R%5)(YLBO%Yh>7K[:V7u\^$WTJ)AT58E?'KMl-,5UIeLkVEL9?QBJG62!BLtUsU8Rai^$KfS??E>]+R1
+%6.\1=MZ!>OcWn)t)7h"&Mrr&.34V^?OCB^>3fc)mZ(2SRY?$J%<dIE*FnL0`Im3&jnlO0?XUb3L-\Id:kI.(/i_^BH$DQ`)8#$_M
+%$#D?N%K&gp4S*u!Z0(k[I->1Ee??quI$>A*rs<6`0JT<)9Z<L'/?5I>g8&kqh(O3m]<S",.+0TUD[g+5#"o23Jqu\W"e/XMJ$#.\
+%\V/;@QjT1V9n#CF8Ne/YVNt9S:UG$4&+aHO+"(KoAhA[]2e\i9G/Djfb-7fOZ))J)hXV<+TRsW6!2WN"gi0bna*@4I;AX4LG&a.C
+%$HHXJ_>\7BAX<`JaM.mjkM"W'l1MGYiL*\6s36jKWfb6101l/r<][.njKq&b_\qB/Au[IUe9gI#Ie;[X`h>)_ at +X1)^r*-I73)B7
+%h<NNYf0tE>N>^+CjA?%OVGs%Jh$$ud:h=oL;s1"kORm(\RJ;bEA:f+;Atnb3pb;LR0mRE:RO8`hT+H!FG3+sM31/<9:b[7i(*qd;
+%H,sbra at lX)$-6'M0P-iOQ^;h`Rj'$WgR&n#D126A>3GC,%nW>pQ/a(A]Am<(%S6<8muKHS$R#a>5f3MO9E#O9*^Q#YnPUM`KMun1
+%Lcb0J9/K:t+YF</EnORjYX4\U?<66*-C:^\?lDTKkdHA[MgTrEWenSYnDA<qTdIN^]olgMD[L&0\X`P^-f)+A6/+P:'MHako0CFc
+%jlpho?Dm:b*Xh(4(=/1\d7G7"6+5(.91VbE$s9fo[SAK9jKU]mi+3d"&p/L>APgPl3oOSSHkRXi<9LB-h9K^Sc%q_DqTDA;k[_Os
+%']H+'*EtP%:.0;6cP,uk5328DMgs)fW^M3:a]J;L-kr/n1^UhB]\NYtC'$g6a-Cak:Fj'_+"PDZJ0akAR*na]>to6*`>hc]YHcS+
+%h=N#alR/9?a"C]YJRrX);$]k`0/g\+c-_o?4;-/-<)jeMhd6"9,Gf^Wh/=o4.4-qu!&,s(ruk+Ba at rjLIH/8.leFW0;\@A''&2P<
+%L9^.[YX at S3h^O'+-u`!(9XJ2-Hs!YN(*<7c=if,Of!c)"9L3u-J17u+TtgguN;7K_R@(ISg1F\>3P\g(dkJQ&n"r?1&uQ47MgW#7
+%Z5hMImRs%(&$AlYg.'4>Rb",+I2*/nJp:7U4$>1c'B**V`0:0!jOlJ`Cg'qRhR&kM;F%RNISojfqafDWQL37EVM>T.#*.)as'EP]
+%Ji5,tSf0U1%t`r#:#>7MZA/sr7%tdkMuouH'Fcp(9&kZ+o't-:Sd9A[kIa*ho1&fOq=?bB>CeT&ldlc(l=h!pYms3[%\(^.T4C,]
+%F'D9ZYO,f$C['nuPQ,]rPE%g2Nh(kr,(UQDF,HXB+VY&RBMDT#G\JK-Npj:l4mU0*@"*)rlWFsl9nXWXEY7uS0!,Sq[W1U5bSSUL
+%Pnm7.!)#I at clXFN8j+D*A%KI]Wr\`U5:rSe<!0n#6Mu$MTk_(aW9-jG$tOE=V74CJi:L7&F7X)1MSjeqL*uji"c3G%mMY%gXhVaR
+%"PlE-a]bRU>eX,:M,gGi))X8e,N86^c at iiu0D#3kc^$!0W1>u(gLO1B6+,H8JZdXRfpg76b$>:Q1D?XEYiWs>Uoe at cZf.oq%NL,_
+%P&=<S=#kG(_b+^'T(j2M>KWIs?1ufN-%--uS*AQ\79S=eb(e<e1GbDP(^oee4MeJS1;\LdLTEQ)3LD?/?`a=\D+4c?#sSS(<!2'r
+%4pnU<Vb\GZZ(EMhX-Fmig64%-:iA&CbrI%W2ie3q/`=E.gWRLUC=-;A,VirCnu3%";`m67g-$`fC&t%el4aZR<;U"h6U]to,*j)C
+%K1Y8Y#AKgrN=jO=nm#4CFPB+ at DP\OcqLF at j!a0`EHF:\<dRl\0qqeD)B`k\Q7+RKt29W([]rC4s2OsO&Z?(.<8s3g1Z1;Vt8Rn"Y
+%'Cb=O#g)IsXtYr4k at uSr^!DBuDrP8eKYoLoW0_n`-P6'GV6eG6Vol0C,J%>N#@dr5dp94"P1lefBjS7*1t"Aj/5t"B$=8*_IO.#8
+%a72JXN=AuU,UYEnI!M*;r'h&m.U>^p0:;=9JVg#:(CIiY)u-2l1q;D+/80:GaMl1Fq at V.7J@,BpKA2.F7j4h`,%qCSF#g3--;;e@
+%bY:mU8/fF,*eaF:BlKn#$C2IUKW+rLnfts.7j%$-AkB"DWAUfmI/*4VkfbA_I^>S;>EVjV'Yfo!o6X0%:@,:$pGa^%>MQ]#eWSP2
+%5EDeN[su4*\IHTU\!%)d3^>?ld6F\U_o[InG7UKSVAI%DCJr1i2m(,*f[P34[qd]_.Z4.;HgX9E.d''+XmABrNFG-^9Y6REj-IK,
+%Dq`UBAbgDnNC?rs\B<p*?Bt!V8$`@em6SG/06fYL+",f34YKdcb5uWL=n5F`p\dq$[OsrkKVA2tW at 2o_3blf(#*VVBpsAa9:W)c>
+%5HX>9=R6_\VR05dfO4iQ(P2kC:r:!&JT"/J=A7(\gD at i`Fj>tS/XNB3*-$B$A:Bu0Gr(g(=3fI;FRt3MksTu!^<JgR8T#+`3 at V&_
+%`fNf;GVKE<BY/_E9%-g"pK@&Yg2D1SDaGB8LjWl/%gt2'][6&pZ_[E0F(FKg\;2^Y]>\th`L>-HDUdKdn+UBk2TZ(N<>-g4K3W$s
+%9pB=R%7iXQe/^&jU`<T".(O(!iQ6nFWqWlK2"gb<[l6-nld.*KGp.-R.Sa@?pq7p`,Klmo]MaP2m3EE!GQRRs;lf%?<Sh!*:0?8#
+%(E]ClIAF_i0C,0\Hm'U=19i:mH#s:+j]/iW;laDiQE8^2bP.[_"ctmtICXDp2=h8Hp"C'n;s)d!5E5NAqL",F;`uA at .WKQC2j0'u
+%eH0S3hSYd;H&k<t`C3<<_Q2eH\"7%HN564cNTsB9JQb$\@Y`0#FhG7YF&<)!4:dB;g)W_)l[ISc`:UNfn5C1PNTBQ6Ct>cR:0;8$
+%DE_ir)><i:>f:8'+#)(cYTPke814XtUMsE37B`/6F#=aB-nhA(R4)c+Vf;E;.hH%S at 6mqnYNL5E_G#=OkaZq%qB:XfI;npT)^Z(R
+%2)Nu-7UGftX=;?)6AbRL7]M80r'\r".QnT!s5[gX%?'^&NZ'VOdTBht&">WI^RT+TH'T+q7hTm^8"Mt3[p+qj%I2SeGS+,2T$(('
+%WcA9Q2f_C&C`+R^]fgi_4IE`:Q at Z!@&9dAj76-hCD at 4->GhcERHr^l]>CINI$ZNgY at +!EH8s1VlYnp$3PZib5A=i-GFFe[o%POb`
+%c+"#YFGrd[+Jsc_?udV^pK+Dj9_8+Fa=1UWU3lV/pgWBkVQSX*BrUUp\JIRIom6)k1=t#Hm;ed[MpFZEf4lPL+S+t^LH4#I,V at .Z
+%RFbaHUa>uWip8R+C'T*U7[&N%:-Rt6bm\qB=u*l32"h[&P&S[0fe!)?S?M.L-h6B(Uhm_r//Q,:dj03"OYF!ba6TRdoE7)""*r!:
+%Y(D7bY48`kd98,YUNpDqi1U+Q4RW/Y!cBOja&;ILF2HAW at QK[.omfT4$hda5fbm^@q3/IWjB:'TL!JhLP4onPCri%l17j>)N+.up
+%$a5Cr>66&E9Yfk8>mdQkJF-n/Hm\\9/=uY.-Jnq`i.hM,D(!]NCkE`-Ass;;OXP\-a4m2F"N>8 at ASB4@dX7"H&fTN"HXYZ;9e!T&
+%V-*TB:E;Yt%LBpTb/koV1!,YU9kESISi_)F+tG";/X-8&%12K%E5+EsdT&%:s58m5hMV'XWG\U&fSYgi0ub$fT.<b0?b-Z61I.lp
+%G\V`+rN;/PC:TK5YbT(k5$;jS_kG'YPN6T=\tOQo84d]Jct/Dfl)BrUlI>!'PI8sX-ASb3@,HQJiJQYb7[-L4aPXOXCcXh?AU_/L
+%cIiRFa=.t3o_#*H:5VF.a[pjg9C0,Mlp^N>&Onen=(LT%YoRMK0NY_r(1+B&PIjjjg[qtE(*B,UU;<iK0m2f,aKQ<'Q^oJh*%76V
+%s'4PnPLWAWRE)MI8rYrXYE[RiHMnkDI;(j\pIaA[r]S=f-Wh[CgOfBi,RStWS=ij/f3Ar9;XhC\M#"Y$7*fk5I/?5L,:@Bllpc=Z
+%0,dbp>&"1TQsnmZ$J(\tgcD$%W0lAtf;A<<(#ZO"Gh'r&1CJknr`H)Xm7D+A:K]?)RU$HH9]EDBPqSP<(N:M1U&Yb49,&onAa7cc
+%bgIOokP)%M_X3,b?Iq/c^AR*<SJfng#E%7hbiP;N-O;-JA[tk%h/]sR$,;!>7R.H3;S>q#.[WOA[bP2XiSaR8aZ9[/g'3`aP&Imi
+%\Y$tpaXuVmpA4RaTRlQEEWr'"Jg!d4XBRG>LaTou?U_e(FAH(k$HHt)jlNbeaq%15:?d,%+>2+,P/$MAjC7N=#LqW/S^Y/tJW:O_
+%br?"H;:WNl^jhr))qH[m%.qd$kMW\4gTippJW,jrbkNK4j]\>@Qt:EC-;`$;%9L at k/B at V@PGJoeDkrOV6eobD-IS%+:;N$:9tsn&
+%J.KS@*i2^b7cR-*$:mb5qTS)'mW-+nN at 7+uMT50W'n5c1=LP2H&_NU<ip1R3pakmW`\:OLkK1s+m*)X'_&N&4/7N7C`_bNS2BO63
+%]W5NAn!OiPL]?F;mS3/''p5?'rV`kAb/f4NI4j2q:`mo&=;0lF_iFJeUQkDB_J7B*o'T0oR:5qa7QkfE>r0!Z2,Dc?qN=QP!`q02
+%ik3,##MibR40>:uS8E."U]bHkH#aqKc4k&dAe"iKGpVR?#pK=YK/i,`?HG_)bE&n\_T"W&m3\6\#?Lu$"$N$/0*.!?<#$7=9$f-K
+%bN#?>Ke1HujS.+&;51 at VeIq81`VociNXiY`_UED71[B at p`7>(.e3Af)O3o[W:Y-]2j]bFP2n""MVsccGV=)NkAc$<1PfbI`D0*B5
+%k_GXsp!T*?WqEs;k;"`$]u^"Ijh'/$JgifKXtn+r"2Gm(:GIj!e7Dk,UO@\R8U0CN=%CF"DG!^dC8 at 0R+@!qg%jFR>n0p=pn<1e<
+%Gu at Pb72=Y6[!]N(b9`dC,5Q*PoV.LoEoHturicNpQ$2#h6.^MuGW(?uM4'eB=+Yo#Ru7`PjktYKXFu56'-W+1LJ;O**Mm at F0#W3D
+%F1-MacdIG9L4q,t^HC;2@/,o2;V8r7jd/qtq0EmD".VKu:l$)2A"#:0T.f:Xae/YeaZLY&mqKl?F,Uq4BrPKB^IVZ+HA[NO_Sh#@
+%j"L3FC>1Q_7X8Vb%4k("JOc#0boT02C]YBO4C+O3.Co]n?1cMn++X!%JEilZ?l(>C;en200-C4cQ'l3 at CRrB0I.%knP.-I8jk[:Q
+%7lEC&\i'?Xq-M\F2^_ak/FqepSnH4ajDTs1FaQ:i-je[@C%u3bnWjl+9&3iHgVQhIS2uK50Eh$-3i9[IAMN(nG\6F4,'088.Nk1,
+%>fncpn/u[.a7t2^5,Z_NEj(qj3S=i)A`m'Ql113t&i=1HL86NZ:QR/-^c"k^K$HurQUY9'eVi.m1ntQ=6!=bA_*#C\H&KsS0aZ/^
+%9n9_ at R?CuT%Rg#dd6FR!,1,KKIFN/;K45)6r@]ho`*W6*8*3>gW:V_jS2qNK09g2hrE,FbV_iQ.Z.+Zu6!lD3$a8\KbIs).X^1qN
+%m$$5mVf1[eCsd$EBMsSs>QpViH+,^[XV;h#LVAt%EsWdY^;-%m<[H:pJRVhF5J&8_P0qOHR9-8%qXCS'ncdDl3qH;-0\$EYJWsH$
+%K!5gUaXKor.A,CO#IODRU`iS]606--O>2OW_7D-oGiK+K!f9.I.(mg^R<!I)V@,">M+`58s.u?$+IW9PKJ_udB6P"@MZc6rmA&E2
+%/bO$+_NiM*21Hun3"LqRFe9_&m*;5&KEmRo-TRg56I#d*l$VYW&XlV%WPH=,j9\KQr98VuOaNT[A at Pd"0)rd&NWLTG2u6=9$HnKn
+%RR''AUb1bpLn+,DMm-IVC at 2:[r?N\"ppjBlY=j'U(Q\K!Nh1*5rbJ][i%_i:.G!tZ9CdJ#W'Df_p!t64UYK+b&(ZS<,kDh`KeL`L
+%O"in?!COM)ScIEmFt'C3RaBVQdDqCKO$r:(aRJmpPu!:ce"R=&R"j54^kTX$:T9NP;(a2Y_1,IXg4$ui;q0dJdMZQ=Q`iHIcZG?B
+%*8kh at 4(slKpSGa<;6B*>k\EGLOHAYPC^3bb at NIbH/*X'Ci]WjnfOqDW2MfQ$>S]8IX_XM/jUAAadfU.kJR\d3IFf*%k?LT9)s,G[
+%9%`8LT%&Je(\D.nRT&=C)/qc48t:&_.Ze2pOt?8hWtAkP6a1B%qF`qB`;-OB[WdquAji[sP!#4q"ErTT<2uQYTa(-1g_IDgA0SCK
+%_N`)5bt6['kIoqTPN0uI>NW at aZB<[f'Q=GLUSP[?'59&)A&qe6T-bA_T^I;"5lR!)q!@$_]V:2%#BQ8sb#>o*oh(>ho/:Jm17NaG
+%nKk2u60]QDp%,IhP8KGVA/@7=CN:7CJ_GHK8'Oc/qIAGsFM"A):/K8lZ!)*"1/XdJnT%H\"8s,--,,N,b"j-0P&#c@;!HOR'J(&<
+%24F]6WCL at 32\ilj4MQZKdLg.sM]Kd&dYBsmp)<1?..h:e)Kb&Tb:G8"g9a&JroUTDhC0u-fY$fq9,(,)DV4JR'&9p6JO3mMO/]jD
+%-1L&J/3MH4N^+iP,$RaASFcMQQ_o7H%S2BG.!QFbAa6(s*;L;n.%64$OZKo><R0>;\QnL.<`R:Z'q>%r;:*LFZf8N`W'?YG/<_Z_
+%(3Vj%7SAUcXGl>NZsFm$h<#]ZKEO]c,$lEi(oHm=ST</6NiPh+a%0qhh3+`9kL&qhAmaFMO`PCQcLp=r"\TIVkA)5t'Bl/4\ats[
+%fag]l0EH^&e4M6j[H1_mT6WUoE9gq"_%uYYe9[ZfSjY%91Lm.TJYEt78YG.?C7j&h$A)b\k0!GZ31-/t$q-itNQ.<?A+jMYJ-rUg
+%FP]r'(TfI#aC9Ig.QjU`bZoR-W3JJ3LU at bA3&X`[H9Z\BC0[=&eECh=PEY/eS%5/4/l=`,.eY5Cd.EkUjj.o$4pYkWC=3g;oTAWK
+%2tVXu3`J#C5llbW,6>Z\^iRn$Q05tdoXF+=YjoT4\_!,%kkXDDqrO]N&nS<E"P<(mYQ>n]+ at q#Jk7etBB0`gR%hXQW%qNYt4hL4X
+%0\:7(4:AQldiMbek`lSO:'$%",f$_ at N(/N.<t2C=@W\DR^Bb$LGpk\NDkFZqNms<?\"DL(Dq1rVP??`,A%_$1(K5(o_SICp(Hs<Q
+%f4JlIZ'RnCI!r4AhKb'*8s3T+%6-96<,C?QAa^W"e!>RN[9>>nS1Z(9GJiKK-64VgqrHoS!.b(AOn$arH-*,$Ql*YZWK`#@;VMe\
+%%I!!]4\$t#,3A9Y- at HA7d'7q!^->VTj9R9qKQRY#3B?-G)t!H,-qFY4N0A:n%P"*(`<5r,;%u#l at KTc/[l*IW at Q8.I]1<?l7PK/;
+%W_[4Tf#U]g;?aO at 13r_6e,S`4$I^tU?o'1KmSo.;3Qq@&i<Z^%'M#%7VmWk$k8eEe2F-1A-:b?G)rp#MSLIACX at RpQ$qS(Q1I)Z#
+%@ncfL0#Y[i):DcQ at 1tG`TUBTJ"b1J]Or]#IV>!QAjYWUHY+5YOgRHNEMdpa;8gELJW7f;2k9).CH7CeUj3Ce0()i.o+'>5^I at X\N
+%9:\t[ipH&DjXFjb=^n0FYZ%e8'Uc#M!_W#LAWK3"M$Ok#n3T-J:&WDlr3Eo#+/F:m_eX(W\p(X/?kqa;_6[4:nJ]>ZB;".8Teq?7
+%h""Dcm=Epss,Pu9VeABR+6mLf7o-p;`37f<P\'Tj3^-8eb-GdQ!dPc7JnT,S>Hl)R%&CD>,/,%udo+PBFup2>aq(O_>%HNAKP+ at Z
+%D<G)#T!Tj!-ia0;$J8GZR?1,c5u(KZa-V$Bc0Y!C/3t?QCFKD<l1h#0Q*\cgo10He7I*$S3QfG_Mkce&Ls"s,7(-6/ZN:#OM$qQ\
+%f"0A$5*;]5*PqVH%6'TC^:_I#GVh:aolh0Ld"ts(!BKn'W0J&H$C1KC[Ck\:s$H3/^mCT:T/hbr-oBK^s$*%i188QP=lgke3[ebq
+%D^Fo9.3b+;SeP;7'(^X^P::D__L^4-^RM^82TZ2,$kQJF\Jc+:Q!,`q,Rs"Up3SQ1 at TqejS/h9-"/Kh:iII2a1*RBXR]0>&3uPLi
+%cSBg<c]t-$9gE<!#P_,$Ya&Jd5g&ZS2%_AsYaI.UjQj'OI1Q`L"'T_j;tHb_U]Q"LK/sn53Uu-L=*H"[[\"/50sLN8AgbgnF/:7n
+%/CVplRDRXgOiP=-ph;;+(@Kbi'tg*#$;Beg%ckqQRp!u1VFSY3n%)E=Ah;"r5s.8a^+:_R+OrPf-tgJ>9l4h+@,p:XclrjR6n$3]
+%$;,$^$kIO:WG%Os5gI7R1oGJkL3BD^9<ghdraD`l)Z)<n;Pte(+E.HMie![,Meob^o+RTUK=djo&GBAV%:<9eCXD$N!hrIQL%ANC
+%eOO[GO&)$jnX_co.$''iDZ;HYFRGD3hD5dUgRVjM,FP1I at pVL98;hT%/a]_W/&,ZO%XZ+hnX\o at 146A"'Zg;""Kk!B(<$.tf2#>I
+%,\&0rkG%KYr at 8U)BM7K:(<!,3R,TkC at KO&mnU)t6g-CSfCfPX=XgftFWqKAj9OHtTb;%NQ)p:oA#""RjkFE_1+>Pue'gM"n2Wl0$
+%0IHgiMOrDSPF<C?Tbo3urAUT%As*KJ8:]I9K3T4&_Tn:lfYQk:4uZDPbbje[^)>'Uld:eZ3[r)F:B*AdJu=&.#9<EQ/ueP/\)D`+
+%SLWQqTt?sD?U"C.>$X_F8VY7L3Mt_E6KpjAE8e^c-n_,T+"8Sl89CUZHW/<q%=dpiJn#VhV]bubjBA*K$G+^V/6hC5!V3Ye(jpE1
+%i;Q\[0D0]e8F-.Tk,RUoiCbkkNZ9k3qb<W+p"]SX4FV9;:+\dnpUeK?RY`gG4$R7Ja!GDdk?.#@7&+.3*7Ue5 at nmmS]54k1"t.L%
+%JPO@,oTdD at j,pC%55aOb#8]M%=KbJn4e_J=U at DKPC_:g(A31uS&Fgt0RZXlbWKn%H;bTU\(0mCEUf(E94jU_=PYO4HF8(Dg6$FB&
+%d;08WS\-K9([MF-0Z:Xr;CuCIo at Z8r1U/2?X>Qjlng3?[kJ[J%9+R(Zmur/MpA]b:*gebQCQ_.cFK"ZAT(-Ot#GBr&_*c7I5B0?K
+%jn:Pc)f$p[K[i?]`.=aiJQHGe"_I:n1/JHI0"=X>S$3mOfH at n4UKH95:.pUdHYWF8`C^](%(mB+G7T6[NiT_4!NeL>RC5pGd:L=(
+%BF=3L$CLlm5'*q<XXBPsJB@&_0].M4oZI2h5i%`EI*ttYX]j+R?E#UF$SO@>?_dEd_=1ckK-Tg#IN%"OV\^Y1#QnWW.X.Ht?cc^[
+%%`<<hDkJs%=:sJ7S>NE>En/auZ-bjNM<4(IK2$QMOT>p[=amgYEbBR,2g(9nF$>rG/9P4#s37p5[9e=-<5)rYGA;j]O]"e9=Kr[9
+%RioW,n6+`eeAj#pSVNSbN7H*1AInnS_ipCT<OCi.[6Nk6_5TH(H0I4*oBqnaB9j,Fii&kY//J/r[o&p3.NreIB"9pWbsK5m0\``=
+%)1P79`O=!AG!Y19LM,n'jEG]@Yfh7jF;f4RoD/iEh8J$l8t6C=rR$3[(jnInBRs61*#M:b0s98>#kH:%3h54,>&6eOgo>\)>gR.W
+%ii!sl4OE-`o$OU')02s29%k3p:Du7Lnu.PoNB[jPE-#=+O#iot-,j at 46HdO]fM%F"d$rYso;t<JVjX_f1nAEcrL)A/GH^`TEu1<0
+%p@#Pb3,p1!inKb at E^(ni7JriXDAc at Smjbb/An@@`V,5C at 1@lZ/5A"_W-+S_G.T0?]A>LpdB*t]T%I,Fp*S=/2f6lubP4N]8^>S*!
+%2%XbXrA9r!(G6)gA<HufouBC.%_E,Np/ZKFH-\Y<5:$HLUjnVVU3W(fFinqDGEG^%lMoIm(`uPXI"4[bqO0$>WK)UjNHs at a#O$q/
+%Y6S.dRMu at gm-JDH1OhZd/Q(o+[)0KK!3nl1MZj#seV<Dc at TJtE3r(?-/T9XjWQJ_PXCq<?VZOZu[+[=V)q6F;_Q,2jr6$&$SN:JQ
+%!_=k!XTOIQSC]_N?2B#\9]]a[H-d1Y%gs-iiN at k<8F at 9RW5k`$6`abQO^)&3PIr6rUrqncenEPX<W#Tc]:bbacJR#]W*?RI=10Uo
+%l,N*uHj7rsbb"t:g$P0l@]9t+(b[.1G#Td%idFPOSN(;NKB(Ipp7'ZI^.YY[DF3K6i0lh+7o(o?,A2"c=*C(_q4ONUY%VB)SMs at T
+%H[!g.fkH`\&\`G;LZu9P)`$`O>PET<RO/s+1+8!9?kI!KXX#1[ip*Q:Fg/M@^3ols6a-7cQA`c9Ep at RH4'K]Nja'8`Xrc+t'/GUB
+%CK!AIg%/BiAlC&Hbh4n$gDf2')<g at c.D:pEQ?@4IR]RKo23g5I=YK,(]6*_F=rDbK7SZ;oob(W-2t:G=_AA"F(n[`d$$0XOk.6#G
+%rg7cuKH'>&A&X3`Gf/1i[r-5lX4gJ^0<_8CJ$5Xnb&,sa==2PPF0_/=UnG5</OuDpQ]Jj+"Q\#O\D9/gaiI8nlFJ[bIOniA4jt!9
+%3)1MDeqkJ at S]JW/n[[h3'*0#b"HM&O0M0VeJiUY,C'k8_h'>Tp=nklrgNqT)3aMu$pqYdjq1UiE)sL`]_%]^;[!)E=\V]8JUg6Vk
+%X:FYnasYeeG[j,m[-84ES%<K279OlsqDAXiXQu]Z`k"*Ugg%I[aHCYL1D[em at r1fbA74H^^kq0hN`5uE2,2kf^&q4bU5YQVM.,B'
+%YSNPcOSCX%Te58O at k[.6p>M11"&a0(BNkoiKQ"3f^?;1R8/eJX?CPErZ:?&&D6D9-a+Co)GZ'>Mq<o\G+()4ZRe33u.007.o[7-1
+%e+7kOS)gI0QXM!6]ZVs`Dp?\Shap99g6Ge^3;^$gT5VH9FPaOp0d]NDbVtl([!dh+8[kNie'5]2Q01HBep*DH<^ELeY#``.)Juu9
+%#Ra=bEXu)ZfnU`bcu=.ipP5!Xp&O86"mMeXI_`%:V`,ugMp\du_\E*28Irf?<)2VU(s8,L+f%Dg#Ai:ds10OGhQ'@WW\NW0j\D\k
+%AtP5KBUXM-e(DY->8#Z'R-W#=Bg,?7'lj0dp,t.1;fBu"?:JM&P8hA:Usl^a%8BI^T?O^,7X54`ruqc2k;@:m2f'KKW]-bt6)5B!
+%%G#nfWcg4%3[iUaElKrp0se5%OYjM>k>)UU'l)0T7^#i0IA(,pCckh]<-hFf9Z,_7Uk?Y'qQqOCn(71.\iT?, at Idt%@C8-L2NdcL
+%YPmR&,k?/0E'^qt.=Um\\e\1Q$IdOS)hJ]?bo<gB\*%!UHnX',kG5[m^`E[nSKL+Dp*>7PK;<0 at R(.X^e",E8.b=d].hRVsFh^,o
+%,B3?g/*1KXI7nL0:E**lmiY,?"``_JkU#<="AK%D-TOj\Xqsg)h=(L41?75*-MO-_]5VW3m:u*MZC]f*[6D7mPoO.GM9Vnd7ALBK
+%aT]a'HNh<[(`J2M4nAiT"9q;p`K3;;3VbU*3gY'f>LNP1FE]js[UBg/\N)Z$N[^@WNY;rBg<Ccf:9a[38&83/[PAZ&1Is]\Z^%9[
+%A+8-OW@=J%F\;3<q+R)L_RC_0G>9$`-0O'=l!`DGfC-6Gmk)XGM*[JZ%<f5*^V%lMQ$#a(4;?.I2r3SXSG!iPZ#4IB^6F9i.V4$#
+%q$uC*."h>;F*T>$1DNksk%cDg.2qH1=OY-f_WEbkY<6WUVg0ojYUmp*V)>-L4&!iCK6hPLGp2qA$d#>0?B-;_KN#H?8/g+%VWaG^
+%cB_s\_t($jKaAfJSH@?]$?%.E)O0nVB!FZ7=F]Z_a%T%Dg]9M,fJn_8r,aot%XXoYj`bSF(,q<]?4F?(b2%nJBN=n;nMZZj.n#`5
+%?&o_G.9ABpL"b]^>haSUZk6?del5DHCC"'Y=Jgj(JjlG.<7oH0*A-K%4Kg#%p8?^+'1bo?7oMoigD9L+b?GpHOR8MIV$S(V&(06d
+%P4CHqmj!Y%Y#A1QE2t7PjZ\:"gHBHQeNanp&0]&6.f"SB/tAVs%#]*S)U!.DHs3gFGKQ%N-&0ol]-p<[Ipl`Q8$lF7 at d91^QRc2/
+%C(bs]^^Ud#_%O<1?*bitljhhC1m8h4&I)kI3JC/K+t$]!l-ES'k'_q(j\EMif8]pc645>%r`5u5m"6H<]?$RBp5RtSSX\TnJoI6e
+%pXr#3^'n>j^T%$Va.HEbJb:.=O':Z<U;\Ek"u%<@Tdr(U?l7gYrY3p<1Z'05V"X_F_Cor'V3AQ\P2^_/mlt\"gc#k9S>+I&.e:W]
+%?:`Wge3MSi)d6q5I\2X2q:@,Kd6O4d<VbjX&spc/Y-?"/=NO&\R;1&Dmoj$:/^Ea\7M]sS&aRO<rH5h*[a?sQ&:UO'3u"IG:ro&P
+%BGJ&iFF+Cn1J98;V$W:ecCB?1[EO22IQ/q"aj\>?`O0:Ul,+n"Ds5LmT^i)O:$I_7i2WZ$'&]`spG9#hO"Jn1 at e7i(!P8VI8ZXX%
+%cR26;+n@]h$RZHIi%^;\,2'44JA>"kg<+1>SDU6:]pQMJ:4foeEcZa)TdI!q7H]n%ctg.b_h>+Q+.N#4jJf\?Q\flMQ']%o.2rAP
+%o9Ms at Ybu_jXRa>WK=B^:^(A at Tq)XQ_s!F[/@6TC;aJN\\`6L_@)/72uH`#o(H+8M,%dA`@AJ"ZR^frPt8(3"']Z6PRA"/AG`44ZX
+%/hug`O5H%d\)gi%'L)=5)J-a[[RV!r)S<_2o`UQIQY8A8hur]0A-c?ni8[1Bm^B?r4]^ni//k<G3BZ/lS)l>W'.h_8D@@TXd,(!/
+%q<X&sf6li*kE"iFRhLq^>>?3?W[3^i*FtSf9[Y>].O_BeIM;G+ISFC;B:W_E+*?8hdq2DhOd8_WVCeoM>C3][ZYCdDUW!(c$;1e2
+%*)hE4FTu^H.)/mGE2ts*,FRG))=DkCY'XY2^rAD7IX+Ah!tBT['FQcGklP44o'@m_XH@@.&8e]=PWopg5/)9 at oq-gMp$?dAf6aC_
+%,k(HSr^l=a$h'kKg\e9C]?HBuhaN;F#_!>ho*lauCah%*99m6HaTV&Pml)F>C^]Z!8X&6KXM$Rifn4%)-(BlUB&5hK9_Eu&#m=H^
+%)^L>lic"YCQWUlh\DB4l>@.63&qdc\2tlfmS<R5kCdeS)rKmOldZ!A8f@*?=E$b&2:'lUM;!j+BLC(JGd;r1^XP9tL;IT08mIl,?
+%M)T*Y_nMW:5jh!gcVh;%-9Uls7MsC&)cfPUq[(9I'Dn=Lf(s2J>5KXXQ8b=X_n\%(kF7F!lIeYkDD9X?CYKG)+/[/jNPB#7]Si<i
+%c"DBQdniSge=G4/]a)\l/nJ1IN],lNpqIo/VX$@q&j0'iS5AWYk@[bk"oX\tGZ)KX<b at bH-ZYF*bkjDf#`"(:]T(U&8f_".F/Y>m
+%9l>u;okm\?Q,cNjdN_[g;rSR]$]4BKUjucE/^uXeGpVRKW=53-0F1?`\"M$E4?393P/CH8<3R25nf,i^Sdk_t^gc`%it2Dm)lo\U
+%Q]n+`U%lPN4;fTQPR0.l'mul5r<ZB#+S=hoTD*.+m-#B9,0?:@49u.]#smG?;_ZJk6eo+i#W.aE\Cba<N>j3E,HBF*dJ-pkhUoO)
+%iA)6aE1kMhjYT^@X4Wn6i=U<0O$I-^VaAMU3ECYH42eJ(8bX[<F[o_nnJdFX;c_QZYF=WZ<GeS];sQ-G$)('N""`RC*pZk2Hj^F4
+%UU?7=n`'#@AN&do?^!LNed&+RjP!5up`TN=@H3%chbg7.jt5LUpI.e at G<MSlZqR&(-Vmip%+89QP6Y#-M]!=Vmo%7-:6!/&+54L3
+%HCkgBoL;u%UgTkYgcshd'M\u(kl!+OnbR%u4m9SrZOR at W^#c2nPrK^J2GpQH17Cn4\oV6\+sk[-rE$b$8*Wj"QuH]_aZ5N=%pD2(
+%;f;39YAj$(4[Wu0f/??7!LYU7iHO at NDJ3p[%6rpf.u0nFQ-44cWGP*0pb^@V?59,Y67,nuIds6$,kc)m/LF#YYZIJJ4m\.t9CfYh
+%@Y._i_-j1rh.FHEr05mur/#:Hp3+gjb at B<ZpeWCkWTih^^%`BcHrhJ5/$U28_X/IW`BXJ^,.5V+>29#?oQ;]I at e0h/TcH>q(q-"i
+%f2H0BP at Z\JH%%aMSW?0)kO1dW1;W!1('Zn#,:X"MV'`r(H06"_CL`:`!aLE=ME\pW6Ye:HgmPK)3%O)Y4fM3E4Fq-[?k:h2Cb57k
+%NqF3]\L-6q[pXP.JK>#9GlSR*j.iHh>9i*_2eej?5G>r'@oHH4_g1gB'7KH7Gm#FYq8k[3cF7/?5K,N)DoZi.eto+0_Itt&&l>BH
+%ep!$cT:HQ=b.\N*2,Yig%(0_>gsfiOS$/gI;Y>-kB(iH=rU_i0Cd_KQkAZ_"qjY=A[csuKVIEre9kJHp'B86]ra%e($"5_nXLlgX
+%\5>gA3T/@[Jc;+>fH2Y2En1kP(-=B)MNlG?$raO;P$cLBE=H0anh35:PTG*B\OkS0CkcdeBcgB0p%TNaPNGqQ(mjWBTC][6A(/:8
+%8.k`=CY([?&,FY%=B8h^Sj<+uX5AmQV_qQHET$SZTN at FWml,K&Yo<Ve at O<8p3rgg9Km.:-lW<pn?fl7fg2Hd:WEGB?PH`W[Rq&LB
+%kHU)$c&M2$m0G&Ab<[s(LD+Sd-gP3GZYe/bnDQ4SXn2gn53Lrjk2hap,frMI.iGb$0]hk#?o at t6T'_gcQ`SuLY#;5`A+Ee_X;Tkn
+%2^+?l?KQPE8Hr36p+l8Q;j('^b$g`D>Ia]95s/2rcY at b@8 at D7C_:0YpjhF3R<SK"=.a]\0l^dkp8R-Oe3spoF#>(,D#UqE6QJglj
+%f at 9T=<Ds/,Arf+6\>S[pWhmKgM+B3Rg#+sDpk4dSZ at _5e,1meAWH9Q%cK3$EP'_,$V:/-Z0mAIhL8E%'\q?%HDrP/9/(9cLQLXa5
+%:N9l>-NWT/]$h9e1&*FFZ?>tHcM@=Df04G#)VCnU:?6n*(HqS[\9+iO22G?cj4n_=4mbsmoE9#\-%dNi;8dcn9WNgHMe1 at cH7s^t
+%SM(p-LC)I#_-s82gAdsM1bp/$_#;hXad$VrS2I"t+IAW`n3Q8Mqh?\.R"cSo;h<;D at 6"J^&OB&`%\3(=];[?(p3`M'4PQ38P-_Y:
+%,BD/9Y>AlI at u41pptG`Go&&$]:BYr8,3LN^DWjsHnu`b#i2'tjpZ&'`OYR at k3tWt<"f31KAn]"u8-7T^I?5gNWAq*J\K^jdFer#:
+%(raq+VDK?-T;tZGY+Vf/8'>Bd$QUY4XnNt3[!#3$%sHYkQL6=jEa?^#k^SQ2ZE8n;j6->q:ftm*gUFf at hGosU[R>]m#W,:=,=sf?
+%K\Ln67%s3)1RtF"/SYu#QMdo_<Z,D^90Nh5"p#2c[1q2"_2;=0 at d^t4`tUqjbHL&K>H1n@@-m:ho8?WT:%,I1*kF7/Lo,'lP5La@
+%eXf0Uo;D@;-tgRD?Q:fuX%W\[-V^ub#27SpFG1Of'm[&2eX`uHo at RTdZTcE29pJKfS`I>IoK^i(YICiE;`u6OP"0a*h/"#?N.!f7
+%6XZ?rW@*_UW#*FHJ<"'uXPEWheg6O;"7gqp.d%j>r\L#6_h)`#*#g'pAlqIu at SXFVZNC"AFL?01D0oOOZ`,CWGE^))ET,Ok#:D0>
+%"T$DGO3C\r:4b(gj9tN&8a^_A>#J9t.D"mc--p%4Hk-?ErM"UiBX\bW<LQ!hk+YgCA`K*lrGJ%YhHVK]Lb6$%6:'r8&jQ`Hhir8@
+%/r?kHF4MPtp*0rr?Y,#a8_EEUnbXRRgA.QLB&p=6Fn&03Lk>,TF3[7OjXT%aL5F=$Y3Ea++@=FgF>o\_JSrE*ahtK"GSR`Qd#it1
+%aMFPBDe.Q]r2NZ/"Pr1AkhtZ_)JWd)4Zq9co@#=lcFIUM:P`lNim=oV%Q`2;jsfBujKg^)Q^jhs,fm1KJ;?b$:J8`oH66(59KloW
+%I81F^k<7H[YgY^YXVS<%2ropW6$/-4*J?bL.%X*:cdPVPrcXXZFR?_a#"^<MN;uU^r&P8rQat)N.?/0l^*VmD[Km4O%$kgmQKC16
+%MfWZo^1T<gVa]+GVZcm6Pa4%[ZtNRpSp`)fmk=H3.ZeP\;=Bq*o5/Hs,/[)FoQ$&NIec"'<>1`nh^j"Zk7jNPkX%a5g7?lVE)s92
+%1'P%]NKDn5a('K>2?@u%kQS6e4&]h[A:JY^g:#6)E,OO^Og=5PmCONL.E`O0HZ\#q19_NSfH;oU>7YIlG!^mtMolhDjO8cAd4bei
+%-\OE\e(spIgtVZ4?apnU9diaL.8$W:"W2B7M%i?G^&%G,OuMZ<ms[LH7isgbIo'RpOYF#5-BMDi14--LA_3-H&9LO;9S]!T#C]g5
+%agi<Dec/PpUnYPYIh+/Bh^i-:oJ1:ob1)83'?l9XkIm6I0Sn&K-X^(PlHc?1CdX6AZSLB"aPF"P/16j8h4K*Mf>]6hL:rEUgL<6r
+%Hph^$QIlSME>0Q0pV6[s"=h[eq\Kf]]u-GA>KFSKZP=/WP*;O<lRY%V(/E"2ohGh9"mdUT*(PmP'Ef at dZTH8e[7JbN7A>!6\i/Yn
+%bSADc)7aG^X>V[--])6m=+=//%%:bh\o^*uBbAQ=.Q?4`lI5gDZdL;7[Zc[SIM$dNXl92$0'V[cobodG-E4LnSq$G[+$2mUeKeY*
+%P*Z]nQJ/e1\),\F(lE7[PGpfC<)=16i+1j'[-7Z&%tHs at Ju3DF\O(Ru5NZg>15Y[0\]6eW.0M7k0Z%QLpD<?1X/U'"#e],I50(o,
+%W<I!7dipGB:F,-N7<spF>2AKaadt9H,*+O#Se"I`"NXW%&@Y?(E.?saEn5O(_nPuhd:.")/aucFCc(Wk0@,#GO<XQ#;Y7:*jIedA
+%@V%Ki1?LqZ\F%t7q(K*WCOS&;e0)BnhE&e8d5!0bT5toK`#*">.3>VW+"UrmlTnp<=UImTS:uFPTI!E^JMaKt3`E(C;DXo`Q:kG*
+%C@[l=mSkoN=B?\-e$5ogP23SNgj]W-pLKGKqrfA-YK=-#8K,/`\f?HXM$gGT4Ybt`439"PH&'.m\lh5W at 8FW,QO]TC/3.A89 at 0Sj
+%4mDG=KnGNBDH*'3aJJ67g7/PpOl0uPFValDMbT/C&U$R!d?L\fD]!2_3)0E"4t'2:G7a$p\!-<\JA,Q_`@bH&BObObY!TiRQkOMN
+%m*Gr4>[R9d>adn!:2R!Po!e#M.O2uU6-dAu]as+ at a-dm2<;bn`ZKp0BP-hI&:rob<Cfm4joE.\MT[KEem\ZW1m at Qs@n6@#Rl5b!B
+%6DH8"4^ZsBMkDWsiATl$/4,G>DPjD*(#S=ELoP_l$>!80k;HTZH2qT<e3UMe3->Vgq<4/\9[V,"d4eJI3D&%e_5`C;]hA05djPCT
+%nja;eC,.oZ.WRMJLH"[Pd)$p4I0XZVVkF67g%r$p\8q;RAjS&Je#ii:G4.?1;tm61aFNCL/U;]ZdMH&(@SZ_3!F4+3bFTh6[t,*)
+%N_0kE<pna5ZMV$W(0bNl-CrWZ#n#0$3ec"!2lmsTf6Ld[.mmrB27Fm%Y2Ytg_n,f_;5qFUAK*5;G%1QE34MeU8&X79?+lH#M6pI)
+%d3PYHD^D[LT$%;.MWk#6loXK at 1J4]jhg,8hSNDasQe[d at LV>0t7.*TcT^S59ROpchIlh(MVa0UN(`*eiJVO)sI&NPZMbu!]ou)1r
+%6PKhbr3S7_PRGd+lXFY2S[3C$PG7lM9thsj)XcM\(^@DAPp=WB?7%B2mVkS,k6_&-6;s'p`D+CO0&_1j;SQ-M9.`-b0pnE,c:rQZ
+%9c'C80WpAVMp8 at o+PCJe:LX(u9r.mE5]<5G$\J!<c9$l\<RW-^H1%`p$ED;%4']mn!5Q*]HNeY7BK_Zl0.a)HkL6;,c?cBo4YFgJ
+%W2]o8Ir[*R`'-3$-OGfJa(JR?&lI\#Z?,A!K>'0HV=fC6LknDin.PQ<MUB8=1V8`O>A]1Y;qUgdZf5EFP+NMq/'EV7CM0=>h=@Vu
+%GG_+"di]d!'@&^pcU5jGI-2,5&R\. at qpqO`@AWr:d)/$7`]mrZPCb at ei$4ju?gr^G@<1ot=[E66Wdhcd&a/40AP6Z5JVRZ`OaE6:
+%bY\-eLTCLV-^+Se3L]E&-ZIdJjq*b%:.%GdnjuNs,;A'om.!&0OfKtHA$$&-1t2R22U2_,IIfL\Q-3XR*%@=>_1r)4MR*Zff_70!
+%9$BSB;2+21qIFfLq:/+(I-23gWDS`a/]KHB(W>>)Tt#'d9U+.opmU9nFQ!j)g.6K#Ls0-1SI=U:+_q(s%nFa$CpZ9lqN#_mDF&lV
+%W8.kpVK65"B+$U^/V.4eZ*AB9`_Pm^<KP>fduJB:Gn%0DgARR)JHTieRn*?3A at EgOTEQ0BGl:n*HnK%BHJ36jqtYo_c)PPEs-94d
+%"sft-U/9AuV)UQEXL3-oP'OEh!(g4T>>85Z+X!@;q"?uAj>[eLT1ZEWM+5XU>dV/pUfek5d]`o3K^m7VL38dG,c\V>.J?X]$$+=$
+%$47<f3daUd3<ppO3q^AYif]S"S]?\pW<YN[?YGM]6A(0(mRUYIgnJYF at Z0&h)]c2W=F at c[HR58c<\d]jRP-k&9AGnB/=J^lJQD at i
+%nZ1oCPTUe&r@;M)+0qoq=/*`lY;uiDFS8eeL[3H-2)\eX[+hLO4ftPm31/-T9NMiI9>`,kjP-U%rM`YbGdB(#BoShukJ<EPVG#`E
+%IgM'hIE's3bpBZ&DpJ9s)5AP1(h9t$WAPuII`o;Wm+#+KDVG%nJmY:g)"^C97B*\@7;HAbUUS-/_T(^48GM%_:FT:$8`@t..]"c*
+%4j"(dM>3!N4n9':`:e%K9Z/:93"co##DA?OM&u*DOEAdY5rJoF5%T)48_[mT/k0'_2F:U#FZ9g);W[o>^9V%eJ\B`?HI\*i<>"?\
+%"f5Y#;-,rDRq`9R10/Q<HXN1.^#YL7.CR!LX#X!JIH!=l0^k at +F('FTIssk[q<,;eCm+?hE+'YZb+t'QN^;\1mjpDido^$eYk'*p
+%G-7irVj9dc-84,U*EiqTbTV>S$Lo,5g0+]]Vjt++0XXaMrDFabCK+cH6)B7ai3W+O;5thHo'D4J9+F,2^dP7L=*)5XjVu!m9%)tO
+%p":8"BmUJ>Pf:S_Q9Zi*eJ2ru,%u2Sae[@)brm^hNATbfcD8Qejr at 4;b[!)hC4R`t:lL->dTHpH`3q^pWf3cQ35##]f2?j>%H@<m
+%LUf03TWaVDgbr&MW<s-ife(gCJ(3!f<J17CHq5D$COCFCk69?WVJm4JD$R;Q%EPX;#m1Wl-;R8k-mr:Y4.B:6d/8gQ:X<IJQ(,ja
+%BM!3GIL;JW at t?b.1m90QTW(S"Y99ZmX at L].b/7lf0S=S!QlLQ_a at c0$-,/N_-0K.4e50<D_rW.Parrj[G^EE#Qdh^']j5<^'[kS[
+%AD>P9P8+2XnW7Y>S4PKW@@:!h7XfZcYl'++?3)@'5Yb(sWVBoH7h0\b3?S%GLp at Xe?MDRcC:6&;_Z$[@2R>E3s-\-XinT9`.A8Z;
+%*&E'/$b9Xq7cdU+V>Dq]0p6H,ro`Ml-1;SfA4,H\K^V$on$GX2HLY20NKF&&aXI/#nEb"OXUIcD9DJ!r3],\/ep)8-nVRu`^o3)8
+%PMVi[0f!\CjhS*3BRIBhCgs8!,qD1Y8SpG[.]84rqk=rK+I"O`,gZ)A=Y$+t>g,pKYN0V!a#F8LlNGgWBN/n*AB3Hs\of4^N/\#N
+%Z_a5p1B9if]^S9[A^EQoB>9V4Cat%$O4A)<_Eu7i@$st*lnZ8.YGBs]KVF\Qdl'0]qb=d2g;l^u3o4mL+0;R/1T&#sP48Wm.3i2N
+%p5]ZYr\@ipfs]tSfMsu3g3a78PLS&H251M at LJ)qJBh!kdYBe:EGl\dS+B.tR at 5i<Q:+TVq`GJE8oW=#QS!dqY^#LV3,KO8nJE_J.
+%1*(=fHiE#a0DHOod'd0 at HI+BZ*K:sWVj"UQ at Ms@YWVYI_3iR9Yk at BcjC](I):*"Q)<QNXPG&+it_sahK@\:E;(2?+tgHs?3'O:gH
+%N819<RCR?Srs"mo at J$F^S!8$F.:f:[,&3NTpna7BpJ[8QVT';bbUEesqL/aGC8IFXeX+^/n8RH&ZNM?2K:`jXm4=c3C<4\F/Rd';
+%pA9fbi]B*eW?\5bA:>Zenk>mN6V[TgC/r@%OXnI]'ZS.F-1)Yh/'%,&I0b'[^9sm<3,a]A$kI at fP?N"K^W3kQc(?C\aif^"d`WVi
+%iRghRd++Lu[141 at _l_LQPt(5;*qlN\_&p#C>>n2&61<l/WK;B'=oBjef+aYAFm"2)l`^CW&2U`-Vj&Si7[Jde7hUOhQLfCKU)=83
+%Bqlo`A>k$sqbtoL&j'$]UlJt3s!G*_E2TkL$1IjIo(e;$iiY1S!uADI<)dTgJ#,1T at Q8g%CP/6h.Q`2pbL6kJF0m"K-'H4pM0aKY
+%E6-9N/n(0RL0VlHX^<A-HEfZAl#ALFaaL4<]0CIC\[sf[Rhk=6;Tn4;9A7/K<YCG02_2kR*mn4Wq%==Cl,PKI#t`a">)/XLKC/_8
+%`ejWD[QN)X^[9C[kp^lfL4r2]@i;o\)u`2W<6>V02^jE>b#"`c+]tdF;Q^X2A-c'D&nlD\[S2YeTbZ%"U2lg`c2CCuMd$(fbOIV!
+%?WKnke?e-TCQp9hM%-X\Tu(SD*;)#+h\r/\SS*jSW\>iRUts=dN;l27letKbVGMO:F<4&\RY;K at K"\HY^3GO)%?,)K>JXBU^Ubsa
+%->:PmQA!8W^&IOY61Yrhj^6&<h=O;jWhqT_YZT1Pc(_C;lK:f:OQTM4f`P$GUsnot%(ZaZRC)*rk2c`^==pTI4qFZkR"PSO]>_\+
+%N'J9jIU;SE_8!NW=_t8FjLg]ZhUg;ef"5)-WTZc2F9EE%JT&YsS&N1R*Ka!d_YKq&MuA'ER*APVBN=rU4]n;.qc-N%5)u+%,CFiY
+%Ghu$2b*ren$F3&7bd1'3bu\*2OqM1D8:W%%-d?ti;cL:lH*1[JaX+\)<QO;dp-CshDA-B at +^^^=\dcHDpJ+,Qn?Bp;9&4'HQ,1kG
+%j-qa>PRXG/a#B7.)6$ebO.KUZ%5UDY^!Zs/E\KRpmTdl`e3.AdgL_P);_<BW]R=NH4jc.GpY5j7]R6k'p?8QBh*u,a at 3)a1jTG7?
+%:=eL&]R_rT at dYIiicqb<4LjcY%MIBXWM92L$_*ZLg"K;_-7KAi"YJb0NE(EY[,cjdc`-(pa.&dRSfbb:!q6/7Xpkl:8<jE:j[EN$
+%ke!aMdN(@)ULD+eD?ZhWd`qOJ^[Tf_)?'@\W_IoN+&371aZBc^r-->dF($`eDf:ZW6)a%9HL,.>C0t=K8CPsd-g;BL.1<h*r_UB[
+%\jn&NSp3Z`4eRH8BbF6kco^ck7>R(q5P0ufr'F.8M/&(lmu\=V7r$>a:+d^]bT<d*bTqsInhR?25PCAGqX3XL2;^uPPdiO1T25=g
+%)f4(*;_e0I0Bj]1\j+O5!WJ46=;"M4M\X/"$'n+fQ3c[Lfm6[XVFJ6N&Hk+bJXH,5;_/ei63?$4\WH)?E-Y-!Z!3^o,'?6sCX2 at U
+%I49FTcVsi59.\nnB+BOp],bI`_d&"5ca1clZBh_!h:m5AIV[7#hGpRtj01i_n.W9/Y:#k$ina(?q>p^YK.RAD1P)bBN'_5=lV&>J
+%M*@Og at +a<6BIIP(grF6QGlnGRV_XN,P8ef$-3".JdRqU*-L_qp;4g8'2fE>Q7:5L6V=E*X=Rmoja[++DChCXq*ZZi.P^h.J1)]:Z
+%B-puF)BdIs.$;]^*0XN6mj?pVLVV8G:H^i=g8RQm3=$+24=@i&glIlFPqmWqeiZle at qR*^g7`76To/Fg]Y2TFN$7Ji)8HtTSqfcH
+%WON(nI7uGqA=kun45%G:)6LKjK)[Xn)pVaVKk8(k$:'H5a9$g2KT`2E--m2(QqLc<>Z^rJYq\rQCX94*fDkW0$!N!#LcqZ':FJcq
+%6CKU[M7^Z(/tD1XDD#mt%/+<o3d$Q97P-H?3YpWLm]3s9M.A=&o<&_fg6ZkS)"G9(rgGt]QhqM8;.T*I9lblb+1HgbFbhp$2`H<U
+%C"\$1R.i]5fQ)]g+fLEkJQ-40FS@$l"9mW14bGX+jgESM3Y*ao at +1#m+!;0S0[3*p,u>Z\AAD9D'Q'alFjdB/qYk&D##VD`:bDOI
+%pR(U47p!i">Atc`p`OOn\3Q*t^56WiQ5^ttV8uE*Nu-"PVS(]2o<NkdBr5H9akj%mZ[>40Y/lFTlCu"*R1_461`[a*PV4jmd,\c0
+%BfJF"3X#]IL\uJL8I9MRjQ9a\o7=Ebjss-#o=X?PGVic`YdOQa$rdm:o+IkDgsFm*@Bt]D8P[&i'*>L&pl7r&Zr?DR>7.5T\W960
+%n`I:BK-r5SX:sp6$.)HaTLISH:/##d]YA6eS@%t_g.G^1;s,qbH23g?l!cD at HRAj_176]2dnLF at P#?<H(76SgSmC6pP6E4G`]$Sl
+%4RqLNC&4G$^,^S<MRXKE>uOf_(FYoGB)W)C'tS)0s1^"`fe(T!:+'8jd;P6CEfP.;/0)66\]>!fK]L at k"XdG*%H8#p#Wq+J9-ro'
+%=A)ZLlQ!\CRo^pR^HI:@AiYTV?2q"3F*N?"- at s1`1Na\6b'gjJSTfN4VlFM^VR)o%M2K_J5I<9&4o_1FAe,j>;+KTgB><Xro(fmS
+%`YA8$+?-K[E"BR9lh[2]7>][9rWGaQ#ZkJLA1bmO*eCUIe/(*6Ml`&W+st98 at U/uRIJ(/HFV7\h=35#/(*f;7Iok2Eg%B5uV().c
+%kL2UIm$C<<?+<OWZ_<>:p<eE9KjJi_iL1Gs71GG_1>0Fhd=P/5X[IW$^DU)-q7:]p1ORb#o!R?-Z[PhFg-h^MZ#bl<R5f'*'RZSJ
+%,fU#P;LLhQhec_l3<ZV498b8IO,lq`oa;E*"*--f;aI">C!W"/njBs_^RRU(\JL!5b%'ubj,li>A(Ek?hX>o":(LFi:[:.3FZatb
+%fRDCo&J@#'Hic(APNP&8=pnj]m.=S:c:iV>&-RiaOn0aDoUG(/o\t8+0*mG+HKt8fGLCK\]n5EG.WRM`W<+G\jbj;2';Wm,8D26+
+%Grs\iUtW4+aXWK3>Auk8aM`iG)#0(n,1-\TkQH]V0J$PY\-TJY"6f?HDH/p_5C;Ps2a/pa(e+E;8KJO%[&_(KCTr8;pP2%B*an97
+%jB2tCp0d=,km-=6(iU\f0h at qm5n0<4,!0rhA*ash2G`("\L8VSMnt:T9gX"]c5,K^,o::S]0NP:$2m&"h6Xs76&qG61t]K#"nRc$
+%c74V<@.)C\f.pLubaD`"'6'O7I)N*4\j"0k.I^4Sr&@pfFdqeZA`MRUCL*,U0btXE-%1hR;k6(,gn]q:E".M5[bJ&mb*4- at FqRc.
+%;ZW?JX)Vp4k8^Fnb[gN4pUAV-d.$*5_4ML`$o.ckZ,t&oEW>q$F"s:9[k4L_/aRR2=;9WpTooe*)j;2a@/XTh9:.fe4MX/"YK:S<
+%N906Rf+t1=frR%^oja\$ZM^YFpN'MJh?N;tU,AK$E\>pf'%j])doJCJ[<UFt?YZOn)GK"`'gEpmC:Q:f2eN4k@:,C+Zi=c<c9aVm
+%8L7NapDJ^*&NQsP(9I3!fkTboG4d at _^,GBW[+4^WF)i_q2&@He_+YB%52S!5-C*`ID"=.=P)BObF[Lmo/d#S>KMRJ5#HtFCOg)=-
+%5$e2]4tV:M(Z=FJ;)4K'?']n.j at r/a,gCA$LfgQS8K"\WP=L8'@CC<0WL-$RLI#b*:X9_RO*eG%oIdaAnr:e9:Q:R'*]k%e-]fpa
+%8eBF'rp8DTPb4cOe0Te!;P*$D:gW-kb9HDJ+IG++)#b_]9[(7bheKJ$:>`&MjgLFhH]UoBIr5#GI5>"`@qXrs>OoJABsX+1cJ_9[
+%E=gqf.7)=)4?nM1Y?s)6UiK\NAZi(QQR!E:PSJjli!(3'lJZA26V`#pHqTPb.-'8r9F,(,gS at 6[B>H2]o'I&%Clpls2E5;ji"PAp
+%6RgKPA^?]Vq/epH8`&Oq#a+o=n(l7$'@r!U:dF2WE6W!$8J.\NB=0P'ARbV*3$qH[Ikg2&*5=ft^iGt%VlfpZQrV#CL2UK/0KR)%
+%BkuD/oUKu6,)A6`1m&C.!r.^1!sH-amGF>Apb4M%0Ts"q"QS'"br79Zf0.ZeM0l'\Ys$f*H-Zq at GNB5GN*+=NnA0_]f'0AH><0ea
+%ANPP$-dNAG%uR[goWkTGH"WDoie98<'WOX/&"Sd:?'8l>Bt>babLKBL]`BX,_&c?#FfmO-5G>G`#WkZOm0O2le at FS1ht/*R16bAO
+%hC,/V,ho1^->$kQ/mm#];kbJUKfL:OBX=NMS5<=^C>p;j^^Q9Z$!m$m_6p_f.ag-38F]?mT[<AVT>]s:.0t=+oM=r!p5[CPDJPa@
+%:J'28#1^HTccETFX0\Xi+#">:mMr9m3HZdY#PHn&rVX(OX"EeX4=.h0+mqhd0+g's\go=oR`N])8RACfPJ5 at RN-1n63V<Q9%l;#<
+%bp^Z.[YZn6pd&:1,Y\al?oBn!f8r=!Tha++pUlG$9<\=lO^CfI49Penr2e4`V[bK.A"W=!dgW]Z#u>r^^*LjRmf3\pTHGO;Q at +2L
+%8=(o:3JZRjd7;rl+$VTB\mUmOh^::'&d(-E#TS_dS1qaS"J(_TG;.b3JL,IbaO2#TX;eoY.[s]8]C<J-ShX<?K1S$BE+,M;DC>2b
+%\@c\hP/c1f]2H2eNI%S/VJJHSR7 at nbnGALdhmN_6U>lHm1($U+@`EsFqIr8Le%bX"lm-mT=B#"3Z+T8l2IIuK,1gGre\r+o56'l9
+%/0qe8/<a8/4O]llU`EeE5+j&'6[L;6RN%3RIumo0npE-%#+>8l+%;Or6)+n1CFKfd&7Jik0XP^;,GXcMBr5jMmKDeB,=+BJ[j&R&
+%cHa%ILYSYcGo6T]l4i<[$GONMdH2&YpfW'f-Wr&_T,ZUcG6r*AYhY:R0p_m0?t;7'mhuaEU2[LLb'!Z,j:3_PH6+e%$e/;pF.liW
+%Qo!XBE_66A(-bej]g?6;+ou1q6r(0o.HNNZSS!:6aC?AG=.kW0qWH&PU8J^lOU"-OkG#k;T-+0?2QXEs4I)J;i%YV+,\QK,GKm$Y
+%rC8N"g?d at 1#-&)T at mf8GVS6c_ajt"4]]rQ3*dnZ0R*NuMI?YU324h#=]>;9cg at Gu)[2STDT%'VZ$RcKrai2AYbJ7l[c?<[]ne0m/
+%qVnP<)"$VeQD<A7\^A%uTA7C$Ln$DnODGRfRI6d,6q9:`49mL8.[u0i43aUi at CO%A67Mpp`B]tHC6cm.(PJ4aE$l`rYkOa<l at EX/
+%,Oct,";@mDKt:+"G8Df_RCBj.2=PD)M>pU\;/6eDISA'H^WsdTop=l%[7g#scpE_5+3PtKj/uT-9Y$>I/=63s)^W#'EDBa]Zs43&
+%BVVfLP_!6T4iCn&4p<U+mYb4PaVV3&P6]DeD7aOH]#E(t6[3(b-ft,D:;Pkj=Df:9)mI*RPW,mG+bfS%/TUP!4qu]\RTub>%<g[V
+%UtlYgfUkAW%dSCA,eL_1DsicfX5F3;os)AE<m%M(%#AKCF.J6.h>2WgM9N3-A]?J#"H4_/.J#$aZ!$gmE2R&pIN-u/eM_NR=RP)Q
+%'&j)6o6o5/c^bD(dU.=feSQR.m/g_3&8Y'k,PPU!qju:lir)gfJr9`+DX0KQGp'ZI&"e3Oo5[(@"%knpSqfU,hGsQNUO&L=Wf!Z"
+%Z*@0aVtO%nO at d(imgH;M+75;P)JC at fCnW::P3!u)EDttiHodjU<L77R at hK%Aa"5[jj(%AdVJtdDEbU-S8==.PmD)8.U6g.pa[?UO
+%F6sr&?1]oppLjkH8Z[Wl+GNTgcTUZO.FAfC>4!/_.!4A"?R9=Tn#P#cnjUgdc5jsqpu=d%o3LXuWDINhY=c=VPJ!O1^89+WT%bUO
+%anp8UmI0^>-C^]Yflm8TQY(CNaNL!O_9Q!6A3(F[-2!XB>+1:!&(Yf1$@_7t4P!9A4Ff=)"r0-#1WA,t[3?uWr:!\L2d^A^7B-7Z
+%SES`R at L.Y<GenAHkFOGlkADdgK+^T1H`)cS5>N2uhJ<*9W2_:f\l2XpQeA/\\?GXnPLms<^jA]6O":cp4JJ.`"K;I[.i2V?<%tNq
+%DGB0qCQF)E_*HaKP8""jeHC](e%,^)dCO/CerbJ[.\Y+37bmI=;FhQ_pQi9r)4,Fc[*0LJ^H(5<`n"]B&9u$9`2k?:7KQ4o(5ioX
+%8Y0#+-^t%t?=4nA3<slQ"5>Ssbrl)Y+Rt[+aE"0`8t6)^%flVU'rOM,eip at 5"'k<mPuN_'8>a,g1p5LDcEZ&#kT+DAXQ)+7$K%-,
+%f^uqYSJbT$;i6Ub:>KMX&o5?1b1&cdR(Tu#bKk?;Rs'-IA=I?CK-.m$59lMW5Rl>eLSjN%ba*>8&h&D,R!`2 at e!=9 at Xp/5g9Z_ at t
+%IGJj>;s`WYdC;5rI[<<`Z(B!i3S4roH(Z]is7rnm78q:bCHh5_WFSaV.N3X8(>KQ7CeR#PJR/'p*JK(1N*j3[40S9[Jjt#*D#*[g
+%c(Epq05*`)Ms8*r]JQg>R<miPVLk:q9m.n>Z[DSr%-*Y71u,c_F6>`laW,qo6h6lZN'`R^!2g!o?#$lHQtX2m"AP3ZQu4j/l><p`
+%;%gT90(UiDBfSnE':4=4\pmsJXGN%4]LbC)X!@cs$@Yc;8=1Y&Gi!Kq_JqPb@))<i!ko.ZG3Y+k49!HK)L)UBRVYL!FfL/]H"X3>
+%#](c?"XrH6-<(&La*o^U*96]lo#\)nr</8d&/'5<c%FQ3BQDjiTA$9NE>^`=5LMDB561t3r.BTTCkS[14`T'KaL6l"ka%T*SfAo!
+%fl5O!h`5_C2^[I+?!io>WF#q>m4:092M$-m89p21(;n23n,ZtEpL7,_(l1j]ZfGC`,`(O&2b]d,o>"oD.M at C)Z\*`@m_<Y#0lXSM
+%QaI9nS%n+^-Ldiqc7cFPX$t&ip%la+aYMJ4oj]7GnHjcI.E6e;=(@_0LS2j/`J\03OK.89hGUO0q$r7GUjuA';Yp1M:-Z'Z at XE]?
+%QO2<5jOFkj;fND36Hu4q at qC5(^89hMn%i9?'\Cml;lXtcM5]WJ$Z[P<`HuCHVd2]D+O`S=$['d.g5:CZ:+`U_Hq at +hO4'3+&UG5q
+%H1X.lXIa7gA]Q42)2dS.ofn)2P7gbKIEj/9O8p5JRUspK8g<>:Na]brr#K\j1G6M6o]?'&"G at RHjKq-_TU_MlkS.H`(?s1W;WKqJ
+%C15O$P.#N(`8]9"H><P/(<lUhI=P="<0-_L1u&SL3^N$JCOtq%`k]=>A4#+d][arkq]S::F,.Qq@#7<(GK8Pm88CNM\P0o:"!QYj
+%*lp.5Zna59`"NK,A at UIWK0\hA#rK%6Vp&QI7\fHY#r:!1 at bMjkO*aSqY"BEp$^r/5cu["FC%BI?oDGIt"9Bq.oZESM*_WPM)h\)S
+%V0eVB,SNF]W at P_II1EE(\jW`,:]akdG;+j!X\>^-)fMu+^2=tK-*`#NQGNBK$(l1CZGn+nE:7jCRY.#LA40**Y at FO>Rb[lr>DS5?
+%e\c2rH.&/p2JB3f&5.=rS>h`n>B?ed8+c]G4Y\c9CYQLZg*uic(p3DYOIN[e8Zb`m8AKVP!KM5&kL#16ln<H.'#KHYpnBh\:,>Ap
+%AL&O!M3abU,/)/R[j1;\!00tHmM at s&m8Fpa$&0;A)h)+bA89\k!ZHq5r@(5Lq@]XnVcJNFPBp!e(U,XUV7&68lrWnfXY4jLYGnIu
+%`$/k#*)mRHlRsEM?:;1RPiFu7HW.DqaDehDg#OB);93U4R3o6?dRG)E4]2-p*__"]k,VP:>KR9,YIH(X0#iKfrkUAGDAQ]@?$[bu
+%Vdp\AelMhb5-H9H+LU8FrcfgDb'V7.m;D3oj77>APR/JO/%e(C"ja9Z"%R8#cHQWLG:9M]-_]I.#<?AjE]!*HL%I6dfRAnVs5)5Y
+%/][TNS at aji1!&R:C/S<-a;e4JS>MiqlTs"!&`d81EV_+,'DejXJG,*)2r)&WDPeh-lXbB9%tPB[5]&bZ:=I)eRq\j%?aS4rB,Mo8
+%WXs!R<KSEEPMT?UB703F+s5,kG;.Z6f<1N)jT\iB\cDUQ4jqZbp\l^uJqO3Hr7F_HQCU]Hq&S5>Z;:=u$n(h([eEq-PfB9!(Te':
+%oA1nWdY08 at nLMNDQ,!pRU>V!$7pL(rRJ^p#\m%fgDk`;<#`i3&S=OWP7$_&(NZ"gKO1o>NCN<KNDq]u=P76%o,#JnF/bYWpK1)Q@
+%]O9'iEGI0u+/Ste$gcj/7)XY^hY;k"12Qq*/_pp^+fX_b0Tt)3Qf7[%(qjtkhD.OV+/Mt!bR]s>inR`N3rtrAVVfB#CuF)M at Y3YI
+%^P1p_r at 7@DY=?V;"tD2d#o2KGGTo*aoMh2_D5Z^(;S1't1d&HoF^#5A?LK=s1mC,3Lj'Ko>Id%bKGNl%7aP9:D5:PI'OdJqGa1)m
+%qZKk'&5m?cG+FigDQc6\pm`.#?<UK7r6BrY6I&eeS'^G2l5WNp_Rr4hPc31:<cYKiH6%jEa34]'FfOP&B!>!AOD\bUVk+cml.T0c
+%QGn"i!Rml at JX:^B4X3oV)48_scu[h,>h^_X+d833O+?\PTbP>o^6=p@/i<u^0M4%gU7%/]O;_<+-*^q+)LigjWR_Ee,O7tW6N#S8
+%dILCN9'Y$[c`$TsIWmPPeS.*er4XUD9`i%,o\DG1nq?2P^k@)ob'tcdmnOXtm'*JdEu6BPoD&IFPF.J_Iap0^jY]+$B6)`!<1^5c
+%jK>$<A30K>5;bYDB;-08bH*pp'F-SSn6/[h;6:@,>Ij_DJBgt<TkDi*fe1i_JJa5.)nXOZ*;_d07qV[t9)(, at hnubt9?V5OWJ[]%
+%R at mH1G*Fd>W1>t1%okMW%+NMXE?:'N;M.1-oB)n%l7i(XmB<pj%TCa;XDA>k1'""uTN972M%l_$2l at TUGY+;6OTp,s0 at S3/p[^Y@
+%TV_No%-IHIA$BTPnq^1Aie9"lSoeSA0YK\mhH1ut%niWuStTHMp[5u_!<0V at jfs@BbpPZZSWq*s=GhBFB"t='SgrsbkF)?@3=,7L
+%6I,=S=CiZ2l5+JQhiF at lS7TB3Q4JTGn)-KZpk>kj7;SqVh)rE0WIku2K)79"k!t&LAm:Z-$7GU7EpH!'l>1Y7)\R&ZZb"0if[bY7
+%%so;"HCor4e4//Q`:;EmMmkO\#>/+?X[tl*3HDO*:,CApj6R$g-Xn^jhN(Lk(#TjDh.Y83e!Oue4R21=WHOAt3Bn%VKW<%od7Fep
+%/[^JgRk<VMk7WX[qDM(CUTXpQfBklsC,mt$Fg!"8g3't,D9c%hClG\6o:D:3rH6](c9hnLmp`2*G$`#2jB,"C+N!,u1h'\d-jY$e
+%"S3%ojMKj324,o!qe\jgk^o<tU;ao^/&sEi8\Vk9/'mu[C6FkoBQ[I0o94ue$Jh][*\P><Q1k8=1<5h$9V-*j@%!W'I:mQCC2up[
+%YUJG!9smui10>ZIPu%(\]sMGD&AQpJ#52TKQO\%B:PoO;8m4#uZVuH?)m>dPj=2fii0sm\dMW1'DJJ!h3u4)<H6d8:+AW@"^<(N2
+%;Q;$%"U at 2*k!\>6I:M!@m/aoB]7r&0[<LqOH&(_?PNDsgJnRr<(qE'5UofUWOEd6c&8Y(#j:.pDm$qa#*62hY?T#nX?^-Cf&tBF9
+%,n\O at PWZQW3/!-0)?%<8,.^2'_/[mQd_[llFWPEgps*F0",W2H$d5<s?>rUr6MWG]3:E%E;%V6gO:)Je9:Sc)ZNoVt+FWa&R4?\@
+%-d2_K'%>m5G)/ICpar*pO7M%IDlJKk%E#@PeiY+ahE1D]e'SYMq#Y_c2<[Fd?;+5kg<`\I$KmE09]8L)B_CG8#G<+Tas\A_d*\q:
+%.ihE7fuSLkZsV+?V]Qn_[nq2.AWrl.:`Th/s7'_u9/O;3 at O\aLdrrS9r?6X\"fCbP&rT'!40>09b2MV\SOX[B9U+U2l?s.LM;5%1
+%LLl!*#=6`!"<mfR-fOD&W37<-lJl.<</F/:JV]hj^#(7LrT*]T at jc5SA,5898nPUBq=jNP=k8r0O`(eSDUUhAR6_H;_5[IV:Bna\
+%9_kgSS'P^"Ut'.M>\lnkG'=#MSWs"\L,NXF`Kk>L*1/-V^YXc6-3B`+BKL)TZgtp"G?_.2?GAqLOKMo=*/^1bjIjRAeXeoe/_leF
+%N=HR@'R3H"_GN=)gR<N0X,%\agp3]=&sSM_qQ?2cM=um(^;8lqT]7./^43tGVeGI[;Sl"VO>m-$0?6;dh.07P4nCS`Mno'sr^T94
+%9hZ#W=S\(`?m'J+e;@%S1M(E1g,tZcgV6]TCER#oe;^bjEQUN;$plB"Y92lgF@`#'irUsC'BI$c$J\hnYW$iu*-,*:$(C6+M9!]M
+%'pP at M0\iW+,QYe>1Jl)gFNQ4.W]$<m<&%-.cL\CeI[g,'$C7FS1&.U"bT_hL]Rje%gOgsJOVl7,a%&UQb2kKW3ks\0oqc`_kW4LN
+%Y'N"IOGWO_P),=A94H6ai'9S:`D)URF7F*>s/]boCZO_,lfK7^M\KqZMP,:scqVET[r7rsdV\@=:F/HU4K^$)OT6Rk8T'hT'fgMj
+%mq9pg?g"4:`C<$f)9@)Z.0RMQb``1APK^C(NnH,Z/G&%'0BEcA-(h`mC'EXh8eEW;;Tim8Nt>->6FnZFRV"RYTL"UF@:(Vg7B?9e
+%p6OHQjiFoaRVjdSDEhcN-O2O*rV at 1?><"$mpip$!N[3Q%>R`capHp-4!+ at aSf'iRa<JcrYA9Wh-euJ%@f4TAm58,rXgD\M>BWnsO
+%qGI>,f9of_;fE_D*(do9PN5:U3lP<"g6u68l^(O*SPGSbjCBON2%)26_dk3AO_uCH^2o23^amNU*8n!X'g at M6%]O8Q[(Q2P!s[R?
+%45mr<>T,I#NO(b3;dGRX5\]m69RH-VNcIQO8i9+a,iu;-*a>h%@%/0i4?U;kMo<Zhn<jk_F%c+o5(1Hc_o<Gm7Y&uYqWamIV,;oV
+%Dq_0rOJ4RsM#tl36p^3JCd7m?#BnEnm-C/T1Thfl6/]Om]0H%%g$,m!;n;e].:etWH:71cJ<upp45NUf+5>NJdkE)_p!E=K6"_Q*
+%Zuas>h_f\G$pgPDUu/$NpX1`0!a8OOkK!_DL1\o(l1lmfjt9\`.et5J:5$N![p:AFT8aZ;`RJLu]2d8cCa2//0R[t,n5,%=QDCk`
+%dTFL1c1BVD3Wo'Xa^uoZgC&W&L+JSt8C#r)2c*n.N9<u!r'>u#Ep[m3FnuUW[X=Pacf:@Di0bbjJ`T.Bno<V*[NphZO1+,4r5#/h
+%D7hj6,VIFPnhDllYr7l<A^bHe&Q0GOj<4[]E9p=ZHh+TT%Kkc)*ig_Je,,`0SH=M(;X4#sZ#T8'oYi^8e#)pL5EW2ligo_Wm9/P5
+%^RAsFW&AVAo^[E-UMf]7S\Sb\di at B4q(=00THFu?nF\i$F6o6Q+Q>fg]W%Gs9?J&#`TRu:_Y69oeWW9C at Vai_C5/<JS8a8>BQ^Fo
+%DVA+Sk+>SuS2>Gm=KZd6pUg^lm_St)Z.qDp#k(iarFL:Q%+4XCR5/G15Ke/[=]RkZ_(X!]O<T6qcNS at FMVS'!q,he*aUphhQE:43
+%fOF(dinqL1RcobYI910a7&F:f>Ok at JA1YLFMml^G:>@>^DDf'gC-kH4:4=\5Dn\4GV2h(e$i>G"'iY^8lZ-L=]X^h[&;4%]'V.cP
+%,^5"qb?V>U^8f=6P0DQP=A(s3gp8TaS%:1U?I=qSOrX=5h]*bb9;i+u,;Gk?4Z"N%o'"Rm^i6up at nmt4b&Q9s64Qq&l6%-jBdJ&)
+%F#\G?%(li:=kdq3^QZqbS'!#2P]OM+W.3r-/SIi].o-OPm/IRJ1oJ?Fks>Y27jT#@+X';`5<"ZXs7=ofVZB)EOu:CTDU at uD2G`L]
+%O"E4\$>[=3Ss-N>nS'&F?.7qf(/cl?9jVUHT/*fui)pTS]e'ENhgF49)8#?_Tq, at T.2\5YWSBJ:(PsB5gW(51#$[.An0!>U8:?`/
+%REP85Z#j49-DD")-,kd1M8b$n2:23\5In)\3,"-q0]f"#RlE/tE^&<ar:5Nbr:sNcmDf+H\^l`CE at Xq0c=jmB[82s*b0s,PD+g/f
+%m6crs1H(g?Q$64e/r`KRAK8A:brQ0<*S_6&Yk18t%=6tP>++d)l,/t6"!S2IJdd#5\Dndhq=`L7^M1mY(BW[!pN,__>gbl*,&[df
+%0*Z92s5R91V$+dBN_knHV3\l]s1WHp&th<D]CYH,LNnEKE%NLsK("ogr1koXnto4(@hK16id#s'lQh59WM*gh at p&YrU2NuK0\*;H
+%HT!FPi#YcZ\[QX2%C&":F14D,2eGi,=f1k!?#n-ji5lo,eZ3s2G00O[>^p<75k_K at 8P*7jHgDc9q"p!n)4V=9bE3-J901tTnB&*s
+%Xp?\COUXT3LaZ+Q_'#Ahi15bg9BFVT/Sk'h*]-=s]Y'H`o?M?%bBKhW[Sr^Mfsm;p[>S&S5-%)8DI#>gRu:YGqWTToOj%T?N:pAC
+%i'M7DjCbFG;g^d>J4/0kFq^9Be:2R"$<@#Yn=&G5A$_*QcDi``ILg3XhHsb2TWpAtX!/2G85 at mM$bAHQi7(iV:(KN9Gac:.kdt6r
+%U$2`9GE]aGr*57c;/E\6PCW:bpiFUMS at RRNQEhh@%?F+A0CZ8Ga!Wf3+6$#J=E4o)+0[bAgkW&F,E:2Y=\P2=nN6f+o-CB=`7]8j
+%VHg#Z5]HRKOX)3r&-tqRO9/p at bZ#7e^'FAFc_''-lK=XZU8=B#>4><e3dp7ZUXs[,(>!W(5%a=0Gt$G[k.4D'>dZTDf>s4To>5.r
+%i^/ge(QbEPp?Xi:\6ZNpEBCD/205[mnXh+$?o7PjI55iEknX>UWQ$uSOqYedOmK=*D*s/67U[Ng8hso[CST>PSVKre&pG?30El1W
+%If%t at i0kbcYtSO$%q1>ea^qXl)1nd^6Q<tKbH9+:4j^d>ZD?hcR?!RlDjfRQqtF3/-dTQ?f*!#9iACT[Tb$[\?CD>(o#Ef4ql3oD
+%:**tA?-VaeM(_.K5ncmcEPcm at b*lIW6YG%fLluE)PA8B/g_/2m_5B\44Va.VM'k7(R/f$L<*)E363]8KT;J(U\&B.?=hA^8fD8E[
+%OMX:A%`EZOo%M2OM6WAc^JFV#emI3'WF"&2p7t''j-37sUR_2'Qtq!6-;Gk]Mh9-mTe30edos*VPF*GnS&d)gd[:Ik2#ZK=c at N6(
+%$Tjc4jCImKaC_(01Np>C2)b,$C.2n$f:*1FdIo6ZME;=q$>Fd/9C?/hXNU+8N#DB8)^MB**.uGZ>Z^:4mlC!]i18ZU@*bM.^p!gG
+%r4YlCOaips`nf/7Q;j4p&.+hZYCYcR4D\:`f8'tdfWu!1=me_D]@TMHJ5AnUSM8,-A2D5$_*:FK\+-S`,]R^5+\KJei_2f%a$G3=
+%Fk?:CMQ#/?r7-,(B[5[\HqR4C*cOkP&oR!C5RQepKJ75;33.n-1k.4^&+o\*r2_m=@]<+T/Zn7Y?g`\)ZYhTi+m"9L0GQ1]6Z at 1s
+%*4qQ3Q\NPTS!PpMd3jDZ_;M#YERR?PcjgEIe+PoS!CRQJGdP"ooslU-cAtaWX5?La!N:d]5&9?-;YX$PWA1<Vf4C*6:8sjaPFK+L
+%=]8a40'c7pXjWOs;Z]eF=cY"uP8G9=P_)!I6 at R7YJZ<Zl[NF=.^NhonInr\Z$1'$"'=Z5-ZEmp#VD1A0[Rbs[6dNU<:q]^kYS.h#
+%lGVdp&s[5hUcueOH,WJ0Ga:!."Ze/RrROp6mKil,B%X[FZ_;mMdY98JJb:=*)!Et#>4f47s!UD^J+g/=b)n.kU7?;XPRQpu.*'r8
+%jZ5R%PSd^?.VI(>)%(R\L\q(Zj]D#flg;TRE$:=hNjj3>ICf[D`459pG$"86LnTk&i!&R0e8=/uEf_FdRXWu.]d2-+C<BIZP&X-8
+%-.u9sd$r<-a*)3qD6fL?$'X^i9eRW.,8Z_.E9$5J7%5m#\3>>e$qG at B;?Q[FpK^Fl6W7<c5Z^]^i"kpUO&/^EWq)Dg&b\<VO9BLL
+%RiZeSN#lG#T$_UAX7csg[H%\O-hm_kh"FLr8g at AZEX%QuTNo/XIcU69Oo%pg,A=3-F/Y=fRX2"[$'F1Km at kk;amrI0=c&u'5Z4>h
+%-3d&Ar9Jc/-2*"e50#A3\'gWS_V$nT*n++<([&p5=X_lL"efhuFHb.%'%M.Y`mi,%0KGc<"S)d`0/dE[Y#/5H0TZ`jmZ]h9B=OVN
+%kd^_<6C(WP5WrFpRg#X&3;&C'ej,pi1T^A=bh0qW"X\:3<*W!of^;)D#ql$M,F;A>8/L1%:A3)5#P-\-1iu5d'-G-D:VKV,jjOrP
+%Jld9aD5E>eVU`5]ZG7T[Bpnugl497.U<L=R%3Rt&j7Sm?\`J]s.LFBGA3S<:>?`aH"$'GT]::):Qe5##J-S_4aqr-KMdmd\N?V6Z
+%oJi2fXtiXG.KHG+agL#Y]B1q6kE`BXK"Z(s]LN&-]'=Q9r?`"G0fJ5J8TnN(1Ferah#P>r4ZCg<qVP$*1N;L0/:l5fcM'YPl6h-V
+%R;:-0AF-GDfoaHaEWk3%=l(45\]6c1e0;m'B7`_%r_5<5K6eo8eQghEGT^?X0/e%ZeA3/3kK4.$U"%$i!)=S;1C47qci_=$";M.&
+%B73Tt>3$l*d*G/r.1pgHXd<oRCpiY9D1sZ%8X6m>K#V=gO%$%k'4$_-dBo&qK966;;CA\h0!pM<PCC[pnpPo2K0qQWs1jB3QuGhn
+%Qu4m/mmlPaKp7iN)2O9Ca;QM4MukOIQ>a!K at 6!-dYuu$NRm2JmZ=ju76g(7P8OYQMc]hj6ni1sgRd at 8l$Q%Q3,a..8fI/a5?\S.P
+%K);9LBdksdij<KnHK8M*1?D;aO7W0oDG>O>PKc,9H.$</*KernjUKad>8b%OGm*YH7DHB8gR0=OZJ(U=[fajlhu^Qn+`&,k!bQ65
+%+O2&bU$":;O3!O`JdQU,EbFr`3JN$u(7]B?/4A&\ni=/nrO-OgF$5ID(KpG`S=Z>S!tBQM,T';Bfp:D_9b:\&jS3c^liCWa*]/;a
+%(!Kabo)?"!4J"G:;I4`$^RC4bFgn`)+eG at _.`F9M-Th;(k42!EnNO+>k5([QQ'D&</PaRSY/"?V-^.=9](U90XiJ*f+[N80'-^df
+%djXF;QX*!!Z<odn:>ik5lHK(0?$E0-_gS7Ke8@#_B<FIldO10J$&EKla8Cd*`9M(m35e9E`m&pD$nBE'A:Q=*ACO(iOTsF?I.P!S
+%.lRbVqar[t`QeV,'S[[_b^<J/kI(MIjL$6D4T=eu4Y1B>7uB?e-bVOpQeU:09tB*DXWW6j2>pKmD^-%o9hdDtOqQ'72t.c6SZ5[O
+%+qqtkbIc6:]`W^iY)k:[bWOXd11O)!h2as)(Fq`sQR^)SYJX[`,@#Xhiij+mE6P0B\P%d:N6VJ7F09`.Q1T/bksgA9URu5G1k-Uj
+%qkD8[5>4V^'P"uQBCa9=fO.U(!mi;XmnB\E at D(eaTC%jJ[uRRPl:A.$!_99GWPJ9IMt8RYF+jE>nH<:uSe@^3Ff-sS7l at o8+QY0l
+%H;UmS5he"dk1m_X7XL#m"o7.Gk&?m^7`i0taUq%#7&Bf"LcFY65hnDWc+3^%F1JOZ5<Q@"`YQV8P^C?6EX3`*hE+`#ElE=H+I at 4[
+%En3/*r*f!BQ"47Eloh!n#s04Rhi-,=.WW;-A\qg at Tf\oZgX0s,GHdeNd((^jm+;!L#GS.0r*$!J7D^[HaS^UZ0^F&,g)lfrTH/?;
+%A>q6Z^%`+`-_&6bFgta,C2Pr17^:Hh#@k=BV*ME;P<>_GWR\Lq;#EB;,a/@<NIM6fZej94bXpIO8^_jrD"oV.K/d2.f'ZSsm5p4h
+%CJ$rS1b6t00C_&@o<o'=@IiO7p)&'t!`:PjGdSQ;DDtA*p&&Y8e!K<hrE;i?H_6pj8sQ<`>Ya9oR[lG-/gp?[d,_OB96ZD at fCMc5
+%DtRGUo'8<n8RppLIm*R$a"'%)0s'Q$ZBF"a#:0GRpoN5,q:Y=o.6$[R`m&1g.54q098TISnAB<B:5dL:Sr%BN3pE8*Al:QFK-^;-
+%m2EW+"#-E08!V4giq5&9(1`l!l4Z1`+)r[^()t4Pea'YH3NY2oTn>#eKLb:D;CEZV"8U%41p!FLlE$2aV4K9MZ\C)J5S.).<1aDd
+%4aH3Qce8,'j%^9&DM]j6A&^fDmjc=F[ODMBVEhCIFY6W"Zn/;rI_#+:'Bjm=`o'FUYiI"(e5%[4Z"VP&\):#UV6mf;^un8o-3dR*
+%[ecDc-cP6S'@O)!(XGU8^GmQ&'+g4aKc#p`_b%YfgHC;hQkS7F?m.[$g%D`@P:qlXg%W=ESDd;;l9V`hIDbh=O-B.MG21^V.ojCg
+%ldD\3D5sMEg3U%+57ZtN)]eaMYsrGma!>j9<'IQ4aG[#RBs]N"EbY`THD<k2m#ZD8F\H[ABQsm1S(s\8emN8)B5jQO)[KMo;[*X(
+%]p?;3mQas-/<l9.?Rjg0Ost,LEubFh/Z&0H9];J:/&"n/;G$.Ll]D00NMU6jgu/\P=c#,$UC+j_d[4]iUI/n9b3;3jU!hU#k"\LG
+%p!Tb`cli+F5:1QM/o,KDd?`*7aM"t!A0E]7m+s0qMqnFac(WYsajj,*8IB,>>nb`q8#(W/8darlIX/P0%WlSji)L at 28%rrf&olae
+%`[9=aYp[tY>Y7B_/!93l5%?1(\Xq-"dn6HtfFA&q9C.;g97kTI#jE>"aZOia>aq=<P-_jV2/NLpM-\6_f10]u+A?43"OJRC#:&u>
+%81a[G8%ta7p'0a;2n:X,n^&HX-KP8HObCY0;jcVIIRY8X*Y`X8P^0K[:\MW^q9`!aM8lDaUfrBACt.R=V*81Ab#!_^>:mr5RYpED
+%$t1A,LMotc3*=6N)uHjqQdA/TC_">J9<*\\IZS<M>K+"s2V+uk<U%?6#oMI.DHueY1lu(C76%?]Rl.K\Xo3R2f/p!lG`W<b;p;R@
+%%0E%/K`&l at RtE!d_=ALC-V-49fF6tHgQ]s[!PMY+#nB1KX,R.EXF7+=2:jNJ4!?\Ajo&e+m5r>OV6%eX%n<K(Q=!r:S*ju at h<[T8
+%Q?Sq&k*&eaUQC(2?n#FJlfc9r9$4InJ^f+]%\TAC"eRC[D0ZB[DAI"0&,r0KT-**/gGo7OR;M6Il?DH,f#@&N0P>.+>[Z+aFMGt'
+%)V.5HQ3e&Yk\30WVl9EhA@';'mN2b;W_o%nXm*fXOXbK[1i_?g?M-kaS#`N6B_bpm6-I*:,Y*4Y/H9/>YETVtfAATSAjp at -NRmTs
+%Q^[6N=^,(t=8,P=FQK,Lo[4cZj?:[%Ll(pH]=$b=R`h!dNo=C=&5:'_1AGCTLs"^#5s)k,+03l6J%7=TnP$`_U:)LNfW2`g4cCb-
+%VDBt<p9jWg]`C!8N`9=R`sTG#<02J^\u89kpX_Pk!q2VdkIg%fj;;-dZC/b.ac]Hh%=TAI"Lf&^\IF7dJNUl^h/?_YQs06e:2pUe
+%)]acK[N-#@eYHE!3!h;*^!ME,$RW?e^RYjhjI$M^2^>a.*gP6ek*dS_mD7Qt;-UcB[theJ!im<E/k%&RSr&P3Z'+Rr\:oQKLZ\Fo
+%7>Z2VP6$rZ2*iFV8'>A<p#aj+'l0`ip*N[VjM'i^EZ:QR5jse<mAueT,['2Bh0MSWh/tUlZ_7D!-Vmmf3T"\M*LZ-9=Y2q,=6jrU
+%Eu\QYH;?Jm58Q3(Gq=M#IsO^KmCSTLa]%f0-M8b-kdEV[jncI0r`O_BBfEcKe-_D8'O'PkO#g1X=%M%i"64TtoLb*35K5T%]C:L@
+%J0m&%F3&]Vp-MQ<ctG-S=#t''0lp4eOb2&p:E%li9\aJP1:!O-k0n&#`Kaqhd^5nc0(Q4^RH)3m:5,gb'Hj\qe00(23MEhe8pN`R
+%Jd:#XB:ZXfq>Fo]%Bk00)J"t)7IgiWc;RJeE,9[8og$"2SGecsdnCN.E$#))P>GE;eOc/T=9a7M\_*JTQaKUU4\gVe[3Y$")=*^e
+%>MF8.pCT">Cnf[J$]%TaYPoS at pVSGhaEs@bS*50](+#!'AG'mQmT)"95INThTZ/B5^Xl_CLY$LZ4;i87TbM.L+el6cp%,!']\L10
+%[s.0ss(NLLP\i2c(*"Y,/0F)BR)S6J;s-Tcl2FTMk3+ip,tR/o3co9,dcif0HEqFXRiID2g,X9*&qMs#a$GjtGOSf>Y_s+o*LRVL
+%p9ZAjql*6&qKknLZfZ+FlD#b*<dq_`5/A^r%0?UAKLtKfV=kR at Unp2Rp=9:S0#H%ka'*;Hf,GbsMJh;8T9JeB[`Q3W2T^fs-e.]\
+%%-<AT]K]=a(8*=9c at iYHp'\-K-Vcgbns at Red>?ZEpa>k%619QBc^O1V\D@\LRdE1J`0,YUW*Dub]<C*ImKR<op4o9(,,5=%0brm_
+%jmcQBfcuakZu1d]a8Y'[BQ0bZF!54a>N&0=,i-bElF%qT!$u8]=)[-g=D89Xd%?aELNUIcqFhsclp[kKE0YbAQWKL.]]?CGXH\KY
+%$T5>VXas5`N"]S3X`kJo'sY4/,]:9BOo\q(^1pg%[Pi?lE+s'1oacNk96Rr%O`DupcW)hS/U>k?(q'S6CZKuk4h?>e8kMee.5E5A
+%hn_CRK($Y$J;Tm at VH")^>ta0`=btU5Dje4IpL/quLj;#VG,k,SPEhJ+`PO5S+hUQ9eqR+bh"+aP)A%[4_">tdkQI$2d;OY`6X<$)
+%#%CX03%8%G4`"ZjpCS<=CcNqGj>[^6#rl2`Kod;Qpl5"SAXOg\L-6>4*9adB4\isOh=4egenBp&,*$`)<PBCR8K`FOPI/GU1$h%F
+%?1!o4p-&If9-!]`T(V_698n>e/iLC+damRL3A:<A48"7cd=c+4$F8\N2VYs^>J[1.VElc4U[ssRh9LaAk7L.oKsmpGI:X%_P=Yb2
+%/F]>a8IShT9&/f<PAZQB!e^)r[k=C!l;c+Bq,8Z!Pqf[aNr.'=g[;+)`ZB>ubVFOmEsT0W<B[52j#bk.gAEE7buf%)65r4JQ_\RM
+%rm]WuPQ-4oVa9B8Xls;;[[cspq$]C0T!"<76O$o4ht5WrRChNP8R6U]Zo`<WrO071T?G'n\+39eJtgMO5ArfM[$4p[.N`T@/6#5o
+%YfIHY<kAIe8J%OS-M25cf%ir;oY.1T5X$E2O;.Bs^&kEtX/=19c[\9N!)$SCMK$:Rh2n*7G)005.Sc'Y6-/G*nW<qH[dfs2<C\nU
+%^Rm;h,3<I["?n:ALkU\YdS-_<H[Z?Bh>l3 at otP@kDWC+Fp29bkg;kV(jlT6?pLWCR,<D-HQhm_ZpcGj'fQ%,RSdCjEE;FDX,8K+*
+%HleM_an+Luqb5C+$9'tDT(9*,3N-Qj_35W+DE/f/RrZqYN?*\sEluOi#O;3K\]D>Xo,dVT0Mhu8 at L"k)GA@$1E#ht3?eS'PIgR$]
+%ZT1eY7%_*h\Cu')563)90G#Kec;!5m]`IX<+f#]CcTBuGouf6`@R3aknkEM-Si<^?eAV`d#Hap=:\gk4+5o%nrIUdnl2,&n*dNK2
+%du@%aW6KbLFd[NV,uU($nRW/!bCRW+dM*/$qqtJ#???Q0HLn0d_c9?lmkI6ZR at BRD:n1e0k"40Qrq>IaaZa,`V^K:5jSSp&cmPa^
+%MJ1_#oW%J+^;n;I8`XF>E]hFbJM5RnVcV!;*V.kJ%2q+C?eq07FDh6Vb.Ba%j!0OV='-7k?dYafH92oFc)gtUH%B5aF7g/?oBXa8
+%207'RjF=lCRBalY\B`',I9a;83PCdk!sN0^7<VU-R]R&m at V]U\GYRuEPgcEB%5gA#6 at U+^0%'CIWm):<2g925S at go752RX;@YoD*
+%c$8<"dLT*dfZ at PROR:fD3"TSHkJ3F#X!.8d!bDJk#X5u*6/^+aiKI`RCUCJeW0k=GZ4f#9eA_#d3LH-K64$%$(5W:jpB7sq&B7Se
+%h48lcT#b7O-FD-(o&Q>M'5VV+Pd006H'V%lq.2"**ZN4Jl8D9;NL5!3e at Xg5s6`1l30.Z1Qt0]m^k<9=YF!X4YrPYI3m@\PEY<6?
+%>e.ak9n>a)F%giZ"H+C`MoHac at +M,T2$3'];jQ"D!15-X>#rkbb/GXTq)ri)`g<\]n^g*5b(O/DQAiB5gspK<*N,[YYdIUhUHkEl
+%(`\XDN- at i/3D$-1[i7N"/@I<a:H_Nkb?k&"]t*inipHS:ID(Bjc:h]la[*@N/%7(JM7H6aP-N.3$#J>hW='F at SkNpRIA:@=`n:tG
+%NCd6N&l?96JfJH-bn;h[niUR2I59DMHXj^)N=:$"*'$U>&^?]VO<;=YD2cJTN^hIY:!RV=41=_q,(P>n"V0\d"Wf&AVX2;*^,A=C
+%=)p#?D(=QdOd:N?_o)k_)#%].gJ]G:bJ:]7qV:G_>@#m?dWjN$'rio7 at kHgNZqh@1K-">DMZ^#!;4?31>u?&H53Aj$ms!lABLfI9
+%EtLA*,O[QG!#_@<%@bXsoTWeI6,7L_P6ec<HnM`+=&ZUTpP]fj\Wa]6IQAm=pd-6e'L599`ns'Tr1'X?W(Cu*`8"S\P8BWpHR/.E
+%lD8/i<R at pVWjI0MWQc;_O;h<*\Hin*s'\D`a#P9d3td]&,&\c]CFWYk$cuZ8:,&(+L;UeV\I_dM5']R`O)n`.YYKVn^Kn[goD/dS
+%WAeiZYLLE<dW5#bT]ZGh2^!>r_/m+3,/,F;2B2LGag'b_kJ6h>o<0&+V&5[cE;@?]3a$o"dS[a1B$V0ds$Msl>M0gJ at +FZfOM!@m
+%?1SukIL('h,L'1*QmKaG".5o0!K9.J[n%e*ZkI<I;cCB^YV)ApY7_CH>[O+O]Idsl9ab`lS at KuD":`g&$&5.D>i*tS(NC at OLGX]V
+%1XLCbN%7(AI=a&k]d-?rGsesEci/=!<(;s,o(N6E**0OmID/=Y,KGLr?X@<,**!Y@@M&<+Z0-=IN-T8s^LLhl"(#ZsCig3P`*FJP
+%NQX3]T-jFhUU-oN_)&L/m8'p=2lMY^9%0[dq,R`_/7+0W$NH!.GUF at V5>mn)#be;F=.?!-9&u;d,)C=$%5RH*<E".$9-<r7=(op@
+%n'/`U4i!M\*;-nuRNNpO at p+)'<<CNG0hb5#B6p,OD?l@)p<fYkoQS=D8Id.*dLr?Rck&ippi2l#b-qNfhD\)ZAY at h@X-^tX?dZPA
+%R!B1<3(N.!CuF*Wkg*]!9R2KJbhf]>8D%6lZcu at WFr7J_UM`X at ce51M\gY3.gcp'g3V)79EWu)JLXp+<6dXfP>(U6mD>I^_S91f\
+%*V<#"ZK at KMIAGG3+iqkSWOeo-l7Wg*N>GjZmn^e9mb4WUaL-;#@e<--I*5%F8)!Fhb%ss#!m<QW`9,J.mBP8gXf^Za3+OpgHD6RP
+%<)h*.a6C%ie)'"jhGFC>02/tt>I^AuF/bO8GLG>(o"bVijk)2/Z;XdL]Bk_6=C%HXc-dZ0<2YA at 41fC4>_Z)]#m&Gbo#Xhr<56QT
+%*T4]q&f&Ruq7$H)hePpTZNY-+q`WpDXC=#LK1Jca're^2P4>l9cREPV`d/YhY5AZHh%/Y#q5uR]dOmo8G3ZIK?'kDrP`S_"r0[\5
+%fjSSFcW%Pj*S=nMSDh=,Ush^W at njWc(iXbuMl'PRA#?edc%sRGUi3uiU`\d"&La+R\KjhscTLbW![DU[obu[9nS83kenI:;m.[*a
+%YN(C3aN08\pKhcIE[_`T;0P1d at k'?MSXu)<2'1=J*:8&N!,>Vu2'I;tXIW:o.Anm+057)Q at kQJdI&2\7fE)E:(o+AsgfMAWUJo^8
+%)GRbj$Vk7XlWFQ%9.Kb-S[hn:'4kO,-Ci9hN;U,W*t=_[_:4T#jWhFT'\//lL`S)`Ui)B<8SGcXlr]pl??K.pda-"Y6:S1Un*&;_
+%Tg[>A%K"0a5QX)9W+C2tbDr.N<:Z?O#B-7=T&+8qS/)W=e`9Gup0987ie._=]eLHI3glng29<,b"ls8!^a)r8^G[!'buDsp9H(Gj
+%DJXAql^G\4[)*nSQM7Jn\>BMaqZ=U`4lmT!Lr%j2`L!n0C9*1qZ4:ULPjb#NR`A'cq3P0%OuO1,Pp&.t(A](1[l3UZM5K)'/=+r1
+%>tC=KFuH<%,?"fuh;_+jU^/d*gdVokX^l5(HSa4YnCs*656R]#S]W8cV;X.mA]]<=XL7)_;0ieESVDE8Qc4^+B46m.b at c&nJsBba
+%]?L%K)c`nL5q6*!BZ_XX('/<nb7d%R3tE^Hc?M at fk5SZtmSZrEdJY*>aL9;+d8C4r2gbZ6EjO%V5`1P#pSTY/b at U(bM9nt&keW@`
+%1\KHSMV1>^ptK]tSA4=cTZlO>9TARX,gc#8RAXe6a]D#L*k]b<_o.V=iY6/>'L$9>",D>&HE*ae:]^tu)],TUMt.u3A[PfI(YLg(
+%`,k^./GJ8cQ$iP0[!\cbP[@JW?I[NMiI@&SG]5rT;BUIj)ekaWQ"+XE$m2`!07r;K&uJ$q:P8\MI6*t]`g\4_Pe(9*Z^51JD&t\,
+%?=d4!032rIK at d3!-XWFlFQ->9*5XHAm>\7!3_b&[M0U;0!m7tWCeV498T5n?e6\*r&01?*4FYdq3lcG'KL"Z4//Z`Vd<t&:]O2H4
+%K]_)iMh76jpE*"14sE"T!<&+./cq.kr38D_:j at Et3bq;qVV4!Y:OEkur^Krq<ih`.&mcl-*UrgUm4S7'RoSSD*1P<X32eoE_Pu_C
+%+u<A,gR@[!H'Os+_TMj^&ss\G*4clUIaNB8.+ADjn8(Z#:(04/8Qma6ED-(!'MkT7h9e=ZD:u:(Xf'mrF2)]'=Kb8b5Q-SEPG"H^
+%A4aDjg;Kts7(n9d!om75)8'Fn3cDKE at k2Z(mSp_Io39Bl/:_eGK<(/Ge/&87*%m/XUG3;(Ps'65;k1Mpg`b1`[K;_)HNp)SF.D:c
+%K>V8u!1^jL at QR@es86)Yq,sG4:GcG5V"t4(%UGCp at b[uAEN#$4o>Rmk\1V/E='X288j+E@[bo98qWa#V=[?4"BCD(3b;(KB5VW0,
+%nc((aZk"JiaelmR[O%*5,eC(=1-iq:[:hsUkLPmSfGZm(g2ZlLCo-\1I5g6=<a*pp$JrFZKITrTA-uetH)t4ukK&Eb__HssVVKSY
+%06q5CZ,,"J-Ii=(pN9Zb-%OGi3QnZ&0?Pjc.U#*0;LM,>pVG'Y$lAMfjbFq^:2dalkEOYTK>12NBXGu]4Kfsfm3;jICQ-2SbZJ)?
+%-+E;hM=FEA,tXB"6iE8!2K2pfjukZ>`gm at 8&M!'6mWRU5*uVP<Kt/(KJo?[p,OocV_Q3N- at XA.Wrna=r@"#jHPMM4_Df=X[_J/:\
+%rgZl;lkF:]6,Co,TO-F7o*&3 at X/>F'7f>DujCm,I5f1YZ:_9fCr"qF/>IGf#.;keA-(\!(g/#]b4ZTN5IJLRKNI0)oCk)/:@6cVg
+%T!H1V?M$\(n?b']Xgf#>?\>-$ndRaYG7)?S&':s6^^]&58UT*8g*\[=F;n/t&Y>m#J#pj:''3JVKA^g9nUY3;)MUY2?so+VSVIn%
+%NUOOA>>sn#g[i%SPt<]E7:ea<Vof]mbCTD(].Lp0D>p8BfMW`1OL(9bI[FcdUfg2=5B<Q-I8*OE>tQY at P*&3kJHj0dZ<of0W?rHu
+%TD*>o^JJ4D1IL](RgpW_kCSG.ieb#5Wh_,,=",mu/=f:EI?=>'3tnc;0cFeM$6 at EabES9A(jgj1j;0)G0=g"G^>+<FK&anR]\C7t
+%G"sV(<0Bnmq.$,=@1e_Qo8T]ebj%lUau&p3J_0?qh&(EZ_'b('<s$E7eE,^Y>\a7;MB0sD2u-iU#RqQl]fp`;_QdHcpn6h\RG4B(
+%9BI*k\oLO4N:1;A;Nm=s#:B[p9-D[h5oM,YDsN@@+V2nlbP^i=O_?$*fXu#GJPPJJq5FKPgO0%sfUjnpnajI:L6#:1kZBO8G/l&Q
+%@q!dXJEG at bOcGf^DE^?!W1A[&Y"V%T3nr%@bFe^J_c6*EE(kC:jm.hP'3tBa#I6O-19p8`-f+LZS(k+upc<VK#.A-W0qk5B"L=?I
+%/LZDdNQ7Et97)tmhjqDA=D:]V]q.5]:RWj,F&E0JjRA?B!]tIGF.jVDOh:.#j-PNcc$agb^'S;K(U":C=ZO*$pL9NhEDE8k[4eWG
+%!k@[[k)+HGE9'7Er#;hUegY^j8jXb1*(Z3Q]PK$@=AQ)iBqJC&A(A5Z8?%uE>$P:K/J75ph3[_88VG72;dS?A/;#/B72G`3)jNL]
+%s.(\p4qM_=[;siG*p1S3T%>)YQ6/I-R)EK at qeTWr,?N.8GM01WW&[2DGk=DYB%)@jP!,Z^DD>stg1I';"l108kot#cXt+VZXNpDd
+%2H?I`P:gl>BG/sCUNX,;AG&9RCe)Of!TUD(p2sDggthVYpLKoo=[S"@^RPreqibq`"1_.*T6jK=R-uD5g'\D!8O8A9:+/8=,aZ,o
+%;d>iFcNBQARWTQ$EdaSPDH5lRnuRlFqmOZdS,FmDWe7T2lEG^Kma?sjNR1<(iStVu:=gr>c at jhLe`WfC9'+B"9Isc]Hf&TdS@[(?
+%*ZggTpn4%jnmH=!FcS)mDDGL,*3$,(2?GBFq2<#`l1HmE.].0S27>X=`94ZcHIE9q75K`cXKuts*#.L\5V81cKWom-2R+X^k_p[%
+%-;rr-Y*W\Nn*=%qQ1k:id_;k_GW)1%ALdOMB@*=8\!V1qUo]Q.=eY"d;/a$De at X$S^O4R$6hE"<#,f`n7_s0'CsDj0GF]/4LPB$#
+%(R1ls*%;TQV4. at jkN,0YV\8I<^:/l`S3>EM'U6%q at Fs7=A`HBb\M)V.G9-hg%dlMjEa1F'8('fBI9n$fb1'8A+p[/oqdqkXgCeJ)
+%*1kV'K6\jo9M>!?8$QnHBXki?04$\Z8:Rtt_ciio;N\p^KULd3r6RKB9tk9jffeF:[tY(pMu]sBQq^k<_pjmXB^9tL#oGr_=)Qu"
+%9;2*ifmMTa>tk).4E:MpVf&3So1[*ak+tKe<3/[KKCuDQs#I$.;S[ieBH5#F-G_b+/`H3((5j1JW0)Cu_XbS`-6_g%LY8WHlRa\A
+%c-YOP6s#C'2fYrqUe7_tHuHO'Oj`0?1o at 1Cft<'_Us06OWRM?S2(+#=m9*\n,]aD.AW7<"M8;C)XqI'B"1cHX8.&0FjEi0kpZ.!k
+%F at FVDH^UXs44>B1B=?,X:>5XGV$?JZ,2`r=$q4L]U+2IERV1P&FA at V6OroN$eRP?@p'#)2[RdZe'U(!jpa%)L.spb at kgAsi;j!rq
+%Yrc#c&N<mhpW_bA#Vg;mhWtQsLAdY3dmj9l9CtJ*mH0nJPdlnI2tbhD68b/G.s\4?MTAa_-&?Gr1d&j*:VQGj::^#C-=LCZIHDR5
+%%LA at E=6Hl$<1U)=W`:njSQ"cVaQ^J:L5iQD<SNoLhSDG<a5l41*%+X*(gr_`3.Ld=2Y&3"%"ETD,4 at UO,dLs%aMTLdAH&r3[HbK%
+%0Lu2e\YK#Vm0pZdjqFi!.HetG4[m5WhniT.fuOWZgHt1inq:igSO'i!XEH4FCK&qG[Ff$&Zf0S>ADc<[cE7n%,/u9];p2.FgUX2H
+%a(QL2Td=FDo1e>b.QJ+"T`0<9?=o$IhK,0LRLTu#!itCO_)-&MR3UV=&Hjq7ROLL=mdt,_0;u,ibg(moGJ&FDc[5ht#()q<?::co
+%h6<&4i!E3PDm#/P\N7Q'PMJ-\]kLhd"V/.["?05o#[ghVg?Y!CHsf!-Emm_=B[tIIp7V"ehOotB+2PO\lK8]sg8cQ,fsg>_ZJL<t
+%b:iReY,Y'p.CYJ=Q^b$G*Yb!Y=70iD"8$:L_lKieOiYB9/p5Lr^$1Go8e0?3W;%^>=HHjF?;(4Fg!&Pi9`(\63M%;aKDp<:)Wg6i
+%H"=;L[`;Im""3kcY\nK"lscgp>n8aNSHm7N;P=,TB.71+,*dhE7#1\Zf(R.jJ=gBgKDDKiRQAp5qjbE$QI32<N;tfhKKF,?+C+1n
+%/a!IldY\GFn`:$uVq06K-D3Al,p.#-5*t<8`^0%KP^E*Um%\I=CbNF\Y5*ma4K"1Rqjh?kN-GtHK'76PNYhBg81_l<S2)FpSCFHQ
+%_Nu\LE.H\`Hs^.E6&#\7M]Yk@"F=2;9VKp6k69q0TMJ^ujn\!4mbC\AbB%&"L6si<[FkIPCk!(r%Lm%P$J,OgSRG\G'a4uFga%t7
+%;r'S*o/%QCAcb&.VfW9]:Rt#4XK68d^c#Yd\2I$[=5M]PoehpWPMl3+I#<k7M<6c%I3d&(9EkDb5J5`l-RSTX[f:dX%AQgIh)=R"
+%Go?f`McF)2MC!L[qs/Ye`*6j%P//8R_p2d=<1Ad7f]Iq$I`bI0Ki3is>[UGr$X9JBo1slqVZr`T7_^s-,hd=8T#3m5Wii[)Y7H4*
+%;D42-_<==SV,s6ePZW:[%8,oWnqp!Eq>.);fp/`T@"Q_u0mf-!(oG,/Qd&ojD_261%h<sGIm/*"]Oq/aQ[2t,o2mnmO-5]p9XQRn
+%%*$B5<gp4uXG>d"g/\p\]FkENDdKO*P/$R_OMKrG2VsiCo0GR"8!HcmoSr<e?;i=".pfcPoKWGX6FlYIF5n,Fm\['7\LB/F:S4j>
+%kH19H=qacF%VJ)_q%sr'%t3oQk:iapaBPH*g#iQe9!R=%f?__o2:guG$q,b`J8>2sEq2 at l@(CE/;_'4>YRF'bRM/*8l-f;5kREVF
+%\B5tAH!R"PT+?5S7f6in2'(84N;5[7P__lH[flg+KK;_<nDN0m_2FRr,$de5hkLgQ6E\+OX-;\aW0QTP1Cn2$O-u(tc&Lr48HR=O
+%^i<-_1cf$NYeIDheNch$g9/HZBVU,DfrB%i-cq5ZQ`LphXKdN2p?m!9n)3";aR[SM\kT"8]Q(9Gj0N5:^)C5tml`hNlcso.JL`&<
+%DbnT at lSo'@Z4e)!a%C4BY_o;s8;M/]XNF#k at 1[eI@!/n-Pi28RcJ.@?S##U;/8nE<,j+31[!JW`X,kLANYH-#D%4'J82lZncE%,=
+%FN1IiejQ@[oo1)AYhM%3V,g6rag/f at nP4&UF)R^mVB5%hQbc-3*J'DJh*;,f`bqh at Be&i^>Ek+8/qW4fEd"TpHhLfa`L!dUK&cK*
+%^5qD*dR`r.#qA<Mg_9n?P]<WpX;22 at 5&Z_lh2d%%B'qKs%NbOMr8IXa\Rr7U`(&#j,1io,.3J5:DC4?FOU/4$`Fr-*Eb\5;gkK)[
+%,k.8?I?3Ff%'`>al)0!SRcN%2MTWZroO'S/+';:Z_9R3KS_93ej]jFL=,n,'F;s!>b at fkZP/8\/kcJsi8>EE_=Rl=SFDJt\#u9G<
+%==:5@`da(1=lpuOI0eh]6'Qu^D'_!g5T-$eSEDj/FK[8&5(BV6$K^ZPO0Xk]0'mFQ'aE/`qh,r)^.b-M:1u:g/&+6/Ofo0"]UTSK
+%a>7bQVfUY^@XD]/3AjJAEp.9MgHqX(<bKj"Q!*l6]JQ)Kof5eNj=c<2WK4Q<@bOdrP7;mo%BS%h;e+)FT7o52os'^2)Y-pO[VXE"
+%S3fK<eA$[pVp7=,O!F\b,H#YN)LpXD6Qco-e34[bnftS'Z,?qf,`c[qcC4?c%QuD4E3N2mfL+\9;)1[BAUDD-?^oJ$A]h,nL$EQu
+%G"s]>Egs'6&'N`0N3>MpkaoO'('F]1L!M+i%dMul<1G?r7EdE'dUi$Z:*F366_D'+!8WlEq?om,qDBYLAn6=;DQ5p->9S!Mdu%b&
+%+$0K3m0G4cBBlfRD]8't. at Tn*d6Ne<Z3XI>]=.*7PAZ6G_UD70ZZ&i_H1OrI at +MtbPiFdTjeeuA_/jM;Q-M\W-u:elNqXF?=3GHk
+%1$t<(>uiMJ2n=E14?RiUqo/r1-a.4k\"U-c.EQup+WIc\*.p#K^>A7"l0UtF^0Sokiqa93[B-A!.VIu7-'0HGk:a&g,K61Op!Q:_
+%=\4""%pFKW63V+m!dS&$O>m7gn8kqKOeZk7!p!^_\TE[TCmWk=FqC^=3rplE0ej@[AE9fQU:cf)09`eZ_4Uh%hVW(okqcGbYFr.&
+%V[YYc)8#d2`\PtKK%k+/'AOaFRTrdmXp5Z&B19Ng8j!/Y5+ at gIaiF<9*!*.CrOlST/LURq2Oi;[B"L'KR\rL;$N4$n/r\e#cb"!l
+%/NR6k![G[aQ#B_i2u0[Yek>58(3/^=q[f\e(VmSWEUkegk`$icOFEtm6<]8]c=@aihScG)+nE=q_<IW6[Mpf'c[>DU#>u0YQ`A:C
+%`MqLT>LQO6Y?(!O6 at 9)FlrWf=K4VG>P9bu:*_LDKEEC&dbagk`brc0gG9C at 5VL`mqF'J5]!n*D+ at HnU.c_`:,-"Rj56DA)B<lc8<
+%Q072bT%=ZIQhpEKrn=5AY.%jV1^>X(0I9Qr=A,4%fAoX5]MitQA+*]M/N\tKc0lUMs0)a4!#lc3H!.WK2db8U&"n[)Ek;PfKLW,g
+%>Z=!g'jXg=;cDV(TBF=E:=UeVp at RJ$?n at MC3bMgNaqYfa7V'I7Y3CZ]g>0M[`Elsd_SsHo)g;Fm=B#NdGR38:LbaX+3#,/&47f,o
+%K.\N?QIYV>!#7VWF2hJY3MM;I#R>N<mU[E]M&'"4eKSHW,\M7X3uD&%JN?f8q/5\IEE6ufUCh_;2XkBW_SbM8T=rqL^f/f!fbh$*
+%gSsaS;4,tb,nc((+j!oSe%;GI?;RFE]Tt\&9lgc$G-[_pdd2GV>T*T1C17o'g$n0=OouJgh/1772s2mU[]0]"H/=$e!bbTe"EVQH
+%'MRJE[XW4=W"_\J^g`!4<&E at hOfIrhq)_C'-&%U4=I)>Ra]?-2/BpfW*NMRl$+r!,+*]"J=V'($8LOn-Ua&7GkNE1UF!_h>@_\!V
+%./;YhY.1J5aahJR at gA(OqGVZu#`[.3TB")E$aP$*Fl#$i-)j+3H3l$XN#GGhQlT1<ED-^)Lt3FEV":Cn95[["90KhVqD&P\G$H8c
+%?iZ):XDS#62AQ&?Q['ue<JoVu?:]hr+4^tAA<i)1AO.^eWanK;@e]0CD(O?)WA&VXh?ld[4R(PLeADAR>D7)=qBA-EG&OI*kbo>a
+%o<$[.hWuap%FEK\Y%hCp`cq=@4;XV$r;[%mk*g_3<Z at -sE3k$lTkoFhcYZ:FY.`"O,h0[j't<<X786\7]$pMOmZro"PXL8Ym$0Z^
+%D".Ot$e[jCM]8/)X(6"2dp8T4]('fH>H_%ZK?Q-CU,D:V%+X4HLBb[+d#,_j-3>ZY!ufh#%ZQXC>8H_f7Wb.dS_6XK9>[H.C3:;b
+%Y#5o*5,D+e1#HQf.3q*pmZ,kK/1lB)=- at i%9XrN*G:JVPB\m9f3Gke&O?jVZ"a;i]RYSAM/L02V!l,'/K6]2mPN9V;%&/Z^Es.G]
+%"?$<ejjTH;mSm.4W<^2jrNEdEkq3b3=YLAY"T at C=<?]@u.8SYVO'?0?gniV)9]d=@kjhGXr15^$0B;"26/fsRRa\!p?a6ZDW<BCu
+%UIob!A!5/b8m$$k&MUJ23HM4&9D_ZQ-%T#=.gJi(6s&P[1C9aRBjKg7aVc`Q_QJ?O?PCr2EH5WW]oVZcf)7=]<'YIoO);&kAB\ID
+%cU/YERL!ORVdNe!"EoZ3#Paj"FuKV*Asu*.6W:G1BmEUR@(ol,l4e0BYmRA'%8R'*9n[=8egIXbn]]8l^shNSH<O9f?Y-2<:?L%Y
+%ii3_nR10.P_d^3p/o:9bhQ%l/PE/61AbeL8@<_W`eRUNH1a+DUkqQ0I!Na*<=5[6bhFRc#q=[:p1RiG=#n^9YaabWE/;Bc+kM=R+
+%?:naEG[J!K!6B?;.N/:n\osKhE8DmCAG=`-FQp<g)c^Iq-i[5!oXN+n>E]3u"=,ab<78TqCZId0RbXC6""`/7lZ(VmX.CX,UtGE*
+%kAUg^#E/(ZhVNErA?0?uJqsR0bGgX,e!`lD(hh$saN;6&b!F#p-'&s-`$W^7J$Be=2YYUs3;CJ9e90%LHn4_K)QAVD/:4em-od];
+%@<*\e57*!Vnjqg%<+1lQ at kTcFX9T$&SCL1PF,O91^,W+uFP5%ep\LnUc"9I;k$^srk$t:Qarc2pEB=J.SsNj:Af.F9e#>tW6)(/!
+%]:-G=_0!*_$;OouOP`1$`X,kl#=_2Ih8.Z>I*0n]-Ba^Jd\O/7F1PI28<jDdTB at A?is8.Z%0;[.(Jc8idb\eu`1%;Kp;upnTXf at c
+%-h5.8a0qGAhk[fF#b?bpq#FJ;"S:%M=A-g1jdF_(NB:\?E<[l62jtKU-(U,2V&Y at jg?H4?+d^_IpMR;>1W0t<\)lV7/C_d6chd&*
+%E?_IL;PkW?NX[5c'm(plibiKtAeLQ3r.O/\6P$ii;i[o(iW`:_B9gAk at QjKTk3iV9k;gA2@)\5!R)DSDkJ.c.8e#k-i\u$sN.MTc
+%&.WYN4Q"s$GPmrVBuo]+9X0He8O4&Vh?Vt4_b<I`EKiS:KKgub!aafVB#2$3WDjgUa'j>a'nE6ROa$<3+5%6)SL?K\G9cb6<oA49
+%,7-BrXD2l3*p>BGeV6mJJ(3d.s25tY4\=gG^T&J!(NDAZ0UOF>X&Msn1eO=KF)cHNXQ6=S>_JB3^#?k8i_9p2lVP at 7EJ\/jW%'nq
+%_?C1!Z`=oLL<IAYe8c>'WdW#3=L.4ceKMp2WVTW#P3T!F.`h/=0\`UXLkIS]=NE7CD4Eqq;fH+lB3FVDbt8/lW at L-GqPo<@dRJd=
+%7qC?,WrN^#P3QU'qIHO*rG`lgYT7KjlCNAPqn[?o!#Do1 at X$t./,-"mBtYt^i4)cI:<38ZA(.Z,6#*ZU0QtdAE9kec at Wt`9j$&Ct
+%1f6le?1]`9T(73-DsbYY?OnC;m6"P9J1>GrD<F_55+7"/AFDVBZ'<-pHli(p2 at rTu%ZB]?^.ZMD%b=V.!C6g_D39!RJWsp_B.PsZ
+%F^fj=X;4B@#_"CB=_8*g#]SgHOo5`I]3kr.*ehh_j_cF7b2.5=_pkM-l`)aXp)Pg[btH=I;8)7j!)0QkR$+]eXJpea0FDu_J;6hP
+%liB1b-=)H#,Xb90i`P+DbQ;7K-)p1"?VkG;r6*ql6\<-(V_*fPjnqqF_?!>QH?e;P_&"&lFm';ZE=FmZAt/C$7tMtFnd*@Q.m]qY
+%X$![%/L/qsSo[alJ_]p=o$hQso;4W3:30 at G%6Oa&PiAJQEN?J4%@i.Fb.Fs*epe`UIBtrU+Dp`&UJinU&DB"R:!$E7A%`]-pRpq6
+%G9q2RTka9rYk7!u&[-,>O1g*MRLRFPb(I6K[`O,VM#u2Pfb?A]lN.`jPEt!<@;2!.4(W#3_iNR/;H8sAnnVJI)JPqj at LeHP70T$J
+%/RL-=m$e'2G14\e8p4 at b.7EZ:C6j"AY?6pDYW#_[E=!B[>Ef`2#kf;k8t;Y4`\-Uo:tgj]PBX$Q1$kDeV?rAT&#n*)jFds[-s:n[
+%(Nt""4orUefI#9G,rLU- at f\,$!H2MrkYk*Xac_217Hn#s$?Hc=DqYNOX*b3'ERmM^P9klG4(-OTlr=Z*LJ#/U)o30km%gem2%Dbo
+%E+hqn9Zc'.3 at X_Va%:]&3MpS)`]Al78WT,o2nj:*7,G^+QH!74Z.Lrm\Q:E(.WeXJ4_/)Ak9(aspNEsk[K.j@'u/H:KU<38=f2-c
+%Np::1c:ONL^Q'M3A[@(Q8l^u&?-dp_<83XSd60,&gpdsDZZ?>+XFiVmVsMVLZ7TR^pIUffeM`!Ir2u?/gRW_+dSXQ`kBRDP83V7V
+%<gmS3ih;ShG/`Fp9mf]=5"M'Ee*NEt_23#-qK+,N%c#rXd/kbsDWAt<O;1GDj'?(B>?^Q:A;57amEVd%Z254P[MEIgQ+T'C5Zm$/
+%m/+3C@=5;CSBf'1SHY5c7ZsDMp<9,f<!bfkWS/>]Oe\>`:RM-ONXR%aZXD0',nD'oH4(69 at 2U]%.5?`ZeEeemcpftsEJ3DgLm/ct
+%$u:M(+A]Y7SO9Nb*KJ*[BO*r5+56=sfub:.UuUH0_3[2U]58!.-'b$4\g3V32m3FUaTVlt,3)3W at OF&q9%kL7Y="l/QR'Tr"0%""
+%=Z%_!9U"Y9.Q*fbJDF3njk2W3C=ogI%.^HYRTL+BJ@&3k)W#kr-&RiIF.M>9G1#SqGI&)dT3Wi[=p"br[^=#.!UZ=_OG]51S(.CW
+%^7EbHXftGmk19E?s"^cAPoNj8e7-H&`kk4T4SUqWRbGJ7S)FYPnhiBN at O#tq-*880s!k6ZRmWg#GZ#lZZYHO='KN<d=<ZoK38@>S
+%-!lIVghn*#FX:TEh^d-K09^Z-.j3KBQHMfXqimVtC0fh+q]^bGYrZ*CV$Roj;V<&[j'3dtC3</(G&3 at NSmjWEp/DrCZr\Q&liCl^
+%2ig_TQ`Olj&L7 at S$CXlV3MsT%QBiIs&PM^XMQ"ocYolEl>92kep9lt'#6;\f32]*Q*[N;qO_c,s!EZlJ5RY6ZhB_o'/6``=-%GD`
+%?QL'kg[cU>qOD.*<]^SQ\!a^H]=)%h)d&9g`,`.7)fS=7hFTAK"UB0NQ(<Q at M"-iieO!#s]c25OP"2%J;CX4BJ_M`@.r]Bbk4dI#
+%08nF[3g&%4g#]GWJ\a+>np1*GcWF)#E95c\WSl7f?r*/4TIhT)#E[K[lp&Q4Ek9=meB@,Z)),85mrWYuc2$cJZg0m*rLAc3$epAn
+%^H$#\AR>XKXZ!XglW]tC#A;lD6Yo0s!h:dY@[1*5\Pkh,nB7Oc&77D5U67nM2#<#f/)cUQEg1a;Ougij(G"UCN0Zt7LMlI,<**Z4
+%pXn(Rl+]fQEbh]3b+geOd+`A]oO*ICX!A at U,BFt9-g&^VC/7o"036D)kPXF(#KIY7)IUksW0Zq`Xf@%'>t at Ms.F)I5m0Eep[7DHJ
+%K+jRAJBsGA8H\+Z,*4!.;c"i=i#+j]\ckJ[WsjY$&ofe74jR,*H.WKg5T5[P"im<";)'/M2IsqOR^*i/C(N8AS?bSn3HmGJG.l#l
+%Y$8KmX,FZb.P3.AA\Y6P7ICWGa\(.E;K4O]?jkVOC_'lN<C6cOA%i8aZ\BnTV_%9$M9Sat0Sd\l*o.$bhPBSmethr;/fa)9lT=eh
+%G.E51#TSm)Z3JA!\\9a&X99q)K-m"XBDpZ>)T&#?/[Is^H:[AS;cEe?nH65WNdogU7dH;#MfL&eAq->9B5(8Q<AFuSS5Y/QLq'#!
+%o2(sOr0ADp?Ok%fVm`G4R.V]`0o<4&lLoB'd0rVM1J`@@8LjdoQORTjNC;>)bN;q+[Q%eJUiX]L_KcYL?M^Htga>6*0M(%)[/gu]
+%%.XNm6?Y at Aeq]Wh@/Nr$fpQ([$1jB%,:W[Bm7jo8l<ZYKAS#9/Jsm;W(CnKCG*B/f3U9tRW]A]RebYSGn!"JQF-'MI7Y^3M5-^N@
+%)D]W?q+]#5gIPM%af$05`Q[MAh!o&;QDpUmm5M!b4V7l]FN<$W#P%W4_]bDU.KtLC.k6,&pc'e3G.)%kM2k.nmJQ9LYHsK-B.P]`
+%WC()A&*pPC^Nf>+&uI04KEPD.,`_%t&,PP<ZUG^V,.a4QlmP<$#mo2c,Qa^APP/M-47f,G\NGA]Z8Po9a[ftO`5%k4TmSZ;6/A3O
+%8J&<X\W'c58!^YU[3:X]\-8p+k1Jt7.U/boGtXrk7(KO(.h_%,3]1_:,ouR&ZD2Z1gE9^#@UQHA at G<N+Pjdro<BI-Ji`W2?OcS;n
+%,>p_07?o2<^qNBhi1,;(a)Ea7<dZ8*N$q2n[jXq$6aZ%*U^q+D?.(eqEX*X1NKorF;)!STPsEo1XjsjhcOL=cnaK4^Y9%LA5%\@U
+%l.:MmW]/n*@r"3hH)u54P\b^5V(lrh?&jre%04a`e$i%t]*'<X\4ipA-F$:*p<_A&e-TSg>)KGoP7.(t8tLrf!dou1YYQfO<$]/6
+%qE<55 at T9ej\]g>?G47eqe^\PknfW;9'mTr/A-l51EqKfcUN&%;B^S#TZoOr:#%<./5i(S,=GC<=ZUMb'[5eiH*K*P[(3Yl>`R at 4?
+%_,.Amgt)1N.AA7EVrQr49-07k/p:Jf=)@Th<!f8>k#>JD4](k9DFhJR'jYQPc at sda0gZA!a9f^Pr/e&YWYDr04AJQ3TrmBp$?h8:
+%PG9eZb7Hgm#.UT!d*L+9>8UD-<&_X?%R3$8^f`%5!OaH?%XEZ#.J%YKFNk9#B*XSW2sD;U"co//;2=/QUlF#u]XFKf%!!NS-5IXF
+%5/(i-6-[9_#NL6o!OOA>@%q=mKh1UlP+L-j0pB8QqP>(%h("RmWr^EXS[5X4*(NR3S67=($HKLCQoG2S"],OTR at YRB$-nN%):6pM
+%36pT$MJZ`g:.Aq6Y?Ds(-%:Nj$FpUSDW at nBW>0-f.V'sD)kZ1Q:0&2opZj_[YrsJ9"L-&MAi87ADDGNjo$6A8f-W^B?:8'W/DKE#
+%`uN1q`[YitYciNtXliiu5Aec.Eeai\=4r_&Kg$&q,A[UXhN;WB-CSOcYgX]Io,^@#VXiAKS#%&r7t3N(Yt4@\4XgENSj<hJc()mA
+%o;M:&CO'*8BM.88GaSX]As)J$gsri=h4%rZ\?mdi/N9/aH;HKCSq5uOY.RRB:o9&BF_7,6<5Fa;1)G)RCmnY+4k^XSG6hfqCr?^Y
+%+.f1I*oQ#8V,DVZ.hl]8aDVI at R"rbG.rL?m=e&gQbVYAt;7g_PgBg+1oAc]ZDqB`'klY#T7-5)Va4*VAD]U!3[hF5(*(0:(b[!F%
+%R?lid[FS!C")Ot%(D'a_.4pm7,=%HKXd7:X.YIt%PMF4Pbd"U$R,VMPluJFZeN=a_FUu828 at 2U'`:o%uiLBB0M\Ib9F5-Xp1G"<6
+%("*,)BA4'L&dDr=>-Z:0K4T2FG]rqS::8c/+70EM(,ZoMT0pK>dN%"$S7;%;cE]=9M#Wf_GB:u)i at g@@Ym'REZbSr2AoM7#TH^Dt
+%lC;Rr*@9>=&B503Q>1bjTO(>RSe-G)3gKnfk'[`i:2M<jgqtoLo<4.TiNcT:c!d/YC;uCo$qkQ2X&sM\*B=<R at AZDJ=Q.PWb),'?
+%@9?JO)/V-J(EKmCGW(gJ+4T[s#H at s!<nHT7'r77(VZErO+tf;K0N>)#3-T'm'LP#!ctEa`DliNYjFg6X'GTbn^baYa1rj:Tl\=^*
+%;=Q9dK',g3Esbg&g8K&b2"t"#GrVh1O^m!K%8b/Abt"ngLs\0ElJ3+BFosbB_s0c-edfL=(.(/o_<IneAsBYYi0XZL6DT6k'$;1^
+%U!7Y;kcp+'5c^EgeJ;^M]@VbI at IL+r,Jm>_(dMPRNNp?uF$#7U<XVH2aFIfeLM&f=$Y7"Y*U:].JIHFcp5=:!ZV>L^h!/]6\Z(#f
+%,\f+'!kSKm-`Lh.5_E%&((<,l4QHW\;?/<^A4s,ag$iHFopTVfjrLaPCo?!MGhQ0,7=%VDlKNdJ*Zr\U#Ka%#8U,03_SsbWeX:HH
+%"9g:Bft)Q5(U+r/:!L1KbN"pOadZe@$`RU]`^jPM5U'?L[jcCjL$':">;'E>I<98 at fg)iG];VO'>A_';"jYN:7J2EYLr_ob>mZ+R
+%qrYF]MiU5g>W%ruOlbT!ff$lg'7^KOM at VV]DbpOebT+*kMXfZiQFI!3>"gUt-eKW_#LeSlnJT=6)Ee-piYd>G.Sd`:Cen5Wp7XXs
+%Z80KOb=6%R3^bC:*MsV7gch3\]hh(-^Y62QFZP`k`53[6Uce6>c\(l"Wujup**I#&h:KFDj"Iok$Z2qLp+gQj_,$+fao7U^!uJKW
+%%d03u`3[]kE`*[#QR^S^Q8;)k"0>B+!ZS at HHCKe$q$K`VO?Y&nG7mkNG-*f9=%_/^Ln`P8%o&3>[3A2GG>IXX2Pd(QZAQ[.<`h2>
+%3)t=c:>@*D-#fDk?)eR-HS%2!Dj')em*4j59ednD2]'TUW=/,;H0.Nkj=.3GlI)(@,]UH@?WVU\e.TJj,5Ym]l\(T\3:3dO:P^LQ
+%8M`);,BKGHP'7OflgM,hKLq=YeQoKhjf.nY5EXSSKHRnoY,U"[pru_*=-[M?W\BStE`)+95AF$fBfkD.QJ:A[*-gFPl_G"kYt10U
+%kDEi"FOFolM=mZ,S`COAXXT5g$_'nF4"mqHaJJ6\rsb%@pg at PQFth@GAmpb_19tZu/'/9dn??n:9*^nT0Wq<k"ES#QSrW:TAo;(m
+%"SNJE<-IbVKKF;<<]u>brZ,M;%;-h-NaieZ!0U6u0)UO2<Cu639T\!Y:*;T?+AJD.M3IOmb)-##O5'KD55":hYl^a%*j4<:);sGT
+%foR'?m??+-4fT\l/s"Yk&Ljmt4<Yhu,c13,o'-aHk9RbNMD4#-c:-hrX'EIfmOBmC-'.^"r\s%7i?J/(PN!>1F$!3R<)br.[S'C@
+%#GRY+MLDF+8IDt4dVFE&n`V=X:8REf,'fD>&kki[G0/E4E"bEoG<;M]8\_%ULQ+ at B:1(p$V2V,D)o%kQ(8Kc__=pX;8cNF9Y*7(>
+%dOMa3RnZi(]uOO2TsGe.1>*_'<10`jm'AVnT'_mkoA15 at Ct\@Mh-#Up7jI@\[DGB7BF]af+Bj>7c?5;!2V$WbcHKnk/>7LdJAB`B
+%.u.T"DTUb$@se4B'pMNs>pF0D=Qa[k![sk*G3hm+M.4Y[oulb_`DBiOQbIJgcHRrt\8G;bb3$OR,"2!oWK;\EAV0klo<\bLlG_EO
+%%MG?'fW/;Fd@(sbAlmet*i=&66<K8c^AfMbnnLOR1R]X`KUs^p)4T,llT>Xbm[4=d,A(HFc<P_)+GooUni!<goduRK)(!;j+bK*Z
+%QJ=DTUUEhCgLOi!=tPp(.ttul->*b?4p0OM8KkB3"fb8eB;ocdcDV?:U3mCeMVVC8N#*]ia[(O7!];\6Y[T5ADg'"gZr%DT3uN^9
+%e[cG44sgZpR:]C&jh!t=/N\;`n at ZdfHbE-TLB2O-:C>t=*#W`?Zrs;j,B7p&,h[g#j&;DC-k<9f/1YV9q4ZHZ!4oQ_fV>qO"::(]
+%JaR].m]%Y?OHuF'Ruh'Tb(%_XEr2lIa.Xd3q;>-QAlf9C)D9b34uTMj at 904DTX@B6`Yt+'WUEhZPZ`$$<Zad[7j&]P^IdlA*6Y)P
+%bu*2+P:pIS3E6h!B2f0Aea=4$]YucUhUh_- at 7B5aPI7!dX^I>Hg"Ha:*Cg;X+U#m$4GiW"#J7kV.U$0L)qgRVntN^O'$D]=g#D?Z
+%=HsJ=1dqGak^WaaDSC7/%,a44_HPc8[@k3=hkE!29=)b^Usc3lZ5bgFbILt6LCduG==Z";07h*!i6X"/+/:#Q_m)mU8uG3^Ic<!K
+%[6g/d+_%jMl>SqXO-Wgem?@4Db6_f[qR'+"2jot7i;"t1H4 at QZS.l=E(BS1 at 4JpgE)/ZDSSgZS/#rkD[i$R97SWrCNW.B+3.VH[=
+%O51uKF69.%ZVU+elnij!p479fb-s:,K)pUt%e$&%(Ut#qmA\62Sc.-WEAu"DJ2\P#+,WH;dPYCA-$-:nIZi-<XX'B!R66?".4/9)
+%XS8&U?o9I3,R#cd/HZcLWYVd*'%%pqCg&)r,1lt7ju=<YD0'M+bEHojX7mgkjX#8p,54:pA^r/5CadkVQ!XAXJ/bRgpAi7R;>$p!
+%"Ro0l8?tl-R^gQB<3p/\XAXWGOJTm'-SKmmp.#s\&i3(nJX94;JkK?LdMUYj$'[Ou8!o?9mLY3U($/$0'WG\GI$-%?!qSNCK;AF.
+%_3+FcJ_C`>rQ/GZiu2ggCcM,K<Hm+?`U595C,g.m,Xlo0;(MstmYe)m7UVMG]@qLe[bm,%%u3[M#c">u34<CFJ at Vs/-dT,IRZjMj
+%'BSA=A!&kH!as,b5XJ2^M\@FG[9p,q:=hY.aeq&e\e5K0,Se^^oYG'X]13dF;jtKN`GDQa"Eptm]U4_W1j4>@^W'7q.ckp_7atDn
+%UTS2U6c[sC=LOiYY>_`GD3s8tb(23tcqX4i.D<*h9miO6Z^Bs4geHp:U9j%T\GIjmB,>6 at e5fI3WPegSlCZ]q;tGkQO][rYf<W-6
+%Z?]f(<)kMF's9/tn"FP>)5DhX/.e9W!5?SYJ=i;T092p/i+X at qoDk6h>7FNQJVNQt'-fN:\Z?oDCD&Ui0bjlR+Nrj=&#)]TKWLbM
+%0Qo30"bCJu9p;BkiC]r6K%6/B93A6*\>1E2S[SuWBZD_K;Q?>%PUT?B0N1,6n;P.]gWMKY\[.GhVi.qOMoFi6nF8F5Mr8GVi2UYm
+%:bOl>:=WUL at 8PkmRK)XE;mdn(&4A@=ZGe`DVLBa=ULXFh24.n.;kf$1c38m24#\f9+03B@=b=Ok\>CU<di,5r%FJdt;[,KYp1-Is
+%L+ema*$c[VZY_)g2T6;h)qTq]T+aLgW00pYTOkKqp2=5RKQ`YkFYra+9<07B_LrCY=:9PCr';l9ncA5&-'FDm99<2F5Ti'X2/h]!
+%TAm!&`bgEoK5Vr6bHdcI;V!PDeOHdrDt;-R0B?pfq[nTRo8\5j at s1#(nVb=CN`8-N*B-mM/9AA<g[cluJL1?*V449k at QH<+12"J@
+%V>e67;<F7JrQ<QKj-<W=-gRi?[,)V>eB]I5#pE6(B=f9=.r)D<[W),8?X1^)mS7"Agkuc(8C=b]4eaLI7"<XTlKSpRX at Mhq]9HA-
+%:<Pr;+UFBr@@e-K=7k8d:QHZ^(FUqP<JJ3/q at fWI6Ib4%8/+!U>HDk^)OqtTI==9!G?)>km%.%HfCQ]+rnR)`jF+M<*gS;X`d4"R
+%<0-/^)ja.>D,7SoF,QeCZZ`IOPg*I(&e6IG%@<!jZ1p.KN'Nb at b8fJpIAJ]m=m,#h`P,&&+dUdG-]>.-D#ROjiODN$mpUo,m;e=h
+%N<[$-m;u4T:4^W"Brtqf5'u)o?L_lM)1T3=UD"p7#'>H##Up,#=>s1Kf at _6mr"Mtg=s5unk5=@5%\0U=>Lme#5>S"Bd[r%BET7BY
+%+M3l85*/6N&h]T#iH^cUff2 at DaNU!Ab'.u26\C(b:YaC"kKf0)s(ZaDeRC?m2<%/A'NOIB`AYq8;H<EaE;V>I3G31mX;p.6EU:j*
+%lm6QtO-(h/$f3[2'AEQ2En>ufp+g*JA;E?XO329rg6<COf9YVdk,U,`H?4<f3[ef^lB%!Y"hEA\fVJA6_lsua;Mdt5)BJ"#8eThO
+%`sn.]:8?TsD(163]lRh#[b+mD%/0ORPN1,#aU15>-*O<<SO#^f_GdG!,g5Ij!sC.7d.;'!31T]q:R:S,JgJOYNk6o/PP'8TY[T_-
+%G'#c:p2:g9`X)JNW6Bn)ib0L7Bu`Z`Qe^[Ado3WZaPK`8[E#8KHX'=3Y[aL&FOo3KC?Gu7gC#?8^HBFYhCYWkOCU;3/f]#X5i1"Y
+%"LK])LBZ#R6d\0B\IL;q\IQEt._1 at E<f8cZ at hF(S$EIK._b05>kD+, at Rm\&8UD1eIh9q'_>$=#8XI9bsm7k#Er)m(\,tpVo`,A^=
+%&WK/`47'<OA_epf*a<p-D5a>u_4969j9d]gK!["Y:@=f at 80a!Qic]X,?\%"XM$R#5HHO@/2IrE`)TC0EM]P!Z8emksfp+O(_=97K
+%iY<W=^;*^Rb,MTa`+?9\8T2O=NmUm]Uuah*#%Y&,#p(B*O'3K`lKWDSg=bE`O\Mt4jU,gh^d:A&g]/F4)_:/c[`[o$(#GdAXNj9B
+%m]CHW%==7'>`!M$llD"mmB2UpZ'+$iadX84m;r!2<hAbZ[TM=YI]2F2p-#d*8gbr+cpCbpW<*'<b*\<r4'AW<oqCfUoe.]YX5jI1
+%K:?FTr/7,;^"@"rLZ04;SXrUlBkp:g\]RXo2&3,;o34>oABg!*KjY at 4LL`eRGS/0%"F[b6HaPO`r4"_C,/\"<ltH=F#s*eqA:N?7
+%)qdWNp4.I@^<+ at QA>0352+hAJ<>mnE]XXb%F#qKYhartk[H=_/4Fj3K8tD@@mKL[>QGK^\lImFj4dp"+j$HTbU`Tr$PNZT(BPc'f
+%67u&4acr at o=I3k?8<o\5IV$2lJ51_28[_R3=R"meAWbX3X!FGdHQ`\mH at 6D\+#]JEB^8f=eb$o-c)eR'PV(FO;FfD!+LPZ)lXVW6
+%32'&]4BBcTP6LTa`&S2KJam.b[f^$omP!Q6.6]X/Q0M;&9S+FR9&7E[<2tTT5dX2FXFq148L^o#.%3^;D4GJ?M3g7MV4IqSRu0^P
+%&ooHuJhF?$L1I>[I:uC"arSSOk-N]"Vk4Ykmn-F/<(C'_r&h*iA.\Li/2]!%[B8ficqTB.]I^duUa^*PBNcct,8$1c%[XhQGURW`
+%AE'q/b6rT3$3.Y__LeE at On/UZ^'Y88GnDWH1)/ABA+-uD9 at +d]U0^TOXsu)@D+aF%>#jbj_j"\?2<h@\n2]j";Go."l8=fahAuK6
+%G.u'B6r^[<iB0,KLF$nD4)n*JY&bd7ZX<hIlaQ;gCTNRr5\d,D5:#u3I'g"kMu`3]W_.0n:e6-f?\K%h8(=5AkTrY[_:H7_]4oo2
+%kF@@3dP#/OWcNMYB&,m*eq*S?o;M0LYWpc#^k_"\pb1/qdM;;]o9sPod;?k](;%ZeQi?I(s8N-"TD3s1c)C(p]_u>gpP2hZ?i8nJ
+%]]oIcp<<jBpp];Lf5LT1?f1nZocM6O?iK)@qT\?GYPu"\qTU\nVS>9L^\qaA<VYnWr9J:@]@YZ<Iso?XrJDl]eLuCAGOJ$"nG;OA
+%^TS^`+7n<us.Au/4f3R2s*EN#H<K]O)Y1apq=St#ldrcR`1==u>EU]4.]%KAh*0Ui0BL_cIbd6&\_c3'o([M1mb?p^rFrokcPPF;
+%o'+?tlHWK*[r9"Vo:6otlDss[p;?2SmXP%VDnl8B]@UEirkn[fgL'dDl$rHbH2`/Ys"9AE\c:g<mluaq^;'^.S+cR3[r:/D&,fT(
+%qqlemc2Bm&$1I?_BtPPVrkqT^r,)K'h)F6ha8/<?n*-TPRJX1;rKGj`5JI-Zci6/3r%I)Md<thPJ+`[:5J6uEoRD2cU&Ft>eSj<*
+%a3PjRlYkX-rQVj-a,g5kRm,\WoD6`,Vml,%qdAj,A>t(N]79hYlh6)mj8JlPqXgi'rFW_,Im;f)rqan2)rKP&HiIrmLYpp;)s=uR
+%4jH:`n)+*)?,*Q"hLGFWho=kAIS0h&A\[9o at K*rnq=g4oqj[%]^]3I]IlmFok?IuO^V&tVIfK'!]]@++M/ganr9=YoSA4q34Mh$n
+%c.D^II&Lt0IFg^^@/g"plK^ANr3kd"o!@K9j5]ThS+r>t5.l;fs".(7:B'dqB>]&ia"MoaI[+Fi]n]t:q%TEej)H"k?\EL`7F<*:
+%s&u>k^S(?R4hp57k%`[9qQfu?^\d.W^?6[:iqYMuf^hnurokg0o>CNSbo8n'cEHPhGH\dUHeBOsVjI/MVr-=&%H-ooIQ.8rn*`#A
+%m>mn<?iQP/o2HerMMB-_XOh[U<+MW at AQaKVq-3jlDr6$DnWtM!^C'f99 at E<:q.RlgIhg.t5l7UHmlu3qg`ADAJ$Pb4I2nlG,9N41
+%N&@g:M9GnWUS!#8dD(/*#Yqp7rSq8^_IdD6J,"8m^'*]tJ_g.Z++AGsp33_?`1Htp9qL]drpp$VlatR-ci;bga1Lm,j8I`Ahqm+3
+%n(s$_+!/21J%WN<c[YrQro"msmILipI)6E,qr84]n*h*R^Y`C*A+%h7^4#\)+6t#gkpheSEmp*<]79b#cbCN^"o=m'IeEEhJOb%`
+%DZ4MNli#ioYA\=Y+1SQEUR,KLj6Q5[oc*>]jbmW]J+MXpRQb!r^[R84Gl76b:TrsA/)JA1]LqpQ=2"4+YM#St*l#(*0BN#=s2nMi
+%=lJnfNu70npC$GI>E/COhjsLf^;!Iur;*[=F'YCkMnf;Q6JA'G^Q3U-hED_LX*=6]f;&:nZp2bf*oE#:hu7A>U#56%J#qNl?..mI
+%__"%LkJse*!PABE,9H`tFj5-=ebIu9kJj*sr71aS*rb3#0VQfor96Y2:O--G5J2:=hqia.p&(&GXsH5Zr6o"YNlPUWrScf"l[SbJ
+%IJ9oDH%+K-=&3c6BH^fRhOsi32-2oTn([:pbfbpULEE*'S0'jGlLE7=rXU*Cmc4,Rs5XDIJENKp3?iOnYND+`Xo6"EH2gC#p;P1'
+%\Zh]4o"6L92a-Wf:[e$m^,3l+2`lN^jC79_J,<?ha&VuV="fm:@@b.Y`+f'D(]34dg#'JibOtWk*pfpT4+H+WcgU])ebk`D<r)`>
+%cSX"PI+9#tju,F".<0fo:Z9jEoJ7Sq]_n/[2mZGeJM04UZW2Ig(rO<gY at W0kf/'n.J, at Zek8j(85J;EXlZ[D+]!`]1`[a1Mq9 at 62
+%[i]Hr*S$L')#JYkgkq^4jbr<mYeT;QLA\X'4593g>LrCAT-ECGSUA$!k<H2l+$[<]B8?$-ghtI+p>P,IXmHXoJ+3p5lf5&CrT3W_
+%S%NOsDr6#m+1?.'Y>;q/GOO^Ds4KL1o_^rPj:UjYFZ_m_qdX^&Ir]?&-N3#2rqZ<W`r"Y?I=</RpYdp`e/pn\e/-a#,J8M`+`mO1
+%Z4h]YC#Qd^4.hfJ"RsYP5N,38AtShqk:QZQ>`P.04^IpV9@"!VIekpVo'58]HckMuq#4](+/d at XZi.uuIu7"kl%\=.IUY`QR)o;`
+%H- at 9LSj%%=EU!D(]_n)do!Z'TH*s7ci29;/Dh%Fu4mu0>q08cD33KH66\=p!2tbr*j7>,ms6*h(\CrT1oAS<8d0 at VbY<RD at _hY;`
+%2*Y6FTAPH#:\U'2I(m#\BnI83_W/B/_YNFYiW#<aHhG>gT)\BVKZACekA+CYb at gEnl+S3Wpu[2F1XXD3lSEe^k3XBq4o'Q1jfq_0
+%_-ku\nbhM.4[nJ!+mVWh@(u(YY.1CdrMb8;fciUCA1sG&q+<%2#oRWAHh_,(T,&i'\SM0lI.HH^n9b8/:s`j2n\m^W]QtHt+0kS%
+%FhIQJ0Rrb[anT\dqMX[PmN4k<J,fB$%-HQAn(rG:<%tgNIGo5aSe-gFIo56NpaeVTqto=sn`g_UT76A+gQ.ZZ!>@YnN)/%a?iKl!
+%Y)&!3kTbeQDu6mg?bGDXXaW'tZEY:)pp0]715Dd:4l>]r7 at tCgl-nc=c*W],rr4$HjIQL6LYot\BIqn(7f3$XcT_l"T,ut]doS2d
+%`4pZrk"kd:++IPnZqHu4P+Q.[r+&R+Ie:hH\,>;Uc_'j9^OEc?=#2$='0eZep:N&MIBh]!N-;qFJ\V!?+0Y"F^4#bPlVC=J.?f&b
+%a7&>doN6c-mVR?^\Df&<ZtG'fafrPVSBsEIg1O7CbFdhPe&u):Y at dBTer]$$%@PkuoTeD7n`;9.]ZU3Ln-8X_ifEql(Pl/mo'37t
+%h4[pB5VX?fI+6*i5B+BpNr%^Uo'iD-'/b/b]_(G0Ica'p at .-V=n&HMTJKL`%cV*ga1]DLpT6"HXr+Asf8,DZZ5NN;\T_nHos7=^)
+%GFSUc?JVps]NFQ6,PW/2qYUbnYk&5=pA&nC\,W;BRSRDhVPdDgB7?sqpfrRED]&ZRiTUfdR@!pQnu;ZOMuN+iIOYVN=U99FnY^Rq
+%2p,&%ISNo5BR7]`]taU/J,Ll5\A"HRWVu)+VjIBe=8_jR^OK;q/2A^g%fl1m^&-S8:Z)/-Z%)QWYONEYV%8!7Q!_JZmJ^UGpu:RG
+%^?HlWW#ra#O"'!D^AW4YcqE"am!W]1QiB0RjNjtU0E2o"HC2;3n$gUSqSaXnQ<`.UT3T?6\`$$bbSU!Nq!%)TpE03mV`X[D_*@fh
+%hsflc5;'siXBjU'`J^VtHl7Xe"&]$_9+^qUJa at +DIQ!A&qO);5Eqp=er*61L$.hA-KKk%"cdCDrHAN#Yk+R0_\.aRDr8JUo40S\V
+%g4/QI?bCW<YV5sqcYWifojnDTXu1o'L#qD$I/`b.AV6U;m,2O7eMB11%7hN2'hL8Y:Q*i,F]l<@33uo<cB%XEj<H,/B>;BHjsip"
+%(8b^A[3'889bN)$njRYu7"S at XS!-[H_jaO:T@$[?eL5!Yi!#llf,!`l]Hl<7#OLB`:7AADe6P4SiE1-aD/8IWVpr$F(n(o?H!;9;
+%khTTm^at2)7*\/bVL4m[k-6#kV5S;m;nK%\IHrW9H)r/h=cOf*9O#0#aj]"=`;+E8-jL)$Z7)Q4(,Z*de^AkCDIl[Jb'S:#>rd5C
+%DsS.>c7c<a<86WZnU(s][pN<V(Y,&CJ="Smb(n#S14ocm&+YmS=QZ(3FW;hp=EgR`W_-%ZE]HF.jcHrpaD.<;TN0h,/9ZKN/W;hA
+%oQp.NFi&KF1juEOFm;XE(6tlF5)u=/GP%,OkHT?,\+9rb3^:7T]_RYNYq*F6q&MDaZJsDO;$26;ZhoqQnnMT2[kDH\R<,uTD/maA
+%W^Npn%$-HB(lNu!UR/kn]Xl-ks.imqHfE*>>D2quK6LRDOX_U8Lct4oG3bJh<i\$AW0S/Og2(G$1aU=5+m[l?<9L:%ILXNrg2%Ph
+%I,Gq1Y"=3!;)TrE[)l=;X-;6EP2t'2c1X1I(GM1PK>^R!N0`SJ5"F*r[aT]5/!Wa@*%@DZZjQ+3l4qnLi-O`KbZBVj;YT0UH/(P'
+%a)rq#X\O-jg,QOkBuDbe,d&B6U$""EQec(TVAD7hL1MN7mJ"4<\oG/ED$1gK,it2$[eOM/g?&=6/)+PsmFP`]b5/e(gGss?MaBUc
+%eGT_F"Vm;>5&"7VL3cdd9SSG\emr?V-NS7HX-1]]Sq_&t>BJmeJ?D"2`$VLI`k,.T;K_YL]p=)G]HcO&SN&%_\'*6%oA4<_h<aEI
+%1guVs#s at o(N=-9l#lCmpI;[PG[rX^!)R`'p$.YM]Kk5hU17M5WTKH4!?_g_]Rlb(bo&>&:&Y#jK$3rC-P2p\^7(9k/<OXB2i?k$V
+%gCe\ZIZp"*?23I!o4_=s#W43/7EiUYs(F4G(=%<-UK[803B*Mj=5UI%_^k$+*p]%k(s[dVF$b>uVWEqVRqp<h7_<<bQ5uPtIpcX:
+%UXQ2'8=61_3h5;6fZni-mZd0tf2R'"SNTScC2`mY,tVpX3S\o419SjI*3&#Qk.DG#dIDIH262,eZ4cXpO0Uf*G at bqdOZVeI2eVq^
+%Q%s00<fTB'A(NEt28Ze5RE/00SPun"QOEUe3e9F1 at s%bZj#Mu!<jgY@(nHnTkoe\jL4_VB[4?1T=Dj4:QGmWUZ]V'a_-DlXHoAWF
+%p,G9AD`VJ(A2c'kU/G3\WaT`AQ5=FM$1.?G"('\B*"LbY/W*%m:>2n[qT+'(j&&>+gA at T3:LAk)41;`T6ga[-c,'B?#6S(IN."FT
+%a^a4RrT46=rMV(S@?[_b4LOk5SDOb:8-T&5J!BqE>?k7oCqf5fc;V?^IC$;0e4o,4kDnH;`@QD/Ji)c5X'\UqE(1C7/2t9gUo-qP
+%Z at CR'g^a4/2d(Zf]HJ:X#tGJgP2BRL*\)'$9FYHX%J_FNAl->#n`(:4aVX;VP_hr>aT[0)5Oid;:8pf3m:`TN8ud$97SDb:=jE_*
+%.dkom/]j=$0#Is,+/>"F,na,_AECZ[/F?Co]s?f[,srYG`aA4;\U)4rerrh845Io*AREMp\b"acjKp[bluK:1S=3^0o%i:_V!)'A
+%Z at B:gGNXO/1r=p..XSO;=fc1rbtH0QGQelS>+Gi:hUq+?_+lJ@?h"],?J1Q.NH2?C]/f9@(f[q*X^le8QJF!pCN4a8[RL.2e\50j
+%l,fAD,*f:(!aV7I.AbOPfMknL/0>M712D)]1Q/*DU9rYX8L<Pq7P5jhk6^FS$n%Dec=r?[Q:pH0o:\.-1ffqfOq+oNShAQ)!b3'r
+%<ND868b1?-VNit;c/C'ooEpPfUq76%-lg.-P4#l!6TX-fn:BPAftkA3U%)/VX%k]Gq<NkUWCd?E:?cA1@>[UT_Fr+>W'(<pX(tn>
+%8s%J#i'3]I[W>9gWVdqLF.AJ2np1>=A8M"GmHp7kT%bmG&[tC^]f>Mt<>Hu at LbaTtONC"elsq#TB;oDhEK=;BDOK'kZF. at ddbHph
+%':a@)GM<3#FNUf13@>nfOLQ3)=QD2@>diAe?:jM),m>AB%S=gMC(PDJ[OHDQHd/k#-.ZA<cmeL$;tNZ6jS9"h/V"9pG`##r!-VGc
+%K*W6:Y%Tdj_ej;2Xu']<P1*"=`n/B?FS1_2?(-?SWf9HdapuB$9B+]k(R1C(UoI\sjP#pY=oqotcgC4c*,]sY2;>n3O(A2&@4l&i
+%i\$"mp&q#Q\.`JSoU&rc,o,[>K.Q`6Bdu6JCbDA`+<D&p?BYdrK$H.HG+iRS!P0MUMOYJH7Wr&)m;hW_'EX)dmP_jQGVY*i*3^,s
+%Z^cg!`eWj?4=?Ikihn7F6LQg+k>Z8Th80ke;h6Sm&@BtVjd4p[ZAd4eP7oqGfmqkY<_I[F+&)4_h6F#eN%X]MJ8'(0'[V9LEcQjQ
+%^;:ab5P>)lf,YflX[!AY/FdZu%[ud^5Tr4 at 8LT_iAY8[%0J'@k9?NN\_!d/N//$;BLSLA7:.cMA89VDGDHH'**rqtQWrf>''tjUF
+%2??I&*/APmN^[FXLX\tS2!$t4`Fb<YRtsQ5_ktHf/(CgQDB^mA]^3E;Va0e!P"dcY:=R'/Nf:S"=?$nN9L,%/4?j#N$I10sEh>)t
+%LQottR=4)Q"WeAt<hq$AhHUg;7oT:3GOJjg9=lCE/]<@5_V&65(+%P'mF9%Qgm&9liS+ at F;'cn8q(@;VEW8QsIr^67IR$`.c?Dm4
+%E]E2YYRNTo0h(2a*1pqN.NCd9Eu?PJ$BA%MI`US:dUo-RI&XQjP"o95$o3jDK=^,/gB$b_^[27j$aPM/2'QcVd0AAKq=B<8PP00f
+%/H(P2b?7Q-2Nn!hgQ\DOH(=.`'W5#4N:#kMi">Fi8SBLmcVtnF8Zjqo5_F9HN`V\,C5]geg*bd^/kr at T^%2;ZGU.i%,Um>\i'EhH
+%a:Vg#WCEEmAPhJ!(VC7Jpq#L6Np>PUmF-JI'pWi\)tP[mdbdVTeGI*XahM`ebV*+N-NaJj;W_sH`W>;o"'t8D6ln,F4bi"UF,grn
+%[uot[=]!5c:?dtBgj9%E6d?I&G7!(fiCfJEk@^&X<K?qhphqp!3=^\fAQt[V at W(J8AXiTj0`a#Gi[>6t>%u<j!SE-*AP8N"'&?j[
+%%lTT.jClQP;qRhg>4QjrKW[aTMkOnOM>IEKaG8.`PSmlF)`p-]3'r9tm5_3G0dI\Fasj\X.AMc>@kGJ4]!=<HYY?U91T;`k"r#+B
+%Q/b&&E_2):J5\33cdI^3#-+VAL"2-]b!e3LS#&/^bR9RH!j\b+M1QsiHGcbp;Q[3e)>)!U3WH`]Vq2ot)qJ^=]VfKb;%Or3R:Li.
+%@feGd[rT,TflSD=+T*FJ.#EC&%TsUYX)8kZ$V;'Vs(&1P?__LFEO^:Xr#f.;;9+>$W_0tk^;\c\7CDnOB6[I"*e8BkH'*JjV]qmI
+%SR\:dpE9-L<^^qkP??NE.iG7En-[)o]6kV+gJiH*A[=U$A9;omp;e_?7;QUAM*=[iZXDFMC4V:cTscu,iq2n%A8DWPJ7=^SSYmuJ
+%!N%FN'\JrSG:HEo<HG[4[UWA'A3&NaS1n at f9DPkO!au.H?6flYqLXJI-lH+Dam\;&g>)h\q$c]KS="t at 01m8RB/bH)jF^B2>WoFA
+%jTD]^mLD_jN*K8P7F]6W`dXj,Nh\S1:-Y!a-`JP;HYA7</MK^%"O3<X!@gieRtBRP[5m;2?KQJb)8DQ+OH6dk;?^BA2E<+/=Yaua
+%$T&K6O_\Qu=s at Z'_*&geqrAs]n3/]OcH2jtMSbSB$kb&dfhO^PhoBpM.nPZKT9:Fh17pF:q!lZ>T:i-8\gcbH%XUc?-EjoB#$X/?
+%`AtQ2_DQng+g4U_5`)ia115rSp2q"o?OiLG$E/&COuW9i-."S*,`;(:K+&8_YQshd!Y1ZsWe(^p59>"jR$GX^[eI*JkC1%?^ob2;
+%ebMaBk-Uu-%i[H'"B,eH1">^TW_p%]5TI^G77BjZ4jP`T^0:4#M!`VRO^)aE:sB=9RUqXDO!NUXYo_UF!NV*fbN9uVDTu=td\[Br
+%oFtb'?fW`Q@!E8;UF]q.(\+[g6:Eq`:1]*rK\&9%R*<l=a;Q([/<9!r2]Ef60h0:!^demfOV_jNcD]W84WV-cTY)nR*s)3,8b7KU
+%G$.bU9U+VcQZOdgOidK6p)W6^fu1E(?3L?(mj/!UG,?3t7[A)r6H_th`s6NTc)NLbjSpBs3+O%oG<bXq<IuW"!FTmBTGs:7cA7au
+%6im48Q_+]@O4Fu@,]]&s.KDphBZ&5sK0gIVoPt:"-u_o5F#U$>+NG,:.t?Z-9M:[pP9W`Rj!HRfNt-r]bM"_Xi68o:'YsQ3Sb2UM
+%-37U@%`".`GAHbZi3u85lNA07-eIBVGD57a6Bdp3m*I<Sc]Ur`E2g6dWgbOcE3F7knT0u=#EtF7MHk7Gf%=4QpHo;WS5nNRg9OK0
+%g*1Aif.:PhTh6&Q,e)Sug7?BJ/g"k+N/76Tj1^KC?Epmri_R7m$+eV^&qd5-&/:kEn9It\C)>Po4'8,QiuB6lO<`SS&"-`k<G6s)
+%+&0+nZWDF62NUeXEFS=+bgJedVGnY/J#"L!*_rsS\XFi;#A7R=ieN2Wei/D4R)NZl3Q\**l+52nV[PaAVd'QM7\%!HX)6irY'Jqh
+%<&5d+Yloa!OYSut>d%-k-ti;9[$il#h<1EPpLSqR7!L#Cb+d?3J<\MKmZFc98T7D0_%u9afo()**n"VSgmshuU_&'?ih,to&A4.D
+%XG=I8i.$NL0DYLX-:p9-*2e8%,TdFO2i6n$c?[UD6=+(AfChW=gXV7N!kaPa%HhQtEBuUW@?l]E^`#TA'A:D5,Z%Je,dfTn:<1u0
+%9F?I5du.V\m$E*I`Ui, at aX7aQ>5i\f18Zt"1:eX#P2GeC\5SIr8Cq=N>bmBZ'<9Qbmjm9QH%U>?B5SBpZkO,98f7/n\Q%m_SN^A8
+%ElD&D-.Q[bYqeW3Mq)?)XispGaDB*^-2pUKi`Yus_FTI(Z!Y<8+aJdiW'"H/hP)MZ1K>8Z-/>@c3;[dkpdW8&h]mV5CKD9C'Y'$i
+%_X6EMlb5n-R\]aU8b""'Z;I+&VPL"'O0VIEPE45SUH4_^-aD?hY')'H=9qJDCF"PNR)OHsF.<;JOoejD?VQ"VjAU#,;=-'EFjY?;
+%7Su<K<N)+OiE]WRK"^o%J6L$J//YNnh at Z4K*cb'end^p_$eq6ek>2>,8^^&nRSIq].=oQh4`R(Yj=+-ZS"`Na0j#tH&6Fg[=!W0n
+%R:C&)Z;qj9b<1>h&hF.E8CbWmJ`TnbKH'?[Ph\ni,`u7HPrb]i,@\b(Lh.nL-S>o%/#(:gDF-l<Xnd]te:!J/q^>^Q0uXHGY(ZRA
+%#-q";DPH+K#n)h=SPJbH&4qK/Dj%^Z)*^78Om/1Haq_DE#Sq4D;TN_#5*DO\&"ut'QIkB0ER1M&B-::p;MjNf>41L+h4/u"L0:@u
+%EBITf]R<kd\amST=Xu">\Kk9:=<eF_-$sW!b&;Ggl`hkRV?0?D1,6m5-HJUi!2jY#SP*+e#QTbIWk at Q;LMi;'Alh;c*XSeNM#1+r
+%6&']u2MiLF:W5Ch4KUU8Y%@p>?XuafC&pfhk;nGn.!+=rccZ$$DMa at Qd/5/:DX1a(?[7Sfa_E+@\TN0^.*275)Yt`_:B9]\ib4pI
+%8l7[\"7aP:+Kfa*5rC)MA]/3T'=EA-o';q7dF29;ERWom\jC!`!*_U?4\RA/7HFfWj^)7.BeY+i+;>P]R0Re31K#A?2E:\Z=4q<\
+%/oW1qW(BMsAR$ES9F#PLc\opH]6Z&]:FG1.ZOYn_n/pd/a[u;&2J at Mm64YTWiN>kr3i3m_[td[*eYVc7k0Ge)eQMq8_FX[VI2P=;
+%cl=ScHO(L3GSdu+YstUP2)1N;GBcqHeHs`^9?U0B<=U7`X'4#72\oLDGH/(&<ip0*mO-jclD:(.DH&nklT`WDX62:>2R?.#k)mb/
+%@K!G7P&j.K(Oa?d7]r;?^C_h-3kP7<7BR^,!M,4OjPJgRj=,@!MnoN1YYdhi3RCLNL+5!f1oR=2kE6adP'0S9*8s)AU6GLVcSCf[
+%&meQ<+qR51[7^b,'X1*DQY`=\(8B<6H)S3Z%o80 at RCuG:"/DO5PuWoTok4qaN!/dniJ$6Q)j/A`c1'AGGU=f$KmsWM2G%b)W_q%4
+%Ui7E4p<B at F%G+e83 at U%+l2E?(A9_5lHRO%H.NglULU^%_HSnG]Jh.bc=A2$KWcfq?Th7t+#X6SmaZ=s/I?nG5:_QIZl`kjiE\t"[
+%p8kbh2TW5MC_7Y)3n_bHOo*$3!W52f\c7j4>YEd`=p22VXhjb2-Z`l4:^OCcaGT(=7%_$O`\t#cD3i!@l?<i>M%*K-f5bX6Z!qUi
+%F%_gZ7jL_BI[/EfXib&g`<]MW.b7ucb!*;3.0_'@;dQY?D,,+\2?Q`@[8e9T\&ch<FRul^GfW)..?^UK$91ZN]^BB'27Yf08EM4:
+%r?4ICY[:qY[Yf[Dlk%^,a9NDgPiAsK#$Yq?R1:8X(kCVoaC/g4?UY"%bn;D<9Z\m5ZmD,fHFMhCj!GM4PbF;-#Zt91>;`qiCiK2q
+%(6I1O<5D1g>"e"mMIP'ZV3$JA`6D::_l,h)3opALfJ)!)SNKM,IgHXlWiWHsI`iBPn,NR[Q(GdBEFQ8CcQD7I>tF/op^U4e;N>Z+
+%JCV2m:bk)EcO+8U$Em`p)R-%!3Wc_f!+hW>70Fd^.L[BfHJqM#Q=ioLYgqcB1 at k&!;6NqA]ib^)9/CoY07#1Mgk8Y[r0=@U"mo>W
+%<#.dF$XaXnVb2B at 17i#rMA at Pd$Z<s:RA22HE_Yt97F"UM0hq?q4.e&3PZuhTqaR0G[OY$104D2eUS)U`>:%*aIr/0u&&_*f#tC/R
+%?+OFFL`<g.G-^5^#`=G/.`b3J'YlYJAFZX,&"joSgJFpTPnL8ZP$IRp at V4U;mOZX6&\4%f!YB]W"0[i]<#K"XQWMa:jId('BlD"c
+%jq11a9c!(*X16tArmEAEZQ&s.]5[t`noIH'ED"(^4:'pNMn0OGF9UCbd#]\%X4YB`W\qM8A3eB,2BUm4 at cP`s$V^jde!)?7L;NP&
+%b)\(WYk6a63D3'R*te$e+(*fFkY2s4AKO:NJWi?Zb#4;NULbDserp-^nepgW81S>k<!d_u2bIL+H*]dA3:2"Z8"`O6hq6go_ at l>T
+%nr74+RY*YLShI)WIm%JX4:0b]d(m6.IKm`jIshsi,qY!jh+\+LJUN[h-VqeP#d]aP3AFZ77;$ie``/5kd`R*t=^juc4'S_bqq>+U
+%TrtpfL3.TB$L'V+4/@;k[p;GNMm+J;m81kI\9P$BWehkg?W20*V`#5.fqN$7E]ncB#m_pPmW,&0 at PZ>D_HW;RP`N4V$^?nU;#+#C
+%oo^eU3(cDkP9O#^$qf+ob9c]24BV`XbE4&H'/<9;+em(:nJM^h5m6<%JPX2e8SpQn[j6f)&f=3DK<2BUFRNb//'(pdDj&o3F1WPh
+%9\I4U2cYgX2O'"VbJk8;.O>Q\s1PX//>&a_UM at ShG>-`!#0YrW)Rt*[o^E]TVl`[1Ua5g*D$(+7O:UT;%^u5F8[>j6UP3(['HkEu
+%;W31`d:RBb_RsCk+B3r^1!Q:?WCn-9Wr,I=K&QthU-/7AV(X!iWhb?4&][?Xq09_!/dj:NZ':)bJ_Bb-nU-X3$MilYrAHQ]dqg!L
+%dZdJSSZY7f7)L"XLPu(:M9numUuKR7jP-U!h5%ktCBVu&0>!a)S&[jK;b"Lc``2$"8s#4JS5h1ao//dZ)[&iUVf@@l0-+o!=ql"r
+%+bmN"Xib.f2mF at mRB.2ilhU6j\(UM?!Dk](Ja^Fem(G1MUb*Jq:P[XJDn"gg*A2[ofj17A$!/T:g:3]$Pas%dXR&B]FP1#Em.,jU
+%4=bN\/!HK^\@"rCRL(Vg=FlPf9m1$O\eP("U?\]bQQ+d2.90:S8M7hn]1D.^h#bKq4"*.hWcR;qL$G<X!k;`2Kkg9s at Af[<EptRS
+%U>!L19Y`jc"M9Tt[I#:nD/P\+:=8,-^SHV18o+^D=4et6,oQGN`7<s]bEqTAA/'Lbc/QWiNQ\p13pR![Q__]uP^"<CRo*cF?r;7t
+%X"l,D_9Rq<JLrJ,3a30"pM)pT]TQh""A[`i=X/`f$tYWD+=]rO_QZ_ng*VGR,03s6/++64<AARPG&uC\HC*E+Pm?]@&`9>pP=1JN
+%Z!dWGQC_X+os&Zc.cdNROK5[a8Qd7#a#52a\"PD+ZprKq0fX+?i9<bK,VG<CRVJ6Wlskun%%3B:!3CDX$4n(S3V?<i9S;(Bi*&(?
+%8S+s=X(<8KE_.#mWS5I.7`H$P[d?**&)n:O$^ggW$rR6)+<T!q<+@;^1.=3#9X]7FVg_Yl`8OVD-6grK;]X'gT]teu94pMCo/t6/
+%AH]@JifLDq.aG;3fdo3C/B@`<Z^W\MQ"r`u%_#+&^^3KPTX(KVi)l=e14*<T1>DJCW4T*>=.*T]_(+TD5e=Wr1(gOG$P!@YqG?n)
+%<es"E]%RF/9d\Rb%]%jbHd/;gj]t.Z8O72YBTriBe1[B!jOe4`9_hUBQrQ8>]JRj<<:K.4qsh$,H`C/U0Yu`_:NEQkaJ*S<DXV!(
+%XM!+2JKT\hR[m$59U=5PN@\2VfNADU:Lt3(b">0]b+aH-D8$CXDG$m.NKYNeB at L'8Q=j64TdQIF5=IQ'7 at up/fL9i!nodaQoFo_E
+%0\[>mk5Y#?;&lWSD^$g]^0M,t$^_nAhj!-ZqZ,sqb58H_%;il,&E/uW)DLoeE)a7hG<[BZ<jd=_iON)g+8,-m'cW#OS5k9W1JcZ@
+%P'Ade9hr&9QS%OWH6"75"kt/e?!)90+P!6nl\>9IX9J12Mb3VTQm*TR&QadL5+:3I"HQ2\PbghR8ak1rHad)Dn>pL9EUC="^d;qI
+%hg*:0 at Q_28X$i>HZtGRt/3r$RYni7!"Q7@]*ea.#GEDKJ7&5NJ4".g6ME7R'O,B*:2Va`f-IiB<#"_ZN(7$_&iRtI.``?[B21E@[
+%bA`M$/ON5ITrK.*#</bC^h"Zn9Nr#i5O!SMGpB4(mBS/\r&'`n#QSC/W]_nV"5-It)1]f;n>\mUdj%D?!(dg7XQ425m"p\JqO'r-
+%CgUsoMA+]nIpF+MG"^q!4N;(oH7)US"YXC2(f"1LBj!S):Nh2eWd^pFg$l>I:3&s&]*Zg,?GQcG)3Ec'iNE%F1"ZqC;,ZLu;jDd9
+%[8D'dd!o*b<Ttr4D)*PN>pm8?)Ah/Km;LZG%7SC"XN;(j2\Y+ga at n1.l?7=]q:7hS%TibQGZAR/C=`qe7$Ad=09W_TS,5cj_'PD0
+%\Oh<ffbIXu&+GCrCTNDV1b)R^CT?%"VuArmgb(e.DFF`b(Cq^*58=X_'QIk(G*C!ao*oI<X\3MH:M>_7UP.<t"P[@5e?22__BOf?
+%5@;mUUm/Gl0&T^4BauRo8&WR?h]=h%DAHIX3,EA4k9RqdcE&s#!+t>Z<$bPDA5bfLi<(r7$o)JIU=OV4_P__`@uE>(DnWqLP"#D<
+%,n:)pX.f.*C`@E5o.@#?G$IVZBdSkf+.bG'dEBZaG"JH3OILq__N+$,+\q0?Cp;k5Wt_:;dD!ela\n`PUB94j)MaJ!Ci\H=!Q'*>
+%58)&).'G[nE-8Xp;oSF3*I[&XSe'NogML_04L1H0Q&\nP6f-""4i[Kc-l$Nel at 8,7SX5VXRfX*S`pN=?>i9,XMoSe2a]Te@"Lq*t
+%Q/+K6NTu-T:ONpP,.4psDj-+UE:^D%QfGMM9f]U%%U>fjHNSf"dZ3(U_uij^D=*L;P.cCb#UnIV!*I2ep?EX8f[]dOgECF!3^)Kt
+%PrA-U^!1/daGjk3(Z?aH^4)@Wkf[KC<dB`0;D72Wc/J5GrAf$'qLjnt(1k8MU%FQIr`D'_>1r<D=95ifbObLrCee_P"5b.$@GMm[
+%,[htG^fQY5ZLKZ1`F0O"*6>G>?Dq=r$;OuU5W]I4p$pa]s)@Z9*.q$0ED2OMG0/dppbkTMgd;oKXs-T?:#1i>i'NpKLDU[eNX`U;
+%Ab\6sr`;aonK>`R4.$##T0Dt;'KkgE&@UU$_/,Z\X'E%RL>+n`:VAJX/D(043^nS4*mSsL[L5)3;mLi+ll*9#^sLU9ZXKPWQEtCn
+%%C,7Y'";8cB([4+^Xur?b4I"m]7Rc*Zn3?:c*&c1C8iQXU\aJe3jn?aZ4qV]Z99*4S\u[H".*4K%D]IY+%X<mlaGiol(a0`Y1<U`
+%NI1dM_PUN_YF!noim<5s/lo_XL,:q;EC=A_@$Z*e\f at m/l=JU!^H1qlg>VHCK:3D"Ngc[u)R^7I<R0=j)`n'2W)Tb((sfW$]*`C@
+%a2pnK]C#=M`I7;h.RJ_5lin\#4k>`\8BH+JA7)dJ7UWMVR(F_TWT0H;qCJ<b.(]_t6f"\HBn3'4?aCN!HX]ir=^M1XmBV:u"E[FS
+%lI`llP9dnG0aJO5I'"s),'3f^"cQ4,&A-B_?'][-msK.N)^lQ3:E^2EOLfL98*sBii?/qJ2!5h]QA%8$*VaC9[oR[oZ.1HMRN>cl
+%d'YHK6C?MjasU1V6&$q9hdjW)MV_[XMmk(*FSB='h-lnNEpD<I,XpW&Ln)L"/_eeJ,\IVH6(:;CR4AoW![9mi6sE<+X4%-Nid9<<
+%bGTMC-IWc,\,jHllGPcJ<IuQ.BuJMDW^;&gUWE.pV-[GgA%.*U-M0A*LJs0k&5h6,K?P]GP:m`$Sn/'5._0t2>m at juIe.C8nd'qn
+%%fDV"eT0eI0oQr351sf)O;M"Q5AP,*l76n6gGkqs^gY!lI1;=Kbeq9)[$*?*,'E at sU7@*GGUcj4:JeDliF-2XWp8odpL2>+TOaZ.
+%n=nQjFHIK<TK^&;;0YMB=n^3b\OZ%kP^WSke[MbIF<7udK_qlpkjm4o[IqFJ`c6pLU0>(B;2r\Sc)tELb9bo1jN?e#6iX6&@j3D>
+%HL<;n;"_^%q;il+[Z.EX1E9"UI<BUn<S]A!H;O/KjNB%[9jhO$K\biZRbsX>*b(^_pia!2C at 0&*WlKR=K8VjcLbR at Q+kKR5*=nYD
+%"U-17M5SM\CdW62"n\JSi+="qWXa'NCL)`c_16a/Kb!D#/is/Prn5V?T&hB#3/D%M7t!P+Vt835g8jJBfOiTJ##g?W[]Y(X@`^^`
+%'XMPO^l,Q$2TaGDHm&"&VE4diPm>qU`Drcr*<Yc'/6%[E%\Vq:hjH+Yh?i<,*;3Lrg;\U(.A1;W__ZSd9$u=l]Lc`j3sZq$H2o+C
+%nfMKnQAfg3]?j)*/sH]NYo4l8-37-C&q:cN"^Ck(nhqIq-D_piB>MI*3EqccU&]nD,WAkf``U[K&gmdp/E8#7?jH$(J!kMpD^/!8
+%F[0aUKk!tj9@?@s_'9h?eJ6lG7;Og"Xg"h8[kRW6#s0]`INJ*&K4JSo/[[$k<heU*X#5?1_lNu!CKMW?fUfY,B47jF]n/1:-CVF&
+%.>[^\b!=ObMchXP7_rPIlKamoEeT\"8,\\]nW at +ED-1tS`g/-/ML?eR459[WZ9?NC(T1PV%U\2>K+0\H91C07FCb9%+c5$k0VjF5
+%&[I#EOs#l;@#AJ>S(QBp)k4]i#hUS6ochT7<>`:k`_'&M9!q[LeV2f'_`(TARQTWJXMqWrdFl"q9(q&b>(iI';Noj!=+V)-J4s?:
+%=5YT3HZpe//@tk(M1ULF2;gCS*O7i\MD(++%Ws.BTSkBsQ]8F2.<1uTGmC%rW>2-R0[>\$0WWJcNMJ)W"i'#=JNt7cWK0!&CS,/M
+%'p1c7`W"KK52rgU''4)7llmJk9A6KMP5n$hSD9LmP,G401Df$7gStM[)\KismlhU88.H.8Je\VS\P#%"e2gU!-iOAA]nUMT$GKuU
+%K9/PN&R$^=5t5qJbui:@ca07_*-3Lr>Gi+j8QMl-Kj_UVNMsAYF8JWAOAShh_Mrg\GTIChL0mV6kg%8hX".l;Q;)S^QLmR-X$p-q
+%>nVb.Gn\C1T>f:ILN:@T:4/<_5:/JnpdMSYp##:1j at NG14>4`>P^'MbZsPpR!4[(`XReJG!Q:OF'.\Sr+*2gHa"<DWimnQ.ajU\1
+%lS]ck](Ql;CA[QoU9!X6ZH"#T at p"b?@:`\OG=o.njEu,5Wln*&@;utm3L#"tlnAZ`=7tCU''SDCM9UoB!$s$I)_n6Z/I>(Q?m)m=
+%_)-;B)p'pgm-<E@`iA<*,YP=q"]Bk--'"_k\&!oP>;?Z.*NDn$UcYD[-U at lRP$/o^LRK^g3`;J2Q#u"SY<:@9<Q8Wl>umeY!A#VN
+%s&bc_#!p56e^".MFqnHKq/_dD4V)*7&!DWWIVm>E4c!Ltkuh2\`D3JEg%f\5_DkiDA./3EU[jLMi&Uo3UlP.V.Fo!k>s(IVAX&mg
+%*$JE]U[/<Rku^"TA+>Qa\#Fh>EP&]KVLZiYe6i'WH+J?o6mWri:M/_GlJ$<HHrW=*12c:>GRjFV38knLXO`RI9Jl0.BC%Ob[)K!g
+%0\i\&M0a^.g3,Cm99*]rSo.W.l7-(_!No8P#[GtmaUXQF%98ReGp'1#fOc(W-Qk[\[]!eJV$.DW7`AHqJ^C1W8+mf!YX[2TG4=:^
+%N!lEtX8N^mFUBLen^^f><HKdM%gT?4KhG55ls']!B*,X#g)&KX2_G6O6)#S5_R'O?^^4:t#X2]Y=-3Y5C/L=fbt81pmj&2\T]"\$
+%6a!$+ at Kk%q"31'kYEc2_"T&8fBZ at 9t;Fu1"Vbs:&S1sq(ArgSA"<_;GXLN9'4RYsIjg&]XBB+BQ+^952&k,&WRl[_oYTJd5\Ae"<
+%brLC1l<tFr_Of?Fn=!H.CmJVKPkbfH+bH7tVZW=RE.4%,b-i=EoUNF^4NGJsnMSTg-0LW^jQ?F4kd4k>YZX!QN?,"`,ZbS+k8Y2'
+%0P8;n93ohYN^A%ES%FR76mf<q]:sQ7+QG+5Z^e%]OS]k-c'XD,#+hXnR;o:#<3m*_';ePT4c^mJh?/"8Ocp#YjDN_s>0(^9[F'-`
+%Ub7R?Z+pet1KI^Bm3eo%2]cgX_I'_[/&B(L(5PJ-D<gg(X7^87=Gk"1emRm'i6Peg%ICCS^Yfr<;TsLhQTFQLBD29VM*\DkU8k._
+%YheA":tp/9]G]c1Hkqe4mA1"%.'%J%;M^6!a4BHA[3_ZT-\m7O:I7Ya>OY+aJ5?Q!loD!7!@o;TG['i2JFm:%\90sJ*jO/i.$5FS
+%g"E0)-Q'Xm#K#r.Cq/01Q'Fq1.`3S>4;uX0"a0=1/DO.>?E/H#a#k?$-.K!L\[^R"^*O4^"!dr8ZT40p":=OA4p$9:(\SHIEb<ZJ
+%pRSpkMd*LeZ.XJtQ6pg5V=QM:-.rX9CH_"ccQ7kclGTjXpCZ5e$f4<9Na[f.DV`%S*'K.CX?u=_ at SHmO/!#Z-.1'3!0sRG%M4/DB
+%5])%hoUYd0PG;<@kS*>Un2PEY<YfPF*!`tb#Mp5##7i+AaZ#H/+qOs4R<Vga6-D=1U:c\o))kq<fc>7]a`r8Q:8f3IB%d at 6>b+Ya
+%"6VG(OX3WD15h.6Ym%2V3)5V>4%6b"8O/$Rih at IW`93%o^6urO8N*TCj`A#iZZ>X-TUd/a;aUJLVrE\>R*nsp*TICfD22$$T#@gH
+%So:oBACW2-[+HUQ'!-$a"4%qI>Ze*^%6t,%;mIA?;6iKi:<j>eYFTLEla4 at K_ESOi@FDTt4/d*H(1U9:-8DbOjt'8OPPq&P(H2l"
+%*#`pfAT]eP$$(3pLG`m1D^V$)9$Mu:&rlR=>JM<]'4M/2\cjWjb7%d$:q0mPZYHlUYWe2\7aK?]-kc#9A3,rSc-Bt2h'*dKLb&WZ
+%*\=8W%ON"`'U!hKKl%dD8=^6G_47#sr@]#G!JPb#\Wb;JK?nP"#UpOK%4#%e9pit\X#V730am-6\8$0p8+%"#ZB:Ak44n+gXI^eO
+%$r&c'd@'nqpe(&C`36YUi<BT0V"qV+28%B&1":f-ZBH0El@>C;(mY>c.70?n\*Kd$W8`C'r=61:2DfRoq5TF'V[]#9*+;^.e at 6C-
+%UcdBUs2U.TlErM(1H1R%D5R^XEOJB_##[7IAtLST6I8A'[R;Kka_D<ng6tp7mW-X=G:qOs.lDd?28fA`J\cZ=Dc/Lt#1<(l-#pde
+%.9sa.%@:`eQD-MZ4V#,df+[:AFp.'i4t/[!\`sl#Z9IZ/4",s)Q$UN/Q6WIsOjm7(59LjUdn!EtEY6<9B`:[/;`br>6Cg?p*VdZb
+%g++ot"GC:Lni0_.b52/I!M%0TQD>]XZ?Fke'Y8m((eI;c]&tChVerUFT)l#rX\HOrp:ljWm8G(0&?ub"N,1aAS'3J8n96U<6<huk
+%b)G5#$u3bWh$&58Pn9rX]&l<iX"-*LgGm$E4kaIG]]6s.>%Kenpm=W3#oVl.86Ur<.@'7$etBS'8I>c`#'5V5j3Pkj.k0eCXohf:
+%GaQZ'V/+&q)1/e>51 at Lm4*#X/_;f]Z#;M>u;1+o>8([1I]<,]'Le at f0P0,WmJTk+rPeS-Gh-U(-\W//`7G7(Wq0V41alIF6V_g&M
+%9(F`m'-&,p0O/dmbN]Rn=CqkE-B!E+fp2(PF('tUS0]$RDFl=>.8me!lU?Ve,t2HpYl7(tM:j+:gO>%iHi0ur'.A^"9f=cHkWG*`
+%_RL*(Tq!@>[Bc7>K.OS9badh>6r)@kG%J<AG01!Jb!V!c0LAGo:<[63DIdnV.Xf:8g)84k4aga#>aTmL%\.m?__U2f=VFS8-i-gJ
+%\?[m`8Hh6IVCiVY?O9,!?*u<<%SlRt(G:IH=0e$\1i0FH$ofi-)Kl^7M6!qG6]9_REDb'qTE[ZIItEV)[X%ARPkCOXH<+t%a_#VR
+%_m(0D&BQnaq;8@//RF4A!qU at S*hdJ<AYt4N=4*54m'e_hkB9XaoM-/(_":m)0mCHp&-*DlcAqeH'HA6MD]pb=l"&s%SN^'<h%!8O
+%KM_!MMj^2!Qb+^=D0r\&G93ClCP_,4>\bTR</&iL/@M]jgS4^HJPgfdX=q]p-$cMFT(M*Gb@(XuALaV at Sh!)t_m*B-:Lu1 at T12?P
+%3^e%QdXYS=DB+@)-cpf><i"R$W3ho`<#Z>VU4P1:$9lfQo)r))8%R#p3)[!7hK]<$?<"l1o73\u at 1O=X*XRhm,#p];#iU(#.!CNN
+%2W8%E*]d`ik4DbMp(SuLcb[U$a%7b#Wl#;f,S9EpJKdNYC+LU. at 5>>qLF'h^8s3bLkh<DDWnCP8U[LC9odeMrTIl`\c8IkF^&b3(
+%:pPIV!6kC2MEhFKeXl>KnHDsmc$E[NbS"HajtKN)rbC?TDR8nVlC#MoR9C0300p&o#fDjjjg<Y0OFP>6>K(#W7HD&(\@-&[P2?L`
+%G?+`*lqZO5$96^ioV=_kpR*"s?BdUn/_V;tc:NOu>;Ooar9,n*.M4]]/\A#f#7"@`LBY=eWNbV\,B/kY5b]`$@C*E+1uPUfl-WbY
+%k%4>PPn`ZQjR$7,2F5OO\:Tpg^`C``JbOIf929#*::Mf/h;+RTCr]KtRM8YrlV2Ze<)mJ;S0=e(YaS*D^IO-[Lk+hNd'H"DRu(si
+%\mXDuC+g*Fm,?H*D?AqUThZ['lMh5Km>V^DVR;P/DJYVL-P<N$NdbH))>4F,:HW/L(r;j-nt:/(*&ZMfPd7m-3SIN(=hfbJm+c:?
+%89!.NW--c2\%!Ya4"2fj-_;_G()t-YTp%O/&ta_AL"Jj#Rq64>]K"]+=5Y0cFj$#*F[l!WJ]E8p0"X02:NCj*^Vpl*YV".Te9Ki[
+%1imrajQm5:oS_e>R&]Bsc=M/-mX;@h3cd0<1km.;0j?B!AcmB25"PnE-9bN0lE-XVAR4/UWLLRC=-+QCKBdTf)1g8^q:p7EW at Sh:
+%480`DL8Q0Z7<pP*!3=S:*o7^2JO-iEig66g!#4Ip94poDa$I!YH]LeP.Zd9WBI.Kim at NI2fcra'KY<Ub$p+i>`lX.,!PQoRg,+"B
+%BaHqjEQBF=:M56E(#J_#i*j"YL4hne8_HXSOHkW*5V:oll3-iAbE+X,Ag^n/IQpIr&0*,n-D<oW6"m:LOfU!uN-ginF'WV!0+sE3
+%(fZ'/d+R6Y7V.Z_K=&>ZJ-KF]e9_1=nP8ijE4uG?3,+Oe&;$-SIG6 at 0ZCB@uD)SdL at 2Rb?`Y^K$TopY/,=P*)h3"u]O(=8\".XTD
+%EY+_5*F#+eaa:=&LIKm79-QT$$OnSB`nTXch/\[3&82giP>B09ZVC"k8![n_-<q6>KCFF>^s_V*=Ns+lnL/-iOt%1DOIcM0fOr*W
+%haaEsk%HVqLr[@eg3-WK!4ADO.oiWs%__8<a97Q;fgO7Wp?WcOe"'V):k!TDlmCas<DYQ_o:3p$5ZG'+K6:#`'J+td at QtRGbYP_:
+%Z'--u`fL6^)65h]>S$W7ZmM6((]\OM4YQqAG:`2*aTY2g``R(=Q3.KSP=fO*`aQJ;&sILk/YN:s)f$kmST[TUek))K21^0eEZoQH
+%JM'*BlJ!R8OZnl*658EsjO;$"j*/Vm<gB$)JL?$=!2<*S_9JA"/3=oo#K$bkC:/B/)=8#urA>YeF&oo]c!N!1n!&a.eUTW9=#LX1
+%0U=!HG&cUb0Wr?Gj=-T5?6el2[C:Os#g=cfZ]Q8KG)u2kA/FATSofOcM4ZQeZ!M[&Ykq\$e!+C62-bZHR:CY-#4Z;K[N at _)>*M:`
+%_%ae<>&1BZrAeu23nB[oXogiFj]16)53N(/\``X\So,On7BRfWMaXF3mc%d^V^&F)+<Q;Y at AeK+7foFc@H=c=<T981QHileb=];J
+%]8(&@nnW:DKlkXl;lMRoqfkl!`RNm`(Z6_+`&]E#m=J\T>TAU*m=CWdB%F84#doe4=;j4'i,To2_ojEA!3D-%mjbRgO^J+IC5%b)
+%H9&B$`5BO)/J%-="%1T.md`+nb?C_!iLB at 6MoX$OFP*'S.Ra,UY2mC:EZ6dMJ=G=r9lgMAi(22U#)lc!k&jXBkdF%]#(Ep2(SA8M
+%<cR5O"k#=W%_Ku#NbE?+MYC7gfS at +(QABD6OV"SG]7V=jZQ@@O/hjJmpa\XR-p8N&J!o(J&3pN3h9mD"Fr^5!L#dK39iC"jjqc8j
+%9)qHEo3X&POk*K]8PC at iG:[j at ZV]5,39aEV3>%[X4C5X)(etJM3Nr;7?Ym4uS[ZMi;<p+Lr/p1<@]Q=":;__7^iH>(+p>],KGP>I
+%`Zocc]]fe^)kNRgQ-mI$(JfZ!#9RcQ?Z#@.:=/Q/b'Of]RdHh9G[a@=j\?j_Z8J$J&3L=#&s6.E?C*!91L!J+1:n;39RO=(-+$7l
+%gLb(I,25'"<a]BW8aOHg-FYe"aF>tnil]C]PLV#jc)GYYbH6p at OF>EbqXOTIFa$E?j#GMdmpe5N.-bG*Oso^I$1/80DT:fYZhaIb
+%cH;$+8AG6cg]RBg=H5XO%N!u=6Ln^M!Bq'8Wg_E&Csak.lMK+$FUc]AFpk<GUSG9ZG(0F-akp]^T+$.BYm8S$QImk5$fBJ9"$_Cn
+%$0XsLkct@\l:beJ7=>T&N'?iABh6CZ&, at n`I#CS1`O6I7;t<3OB[ea<e:j\Kn=KV.%ROKO#tW=]928*>8pOPIc*!S*^u:E55 at no!
+%lF;mV#;Tu0N&%6TQa;n>!350d"RnU at G3GbD61O]+Ma07F!P-pPj-a8Y)R(hpp26seKSn+D.NRmrb*A8G6hcRHfhRLsRZ]f,;=c)3
+%c0*nHB&4l`M%@Wrct:Nu"Eg2HIjo;oB+Ls'<[Rtu\LMHkQfR_"pjQF>Z#td^jAar')7<ElqrR.-1_t&NP`ZjbPtA8-.3foaVc4sG
+%$')/jROPW.X6bhWk1*- at H]I,Xq/!CC)e^'"]NOsE`E;^\m?isqMI`r(c`,'F9_Fa9SX9[_IL=<>GKY7tq-.]a#KqK=Kd14`qa*G@
+%2S[3XMH`)RP;NlZ[V[=ge5"o:JGn<k_q^I;%1B(C:U+om3F0A1?$W_%p[35N*4J-/W52Qm54qdfJAdSe,;mV at or@U:K$PP%3N$NE
+%chUP(jZf4*W at Q$gN^/8!_u1F(>ADHIRs4?pANV#]>e?/H$]O4'5*BrDl:^A_R+*KkjPfdBQ^Bb(j+kU:X-CQ- at C%?">"MM82`>cU
+%4)j;+RpQlFQ.(&PGGfm!/kAHIB_o8^ep^(`b/@5NQ11#q3`#LR;"%&Rmt6X*AV7_Tj26\'fK`b50R`5uDBmJ^q72S,T-ijj\6_Ll
+%QY%-6Z18We"?glT(*N'b$Kt*P:K+jL;8(Y__4K*=Z"&Vt&,+e(a1#KumXL.3f;c!cTA\?iiUaRJ=^`rQN_.s=D(!\rCm)81.Fe(a
+%bNlpAP(&U;*a%Q%V*)AP at -a99CF@$jci17DHni<1;Jht"2$-BIfVn!)W`+i+4Gfqm,^Ao,8eFm#"!\V0OC*G?,e*.4$q\/AOr?D^
+%"^48"UA79lUeDp>1PQ"b;FoN(CO=oUNl,W_3`%1MR%:fN0q?`udA5<GUHlQIBL<>kC"j=]b2;!2E=4<hL#86FeVct]>4$K3KD9!T
+%B=H<1?UT/N,uUCl.mG4<.=Q<]PP0qQJt<'*[IeO<BgNoMV^HgH8 at Fl6%fRL0HliYe3W0a#@;81'@.L<i_K'ChJAt$Gp5T;B-?\6u
+%qbu at AXN^mif__roLYA*t1fiNo0DWel*;=Qc#Db6`>$rO<XI8Q:B=n#oH9co%=hce*d8+d\CW[%\d3OO^kEG4\V(?AYSg7B5;Ro5O
+%]PTkOA[u?lh at 8;AWLJ'\UGS1uAWfHV.'[sGABJ2b6&LDEQW]/N(oQhG==;*;PA931S^)TQ"S-eX6?7)j)];T/-e7Q6E&jg=ci9hS
+%mCT2'p[iNdC&K*2N^-4>%97ZAaiMO:W0I%)UnZFE9R6:8m(#AMm*7afOd^<O13TF<LfO3R>?/A4c`0rZM=R"?J,2^84nQ=.8Q4Vb
+%;opYQ,(Zt!]*kMgD3B;DP`$`4Gii8KK7lps8\>'_e9,n"7rY]XbbE:+6I./XK+uO]:_JaO@'ZP#h9[c'?8]n`7Kl.fM1eJ,lf/OB
+%(jYS6I?N6m#'o=:>Y;[N=CG/j(a9*KfO1s39utmR$-2G\4%mX#<-$JbdI3l9]4?'^reACaICS4AgTU`6D%2Z#CoCU0Q'ASj*9L#U
+%9'RS7A]5'VI(be!jLsq[Kt]W/aDOh'6&p-c.,oXCTW=YVTjScU=4NMZLXCP0NpAsMegc<la^Q18;Z&(&\Y8%/HnW7%0l1(RaZ`Uq
+%*qm-re.T(mookVo'$4e^-Pb0ja+L!N::"iG25!+_#;l_gW9\ZjLQo\B=W>^Kj`"+#<s+g?3;d*%_<*?oH1-nYNGnR9(@+T\J!-Y"
+%5TTtY957lrqu(A8_>+TJ2u2"?8%/r2*@S03Sp0r8hXjC^Uj<8mICL/?R2GN7*@Ac6&cnjk;@^=%9094;#7[Vb]C#T!WhY16?Rf.;
+%j$'Y`?YJ2q(+[sa,i5o at Za+:u&@:,?<iMRoq80ZsJ'0Q>`]-kUh2MCmKX at T@6]Xh.5ATZo;Oq[<go=a;/KQ.$?po?oSXA8FKk8<9
+%/)#.]J at elFal'bt9"rHm\u[brl^8hXOE6RGd8S<%OsI%FnnI$+TO2US<I?f'IY+h*/Hd%L*74A_(^W[n[F9+Imc(ru$/m6DPFr>$
+%_XSb at m]XiRQ at Ri1Xe9p7bBL!94R at E)D14GGH1I1#Y-fSK]j,fR'Q3Z0'\pt:UQ(S"1j`S.I3N%FkW4fOd1o4[2]3nZQO<^=(l=0:
+%g\+p?M,0!:'0i8.H5.^*.7':E3$2tA4rCdJ\.:Qqp'jV:C,m`h5"]fLFs\Yt1rPhn'?FM,8]sR\mMhAU*Roa"Ya]/M(K/gkC>ef(
+%.]MTu(3FhD@^!d at c%%Lp`OkPIE^n<QH7/t#$>n at _F%__Bnp;Vp"7WI':EhSS8'gNPWD9OX,RciOBnCZV9L.8cB5BIEnC,'bc-a)>
+%S:Ai/%[aDiRP;.]Di,G#!UGO>U%<\bd*2c-o7b,\lBn.f*K?2oSsqKUE6.#2j%2)6G/>US!9c0-Hu*0)rAX:N%kC9g0^ILu&:ZT5
+%*K/1dMDZ.lPgji[q<:GKRshsi#tg.*cj9S!iT=*g(LqMYn`aibJoiW&"@oWS at 3I1_p`ck2cu^;id\I2p8XOC<0)(?QF':c+-6L3e
+%=37ktaD3Wr!_RJro2%]W^*=W4amr\5!gdulcFfYkoC^9Lq_^;lWW/@]d^I7f<=.:?(IXGI3Wm9Of:,]&-[<tZm3N>h_<k"+gTY7F
+%[2*4cq,Hi>_9#Gg4#l?D[G7=#f>Cej5'8:^I=Z)Z[FjUb]k?K!b'%T[7>q?J\1Llbk=^]>4H2Pi;W]s=W(k!S#7`te!'6k3SB"sL
+%)4*JL'%Zf/<_KU>#^C5hS&*Xk/%1VcVi&eVEg,m!k/".fpNr5lLQN:_F,lYdD(:.eBPjTgRIFMr!FHlCqQ3]fs$e9F2Cs]qr'j!'
+%=PujZT*R0]#q^<?e^FE4P\I&CGeFTWe`=<F#AHq*s(nZ?[YGZ.0u6F1OiqJ[bmHta8QXqMND7L91VCt!#[sHN/4OsG3$1a_J^(gJ
+%PN/,T7:%sXO%2J at Z)K8IRb+W%dG7Duqmg?,+n^l6oPKd&5#s8JH%I*/PF>6PFdSIY*Y_"?IG;<bZ=lh_2WG_#onEYn.je]<MZ3]>
+%k?=!=-((I'dY/%Zb?%Gd755UM<YWmIc=cn<$ckcP/a/CgKr3+mDEr3g,"o'PX9R4.I,;Q:l)c:A5U?CfJqmq-J&,$>`$r;/bm>V]
+%TY8ke-&$>H:HkFfa=8AO-_N"*M)Z<]P!cqd9IJms9rBM?mKj#@F!b*T!)`AYY>OMOmJ]E<D:=BgNAh6XEh_/2_^utV5B5pZm at YK.
+%VQ at b>:M^q&?`8;SC"sdESK^+[`_Q6tfOcqn!Rm:SCO=0X*P$dNTgg]<l'Ti78Cf0"Oq9qQFlnR:nstfN;1HVS<NoRR*?u<VFAYEn
+%IeV at V\_uMUK at L8>^44 at g*%Dl&O3p\M9:\]&3E=*F.ApuTS at -F`rG<8kGaRrS,bEaMO(uPKERDCrc-SN=g!jmm%J3G'/g'[`MRLuo
+%rB@&9P1B/@E'R6j&iGiR+8^tQT/jmc#iKM!oLK<ar4XMZb.lq46IdiX]CWgAk17ZA;O)C-`7-I'-9q=,FUDdacW3eAMD.LO.;&<a
+%6c(hLrT%Q2@]";=KJRsZ!Qdp7'T,rg8TRtJ>Ej at BigMke[Hu?[cCBp/DS,$:#uKA_UI4/R$b<N4$i/INq]-*JQI?&uP7t?cW\@)e
+%-XIH.;mtd.P0R5H]`oTKEsQZO)f$B]f"?QHo&rWQUbiPE%`mmF%=;P;f+'t_b>58g^4mB3gO10["O&=W*p<,hnWJfVd'hYk^;qFn
+%0[<GuOAk*Dm^[JKZjC+1H3m+=lt>1=s1BXPVU/(dUhS8Y&*@<UoaH;Wj+\'8,t30hq97D<!e0^_gTcm94h%o_=lnfZKlX:+HOa,7
+%XDZKGp%>%LP)OACV%HLrr3sFME8X.D/U$eeWN$'k<jO\^MS\9?Y>qkr3HRPn5VJb=S##.T+$;4 at Cg+=*%+ at LM^#u1=8k`7R?/3K<
+%T3G8Uak*13'tj1QL1$!_p-fI&iiS&tc^))*U at PMk^#U9-K-#A[i5.=M;5%-t\8lTl.oSj4VWD)A\ilTLrG'0YPsElcqfhM8]pWte
+%dsQ)U.!=Os<"D80J]^kL0fNOLjOekV`X&gAQ`mj4[,VFP^$FGacO7qNHqgJs*$2K3jM`+<!9fG8Q7mU5$8`SR]!14g44J>_llP&`
+%A_2]kP\&?4!OAO4Y3!5<JYstK']:ftC1Uld[!!(7qslmOU7ap&F)OfpLYU"Kpg-RECS5GDH5/icar;rgIklm!2D\t6n\>ETWB;I-
+%,`u;a8MheGI4;/M86 at m%edue`ns<H<9.W[\<mOX=>X-X at H:.ImpQYuIH7-bes)a-SB*qMDC4;tK*.%VVjDtudm(&DB?#D[C'ID*6
+%B_9u689DO]\)gb[#MI8B<t4lcJp"PkgY*9KCpqUW9ZSgYb)'@#C;iNsabbQB[7EtrUbI^jALc\8J2sS at 9.>/L2VuS]:C+E(X;0km
+%&?a.N48,oaZ^%h!,>WEg_Y__P5`?0+V]fbYmbpJu1c<<3<T"d[h6hQ3N"C2]Q at n#W?=nnB+\tM[Jp9'L^671U*(k*E+jSPH"P+IK
+%i at 3j3dZ421ghllP@qG&7R26(\k<&BTIF^a`?%]4:Ee/MeqH&6`fM%KI8K9CWjOSTJR7_k7'<9D-H#4Oa`Gi2MjOBfMnpA,`q/%6<
+%bUf0sUi>9G(.>ViURIMo)Bo,kR<,CZeh.GM at gpO%Af<*UODpQ(f^A``T4)pY(QEr(;l7LR,6p-+r]#,98NGDE-]:.N7SiqU^nnSF
+%8=8"?g=G>KCTZ?#3%<=*6(ob$DPC*%$0[, at FoAHO*!j&ho'.'8>"@'RF)dCVc^X[f[U6bnHiIc/s61X8o8&*A.#!ujJodKgJ\!+F
+%DS,.0IKS7AQ>"fm1=n\VSM-3kNg>8H"`5 at _M-g6F+"<jGQQYN8pus-FS at __4[@XQ5J<3)^:]<s[CV&<0F:uo?8,Qn<#kJ[^Q,#cu
+%WW\a=?*fuhNtj(3"(LP7J=:%(6d?ho<$H>`oh?-+M56LsGo,0aQhPpZp00G<GC_oqiD6g#Nj\:Po3qc)DYiE!%k2P;"5AiVm581[
+%o"-peCpsJ\P1m,?hWEBSV1fsAGou at g;RLGTL$=NG+M/[Fm?eXs_pl>u<7o/n(M85G>1bMKq1"#/[Wf3hGNCM`\m+=:!TjjhV+CG7
+%<b@<s;+AXV;TbA=3U?4E;bD.]%mmeY"*\be2e#u$Kt]KoU;O9STlc][1r*Uhjp^klJfH=k-8AZIR+i9"dt?N/KOuB at X=2hSq4t*J
+%g`I@"WH5YuNdWNe/g0/ea]:Cc8&-%<.,p)/(Lg^5="g'08]3H9W'VhAcU'Ru2$kEqIl6n)_%6l'hS*S8;_L3[%RF=1/QNQd?Fb8K
+%j6hYV_)e?]@iHOkUAjUR;,FCpjeAlEE at 6ddcKHM)Qu<<S9f[cIa?r2u,h'R>-HjpdjO+Q*n;3)i!n3_7]3ZsQhj2TXf5'(8$7*/7
+%W\8W:H_'Edj0s?^,`nP)-`CXb/f[F[BdOfn at T$?CZ*#[omCl0Y4Bn]r5!7M2l4l5sSr[=OVIP+jPIfAE.DCK#%^"a+,.cNF/Q2r%
+%#[;cM!k6\()no@)BdHq^9dWb_4<!WLMkMBadY at AAfmOQ]dN6-ECa$#Og\[[*]^tg>kK2m0)cp?(`E*OM65E$uP"H21#e\E3ie,55
+%L)e$@s+J2EPB=4\!R-s#5I)BYnnT1/dZ6 at o5]l!OE]mhm*9b,;AKX?0#_n,*mddg=kutGL8/UE+bOIK_%d^60%/j8QKYkBuK59;+
+%7!G1+d(*armnV7Q\`VOC4R6:5atq7lIiZK\nTj3a8[Jg99*boqc&&YpQU&MbQuH96&]qtN%.7NeO_FILI]$^Ds4HpWXDD$LChk/6
+%0\^Is16lF4_)(I[4jm_I,!7:n(,FH!(Nfs[?r.;aZH-BTfh,(7Tg/?coGmV$ra7[,q]k(@(i[^0a8<2$IJL_d at 7VK_]::Q52WVd-
+%=0njjl.c=-:d"FYB:qEf'DtPa_=HMJEX2.KJT`N/mlFPi#/@Hl)VlsYng_gInDq/`Db at B!#/3A"]_@\r/T^=/DsVLX?n]@/A3SR"
+%mC5IHK3Jp8Rj1_Wg$b_b57/568iEqdir1<`3iR7mi8Ke#\M9=A!VE>6cf\qnd%]-4Z34YB(1bET.i#r*T5n1.:76e6"/@!8`?qqW
+%!2dJ(F\+/l.oY(-P]LdWA#A6W8l&cpha]RIfMQHXC7t)[qgTmTk.J<I)o.=:a<K0$K::]p:j,KD[s@)PHo%<kT-grl^en.Yf6qJ[
+%,ZSToTkJ=dTZ8AdU!90RFM'=1'.>uT#J'+A`O:]Z_3U6:5Tk#XOti#^p*Qu]ii7!EY11n@`L/B_F5J>'*?gV?f<35DF#1]3fd<&M
+%d+t at h]%I5`\>5i+pEa3U9oVgQ'-/Ibp`g<3=?4,d-'H-(KGahG_KsKNCTbjPe)$ssa+_g4Qq5r+G&(G>Qu(bFgjV.:40c.eJ+Kf7
+%m9U1b[KrgO*[sn1^&/FbWBQmm;p<&0Q<.[FWHI&AmlT8ng0I]+25_k!>"\6GJ\\rXfD$:FgN[uOdg/VH)p.CKc7oX$,G03`9l%2:
+%mpg8_V%DCS*/'ShDGWJUPgAuP4Mb8_FS(lfd+O'/P!O[rK)3ZNTK/gCA?-65o*el:\Ng>:K((>nR*R="^i/9/S$&sZfrM at fW=Y$5
+%h*:;B"uVd@:ft/(O at 6Q1('Rf),[+C/\CJ.nZ+i_74CKDbiBDmAF3-%]N#(jUhDr2NLSQ1]_Cg=`6Mkr(Y/hV3k+$^5QXtoAe[nWQ
+%oQB0rR?X/]H(L64=EGqG?[6J>ZtU^G^5ur+!H[+2Lc>]j30PH+Pl,mrHa`lMX"](EjKo(:^C.Kh#b9;_b^[,Kj5\1*=@#J`B$`!A
+%?i,nCKj2^VSF5],$2eOmhaT)-#AEXQ-O\nKQAC'kD7CH?S>WX^1AM?<?`nuHGUjU'24r8`$?AqB.dW]T*Dg at ifBVP_!SmLEe-)f3
+%Rh=TB>68AK\?jOUbAUU^=F/H/[H@><I_KjgW512=Hrm[$C3#p^gI_ObBmd_9N^&k at OpFhaKI>AjlJ]"M)+,)GMEtt#Fd&6rBEN3m
+%g[j at tW@UUoO#WQ^TBj[Ccc//jh2,atoRj^Y>#rXIWfM$BSA[fJi\SUs!P+LC+2%AEqj/Jt`\*<WbW>DY(t=n*ZP80FY6aQS#I3X]
+%IQ at 6YSj"&Vr)>7V^6hEFd3So)hP&,WG/Z^*4eq4s3a`:]gA.("J:PP3LhK=<eoP,1Ab+V6.@;ZOS?X3'-Xk6L=_qNZ>R_Nn*s#;N
+%lh$V9q<,,;_U(:H7YAaL3SP@^)j+,g`>jJ,VIp%^P/&VJJ\uNbK"/,\NABmtegLh>Fu,;lXUh8bSYA'RMaumpoVU9.R]IlV8RroL
+%=cK>Q*V9BKDDNIa,\sM0-LDMmlMY3%^oP]iII`@RJbYj:4,8^sXVeKV2%TBdB0C*Vj#G2qr7Zo&J*/i@`TjEY<$+\j!B,;!84mdn
+%B9qL8:cKQe;#ILqp(iF":441u3!UgN[H8e_Nng8oFY/`%R(AD/1b_.kC.Bn6308Ic9bc6\?#b`,+$):&-piRJ:WYVa\fQ7V?`_PP
+%G*>VuD9Hjd'<H')(/-6WPk0I<qSl)`$a]O)R8/cpr=LsepJ&nW4maL:CAT@%$]U?LPY at cm/eU_H1::W`flJ80PKV_[@;``3h!66$
+%eml:VK8b2am#hD7)^Vff0HC3oR[rd#+;KNhR<rtgML.\g63!R2V#ViSaJj#9=!c?J"=f".\(4UXO0^+B)b>)1p"G5f0 at 2&TnAn8e
+%A6da2L&_IEI(Rq_iRQ"c#>pLO!4)\?Lll2=$[.J6R$>AA;Vt'\c at Yq;;^it\E^,>5P]\?TQWaId`RKKg*R3*NfaI'NB'r/8:H+Uf
+%5!Cm at g/]-`2<TFfO>L(H-D$=1hJc//jc]/egE<fb&Lh$"f!gQj!T'aQLKlU\58TW=<6juiU_?!WIQX%MaY?.)^gbX19)2V5P at k$$
+%O75hGNW7Dh#k:GYeMGiu,P[WObL=Ah,a$<kGTnM;8#mp],rAgK^8u3d0]spW\eMW-3LKA'o<4"k\_sS^4q at rW&h*]IK1$\DanZs#
+%F;1pN$-&da^s=GJd!@;")No!Tb;-/q<Y[j6Jb*r53)`SGU2J?S4MQY>\a`c5;lUQdJdcCh!LbDKpmp&^5DFfM3phR]K[[AI6"<kF
+%2SLm;$-<BQK#ss4GouhprL:,0%@SjS"*\fP+:bnc5=/_&Jks^*/lk,,YHk%Tk2M(c!0_1!C"L-`;C"gMI,Aad*b5<$H<clkDQeI=
+%$Y9iYbjeGWq\KrjC!q-=O(5HCqUsWH/'aj`[1Z#Ae+07AClpLSkKAQjK#X`U69SDF?cmsd-TbMKG7d%YU<P1"VOSlM(mq8q8o^u.
+%8pDj6b&.KjD8Hekq,W:hO"pqVq2GKgAk_BCm3 at mGkFNibZ'X;YY#;]%N[9u1oD.!U`A at d*=D23T*kC\d:WprXmJ%7FCL/$L`PWb9
+%Ot0WheFTB2AQ^/)d=9'&hB/@5Fn97j0rP6DDOmj!FLG%0;?E3YOV^`6c%B,sm*MJ&cMsaN]KgsS=<6OOojNcKb[=cf at 4FM6?B96?
+%k:)tF;>[:);e!,i1NMh%D3Ds@??liZ?eb-X^!TGDLeb0J?jJGiXTR3sd<ZM;05j1hBfFqQFlWVSDi.+mq:qr-!r6`DCe5e42"k[B
+%[HC&1X>>bTf%'>:^8l6"9YK'?95aAfb!K"p[MN+H5F\F7%iraJp1CNDn<+p7-`Bf!kSHO9i<Los=s,9a2JNc0[:Y_#6so5cB#B>]
+%!nlsm%S/Q<GtjCAium%1\M/N:Jh/c6V4sr4h0=5l"Wl%\lD]/fkEJOILY'1G3]KJ/k6NccPmiCVHh*;3%<Pg?r]>2o<q_L%bLJf^
+%oj%gg&>"gZ7.,?#m=6Kh6DSLUZtl#eP`8qT_AHZ2QD$r[=r!^Pkih,snra._E6/RVG&YIfZ.HOL+#KPrW21-3.6j/P#SpmjEt^YA
+%J?U949SX`7,,aLR*_NA$U2tdIg)^ITC2RnH!$Ssgld<OMZCP'd at mQpi^s<.O*5bLCkEcuB.NnBRIQ.s;cm*b:E2rmRbs]>EL9pP1
+%XH]&^Rj>pFcYt/p16js5o]LNdg\r1oVAG5#XqC;C/#8_c-n+>8RXrjirfD.7'd7"4ZQZd$:"iH5^YRF(aQDS6(+mB*!V7LLQ!BLm
+%s3^B:L':_'l1l83Jb+[mHVIa[;U3Po+a+[bn\b3UI=e9o*u\d4$ST,_A*l,qg<Kh7hlto-(Sj;lrR%u*;K;ojg!=*.F.IK>;G+&A
+%OTYKRk,/ML2Sp+gT/t)B[`4BAeGNt7\D2bB,aE_OVY/D#D`TK4<?Bq!O^dq3:2AQIFag0KQ\q(gE6u5Y]I+!#ZE:-$qH.C8;&:UE
+%gI%"]k%t_e)qW!A.7hGCb_=rf,hr?NG'NE,`Cn?g3IAlqH.oZ(\kVP'XD+7C=?CtHea-Re^"N]`*mCf^Y"J6>-\!b at mUK(8h$JXJ
+%ZK,a*G(E-b2GYR:HmUJ#_01SC3V)f?KS?N_SKn]R,W(+*U,Y0afuQm@%\d<2Q#b1G<j^S%Eka`T=TIU$XHi(dK.sPW\1SR8W6(tF
+%XM.!%01i[9]Zj+,b:i$o/hll at lfbj6f[YTa(N/rW9)4s;KesQ\\8<P+DdmA\/N>gPmN`3+nKH4:Y@:)32+iRYlC\luo`TPi7n`6a
+%qW%B%a-Q&7]Aq&13"2>^'p/sT8BNZb>^`^ePZ6>l>%=3YC]Lk0RsA)G0fqtSe7"'44=eZ?kH#UV1$bmu_j&Ds2=GT\)8ng9s1h^M
+%Ia:tp9<EX.-[D<I`AK?;b@(Dj!oT0Z;k2Ipn$-ka%Q6]C;d=0UIB=80AI&%o*X!dc/.DAXmsO)OL2;'dEM<7+/d?R,McF^'Jrt8Y
+%eX at jOm/#9D>u<K*3WHAkrD;(RNQ,J1c6iLH(0$#o71C5!oE.fCnDp'CTq?4"WZr4dfn:q>.AuWM5[(]fqj"]T4RB95M%c<V8-%(U
+%48D-\nML'i-tDUd;['"d`fS\>5u=7eZ=TimP<5UESo4r<6God4GOh;3\W]fIXS9NReB2QhE/XDAj$)U;9s`OC@('n\/b5Af[Qaue
+%]-YIMSA:q"2F\JV3VN^JmFXJ`*U2Z:'GC$9M*d"H+"?g2BpDkk[2bcRjHObWpi%7g7YS542;$""l`f>CTSp_r.'i)CjB0'Ll7#*-
+%Ljao8cRp$Tgk_#hHc9d%qHc1rY=+r)J'b0D-RB at pD[&hbN:M>'CH;-:0 at KZU"3/[G%Ql^./A;M0F:$qE9M7G`MP1duE`7h]SD<fc
+%@B0Q3j!9(&$/eA98F?Q,r6E0kG`I[!4s`J!(LG7T?hkk at hIWU)eZfkXf=R]]`cZa at M'L@"7L+ID(6#DG,$s/*/UZX:&fJbejq*uu
+%Tjf05>d at Yl8O<riJ)h;J^0dO(s7;STV+.u`@loQr1N&Zs[):#Lm&!E0fMi#[0B8*P5iL2B at gQY>CmRh:k/!!*:Z?1b;4-FV=-A\3
+%6^Ni&G&qlQ'+["Za[QgmBAs^E>tLK_Z;(b8&,[%F]X/Q/E&T(h$T>8%Di9a/`&3n';UJcn;nAr^Q&D<>C8p`m(?>;8r;=j2AfJ=!
+%$l8*<QM&n3Bm+A-a<]6t]3q3gqo/m,Y>c*PDBF(q49]?8h_Ds771JPB,M at WBM6ZUg"Ho.[J50$JL-m])ToW<^)(%7XY)NXm[X63H
+%Ub_JH@"gq`R[lA,@@N,L3RsfHHK6+^C,bdoo?O8gENTeNW'\hC["SJWl#SV2fO^%S!Q_3phZts$]&4_`]\TTu.&)19^k1.fCC2QI
+%fK`l^0_>hVOOno%7NWVkgp[.DO2RI;dqa?/XdV:lH;h4?>DW1OQd:fPQ7 at f+27MVAX`L0r]W:>CTT]4XEnnP:oXAV7&6MY?9d"r"
+%Bp+h\=eO/skaX#5-Y;$=V!Bq:NYm)g-V5mH]mVet'(tglE\Dj^HD__m`8'^_Y"?5rUC3>?XdJi;LbI:>hSDA<ol.oCeLmO0a+Qe^
+%;if%1>Bk*5:9'bb]6+=G^(`>MIYRW;!\`ER9>g,H:sJ7kI82ecNW0-uEh(J)7`EK*GpQh5PEU4;OV#WMSE='<VcI,AhQ#inqhp)F
+%?^9^m4IR16BeQmb,UQ9,`gmB>.JpS%;154KPtJ5g<<fOe,FEC4fR%$aL(Zc,DOgueg,LP#lQgQ=[!dT,0pCA(^Sp"6 at WSO8TF,';
+%l*+?15V&C*N2aJSS1OsbQW-s64scLBHI3X!El`51aNdeY0(f,;_.nFjkL?);&:,B3@]%%1<,$</[M[Wu4>%'N3u5u/ZLE.9+7KI3
+%*0M/^mZ\1hSpZRWaKKME5_CX(Yf$qo@#sXG+mBR&:R)p\'1eD*B`MpcI<]2*e`@D*%I]+p-N:uIg6N0GUk6b0m^&O7X;;'jK9n^C
+%S");T(`^qLUV^Umn1YY\bVC:.6_.gjSl?87UFdn(-gEi/6Cs^$`(0]U]1V_NG_1>oNd5RIVf7*m4IR?T\=?f@%cN;:O'^A#,T3!>
+%jsgSmZHD7Ud*VJ&b7phNW>sSI;i\VPdh`@tAjbZ3S[_fP$14V+WL1aqE#JD5 at 57%H3q(!%X=pV58671dkF:na(.'WhP5`7pcPL'o
+%HLS!]M>NJ2qutBDW*08h*QtYI67).LXtOr4^Z=+DFXk/&F4V<(PGlhsV51&RHI8lM*DC+.G?[\FGf:k6N/Uq*1/0tXAQ)7iY;D4+
+%TYbn/-X>:LmC^Tn6J&9sTb)E-V^Z1d9I3/ehUHVAH4:Kmh+7LD8p/2*eZ7$>4m8D<i-l=LWiV$Ibl%B#a4ur)P0/Ep5<a%!>CJ']
+%ks9AFS7C$8ZW2#p?]$%5%RA5VL:roX`99V_'74e.;W5A"FXOuT=D3oF$rrL12V09 at au2k$5]*j6h'a:;8c"E,*K-h+mo3cg%WccE
+%Fq6Y<,ffNB*^-ucGN76V=fh[pQnCt9Moa1;/>Ya2/r_-j49geh1UWlk^sts/@s.\[o&3/!GG&%,7WQ<U:Eu"OP.$nW"^FptTpfL*
+%AD0_b8ld-eUhPWIEs6!ET'lF!(K[o[<lo?XC8.\kchLa]#<'_R1t$#L.PDK)HFHaTNhkjr+m+r<%s^DjgprrGi51p!5uT02Ipe-O
+%SZr`W5'sRaG.!<KZ^;Nj7AcN%g]mYRN%^6Gf^iLmT%B9,ghh7N![LZE"ub;K_N436_kfdd>r#UTISt:KP-RMk0#>O"Ke,.NTB?Mm
+%8dT31NVRkHEgus;*t>GR+S:k2"4J&Z"L,[V=0\q[((l`3hNAaQRKCq.,_N6ACNZSs;G/4m4o&#]?HE#,Mg6o3-EXGC22GEsf!;-1
+%Dn at AI3T0M'R.V0"hr(Ae6=-]2>Se6hcSHcT"YSE[S(W9[I?FAM+.E^-,jc<Udd2g>:+GWopje%uqnm9jp_QMQn/48gc=p'H5c%0:
+%BDjjb?RQ?>,9cA)"T33!b&a?&6$"C+1AOunT("sG$TmePir-d'cN14KgTV8*$5A]Fn8LY*. at q5L..t%Ib(mZbpLLmSRR!IA>#u?J
+%F-R<(\2AKs&n>5VhL,;UcmP+U0>HaVPEGQfg]?QWUf=i*U2?soW85Md`U3q$#T$^>m"<kaI#s^W2Tp!l at 8ra]:)e0;IFdt%j[>tm
+%T3DZ)'&j>(5i]1P]<[dV=E at DPB)VJn%\gV$JH&;dpgKL8<DYm*psull+-JC-guP*g((M-nYnF!%b#_\&,&hahrO8>e1rl^WZ)BJP
+%(fken5]cnhYO5>Z at 63DEc6<s?A+h`\UIUD4FtLg<!qmlFVW,bM06kLT-1Ymd*FJXt=$G0'e<qGuqXqacHVEAaiNmno26L7Zi?T<,
+%9rXjc;rf<XP:uLq)Y8^,$!%i\j:hX<X3#K-nrlCUai3;$)b<;hqL,V^H#!g_J]X$H`&_u/.$4u)Lgs+U?<t[\kOJ;^foqLa%H\a5
+%Z$6]sq'RI7T<Ilff>\D?>-R+MC]F)*Q/"4j.E""n%IV)H!*eaC^pm.WcWstJZj/E7j=Em;2a(-a^[[s^D5Mr3 at l_@#9bb'W7in25
+%AGFn;SC[ItYXc`W==)@)0]HdIgKGbO5;5&`f_2Od,^Zd5>.f(YgM-QY at eu\>23$+X,nY6^Xoc]p-3JJ`hfI7XLWu:*osmI><ioW`
+%A/[FTFOIZ'#q<EK:$HpL/d5VEA*&WG<5"?'^-#LI%XFh[VYm:b/bef1;grI4if_3#^<Y4$DBNOD*59T_mdEsPX=$C0>Ralf8Rb7`
+%Gp+_U[OKZh3IAR^$]/J$i$Xk]%dAhmp$h=U>A*]-=BKgidM!Fd9U<#,1)DE*P`2TgT("M^n5"R^=3I.h\N*TsCMH;lV[tW:e5%hd
+%T3B[hW?4S;i#@')"#>$P-JOqBH7b'.d&H3TVN^dJH6M3$s+S2[RAYl/Qt(TJG:K:3[WOSYEIWXf<ut4115RL^+uq(ImtI=M)mlmN
+%@_pXM;("nH9Z\i"4O^E,jh&af/l;lh!:t4eoN]VYS!R6rJc_<Xr%g(H8p,3ff!"\r14(1%^n$>P2+ALT14%SpIKP'`MXY<EVMl=(
+%jVLeI0'5nm;VkUS48"_VmJ5\jL"J7!gRo"8*j:J,oU%-MKelKLE3nfInhflN=f-uP2$\jr0=[Og2)u+N%NT<=2#D]80:MRsmj6VO
+%8<jlte,EdO)(aE\Ae]UiI.fZ+No\CP]U22m\k2`p:m2V&J at e4+>sCKu$?,K^#o+%Pf.6WP%%R-b!O4X()dA21g1("0i0aMH;(3M.
+%rV at MoQfu5q;/`QI7XEK2Fmk!EKd"@DREJqiSbA0!Q,VOC?#Ic.4LaT:G?4&J:;(Y#W2,<ngU)&XICEA?Q3[$D at pb0RKCWgTmd"D_
+%'JOc//#cdnK(FG3D!kjYN<A\/TEb-h^ROT&+InYI5YM('kX<m1/GVNtK`o=9j4)@FqFZK9mA7:N@)WE1[_-#0SN/ZZhP at QMr.=UI
+%PB*?k"A3F`CssX6-$^3K4(PNLr<-/Ei58<oa\I1\;OI0G,(.n^&A*'3\HW9;^3jHM]qSbdI;[DZ\5RZYq(=OeL:g`bTrHGqJ+lo!
+%Z,r+n8aHk=SE=X5-!D)AeAQglPg(\nRG=!(5 at 7138],8e$[ET"Ya_qI78 at XEX1A@@Q1O:ir3sL at M]pb_04El[^:%\+O8G<;kPZbW
+%SNZ]Ja69 at bP-DMn^OfjK1 at 3"+<E6IVn'kgmZ]]od.Xe at 42DR7*-^c0j;o55IQ?(,Kb.rdZWKG[ZgA:F`Q#JjT%8BQHO>n\YS\4qH
+%On)0]81F8Z`Q`O at 4p@_K*/9e0"Jl#0r4,!<7PF2qUMl]llm37="HjBr1?Ybo:-pVT=mM1+[\,8Y[4XHBh"Sl_R#"Jr^*uUqWA\>=
+%m*n\lKq_@,MDd7N1M1W&2mWhAH!$Fb#A4j+*A[(EnL;Ho/$0Tk51Dp:_>MsS-,R1`SdHaD!OW73]%>Oqc+CKQNc%XO]cGr/7Mub-
+%i_3?TVbMQ1poW4ZmlYNAYk_l?JeSt\F at JUCV:D1K^=B?Qe_Kj;P7LT-BZr8<),k^8c4]FIc60Z,hf7&H],ki0,n\J=[3n[*o_p$l
+%/dO<3K>&TpZHan-:3Pg<n9V66/]e"CjXe4SA+#`Y08V at 48RD58U,P)T#mB#s%O_OO.I=NbdVn\=;Wk`i+]%L.eDeT3^9X/#YLB)X
+%!H%*g+u<U*[Y2Fhc^BPJ_t]5I6a"h7ks#tScJ[;u]%CgUfiMnA8:tB4R'L](f^pa\\U_*gDs<o8-e\$5=q[H<UQ*2qd+P?f1<E,"
+%4GOfVFA930/M1KGg.U#>J%[46J,'8QJ(LZtPY?iV1Mt0WH11C(;RS0YB>:4/M$8s,`@F?DZ!B@@^.j'_p3TD"j81#Hc$P#*CBed!
+%P<1h9_XRj*NPRu\j_A;o"tM(ap.C18/"X06Ef,P'G;Hb?FsNL2&Tl at bgns)q;gQ5K^>Z3QR`]itY7.5Z`7di)4ik3 at pS<C8LWt2t
+%PSJ4DmmeJtB2p7GMun+D^/_);E5552&Fb-alK8%FhEQ:SGp$IWW:jT`dNm)%-H%*k['hokH4_)&\FG->3jF"jMcKR3`PQgH+!^-]
+%gS4>cCKYIGEPX>e`B%cParb,N at oup[HSWMZa^Tn;b<;CIeQ10<'=2OMQ%0P'hYJe98+KML5h,]%P=PgmCrI&5Eec1g>E`69MuII!
+%7Y'Ahdic,.d.(<YPMtGAgMEF%:_%1h;1h;E/W$n>)_p[4ok<)K\\R/(N9u9=9_!!F,BDZ:kJqmg,/VSKp9QU/h;lC<:7EcaF/9DS
+%+a%36)^$,r5>^W\6>dip8oIL)Y[2XFroTUp1"/@o89?0_U`;Cl+(r`j>i2'':6d,l5;4l20VA76qbOiVIH^<hWP*E"]d4&8*l3b8
+%8/-Zhi*t"(rJ>=Omm!\rNb+^Wb)MqnW9AkiUE!SYne*@=pXo(=mSD9J7UNm2cQ")5#6ifK<ltIod?T<kPM];V"cs_'/<rY:@Wuij
+%l8XCIGq8][r&N$D'oo"f:h[pRn!u!)a-c">VEjri8n<Ap&GdSVO91N.b!CH88,%3*G($'%OHo,VA`rS\1.j`9\H(gM)WQj*OPn`d
+%K1b,b_(8D,on.[gI^`LX*D"T_p])lf;`qIMr'p@,0Ib*_kB/]F5nhI^iHjEB*i[M/Nd,M1GK^PK[9u_Oeri,iONt.g3L?'D4ih at -
+%c!+Q%kg/&@Zod4n%i`\!0ABAHm$<FZD#[W034K at gEX241I/RXMM">-Z0+HEOXDm%f5mVM-A>kE_*YQ)15m^Qdqg-_N$0fQ8,6?*X
+%&[DFKPYOD"+/KQj(lLVk,4^Wi?1M'Uk"3t2ZQH5TP_u(?`CcS9fmVeC#=K;0cL3*n4 at 4:7DAu>?8f,N*BU<gaJjj/7K1\M+H7?1Q
+%Z*_ZSr$cl_;rfShg!.eJ'5dY*T&[I!"$O\g=5W,GE_s+e9Z#]O>(Xo8\f_u%c4'Md?oelJpFQ(4V1nm5hP<F/I/64^H*_WZ0JFl_
+%lg5VZDs`8KK1U"d&b4G"^*IVkgN%T^Sb>!.Uf=!hKU?d=2mA2d%f[nm2N<Wb]oc436FZ%cZLQK=<_X\g\THqADbtN^($`oOn%Hf:
+%M21a!mpiUTOX%@#mU0]m,cMkRG-'K&>@&H;ZR=Al((!D%I+:@#j0cNRA&V&KSNZms&=Y3hQK1qqD<QKQ9B=GQB"14?s#J5(YM#TV
+%B$+=M8K9:L"7d!^SRSLd<?`@-$`3mQ?JA)RqoU5?OQ+VN/"O^'@.cD:)$rk2C:7:QkqS:-Jr1;t7nBG$FKDg(ru3A.!Q2>Y\Ybed
+%%J#FC'CD26N3+NX'/HufP?u>2QRQOA_050T.oT$PgYKc3fVk't/ZA"r!]a%3NJT?M%Pb7bZ.HQ^;:^_Cfa>:uL2Z>uEj=N4ZYJhR
+%30m>78HuIQWE]_([>!<&B$lIKjj^D.APkF//+23h`$-hRf[NK!#Y at aeRh?rKekJh$4HfI'3k`k!;3>gp1U&ZAgLhdG>*B8PFcM`u
+%V2L*u(C*fqgc$Wt_2J1>9C)fLGLBAfi9:SM^-e/+]M6d*BPD=4]\&*6e=7"h/$mfq[jYE&h!%!H/>T0"9G^VRhV7n.&*i9+P0h-]
+%_;Nk at jG#sdc_m]W]iq^k@:/>G63R4KF4cqpM`3*,6;?,GqOW+)Qlm`9=V#lUg$bDg16$h0'I8'n^eB;K>;IACef5shJUnh%/@p'6
+%Q,\k at a\GthZ.5-*lt,co:E-B\Ni:,+CV?#+`F^YgD"k1 at T79Y<%-q^JGZuK9$T-XA&ZGZ6>Z"Z$<(Lg@=8^uf)egZX838+P.gc&m
+%bL!>.]P/Wl2PEek;[pXSM6am%Y5s>hjW8bsInsWN?%^NWo4>VtS3dnee>H-]oB#obB!hcf(R96jqLc4D;.nP4W2.A_4-6t:Q)J(D
+%(^VKZ@&JLH=LNC/IpEg_ngQJ;C''dnC3$=qkUqdiX;"6pXcEqrAq(<IV3iDgD at ns5rNpe+m&;Rcccr"2(Z?@p4n^.t'T7MC%o3hu
+%!B)X2qaS;Kr]]lgK&I[88*2 at QqVXI.S/\aY at D8P/Os69C@'`7/GK\.lRO?@bp70TmTXjqBn(7,TmIVBL<h2fb-,iu'8*70V3LJ!l
+%KN_1&RSVq,AXf$2+\Cr2#a*htgOdj8 at 4pJM-)$T69N7QP<C0W'_0HiEM0b:%%Jm\2(p>4(Op at S*f2/C5dfDt`^9N)`#apqT5!)'"
+%4a$CRdH9S$V+ZK,=jK7qr%8="Q=@9?'8Dotk)eXSmUWWV8d,2?-X1\eKW;jY6`1Zo;Wc!kDsqU=*OaD*^S[=Z_LsM_cEq^lKruE;
+%9"P]lLWNWCcaM_U^uEd6o-AfHWCiN=ZV2<;pZ2/'O'fi7SPY/;_1hNc<bOhZP+(fd:.#rdYBFkD9/ZPBbV4mCTQN'7!G5+p_(f&g
+%/dqZq9e<"ia"G(P!_[b=[cCt>EV;UO!:KQkQRS,"Q6NMUSOPX=o$&pH+$@@lmfb]Mee9k*j,%g>i=,]T>1&iPLsII&T>@&jS>P\a
+%pF/s?NT44^,e)gWV`&G9hbs?*6Td_+$<JVD?qk6skW7MT'0RMrB<M1i1+Ci'bAX)+I,uchs/2G[EgQJI;[lVA;tRiWQ*K;,.Z^qM
+%86H7NDASn>%@P^efY0A5#t0!/<hOCAiIb^W-WOO$UG$]7jqMc5^B\EReH at MPF5QS:l(00IEr]rUno>ggn6^ujZbYd;hZIXr^sEVl
+%.fQ[.&OT//5V'6C-B>"?-lm`u#WhRG^MEd&i]'`Him`s5fRJ==Fgms5,eP8qo"2aT8XUL$hi6sE<*:A0&mR%4,a=fPXhU[B`&dp(
+%NJ'L1#1Vh4"l!0Y?`KqE"Uj>n6=+7tm30O*peN68o7JU9:g`,CrnFHdNB]2TUfI9FduT(9/9Nh--8=T)-MJ\@94BE.-,F at 7hpd"t
+%#Gdc/IT4:#[=8Jn.=!mT*7U3m1)$qG(mXuDc4iXXO^eGj9tAF028Pq[U=@">)aOq9%OOkt'tfe'I^JD`O*SQ9>^=GF,p#XLOQn"H
+%btpYmacb>0#/;G6,S_'ubIQ^Or[gb/<p=\3`,CfbL#@'ug&<`6B[c0]l/8rs[(YdNch2Z at 4Ga55Sgb'b,PG_,1nXu.qVkG>YVI*P
+%S.SXRkK#3<cZ!+9h)L%k#7/0cN'Hkh3F6h9 at QTP'bPC\M]m+D?<N!K?<4bCP1RsucSO?]__>?q.esC/>Y2p7J))Ru8n\1e.Wu,5J
+%Tg=Psj1^$#F:M'9HKMX2/8Q&2&GA(/5)=<QWKp!0mj1af5(\i[)Z$#"4K#C!$ERZX]Lke0Op2uo]'tqhgFp\6eTA3D)3dj\mNOe1
+%4J'$B\#SV[]_,FERUk?6[EDX3%^rY#:(AHBB1MJm^fjQ0q1jG?8 at 7-dj*S6'oY$GXDXN-F\@_9%f+H,cjRb$ieecO-!Grs+b0#Ee
+%=Usm9;"<ObEPW-J>#nUXKt(1q.Og?&#qEK=Cti39dO\P1Dphc!rd=fk:.*HHE\Fu?W at jK(I#r5o3"Ahng[f@/"mu?"kDa+m0N-tq
+%3*JngDCers6j80Y!ElrIK3^<b3%:CD,r^coR9mPPHR03PSKD?gEoFNKfLF,>cO2+mb*2(`m1NYA*+og,%L67/\b?iLm]l]_0Ljhf
+%Tnp^oOk"_L;T\N)l.ZkT00R3=Bio54]N$SS`flhe4\5.ILTU"%2eSDT7E@$?b!,.'2DVAa7!5LNW=Wca/#%'KO/X-eMq0P,oA])j
+%&qV$#m$\WG]TdbiCcfJr<).^L$VbmV%'*lNn,&nBkoa6+9]Wn?<O2a`,f#6^&2"!8*6Is'`4"?b<-I<R#4 at r/odA(Fa4NO3\.T'@
+%JW"t\ht%*]!SV#_e(>sJam:nh\'@R>b`<q.AGE!/^%/B]rk@<Fk>EG&41R*,K%L1OhbTe-@'\noa><k_o]GUk"1s0NEPONQA+0'0
+%rMJ188r#8h6eAVG%=+g]:6P*aR at C=l\Nc&`Rq"b>!)sR_O?n";#p<5l""e=-"tZ;*@OPS^%3VF8JppOPRMoI691cgRrOb<Y;h^a*
+%Nf\WO'Y=-P$sEP]:H)IOWkn%_aXeh6Eg=Din:V[+RM88Kh[s;Bf4(OeE=]H"h[&0m!04gP3&=Hkmc5d>)f>q/(kl&Z[8#B9FZ-`E
+%Y8\WI=Z=)ls8=1oI!Co+_X5V.=Eohd6X>']fRG3(P9f4'^_D'jX]5oYa\uD>IXHl%n^Ub&U%NpVaXs6#CZS>>ZSSB?HuI?drS+q-
+%okWZ&iQ74gcj4p[I5g_\#rGqd9cheD%-A'q,LIPToCBsncp+JZQfCY'b="&Y2^'uUQS&^0:7>6RfVnihN.5PX#MaB$^("QeofM#U
+%f+U,r(\<D?`8'TtGU at hp+O(pS.$j!NP%0kGAH<O"GD0HEaS.hc"pN#q1)XSl2g:ODBV:H(Pg`,r3Vcm%,85%)I>VC.>!KD[:LY%h
+%J`Gf%g5%:uF+VHho0Oo)j[H#o:4h%>TF,]!:@Cm!fc[D#2.SnR5LYA3hH',p^((;p3W]WUY'dRSId;(A#`=UFaHM">C-*R-m3Z;Q
+%<s[M?*o'$o1fb"=f.g?/Qj2#Q][)#tR-_d=ZrG5]60r\Eo2&0Ums2!5[$Eq-s7`G][XL'dP!LduW&$X=Ok42UQ(u09FujmQ<9KY+
+%2QcAf?7CUmD6#t?j=lq<TB[LQ-X$bNn.NnU7$GE-;AJ)g1lL at Q!%\)VggB*sO3n%3mk^5NAHBOs\WGFb;(k^&8N(LOkg4&(JF?_u
+%1j9kbj(7gid8p!co(QHkPI.M*"<Sn[XfoPRH!)RJWT8Is]K^7OHM7"/(/h4oeasI,.S[mpAAPnZhL4IV?`$&CL*aF9D4,Q]1A:ZL
+%Oq/Tr5O89:>rg89+Gf[m,'nM>oZ7G$;Vq at F<;W^GT&d^Mc4n76FSSRM5F]ECp8rd0SPn_4@#4NXBJ*L=a),3^Q&k@<TbI$*@sA+)
+%3=?;#1b*%CMgN=JQ0)kr0Qh%eIRj:;4`KT2m7YF&9Fl[OY=bdu?VNGh9mt*,,dhE[/q8lHL%)!bRVFiqU^(`Pnl=2%BhDAXG$Aa5
+%&gr+)5Off[bA77Kkto6Y_!KI/dK+_Gi-1JCk=miY$(1 at iXcCm:(ltb8P*aNYm[dYBS*(IV,7MGq[MI(VFSt.$f'#RH!sDKNS>R#p
+%1q01rf&d%`+, at duor&YG1!sNE*e.k0?^<,i4tE4FZOi at X`[,c]`[Zf0$*a4M,Y21p#AY:9/q5[5Q.nR*$Wh2U',30G/SR'@'b"Z@
+%Gi7M$>>M,iV61Vus6i>e9T>B+Fq"g,4m>8N\li]dE9LeHYLD*4?=GuRW&Nu08mS9?<!#VWHmD.E!:>0/p_MKXojH.MrhS8Y<j1X(
+%Eu&.2h6qmFK12&Q\)^f\29J#cL4u8:7M?u]":>H=$Do0/3V\Wq,X$qdFC;iDD48%%<N2uKHe?g]^$L5"`I,_"$J&YrO=<l-8a;7U
+%AeF<CWFp>%ptFHl^UK-T:81\9ca_Yi,f9)Qfdtc$A3P)/W+)\[/"[nofJY$Ea/NT,N;NJAU\7Jp0f^P8F>Fd?VPYY4RY"67%=[&>
+%G(,)"Ye]tL- at 5]h#K<$?U"s7q6/kIj7/]lf$_GK->:?]IK/$Ut(&9;URt6/"O=AMAi1/6*?GFgt:%&DmL?0E2m8[j3W76is10HdX
+%+.#_=0ps6$p.T]L_;N35alVY>:'g*r348498]d!6_e<_1LeS*eZdRUmoN(SY*5WCSRr+6Lg3ieUp&o-IH"`@r^AW>WJsi:_/h?7"
+%'XF:%jh^+gI.78ZKldQFgSRAfbX3k^g-OX!A\kZ*AJn$m+A1S[8j1okj0@=uM-MA1,a&^+2Y??@PQ<S1*t$]G:6kOU?.5;_ at iXYc
+%+bS4`D=o$-kIGZ5A. at ONB@6u7kY?Bt\pn at 3&hULRq3ttMT/pM\IcGY2.4.NI%oVpV,HAO*gE"?69GP5<PGu"F<tJd.ge^\r6Di_3
+%`70*r^Yi7]s.t./(r)FLhHiWKg22T>Y.C/oOm5^T\>[*k88PbP?G7cjGll]VFiBJu#f]gn\5T3c at j+m7alKCa(JUKPZc\SUm6]q)
+%I?01R@:QB5j7]B0S$SK\E#re00]J=/kN!K$B4(=!!o:BnY#s]Z,Yt&$^&9'?OdF(637s[;6f(leaIC at nq=\oWoc/,^_^c*(U9DV%
+%qs6`*kN]4 at LJAW/T'^7!ap.)S-VLjf?LG`-op\#4")O.HF+"ieFM,!0<oJ=-jA'F%=A<UK]1IV(.DPTAX:AK]$6/=o2[1>\0:*6n
+%k%=<`c0=Gn#3mRbNLO15os`Tc/;*8FiUmnqlYX'gT'=RjGftk#`W,Z\9S2[;N:DZV(S[5\)f&P9^'IQ\,FPE,W?WBdPacfWS''1P
+%S?1cbXHCn.aqdf#+%DGnT.!5kJ8i"sf1d5;a2P]N0ZeA at jt4+\DLf$8rquj*f?(So/e<i9>B>dr0Y/8-M'#`NXEuVm&M(+IblkJZ
+%bX2JaYENgk14-T:-5R9^-F/p7dh>?8BrL(Q8R+0*o!WX8A337kmnHIFZLs8<T5^*8p!OdM+j(@kG1JKSJF(Y+4`GU&AP8f39lVo?
+%EZsIS8\D4uU">i32#0q=++juIb+ghJT\ZDl;WDr#/?-Ith7/qin>-A5r*FEDN.(:`2"p9a2SSFsC@@>``Nc!on)ON%Z4CQ$9+5&,
+%$Ne'Eq@`p/I!uWCfsZ6TH#NrcBH_*BaA5QDg0g/7,\p0M&l<SNdlA.+;kVDbQof\O/L^g7[g![hi,Zh81Sf?_$!#b)2.c,,D5O,N
+%">.UFPWDF>%5uNC12a<7e$'2Qo9jaUMN4QO7G%M"*:H0D"q!ZDWJ9pH'/kmEQ)R\]K;Vm[hf[1(q#&6+`,@=[c_KR_`+4''_n1ak
+%j]Ii0am7j&4[o at B=]*BBjSbrp$04\FQi,P!#'`:`?DaMUfo?57N5[<^A4nf'_-gX\f(.EIpr+sbSLY@%Cb5r;k1-g8Q7n\*]=kW_
+%P"B]R*[Y7)6c=JP.EnY>GB.0gm>^W)h###(XJbk[n2l-2,YGt3cBTXeO,Vdl>h7_%nh!XDluc4d49MF!(WI)\drO,0m\LliEq%0=
+%&?&ZNK;:ZnK%*'sU5/i^#/`6g+:aQU_:eX4qsEe$L@;n1?AD=/_%6;k+#m&;n^g\bT_pF4=l2hWKAr(&_b9Be"puHsZimD+Is.[b
+%b`2")jkmf?UlQ<!eeXB^Pkal1529G1Hi%;F,VF$B>P[J`PSu(C.1a^e,_pBU<@qpUJ.%5Y,LHVp778Vb_s2('KT!-ADU;.IbVCeV
+%Ma0!t]u)\K+B+'pZ4THV0#->..]uZj:+"EI^&E.qjLgi/EOhN`q0>^9TY''rUCu71E;DuQ'ae]N[67[A34C/lbP-?8FOlnRX3!@)
+%\)*tri:3ssDLpRAjPuutI^AFfq3_j#i?>h]*3o);+T%A,^*\=UIu9;t[ER)qDY?'0N@<P at R$>),kjB+*9Lc(-f?'tNdDD5kRCFqV
+%kRQ at fGd<T-8W\1dA1%nAUsVIa at +V<)0t"*Hm?A\j@[d at HdoU&'C#qrp-7.-76qQB!.'ri7H;jVcOjIFUOfr+!Z1CPdPRs4;0\q6s
+%C at l[I7c%+\j415(RL<B1BehhoLU#.?[sc!'I+sE at EaFi8]-\JVPg05EIdY_QZn_u#_p^G_F`ik-8/>^%d%\s`h:8!I\G`eE/1ZHC
+%MS#Yp]n]=r@%ge:hFm!*K[*(e=,^S>/=-uT3fbQljIeEJYqA#8g:$f?Afqe6!Z9Me8L[?c'!4YG+:u-U_jCjb`<J'qMb\aGopd=4
+%gWG0V;qRMkjXCa'*2cNu.8]2tUQ/Z*##%m7`,?:Eh77)C[MJ9oKn":*LV[_3bXn7[lT;Q]@T#eHc4TI&f?H,!f6dD!B1i0Y76DlW
+%^G]^_WUKi?1$0>QrWqrSPH=,eH8%0ml2^Gu4Jl+6esUgsbZ468DMIq=KI)>M*;2dE[\[N!EEd$@BQ#C$S?#%#Q8P_5^9d3P2D88j
+%$'$0mqX7+t#ghphPIZmH8hl.g=L;IZFR#'C_)#_<+4o'D+J\Z#X^=C*9@]C-`eqGsWeQ0idboC-*Q(@=3(St+G]J6%)&H8BT,dRc
+%TO>foMDdu4Sq?)-&:Z-OOtr=a2Fhhn3G(ik+\?<#euV9;#dR-(LNTGHjHl*I`Clt#ZrV2V-8qVEkT;\DcO1T&H/"A('I,u<Qp/U5
+%<J<]p[jJ$"B/rXnMD6!)?H>db9p=*")mL;;X'doVe-&03Ek.P2&K?$&2tGAknh<uT>%#Bro;FZ2*%220.++M\-q2XFR8uZ*4nSR`
+%]oQRqpJ\!pCff.7jpd[KG+P3/%h9bY?g*IP&pCRIL40H1PsU4fH/],,^_E$4ps)U at heCBuH)66j6LGiCpQ#=GpLm3*:WF07FqY&M
+%&[D"M+tS2?End4M4:T;7i!bMHJW^<H(3X'f[HhfU>)d$,SW%),/)3,=H,'V`()0VeO5+VBPE_FIFn;-smq5Tnp5UF'<bj>*5rR?o
+%E3KGX(l[JXKP?)dZ_0e3Fhj;:ajQU[@8c`-_^04>R5e$G-!2a(K+$q=j;Rn-3%i\2M%ME.PggmF3$;cJ_o@`Ja`DOgAR8 at pg>aI!
+%g$^L)Y3!IEIQ$;lK[J9LMnUnn^6V_[c?%j\0A-o7Tdeua(32JH>)6*AA"C=SNDulHE?`%AqNoH9 at T8p-aX2(Geco^O.?VPu<e'c1
+%^He'f!Ui&-_g6F=\$T"HCGtDi3WJUimO,IHKd:UicYH,Y)g)d35iFL>/2pkiJ;XQ1Uop:nL97$me<u`Zm\\p*T;4/l7)cS- at N?N*
+%@)pOs4QTW$omHARD5c-d0+?.8Mf5/WN8U%t<mG+K<PK[BG=)d2;J*;M1?kra/qH,61%UI*$stS2Z9XUbF)Y"&ePCUWnfe7IR]tl4
+%e4t]Dk7_]d\&,GW5n99eJC3hMjn at aEoqk]oFg(8re3t7n:/--WOWZV>PEY+&P*@H:q7&LD=1DZY(^&o>/6c>ck(l;M3Z(if"M51U
+%HX^Ia>H^@9-kP9oAW#8?Vk)n0l6S=9II9Im%,c_id.gkSTZ"Y?e25+!D*tU'pAAkJO.34 at Sk:X/_[u%".S76:TjhDFOq4BH<XF)6
+%"q`LF_GQt,c>eR'AO:Yb[Fh:]^b)4?Q2Nt*Eat-SU`fG`36[;iDY"uBJOJ<Db7K@/$++&d!jQ`ki\faC3l&:ORd2t&?U<13#aM[L
+%cRub7\X*%cLjDD/gkX^/g`A#VZ'f-dF"Xh%:9LWU;=emtYaiZ'%oI%2672o<]o[3EF#FF\?;elToWju`_P5Z%c*ifeH1EKZ#LB at Q
+%XD@)K$(\Nd*-pCr*'l(qA3pe%lR79\EU,`ab;R&D&$7dMZJ7,Q1B4-3IhE)]U:PZ2=$_HT&e?s8,k'>)^t_;al(#l8+$P0GT7,U-
+%P#Bp=4qC$2ekj[!(%&B$;G%0gSRd5\AR>J^AdWWOWMM236:VM:d]_un23N6QXa_*tDaHV:A"TqMiM&mWl/=V"5<>q#^N[*LAfZMU
+%0Up/_D(!#e]X2fS/Z5#R+?_EemB>8$h8iX65L2l^d2;%DS?S1j:,n.,TUu0:d:l=kq!a!qh1njf,Yb&rjI_ZX103boK6d!FkQodW
+%W0g7m<5//jF8MI91f>.[,b+TglNEe6/:Nu.T>XaQIUO'UIM5#+-&"u"+pb'Yg!_/30\YWT_!jaQ4Q(YNP_]AR\B:<epF61taQL,G
+%$BF/<i/:Okf-]NU"-,<DmA+a04n:Fr3Sq at IZqu3VeP\Z`jC\Sr:8!ho'<LfM&qS.,F(#oEQdB0D^B\/ikV7q\'J-5oNa^YUCd!l5
+%9oL+ at 0bmn*s,.J5![mZ:TWFfI`VP'n><e0_".]f]eUc%7?PVr%OAJJ9RT(Vo]a;Yr;W?ZO1reoRjCZRO.>Z5V%'8PE=K)si!A?%n
+%,jsn?=RJF-WuJr'Ymm.o"-IB2[JM-tI85pOFcprHfl-\E8Ic_]&?OK!f-gkTJRtSjauB(9F]Xlkj\7=.Fe`k*kprSYWfRN#3m"q[
+%M'":g5Jjl9+h=.J_Smkdj^24$I>*g=`W0Ce]k,>se'cG44/V`)7QI at Zo?%Rim?$3b=f#%hT:.@$c]bi*D\YBBXY2n+kZ_1tP5W(_
+%DJf?[S+mX_#U8T6Zg2)nl8,QI6t,)i(j:G!_(ib;5qHrTGr*Z.'6f/XS9IGs?_ONm,1]@Jhst<>F7D2`iH+rA$o3%(7]MB;:Sn.l
+%8P/]Nqq=LKlGh<"6``@Uj5DHd.9_-[Gmd]hKunoo\C5NTF759Z((4d0POn at rDn<A&dj=?.p0EVbOh;c7G;([)p&.bUs"G+D6'qDb
+%JoX:#DqPl0[)2Z'8(Kk%'id51"siC!;bGDbaX;>Ykm`g`P9%m=n7YTCoA5jWT'$3Sjp9WZ)8qJ;IQ[YE@\i+E]nuQt+qjbSolKC&
+%CK3i9WC@`Y,&WAu(qu7M at 1]F'b)bUSjH0ilGDJVec;IPG^mj$:=Ji+Q<)@&hC(VRG?N!Xe%*>U^+m5A6%F%s29kNNE!9CM80cnH/
+%U-#!BGs-_T/akCT=V"%L17_7)GB&GY!T,;Xpf]493_(OZ$;]i[\=Z\/*tQm]VpZ#F\DWoj'g4k*<nT8YN^_fN-Z$*6b<-&-*=-%A
+%C^Q&.e3GZ:YCu,M*_QR%]n&9<p*MSu*+/G><gE)D^(C7#Q0 at S$[lSt"LB+_+#K#1V>'M)nIR]Ci/Ym%cS;opqZZGJc_h+X[YH#jD
+%-e4k2_V:u5CP(\8f#g9(HEbh]9dEpRbN83kd"Mgs>Iadb"4]7`1_h*<qX)UM3Z!8DBL8kDIF]ZI"$VU>Ub)8(_TPIm\Fh5repO#6
+%gh'8*U&;<Ap>-XXe4e"(n:0gIUF.rX"(s9rp%b:tQIiV]#Q$jhi5s*)+s<fLilsgFaI'eSd21*/Y5Cn!9,b9>NTD<!prt8G7*GJW
+%05FV\'2c4!ZFTk';t\K[2D$QW at qY*&jHOHMq/"h6FejK0dACFE4:*bgVFM9N?sHU?1?K/P]HecM]=!l3M26%P+Df(D9G">W9*6]#
+%!$)nSG\$nL!Ta`,Q>-*'r/Ac;C-],[p"Uc<DR!N9X77p5l<mn8':IOsg:%P)@9eeP:S9n[[O$Sd^Vf3(54cQW5MZh2!2eS at 1,ap^
+%[FVc^A\1'Z"B>r"eEaj5AX50&g==Knb86T_IJ`mO,!l at nEK`hg8!D8is"u)r-$9BgE%`FSil*AEM.32JPq#]i+78'`bCUr&PTA+j
+%s,mq8HTWT(5qh6F44cI_cLRi8Dpc<XJK17O8qT5i_Jo#9 at E$<e3iIpPGPa(AFEFV:[Dn^u&!m`J5%UD]E<\I-80Gf^VXl'Pja*NN
+%,])`1iB!hWbO^.<-`@#`>2"YB]1rbJ"_InhZVO$\S`6OE"&jXTCic5!'hP.blf:f.Zh+,g?#s8BMiq`KH]<53`KDpP at mIQ,gX(@B
+%qGPe=Loj_KT2SNpT2+W]geN=EBN*)^>[CT,G$_=]\r7fDd6c"iHf'fO`PGAtcn[fIo(Hk at lbG]p$0`h\DNM+4Y!CIOcbTJ_Ve=*P
+%D#6ibO31Sq;UL/&f=BR!="GF<=hW.o)p9Y+:LUN[Z?sb,lD-Xbl15.4<d0hYe-B0,2+dLUGGk&Ge7f"Y#F.4TX[VYSe"q:khe9 at T
+%IIml6e:bR5S"8_Rb3.9<nm6 at En`3sOVM91RJ0\bH$2h^`9CBo8b0W8K at V8Xf:`5hQ1lu11hksLShTD"#*\`\-m:'=d,!,K\O#<Oa
+%Tl6a$8I at mt'!nL`GssEA)X//&MEhTb,cpnoO`)P at DC$O(b-,JGR(+kRqo8uk&>0hI+90<J0b)>1AlkJu-E$UmKV?F#n',Qk*6>h@
+%iX$M9.=s9<p9U!c[QF[.A?/^seDj>s;s"#43R`*]@(ZfYT^=%ggZ$+6Tec7Bq6rA/)4@'Fq\bi,!t7G>p4*oOVj11;V;60WFm?L!
+%2P+["<)bB[qS$-ET0>`jR;hZSakYu*dd&0C'R.kKKBA/"_Z](BrarF&P']3.`+U;;:RW[O_b*\]TEln3L5i09)3$"/n2#CAKVWg#
+%k[sJD;aRHoH"E*n5Kr33IZE>DWo\IcfCY^F4</VQYCT_<(@dRtl&/H,Y/'a7+psQTAh4h^i%O^eo0RD)nt;:/+ARUL'c.9C^)WCc
+%8M_)FP^0G@'7[fIU*o9lPA+1V.s\bT.0.fX-NC[L\a4CloHe[9[e>%.n+7%r3kF)@$s/i_>itm1pWesTFk'^%K1=!#i_T4&kGgpF
+%f:JVdl!odsfnWTr:utr%[F7O$i!BfZaW`p=a&2[2V3I`$6I1u!KR2##nJ4e764 at c]l>q(%YEg-h/LU4[CL2RDYX6Y,YB"l!6(`8_
+%"/X_VBU$rcJk8-<1SrW@]?RNV(`3gtb,5QS1MWmWIK<EKX,0#Wmdqj&(%^AFU;$,o&ndN<1gBG'RSVVIZ`S"/h%9eBIl at -k<mVBC
+%qb/O2H"i9"<oo$94.5mgrSh`f"??cA"^0i'!5rV*0U[eUg4f:+;DhjK-n=>??]!_\[24?<<S*M>TAt)7]A?'#n0:59TUtjA25?Hc
+%-Hr$V$hFXLE at .c,j5`X6=K:r(S^mdrG'g7f^(HDdZ.Hb1B]2E3bkhf,TuWD15]$6_,%ocSo^,>*D`et0\m25#/"<i-TUabU3.5?K
+%!(P[6/6q[ToB#R1o=Y7(2DU*Gdo!_U'pg1))W8.qSW%]#o^sf8>k^W3p(Wt-\`M.ug,$Qd\t#$:94GfC(G^]nYK&O_%hnQ$2Qp6B
+%:Cc^4"=t?%^OnnrKoN/CLW99hfKJ<[4[C&=:;m0=o+2t55p&+W[ZV!tk.2j',eUk(rpih=^"UAR<#S'o!@0cu"*,%pc/)B+SAZ2'
+%O4-a^*8.(ANl6Q[SKb$,T-XUF06Jt>K98jXH#%Ag]@i`$;Z$=dk'#Ss_XguN_Td3ZB;,p$LZ_kfJ^/pbl>%LbI?1e92+N<Joo9H5
+%k"ZID?a[<-UiF_uDl*-XrCC7 at T#S6W`Umn8lEE%*3g7-RV_,nsV3!6&\h:FaV^t].7BSs;F6MobO^CQ^BH:hL^MV+bDaDYE",F02
+%cZc_O\bXJ/*s[mr>=^+*i/-)G`*8i1,tq$2VQJX,Sg<_fm?Klt.S5?).n$ae6JqTu:PO<4<D*t%+bG,fG<L.Y8s(Sepu\s#jt8BN
+%X).@)QJ`1`(BTrPd$Y*NPJ6ZO46M?Q3]\h,D^a/H\/.Xkh[5NNl+#V,[+jM7n2Qer8-qknWLg:'BNVVu9JL;NlSm#$<#"@:2OKi%
+%UR,I-:k&=c_YpYQZ$i1tAXE.^)QU8<54YHGE"ZGj.4T\e_;)qB<+Uu9X<=CbRf)re.M1HAP+#H\<SEg"#P.$2A<D/PM.5Q at -LE%/
+%#=;5i>DT];8aA1Z4ELL=in8hHR!j0)NVsj<4Pu0c\??4D$q(asM<VK`k&jA?V:Lmm^lagV#l$uo1o&qES>=rWI"0nX3PX[BHe>M8
+%rQm$poPrG7QFtkD\V9-TLX?Yt=.GfB2CRR+8cq0:6fQKK%:_#*i;&GpSET"$0g2DQ(T5u(QO at N&[sPAi:CU9#8SBA/\nLBCN8L&U
+%S&P\nZH0IRpkYi"-SYcPW?UuDPVfp<`FeZKrk3J)Q[VY(fugu'4875do3TqWm>2F?3dW%I<8ZSKc.;k^EmD1e@;;Dqms$4Sj^MCl
+%@O8mh%Ku7-Uk)2dpJ9)SOt`'I'72k7J_&/MM/F%WFeN at AG4+P^Fj.NFH4KmFhDnscVX>maH!UV+(H0o7=]in#o3UWA&;&^>@e'8.
+%B-FUrKJm4u5cU'/lSE[!PN0q`l=EPL[t6lEpB!<)oqMLjA4"gdmPb]@F7["g29ncRqZ=2/(8bc/-'[KnhAFJ_3MAVWiopGde"U-0
+%Kk_dgq]%N<bfH\KeFe5I&bd!YmV,H1&3R&aY&aj_!1qB'V]Cj`"uhu](8S$iQ5$M5:.s3M.,eL5498*n[[8@%qrN,2p&QDabI6EM
+%jG/&Rha?p&&_24SJ"[XR:TbX%.@"`H at p_#6qaZPm-QaL>f_>_s:B_X>A^.JSh$;(f8Us;eVqEK5%+YMPf)^=8Fnh^Va@@!L+SESu
+%9a`VtL*^VrLHl=9,9D5%`"\^4^#8V(]\*KN00hHBe^bMS[\9n1JOARaBCe3!h(:!CV0l!n+uc$^aDnbm4&Td`B_P5WTl?0bP>Y:s
+%%G,a2&!EYcKFtmK#jmQL2p>+O::5be"]O\Incfr0"pk.sGY?ta%"TMMXdGg\FfY^aJ2k`Ihs!X5R#r41^m80eA4o%X24USped9T"
+%p0!((\0FVc.CZ<oJrdZWgS`,+b';b7]YGM_,UFpW6^.BTKM1$lq+q:mRtY0[@oejJPIGcc`[Zrgdk.Q]A+[_S-3u0kqHJE6VJ<t]
+%$D<mtX+#<1PbYX!;;X;7TlEh-<+F$JXFkueY#")Jbn7XjS??>K+csJX`1\DlP657fqi$uQ21I,6*>MiHQi^m(Ai%#C[N8JFdsIf4
+%(9R<e\#<4\4BEggKT^@1f"B=s2BEgZ^?Us1>#R2(*LD``jDC`Zam[+?/BJ!d,De!RAbU@@=amp;BALVGHkG[/7E%M*f93dJ/Ydq[
+%hEl((Q.?b+`X,>7m"n<29]G\2XQa;f5[Z(h?dh0jnmT1PEK8Za7M='a40Ar)U)/ZJo&PO&SYHkVGYUEJe4h=5DG&F$5fH9Q79XHs
+%8JZc3_^@$Q7SE,<_;Ws*]!`W>I7;Yn,!is*>#W:d1t8u7Lbb[PJl at poo@n9Z[q$"5YQ=b3<Na68+R"<Q-e^4i]G)LOH<^+d.[+hB
+%?[pu94A3td71bNEi6fU*.7$S6QK4'Ba.em+-0Z%ZJHYj7/q:%Q<91Yh,T(@[?ZD#WVJWphN4)*&YsGus/4$6!8q,ae>GE3i#Tj_K
+%=cnrJ')J]]DN0fXnk,EdcgAktA#GH:[4k6IKLcCI-!(;e4BLP22uRCQ?njKcQKtc_F$4<an\(&29--*ngOKs!;DF!cme3r1I@[W=
+%n"F0*)#<CW9:!)[E3mc"f;V#MQA$`lU9q3]3OK&TmWp=.S*A%,a8\lh3E'/C'W96)KBeZpZjMd)//kb*b*dJ4!ZmXM<&Vq6a(pAX
+%2]9CX6'4^&kE:2H2QY5^Oe$R/QKYd at gesRF.IU<-=]/X%,?!SkOFe=j1]c_LUE[>l%9eMK,QR7*V:6W")s.R/k^;#W-SaG&KB0gQ
+%;`aKDBCTjrQgCaEU-5gr<k7H<*D*`^6&3Ig:s]i#9K7Z1/<@XE#[/abV$esdG+K'V\HZ<LEtT+[mSrI0CTaX;82'AGP.5,C\8]p)
+%.*FKQr(IEsNp+d\+jWn[97SBVNI%#.$)\B1:#17QTmS2GQ#H,\YC+/qkd3E8<fB=gaT/qd6Q;Qtrfk"FB-OrK*T0"rJlG7id!;n/
+%/<1?/;S+&m">]I]Am5!fS2gpJ-hYk9;pfe-\B/Z92]U&&03ln!rF^hMZGO1C:UUc:-(99eZH@(m*kiBh36D!h5 at ga>Hi]1q[Dok5
+%-a2ec>t.Kf-:qo`X#Z]-]M:WH[NHEaf#H:)#PXJQelJTZ51ROiGCu7"o/dc6BdZS@:9`dT"?Qr'/RSObk\$aR9(>TPMO*FZPooWh
+%BS_GFc^WiK#1/`-S6DB6q.o0ap<`EMR8+"Djn#ZG::S^3UB?D:5rl-_jA6I0pDpRt&U,lma>A&/EZ<]o?^V0Ilh,=;Y!:m!rV.$/
+%cP=O_ag5<:`V5/UF=QP5W^:D`:l#?)g6TM0?:\YmIb5!+E7&5,:h-?2>M2_SITL3M)s($O4G0<t3=+-hh6"d#M^g_g_j*qK7M1"I
+%/A./p2bKpM7YY(eA7YLZog'N;[I at Rl?>\EI_tFD2]\TQ7<d$_9V:HVL"VRhgd%+rAIZPmQOrhGdXqCD2ef62Hk:FrGMj!Gt#5I:O
+%*ns!LFOACUrB"%8M?I[!V]Ht#TUA!F7FpCM'Z=V?mkth3+;13gTf9AN!++)'Brjbf!N[QLoNgpD<rR+,&on>$,Hq!nK='&'Xu<!)
+%-1q at e:u/O?+L<>U.PN;$D_#L:V2)YK3PhL/hd=Z,U@#8EN?laoYg+8S<1:p="QXP+R[&J=1iR4.,at6-jhDZ=!`\7^jq?'+:UM#F
+%SPti=+;j4c>dS3"ea.M/oKpGZYGsu_ragG=14DdB;tFIa^:0gD=0qS[rn&l&Zl\:!Eas'MkDB6k-NGYV0Ycr5OaNpd*V5-\24<r/
+%r4D.3bXg-LruS8FMpCqTq4Xo%ITuDl)*Zp4EX'minbmA%W2tOec?JZ/_SN<L8hj2]`pK"mB>BO]k%3EeAL4[Y+F#>GTW*b']oOpS
+%8lJX23h?(A?8h=1efrpKgiJOCY?F1CJ_;l9o-fo6lS.hi3>PL)F6^&)S*hE'-)iU).u5;s1RY"p3[aS.HCoDN`pBV.gUXVTbcOS/
+%Cll+(VBO@:Msnu_^HqgG&m!E6Yu/==LS2l#mo0Hgg.Km'/e\I%G0Hp8Sn1"TM71[pSHAG.U!#JS"VNQ\*lqF:Nu0-r&g6V4l`Qqr
+%iu5\$.Qo`_J`@Ls)`EDj]_fMlQCj3k#=&dcYIU9Brh8.[]Jm at T'GIT`T/B\t+U+a\o(nba@<7O^\<tU&kr>sB+!HN.dfg91jL>3I
+%'kZE?L0fHl\mdK$N]da6n$IjjZ:hso&:Z2gd3&u`E"Z3Kl5$5NUd[TkF&<esf2hYR"h/%1]SIqCj+M*5FTd/7,?f[a9t1B`$=0jT
+%j^?Vp46FD]_.1nk6<i`l]_l/lJpV at rRJi6nF&@i9_7/<k)fKSA2DTE at G)^Hu1<]N`\@bSQ7cqjh5Pf*>>mPB/ZMi=K`:/<kCP=3d
+%!fE61<+%`6Of_4ef4h.>PnYTbF at uP%DL9^%^Nh2D*7dcg9i9%bq at tXkO3&^YK$ofAJ<$rLJ=mO+,/7sk*2k+Sjt=,jkY4-TXT[CA
+%$MIZ2eAh.UHfjSt!?Fp.%6n,'k9+F.MYVfeT?X,]Dgt-/HjkF`"@^L8$Q4phN<b;uI$mSQ3OIre:2WBPF[3+.SKehVja`O,r(]]t
+%\]N?hDJX$3]"eSaDJg*KDDUhC$_01u!i62j<TZo$,&>443C3L-%5Z1%SMA30.C4:=V=r[V]opDh#Jtk#CI)L0=1W]9rQ^rqS3=Ku
+%J^2)Si4G]+NBm#m^l5q=niLLY50.5<aK0))mu:(Bri-Dri(aVQl((pIoKZ?1fsk3CBAW42WX^o$q.!Oh[[qcI,fhspdT0,>5l\e%
+%p-qZt#C1:<K>V'-W(-hDX)Q_K$4MLTTS/kqoP#nI=QHh9:Q:t*mFptSeQ1eiP2KLTrc=M1`2rb_68+o(I&`D[q9am4U<WGjcV(Z'
+%%P!-9rTO_iB090D`OOD4!Q[$M-N;9_oV,6T#XZe'e=cET<`_6BSA9#GU7R<([GKfo2;/lDi.N!&o[DH/:L--*o0(bh":Q0X'1>5h
+%9+AEH>P<b96W/6Wr.8O>\P&`Z%c;<?l:p_uI=8M?G^#I39*0J#>IMa=BdHtmEJedY-+Y;)"Xt'9i;D]RcSjXPah$BOm#-268K?CN
+%`0)NH!Xbk-fY"N$U`/4S'pPmQb=cci(kt%]EAj<X`fVK216p8ci^Igo^[S3?YGGnXUpQQ!kK;j6cc=1kkaYi+!'7E.Ju=(kUHn'B
+%+.=WqZ@^c8Xpu\a1U['V#kf<i);3)R]$mR'9[S)^c(.nNs06[T8TODbYCQZIC*[#hXl]>!s%<VM9r^t=H(Wm69XcU9+:/*/ko0t"
+%njk6r_oK1jnbjf:9B0XmS?]K03eXS*hblF%frcLPC[QWBoWT&sDkB4@?5`]p?sF&^\pqhTgLS'jp&km^L<Wn9&32s/X)c&'?`K7%
+%Gsj2JFKNe>V at VJfo^Mo&!KTX`.i)]ha\%[FLF?Mh"#Org]V*a"$Znr[d2QtJS?$e*;t4Z`E8P.[_bVlRO@<:Ge$`9fCpUs[HCH(O
+%TI_Jc$Hu]#`&7'f;?^sV3D?;I9C3`Epi%\iL?s1BemD?,Y:Aj%X\a&)^6<g&Yd-,F1m:Z):@5X,OSOe7p,1DYCJU&"hu+EfihP-o
+%69RtY2e^FCHTF\%Csmmp7gX0s83_<nLq*S6]t&bU);5V2"KueQ;75?!1]R2K?[WGK]Y-J`$@^_&;_og&oiU9)467kXP^Qp8j8:,>
+%C,ASVCqs-gIWK%k9&P(+ at ZHH'7Sle<=>HCI1;3<j[ps`im&;A:>%m.ON4";o-Nc,l_Y1'*,N=[S4H'r:\gI%9A?]J*GpQcq]?dT]
+%;Olh;o!GJ*7TB'AjOqNt\@t(:m_oFfE"3.mGi87i6F=,6"8O8]X)5U#053X6-[RY*X8FpdPEPEr59.AlCMNNA]+<Z02+QT[VS*Rq
+%L=?TQb3>p3.9%g;S0PFMb(UPn.A=I9<k<=IK9>aXF!m:/R7dS\XcDtVdmD>m9&kEdZoUq+>FBeUW)559?B.h,(FnoDKP`Z1,)iVe
+%%m!<s at Jqs4\>Q,eaI,fZ*ErEdYfjYpC`qiYOY;!PUflSL7e:^Q/K;3+$BSo.P1m"!SrLQK)qpg,GS!?gM7jOCo1KP;nuGO1JsM4*
+%I;i2OkKm<=D2_0\HoS3*\Ka&Tk<@Mj/7q44G0NTOB!o7Z=s5#7ObtP8Dm4A%.[W?a>Zk57/U.!BVEd\HHpPSe]MfH,npc`1bk5>_
+%NJWg:C*[29SA02 at J,-aMYPer50'>4X\c!+bEu'?O9ZejV`o%`cRAhu%;;+qC.#cGlm@/F`3BqFVd at Ucm)VWnP@\'I"!JhHsLA'!:
+%]Re.5N\asse'!#$Ce\E$e4Z#VoKT6Y6156H=Kjmi8LgD\`up-N=K8enStsddd*$R3\S]6uo/*UYjf%;5d^8.!CuB'O+[MUOD8>P1
+%q_;rD;aKJ&Z67q)F`6A*.GEHb0/GEeT)GoC:SEUO3b!L;`KVgm7IC0V!DVUFU'RaqJJXR"j9]DGM2H\\Q?"5\%8l2YdhLfL-@!d9
+%Nud0^_DAT/GrPil1c!fP(m($\P"P/Y2+j5D*^+="-#28.[C9FF)J.?,/fWI='o4]1nWKt-<>?+CP!Oqm=qKBiAq$^h&`Q9/#:Z?p
+%1LIQ>P8Kq1oB=^=L4?/;AZ9HS+&N&sZ!86)o]N^NN-3uF'WR0hrTKQ<W?>sTJ8LC\]t7rfg at Lj3FJc$YqR!a0=oLrNB-d6rIggq\
+%4%iRWM`Cg9_9nH3$5#1(L]"p\8;aD<?2;h839#o+#e@=tP=!qMa6[N/oillk&9n)MKu'GCp<2d0#@]_\Z`giCXaIR+jnU]gIt6R4
+%2o816ipW-d at a&9H)!drsW#5aa)/SXuK.aX=;+J'lgB(n'gMI7@\V8S6J*q`&,QEVui'9k%]>c`'-%VW8"f$@#@3p:Xj^1V!>&RWf
+%C/oO@(]D6[i2V2Zo%QZL3,1]-R`M.n>Dgn`;LE2[T3A"^dIZ)`bLpM\drFAkP7*dGZ4A%74#6!eO/DK)[BsqH4VN3`VXbOep(]k?
+%/#8i[d)rN%h=f.s4`&k#<`;$9QJdH255Lb*)VAoH[Ya4YhoY.DXE+Ao8XWM%=p\p==393VoN'g9OqcTeVf72OXIeS1VO/A6;q:BM
+%D<oKlZ9]MS==I<.s6nHG9Vn/EQ>/U%oKI(+>WO9a%pKCulSn#OjUE\d2^<ga;8gN^0r at VuFqEOigp\doSE"^oDF0:g%5kQr at kuZ?
+%^Llb&,)I'W.2BSWio6+;`;c at KdkjiZ=ElCtm"&?rAkC9_DC,Z4MM0u@]c8A6duRo$&A`Cl/i5=`I,Z;aclR;KX?Yn$1Lt?0^&mh8
+%'[ii:#2B?D^P%_7l9OOSVIAA1r77C2S4^ds9MS`E-dj;DZ4fgfrIS:6-!.Z:jqulr%_C)75^2,n4D_HJO<3>_qrK"ap0b)kYuqTn
+%>XZdAkpQBT?s;huP;G6sFo1`jKU0ucEObR?3f-D3Yt>/O:$PuX>eRaDAQXg^XCC&fAL529+sjITcBhE15_J`mHJ!TZ(VcMa/dLM4
+%e,U8[`r#c#Pc$RADOjZ?nM(93h!a*s?h5F at EaRuBqd0(I-0Ld=1,lI([rLL/4c;0PWrhZ6*(r4S:Nj-GWe1aI0BX at 7F:+Op;#49=
+%B_.sWQfjHc;Z"XOAY2:qisfUs9S7fOFc&+Nb?NCOoaT]re"0q'8"s>9iMBDBJo=K3^DU\6^sX2Y!d`[C]NN.43-u&!$R8jCom,m7
+%UErUtid'U"p(Z77c`,Dk?TuT)8tUE,3sbg]defoWQt^gg4#+ac01bVTVf]4Bb.\ZE[Rs[l.lf7KI/*o3:Roe"$m/08?^sHJgP2lZ
+%8gU at -$BhopA9.opXF9rpYNL5#>:`m8[5Dta].I3PW7*S^a*`c&,k*[6?s`+d=(Ji-Q8-\qB!h at 2r:6\%1onKLS(7YMVaR=C at jnf\
+%2[$_&U-`2glN1JgCZ!C9/I`E=M0H*7mMAo*Tf?fFr]R5s\]E2W3a$Ca5USGmpn"&H#W(tci1SjS5bf;Jgg4h4&Zo<r=oCLQ_G_Mc
+%-_U,]j0/3^[$715 at A.m(>L"VG/Z'n at VGd+aDt6JQGk1ijGNPY(2tW"=6sJ7"b0_D9n!GDcDPE$!)H&7)i(BB\JH04:bmGoGaLp#8
+%g>;F8cZpBorHFt\);OP^oq.b)ol/a-LYh5<)9(sA/%@;jY)Kjq8((ru2KhMN<_pSZibNGiKl?T[?8:PQ2*Z8#PuB\d"Os(],=Q)b
+%Tt(3%VI"23-5?8WPRk-t-F-?`AKS=BX%j+H/6bHf0CN;<-IQt]lqm.G6&n(r,F'/#T,qnLC<D`/\\rGNW1GX3KkMSI-0dTa5hk35
+%pCW'$kBj!u+PB:sA"u+$5[TqBk>TS%$/f%e.aRTlQKKM2TW^<A!:uN'ZifImV%^nOB\5/`O8cWiHq.#m:/,Hn\BIqC<Hot?"Nq67
+%f"@HgBM%O\#]@$DD$>JD?qPs]SNestn"P<RS4\id[<A1jn19 at W0cd4Rh+^J)aAd7s#>%`.SJ21[dXh6_;);;SSlh9]EJLdS;j+-c
+%VsN<`jP/O&MOa?6Th5+/VI+\SJJ,1br!$d+,[rf/W21RTXG9nuiq)coFQf/;kO_d!eP7SfR4nokh"f8VnP_10_?-b</Q/B&6bfmE
+%WVS:%EX;?i03=HT!Cp"Mp.rKVM[Q)7Cj1b3G`Za0B9A<p$7`-:SQ,<<5Vu@?l=SV;A!W$5BF at kb3^2DqaZdgA4H8sHOuEIN\F`KS
+%k(ATpKqE/#n_Dj=XuW<28NGoK=qsd0hMmX"M*Tl!5+EB6FrhPE(YGY[G%e%.B;/M4peF2&*K7Y.c-q+LDMJ^71 at O!%^[h&?7TNem
+%410@?F=7r[PRdO_Q(`Ik>QIP?2'*DRke"RUY]YX$?VF&u+^mj%JRp9YeUpM6$Vgh]U<B\E'%<hR_%VB[f9U/Q.n4rk.ni#1]i0`M
+%#ipNPbOI7:"sVGecf_W$HeHGT\n*l+JcC_VAd[-PmG,rsM*^,/3BRU/KaLP at Wm1*2P\eSchi2WDnmh'n[TP*Mq)u,\6J?m]1Gqfm
+%c28l\Ji/oYk1!'@*N7d^PFlPC_,s2TI/r'']'.pVZ_cFiQ:U)E3^riTPDB5%pR*KcM-qio?p;DMV!+:*%mA8##kHsnp0f1e):WG1
+%"'cJsK)bA=ej#)X_+QnO,Th&gSZopj\6*(^cIhj_KAn9-OMOLDnF<t'%l]7h+QkonF^8c+Q&`th8,;9:U]gY=SF5(][=6oTBuk2T
+%T]NNDd&a>$GR>NJaHd&o8+'$DqSOD>m,Z%#A%1AqR0P!WIcLes"1c3E.N>_DcV6u&QLAgW0^`\Xr4CSLeIbR?$0lB9/P1fT2oQ&.
+%Y7JMgqfMK!AnOI,Bt?'smWteW0S'N\8P,?-cdi2654M`Y:(^0).kd(49hc$B7/edENaUe-mueKA.Zdks,*f#ROul'h1O1[\[)bkf
+%CnVDcO^ctr4-6Ys6/6FFe\MO<<5+$]Hck2a>#+3d"*,f!<7/9O4e1o:XT?GhIloV]\m'Ve:3k0<TgYu]o*h'#"f!Waj'st<h-A-T
+%Im50/eNs`4VhDqE8Ok1Q&Gtj*bF1cDc;BI;q_.fNHSY18d<a'.dktMFf"YnU;bOI#9(YQP4Jp+.Xi-!.ZGl8?%DU\0qU46+Clmgb
+%GYI*)3(Op1T-TO7j2>3!Nl?SdRj_=!3SH==8k,kP1Wk>fQ+S%uhWaHI#g.ou_37s2#-#lp'%b9aUp9(5(9!FdW*\=URu4"Jo20ub
+%XK!U/&d at ha;L%8g0`B['>[;EHTju48`%laj/@m)<cjjr<*/S`l'E1:'rT-2Jj[KK<p6F:T?</W5`4MA.gSa.]j?+eiGKl?GRf=?\
+%Y#JY!]r6;Z,g_6*i-nTJ)&?ZN;BFYD"ShZ0#n!OI$O4^JcXpej6Vuf+;86lU^n#7$)Kc(@NM+1[+(6Pj/AKN-c,Idjg["n`O6(MC
+%0/mug<'J[g;XQ6Q]3!QDa)M0Qhirg<iLG.dbuDc3QsM%5C$b#(!+\6Hb53+9epI+HVa5Red"+6u5B0D[f#YQO"#U:!ZsFVNnb$Yt
+%"ucsCm)9V-SmRl_ZrsLA.Sej^[$aaSl3=/8[JXMa5[H4d;6puu>`J9fQhifJgGPAXG=-O%Q2 at dkMo9hC)!seH.?T52GPo?DN4n8]
+%J#l`[OcX,HFVgn;Y_P at _LDHV>\ZOMH*6V/?b$[a-\=KC(LQeAA8fE*PkTX+nbc+@&SQDhWRW8Ys];2d*KQSlFF3[#a'\%"`OGn_[
+%UTHW@(?5D!<k[Ppe-1os\6BUrqnc.&@h\$k;Q#$8AbZ1FX9W=ta!S>$hNQR4&@Mi<kD&-;-<e01O?#AtA?1l%$5jFOG@'li9s50?
+%;OJ"5JuP5]j`6!;*"LV`.aF;AaR"8["La8u#64uJ-G0TRXEhhZ^^5eX]q&1]A5<h+fX0h.o'44<H7#P#A^%2,oBD4:VQ35;_>gAh
+%_2%peeoblUme=8tZ.qki=P-pT5j'-c&ihO=&"Aq74Z,4E0RN at 59hY@_Qk!fY29:\8np:\XkTG7r*E+"fbU;i?9eJH]e\8XLLr$r7
+%p;!OdY`)LEojGYgclgqQdANY[(W7&]m]TbY%CT#(;_*u]X]+2T/'N#K$$6AiN9$-`2_mU?0aYoA3i3VL3t'iVAGV3d44OrDn\n*k
+%-7)N at X0njro?#<HG1`n/*`$UeL(2(mX+pr/aX614Z=_`^!_DbCR:gDHpa#8!ai,X+G?b-PWUPi><$]MBilE?,?p%Zmi*MLmPAcJ9
+%GYq./,+;3JgBmq7$l176h$IDlfMhqn4E%57%ZTiO.W]oV4[G7AEKo3#pTi;jc[s7b:NCN"Xi[]3RkmWfg.%(:Z%.+FF'(b'O<l*i
+%hu&k%-KA at a)Y3Z879E=nE67i#[nk-=;0(VY*S=l;Pp<- at ToXoCrk'5<Ot]\ljd%.?1r)lpB>d_0H>^Hr"^0[G4RoR\5*&iNe#;Sk
+%SG1OJ7Bic_ohDeK(dme-Hu*GRA%=XUSQK[oGtMkHdRii\iS[A8/Xho[(rquDkP%]eo!a\;:1/?\aX"a0;8S+1,KCH+G0%3fqTQ]H
+%agU\&fTUB45p_=5d.R(n5`HZgF0S?j0,CXgLfa6- at Ml<lNT-U[`'A,gjS)l.aWoN)9M*8E"9+SiD1[%9j-aMk<j!im=rb4^B]qg.
+%-9+A$b0`f_>qgEjOD_LTLGjTV!"MBcIOZA$(mepI;^b9"(mp`6pI at OKZI27r3u;fG809\^F"4E7pQQ0p.c^fU[MR+3VZ@=3M<TUL
+%HG(/-jp$7GI?\6K>d-('Y=\R<;dFb\`[0Vskk(P\h1ul[f'XLO`MPB/W.l2"jmc_C@(GJ#\fM@>M)42m+0&W_6lmNc6[aIGB"g3<
+%P?a\c#ghc#jp^G5^\>5U?+\:[4q)ApVZH8$]SK/"fQeHd[P8/*Lck;4*P9SNhK#:_o$hC$9HL\cWPM:h0KGPTXe21pb1>+k!YN<M
+%GrBS$0^Y6,!pDPQpr2VV at B:s$jRO9tfq(N#MN<OlKGTiN^MG9%X$YT$"kdmF_5R_Q8M5o=i+)0E<V$XEauRa7l*JdN"s6&U4>3C5
+%!L'=rk4RJLCi9YMW=mPNb=@=Q9>3(f3Vt,$C/d,MIPsISRpo8C&hiifL2fE3FA`L(?V"N0F;lKl4 at T"!A5H[UB#&QaK01KVi;7qW
+%%"5;[r,7V?ET5:JC/9RsrcE#>a[=B.Kq0,:aS&:&M(*`r*N-\WP+h&B(T"Q>MoV!F5.Dl/pGJ:ufqDML9**(V+t")2RSQB6h.I5*
+%fTX;@3]1i.\/>Uf]KmJ]$#,(W5`k?C9lkl9Z at 1=\*d#_H".C12j8sOJY@$>6"Nm'RhBXSWGnMm)O$"sk>dGkQc`:3"=Bl[uW3k.#
+%[$.QIpYeKfN4O'*8Q,7r#(fef9YR=V]C1)a<\?OcBOr_DKEeWVC0CMX7'DMT;MqMS>oQX+(/5M^SdU[%NB_WZ-#Z at M#VOk5p6<+e
+%2f>^>+$5SY3i72]'Se)iTi*SL#YZ8_BXD^1FEB-57C*XJ/\1gflB.$B[^&Xa>2rEI1lm!KMfM_dR&%0VGI6p&:EB>AHV:_/W;Xo1
+%aQm(Dh%P6,O>8[im5+Sshm at go]ip^EZ/hc]Zu6RN+S%?uoW;rr0r8(R`6;W#>cF!R!`>#NreL/5 at Xi4M?c7gb+3sF8/p(R7SY9;`
+%]S2Tu#J6VobHhM>?Eq5'6*AKb&9EX["!sK#GeD(c,FZYAKob"s94CGr<XBEtgF2[uI&fRIOm-PZD-n:D4=dK_)gaZQVrLlkV`')(
+%_A^&Sr1K_2??r at phrVH9GH*[=2s&!O53*no7$Kf`b/eZK?\>ducKt#sQQVL=HI$k?Rp$M1DHH+ue:k!&.h2#dqr6h(,h>2aOfFQ[
+%JIT.FC>RaD4$e$9DuQ>$Ce1sj\@DKKat(3-A*PP+ at jZ<OW_^n[NS'F=3+3cu??@7R\#Dt4]GZ*=1.TB$[FI&N_n$"K1SF<g6VOc2
+%`AO=8iEHU7Dt_qBs0U].^0P7o83,&u0"GPgkO. at X0*J1KMt^EP`h4d(K(CG(11d^l]d66'g86fRR0U\\q^\#4*91mH-5%i."8Do_
+%?nY]Y-4rQ!Hd^Q+8f5qQ:4K/U"To,`PpeK!jjnI!B3fI%+6ALeY\Zl2`YCM5_:m#DWDL=)+VpFoqZjBN61#l0Og!.-O4-TjT&3+r
+%iI[ID at l;`WlG!1]`"b]?XZm3>c`>Z\?U4temF*l$FTMTp$Z at 9iXk[-T<8"1:"T\m`1d/V[=-C[*,(IsRH^]N at Q\+>7mc2s39c,R,
+%4a@[rB_]2FP_I8#<GZei,`TKbc7RWohL%?)Qa)WHNkEQo%Ibh$VH.U&l"g3^V]$,m7uBp^#qdKDV>*U.S.Z55g'N+0C*&4L\*1hu
+%l=3W*GWg#)'7#17o9ajnj_Kc.$+S9`:%CT at qcUN9S'9:U0a-oJFk,:t'MT:;8S$"@`T3%'(DA7C;6RET"+"d()\rX=;tECeJ(ZX)
+%R)/'9YGi5mnsg at GSq9(ua#fb06i>3>b<_d"WR>O5htF/L%1Z++n%6"W;O_#8(tIge^5S at QT'`^\?-PsF^YdUk+4macb;\XL<)s4r
+%JMe!2c4>m]3f\mt9qKt*k<[5;=G??5noS;>Mtbl.e;PB5giHAQH1/0KK>X'n^X=I\SVtEh0"V\7aFt(^C75&eZ>.(:3Od*P4 at Fm2
+%KenM4dC,fSR#_Hrk#/2nphD1 at 5IUUYl(/e[jfNcC\u*MRE3m7u#DrRCBY!Z89:jqQJ*83n</3S_/EH@;I&6cG3=^;'pcUh<Gc5Sb
+%f%IJV6$6\#M#Dik%^<6Fqq.bN''g':LXBf^cR>J"SEZC&*[)I0'Y31Y6M[h_pdP="IP/[>7sD[rlGg9YR=,(kqk!\,Zar\P=cc;c
+%2<UfaRPMER]7)2ln6c>)=Y?&i6Jf\I,r,8Y%\A?@dsb[Ur]\@G^qLAK)C9C*bqHsdN.F'mZUDY1GDt>lRu-,2hk+ct8=V=NA:!(i
+%/:38=^ud#Dm$bC#AA!qU!Xm]WG1/V7-=r`0dWeZsgubE1e;S4UFhR6Th/uj5Jb"/.EXYaNnFASl)$\P-CN(@F4)aaVFNj5 at po_nE
+%^[[\["*k(V!CFU/Q)?uUdaWYA*8<%B]ljJoj+?=P&1R^@?!c0>l/eYPJo;lN=a)V%4K2D at kN#qnM%lGBZ4^4 at 6!]*G?s>k&L9Im]
+%-Vc5N\&`=:VS[r(bSg&"Eg'!42BQrbmt3)mYf$9?50iP*4P#5'=rJtN,,\UK$p.)+6"$#UVN/pACqNZG[GqG4jWlX&m<F_*_Xir6
+%Bkce:?koIW+?c=p2](Q)*m)`8IbD>/rr-CjP<]s6pRn"@T\YMB`GD5`,mBZc?XCZelV:qA*a3B(LT5drFn,S<<Qi=XQ5X]e<d*Q?
+%Id!B4%+=:H9e_eL(X"gj2cj5X3Df1*-4O`Q1#j331 at B5=e+<"2<qt;do8:@!6a*dX[nJlg:=6J4O'CJO7;0M1dk8t!U;Hg+!gL;T
+%o(?riZ89#V*A$f'Fj5[,+^hTUh1dF5b=o4Da(7Wac4!R6I4(-GZ;F0p at pi7f5#?U$%=`C0.l8BPNUIu_>/iL676AAJ`oNd)qGGp.
+%Vh8`6%5At/F+]PD^gm).\/91PWt%rO5J0m21@`DU"k'iCBqOKnCfTTKnu9DnaE-#ke)i>E#Bi=]O'O*=c)4]cc""BgIG&;qn at m#j
+%/1KL8b*[jmGH#tYAf1=^d[Bs at A[s]l85&M<5M0M(A=sS=q(T$I.t[#+/nW:D-c-s=>M!Y_8s!W%(:X(I,cL5CDQNSiQ,F at UlI0-N
+%C(KNdds$X!Nsnaugl;XU'lb/B5e^bYK>Q,cBB5E"A_$o1Q,N7/kCmFEO8bL55eQ\6kVo>X9)B at HE9i[p&7X-rD4LlF>A:;79\>as
+%>X6TXmaNFg;qBm1gqdd`KfD_EdrsA2`o%9Vk\Cb-IFDrdFc/2M6HQP. at i%<2eqPd!"H=XgjT,/l'OJ'rS&ANP"H(l,Y8=`_F_siD
+%m7N]QL#g.Ji60TjRKfTbIlks6[!dRb?Xer.fdZ@!'kB39B6'9=]O(i=MQj0M9UbjH%h]@+L"U^?2+Anh"'c8+DAV?>dVc)X!F3i/
+%Gr`>:a*`GKH->Or`XsB?gcM[2_(Sgr.VIM\5jY&!(t2eJ5fV`XkAnq8$nu2_\IhR)_2%i!(hG-U:;[#_-`tf$?W^<mTfZcY+U@,+
+%j-*Z^>lV0A\H)Kf7jP=7<4Qbd92hTAoc_Gl8YWu(!Y2p?grbtaC+`^si2Qh%Rh&)!:JGGurO+quim3ECT.7%Wop+EefkS"d7^@SP
+%8[IX1oC8\//&s>qY([tbZNYfbBfb.=.=B4B7>ihVQtU*`!+jZK/2cipT*rZQ(n@$..5a-M,7)*H'-joJ#HKUU<NhQ'A7g#iSGa'A
+%%t(o-;ObPQF9#FV^*N#g9;:aE86g-$52o]9`8qlk+SpnF(<;8QI?:lmNBTLb+79HG+Xo+/MdEpUn5mW at bZ-SD$Qiin><!:m<aCGb
+%WC`btfW!!<Y===fco$O:pd=DeVgL-3=7kJd!nV!(X>:"EZaNI8(;TMUl>(IgEh]!:K0^'fC1,qKWO.JcdYGR0Hdp49F`-]OYk6&R
+%S!"h`64D>hD6=YEmW6.MCJpNG/hYJLPDV,`WqZqHfe'Q8h<[$Wo!7flQO+($)Z_9n6#.DH*.A!a>tVTCB.@==O=h(*S0JUjVaLQt
+%j'+.a54*Yl>8$ilEY-gY.BPBJ"ID)MUgD8^%\+$%:`XG^dSKS08'kBkB:`W`5#%;BD&?g5<=KlZWbEDJ=XbX/(Uo#/`0N39c,+G-
+%_Jo at sWKu(T.12D5bkrl(V;S%q^qH0Q'PUG)d7-r%J"Q(N^40NQe]lfn3pNsTi8i<55Hjs"%/ShY.Y2%^j'jQ$\kn'h?CLC;jiILY
+%PO9NIBW`;FY,]LT/lHNsKZ(WO[d]G"o2ZF'PB+t;B>B`s+(,kk\Sr,heu)bm-+MVk\-^4[mG1muMq(AL^:EL_]B+G#/!<.)+tlm'
+%T=BqRBM&l]rfe0I&9gkik=3TG79XHlNgI!8X%c%&D&eQ"Bh^G1-(>+W3A`1b;cb4b?"cR at JOJdEA"FELo"bN@#>?;2qFci:5MCSX
+%%W8mpS:&Gbl#S9\O;d=rgM7dU!qKBA5dBG.54pmef&$Q5PE-2>-7rV]SiauiZZB7$qJr)o?Hsr]/FjplQRbCa(1SK8G\2+=k49p%
+%5,@&@Y*;T#^alm`3"?^H;FfXc:%RGP,p/Gs=L%kYp&E+rjm[]Bb]L._P^R`gD7rj7#:nmsZ;jMQ:&N9);QnK*qbE/B3>JV)#]q\b
+%2BGh_4jPNPqF^k^bJDLL=k-D2ku/P"ZU;hD7ETrBc3NQ!9?EA+Q:hPTbt\Ca_u/XE3 at 2*):#,AM)_j/_CJ\NMGddg:2YDFG6>fn5
+%p64*]kbFZ#k7Qig&.)^?]ZIV2:<YN%)3!3-VRIKJYT8'7O5b;lB?P9d7<%- at ErDs0d8I1#8LX]6UhhXKEshrAT31'IODks+Lch?f
+%d&0QkTaSa/mDEhuk.8e0f+6(-GS?4 at SgU11SqqlUft*5MU*SM1Ud5Q3bQU:jg>KJX.1=su=W*pF-hVSaoK+Wbg4[q19;*l+]_>"6
+%Jc86W$[G]l)/LQu'a5L:W=.IF$ImMWYZI35J\H!bL&2d=pO46,ik_)AA!lu`\NJMgW[bC,f"jR/ji$VXl=Tne^+uID_!B=b"VSEB
+%WME"Wi2!MDepWtt=e?l:nQ'ua"YcX0^`r%/3s`[rNEUsf'E`!b?M=&4^lo+(qZTln=OZ2"Wh2n<:[/1t3=XCMrPE/Ib>6%s66&Q2
+%b_)VG?>5cX=PMW>n21lV"2,3:Ua&0CUuEHg7;lFZ++#beYhT"(R9jp395`T>M25*6NSJ4KA5D[:%EgWhD%K*PRHB1$C!aO%P4&Oo
+%J;6/`Zr92(TEaB]-ej^!cTp)b?e.g#GuKm2;Y*abhZ$W:?;LOBCSPqE;9)A7acZAN-Z1IFK2.'i41/.cAo)Q%/V-,j at d)b,[FLpS
+%bE:@e0BNop`R`p1*iOb0b<>61*_U#M?@*(FkBKUgms]a699Ku6JP>l_*-)*R3<e.2a>7+<)hYa:TEq_5!eC2DNNI'_Pj7>-[(_[>
+%YCjTel18AX[8M7M[]:EkAtFj!M9#h:K*(Z#fU7cajC'6Q+a0b-:B&/n95;3h)33q+ at APQpn<A]sghm=[8b>QTdm7us7F/eVnmJVW
+%7Q9o25s=[s>tq`sH/A,Oh:c.L^YIKt#Yiu4bbsgL2XDLV-9b/`'Q:]5]`kk6NC(pE[<piFI4o+*S!.PM6KcbP\YQEt7XGTq9Iroh
+%B;'-k:U:I@@gci-4r:<3k\*eFU7Qg:C-:`j0b=bh$!u&",(F4=CuCRns$M1?gT^"=j?YL0gmH;g);GFIi*`Qa>U`JNVK,Y!9*4(>
+%)^[A<!7e[W`Xb39M(]%&I__pTA8,[*oe8[:B^!n58GuP0bt*1u331]/_)4;IM4deq##(;G=g+*]lB`?iDF1m-+J[2+l<+6pk';6S
+%M()>X=XZ9;-GbAWgJ2UA$<qoiRgsMBpR*u2,Df*VAVr4OZ/F=_Mrem<`[,>d7HOua6SQQd$(Wh3:]"U&CEi<&6_9%gmJ4"LhH*Xg
+%HK!G\aUVRafN<db7U7]7Ds*KFj%*m[K:ceE1[H2B&O-5qj=T.9l"5W(VNbc.&WIb=_;-I<9a#+W!c9#bf3s5KT-cFBT'U9HpXFR:
+%?aY"KE=b?/$)Fh2dV^q+2>'qn$,jnB,r&!IT]Tmi"UdBCEXCr`_K+?Im?h^l$!TC+Ud8'EBXZ(<n"AX+lM+PNKjOqW2AMcLEt0gq
+%M2c>ZH6c&,i-l$Kk$nutG2BZS;\>LYR8>^/&LnE_hZ1p+=Nb:mE)Fm+D[S*U-LjR]r`kb7#e]0QDkj11eDj47=j5oLFT+RNJT?>8
+%g3M/Ill<4;h/k7coYV"1hJ%2`XCMI+?JFiA?o+Fcgj-?cQu1CgTk-FoNW0d,j7UrW+sAtK>Yefl#CVBGhqR/;0Eb'IW_!3;A*"'Q
+%e8ud`oTTSf-&9o]>#IPc"0j"6TV9lpq?:>8"H!6tNb4EYP%C3AjCm*GaL9e(,dgG`97u_RYZJBB+V$V^8jS<;q]N5b"e<3iBn5%u
+%C)n];<\c>nOS:]Q<J"RQ"1FdknQ?T$rH;nk[/5&pJXf,GDAD6/;%K.sSWIUW?TF\M(X77tN5;^.RCp3KiQJTVV6X$`Y&(Hk+J118
+%cM>N7b#?/8B1L;q+%%a7GI4C.?V-+QZ(=>"j^JkS\2!?Jkh/r840\uV/,9;bi at B#5#brm^d*EIt;l+3:k4,$DNc(H[<;p;ErNrS>
+%:Dhc+mb&DX6u]WbqbIc7.MlB&WtDCqPh0HOCapk)T%aau9D<p]EMbrp4Nsr,n^,#$*,DSnH&K83H$B`Q9B0<aTg.RUrK1jmT;QhY
+%PU'<-QBOfj7fQLg*B+MX`-`99&br\/g.XgqH/^FZB**g<r^s?.&j<u7^%MP>gHC86K(*hgSpJe[b?%8)UlTjtPt/uX(GT^t_;@NZ
+%Z/'63'&F29pQrh?ISQ<-`'lD"Iti)\Y1&'8G=q]mmR#t?VQgZVSb0!^61fVlSKCP*\q%Qgid58GT6`-bRS"g at k"!%Gl`O5Y]#Sc,
+%YYfo)K058a^ocSV0"=ZW_n>k/J&@k3Je,r7X(duLf4 at No-H_?B?h-01bPQ"a_EQsL[%ZRskD)7FfVqRCONVLhIC;X_U`c at ip!Ljo
+%H'.e:%GRl`YP!PejFEIBejj_c'#(7`$VdVj*7XY%@o>7^4G)Rn%[=[YA\1o%.<*">[0`[]m[`0ZI_\&c(:]ss^_B0uf?2%^*9E]E
+%AK'KiD>C?a<=G"iIP=-2,/+LL2Wa:>h\$)bIQ7LVa^gbG at 8a2\Mg6oC6ZF@^D>eniKG_<-:CD*7V/ZH]H7CB/]<(5Lg)%U1#@.<A
+%RMSELF1#7rUQ+1I4Du=.hA_TM?I2>d:6otG:L89(JVO(9'(D(_m%b[JO)m at E'LA[_&o=hSZKb2V4@!m@&:1n.,#r?A4NS]!fR/2[
+%CDi,\'LM>%-T%f9lDCE=(^>4F;LV/sDXcki'X6ggOq-X;ke.Rf:UK?*bGj<3CCsE0;s,-BbX+'TDJ:#]L!;+[%F at TeN!CZ2iHuTT
+%\5APo9Y#(&1^d$Sa%D)?b`al0Z!'`fGH,\ZP"$$kBC5IP(6^hVl8<ka8;VFNI!9UBEg.N?d[E^<)q"@InYq[Y;o*=ae-ke%A_ut4
+%ad3-((>Ck9"n\""0Ak#+cN!_>K%VP+kM_u\kV#NIctDBP<iJ2]&dbH:GOSn+/$W:F(/0fU[mt.=EN48_#C34fWMXfs5Yq]prpc[&
+%H5Cg&IW^[iNk!luAd!:[eAP$qC7/D%HG$4BoB,UNhsTV0\uI1LNV!)^(JeoR-&&["4MhEc/TOkUX*:^WLu!Vk.3TNkd<$](Q^@7-
+%kiCt2QMd%TKu!UsPVqOW0DA[:D4^:W9\VKqSkBMeSfr*^Y'^JCI9!%!U&mli-ogq_^-KE`bA=M-,``Y`M/JVIa#dd8DKj3"gU@)d
+%UfpRq[34Vsk)'t`';S_;>Mut-7!(%mcTAgJO-8#?o.jiblgX]N.J"?+AW8-!UR.r6p:e/)H-X0Ukcf;$&)q!E2qIPPK4Z-r^QiPp
+%s'#;spcGg)BWn3]/VsuiG\D_W?Q(#jgG(@8"iPciV,sg/ZIhcBblgsH]K%CpN2hH&(>_s>cj*0JiPp8NPT^;'l&m;;dPEP@"39[[
+%YAXD6 at K^W/F.!Z"_CXs,'^,?gSl7:pC*Xs[I(I8n)H:ud-Rf(8/&'_>#t;<KRWG*SK7eL0O'G2ZFCVQr0U06E+kE!F=M3`m1Jo1I
+%Z4[XqK=DERG!R4*%<Z5oScZkU'V9%C2op>7E$nD..E(i'o=aWF?d]#T5WP8h'em.YWT\A?DH9M at E.tF8Q^VIaDiMsS/tmkaQ]E*Z
+%!5-P=P1B=[;iXS?\)q\mcP&.<$gJV/3iU7 at .adMB>+ip)A&oSefR at AoC`AtfV:=Dor(,F2[J?n6)L<RME-S.:Z_l<"AZc0Q+T?nY
+%7*3ppgMLMEd#4XYblD3Y!n,;@(ZBUI;%\2uS7d:\)B):Vt"O&Q.rEG#@?XVO?"8:bt_K"#T+CLNoNT%&n;G:3+Q-uHNVabK<F
+%gssR_3C\Mu'TH%h)C[cR2c`C^G>_%2D,0pu-2#bpilILNpG.0WpZj`X#U%6M3nSPMpjVeZ+8-ueL^?#(o(>;D3BjKE"6NKSd'<iF
+%?KM!ce1l5?Gi_l,3+ugP`?dYE(h;G064)#`d&d(NKGsIY"6Q0XOc<6&Gr<M(r-<ldjYLui`<q\bO>:mM at euhY*?tPHM'68tMT:_(
+%aa[=6<IrJJ+Gc"\il at 2VRGr(%q*"J;asK,i\r5Zd0LN'KP?L&(ZuL at bWSI7Tfbq)TPZQ'iYB.:f)cKeDmaK<[$IcO:5R@`=SX+I,
+%JAa_ at En?q1k"!cAfl*#iCk(k#M6XisPL(8>Bp*Th$1!+2'`WROgUheE62>BPS&)#Qm7[8E-kqW:pp?Qr-4S`jrrIb%17F%l%,Q54
+%Wka@[gjl8/d1<P.`A\9.p*IY;R;_2:J9!8[K#O(6IbC6n'Z,joKq,D4k8Do>]V<m34R;VI21=,YJJ\nq?XG.lL#(cMos,&'o!=MR
+%8^-LT#*NK4Z&mK3=`Cn^irV!Oq;qljWBPBIFe50j:uP5M1;_/b8-%O"Su.>VG7HNk4/).KH`C1nQWOn0HHBVukUOnsSr5=_^(2gB
+%1[i(UH[)dfn"&tVObpM]3p0H$0:R^*-WjqbX/K+7Pbq)]e4X537qc4Z2+bP7#@Or.;0%Q*efs*[Y\R(UV at rkDlL662Xakc`S'F at 9
+%eX76Na(V_\a)epD6Is7g$\$Q#Cl!k!8Jb<UTY*&M@:E\<#QT at Ua.)7`69W*D(g@%jR?^(aofIXqa$Ig#`C>;C.[q]1G./n;/rg6`
+%[tJr"'7>UGJP\:6kBg7q at lgc#p at I]Ip=gYaIT[1n3f2cDq?Ge,>d^5snZs6s\GXQ>^Ar4r)`C&d0f<_cq]t5*.Kj(]\b"]?j\,ZG
+%S?Z&2,_nQ at Ss?[qo51;1?0a=,Rk=s0.7X_*[%Prs.=k1gNl&mMe8e!\amW^87D<af@$,9E$k8.U0)ij`%mEQFP1-cb)%Z+n'IG`H
+%C`Qc*J2u6eK2*[G]3]1.>;EhY7*8pX9hM1E\hHW=']tZ*-8=&U;MLaLBnQWb=eAh1Ru(3il at 8FMpfHd+i.c,FnhWI;MXL].Nu1*q
+%$@`?"VNcs6#6\?0Bf(>Notar'\%tsMCCY*Y^UfLi4*J1=.Fm%c_k8(JX;CC_G"nppM@'H!XiOuIV_["i=g8'hM1(F6VmOiq[eZAe
+%8O&99Ds[`oHutPZF/)VgIG\9]d^_+P7%G]PEX%#2F)<KHrQ+fLVo<;RjDsE59M)4#9+bluOR,FVC,ag#q>hFqS5[jF74/Eqk((&$
+%aWgYIQ=<,LXnh=1;Y"b1<Fm9(Vh?X=[C+_b=UA28Hu;m!&)3+=j#H79gJ]@$"Ao.g9u54pH'qI6?d4SO.o(+C`bS9Jm',W4CC1u*
+%N:Y'B97cc@&j%Upcd^C8TUV"U!fl$h\SUQkX>E20+Q%%?YqNY!9OcqGWX"93s'b>#'Jnl``CIM"5OPr'Aae;nh"L-qT3_UYqnjC$
+%'ji^j&d#&E9'p:`Bor*&I-$;&go_q$^l>DaqF17hb+9_74piOV7ep?F.&efZT]QoS*5Y1::K:uPJ4U2Q/%gm,M,cndro$o$pi-KN
+%&h_bA]?2t`$%A)#R!t9WbJ^R).$mSX%?*3fJI at T<Z")\Q54*Ga>Zct[A;37$GQ(_h9u/8?gu&!4M*ASL0ranKO2'OsAI3:qbM5!5
+%DX%G!56i[:FIC/3pRONp(h*Yr"Q at Pj5b1*%o`rGFf'G/?3-QmYhc+kbd+\5_=F!#A9"=7V1mraIPTn%8;Es(7Y5,:f-d1TF2I4bl
+%NQ%Fb?';=Q'L/*G4n?O7:"PY8 at L65PBD5mMOt">p<\2%))I.imM*K)odgNd+\kNFWggmf7It;LWC&nK/#!`fO:g*3Oao/5?YJ.iU
+%ppa8F at I#V7B!=/`qGI at DGA<6EUks]h5&9fkM9TX00%Vfa%VsJNh["e\epTj`&eLo`_lWg+IT6$c6(`PWI.`,[UEt)BcTF2pE!],3
+%(u(N]Z(pK"2_(YMKOQ;MU#2&\=<"BP^n[f35>?kjo:gECTofHhr'k.:IR<-_f(a9gFDJp%R7fE%Yd&5F+Q/_Emc):aV-:7D?pW_R
+%5qN3!+r?@tj3)^;q^.Fas0g at Rb6&qX0NB4`^jh=m"(.5QoLYHHPr<X at e=nu:X)]3^XkB+l'Y+uA`WI/*"[(h&jdn&gWG):="Cg,W
+%43l^<+O"bpHiG'M]+sX>d0/gOQD/<-/>cJ&pg)VO']haA;QfiYf9J=bRq94SCOK-4(q6-JY8.43`S#MC=SoG'9N"U,Ag"Urf9 at qu
+%-1?PUKGe`dS@*EhRVk.'lH$bqXJqua>EUm`]e$8H'&bJHm(RrWd4A'O1:YU+B6/PGV!j'<*%F^IgUBkIP2>^D&n#upkFL5 at X>DqF
+%gSU8EpWVR-5FI^7c9JGFXp&e&8$]<l8TQI'C?f7[6F4dt=hU*M!P,k`e$\\/A=q=kU#cQc+a^rCRFp;Xi<'D\AnIGL\4J^S\oNKQ
+%m%:7#YP7F+Q;UMkB53VDr]4p*<h7hFll6YXHObI=b?tu]41T?B(KL.u*a5L\J.dRLSL`5h>fgRFlQ#5ldl;*:?Sn?IB57%/36cHL
+%rr%9[_&:FPL3^&1Y,B`530dWe=jAJ([3IYRc6K39.<65fc7<OG at sPHuqH2%e`XQNQeIoMdRf;C$@X at YXNQH/s9MZPEaR,kJeBt*'
+%M(rRJ8a,#s'K*(pEK_4do"jP/U]ERAi5]i>DdpKph"e;[OHD(6lsb\&K(+b!0pPa[1K_'1OT=^rViqC5D[n5>"8-N[]\/#B*X+X5
+%1Jg#]/71Q=rCQ3T;H0=_npNF9)9*C_#Ko[S0;&9]nXpYH,llKA?=cmT3\M[TR3fB:j<UU/85?\dL<@e'WZY\T`9BkCI3_o"T%\tB
+%E0p\Q=*9C5r*$6Pd#Kn#4AQ3<KBVUq#%,SlC!+l"'A@?G9aOc5<i.<r):[`Kmc=-^eY2O4<Y1<P2::CDS7N2jOm'=3'>g2:h\E>R
+%X%<fs2;Jk2C65*,Q$@OK5OiM!^-.U at FR_'!%02LS)1tsH[/BBTCc(o*jnYBe-bf/Zhe3f1?0"l95>)RuK*Cri38]:`liN2^YXsfF
+%1bGLqcGqO at F`;]QI6[4PEl!BjhJNGGHl3GnH]2jk]<OiM9mApk+4M(!lW,gM9\`7E-XrC:S0AKu5<0sdY?>ISP;9[Q]m5qLSRKQ@
+%B82RI*YX>`aH^M%UWTPXHugDg0CD,"2j`?J+&t`"H%P/&nb'7sHS*jhT7V5]lDmG8BM1LA(g$ssi!RrRASTEOSYtn))(6a@";/;[
+%bko/[MdXR'p:G;3\M.905j=snaLq=aadI(jrV>+gU%[+?Vmf7Ak3Pio]ui;r=uDD6k]pOAc``msTXuC40?iC,:t at OiYk#+6c`(qO
+%]0!XGdHoC[<T2<S4q+"[V"Z!\F"$*nPep\ueL2`OAfcB)\c1r9Uk2b9Zj!QbCutK6VC\hr$l+mM&Zk:S(+ZOgJ5]Zq)uX_U7fg[_
+%b:*d'PKuNMd_pQ,fY"]N(gBlap&1P">A3A.05^bU!.tThY.`-+cHN:`-d6rT]$QnoEac\ac;U3P#74Z4WG'T)ZHe44.$P!V.aQhU
+%^4UPT53'AJ$uLB.:l-ec-FGbPlD!]q4f&'^58n\='FRZI'M.'p,"k6WSN4 at i?5!.?,[8o$8^pDuGU^>gcg/'dT,C<AN4J)W&g2[R
+%:EE6X,I,po1UBi[X1[-V+ at UXKq2-O=,3O#C$CPN!=3eSV&[`uua*)3YPjk`#Ya1Q9F4]jhTUkQIK^YCR6]b$"LUHelWo;V*#tDRJ
+%%eK/Y,hp?)Bf'I_E'qJH8*YX"m\^B6Kj\JLp`)kuAi/<je6rt?&B?t7%SVonN<,b]p8in[iTQNNmJ-PPb992m2)=U\7gu2_jBLls
+%STfTl!Z?#nnB>:92jI5&cMO"P<2ibBQ)_kbf=mS?&BX3/7L[`3\N<b_P=0I9P>RMk=*(nt\KnJ2hWoLZ]q99WbkfP/o@"3DP_nAk
+%ki:AXkkNi7g2_+gZNks,kY3\(`8!pOVcp.\Oh*)dFJX#L93(h3*m)?Z4RD&hpStL[f4cRLk!IT/kQo,mKRerk-ZRVg)8tu^]8VS8
+%[&^)hkk\2Pc^ERO=[1=f2C2_2,6 at +QiD>e<(h at elh=]K"75-->n482sL;Cb(SOaWhMSp/jPJRn0R.[s at K7!aFis1E'L#bOpS0f+h
+%?3&:AkMV#h?^$h?J74"F*slRh2OUbNCpYQfo-+2fDF(&9oK*o,NI4PJ^>L\Nl0Sn$W>=UtqJKAK/]@3rhli)PU1$PTVe6-][cumE
+%-D>m%</#d$-g&9q'H&*K;_CBh.gG1s4!h9]P'?6j$cAj=Za_G[CGO5Y5 at h6Q6:NdT'V$-R]sLl#oAFHVQAUp$Y3U%t9Ap*>tM
+%f<6$AHXg-0.qj$o$gB;a1@!XN$nad<'YO5Km*bL4cJ1!cTa5L_oC=S5[WVc)<U7O.8".$kRrZ%&LeM=EU*h>0k.]qL16$eS7[^LL
+%#Y<jX>=U$(<sYdM1fH\^bVdl)TO?#r:H"d&[qVl?Yd(pPQ_-`-Ah,uc*YrSdUgMkMHN9D^nV9b%`@(6!29_8NfIJ8FV4OANe7MQW
+%g70WfNcncYWRlB)PfgSB5C$d>j*c)uP"EFa)X'-BJ'?@5$H1*K!$7*DF.Ln_R7?(KRC(YUpNQI<n[HWP%sH]K(@rX^:(phA>!3<#
+%SNGaD^@EgrcLT2\bi(6$ZJ]6>b13Q"NGk-Di\=3`X`'AQ[;1-;dOG")(go?4/.&THc"G>T*e3qKH50]Vn3EDqN%&i=+FdCoD>]"V
+%.Vt",r9P]@(s<*Wjom;c7O-$J1`TEbUIW[hag3sFp*g%<!RAercts,ClUY?!KdsWFaj$>8O=@"N2DrU;]^rh>SH$6]]G9gm5`H;J
+%*uPpuM>XpE*.X._q%+gg&A/G/V[X^=K;8f"H=Gm_F`aieK6%Z',\gP4)k+l^M4qS0o#.V,;)p8DDWqHZ\*k.1JlDm'-7?n;&uD^/
+%#Q+/_OU_&qB4$s5LM1ecTW at o"G$(iQje1mt"I@=*9E\p7<nO*"B8/BDQ>3DuD:8NYajJS#%9&XBahuZbIM!9XlE at +ecrg=8:=lE-
+%\ZfM3#4\n]EaCL##&)^<\W+oATY2GNT>EJO41K4)Le49*/A>t?YC7W.fg7+ZT(I#>Ko`r@/q"qGa$")TNhr_uK,j+R%ts99a:Hk8
+%-WuR=#/'&'jmmbJ9G\<ID/\MacW/qjE7lHQE0]9VpoJl2*-tO7jRc)WcZS_^bX3AVl@/FV&!9OX$l;#G=%]/XLk2\0U&p&'T>\>3
+%0!Xk<SB@\8BYesTT7kQY!a=k`!i*<n5N7</*2ePC[aD4?K`X[E?L_&6G*OGsE5fW*3-t&W`Hbr-b::'2:57C5HcT]H7/[[aSgi-r
+%PAoTuEpH<H2>?EJYl,jR-!tc+I5]UG"bTk-Xf5Sj7DX"a#.b+1->"V0m`Y7&$>_UH=KEC"CTauj`8C;F3>/l6`1e]octJSBXD-"W
+%W*8aLOp4(2Si$;]-s8OY'`68LR*/26-0TZQ6]lj?i0e?s3($d. at F=ui"XfY9##\.V?fuDU5PC9Bn'qeCfg]oEZECpFmEar8?iCCY
+%T[c=mq.(%XjkP"n:HWCO><rtXL82!c/dZ>KgC='Q:d">t;R,B[VgR.@>,bkk\bIR')ZLJn9OM<th3a(D>?Ooq]<k/q@(fqF/9YMf
+%qba.hEo/pn_@;e at a93*+e.nHU14QEp*k?sM>>9fEm?:n=E73$eUoC3 at r"H2:rPL`9`lCZ<WEBU;hA+`l[[lo1U,#\J+gt at qa'2jO
+%)H>)7*2""GQ5^>.kSS5e?L#CMatE*\;rMsP.G17EWU*MK"Sqf-ls*bA,$TD2;g;m`d=8PMS8'<hmRr^meqME600*lF`Gc#@PaSP0
+%'(qhWLEHKi[rWrk.Ca)0,iIY2VkOZO=`<tJU2-#;8Rhts5C!r/Ot"qYA9WS?/6#bYeC;%n"Q[3uBdS:=(7CheK:1s#0Kr1E6VQ?>
+%XQG?Bng?h1Q<cKs,S&u0)\gMf]`lN%;',:s'/EKOHic'g!DJn/l/cJ^dAMdk^c&(0>[+DH>jEA9n0,npTQ49_HZqTr^]DP at q>Cog
+%Gp28,#>!K3E61=rf-?*7-seCa8iS-+J[cpX[m[QU(ubT_+IA(Q%kG"^os-Jg1V$0u%Ao7%JSqNe]?&UeWL>4T"TM3*&8LbDQ7EjH
+%r2*9pPKULDH."j&.ba;^UKDhKR0Q?-02J2Bo/_U*oN3M;Xe$onU6 at EM7CLL291VbE$s9fo[S/?7jKU]mi+3d"&p/L>APgPl3oOSS
+%HkRXi<9LB%\t.;0RLq3fop:^Vd)grp.)OSV44\FISVYOA4\sQHqiLIi(B:&V</L<RPHXP";(,J1BbGZgH+O:sZil7+N[sA`SlU(H
+%5$!b>!(lTa0Vt>C]:%N3ME.KD?DFqXh=N#alR/9?a"C]YJRrX);$]k`0/g\+c-_o?4;-/-<)jeMhd6"9,Gf^Uh/=o4.4/(@!&,s(
+%ruk+Ba at rjLIH/8.gUMSCVBV[-,du$Y$tJ*@@#*$E^/P$4;rF<2QtX=9pon4%/NiNP[?.G+XD]%#R"Ft9!)me46\,Vu)"ZjH1,3]/
+%[EZEZEe(R/Y$ldghbAZB,YfAM(AVnMA3$jph3U#/+'bf=[#L;[1p'"4q\g;LK6U at V4$>1c'B**V`0:0!jOmV+Cg'qRhR&kM;F%^R
+%ISojfqafDWQL37EVM>T.#*.)as'EP]Ji5,tSf0U1%t`r#9to:,A.KbmM*sS`)$Nns.2ls0Pf=_Djl<0T4;$Y?cZt.ZkDoW(oB1Hc
+%[fU2+f<6P1[F6VJ at i^F@*B'C<5082Dk-gR>?JEG&=5CsT-NE6m-QRUD*&eW_M$./Wc7+?OLJSO=Tf$7)iMDqR353^NoW09EJGI/e
+%D.cd`FqK<?a[O_>]!OBbg;^5s0OHpu='A.!!*JLmK)Q$1<pCRm)UekU>ohj>r+QH at V],=^']Qk0$!"l#5rElOA0 at AZ.D7$f"fL7H
+%SuYB1(*)2c2E]Yg.S)C at F3b]TCAf.W+QsS%:Y%;ojmnrD8?=kcaJc)C(^Zh\F=-(nI$t#tHhKk,:@6Oc>UPFR&$"M6$?X8TbMI&q
+%<pi:NSXD0CKJc9f-#HB2SdeaOF5RldQZTP^]ZRL[)AZLdoYf(+hGWK`m'<h7.d9mihb;)U'P6N]-lYW/ccfc4 at P#/2nc\hVb6[u.
+%+0t. at k?tS\I'j#`[i$4E-N"Q?:^qpcq^BN8T0 at f[a*t$>033slCJV+S6+t*R2s69Qh)l``[t"SXCbH;DX$q)LPK9!Ub,6t%:%A!$
+%Bl>Hb;@=&D;5[fPVV:cZ+!MU>(U:p2+&#">3Cs$PDN'*`Q05I4UY?7kDcS>#V at RnW09C<hW`Mj+-`uHnYj]iJOu>!u7V!NR>-lGq
+%fUIcDC;Y<m/j!.4U*P"6M3Uk`:E$"8T7Ggj6qD3^FG59f3`eu5l[;e<]nqe1&e;fYUTXEq:E]-m94sgM:Q8Z3L?OL$*K1`o:Nsd(
+%88=X=:30]jdn&XIYY7cP.!Y8nq3C$&+3+cVF>dM1OdseVn`=1[q2H/e<*E!C0:;=9JVg#:(CIiY)u-2l1q;D+/Eh>raMl1Fq at V.7
+%J@,BpKA2.F7j4h`,3TH)F#g3--;;e at bY:mU8/fF,*eaF:BlKn#$C2IUKW+rLnfts.7j%$-DFnU';JTHcq=*E7d$[VHr+8$U[NqV5
+%.=Ne"k4b6(S_.M'mr;I*[^^8%W[G!DIi_O&DuYD4EZ:$3D^Q,RFb!dbVgm9bLQ_ffmiG#&V\d.ECJr1i2m(,*f[P2i[qd]_.Z4.;
+%HgX9E)Ws at pXmABrNFG-^9Y6"5j-mc0YM.C-AbgDnNC?rs\B<p*?B+FN8$`@eh1Bt=06fYL+",f34YKdcb5uWL=n5F`p\dq$[Osrk
+%KVA2tW at 2WW3a0Zm#*VVBpsAa9:W)c>5HX>9=R6_\VR05dfO4iQ(P2kC;8U*'JT"/J=A7(\gT0?$3p/u:QHR`UN]94M1-a%)]G\qO
+%.qe3X](s4bF<\IKhrZ!:,e&SkS.sOj at n7n.]GL`YZsCF3V.m!"q^hOgmIr]P2^+0,6p at uSLWU#X06I0b/87<:*#Z1O>f;qhh;UMo
+%@``80=6f4cp\Q]pRq.,8WeltU6*@PJ-;(Yd#,IhclAgih;N<=LP[(VLn79I;eU-"6RehI/gFJ`-Fm'P6]F_S9'rN^0r3"/Za>0_I
+%Y7r0P4%Y,@:Vbh!C=O<%`ga$`$1%KWia\4JO&UAjA[ta$<s"O-':Y.:O7#98]G`_BC39s5P4^a3ni^Zp!j\`806chuB"l*[?@*l5
+%auk%LVbt3/T.c=;Wb2H:-'%E[7T/ck>+f0>HWX2nmr=/!\-T'$GdUfQel+,P0ppt4;a'D&:^`%Sm#ZLlN]3;=/rCdAkCHK$])tWB
+%h/>B4R/YYIIL8HROo/MMC at .JXKVc]Qk-O-9@?4d87=9j\!>?IT$Za.;KMm=[$E&SboVu%R2flfcnj9pLM3:>L$A\)X!o_ZN(1`^,
+%HEP:=bk-[OcC+F,+*)&P#C#(4 at Idf)6^-nGjE8eaR^.<>-un.\8/2_mT-tUVV<9&lTDYdr at 1hA7;$5rf)TrNa at 8j*&Q]k,qcZ2AA
+%87Jasa:fucFq#(!5ok:^01&=YF*UAa<NZ>r7aC4a/]/j>GKX=t&*E;=AK^7hK\a)PU7=p\2hbTX4Dl]d4pq\J289U="ZYBgY\7`_
+%+j#tCfF+NT8hIo+1/E'4\j/AHLDSHVB&&#g3l[s>&C\H at 0Y*C at qlA7EVKmS^jHMALd62i(Hnf\F;ciA&ZrHh/\JIRIom6)k1=t&I
+%rGnJg(8$/hYLQ+"60-pG%Wekp8Qq??19\@o85&f7`S#C>e.213SL+[9SUAr`bm\qB=u*l32"h[&P&SU.=Y9TUS?M.L-h6B(Uhm_r
+%/?<09Bp(TL8/PHlj7Q;BH30T"J\5M-(I>l,f6GrqBW[T=dCcasE3T;D4RW/Y!cBOja&;ILF2G47`H3@;lN*,G([S7AZ88AZq3/IW
+%jB:'TL!JhDP4onPCri%l17j>)N+.up$a5Cr>66&E9Yf<I\eJ$_!Sb`=q+UER=?Q-:9tgpK^^gm7>#1fPf`jJ9eMJK^,#S98O1.;'
+%$&[O_bKuJ`V"kin,rG<cpVOAVP#AN9V-*TB:E)Mr%LBpTb/koV1!,YU9kESISi_)>+tG";/X-8&'aa>-E5+EsdT&%:s590=hLbL0
+%;;Fq)YneS]@uN(V5?FN>^MGZ9c2aQ`i2Q[Gp:E at 4WT?_r^lAbGqddN?%u2&Z9Tll9l\>7]+=4So6'k=6V5I@[VGj+6:"EKTQlN]g
+%Jpe#qKaWn[),V`k,CenUZ0;6ClMPVAS[0+lOAdiDl0D'oSJ6k;PEYbYQIp,$fSelZ,E-G,>`l"0`HIns_H^<;=a8>3:[VCGD:@D1
+%>'tRHM$AlU`71pL+i?o7?Zqm>F.h_$r,[^U:"EoSaZP"Y<pJb^[mjL`W7TqSfU(/&I'3Yom,*F(FFmN@[k679-;j"(johN<^?1U:
+%PCiPR6-S6:+F9&hjP(L)(ccRtB/ePFH-r#EdS_Gh_[QF><Nt6ejHf=PKSmnMI=6F6?NG&FMH?o"1fGPsoZ&j)Dbjh(H-1F^eEjW:
+%bToB1?MTb0Fo_ir.gc8R]0sJU;5R)?a"6V_F+1l-0AM"9lYRQ\c^2DZEG*;`h?([`(Zob_mh5hgkYeV'Gdj2+Fi#e>M at kq;T2]aY
+%Op\)5L+Tm$AiR<59<ui/X1#oVLu`>(A+!tb96*ZcZ+W@#5A9!PR9Y<@=tsP:O):0k%cW<ujO[5t'&AaPTY`E&?$U^sZ17u1VGm=t
+%.>Wn(>4WQ%Rp<&Nr.*LJHfqag?XUbZ[Uu$4N2ULM0]5/k^CTXsC'K"HmrRu$bAF6)9-@^f(,LD2?b$q#3bDM6<thNF^P8ds&sd$U
+%mE&64r&7NqS0>&r7hb,XC8YH1]VaSg,JXQD3fh]<(8LCG*sJI9Apn:_.sF#3l:)I2/k+fFU^Fm4DU`g/>6HkIO8(c+1d9+[Z8##g
+%b]ts"3&bGNq;@fi+;V5g5[u528=P['9AW[Rs7a_DahrUKe9f_- at 7=^@DL[./>o7hu\BcJ5%dJ[l%SPeDHJ%bZFHhsF;cq<?<o0AR
+%,Vr,$af&jTV/$8oZf\65fNtk?9&O=D7 at Z<Hrh0.HIA`?pK<rj?L6Q*%-;UdSfpQ=:e'&un/$Ga21Ekh/X:Qc8h(/<"J,(hM7G(]i
+%W8/`*n_d#)FJ&k;nJ\WV93$P:W<CHi^-"UU;96UZ9n"bo+!iE&==qqfZ+.P3N2)$n\a]7Gm`_tA4g?kq0_J6$mpgHue$J9LjmlE8
+%rKV4 at n`bBr<,$]MZ>?.mS^LUD/:FZ;"T<:\ZX15I6FC./mC<YL=>+^/<;A0?N*m!ROK2'\kl<EXa\tkX-["+2nn>3\-OJ*]qrUG;
+%h+d.5>`I5G*97?MmQgs^+$Kiu$=;/*02G3?\Yu7'S!K,EflG2IUko$(5/!n*Sm6M)X$8/OAu2&BCs[=^"J-'37q/?m_j-mes5mcX
+%BfS-q%P-LGm6lc(l=#l[E_!*3PRF`<f:6\bs0M at UO^[2Ua"IsI,oBt[=UMdNV#6B*0OG at .Ee'@O)%)LY at na4@qt$Ys,oJPT-(3qk
+%juj0!Iu\NVT9]h=oo%=bYG[0^.SLff4T:M)Tsdsb@?bu5dD1p0&pRrdea*n/a<k;Wb1#JJP+l1=cp]%Inc;;]#,kS)#.n"5Rp):A
+%Ieid5XNW4o>g"+!kBjt:PIu%./FTGN40luEf<*N2chG#J^H'E!A<@ZEofRTH+FdTHXQ/?g5Y9ll9>`,-M799o;sO?[g(o\]kL<'s
+%J0CS(e1pp`/rTN8`%uaa(Ra=5;$#)"j&1nGJd6k53Q;<ZpGmZ9PC(ggccKca00?@P9UEdfPb9IX2C+"@IY)C0!k)N`&p.0S]eo"P
+%Y$TW/V&=CU&(5L&$g-^(aBNKI'pJ,Ldfap]SgbN]jZm?P)Z>;',Q_hchad(r3[f.oh>d$Y:[Ee]IUnI<K$*fKKMs6ckClecUE>aM
+%F\6-K&PK7Y*qUbB^@5l$ZeR&;hqI2LbWa/9I^ZYSP:_)T%o(2cQ`FN#54A4-Um8gWhOs>uhd"%DOtX'$U/acBC7s4fNLsLCA'*rs
+%ccdn<2LTi$2Yhr<Wm:Ol2b`m1FWb8IUED)jHu]Q-DosFdiW7ROO#/,^,cLXN"#B##4]lnS$ElRC=<R-((5:B94&aE7`cT%n-ZOtR
+%m_AB-%7ClfK9/Qlrp4NsAWboKg-<19e5H;n,$Z![;tG2GL\%`0>AquCO59VqMX]Q/q]t at R=30(Q.%Th>-UL`=2AI)(Rlk-$Sj1u<
+%TL_7P*\uM%7 at 1bEKqlH*n;[F2V8DeuUh11!/8<:Q+X1P^_BLO4]U$/q at 6[<i)1HJRd-K-9`Pj&dQ_S1tT)[M[*I,fr;Mt/Er/s/a
+%-RqrMFhKYgaXB)Lh?N:6/!B]9RtWN at ViNPtEWJP?>b1rJe93:?*h(I,6d`r:rf9J4o#U=o8X3)/daOp#/!u at K`k[>Ed$@QUnY9>_
+%,_Q,c5dgTIWMc]4PGL(TQnMfh9V:PpkrHQ>@!BsGj6oWpFer9JH)%PD=[GHH6an'u9oF;pn?/RfMM_(D,f`)qKss?QDJ$"gr6gln
+%Xi;5d4f8N-`WF0b<;K<^*1_-o.;kA;pF9U at LNl]5emHdZI;;TCO(Q3'e<Drklr5+LZmAl?HT!+i*/7kSSFi.mP)/^6BPm2bceXCX
+%UEk+C+URMH at Am-iM*`6H4h*"YAs/"tAdVHX.lA\kpFYh[T:-aL?<j&U*m$lP"&cp72Fg>i$RX;"B#g">F?WDOCdHnWNe%$VC%0fr
+%g$jk?*ZrU7;CYK0^=4Z%K$;uZH-*/aA]L.98d9#,\?;HjXd[1a]I1>43Eq]b?jY?>P<*Gr>.#FS8#+frQ#VD%5)e$D]?3Nu[`6KV
+%)%Q:O`0^6gW[g;bW(='+DF1+&K2>AtghJ_P/5qVFJ8ZoX0mS3Y9r0)][M:l]4f&[9'^R^*nPJH$br"Y*J!X;C@'jWr@/\>a]>%9F
+%Yd8W<j-D*`$J_lGRj>Ld?NZ#'Z5uqm!DD at q"0"E5)NI'1k9=,(X.8eV;4"/0Bb![hngJ_s2eD9MZ5iZSbp]$AY`UuSn5[cg)S',>
+%ZkcZaD&&Q::f5T_N3hNSRA`?;:b7e^VA=><O%)d"-EN0h[^9?`ce[_'Xb6gFas(.8;&H2%'V09mLQ8E.\W)a$7(O[ArQh8'gWdIH
+%@j:*k,b42N9+.%2:sRZZ&gu$p5B>p3os5a)KOFo^;5ofr;JYr3VOr,t9Q9<+6bsQ1)Us)(=Iqo1$Su:e:P#5Vg. at suUhZOQ&IO,"
+%:Zfgoj>`Nqk6sbR$B<&lLL^$iGCU%,#^"p%?Pfh"[7E/<:_fSN(hTqb1=W65oO4l?*f^][S_d-`VA`M`-oLj*k2bTKc"?D,S4aRB
+%PD]=\$T*:08bk.^[gtfoTp[_ at 14:EqQPDY+^CHNgCf%oUn48(K.e$]M<98CE(B(?r+`+f1C[Q<i2gYIKl[HAnWC.Wj5/FY=26=TK
+%('kNqY]1!\Xtq2(P_TN3ncuI0igsHNH^O,CEh8!=d:j+D;"R?aI&?t]CD(#XDFUBfg8bD0=>;j7Y[7NcXuqr=ds%:o094PHd+=oG
+%d;RF6h'TCUUQ=r>a'MH=3=?(IUgEhpCgF*LnS0_8-Md4?6+le+o9:N:QlC"Ggo8r9--P.*aJUTlf5%X%C,oQjr9fTe?RHjEfDFXl
+%'EE[_oo\dj;gHKc^6fbREN,1T#ZBChV at DbA&:0 at 7r'ecc$VgI;aIm&;Y'b`!'Zgqf`!P`DqK$\sT/YKq]24S%L_qN$F<+=E$&]&Z
+%jeF5EY/COM88mtJ&]AY>mWO^0+H9e$Y#V+<:ooeSWh^!iFY\6Nh5:4]9drcrb^n$/&A(jqIc`3U$\TbCp/2luqOZ9`Eh7K^7G at fn
+%H^Gep)Jk at rbBKgK4g6+:3\V]L,0p6d4HD5eqmd7Ompnt18VTs`>_6Rj at 2JjX*D(GLjd4gO3L8-A$G1HkctmVa+"iSmOXZ9[Vk at WL
+%';'oIFR#j4]T,'dTiN(jjr[^!c@)0g?F<M,<:T[)Zgng;O"<"`%G7X^#)^W)B`TOUTWuP2\O6RY!dLE/Z_[S5D15XDb7 at K7gYk"J
+%:#3EcB<V_`p#+N(d!-"/ZnnrBKV:5S'AW.X*pnO3$3-%C<2\qGh]M,rf1/WPmDQ3\,F#cd<Z=4sIS*m&H%A'f5=%+clTNm0=p at m[
+%=V+pMenHSs5J%p@=lkFh0eK^"5f0k.V7(Fs.8O-2h'W1$8IF)drgAjB+@/b(;TG,K8^6Vm+"T]!q.hD^Qg+:?1R5;lf^hWG9L\8/
+%E&l(_)iLJ]3JbiB,=JtDA?u=8H\i-T0%Np):7oV5nK#IC9FWpq:1%=;1H_+pg%mdq'Qg&bImD;m+)3*UMF-ER9J,_Dmp?AB#5GKF
+%j>/12*JML:iW#h)6:Q&G1TPoa7L*M,qDJD)Sg&3sfTH<*<am,sH8=SV69((<o69fWeL()7eGsT/OIIE at h5J<P:"#+eCqh@(-DkoL
+%`Q<,7,s^bH)@fm&.3gUAVjV:rFsH%5k?5fjkB#`4C(l\3fE"08(MkC!4clt^G=r'3%;b0")>ST[<?HmGc[_<dhUMJe'WHU)m%B>s
+%o:5UG\8+0iGMCFLeehNDjCTd`noLWT=6oMMY#@;a2tEnPKV-NkX`Cl\Y2J]3<+'1UEZfkOfZ[gE2a&q]^?\B;S$=(h"nD(!qQcn:
+%K2h<8Tpu_ at 27:,GK9_L1V*u.2M,9FD'pR.G)'8.S;pd&qJ=MB.BMRkc%IHbFQXY^Sr52?b2"kRfUeXK.6/W$%`!&.7(>3 at Ek9i05
+%#'WGf+RHY3)nr[UQCu.;"@Sl,$KnldX,lCn*hOq^i]VEh:`^"\h#:g;l.cY&]OrM4p,g=c7l!;qa1R(QOV[2->M<F8<do0o%su4i
+%nJfrNAGBX".?OR$#[Dmb/;X0rY+MRp8]FFnc`6MIr at 8U)BM7K:(<!,3R,TkC at KO&mnU)t6g-CSflqMX`XghAP<VrapVQ]U;jd9e9
+%NFaF["//>Fo1kAS&/cEr'gM"n2Wl0$0IHgiMOrDSPF<C?Tbo3ugM]b_bTmosO8ubP#J!fD_Moe:Z%LTSI;Yq+QqcC at Ho%"4QD5[U
+%Cnqp&48nL/$D.)W*,sC4];3%:\II_kmo0<P%Gco-I/3:)[(;EjP73H"F%jEjK[PXa at -,;W.5%5s5#P.aOm#DCp84Rl)#iSZ"NOR8
+%V]bubjBA*K$@8K-=k;)j!p".S1&0rB_#:7@?L%?TOOj02bZ2ug_eUrmNZ9k3qb<W+D7T[fH2QZVS6CSfmWX`\2%sUnG(.MsN_ at _Q
+%c`tt_M+5>F32fEHa.+n1G1gQ@%8N")".b\8kUY3/j,pC%55aOb#8]M%=Kd]NHU?mY7H:p*fco/FP3n(@6,ZdQ2'ZZOdOZECVjN>C
+%/@[T9O at jB+ofV"";`a"kbhX49"e5*#N+Qk(m,VG4^L0Q.Kd#kYP,aOVc=ckgc,>cEYh#1NaHr"_S/2F/9mV&3HCsP.Yl>e=o"^cH
+%?^!=8U-j at too)rk2urWC%N[[fqMB")0"8$8g"91o,ch3U-P"XH"^[U2'pQsUb!7rm\_oB>Do-N/@tXPoNFH`p3\<A/rFu5^'e;R<
+%1 at SVKgcYe_33MBj#IJB*ag?bRM(UUX6;r-$;of*/nsP,Id!DFC".5TR$hHOV7kadi#h6!P`[=LRe#F.2jb<QZ??rLfp_qD$$ANaf
+%%Z\%(qe:$0SmIWa+q0]QW8)YnHmOO_3"3u=]n+a2?q#V#ELO<?au*CQa%?T1-^M)o$oZp%7Kt]^BDL6WbFR>NhR#k7c2"HO=mEM%
+%s-m^ICVBY9WI2r=maMYD,,LNQY[T7P2aN27iNpHUW/jli3tF%N)69*Bargg0L*nQqX(]V;bP%Ud"K1D;k,$gGbe'o9c7C1k`)0NQ
+%==j5mDl6'I2+$<Rb]7b7RtZGe@('>Y1B*MQMJ\a`m=NDR%aWW,am[kA_:J)SkqqN.kOfYj\r!hqPrKeYqkF=A0_frfciUEA3&$SC
+%26P\B#kH:%3h54,W]$[`DH0oF>gR.[ib0G,4OE-`o$OU')02s29%k3p:Du7Lnu.PoPs5]XE-#=+O#iot-,j at 46HdO]fM%F"d$rYs
+%o.<7tVjX_f1nAEcrL)A/pX\a]jt8Q?m,)kMET0G!`OFD?E^(ni7JpShgbP`0hGnB=bfVWI9;.__A`cA>Ia$I88ob<m<2?[Ca\#nS
+%c4j<1)q7lj40Y at DY5-fM-0OAPI)3u`2%XbXrA9r!/!gE91<G(DqI:['LKt)bHQ0Z$]]Um25:$HLUjnVVU3W(fFinq<GEG^%lMoIm
+%(`uPXI"4sjqO0$>WK)UjNHsB<"8'L(f7RjWbDcOBG':75R6R at mQDjLP>%-96J63uT707tJC;]_WRan:,:4<R9bF<`sWq$uGlP[Fi
+%W;pluXnL!/"uQdgnES.Hs7/X"VbUEm!"oZ6l[U0Bk;COWQbHfZ;n89E*jgUZ_h&%]\>un8ao)8Gosdt7LfLN<Ot01NP1N*k<#HXO
+%2&c-Y'u(F2/u[sFo67PZg7#,5Q1[a<\oKkLT)j$`o;BBRFuuS4=D at t#`g,W,NiL$!Hs9Kk-Os>Bi&Gj4gWaLjhdpSRDF3K6i0lh+
+%7o(o?,A2"e=*C.aq4ONQY%V6%SMs at TH[!g.g$+e2&\`G;LZu;&3\p#n>PET<RO/s+1+8!9?kI!K]d+lkip*92Fg/M@^3on(L0jBP
+%//O;PkLACrG-m?&b&%I(]6[Fp9uo<NY>=hqAC#&=R8'*f1M:"\D6Jn"B:s$uVY!V]=k:\ll*b>/ehlYKB=kD>m*`;>Bk;*22f]fD
+%WL*B(]nn*e(VW/Q_"^=:8XL_92:qMRouESl-erYO)%/XP_&LD^^3,X'?.GNe\A"EOs1OSY.+`&1@@9r1ccKW?OFlK7[2aI\?Trd1
+%#fro(E4^2XP*)AeeYP%:IOniA4jt!93)1MDeqkJ at S]JW/n[[h3'*1/-"HM&O0M0VeJiUY,C'k8_Rn8jK;Ya3LgNqT)3aMu$pqYd*
+%q1UiE/*UFm_%]^;[!)E=\V]8JUg5i,<X3grjcaIC]J1TGg2mY^?!TCdU+ErtrON.ef(DohA)3V;DQ[8<A4\i7)2mFG0t)BA19g:j
+%i5G1oa/OR^RO51.hgm0l;9%.D`3A`N=:7cB8GnnNck^W8Z'Y,+qf#-T!@^$$[&jNE_RE`pht'Yd,`U;gY>$`tfcq($2V6T%a+Co)
+%GZ'@Kr:^l4O0 at 0`9`!(u'S(U'H>,(Tg%'FTS)gI0QXM!6]ZVs`DopDOhap99g6JWJSGcTocSs`W3cEgI(_\32k*sOOg-.sQUt\eE
+%l/poTb4B#Iep*DH<^ELe/lp/X)JuuaKEW\l\VDW>m)'BAkW$0npP5!Xp&O86"mMeXI_`%9V`,ugMp\du_\E*28Irf?<)2VU(s8,L
+%+f%Dg#Ai:ds10OGhQ'@WW\NW0j\D\kAtP5KBUXM-e(M_.CD,?,c1U5[1`n-,MR\*Bq^jO;UY_Ru>Xr;#P8hA:A><od)OcoE5FH:7
+%Sam7[r^@GBcYMTdYLkla<,YCrJk.]!)D(]+<:+A)CnP%Rar/Z]a3;t47+,1+c^u85.b(71NF&_ at qEi/ifm'aDWUuuWR"i<M8-b',
+%jloA+hf$^,gXLe(%[/9@&$+6+Z&-D#J*enM,E[HX#V342QJsi!Dpq$F9OYNDh1hSU>P!SRipA`B%c<1%i]4!@(9iS1`'t:[5'mo.
+%o0H9]*),/&i9?6ZD^s?@i@>LsN:h at BZq''@eQ0iAH2Eo0#<o7PRD4 at o`>-=^/#/Gm:D5Q"Ln*N[jg\VRI<NLCfO`(9dnJVI!cI,R
+%RbQBM*G%CC at qpF:i<qZ[e.SfVMhXbA&<dK`1\M015qt2-3I9fq:'h>d<7R'p00/he8NN2^rEI_MN-'8+e at oB)j1.01/<20Hjc0ub
+%`S/Q[-;LfE'h?)?YI62&Y;8^5J[:];pg`g'2,dF;c-)@4-h<ZVSV1oMjPDk-[%<e/+/Xg1T3f:mg4!s3r^dO0$uE/[D>rXF/ubq!
+%K&r\Vk.9e0O6![o\;k]Q5PJ=oDQ&e:;p':qpHTV?Vjkk>8Y;uT!]+1VWO6E8G at F:3=,"n9IU at BQ$r?J"nmP[c)+n[<;g4UpSHniK
+%+S%ke`>=\7H+Y+gXpM"JD3-TWP>0F\I at Vt1jG)c))%.*?pbiIY.kA8taCnE$n!M'$7:?)!P8lA%)06&L`+.mSo't2fUcRk!16g\,
+%&QmgR-?qE#4t:b(18._4LW/"IJo;3+hKCsrjJ?,3A/8pP$ZU%L=joiB7GC^#oh at fp>!ni%Xp>f61/VI=VfbtdpNU"9P3buTa!Zt?
+%k)Q=!bdK+im?Y4^*[0i.*D-u'/0:P!#:8JG[bjRdHWd5?ADgK[1<Y(K?e9Y[qQ#/uRNY"Vj](gNUg5rI+W2'U;Da\c+FI at u7X*";
+%=X8aOFh9%p@)"J$bTg:C?nlfHXihG1Gr:FBG2NR[]jQ]PlV4]3a6X;koJDaM0bFV%s#Gd,aW`*==R".9S*#-Q*T^&1!8!54=eu:f
+%)Lj><@.qDJRU,!?;tc4.c(1?_>X^VIgA>]]-XR'2jkmFm^>mP?QG at eX_FLa!HI:`81BSJW\'UC%D(lCf7"5R0R$hk&*E%657c>.d
+%C$?nHVPH1Xh><8&"8 at cX-`<p8]ScVAWu$r,#;qShf7k%Z\A(a.ZMa$BQ=qC9b,Tj]</J#f].5FQ3EG^u8Z(55dl/k^PnrP/;^2Z0
+%?&<^bs8Qq`=_sjKj<4 at qol_`Q]:k<Bq9UU3,O"h::1okp1eJE,#FmgQp0*jd`Va[YNg$B'Di8DSqU:3qXC'AI8O2A<FIU]#8\mhi
+%pE[OQ_;<JQ>!05mpPI-Rirn]mN$YaKa?6(7D264$1bG4[n:8PA\r1)h,liLk)RPd](c]9+5C5,u(/BIiB6&'CpRrq<Jjnje6I9MX
+%Tu2PbO<9td<V+^F^ro,m4-c/C]I=d%P4Ou29<b==Gc^JTH\8faWP/qb7eo*+-3#<j5 at Ha0T?*mE%)gFY8/Z-`?$iI3WHl"+rsn:J
+%j^f#!XMA$q"\7$l^V%UW\mq:gn\hro8sbohc,X`nbZj\@H4$;B%ZRdP;;7k&8tB6p^3YCRqF`XbDf>dSD__Ht)"@&=2g8KYdN0q4
+%%]T`t:(E>/k\<*di<5)3C+FqW4L@'/7m9"Ei[%sCnbFCjn`E4bs-?RgX(f]9A-Z6a23Tl>V[<cHVVd'?[9lkcjB3k!m0DJ at jg5ni
+%7&4B-Y\?aGdFMXklRZ42h'b#XTtq at o(<9D4?(=2"3m'*V3SZ+0f1>&u>))q2]^)[U(LZ9nIpZOpm6JRl<O'nkOtQ5M-dTNTbo57N
+%#1440:AJD9jl;8c>5p$B;9qurGI_AO:@dfpm at T'']C7uk^<I0M[*'GgoDQ_XSL$gilaR#ppXR=h%CR5qpV2C";<3/]YA[EP7C\gY
+%,Y3O&U;IQGIh8jU%3CCC.51*^Q+l%q"Rd?!=!B)0$gpDSPN<FYh5gM at K5-YtRuKLAhEdu3omuE8"C!>p,`@34Du&cRZ$,)G]lQfS
+%]_KB:%-gmMfZOA;;Jr25'cfF0?iGUJ1S-g<:FkhKQ,J"g,nT?/HV8H$-K#q7b=-9SDSpKeL!@B?faBP\hOou?qek[$\I\L!bK`O2
+%iL,`^_It"G@?oodT3rX#Z/:sYXj%'G[;SrTH,Fnd$nP>'^<*=QSo'^8K<^_GgQ'YW0MTi0r$BPJ?$%t]TC)SO6Qm%>G?tgS5#=.Y
+%.Ed<bZk8)0s8?%V?0><_nAmfTKQ?5o5GKtckc]ZTP9T.u1<]$DaA$P.n)n(&*"m#V2J+TlF^3nO6`#HSEc]abmlD1\H+_WP4Ye=1
+%9&)aS+V?o1'[Wn[KpkI^YGAffPp)>-#(`c?(=`/E#K%W:3NP;o$MIp^^SBN6Zf.Mu=Nm=W4G$u7b,Ql2j^b;p-pI/,:I[r-A\uZ4
+%"eY%HrWFZL&Gl!sc[.PP3r6jQ8?sQh*s;\kKHP40.@=`F+`?$o"IdG3>\pp/`XS,T,HBF*dJ-pkhUoO)iGpX#i'<nZb%[@_<j=TK
+%_B\Q?*eD20VaAMU)(WL\*TC5g8bX[<F[o_nj**2#:0D-]I+LLDWbO&TSm$cO9aGU9).513n6!/Oj]c]f/$5(iM&1Yk/[J$@qjPa>
+%COL059!7!,*Y6]&4)DQ+j;VZ6A)7:dF'mGhF4^"t:WqfJEUnbda<7&(2#1P%@km!fmp1)lJ5bKIl%_1$JDR/V'"q/n)^uWf3Od<o
+%-A>A"4F4b87_J`SILgb.n>sMo>&P;UC*h.0OA-F)Vi2r9WU:anJ4PMRBE-L8k)n@(&/4KeF)jaun=]I72<?`GI>*UZlkr]B^:%a!
+%(6J>))L`pWF at 1-HD"o1J>r`o%>e)s-,IPe[!1sHVm(3<U:WR(IitkMF:1E+(\A\T-'D;cTV2)b3BLuO^8PCg2+W0R1]3>`3`_W"^
+%cC`b?Ci:,lYWTpC_1tWs8POC^lc$V`n6LapXi,Z&$b&FEMLbnF6u&'4[CGtue(:koLs=i0$LR?Ia0;t)\X"0"R4Prfc1Aj+msHAf
+%)LihYQ3eUB/.?c$8*hK$Q9G%$aZIPi=;tHi(Z6JW=7dB-)Hs8BkK]TgK<nHNe<B1Yc4bH"#55mENfBlaf3!M'RVN!(nJ5r%,g]sB
+%QNsaiA:1bKG\\QEnKuMEjsO,1Ci&B/CH,+=F.uJ0INCdHAU^p[Re,oJj%lq>aP1[hK6=/lVD)1K]`]$`Sb6k4mB\TX7+jV@;'Ud(
+%a\[>M`6CJ(]_O^u>H49ldEE[*=?h4mI5[h%]Q6&*M>^0+AD?`X6;oTmD'lU"^'X?%"+MsGi.NeR/(WNhJ)$tJOW<kiVEfW*<pU>4
+%+ZX<E5Du'N(.HAY6A?pm=NN4/Ydali?29hZ>=sr=V;*>668l`iS?rg-_KpTimn*+$09"*Ji91"jgt8uQ&#>"FDXEl?kojEF*L7EW
+%[O4m8o]j'Yij at i?4q at KS'D0FFpA5;*=fd at mZ^==?rW[maX7/lDFT"h$m*"1d>l-*[,rJ>9AeNZUH#mfPmQC1f@<:K+D**?+lS=9.
+%j)F!0k@?_,G.)7V#sOlVR[)`[eE;5W_n96[La:Y%BdKN4(8b?n$*<:(kLjbKEQQ@'lRJ1rF%fmJLGctrl6\p)f#q=e+j%Ml_d8)s
+%CeA^t90#\0CCBl$.u;5<qH6Or!m.mM3ga(rW;N!<ZYE\J==$#iB>%4c,`+$IYG8>cIulKYM3.<!AI2\WG"mt2>W%43 at .qt]Na'YT
+%V-442PDI^4P7?BZ`[?^]Q5)6C(;\R(8>S]<FY5=BQ/$^:/=g\DLq-/X1FuNQdg\JR]SV9+X\A2j[#E%lI#8ka3XMJ>lV:)4`SeXa
+%aO]Hg3Tk2,?@22(1pBX3S]Li4/pd(?ETqnDW^4R4)<[T^pTumTd1`ncPmj+C6kSaU0l89@==fs8l+QkoFM;RQ$koS#JjZI*gA[mL
+%1bp/$^j^'rj at WEicC3*uOA"aI4:'bZhdK.oVBH1J<?QBj=:W/p7*lR1"(sahAh$HE4l</"ch?Igj=IIRL`CO'/*o(MZ,G?*phKhX
+%q.K$b-\=H,On0=j2tX%_H1)N at i2'tjpZ&'`OYR at k3tWt<"f31KAuNO`8-7$NI?5gNWAq*R>`jEmIAKkB(raq+VDK?-T;tZGY+Vf/
+%UZO:nKangUeiS[NXc69=K:URQnVeaH5SJ&,M%^8fGF at D`Q"a**@:dRL\o3igp07*-3&(\XBW91l)D#"\$<YO.\+Q,?BR9L)>]*2W
+%Ka,Qb^+d<8$_cgU(>2(,L'l>XX]:NKZbG.WBQ*ka*sUin395uBL4>Jf5k:_MG%%%<m7p`mn?0ij26$#.%@G0_j.5j'^1sZqRcl$C
+%[A4%jVL#qHopY.H6'4:HA*@OZE+&%m.2`396q][_Udi$G%L$q_)e[?b5AXU\q)ol#8#UIr+loiSPTLZWF5kgXYrBQEg)"hI[@7o`
+%c_.>0lY,&56D$tHH+f\0rf.B,p,G$W;'XG3`d210P'7OTOXImd09YC&-`87J23joj^/=GPB#aR1nC'%j-\uq]Tj";''5&pi78u0o
+%=jc]\jS%_.BgHR7`=rY_kEc08@/d%)ZfmQ#.ktZg at W"E9>7K31kl[Seo.;ntDU]C1'M+X&^%oKRbHVcT(*(<*HGYHce#sHJ(.r
+%(`#LF)NF/s1GmI<3&PuK2 at ZhkQP)?"O;^+r[/Q%Y)i%d#b*Sc*hMMf'^8R_`VVK'f/O)JeU?\8,[e#1)FtO76]B>hsX`'e/Sj5JD
+%UU0#$I3q7/'aI,pMLAYh[ab2Aia_NkQdk1TO`900bl^&PF4Y/(>B<0WfGI$>R+FVP`/3KqAFM_;K^Nc&Bhd4)CM/a9EmP)r7)lFZ
+%d'1_G##8lK47OmOGI8VC/7Yo3HaGWU8Q_KeF7_VrWB;c,c93K+Dkj[u6)6reb4b1#8UZ*)Io:i>j,JB2`1Cn"X,7<A+jnJ!If&6i
+%UfL2t14?LeI at X;]VP=M:2/.8D42P.B?HNu/Q8V'I^E&C*J_1+X=eRL)c/4pUCFB"KgX3Gbqnosi;b,!-YI<nSJ>FeM>5.6hZXmMr
+%Ej.i=BX]&4m-KB4eJ=E'(<EB[EM?kOISL/eYbo&.8[u8&'u"W?[$jg],dJhtl5*jX%44sa&bYGDY9\&9c//DJS<#jW56%:mO<\1A
+%6VS]2(hNDEouaEb=!?dl5a`*:isu!m'U*Sq@&j7)9LqU!&cWnWaM(fk>3TVR*0dE9I3t<nS^2X;Ip`h[6VkL<3N564]!;c*L<n"e
+%o,r7h'!e$<rcN_a@]k\hZl&K`7Vp%e"Sml'=tHodZ#LI$'DK9?nH:>do(s47DS<rZWa!QZn?WiD"Hnt at s)p"T3>PAUDsEl+PRH,>
+%hDgN0/L^r`b%>j\D/,31[u*TB^iXG9m?fDoGqsD=!N\12q^75.j]?q1NXV at fj]]6eo<\d8'pTa,<-;pUgf`m+?/*K@!l'Q'^"..O
+%4.#S^T6cJ9Dj+/U2pX_cP)gV-okKYp<QWDh?^KKTkI9=!@Mju at dZ^Xq:K1.&[,>KSh6cDK%M+(UUOo@[j1.L%M*L->M)'q\?+J!;
+%c7&lK6nlJm,PN#E&$'F'+;&k9"+?3!Dc-tkVPZdgU7Op&9oAK]YI1sn3KcO:_F5MYj?+NMN!PNI(*RR`3oU(\/**f'gkU=NPG?+P
+%F=Zk2 at bGGQa'PA5WZXb&rMA^j*QUO!#fOl'4Cu`lA8p;0>NS/s@]fIJoM^D/`d@#"cU>sT9RP-"8.f?jEMn&gY(*[;ENTOt2.e9o
+%?#peXNJ!N^nHI at JC?eKpqFJkU0","gfr<)7MRZU(N+$"KkY0$sY"<fo(3':"7,=%u6LLV<=M6'-;C?2BL?NXp&gf*@CA,T)$gf4C
+%Uui]s0'['EN/'RlKtha!S70N"UL/U:/aQ&a-R]sngifI at r'E#I0 at T&g@#b at k40>jALG(P?nj_7D,t:h9,/.K]M;gAjS+rX=3SZp!
+%ASrmS;ZV<g1rV(QZY3iYB<FS8/=7)k\a7ZI:L#RNEA#M.A>_=c&,Ft'FHqtu>*/>0 at ./aCgMu?[,o-HjJa>G+^EbDt/JN4U'cRqO
+%3W24+3iKFKTtBQeG5Gnb&j2KcS9bEGI\G/VT:W6'e4!3"r,A.s<Yck"3B,F:c\h2a+[jkn,_\!(cZ>SY#sEep8*V4$&Y-E9nU0uP
+%25]U"he3k+l("Pea'_odk2)q^ZY>X*Y5D-"^7#I+Xbn)nlJ]uL+LEg.D;Tm`qe7Ip>djWJ*3Pf[Y*fife7i!9F1ZW8jJdK*@q<CG
+%rCYpQYk1AMS![-g6ibgqpp)8<c#"RkR\LJuUm4%9OmIPaM8be7Rn;eMI=_OnL/+FagC<I<icSRpbf\;c;U'%bVlMeTn??e[E)`k,
+%jg'l3@(WZD:E1obk7OtC93:R-C*Kc4ib/tSRCA>]EmNj!:.=gS;>)%'YSj:f\o0_3U!B2tbY. at q[R4Dd7j</Q37.DdR[Pfn5Q>oD
+%b"dN?>;7`U%K[+87JTb?72DY!''kDK2MNUmD"q^WZ7$NZ2qQ%"=?C0Y-7;7R9q-N)Ji2>uq(W:mm41\ugV$9i%,BftGg@&u4bT[Z
+%9o>F#;-h'7cD5oe30m`eb%!+_9q at dCns_6odpQDuP8B]mO$L#"^n8L7rL6C]["7'r>8 at A)h48a&:TL?]Nq1t,b8"!CZ$3^@/HLBA
+%g\)!DjNr4;\M#M5GN[GP;pK]e>s0g]T;\akCk$IV]u3)p`[;(QC<'sj58$iRA[6CD6A*!/>G_"D9o+Tm8amAgaGSB]W&)&I=^,a!
+%O]0p,+1's8f92aAZ7F+OmqZR/rn[.Gf6=*dQ.$iuQ4qP+L<i60SUBTHO<VK%b4_r-Oi'fi-_Q6Agl6g'8gX^G!l.;i\%^c*q8;:S
+%DmG$%5ZIc2ZQd]:A'1+_U&kkCrZ_(^8XQ4D\K%mZ!1Z^eFQ[>O>FrWELRCM+N]7I_?-"BJ-',ipB<]G:1e"Q^q&O6F323)^0X,P/
+%Gj:dMH)t6d'BVj5lj5iiOAhZLi5`QuiE'IuRYrXX2q9:fQ^V9``6NR%d@;*YWR,+%6+nBVT+AnpCM'<RY/Jp;Vksig:sqhUK0Wu8
+%6KhZ6T*\X&."4-JDIfNuajbg9CN9dqCdm`'3&@*=Q[Q;Mo@"?9FV>]U[r1QN?=!f'X?Q"WB9_"E)l_ZNaV.4l[_I*p5=9Te1'Cd2
+%0o"<+"jZ:Op7S>N#.'pt38CUH#4u9uM/, at 33[kD9D,Z=u;p/@2:.-juedrtGC3$?]90<?q;[;2$ka`\`@fK at ueihDO3KoAef:"NH
+%jAQu*^md$,=l-Bc17^i+f.k6Nl6AU?Gt^N_JQ[bh#q4up,Yk7Dpg%.1'"%7t;)\)T#QG2!O^)QrdFK>[X+sodX\io>HZ,Z(2CoUc
+%0Bul#B<.;VQ($incfl'$-5]1Xk?+D-r(6g$\gC(3Mt-e31Q`2Ne`eU3j2>#iJj_Zs/*k)qC:>+NY7'(O;p_,e;DT:dksqU$M2nFk
+%P;Mjt;u$@AW(t"YbC3Wi=GZS,as,<2DQ:GS`kt"#CsV5Vfrm>Irnr`4PA?,^>/<P!$Kjh&,kN.UG($r[ksi;.'h/,dsGs>.pXf
+%1$m<B at 3T.?EdT-[n%#?\Wg]`&k?aEOQeEMBKYp4U7CjQ9L2CDs2Cg+`'6"qJM>Rh"b(`:ppM`YakM.2LJps>t4jTqk1K,*bX^N.l
+%XmA(g#(3E3roLl"?-7`3fii^POCqQ*jmE;K at A$J!5*;=L$6_0*FrYj:QUG,"9C<MKho4+cW2)WI*A*ZQbL=#+4n1a$,LHAe>Z<UQ
+%q'rm.N@&477rHA?nUl%OS'Peb@:?D3,M[IFWe%(67M at +%gT;K"%TppuHcQQa*;eI$$s$.aBd7#c;"acb+=:l'@]r(oK[eqdp%VCa
+%,.$k,M8(?lSnDFT<g'LD at B/l-?puC+o]Z-fNSq0,M*9!jiaa>HMF)GSgV*sISTZcfFBin5Mc_2u\\'_417(!+PVI5\NMKb9#nRfG
+%+dmG<_BuOi:8TLNknFU\^=-'tSmI%oJ&5Ws9G6Q)AIl80<*ZGT_fg4H2<H!'og[J>5:@UO8B2X@?H%0jonP!OKR__WCi'80.so,u
+%_kG3$&e1.j/t8D+X)htRMq1\M at AoH\aI?j7ENOZsR1s.^4I.gf,O_;)95AH38cr4WUlCUo:\c\sGCPu"IUL5hp7iqJk/\k3D=,hL
+%=o#ts,[nh=42#lc<4PZed&,Z+BXo[iY>**Hd]\iL"5r^2DUt=L1<<ml;>Nb2HEFFLK%XH2-%S<V:<KR2 at Eh:PFs&depsb,*&klX+
+%ainM.2[a'oelS?oSBV#W4;)XO_pO]FRph<p5P9_8YSEpRWl3>6R#2a&[hf#8oTGC3MINlbEYRIo:ZjekP-\K-9"kmX?Tf:GIi"]i
+%Xg+-7$"O>a5#-mQ>@ELMk8CH_T`pCD82BGcW=gHI0#&AC[LA-k=,K_r[&.BQa$6O4#?9fL&SWned/cT0![W,`(XH:\,iiEPRXIj.
+%/a=1nTOaVOg's&,9nr"ZRpNR!7%LU1TOG:Y;d]g&8;%e..&dWDBD_$sdZmNqORfZf%7s[CQk(a3$A)Q\\*tsuG:fL:ji=_;cI76+
+%Dh9lf&[7;)SC.WmX87dS0UQDK^g"t&=.oM%"0'&ZQZ';a3A5Q@:9$4E6L?&k1f0/["6AF(?;-g8 at G#@eZ?BP>7M<e,4\+.!SVRs&
+%f!DmR. at n2\.'T+r<n'4F;D`t6[MCR1Y=,5iY&M]o]^^U2OT971AZc7YF4Sa;_/VM]HS1Um#G8$b/^m;!RlMjc9O$P<D0P9TH`f],
+%QF'lnjViT'/Je6]D7*1B3o:^9?Dcp)ONY^^\r`=1a7aG5ko*$0>.I3r=.MZiC*97:.>D25H$MV3).dPV;8JcCn?;;I0WJ0r=]9_t
+%N<]taSi.na-m/A_:i0k(gepL_`bPmEG-Kk:$l7a2EDIT(,pDj^=dNbNm2Tm;Y>qWW$lum!/4O&a4BU%G0t_Q)cJ42*a5^BNlAtP6
+%fZrt/f.a0MQi)2hqqh7-"Y+fNnPFP"UG3aXkmt?D;m"W%K6"KP>-cT?IFQ.U'd`Wb<d\[tWA`t2]I=R.Y<T(;$emO-k'Pp0ht9$H
+%^_"FXD=8o"8rh:F+le]<TnMNT*jfTM6;uV%81kc0+S#GqFFqHVe0_.>=inDbm24WXCMq#$5E(!(UPu^`NS8mdmOAs:g<<p':5TmK
+%+4/a"kEsCe+PQBC"3MUca*<GOnO]IH?7m4<Z\_=WVQ:r-EaJ(`Or%E*:MkF59MfceC>\H?h,`t3NVKBiqOQ-Aq<sL?YIg'QA)WoB
+%i`V=UY+L(J$.nfZR*C;[lThSic at A3)J1'AFrb>Z/C:E)DkhYlq49rd@,b at j;YJ>nmO:.=/6d?-u+epe,BM8]_C6b$a`"X)@e:Rm-
+%h3'?g at mXjeBff2&cLBtFVoM6.IbWt/*J?)HVKhB/nW#KL']d2e=/AaP[4.,^R,`)o:sdLo74)"O/;'bScCBjn6(R?#V*7g+4F]C&
+%V-2'[$;/- at fcjcc`Q\V,[HF[M/%&_9KuaBk\^Q_g347@&SgJ+l,JX0BGc[B at M+,sZ`W6k:I+9eEqP8SS"9j''Kp4ai6qTL'cblEF
+%OHrIR*bSeS&<,/FC at CbeHAY9bd'-_:9[!d<dGX16:DNes$^HY;[=Fd6EkqR`qUTsO90!a#.#3i@,!#-Eq/WeY34C,Qa\t0+ZuiRf
+%:Ca^Vaonh]s1&Br3OiEB[G^)TBf*]9-\plU<33aS!2CZ0<5C]_K\:aL17+42lTbM.;*/LC_k*UFrQ0+,4%_.$-)a-gpTY51Ed!rI
+%RLK#GXO:qcf"?2N.LQc&*37RpQ<>(FI6,(K,>?cUH at 1*-l(!m9Q1sLajk;CU1tu5<^dJZE-dJ85R@:^bb\l2%_fVo4c]P\4XedDV
+%-N'H^^k\9&e\`GV[BeOXm3&L*2Ptl[?IHra]Tb at Zk#]cT`(q at K<f at 9m]uiY#RPIl"?Y<f2;_hQ=WmN)GJ\@^fgo7R$NsdQ8i8/P?
+%q9\YDW3tdnYbo55J"CG.""@.0!DRjef*M6 at WM4K)Nq[3h0o9*8l'ukeIJGP/F]_+_^5?Z(hsH14_g:k`66ZBbEpHu_Mu)1t,B=?1
+%HDVb\fW!TVQPIqjFO`so"[U9t0:P0?Y_qjGad+:qd<H0MTgG1NPTTNmHtX+$jQ6udj#+T5'2>4TA&ipA"oXRPo8f).a?6eal5VV%
+%Te:VY<qIL2b#a"8p!oN"Uch?*)=l+OI=hteCOiCOrS<h4OVHWDBDMW.a?c&DPgs6^E.!6`;O8]HH%*2neW$P*DbC4!:1k\]^$?A*
+%L6dpOpNnNg\dr$e'4'tUVS5UWON<lsHYm+^hSf#MJ,BqGDUC7q_1:@%ZINA9`3nc2j\o;TfWFT/4EeIskBZMG<P!0P+URq#>H-3f
+%:3,mm\$3Ss5gEaF_XC/@C]pM0>0]0-a)n'%-Ogo9G<ZuQg)0Q=>B8Rc+n`39V:"?nSp&5*6)q:)EjH(b#'/3@&bO?&fj3"WqatRM
+%FY]81$?^C9E[[D[Z'\$O$Rt2pFHB0#]%3:k=/,tUZmJE+ns*]?/*u*Qqr\M->3r5DVdDO9a>sRBJW8igGF\Ob1V$C10 at uY*$?>F6
+%6rZ6Ibp?>/hLrAi3JK7VrA=\e"d.uA&O\*$6"D(d$nBpXcg=JNYY[fim]k^M%/Yd#=1b[f(eF`VYnC3T:QA9"1ns'A"9 at SI05Rel
+%s'0A6'>W<XCrc35ra^TrTa"uP.HV9N;Rql9b]Vq5n15C$oP6B%\4m2)ZQ,OI8/@s-NLc*K\%_b)/mBM;N;:,e7(N$Q*"te(YI_J\
+%&&dRY$b%N>pVA2e6.CtM5kI+URcg005khX%^ei8P*I2H]_iG at .8'XB"Z>$ms&dX)@mcg</Ru-]>l3Nr9Q#*\h`L at C"LiAaDUTY:Y
+%%t6:l>G`*OVg!:3XVgp6bM3N#<6q7AoO%&Al,A^dP_HR(7&'0:i.c6&*p\1ef2u3oKWLC^4,#k)0LqMljkcJnrB!b1/SduP<ZRb%
+%/TQ&(7dO.lof\Wj!AdL"&Rn?-6:1oN?KRZ1,LiDc:b[@>Y at jDj:e*fhhShPuLtc^Z_DF="X6tU1o7[Hc)plGe2$#Qf6/'Nlh(9Wo
+%MeJL="C*c,0[#+;R,gt'j\EO$_=T#InL,^?gt$lBUnrTa at bisDqWS&\UqQ*4o]=3l]8G^GXgcn_HJ(u_c_0 at i0dY8eA<upa!o at KB
+%Yq`,F+tcM\ad#t9WX*rpI3VN'OJEcO0WjoaP7skYHiE3jn<kcc at X)uh?.iJUHub\O-R?(G7C3!n9j,_YM*>o?fkQOrS%P)/N&tV0
+%cooQ at 5):=,BD*o:a`;),QafQ<+^\M)=\m"?Wo@@J!%- at 21;WbQ.HE>/0dQ)]B9f%*)`0J[1kqU$j![pqe(s?&o2 at YL>uNJKrM3.e
+%PSX+h9>fTW2jVqZ at 3[o"."(jW(Hk;QJ!\0B6GE]bjqSKr at J=_Hh_V>^&\H\fi2 at XS8h>t'"aSfH:j.Qh!bZS:2)8:PUtA>A$c'9U
+%4u^5OU.XfVEg_m*aC`fVQ$#W@^"Z_)b5L2m[#YUlA^Yu7GNj$(P`a?W)UQ%ACX,%IPN$%K_^(OAp+LMen-Q7_aA;@c_hpN_[n^jr
+%ce:e$eiS60Db<TjB[etaNmTd!V_+<g&+lI3=HG/c(\I7Rp@?ENLim$-<&o5O>l(L.OJj7_Mj^1Ent\s+Sm7U(arUHB%._ZV0K`8T
+%P6Vtd49?J.rdOEep[`EO\3b[KkBX8kd8RsVZ`]4J\-_(,O<L2XkP<P0+R<F5miljci[][)81YZ>*th;_M4RHqc<'mpTSTDANmDbo
+%*Cnp9GWqrJL\$ubE.V-)=J.Z?g0BGuh5laJP>+NH?)s-i10Lpe(SlRTHl.Echj>]&N=_+FJ>`Z>nWLm\W-pCN50rIooi(jrG:pDq
+%J^MCanlI)^9[M.h%NDLcqYf4l#(_&MWO%b#3<7cc\J(k_PYYc(M7gkOI<GiQD#0"TfQiF\>M.RjD(F_BKFfa?/&F1Ng"A>8aH7bb
+%WUO2d=,_f]+1(B<iJSi!bu>VJhOB+B7qcP#_fmeYki-BG/9p;N(A\0(B+c:@CPf4?Z$-Pfe-8,I=$k`?HVW6R2ssl$A4qkML0I7,
+%,Lob+cQP5],8IATd*-Yp[UkkIK[W\JWc0FQPC,6*:%=_U'pP+;^ZYT>)A*mZ*$b7-ig:nO?S")Q=X!3_?[XQh1WsXY.9?m=>mhFe
+%pHY\<!o:kl"uBB]R._0Tc8-!8:[r5k)E;7&\b3?6WHU79%86XJZqJQ&H?VTO2<Jb[IMK!L`0%B.j%3Y=5"o2:FO];e-[htfC25MK
+%P?.U?r2Jf7Uu.[O9SL/6[q>ZjUmsb5s%+M>c1`*1E=k452_J4uj0R:alg3n<U3ph3qe<+m*TlE\enZm+!/$[\,(712N_M"J[FsV&
+%P9l+ka)sb(A1dsnhLn[^?jEm at UIa$A?D"BM:nJLgTF5^[V'qbTatCk$,P!1W%?b<`:IM9_Wh^'TkK0L8dkKOf^f8OOJAWM<l)/0O
+%WQ/:^3k])`8A7ssm\t33dUQqLq?4)-<XD*=d%?l@"m%,r5BR:+[?RRL.$U(nfWrR[-j\rE0o!G6.hhM]Zu<A*!iPKds)Qjd[67&-
+%O2&.$oY-`pR^"[?qNZH3Dq_9=QZMrLAK4,4:.c)i*R>7imd&Iu+0"$f\'/tHga*8]-=m at S*4S;TQ$W4nb`EL1-/T?2&'B.l(_]6'
+%l8C)Rnl`2TNdSH,"C#D4YRQU1*Vb<a`_ag"VX4*k/Y=YO3Q[c'*?c'Qqn9V0GJZDg!Xe-2%BeC.>>g,fiE>PAD4+Kj-B8Csc+fWf
+%23-Q\28F7&hP[LSEm-"AA&D at b",r8EFkU"W/Nr9%R0[9I(/8<B\,\_QbQ%Z]Fo-A0/j at M'.?('?+2PI0U#qi2K'T"Cf>PANS_,"N
+%T=j?A\[ukd#tD#Y'):BN"7,U2YcXGVS$JSNmuuo?NsA,,I!XJs]tC\;fA_KAdM/]NZO`Ufgg-(Vn'Z;VjHlp>FF"$im".Bj;X.M"
+%BR`?_W=X6;lIush3iR2>4hp5MFCZe`OM+L\^Ibk.K1sM5,[J-Y\YhhaN!j\lo$M&B.l^sGM5lDZF9=<]*[Z!F.grMf%9AU_#tKk[
+%1'S+lhu$')^79ej(JFf#^238jD!8=9l2N:@)p4i-\, at 3?Q?m\^'_;DrimsZ1[5+XdQJ-ufDO#\M[A?r/hM6AKJh9 at FNS%S^C(>Af
+%=<]VbR4Cj8WUl=fcX_uWUMi0c"ca*L^r">uO at O.$D3FC@^d(GZ*(%GWC:p_nKrRJ1W&=%SN#,-jr_\eb9^4_C"LJ$-cZ#cl1='I&
+%nmBiSGF9)8pj0V!b(K-_$<<`A,rCp8J*fdn/R^YpiMP!mgT)D\1lb`nb`_FY)EN_+S.u/:77p;l@'Tp+P5]YZg>mf2FsP/W)gn_+
+%^KW1W>kEC%Gssl+Y!NAWE&cdm7\AI2n.BVbh&I]"Z[$bkEhaTH;I`GSI)%P!,k0dePni2b"s]l&#/;o#8VCQmJL1/,6C6roq`8m5
+%4XmH]I,S2aF*\e0P[BPg1\g7p#UZ2DFA3+!/d':mQ7("ck7MFKf74BFLr%H08tb;NA*+jY=-G`g%%0CnrkV+PjaYWj"7fV&6kVmi
+%QO+)&)op$5]LSD>go<G%]),$[cM+H^Y7#"+h7Q,CdDrm.!%N*unl6(3`gkH=&fCCHI`Wrd(S/m3maPGB>;n,- at p7)&^a9m9cKr.I
+%`0VlWD1ck7ruJWPAXT,[N6VKI8hh.)onGKuXXoh"%q5!,Q..<P[NH2:7RuNMX-HSCF4=pTkCYl4ic55!aK9s+>V17o_&dk%<-9fS
+%D"e5K+D\lPCWfZ0W<s]QE(P)iIX]mr]$u6%_Pk^c/SCa!?oKth*cL>57\"9hL<HWH2;uq1&VfQ:][TH>_,KCig:eL7S4e3X@]rg"
+%I_h6%oO at p@Te*`63O'!of'[?%QBmj;Qdus[jhYV3mrpc-*%En9Qf4.?fE.3,AeU>EU*e>P'V+AX-]dH+V,V$Tcuc1r1c+J6GZ-$P
+%Y>YkZl(V48m!_7!W;q/5Ta?)73NX?Y2Eh1<dRQ"=RS]pj[J90AAME_Af=qN=D)q.DC+F$nK$'/=q<$:spq-M<*N+'0?3+6.EUI>I
+%KQu9pbC_6FP+:W3Ir_:epGU<R"[^BId>0[f4%pM/(=>KC2XaT6Z?0Htg.K)8m?g"\IVIP:o?f.U"rP2jCHa2fQZEK<Di<]m;Rcc)
+%X&"!c.kRR$?D9m6T#-7LgHh%he??[u*1F6=Jd_JI-cKLWmttYB(\u<]P%k`eJ at e!GR*80jeWBm;9R<j_Z++$<Y<A!cp9i+(-D,hY
+%A2Rq)AMc=2h at o>L9 at .T%qn:^<%Mm5.*'lp(TQn3>qX(gl5tCcEYJ%N,"KG`M$lFSu$#nrH/:69<3_$cS$:8]O at +9&Lk;!PnQhoZ^
+%cZNR^a*BpAkh#D[aN;':T6+&Y;aFF2Zm7Of$N/D&C'ueRpY^J9p%kGSZ;C^@jHD/Pj[QPgU`s]V]TZ.31U65.m!DFc!<8EAbq_J[
+%^2"(BIOCI/3/s/Zp=Kk6ZmL*e\!]qN+>MKn+k&kEo5ThWJ<n-bn/90K8a<ja*AJjd,#,*Y!tg7T48Z(s9`BIj>#2l2q:rO at 3$*R>
+%8:8-E>rWSaXnu*)pNi"s;q\Y0)<JDG,+cGcGMiC+T4G5FqTH>%2nq2UF$O'W<"4#Bg*Y:Bi*K<BfqtU6aRW_%$WHOnYMla0o&TnZ
+%WA(9l)42l87]@+_ at H<3A6GN>*dj[oV\*$0B-4rTf[)NK61HG2oOZ[hld28)j!oH(FFSU41=S6"l-UCa,RF at _4Wa'/"QJfL6?VXp3
+%IK\M+)Ll:;.-(uJ9I<:Fpg1K:/"qQGh/I-R(T]b,mKWi21JLaIKN8a/P"t<Ycpd9+9j:*h7]D&!iu)jOcUo?`i7qPnJn838FjMmb
+%f_jl^>8g_4GsL9kit8Vh<#Z,pQ!#Y=!%)tt.A(;MTDJZlZ-55T;]aSWZ#&h7#R$!^F?l-R4](,pJ9h4j0<$og6Ep0?'cl4Yk?gg"
+%8<.6GgJ6dt*T8!-/VW&TVStS[F/n_8$'%a[X4iu(,sS6i8F=oDp*?mi>bXnT["-8fgU[5uf<o>%[tnjANFD;Y=QsJZ1(pPE3r..p
+%I>?Kr:0dp4n/ddsMfi4VFldB--,Ys0Qe^1%(H'0L*YFC4_s"Q4RZ-o%0$M.t:rrg9>lEj'g)!I,J$8[`4/J*#\Ys3.$!;.B5d3!=
+%hun5bLNF47XttOoT's>?CC(p at ENnQN>;gt_ZbE(A>q`&_&+e5^nhTmTa%Z^r(Rsbd%d3EE7l-)S+)/63hr`44 at ZreV+,AoC)]/rG
+%dK#dQKQa?R`kk.8]ch'pgrFNKd8OtaNJSt?Hc]hOPF%TaPW3Y3=K_PAe\dg])9SE_jC4Bb5XiNX8I,Wd"9?bp%RrDfk7?p'hHReI
+%6-W1'O^Q5%),C?1JP_Qt.(2lniHj>uWt#1M8RVW,H)h7:JEsH^$l[02I?f3N.sO:0,QWQ$*anSIFX<L3G3#QEl>0]0:=bJJc-&n5
+%JK=c`?m-J_.:,f?F[!+u+XsuKVNE5r81kk,gA<s%cLSsXgoftd1-,"8_7#oRk1D"7%h;`Kj-jHP=:?8_#(8.*Q%OY/oJB4tPsg3p
+%NdSao8N@;dQCoEV-pKfg2rXc%p)!mE4+18dd(/sfY&=AKlJqdTX0PoNXAc<`%$`Ab9j'\M1)6Dm\=-m^a*KVO3Hb[o3MUgRN!cO&
+%%co;8C<:ZjUa-,.)OJmm06d8\D%bS:7(Z..eg.Gb315Y^L_OS6SKB?ijRk)>Is_dpHD%dNp7>0ab=b5l+'XgW_(4AHHTl9Y&V<[Y
+%odnTUT4ohTq)c!o;Xbtq*Bm(gr^Q*'#4gu#6s2\+`ljH<GV^&YYNpZB>:1_mAGVfhp)sGpqD;d3XHl8qEfOSETDT^J'f.JYSFkqB
+%>6kKN1?>f,AY>Q`*9\)F7>l9O1+ at 78Jm+Q6K;<@T4L$m=Mr%V;T*;Pb73>nP(=cpn4q4uRX\Os=``h<tM(u6<247:M05i^fkC/3u
+%g"[`i3`oigbMBG4(SnI3n6Di!dX_sL+V3WO;HfJ(=5jMi5;M$^nj/rBi<5TQO],krI\Td8XooVW!&<l$pW'tE-<I%$TEWT$-g3Qu
+%jYZepqK[Ng1P,UkDgLNh5*)O?[Z/+PT[I,C)9E$.>O'A7:S3:*SM&;?(R2_$qAg"(F":0=g;YXd`7M-O]-K<(cS at I5R.(D at .r.8Q
+%"nt4DUcFf&7n1EbnN)uITZQR3Z\?JV<B\R7PUF-n@>!.r"L4c3a-fOK[l()[EC at S!h at i6YZF8#YW1B*DM:"@K%Cp0lQIP3<K`oVd
+%)W3T!FWRXjc2NFb6p_`q&79PB_.goF]8VD2.adhY6_q1"F$&C,!T5 at 0ms_P%eior#Qsb`t]]&&88Z$)o.\NJkd at YG)TeB:>IVMkr
+%5H3gfIK:Bd?><[H_gZ/mgNp+<Hqd$m,o/d6i1Q7S?[iC0oHL;XTcF+&g7,ZJ7Y^4<bU+FbMaD;3At$pF8/l!YpI+N^HSG-gS$-"0
+%D^d&M^Z)9S],1q8q$5)b]3TqIG3P,sSW[RJ>@.D)pq2pfK%,rbpu at oU/+8WsgYL at ha5uXb-kei]YOMDT(Hf%\%NN%(4#\B$hP%#g
+%SqM]V*TWIDbL*Ci(=Lf. at f&=Js*IOW[iF9-EUH.C`#tg.W_%2Q,'-_oF..9dXTqRu7Zb7+iq-/7-M1RiJG,*)2r)&$2cGsRoeJ\-
+%LVS`hTJiGhVs3/nc*Z!#0A:*tZODt,[1I/]<KSEEPMT?UB703F+s5,kG;.Z6f<1N)jT\iB\cDUQ4jqZbp\kjo5sbT_IdEqrZBH_@
+%I`F at Sm#sU`_[1dcm=!-Bd^V+,U3.VnhA`:r]!)Q>r5p^?-1JgX-ob`"&XOJJ- at Zu7madQHS*4?'_W)DuZP+s\aDu(B0dCi1d5OdF
+%:%#%G:&FF$P2Viu,RT.&`Ej3uOD&>Z0A&'sgmXS*O/;j+$gcj/7)XY^hY;k"12QqA>.PeF6;l:M at 3i+E0>m7*0RDm`]Ocu55>%u"
+%Qldd[`4<?&Foje`9tuZ&fYG&$`!"0qIYI$sr at 7@DY=?V;"tD2d#o2KGGTo*aoMh2_D5Z^(;S1't1d&HoF^#5A?LK=s1mC,3Lj'Ko
+%>Id$O#qa_*N1dHRgIT-r.)IkknLA5ep'IZ-+Jd^PloHNWh-PLBnMr8&]X4uMpmhZ;Kq,UT2kedDe2`siKmABZ.8d8TXQ3p\oK!Uh
+%O-pA.l;ZkEB!>!AOD\bUVk+cml.WT@/B)cT!RoJp^rsE\Se7uf%*W>tkdbJQY&+o=O@`**8&0>c:l8XrhapK[QPp#j(aU$/BVm$Z
+%Uk[H98ZWc9`h/$3WjP1]aLW"n&H?oQZohBWP5=kE1[9Cuhjk0WFkR<G^Mf!*PCThNIJ8_P4Q6)l0HhO5o&%R2]9>Z54)F3]*/9cl
+%q0[b^8^'^j^Zq3 at nsUSM1HFiK.aM.BE`Z"Y1*(b0T:-j]1Jns^bH*pp'F-SSn6/[h;6:@,>Ij_DJBgt<TkDi*fe1i_JJa5.)nXOZ
+%*;_d07qV[t9)(, at hnubt9?V5OWJ[]%R at mH1G*Fd>W1>t1%okMW%+NMXE?:'N;M.1-oB)n%l7i(XmB:Xu*N#LU=kO_aA,nps6*6GC
+%'.Lr,h4/BHi$Dqu6lP8h^.^W[gs6(FJsPh[0pqEjO27Euj:S5a`!\0(SoeSA0YK\mhH1utMj!:hB5#ol]fYaEJ3U5)H#+Tio1;_o
+%-Y;gP/B,7^Zes8$:DJ!Bo?:Q>%Ka>,ORp.-<`o^;qLtHmpS4W3B3DF&jb$t at 4*V;Y^<ea?Lb8:rS&]_-F\pI:\/uAqIPdF)[ZtR"
+%E.T/W[gp?Wc=SH=+lOb4X*ZCKD(XuHYfH:6pM"kGD5@,$*,k5VGY9i?TS/TcRP[Eq,?K6W1c([ecAmEp,3EA&r<NR5!H,a)NAfTL
+%NS12KURke]C'Q2VoCL=$W+t*+S^\5,;QGVefcn.N/toeJDpsA(qKbtdh&]P!Q36_VpKHW\]1s08bukC?NH',NhXe%N^Wr;"GpoBQ
+%?0mg"c7A[X*%M=:6s/6,7Vli^$c3o3_*#U_\M1O;%H^:LIbTuGH9oh&d:2%@/Ou5k,[]F-Q"PIh2+^FH[(7g)q+8LmL$mH>&!u6A
+%jZPkhbctaaP at rVs=Q\d8hc\a?R[b!//.2/a;f.e3)(^l`b,>*i?J;`2LgTN`"+)fa9*[J\-cH6X-*8'!fdXb0NE=D8Eg;tEnBD"i
+%kmW/$2mmPE*K*N.4d*2XO=(3LhrM at T.FjTNJqG+%F!C4,^+jK[p42#\?,N&Sg:ML8]YjF08b7Kn6+!OYN*N*+dalD<8A%YB#e$U"
+%ncmN]G##D"NoN!hY8ZJg0?Q[C#u1_XP)*d0Q9;cY3/!-0)?%<8,.^2'_/[mQd_[llFWPEgps*F0",W2H(R at Rp^#5>oK^rhDE8Dri
+%U*-DBO:)Je9:Sc)ZNoVt+FWbQ10(3^:RDHu-)S^Im1=tfn68(j*p'lqhGOg_)hq]+XEd-K]m&bDVkY:%nceCPC=%fR>YJ#ig<`]$
+%'[@Z>R=u_SU=GJ)*IrHD.&2<o5Y&0/X`Q]$AL$ZKd!duBSpkXo?D6T*b9f_<TK3W<s50G7/^a%k'MG^%S at 0);kR[3I0/.fEQRE%i
+%n$I[-.Yk&dFWPNN1Js;gWV8E#-$#ba*L6^E*<\Zt'86;<SqOF7TY>lNX,h>8;^EW1"sS)Fp3ro%oTS0BNLdj>Nocc-. at K9QjIanF
+%Am)m-O*lSaF.<1!bRBYJ#u:FpIPN%SA'/_J^A2T29j3P=ai/G!@s9;.hFY72AnY[t[FgZ0Q3.d(ldm(qa@)\b#]7U6A6'c(rGKTs
+%j7Oo`L33+Zj&"7,+pUP#WV5]CC#RVGCikcsTYQ3&'9:3agXbFA?:EA"kE[-ZPb<ujdW`[39!i5YndQqL"<@`@nGNaO4%3qGPS-^u
+%KY6Q9Ho_2:m3ZVCn!UYq?3Itao03Q`DdmH(a3'Iu!X"RsTN6FYS1/7NdcOF+D#[BBXau#Y;E)`F`[Ur31C.FbIf3Ad:5 at p+5;!LG
+%4$bLCXh_WX!.0p]aWY<YSY4Y"P'Dr0gO^(1#)4)IT-Rg3Ad6E1PYTn#8_$9DROZ<+a*F7W`,?=(;o)A]4U/ZCRp"g6at%]`]02NZ
+%+,Q](IXG[*W*EX2V=Ro]]3[ObNNR>ImAafO%%/M^.#BotHq=bC!ZWU:XLP6MAhLell(=7-I#U8EADQ#cFHOP2M^%@;!4lmso_)Q=
+%NH?,Oqbp)61QSS.BI&+!:m.<E:.5Yai;8p`h:FZ$9<jTiZjc"X`"W:39'/]sh+;54,KFVfHC"BuWL%W2rK>L^B!m51:Se>_F/`_/
+%`^^:_5p9O!ISI-g<6uaXg9<4HJOQX9XnJ(8ETP9NKUQd3Ui&D0D'oQGqYg7(B.Fr98:8(PDFY=Y0iu9<k5CAI(dM3JVY,:#FB'OH
+%)qj%U^U<>ffC^S2nn5hZF^%3o(%!lF94'/6i]:"2D at 2C+P9]>$F-8Yb6`5/:8m?@PF8^,OVUI!CN1>jf[q7qgI[DZ40 at F\_bBH_O
+%+*]*bNs"/P]Y[1$d34c,N0ZCeA&+c7AgdM#P"VPsTQ-8FIB#q\*[n-3KP?L\g/5#O8#bW!O/+nHe77fe+kUB3+V. at eg*6',2LK+)
+%e(iCLVGH)(`NZU9J.WpsOhNlUHta:'m[JB7(SiHRAYQuG0!V'm0XdVQj9*$W>3tRF'/Qd58jVCNBtHV(VX/D.m]#"?mM)tPJf^%9
+%-/^)Jjc9)3RZD=Qrb7a_hg/u4N1dM@*83DiipW>K984Qc7FH*QJ\*`IKn.b(oJs3BZ(]kCApQYa\%.E^T1XQ'NYCAjg25H`jCdLA
+%FYU9Al>Dl/!o(fB%nrT8&3SH2;G5G at I;(6BO669)6_+8TJRl)#`pEpqGXIe>"XI_ti#='u4i[(@*r_fuFh)\+T/uoU#$\f9Np#q*
+%61 at P[J\Z<!4Sa6\(flehP=Jht8cIYQjDDOhZ6V'L%.Z,-os$E?S]dn`Os4FF+HV?m`5&W>iU"\@3]IP096dP8fM(a\Jp%J81.nP+
+%F2Z)7+41nZQqX"31]0Y\HAHdn"1Mp.8,d8/-(ru-6.=$O7?+n+5BHsjND+DLX67*r7"BkgFMcYq0[?q12M-_uq=CJ,3\;dfW"c"&
+%YR9:fUfL7qM289ZS#[EQ&okc/G,*Tq[^g,(69"q7HKM$6F2`1%)nP2i.!I<QYSt]u",$)l[Fnoa-]9-OhDA.8/`rs)Vjjt)iXC8b
+%;aZEF`]Y-ZFXqLuGNNDcXX?UA<Elm=fO9]7H\d1Oib5&JRe0mbXV.&u1>S*hMBntp;D6m-M*#^XS at d>@m\gF8GrYW!*5D=3:m="]
+%+tr<_4]bHCGcp/J??pUaOs(+3UaS9dC.Rb&>F)g1Z[>c<D'YOSRBW!/Y.81LXuCJR>@(/u at S%&X[;QNd]d6V\XH=@HkoQ9,KfhE(
+%&MRI.m?l at WO`HsNUQEAmQo^$n]sK)2WcL.F:(4c?o3'gfCVQ(Y+.LCugQZcln#1`u;AHPcJsE5;.e\>sCmn:4_6ac*bY\\dHUrr)
+%_p8c;bl<(ah.].$UL]?>W#PAVOj2@#hIB2QP/:BUNTVRh9miDMC=fi'TS9`i_BuIoAY1`cGMlU7ke/POkF[.WM&EqoH(gd4`3NcA
+%k,*1Z]NukDP\qRYS/Q3,'#K8,eg'ibc=S]\O2]OaXdb,-CmPhh&g\:uo$p"kPQ0^dP2i2]R_Y/CIW"/d1s,Q8a7 at Ce1@s[ED71DX
+%-g+Yl'#^nCeN'DtZID'0`[O\FZ*u;bg:%SURa9W2>#a?Yh,kS\WlmAH[@;:OBKN^KSm^f:J/e-t2mb?pU!ncSR0Q+u5Qr&#&obl[
+%](><q6%@@LgFi]N=mtP-+1\1uLd^)4<*p'fh#>@%:.bhO%32&eCJ-8Z<rV:!.8,3ZeEkJmZQ8$3T#,VAYn;AU<9GWG6'F6U66;=m
+%8/KV<$X>&6Zq_&N_]6SR`tWrk,)3(77Gb at Z0a7<5lH-`1$Z(XT8Y3Nt;S"T0njo2"J$n@)"i-<Zi2]rN/F8Pk!P&-O<.O=HCQaj0
+%$1+p at 8E0(oL1G6q5V5JUYV#*e2o@#tg:/?>6q0';aWR<G\HIP4(5$f\ShH@)]<nZmhg3Wd4n/#;EmHhfkq1e\L>#CBC1lS8jJuRf
+%K(iCoRWRlLU"ioNU=W1Z0oojOUW$o-[0\J(2G&@P\in$qP7'q"4_6R73CWm:LL[$8IiD^X*.MdJ;;><^B#j at Kc,]]s9ER,[ApIBE
+%!ZoHT>IU9K1C-a(-11?_F+U=3.uCtDZO]b`34taQjl5HDe;@_A"e>dlDoA8HVWZ/,#ITdR.;3s*b'AQ)SN8sF$2P3Ob/PajOSo3L
+%_o@,gaue$Bh3Gs43>9^@?oUrfg.Il@=(BBqRKE\jmh\P^_ at 2""e-mc[k/U.QU$I&5hu!?9NM_0==XRCq=\]A(M+X[!rGqPacHY?p
+%Y11KCIO)*f)q8+OC4`KEkP?+-;JIh3eh&L")1DTH3c<9H;i9=@gCgst$X5E2C)[+T_?<>,n(T37a-uE_i%W\`k>62n\0[:Y2S3fS
+%Z-ZV*aI\P')8Y%*oR5nrPDR4`LBU@;)S=n at pBJ.i#Ce;R9E-//0e'["occcm1k01k3-Mk*q7-`62cZ0.I4E^no&_M[>]]odMs]U$
+%QhQq6K/pRK?mP at f*n*cg at C?$<%e@=`Qa2fFR8[1.qj,0e+IJgY;H'*i*M'KJf%n[j2B/CORJ*GFEtGg6olfgR;-?\KUjh=F9l_Sr
+%N#1$0OAj5N#4'`;Zi='R6'J],pNWf)Pm/ZWAE,qVB-XUN*0_:U=oA/=YAaBYNKi]cX_:Kk`&CHEF>M(=YDg$7 at lJBW&R?)U4q;Ei
+%`LGGIm at V>p@,44W@?Ac>5b[Eif5_@[eQUVI6mO.T%mi2O<1gGESZ&fmB2U6X6bhJgJ;Udb=]aC(0MtBaZR`S9[B_F&[k_RN4)^4R
+%/oqFR2fi90+2@!_-\HV`@tQpsRKLG/d.7&lAOQN;NZ*+?a'2GML-R##'#"R5(\=kRj]j#sTO?)$gh"$S.X/(URK0%IKKEV(6-*Ys
+%T7VQQDJnK=,t[+Ob!M>?M8bm?aH(uQ-L7i#BbXFL-2=P6je=c!e+&]n_E?bHUa4aFD1NDNM$[VC7WDHB4_an)"s3""lghCAOGfqr
+%%CWX at H[N at Gb07HE*/0U^MS`?",S.`A9loYRMd@;CMf)kH^dXmn.>#B'4l`DtStI)<d\lJXWWS&&q!_s<cg#RQ[[eM4Alc[1J-/UY
+%COOdZT<dsYISsZNAZs9$iLNk2V^=?D?Y3#dBj'#XGZppsFf#;7W3[OD/giA5W$hgnWeLAB:BOVU;RR\'=hf5DfRH[hapID^3>8mH
+%F0`-ebY;T!Q>DZbabHC>iLtR-!PqN9n>R(fP=\`Vd?+2A'BU#c at H1Ks8.'H>iqfdTf\I2 at d*/_:=(Xf#"/HB-Sc\4NfJ(Zn3je*d
+%c2LS%7/lO_kER8l1;n4YAQ(@kDkJ(WPEtP,lr.A<9rORFRkb]GQ4EZfD<87fs45q[-fIB7T,hk='`)t\aGFoo_sM?`q]ghVg4L3S
+%k>8Y)$frKu4uE5FL\m669;s at 9XX)pZad$C<9gN\YRiL1^S[QXHRO(Y5V_u/<^l;T,lG/C[;\EraE8p`d4Yn)&'hAeh?f-'5;B;4s
+%&d>je\cT at .pO%XOP#mpPS;=E,M2*@$Mr+*A"(:a4;t>m=j&rd&\?$uXn34Z!R-(i$b#TFcWfo5X]EdQ`4n0c35E"<H8fL'3m at -J>
+%Ut!mu99Ki(Nn#aS;O/k@`LiDtg'8lLb%kIJUrkpY-WOVO39kPnZ[F?`q&l2ej5i"$Q#^l9>b=?n4t-b[9;e8Dp62G`HSMBmp4UQ`
+%j<]mP#^Wa1F*!>Hg4OrmfQ3tO_)fI;%7\YQ\.c0L=p=3]RbKAA9uErcN4/uuI at O`ba(31J:+e5go:Y)8U;D'i)GY7nLDj;nN?MST
+%'0Fl;T,u'te'QG^9hg!D?U+?M@?jViJ-fQHXgaQ^Jsoa'_TDq4R&4Ho&#hd$QA@<n%Q&\=XcM(P:?@clp8K;sPE>T"o1s5:":aEs
+%II;-5b[4g<&HNq(!@_ at us"07RA2fB6M::K9X'K;&Sl>\fD3A\L#C"F,I*O<R at g.5:RWskt$?XhiSGGr"P%&7S?'9#44#8 at WRb[t]
+%>!4gme,%rri%o?7fdq^&DpJ)DHg2u09UT\BO(@UZcIn?'??-2)>$9]']t)0ErmW.2o4NYHd/H`tk(@t-SCLlu_0@)05;+p>#1UI0
+%?K]H<S"\?N$ij$D=>L6fA'b=uB*8qRj_'!<F'@WK;UE`Z'e'a)jOQs_'Xl`hY-pY6S"rY.[\,A.csor<njHQT68Yh*c!]U_JCFn,
+%S/5AJek*V3LO:29oAG_Tpcl!V1+(e?&uHUChYY^2>p3c*8d8a7-aH36/>E1QL?0B@>Stc\7r/q\fB,le]. at +hjNopO=&RF?`%tuW
+%P<=k3]d>gWDrG.eNC6Ya"WJcNjf=LB0=W\3Q'PnN/5EhNWCJ#\.9$4&pc+n\kLS.L1YJ9CSL87YgC\]O=5HcU\!=3[Pt)B=<qMl>
+%[@KlU.B@==F?@9#$nf?M)T'M!,[e'X%c[C@'7*ukonY``0;q/1-$L[hQXfgbCV^lYb!KX0,bK-Nd;R5%4P.K\ZcKH at _Wgl!@%]fH
+%M$1_14kl.SW!VH0:Q@*Kc5o5/j?_6r>ete6/+69'`T(Zb+Q^SOnuMT->'EWO(ZGbTX\rC;Ha;,8D_>th)Xl]IBs-q#>"OS.eDeu:
+%mL&<D315/7d'^'@Cd%3O#RPOBRLo;KR`9r^GhGO(+oC at GjTP"*<bK^EmCG*-*:=ItU3;aj3-5$!Ps1&k9L*^#5NY`m,?@m0_'(_B
+%0lHD8 at o-$O,m/Nl,,7&bM_qqejdYG`>.I6"fN4ee.<[$tVD.YhB'-_B34C1^,d/M>i:2<klX<r^4As[C4R(,D^>.kJBZf^3DZq"p
+%Wp-F-HQ06:Deb_lOd'gBhS=(!FfJL0LeJYHQ?T6RHO'J]>TmH at R!H,QA]C7!],um2/lmKp/le#/?\c>K7_&;Z`*k*di0[0bF-dLS
+%)4^pNk$7A:/*Z;OdZ"UQ7R,:lC&WN3mu&gar at fDj;N(e6T?/m=@Y78>#sb-T]JH7YL[h,%I'urpgcDn3W$B.,#oopbVZPmo/C(kT
+%cOoTC`"RgoH^4X8XuhV_4K@(/"=\9*d#3K]!8<H91?\Y-2;5C8>*(C4A.I3?Dj64XSK)XF86!a8JV]Nh$cK02fUTRg17&qanAA3%
+%Ci"*=9Y!Yu.>QhYm(H=D.9E%;%!#Ju->.2UbobM3>tOadbh`HUP-FO4o$(k8U*B@/.MMej&)@7DgQ$_u^Om8<JBh^dB>;/&4qL/J
+%i7C"i.2$gW7-5$@KNZo"f)F=W"msZH,YNR=n&9dt45!S.W5J:#;00'H22\6]3uH0&?OB1o4iq41RTb^*#0!ce:,5E1ebGL#1@&eJ
+%b++-USg9<9bD'pY)8u(1[!&n[Dr8+XZ_fRD6aIDbp_'4j2K-c8(+*D&D3'f\-P4g[N*"brkB?IX>L23H0YL0Cm+5Djg&(\h<2r'o
+%E]Ju[Bm/LO>>FO?TZLhbQgPj`Y32AHhs.n4jk"RfPK(n#rd+('N`Tu0 at p%&'AL4mL%nZt.nQE=7o<[Nh;f:A.NLS<X;dcu at Q4cc/
+%iJ6TdS/.kS4;6U%Fj`L4bbT,k#"eI9g,4,5#%0c?N[g<X`9T/f(1`l!l4Z1`+)r[^()t4Pea'YH3NY2oTn>#eKL]`b.23?<JUHO*
+%)HP6aFk4[l;U6-7=[OiX5S.).<1aDd4aH3Qce8,'j%^9&DM]j6A&^fDmok[,Cf:sc9S$Yql7>m at Zn/;rI_#+:'Bjm=`o'FUE61O>
+%WLm at G@o:Xk\):#UASH8pJBsDh9FS-X[ecDc-cP6S'@O)!(XGU8IrS/,-6O?K$S`hKL6I.U[sJPZ0djJl^d<@'ZKl5^-XR]:ZgWMi
+%3Q%OUeUqH[qM+NY*[g'#mC9D7<iU`Xek;W=[Afb[C?rtKr&CX)DKOs'`Yt[R*g>A.;#/%m+>9V;UsZn%aJfcAlAZDgYX@,%f.jfN
+%U#B.!hW+n.[g$&h3.hU8h*AL32eB44hs6Fa^`>s=OG,Hqlq:nO<AI"F@'4!*CeLa5aqVQ]]&G5_,*eu'ZlTOhdo^AYarT?sOHkVH
+%3N=2a,)qFK2`fGHXIL>b)Ch;K at .'8$=tb<h$k7e!q.!l8lEVbW0&#lA#.^(dQn1WPJ_`D!CU%)/V)boo+h>2+3(X.1TkgCV_U3$>
+%PEJ8Eb:ddXbCRqJ$bTZ]a,r$FZUA&BEFT[KP1UF^7P:M\s-:\!-(hH.`a$jQ_.fao7r3s4LF)Z1mj19a6\KQAc=ENZ26KYL6HRp;
+%m@(HbWPkrMn`qDY%M5MA9EJmlkC\nD=X4d^Y9Vq%2L>OJn!dRLoQ]S]IZs>Q[n&hpROLpN!C*?=.h;tI3QaJ:]dN^8n,2CIk<rh/
+%,Z9oc4<&G=H`9eBU,(5kk>k7HKr3l+)+3%Ial2!<.1R,6b/QUri[&[Y%%Dn=qN>TeRNJ>olrJ*X[#K4/:/uVEDZU,eXrH!*1C`C]
+%C(\a+mq.PqZ.=B;b3L(u7QebGlRCuLV$6tG#"&;Ei8u0(J$?T*e-Q`t*&[nFei%*GBg?T;I"K7sheHX$-#9,&B?`;-cq_Xl at X5_V
+%>5O=7H7<WMnUhEgK&r>c`hn+:8iOAEJ`WG8X8-9 at gaJtk(0HIGqDp\-XX3)^QU'iM?3ehP^k,>uM71&!HT/pta+M.)o]O9ig3*sV
+%/$hqj>l>.<c!'JZ"EUFeb6;K05kf&^9>ap]aYL]k)a019rtI?jP\eo1gAN7i<Agds[l(jd0N+amM^GU=YZEt#roRs1*a4$E:!dqM
+%-cscm50JEmq($$peFe$GV-24!BVRH_ku)Rc2eu(JIWZ/99iq<86SI9S:YrEoJXDgSA%/n:=EE0Da>"[9*eLBD=9bC6'N&!q,\RF-
+%jC<=Yq(Gf=/tNB:;UdV$$@C=4[>48Tc?)P<_7oW7WAgISc]QANkZD8[NXCq&7MiH8It-;',OiEMHd8*%7ZP;R. at YTFROn7;hr*ZP
+%9lN0KSD-jW)TY:Ig\i`U&QA#PeL=7eA>:@]c*h*`Vj__n%jqC4]bbu+J&11]p:&MeO?E-.i+AdNhkQ?\f3GXMW'-N;,APE2p@^2M
+%:LKIJeYS)?h(oWu.ou6>(q4GqmEf*FV^TqfF#'CD[jFY!oB9)R[,1^!TOJB'_qmcgNnbEk<c4[R$g8U/X.=D)PU)/LX]t88ZFeCo
+%0cM#rFn1cnSFbQ;g6%6KSCJ7*H*pCk1<8oBYP3, at qK#L9SOX!>q9r9rC#>a$8tMJA25rf+7^qbN.+c3cqe,jRV;:nr;_(P)AYCu1
+%s/7/BI"eAU2_]^T8[$WGoOD^dYmX@[%VR%b4bp]%B.rm&$&o_LEM\k")`&:a+"91oqkScPbJ`3p,U<23BKi!<?!KCE-r#%Li?Af5
+%a;cR.E%5]&V#ZWPUCP*RbmCLH:s'GT&NnF+53q";jS,,e2SAT\CQLtC(!/,M4&7m4_6MN&f)sheF7rsm9J]hU^jQ2>:I=1&Y"m+j
+%_(te,b/O&g\?()kl>[`DW?kF)a]Qm=hqFs6]oQh]B+s*m>X3\"IJ*%PF[)C:(O8eTC_L)Md\=Z7P,o]7_VOJ\s2S1'!n8(1bO7=?
+%i8HP`02DeCI43&PDMVsWF8\3M1G<rj_sJJVc$rn%.:q7-K*r/&"I9Sj9?cDe`i8R(i,jGtG]RttU*W at m:HET8mF(5[D0iL*S!tCW
+%+kequeImEkNQ4>J%<q:l!n]pJJ<!<\>'jG=\Gap?YPoRVg8oRhSGFXk/1\Kl/"^2a^'4Uh>f*<0@]B=E)ega^WkGfjR#A2UiNX.;
+%k4OI!OJ84gqWDC:P\kGZP>-'And2]d'19=)Q1nq6a9)"qd$aBh_gWc[m_l*FZ2>p>1-1PE*WH7L4m:_KpK;Rn)qV]1>I/aUN4:-@
+%'UA"4k3hP:`nfR3e,JiX;Im/M0r>$NTfdc?B(ec,"0L<%cEY.Z%N6=dfj"e$k#Q_i3_?e:Wk.T=0L3aJf%&M74BC0'"SAU(`aPEW
+%6%('jDY>8R;Rf=^qTCB^DD(ad#qO3:[tU8Sb18g*2T?%WM:ObGhhkOjEY:=fBZYcX?XL2lCKm8iF1=%a]D@;tN?u3mm797'O6<O3
+%Q7dI4pDC=Altb\^c98bU3$kDuL(kMhV!m64<5Ee<AO+5[&C[W`n#hh`[hN:/f=T8_Z264D35iJ"Hok>RjN5PU;R*Ha8I2LuOL=$]
+%,kq4;Ws6LN(be+["?JiEAG"WLhGBQ#Sq38o5#.!dD\!diq0dpN'3e5S'fcbWA-*7a?3n[#O5G2S:mOZsCtNf[_gu,5dGn1WdiIn2
+%@?$Rd0&ekR=QR.<O9F!U1eF0a(W5,$dFDQKB^Z%"[`!1cm9*5'Zc)(ZmUFZ",Ah;sT(Bh&]2MLM'2<.PV'%jKA$bPA]G57OA/`CL
+%3]b#9ea70$F<4;T>A/p5e5n!U3LL#3a9!I+P/OSIXi0&02<cG*/hf7<Gj?P'U0cq4O[!uo=;b''k.'<=Z0f8ka4TEIPUWpT4blk7
+%<RkT*4hc!NVTl;2d>TsG-F=A\GY&7?i_Q,Y5PYi.3=R0.C.0MFZZ=J9j>69ZHb**%%N0ZmIa`(fAo>_UP.L5DBQrO7qe^DB5*pne
+%DrmOU"@\e'J)5]$Bdpe@<Bf:5;Q,fa@?Dj<X`arTP9<,19^(AOXh0kVk^?02J:'iC+=ZXpHj*[q=QT)jL&!LC6e(#aQ/\fj!M
+%lk$:$W&R)W"<k7D`CCEfgW"Re<uogJr-lq=M3OV]'DSLO+>-=jQ"F4Mht&A:GlqIGf)N0I]8a;cfXpNHC*T3=QCB[Eh3X,9O6B[i
+%?L"S[ipY7:@ET79HR<D]_WeNUN)Y1Cnp+&p--qKrm5%0I.GWuXH-4$NjIi(F"A`(F]B+EZDTYOX20KNhQW$qf4AaoocUH.0TD,Rf
+%L4M*.(H]Eh\5V/FL?l'aq9i"Fpf"uTSBZ'5-i2WAO/l"L^BlSSJ:SiBEGbh*m1"lT#U,10HJ\2SWF*(o&dr`sP&CD+o=S5fUb5F;
+%4D70[Gfhrcq$<m4lPCO88`)H7nAmCRRVlZ!6uD?"YKP."/Wk at I'OTF!ZlE2l,Yc[J]+85Ek=)ikUGorV10h4$q&WIfP.?EP"i\S`
+%Cn>b)kAP;,OR*XhEd at eW9tp('!e#)=YDB'H8?XNCcM&1/-&J/Y>E/qK3Uk"6j7FhSZpPm=]g8Ejpo at V?P3u$e?[6kYEdX[&kmHan
+%jX]%a=E!A3TXcYi=C**dqHU^%e,27K7*V6C0)8lCIqEM;1Tp=YZp$+tm$qBULk1/_P9RUf.EtnK-*aka/\ItY#KgaYMM at QA5bUE(
+%/XL/JD:RbUnXI-L:ek>fCS,O.lXG]s:!IqDJC4s'^"CG8(!-)cA/pE1]lW+)[abr%Zp<<[2hI*oCCiI)1ji3FFcEgf!u:F:7!<&%
+%K=Z=,PCn-p+Y82c_]nX/rgr&6'>c`O\@Y\ch at o^OKF'7&Q99F?_ZUpK#%]?1H_+eHI"#3*TZ9OmT"<1p5U0m4*;+20d_C-*1!ZQI
+%%49bq,qpKqn`scYZe-7"loNAlHZBa9em,c'E(tmPSo[SN!!J3&O,M!tdpUb&=#C'E`)B:o>6)m24"VuF at HCs]l22U6=Q<')RJ:Qk
+%/nIAR3D7BIE:3!OqMs%PB at tohR8G)&A./sh=iS'!Mk$TLOLH/mROkm&J58=)D9H8^gV(/kM;mq!9ms^0gs/T&c,i8[CFckF`/2#s
+%ZBDK8!sretp8JE7!1ll"Kmf_-5fVIi*fW`nW"Mq?T*77%[$i:QU?-[GT)3'$TD$9Lfbtar1c]T>VB_Naqa,`;DmV5;b;gJ4QT$q6
+%SaY4V=,6hhmM.^KcPLhr<1C04'DU8eWF*cdN3oRCG=5U9edW9?Y[ZC_rG58t\<VVfoCTTHS[VeTN7)t*L)$^A-Y$H+(MKEf7L))h
+%7MZ50 at 8WKI8R52B:Hmp?hX>[MI:u-Y?#pT:pET,c0`W)_%LnoQ6 at -eYo,qGOO%G#\$pMjN^ss-:aZUjPD!ki;JtEM[,[Q;fOTJ'&
+%chKS8M4`62&N)!IMO8_uII\QqCl]k@>eLj=W=&Lp99kf=5IEKR$ZZ at 82&CfFnNZ at gkVrg#Gt13,7-(JGE)";eFWm/g\J#CK]\tQK
+%8hPc3K25g9d,QZn$J)0eqR7uBG@!Lb4S;0]kET4179Zi8(A+,ilimTR-$Tod7)\i\b[s570KBpHjrF/fDuMKO^(b)+#;0BY5psj:
+%834ofg?b5:oRBD0Gq45]#Zg=&!m*M;dP\5em>"M>)JQ(k^aq3P)ShSt">KDnhF/V3Vk%LbT:5&aL at q8IpaQ;A`V&oWa4nI#hmBV2
+%aI-gQ9$f7$P$f-Laig1MmNPD9nW9V%Ba-UOK5nk#V,+>W\<k.U/oQPHp=Z(!QHBK=7fIjEOi-JXY0U/uG3$/Pn]Rt,P+ucd8.5Pa
+%.JE\"NA7UgnTV(9D86O]RuQhZS[e!\]lD^pi6u3YAong]3d at M;\,GQVn-4"i>&!gI9>8qB,`>a`S\i,c*o9K.acBDu$ps0XhUNt;
+%LD%.oZj>Y2H%Se<Q`;Js`ha2nfdjGma7n_)KH=Mq;3#s.DG?3*r)$Ld?BkN_<".5RcC&":X4r3d^O>`f2uT<;H]eIH)JKLU.;4M`
+%4T)_7I-'+7$1F at H?l:A:jQ`SIhcFo<$tc(u.F-?:&0!U<(&^.oS1-*GS(X93!X[W)DRMP4f+'$KC=Fgaj#PlD:`"hD_>TS,Pp9'G
+%.p"ucG%c<$3WpHeXsH%Cett)Ya%<c*f0R0)05H"CeOOBA(4sbHP,__9T`-]TfQb4Yrr+0ZiNA_dJR"]=,t;h6`j^>kI\crAXir+L
+%,-[#)88K>AhB%$7f at ij"MF1u3V^Eti>DnB,rA`X,HeKDYbWBP^rInsP at gb6FF"S1`lqZ8]7Qrf*VB"?"-Tbm.ZHGGrK%7h3hH\d0
+%Pj3A[F(a+,/XKl[6:*rEY'ffi3n80>hZNfN>b]1m6U#Afeb9sqr+s1fjF30b!NR&sj<2lL8OY+HVI]V+ic>I\['<rXUauHH>k`mH
+%@(pDNK!`^_[%2O17+\9L/L;[l,(Cq*??TH)atjbc=pHr'+(oiW&(5/9P-Ln@'F\+#l(Y.Ws-RNg?S`nt!9ouV1?liiC';]A6'c%q
+%qO'kQNPLA)I_CJ[9)P-.\oh0e-i:S)n*B`l'/K-Qa1^)oQs<7;@+8K.q3XcK>,N_oI>s">'h>mm'S%*&A51,d$Z"o>Cs$H#_Fke\
+%ka4e#OKUM2(L'/@)e2i*L\j\'I<;Lc;kkeNYM`A<ZC]6k_NIMTB4l*_mmPh:d=d^oJW\h*oV6u$,FCO_V0mqtR%g%3)UX1X60^@"
+%91%Z-B#au'or=5HPC>u5(,CJqH:P/f$mh)!D:h)(!#"K56C$MdPT;j#WT5X(&)KPTT&+8qS/)W=e`9Gup0987ie._=]eLHI3glng
+%299j\$cpR"J4ZhOIVgp-RV=c00PTUF\?X:aX_S9md0b@?=l-LUigLp!mgB7spQTI#+U2kc(LP>]X0!^daZ?@$:qgS*Bc\p)k$MH2
+%8`E^N</0Im=m14bgtK+[,arc6ZWLZa[u`5qm;,Z*7]$Ts]>p0^8J,R3\W%la>05 at .pL^K=i3t!KIL&>%3gEDP9#G-cbEDZZ=DPrG
+%U\#Zi3t:fP/f,HnT7oRW/YCuV$!)f"m5!]tD,dL#"fZ;uU+)FR>6MGV02M6<mQ@#h3of<5S,ZY'mSZrEdJY*>aL9;+d8C4r2gbZ6
+%EjO%V5`1P#pSTY/b at U(bM9nsKoO(5AR<i]d`GD5jr9^rucJS8B:hFbZVT/Bg''OQ-bYtoka]D#L*k]b<_o.V=iY6/>'L$9>",FT=
+%4k3DC-io%!N<QBJU-+6%=`'MV,!4tLGRiVmjh>!4-!u-O/`.uqjd4N/(NjkAptqkm*aFe"$KR7j,>FB(EfA80i?NO,7Bg#p_K74!
+%C%1#f:WKfsGa"qS;E&E"p>sqJRg2^$=4n>a`N&<Pn=!ALjJt)*:>AI$6WiKE]s6*kVoauH0i*I6!Ti&<2C;VX,e/sZC+i%t#S-]P
+%*^ApIS`@=$66NT;$O1]Y1gg&'(Q9Q.d(Gi_;:+mur^/-X7jKGqTRV".73HW*5IT_h$I=c!B3eE&WA[Mo'-BZK^X6&5's"3dKNF"9
+%#Q-`.],1Fic)Pf2N_O1g*7UN3iRII2OdRc'D9[>!]U#,o_TMj.$-Wl4%c*";?h at Vf$?a/s4Bmu"'>k;dP*QJfg_.=6`KP"<GOuAo
+%>;fckel1tt\_f at NXB24BTDh=38^L3?ZD?;pD;s&JU>E`mJT30V$sp2GS[[@^Yq:(#mSp_Io39Bl/:_eGK<(/Ge/&87*%m/XUG3;(
+%Ps'65;k1Mpg`b1`[K;_)HNp)SF.D:cK>V8u!1^jL at QR@es84C*q,sG4:GcG5V"t4(%UGCp at b[uAEN#$4o>Rmk\1V/E='X0oV4Nf[
+%g[A]WI<EQ<X<9*LZZjR*AJp_1+IN0'pjXl at Zk"JiaelmR[O%*5,eC(=1-iq:[:hsUkLPmSfGZm(g2ZlLCo-\1I5g6=[^;jt'YJ]=
+%$!!o2aV;[ro2rKucB/XNL1:ep9Y$q;^Z;)V`<KNoRT(6=hUcI%QN0dEj=J425EoA1<4%0>V0Y^9pVG'Y%#apIq;DR[e(ZM43G%pC
+%i9sSV)D-#54Kh2jgIDareej80R'F(\Qe]1 at -,r<KQ6]J%%eWaugVE>g2t+9`2XW\0NDNJ"Ejl]hrlDSW=I>So-huif4;&b!._Me=
+%,do'3i9q\4!nJ/=1YLSTq=Z/l'M_TQoB2>FA>a)[#muF$!VPG!T.d^s>;_BN2X92q,=f(`"VOkEJ:`$2i5`oQZ"6R;Qf85';rSZ0
+%YPhG5hijgme<f(ifsiC]a7a/\(^;f1k:%?tk=&`7$r:);gPRMDs"cVQQ#Gk8]i-Usq2jAm%c";eS&AsAVgU><6andM*8u/MnAiZ[
+%,#S>n3!_]L)':ihY$jj8#R2'tfQg!gdeM*l^,<mD]03oE>+$ogXf)Y!qc&sbDE73XD7=)d=I[(h)7EM"*9?HtR31Q/0ko2NbE!Vl
+%=C2`+=-jQCP%:@c9q]>m]^1uGDlO*JgZO!TjtB\8mEAD>kGElfgps(dS9X&[]IKmQjAh'G'2.L#=s)gSeBW`J>`=E+SO/,'B:6'r
+%%qAE)M>Vr.p*CNFji]6s,rgA/b.A\\AEVH?5pa'0S3I?D%Z?uRR;YJ>Al`Oo<2Rc]$bUrOlGgo?$U./S\Ipl&U+RN8ihbd5V:a2N
+%HBSljK[=,#h!:/j0-'lNL(B/*QFRH>Zt,aoV(:0IcM1.(.5f5QjkupWD@'hl+\:Xhp2- at _1$%:2FI=5b+VKc&*LiCT,g]+G,<qGY
+%At/6R+8[i`5CVJ`_shY\*utM`C3Q2"4:7"L#;i?-NHE)aFRog%5j^CEFCk$bf at c1u=oRIe*i=6BL1 at 7D.:9j22o2=$GTc=9-55\d
+%I*uk]^:F3rK!07iB4,N+)\`)48g%oKh1C4ad<LVL]<l4=q;'0)K9\>pfB\h<oq]]`ISQoYM]@2O6""?.DD&;+1NGFgD>`toVn!<K
+%`A_3Vp#<Af1b355lRmqV+6PK';gVqI(Vk0[Rk*Wd_i_^Tq);X5XAe>]/I at DeE?I\6EnO at YYb#)[dlsh,`iAiD,,Ja\C2n(s[m[%`
+%F^NF(9-R>QT(;a'@2Td$0=&q`gSimVrU49JnUZM8f#h.eH'fshH<u4X=agcR?kSNGmB_4dO'FP(hogKI7a2N;`M4g72ObHjQg?Hg
+%E/S/be2 at uJ.Hon*:)@n3G$Ue?B6BeAZ)J at qQunJ^6'K+0)n!<F,c_;MZ5jr5#E6R?g"0 at 9Ed,uVhiiKZB+6#Irc1c4lqb=r%HKFD
+%IdTo>@(r7pBeMHu-3ZD-3MH)<O^.;Y:2t7`4qD&LC=[7/aRsu0]2bD;bHj7`n(TI1D"b2WW=I(fW5JHt\4\4C2aT/@KTB'q3F/O>
+%3tl(%<M,bT.@!,%0sR)hm!Z(.E,)(44Zk\3n3Jj]jh]Y!lQ02dh.4+83)X+/C]mckneZfIe*C^i<D;@0CM\:YM9g6QoVNLlMImEP
+%=D-gp3%2rBJ6F9O$"<^9D.6;Fd2>=*9Vfh9>VF4%hq)eg<SdsC8GftniRrU1Q)Wt'SO%n&ho1ht+_>L1bR-K<MgEj;U>C;^q;nY8
+%)PZsmCN/QT at MCs!c.9NlGh:'QH"a^AGsR;@c]LP&/_03k4YJb:4-b%Lp:WVrjQrk+VP(<P%(kBY.N;I+b'h+/^[i9ZE,bOhPN/AT
+%30GU$mdgKO;Po2s(-*4=h`&`0hj/dcjm\cU)9bH>@9T*a5Dj<a5f3cfH1B=>6i*:c*nDOCOc!E16^SaWi.om'C[snmamLV@\2?*F
+%?j'k#a)(#R*2]=/79eC(9#(^i\T/)(\h*Ip2k."?To2KlJk&RDrmWOlH(Kl&gq:"mK8MPNHa*MBi'.G]:^T0Y$]W(!`?\RK]HnO]
+%embnZ!]<mE;cnKn_^*16q(Nc\GeKsEdL8ja8p'/3Etd1%7&n1ObP-a,)^u4[87QuBRE]NW9\QS`PtK;?>&uI?e"4OD8i#!P;:ZT#
+%T,?oNm4*,?0p$b;Kqn_!6G?NqEDK=h8QR/X[$NeA\MGg(F(Y<>jJ:'#?YU,_0*:PA`_b_2/uiBkVKi at u6K`Hh/GYF\;*?8[DI7@;
+%AW%6a8MR1gJmT."\ZuGnK,uVJ3>H7#*4p8L'lg!;HJ_C+Je/$.n'.FHD:m/@5Aen7ZU><\dr)mV98P/JIoDDV/6%g9Z'*.RVhe"]
+%ZincNObO*Dn&]c;hC4fjfd(CXWR&6;g]>5hjQ^"$N2grA>.(AbU2qei(NTB@^0r7g<n2BUJp6_1nmh60CQ9(-3=IUc6(C1<1`L_(
+%=GB&RA!-MV71rb/3TOV6E&)psVcn3r.1?j)EpfkiG<80qNVN^XCW^pDHr#mok-sgq.3#h6HRkme.8SU9cl&Wp`bO\r[l1(2;i=Ai
+%3uacN7J71nk3Q7`-Y!":2mo0u[@M*eneeK=34'r*I_MeO==#==*7TJ!hodS@`HuK$;U[oU?=9%G1RQ2L3-4/M3eDnE:,<'Pc(3^-
+%rWP/3$YF$<loX&gib,t+=+`Y3-nf&/XPL+D8)O\Lol%!of"!iX:m9]nPJ([;B*AdWCBQRo^^+<t3ULr]@m2Re-+R_:DmX7m2g`pI
+%0lKn0h2bt":\Ac7%II./YO("e$<_;bS`L[b;chKpes'B1eE,iXOTu&en<Nkh`rLPAa7/BZF<knr^.[:'GAm=%S<<u^%P#2L.Meff
+%d;+Sg3h*\8N+q2!,feAdIaHs_6_do"/!#Xth=gVYH/Jgt%b=ABNEsbmT^-#U]^m8667Og"ngrlq6_l$%,gdc"S@/=c'_$13`F+.p
+%SYj[hn36#RQ"BTiINniP2W;rN3s_2L:<U17TX5n17(aLjmaO;o`<8"&FNK:gj`<F7CE2El9t=oo_ER7.bkAo3j-l$rbB*Ymmp1;-
+%3g);Dmi127fE8V`)ji,:A_kelluj?.!NKS<h!P1MKgr5h>UlIIUeF\OWZh#lkBV*?6QSk*V_?p3j0Bs$S:+Nj=(K5gOV.'J`*XH^
+%N*[YK]F9T+Rju>,s+2o_+t&Al0IH1N2W;MGG89$kju_q;5,;Vm78#e at -kU-4[$*mj-dMnU8jQ6VQ!#3QG>Tpq=H:4B0Vhg7WYYCR
+%@XBn]>+nf]5_a%n%X&$)n5M/FaN?(<o'*,+$XTms6[8m?.X0#f")qVFaa7'sATbeoA<cfA-q^&[hCe!!GuE]pn2O^GBZ)fb at ZI)l
+%gt\X&^uOWKm<83Am!W]q^K3_=Z-)^-Zf;(fL'4L';-s,K!dH(WC*/q)[u*`r$kDN<PVYlDeWLN14=B3lVq`i6aOF[A%[_ob;3m&L
+%^&u#JC/?_7UL3 at _MKV[n(C,9.\n[JC*X$g,H>TsEG4aK at .pk;;KWdQ#%3fmiH:7l:[nha]>^;J5#(3j!ZUQAG_\<qhAJ8m!V.dbM
+%[tc"(c\2J[/`n/1<$*I38'&,c6nFNm'bnUiA$E:6c-oAP`GfVHOtGr]&d>KD%p!c1/N4O['_uMcmnA^dOO'dnPa.W8)o&HF8ub9Y
+%4P?%kJI8KQba#lIitW854Coi#Q>pp:IDR2p/QV[NnYj&7c=l7`V1=]fTqg-Y at j:*o.EXodcO"ho1%=DrZe;/rC[<)t80YDBA-"qR
+%-asrpA$b`!Y)GkI14UVb$^/j#[-e+]"j#W)0X at D'AX2u"aHtfsIgig2$7dPMpTmPN#SOi[!o.d<17a7,Qd(!KkX`0.?%i'TRgDe5
+%=2FgCc8I&(=r%!4bepZ#NEIH^Po[,F-TIpN"-,:/TPXqh**?!/]imZHHeltATqa.DK$78blL[u[g(R!+![_,RZ`S'qF(hbUh$.E#
+%js44j;Z^koA`hLqnN8pZE*5Z")WC"Vq at nsJPkhcGo8IfA"k^sM_'#(5DUt)1QJkXa\j^42AJD]WYpY:6/#sj-gk,!2%UKWs9(,C/
+%O=fD^Y`<R;,].=@njQ!)MRQkW2n3s*A.3+2"''Wdc93Med]Vl)K^`BYF&GXWLM2OMLSot<kHM1/7-BGRU`qIE'6WjO<,(V->Ce&0
+%GH.5g`W!,H<#H!#K#KHR2Ht1ebDfeIE>oiVc5OlKaa%XM#k?CX<!Ch).5mQV`n at r!e7,d`?Yu*H]:\q*G32OSBCOiU`1OaCgDmP'
+%Pf1!jld0^t9NL;N4ij+,j+AThqMJfRMs7?99a&di3/_;\pkj(#UU833/1I-kVd>6<)-b!(PoY!^0REqPf]?XbYdV5:S[fDoNOc(Q
+%SsYnXkY?)DYZs,P=\,WM6"?1(:21K>4d(5BlVqZXHGCup%Bd%>>`O;q\[9Q`FR'L$qgg/<P0K+_Z at R7&e5poZgRmnD,J`oRFd8YJ
+%C\"5'WNW)f2IqMlqC/%e=f]a,H7]cs!OhcH+JZM';W(t.IZ\E[8Nr-E\*3J.EaUb^+COglLb20F/QX<.GVue*[kQlVk4VfH!9=A(
+%5KJmbrNt$cQ#1OT^3CR+b'$=92912ug<bk@<=./khHI<=Vs.!B6A/%n^Cn at YSoko5$NI]5;`Y^&J(J3uO<0S34pPp!LceHam0PkM
+%4BdS$$2_1PH:g$IK5HO.o$I)Ia^dY;jn+GjIbU[$M3Dg?7p1%-gJrRiPIJY[d$;h7K(/t)Z/,"@@Ne$&&*eO7`$%4Pa&FNcW"^t)
+%hNKQ>J(I8f/GmfU>TZ4tPfrn)@Fog"<OCFkIJ^QdrUI-].;l at jgT:2&$"2hSE5\oBT:J)Yqu-lK;I=`,!"pZ:aQh at -/Ji!H*TB0J
+%djC;>E3n9AbGX9+&l6uBj*@`,R\HVe2<Q`!)FIM%fWtV5nLfme=,5P_1#!.=*KsbkK at iC;*dV>2B9eS/jRk>u[@t1s;i#jB6>h[_
+%@g6pFI>pAEoZfr.hp)cqE?,[S3im&WeX0d!%nDMDjpaqt8]?Y?)Y,((8kE7p+)Cop>_T:o-HO6<H:X"4!IeX92_]sJ+TT9ac"/hQ
+%+8Ib&PWMF8P_K:X,N;(-#!'1N2Tg![qt+Fd%!Ku'TZ/QDkB)!R``L6d\5!o^WFh[V?fbCuBb0Ab$g&)i881\tM2n_@$D_=Bq8/oF
+%!bf-7X?6QNH!,)#@--eGJDFm at IZnW7a*Z$N1N?Sm"nE#dY9%`;;,$Uu0i,5kDF4Ut)68q3?.!hZbH at +PlFJ!o.#[qM2Gie@!6uaI
+%WeOrDDZiiZopb;#;G4!m1V8Q_"(*o57'86ZS;N8AMan.fT9!=?!E)7R9?k`Nij.4UB$o)Mhn%Ni-P7H'9DMRO*\;)pOru4, at PJ%1
+%5474m[U`/L`FaG'iV0Pg4*qn0ll`p*PlRV6g(e`4^amlgXcR-D:+3*pl;Yhe'T;of^R`CJUa*W+ZG1:@-.f'S/1:]-&gSb)J8O?r
+%lC&,J?mFuDdg\CG]78Lk]tu+LMhtLomKdR4W"'m=&Al<rAI.U at .[nk1k!>mM>u$8.X6Ik/.X3#tN4J:r6k>+d%d\`$b;tk$/Yn]5
+%7DrY+cKZ0h0WnX_FfJj at h;InaXPOpd,OX9&i6e9PLWue^HaDmdVlVDS0k>@7;ru,q0X%HK,SK''P-lp?G>"(2TL_e%/U<SMjr+s$
+%A3XS"g&:9J1]W?]`%"<`iQosu#q.^DgQDYVc=+e2<>F$T]`6Ued&OAXk).V:R)0_Xs5**=.>jjN`<n,oBXYl)<TAl+GFkm/$7euX
+%/;O.eXaCX^R[)ko<f)2:G[o/cn4#1=*iq/\:_FsD7tuoId1NhL9K"69IN_oln@^hfEE*1*!L#Ub%N`=VVt(Z:)P70sa-E\AAFZJ]
+%]PVsf;Lc"E&lKD]24UHr40$H_QkY&^XYU#Lk=Kf_gnp7#H?)+?AK4\:\4/g$!#2\@h#O$_.e9hto2*6&'YDu1O:FcEX<3>A.MokC
+%Jl"^3abGhpma\l&=Kp=S at IhFO'p'&Qd^-!RLBi@<$KXDB7=I;ahH90l;)'Wb>HuMffiPBrTVH@/e\\8En+OkK/j:HT!=V$62>_^%
+%2BYZOB)eYnfa;AagQXa)H^C'iW.f4 at DTuIER\[B7VtEX;/K]TnM%$ZB.sIrFiWD:ZZA"qe2`?Rqajqr>]07ljj5mk\?E488R:eWN
+%CY7S_WkETe%>Ysr'o2f_"B6KK1pCg;)C7PU/E"L,kW"2UZ^2r'KL`N$l7>2+V'P>S8u'I:^<<$F8:60J*N]?F=o_j2,kI=hE2=$4
+%<#hma]ZDpMg/M].K.9V(mV9Hn%rY6J7_i:5J.LE?o4!e/abOLG6l0(j#T+KeC]q>lV^_#gWMiKg%t:e\?ZdUA>qF"%?lhK<qT3NQ
+%6B'SqT!WDW\&q1M9<YUfbW5=BjdX9b4_GC7`ksfg_Nfm5VaVuJ at TRbP$!s#hQ1!ML,bOgqYi'CC?t/;>k#>QOp8?D5!i\Le%\0ta
+%Y0Ops&jiME]#lIb1L<1s?2Z+b-E*-gjN9*%+5pM-qdUD at JE2_3gK`p`R)=*=LGhCT&^F-H_7GL0lkIDKn2n\WD at EPh1l%0JVJLt8
+%nt\sqI(=@K.GeTF'hh+:Sco%^#h`Ia:L8J/R at P^UVpc=O[&Duub#/D5bc+md<@b())ZUG)`H6l at f^<%Y=%C%Q+-6';np?tGmeG82
+%a_D`-6<LhIA#^FK=G$^Y^pOH\P6>([m>Zd32WnBZ,-^!g!D+&/$pP]V];=Q#PfVMH^2eu/OR9DT1]Y11m5"Lq]M#KMm]clYdW)TP
+%Wlgo/riH=fELH^4-4:Rp87WpDUk@"EaFj=G\MmXr=L>usj0U794\O^)Z1!+di>/^0(?**B^$Xn%<mM6Z&IJH';^D[G23fXFd#qt&
+%PC[5/K8`Su*]88"9pfSn at P:Vqm\<Qtn;EX4l^T9r<oS<[;AH06p1iD\E&Qmrj at kee&dZnGOiGMB_B:;J?>d2R%hLi`X-5[.(:b-,
+%EE!P6ZD1"Zoi3T5c&Rt2_jVdna%XsI56AmcFqUr?0>Xg90M[\+;jT1i6qKgj216!el"^#/S at gm+^Nik>'=O,9N/Z2sK<:pDPc$lB
+%,VKD!8RpH:FKoSB.M!.UcU7!;&WX:<![`IOSjq/(^"F0X2^'7/PNU[dF7h4^ieb^:D)Gh<8TQ*g3Y=aM!NnNjk+rs"QB^d[1U"2)
+%GKA_&$rW7,1b7ue3[#kC3>A<sds$p@/usish.?n(LaaB_bJbu7W0<L<p"T0"6rqp99LT.*)b.%^kYs1Rh:.,%,W&Hq$-Q8%*dG`'
+%**;aM%A^5R.Ye\VHLQj:h\-pSF+OY5MBP,;M3F[[JLC/V)WoViDsZ*n"X->X*8m!)^:P'Hpc"hoOPA6P at ML,NJg`1`&&=TfR><?Q
+%.!Yk#Io];J]YH\TJo_;uWA`[p_tN"=!)Yg&n)/maZ6Q5-;0$pL7d.7^_"#c@&ouQ+e`pO)ct1k1%A?PrW7OK;M*4gbP0V$q<CK#&
+%ibh:p0O%:QWM9*#PWEgIip`OBa\bL;#V.i\_hYqDRiJ6UTmhjY'#iF!<Hs+K$P!SX="t<rQ\"h.jXa5.qij=LACX&J6]1h at orDUL
+%ePT7FOQ45e[T*>?$"rt:OCe":3/(V8i4r+5ZJ+Q3PmX`o=*f8e<=b.dN<37CaL&9T!?a9He]UGSa\],9j#k=h44YP(4o&"LKBJ6q
+%/7pi[m`\%"mSd-6H;iJ4EN=,MNqlDhVIB"He7&Mgm%./7et(L4m\JFSI2;KiU6LhQkZcb(jn2U1g69dq*_*`qH*Yj!<SSMIcCm"@
+%1]bA4hKR1R.>NiV4RsY3+I[g$(>7AhQ]=c\XJr'!Jd+^!,43SU.G#ij=DWfZ`;YQq/X"Hlr*7m[bSj"`i5Y(,q\p;p_%J"V$CRC,
+%h+Zal^$2DKWCob4<G1%P4'q9CQ^ZO$HIYRfQsB5;-"A6';[(KT'^Q_=&"0fX"*WBl\e+1!LmAIfZ+pm;"iNl';UmeBT[Eo:QbArE
+%"G9]L>8BfQq4Wh%".8BGn at W=b0/cquclGO6)K5i(2Wr&>"@jBl&X%]HJk#W<H"8 at -7^DnRkG!8(\a/A<WSNNr9mLoPk,*;@GQr+9
+%`CVN<<b^/)3",&;G at gHKs#eg-Aoj,$g?,Y1VdaHcZtjiSP,nN$H7u/a6/?PK9&N6,ea/i7l,i06?Jd at WHNUl:)jV_5#BT?MP6DI1
+%"fRuu.;meh"XZ8X/\0?IdOMGDb07YU+1Jq[W[JnLf=3LkdR9SD*$,EE$8+>C^0GL-2['WWVOL_Qm'<?aLu?J+/F-2 at Yp'iiDmJlm
+%&h<mi-mNgGloeO:3(IV??.di'Zl*3tmo8shfK!Y>'-`JY;QKE1#obWrZM#Osm-^Tq!f5C39sU6\C)6Q`!a%JbhT2G=Vj(SQ,ltW9
+%d^S9OjrbZ$ZkKfJq%0RdXGI?49*frh^nun?X!AAhQ#ug\JgUoX8R61K*-t*4d$UVsP.<Gj;Xe%RPPXWd9\7RKFUiDS*\2#DI,dPM
+%]R`d.NP/G(Z#+;tY?[)fkbo8DaN35`5r]);m:r>3"&sRrI^LU10cPeO9`'Yde^7WlP;kpY*CW<<Ad`mKWZ\:QT)3o6[OKt*HX)TA
+%E?h2jk6qi'#C1&ZfpP'8>K05&P;LagD$&Vj>qPHP48I=#UWO at to+]uAI."kR1s7)]6Rc=-MSlompmeX;O>(%>fe6!N'AKDVktlmM
+%\A-^k"]A=U`gQQE/!sec]>@IS[,U,e%..`^SQFc[pF.e4/^2QkH#MDfYf%j at pM7%Opg>I0SV\(C$RcgM,XE%/R6ANg&qI,_[5g,i
+%7l-'q0`=!P)*eOA_4j4f*^'/h(*6_t10e3c at MYl?fj2+\NGo*]#g%W0.5U$%ed*'WSp2\GLK\7N*/j",\qIpa[-)M:PrY4&a2OU$
+%06NS(gDX0d.Qbgq8M6!??4AlX$Olr$`fYSc:2G*<Zq!SlLH;7b8WH:F;@B&%C0!6\-I5=bC-43O];pb1ZZ1fOY[qA_jB!9XYol./
+%Br0N?]_T!/'I1lc3labWU=JAnAhU5L]20ua"opc&Bo<E&g,6Vf'djkWWVbe)4/nQM@@*G,XnTs:AR9d73Na@#`JtCdKo[-sn8jUI
+%[=)sO_\)h.CN)\[7d-pG>!M*I<FEKuLHYt5UeEg^eQ/LpEa4[06IIl5\=r=_]G11Oh)L;W9$0]==/82j-M'i15d4$9Q]Z1Z.64*P
+%]#;AW71<=.Fg_WM'.aEcZ8ppb\O8 at +lBJgGfI"Ku`GU:oWAMn6Y=e`F"4hL1*hABG=jc4R8,uC"1o8Q?9S(58/N:BfQKEH,;58JI
+%6&*1a3m>_5D0%lN!/U5c:5*XM8lW_Rffm+PY')=G(3m=%8b0Ps[No$Krnsci4>IPXk=&GD3R&>@Fq?3C1N2H"D7u5oYU%bUj^_LP
+%i/ZO)P@"(m%dL,F3sU*Ej"Y>LKq']@2tCE'O#U^I<*2Tk[ok1^i7o0on#bta(9aQV,-Qj0b at 0?2K4Rg>oCaQ'Z(qlgb-Pk^_5GPo
+%ShTIq>>cXT+KLp`IulhSFHN](Qdr>r@(%oKl0.i0oA)K?f7Bgr3>L3`[L3n$F4.;9^'q_ZD/QE*[lhnGcFU-5fSU4C3*1jR.^OeL
+%VhE:PQUPm:^2V^m-&E1HoFW$D_BX?e..&u?FdfWh<m!uO/WZtCh:VV'Y06t8Z*.fgJ!2/>el9>J7qia4\(U97_%,@(8L@,$k!0bY
+%bahtgT!!rWXId&Lq9+$nN\@as^n)-7/`CbT<=)U8OH=K]SB8_'&I,=OO[?bd-S4?[T-qmI#0^LE+ at U7HTMD5s1PDcM$]&V")$i5J
+%ibE"NSu\UVYSV\;1`YH^N^J/f at QkKCaHD`EAMp43+DQcoAW(MKmVm^CHB[f'[rf/^(OJML>#aY-IT=.?g`+=uQ)r$&ib1*`(9f7@
+%*knGML&f`DHkUsA%9#ko=kqO at S"$]k%Zg!>\d^($8_p_T8a0/Z37&c!GO/8pEX**d3#qs0%?@E/I:3Uf#uFq49enlXqRa'kKK2V.
+%ArhE6OOg\7Vui4D#Ah-qs0h0OegVaYj[P]`r\uFSd\Lc]A/IEhV[UZYEBBNMTf>L:/Nr10*/`';D+eq)lUSm'&nTbHmHk+P)3bD=
+%T(_N6<WECY)pZ_JM6%GXc*@1`EQD0OkEP(^o,_YZoLZ*n:O5'0OLu$;""9*Gj9_!&luH at 4%l$_npnspn1V"tJjs`A];ufhMRq>OI
+%]mQ9kb.tq!2'i_b*0(d$-=OZ1f"50eF0Im/oe"YL.49l4+L.5l%+UPi at P]MlA=g!qS!7'bOgGIZ;)bqAREnO:j3_fs;al,hDc/ZC
+%+q/e]Nj7s]iq&Fj6SN at W$4)Dg<!'>pEE6iACsQi0*Ku*/q:DTPB.G at T=C1c#LVce-en7-pn`7A09NPO+$*XJ&*7)YHo[BRJM_O]i
+%F>_+k;2S0`'!;I1"@QB?mDk<4k!<'iH2`b6D73?*OieMsJN#SVq.>_@\j;+8+Daho)mq_e/9-ee6Qi at J$W`V<Z.4D*[S0-\Q:MgK
+%Eac4R,gOSUC=mi)3oloE8+A.>6+3f3^gaF_[UV3Ehq;S at G#4+8ZVJUe+1^u5UjQR..SVaMI?XTE3WEcRiF2qkpeDkI;3"=g;4%E?
+%B[<SJ+3nE/Uj$qA%Qm3!.lGYI?j'gdJZQmqX)5hI*>Ys?iL.\l4kOq*bfWo5Y6DO;Do+BPep,F1=RVJ'g%O&kA)R?u*$(4^!2.6,
+%Dk$BB#t1e4R8f)=@[eA)TrfQ<'?%>d'O,c/([TP64;[_pp_pJHT3/7p89tsBH_S9nW,/qaR4DG-i.Fe*X5+-E62%rAnd(o1&u\:]
+%l50"\j()!5gj>2tF%EbL_?TO\]$4Zg%*)[dMhL>1F!@>?(7!l2lm2IdVhoqUTjYREXmH9j6rRDea3U$:4=!F&m'qkSf^-MT&jh`*
+%WNpPjT^:(^OF/9&]%!OG$`bjgKH0oO'82;=+^=bB.;mmcS<hAd>KPh<lk7De7pi'Y+aO\/E)5;`T;,&g0WZn+DM%U&IWfa^ZVL>u
+%CfAV"ncVB[k34SaRN#e`%O>h-dQ*[%*]L^+%`OW')mMPOD*bWKj?h-d/3H1FI+as?RY?A)`r!m\BNHCo7*ubXOkRo'4f:)G-@&ni
+%9/AcD<@#+U".1GsB4i5ENfkMEZW)/`Nb at B,E<^"_TG19Z4[\9CS/[YITW<]bSB9FugVAQ6N7'=b[5o!pr!8W(EZ;mN`a+j./(0GX
+%aA at II508#=X>"nef59e^HVRZL@$^u>C9jnqAA"/fS]rsn9n%,qLq7D)[aWE[3KWcj<SHYF?iN5lca._Cg7TPL%LmTaZ6M"1I3A;S
+%fFC0[,M=hH1sOrdVa%KM4c955jfuc_9/i)qrc/KXOl2pZ;?D_=K,Vt'3Ko*X;<^6po!APIPf-_o1'^Ru,2;4hX)5J[2p#HIBit^F
+%DDj$<TPBiW"3XPHH(c at R9G'YXbVhP^JgHCf0'\JM1qQA,Zn#JO&BoUVL_i`L4@>5o^r*u]V=`bJ.+6n4h\NXT&!8/>g_ufk35)bg
+%Bcc$'G26c>'7SNqa%ab6Xpl?!#Hlj=bTfT<WK/7\4?go*-iA9NL?-+:]6rNm/]A*5Xd;3VfM^6Q+LECl=t]\AJ0kk4/YDQ4#Rd:P
+%\W?-G at r:`i`PGC(jXu7eGr3h3*e6V>BX_0%mgjQY2rj-=.9]""[em7?=:PQdU]]i+[O%q"%*Xg?@[V';bNb&Vm.<B1C9n:4g(f&g
+%C+bZ6LP2(l3OWoe`T0mdASZ)os"ER'k*VjZ?R5AT$f%XmJVRLTi5XhC79%I\3R__)9!AC?N#MsQeb8Dr]pa%*+TSci/.(7Yq])W,
+%g.Wd%LM$bP?Q3.cA[>F+_`HE!N$H.VQJal,Z0Hp&EXYpa9SX1a_OUjq'>`)6Yc'fBg19+o3bZS(CasQkW8$8@<!tgjY1$5u82IqS
+%"'bps>Vai<W)c]5ma>\qL3bDDd1Z63=QQI&$(CoD.*s2iB<pW4NmXBK%G(WTia&8^c^D6('VlGN;<@(Wm]-?ZE)^Hpa0*#mTTYk7
+%O'8e#UMnH.]-iL&#',HReWD>_*IsJ.KR1Xidnr!I-u!>00ae,;8-]kUPW=OdS*(X9 at iK'2<]PN-/]qIEY7#EhhG7?GKVc+2JAgdm
+%@td_AFqgXO(6Hh'!Qcl'c[7JaaF:f`e;qoX);I.;(\_$ES*&kCe_+bZ;uI\,e7 at D>Fp#ZY;U_Fm#,s4,(iG at Ya9gFn!*gejQ<qD6
+%iPh8N2:[r84(Rm6::2D<[&\)&oTk0\e,NB05+JG[P#o&TnD4q7MjnL^1Z^G"$<5`cFnr6o?p.>TRW5Hqa"M_$2oer8;T55eOi/Am
+%7'bZe;s*9OcS8,%?G[-Jkgk?lJRl*1;+XQmg3P+SS>24)l46/lObHuN&d1;jc#]-c+,;,PC,Ad3bJd,\D3!F!!#]ek+)HPdTEYIc
+%3Gqb1j29=tE<Xq#Qs`ZaYXOK]VAFC71Q(!GH3BPP1BaORS:5>-T![eL6[PP=AWTuZNQN;aLes*n9J+K!I5VCYTn^^=[;c`CF=7TS
+%KgXK`H016\#O-505F*9LZIDLXYCQks?Z>rZg/bcNA_pgIT,sVfr at PVd/ohmNc8":6B:H6gUb)9n<NPdDB9I-:=JZQ32INl`2AO4%
+%'pKmcInU"5,cI=$>'7ohPd5oR7Bq1]RNu0R7?V!GT%jEb84@*$'ors.Y\5(tWqOH'\4KRji&]Q&<$sTu>&KS^,fLMNS(HD`@RsO;
+%/s;2m(YhCKb_bu6;d.`$V)(2(ic^g+Y4rR,-%)7Op;nB,#qoq1g0"lV&65ruAn'C^jue\Mmj.h^hdsh6P9aA4]4Ml%;sP$E,-bbd
+%6$D!g;m-r*S#+uF.b-LX at 3g'XU=@Y at e=c*UG0$p?\&0 at LnA<5s8KFmAOY!'K(!HO=Ut%46lUc at _aXar,;]9Qi2Ot2!?=mi49A('[
+%)]l3Q_8JP(@&-rM_B-s5ACh)fOrZ%2 at H4e^%Q'/Q>Yj/]k/7<`*T8Nmgr+XJlm77_m,7I at GNd8QH5)kI43$+rc9ai;a!tU",c-<&
+%p^q)<P/bV3+Lb@@5]l9VRQ at Vb-g)Y<'DGuY\+=rplJ"s@"\JeX>e;dI^qj6]+Yhp0-`t(.<(2CD*jK?&;I1es69kTD9'qo)eK5jY
+%8UMHk at D[klMor5(\UmQ2<F2t(*pWq+DpXoh7J=8=`@J7WG+]>EW-8)TQ_$YV6o?n;qbXV^'QCUYf)dhid7qEI9&FJSngK2;R#iZ^
+%P-^_;-@?[!G!aN=IRgpZ)g.mG^4sm*)+4!SIQ,A"7__NIn!SQerm/kp-^i#N<H&I,S#2EsO27h`B0D&]Z98Vq10"e9B5^$tgG)@`
+%]dptQZK(,[ZP7D>7bDcsKoH5^*"(jpZi]-TlQlFFWk2E)REaeq6Mp0OJZZUd%`L!TP.`HfpAEYq.&!lV7bAK]cJpS^:e2\qfU3'Z
+%`Kg\nQecY=Tt8B!IH=:qRp3OFh5]=rc%C at 3Lu^d!+Tm)7"T-C)Bb-leMm;jo,Wb%l=1^/]2)QN#Y.DS79^0!>YT/FHs%O!aeV52Z
+%1ej8A4]qb?2Q>B\GoRUT1D(0fbf7Sl\b9i*'([:.D+[7^>;@og8rVRn"PZ^(\Sl(LD3q!+aiLot=sVd&$B>!Xc5<j8#.>V:6=c>g
+%<12gn;Vg,u;'X4Pq&1q$]<PBS01K',K*8diC17<R`EX&5m"FJ7UEV[@1'f>0FX](n9GY>uc)+snGDj1>G4rB&H&kVlHCM&I"7!mt
+%'YMIH1?(]8ZVDl<ipN=-Z3LENV_h%D**+(^<npIA6a;IKFDFCN7rRu*&fU->h<jpk<DR-K/NMKC+i?p;s.2=5p/Q0p6V4TT_5.@[
+%XqD.">dW=8Cg'WOX at hG:CR%)B2(E`HhlDtiZfIRV5)`C"5Vr[oPMT(pQ::D7UU82k?cZu'W[nS(W"KN=h(>FJMeu/#YPVJ?MT?MZ
+%CHZ*1_'WTr[1fu0NXS<B#`sO]''55cG)$B'[(PHYZ7f):7<K1gQ;N1=`S#C<.O4"fM?8[_!=)NXI-]?#^iq8^[CYC56$p5X7;H.p
+%AsGMMV,=:)3Gt"HF2))m+imWe<a=!X!fI`.Ti\Ze7R`VtA!uDB:6DdY`*M58Ke*s*`+hBaiI![./Zn*f-gOj#'@*KICS.\G1+fiJ
+%o35bu)L=P,.27._"Np"T9XQ*#g/\5:;/gOhE/\>D9tCcq.FfS<"78'IcA4D#]0kN>bX#lSTAiGqC$O.5"6ZtSDf&5S!sV%3hE`;;
+%E$=/n;jF[MqlPY6DN\E/D`k*c'T#qfCVFa\k$YOn,c)A_8N(oNGnTLC9X\J7mk:0GC0"#"$<f&d"tUfq/RF2XU.:C!Zq/D/YQ]d+
+%EAgYJk1CrF-f[ZsmmXP*9D4H9mX=HFW_^.W:orn2^%dQe2d!!G!KN/7l;Ma1i14D at A=#22EL?p-B$6WGV#p<598UJ[?Ma0XO"_V$
+%ArqHD0;AjWQaj,m0sV*!.!\FF0H[4J+VFl,b*/&=;U)B>,Zu#hk';gg8bjZb,OLs%[3`-TPJPJ_2;GLjE9qYGm]o9=h-"@>E8JZ-
+%MXF`D=:UkW(KL9i^adfW[IFrJ^E(!0%Zg)k7T!0*Cs2MPF(I^6SnIpW-V'RPb0;0O,'WAW^lm5uKURQ1-VVBl^L"aIY'X'1:Mo*6
+%,ogSh.\[I<K?<+rO#1CF1kAS_fi2qtlsB.*0ca&(m/0+uNN56Bb4?=+W2[?u?-Q&tNjm3:Cd/S?Ve"c?0#oK,"()2)S*U_cH>-HM
+%pcP`l1!pTDS'8K4B@#g^pKQ.m0$kN9Xe^DDM$)J]5I#p>jqSORYqEqsAUTnVo=jpsW`koB>[>5'6eOXY7L):`+>sl5I$G!<5;u#;
+%*)0AJdmD.?!AGV()Q&Z"%GPGA7WMCJ=[A)!,]G#=.LO<aQHAG77$h]q=Zs<'lsso>!nkGZ-:s'3PtEb7X"@nKYZAkb8P=(bD\iE$
+%Na4uI<'>RW;k,=FVL#3!)1e]oQYj*MB-iU6(MVhEMp8fkj)+E)_:uE6<SRAD??C.WWju*HTYMX)s4QM3C.Y]SLhJ,HMf"VOrC0[S
+%aTNl)0ZUW"6k.P7$OC`rDI,Xn<f>#)"Ga$s9hd+82,qU7U<RYT%"ON-ab"7:?S4E#84$3dgJ7T^MBs6$XqQ:L-\A-j-(bB,b at iEn
+%hn%MIm4?<CB]t#6<^jTQ#p!uh(A]TXK35A="5lI;,UEV[+K[\U5]Vs$hU(@J`ET=$gBoA7haFK1AO.!*XC79mNF9*MjI66XaOrED
+%,7]ds*W)#>m!:MK(PuoIWH`ADDPXXBk&Q*`k>_ij9E&j&2bA)0FClS*c at gmErI8=PbV<?!Q),MA/#u'6el`Z"]e>DFT1tI]6DbCA
+%G!TA6e7SMmiV#FL\<7$OS[`.=(F'i\U1`;.6s5J*rhMR)eKL5\O6"c5.Bae_Q at jQP&1f'D4=Adakd`RB*^_2+:gV_Q%""32-V!KV
+%W6qr5-uP?Z=QP2n3(%*Nr-"1jWd90J4eY-EkBj9.\`YikqefIu/6;t5oe<SJ*mHc)/sDUUSnqit(.VA:m93R?S%1R+**<Ic/f0:Q
+%nS+:+JM>333Pl1$8nC>qcI4e2I at Fh8/@!`$(0sqnr36UHEL/`C_[:,3jW^`D%<s,Ol(Y,I!h%0Y>0B$Up:;-SinN6Drc42m-V2Ah
+%kQJ:);A>(pDPlEsZTn0Y.A.`i6?^r)q9>*C3*A,IXQ-sBSj\L45?A'L`YD`DFt$.6+H>)#>Vc2no.DW$EJBpER4gXen*735"q-]f
+%\><?ST,lVaeaA$h`Fs"$`0&OtWn-QpD4$liWpH/3pg"_XcJ!YJ3P[6+fTj5)9AWDb,>g95]P!BS[KDiWXpLH^A]-XO&:)8:Q.ZkZ
+%.5.L"/^]3p='_]rk4!&+:tXRQ+WC^qEjqC>8bG*!@52Aj&sJ,.3mJ\0,dQm")^8 at R7_&cY;@\n:kK_LlZ+Idhm.Cr<a/?h<'msah
+%?;olGK8`'KVc#$:QIXdq#Zes=kLiCF3:4&E/EODG99P8TG?o_Glh=Xl`H]\pk]E!Sh_KqF&bm5?R0RfPd6^a[Nf/uP\]Zq/VeBY(
+%]qIW)O&K9W\=>*Ya%5U^XLDEac51H/(JMPlH&+o%>>Bena_i5,39ll^]W![nBNL]7$_F>QU4JVO*FQ*l*IsDTEY69l(2'/X,50Y(
+%<kY#XQ.AIN&*G,qM(V%_.?I?;V%:&B[!&0H2'ndHRqu[2Z`M/>R"F7Qhl_,H)M_jIfOt$'\m&,r[do1-:efVq3OQQB'kWs>BiP5*
+%gd?XS7ML!`mIV71!54j8&Yuf,P`o$_a?BtgMPoDK4a9eg.QCM9.ri:Tj'spb.mdEfJZ31F;dhV at b@Y=LhM@@8UTFkpbC:oLaC^,=
+%4A$k?[5K)Ve`A3eZbcSbRp*;E("b!eKnRsc!C#-o<mo<1Q.LR:]Lr]:SW+?=>N)Fup*>4!''9,G3u2\f>p\fG-,K,72`Z-:kNm2j
+%4Q!,SZ+*1":sZ?3HYD`0:/!^AKrfGq"T[DD0dC1PZ<"C!6etu4?V]0RaULcF2p8N%(HXd,Z-c;W`AN0,4eF4PerolMQ(+L`.TB('
+%[s3SJRMD4t_&DSKab[%f,+)R at qJHc:C11`LEH)U[L<W9AdJ0OOF:;[#rjJpeZAC^2!VHSDPDd?#6j^M at Pf>V^1iu?7ECkZBFI(Ci
+%P9b3ac!r8K!(W6<3\fgR$]r1UK3`3@[7.rY1s\G,Kq^b%584eZdEA-/fV4R_>b7gU.6I at 10&%q=.Q?8`b'L#eSH^O+Co;Zcd`LUn
+%,-fg&8OcAH65$$bqBTN6CbEWQf!F/3l&VC)=aBTe>H09ONj<RgC;ifra]pB:6CZJLXI`-5$g;/YEu%(Dj23Ke#Jdq,?c4BkHu(\j
+%eY`hD"@F`*\quoT<!`q_BU?eC#p]/,;IX981m8p538=-?06Kr\4V,aq'p$umjA_cT?"B3/a]=u/d%$Jg4-EC`B<cGO5:MEFQ(Y@\
+%Nj.aCH!5(,+RZ^AC06d;>M8J=RhQrh=aX at D;qC6]Zqf%=+t?)&/p[!V;!%c"`+RJ`(\62krd"$e"[C*Rk6#7C'c,Np,$Ni6.'Tnp
+%hK:?7TKrQG]po^@<F4>3Pir:XWmD30.ETGAdUOfcF4_q<Ug1.SCFC"448.e&I$7!TW,V"<H#i`k9Am7%ih3AYk<r'W_#u%7Dr#'X
+%=<FMme4NSe8FFCjBNs(*!SH.+Q/'f]O9/Lt$6c4*W'ePN98[tGXa,><e$.6F3>#Vp?ck?-kOt(_\r0Oh"7M`B;;pVFJ$=!E&'Gp]
+%?`Kru/)kL12;P"$gPWm#G*2_VrSO[Urr`6bnH&$H;;ZeHqoAR$&$Klcpr.`1e,TF7Rh,MgDo^J5htWPQ^Amfj5E>KQr$PhDL>VoI
+%s7i'jr_7lh%Y+;tpoEo9p\EFuN-DJ/?iTt_2u47LaK&\Gi]k'pou$+)DuQng(jsJMj8OPZ2tr^-EW,3Gqs.h,.r!'4s5hki]rtf7
+%)?>!8md*K=d&WE!rH8!V5J<4]?hnjEnE,%DO3?SHrO[!?J+rndpRX%Ls5h^rs4*[DmVh!1oB/1So$phAl0X8XD;>0^5J6sgcgP1i
+%rVI-"^MJD]\#98^J*6XrAcB;(mcOM<5JR4PrqQKl%r^1VGMg,_a$''%h=#jbbr>BHne9m;s(T+fn%Rt_5Q8++s6c at pr_rb?htQb?
+%Y0?jr^])@@l5sA_oB6.F=8nQV\7iVTa1ls!rpO4oC%Qn&rLs2hIarAnO2oTHiC!S+Fo.Xe?[jm"iUN]Cr2,O!hn4CorpfCQf05T!
+%03RQ^rU-;-s180fc$99f^-;M\Dnd0.qVR;,YJ5PXr5SL*hqii%mbrBaho>K\E0'V:r;1\&H.T7c\+eeZp9udQNo(I7GhMQ\H^K:9
+%@K-5eg]$>2YM]BOT>)Coc1A&eoj;&"&&3VjE*i+qV8P at U6@ST]/^E8P8"O+<rT<GCDa)Z0]tWg)IP?9MO7i18%t<:)1AP)En+#rB
+%a%cKTBHQ*F]DiYBFsm7`h6UP'qr=$X&&1`"P2=*[UjNNqbON*%QS64bo:fn*aF>d?q-QDbQCd"+(NVJ%++;i at O5GA,++N8nqr7E1
+%0\Gtmir80irq"&+I*ETph9N4iLNfs%jS,rG\5+dHktf(+59%E(J,O9__r'8r`nDM!qnN+dJ*3dpIM at d#G=f",KW3$VNQ\X*mdmpc
+%mGGYVe&PgY8,Xpuq_-(.J*!FO^&:q^GN.tm;SN2#j`>e(@/e9&rq(2X?B0D8hD!Nnng?'eLQ?o\rC?nai?L&<DXid;m0fDO(&m1P
+%_>4e>mg"%!It.7Pn^ua4rgl:Ofpb+WebnP+hq*(Ic_(6HhiE!Ae]7QrDniupn(t_sDa$:4HiJ>?5G%oQ_u7J7r7gBV]_I.%Gk]6#
+%mbctT*e1r>^;es+hgPCeX$>0"N71cL_r[a;hfo+qPFm=f*XhU+bP^Ym[f_]`p>,Z$pt,D`='je>r]b at 1iC>QA_T19gn`i'gc-$pD
+%GlQpDo/1s-2LaU*rUBUJX.N_Ea&fp9cZtfD%Bk*@='r:"V`fKCm9[s,DuZ*1n?TpkKc`&#+79s%'t5+Mn%UsQomD7][e]T+jlX-<
+%?P\.kab at +js)]@OhS"=gmT8lBS$,?ZrFg\J?Te<Eg3iduq1X:,s89/$l04?pLDXpniBKPUp%R,;k8j*F#HhjVZ`V6>>]FZJq9!(#
+%+6MNH^'YPMI)V^ao_=ZKeb[1Q\,Yj?a&gS_l02C"e&O]Oe`D$,f%2!-I_PfZhq!#?lC[7;4b!(rk)\(*[cn7TpTM-eq0h.LpL.B7
+%e33a![,Cl?ED_dX`peKQpiIV(ci#4UhuPt/SBhe8Rsm5ultu.i*R"=EZEu8cp</0goTJBC3PXg(#Ch'7=7`7KI_+5.X!\]FJ,%d=
+%69_R#5JDHKg^i`K,p?%4J%F8K^X)oIh-7&&fC<6U4k]Z&k'VX(a04X7bdGUfa*X\7Ic[WEpbB8Jd8,Vj;g\qU5,OtJR-!GM4MR;T
+%Jdm+tH(V50o>MP!IX3U;Zb;s at rVYE:#!MF2#PmW?o3K,#S'eYBpbQ78l-F9scFa$g'C2U2gr%e%/)s\.A11eIQ\YMkcSjk94l4k@
+%s4O]LJ,0j.TC1dhXZlc97K3)(FZqmGYNC"TG..u8pMFbs)#]A"?sb!_h=!"h2r!D!)h7bYS,TXGqgEnhc+eTip\W:ndAQ1-kpMO:
+%5HWuA&`"Ouj8P6Hj#?3MQhA\>IlH6ahWsdnE4ZXQiMQVLl(Yo%7N^Uf;[f)Ks-'#CRnjFd7GR^GC`n7H^A&"9$8D at ik<EnTkMUBn
+%]]n\/VdFaVaS"#c0pG`]J)4*fhnu'-L at oQ?gbdcXm..(<'VB8V^>LA>oS&/"O-muCdGa?M[MP:Un&igl.5,Ut$_:ArklH7eeG/`=
+%s46f@[$6VaqM!u+l8KtJ^NibmrBEJQoCJ%Bjbp2<dPN%pm2KnMr9<m0cYN;p<PITCMtQZ\n`f:eEfn\WQ9K-sj&UE[[pM*ZSL=>"
+%o51\FpqcQ/*hVq(YO?k`bAd8nIP9O/isjmnn7!_jH$t)F:Z&g5"KNp-n$P8Yl8]\THSV2->eHu5r%_g]#RS`L4iJ01e at Y282kM\]
+%dmNi7=e2a<U7[P+p:,lRk435;d[.T.J&3R_%LLGtn-K8HL)=:qo>@VqdJ=H%?XCdR*sM7;:RR0fk,Z8,cKkI,eF at adhp#O]rqZ!,
+%LIVAt>LXHQLZ&QE=SWaZNebs?o=Vg[4qb%?!WVC3O2(X,)'1Kj;p+lWIIlQmJ*Mp$pk1h/kkVY_C\#G+IadR at j!bq:Tnk at k^EIZC
+%HJA&i:/pk26(^>X0%*ET8al]JnO;k;d!5=;]Sje8*FuO\^OQ5sGl71>O.X.4R3_ce[r9"$:]L4Mihp)Qr/ggZj6%e2HM+%?5/62,
+%07*VnTDeH3ID2-^d?s_!nZq>+na)24L1dmb`=;aa+9-Rks7Pckf3a#RRST@$;`K55^Xls-lF==njl20(9[TFDjsS(Gl>o;doP'p`
+%OY;3EInq_IBtTnZqcQ:TIl1bG;q"g&qo>&,I.8]\lba[skDMRi, at 2L!rQD7FIWU?Od0%@8I.:&IF8s&SIQQhMccO(c^.d&GnaY&*
+%Hha!F4b:9gA\T=:E!:]Tp-(.ObKTb1omb8D?1=I\M'(us+8h?ZI"C_C5Q&i'=5Ifn^NanI2Xk1`T8hcAD!U[KGf%`Z>hJ5s4l$%'
+%%Vn7bl'n8BiLfqRT&F`.b.hKrk_H&pr+9:3s3%>>RkOWI5PqE&n7<d$e]4<=rS/es&bn at d`M;Z<^OLb5bQ%E?/9$"rO]2/Vc)6p-
+%>?Catj1g(F%kKId&e>!5oY(.W.o5(%Lp;I*$a9(:J#*[(Ng3tieF!6FJGA-h?bYbL^Si6gH]KW61qrp3>0opp9C.(CNgKc.?0'>7
+%-85B:@sXNRmdIX2&Gj?iC6i,Y]:W?I;n:jW$-X4Zr:oOB&,.1AOJb28SA at Ge9&K.&LHdE2^8tVq+2s/9"ah2AdfWJGlUqfc1P+n,
+%omSf^^&".9A9.JY)uNs>IL4UiQ\7SS]?emX.sd$[Icd>ONjoaVI/MtAs#[Fao\+f`1LIe>L9N?0a3ST+Xn?62HEK,Z7tp'd#CQOC
+%7qI=F4RD!=i70VCGn!:bo+ahO:CiB8X`[4Hl8Z+Ed>j:\HK6<MgLn.:OQ at t5VA?%>r3[V`e4gF*Fj`^#LI?_]a.%]XVmDjJ&tdQH
+%!Q?H5J)CL*CtBG>)SG.d<sJ$L^CH^9C=HNPD;eT;k\Y,$`i%=loba.rZ?]ZEdcfLoHbM%`Ps!>ZOf!Mr-0DHSkG>%o3E*Pi,^nu5
+%dWqo;<Cr54V+b++S]Se(U;H_GjsUB?+0qi at Oqo>DpXR]?;/KlA=NYu5mTh\rRr<*VXc>':ku?C#b40l-A[brKC)=jZD1ItuA?(F*
+%D%_I*)\;M&*E_HmicQ4i5=g!/b,Qpdol<&XFle^oG"?A>*M?Efi at Hm9[OmG$WUkH.F*59FEADsCHZeOG*YsI/cT[A_89a]jK'0Cb
+%TssV#M_[N/mC`7VO0Pas-heW?S?gl!D,C at _SYQ(G61Sc!1:JoNQ'cX)C2It6Fc&Sg>RZ[S9,NS50;FlO7_H=Q@/Ha!:OD*A[TeF`
+%Tn7Jn2Nb!`ie0J`m5F9s9iA#JQ)Ko^0A>c*;_o^m6m:gL2&,5Ra*nKAptG'Ll$VD-D6?H]gJKgY`jA<;S#_1qlB1/U`m*p4)&Fun
+%:kQDV]o88Rb!&>F9X`Dn[4 at M8'-&HkXL&&po'$n?rnr*=2p>?ZnP])?>^>*f*QN:R6`Egp.G?bieR?BO.3u&@8YP<!D3rLU>c&;t
+%Q%gS.?>]GKjLK9;6"pK!n`8boA[_AHp=eX-W[lh64`/eYCJ+H:0&&C//rMbSMp2.b7g0']m6,/g0nt!QQqW*hh9KP2PUHKNN2qi[
+%gRa.1Cg2#A4+FCo:rF]\MT37q#VpPqD7u6`WOsJ;PT;_3b-t$m=7b;8rS;;TE\_'fI0i%0+H$U<p^$c%mX9!&A[cYBQQ!;$2$q6k
+%m"Ar$a"i!@e=Si<,@=t^N12n<?1R!"`Y"]9-L(dl*0T)uV`_H%.93jUL#FAJ1u%SDe:*UF at U8ch`UdeGnH_!(UIEDD#6/?ih\OLb
+%.\g2=E]H%KV,uQ_^r%\Fg)fQZ<Z$jM+*0\rWi"m?m$_^M`^ZG1f9Vtu<dnF`fq[#q3_,QJ%QYTk=P1oGPO4V'MUrPg=rfau;JL.F
+%\g>I6YrUQafJ0POc^^rpg?,m[T$ceIKf,oQk)pAH7$"W72Kr_U7?KXq*&gC`:PFSj034&ria^Roa#1`BAVnK(?(F?i>F,]m;E9:k
+%(LqUe$KF.(o2W3PN#3S"PNX.C at toUug9mu!i`'fWCR2qTCpT78!5VotdsUl$@.lQE>]2YLpLH36f:l)GQ)S2.r0A.:AI7_rj9&`B
+%3h-Z7L)l.A9b,m\G5=aW`oBocinF:'lq^uCauadXgHt<"iQ\q43p-QHE/]3>gW<s_H2Zk*M!_,g%q1[$p,obUef<QUj[]RUqgMND
+%Am8MAl"n*"fZmF-[!T-dIah*TZfdA+_o40ST6`?:a"(Ll9Q3B2:FnB;*2KJqQ'-XMptQA6HoFWIM7auP4:*AFP)A.'"Wf.2ThGc%
+%>7LBVrFSmAhWa&6J&rMnB9\3CZH39"A39=%b7:Mn-1,6EbY!b8X[YtCq,u":Ot,nOYV!n]_Ci_3AfIM&cQs3&$"W/7/M-9g1qg3X
+%2\e]M9?(?.=Liac=4WR0Zod'_IUukWCq9/qZeVo#FmN#0<h,UXd*gb02.YoUMlM8M#^==?Jh4clOXbX`@TfdDON^A:U3HhWo3*.<
+%`noA5HbiH,O'h8cR9nR25`Kfj(V;]ojqLe'3NZgrhNlt at Z"n?*]s^B*CrO+k>M7,e+sN;ST`AAeF"*s8MqD!0LFaMS\.WS$Ho$\W
+%]V;L^"A'?kA4A0pZ0)GYWrsf;,L1"aa-KB^mdm,1P:Tb$'9^YKX.:llAHH?YIMJoGek,;YVPKJ%s394FG4Z-#\R`;akGT?;Y*/1_
+%DaQG at 4Rdp\G1j[E\=rFn9</O`8*T>r)QCj^eP=e0EFETQ.Dea%Q_utMWN0f<X$VoR<8^!1A@?PSbG"hX$ZhhsCsmV1XX%`WZ>Juq
+%eXkMJZ4XQ=-+u;-_,V*r2M`i88ruV7U?Z8-;J.Fh-Z>&D`GV*pCU1:[*O=H^YS/"%hKQR6!Hb?F90"@?E0.OI:KXDI>?nVk!+*e5
+%a<_!3/Ik at lZt^.m3ju#2/pY^IYU.k+^!NbJCes[pf];i4[k3+>5Br&V"orgJaFaa6GHPU=:;^pd`i_-u.$DJ>_7nOE!HdFb(1!AT
+%%>p-6[E8ue%nkp:<>Umg'r7j5qkVr3i*-+`Hd?QuP8eC`1c=%%l]3=i'4EM'MW-7DU\4h_lEh4:Wq)N`<Zr42UOsic_dP#WY%0/X
+%=WearXBq(u;h!"Ipi`?E#6DC\We-`W5"9Qtmd5&]R1o^YV!L"T8pE+:'V)?@EO20jb/T4rj?+fV:Yr!!)+*fc9BT:@M;?%uN`1H]
+%a:GZ.7H'Tl/@'rWLP$7"n_&EIX&_l<?lr)0i8(B5Z]$O,."H#Q=qo>389/a))ns0$;*XaS^XjJFOK:\SOY#s?)pXl=VEc:dJOq8P
+%mU`$a>qdh45Kh06O214APUuCO&r36H:(Bl9^drXVZ#3Y,"<RW:`N''@<s?8;VtL,6JK0G[2GQ\N!/JckC,G$;%`N%DGFOCXrkkVR
+%'<BTeWGNh6Z*`l5"c#A5cuMi;Bhjo..Sbr7.TeYBMbHC%4?Ph4!=I+πuV%u6+eCRK&!hut/9``?Ur<S^mm*[an`-?\c`J4mKm
+%V(KW>SANZ[#o;XQT&%o6U"knA,2q8V]MTgciqY3XM/iPd6[s-1aaHENW/c)EJT<a3;6UKY=#!.oNgu\T>p^OXO(0%Z)@DL'5^l8b
+%6IKJ=!dlH*_3.PuedO</X+S!Z5hc>.EPLlG57<X/F<r,G*msuA+SYJ]UQb at oR3_`j"NsY:M)LOhf%X/t`d+)s4qrcR'o_PEEo%Ds
+%]?+\6)p]3<j at QL390e,RQAnt3heIq\gtF.5YV&YI\%VA7Fa2tt46.f%LYtIf%*0#gE[aJKe7;D:%i;kgnbB]UI?*UJK\b+*4r&cm
+%EZ=U&,gtRA2jF3V:<C7g[`gC-IO>4#)cG[8#K?f.dK<eAJ4(G6eNJZ9iH'qlN44r8"\DP4c;*&VWml at qb<sDfB6O[<4Q/qr@)ln[
+%;H8_R')6AXAN:3PcXg=NJmrW_Y[a1#9.^0!_VugM4'H4A[/np76Y/o[X:j>pljl";MWA<f`DbE``*1T4ie4I'@>ggml\YKA91Xic
+%SWaq!_&GHt.QBbJ<9uUpr\<IP$E>P^3 at LYYE+:K8(V6n3f!%jqRPQB?7KsOJP?$X,9l`g]P^l[e%+!@Zg]iY7EJ;r%WCfT;3h)s,
+%CWm0L$3HBh=*]BBDL04#]1T31Or<o5>rhns7YfTc[N!e3(;-PS*Dm at liL*r$:1F>]'t84p9\"5/!?h:aPc0CeWXW)IWN0nU=URe9
+%+oc)R8RJ6/??*E!PPZJ*UJ]$a&?8:7jM&U\LIJKC3_+EqAKHAEMg:G,Co82HAXublUA#f%E`PPIPEK&!#V-djIIQO>3P'SYlIo3O
+%?R<$C'kDE,<:\*[LIH#l>_tWSLU1C at P[]3%FeQ6(c/S6c2C*)H;h&8?AY#_L at 0*5W!>O1VrHG8;>SV=iOg\b#b%*Nh(`Y5<(X)TZ
+%2?I:gCgJ at oX7Cjt'.=`"hoY>_B%l&BeaX(9hjg'eAM5MRmq4S34/@L-<*VGid\R&LV!cMt"cQ\]Sjh/I!lf[;*KHmSAPPHi*@Ig8
+%FaHZ9==l3t#mAM?G6'0gFdm^8Ks`q:4^R8m/fDEkR#mB:+#4"+8iA[UGZceAQ4#M^DNS^HRp%"M+Mg2]ZMW],iUB#W+3mHR(5f\e
+%ap\n4qUnV-*oG"^%4b#.bb&o#S._GO8,2W#%A0;jK<crg#L7Y;8g^[LkQY6Q/B'W\X2$TDbSdTYEBnfV(G]BDC\DoAc<nka8IDD:
+%:m*d5f]CF<0dMYG,_H41.^00>5QVFaVlG7WBg3Y_+./>4T!nC"*9Vd_VS91<S(7%"?KSJg_ at ISE:BXT*CbaH/k,M:`j$4U&=uA`A
+%@m/-j9>4<sdYR:r4crudF&'s\n<tYd4-(ZC:9bkojT)>r\4bs.$#\!j\^I>_,4lRY7:2i@^gMC!0V^10/f4&]3'ftoI844(_h?W&
+%_O/9f4NJG3N\!rj<]:s=:G#&H^;*7afT?te(XAu:C-A-!/>0X.UE9O4n4E5&+Eg=T]0qnEd?eZ#\<0A[B_EIC6eTDg"CCp(q<oX0
+%Ed"5tE(6.7!CFt%7)oON.a9FtQ_aX)Tf=;<P]f:^;,r&n<WQTIq4J[p(=%`$]L2euJ!Z`8gQ0o!AL);XIL6'E/82rK.>'r*!;(:;
+%3iHskfQ/u"+!AN8aX_l&HV@(uG*=+Ce`.u2ZB#KN_9:OfZf''A<tiCG6CmK9pa-#O57YJii-/tbA)Ogeh<P1_[3sSd;KdcXY<\;9
+%9'jnUo$;>Lk&;cWF"3Y1,B0i+A+=W*ap4,qO, at 1aFk#&K,kjY1n=16P?.uSZg"IWc1Y40h0qh2OKI!t]7G=<TO=_Pi;2^8*-/lRk
+%nm8T/2W at NGYmJ"c:\')f+;!%rZLE-=#AP's839qGVrJU<.?G5!TFZlc6WIcMa<+-`J[8F'E&NeT8TA5,S]oMB\#*%FSq!OaYoZZF
+%'WIP_oET#>3T>gASCTWTI$hlbL,lf@$gG7KK;T,A/uMYU*_)[0i2^_S<N^W*4qodu$*aVd`K;o:r`lX,3[dMmV6l[KdbX)YanI*5
+%;+#RSQ-,iM- at h?/60aT;O at aCcP/.peIbBX(.j!,ML>3f:l_G)BPN&5/dh'0S`2na$d,9CdQnR_$]I#X#$ll0o_'C*21cL9PWfD?t
+%\O'V2*nU*S#htW'RJONjSINVUnSpiPT4+"ApqRe9!>F/,$7&GI,p]<H4&3iJ92#\Gj3rood-R*HI)Y^;J]T8QJQhnnAMU,>S1;)n
+%SoW`YBXh!&$:rcXW`5ch<"l9rY4!mu2/.\erb$*^];u\YkXl]`Tt+.gR2nItLMFe.js at u[Lp7RYm#0D)6ES1/1<=:V3[Oc"$K>4^
+%ahgS]ag#3gmicn/b, at F1*o<VA2`"GM6Qt6^69+j`p\74p<8SpK4DS"63>Au\S%A"JQKu9+(n,"2:e:+#W3T9iZDOFn(6>ahlB at 7X
+%jJ+c%*@J&D<3CBg1KXoS,\nZX`0eMkb]B9UCm"g'LgNl+$05$'@SuJGZusc=Z:7\O<CNjMPi5nKQ\)pFG(<c;Ke+(D>2Bj[llK&$
+%%e:*`;@D6N'^&9qGY,20l^CRihl2.IIQ_\Bb2fO%e=2n![kUu9*"Z21Ro^h^MO at sj8Zl)#TZ]HKB_!YUi^hV<'S5 at GfRt43X,Ph,
+%2C+Dg(POn\.3i:n%>\RB(FLi\oW+\1Wbt-o,-CZqEn#N"e,(OuY;*usH`i%s8HuIq\Se/#i<]mR,+T57ndnBEgi%5F-4)n!f9,9_
+%^If6Mi<U37mP;k#N]rVuFUt/[X-V?$[W0WjEb?Ls)H)FS/R%T(L#&8KZ%cCmc>bmPM7e7<Yds>@`*"T at D7S_/3*7C<"r2K)6`P'J
+%5jP\R^SV!&gG1M*4=3Tf'EG%IR%6lQX9\f`lDhGZabObt->$=F65g/u#Di7UGX6q-]JbTfnP?t_9K]F:oWD^0X'[,DibAK`b3(gA
+%9IOu=eBc;4Df1DkWm:P'HZ&.Xoj;j#2+_O/)7am85:B)!I2_tD"&Ap_<ShD\P<r,.\HDBF"!Fae;F*/X2^QCSpCjrb_U at bBm*X9c
+%DfO7cH+H%K0`YE at Kfr*[=[gjHXlWkq'ko at Qf,tdX8!sU';_h5k+uVF[G$!=1oe(22C8f6E(aWE2:.tn4&^QBP!P<A(K23lT?*b%!
+%7dqM^(Weu=9epC1KfT_p\`'\`aZ?:;QFDWD-cMqOWTMM>+4XNokJBdhQ$jN950t9#.=2=<Fa+_7BsC.)N\rPZ`-6H&4N.VkM+c#h
+%%RgjP\>rf_O>[kV.!;Ptf2f"hmd;IZ:$SRF1N$/T7dE:`.]__gX#@:Z+6J^-+^b2Q"d3pSg_YCZk!lMEMn]iOe2b/;PXV_rp]6qF
+%XQ86rN8uF5,E'A at e?;_;<]/5ud=s,*[OeATK]d at oY&\\\&ffjoNhVa8=3iXfTb(O1ruhqCQaP!@XV.j._3\]*Q564=LNt;WZk#rl
+%1RYpQ`WN!/b*>tg at eFCHH]/+"a5Ma2OW0G-)U7d(Nd)lsP(eAr_DXDkE2ldWo;$7GM>#2hB+<Hrf/X_1(YSd at M.Cj6'mlm%%4WJ`
+%=,+4Z!dc4d5_:O(cr`t-m](@[H_JSSI0`$_i5n$1M1([978OUhi9RXr/Q+F0NV9H^5W6]ic>4(4DE?Iq7?.2^('4=u>e0lu)dH%i
+%B3GGF,-A]U.491K&lAD.N6#bq3('=Kji03^Q#2i'"Nkp#WJM'b+4kOKlEF`8`H+\<N^k?d'n2FtZ)t$7(UXNL]IMK?2Te4mVC;]p
+%b>V]MB5LC]@Q"<a6*XE2[("-$b]NH`b'6H at i[L%g`p,M*oXsU(8N"%?O%ACZD>bVBCp78W_mYGK[-S at CNQ;@S@?f`U.gB3p:RM\6
+%*#O4cZH-Hh.:5OBZHX"0^.cKtd'P*eI!W9[\`5"MSrBA,Q3^SrW`q?jrbQQ<GnuLoY#<).OBP<>^M76-,,:6T\&?Nk/]4MN><8S]
+%$J7&cHCZlb4Fd/:Z_FP+aaM>G-h%*<n<KT\JT5/*Ra3(P;dDrXeb9PP5#R8V%tKqUO\[_n]?^gr3=;rqM&NUojZ3INr;^Du'L`-J
+%dOGYHn9X%d>*`bp0sK3g at 5@EFk#&<U+MCnbk"@LW4th45X5&A-ao#/?T*=U_6<"[capVSjcDSg4Y:uPQEG?79d0jj3/t&K6'lm%6
+%Bf411+>HUa0KYmX$^=lK^ACBkR^O_?2_SOEU8+B$H!BCG;grR`&J)fQ-4*/+Tj>*7XG at h)>^!F7fEc5JSI3H[lP.,n;Io<s?k8nM
+%]A$/_"I0=t2j.G:_I at -:)=B'$Wt;h(kQ2<B;Za.bU/VG*CR8)Q;rjS]`G'81U>unXWD+/p%]d+q1]GfS-*nQk4hG\:\C,HA;fTsr
+%'KcZ\#)fc"G]`W3m*LhB,V.Nd8h)^4G[s(`mPZ0G0k01g4UXsh3R^qWfS7!/;Tb%O"0h.J4?6&/l5gQ-G9:2IFQcF7(f_YF\q-&1
+%NiH!<eY?[q/_6*ddF&p"4 at gu8`)QPTJ2\rd-Y]nQ#<;*rmRNpD2W*0E@)<QG(t+CTBpsZ0I@`)A'7W/I]K?MTE6uD3^jZL+.XujZ
+%j5hhLCu%eeq13sW$R\`jn-H at b1at.^;Di*3+3%8[maB7.hcX8X4?HcI.f7q$>G8414,.Qp=pjLTgH23Zm'g7ddYk=T\*[#4+h2cS
+%ROX.:mpB":M5N8])VLiihblUaTEtlOp?khQ[:1o=B>RkQdZfd">76[Zs%rJgf(G1UJN1e9Lm'#_g^Hg,+Nl)$fK<:<T1b:l:_PQZ
+%/Kpk12XqXmL-YsmfRZi:"?C<]"h,b69bJ:7YCiXVqfM:;ROcH`7;n at Eh/g1N92+$SU,PN"a>R"R2p92U*==)&1]P.m8h?U2,,8ng
+%G]uj8[Kaq5fG_8GQh0\`C8\1.Br!$Nmqi.5nW4:7O:J_q]#h4e@&&E`"r&3#"&e*/M:#pTQb'h?&Kk&)Rk`0Z/"'$K$**Vi$A.7A
+%0qpepS7O>sVlHPHP7Yc()!Q:]+YF-TE3YXaEIlg:\ab'5 at LDA_pAHm-I+)mO,gqoOcCM+(@RS*R]n_OD?A6a#oq^TjD<0HLlJ6!e
+%A8;=o`@ninJ=FSGKMt=Rl,FFuX"'3o]:;kNFn7IUH5cu\F/O#2""t[3Rp+<]`?BuGorUhr^,N;:nX6Hp5jS7>Cq&*lPQ=T=e:I))
+%]Bm3dl(fmL%o7u7,&OgN3?9`!1>,s+7L<-G2qkd4I$C0HR&o@;P'#AaG3mY2Gs!U!Zn%?1N4?:<]p]6\*a!uT0MQ_#Z+:YIMPB=6
+%!gak_.]HBG$V;teBtHq"A_dF*X?.gk.B7IO97cB$,QbJcaFn=$Cgj64a`?l#pS-*R,YZ!;p&r!d#IWqG/o>Km5u,h'#JXf(cRN`8
+%]3!W6]-S?h9Z5KCB$6P.,\.U<oZcC5IZ;O^q`=$I\<j#2Ul9O at 8t/[i-X]et-7^i#EP]qX.Y00%ffE=KYkMlsOgL9^pB47HDHS3?
+%Pmh5fF!.JR7Dc9&hV'<-=!G^hcR\E#2H;JQhfa(q+F9C/E0UXpPRu`I&<fMC`N`hOBU56#`V$KZ,V%lR,`o(,VFac3P/fKAEjq_o
+%fX+,rf.f7'n)3G#_B^au4.9WH6L83 at E"%SgL]FN$&df0f'KPhbE(ko=+Q-E^X%?a#_5ek%;K58 at -(3K/Bh$)SB"%(e`=LtXHjc>=
+%Q4-XoqB-g+<)d?TZSFs,;,"EE;Q"nC,fJY>PU7U(@T+;k$)$PL1.u7FK_%=MAgISe$f[8P/#pk!B?;\d2CuiH.'oBt/!Xm;AIc1B
+%o=tZ%\Y-7+jPX.,EtWh*Z812-F""Z$?rrb$OhiO0V*;K(6P9t\N=-4#)>[2'`E%d[>.WDnE(qP18.MHMZ?sik"P$dD$;!Bt5\QAg
+%)UpF0ZeX2*_+aN#172'(S\-f'Z;g>XNr/@R'76`\[P5PW'MibO0M%pUlYc0!nuTFR-@[.mFIJcBO\D(kbDe&Tak0`#;,1[9PY+P<
+%MTVZEEc&MuMJgS8<K31cXCp$c/='pL=eR46B0SgESjf8<k1E+C`:A(Gb4H at s7ki]JeE6f%mSOt)DJp^OdCrloedIib$f=qCiVNWA
+%o#^d6`=6\!ck,0'!?*ZdXDV"G+a604>ZS4Z[GeZ!;'5K#n.cn"*h65Q^,&R;_if7#YY@`s*LAABg3Obb!sRF%QsEg;N?HcHZg3AC
+%&$,s*_2HG.B:'kaXV"WjO$9#\aTRYt>a/eh#"e:66 at 61CmI72p$ut[FkJ0E%[blAO6=N'VBra@`T!W-o:+SZ`Og,[[<s7I&NZNlF
+%^itn5J4*q%ANQj(8;]H=nW.FJCc:(;670YWC^*I.2\q]7Hf<Y^ou:$Do/2!5)G>%12_ at Bg'qqWJoER=W1r*ZG>>/634?r(Y0R4n@
+%)""UX*;h[J0F.Yh9SttaFp$DnHl7IU\+$CcWRE(_GlUDK\tnD'C[?n:d/'.s/Snd0ChaX;It(`FL3?5O=?OT;2gQiLP6EUM,8a0X
+%Ch[$8#Z#Vm.]RqH;VCQGWD7>':V-qZb?i!fX;R,X-JtusmP3?'?r9h\F]4QRZ*dGKER929mT&?t7;Xe/A6gRnh&7*aa6dfu6k)T(
+%O0$G9(,lobE(EYSF6[pl&,FdB+:_KSaEU^#IS/3%3CK&SGV=*FAt/ZhBYc!\Oh"&6Ct[?@@1Vj`aD7l7Ou01>LMNpB]Vk`o]%eo%
+%_eqp9g_UJFCHp>Xgsg:X(Nu"`D=\3P"Kfj`CJSW'-DQ7IV?5L\IFPDfG/>GZYWlLD_5(&A="W?0Y%\@p=@^<Pn_YBKG&A(#!B=n2
+%=Q^sI*mUiG:B5"WQP:`GW+8gm1#W3l;%,0netU`@b/1''"Cm?Lhf$3D4d&86QmE4GCoa9$a(u]8`:GR]VKQ39a(Zl\d3"r>&CJ\D
+%/Ts.L=cf,,2o:UBb99X?Ebqu='rqb;@aVn_RE8@!*hrelE>jUi+`)2W>QM]di'.jqQmf-tODo?OYuAL3XW;iP$_ at m_)r#4F>!0*[
+%I$K^mZpWQjBKaB7kpR3\S)Sq`C7U]V_4(K:0ZNMN+^Er8l\idtBusKug'"oYTU"=oB8t&d2c"kO9d7!TCi>MpqJc&46'pW?:J!RC
+%*=c>MO*^tZXKml at Tu7%1,AlggJWd]s`<[mI-idAc-MH^E_q:7M0\[afPrV"epf06Abe;85VT=a1;]"C?Z+b[Q%Htt\$!);3"]?u9
+%,0f*;KDdfR"8[\36l'@Kn=fE:rVfnW>?]SF!*B9129YUdQu#N4?N]1,!b'n(hrJ/jdD/hGC9m at aO2YNCDB-a'g0U^cOoeBdHU'Y&
+%M=pDmH2hjW"rr7k+E:(qL3C,fQ2!7, at GF3e8$4%/W_M<0\DT]C^kWa?4H9l_D.WK%]Dbl)XRRFNYWJ3PK:b@$RaaFej:Jc["2SfE
+%DlZjF*erE5Skm$S:+Y$%Z8tF)]cPIC*4?58(K7Vfg[#iT7DR:##.%a3J!REWQ4:+c2\NT-_IiH^O2'=TccYl,&%d/%[^7V-_p,A<
+%%VdF>r1j,XZoY&N@^6\oV6W6&$(]!X:'6he1_%71#9QLT+R?Jra6B at Wd&tk!%ZPi;+Mt0poR#@O^?+nbOf1,:L//]gLJO?"JP`/RPh"JU:j'G=c-B..+<kLBM]p9'Y'E*0VAW=Y0mp)LSY:Yo7]a;>#iB`=TZ(oNdW'
+%p@!BL:)g,J[SInQqiJC1=\%j\]AXkK<A`kY"I=a#=rmBQm'g#=\ZqDP+dsHY1siW^G!_SNP0,. at 6U?GXH/Bmb<JfR=`/D)PSoj^;
+%MVV^4Ui>VOnK^Q]&;Zjse1B@=od"/[i^'&&'q$TCZN;=9N^R)EFK<jlX4hpQ3Qn=B3%!)j:UgGBH-4&eP?!2]A80!3Fc&M4Lnhu`
+%Q=XB.O(5YOl6c-b#_u?;2\8jAb_++e=d(KTI\(*S$`^^b>$V?CiI:B7ipmA/G7OP:!nC32:+_DA4?hG8f8peL/O+#fS)PqrN8$=d
+%m_E8G^3pHQ\BMk,[Bu,Si?EF5WhQ"u>^.`$Cemm69\j,dOeV.,_=qB_ih0hS'C_aKLNJXsV4]raI8P5X&m=qTFh($0Y`sP8imkNB
+%5 at bhGTnN<FG3JMH8 at A-.AB&VI]V8T>^ep(_M9W21ABQ:RR,#jMAjcU"C1AFp_KtW#\5;h7qYB4u>IKNnmkYs+7"'3!O]C'gnTn%%
+%(Z`ai#u+f=22'fL6^HW"YT at 8FD"r1[Qtl$/5,uYPJ:ibBTnkCf9Hi"b*ZYc]"U,&TkD?+Rl"i_-R0E5UlJQ7pl`(G8XD;*t7_sV!
+%.>88sfIf5fD>r57Fe7]nWAo]CZU]F,ZD[<>WS4E;Yh3R:CBd^nrjJtWW*7;)f+bQ#VSJ+s!]J0Lq0X=Ub,.6#]9NWReAP@`3ZS=k
+%TINp%Bb$ftg#&2Me_UVok8a1tV:rq<jscs9"iE-AdRqp?Wk(c70foX_TR$S]L?]jn.@,p4ICmis1bP""@'LX2-7/anq%A/p/HoAU
+%<Uhse?m_-`"D>Qfa#R at h_P7$_V'J!&OMt>IiY!U>]d2V`iEuoW#_/7d^2G5jiH7D%&qsgm at nY6@QGFd`A_#>cZUJ[e[B6[5\@40V
+%L^?-oc at -i+FG"+9MCl68P#e=2f;gcX>JmNF2JZD94P679fk4`oYe>WI9I?4;i at 0TW4N]q?[#8'=a%!mSBZfY0LN8)hb=DMr"S%U[
+%Qu,rKTZ39JFc(SnXukD9GHsBX at MbqJD@U%4c%?H_ at 7s'8$ZoqVKHYWs_(_[>%M?!uh3&nC.q"6F,Fd?=!?7NFGmN%O at .b_eg_C[;
+%,0!5O+A0%AdFEs+c,2J/c^H]N_lUhcda?aWlq7!,c!#dkhD1;L5$*=L++R$m6!)qo=aP?=odm]SFbt^*4=/oDeK(qYfP3(%^(+^%
+%G+aaF:7$sK25tPeUNm*<fr5^\,r!W)+>BkA6A_KgfEK%KFb)e!%4R>s<,8+;&I":^fu<sBi]cA,$khZ at Xm@5Q*D>+g"-W^RDOfLL
+%jH?F=J28##l.`3B!?2Wc]C.p$'hAfF#D*Zt41S!He^HPoRj\1?o"BctW!U1IZ\+?/-kTX`fg/)KfZdOEWQqiB`>iqHmou\$hFUbK
+%'STr.k)H=Lo5je&&!0XbBu5jT*-`M8p4cpJ39\Z/`iH.Qg6PHWiKj+(4=`j&Z!@uo`H`-@%%kMfmY>PrF&%+J1-[*J!Vf*g7-3=r
+%8E<?Dh`NR45EpE!/$rYG2?:7.'<Ldd9*)u%C_J=L4We`mD9"5j"le)B7`j*g&F24p[BfK at W+u5#8trBOKW<'6RU]H[IUQem@!>5K
+%0'%D'4=\NJlsXn`%lmU=>O4$KE*)/WZO5pWQ\itE56*".0,lXD74AO9Y$`B\3l*XqV&RN5K&l4Q^;d2:=!UGBL':J*1_l%Fo=)Pm
+%JQjl=`uQX*6)6SR?RJ,BDj"9FLPM<*q)VED4dC-K7B\hmWtiWdF'VhCM#f.Tf`,'CoEIUtZIR8"1Niq1kP91`FZg78%hFhWA:AC?
+%C- at A\fBHFAS]+@)\_6e",/Q<Fb%(nUAY\gX>2VFBoq[WA@&_Zdk$:):"(d^jW#Qs_9r%%]m-.V6$Y/^e#Ic.2P&\+CR\kPW7FY]@
+%Z$Ep-SjXkI'Mi?&hoa\nR=&!t:GQhNl$*^3 at Q<<eo;pN,&PP%L88%9I[^=#Q+u%fPTS[]>h:d$2),$!(%\@Q>Vs5a;FoeaBeHfF3
+%A]YFH\.(liUj4)a&_L\7L*n*/ZaM8oA#0>?-:YsUm"*NYkXY=`rielCATmRuUPoSV(T[KJjE9`7Sak95;+5RXM[p&sp4Z.8oB]]_
+%#A4+KhV&e#'K7WI`'L+B%DoIVjhM1.JI"GK3`hFI->HDESBXY1L at 6Ao*h_HJU-l)Tc=-t&DZe#R1U!(FT`k5om:aMDaAPTU5c7JQ
+%At1RS4(aOdD$1tn7]a+>ff\^s>33&+LM,Xp]cgU&E"YT)8XhK=*j?`EA%9MJs33QUgZi2^n%t[Im-pHG.;Y;\_Gp=@C*A2"B;Yj!
+%m;RN=LW[%GL%LnFSNOs51%@-H:aP:kmH!F.oB<Pl)mEI*m#<$bkTj4AIHMRaQnW-kn4R'4CQ:`-/t9J)hF&]eKtEdukof">2RAp2
+%QB:t\'$Zf%)$Z\/".=/0TN&6.HkWAQ.Qrh=2r4X]B9AA_ at H;=\c!&2.fX9+Lm%c7l@^3]X.5P"/4RFMr6oQ0(FM_Cn$nK02-5MD-
+%HYpq!%BK/;ZWN+&C"?\ZMr;ohM at JpXg:uP_ at T(Bs!LGk8^M!9=/r;m!c(Z\d8?gq23)J=PFhAUQ!.5QCnEm%V"XpEo&5n=B7*!mB
+%6a7r&Z6tEY;bo_P%pSNmXaj4SHgEbjnc:6`k'1,'7tC5?f=5rd]cOH,qC%IEZe=$-=sk0&Ta/I'W,/us]9QAfRj,`s#s9-S48!^b
+%Ub(;!_-W"J--&+fN@!()g:=`O=M?'j9EQOAR'Sf9,m4PCGWl1[qA/c:ZZ9[)$MU+'UPi?^s0:7(Tp-mJMP]o#p*JB!\SF at p!m_pC
+%bj*-Lf(Td4Z4#MX5)s'/4`9)id2Y<+PcR4>$Xug2d]8Cf)6!mG*AOgme;9W5iBV71_t9MpfTW(6NT_&C9(4f[SQ6MCTH"3H&-q&-
+%>6bZR3ls<[GTm\'Fd[JV.m_?>aJ-80YSfB-("jUNcH1<[Dbd5N'5#r#cs2u79EXH5<08J!bVG*9afu#MdPt!b"?T&a&kP?CbMo6:
+%keuYBCVH4UAP"e[RcSV%hQq7nnt;Nq3)`0CQD`Z#;OGm3j;m7ckA>uH]:QsEBqB7K?t at e<;7+t#IhJi%&Hg>ujBPfh0F^8O>>qgH
+%r)'acX\R.ODQfUI^[&8?bJHIRiaL9D]fW03W"if at 9I;L!-0?aRGE_urMAJ2^UDt1oRUpUtFpW24ZA1;R4DuU:J4e(=-k_O4L0MG8
+%!>AoH5e7+M?-<XaF\oSU)ma"]$a;gW\jk#k![n]N6=`,V<6`^$\(r5I%u;b=/06@@m1(HZo+[@8#DI"6^IXn*LV]LN=8X]ghuSOV
+%"1aW@%>2uHOU*BON=@.8APJQ4NN5&]%P\@RS at E<W$V0UtA?q>^EBDfaGH at A`AdhBp*RU;Q4nqY=mDQ3;ZJbuo*i/VD"Z<s at l7pe?
+%K<g[Y`9MlCB,Hp<Ni>=1osa7]\u=>6q#(]0"#_uZ)#:1kI]!XBFW=geP16uZ\thIC,6,]DL[)9)gG:dB"Dt%D(icuSc3 at 0&S7\BD
+%=$k8,;RSt at IE?46V:qA1U[E0KQ$4k5djl_n<&MSl8:eU'ZYr`#"U<BHdj9"N5UB[P`!r&H2jTmq(d/AAOOk0.:3Hd)j$"nU>.NqJ
+%8?tGHKKCT=`KbbjMO#Kg6&jAkUd#t?&CX0Kj)PaOG\I(M!E2'!a?lF^g)]t/A(iFg)[(h(l1-f8hobfr$ium<cBb7M0=#cR657"W
+%?l2I,Qa5d$.Aq$d$_II$=fkE4m.S1nlKqLjY7RrLFc:-%4IaPHf'ml<JN@#cJ]`r/FUW$(Utl3&[ZqE(4M'ZA&$%3=aP/\jUHR=B
+%;nV//r*!Mjr:lXN2[LAa=\)_Slm\4d=4X%Te4BuRN<XH\&`_3;FfQqVN337c%X=AaWMF=Kc5Cu;-U-#!*]nCg42Ks#EX+=]2,Sal
+%#=mD6`4N-`i.t#-NfqOB%tSpnX]3%R\(tBi-Fo-\bXL(Le+n@@?chAJoqsW"G"V<\LD(XM<A.U#T$-C/Lfe6q>UGAZf at a0o,BI:O
+%WLG1O!H(IYOJu*haQl9NMBt](IB`]>Z\d?[4kkFD%=A#TWtHh;O\I_h`ooNag;:?0d\30U]="r5`.KVP"3d:tbX>4Xhf`SD13UeD
+%ilXWF!&-`53_mn04`4eQlmdG&WRr*7L-9rn4'\/#%h>+VU;JbF_H at OJ>:98I#.Urop.5EMntmrQpg41m;dH4Pfa^dJ=Vi]G"]r!n
+%SMY/fIge:gRMp>]FG['(P=(8`0QBt9&tfFoQ at FLF,dr!f\s2lX&:.Aq_oZM3ikr#?k7G`pKDFE-fI^Eb[fZ/?+Wd=pQY!%KmoRl"
+%X6d;N)s;B?P4VKb"2OP6TJ:Z,Nt;<@Hd7ZKbnM-?L2S4g#O,d^,Fq"ukhQ_FS:j`)^l+VQ4.!RYo5/i^]6><h'l/WfNEg6E79"ri
+%d4D`/>2,eO;ghMjSuaTerZuiiL7\%uXik,Xb%3'#kFO1i8Ah]94AY)=+m\RE,famIdD#Km85[m_E[4N9rt<Ha, at C<54*Q"^X"kpT
+%,n_m3#.+9`o@&k#!Ze;pjEq$>Ek)i3OA6R=K05:Za.a35oOa(!%)Te?cSYD^/C#3uL*OT_J#sE,oZk(9]J.8EF$T?LYR_]Z49CMH
+%86JFe6C9^H-am,I_TB&<FNPJ&e*#4;;lE0W,8VRaNi9n at L-9c8M0KOJ3(``n:EF"B_c1U(LJ<Jf/=@tLKeCe';mZA$J%YZUlK?V3
+%5^SqF:)[ILr=__e!i=9H$c(PI.1q_pJnf4M>PSH6e>cgc\)e2Y>B;fnZ at 9hUh3!u;>@]5(VR/nRrd^G&UDuCj/2s`l6%;Frc#>Xl
+%.[fU$EG\\d1B5&kG;f`QA[d at TY(2^!O?Ou;QLD at dUgCU'-S4844nfXU6Yd2*8:C-POW6\pX(C0Wlei'"aNFq'?rZn,VDW<L.3O<o
+%Q,6%0d5Kp`eS-kL1j)s\FAE3eO4<QLC`CaLXXi%7%brf1%(mBF[@C-Gfl6+.4l";!dP:PbVhAT&]l@[k/r%U())Po^DIUca]b727
+%#0_K'HBs5)AnisQ[H;iqdU!,A31N=t"t8r+3qKqpru]V+N<)\=rhSi7E`j/OU4aGDro>aJFq=(Lnrb^EK0Sht:YLXaCAB#Fkq6gR
+%gJ0ir?a<@CDFGQpG28 at i50UOeNU3$sT>l_EK!j6/G!dW8SqPFA6:#E*!a0]4^oQSb7"tPG`k(>TLp\IR.,YcRd:Kr'r"R11rN3`[
+%*,NmQZ93Ei$#+."@WGR:7))XtSk:k;ia+!BE$$U-Fj$\.;T9tR)RGuLl!.V+nL5Z<9mh/)olo6 at A=[V[[*@HgY7LsoW:#j]'V'?m
+%pR_,gS?(fKaEOf1Q:R.>=6X$:!-Ht`LA.T_i1SkppSB<0J7>'tl)+-$*%CT[pFsa%5YAI^-g^N\:%Rdb"IL!V9?CYq0%=1)/nPLT
+%,qFg/pJnMP-8UrmC@^V*d,kXQq:1%O($d1M"nbH%U^<,a1?ob,')Zk)i4`hC&o"f-Gc?PsN?CNl;S"8CA^WN:l-`)M;a+F&1D.jF
+%,2o/Ia92\oYSNecIMS3&Y"$S-B+JYUUT3MiYaaj@(_W?W at 6Hn;`GuLk8[,Je>.;%:lujJHp&tlJ2+!6n-2oZ?bh4/enH@[EA<i3(
+%a5mBXM&*'VOJ&^-:VYt=dBUlO_RE5_s)sA+7\]Rb=gqW('Hp%)X'tSD9=uFiG9]`rW(THVE^nJI,!esb5"&J'd.'(uDPgAm'8Ju5
+%*.rYP55`,/g<X$+c8eS:8mk'!4B[4"-RG"_lCLXe4,Q]dU<Ou.(HIpI#2>\/TeH/n^1!5e[k^dFh".+9VZ]jk/k2E7e'h^07&&Il
+%PF)+4qAsuuj8?m%Pgj5h]!((=Btlq!A?usS!BBoLJIsp.f(+h8\\XDAN#0ns%B(71;G'"fQa;T at S?`6$Jcfa?f$!*#fnlg'.?m)d
+%!3_=sd`<pMdMJk]R=ZaG"-Z`JL%9*Ekp=t0m\WJ>N0eSfmj,mt&='mu^5Tp at h%P at PQsARhWn!3;ieUE\XTs:"$YruFHKFJIE\X[+
+%La0R<6#_C[.:Ra55.L](:G,aCiCJ4,F^HfWo)9pi1H*QJ[cHe8k!u8Z:n*ho"^<@(;UEVY9#M6`T+C0eP4[GF%8]4N>$kS<]\2ZF
+%-P!")>(UjS'#R&<?>QeD>WV9')AghE5nAhC%(OCaI0"W]]JsZ;ES-39V9q_(V3]iSa"4YDE\[tb$@?2?]pE487L=aABA"oS.GJdO
+%Mu#>-as5OJd1#gk\bqMQHPT at JB;Ft=HQj5HST_UHNYXosjGDsa#/Aa#>)>Ol8BuWreZp)[D(.ENL(43Rp(82!r$2Li:Ia7=,&E[k
+%:VZ\Q+j<UXCb6snjbOA1#PR>3+`+dr>pd1b-i'>2k!Z/uR+Xe2DIuM7P[AW1%@g[`O;SJ:dDgJPk9,ZcdX1or`q<J[*ER4D[M"&t
+%IRM at R9O3i_'?UCm;SLgD*6;kqZo=K6A%!<LQgTnM1$T67X:oe*JadP$RQ[f]?CU^Q8bV7.>JS">g9W&U,ioN<^KfOf^m?R0o`uhB
+%pTS_.a@@O!LX,d([F\=->lJ;T>3^?JTds^ueV-'G<L;3'WC5uqmBeQ`%)4X&`k5ZhE9hQE%_JM42G`g4S+FV^8r7I*5$0C=m\V1k
+%"?8nrKth[QP'QXG(2O7P[Upsl(qc4?XVN!Tk<"jq at Y6R'MS"(1gk.3d_C*B_g$['7=AXWk+,X2d+An#rT\&i[e=8$XTaY_qa:[>&
+%YX"\3]PXuJ;0..)[/u'(8(]D;3jkMp6N?+P<_o#n9Ogk'*a at Sh/\`en6)r8A=8rKs/[-4G\/[-6gP"Y2bQE58jA\"7f at cm(QIPZ0
+%NTqFTn*CfhT12=fbO,6*durU#JtEI"U9OsKd$E<;ap[+W!WtZ=h$N::Rcq$\7I!QY2FW$&Mi9jk@;/9T]FXfl>C;?#^;[Mp0N7O-
+%r+OS7!n;q"/+B/0.1S[NIgJZja%K0"N_4S"$dGiER_[mEMEbZnP3TQ<<sLKo_Mg7HcBkl$kQ%XF>QjO[Q?MJg*^T>jM2OVYFof/-
+%RH'\WYSs_u<q^F4LP1Q2mOB7E*6OP400f2j?J/)4nsY_(p/1E-;U+C\5%`XudtnUU7aPblT*X^?ci-i!(=+$uc)j_F;K>dk7PDmF
+%,Ot`@P[`qeFi^PnM)&hF;"i)a-YY-iN[Z21!\0CE92\5C<)0DbZk=?aYr#BmdoY3AFj6tT/G:((POdC=AN.si+F(6ZK8["s;q`rJ
+%aVDp*c^n(#(RaPA-Ta$pWr*QuO7/D+K(?D)q at 8he6jcH0?M9)!S8<Y49bb'Wc6d<JCi.p!:8seuJH>Y[gP<<eb8V3l`L^Q!Z?*U)
+%Fh at 3T9CCX)82tL8p/-IG^4#:AIK>9MKh#mBUZtkB*sA3#c>ub,[\*/j-Hglqk>PHBr>gFpYD2p/"LlmN-St5LQcaM7ppbJnq%agl
+%A:,Za'\/Puk:il2^rXFZF"]7f4N at tj-!)OPA&DnSLp`D;nnr:-:3YX=nMWT[J1IPj5jqJH)I/A_f$O&1l`C&DS<Sl.4tGS@'m6,9
+%?_Q>C9&Bjo\]P,)_8h<C!O73gNaV_5GMP`[%J+Wa3BfUUgMso[3%rN3qIAV;'FB*N:+SZ]i=sY(31m'iS"k;9<J*H2d::30^E2aP
+%o8[b,OPPC%gTFO^G<`pKM8JFq27(/)iZ45iIG7Mi/_MCfZVmahl^-4Q;'l/flTDDqUIofT,Jhqg\(=B0je)KaQh]QcT;:1%SSA:l
+%U9IM at k>eDqX*G=P'hRoW99^WnX9M-Hp`R?L#Y8jdko#Y3)'h(_WX?+f&k)>NH:aMk(1ms[ZDEYi,M2Y%h&M4%<ck!08h`>LH"&b4
+%\Y;Zr#tKPo[F'^O*7M>FE0T88M/`nS8VQ&gdaa7HP$76r;hOjUr+ELeF'h=\&1(5ILat\63 at TDtb`haZ)1nF^3jnU$VeJI>[\kL"
+%1.\j?dgl?tjEr$U8ichd$"7R9p0dHk9#>U`VgucURJ)XE5pga4K)8L'S?0s<ak6Kr*/E78"#O':3%t*NWuUjj\HdpJH<O]#5-11A
+%2eTc!g3Q#4b?;S:B$jCp;JXD_q9^ID^?:^GI\eT1VOf&7:K"_lLV.Ig)J-Hia5.9]X/VS3J"niak[foFUF<BjeRZg.ZpBS(I$[um
+%>o9L.G$$-3.?eN.JXt)5nc\N.E^Fee+r_CugF(P<.r[MH+OC(aBC3=-%/9C8NG8>4MiL%pXpnBUn&`Yl'<%/iIAEUg>>0>8#4/lc
+%7I8;_9TbcaO"tmRH&,Jq"^>!?UsH&?C5MMJ["%pCWBKmbF\,NkCfAG.O!9.Z<kAa;/T$Yuqim!_H[+[X_h3V9W(FW&2q2tm5t>mu
+%cHN$+Gs]h-:P0A*Jl!)>5%([k9ARrI.:+mT2+ at a:@>TY0#j^L^5o=n9PC8VH\- at 6?ZWp,9*`uiM3uB.EQIoTM-V_\56j^p$d5t"B
+%#ZPio:sna->e=Nhr;MGiT7+6-ZeM\c0l7A_T5:H2SX#GF_&VT4i_&JZ5 at qeB;gc9D0]]q7</&%J3QQ)7IR&p:q^CHOn"?_Q8tfW2
+%(g#7Oc%j\pif<=i`muVl`lV[.cr0cm1qB=?,^_8[Qn`D]ilOA^TH<g;K%(F>#PF:FKbDL?q'Qp-N5pRC6;Fk)[5FU?eH[r:"/tO0
+%k79"sK<dD.Fir[=ZE=Bc=)drJi.B3Z7.T1\GoGT.Rk<3Vh#AWm4b5]u>*d[TFS>Ud["@m&&oR98K9'mh?9:tm2a$Qu&\R at lPY(NX
+%pA/_anhMr^2`aWk(F0&UGGH4%-'rdWGn(`h$$Y/&Y>e!qh7lpl`lEL6gV2%C=Y3[UqaeA6H"U^;#U*fhrN&mUAb1UsA,_d(QAfgZ
+%)S6phC^=`JeV>30i.'>5'r3nFHF[%lA6M)b.)C`5#!4QQb6lFQF]Ys;.KF[rG`omcgQd/ORrqkL^=G)ioK^\nl9nE*mn/bAB#pm$
+%hgp6i at 8udY5kt`+>."o\b]#i!_dXl.Q.JdO[CD.l\g<$%6qi1fZjFd*I(I'J_c[%e'=WSQOY5OnVXUhYNOAT@#is*+#.W6MeG""B
+%GuD0.;c7Qr'9"hQ3n!AC:%a?j6)3a2l:"c".GSHuA6^VZRp[Ko>&N)=@4"/e/kl2%#4#9NW29]'MVrld`VO!#C>_;6PhJ&EJZ.\+
+%4SpPG`RpTS1suqNP"d'G5pn6'e[TNkY'3\Uf"c0dR9W9cJ#S"R^T"$#@p77 at d>>OT)`7`75Srn#MochoVs9rm&1FngCX+M+3m5j3
+%8.<;GN]i6Ci#FndYG=4a8s1n#!2g.g3AU\Ia.0EfBY[F<VDUm,%WhVrDK`g;mF6fgh0i5GE"?&8ljoZU)h`)e31DQH5#oYq*9h-q
+%jRq;mOb6"2Y9-Q7RC*\l3<;C+M<ACGqX)%[f6UP%Z at H*@hLbO/EU$YBAlc"<!263kK?[1^6J_"oj[`3W9S#[s:C/tXo",a.;i4 at X
+%b86sq;'\,A'b:[\H,LM=4bBQs.$l8TE)+8lX)kgijI=Wh5rJHdG.^GMNCI6L5o3@\l^<M0MY/"Kpe@(;JeGS`6[.\S'Uc.3#2-2j
+%_+FUGba5b45,q5b5//5',hEnN(;/Loni=O5:2V_A(^Y)(ZJC6e6`d[,9?X5bT*\89 at b\^J:TigIjLZJalM%8N=m-5e1TA>O&*Z55
+%pJeS2 at k;(/nAfCnZ8u>jUuc=_;3s&Y;+5?mm5o:^d0.f.rT669lHQj"6'ngi(UR at dAOaIV_qGO%%UQE*Cd(jHSroLY%l4`.ID=[O
+%"?ML;fU[*-P\O,/Udf,M<R-9lRL&]RaOb@$Rf>;jdC!CSbiLbjZGlrY9)(f1_+eUJj/A:3&#N#^NQ1:,i2e9WI6C,B;Yk$!mBSmf
+%&;pii8r6eRlY'<Y>#)XIQYL>':7gE](.&9?[::r>)oqbN3XT][7 at kLV"=`oYJUKWf3f$L9Z.HX#eVW]pdb<#1)[`Qg,c5LLI.4CU
+%iQW&.n=8!MlDhb/o^SRsP3UfI`Kiqcb-i2>BWa9N!*M#_lW*ini&TDH6n6"m-'^)^Y[5%ai[]nsn?ep7DKe:VB4!nV!cC;rj=E-)
+%5'6sbK,.U1SR==R-KOdd<D at Bh&HaK`W"D-CMuNrR,nd-B4u=XG>_;ZM6^/;)JN`gZZ6?9)A=S1U<$^I.i(=LT&hol<5;f"7TXlK^
+%i6@[+q#Eh1+2(.;B=@[BZ+!FX4u_=LnB-SoP74pJ4TCC6:ML.%YVfuDG(!iKGkj\^,=pkoT]d*;WAJe(O2j/Jd12P at 6seV@2XJL"
+%S.7E&ED=K,(.PSnd?T at jZEH&c4I#;V`/XUT-E;[:6Ko>dpnirfEqd2D:<s(cY8s]>JFNMIL?)1Y+FT2dP$[EQMU&1^-:p4/>N2_Q
+%cKfDLpqXdp2^IqK`d(Ms(64=04`,r)C!WZ"HYK.&qJuD!T2N%eG3nrP[?7P^DhA.DlBJ60AGt.f9`3*``^^#A"/&.^E8pUL at 9*:=
+%LD$VQ\_N_\ehX^0DO7B)F![]43B-bt^KROc2XkPEA>KQAe<49a5;jdG_qn1,efeX/-Vl_.[hY!p`(H_:[@]:"ot*YLk9-pqK2]rW
+%S`.fWkj,ZmNfX7Km56q8m]_clHaJm,mBkcei+b8h0KqKo$`OK>KRDc:nM+TZhBD-bA^P8n at PikuQFX9/;.RojGUAK3A4oPDJF7rX
+%:=cWsp2]QYUTsaXHK&^BEP('$&PU!1 at d\5"h\7`SW!@1?/a80%;@;I^aT-?2*5OeIcB^BI93s:1BV57IHh*f<Ura>)WK/l1Re=KZ
+%N4Y[tYBJ^J at D8ONcShEK)F_G;??nUjEjY$'ei^#2\O<,rlbf=3Pp39`oM'bIk`I,8gj*VP'.EnJY8A6=Oa)diI9!<4J at sF6NKdmk
+%q"nil/5Zm_O;H9ekNsU1\_%/590/Qnm5Mq)&6SB]l%p$OeU&,,naP]WPtpm-BLr@\]rrS],Fs7F6^`17U>rR+/u>L//3trbYKoLq
+%4ZRIiRae:_XB8^f\Ug"pU/KJ2/fWW<:8!'D@,+AIC<QRfpY"Cs3kT1@[q(^anS"qXTSc!GWLK9E0O&R65(-oDf_WcmgL&ZS"NTAA
+%mYBtZj__^Y;aq6-g1KnbN`6"#7jZ?F4_Y'<$lE:&n^&<A3F-fhn'nZ/_a;L$C8(^]dKeBEh2oEN'c%-qRQn3c0aLrEM8=W9Sh!Z7
+%,3cWsVn#1_A5dk/-,DIc[/dlIU1*-m(R[K*`=/4RZhJ]P"M@^*OoUZd/]&d%':- at se86J4S3Lcp3(`ol(=!PN&rG.['IhXp["7'F
+%IcZ">_5,r0Z1]91,3#"W<3;TR;GI]bIsU[r#sn:?9(FUDS7 at EhkQNg>Cd]P[?FJVZ/Bi`_A`]rsHZR$7>Kq#%M(gjBk'&05Q?qZ2
+%/Uk*:U$q&1_#%:\-8&2``Q9kMnL),Be;0rc]Q5$1AZdB`>C>!/F!h7FjSU%qfRqjLfrU;`3a1M at kTh:j#49m$Zn;#kTcfemA"+re
+%%Ee*B]duX/]0=ESDKIP<_SD6\,&KV.R=8L7D$1=p\#0f#kqN8*%.Na#Eb9%+I0AuHI.abMG1t.JKC&1MHac1SU&M2\<ZATb4DXnr
+%5[\E*agWOUQV__g]VJ4I^=ilnBU$.f%`r0>>"`o$cT_0<?aKYg&0GMMb[48Xn.uJ,>FSL7b7T_qJ$R9Y<GQ at d#IcFBAIgSVPT!*&
+%b@,42J%X+3]8DM9^mccOio?.'RoFm-45Zj(lf=8KSo^YSIO="$>V.5FlS<<mo#\;jD)%QFBtp=f'RMc9Wh]c>6drVq<sB-;>W$eL
+%$p1R9C5BF1ag:0Tqf(:Chr_V%[(lW_OG8&!_E!jt9*2r?:>%m<OuKl+F=9A)C^j%El8tF"T(^GG8fpPr6'[$[OFY8&!1o5cd%3ml
+%F:e at l'4]>D.Ge7S<sV&^Tq<]^-)NP*DHf/YB=T8dA9%tI&qlOc6k?:#RF>HJR[]?Q.%16Il>V9BAMHQt+WFB)EWPi-'O?QkQo94+
+%g+&H`IFe*r2Ni984iH;TZlG+6mSWRb!a9L<j9H2EEl8(7NcOME?+KO43X0E0!l'oPYQ3PBej-'c*\;RYlbQK,DnC_fMq&r^*\6WF
+%((8%0]W"l_`EF'iJUCYR0HBn<K+YP9\$gMB0O21nk/IGa%K*%nqCP`[N<iBNaOF,1QtAAEn[DFhFFOff\C^n-EWS1/>7QA$2gqF<
+%Z>Q at XR>Ni:A!uHfoF?Hm/:T!$=j38f'-u%ZhUdEm+_[r*gO]0rXGGXR([\2C]$ZOd/mg4Rik<H739`rK)P\_?M0TnH?BJ;BS*W_b
+%1k;Mk-=kFh2mkLL+\$r=oj,BF#V=iHAeS)r4!tM(>IlCe'NSPNG=CQ[L5*N*URYg5+BG69mn-GRXoILWXdF)UNlKB.,M/<$$6W&'
+%JT]%$5R8Xa_%%g8eL'A*%mocBN'RNoSbKa&.RDsXc^WO%g%bt#\Lsm8GoM+$l0@<<HI4""S at 0fDB!j628Gm0K*)'g>=_Y.D/\pbf
+%8aJQDV\20Ufk9Rb2]J?L at Ip@+J%q2Yf;L.4K^'&LikQbLgMAH?#g`i]Ie3]NeBJrH<e>$3>#\3C;Kt;BmQ6?#,Oa'8o?u<?'RS7L
+%^<(17YXR=DTfTjXoulO?k9(^F?8fc(%TYn37UVBO%F>Bnc+i7j`TMsq_.EY"^tt8s[F,*"R70?G+49Xh)aDc33*njli^%TJ at 65Im
+%^8kff6Uh?9LRml([b0hJZnb/hjL=5qRnj:_<A]I0.q_1WhU96JDFpS7:'9]b1U))$BTQJ?lm\P!/k>"@B#)0A@[HjPnp;"O!lP_g
+%!bZQum*R+UYnJJ>(2QAoE?g)t(j[Hr4h9H!g!DtWHl=M>eem-[L`FXI>Dl0d).`51qc/\6R$\.Tb(bV/[EV.r5nk/8K:jdd(KRsW
+%'N=3krY[l>4fLZu%Gh"S3&1[XF7/StXA*'9E'bDiL[m&FN/\;BnFb<_Wd6^MJ3+I+]ttY#c[Q'^ds/)Z\<#Err/![#(!CeAX:9eh
+%ffkC5(12?PjhL<G\lirDZoeQ,5l84gQ*Do^mF6(@EbJi6_7X;BehZX&60X#+&LX%m:X[qbUjYH7(^WemZ"E"p-]:$bFe.ILOTW-K
+%PY2&LW6<NMB7nR*f5e/"@g<c[`^_No_ZcZQ>Y.\YK`)"J+Jm%(Zg.Ug^.`Z@/RL#,fF!jaE"c`Yi^la<?EE$S2B^XLCeJN9nNHc!
+%,j=C']5nq,M?q9IeX(oWTDMH.94kYYjhcC$SPl(,[3`Uc<mTBGCs=5*C;6HUDKVVm-46HkSp5 at i0`r(;4M(j/l6"!RMqc(6OtK!B
+%E+Y7fO-K>bYJfG#EI+e;d`BCq0<]HS-K,sgP>'T2aaJ4d_Yr.7Q^#kQTVB$N"T,^)U'gW@?such9F2 at Q-gCCN&!9sS^IKT5_Mj-c
+%!\qQ<c66u+bF[2>VPD1ccCpUrg7rh,?SRpai]Z(G2DRA!ZqZ&AXn;!e$gG)*W,Wk-:X6ZO&9b$:Sf:VP^t=rSAp^M"hBMDMgIBn&
+%<@9Z%.&C*>mlZ0:]f4R<)`cYtGmi(,9E,sQlNGKf$)Af<GZdaV[]/_*D^M:lgRoO>Q"Fo14ZJ\PoRK'?>WHouQC?1RKAVhXJl%'q
+%bDr5UUn_J$&"iG%>\CT4"iQ#^/HV<c/8W+?j8#1IYNa`@Yn!`EN6U0CmD&o`R%R8X[Si2T[k8F"=?e'7>2Qj?\cf:Q7://c+kP[:
+%K7%a^/piNmme>Qu]30ob,XK:"^HA3<]2Mel%MX!04LWEg6dFuQVgS?PnUXA+:#nE4ap9Q0'CN%d[VOSROW at e"1TGscD_skPKKl!K
+%O(:l^3VP\krhrg6^ghE=Js,!pgL:<2k[Wa^glh3tj#jCcUb4IePi&\C8&iCtAT(?<Fe8ec28a>W'se"Lpq2fEE*u=,5h.dJ$l[F?
+%fQ`g3L;klJ_'$CUMu&mgkTL,?-WLoTcBJeeZfGopF7]J#r1VUCWoKQ\i94AHAS8NZcqMVY>GbMKe%E*NqUg82EpK[?0e7WQZmBI-
+%T,-0R!lJ`"^rDC!QXl6b:B?+rf5U$6Z)nm2'FTdaC!:^`RKI4*E,aS'i:j3%8M?,aRG4A"bB;.N50;W;B%lm0\cl8<``oI(DBk[i
+%6n[IT`ub>mQ6m]dpeUdR+nN]+O'KmiofF#?Q\;[ZLF]P6mY_=Tm-B*\qCnL))F"'u/RcA\7u#D;":a4]bER1h5W:j$k_M9-$:<JB
+%QbS'$_kMs#82o+@?"dg?gbgOJ/<ua1+I=Habgfj4 at D#hS(j6u%;e54dRI^1:["H6B3<_m)a-esB(V:WK<CFeGJl/CX"P&[N/6%2<
+%Eo)DXZM0>6mA8A^#o.V>P.@\*V;@c;2n=i:jm2Q9fU/,/-ZM^g+'r*0VkG.'!PrY0+t"XOXX>I_'[H"B at h$5Sbmo0mNAH.\T2[n-
+%MZg.![UV0*p'>:oD0Y)#b.df-LAQJ`3Rbt4WA at Kq8W3[.H_O&'DY at _/iAXRm+7W2*Y>b-1LMT_6*^;Uh-ZQQV-74c.TC$bQOa<D+
+%OXW+ at 5Gi0c/rDWMHN$VQfW/:tM?b4a29RC7KB5nN3LIB!I,A;4cDbuN9`8hODjh?@D;#b!/#\^(J\1cu8Mgg]p&1:RNe at 9B2ZEGF
+%c$2D=,Tgdu-HljWP>mc?Tl_n"8FnUEA+SAp+8:uBg\tW!]S5/,,f%u@\s7o,I'`1&!U:UMZM\,l"K4.=f=O<u"s#MojEq^:K_g?#
+%57:*b9[&SsgMj;fW*9O,"M&EPXnWuN8THbOkeuep&_CB_9lApPQdX!cY+#k$%P7F!X0ojGOkC5=*01)3""4^*a#k1)(qD=LJ%MPk
+%PCB&+p[=tW8;cJW%LX`O:9H4W"S.JM"oUKNWJ.Ype.Kp[O%Q!]/l-kBCkB's2!/T!rDFeQY\6`n+a(KWR,lC9j0Q3\ABuJu]I'^u
+%(C:2V:\t[5A=e9'/.&;Gi=ed1J:.9>19ZmOL-C.,Sr]0-Zg9$b#[AJ1RBdb2UX'P3Od<"[YiS at D0hI\/LW;t1R?-l+:9]aZ91VZg
+%[Qo4Ch9o]V<BPCQD@:M>jb)]&'9 at 4N>EsRW&o&[gqMPQ73.@%^47)/Z?9]*^8XG"#;`(0?>.QR:h1V,+=A,bGIXVC^k5]M!S3f[#
+%T_3SZ%uG>eYoooC.prJte4'Ns;'PKkZ138O#9.g>#KmFOD;Bf`W*!k`@H\Af%B]ht;<RL6ng4,kB.k/[>7_#,k(5i<E4::L^@DE!
+%T$LZCHBMTG9rZCV$]tE9f)jC'JU=1`OtQODg%7DJ!iYe%1:,eCqc4KT*laT-Sc&17..5NZldQur@\rb(\!L0d6h+q<ONOH^7i0f%
+%B*-AF$d/[4;2'[LY"$0j"bTQn["RllIPsT`<H_(s8)Q'T;=0Y.>"=kI<_en8&7jOK*u=FL&2PA=%PI;c#Bn at Zc4AZ".f[dW6S`.)
+%]cgXWCmc89/2u__YMG(M%(rgk`c=4_h+sW.QhB,'+gBS23\lVK4c1OeY[XQo6VYb05c1=VL,HY/5""Vtc^J??$/XK!=68[_UO&^=
+%0'sl:Rcp1FYu',I7A$+M9cJ>.rkPa!bk^PA(-.f!^)Y!hrm6!Tf'/d(F=p)NUIn4:d<<jWZ#d9D+pWAS-").<bBrnO.jZ?"_(pQb
+%^hC+c@*_:-;<5I($14VGI)"6p$WOki- at +]oVqMF;]A^%AKgaAAX"Dno*s&[m/9Y,sbNJ](`g&7N?CNUYd0D*.8\NkbBMn_ENa=nk
+%+FDk4_,e?EJfLDU3ea>9"9jN%YXiM[Ur;#d4j_cK=[!FGWR%"B(PW<.[gP5>iS<KO5pDABA96qNr4NHCeART/VV61Ql'2s-5f]q'
+%ng0l+-8ccLo7#r^$k8^O^bAhF(lI_&8"MTbD-?`(bgfqN1K#l-ruBO4*NVVQ0)?6lkGbllQ?W^u\g>e-?%u99EmY5(J?;q./qn">
+%J0q%dQYX`:(*p[A2mh>U)7. at ik=U3MGUfAP9#RV)>S85_L`t)=n/q_JNqb at MJr#5QOpcRaTcT'9q+5=J(jN*l[=JF5m&$mT#@GSr
+%?>Y]+Ono/E'4c+l2gq9)?IYp(d)Z%B845b)gpP"uqHl&mrU:cOf%7-(?BT/g&2-2aOf6H&nj(QolNM/&F0M*>1krP1d'p-=G5e2.
+%U`X=U7Vhfmb#),kK^I$=fJ5C"7htuG=8O,0Q`F5q#S.'^Mkj?n9lg/%a8[(oAD*gB2^SUh&Y8Wa\C@=ESJ+?V0$`L4o`t?s8c:k1
+%cK#aIG!!auCHf+r$.-Cp\`Xd)5Yq at +ZnG<t"P)2O at B=O at G*PrtXXfM9qk3)L#sL8a'0;aHaaLV;O1j'@CYZGTKWuefH_[J2dl_P0
+%/`p%SgffhLo at -NNg-0Y.Ul^q#Q8ij1]B-[Q#f*aJW_N=lB<b;M-^<@QNoT8=&i1KY_nIQj`Tk[$hn:;is+5E=mF]BNb%`q`ajGCf
+%[8OS1m(9?5SetQkIVRF"?$X-;#>-&]O%lcLn_>LA/t_QA:itM"JSVRPC'Sp57fkSE,K5$W/r%2cLCH97oMU?rXYH at l%^mW>JqKdW
+%3S)m)9nX"N?WNG4cM:MJg2h;L4N(A&k/+3blG/$+YpQt5(E'0nW!]W?6*)_2\<4GK9AdoGkA)\(o-3Ma\;/_eK+8]8p:3fkc,W-h
+%M`':u'&PW&["&p^SK)hd#,(aQB:Du-,hj666:>tCMV3<-]\h+7qlg!FIc]4&I<g$A\J0gme"@njJJq*?k*2pM<J$A`]3B%ZoS!aI
+%<bO;X.Q:re. at N<!OHjITg#nlJ""%W.'muCS3O%XoXsnu_aQXfAb1H*Ml>!<+DuCs-'>:m[-?D0u?pao6Z?V8uReo6+:=-ghk^A>h
+%NNKD7@\i?5s4i7"Um-R!5O4jn>g\Z#DD3\BJ)A3FDg&Am:-gT)NjW'^,`#a`qOoF>juMU32PD58g:#CRXOZ""5LG)*YcF^RK84oK
+%8Htc6F"?n3/P:/=_D[mfKdZ!SI18^tf4_oS[tfb;[6/FQdiSl]g2/2Z#VM\q?Q*L7]l'jC<7;\Ig*d4Ve4d<0P^IML<6Ol- at 6eKc
+%FmMl;o.,%UabKI0GaV`\/J;s+*dc\_goP3J4!)VSNM/diP/d495^p2\R#huKPfh"ei]cP>5e\7C#JD at qS:s:=^->I#&`k6KSiWuO
+%CU9>EF,c]QXqMn[j4C5kp:LSKR<fl3g^/(bGQC5k]o*kgf2+VAL_d76YjpE.!gt"tnT:sZNE+jda7kjtF86>-eaK:ZK(I5PadQ(U
+%Y')D[T'o*/^N%'a3S]/jVhW07@@/Z54G.?^k<^oQ6:,Q>Oe%]jrZl<fTPC"80-pW=W>s#c+I_1jGSe\'ES./l./(MN\aq=9K[dX#
+%1p/mJir+0><7\S)0/mn33SW`t:t:0FohWNlH`Dd\r*(?I)9Npc;`I`-KSW:0b<&;ZU%OJ:@a"KR'^:,Ho!HmPpO-jJZ#@X!Z\!?[
+%)4fT*#mQm!T^-1enHLCh\p>o99U+q-C!Ji.1$(usXXOU at I.p5g12,n"&`.Enc?\Ec#!CQEK&o](!i%8;o2O:4_=iFeidd at R@hA(*
+%6uTmgf'I6.16B$.10H*<bAKp2[BOZ`'NQeCIa_bRJ!lqd\^P@^f8[Tj4kHt\Rl/I9D$$,9qKs+'dq7M4@/Z??im$lN%[<m,N;,I]
+%(pg/,I=*;%YUM;-*eQ]jZPLo%MT]reju2iDCGs)KL<[-RJC\m^H(%\ZIMT"]-s3h)-9c6%0gDQs1dmD[UI+@&rc[/oF?@du+Ve#@
+%R?s6/T>,eL-4mejd4>88p$`nDL/JgMUkQ9^2&A^2cP]j3\p@(:V&L@%9GiN at 5lgJeDpIR!". at o0J,PKhds?>"n$H(nB23BF[V-%g
+%+91ml'&6Ar&Zt2=S@!Dk1l$9Th&01T5F3AaYQ=^i)Cbkj'3Z'jT5U1Z-%?\DZlqKnak98=Fopp>c)DqBhXa<:$VbQ3%AQ>)I&Ymo
+%+0s`PLBB7iql=M\0%/rMj\%,dI15+.[>oHMcZq[DYu7u&.)dq"d(n. at o%4^!>`"ZEB'X?*6)H;h%%faOr&B6Dn)^BSp1gPgFS7nr
+%*6H3M!b"+7k at p^NAAl-D0Asso46T4kj>B\RY+8KA0/mfLFdN'G_7-VjEXj-bNP)Wb>'U_o-TU3^KWUL;gQSSMdG%9if<?_,f#SHI
+%[iXnLYSok8+E"Y`K0sLGPi?hK\TZ]@_>fnEmG2,KD`k;8<-D(AY_R=&/NBDgc76h5hK7&/K8iO(WYD'<b7hR&%3dgn3!X!W.SprX
+%If*S25L4CccSPnj%gk&?i?>3X3(7$[C]PTDL4pWUAPQD'][@>c!e(VNN+I3*LBUI;a)L+[2]eX.((45R"qe)[Fo%2AM"IT;%e9q%
+%9&VUW[C/93Yh873#kNdp`+0P]@S(E0L43#dj^\&<:I!D<"-p\q*p$*k)@d19BY at 8O1DP/%$S5nX&,2bmZR\g$#dhtp'\jAp*XX&d
+%c9gNcrP2\bH>Yj]^(n[N\:RX=^KM]'NuhP$Xu;&S7F+K-l:I-Ib]n1DK5Xn(nn;]Mqho"m;q"^+m$T<Cho=mgKitaUns3&+/<tm3
+%e)42!j<D*mHc`K/FXir+iX48'eJk<bPN_U4pLXdVQSh?ai7$kI0`jL_<g(CL8UUL=k>P>3!VVQ8=)t!tp_26q4,RBcmEmt[hpT($
+%N;H1Gkb:sQe4I>ef9d&FZcKa1-!@liOY90n/KgIYT96FY-21IZ7X%\f]9s<bCm&sJj_LRUeaQCk4.Oca1,5X=,=ZV:\P^$EM6:`l
+%r`#`*A*`F1kN*b,:+UA!#mXI27!WBnrgdQe8j#],_;QIX\?dbO(%Lph\JWVsC!>6[\Wea9OY-k]AduZ79*8XF,5[513A at H%hhJ]U
+%i+agM8SEjY8N<2T'-Lj*,r)($g"C8-%]1NM`gi(.;mLTs0m\Vc3^LB5SH=u7q/MIe>Je!ll[c-<J5/e),hYUsB-rpB+t/dI&ml]4
+%7cp+Bco'bH,OM`srWi8gUmjHm.sN;Li.n4m88:_#:Ak6sW;9=bZ3`:'VHP8rO[.>O7%Ur at YYS'hr8`bdfjUrB\5G33eB)?N0"(j$
+%ANq*tZSRj_MB]ag-nRs;F79`^8\g*DTG?m"c;&=ec&86oPQ);`@Rau]7%hktCl2M8,MXiIKmAf[AfnLur[HmN at j1P.=L.+tjV2pn
+%h3n>#Pa-eo\$#3FI.VAld8-*ff"@Uh*P%t^Od\p^EIB!gc26[LJsfM'g/MR2*jj_b^@"Jn//8Hh,hg'+`=`2&YhE+D.uQj7Uk#pb
+%#*c!8ZolI'lc30L.^IQe89dr0'UKX,^>ra0bI:'DlXp[$QB&@hl/LIca\!'<]I7AT`U#Onl(O3jWWq&Y`pWGW#]>4:FnTG@?Vt1+
+%rnYV,!te+O7>!FDU7[WAHOi;J+i+(rRkan2;BU at AcBWJ)P7g\@PPJ at 2cM\OdKD.pXH4'cR)nGOpBQMOj8[_=leV>OMcdfmmHbOb)
+%YjHMI/(HOoKS9KH,VhJ%&9!FR`=kkWD85XMYMhXtm[GPbVlA74K^N(k"=A$2*P97W(P=Z=rsSHjjo3G!3nIo<]cVHK\M5NJY(13?
+%l8`VR0n$==!><8gQ72X'[1aW-k)R]lRs#V`kHE>=S9gg8r)l%Bl/(Th6E>c!""_gom+&9*AN&,p<1-nh4hQCqD^F=+P9#,)AP!W$
+%cSN;CmG!Dl9HQ4h-b4rK`EB8FWfZcd<fIC?SRhb;k9eGnlV/qqN'2o\h#u)0^\Y#.'PEenGcA"TL"htXc.2"iUl\kT17!GR$%f.d
+%o(<B^0l`%tgI0)KIa"'Q[3g#C8?mXBE8quQ3.(EO+&@ls(K3:b`d1R`kgU=B'>_d,q0.gD_rV$%$Oq-6JE>>B\e+[/Ts`t at n])(a
+%Tht^%=L>^uL8McI80q`93I$e0L3:EhVC8XNjP'5#Hf46^8>-7Z&$&gFL5l+pP*4-mHE1iA#WF?fElbZgH@@/!c$]rh$ql5b0H.`m
+%qDL%1e*qE[QmV2$N<qU<ddKm@(%Z?+-r?DtT\`c\E./G=Xk]$D-SHA:[LK,lIO+:-YoQk:oGEO3>/7RI8Dk!eNY&W^C`CK&/;=r/
+%SUYk;^:foJkAj9Aok-i!SYW;OZAQc>h>I$&FP1*/k&>`$;2S@(QT(<:%Nh5uY!GBHmUT7B?AV=kQhabZU+'+2,FL1qQAS&dBW`e6
+%l$^a'4T:S;)N2,dn=6]R[(RE7R1"f=ZB4rF'EII at cokH_Q?A?mP#>Tl9:Ke at ZqntR0ZQMS=VpkT-)X+VU2iCZHgTD;]dX^4?F'4A
+%`?pf1/=k"=$4nLn.^US9$oIkq+Q(^iVdXJgPjOoCOnL5W9K)R-N6nJgoQ0;Qd/s(IhrB6GSVtU5-B)9S at Q&>n3OJ#rrfURnGg*pr
+%DggasU-%M)TBi%?.#DeH%SGLuU#)&)<0Br78q9GB9)a6IkO8\X/:^j,olegkOr71R9,c,uCK($]ZaEF?63Y0;g^H=^1\'TR<jA:t
+%jr==o9X.LO*3]&$]X>siLa$eN at XO/t7]21d2P&a at T8t0YR^ss.`EE"*<47^qPE1s;f)AEmUg/71G]b0Qc,DSS6_h]fiW24)MFZWa
+%P;D!13jCeAHs2j#+b.af at Eo65B5gR?".)B1g, at 3)?eUEMrV=,0]+V*+,&GstN&6.j>L&1:O.XaiVneFBq4/>n84tm5*subgJcThW
+%.'`*9k?6b<IP7B=U?[%.+-D+1h_QB5B4GFEO\Au\56W%Uh_cm["/K:rA,Hr[3&g-)ota0p)Pukmn?FZX(cQO3bGEZ/;S06%S$L3h
+%q2XW=?0BLj4i=6XNY%IT;0eXs:8[J<Mqml2hL+[JnRbUHD;Tc4/<p8 at 05;eub?/`?:QE]59VcY.4ri)1Id2- at SJQs#neu2 at 58p)+
+%RZ&Qmdp>R1r%Ut6N23XfaOFOBb6V.-&8oZ!<o06soB/hOgW;*N00:U!g-hU0[`p^)@Si4X_7W//)UhJiAHtEc"Inbb-RFI\T..WI
+%SIDc-B9I%<i:"iZG1.taA_?/Mc%eBGf9Pf&'5>P",oW3jh>MOn72).1$'`BR5fdZbQ<0elnP)aEf1jr"!h@@q.J<;ooUIb.f"@*"
+%OUJcMlW</Sp:RCU&6:fp50^h]4LH#h/bTf8^>WjSG5\q3$$tHXP1&$)+)m0F=t'cYqt)BEFst7G9N"l%S+9<+p,jiSW2J(QWb*K.
+%K6ED,Z9'?P$>1fcCo%Pf\<e+*SYE5^s%s*CZe<^ToEU5:ZJ!@c58#EkA:]tS%pdsq\)pUCg<O,OWBrl80>X:H at q,)i^-;DEWQAHZ
+%0hNQ;0dUnt)WN+8Jt04Yl"ph)E_u(b6bn,2]S)-o,jq.RUmu0uB$F)aKO-)'jJ-BEP;?\apN/3\@%E(,a`;?D6.d at PXqRF:I'M+G
+%;;aen1`X^]qn5B7GMZ8LA2U#<JRA0JHDc$)(Xpe!M6XObqqie(i^fT=.dOHucP+&NHgI<dN=\#*X?hrb,)=H7kde(so>.oI'sj@`
+%IUhqWC(6/JVCQ0!0%!g2h7smR=6r"$g3)#bNM at cY)7]C9M2'koUrERhL4 at R:`(/B=--XL!Hl-29'riPtTXpX>3+:#OoDU'+V)l^K
+%?Wm"JV_3ONHbog&J2;oXG#%m.Sk&(Y[l!0Fh3D/+):DSEPNd5Do/E=:>tAMgbAU#Z]_%_>Lbk"IfKJ:6I at C.VET@OWIA`"J7[&7c
+%VN!D\p4t.*=-$)5!gF(+$h0Glg2W8rDl4oO8N,9nX9G/SH6e]E[**NXd7W#$CY at -&-DA+`Xo-q#ZLsPk&Gp[BH:l;$-o07pN0j96
+%O"+_q_Kto;MO at T9GZh[GKGiO0_rBG32f$1+6o;V2;UW2o34WW4-TAT2P:IVkJDV2+KNbN:p27*TEc/(F(qS^0X"L;@R!goGX(t4g
+%aW3\A]Zt at DSj&tUCucPl)Qp&e\,=<4MG:1SK\V3]lZGuQfQ>cia$NoPa7XoR_1,KcP0#+;VsIW13XZ2Z'F=g/\#+'"?fh6MVjRe\
+%-&HC:V(PKj9PHgE,"ZQsF/g%]OanAm\>^.B-b`]JIo at nGGOdK*I_.1(n%=t*VA'gTZWO<8QD+42VDs=,jh)s.b`OG7pq,>1a\ltE
+%XYDQbel2r8_<nAN_L!OMV$'3"00b:]^rBD;5pCNo!jX\_Q+,t\#%e#5]eg1=)[7=tV(iht::JL!3="Z-V at kago[T+<>He^GY$I*s
+%?'G^:%`$^lfYJ9j2DQK>ScA[k02=pF=i>cT-G,a0365fTV0]<:JMs;VXCD?cKCfC at I8.f-"&S7LM$hg,Dq!T+ZQs/ZLDG`l`.4's
+%a7SCc=d86A;p_MLjRNOf-3NCOIt%B2(V:3KhD2L*m^]f;_9X?Nd0b^sYSUQgRD(n*Xo/0.$LLs(\Zaf at .=d:>LcEQ9V'.LCP'N*O
+%^N+ge(,l$[AUW\H3B/G.G.1?b=Ga0pXI]9\E[u\$87ebO3YT,hP>]F5]Zsa'Dt<WZ-W`9b;F.!"CV=qpj<%m#".B;Q^Jc?J-N]tp
+%dKM'"8Z<]Zf6DCUf5K7Wl3:D%5#QPF+!m]Ce!1;[ri%X?a9N$#9ff3u^(\]l,uQt[8*Y<!A_M\\D1E/DnhJ*^)p*"tcNfYs]Q%7j
+%@idJC*#Ga_T&Yq??0@"K2g!+,+BT$&UhhWnK+I2tS!\8B$.4Bq(>ldt"c`N*m7k2+DXt$:XRNMIotbNkLs>XS7?<)55VI=8J'Z_R
+%AreoI2Xo-[/]S4]4Wf>"=%\4Y=R%'7Rhq;cKtjfMh3a:qX>LXKllI;h:e'^1;tEj)0o*%/b:=d?f\\!)`FthWSNH_RqF.CYWDK[l
+%fp:G!:3f*(OlcLYd`Wkg8*@>>A>F<e>_ at 2kB.$e,[Q^WH1oclt3uCVk]ZQjupGk\A;Nor'N%iZ!DrWk'CGF1W4F-U*4t?k,/&ES0
+%SZX9;9WSW=+m."1mfoX&JTB(WDdQ]#YO5*l7*hbqFIb?p(Bah]@_:L"nc%*G(dFAjB+PYnc0%ajf!I$,pX*])'1>FrMFE=MGB3ku
+%=Q8h"_Ih9,aOqL]<@i5rhB3bED/[r-dZR7)*qfe,QVaBISGV0$/=LfSTDq(jlOl3uX6pIPp-Y#>6"J$YrOV(oU-<pEh/8??<6nXj
+%K03J`$Sthb'\:sTY6V>SU1$VG-.mq^8?bJlrF1LC[/6JjN:iV[WaM^:V3Jp7OuXWqERQ@[\lg>Rn[q]p:[PQl`4E-W_ at 7q(mBb5d
+%$j'I:,G($J['+)BV2u`#=Y$FQZ$h9nRRbCZHhb@,65M=l/!4V93StsoBK=J3=i/g[Otn1Z90_Zp]R#uT2B$DP5.353`4Ohg9Sna4
+%);0VaSg0?g,h&+doB6`1q\4CZlP*pdaHis$]3tE2mNEDDSNEmlDLuB_KV)ctl]TDE0Nq\JrGECAfNV,,qG\5a6au(#X\UM- at Z4$P
+%jFr]F<4XM5P%EIfeAEMVT<?Z?g_^b4B0$,Vj0a;)P,:+)crfI5WEZrYBQS5*[E*cK_A9eoT<cC1i-m%*2$KSSE90/\ftlDWh1CsD
+%k)U<_;2Laj6#L8b>4WLu$\UUt7tcTGe=5]3Wl06gTCkL`S6?Po3%Yu[g6CAHaR]- at eY6,<p+PcJ4\pla5B76<ZZkpd-!@/q>=.5R
+%cNk3&`%gRd:I"`)F&AeHd$]K=%hk<ZctI4W,MAN<6p!*,,DS](DkYVSE at 0?fCF-F#Eh0m[^?]Kc29ukWq-^>6ZG+tMAVf_;2W=8R
+%M3VM?9`o=7,^Frq4"CB?+-nE,CS(rjc/OUFGhGR?M%.m.8^'eY^>(J#WuGsqM3Ud`PK?eA0Q*WODqAbiTinqH?JjX=R8_^F[**i"
+%Y;rN-"@)Q.'_-Qr5D<5l_=L)AT!SEhm82:M[P]N`Z1SSP/nH=YfF(/8#nknTh^=_l*TCFm`KGV+NLZF;VS&@fl5[CY at OWfrP%O$T
+%K7V^JK6JbV#`i3.:0'UHh)B[qMk>'3kK64Q#C2 at n8L_Vf@)0[D`-?eA9^9?SYFj]BhEioDKDil]"]-:gVk.rsFsP:ue5K6Jo+,Z'
+%#jcG3q-<Ne3S'dCq at PQ.+6<B(*j;-+,LEGH.BB6]X6muu<[n>q\Wp"Wa]e:-I'RS[&hbM%4TZd)4)nJ$H7-o?goMd.Ef>jTe#5lP
+%$8+=,JhKtS18 at -b[gD)[Ufd3'F71%4e9sC9W7a,<0+&kdP2Bn"BX=Us4u(dHI&qFHYVPOT-_9-`+iI:&2IjTXZd'PRI)VXM2I!-\
+%JE17!:6\R4ph8lu at T:M*R/ZLOXf93=qY&OjdTi0D-/"]p:9)[+,?\_^@cfB?b5'`a)\6%U3bb2HD^SQLZ@%sPKBf$j5Psu/ppLhc
+%Ypm2E*nCZm86f'AS^2"@KDj=1mUiFFJ"IT*E>,]sL,m'9BdbqFX41^s?atq]Pi^Q:[mXU10>NmD9J4Wi-O.BB55-gDo#akkeZR at L
+%a'ZP`L?=+9f]BdHa5;2PApld=mQ@#Uhaf8d1BR+B7/Jd-Z_#XQ4nh,db,TH/CP1\kI/2:3D>>ck?T>t[FJNkunda5]2MnTSh*'.!
+%npTZS:Eu'D/\V&t.`b\O_Y\iJR3ZujIkoOsKeZ$rMd72>cD^;)4+WW]+R""-3SKQd4brEoK:+uHk at k),k7BgZ#(0>A'g;CKpM<S*
+%2t_NJ-;[Fp&j>tPc^4&k!^-d]AgK,)_$9pn#WE-MIeGq/L'8"an?:g^gDr#EU]Ii#CLuLM)N<+lB9&W at YPGf]+!Zg;`%+U=R"tXl
+%[omq at fh'$gOtXR#I$'Ym!W1]_Y"Y)q![PVD&jeq,q9o+4RS0aRn'stmo4pU>?<XS(2>*eLqGFIN:*AV/`mc&Mb`2X5JiZ-;Opq$V
+%II=kPg=uBIj%W^RY<Dh$fZd;qUM'^=Y&&,#o"?<WP#r at 0QLR\_f6fiP3Tin4S6#NRn;rfgK>g,N)(.3PRuL:UTBAm&Zl;"P+Ou^W
+%HsRHpg*B92S?igWi9F^ee5sIZ8af0]%e>u'gr,JE>Zg!Jj9_e,o%a]X1mBPZ4_X=X;GC%t;6ZQpNoAli`,:i(2bX&qWE0@#kFCom
+%UOY7^cB\rHHU?K!T(cL9-c;-MOQ;hHJ2(MO<^Qs]OJjfrAI0lNdENOP'm#DZ1AM?f(#=j*#^_(E]YX at fIjW4:DF&)oEI0]15.MK5
+%mCDMHQ],YqLh;C*Zau?V$Qs]/8\k1CD90+I at PEGsP<.QeZsa[O9Ihqj;.n\Yn!hV=M,Va52P5]*@LU*pLVsF[mPED!aSW[3ai6j?
+%O]"Q]F-Pk[2->DeN/gt2#u/j`K3]:bP&'q@=hU9,(,(<GWR>(JkCUbGf'uf6>a)W\93 at Ad>d8JJb0e$`(>R"T"TRg:h?m?masmA[
+%Y60W)qfdG6p78pAd`B[]O9g%h*pG^0q'.nJMl$*c14MP.aI]\XTjO,']*20HG[+LXK;=eJeR9Wh'nf1O,>!JZ/g8t-f:4Zjf'SrK
+%eq8HZ^n&r9FIV&YY&LD!jU`N0>9AlXeCXElPB0%e5ONgWfc,kaq':u$d]XUJ('7?a+Bq*30#_379d!2'-V;Dh at p,ZFn+0l-"*NeI
+%fUc>-XrOlIF5c`-af"]?H>'nn<sH\_KS[MH(ME/a7BUtgIm&`&pJE?5Z#!rnSs!(DHrKn8K[rfBE)7HRRj2j:$`EN*VLB&=r9Idl
+%qtJ?<ASMf4MkdT(qQ>edCGet[W^eO,RbWe!*9C[Fa3^RR6f,KNqR2'M`Y?$3Kd&23hB(EHn2Zb4*n`kYSccmqf\--cktX8Ff-h;X
+%Dg'[45U$MR+pioqJ07AQ]em!2[O%3pppG[bk&gRDF5nuu%h5ZE!`S$OT at Wa!_Erd]f`*dOa]1+.9u3rQOsop3#WWcO.9Nc9/<%=s
+%\Dat4M!@`Q%(RMS_"7H&o*7str/Wu3cVAD-pD_a">`T!$0ck\>2srW</lFa3!?/P8`G3IM-$,6&GK\cXmEPTDFP%Q at iWc'=BRpSl
+%6V.9W\f5<kdkG1g,SriDRVDg?h%]L66IaNK_HKRs:$h'9q3`_nS90GFl_2\U04W)gO8X0q-)qm-rg:oME\CMi>7FAqZ):05PkZ72
+%k'SaM=r-j/$hB8gh?)X1]8/6f`TU'W@^k<N^kYd3j^-];9jVIb>Of9:_NT-6"81P9Em9A at W?U-S4H>-I83YPBpOW9EOuQ$"Sd%lN
+%=5$g];3F&Lp#O/+fFhPN735VCfTFr5MRHRbFtu-8MU(tibh^%I)cFFONY\3+3=Ch.GM[Ng5FFdcL"bTRNPf0'i%u)6!AZ<hN!0*3
+%>(&E&'XUO:F+4iYK6le!E:0NIAV?T]TY^Di`cf-\BB at l%<`-WlSTd5J1O(X(Bg^+8/r+)f2ZqL`_1uK6/gEB2.9%'Z;0Z.Z[Xih`
+%6Y'#$4=uaO`d)W,R>;%Sfg[uM`0?J#<AuZ6BA9?Z<N>^j$hP]FYnB#krh,7lnhqk?lod"ddU-<[.d\Kp%0EO at 2t$=`UmqnBW`;FK
+%j8(QKf^*GYn)s"5J>+9Mi9n`HMs at c8a,ZhFW.d at UQ`7Cq!oIl>Q@"=YS`@O,,XGqJY^IO5KnX4pNQ1kN2il'eCdLe&bT"Jqa"e1U
+%FT7rQ3^mi['DR',)K4q3P:[XT;i3X-'+fG+7TMMf/8(lEB0^U"q/+U7NpN$?kgQsY1e\C#3W,lU&Ta[h5RK0L$pc]V4==/!SP$4:
+%h?^@V:Wr\ocM\SC0^q8)8QQ\sbE<6YSK.=n<0Lka7YqVG2 at fN-,suaO!BjaI%i0#)Ij]a7AMm'V)F<jYdb4I8/<Q9adZR5ZB>j\r
+%p82IucYjuGRSup&Ofd&2bY&_q)rTOBmeLGjF(e[M)r$ZmQR65"T-a<k_=P"iYM#0C]`j!i59Q\eG<he%THiRS^I5KEWo?Skbi;Ao
+%*))]+P5Er1*nn+""a*G6O+SV0Z_G!HW>rBu8Q at sca+d@5K8nh!9]mr`^s]0Cd4XhndoMp at q81XTg%ZTT\+[V.6an]`__O at Tnt.D.
+%_L=Aqj>QZShiZEkICf>6Xr"sIib>FSS<4l"=iaZA8#@_8\_(c$"\P<WRJt-OW%YI`]Ve+'6NXSa4%]bIXao;3cC?iHLa6BVa0n$,
+%, at EX>[RjdlpUGQfM/St]b`=F`ce;PV)q"26]3:sKKa\M\;0/=(1st*9 at T]*-:k'Gt:Y):E(ro%.SU(.,c$ifmV"h$9b0<7L-5r6#
+%BcF)qW[GUEYE0lHD',irI(T;g&1b5@=;S-oE[N8En647Rr$rW,0_)rpkI-sU6VC]<-NDt[+IF'#L[5op:3t?@Lip&Nio&2(e6]&V
+%`Os-4C/Aishj(cFpS\4Vf_J'q-3;ir7e&(5p$9Ge?i<R(F0/cn2<HI*::b9EEsIUQq/4<bfP?^s$k*M.KoIEIJ-co&ZkQ2._K52e
+%a[pdi$0]0PakJXpK;qgL=8&kt-[OJG=Glp76PZ]A*$A1I@$B(XkKG."ePa`WVX_(%j*tt`[@K^`VOqk7+\@@I=gM888]Z;AmSUr"
+%@obcXaKTMRMN1WWC)H^<j%&L/b$oB`%d at R\&55ekQ8Ac7!ZM!F_<h((]4$9XKh_4=9b3+7a[3V]JqM"*%#OhOBGWdpgUC!ckm(_.
+%KIZOk9K*%W)'DkL/\sHDEP6gnFdq5&$4P*<]%a:6+Af$X2eB:B0Kq+[/n-S)JF/co1kNQ!#Em9TA"4+YGB%BT+-Vj.kD%C2p(3]'
+%,\Em^e*4!snMu7OIQ#q'H*mD at _<hQYK_*P9%t4?H<!>'DX^+uYbp[*a5Ke]*_t`3pjpL>_o!V8Lr0W7=>.'!u#KhX0?ck-c$:0ol
+%h3E;pH,a@%`tQ!W#Y63aL2?),\L7Pl3'S+_S"2%r?+Zso2o[i&@6t0pO5&qc&C5F\;TTiq#LB1T<m[E,n9+cVi$;K at H1Eo=?p8_S
+%:Ar3$_Ga-e,TiiADam]W9=?pBrL#-[q/<.aDI5\[]lQOq>mm'TEtVF;8cF<S?2g&]<FYl86?mhl8SPXOik+K!*_!(n8`6?:<[4m*
+%[X%\?']]R6-e9#&*[2G"WSgO6RZE/)5phej:0oc�n]&d^9IJa7h_@)MO0U2N?I`hJCJHU;D2WWPOBhR[oXP+J4)4%gd@@-FdNA
+%kEA#VCA. at R#Xr&<leu5e\d`plJKSk`bN7L-mF?:1.1EC21l/je;spt*D4dl at Fri\I0RL7+d4-*2Mju?Kb'CN.ldp(?`"0(D50rn-
+%nBg^R:0WG8BotKRnR=A\[I#:I;Q'HHX0Xj+kp^GQo at t1-I(roQ/=W-^6T(d:ZPod7pbcr03S*)"6a.!%-\g5OjK>uFg3BJZDrN>j
+%g(aSEUG*"c+#(\V^0HItWc+tIjnL#b3KI^>8u7PeBMiZu6#J/Ff5n6\:U!;X9.=(1R=#iG;LP8^klATZ:0feu\/Z=V2Sp`c*LO=s
+%@^lH]f(o1F(9WjBj]roA9=O%%5 at JXq#SKA%#[-n.kTa,;Fd`VQ@@;lT"CEP211g0$[nJCugeD<0q55U)+Oa0-acj5N"QaLbSB,l4
+%aPNDPiaqEtEB`>4iTd6uO@#0T7d[9k[K,!SQ[@ZYC<Di3H^j#(YiS3kbE@*UksMX9TkO"h4?j#fnruX[$:29qqkV7!<*<+OGIqiR
+%fAK:4m.e9T<#PSqK4sW)qeUZ/Ok&;7q28`GESee>Y[np#$C;U>";V,h"nX/FVYL'3fWoAgq"!>MqU%XXY`YQJcEtD92bDSjn0Oae
+%>c2WmHDWru;_WFj&6i$<b\dkDikXZ7V.N9kee>'n7;But?.qtDP6kEMYpjg[>T7LN5KL at NC.uMpf["3]D(@Z9\eSNFQZKeEXV`Gh
+%7Ah'D(JNI at g/k.H;%9+3I=9^)kMYqj.hTP4X?;Q,QP5S=5n*3/#*i\$OsdG_'DE4:IqD,$s,m&F_Bk9k[9rK;RiC;Y%!n>)empiX
+%9JI<dr/rY^/-gfY3EXJ.A+5CdU,l@&:tSqa7*M]EpFT`/VfmE(*@-j0`'$f.EefJN:/dNS=75.fo%P,BiOS]>.9KC;KA^tQF at h^O
+%'qHjH+s%W0WOT%AOlT`<]\)PG`d%b\i@^'85c<_LM;1`_g?%7TT-7%7j9A2&c3:2"*^gSBFq'1=4@'r4kCU&3oCgqnWt!s9Zb6j@
+%#(n#e=$CSpk2Ouk,bY&fS6=`A?%_.#$c>X)S-B<Bc*RVRVLNccqTOrdC?=?em\Gm[$J#uTBpADb3'Q,'Q[AU>8gH$.$![5h<g4LQ
+%ngP*pOsGg&_,W($SU_**+sYJ<!C]C+NPk$tl at b)$?#J"aR`mN>?&Ls&<kZC-aWON;rj!,'K.]CHP:E_5F&"(1i4],4F6(!#e8`$f
+%H22_\!MI']^nVOqJ8k?QeJ/F+UU<6fdl=f^N6CsB/TfR4TW?0p"Lm6b']AMaHZ"DhroE+6kC0c)chWtA#N6i<dN#O`#=.u1@=:lL
+%9)]MHF).2ATA8dQN#PX&)_id[U!_[Dk*V*.nZJ'Q)l&*?k;%$c]$MJ+O7?a2Q]`K]2T\]8$;%"FB#(QFqdO;C-eg(7Ur5.lr2-[;
+%R+'3C^e@@t6]$uEF\l]G-2"/+9-U(CO<\,I'Op6h;CNbC%q3$M1XtXUUl;scK#aopQS]MgE78?Dl4.<pJT(F5H24lZJ)n6b_0/O2
+%)C_0Ug&0X)gM(45b_E$0jQc"U*K_nm/tk_18%Yf\#BBWTEEQ<NM%k/*+*nHeI)/.Ybe0:dRg>RGW3-uTY$!A'\o\ud%`gqQKO\;,
+%;RLB5Hd"`'oE6kLqiapFYU*J65!U64kD(c0#)`q"qA5_%7-Zd*[^MG-'rJ2kZcc8iGW8Hfg/FZi3Cb+'n-k\YjG;\=]"<%,8o-*7
+%HOBf>`".LN]U4m>'A%GG&]CK.VO\sc_loPBU9F=b at F(29]o.,-*e/%PCf90h[:@E8rr!GabpQZIKCrVcg=-/e5Bol&A?7T[,abXp
+%"5F=T#74$1:H at cumVGP<.-%b[K$`@T!'"&:5V-\O3IPPpo5%aAAeH(N-M?8aN"M`9""/.;2jIh`fs,5,m-)qH$%lm9dQXh9!C0-A
+%j'09O*gWfZqi)>;LK"]hH_eLLBKCm-5&lZ";=W`Di%m!a3'TFia[*b'$PdN=C-;aF#pB4Fl6KplF_m*#@WTbV_EsF2@'!Lf:(_$)
+%WXe>e$-=hLfnu+cRqSqb)GFs:8^K\:b+BJ(Gk8?aRjgg]5V[\KPH,%A]PgM>U!IbH^_C96&A=0lS=:k)lSi91Alc`e2Q7"=PiQj<
+%misa_&oQd*n`=2V,db at IoB&nkFuW;6e52kuThpWF)`+ULXF'1(-$gZLmdI&M%G7h`:Wsb1kNtAl%iu]W8AELj#pekJ0+Ijm==](6
+%,P/hcp44Y@;t6EJBYW#dc1=O:SV5cYW:(f/k3p]`\t4p2.d\Pij<J."k<rGM9]`]I-[?Vh\%ijs#m)Cd'J/Ud#&;cM6F7ZOe2eJh
+%:0+lE[e#"YW%9?kjrV(hN$]u.-0jVQmGH6gR-Yhd%'8#bL4a<FrS_,hH8-8W#meuc9kH\NR-T8SR?FC(#K!;#a+d7D1bs'D>YD;)
+%\-<bt8'*X^,B-nbXV2pcg*s!iLi>W%/;B-++-PgLeB>M)Cp_5SNjIVI,$`<BSc*BI at 0r^.!>^)n:4+XmG+ at a.M-mP3:.%su,q\2$
+%*4-9TI`=Es3uY(rNT*?N9Csm,`Pe];)3R_Vg8kb+el*cLs/c4`hg^2,?N]/+_M at gJHuE_odai6_-$'"F45<VL#ms8^>b9Q3&2rf!
+%hLNIU3`p:2\,dBP<(U at Y[gZJ(8Z4F$\(scp-%D)p";2I$g5C)u!.u:R)t9(rIFn)8/%;3aUV8EAh_)WcFu"YVN`nGqj[]9$XPXIA
+%-qTiSqT>VGf!tqSUr:K,9kF*7)3G)k/=V9MHEM_^S!4^<^t")a(T2F+/30>9/%cU_SIKVTN!5/hV_#;)Dl>UkP-'(Z2lA:N+EhMb
+%l\G\[R at 0Qr(R:dq3R5\$WO]kTj1lKcLL]#kU,>FL1=<q2RO?a9.,,CKqql]7!^VD4?7]%9N]QPQIoJ)#Om[94ia`$**/)>pZ3;NY
+%^8IhO5&;1$D6i>[ds0YY4n;QmYoe]ccW!Kir='JD>EaF_Xg(LFK/AC/Tb3:d[;q9X<%ep-"0'6dSHWm3IB;c?;Nr,ACaK>%&&_m_
+%]QK\K8I?a.<`t/*'M+nqg(T:%dhAo&2phZOc-oqD.JaCG5!l3,h0sOhoua\dDaMqe6KUJu[c@'h_2Z\bS"+Pn`H$!)[>C?MbCnt&
+%SpuPg3taRtB^LM,e"*gRJFSdpG+b2`KG#'62K#soABC#WYs3J./RVj_5=t(G/a(4H53)uQko^X[aKM?=7`DM$QnI.ci]aa+1s0jV
+%CrlO8Rf>r-/;`ZW3F2ju?:[3:TTQloEr^7ldACt3)h7Y\P!8cWaX!^e'7:jUWi_td'.V^M6)BeURQARiEm)/uR*??/P#=qW.YWm&
+%=JT<U]k\nb10ac0b2.etW5h)/8]!o[-ITeO:4I at h[=@X[dEO]V"^s<OrS((n3I,?)Q<I$>KgC#mCti=+BtBG/KR]SU+JU[:UGu[0
+%-_,,io0GP>?_Z#<K(7e-_7L5Q*(cSgc,i1!k at C[HYm9m[(XWhtgJBVmd\qQbH04f\)/,fui^l'"Dq54W at p&X_P<Xo)QMnZSGl/h=
+%(eY4&(.8^-H*aD;fO;/107i)=*dPQuc7'>/,]K#/8a]R[@$&]W+VYp:4i%r4^9:8NV$7oX[+\+3C4##U/p"[Js(S2)\>lBUXNAco
+%!h;M)lR#`sRjA-"#NilW(b_T#>^m:"QI01TfdU$$Eui0*IG&oh$(DbnUgkm_,lST)mK?;M8O6KF+,fgl`3t+9dfqiLG,bY:M7tIl
+%mieBdLbu))*.&?Vhk\3.K5$;!OiYe502`@N_&-:t at B`WW&-H6BhFZMO6a5?s?<0">9k#%u56iCaG&-h@<;N+/U$EumUpAnKMb+Bu
+%EtGG)CY's>/:hB-'ZrB/aE:RMOl]:h=*:9V/*SR\.&r at 8'0=7Gd>8qr`]q>L#pHjM>Je?+l/a!k%=Nqmgr9>%EkQ&,ACJuMofK&E
+%fg\!"'(a6f9%kH'EO&37PWgs/2P2 at 81#FI*^fk+E%&%TNJP#S0C:^hGf5BSD"<iT&Vp;H'eZ7$'`Y*u^s'jU]D?e,a6Nj[,Xldk^
+%qb5c[7W[E(M11/]IYq5Xm<m*@6-dGf7)S3a72TS'9T<!f4.f1KW03>56he!J)UsbETnc`o]Z.ifr):!!Eq1!KJ.%PE:N35p]'%or
+%0eF0d[O:8"Xl"5;8Z#/5:[G\1_'4.hVX at hu@d<ich#Ce0'SA%0LBZds3o7.m?tk>fI?(CWUaiB`g'gNtgS^:/qiXbESC8E('dc#0
+%kMag[8ERT?lTEJu:sBTX2_p1,[J]Rmo88Zr1\N0Xo86**$e3M%)m!$WRACg1BT'AXg0j\V<eNc7W[iQE7j=")n at 1h*>'6-ol2ohd
+%(<811h55c:;cekWWU]7tEb at p\I0_jrHu!E0U1lA=VZ at p<m>LL*rYF>c*6mdU/8]Zf.F3<*.ZrtKP.Z]?1_0:M)8t-9):CN#0irT\
+%+3"2KCA<%P`]9<%5f*]n4KIZP;RX`>;/n/XeiR<(F^F2rM!@5*.q2FR%&4#Q;0aHUch1BQ_!DNcWOFgSETQu,Vm<=E8+MAt=0+f&
+%^V&+egGoD8'fciVhU043i::OQ38[&[L;<%%e2TP14ub)Q$MCFQ>^B9Wl63fgMROpG/nD((7%so:4kW6/orq^#h at Enj^q#^L:d%W\
+%'15^gdA>b"4K!8Zf8h9>9%R]MU,Cl(BM-Ef5:O7("G0j-!c?368]#>q1_Rr<CM3*qiCV:i]E/&ar\8_. at l&)tEa,.Xb%>pY>B-l3
+%'EF_p4=L>P\h;hj`/T]n9GW'8]^!YCoX1K7>Lcgs at Y*F,!`$,8:]7S276_Aq9.l^Gh`4[I%:[fGP.u1;Ski+l(8&pmI8WT#[iB6G
+%-I7ku6Xk?eE=Ko6Pq->c;8>gk'"qLB)4$*BQ3G-K9Ypq[C:uI.JdB_S+b`u5^_BVjct8\hO3>kJ]V,Nd]3W`G;W8JXQ+7eTUT"aS
+%jYi6h]rZYJ+;)WDkkG;G at r#:8M"<]EcKR+q4S7+i:_$meXXRb$G[G6'qc(#I at n9GXO@d.RRpK\uo;>m]gq8$.C!jE)miWf"?lh70
+%A9p*.h"a`E_GjE7?jcW`U*3j5_Oi5'>#_IV<V+Tj::_u)P"s[2*VV2n6+=m5U([)B*kcWS,O[1%Re7HpCD4eJH)*:<j!+s;59Epb
+%S>q4AaEG$'_ad5;MHt#A\asdn;!1a]H66dmUP/h+Ch>_(!`uPfM+tjQXra`UlENJ/LNnCXn><$VaLgcV0Mu4IE'=(t,i:%gb!.TA
+%QbYNR$!<<8WkM6r1c.;O^XP-]jgcdbQG;$ra&=Mq at lagIladP]a.t at G?&I9L-3$!u,kgJe:<)\^pP_#<%*%D*[:JI^3i:(;U)P\k
+%4L+Y:=B$7K[0J;D at kM]7QFm^oPFIY_ZKqc5gY`Dq%K$Xi?Z:=W*5K"d2#aG4,qg!-aE=&CrH#sK0p:)abe(-=;Yh(CHS)k=*2-.(
+%,F:TD0kb]28POW+oiI>fT6>E>hb0Lu^iWCuUX33*%Q.OLL\6Wb)r=)gJ4WK!]>*$E?D`*F4XohG<uXr\V/L*>VZTJ1[ZS@$r3>=S
+%N2@$.F"2?&FTRiU3DBT)2Yhc97HLX&$0M<k.G-8mALX at +^[kS!)&)j9.[m/0<$j>H)P'q4A#PNm_4q:Sn4UX at 58*cm1?qmq;QBYP
+%2M?o+PI5n!0F\&/!VZ%jS/Kek>[V`_WGcg'^J,Pk9_$u0L<"l#)_IYS+d!rcj't;HfkS\t?pV5)F\+aqoJoq>YFRITpAi4&^^Jk&
+%,.T9hg_2/)O-P3aK9q_bRBiHY\M_/&KP(g/Z#j/078qnl=';G]CMr13(/.0)ZE*Gp<VGZeoUH3m+.g\^INlI#6:l1k9JU;<kVZ%1
+%53Hi"M^c3'"%S:c'(ViT_D/.QoF6[cdVd^)Wg1tV!X(`_B2(pC(PZfsml_t]8sWNo.J(GN^?k"g?DC\aQZGk3g;(UgQgbo,j^Sle
+%foWorL$8q\Y9fo..;-Y`@1N9's"c;2(FBZ-R02G:-sgo0nDh\hH'1!_iBs%-atW>jr$QfrY!/8>jh6hd/"H_a?#K5:9:sBk[nU4=
+%GA(cq8,c9 at TV/'lNR)R/)8p*hcZeh?ku(Tr,s,e9N$80ghgMY"jE0ebo/_<d;*"O#M?p5P/$=&a8.dt8 at 459sL\!JT^V?"RZpa-R
+%14W13RQKAXksC3b/Ob)JDYqt)UV,]a??=@A:_6[KH2^eRY:Sn$%Xk!L3u3fRqH,Gn-Xrs[)K*%[2$sEfU0%.I_0/:"Q,kV/C3;D]
+%Vp1dhUpOSP]Nir&hGiLYZBf+gI9Z:l4*S,U/Z:a_!;k)3T?%B9@==b^76WB,Z.u at lctXpa?_h',9o0u?iM at Yir!e0Ym0+h8Ysu at p
+%5$"Zflk2a`*:bU7I&$B:E2;d1o(@(ZNap]<8/Zk%W"%8*rhjAX'#fO7PB:4S+YV,o2/\qsL^QjUI^dcEi6Z@;[GNq&0dl\kf,-*p
+%LkU,H_'\fAOr&p+?V'8%4.3gRM=?L;"%eh0eT,5"<YCX<)\/dLliFmm4,JY!Snu,g?>.&si7(4#nU!<3GH0Ycj at 056f;On<:5lp$
+%-'defLr>lOF#UT+q,)JcGYXU3P%@4$)"p:nE;K7[B'3T3rmKpD9Dln?4dgi^6K33.8 at bse[GfKB*t#W84M<+uK>i]BheO:MK/;^9
+%LXT:%iSRnLjG/E?Qe,U$BtIGnplA#lBKgs"#AHG at Jtq"GlALkY_XVVlacRfPPhV=FE3)t at p&;:Ni8CFAVK4GSWB+r,DK at bKZUAP8
+%5Mt8AgHp.6$Vn4BDWXXbJb&;XX!H&[OA1-4"JkLk<jh(G&>e6G at F3d9@cj`"G+CJXH2+MKhRYq7Q_(,FX]mNng6"Ft%&D1EmaPs/
+%EEFY899ZN:/a+WVP[ooW:sL&lH at FqAOTAX@g<OW+Eme/gZi7b6Cs)A*Cj0b\ZhVQAUuiGU8NM)?2 at f8CkC*_9PE]c32k_UU]2*dM
+%O1 at k\@I=I7D4T$tIcHWc+%=_CKP?6M?f#)7?'nNcM@[E]Xg#?/9]R[mr2Cu%_sW5ojYV(V!Ulg;4jVEaTqRJVbO6BBFY<+$dEK(O
+%jAn>0pC-FIp_,b"js*bjP&./]Wrj7U/IbX;gAC`kZ7cs3\;1UVA`r:=(^?3H^R]?DCIN&HkB>P?IAb)"XceaX-pO4i='CL(SoQOZ
+%E#Ma0 at NR+VBsT.9r)ja?D_=W+X0='j9Ul31F)A5(]\c+3EdX)EOh_&B."X%hg?PL,)/,U%s#0E65BY2a]9:0_%V2/La%P4>KNJGQ
+%$)5B1gGJL_-KS- at b&ZF]aX75h,ZgG^mgDlgDIL8oD;(N;o#j2_f84riPu[Z?CDTWMm*OP)o!-)GLn?1mc>jj<nN!FsSamroBUOT0
+%(H(^[96*f"n][@Ae)H9amC(2l[*dXAfWh=YWi.1"&fb16F^N/W9^GL6"%QL)>:P$=;o+ZbJs0.GqHHR\gnA15q$$e)4-`IR-DtZk
+%hY`pklCE2RlJ2*OLe=5OOF=.tn$QbCIj-mcgs7[^:Ru^B'@ChTXXULfiDTu5G?WE[-Bn<SB4FLM8a2'pT)(_<B at fP\MNk\KZ@"b.
+%oCk<.h at _u,rZpqPYRa\,Pe]C7!ga96m%Q$^k.u<rF<(Y'D?7$;r3Welfj@&b0Lm6c9#pUm]!]Y"B.*AXUrZb+T[\;hS<`qJ!%ft"
+%l8\MWLrm4'?+_*=Umui6>6512[)is'nc<Y;k3&72T+:C5!4usm0$$AeORIT-)eN^C;^(H&^7'k)MIQ=eV[3VMep,e,":>.Tjiu6a
+%a<-$R9em)SejW5hf*A4MCL*0DY>q0E-":*&&tSuA4U(_5Olp:[EF\Q,^!G#upnET0]op-,$dpES%A8qX[f*J7R?.<A7?j!s&27pJ
+%"MCW6%>(nJfV\'=AY:<aURBSIP[=X\JY_T3^PY)Md1PFaMZSud@?[RBQY"'t[DtY-L at u2i4sONoc1t[bHXkoKK:NgOS!%N%$Y%l;
+%=4tA4F3:ibRC)CJPG1sh-:Et8:/9l[gt!LFZqe"*-H&_?8^9mVWOIWJ3njm2d4)qg?5A4f7K4<=W,/A8_VKemFWG`0$rd<3rcl(%
+%n4eYQ&*d3>d/H(,Ji>rbjjEPh7p).@(aHh^>3BEh4J4R%Vq'?)bu===K\X'^9#`<hWbm?K^LZ)saCr_ at h=S at q*2Fi+.W%P:q[8'M
+%g7\7<#5amD?=dVIPqS?1GU^W^N?-J"WTI^_`=sX)/FWF>I[-dF_Is:LS.)HIGf#]?[:`@o2Zoan:/t8'a\o3mId4(3j.+ at +]r[a,
+%@aQ?\^`(.b,A`PG at JBYXR^Y/hQ(!^?Y'*J>1K^t$>s)=%/(3ZFd1D5eqjC[<.2e_X&fa50\JT,=k=chUNFZC=b%Rn+)8;,(`d[Ke
+%;Tn-F@=+=$J^9IsQE.<<];7'nh!VN:j'fZXoq.sfTS[GUhQ)si_&[Hf2S;ZJ$U`qW-;sQU,Z?%0H6Ll31/B#HQ0>F9*c1X+hRPU9
+%C^D<mBXSr5KaH.b6qDTD_l1l.$#i#)SnI>c'4j*KC1X&I,fV#[2>JL*^Vo)pQ8YM7G,*u7lPs3b%`c:-l<9;m?ZW=uiBA1F>6%'Z
+%:hdbF8t>_E\GKL9#9VTKs+MrS at 8[[/^XEk`(H,S,OE8+;HOuH6\B^."n,]+,kK>'*7nW:7j7/?VV-6N48%)o)bLr&#M7,[$r?%@j
+%f4c`*>q$Bp2Y2th7MjO^>nKQ\+[=VP>pkp\e9!"OE;-K^N^/8Y$-fPBb#A[qen_`aaXMK]cEubXjgq_G8A88p,pkr(K`7,bK4(9$
+%nb8OP1N]i<)Eu>ef\3m-2<XbkaH at j1*7\oA#tV$46u[?sft4uDfVeJjYVhAeo^X;$geYF_k-F;P+>q>/PZUdd=dbd`"!;a#'YVc`
+%A@(=r-LRD'/TQ_IkIs7Taa73F`X!=h=C1+5]5Rc]9+WSBA`)OU_N^Mu@$@6S,g(2M]kn_>B>qs;3FGL%>BFa39nS[S/'][pYbi!]
+%nfgUj$tPe,o7p0T?B5:B6ZWk?pSCc&&@2ge#$#b/m&#u6m^ti+@'1q!H-rsC2k!B_<I3&afa4_7oT5*/gZ5"p at p:?pM**,T_(M%o
+%i-ba1Q.aRhQj,XuKo0+;Y1u#D#uPmrFdk8?<%Fc2G$mmHZXR1Lkus>5RTP$9"B at s6BDR^&-`A?,';7n/9]1TQLs`);^R.h]'?82(
+%pWZdR?nlcW*?QfOTY"`b?*p;b:'#i:?0a<Fa3qY4aj'E<!.D&uaL5V`_m+TWrt'dac<BDi5P^K1.U+)_&d6:Y:'^P`Rip5n20<.U
+%08lSnOOPo(*.\O2R[I3*)pTFWUeZ>[b#Ga##&a"dd0p9Of2o-=VZ*ng93G]ZUF"Y"JeCd"QE9Y at Jqo-@+"''5reE&4S6l9VDQPX3
+%iQeM#8s9i#J4WY-fkM"p,%%2gn$XDWVUic<P6[/5n^^a:]Je<X2spl'LZ`k6SC:6#KUcGjH3ZM=&mN)!\*.J$j\#&:VM^]&Kp<bP
+%88*g7XO!Boo/o9J*cYq/@csqcbMf/XM_gn6]Z]KAB25taj/iE at k<V+HH-)a*3Z\N<CEi1DIZS:/i,omik)W2hPP&*D2V4Sj_K#P]
+%K'*L%o&NrWal:?8G<2"2E)iSg+"5&0'Q)$3[hl>(F['_s.CeRs#H4oU407cq/\`#=k!h at r$[WFa4pQXb]=U_A^oC#PeSo)`Mc%FL
+%57?p*b+2GpX-')V#8p[Y?1">FN`p\59ODVi/uS(M7!ZCCq5iq5<_BJSH3tos$)'H4N;OemTHl[PpKSq40/^e-f/_%GoqE_D^&`\.
+%P37;B4'f78ErXEW7ZfrqldPt]:,LFh[7Ca%83q(SrU)K#![>J&*-tPQ"Q1T.P/^[j*l(D-8iu[ZB]YlbOH<D6)gRE=&(3r9>AZ^W
+%2>%&u:u/O?+L<>U.PN;$D_#M%dR.<$S7'd(mk8<&d<8gc7Zq?r=Qb]:.a@$/!qNi&S!AS>1siXZ&l&5:nD=WW!NP\jF,B+QVcjL^
+%c7)CY&<(XB0&!\"CA,8RHD+dACJc9%s0B=/)?37U;tFIa^-bbOX1>WZI-d1K>!M(=Eas'MkDB6k-NGYV0L+m_OZ_"3cM>C^9dUj:
+%Iq*B?4=N>_hh1TEd<V>=5I;0BD`-F=iT&j^o)P="hs[_/ar6)pI+(h=*6d-4'GEpj\=Kqu%+qi3]H0/0XCRV2">>H;1_m:-[AQ]b
+%dZi7e:1M#%QVBT%[7Km'O5/dg>:cG5^haq-Gnb&!FVsmoT.?ms3H\K&9m70$Ra`1-'h".JREVpm3h?*N^!ErXA+jg,egjtHgr^>W
+%#&3sQ)A5cXpi__r#5*$bXJ3+4UOiXZ6(.1$W!]?-Q)[nj-4V6dQr@#?le_5ip>,&*!q^`2CRpmqM&:LKj=BUf4=#Un+ at aY!e'L<u
+%NF,DFQ5b.fE@[=aS&07'rEp;^cf^Vs+:#@,gs7nYUYTOppMdSj-<c=Uem.a1'UTBRlgL>oRtJAneU7(YNY=q[&YaM1?18t2NXP?Y
+%0FM5DoFfBqMU<D'Ft9B'D@`SM9-821hhk/#&;YdS&h6h&Mpg at U77&&:;&LJ-<d9=M[q+p>Lc]">6T!"J!l)8XX[/U,>RrUt?*B72
+%6.LcQkJF=:A("7A>O')<r*Y82HYql4rK/@H;2]jSDne4ihV.gBAEk]d)W;BAf(tlGI$oSGb`tbLZu4/p#]Jb/rRI[]n:;6gKdhHP
+%MNmO.?ocVsX\'/VBr?fQ'IRiV9)cG?Hcs/G]T[LKlQt5].-4M.MO0%;A.o26Bh=g[7rJMQW'm<"YPU$Zl3P)6b?I1&XrUOZJo+'_
+%a0KBX4k&H[SuWe5F>tjhpush!-TRAlbRa at AC`Zl-q`?RoD<Q$f-sF>ga_1flgdk]2b>]t5Te4T0EYF&("*-it*2*?_#Fpb2f,7lT
+%-<"Oqf[B82JJ!3GDA)&>1\'K5S2f#LdY+;_k":"FCW@)K62F%[1WrL`nW<3;B(IoQm<Kh#-')CCK_`j+"d,Kbl0?solN_VnHZj62
+%SV-7DG=.^J5]K#>)0pMhf4XhAaCAT!XD'+*)kF#,WZ=N9,R((;:+RZ:TW,hF>cjGNDu$H66d9QK(m__74jTAr)2DDLb,H*=T at i&X
+%8SRuC2i`3'pe)Fr$t*Z^%f9I]+V5]ZE3PJmf#!84:2BFMkUGAkIB9EV((Mr'Xp*cKV`@#dRZAZbdWs0:8stjW](/1pq&]HZWOAC^
+%$K8_sF9WLn4B3lM\C;5oa>/Grrnr*K;(59DTk6u5d.q4QWuKM8Ya^rWSM@%nq`DDZa(c]d0]P(i1j7VP=%i+34.D"U+Tlq?Lra>1
+%+noHh^(=sK8e7 at td>Tf(M=f3S>H_,Akrl8S?Yg[A`c?&n@,LaFX`I9Aad-&!U)[HqXpAi0MF7h3^KgQeTD*!(mUn<PU)qd?"5BAK
+%'1GMY!EB,h=&tYe,M]q`ns*d3l!#ir at 1HG1h<)@ij:`Z(b%SG4&R=]VHtpZ:.2iLAmH3fH1-*MKZ*GY?;i;PZ8%)1^eBbiD-uJ6:
+%1SmfH0O*,Y at AMIQX.P)Rmg5ADNNCU"51O/#`f"U"Zi\6=hbc at r7oHU^5.3V1ml+rd)F&T,N305,+_4%<QGOffFq)i*F75TrLTM,6
+%qt/k=b312Uj&0"1rC\Km-i<SB-[;(7m++d]aSCBiPm`?G;N2[H,@^JBCMdrDIHWkfNsBV7GU3.!?r7,sC_WjhM"9(U5k at Ik$bH8K
+%5aTD$^#=jh\QK0K'[ML9pYAn,r6tcY=bQ1PChpGo2B1GO[i#ecb&W*;^oR]6>SE_U<T$WB_dj[neD;p3&#Z.0aHf>+rADRbVQt*g
+%$70o\]8/t#.pI'^1YF&Be?8*FRD0#8?Y*NL[00Y0h4NXO5)N&[e?dYJS]4pJVh8Nq-65'pPRn(Vo]n2gQn,E$boP$Md!ibVG`>p`
+%WWa2Fq;5,!of`-?[eaqnphAJYc(G3hF-WfmPbSXap3l1do8dF\;([@)!Fo:-c&m9$Ja51L3HoK_5r"4+a`(G*o[8rZcKWGkUn5A:
+%Tr#(Nedckq%*2rdgTretLbmKN0MY1(R`r7!_1JBD8A(gCT3JRt36C. at Bt5W/;:UkoB,coiqYHGe(E[n>3?Z,rJ_/3OU8 at N'a>_4C
+%FoP0]8c.a4ft0Q*_N3/".1-%P_pRe`V,gC"qlno2EWiOng)En&8A.9dS?CR:Tt1fU3E$lo>Y'F;''brrV3)uCN1>*[40dqn$jHR<
+%3Qg/Q$TXh.NW6!,Q>()?bLCl+NI#U=EdVoA:k<g7Ckmi]@:VfVcr!CCl^%pr/LC?ec?/@>d- at fh?/?$&"">m`I*)72c.ZS]R\sY0
+%ft__Y5b?4mC:-BS<<i&2BQN1l5o;=(FsQ54QPu=S='_6u2%e12i2/!MTs5A:)4B^aE*/rW7rFL9IBMm9b_1B1,pt:4eaD.'Kn/AU
+%.\`TKcITP+ at .LC?ASE%3gu3=H![3Ek"U2[3:.\.%ru`8JlbE-4'.)Pc8AP-_Iqq`-q7NB(r_?QJk;_\9rXjBr(4m`(aqj-!_)&/K
+%;eL'D[&*7h(nKdB2tb=7IblA>Ik!^!BNoh?FeZ;K+>-2=["gR%%7CtQSEW at F?I&FVCDqi$?D:\us#K0J>%:+DK&u5f;@,3@#!&3h
+%dUMP&8LiNu]j.H]\#nD/T#NXh*4;;CRb"!a%:!a1,\U,g%CeQA5Gem0.YukL(5+cMm_.Bl76>k_AVOg4ZTU5..5WbF8$!5oQneiU
+%a=RB7TW,\)'HqT`n:G\L4J>H[:m!E];NA\p+c?2=R6nR;"NP?OfF^k$]M^8GLD/$#,I=P+!EmOJWT5+*UP-29dF4C[U=T9GHTS%"
+%?7%gIfYGe95bsg,QXkfLWe`?o$qeanK$Y)`o1L*^&D-M88-p<Kq5U9_`:tUL8$AdDr'LW?l`qi1&J_MebI*I'It$.g=Q`CHU$DD(
+%+5O4Q'uZ8"?lLA0+"g`hp,pq]SS=BMI6)-B/:XIbdh at +k5<?XHK;C'"`LMJ%i93`TKa9356iLG>,fS:+DZ&Z.*:ZW*KNq^K8YPL7
+%A+imHqE7&+LjSrpKgDWtp<2d0#@]_\Z`hnaXaIQ8o)'BD5JV9U)e#QfnTQ7;(j"=j`qie:e;OHl%!M?66'lrOW?YWrXT>_dmIl4F
+%gqq%1J*q`&,QEVui'9k%]?3#+-%VW8"f$@#@3p;#j^1V!>&Sc1C/oPm<rKpRi2V4Po at nV,3,1]-R`M..H]$:KVYJSA^U-HpUZ\c@
+%Qa>"CVrP_a-5SFmA03uLG@]"T+&1i)CMDrsHR8IJ9][oSm43c^<_,N?Tp8o)]Bu3qHJ#Z%XJU$PYJCSqI.T?226bhoD%k<<^Q[2h
+%=Q]YgP;9'*Z4^(,YEH at Fl)hUR,Up$S:Z2A)>!:-B9ekBCVFADo[]MVMb;sbsA#3GXr84?gQqB.h/_,7*k^D/7(cj'r%snZ at n`t:Z
+%nckAm]90ka-t;7j(fMau4,E>emb:8Bk;]$5Rh2>r6]LKOR*7F(YF0^"8>='n8ql`D\@CZ)nNSDl1sOJY(1%@K8"`nh=d$+[Rn3[;
+%,,)MS08GD<oHRHW7'I0PKgqqs:HV#Sg69gLp#eGaL91'k=!4)n6Fp4QJ=@\PQS9%C*U#W=2!hj#hj+q?;p"fkaXO:[7(OX:Fs77*
+%?]_=nj at 8m`*.tlK8QT(+kRLjKLWu,[dKA9I^KcH4*phN$S+V<Q+C[f25N+6rdo+MXUqr1nfp at 16["MbF_i;.R77;`e<?f4e;We\S
+%lJ6S4_bsHC(&N/&.hMst.=m1p^6B61)Q]:T_rd`(q":q6fdX\6#-]6#htOTRH)cefeg4<.+*/RHr>p+X24mbmpN8*nn&S9R3Toaj
+%\VYI?NBR=9XOb=k$IjuQ/D^(`g!*Qs%Q4U+??\*O-#b1tl!sCZbs<4#cQNg1BeQBL at g[MS2jfjc%JkM%.GcX.mn)!X2fK]hH[^5^
+%M0^b/QUZ*)^.pikAt6+/QKFPHctes-bo.)1fiqQc):<K.cXVGA/R^s^cQcMtV:^6B:8O!InjtlBqUCGW61BAehDYVX9ZmOkM)!;(
+%6&MQFV3?m:p:YLO<Q[(#aa"3Pb9n,jEC+:nHn]ttE=,]`)nJW\Q'd.Q8E,eqbm<C_g at VB%Y3e!R=Kr^0>05_C[V/g<:=Cm<o-l;T
+%^phgEH)VH_Ol<TM`]Q>MdGjchbEoffX9p1i=ps,W&s;aDU"h]b&Er86$>g6R$\1C[EL9[/)CV$fmp%)"#$+g!3,7CN4fN8.aO2uX
+%=E!@f-T2,&?B+I\1[r3<T\Lt]UDt`<?>UDhX^'gfrB6Xe;]`FpTX?6/YP5<QPb/n'U%^6Fc6q*nVC-Yc;YEq*nk"LZo)=Jik+`)=
+%[)!!AY1mmTBT]B?c4W`.;8p0b;D8mE8smhR!+[n1$7X<B][UTJhXbI-H0IWnGG6<"gi;'E:JS]O)#*j"2gS"a0h:L9D at Dd\,OWC9
+%FIA#G?."5RPOP1=RN"6UN?64mVS'"mqgkki.EB_a)AH\WBFH.C2rN38lWp at o7K+%`")Y#oCm/)V8+#B;;a[,ASe1P;44pHfo\;5a
+%e[nbA,L?6\AVToVLRZ&Inmk`Q0q8cSVb9,`%7HsZSL4_Wn,20/Je7!jc]e_])l[Z?FN4IH(T-9he1uLTpn#7C1H_&d\OZqglV0IV
+%]HoE%^pu_p`,R:G2GNb;5AgJY)3fAB;jog$1R3>&?:m&jE^S,(YGO!Wd^hPn)sr&X6/W-<'&]qE%h8CToIlV2l1&ZBmSb$1jjZDi
+%"-pO2.qoWaMJd8Y$0n7K at R+-Y;4f7O"q/3[l^Asa&Cu2#;RPGIj4frKgUg.AZb7eE8RL3DWt.*b!`k39^oWhi9W&3)oOEOH&5,cG
+%INFsg9iL,A^8e`t8VJT,3h_s's#DHU.]*Y+YQ^[gMUZ6O2teh's&E85Tmlo[A[rRq'I at Jn"H:%(d)j at PVs&d=ad.2f)>U/&_V-t?
+%AUatR4XHb=k)sf0E\Rf9`JW at Fa*TYr-eX?SESadfAmbY+^?NXbP&[/a1M.WQXaTQ)6^j"!@r at u?dDYLk(cdZ`e32d.BgH4kT`T7c
+%I<oh0k5'9JM?Sn[1o.V+aD9Kl*OjsMl>S*Ac<]q%YHKafl&sc"c'tOs\MBt&csNd]eKa&\B_&+lQiKG0onA.&.hqbf;G%3$1P-#d
+%9BiJu>_?7","NCW],jL:Q\G]?"?Kk9Wa2_Dotd=UD'8I:+\Er?"$/*U^K;G26n:EmcO0'DO&pJIEXW$L/"t3%Y'Ja3S&l;6`#!H=
+%&p+HqRP'LVb<o.4<dT3Q`b!;RXj,R3?&6fKWHAj%NY at t_=rOF'0*)fh_<`nSAf>ca%MMQcVSNC`l](N;E3JQ$F$F80\L&kiaK*Ju
+%jZcH`!hA.\Wl-07D)d.C"T+U]Dq7&C4P)C1Megt#NQbs1YD!F)8Uq3Ja.M)b/?1cbnN;t^aA-oq#&!+.3NAXTrFmXu:So;+P at WV3
+%D^ulH%S8q2I<Fhdej:-5-ANZ(QcG:&oIG!oB3X!aEAaX;]:FS?c_<e5Z!u`BI**RY*qUG_YD)6PIo*G7.gqEUK%%S!+Go\7:Y6N*
+%"ccL6R&,7L8kQC:O.1fB;etLP]md/FE'd>sDmaFR9'j8 at 7d,/H(s^d3]mVh$'@K\*PqdF54+2hi9NXkYb5?^s*a&#ja3o!c@,b at 8
+%Ob at V<`)&e]h`C'/"s3RmH"!WQ\J6PkBo4+F6_l]*-SnDRX<c%k$B]rT_nk2\I'jIDNjGes7Y%B,,p_;Fp4h%:1A;QG6P3f?Xm=KS
+%fl,R_?l]-cF/PhGkGRF+[lbL"`0r__V^YIsaoX[h<\rXX[4M+I1D8=keBiY:./[@mKQ7=&h_)@=.J2sHV>.M!U*"_-1NsJ6A+#k)
+%!K42]TRBTfc+Y[T(THtq)EY;=+/6jm^BY[+\]aWA]k,k>caiP4`#!BS1 at 2_G,-AkA\Om<h"YVc2X<;T6Br7/S[PZ8X&%Yd3DX_nG
+%]>Gd?+$Kj(?KDru3h&ZF.gJXUc)j-*-T=o9]O*Q38\O8]r[q;Q9m.ijjDC^^a=UisF/6;aF/5L>an!A*I=!NV,S8<4Y':qCF/K]N
+%6!`m>4gO6?#ElNTfZd8O/D\7VQ_3$1jaH8R-WN+MPBY6#NYbb4>YDc/HiYM>Pr[cB;^(B@@I[5:h1#S&mD]G>VWfT8a[+88?i`Vk
+%j1S:(QR)WUY2s?H"ZTP7%X3ATS_1"@5*n/D-O4Lt",&e&f?q at gd(N?Q5`8:G_t`ZV=Qc4;"akbt(5 at K`ie99h+nK,gOZ92BT?dP"
+%[1k+ZCP9=TZU[+e_ at q]"e2dMb>Dfd[p+7/\116mMb-6c,?Ni-n at 2NOYQACV"_W7WNC4/ounh-ibKUPk!3;&d&+&`42Ou\PkXjH$=
+%N;($8k:,&$_%aX'Z9tTR]'WZH^3db22_%LX'V'X1*sQ0o%EJEW`EJ(N,cbj=-p<>Km.!'B&3\6S`K'"]L>#Kc4*&C/l3hbp$2U<j
+%cA.H5K([$Ol;ZG^V.utYGC[D#3r;KNf7LTr$oC79mFD?\#T,e[\oVc::B51Z9C>&Nn;*+:25,&lr"L&-EGd4JqBoYDBKsPK;au4P
+%P&&u=H&W5@>B#(0BMNB<orA=cUQ\K^.2f"E&b0u+2=K/h.e+XHBr<,A\k,sU2`Sq<KH7&ON9!9:hn(2=[D+9n37oqD4c!ao1U[N`
+%3%XOcZDo'pOs%W=]tT_42\+4k3@,VS?>Z*+B65q84Vo.:Db:[j\F8mlc-=r%^, at m84,F%I],MjUS>0F8Vo at n<',.3T$'$gcSifQm
+%dP_i;"57i+nflBW?G\?V#bPDCPXcS^M0jN3CC^)Jhd%);?st^8 at T/h"`[RN`0]?e\OR'7<;c)Q`iX/NVf.<R!>:68HQ,p`n;rOQ%
+%b]4F)F9Z[UjH;S`1-]n=$-4,JV\J&N$f&C*qMSH;M^8A_M[L\rPXGh\et*As-U/9tDR4 at GT%Gd/%E+R5LBl;L-KdIrAiNBa8FG],
+%B5V2R,jht\`@%U.%KP-\pdKNZP2i2pnd#aCc^$f*(F7o!S"h,:MQ'08P=^%(!MGOj!bL$pJeosreNbM.S&G_i7eZC&F'<TI6'Acu
+%PhR>TZII"BK#o<7EcZE+afUo!1J*2P:6!#oJ9cE]=@,`D,pL=cr1&corS#mBo(Zfc\6Kg-P4)%]T9AN8jMH7)YfD8E7nS>"*t*Yu
+%Gr[Q)@:$ss2+ONYJ6s);Lo3*%gjE$.ZF\M1i_ at +6S[5c%;:cXF+/saJ@'e)/2pk61%)K"7Z(3J,jm&@Z@]cou.;ao6(U\1:K.kK`
+%C/Q6bS6rFjh_t_^hq!8^J`X$\P6fK(#p1LT*)A9 at +m1WF1]JpNgWKEO8Br at _PouAXf=%"J2/4D\`@Bsd/6Gg_Ds5*X0OR<f`BjHY
+%J_3rCn$i:Z7s$/IP)_O,r%/<1"S8qq1X1*F>Z'^l3'(AZkX0SA3(%,sd7OIG0m2uIDROtk2L\C$%R]`7.NOZh6SpqS'W#gYbY7-q
+%UEDe&oMP>-`B+.L4,s3/$LI:-j[4V,\O!Og`U_)]^r'qs\mY3>%#11\6/Q)mjm4i at CeMdKP5`F"(S?>"M>/2SI:u#-iWZNnqo4&h
+%BhU7]@Ku7G4P10HmeL5Mi;fH/6OrUZl=E9B+YqHqpEMWg]h+^So!C`65$p6]3$816qp"?Y>upW,GZ-g9GlQko9KL20j7os?=]e&P
+%TdT'VD;L>B"*Ki at R24'.J_QS2glqo)P?HQ3krGVWh(1,h0as.Vo9KJWcUfF5DNfucgccCk77EVLT&V?U;s6dBnM$6t at M8@crF0PB
+%L`<6747=g^2'F0cAMjR;X?F:4T$CJ!a13^KG.Q;`j/7Rn-'TofP#U)HIX at +B9u/5Xi`1L(kR_FL(M4h'^B at PrlGh,q#3^G59^5%*
+%A\QABY%OA%C-hA?kmN&[LZFVrkh_C0$7sj>\5%O8a+P.S^JC2imk'(ic*98^r4,)[amdNHDUgk[lPZS(;^2M"IORK97F.di'R4CK
+%oN^^Ve<Xk>>a*StQ_`pgF8;1DMKQ<@E,6nB68>P:<%P]Zbb8'aZC"pak%tYg,N4tJBOrG4NA)@YP.gR'/eCj&*.#VqmeL]bF/,!/
+%E*)f129nmgHs,W,U,&2c+nPNN_]m'"S&4g1WYL??Kcu(@CY_ZG\a"Sb4s\[W/!lkRAXd9S82\6ECT>)F^?9+ig&d'g`f`Z%n62iX
+%c*'h5)YB1j>c$`>M#str>+jib&38A;F8&i.QK3_WZ=@B?R at AN_``i,A"*ng5RMS_=LdDq."VZg0eA7)5gQ"uuk9<n_44.AugJ=[f
+%ak12UgGGZ_rq&tW\2UrH-RFgFC9)VM)o)!oZ%'Bp7,*@J^YF[Yc8F!4iMQo0;ZkQ6UMo`ugLoBDAIT8FDG!@p-G]g/:Er?db/PK$
+%WpNU+%&V45g/od8p%[d$=>(rna4C2XX>oe0/8sQ8-aqbIau.=G81Atmq\`b49q_-5ojnOe)RhuU+hA)HE1Z[k*g[ko4>&+2j9BB4
+%6\;^<R'>7=Tf:n6'q0qP7oO:%iZRDe at 9)"54.&1%k;k]4!UKo(Cu"hP6)AGWQ(EAilZ1d[joF;''DqZgMg,h2o)'p]dtrG]g=A9j
+%^[GN]9LA&.k at o'R;=(i!WK0pnZD(Z=Lc=')B;6`WrIKr-Q*^g5aHaL#c$d/:A68?an%$Ak<1A]%gL$hjilaApfd(U^KLT2=adJn9
+%HVjnnCkLT&c9qOg<Cqd$K9&Laka\c`j\!OsDF)b\W4_a6;s\RF%4H>n2F>NtrH at 0b27SH\(YK'l:3;"ZDHUngqtS8`_<K/&^"0nP
+%BZdX=Hj[&N=mT/W8^aZJkm^t]6*\T3atT)j]T(-'@O6-s5@>Mu<GU)0,)H+e)S8iQ".J-3n!'Q>@tCHhKa.;,>&Nf1$dRh.gsH+f
+%4UJp6+t#6M4./#Bb*Os'!]+D;-PeA6%FQ3k$B>'FI?`ggK9R3*Qru1F1S(W0bE!pO+Sp$R=a5C%]pAR'6 at a!DT#%fH#d at W[)u8sa
+%h at la.0uY[L5VT!J!CjS^9Wf$(K21`2%HP5;/15T_a526]J>qkVPNYKR5O>,G<0e?><b"TsfurR6Ea@\LQ\.DZKktej?$:.::Y at q>
+%EcY#`j0(SqJ9X7U<*Cnn+d":o7tTlf?m*fkf[E`>:NX3;2ni65HNM4QJRb4k'BH16e:K>\>D,S`bO!q.+"VItlgS;G3>t,:^g4"D
+%\m'l_M1RR at D!e6igem-A,/lS-Ms]AO*h1r>Ku)g!4OMegp'`ciY^51]Q,7=.F2GmpO=0[FB60i+^H$KukgMar>#"M at T8gV%W@@If
+%A"OsQq=T;9Q&ahHB^+O0r^t_!3=5ER>O1b<)YSUT#*"eg`h5N"#"$H-U!Z9KZ*9nCo at iat-oi3HE*c),/rXQ8*\3PFOi*W7:9$&;
+%h,[s'(piU2g>oh$8=\eI$Xo!!fYFGOkoV1O/pB)655Bi/W"?%Lj\S"lG'",`d at f/t8sKHbm=b&Np7FM(91,Yj$f7>Tl$4*#X=qVF
+%U-K2lDL?;a-b&Od\d8Pj0$g+>\\&Yal*s$>'Ab'bO3cZ).bpM9[f&lrh3fNt5N%V*XK:#;[cr@]qErnDFBZdB8uMl*g<eV"A4(nl
+%2]P[Cs-4[5:I*1NjV[[Sc7bg$Yo[su+$fS7f.l*_"plpjP)5mp]X1I5-J-5>?]$*kfK_chbN6$k2qYD]7c3";P7Vfh:Q39Mk;WUs
+%(ID'6,d,\nA[mFKE2RiE8/U9FZ(#2Y;*<h7dgZA8o-K#_`sp>"Vaq,1IZhjVHAb)/>>HZOOI^;Kh(rqHf"!#j-Ul9s:3oOWaL5=)
+%qd-a!QR*4l^F(DLn3dX;T/2k.1S(cTpS"na7Lqo-$nm;&Q5T"4*`I,&cN#+R-obYol&_5g2.%'<2 at G#<h8%RNi4M%&8q?l%(Ns86
+%\L=Z>>=i$O#FPR`e/QDKE\EPCMG6ZFM5u3#Y!E,nXWL`aUE%d?'+=ReZ5U0NY[T>.#5t.KjBfICLE+G5Ue2EhE4qQuF8Hf825+t<
+%Pnk=$;lqX+*G*>Y@$^\eNm5VG]M]M\a"*=r7:p'MG`Z"Do:!j:BkUVQ$;q at qma(Em$Z^!CjQA22loc\Fs08.e+H2P3d*5&,m_t)n
+%[a;CE!mJD404MA4Vm.!J/[i8seNWjkGlaJ9AR\S4%Cd'%47ciEFO+.qWH6f@(s7eqjW)++;7C$FeD$`i_\u=pq"fu/qjdEQ]_e`E
+%55*"/@W9<5X";T!dnZuAFBuu.Xmb$h[, at cpQfgY3iVe3+b"Wh#4<0LM$m'^"lhk!^ZXGs!9_Loa at H;!f8_38K2Y?@[&2cHX!XUM!
+%PpA$f7Z54jC2^K<0+MHF#3=G4%^MmAHuglQ7i9[A*&KuH.\#%3:i3BZ#,GXEn1bu/baoIa!tKD&!K,rn=/ntArj]:"g3,7=ZeVU`
+%Wr-$a't=Np0"Y`L*%'ja*nTkcb at J'W<,8X^N-CpJ)m(+:2u/jf"l)QbP;)_SPu#j;,@<f!;uaG3A%.,u-NE[i9r:Gc\j2>f"5C1,
+%QnIQ2[bM?:r.2<"2NFa>=a"V$Mf3B_)XlV,HEUFB9X19T%5t*WJA+!kQalV-cihS[LgX'lVbmoa9;XHm9[+);IX,11/T=TZ/.[,7
+%3S+5oJ(Y=M4&:HW;];R at hlmO`-<U^"7fA7Idi`KXm>F+ at G,>cdODEL>=p8`b)Z5j>GjW*SB*iJ0:OC/"SA?+\$\H-3>)e;Tn]k&]
+%=VcL'i%nbXfV2'd3"oFiYYRRD--NSc]M"8M0tV/C+;_/_>nU&)dUf)5I(0l<Gq)tGTG6[0k7sM1lu;JfD"0GG`=9;.b\#j.Y*,(E
+%;,F7ub=]^K\Y&[?i;cfDS[Va5<,t+:7H`nn(n[(>;lpSg at a<*=\L';u$REo"B)aQF#^PRhEW$;pYu7fF[bVD2hPl;cm6q+f$r0tY
+%#AqQ_1H(jedI\3%R"'ifQ at e-@r*ONn(>@[sX,>>JBC%hCT\OX:;@AlX?^<6E5em5Q"I>9%@nCr[C36:9,l'AjoE-W%e>potI(?9>
+%ZK27-)Sj#]O;*`)A7jP6rDP6GN6(Uio#bb&pcY"H2B-Q[)u,[tMbYiGDp#A+$mXt>psD9Pi('?8o9G`\LFcZ:q!sE$Ai:)p7]jd1
+%rD*$r at dK#hWB$)=PES1^!*h]B;A\n3Mp/N+=31k+Zb$:aIL2&_^0D/I9jqct!3BL6P4cF7dBuaq0"?'HENFHFnr.DsIDeC/j2AJl
+%86_KOT:X%5pOq=`'U[!203iSp.t(XbWgf''&(0>fS;FO&\dZ,IP<_ at bWQEGh7Yl'2QpPfj+cbP\^&u=h]f:_](tQMA6_H>QX41MX
+%4AVZb2A[qmW_"o^"Au6)[c<]HM[1h]kZbelXit/8#4DmlT,bKml-Uot0`BeiC;K!q\"R)k_CT\HI4h'iPfZnD,<4kjcl."If[S!c
+%as1.=0\C1ER", at Bm3lrK%>]0Vh$TdRKV^rF4HsWA7#[WK"mh9<\OacJlb.++nCu#MfNP&Wc?p1.ia at mp0t0/^3e0P>\D'WjfRob]
+%B=XOXP,\45<Aq6nOASq6lpReLD*2C+PXJd3:.>eAc6P:U_pnpFds"QpXHlLV\5$Mq7o:c?&+'Jee\%PGM].XWJhm3"A at M1/"66 at u
+%/rcd(*d[l^/oC1NG.bhfmsV/J./#DK`j2?I7<n-p)?3U+%"PkOraCWF]$]bGe at 9"MC3q'Krme?/QfOOCJlnS.F+$7TV?H_qZ_5R.
+%MdWbQjbf2YB(t41+;_D/@qi,I,?ap+VXNuFo8TqE!\&r<9\FmS4slsP75Xm?>,4DG3-AIf.CU"*WN at +G_PXLp'cHap<i2cfU3SBE
+%1a();8Pu%i,3`d6#mCPHWR$QL2PeG")iu'oKlH<13>1_\a3?]U*jTeV--rI7V'nTDTVHA-INAg:qsjiH/cW8Y`t>]XSg]tRF9jX9
+%!CQM73Hgsae&'\&j!=297c at d<#I2$K&V at A,"-LSZZf<a32o5&.op0`s>XAX$\_Y2DYc*aH!q0fk-_IO:Y[kb2p!9N87m8S]mpft,
+%PPq<D]9?opO_R*_.G']a;F53ZDgn%!NE4hYEC at sK?u80%F1&CFTW/uW7X<Eh$E.;AINHV.QI8?sg-CW<8o?%Tf"2oLJ0)(^4NV!A
+%PT\lM6r5hdDgmjJ;ENdS9aBF/Y*ld&2)^A:C[c";^K3#JM?RTVGtWrWbLLkZ@;Z:3n5[W#X9\.24B%`cLlHh/]28PiYUAui?AEm9
+%*7n-mpIumaO4kX,o`[E+-,>Y-X^uoTiEu3j.sr$D7PTtF"8[.gb#B4h+?\OFm,i`!bDa2b?lm+QLh-0@!G15Hpt(m=NdaN`K_p?X
+%#U8uQ+D=Uk*4IM2TmN/l&\<<e:Zk?bdupJ$3.8 at P]#)R9T+i:/T+nr$7jXM<7T*5`TV7:TYYD)^/Y*>tKfKt5gP0%EY5rn:#=9dZ
+%C^E:[BlBKaKC,>36>LH(r*rZ#r3!#:VLS%b1[57Yr_-Q>TpqZHC(q"Ml:PUCVtuLue&=Q.C@@qu-F=@e,^k(G+kXM+CQOWei(VeH
+%^0V:o;IO=T5`-7k)E^Ua;p"N#rI?i)6$f53fZ^AkM7>p/,Dh"t0\"hn)C?uc2Rb8cc%P=HY7j(`9T\S>\GPik2f??j4deCaD0qOA
+%0=fOh2t*)$`2V?Xm^)u"V`/Y6Em8hJ"ArC#\KGW*F>&:-42EZ0 at 89&SeFt7c"*'!Xm76-5U[)_Ll_JOVP[plFHk_j,^QkSG;]g:%
+%<:2s8QjGZ2&g."hS],$aBi'8Rp57 at YND?2on7PN*mG,>I-0Wp#UikA,I);]3qV0$mQ#LuYVqoU-M(HL/W'UA%:MKFVn*a^WP%#\u
+%.Gp.Q:1,NK5l2UJVQ4QDE0gV?iAEq%OPcn>[83>kSc"`'2cBE1q.lE_Y81:X$?(jiC.Fh_B4>*i14eqf^jJ(aVL:LNR"u0hmSq-H
+%J(T-?mIqmD&`#IL[&"V2nkbP)c!W;`*f5##..4Y03S8*gba<'c-XRtFo,cQ7<#_Im/MGt_h50tkSLpDZPb#^>b*Hk]mP/Y>dj.]Y
+%k'PN\?jg<jj:&-G'CY=8)8k@%9_/i7O7("6IFC#6Q=.tUdU[bAb4bQdb>:+j5W8%O_5aPr"uRgol,-EZ73 at G=?m&25P)^4O1\5/[
+%Y>kB at ig\bY6Q[TbMJ;"oABr?Uh?a;i;l/JGJJ'Z%UQSjp#fk^SR5"lDf%&B%kUB&M.H'h#/la)g4%lQN$0"QEQ[VHiY9heZ[+C>E
+%MJX8:F0Ll73[JXY<&p at hD!Y-9`+X9,b%1VlD8o5p,2b6&bA0gGOZL]Qa\a_u-;7_VC-ttQQ3X\Z2!91WGp>P:a:qdS(j#'pY&1IH
+%r^Ld1P(m+M^+_VOF"Eg-.?jA1#J4.QM:Wg>2!hBkO6,o:RGoe#\!Ba3i3L>A,oEd<.n8ai*4'8D.?/H=o.4s;rSoBEkPm&X$[54S
+%=^gqO-(8a?,6pU*YfVA._3qYqgIGbD(ANo(;KLp at c:3%ObuaI992co;n^E^f)TsFD<\mlW:Xtt#N*K9oPLL&-r629N60DFS!PM<3
+%:)frKPH?EF$V-R at k_9>e<dF_92#L5lO,[<;kSU_,kS0J,Dui]"A?46*6#m2(;ZJ]tMeKEf[bn]SfPJcbRXpMrOkBR9B_Kt[2S4K*
+%2*\i-Yi)%i)g2$6/FsEt`Ok%)P$1_D1IYh/O#t_a45g at c"kmbD9rkR>]\3nF\QmJl-fB?Lh,1SC&UZY5g$umj^2gdUCqi0gX=6KZ
+%E=s2iXa%n at WsqKaEa$"[`-P2T%Z.s0`M%/TR&%)7!C2\R=5^*UqZs!q4ST\4-uGh-jhoX])tF(\8hI2Q+SHpS'YnZgMi8$Hf(i%c
+%C+XsPX"?S7$]AJn'0Zp".RP07`5AJePk]QH12C.1\Z9$@k]NfSJPoo&F&7Y)^F?;ur,N[Z[60>mWbC\,T`nB`ht[Fr'"PPQO@,ca
+%2HMs`e`=Jc3bpC;opQ_M?ZS#KHS*+$C&:M6B1]\?d?]<1D-/mO+)<B&$/:sj6(NB3_;I<"We,^H-2,B*%LJK&8R1AsE*T,M<W+#X
+%)@3J+'4?K3cq,F?Y!bN>>9$A&WnEi]HW`A?H-T at aLM?D0(0,^uaH:Pi^0i1;];OM8JgaR.kV?A%fT`2E-Bi">6(.K&G$&(^s6GS!
+%rFt8"DRGO\p=ODeX_QoKlCR.s0uto2GKl0IN5,$UWpr;,l_#[uXSAn6O'7MA]r3u0*i=ei."jbQB;Mu'KR!%*>m\dZ$j$;7\c.<H
+%q;(;CT.&I^.9mXATDS11K-jm<8hqT=ghWoP;LTV(XO.9&-O%G7ZN3^D6NfV[>^WAX3rF`PCNueu?2T'C%b0l0GheOZf)O4u at K3
+%CRGO(pTkq=?rGMYr,%)TR5'*S\_q6QN<G^mm7+7j<[$]K_mR<MmB$oi6kTO0L5W\%2Q[J\mdp>cHWCJ;+Rc#$Ab*O9CQ^JNG%CH4
+%a+7CM0$>"'&O3!!27GP0oO5a7Aa5%UDNjLp4_c2F$)MR$7deNZ[(U/*<Xj;U-e'7DUcbnGMNa=p4lodZ9(hACY*U)k\gc_Q'Yiis
+%l,uu599k\BkPI0,:b(\[fU_11bemk?lU_R[6$.(J9O,h>c<48I!A<&kDksOFLpZ at N1INVM>L?qZc<g2r;5!!:/"i5&L8b_2`MU>9
+%fCD*>8+P$8n!?:qZ((6inePC:pV3W&P+o\6MOpqu+`),G"V at AQ;<0knQHO0Q&_r!$D11W]&IE1U]enn_]sdk"Q"LbDa?LgK0A4ZH
+%l:LP+V\;W6K\@ij(<\1smc;=h'GgkFQ]!CmPt&lZr1T+p#PbZl;)q>o'^p33PDZ5T>"XfmJ<qMBLZIY'O)@PjRk>uN@"+-m443gk
+%Me9Vlg7>Yf&J[-Fc9^VE,]i%tWps6E]FrTlIIt@#:sp9-[ulS!AVns%qkc`edStOoA6?pc8>@!%Q1TO'.Rtt&'ENC.Nc/J`Gu1Nt
+%P./c%8E[m7-W_Wb\RI%*M,^nqD,1k<.etq:gtp1/&2-uES^3jS8\elES\nc!5<8K/h;.)gchA7"7Y*Q1n!Z^q8MZ#a4%HW2b0r[$
+%iA0=$^+47N<ib&.#r:`D.*WQu.UMC+hPj`qdlKr at W.THops=2t$ToiP3lg5F>cr3.!kU@*@O<s*R9lS5]W"0fk42m:k2lfXW[RFt
+%oDK==05_"@KsOK9_?o9TE`MA)2m-\Ih19#a+W*AiF=$FCQgsA)jQQf5r78:^JbdD9CWO%nm^If%4QFDK[Vq*eQPu;T6fRI<nK"S%
+%<K5F_$6[0Zi7OOr!r6R]Zd%'_4Amj\\lf[5mu2+oh'GR.hqKqX[@dS96-Rm(%57&j8?ir=^i(r`BO&]OGC%)s-)m[$A]Va>iU[.L
+%k-%h..T:@W02l<GI1Iq$S::XgDXiZ,`6"aWDrh3/brS%</(G^@[JEVfG at p0f?:e.#&g(lXcjolc1d5<VF']1]M"q0GY?]%WZ&P'<
+%$)XkMF\qcL<<GT?]VVX%&!XT at NVR$46Or8-,tUY'B3ltkp<?t$h>ik[#i<MO3[GVs=jji0cB!T?Vd9SX84"$dFG]`b:uuPbU]eJM
+%phG4%'O?o9Y%&(S:?m[#EZN!EQ,Rp^;"EIu=C3sqnWl\i7!3=h7QC#Li]<L^"aun!e<QGI$5AOtGSVg>6/EQ44)s8R&C3GapVOCe
+%8IP:qj_2q=^u3V<U<BsV=ZM2P't,;nC6JDM)OVCH63W,s+#iNrGaZl(X79Jm*1J^%bN$g=-YSG>p%24S<94RSkk&mIcst<TA;u'+
+%5I,@=%BnhjlL0"IV!Fi1I+CIj]oZeb]MZ]%;JWs$<rueAIm?]%AEo*O[^+WO7FCX;!3rX,C$*,[n#/6'9^4q!SJq4cZU(l*C59YN
+%<BtNYPsB\s78X^ri*DT*D4B0]=D=3OFl`#IM>[ZO>Ae_l+oF<Dol<LHhVLIcj4(%t$I?hRPu68+P`f"8PMT504j,KuUsI/0RD/43
+%\BQ`08FiNN2B=6\T=jcNI7XKL_Tem(IF)Yfc_f6C\Ps6LCdG_/4Pr[MPF$r(537ZS2E"iG_S_Ehp73=j!*p&Y(B5JM`k;;$\L0[R
+%B2j2:C,hbK:Jb3h%%Tek!i-:$bT*RK^8Q9h%ffC7#[""aEFX+]?e'0si3OO3@\]7aE?p"1GhZGOcTP1Z,\KkrZ()88#^0u]CBou&
+%/rqHH.mG1=6ai-JMHT+":7$09b%fLU=ntZu3gU!u+lT3FnkK4I(s$!#r4-Hh"<E[(-@*H$kAcV$$Z%[,^!W5p=a)#t*RKW%T20o_
+%G:t-g^MS<Rpp at V\.=W"bK!?#^Q8>tFJNN$Z at .6r]1Js"F)c'*A=LXJ5d.Ajb6.WUA`o5(SK\/$NXo*B>cG`M^peoMC]<dbh\2(aZ
+%1QLY0!df`)1tnGN1AsO6+*MEB`e2dmf?%o=pUEr2CkKJ"XQ4dBo=CWHjB- at P,di)%>jg(NJ.-D2\Udk_ceMfsVl(2-3#.^;E:Pk!
+%_"Y[o1bn"8_8^IB'V9)9'eA_cCP"i*=UY[Djn[/BdAPCdW<IV0rE!_E&%;Ic0Rb0#;)_54HqO<Je+!2:X7WZRHHVZ'F:F1T.1GbQ
+%bmUa&l*oaSCpk`a:/TJD7,//n%I2SG_V[s+4sd9FE)1o6=U;OKnm_V9/N2p>XtPZoD=Z>2ht.R4iaHKJ`=sFCY=s>2R$\Kf_!g%R
+%k..BdcgNjjSj5n[V:0MaY+O.I;t<SdOe7`X-HVk8D$l$60d6"OcjkPW%rj-3l6bkFcYC-h`tcgIhVH;&q]k"%gW<,:&NiKha*WN@
+%<qJ1s[f$f)T=O/%!7#K"Agf1,C2N!uKUb;]_!<Rrrd1Q5$,D`\Q>2fJd&4miP*U=+pQW, at 1(DO+b5lq3R6hB8BJX!f+B-"LE,l)h
+%>`igm)be#f2f8aLP-(+FJMH?GDnNO:PE[:P9j<d#f?Qoq at UmU4_8$/s_*/`Y,(\G?6MoW'fl\Z?%c_5#)P,B33VoF'Y8f9J);Rn&
+%G1*N*''*\RAkQqe?J2:Wd>QpiXlFsO\j+<_pjag-'9#.br:hc>+V:, at .R":QFR?!R!'\m;GJW/@97a3*W+GcV/(q9#TNdLUI1&.G
+%lESYrLnCqf65<R$(dMk*(<\oMZRqR[45cX]pRH7r4+1b2Y;r'Do;ML<blEQ\DGjn\<(a%VS#\t==([)`o41Y"i6QhSXX0a73WJi\
+%pah_9mTbGp.CJUn,0^^_h2"E=-9F[]!$dYJ8m8=[7,cZ9:_u5sKV-[r$n/hATD_;QrcPZLm,QfaYbeJ1/Tthd!Z$F7D(><ugTbK5
+%#9E2%MPPbF$G`Sh38-5Co1AX[E[1.4PFRX&.apUDXL[A[Jjpg[\oIFA@"#,pY(aZ(C?\O at c,\Z at a*h`.2YD&J)B__8n(QIIQeX>C
+%0lY=1#DRp3 at I=P])0<.D,@/>3GH>l=HhJHRA,l>%07fV[@?-P/0:=-nJ^iLBm:]4.OSBH9jbsu1XsEt]NDXs!,(3[,:QXlaKooo@
+%r%;lOe/!($o8-*M at 3s6tWj69QUkYrc?H8\VWhC"(E3!RJ3!0Hn([Kb61/2qDhde"0+(`9"@TR*)bGDuY7d]<UKh/2qYjZV)%QYmg
+%XMuSB_i_ets"';0i09f#ml`S'&$K\@lM\uf?gbS4KX^PaDOVP'FT^!_!u4eH:?1sCc6#1XYl[+ at n7?d9:*7USKAm)NG+CgeLDAK\
+%W]ZnemDkAlGs5;%\G\`NR=*hT,/crK5Mu:>q63.4lf at e@?..eneXZMBPHBu^5FaVpo#,]Gf8X$E$!P&UpS/Of.E'Li/AQ0B>_/l2
+%5KOMd$bPf;9de?DA at 3M/JS)o:!<l!u5SATD=mePs at k:Za^<WnV]Mls]lS+]<Ygr at A;?8?;e05>m'*YjTf'38K]?R'TY&b3q[\C[S
+%'*=r2qh"_l+A>.W=o1/VW9g"+55DGYl6eAX9C*LfH#aVW&sDf?p,B275gS8)<(cfh`D/N^^F/bpWO1XdO.Kt^1`>#kMq\,i7M7uU
+%l\Wm^#n%QTb*R1E>MJ>`>cOKNNK#Fl!T0,]K-0QKC=*ND"bD",C?ZQO\VQan?d:I]2i53C[gRVq4<S)9;t]Yjr7@;kn0M44T9T.N
+%W=p(C/ZLV3.b>ijR[s7EO__pG4L%1M^b`,qn(C$qMWS8?+L^Z_i9\\t_YhuqpWrB9=g8GP9u%6T.JeebC210NhpCM`-mo at g1?P3i
+%OZ8i"A\6*#I8b\6[pQ\L('@.Ifm*m+qm34p;GG8F+Lo-qaqrirpW?1H$og]$f!mt>\"%>YUglbEWMAreOu at 9m/?IqGi at b?#^4-O<
+%/5LFE\CLIhF$C5a&&Wl,'pm&0>Gb.eC\S5CYe774cBlhX1c\t$Vj7_bbi$)tR?LUq5HVYs"`WHkZEHqn1KFuCbA&UqZcSEa]TptI
+%\\.+S[.'8iT?D8KjTr.88&!!.fNaX!!st$'AsjRI8icUVEePq.?`>3hq_gK.W at -OQ[E/T%SMpbRc>*K)%LM/YLH`+WYR.;"gphB\
+%WqprN/^u^EM8J,cQ0Kg$j?!$Xc>D-H*&Z+s.aOqA[J<+Yk.FjsIQr_JN+GDp]\$B=e*6=kat1*)f9FuM&=a[%&_"K/\LU87NO-+!
+%]\3aA/8&SX#.(4B$/Qq%J+7>04aMq(j>\'TV[R%qG11#;kgHBIQnkijFRO"&Rb-*"8IQ:. at .[pVJ=UfQiu$O?(pF3g4uEA:-OU0k
+%=J</GHm;WbA_#QE<ipEg_#!\;,f8E-6d#6jIJYj>[NU2l_+sA)e4h(/<tB%q&j"SX'r\fnT8dj%ECJ<lHBH1ik8uZ)eA=]Wd.5kj
+%b\>bm778W3"BV4c`7,1:$$Y6&3I"%/"KXnZSj_C)K!jX<IAdRP.8Y%bUNje^AP at YuSC-8?3^=ZQ2odlP at WkCCQ6r0LG"Z^FTVAYG
+%9``J2->2uoa'YeUp%PqHGg*.D%O^G at Eu9s+a7Z#8esuSSG\(,SElc:C7pHj_"F[>h_e]+*O#d"/7!d;#_tZ+i5c/0&\tGbYs6n'!
+%SZbn^^H$Mt.pr1EG%&`d*gQ]1']C`J at ./sD*E^H:i*6[KM/ck!KiH1ifVP5NDU5k3-U(?ZGVIS#CnR4Mj'c\`d;=2Reu6+c%k.%%
+%g&cBPC;uQr>7(!kb]8qHjC.p5BB8\bbH,ha-4d.9n+r\5*#S"c:f>GG!YGVSW<PA_>l)8q#@d;a(;t<9g!07g73nKQ=Pb$)0+53u
+%*BS`Xg,Z.9*fZpXoakTj,2`Z,Qp.ZO><_L<Fna'E+aG2di,*&^s.*Eu1[_a.KlbSUE6SE[LU&,qk-$(D^,>ZJB7GTg at h"sb-S_*s
+%3sG=H`];DGJc%p^Hd"[gFt/+3LA\\>LC6H%l;YXCcV?U#apIGVllpea=$ouA6W<q;FRkXPPPED%O?ZPKF4E4EPgl.IoYK\dZg4"d
+%B!p)'[(`i2k9HJ%F>73+&4mMNRQb5dibAWV[:Q\l%p(V&JD at H#U;/Y^*$cb'h"HEGHiNcQ-WO(%&'D>7`m/^G!setl9[IqLF`n7,
+%<m,U%b_Ml"XXPh<k1f/`eJWRm^pTeljr>u=I&MQ^M#aIE>,p.tYg11"gp`K at NK4Mud7*r.f&g'DlL*[Up#l2!W4Ss0E%7VJnu<7(
+%'8l%uktUZ136jD7_QHM*?;eg:kr!t)I)l/Q_6h%G><XP<o(Vn>d1e_VS,G?'g[r)"Rk5.K[-*j\Gd/E45*)M$Bi[H=rlpM&4Y]%,
+%;gYBphqWjdCkS=JIV/ZJI*WUV?aUi)Cf3B3[I$m%a2Un/ilF.(^Vc8:40PPgSN4Or#oak`"6,fB-7B[^Ppt^6,_;CjFdl3_8ZY/s
+%a&G&Q4ZYG)Lk=<d%ebXP;`<8!CYpe##g(W<\<.jfOKOc86C7,O!sB:YOAgdE3[;>;KK=>6Y6:PQ.V2MWHCT'D4"PtS<_kJ[OCl\l
+%Ti.=)RM2*JRQS-Kb9b7VOTkB;n`G0_r?@X%RIfR=SaIp?_s,Rh[C+KRZX:-'h at aH3r1_T.>XXFZObQW=[YRH=ZII80Q1J7\de<!#
+%->)=I(Z2c)NNKrb1N>>i>5Wo*5eKesW2P%U2k?L7r;O.JQrlbgHMW830/`TraZZ'b,Q2(Mo!LLkYeI1YWcAH!bYG4N?<aE8#3?@:
+%Bi&(o=EqRg.AKb&G_0R+(nr+Y*k,^B:S<"2+H`R`4DC&/,\,(,^fg['S<3AYno>?s/<Cl8iCqHBo<jpUp-`Y%,f%q^W0EZu-UYD8
+%%uS:A*2Y7"?\'hfKt2`JgJur7Yrpe8gLHYMgJQ;]l%,ILH9%-[=?\RA6GKN4F5]?@%$ACU(Eo+[KCeW(P$/O at S+ZcG@8k]Zgm+d1
+%1=*s)jKO,#7Pl8&SEpd"YRa$UM//i-P)G<qDb8VKo0%<a8M3T;h_5%kb,tqMd-*A(dU+tFe at B3/>^d_CGk2[&V<;Pu\QdKK&_d$B
+%j^Fs$D$I/4eqXit1cGK*Ek(=h9OmC_-R[!t^?%sBNIULgRBRb=8De\p7jaF$#cW&*;aIe:2:L?R@*O:!2P&h$Br_*8Yo_]D0;BMn
+%'coCH$atE1YAL."J4o2&e"r\r'7&[Xk/g9_PnMPDcd3o:ZR@;G:),-H]</itCV2CE_Rd!8H";iQqs=)'PCE*\cu7/.1J?1/Lm?-a
+%4;aRN3c>$SQ+kd0Bs[JGn+=*KDj,AeluqG at k!:>a-FTGOH7BIeGJGYTj]U`9jdB8>_dQ)H_8i46X&j!Sh^lmgA"7dGh]r5<fCkr8
+%;t>2g^iC8o&n9C\cWme>rZ9P]._+X"JMOVN;s*.,rYE&QndEU at YUQI@F-,`t//R*2(U3lVN?j/)E(J67*^MG+cf2OhVZc&c3%'VM
+%[j_m.RCl]2<H??IRlPI2;bBPrC6BZakJslJrpr&=<jXXa2*Q\BA7Q)oo&l$S!(K<96]_R at E#?;b)a*6f8J=_g`5JS<k[:@ok9Qio
+%e@,9u1m;5Z6[ALgM-6UJEa4(<dM#f%3sPS6<!8+R:6Gi-8o(13p?CN\)]j(H^9$-#;/a$3A+:Z-YZPV_6.HhZ/=Ysn#g0raYX;jE
+%%'c]]ePcA#V?9)IUSfCWVD.n1LTA&c+t+eg?V=OqZ2QJK?CmnS_M2nG`4r1mH,]\#TP:%Z2EiL=p3sZ'$J2BJjM$a#- at r>)ppS#P
+%q1VLQ$_bpod`8a155HnBoSKprGGf<1f;^G6EhN0a&[(ja5?RZOA4:qbn<S9`bO>Ba>t?*F]p5?T=+t"uAWL67<I.0oZgrB\kY8=D
+%dk at +Pj5db<LY-7ir>^_X6o$2G>ju];.>9)l#.Cgp$5BXm''m]P`4dmE.[SSX"m>,t&jd*8BW3osN97SKL_$5">T-rG::Eh2$5<ek
+%`EQp+<LtJR%0LZjoKLW[o>W2E/`bV().H,&+clR6og<,5VG,T-_N=rDXXCAi\R."Bm4UaRq4cR0Z_<[<(ppmA<UKW3$J*$2kU%.7
+%R%5(=XOF4"Yh>7K[:[q/>\?ce^[GfU,]_(a78nN+d3Pbpe"0309?GdV)Y?9udc_4:AE?K`lpK63/iPeTT^.4?7K.^cB<GOu$sf!N
+%7It"'S6Vp0826BZS]@/rfIdNDUD9N/Q/9rnY't3[cfZ9TIKVg\lCabs0o-]-[gg:iO.,iE&B2BDB^CCF!aEll"2>H_YC)sAXEjdo
+%+*Otkl;qLK50Ac&s+E- at Ql&\%VW,j$(=geZD:1JtmMA*Gh:U&&'PWif[g''UK;AZ*5sujgK$>j7^K+(T>f,Z09SL[<-GL\^Ug=R'
+%;bO1e-X+"ULNt_8O-;7rZPLEj)miCW45oKlAQVocfMX^ODg;Y&:dNiVJ5W=LDE-IIZbQ<]W=-0a]6I"DL%DRF@"5V\Z:b?5jPL$F
+%F)C<$m.Ib\iL*\6s36jKWfb6101l/r<][.njKp-H_\M*+Au[IUe9gI#Ie;[X`h>)_i3'VQJ;7'qME1`L]@Es=Y)<][)De&daeK-)
+%9W9or]*kuRTuur#VTqm`+Qq!A1[uEja9;/UbXC?DnR:u/@e.?E2,>KZ59XK<G3+sM31/<9:b[7i(*qd;H,sbra at lX)$-6'M0P-iO
+%Q^;h`Rj'$WgR&n#D126A>3GC,%nW?5Q",pB4n(--#:03-pICb:Kogp/+CY;c-3"6WpE3)&Gc?c at _C<#)`#X-6-(6-u&/PTR))bMZ
+%XO(OYQdn*ca^s1?0_M4IFB_2i+CCb=C8,Y[r&<FuW6$\p7l'H(9q_tBQZKq4U3lSbBY,(?@d//J*[o^T4FKuKlP0?IA"c$.id$\=
+%\k'^kaOYWX$&Qcp!DAa+f'1/94>u@*]I\\,JrVLZ$u5TD-bN6 at DZZ`*lFcdq[rWHX1ZIN*rpgX'3gm2`7JLV8a&]@B'<sX'f7eN\
+%+*.1g`BWQC<MDY.jK!Z6'T,UrRKVJ\hB%4O21Zs, at jE)OdgGQ[`sT*Y+N_;)VR4fp=48*c0o&`[X"STf2gpP\qM?$CZ,(3<Y`):"
+%$A$=t?mEnJ*/t9H,=+Ia<L#l?m:D at -;l\I&rT5;g at U_\+!5h_-T@,!CbS3_$2_H)\S\$7X.K\<l at b]\Z0\1XRG3I`D46=d,"V/\-
+%M&*1M:Fk#G_?9fs$b>!2qR-EV.7f3tQu^q'$="^lQnMO*M0[jTD2rb%"0C$1%J.42D at 2UkEU)VlaG1-GbCL,d*niGuE2D:32H#R_
+%[/S#4X'j!]`1qW at k\5mG#gY7RT'Z2!cbAp[e&&]eVY,>"!h,, at 6/>3&, at q6e[Th(G*\p8*3(=S\HO4Trg8qr4C?0V%#auPfq/2O\
+%4a`>;&q+t:'M-KEW2nTL)E1W\O-aJJ7$(V:k7+_&56?qmTC2g:$Cpos^QpQQ0<6L^FXU.0fPCcg,kH;MgKOGuD&6tnb>/$pq*4U6
+%l0)X8\?f"',k.N=:(d+ZKS#j'XU-Ka0?o0cnRFJPB-$dLbV.7V]rGPJM%HIR##UF9Zo7F-qQ0iR?T^,G>"Eu?=R$3ErWk5Zl5B+1
+%dfl%s#&mWB["O$0%K'66n_]1VWo9D>RQGXHONlaKh at dk\dr.t,c(h6g%e"6RT'Rg>,T=>+B8gW6r_<P,F:4WeCRP$>q+^r9<h3Q-
+%eC7TZKWf#L'Co`Vk5Y7K/Q&NF4*:t at aeHk/C:B$$?*Sb/S'B@'>mRGd';g_mjiG-2X_HOriMpH!*/!@9DH;Hm3=f--8o'BWp_D.[
+%b++M%qeE3q4pCr1FDRA>/?KRs_s$3M)9bF+Km,nU?s@=_ at DCtm<ZUoS9GWGf<WMJEUBB;)T7R<J!UsM>"^0s9-P5Fm:R1%l8eH+2
+%`>(D32]1uF*"oKFa+N[nE+#=*j^D]-BJ+08RBg,o<!KEQ*ZlZp4XFBK!MVL;'F`>fqd/YW6t:0J98rhc,kRCT['0/B#\[7aL(tfd
+%G*$sX;NWY]_F&R!X?0 at o>2m5/-!u=RDq:2\J_;e&lU]KnAQHh-<-2.[Y'Y3B\N1HOag7(2q6]ml0hV<Lq"743jE=*r(eCQG[2-L5
+%f>=1>nM*PN@@1fZ9>9^*#^k(Kg#i!,A_4=7\mdu2 at g2\W?*PH6g1IhC]PP>sUiR,MVPZit]_Jf18oi#!o7_?+)mFob:2'.pnh:mU
+%N>ABj\sQ/$Qu^ip`6[BML#/m?r)%S$>jk6"1q[8Xic>b2#jE;D>(GSJD8Z"@&6*HX1ks8cSC@]U-Ko=/VC,q#%:VhO_Yr(C\C),r
+%9+,IN;ueBC&Rb+':N]sL,dh]m26 at raI/ae#AeQo6fg2GdaXBuChb'gBh5=!qG1kc"lkZQPmb>'_a_U+4k>^.s^0lcPL3)SG,_Dm'
+%cqA'EcRSO*Eo?$7""BT$"Yf20e1peolS026Fl)s8>0N%b,!XeQ3t[:k3KR>n]23OC(f27%DPc=%-*Z6qG4]QQr]5(0&JcIkEquW.
+%npUOO[Xb<';"*r_?4ZtSa`^ObJ]^#)!%4!W*u0+Z&&i>M652a'RQm!n;J32.VCZ73RH/u2I at p!c4E'c=g4#($6#gC,.g:Ts-K'.m
+%BQ+D,r6$,UVM'fF":_hM;7qm(D?Oac4>#ZNj2389du;M?_7UUF at tX%.$RaD[r2+k2H[(b0,!p<I=L3u1Q149P%"Q_`IXt,?<]BbU
+%nk%PRGAqIe)YJo6BM/jD1Ut*EmF/D;q0[-lfF)[2><[4gn!o7mTC(I5]-#nubG8s;#u[cM;?@*6c5)isd39NkHFg%:<WYiQ[WG>d
+%eIo`_&N<_YAc$0+pZZU7B`?SV;r$t2i:^-?^>SO.8KL?e8Td$kLa;@5'eX_4p,5jMju?At>g6#G4+;gC;3!h<iH^[\:-lT*O9D!(
+%PjE[;-YhbAgn:Xs0h=sgg\&aNT\0L1^!qJ at F&+[b%7^$E'5:D-g$?D3qQ9UAM'Q"_,JYdKoO'V at MZ;3.D'IiSRPK/L6X7T!80,RJ
+%Aa!>oYmeW[MXO%-W6mj^*'UVpk+t,r>c,%[JoI:d7Nq./,e8'4m3lH?><hm3%-^7PG?Hh>f5rAk2,6*&29-,PHl*[i)9N1XF9jG=
+%%1a(D!TGM4(4OZ3B&R">"TumTks?^h)U0]N^=N^F=*n,4<U/n\T!'is*^2VdhQ)+HWI5lDIFEqmK1ueL[YL!s4TfKBnm.s-I0Uus
+%6m-rQBM=\_Mnji5Zc\"kGS<RVR"&g$YN1I5SW7&P2RPZj$,IjC\`+i0TV1$k8>l`8*'(Y;/O at _E.="q(!o+_TUCUR`8S%:]^C21-
+%h&4C$e6*'hm=@\dRg<m=^Y3tg=P/"%'!,;d)i+l@^/JFed`b=H.7LKX8u\%YK_8lIlo&s:G_utaW*.BT49'D]8OXc!K1THk-U[W0
+%X.rA[qNT&M at lC'.pA"Dlk-Cke3eD(FnEk9MKIZ83n*)UZe4=F9cT@'25i(%,,K1ermlH4af_m!GarQo%?36oKrR9cm2HacBH^mQh
+%K_eG-lLN1.3tNt]@!*Cb$=ZT:k/hG*r\r,(FO66HF')>KNZcM60Z>k?Sk^O>/BRF..4%-.:%U\W15`-*@&'beltEb,9B'Vk=V!LE
+%Ij:$O\<qdcMnlT^]_e5'lt\<r8]5p?UsoQ<XbQ2$. at 9s(?;'i?CZIfpF%sdRFW*/K9bSDJ6nCg4ah*8Y7'S=p&UYm4lulYAWK)Mr
+%AEA1cqB[\aq"#ii"?#+m#"NMHd)TsT*<0W>&I=LIIac?lSrEll@?IC%at_=lN1^e%gS9+(gL3f*\:CDXqU/1,5>hss_HP+(,^_>g
+%PYY"bl/8-pFk%Zd-DiAZ!::4%mo+2?3U"mk1)0cHNMYKhpU*rU9]<5k,Q"hA0>KeRT]X#U11\Z1U!DSqj.5nU3[Uif8g;'%$?uAX
+%_,1_u)Db'M[t3k"qKX20\bSOX:%"jU<n=9LT6j;`>$mX:]%2I]$^uc"NZ/j5-Fl9hkPhaN!&9f8iQaMt05r&3TZbdD:">dKLZ"A[
+%p_]=LDgBunk!LAPlpP*@W=QskTQS+Vh4 at bod;DbJ=ugHKhelVFG_1bVX)>l*XlCSB8j$I(R]LS'BEnBUM2tB^DGnS=ILT=mjMCR_
+%=Zr_8hpL)Cee<F$!Y>"n8Hq5l.d>\'m'e6;kkjKFV2?=88ao<fqrT$`mqNCskLK1k$Z1im\:_+,mFAj_9Qb'K&ZB,mIFBZJD[(5t
+%Is+/tjSlkO^!B3!gSWt1.gO<M&1[NdSVjlmZ(4!g]bG4)HVe;eT1,r2aZR1c"6gO(J>cbJ?l>3.;p-mgHgI9[YLX)j+3o2E`prZ^
+%0CR\a0tm<HEVkI#>k at gq!@><. at l<*p=%f+R$^bB+jNo:))muJn.C<O,mA1[1Y4%g\F4.(*0Gu)1QHPZmREUiL;D)dhO8f_/pi.T]
+%i2J=GZBWCQ9*Qd6`#&!F.!UU:8LmVGT8g"d4P!X1JI0dSI7FY(,+U@^$dVO"eo#q%mCg8U>*gnHirrXC:'*ma[;ZuPT;USXoh..E
+%4nJD.q5i\d/C-s3 at jMo>In="X(+;4U=Z][uW95#R<A4a&YoZE@<!*)Z<&/*B)u7lL3g/2G(_X%:GO#P(JJd!A)T?/B^>u&>Pgle\
+%CjtIu#@-)@,/g<k*;<Fk2rBU+S*Cc?c1rTu%Mt,No"JoKP6H$!bRCYFfi:4\UE54[ln$L#aue&6UZ at S^<UB`KF$fHeTBsb7l(,%&
+%Z8?d<^NEZsGn at L3,o\6)_*!K1E?7:0HnRNQ8ae+0k'S]Jc30:JVQXO[1Y:&4K<&/H<'@<9fgI-*2=i$;)dIm at rPcM"9$5!'ju,S!
+%Y\'(Hf<H;hZ&WP\&Fbrd;P'9fo)EM;-f*U at I+5n.)!`A^X:s*$P1b)!,p57qK;nVYY]rf at JYB%Gbp'ka55J-t_H]fa0Dut=.dL1g
+%dJ^>[^H[[PKC6;>[+k#m\rN*/RR!8:-h6pc3l^F;onRS`(6e]VD'&63qaa\ca"h5Z4rZS[Z3j^g>V?BZiT=acFCg/@]l$&T)47Z=
+%EkYNK#(&fnKh'34PAJqRb^T're&Y*d[\Z)I(7:;=B:aNoUs/8(oMht_C'bC at SNM*DJqOZ,Jg1FPBtTc[-.Q7"dEPD/a4kIAj>0\%
+%Ir1ef.[_(hhTtHt9<_Q5k8bL`h)BmtK at lc_WTc)Lo^gsFCa^k?#K1$s*3>\:d8`>G;G6F+22a4$qf0m6p9d+X%iuT(Y&O=0E&WC-
+%90Q!W(RL at n;?c4K at 9@\lnhNQUEcC_denfiMPd_oj#.PrMI+5g,+n*`3?L4SdJmnU%Flhp<,(^.8#6Kt$jC>-*dq%\(SS9pb,c(Vb
+%=_]g@"?Eao=JYM0H+p*<)E9S;UJj>Vl/)Kk7B=6W<rSuIAr^4^r]Mbfb7nHW_sDd>(NbhLcAUf?ZslN`3Vg6DqY'_kA,;[Y/4gV&
+%ED`p?jUC^h`POZ#*Y">:DR20IZBBH*MDh=!0;WOE-uhtP_upnYqF2LS?Z&uiG9EL1],P:@;b%!ZF,rsSL'\n(cK5rcn2TS&q+g?X
+%1HZJC!PRj4W]j]0'2a at Y%,-dWVY^\*KaQIeks`s%WV4c=9=[*^X\1J8!$7rtA/EJ=X-0sEfdeE.H):o;eicqeFNT0USi$:*eOThs
+%>ec?Rbr at .q+Pm(g&hiU*c[KDb<.`9ljb-P[6g'/$/YepG;sKUe%O.3BYs%;D- at Ok'HtKo6$/aIuhon:+m=+c2>a$a#VM?L0\D\pi
+%XO"Ml3GG>Z\9I-uq)=YEZ/c:/)71lm7WfF"](<7DE\&*ar0_hAb,,]qg*U/<c([!YoaOiJ:`W*[odC(R!M>n!`1->>NHd_3O%1*$
+%<>&8[g^+j>aR6.A&qr995V/#l,E'Fnr1,9L4(Gk[dYkWR#PSc-6j(g>p`QA=Va%e_BNZVUBk\[FG&""+'+qC+VQ'AQM8OU at S?;PM
+%_8l!A8O[mpfR8qSkpth2E0SXl4qaP<"e,j at r(WceAC$lr?Vr)@-4^u3QD2R;0SQ:;amb;hPGQ.eUSMK5O">"gGpOYI4i/Bo=1k!6
+%6")uL#oS20e^3X1h8R>X5F8-X>FtlKCE9q2mS\r8qtcI<+"&O7MKQTiLrh&(=5H%)6n=Gr$bM*GcDQ^X5]Qlm]Nh$.f[P'nW?.MT
+%ejIj*OoEZplLN$cp.:NFMUK\B%P*p$f>bU\^sJZN-1R`=-Bc2p<M8&p`7.`8iQ9LcA'C:Cg8E8=P4TaPENhN=Pk"LE_R`UHftGeb
+%J1Miec_9#%Su0IhIX"rB<Q2n'G*6 at -]u&MH/iRiSh"\:[H!6Ih^iiE_5`>l,%B/p2Q8gqg8lFFmL[J0Z2 at o>R0!)g\&,XqJ.Ncoc
+%lWI-F[&[&T,h&&iWUEuL+EJBOATQ:,i^k?>Dl'jiQom;P>)e^+fn:WTl\;*2r?M_-T_INMYa\326CTDtH*#Mc[,(JhQ[EOgr-<;*
+%h"F8sZ5Sf+DIIUN'Y%TrX^uYa3D8PajMD\^rU109T99DNI at M=]ki)'J*%%NQeF#uC;C'>rNLQ9YVI+LqM5k*Jp5eP92/Leg7cZ_c
+%7F'ST*!T'/p7Bc2F47/g(cWGiDQ/R.eFR+M(>OgAP\=jF*0fDIIn"gBDksu8'8VP,>2^f-\hs`sbJ:5lF20R($k2p.+r?I+pXE/'
+%")VhYUY&K at YXcN9,97;KIa(Q=Nr1i[iW>lLlN?Hk:>>0,Z@\(\4!1q"iDe`i*T&-YD9!D?7$dM9l3g\qD][!:;m#$b1ib4S`O*du
+%c6%1CqNp>pF=>Ie7r_J):+FGL:XP,qq$7q=;[Zso]WIdK`D12KV;,+VW=K^I^!&GdSstT5K*fLPfj\])fCN[_UhIWfG]$1?"nFcl
+%cI#6T5bosj'bZ4/3`"-P-b\iU\s.R18PQ!b'%R"ER_H]+lT6J7c:u0dhRp4'8HS"$/L5<;?1]?P5#OWB5tMn?!"bE!BdL0qh!=Sg
+%c\DgE4`)V"K&2)_a+`VHUp;[1-MeE)3m^V',pu^iZAq`m**Y1"^*gt;e3$eT)HCH-^-!CA2nK/kQpm\6T)-$3Q)R1fdfWV/22u&,
+%l755]jafUsQ.X!ZTmG)_ahq*<l3*qQJ'4 at P4KmG^rEOE#id"G,5C%gWmkcJCL?%tn82F5/VEh#>K^ZLG#NXL1ZB5S'3"-i7&5ED#
+%MjCA*&'goa<@<HZ(N.L2Y2i'U5B#@22^O_;KA at obp998dpeV&Y!X*[AiPBX at 7'#ki at 7^A_<_V;T$\*AArC5)=:cl8T_$,^VAAEBr
+%+M9$%QK;^8.\samJ;k;=1BmXu(c:e[E_bM?o"I(];aTAjG"9;IZZ_tZqOKgiM]OsI;KET`%S=A';:ukW[IM4B(/=Am_1Hpp1$0oV
+%Jh]4Bgpg:fED)V2F-&%Z#-QQmajb at BOSIW@PCK!BXBb4PT2P^iqU\6W5>UAeYPM^;"NR?:%O+G\8!l3- at n5`C9CWfIJ$1]nF!-*q
+%h7N7VWDY!3=:lp^;s;QL)1ULVcYoI!,nMe+b3:sdHkI2*jNC%jjG_"]Z:JnLee,i>f'[^D(a/KZoVPW\bYYC'UT1*sDTcS]m"\=8
+%DkBpp`gIj:3?e*h at f4GQmM?.!M!_#u1A*f4S`MsUBT';"!r"B/Ou:l/-^PoKJQcGM&p.MHl:%9FU3I_hiqG5?'CTI&F%M*\bZoa3
+%7^id)i/T'Er:3MLM]BoO5)!9(#ACP)T+;aYilI?Rc;RQGPDRUO:-/&IC0nrOZ`ku;(sP:L6Cn!7]tBXlV,G:ef?MH:cp"bR82]=u
+%@MpRL=/?(bjFbSrLZT3]/.1<hEmC-MT=+L!\sFM7I($q.Cmqs0Yg-VkA at 1:J;/!TH1"mMtDo,<h_$P").Za;=m"BlODlQaCT^NEa
+%Zg"54i&9Rrlk.B\GZHmi9n(6jC at VFO*.EKQE7S6t`O$&L\?dBnS?11;d!p4#:9r"QX(,=Dhhd#!=%dDn>#Ls!-G*(QrK at q7XSajt
+%Rm;RqY,%(2nWK?on/j2IT)!.N"P;o5UGJ1AcIh_^&PPXZ4)m:'`>a`1S2lDJkp&U)=_+i>rHjA/bq at SYe=8^bA`l.,pR)r&00+H+
+%NRdN3C1cf#/>SpP[J0iEmeos4.9%!2pO-e%c[GhIi*h-h4%DJU'&?](X;1_a3\=l1f.s\T7rG\4elpp&i6P=i0'R^\@+ at ln"55B)
+%]L`AV;Kr+XhR_Dd+(R)k>TMm?89 at pJZ$;HhUefb6afL>5NDFP7gi!X`]![7p<Y!9.9^$2f>,g?"\E/"%^?><Nr'YB'1(+?&L['Jn
+%jJiG_QM7P=@&\_%Hmp;$a'/.-./4-_alQ7AO%tfEpq[HoaZ.V'+-4$[0R:/+N*qWr[81[`_CRoQH?.1arOeIGS?3`U/mO(%`WC#9
+%DB2uugF9,;`/`qErf"+M`Je_]A1Ycp/!XqjK"Mf9_mA[PP&^t/]p"1k7Qf;Pp@\qR5+W-6Z at GK!UAV$aPX`peAB16u<XAce4IeZX
+%=uU20,Lp%V*?+DX6P\&%T?36W-(+me,7kJ(j at WNbUP551f]3q*'kN$%kDF0PdR%)h%OVo$IGu]Gh\*%TRKIk`Wr0\[l5WVA$c1Wt
+%F5#m6.l4i9-d&kZa7;_U5F9F'KRAmtl#p:b?S,<-bIX8<L at aGLVF/Jp`R[s1s-"#(!kDDEpQo,L9sp.CR>bI1`gcY)<.(>jRJU+u
+%?TqqVbC#*Pi"F'$\MS((/Zu-Sg#]O![[=,L:Sfg0Y!87_WY%.TR=o[8.P8q-5q5-qmtb!AXGbc%J&&mfr,X?6>'!JSC93(tUi>b:
+%5".2i<%pT>gj1%&\el+K*%?jfXH"?C1M+RBlJCNiU!0j7%1-Pm`E;$^?Un2eddQ.FUHUX_ec!g238aY,$M\?!/niAELL2[7/'0fn
+%co=2O'RWS&I:s!@I+T at Vj_N14b/lOSh5JNR<4#]DT=fs;fEM4&M#T9A<bIVJhW]9N/Tmojq:^$$5.Ui8J#]W;HG1`%omJB4eT:$F
+%-(%=qNZ%<aVG8+Xmf-N5+5DrVMic6_mf'n3iXEr3&"1jc#o_qdQF\Hk-l<s02<jb';hi4C)f<(##r6CkP;4,+A[1iOk%^Y%^\Ppd
+%"]$W!Yu>=3ke*g,4P(i_6p"b]!tdMKGS,)C8D/_s9*af4VP4%uY+69&;Hn+RY.FUs:,r]'pP)Y`mQ:]Kfbu=FGur9EfF_(kLjP>]
+%>5C)=Z[7XC at S&%OX%tJ2+lkf<huL/X&!'NTPC4tTs+<laR+(S at P"&AlW:.Ekrb;N?T\e/66cWCqED+sGp=1l:CFY0oeNiiHJYe=@
+%.l4;ZZM at 03-jLn3ga;Yf=H6j,&DsTeXR/QV,tGI.[JcP'-&>(r4pmReLHl`te_K59eibaU[SS[*0OlamKo\6J9RnRa3S4hD-^m#F
+%am$/dhiiQ^b5[5^h3Mu,d8[l^>1$DXW at o8"0/Wi=U\RBqn6XD(,OW[&)Vhj#(F=V<"(`E$GFfITa_h7l_m3KbTJ[Ec&`@h=VQGDi
+%e^iWgd6VH&jm4.C9b38H!=eKtI^]5rB+DL3Fcp6U5*t%UF^2*Lc*WV@?@L1!^1J('Bne(!;G'/UZ%LCtOC<,'/Fa,5itUt-6d.j9
+%lK+M`#m#k at 8P@;X>&r]85Nk&BWB%G5kr'IOmZni*Q4XnlW2`oM(AthS;55%pOLR0Sgmli*U#6QND-)IN5GafX>NS>c+EE[`1\F$(
+%4*FB'bBNu.)KUT'q?qf/`7iI.S.<sFd=OM!Hp&fiJQI+:(eSX"Xug"so$6;WSDnlH2Pj/d<I:rTctH)3W#t[pd,Y&pdDh:Wg"AS9
+%mIc5^NLXm3eAg[kT*>;*\Lur5?-i/+i\:n9jlH\_VT;Qs:$dW1etC:2bZ?9_cF)\WVRFmcf6`CcMbP;jpKUOb\/n'.D9EI#+-U.F
+%J(Q3ZoI5>MMJ\DW)5_R+'Q^A"Hq<%R)-^E=DBYL,e5\/)ks=9%@26:<?"MfBrFC,sfBt:P0B_:%?=$M3&I19JPNcT9Z2dKD)/rr4
+%/0sA^b9122V:V",]I3ZUKKtpsO-39qmujS$)6`$P&unS&s#LbjisD"^ctH%4l&q=s37ulNk?W%WIMh^'E:p?D0d+cXNqU-V#?9Ci
+%e_WkJbZbSh.qH:`i#c!:\=P?c[Ag'fhZD0q-D$a-4N>NiL2V5b!1Zfb4`e8%c%7FX\oQk=hFR(a8]qf5@\IKV:o*9e``[$>qrKSu
+%_=[>p,n(k2/24qH$O`'O05saK98/+&`O[;)ZBQ_^9sdKWYu=i$;3+]H].iW(HG2Ij8"62iaVnO>7OliGgHkiJTMq7C"obj_1"F6@
+%,M4_W8=gg"8pnVP2-"k[TOeUn;tml\]LMKup'U"1ADS]:flMQ5,kM&s/8k(%DNd+'PZ5a>Xj![6#0LZKm[67#c&s6ef4"M0rH;sD
+%B)Qf:5- at Q-6mGn?,r#u__G$tpKZ$5_?+%CAQC$d$YJ8i=.t3$1U40M?qO?&r(,AIl4e_XIO6WhR)<^n)W?.Al3ED^(PY!uY[a!\&
+%`cuV1]"2WK+!d+_SK*o,X+k1[V+u*^JXpG?Y!,i9A)FeYdniTK`#%Z44P at 76"X4/j-Rqm.*1<b9Xrjb&kM/2YL3lHunR52L0R!2m
+%Rp><[Ng.H)X(hLh.k-<q>E9kl$2+"^/1(EI-q:@NcdVg_d?fN:I$t_X43&rkq$C//(C&NQj_Lu23arE9aWnbcnO'8h3VX^\pY9[2
+%5bj[]dJ=;!$2R4I-Q#?J+^o4HM%Wi)^=:]AT!l%e=$[]fnb6gJ at 1Mcr3Z(LD"]Q,:?,(c)@Q4C&@nDR._*(?bjB?bGN/30G>lo:M
+%fCc*k$a5LrZQR9!?4(8FHaCc;[B#-88I,8t]!DO]F^8(As"PG&;<-WFSc96.93LF8pR](!1*^Ul"A'0gN(%^4(gFZ[);'0pE+4*s
+%j4$;?9bTI]mm*+q.-"o.iiqo,XG%r\,lUJbBT"k-fZST&ICLQeJ<V$"g/\Fj_RE]oms1iBP"'2of;9Culm!)72V2WQA&2FO4=N[b
+%r;./8O0 at 0HS+N=!.007.o[:Q$VrdO&2p"e?0>g!KH'_kJhjU=05Eh!&[4ARGE;!qX52X#FFPaOp0d]NDbVtl([!dh+8[kNie'3LM
+%.aN`ZXmmaoXb'#T?*0D;2;3"R&/LWMjW:;?Z4B<MU#PDsmLLb9m/bLL$IVF9rIEQ2T&,u:/k3ks%9*$d-9W(C;`UDH at OP=#L6)U:
+%*jC'.rp-!eH*9,OWQ(1[QTLTJRsdp"TP4UN:Lt?s[j8>-1"VnYdsRfN.cU:Rls!puUY_Ru]Gs!`S_OdB,)rajBP::Ys(&:'<6 at 9>
+%q%lVQ4Kg!MHc+E#TmBXP(IX_0Wkk-"8(EVH9*=9*<mEEoGg%^U73mjEkkW]F:kbA1U=$"V7UN)r1HQYZE[j4$&uK)U513iDYWaoN
+%rqj,$^8;D<F-o'mI9<VsMbPJ2l>(nF(lA/"+C(#1>)M3"]r$LJR)3sQh1hSU>P!UD`7o>c*535)`,eg^/RTY)'9++uI.eh;k(BIC
+%),/i#i9<`#2jN\ope!puA)4;Kp'@2%fh-N>Dr8uXi7#]0q&ABCXs!.;)81]NR\6WFj<TL0a7Z1kZQ!5$?"Vl_AodbT\-pp>gogKs
+%PkEglWV,5(YN5IV95HL<G!t&7Qs>03Yu`UfMP5UBd5,-K8mkJk=q(5uP*:BZUiUgj^Erj)8 at RWQed[f[ccsR?ED42"GFWn+entsP
+%EJ!S]3!ug7[?\:ISO)fQS@''M++qVBS!rn^?Df&5Oj at S&,^_*dGN4pmfArHKQlb[DHMnmdqn4<O-Sag?Yefb9q3UidVR!?2Q9t\t
+%FjjV[P1)VT3nDRKlq9p[Ti0I=Pj^on"(a0YDD$trIAVT'b^;"=/k%"u&o1Zq<S6*hpQ^NYn2/H;+-o?`TsVfrFba\a3N+;1OV`$k
+%^6";rj(0LH-CiMl6.38<2FYsaFg`9R)jZ7j/55QkCD<^*<d5RGd at dSuR)KD$@/[?o*&A`UEsM'MZ#LEPpuu`q4m\"\PjdB5/8cRD
+%]GbT.Q+I]td&Q`Uib^0]mgrd]p-)O<V-MP](2BHlEGb#EdmdG.];K\L9gd!*__OA[&M,DCU;CeClY&TAj*;qBZ9RFlT0R^k4.82c
+%gU=?</T5Jg6FLenPU:3K4 at FN,9$5W<IiguCFe+DQJQjGB/GBa(h<s=S?O^Pn$kZr"Viq'-mD9_JaflVKU9Q6OiR<rI\l4X5.P[a%
+%l_5q]rIof6*mnR#MlBWm?*7SWX%Drg"*\_:$^SlIDON.;Ap<11VjZ%jM/ZkrT2Wgq/99a(Q2\G(C#2qD;0ML6\98S-(0Y+Fn[Cgg
+%VB65?fgW?>ZL at SEgpn<J/I9BgH_50IjNHJXr1-!CDu=n2&m,Z2po%2!03VV$AcP3h(:nO_%>FnTkYGV-1\8kb6Yarn./Y8*=usd+
+%.4N9;HiJ),i4b?3j:mlJ=-8!Vl at id9TE_^ag<`.gpY0d8bMQW?M$Dt8XNF%/Q+62ImL"kWNg5!6P,WbVHIMH=BQ7oK26qb]NEA^M
+%kHFDeZ&PoKKCCtQgS#JOL-j2H6`\:fT\E[1SQTFL-r#dci6:Gp\!K*ObR^W53-cG<[^`cI5CN=Fq at 3Ck"B6F-[42':'O911:BEWn
+%luiTaij#>k:Md`_-X[a!/;Z5Rk5"(O4%+OqC#S-(#<_.r>pMKI!Y@>k6!JVoJb+<dfo,)fi?W)`-9([C%lJnQ/39[CJmQ>(*@><N
+%r7JZc,u;bh]M,]eWP$I::"^AFS@;0qJj%)jA!J_()nbi=on>Xhb1Cniq)^n@$1fVD6oJ%T+Eeemb",1ng+tT^c,2^>muVEh?NuY=
+%#.u6\E&8%!bBqI4)r">N-cYg3FGY:pI/J`;]Ii$@VXV^rcmT8C[69tW<8$s+X!ai^^I6!"%8K1g9no;U"$Sp0k&(Q2g1/+Y_4j6L
+%al2b"h(4=)S7&U.qo7PK&+**eOjD=?Gg2T3q>:hqG]P'lJ'4gD[;3nEA-Z6a23Tl>V[<dc9tq!]CVQaPag4`!l[s*PHJ/d",1<b'
+%fX.K_C27b]F]PW?C6Y*8Z,71Z/WQgG]/kR&FHg.6Ek#,>YE@&t[1)fCH.T/R(LZ9n^V at E*g-EP^(<+.^PB;@/3I1=`DUun;0Sm/>
+%G03#b>X#lHWV)m8'_QRZ\a)CWGER1KB`B at MgkGK"n83X,cn9C8c?I[p#_G8Hf_G^^7CJEspSCJhmUUonNqY&d'Xe0hU85nO$.eOp
+%IeH(8b*(#h*Ad/W;Ps<+o`TjuPmrmF5k2>]p6Smnn at 7=8-!O^R at 3l,#.rXe9!BDU<d+F3cT)(,?_PA'qT<G/Xp>AR&]o<X1oqB&F
+%\dfBmV\[TU(J3MjUThqIE#)%pl7aG,+%omtnRr17K_U6tGo7i>_l&+6YoEo'SGNh+hk9X3/\"4Gm^.C6\G]Gh'@.6ZR!e5XaP
+%9"VoA9<E&$BRQ6pk;N=&jmk#b)k,+HrhcBN#cTnhLO1*kS%4bp5s!_U_r1QD/=N__X<i+%T5m9/F,cehR25Er6JtEIo37Vop."*i
+%\!cu30G+d$[<NXs(R7%anE6KC_Df"clKredMPrXDC6BX+P!(+/Tt-6jT2,gXe^Qo[,F2D/?CK#uaU<a:<-AZ7I*.*#O-^j;*C0jU
+%Z'X?FD<omEcOVShc8cq30RIA2']a9i<%\lWG_ at Fh-'g;pk.-)iFA.19'IjCeH.;"?RfOOXj$Y.q'9`rY!G=`\2uOFa1]@rpD&`W%
+%A1B2i>Xmb.8\5Sbm'(1$XZUOghXb\H(hmr^cOo7q:(42URnDWOGYX;b at FeANjQ_[=i5H2r/G>n:'\L!l0#[9A(d"XsZ5:5jSo[o>
+%Ptk,W_:U)f2Ur5?Qnrug>J]k^3:rKe9#AN)^V?)fUsFH`k1m at .3*di^mR3*@l.6q6?7>B(19E9L!WT\`CAPL,q6[&2nru+Z_?+80
+%c>&eq0]fR,EKTuJ3uPi5EObX.)d#@D;aQ>t.-lj,%.p(EB,m,P.01L'h^'LRIr2q*]iTI0 at 3Mb^N.&)HB*64%MR?APPDN7_%ST-`
+%7%1I^l50%_m0&4OGO at IO,ADDLqXL"pS%l\S`IIRiWB">?1cl)dHjL7sO_;8!\U?C6OSc1#Nd\'8SqiH^AorQ!"!.)@!LbBHZISK'
+%-Z(69D`c``K#@tB"hN."hIs8AYNmG\R&(?&G08XC##+'TbXUbkChpJgMcNq$A%1A`V6m%q]9i3M?Te+d6KhHZ5Dk0L+D&MW!];10
+%bI^s5qtB:?=EqdH+)HXSq"/(K>/FN;NV,u2h2LLliTtbP&d=90%i*7jO"hCS4K0QK&cg+Hr0l];@q_s'/WpK\&WSC<$r[V;f$nbR
+%cHa7/.4=CPF`QXO4Au at Z?sUgm;SR"K^AuM9!WRBP[RUto0TaH[fMOCf>"ZFb&rq4#k"5.X.P*J9Fepsc-bh[h-iZ;iTVO>-=XVJi
+%p8d_]fLFq=3:=Vo<)cd5/Z2nVMR:ZT[tsb2))7k%S[bV\6Et("4\OdH*uj)7T%Ybr:X`uh%stCM5/oc*d8o*aS>F1'VJibWqCA8=
+%(mm4Ffj*EfGl!!+QOe%%R*?B3m^#,q<0Bc^pf(1b^EtK)#E+\6[=k0k:(<+*jYJ't'J6EIQSV`K".-1gbKhc:8"NUr&iUu'@9ZL\
+%LK.bG50*Dnq3;c9AUEofIMZm<>.=f86m&m]c'.d]0AR,]$4PZ&-m*d.h0<pCF!Vn5I\-pmAL[NT#-TRY_r"V@,Xd+a^p6sbVae7H
+%V+pYpmT-LhQEQI?,rmafCRr*u[VC"-qiS+nnbom:_8LI67'gkmnWn7%*Ypil2U)@H:/fD0Da<T/55o,"/m1T*Cm;;i;&]mA0(/pD
+%o=sJADY\:ob#RaWQ25Pq?42NG_gCYq7'bCe>jiiX^e2LNLAl!]E[j^B9Ts6"pHL0aa%H229s4W?[])<T=sU'EQ\_t_>6S+T3ot"f
+%;]d9A.o3 at DYipRu1eEOco($>u?G:SWNPA^UKhu1Nd1_OEb'p0j$=&dNe0:(chRUWRN,4dp1m\uoelYJ>6g8_G02 at efHRgY<DX*%g
+%92m\u<@60(4qbMbK9`Q4n$KH\a-V12)fn%HT]>?59/soK_gohZj_Hm>CXZU:nE)R39AuG_s/[i!nh"kGI at mN*`*sVISt5V_2u1i7
+%[/H6uRZKoLl^]bI-NmO&S+c*[poSYPClf&=W/lNtVsrF>UfTB.++:qRCSp/b<Gp*Ncu5"=k79Z\h/(tW9,FHK#?k+MFC/,[_0eYt
+%&sEE14S<;99:\6'V``<!jdG0\Y/Z8;FR1OE1Z5OVg(!gls*jcflglKU4=--]('?MfW+gPG(8'N]A@)$jUqVsH%4""I.es7E*"HSZ
+%_/;dFbnYYg-V^R"YOl(^I,TLM;cO[Rd]TH(*b_1H9]N:KWkP7j0p./"']IV)Lcql";rWG#ei<2Y,hYErDY&\u$_;L0iCoMN;.F$G
+%amZfZPqhu:no6WD#]OIVbJG/K=Rc`#bh]c$R"B!tq:/_f96Gpm`pUPp^M""Kl(&UC6e@&"dF>9uP!?:eg662grY-FYjm4tfM^*t+
+%Q)R%>UoANGTM=fK=1Ib&aGVpTmZ\0Ja!Ti;of9a$WdL9!,gWlo#Eks1]q+hbl2a254MkUlB%q94m,KN4!n0P14`R8e]dO?oF:9+$
+%bFLk6>r)4=+TFs1Epb+3^S<5B/D0+'Yn:G`L./I&k(IM//$PX3=$,$][`=(cS!rno2gP<A(QRm&E:T_mT^Rj4aF#<&,hO;:IR.9c
+%ah:GE9582k7CR]?jB9]cmt'Dp?W9f4mFFV38olB*>a1,ED#CT5hj)=Nc'?_/fM[VV'XZ.=!JJ8d9j),V,uI]Pc<A0AIUjVkX6adh
+%$+i>RI\5[g429:\N1<qN0"qVm;%T==cIo/'>RU:j@:Jl7CH=.#L_)B]h9BPFTGqlcnh=o!?3Mr-FQ=Q%E\M2*)jrSo^T*MO6+=KA
+%*?9K)6Z#N-LSn=)IbI6 at 3>ZPq$*il&*#a"H6-!0d4Jb/kI'uLWaZ92kK)@).LklcBZug,`pG'Y-j<H:VcY4T^]Eao2G+.TseY9M7
+%L7GM'Ls@`YK2@@;`KSF%H+F=<hsSp]Y+=1i+DKr1&R^HS?`0T+R9L)idb&a&>>jm(78R++@/9M0BqCNm34J&6HWF'j>""p.9!I2B
+%Bc2OoMh[Mafr(#0rdt0G!pR]Doq%"'hZd-s).l40Q\550bKib^R_WJ1B#4@*VsmAM(G]aRm_j:%Z]`"d.A/80K\V#<*od at -$*^a&
+%?P&^A1POCTp,BIUD.WErF7Z8hPYGM%h[KTZ=^JK'd;<O>^fof,K>c,S4fI&e#o0Hl.UO`g:D;_U_]8TE&DgehGOq#;DsJp$iEg1T
+%Tf>VS;,Ypt^o/2GU`^lHe[JmWhPcpWqu&JrII)@\6%pIP_SCnp5\`$rm'Z,D>u.UicmaN$*Fd#/pgkm$kA%e3s%f&EMY87n4h-T%
+%Z[B1/bIBP\;^_E80I&WNpL=-;+?kRPJE:fLIl;F\)fc at ZQ1=!&mWKme3Q_3brp7U/)lI@(lqNGkMX:]?&ZN0?@M`M6-pf9KJ,A74
+%<1;qC0-K%rLHSYHOFQ5%.jtZK-U7Xc\`DgR3*EtpG=k[a?pAqs3)[,Z+P8*3h+>&S7 at N'_'"nCr[4/RpY&NOFa at uiBg9g4=,_D:g
+%rCo:-BU4p!l$CY(,+)A0DS/ouW<$sNV,MPS-Q<Hk,4>/._ti\)darp42/^'$;K:SVs6NBBG)4YK8]FdW0->RIC>5?;H<Z;9.)&8K
+%V?/nX5t0.PPDOM4V at PXK!!\DiR^S4=$KWT5R("Ba,h at 2$*q)(d&@`:f#cis??c511VM0Xji!g4h3GuQ&/P)A"(3ta_,!e.:b&b5H
+%l<`XEp65k"H(:#gHrr-J5djjL\7OrYq^\k3Zd*V6p=2s!(3 at s,^fQG*UOaM6H02/Z'[cZAU7ZQN#7Vjg/%b>90cuRpD9m*fs$DXO
+%jsSVR%C-rAXeRul/Yb)k3N"#hN%r>CimG@:_*Z/P*X(&]V9j>/=m.dS=ouYZ8COT<1UZKm2<27"EbT*_-I4.#:),R>FX<b<*NQau
+%fmR)?rKe(<:F6CYO)AG"RQO66UnJa%b@*r/W:6h?'/M8JPJ!'IGPJeKS)lFIp>d%hd_U!Z-0L59$2V$5-QSeOE%l=eNCrdM\Wjd$
+%Rra-@&mXh2c=.m0fYkiM at 7QP!9t?/VL63g?e+ at S<KC\)B#GIHoSV0cBoHhs#]6);lNK'L>$Mgu8:<;P&6Q8.-^$s(Q1k1[Zg/L5r
+%DqiZ>7ZM1KcGP1G&)qNJR2_Air9"9ile)3"['7#9aK8EX=IeRH"%hdNd[l6^VOuT0T1MTC>TRkL*H_+27Upmn^:$lT6!<crD9c?g
+%KHTI59N+/+^=S,O<V)@fb,d_OD7V(d!6uR`K5<tql5%>0d4a+=U76Y- at AKcAP.DZd<>D!MQh&Cu;$si(7hPN21-DroE]C%R2t):D
+%_B?46#B&n+T`fGiqQk1OEq[%U6<mEd>m\gDhJJ at PmSSt+!R(3fH$dBU(KkWb:AGM'>gqWSSffo"JIlOU8e@(bmbC=<qm at de>AA('
+%S^[9=$Ig"UL!jfsX;d#JH!rHY6YB%L[j at QIigdm'])BHBWPY"F2Hk_"`WA8BYY^l\`83(O]p#CO[(;'g8Pj'V8n,n*QO>hhdJHGe
+%GLXNBPZI+ao`0Y+G8;nd\L6&?I8M&Bgl^S]hd:,5[K-:(m=^aq!jT4D>Y#h;)Y/gWTlQ#A7]dre'CTcH;'af`e';K$/i[dPMlj7-
+%cH]-ZMWUBdq3hG%\:=*[(t at 8@N]adtRD]rP_\)F1-h)Hg9hh&j2]\[)K_(a+rD%>`[G[:i?tu,k2rWjW?$N6_\2#Ba2Ra`YA>auC
+%L#r1jPm1n(]m7%;#gU%Dmj+K*9oC"Q\Z_;LW%MTKE$\]i!9:NT(#[3-odFlg=AnV5VbO(ZohN,F>`_0I<<_%SjB-_bI<(9B&ffG^
+%ca8-HU;kAekLbImI;-,^lN<Uf&VlP--1[05UOuEVFs43#g(5L,YjXeg`P\i)5:pDIQ3lI#c9V??j]AYS9LUJ05sQtKS9YO8LQjmr
+%c:]9KJ0C3F>E9t`Q249A&,3RQs,<4:$FU(fO*khn_%6*laiWFN#n_]drr$FtS<M!X/Y,<6*esV^mR`Qq6g8YPA.8MuR1/<)d<rDc
+%J^Y)bLS,W,)Ci=[:LZp;JI0Y1O2ksl>h/C,es^PG6S2\Rj37#B2m;gT\L])OOeUMBHmg,8330iUI4rLA`#LTM<HrD]:NeBK^KQJb
+%n!p+42%!6T`V>%25qG2AM at 8%[7!W'pY=VJ`(G;DWNKa[!aP;Kr\Ss_GZ3F/'E0T/!7_=k`s%(c&(*qOig<FSK3[ZQWCr,83-.(s)
+%2KiuofSR;S$8Pb4g(DUYYG!jP]>'OWOJ$H?o4WW.m$;/fZiFSEYFc2mcfOLZ:YQ=j5G)o)=`k2;^[`&iJ7Nb"'WTla'PF>0[4\#+
+%A0.ir5a'[Y<YLdD#`,Ag^-0h)3KD&WVin-.U60IC(G2gJBi`<Q1i._%@JmFD at 9mG*M<_9SMS7M0Jt2G"K#.Vr%Nc?\cG<)B:;-//
+%\7?n!k:r`JlG3u0(YU+Ed%I,84-EYU[qK!@fOFU37Rq8s/3[Ci]b8Xl.iBipbnm#$-#QC1MIt2>5ca^EpsjI\Q67"(r@;M)+0qoq
+%=/*`lY;uiDFS8eeL[3H-2)\eX[+hLO4ftPm31/-T9NMiI9>`,kjP-U%rM`YbGdEb8Zpq;3kJ<EPVG#`EIgM'hIE's3bpBZ&DpJ9s
+%)5AP1(h9t$WAPuII`o;Wm+#+KDVG%nJmY:g)"^C97B*\@7;HAbUUS-/_T(^48GM%_:FT:$8`@t..]"c*4j"(dM>3!N4n9':`:e%K
+%9Z/:93"co##DA?OM&u*DOEAdY5rJoF5%T)48_[mT/k0'_2F:U#FZ9g);To$^I:^$T"+.A^oVs(\WZoUA$VJ<%UTStg2q8U/A?>,W
+%p:r;;]&]14.CR!LX#X!JIH!=l0^k at +F('FTIssk[q<,;eCm+?hE+'YZb+t'QN^;\1mjpDie(DOS at -:%im9EWn:G%PQ9O>/341$!3
+%Qp^S/(#h7I[<3 at gSoW7K^f7#mqkZPOeu6MnK1ZHL_.W*(UJsZojk1;s9+F,2^dP7L=*)5XjVu!m9%)tOp":8"BmUJ>Pf:S_8g"h%
+%lAE#u&[XXeA5_[%k+3Bo7[e at CB@:<CEt0U.k,oUo[D3Fu-q6QZkq%N_ at U#Bs<Q<H9*+"#jX"6BH#4_\G_d&TTd+?D]DB#Rb<!A'E
+%m$;G25O.NnWkj-\5,=:#2*S^2o)e1f;n*/6[KG19#%Ud.KRnkFPG]]F/14^]4.B:6d/4]^T:Wqs.lWSLd?<Kmr=h"9`WCE:BdQ@,
+%5uX-$hL^srZ5uRV.1`'A at 0Z3"0KK'HOHo0&975!H9?u;GWM-WgLW`9+PXBV?nb/o%Qdh^']tMd5=\)nhODUh$-S#D:j!!6[3Kn!8
+%__S"ZNVrEP at JL)5]`Le-JXi6p;t7boNu[LOE^&ul&S38U]^CuOeSK.>_Z$[@2R>E3s-\-XinT9`.A8Z;*&E'/$b9Xq7cdU+V>Dq]
+%0p6H,ro`Ml-1;SfA4,H,_KVTsG?Q8)]m,fi,NQRb15c)a4F::B.mjrj&jC]5%ZRs7)K3nW??&:>(c at Fdd^rF(7cn!*3A>7e)P=/H
+%S![naabl./;B$+EaseR`?8SDZK^o:=niSRs[IQo1`S<<IQM`?"(rr:[S`&32NTs5mm!,"+[n]>^Z-f4Q[a\5`#,"M?(Odd3%%:i+
+%lrVW#9gt07Z+:B9=NHj?/<^Em?)G+#/LblqTd]$CZjk=0IZn]%2KBD6NjkP,#:lkON2\LuAGj5Ib/dYWrF5r/^W`$_[OjKmG*Ph&
+%2P3>',kWujN at 4niiK@M at RaGQrCS%hT?9gsmaHShXfM.om'?et5\Et`9^9oAnR>Fto42+TLJdf('0YOYXV?<u?cX4?TK&;[jD7aA^
+%#9 at m:dAXm$3dH')Q=1#jWp_Og8[Y$J-_!e6j,\&$lF;2D6CsLM>PmM#IYTKjqtt<=:]ic9(6W"$kSfQ+aDJMMR4H>ODij3%7W2J@
+%8P*!S6=ssTU6[6_?Wq`#5;a<iC.qL at S9",&n!>`.<m"QDI4:-\%nE3L-1E<)r1m/+BAqWD6[$Ib$'TP:he*?5hmm`&*@W9Xo)i-^
+%B.E9gCAP,6X+^s&\T05j@;J&.d_7HKEr=5<LOdG*>C5Xro;:0cn0$=:W?mo/H]7jYr.tS,H.h^aHC:N_*1Q1'\f+MLeq&Ho\CFcg
+%dcc,/_]BO=pg[?PCMKh,kaf at 8'b[]7X+(N32+?YSh0IoN3c)SC`(Y%:.4%THd3TsrObBE]ja8,VBLY<eg?;'[)(Hd!rfhMV`6QjZ
+%W?YQf^Bs9Ego5(,_Ri$kI(lA7\>tVCJ-G?j'p[Ls?`?eX(lf]bg>M.]b"a)5nh^Hk*3I8+M.H-JU7P[D*-/BB93A'm+d[4Uldq:9
+%?*$h=HJD1jEo1WhmZ61)md?)0VT&D&e?\o=P4l)kQ%WZ+S!Du9O(b\gHjL,2oOF95KV[p!Xi&G76$Ii,j$`l]>FoT=hfe5>oTVHC
+%_nm[j;$O5>LB!>CPqk_P%>l=(1)+Cq#hEaUPcM_:)1p at j"BsWE/Q6.GBT$Rd;7Y!Ak'j5K7BM$nj`hf!0<:spl<3Y;29HWo`.h?i
+%:uSf2Nd@)QD[fOicEfqd<>[9>Uts=dN;l27lf"[(;^abX3Y/&ic,'f[_-Ye=?Tc<P#0+(6Xl(_;?S-uQ"AQGUP0c1rf0>iRBHAD5
+%r9JU/RpLq?eWe&S(?Kqo/Gf4=I_GpgGqOf84n(j33^(g,TUV%/8S]A[?;;&jeZrrYo:UDe8P%44><GU'#c,l+k9Wn=r0n(ZMs[p&
+%S<n93qmuXTH8eJW'tl#NNo2*An1FHVZPY[2,BCn)3+'%7Z+j'EZ['[rX_RmH#N[tU?R<,<j1&e[_RCnJkFGSR]ZC/K+A5\M4R7[R
+%I&/TbPR-S?!]3b9C"C1nU<<GVF!Wn?0)6fl68nSC%g$cpS+rE\q:_puD#i/"G9SLE%r3/ce6SAC)'"&c^'Q#Xfg'k2Hpd.gOfF]@
+%kfMr?0LI\O>?\g1%V@*6SL^+s\u3big[)h"WeJc][nj-&-b:Z&SpS8.Qd=4"*dtH%gIU]SXJ7\NI,J>ZadTl,2mDFGb^IE**)BUo
+%#IhCh6/n=g<A\&q@?XVF><Ak4,_^f_TOloXZ-&+8/c">]F6`SJnRe`-k6J5g_#&VQCP)^<;WRpRH-t4LqX1>WF at VAcBNR!G>63uY
+%FRsqV0>)F07Xr.0C/a$WLD.ROnd[u0s4q_]>hFu2gRBF.&8HNg*rFThg=MZ+dWBT]8\,'kb!IbN58:>ZmSV)l-Q^Z[%k+,<RKSis
+%oM0dI&Rsh`&&%!\^Q9+'U=s+tHR&dnOdbmFP=rtZZ\Rfc1Wc=CH'q_*+8a2^I<YA7Rd[%89&(<Tc_l2D%5r!PWL3Y5Qh6CSh4J?V
+%!<:,+P_>:O@`<;6JgF<]-,OqV[[u$/WDRS,"@5dq+D/=Q'MF1HOF[(P/u6&h>TOPam+/&J8DTBKR^7?X?V91no9=b&&smL`1P`es
+%h2\ek at 4oL+k?6nF=\IDLmd3,[^GY2"mj_>KEEF at jpk`4Sf+Uo"na<lj^48Jo?jjj?9H\-SUJP.>3`F(@U<b1r(j:*f)@G18pG#lm
+%hEW7WZqR=Dj at 5_aaaZUVZk@Dc$+pI_e0bk#c.goWdF\7fBmb%YQ@'$^EmShTRp!"`7n3q9jkk0A9Er)ZRE8O*#)KW59'#Q. at koS$
+%h;nIr&/\U;WJ at BY44VD5#JktNkG3<lq_9n;;C4'KRV)tIm&WTS4&jHN<,pcJ\(<Wp0gtst"1SMskFiJU.P="t+4CWJfdG,5:3Nj<
+%7]Ys^i;X5_L3$G.YUgV_!@Y2c=hmgn:sq1pjLGBnk)qB6Y,hS-CePMXg,!QcofrFdJek$a at a?Lc'+.XJO=&1oipQ:e(XDYg2]&tu
+%#5b_HS[q?-UC*!ONlAKAqs#e<+rQ at 8]W4H2p>m8-7Qdlc^Le"pjaITH-o1P5-FlFlO4uql3lIKMS!u\;Zu!NSbkiE+CcTCo&6)0F
+%5cV,(\pG%qJqEFTSjAj&nlk;aSVNJHYj',r&!2TdR-(0I&h"9>1>lB6'Q'alFjdB/qYn[n%&-_ITj%(qmkO(GO04_$[bsQJn3Pue
+%EIf1sHkY+6>&K"pPTi2C5$fp5R-!GdS!X(8:,=J;9(l:+San at QG=>!f<YtElQRMqk:=Bea8bk\?"\i=cR>)s9Ti4cAI`S^*SWlr@
+%6#PPu4!0:5CVIYB3mXkpK1GNe#\tC+_E]sZ2(q8LbRNA[*@?\XR,eBT1a+QrKC>2g9fqH3^1G.Q,kpgW-/RG.I.3r.J9>>W2Z`d>
+%!`Yu/lbrGWanr]-jeT#ff2d4N9V'M&jRP#Od`#a_p.b\GAMCADVOJb^91m<k=CA-7HZjf^:DT%f);d-Mo#-_*Vs/R-n'0fI<Q)lG
+%kaK)g\NouO2"OL6BVC>rrVr at mRb\U)icMKV*;qd at 0BX0rb/0j!QA^,%5tK;f>B#bedNC/^O0D!c\l>u,MR?F&^!6XPY^'f3n_7!`
+%BpN7"f(I?=4,5b.DA$Uk4]BBuWnaMaf6QPWEiQ^J at QOBXS#@_eoL"t"]B:7eVqJsWGgoUco%>[BOF7$[NA6-9$cpRC,2C*(iOZa9
+%=A^8cYs6'%3Pq%`)HdI=Zq$eU$M=SJjs"SOY_YlUQWP&SEF4-3I[rllg9ous)2jX%TYE#COR.;&[F1<:^%5q[(\Z%Jq\JVJheX\c
+%UO=tlF.q3UH+53?`M/)Y/=Gj3kc!DQ>Utr/jDTbfGJ7sch at -$aM0uFLp8m/9OuC^dDsSI=D^J4`1'Jc`4c-Ed?)fRAj1F^?R6qPO
+%]X4VXo(]`e=2,kT59Lau58E6NRJ&bR/jGR^qTBc;RsSRgVE?191*1]D2J2pZjSeN0jn*MGrj9uB?H8h=L@&VZ(Emc3^aC6l4F,6D
+%V6rS>_+rlVkfgtH#XOPS1ibc*RXPo5SR.hip'!_o8P^A!k>"'u\l\BK8js6Q2c\c=XaIB=F+Ud0&1P4o,B"s!N)[Di-!=fbAd^4^
+%!L`^:!X$1l9-bE!*1[(,%>NjgNJgX1 at K:hJe#ho5r+GJ'E8q%qM,E?KOlS5_6b>BqYQjFfGCLG4joM@)8tP,EBFj6#S:49uM#f!p
+%*eX+<*Rq=X-aI7F0ue*>A+R(0P`$/@\/;:QgE^<Bj/a at nQ<^6&GCa'T')I%#\n?^MJfH^JBs;r&$K`A&SQ-0W_;(`BY at Y#tR58"0
+%'6'O7I)N*4\j"0k.I^4Sr&@pfFdqeZA`MRUCL*,U0btXE-%1hR;k6(,gn]p/\;!=+g[3XZA]bT[3shq(W;oZ`e[RKUEt2/GB!V?+
+%qqGgQBR"QVi(o8 at L7!IqfOSNH\Gq!M\X:\o[k4L_/aRR2=;9WpTooe*)j;2a@/XTh9:.fe4MX/"YK:S<N906Rf+t1=frR%^oqTkd
+%.6m+RrLDH+\&%o@[&+L,c=2b\JW9O\D0=<)Mmo8LV1u"P_;n<onMBa6Q@"gEF#G]ep;5URrE#2'$LRa=Q"2c0B,JWWjL!dR@',L9
+%<_KX&X'^_S[;#*-Xd40uP=o&^\I\cMApT:*q0"bVWAN4=POD22//fM[%2k>>%#B0B4t2((]ZQ6Y@;gF>])G!D=oa++^s/.=A1fCE
+%/GkCIRufO!RcQXDYth9]10gG!Ns8CtD!M.$0o#f?K at m&nSggNXGIcu1QJE\Z7ch7[`lUi6SVcYGa;.l(#jFX)G4$-1T;;M:-%siI
+%T&u\B?K,J<,4D0IQoDr#rZ\I<b^\$SeRf2Z^/P!RD(F01+IP at kg@E_iB!Q0kcHPTUo"DbOZ^+kAiCB5S&D]Ds6-sg<5D6VO?Sd,+
+%E\#s$f<oRa,T)u7'ngVc"s$e1iFao5:4/@T99;=cj5FKA#[safUdW@<_(Ie>m1L"IOZgN=3+d9j'C$N(.FX]jk=`10\fg,\Dt8()
+%8:9n#mUk;^lU2+/TQ;s"Ai"?s&Yatl[554%@f;ZR-;ZUM1$NEm^P-EQjZ'qL>PmNL<Plb1Y:p.t*F\9@[;9#mcFG\B`1/EJa9Z_c
+%I)_QT!o3)7mn?u6R$gki8_lR^EU,s92_P?d4k6]lH_ig/4k`,GcOFr>jU;c\=Nr/]_1MsCl*"N"3QX3k4+lB;cOh3/MR*'MZE8J!
+%B.^=+$YuOe</kK33ZkoE,gkJFl))NT=$PsA#-?G\HT7kO\^&S$K[NaAlmUDn-STX?kDFV8du3G2:aR?4UPsYcCmtWsR$gOWHpr*P
+%M2E,dk()Nfc'DCL_SQpc'DL\pAp?F3k^lkO>\b:[,!?U"'Ye/e(:q6UP8J^."bA=mronjahQbb\D/Ic%=V<WW6+(Y.1\*-jl>.p3
+%#E6U'43))I:;&3d#PHn&rVX("='OO:GtNZ?6em[R?Qs4pF]VZh23F:W8RACfPJ5 at RN-1n63V<Q9%l;#<bug&tD%gcLn:SMA8=CMb
+%^hdbuY9AV"6Ck&4n%"An9<\=lO^CfI49Penr2e4`V[bK.A"W=!dgUGg&t\lE]d1aQmf3\pTHGO;Q at +2L8=(o:3JZRjd7;rl+$VTB
+%=tn0`munYNM1M03":djm:)IBE"J(_TG;.b3JL,IbaO2#TX;eoY.[s]8Hf96=4_(W]#Es*di5.sUgeR>NE-^7Z,`T-UGGT>T)td*=
+%:"ap01QNgNiV/TPhmN_6U>lHm1($U+@`EsFqIr9_l/2A!FqQqeX=8PU=Pe+F)mGQ6O_ZcJlJ`'rTDs"-$AgA;bG:FOca;jIBuehU
+%%qpd8d%3k&jp#>X+!apO4<G!"6"^,48($FJctEOP=pdY16s,c^%':JhaCr4VROR$l4$gIT8<D-kXiR[RBBS*`6gi at B]F4ciFUI\>
+%$bjWNdH2&YpfW'f-Rfk&c].AB>68"f/GEXXbU(%O(`CWc]*?3?-sUVAEaA\c\H?E2Sk"ab!d.*i(WuE*3V0@(QfJZcnPb_&.n$fg
+%&hldFjCG<V;N>hJC"DI"4;Qps"o?<BJ%f/>H:l!pGlUfd/imhC#ne at r_hr6Q;q\,W*j]fWElNQWf6k0ZJ+UUVc!Du7TZUY$2C'>^
+%lC185Ce]Z-X*uqbd3fN\l0Q(48"%1lj8%EC)[r60H[]G-<^V>PPM5Y=!QC``\MuUS%'8%JCaYO7QN3B'(LQ:?BNOYH3>NSa2k$)l
+%PIoHKOn3/uP&6p?dleD8kX[(^kJ3onA^f"JVn"W?lkXhE.-84A(oYnPXV0=cJl#AHmc6_Kp>0jo4V2IX"J2EM@%oNP:`!m:h$(u0
+%jt3cd%K+q#ikO#Ee=$N*+4Ki+Y;>]mr?XL"m8CRuZr#f<a)VLV\EfFc;m%B+bGG4!7LAL"S.c9`Q7J[AD%q/\1,(8RLR;o7Vr2.N
+%^6l<nHkG*fH1:a[[]APc>:^4;KI>>u;N<En'F`h6b:TN/"85fgnjZY`87B2"Mjuqa%u%HE-J,5(K,lp.Bt"3]p?,5/_g:/SaY#7;
+%S%Brr._#M'IB5,jPqoBb"(I\j>j#R9\,K`]+uAS$R;kna!TV::b.Pl1Ct?9Ih!(/uha[<d[1+--Q9.'XKQofQI,FVOF/OVMoTrm2
+%FW1Wd]0I2e"BuPta?<Z!^*e&^GWupri8VPNgUb^B*_7pV_rmWW]\JS>J<J9_k@'I9GEkDWW1Ko=WhO3!Chsg\WVt<^A.n at Iqh"/,
+%7lt:W#27-G>A20=A9ga8gf/PHT8mPneKroCR)B%)0kHebHq\t?'JB>Z/kp:'.22*R*>iKboJ1>@RE.['Y+7qWMgjgK*\@CEM07c5
+%LgcLsF&+l,9(YN?<]^L0$Jfq"=,E at Cql7&qHr9LGF2r8_r]$&8I$_E`.b%\sWtOjn,k%Y:DlGP8F5')FH/J&(rOkD:A2EkED7=G4
+%BkHOY]UYr>lo_[MVF/25U`Qj:9/D^l_0Qloi29o!A*r@#")(VA:m!Of;p:5!.rrMJ%o7n.o>RS*PhL'%M9\g>L-TF3(E@(.mO9B+
+%m^AiE-p\!MGIm#/o;&YV^#i+BWgY]@4(VF&bU+pXID*Cc]XI_D]VdUcaPp%;,ANW?O=Kb5EY2>="TuBqejM,mHPG6G#23[XU]:\&
+%-9riIeh*PQen(>ZNWb;=$#R[<idRMb6F+D;\%Dmf\>8G`A`g5mblP:1[P%0%^^J.,Aj*+O&m-Wi=KDKro"7jadI]Zt"U8G(F.fEn
+%YUsA<g_15)&l7bB/9cE5`+]5E!:X>nEGC/7m1V!2_"Gu[8]=5\AEqoEj-h"I*1JO6hP$gc3^.Vbn6H?\:&h9JR?8d[V<CJ;e8=n)
+%YpN_M9Kfb5ad_%qr+sumBt(R-CibSEn,leWBB1f\W8Tf5d.DaAflBhn!bLjBPHTme>1n&[C at EOePWY;ff*rNR`GQ_/NN9t\[fi.Y
+%ofOkN_3Rp>"/T9$kJQ!i9d,"iq7o(gOu^(OB^?%-E)/a'1&9`1G3+L$'F(]rIdN`q][CR%)WbtCjj.-hItG#@TFG0[V@*q+d_,-+
+%otnaD"ZI6elqS&Ro&W at tN%5ua\9m,qc@'/c3<gR\j?X_%$U)o<S/-d$WStk67.\)8BX6F6FM#q!Dl\kS-/j3mAM015QID'XE at G"m
+%qo at 7)RKseRRhXpmQ"3-K_='r$$'PJlc[--k3"G*^m!%;j^t1ls:Ap;_a.F5F"&FJEPO0d,:3GNAhAN@(!ZO^>!=F+Q$'g&,YoaAm
+%a*<#tI.Ae45Ck'\KEN?(o3c\eRbW)IVfq?A>R!sSO*&Xi:On!:s.EaC)ke]e:RlPkZL&ea\g=59-V$][)p[174%ITe`WY)"lcV%D
+%oaAUES]0aD-85r?=^L-W at ea%6*tSX)034?jJ]RI?9AYq%Jk1oL_ph7<%pYEn+u(K148:bnrp07p"(s]D=kh<6q.m-O!ak6Qr"?'9
+%>'-iEYE'*W/9=Ng5=RCCT+JN$@bf"M27>Mg#aRKGGVP-aW>Z9./bNl#G=\MT"dBpld`4"bqO)15gClue9Yf4)YEh/9MMm9)C(?dV
+%.gtG2/JWb_&+4b:\?>Os;Q\,86q&2%O=S-thHP=jD%RA39EXr=e30F</,o?+[CB-(,s<848k].QkUd#0k]K9r4k[iuOA0sU'[<iI
+%Ig0+)-)>)JS4iQ!!B0d2A^[ZG7*'D/@DST6*H)ZK0#=(Mjo/Hi#T#8WZp/,pS=CS_'OaFgFQbJ/Eh7kdR.Q$,D4Neo3;&3d=ob/u
+%ZT^f"?kjI-A,SS#[tCeXO?1Bbi;8?cYcfpP:q&)r20%f.L_/7p+`KJE at St>)Z*tOF[@m"oVI at o(&9/j(j;Cj!R2/l`#mEOKh!X`!
+%T_@=IRTbhPB!?`Z;>@9s)/9.+m>gq]]r!,XV2CoLc&X793FLr*q;qHuIT&%S!0hDJjifoLV,as`_1&'*?)AL]"OLB<b-+U5KBo'\
+%d46#t^m=g;%,u=Y;_$M at .sAk_XlI#=2Xo$J3%pZg#raAM4L,.b53J_%QoRZ+`'j,VQF`a2m16OWaG<hZbdN``]d[BBf'3CCUpnC4
+%8h%5,VttC$^Ydl]6NaX&c)[e6P+RTY3^4(aBcEAflGSAZba07+3-TKdXU*2NL$h>q(pOWZFQ^JS`e_6cKL@<;o(,5E[g[=>im%S_
+%-jB'gZ/aD!V=Bp\Ls`lokN,:4AkabJTnq*gE[7>3;>P`V<G4UrkB).R)cL'X>6DclAP_',YnMLZ76Mq45ssS'P/q![$.8AhWcb!T
+%s7+g4\kPYKlOD&b+5)Q=DC]=fbQ:<S at EA12nIKt#p%b)\>%qn(-Z$QWWoUc/$f^sebB1@%J2qf;O^O`CAa!?*!DN:$QM?']P#qG=
+%SRa8>P#'ige76P\lhi.E5SgQmqWo"\Zec03\]m2p,8f:2XDXV_Jr^r5Pi9g5XA]n_f1]ZN4lZKg:M[EZhZIld67TnrUG&W=EHNIH
+%<4R(=G.t'`9rCIB]?K:,;a;]%>pY$pOT.8p]J;EEPe?ZE4f4"MM'/HLTI$N#iIoI_e>b1UB]-3*O^tj2Cp[3)+NK]&<kr?qn>.<N
+%cT-2'fK[ujR6BX9=PUIfq]n>QcaNTI'LP/Q!G$ZGVNeBM.9_2 at 2RVn84tFMWI\H.Wb*CDb1\RPc+_fdPV-LU9$W6iE0RG,8_m1[M
+%A*4Gj*+UCG)li>WP0TQ\@iiMI(72?@/t9q&CX4^[Fn!d;9mKJ$Wp*7Tn8jcORRJJ/JuQ^q'691JBe1pi1Mkj8Q_]\=rm_DCiSHu@
+%J[4/-LJ0I>rY@*A%jN6sl/==ZfZTW?pH9A,Erk,Q7G],_<BJD8Pl]n">7s!uT'rQ6`X6P?gfIs:j9`T<o\=m1H%]7oj8oFKQCW\d
+%nN8oG*"7-C9WkhQF]bVKjUrK'hR^;#"X:/EPX69\Sm0,p$1k:STU(6HlR56L=T305?jdZWS!8/_1^a*_<!Nt4D&mejPOi[q5)K')
+%(KFdF=]t[JKBPYI>Cr?kl=B0"9r5_>6J@[&f*#,pZ?LU8M64hB"W)<]E[ilt-8S3%[#e54N6?<[>C;`G4-4u,ku6O%hG)<%eOg&.
+%ZO-9Z[6*!KMFtsc--%7g4(0O+YdNpF-B1ZXJf]j`$sYVf&d)$!la8!=$sM];_`ZIQ+a7I&M-Gdc4"=DTX%Z+`qYD*&52>U%L9!@P
+%LQ:7N`MZ;C=,O`h`^$-br#(l`O&>`AjQ,.=,*a0,Fajlg9AY'1_"T*d,bSLeb\_XMNkh'QG!2+'X$+!DV`L4U50QgIO2dTdMpQ%d
+%T1b&oRr<PRW2cfI#H=h1rs(f%.$N#al+h*Ol`WR4`1N#pkspb^S[0OsIT.WkR&]U`=oP7/\,K>qeWNU&WBiVg)&h""*M%s8)^>Q%
+%B(%\i7Ph#0TDNp*;J^ImrT3b)\tBO3d-%KH%=']/Tn&e:bG0n.A(b`p2g"PP1*7\LoI=4FSU'YdJN?(ipVRilpW(<^cWp$s;GuM.
+%(0XKp1K0[t+$+<kOo1Q/k`odofD*$@nMu+aY=!SO+@>Zk:M_CinQRQ`]K*=Ue4!.JFRo%IJ#++fH6j`tHU"U;&8q.K3OA0E:J&j;
+%?7F&&_>\ZJ+?k1HCKqHUl:X'smpbRTU02G"-Hc7"0[FPcdm2jp5=fZ4Lf^.l:4>RI9n$.;=9 at 5\d.(P*j&PQsn<hp#qiNkpg3<(Q
+%B)"Ut/%INOLa5Knp=*eg3e*Y?!TQSl`SC>&$G6GqJuou/\nN(h9oVY+]f+CN;DdS"Tp8I)\2?=H+hFLN&UUiQI-"U"EC&KZ$%MU?
+%T_c5_W*V%\k,%LRaKp&\/jPo4'J:?bm)6R"AP[fH26ZUJ6J9!'. at H`.n2!(*&j1uS\0I!ceijk&4&1BQL/2huE:4^hQ.Z&D,B`X1
+%S4fTq^hI#51<iD)]_sA,pdT"]Q4R_P=b?7/LkuJpWVmkj_hH6[J/jtebmYrF[S=!Mc\oND\7INX,rA^<nBIia.a9_N+FTMNosMK?
+%BCc\Lg*m7"AB:)IEaDP!$]7P[1OQN-Jj13XSB'\?043Y,"_?%!"D_mih2j]6Pr*e4CC_O`$J`A;FhL\Q,rYu44_j+Ijo^$Ag:6MN
+%]udm at 0q5RplY:^#le at Wc"*9'-:Q$(#7/`p`N<,,cRn+*,9o\3CUuC[1BOr1(CHc)_a=gnbM/j6!%L+3kd;1 at ZG,]Ed'B_.I5Cl4E
+%M9(>0UfF4ECT?\_gkbHjai"Ds-"S_\O'[1L2:VuodtHYl:JO;D:hq3j(c[jASYBa-bdg"8i9b*U9QQg['6$T<O+5k,$JF at HI*t."
+%DpuCr)ZDZ(^CjZ?K\1V>e6>^=45f3.f]gqZ'A9m_U@>RaUUDS at 2j,s)5E\F8-hf\&otXBn!Eju6Au/_rGk0$IhIE8XEeZ^Ti./L-
+%d?U%mNc%+)+CP2`5D*.6i<q'"@QQSe-bReJi[8)@qMm1*$sMM%"a*cS=*Npli_X6],[XI<F8/Ag7^Y9."#N%EJi4t^q6rKnB7E0p
+%rCC!3kBa$u7-Y1Kj:q"[:3l%N^W.6SJR]\C2tp6+b at Sc0Vshj8IMj7'#%?[QrSs:`,gd6pqOd[r5]"K*h\LY3fdrW")U4J(m7>:c
+%:;FN+EaR&;`p at HF-/1!V-48>-2r]pU5UR/tNa'T+4L"_=MNu6J=*+l8lK-'[W*)P!ML8=hg!eEeXU3YD+Mg?p#F-YVPuG,na_/8D
+%W"I?-4$"fV)7cU4MHQ3XchQQ?9O8#d%RT.O(VFsLefH7dS.l6SdkCN;r,^UeejSCODf`StHp?bC'Em:2e3K%Z+1VOZ,'Q>TpbXs/
+%f(PrbU\rgEV&EM>!P>1GPYI*8rg at C1_Xd[%Z.tiZan(!e+Js=6>aS`HHYWZU-EiV#cH847Z[F+h(n%i:-0PdH2l])6^bF"APd)[.
+%ZAXmGN@$J^N)Pc.4KXFs- at VkEV5S_LId&bsa<?gMn4\"P0VprG6[AY*aJ_qG]EV!k[lATFF=nM<kO at 2*cNY7B;;P+^EROWF)"[tk
+%:f(86;ru5.I%/PK/(s_:H+M,/\OYj-M_u;>cs6Wne$/*(]20F12KnhmP+lS1=-M!%!0Np"2bT^!*'D(31Zu?QF4-@`,9LS:aE`Rj
+%"N$GJP6AL]bd9m#feE(MoB0%*jUh87T=N3]"ll1H&M3*CbA<,u&5[sF\gmZIAiZf_6&r<\?S2D<<qT\a/[sc_O`(O`h-NY.Ia6YB
+%%VkY5odA$c3%0m`G['!a,iE.7L7QTd+V?DYYaS;PpO;>+7*7Ho]>K)5eTJ%\;r6T]KT5<+L3+p!CG(sf<.Mo0VO$!O*![f\dVn:o
+%GuBDmnJ7 at tk18\kjciH:;l1Em)9HgAK$=0I=\<"rgIRY!SDld&9!TND\1;fXO!:>d.U*`ADgo]V62/W!q!TJp7SQ/./5Q+AQfL8*
+%>!3/?*db;i>Z$P[bu#NRH#0J#f'>Z,bmm&]T&-hCio=kMb_W.,V>3iX^13%/@uC=35jBSBF]/%`.)OaumF3aZ;4>WqJRr+r61&&r
+%5Q/\/G0dSKf/Y3j>X+I)^k'sXJ*p%al*T5E\bk23A=Wle,'QYp92NePmn5M[gY2VT0I=L,d.A2AB.#^HF5"Ri20kMs6(j+2hkgI!
+%Bc%0XXf:Q+A:\2WZg#a,I$S\l(Fq_8r/_mG_VqlVY*6uR`f'+kC,=Aq.d7)EOe3__4uja1W/II;UpKpG=N2E,o@\m["82i=Ag`Pl
+%$\Il&/<pT6cJ$&m:geU.k>+5<6%eHCm;bF6q@="CI%),%j-PAUR3D]`jZn+^n\R#^,`O.3[cEVL_.1UAG]@7c>bDtq at q+_5D(7W6
+%9sZ-7aML1b%k3<c at s>fCPIG[R(a,17=A?&ghY.0?'I[LV;TIsVNIsHi0=EU'2U,n0M2_*=n"^2+cRP"ReRV<<[=Nt-Qg]hNFeaHM
+%"=>(Ujq(V?G?Kb&"f^^=YLd3QA%ug_&L[/4:$m%+;SGsV7\=''^Agd,SdZ5D>OsaS1\;sPKKJNiX(uQne#nCBr]0Yq8TX'Pj]XTb
+%cYHAF?5R'-Q?ri at iVdMt^J%E=6aXL?V at 6YP:ROs:AL584r)0DH'FB_F/s,C"jOWeDa/W?>NX2YnC_a1l(/+B5s8L!b7!CKP]2DiZ
+%1A,4i-(blC7erle]WDfji`8'`X5Vl3'128/nl%Pto?EsWFlYqsf`-<$TR-*4bDj4+jut(Y&6;A"F<]7sg`<gSF3/%iW[cao11N+K
+%/HoF$caI(sl;k at +U6<HX*;XF-*$BQ#W!HKM0qcuY1a`WUFD<%.\DGpoV[Xm43,_80LT)tM&<D-O9Cc'FE:TM9GRrrC[c>qf-_3I[
+%PtAD5kBPl]s3.;hBMAU[:CC.grsm[<VoF=&+U"4.&rcRH&0lq%)b?@rq<Y`BJ=oES)J)`(kkQElVt7RAQC9(Q[9act8QqVY1lp1i
+%BlcQJBeb98?>I_JASU\LZQ at J?>7/Zjq7%(oG2MmX410lU_2ul8ji2SZ8/s)751V\NfQnfr#8+%-lD'lo>co0,V;#04&Tu_Y.:+8l
+%/.UaAJ^u4Kad"0m5ta%c.1cC4`0"bsoBD:sQR?>+ce$le2ssJe[;I7G>EPq,7dFWbI?KOfSp"R]>H5&K+*oc9Z153"]W8WK1b)Ll
+%EU[^%lQji#E(<%,dL-(7k_3qgA[Xt(%r3p2LbsVh1 at QUJNf/#BgLl0<VCf8a#`uCLca>uX8HTQ]]HsMj(ppjPO)(;N&f;QI6:oao
+%>5hS%mtF]+!8XX-STe^.`"P7el]P^%pcb\&:YLCIDu,,L-F&XbT%=dg:1 at n-)ENU5L;f3&qDLbN;r*>DB>\0cmNL,EHTN%r&A+,g
+%G713gA+nuG19LRkaY=0R-YpM!YNB!?-0GALrKX>^fuqql-2eJ/A+,Mthe*A>i08aqN`9CjdeRd8:U[ZN7<jZJC^?1i7#>pj#5KeS
+%mo2DV.\Clu=gPm9TJ:cNjdkJ(GE1-V^,$5+S`8/E`bih!]3#7*ZV!(=f!RlU\bJUsTAF#uah1*$d2m':>_m6[r![^pMU*XdOGJ8+
+%DBa.ZqMu-,65BMY]I#Z<f^,?BZYIaFhntnDpXbc:BPbraWe^d?P*<=l6'l3qSGGk3l+uNc:QnimI1'X/RU0rX2sJN)cfM)?`F]K=
+%#tWs05Gq3$R0sL>.;Mi.n>MTC!\ZWXHu]nm+l8HC9?n^X"#bpoqp:UPUli5=M[=GOSd3&MSn,6o34l?5Pj:.2#Ys81P(\K+!b&&G
+%;II_0R;,(?pV=N;q9p9WrHtqH[$7ne(Ani2:1*kZkd?tN`V!K8O'2BO?BI.E\Sfn"=)H7U20,PC>kkC)>Y$XJ!ciD<SmA6.\')3+
+%D?grcB("/*rj.7aN2GI@:I^@%h1`XQWj0jCj@!u\,WfgcgJD at QZ*9?R,oJIi[8H2cc9irmM7X6*R"@/<^O>P[E6Spm=JhGa6^V=\
+%EnTbIL>ZeFcj"LVEpN=<&%$5S/1LHqVPE7t>@tD-r]M%Oan%1S21YsQGR_GZkX.J0QY+-Mq-tH+I8qn2-]^$\Y3,F0M(_.K5ng)l
+%3+4m0A^.<gTegLC7*.7P8N#ZRD@,Xri)?AUSdJ'f`06\O9Rn!6W[f6jO9#gAVl=;.Xn[JpCKKro>(8"2;E2b;JQU5f?9:.q1"NZ*
+%pZZ#AqMQ:AeSA at 9Sofd,S?hBkPZ(p,F-Xd`i`%,5.(FXEg2`'0XYnitM>>!!M7g\JS[j8;dnd..*#P`aY`jo7:.?=YD"ahlA#DCc
+%@oL^L<htJ!]u^6hD?$oE\FX+&OHsN\ErTlc?&!9/bd_lR+ at 0;q(gLt@\mdmQc^@Q5n)VImHNl>4L'=73pMJ'/r9G=[m\Z#RUr!Ok
+%8D#28%4!Uh at I)(H7YF%CSn5FTEYhaD?5ka&67iLf_B=JmbnrYKruBkM`j\R'`4;.e./=L61DQ#o#Q7BJ?.[ORU1-db=6n$uF!dgF
+%.li</^c=tX\>e3a.B!mn_Q]$ZX<r8Ar5B(,d-'$BB>l#196D.hBhe?sE^,eVFe^r(.1[,HWG"jEJubC'fNf9+1cuQ0]UXP255A+[
+%K84cm9c#rY4"-n#g[eAL&4uBMdH7%NkH8V_5<d>nIO>.$TH;\\XIVReiBR::`gk1XQUSbQV1)06DW\[WRL7NLX?5sZ8mgjW#s_@#
+%4f2IZ at W5.@$LUk$q)t>SWktTK5J"1Mo6.A<Ss5HQfM?N7DO]g"B7H>=`WRmH+pF,=4U8klou7&bS[dTV-S?d1W*H)@oe at f;.qZZ<
+%Zb2A6kcD_q>>MN9-NKg- at I()?L&qQM)m2:,esEULT]^E1dFXicUEGEkfuMAg8#g*UjdaMkA8'jc3PHglfBLtd`:03l3I<Yq.,6Bp
+%mebb]Dor$\[gu9OKg7g`hVK^Rm1tcsj1^<'h3.M&%!Ao^06kg:DM8nL6&'c#qIpK7-)m2.;k@/a`a+`Xaf_(ahK1Y9[So8)PJ&eG
+%Qt0!.H3&R9\\Q^G)crp_g4\G'p$$g831;@Z)S!Prn%,;U2!$"jFQITJDDCVU#SeYh.UP1J at D<Hd8amM/l%')TkTQha)*Q$HC<pj%
+%9<R3$Jfc\kD=<^k1h'H4BAe"Fb11ju7t,q'\c7mPK%AX7LIt.;WOJ0=+Yk%<?'M-9=h]bX/$ZGl84o,u`#qX:J%\XX`1Cqtk87h.
+%<Z:Qq3#fo]A%F/Oi]Ob8KlVT>&F,QV2_",A;/Q&:9V(MVPOlmh+Fasp at UnQ_)J-;]"50pA:<A-2L'noYSf;VrA6H;IeDiEq=\tQA
+%;\'aa%2AXu_hsMsN,>(i?o$n2`K`iFm4L5ci0"U.ZD8C+](dUqZB%14ORK'?Tf\^3p_^_onpSA)T<8/-][C#&.tn*`Xj2Wc"U6\U
+%bPWG[J&!TIAbI-X!!ugNYMYkm/Q_:;8T6""o5WpMg3O&DaLV0&jV4,t`,6b#4BMY_^-M[%*:([`'T!I#a&uHTat,]T!2S<of7"7u
+%Ra_&%>K4Yip:`ES*XrhIWolD8RlD\4fV#i%ftqoE<&unK!J\".DPX3'^RN#Oi68N1!i=eEmtLJb:BHq>f:F)+fNXoQ,F?+)#eIFL
+%]KLR^O*1B"7>g9S"I#MWRr$:RohIKI\[7"Z5e_\RD"%k3K0-`kPnc2EWJ_VoS34#f&e)dQ#EI+9.LaJGqOluXa at 2ntT8b<u,&kZ+
+%QYn3f[I%7:KePDVQ!.uiA$VfKU=A:]Y"47[>038Ma8l=@'3I7J[#1uLIUs#b5!J/G+e/"O?peL!\0iRr2k7PTUN=%6b"@m,`5YP_
+%NKdO7!>Z*e2qYYpSF;Nk/3'fWT>5YRZjOmJF4.7fU76sOb-37=*5-YmG1bZg`HE/VUc8]>9$YU]+oPbe?h>j#`TC<nG3r4h4KMJY
+%r+YY?5(Cn\W at qni3Cc,+g'kD7niEqdTiu at b@s9D`+C;/52]$6kPCuh7gTp'eJ9_u:J@@ChNFPPqCeYqgq-tcD]OpIAH*UdRJaQ2!
+%9O9?lnF+t\1QI]Ra>umVkE_k"QL/t#LN-shA`&3jo<Z4tK,t[4L=:IW-+?_b`(Q[A?]L[?J8E;ZVQ[L]q+=]ET/MVJdfr+\Mf7]Y
+%o9$HKQ?Fq"'=:u?\0go[VgmT/hT.S2a*#g8ht+7='#1EbW>XM,fHkMmq;e2a?RONQga`sLj>o.Ao!L?7"^UZ(Mhjaob=B\]g^C70
+%S1iW>B*pZS-Yc':-KB+.q?&3q'%r\'kZ32WT3+RaXsScgCh.&2gh4X"UARUfpnC/GD)<&CE:(e,c`=HoPOPi\7,q239Q3[6kb68F
+%GD1$S92J/c9CfmYs6eLVZIX;sW7-">S$RORbtZTMgPt%s1>#RT:\FE>@\M]/1]nsOi=rtVhr*g"XkFAT0HMh7:A=Glpj'D:^4\33
+%CsU7_3>m$*&m8MA!0pfh+S3>XHaSiPodPa8;EVcMQ_NXq,q:Z2$TQA at hB>tKdg;ii'oJ!"U-7!'I4XiF0'iHi+o,#p"l#Zk1Oikd
+%8aQgLTCfcPTr*V8U??p4;]a^T[dL(=_9rW0WH+m<j(g3k]6qp:m\du:K^jDT!!TMeNH%(\fhDSuDo'eYJmAB1N`e.#rgbq#Z`%&h
+%02?$ff-tX&N;K.cEMQ-)b--APPPts.XcqD-]>$+f)dDgL;u:BIEI:Hj7pIKui)/jS;^EkoS>Qd9=XPP/D<&k_ekTLBp8-!i"58pB
+%o.fg\B^MN<p\QERraHDo!B&VlIVZ]N'lAKHAN=D<^)oNM7?uf_3`RUAG1f:G&*/CHf1X]of\?Ytcsn=oIG+).J&j_)<)0C0oh&)&
+%ZWT/CV:I^FbN1A\U8=IB0mucu`bg at ff/Y4H,ku-P96clt[SCC/_G3mi`oCXJ[u_$XG]d3%>Cj9P>jPTl)TnaVM+2lLcZu"hALIqM
+%0Aj4YaK#u1C-fk?mDs@\H1J*#De#/@VK;HH/X>[NIQArYSmJst`7Hh-ESrDrp-[3fZaWSONd01I:AJi$?H)L$3T!D<k<XS\peAdZ
+%2;^-ikE<-6grK^H!j27!gPPaZnqSYQmYo01BV$Y,>$FXVUq#p3F&#Jgd28I3Dj<BJT1*?i2`645qJ#=8]L;oVTfP]/b":T8R0F$S
+%bt at Yc*8-C_'5`Ye@[u_+gT6oG)oL%=QZp<A['15OLuprdni[G_kc$W/jDV#1Msd[?QSfnA/6o4$K?g($F.VR]I'I[hM-m_[Q-M,E
+%+L-,B`^I6a#rneIYr["CWWZK at emZ<uqXk/:5:0n0,YY`/,,E^a/]"]jki#`b-df6,\con48I$RH=;P3?bg;R5F+akafADMLUWL81
+%-9MqQO,\i1OV#E%^s(OrLA[DPgdb`q4[dur[-s23N0;lg_2t2G:n[)>ZP%](pc"7to"]G(fEj'._$')#:T`>M:NNr:A-IE%e3>lQ
+%nk!>NdOL;LmM)UI at S)Xt;eONl?P;GL#Yt%^M$V`Wm@*@.gksJJ/3IikKD&N%X[/JnL!ji]h"$pi=LdgBaW'.JUa=)K)-Q[0ZCNJ5
+%U/iu"YopKOe1P;>h]uLtPrb%";L_l2"Q3uF21+EpDfEci`/u$>&0?tR7&(\AC)^2K%mg_jc;$';8ij)@5';Sa_2%qCYq's"P at GDG
+%q)j;b91qqo,*Th1S[,ZU/YLN3>2>9Fh.3%OJB#qn;/P9*1lt:#U#"gs\%C`ekCs.H/`Pg3(X?/-Y.M3K$$Jo,M)6HDdZFK$AG_P9
+%=A*/,kO[W=;X#F76c$YQqr%43T_'Bo3_*g<:Ym#AVC/(uD!uOA>Cfa_=0hVoOW+N2;ck at I1s5F+aLs,;$ieh at mjO[=!P8#"/kgRR
+%F at a/<H,*W0+Yh4U-FnZ!dDhFVKq',o*phaIIIMH0o[@lUZ"XiM8oUA]])8naV^kU^C=%%&-2Bl+EW(h>Co$.]mE$%I$TVd.*u=AZ
+%\d4&86$RfL[8>*Y;GD>8\/*f<\lGXX4kM[oK0.\ECYkH`ndDi2B=2ri7^cE7^L$$pNbTd[jMLR(oB]A-!+uBWs#&`s+N],;]Z/G-
+%&e5m>"+&NVA[?)9DcV7;_iN\i at fRfjT.4Ku2,)@la:;[)^R8:&N\Pi/CNArt&ScpZQ^>^hHeM(N]9.[+SS,#!A/3lJUnAK*MV%\c
+%3q9<ujk5tclFpR0cq_B.:D\kr]E<L>`S/@b^Sg_ea8"A3%Y-(99c[L;%UI=_m*5`TVC'IiAh?:BCRIi5=t%KJ_;Q=rNJINJ2?/nW
+%ei;C^,GA*pWcGR+]pLKOV9XuGY.Lo>4VIbVC2+enIb.<@EptHudG@(1Ii.u3A]3*kGE/M&dFi3.2>l]:F$2Ht9BCVF%i%f?rY\'V
+%h;M/dZYY2[R(on1>>D91Ch_rI%TX+V<,=+<:H"*//05G2"$H.Z3kbHX.jGkV"AC7ZRo4sRlJ(%1GQMM=,P,;MHdC1\:kRq%j]-E(
+%YY.IiaVU_1>(XN(mcb=.hlK!(9b/Jhi1cI\4<@4_I"H;+o9^l7SJ]Xh-k$RG+kH%0(RBlVFmnT0Vbj\HObdW(0nE7t](LiB!5mY$
+%4c$j\EXVd!l!R&Rq+u#d;TnN+8\JoB=X)?:bfpa-j]d(Y(u-LCb44ap7,mX&#alDXq0n9,3/D`kY-1cgBW!j.:mkN$,f4hK.99Vj
+%ILT,YLAG=s+pCL)M[h8HdCBGQ%]S"(\p6o27 at r)4G@]B4B=!s7%A5b-b#6O\DCb+q6uU at c$,X>YV`U=,pmTf]\cMc?W.E6h"N(*$
+%.IFM2;@4^Gc(g`WT-0o`p)oUchj45IrfY]II$LZG-HWR?)S^dOOXe(3d`*4C^\ag.C+T39[cuFu-Ys#EOf=p>hWqKaHBNqNMs7b"
+%8ZRi=Mo(MhSE>7J^kQF[DB"b$rB)p/:?sO8*(,sf4e6PSLK.lF'.Z$W[f00TaJMgii/-TLeg;g,$*=ISBM4t?mU#J]bn(h#q5Q<n
+%,+FJN(Z_-bSG_<tlA4bWDOWZ`00uJ'/6Lgo!1G:/EcG/.AX6^Ar&NkJHO=$/4pgmA%G'$lW:OQ$BBjDPe(NSJ[$\1VDGMl-50:P8
+%HUus'Vqa_tdhLP)f9<QiEJu0DLP'QTHGTWde[YZ;`q&\Ibr'`j%Hkou6"_93EJ>DV)TuAM:Wgo)h:lmqa):L at ej2p]2UgT9_ZYPP
+%"8rk=pq1V3]I5bq?OGX0?)M?BP51:OSQi^J\k\`dXP;ka7q7?u%UHJ1TM=HdOCZ6Lr/(Jt;$*C8PG6X"Q6gE5[H+C'a+Q?dhBo-a
+%MB^6dYP60e=G<qE5TlCIBt[V`5Oh3Hb+i]i/Kj1"/8]X5`J/ZOi=VmLk+2K3)'<FZgtQA'S;;PZ/^M at 3Y%ZqqR52&JI5uBr]]HA)
+%Lp]<al>\A)ah3R-jBfkk_,h.n2tVOL>kc82DV3NVh^Kd&#oH+m]!T$FqNZ%Z39.A1r1"H=/T?ZJ5^t2Chh at I];V=>$[YT"k0><&C
+%7qspuJqgfNSto-0m>S&_4#.4 at Ei+!P2 at be5p(.9'WL7a.-X9K?ab-(r#aH+,;NLhJb*&5e5&8$Xo'gLiVO"MFd#!a%!_f?]NoIMl
+%f!_*eNAk#ri60_R/^)l!k0=r!:!Kj?iGW5JDKe0?Nof<3WhuUc*q_[N/HP_eq4D_hXtWUBWMq%0`['e1GUHM\STl#KYqs>*Wkl<J
+%,jm7<=O$LkF*Ht79G%ah0.5XP<??FkEg]lXls^UElP*lH3!IDe^X]=bE>SmR%kW?-&1JLq2Q/Ra-)>/rAu1QPU at m9Y7TOs[U#EqU
+%PB'*P"!O(__m1(FEqJBNhC"P!OpE$#>i9Rof1,Bl(!C^>HXU$O-(9`Oc8er$D?qM=oGpZS-JueHpO%(j=!$)m!0f'Tgja\%e(ZE.
+%qR*rfo_(g[S%n.!nE]Ml'Ac+jRTV)\No/K*qZ^sBRjOO-Z)!E*DbbF:)[`-+'^6CeU'C:U8U*uW!@4tdLU&0[CgAQ2[r5!P8VRT]
+%c3rL?Ll/-43D8F/SLdg]e at I[.2eQs=YN7M4\.`Grlp]5De7r"VQsPjB>d%l5X&(W_c++-t"=[Z?_Q!</BCAXq"*%(gaHKfTalogr
+%oEY1#4NsD"P_ha3?bbLjg7ap=Ei#S7]K"Uc\`nRt>c,j/@-(U<V^4XVB#pT'+A#bZY=Oq>\%NJ*V*S3o$!++_Ja=Wf:`L/F[p/09
+%,rg3X;\pRKOZ,f<HNmi.f#LchkKmj,+ARG5Y%L0_hn*dI9a3[I.i'U0O=ro at m:PmN"80+mT#ju&2%@<m1LD?fB?C?@.LCn='1&I_
+%<qZ4b$?=o&fY$mlD:*7]m5jrYqifaT-BdKQ9Nq1%j6n3RQACn(Wi#PQZuXf>"Q>pYRZ)4^D$_F%hj]!7P[qo-ia2LUd7"C$3E)O?
+%YT>g'B)oc3(%cB(+.Sg at dT;DKK[&VCPq*BppW[cAF7n]Zm&=Ed%*HO!E$F`"p:9-CXB`KHP61^t0JmE`SG7q)p[[?Ze,@#aQlNn,
+%OOQ6KJWod3`)hVR7P$^kGk9E<gDl%R3FU#gJZX4SXE%2T-[ZuBU/F,8RuVlLe$ScUNi&W at Rg"&t)'Vd61.e2upP%41k-:4C]hF;:
+%CG8p%/7t'BBZT!7YL<$:>DU[r?VME@>)I]g.72/3`2nRMj=3&`]'f1!2g7gd$!TDQ!R<%LpFh(]3L*Z6dnZ]?Q+uoR7Wq?I-i94i
+%5u%o;Z/.IR8iH'ua&[-*W%%`2esrO_'?F83h74LIBjA6d\o at J&2AOft\JT!t$S[k_aFufZ0@;Vk%NSD&kF>3EfDD0XS(rtg]GRc3
+%$TC/F(DC8N at -j]1DG!O-eR;$cm;*06.K=s>RZsP?jp+`H%qNj0g4!86\O-5VmL>DE=6J<#S)h._U0^bS*]]ncK2XFHE``LNI2a%/
+%@VkKQpl]JO">;?'2Xl^aj6ITd%M]GF'Q[QTXj',Mr%4&%R/*C-T)[kZ?<RV-+S)a-4Li-R\E/AtN\^%je?em;rZtu>$b[i^hT7If
+%#,aa)$f7IfR1u9#Q3-9TOh at T0ZS^$bR3tM<>E8 at E*`S*iBQf#"2J*7h#\!XW)>u*E#8XpHF24B;7%6&8mP%mE@$0Ul;]YqT,08f=
+%0ul,<2<e,#J3*4bdeX^ZoAiZiMKr=7Qt/7mLG%0Q;KX>c>,Y)^&8]XT0fPW7HB,`"FS$HZ2G7Wra:fGD"*0^t0$,:bkq(o_L6![>
+%XUO,d%oh;hQi;/HY'm$h]7*[cY9CA2P?;mHOR:cE/IQQ-Y*,ksXR\UXS$mb163Vledop2;BGlnO[Y..\&f.JM<:=Hc%Q(;"M4&%&
+%T!RTDRHpca0j_:XL-&+iS>>D*B$@uN+2St6N5fmu7agBmc>D`+[dt4XJ:r7Q%d*?d*[fL8m)B1B2F?\1E\SeU.cVP3Q at O+q`!NL^
+%pLleG;^QBn@,3qnDKb3F(,hpEhR6jHlH@:O(\7gaVhree&$M,7JQ5g:VKPj=Pi%[cH)gW9?$ROG;/Ooi`6J8%qb7JaL8RDVVR)AU
+%1 at .+/=RKZ3 at 5ihb1)k0iKj/TD8-,2AfrO&/K*$lG,'fsa;T^fp%U.lT1dsf,MM!,8hEmjIa9:6BM*G&p7=2%dIf30 at jjR"BcG5%e
+%^j=6oTKrDc3sn$o!FaiIO=Uuh.k+_%nQK3hk$%0UK.1^u%'5U"@E%/g=![Dt$_)`jl@]*'$Kdo2:EWHHOkY/X(/C!XX+pjA-RcS-
+%_.*eC_^,ob4ZTk%cmMMI"i!&&^?:u8c+#FGf^sa<(Oj`Qnfs<Xo"?r.VAT7RP#U;\?6"Ps]7WB>c at g;aCO#_"e<NLlWA6/#N0sl(
+%V'?#"4LB<p8B>Kmg>o0/HEgnlBEGn?5ZD`OIJ33>YgGB]X;u?DR[=^E9S4T-L2ukUVS9Zudo\`..861]cHBU#nPSNaCcUo0EO*b,
+%U6U0#kG+k/Juk*L+'@U.]"RG$<JheW/mS>F.[/qlROAf$^e]hN^LLctCJ4RG.r-*n6L/6YHUoOPqIjeP[Lr9kfnUH97D02&WPr_(
+%H6p3i?&VgQ5/i\'FV)[SQ$B4rYD at sXP&^%;Ppq=s\uKt^8c#,KDCI/h3(MgJ'AoX$$BK2k"(1a/mJ6:cGo34[=AtHZ?C+k0U]c13
+%Q)@\0!'M(7[$5X/fBMRD+Sfpt4k`V[BDe@^J;$HrJlE'q at L3Q0XtsG\[U?uLVBf7JarS$=WU0?oh&D!7k>7%WF?[VIc>?""%P)27
+%9?_#AVNjE`p9L0)Nl&3ALn,H,9?MM)2DruQiF6d+jDF#"PK1f\d%;=^T;`;dLQ?3WNeOn*Mp67iXnm1e0B(*C?UFFJ>.]J21Rk3*
+%Q3sS*9GfZoE/D=o$!XoTVck4pk'`*6)nGJj+/p>r^OIc?8W=!,itN,q8!CF&?K\`)P,mT(g!&];9)d54 at V.i"\,Dol"paa[)G#?d
+%g?$u(%J?5a`=0ABp7 at BW:8fV^[b/\s=cr'V:V'qVEKW8Ip*cau*W4^GF_f03(kn%_&?RIT4LIrWS,D^Urd-9F@[SA]2h:1?N<t'B
+%?k%.k8,Rm;N(.h!l)CI&'fT&HITGu!"`;sqY at H"GIfZ_L_0dro[3e2nAOtNM]lp.9;W!cQ&o*OnP9;M?/8aL:MANAsRuECa]^Q0j
+%1_Ii3;f<!I/FR].e>e#B2#"0kOa2KLbu^>*j'4GCAb.$;Z8DO(,C^plijN3tiLLUr-D57If#,UYn&bGfI`R2$]]aA(od2#P;BZm"
+%f5j-Q;No\r8P*:L at 84_gXu?NWL)!i)ZH'i93<bmm)M at OB"r]O7d154f:&MsG;"2IAQ-J:%&l'O>WrCL]b3^]=Q&Vm.ZCnFtP0_gL
+%S(0Stp-LUpA8Yf9[fu_Di8b0 at NdN8ti>&5gAu%ogTNmSi:"#3OG`g[a5]sd*V#7$\OdUo^@%lH)Wuj]cUj3pQO#;FjHA57-GTp_>
+%c>P1XbL2#%:k>N'>6LkCK2sjT;lDk2bG7*@_c1QuL5/OdWH&I=>k.r:ZN=MIX-d65NMU5jc3[/_\LDE4F'%[r_K<0%+%DRjXLu'?
+%#MJtU_:1X0)Jt;HgZlbEZMnU>M-I7qC&jLeR:Mc,99f7==)a<^'e>Om3F`j$*]CJcm0JQGh"WFdfZ>_ at 96NCde:E`2KBqrF,tV!f
+%R;$O`$+3g>2=J3rCBXELab:f<;3"C_PD%BRR)uXE^(&ZIER?0tLsAc5]Y)G,L<sRAOC$+CGYE^S@<&p'per,3Wb"IG>E3C>-/KC<
+%DTBp64hj&h-ah6E3Q1'0/I6PL.EL`P%W,`\k)!cN"6^[f!<p#:B-8>97]Q>a(\QmqG323VVA=J3V!C^f[YnV'coV1"gB6VWqE?=6
+%\Hc&Cr#,n64*Thd>.WcF,W61ik2Tn07os\f2$aO2[G$1!?^./I-o at 0=6IWr+<HV.[`1sEB95BZ\F%AEKDocs+0&Dbp5F%Q''TM\,
+%C>FfZ\iK\,;A'Kma<_#\a1 at D1a]:FAk0*6+47XRt/h(3iPkm63n(O]"=`1lDdQjcN2DG#Km((@C-f1ojMYpr6p-!ZF.XL[9),2Jr
+%V8aZ0o?c at HC9>tG8!B;f_Qn^_m/\.>X_JL(8.`0FUH&G^rAfo\opX1rh$kNh=b6eZ\h9GTr/h at V&Pd#r9slB_q/lY1PiX-QP6oT#
+%\`Y.J3PurnEsdWaa.Tak.Eka1-fp2G,2(l;.`%!B;a\F&`3'4A*kU6dIcb6B\NRt[ZmuXO:7#qbH*bRc(>$!,4F:C-cN at Tes-3_!
+%LDP_`7Ahg8/g#eYi!>o+ahWaA#;8Zl"Z($&?]!da1orcb#JVj[/m.G=p@@!W*!=bBdcO>TU['1=VZg5Om^G)ol7>eN@>)EU'k%<M
+%fWWTTD;3\Y3`gO*gm.];AJc2u\ZN\J8M]Q=!b`(17GH4WLZZ`#3p%kdhL"Z%l<mhI9!UU4c\OU,EW!Z3Z;U`ui+B6bVlP=HQ,WYP
+%;7S'CYAI0cJh`$5bBpL2<lI$tab]cP<uYB\0UXFDBt7-f8@%XW19J8O at p;uq(;nfejkd9O8gt<FIsh1/Q9<k+PD!Jq?n0nDa\iaW
+%<_+)NjR-2.,//,68oJMTSnm`'HZQVnq1ZO%nnVH5dWPuS]T\!u</"ii at b5n,>CG\ULL.kQLju;WdGeO(d*,sOXV4F/%:8Mh[%'bh
+%Vb(op at IkS`/K60C5bCrfUoaH$AhJhWr1NuW"4l^RQg^G"qf)'!W<eKL\La?(,2qo6#A%\0`-':+>FeE)h=hQBTi+OH.Skir.B.1B
+%Gd3b4g]SR?*iqi0W"Z_rM(a?hg]]7Qc/97_F*&I[O)l%BeSc)T'+"+%%QsjY$^R4IDPVZ,'5n5UWTX(u8d2M![#G1l6f3E?EKe]b
+%>ii)V`WmIUn,/<C=h=_A.pG8)]Lq['jL!RF-*^*_"77Q-N/H59.c0X9;+9cnn,7(XPEo_UZX4+CRYgX#%DMG.0,fSCXg)`^Q,rtB
+%*0&*"oT\2](peT\DB/t"f`"V)Ze!ShRGjjoQn"-c49bLiAHn8Fs$@\.T<!n]*,F.[,ROYVMeq`BU]>+Vk:PS[@c-"5h_hN0(6_cu
+%#,H[I9EDUBGgEhQ10gp*?h=b2W^@8:p9MmQo8K%nl\OXmNYJRu$-K;AM.K76d\nM>i-8T%bJuQl"G?+55#1\cWiL;T.,K$o5t(-G
+%cnJ3WEHYZR<$h)b7>?Yqo*DH/E^+;O_Gr3X6d8B"_tgW4=o!iX-hp)Y5m$qH$dS>)(??)J5AoT=%X,.!C8mkh>U%H8KcZ"<:o;J2
+%5PEt$8T#e8o6_')rXXD(fWJAXM>LjX2J-s"l$ZCOUt1K=pRr#s+KB*aOZb7][/JnNpH.dQ3"UmV-At$UPqp$T,a0)O"T8&*Icicm
+%Po+,`.7.TZEaQr%*j'R[dA)nT,40H:ilE6b\M8q#/bN$LG"?M1Z3QdsW-fbZl],,^poucKn-2?(R^jlsOHLJ"=LrTJknu.I;,U)N
+%jq8X;`0D#SM%Dr4;!l_S#)sc^4QTl6i]08u7TtSmb6gk7%e^<:'nXZPp0Y:WUQ"'tf^FBBO2cUt-6T,l`(?Oj_MG>qf,XL"5Xu4h
+%c+*oo:jO%#G\)![RAH[*7fMV'/QKJ*KVP8OUT[Iu2tBTHg]OWAe7 at dS!Bb(&$odL$XlNjTm$hIbBQ'.#LK=P](9s at A+Ga]UN/G5<
+%cSE_JQecKqV%'KkFg-b7b[_'1NhX<>FSN-GE]\DcFeB>97VCbI2`j0M)t(TP`DLADn_uD2d7cN(>l01`qMiU20M`DiUZpiYoh!J/
+%bc?CaJ!'Y-?HHoZ+JY5p2<#IrV9geA\\]@V:M*:t*AW3b>0Ttq;FJ_;[CG?s[ua/Hj,QeS9;S>(nd)FG#tk at Fq%[)sT!;-R;rk])
+%"e$A_ at RA[==6b5OSda'=g-A?/bJ4Dm`M9ltd[,BWUINRR>$Q8G.1oIr6Vb#2l*OjV&q*FdDKK"0OZ#RB_k8M'Zmk#,f[U*cV+'RY
+%Mju2X&eeDYh5C`af)tEC$7Mqg8BD4s3"dnlCijf3d3-ooaL`7o55JE>&2J`u'3Or;DZC#_AQ1mB:(0C9?Rh8R@/2\fa8qPnPV-lB
+%LV(Eo at Z%MiF#cpiR`RJ9aE>+'hJ(NNk'C'F[CbO%g=YW8,"pJ'/.?WfHk=r,%eM]1?AK/19FC0'l4h?8WE;U>>u&bBaIf_Hk[Fb5
+%p3ft/S=75Zh=0?9J<r2>[p6X*OEDV4JmDM?kr>WUo[k9g\O(f)lDN7-JldXU>YZ6-T"4L"Fc?$5L+/j2+G7`dF5F>Zb11NI):B]D
+%<`j,NisBaN`W0jJ;b8OH/&na[YIdb(\S1I;iP$q(GZK$M0iW8!ae84!a-8%Y6HWtOq5ehenjV6r&k9RK)t`81Bf(@s.9qMFZO*@6
+%k^1=<f)rNu=^XBLY_CdRC$hToTTCHG[D-GnR7>j['!Eb]p,k1bCh#s[TVT1;hmKAbOu&B-AGQA at rlCkiJ<oF`NF?'_"u\4M;YSm1
+%-n,luOVVXKI,4OU*8'@N\?Hrr2Bme4Tho1G1uI+sCpO*N/2/k57X3nmrE6:Yd3<-*<Fe]d"?"(br^0\<XjIAR,[2[e at p26R0@7eV
+%)Hof!69#C#1+Cp4CTgVQnm\a_KjC+Dn3,oU^?-,8W:W`.8-8H_4fXS+.?2M-02g<jMFl7Jo(B0gph+jU0EngK$Rpic01O)fng8K=
+%ck[!M9!3p.I2J7TB#@0YNOkMtp3:UNaTuOXm$4q.'4Z at 0[;KY-l$Afe.B_c/BeTdkZ'g'jk"3'"C_k!d8<)Uca[pcLoN>E68a7-b
+%b>Lgf-Q:!;d]:<N*XZoiB0dkpBL/7`g:3GCkb,)?3N,E%UJZ5iMi]tUrLD5+;u[qJK,BtE^iTS!:s^^t at 276GeMH,+e4_nK/D3=o
+%6hDdDS)<:>ctoC`7j^]&K_uXc=JiCI?cMc;[*=J!(#mS%="5Dsi$.Q8L)e9%Pe5]5oEiADHUGY33pHqXdH-gZDXJ[76E_g8<BPG7
+%KW6RRW8o;k'gsMY9'+G<8](O1DpW-78#&_ld7IFpS@[/jlO9F;d9JP-egOPakYrk1C-Zl%6Iuo4rNXF0,A"6^'atoFjo;,<L-5)R
+%a!%Er.:>sW62ns'd?/(W1 at W`r..XrW6kZk;<od[g6HASn_UtmS7"Kn'R,eb.kF/!9OcF]9X/jWn1\"a:_PhZe[RcQK2q[:"<2VEG
+%d#C>'&7..^m9H'gB%4PP`=2:^(nR60ffec'A="'O8;p(&9kd at 6C-,ACdXfh-#_u#APBjm"S/@MBNR5QAg[7Oc-'$oT/#1T^O<?3L
+%Prtru%CW$qaB-:l&82huVVoth9]pNsa_ORKOI]:S at l$1(V`k,[%156AD+%P_g'q#%,PQkZl8NK#/Zj/IJXVPPB#pR'YG272FB9^%
+%&I&Y(9SoRY1ht58T+32.)^\?pQ(ji2TQQZ"?:\G4no\k=5:rn/)Ms;,`jZ[:A;q>V=m!]kLoX,c<eXa5e4Itc%m;>r'^!Qo.OG@]
+%V]@0l?#+[1,^?dKEDKrJdoV?(,Z%VGMm'Jp%FPQYf,/t+CrYFG0^Yg+U`F2q5JZ/\MFKXQ=$8=KmIGghV?[Ui;p4AOc4.IS$:2"a
+%)KES%&gL;*"%LTLHV"euPq%o>d)?l>h[Tt\B558UY"DJgc-X8?ZZjC2OLNq$EmW_k/==[6%i=r18ob)cOqnp+`046)4)>r1Pp)e5
+%cr;rj,W?4RPr9-9hPkO"hL^4+]X at CK#f]lRW5I*3n^ig[N1N<tdPCCW,ZF(9oY6YDd7kO=abWZkNAf`B/Nkcg/sl?n@'(A]R"/j)
+%O"#bg[&(0/JPN=,:JNMVoEqX>4WfN!_6aoejUrC;6O[a>W^Z?1f^:GdA8%?(!5g[EK:7@*dSqo&^rd)ins-5X*dH:6+3MiYF`=8.
+%0E;W[M*/2O.VB5n%N-Qp)hq7'bhd6@[u*ciQ/M2To1?4>(f?-b]FV!PJtW7KoY^$=SI*1tp at Q+D3"8RgdqbQ(*h]D36#'"B06i at B
+%r_Dm%*u2RqL.Pk`)X(uSB9GP[X,+")X[A\-b)V\o9J'f<j<dI+0U>;Hr#j%L8I`n&V"?1JK;)Wq27,44.dH:sf^%Y82OIf92CXGg
+%i3Mj;98]N\YODb<F;qof%"^[W,':hiB/%-B5:[Yq;8U+V"3-b7.Gs'LV#]'N0^R6f\oG:M,kDt'W*prbDNZ!L7k2WFV+MS^.3Co)
+%S'X:(YT=mhbc2)-]!d7m=JIbiER at F&0I/@5YG]$C1Zmfp<6U.B'4Z+DCZ`8Z<0C7ol<(n.MIVpg>WHmenI-*_W3Ro6L2h2QC3,:Y
+%DeTG`X#+QcL,0"CF(9_4_aDJYX!LGs3OF\u:tF1uY>@plkfC/S8h"Q*'H&#*.cnao!<SeHRgDc81;A^3V%FO^THI5I"J=/.]U,-p
+%3AOK6'!dX&QQ<HZ/URkhpsWbTO^V82W6\BZ7>(`V>TR9)<<ptjra8TS#>]'uL87J>r\b;o)3HGpHrV*/M*\6PrEtutAsXJn6kZ=k
+%7#d^-+^HO9oEKmO%Tq,_Sh]Mq"JVXBl<5q+.#.m*AuggRoMDiFM3HJQRnR9#=PHq[dpC5a2Rt at tl_M^\PiQcTN1"2$%e]=M_IYh&
+%2C#jcQp)h8V3#t(8EXFIQkTOb*J-T5Q=@1O;:.';6:=njXNDB6JH<#W$!,;Q'q!ndl->m?b>C`?(`7OnBL+[TdSZ:CK!o]mo7`#8
+%S[<5_mm\dtM at AX+G+]>:Z"onBdRlAqh]RT=mrgR'WJi0-=kSOE at P?h>khP*e1XmXbiFS[W%N^02R^r\O&7k-Le]UYNr.#PoN._ZB
+%aYDIb*Q;bAFug?sI>gdI*''>>%F.m;,I44H:`64/P6/O!@3!W?7P1J[opO&[!;BuP(W]i#jt)#O`eZj`s-9up'o^'8SCO:C/<Y__
+%W(u9q"S_sg"M,cZd6`*$Ua?u*]V-,J&9oY_m[LZ";8e(7M1"TJ at 85D*`(4I[c=Sb/Jo<n7!=hT-/#Y7>R:C%c;fo2U0mM+1i23a6
+%<D7"%?mQaKQLN0cNP]@i%%L[=di*<mnl(o7=;n7\Ndl?:cn`e;PD=\D:ECfSZDT!Id6QEIe7\?"%R-G#PC_>daqBI"WeVZBJbhE=
+%]T&XP3V>9o6"8)D-D"9>d at Qj[]t7N=k/or?-Q1m&Gifb%dh;C=V0f(Q,W,urOO0?bfFfUDiTcXF0!QtO>8Z=4f#MFoKUhrCi.p;:
+%VLF-(.:J^IE*oOJQEVAZ`j5<1K\=_ZO*)#4!T#;g/\:2M9FAUI;Z$n7]^`)@i6gh>2s?L/"c:!`You at C.FW/D2S):o'h^5h%?sAZ
+%/5 at Pf#7bSqR_W;5&RmjZ\1O'V'NNPo6G$T9e2=5QXlh.7]*d;\oYQkD at m(YGR at E2pBC\fJHgVSM5S,UpbkZpJ"*SY+<(s#o;M9IC
+%.U@/qQ:@YYqp:>:4up1]\]?GFm#nR:(toC#+$;K`5AXO2`JpZ.R$B:>%Lh,)[+KMYc`Yu9E.9Xj:g[*=O=)Y2!ioO4<dDlUFIN!-
+%i3[(<BXfM-o'.]&0U[(taK_"QRANM)K:-ekNjJqSM8IaHJE,H6e!Do#l,6O_WTl;B`A>[1)o]_Alb)CS6=qPteJ+kiFX9(;[LZ-S
+%MIGf`K at EA=NVUYhVa")IgGMR$\;h,_d]?%&'q7LD:Pr+T=ta:U)cY&0=sL[N"f!>\$pLWNa at K;29d;o at XsHMG.3,mj3R&KUKq9K=
+%rXkMjNT"dG/$UDU6&\G#V8/l=V*b992#:lH-mMIC="8";"9]/De@<]cF1P4Ndp'Vm=P=U4W+P8L0B$";ZmXsI$$-ArTJVq98SMIs
+%;ZJs2i!W/6Xdk[rSWupDgUrYf`50SH\%s%@8U_3)XL>UCFL1<j1DLU*OFO+J"eo,MZVPXPMq5q!JJ#o%N4E4CE0D6>Q0aCnVCeMo
+%R,8.!Wb)U22/.0V0MLCDOf![*%<`PdV3nGrkb?l]?"G$#\'ZN^[4nm$PSUESD*='f'G:I",rUr&LW(n58U?Qq.ne65&Fi>70n*,h
+%QS2"#;FV;)`Kh(*rjZ_Ig/;RhA_>4g!r-U4 at cp\mkoJ8feWZ)YQ?33rh;l at -VG4@j0T4nCOIDGVKih2'*H')>f/CaI;gd?:r`U14
+%0"XG'W!#keTL'h_@$T^ck*h5aJ\@fG1>>A162)0q$W`XFYTWERYWFhPP,L\G#Xo#V+cIT27_5</g0,J<V9hZ/85U#VN,fZ3a3eB,
+%qja_m`!D@`5d;,N-otNG>*^EG>>0(_gu:U`/mJLL9u5D-b<Kq0e[&jEfj2r/PSPE)m-3d;Rr&=)=BAm?aGJ`U9V-&<bY./_aq@:$
+%AE:>chJHK<$X0J8Dacju42a!bBW'.^KJ_jS;jWdPUsOcG8-\"5C(^X`($N)b"ulB4i3qnfW(4P9WGnMub(__(d[_RZ\>I'V.hF0^
+%6datQ[<dE5bpI_SeG,1*4"BQX_EnqFbFsCHAA1Q9RMj)rPS!Y$ni)O$5qc2*2C.?$'i<%@.NB=opmfdLf$fg7&^kr%[(sKOT'hJ?
+%a+.\\PI6'Lroe7hkqQ=Skq)Yn;WZ+1,'br:]E,]W:k.cX6V,VAW'Md7d8 at qd*.e6;Lu]H8OBSK,JD@##=A%]+k0),M3_2-N'T@'i
+%FBCO'<&PWb;&<7I+=j;;b?;n)>!C"LifeMrq&1$%<ZY6FTVDM#C8Xc:XJ@>I\?YI+GtRWTWEn1>4?:c!U$.9G.6\b<Dj2AdQl).P
+%],$o`&$DSD5c;E-3YJ1fhndE3(H3/DOW/Bgef;h:#lkhM2t3">b%>Vd[B`Z-jY4JCKW?EXA at T$2-!h87[[a_ at W4V"u^e7RYfRoH)
+%R+]=\?4010$+%,fZdL<`\OofPf,JekiOU at Cb7"kLT'6u.9l`4R9R at j0)TZg;>G:kR5_'1%EZ0%9Bc9ur:0N1;)cPH.Qns)A`)>`[
+%,?</"d$7E?%>0X0J]59V3N#m81P5&YHat\U,4Dg:0MdQtWjJ+9C2'Y4]G5#?=iGIu78PSlJi, at AHA]15+=$Hh=ul at upZ;!=+Kl,9
+%W+!cY!1f=iW"d%EEa at YQKQce+:mm8fn-/$*VAgu>Q,HK,f&eJJ^ZoGm"u589nt:E+g^5!/%D>4s0LsU0!8k/:T/mYbA_PL$d-Ao?
+%bdp6&?ZBKA-6mbD)J+#74W=,Y<Phf%-C$AalZTA1D1M>Xm;<J+[>N,g:'76VXOsV)OKPsAaXN<-hR!SHo:'uoKK2&7Y10]Mah0Fq
+%^9JrK>]O#/!S:0dUY1ZRBJ68e((MT;c8lUNFA`s!+MH5@\hRX99MZ>mLa\JG,WuH4Yhg?\l7Cc-`elRC!dMTPYOIX1`<PAQQTYFr
+%,3S2_"[+B'ia0K"-$M,jqO?h$)-*%5j<0I.dqO!QE?CSB8dh$VnNaht^ZT_B*IfAN;A'0H&@M\9a-^TiLGbdA<UO$?pC7gLaL<Z'
+%49j*E6&;0=%N,ggJM$#^P4J%Ik'CN*7O at F0GDI5LOL>Q,OM>n<@IfQODA/3"PT:Gj2*8$>*UNTZ^DT>kgk^CU*Yp;P5^4W;9%*K.
+%N]^`69g83R%d9TD5``7/@F^YFcPZ@]>9 at a`kX,ls0lL.$@UucW%0I2Rr,6\B1_MC0<$;9ZF'.L2i$dP,e!2[\N>/X/k&l,!02QK9
+%j']d at Du)3N3p.'%1ZEWF'rjOD;Kq1BER(X=%*h9)-fm\en463o0nfX+Nk4$IYo`#C.qYWALY*eh>Nt.3M*O!29lR;&bd+35PiUOL
+%)oCB4R*PIOq=.?ER8eH<,bR&ZnOdLV)^()9TYs6AB)4D at VBtJ.q8jp'neJQI.:H-ME[+NHh;qk=pnugdfgNg at o$X29*3?c>Bol"0
+%PkhsM:cFD+e!HF%,OgtqJMa at oJON2#a<&jNo1bu?o.[>Q-^5_MP)+Mkbmd))Z5AZ6kfsj3H"[E'-0=(ULhk,P2)+gPK9X22RPW`#
+%i<5Z!D8T1BOM1l4E]Gr'q6W-k1U8GD\)H>#/<nFPCAjfSkf=Z=.5m;SMG6E61XN,71#.bVOLYE2S,=PR at gp'+4'e\noi0`-.?p.[
+%TVE>5IT,<'KnanK66V_)8=iCX+hBNnl!,s\S at nVl-T4\=6Ei^QJ46 at 6Xm'ekIUf!>\39(*An"0J5SQA-2LqA'$Ublm#^M"'rg[sX
+%ne^qd/E,A32Q8Ts3_h0F=!3Qm*dJYWp_J[QNfK9W\slAHYQENGHNbSEcE^W+Hou\@8_jCQV=TIf?&Cim%iq%5CB7b,+W`Sqh'A0p
+%#3;S5.]PD#7#BA/-gd<XEg38&1+PGji?MIa$4bKg_u(/$-!Ht:9]8Pc>bGLbk:*8`L;bS*@?r^0.^MqD#<fAQU/_<7rfu_L)4=H-
+%9ppU'3ec7R$kRu/VB-+6RJPUd#.`I'JQad$$.:\D;ufHpkjb(Eg/*sP$KQ.oB!opa*"YA,h$kL<0iTt-dE3:eNa77;He"VN4A^5q
+%jGSSdW9JRE)#)-OdVd*5#MQ<6k";,80fG":0,.Shnh=hD<)W&SCeF,gesH5LR89#5.9Y\Z6bCB`4f3/J).6g/OdpU^/9F.Je=)C<
+%9kDc#1AEHfI>sMgBJ.a+'G!b>;?F(W,eHh/%E6=,/=WL]%pEj-&8?G+'QP(27KFWLOR5gi<Wsa*14D@<[]g`BJqKQLDMnE_P.U92
+%'_F*#S60Z!!70;eJ^?(iTHbDCc;]?V0#5_!btG%-l(i>RFjH&,N.kZ!.<l])"Or8*+bDU+?rt.>Kl"F(U*>q^6\8[jXIRq-PZ1/F
+%?c&TBq7euFfa,E%#H+[F&sVu4F!PG7A583Z)`II,J2I\)7O6fB'L<8R\H%aW9-ZPc0^qEU#]<XHQDLC>5bI4bbObqVXuAC;5r2hk
+%N+\L*XI.fjIn%^0'IRaUh[8as00`+X$h$\ZXoI*/lW]-C&L9&k3i+>2#U-/"b!rQ!2tFWpI0t,A[:TOO,ZHqZ#sEURFK)W2-m,[E
+%"#Lsm,8^s2fr9o6:Eh8Ym:r<(&QkBIU8u\)dk)!1EX>X`%%HlKn<T)kdOG)42[Pqi7)37gO!FlB>k4EWAH?>6&2<?mW0r7"?"A%\
+%=n':?Q46Ytl%td_?,=B2Q-`,&[Ytg0ak0NqKK'3J/@bc6^h>O;)8&lg2kuS#N@$uLUIV95[H0._0Mq&f.sTJ+DAf&hO-R.J75pc(
+%ZaB/n!(\-P]n&U^YYg!8/.%KO'`++X9<8_#mo7JDQgc/?['OA%?ucOHYCi?>MV0:$'Ju'`n8BRO'I5&3$*8,71Wg^VNAM;([pCeg
+%r4b?OlE_FH\f`e$CZ8<<bZJrQRr22k2pie'`ZAK^!&eHE.lZ03:fIT81.?-5;<D![?Hk%.C6VeGAb]9E5R7GtjY6(7MG\*4Q#aaf
+%J7"'TTkssd4GBdXA+"Y,fVS^K#,9l-BQMW-_0`'*TRh5^]1/,-nO!ds9]:C(br!m-jhC'<]!gMHFM at Co;<9(KEuVUiq:n\ZV'di=
+%HO-GUW&X$b!hUto*t"BR=/'%b)C_r67\>\L+IB]I!R[(.aE/AIhFC\a(hR#/=:.U"FIXOB&5>%\._9G5",=pO at 9OiCc"aenZ:hFj
+%G:a*\7OO&\9M$tPJ8i=i&sUQ5bc0TD&:g'C[F$l78$a7c-IK<ja@)W:[?X/';kib at Pe4kR$,^^*RDNU1Md!#O.]ALjPK/er1lO\f
+%!QQl\=NJV%?cqV#m9i!q$gQ*;KN at 7Ib\%*D3?aJZ$VlS$.D<)ge]X;2b)S;a#+*=p>V5+I/hm)sME%mbQ(.htKX:tR?CEpK0?Img
+%9GC['S=*sma>BYub,!%X6i_=oXKhk^oJD*"N#;@'TV`u*)F.^WZYB'k>n'X>1nUVPO+<rnjjlgQHMT[V:ndQ&!3\ZAdTuuS,CTqu
+%S;ONc]&2^i=6RW)YT#BdqdD2P0B27I,KCZ,9!Y4TO!Pf(8qUKQXf8Mi*\a+C5C<pIL]E+RR?BHbE;q\$^$BD/*+_oLUN:&$.MP=Y
+%lcH4VkT$F<PHJN99+)h##D]"aO>8<BCS=*KN-Q^^JDahA>fLRb:5KI_IXq20>f6n@/BX9pdP;RnV6DsPO6[R(W(OY>JR]?%CDR3W
+%A?+'U7Wlb-+#%)NT(eIE'JGTrdNoS->a_5kKcY(<g1G$/V(:!&V]I.b0i5,OKV3OcR8Y32ZMlgDJ5RH\WQ8>*D9<EN%/>'!kGfj2
+%8:n=NHUtjYd[%2)O?ZRlLIVQcp:Pnjh7D8PZ5k]d4,_kdEIhH6)q\ar-\dh]W9!A#]@Z8CD[DCa-'Ol5Y_["'3Rq.b=jEpr(F,]n
+%#qI<SAKYru<&k'+Z-iDlEr.eYf2+LWY"9)a;!8)sd[Z9BX$+d2`Z2inHe7!TTACK5'$CAW)'e/%a<G6S%s!Pt4Cg54D+Rs"gh^Z:
+%ZXs2QY4o(FG(X&KqJ$\s$QU&>r/OOi!VU+#=!ce5Nr0[Cr.JCcZGF#5$'KAT(`'F$&C+Q)A=!6n0H<W%3!,h+6qH15Z]1g*UZ0A"
+%m@,W%:=e_tVHb8hl&h.+)mGCIPptegJEnrdDZr^Xh_Xp@*[OHG<sEoFYbUsY'MK'u=@8I?(ale&p2n@%MitZPoj:lC>e1J[!14 at D
+%[5+ at SacnJK(WrQ?(sYNW9acTLWdmFM9B`U5#M^fR7KZ,dU0NS/Sq>7D!j>2D0tKdpR:R7HEYO<c,Fa!3'9u(li1iCD>5/`aTrFt%
+%&#B93i+1)QAjeA+W+VJr:(kkK%S(ef6P&'9C?``@/\m)rBot,Wi)P%Q`SPW\E^nVQV+T.r1:D3]+kr25l'R2J='ssV8ahn#NKRd&
+%DFqfZa&k$aa(fHs-!.[0\u.#67\?Eljn_XC273n*XQ9u6E7"TbB@,;$l^PgY;Bf0`##.O4eG9DrCLlQMD)$uu8!0+GVj%KaZleN,
+%e^A at Ng8M@jE[fd7#54ChU6Z"+>Gh`o4%GX2,"/E$)td#V7JJG`o&",<cfs/<k/-[ZZH!<:@93]g/Jekk,\'<OVhVQF%cIl4fla2X
+%Q4-DT>CKT!A;a)NQfUraHXt.>@'kg!dF62HK"$<a!"?k at i!G!glpeV>0]KFG&q1e!9M[8S$$.%I-EA8U&o8IX;9n`t:_j6^h,)FR
+%K:<Pb)=8K^Iep-]\>lX85 at rD)9RBi#0b=SG[/_t(<;'mmoqY'Ek<&H5>0GYc=s];>DX;o"I(_9&GjM8/Cl3O=n"=j"+tW1kTT-(N
+%&RTJ0cihgaMuo0ZCRG;,nBj#!+PUsL'/`6F:&h7gY62orAIL5>gPlVbU0+%_nQRL3I4!?q(BOZ>6p[@:#7UHodPFH3GTm?(Np/qd
+%KN]_]k+"h";<1<(AqYBJdFI$N5>/:3TTk=)@18BNpMblPS`Mjc2lND`7)r62%C8*a*9&0>%EXePG6uqK at Vk2B1:E-ujF*nE;-#:u
+%a;*[sjdjZ#V+Nec5H>Ho]rX[lX,IlDaAi4%efiRj%PUo3W27;9Z]Rao3W2GTq;bb%cpZ&cY96'&cT_SC=C;.kktZ)_XILKJK#&.!
+%LgWCQqP6fb)t]/tgrUX:(^i2s_8$>i.0Qr@[7XiGe.,\O`?R7"\tcK(q\Ya#%)%sW;Vg<7dC,oh[^+a)VI\Vi2hXJhIt4<3\,k[S
+%kg9&=oQHWb;?iIR[Fdi_PG_f%].m_hOH(WdfWM)m!K8Ad\Pc4D^.(cJB6mf36dg=oIOb1_RPM=@^<BJPmALCuafZ+a-lYV$2+&GH
+%d,Yb:VMqQ/'K9JK'*aosR3:3'U"blg/WWD.2_hBZK=2SK8.`N/F at 6PE7:k^9W>4b9<"n at -N!ud8[KTuF6T!c`V#?h2Oq$KN"c/)$
+%-Y>?.%RMR4F%f`I;Ga642aY6 at 13BLNE\8elLrn^K&(*[Fi'6:5I[LmOe_3brk"/o0L1=U-Snpm^$hQ3[*jPuJ:BO<UblHS:89TjS
+%-ISJ1f?S'fm#8YDZ3f]SiWP"5=ERa))@*(`Bh1_KTQ;4iCj)JH)MTUiCm=;&CFej3Qfk*1>ILbua/:jHZ\4a#UFn+b$P+AY6l?Ym
+%[ZH;5:2\F"dPF at S2_b2nL_$j",hL6?erEr&/.KWK,RF#n[FtuAZ_]CQ%#>\[V'mTV1ShScqSo0:(mos'>Vg\)J:W]!1.&TtlT1JD
+%ANu=s)0,^c*92T!VduT;X+6m3gA%[mLX$6cB78Of>\r\YSIF/1#%hJQ1V!g=$-BdhcZlMK-^PTW/t4,UmUb)l'_.//[*^,.IOhP`
+%QFag4cqiU19gGlH7,CK,ab0%n[M-2t9a5-3ehi^89_V%P]n`;22L2A(B$#TjdGO/?-m3cuW0GA]]dCs2Y)&KZ1f#"&Ve:9$"jo+=
+%Vi[3YUr5g0h.V!9[YoHa$s"i0`s$=(J<bkBWF90=MPfLWisNpX at u):RB#%/8_1KZ^Dj`ZkBXWTfW+L9;9ec5L+C7D05n+"k!/cCf
+%-De0kKbg*r`ODt0Yr5I?SDi&I3<e5S'p3*,(!Nh]5W_Q`Z at D_tYdYjpf^r%@S;tf?9ds""/U[0<;4sJUf at snjr)_kf+1R$$d_\Q@
+%%@n`QV.4t*9M;7E<k#c+JQ<moP!7?ta=PDJK)6D/S=Zi>9M8kDluG#h<GQC6eSX at eaqGf:<_E*6>p\;X9j^05,4?M]In>;^F"i5g
+%jE0S#&t($s2ZqKc_I*R:8WU,"rN:7MJ\k2KL#35L/h2<F15T.GD&Wpi9U+O->>#a.s5Db8BJX2gQ\'R3$`Qp:JIPl/nf'A'.T0lh
+%dV%877nGrG,i_W$%FoVr6Tm6iZpSkia^[U:8)-U5Xj(HUJD3mF+TAAT2;A1IA_*r(Z^Ge?E(3`Ee5aT$80-(^$=P8ULm#VY%hqbA
+%=q?gK#pa#!%,<EARW^eYV=Y!%+Pc(Y-/,I%V8KAW`:S5l_"I7BDD9U4:s#;"\O2k&0[ut]2qfT^@gP at oSk19i.57D"!m_:rOgWSA
+%D`ap.GuT))h?%hsWi$4;MV=<:eL']1%VA)/:8Jf>X-itqfdZG>)&mtqMS=D^6jpU-SDd%299l;Y%UMmSPT#IE%TCi\OrsiF9+]04
+%d\mGF9Hu&e;9)3VgX$%%_V*ZE;3oPRI7`3>moQ/,\>;G-jGAF+dhBID\&/d"NWdcfalOf6nS$7.\H)?hP,<]m4F%.C$Mfs5ljTao
+%d;F*o!P'r`>V8kao<-kd3T=+oVATH(5]oZ8YbK)=:9YcH^]K+(kS:$*(Z\P62GK%<!u?s_b%sX`g(Lfin5]Q?ec2_IHt]Ji"g?-F
+%P4g4OgiBo at 3`DUf5lm2CJ1`eA"ipp8;`!9&dc392Ot56e$\aI*NfB84Os?*OD[2Le%YaU20t(DV)4dO.T?nOUBGM9soQ2D+4':ES
+%N@^IrOPiOf\6:a7#\nd*m45R=;FlnMV?BMKEi#UTCml7R!":jr+7*ur'4r at 817-^*MK)"+$bo$V<"NFU-Wkq\0:s;h;`^ZW?%YVn
+%,GBk--l'=#Hc[>9l8j].U1%V`=&oQ+B94H,3:8&,M=p9%OQ\6;8Z2.eE)4nR;jprB.>1;:O-T>cUo-*A at hg5dHIRmq0,$KVkmQ<3
+%M7+$LH^Ha6^ortu(&\k)"W+ZX)Z#hsL^iJT3N4'E%94tX/_:EB)7``UJrgB at QEG%u=FNm[7ABQ3PMsf+Wf:;b)dugjEZ-0+L>B1M
+%OE<3-;W2amj^,*L6;^ifn],1A,gk?*X90DcQ'tZC.<f(F3`IJWHV$05Dj$rngto^!Q!'PdA8Z8l2Qj":+j$ZC.=@j^b;=A*bSgY)
+%2;kZBl3>b\HsL=:NBM*>H+>8D4#;L:8XWrkc,9mHN.)g=hA,ODIto$h0p6 at OmWq\X*dT(pOm1*2"G+"nft:?G^H'g@*Kt5OWkaeH
+%Em]&3n>HXlT;i*UD7CT)aFO_)[PR2V-5OGG8RF3rO*"P?(0DO;WKC6j*)1+ZojG*VK0+!>B;odFB)(7SGtf*@m?8NKR:W]MO2NfX
+%CF!GRBe%MB95PDr>glY9/lahJF4gV/3gm1i at MA5DP*]-3'aQuq\0K.dX at EZNIuplF]p&\R34)]$!2tu'*H45 at fW(TaU*kb,Q'rq4
+%F!(d[98Jf'&Lo/V*cTp,mgV24*YKuK.<6JI2*E^8#Br=]`'h2mB^M3XeO#@u/Z(E-jV7knA<>kD6LC&SX$9LRKD7?5#a:M*[:&PU
+%=fql=G6]eS%3Fh)r]`lm"rDi3bnscL;n%tB!>STd4Zbo)!s^#+2]28)bY!S>`=7,FH-Oe$"Q4Buf0GHHV'lV88V;2ChG3l at dU@GZ
+%*I:]]C#s44lD,PN0q1,A(_XUJhi,cg*-T]e;j6[Drr\Z^-hD#Y$CnpRckPNsdtFg?T][Ik#2@$$<@1WHC;U7Of=nMSq(OLUZd3>M
+%YN_lSXYg1(.2b#IJAb8^*jSi;Dm#q!IeHHZ,<KCCnf1!nJH>l!?8@<2/-@>J+NImh_$WLWbZlC7Q>@T'0F"0uHj$]a'-pa($firG
+%g*oLgX45KtNXY+%8)3 at CR<m=_'^ci*"TK>Q1*geKN;X4T1^.RT`IN?&-Yh\H92M!)3An?$2:F.YQneXLdGnoUrV(7RQN2X$d3MhW
+%l,dp1`X6Ihd`Pu)B-rlW-CZS!VrsN&![QnQPdafH6 at Gn*9G++SSK\.);c<#uO\oIQdG)R[<qKZ*aZcKHFIj4'-94$fi.hX_E[DMT
+%AQ"#4l=NPIR]Ka$?\8Ib1faqC`L%>WN<D*FC=rkQ/&[V!c#d&o!@l6Q2$P5DC>B^^g_^FV2)A&`l+7#Q%6JoD8Fn_uf]rQD2&Oh8
+%B+jAj[?_Cc6 at 89FE$X$,M.C!*V"beOdP;f.3O!hh+O(j[9oO,KqBc6<=0[B5NSm';d%3,D'D3J>3J!ZM at ASVV?Ct%9T5!`Xa at NV;
+%j&2)1h*EaA91=L$e"NTN7TN+g[-O at qdkb`#UV:A=,0Z3]7eU8,gEr%?QM[fRhV>@UDn_s2[]&*l.06?`_Ea0^N'R][7:BL'N(L2l
+%\CO2?jH^Wu^!&A:RrFS5S`m"FOi\i1$%RNYM"25i%Q"hQdIILV&\(4U0/==U at MoAhp8O_q9#_.aR_f'DPQhAH\G:"b`utDB8R[$K
+%9 at _2>X3iLi at p/G7fb:;@\rO.f5,<X4T3"2]/r36+B"/sc!g43'9s6VW&h6=a;Ck:48Jd4)^[/+0985!5AKjb)<"8fj\hpdWj^>/s
+%".X=\dVlOu]"tbT#Aii1X4N0YK9Ln<n#["07m3^O&X`^$OF+j[aU3f5bXf60[fMYT3<[PkCDnO4UcWET:#K*25n2Mfn>)RllF$p&
+%Y1mE5CJT/YS3_E at I"GCB5rU"&p<&W+cLBC0m;A"oah=BMh_6=MJ?J\p[6tF8kpIn(FHg1>=!Xt7qhe0MjKRLu!.f8Q_j$geeSW3S
+%V60#dmK4*L-A0sXKpYHO<c4;4ZcR!`BUb7I_75U`mfg#?)se^Oh#!6fZ9HB)#>3=LKO0$R"#oL*%2<a]N\[51[ig/J,=td#)k-"L
+%8%EA"eqbdn:nQfF at d#'R_as/jAitd7!W!7>)5][_(5l(!$uEd9PhIEeR%#V]+V4`2PUBs7&_$)MG#FBU!V>#6N$S=a#qbNZ")?Ri
+%:Z!#5!3SmF'+LjlFk,;u8Ek6)Ai8d2U6B&Z0+hPdIeHSlPn+8HAGUl1GRSHH28def4JGJV7 at B#8/=Q]QW<6iscepX>UPt(N:W]kq
+%48(!+$W[?5e-^GsKGC_Cf5%3Xb;s,[+1$gI;W[sF at NtXSIB]HURZ[mAPQYra at O>&*&tN>mEBuRUARhi\TWb2l)^aZD"d at JI\jog7
+%R>`QN!KLa\9R8ci(7+oYp'Sfj(HA*'lk).%WFe'Yom5pq-IO*IK6^PLR6&%2I?c!h2gK0GD'AS)8mG+1o1sn`FEo;I;IJ=@TU*u2
+%Us4[88=?KDg(^[j_VU$PI>SkU%+PI.@?L_!_?:uEB1$!=9k/c&M3'4k?sTkP9P$%;<&]mU)4d3b.F4-HKG;OA'*[>;b8&VjU.ZL4
+%=?UfEP*<.[+:o+8bXb?>Y%/5F6FN_u'NPMXY/6>a]C'QW&4,[*6pfF&\#g+;8gL9IW.Z&i<SJHH>.Cmo8uDj"n--qr]U+W`k`5rZ
+%CdE7SoRhG:$.#RqQKfbmnipO]"6ISQOpjU;X;R6S^a+9h2_&?k9E;@&@Vd_EbRgn!"%c\F2\.((SsHg_88,/hC?hL5.[,n$L(l>s
+%'a?oop0^04LC]^l*$e+qQu.rWPmpB"G.LK6Hg:rh6<3Q_*,$1+U&?K7JC*q/PdH0'daCgODA.(3UgQddOn+jZ,"Z\5GUOhhP!Y<3
+%Xh"oAj<,I__Z9G1Zk]oeqc4kqhFXDE%LX1M8spO,g6_m61VPl[(N;9lFd%iMk%X^E`pDj'pasEAZrB#&a%@Ll%WaYMRsGeOJKb$u
+%d]K1QPNZ*g7Ed"`L\cLuK48]+i0BuVQW@]2]qWe)PIE^i[&IDZ84mDJ)=\+Bi^QD^dV"7t54sh<7RFSM?,>=V, at Zd5C>EPk=H$hi
+%($9U#*SD(rOh+^*jd"l5*#3DM"N/;gFb8nE;R_shQQRb1@(\$n)4aJbJ(^c(->FN@>b\SL[ABdk8K-e9!'XaIMKbJ7IfhjMJ6qMf
+%-2?9]D,f<"]6+SIMF>>8&6Et<k%Pci8W.)^BYe/9VIRj(XXp/^f%i't5n=%4AO1C=F;cSt\M+n_3LL\S.jboBF^F=-W%/Mpfb0s,
+%Yimj-NGgU]33Am7VcWso4'Z;:66gt)"mNm#3sK5-Ut5BIS$0.n"OHRSI:VTc$6G`@;JnLcnlfR%(`5WsN/>=ArdaNKJ9m(el=B;G
+%hn1ECcH$ofetHG82ki`p5IXl]DHb19:im"<IA/EqJoHS19:E?REugd5R?>&:m)o++!S5VN6mWSWbjtRaaQB\!$T]O;;.E(cJf9BD
+%%A70WM&iCl3\q*0GKFNHf#5Ib"0>BLG/iFhD-gMUNO#9m/+&`j'0F9<L:\eC!ABY=K+(V(9W8Fs<5j)*k1[t(..Uq%;n8ZK1o4':
+%fT[^%#Rg2(/7B(>V_u at aQl20ViK:"Eo;7Hl!r&T'Ufc#tZ;,qH1^*LDSRi#1]?/CG=W^T&pnV&uPCEobY at kk!0$d'0iK[7j)(_gG
+%!!k_*R[ssZd*V/Y?hGhN<C0<`f87,qj><"6f*um9Snh*eF9^D_Babh'UhAbR;4)-5/Q?CE84C=\4MWn1VWcb9p4glS*c8?'F/-'0
+%-O+<]HG)>=+CF2RF2NmeD\THemtrVb:r.%DE1uMc1ZU]?-KVTjS50c6Ta*pe8a"O;5it+i>M2:p_D&$B*p9fDpS\t2HD;Dp=s#^g
+%k_lMb\r^Qh-&ST\dLA\b>!'B"AkLFXB5D/-B/qbS&fV+Jl!I)FLtEm'*GS5sO`sG9*o#o_]9-gM']teMX]WF+X?<U[L(<XF6mbW/
+%PSU_YAc,T3G>C_^6JCi7-RZ5D#><Dt4ABRQ_?3`9')H?X7\#h9j3s5(YJm>,(D'2^E%9?SES.>ml&D[)A+V("Uu=Ok#,EG1.=Y<_
+%GjN"J>BLnC-jA;>q127W!9G]>'`naKWMKf@@:6/D5BF-C1fR&YF at jcJN@a%),s0U1Pm#d*'^hT>O at 02_lP+L+8]m*L]SXYW_0V0S
+%:A\gj/IG6$(SuQam\):NFCKt+.MUDO<IgSu`gA2aVmD\'f*ue>aa_]@ha).Q@'Ch,/,]OtF(bU.TqQQ=niEaG[F!JSo[R5J$sd at 0
+%2.V.>,tpJ.(8aFo)U'4R&XgIno!oW(5ENdronc-4BgF*R%%F6?%`/aI+Dhr?lu,l1O:BML$n)k_$8)fL'-Zl1;J9lf-4O6(]XU7W
+%7X#X(^.+9"ZfWPadK$X$1[9X\[r1:_&7t')@Wd5mOH7s6^pq`H+(T%%.'>fgVa^bV-c>&?R]8oHcB#90/4%Fgq16$ADG5T+7YOC;
+%Sa)1PS_W(B4>F`R.\]r8U*,-:lUJhJ!%sJ0mB5iZ,Q%SQR5<\^Ke4$1.BVs%>\]"YPf?r:EC+TnG^=[d9F?%u7;BLI&/[@!\7kp^
+%5_$mN.E%RsVMseM$lK18H;r*_XRJh"@3J-_JB4,j7QO2$'"]J!bu>+2SaGaDZrCP"H5+RR-6DE5.&N/oJ;W\96NX::\X=+s\PquH
+%nL4I`TdOiSCIV,#WfpS]I\)fi11^-+9/RF&XX\JMPC]C:Od;7bCGQoFjZr,=g(]@[&LWiK:csCk!&AOeg?JpND41$;6%qaR;Hp:3
+%_"rpm#j);/\UpLT>Rf>.17%J8jZmoH\jT1<03#WEk`sW>KPpT>D+7tl6XqpfVZA6c8@\l%f>tJcR^OkqkBg<aA/0!\E:"XVK+p;l
+%:+7T3f6O6\N.d$MZ!fSqGJ0RY<'\Z"@Jg\lLT,p.,E-ZI/"8"kAIX8+FQXr&"On%>aMcFE'_*re`:Z-G7L/<q*Ut0B9=Y`dI<ujU
+%\cl'7UU4rWV8=1jrWM;4/s]RZs.NW=:dt68ok%s$U"^!2.mT6qWin at b(\i2oJc<R>IK&g%Vsa.@^Y/S9?_'CkQVS^<]\36GIecpo
+%s7?,K5Npl!hrT@;^\n'- at Jp%8p]%nZjmB\[q9,Zhj3RSr&*)EQHM>>?mU*uC3c!,->e?WKGIJ*T5/7-]^,oTUpVm^chZ)j'pHQFG
+%]c4O)IMb<Hht6C+qY-WZ?[fS7)#rK;Ii:P$q=2oe5Be3)GQ6$6T0IaOpVSZQ5M3A.N41J/IXces)s"0H2fq4[oB5j4r:jiL9Dd-+
+%(\^_W?hE/-n&CDUp[aI7`h2V,0CM+6j1?t:A\Qs[Gk^gp:#1^lNUMTt?TsE5s8;ku]^'eA1qXnplP'<rp>+&@ApOeanZMoRoB5XR
+%s(D;,H?]>cl(?"Wf1li0XdXImkMPs)rq'iQc-Oh\5J@*lrhEe+BCA$3qVck[IJEU%bI\krr21XWO7,8n5J7#!+)N"SrRCMqen<a-
+%GCTJYbKkLr00d5Knun[7r^@@brMS!1^ARbO*2gPor at _NtG<c&s2Jr#/p:[.A5J!ogj7*&cLJCqIoPo>6DWn"dkPgeYG"59E5Q8u9
+%,V%M!rUIqr_p,lMs5qXG'q)ejRi(?eHhWQtBK,\Rq<k.V^ZP^3gRm at Dr@PZDgWSKFmDZZZ3I:LHHJS&F:]8SP`UBOnq;([!k:]'6
+%qceD7?0:nL"i#77pjMddhn+73rUd[nIeiKprLZ:Oq;(Lhrd[]?A,&=hk[+1Jd>S$EHIY6jJ,I3FT0>nO`m6k@@]pl&Ib2+hm_\/O
+%U/uR,Xh3gASNW!NI+O.o0tN^4mcrj1 at U3`=?ME=Te9gpgn"[@:5Q/g)a77Qji@"B[T>Ea>MI,eos2aiDiVgO(k8Whtr8M&ZMgM@/
+%(AIFDoU8"VJ,Wmfj3Q]=Dg$UiRjKT-s6G_qq"^8K`rGu1D^@q\],W*P+3u$U^%KDfrq"l/rjVF8^PlNA"Pun'P2^aGJ,e@&'8]cd
+%p(.2tS"Q[rFl)PA:Y5+IJ,[plJp743qk(m#s8)6L_shjKUV6F"f6>UQr?^>!G at .oln,'Ta?_TW$hfuX*dD*V*r4T2Ka1'HgUO05[
+%^PdU0fluB2m>lSj^QZTc0dZP&J!+Efh]=u$5Or/GF#Z at 4q9O!ZO2D4UU>NW^+$[L>1B*naG0 at YdNO-*L_$nfM]\-RCQh0<\3F32^
+%rM at 1aQhjTcb"H`r0A.Yb,j3AHHp4*^kJMRpDU6S<5$-q<>b(D,G#$B*l#JhW:8d.:E8$r<;tFUFW__0E4;FdlPb$6$EkEC<a4'R'
+%4<4+9p=LAN at s'>``A'Sha7P`=/r0&WF>t<OL]*o01l(p(*Qg`ha:HrI4X=rhqoeuO5OFO/_g]@=pW^G/=8R#Fm.5Y6:\RG-C!Z1G
+%4gp,hhng..[hK8Yn7lg?nDhreRo=BE%aD_%)r2aFVMn(sDl@%ioqak(VtsL;l9-^)MVG.7nII3924P\Rl<Km[@s+aD<==q;<@Jt4
+%6D_dupK1bEF*T6rje:IrD5i?3de)+ at AM\K_`ORrCa5Tq^aj:`ETcgUJU(t$I8Uee-q'ePjLO9WMLV*hGfp5J#jH']rfd/^mVsKck
+%Z@,1]",p/ZVhZTZ9@?IZ:/C+/4f%t>!R%k=QDC2TXJWSL7,+,C6]sg2LSd%sNjt7V$(``Z2nT*a++!fcIlo^*"X,HDVhoij+!b]Q
+%N4sFrQ:ft?kC9,<_7q$d?9fgo5s-6Fm.&-BT7/P(ombC9W^ohVTu,N5A[SShgb%olY#n2p>-7?GX12 at o7rkl?eQRGKl_WuO/8`2u
+%/*liXFc;ZiaQ>/-I^RnAeLXbgQi0W[CfY?MMY6;%=)k8r6+$;sB>560Q>U9Br'U$a.[dNC#VShm]Zt]=k&n&kG-E4#[q"%DdGs`H
+%FoZ6<.ID>Me2P"VIH at mmqj#k)A at YpUfKh[T at 6N:p4kcS=CN$8]`?B,L,hZ%d=)#^dYbRcDn]pKWVuG^_VKK=iZ?9]kg$/:D[J-`0
+%eX/\%9ds&=(eR^:KtDTl^76SuVCX?s0]Zj8Ip4:!+%K6Qo1</YV"qrnd96";!4g\r-OKOQ4Njag`22P6E]2*.O9e!ma[?_46nAj!
+%R?4C/RCSd<_:IJe(Bt9](5u?L at iL0HR5(,9 at PVFd,ITL=9*7)?05nKMdj9(tN7XB[H=XPX_PVTh[,1/`eSK(@XfBnB7RZ(sH>'fJ
+%-g at 2d1?5c#?+K[lc?u`'f\2#'7VlMQJi%aY[U5E-@*E5(p,?<MCp2i&eg-6[9Kle<c2-n0V(6G2pVeX<-G&3MJb`=3`E2t`2J)Vu
+%o._o5ihRr6,FYc9[T`KA'mE<+867@;<NT<8>0UfiGAFB4mMG2n>0#/Sh6#4oY'=*PbM)&K="CmeH+XhTj9cWfX'DdlDUkf<bY)$u
+%pNEt<X*(pVa435)V(9,Ah0o(f'kG2*WAEJB$`0uJ<c&4%gtHdU#?rqhddJ`r;=4W%!Z1=23eNE=i7sIC<b4q(>8DkAg2\"klY,Tp
+%bAFfX<$0VX:hQ_t;h,6bcAl]RX0SR87Ws[>g9M[*Mn6)*lcm_5&!+r&BQF:"j_ui4F/DQ61+';bXN":VM\#8o<0rig4J(=E6KfJ=
+%I+%.524Ye<@cF`Q:B>Jh\Xhi1QL%_*B3BA?3D3g4ED;NHa[@[MZc#P#1"d&V%%t?C#c#W0D.R\sg4GMPdRB$GQ!MP]_Rq%JZ!(;5
+%K/Vng%ssFBAr9<S;9l0s=b#,<<e>MA`gu`M/i!_^oBGk`9cD(rGhbqoNdCJ5I2)P5n3m`V<9o,;s'B/Ve@(kTh'kL(EqU>^%m6YR
+%*H*78#Dp;hO7jc!$J(f=EMJfD%$WELQgc$'SS(*U7(ttl;FJ5d<U1^f8[K-*K1+q!/\*]7dsrhsjF:/"6Q1[+HO9(:6?(L#:#rEe
+%FBcq8!H$T4Qe>$%NtRLpX*^)!:@3-<G,B"98UEN^S/]aHC1j?HP>U([f\7i?qCa2cRE7J[Xa;n8hO??oOC+4,biH/g.;_a6%jm9K
+%PJP`oY:s[k9uclR=3-TndGu]3kp]>=)UgeRPDuo8M8G%gOq$jp*IMZ8iX1Si]RLWiLW"O2B-/oL,$udD9<o^),+)g?mkZu-C$djE
+%hRCfXO$7gXLEO:aBt'%TV5hc:/%l0i9EBtX)/uqqqir9[jr7XnE1ZE_Q=TCDrP`:2eX1WBr5*r"b_N:5+'JCR#ep_1ceO4#AK("+
+%cM#J[Gd\o`5J=lG*%Y68n7UB"XaJhp="N^gRAI)hM']DZQH2*k1@):Z-/@2%E/2iIDgdSPIepm%4o>$=0Z?a\jM<l!Q97IS"sfBk
+%H[ZMFc*?nh>Z?G>I!"Yfl-/D1Ogs(*F"]atP8kXf,al*/oM*[lVK;%Vl^XVjK&1L9-g2VTIGX<;%HMV-cpC#/"\n'L8pDuIab4<%
+%VrLZ]MdpTR5P7d`F7Dn%r`,3XDuo:]9YnQh_9o^<D'f4sQuPYfj-W't^+qJ[\IY#=#q$XV)3<L,fW?$Red(+<1FG[K.Ju5$+oB6-
+%?+g2u)K=]'RE<R!pg9K[.Eqim-GWB5Zt>1L7WLE3,ji:L+3cd9]^imJ]4Ak!bZ3X9'r`(RbU5+>^JeJb2OlP/-o+DBe7RRSCAi0:
+%f:5/fRct21pt^7V_=*>W0D?SF^[c(RAhLuAM4Ur?YdEf"):Pf"dlNqC4Y>H>eB:8dk at 2Q3mNa#J`R2:)P=-MtQ6OG`j,eUj."1Zk
+%p239[K=t($bRuVs^#+&$\99S!],l,ZhXebUHL'At\(b>h_f"6.L-=,ZcDDU7_S/eB=aO5HnU&pb4ZlJ$GkSan_>*Q)oXn,kc=B,T
+%k4YeD]2\ZU_N;3<<;58"#s6!W&eb%0C;N%sWTDbg'/sQ;S1 at R-+f`d<[J%d(7XK'jNo%.2WH72taso,UR!Bq at S0hl40r3&d-A%g;
+%-O6oE1dfUrQcN#4Y%$KgHZ0dtG+Hen3K96WBY2;f4j8rH_KCg.a2rbZ%\?`SAF)^m?II)XoZo7Ag5XV28T"@\1VpIA5!lZL9XQt$
+%c6cSU9##QpSK^!-/l`t)O\7'B11gnm((=>"A'Tl6';d:KgDC?d1LCtPB=]d%Qn;sXK#r?"+uVV!5Bo[Q"P'Oq3g,?79L at e(<6J33
+%TiF-G=3RH#eM8.G/QSC7DaM<jOk)HsV^hsU\G($YO3.jN8.1.eE\A5Q2S<?)2DXqX;QuG^<+MC)0NFo!l]pRJ(REN,Vlo6jB3=>N
+%jU><Lc,/)67 at 0IM$9$B8\]-#S]bNDaH3b:.EcEa5 at m+%HksEW^jLho:Ph+]FXh;h]6uHhLFCQVVZPshrh"sNl4/BA:+'cEGGO?,J
+%QL6Y$j^LgMZU/j0FgUf8_.>DR[!,r-D9;:i-NORTmH.I,c0TF2n+C.ThQp!.S1Me?Z5 at p]R^YI$;-O46Z79g-Ba\!2aXijOH8#&&
+%8bKF?L/6rr*Y7[SDe\pr;XKGi:g>KH[&S-)h2';'n#XHjn/%^g3E[[(\6"c&\X'oTk$(L(2jWTG.A,%OoS$;5F5'qI</Dpg00W0U
+%ZK1u3')9&4?-%FO<emh0V,(!][!iV/6nAq*8/>YpLdRT7s(>]"5=T2nfqbRJ&b!3dCU_X;*ln.>mqjfJWam;Zm]#*g]e=o[q`+''
+%["!Q!D!1`1TpOq*>OGSFX*L=4^>;*Ccb)2JfG1$aMt\L`a2&Qkk'`Wj^ksY1WJSQ[=O&8UqFG4Xp4a2nXl*)]r*9*(95^FoC at Trq
+%atF5^!,g_&_$`]!`kn.d66#=%Q"+&b-FF]Y at QED2'kWKV at 3H;f8;pUq7OVPrQo'[!9>c6V^`''Ej1Iidok[^p+^`b_^Q7;8&=YiY
+%^O*52VU2D5`X.S,B.YmRZ3Dep6!u\<0,KsH=CP-ii2"+g<0i-qd2'!k/1R36Y at hq@EU<E-]L/3U%%0Zj"ti%06 at YHN$l71j?1oFJ
+%D;iHm?HB$LAaTRPM$k>PWo,^F0'DT__'^-&@U[PoefM.oq.)p5]Q/)4Z3e5&F.Fr at l(4JA_^.W'*%)04N++b73/2%fb.2.*IK_id
+%[Tlmm&Im]#(1DLj^**s,SbSOA4G7'Fg:,N4XV7IMegR%7lD at lur[(<leY))Onl0\$!g,?$kkOX1+(K\mpRJ8I7J-UpqYr<]LkCE4
+%hI-m'VPPetn6d+\KKG.mrs5g8\9C"TlfU-:93:f_F^R$27)f(lFN%hFDbffGCQ4rI7/mdiH2<Q(pjBa))Bi*,pW*LScolrCH3ttf
+%X/ksY=$kC&/&CHgrU=T"$=!9"?,$4OJ*m2'bMt%cs#k7IJ&9$LLC30K^Q^AN/euU at IOQ66>q24_i^rS4GH"uq#q5U)hkbob=&UYP
+%rXK[e\ULMcic,-#OtbEnE_FsQbX)bNY/2/0Yjn!GW>=Nc at W)#5:lhTX*n+6<'P]C%<G&8Sba"U56F"$]dot[WYgA@@:);;CF^M':
+%ahM<%AB\_G^#+P(KYb1nh+/dGKe/V3>h"4 at g'DC)0GYJ>:[%p^;(h>PD89"^hi>Dd2WH/sj@%u$Z't.p1K*5r0bWXU*F["pq=4P&
+%;>NGY-T&bj6:&+<A3`ATIb4/pk/!`35WXReBoI&!,f*1>)Q!!AWNsIB`+TmH=0^IfKNRaEMf$\\'"&A4<[-U^SoTcq=lEFooZ at NU
+%iq?do_kQp<NFRg-/.n1ZJRj%bAdS@#a,$r+"h'D*R1W_?>g(eJq(<1.j7raj<Gc5N-Ie:;!_G_;N*7E2MAc'T&c?LS`q8RYJGPJe
+%VFfIT9n!K%Q%%2]0(`A2[erkRJA2[B=JL^ZV]VMA#JT0)mQK[gkb$eKiFPI#hrprgDt!bsDfu`mZD_3jjY)T3)iAh;'T.)(n*/ZC
+%VuD]\)+6Z&ddk+D=n&s8G8L5\.hYMN^od#Y>P:pAlg%p1G4Ap(O5n:<]KLZ;`Hj2s^TREd-5Cq7.QUJS!B at QjSfLAi0I^\!8odL0
+%p#Ni9;g;kPY@)>hC3l^O841H1[Zj2Ec"l]tD^Z*n/2"[-j4&WY!:J5*cd'=<0e?%S0NQ$8csCf.6XJ@,jei3L:Td`'+8uafQX$Y=
+%!?=0qDHF8e]4T+LETL!AQd36b^b0eg0mp(1qWLM>"db,shgt'a*/7A"IP77[a9a8:>['#U(Rb!0e^K[ID^6F-?C+5%.`h\fJ+?UN
+%_KNA1oss,DR)W:s%B.QlOnEfF/CIUVrUWn`LB=XfW1PNe4e#klh]#.=-)m[@a_U;j:C`hc8.Ld(egI1i8b:>m:R+*OGtL?rUmc>C
+%@6.6]gl4LIB$$j^Sk<=c\rhVm+Hf0]o^U&O/g3Y_39Z])%im6q63=!fUsR567=09#[D/Ls87msp#\frn":?TN_h/lfj%A61E-mXI
+%BVP at Z4dP3hX)ds"lSapXPHUhQ-$e$R>D3EX at N@$Yl_&aJ'BKOrrWsS2o2hWR`$N5 at Ak]\mp(gVRkY^FBDhSG-V*=-fnY!=ccP-Ti
+%>6(i1d$dT0\jYJQODO`7@"A7$.CNt`Z/n/0piYMe,i['dC'_t1,>]#Ld9P_X@;>ILVC%pU8s.@@[*[6BRM'$&5dV_][N:)[\UtjC
+%gL$07QVP'6q>\$b^O[;qe&LtF'WuWO0'E7V`d`RE/l<P;K[Q6qoQ`bsAKDdj7bF,3>FunPaWm7?)LDs]6c_CM21j[;,Fls6]QO[R
+%XVqhhk7Bo)+`n!af?h0X$Dg*D4lJApJ3&O=5p$C/Y^.D/o%";J>amLdRAo"\M=Y2.CK!.h`l&o<1k*X9RS^cp$I1N0b_8[6+1*QV
+%96%Knje#G`dQ;sF"YY1q'DD=Lh8^VWhn8X=f7/;Ml,39"GAR-uoEKU%R$hBY\e@\e<-1l4Od?-QX6$-tJM<%jZr]:gCg98l,G2NL
+%KghcU<1<L!fum?hSI=`'Bt8h4.,)7aH=[tX_Q+)H7e^Y-W`pV:LjSMt8Oq]E#"MjLOX/F'c45He!(]V*Bo.%0%MI%AW^DdD5=Vg,
+%;GCf;BBbtLZalTk54q3;i$.QG2Qu0k*oq#\"q at S[7!S3]Tp3J>o+L.k+t"_"bAu,,/,`_M>r_+!V4RP:Sp;q9jJXG3kfN472i6t'
+%P%HoA:(&MeKC6I8]#24[.iD2h$n8Zl.5n*R$J1PUl3q7T=T<-p.oEGZKptq;PqaMAPMltPYE[sS3+IIV87V=R+ZH5uG\%(%oIT[s
+%SBP0g7U=tTZ<ur6469j[DP-2#s':pN4hBbmEMoYimVIn[I"0EF1877=hdHGSo/"!BOkKIhr^D%0bNVfp at HgZSG,dK,PR5o%WG:bX
+%D3p-+1SaagV\pprT at 5V2IE6.UnsYck&t?657dYb0gFQq%1H[F0gZ at eh.V2SW[/Tm3;An"7-f__!1&a'+i[J8T:\QsC],3B"g]At.
+%4$E!3^&d);RY&'q!q_eBr'g,#(u2*gPMO@>%*W"mE at 6%U,PZ-C!Rq-0bmju_F9"k0'-t/V!4K3q0fp)S99IFP>+^]`cSmuFq&.LS
+%R:k<$)!JpqEGj*fVogg7?')*p>.HI;@IF:g#P]i%E,7,65Z/c5i3BZY0`X at BZG:&'Q^nIf0[Gqso$ljN>peCjd2urIV_5c-GqNu&
+%N*A,7dlPbc0Fp;"cTj1p^l;\W*6`tr*#tsI3-Ys)15G\b)acb>adhN#R,kU at CO"9K!(sA;YU=[YK-j_i^q&0c$(>t'&/3=<4&ku?
+%C at 3"_4;-,BjO!OUj*;,?6U&1&\qNJLeLin:gfH36>uRXt@!Mb;m9<6dcbjbMJ$im3#\\u2mkA`A9O5GTL3DCN]C*pLk%j!0`+=_k
+%]#X$Kf4aU1h+.5[\!C=:\g+i-14jK]'=dM1Fk<8P5Ms%NfmS(4[<Cf"q^^L;KC at l[WYXRVQ<,UQ\T%::4g[8MC<Z24Msh$HUC,&3
+%!FPRJkGuAZ&TBXh;K?"+P3p1Zp&GsA6_n:o,?2HZ4&D/0R2\@+%7&+F+.[0X>!C5+*Zgb4LRBg$(7&.VZkp'V=ATl?,(>_-L(b+a
+%&\lGX`0cWPjcmd+AmE^$BsM2(+h03qPC8\PBVH22kd67N9I:753T1S&94"<Vs)F]r'+<1_qlXR=nW)hkd;hgGn%&F7Y.3g.q:`,D
+%Wpd;A*?LuWmai at EG$H0Jf$,QPQPUQ;ejL?Z7cOD_c1.'%lUlW8meO`ZAsRR<bIm82b2u`kGca!Pjqa>/q*P+5:$jX.-0KF)=EcSN
+%0hmI8(7+>Elc,B<D1.,X`V_o*VupC2Z+)@JoU\jt8]Op;YTs6O[%#1SDgT1$ik"J_k/skkm?jb2(JO+G$g)TNDu*eS;18G`$b1CV
+%ZCHE,`TK2&]Walj'iNVq?DcXE;>Ge[]eE=ZGOIcqo5ELbe+hn>VgnABag^=[2o!+";r.])ql/"crY?@)1Pmqp!(&J.\a?c at G#I:-
+%>2d6+]rOg'jPK>9@$T3JNmmIOIgZ-Qo:N,a7TU#oee!,Xe#K:jWp4Je;:h)6P'cDPY#sJ]Hs0\FVekYHEj^*uLNal5cqOIXkCGeN
+%s*E%Un.#BKjE&?.Hug6.B]Rl`kZbE9`U/$Xci4]*2ju`N>da4c;bLIY[Ih_g??8c3Sthn9hPVpaVS6e[lC6PC[bCRE'A2r64aUW$
+%\M'iq\,4cQ2Z:[Us"6ri>dXOW!U$6/s2XO,qN<")OoRTe!q=Eq>>tTG(@LaE)ns0&I`!24B='5)D>aK.SGng]F1UsX*cceb'd*/e
+%ggeoF/H4(]>2o5,]Hf44]nt89)B6H-1HKN2c4$@77's5]'Rd>4XLum//s5]?[8-sD7.%]?FD;/2U>[eag-<ni2b5]u7`2a\d-("t
+%p;1<=!,m7T<r,@(Nn%Ssa#IPg<u/1S0(X-a"E9aOiD\MY_q%MSL1U!8a)>a*a6Z)h4D$(#lN_&E_p&cu0u7%bl>Z<:"7sH,?J9#e
+%Z9 at lps"_V->_gKHqjp6%Q&pETS-\RQUs@:C8&F@,.!$<*8oDT$M*OQOIFS_-K758O<p<ip1^#6[b>@KGnrGnKk<:jRe_,U21K'(H
+%dn,W*4tNWGEm'rabW.p=Bl(-@%Y*lMf;PamMXBea?pCh+m)=WcD`suoCiE36$>Z%=N'NX5l0Tj;hIXP+3s9Na+a=6mQ(B3?HPWj5
+%EZV4aT)IT<Quh<uC_.T30\EM8-9GJ[*pSViVa&t05[8 at hbT%*#.]Q!\LgMGrN52uaMWtd&i]SmQRM9a-M\q#U?Ug"LO;;g[7smR[
+%30iX.1h7[OR4p">BdFHP?/[`,M;gkLfd at 7rTi8ua@T3XtoR8h,cAu9E7,=V7N\Lb"c-A7k`2t'I&qf0Sa0NNke`&;BH0C>(&WS_d
+%o at RsQGcK<Sq/ga4CA72tnI<@HWK:+L*!V,k[^%3C_.,*MHR8j4GK,?;r2u64d7YRJXL?;Pg:><*/dbXW77VdiWNW1ne\dDn8_;?;
+%2#!kT8SZ8aX5"Xc:NJH0WK'nsWq at W\hHW[P02R0_krE5RkMfFqA at mg$ZpabT6>n'3C?WG0e43qmM8Y,=FatLC>QX/JCcg\IU6dH0
+%%K85E6)cDPcoR,ucP]^$IAYs at YOV)?;D5EYne29"f+5K(8FAM at jI`?_XBt$G?MM[0-8p>Kr21(cDr1Kl3.sDKjY\s1]hW?ZF%"nA
+%9s7Kap#]HOYhjH^DgSsShCJB>gXk2kme2NPJ7?h(XfH8df'Ud'?"(=bVa'!9:N"]1CYb#EgGc;#h3591rD]Xs"B1q0*i"]AF$?)i
+%R!ga[R?!]@-"K*Go,S&XUGl,[A'T5 at R?$`5C&6sQPBHc9][$-ps+2DgSm,e&8r^qA<NCMmCoX2S1fp*:bJ=aO9p[:q0e?M\s!U=-
+%hlXcY=5m5Pg==pS#*e/dSih3%SsTH1I1lOqMYP@(\[]mprZ(:?)As)?$#<T5/LL(s1V\%_,BnP#G+5&hfp//bjmqiH/KO:rcE?DB
+%`Yl5.U9.tJQ4frKQH5"&S'cJ<V.moJcF&`3/!jQ3oKCeoJc>VO\.q\ce(TUG^?66GbEqC4>=D*).n05_8;cmCE;\4aWTL at .]/=J@
+%0lkFccTE1([BVW)XDsMO)T]6>FD<TlrRFbD;o8CFjF0=$C-2+$9&oaNhq(@e4a("1mc*:/Y1KEl/RKer1!5M&X[Z"%or*8GG33&_
+%C2\7,i6!X,#al?=KE^MV73dIPR0r*df+#bP$k@;LkJZ/`K+/60DH^X)RS,4o#7^E$Y*h:^\7MIt$f>iP,ITOMAn__lmaoiJ?;"\&
+%e<(ff,DuBC?FL01DJ'I]3Z9")q,H\MR%WBEXV/gKI-EVu&;8oVb0_UhJ=pe^LU/h,cHL_.I^BldCpC<dIctgR?'!MtGn/Q1_(T$e
+%n1`l_B/\"'>%TL!B.IL8?'[5-.?07SMiq\nTl0MlhUCk1hsKte'>)::nq1u6^JR:)ia,uC/SDk13K5V[@$eSu&:cEa=j at E-,na<M
+%D%%(*qLSftk/XVP\>:]s]##el6Kc7rYX?fY$_1!>Bg71?"#->T8%mTk[B-$_>Af?m(O<3jB40jgI$$K8>KTuEk9.1O(R[;%3jm7M
+%.i2<CIiF7KQ64>QKA.+I>Sm.V;Tu:+&./QC6pTjmgcm7NeDU,)+29Z)]'I0sb['uSaf.V"I`G[*K&eNdq.9D5$-8[2 at PK8^L?'t`
+%@jMusb&oD;_h'mnc*P1If:Q3sB4.JL`iM$ERmPF4Hlf%hh4W$P?JTG+hi!VCnQ<hE%#nBB`!83In'!,pf$rXLlD=L[^e7t]5XeCf
+%:OA/sj%:EiO/t2ai^lr:dFcnE;5K?Pai at eDLEM/-;5MT1[6B^pNCK0scc^^sBk at _`F*6?j1iA4 at T<68X<paFuHK+6<3[LKi-XnB.
+%e55-S8mFlC.k+=I741*uVhBq"$pc;=(8&.;Ed?Hk,<p7eqcrrgO1`e^dAGhb:_-oj#-TWt'TNi at l.hRYo.J6=#o!&"Q?WsW4 at h=<
+%;/PbP4!&ldBM;6km8Q0P^@eV.cEgm;X">CdlMBEXa)OLaVTJ088LOY*b;X_GX5*S/7SqV2dZ!"On&/#FWh!S$-(IbTB[q$Hoa at f^
+%J)@s>G]aalnAj($BjXQ+*Sd'/r>r"!BC;P-rNaoOc&PUR67B#+M(?=$-ssa1eOPup_el2HY'ue<?fpVA82a.-`#8CYCoSq9\ITt2
+%cd1;?FoTK;0-Bq;</.iNoCC)+I+7h/fCKSsHn9@/3`7[Ic5e"tJd06 at E\^K$I$`TQ\_1Q,n(ij5Ft9olQ$M/#6akg9YinJWpE)Lk
+%bq*L\bu8N_C2WlaX'XoMm^(01CLckR<_l(>N8l?G@,"E.r45Zo7 at u>WqbP')'Il694gt4]T!;>4a4"+>l@"tn<M$[kO_e42"-5Xb
+%bFFOg:]2<bFN(/Lg78oK/UXm#Kc)Z/hnV2J<1%+l)_^?CI4EHCNB2A4hs=9ML>c9BbW#DuQm'ZG!l!@&pt2@^?dCm=Nu[Im^&I"m
+%r17QmR6U)lJWJ]*=d+D67X`n]X06b,OBYf!qqeM\hfQgH'^32O`@(\6rR7h<`8!fPBPfIF*;sTdqc]f*T;]X[jtl02E&*05ETuL`
+%V>`)ar=qTc!efn03U8l!)3hbocs6]k=&@YnE]L`HXObLV`MqOkb%qfYb1S4VV(1M"$AkupSVhq?pUiE:V:<lPV-0TZ_<I,qNpA06
+%XIR!&_>;Z4A&Uu!)6F--VffN=4+<IDJmY at _`,8saE?qVD6I2F?04mKi`nT/W;RdO\]"$^E+BQiXRp&qQA3WqeB(g'$WP/2E6Tj?'
+%nP3lk at dDRJ4-Ib:]S5"IN_>PuH`qj=mY:<dQ^n?NYM*L-QKY`dKlPp-1\^(6VgCh2fr2t0ifDg60_^C0AJ/_NpEi\n[2CH-?MhcM
+%pCb6$=KGPqIN'lJ:8cnqhP/NTeA(r6IG='N]m*6%dllIOYPU0>PQm\U.DGihpDb0CO0`1MMs+k#S2A6l)&Jmb\+"#(XV6Pg#^eYD
+%l>M&Cl"[<WHDk0f%Hdum22d$7nMn;-I,4-thq#A[CMT#=4N>^c:j[VYHFZcYi;7hB>d\$Vg4I"22PbW-U$n&QRN<eqn*Kf/C#r!*
+%Tf(<G<h]:NQ)L=\XnQV3B6>]j7O@?s@^bkTQDO!Ik0HMHZQ at aV8(-0+]39EtNTD$bT).h`8,VN]\urEa8dd6Cd5%m<Po.E(kFB\B
+%8'AO#0$5a<f6sf5cDb?4T3P^1#c5fQp2I:m$cLbbe!r1^Xhe$>Ds035X;!L?hbe,MXDso`%PSWaZ]%1"R6aft7^28&.QRm%T02>A
+%eadG$QAK%)pI=n8NeD<IZ2m^gR4t\@D\3G'R-:t7ds at q=SS3G$JSt=#HHm*t="D.)1u.0b]f;YUGWcd)55iY%WP\EDp\=*eqDAlQ
+%^L8bQl*(-[Oo$r,<"m""`S)ur at BkiNF]p=bA.*OillB?BAP9%jCpg,eI9FWFZ"ID)@TA=d0 at o]H"ZF<g[9p#Q at X2:<M.tmLb`pi(
+%nTjoR2pRZAb4-AHei1p>g</q["#?GO-FdP6\Bk+,g#unRdT999r=7N[BFhhCL&Ll9bk]l(T,Dd/ZEJ&"a8%@Z)Db-lGpl$1oM^.$
+%F2U69;3dW5mF/aKGCYJu6B%U,EU4VDH3E;4`1Y[W\(1/ZID=*1;.nQ;b2*>F`:q$,^E;.^FThZ9CMo#kn"Sm"gL-&0gD,f]J+kJm
+%e!^s;(sUXeih27)h9Et;qZd"9k0qNP">Xb=Nrc'BL at o,SI;@pBU6!@4<7Akj.T*POgctFE>*e!2Y.+VD*rN4Tk:5K'p"fR0l8g\\
+%d5rP&qptdiU]5X8fA+g37]l[7oX)K=q9E`)[5F5bf$`6?s#dF&fU`%Z4h0s-`QagIcg]lJ/,rNApt`X--e?o76]7o&Pu73=$DVA4
+%P2Z%_j.##Q-5S%F>s*?`HI%2ODAS\G8T?B)kI?i%fV*$pR*Y2GcN<E8i&j(rS7aY<=j2(j:4-]*mEBXBh(tT^_EC]%8'"\7-)@,G
+%oJU`[;3l8Ra4[V:S8WRjQLfqQkM]j0F/Jc;*2g]39jC\>L@]LWmLa(kX2i."3XK.:pNXKZ]qnZq.h;:gL<3e+pdY#5YP7^A<J=gX
+%'o:7-GPV7JB%@+rl\]sFi`Yreh>9oAeU.;F\TA]1c5e^@[0VFCdG&6(&jMkapC39h:Fug2+$\<P+]MkRQL.$t0fXIpmShU`5*o*`
+%<m;.f^7Fan(^J]Wb^Xgkl/V'Xo6E.#ifC:Z[D2EQb:>asq`KpbUUl at J??2m_osShYjY\*S*$8K5^;@ftP-<0sGN-ct\B:U#2RkQo
+%lkpUHBfLFN&:53HiQjK3=8n0,1BRQZim0TtO?^X.(#(pk at uk*!)1):@[9)nSpbTQq&T^0kMDhP"`iY?:[b&8P0&=jW:Y)'NI^6;&
+%./[+m=h'Iq2sK#qlN:nkQbV,#Jih-Cn2`Lg3UpA6f!)sUR`Z:i2[`+E(VeP9Vk4+ZVIVb$XQalq\&riL+CC^dC[oF%G(Do3mb#uo
+%2[6[tM+!p&$ob7KUNsda="HAY?i!s`_.*9R*g't0HCN at RidNRcCus8u3:t2"+c`_CAbs4gr8:&fbnE>=_HrIVpbIjOhB'8SFJI'0
+%=g<jt7bb,op*/3c+trfC*kp at GKftBRiS3G=`m*C-<Mf,ep&"p`G>(02^YQU&`JX(*5CVsJ)Mbddpi!i?d<HVf2-'LQqHd1Z=&e'M
+%`;<<@?S&qkj2^n$`jbsSlHcqhYO?WV&DrK9iaO`1I\"AamS]<,lX2&BpoZ:Gfd-X_EVa2rJasqGnrP=c:++!LTlp1hmVXq@\+dkk
+%7rY6uWq-st9"$kYbYL?h].6&SDr++<X9ukR1[Cj[oAS*_0a98l)8Gp1<:Qk1:;B(dT(qqLP['9k7j%"iC]7M7:\%L1o9-NHX85_,
+%cA&HKUV>O1Q3NiTY1h=D/O-?f[l!4<FQI]:A6Vjt4V2T8Ci'@S=[rZJR87HE=VUK1"tUf6'.:s)^pC:O?3<;_&+HqAFmWQU6TeFD
+%A:>&e*=VhSCeLCa?eRHb@,]hfQi$J#)`LnZpa3Fm0",ikrn[&$]SCqP[=`<!T3kF:Xr5D`HtDj;Mj^io=JZd,5>//OC;KT'@D//4
+%h][7\`hu32Zm^bmbJ\0?m58k8%NJedi`.>V1,4'Pd=5m*Y?5?ZdO4<J06_`.KM5&%B8IaY:q_43r-Q$;p,ki+34Mbpf^$8bYI_<-
+%oD!H02Lf\rL#`)Cp[D?nYENk<qjU)3%dl#;P=u+Y#YZaE.i"s[2AD%58[Y3sSCP`&Pf\Y at q3j'aW at Fkn\)3uRSj7r^-8b[97=l/7
+%17?\699mT"7ZK:mdjpV6Pi\@(1R<l":BV^.,X9P,g;rF%V$0G#+R`RZ9V820AR:OW"Z9dO)(7:<P-VF74 at GC^,PdcSCmM>Q.?!7\
+%MDFTcfTrr^))"QaOL_d`MPY0U[302/A-FtTcMcX`1.Ue9:ZS*[PHEV9rG#UK\@0=!fM.MS7H[,>G:V?,=U01dEs?YL/RY.[&9/%.
+%h9jhBheSs)"&\hC'<a/GbJ\2%oJKeJROik]QG+\=?^%=iajSeZfP at eb<@7_>Obq\#l"dSHq<kH.dar$oCU3Ri=o+R<I8,[6-;.]W
+%i\am8^dEHCQG+\=?^%=iajSdOl"dTs2)4gn/MZrK'<a1]ROik]Q9P7]?B_4hajSdOl"dTs2-KdE(jeuC^<4B0ZLi^'p6mO\9pWL?
+%94*mZYK>5EAEdl=m,)#Vlr>B=A`>RMqO/s`qU<)(94*mZYK>5EAEdm8oJJAsROilPM1:_"ksTOfIJM?anT2H>P4C8Fh),"GdFKt]
+%Z<gC'9Z`-hQqump9<rS(::p$@O'\Cm^MOcGZgf:%1I"uBlA9(*q-_O_FC)`SRHYFs5;`E6Q"Tg?bDZ(pc`DMs0U0[PT at pP(?+j at c
+%W[@qGqRW1[p%%tFE`PD+)!Vp\fs<?f]NEIJ-Np:A\stqVneO64qICu"<]\>q<+NN,$coCKC&IJZe%`Wq:N(a_\bl0>(_Kk7p_Wf9
+%1C*e_r#[Zoq.e1Em8LunFUhf>C?IR&N_G=1Pl0#G^D8goEJ8OTl-4OAfK*>giX2^ebAge;gr3:b!:K4dgeh6N0i=InX8RRXFVLGE
+%+`).ooH5'=.47l:C/k&Q;L=;U?90QaNlF#4&3!s%pZ%)@e(P^s^&GU]CDn4`7WEN,$-t_?2rJlt>8N2AT:[tX&$qcqE6mPqp[KW\
+%4jJ[3_fFk4H-LsoZYA3+8rWKb#5-j9_r:^'he?ooRn"]=?[S^>W[X;)%G+bl0)^f;ht;jR7(VCRqlX:I`C4#K7tu#"GTRrDa+mNF
+%W4;?,.Wms'7XQCPPaPdpM&T=O$faVoIC^?TpY7`Jj.&<U6>m?@IK23-_^F$'jL'D^)ZF+h<HZ:X1%OWRX6WW`l[c+acrD%Z[iW:&
+%ZAA*R[T\.6kXNeljD_<hD;%1#&t&X%GLWpeJRgN`qR>??9ifK%d+YqfS*lnbEnQcIp2(W@<d4!#Ieio>&"E"BnmCh@\YU5X[Ok8@
+%ApsgLm#!>DN,_ESDMaiL)i=\o)V<;r9fJ6F3%(tXJqN(3\SlY'>nc\,`-'/2F:^Mbc=M9'N<Dt]Ea*"n`?f\uj+>b>>aC#&1!U-/
+%8ni1cSq;MdiP*uJZ%*Ok.hl(ef,"_PjDF%C\$[N#O&c`]I4:htHD3%p]\,`-!6P9U!C@*#=TFh)L_k,66M3%^&)3al2YM1Y=O%)A
+%YGLBhX4lm7T+ZO.ddpmcT=)9jU!rF-^N;P"-gm>#qr!i*g?EmdI0/<'T?_=hm&2OA<BVnrVE-*4oa[uphA>^BU\(t[e='Zo.&?5Z
+%%8dm]Hf!U*lmW))?-;#I4XBFVmTC;#A/40A[GM[G1>?TRdr(dt8(hIg__tYgdGi3Nf/=BA3)'PePJLHf+2"1GQk:C:K_mdgI\fg*
+%;a7a*iMUB1VHMl)RhX^QjtTO:%o^?o`H:T`0"=We`E6S%$T"-K<L;$D1,54f1RcU*Q=`$\Ji3')f!Cpu]aZBn.tq\*.$eD7Yt&e[
+%2.2G"M_QlN at Wb8nUWF:.<eikR9_'Y at M+WuP/5!N8'U"rB]/R:'/bp<_?V/&YpnQEWZeEbBQ,ar.L/!%6Q:,OS*&S>V.#V!-m1alY
+%,]*;'eUNUk]QPpu\6'_2(AGZ9lm?N`"bYWu_cLOjl(6$n8.XEdSqK:'5bBErch]#]FANk>+bsM5'?t#;'Bp_`WOZ0oDR0)p,Ji(?
+%#=_&80OPYm-daL=J--2DnUL_2p*O1_/C(cGJ^'"d)&)eDXT(,)?l>QKQ='W^QX?W>a#!JZ\N;3$o?9 at FmLIAh4F=C01NlTAph'70
+%kgCjQ:ceO-]D0$%Pbr\K&ad,?<V'd"Dk/Wo8I2AQf)/N:X.EAPQEJl-0,2u$>)-f4UNN$V3EhcR][n-(3isr:q6Z#mbr7\5BsVs$
+%g95*lD7'#c3^i9nX])SX8#@g-qdj)2XID[0RoUT4 at Tq7@PWY9)FIRFNeP*$'f'HQ\U4k7AHlT`_EA1eT%JV7sCpTB$1f%mOCHF++
+%K%O_Lm$i`m014E2Gk!_HZ+kS]hqrq[0RihW01#NumGYr9iuH9,pijE"&VmaffVLRF*kNirP[V>QZ%l.H8(7dQGn^V1g%N>EG-$=h
+%XUrPT+;p)))ut]^-OP=^n0\?(Xnh-'fX5ZWKL%Ze!QA#3b+\MY?pEW43/W]Ue'SX0!q/IHP@`\ZF'OfJ-F`*A8M7qAg]]Za_n02*
+%W!2Fo%WCce=po$X6REN]2X+(8)_c,a):R`SnX0X'(/q/q(pl60OP9pjmW[id(Xqi,"m#+O0&U`a=8r4P'U#e;Ir`Af43Pn at HfP.`
+%Qs#r/D\m3Xs1`dXf+n$W+L[pAG$+Z+s*t%H)#Z\qS$%#*!T(rumK,TH2cim:m9Nu\]^=LX_ at 1iU+VPkW;>7$h+)RQb?/.3B at cG%5
+%bHJ4ArcMDHn]Ta=]*-E7e=A8'S:*FPo*Gl89S?,aQ`&Oj(L-<E*W:#4)BISS/IM04l<HNX6B/o`7M9d3/uOmn:.KYd``smZ+gZLM
+%;eg/-(MgA1gSa%P\u]pid/_LGVo';_0\X4IkDBM[o@=:d^\9&k8/0L-ofr>X)0`(Nbr;VU`jeUSo`bXmcI'V$,7Fp>X^"26LU\?E
+%+l"3N5VgM11ZPUJ5E/gIhu\W+RPY at p:OWE-%`o at N(QC<r`(_fr3DZb8_)VigDX#nl&dr[)5-.Y<.m;Q\%5roo<B5UF=u:8_)@LL7
+%o68QrGY&nB&2rp.UU1;F?P:_gF5s<YYHJHi1Z&!t0RK<%Y,aBm8=n'a6WQS5D<li.j'>P><+tHjBY-rqhVhZ"4]s`VOOJ3Weg3W<
+%%UJGur4C^Qcif'k)$8]J,p23Z>/8AMPeQs-DLCGo*3Hbgn&&D>42o_;[+4XkID0N at q?iDc0i$R1]<<CGJ".&dH(%'lZeafd2%&&X
+%_20to+b48R%9H?qK_oe@;$`ICmgGsXpNc-BdXA:K0PEe>pcJ9+BBrXZ2.LLL,btH6hiLsm1C?^iTJ]Y$g)b"tb4FKB*W:"*G]1ib
+%:8bP_(H*%TL*U4c7=OZAEj'K=EX+Ai9oa+^4[qV1FWLD67nKo(YBnXGeJ)p;;d.VW7:t]V\s<%Yji)!CQQA6a'\Um3o3;@G2,1Z8
+%=\+uaqrFR!2j/nklIgJU*R;dE-ug[&H_32I-Cl(_(JU,D>U9ck#+g\gg7?o at IoO59-so+1h^(RpruQOV_1tg`n3<-nasjP*Jc'tl
+%Y[IS/<6iX`d(>gj>4iS1n#,a-d0Il=5Yc_46T0Y7V%7o?T\FeBNXKDoL>=lMVjJ&jX\=nG+;Ye`PYJOkGI?o%rTq5l1UiC>#LS.!
+%Ls5`Nh01Wfk7[f\ni(E0YXH5Ppe*Z%Ni!mhm-D=M8KR7-f@)b)='j,tC*>cqZT+LBGm;a^S"#75J'Q@=C`T6ni[/Cfc6KG-oU\02
+%YPWqF$i82ILO=\%,`Q;Lg4Z9ljS']C/<dsZc'Y3YgVDJ-28 at ajhQq,I5FC&\LWp%g]!@3IpO"d/JW!Z#g<>TnZf06>jpBXO,:i(^
+%,-K,&:Wu*sM%]<:'gnM9Eh4h>31'k4=Qk>OD(O\Fc'h\1ia"+pltR<#LcpEL=]k'rO(@B^emU%?L"L/n at YOS0Pd!t#;qtbA`bCc!
+%iX_SskRb*+!`MNi\r4Zq*qchLih\i at A;VJlXLhB;02LjikB;1GP#+ndY*6pE4Be/8e(%"#:DS.Q?K?nkmZnYS=&<Y.`DYlP_P6?#
+%b3efN<`V=bQ^Ncq8h24b:8"R&aE<ag/ET.lDBN"ODL at +[Zq/:2P9guiLDB;i/rJ)^S"ALUD\Ag=l3U"#%jMA9 at 8<RZ>qR_3ZZ1(u
+%+)1/NT,^HZe#A33ATL^\eXWfnL9n;HY:^acQfi0(domZYjssd(F&6T=q)tWWnKj``^(C6Rg[iUWSooLshQ?RIVJ#.\YI6SY]+P$X
+%^-_LgY;#\kH9X^p9bs!1TCrtb+GVhu_0ZKo+-1s_:\tIm=[)EiXAABYcq=Xn_F#sW+!Ea2+&R]Y,"*/e>i?oc.CPV=M\'6K#\,2m
+%\]ba050fN?NA\hu*,ds4q9Z$6(Ie&XA>,JAqbYN,`tX)X(hAXn]M6ru0D3 at ZmW!0/Z`.IKMDeMD=o0q[*,]l5Xtg)X?JlB-Pp\";
+%X_7AFH`TsLlUVNK4S.pISimKB87Yi6PiONf,W&'Vm*A_hT+/(e9C".4PAfb at idPN<+7J8sIWO8Q at Zod"=+'9=ZnoUC- at Zh7p*HnY
+%.XF)\:Oqo(b\h%TajrXgm6FgBf9UEKXm&IB_pgkLBlG(X-3rFBHaY1qAfnIcg/@<h4'ku`3p(EmP-+G&$&#pG_SuKDor;1L6fFX%
+%Aj/\1 at tMF/-]/0H2:ht?=Hn0(1&S.2ST*<"lpm at UDm@-(__tL1"h4hG[S9E<1j.0gf2!Tk'OYpsPArb1m8QABXb,IrEI5#R(\;/-
+%acg`CnSrdNgtNf6;NGY<"GrR.SO7llka7ul`=">gTB:._BP2Fmb9ER;MC\JONUs,$b>`_I3jTBCp8U\H+"ZS3kE\d4V1!Mip=JDm
+%?08+@;Q%Z"A44JK/_iCRQnur@`KPpf*BbsS2IL!.=XRIFdj!?ef9CTs(&JnW<[c<fP\k:hRWSAfZOo2<9ZNpaj#kc;A2/V4MMITF
+%Q`HX4[rb)7SpCe!la"R$T>]oPd at HdaD#5\tHj>4K%b0`lh;P at Y1;?>\,AT^?j(u$c&r1amONoS\\X9ZCF2fGL16'tdG4K;nn<Eap
+%V[5Pp`MjF35aprh]\3WV-1.M!LiXe6],G_1\RkGt-u6K&UPn?e,J?kd"CaUkgQ1sD/'a;CQ00s<BAYppnG1t0/h]W.F8VO&D"--0
+%II+W3gq".\T at n0uh3jfYiKL<Qq(pe%>]K/WD<Nm>]sT\a`P=Y=5#/A$lSHU*l?2W7mc3-AK5Jn7oEm<jX17mf[[j2I`+PI`rj2nY
+%B'Wlm!JjnRN-!RIVN]+`?R at 1ub<C84VT#2a*&BMS8UVr^i^&u&o,V++\i#YJ3WO at d37I\bB`ugGR3"@VSn(bo[@M6Xk<G6Vf1p]\
+%56%Tu^38KTo(c'mo8Sgn`VKG0ZMEWU]f;Ya<&WWKGqWb<E.7B]2nuP^D9$8/Pn%$85:>ruq,1SGjusNXc1tW9J3AVE;kWdGiA)`E
+%f>)!ZF1^bJD*)cr at Q1X&F,"n,j*a[gpN3%l[63o+VK\Tsh9>TL6^ZT5!X>IP)'m<]]``/5""5H<K9G-We,)=q\68Z40+b^:EdkZA
+%YA09F"/0`u$somml$M8'^#C\iQ$XU0H#<>VddF8SR^Z4>G2_o?RX'e!n\bS#)h-8Zr?l\M6:GeeY,#kCCaG4Ms0!>s(*E*Y0Dl/b
+%9AfR*hgYFsGG!cBr:9jI%tFQ00p(`$lgA&J,J/pliVfh`rJ-9_R,.Ih73,VD0GF%DP%QnKD;0B5elWUB#m\GH,d)FWA[>r`If50P
+%0=[OP;lhHH(N7qXng&3H,SGsX6mC%Yjo+q&pP/\0phudr5<N3-hu:OU`CK[sGCM>[p?_5'_hV=&#jYZGkU)V=9G at 5YdCafJfBS?#
+%XT.j<^1RC`jnJdRTRYYic#5Ojr6K*KR`^'S)?,YnDYP#bnKg at 8c&Y--T14=@V$9.oMU#UoZPgT%e!Xcr2+161:Z-lcjGH>9RkI"c
+%LAn<^i*;ZMZlTQ%Um]UsQe'J%>H4$E?`q9$=Xkp@)*f=')>O%)<7p><$WEgs:]N*L]-`p7(k0cgD#$!Z/=D+SGC:Xpb)er)L$Vr>
+%rPRcEmIcD3s&l5.Y_5^<,P1m-lLj6mgB;22m=3K^p,c\IbX;ilq\bOqq?ct&=i0XeLpVdZdPaV>gC/)se9lXnFn+Y(QkT:4A'Q:s
+%S"9K?jLLA,DY/Qb,TLUSh5AXRdspk'r17Q=ZF!@q>iUTU&=M^;reoeSJpF]uo).1Fpq$!Kg&.;$ELX_U0.fMBEsLJGIFecpO_E'u
+%7G*k;^rsGg-nI%d'#7>bVntm%.jTYM:g%"4+U/@/S1gAtg_CI;:rjF"0GG/8:rq^LBC#s3?n>grSjOY*N$Kfbp1=$2(1GAZoVPt]
+%9\V-Jctt2N!%CrQ"&Xe^$s4:_LkfFJ=;JenL11Qn(?5H"TeP5M$tU>_$Hk0rjVT3'(5(ho0k=FIOm^CIA6Fqtm`R=q=\c1ZB-tt'
+%35 at po3K1Zh6b(cX'R_]j/;abV>qq'bM@%:.0nq6:0u at V?%T<DrF^%elQXbi9>7 at 5Za,jjm`jmbCOC^FA\hD*cAN at T\dKF^Q#W2P"
+%0`#7q at oR8!MS>I^fN:gDmYV=+NPu%\Y*^oq=KJTe at VQ15M@$)9?p_!bi)iSo6RciM at jus;V$[gP=@s]'.K4BiLjqj]lNQ]3.g,?R
+%W.*U?^FuRZ77kJ./#f118]A7kWLu[O6+ncs&2(F3%kj5t35UNqiH,5,Z7IC0FThrS/BA*>jVT,ZQ5GKMl;<d'^I5=[WLu[O+`C^c
+%6&UnXHXBZ:Mis$I?VhkW>a^2VC_cnnYX/R,_oVQuF\s\^$M&U:>o8K_Jp^p'(WW6qA)A)eoasZE.EIhr4G8rS!C8KcgH7;,<S4%E
+%TKa,jfV5>&587,MU*u(1-n-8kGeN=T at nqS+RJ:a_qibqO7JW8,fFfrNpc7P62#C6N86TPn@;LAqmP]efr>'$;ShfK%K2G%n&jq*]
+%dC6N1Ur"W6qD6Mdm9Jj.J<rD!RmTV4X6g&@WmJd$ASpRAF`:Mn-W#:&A/Ki(^Y^^^3ifd5cZ)prJ4$rl2EOQ!816=AT/VfDB]ug(
+%h[/YMdg-b\%O2/9#;cH@]X+^P;Y>K<!7]]P^MEoTV#*%[S#9]o[H^NF at Ir"/Gr+BhR$AC=hAU#QNKf[h44<a5.W!?<)I5,[YTS_d
+%<=nL"50E(M!j/_#!1@\)g&_ZtL(TC1gl)MVad-dPdrTo+3/&%=g95 at n`_!29E:PdfTXp-9V`L`tM_rpQDAJ3b3G$;=6g$O4b^pAL
+%9&71]UlBlbe-3+cLq-G*n!7!Y96k:bm$)-u;Q<7KB'7D,ADj#[^,<!#'`CYW>#SX)h21VrRAc<08uRH^g!SOeYe!74o\Vb";6K9@
+%6?Z)Kd+KP at FpZ=I,'E'dYmZ1al*XG:mG,I#DSE1"CZk]+F0jM^;d7_V])O?Z)WkcKQ94iD?%h&pbcd)V8+1?1^3k18,)oQOa8.4_
+%T1)\#ieZK)\.*%,Iu7Rd20W!6\OjfOn"b`K#4RQ>:/*U8DgnWk3\U!0n,cC)l'Cm;I:9&]6Rd1j?9U07e52n-i`K_dV+g4_c%JKT
+%(WE=jLg>f8XDCGH&2U1:Qf1:h?$!7OqUS8En#:3f1CdX!`Jk72T95\aDLkuRB!*ZGd!@F07a*P_ at u"N)8B-Xf'iL:=`ckC?X^^1%
+%_.;iNko-3PAr19%NAK"Vo*.F,kHo>90Xp`q/9^U<S(&2FAR;[YbYM)A+SfjIIT+U`I:k^gV+K]+`<_LK_k1f"KX9 at o%`]GI2G1OD
+%SDZBUbei`3MA]f(Q?pNS@#L_C1&HDJTbt4,)_%jD"_fY-+i?R8!7^ATSB\C/_$/qPMD((:gJtc#Abb_ad1O];[Z%^=SpPO(/i9hE
+%q7'QR2S91'eF[Wt8t$U47EN]<*f9qRM'!;m7Uh9b"[Q6O;m0o'%85!WY/.t*'3m)Br9Dm$o(c6c?B1^dN3gD.:R4kR at dUd*c.]<s
+%RJ'%$%C6VLYQisO8-RE`nJ"[T0Q=;i)6o2<lQ6en8I8RkBj;L0GRkhH[V0C0A[u8nK1;t99<6^(`<p#]Au;iGUY1]dflsgKqJtH^
+%#_p<Xfc!HdWYb9ZBcr_$Tdpob at Rbr;)Hg2mFV'[K[)?i?SN-#[/I$"PoW8lR^f#D\'%WTn1Q(TS<m-ZX1up1s at Q@j#R_mFCbqcA/
+%&-ap&3[&9<LbIp5'!IMP"VUWUG[>>od0#\>@MaZI[*/o0'HoOP.QgUpq:tKG)YXVc7*FbL[B1Wm$N>M-R,M>FU2Oa!FE(//G.Rg"
+%aoh,@`oM!Q%h*7cYqS'pO5k=i<3s7RcpPhqd&JRkM)`j,`(kT^4EY-_QHL:uGi(g`edSKV48%+&?VIDrD6aT%FM2S\@@l[kHd)ce
+%Y[M;Qi1_oa!K`#LJ[JqBL1n^;b;V]H,#Ga&7 at VcMW27JWVlG@4Pbr;o"=Fa"hlfq>f.CM=YE#3:9^X&%C,RO][5Cc/O2qK6l#$c<
+%3dpRpouq+ukM;(e?AsrQA<I&FIW$Y$O!@Q(B\f[U('YVP@;-*3N'JpW"t7*No7^VH!ORHT@[]#e.E>U')\"^5\aLKI=Bba(p$Fn<
+%YjM0da&CS8n\eAh(=YoumAV!;_,[6375LIG`h:bK"WssbG,*=u[j45/=]'"3Y\("C8CoUk==pciYAb`2>SsGQ"4*KOe:Zu$alP?W
+%O!RpVmi_H]_m'b7%#gXl+CkkdnKJlSOHm(G2"FCMm6[,`')9jG!nJfe>B-&sOu^14&hh?`*',jUfn%4HCi5aOj(7OmgC?&YE9aBj
+%6k$gJ!*Cf\c(=XRhO$"4#i%QKW6u$n6)77Abh;$8`V18pL/=,8+piiNcXil,.d:*XlU__/TV%_%l#cjH]bm;=4I`<K_36iR"`\'3
+%'sn4WL$4O)A'FAH`Ve-uZTBbD"mu3t4"N#N/&0!7M at 6c4m'<)X_AY0k2A.`8MVYeL8EP2q8Q&/5Cm%\80M99:.*X;[Lgltc7YDT`
+%`VNnE#Go]%4:n@('O5>MV;.a;ZT=-Z%/PA9GYmTqCEA.h-lo&l>PPB9./[rF=?.%qdZ44!XN[d9AS'I"`B(e at Rl\EJ0QeB\H*Dpj
+%7i!OS.(UPMQ#X,=Lr7*m;J&eIpLOj/q#'EXl^(\^QO(RC]"PeiLZ`:XVX^'t/n<q6V[!A8!La]jq,5dbhu!c8HRd,j2j at V'L)(ma
+%&_5>ej%&%+^kfb1?_1K1[,"[k'H!r!%@/L_C5b5?V=DY6 at YNKU8D>hOCN9qQ\TO;,#B#<KFQQ0a6p#P"HE[kMFNtWrZ3LjfGm#58
+%4(&h.I9?WFmlmiRqehGc06Wk.p[2IJgDC-4 at g&&5kbi\-a)Q/`gR3LaE at 5RqddZpOp/A_7V(#M=j+N9BN2aUZ4co/0O"YKC>o!#G
+%*#6LcgBAPMn%"@$7o/Md[O^_+!0^2:'Gk,p=)!6):12]Eam>gSj\&Dt]&F5N]&IVco8Bc6GPjo6812;;c#(OJ`!2ef4(2=gARB]_
+%Ibf2o!bCMP,u#AKh$'"b at okh_aP"<h^U^t):#Ro$GFn9/Z)1(+YjBV5"Gb:3Zm</Bc&]ZRo?B:Zq#V,`)aG*a]p$>mFN-m!g0%bT
+%?BmMP*J"i)Ib@`h6%#^&%:`+\[KrHR]?#t,mA(R8qCD&H/*R1MHXIgdISHj3">tXA(9iD;:mPL'CiiO`EG3bC6<N/<5bH'E>geYW
+%/upqJSBZFUMJa5h=44/Mq,Rc,8R&:CaqH_OHl*_#Gsl:()p(r-&_D,WC)(.H=?j7IC()qSXR.@>'e"D:[.0iL>+soK[DtM"7GiM.
+%)GOXW/[8$)3"EP/DT5is85jVJ5:a2qS(o3OQG-LscH^$ui6_M0`?d6oSp&M#B*2%Nk\8FP7rg2)Z\-c>C72?cIM.C4#(k1],j\Vc
+%nW5W8kbfW/T^C!M$bP!U:,0%Qi9Zn"U>e`6S(.^db-kRgB:!/_26W9Jr'H2l7^J9t[cH:C4s%1=rp/ZQcbI#c]9`;/g%FG&Ost,j
+%XSLpPh(3u\8A-i+R.m]nTGhM4=0?o7<loQ*?*J?hQ/=hB.I<MY*P8n.UoR#5m#V%Q*^1^joPQFtkbeq5n1?o]""[E]"Rc^<>D/31
+%b=m$I&Cjj=;bC7[KKq^/`bEti?(muUiVKETUXKJtbS6cnl4)P]jK7E"dkQ\T9AJ6l3V;"P%9Qc8oWg!p2o"/l at HE5iXeUbOJ=5H,
+%a9=f7N<?kA3\sTI].U`Z6O\0'E%0>$8)!5od?F$uY;l6c`,A4&.G^9iGM@?OR&+6\47M.T-Xeo6m.qW51;R&V?!PUL_22_qBj`^t
+%F_iCIHT%Y<cuY9d5f./^`Nd<,HLTfEf0Gmr*kQl=(d"nsEb,Bt83K@[l`,rX/LPX33?n#V:lZmH%_W.cob<L%,s$`t_WCkE%+eQ#
+%HX,R>+Is578[j?$"hfp%;Q0%p8&'WreMBRl-2%2?,g!Acrn`,&ZFnhQ at X^u"M,7&dKGs,!l8YBQ<j1Q[\u?[R9A]"H8qY&a'd?kV
+%AmC[@'tlT29gp`0PISK%]6JSYY#U52_3SBe^eK!^-0]#H-dQ*JIFBo9:OHT$/_MsY8fR))T53>-M_;MKj%HEn@=$dWN'VeGBN%'Q
+%8AE\(1KM9K<s at NjPjIo!FumEYT(eT7n*Vj4S(E)`-9$ZR7;=#>"91J`1[Eg5g*/?.f_c$1lc(XFXpCa7H.0G1--9 at 24_q]PB#*XE
+%alDPN]eu8(ZLPX1?Of>.llF]P?Ffo-?sfHVGK\Q`A:L$p3pEsS3536T(RG[g(<IkgU[?8d>8Ep#cVi0YYU#a0*H:L-J#_DI'iWW^
+%$`YJfE#+)(qir$I>-'qT*s$s!&h&G1Uiu-r_K]H#B&-^-Q";$">hbLhZ!RY93Aag+E0bI`ak^ufT.$\!B%lO_+25j:n)/b//oho&
+%`fk7sg0S8r1tQfKgC9Bn08ET"OcdJ2R6irD4i"/7.RID4gRhC*j\VcYT#SE"$Hal/.dn,f0uF/8$h$,[,0"/&V;R7`KaX$,X.R<s
+%#i&/2=.l,1>adg`OZ<cro4^J;6%sZ4R+edPSs'G)D&7pZN\@5Iq7I7O(#3j\;t-FDm&aZ62iAiNcFnO)d!pX;nn_Iojt]k2QFbf,
+%:%u%0[=(Oi:q9&"Gs:)mANQ`MU4Ab"mJ`;slB4G8<7RJFb"c>OnKcu!"moc?,HPNQ2.E7m0Gt+WScm2=16,U_71(8O3[7p- at FEgF
+%D<$6BkK-C34;G+u,A8jZ#3,PKa&.t")PT+31/tM_J4Y94?)WIjU;W-QY[8l);&U\_>8_Gf7rWR#[u<A?94s8\eDL^R7FOa<2kn21
+%K"6X;IaTWUpaWCYJft_15DbV4-ns#"Qm9;iVCA!c>e$42"-TW at _fX+f=D0qPO]Z12/r!!"5l+eWX0QTp/QuR9)+eDE:dZO/_X3RW
+%.>4iC1D8t(9qg"7@#sgSEEo-+bYO%eZY$!DK%=d8!`8r!=[#0G,)g-4VZVc,;:/G`Q+?Q2c:T>f4c^/eSk':^"-Kg^8OF%5+_Er8
+%"?@&#BtAn="-MNh%4K at u.f8t1+Y9$Tj7&Y_9\S4)pk2h^qNP6rr$oDVoiLB($aA&P<a\G%[K8OB[1udm-7_nAVCPJ72QX\d1Kf<%
+%1gP`lELsI_>b6Fhq=]HEc`aNdpZOe4>t=NcRIl^Of$A?UbRKC<e at .Skp0ZIMQ""DG36UAI<M*iH;cV,3R30G?DYE_p.#*,$nLI'T
+%nY3ul=$=-HMB%,hni#n+/4'XO1uLs]\HRRU6 at 3;XEL9Jq5_/(5e"7!e);LLN'j</@(cRkI'8M;e<k'TI36f1Tn7T\tHL_'s_PAu!
+%#q?=YR"H);`[))m*pF#nF(`jIcr6ZL&@ga%dW3_:5YsS^O!1;NK[Qe*$/r'/Br&li']q&u7c<<SL4]bb8nZ"aU7a_S8g'V,KhW]e
+%@mX at p=I&s/FG%*/@\Otp2f$<-h at L0h1\j&;Tq[8+F?O.]2%1Y8<8(:3!T]H4aaY![Kc"EHD/^]9]BF'Hj&;TnWAI2V+pT4p)R+:Y
+%Z";h^:)&LJiU7b?6C211Wg1LO(4O5lf=de3$@(Fg"3sohO%b=7-Km-nTc?Ym"?-I:(2L6Fb*6%t*NQHEbm]9(bQcs.+KNm5&2]U(
+%<9V,OOe[_t$"OKuXGq$k;)#Cf.gdXYb"A(SC_B-^/s;eYB6`K at 9LV/Ya2qS_*^D+p8P?i#.#>i5JK(Rb$MPK;Wl5DlPL2;U=Ir]k
+%0;3hF9Kmm&.Af4Ej<7 at K%Pu^6*!+oV`@o/DVRCI0$MR(RleX*C+`:-m=48^RYReZC1bGPZ,#C&S<,0TjU+I+=JIr,NnqA"+.>SBq
+%==qLMD- at bc'W/)j939137%7!d!`a&8&h0Dan#EpN>_lLS1V"-.)+XLk$k!;RYDEbQ9W#QLKScFgBN]VuEM/Nf!bD?m>Zo2j;SjUI
+%B#F]]/Q+K\FL2;fV7hW%"O<q/edHAUJTEMt:<:N(:?BfcLMg_d)+YSamZg3V#949r9>kuBG#;3k at TUbH<YgjnR)/!_m!NCm3bhEc
+%9i+cCSFqSrE at As0bQZfYU^]IP_Nu\r`cf138],PP@!,8OJrS=/XZK15Ja+AO85i]o72D/n)d8V*2\NH at q,"+DdFH=d:aR4,YYg2"
+%VNDTikT*nbdPX5X-_0I71WNr?`22!Z6C'?. at a@@rYSPEaai[k08=I[2b\j.GrdY#EKF7-uYuB8.Us"s[><^Bl.j2ol.XmXV"p--1
+%DJ_pYGRr1[Zr6f-r*pqYUaX#h1f["4,]ht73@"eOa$Fa)'iuPMo.^uFZ=G22+SES#X;Y5:fh1,k at R+.[#EZn<JM;7T&a<cAA-a'q
+%#&A10=cpOH5_8-E2CVtd;rTM%8!P-jOIZ;F+O;O(9b^/+m0jVdf7]]8LH>Du1YKDcA^4DP3 at i!idfnaVl-b\Im)4JAQ#?7rTn&u!
+%e"`Z#<\HQ&`"8I,l:90%p6-m5fG$GR(@l%S_Nkm,^`sC,B-!T;qd=P,5]H8eN*QOLA$GK*g3t0[*#;-%SoD^T]=d=oWUL>HdJY)4
+%>0q,oYg6"04CI#RUGS4&3#Md,5K?3Ld'i^0;M8kRku]9Zg/?`pfu:%f-od]M3Z\JLD5'j`E;-A'b4<Frb))U#N^uud7bL*Q_Up%1
+%&^=X(*UdZ;/74Ks\0EqJESP/HF;(m[,4?t`#C!9_?#pAnbFg>J#Ij29&B7c3),\7Rl66n$I$AVs"TB(6'CMdV`W at V.qT=g&)^c45
+%\;aeH!lL5V,!8t+6ps<$"Au1d0I!c at 83p4Ekm/Ja(q?N[-^?N".Yhuc!hS=Q`mphP"]F:]chE?c%i">tP?6$8*LZ/83$t3A$`9=V
+%]TQ&UKjYRfNGTH4>6JDcSDs#=Q#e>pM9E0t5__fL4=@_HM-?W"<!lf,C1gAfe!:%U`pc,18*WmTkLs2#T[/^-`LMiU1BjmS5,qS?
+%PHe3OO'':tJliku\1*:E.F9(BALkZ%#n7TR)itU";%hcMSkuiTd\eHu_3\ar10,&lSgG9q?X2JcjeNG0ehBof1^)kAT0c8"QVk^g
+%Png#o'_;'9#33SlVC'lJ-g0`%?=8MF6l5_%(Ttp5`P;c#\uc$a%?04Z58=P.f@*D+)^E.m<<9m)#-R,`Tir>%B7nD:>bc>12N-+N
+%OSDrfNIV,KW0RX-I+,r at C'70W\mfFTF5p7;"XmZZ(<<!]kc2AL)Aj@%S?35?9Bud/iX$DN3Q3oC%:&\"B=0Z"2Ffj])Zc;mZJ$8-
+%0lE!))^/W'n'-gnYpQE[;8-]MYdm&Dcl;,;\H*=2b`+UPqIG52ng&=3&i;N%<L_OsLcDP7HQr_U+R\WVa;Uc))^t*4g)KfZUVRNs
+%.C0p4V=utg0fT4o85$;.!F2n9Z,Ha^@+qj(JX_:(Y.Opr,=;./C2lZ4^T#2'l]dTJirXhtjON6<m=F<9ieY*YeVY;8L&qcdRc#0/
+%MJ at 4Z'Jt. at 2@%K(<hgntPf]oPd8O>0%ZGkZ at Whn<;H_6SqU3f.Fp'5;7a2F=Z^@JU*PiE at oQE`53,j]+*QV$EeEjuCe<CNN, at JQJ
+%C3S#_i]!Wc=BZce?W'[sf^bDBoHK"pm]i%"hHM&B2)?,X4C[7PZ,@)_4MY"F>9:;!(kPj2\:,dmJZuu@]j,\o=<7WT&H>+p8,9q\
+%%%A="UO(\IoU+Sd94E38%_Q2uUITo1%mUIlZ0;j/FBC7\i_8[D1Hf1m[=_0ajE)fNK.N"r-j'f"Y`Fn5&KTt>@G:lU6A)jIQj9&D
+%g%N3=<l_'B;Esf.#O_59:1SX72R+4,NIVO^d'DaF3Cs9V*YGCLB<aR\dQf)hRi]GCCjHdBN9&kc]=l!jgERgB2QQ?['"JCgpn/#(
+%^.g:XVIr0Dpa?6]q at hmV<bcQ#J2ZbTL at KgLJ=5'b^`]ptr+(3i84['h%t#7qed!M0BaR)+O(a?1`;0J]B<TlV`1H+,j01]kDIn1&
+%4qN`OPU`q%OJ'XnZ,5&sAb^4ZI?ZC*"LIbuR).sC$T'd>IC<m<i4A<GeG=uX0&?9Q#I:G82$WBA0Jqjq=<B?VYjJNQR9r`$lN>DB
+%.+SV)5cPjCp4fXirIT4S2kpLX=s('uakYVmV&n]mfH2p8OM1TY\W<97+1U#CNS5H[)lqga[QeADM6[#1*)ASoC5O92F\cERA;9HA
+%eH/<5H'<@%:LtbKFbME/KZh>LJ0`I`,Ob-`/'#*__Z38gX9LCE&erHd#"ZTkXr.Y0KL:io#"\;!9dU'8K#mGh3"1l_Bcdlg,iLY2
+%:]hsX<M?uX=cZ9ZV+D,Xnhju+"pc,K%u_>J(l].)",Oj,+oA%mS^[u]qkO'0cR4MPJsnTt"]Ce\N,#k=JL&afC4VW/clp=/!D.q?
+%K%L,R6o8sc'-qQ5#Vn]geBL;6AeQGp;Ca("^9D1R#pQItgE8;X2.X*\Li]j?+o(?)MOA^-R^*hT1K\*e,6SguFo'&_!GDsXKZp%K
+%T,8`]#2UL*5+3p:5j\h^$F`ci&9,=*D*BO_S"mg)&MiD9cIL(?1X=VYR4[5VB.F+s*5>8L.jVtffm!m*aD?*sA;/6D%uD#VpU_!+
+%+]tFS>/C[K?#3P'A;6f6I/:'7J=U[pLO`":CdnG&ji67,:nQTMs7q'6qX/q&]QIR$/sagSa%9s3c^spujU(Hdq5g.\Vrd*uUF/7$
+%PuQ.O#V"q"JW?>cM&*YZ\;7:J'`h/&n)&+`E]bo!oC0:h]uN#%M-0%LM;b&b#qOcBXa8e+Dss2*rHH`icG*YhSq&b'(k=^m;Ls9c
+%d0igL/CZJ^iSsO6oZIF(&@90_/LoS&]Vl/cJ`+lAZ%O2ndDWRI=5r*u1`8Ql8.GP=XYiN*&QDH/nM7-B>Jl`@V0f5iU"7RB<@Kmu
+%UQYBk:'/<t2I-poog6)p]T=@f//tjr[J0jc018*h'.L98>-/)1ap#=;rYr>iPo9]=mm]]f%X@(=U0Kq8NZ0O-'o"Dr\5K(HUI(S0
+%a&8a.7,nUAM>omJE.s2'!o(^/o$(+WX`Qum[ZJcP_FR6Mq5BK+h_`_Ab#Y<J%NuA_NB?5o%=sE2hg[pLi`WFh;Z5%@h[qnM,6OTt
+%'7fCNnfDKCAu&ibWRsqc8d+)*[sH17C->u,OX]oGV2/osEc&;UGMc30`^tlrhZ_?4TFLFPL9Lqj)+e*co$+(X4F.l151?cad\oW;
+%pS<slE%ASI\h<7jWpFY>YUA4%Ym(`)'0Z0F,i,h'))c03F3Hj5OZ=XkQtfTV^:>kielplR(iN&8dDiiT2T8A$r(clZ&C40SKRY#1
+%\8.Rj+OeC&8e&o2B]5.5's1F1k-@*,*=qYCF^WFq\Ks`6g6&\#;Z+d>W;0J at MmM0@H1PP7RYU:j,Y"7[^\N_^q4S`:cu!!78(/Q(
+%Ma(&8W5S)Mr<]s)K=An]'_K_sDdVDXCbDmY0<Qs"8RFa at BS0gk/AZ1;aI at lKJYo^pRnL at NGLHQAVSm&R:3lnAH+ at a$7gKu&'2#X:
+%-f#ehZtRhW*%qf57j\->_/-WDCUroTO$RB<Cc$MuQsT+>V]"]l#/69/_\>VKOaLq'!_Rj[JNX(KJkVSf at A+E/1Sp),j!/G,ZH,Rc
+%RMj.OaAPO+$ucaoZSV-N/)7^@S:17D'GgI/1f at BZ(S$A:aA*ZnC?$!)E?&CBnTb at F^)moadWGB3PMZ at 1BN?dX(8IAthMCk*:7c!;
+%8n8e1;4X>e9/rOM1m-D0i%TX-UQulX,k8QbV(%YDi!eln6B'4a4PT(^4qQ&@_f;:A1n,q\@)rriO>\?CFZ_:Han>O&mkB7lL/JZ.
+%HuOf8Tqc?`;G$M31E:-4fi'-S:,-(jOH-lRV\:!3353Z6>(#H=9H8-jH#a#+[5j]QXL'IqVs30X&1"USF=cZ9$Ecb/NX)JMjCpsg
+%3kal*;$,GBFT;m\5i)W3$op+;1?QI#Tlah)QN@^C at V0<mOrZN<JshFIn;J_ at n"d[B_fpK%'m2bSJj^uG'H!;a7lt[oDSs-3O5XeG
+%h>BshDjVW9Q/=8[\04,]<TaV"`urTe:!.FB+-^8iX7LseR,JZ"4:/oFRWIW#2Es\,NTS80^X;rfLpunBnip<fP&fYC3jiE.*U3/J
+%1T1(\80D2/E</p9VGs.sZF%na>^S_n'nThPY&;s24:SuF>rT.X>2'l*_P%V>G3c7UGcX"Lq/T"inP#[J*;NK<Cm0gAL-W;<UIGo"
+%@WdOZ8Y"I:8P\,j>*Y?McI$nP\[4AIeBo1o]#4u4,;UoYou4a9q8-RiLj0l"U$sT>(f5,Ur;2j`6RE*oge9Y<$O2.a.ZIp$2,\\]
+%B*8dE$\%)^GfC;=R5u>_WtB69*!_XHI$16dHrK).a.UD*iB/\3gm-u?#J)09+Pt*OC!B!2WkbJF(YTkm`a5AC0DQh)J`\pIVij0+
+%aFMWI`@"SL%"pbflps<?R7\:o3%p\qJ7H%2*6'Ac&BFEXR?>8r%6'G(nInLk&b@@./8`e#Z;%ZY.j>fBg72p4d;_<Y(?\Z3.#[AE
+%'G^t?J6"NbOa3$!oi0i``O;#eXld"@nhfti<INc1Y:\40)X(:MmM$F4`tC0K[pa=fM!Z`3&+/14L,i2?!*OR2N)8YsU)jmmMmEbJ
+%0sAb79#F%WPAttFDf3pYTek1iE]E,S=k$4q,c07s$'47Y!%*RN)";D6JNs4P6kp]!;F*=A+;!jLFsL6W797ZMn\^`H(S0, at jT\,;
+%,t5D0g'QJ]^G5O(.)MK"2l+#N8;g+=9OXk9C(bk'R\dM1*6PM.1go'R!Pu*mW)=La<),_)@4X!%Gp/QiRc"kk:VKm'.ak;=haqCL
+%("U.G6f!%"nTj>hl^FMaZR(lnY.g+A!DeB=c%5.HJVnQ87mZnUK?]t69R)Ne9TFQb)/=^J&qW5-%E7f[#0q`9M+kAt*/DGW#g]YX
+%CF13TL^nrTBU:\0]#1pq'd#H(DP+kMjc"d&E&ouh[l)uC-(9F;0#pQ/BMho9O,[lg3?/`dCIYG3IW_bOd)<+>;e7np^=XkH^;u at T
+%Qtcn'5W7,4?AYKoP/0YGH_ZBC9,D>b)'^[7)4W_<&a(0jm7ObLOjYp_CD/F[M"Yj/:gtj&3I!TTV-FHD2\nIeJZY&$=QmC*7qY at Z
+%Db+88]R)dgnI+0A,7[oSN'fhM.Une/#gdP[.TD2o<Hg4"Qa-Z)?PY*_$r=/'7"^%#kUGsdXG%86+6_,n[67Fg9jl][)@Ik;n!4>'
+%-mEm:0r]`@egTIV_n-^ni9N/8=g_k^kA5^AVh[CNS$S.Ig.Vl$fM8VE[%N"N]bYCcI$%_sPKi=rW<_i%N]$AulN5":NL[0,LJI?H
+%a*-.bKb]A&3=]'U0HZObfPqfd1*;e1-s4D9Va2.nH/LN8"<3WTTTaZ)S7YlMC7GM&*o8/M:,Au!$)^'6S+=@/BKI0p1qK7:Q.%e$
+%gJBZEde\@B&da;[pk<5$(\AorVrJ-h32fT3d1D"L!QhuY,H./.]h.`_co&L3TOhC@?$K)]d.Neni?1-d19Gcq$T\lM3!>aNo<k3Y
+%d%l578Crt8!BK()0"Di,;ITp!40bbujMObn>nDO[LEiUdkI3+'=JVsOi)\WtorkO%kE`6]^/(mZfQ=V5"(6k_1)XnilRn%fphDI8
+%@f*0';aJ(FBk?-)[InF(`'@V0"fA!a[,(R8F>&p(d/%4D`%mr at hr&8'$XG=/C*G!J'd>3"D?f$/WoiEeMFaK-:g!%ni\e&V3g4iG
+%THi3U(jZ3:P)W"X,\S-+>Ee*4l9:"?1HaRCi9W]_06%)),%IuI]LakGiWH&k*KM@\bZPtt\*5lrhGBii[db2($#r=[*sF,3/8e7q
+%*-<t";q`V_Osq*8`\Xm%SS:4I>!jk6gpCe$S2-'/H??#gOGQVSLq!2JO_KFf.Cl:;,`Btcnk4Yspq[$4Oh,c]>CEK,.e[uW0(=Qb
+%*6-I.1@/p6A>g^]</]'B]U_U>U:V@`oEB^;MVghOkt)T=M*-[_3W[r0jHAium_(F;ZjG!H!?Zug3t'1dn2:IDAjfhWU%;kap,3*J
+%Ad%fcH(J45[idH&Z<JSm'7=g6l.#2\@Jc,FDLk<[:/<3T'6smET&4VQMf<Du]Er4D:-r>j1OrTu,5Ohi_,[*VLl'cDV-%R#Q5QG_
+%gm7cALF5])[R5J`CD6M-8QB3Z2c:n3IjD`[dOD&E#6S9W.H+CJU2-YIf"HOp#o]j!2K>B%WDJUGNqZ_EL3W9L*Ze/nb&D#kT^;_[
+%lV)q&U49F<;KXumKCGW35rkUC(l8Oi4HI`]$i8clX;^6CZ`BJC7`Ds2QFN#kE.g'I- at Q)[C6T';OD=.U&ttU_#)Gs*&\4!;:bJ21
+%1[O"1R:aP=gWMGDSqp'mC=-SGLitH#8Di\@9_JI,PdFk'09Uh?O<ka5qqSEL)"b*b`3\Xu?$?5CVJ$k at rIOCd&d^mNrl#M(>j(fk
+%!daF<>B]oJ[Wd(7RiLJ]'A=mcj)lFL(WX]_Ou;Q=eV at b]3aVH0X]\fu1j16!f%-8L(%:qc1G<uG0 at MoSY;S8fnToDL;,*?<);bP)
+%D1/YO`)N!DCmdEgkiF_68gm>j^1&ri"9>_=cVh`TYET4i>tkoW0I$#H=a`0>Ct0#d9#];fRMH6tiE&Zi<*d9SQSVMFBmpX>YJ2SK
+%oP*QAYLG9(NfN'7;,gJfgRMneZF($_BM1SS%8O(bCKnM[_0BK=nhs`Q/Y#?#26'2NB6*Q.)I#F\/rc at c`lSq.O527I/S,!uSjoIa
+%I%./C0>tbkcq"!n)UG4A(tJlLUU/Jj_j):`H at TE[B:aC<,V?;hHr(jZRCZ/fAL5U+mS!R[`JuQ5V,$b2J805t0H+`+6%6!?Ss00(
+%p%@+G<S-ueo`U`of>d_khS:q4Gp'-n&Cc'jXgVYbc=#Pg4I_>]64O05EU"AM(Phg)WN.9d[70oRm^/9q/\6Mrc]%1,%Sn(g!'3=X
+%m at Sjr9EY9+]7K:(5s_U+=W>T(r)dQ4-SF,2?!gi,%#p!KO0_uV)3cgB+I!a5[J]kuXT3p.Q,"-RJDbT4!s>_&C1"KbU>'G7p"`5/
+%e$lqC/Ni8Y.Vp)1]>^ZobDJ(Vn?6T+EmPT_#+*>g;_*iq35CCq4DNh/Zk?R6>hWsDUO]%TZ'R,r'ruTLXQd'5EHI29(G<5M?Y,-Y
+%o.!lo>up:q$hg&>=82isL_XI7(o.LUa!t'PhOM`Q*nQuVH at b)?2&ul\INqVMZ![1p.8s=b=/]n0RG+YTM605egPW,"TH[[q=pPYZ
+%%tLXWN&FaDZ"L<ojKmLBn[#1;?]%e9Pr$kq%%_nD2QaJ,g+f]3.IOR65tjOZa`Kab<f\uh9=Vrn#P at 4G6FubEF7'7mkq\C-9m7fG
+%Qc\3=I5fO_b05EH+k)uRgRTcfF9=<%C6$@odtn3L/Pf4_ZgIZG:k20=FB4$EMp`8<S.Y9Whsu0PY<K at JHT-U#htN.cmk?cEPCkq=
+%\;=dd*^q]Fb^!X>"?RM4Ld;:9F>I_#:?lJD9S&7!;)_DN54gJAD.n&So^4-HTgUs=_X4Cc8F7B/+&j&ji)ic$`>^9LW$tCtZIA**
+%R6!LNe"_J[YP_:0^)j5TLN[bFon5!G;?8jY[Tfjm&1NW;3=W*gnR0d$=h52*3b8q[jXK-mlUU>=+H2C]A6bteIOp3DD('hOYgmXT
+%]9S8QDg*pn,6G:@hH\VoOR6Pq;?.O)8H+dm+J\b]Ed?1Ua(S\?^Nf*Q"F<f/DVD;'?/QB):bhd%9E&.Hr#Z8nU)]6H5>&QDA)r3:
+%/1clN[nm]T$6`^na5C8[.*0l)I:^!Q$_<G5:r.sPCqI4.:SKB(>oCeoSAs8:A[&T#"GQE7'U_B%Fq0kdBTJ#$\CLZ;PgAW'd\/'i
+%qU<qsl;6Zq&mAl5R=TEuA3A9Jk=jrH[Knt+2M!AIZ*dLl*?*+o,)6KpZ;0JKL:V,:D/5E.6Xt(Gpc3 at o;C$0t_Fm8W]JHOq[RT,I
+%0rWEi[=TiIOIaWPANH7DQFO6T(9O.Q'>+^[?Y8(#oE^,#EbBB[a_]Afn:gT3`OSB'b&=X7Jgk:e(+*/8AY$GPEXZL1i/N1YP;P^R
+%f?F;ZH7p*%/AiTi4HK.;p!eaSDLP;EoI:RC0SW$";!dE8Q=07cO`qFP0_:bP1gB!I[gU<]T.!ljA->&=MMW<I;m(PiQ_$$&,VK^r
+%,-(;PLjr<F!P/Q!L&o-f$'?JeAD*W2S/GK.X@$1j*SI!s)f]*kCk3RtUPRbWm^7gfGgMANX[Nq at D.,/X3kTI<2'OhNNT`(6i.`$6
+%os9ZrnTSY6GQCfZn*5*)2gG4sW2S;h]$\@W6g5/Y#\0tGN.\'=;^ug?DIc3?.\91CQ1Kg?*EZ3t%"r"ANrE at qP4:EPQ%\)^#;K-T
+%L;K8aXB8+/b>E'bO1E)c_c*56kUrGG7].O:-5M5!I]oLk?8G/CVo2ccDA\oG/(2kaEY)I at DA\os49b"::uiE#@p"/ebYZmW`aFY#
+%/jLG32EHdsQ_4EG&>YHMOHtfD(oj`*"mW*aoG=Q==Gg9Of:o^Y'7h_dAMra$[*`<\\fPW1)1f0"(spj0%P(F)<IpFDZJLnS*bMeq
+%)T^o]YF=S$dTP+sVi;2P;eK*]FUZ^>E_OYZ*QG+cWk_53)9.il_mF/%SQ9T<-O*dgb-^Ff[*`<`3j#fO$piTLN+bisW>[K^+pI8O
+%:+da&'SXH]01AhFO9U$mV2D!<^2'X at -mHR7X.-);%\cLFMR>@I*5r]F%`;5J<FFYD"o0GtNLGA5;PC-YgkETX:ZYb#LGh1%<k27^
+%3X0G33Mn+S%V&MA<FFYRAJe'H)YF.\Ug0s[m)39>:#T7rL,M)O<OoORiZVtSM\4L%*ao`;?!k;Er8IRf>2Tbo5N7UFX_-.VV]4Tl
+%1Vp%Z^6Lc<56?%?2UG.K]5qcBm+68n_pFYB$'Bh- at V[?p%lPXZ*="P>RD[0X?Rq14*6L#!qQqU[LdN4V;Ho[0MqYfZP<C;=C[^3a
+%^(qJRg`JCZbh00C!om2tRfp/7+mGKE:PX56&cmkJ$4Oh?_H9XS4Z%u0o/f"8B/JZc.+Wta"0IVANeG&G,O,OU/Bl+G.K)RQLLb.V
+%ZFe>c9Aog!,T>I0piuWf#13?n_ND4%A^d=8->QKg]L+#^2Bcf$]UhmY1fT4:)LNRP8fi2rMqB)oJDNm>12>182e<ALP?#S/[Zi6P
+%N^C1:%:qsuTV[c"p+tS2c4hPKpB)#Y*P%E:<sB7q8o88dHB.]m*jl]&1Cat1IJ/A&M?An2X^]H4?pMHf[#aQ?B at PF&7bO at pe.@,K
+%.Ea2U'Pj-B6muq-N$*#P`spX&OSl+G"CW9fJ5ALU*pAIu+$Yj0`4ZXPOG1<]VV5ZnOV?('!SILlm9ud;B- at F]PT"N.!.l\CkBg/?
+%VEJCGE0OLtaC?]pOS1m_?H7[[R@`t]i`o&bU*n5SMi=&djTq6OTH[p\k:--FLsgo,7E,RcEp5u($4j%4[c01gZVh=nCsgb-<lEZ[
+%AA%9U4H<_?iIhg?3[eG1IZfB;q\`gSmifR7r>Z-MG>f]uhEb\Cp6-cf[$r at U]:UBPVYr'*QoC`0"Ub[Zh;C-p8CM8YBol2s54Bk_
+%088sfp^TW\dm'fqVc4btdRg?S?>ao at W6P&\\QpNT9MsERUnrN_\<>T(oU$))et+u/JhU^",rao%)Rtk1!IKV?=OITt`*r@&!tCg.
+%FYYM*S%l3sZ"$B"1WR3"e7H4PfCt/T-C]`rAIeTD"k8T3VmRJnf]-FMPG?(,P+a&W0Ws;Tc125Y!cgMbF//g0DAo at n-GGn"<%n_r
+%Vf,9XfJb/lm+\;s;T@<u74TjHR*%fpeN?O$T[Bt_2FfpVrnH'FGAQV&Z\-,8o.sEL%b%k"g%64R5GXq'`c9 at k-],l)D<7Xai1H4A
+%EgW<7R<e9]7COA, at CN6$3\^(UOVP;;gM]*#4)OOk)N&@@ksSl36$ClhZmg`,>_ocSV97G>mIhBLmJcC1S0Z7\\4);B2,4gA9i%Jr
+%?YKEQB0kG59a+(_N:kOn&+Vko$0]_(eQH:!YIqR(LbpF!XPu5nU6VL%-V+$SVc/f,PoaT7U;fFL9L-&,*(:Ps'VcUm;r<a)L14`Y
+%q5t-S%L"')1(;tfA16$7ED[VM*7<'TFqc\G_qBH>L-A+\drP3j)2c[V3IHP1 at Y]$dX8ArY0>Hg[`*GXl:#+/X4m3IIDCPU5MEd$R
+%;l:Bi-VJgQ at g#E;QU<8DGD`T?nk4O&H*Almc at ftnqUf9S03e;&!M*SC7)SU#O7c9,V$)-J at IO_kY)TEb7!F3+^i2RbRr/f,^[H^G
+%IE5';:t*Su=_JI5NCqO?[=94foQ4*#U1u&H4`64q?M6'>2!c(+!Z!1sD8R$,A4o`?H=55C^X?aT8ZF)9T['*1s)khUH7."ikHo57
+%1sZMUfjK!AZ]#.bPBXinQ)7g75'Fd=53/Qce!S2(_4*lJ%1QG1'>M+q-gdT/gRoqsqVm_,TV`dX]E4<=47qY!9ZN<!&kiTJH%'#)
+%rc_lp]F5N:T<8Y$DAE7[2BXf6.a0^pHM;akN#k_tnB5]Whp(CjjH(gfT#]bE9rP:_*N\E@$jmi1?\uXc[rI?Oq[AJ-"E8fr(HjHp
+%S4)#8UXRhEp#T)4q4m,Tk=598P6ADXVq-GBhA22g?U'5NB\cLPN58^VFWDZ_1ft:6dd+?W/1maGJQgmqe)l`\-H2<IRTYC5^J_d3
+%O8G6p[2aeM+@^][X'7;<@2IGbS.WR'*B?PGr?`M'nfFash/m#H<QqIg&$WdMh1%S-%htJ0)YU,%X_6G-8'(8V\mL&D8nQJhn9OXi
+%[m8oL&L=Ss%inZY5mpA1%Hmqt*W'b7)3s5&#.n7N7!FXRe9u%f7mg$?F$jFVZ:&m!W(n*e!u;nd7^dp$Tsb=eTY"]--dH8S=3"WE
+%jLcL6h%jg`kfsb\-^O`s%lD&7\A.&?Rtkp.IaZZ&^qoMM4-AA+R#F12/e(P3F<GI&N9J!V!@/CeDRWV7eFF;71YYTn"OkN8+J*YG
+%FGef,c6G)'/)BPWAd?I?#531h>Um1"O at Q4:a]UN=1ll=p_`ns6PKhnb$Y8]q7#2(1fA^rG_7WHrh^"ptL%&\a9GERP at Rrck&Pk"-
+%4%k\D?ieQ->cNonWgtM`f7h'_n:X]5*d-[D%SnX at 2W,gLnP0+u"d\di>G;AQ,,YF[$TX=koZ;4,&bik0'?9Zai5iIiLCqp4L35o*
+%)`6.Yi?!:d8)u]*?:KUL at pTCne,X)#O at OaKVZZL[=&B0TS-<mL&FR0n3ZuJH8]uXW+j<!=$QTb<mdiCZg_9C(4NJC!eaX3gN8m3T
+%>fQpQ2!]DE"7oq<&#+F?MAD8.*eJPr*b9pqGo.)tEOH>_M/d>Ncro!B%R7j!(Mn0CiN+<<bEN"Dc872\4L4,6Fg*=H(no$S4lS1b
+%b'HOD9I\T<9Wo;MM;g?'/o\6A6iLOSqZ:&S2>kb(U[+^AU\0bG0N,t/?FdqBBUQ"G=AO,D-;L+aCk!7Q3V"9MmLM"Le1sR7`$l*D
+%71^(J[(Ii481?rUHlQ!_L7VMB-sakqJh"tnr.pS6-1FVoU'a*maDZ,L<R=OI8el?"$WW;MB(c=,E2>O,V$_,4fr.jnTGbh&]Mm**
+%=`?B1<iUCLJo_#o&A"+>;Pec73?\bn`T%0."Fd";a:]]1*QDWHL7Fu)(.&12,jU^HGXoe(YKVi0"mi/hL79Q:RL9?X[L,"3!K"mb
+%'Ffhh7t*BPSPcgI4L)u[E at P7L'*1E4[oAJ^#'a"r!d[0ie^DMEL*.UDP"h0451=cumbLHH5(*PJp\>HXV89KiJ`"(-d[Is)KfS]c
+%AW7NWCCK:%r[;_\h`ZaRZ2>k%][@G[MFb$E?IgII%HWPD]2/EB:.c00 at E\;mNmL2"h$Qm?o#s?5jH";G.$Qfj&d at N9bWlltQf4n(
+%R1nOg15.2KR-I/@+C24N<'f*)<2i4KDFUX&qUS7R,cHQb._)34NDr2M2U5063RQ+<Pq%T<1-qjZ+a,I>T7e[RN<ijiK&ESY-m[V.
+%qJ2r3TW*`@TQdaPa8>EJl5UHF?V8h"5Y.0;a?P6N&@Rue'g.L<7hqa*G07<:B?Jta.u21_'.EApZ>394\IJhIF&Obpju9F42e4Bm
+%FO^eSZ!M6@*;,>MTSQo1*-`AADc6Kq]iC5->#17R[(X:'56p'CSBsU3b!<KO5mq&k11ku/bh7O][-oInYU+ at FI/KX#HQG^DS%=c7
+%pA7Gh;@#`ictcQ&"d2pL=\40d2JFE?daobBV!rU1 at THA0g%1RFX:0B#p^<l?eO<"pMN.'r6&L_dJom_Z$LH4d=--=VUk$2 at .k)ZT
+%X6N8B)OlnAPdsBnde6..`'=[!Tq^$NdfP;o+V1rq,F5%O at Wlj*.($d:GU<i8Z.Hr:!;P%3mVY8&^Uej'])CcD%g5YY7K8_Khtu6!
+%PNucYgILuKT0I^QIJNU8pHJL^[s*>4V6A-.'Q`As^Uj@>r8%%`J,WpKiU>'1/iUNrANml?H#nC:$]uG`D=gROrWcGqeF2d_U8'lX
+%gR;PTL)PADqYToti4\s,pYX_Q=O=l;KR4STL\]sUq"4L\ZI"u$qXgg7E\IFe=Xj%;iVrc6lL)(h(k;DQ^HdIk+$RBj2;T.Ar6r%K
+%D>EoJjkp+7Vl;=NLV-p<9Nk?--D'*'M#>6nHWS.=EK_6tdR[MKs7&mimnTu)[aumI3M78V=Es2&?;R"*blf.&``C1/Q=/$tV\NkZ
+%m,.'nB%/Dbk\G8+YrIL5A(!jd`787GO>MUD^\oOlX!)pgJK.=-UTOAcA<[Q.'HS-_r7IC7`eGYA?RjEB-U#NtcDf#ER;f2qg9<V(
+%$Zn5PRSQR.*dk,&mlX!F]5DlT\)1(Vs++OhjrCaFcGNueb_ at PfgLSiJg<u4hA+Ke37m05e2)Xh>,fS*P)g,mNo:W/b at 4<#bJA!ct
+%#N^UB+4-B78j15uP$akG_oGR5d265<oRGbhbHh"\BpLu=Q@]5]%qtLFHKr/#@#u0H?ba5>Rc7+\8sYfiQFO4a"@rXe8 at 0ZK;q9-r
+%n'AaU1aatp1GN5C/+ at eKBKY.m4tCYoF8aGb][\9YKK#9%8_,'*3/\`7f=%AAan0uNnU2#(I<5<<`&fSlqo,ban,L%':p>TFCKqW_
+%(@_O8EpBW-;#?TkqocGZKj9t24bb1`Us:^H).*7;meV(X+Fa_/92)js#H9!_6CgN90a#@$Pc9'-Fpl1gWY1arJXD-Hbn5e$Q>S@)
+%It)qE9i!YNM#?0SAR>,!&"#c7,#!d#U!G at g;:1^amP1nJ^A.H']<^78/L^[ZI9^q[$U-\fq"$-tJ,&a&JWSFlX_h2_ItK?>j,]$a
+%qncVhT6u!8GOp'-/_8GtgA\C`g>;*^frbd]n1Q`kpGVBOXf^+<gAU[/[Z'oE0!DJIrZ^G^O#FV^;W$cOqk?.ME`8i8b<=_GXu]jX
+%T,%%_Wrq(Tjgr$q5?qN$Da$A"J$aB#;X:@no^TE?(3. at VIfRg>BBQJ%cEA=,FB=`mep62M/5P)q4fhY1X;<5[dCh*2Fd,q(?rm0d
+%7QKr\k20M`]tF.(^5./XAeFY+iRR<KL'II'J*^A=ccqqbQ,]]rjRfC*\-b+bnbq"WTAL\j?cu?d:VOM)\>#;NMKcO:(DZu8^oFe!
+%<W:NMf.X=F0/89`gY9pK_]%42[;8NGY`<NnC+UAdHq(OoEDos%2g;a7%jZ$C9pPbOnuq66g`=I>[4kU/H2d72o(j3?N]$Z&NZdOf
+%UMo4464Oa?M+]nJqtg6eqS4HS$IhKDDY>5*o]<''jdU^S1pX4#%CO,Q#IVs:;g$?`F%BRgb7tiFD%CAh;26+MbEE1]kFtjK!dG6V
+%.#"Yc1;*1>(7'*_L(5TIU'`b6Sgbc0b#eb*I/7i(Ti=P(EUKTg=)T/bQdN76L5VScXYLRinal3f^:LpG;u]SNV6M?=PTJ8F5.uDH
+%rqPgV]6A1BF8PVNG.-"H?X7P54b*78m'`6+$jFYC)m3)30<`)gi7[qVRpS;7,TM9J^ZDomhnAu3oBPc3]!a6qjA31Q6;+J&811h7
+%Xq&SrT at EW`7 at me5F+=2OgT-6<mI0gsm:`?a+l*ng!lF<hEVrc&CqI^dIR&FeYAR^6.\FI#F%8`BGOstbh<jOQkMMlG!>m-_V(6fs
+%ragN5h;<<2-g3ePQ;q4DCP,\Z&_id>SDV(ALcDaMY28"lRWOYfq]S]4bOt[ZLCSatcW5O4SV_=\e_S3VS'0QA?_'DXprA-sJEIcA
+%<u:A+T&5#NJ1lELnoo;]0DXqQIt'&hJ$Je\6MU8Dc&9?n>i1h[+5fAmk:e?7M6a`$I!8=816oqM%t at M=*rc0.r>Y_,LII%_hi5Y#
+%jhpo[14n])_OQS(GN\^%k?hM%IXVS\i+IY`cNB:ORi_U^8mQgkFoD.X5,)EPjQNa[O[AeD?PNb&XVCb)WO!Gk5J0/"#n,>.:GCBj
+%N,=,*WZ?WWMuReop.lLnhEK`Nr8UE6*d.>n9T'BlfC[F^ro(Hka&tComE^-D(s4KBjODY(UX5_(o'_AqNtUl]ZDEigk3#@GIPAB9
+%jSJ<(cZ%Z'3mcWngGO<TjFbrJr:%@=N844(YG]8e[NNKBYQ+1Bm\Xp+Y:fh3g.H'ITAR>o^UX1YMYk_EE!sn)IiMBG+[gB$C@,Z#
+%kLVr)V==H+k5"eVN5=iFp1HCc^[</n?`m^"I!`Y^-&VPX5KfbB(j6AWgWQX9^-+a1GDKLH_>Gk)Vh<VZ^p!/IMDG&!o';(ghd;MV
+%q^@YG55b3DmcQLJm;`':2XdrhrP,X^5OZ&RI)G/1-3T2,8Pb_F+8mO)cL2jh\i[ZV]t(Yb^:W9ic$e.4*\I3ta$LbHpo?<F_;Zo2
+%eZuX$iR+A_%Z_D)C4"Fd0"54L'R7,P^O?"A]Ze73pSGp2f:06Ns.q;A](Akjc2!jPqsr at .GLmNM=L[EaKcj"drnYJ]G7U1hcJLfj
+%hI$3tQ/$b1q=a7Q?!#.$U!dj4hgYH)PqDFn15[hB*S at G<Hi<*lCcR7Al`7KffZj6H5O1;o?M3IYF_;)0oUF)qmiLmHHBlVi[uf!2
+%S$0$SGeG[C\u1-%I!9l+:hJjjoBZ#&M]Dp at lJ0("\A#PfgcSj at p#3]\D]eE9rd;76U.+=)l`2sUmbq[OCZ2sF$3;6Lo&frBmH+:j
+%Q^bVU0(7]5e_/MYU!Ud7rThYY46C)FiU?1U`kS"7Ir=^YMjpbO_WpP at q4+kcXTl?:fS+\Fmr/hYq=%-HK#n2no)/C.HOct@!t=\'
+%-=26i/CFao2JlcL7H^5<pnjG805j;354$u(^A,sVb36A-T1\?tA<Qnj'JFt47DnanLgm$mh_5$#rd4+jT/Nn at J;p'tdA8&"$\NXi
+%kCE?4=)Uq3eT^JspZb]Rm=#<rmXo3aM'gg/IcX@:JUR at o^&QrEIsQ6[F8>N^cgG\rDs>A`H<o+HRh%&W"FTl"Fo8Zj3\bb`r>.a@
+%Qq8-LIp]p">).V)e$#siJ+N'jn%O,Fn.2#^qsTE!^S/4\#o6m^UsK(6s8Momn)6iPUkgIL.2244a#m2`oTP"0IK-"*%\$P7<a*/I
+%U.0eK[eqfAc)YahpjYq>T/NmeH2g$\k2RpqJR6g_-o1VK?Z;Zbp!qmc]8Q!uo=('U:H+pEm\=-*?N%8Sr8N2B!V5O!o%U33qRh+D
+%Mp7T<TP?QdDo)\@i)cdO.K5fl,&f/88PX4oo#8Z4(K]5?n(qs=^AI3SMT"!VGi]eT^%kL;*odC>Bk(W+O2d?tb=7$&lL<:V4[s8=
+%pq)8cCRAJM?1am[0QLR#7Oio_VglCmrpK at 9lJd1IT2BWO`*Ih"$KgFt0ZR`jn16_F'kJ3tpV8"._2Cfr>M#C"\U,!0I1B=X$n+d#
+%'YU>u!E0),pV7Y4_jp at n<Sn,LWdh^TUrR$Rg][/Wl8=@(.Ohf["@t3Uh#I/bGMc^d$UqLgS`.'H4!Z86\G.uf`hsBbc&SEK``4N,
+%S\cB'WPr`,!rI@"39tO='_t:]pi.XKI"W=NJbM at VF(24qhKqjWcsP6eVp,ICd8th;Lqi^O`dS9D^%gZUF_GCp\rS\NLo1=+f\\Ud
+%I.>0!9\GKac?LNP\*`Z?(/jb[$p[F.%r<3ulJ[*,>L%E3]4/8eViV9c_dthjf[Yj&.R(kdTaHq]W+#qiJTfhpD+t`Lca]+lH5+F(
+%,>)Y"65B%EcuON1g:o1aB^U,$)"%,ec/VanfQ+5QDOTN"-+t543IX#^=^N,i(D1EBUZ8)VEPgXUofQM,fS"W2KPEHe#2D#U9Nbi[
+%hngMB5B at ENC\pCUi4_M*h9#0(&+WR at or)u)$k)H?N"*3Z6oTh;(?(I4q!4gg0pN3lcAODXi1<4QpEL.<a^W<LNoj7+FML%l7&&0Q
+%7I3-bO@\:EE?W%<A-;6=jSU6ZSYrY^2f4JD%_-/50)eBtq=HQ/G3kA4E6f[*O0qVEI?;:N*;*e3 at uMSR(_sQ)N'9A,-3$ZY.'kXg
+%1$tB!h*?R%'B1AQ4%h.Epq')M/jrXO)1Y9PJ5d>0=;g at JE#_9g.XiO>WBr46&^S]G3CPHq'!!li+\c81J46`3Of5!324l2UA*A4Q
+%#Z[s^eRB9hg=1/%4#H=_7rb_Vi?V.pl%Z1C?5*S^=AOKp=V"XJ*qRALUcN00j"(itN)>.Qa#NsgqlX8G3:@EB$J[__A:@W8H'Btt
+%OcKUqE2$tFoBN>!-eWY8>o_S49q7rTQr6+BCSQ=g9uO9ai@!5h7Y*2TobD(uO<>Y'mJ_rb9$^CY(o.6-%^K7C5P-'?AWNr6%!dHg
+%iUk7]%WJ`S:6]f,R>-)'Y;S9>q!M\8Vm[0\J+$(W)qSPjXf&>$%T56[#,LTq8C1>*Eh#_6lVSc at N2e"$McJhR;p-o`g;0X7QM;\G
+%oRhAo+1FqMd\l+g"n(D6S$Ua'5;_glI1)NH]T6P:OhZ*rk!p?LPEfOF_mZ5>^qG at oiCB%Scf"Cfm+rZcWPH3"S<:D*g:r3p^ns\W
+%8j>iImN:L8P,==OT<A+P.O,^a88T)E];@/B9"M9-pl+_-=b_WCf*6S<X*Ah+Oofrn?"9)Y[&#f:^<"hRju#U&nHH4/l"':*gO<E#
+%>S7qEi[jBOp:97'CA#[b!lGZg%,5d1V%jArp14`b+`ic-8AL!kXg;0f(TWRB'R^slp#A&M$e9WNT"42kc"M7eOSMjZ'ZE3M$iOTG
+%;:2+NaM=-b9A_8HT(bU+?$EM^$L,*?X1T+ueR"gi at mGEn9^\ZgeTm29!`0Z9e<Ap%eP\E![?18E)G3?l4=ia\#7h:'loM9VM50-7
+%)a;P;k;>?j8F*Q=RS0Dk#L0/)RUC$ZV_<VWX_)8FEE*8a9i^3 at TNh'[#m!..7.FE/[FJopW_&Zc`Q4Q]IKuhQO`km(mI%atT/:LR
+%0s47!cTmJArCf,n0ZFIT1WElYdVf#9O7DK+=R8i)lsY\WgG;1(8:U+ at 52E\djNqT\U&t(K;2u at j#%hif-i5U;$J[R0;60lT&*o_O
+%cbOMCZcq(_>6%a at RMV_#pPmR5^HWG"-_JF?8=sO,\UKVT\9!a4%"pJ;bSOeKaJm0)G(Z<bT"&Ep;Wr%,ONDVq;?s2:SXYD'H?8k<
+%2ooji6b/_bIBe?JEf)I5K8p'EVrR,eX9]!t?1u\Ebf+cFA;iTNKE??-1 at ZFI_u(1?5;1Q>al%^g%pr7?6Yem/3ST1SA_XI.m%^9.
+%VmW*a^Nj>igP6QBqAS"A8lk*2R68n8Q,"JPB=bdrbE:;*R3 at _95*,62D3AH(Ws8*.D.601X6/?&D(7tGS+*IJp*g\e/^1E0(lk,5
+%=BZC1T"K"0m?u.=3/qY8^aGpAmrOHspDJu:9LQtVj@/mtF!IG4]-G"sGVouWiCm?sG*SJVFOs"%3l#$Z7t at 1D63Fn`*t5N3<Fu-M
+%7c=HhMo#KR2W0`ZD3Y)]3^X2Z;M=Z+L4O/H$LE(ll*b2f>Bgea31-QNQu;iVOnEbU(@5?ZnQ88VBJu5[#4hSXVDQ'tLrZ.T?FB`&
+%>j7NQ#psT+!s"+Yr8Y^<*m;FDD(mU&4KiU'GR8.X-[#OL1;aV'f5Y&da%%Oq>lo)`. at .#XAR/=A5]1E%Xd3dhec;e!k]-5frf7QA
+%3iWDY(3=fFVhed8kLG#T$sPi0`Ejrcc-VQHX?_>Bo.[#2l0tdiW at c:_O<3%sZb##c2O*PaVt.'79%0LtWi?RPdo:nM4AmW]bl.WF
+%B=-)t!-TA3;78t`5!7QPW6C*-d4/:sWS2n'MVDV*B#U`PS2sVTEsU8U'pA2Cm07X)'Nq',[$UNIP;Tbq);#q+koZg6'H5o'fgjQ:
+%q<Z&^nW4q/jKdjug)^_fO/,R6"VY3nf\8^";NBKpi$t+7I#KnQEcdfS`ql(l$JF:H4d+[3F#0Z5R.*(%^^Qh(K]=;Xof,X)BAJXc
+%>$<dUNoW,t`fK<4p8d:FZ5I^<mjdYdM8r=TSL2a(%Q<8;4QhP4?[g/(BFaj+jpL*o_UF^Eo&SsHDMd0o_<m:]4gJ')7'Z)m/or#k
+%M&Rc_$`.\c9Pq\c1Oldl.I_WaCc[M9c[?d`]O.cA=4I9XkQMLnI7FUaZCp0TL4D2sf)rgL?._mhRs[`la/$aM/"_Z`7\OS,;ko2l
+%E6eUB.h9('TnZMKQ9!9O7DI*0!&RJ_Mo;`-f-%T)9]8;joYhI#Bs'$FJFlA).^3#jU%HgA"Eu-J;f3T_";Mk^>-+F#9l5l/8'J$]
+%f[/QoP8(6X1albbN`6"CQ.%2Y4g;6kV"uIXY=,QZ<Zp"EW^(K`b3C0rb3i?<&a_+!5liC4VE1XVW.P.J`.=uaRnUE->mIMB.eu!$
+%I8b:<5%/%\NU`n;\qPEGX+d\>8`u3/3\QOeXHFd>g<-4]`AF\pi$a.c1A$Wd<q0jr?),26*-cSF4^if_<g6X=el5%+Y"Ic;@So74
+%7.KnS_U\j\`u34?Y&4Y<DE!jrC(^P]h0!h8`\V&<cR]aYH<el)\k,MT;;gL;$1Dumn>O$)j1`pOHQ9SiN>QK"fEe^*5!"A;<2,IR
+%Z3;"Q2[gC7)4J'qS[_]N\qegQT`Cq2%bUXJX0/$:2et`:Hc=uS at u@:7i=1'4#biee$7&U$>n_6;cjEH`TG#d>^q+Ejo!\EFl^7C$
+%(`qr+;c]C0Zb<q8N\h&]OaJX"1h/84*+oZ at RC?!&X^Ge2<sgGHH3*A<Ki/q(,fT6lr.hn8IXMFU`*+MD(6$RMOc]6l#p?!*T5*Uk
+%G?%N3R^^J>?BsR/m1Ngjgl9I.ff#S98a*Vf<;LHob/fR%OR-:c4jnS*cuM/LX!bg&Nd9]_bVofp%K$5c099%4EYNXJjh33eA?1f8
+%GY10Gcf]m7);IF=9q9)W;t3B1h.2Z"d6p1E^L87e[gKbhJ:SHR?Aji at 8_^7uY5iEVF'E&_Ct6O>hWk5h7#IFL=?DQjGGDH)eD-%`
+%!`M%X8TFD*:eL-YL at nE+_@C+RVecf3%hbWP$$X9P7TG#k$_U)r_afQNWd+Te86:=W1;qOJU.Jpr'$K?KYsS4L;\E99##cPQ=CC,+
+%RXr!;o%%fMZO)b8+r6p@'1\*9_4l!]]QkKZWNE77Rb%`p$p)^X",NL\=!1&S<q[dPI5,\gBTNU$/<`S6D8g<'\_d'T<J^9<'g#gs
+%L%JYLL#\)chY/F[$V",-X2VX^8Q3eemdb/sALY5M[cgR95b-K5&Le*]/<g3HOeBMU"gG:^i>/ELZsj\\=ZpOc'a\*>o'H=laS0O$
+%O0*k'"ThZ:j1[4G+F-U1n9P+OW*6;e2;qVe4OQ*[dU[,i0$@5)H1.\l>Q(e]9JNK?%o6VajTIOQLl2;^E;cBV-c\4j@,RDO-D0(^
+%o9reMNo,k4+4`p7SnK23m+0)_>TrOB'0]?2Q%UA0n?8J/)SJ!Mk7GMa-g1Ee8>f9%)<,c_m/OSu<$+'D$.GCO]rW`9DtWndjS9pX
+%$hI)4/nSs9)P'VnFohS<;)[8g7NE"FO$'q*7l"QcG+\6mjJXeHHq!pq4n6'LN$sJ;*-c5Me\\5O()DqQ9Y-pih-(?L at QW!i"V5fH
+%(N*SFh&$uNUd#;4C%c!M\Fh0;KU;kf/BZPfEs;&A40__h]]ba:XNAnQr("=raomW>2oTF at X\&%n(>c3gEDQ,8i_shlJqFpP at o]ct
+%-#!8<AKB^/LANpm1E0C5le'9E8F3(3@\>W^?M+a)g<`FX)CZMPIVaUn$.CK;j15LmKm];k\a63`R7nAU=,Y0%2eF\EY1iWhr6?:3
+%E+/sT"6.\^%u??.+ec:bYKsqR1!X+<H#nmD7:7eS]$ARBg&\,6%%JP4\dksIT at L`b=l%A;YM8lKMt9I%E'h at C$Qqe$U4O+<o*I8/
+%F0;GujJ\nBl at O>e?ZUj)Dup\Fo$A+%ZPIrR>,m,&cE\BCb5l^%M/F9jOLfV6&?;[R[:5#=D.t`;SXI4b,WkDdRK"toS&PGKW'qcu
+%%44D&4mC\O2!7Hd\Pr*^QX6%bF#1(;Q3cn8[foT:Z13-`;L&7ch5i4/khWTGEdDnT+*g"9A7h at k^72%@B'IoJa[<NU;g@[-,G?$V
+%bj4iuaEoN.F9_D\pquPt*P$6D+,[l\-JgPT;o$(/CM"EDH1-&>/tp3/EUE:YR&8o,?Q_\ibiB4Y[ZDi]J/B=roa)CjjFI_Ks3HJR
+%S&]Y;b5D/cEu]IJFm&m%,]W(NVfN`:arb&2Vh^,j?Zkc=8==KKn/B)F9DVr0jth'b1lW)L4.97,Hd9fg8FgTbnQA#lZn<15J2?kK
+%*k>2u;aCRnF5gRFlF[MWFp.kW!'RQ01p))uOa*7VOYCF<SD2#F0 at d=G\;_se#44D%OjfUg:-3taG6>oI=$<d2jOQg9-#l at qqdZ.V
+%'/8pMi<"8"ps,dmS%)U68DUTD,`f5tkGuRk4 at 70"$eW,?!"+.#?tG&)cJZ%IKKeO_I>l#*U]YRq($7mk:@G3+:eR5 at o.FElhn(m!
+%r]RLZZ[MuD=S43q_s]g'I#Pgu%TYK+_bT-+3L=sm3^e)E%3Uk(A at opKP6W$k2ZV:#i`NemqGKc^o5Np#Q7>9`Ul#mh>(o#f2&4D7
+%7L$oeT`?\^;*h7KWi4O8Q6Y1MLQub2QZg7FMpIG=IR`gY_`6Ad%5JkXkPB(ZZdk4f2c/%>!1C`N=P(mQ&VoD&e06H\IM$hSIcre9
+%:*D"H9O#1k at Eq2Pf,qE$,I_6S&hhm#$*'WU"`0rQH`nohHM+5aSrT0.HDF'7?6,AhJQ&me5.+(%/I:VJ2k6D0qpQRBoi6!BUR&+:
+%6d`0b'8PfrKjDL4+ZZbrM^KK]@+2!W<3i7hWl6o[q`(GZEdrgkpo?MuXSs.6XY_$>Qtc4/pf"P=Gbu(V>3Jnr=Jc!@-O;Sh:1!nt
+%dIW at 0[P7"*Gg4_&;8fG(AW at sRajX9KO(i`R*SW(+GKT!]bL<gF3_*uI8=Kugn;p3Ap\OIG$/?3>>UfFC"NTqhQT8([erC]bE=+.#
+%qK))0/uI)EGHs!7qe:0Ch+A%BGN,LEX!^S*N15"_d=@7s$Q[JQ2k4\*_so.n`*hET<#&uGj+\eB at q=Q_,3>`8HBRc^;\nShfSJdt
+%6s`S91Re,0H44H+mu^J;*7U#c/a7`%&L07j<HmO!.bkjbAU?io*h<9nj;E.VB7<H]GH4M22aO]Q!OnHc5/[K5hN;,Ka.Zp`kqfML
+%k';Q]LK#mI`]Xua$h^a!pS1Lq>V>;hJ5]qMk3>n5b at fNAO@LW5%4XNip#)?oIn96:NQ(FAEU!;XIMQTRMt_L$<qB)i;O6_pcZq%9
+%C!Nig>3;T at 5$A`Vi<4XVB$aX9K6DMGA!\'4,F>l;bL*l"jWlUBV$>bm>k>sLlM*PIr$TO%o4a@]1N%+LR$3`HP>RC95J63LVU_=J
+%@?$it5!%,^PSB"^5*J'Eoc,7Z4C,B_+9:s=-*p(BUHHrI/oUt"GN*%\Ut&N[7Qpah;'>JuqQ7\G>=GWEkL;RlZ>8MC`T(r1 at n(!l
+%&"L]mXe*3j`S+(n`*r$$@QKA:D6`K+dE.;`mPAAARG$V6''3EK7p8('&r:rWki]id>Ff_EGVu`H[e(4X?dM4s`EY[._EIXKU&L[!
+%8Ofa0Kd-;'[>0t+Na.7I62DZ+0;R.n@,5K#K6#ai^A+H#It-A4`3\ecB,I3Q3U[o'()$e3ZBZ[7CgrpI$"pEBrW]nu`I`*Fqd6Im
+%4.BN!I8^K8%]Nb>.rqB^;HkWj at SC?][LO$m_3cuaX]RM'BkfB>*I_mjTdq3KS%WeLa)-<jq&`1:F5!*^ogIKmlf/56fpdNP..tL<
+%+:2KL=JsK2+OX2m5"Y9Y?Z+<>4`XdDFNq`IHP)FLXBr&YJs47(eY#Gn]2MtZ\aorNfEXFP.Z26[[rN8,`Y4ks8A at e@&'3?;k at sls
+%iA<V-n)/0)B"DTfRSmhK6B39/4KZ-f9(N]t6Rn\c61f8Q"d0';kjth&r.GKB^-0*gpMnfa&!/\hKPPXKrFXr,X\'E?19sV/4d37G
+%FP>,)f'7A*>WTHV0gFCgZ)TLr:JjnN7J>$mr_7a>E,ZN:(a#Tsagu4LA1CAT.`'pq4YtK$X3`KNANi+A%OF.WB]dnL.:nOP]J7TL
+%FTl))JG$1NH'27FquDp^_,c)7%SQIIe-F+b0ENW8Di$e$Jote*#VAPL"4H:*m745G"Er>)Sg5P at YUhR'\O;JPj,ABQqOt!F*?K>?
+%LW-"::a[uC%M7hQ4od*YP.iRhV at G!d330j&9Vd]c2.cYE4VOg<7f2Hl:X<'=D3(T=5hec.+W'!Z4KLg^/&:k%k4YH[5&0hV5\p<r
+%fTAoRY<4a,,mblhGa-&,8h0n0JDI^r@&!_K&.815aH$>hJq[2snKo^?oNXCAfk?4qbaq5m:[mdsHIclO'8pj;U>o)g4\k5bcduD;
+%#*RigX(RksEY6GG6Tc&se*:/;Vd?*L%uf$F7'!.a"o;?A'YLfXd,(8*\O_dFZkOSun]%AQ^AH_+].saAY(gEcn0bgRfjqc.i>m:%
+%U-7_[e$'"2qLW?rDh:GaqQ[^?Wj'k;[C,R#?rq\j!tOuud(LCf&-!ti7>+!"='l!MK6DT`-kXQWKN5-]eU<<j/Z=A7pMta5g>[t+
+%VKDpm\Xo2`#sikia at iOTa(@4,Co#P-1I6ZOGG9SC*9T?gV`1F^)8qXn+[&ZQWn">YENY@`I7"W%3;N:o_<dpC(QOr^"FKD.T_4kI
+%ltpT1'P"]qD"l&-\Sa`&fJl:AQQM$/3LcN^d5/TdF(UL9"G-n>Fj<;s(lS0aDr4tu8[ic*haO>\''6V)YF?9b>hfX\LJ<)CIfsrN
+%-u_9/4L+DXP3oq<F960:gt^l?#g<qY2N&7AS.mppLVp7a4o&fardlTIp#\S4(F#'-ba]"K*8Ka5dU<m`eFC!48JR^NISgBFiLulH
+%)u=%3$mu*^9+$d[W1(TcZa0J^:"N-L9u$!h+B5OR<Jsl$CK&CWQATUiK'tK76;T-)gu=KpmZ-J5_qus"No;TiTI1T-04Q'f4G,5L
+%!dPcWP]^dk.\Qb3)CBj"QN1PnTg1Bo**[eC-K^L(8?#gF!_InNYc](M]k%H6$bPJtg%-ub.C.s+GO at uLbX.$E(hFnNW215b_&3u@
+%FHKftg]LQbH6\H&!SBH=[JDdu4P_l7.6Tb,N\j<@)s\3nYb"n\BK%q9l\<mWGr:E=87.49ba+il?$ep;N\0+llID=9:DnDpW`)TB
+%Qs;_2T4MbAli=,9()t5h1'"qH[/.626r1eGrYLPi;Ep2>NNb4aV"K-fDq1 at 6c,T?M*H%`/rW'#&F6[`1JZU03^2EEq*;PoqS[S2i
+%jqDEL]XW)*f?/scBA6Y2%9Vc?+[d*-al-):,HDja+62=V;$bJA&HR[QDI#!7=5pfg'V[`s0T?6Lc:gd5>I>nPW#7qRUI$RM<CX&)
+%X!=W=/]Y at OUqk,9,]E:\:WmaPa/SZmY0a>L836<,<0nk!.H\#a3?IB+kI@:S!M$+A]bfOsio-tER(X<aSoU`hi[JJ4OY;&fZ$aE*
+%"7i"O4Hh^HO.Z+P;=8fk%DUK$pGL#>KNctBj.>k9=^l]iE.D!f]I+-DSfAl1!-_osW at hmk]hA'`(fZh]i/\VW"7MBnfu54[/EOK9
+%CP7"#W]Y)t'KcUZ[#OB)Pb33>#kF?,*"Xpkj6Dp.A!O.2_7=Lim"q3VdQrfO]IW&7MW&j9nf5/E/2Wl[Y:#ie9!m"l(JGDV)<:"9
+%^o'^,a;Y7:4,WE.%>TU&IH&H8*"QN$"QNTCY, at FCdS?*P+s#*%+Re4U<l\Ut,<[fM?__eS:*%n=H(;TZg$(jV0SI)5lW7nWI!%r"
+%Ol;g%kTbi4Rn0Gg7Q`]bVC`lpr<W^8<^2VTaaOV>5;e/FRiY@^=>YlpcQ+k+YSr.?lAbci*"a^8r`m:%PXkG/64Vdq[;e(VmKo6&
+%f`MBOhYo.)PNLCm0":UXj2XW=+eYOqbE'&WjOnB46gj`i)EmX22P"C^q*&l#Pir$c!ZX.#_4N`$rm+5<+4#i+St<REM%dK\pd*o>
+%VKm1b+<i('ld4+tF+kULr3YB9QrmeIr-Uj/Y<s3Z$R)l!nP^ZF*V*06g'RJ^IiA#Wr[a(H*[1EC8b\;_g#qOh9FFkBL<!L]q?ebd
+%a$/)<On[o76'HKYQ/hZFQn4.L<ZC$SP;Qh2+h:S*qgDS+&1b?4WTo1+3$YQ<rEYr%N?Yj@[no9_[shkg#h-*.j/jAj5i'Kff!F at n
+%9?[ZT3e4r&#i$ZrqZf.QGQdn6>CH-[2fRV+*4XT+ef\*6.o<B]s*iS at o[pH]H?(!NaZ$oT?BN_3G)i3UfZh$65[2P7!MhEI&Qh-c
+%'aT<Xj6,(*khKnof5p9c1j]"g at G,1Ca8pE\)B`Q)5j-9Ga$t9Lb-i+Fl!(/!gDsg+T[Vrag6C26C at 0Al#MBio>,n<'>?[%`%^PiS
+%*00mJDOjuc*Iu]?e=R`/%<=E)/mc!g?$CTVK7i1cfQG\qF8u6q+e20%'@ACAZqg$Y<hSR/;Lhm8),fhH5ec;gU"T^5X,:nOp>1Zq
+%=KATCW^<LOW at 1"b0%e`SOhQ'pWU!D((Q>@:<f9u=CK&D2der'#No$^cR?X53%/7ODQ#0[H)>[h$!fsG at FD,-(#6>l*Qbr(??*T5n
+%.qpSX!:#X1<M2Y;4$Ll^Q>hXp>tD*8$DE?/=')Jt?CP,YO9Y^Y?[sU!1G9/B&s]FX))\94?FTOr+L388%,D"96Q9V8!SI(o%RrJ"
+%LMdaCHGB_m^!+lAGZ8(t2c&6llV.c9_^(1j(X1G79BS>*b,]_,7%d-)Foc%P<fF=njPp6)&D%Y)]2We._M-*#I4*dp+=hE&Fd/N5
+%:U=upU85U$Jlj,f?=kL1"V*uE,]7b^J4%^eUMB\#'fZsd3tS at +Z)HNdmo,lYi/e#:1;m9qJOA)m('eREPaF_n$)4g%<h:VFm=J%;
+%FS/)Z>S3U^)l\4-`i]>:QP\Q)ip@(jC9K;7qLl'<)X)_eVchIuf^:cS=o>e15eT<\qN!r>DpQoX6'QKASuEf^[FOK;Iod^p###Bl
+%K!e,79(1Upin)RFj\b$hd<g9R<G-^_g7b<Amt#X:bL1muQ[1*[[EQ=fj"ub@?6>!-\P].-2OnlX#,(ZG[ATt*dCBp)LX,44\4m#7
+%YhD%!pYgPK&3:R]r4q3-fYDYg#j(,j(](RlA:#uA#M#D_&9N;;]iaBKS\WT:"i8M\8`+[=SZP&_[tYj'^-gjqlb0%R9^@*SYS!F$
+%51+ZD?Ks..l6pieFa((@q5hp5G"\J.jU'r^@*@ko=.5oc>LNo]a at e4p1slE0B/m%XGE7OV/7#@YF\&A/UhbT(Od?!1>a_ZY1ltW$
+%^XAn_eumLP)1c'`]sQ/k at S<aqXos3X]VSW:Zd)nD*hVkOm:dVi9;Dgd*OYkeMkNgIb4Y!k(Ia[i5]#U/m2S>j\eE^O_ZroJhZLKN
+%f&$cmHJ[fY`F48kVcQqYQZ#+`m-a$6G(Y^h3GcjBCs`SSYW+O!Ro`rqBr(9nF>PsZqspf^htutSJg7m"pn.S5R`nVe2Ic<?%i2'+
+%HgX"`N22P<4XR>t#N<[j%Qn'a^\lD*gYtY`ZJDYAC%C88!+TY48a,"<YXQ$L:.gsBe-0F_R^,OR31!dKR&UFk0O,X!G?;1m%oi43
+%oPn%liR>O8IihNkPTrB+]7.GK+^TPBe9'/jBouefQ0>GRbs/VVGtfUXZ at Cq<S57ra;1-8u[lC^X-H@#A%(12->rNV[!0dMkmOhUK
+%GO)8uVVgE,8*_n$gTI\TrGhg[bPF*%d\XJM7*gce_]d:!aUcb,9f##ljQC5q&tr+=fg2,bER<GFF at -C*h"$)jGcT#B>ZMN$5-I2Q
+%\Ad5P&p"l/,j$^2K"4Iu`D4XjpiJ\.7iu^FI?kM3Mu48;<#0"..luh"qC:"s6,jDPVPRo?]/7nMVhSM=%)%Vo((+AZqkSa7r]s at B
+%"a8QcNQu_?-Jc+X?lT?h7_a460HW9pdEOp19Lt&:56u!JU8[<"`R;D)h(b3@"K>G$B`#KEP<EM=N%<ZYas9SFR.ah=3)I3SfOtNN
+%%O:+p&>ZY"Gg>P$""f[Vbd/H-b,shoh'OF(A6*Mp,GcFDgDm`%Zb^*>`$!;dr=gY4,g at e.1EDZ`N>:9HWFMCND48n(CPV!rHOLN6
+%ZN:t[B0pg^<O77W-"X[^*gbEr0OH^\XU5;e_6Oha1S!TBj4N0N4_+5/:p*`S45bpngO`!]^9`u+8*u##eW'e2StmBG#>..`l_sQ8
+%m$uLaVTgB2 at fJNeAG`VY;;/8QmWkr(A at YQ^r1K%]`RQ)c//=-j(\H2A,oU]@i?1"GFRV2[Z-/H0D at tMMs!8L%D3PqX6/lcFGPLkY
+%c<JYc\+Uru`KV'ine<%c#B$!Hcn:`DYbXE&56XY,7<"O-UZm at j>XTSlI9U5GBHPdH1^:EB/aIS,&f,ok),U7_bNnUL+0I6A2m?\I
+%;0:r^^Z,E?k5:HE<"F'b2Qo:nSPH$)o$<VOYPun>ErXOOD>*\^5E?1YcKuXSII at gIZ"O?^[S8Y#hHhmEhZ\QIIk2!'fXC=#$=+Lu
+%oL!D;c3Y:mr)D%r>i!--]RRH&]A8P"([phhojsPs^\d4RiD9K$qtfFMpQtUrHr'fmpZ_K4Q`oi'YHBMdDVr)is6aoKIX?G9E;jhP
+%VYk0"c2HbYLV*H,c.d1*rW3?TeI$g#GQ7U<IsM(-ru^EZ]<h~>
+%AI9_PrivateDataEnd
diff --git a/documentation/figures/rnaseP-bsu-alignment.pdf b/documentation/figures/rnaseP-bsu-alignment.pdf
new file mode 100644
index 0000000..6c97881
Binary files /dev/null and b/documentation/figures/rnaseP-bsu-alignment.pdf differ
diff --git a/documentation/figures/rnaseP-ecoli.ai b/documentation/figures/rnaseP-ecoli.ai
new file mode 100644
index 0000000..01d809a
--- /dev/null
+++ b/documentation/figures/rnaseP-ecoli.ai
@@ -0,0 +1,958 @@
+%PDF-1.4
%����
+1 0 obj
<<
/Type /Catalog
/Pages 2 0 R
/Metadata 45 0 R
>>
endobj
2 0 obj
<<
/Type /Pages
/Kids [ 5 0 R ]
/Count 1
>>
endobj
3 0 obj
<<
/ModDate (D:20030327114340-06'00')
/CreationDate (D:20030327114336-05'00')
/Producer (Adobe PDF library 5.00)
/Creator (Adobe Illustrator 10.0)
>>
endobj
5 0 obj
<<
/Type /Page
/MediaBox [ 0 0 612 792 ]
/Parent 2 0 R
/PieceInfo << /Illustrator 7 0 R >>
/LastModified (D:20030327114336-05'00')
/ArtBox [ 99 102.35254 515.59961 689 ]
/Group 38 0 R
/Thumb 39 0 R
/Contents 41 0 R
/Resources << /ColorSpace << /CS0 34 0 R /CS1 35 0 R >> /Font << /T1_0 36 0 R >>
/ProcSet [ /PDF /Text ] >>
>>
endobj
7 0 obj
<<
/Private 8 0 R
/LastModified (D:20030327114336-05'00')
>>
endobj
8 0 obj
<<
/CreatorVersion 10
/ContainerVersion 9
/RoundtripVersion 10
/Options 9 0 R
/AIMetaData 10 0 R
/AIPrivateData1 11 0 R
/AIPrivateData2 12 0 R
/AIPrivateData3 14 0 R
/AIPrivateData4 16 0 R
/AIPrivateData5 18 0 R
/AIPrivateData6 20 0 R
/AIPrivateData7 22 0 R
/AIPrivateData8 24 0 R
/AIPrivateData9 26 0 R
/AIPrivateData10 28 0 R
/AIPrivateData11 30 0 R
/AIPrivateData12 32 0 R
/NumBlock 12
>>
endobj
9 0 obj
<<
/OptionSet 3
/Compatibility 5
/EmbedFonts true
/SubsetFontsBelow true
/SubsetFontsRatio 100
/Thumbnail false
/EmbedICCProfile true
/cCompression true
/cCompKind 3
/cCompQuality 2
/cResolution false
/cRes 300
/gCompression true
/gCompKind 3
/gCompQuality 2
/gResolution false
/gRes 300
/mCompression true
/mCompKind 3
/mResolution false
/mRes 1200
/CompressArt true
>>
endobj
10 0 obj
<< /Length 1140 >>
stream
+%!PS-Adobe-3.0
+%%Creator: Adobe Illustrator(R) 10.0
+%%AI8_CreatorVersion: 10.0
+%%For: (Sean R Eddy) (Washington University)
+%%Title: (Untitled-3)
+%%CreationDate: 3/27/03 11:43 AM
+%%BoundingBox: 99 102 516 689
+%%HiResBoundingBox: 99 102.3525 515.5996 689
+%%DocumentProcessColors: Black
+%AI5_FileFormat 6.0
+%AI3_ColorUsage: Color
+%AI7_ImageSettings: 0
+%%RGBProcessColor: 0 0 0 ([Registration])
+%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set)
+%%+ Options: 1 16 0 1 0 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4
+%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 ()
+%AI3_TemplateBox: 306.5 395.5 306.5 395.5
+%AI3_TileBox: 18 20 594 776
+%AI3_DocumentPreview: None
+%AI5_ArtSize: 612 792
+%AI5_RulerUnits: 2
+%AI9_ColorModel: 1
+%AI5_ArtFlags: 1 0 0 1 0 0 1 0 0
+%AI5_TargetResolution: 800
+%AI5_NumLayers: 1
+%AI9_OpenToView: -445 857 1 1578 917 26 0 1 10 73 0 0 1 1 1 0
+%AI5_OpenViewLayers: 7
+%%PageOrigin:18 20
+%%AI3_PaperRect:-18 776 594 -16
+%%AI3_Margin:18 -16 -18 16
+%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 1
+%%EndComments
+endstream
endobj
11 0 obj
<< /Length 9781 >>
stream
+%%BoundingBox: 99 102 516 689
+%%HiResBoundingBox: 99 102.3525 515.5996 689
+%AI7_Thumbnail: 92 128 8
+%%BeginData: 9176 Hex Bytes
+%0000330000660000990000CC0033000033330033660033990033CC0033FF
+%0066000066330066660066990066CC0066FF009900009933009966009999
+%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
+%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
+%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
+%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
+%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
+%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
+%6666006666336666666666996666CC6666FF669900669933669966669999
+%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
+%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
+%9933009933339933669933999933CC9933FF996600996633996666996699
+%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
+%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
+%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
+%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
+%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
+%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
+%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
+%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
+%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
+%000011111111220000002200000022222222440000004400000044444444
+%550000005500000055555555770000007700000077777777880000008800
+%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
+%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
+%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
+%524C45FD1AFFA87DFF52FD56FF7D52527DA82752FD56FF527DFFFFFF27A8
+%FDB1FF52FFA8A85252FD56FF2727FFFF2727FD56FF5252A8A852FD57FFA8
+%52FFFF5227FD56FFA87DA8FF5252FD10FFA8FD45FFA852FFFF7D27FD0EFF
+%7D2752527D527D525252A8527D52F87D7D5252A8522727527D52FD2EFF7D
+%7DA8A85252FD0EFF5252527DF87D277DF852A8272752F87D277D7DFF27FD
+%04527D7DFD2DFFA852FFFF5227FD17FFA8FFFFFFA8FD06FFA8FD33FF7D7D
+%A8A8525252FD0DFF7D27FD057DF8FD057DA8527D7D7DF87D7D5252FFA87D
+%52FF5252527D7D7D52A852FD29FF27A8FD0CFF52527DF8275252F85252A8
+%5252527D52A852F852A8527D7DA82727FF7D52527D7D527D7D52FD23FF52
+%52A8A87D7DFD56FF5252A87D7D52FD56FF5252A8FF52FD57FF7D52FFFF7D
+%A8FD0EFF52A8A8FFFF52FFA87DFFA8275227A87DF87D52277D527DFFA8A8
+%7D52FFA87DF85252A8527D52A8F8527D7D7D52FD19FF52FF527DA8A8FF52
+%FD0EFF52A87D7D27F8275227A8FF5227527D7DF87D5252F82727FF527D52
+%F8A8FF52272752A87DF87DA8F8527DF8FF52FD19FF27A87D52FFFFA8F852
+%52527D7DFD0CFF52FD0DFFA8FD04FFA8FD05FFA8FD29FF52527D7DFFFF52
+%52527D5252A8FD09FF27FD07FF7DFF527D7DFFA8FF7DFF7D7DFFFF277D27
+%52FFA87DFFFFFF7DFFA8A8FD22FF7D52A852A8A85252FD0EFF527D7DF827
+%F87D277D7D52527D527D27525252F8A8A827522727A8FD047D52F8F8277D
+%FD24FFA87DFFFF5252FD22FFA8FD09FF52FD29FFA852A8A85252FD56FF52
+%52FFFF7D7DFF52FD54FF7D527D277D52A8F8FD0CFF7DA8A87DFF52FFFF7D
+%52A87D7DFD055227527DFFFF52522727FD34FF52FD0CFF27277D7DF852A8
+%F8F827F87D527D277D277D2752527D7D7D2752277DF8F8F827FD28FFA852
+%A8A85227A8F8FD0FFF7D52FD10FFA87DA8FD30FF7D7DFFFF5252FD54FF52
+%FFA852A8A8A852A852A8FD50FF52F8FFA87DFFFFA852A87D527DFD4DFF52
+%A8F8FD0AFF7D52FD4CFFA827FD0EFF5252FD49FF52A8FD0FFF525252FD48
+%FF7DA8FD11FFF8FD46FF7D527DFD13FF52FD46FF527DFD12FFA827FD45FF
+%52FD16FF52FD44FF27A8FD15FFF8FD44FF27A8FD5AFF7D7DFD14FFA852FD
+%44FF52FD15FF7D52FFFFFF7D7DA8FD3EFF27A8FD14FFA8527D27FF52277D
+%A8FD3DFF7D52FD14FF7DFD05527DA852FD3DFFA852FD14FF7DFFFFFF5252
+%527DFD40FF52FD12FF527DFF52FFA8FF525252A852A852FF527DFD37FFA8
+%27FD12FF52FF52FD04A8FD047D52A852FF527DFD39FF52A8FD0EFFA852FF
+%FF52A8527D52A87DA8A8A8FD04FF52FD39FF52FF52FD0DFF7D52FD04FF27
+%A87D7D52FF7DFD05FF27FD3AFFA827FD0CFF7D7DFF7DA8FD05FF525252A8
+%FD05FF52FD3DFF52FD04FFA852FF52A852FFFFFF52FD08FF7DA8FD05FFF8
+%FD3CFFA827A87D52527D7DA8277D7DFFFF52A87D52FD07FF5227FFFFA852
+%FD39FFA8A8FFFF7DA8FFFF7D52FFFFFFA8527D52A8FF52A8277DFD06FF52
+%52FF52A852FD39FF7D7D7D5227A8525227FD05FF527D5252527DA8A852FF
+%A852FD05FFA8F8FD3CFF527D527DFFFF5252FD08FF7D52FF7D7DA8FD0452
+%FD40FF7D52FD04FF27A827FD0AFF7D52FFFF7D5227527D52FD3FFF7D52A8
+%7D7DFFFFFF27FF52FD08FFA8527D7DA8FFFD047DFD40FF52FF7D7D7DA852
+%FFA827FD0AFF52A8A87DFFA852FD3EFFA87DA8275252FFFFFF27A852FD0C
+%FF52A8A8FFA87DFD3EFFA852FFFF52527D7D52A8FFF8A8FD0BFF52A8FF7D
+%A8FF7D52FD36FF52527D7DFFFFFF7DA8FF52FFFFFF52FD0EFF7D7D7D27FF
+%FFFF5227A8FD35FF527DFF52FFFF5252A8A827A8FD05FF5252527D52FD07
+%FF7DFD0452A87DFF527DFD32FF52FFA87DA852A87DFFF8FFA8527DFF7D7D
+%527D27FD057DFD0BFF27A8FF52FF7D52FD2FFFA852F8A8FD067DFFFF52A8
+%527D7DA827522752FD11FF52A8FFFFA852FD2FFF7D27A8FD09FF7DA8FFFF
+%FF7D7DFFFFFF7D7DFD0FFF52FD04FF52FD09FF527D7DFD23FFA852A8FFFF
+%A8FFA8FFA8FFFF7DFD05FF7D7DFFFF27527D7DFD0EFF52FF27FF27FD06FF
+%52FFFFF87D5252FD0CFF527DFD15FFF8FFFF7D277D277D27FFA8FD06FFA8
+%7D52FFFFFFA87DFD05FF52F8A8FD06FF277D277DFF277D7D52FFFF27FD05
+%FFF8FD0CFF7D52FF52FD14FF27A8FD06527D52FD06FFA8FFF8A852A827A8
+%FD04FFA8277D7DFFFFFFA87D7D52A87DA8A827A85227FF52FD07FF7D52FF
+%FF5252527D52FFFF52FFFFA827FD14FF7D7DFD06FFA852FD06FF7DFF7DFF
+%7DA87DA87DA8FD05FFA8FD047DFD0CFF27A8FD06FFA852FFFFFD047D52FF
+%FF27FD04FF52FD13FFA8FD08FF7D27FD04FF527DFF7DFF7DFFA8FF52FFFD
+%0552FF27A87D7DFF52FF52FF7D27527D7DA852A8FD08FF527D527D527D7D
+%527D5252A8FFFFA8F8FF7D7DA8A8FD0FFF52FD06FFA827527DA852FF527D
+%527DFFA8A8A8FD047D527D5227A87D7DA87DFFF8FF27FF5252527D52FF52
+%FD09FF527D527D52FD057D52FFFFA852FFFF52527D7D7DFD0EFF7DFD06FF
+%7D52A8FFFF52A8FFFFFD0452275252FFFFFFA8FFA8A8FF7DFD08FF7D7DA8
+%FFA8FFA8FD0AFFA8A8FFA8FFA8FFA8FD04FF7D525252277D7DA87DFD0EFF
+%A8A8FFFF7D7DA87D7DFF7D7DA8FFA87D7DA8527D527D52FFFFA8527DA87D
+%7D52A8FD07FF527D52FF27A85252FD0AFFA8FFA8FFA8FFA8FFA8FFFF7DA8
+%7D527D52527DFD10FF52FF7D2752A8527DA8FF52A852A8FD05FF525252FF
+%FF7D7D52A87D5252A8FD07FF7D527DA8527D7D52FD08FF52A87DA852A852
+%FF527D527D7D52FF52FFA8FFF8A852FF7D52FD0CFF7DA8A852FF52FFFF7D
+%A852FD08FF27FD0CFFA8FD0DFF52FD08FF52FF52FF52FFF8FF27A8527D7D
+%7D52A8FF7DFFA8FF7DA8A8527D27FD0AFFA87DFFFFFF52A87D7D52F87D52
+%7DA8FFFF52A8FD07FF52FFFFFF7D527DFD06FF5227FD05FFF8A8FD05FFA8
+%52A8FD0DFF52A852FFFF7DFF52FF7D7D52527DFD0AFF52FFFFA87DFFFFA8
+%527DFFFFFFA87D7D52FD07FFA827FFFFFFA852A8FD06FF5252FD07FF7D52
+%52A8527D7D7DFD0FFF27FF277D27FFFFA87DFFA8FD0BFF7DA852527DA8A8
+%5252FD06FF7DFF7D527D7D7DFFFF7D52FFFFFF7D527DFD06FFA852FD07FF
+%527D527D527DFD13FF275252FF52A8FFA8FD0DFF7D527DFFFFA87D52FD07
+%FFA8A8527D52FF7D7D7D52A8FFFFA852A8FD06FF7D7DFD22FF7D7D52FF7D
+%FD0EFF52FD05FF527DFD08FFA8A8A852FFFF52FFFFA8527D7D527DFD06FF
+%7D52FD22FFA852FF7DA8FD0EFFA852FD04FF7D7DFD09FF7DFFFF527D27A8
+%FD04FFA852FD047DFFFFFF7D7DFD24FFA8FFA8FD0FFF52A852FF52FD0BFF
+%A8A8A8527DFD06FFA8FF7DFFFFFF7D7D7DA827FD23FFA8FFFFA8FD0FFFA8
+%FFF8FF27FD0BFFA8FFA8A8A8FD06FFA87DA8FD07FF527D277D52FD10FF52
+%52FD10FFA8FD10FF7DFD0EFFA8FD0AFF7D7D7DFD08FFA852A8F85227A852
+%A852FF5252277D52522752FF5252FD10FFA8FD10FF7DFD0EFFA8FD0AFFA8
+%7DA8A8FD0BFF5252A87D7D7DA82752527D7D525227FFFFFF52FD0FFFA8FD
+%10FF7DA8FD0DFFA8FD09FF27FFFF7DFFA8FD0BFF7DFF7DFF7DFF7DA8FD04
+%527DFF7DFFFF7DA8FD0EFFA8FD11FF7DFD0DFF7DFD09FF27A852A8FFFFA8
+%FD0AFFA8FFA8FFA8FFA8FFFD04A87D7D7D52A8277DFD0EFF7DFD11FF7DFD
+%0DFFA8FD0AFF7D527DFFFFFFA8FD06FFA852A852522752277D5252A85227
+%7D527D52FF275252FD0EFFA8FD11FF7DA8FD0CFFA8FD0BFF52A8FD04FFA8
+%FFFF52FD047DA87DFD04527D5252FF5252FD047DA827A8FD0FFFA8FD12FF
+%52FD0CFFA8FD0AFFA8277DFD05FFA8A8F8FF52FD09FF5252527D7DFD16FF
+%A8FD12FF7DFD0CFFA8FD0CFFA8FD13FFFD057DFD16FFA8FD12FFA8A8FD0B
+%FFA8FD0BFF527DFD06FF5227FD26FFA8FD13FF52FD0BFFA8FD0BFF27A8FD
+%06FF5252A8FD25FFA8FD13FF7DA8FD0AFFA8FD0BFF527DFD07FF52FFA8FD
+%24FFA8FD13FFA87DFD0AFF7DFD0BFFF8FD07FFA827FFFF7DFD23FF7DFD14
+%FF52FD0AFFA8FD0AFF7D52FD07FF7D52FFFFA8FD23FFA8FD14FFA8A8FD09
+%FFA8FD0AFFA852FD07FF7D7DFFFFA8FD23FFA8FD15FF7DFD09FFA8FD0AFF
+%7D52FD07FF5227FFFFA8FD04FF52527D7DFD1BFFA8FD15FF52FD09FFA8A8
+%7DA8A8A87DA8A8A87DA852A87DA8A8A87DA85252A8A87DA87DA8A8527D7D
+%7DA87DA8A8A87DA8A8A87DA8A8A87DA8A8A87DA8A8A87DA8A8A87DA87DFD
+%15FFA87DFD09FFA8527D7DFD10FF52FFFFA8FD3AFF7DFFFF5252FD06FF27
+%FF27FD07FF27FD07FFA827FFFFA8FD29FFA852A852A852A852A852FF52FF
+%27A852FF7DA8525227527D7D7D525252FFFD05527D527D52FD08FF52FFFF
+%A8FD28FF7D7D52A8FD067D52A827FF7D7D27A8FD047DA852A87DA8527D52
+%FFF87D527D52A852A852FD07FFA827FFFF7DFD28FF52A8FD10FF52A8FD1B
+%FF7D52FFFFA8FD28FF7D7DFFFFA8FF27FFA8FFA8FFA8FFA8FFA8FFA87DA8
+%FFFF27FFA8FFA8FF52FFA8FFA8FFFFFFA8FFA8FD07FF7D52A8527D7DFD27
+%FF527DFFFF52FF525252A852FF27FF52A8527D27A827FFFF277D527D5252
+%7D52527D7DFFFF7D7D7D52FF527DA852FFFF5227FF27A852FD29FF52FF7D
+%A852527D7D7DFF52FF7DA87D527D7D7DA8FF27A852A87D7D527D52A8527D
+%52A852A87DFF527DA87DA8A85252FD2DFF27FD0AFF527DFD13FF5252FD08
+%FF27FFFFFF52FFFFA8FD35FF527DFD06FF7DFD16FF52FFA8A827FFFFA8FD
+%3DFF7DFD15FFA852FFFFA852FFFFA8FD3DFFA87DFD14FF7D52FFA87D7DFF
+%FF7DFD3EFF52FD15FF52FFFF7D52FFFFA8FD3EFF7DA8FD0FFFA8527D7DA8
+%27FFA87D52FFFFA8FD3EFFA87DFD0FFFA8277D7DA852FFFF5227FFFFA8FD
+%3FFF7DFD13FFA87DA8A85252FFFFA8FD3CFF27A8FFA8A8FD06FF525252FD
+%0AFF52FFFF7D52FFFFA8FD3CFF52FFFFFF7DFD06FF527D52FD09FFA827FF
+%A87D52FFFFA8FD3CFF7D527D5252527D527D7DFF527D52FF52FD047DFF52
+%FFA852FFFFA852FF52A8FD3DFF527DF87D277D52A87DFF27A852FFF8A87D
+%A852FF27FF7D52FFA87D7DFF7DA852FF7DA87D52FF52FD2CFFA8527DFD09
+%FF7DFF7DFD19FFF8A852A85252A8277D7DFD2BFF27FD07FFA8FFFD04A827
+%FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD09FFA8FD08FFA87D52FD2BFF27A852
+%7DA852FF52A87D527D52277D52FF527D7DFF277D527D52FF7D52FD08FFA8
+%FD0AFFF8A8FD2AFF52A87D52FF27FF52FF527D527D27A852FF27A852FF27
+%A852A852FF527DFD08FFA8FD0AFFA852FD34FF7DA87DFD0CFFA852FF52FD
+%08FFA8FD0AFF7D52FD43FFA87DFF27A8FD07FFA8FD0AFF52FD48FFA8FD04
+%52277D277D277D277D277D277D27A8F8FD48FFA8527D527D7DA8FD057DA8
+%7DA87DA827A8FD79FFFF
+%%EndData
+endstream
endobj
12 0 obj
<< /Filter [ /FlateDecode ] /Length 13 0 R >>
stream
+H��W�n�6}7��>
���M�I�X,�
5�bgl�� ,
�E�B�RG�I�_����-�H��۸�=Y�*�:U]~Ӥ�
�);��7o�^�cן{vٻh�i{�tr��
�3�h%�����k��{��>��e�]{��^�z'?��s�>�]�ݵ�Gc2��5ڷ��h�ߵ�y�N��}86/G�2B%��!��F#i�۹�pO=
OD�������t��
�����^;�6�V��U�m�0d]��ù�6����~ѵ#ֿ��G=֛���ջ��z8M��Z�_�eSo�+�ݶl��}к�������u���
=a��\�{{���|��ٮ���-�n�8 ����~��!�������Smy���筣�pG��]�6ph 9�����rjF��;h�q|�+\���`�
��I�$�/,r��ϟ�3��:?WW��A���c���g�m��[��5 �����X�����
X5DM}�ǡ'��7,�k����k����o��"E"����|=5�G����ء���t7�)� [...]
+M���o��J|��e�
H�O�:�N��C�
�܈ɏU�{�x�Ȱ+7 at A�d3��n7/x��~��C�6��,�d��^�3��Qo�na.)��Mۍ��e��[��nÊlˍ
�"7d�o+XN� ��]O��^��[��FM�J��Vm�v{�FWuӠT��m�a356�(2��Le��\6��Ǽ8xALIbi���1Ye3q�&��'�$Q$�C ʚe�q�Z���݅Ӻp..V:{
5>��!��t���rep�b���mѽ�]�B.��p�n�Н3�[��~t���]�h|���@J�\�S��K��RZ8JM6
ڙkw�>�(����V�ꕋz��G�
vN�[b�Vݬ���ꏵYp`L�tr��W�L{��=Z0^���[��$������W���E��Ό.���~0X�?��:9h�N|��c{��r���n_v�x>� ���>���ҟ��M<��?��y��gDa����>�N�z�;��
����6��Z ���k�w�)��Չ
J����\�ڻ�r�` [...]
+R�A�
+a�0�l��DA
I )@M�,�!*(l���ABʩ�ј&4�ͩ����X�8L���,a)�X�P¬�����,Ĉ�P�Q�I��y������
.y�c������`�
!"�TdB �^�I.��d"3��"T�#�Q�Q��`܌e��Y� Kx"�$ɒ"
�0�i�fi�ьg2K�� ��S@�He �a!
+Y�EZ�Eq|�ˉ�(�3�&؋�!
+]���U���U�R��gI%ǩLQ(?/r��y��y��y��y
�,���ϊLey�ei�dq!>�(Ì!� ��"Ui���4�-"�E�
wb)��@ݤHT��)n
'n.p�(P$ُ�X�9�I�O
G�I ��Q �GE��b, ��� �!P��ڗ�T�=�)2#�F��y� �/
+�D�|�"A�"!�C.Bd��t��\!�r� ���}�?<����!)x�/������gS`W�%`b����|�in��h
+���{9X����A���z
+�Ǩ�j�
� ��N� GuԞ@=�9�"0|��7N|��7N�N�ޛ��w3��ϳO`Gn^�{�Q�����X���ٟ�}�m,�|��0b-�W�����93(�O8K.�hmAv�"��Y����4P�
+'�|c�R����ǥ�|L��$V�Y"+r1
�#Gh��~0d�Y��8v,�m�
�d���-&�&�&�N";؈Y�L �a�G�Z*�-!
%
-
1��3A�D�(�,�[ܒ�YZī"Z�Ѿ�^��Be(��K��r�Xd��V%u(+��r��J
�5�V��Jmy%(�u�!ҥ�V�����Pn��VEw(��fO ;K�ؒ�� �E�䃿*ťՌ:�^��[�m\�m
��kYk�_���V,�֬�Ԯ�
�ӥa�[���~�g�j]r� � ���̵�\�˥�-
��U�d7��'b�O��?Rg& �z���&�Վ�$"�\�鎹�}�c������wߒ�dž��I�4�=�n��mǦ��c;T��u��d!F$k:S�9�,�D
*���rWkW
��D�[���U�����/��1�[��1���^�Ի<�p���&ȉˈ�^1�¼A�y� ��{�6|�����I��q�:cD!�u�
`?xN�
|���/%�$^�66�TB�G�e�<p#�
HG��\*F�$a�
X!XZ�q��:���s��<���AB�axl�B�"���%�
?�����
+��G�����{`�� ��Q�1)8��
w��
�y4c�#��dƶ���@y#R�I���+�b�;Zz��o���<�ܒp�ͅ�a|
+��vrTW��h:��
�G�����TF�0*��!*�P�
�,
�p w����C6�Ɏמ��?b�gp�&��n:0�����}������=:���?��`&v�KϿ��[��k�λ��V���[��㗭CO��O%u���[���G]�:?ꨵ�*^Tv�_�Q+��ŎY��5j�N��UR+��-ͺ����
+��)�T��U��g��kWq��Z�3���eK�c�g{X
l�c��i9��C��pv��
�'+�l�4�c~b� F���:�X���~�=���
����%BWJĞdQ�)GfV��ȹd_2��`W���a����ь���8�(9(J^��H�ˢ9@}.FG�$��?��g
_jUis���Z_����ڼ��4�mVw�.xb�Z����)����\كc䍩�-x&x����瓿���R
���x�^�\9~p+˵m�N�
��v�kx6��R���R�xd���ba����6�`':�wu�RO_� �j&l�j|(<%Z,AZ�DO�{����wI�I?K�����pѼd��I�5W��#�
+3
�t�xƗ�l������U�s��o����
sm�Ҵ[��z�5[�'��鿳�x]
JV�����/Lhq҂��
��J�|� 0 at O��OU|u钂<r��u���}��Y�n
��a
�
�;
�C�Q����g� �A8�p ��-�c���f�4��V�P��q��������䷲��N
���Y��<}:��8�W�v���j�W��o��gk�
}co;�V�t
��[}�r��`�36���`�!�C��
ܱ�IV@��I�f ��+�/
h]m�um���C�x��xSc`����ʿξ��H�wϾ]6��
j tS��9G�T��<O�J�ʊJ�ɳ���|k�ccS��\�2v��F��ʺ�����|�*������V�X��66=�D����U�Ns����:
^�v���e�������=��
���j��xb0��\l|�l�����g�h;N% i��^����{�\+#��"
�����K/6-@����Sq��a��gս��]�U
����6���\��ŵ�
(�
����\�lL��1q���sG�>�%��~v�B�<�܇?�IR��x�C�>v)�����ʂ5
��@��0t��Ŷ�oe�
l8�����C?�16(6�1�s�id��C�q.��X;F��iT�z^7�l8F��!B��)r�a��+�N4,���.�����7W�5m
5��J?���D<y at Z.���n��q"�<X��L��|^�
+O���~k��}U��"MX>�X��zg������sj�G<1�24�u���b��]:Bavs��?T�c���J���Ey�kE�����0v"X>�"���pq��,�q$ �?ׅ�B1�/G�EƅOz�\�?��� �E��Q�k�ċ�Y�7;�{w�4l7b
�C�Q-*W�a{h��� >�#{b����| VEa
k'w�(cl�M;�����z�������#��
�.ə���bv
[ǫ���z��
�S,%��
+I ��΄Ff���Ӆ�����|9��lr�Y�siIN�G�.
5�l�h݆�0*���2��
�E�@��j�Ou�z����w���W��^���NN���zg�+�cK�ը.�C�:��j_�)�^����;�l��zqL�s�ss���R��ᠥ���4낦*��]��
�IRpR��Ҩ�6
��^�.�s�*f�oN�
�Z�U 5h���@��B4|���"SQ L�%��9|K/ן��;��ޏL��}�u=z>(�X±|c�Ʋ�%���d���4H45�\ :A:r����!�
j��������~����ߔ`S���Z,]�HJD�R���A��qU2�:=+YZ*JL-3�R�$���7�5�-r�v�W���
އ��%)��� ��W\����^�'�>�������=��7��?0<�'SԠ{<�=�����(
]J�sjrL����u�ߠ~�˻,���z���]����?��
0�_�M!��H����yI���ʹE��7XTt
T�MEA�;�I��_z��H3�����P�%�([>FADE�F���8��AOec��.p�7�@
����t
Z�3�*/y�a�\��M�++x�|LQ?�w�A�~��.~�3���ݒ� ����
v���`�U������/9���}�����{���1n�������f�W�S�������M� [...]
rj�iti�h at +P2��7�3sl��
��c�ƚs'F�m����=�Ξw.���k>
=���>���>�X���ۍE��7OvGo��_j�S�&�'�J��rb^�&�Ƣ���J�e��lu߲���
+O|;��Ss��
!��mͻyAm�C
�$Z���>*�j%����YR�S�M�u���%FFu�WE%�UI-+�*�Y�
b�StI�X��h�"�R�ɩ7�)�*��R�Mj�
;���p}�v]ү۔Z:6���M�w���i�w��A��s�j�!=?����(4��4~���SYY�K����s{�S.��1���bUe�KQc|�y�1
� �$���dG�΄�ŋoH��$B ��b�6l\4.{ai���LXC���- �`3ģPG
�(i��{����P_.;vG�
�w8�F��bd�ˡ�M��
A�C�1`���������3��(�
�!ZGd����
��D0Ae��J��6�n��
)�����+�^hp�
+�iXN'�F�c]v��*CO5�r�-I�P�6��0��Ez�
x
,��tOߏ4�L#�L�ƴ��_́�Lmo>K�Kn
f~�7����
;��fy��z
���*�����:�U�jtS��>V�P�T�u�̱.yU���ȫA-��X
jq�b?s��
+��R����q�V�ȍ�
�|ѭ��Kui�
�
?=�y��� ����j��ھR��m�Z�w��Us�=eU�=���_���^�s*�VK����M��K}�n,����~���]�
�z��]t�~l�]}g�_��}��QZؿ�͞����˪Uz��nM]���h�m��ޟ`N»e������
h�;
{��S������!�{U~T_���8��o����Ǐ������O��_�O�|~��}w�����÷o�Ρq�m�`Á�M
�!�6���$���x�\ �����θ
���6�/Z[&A�g�{��湬��?���7��eS�{'�� �i_
I����a�d|ɞ�G}/�x�%Pw<��hۉ۩;�w��3�ߡp�[$�'7�����)�C�`F�Ip9�w'*?���ΝЁ�@�9�G�5>!�vbߩ=�;w�(�Vt��.��&ɮ>Hw^X� �s�U'i�A�/A���v��;
+n m��.���vA�B�$� h-V�A�u]�m��'��Qև7W9�Ƃc�/Ց]9
��kp�
Lɯ!tm1v��f+ST)�S4/�n���{X��y�
f��`�X�ʁ�x�q�~�x��[k)X�u/�cbg���q���)J����Vv���ZN��,[N��tK<�l̕�_��D-,PG}*%�T�27�j�D3�
��*�QsI�.(�
�J����H�::�a�*:K�t�+%���F���#[�͚.�=(�MŢ�zy��Gz���e-z���E��]͵�|l4cW37rF5s,��tm�6Z�5yӑ��A��ef�b:K�qS�0����
�QFQS�2� ½b�K RE�Ҥr�����D>��m��=*0D@��9�
�l8ök� �����R:����M]r�`G��/Üt��>��t�`
�N�j0�O5��R���:
۶6#g��������15��� � lV
�z�=1 at TJ��^���`�3�h���.n�q��E/� �AttNF v0���ۙ�
����/' � wz"
+����7Q<��lE]�4�6D
��6��"/('��P"���]̠�H��1E���@T l��~��d�/��
����7�[��.0��;x�ؑ�<59��N���"�e��,�s ���wȽfp��T�fr�=6L�
a
�Z(va�q��*Ok<��ְ��&��1�b8k4�a�����>e� k_�
��7Eu����5�����b^E��Q�(�C�+�U��wCbU:c0Ȯ�k�L' �k&\�<�m� `��E�� �
+�
+6 at 3�Hk�Z ��>A&E]
,g�=0��D$�d�v��
���a��P���V|A
� �p�6��� l2�rih��ST7��h�N��q��x���@�E휄��Y���jQ��� ��W.w���%o��ΰ�e�d�g�tQ�i�$���r��)a
D0e0���`��v�y:ل9_#zN�g��H���}�cb'J
�t;I���9Ȝ\�� g�7�1ț$n����&�5Qи�q1�Rƅ
k4!�2�EL�L��5��t���;����3M��X�-i��63d
����|���
A���
c����
b��G}�&Fv�~ʻ��ޙ��;m�;C�;B��-�2D8b���Űt�:�i��t�ΙL�̻� �&j��kC����$^͇m�rJ���Ӆ��mK�ә⇙>eD�����"��F����E:��d�����ʹQ�DԦ��
�1�4��29����Y��(L5Ul�1+�\���r`
@s�V����إ��Dq�.��Ӭ��������/~a�ݲ�堧�b�.�ᶸ����_���GVꩢҊ��խ��[~���J��>h�}�u���3��v��}}���o>~���G�e�������w�o~�~������?~�oeW�e�h�4��<G�E��8H�\���.��(ƺD"9�$I���C���è#�ӆ�Fm�Jt�d!�p�(�Ě��┡� [...]
+��b�d�Y�U� �s�v
2�&�C佻wts?l�;�
�O1��}��)��.e<N��t7ӕ�*v���������nN�z���"�:}:y:u:q:m:i6�0� ��D�UΘ� ��H��
�
�E�N�N�N�N�N�N�"B:È�i�Ip0t�s�+�9�9�9�9�U��z�hT�Dg4H�)�ApdBh.�ʕ�(�XӀ8
,9 P'Ph��#kd4Kdl
J���
�A�[����-A�A܂q=y�f�
+�m�4���ld�H���A��܀�)^��-�ڃ�#8;��+���JP��[p��G�z�5��uFi=�����,
۰���������w4���<�ė�_2�u ��N|U<��z���
�!�yh at k�������Āǔ�lm�
�����֝�[��G�&9R�!�Z�F`���}c@]ý�)�`9ې-"�?��A$EИ�АV��;q�����
�1
&�����8*F��ƈ�r,
+���zID�QhN ��#�o#����Pb����
�q����S �<".|�m�.
@��;�]��z롶Z۠�:���AcwHL�N&���z#�ż[ ]��DU"*�)')Q�J�$r5EbrZ�Ii�$�Bk��jhH$4m��S��ӎ�
�2��nD6��h��b�`D/N.q�sb)���'B�{| a�� 0�z��gd�����Iƈ��5 ��Mo(Әx.M(_
���9NG���F�٬��\��
�s7��[Nܔ��%��!�Ƭg��1��:�� �̆nfD��#�؛
m̐�x�
"�%�͔��`L��x87�K��}2�U���dR�`S�hT;�hfu�]E�fW;3�u��[0����!�ƭ+~����+k
�q��t�#;��E�י�=��_.=�G�0�a.�A�Ţ�4|�o>�W00ֆ$�GDV��M�gG#y
,XH��b5+2�
��b� ����Eנ�ʘZ&M�c1�m�w��#Y���S����ʝV<�LVY�.�,��SW4Ȧ9���m��7�Cn������$BSd�E����a������;���c��7����w������*�q#Z�*,U�����ƻ^+f��`iD�'B�g�[NJ������<ʛ��u�d��˲�����Jle�{�p.�*��N�R
U�T8S�+y8R�
t"�P
�MpzOߡ�8C�M+���y� ���[�,��
+<��)t� �$�I�#py
��a�a�aΑ}c����\��R�ꗰ����+�ab�(�
�r���G�k��%�VAu5fV
��bE�P�PQB��ZC�P9��*
LU�����{��I��Ĝ��
foT>�1�Gf�����Q^Y�QZ�Ɣʔj�����+9L��҃_�CL b�d�IQ9���p�YiY<�%(S�p�^�bj�Gd�2��:�6%��2xɁ��2�(*i���F��Q)q�{���)w�J
E�
~I�.i�(j��t��,�Rn�r�D���0�S���a�XU���F_�6��q��#e�BT��H��i�Y� m
)b����i���ߠV���,����2g�Ķ�]U�r����0��+�*+fM��nwS��7Y�%�Ċ��J�Uu��jR�Tm��
+���j���n��V���a�=+�M��������� 2�5��Q���M^�"8��V)h�B�i��6a-�w��'=�
j[��� ���[��6�� F<��;s�A��a;
��`�,���GX|��{X�����D0bTl
#�)<�p�äW����+H� �^<*NtNQ��Ƹ�+��h1b���Q�V�p
+�bƠ��2j`T֊NacV�8�
+{Ġ
�
�|��cT��?�@�A�B�%��� 2_G�L��
0�#��
+�/>�
[���Wl�hգZ�K�Ċ�����Ҋ�5���*��b
�� �紮t���Z��欫6���<Ld�~)�|'�(9䆓F�9��;nݣ�k�=��:G���r�7yF� ��3N
�~u
�c�8�
9��AǸ���1^�r
�vh�<�\�|#.��9L�ЖU#��Y�FփȺ*�^���/�M�ڗU����/���o�����^ww��tX��w���N�[7�����Z���qU�;�=a���}i_��m��_}�w[:��V��=�/��b��ۖ��=�9�Z�z�����|�nч�r�
��M�����Ӈ?�����?|�9����?����w��_���������>���Ͽ~���_�R�[i�G
����?�����z>����ջ_�ۮ���G��3j���;|���=��8��#Q�c̙�w�
[�س�J+�@ |c��B�!���!�D2��d
1"1&�<?%2161:1>1B!���S�T�*Q���B^!��`4kx�b�
��C�!ŐcH2d [...]
ɆU�oP�O���Hg��"�N�c���f���7�saE�k�3|Kug�O?{X��z�
O+������
+����5^����_[�ҫG�܋_~���i��z�=�ߊ���7�����,;����UxH��b��b!�!b�k�@� �Z�X���D9R�Pa�"�-,\(^��,bXȰ�aACQCa�↓{Y3��Ȳ[�NV�����
+!�!
"N��+����F�$*�0�t$�Fʨ�ᨁ�#��,�b�St�_�j���]VqS˥���J �Ȩ��U&��t�)/��햪6�x�֖�0�N���~N9���#&�^��.�:��5��:�<z���I/!?��%�)�-$cX�!�ù5�`
�����7�@CX-!B�3� $�m�%�������^-S���S�[�C�j�V�Ͷ��Υ٫��n��e��jP���Ղl�D9�-1����uz�R�gD0i6
@�S7��Ձ`=H6�O"p���ݩ��Kpp
����^0rV
��X��
H��s5��݃��q�
+��/k at coi�
�4@
+F"{������O�
%PY�
�yƗ�y���NGx_Pj����,
l��%��tȹ !�j�
�aX�A�K9�TS"�y ;U
�4`Y�����r�R���D�.Q���>�(֯E�d�Bl?��;�|#����R�NZ���<��+��
�#^���l�Fh8@�
��A�a���������Q�&�ʀ���=�#�(��<:ˡ�
+
넎�w
�/��ѣ/
����O��}ۡ#�8��=�ڡ�I!8Nt=^9<�ռiJ8���P1�/Ef��ar]�yp�H�G w7��,�x�?�vĜ�xW�����5��=`X�zpTu9 �b<���y�<
��a�PQ��ݬ�֖
"/�q�zj>k�Q�� gx5b)t
+�ы��5�ڑ
9�!�%[[#z#�U��25'���-��6e�Z��Y�]ٰhY�$�Z�Mkm�Ƶ�e�}���U
Ϣ�Q5�f^ۙ
���5�,"fc����[����lqkr���Z��Ά��gӳ���5���j,x5,�@
0��4Z����
��B9rR�2�C/�蠉N����FQ�=�#S�8OF�fI89�䔳�
/�i�1���
sM�DCx).��V�BX1T1P!��B�
(�� 41%0!�J:�"�I��A� bbbb "�@o~d��xT
x�رB����'� j�4V���p����^
+>� @��'aH�XťZV
#KB3d�g�i�h����њ]F6mMhk>[�ٚ��T�YJb.����zX�V+G����A<���Y�i�<
y*v.<�P��3�)
�
yb��DE�^�E��#O{�i����Dy�=�j�����ty��YOy=g����N�6-g�=�:�o��(Q��96��;�\ F��ዞ��sLR�Rv����:wй!N�b�����v��T�ξ����
��L�qQ�i��@=��/
g��S�����i�����'i%):1��F��
+u����y�8�5m\��H���[5@��^
{-�JX��Ր� �0=`~&MdU�D�K^�M��mW�/���QJ��E-��D��U%!��t"��4��\������"c�R�X�_":���i�E�r
�j��8q
+>�
���.H���V
<���zٔ�نWQ��p&R7fq)��m;jZ�lI�4�O3:��.�fMf��S�8��Ld��!��L��/w
I�#������AUef=��S�-ȒAX���5$�?t��#�k��˕�N�����Ί��q�w��c��.��J��<8�
+
���U�����ܡ�)�����AZ�Jg#+Mj�:�9D�KTz�Uz�JOFJJIJHJGJF�#�H���x0
+R��
V�ވ���)��=�o��3�4φ53 f"��$eΎĒ�;�G�e�ʞ)�eϓ
ғA2�c"{����̡�QHJJw�8I
; d5ʘI'B�̒�/��E�9�9����ҙ�1��2)iP!�(�
_�Iu*q.�:��'��l�
fSL��Hyq3v���=�`Ff&m:�8��e��FV]l^M��B�M�6�n�E�=l�m$�wr�yVxWy�7�x����&�"Wަ��Ȥ�A�
'�μ������}}�0e���^�vq1�㤍���6�F�D_㟈��n��[��m�cɽ��uiy���{�J��Y%���������K��-}?�;ǎ�i�{�^�3�w�Mz+�;&���{~; �&�闱����T���m���~�>��d'#߬{y��/ߙ3J�
>�kޮ�<#Q��ξ^+��Kj7����gm�?�+?��?���?}�������l?���g��_���ϟ��ϟ�~������g?e1�O�?��g�;K�D
+z�
�GҠ��o�����ݾ���
��K��D��x�k��tE%�h��k �+6b�d�@mx(��CA�P���D�BpF� V�V��ա +KX��!�5k3��vM�^
�k%�m�݃ &�"� ���2�A�� Z!��j3am!��ڸ���LR(�w)X�y �%b����F�鉘��s���'��+24�{���`c
����[�t�t��i I�� y��ĵ8���<d��P�q�� �p�&% ���
+�����DlE�Q�Q�Q�����DG���X��fU0l�PV�D������~fK����d0�8�@�*�b��A���P��v�{mw���=�W�G+���J�������mh�=:\ϱ϶���-v�z�9 P����J/V����'�Xc�&[3W�����f⩹���d
"
��CFJJΖ��I��n9�ʉ�3�L���e�lY���jN�������R��t1�"/+
��2�1q�9q\�\��
�
����Q�9P���7�����C1�)�u?U�\�\��P�&�P���h�
@T����g
024B.�F|�@��<.<�;�a)p�hDG�i6h���コ>9@��
^�ݷ�
D��}+�a���o�;L�x��p�;���2�H�0
H�x
���|��G
����C��'��Q���� �P2�(�d�ob��IV�b]�>��˶3 ��f���`*����%aұ�
{2l���;+��8�X葏��Ђ�Vt-�a\��_����͎!�Q�v
�
�a��jH� [...]
N��������0.b\E7��2�������a��d}����W�^λ{�~4�}4-486�
:8<�6j���s�
+��aͫW�{�
�fx@�
{t �pï�($0�hj������@�:ƾ��~��GD-��%H=�l�5hBD�
�
�s�A6�` E:ˁ���la;Z�f�ˠ�+�pZh
+�$���e��� G
$+K�E02��y7`{�.G��*
m5�OlQ�9x>�T?
+�+�lJ�RuR��U&U��*+W��j��cz���咥��媥�E�"�n�p�א_˦���%PSS �b��%�B
![w��i���
�ș�Z&ލxxy���&�&/�59T6\��8!�K!o�ݑ�K�e [
��(�'=���N������gb�F<W4����%q�p��Л�mнp����P[A{G����F쑹 �� �'4Âc�P���в=�XB����\_����@�_h�
S ���q�>�=�M{-G�i���a�]9:K�jמB�xO��'�&�%�#�
��y�N7�Zó�t�[�U�F5J�(���ɬ�
B�LDQ��̤���ҔE� �ԩs�l�48�R
+U�WnX�.�,�3l
�2���p��`��OApg�
�D�~�-�mӳm�Nb��@OQ�RGT�5FE��1kkZs�{��Ҵg֢۠p�ڦm�z�z��v��KӰ�.Z�Y�������{o[4�C�~h[
��O��cn�x�p�`�P�'b++�L�LB,3�<�v��}��#�>xZ�x��/B�F��WA�س`��e����|�C�h
��
{|�h��>��C���#v�=:�ͱ϶���-vd�e���@1�Ӌ�0��'V�h�ÑD��B����C��SsI�5�8D:&�6#'╦��EӜ�ц��7ݲ�9��ٲr�qw���-��#�����xYY�������̉�`'ڢ�h;f�y.z3�a$<d�0�O
+�*�'��ر@f*�H,�D� �RuP�p�,
�`�Ct ��RDUD�DA'EUE�E��EaTeti4mD.�:�<�>B �w*���*����3D�T�Yu2W��R���*������J?�x���^_'�w��V�=�hon��l�w�5�5�E�Pu����VŝMos#����J����*�.I{��Q61R)r
ZL�
+��C�����nԝ��S�7"5
e栺�ԕ�j�)
��'�ćY�@�t���W�c&>���ե£y}����n��� 2�?�,�,5�d69ިQ^�>��j��+˷X ����RϤiR�t��� ��/曓�f1�ӂ�V��|�0�\
��8��~i��^>Fu�6�4�4�F�"��3v$r$n532�L�`�P��ޯ�W]>\���k.�a�^�RC���h� .!�¯a\ĸ������e���/d{%������65ӯf��q=�r�~4�}4-486�
:8<�6j���s�
+��aͫW�{�
�fx@�
{t �pï�($0�hj������@�:ƾ��~��GD-��%H=�l�5hBD�
�
�s�A6�` E:ˁ���la;Z�f�ˠ�+�pZh
+�$���e��� G
$+K�E02��y7`{�.G��*
m5�OlQ�9x>�T?
+�+�lJ�RuR��U&U��*+W��j��cz���咥��媥�E�"�n�p�א_˦���%PSS �b��%�B
![w��i���
�ș�Z&ލxxy���&�&/�59T6\��8!�K!o�ݑ�K�e [
��(�'=���N������gb�F<W4����%q�p��Л�mнp����P[A{G����F쑹 �� �'4Âc�P���в=�XB����\_��~��Xn�� �wc��
(R�������0
���"�p���W�I��h�/Z}E��O�~���8��L����>C�^�&X
�e{A��k,�\�)`�05< �K�#A�X��y�N��_�0a�����_F|�e�o����g�����?��'��MoBo�K��O������k�=>Zg���C��;߸���������\��7��7_��|��U����a�[�9������ۗ���;ۗ_�j�����_���/���ǰ�����������ӥ1�g
���g��������&鹤c��
�ӖO\���Xxe.�R)�����F�a�E���J��y�N�G"(E�1{����Ibcf"n��� �b����AhB,�,�^Ic�X`'�.��
���Q+
} [...]
���Ǥ�l�ypG���U�+:���!%��3���k�)N�
�=:K���<0���/��6�����x�LH��b�4��Ѯ�!�I%�&�E��>v��5���8�
X�rG;���X�
ֿ�������>�m/qj�t��ȧ5��M��.��^�
+
��I�{�
�_�q�tغ\z
�>�N��n�m=�]���o�b���&n+^��X��
��w:<X�X��OQU~jb�X�X��NQ!�ڋ�8�qT�y�M���0�=*�b��� Q�8+"-�&�� �E����8k�TT
��rG:��By�P����y,�"� ���B������X�A
`�N��c�k�/X��aL����
�l$�3���>c�b$ߑ��#h���9y�B�Cg�P��aVhRHT�5�GCdj�cC�r`#C ���a#��1��=A&��������ᦆ��$k�9ؾ�lyأm3o`��f�������Q�Fh�71܄��]�
{��{��
�,,Y�;���)l�>.~��>����O���>~R�7�DO�F
E#W6�H7���oq��r��|��k�����?��T�G�dnd���ϝ�l�A5&,��A���K�䣈ˡ1�"-�b�b�4`E��fI`
����E\�E\&
�����܋�|���5
�8Ĺ��p��榖s��z:UG�
��c�&�Lڙ���U`��.�y��j/2K}�6�j"�ͤI��R���4�L�:�0߹��VNj6j��Vf�jp4wʘJ���A��
��1�I
Z,NӔ�uħbz�)O'k\�
5$&�f���#!�t��i��>�E�s����
t��%
j�ʞA�+�|��8"@0 &�����HwH?��u��S�
�W�-�WwL�v
t����ng�?e 9Pd���4+0�[.5�Us��2
���С
#$ɱfI?�s�l Ȓ1r�L[y,�+�i=i`�{
$�zDCh�3��a����$�����9ac4�7
�C��
8�@<Ȅ4���ǑI
+@
$�
��Y��|�t`#�5x&�p�O��ד]Ê/���]�Z�f�%�N
_MXc�:�՛.!�b�p֯6���j��m�����333�XXb��8�l��2F�c
�^�
쑭G�yf�`A�m�>R?�I�&2qR�=w���3]G�d9I�R$%v˲22�
��^��`��1�V]$3Ih��
,5j �M�HN�,;&;��l������g����gĠ7 J"Աͽ���V��Yo姈O��,<EtV�)R�D����$KH�A��H��ro��Ez����[�^�=N}+�[a_d}#饪&祚�y� 1�o��I�"��k��VWi�
+Iu�L֪pE��z�,�����
>����A��{�{
8�f i� ��`�Lq
hN`� �
������ � Sp�a�8�@Ϙ�;�uE�f
� �rđ�8�� �;���La�!Y�
%���@0��uUka��0p��G���2�9k�5s˽d��_+`5�U�u���Z�jp=���
+�j�Ua�7��@�39b)P��cJ�n%��H`��l�|P��:�!�J�y�Q[�GI���F�gv���<��?~�T�� �*͌#�B�`���
��4�3�0���
/k,�
V;�iAvh�;!M0%��A�M�r��^���Z�t�]p���+��52��F���������7�<�2�:�y�yHE�Y���x��
�1�rY��f�(;
g��"�
�S���I*īHԅ%�I�"SY�V�T��P�Xd�BRd�R���c���*WE���~�W�U�B���"�U��Fs~�ķ�
+��\^�;+Z�hR{d�g)�t+��(+�(*6�uxlq�ʤ}�:E
P��n-k*F�p�� �V�Z��Ŝ
+�F�gC�`�з�@�n�cm3���E2���Ib�S�$�C@�k#k_���q ��X1W1\���W����=���������;��"�o���*c�<UY�C�
N��;�4a�
��txn�J`�F��]9�ax0,T$@��b�غ���������M$
��:�ך�k[��Ċ�
�X��b c���V3���o�4�
�
۱A��w�l_�|�Q5{f�}���іg�r�ʸfR rN����
+�d3��k��Zb)1�H
:�Hv#��K��y%�掬Hn,
��ydM��A%�L�cg���]M������[�b�L�O���7}l���\�1:��T�3�
+�U�?�UM�
+���|���`|XO5��
�xG�;>�dSg$ �:
���#u`�N��NdX��
W��]���&��1gC���)�Ƴ��Ϙ��o�hW���isC3����P����8��r��O-���4���]�uF�a��@�a/�� -��szS;�ʲ`; �=b�L��;h�������
�.F
endstream
endobj
13 0 obj
18334
endobj
14 0 obj
<< /Filter [ /FlateDecode ] /Length 15 0 R >>
stream
+H��WM��6���e����(2X,@�d��"�=
��`�C6�[�Hɲ����E
�jlO�E�z�*
�8
Ғr�#��f��)9�&��b�(�3�b�!&�6@Q�F�P�%d"�H�0>L�,a�
Ps�s=
�B,@
Hd"a�
~�iG��bD���7�V���_o��������y~C`�=��Xe�U�nU=W�WpZk�U�W��I�_���.�m���1���!�W
S#j��0�i�iC
���
�#��`�M�׀����m
��y6~�����cE�9�fx巳{ŭ�
+~���Y=3�csc�gw̡v�_�C���}�_V�:t��o(WXv�w�.��M��"�F���۰�BZ��՝���Z��
�m�d7�UY��LV��X_{�R!3XE`CX�U7�j��2�6�5����a��SN�f+P��f a1���-R!�q��4��2��@!"�C��=
���W�w�l��0��C�60�oކ�_]u�]
f��l3�;�"
*TMC�
��PU�
+�;��
xh�D�v`˃��";9��
xmX9��
�q\s
��LD���5[�č��Α6�ϡ� &"� ڐ � qq:� ��;g'�;lw�.�+����q �7,(����&���m at Y�|�6|���������ӧ������ǃz�!�>Lt���u���eN�?�����
�>���?r7������QN��Շ9M����|��㾳��̈́�����2s=��s2r�ô��;G��wf����R�&��L
��;�s�Z��]�˝3z�S�m�\����㷧�ƙ�����z��O�??�����u�:���p��I��)?�� J)
�!�L�ނ�*�
,���~��=,�a�z�u�Q'���
Gu�AqA�����t�Qw���J��
�Gd=��Uv���)8e�Yl&ʌHL��PTf,$���t�C(2%@/
Y�bp�����dlkJ�@�*j�BI�� ��*��ňP�bF8��[B1��LiW�Vj�^o �n�y��/0_���/�"�ui{O���olA�_ۙ��I���<��~�9��_#����g�ƈy��e����+�C�[k�����H
+Pn���k��Tm��R��k���h� ;�
����RK)K�%�XP��G:�GL�E-|�KY�%/
�3
������[���%�r��$.8a?h��h<XK5�����+�ü�,����Q��>+跌ޓ#�=:ӡC
zUa��йtqF7Gt�,�.w�u��W���
\�Q�q���9���v�q
n�PXw�@�����Ҩ��U�L�y���X{�~!�A&�D$a��'+�n,��Jx:
d�Z�W!g�Z&s�� �
+��L
+��|Zr*�
+ xQqr}�B�r�ɷ0.DO
��O� �.�}_�^��t�`tEegv�����N�������웉��
AپgE/ ��y��O����� �<M��Nm��^
��b��l�~m8�%#�s� �k��a
�����W<�.�
Y
~FA"
+��h�᭘���|���5B j�"�L�"�V<�&�bT�*��_<��X?̰31�Ǘ�� y�6�����y%�
�>NL1ik&m�ڞ5�����0?���Q�5mP�P�P�P�P
q�(�Z�����9��`r
+렢��c�EX��i:
f�
++���Xk�G��qw<�rgmVP���0a����m��
�υ�+�̧������I�����ie�3�8Ќ��a]�����
Q�D�D�D�ܭ�'�G��Ċ�ץ�pUd
+`�@� :X�p�B�.����(���tҸ�c��S"E$
�
rK���.���{�h�l�
i(�-�+�
�=`�*����lU��w44P��]���.�WWD
���z�1y�
��}ک���E�8
,� {~
�8f4kcz3Lo}ˈ�dz���u�h�&q�m���m�ej�[<�ʕ���f��MҚd����Hi3ә$3d2f1����'��.��u�;07`/����e�{s�[�t���>���C"WVWS����d �@ҁ�&�]F�)a����{Z0[Zh#-0/0+�0���*��Y�(|蓗��f��
mK
u�?z9���C�$ҳ�>�0�`��Dr�I^M$/�
�t���EْȚC�d�>�J�کS�&���YT���Z�������6T=x�#6��ͺ���N>�cv����q������︶�3��+��yLQ=L�%S|��Ӭ��w����Ɲ j��Ҏ
���Q�
+��Z�H���~�2����O��s}~���/�ߞ��g���o��_N?����叧���q������Ӹ3J��9��~�?�)ۦm��״k%[w�����Sk��kp�b��zH[�Y����H���]a�2M�8cϦ��YF�`��
�����-CA��s��4}�Ag<}-B{�P
�f�P
j��Y����MXMa�
�h!l���`�6z�D��t-q,�$^��X���TC0r݈ ��'�pD�#�+hG�
�f�K
j�e�����;���ݮ�>��ۻ�{{�[;���6v�p���.w����p��۲s�y��ҩ�G�S�O�ي��G���p���^D�s0����艏���W{b͕���&)h���ph
��h�=FL u��h� �a
�%P5�&��3�a�����"&����~��Hu
��H��H ٗ~?ȧ���k� �$+Z�aL6a�,B���tuW��{�#E0�=3U�u�Ω>�����xMI�P�S�S�S���!'�S��0k�?)��'��N�����5I�X��I�ؒrM&�K��I]
+�)��
+��b�?��e��2�eU+����W+�n���������b� IE��
$��$�6$�$�8C.��UmY�e�V���Yr�bm�r
��L/��VѶ*�mC�M�t3$�<ɷ ���4�84 �F�d
b>#P�&9���h
+6���0�����
� <0o�|�4��1�&"F^��i�3�����"x�{N��N�F��)���� #�L��4h�
+�Ԁ��1��F0r��{��{
+�I�b��l�V�KdD�^�i��y���\���݃�Тh��h��
bL�
�G�q4$���q���6��<` &��(&X`�l
�O�[
�����;:������
�?zd�h�l�
���£T�}t�<"�_�`��=����j��b��.����Ş}��������a�r��?����6-�~�s�����ٿ����NJ�h����Z��ʃ�H�%�Q�b��%��cb� �z��q[
���喔�/\����Gw
+�����|�}�!�?���|�df=s>3>�=�=q=1=�|�8^kbx ��O�j
F{�y
&��u4���c�C��\]����/#y
+&Zh��K\[#e|:F�ؓ������
.j��ZwQ;` &��
�+�5�7{x�N����W�GW�����o�S����O����
m��wW{H���o�v�c�y��UkJ�6�P>R�o�R���O�������n0�_�_�)��4����|Z겚��Y2��IC���d�iYZU�Ѻ8�KE3L|�JO������Y��9�&.�V�1"�M��3Z ��2{L3��z4,Y.`i��
/G�h
oE
Z�gM��7
�02i�6��"���ud
��h������ϚF����}�S%��
@}�d�X(墏y�ɔ;ފ<9���yZ0�<���kLӺ�o#I+�fѐ�U�YS�'l�n��<k��{��\�v�z4O�)���/.t���,t� x�`��<\�1O��r S�<k֜yчݠ �Þ˳��5�
v.]�5U�{��a�7�
}4}
Bh̄ލ<�����}�B��rװkԋ�9��>���}�Y�
Q<k
+��yBH
.��'z5�mg��!3��nSx�c
��M9Yq�s���x{���o/�/v�m,:����>�xM
\�X��IZ��������[>D����(R�,��P8=ŨCHN
bU
�nsH���/�M�}�`�K1��}2�V���&+mi�&��)�J�Ę8mV첑q�Z�ͺ�4� A�w�"|���d����#�P
RՌӌ^��Yj5� 5[@
�k�LqI��������c�
{��G]�� hޅ��("���Sv����E�[H���NH>0S
B�V �0�(
�V��G/�-�x��m4���&���
x�Co�f� �D�� F#����
X�(��|�ϑ�pN˅i�<Qӛ}q���
\K�ZSm������>l�x� ��I]����Y�B1�8��^�:��+
.Z���
����E�4vi7�b�Jܛ�v
��,�Qn����:34�;_X�-���P�?��B�YH�Ep��
�%)�
+��΅�lʌ��!4=%*�R#�m$�OF��v�Ζ�I���b�t��Y��6M��
��B5ۨ�W� �hn���ΒC�j=`7��BTg. �L0
��]0�Ό � %=���[`U'��yk�v���+(7Y�nawT���'�� `a��dg�08'U�K�k9�,=�T�[H1������ cÍ��:/�JD��vntq��N5F�-��!g�6^y;��J�$Dj�3�B�<;���I�h�N��!0�(�Tg:y}�!*����
+�ϳSC����$Ω��"zY=�� |y�� ��pn��{;�\ ŭB_H'�ܶ�K�L�N9j���2o�\�
@p�f�|z�>
\e�)�f�7�K�v���W���g�.Mt2�ҏx��Ң��A�,���6�.����M��6}����Y9��<k�e��E�;��{
+�$��8�[����% L�S��Yg��^cEmxwD�C���
+�Ui��� �h�:
+W�eq�<�Rg��4[��5���@ORŧq���o}Ʒ����듋g���۫�Ã俿p������?�_ߥ�
�>ٽ�a{�E��]=<yCC�����p�������r���z�Nl��}���]�����\�L.
���)�������"]�R5�ڣM�
/�FpYr��"�>w%u �O
�
�>^�O�Ge�|�/�����3�I���PIe:ܥn3�M�=�
fɗ��L�Ǎ�HR�M�(iFo7�V\��l&�{��y�hRͨ�����:��ķԘo�uP�
)�3��e����I戤Js����1GS�Fr#_'�ag#�I��O�
�2|�� ���>$���}�Z�f)��
�ؗ�B߹|Q�F����7F�J�f{�$�
s��H�ʱ��G������g�(�*�<`�:<����������{�l�H�B�$����(�Q�>�>k��\��w7���d;�x�Q�l�o�:�&3&QA*�M������<�#D��fNvv����
3�rAɞ��^s�(!� ��C?��i�IP��ĉȊj�����?�
+�����
+�>Y&'Ό�U����9����
,�n���_3��kz:���a�/of�Cω��w�n 9��K�������n�N�F��=A
+j������<�#���A:ُdg��|�E�*��;;�s�Z�8
���(���5�-E�
��h���C}��?������X�^\���p�Ƿ�/wC���Y��^9n�n`��>&
����4o��i�(���G���6pj��=�HI3����0�wuvF���C��o�^
��+�4Q|i��J3Ry����k��������?\�������{�S��ŝ|
m�
�նԾ�_��O�-�b��>@ G+c2�������~��{��̒�Pwb_���?_XK�n�M1\�.J{����GI
�
��ϰ/���o��>�����W/��������_���mM�
+�zH!$�
+ �%lnj0֚|����9<mz7`�s��kL�}�د%|����S����yŔ!�����A�W���4�gi���]�t�[��4���!;�#
"2�nM�ya#�b97l���/���W|�
�h
+������-�t��
�����=����J۱F�`�`��x���v(
<��={Fn�H�`ܢJ L��^��ucN � �x�z��i$��ḻ�զ+��<TL���� d3.�d�\&����la�y���аcH�0�v�H��4kelɇIrڑ�ח9�wK
w�-� ɔփ�H'ߪqg\a���ח���ݘ�%#��i��z�
��P:�$+l*�S)��|No���w���ҾW�-���/���ɝ|���Ǻ블��el�əU��
���C�?���_
i�-,��o���
�}�D���y
h)���I�cܰ�_��
Ǔ������wG`�?-���O2��C�\�jdM��}���P̖��<��|����˫ WK�A�!�=���k������c���u�d1�\����PPoQ0�Vg��'�=�_�
���A&}5�u���-x_�1Y�!!Q�N�f��=�������w7T^HC�B�7�m��U
�cth&�C�����~A�
Dd�5
� ���m9�@^�����
�
�
v=�������B��A�q$����+��~{�0�k��5l���x^�m�����beC��7g
�Fop!��Ҷ�љ<��2P�(�<���5�\ü���[���h��;
����Lˀ��-�+��T4�X;��5��=7���)t��[
QC�t��
m6P�B2~��p���m@�n^�TP��M2Jx^�RL� o����H�
+i0��ô>𮁕�����i9r[A-
� VM뱄(E�M�
´
�T1)cͳԸ.MeE�ATJ�`m��R�
}po��7C
�J�G���_eEFIˌ�i�S��59��_�
+���VC���C"X��S`�Ӓ�-
Q�r"�LB}O�X
d��C�f��zdpÄ�> *���C�4P�ɳ�y=��Mah��e^$GA�ɲJ�,UqB[B�`���
��5��u�+)�u���w�E�V
L��e���������P{
V8�N=��Qs��+�3&:"�EJ7���.v�F�+
|(6��ҥ���
+�-�� %��Nk[�e�i)~�XOP����S�R�C�(�`�
ԑ�뀁)�K
4���!K>�i�@�Z���0�f�גѥ�MS��oA��<�����������??����ˣ���o����w��W�뛧�>�y�`�ݯ���>\
����w��j
u`��Ƒ���S���k
D&��
H�� ��
+�kO� �_��Lu .�O�>d��n��²
+���zA :c
�
�"���6 K���%g�e���
+;�,�A`��%P�L�Q�h����
~?A�p�"ܴ�3:�G�%� ;��>�0�.d
P���b ��ċ|HħRA@4�f�l����`����ͩ
��Dy�Z��h�4��C�3�`>f6FI,��` 5�!�G�V#㠚tN�6�T����T�yǛ��$WS���Y6 ���bQ1�wq6큏U�� ~?��1�����p��08��g+祇���k�/�^�=��4
��*��J�����h�"k�}
O�RܛQȫ<(��*�'��!1���נo�GI~0��kDSK'���F-��U��X�+���/l��hB
+:�u:��4ܷ�q�]�Y�O�4ag�@�X�6��
�7�tʿ
�=�9�C�{�q8��U�$�_ H�怦),�Q��f
�Zb��bW�v��F�1�Ģ 0��$ȍ��e
"$���I��B�l��0t��
+����`�wB�H���;�A
{�"���J
tU9�`/��4���F�d6S�չ�1�8T#&j4��I�<�|ι*�Mt�&�=#W��"+�����X�����jY���uY�K�c�
�% �t���e!�*f�iY�oJ��Cu��h-Y+}��&�(���rP|*
�#Ev� �����(,�c����
as�����
,j,ׇ�Rg6������L��(E��G�S
+�
B(��
�!F
�MS�#��sׅu�9%]�S�
\ �=����]bT��ds_2�T
�
Dr)��$�¶%/Wǹu�O��G�.��
}`�=�qc�m�Й8����T��r�
/[�v�K��Z
��;S�L��b
+U ��$]h�|u� !�na�T){����Vyn�ס�2��'�(�B��,�J�
��s��Z�P�=s���Ϛq�~���ݐ���-�p�s��(-��"�
N.��"�2ȷ2��ݔ�)��&���p/U��:�@�!�Zh������~s(�(gR�}J>�8ͥ_j8�$���{3w�Vh���F7ӧ0�S�͇L�g�N;��y
0���
՜ӌfS�=�Y�0����|��)��� 5-��}U'=I܂ ���fռ��K5^������- ���-^.I���*ʷ2��ݔ�E����� �V�hJ_��]�RɮR�P�D��šx��C��~]�R�y�_�a��~]i(J��e�@h����R��l�f
T��������`>�M}cf�3��>K����(�
�O4��2&�H
Ѓ���-HKd ��&KF����nO
Rp�P��ˤoy������C2ALĸ��P��S�����Y��zŃ���7q�8E���J����D�2�Pb9?���}�9hv�,����j+�����D*����x��V��#�.��p^2N$Oj�p3 �!�8�1p������]�{�>>xO� DzwuuժU����.f��U��
�|"ޔt�@;
��0 [...]
+Utx�
Ɠk(<�ڷ&�W2�����2W)�YsJ[��,}��ùIo����
���Q�����w�
��(%�U3++HE�*� m;-��ϩ��`���".L��d�l>?������l �6mq#��q#�U�b�b�0���5�K�;��b�I��l���1�u��g��E�/TiU�E�9��� �s��r2GPr�
9;=�Ƹ-v��O�ZqO]��<� �MO,����_����T�V����/kR�(5��P��.ʙ���+�
�hܡ��&����a������b7�if�b�Z������cPl�P����c��!�-p2V�T�U�"����MN���f�r�x�*A�\�yC���?G�#-cP!�j���c$��
%&j�Q&��
z
��D�+���+r_����X̒ K���b�@_� ���ir�m;g���ę��S.��H![Gl��-�}+U2Ct�ք̈
h�H6*L>Y?�Ǡ��ɒA'za,��
38H�8J�:nW�HX�A�<�$@"atx��
M3����J���ZX�#�F��ܮ���ı�oeAmF�� [...]
+X0A����=�s=�N�ͣ�H�P��6� �*�`*�K\�u ��s.=���/%�o�l�@9�tZ%�Q�
ޘ��>#��z��ӱ|����Xs)� wY�g�4M��̶��q�^& �oI��e� �9�Tm�&>Y��>{�����:�iG�ŗm$�]W��
"�=�M����xl<4$?�V�U�j��0�z.3Y���(Eqx��T����N��0�
+
��� N���'v�긫�3�5�9����VnۤW��M��_��
�Z��
��@ZCn�ϟo����x��YN�K�l9��S�0Q�]�A���r�n�Դ$�e�\�UG
��Pҍ�X��X_i��o~�����N��~��Ǜo^������O/�?��_}�������I��|����������O�����n��Ӌ����7O>ݘ���y�k�� ��
��S8�����O8���]{ZA����@J�'���n�ה�,R�i|}w���K������r��-��
�[���[yKk
�CD�嶥��7߽����w�{{����囧�BDdM�����
�?�}8=}��Żw��?���
~v�M;���݀y�0
/@
&i���%�$�_
�-��i����<�����JYj�Z��8����O��Jߣ�,������ �W��
ۃ��N�g�/d�j�#�W`�õϋ-b�5�K?�4y6<P�mU5NC�|֛�٘��l
+v8�&��UE
�_��3��"c�'���$�N���K�#wNآ{�vŇk�|8y�
����*�W�cf���hy$p�8Y�Y症�X���hy��U5 j@˂�ÅW/��M
9��\�-`2��$��y��>Wy�����V��14#��_�f�����ֳ�M����є$�W�f��L
B��a���ЀbtY�'`�a5���e
�F���5�Hgؘ(ZLp��3�cc,���m�#b Z�>�XBш��b2�'��R��ez�^����1MT
+Iⶵ�ɨ�wU�9�^c���8����V
�7vЊ(etBC<:a��
����sT\Q6j�,���pP�
��Um�:�<��:��ܡZ�,�f�l���3�8y��O,
��)TÎ�� ��-�A˷]�ȴX�]�g5w%
���'l�'��b,�
̳v�<��^SQ��
+��/Ċ�� �b�)��0nk
���h��`��`
S�Y#� {�22�T��I�RZ�������M�+T�1m���"�V��vSr�EhI?<��0�*H�r\
'�
�kU�
6��
e Wf�&i
b�M(Ѕ&{v��uU���]I��h}Q�
�*���ͧɃ��(}Y��mCI�<��LVE�� �5!�:0���
Q��#�L �����fLc/���KJ�VG'�&�Ԇ�P{4��%�� 0UW�f�YDD$#8VX�����`�+q�ԓ� ���oCTՌ�7�[qexHΰ]��d���dZ�`��H�٫�6Θ�jkS>���
�X[�T3`�������6k� �M�QB-���%6���+�ŝ��"�[��w�>�Z!8��I�0/��5 ��+v ǹ(��|5"SV]-��k���7� &���93k����Qƙ��)z|K��F�������p�B%J�+�Պ�Km�e XE�͗�i� ճVW_�����
m�a��&$�;3܊]�nl�};�*ǣ�v).�zoyᵟ���S���Y��I.����^��d�u�br�����E�h�N�UGue�
+��N&R#i�d��*���u��+�U�S��2i��*�$d��'J���
�$ZRHQ�2�
a�m��B
k�8�M�f�T�-|8���3�<�>���
��
+��Ɗ� J+Y�Mz����$�>�<fH�īO:
*n��utV\�r�h���ea��0@��2����@�ƾ�pj�gcJ�����`t��.�
�-�<��� ��WE��G+�>��8&W�LXY���)
!��67��[�/�U�dW�R'�@�����*u�m� ѫr�W߽p�#K��r�T
��h�����m*��� [<$];�mv\n#��(#�
�
+�
n
+&�>7
�*��p{?
k���E�������@��$ZY�
y6�r>��� 0q�At���WM��==�)y~y�A�����.������S�,��)�&
b��
+ځP��>�Ȗ��ȕ۳hUX��8��j��n=��r0��
\���5���3q�!�v\G81��ex�~�0��!��ֈ�<d�ƨ��pVhp��s
�ҕ�ͯ
���=��F�W�E��Y�6�W���L 6� � �A�<�V�=rc�����Ϊ,p
+FZe�Ɛ7[��q�/�~���`��1�!
�X��&�)/�p�~
�$.��!���s(�M.i�<Ez
(
�u�?f�)~H<����V$��O88���{]����$�7�v������!�
R���
�=��ڟ=�\}�t��;�>�$���#�HX����hq-N���]��+�o^�/q��X�*�V
+�9g4�6ZQ�
��
)��|�Ao��'pe��Q��u
��Q3* ���
���g�u~i����?�����Ko9|���MK�W+����+������N
>�������̹�}�nW=p
���b��ֶRj̦߳��X�2
�i`|�稲_�����!�O$
S�
�#��JB���^���:�n9��{�P�T=%�m�C
��=H�x c�����!��
��w+�i����{�5��B����8�����ظ5A�Q��$�]o��rH
����\?�o� ���
�U�S�*p�u�
��0f���p[��[a(!`��k�=�#�)dz����Q�c����/W�X
n;����p�ōyн6ش,��
��b
������6a
m1� I�N���/W�ykF���;ԉ
@�g���6fX�=�Mq
i,~�+����=��/��7^�`��{��X��, �
f��&d�㠪��)]s� ���[馌���5c�5
�{�>��q?�fԊ9i=���Yݴ-x�~�⽀ېob�N� o�Y褪AGJmX��U�ź�mC\
126��rZk���mc>��*��'i� 4���=�
&ۄ
+���/�b��9�47V!Ji+�0�P|9�hI`"c-b����pG{2�u)�
�ɴ0?�CD�n "����f�
�>�A��Y�{���� ��"Yh5Ç�4��V��@�M.�����l��FYCxO�����%ȝ�Vh��7�u��\���C
/i���~qER�����VHB���].Vn�
�
���ΙHN&?J��m� � r�a�f��(��
��ERl>T�Ǐ�߽w���K�i�� \� �k���MIZbF�)P#>c�liO��<+!�Y��՟lV9��
U-�v5Ӑ�C��z�p_~ZA,&H.���{�C<�V�#2�x�CP�]�=��0��On�60 at rN�����!U���Űzd�<r��
��~��]-^ �=�
+/�
16���s}�#��Chx���Y_S��V�]��j����E��qR�&���Lf��E4�x�oQ��k����t�ˀ
�
��:� ª���̩�F�
��{����c;z4#�����\�3����q�&Xt�_/�
ls�"����ǥ��{�5��P�u��N�Jc��q���Y75ɎfBa�JM$ %lfΨ�4\'�[���anД1n�f�����~����Ѭ�r<L��ߛ;��NҔF�_��^�},rF�g��ME� �&���l��ʿ���ሆ�� 3���'����`a����V�/l�:8�W�;�FwCn�s�s̚��^ϰ-�#���#EP�7:/x�
���,�>�T��l��Y�
�+��C ��n������(������~&3f�Aɧ>�y����I���`����ᤝ1y\�
�M�����w�J��r�������C�Y�����#� �jw|i���tZ�
��}ɒI��Y��cjP#���w�O�m�v�o'sG\!���8�lװ�erp1�J�vq�
�49x����&�ĸ<Љx���<���*���΅:���"���
+�S�/���D�RH��g��'��[Aede���p����d���5�-xi�Vi6�
�yh5@*�9gh�>N�4rm����
4��.*��
�
�>��
+�Y(�����`GR��c�䌰=<m��x�a7r+(!P�!+ߣ��
+�t+�Q`���P�u����I�Dp�b0�S����l6`��/owD���
+��B��զ�SZ{k� sd�̞s�!ƌ���e��
��~��͍��f�����0[����
C�<��P�E��Ģ�;����6!�ᄊ *�����Pu�Ƒ
�י�\�
+��E8+p\B�W�m�A�Nb�rgT�ي��~���t
+؉��� 7VPёood0��l3�[��6�/�
+::�t,g7�J�#��N�
m �٤
�=���#If���lq
� �ֱ#_}v�
�ֱnP�)-�Ո~@Ny������z���o®[�� �'_kC�g�DkN��vB^���
���j�#8;2��7h�,��KA��F�I�[�7�ꈯ�}�/PÞT����*ڹ��2A�L ��Ҩ�S�qu))����Js�LSX�/h%e��h�+�
+TrU C"�� ��&KI�1�毯�+��������q!T�R�M���
[>k*�/s�GO������P�Q�w��H{�O'��l�n �E���5*���~[�$�~om��h�i��U���*���%��%H 3[�bG`�D�
�� ����鮞��B�ܠ4��,ݵ��Ȉ^�>���&�d�(�9n9�G�r�'�F>)a��
��g�S˪������[X��Bh��}1]��{x�S~E������;�p�R� �8aQ���bm% ���[�����02DnZ1W
=W�z�{Nh�
,f��V]l��֙����!��z
��ZO�mxθ�ш�c�e���]��c��
+��t�%7J��`E�*�n�`f�M���(�ط[�|i�1i<�'>jR]�}+�>S��2@�3�Lg��
?��E�(LK�;��5�q ����m
(௰�[��g��*�\
���G���ǽ
V2a6�\X5��~9*��u<0�&jrp���1����u x��8x��KxXbj)[B9�Hg��%>j���_��
G������Dd�V��\�_�V�$�)����6��6��m�F��n>D��7祦��
+�6(�Of- &��O�e
�Z0ޤ3 >h-w�U
*�҃���{D8��<~�
++#4m�@Y����� "캆��T�b�յ%b�����_�{��N�.�Ѽ����:!����\�����:�Xk�
֘�ff�+��$"B�KT�
m���H�튨�
+�W9{�
�,����
̅C��<*(u��Ek`��Q�����꙼ �n6�4� ��8�rm��
�w��h�z��+��u��
9&#�
W����!
/G,
a�[�̡;��Y��1g�C��g��DT=���P{��)|�,:�l�R��f4BŌ����zM��uq�
:N-yN>�T�<�3����w������h�\j�l㠒��Z4*�w��O�ƶZ0
+��2�/-N�
W�0���Z/R&��CZ�n
K�Yi�S<�d)�+鲖�I�1�)�����I���>��Z�s�A��`HV����MږJ<�Z�6��I51cX,�G
a2��;�l!���d�C����
�j��� ���
��e��<��q���������<3;�
���H�ik�9�2�\C���hAf��Fk�� �-�,�Ȯ�����w��'��gZF!�1xg��c��E�Ώ;G�X�<ͷ�į���gn��B#;a�Y�S��(�k����xh���`bW�{��� �%�7�r&ɮ·��t
+WiS
����P�;��
��
��5lmc�+���P@���
6a�V�l����c6s�Q�L��-F@���=�
��
[Uј!��e
+á��}�L�w���>���v k^Ȩ�F�/���|��G�
l��#��L�9�鴎�//l`k�+�\���G���
���� 9=!t@#����˚|/�v��˲�F�2�Ҝf�Pl
l��Pwu�Q����G^�v�������(0
+�/�%���JPj��Z�Hh��In:�p���δ:���>��'��=C�S��W:�[�t\#b��D^���Ku+�lk?xX��ԧ��2��[t���H�CL��j���h��L"]Q!w!}���˗�s�k�{k�3��~b ��HUR���YW!����
�eGm���5�3�F-n�NY���|��74�yP@�P83+�S��f�|�C��5�L-
+#�xa���#; Q=�;��Wi�W
a��t���<�
�&LӺI�6��Z�X�ao�U��9ئm�1�xV��=H��;y���Il�a{t�,
��
+G���k)���&b�Yv�&���Js.FŢ���#����65Y�4C'� �d�[�@�LY�[z������j8R�_�\h_�tt�-�^Q�:��]��x�c �ɔ�2G�R� �6�
泐"�#"��(�U��b��ד�o_�������>�����O����䇧o����\Y~��ϟ������ׯ�����������~ԥ���m��mQ���$�Z��a�HaE��ÖP
]� b��
s������H�x�$d��9Tk�����N7�\XAB�E�=T��)���=��G��N���rCn�d}�.��!���p��7�DUwo�j�F����� *_�5
endstream
endobj
15 0 obj
16418
endobj
16 0 obj
<< /Filter [ /FlateDecode ] /Length 17 0 R >>
stream
+H��W]�
�
}7���
��RU�>�'{����6$1�`̬�q`f�cc���$U����,
c�=SW%
IG�/?|�������{����WO��y�
�������ş?~x����ի�77�n����[9�|��
����z�Mm\O�Q]�t*9����bT�ro�Y�r꽐��i�;;��y��͋��i�S�yܜO��9Z�S7�f�|v��ZgJu0���0��Xl����r�$��� ���<Q0S���I>Qcv
�*�m�z�å�Z!;�*����M�M �@ž���VpK�f7�Y�o��fK��.g;�3�b�Z�E!��x(I�V��xʵ�TIA:���YK
��5��t*�'��L��sOٰ�ى��L�L��@��k7"b�(�T
y>�fc��BJ� ��-ה�0[�a��n�e
����Yn��p
+-mh���ݔ9�}8�:��X���N��a���G�
�����H0��j,��)Kk�T�O��~
+��a�H�����7��z�J��W�
+jr��l�Q� �̷@^8��{��ɥ�C�<��+���fg�
��7X*C��V,�
�R
��
+���u}&-1�U/W2�r�}S��3��+D'���1:��QI�X��UZE�.�%��*�a߇X�۪�*ih%mڪ����H��Zjh����m�5]H�
+���
Ed��@�Sth�i`%�R�K�\e��5n
�T�Uʢ��&x q&8$�g�i��VOII�
�XDBaN
������7YW�f�t�w`�mUf�U�
+Y�lV�M��4�7�ck�b�\��YCX��db� �n��(1��L��{��>h��f�h:�T�F�z8��:=
�1L�0�i��!�
7 uqv4�0�,�l&Ffu���������}�٦ā�ˮ� �yz��\�]'���o2,n
/&���y�O䃾���
��VM
�X�� 1��a���\i9d_v�a�ƹ;��2���l��ޝPe^����5�3M�}�m(�rDt50�/=�9�~0�)
���`�0
-U�֩+�b�_��*W�c�˸�fgG{ۚg��qv�8̭��ڹ�hglj|
��I�S`s�vM���˅L�Y\�
M�K�Օu�U��Ց�յZ�o�С��qj �ԧ�H���"j���9�T��q}rA[����6IC��/�S�MŘaC�Rs=������j\�
N�=�(�Տ�8W��(H�����@T�o�k���)E��
u
+����(8Xlk�+�Z���iK�(]��ׇ�Xs�T�x} s�cU[��)u�a����T��
eVj3���%zU�a�w�1�L��+q��=y�͒���ƾ�O���L��Z��%��ae� �8qsHv���J�յ��DWp9�l,�
+�1�eۮ�L�?�eb8�`�8 K
=�M�
��1Шm
����5C��U_�=_^�M~}����o�{�������?��p�c��z�������?���ا%>�z������'��hy��DK�^�(�~����`�\>/y������+���kF+!�
�v,y�Wt���
��/�]}�u���3��qɐTy��/�'�v��tN6
��o��D�A������Ҽ�9�J
ǧ��P)���:R
_�UW״,����Y�x$T��_뚵`&�VF��!L�"W�?C�o��:0v��iEbty�S�
Ǝ�b���\�9�z��ܳ
�(ފ#�n�Y���H��6ޝ�l��=�7��@
`>�#��>R���*�ֳdWYQf�}l�x���\�,�)j��{�7�٧�̒�0�(Xd��c�dU�"�I�
+ƾ}�Ȅx`]��J
�Ǫ��U!�k�3���
pl��>�RJ�<�"7+ �Xņý<��2i/���\�o�ښ?pR�qD���
��2RԽ���uN�m���+(�
{��v�pR�g��n���>�,
ثJ�Tʫ
{آE�K
+0��2cM���T+���y�iW���v��<�n���oX��d<��ݓ�-1�l�Aq+����ˇ�Y��OG)�6SpP�G5�/xk�]jf#��x��H���K�r0r�K¦����G�H�f�y�L!
Z��+8�� I��tΣ|��\���Y�
�x
+�����#Eƿ>��v[�Rw���aDv8�}�� ֡Zӎ����ֆ��c��W���
+�Ґ���%',���<ĉ�9�9��¡�������"5g7|��Ì�+?O�n~��O!�iS'[�
N\�Ɗ
�R
+� ��'�l�(W's�;5�֭AKBU
q��+�}�
+lŃr�:�Z�
+4+�t_-�q�~�d��rJ����}�
�n�٩i8L�Q��r��%���r���#�:T�/QlY}1�J�'�Xϱ
�'�,����I�Y5d�!��kԮl�"GY�U���YU#Y��e���FJ�����H��n eF������0�-9�?�ߣN�{|��B�C�i�ƒ� �T�Us�K�mx�5Κj̕R�c�����7
�1�=����
�E�
�8^a;�v��6BW�+�ya�&�c[�.��G�On vx���L��/�l�:�ڱ�a̅������/�C,�)�
�m6�Vl��Ws�p���e�e�V�2S"�zw�����['����v�+1uu[��](�/�����yQ�aR���앇�.<j��� �6UCcK�+�#�
+��m\a����˨��2�8���ZO����{�}��Wɪd��7�?����<r
�R�My� � �1-�T/d5��Cf�{3�YzE��^���1�8q�-�1V�G���y�Ø]
�n���L��h�
m|�1�6�Ф��b�iL���s�������>oR�.��-�.��X~|�i����<��S�C����;ߔ�?��n$8 �Xe{f�X2u�z��T#�k��| F`�;Φ|>dMu�}�/�Aaq�
+evY
+�_�
�P@��c�3��(�$_&^
l�}~�)��� �5���%N
)Euz���eⰱA�h���Ś�p��~(m��f!���p�4�ǹnN��1Է0�.,�&�Q)l�n�d��mS��rG��_Aǝ���A#dY�6H��ʚ퓴*�ؚp�Z��6�%�ʬ
�%qYT"ꔴW2�6�ZT�p�H��:�[�b,���{�FDdo/�V,�2I�C,�h��Sj&I[�c�
���zФW�0�%9Hi�W'[^���cHB��ꘛ\W<n�"��
q�ɪ)��k�ٗ1`���ZZao�ǃV2��lO��8��ao��a��
+�HXa�pZ���U.���
+�$�/F'mm����B�6e[��,�Z��2Ioߟ��f���!C�tb��RoR���RBtqss!�I�4��VbT
����Ņ8��Wc�� 3z��_�`+�{�
�]����T'YL-�X����\U)U���Z�Z��|$
�V�ۭV�:�KՋ=�LAm9v5FQ�57
+H�/�Ȅ�8��a���{i�5��hI*���hV��9���
5����(b���,�ŝrrE��3�GY���J��܌�)�$"�Zj9��yJ8�:�`/�Mv���E�ڳ�>$*0�f](�Ĝ�cΛ% �SRs�AϦ�G�OYmt�F�\�'�O�/h/��l9��d�wI�8�8'7�G�THz��D�ʺs@�(���'Կ
+�<�F���O�!i��p\�a\���
s�_��C�7c��a@�P�����m�w#-V$�.�Y¥�:�H��Uy! T��PY�~��ZI.������
+��_���
�m�g鉂��j���q��B���Pj˼���b
N�[g�et��a��n5��c��b��G�b���KEt�.}�����6����O�����oN�>���+$^�4�x�Ҫ�,c$
�u�C/�g�f���b����P�z�a�7��ܓ�B��b��p0FU�աnF.o at 2�����SjP
+ʗ3 ��YUc
+r�6�2��)�S%��]��P��'ٵ�#�!����,�d�Ec��]'ܒ�7�S��s�n%
��S����NhC���w��MT+��B�
�"��1U��۔�u�ש��Ȫ�h7�a
��#����B� g���QID� &/�i-_�+�
�F��a��
Y5`�%iR
�WcQ@�Ny��ke>�8�t��� 6� �X�#AV�\������b��P�4�j_�C�ό�(�&�L��z
�:5�`�k
��[�=}��f�f��1V{�i?��v�r|ljې")1o��](I���Jȉ-��ه���:�[�jAz��偿קv
L{ϳS�6 �6v���ypu!�q�� [�R�$�)��K��&`�)9�7�1����˺��5:�I8V����3
+�Q�W�c�5\�|_⼌�X���+���o
{ "�;u�aT
b��1jC�c㍅�l�ϊ�Ҟ<�W�[�vm�D�-�dC�u_D� ^ЏE`�#���tW1й*~���M')��C��~V}y�6���!��C�3��g�����hi��o��w�
$�e�ag����
�D��ׇF�n]�����O��5WZW��^����ϥ��f���A�[���>_�h����}�%��
�/c2P����\�M���v �偿�7�<�Q�B��B>{�i��M�N�}K
L����Xg4xS�Z�{�i�7��?�KH��s�S!�E#8�u$���{�]���b��ƺ��#1B 0���GD�2-�$�� �DS�A�X����u��_+�=�?�1Ĕ��I���XFe��͵2VIl��:�2t\ I�\%�Ò��՞s���(v׀q���}]qĉ��ו&lJZ�d
��l�
v6��� ���f��<J�.ճ!qa��vV@%:�HY��^7\�l�B/}-Az�jߕ@oK@$YV1���zH����+����ÏP,9,�
�aOM�zvI��rb��j�Qm�t�(7Ls?ڀ�z�j�fN�z���0b��#���x�*u�"���-��8�9|0O�M
�s��1&
+=��z
�E�I��s�7Q�0�"�[&�7�c�9&��G> �����8E�D�g1�h��R||b�o�
+"�.���P��N�M�,��L�v�k���HG�B��Y�
u�H���K�Q�*]hB��zu>�_I�!����=�^��$j����:,h���RT�j��� ���²�\縉��+��2���I�,N5�4�P���uAxY{�
\��&�Ȼ���2y�
���}�Z)��#�e��d�����
'Xz4�-� �#��9����gh)�YO��#Avߙy6+��-�g��#F5��Q?�}�(
J�!��
�~�a~GG�����
�d:J��WRH�n ?��g%�2�,A��^5�c��c��돼�%�Ð�:���T�"�/�ڼS��2"]N���إ۩�@��
UL��-���v�/�
+,p}У,�Xa��9�<���l`ɂ�*��Ae��n�d��(� 0���GJ}ƗR�Φg�g� �2 E0�8Q,%�:�!
���8
+�N�Tn&�;}wD�
�=� %��ލHKS���9��� ��+��hA��4�)�x���<�Z�7�u�� Y�9��P]#|��=y����cy��6�����kb��fZd�GV�]=��$X��6Rk���Z
�]l�]ǽFu
��,��K
�kJ�Է�I�)�p�����8������o��]��o?}�Տ����?���������
[�����������?���s_���?��}>�3 ��>�����O����s:����_��;���#v��>�P��=oL ����a�|��D
��
��5��� �O��A� �XF��?֫������?�M ٘�~,g�,:$
!�M
�M��{�O�J:����J�uϧ#�H�R+��j�ፏ\�`�/g�Ί{?~��G/d��Ƽ�/�=n����&
�!��f����h�/g
��I���ѭ/lǥ��K��?���٦p�|l��3&Kl[��r�W�1J����M�+�}�v9��4
ߵ��� �m_c� [...]
+j �����|���d�|�˗���۾�,<:2�R��Uf+�Ӏ�¬Z�* >.�T��G��t�A�}���D�
��|Q]&�5��������Iv�
+!�꛶r��ؖ�yצ�����/U���C�>пSQ�і� ���>/��JCuflIv|�tZ
j�y1�p�D�&�Ժ_�Y���tz7Z
�
2ד��5�C�j�!c�3�A7L%� =Vz�����F����m�%
�<ʐ_�HX"�x
�
l�PKܤ��9��t�f�ϖ�(�@/|���|�X�tfc�mi�x��f��D�+� ( �Rd�+��;�� � �ۣm�� dP��nkg��/K]����n^
�_�O�f
OS݁�~�z��2p��$ʌ��-1Å]��h!�
+�.
�W�b�I9U�Üg��9s՛�"y�˶�JGӀ�sN�;��� .��Ne �u��J�m
:���rD��r
萒�b��2��$�f0����:�
�R�-s�i��Qq#�&�Vԯ��2jw.���w��<)|��tz�HJY�a����&
��Ýq�'�U�M����yS�
�*;�O��b��T
�����|��O2�&'!����^CF��W�Y�����%Co��)�{�࣏(��e<R�7�S��y��N5
ñ7,P�gыV��Gc�(Y�����>��tz�CW拉�mGm���90$r�"42b��~�<z��r:��s�4B
��T���x�iq�/���d�5o<s/���FV��N*�=���E���`�q�(�[^���r�;�d�*d��^��+
C
gKM�:
.�7�DA��U�W2�ڂ��vƞ护�b�N��u�ڂ�n3�4�ς�ɡ
㥗bi@��C&$\��W at 2iT�X�,6���%@N0���Ŭ�&��=,� �bH1�03k��.�j�W2�g�饌(?��
��2��
�eM���IK��ڂu3/� dڶ�c��]ժ��˶<u0�u
Tq��
;��E.�-�
��b['i��w
�<�<�f�w��y���
��2��%��H� s~��
�������T> �l�FgZ���YI�e��+[Ew�!�|
+[���� !�c�U 34�a�L��w��naQ at -EP�nC�%[<2��z���
.�� �Pw������!�
+�$�YA�;V�R����g\g��I�z
c�y"($�U+n*64q
��U.~�^���T�
�l�c:tFl���9�rX�=�F� ��98�A#�u���?eC)���
`?T
�d�����a>�2IU��TmM�[�b�~Bֺ��'G�}?AW�SE�N�c���:da��0��
7���Ӄ����)�jX#�
�b/r��$^
+�#�tbJ���
+.x�&G�,9it�:�b7n�'y�m,<�z0=ʥ',��?��/��1��3l�Y���:������2
���+�f�O��Oѹ�c�,+1D�تZX�K���M"x�F�3�ߌ#�}a~ ?�/!$.��@�a��|�<K!P���t?
/��� ��
�'1ޭ��7�|ޯ����B
�����ƃ��m����ɇg���[�?����߭�����?}��?����?��x���?|��?������ݧ�/9���;(���
+��^��/��{���
���_.���_��.�q����N<'4���a�G��x�J#��|
���x'o�H���q��}D�*�xSǞ��QdX.�O
�Y<�!�
�N�w�a���>��$ ù
�k�5A�6�
��|���j\��!�A��u������.�z%1�ֽ1�e���_¡H��K
r�p���nf����
���}X !8��(��
`Ia��V!n�ܪQ�n9#F^y5��4d���/�Ɉm���� :���
�dS���9�ީ�
�x:��V G�o
���
�p��5�s�4|�
�玳}6�P��&���{�%�'aӇ���>7�!�������Ѭ�OX�V��R|��+)<U=���_�E�
mB��ї��C�Mux�o�f������8���2��04W��:����6�a�j�Mi6e$:�
ӱc87���Dҟda���i�)0ae���w��C�9�y�ٟ���L��bښ��nn��M�0�h�SPk��� b���&�erg��՚0��0��}�
J����(�(�F���s��r�}ԟϻ��p5z
d�6zPS�8��a8/�
7ڍ��>Ih�b�e��,oѥ��|�Z\���h���1����Z��:�?�Jt����5(e��6x��~z/W+�M[�/�5���x���5�h��Z4�5)�մ")#m�ޞ���S��S<��x���|NFS�iݦpC��X�
�����Xv_Y�T7d�u�6�_Wzv,*�ڲ
+�%���2����� ʦ�P ��G��4]�K6�T���Û,/pv1-:�-�F�y1�2�WG�}�0��X~��菖��{8T����V��Go}(*a��ޮ|��s"��뻕s3{y0�����
X������N2u� 'CsQ��vdx
Ԅ�;H��S���n <]o����]=�N�.���B����c��Z�ٮ�$=vv����m�׳�[d��o�0���Y�*Q���$�N�L!e!g䧎�y���pKWԼ�Z�3�Gqa_6#�����mu5�#
+ xNͣGn+�A���-�6*Șq3�QC��ëm�aD���<�����+�7+�I�ƿ��Wft%�
'� 1��5T����$�;%esG��3�ۈ[2�=�HVh]���I��m�J�$Ya�e�
s�tѻ��)�5
�.���U���Y].9n_1����r�0��n��m��b���
~���uY 8|���ٸ�
z,
1��m<�#�%�0�
�|�0����N;,
��
� z��v#��
� �*�&9��F��B�]+b�ג3�/ҳ�5I�#pAm
ֱݯ���NRI���]�ȗ��I�� ��*1e�^|ͣI$ � Ո�k��`�+A�ƽ����
s�����0��9Z� �2� vj�掚�T��������s�w�GFX譐�~��i(-H�f�� n=9�͍�`
���D�e�"w���ο����w����4/N��&��fI�<����k�j ���d-%t�v�E����Y���wt��P�m��M���k�͋���'������?�xK@���amp?�%?�����Tv�d�~Mfݮ|D���37��
��Ne�<�;���2¡/�������0���A來{����R��n��l�%I�^<��N#�V���A��
�0� a:rl]p7q՜�
+�c9/?ޡ�����5���x�Ѯ8 ǟZ�0Z34
+-��E�\
�`����Lt"{y��%P�:z�Xj�T�$֢�h��g����C�" �e� ��WC���� z�l�$ET�M
L�ȴ���
+����:��w�/~��i�[mk.�裰i���f�ìsE��H:��W^(U�/�m<m������A�����`
+���0 O �*�=s.�,�<ؚ��ü~�c߹Qm$x-�oEx��z�xh�7�1�J�>��r�������
0�
�s���!��I.���ݨ�p��n� �81��e�Q
��+B��Xk�b�z�e~�CU2t�c��d��"��XxEi��x� +�
+Z�M���ܚ�]��4�e�Z��L�.R�Գ��1�8�
��m�o��7�0���YK��n:���W'hlK)o=��>�����0��ӶC'-�r�т���k$�)+f.���U-_��q��q�v��U>�\
��� �H��:h�a��������
�����cK�ϯ�e�α�
\����e}f���X���c�o&��+� �и~�� [���E=M���T����[м��-��-jf
VcӶ�f�-h>��� ��xXGO3ۃ�#�a<�[8�?��b`<@H��=;�
Nrw��ӄtpY���H�Hl`#��"X����B2!��b�1��z���m�ne\��^� 0OB�w �M���>�%�(�"g
>�����T�"=D���4�5h�HtV{�5=�
6{&�
��=��6���o����{E
t{�L���,g�R�l]�>|�>˃t���5%ȗ�����g�m����@��η� �
�o
u�`�����l������D���=��j���
=��G�=I�������8Ըl�[�Yui�I_g��u�Ea2*��'�� NF��~����U�b~�Xrі�$�:�{
+�SV��ѧ���9�"Y��S�קeO}�b���
�7���Q/�6�~������������=
���x
.���
LH�ۈ��9��e���n�W�ZT!h��Nמ�=��Wgހ�%��n\��X��_wp��/~K���蟴Z>���{K�2�'�[_,m����ᑚއ%y��+�f�t�bd&���
?�NJ�8��m�*Y�6J���R�s��~*����+� b:�K��y�4|��
���v0�Y��̰�4?�����9�� ]���^)���?����(����
�b^�}�Z�J���mb)�?>W����ڔ��]
x
��"�Nܧ�Q�
�B���1�m�������<<�`��f��:���Z4�O¹� <�(MmĮ+�ٯ�h6�][#[;�������kYC��q[��gF
�.z)
G�Hٌ�n�w������[ʗ��JMS��ekD�%�榖��_�dҲE?^^�j�S�g�W���?_l'�; j,.XU�z<.f���N
7|'"���R��l[T��5IOq3*�ۧu�B]~iu��Wb4�pOo�Q �y6��J��'1�
K��h'݂�_q�
�
p�?�^!/�.%ܟ� [...]
+^H#��ӑM��˅�~���Y�
�us�$6ѹO 꿯s3ȇ5q�o�P��}ϼF�r
����$A(ֽ�
R��
��5o�� ��� G=A.c=����<!�eL�{da"�!�*��th ����*�����X�
+��=���ۚ�����om0l;|��
�f��>O&��'�
+��a�m𰙰8cw+
+�7�(�+��"���8�c�����|o�����;�X����P�øO���
2]�-[E߾H�����Œ���
`%�4)_���|�#����[��ү{�K{��x�;�ڼsz`��`�q�
������|>�rm�s��?��}О@�R�5J�_��-�Ow������0� ���v���;ؙȂ3ee
��L�γ�ٷr�L��I.%p�؎<�o�0��l�p�a�%xZ*��~e75��a.ɩ:{Vv��Mg�,l^g��~p�&���=�knY ���]��r�8�*�
+� Җ[hwB���v�H��_�C��B�qs)�p���º R-lLM�rY`���� ��t
��\6��>Fp�@dJ&�[��۲����-�tz���7��=��=
0�b�P
3��m����Wô��M̲���QVb�lP ���oO��cp��>��f�W;+a��: T��54ܻ6�
s'v���
�㝸娻2�r��\V)@<է���]��%l��w��
��~bac�JI����>v�^��C�Q,�S ����n�9ǭ�昮��Xp8��
#��������~S��g����i=�_����i�
po+�s�`[ɥ�#V� wl>J0/��z�%<�
ɋY+�C�#� ��2�=
Er�g4/��vF6n�f�,��7����h��4��oRAfW�r��_O�Ƙ��}�g\��*WW�����/�����;�BW��#���0.i��>���͂�t��b�;Y��
��X�M[���
�^+0l�
6�}��Yx�(����`��>~\B)����c<�������#�J�K���$5
�Y���q�
1*�ۀ�Rљ�K�be����M�9�������b���Ńvڜ���bR{<���o��6�u��"
[鎙�Sǐ���v
�'� ��++w�Ǩ�/�7��w���?�����~�'j= |�En��^�gl��9��?������ouH!?�A;�{�Ю� �G!Lb�Ct��d]�
�J�
X���o��XFH���0��<���[�G��e
Kq��ÃoXQ�i�Nd����5
J�`o���xv�!�_ϛ69���[�E
n��K �X �\]���
��P���
���6A$�
������ඉC�T(z�A��p� 4�iv i���
wlA�.�
�d�5{�aЃ���Px�\D 8�c�.�Ĺ������]�����
!�^+
Wy�s
Lq���"u��M�l�5�BaY~�u
��-X\O�$�
+1� w3�̜eR|z�q���NM����i���Ot�E�����;�8�
"$8���o�;�r.m\��
wld�hW,�e��Ti�t8U����E%��':��}>�D��vXc�,�{��H쾐��|�7}��g�2OQ���~|�r��N�Z���C��0�N֯�A��_��z�
py�y
f
t�7zN��Ј:x�9�pe���ZQ< �
k1�eS���!v�����fTi��Wph�
�'p�*�>��
�Gۓ���[�����!\���u�_ΰ,(�|�uG�'�%LU��*�� ㎿�
� ?�4P�5�-����� ��<�g�I�ٗK�1��s��:8f�H��6��q��2�AZ.=���"6w�C�e
�N���
+<p/nO��.
,5��8n~�9����(���
�+���!�#����Ǐ
+���yw�����<a���Jx�4���F��Ot�_[�x=�딈�
+�"M.��Dr'����ɴ�QĮ��%���A�$p���
v�{���{��I��Œ��
5��a����
����0+;�
��&��#@MǴO_�,=�����D/gt;To��_@`�ӝu�rn�k�
�'?�[�|�A���ئۅ��q�[��?�����'D�dt�]��1���й�s��s���qG�#�m�O��#a�x�H-~����
�4P�HH{Q�
���#a_|��]ޮ�Dտ�Y�}0�%� l�bn�6}:�<Y�� J�g��P��)��N�.Kx�˥�A�������T4u+�ߋ�,~�.<����ؒ+БY����H|C�
��E)0�d�[�\o�\ua
w꿗F��=�t�:�
+#�^���⡦A�Ou����j�bb �+
�7&w~:�n�p�z��9l���.F N
,�d�<m������eqH�����(�-=��2�W~�
��y��y&x��{58o��d�6h��䳇���0#%�8�(��m�=�4�QYIO��G���j'�FjW��Jb���Ask���qt�~?�Y���:@�
����^A)��]z�2J-4��Ca?�q
+�����8:M]�u� �n;q
���o�[
�w��_s�=���r�d��WEP V�=Zܕ�1�AIaܥ�5��4�6�SѴ��Y�x����An#��c`$�h�l;�ն>�o:�}Dȕ�R#�]
�CSV�
�"������-ҽixR��d~�
�
��ڠ��'q��mS��}�ۊAu<
p/'�1��x������a���
+^
L듄o4] GKɀY>��'g��(��]é\&. ,�$ �h�d���D~��1X�t�F������p"<����ʥ�=����h�7�Q\��wX`�`�kx�(�%��)���C�y*��X�ar��lz
e5�W�}lj=�զqY=��
~?�1wу��9�-�8���4#�t���߭#����f����[k:ݎ��������I���s�-kW������G����?��q��颳���0��MM0{
���ӻ�
�{%�Z����CB�V�u�MB��p�}~)+�Ѩ~
���B����8���n�P�=����+ mKXji9o�
�`�ty��s��82�IA(X~u
�)���a.���(�ͧ���d.��q)shIjO���9&,]N��Q9�u����l
o��Ҥ�I����ߖ%�G��I)���Ci�o�稿Կo��P�9��lT����{���n� ��%]�m����GS&w4H���\�c����/���b�qD���&`oDwW?�����
A��%����}N��{�
I��_uթ�S�)hcF�G�c�D�y�n������(*Փ!��T�C�B�[zm
+"�Z�i
�=� e\e0�6N��}�n`ԗƠ�>�*͵'���5�
���l����̔��좔U'�'Ӏl�z���Ɯ�f����`��
y�RPF�ƅv]c!d�o�w�
֜�5u~�5a
+
v��Ӓ � ��Mp
Zs
��%��ъ�4*>�M�*Q�!�����Ǽ�~���� /�:L�f�n�ڶ0�v�ed]
p��B�E�M��56�)z�66��%�.b���Z�
p��@*FaI���
���J��814��aXf{��
7+�dj���
��pza�A��d�v�� 9u�8L�2���
��e0�8�V�LfX�?�����CL�#Ԭ 2�M߰�U� ��� <����3Z��@�zI;~:?�/�7��-�[�&XN��^�6��PYÕ�v��4�}�w��j9��ƫ��g�xcif{`gt_Od8�}�S!Hשw��`� x���]�7���b���ec$L=8�7N/jR/ �&p>t�ď�̗`�1�|y���YXĸ-$����{����
+F��t8��G�'���
+#�N�.��Ⱦ�ti�[�EF��1F;
ZL��x!gN;�WETt(MrE��W��c�ݤ�OO%t���S�,"�c�[���L��Fr��w�:��°�U�� �FQ��;�N���y$��J;�hg��
�A<�����@��Լ�5;�d�����8�\4�,Z��z��e-M�Aqo����<�f�f9�4��μϦd������-�Y��an�A���T�
�*C5�)���`�n5��҅]ѶQm�QM����*a��ī����݀�e>(>���q&������ݖ
��r���:r9T�]P���2�C$�e�����i��g�'�-}b��_���|�0͘�[BK�����������
f����b�*��|��
��دʆW��bi��������:��m
����N�u�ke�p�lN��XYI���S);�
+��s돪�
��F~��K��V�eJ�� ���ݱ���2��4;le��F
2�����w~u�tZ�ko��H
:��FJ^�K@"�IC��{rr2��;��]c����˖P�خJ��%]�\<J�� ]�UK�6/��t�Lˣ������ur�a�nl��|2��jW�6�;
�
LM'
��6�N��dլ?D�����
I��
�d��?���o�^��9��
+�Ef§���=�cw�ɎߐƔr
���; ��tpP���٫�%�#�A,N��l�fh�
3*R{��˦�h��K�c3t$������ D�\�r�+
i���
��L��w����h�C�U;��y����o�i�����6��0w+<лsb60G�:�vF*b��6���u�L�G�o�U��� ��bP��0.�:���Җ�ь����q���ۇ�<?�7ؼ����'����Sݎ�N��������������?����$跟>�������/�>�b��-�}����\�~���د�|���
��8��ψ�K��bc��M�
R�� J诼�ܷ�~���~����,���^���� ��WIq����sx�n�`u�cV��t
+��~�V�x7��oCP��=Bf
�6�2�
/�OT� $���]��3$?
eܙ
h>s-!1H^�J�c���;�Ϣ�BB�ժV;&{��A��/����=`z��e��>q���B5��̟���A�S'�
5^�P<Ӽ;��,����N^�8�]H����Z܇F���^$g��G_�Dz�Τ�:�y�8��\��
S�{������ާ�₷j|c� ��V1T��6p�]���aP���`�]9̇:�
!���}�|����\��Q�,
jYz�-�!��kj-H̱�nɽ����3�hDX��3��0�
r]L)�m��{�U0<�n��
|u�d�
#9��V��
+�[��m�����Rl��q�.8��T�K٬
�Q5.KwY��Yb���=8g�UZ
�R%w�x
�«
+@
����At��X�jE�x%�EP�&=<���F��D�c0pA,�N�!�ct���0*�~�F7,�&Ox�+��=��2Z�ܲ6��̹b��\�m5z�ɒ��Lq
++�P�)(�Ъ`�h��wm��kE�6���~��iM�il�l�4���Q!)�l��[o��hGOA|��cz��UM��gUi�x�&��"�JŒ�G�j�*�wtr���9o��'����p{7BK'�k~��X�l�^��N%�S��h��
+�����5胴;?ei��>�RVɥj����?��b�{����㗕�>]�-
��_�ܴo��xc�
-�Q�i
�z� ��)~g������zC�F/��X�iW�'Z��]rx%{�������e
+#T'pJ���)רQQ|7r��5�SN��
���<��Yr9�Fiբ�Y<sO;�5YY0�J��t-s���
g
M}�o�{h��fRdd^
+�S� �"C���
[�B�'�
|u�����0�K�d,��>���_}�dh[��\��Q���iYx������
��b�CZE_8�S��֪*2ѱ"Xl�mS�D�QC��0�&
��#��7p&,�RN�Y�
7�h
.���"u�q�X 5�`5�
�
+¥v��Ͳ�
U�t�E~��BU_(��]�J�"-�R�����nI1�Ω�e���Ȭ
+O���9�{U?�nr����w�F�D�����z:
q�YHב�Ņ�0^�ȑ�0�*{�-��Ǔ:~Uo<�O�S�[l�f.�G"A��E���6/�R�i�n�O*�K3���Ry�B���D#╄�Pl�~��`�Ԃ3W1����a�k��Rp v_�Xz�@`ߓtp�3���2K������ ���[��{�tP�˶��J������U)��ɞtD�=Q
�2�c�h�α�s�T�h��M�
�Ϗq v�۱O,�%�j��2ט=XEe���|���]g����f���Y�;4�Y��!{YKТI���b ڲ�M�����'�Rx����ՋE'�P��1=�q!H��T)ޖ9xi�j]
�2
�29�֜���{e��S�!O!�7�wh�S{L�,p���1%͎؆��ƾ�u���ͩM��u��o.�� ���g2����F�-ъ�]ly�X�0%K��掎��X4�Z�o
DC�JU
{�8�C
k~h�$噾�惰�T���
x
+=�ߩ�*�
8����JJ��s{��!�dG�F#3Z���gT,�¬.�N�-.�N�J�z_���DS���Gҗ����y�897+"��Gvw�B�D���3���Y�/�Uc�a��z�LX�D
�
��o�k
�E���l��\`�u!|�v��P��}49U�Pܖ�e��h�� %+.n�g�R����b���U����m�q�0�S�������t��9E�+���Q�ٿw]N�BR
+��c��x
�'q��Q��U�� ��d�3د��|I�}u&�*#�Q)Mi��ѹ;�C��(�lo�[��}����#`�{����]��ŭ�R��1ޕ���}�@(�@W�o�����"��べ���;�㫐 �O��U��/5��Y�$K%�6�K���*�N�3���,+�
+�f�)kj0l�r&e�.���:��#�Q��`v�}LU��E�
�"��)��Q���������!
+t�6�F&�5��k�Y$�ݮ�U����x����1"����ø��qX��rA�/C=���Уl:��D�j�}�Z��
X���|qi7�[���
+�>
lM9ō
�(���$��k�U�>���s�2�1��z�튛�Ý��4^�3 i�gf����f�1�]A�봟w9
����@�ې��B���B��֪�;�4�bi�c<(;]��#��H��7�M�����3 5
�팮���_�"�u
g��M_hsJҮG�e
+bfDzvGf����p+◫ �x,���'�
h���i�O�6�yȎ|$`�#������^t�w�*�qgY�x�$
�E��@g�2_dr�,K
+=g
c{q�R05��R�Ʌ�QL��R�*��ǫ��a���\�
�
k���HJ����:
�I�ۃ
8|`�V����
�5���A�
�WRC� �8�r�A�0�w�}p�IFRI�O�K����&LQY�d4�Ke+JQ�@ �P�`]�aӏA��<��j��!
R��;u*,������� א�
+��Cq�� ?��*�M�-�d8̥���l�VC۞�-��7�T�8��L3c�^��ь4��〱Ɠaia�P�
+/Ւ>
{�G 2�
}�%S�ع�Z��f;Â�(i���~yd�Ʉ���3���p��T ��)o�KX�Tה��z���h���}B��G�6���oj��O`&��u���a���V�~�i)HS�5���(��� �����}��MnZ��-�' �z����2�g�o�#>�=�
�Ӣ_�^�3T�b��!�N��ӥ��x&
,
{ugs��:�ˏ��+����4�8�Hυ|L�����������n��$.��q��
|��ϑ�`�C��G���{����f*��0w��� D�����'�GqK��p�@4cX�=mG����"�-b؆��7M^E�_f
7M�UŇny�����H��@ul�_
�wʾ
�
�T��¡n��Sh��'�3����G.͢oh
��T�V���i�o������i�My� k�Lji���(}�h����9
V'*c\�PJ��v�����,����]�ߣV�֚{_)��Կ�����5�2X�h��5?�-��7����t< �mi�]yC��}Rk�Gqm�
}|�)��?˳�A՟$�Sxŧ�?Xy;
0Q}�Ei�+�=�.�,}��M���
7M���3�ciYJ��>��;j�SR���0M�d������@��_��L4��&z��N
Ɠ���F\5��
n���BK�1@*�X��`;@c?�j&g,���D��Ce~
+2n ���p��%)��~�
�B�������^1T��#VM�X���ZK�N(M����Co�jR�W��B0"1hm�����
�2d
h�t���(n��`����cl
M��u=r��+���-�/� =.b
endstream
endobj
17 0 obj
19431
endobj
18 0 obj
<< /Filter [ /FlateDecode ] /Length 19 0 R >>
stream
+H��WM�e�
���p7��@.�,��r�&��
+ �&
!���{�@�b2͐�#K��z~��.�)_Y::�p�Z)yϽ��7��k/�@ڹ���^:7`�wn������S�[���xz�����}���)o/��%�}���2.�s������N��A�,ۣ[н�8�8�x��R�m"Me�R�9MJ�����
���Bjq�w�6b�]��
w(9{Z8���Bj�VV�{n!�������l�E�O
�2��$�} �SܱT��e&F��D���e�
>��ݣx-n�j�8[Y�o�
��W���<
���3J�z� U�A���Ҽ��2{�LC��Q�_n_�ϊK_&.y$xn�nv�R�
j#;�R�il�,m����4�&�3�v�ɭ6�0ʞ���m�k' �s<�Wx8��9w�O{O�T�C� Q�&��ӞZ��(����=;�����!-�� 5�� e�����`eI�2-��|���ל=:�
��[��Wp�9��Yd�P�M��Q" Q�A!���Qb`�d��{m�"�Y�kq^
+�rR�_���I���/s�J�2�Ku���҂Xᦓ��X4.�q�+�E'm9pD|Yv��m%v�
+R\[��I,�Nl��>OG ;�9��> 3z��l]�(�������Ǚ�F�E�$:��6A�L�"�w$rGN
�ݐ
�@��L�
����-M
����#vu@�x%��v�]5��a��=N1<όQ�� ��'���g݀Ј�@
+�g�����ėI[�����Y
+솴 ��3�o����Z�z���J%�^��2V0�KG�.^�j#���y����
��5'�w6�qg'k
b��$�!�r��%��4�M��<rk�o3��Gl��J�8-�؇��4�E�:֫hd��h�0�Xu���'n�T�J�o6��_fi�R���.�eo�f,{V������pH]�ъL=�Ŋ0`9<��n���]둟�Y�9q5:�F
++��n�w��
�ц@
+
S��HB��P�
]�h����2�K��q\��`9Vzˑrq�z� �u8@�mV�e?
I�<˴�[��k
/rq/k7)�|����m?�
�� �"�G�����\Ԝ/p������
o�k=�M���n��*
���م �|F*t}؞��㝭^`W
\�gw�V/�e!
?L�:��<���0U��]��rN-:N�5�|͡��Xs�U�� ea
bq�5�� r�'EH��]]��a0d��
�H�+����5�~�g��<��4���5���p���)x�����=��nE�]�V��3�L�:�K%,);4MWn`W:3��~�sJ�Oס�b�x���v�$<��ç�xvM��IF-���B1V1Â�$˙��WA
��C�e�R�l�
�;}{2|j!����
�T�
Vʺ·W�̰�-#����%���_�i��U�w9Z�����gU�,�2͇B���;�_�2�
� �'��~aJ�s��������z�H|��� ���?I-\؎m���/ �)[!����^9�UB��S��zC�!�CPo�|���N��ӻS߾�v{���ûӯ��]��o_?~�ӗ��O~���O����~����^�{}������ߢ������_N_N��6���y������������K�G�y�gDW�Zm�0ͱa[UX�������ƵU_������/���s
��h}H��
�0�0k*��Kc���������_���!�-|'��x���£�B_-@�50W_ ��.���.#��\
,
}��т����Z��ץ�b�]�!֢a�U Mr~�-��@�]P����c4��=
+�B�
+��&�h�uW�ֲ�F�L,���c4�����݀؊���������,|B��&���)H��
�́�^���ke�f<�Vm�=Y�nC��Ҧd�p
�{��
C;��Å�ަ
��x?�G�����<�@��a�a
+"mBw
�:I�B*qRX��#��8Ƚ��sER
��X��}�@/�<A�]�`�a���ġ�=�}
+�
�]J�Alb4'$�qȮ�R5,pi#
+[
+�EP&�6�2�i��Ɣu��f��
��bH&���b�*a($����a�4S�Xh����0-���q<����Dj�u;p���4�`8�:^Eh
�fwo�)�2�=Fn���uwLj1�R�6A>
�e�u_ճ<�V�n-�� [��
������7��W��Y{HN4s5�H֞�7[�q�3.N�!6/%��\�쫵��1 ��
xO��a����V'�:��h�a��2g?�|�8�k��6͆��y�
�iV3�㰖h�x��Â
�ҽ� ��t,�9
%w��XR
����b�
�<�4� �F-�L�!*�h�ՈC���44�|^(��3���<g�AE���P�i��V��l�N"nq� ?�V��̮r��#�F5�1��&
�L�T�gE��� ݀��p�U��Q��u
���
\w��V�I����9��-�f Z|v��N�� ��g�h_�,i�S�12ǂ9��}\`j�T�زz������{�Y��;�#��?܍A
+�|ޏd%��HPHp� �H8
+h
��������ь���G5��ӧ�չLw������
+Wv9@��$���[���Q
�lt�h�Qv�,<;+�]��
�:s�U
��]U��
V�.�x��c��L%���g��93zb:H��`0
�Zu�wD��?-
]�5}z��}������kE C+8)�g�I�!w��{A�6{U�I�l�Ƽ�~,5+ ٟ
ۓ��
lK�il4�:B�X2�q�ش'����Qg1
pP�U��V<5�6���a�;�r�`�o���QY�Y��za��ǻr�0�"��1���)U���h�����i������Hh�d��h��̞�x�Ei���~!>�\���, Ul��F{N�9w�r�N\��#jw�M�ٵ0d�ȡ�TC�Q%�`\���{H�-
�˪L��b
+��DE�$>@�
����H�����U��
R�w��f����"t�
�7�>�t�݇��?�����X)�<�
���m姧o�~�����'/^<������o�����oy����w�$�|A����� &�O����ӆ��w�f6�Ǽ���dBߧ���u^UV����%k86�P/�m�b`����Ӭ7�f6���7��
����)M�
����!M"
.��Һ�Dy�e�PB�%$��O�*^H�_Ol�أ"є4Н�W�l�-,������|d
+ �SI����`�z�-zFW59Gs)8-�cyRȳ�J�z8@���DA�ˇ,��:�CN~��믙n/h:�a2�驆8o&�0�]h�1L��\v�ck��ȣA at Xt
uޠ��u|��=�U���v��c�H5�[)��ƌ�jX�Ϋ�
̃����𩿨���nC��>y������:�G�M�[s9�����L�V��4a�Y��E]�_ے��l/V��v/5f���Eޚ���(�t!� ���_5Y�ב�ik��7���� �3�
2�t����� ZW`)���J��Ԥ�z#˦RED{^»fj+Cw����c�P�+c/\��"��oq
�7���f���9��F]�r�23�n�i�cJ�c��L���zhD�NI(Ͷ�f�´=�@s%^�o+,��<nG���%��۱Du?�#j��E�x��ɡ���W[���q����*[�1���bMͬ�~b����ʖg�
g[�
)
K���|ڇ:vf6:���G�0d�L�˞aR�;8��5X��4Q�>ۡ�[و�^�sa'AR���z
�A�N�1�L*��
�e�
�����X
,�]����U�6xX�b`uD9�
�ܜν6B��.
+�+J`�e��L�
+u�Y�
���~"�v�!�rsj]@ ��ܾt�d�
a}:�k�(�Ӻ�q�q
�~44�zq�P�������
i���
���a(�y,�XA��-�wa�M�
�X�_`�
ո|����'�~�)�įCQ������Z�luNEY���NnyG
.�]�Z��9�$]wA�Q�SB���S�F�
������f���f�� ;�Pȏ��2�EL�
�.RG�s�`c��i���U��"��5�8�2�!\����
+�/
��u��dQFf^ү�ǘ�5R^��W,P�֫�5�!�{R}Jy=�����m��U�e�������9�ὸM��K�b�R"M��mK�
��<
��Q�p�8�2t���(
��
�r�=-�|�������������
,���:��F�:���Ű\����P^u�p
2��s,
�a�y35W��Ŕ�ƛ��M�X�Y� �bjp�$�,�
��� _��z�3��T#�����&���%PԳ�B'��l�U����}z�����1�
O������#���Ǐ�����o��i���ͻ�>���{{{���
�}���7w�'�nn�~|��T���s����Ǐ>?��{�[�����S;������;�y�="7B
��d{����b���
+
/��rc>��p��[��y@��4j��K>>��'յ�
랃��� �s��@9ۅ
|�`����R�}8
+X���LE�َ�fj�-��ݷʹ�Wf��n�U����X��p8�9��*}�����7|�
Y)$s�";
�u9i���ŝ��],
������qN�t܉�0u
-yƿ��R7@�cP�7�"�
~�Ҧ��0+��:�wY+VH�f�C��+9��Ʌ�*�WWb n/�'В'���l
��ً�8X$��p���9�Oav��:�y�G�@z ��x���%�p�"���*�`q? �|z�n�X! �*�/
K�n>gَc?��W�e�a\�4B�/��
_J"����
wf�Y�!�7J{�
���-r|��8=j����6LǺ+[���!�W���d3��Z������S�B����Js0@��Gu@�O�y
FwHkE6)���\��ܖ�~�V�\T1��<-
��m��fǠf�� c��H(�e�~
\e��
��Z�vDyAFN%�`�F��
��x�ӛ�T��Ev���V�>suhy:��̲�g��]�S�G�|YG۷r�w����Anm��dX�}��@0�FK�zPT
I
��U\|��#/�YǙp��A�T��UX])0�;胃o���K�� ���az������i'Ke���a�s�oM;j�g[D}
�
�h���y��-'W���Y�<A�]L\=%z����
e��~�41�9CXTYh���Ga5� #�|��0wD��?��>��7�n�B�`i�
ǕX�:���g�D��;�XRjj5�{
e���FT��ϣZ�Gw�cYrð�L�H��N�:��A���8�釧ϒ��������u�������+������^�)��X��ϯ w�u�����
�>���
�)~�[
�w�ͭQ�p��qJ,m���7�1�,��i�^
�Zi0k
+<|v�s���� $�u�S�����n',��ږe�
�
�y���u�ފ����υhB�ʘ���ꊘQ�Y�k�L�ݰ
��������]�y�Z����R� ߭r�b ;�DF�:
ri�� �;��ç4�
�U�{)�7���-_v��/�FX�@�R
p���n"B�;�T�x�kG<'���� ����͎1 at k�cY��� �v +Bȹ ��w=U�g��}��.P�*1^� aX�YO}���<t������o�]�
Z�^���
�v8ڇ�h R�z� z�{�C��
d�G�7?���9����{sI����<}�7cOJ߃�Zݮ�)ܥ�R����߃��
���R�;ܝ��X�[u
M������,F���U�<V$$�U�
�ג��3G��'���r�,;
+l����~e@�ӹ �ϋLY��)E�O��v��Ff���U��
�Oa�8{��SwL�� Z��e�j���.
n�����]T�6���s#S���O���M�p�C���7��#D����w��8�1�-6�b�����X���?/|q
�7����jɶ�=�{G�S�c
\�k���ظ�Q�
<��0xUq�x��t9ь���
M��4���F<���Zrhc�����@���"l�cq� W6峢ԏ�F��܅T1|�l�����S��&qSۋ\
�uS
��x1����O
o�b
���oԙ�
�6���%���;����f���O-�)�h���л�v�(hT���~?[#_6���
�*]r�
�vvM�2���� _α5���()��
9�@��0�f,&
+-q�f4� _V�������� �u6sS,\�+�!�-VL�ܳ~�Zr�G�tF*z�¬�c~_��~�4
ЩS
w��^�5�
�����U������]\t$U��Ϣ-�
�Eգa��
�����o��}ZJQ'Q���X]|�[V��=��L��
�h�E�Y>y�ԋ �3���I�6OD���
y��a���¸dIY��'`0@
�e
�N:���"",kT50|�υt��
� V�&l�o�:�m虾��q��l�e�'B9Z�}$�y�e[�S���� R[��R�*`o>��)�4F�<��:A.�
�V�3˻A�Њ�؊į0x�:mL��<�^w���*�x,�[H� ���I���(��>V?�K�da.�0;��{�.*��
�K-�t-�B��A����:�8}���=�VRs��,�#��`���
#X���B��`+i_j
��^(�
+3���r�s�L�8�
X�ڬ� �Y]p0�Q
+
�L&��PM�i�Rn�xԲ���F3��G(�
,�
��:Aq"ʙ��G�o�U
%���5:
�fy��#l���x�[��'k�TA9vWS�~�A�z千��.�/=�j�vۣd�`
j��+����Lō�6�E��890�
���#��_&h��z��y��EM��
+�(��Ut�cګ
5��
+��r��q�������f�j��@AS��Х:��q
+g)j�k�\�Yv�!�Q��P��Ù[��)ԇ��� �ե��t��X��: �n�qJ�nO/��չ����F�P"�6x�U����8�H��W
v��u(��&� �p/6RVf�f��r�� c����
m!rۚ�z��_!�}��Y�z�p9+V��4��zw�MY���X
�\��RS��-
p5�����]
��� ���Nv�',��-���U���� 綪�<�
�>���f�ؑ�l��evRF��r?2
���R_�[x�
���F��Q�էiI����#d
@���v���c��
�����aWT���q�
жT�Gw�_"n����*tY.#,�|F����Ep�!��(�m�h�Ʊr��Ƴ�w�~�)'�G=��da ��t�����V����B�h�Z�z&��Eֹ�%��}]���P��;�ߋ�p/쨶�l
C��&:��Z�/�+�>[�AWr1A1��VʌcM�o_�S�7w�_QS�����t����U�;�xH�#��.SO�ڗ�.�n�� X��pﴈ�[5�,E�;��
�>2���En��5��F
���ig� ����+�p���g|�#A �Z
~�������0�%W:p�G�pl3��|w�r��Ղ:��
ו�}���G/��{0��3�۔Y�dx7ºo
��)}���^�����^
밾=
��|.T�� F��������L�� ;C��-{�_9�#
/��m!���Xl���.�����>U c-��\��:�f���k�b���
XQvE��e
�7�]��W
�7���rݕ��
�
Xo�����m�+��l�Nk
�]���\/r?p�\bH� q
���츺d�\
�7�^���T�]
�
>j��h6:d at b�R}g;��u� ;�4c9��� �R&O����l��9K̛9��R�6��Ž�[�1{�`d�9�
+֤��e�W�V&[�V�b�:��r�u�I�珣��O��zd1�H�
dO��n�%����ӻP- �b�����B<��y�'��֔���+6b/X%؍�u��x�'0�
+��c`���0
Fi���y�{�zݯ-d��x��.CMw(
�R%z�o«%Ǯ\�����
t�l��û� oV��>�"un��Г a��ȲD��
[+pD�<<{�O��ʎy]����<��c��ۮ��%�`ml�&���Mۦ����|4���E�XG�
�Xx�j�9s�J/$ pm�R~��;Pqm�o�-�����j�l�a���a�" �B�/�8�mx����p�
7;�,>�\��;���q��% ]7$fw�
L����ry};f��`k����ߏ^hьf`�Ŵ ҂���X�2��Z}�
~��T���
XÅY���
+텳+�5*p�uQ~��,f[Gծ��v����nGy�߹
�6k�/���Y:��b��,��
+ua�R��|Pz9��Xm�E�jA��+x�?3J|�?u1Dh�9��!���Ě�8d�ԍ�V��ՕB�M�jS���[��[�r�oWd`)Y���FЬig��
���L��b%�!>v51�)(��
zt�d<wkg
�yP�G
���YG�B��q�[��0���]�ܼ;=j���G�πO��˟m��g�R���,ZQOc��,,�z��Z�|���US��ԥ~nL
�/��}eк
�m�!'�%x�jïVH��4c�JO����q�:������o��/v��.4�� ƺ�U"ex!����iw8�°9x
+/]���.wm�-&f(Ş?�v��!��v���:�����+`����yv�������|�������`�ʨ��a
��
ѼW��
��(�ZR
�eJ�B��6Տ.���
Tb�
+���7ԯ'�$";'hG|���&��p�c�o��&���3lB��Û�Sb Z�˟�qK��kI{����g`�g�0?��y����t����2��y�T��n�9V�[�}�U8���T�U������]'o��i9K>�m;�]O��0@
R^5�8�`��
�x���L94��F��=���La�<;jh<�^��m�S�VN߅7���.�� 'M��S˟��kϘr?�����l��"Hx�&'�Ōg��
+0���aG<勧`q��Np���>c*j��y��iƳR[��'�`�����*?���/@����O�g1��ԭ3
���֘p"G�s� pm��cdjocИZ���!�
������k�R� �.�xd�
��D��i( ����>G4�D�\Z�b��3��%\�ؽ���»�2&�o����Ǜġ~�ߚ.�\��ap�����"ۖ��� �&���8 ��2X.?/8]b���*ˈ+}s�� 6���R�}�8��(I ���p�U�əw�? ���%v��ly��3(.�nn+u�[>�[��g'=�2^�X���nv�
�,���{}h�����+I!W(��:5=p�/7���uN��
+ts�\s<?��@���t�� $^��p|��
+������,P�Q��Rp�۽]b0mN(|̭� ����D
3�jq���Q/2.E� ��0]m���P�T�l ��|�
{�zt�=�
s�������+�*��f������"Dm��a�N
A�Y`G���R�e�����7��r�'
_�mo�8�ڙ O=Gk-s���J0|���
B#�U�uj�ϲ\�2T�)�*E�f��=B�_��A#�ˎD��ݭ pA�� D���OU���p�����b��M����p�t�Q�*BD���S�*��Qr��REc
,Cc
�M�2t�8�G��_
�f�Mó������Q�:��T���I!�L�ƽ�6h� �%�����]�i�
+�t���%�{����Ύ�xӰ�>d-���m���Xvn��hO$�`�6�#r(��N~���b]Y�
�I�sn7��ԝ�}���0p@>����j
+�y�T
��轾���c�F�^�K�q��=_�^�8�+p�=8/�_v����痝�$ñ
�,���j9֔�)͖��յZ[{p����A�$�9�d�b�q��+;iAZ
��*?�� � 5��d���3���o��R�)<?��z�#we��e��7v���ꋠ�Rō=%����H6 KQ _�Ȩn�Bf���Y3ٿ�+�ae �Ms�z�J���[�k���.L
���C�ݎF�4H���Fz=�K
u���G
�@��
�F�
�N�i��0�`�A#wr��p���VK&��8�D�r�SX�4*
Sg��� ���~��
+��.��7XH�C�a�X�
����^��Ou��-���M��uT +�M��w
U�!��=�s~G|t�,�e��-u��*��7�>%�p�
}���҆s���gL�֘�T/���'�����7�*"�7h= ��D #;nK�N�%߿���~������~+�4Jw�-��e�;6��b��e�*;p܊��b���i���$��`�OK
r����C{n}���%���w{��t����RyuP
7r�,f7y�{�$�m�3�n���{�;G]o'�Wd��>8��P��5�O�~tm\���p�Jt�K��g%�.�A �!xj���ȿadg���y�34��n��!�Ʒ��5Q�*�R<Go.ḋX��d
vW���ĔهD�ov�a�%����6�4ߓ7�
�Z��9H����=�i����������)(��r[3uLJ"4W��
�Q"�sE~�g���G
Rr�Z\���k�
ד��C�i�,��8�&��T�Y��>!/n�t��6�(pO���f�]��&W�����y�g����U�j��G
+���|��ŀ
>Ky�S��:�P����]��R���;�
w
��i������S�.�]���d �S��:�A����_֛n���}�NZ@��U�lm�qm�B�4C^bNU��y��j|�(��3����Wˊ]��
���0��P��r��¦��AX�1FH��^�G
�{GVFԹ�ow�ĭ�����H�r0��<�c��]�b�"�b�C�E
+DY�M��5p�0iP`=fz��bs����Ygg��]٣�k=
$p��ۆB?M����'�
�"4ۄ��z1�37��z�wt���}`c�A7� CK$=�|v.^j�����Л^C�`��
�����iڃ���!^y�����m84����l��^*{�$LVC�6|��Qo5�$e��5������!�>O �V
��G�$��o������`�Z�Yx��Q�m����'ά�\Ǐ���f�,��Ç�JL)ȇ��q��lK�����*]�z������-68=f�u��!#//�T*�;?���@��{�"�]Մp
�33�,7#i�G�]��=��(��%d��t�Q�(�R�,�y6��:��_^���^�M��%���AHvo�
+�>��5I�0�d����`�jӵ���ƪ�
���x�։�m{K��\B�Q��]�5Եv�1b���f$��nOl,�|\�V��\�L�M��>�L�ҕ���^�?�{L��4X �&ͣ�uA�}
n8����;z�Y
+��s��
9��<e�Q+���S���5+h�5�^+��x��}{����ڝ�7
k�]A=o1�x���F��Y/��B:Z������9Xn%��0�EC%�,��9�Ծ��
nk"�r9M%�Q��"�^����e
�#��<i5['�CM�hZX�-������b5�%n�k�[��28�)�L�
I����
���{H9T5�W
�y͓4h�xHh�\^�l.X�x��3p;�
6�p�ٳ�W��Zor�G&hQ��ˍ��-+���
mo��0
&�k4k��a4v���u�T�
E�i=�����Z6�+jo����CQ
��hw�=4���4
=�Y�<���@���Unj쪐��6��e��r{����.�qN�}H|F�u#;Z��^qb������2�:�U�*FC�v^�E$�At
z��y*5��k�G�>����X�2�S��<�A�h���Ha�R�m�h��n�S�b
Z�u��v7Z������J`��d�<:6����|N�4��]��������,�{��'��\��Vj���N�}s�s�6�-�
��
p��|�J�'!:3f�A��{�Ĵ���{MW�\�-��T9���Z~�ݬ1�5����y��Fe�ؾz��rao˥�}0sM��d�):T���dK�+���T�h����>W�6
�zv�Tx<塵�dH3�Z�"B�I��d7�C�|T�q��ŭ&���(�
-&��+�0:�Eװ�*�Mqɍ5�6��2P����u���n4>��C���yf`mۭ<~Ń�Zy0�Lg`�ҟ�K�
>�E&+�;G
P�#�?�b���\��4�ޏ�w���%62�ĝ���� �kϕ��#�F�<ߜ�^����al�\p�T�b���8��}�"+z�TgY���xI*�xhm��咍{Xf�p�}W� gf�[���n��f��
�杸
���aa�,9�-2@��]�V��=oop}hFm
{1Z�N;�\S��̐:�F��I��I i�E�w���ʨA�Ĭ�n
�^�պ�����YƦ;<�Y�q�mm��������t�;�@��
��f}x����߾�{w�nEJ� [...]
+�s��]�q
�b��U�a��
�@���/2�HL,�:�ۂA9�&7_�~;V���/�����R|�4Ц�q�`���N&퉆g�P�;I@��"��k��
ǭg�ԯ֖������b�RXyJk�k��.b����7�I7�o]P@�I���R��:� V�ez�$[u�-E��O��
v<�l���0D�^��7.|:"W[�Re�#r���6I
�L`��M�pxdZ^�up0J��3+t�|P�r4b䅐�j��bRtg�٢.�A�������v
k���,�sD�vS�"�YA��(��gǭ�
+qF���l!�#�G�����n��L�ɥ�5���6��A%��r*��[��z�Y1����)&W��uv�S��
��`�Z�go�F�V^�AT�tyv���w<��S���mO�Y��_��� ���� T�n��+`΅��Ə� �94�r�Le���p,��
�4�b��&n}�^'ЊU���kD*c]���cg
,"���᱐�rZbo/��.�#��\A�DJ�9�6�
��C�뎶�3�2��lAY��p����آ;�bCBc��"}f�Ia٧��ι)V���3Q!��
eM�]�[�`U@
+H��|�I��~ff?�Y{Qt��w�BM���u_`Rri
��;{a��[�/�R;C��#�'���$X�K ��S�
�����
T�����
���Ǟ�D��As�)kJy�
�U����0�jP���q��ם����o/�z����o������>�����������OOw��×���������ϗ��I����ܽ�z��<^��������/�r���o��8��/xO l= �K���K�
+c�z�?�ql'�%_p�̼_[y�s/�d�ٿ����Q�
+��r�>��
6
+�a�`��X`mp��jS 8&S4�7�����kÌm�Y
U��+
�Yp���K����~8ږ��`K��D
+�f���xH�Ђ:X;��Nq
F̭������bG�=�$����k=���c�EX[r(�Y09��⫧�9m�Ly�c��ٖ5��&�Ɲ�*b��l
��9�@�)$Ox2F\6S�S`��H�R �u|�~��xW��'�n>Vǘ�cX������?�ղ#�mC�7l (K�DJ��
/{�|�a�"����`�����{u�z�*4
�i/I��� 6�`� T��o��4\�x��=`�t[�Q��f3P��{h#�`
a�q�X*6;@�
xhh�čf�`rO�4k`҉O���XԆY�R{��%Z����F�x���U�Ri�[�%ؕ�C {z�}!�2Vq�{��-@��Q;OK�����:�R�v6�%��$ �O�%`�1;���\�X��6����*��)t5.�;�n!]-��ތ�1�3�mN!g!nfbbG]`��*�`���q��Q#3)I#��"#p쨀��L��IT,&��=�x�ԙ�q�.�ĪF��~����� [...]
�C殎6[aͯI ֞94;*i�#�bK��
��x��aj���3��1����H�6Z)4�t�e8}� w<m[��]Mү�f���Kq<��'=t;�҃�
�*A��,¨��R3i��֬�,��y�@���\E0pJ�;,c�6|Q
���� �����{ �Ҧ����L����$=<8o�o�M
:.i�����p��v;8\�p9�_�˫bQ���V���Z[uS���V�o�u��K�~>�z����UOc1Z
��Uk㓕�{���2���sI2yW�������?����o�߾}���?����а���/4�.���ӿ�}���_~���_�����}��l|��Y�l�Z�Д��c��w�M�^� ����X�%p��^
��q.�įn^���.p��
/�JvE�;ʨK��E�G�U�k6c[���K��Q�Z<�x�L��z���
�V� á�Mxs�
�F�n
�!6���jc�'����4g7#��%AW,��Ӈ7ԩCM�
wǸY"�i��{��Z� [...]
+�i�
N
x�Ca,F
`TW��pDf��/xϵogѨiL&P
�
n����M��Fg����
�)��V}�Y�y��
=KsSIE�pF�^)}��;~�C�ǽ�j�w�<���QZ[�ً}4��zDo�{c��'�3D����xn�Wg��(㮋��'��=�
_NN]mƈ�*��{f'D�J�[(_.Z���V@�����v�hE�>����ߌ��.�]h��
7����:���
�n�����9r�su�=Y���
��9ڽ�<�� �
�ˈM��۰�� q���{�):��mH��0��1��&�g����SM����qv(S_.z���N��A���s��!<�!�g���W�,|��Ѽ>�
iw⧟���ϓ;�b��t+�ۣs�ԛ��+
�`��)��8v
��
^����������0���hͅ��92�=
�
�E�2��Ib� 6�2"~ñq��"a
L�4�V�&�]l3��ji�ӭ�ڍ �6^�Yn&v�NKX�X@ �t�rN��E4m�h�WS�w��
+�C�q�R�ȌH�F b�'�����)� A�+�:n؊��
�`a�9
Rd^zؑ�*"�B^��o:�JQZ�ݻ��
�-�V
�P
xTu�,��E4���0�8�@��#�f�F
|� ^Kd
�|h���Ձ��Bm�����D}s�pa�
j<�T��������:��Cft���l�H��l���z�N�y��ݒ��$��9C<|��E��)��[�_^b�m+�D{�߿��u���Q(��`l-�ږ�|0U_
q/ݘ�o��~���k���]r�FT֞�%��&��?CYI�x
X+����;�8gب1(
+$��H��f�
��c�s!
�g���������I{�F���iePe����>Hw$�6
�FZ
5�m�� �:��g�c��$8�7
+
�╤��K.@���-�fG�e-?�³�
p)c���Һ����
�g���5]k�{��n@��ň�K:�'M�y~v)+�=
��f�:���l�����"(�
e˹�P+�-�O�:$�-�EA�.��Ȟ�����C���"�h_��D>���{�`:+s��8��U�5g�i�� �^}R��HX�O���s0tÚ�Yj8�3~��b
�uw��a�c U�Ħ�e�Z�R�N:��āVO�0���-���T1P�Q��l��a�?���03m�91��Xw� HH�x�
����Ţ`/�7h��8� l��<�l
E��
��]] '�N
_,��BX[h�_T���� ��a``�q�[��eEHL�a\FY�>�����;S>R^9(�"@Y�QF���g��"� K[��^ E3֕~�sy8�������+�u���N��:07�|�weH��Zd�QXz� �1V�ѹ�1�Y�չ��ak�k7�� �9Ȇ��p�2��T\������� [...]
�=.��
��H���ܶċ ��y
O���q(mE |�����54c�?�X���%
W��וfơ@�@~D�G[��X
iחlF���ej�^5��~��0n&t��m݈�9� ��ȦU;�yx�"��_�{�G�m��
��
+��7N8*8�8�PM��JK��@.#٫�{[4���f�0�� %��� ���`��hU�H�t#�v� F��|�e|� �P�-<����5T̉}+=L�ka���ji��{C��� ؛K�U���,nH�L�
=C
p{�x0��9U���ݞx��f��9�O�RIGGF�m�Υ�y.�%�G�cHPǹ)�r#����Ӆ+a\8d���ke�0��s#I\�эp[=�n֙������l�
[���
�C�0
c��;@ΈW縼�<֦�8 at Y@��7�S��V� �椕" B@�5 ��A�{A&�V�����I
]�
T}(����b
^��65� TyT=�}�bL�
Z��|�C'�P�
�"W �P�"�(9�&�yXd-
���mhh˕�A�g"�{�ْ2���w7]Rθ��
�)�U
V*c>s�b,��-�,r*U]�,W'$c��V,��I��+^
�hF�́㩨�����{��
��<B��k`"R8V� �J�5�Uv� e�����3�\��m��h��
���=ݞ�fH{Dk�ʞ���eR 32��D�o�k��4"B\�Ξ��x
eΌ<MV��p-�E�l�E�ϴ�̶L�5ϥ
+�?�e�,8�Hi#�d
�^�;�3
+�x�Ac�
��%��� f��
+�@���'�#�{5F0I��kc` �2+���z.�h�L��zS�5�%Hh\+�Sd�<��.�iS�~��PXH�3���u �X�� 9Rx�3��M���aق
+�^6�R�
�F�36�� R���bc7_�o�>�(��J����HDLE�j|įt����x�OgM�Xp����Z�N��K����i�>̰/M��d�� tWb����+�:�&����`mLk 4Ui�[
�G�ظ��U�uY�Je#�0tÁ:�(�*S
+l�B
+F��n��
�UOi�������z��B.Y�
VY='�Ho�z��*��W�
���%3�g�l|�lx\�[%�4Է�R7&V���g��v��f�9�a��gCg�R����8�UV46E�#$�
�9J������X֫��ݤ1�����9���
��b�*:�c�ט�*[|���]0|;��z���.nΔ���e��Jݕ��a�ɝ���`�}`_"�~�
�� ���~/
���Q^\3 ���Z�L�: _#K���ь-ƅ����'o
5>���S4Ǎ�4
��ٟ�����&����;��k�7
0�hSB<��A�ˤƮ��-��W���4����l���²�f���n���}�-��Ksк��~��!BO�:�'æ
V�6���
�.�"�(3���5RzV�������M���U}%��
9|;�y
W?o����8�������Q��qX�VcON�Ȩ�=�p�;�
+p�d�f��T\��0+u����2�fK� ޞΤS妽�GW���:38;���c7��`
��sSU�wơ���wS�R�G���|=g��֒�4�E�'����LF��|�4����0m{ۺ0M;�
��
ChI����@�w�cvq�N(�8�
��
�N��0hKP]F�*�P6�?���W�ό�V@���\��<z��mTo���b�1Ӗ#���m�Ľ|
�+����Ix>�����֎��9$�x]2[��d�`Ė��Є�' �kZ�*ٺ>�A�,�)8�5��zp`rl���J��E�I�R�LTuj3�W��F���Z^a1�]
�=$�� �M
r]��M&K� �D�sP"V
5W�Rfc��g���o��Y�z�q�
+�6c�C���p�Ck�j1߷�<Xg�.X�Ϧ/�����#�N���c�W)xX���0V�x
Y��d��4E,RQ.$�F;�^oŧBEi����*`w0p
+}���sA�������K(�O7!� �)�R��ئ�>�(���җ�Q�������;.��ނ����`�
uSr�K��)
�;Rv+��3�,��
���遰�t�����z����~/k"�I\l��n
��P��Q�\� R�}�d at J�;(��p4�]���^hd���#ʺ����z;�a���*pg�IW��K�t,C�i� �z���MFF4���ḿ����5k���{�,���C�X����7g�n��z���H[��u�����L����u�Ǐ%���U,�֜G_���7�2�ෝ �3�>hь!D��0����y�
+��yk��r�`�pu��^�?[{�A������Q�'�(��)�`\(������O���=E>��)��� h��\ߩ������(�c #�B�������}##��O~������� ѷXA�uȘ
�
+�>nMtk�V��5��8m>���o Je
+�?E�if�����y9_�q4b���(�����1��(?�A�G?o��ثw:��aM�*�w|u��/�>��]a��-��y!��}���XFc��
��eY��5��j|�#��f�����Qr\��yP���',\�7�&�^�"t#�_q������鵉�@u��4 N�ޮ- �o̒����ކ� ��N����k
"����� �m�{S#ۀ�fM`;��̟;,�.2
�g[l.b�P�Y'Qy�6 ���ۢ���e
�����lӷ ���<
���K�2p�\q/�H�/b���ty���Jl���*3E�$n��J���J�
�bpm� ���
[A�'�,.o�A�
9`��2#� ��3�W�F��t����$;�w(q�ߚ�m�EU#:
5M�
��C_i��k�wk0���<�*������K����p����Wi�L���w��߾|�������>��ӧ_ൢ�}�ǿ^V���_^>�?}��o��o��??}�����J���{��o`?_������\>�����8BKC`�"r�O�}O�Դ��mp}r�l��>ܼ���h`�
+�O(e/��\)������V����
�`Y,Jj%�pW���>1�������.�N%��ɇ,Ʃn/
���
+_�j�%SJ����X-�
a�^�
x��م�F�}i�
+���[Om��7G��\�h)#I�G��
B���.�m]�����
+p���
�������[ij1=N ���
endstream
endobj
19 0 obj
19619
endobj
20 0 obj
<< /Filter [ /FlateDecode ] /Length 21 0 R >>
stream
+H��W]k^��7�?��������I���-)-I
J1Bv\,�*c�����̞��k��E~<gv�癭7�C�^�=�Vz*��m���X�v�Js0q�V��O���Ά&v�֨�Cmg�m� ��=~�����ۛ��7w�����
=~~�M�0_lO~z���{��_]]�ܼ}�������ؾ�ߏfI>p�j�9'
+�A7���o��&wr�i�nu�n��#4iHv�O��0���!��ui�E��[ZT�<�G6
+���<��{�N��p��}� Wf����=B�dp]��!0�T�k�E���$#�=㷲wI�
�I���,���H���ʵF�!�$���C��c�6�CK��
+��‗^����JK��/��f
� .�Z�;JR�iUu�w
+;�J�<5랉�f7��Ԫ�>rj�o����n(w3F:��lQ=�,������{��g)��>i��
,���5�5��$��%m�PU���^
�awR��Z��N�1�S���B���*:b
C��ԬRE�!a
{�e�g=T�ӛ~ȣ�~5Y:$��T,�þm�V��N{��'*bz>Sf���gk�1`F�
$N+!xM�:���
�ao_R8��ˮ�� D%�,�1q3�
�NR�Lu�P�JnC�Z\�kL/�J�ɠ��Ϊ�p4����x@�qvc��7ԗ��s�i��k��=�W���n+�H�x�0��0ˆ���oK��ˮ �
xն��![
o'c�g<cV&`�\�],:7jN6k�6dμ\�ʷ�l#
pm�x��]���
;�
5KԎ4�>���t`�d�=��M2EG�xU� ����\6I�j��
��`$��C�f��r8<����j�U�P
o
ﺄ�GG�
�5�J�5
|�E�K�P���UwdU�(�eC��xhv�8��x��[��.R%�vF|�Q���U� J-�]N�Bk� �
�ң��
+���BKZ�ۭ6��ٻ^��4�%z�ڳ~~Ƃ��U�
�T>*�/T��nԒ�x͙�q5�Q9'ʻ��q_��{4����C�ތl�����:
�
��h�݄M9��n(�_0J� ��Sj���a�pcF_�pk�j
#B{ �K)G�
l��ed���rD�w
N@^,�q��X[`-�ݼ+��Q�]I
0�R�6p�N��̜���
�
w�2�$Fm�ep�8:MJ3@��
����Zs���9p���X��`�J�>�Md�_��/a�w�����
�hjF�L���G�|3f�8���nV�>�=��
�0��c��B����,����팈u�~)��&��Z��&*�c����L�'�������~
�OK�d�~�҇f�)�[�
Wl֠�-������^��d;�1윫�Ù
�l{����
D1�"���8�ڌ0��d��a��
j;�k�&�ih=��A�.3~��r!(�d[%��L���t�Ŭ
�X�A� �\b������^/���G-ō�q�o���Ą�qD��b&���Ⱓ��=P��j����=29��m�蚔�K��� �pVT�bs�<���\�a�,��Ì�,�֜�w� ��F��[Z���(�Nˣ�<[C 3��:�����X�4g{��aD�
�m�6/�W��tt���S�������
�����,c���yN�>���$�c@]�vOL�.j���+ǒ�VRP
�U���#qև�}�*�
+�0&{�%�0�ۡ
+I�
{Ku�t4�/�Z�
+c�q�U�
���hmw��|
�9���ɕ"��:A3��
���M��:͋ h$;�STkA�
�eX�$����K�����֎��L��!H:�C3��)��@(Z.�3���{��
T�K����nDKxY�v��8OI�Z݅K��c�l�-�!!��]�<�
�;#c
+�G,�U]�
8c��s�~��l�M�� � ��5���A���\<b��pzv;
8�M|���i��{���'�:
t��|�%���{s �HI�L��ܐ�a]-0�[�L̘��&
�r��VW ��ՅƖ��~aA��Y�ig�(i0��J]��W
��
�����i'���B��%5�ڰ��ʋ�q�P�s�Q���
��ku0��O���+����z�r\�KEp ᚂ�i���s�|)�c��������qL�:&���ȑ���@���Vr��r�>�^��=~�����ۛ��7w�����
=~~�8F��b{�����ݫ���������o
�����͐�~�Xs��)n�XD�É7�ܲZ�-+q�-�64�D�
t|
6�,���l�y���-�5��I�����a%/j�k&���W
��g��_l���ѯ�/�ҟ�����������/����@�^����?�������ۄ7�/�
��r�x����۳�gi�[����_�����h������d�=="~c:!:3s2�G�O��qD�
+�ǥ�t��
�;l9�A���C�R0a�����ъ��?bz�:F4(d����cH
���=������`$�`�<�FQh��Ɣ͙�}�8F�(���^m�u
W�=����6��>�VҀ۔�S��P�*�8ŒMk;��w�}�#��[ć�9sf��uK��d.
�� JT��<hΆ�M15Y���ָk]5�hЫ�j�@
�6X��jk��s ����ɪ��n[Tz�u6��9��s���M��G[�Ps�'D8����A�+p� p�2�J?i:���� G���倦{-�'�Q����D��S��p���n[��z�M�QT*F��`�3��� t!��R�5���-�B���#�Б(�W�f��b�>����4L��t�����!�(ON�C��$]�7
�]�X��(=爤�)�?�0���u� ��q�fF
�.M�_;u$iK%�^[��F�Ȏ w�o;9�v!�@����nZ��g8���w�E���k+]�ϵn��sL�ނ� 4����,]�A�tW [...]
G �����i���Y�
���K�@�)ݸw{!"�=��>k�̽��z
��
��'�!ߡ3�p�Y ���N�`�x*��@%M��v8x�?�6J��L@���
�'Ȥxq�����z�I";�X�����ߝ%
��QF���`�f�ҊIl���ٔ�b� 0zl��jگJ�d7K���
Օ��|,�z�[
�VT��
�r���E%
�yz�i
�
p��ŜnJ�y��=YqS� �<0�M��,��1iI� ��Ce���6��F�8���Z������F�b�₍�
X�����\��F_|��'��-=��l:"�&x��
��a`�oZc�-`�6-6�8��Xch�̖�XLR2 �4Ϧ�k�l�}����à�c�f�Ga3������(�c���1�YI
�cC
1,~*���4�1�����&�
�%�
@,^�mB�YdZyɈ�X�z���
��q�mE+�H8����b�%�X��������V�� �xD
l�=�ZvѹioüTm1엑.=M�V�o�W�Q���`"^8�b���;�>�
JS�Ø ��Ud;Qo"T�Ȇe�Zt.��I���U�g���SW�
AgGnC��H꿁�jF
����������tDWA, �%@���0�Tp�R����_5��Amq����ΊX��mފe\t��
�}�t�b`����!4:�b ��hN=���Q������!]=h�M��ܤ����t�,��W��¸y��H(������p��Y��ݔ�������j���q��x����^�������?�]k���
����O?�=���������>�|x��g������_ξ�x摓6��?��P���_����k�y�҄
�UԱ�S�X��@۫60��?�3��D�x�����;�x&Ƿ<�_�?���|������u;zkw����m�S�>��jټ�3��F� e���V0%E,�p�s�#A,+�̢8L.u��3cT���r�"�TN��y(Ӹ
� ���)HmVO�@z�t �]�pH�����r2
+�=�;�^}��/�O=V[}��C�:3rr�� �g��:�oض�������@���%
+�D��{�
+�k��Cj�Zryq�����j��;�G��.�|�Jş.���5
e7��T��F��
pNͨ�NB�z�\a�jva��R��",S�.��j�&O�G���*b��H�x�I��
�e��n��2k��S��_m�4͎�Y15~�M����v�L7iŞr�b$C7C�M+|>�23T���.D{�N;�p)�d/�<`�X�������_]&��H��jt�
E��л�h�
+�
m��]0�����x�^�PN� .���
����K3�@��>��7�$����������>ZU�N
��o7#���:�~U�G��j�b1x�;�4��Z�i�����Ȩ�gw
+p�����������������ۗ�>\r�g9�u�!��G0���חM,�+�����&z
i�`�
"�*��T�N
+��Xl�6� �uf���V��5�>��Py
{w��`��y�A��
+�
�:�<���$����e��m���v at Z�����첹��{�+s���O�\��<�\-oi#p�=�x��7��o.���]�"�y�m���k�v���ף�R��h�`�!3J$z�G3b|��hh���4�t�[@A��L>"�ɋY�Q���*�
I})�I/�4��\�W�,��T�)zA����;��2��_|aS��"�����P�UV
+��pE�Ą�sh���z��\���C��ߋG��80�Uܕ�Լ��M
+ nj�y[rS6���z)FL�8�9�Jtx
+fB|�
:Ȝ�:ղy��ao��y9L?j`��Jېi"��'60y��}b���ʝ��p�Af:��eJv%���Z�J^Z�-M��2y�$t/�j�
.J���|�
��&E}E
'�0W��l1GI-/#5���M�.v��*�B�d��� B�I�@�*9����4���EE� #���/�6'�V4%;����Fg���j@��B�2��b�������RCm�J}�s ċ���`�s����t����������Dr�V��'܊:"|��>1�}�c?�!G���֩�iy�^�
���anulsL���T~�����
�W���
��a�
'c)�\+��{;m�D����zn�n�3
F��B.��l�YK�w�Mz8U ���a�~�� P���ٯ�;�#����������]ݽ�M Ƃ�IN�H
ےпϩW3s%ǂ�h����GթS砽9&j���e��[,
�b����LF@ �L�1cR4
)�}��Wc�
���w�@���NǪgJ�k�7�vX�����'=�ڱj
!A{�1
�Zh��W�G����Դ��]'ke�v�_P9��wms�{�kՔ�����kK:4��t��̉MDžj�a� � �}{6ܐK�rs��l;��C��j:t�A[cs�)�M�f�,g
+ ��a�R�Na
B#��r[W
=-6�~C^�j��,!dd��Z�1��#��ris�
��kgal:���l�eKC��:}���to��و mH� �>WԌT���D�z�N�Ż�̐U
�/.�V
�Q��
@��
��}v}����2���̱��g
+�:ן'��Ǧ��Yȩ6�H[v;B���m
+�%#VWu��9�
�ͥPDK�|�IU����1r�L6W��c).��}��!ɶ�P���u��O����&��c
���|�=J�����a���vK��
ܗ���ZAǾ:�iE�S-*AX!m�&�ڳ�^��%oT>0��L���jH�����k
fO�h��Mkq�a(PmVdb���B�My8��'ަ�.�P��p�y;���p�B�X
��Wi )�(�N}@״ L�{d(�$��%FȘ+��f�� ��d�G���5
�
+�!bu�/�4�*��Aq�cq��0��6�-��r�b�!���#� bϲ�LF=Q���n���^;Xϸ,f��dh�jV��c
����{Woi�
}/%U)�wS9�� ��=U��t�_�
�uP)p��
E�~�^~5�[��@
Oh�����2{�
L
���
do�V�c
������o���e
�aOaֺ-/�H��`2!�+�����>$� Bѩa���F
�ںB�~푅�=a�O�
�Ͷ��1�XK~���� ���C;Ɲ��
+W��@��@u��ګ>*j����C�h�p[���]�p4K���'��F���k�[R5�Uq
�Yjն|��Tk��Ь���
�3
k�]�o�� �[�ũ���`�})��Xl�k��vx�א�*��t�tv�7B�5W�;�#�'d�>��B��\��*�R5�'8�����N[v�
nG��C~�
+;_�YI��N�t%2WwS�`�
ə��ϓ�
�1��uY��/�Hjqcq��c1�؊��N��
���ۡS�ٮl��*�-b�µ�|��$]�v>7����i��d��t�`�_�^"6��
ߥD�
+R�
_�@w�4�2��m�~=
{
w^��u�Y9!oK�Y���
q��˹��Tqޜ�����*�n3>��T����� �D�K��ٻ/Z��W唞K�i�� =
XZ��A)�P5�H�GO�&���X�K�L��[��S�R)al�l=(��4j�bՑ}5���E#��'�L�uy��a�Ez/v�b$�@�R������6(j�����_��m��#|���LSFS��֪^U���"waBJ��~�kd�� �0���QЕ��a
4�9�v�&�VA�j\y/���v�N�#�a ot� �N�8�u������87:
-��g||�8}c7���?�� ��O��>��c��߮����! ŀ���7r������|
�%���g�*~A[�b��a�S��D��2�W�Q�B�i����Pb*V����w����.�N�!̐�ƅ��
rݫ��E.0�K�"�Z��p{-2�6&��6���c�O.s��_�V�~��:{1�`tu�1>�M�O�eg��j�ӵ�%���u��W��:w�"��$�z��A�Y=y�P?�im%鿩ٚG�I�+�=
��A*�z�P�ދ�p�M����W(�$��)X�m�/��.DP;(�@}K�p0uyu�M/�iL*��n3�MT�~���Q�aKm��#���8���X� �/��mv"����Zx���mF+9;
��"�3<>Fx�7G��G�Kbvh`6!�7���.�Ȱ�@h#_��
+��r�KG
+���P���bTEҟ��5�j�R~-O2��[4��
+�ش9��j�
+���;�S��+��O����������%���/��Z���>�����_<��Ǘ?�������_�����~q?�ŷ/^|��铓�O?}���">~��q���?��{}j�?����rz�5���
�#����knD�t?Z�������クzy�v��XS�E8�L;�m�?����>�����&<��s2t��
+��zv�;��Ϯ�]��?���#�b�>|�;����r��5'�A[
�f��z�U�
�P�e�2�|Kȃ�zNG���|�@��j�l�ƈr`
��
F���<��d^��
��䱶�0Q&�
+�ÃE�|����N�MO�sE"��d��%���hy��x\
��i/|H��'�4$t-��+����Z�e0*G5���I�a�ؙ��2��po�8�
8��
9G,�ԌW�^sl���eW���"�0j������z>j�ǔ��y�ƃ�2p���Q�7�)��]�-�P�]k�<�V��́;��Q
i��[z��?x�x��)z��e?
Еn�`c�3�Ϛ8ۡ ݩ-� �k�Զf��!l3���Eys���E�g����E�!QqlU4A�]�����_,�1U7�e��
w
�XHT�����h���%Jf�ϛ�0
����0��
e��+t$�Y�tގ,4��/:��}����I�� �m��c��$���Ŏ�l_��9�o
ҫu n�
�)ez��U�3�;�
���#
+�(�qdg��e-2��e�@{y���@& 2��m���A�x5@�UCcDd��K}��Xv
��
zE�?Ca��<0�+0D��Dx�:��{��$W
<����'�BlC�l�>� �Ȫ�S�v*�dO`:_5ƍM;�n�Uc
� �#�:\rh=\xa���26(K�� ���_.��ӅN�
�����E�����"�q���0��������� �#܉_\�:.�o�=���u��'?%J��<J���]�T�0�
�
?O2�C1?5�����b�E�ʦ�5!
���pLB��̖A�u���Xy|`}{a5��$����o�U��v���������/�ho��C:� ���|z|���K�J���?c/�۵�Yq�����
�~2���Y�>�
6��iG
dJۿ4���!�/�Ɯ�"�AxEogxP73ޢ��"��<c�;l6��]
0X]U��I��%2$/�,GdH5� 13$�S��:y�
�7�I�X���,u�c��^�V�:`���& [...]
��F��%�z�B������
�]*Mp��R�/�����8�r�P�lkJIa
x�q0[��������˗c�n*k���PR�@Į�M(Tv�����0�,���dG9�l�ţ\U]�G]<F?�Q�R���r�V�nMw)S⎽��T
&���\�>��j_����9�dIa�X���O �������;�2Ԓ�
��Cq[V /�����.�����b�D)��ڗK ®�y]<�捥�[��
n��M�����KO���g<z
Y�{�5�8��iyr��<5�:~��:gїA>N�C�M�')�MO��?� �ل�І->kC]B�
��|�� 7���ƥ_���
�P�4�_C�Om.:�;U��x�[�*y�
07z
���XM{�
+�<��R��r��h�S8��0�KMj�;��
+<�T���On��MH�8�Wɹ� ���D���������>���Y����w�*W���Ώ�`
[�#\�!�V�KY/��a�C^b�+/�P�Y�P8!������ʓ�-��7>Jt�
A�f� >��6\�Z��|��`�|��HL�����>z��K)�
�&V����%:B�-�;}ؖK�(f&�fұ�Kq}
�� AX�
m:܍����|���&�(��I,)cl3um
.���zؖK3��9
Eh5���%���T4�H�> p�!��ö\�[
�CЧ\�:I�&��b=h���,#
Oͩ��$�P��d��q1d�%�d�����+١�l�aNɐ]yX��d
+y.����>Sr�|p��+|j&N�����R�.��Ҝ� -sl��z��m�H�osg��Nߗ+���&��+=�#���pQO��q��xc�$mX�S�;k�/��SrӮ���>�B
�bi���Z�{AIC�>��`���#�z�H1e�xF���K�tq�2�������|�
�i����}f�r�]��R.ش M��c�C��?ʼ,��
�f�ڃ���7�Qz&&W����ٯ�Y GS��%�gm��p,�Z�Q��4<��T�VVS�J�=�u
�y��+����eT�m�7�!5n֓�q�[�pD�BV�
r%��Q���'[�$?
�5��6a,�9J�SSǕZ˸cf{i�"
��R��3]�`�$vq�X����IECX�O\��
-�o71�8)��a�S���a�~)�Oio5�W�?� �PU�
��J��9l��lJ��M�ܥ��e58G�Lj�`L;e���J(S��z�����j�ڭo�����*?5�rxE��^q^� [...]
+_R���0�Q»��ퟓ��c���0\����� 4QP.�@-.����Iy�5����ލ��X
{�P�0g�/�M9D8��P�K�3n(9�M�M��gpz��aG�S⇿�^I�j��$v��� +�z���(�m-ʛ�a��@4���y��}���zQ��P�b,C�q�/>�N��<W�������Ӆ�;bL=]{+�Fim�����
^�n�~�}�Ǐ�6��+���^�����.6ҩ�RbF��d��
t�i_sdu��'�Y�R��Tږ����!�2L�0�9Ӫ�-����e���Gtp^���SW�����9)�`j���R<��
-���6>�Ԫ�Q��Ҥʰ�9j�;�5+"`/t��o��&��Ce�Ҕ�iwcAߺSc���+t'_5��-8g�d
+�T�z^)�4�dҴ�"�v�f�]���e��++F|�
�}�Fˉ��ڊ롍�yvK���;��2R\7��#��'�FLH��lZc�=k
�z�
�|o���t��P
��'����S��
-����su+�+)r
1�
���@�b�C�:y��X�+�d�vu�Q-�רT�.k~�#+u�(���]�"�%���zm%���Ɨ�cwҪ8�i�ix�h�=�i\+ޫ4o�[�[��n���p~�o;��cܻ.S�|/k�j�3�Bg�v�
+���g�E�(!kTd�8ZA)mN�봱�P�Ϧݶq��5ф��
Ó�������%#�,���5�r>x�-F�e��o�t�R_}+��P_�|��짢P
=�����<���I
����# ��Tr\��Z�
���?P��кVs=4M��G�
�Gu�����f��o��!<��N�(��1]i?t�&Z<��
+��.�Ōx��>���U�j���I�����W�v��D��m
����H���\���Bա-�a��_>)���C0�e`�KD
ڄ<n��I�\ַSK��Y�;i�)�� �Q��u�'b��s֮�.���y[C�u���=5�qO�XJe[��A"�O2JB������+�U�۶�D��?�%@
+��\~�y��&����͠%��4�Rdb��wfgvI�b��i�F��X��p��̙3�z;6�-B�Wo��2�
+&�]yև��{���O_ⶩV??�
ŗ��t��~��C�,��g���A}f��T����N�pc�mOX��$���=;PF��S��[�a�yЭM�[C+TvU�Y�����R��p�N�7b����@������'
?�[絽�f��p�|�#���&0GӇ�\"�e͍��N��U�9�O�������݅Aw�[����&9~�J����yH�L��&./�l�,A®�ra�� �)D�SX����W������ �o`���c zG�
ɖԋNQ��l�
��A�N�+<�<*�
`�v�
-
�g[�a2B��
+��A��.t�J����[
ߵXO�^��E�v�p���g5��V�)
E[!��DW^=��'
�S�J�v�L6�T4p��SG�
,
��*���#܊Ȩt��X�JG80٦J���n���d �c��meA�
�jj9dv���,�7�z�>��*3���v$+��AI[� r
Y�����
�_t���. Pb
+|�n�X�k+��
s��P�5 t)���_���a������
%
dS�*��i
��M��-8Q��0
�C��}�R.�P��G
#Il�}܂�E}�p�Q���5��P�Y�|ҭ!��k�`�����]�M��Χ
��q �Ӌ2��@��L��K�$�nC��>�
�vG��V��� d��X�M#/>�e]Rf\_f!puccB~�r4��=�D*�4��
�wK�<;�2PT�h�>�_�RX�#p��"t�����h_d� <�?p[��ͅ?�a��A�F#� ��J�p8`J�����Q�
6��N������B��
.���{اk��"� �{p��J�DD4� �[��s ��F>;@V!�
��i�*�n�n�?<]q��v�&se��a���+t� #�Z� ��F�N�G� h��ҰB�Y�@A��,��D���[�
9�xHI==DX��Bt9\��9��ZB�AuPR%,m]��!]�}<r��!-*�%Wq�aE<� [...]
PjR�m�H�bP�9:g
��^7$a��S�����B^��8y�
��
�jh
��[ ��ִ��NU��yQ���c�Ҥ��&��������b��h�t�ҰН����Ɋ�Ǭ���t� V�Ac�0
9�9FS@s5�V�
+��8�Y�@�+������"ҾR
�ǀp��J����ߍ+��!�>���P�n\��
�WP>kː����^��;�� ��B�S(��>�c\�h�D ��n}/�ۓ�a��z�^&l���f��zT�z�鞧 �����2ڝV��g��5.ɨim�ۑ��2h�o�/l��m�W<�ٕ
��V^�F���R����������_��EYoV�J���X=�^_��2ͫ4�==e�Er���''/.�����wo�
\��8�O~�_����e�H��WKi�ir6�������]���S�'�&?�����s���\L���U�i����g�e?�|�˛:K�y���91_�٢Lr:�&�Wi��e?Lr���^UcH�P��j��M���U���I�
�L6uV��$0*�m87�&y[&�p���`�z&�ڊ~\^�]ͫ�3�0��6 V;�mL�*��Oi������&a�����oc_&��n]l��d�K���̊��'��x�J�&e'����C�a.�ɘ��뤌�bt\g� X�����1���4�>v��3�p߇�%]TCD���Y at 8�m0�$�]��$�Ш�{
��r���<[��ka
�7D���{�V����_2�.�:_���b���d���$����*���r�2�]��̙���U�o�sM�u�去�q�;�r�]��ua���
w��]�(!q���.�.�7�4�/��GE�*�
+&��.]��"w3���M�x�|Nc��֝n�\-��d4�f��iE��~)d:��dFu�b\��+�
�w1.��p��.���y����h��0��c��Շ}���f��OAy[�I5���3
Ŏ��q�i��k��<N�1(���z�QcpS=d�(����t^dE�˗UZ
�t !)Q����2�'�y�F�(@��{�x$�z�.�$/Ha���8-�M��D|M��,z��ݺ�
w� jcN7��
����(�YQ���<[�b� �з�뤌�bH 4��� X����
@E���tnRj��YZ}�������@^{ �eZ��ʬ��A���QHF 8���aH���A���</����0���Y�G
�ߒ��G
�]����{.��&�.�z�M9�Q
�?#&�����
����ε>���m�4�F��}��@��A|I�j|�fᨷ����v5���F����P��__$��l��ŗk��?BBgo���5�����m�UIٟ��| �P��U���|u�UƋ�ތ���a�^�����"�u9Oγ�*6 ��nn�M���Q8T��X�uR�U1ڊ�iWC�� ���A�F%gN�!��4f ��UW�'��p
����<�����M2Z�$�=Zݬ,<�Ս�/�z}��0
+�E�btV�:uM�ss�˛:K������f$�2�WqvY���G��[9ˬyi�%H�&�$o����a��-�T�V������
+��s2.�=�`���ƴ��j���f{�ʋ�<m�N����O)�� �"
endstream
endobj
21 0 obj
14208
endobj
22 0 obj
<< /Filter [ /FlateDecode ] /Length 23 0 R >>
stream
+H���n�H���w��
`��l+��,k"�� �{g�Ȣԙf7�ٔ�<��ԑ�NQ�
K1$�,��]UU���/��Z�e�?���k]-|!�
����[����w
W���c��'��0}0~������$'�w��1~39�ʃ�
�A�
~k]��������|H�({�D�z�Ӻ~'M�]�
Vo
����%&�jұ<�xsV�ߏ��#��H
��Ft
�����HM!�)�p/,
�B�@,fLJc��Q�{JDE�y�š|�(����B� @�H��Z��-�A �G,~nA�ݬ�A�������=�w�ʭSz�
%k��tH��5�TH���[�?��̏��7p�ېEaș�mSg2��&y�K�y��
�O|�QԒ+���o�{L�#T�q0�,�NJl9�BVk�l�����<�Q(E�E�7���rյ�r-��<F<=:���"�fC��g'�`����`�WRIR�/�����9�!̡ŵ�^2P�g�$UP[�y� L+��mR0k���ųQe�5g����j]�l>�@�6�
+c
ѹ(�����煀�b��E������!�X'�;-��zw�(ī7� ��_��D�u��P�c�`x�9��G�CR����=�X��`Z7�@l�5a!���(.����n��Xr��p2�?��1��7��)q�
/Nd�8����@%�8}�[F�1=�T]�{�a�g��@0|�f��=�E�-%�)m�O�D��:�x�
�ˇ��8Fi�QQ}�oq(�'J|E��V�0��ؤ֝��[J�X�܂p�����ߣ��e��ŝ�;�(�X{g��C
+���B�ѿ���Y�ױ�H xw��
Y��ɾ��6E|����'xB��)�@
+��B�`�Yr�Cj_�*?��G����p�z/������
��>: .?�&D"�./g���d�s�^竻��(���@m��
D�â���]3û�V0֪�03��>cv���F�S�����D_|��'�����,��7Q5�
+��H��S}e��Z�2 ��^�k����_�o������5
�J3%�u���f.��#ͅ��'����C͂w(1���
�
+ at 3���r�`��GmT:¿�<�J{7�F��^SJ���_;��H%o�k�|�T�k|-G:~I������\K3�5��Lk���d�F*u/�Ն,
+C�d_D?J�1w sΒ��\���"Y�u��~��H�QSF��J)B��H�ѥ���g�6�P���n�#|5'5��d���T
+�+tZ��M������[��^�s�/~�E�rÓ��>��2!����d��Z�ryBo:W�6)�Tr��a�)� �%��I/���D~$*ەT�����\�n��};
shqm��4��i�B1�̖�
+j�<�4�)LJ=Z��\�N �
*�
�.x\rk����~|���
�B��U�
���Q
+Ny
���`b�I]^����TXp���w����<�A��
+�v!@.ǎ�|g���aZ o*��P�`�
JP��<�
+ at 3����Xv�_�
P-�3�A���v at p\;�
��f惡epSȀ�}�op�H�[IPe�0ܢ
�
+?�[`�k���Mrz��d�W'���L*x���
�T���ݺ��{�� >
+�|�u�n�0<.
�ϒ�%S������?�W
Jp�r�O�3vۭ.�N�'
)��x�^|����m��������:��>#���w#���ૹ����ńO�T���M�u����
C�m��cʁ b�_
Z!O�F���i�"J%�9
&�Q�a�Jp ��\
�Nz!�
'�#Q�̮����b_z�u��Vo۷�@0��V{�JCh�6(�lI�����H�V��i��Zs1:03��v\���x�#�w{�^b�,
+C�d_����ɱ���"�1J�)O�0�L�1��
R�y�
+�(5��
44� �%g�@P��*?��������@�^��e+�%��{S
{q C/n�|�zs�����4�SR��Y�ĺ^9J(R�u���Kj.k���fkk��fkk���-��4��FxfO�q�u�Rh�t���#3�;�RD[�x�
�
+�Bn,��Ղ����}��Fy�(�s/�&Q�' #�œ�8���1�K�&��0����A���qc��V_^QՂF�,#<OUi7܁-A�L�.p� 2��w�~}�B��Xr��"U���q!*�D��nN�d�Jv>��b���T��@�V�ߋ{?��\ 0=
nOi&���7p�qo��c
+��W�z�,G� Uآ:]R[��^�2
�];��E�HI`�"��^�Alj��lq���J�*�}�,��[�o� �O����K
�4>�1�̖�
+j�<�4�i���M
+f��� �Tp�����%�]M1��?xd�tFO'6�3S��U|�̾
+"֒
��nSb��]p�o�
�ސ"���K樄�#
Ͽ�f�rkL^%\/~"R�Q��
+#�ų�8���A�ӥ���^ [���E�|
1��|��i��I�NQ~
�Ҳ�?�c-|y��#�Th��H�"���×��\ޠHci�E0c��R�y
�f��!X�������$j̸C)4'x���#���{qF�rϋB[�]� 0���C+�2f���E"5�%z
|%��)a���8ܖ0��N����6G���
}�T�����Ms$mh�5GZ
�5GR�ds��pLs
�����X���럣/�ʅucFr�
�T��콺�{�� >
+�|��b=������,� Q25�
+��H��S}���)��8c����R{ґ¸
���ŧ��
ߦ�*�W��zlsȢ0�L�E����s�"���f�R����L�1!�τ�
����
���f�<�|��8�.jIvB��4
��ip���z�%
+f[Ck�H�lCU�E����5�
�ږ�sFf5<
5
fܹ��P_=�3����}I{g���1���lhk�ה��
�\�5Z��˧7m
�_��J
���C��
Q����+2�i\96s�¾�B
+��D��u˻�+r�����s���.���u
�kh]C�����hp�iE��7��� �>Ċ'&A��}T [�.L��S
+'��
+�N���ex7�S�����F���\�$79��͟5#eeR�����
+\
pً1[���Ǐ���;?��?����Vϭ`���Ј�1�3@�7<��eꥉ��*�
�w_J�.��D�o�8
M�u+p�g3Ze \�� ҫf�Ĩ �O�86���kAo�
�^�vj�F��A��_\Xz�KF��[ᩤ{�@�ͬ��T��
J�����hɇν���k�k�ݥ�,7D�閈���B��HKF�8�!�L�
�f
�r��?�?�n`m�PCĽ�9�թ��� ��G��U��J�N�
���F'G��&m���
/
�Qסp*7��t�E �Tq9[M���?v�6�a��w�YeK�7?g{X4zSПvj\;qĩ�l�XQ��jʆb�\8�>�Z2M�
+IL�X*�&(���nb8Ŵ.[���"�����ό���2)F��\
���1[���Ǐ���;o�_��K������E��l�Am�@$��B`�� a�y����O��5&�S
+�'�Q��C�RO6���9��8b�M+��GX��4�t��q�lU�0)�O)
����d{F��4>��Dյ�V�� 5wV�
endstream
endobj
23 0 obj
3657
endobj
24 0 obj
<< /Filter [ /FlateDecode ] /Length 25 0 R >>
stream
+H��W�n�H}7��K�
0f��d7�<�26��ă�'��bPd��
�����~�V_tCYJ���0lȥf�NթSյ��~�"�G�O�0�?9?
�;.���y��?�������US��� �{ˬ�YtQ�#�b�q�����cQw����D2���>q�%u&��\
S��vxoe��q�YdU��Y��;w,�����:����C*y��u'��c�I��p�q��K�wLz�D�\�&PK�/c+��%0�V>��*X�q/c��N�WY��B��i��-���/c�S1�*�mּ��;qȊU�e���M���|<��CV�1/�Z���Z��,Xfaw7�6l�@��ؔ�52�g�W!�ei�&�3��D�
fȳ�a��d�I�+B�vB9��u��
lB%�_��Y^��"��w���'��h�N���f{p
@:���8���Źzn�R��O�Z,m6qSUY\���SE��\��x�%6�eݖ��m��^�nsh�mP� TU�g�6������-F�����`P�N:����l���
R�K�Zw��Aķxf�
�ݗ��?]s9I�o'va��B��s!:I����a�'"VI�
n
��s�!�P�]G
+��~
'}p�I��$��#ת2�
�E�b4UVwf���o�^�P�=G�,�c^�u+�f�ZI�,Xfao!��0N�ݩu-�n�og�`�T���fX�'R�� �:.j��:�M�\BhktkF<�!�E6a��{R��l���N@�
lB4
��q�fЇicSFvX
R�e6���`!��ׅ�
� �%���zo1�e\&���P��[Xl�����ڬhV![|Un���o]wf�����g�
����ޘ'M
����w\�lb��6��ͽ�m�2Zv�XՁm���
4)�/�cQ�M!�Df5�6����F��-�#�b4U;*+v�ni�T_��g��M���|<�m��B_�#Ƽ��
$���ςe�KUM��2
�Ħ��yV�g��w� ����j��&q�����b܂, ���dբ*�]�жjZ���xW0x{Vo
��~�
y����A�:m��_g��z��l�
�v�Ѯ���l�
�6��/o�j.�{���Dz
*^��MY��8c�Ha�����ظalV���ժ^5e��y��\V��2N�8�,����w���L퉦L����v�I6���~\����@���\�j)�elE3��n��t�3V��/���N�WY��B��i��-����|*rQ~�����K��[(�K�피
4�¨�8�
+O���`6�8��u���O�=Z&.⦪���w�u�E�G���ګ��3~���O'8�&D��?��.��w������l;�.���ں(�\
Yu�H�\(���U
+ �b�
�E�՝+�ݭo��C�˲Ȯ�˶M��:>+Ȟk�B�
K�yעs�l��`�����i[[�;�B[�Y%
�Z��k�N��B�k������j������8o��w�Y��`F
���3�
Xd�_d<U'$� � ͇�h�K�]���:���A�U�v���+���k1{��n�|^�
s��VA��=�����Y��96�eG��DS&�6Pm��h���PiD
�a��J��H�yע���N�g�2
��z�7O��^-��)��o���M`CIS>�s������&1�99��M�xXU���q�
+�.K�a'
��D�
fȳ�aw�نf���vB9����B�7elר���L�,�y�G����F���'��h�N���^{p
@:��8�
���/E��rq��W�@��~�o��xGG�~�o�b��Ã���e�a�9$�r�\���O��9����C���Ki�?X�\�҂���A����'��
�����?�I�����XEn � ��
��hbF(
+�
Fn��h�����.�F��\�X?�)u�<uY���m@�Y���6bc�s
�a�4Pv⒐b8
!�F$�D���*�9���5e44���"?bҎ]�=����~i[�"�5dSц.�i���r��2D�ˣ4tᏄy.a���ԍ<f`E,2療�B���x�i�K<c�D?����9����
S�fpβ�A��B�-�P��žB �(
M �O�� ��1zXWV��y at Q@�= &
+�#u���&/>C� �jw�F *�`�:��@�ƠD�w��C��N�"�u�|H���Ψ�%�>�
�O�`�8�</K*)� 6
�ph�=� �3��+
��T�Hqh�@1�g
eDq2zlB�0D�\}n�a(�GM- }�
`$!3F�1�0�MC�y��͈���C`(��
*#�)�R)�!���j���FT�C� �W�>��>�Gq#�O=nhhԢ�m at h�S���8`��&4����Dw
+p�7�nZm�#��
��\
���j*��H �&��(a�ӃC�"
'�K��,��(���K�G���E>��V%��@��UɃ>�&�F�>
�!���� �)IRd�d��Y�� �%#d
�rF����WL�@���ԆUw��sq0A��@���hA��
g�-=0?�x�� �y[@BϰN��Q;�;k�h�@)�e &�z,AO���y�3#K7t�c�8D:
D�&�z6P��y�"�K�)"��B�)C���
+�����9 �0����
)�4~H�t���CEZ�\��:
+��G�am�22 �#�#���hL��(��J�����l:
~8���� vO���m��#S2$S�_E���q8��@ݙ�
Y��
�J��6$�h���c��Z뼎0|o��n$�:�:%W��@ڄ;��R����*�d�L��;��}{�n��,��^�9��L�S}��
'ܦ��G����y�p
�&��Nk��l@�
�̥m;m�H�9
I9x�|o��X�aH�"�9�
��]2q*>��D<�
m�:��|
o�e'�i�墕��F�C�LDk�<m�R��r�t�flv�
D��{�H�̐��4nجw����N�l=h�r�q�(ބr���;QSc���h]�)�nkL U7vJ�I՞�!X��ь1�
��1�
+ʋ(
�)k"B���@���H:&DKH�%m�zҔ��6E���Ŏ����
�T���-�;1�
p
s
b�pL�P�4�@�eLP���Bћ
p��b
+<״H��U���ևC�(�C2�P���[���j�^2��T��y\��h�
e
�nAp%jt��
e+�����5Qy��W?��Fp���v^2����d)g��D���J&-����f&S(��4&ۦR�m[�~����}�v@
���`$
cw����(J��8:m^ыu�P�_��I�s��)�r+��˕o���U��Ґ���%�XL�ѥ�v!�\^�!�;�}R�>բ8RC%��(L(��g*gR�.��9��cl�d����q^���$j(v`;�4�;R����4����]�ቤ�S�v����
�.��E=��F�v
]E(6��3@�Q��&֝��|��d�ˊ
�?��&�ʪT��h�<d����
���t݀c�ʚ
+��wS,}V$�R
zÎ�j���4�֛�W-E��
�����F(�f�@�k��WI�� ���1�T�}ݠ� 5�g�j��S(&IS 6ox�Il��xδ��@�F�Y1$�'�@Z��!��gg�/�w�w�������
_�|�W�������������l��t�����.����ۼ���x�NJͱ���@�q,L[o>��Q�9��)��4�I2�4���5����x���h=�hj�0��J�`�MޙbM�-ꖧZVU
����P|��s����"�o�sX�M��b�][r��#��U+�B�|B
����"�<�`��=��ϝ���I-o�3���o
:K���8�+��fF
+ݦ��LA�8\��B��b�
+�,A�L&��%�u��Sb��U?ΰ!0��9,^"|�y
)D��kV�4B��D/g�:�����%��a$#���o@#j&
f6G�u��D6���J
��cf,^�]~��3)I{ec6��Ǵ/�1�=LzŌC3ʊ��
D�=�A`XGY�\����î:L��a4O$9��)�3�1�
�7s�>'b��6�"cF��A�%�mLu�KN�ۤ��9Y��c�(���g�
?��8 �<��$�����c�
�� ���/�
��%ww3��b
E�v�
�����:��aґ-H�����<�����_GO>
����UFp� �
H�/�fY3�)��Ҥ���#�Z�Y�H4G��<�QygF����dž
��fn�Ű+��3�
�)Yrw���z�Ƽ'�
���7<7v�gT�YH��0�d�ݬ��5�l�Mڋq�J� ���
sBUu �5�>�N�J~���!5��sߡUڲ��N�;����;P�L��$�d�z��c/�{�%�n������o��S�j6�Esжٜy$���f���XC-�6c�41Hm�˩���v7
�,��
��t���rIe]�.|ȕת��9���(�
$�V�OR�v��Q�<`v�¡�
٠�>��nM�}���W��T
���~^��q�i��ƨ~�P�� �#���qVh���ڎ�����(�ڭ���ʧ�ՈQv��Ǎ�^^�bHa���
-�q/F�
��g��*��n
�kI��Q\�>�"{W�/�)�
u����
�ʚ�UI����ki���h�`-����������f����n�My���]����z����Q�M{`�
��L������ܞ�L�M�[��
�'�B��2*�h1r�v��s��1���v
,��P��^u]���v��ݣn��Y�����S�o��Q�$S\��@�T2Sl��f�̂�bc��Osqc��p�c#ǕFѨ=�}4�̞C�^�E���&ڡJ�ᨵ�ս�mS0q�LoI_���i1�7�k.@��!�{}�D7u z�D)h8
j�@;�����OބA�L���Q+3�$���9�EV:s��˲ �JCm
#�LR��A
�ˤ��4�:[��0��M���X��
�?�1�`e
f� �
�(���TC�L���NnlQCV�'�
x����LH{p��;��Kn�8
_<;�xq�{��������p����g��8]��z���}������v�n^�=\����;^�#��9��4�% J�3r�M�[�B`(��ӯyM 4�%T+u�\�E�mh5Y�š
���W������;���0'���إ���etߡ�
�6
Z�� �dOc��Gj�T����]�Բ��
}����Wm����Z���q�B��d��
+�����KR�W�"�po���n�:4ٹB�'�A$�w��Jlߚ<=����~���/�o_}�ys�[��������N�?�y���������/�����EX�.����g<�!��EФ��T�B�<�?�����X��B˯˿���Gl���d:tT��߷q
�9�(�"����ם}r� ��l����l5��\m��D�|�D�L����m����m�)��jj�or���ˏW��n�������/,)N���5�}�x��~���~�|ؽ����������<�(
�y�l��k&��1��<�˟̗[�U��ߑ�?�$��q�/�� ���V,_�(BƆȀ5
���gUWUw��c��!� `fM�����Z��
R��g�&[E*�
����������(��a�D�c�X�A�.�l��p���2�c���j�v���
+|���/���������9Ϩ�f�P�g
+�������_���=_����
����C/��^��ϋ.o\���f���K�z��5o^1o�6����
+e�L��
+���
r�9ܗ$|Ѫ���*ηC��b�[�����F���N����Q���P�
T[���5+צV�# �)a/�4v�d�
�
�2���3�Y$rĸ��Ɏ�:M��)
O���KEA
+ uX൸;�8AG
kDMA�N
J�wFŜu�g& ҚF�k���
+wؼ�txƎ� '�T��`L8lj��Wo���Str���l�9!����.U�@C�;#k��Qs�@E�ԫ?ٰ*J{�T[Ls��ҵ/�A�
�Ew���9�p�!
���:����͙N�ewm��1_�F�k9�6�
�+"�1������oa��9ש�A�l�g����a���H�.^[3a�
-UB�U�rMh�
�S�m��s��_hE���iQ��
�
�ʦ02��M�>�h�v0�m���*c�!eE��R �oO��Dʙ��kK&�q��t�ܐ�0�V�4���H�z������:��1��8�6/��y�m���j����Σ(�-��4��2��=O��@)���).�#W�x��D="���a�ZNc|��/��ͫp�P{\HE��sIY���F�Ax>�S��h���)lk;�wGMڢQS�S�8@���
[`
Z�ou�0�I�ӵk��L�#�Z��^���**��K�
�q�T|_`EǤ���lU�=�ӄ˾i6�
�}-��=�Q��)L���r�a V��dR��[��ڵ1�HA������8+r
l�Yn[.]
+�C�e;u ȩv���0\��쪆�T���ǚ��
���2��.Qs�S���
K��/a�a�-'l����G�V\�@
�;��Փ�[�0
Lώ�-4�𪎠j\sN�{=������6�V�������F���ǧ E�̘��
��Oqq�\7��'�@��ڒ�*f��*����xl��F��
�I_\UG#�>,�Rm�HC�Lc�UQ�
����t��{X#Ja��.5�3��Xb�r���;����L�#�+N���1
�a�:Q6xs=�[�\8��1-��{��JbE��s#�=-5q�
�Ț�ؐ^�Ո��Ļ�o���D-�̫
��']N�.^3Q����.����\
����v��A�n�8��Z�=�V�fV;��$uɧdD��Ք�w��<��F�!�� 5*+��-�).�-�-^;3a�ǽ0p��]R;���
�����&q��/�D
��E<k;��]
M�v橳&#N�h�q_��4���F�
���]I�rX
��-�)N���]��f�
9(�\�]p��N���
�|\�G��;ߜ�h]�:�.�6Y�\_�����/
s���
+g4y�
�D���ԖM̂
H��S[P�V�ݘ�ǭ+R�M���z['s�|����Mu2�o�d�x��H��a�R�����:�qRuH}_
��W��F�
��!:(P+:ٰ�
�]�r��D;�k�L�!�'Y� U�������6�z>�6�
�
+��1-����iøʣ�wM�U
�^m�ue����w�+V�%j
+���*��4,���9Lq��e_k6��
)(\���r]
�2C���Q#g+�ㆾ؊
+
+����J�~�j��X��D�p
��c�����S���qND2FM�r��г"����).�#W���u�=�X�x�CP_��x5�x����9V��
5�XX�[Bs���7�4�C��y�tE�;e_
ןC�{�%js�P����a X�1o9Lq���b��b��嫃Xmv
�b�z�
,`�9�~���dT�7g:@�b&�B`�#�i(Q�jB7cfI�R<�F^�b.Q��Xu�LYn�F-��X��ܖ�����G�?]�0��?�d'�p�e�I*�P_
EG�)���Շ�c�*O��F�q��dR���p4��K�
�US
vV/��%:8~e�a��R��͖W�#�������nn��~q�����7�O��w�ك�������y���Ӄ/_=������o_~����'O
�~7����|���k]u��w�����W_������F���������S�K/q�̗������ӿ_�{p���7�'z�i����X����爑v�ǘ9�P����U��Ě/��~Hq����]_��K��ߺ��뎏�p\�ܣ��?JY���س�#���x�;�m����&�� ��z�s���-
+-�Ti���"��qb��m�}|�u�����P�T��v�Cb��e
{�(�2���֊
l��o��6
�h�\��B���X����6�+�9t8.?r��$:��*
wo<
J���PC��R��v| ̬�� ���
M�e�Ps�=�z��7_��}N���Ώu2��ؽ�(�3~.tx��:���sehF!��k�
6u.� �Jś�\��x��lZ>���#~�f�DA���\�"*n�&�q^̍�q�F� �T�x �k�i2D/w����]������O�{���/�|��w�c�
]���J
���ӟ�T=
w��y��Ž�.菹�^o߸���Ew�
����O�����t�����/���H{���("�e��9E1�=���d܊4��sy>\�e�����iw<���y6�h�N'��D8�
���
X�K?D�zg"��cu� �^
G
�
��^����
S�k�ί� �>t�r>$f�y��&R�]D:�/&���{'��»��N��Fܶ��v^�R��y�T��@��|{uu�ω'�J%k�a��Zm=��{����"$/a���3�q�� �"
�h�(�� ��Y{�M �if�7]}��ռL����C"�j'8��U�r�n�^|nJ* Gh{5e��U#��N�Xܓ�����}�Fƺ��pox
?��B��x�/�O)�f����q�Ov,��3�N2{d�>�I� [...]
�U��_ׁ|��ArB�P�O���Ѿ|^=Zo6F�j�
���Q�4r6N���!5��<��)
U��7UQm^��F�hn0
�e#GeL�B�̯�6Hm��J�Z}dʝ�Y�<�����&��a��z6{
�F�0ÌI,�[+
��O��sA���a��7}�Y����+��c5�
��5Qr��iqjw��**�Ke�:�ʩ焣WJ+��:͂Vވ�w�G��
څc�G��b�ǐ�T��-'d�ڃaN(bM���-�w�[��M�@&�ܶ/o�>�v0/M!4U
,�YX��f{J9z����P��,�Y��k�,��m�q]yX%2��Pܲ��e�t W&g?�E�?b�(
\z
+�Q���e�Q�:^��l0�K�]
//��?!_d�����>\�՟�F&������m��b�z�8�,�>u=Ź�j���p�
��^<�>���"���IRI=�y����q�3Ec��Bt�P#~��B�A���.ne��F|���>r|�
�����a�}� ��t_ء#�e�_�nP)ЀYc�$
.Hl0`uW�e#�XT3�'zy�r�U�����S���jJ�4� J�.�0���&�
o>?�(N(��NPW��du���x�E�_�.�w�_�蘴�#���s_w �(��
�2M%!L���z��C�jnFo�(�<���41���lk�(h���[BT���dר�G�"�9�k�ǻ _��:��0�
�b����}��"���
��di��%h,�uDr�p ^iI���s�Gb�a3��a˜la������ϡͅ���7��r%�{���H)��{����vٓ��3�
o�G�]k�x�4P��2ד��t�aK�l���j�茾yI�qqz���.���Q���y�:��@�� ���У���P�G܁�zg\k,LO���;��1�
��jHiw�3i��G����T���ñ�>I$�QJ&�6/V��Z [_���2��D��_ܹ�
� 0}t����Ķ���8oP�ȝ��mAݛ��1oxù�M� g�b�UK:AT�Df�E�aG�J�&�5�V[Nw�b�)7\������I�8��A$����`�B���\�nQ�2k[��Ǵ�Aˆ����tDÙY�ú����&��R�G�����9����ُ����})��^cʴ�
3�)Zh�0V�-�-dY�[�Xd�<�Wd�h�Lw������i��� �τg�Y8���S�%^d
ڪ��R�mR)��7���E5�$
.i9�
1Ѱ
�w1<r�M���Bۄ�yw+ࡰv� r�B��(�j�c�#���^3
m�M�9����.�3'�
���~���g���=��M�)S��Ú��KPՔ�Ri[Fږ�(\Nz>��s�B8;�{��'��A%ZmT��1�u7�EK�����!I������|���d�J��z����Ɠ���H��r��X/`�˅�4��q��� �
�&����~|����?|��ϟ}�Z�����O���o
��Ͽ��?~�З����� [...]
+��Z���
+Iţt-���p5f
+'C��;f���ȣ�I�'�ۈ�������~�5
o�k�`���b�x+j����(fm��T�@���A��`-r����ٞ�P��Q
mS�!+��G�
�� �u�@����y��̡p=kA(��5���1�����d�0�!�^�}� ���{/�q���Ҫ��0�f[!�}�xC a������28�5mBG���
^�LI)���L��W
��Yr
�x��?��
����Ӓ Ht �(�cL7�lun@�q�$!�P;�p�Q��j���Jx��C��8�( ���j���B�l�锤�՜F�$�"YȀ��l�u��9;ť����f,U��(Ó8p�]�nc�ALY���tzۛ��Z�
���,���#����,���v�u0�n�r���I��Lv��;�C1�M����z
�0�Y�L`�z���.�m��5�eSz�P�F��$�&³���N[�&��5����I �O�E�w3X%!,�����ʬ�
�kMFbQٷ*A�v!�\�@Nl��5��Tc�AJ4����< [...]
���ݶ�t��:*R0��2�X��'��|�0�s+7�i#j{�ѽ���
��lms�M
[�A��U����j�^��Zس96 �ͭ�L��B�k<)�|��
+
+m0�N[��\�쥭
v5��:��/�%/�5yrr�,�v��^�0�]~�
�;P��� �J����Q{>��ݾ�C�������K^�
�yVC� Xfe
����ZY�u�-U�T�v�,���Y�
�Q�O�?^`˻��M�aL�tV���b�
R�aQ��歶fc��l��d
+ɫXG�.����s�0ڀ�Lƫ�Fnk
���}�}�;&�e>k��dh�
e0O�����"8��i�(�l�H�Ɯc
V�Ȃ4�`k�-ȱ��K:�ː-غΫ�
�� tqz�vJ>�?�UҲg�B��w"��}ѓ�E�z�&!F
h��K���]�3/��l�����KuU��E[���\K�#f��fY��ٹI5�"�0nIݲ�}C�<����e(���@2B�]�� ;bF��J�1jE�C��
ٓ��)4ov���
�ۓ�
�{�ڿo9�~܍/@T�jx(��}/��s�
+9�]��� ��5�u�&<�:��Jo�Q��:]34ѸIa-�
+�D�c�jɍ�gS�t�Ϫ��ƈ�:$�o�ȜT0�v=�gor�� iK��$��g1e��^�ğj�3�YS+c��*^��5i��́�l�ﺄ��m�)�2\Bøs#���}���sP��@�k�
+kp��VV��@0��7���2Z$`@8�
��Z�+|�
�y=8�~�:>�;�� �1�0i��������.��6�����S��/d����:���J���f�%)R���
��թ��.�U�˷�ٜ��`�jc}\�sc�
R�����h��5#^jF���C
�}�~�m��0֪G,Q��`�O#���s
�3�H�2��ԭ�2��rG�C����
6a����#�����z{av/�9nk�C�Ɯ,�U�f�\0��Z���R3��3c[��k/X~��>�v�o�Wp;u>�Pu<���FQn�n
+8N)}�l^E�a"%���� ������+�
ma/����v���h
���y�,��9�
f���g� k��x����q<;���E���i�1�T]/�
+�9P��7y� i�I��hP���l ���5�pGTuP�w�
k����.���mB�>�>6KhJ3R�Kd��q�Y�C�C��p��
��9M��i�X�p۾� ��U�~�8���R
���c��93�
Z&sݛ1q��� �)��a!�0��¸�sm7��e��^0� T��R�;n�p�.@n[FS �ezv�#Yq��4���U\F��9
63�ģA�W u
��t�l���=�s=!@A6�#�
+��N�Ϝqf��D�=�.
U10��b��X��e��&�Vl0�4��$�\�� ��W�W��o79��M��U����,^~4/�4�A��ex��`��˨^^6��
)u��}�Rt�7�\ �n]�2!B��[U��u_c�n��:��Vr � Wճ�-��
y�ySa1�
�%��o���Q&
6N'gג �E��,nI�r���� �F&=w�� F��b��z#H�#� ���SIV.��%h12��d�{ �is��-���
o#5�G h{ a�{��%���I
��t��BmA|�{�12就��O�e�W'YDr���Z����!:��gP����f>)'×����Fb�@�Q�=Vx
�{o173�t�x�{n�x��X���3�{�-^x��ՙr�\,���m�Q����W��n6j�a��'����Ê� 5#�����!�z�c\s;
|B͘zg
&=�{!����3��T���m��_V6{Gay�3c�C��~�c&�O1���`��:楫�pP��*��8�T˴r�6J;[tM]��
�"�c?H����}�0����VW�hp������~�B���?]����Gs��
#�<����|B�s������e,=�
���s�����te�>t�5�ܙd���L��
-�֒:;�����0r_���}���1�=�&�Jɪ
���>��ŗ������7�}������>�����|��������������W�~���/���-~���������:�����d�?�j�� [...]
+�
Z
\��
+��ɍ"7h�w|�b#�iNKk�mX&�>kJ� ,J�C��� V��W�6��O��m����H����>�*���)�~���
l����]w��[�
�R����@����S�>�v�0M�5L��ߥ�8��< ��1[q4Q�Ĉ��I�
=3�u�p�<��4�9%�Z���������
=k��邯<x&ye��� %u-��#}R]���q��`�e�`����J�A2˽�7"z��XJc���J4BKdrp,(���<��r��47f|V!h��)�
�,��
ۓd�HKl
�߷�m\zՃ�#h�h���X,�d�y``���-������
�x��z��7���Y����|��hw�)�� R�K=͙u���:e
б��ؒ�&u���# ����q0Z��i\Nɖ�E���dFl�������b�D�/��0
����\��
@)�u��#l���3��!gw���q�,�w^PTذ������ʳ9�
*�m�c>�^/G� �`�2`E�-�$n�Q�ܻ>_���F��\.��Mٚ�D��X.*c`�
-
�,y��K�f�
�l���P�~V��k7elٻ� ��
endstream
endobj
25 0 obj
13887
endobj
26 0 obj
<< /Filter [ /FlateDecode ] /Length 27 0 R >>
stream
+H�TWK�e9
+��T{x�+6���DM[)��л����TN^����O�g�%?����_��������G����1��Ƀ m��R`����%<�|��e�5�s'8>���Z�s�[H[�c^�,8S��$���
�����~
+�@ɿ
+4K���e��W�ͺM��
0�+0>N����p��7�v�5�>sj�=sk���у��*G@�}�
'�cLf?a��g���ZEސ�_m at O�:+6ώ���
ol��|�z=�C�|��=���4��d���0E���9�9�)���"h^q�I�6 s����e2Z��Qacɮ
i>� �ò�qyj�
Q1ܨ�ׅt��@�$ljV�A����'���,�«�HP��,#��5�Aݑ��,߳��~;�ux�m
��^
S�`��ςt�>���
N�+P���^���Ap�/
�$x�D
+kKQ�4C�-|�^�v:xʼn~�~@i�4��Qy�L$]�{v�*�k�q4Y��p�1���x��[�*;�>�=^gڮ���0�C�{
�r���~�/C�jt�ؼL�<
�t����] ��.?���
�e�8Oz���#>������p��T�'`�wC�=�����/�����CIOǘ��yEu�+���,g3ʈ��,C��=����5-{�Eȑ���l�� �B�y��ӭX�D|y�"dTС�C*$�f���*U�d��Omq�"�]M�@�k�ל��ˁw~�j�C8�6= h�8����C0�V�N���jy�SWf����1�S $d0�l>}�2�Z�K�ΡWN����}�}v� �bX�����:�f�_���qOp�9��ޝ����
,<! ��t�5�/�����0G^<@5~�rj
�.��ų]Z��瞹��-[���Y��v��r{@�7�4
�=�
Cx��O�^�-�%����{�z+�L�P�^S0��V�%#�/(�{mNƕI�
Gw���,gn�1��3� $)z���E���R%D����
��q�KU�w��
�����ɑ�-�5c���(pN��x\�kaoe�C
��،����D!ؗ1����^W��c�f_V�ꗅG�>�;�-���Q��>��~lr��\IRc<Q
V$)���͂f�/��Ť+ʦ� �h5���
�v��
`)�ˑ:K�
���:�TD=
+ؚ���:jf�V80���2����U%�n
�Ǘ��r?]H��@�$���1NK#��N�\Y� B��P
70
%w)@^
�=m�?n�������
+�Np����ƽV���&��
������\����d0�'A[�S���0��@b���sU&1�T�-p-�,����]�f��T*�~$Nb�kuÚ��N��P2+a>�l�X��l_Ց�h7��H�^�Z;Qc��V�x��HU#$���+�����fu�f�]L��j�����f�(�]�*
+���
�%�B_tܝ+;%m�T��7�}f�����k���lI�\����}�t
+����1����Y1ǰ�m3⩱��
����1GE-@�;�qx�X�;f�>a �Q-�9G�>�3�Κb�k��8}vW���0T��Y�_�,W�k at o0J0��ں=�
otK\"G�:��B=��Z���2������ư���X�f�,xg9kU���k�d��T4�; ���G� ����=5Z,L�ؗZAӝ�m
oeU�u��@ޅ0۷d��AN��s�%��$'���-ZsLU�/u�p�m(���
y�6�٭
��D�s���R_&�8�ѯ� o�Gp����9�2�Vb8����X�
tk
�Z���@��ݠ^��
��wɹߟ���3,w֟��ҭu�%�lz��:$|dz����W�Au/BƾHmK�ĵW����['+�'[ė�k K�V;�j<���J�\�jwAY'a?f�L��1A*��evV��Rf��o
ϺF_���y��'�&Z&��� P͟ 9�_�}o��U�}�6����q����mWn$hR�C���W��E�U�+�gZ�# [...]
+P�� ,.GXMr���E)4�O�>�Cr%=9a7�!�Y�$
|���� �*|��J �̰�-~_�9+ۜ58K����F�)�8�
��s���?�*j`��������_����:��P(���!���r�`�r�)c5(�p�n{oL�ji�H�;`
\┖WX�9i�ߛ���#�����|jP����d/���VFb1&�Z��nŒУ
+B �ݟk����B�kaL �j��ꖌʮ��ت���x>�����k8S`���*jJ���
�]�>��g3�<g,.ew���(������: �V��-�r��گ6�tr1U�hN����r9RTEf�������U�6�����n�Y�3�(7 4/���
aj���|��?.����Ћg���\WM��'
�G�
�����u_b�Q��r��>U�
oF�L�y������*�/��
+P���`�Eq�̥ŭ->/P�Ċ�U���Y�-H�S���
/�<�}
˃y��{�� \�`�E[(��nb��d�t����;��_R� �m�J�|�]�
Qi�����iN�(R����;7+�b��
�����oM?�^u��{�Ŭ�,�=�Ǻa
x
+3�b�
+2"쫯g|j at Hk�,P��0
�kxv/;��[H�{[0k��
�,Cm�~�Z�=�|Qs��^#��=
t-6mh��-v��!��z�>P����?.��1
w��)��=2�^cc=� �x^�{`:hr�NR��ވr&�d�Ȟ��V�A�"��{�V5��TD��*�
+��)�=>��Nr+����N�W֏&�cظT-U
+������,)?�Vr
+�P��;L{BZ�LJ��E�|v�^�O�;�������*���d�{X^b<�
�o�;��t�]���Gj!-���tM�~=��}��s�ӞPkyq��G�����.�
�!:���r��DY0I�<A��L*�$;�fc�1#� '����+t�[@^���BD����$�
w�ś�q�*N$i�6Rǻ�
+>O���[�y
�A�G�0��m _ڐ��v��:�J
#�n�]�#�7Cjs�_��R?9���n�QH�yv
3A�lZ�GK����n\u��b���8\G�W�^�M�b�6��E�x�æ�h�ڵ#3�,�e�C�}�o��VT8;�DSP��P����9���-~�����
���rh�;
���FVXa�8����|KU��� �i��11� 2��|V��Vf�㷺3��͎�
Ck�u��?b�j��
oջ�s4�jY2�
�Q�H,�W��c�垽��YW��=�M;���p̬����9k#o��{�)�,�o�ֵ����P�U~j��
+�b[�
��s���
��G�v�&��
�� fZ�E��t�Ǿ��^�F��Z
gZ>�r
|����WR�����ʱ��p�6t�^��
+OV��m�]؏�kR�a���0[��PWI�߷�@]]���>�:CQ��Ԓ���e�2��Q�F�^#1�xڡ��
�{�
�ܺ���ޚ�>:�����P-��߹�!�x�#�D�V?�W�}�塗��U��jk�y.���u�A�(+e"mם�|4��+=|�-�������
+�s0��\l�3V%)�Uf
+��!�
+3E��-�}��'p�� ��r��8i��te�>�
+����L��8����J<�͗���d�Ua�z[o
�_#�ĺ� �#/�z,�S�s�;ИR�CPTOޙ+v�l
+��F����2�
xd�G߱+���
�dz���[��+��uM���{�r,�+��{�\j=�+.�<P� ���z��]k���ͮ��S��.J(h��_�
�'+�o�
+VGZ���Blg��MXU�Ň)�n^���S�\��ej��; K_��=��]��Fl->:,<����if����*li[(6���#C�
+��"����G
P��-tKy��`����Q*24
s>*�錞�
����o��]�<�)ęXz
����אZ��(���f�;Amfcj}'h�(��L�
K�
��FW/w��}�+t+@�AI�QR�
� -�
+��Ң{g��x�A��܆��{x�����-�<�F�Sxa6� �1� HܵE_y1���V�� �itk�;�E��r�$�p�PLsn��0��#[�3NF ^ �Rm)��&w��"�I�ś FKp���{�U�&�VR ']B�k�X���7�k�����^5� E)�T���Y�13g
a����5=(��#�c��0j��hUJdZ�^�u��Hd��ǃ
<��Z�-��"��OEi��_�^���g>�H>��r�0�����-�<�����
�0���N8c<��iEc��O)/���� �|��:S�����ЧR�쑶a��9�?゚�+,�y���̪hh�z@��u��
5`-�m?�H�a�u(���_�8}
��{F�; ����~=�ȡ� 6��6�l
A�!Ehq���HdlK���se�H���N�ol�d ��\y
{��z������-bG/v�ag �o ��3NE
jYZ� 8F� ߈����q��|�]�=��
�U_ F��^6!�S�.����$��s
C�,�~?�z0A�t=#0���#J�����
����&�
��֗���g��$~+(;�(�
+�YV�p�$6n~���e�@�"�l"�ӓ��o5�ɭL-�x<��d���z�( ��! �=_�8�J�CP�d����5�����#`�C�\�ɿ�A孌���f͉�L�x9ۻj��h� U�Wʚ��W.g lC�|�@g�Q�<Ø��a�{9�`UJŧl�������P2�]��2s���9>�`rf�P���.�K2�d�
+�f.0G_M �Y~V�30ϔ!��.��`��kc wA-
+��W�?����%�u��<ó��~/��
$���t���U��Q�����_��V�L;�����/6�7
r�qo�&^���}D__�q���Vʷ�"��)xD��Z�p5 �PN�Pf{4}
����k$��4I]f XL#�R� S
��f���Q�*�\�m��=�g�Մ{��͏ta-$�a'����5:1�I
+S>��I �"��L�����\\M����p����2n�:�ҫ]%�N[в\`�i���S\C���@�0nUe�M����~\*c�-�R��dWA�m'�w���_A
+0�Md�I�z�}�X��Je��U\clIf�ͮ� l�X�U�T�i��^��ܤ���ͨ�
w���jp&+٧����7)�������D�1.�W ��,�{� *�%
'��{��g,�k�%��c��a��4uu��
�)��
�U�s5W� �u����V��u�8��VD���}����kAg������sg |s Y����=}}��|Z���=$���.ij���-c�N�b�-�'���Z��
+
�
�S �~
f���k��O�&�۔C'��60������
^���X �w�
��W�<,�*��K��Wܧ�:�
V_3w�
eP/�F
+Ԭ*wh�E(�=��̀[S�X�f=���d�;s�>�J]�qI��8�S��
�n�u�\yAt�~���S
��>(P����G��'��F������7����G�*.b�w ��P�%����6x��ܮ
x���-��t�sI�t#pGu��
�`�aV��Gd�s�
��6O��ڥ�[��h~gp�D�p�g��
�KAO�7� ZF|��ϗ�+dmY�
�}s�#�U�i=F��y�q���i�������\_H=�a�6�J��Y�{�Vmd��dJ�N-"H�[���
�@cd���TZ-ePt��k���v�[�XK`�4SX��"��V6z��P&��`8���jx�N�Ϙ<y��`�U�d��|5�K��(�}�� ϑ��
rQVt��(�"p���>��`��� �d��h<����YMã���n>��4K������Î��0Lۙέ��1�s�O��G�b`im�
�NZ=����Y���,YL����K��<�bmk/�蛦 [...]
+g� /~Y
����W�]�ʓv-s��$8kE�� �Z3�J�Q�~pVf�M���iuB�K�WpE�W]�շ��Xp��-V�����M�B
t�p��O;z�=���͇�.�F-�u� Sc��Y�d�1n�.ln
d�(�]e�٥ݧΦ�kMeL �)*3F})H>Z�V�5��V7E �t:�-)�1��xp����o`�}�`
l���>\`�<Zo�W,���x�������*���d��CS�{�n�
�{
+�U�Y��lӌ��kF1�+k8�7�i`�aB�"lc�u��
����
+>��G�K��
�6WN@_μ�.�|!�;�>7��f���K�[���\fn��5�X��q9� 2���f��J��AQ��ݷR_�: �Wk��k
��li�^�ZM�g
0�C`�l����
<�{)I
�[+�A���/�>\]��q�B�LX7���'����k���t�\� �i�Eao�A���t���m�r�k=�Ǹ~"<R�{�u1���VG��R%y�^��I����07*P3�Q��b���i��Z)�e��(��V��o
��ؖz[��0�hg���e�p���F �h5�����0Z���K3
)��ޔ�
��Bxs ����:a'y�z}N�\*2�6��Ղ1; \b�2e}ݩ.`?���3-:�kwE`;���.���r���Ӕ9�l閤��7�a�B�}߭���3n�Q^j
���)�d<����I���}\�<c�
c�y8_�]�P�G
_�?�>Qs�J�'@T��| ����(B�%��1�E*/*��n��� %���U��W�~�����Ô(t����� wc (��r����rFZ�|��ف�u���M��<u+�w߳t/A�\a���du��oщγȰ��s� :۹� �ɍ�e��Ƃv�� ��l�
&`z�XL��c<}F{�+h5�rR�C��l
��u��s��C�
ux�> fV*�U��(g������lm
�Tv���s���`����g%C$�U�X� k�m�i�}��X� OK�6u���zh����%�pO
���U�1W�
�q�CBe�G�}?V(�x?��Ꭽ��<��ٞ�~�
�T��[O̹��^.v
k�5f
4�K�
��e"
�+n:��`7-4���9
�iK
>��&��"D
U�\���
+�]@��ҭ`�j����-!d7q�;J�v��Ũ�C�]8#�5��QΈC-�! \!�?�~˦;�=Gۡ(��|@v��KSM1f���] (-��
��z���ufI�?"�r
:'�לF3����T�G92����]<�I
�a�n�>�R��CS�D�Y&-Ǵ�1^o=��@��Z
+9iֱ����$�c]�K"ɚ��K��ױ
�%�.�iy�5 ��?8<y9 at 6(&��U��'n/G�0ۥ��f���"�R�зxX
+^���~�V��Z��ktqJf��Ae�5LC
��S
+�#7�3=ĺ�6 ���
���ֲ�v
p$-�̾û�梗��ˠ�EG���E���\
+�V/N��#ۚ�Ұ�*��ݍ��i2 r�#��XF�g�i���!Z�7��h����R���O�v�-� Q{w�?�! ��\
�uX�Z�?�K�h,��_)�W�1c�*�����J �?�N^������O�� �-%�r�!��v
+9o�?���/�Yo�x��4꩕�`�FKy����&����|�&�
i%�dY�*Y@�Oq�#���+�d��M-�D����u��� z� �Z��3k���w����u1�?��3>��vZxL����_��t
ËV�!�;˟�0����t�O�������� �����v�
���#DQAj)Bg÷�c{�罥� 299y{�7�"��3��Ssl at q
�+�!/�%�D���l#��1���.�ր��d_���x0
j�
�tE���q
'X�R��Kc0أ�%�^���(��a���+E`�(��\��$��S�C~E�8�xT���90���:*��ZW�E[�rc)����
+�(CH��i�v���<��Ӓ�{�cMk �<�C&�m�3
����hAC��AC�'7�PrPE�;��p�p��s��ה-�T-��]�^"�[Q>N��8Y��VMM�a�a3�̨�C�0���&Nq��aDŽ�j� � �1�c�oA5B�[�8��2)�k���3��h�8�#��Է&�O_������o?�����/��|�����>��x������o�^���ݏ����/o
������[_����˧w\������@j`���klL�
��
v4 .�%�C!ML�+��5b�K
%/
+������9�lv��CB��ԌBJ>�*�/��t�7�Sq5^(D�C�xKi )h/�#*H]#
o<"���љ<��|��#�n��Mqo��9<y(_?ky
���"�-�S�
F�d�V���j�jv�.�F�ȡ
�ީw��I(�TV�}g1�Ջ��xG�V�4�M�&�n����#���e�W���jufq�t�W�C
7_I}q-�h4��kMX�^��"7���
p_��W���5��H���Kr��̯S
��� �;��Y�:;0;�cQo���"Q���+�#�M֦IZ&���H�L7�ν^�U� =��`�;{%=�D�?A
䰏Z�ጀ
V��&Ϗ�����73Oh@}��2l��
e#��ˮ��f[���*~1���o� ;�������p��z�f��ֳXc�-�Y�=� �Ѩ��a4c)N8�dq6�t]�@
7��
+zwC�'�A���be�N�0�֮[��#DŽQ�q�ۥ��n
�����Ίu�k"f�U��%L�z�\ʢ���}�є�\e�.5�<���h��iҢw�E#��J$7������u��;ɉg�
)d��WM��
V�5.��3v��?�;�9ޏ��`�1�sR����-S�-0�tC\h����I
+
�������f�
�h�;�ߌ,�b����d��uR�+��WVږt�#9ömE.m�vN;4��c���Qk�e�2��c�f�t⮡H����L�J�e4��@����zd�o�
C8�W��lg��a�2i�8r�8��7�J�/����@c�������X�kQ�r":fgyJ��9f͛�{d|ն�q
b�C��y�vQ���m�w��Ϋ-�D����P{��̥���毭�n{�u�+���~šs�,��8����!��5�I��UҷӲ�X&Wb0לG�K(����J�WM�
�5�u��
�h!Q��fS�B�Ei��}y�f�T:��Nw���AW��c�CZK�}�q���J&j�~S����`ݲ�V�3�c������w�nu�̫[�����v� �7��ƽ/��'�
+�)��tz^���q
.�|tV�0d��������z�����=;Ԉi��9��EϤ�ng�q��$:���E�4�>y횈�"lQ��p���5�x=H�:Em,.��]���`�I��F?Nñ�~5��,�1�`]-
��>�|5s��$�&�=�L�2�<2SQ�~�
�O5n������xѣ+��ˬ����pH�.���w
����LW�;<I�UB
��&�����ew����ʙ
l���t��8����iӋ���d_;ba�C������I�
+���+zu��[�ga�n��(�G�ǭ���E�4��
T�m\�B
���DWE��37�Q������Y^D�PNg-���e��_���_WK���i��'��Xk��;l�%�+c똕Y
�"Ԧ����FE�yi�#Gj3���[,Zz=?_�e�n�*k���1)�uuK�v��Z� b���
+M
�ҭ9(S�̬��Y
�"���`�k���$��f�9�\G at +j'_�ޣc�B�d�M��Ku�b9���z�ݝ��3&Ǯ��X
�h����+�ݨ��n�j�
Q�nv�6�ط��w-�rj� G�
�T��:W`�:&�N�3Z4;�m�W,���֙5�q��g
qX�ʭ���2�3~�F����_�,O�N/A��p��Y����'
�����7p~~m���H���
�x���^7�F$G�
��h����5O/VA�s����F65�Y���|h0��,�Gr1ڠ���ɏ�r,��
��\����h��W`�D���
�8`}� �,r����ږ�Wޅ�jj�xF[�#��m��h���5��ks��MV\!^�m�m��믾p8ڤ)f���+Ё6iIBFF����"��x�+�}Q�
���d�0���kg�Cn��@�vv �p�i���HS
+�LP�ۖ�Lfk@��#.�T6
���-��
=!+��Xj��^��)�S�s:REK͞
Q��_�
`E}Ժ��1�t�2Jb�Z���~"
5�\��0;�`� .>�l��bZJ�@�W�zo��׳�� ��*��
�|9$����'��
��3���Gc��H�~噆��ρ���)�S(��F����1�L�)!�3��!_P�m�Tk�p�%j�}~i���0��nCF%��h̰��#�ȧ�_����凷�������wO�y����o/^=~����۳W��|z���>��˛��?�|~������k~���
W}o<��X+U|��Y-����� y��7�+n���&��̔���Z5���Gq-IK�m����
�(���D&�M�a� (x�ʕzv0���=�O�㎮�}��9��?�;kP�O����k��(���|��Fh��}�ٝ�D����ѤE+���{f��������IN����ٙ�"l��#��:��5G���5�Y��j7�a�zb��kt��S��ً���NRZ��sx��J�!���RoP�
�T�_�ճC�')�@�p�L��bBT:�9���;���0ze�m
���L���O;�����ڟ���<�O�8*��
Qԝ��%�T���`�ӆ!R�]�O���%I�JN,�ZH���M)���}3���0�Ȝ���b~�H��]��<lqi��zH��5��d]������B�N��,Y�d��3��}���]Dj������D��~�Ǿd._zfb�e�z��i3�=�N"��˷�AVXo̝�O7�0N�n�QI\-%�O�u�_���{��0OOS�
X>�v��uX�Fl^Q�������4�vw?,>)
+�UW�J�q��~(Q�!
�C�w������I����ŊI�%������.����?��K��� �����tpK
+Cz 8M��d�s�=K�H
{��D��!��g.G�S.���XdIN�N��{<��d��2%���!.�W�0�{ѰX?�\��V!�%2���NJ��p���v�����
�g��iѿ�M%���#2X
X�3��
����1J�`�W�C�;5'MzuP�����1|
�6��B�wmݛHvS˪'hZn��i�>��g�I���������B�CX�=��(�RZھR�� �אF��^bՁ�q�C5��8�VWX�o�����$K
�+��
+�5ԧ�8���%T벰>�̟<M�.
�Ս㪪_�՜�
�!ZZ
�}5���
�q�d�A�`M�4
�?�i�C�x�vx,�3�:� x���sN����s��9v�ѸA[��!�\�nݻc��j$��q*�f���Y�5Rm'�Tq0���4M���6�s����K����}���
j,��_
+����ڸ���a|S���z���ũh�<<��8�~�p����Nǹ�^��7�̇ڡ��m��1��p���'yո��}��
X��{��b��v���v@����~T������#��������#2�Ϗo>ӗϿxy�G_`�_��z��/���������[����7}�˯���/|�/���߽���7߾�������ݐ��k����{Y/�y�ӟ��G��������Z*dS�0���V� ����
"u5
��:&9N�_���3��m�\�nb ���
6��Z]�@�a���j��)�+�� "%6w��0,��Y>���Z�xg� ��9kO�
�}^
��3A����v�UF"���X1�rHv}�\�i�
�}������)�c�"y�p�D4-k��[Og
_�'H*φ��\�b���V�:=ө31�<A�Oi�S��́s�.XF���/�
ܘ��i�my��K�ڹVX�y��W���� ��9�`�Ռ��γ�3X=<���(i<�5Uh�������F8� f#��7�J�f�8�{Ay�`۽������Zn X�x����w�Ћc���XL)��[�.Be�{_��8^س:Z߫�M0����RL�i~�yԍ��������2��L�#��H��+��
xE$D-��fpm�Q��!v�9��|TE��Ds�:
�]�x-�EƘt�ʙj������
},Ů
��*O��
C��tE#y�A���7תFݞH���m� Z�����3���n���
���r{&�l�_�:nI�
+�"E��
++|$��ajp�ݒ��A�K�ݽ2FF'+7 {�;��o
ȕf��&s���N_3���
nɩ�Zz���ޝ��okkЌ��jX��M���U7�I����t)����
��N�3tN
D<m�s���Z_�|U;�3��)���C ���ȝ=�u�S�)nrg
ia�]7�!'���i��yF�a��N�Yᐽc�_��GѲ@��4ul̴g�ly��~wcU+-\�g S�!r:6f>e4�-:��
jl�&\�jXO��
+d��2��8��|'�
������Rg6?:�)7�8�58�yxZ�������I��Z-G��Ͼ�l9�`�]6�Z�Yn�Y@�����!a��|Ip�x6'L�@Ӟ�H?�ƚ�,M� ��$�����"X<'K�p���`x��� 0�rZ+I�m/
���6�n�U��ڱ��ѧά�.��wг��*;pɝw> �=���gF��
��~��˛��:�'�:X`OV��ɬ�CN�aJ�S�#�ϐQEG�
2��HH���W� ����bq�T~'����y9 ��'o4��� ���|w[5�n�B�)�NV��RW
�=����s��5-}�d���|��.�A_k����wV+s|H����!�t� ����
S�?8�����b�4
pmQrNhm�!m��$���@���2��/4e�0���dL�K���7����Y<�탗�#���(��u���,
����{�^`[u�
,�;�X�h�7G��h�E�'ޭ���{
0��.�s�G
y���'�ɯ���&4t���U
�Ə��w����`f���
y6�c�u��+�t���~��
+�#��,�N�ɂ��%G��F����al�V�ؠ�<�V��3�4�>�<���c�ʚ��w��
5A�����
8�[S��*�,�p�mLbv�+�N)� WO�:��ׯ�`�3��5�:�bg_��9����ѕ�G��44P);V`����c��a�d֮�,.BN�W���]�[UG~�h�!�߸)���r8���n��L3^�8j���e0_���;� ��>���`��~���q
�w��"@
+r��|O�D�A�� R���h��H[�>��ݳ�w��"#���c��|�tWW�
4}
f��p\�PB %� c� ����-���UV�t���ԗ���oľF�����
;
�
0� ku� X�)%�q��V
S@/
�
+�6�c�2��ŨP% ��u�
��5fJ�m�a�FvM at HRR0SPF.V���ŃpӈUv����'��\������
l��.3����SgC�zQ�E�4*m���"m G�'QϬ��
��TE�`�MJ]�q� ���`�J���m�ۆ�
3��[�nB��ղ��>��y��&�j��y�(D�8GI���ݮ��@�B%
L�?�k�4
�*蒕JNc9�ВI����uEQw5#E at +2��
@�,�T*�n��]�c�.�dzY��x���-!�6��a�3� �Y
�q�R�
/Q(FG�@�9U���}��]�0���
���C����E�q$;�Xc���7ޘ�D��,�ɧ�;UGs�)GR�MBO%�:��$��u���$�F⣻��}u|w���������O� �~?=;~������7�
?xu�����<����>�?���t�~mm
���YJhfӍ�!n�}�A9:KP�I�0oW�@YhA�I�4I8���CH����t���\����
B�
�Z՜V�9�"
�*
u��
���bܥ�^
�#�XvMC�����={}{{~s�n��;w}y{?���
�0�M(@(��=�0p�x��
+�OE�,
C��Pdt���ѓ�f�i�D�̀���$xW
-2
+�6���dPu�opE��.�<6�CV��g���
���
+M'�_���
#a���
����紛NNz��3�7�<�^�W//��{~w��|zvz��5'��݇�yg���m<z�
�tey���Z����p�|�����B�U�� ��`Q
,��Uz���g��T'�zƲ����o�`˅Dx1��H�DA7
�l
�����M�� 5��/�B8��"]����b��E��aF�"�����=B
Z���q'bc�}��w
�G�}Ӂ��,b�����bÀ [���l���e�x�[,��Шl{��, 3 2��h�Р~[ �E�B1ׅNC�]����7�w��b��+�=��BZ�p
Z��]�̌��_
JtE�!�_I�n�������#l��
�9T�,J�֠?(G� ���/�
Ȉ���@b���ހ�V�a�P��ٽ0�
!K�(���'�
ɂ���j���d��<)
�"���zr8����Dz��'���L�kn�:_D*�L�Zf.��y8?C���Le�|�鄣�b���I/4�����;r�CPj|
n��A�LC��35�~/���:�V�FI�;n|������IU����f������t�����UO
�*#��9.�_��T���
Q4.��w��KA�z!E-�,�:�����LZ�C�*aܱ
��E��MTm�\�R7�+�fp�t�!T��),��A�
Y�TJ�-&N"�I\�k����b���/
(/��yӃ�j�`����
e�dž�v$��/Z��Gb�%1��TZ���.��0�;�# XZ]���[�&\X��U�� �4p(�(��Ŕd]�V�ѺSa���v�\�=��g�V0.����N?;������1��gOˤ�
CJe|
+�P�=�2!��k� ن�{Ԛ'[�QA��(��;���}�į�������o����7���p��է���cDN.��o
z������o��W�w�u�� �?��x����G����Am/�cN��c�_���?��?A�>M?Nq�v��?���y����^��Z�P+�
�m�:��l���������3�)������m��)��R����ov`�1�$�3tv��I�)A�.�
s��cǜɡ�5���/��T�)w�������H��o���.�s0�t�Y���ۚ����I˯�rp�s����.A�)��9W�����]~1v� M
�ND�ex�%i.��dumguO�Q�])��I�y����fl����?�8�s��*&ǎ9�8��I�SR
�"�\�b&��;H
r�f����P%b0�E<���4P���".��0�;st�j���V`�٨�
|���}%�$�r��;��l�xk��y�`�f��nOGw��!�\��X
a_���>)Q��SmP��a#졥<�^c��)1O��[�u�5�݅A5�Ҵ^
��De�SL�;����`;�<�"8�b{�<�d��K?
�;��
����
w�a���#��q�
+-����_3��Y
������s�Q��
����b�C�l��>4��x�.k��}��S�
R�!�`��*}�a�y7.�a��v�~
��Ǥ�+�
�<�h��FQ��fQ�5<Q�k�
+�:
\1��X�h��$��)>H�r��9�i�v'�X
I���t��&Z
e����f�3
��`�=sV�D'�^b9�=3[���
�ܟ��A�M�a6�z��5.�b;���˄b��������a�J����v�����qF��ۆ#E@��b�Z���c�܃^����\�Z]�eA���D�����ZE�D��t�@ʹ<��[8�X�]�f� �$EZ�z`�k$}�I�
�m��@��bݰ���g6�I���G�7�yz���TǃZ�
+E����附���Y�쨰�7�&�/�Оv̢��Z���-k��ȆN��Ȧ�f/�o���V/ h���ib��,?O�/\�7��-T�ɸ�{*J<d1�C��@ɱ!�N����M�D��f
�Iբ�A"�s�Y|mr��
h��&/\Z.�'B���jE&�^ cc�a�#mw_, �r8�:T���Z5;�(|/�?�7B2���ҫ����b"&�D4�0"����Z�{ϙ��
�bgֻO�������E2���:����=8Fra�J
t��=k�0��$~��'���
c��Uj8�H@�0_��K:z�Qf�bc�������.(�}��m�#N��'��z�R���Ŗ�ijj[���8jMK�V5G�I��5�c?��W�|�������������?���᧯�����=���Ͽ���|������W����O�3�z�3���/�������
�����DP���%��b^x�-���2�
<�>)�=5^Zۢ{��c��E�N��U�k�'O/���+:ŹQ��l� [...]
+�؎g
��*�T���ӿ���ap�q��1[t�[o�+��yE�_�
����On�1�}�?>��{?��{'�>~��������~����?{���翔��П�>B��
��~��z�W=ߩ��S�v�wyԳ
�
��lwz�7�˙��K�u��{��
���G'u?���xж�L�Hܫ��2��
��ƨ`�[�l |�Έ�ݶ��(����vyR�{[i�S�za��G�ت\+���o���Dw�hŻd
eh�qŻ��e�QнE�A\ZX�
+V�8e)ͲV�Q��z��OQ"�r���
GV3V�
#�nF���Z��(�f��
F�5� �#��LY�}�r�[E,E
-K����� �Rj�D�(�[@�H�U+d���vA{�s�
9;�>D�����g�gQU�7�"����S��&&�bJ�� �/*M��G��d������Q��}+Cu��R����@�x�M�X�V���K��&�2,�l��L]s������r�
+m���\�Q�Kx3.]I��ض�[��aE�^u%B�����K_3��ov[!�D���W!"���:Q~� |J���J�e`�"ĵ}F��!,Ҩ�>辀�U�8m��g^��`�xin-mz��5��3�x�
ߧ���7�~�p������(nn��Ks��}^�P\�{g�+���
".��[�|T�jtHo�G���/�B�VD���DEU������n�
>���
�!�8V
�k�����JM��F;-l��LH���3���5��I�u078�i$Mr^2��x�r����w�V�ch #
J#{��1SD {�b�p�ʫiJHO)�}�w�n1R���W�W
��{ܥdc�
K�av�
�6�a�����qD5#,��v�o�iH�%�\�|�R
�Z ]�6S���ᢌ���:�`f��H�����zvy���Z�K��^PB��d&Y�j}�*o��s(�$>J%�Fv�C�$���Bg�cWS�p��j
�hY��QC/t�/���@���v�n��� `%�����<�-�H���w����2�h��
@�f��G��:���D4]
Q�r�!!zb8+����ս�a�l��r�[C�����e���7�V.bdj��)*��h�-Z[�j4��-,
�\���C�������
J>�K�J���^#,J�D�%<�
(U���S�T��q�
��)��
(��F��9mY��Q�
Q��*v���
n�K?D�b}d��^�����sj�Z��
ńS��o�`3�[���y#
+���[&%��}��.���s�Ť�Y�:
ԩ|����м5���b��F�|xz�39 ���"�)�y�RM$��9Jo\��m� ��C�9��4|�&,��~��]�:n���� �Z�=���Eԕ���
�|N(����t�ˈsm�F��Jp��.$W�y�p8'��ke�R".�g��%���\�
+^V-K��JV�Ɇ(>@���l���
k�-1ɦ(�a ��.A�wh�'����ɨ�>�
. $O%��N�3�a�j�X��:\�p�����ԙ�y��D� q@畕��NF��k��
,i���&�x�NV �el��m�~
k��p �V/�t�:ڵ@5啫�z����w�Bl1�
(�6!
H4�2�<��8�z���1s1Ʉ���W�?�a�h���Xn㟎]�>M̕���"�jj�.�(Ƹu1 ����Gg*C
D�
�ЧQt��.�{��-S{D���F})oG���0w
$!��n�� �?U��<��)�� ��4QK����Ť
�B�+W`E�W�s#
�Үz0�ע�������;�
+ĝՠ��
V֘�Uv��~
���G��L˩��+'
+$m��0�̓G�I��m����ݎ�
h�PW�$��0�C%w��*�E
�y6��oA��Q��� (
�è\%��1������Pv����--KF��;d+�$�M�0�貹�S��h�唒˽u"���Β}5�
,յx_2�_+X�8<=h&g��ュ)�������
�4i�q��h�`��H�6�<�9Q z��z�I�!{G�
X)V�q s]t>\�9y(ږ��O���ť*�i�Y�j����Z���nT
+6��$�{T�^T�"���S,9�P����Ru˼�d�]6]���d����Y��fhRqD��awٌ
�$������a���@]5E�߃$�qa��
:��yb�X#��]�
�
+i�qb�5�&�X���p��=��Rn�
+J.�T��wh�-oLg :���u�Ɗ�� W��R�
�����kgLr�He����|4 "Y
{>Q�����bv rQ�L�
`�>��m)�y�
�]|���R���L�Zg��e�
�l�A ��,AB�,%��i
+($'ݳ>
?�-���cҚ��GG1E��
R�C���|u��l
/�I��O��u��|o�LJ(���jhlJ���f'���CҊ��pZ���N���Iur��4 Ez��B-
�1T+���fQ��h�Ex����Z�xj���
6��������=�GY&ʝV�g�z@:�M�H8�]����
�⑷��ф[^
-���Q�IoQ������N�'Z=��Mw;)C�)�70��:�9�3\^\,AI��$e��D�ȆQr�|�JϢ�k����,��N
4�'�<�C���zH�#�!�صs���m}8�P��(��B��`H�kɟ7u��4�'�+�;g���:�NcD�9�9�R$�n���/L�l��
$�j�iC �4����L
���=���h�9���HId$�,�G{J���=
�vt��p
N�`C�ɣ���f+���8N�B���Y\\"�I$�7��?�pϯ�\c�ĉm;?���t&���I۩����2"iiI�L����f����Q)E<��JN��)� [...]
��/�����m:궆�Ϣ��K��4�d��v*(�Ufl/�1�Ҷ>0!���,��>Z�8dz8�s�_�ͽ��"�o�FQٽ_1jg���vb�tܜ6M�rm���JSZ�?\jycP��6 �L ${��b �?,�w��9R�%Q���m��b�
t��d����i����%
��+�Cz�d#��n�.GiA�{ijQ7þ/UN߳��L��fO�� Q
�s�v�zv.
l��lY7�a�K%��j���'WsD�]��X����+��A ���r�ք��ikUI�#Rg���QkF�ʚ^'�����A�]�5;U+(
9,b��*����o7y�.�@�1� �v��)� ��������<+t�)$AR��P�%j���4I�7�d
U��ɷ�
hVR���L욞�*����ض��}ŧ�`!��o��T��̘�2�(�t���/��=�1*
�ֽ;��M�yw�P`�{D��,?�wM{�'�����pzr�S�Y���ˤ��
H�=m
�z]��(
���,�ˤ�h��T"�ɏ�i"I�a�zDJ"�]��� �Tt�<����
�^�Q
�ƹ��/���
���'��
V>��$�Fi��~ѳ���=c�NLy1���
[g��C������`m�ҧY�
I`pa�^�=��q�|4i3O��Z96� �V/��Q��
�gL��ˤnR)Cʳ����9OyuvK�,(��ipd�*��.�
R
���b|j;�yt�
2�2I�I�LF�L��\&����<��z�4�Q��x�U����w� ��>�\�u?�Z��K%tVl��n֚gl�E Mr�
�l0�E�;`dF<�Q�}xqģ���k��0Dp���d�l�k�f�G��[�j��F����'?ď
ی3�FX�Ԥ���1�t�$@>/��MR`��PZ��g�jj
<����vY�V`i�i��^��"
c]~�d���):`�yX]&��NG ��`;zѧ��?�
+=����$~��d��
�nzj�|�2"��GjEF����,X!���fOTP7˾kl���\k��Z��5*Ig����1�i��sR�;dx���.j����_z%¹�
��Y/ea�Y3a�y�� �cmڇH��t"I����_�'Q~%�:��H�����
�������g�a>�&;�P��� ��(�zL+qm�R����{�7�v�n��jxZ�Dj�LH8�7�%�s�1���.
�)�A���sds�7ߤ���ݰQ�!m�{�
FV�l�
+1��\�>y���h�4�uf�b�Șg
�I'��d��b�
�L
+�LZ���+ϮUy��~��L�C����\��(�JmK�@
�
��$�,_yv+ M���&F.�$��"Ab��>)l�$#]���lZ�h7HG���Yl�h�k|nv۲�t��'��祤�!���qw;b�q�.�ȥ�:���ʕ2��L�u�&�W�}
������0���zgOڡ���>��xg���bOY �Y���*
}h
+Pf}S+|Iި3
W�C��h��v��i�Є{v;y\ۣ�EӘUV�'�FI���/��+��R��P!_˔�%��E��bԦ�>.AM��x��!���R���:C�v���\c�����~`?^$�����'�ǂ�3F2�YמC':c�[윙�!�� s�
nt
f�T�o�J�8�x
+)����,�=�[9Q�I(}�Ү�Js�x}X9Ѿ3��
3��u^#O�&�ŏ(%��&74�u�ٰ�$͗��8�+������!�ЗɅ���d�]Y���Hu�b=>�ߛ-o��}R��#]�ٗf�=���yO���B�
s0����f��$���^��3s��Ԣ���C> j5��_��1!�+�-?+�*�K�^
g�]���S�����d�����т�\�O��Ρ���᪇!�;��\C�Ty�OX=�
�g&3�s��j� �:
�Ғ�\����\&';Ћg�����X
u4əN�ȇu�Nm�Z���w_��i�HIc���[܃�>�ޯ'�+����N
��
��kg
>�A��o�J>����V֨=g�a�!�e%
A$.�
!�dq�ZL��8e�� O�i��/�e�0�/) ��?V
+�rkic��a��F�L�b���u���¤�f��c��.I��],�fF*�X��P`̒?�(O��h(�����#�k�zb�+�i_A���O!��!��;���h%Y�pD>�@`���ίŸ@
+o��WY͍2�F� nd2j�{T}�D�"��B�Eݤ�#i*$�
E8� 0 �
g�
endstream
endobj
27 0 obj
22450
endobj
28 0 obj
<< /Filter [ /FlateDecode ] /Length 29 0 R >>
stream
+H�l�K�d7E�
x��?9�M��0��?mJ$�^څBUe^(�����X_V�ϟ���ws�/����$"�m-kq��L<������a�^��Z,FxD��u� �
���w��'�����9���@�ɏ���/�1�u
��
��K�/�C�����46��4jS
+����"Ћ�N��d�F��2~�/��K�o(�Y�_ȋ�b|%��b��u�����Y�3��"�^�T��릣���k�P���w���yG�>��H+^[�p�:��;����o�+7�-����*�
��T��8u��5�p�-ė\�q��W|Y&B&����[���D�6�.�EZy77���J_\�n�]+�6F%�~)�S�؇P���*qY]M�g��hR7
��C���B���Jd�C�,Dmq!�" @�{fq�
��2�V�n�$ƕc��Fؕ&[���:��R=e�_�C��0�U�k>N<S9Z��:K��h֕�T� P�J�z��䈶s�D�B
��is �
U>���Zbb�[t��B_\B���� ?�=����'XL���� 3K.�,C?`:�{��+?���
+L�7 ���E۔��
+8oV��"C�k�D0Ϩ�å���_`�#k+�+�7xA��2�����}`'b4���&
⚨~��$}��@K�ɷ���k1��"�(����X2�������~��p����
KȬU�l�_����,U5l�o.�7鈭����Ԉ���%�h�-��z�ԋs��)����
�e�5���ť��u��
5E�h,寭T��� �m���:�dш+�Ѳ������D�2���q�
�qZ�t u#���b5W���4O�Ƃ&��tZ�mn��Z7�!I��s�F�T��F[�S��ZL�X���i
� �zHi[a+z�u���J�����0�w���c'n�b����/���I�
/�2e�Ť�6����e�7T4d ��բ���qλ ����9�[J�?�:hdLW��Pr���Z#?y�
���*���)�m��
+��y�U�y�q/K��Nvb}�����&�t{ڢ����^;0m*5>���)Qꦷ}���_*�����h��Nעa����a��V���Fٌԛ���e��Uғ�Gzuز�[��Zu�i����
lr�r7���It
����hɸ�esݶ��AB�/��(m���HB떓0�W�F{6�n���:k�I�g�E�^��ޭ+�B�V���U��_�2@���/
�W��vq,
�yp���'7�Plz��B���-
�،;3���A�)8�ZMG��Rw��hH�w*6s_���%S~ͤL�$�g$��;
h� '
$A�3=����}�p��H�+�}-~���
\겆>s3���#�Ft���1�۸��Ι`��vT��x:O�"sK��P
+�}qeZ;�x1%3��R�
,�D���F�խ<�2{�A�
+�o>���1��
\�����#��[���T�Ө6h��S�>P⾲d�I�9��,�qJ���|��4GF�g|3�ys��)�:��3���@M��cS�*u�,^�K�(�n��(M��W�o�c�i$�O:�V������-[ђ�N霞e�,��P�+�ݪ�raU�Fӫ�f�
N�W���5�Iv�
��k�A���J0��e�.��6�N�V�xM�
��
+d����;�R��q�G$�u�D��I9��'
s����{k�@�2)��ä�g�P���h
��.�H�o
�
+6��,�&'7�
��G���Z�Ylm|�G�L�
���
ZY at C������-[�&�.��xy���j�|�Xx�=;J́U_D�m{��Ѫ�w���r|l-n
���G~�Z���eq|��|C�����]��-(�S��ͬ�$ vi�M������D��H�f���Md�h n;>8��ѹ��`�@,��Q�}�8��?=�ܗ��H��aL�
����~
����5��W �-��]
���P��\�'����D
o���A��֜�b�3~�^��H�~�H��$��1Y���5�%ߢ���N
+m�� i]���5����䳸|�w�l�t�_��
I7rg����~%z
�Q.��}_"�F�)M�\"�YE�E��KJ�>e�L
�^#\o ��3d^"�3h��nJ� \ϻ���݁V���L�
Q:���Qd�FU�8�X���j9�5R`��{@�d�kQT������ 6�I'l��A�E-�t}�F��d�E�;�@P�Һ�!;��|��.
+��
Ff�3��Sk��ť���T�� ��1�"7� ��e^����g��;ɀ���x��������'?ns�4�D�J�}O�z1�{�ʟ� �3楏
Ԝ�R��g����(c�L�[��
��gS}o�(ؗ_�P_��0��n�f�rI��ej��a����U�:�A�� �'��ɨt�K%X-�ƈ��^��y�cb�
<���:e�Ae1����I4��v�����W[o�}����yA�WY��%y�a� A� d
�V���
+ۈ����s���g��假��>���˩S�X�E��T�sR�L�I��
Nb�A�V�NJ,2�V
F�`9��!p�Q
+d��"�
�
�� ��z
�t�\�����)ɕ"똱N��|����5�A'����26��]��
AՇN���cʂUK����ZU�(NមLw�CS��z#k[+Q0B>�u��U�S�ED�Ex�T���h7�N���TZS��`�,�3ѳ��_��Ee�F
����UI���H����Au�,�������k1��fvA�2���1�f
2 ۼ(���ѵ��J����U삑��B*� Q�R7��rՋ�jzev�e:fk�1D��ƾЂ�dJ<���nyؕ,�IE,ms��gVM܅��n���ƶ*��r�mPs*��-�.&UOFe�t$U��2�)}[��%�njWA[z �FJv:��;��VT�RS�%J��}�dH��G.���6bJY�S\I
�ǡ�2����BB��B�GyU�}z[&���Y��r�q~ AA�BC��5�/� �Y�
p�epq0^�e�4�-C�
"�y�K�8�y�,�fټ��9%���Gǟo�|8��ps}��~���������������O��?�ty���������Ϟ
Mi6���?�?]�������͎J���ޣz��bw��ã�������ͻˉ����?��1J��%|�<��k�W1�<n_� ��+��g<n�}91�{�j��=��nk^��Sh�գt*y��;n��g������y��� (E
)���N�B�+7v�j#r[�#��Ս��+X�
c�$
�
7;t�M���� ��{������Z
Q&��Pq�v0kaV����m
ִAÔK�k`tp�� R��v�}����h'!��'�qIsyѥ��mc��6���%�(������W7�gd��s~��A������ٰ��s�0w��+�E U
+bA���c��AMC�#��nO��E�^p��
����F
R���q�!^i���W�n����'
�
���g���·�L�����a~���D�
?���O�����|�qN.��V�������^^��5!};��;����~��
�鉶%�
h��\ ��������AFܴvѲfz��� �e
+Ӌ����t"<}���1���$ux�^��G�3���8G��$��c�j�נx�[�J�=�\¨�e=����jLn�7��21ӣg�!�t:���tsw}1�I�g����ܴbq�&�J�ї��
�E�%��
2�m�R�r5�<bJ�
[�n<b��폧�㶛�n����v��-�֦��+(�����
!�iL)�f�
k^��ns�Jհ�:�c��ca�TU�䨢��
+����㩛�n�;�<����o�p釷��ݞ�����f��M�r��Ц<��&^3
8�
n1�-[ZMzŃh�q�^=�
���^�~9-�l��{��?p�$}�5����h�EY�����x�a��mY�s��`���u��e��0������=:38�� ��\{�
$?Z\�C�6@;�
�}�n�W�� �6d��Vvp�
�(�
�>� qE��x�+((
Sl�"ڛ�g��E)�{%�5�U�������%
.�V���
s>p/`p�i��EG�
�̛��]ױ�Gϸ5Uep1E�M�!um�-�HY�2��~l���� �
S�SL茣���J�
�S�^`H����ݦ�o��;��k�Hp�"CmR��� B���f���
r�x����
�:5�
{�n�1FL��֔
��w����l�况��n�Q�⎣�"6�i
�S������V������.����+ؘǸ)�=��#(y���e0�:���3�<��jaR����ʓX���5�w�q�)v6k�g��
,�@jA
���.W|���S-4�|��D�vw�
�ss* �����!x�6
�K%2��X
DzU��j5d� �5
!��`�<�佳CXm���A
�[�
�
a
����AtV*Q=Ġ��~$9_>�f����8�(%�;�l)��/Zq遫��9��:r�
�[��)D�P�>kq�h`��&����ī�.
`a�1�j&��1
+��b7`��2.�924K�\��֟w{L�>��+P<?��ă1�������l��G
+)rl���3v
vR�[c,-��5� Ck��%xv�
h����]c
"�{�=>+
�YTs�jL�
P�[��m�
E�rB �&K����պ6�
�0�-@$�3z(�Ƥ �>�L��=��Ψ�5�G"2�̷s��N3�� }{�o(y��!=
�a
.a�w� �h'�_|������N�'7}ّ4��KT���˳
�8�b3���wovu:<�N�
��=�s�������ջ�������:|y�Wzr��{L�N���vw;3�LgG�ҡ=Q�2���P��[-��g�������~{��� �e
+Ӌ����tק�����bR�SI��B��8�
T�fFY3�#�<���Y�7����v̎ϭ��s��y�j��1���j���b�
2x�IX|����
=�)7MS&k�t�A�u0�.����푦��C5$7�_���.,���RB��V-*ʄ����f!@�]�l�ڲ%@�V�6E;k�m�:�WA�y����8(�(��H�
�zP
�7X
�.��"
+�a ~j��{s�V
���$C��
+&�O,dS��E1���";K�
[S��|���u��������K����}�J�$��M��;
�ߘN��]ڒ��>���B�>
mI[Z��,��F�����n�I
��<fx�-�y���,rV���ՃŧqB��
$A119:6
GE�X�
+�ȶy�Lkl������ ǻ�$6�|NJ���[�gl��5������%m�6RΦ��FQ=�a��=�0]��Tk6�
N? f��Z=,|��_�am�
��˶��ts�@6|�O���W��U<D��o�p,�
<��Ʊ#$>�Ƙ5���a�}�Ј i���Y]?>Xx�� �^j[L�p+�f���Kg��!PB�Xd��+nt�{{V�
\�>���
+� e�\Ke��1�yPde|���&�f�;$,�/�i�L��X3�Rl�{�q�҄
�4�`�&q�x�tf���_���A���g!!#
�
;� La00
W\uRr�|rȢ1������u��p0�x0����G���h��S��E�xD+�
C�h�wi�څ�
�pE���m3n��8��G�b�����n
��ٵ["�p�y²�
V.rf�g1
ӹZ
��
q�QHE�Iv�����)�8�_�'�h�l�`�� ��Pig�b��cB$V�ɀg�y-�W�
���\L��Y<����~;��թ����[�,��980p')��p4ŏ/�q?�Z^��b��
�|- �\����u6�,��v����ۣ��jy�="�Wƽ�)���v ��u��F�q%Ug/��m����~��%ձ��i|��q&��Uu���oR�nnOW����ܾ;W�S�z��Ҩm�����kjT�B�
"]�;�e����\�~
ˮSy�h
� �DKW�}�ƃ�%
E/����J�X����H�Pb?��I�T:����+1R�A/
�����By�
����*�ǡ
���n$6������ �ՅͲ{�f8������a~@�Υz�^��ЖL���yzEj-瑖�����/.o��{����ۏ�?������ݾ~����o^�!��y����w��������?i���7juyuu��ߞ�]����㛗�o��������Fu#*O}�W�Q]��.>2� x����})4奮Ѽ�tH���ًz5j�ib��vs0~�I˱9��b~�����i���3�����cEm�����l�|�/�Z_��D;�C�ٜ�n�}x2�~��O��i�)��S'��́O���3`]�Z2U<`�J�yǹ�uO��[3T����
+�I�0K��|$FЙ�- �Q���q�]��\*0��S;�&8�±
[��C�{5���W�˭=�yFy'+�t�_7�TF0]G���T"NrBK=�݀�h.W�3����ԔN
k���_l[�J�J�Tφ0A!$HynO��As�.l�`�+��Ҟ�<����,)k�J�e6P�W
[��)w&�o�PB�F�3��.�"�
���=�E����[���Mu�bPP�p{�n�]��usk�-����[s��<�d֑Lڋ�&��d��F2;&�Ifbр���I&aKf�Q��ET�@�#GgD��pj��+��Z�'%�u��2Xٜ.l
`�&���
�<�LjVů��˸�F�(F�C&��}��������a�i�
ӆ�U��$�T���8
)w�W��Ћ^-�@AI#�[�u3�Ta
+�[n1X|�ܮ��%�����#�]d�ʕ�Z�Hފ�h"�
��Y��P"�Z]>�({
+^�qd��|�����6�Ġ�d2cd��w �J��p���+���
�<�\�M�6H��y�_dʩIf���xS�d�r00��^d*9B�b.�
@Ze�h.'N:�9��R���6�D���m
6�w���tw�Wn!X|Żܚ��ga�r�ht,�/Ai*ii#���V*K��R�ʂ*nAr��Lb�:�\��,hb�_��뢗cZ:7�|"7�1O���I
�|b��-1��˫m7�.��Xg)8��ű�9�4��t�M�K��\��%���4�.
&�!�2Bc�@�#��x
�C7ϩ�nѱ�v�I�AA�%m��wcl��]��p�a�&���
�<3��V�С��d���-5/�j�)3��}O�͛:dž����
���T�k]��f#�[�}3��cPPR�/�����j
}wk�-�����[s��<�dzV�3�"z��EJY�J*�|
.D���#
�^�۲a�1WF��Ӧ�m�SЍ�m7�Hw��6����²&?(��=�q!��b�x��:�q{���Ӱ�����|yws�Kؿ?�b|�E��/
|VN�����
^�x�����4|���0ƙ��>R�
�;��.�{2��Sw鶯��x���������R����¹ys��T;}�����s�?�@ ��?=�?����-�X�QW��yGk�t�%����yu�[��1���)�r����r
[�ϕ�Ӝ���ɿH0� D 1�+�
\�5��4&E����1u�(��O
���� {("*0�U�R�_`<�����.hVsd������%j9�8O.ψ;dFꁉg�.�-�U�"&�G
A"�swИ\�3xU�2�['
�ċ�2bK���6��H~��1mtɼR�y���g��\>(��q�Ƣ�z��bѐ
m,�S�"�,� "�0<�$��⣰ʪ�%F�ᇆ�,{
+
I���,C����\�LFFv
z�Ț8�b6m:pRjƧ�6I����x� �@<;QxWK8�h��,L��
+`��x�
�#P����v�0Fg~��H�g�i�#S���[伣:W������|���XC�^�X��G7qx0nܵ(_�"�1=���.���qaq믔����#�O ,�=n
ѓ�A0� m�F�ɔ�i�c�`�I=��4&�{�z���h"Q=5Q���~��zQ:��A<8O�B"��ɄŒ�/��Ң�mD���M��¨�(I�I�E!�N���6�!c'�����z�~�3f��5����<���-t��B>g���Eξ��C���Ё��#lm7?�IFp��y�Q�q�6�c��G���6.ez\�:V�F�U�<oã�������cFT��φ�1�N�����
�z
+'�d����P1�ť�� �{����
+P�l�M�_a��n;zjK`�?=�Z�U��"]�L��SРX�'y�L]Z[�lD�l���wwU�Lh���6.�t\�oMU�A�#�:h����Ա|��{j
z�� A�MX�)�y&y���0h���G^�a-�ݳ�Sn�J�=���<8�t ��3Ĥ��i�x�6�5#����/WA��0�*�#M�6:N|�)m��-q��P�os����A����Ѵ2�������ֲ|,���_1b1��2$�vwϘ%����X��sz��G��5 ��j�)�k+� �$�7���Df�V��
�
+�X��
wK'��������
+�3����W�K
�ݛ �T���N8|��
)�ڏ����u7Oe�5�e4��1q�7"Hny�ǩ�^�����=w�1$y �կ!�ō��m��.�� ���I!
Y'�ne^�[���L|Ҙ>�MÈ�BUo���P
+u�(�1�a�6ً��`�
� �%@5W�S$��'��������
+�T�� ����_-�Cb�o�{��4%��2XB��mp�`��jM������!�(^I�\5]Bk�ak��v�l�H��H� &��
+��&���y�V��� �O�s0��9^���~��
RѲ��k
���ʛ��W�'3U��d��� -�ۨ�S5���I
+)I%���~�`��?�{��}1�{�<۴�E#N��I)3��o�*4�2���խ]���x<�l��J��of�6�yVb�
�x���$r���bU�P��p�
&�<JP/2T�U��g�Nm�Yk�/He�t+(k�}XV�o�q�w� #�bNo�\WQ+-Z73 s�ߊ*��.nD�yI9HC�n��*
����
رH�S
V�xmwt����3%8�YY4J���*��jG�l$f>U�AL�8ie�������Dž�+�iS{�}7����tkgn sE}#h�!CR��O#3n�!�;K�!���
20=ze�yU�ia���L7�x�]SËQ9�Uq�S����&��O�~����*��o
�����| =
+�#+_-�����¿�ct�����nc{�[pWQ^��(߂\�����=�E'�'����洤L�r\?�Y�
��
�1�������n���BLy
iW�Vx�[Y��Gl�?���ٜQ�G&��M�;\c�
�Kqd8���y��Wj�c
���W �vE�
�o��i�8���^p"-l�'���Ի���R%��2��=l�w
��T�a<,���BC�5ɀ6�`��%BƮ���!���$Q%>W�4��Ր���m5��$>�J��-G�J[;;���|}��
�${Q�M�v}��x��b:��fi��W�
�� .
���b�.��f�8i��xz��<B�x�Qs찉s�=1��g��0��7ث�
��ƕL��t��Ʊ^��a߾����ׇw�~���?H������_?��g0����_?���_��?��ݗh��{����û���f�#���w�
�
ތ@��cz�e�]nB�=�������
�[������������/����Z�ÁU��<+A�y�p�61�,����XLƕɦ���MF�P�B������3 2�.
IK��b˭�'�?�٘*���j�io\TP����
��4�p��Ś�Y�D/�,��S=�\��`w�4^�u��¢I�r���2a9sc�]�P����uDr�����3,��d;�:�ˍ�.�i��'2��hLp����[�
>Wf<����9�7i��O�3���)
E� ��]չoR�Ja�
B��e��p���W�����*mȎX����^?��q�u7%,����,�8@�a��� ��M"�)�[J�sz0�a�eae�Hr:�I#�(I|
֣:��1�
F_˱�x�`Y�P�KiG��5\.p:�:�-W
�Ũ�I�a��?�<g(��x�}���)
F��� >e�c�x��=���zF�J��$����� �/�C�a.&KzW���/������x�a�\G��u�%�\�F��u�X<���5���b�A�X��8���(��8W�
����gbZ��|��N
���A�d�D�>0 �T�\�H�`�;��$�V�$
�_��2���ut��-�j�G�0���VށQFMns�[F�YHZ��2�QrVG`���#y��8>��c�����3)("��*���HH�:��i� 0
DV8�4�
]*G��v _����^B�;�"��t;(�w� !���9��N������;�&3`c�r< �V�&E��%HbEc&��Hq��� ��K�sǦ��l3'���GӺV.6s�6k�|�(}��y ���IdGR��`s�bd�)����
j��%�� f���W,+�QP�SG��0�����I�@�p-��v�b�yCK
���
���Lksfڤ�+�ȼv -w���=w(�E�u
Y�#&|���qM�� [...]
+�f��%���"�/����需��lŎQ`����Ͻܦ�� �+��%�����e��~M��$0e���8���d�WWwQ����T Æ�4�ﮗfK��u�
�o��� ��m?��e9�=��Ώ���[5�O��]j&}�-O4�{f����k�0���ƀ�b
+�ƶ��˶ծ�����Η@�tw�K�~�� ��2� �Nt"f
!�Z����
"xDB.���ӻwu�ZO-<��s��u$ n,
'�x8�
�^�kd �7
��z��Z�a<<;ě!�{��]
�Q���FwƇ���o���,�i�\gc� ��
��]ᤝ�9(�
A�cD��᱆^�
��c�Â�6�6� KϜbӾ�� �}
G�>�i;
�^=v��N�
����%ceat��w���X,{
�+͑��lR�
�c-�ǔ�|q�
^�y�vc�{��$���=eК�Z4��j�Bό^O5����ǟ�ʘ�����A0�y�
��x4��>�
��-+��a�&�e\P��ӯjv̓G� �Z4��J���ـ&������6m)�n�N�T���mB5.����b���:Ś�+�s'ꉹ �"��Vk���S(ʽY%`%^.π*Vs�7�.f�e��lw
+���
�9�N���/&HT�zv�2XFdK�,
� ��\\�v���0��h���� ��g���2�&�,��%�P,5�j=������7�e.�4��tK���K��`�!g�����l$C+G�
��Ͷ���X�23��$��&�NwD��������w���0�[����I��{ӼҬ}���<�J:�Bf8�戚��� \YDn�����^�
��Fb���|���
+�x6$��;����᪻���}�{�P�5��:�b�X��H�29Ƹ ��#����~�g�:
��`ٹ����ĵcv�#�_���lF�{)�JQ�#�2
�j��֘��PV;f^��
��a�����0��n�>(<E����g��s
H���k�D�IBm�yrc.��
�ѓ܁T�8*X�/l2�3 at Y�[�!�HʔQ%��������!'� e�М yЂ�&5�3
dQ�ƙ����\�H ;xA@�@G��:��\&J|��t=Ҵ\��y
�j;�P��!s�S���YD�8f#
��ۂ'�
ךF���ik�����V��t2�����}إ�������E�Z��![
+0��.��Ղ�*�kɔ0���C��HP.�`�Ao1�V�k�����,�Y5 ��d�ű�
+������=�]2��D�$��z�R��VΨ6;$5M
6Z��3�\��y��4� ´�i#��Ӑ��
+ibC�yp
+V�Y<����3
_Y9V2��\a���C>_�
mȦ֑k1A�w�i���1JL�baOo���ĵƢ6\���JtH���K �5[Lm���t0�KꞸ�a�����סl4p�*[�-h�m::���0�j)���/}0�
)ƚg�ч�]2(����-��+a�R^CU����[�%�Q�'Q�'�I����pY�>��J"����ەn.z~�~�6�=�;�
���������W?�?
S8
Z.\�N�:?�'�a�0j�����U4�A��c�%���P�p�lꂏ��Q��%]�A�a
+��j��|oH3m�՚�?̡�>B�!�&�1Ʋq�?L�S� rt[��#��*��R�����e�=9�n��|hE-�
z�`�\<�Y� %��9p��*7U}��z�=p��*�H�����=�p�@�٨i��J�=X�rz]3��Xa��;�a��sdtp�"Z�V�Q7\��p�Zĉk�;
=/��m��
+���夺D�
�썛A�Y�\S�0<�/nac&�Ss
+�$R]���[a�EJ48J�8��k<�o9ϧ��8����������>�~���/��>��ㇷ������^���?�|���_��W_=������߮�ç�ob�/���
�d� ceo��ؔ��kLH��1��_�p�̾�m��%^hq�ƕ�2Һ�(AM���9�
كo�?�Tr�4 ��Y�G���.�2�<���=#��� �ǜ�
�g(�ަ�;HN�zz
�
���_Y�pc��~�ڟ{`�
��_����)P̟r����]浒Pv��NK�ͩ��s ce'��y=E
>���pKq
�ⶀ�_1
�h�x�[���eI����پ�PJ��r1�S�`�)�G=4GYP3d.�8ouT;4-ou���~�4�H�!��
3�1� Xv
ED+j4�rffp�G2�C���H�4k�j���ƀ
n�ܡl?�=>4"�0�GG���1eFk�CD
"�R"�K��@����
��5����
���f����@�������j-�KS��
/�' {+n�ߎ��]� �[G��N��J��:��
�#�q6X;�ٳ�
�l�L0�|q8��*i]+
-
���4K(�k4=���k���*�ZcT%m��
+�խDv͢�h6]�&���:�&�0([=�(��s'Ԑ�yH���7^��}�xԾ={~{��'��ۋ���?^����������r����?���
�o���۟�Rn�b��_��O �^<��G����~,�
+�F�{��^
��F������QeJ����!槺�Q��p?4��.+� �����i�E��Aj�!�L�_����ӧ[
1�f�aok���{�wFᕕ�i�����%3d�~�e���w$�����,�ţ�r3~ԑR$.53�
I��Z�zS��&%�M�( ���c�Qj��X\�
`���6oE���e��W eێh<h��9�������z�i�<���q�G����mM�DV��s�
��f��\��H�hU"PL�T�s��Z0����m5�Ё�*���p�n�JH
$*�UBT E]FMI�LZ+�̬�tTk�-�n�"�[?����Ap&��Y�#y�¸��@/�r�ڣ�Wj��M;����QM0\k�(�[��4t{zl�j�dCA;�U���H�ap�V����t|����X)Ӽ۸�s�1 -u� l��J�`��|���������;`����V�Ev�$�0�+<!����S8��+�4����Ӊ��
+�n�Q�,����� �uq\]����^�R�J]��}Ip�b������ÁS�CK�nK��'(b�����؋��J\�_w����hg���<���4��K��1�U$Γ�b�m�+�+
���_Wmj%�om�W�r�x����KD�62ho�vR�A
+-`�3%���]?��.��B {��n�q���b�y�Ux�j�����a.���kZd<܆��:�Q��?i$��Jy�
+�cZ#
�%���N�����3>yTD7~��+��WE�CŮ�ַ�Y���f�`��
d��ڣ���\_��`?I��;[C���Yo�k����i0jM�
E+#����ҡ��w�1B}�,��]R;�H�g�*q%�&��
�
6�b]��
;96^L8����
+
�Ö]Q����S����E�s��N��g��=Z����x"�B>i\��x��R��qU���ەG۸�#mX���E�ͩr
�� �mP:�:�;� M�J��"d�*�g��
}�qP�N<�X�M���s�!<�n�����̬S�N��k����,3Ǵ��M��p%�h�\8��wv��8���
C;�8�|��Y�+�`���� 6���X8���
će|��+ /&e4/LW�$�� Y�&Nf�������{��E���
+o��~ٜ3=�:wP5�x�P���
¬P_%�亐��^���#}i��)4�������L�ѯ�rUOw��b���wWqŦP�l볁)3q%�z��g���k�>�C}�9Vj�����j��
+�\Y�(�3)�Q�iTh�L�¿�e
����/�ؓm�
+�T�VPg�bM�
��e^T:�3Q�
+��X�֘�Z�JiV��_9渨��#��G!B��J�
���TG>�
Dy�`�(��qu
-|�����R�F��cߌf;�pe#���
(���byu���6 ��>ֱ��9JAԢ����mۖ����[�?�T�Q�r�E��Ľ�g�=X�<�t �s��ȭ
j��;�Xe�>+�;���E�K��D������(�N4+�w�P�2����Rf�(-�T���@C�O<�)�,F����]�Z�r���P�#*;u�;x3?� 7��Jn7�
���
���b�+O
�+
�)^����(�)�H��Om�ao�����r�����:�m����TFb
�ڴUr����V��A��
B�����-���W�^a�7��hت✢ٌ0��Ì#���5i��"i��%��pI���7�_F�)wP�z�c~7�̺�l~n
�"\���n�˂"�����Q�8U�:j�'R3�2���+�,����^�u�
���7-P��Y��F5ސ(vw;�RE��UE8sIq^�Z`_AG�hP}Bz G�p4r��{�64�tq
7���o�$�t�=����b�|�
L�ﮇO��`�\�L��RQq��Y;�/R�&�� 1�f^O
+Ϫ��B/n/�(e�,�
�$�E���\�"vAg��vR5:�e
:��F
+Oa�L^�
�l
+�Wm.J#u� ��Cgv�S��%
+��Vi
~�g���ɳL��-�t��I+:�{
!~���ٚA1ݧ�����VE
�
���b��'���8�E�� ~��i�
��]~}�5�"
�)g1:lV�E
'����l�a�;�[�Ąv�p��
*l5��=7l�a�t�:�sI}�S73���I�ҡ� ?���Tk�9ʀs�z��UN}�o畝��F��,���
��+J��E�hZ�� �X�#�j�p��
[�O��w>_n?�'gh$
�<��k�
���ILr��z�sqfs�,���1�`1B���H�
����#�$�0��}�&�a�0�t7{�(n����������W�1\IɁ�P,��#�;
<q>.�g���+���
1
�T��,�f��
�
^��BIˋ��;@Q2��3зB��X7\����Ν�6
ܕ"О��)Pu�B�T����x�b'Ya��Sgx�Bc�9�����kc|
S�1�R9�zs�ݘ�
��S�c��S�=�20��'ᅍӃĆ�I$A�o~�Ԙ��8%q��5��:�\7S��3
+I!Dţ��3�A%*�)��j���xF۽�q��mη�
N�
)<�/��q�v��6�3<�'�cs���n�G��[[���>�T)DC�D �!Ae�,�3
=!8�+���E�O�$K>�ʋV�2��`�nz��5�UC/���wʟ`i���#��ݒ�c�+�b���jjoL\����V����P4͊F�]���ͦ�����T�'}�����%qhХ����f�c�y�����.��AO��)�
/[��V?CsU�����p�nr�M
+d6�[G��pD;��l�C���ރxT9������4�=�A��(REs�s��i/KX�r��G����^��v��pw�`�0�g7���x�[�&W��c�w�
����r�a��u��P�l,�ɍ�Q.i��Bn��#�&�=>��>�
��
ڹ#�*-�[j���P!�;-��q�(�.�E��w�sN]���c�Rm��.��r
���J
�G���p�a����\Z�����k�b8�\��*48�R첮�T�8_�r��e%��ɬ"�S@�R����/��I��E�#d����u���2Q�x��
Jm1�̒�!�d��8�\4��#����$�Y�s�����.��n��V�z�5U-�~�/z=4G,yQ�sb�^jvmX�䨼
�W�kK!�F�Ri��u5!����?�WKo]Wm��%���� Y�����G� �Ӡ��F Q
Q9����R�*�O� � #3�� �°L"0(���=�9�y�7ε�J>V�o>���{�Z�c� �s��T
+I�˱�U��^Fg c���55O�����ܪ�Ĥ�]���{��n���=��*�J��D�f$���n
���
AZ��qNM6l
4>Y���JE�q#�j2e�}��Y,&��7�J}Idj��lj*�����a@s'��$���D50��7
Bk(Q
�5�Q��'��R�T��S��k����vO/�"���� ��7>�~�np�����s�J��k at W�
��8S�v�뽑�!H�G�0��2'y�"�ʮ�wLr�� �\��$��Ҥ~����g"���jHlKPX�$���qJh���r��|R�5���( hD�NO���|�����ͻw��?�O��../u�^ܺ�y�f�xqc����[�wn�_��8sj�{�ǜ}�<�����C��KӁ����ɼ��7&�[\�V/O��oܽ����
��`�#�W�c���h`Ж�4�O�h��?|���y�ӡ��5�����k?�{vx1'O?�*]�9{6���URH[@
+Y�4$��@R�?|�<���S�����7\;M �)��ˁ$�R߶�L�������� 2"C �h�G):��
�y��ln�]�u?����]��a��^(C��~0[9�zch�dL.�B>B~�^�<�
��AS7�seT�T
/ĽZ��a�ĭ4�M�15
��F8��ݤ���7U����
x743I��
Y<Bm
G���
9d�
;e�2+�� 4�@�VùP$��j�R��[P
4�Ԁ{�����0�P� ?�
��sb~$�[z�]SP�k�}�`#ѓ8�� �E���8�
�Df�%��M�1k�M��0�Ѭ��l_���^�9�5��5��3�Ws���6��,�d���]b���B
+���H2u���R��$a�C3�� ҂dg���>M�u2�wHI���r\p��A�
8(�����뀻�� ����ܞ!��y0��FV>B��������Fq�X�����%JH1�t؞�
�8`��4�*%�7څ`�j������˞{F�݀![�����5���֜E��H�=8�$
+�1_��f�T'�c���&�PLԶ��`@�Rx�Bf #Ո.d�I���v��}V#�0��R��AP�
+��M�
6B�D��!q;��D�6�P��] ҉�fy�E+}.
+&�
4��֒3�����\�ĭ��M�Had���S�²3O���B%��v:�1W �Ťx�2�>����S�bŵQ�+�
+�����
�����[/�
ږԂ����V�ʊD��s�"��t9���XQ�j����/�Z?eE�7�b(
/�Es-�8�P#�J�V�Ň�����:����m���È���^��caav�3{+����-��8��
�/QL.*�Q]�F5��i�rQ�,m��9k�b���88��)@I&���P��Mq���^�
G$�%[�꛴ ,�\$It:�9�,��
��8Wr���aJ
���-�`����3-��7R�R8R��Jn�Ɂ(�
�83��L��3�Rrx]?;^ Ģڈ���Q���܃6��u$��*!��p�^ہ���8�١���8`W�Dk��a$�Y�D��*�"��� ef|�C��8:�� �3ϵ����d��(�FԲ��
��o�A���Zu���
+q ��OC��f"��lG*Y(&ZI
L�4�R��F�+�-�5�P ��dr~�Qj���n��
N�����P8/ �`"Eq�=?�
�`эE5~pK�x
�]�E�YbL�눜2��XU�jŊ��K={�����\�#�b�"+�ӵd�D�i��S�C�y�;��z����LV�Y������a��3��ajloJIF�
+^� ʹ�u14/-�@IpkNi���Z�h�~e�.y�͝�Tu
U�
PFuT�{�
>]�br9 �
���zSj��x�/�
l�#���J�N{OǺ!Ȓ�'Ļ��^$�5��Ȫ�V�0��a�'�&f�ۍU|�<���*��9����D
/Ǘ$��q
s�A�]�phe���6
�V]v-���聾CR�A�p$^�����MP�9�
+� �8�Ũ�SU���!p����9�a������DGR�*�Ac���V�Ft�ߛ�D*%���TI83�ܚΪ��0N,7*)��rZ��0^�)�Vn���~��~/Gȉl��qQ����V�m�F�J�
+��ڨ(e}�I`���k|���I��/a�D{Ә�/Uelk�-���ykS��%�m^��nq�[�<��4YX>c����ܸ������&�8�~s�N
-^�X_�u}cm�~�|����K�y�-������G����=�|��
j�(�a��$��!�%�����=|� b��}����nL�
�_�'�2k����Խ ��?0Ҕp���� ��8
+j�@>Ə��$�fX�I*<
�U�6�5d2qg�����`pn
�����^p@����N��9��m�&�gXm
Sd+/8�s�*��Vo�ˀ�F�5���T�WOo�Z?��9k.�=�Z���Y�aߝ�_�˖������DEf�[�x�
+�0�,��(��1Xx�W=���v��� �zf��)��g��}N��y� �
�� ��4 ������
__
{`z{
+`� `{
�� �4��W��0���]�>+
�y�W�P���0���0���0v|��b��)��f
cw��0^�..�+����g`w0NL��{
�_� É�]Ǯ|]0Lc�ק�|z�/���G��0_v�S��ݝN`���!�W0��a�
+��a����؋է3���=��1�s���d2wd�ч�.��pt���C�qle��7V��摝 �
�����~���7w���[���?���_~��cs�c>|��o?��������{o�0�[���8�'����7��Rc���O��
+���?��ɿ����ʯ������Ѫ�I"��ޝ�i<�\��a��-j�9l .Ö�@XN�]��P7{a�5�����s�(HvP�������;4y����g��}?�8k��w�N�dWM͵hkkW��~5���1`�O��#7�r$������@��U���� <���|5�=��M���
��n����`�di�e�������c���?��hTx��/n��wN�~I5ǂdv�Y)
�uZ��u��:gj��{�̆�-8;㉹^Ac����>�i_�
x�(���.>�n2o(c����a���g�K�:�����[r�E�A�!�� :y��tq�'�Wd����j0"���AB+A�9Z.�G"�h4~��:Q�vg��N� ���#���ƒ����ք
�jk�K� '�P��:{������槌[}N
$R����a���2Ս�a�ʜ�W�M獁��rڮ�C�Y�l�oiz%[��+Q���˂B�э�m�}��1�Y��V,>&�K�1T���D��FLA [...]
+P�7�A��r���@����>�`��ټߥ�z�����_�=�K�T<W�PM�w�<�W�YfҹB.N-N
�m�e2f�҉D,Lyl�Ɵ��d0[,�1�B�䓃�J*gWz�fC8To�� �P4W
endstream
endobj
29 0 obj
20605
endobj
30 0 obj
<< /Filter [ /FlateDecode ] /Length 31 0 R >>
stream
+H��Wm��H��H�����q�n�;ѝ���&�!ٌn�5�
��Y��~�Uw�`��
0�;]��]U]]Ou��?�gg��{�^.ݾ+����(7|�xq�tU��GG7咎���mCPpJ���K��cj��r͡��t��ں�1�R4,��N�f�QBM����@�
KsLf*:a���m���15
3��m� R\,t
S�;e�#aTk�V �k����:�MuGXG4Fm3�nN7� W&ݴk
ۂư�<'��r���A�Q�45�����9�j�iY(��N���3Z/snjiN6�i�t���
�,
�M
���p�<�9��SO1����Qf���v,�DC#D��D��,���<]W��V8W,��&��f�7u3GL����Ea��Ď��6G�ې�
84���#C�iTW>�ä �5ؘ�sogw�F�\��ďB
O�kȟ;
կ�U�XG�h8�&���>��0r�*z%�ވ�����ibo8t�4�,,u8W���2�?��T���r����n6��F�)�G�(�H�)�I�(�ʳ;�'���7-����@��S�U��˜�sT9�,U����d��]�,�� [...]
�@��0R�����jK�bCŭAm33���5ԃ07�f1���cן5#��2J2�@p�g��O�~>��!�
d�'v=��rdJ����,������>kf�'��E@��~>�����@�u �v��'�=��ӽ��Y�� ����p��ti�,��:�>�b�lW��@3%
�-1�@���x��$�l
{~��x����uU�,�O/a�����B#G���Xy�\7��Ĕ�o53�&O��c-s���ϝ�
�~�#�L^�
+�Y�qe���G���͕�<��l����$�/���4�Y��Ϥ�0�
Q=
���p���-aG7��`IS5`6�?�F[A��
gK����\��DL
�`UU������Jc'�\��F��|C�욘='��w�,����+�n���7��GÑ�֮�@�^����Q䪪��̫�ep��=�l�ݚ
*bn
<[�\� 4
+9��~��x�(v�\W(H} �Z�Rv�Qe�
Jv��������
�
a�{�~�CGnx7J��{z}��K�2�_ہeMOT�4�.�za�u%�
�f�7����qR�x�{Z�aW�W�\�z�7�P���!_�V�
+oG���n����]c�$1 ƀ�(@,�N2��
gv
���O���oG?��<
��a��^o"lQL�b�D5Q)~B�~!eO����я���@N��q"����X��5Hx�]JX�$�!8��1Ơ��x
r���C����lV1W�,�-b���r�)2+�\"/XX6��m�#7�ݻ芋袛!�;
����n$���
��^.
+m����F��⊐
+�^��u������)d����7:��ה\�W�;����v�v��ì�w�_�͟������(Ƚj�'������
+�ȝ����w�5oc(��
#����?}���pm�K��ɉ�_�-�I|��4���q5��m����êG$�߇�~}
���ƲO�Y���?��ظk"�tp�x�m}?��iG���ϳ�r[��n���'��@�A�SB
��>����P\E5]3�n�_�Ո��!�af9��y/T6��ӲT����
�=�V�
s}Zаk�
��(�V]�|��DRpZ»A�.�t�I�Dt=��<~Ȗ)J4⽌��6�~�w��I�Σ8����뽴�e瑟dh����R�]z�^4좎<|?E���V�?�Ԇƾn9��`[аk��f�A��
�2�0�մ�Ȝ�&���N��8H�\S�0b3���P
~t��.[G�k}7>1�-<�
l���7K8x�cn���/x�\\|�<;��0�Lմ�g���s]�4zʸq����M���I�̃E3 ������21�a��,��KN����u�C�I,�����V
c��C����K
+fC�V���Z
+�ަ+�A��b\?�G�
<
+�T�.��T�
+���_��m#9����[$@�h�;�vҤ��6>;}��`,�m5�$H���ۏ3�wَ��M�u�61��9�C���{�4
+2*��Y�=���7ğ�h�ɐ�v]ZSv
+� �����
�׃>,��N�v���{-Y��C.�m����$J.�
P
I������\���,��-�]��0m��"�$o�t��C]��%�.���'iA�4��A䇴9��k��¿i�WQL���&��s�X+�"N�|�. �C��H<S
�u6 �Kځ�~H�{�����
2 `f}�+�c
z! 2��s �%���.J�{���q�k�(<����5X�J����&UNV��8�lk�Vk~h�x�p;!�b;!�1!�X/�n.;��R�
-�;R�x��m����&��m��15�(U3�O�ޮ��ʹ�;E6��!�],�Ų���hHg�9&{�"��)��N���$%T���uqP;\
�����_�D4Ii���<�
.Q���xm���7xڽȥ�x��>��Z㯘&P���|��4
+2Jʓ��,hS���W�Q5�|o��G��E���Si��i���}��=T�X�Ƶ�V
�^ l^����E
r �-���<6u1M����4���(�����U.I����b�<I�Q�$��V�xq�����g�� ��lY/̹�b��N���A�O
� ��$Kg�) �{����5�gC��dD��|�� �
+�C����23���8�{�Z�1�|6����� ;�hb*
���N��?�|->r�����!����0�-�y
����Cs����
��E��Q��2K��o��t�(;��ަ���RU�e��~�z�G���t�h��TguN���������
��xIKã�(����ŗ�
�s�^�@�=��ēd�H,��TS6
`9����*�g��;��`�IS�1 �>��[۶��?e~���j�Mw�������«�
��E���|��
0���d��j�U��ҿ�ҏ��
�DH����%W�e!�W�h��
+�9��E�xWz�Ⱥ�����X�+ݐuH�5M����z
���Y��XgG0պ/ܣ� �����,?�?a��!O#
�h?�}��a�G����^�/�{���c�8
���3���>}�qr���K�a�g�g��W}������@�e����;��W��M���-]�C7ͣH�cQ�m�܊���~d)�]i@§�>
h<9�bn���hL���~�.�|t��d2I e�����x~��������i/];��`qt��ai�ސ`Ai1n�B�Q
�UH����n>����(�()OJ�p����g�"��q���`��5��M��8����&f��i7���7���֞ry��
�W�w/��Y|�R�E�m��D��RrIZ
qW
����1����)�2�$Iw\���/e9��Ȫ���C3[4�l!͂�n�%�T��"�δA<�����m��
+:��P-�AC İm~(��|X��c��'|�g�vo�qoE*��J������\x��_�A:�1Tz�Q
ޒ��g�e�O������GmՇ"RHa����9�ϳB�?��2m�U?]̭�>V�UAA#W�IS���Rp$[� �<M�k6|�BS5Ժp�Om��&4
U6,T��R�Ǫj��tM����
��� Zh�
���:��3��@�z
���Y�k{v4�],
�,M}
J� Kd{<����h(�<��}���!��`�G�3c�������m
������y���o���n�g��L���_Y.��5���+�MKccK�g�-����I��e,?1c���7�LK� ��S��j�p�mxXc���0���݆䒰U-$|̎��k���� �b���\dH��Q���R�-ƾ�\̇��I�R7Ho�����;��
g�Z��#�"�)X+����t�᪽uJ��
`��F��ס�K(#�"����E� ?��z����?������vp;_������|��G�nXZw�}w>�|J�u�����ʚx�������?���;J�ua�l� #�ao&��
+
���?n�֟ΨT��5C��Q��������:W���")��v��Es��M�|�(mX�&�b�P�C0�S�����H-E9f�(��PZ������[ٍ`ZF�y"ٷ�Ҭ<Cy�� A�Fd��X"�f�
+qբj�_�M4
\ne֢j�� ٗ-QkG7�:2��[e�V
[VC(_��ؼ���Ã�RYV�լ;ȳ�����SMGU����֍
�d_��K����/�)�!�/�*
{��<��1ē�ëVSaЅ�ȷ#RRֵ��!�*�q����QX-Yu#dX<U�V�-�պ�w�]�9��Uc�cG�%$e�JH�J;�<�o�_���\�i��O>C�mV�aਆQ��*(�c��i�-a"
+���<C���is�ç���]KM�̩�m�EfYeRY�
��&�$���<hcI�P� ��*:G��o
�22T�<T��I��)i��|�9�i�,M���q!r�1��{襔/�j�W+�?e+��/�V�\x)��?�
��K��JC��8���\�Z��Q
i��B�f9<�C?
�ay�yCw���E��VGB��)�g��:�-�[
t��߉�I����)��t��G��Rs�U�r���_�ފ~*mn�&
+ɵ]�W���s�g�4`/�ďW�Iۆ;��Q6 0��*N���A�&K w@W
�a�\
��,�c�&�<��{礔���-���f�4z����-�Dz�7�(�焉�]XfY��]>$ 9�]�o<�B&� �
\K���
��}����#��
������x�*"���S�4��m6q�9�
Yfb]e˫�!)J��Ȯ���c=
�<������/�|��(��m�N<3�`��"E�4 &"��4}ewSxf,�Y�-_2n�~�
n�{�F
�r�z5G!W�7�z]M������I
% ��K�)<
�m$�Ι
����x"��8
�}1�C���<�O�T�zc� M
�9
)]�g^_tH�?��Ot��,I��<x�F}�0���0���8��ۈW�$3����W:��
��Hnt,�y���Y%���\ꎳd��Q�s�|�0 �{�1R���R~�ap{�)Te������{�1{���Y\_*�5wt���
��f�x�T
E�E��'��.8�%�*���
ųJ��n�da�`%^
��ŋ��#�A��ʘT���6��`�:�Q�/�?t��|�ٌ��S/��ҋё�k��iͽx�7�"����I.�GG|.AS9�:
� �͡���K.�.���{�����
�����Z>:�!�Nc�Ro
<
�3��
4�k�&{�d?�<w<ޔR0��I�ߙ^�VtE�\���})�^�9�:�f�b���O��w�V#ηm�����d��e&��y@�J����(W��#�^/��*4�o/�+/����k� ��ADgc��0RA �kܪδ�H�_�d
G�𪰯N*'��6��o��y�>b�0$��?w�&a���F���:�b����=v��|��)։fX�BGW�
��(�
��ݢt/
����}0I���2��Y��{�Z�C�{S�M���[��٦�����hsp
�p
���c
�7ݍ�
���}���~�mn��������e�ٌ�U�ۖeXy<�/(��t
y��Q�����m��Y�k� [...]
+,�ߔ&]
}.��,��Yz<M���� r��Y��Rt�%)��oB]�$
+��&l�mzϒ�-��0s/�3嘣<�,��I
�y��G1�ޤ�p|���4*蕷�#��-%es�P,_-��Bf�^������퉲4
�
��k��h�����&��r?[��+��
pӖE�/��,^@�J��R7gR�7�?2m�B�da}h|9���bh����l�&�ax���U��u6NX*D߲0���]&�!�+^B�z��&��8�
B�A��4�
�vҗ�g'm 0xP:��$;)��
w͏� ��T=:����zB�Q�3�Eޣ$HY����
|��ѻ��4o��^���k�f
!a��B��ފŽ��G��v(�П�e������wp(���<�fiۈ�tq
+�I�H��59qX�DG�
���A���P,��F,O+��;���5
�#(�������v��v��F,p��5�� �F�ulP�Ѩ���6��7���q"�9�j�p]dP���nq{%�R�!�-���:R
+C�����
�*��p�
�W��FL Yh�\SŚ|�rFJ����R�3�����
;��W@���Zli�C
d8��]`n`#�Q��7�,P�"�7T�u�|c ��n�R��J�ҢB�EE�k�j���L�h@��l貶*�-w�
�5��I
%�#��$�F
ת�54��A�Q�</6*ц=Z��XRFMO�;��x��_w�Q�#��a0�O�����q̩b�����S�I�N�^�Jv���D���p�Dg��*6XǔeL��bX����CXi�i�1�J�'�
-}.0�V�`XŪ6��2=�y8
\ild
T0�TBn>�U��B
F<Ͳ8,"`�)e`y�Ka��
/ů8/�#9+n��
�~cᒥ��!� Dp�_�0)ފ] �������ʁ-1�w��Ie�>:W�)���Q��C�&��873�����"�9���
,��Ii[<�`Xhx�f�0�=9y A�@�Q��I�a(P_|�;<��W�t��8�5��C�a�|�q�����,��"|�a�
+f�%���a���D���m)ӑ���n'�)��U��
�q"H��X*
��Frb@�cV;h��(\�x�[E�
Ɠ9Q�
J
C�*� `h{���� �;�N����c��������4黲<�%g��`Yb
,�\}>��n�,��?M� �y$�ە�0K��� �@~P �B�����kXU!RWC�m���K��\��BJ�[��Vv)B��]WS��ϞZP������'��z�
�#Ѧ�c�?�O�:��b�>c"�6SgY`
,�]Y�t�m�dY`
,mgG�;ե�7YXK�w��bI[X��,�]c�S�iK,����.�
� �O��p��lp�o�j�?�6�J�����vj�1�Pn]Z7��v���Z��q'�ЍZ�/����������O�����vsz�F��R��Ҳs�Ɠ�}����c<jr,�t[a]nC��-9��kH���:Y�OÒ_�(v�u�aWw�}0�M96\c� �#ňA�L���/\\]l���
Uz͢ب@�k�5 *UA�j�K��X)f6T�}l�s���h
�lf]a]Y�[qz��,��,��R7��6����9���,AW�1/(@��b���M��J�Ͳ6s1��ʨY���\�
�P��YT�/����9
UuEmb' Kvd�
�x
��U`��6�����LL˒2%�ndz�i�,XG�a�9�v�g���X:Ot�Y�m��Ra],m�/$�?
�
+�bi���Zr-9a�
+��fTc~�(R2�Q��wЃ, ����`(�G]�V^^�>M�c���3�s��O
��|e��2!{pC���/�!<�!|ㆌ�J�&�Y����S��M�Y����B�t
AV,�I�����"� S��|%Xi&5L�7u��+UBuQ�\�l�:�KZ�5�ܻh�O0�]�*�p�gŷ�&2
M;��-�x������>~�d-芨���
SI��4�}�f ӷ�9�0}���ПA=���ǟ�:��!�����R����<5��5a��
���9�|��yd�����>o
9���˧2x�ѥ
�2����*y�Y���~СҾ���q5�-�?�E����w���ν�u���=�q�Q����"/3��9m�U�Yc�CX����|�-b柊�`���5|��dȇ��D>n�O�r�p��Ϣ:����Q=Gu�EM�J��t�6< .
J�L��4�+�T�'�
+�Q�r����({3j�8j6�Ѹ���j0���:Śo�*�gR�/f�{Ǒ�?[q)��݂
��:$M}���x�y�4����3��N�
�Y��gY�
K�?{�孳�qϲ`=���+Y��ꍳ�|�f��[�Df ���٭�W��FHʷGtą2*p).cbN7�R���U��nf��9)f�s!����hzA{7h�Eȓ�<�[��+��`�т�s��vw��ۧ[
y�s-�}
/yH|ʓ0O�E�����a������Z�ќ�����.5eVע��{�������O1S���C���fg��`�SKD
2��
+�S�5;oU�:�Tw���:'I���C�k�W��BSIy����FGq���V�1��������]�Z��bͻP%EXa�3���ӡ>�K����r���Øk1�^�
`ˍ1��X�ci��t���l��ؼ�����4
�h��Z��&
%���:�(q��M���[�&
��[��g
���>�[a���t��\��Ԏ&�L^��
+���,QB��!3���=
+�OG
[��#˘&
��%�R�FbK:��7X��y:"Ժ�ΐs�D"�!��P���S�����I�(MW/-�b��W�,X��k���+m���s�5={u9��"S��e���>��QsP~9\X�o*��U(�J�T at j{��$]^�i���KV'��u�HYZ�� ze��J�2�K�烨,jIQB��Ą���U,4=@� u�ӧ�+>�$�j���J?f;�;i5�����,b[����q����
Nj�]
+XӎH�d�X�k��%K�{�۰���l��0UK�3VƖ�i,4��|{�5��������1�:��6��J���;h��}�
HO.��|��$&�0}�����M|��"��̣�C*�5>C��kz�_R|�%���|%�Q�،UQ�]lf�(�.�����
+�����5D�7�W�+�ނ�6��>R�D)f0h���be��!%
��`�W�Y1��l) �
K�*��~�9"�]��|�yD횫�6�bt�D\0<�K���`�
��*c.^���_�>Pّ ,/�1�b���
`Ф�$^��=:/3f׃�_h���Lڋ�`��T��ƻ h"�
��dA�����)���aW��o*dgpj���>�~S�Ȓ�����磓�Z�C�IM3��"]y"=���"[�bI�[��a*�MH��C���
Z6��$�
)x �MI.����0���H����� ��
aA��! ����:REd��a�
���H���zCA�w�V]U��@��賿w�Ez@�F\�
���v�l_H�.zݝK}�+C�ԃ�.���aT�bJ�ژ��R�s
�J�'R�VsT}���Q�}E ��QǸ���B�F
�!�,k샷��2��&t��F��:ҁgB��p��Gn���r�7q���bԌ-F}��mH��>�e�#�N�Y�%��ua�啑�� y��B�bzV�Q{!@�!@�E ^V�m�
�m�m��+}U0�MK���W�P]�a6y
8>T��W��E�����Nϑ��>Ǩ�,
v�R�s
�E3$��l��<���OJ�
g
w���a:�W��uj۩���R�f�z,���|C��*<E��E�E�
,�
+�~Q����Xd� �B6�%n��](��Q�(��Y[ⴄ"d�cA҇�ز,�Bms<�#.}��
9sp��Z���J9r�����X��R��e�� �����m(,�` g���
endstream
endobj
31 0 obj
10349
endobj
32 0 obj
<< /Filter [ /FlateDecode ] /Length 33 0 R >>
stream
+H��Wˎ��7���]�
+|��2������x #��g��s��$^�%ռ�6�t�����8�`���Ɖ]��Rf�<>�𨦧_
��OOF�Y)=1���;�������ӟ�O���;y�,�6�����_MO��
������މӻ����"//�x��h�����"��E���Xb7�������gV^
c�1�%h��k����/�v0��#����� �8��C�:Y
J��-�;�b�M ��&�iBܶ��H[WV�
X��Jze53Go��z[��JU��cU��ڙ�*�0����Pʃ5p3��U��z?�u� �&�}! �uqrNhè����I��ZC at a ����cX�]YU3�}��*�����2J� V�n}9��2���۲4�5�795�����˨�n�AX�^V�y���.E.K!`\b�ss�0ʘ��t��7Gii%�-%r�>_���;���.%fv3��������b��N4�
�t�BM�[47w�ݢ���b>�fF�1��tsUw��ޠ\:��c��¹�#�إ�x�SlX0}��*f�,��\9���}ABb����V��
��ÐA�3g
�5��O��n��U�a�B
+�N��Y��� ^��9��:�ΚV�Ak���B�q�"]Ɋe�
�����)+��D��{w��z�d�
+�
=�wq�LE+�6�*d���o���YX��3FT�)D��8Tue���`���a�Y��*weПX�T=W�F;�9��h�<��V�vYs�
+�5�U}�{�����p$ �r<�l&��>Q
g�����XCx-B2�k�f�hR�����
r�E��j�A2k�1�f�
�������
���
�
4$�pN���Lɯ�#ǵ?�oIV�#�^��T钨�x���.f�|�Y�Z��t�
;�Q����7�-x.]�0]�l�Lc�
읯q'f5i��(f%j��hÊ�(�ɘ+LW1���u�9G��
�U5G~�*�b��|e_��>����й6���Q�a���e5��}�A5�D�>S��тU��j��=⪛�}S?���"�� S�4����U�>��)��fZu%���
��vMS������z�4��S��e��S�
��-���4�Z¿/��r����(�(KT2�u��r:Y}L�־�����Cu�V?�����J���Y�l���d7&�()�������Ɋ���j��P��/_�^Y��z� 0�1X��Z�.}�*���Lz�xQ���E
�5V�ڗY�C�؈�����u[:J�&ƀE�
�%}P�$�q���Q`c�*���Uh1Cl�HN��b+���]feD�X��UO?Cc��6��,�Z4�
����;�~{
+��t\O��>��m�y%��5�ʼn�����N�Xi�-�n��;�4�� �
::�b��뷷��0� �<=}��3E��>J��M�@�w��^�-��
�. %�뱬Z�s�O�j��C
�Y
:!K�P��c�`d ��w^^�U/��~���N�#��dG���
+A�*&7�4"z˓��?.�-��W6s7��O��9��5��L[�R��6K�~8M������M�MZM�>Z(!)�r�A�����h����4W�wka�L}�oeTc}��P��-��d�ce�\[��~ED��d���\��(��
��9������W9�lW�!��`������ۘ��K�E.��:LgW���E}9{��Y���
l�H�/��a��@�٨��4�o�o�_`�q���&ܰq[6Z;�e�=�,�:d3Mn�;��&�n��ˮ��Ն����<63e�{TW��]dRYM�J�g�s�ar
ɚMe�$=�s�"�m#� iv��D�
t�V���NF>�Ċ�|Z_�p��W|���R��kqWb����n���9R=��"�����ȥA{Y�+�rڭ�aA��
0n��
�_�}��ա�O�j�
+^�@��ɼ:�@� ���%�%3�x��z�ߝ�]��Ȼ�ޭ��u4u�BV��N���Ma;�H���Z���lm�ul�^��+j��)J���5��GH7Q �5�f��A!�R��
��(V�m�4�
f�ZI&�N5F�� [�<b7f�I.w$m�𠱩3)\�P�C�)�$���=��KJلF��VY�n��)a_@�L(�� a��
n(a� un
Ǜ8�E�gVtN��Xye���� V�o[�A0����
�I� ֲ�+Ae�{
+�}\ dcJh�)a_�j>%�
!
��g�d���M�
�����}����l�b
YF��&/Z��x)A�g��o���
�`1�W���m���y�Sx�+Fgl�
*������^����K]��/-
��а����ޑ���%�)5�J����(��,�
�?O
D�S����8�w�"/�K/� ^JЗ��-/�$��8rG?qq�z�c6�(V��e�CsL�lMr{ /%H��.�����!g�ݽI�-���
T�k�<�U��ܸ��<��
6���ov�
B�����
���1��86��Z�Ӷ�EG�ǥ�ԑj�P�[�| /%H�h
��?� F
��
�/��ʘ���ة�s���g�~ǙT�SoS�{�J*zb���U:5�z��\W�b� M
y�:4eZ_T����M�Έ����V40MY4�;g��Sهƒ��^����/
@��#A_��y��w�լ�� kߨQj6l�#��j��
�J��aØ0�)
+�m�A�[Y5"�lM9趌w�5��ڕY#�
X] �
W������E�}�e�[�����o���Ϫ#�
+�%�vH���?e��YZ�V�}�bsy
V� �V���*V�ː���?��韟�������� QEC��:��Fv
��O��/���?\���іe[��3
&�߷��ګm�����?�ŀ���N�Ov.mZ�1��C CQ�� YJe9A��3$wɽh/��
8 g�g��,y�<a��`���Z
���}���_���|�\̉%zʬ%�lʅ?t���?ÿ�$�@8��=��
��
�
AYz��@�mP��v��%s.�"�p+�,bu��6�S0���_�mr�/m��
9�v4��-r�9��6�S��
+��)H{�� bZ1�÷��"fCM�^��>ݦ<���D��H��
��m�W����mx
�v�4�
{>��̨1�YN�
+t"&@*E��S���e
}X�n�
L]!�˲F����m,A�����t#�N6���e��~��'���b��A�'oʙ�A����"�M9���ir�69mM�$�nd�IFV�3!_����EN��w�Q]��hܠ��U�;�E�da��^�
�� �u��
j�
�}#f@:+c��wG�
�rqʭ�A
�/az�����l�Q�O�C_
:���O<hP!�iK/�>�8�4+�P�D�I�'�
0+mO��P0��
�昦3�Uu�{^R�
���p�kR�<;��pDZݱ�߃�@��,e)V]�Dse�UWj�UMWXu��͕���K�XY`���e�MV>{���W�,ë$�����U1Qb�c�V��+⽞p�
�ݥ��1/�Y�)�:� �|�V,~����[��Q��$pVU�ٖ
GO0�h�D��g<$�l|�d"�ɒC�`��� ���-b�u�?�^�>H\`�*��+��Λ%4u'���\��J.Q�I]����ee�UVb�cB�� WV
=�$b��1U(����DR6�!b��ي�R_~X�E�
#<�%M������{£'d�z�<V0�ֵc�D%y��]�)Q��V΄/J*�8�X����Sw'��c&#��'3�JAaf����lTX��2&�f��%�
������8S��Wt���d4�c��V0��O�Y����K��{��Y�(�$�����z$��a�:�
�Ө��5 [...]
+&���"\!裆��+KN�)V��ǡ��i���x7
+���k�-"�Y�-z'0�
I@�Bj�7�hϔ�̹La���R2�R5RfL!Qly�M��pD���b;���O����)�+�a61��p'!����;�Iw�r6�Q@,
q��n�e>n=F��>�7be{�V�s��\���gV��X�0/�b�d�+c�,�a-,f��w��̵�s7"��Vۆ����g��KY^���X����A��Y��߰���Pj��Phd���
~WU���>�Ǎ{h��q�e�t�/@�o�R���
ʬ�*�Y +��>Re�#
�T`�%������8���
�v��P�~�h���R��p��T,He
+R��d�����|�
QM/��G�~�Z���w�XgF�
+�4�NE*�|j`����� �
+@�+�As��Z+��Н6o�أF8�7"��;Gh��js7_��G
�esKk�ٯ�7��*����\�q�(*L
��f7_-{���_|���,6��(&�'��&�R�V��v
+^�=�}.d�
��sȰ4��i��ކ�:
����z����/�_ܜ��<�tBF]N�q�3�V�:x�;2_���9Niy8i�'�c�E�Z���0�PH���&|T�����_�犍�_�J�����b�����e��.���
7ԟ�'я�;l
v�AuM�|8^�ɗm~���h�B��O
�����d���
�e������b����N�nrtsv�ݽ\.v��z��N�O�
�
����Sr�w��%������f7ǵO� �� �%g ���7�֟f�������K`��v�\�@��~�5'��C�_� � �n5t�y�
�Tn8:z����� k��
endstream
endobj
33 0 obj
4773
endobj
34 0 obj
/DeviceGray
endobj
35 0 obj
/DeviceRGB
endobj
36 0 obj
<<
/Type /Font
/BaseFont /RHMHWA+Myriad-Roman
/Subtype /Type1
/Encoding /WinAnsiEncoding
/FontDescriptor 37 0 R
/Widths [ 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212
212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212
230 337 497 513 792 605 188 284 284 415 596 207 307 207 343 513
513 513 513 513 513 513 513 513 513 207 207 596 596 596 406 737
612 542 580 666 492 487 646 652 239 370 542 472 804 658 689 532
689 538 493 497 647 558 846 571 541 553 284 346 284 596 500 300
482 569 448 564 501 292 559 555 234 243 469 234 834 555 549 569
563 327 396 331 551 481 736 463 471 428 284 239 284 596 282 212
282 207 513 356 1000 500 500 300 1156 493 255 894 282 553 282 282
207 207 354 354 282 500 1000 300 802 396 255 863 282 428 541 212
230 513 513 513 513 239 519 300 677 346 419 596 307 510 300 318
596 351 340 300 551 512 207 300 319 355 419 759 759 759 406 612
612 612 612 612 612 788 585 492 492 492 492 239 239 239 239 671
658 689 689 689 689 689 596 689 647 647 647 647 541 531 548 482
482 482 482 482 482 773 447 501 501 501 501 234 234 234 234 541
555 549 549 549 549 549 596 549 551 551 551 551 471 569 471 ]
/FirstChar 0
/LastChar 255
>>
endobj
37 0 obj
<<
/Type /FontDescriptor
/Ascent 831
/CapHeight 674
/Descent -250
/Flags 32
/FontBBox [ -46 -250 1126 831 ]
/FontName /RHMHWA+Myriad-Roman
/ItalicAngle 0
/StemV 88
/XHeight 484
/FontFile3 43 0 R
>>
endobj
38 0 obj
<<
/Type /Group
/S /Transparency
/I false
/K false
/CS /DeviceRGB
>>
endobj
39 0 obj
<< /Height 128 /Width 92 /BitsPerComponent 8 /ColorSpace /DeviceRGB
/Filter /FlateDecode /Length 40 0 R >>
stream
+H�엿kO��/+�� (I$D�Me�""�DD���@�h#AD,,���
-,���>�{�����s�nr�>�0;;3;��s�s&I�ě7o�ܹ����t��$Ćx���'_�|ٳg�?Z�Õ+WlD�h��G����D����������':}���������?u�Tg��
�oHW7R�3�>Q�a�8I��;I��6r��s�*~��+)���40<<L�����~M��%z�v8���
��A?a���*l�
��pQ��}}}2��+����$(�:�M�P�������xW�1R�O��� l� KKKxH����
t*�vYh���
1ѱe�VA���W��}B-�!/�W{��M��l����[�鮅�l���ݦ�����u,���UNH�
+������q+B) �B��PՠV����&���@}�w�-j��,��-��#�LB� ��#I�*7�����9",��×�k�
�Уڵ�5$�����y<�z���G�Q�
�0떝
^~M�f���ے
�
{�O4�%M[d%y1"R`��
Y�ǨV3T��1��Wk�=���
���1�d�|lg2�/�[��2N�&��Y4��ΖU�d����%ǿ�|CE��ӧ�Ad�ȵ��i�ōq�\mh�9
ۄ2��N�"�Od%zHY"��O��� zKk��[�Ƒkv� E���^#��o҆8����6䝿\I0����T,��>�VCVS�{?�
J����� [���R���kѪ~nje�
�fhu�t�M:R��' ��<�E�T��\�T"�l{y�U\������\�� l?WQ>�
��rT�J�u�n at usNR��U�8��V���������'ju7�����'V��ڵkj����N2;;�vnn���um�"�X^^N�lllP�����'E}��DT)0�(�]__������
fqqqeeE,������^}б��9��k~Uoem�+r~ D8Ҫ����4x���`U�4�ň"ň�#)�.rP������X���%������-� �|*1x���̋/J.J��rI^t`�}��~�b7G%ё#Gr��-�٧W�)���ؓ'O*��X���iW�Ԏ��k�Q�5�ф`IR-�w:6�`2����4�*�Jrq�}z�r~dppPB1<<\�Ї�\K�
���
�,\����Xg���/_�U�Եg�]`8�"�P�a$F
+�d�
+W� Y�
|��ySRHD��֊F�J�
'�QT��qd�e��cQ�]
�&@� �KH][�b>nƍO�ݤ��0�
�����>�
6q7��I�23���>���T @����ӪSq�z������ݻw�<
k��ݖ���Ǐ�YN�#{����uK�W�T��9sF�?11��G�[\�
9���F���M��v#C$��R���@��
?1��j,GFF�|��^��`��"ɦl�HK��rQ�ˉ/~��Hw�N�>�c�8�i����ՠ
pb�f$� �����rӓ,}��\T��L���l��L�vɪ�2Y'�E�A�-
+v��C��֣
�,-�"�OA�/�VpRd�?��w6h���
E9��Y���ݤ!�
&���~
+ì�eQ�'������}ھp�$�H�3x�1�Ȩ�Tccc��}�i�E�_��
��]�ևT
�ɾ}���ŀ������z��ի�W��|�Y|iIP��+
�N�{�rZ[�=��o5Eq�
�v�����������߿_T�>}��%�+i��\����ض�֎��q©�)H�&����kn�3P�!��8<�\�0�C������Z�033S�믥`�2�֪Dk'Y&g[
��Y*o�n��h��
�G��V�F�?Z�'��v�)����ED�6f%���. lhA�ϒ�ųDCJ�v��ָh)�$�r��M���'|]-S
5i0��='�v�V�A�|]#O�<9u��Ν;)-���ijg��$�ג��
JLv6/J�*�|Io�Uz SZ_�#
��T��\YF��۷�>A�T�I�W� �GxoKKKEuT �W5!�9%�YgW��:��ܜV!���2I��Xӱ�>}�K���Q'?��ܼyӧ�(� 'VY��) �. -,��z���M�w�
Y��BZU�2�=Nj��gϞ�n߾
���4q��?f/
�?�Gy��䤊������x��;�m�/�1��!�%Kd2QI��UH�D�Ha�U����B�EV����t�������?�����
�TZx�����`Kǫ+�Z�D�e�����I�R��N[t
�Ç
<(�>����N[�b�
��P��?�(��d���/صk6��%� Vb�?�-�D�-�9��+a����Ĥ?ld -�:11!��Us�p�T��9
/��Wh�i1�d/w�)�Ϟ={���
.����[������'A}ҔD)�o߾UE����
������#���E���$�f˥��
�h�>��fdddff�ܹs����IQio�l
k���� [...]
+'�>��D9TnMCIb�Q���i��'M_��i]��I>��I�+�1b���մί�#=�I��U�pB����ʳZ
+� �͉�q�
+Y�;
�y%=��T�C�
�|�6P]��*�J���������N-0W��n'��ôٵ�y����Em��w��F^�~���
�O�<y��&se�&Q֧
��E7��N�����pʹ{-��;F������sF�Rω-�Wڦ�t���:I����k?L�ꓦ�ػw���Zɬb��ӧ�\
����K�'��5�T�)��r�m$}��w:�̙���'���j�СC�V#:���89v�>644��,�km�$.?��tL at v�r��� �#�dvvq��-�i�� ,�w�2b�59ңnRV�t��ܤ�Em�_n���MS �����4;��O��� ~�%y�"���x���һ�(�Tt8�O�'I
�b~�%�Iu�O�---�D4?!U1��9�9��ZZBB���O��4'B��x�'=� ��:+++��] ���Nzb~�(mP��b����j�_�~�����y��W�'�3�=���h\__�a��P?W?���j��� �p����'v��o�\�8^�}G���"�`�i[H3Nn��U���W���088�Ǜ�E(��I78
���xǞ��U_�GZ�MNN�Z��ߡ�!���K~wS�ŋ곯
�x��.]��Ր�i�W [...]
endstream
endobj
40 0 obj
3412
endobj
41 0 obj
<< /Filter /FlateDecode /Length 42 0 R >>
stream
+H��WɎ9��+��}I��
h�]n3c����
c��Ue�dU����� �BRɰ�ۡ`�3��1�7O�����vz�Z������~������X|� V|Zx���dB/^ܼ_����k�6�S�/~h����_��"r:>��������������i�������~�
��n[}ï�O�ӱ�
@���VJ(�tWmO��v��}��u{�?��j�/^ݼ^y����
+V�⏂��
b���ߊ��X�X�?�����6zx؟��]q<��C �9[p�J�+ ��(]
��$�YݢƷ+�a�)��RZ&
ZLP�J� �*�s��v!�u�7���u<��]ܚ���@���o}�`6`�l����(�-3�@����i�~HQT��Cv�Jc
BƖ�2�ݲ�yJC��+A�rӸ;A�`�I��mW&��mw"��!eZ
+(��� 鯋�A����.��Y���B &,k!$Y:c��:�����ץ��E��r�.ڍ��:A���ݵ r�a%����H�s��3��iA�Ҍd}05�;�G�~�AuV=���
oM d����>G1�Q���s<5��ޔh��
�O@��Jh�&�!��
�<VE�U
+J�w /�q�4�~��Mb����ͻ-��?�;Յ�����S�fۧ�/����Vg�`����x�������a[�����m���#gH��}Z���=6xm��^V��G�0�p����u{�߾p������������>H�7�_�b�����}��
�}�{FfV�oOO_�ak�7������?�������o
V?��q����f�����
C�b�ǂ�DWA|��U
+j�����!!�u��څ]rAF�]���V�J�����SB�� A'
+�q�X�:�
+�}Mթ�)��㝵��W
űDvE �9�vAD9�;���
+k�x�+W�RNy�/���L�<�+��{�9��kByW|!�9�R�[�:V��R9�3�ǘ�#�hk�q�]f��d�LA�<r:��ݭRД� �
�ln�ƽQ_X� �켻�N,u)9U����,�px8I����+�W_�12� 8B�]JyFD&���2� 8\�ZJyND� � 8\�6
)ω�87�P��Õݎ�s��D�rG)w�ۥ|����(��)>wuxJ7[yNDe�u5�9���s��(?V��Bj:"*
��qK�qs|�^��
�MG4+n0���MGDu��j��W�U5NO��������Dn�.����jr��5
8�k<�cq|_��<'��Wϔ� ʕżY&#��9�v��q0� ��8���
v�e�='��o �Gp�r���T���-�]�\�-Ӻ}�t(�z��)<� j̴+A at X�a�"�ǖ��ɳ��`d�m�;���`%�E��ll�JT&+%���{�{�B��������+���|�qE(���L,�<'"3c6F���/=A [...]
�Q�d��JA0�̶�-���XW�Hѿ���V��d�!�s�����
+�Ҩ�����q��Uz�
��`�����.��z۵p`x:$2*
�#�0�3�
�!AD�!�D&��f�4$��4�8+��#8B��
)ω�h�Y1W
�ʕ-�I�yO$�h�ȕ�8�f?�"2jJȥ" '"#@R �D�P
)ωH���#8B9腔�Dd�����v�vM�cL�3I3�`úض9��
+y�z9c��dw at C�MC3Nl'm;QW��DF���Yγ����ɉȸF�UG��e 3��DT\]V��X�q7��u�QLS��v��
+u{�n�'(��I�,�O���hB��]� .1 �\��������ö��
���
�����}O/�!��b�+b�V�v/m���ǘF<�p���=�/�i�P:�0if+!�&\��,���z&�?ͻ���f��U
+D�]���"|��s�E9ل��<�
3�`�"��
\LUr�1^Vy���'0�4A�Prg�!���
�H��&�"'�R�"�B����:6Q���Գ�:�hBti������iTid�w�SN��(��u
0��yo���+�`����`�~�cx�m�rX�|�cd�I�q���v&�/�4M�Qu(ς/�9!�c?t%,ڳ��=�Yz�g���� L����3WO�iJ�38�(�,������`�VLN�
��ɩs�4�ۇ[
Y�����D��J0�l�eZ�{`����j{ �ۇ�`P�j
+|�.P�{dKpCf~ �1��#���g��Gb��B��%8g�B�i���н15�<o�c���h�4��Q��%�Gp�r\�Q��>W�P
����2�s"Z9���)>���L�gDߝ�Q�k�B,���
X���U8n'AS�Qu,_sKsN6�{㽳�`p7�4L�-����=����`�P�����D /�T�O�C0Qz���F7@�H�����]��!�bMe��6#ds�)W��^Z_��5+g
�ӄ��GQ�����C�� �)�aȢ�������'g��x���q���`u��i � B
+�K��8�V��:�
��Yk
X��,�rہZ� \u��>��Z�f�z^NDNH�wN�����
��@��BE�.��9�ܩp1��,<�L�M�9X��16Yt� ���ް�;�
s���OU��t��>��2��C�x�g`b(L�!�!fe
+AD{Cu"��yCug�@��<��@
��gCv�7Xx�<odD䬌�܉d��r�c~���h��MǙ���t��a��P�Y�ȉ��z�$9r���O���X��#<� �x��=v���d��)�*��u�X�$ ц�i��
шmZ�`9�o��A[A�8;x�hG�%�
kј��h�G�\�F��,gleБ
�ht����F���#-Fc"z~�*a��7p;���JL��S
+ ߧ����!V�~���Q�a��
|Ax�
+��E��xl��j
���3��"�I��"�:c�Zp�Rw��������P� �/��2KA�
�">��ԑS?��C�v��I[cKƓZ�D�)$<�k3
Kj&"E��>�&��&LV˙�4z`6�G�
/kzf&� �6J��.��!w�8��۞6J�� }�ӣDh�PZk�3��мž����=���E�g"Y����r�^�|&�{�wpT�5d�iM�m.\m8��#��m럋`��DC
>s�B�IC�����+
�KmG`R��Βy�!
L
+=���R�Ph���O��ۇJ~��ϯ��������_����?.6e,���;���×�����lV������)�`����u����M�̤�t��Iqy��w.0)�X6����$W6��rjŕېZA�@nC*��V�
H3�7�|X?s
M��K�f&�9�fǛУQ}M�qr��~��8�o�OG#�C�s��G�:)r�0\<���}Ǣ������-�8�(jIFZs
*���*0�o7�$�س5�
���8S�6^@�Ǎ��l�Z�=�}>�L$��������v
�`9cl��@ۣ� ��ο]��wk�l&�r��$�Q��2�|;��
+�
Ԛ|
�n��WZ�ں��m�p��V�1L{��;�!�meg���q����+Y`���v�v��oA�n���DRE+��S�{T�=W[�� ��Z��VۈR@��a#W�GѰ�h{�����TW-
+b۲���J8��������l�܊�u���a�X،<8�D��{��՝��
uל�e�ã���+V��
+��~��6��
��o�����j�D��wŁ���<����̘\.>����`�4�E�O
����/����z�x���F�0�5o"0i�C����X.�ǙIx
�7�*,DI�gf��6�-�Tċzf&E|2�
l^�#0)�z��
.,z�Iq_e�e�K�zo4�|���S�Ve�`�
Q��I�]1XW��[�F[%&�ak�� �6�������]��ci�a��
+D�G�W��[�1�*�#g�Uy*S��m�P����
f�e��d��֦��b�S6^���b��ôw�������^��_w�}%
���
%�)lAM�yuG� ���W����9���J�@9<Ǭ��'����y-�3��]՚">]#�^�ȡ�̎ ,?9[�t�G����f4Ben�3�-��tG$���������
�#��2�F��2�*o��+sE3jb`�Z���ݰ��,ձ��ح2�+����o�yG-j�w��#�i���a%
���U�[Y��E
�}^ߢ���)*st/�̍�r/T�>�܇)�D�����o9���J�
+�,(��Sʣ{��J�Q�w�1����Q��iQ�D���ր�2�L�}�}$�ǟ��������Q~��������H`�Ͽ��5W�3���ۥIvmQ�+f5,���Ӗ /��׃;)
������֙�~$gfR\�s`�¾��=3��lN�g�w/�Oc�ħ�l��%zӒ���DOcR���X,�I�j=��}�,����z ���
�^��1iޗG���c͊��Iw_Ƥ�1+ǵ��t�pgI�Uz�FO�r̋zf���K
�b�B!�V�R�RJ�x���?3-]�ϋzf&M�ޢ�XJc�q�L
+=�5��?��dGSo
�
i�L����_�]li��}%���@%
��Z=�FO�ȣj�Ŗ&0���[c\��I�?�%�hy]Oc��������W�r������p�
+����@����\����2�Db4�c�Z4 �#�~ m;#~�A�����|:l�!�R4f"�����X��n���&ngdj�A�
g��L�����B4")7���=��(`<��0�3�]*H#H���|4x
�R
+i\��+;���M-"@Ȃ#�~���
+���T9?�d(m[��H�|�v���+��ȡ��q�MX��L�?s�DŽ��K~Zbz��,�/Eg&R�q��kq9p(sֻ2PX��ơ���U��$-M�"&�^{ꇰv;�TY�v�NQ��R%&�KE��A���tl]V�����/�
K��Օim�̤�*о�G������O93�">���XR�d��S����S�\8UZ��$���
f�>6�����C�`��O�hN��d�
_�J�t;��rߣ��}�F�����|�� }�����u;j�R4&"17�Pcb��QL X�m�ե ��mB��~_h�+�-����B�Dž�'���m�5d�����o
���B7�M�}{|)�Z,�ҥ�Db�b�3���`<��#��3L��q�30�N�
�!�[��D$�h�"{�����|
`/_��4�#H���|��v�6.Ec&���)�- �|?���16Ў }���pf��
��ʗ@�����+�d�&�@H�P��bP�8Z^���L����(ً�2Dy�=f&����ʕ4]����}�l���ĤM)l3X��`��:JL
+�ϥ�����iI�Ĥ�֭�:.
y�����e�c�.oJ:��f&��|c K�]bz�}����(��G`R�<$3��
���H3(�kgNa�(��M�AqfRd�6n�61y�����Ȟ�� ��
�}�rf"Et|!��L"�R���4z2�<��Zx&E6c>I.fT�@k���/��=���
�I*QF�ن�dbP�f�I�?��8Y1�e^�ƫ�#0i���ŖSe���HQ{,5�
R�"��9�{*
NmS"��+ �XZH��H���
]2��uP`R�s
�[�q��#�[���<&���jW���~�fw��` $N�r�*�T��ryu�Rx_rA���r9`��F@��1�47Z�b�)J'0I�N�
T�#iO���!I�ī�>�lB�i�$y
2HJO���G����b=�k�8�Z �t�2��Ƣ8�$��>�<���Hg�dD���i�&��KmL�_��:k,�_O?6�=�V��k[�+����׀q
{����$@�HP����.��H��@ Z��
�H@ 4c�m��wI@\�> >|z}~�����yD|z~���ߟg�HG?e4R�F�����
ӵr��M
�Z�(>}�=����=�Ѝ�l�U&&�]��`�������^6
��
M�J
�R
�y�P\� p��Z�K��ma
CpH3c�)ei��_OZ��\���,��i7���"V�Xݞ���0����|{���*��d� 2~�lk`���*
Ƈ�0��B�GU�O��H�8G�?��uZ��0��l)�����L�ۖ�`�)
���a!�x��QA�ԙ
d!)��tj�|�� 8`�f�ϭ�J 6.l\F&�ՙ�
��e������id`M��J�I oHC�
�h��X���!qUy�O�k��ԧEb�DL�TJ� n*%��h�v�����o�$o
���Y���q������e�ö�� [��V�خ3t��F[���,[�Ÿ�����W(\�������vet./2p.ː�p��_9t��>��VJ�A�^|������ZJ���\���4@6�K��&�u�F�<��<��F\D
g(3��Fb�D>v5�� �v�sZ�����b��CY��7VkL�]?߭���L
����p�
#DO
+��C�+��s�$#.������I��H"VF}�3��{
+�!�6�31W��~e�eaT�_���6�{F|X�9�RDv��qe��I�Y
?��xYq�ѻ٨k��g4�`v�//Z �
�B�dG(>�쨌%;��Fj��g|<;�a���e�)�#�(�����"E_
*I�"��������v�51jy/e�$|�@
3�
mV(
� �H�(��
� n�t���������zj���F
ʙ�H�1P�(���(�jI3��N(�z�x�h��Eo
SFR_Go�8�$A
�g��Čv�
+�9,0�Ǫ����C�!�~
���� ћ��LZ��9b��Qh���5�C��%u/����qH>��f���Ѽ*~/i�M+F��a����a��ז��x�:����" ���~&
s�f���:����C��~o�[`�B�`�4
S����! �E�A�ज़��{}�yJ|�F ��
&��o'
+���R��Wc�����ӏM���ӝ0��r[�[�/�AI�& ;�G����DR����IQw ��HP�-�8����%�䥳E$�����*���VA��a���x==lJ
tX/�1��X���r��� t
�{�R�pa1�M���
Vn��x������5�.�]�n�x�D�6�L?
�ĮƱD���#�= �W�5��l�!N�kM
�6^j#�p�X�?$
�`�a�>���Y-�!$I@�(c�F�1c5H]|=bߤ�D�M��l��&t�n�!���wr�1$�B�}��0cH�^����Ì!�T��0c���~
f
����#��ˤA�bcl'igK��an'��Km�Xz��k,�h'&��n'5� %l��fdM*��k
Ai��mR�hq
a��8�Q҃v�XI��XP�� ��Z �k��v=N1
�A�V��)��i���}ҡo�e���Y��ɤƐD
N�AJ+�4
����#mB�|$Y�1NG�χA�*z�{1H�
�z/I�ST
z/I2�R�}$ɘ�����i���R�A������fp4����`@ȇC�_
�u�fy���h��|$�>A�ʓW����8���l�#�����0H����wI��B�iR��� �v���0H�����(>-� ߭:*~$A�s�>
� ~�=��$�C�� >
�~>:R��\����gi~逄b���a����4Ei�ЇA��(>
����)s����H�xT�i̤�����N��^�߿�y{
����1�H���ޟ_~���'����늼:?���#���$��;j :�������<��'
f p4Ҟ�������x��V��8_g����ӏ���b3���
��qO�g����G�Γ6P����o
#I�F��M:s��j
Q����X�5_g��4t�q�T�p�j
2UƵD�t�D���s��Y�>����CDZ�2�cd��k�ZE�L��)0���q*? ���N+$�9Z�P��j�w����]&�e8W��9��M���ڙ�����17hT��-�4�9D8�hKS�'��������nSK����I� ����v��`��=�m_�.,�I`[�_��?�J�P�(e�w��YEP�yP�y����w���F��3��շM�.�7��{�]@��{��U$Ъ����pv���k���
+���
�%����s����-)$�`@L�E(��x0�^7:��O��ٿN�9�c�Z��%��5��pI�'�\A
��A�96���a��g�4k
A�
ƇA�WY�z�0H> G�a���1�݁�E<k��Q!���zlv7�*o[
P�b蝊�-u�G��O���_���=���~��}q�1R�����ו
���/�?�'Ml�D
@�
�~�����L
���5�t��e�A/�������'�Ҹ8������Io&�'�qq2h�d��I�ۓٸ<����>��TR�"���������bmT��W�D+s���fM��l��F�9r����3&o�_��)
�NQ8L�?�S �
�eaČ:��W�m1ګ(7�P�o���WI��4��+rD?l�WnBb� .\zXfZz���B�{�I\vR����MsxzIŮ}�
+�|�J9��E���.��h���j���1T����L�|ru!�WD���d�:n
UӰO����\��J�DJ�u����J�'1����[2��?#L36"���dj���6ف3�Y�Ӯhj餍%�r�ͩn�-*�i��(���u�(S
���8�)էMo37�$�v���Fn��ܪ��Z��*��U�C�`t�F��1U�=��7��l7�5�ԅ�:��1�oTv���n�
+u���=0�`�{��E�ɳ"��ѵ��u��\��`2h��}�Q�{�wLW~�_�0:,���
#g�F'�1ߞ� ��`M<�D
D��Eb��F����+r�v#��+����;O`���My����2:���N�bh� j!m�ZlѠ�ĝ����?}���)��n����i<��e���������Ɍ{��`�`<&�`|ƈ�C>�f
7�D��+�ǰe��h{<T�:O�qdZ��[
�Q��XS��! )^qrs�{�{�w��z�x2��( �.��$
31;��,�����uD�J
&��ֻ`�
PB�TdY֮��{"j�X�Bb��[A��oϒ|QT���[D�`O�ߤ`�9"��Od*�Ukr{��F):iH�@��Z���]֦��.
���m>E�i�=�=���=۷�gqz�@G��AtCO�IPc� [...]
+/�僤��%Z�A���O�V
+��c���N!��n@��acٷ�*�� ���7�w�
�%��6to
+&��
+y|(�G\
�
~��Fo*d1gGl��ͅl
�>��"h�=���G�J���N����y����؞ ��#�C'�m��uv�b%1٢�f�|ȓvT�n"
v�I/�%��o����ׇ����@��%��O�r�_ � m���̾h0G�9O��G�
�&�7)���ť�5��}I
+^a����b`,=)C� �^�H����B^<Κ.E�qu�x��MH��c��E���+D��ʑY�5O���� <����;���=5���
���.�f�L.oS�0�ZlV��(������/E�x���Tx]N������/����5�:�����Z;�~()bh�(��@�*�S��>�JP�U^Mkd��Jm��~�ޒ؏�;�#�gaO� ls� v���[���1;�fL�]�N�6�y���FC�<�RW�~Q`�YW�yH��<�愩|u�s���B�
k�6�u9۬���|W��j�.v�c��n���
,C8��)L
+���Y�>n'��#�:bʩ[�^�Q �q�
�,���Q�)x�$�l�߆�qdzvr�Oj�ͺXB��I�A/8�x��~WV�s�
+(���b*��
+I�l������֕����-ۭk�6G�˺I}���i����e�x�[���o
���B�
+lL>�G
�s���S����)����K~�߮�_�T־O9N��J,���z�J���O� �]ɶ
endstream
endobj
42 0 obj
10239
endobj
43 0 obj
<< /Filter /FlateDecode /Length 44 0 R /Subtype /Type1C >>
stream
+H�|T{P��e��J\��Eke�UyE��jA�� �(�$���� ���:(yJT|�Ջ�V
��!(%��T�z=�~:s;�ug���~;�������w��1�����0Y�,r�ǡY*e���a)I����\v&Ɗq�Ŋ��`�x1H���
�fB��~���
0ǫ/7�NI�
+�tA�������}��-])O�
/
�Rk�����Uj�*V/_(��LL��M��Ұxu�*�C�� U���R�*V
���%M��"I�b��ܞ*>A��8D�,��Wib�ug�J��+�4ʔd����R���p��lp�^��Za�1l[�a
�c>V�*
&��Bm�(
��0�-�l�x�ǒ0=V�5aC�|<��_Z�X
!x�|��7��+!
����eOͥ6S:j�����Ě��j}�����Č-3���l���j�\�6{_�2��k:A����E3/�g���[n㭽DZB�
�2D�P�5�4�9��H�T��� ��"� ��w�{
+|�K��=}��ye
Q��0,YGu�O$D2�mFt��2�f�
/Ob ��ׯ Q:��I�*U���Z��`+^�D4��!��ϑ���[-m(=c8�.W(T� ��gRXVf�:xN���PkQ�k)T�VI
+�F�ֈ�p�7�jip}H��e @.��
٢��E� 덴�
�g��拇����os��Ne�mù��
���EH ;��2 ��� ��
7��� v�� ]����@��4: v�'��!&0$yǗ��P�����x���`���y2ked_���A�� �c���'�j錚V�I
����=
rwi!��N
V^l6�?�Cs��U*��t=Y\q��x�6&r����Ltp#%|22,_��l�KX�x�а�B��AF0��c�|D��
!hܸ�us��o��0hBA|��
:�^�v���������Q�JJ~'�����`#� ��F�T,�O
.�ԟݼ��+ou��x��T&]Ff�����_����qlsTS�S�X�uN�ߙ2�#!���
Z:`Q?~vJ���7��t]v�o�Έ-�!!_�GsD(`
a �!�;p����7+c%9T!`=S��.;\�Rg���Tҋ�>|�c�?rL�Pz��x�V�
Q�
a{M8k;A4s����
>:�����;F�p�����;���
+�G!f�I���2Dy�
�7)�C|��2e�&?���Rp�Y�����_#����U�m
�@���7�h��-mz旋?����UM� �,*z�Dدg/�����Ņ�f����Y߮o0I�>�����
c�3-]��̯9��Cg�����
�a����F���aH�x����f��DO�]��M�#�oQ���u������'.�"����о�o%ruL�&��桉[�̻�
�a6ׅ3��S�Pr�<A�Jۡ�nC���`�f��F�����{�
tR�O(���C�R(��r(ȓF�
"�q�K?^�J��X\��
h����F(hM�C�(h�d�W}�tv��b��+�|���-��"z
xk}��lWٕ�vѭ�zE�����Bo��O�gF?��%�z��ή������2*��C _=
�/v[��#Q���be�^�� 7Ll�8�G��#_�W�A�������_�0���㚈�K�(
�E�H�T�� l�����l�5Av(M�n*,c�hT J�2������L�*dC%?�)]�)1��0���*�dG�5�TA�b�}��o�����)X�_��ս{
�p�S �,H= F�A�W�GK8���q�
�����
�`����>���t���x`�����Q������ �q���T��g���3
�܀L
�f����FN_(�Ҏ~�%ٻ���Z1X��`
�Fz����o��s
�cT[/����K
+�Np.���vttOz�:+��
xS���@-�`[_ss�o�
?OG��&O7�݈D�W�����ΰ=%9m~�@ O�����CrH���=�v��ȏ��P
���.����A�;5%�wť�r�ȃ�F�p�N6���4�Ku�5��Q#�P&]��0����;��JPlE�T6Y�EAuD���� &�!-�
��DvY\����Q������s}�rn���ʯ[�s�;�w����s��m^)����vr�y�Z�ug��5�>
�G)2�4'
!�u���A�{�?�V
>gY`��[%4|�'^J�}���[`�d�ݾ���S���
+,Iw���}�]�
DRMNt
����kI[�A��7�-
8�3@�]> �"�����
���-˃K:y�em
u��B�h ӄ��� �߭����
f����v��X�y�|� ř�
0~j����;��
}�G�
������3K�����b��=��b��9�3/��i�dڈ0h
+R�s-q��1���G���p�P����E`�l"��9���;�8��=*g��=��b�|�����w�z
x֎\�B�Q��l
��
+������:�� ؤ���������k�d�u���q�
w��ڂ�f��`��n���H
8�8]&e:�OG42V��;��wp�.����;v�|+Wm
�%���|�
4�mk�����T{ $q�]�#<��������hLNO�&S���r��Kw^�浌��J��1���Q�ɠ�='��\�dP���� '3��f�R��O�Y`��
+���
�{�z��2p���f�ps9Jխ�U�N�lڰ
x;X��Tw�Ӳ�t���Y����gi�@4�J����ȕ?�9��G�A�5���>׃���>���,�
.e�u5kThN�d����j��b�<���\X%ck���
Hh�l9\/G2n�
ݩj�L)�
6H���
�͟����R1E4:'x��������ux��!�KM+�r����N��8�d��Y�%���N�vd�0� ��Ȗ��Z���Rk�
`�U�[B%��%
= q%��`���wr;��}�|S��J�9�`X���|���:�� �?\��]�ue)e�S�0^XcC�9
�� 9���R^w�V����u�+(<J���"���!;z�j���
=`���&��SE�� �P/��/�>�z�O>�!�'�x�3hs�8�4e���
Mu���ՙ9T����69R�lG�
�1`����HXrB$!��E�@���E( ,����\GL�u���?#D�^
��-;��$�bhhLTX���k��L��i����\E0��!Q��1��o�ǃ�c�Fy��L5U�[U�J��z�Ӱf
����j�:_[�L��y����1�e�U��a��pJpR 8y
�v�_�3�10( ����N�6�E��g>�E
~V!W�������*8!Ϋ:P�W:�zF�E��K}�����
'E����FM��
@�����!��W�C�m��Up=\����Vts
�1Q�����%��ٮv6ȑp[
p�c
�%_,95��:�����
GA��W�Bs�[8�~w��a��q�f�+�~;y�@�J�V�P�T��62�dӆȐ�-wzWw����tu���'�~fv�䋡�s=S� ����J�F߉[Q'ވ��p �B#[�-&V l�U{u"���(�OS���=�#S���p��>�;�VJ䉉<"�HW&��
z�Ux�<W���rjo�J�d��gӄ� ��P�:-O&ݽ��c��*N{�J�
��{ $>�x^�e�5����6�Z�*=�c���7�ЮE�
�x�W~�YW/��*��4�Ajr��������1�y���\��G�g]�d0$���1�
#"&Q�Z98�5l��#;�(��)�&�"K/�=���z��D�,��/m�A.0�&���I�
�`ү'uD
��|؈�KR�THBp�;i�9A�s|X�F/��c7�����0�¥���&
8�y
+�'��)��$*
+X6#Ć�!�}��y�9w����ݣ�̆q��b��v����{���4�n��� RͶ�v0=����<�)�9����86poܴ�����1���l���2��Sy)Ҕ�d*.0<4Z.�M9���|Fu^mE{K�h'Z&��3K|%�N:�
�&۩b�V|u�nƙ1`|�i��~��iGn><�����4zת�`@�T5�p��9s�lD���
�
Q�A�N}46��i�=su�z��2���d����o s��
endstream
endobj
44 0 obj
4206
endobj
45 0 obj
<< /Type /Metadata /Subtype /XML /Length 936 >>
stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d' bytes='936'?>
+
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
+ xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description about=''
+ xmlns='http://ns.adobe.com/pdf/1.3/'
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ <pdf:CreationDate>2003-03-27T11:43:36-05:00</pdf:CreationDate>
+ <pdf:ModDate>2003-03-27T11:43:40-06:00</pdf:ModDate>
+ <pdf:Creator>Adobe Illustrator 10.0</pdf:Creator>
+ <pdf:Producer>Adobe PDF library 5.00</pdf:Producer>
+ </rdf:Description>
+
+ <rdf:Description about=''
+ xmlns='http://ns.adobe.com/xap/1.0/'
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'>
+ <xap:CreateDate>2003-03-27T11:43:36-05:00</xap:CreateDate>
+ <xap:ModifyDate>2003-03-27T11:43:40-06:00</xap:ModifyDate>
+ <xap:CreatorTool>Adobe Illustrator 10.0</xap:CreatorTool>
+ <xap:MetadataDate>2003-03-27T11:43:40-06:00</xap:MetadataDate>
+ </rdf:Description>
+
+</rdf:RDF>
+<?xpacket end='r'?>
endstream
endobj
xref
0 46
0000000004 65535 f
+0000000016 00000 n
+0000000087 00000 n
+0000000151 00000 n
+0000000006 00001 f
+0000000318 00000 n
+0000000000 00001 f
+0000000671 00000 n
+0000000750 00000 n
+0000001177 00000 n
+0000001587 00000 n
+0000002781 00000 n
+0000012616 00000 n
+0000031032 00000 n
+0000031055 00000 n
+0000047555 00000 n
+0000047578 00000 n
+0000067091 00000 n
+0000067114 00000 n
+0000086815 00000 n
+0000086838 00000 n
+0000101128 00000 n
+0000101151 00000 n
+0000104890 00000 n
+0000104912 00000 n
+0000118881 00000 n
+0000118904 00000 n
+0000141436 00000 n
+0000141459 00000 n
+0000162146 00000 n
+0000162169 00000 n
+0000172600 00000 n
+0000172623 00000 n
+0000177478 00000 n
+0000177500 00000 n
+0000177529 00000 n
+0000177557 00000 n
+0000178779 00000 n
+0000179006 00000 n
+0000179098 00000 n
+0000182654 00000 n
+0000182676 00000 n
+0000192993 00000 n
+0000193016 00000 n
+0000197317 00000 n
+0000197339 00000 n
+trailer
<<
/Size 46
/Info 3 0 R
/Root 1 0 R
/ID[<03aa30ffc7b60d2634f33aaffd5fb1ae><83071ccfecb32ab3fa609a63de597bbd>]
>>
startxref
198359
%%EOF
\ No newline at end of file
diff --git a/documentation/figures/rnaseP-ecoli.eps b/documentation/figures/rnaseP-ecoli.eps
new file mode 100644
index 0000000..d0eadff
--- /dev/null
+++ b/documentation/figures/rnaseP-ecoli.eps
@@ -0,0 +1,12990 @@
+%!PS-Adobe-3.1 EPSF-3.0
+%%Title: rnaseP-ecoli.eps
+%%Creator: Adobe Illustrator(R) X
+%%AI8_CreatorVersion: 10.0
%AI9_PrintingDataBegin
%%For: Sean R Eddy
+%%CreationDate: 3/27/03
+%%BoundingBox: 0 0 417 587
+%%HiResBoundingBox: 0 0 416.5997 586.6475
+%%CropBox: 0 0 416.5997 586.6475
+%%LanguageLevel: 2
+%%DocumentData: Clean7Bit
+%ADOBeginClientInjection: DocumentHeader "AI10"
+%ADOEndClientInjection: DocumentHeader "AI10"
+%%Pages: 1
+%%DocumentNeededResources:
+%%DocumentSuppliedResources: procset Adobe_AGM_Image (1.0 0)
+%%+ procset Adobe_CoolType_Utility_MAKEOCF (1.13 0)
+%%+ procset Adobe_CoolType_Core (2.12 0)
+%%+ procset Adobe_AGM_Core (2.0 0)
+%%+ procset Adobe_AGM_Utils (1.0 0)
+%%DocumentFonts:
+%%DocumentNeededFonts:
+%%DocumentNeededFeatures:
+%%DocumentSuppliedFeatures:
+%%DocumentCustomColors:
+%%CMYKCustomColor:
+%%RGBCustomColor:
+%%EndComments
+%%BeginDefaults
+%%ViewingOrientation: 1 0 0 1
+%%EndDefaults
+%%BeginProlog
+%ADOBeginClientInjection: DocumentProlog Start "AI10"
+%ADOEndClientInjection: DocumentProlog Start "AI10"
+%%BeginResource: procset Adobe_AGM_Utils 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright (C) 2000-2000 Adobe Systems, Inc. All Rights Reserved.
+systemdict /setpacking known
+{
+ currentpacking
+ true setpacking
+} if
+userdict /Adobe_AGM_Utils 60 dict dup begin put
+/bdf
+{
+ bind def
+} bind def
+/nd{
+ null def
+}bdf
+/xdf
+{
+ exch def
+}bdf
+/ldf
+{
+ load def
+}bdf
+/ddf
+{
+ put
+}bdf
+/xddf
+{
+ 3 -1 roll put
+}bdf
+/xpt
+{
+ exch put
+}bdf
+/ndf
+{
+
+ exch dup where{
+ pop pop pop
+ }{
+ xdf
+ }ifelse
+}def
+/cdndf
+{
+ exch dup currentdict exch known{
+ pop pop
+ }{
+ exch def
+ }ifelse
+}def
+/bdict
+{
+ mark
+}bdf
+/edict
+{
+ counttomark 2 idiv dup dict begin {def} repeat pop currentdict end
+}def
+
+/ps_level
+ /languagelevel where{
+ pop systemdict /languagelevel get exec
+ }{
+ 1
+ }ifelse
+def
+/level2
+ ps_level 2 ge
+def
+/level3
+ ps_level 3 ge
+def
+/ps_version
+ {version cvr} stopped {
+ -1
+ }if
+def
+/makereadonlyarray
+{
+ /packedarray where{
+ pop packedarray
+ }{
+ array astore readonly
+ }ifelse
+}bdf
+/map_reserved_ink_name
+{
+ dup type /stringtype eq{
+ dup /Red eq{
+ pop (_Red_)
+ }{
+ dup /Green eq{
+ pop (_Green_)
+ }{
+ dup /Blue eq{
+ pop (_Blue_)
+ }{
+ dup /Cyan eq{
+ pop (_Cyan_)
+ }{
+ dup /Magenta eq{
+ pop (_Magenta_)
+ }{
+ dup /Yellow eq{
+ pop (_Yellow_)
+ }{
+ dup /Black eq{
+ pop (_Black_)
+ }{
+ dup () cvn eq{
+ pop (Process)
+ }if
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }if
+}bdf
+/AGMUTIL_GSTATE 22 dict def
+/get_gstate
+{
+ AGMUTIL_GSTATE begin
+ /AGMUTIL_GSTATE_clr_spc currentcolorspace def
+ /AGMUTIL_GSTATE_clr_indx 0 def
+ /AGMUTIL_GSTATE_clr_comps 12 array def
+ mark currentcolor counttomark
+ {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put
+ /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop
+ /AGMUTIL_GSTATE_fnt rootfont def
+ /AGMUTIL_GSTATE_lw currentlinewidth def
+ /AGMUTIL_GSTATE_lc currentlinecap def
+ /AGMUTIL_GSTATE_lj currentlinejoin def
+ /AGMUTIL_GSTATE_ml currentmiterlimit def
+ currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf
+ /AGMUTIL_GSTATE_sa currentstrokeadjust def
+
+ /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def
+ /AGMUTIL_GSTATE_op currentoverprint def
+ /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def
+ /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def
+ currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf
+ cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf
+ /AGMUTIL_GSTATE_ht currenthalftone def
+ /AGMUTIL_GSTATE_flt currentflat def
+ end
+}def
+/set_gstate
+{
+ AGMUTIL_GSTATE begin
+ AGMUTIL_GSTATE_clr_spc setcolorspace
+ AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get
+ /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor
+ AGMUTIL_GSTATE_fnt setfont
+ AGMUTIL_GSTATE_lw setlinewidth
+ AGMUTIL_GSTATE_lc setlinecap
+ AGMUTIL_GSTATE_lj setlinejoin
+ AGMUTIL_GSTATE_ml setmiterlimit
+ AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash
+ AGMUTIL_GSTATE_sa setstrokeadjust
+
+ AGMUTIL_GSTATE_clr_rnd setcolorrendering
+ AGMUTIL_GSTATE_op setoverprint
+ AGMUTIL_GSTATE_bg cvx setblackgeneration
+ AGMUTIL_GSTATE_ucr cvx setundercolorremoval
+ AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx
+ AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer
+
+ AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or
+ {
+ currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne
+ {
+ mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark
+ } if
+ }{
+ AGMUTIL_GSTATE_ht sethalftone
+ } ifelse
+
+ AGMUTIL_GSTATE_flt setflat
+ end
+}def
+/AGMUTIL_str256 256 string def
+/AGMUTIL_src256 256 string def
+/AGMUTIL_dst64 64 string def
+/AGMUTIL_srcLen nd
+/AGMUTIL_ndx nd
+/rdline
+{
+ currentfile AGMUTIL_str256 readline pop
+} bdf
+/rdcmntline
+{
+ currentfile AGMUTIL_str256 readline pop
+ (%) anchorsearch {pop} if
+} bdf
+/filter_cmyk
+{
+ dup type /filetype ne{
+ 0 () /SubFileDecode filter
+ }if
+ [
+ exch
+ {
+ AGMUTIL_src256 readstring pop
+ dup length /AGMUTIL_srcLen exch def
+ /AGMUTIL_ndx 0 def
+
+ AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{
+ 1 index exch get
+ AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put
+ /AGMUTIL_ndx AGMUTIL_ndx 1 add def
+ }for
+ pop
+ AGMUTIL_dst64 0 AGMUTIL_ndx getinterval
+ }
+ bind
+ /exec cvx
+ ] cvx
+} bdf
+/AGMUTIL_imagefile nd
+/AGMUTIL_imbuf nd
+/read_image_file
+{
+ AGMUTIL_imagefile 0 setfileposition
+ dup /DataSource {AGMUTIL_imagefile AGMUTIL_imbuf readstring pop} put
+ exch
+ load exec
+}def
+/write_image_file
+{
+ begin
+ { (AGMUTIL_imagefile) (w+) file } stopped{
+ false
+ }{
+ Adobe_AGM_Utils/AGMUTIL_imagefile xddf
+ Adobe_AGM_Utils/AGMUTIL_imbuf Width BitsPerComponent mul 7 add 8 idiv string ddf
+ 1 1 Height {
+ pop
+ DataSource dup type /filetype eq{
+ AGMUTIL_imbuf readstring pop
+ }{
+ exec
+ } ifelse
+ AGMUTIL_imagefile exch writestring
+ }for
+ true
+ }ifelse
+ end
+}def
+/close_image_file
+{
+ AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile
+}def
+/consumeimagedata
+{
+ begin
+ currentdict /MultipleDataSources known not
+ {/MultipleDataSources false def} if
+ MultipleDataSources
+ {
+ 1 dict begin
+ /flushbuffer Width cvi string def
+ 1 1 Height cvi
+ {
+ pop
+ 0 1 DataSource length 1 sub
+ {
+ DataSource exch get
+ dup type dup
+ /filetype eq
+ {
+ exch flushbuffer readstring pop pop
+ }if
+ /arraytype eq
+ {
+ exec pop
+ }if
+ }for
+ }for
+ end
+ }
+ {
+ /DataSource load type dup
+ /filetype eq
+ {
+ 1 dict begin
+ /flushbuffer Width Decode length 2 div mul cvi string def
+ 1 1 Height { pop DataSource flushbuffer readstring pop pop} for
+ end
+ }if
+ /arraytype eq
+ {
+ 1 1 Height { pop DataSource pop } for
+ }if
+ }ifelse
+ end
+}bdf
+/addprocs
+{
+ 2{/exec load}repeat
+ 3 1 roll
+ [ 5 1 roll ] bind cvx
+}def
+/modify_halftone_xfer
+{
+ currenthalftone dup length dict copy begin
+ currentdict 2 index known{
+ 1 index load dup length dict copy begin
+ currentdict/TransferFunction known{
+ /TransferFunction load
+ }{
+ currenttransfer
+ }ifelse
+ addprocs /TransferFunction xdf
+ currentdict end def
+ currentdict end sethalftone
+ }{
+ currentdict/TransferFunction known{
+ /TransferFunction load
+ }{
+ currenttransfer
+ }ifelse
+ addprocs /TransferFunction xdf
+ currentdict end sethalftone
+ pop
+ }ifelse
+}def
+/doc_setup{
+ Adobe_AGM_Utils begin
+}bdf
+/doc_trailer{
+ currentdict Adobe_AGM_Utils eq{
+ end
+ }if
+}bdf
+systemdict /setpacking known
+{
+ setpacking
+} if
+%%EndResource
+%%BeginResource: procset Adobe_AGM_Core 2.0 0
+%%Version: 2.0 0
+%%Copyright: Copyright (C) 1997-1999 Adobe Systems, Inc. All Rights Reserved.
+systemdict /setpacking known
+{
+ currentpacking
+ true setpacking
+} if
+userdict /Adobe_AGM_Core 205 dict dup begin put
+/nd{
+ null def
+}bind def
+/Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def
+/AGMCORE_str256 256 string def
+/AGMCORE_src256 256 string def
+/AGMCORE_save nd
+/AGMCORE_graphicsave nd
+/AGMCORE_c 0 def
+/AGMCORE_m 0 def
+/AGMCORE_y 0 def
+/AGMCORE_k 0 def
+/AGMCORE_cmykbuf 4 array def
+/AGMCORE_screen [currentscreen] cvx def
+/AGMCORE_tmp 0 def
+/AGMCORE_&setgray nd
+/AGMCORE_&setcolor nd
+/AGMCORE_&setcolorspace nd
+/AGMCORE_&setcmykcolor nd
+/AGMCORE_cyan_plate nd
+/AGMCORE_magenta_plate nd
+/AGMCORE_yellow_plate nd
+/AGMCORE_black_plate nd
+/AGMCORE_plate_ndx nd
+/AGMCORE_get_ink_data nd
+/AGMCORE_is_cmyk_sep nd
+/AGMCORE_host_sep nd
+/AGMCORE_will_host_sep nd
+/AGMCORE_avoid_L2_sep_space nd
+/AGMCORE_distilling nd
+/AGMCORE_composite_job nd
+/AGMCORE_producing_seps nd
+/AGMCORE_ps_level -1 def
+/AGMCORE_ps_version -1 def
+/AGMCORE_environ_ok nd
+/AGMCORE_CSA_cache 0 dict def
+/AGMCORE_CSD_cache 0 dict def
+/AGMCORE_pattern_cache 0 dict def
+/AGMCORE_currentoverprint false def
+/AGMCORE_deltaX nd
+/AGMCORE_deltaY nd
+/AGMCORE_name nd
+/AGMCORE_sep_special nd
+/AGMCORE_err_strings 4 dict def
+/AGMCORE_cur_err nd
+/AGMCORE_ovp nd
+/AGMCORE_current_spot_alias false def
+/AGMCORE_inverting false def
+/AGMCORE_feature_dictCount nd
+/AGMCORE_feature_opCount nd
+/AGMCORE_feature_ctm nd
+/AGMCORE_ConvertToProcess false def
+/AGMCORE_Default_CTM matrix def
+/knockout_unitsq nd
+/AGMCORE_CRD_cache where{
+ pop
+}{
+ /AGMCORE_CRD_cache 0 dict def
+}ifelse
+/AGMCORE_key_known
+{
+ where{
+ /Adobe_AGM_Core_Id known
+ }{
+ false
+ }ifelse
+}ndf
+/flushinput
+{
+ save
+ /CompareBuffer 3 -1 roll def
+ /readbuffer 256 string def
+ mark
+ {
+ currentfile readbuffer {readline} stopped
+ {cleartomark mark}
+ {
+ not
+ {pop exit}
+ if
+ CompareBuffer eq
+ {exit}
+ if
+ }ifelse
+ }loop
+ cleartomark
+ restore
+}bdf
+/getspotfunction
+{
+ AGMCORE_screen exch pop exch pop
+ dup type /dicttype eq{
+ dup /HalftoneType get 1 eq{
+ /SpotFunction get
+ }{
+ dup /HalftoneType get 2 eq{
+ /GraySpotFunction get
+ }{
+ pop
+ {
+ abs exch abs 2 copy add 1 gt{
+ 1 sub dup mul exch 1 sub dup mul add 1 sub
+ }{
+ dup mul exch dup mul add 1 exch sub
+ }ifelse
+ }bind
+ }ifelse
+ }ifelse
+ }if
+} def
+/clp_npth
+{
+ clip newpath
+} def
+/eoclp_npth
+{
+ eoclip newpath
+} def
+/stkpath_clp_npth
+{
+ strokepath clip newpath
+} def
+/stk_n_clp_npth
+{
+ gsave stroke grestore clip newpath
+} def
+/npth_clp
+{
+ newpath clip
+} def
+/graphic_setup
+{
+ /AGMCORE_graphicsave save def
+ concat
+ 0 setgray
+ 0 setlinecap
+ 0 setlinejoin
+ 1 setlinewidth
+ [] 0 setdash
+ 10 setmiterlimit
+ newpath
+ false setoverprint
+ false setstrokeadjust
+ Adobe_AGM_Core/spot_alias get exec
+ /Adobe_AGM_Image where {
+ pop
+ Adobe_AGM_Image/spot_alias 2 copy known{
+ get exec
+ }{
+ pop pop
+ }ifelse
+ } if
+ 100 dict begin
+ /showpage {} def
+ mark
+} def
+/graphic_cleanup
+{
+ cleartomark
+ end
+ AGMCORE_graphicsave restore
+} def
+/compose_error_msg
+{
+ grestoreall initgraphics
+ /Helvetica findfont 10 scalefont setfont
+
+ /AGMCORE_deltaY 100 def
+ /AGMCORE_deltaX 310 def
+
+ clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto
+ 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto
+ 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath
+ 0 AGMCORE_&setgray
+ gsave 1 AGMCORE_&setgray fill grestore
+ 1 setlinewidth gsave stroke grestore
+
+ currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto
+
+ /AGMCORE_deltaY 12 def
+ /AGMCORE_tmp 0 def
+ AGMCORE_err_strings exch get
+ {
+ dup 32 eq
+ {
+ pop
+ AGMCORE_str256 0 AGMCORE_tmp getinterval
+ stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt
+ {
+ currentpoint AGMCORE_deltaY sub exch pop
+ clippath pathbbox pop pop pop 44 add exch moveto
+ } if
+ AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show
+
+ 0 1 AGMCORE_str256 length 1 sub
+ {
+ AGMCORE_str256 exch 0 put
+ }for
+ /AGMCORE_tmp 0 def
+ }
+ {
+ AGMCORE_str256 exch AGMCORE_tmp exch put
+ /AGMCORE_tmp AGMCORE_tmp 1 add def
+ } ifelse
+ } forall
+} bdf
+/doc_setup{
+ Adobe_AGM_Core begin
+
+ /AGMCORE_will_host_separate xdf
+ /AGMCORE_ps_version xdf
+ /AGMCORE_ps_level xdf
+
+ errordict /AGM_handleerror known not{
+ errordict /AGM_handleerror errordict /handleerror get put
+ errordict /handleerror {
+ Adobe_AGM_Core begin
+ $error /newerror get AGMCORE_cur_err null ne and{
+ $error /newerror false put
+ AGMCORE_cur_err compose_error_msg
+ }if
+ $error /newerror true put
+ end
+ errordict /AGM_handleerror get exec
+ } bind put
+ }if
+
+ /AGMCORE_environ_ok
+ ps_level AGMCORE_ps_level ge
+ ps_version AGMCORE_ps_version ge and
+ AGMCORE_ps_level -1 eq or
+ def
+
+ AGMCORE_environ_ok not
+ {/AGMCORE_cur_err /AGMCORE_bad_environ def} if
+
+ /AGMCORE_&setgray systemdict/setgray get def
+ level2{
+ /AGMCORE_&setcolor systemdict/setcolor get def
+ /AGMCORE_&setcolorspace systemdict/setcolorspace get def
+ }if
+ /AGMCORE_distilling
+ /product where{
+ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and
+ }{
+ false
+ }ifelse
+ def
+ /AGMCORE_in_rip_sep
+ /AGMCORE_in_rip_sep where{
+ pop AGMCORE_in_rip_sep
+ }{
+ AGMCORE_distilling
+ {
+ false
+ }{
+ userdict/Adobe_AGM_OnHost_Seps known{
+ false
+ }{
+ level2{
+ currentpagedevice/Separations 2 copy known{
+ get
+ }{
+ pop pop false
+ }ifelse
+ }{
+ false
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ def
+ level2 not{
+ /xput{
+ dup load dup length exch maxlength eq{
+ dup dup load dup
+ length dup 0 eq {pop 1} if 2 mul dict copy def
+ }if
+ load begin
+ def
+ end
+ }def
+ }{
+ /xput{
+ load 3 1 roll put
+ }def
+ }ifelse
+ /AGMCORE_GSTATE AGMCORE_key_known not{
+ /AGMCORE_GSTATE 21 dict def
+ /AGMCORE_gstack 32 array def
+ /AGMCORE_gstackptr 0 def
+ /AGMCORE_gstacksaveptr 0 def
+ /AGMCORE_gstackframekeys 8 def
+
+ /AGMCORE_&gsave /gsave ldf
+ /AGMCORE_&grestore /grestore ldf
+ /AGMCORE_&grestoreall /grestoreall ldf
+ /AGMCORE_&save /save ldf
+ /AGMCORE_gdictcopy {
+ begin
+ { def } forall
+ end
+ }def
+ /AGMCORE_gput {
+ AGMCORE_gstack AGMCORE_gstackptr get
+ 3 1 roll
+ put
+ }def
+ /AGMCORE_gget {
+ AGMCORE_gstack AGMCORE_gstackptr get
+ exch
+ get
+ }def
+ /gsave {
+ AGMCORE_&gsave
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gstackptr 1 add
+ dup 32 ge {limitcheck} if
+ Adobe_AGM_Core exch
+ /AGMCORE_gstackptr exch put
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gdictcopy
+ }def
+ /grestore {
+ AGMCORE_&grestore
+ AGMCORE_gstackptr 1 sub
+ dup AGMCORE_gstacksaveptr lt {1 add} if
+ Adobe_AGM_Core exch
+ /AGMCORE_gstackptr exch put
+ }def
+ /grestoreall {
+ AGMCORE_&grestoreall
+ Adobe_AGM_Core
+ /AGMCORE_gstackptr AGMCORE_gstacksaveptr put
+ }def
+ /save {
+ AGMCORE_&save
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gstackptr 1 add
+ dup 32 ge {limitcheck} if
+ Adobe_AGM_Core begin
+ /AGMCORE_gstackptr exch def
+ /AGMCORE_gstacksaveptr AGMCORE_gstackptr def
+ end
+ AGMCORE_gstack AGMCORE_gstackptr get
+ AGMCORE_gdictcopy
+ }def
+ 0 1 AGMCORE_gstack length 1 sub {
+ AGMCORE_gstack exch AGMCORE_gstackframekeys dict put
+ } for
+ }if
+ /currentcmykcolor [0 0 0 0] AGMCORE_gput
+ /currentstrokeadjust false AGMCORE_gput
+ /currentcolorspace [/DeviceGray] AGMCORE_gput
+ /sep_tint 0 AGMCORE_gput
+ /sep_colorspace_dict null AGMCORE_gput
+ /indexed_colorspace_dict null AGMCORE_gput
+ /currentcolor_intent () AGMCORE_gput
+ /customcolor_tint 1 AGMCORE_gput
+ end
+}def
+/page_setup
+{
+ /setcmykcolor where{
+ pop
+ Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put
+ }if
+ Adobe_AGM_Core begin
+ /setcmykcolor
+ {
+ 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput
+ 1 sub 4 1 roll
+ 3 {
+ 3 index add neg dup 0 lt {
+ pop 0
+ } if
+ 3 1 roll
+ } repeat
+ setrgbcolor pop
+ }ndf
+ /currentcmykcolor
+ {
+ /currentcmykcolor AGMCORE_gget aload pop
+ }ndf
+ /setoverprint
+ {
+ pop
+ }ndf
+ /currentoverprint
+ {
+ false
+ }ndf
+ /AGMCORE_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def
+ /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def
+ /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def
+ /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def
+ /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def
+ /AGMCORE_plate_ndx
+ AGMCORE_cyan_plate{
+ 0
+ }{
+ AGMCORE_magenta_plate{
+ 1
+ }{
+ AGMCORE_yellow_plate{
+ 2
+ }{
+ AGMCORE_black_plate{
+ 3
+ }{
+ 4
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ def
+ /AGMCORE_composite_job
+ AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def
+
+ /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def
+
+ /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def
+
+ /AGM_preserve_spots
+ /AGM_preserve_spots where{
+ pop AGM_preserve_spots
+ }{
+ AGMCORE_distilling AGMCORE_producing_seps or
+ }ifelse
+ def
+ /AGM_is_distiller_preserving_spotimages
+ {
+ currentdistillerparams/PreserveOverprintSettings known
+ {
+ currentdistillerparams/PreserveOverprintSettings get
+ {
+ currentdistillerparams/ColorConversionStrategy known
+ {
+ currentdistillerparams/ColorConversionStrategy get
+ /LeaveColorUnchanged eq
+ }{
+ true
+ }ifelse
+ }{
+ false
+ }ifelse
+ }{
+ false
+ }ifelse
+ }def
+ /convert_spot_to_process where {pop}{
+ /convert_spot_to_process
+ {
+ dup dup (None) eq exch (All) eq or
+ {
+ pop false
+ }{
+ AGMCORE_host_sep
+ {
+ gsave
+ 1 0 0 0 setcmykcolor currentgray 1 exch sub
+ 0 1 0 0 setcmykcolor currentgray 1 exch sub
+ 0 0 1 0 setcmykcolor currentgray 1 exch sub
+ 0 0 0 1 setcmykcolor currentgray 1 exch sub
+ add add add 0 eq
+ {
+ pop false
+ }{
+ false setoverprint
+ 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor
+ currentgray 0 eq
+ }ifelse
+ grestore
+ }{
+ AGMCORE_distilling
+ {
+ pop AGM_is_distiller_preserving_spotimages not
+ }{
+ Adobe_AGM_Core/AGMCORE_name xddf
+ false
+ currentpagedevice/OverrideSeparations known
+ {
+ currentpagedevice/OverrideSeparations get
+ {
+ /HqnSpots /ProcSet resourcestatus
+ {
+ pop pop pop true
+ }if
+ }if
+ }if
+ {
+ AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not
+ }{
+ gsave
+ [/Separation AGMCORE_name /DeviceGray {}]setcolorspace
+ false
+ currentpagedevice/SeparationColorNames 2 copy known
+ {
+ get
+ { AGMCORE_name eq or}forall
+ not
+ }{
+ pop pop pop true
+ }ifelse
+ grestore
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }def
+ }ifelse
+ /convert_to_process where {pop}{
+ /convert_to_process
+ {
+ dup length 0 eq
+ {
+ pop false
+ }{
+ AGMCORE_host_sep
+ {
+ true exch
+ {
+ convert_spot_to_process and
+ }
+ forall
+ }{
+ false exch
+ {
+ convert_spot_to_process or
+ }
+ forall
+ }ifelse
+ }ifelse
+ }def
+ }ifelse
+ AGMCORE_host_sep AGMCORE_will_host_separate not and {
+ /AGMCORE_cur_err /AGMCORE_color_space_onhost_seps def
+ AGMCORE_color_space_onhost_seps
+ }if
+ /AGMCORE_avoid_L2_sep_space
+ version cvr 2012 lt
+ level2 and
+ AGMCORE_producing_seps not and
+ def
+ /AGMCORE_is_cmyk_sep
+ AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or
+ def
+ /AGM_avoid_0_cmyk where{
+ pop AGM_avoid_0_cmyk
+ }{
+ AGM_preserve_spots
+ userdict/Adobe_AGM_OnHost_Seps known
+ userdict/Adobe_AGM_InRip_Seps known or
+ not and
+ }ifelse
+ {
+ /setcmykcolor[
+ {
+ 4 copy add add add 0 eq currentoverprint and{
+ pop 0.0005
+ }if
+ }/exec cvx
+ /AGMCORE_&setcmykcolor load dup type/operatortype ne{
+ /exec cvx
+ }if
+ ]cvx def
+ }if
+ AGMCORE_host_sep{
+ /AGMCORE_get_ink_data
+ AGMCORE_cyan_plate{
+ {pop pop pop}
+ }{
+ AGMCORE_magenta_plate{
+ {4 3 roll pop pop pop}
+ }{
+ AGMCORE_yellow_plate{
+ {4 2 roll pop pop pop}
+ }{
+ {4 1 roll pop pop pop}
+ }ifelse
+ }ifelse
+ }ifelse
+ def
+ /clip AGMCORE_key_known not{
+ Adobe_AGM_Core/AGMCORE_&clip /clip load put
+ /clip
+ {
+ current_spot_alias{
+ currentdict/InksUsed known{
+ [
+ InksUsed{
+ dup map_alias{
+ /Name get exch pop
+ }if
+ }forall
+ ]
+ /InksUsed xdf
+ }if
+ }if
+ AGMCORE_&clip
+ }def
+ }if
+ /eoclip AGMCORE_key_known not{
+ Adobe_AGM_Core/AGMCORE_&eoclip /eoclip load put
+ /eoclip
+ {
+ current_spot_alias{
+ currentdict/InksUsed known{
+ [
+ InksUsed{
+ dup map_alias{
+ /Name get exch pop
+ }if
+ }forall
+ ]
+ /InksUsed xdf
+ }if
+ }if
+ AGMCORE_&eoclip
+ }def
+ }if
+ }if
+ AGMCORE_in_rip_sep{
+ /setcustomcolor
+ {
+ exch aload pop
+ dup 7 1 roll inRip_spot_has_ink not {
+ 4 {4 index mul 4 1 roll}
+ repeat
+ /DeviceCMYK setcolorspace
+ 6 -2 roll pop pop
+ }{
+ Adobe_AGM_Core begin
+ /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf
+ end
+ [/Separation 4 -1 roll /DeviceCMYK
+ {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul}
+ ]
+ setcolorspace
+ }ifelse
+ setcolor
+ }ndf
+ /setseparationgray
+ {
+ [/Separation (All) /DeviceGray {}] setcolorspace_opt
+ 1 exch sub setcolor
+ }ndf
+ }{
+ /setseparationgray
+ {
+ AGMCORE_&setgray
+ }ndf
+ }ifelse
+ /findcmykcustomcolor
+ {
+ 5 makereadonlyarray
+ }ndf
+ /setcustomcolor
+ {
+ exch aload pop pop
+ 4 {4 index mul 4 1 roll} repeat
+ setcmykcolor pop
+ }ndf
+
+ /has_color
+ /colorimage where{
+ AGMCORE_producing_seps{
+ pop true
+ }{
+ systemdict eq
+ }ifelse
+ }{
+ false
+ }ifelse
+ def
+
+ /map_index
+ {
+ 1 index mul exch getinterval {255 div} forall
+ }def
+
+ level2{
+ /mo /moveto ldf
+ /li /lineto ldf
+ /cv /curveto ldf
+ /knockout_unitsq
+ {
+ 1 setgray
+ 0 0 1 1 rectfill
+ }def
+ /level2ScreenFreq{
+ begin
+ 60
+ HalftoneType 1 eq{
+ pop Frequency
+ }if
+ HalftoneType 2 eq{
+ pop GrayFrequency
+ }if
+ HalftoneType 5 eq{
+ pop Default level2ScreenFreq
+ }if
+ end
+ }def
+ /currentScreenFreq{
+ currenthalftone level2ScreenFreq
+ }def
+ level2 /setcolorspace AGMCORE_key_known not and{
+
+ /AGMCORE_&&&setcolorspace /setcolorspace ldf
+ /AGMCORE_ReplaceMappedColor
+ {
+ dup type dup /arraytype eq exch /packedarraytype eq or
+ {
+ dup 0 get dup /Separation eq
+ {
+ pop
+ dup length array copy
+ dup dup 1 get
+ current_spot_alias
+ {
+ dup map_alias
+ {
+ begin
+ /sep_colorspace_dict currentdict AGMCORE_gput
+ pop pop pop
+
+ [
+ /Separation Name
+ CSA map_csa
+ dup /MappedCSA xdf
+ /sep_colorspace_proc load
+ ]
+ dup Name
+ end
+ }if
+ }if
+ map_reserved_ink_name 1 exch put
+ }{
+ /DeviceN eq
+ {
+ dup length array copy
+ dup dup 1 get [
+ exch {
+ current_spot_alias{
+ dup map_alias{
+ /Name get exch pop
+ }if
+ }if
+ map_reserved_ink_name
+ } forall
+ ] 1 exch put
+ }if
+ }ifelse
+ }if
+ }def
+ /setcolorspace
+ {
+ dup type dup /arraytype eq exch /packedarraytype eq or
+ {
+ dup 0 get /Indexed eq
+ {
+ AGMCORE_distilling
+ {
+ /PhotoshopDuotoneList where
+ {
+ pop false
+ }{
+ true
+ }ifelse
+ }{
+ true
+ }ifelse
+ {
+ aload pop 3 -1 roll
+ AGMCORE_ReplaceMappedColor
+ 3 1 roll 4 array astore
+ }if
+ }{
+ AGMCORE_ReplaceMappedColor
+ }ifelse
+ }if
+ AGMCORE_&&&setcolorspace
+ }def
+ }if
+ }{
+
+ /adj
+ {
+ currentstrokeadjust{
+ transform
+ 0.25 sub round 0.25 add exch
+ 0.25 sub round 0.25 add exch
+ itransform
+ }if
+ }def
+ /mo{
+ adj moveto
+ }def
+ /li{
+ adj lineto
+ }def
+ /cv{
+ 6 2 roll adj
+ 6 2 roll adj
+ 6 2 roll adj curveto
+ }def
+ /knockout_unitsq
+ {
+ 1 setgray
+ 8 8 1 [8 0 0 8 0 0] {<ffffffffffffffff>} image
+ }def
+ /currentstrokeadjust{
+ /currentstrokeadjust AGMCORE_gget
+ }def
+ /setstrokeadjust{
+ /currentstrokeadjust exch AGMCORE_gput
+ }def
+ /currentScreenFreq{
+ currentscreen pop pop
+ }def
+ /setcolorspace
+ {
+ /currentcolorspace exch AGMCORE_gput
+ } def
+
+ /currentcolorspace
+ {
+ /currentcolorspace AGMCORE_gget
+ } def
+
+ /n_color_components
+ {
+ dup type /arraytype eq{
+ 0 get
+ }if
+ dup /DeviceGray eq{
+ pop 1
+ }{
+ /DeviceCMYK eq{
+ 4
+ }{
+ 3
+ }ifelse
+ }ifelse
+ } def
+
+ /setcolor_devicecolor
+ {
+ dup type /arraytype eq{
+ 0 get
+ }if
+ dup /DeviceGray eq{
+ pop setgray
+ }{
+ /DeviceCMYK eq{
+ setcmykcolor
+ }{
+ setrgbcolor
+ }ifelse
+ }ifelse
+ }def
+
+ /setcolor
+ {
+ currentcolorspace 0 get
+ dup /DeviceGray ne{
+ dup /DeviceCMYK ne{
+ dup /DeviceRGB ne{
+ dup /Separation eq{
+ pop
+ currentcolorspace 3 get exec
+ currentcolorspace 2 get
+ }{
+ dup /Indexed eq{
+ pop
+ currentcolorspace 3 get dup type /stringtype eq{
+ currentcolorspace 1 get n_color_components
+ 3 -1 roll map_index
+ }{
+ exec
+ }ifelse
+ currentcolorspace 1 get
+ }{
+ /AGMCORE_cur_err /AGMCORE_invalid_color_space def
+ AGMCORE_invalid_color_space
+ }ifelse
+ }ifelse
+ }if
+ }if
+ }if
+ setcolor_devicecolor
+ } def
+ }ifelse
+
+ /sop /setoverprint ldf
+ /lw /setlinewidth ldf
+ /lc /setlinecap ldf
+ /lj /setlinejoin ldf
+ /ml /setmiterlimit ldf
+ /dsh /setdash ldf
+ /sadj /setstrokeadjust ldf
+ /gry /setgray ldf
+ /rgb /setrgbcolor ldf
+ /cmyk /setcmykcolor ldf
+ /sep /setsepcolor ldf
+ /idx /setindexedcolor ldf
+ /colr /setcolor ldf
+ /csacrd /set_csa_crd ldf
+ /sepcs /setsepcolorspace ldf
+ /idxcs /setindexedcolorspace ldf
+ /cp /closepath ldf
+ /clp /clp_npth ldf
+ /eclp /eoclp_npth ldf
+ /spclp /stkpath_clp_npth ldf
+ /f /fill ldf
+ /ef /eofill ldf
+ /s /stroke ldf
+ /sclp /stk_n_clp_npth ldf
+ /nclp /npth_clp ldf
+ /gset /graphic_setup ldf
+ /gcln /graphic_cleanup ldf
+
+ currentdict{
+ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and {
+ bind
+ }if
+ def
+ }forall
+}def
+/page_trailer
+{
+ end
+}def
+/doc_trailer{
+}def
+systemdict /findcolorrendering known{
+ /findcolorrendering systemdict /findcolorrendering get def
+}if
+systemdict /setcolorrendering known{
+ /setcolorrendering systemdict /setcolorrendering get def
+}if
+/test_cmyk_color_plate
+{
+ gsave
+ setcmykcolor currentgray 1 ne
+ grestore
+}def
+/inRip_spot_has_ink
+{
+ dup Adobe_AGM_Core/AGMCORE_name xddf
+ convert_spot_to_process not
+}def
+/current_ink
+{
+ dup length 0 eq{
+ pop true
+ }{
+ Adobe_AGM_Core/ink_result false put
+ {
+ dup /ProcessCyan eq{
+ AGMCORE_cyan_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /ProcessMagenta eq{
+ AGMCORE_magenta_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /ProcessYellow eq{
+ AGMCORE_yellow_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /ProcessBlack eq{
+ AGMCORE_black_plate ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ dup /sep_colorspace_dict AGMCORE_gget dup null eq{
+ pop false ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ /Name get eq{
+ 1 setsepcolor
+ currentgray 1 ne ink_result or Adobe_AGM_Core/ink_result xddf
+ }{
+ false ink_result or Adobe_AGM_Core/ink_result xddf
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ pop
+ } forall
+ ink_result
+ }ifelse
+}def
+/map255_to_range
+{
+ 1 index sub
+ 3 -1 roll 255 div mul add
+}def
+/set_csa_crd
+{
+ /sep_colorspace_dict null AGMCORE_gput
+ begin
+ CSA map_csa setcolorspace_opt
+ set_crd
+ end
+}
+def
+/setsepcolor
+{
+
+ /sep_colorspace_dict AGMCORE_gget begin
+ dup /sep_tint exch AGMCORE_gput
+ TintProc
+ end
+} def
+/sep_colorspace_proc
+{
+ Adobe_AGM_Core/AGMCORE_tmp xddf
+ /sep_colorspace_dict AGMCORE_gget begin
+ currentdict/Components known{
+ Components aload pop
+ TintMethod/Lab eq{
+ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat
+ LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll
+ }{
+ TintMethod/Subtractive eq{
+ NComponents{
+ AGMCORE_tmp mul NComponents 1 roll
+ }repeat
+ }{
+ NComponents{
+ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll
+ } repeat
+ }ifelse
+ }ifelse
+ }{
+ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get
+ aload pop
+ }ifelse
+ end
+} def
+/sep_colorspace_gray_proc
+{
+ Adobe_AGM_Core/AGMCORE_tmp xddf
+ /sep_colorspace_dict AGMCORE_gget begin
+ GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get
+ end
+} def
+/sep_proc_name
+{
+ dup 0 get
+ dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{
+ pop [/DeviceGray]
+ /sep_colorspace_gray_proc
+ }{
+ /sep_colorspace_proc
+ }ifelse
+} def
+/setsepcolorspace
+{
+
+ current_spot_alias{
+ dup begin
+ Name map_alias{
+ exch pop
+ }if
+ end
+ }if
+ dup /sep_colorspace_dict exch AGMCORE_gput
+ begin
+ /MappedCSA CSA map_csa def
+ Adobe_AGM_Core/AGMCORE_sep_special Name dup () eq exch (All) eq or ddf
+
+ AGMCORE_avoid_L2_sep_space{
+ [/Indexed MappedCSA sep_proc_name 255 exch
+ { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx
+ ] setcolorspace_opt
+ /TintProc {
+ 255 mul round cvi setcolor
+ }bdf
+ }{
+ MappedCSA 0 get /DeviceCMYK eq
+ currentdict/Components known and
+ AGMCORE_sep_special not and{
+ /TintProc [
+ Components aload pop Name findcmykcustomcolor
+ /exch cvx /setcustomcolor cvx
+ ] cvx bdf
+ }{
+ AGMCORE_host_sep Name (All) eq and{
+ /TintProc {
+ 1 exch sub setseparationgray
+ }bdf
+ }{
+ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and
+ AGMCORE_host_sep or
+ Name () eq and{
+ /TintProc [
+ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{
+ cvx /setcmykcolor cvx
+ }{
+ cvx /setgray cvx
+ }ifelse
+ ] cvx bdf
+ }{
+ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{
+ /TintProc [
+ /dup cvx
+ MappedCSA sep_proc_name cvx exch
+ 0 get /DeviceGray eq{
+ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx
+ }if
+ /Name cvx /findcmykcustomcolor cvx /exch cvx
+
+ AGMCORE_host_sep{
+ AGMCORE_is_cmyk_sep
+ }{
+ Name inRip_spot_has_ink not
+ }ifelse
+ {
+ /pop cvx 1
+ }if
+ /setcustomcolor cvx
+ ] cvx bdf
+ }{
+ /TintProc /setcolor ldf
+
+ [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ set_crd
+ setsepcolor
+ end
+} def
+/setindexedcolorspace
+{
+ dup /indexed_colorspace_dict exch AGMCORE_gput
+ begin
+ /MappedCSA CSA map_csa def
+ AGMCORE_host_sep level2 not and{
+ 0 0 0 0 setcmykcolor
+ }{
+ [/Indexed MappedCSA
+ level2 not has_color not and{
+ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{
+ pop [/DeviceGray]
+ }if
+ HiVal GrayLookup
+ }{
+ HiVal
+ currentdict/RangeArray known{
+ {
+ /indexed_colorspace_dict AGMCORE_gget begin
+ Lookup exch
+ dup HiVal gt{
+ pop HiVal
+ }if
+ NComponents mul NComponents getinterval {} forall
+ NComponents 1 sub -1 0{
+ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range
+ NComponents 1 roll
+ }for
+ end
+ } bind
+ }{
+ Lookup
+ }ifelse
+ }ifelse
+ ] setcolorspace_opt
+
+ set_crd
+ }ifelse
+ end
+}def
+/setindexedcolor
+{
+ AGMCORE_host_sep{
+ /indexed_colorspace_dict AGMCORE_gget/Lookup get 4 3 -1 roll map_index setcmykcolor
+ }{
+ setcolor
+ }ifelse
+} def
+/ignoreimagedata
+{
+ currentoverprint not{
+ gsave
+ dup begin
+ 1 setgray
+ 0 0 ImageMatrix itransform
+ Width Height ImageMatrix idtransform rectfill
+ end
+ grestore
+ }if
+ consumeimagedata
+}def
+/add_csa
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_CSA_cache xput
+ end
+}def
+/map_csa
+{
+ dup type /nametype eq{
+ Adobe_AGM_Core/AGMCORE_CSA_cache get exch get
+ }if
+}def
+/add_csd
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_CSD_cache xput
+ end
+}def
+/get_csd
+{
+ dup type /nametype eq{
+ Adobe_AGM_Core/AGMCORE_CSD_cache get exch get
+ }if
+}def
+/get_csd_by_name
+{
+ dup type dup /nametype eq exch /stringtype eq or{
+ Adobe_AGM_Core begin
+ /AGMCORE_CSD_Name xdf
+ AGMCORE_CSD_cache
+ {
+ dup /Name get AGMCORE_CSD_Name eq
+ {
+ exch pop exit
+ }{
+ pop
+ }ifelse
+ pop
+ }forall
+ end
+ }if
+}def
+/cachepattern_level2
+{
+ 4 dict begin
+ /comparebuffer exch def
+ /holdbuffer exch def
+ /readbuffer 1024 string def
+ /LZWFilter holdbuffer /LZWEncode filter def
+ {
+ currentfile readbuffer readline not
+ {pop exit}
+ if
+ dup LZWFilter exch writestring
+ LZWFilter (\n) writestring
+ comparebuffer eq
+ {exit}
+ if
+ }loop
+ LZWFilter closefile
+ end
+}def
+/cachepattern_level3
+{
+ 3 dict begin
+ /comparebuffer exch def
+ /readbuffer 1024 string def
+ /DoEOL false def
+ {
+ DoEOL
+ {
+ (\n)
+ /DoEOL false def
+ }
+ {
+ currentfile readbuffer readline not
+ {pop ()}
+ {
+ dup length 0 eq
+ { pop(\n)}
+ {
+ dup comparebuffer eq
+ {pop ()}
+ {/DoEOL true def}
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+ } /ReusableStreamDecode filter
+ end
+}def
+/add_pattern
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_pattern_cache xput
+ end
+}def
+/get_pattern
+{
+ dup type /nametype eq{
+ Adobe_AGM_Core/AGMCORE_pattern_cache get exch get
+ }if
+}def
+/make_pattern
+{
+ dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform
+ exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub
+ exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub
+ matrix translate exch matrix concatmatrix
+ makepattern
+}def
+/set_pattern
+{
+ dup /PatternType get 1 eq{
+ dup /PaintType get 1 eq{
+ false sop [/DeviceGray] setcolorspace 0 setgray
+ }if
+ }if
+ setpattern
+}def
+/setcolorspace_opt
+{
+ dup currentcolorspace eq{
+ pop
+ }{
+ setcolorspace
+ }ifelse
+}def
+/updatecolorrendering
+{
+
+ currentcolorrendering/Intent known{
+ currentcolorrendering/Intent get
+ }{
+ null
+ }ifelse
+
+ Intent ne{
+ false
+ Intent
+ AGMCORE_CRD_cache {
+ exch pop
+ begin
+ dup Intent eq{
+ currentdict setcolorrendering_opt
+ end
+ exch pop true exch
+ exit
+ }if
+ end
+ } forall
+ pop
+ not{
+ systemdict /findcolorrendering known{
+ Intent findcolorrendering pop
+ /ColorRendering findresource
+ dup length dict copy
+ setcolorrendering_opt
+ }if
+ }if
+ }if
+} def
+/add_crd
+{
+ AGMCORE_CRD_cache 3 1 roll put
+}def
+/set_crd
+{
+ AGMCORE_host_sep not level2 and{
+ currentdict/CRD known{
+ AGMCORE_CRD_cache CRD get dup null ne{
+ setcolorrendering_opt
+ }{
+ pop
+ }ifelse
+ }{
+ currentdict/Intent known{
+ updatecolorrendering
+ }if
+ }ifelse
+ }if
+}def
+/setcolorrendering_opt
+{
+ dup currentcolorrendering eq{
+ pop
+ }{
+ begin
+ /Intent Intent def
+ currentdict
+ end
+ setcolorrendering
+ }ifelse
+}def
+/cdndf
+{
+ exch dup currentdict exch known{
+ pop pop
+ }{
+ exch def
+ }ifelse
+}def
+/cpaint_gcomp
+{
+ convert_to_process Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf
+ Adobe_AGM_Core/AGMCORE_ConvertToProcess get not
+ {
+ (%end_cpaint_gcomp) flushinput
+ }if
+}def
+/cpaint_gsep
+{
+ Adobe_AGM_Core/AGMCORE_ConvertToProcess get
+ {
+ (%end_cpaint_gsep) flushinput
+ }if
+}def
+/cpaint_gend
+{
+ newpath
+}def
+/AGMCORE_ctm_stack bdict
+ /push_ctm {
+ stack length size le{
+ stack dup length 2 mul array
+ dup /stack exch def
+ copy pop
+ }if
+ stack size 3 -1 roll put
+ /size size 1 add def
+ }
+ /pop_ctm {
+ /size size 1 sub def
+ size 0 lt{
+ /size 0 def
+ }if
+ stack size get
+ }
+ /stack 1 array
+ /size 0
+edict
+def
+/save_ctm
+{
+ matrix currentmatrix AGMCORE_ctm_stack begin
+ push_ctm
+ end
+}def
+/restore_ctm
+{
+ AGMCORE_ctm_stack begin
+ pop_ctm
+ end
+ setmatrix
+}def
+/path_rez
+{
+ dup 0 ne{
+ AGMCORE_deviceDPI exch div
+ dup 1 lt{
+ pop 1
+ }if
+ setflat
+ }{
+ pop
+ }ifelse
+}def
+/rdcmntline {
+ currentfile AGMCORE_str256 readline pop
+ (%) anchorsearch {pop} if
+} def
+/set_spot_alias_ary
+{
+ /AGMCORE_SpotAliasAry where{
+ pop pop
+ }{
+ Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf
+ true set_spot_alias
+ }ifelse
+}def
+/set_spot_alias
+{
+ /AGMCORE_SpotAliasAry where{
+ /AGMCORE_current_spot_alias 3 -1 roll put
+ }{
+ pop
+ }ifelse
+}def
+/current_spot_alias
+{
+ /AGMCORE_SpotAliasAry where{
+ /AGMCORE_current_spot_alias get
+ }{
+ false
+ }ifelse
+}def
+/map_alias
+{
+ /AGMCORE_SpotAliasAry where{
+ begin
+ /AGMCORE_name xdf
+ false
+ AGMCORE_SpotAliasAry{
+ dup/Name get AGMCORE_name eq{
+ save exch
+ /Adobe_AGM_Core currentdict def
+ /CSD get get_csd
+ exch restore
+ exch pop true
+ exit
+ }{
+ pop
+ }ifelse
+ }forall
+ end
+ }{
+ pop false
+ }ifelse
+}bdf
+/spot_alias
+{
+ true set_spot_alias
+
+ /AGMCORE_&setcustomcolor AGMCORE_key_known not {
+ Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put
+ } if
+ /customcolor_tint 1 AGMCORE_gput
+
+ Adobe_AGM_Core begin
+ /setcustomcolor
+ {
+
+ dup /customcolor_tint exch AGMCORE_gput
+
+ current_spot_alias{
+ 1 index 4 get map_alias{
+ mark 3 1 roll
+ setsepcolorspace
+ counttomark 0 ne{
+ setsepcolor
+ }if
+ pop
+ pop
+ }{
+ AGMCORE_&setcustomcolor
+ }ifelse
+ }{
+ AGMCORE_&setcustomcolor
+ }ifelse
+ }bdf
+ end
+}def
+/begin_feature
+{
+ Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put
+ count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put
+ {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if
+}def
+/end_feature
+{
+ 2 dict begin
+ /spd /setpagedevice load def
+ /setpagedevice { get_gstate spd set_gstate } def
+ stopped{$error/newerror false put}if
+ end
+ count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse
+ countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse
+ {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if
+}def
+/set_negative
+{
+ Adobe_AGM_Core begin
+ /AGMCORE_inverting exch def
+ level2{
+ currentpagedevice/NegativePrint known{
+ currentpagedevice/NegativePrint get Adobe_AGM_Core/AGMCORE_inverting get ne{
+ true begin_feature true{
+ bdict /NegativePrint Adobe_AGM_Core/AGMCORE_inverting get edict setpagedevice
+ }end_feature
+ }if
+ /AGMCORE_inverting false def
+ }if
+ }if
+ AGMCORE_inverting{
+ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer
+ gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse
+ fill grestore
+ }if
+ end
+}def
+/lw_save_restore_override {
+ /md where {
+ pop
+ md begin
+ /pmSVsetup{} def
+ /endp{}def
+ /pse{}def
+ /psb{}def
+ /orig_showpage where
+ {pop}
+ {/orig_showpage /showpage load def}
+ ifelse
+ /showpage {orig_showpage gR} def
+ end
+ }if
+}def
+/pscript_showpage_override {
+ /NTPSOct95 where
+ {
+ begin
+ showpage
+ save
+ /showpage /restore load def
+ /restore {exch pop}def
+ end
+ }if
+}def
+/driver_media_override
+{
+ /md where {
+ pop
+ md /initializepage known {
+ md /initializepage {} put
+ } if
+ md /rC known {
+ md /rC {4{pop}repeat} put
+ } if
+ }if
+
+ Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put
+}def
+/driver_check_media_override
+{
+ Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne
+ {
+ Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix
+ }if
+}def
+AGMCORE_err_strings begin
+ /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def
+ /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def
+ /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def
+end
+end
+systemdict /setpacking known
+{
+ setpacking
+} if
+%%EndResource
+%%BeginResource: procset Adobe_CoolType_Core 2.12 0
+%%Copyright: Copyright 1997-2001 Adobe Systems Incorporated. All Rights Reserved.
+%%Version: 2.12 0
+userdict/Adobe_CoolType_Core 60 dict dup begin put/Level2? systemdict
+/languagelevel known dup{pop systemdict/languagelevel get 2 ge}if def Level2?
+not{/currentglobal false def/setglobal/pop load def/gcheck{pop false}bind def
+/currentpacking false def/setpacking/pop load def/SharedFontDirectory 0 dict
+def}if currentpacking true setpacking/@_SaveStackLevels{Adobe_CoolType_Data
+begin @opStackCountByLevel @opStackLevel 2 copy known not{2 copy 3 dict dup
+/args 7 index 5 add array put put get}{get dup/args get dup length 3 index lt{
+dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch/args
+exch put}{pop}ifelse}ifelse begin count 2 sub 1 index lt{pop count 1 sub}if
+dup/argCount exch def dup 0 gt{exch 1 index 2 add 1 roll args exch 0 exch
+getinterval astore pop}{pop}ifelse count 1 sub/restCount exch def end
+/@opStackLevel @opStackLevel 1 add def countdictstack 1 sub
+ at dictStackCountByLevel exch @dictStackLevel exch put/@dictStackLevel
+ at dictStackLevel 1 add def end}bind def/@_RestoreStackLevels{
+Adobe_CoolType_Data begin/@opStackLevel @opStackLevel 1 sub def
+ at opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt{{pop
+}repeat}{pop}ifelse args 0 argCount getinterval{}forall end/@dictStackLevel
+ at dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end
+countdictstack exch sub dup 0 gt{{end}repeat}{pop}ifelse}bind def
+/@_PopStackLevels{Adobe_CoolType_Data begin/@opStackLevel @opStackLevel 1 sub
+def/@dictStackLevel @dictStackLevel 1 sub def end}bind def/@Raise{exch cvx
+exch errordict exch get exec stop}bind def/@ReRaise{cvx $error/errorname get
+errordict exch get exec stop}bind def/@Stopped{0 @#Stopped}bind def/@#Stopped{
+ at _SaveStackLevels stopped{@_RestoreStackLevels true}{@_PopStackLevels false}
+ifelse}bind def/@Arg{Adobe_CoolType_Data begin @opStackCountByLevel
+ at opStackLevel 1 sub get/args get exch get end}bind def/doc_setup{
+Adobe_CoolType_Core begin/mov/moveto load def/nfnt/newencodedfont load def
+/mfnt/makefont load def/sfnt/setfont load def/ufnt/undefinefont load def/chp
+/charpath load def/awsh/awidthshow load def/wsh/widthshow load def/ash/ashow
+load def/sh/show load def end userdict/Adobe_CoolType_Data 6 dict dup begin
+/AddWidths? false def/CC 0 def/charcode 2 string def/@opStackCountByLevel 32
+dict def/@opStackLevel 0 def/@dictStackCountByLevel 32 dict def
+/@dictStackLevel 0 def end put}bind def/doc_trailer{currentdict
+Adobe_CoolType_Core eq{end}if}bind def/page_setup{Adobe_CoolType_Core begin}
+bind def/page_trailer{end}bind def/unload{systemdict/languagelevel known{
+systemdict/languagelevel get 2 ge{userdict/Adobe_CoolType_Core 2 copy known{
+undef}{pop pop}ifelse}if}if}bind def/ndf{1 index where{pop pop pop}{dup xcheck
+{bind}if def}ifelse}def/findfont dup systemdict begin userdict begin
+/globaldict where{/globaldict get begin}if dup where pop exch get/globaldict
+where{pop end}if end end def/systemfindfont/findfont load def/undefinefont{pop
+}ndf/copyfont{currentglobal 3 1 roll 1 index gcheck setglobal dup null eq{0}{
+dup length}ifelse 2 index length add 1 add dict begin exch{1 index/FID eq{pop
+pop}{def}ifelse}forall dup null eq{pop}{{def}forall}ifelse currentdict end
+exch setglobal}bind def/copyarray{currentglobal exch dup gcheck setglobal dup
+length array copy exch setglobal}bind def/newencodedfont{currentglobal{
+SharedFontDirectory 3 index known{SharedFontDirectory 3 index get
+/FontReferenced known}{false}ifelse}{FontDirectory 3 index known{FontDirectory
+3 index get/FontReferenced known}{SharedFontDirectory 3 index known{
+SharedFontDirectory 3 index get/FontReferenced known}{false}ifelse}ifelse}
+ifelse dup{3 index findfont/FontReferenced get 2 index findfont ne{pop false}
+if}if{pop 1 index findfont/Encoding get exch 0 1 255{2 copy get 3 index 3 1
+roll put}for pop pop pop}{findfont dup dup maxlength 2 add dict begin exch{1
+index/FID ne{def}{pop pop}ifelse}forall/FontReferenced exch def/Encoding exch
+dup length array copy def/FontName 1 index dup type/stringtype eq{cvn}if def
+currentdict end definefont pop}ifelse}bind def/SetSubstituteStrategy{
+$SubstituteFont begin dup type/dicttype ne{0 dict}if currentdict/$Strategies
+known{exch $Strategies exch 2 copy known{get 2 copy maxlength exch maxlength
+add dict begin{def}forall{def}forall currentdict dup/$Init known{dup/$Init get
+exec}if end/$Strategy exch def}{pop pop pop}ifelse}{pop pop}ifelse end}bind
+def/scff{$SubstituteFont begin dup type/stringtype eq{dup length exch}{null}
+ifelse/$sname exch def/$slen exch def end{findfont}@Stopped{dup length dup 21
+add string dup 4 3 roll 0 exch 128 string cvs putinterval exch 1 index exch
+(_was-malformed-so-was)putinterval cvn{findfont}@Stopped{pop/Courier findfont}
+if}if $SubstituteFont begin/$sname null def/$slen 0 def end}bind def
+/isWidthsOnlyFont{dup/WidthsOnly known{pop pop true}{dup/FDepVector known{
+/FDepVector get{isWidthsOnlyFont dup{exit}if}forall}{dup/FDArray known{
+/FDArray get{isWidthsOnlyFont dup{exit}if}forall}{pop}ifelse}ifelse}ifelse}
+bind def/?set{$SubstituteFont begin/$substituteFound false def/$fontname 4
+index def/$doSmartSub false def end 3 index findfont $SubstituteFont begin
+$substituteFound{false}{dup/FontName known{dup/FontName get $fontname eq 1
+index/DistillerFauxFont known not and/currentdistillerparams where{pop false 2
+index isWidthsOnlyFont not and}if}{false}ifelse}ifelse exch pop/$doSmartSub
+true def end{exch pop exch pop exch 2 dict dup/Found 3 index put exch findfont
+exch}{exch exec exch findfont 2 dict dup/Downloaded 6 5 roll put}ifelse dup
+/FontName 4 index put copyfont definefont pop}bind def/?str1 256 string def
+/?str2 256 string def/?add{1 index type/integertype eq{exch true 4 2}{false 3
+1}ifelse roll 1 index findfont dup/Widths known{Adobe_CoolType_Data/AddWidths?
+true put gsave dup 1000 scalefont setfont}if/Downloaded known{exec exch{exch
+?str2 cvs exch findfont/Downloaded get 1 dict begin/Downloaded 1 index def
+?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1
+index add ?str1 2 index(*)putinterval ?str1 0 2 index getinterval cvn findfont
+?str1 3 index(+)putinterval 2 dict dup/FontName ?str1 0 6 index getinterval
+cvn put dup/Downloaded Downloaded put end copyfont dup/FontName get exch
+definefont pop pop pop}{pop}ifelse}{pop exch{findfont dup/Found get dup length
+exch ?str1 cvs pop ?str1 1 index(+)putinterval ?str1 1 index 1 add 4 index
+?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add
+getinterval cvn 1 dict exch 1 index exch/FontName exch put copyfont dup
+/FontName get exch definefont pop}{pop}ifelse}ifelse Adobe_CoolType_Data
+/AddWidths? get{grestore Adobe_CoolType_Data/AddWidths? false put}if}bind def
+/?sh{currentfont/Downloaded known{exch}if pop}bind def/?chp{currentfont
+/Downloaded known{pop}{false chp}ifelse}bind def/?mv{currentfont/Downloaded
+known{moveto pop pop}{pop pop moveto}ifelse}bind def setpacking userdict
+/$SubstituteFont 25 dict put 1 dict begin/SubstituteFont dup $error exch 2
+copy known{get}{pop pop{pop/Courier}bind}ifelse def/currentdistillerparams
+where dup{pop pop currentdistillerparams/CannotEmbedFontPolicy 2 copy known{
+get/Error eq}{pop pop false}ifelse}if not{countdictstack array dictstack 0 get
+begin userdict begin $SubstituteFont begin/$str 128 string def/$fontpat 128
+string def/$slen 0 def/$sname null def/$match false def/$fontname null def
+/$substituteFound false def/$doSmartSub true def/$depth 0 def/$fontname null
+def/$italicangle 26.5 def/$dstack null def/$Strategies 10 dict dup begin
+/$Type3Underprint{currentglobal exch false setglobal 11 dict begin/UseFont
+exch $WMode 0 ne{dup length dict copy dup/WMode $WMode put/UseFont exch
+definefont}if def/FontName $fontname dup type/stringtype eq{cvn}if def
+/FontType 3 def/FontMatrix[.001 0 0 .001 0 0]def/Encoding 256 array dup 0 1
+255{/.notdef put dup}for pop def/FontBBox[0 0 0 0]def/CCInfo 7 dict dup begin
+/cc null def/x 0 def/y 0 def end def/BuildChar{exch begin CCInfo begin 1
+string dup 0 3 index put exch pop/cc exch def UseFont 1000 scalefont setfont
+cc stringwidth/y exch def/x exch def x y setcharwidth $SubstituteFont
+/$Strategy get/$Underprint get exec 0 0 moveto cc show x y moveto end end}bind
+def currentdict end exch setglobal}bind def/$GetaTint 2 dict dup begin
+/$BuildFont{dup/WMode known{dup/WMode get}{0}ifelse/$WMode exch def $fontname
+exch dup/FontName known{dup/FontName get dup type/stringtype eq{cvn}if}{
+/unnamedfont}ifelse exch $deepcopyfont exch 1 index exch/FontBasedOn exch put
+dup/FontName $fontname dup type/stringtype eq{cvn}if put definefont}bind def
+/$Underprint{gsave x abs y abs gt{/y 1000 def}{/x -1000 def 500 120 translate}
+ifelse Level2?{[/Separation(All)/DeviceCMYK{0 0 0 1 pop}]setcolorspace}{0
+setgray}ifelse 10 setlinewidth x .8 mul[7 3]{y mul 8 div 120 sub x 10 div exch
+moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave
+Level2?{.2 setcolor}{.8 setgray}ifelse fill grestore stroke}forall pop
+grestore}bind def end def/$Oblique 1 dict dup begin/$BuildFont{currentglobal
+exch dup gcheck setglobal null copyfont begin/FontBasedOn currentdict/FontName
+known{FontName dup type/stringtype eq{cvn}if}{/unnamedfont}ifelse def/FontName
+$fontname dup type/stringtype eq{cvn}if def/currentdistillerparams where{pop}{
+/FontInfo currentdict/FontInfo known{FontInfo null copyfont}{2 dict}ifelse dup
+begin/ItalicAngle $italicangle def/FontMatrix FontMatrix[1 0 ItalicAngle dup
+sin exch cos div 1 0 0]matrix concatmatrix readonly end 4 2 roll def def}
+ifelse FontName currentdict end definefont exch setglobal}bind def end def
+/$None 1 dict dup begin/$BuildFont{}bind def end def end def/$Oblique
+SetSubstituteStrategy/$findfontByEnum{dup type/stringtype eq{cvn}if dup
+/$fontname exch def $sname null eq{$str cvs dup length $slen sub $slen
+getinterval}{pop $sname}ifelse $fontpat dup 0(fonts/*)putinterval exch 7 exch
+putinterval/$match false def $SubstituteFont/$dstack countdictstack array
+dictstack put mark{$fontpat 0 $slen 7 add getinterval{/$match exch def exit}
+$str filenameforall}stopped{cleardictstack currentdict true $SubstituteFont
+/$dstack get{exch{1 index eq{pop false}{true}ifelse}{begin false}ifelse}forall
+pop}if cleartomark/$slen 0 def $match false ne{$match(fonts/)anchorsearch pop
+pop cvn}{/Courier}ifelse}bind def/$ROS 1 dict dup begin/Adobe 4 dict dup begin
+/Japan1[/Ryumin-Light/HeiseiMin-W3/GothicBBB-Medium/HeiseiKakuGo-W5
+/HeiseiMaruGo-W4/Jun101-Light]def/Korea1[/HYSMyeongJo-Medium/HYGoThic-Medium]
+def/GB1[/STSong-Light/STHeiti-Regular]def/CNS1[/MKai-Medium/MHei-Medium]def
+end def end def/$cmapname null def/$deepcopyfont{dup/FontType get 0 eq{1 dict
+dup/FontName/copied put copyfont begin/FDepVector FDepVector copyarray 0 1 2
+index length 1 sub{2 copy get $deepcopyfont dup/FontName/copied put/copied
+exch definefont 3 copy put pop pop}for def currentdict end}{$Strategies
+/$Type3Underprint get exec}ifelse}bind def/$buildfontname{length $str 1 index
+(-)putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname
+length add $str exch 0 exch getinterval cvn}bind def/$findfontByROS{/$fontname
+exch def $ROS Registry 2 copy known{get Ordering 2 copy known{get}{pop pop[]}
+ifelse}{pop pop[]}ifelse false exch{dup/CIDFont resourcestatus{pop pop save 1
+index/CIDFont findresource dup/WidthsOnly known{dup/WidthsOnly get}{false}
+ifelse exch pop exch restore{pop}{exch pop true exit}ifelse}{pop}ifelse}forall
+{$str cvs $buildfontname}{false(*){save exch dup/CIDFont findresource dup
+/WidthsOnly known{dup/WidthsOnly get not}{true}ifelse exch/CIDSystemInfo get
+dup/Registry get Registry eq exch/Ordering get Ordering eq and and{exch
+restore exch pop true exit}{pop restore}ifelse}$str/CIDFont resourceforall{
+$buildfontname}{$fontname $findfontByEnum}ifelse}ifelse}bind def end end
+currentdict/$error known currentdict/languagelevel known and dup{pop $error
+/SubstituteFont known}if dup{$error}{Adobe_CoolType_Core}ifelse begin{
+/SubstituteFont/CMap/Category resourcestatus{pop pop{$SubstituteFont begin
+/$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt
+and{$sname null eq{dup $str cvs dup length $slen sub $slen getinterval cvn}{
+$sname}ifelse dup/CMap resourcestatus{pop pop dup/$cmapname exch def/CMap
+findresource/CIDSystemInfo get{def}forall $findfontByROS}{128 string cvs dup
+(-)search{3 1 roll search{3 1 roll pop{dup cvi}stopped{pop pop pop pop pop
+$findfontByEnum}{4 2 roll pop pop exch length exch 2 index length 2 index sub
+exch 1 sub -1 0{$str cvs dup length 4 index 0 4 index 4 3 roll add getinterval
+exch 1 index exch 3 index exch putinterval dup/CMap resourcestatus{pop pop 4 1
+roll pop pop pop dup/$cmapname exch def/CMap findresource/CIDSystemInfo get{
+def}forall $findfontByROS true exit}{pop}ifelse}for dup type/booleantype eq{
+pop}{pop pop $findfontByEnum}ifelse}ifelse}{pop pop pop $findfontByEnum}ifelse
+}{pop pop $findfontByEnum}ifelse}ifelse}{//SubstituteFont exec}ifelse/$slen 0
+def end}}{{$SubstituteFont begin/$substituteFound true def dup length $slen gt
+$sname null ne or $slen 0 gt and{$findfontByEnum}{//SubstituteFont exec}ifelse
+end}}ifelse bind readonly def Adobe_CoolType_Core/scfindfont/systemfindfont
+load put}{/scfindfont{$SubstituteFont begin dup systemfindfont dup/FontName
+known{dup/FontName get dup 3 index ne}{/noname true}ifelse dup{
+/$origfontnamefound 2 index def/$origfontname 4 index def/$substituteFound
+true def}if exch pop{$slen 0 gt $sname null ne 3 index length $slen gt or and{
+pop dup $findfontByEnum findfont dup maxlength 1 add dict begin{1 index/FID eq
+{pop pop}{def}ifelse}forall currentdict end definefont dup/FontName known{dup
+/FontName get}{null}ifelse $origfontnamefound ne{$origfontname $str cvs print
+( substitution revised, using )print dup/FontName known{dup/FontName get}{
+(unspecified font)}ifelse $str cvs print(.
+)print}if}{exch pop}ifelse}{exch pop}ifelse end}bind def}ifelse end end
+Adobe_CoolType_Core/findfont{$SubstituteFont begin $depth 0 eq{/$fontname 1
+index dup type/stringtype ne{$str cvs}if def/$substituteFound false def}if
+/$depth $depth 1 add def end scfindfont $SubstituteFont begin/$depth $depth 1
+sub def $substituteFound $depth 0 eq and $doSmartSub and{currentdict/$Strategy
+known{$Strategy/$BuildFont get exec}if}if end}bind put}if end end
+%%EndResource
+%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.13 0
+%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated.
+%%Version: 1.13 0
+systemdict/languagelevel known dup{currentglobal false setglobal}{false}ifelse
+exch userdict/Adobe_CoolType_Utility 2 copy known{2 copy get dup maxlength 25
+add dict copy}{25 dict}ifelse put Adobe_CoolType_Utility begin/ct_Level2? exch
+def/ct_Clone? 1183615869 internaldict dup/CCRun known not exch/eCCRun known
+not ct_Level2? and or def/ct_UseNativeCapability? systemdict/composefont known
+def/ct_MakeOCF 35 dict def/ct_Vars 25 dict def/ct_GlyphDirProcs 6 dict def
+/ct_BuildCharDict 15 dict dup begin/charcode 2 string def/dst_string 1500
+string def/nullstring()def/usewidths? true def end def ct_Level2?{setglobal}{
+pop}ifelse ct_GlyphDirProcs begin/GetGlyphDirectory{systemdict/languagelevel
+known{pop/CIDFont findresource/GlyphDirectory get}{1 index/CIDFont
+findresource/GlyphDirectory get dup type/dicttype eq{dup dup maxlength exch
+length sub 2 index lt{dup length 2 index add dict copy 2 index/CIDFont
+findresource/GlyphDirectory 2 index put}if}if exch pop exch pop}ifelse +}def/+
+{systemdict/languagelevel known{currentglobal false setglobal 3 dict begin/vm
+exch def}{1 dict begin}ifelse/$ exch def systemdict/languagelevel known{vm
+setglobal/gvm currentglobal def $ gcheck setglobal}if ?{$ begin}if}def/?{$
+type/dicttype eq}def/|{userdict/Adobe_CoolType_Data known{Adobe_CoolType_Data
+/AddWidths? known{currentdict Adobe_CoolType_Data begin begin AddWidths?{
+Adobe_CoolType_Data/CC 3 index put ?{def}{$ 3 1 roll put}ifelse CC charcode
+exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put
+stringwidth 2 array astore currentfont/Widths get exch CC exch put}{?{def}{$ 3
+1 roll put}ifelse}ifelse end end}{?{def}{$ 3 1 roll put}ifelse}ifelse}{?{def}{
+$ 3 1 roll put}ifelse}ifelse}def/!{?{end}if systemdict/languagelevel known{gvm
+setglobal}if end}def/:{string currentfile exch readstring pop}executeonly def
+end ct_MakeOCF begin/ct_cHexEncoding[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09
+/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C
+/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F
+/c30/c31/c32/c33/c34/c35/c36/c37/c38/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42
+/c43/c44/c45/c46/c47/c48/c49/c4A/c4B/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55
+/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68
+/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B
+/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E
+/c8F/c90/c91/c92/c93/c94/c95/c96/c97/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1
+/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4
+/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7
+/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA
+/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED
+/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def
+/ct_CID_STR_SIZE 8000 def/ct_mkocfStr100 100 string def/ct_defaultFontMtx[.001
+0 0 .001 0 0]def/ct_1000Mtx[1000 0 0 1000 0 0]def/ct_raise{exch cvx exch
+errordict exch get exec stop}bind def/ct_reraise{cvx $error/errorname get
+(Error: )print dup( )cvs print errordict exch get exec stop
+}bind def/ct_cvnsi{1 index add 1 sub 1 exch 0 4 1 roll{2 index exch get exch 8
+bitshift add}for exch pop}bind def/ct_GetInterval{Adobe_CoolType_Utility
+/ct_BuildCharDict get begin/dst_index 0 def dup dst_string length gt{dup
+string/dst_string exch def}if 1 index ct_CID_STR_SIZE idiv/arrayIndex exch def
+2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub{dup 3 index
+add 2 index length le{2 index getinterval dst_string dst_index 2 index
+putinterval length dst_index add/dst_index exch def exit}{1 index length 1
+index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval
+pop dup dst_index add/dst_index exch def sub/arrayIndex arrayIndex 1 add def 2
+index dup length arrayIndex gt{arrayIndex get}{pop exit}ifelse 0}ifelse}loop
+pop pop pop dst_string 0 dst_index getinterval end}bind def ct_Level2?{
+/ct_resourcestatus currentglobal mark true setglobal{/unknowninstancename
+/Category resourcestatus}stopped{cleartomark setglobal true}{cleartomark
+currentglobal not exch setglobal}ifelse{{mark 3 1 roll/Category findresource
+begin ct_Vars/vm currentglobal put({ResourceStatus} stopped)0()/SubFileDecode
+filter cvx exec{cleartomark false}{{3 2 roll pop true}{cleartomark false}
+ifelse}ifelse ct_Vars/vm get setglobal end}}{{resourcestatus}}ifelse bind def
+/CIDFont/Category ct_resourcestatus{pop pop}{currentglobal true setglobal
+/Generic/Category findresource dup length dict copy dup/InstanceType/dicttype
+put/CIDFont exch/Category defineresource pop setglobal}ifelse
+ct_UseNativeCapability?{/CIDInit/ProcSet findresource begin 12 dict begin
+begincmap/CIDSystemInfo 3 dict dup begin/Registry(Adobe)def/Ordering(Identity)
+def/Supplement 0 def end def/CMapName/Identity-H def/CMapVersion 1 def
+/CMapType 1 def 1 begincodespacerange<0000><ffff>endcodespacerange 1
+begincidrange<0000><ffff>0 endcidrange endcmap CMapName currentdict/CMap
+defineresource pop end end}if}{/ct_Category 2 dict begin/CIDFont 10 dict def
+/ProcSet 2 dict def currentdict end def/defineresource{ct_Category 1 index 2
+copy known{get dup dup maxlength exch length eq{dup length 10 add dict copy
+ct_Category 2 index 2 index put}if 3 index 3 index put pop exch pop}{pop pop
+/defineresource/undefined ct_raise}ifelse}bind def/findresource{ct_Category 1
+index 2 copy known{get 2 index 2 copy known{get 3 1 roll pop pop}{pop pop
+/findresource/undefinedresource ct_raise}ifelse}{pop pop/findresource
+/undefined ct_raise}ifelse}bind def/resourcestatus{ct_Category 1 index 2 copy
+known{get 2 index known exch pop exch pop{0 -1 true}{false}ifelse}{pop pop
+/findresource/undefined ct_raise}ifelse}bind def/ct_resourcestatus
+/resourcestatus load def}ifelse/ct_CIDInit 2 dict begin/ct_cidfont_stream_init
+{{dup(Binary)eq{pop null currentfile ct_Level2?{{cid_BYTE_COUNT()
+/SubFileDecode filter}stopped{pop pop pop}if}if/readstring load exit}if dup
+(Hex)eq{pop currentfile ct_Level2?{{null exch/ASCIIHexDecode filter/readstring
+}stopped{pop exch pop(>)exch/readhexstring}if}{(>)exch/readhexstring}ifelse
+load exit}if/StartData/typecheck ct_raise}loop cid_BYTE_COUNT ct_CID_STR_SIZE
+le{2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put
+}{cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1
+exch{2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop}for 2
+index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch
+1 index length 1 sub exch put}ifelse cid_CIDFONT exch/GlyphData exch put 2
+index null eq{pop pop pop}{pop/readstring load 1 string exch{3 copy exec pop
+dup length 0 eq{pop pop pop pop pop true exit}if 4 index eq{pop pop pop pop
+false exit}if}loop pop}ifelse}bind def/StartData{mark{currentdict dup/FDArray
+get 0 get/FontMatrix get 0 get .001 eq{dup/CDevProc known not{/CDevProc
+1183615869 internaldict/stdCDevProc 2 copy known{get}{pop pop{pop pop pop pop
+pop 0 -1000 7 index 2 div 880}}ifelse def}if}{/CDevProc{pop pop pop pop pop 0
+1 cid_temp/cid_CIDFONT get/FDArray get 0 get/FontMatrix get 0 get div 7 index
+2 div 1 index .88 mul}def}ifelse/cid_temp 15 dict def cid_temp begin
+/cid_CIDFONT exch def 3 copy pop dup/cid_BYTE_COUNT exch def 0 gt{
+ct_cidfont_stream_init FDArray{/Private get dup/SubrMapOffset known{begin
+/Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2?{
+currentdict dup/SubrMapOffset undef dup/SubrCount undef/SDBytes undef}if end
+/cid_SD_BYTES exch def/cid_SUBR_COUNT exch def/cid_SUBR_MAP_OFFSET exch def
+/cid_SUBRS exch def cid_SUBR_COUNT 0 gt{GlyphData cid_SUBR_MAP_OFFSET
+cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub{
+exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch
+cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll
+GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put}
+for pop}if}{pop}ifelse}forall}if cleartomark pop pop end CIDFontName
+currentdict/CIDFont defineresource pop end end}stopped{cleartomark/StartData
+ct_reraise}if}bind def currentdict end def/ct_saveCIDInit{/CIDInit/ProcSet
+ct_resourcestatus{true}{/CIDInitC/ProcSet ct_resourcestatus}ifelse{pop pop
+/CIDInit/ProcSet findresource ct_UseNativeCapability?{pop null}{/CIDInit
+ct_CIDInit/ProcSet defineresource pop}ifelse}{/CIDInit ct_CIDInit/ProcSet
+defineresource pop null}ifelse ct_Vars exch/ct_oldCIDInit exch put}bind def
+/ct_restoreCIDInit{ct_Vars/ct_oldCIDInit get dup null ne{/CIDInit exch/ProcSet
+defineresource pop}{pop}ifelse}bind def/ct_BuildCharSetUp{1 index begin
+CIDFont begin Adobe_CoolType_Utility/ct_BuildCharDict get begin/ct_dfCharCode
+exch def/ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge{pop
+0}if/cid exch def{GlyphDirectory cid 2 copy known{get}{pop pop nullstring}
+ifelse dup length FDBytes sub 0 gt{dup FDBytes 0 ne{0 FDBytes ct_cvnsi}{pop 0}
+ifelse/fdIndex exch def dup length FDBytes sub FDBytes exch getinterval
+/charstring exch def exit}{pop cid 0 eq{/charstring nullstring def exit}if/cid
+0 def}ifelse}loop}def/ct_SetCacheDevice{0 0 moveto dup stringwidth 3 -1 roll
+true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto}
+def/ct_CloneSetCacheProc{1 eq{stringwidth pop -2 div -880 0 -1000 setcharwidth
+moveto}{usewidths?{currentfont/Widths get cid 2 copy known{get exch pop aload
+pop}{pop pop stringwidth}ifelse}{stringwidth}ifelse setcharwidth 0 0 moveto}
+ifelse}def/ct_Type3ShowCharString{ct_FDDict fdIndex 2 copy known{get}{
+currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup
+maxlength dict copy begin FDArray fdIndex get dup/FontMatrix 2 copy known{get}
+{pop pop ct_defaultFontMtx}ifelse/FontMatrix exch dup length array copy def
+/Private get/Private exch def/Widths rootfont/Widths get def/CharStrings 1
+dict dup/.notdef<d841272cf18f54fc13>dup length string copy put def currentdict
+end/ct_Type1Font exch definefont dup 5 1 roll put setglobal}ifelse dup
+/CharStrings get 1 index/Encoding get ct_dfCharCode get charstring put
+rootfont/WMode 2 copy known{get}{pop pop 0}ifelse exch 1000 scalefont setfont
+ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold{
+currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth
+setlinewidth stroke}{ct_str1 show}ifelse}def/ct_Type4ShowCharString{ct_dfDict
+ct_dfCharCode charstring FDArray fdIndex get dup/FontMatrix get dup
+ct_defaultFontMtx ct_matrixeq not{ct_1000Mtx matrix concatmatrix concat}{pop}
+ifelse/Private get Adobe_CoolType_Utility/ct_Level2? get not{ct_dfDict/Private
+3 -1 roll{put}1183615869 internaldict/superexec get exec}if 1183615869
+internaldict Adobe_CoolType_Utility/ct_Level2? get{1 index}{3 index/Private
+get mark 6 1 roll}ifelse dup/RunInt known{/RunInt get}{pop/CCRun}ifelse get
+exec Adobe_CoolType_Utility/ct_Level2? get not{cleartomark}if}bind def
+/ct_BuildCharIncremental{{Adobe_CoolType_Utility/ct_MakeOCF get begin
+ct_BuildCharSetUp ct_ShowCharString}stopped{stop}if end end end end}bind def
+/BaseFontNameStr(BF00)def/ct_Type1FontTemplate 14 dict begin/FontType 1 def
+/FontMatrix[.001 0 0 .001 0 0]def/FontBBox[-250 -250 1250 1250]def/Encoding
+ct_cHexEncoding def/PaintType 0 def currentdict end def/BaseFontTemplate 11
+dict begin/FontMatrix[.001 0 0 .001 0 0]def/FontBBox[-250 -250 1250 1250]def
+/Encoding ct_cHexEncoding def/BuildChar/ct_BuildCharIncremental load def
+ct_Clone?{/FontType 3 def/ct_ShowCharString/ct_Type3ShowCharString load def
+/ct_dfSetCacheProc/ct_CloneSetCacheProc load def/ct_SyntheticBold false def
+/ct_StrokeWidth 1 def}{/FontType 4 def/Private 1 dict dup/lenIV 4 put def
+/CharStrings 1 dict dup/.notdef<d841272cf18f54fc13>put def/PaintType 0 def
+/ct_ShowCharString/ct_Type4ShowCharString load def}ifelse/ct_str1 1 string def
+currentdict end def/BaseFontDictSize BaseFontTemplate length 5 add def
+/ct_matrixeq{true 0 1 5{dup 4 index exch get exch 3 index exch get eq and dup
+not{exit}if}for exch pop exch pop}bind def/ct_makeocf{15 dict begin exch/WMode
+exch def exch/FontName exch def/FontType 0 def/FMapType 2 def/FontMatrix
+matrix def/bfCount 1 index/CIDCount get 256 idiv 1 add dup 256 gt{pop 256}if
+def/Encoding 256 array 0 1 bfCount 1 sub{2 copy dup put pop}for bfCount 1 255{
+2 copy bfCount put pop}for def/FDepVector bfCount dup 256 lt{1 add}if array
+def BaseFontTemplate BaseFontDictSize dict copy begin/CIDFont exch def CIDFont
+/FontBBox known{CIDFont/FontBBox get/FontBBox exch def}if CIDFont/CDevProc
+known{CIDFont/CDevProc get/CDevProc exch def}if currentdict end
+BaseFontNameStr 3(0)putinterval 0 1 bfCount dup 256 eq{1 sub}if{FDepVector
+exch 2 index BaseFontDictSize dict copy begin dup/CIDFirstByte exch 256 mul
+def FontType 3 eq{/ct_FDDict 2 dict def}if currentdict end 1 index 16
+BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put}
+for ct_Clone?{/Widths 1 index/CIDFont get/GlyphDirectory get length dict def}
+if FontName currentdict end definefont ct_Clone?{gsave dup 1000 scalefont
+setfont ct_BuildCharDict begin/usewidths? false def currentfont/Widths get
+begin exch/CIDFont get/GlyphDirectory get{pop dup charcode exch 1 index 0 2
+index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore
+def}forall end/usewidths? true def end grestore}{exch pop}ifelse}bind def
+/ct_ComposeFont{ct_UseNativeCapability?{2 index/CMap ct_resourcestatus{pop pop
+exch pop}{/CIDInit/ProcSet findresource begin 12 dict begin begincmap/CMapName
+3 index def/CMapVersion 1 def/CMapType 1 def exch/WMode exch def/CIDSystemInfo
+3 dict dup begin/Registry(Adobe)def/Ordering CMapName ct_mkocfStr100 cvs
+(Adobe-)search{pop pop(-)search{dup length string copy exch pop exch pop}{pop
+(Identity)}ifelse}{pop(Identity)}ifelse def/Supplement 0 def end def 1
+begincodespacerange<0000><ffff>endcodespacerange 1 begincidrange<0000><ffff>0
+endcidrange endcmap CMapName currentdict/CMap defineresource pop end end}
+ifelse composefont}{3 2 roll pop 0 get/CIDFont findresource ct_makeocf}ifelse}
+bind def/ct_MakeIdentity{ct_UseNativeCapability?{1 index/CMap
+ct_resourcestatus{pop pop}{/CIDInit/ProcSet findresource begin 12 dict begin
+begincmap/CMapName 2 index def/CMapVersion 1 def/CMapType 1 def/CIDSystemInfo
+3 dict dup begin/Registry(Adobe)def/Ordering CMapName ct_mkocfStr100 cvs
+(Adobe-)search{pop pop(-)search{dup length string copy exch pop exch pop}{pop
+(Identity)}ifelse}{pop(Identity)}ifelse def/Supplement 0 def end def 1
+begincodespacerange<0000><ffff>endcodespacerange 1 begincidrange<0000><ffff>0
+endcidrange endcmap CMapName currentdict/CMap defineresource pop end end}
+ifelse composefont}{exch pop 0 get/CIDFont findresource ct_makeocf}ifelse}bind
+def currentdict readonly pop end end
+%%EndResource
+Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end
+%%BeginResource: procset Adobe_AGM_Image 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright (C) 2000-2000 Adobe Systems, Inc. All Rights Reserved.
+systemdict /setpacking known
+{
+ currentpacking
+ true setpacking
+} if
+userdict /Adobe_AGM_Image 65 dict dup begin put
+/Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def
+/nd{
+ null def
+}bind def
+/AGMIMG_&image nd
+/AGMIMG_&colorimage nd
+%%don't initialize AGMIMG_&customcolorimage, it wrecks havoc in a nested environment
+%%AGMIMG_ccimage_exists not {/AGMIMG_&customcolorimage nd} if
+/AGMIMG_&imagemask nd
+/AGMIMG_mbuf () def
+/AGMIMG_ybuf () def
+/AGMIMG_kbuf () def
+/AGMIMG_c 0 def
+/AGMIMG_m 0 def
+/AGMIMG_y 0 def
+/AGMIMG_k 0 def
+/AGMIMG_tmp nd
+/AGMIMG_imagestring0 nd
+/AGMIMG_imagestring1 nd
+/AGMIMG_imagestring2 nd
+/AGMIMG_imagestring3 nd
+/AGMIMG_imagestring4 nd
+/AGMIMG_imagestring5 nd
+/AGMIMG_cnt nd
+/AGMIMG_fsave nd
+/AGMIMG_colorAry nd
+/AGMIMG_override nd
+/AGMIMG_name nd
+/invert_image_samples nd
+/knockout_image_samples nd
+/img nd
+/sepimg nd
+/idximg nd
+/doc_setup
+{
+ Adobe_AGM_Core begin
+ Adobe_AGM_Image begin
+ /AGMIMG_&image systemdict/image get def
+ /AGMIMG_&imagemask systemdict/imagemask get def
+ /colorimage where{
+ pop
+ /AGMIMG_&colorimage /colorimage ldf
+ }if
+ end
+ end
+}def
+/page_setup
+{
+ Adobe_AGM_Image begin
+ /AGMIMG_ccimage_exists {/customcolorimage where
+ {
+ pop
+ /Adobe_AGM_OnHost_Seps where
+ {
+ pop false
+ }{
+ /Adobe_AGM_InRip_Seps where
+ {
+ pop false
+ }{
+ true
+ }ifelse
+ }ifelse
+ }{
+ false
+ }ifelse
+ }bdf
+ level2{
+ /invert_image_samples
+ {
+ Adobe_AGM_Image/AGMIMG_tmp Decode length ddf
+ /Decode [ Decode 1 get Decode 0 get] def
+ }def
+ /knockout_image_samples
+ {
+ Operator/imagemask ne{
+ /Decode [1 1] def
+ }if
+ }def
+ }{
+ /invert_image_samples
+ {
+ {1 exch sub} currenttransfer addprocs settransfer
+ }def
+ /knockout_image_samples
+ {
+ { pop 1 } currenttransfer addprocs settransfer
+ }def
+ }ifelse
+ /img /imageormask ldf
+ /sepimg /sep_imageormask ldf
+ /idximg /indexed_imageormask ldf
+ currentdict{
+ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{
+ bind
+ }if
+ def
+ }forall
+}def
+/page_trailer
+{
+ end
+}def
+/doc_trailer
+{
+}def
+/imageormask_sys
+{
+ begin
+ save mark
+ level2{
+ currentdict
+ Operator /imagemask eq{
+ AGMIMG_&imagemask
+ }{
+ AGMIMG_&image
+ }ifelse
+ }{
+ Width Height
+ Operator /imagemask eq{
+ Decode 0 get 1 eq Decode 1 get 0 eq and
+ ImageMatrix /DataSource load
+ AGMIMG_&imagemask
+ }{
+ BitsPerComponent ImageMatrix /DataSource load
+ AGMIMG_&image
+ }ifelse
+ }ifelse
+ cleartomark restore
+ end
+}def
+/overprint_plate
+{
+ currentoverprint{
+ 0 get
+ dup /DeviceGray eq{
+ pop AGMCORE_black_plate not
+ }{
+ /DeviceCMYK eq{
+ AGMCORE_is_cmyk_sep not
+ }if
+ }ifelse
+ }{
+ false
+ }ifelse
+}def
+/imageormask
+{
+ begin
+ SkipImageProc not{
+ save mark
+ level2 AGMCORE_host_sep not and{
+ currentdict
+ Operator /imagemask eq{
+ imagemask
+ }{
+ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{
+ [/Separation /Black /DeviceGray {}] setcolorspace
+ /Decode [ Decode 1 get Decode 0 get ] def
+ }if
+ image
+ }ifelse
+ }{
+ Width Height
+ Operator /imagemask eq{
+ Decode 0 get 1 eq Decode 1 get 0 eq and
+ ImageMatrix /DataSource load
+ AGMCORE_host_sep{
+ currentgray 1 ne{
+ currentdict imageormask_sys
+ }{
+ currentoverprint not{
+ 1 AGMCORE_&setgray
+ knockout_image_samples
+ currentdict imageormask_sys
+ }{
+ currentdict ignoreimagedata
+ }ifelse
+ }ifelse
+ }{
+ imagemask
+ }ifelse
+ }{
+ BitsPerComponent ImageMatrix
+ MultipleDataSources{
+ 0 1 NComponents 1 sub{
+ DataSource exch get
+ }for
+ }{
+ /DataSource load
+ }ifelse
+ Operator /colorimage eq{
+ AGMCORE_host_sep{
+ MultipleDataSources level2 or NComponents 4 eq and{
+ MultipleDataSources{
+ 4 {pop} repeat
+ /DataSource [
+ DataSource 0 get /exec cvx
+ DataSource 1 get /exec cvx
+ DataSource 2 get /exec cvx
+ DataSource 3 get /exec cvx
+ /AGMCORE_get_ink_data cvx
+ ] cvx def
+ }{
+ /DataSource /DataSource load filter_cmyk 0 () /SubFileDecode filter def
+ }ifelse
+
+ /Decode [ Decode 0 get Decode 1 get ] def
+ /MultipleDataSources false def
+ /NComponents 1 def
+ /Operator /image def
+ AGMCORE_is_cmyk_sep{
+ currentoverprint InksUsed current_ink not and{
+ currentdict consumeimagedata
+ }{
+ invert_image_samples
+ 1 AGMCORE_&setgray
+ currentdict imageormask_sys
+ }ifelse
+ }{
+ currentdict ignoreimagedata
+ }ifelse
+ }{
+
+ MultipleDataSources NComponents AGMIMG_&colorimage
+ }ifelse
+ }{
+ true NComponents colorimage
+ }ifelse
+ }{
+ Operator /image eq{
+ AGMCORE_host_sep{
+ /DoImage true def
+ HostSepColorImage{
+ invert_image_samples
+ }{
+ AGMCORE_black_plate not{
+ /DoImage false def
+ currentdict ignoreimagedata
+ }if
+ }ifelse
+ 1 AGMCORE_&setgray
+ DoImage
+ {currentdict imageormask_sys} if
+ }{
+ image
+ }ifelse
+ }{
+ Operator/knockout eq{
+ pop pop pop pop pop
+ currentoverprint InksUsed current_ink not and{
+ }{
+ currentcolorspace overprint_plate not{
+ knockout_unitsq
+ }if
+ }ifelse
+ }if
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ cleartomark restore
+ }if
+ end
+}def
+/sep_imageormask
+{
+ /sep_colorspace_dict AGMCORE_gget begin
+ /MappedCSA CSA map_csa def
+ begin
+ SkipImageProc not{
+ save mark
+
+ AGMCORE_avoid_L2_sep_space{
+ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def
+ }if
+ AGMIMG_ccimage_exists
+ MappedCSA 0 get /DeviceCMYK eq and
+ currentdict/Components known and
+ Name () ne and
+ Name (All) ne and
+ Operator /image eq and
+ AGMCORE_producing_seps not and
+ level2 not and
+ {
+ Width Height BitsPerComponent ImageMatrix
+ [
+ /DataSource load /exec cvx
+ {
+ 0 1 2 index length 1 sub{
+ 1 index exch
+ 2 copy get 255 xor put
+ }for
+ } /exec cvx
+ ] cvx bind
+ MappedCSA 0 get /DeviceCMYK eq{
+ Components aload pop
+ }{
+ 0 0 0 Components aload pop 1 exch sub
+ }ifelse
+ Name findcmykcustomcolor
+ customcolorimage
+ }{
+ AGMCORE_producing_seps not{
+ level2{
+ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{
+ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt
+ /sep_tint AGMCORE_gget setcolor
+ }if
+ currentdict imageormask
+ }{
+ currentdict
+ Operator /imagemask eq{
+ imageormask
+ }{
+ sep_imageormask_lev1
+ }ifelse
+ }ifelse
+ }{
+ AGMCORE_host_sep{
+ Operator/knockout eq{
+ currentoverprint InksUsed current_ink not and{
+ }{
+ currentdict/ImageMatrix get concat
+ knockout_unitsq
+ }ifelse
+ }{
+ currentgray 1 ne{
+ AGMCORE_is_cmyk_sep Name (All) ne and{
+ level2{
+ [ /Separation Name [/DeviceGray]
+ {
+ sep_colorspace_proc AGMCORE_get_ink_data
+ 1 exch sub
+ } bind
+ ] AGMCORE_&setcolorspace
+ /sep_tint AGMCORE_gget AGMCORE_&setcolor
+ currentdict imageormask_sys
+ }{
+ currentdict
+ Operator /imagemask eq{
+ imageormask_sys
+ }{
+ sep_image_lev1_sep
+ }ifelse
+ }ifelse
+ }{
+ Operator/imagemask ne{
+ invert_image_samples
+ }if
+ currentdict imageormask_sys
+ }ifelse
+ }{
+ currentdict consumeimagedata
+ currentoverprint not Name (All) eq or{
+ gsave
+ knockout_unitsq
+ grestore
+ }if
+ }ifelse
+ }ifelse
+ }{
+ currentcolorspace 0 get /Separation ne{
+ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt
+ /sep_tint AGMCORE_gget setcolor
+ }if
+ currentoverprint
+ MappedCSA 0 get /DeviceCMYK eq and
+ Name inRip_spot_has_ink not and
+ Name (All) ne and {
+ imageormask_l2_overprint
+ }{
+ currentdict imageormask
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ cleartomark restore
+ }if
+ end
+ end
+}def
+/imageormask_l2_overprint
+{
+
+ currentdict
+ currentcmykcolor add add add 0 eq{
+ currentdict consumeimagedata
+ }{
+ level3{
+
+ currentcmykcolor
+ /AGMIMG_k xdf
+ /AGMIMG_y xdf
+ /AGMIMG_m xdf
+ /AGMIMG_c xdf
+ Operator/imagemask eq{
+ [/DeviceN [
+ AGMIMG_c 0 ne {/Cyan} if
+ AGMIMG_m 0 ne {/Magenta} if
+ AGMIMG_y 0 ne {/Yellow} if
+ AGMIMG_k 0 ne {/Black} if
+ ] /DeviceCMYK {}] setcolorspace
+
+ AGMIMG_c 0 ne {AGMIMG_c} if
+ AGMIMG_m 0 ne {AGMIMG_m} if
+ AGMIMG_y 0 ne {AGMIMG_y} if
+ AGMIMG_k 0 ne {AGMIMG_k} if
+ setcolor
+ }{
+ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def
+ [/Indexed
+ [
+ /DeviceN [
+ AGMIMG_c 0 ne {/Cyan} if
+ AGMIMG_m 0 ne {/Magenta} if
+ AGMIMG_y 0 ne {/Yellow} if
+ AGMIMG_k 0 ne {/Black} if
+ ]
+ /DeviceCMYK {
+ AGMIMG_k 0 eq {0} if
+ AGMIMG_y 0 eq {0 exch} if
+ AGMIMG_m 0 eq {0 3 1 roll} if
+ AGMIMG_c 0 eq {0 4 1 roll} if
+ }
+ ]
+ 255
+ {
+ 255 div
+
+ mark exch
+ dup dup dup
+
+
+ AGMIMG_k 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+
+ AGMIMG_y 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+
+ AGMIMG_m 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+
+ AGMIMG_c 0 ne{
+ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop
+ counttomark 1 roll
+ }{
+ pop
+ }ifelse
+ counttomark 1 add -1 roll pop
+ }
+ ] setcolorspace
+ }ifelse
+
+ imageormask_sys
+ }{
+ write_image_file{
+ currentcmykcolor
+ 0 ne{
+ [/Separation /Black /DeviceGray {}] setcolorspace
+ gsave
+ /Black
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ }if
+ 0 ne{
+ [/Separation /Yellow /DeviceGray {}] setcolorspace
+ gsave
+ /Yellow
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ }if
+ 0 ne{
+ [/Separation /Magenta /DeviceGray {}] setcolorspace
+ gsave
+ /Magenta
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ }if
+ 0 ne{
+ [/Separation /Cyan /DeviceGray {}] setcolorspace
+ gsave
+ /Cyan
+ [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx]
+ cvx modify_halftone_xfer
+ Operator currentdict read_image_file
+ grestore
+ } if
+ close_image_file
+ }{
+ imageormask
+ }ifelse
+ }ifelse
+ }ifelse
+} def
+/indexed_imageormask
+{
+ begin
+ save mark
+
+ currentdict
+ AGMCORE_host_sep{
+
+ Operator/knockout eq{
+ /indexed_colorspace_dict AGMCORE_gget /CSA get map_csa overprint_plate not{
+ knockout_unitsq
+ }if
+ }{
+ AGMCORE_is_cmyk_sep{
+ Operator /imagemask eq{
+ imageormask_sys
+ }{
+ level2{
+ indexed_image_lev2_sep
+ }{
+ indexed_image_lev1_sep
+ }ifelse
+ }ifelse
+ }{
+ currentoverprint not{
+ knockout_image_samples
+ imageormask_sys
+ }{
+ currentdict consumeimagedata
+ }ifelse
+ }ifelse
+ }ifelse
+ }{
+ level2{
+ imageormask
+ }{
+ Operator /imagemask eq{
+ imageormask
+ }{
+ indexed_imageormask_lev1
+ }ifelse
+ }ifelse
+ }ifelse
+ cleartomark restore
+ end
+}def
+/indexed_image_lev2_sep
+{
+ /indexed_colorspace_dict AGMCORE_gget begin
+ begin
+
+ currentcolorspace
+ dup 1 /DeviceGray put
+ dup 3 [
+ currentcolorspace 3 get
+ {
+ exch 4 mul 4 getinterval {} forall
+ AGMCORE_get_ink_data 255 div 1 exch sub
+ } /exec cvx
+ ] cvx put
+ setcolorspace
+
+ currentdict
+ Operator /imagemask eq{
+ AGMIMG_&imagemask
+ }{
+ AGMIMG_&image
+ }ifelse
+
+ end end
+}def
+/OPIimage
+{
+ dup type /dicttype ne{
+ 10 dict begin
+ /DataSource xdf
+ /ImageMatrix xdf
+ /BitsPerComponent xdf
+ /Height xdf
+ /Width xdf
+ /ImageType 1 def
+ /Decode [0 1 def]
+ currentdict
+ end
+ }if
+ dup begin
+ /NComponents 1 cdndf
+ /MultipleDataSources false cdndf
+ /SkipImageProc {false} cdndf
+ /HostSepColorImage false cdndf
+ /Decode [
+ 0
+ currentcolorspace 0 get /Indexed eq{
+ 2 BitsPerComponent exp 1 sub
+ }{
+ 1
+ }ifelse
+ ] cdndf
+ /Operator /image cdndf
+ end
+ /sep_colorspace_dict AGMCORE_gget null eq{
+ imageormask
+ }{
+ gsave
+ dup begin invert_image_samples end
+ sep_imageormask
+ grestore
+ }ifelse
+}def
+/spot_alias
+{
+ /mapto_sep_imageormask
+ {
+ dup type /dicttype ne{
+ 12 dict begin
+ /ImageType 1 def
+ /DataSource xdf
+ /ImageMatrix xdf
+ /BitsPerComponent xdf
+ /Height xdf
+ /Width xdf
+ /MultipleDataSources false def
+ }{
+ begin
+ }ifelse
+ /Decode [/customcolor_tint AGMCORE_gget 0] def
+ /Operator /image def
+ /HostSepColorImage false def
+ /InksUsed [] def
+ /SkipImageProc {false} def
+ currentdict
+ end
+ sep_imageormask
+ }bdf
+ /customcolorimage
+ {
+ Adobe_AGM_Image/AGMIMG_colorAry xddf
+ /customcolor_tint AGMCORE_gget
+ bdict
+ /Name AGMIMG_colorAry 4 get
+ /CSA [ /DeviceCMYK ]
+ /TintMethod /Subtractive
+ /TintProc null
+ /MappedCSA null
+ /NComponents 4
+ /Components [ AGMIMG_colorAry aload pop pop ]
+ edict
+ setsepcolorspace
+ mapto_sep_imageormask
+ }ndf
+ Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put
+ /customcolorimage
+ {
+ Adobe_AGM_Image/AGMIMG_override false put
+ dup 4 get map_alias{
+ /customcolor_tint AGMCORE_gget exch setsepcolorspace
+ pop
+ mapto_sep_imageormask
+ }{
+ AGMIMG_&customcolorimage
+ }ifelse
+ }bdf
+}def
+level2 not{
+ /colorbuf
+ {
+ 0 1 2 index length 1 sub{
+ dup 2 index exch get
+ 255 exch sub
+ 2 index
+ 3 1 roll
+ put
+ }for
+ }def
+ /tint_image_to_color
+ {
+ begin
+ Width Height BitsPerComponent ImageMatrix
+ /DataSource load
+ end
+ Adobe_AGM_Image begin
+ /AGMIMG_mbuf 0 string def
+ /AGMIMG_ybuf 0 string def
+ /AGMIMG_kbuf 0 string def
+ {
+ colorbuf dup length AGMIMG_mbuf length ne
+ {
+ dup length dup dup
+ /AGMIMG_mbuf exch string def
+ /AGMIMG_ybuf exch string def
+ /AGMIMG_kbuf exch string def
+ } if
+ dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop
+ }
+ addprocs
+ {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage
+ end
+ } def
+ /sep_imageormask_lev1
+ {
+ begin
+ MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{
+
+ {
+ 255 mul round cvi GrayLookup exch get
+ } currenttransfer addprocs settransfer
+ currentdict imageormask
+ }{
+ /sep_colorspace_dict AGMCORE_gget/Components known{
+ MappedCSA 0 get /DeviceCMYK eq{
+ Components aload pop
+ }{
+ 0 0 0 Components aload pop 1 exch sub
+ }ifelse
+
+ Adobe_AGM_Image/AGMIMG_k xddf
+ Adobe_AGM_Image/AGMIMG_y xddf
+ Adobe_AGM_Image/AGMIMG_m xddf
+ Adobe_AGM_Image/AGMIMG_c xddf
+
+ AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{
+ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer
+ currentdict imageormask
+ }{
+
+ currentcolortransfer
+ {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll
+ {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll
+ {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll
+ {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll
+ setcolortransfer
+ currentdict tint_image_to_color
+ }ifelse
+ }{
+
+ MappedCSA 0 get /DeviceGray eq {
+ {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer
+ currentdict imageormask
+ }{
+ MappedCSA 0 get /DeviceCMYK eq {
+ currentcolortransfer
+ {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll
+ setcolortransfer
+ currentdict tint_image_to_color
+ }{
+ currentcolortransfer
+ {pop 1} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll
+ {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll
+ setcolortransfer
+ currentdict tint_image_to_color
+ }ifelse
+ }ifelse
+ }ifelse
+ }ifelse
+ end
+ }def
+ /sep_image_lev1_sep
+ {
+ begin
+ /sep_colorspace_dict AGMCORE_gget/Components known{
+ Components aload pop
+
+ Adobe_AGM_Image/AGMIMG_k xddf
+ Adobe_AGM_Image/AGMIMG_y xddf
+ Adobe_AGM_Image/AGMIMG_m xddf
+ Adobe_AGM_Image/AGMIMG_c xddf
+
+ {AGMIMG_c mul 1 exch sub}
+ {AGMIMG_m mul 1 exch sub}
+ {AGMIMG_y mul 1 exch sub}
+ {AGMIMG_k mul 1 exch sub}
+ }{
+ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}
+ {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}
+ {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}
+ {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}
+ }ifelse
+
+ AGMCORE_get_ink_data currenttransfer addprocs settransfer
+
+ currentdict imageormask_sys
+
+ end
+ }def
+ /indexed_imageormask_lev1
+ {
+ /indexed_colorspace_dict AGMCORE_gget begin
+ begin
+ currentdict
+ MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{
+
+ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer
+ imageormask
+ }{
+
+ MappedCSA 0 get /DeviceGray eq {
+ {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer
+ imageormask
+ }{
+ MappedCSA 0 get /DeviceCMYK eq {
+ currentcolortransfer
+ {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll
+ setcolortransfer
+ tint_image_to_color
+ }{
+ currentcolortransfer
+ {pop 1} exch addprocs 4 1 roll
+ {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll
+ {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll
+ {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll
+ setcolortransfer
+ tint_image_to_color
+ }ifelse
+ }ifelse
+ }ifelse
+ end end
+ }def
+ /indexed_image_lev1_sep
+ {
+ /indexed_colorspace_dict AGMCORE_gget begin
+ begin
+ {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub}
+ {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}
+ {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}
+ {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}
+
+ AGMCORE_get_ink_data currenttransfer addprocs settransfer
+
+ currentdict imageormask_sys
+
+ end end
+ }def
+}if
+end
+systemdict /setpacking known
+{
+ setpacking
+} if
+%%EndResource
+%ADOBeginClientInjection: DocumentProlog End "AI10"
+%ADOEndClientInjection: DocumentProlog End "AI10"
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndProlog
+%%BeginSetup
+%ADOBeginClientInjection: DocumentSetup Start "AI10"
+%ADOEndClientInjection: DocumentSetup Start "AI10"
+Adobe_AGM_Utils begin
+2 2010 true Adobe_AGM_Core/doc_setup get exec
+Adobe_CoolType_Core/doc_setup get exec
+Adobe_AGM_Image/doc_setup get exec
+%ADOBeginClientInjection: DocumentSetup End "AI10"
+%ADOEndClientInjection: DocumentSetup End "AI10"
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndSetup
+%%Page: rnaseP-ecoli.pdf 1
+%%EndPageComments
+%%BeginPageSetup
+%ADOBeginClientInjection: PageSetup Start "AI10"
+%ADOEndClientInjection: PageSetup Start "AI10"
+Adobe_AGM_Utils begin
+Adobe_AGM_Core/page_setup get exec
+Adobe_CoolType_Core/page_setup get exec
+Adobe_AGM_Image/page_setup get exec
+%ADOBeginClientInjection: PageSetup End "AI10"
+%ADOEndClientInjection: PageSetup End "AI10"
+%%EndPageSetup
+Adobe_AGM_Core/AGMCORE_save save ddf
+1 -1 scale 0 -586.647 translate
+[1 0 0 1 0 0 ] concat
+mark
+/0
+[/DeviceGray] add_csa
+/CSA /0
+/1
+[/DeviceCMYK] add_csa
+/CSA /1
+/2
+[/DeviceRGB] add_csa
+/CSA /2
+cleartomark
+800 path_rez
+% page clip
+gsave
+newpath
+gsave % PSGState
+0 0 mo
+0 586.647 li
+416.6 586.647 li
+416.6 0 li
+clp
+[1 0 0 1 0 0 ] concat
+%ADOBeginClientInjection: BeginPageContent "AI10"
+%ADOEndClientInjection: BeginPageContent "AI10"
+gsave % PSGState
+0 0 mo
+417 0 li
+417 587 li
+0 587 li
+0 0 li
+clp
+.5 lw
+0 lc
+0 lj
+10 ml
+[] 0 dsh
+true sadj
+113.251 538.55 mo
+121.251 538.55 li
+121.251 566.05 li
+113.251 566.05 li
+113.251 538.55 li
+cp
+false sop
+0 0 0 rgb
+s
+29.2388 296.52 mo
+29.2388 299.279 26.999 301.52 24.2388 301.52 cv
+21.479 301.52 19.2388 299.279 19.2388 296.52 cv
+19.2388 293.76 21.479 291.52 24.2388 291.52 cv
+26.999 291.52 29.2388 293.76 29.2388 296.52 cv
+cp
+219.02 305.82 mo
+219.02 308.58 216.779 310.819 214.02 310.819 cv
+211.26 310.819 209.02 308.58 209.02 305.82 cv
+209.02 303.06 211.26 300.82 214.02 300.82 cv
+216.779 300.82 219.02 303.06 219.02 305.82 cv
+cp
+333.738 399.3 mo
+333.738 402.06 331.498 404.3 328.738 404.3 cv
+325.979 404.3 323.738 402.06 323.738 399.3 cv
+323.738 396.54 325.979 394.3 328.738 394.3 cv
+331.498 394.3 333.738 396.54 333.738 399.3 cv
+cp
+0 0 0 rgb
+s
+25.251 301.55 mo
+25.751 301.55 li
+113.501 538.55 li
+113.501 539.05 li
+113.001 539.05 li
+25.251 302.05 li
+0 0 0 rgb
+f
+209.002 307.05 mo
+209.502 307.05 li
+209.502 307.55 li
+92.001 336.55 li
+91.501 336.55 li
+91.501 336.05 li
+0 0 0 rgb
+f
+87.751 345.05 mo
+88.251 345.05 li
+324.002 398.55 li
+324.002 399.05 li
+323.502 399.05 li
+87.751 345.55 li
+0 0 0 rgb
+f
+115.251 357.55 mo
+123.251 357.55 li
+123.251 346.55 li
+115.251 346.55 li
+115.251 357.55 li
+1 1 1 rgb
+f
+0 0 0 rgb
+%ADOBeginSubsetFont: Helvetica Initial
+11 dict begin
+/FontName /Helvetica def
+/FontMatrix [1 1000 div 0 0 1 1000 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+/FontInfo 1 dict dup begin
+ /OrigFontType /TrueType def
+end readonly def
+currentdict
+end
+
+systemdict begin
+dup /Private 7 dict dup begin
+/BlueValues [-15 0 600 650] def
+/MinFeature {16 16} def
+/password 5839 def
+/ND {def} def
+/NP {put} def
+/RD {string currentfile exch readhexstring pop} def
+2 index /CharStrings 230 dict dup begin
+/.notdef
+<10bf317079bb21e4> ND
+/C
+<10bf317030aa083cc281922089bc4994328331af6a654615083cfa8a590d
+c2a9c54536c70731aa752343a37dd604c4c28cec579aa316cc528b15cac7
+afb36b45f7a20bc9d34701f1c9f2574363d062989f34915e0d1f708b6ecd
+63a000a0329329f07c> ND
+end
+end
+put
+put
+dup /FontName get exch definefont pop
+end
+/Helvetica findfont /Encoding get
+dup 67 /C put
+pop
+%ADOEndSubsetFont
+/Helvetica*1
+[
+67{/.notdef}repeat /C 188{/.notdef}repeat
+] /Helvetica nfnt
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.001 354.55 mov
+(C) sh
+112.439 335.3 mo
+121.439 335.3 li
+121.439 324.3 li
+112.439 324.3 li
+112.439 335.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+%ADOBeginSubsetFont: Helvetica AddGlyphs
+
+systemdict begin
+/Helvetica
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/G
+<10bf317035a2615cb512b1acd8c36b3946ad235417226e7c6feda1fdef74
+15451c61806a71e65b7a339d50f1974c1bc4c34c3f930da0a6e9e3c37b22
+0a6e14e87efbddbec74bbcb62a658f0ec4a2c98ab177326480af33b18698
+75870b1cf019> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Helvetica findfont /Encoding get
+dup 71 /G put
+pop
+%ADOEndSubsetFont
+/Helvetica*1
+[
+67{/.notdef}repeat /C 3{/.notdef}repeat /G 184{/.notdef}repeat
+] /Helvetica nfnt
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+113.501 332.3 mov
+(G) sh
+126.439 367.05 mo
+126.439 450.8 li
+402.439 450.8 li
+402.439 359.05 li
+0 0 0 rgb
+s
+187.251 383.3 mo
+236.252 432.3 li
+236.252 573.8 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+95.001 546.3 mov
+(G) sh
+99.439 549.55 mo
+99.439 555.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+%ADOBeginSubsetFont: Helvetica AddGlyphs
+
+systemdict begin
+/Helvetica
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/A
+<10bf31706c4d8e6db23e4e7dd1042123534442eb7f8cee32689ada63ee09
+58823f2b2bd80b8cb54f7e8af1e8d4f10b0e131d22e003ae536d56abc669
+c65da4f461c503d44126b09469> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Helvetica findfont /Encoding get
+dup 65 /A put
+pop
+%ADOEndSubsetFont
+/Helvetica*1
+[
+65{/.notdef}repeat /A /.notdef /C 3{/.notdef}repeat /G 184{/.notdef}repeat
+] /Helvetica nfnt
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+105.001 546.3 mov
+(A) sh
+108.439 549.55 mo
+108.439 555.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+114.001 546.3 mov
+(A) sh
+117.439 549.55 mo
+117.439 555.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+122.001 546.3 mov
+(G) sh
+127.939 552.3 mo
+127.939 553.403 127.043 554.3 125.939 554.3 cv
+124.835 554.3 123.939 553.403 123.939 552.3 cv
+123.939 551.196 124.835 550.3 125.939 550.3 cv
+127.043 550.3 127.939 551.196 127.939 552.3 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+132.001 546.3 mov
+(C) sh
+135.439 549.55 mo
+135.439 555.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+%ADOBeginSubsetFont: Helvetica AddGlyphs
+
+systemdict begin
+/Helvetica
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/U
+<10bf31701b9d2e0e75dc1c6f9b5aea75bc3cfacfd128a955802855ea36c9
+10f8a868d77a647ceb09c04b8925af88dc46f95d195f8683dbe20f41ec> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Helvetica findfont /Encoding get
+dup 85 /U put
+pop
+%ADOEndSubsetFont
+/Helvetica*1
+[
+65{/.notdef}repeat /A /.notdef /C 3{/.notdef}repeat /G 13{/.notdef}repeat /U
+170{/.notdef}repeat
+] /Helvetica nfnt
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+141.001 546.3 mov
+(U) sh
+144.439 549.55 mo
+144.439 555.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+149.001 546.3 mov
+(G) sh
+153.439 549.55 mo
+153.439 555.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+159.001 546.3 mov
+(A) sh
+162.439 549.55 mo
+162.439 555.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+168.001 546.3 mov
+(C) sh
+171.439 549.55 mo
+171.439 555.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+177.002 546.3 mov
+(C) sh
+180.439 549.55 mo
+180.439 555.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+188.001 546.3 mov
+(A) sh
+191.439 549.55 mo
+191.439 555.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+199 546.3 mov
+(G) sh
+200 537.3 mov
+(A) sh
+200 528.3 mov
+(C) sh
+200 519.3 mov
+(A) sh
+199 510.3 mov
+(G) sh
+200 501.3 mov
+(U) sh
+200 492.3 mov
+(C) sh
+188.003 492.3 mov
+(G) sh
+177.005 492.3 mov
+(C) sh
+180.439 477.55 mo
+180.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+168.001 492.3 mov
+(C) sh
+171.439 477.55 mo
+171.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+157.001 495.3 mov
+(G) sh
+149 492.303 mov
+(C) sh
+152.439 477.55 mo
+152.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+140.001 492.3 mov
+(U) sh
+143.439 477.55 mo
+143.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+131.001 492.3 mov
+(U) sh
+135.919 479.819 mo
+135.919 480.924 135.023 481.819 133.919 481.819 cv
+132.815 481.819 131.919 480.924 131.919 479.819 cv
+131.919 478.716 132.815 477.819 133.919 477.819 cv
+135.023 477.819 135.919 478.716 135.919 479.819 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+122.001 492.3 mov
+(C) sh
+125.439 477.55 mo
+125.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+112.001 492.3 mov
+(G) sh
+116.439 477.55 mo
+116.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+104.001 492.3 mov
+(U) sh
+108.919 479.28 mo
+108.919 480.384 108.023 481.28 106.919 481.28 cv
+105.815 481.28 104.919 480.384 104.919 479.28 cv
+104.919 478.176 105.815 477.28 106.919 477.28 cv
+108.023 477.28 108.919 478.176 108.919 479.28 cv
+0 0 0 rgb
+f
+90.751 495.55 mo
+99.751 495.55 li
+99.751 484.55 li
+90.751 484.55 li
+90.751 495.55 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+92.001 492.55 mov
+(C) sh
+95.439 477.55 mo
+95.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+82.001 492.3 mov
+(G) sh
+86.439 477.55 mo
+86.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+74.001 492.3 mov
+(U) sh
+77.439 477.55 mo
+77.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+65.001 492.3 mov
+(C) sh
+68.439 477.55 mo
+68.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+59.251 501.3 mov
+(G) sh
+54.0039 492.3 mov
+(U) sh
+57.439 477.55 mo
+57.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+45.001 492.3 mov
+(C) sh
+48.439 477.55 mo
+48.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+36.001 492.3 mov
+(C) sh
+39.439 477.55 mo
+39.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+27.001 492.3 mov
+(U) sh
+31.939 479.28 mo
+31.939 480.384 31.043 481.28 29.939 481.28 cv
+28.835 481.28 27.939 480.384 27.939 479.28 cv
+27.939 478.176 28.835 477.28 29.939 477.28 cv
+31.043 477.28 31.939 478.176 31.939 479.28 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+18.001 492.3 mov
+(C) sh
+21.439 477.55 mo
+21.439 483.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+8.00098 494.8 mov
+(U) sh
+0 487.798 mov
+(U) sh
+0 477.799 mov
+(C) sh
+7.00195 471.796 mov
+(G) sh
+17.001 474.298 mov
+1.99799 0 (GGGG) ash
+54 474.298 mov
+(A) sh
+63.999 474.298 mov
+(G) sh
+73.998 474.298 mov
+(A) sh
+81.689 477.55 mo
+89.689 477.55 li
+89.689 466.55 li
+81.689 466.55 li
+81.689 477.55 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+82.501 474.55 mov
+(C) sh
+90.9971 474.298 mov
+(G) sh
+97 466.297 mov
+(G) sh
+103.003 474.298 mov
+(G) sh
+113.002 474.298 mov
+(C) sh
+121.003 474.298 mov
+1.99799 0 (GG) ash
+140.002 474.298 mov
+1.99799 0 (AG) ash
+157.003 472.3 mov
+(G) sh
+167.002 474.298 mov
+1.99799 0 (GG) ash
+176.749 464.299 mov
+(A) sh
+175.439 457.3 mo
+184.439 457.3 li
+184.439 446.3 li
+175.439 446.3 li
+175.439 457.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+176.501 454.3 mov
+(G) sh
+176.249 444.301 mov
+(G) sh
+176.753 434.302 mov
+(A) sh
+176.753 424.303 mov
+(A) sh
+176.753 414.304 mov
+(A) sh
+176.249 405.304 mov
+(G) sh
+168.995 398.806 mov
+(U) sh
+176.249 391.31 mov
+(C) sh
+176.753 381.311 mov
+(C) sh
+175.189 374.3 mo
+184.189 374.3 li
+184.189 363.3 li
+175.189 363.3 li
+175.189 374.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+176.251 371.3 mov
+(G) sh
+176.251 361.301 mov
+(G) sh
+176.251 351.302 mov
+(G) sh
+175.504 341.303 mov
+(C) sh
+178.439 326.55 mo
+178.439 332.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+167.001 341.3 mov
+(U) sh
+169.439 326.55 mo
+169.439 332.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+157.501 341.3 mov
+(C) sh
+160.439 326.55 mo
+160.439 332.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+148.501 341.3 mov
+(C) sh
+151.439 326.55 mo
+151.439 332.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+153.001 351.3 mov
+(A) sh
+151.939 364.3 mo
+160.939 364.3 li
+160.939 353.3 li
+151.939 353.3 li
+151.939 364.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+153.251 361.3 mov
+(U) sh
+148.004 369.301 mov
+(A) sh
+137.753 374.053 mov
+(G) sh
+130.499 367.555 mov
+(G) sh
+121.689 363.8 mo
+130.689 363.8 li
+130.689 352.8 li
+121.689 352.8 li
+121.689 363.8 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+122.751 360.8 mov
+(G) sh
+123.255 345.554 mov
+(A) sh
+129.258 339.056 mov
+(G) sh
+121.257 335.807 mov
+(G) sh
+129.189 320.55 mo
+129.689 320.55 li
+129.689 321.05 li
+127.689 326.05 li
+127.189 326.05 li
+127.189 325.55 li
+0 0 0 rgb
+f
+121.251 317.55 mo
+121.751 317.55 li
+121.751 318.05 li
+119.751 323.05 li
+119.251 323.05 li
+119.251 322.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+105.001 328.3 mov
+(U) sh
+112.189 313.55 mo
+112.689 313.55 li
+112.689 314.05 li
+110.689 319.05 li
+110.189 319.05 li
+110.189 318.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+96.001 325.3 mov
+(G) sh
+104.189 310.55 mo
+104.689 310.55 li
+104.689 311.05 li
+102.689 316.05 li
+102.189 316.05 li
+102.189 315.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+88.001 329.3 mov
+(C) sh
+80.189 321.55 mo
+80.689 321.55 li
+85.689 323.55 li
+85.689 324.05 li
+85.189 324.05 li
+80.189 322.05 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+84.001 338.3 mov
+(C) sh
+76.189 329.55 mo
+76.689 329.55 li
+81.689 331.55 li
+81.689 332.05 li
+81.189 332.05 li
+76.189 330.05 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+81.001 346.3 mov
+(A) sh
+73.189 338.55 mo
+73.689 338.55 li
+78.689 340.55 li
+78.689 341.05 li
+78.189 341.05 li
+73.189 339.05 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+77.001 354.3 mov
+(G) sh
+69.939 346.3 mo
+70.439 346.3 li
+75.439 348.3 li
+75.439 348.8 li
+74.939 348.8 li
+69.939 346.8 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+74.001 363.3 mov
+(G) sh
+66.689 355.3 mo
+67.189 355.3 li
+72.189 357.3 li
+72.189 357.8 li
+71.689 357.8 li
+66.689 355.8 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+75.001 373.3 mov
+(U) sh
+67.999 380.302 mov
+(A) sh
+58 381.301 mov
+(A) sh
+49.689 377.55 mo
+58.689 377.55 li
+58.689 366.55 li
+49.689 366.55 li
+49.689 377.55 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+51.001 374.55 mov
+(C) sh
+50.002 364.299 mov
+(G) sh
+58.0029 356.298 mov
+(C) sh
+61 348.297 mov
+(C) sh
+63.9971 340.296 mov
+(U) sh
+66.9937 331.296 mov
+(G) sh
+69.9907 323.295 mov
+(G) sh
+65.9946 314.295 mov
+(G) sh
+74.189 299.55 mo
+74.689 299.55 li
+74.689 300.05 li
+72.689 305.05 li
+72.189 305.05 li
+72.189 304.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+56.001 313.3 mov
+(G) sh
+60.439 297.55 mo
+60.439 304.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+47.001 313.3 mov
+(G) sh
+51.439 297.55 mo
+51.439 304.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+38.001 313.3 mov
+(G) sh
+42.439 297.55 mo
+42.439 304.05 li
+0 0 0 rgb
+s
+28.001 318.3 mo
+36.251 318.3 li
+36.251 307.3 li
+28.001 307.3 li
+28.001 318.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+28.001 315.3 mov
+(G) sh
+20.999 309.297 mov
+(A) sh
+20.999 299.298 mov
+(A) sh
+29 293.295 mov
+(A) sh
+38.999 295.293 mov
+2.502 0 (CCC) ash
+65.999 290.289 mov
+(A) sh
+73.001 297.291 mov
+(C) sh
+81.002 293.295 mov
+(G) sh
+91.189 291.55 mo
+91.689 291.55 li
+96.689 293.55 li
+96.689 294.05 li
+96.189 294.05 li
+91.189 292.05 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+85.001 284.3 mov
+(A) sh
+94.189 283.55 mo
+94.689 283.55 li
+99.689 285.55 li
+99.689 286.05 li
+99.189 286.05 li
+94.189 284.05 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+75.001 282.55 mov
+(C) sh
+71.5 273.298 mov
+(C) sh
+80.5 268.798 mov
+(A) sh
+87.9966 274.297 mov
+(G) sh
+98.189 272.55 mo
+98.689 272.55 li
+103.689 274.55 li
+103.689 275.05 li
+103.189 275.05 li
+98.189 273.05 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+93.001 265.3 mov
+(U) sh
+102.189 263.55 mo
+102.689 263.55 li
+107.689 265.55 li
+107.689 266.05 li
+107.189 266.05 li
+102.189 264.05 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+96.001 254.3 mov
+(G) sh
+110.419 254.52 mo
+110.419 255.624 109.523 256.52 108.419 256.52 cv
+107.315 256.52 106.419 255.624 106.419 254.52 cv
+106.419 253.416 107.315 252.52 108.419 252.52 cv
+109.523 252.52 110.419 253.416 110.419 254.52 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+100.501 245.55 mov
+(C) sh
+109.189 244.8 mo
+109.689 244.8 li
+114.689 246.8 li
+114.689 247.3 li
+114.189 247.3 li
+109.189 245.3 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+104.001 236.3 mov
+(A) sh
+117.194 236.16 mo
+117.194 237.195 116.354 238.035 115.319 238.035 cv
+114.284 238.035 113.444 237.195 113.444 236.16 cv
+113.444 235.125 114.284 234.285 115.319 234.285 cv
+116.354 234.285 117.194 235.125 117.194 236.16 cv
+cp
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+95.001 231.3 mov
+(A) sh
+87.999 224.298 mov
+(C) sh
+80.9971 217.296 mov
+(A) sh
+75.9932 208.296 mov
+(G) sh
+73.9951 198.297 mov
+(A) sh
+72.9961 188.298 mov
+(G) sh
+74.9941 178.299 mov
+(A) sh
+76.9922 169.299 mov
+(G) sh
+82.9951 160.299 mov
+(C) sh
+89.9971 153.297 mov
+(A) sh
+97.998 147.294 mov
+(A) sh
+106.998 142.29 mov
+(A) sh
+116.502 140.292 mov
+(C) sh
+125.939 136.8 mo
+131.439 136.8 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.501 131.3 mov
+(C) sh
+125.939 127.8 mo
+131.439 127.8 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.001 120.3 mov
+(G) sh
+130.939 116.82 mo
+130.939 117.924 130.043 118.82 128.939 118.82 cv
+127.835 118.82 126.939 117.924 126.939 116.82 cv
+126.939 115.716 127.835 114.82 128.939 114.82 cv
+130.043 114.82 130.939 115.716 130.939 116.82 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.751 111.3 mov
+(C) sh
+125.939 107.8 mo
+131.439 107.8 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.501 102.3 mov
+(C) sh
+125.939 98.7998 mo
+131.439 98.7998 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+106.001 101.3 mov
+(G) sh
+107 91.3008 mov
+(A) sh
+116.504 90.3018 mov
+(U) sh
+125.939 86.7998 mo
+131.439 86.7998 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.001 81.2998 mov
+(G) sh
+125.939 77.7998 mo
+131.439 77.7998 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.001 72.2998 mov
+(G) sh
+130.699 69.0596 mo
+130.699 70.1641 129.803 71.0596 128.699 71.0596 cv
+127.595 71.0596 126.699 70.1641 126.699 69.0596 cv
+126.699 67.9561 127.595 67.0596 128.699 67.0596 cv
+129.803 67.0596 130.699 67.9561 130.699 69.0596 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.501 61.2998 mov
+(C) sh
+125.939 57.7998 mo
+131.439 57.7998 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.501 52.2998 mov
+(C) sh
+125.939 48.7998 mo
+131.439 48.7998 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.501 43.2998 mov
+(C) sh
+125.939 39.7998 mo
+131.439 39.7998 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.001 34.2998 mov
+(G) sh
+125.939 30.7998 mo
+131.439 30.7998 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+116.001 25.2998 mov
+(C) sh
+125.439 21.7998 mo
+131.939 21.7998 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+114.001 15.2998 mov
+(G) sh
+121.003 7.29883 mov
+3.50099 0 (CA) ash
+137.005 15.2998 mov
+(A) sh
+133.504 25.2988 mov
+(G) sh
+134.503 34.2988 mov
+(C) sh
+133.504 43.2988 mov
+(G) sh
+133.504 52.2988 mov
+(G) sh
+133.504 61.2988 mov
+(G) sh
+142.504 66.3027 mov
+(A) sh
+134.503 72.3057 mov
+(U) sh
+134.503 81.3057 mov
+(C) sh
+135.007 90.3057 mov
+(A) sh
+134.008 102.303 mov
+(G) sh
+134.008 111.303 mov
+(G) sh
+135.007 120.303 mov
+3.50099 0 (UA) ash
+145.006 130.302 mov
+(A) sh
+134.008 131.301 mov
+(G) sh
+135.007 140.301 mov
+(G) sh
+145.005 143.297 mov
+(G) sh
+154.005 148.302 mov
+(U) sh
+161.008 154.305 mov
+(G) sh
+169.009 162.306 mov
+(A) sh
+173.005 170.307 mov
+(A) sh
+176.001 180.306 mov
+(A) sh
+176.001 190.305 mov
+(G) sh
+176.001 200.304 mov
+(G) sh
+177.189 202.55 mo
+177.689 202.55 li
+177.689 203.05 li
+175.689 208.05 li
+175.189 208.05 li
+175.189 207.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+184.001 203.3 mov
+(G) sh
+186.189 205.55 mo
+186.689 205.55 li
+186.689 206.05 li
+184.689 211.05 li
+184.189 211.05 li
+184.189 210.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+193.001 206.3 mov
+(U) sh
+194.189 208.55 mo
+194.689 208.55 li
+194.689 209.05 li
+192.689 214.05 li
+192.189 214.05 li
+192.189 213.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+201 209.3 mov
+(G) sh
+203.189 211.55 mo
+203.689 211.55 li
+203.689 212.05 li
+201.689 217.05 li
+201.189 217.05 li
+201.189 216.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+210 213.3 mov
+(C) sh
+210.939 215.05 mo
+211.439 215.05 li
+211.439 215.55 li
+209.439 220.55 li
+208.939 220.55 li
+208.939 220.05 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+218 216.3 mov
+(G) sh
+227 213.303 mov
+(G) sh
+237.998 216.3 mov
+(U) sh
+243.004 224.301 mov
+(A) sh
+243.004 234.3 mov
+(A) sh
+236 242.301 mov
+(G) sh
+227 245.298 mov
+(A) sh
+217.002 241.302 mov
+(G) sh
+211.998 233.301 mov
+(C) sh
+202.998 229.305 mov
+(G) sh
+194.997 226.308 mov
+(C) sh
+186.996 223.311 mov
+(A) sh
+178.995 220.314 mov
+(C) sh
+169.995 217.317 mov
+(C) sh
+162.993 225.318 mov
+(G) sh
+162.189 225.55 mo
+162.689 225.55 li
+162.689 226.05 li
+158.689 229.05 li
+158.189 229.05 li
+158.189 228.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+171.001 234.3 mov
+(C) sh
+169.189 234.55 mo
+169.689 234.55 li
+169.689 235.05 li
+165.689 238.05 li
+165.189 238.05 li
+165.189 237.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+176.001 241.3 mov
+(G) sh
+174.679 242.52 mo
+174.679 243.624 173.783 244.52 172.679 244.52 cv
+171.575 244.52 170.679 243.624 170.679 242.52 cv
+170.679 241.416 171.575 240.52 172.679 240.52 cv
+173.783 240.52 174.679 241.416 174.679 242.52 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+182.001 248.3 mov
+(C) sh
+180.189 248.55 mo
+180.689 248.55 li
+180.689 249.05 li
+176.689 252.05 li
+176.189 252.05 li
+176.189 251.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+187.001 255.3 mov
+(G) sh
+186.189 255.55 mo
+186.689 255.55 li
+186.689 256.05 li
+182.689 259.05 li
+182.189 259.05 li
+182.189 258.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+192.001 262.3 mov
+(G) sh
+191.189 262.55 mo
+191.689 262.55 li
+191.689 263.05 li
+187.689 266.05 li
+187.189 266.05 li
+187.189 265.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+201 271.3 mov
+(C) sh
+206.005 278.302 mov
+(U) sh
+211.01 285.304 mov
+(G) sh
+218.012 292.306 mov
+(G) sh
+219.01 302.305 mov
+(U) sh
+211.01 308.308 mov
+(A) sh
+202.009 306.31 mov
+(A) sh
+197.004 297.31 mov
+(C) sh
+192.001 289.309 mov
+(A) sh
+184.999 282.307 mov
+(G) sh
+175.999 283.306 mov
+(U) sh
+178.996 273.307 mov
+(C) sh
+173.992 266.305 mov
+(C) sh
+166.99 259.303 mov
+(G) sh
+162.994 252.301 mov
+(U) sh
+155.992 245.299 mov
+(G) sh
+145.993 246.298 mov
+(G) sh
+149.989 236.299 mov
+(C) sh
+140.737 237.298 mov
+(A) sh
+130.486 239.548 mov
+(C) sh
+119.983 241.293 mov
+(G) sh
+116.229 252.04 mov
+(G) sh
+113.979 261.292 mov
+(U) sh
+122.979 265.288 mov
+(A) sh
+118.983 275.287 mov
+(A) sh
+109.983 272.29 mov
+(A) sh
+105.988 280.291 mov
+(C) sh
+101.992 291.289 mov
+(U) sh
+98.9946 299.29 mov
+(C) sh
+102.991 308.29 mov
+(C) sh
+110.992 311.287 mov
+(A) sh
+119.992 315.283 mov
+(C) sh
+127.993 318.279 mov
+(C) sh
+136.993 321.276 mov
+(C) sh
+146.939 326.3 mo
+155.939 326.3 li
+155.939 315.3 li
+146.939 315.3 li
+146.939 326.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+148.001 323.3 mov
+(G) sh
+155.939 326.3 mo
+164.939 326.3 li
+164.939 315.3 li
+155.939 315.3 li
+155.939 326.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+157.001 323.3 mov
+(G) sh
+165.439 326.3 mo
+173.439 326.3 li
+173.439 315.3 li
+165.439 315.3 li
+165.439 326.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+166.501 323.3 mov
+1.49399 0 (AG) ash
+185.752 323.3 mov
+(C) sh
+195.751 323.3 mov
+(A) sh
+205.75 323.3 mov
+(A) sh
+216.002 323.3 mov
+(G) sh
+221.898 329.04 mo
+221.898 330.144 221.004 331.04 219.898 331.04 cv
+218.795 331.04 217.898 330.144 217.898 329.04 cv
+217.898 327.936 218.795 327.04 219.898 327.04 cv
+221.004 327.04 221.898 327.936 221.898 329.04 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+225.002 323.3 mov
+2.502 0 (GC) ash
+228.689 326.3 mo
+228.689 331.8 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+243.752 323.3 mov
+(C) sh
+247 314.3 mov
+(A) sh
+253.004 306.299 mov
+(A) sh
+263.002 302.303 mov
+3.99597 0 (AU) ash
+281.002 307.307 mov
+(A) sh
+287.006 315.308 mov
+(G) sh
+289.004 325.307 mov
+(G) sh
+293.439 327.55 mo
+293.439 333.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+298 325.3 mov
+(G) sh
+302.439 327.55 mo
+302.439 333.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+307 325.3 mov
+(G) sh
+311.439 327.55 mo
+311.439 334.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+317 325.3 mov
+(U) sh
+320.439 327.55 mo
+320.439 334.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+326 325.3 mov
+(U) sh
+329.439 327.55 mo
+329.439 334.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+334.25 325.3 mov
+(C) sh
+337.189 327.8 mo
+337.189 333.3 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+334 315.3 mov
+(A) sh
+342.002 309.297 mov
+(U) sh
+351.002 310.296 mov
+(A) sh
+356.006 319.296 mov
+(A) sh
+351.002 328.296 mov
+(G) sh
+353.898 333.3 mo
+353.898 334.403 353.004 335.3 351.898 335.3 cv
+350.795 335.3 349.898 334.403 349.898 333.3 cv
+349.898 332.196 350.795 331.3 351.898 331.3 cv
+353.004 331.3 353.898 332.196 353.898 333.3 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+359 332.3 mov
+(G) sh
+361.189 334.55 mo
+361.689 334.55 li
+361.689 335.05 li
+359.689 340.05 li
+359.189 340.05 li
+359.189 339.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+369 335.3 mov
+(U) sh
+369.189 337.55 mo
+369.689 337.55 li
+369.689 338.05 li
+367.689 343.05 li
+367.189 343.05 li
+367.189 342.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+377.002 339.3 mov
+(A) sh
+378.189 341.55 mo
+378.689 341.55 li
+378.689 342.05 li
+376.689 347.05 li
+376.189 347.05 li
+376.189 346.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+385.002 342.3 mov
+(C) sh
+386.189 344.55 mo
+386.689 344.55 li
+386.689 345.05 li
+384.689 350.05 li
+384.189 350.05 li
+384.189 349.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+396 342.3 mov
+(G) sh
+405 347.304 mov
+(G) sh
+397.998 353.307 mov
+(C) sh
+390.996 360.309 mov
+(C) sh
+383.5 366.807 mov
+(C) sh
+377.002 359.31 mov
+(G) sh
+370 356.313 mov
+(U) sh
+361.998 352.317 mov
+(A) sh
+352.998 349.32 mov
+(C) sh
+344.998 345.324 mov
+(U) sh
+333.496 343.326 mov
+(G) sh
+325 343.326 mov
+(A) sh
+316 343.326 mov
+(A) sh
+307 343.326 mov
+(C) sh
+298 343.326 mov
+(C) sh
+289 343.326 mov
+(C) sh
+282.996 351.327 mov
+(G) sh
+274.996 357.33 mov
+(G) sh
+264.996 359.328 mov
+(G) sh
+256.996 356.331 mov
+(U) sh
+248.994 350.328 mov
+(A) sh
+243.748 341.328 mov
+(G) sh
+234 341.328 mov
+(G) sh
+226 341.328 mov
+(C) sh
+217 341.328 mov
+(U) sh
+217 351.327 mov
+(G) sh
+217.252 361.074 mov
+(C) sh
+217 370.821 mov
+(U) sh
+217.439 383.8 mo
+226.439 383.8 li
+226.439 372.8 li
+217.439 372.8 li
+217.439 383.8 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+218.75 380.8 mov
+(U) sh
+226.5 385.3 mov
+(G) sh
+235.752 387.046 mov
+(A) sh
+236.498 408.295 mov
+(C) sh
+227.246 411.292 mov
+(U) sh
+217.439 417.3 mo
+227.189 417.3 li
+227.189 406.3 li
+217.439 406.3 li
+217.439 417.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+219 414.3 mov
+(A) sh
+216.689 427.3 mo
+225.689 427.3 li
+225.689 416.3 li
+216.689 416.3 li
+216.689 427.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+216.75 424.3 mov
+(G) sh
+217.256 433.804 mov
+(A) sh
+216.75 443.551 mov
+(U) sh
+215.939 456.3 mo
+224.939 456.3 li
+224.939 445.3 li
+215.939 445.3 li
+215.939 456.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+217 453.3 mov
+(G) sh
+217.254 463.047 mov
+(A) sh
+217.254 472.794 mov
+(A) sh
+217.254 482.541 mov
+(U) sh
+217 492.287 mov
+(G) sh
+218 501.287 mov
+(A) sh
+218 510.287 mov
+(C) sh
+218 519.287 mov
+(U) sh
+217 528.287 mov
+(G) sh
+218 537.287 mov
+(U) sh
+218.998 546.287 mov
+(C) sh
+228.939 550.3 mo
+237.939 550.3 li
+237.939 539.3 li
+228.939 539.3 li
+228.939 550.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+229 547.3 mov
+(C) sh
+239 548.299 mov
+(A) sh
+248.998 549.298 mov
+(C) sh
+257.998 550.297 mov
+(G) sh
+267.998 551.296 mov
+(A) sh
+277.996 553.294 mov
+(C) sh
+284.998 560.296 mov
+(A) sh
+286.996 570.295 mov
+(G) sh
+284 579.295 mov
+(A) sh
+275.504 584.299 mov
+(A) sh
+266.756 584.299 mov
+(C) sh
+257.252 584.299 mov
+(C) sh
+248.504 584.299 mov
+(C) sh
+238.756 584.299 mov
+(G) sh
+229.252 584.299 mov
+(G) sh
+219.506 584.299 mov
+(C) sh
+211.01 584.299 mov
+(U) sh
+201.263 584.299 mov
+(U) sh
+193.514 574.552 mov
+(A) sh
+188.015 564.301 mov
+(U) sh
+182.264 573.049 mov
+(C) sh
+176.018 564.301 mov
+(G) sh
+167.018 564.301 mov
+(G) sh
+159.017 564.301 mov
+(U) sh
+150.017 564.301 mov
+(C) sh
+141.017 564.301 mov
+(A) sh
+131.018 564.301 mov
+(G) sh
+123.017 564.301 mov
+(U) sh
+114.017 564.301 mov
+(U) sh
+105.017 564.301 mov
+(U) sh
+95.7651 564.553 mov
+(C) sh
+87.7637 564.553 mov
+(A) sh
+79.5107 564.553 mov
+(C) sh
+70.5107 564.553 mov
+(C) sh
+62.5098 564.553 mov
+(U) sh
+%ADOBeginSubsetFont: Times-Roman Initial
+11 dict begin
+/FontName /Times-Roman def
+/FontMatrix [1 1000 div 0 0 1 1000 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+/FontInfo 1 dict dup begin
+ /OrigFontType /TrueType def
+end readonly def
+currentdict
+end
+
+systemdict begin
+dup /Private 7 dict dup begin
+/BlueValues [-15 0 600 650] def
+/MinFeature {16 16} def
+/password 5839 def
+/ND {def} def
+/NP {put} def
+/RD {string currentfile exch readhexstring pop} def
+2 index /CharStrings 230 dict dup begin
+/.notdef
+<10bf317079bb21e4> ND
+/five
+<10bf31703bca56f2b2f1649faf9ba9948c035e867a5c8948b33268dbbfaf
+455551fd125b019c10a69d4b25668e31b838df4ee36a0f050ddfb933a970
+96a275ed8a7222f12ff901e86c1d4781a2a4d533d3dc87c499fdb840f1a4
+8285d60f1f88ace01bc52eacc7865a40753471dc909f282c74ed77f33b02
+ce7e21940182217d317dbb078d97be05356c56d5596c7eb8d464dec1827e
+46a37273fc66> ND
+/quotesingle
+<10bf317031d6cb38314a48a25f917a0bc84fa8560a9dde3392b0598a064d
+d972a4e02d28ccddbc17> ND
+end
+end
+put
+put
+dup /FontName get exch definefont pop
+end
+/Times-Roman findfont /Encoding get
+dup 53 /five put
+dup 169 /quotesingle put
+pop
+%ADOEndSubsetFont
+/Times-Roman*1
+[
+53{/.notdef}repeat /five 115{/.notdef}repeat /quotesingle 86{/.notdef}repeat
+] /Times-Roman nfnt
+/Times-Roman*1 findfont [11.9993 0 0 -11.9993 0 0 ]mfnt sfnt
+90.001 537.55 mov
+(5\251) sh
+243.189 391.3 mo
+252.189 391.3 li
+252.189 380.3 li
+243.189 380.3 li
+243.189 391.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+244.25 388.3 mov
+(G) sh
+248.689 390.55 mo
+248.689 397.05 li
+0 0 0 rgb
+s
+253.252 391.3 mo
+261.252 391.3 li
+261.252 380.3 li
+253.252 380.3 li
+253.252 391.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+254 388.3 mov
+(C) sh
+257.689 390.55 mo
+257.689 397.05 li
+0 0 0 rgb
+s
+262.252 391.3 mo
+271.252 391.3 li
+271.252 380.3 li
+262.252 380.3 li
+262.252 391.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+263.5 388.3 mov
+(C) sh
+266.689 390.55 mo
+266.689 397.05 li
+0 0 0 rgb
+s
+271.252 391.3 mo
+279.252 391.3 li
+279.252 380.3 li
+271.252 380.3 li
+271.252 391.3 li
+1 1 1 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+272.25 388.3 mov
+(A) sh
+275.689 390.55 mo
+275.689 397.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+280.25 388.3 mov
+(G) sh
+284.689 390.55 mo
+284.689 397.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+290 388.3 mov
+(U) sh
+295.219 393.84 mo
+295.219 394.943 294.322 395.84 293.219 395.84 cv
+292.115 395.84 291.219 394.943 291.219 393.84 cv
+291.219 392.735 292.115 391.84 293.219 391.84 cv
+294.322 391.84 295.219 392.735 295.219 393.84 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+298.75 388.3 mov
+(G) sh
+304.219 393.84 mo
+304.219 394.943 303.322 395.84 302.219 395.84 cv
+301.115 395.84 300.219 394.943 300.219 393.84 cv
+300.219 392.735 301.115 391.84 302.219 391.84 cv
+303.322 391.84 304.219 392.735 304.219 393.84 cv
+0 0 0 rgb
+f
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+308.25 388.3 mov
+(A) sh
+311.689 390.55 mo
+311.689 397.05 li
+0 0 0 rgb
+s
+0 0 0 rgb
+/Helvetica*1 findfont [9 0 0 -9 0 0 ]mfnt sfnt
+317.25 386.3 mov
+(G) sh
+326.25 392.303 mov
+(C) sh
+325.252 402.302 mov
+(G) sh
+318.25 408.305 mov
+(A) sh
+308.252 406.307 mov
+(U) sh
+299.252 406.307 mov
+(U) sh
+289.748 406.307 mov
+(G) sh
+281.252 406.307 mov
+(C) sh
+272.252 406.307 mov
+(U) sh
+262.252 406.307 mov
+(G) sh
+253.252 406.307 mov
+(G) sh
+245.252 406.307 mov
+(C) sh
+200.439 578.3 mo
+200.439 574.05 li
+281.189 574.05 li
+281.189 578.3 li
+0 0 0 rgb
+s
+0 0 0 rgb
+%ADOBeginSubsetFont: Times-Roman AddGlyphs
+
+systemdict begin
+/Times-Roman
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/three
+<10bf31704d4d67992b9ed68788587e5040da2286f83510cfc80f4a1e6fe6
+b09f97c944a087c4717928d782a2fb1bf0c721dd38a24ac2067564597d96
+92f97bc0abd49771e30c9491f8e5eab740a467cca2d53dd7c7249046b7bb
+4481eefce39557f10e129ce1987210441b69a70dd258cb6743bf9d7d1704
+979d6e3b6b3885eb27d4d4e5451b96ed7dfd7ce9e64ca73b4c877d5863ad
+c8641b65d41f66c4fc61f9c17255ecd286dcdef4a9a113d36ecac701c7a9
+417b48f1ad6bcdbabde10f6ff50ed870147c0d4cea98b8630a6ff4466ad4
+2983d01ca76121874525ba586aec14> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Times-Roman findfont /Encoding get
+dup 51 /three put
+pop
+%ADOEndSubsetFont
+/Times-Roman*1
+[
+51{/.notdef}repeat /three /.notdef /five 115{/.notdef}repeat /quotesingle 86{/.notdef}repeat
+] /Times-Roman nfnt
+/Times-Roman*1 findfont [11.9993 0 0 -11.9993 0 0 ]mfnt sfnt
+57.751 555.8 mov
+(3\251) sh
+209.689 542.8 mo
+215.189 542.8 li
+209.752 533.8 mo
+215.252 533.8 li
+209.752 524.8 mo
+215.252 524.8 li
+209.752 516.05 mo
+215.252 516.05 li
+209.752 507.05 mo
+215.252 507.05 li
+209.752 498.05 mo
+215.252 498.05 li
+209.752 489.05 mo
+215.252 489.05 li
+0 0 0 rgb
+s
+137.001 324.05 mo
+137.501 324.05 li
+137.501 324.55 li
+135.501 329.55 li
+135.001 329.55 li
+135.001 329.05 li
+0 0 0 rgb
+f
+219.752 218.8 mo
+220.252 218.8 li
+220.252 219.3 li
+218.252 224.3 li
+217.752 224.3 li
+217.752 223.8 li
+0 0 0 rgb
+f
+198.501 271.8 mo
+199.001 271.8 li
+199.001 272.3 li
+195.001 275.3 li
+194.501 275.3 li
+194.501 274.8 li
+0 0 0 rgb
+f
+204.501 279.3 mo
+205.001 279.3 li
+205.001 279.8 li
+201.001 282.8 li
+200.501 282.8 li
+200.501 282.3 li
+0 0 0 rgb
+f
+209.752 286.3 mo
+210.252 286.3 li
+210.252 286.8 li
+206.251 289.8 li
+205.751 289.8 li
+205.751 289.3 li
+0 0 0 rgb
+f
+237.252 326.05 mo
+237.252 331.55 li
+246.752 326.05 mo
+246.752 331.55 li
+0 0 0 rgb
+s
+183.002 343.55 mo
+187.251 343.55 li
+187.251 426.3 li
+183.002 426.3 li
+413.502 343.05 mo
+416.252 346.3 li
+387.752 372.05 li
+385.002 368.8 li
+115.001 350.55 mo
+112.251 353.8 li
+140.751 379.55 li
+143.501 376.3 li
+0 0 0 rgb
+s
+0 0 0 rgb
+%ADOBeginSubsetFont: Times-Bold Initial
+11 dict begin
+/FontName /Times-Bold def
+/FontMatrix [1 1000 div 0 0 1 1000 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+/FontInfo 1 dict dup begin
+ /OrigFontType /TrueType def
+end readonly def
+currentdict
+end
+
+systemdict begin
+dup /Private 7 dict dup begin
+/BlueValues [-15 0 600 650] def
+/MinFeature {16 16} def
+/password 5839 def
+/ND {def} def
+/NP {put} def
+/RD {string currentfile exch readhexstring pop} def
+2 index /CharStrings 230 dict dup begin
+/.notdef
+<10bf317079bb21e4> ND
+/one
+<10bf317016a461215dc2bc58955b35661fa832109bbf588b04481bf3cd7d
+6757617e8c0c9816948b05a2f38fa7d575d87daf4173819092e8a31c5c40
+e448> ND
+/two
+<10bf31704e7ce76dc21d92ed768461702e89179315ec586ed23b84b600e7
+3a8f14adaeefbd1a8ef4ea75ecc881acaee461c169f9135deb6066d93b22
+ee96d26cb12918588e0f074cbe4a50dbd8dee265fdf797758e390f627882
+1a348c2c9d448eec97692b7ef491db5d02d45177dd87c13938d098649ebe
+a4cc2faaaed0c7a2761825de7c345f0bfb9041ae2e00092351fa02c4> ND
+/three
+<10bf3170448bf7f9ab87993b613b3ec6872bb5d966efcdf9c783f7efc718
+a4be64d1751f3265cb60d9b5276469b557ce9ac8e0b3e36526e436641c45
+b03e0bbf21c62cc9320f6e43ee7f4cf80e4ba99cbef004b4c841b62fef40
+eb9e06429ecc6610f2f9981d2ba816746969ed66b8d8f4a43f88a0481912
+4ea05d3482e732407a96b011398ff3c43e92014a09adb230efe31fae5890
+b709d22daa136899f6cee93c165c965053839c1761be399dc17d19e6190c
+d1189af61ffb99fcba33a54bf70a760eb14d549829e16b73f3286e65e570
+e9c68df30501c2fc3708531fc7b7a7> ND
+/P
+<10bf31705ac93459811df9cbd49c2bf4b1dedea8f02dfae7024000d592d8
+626efab6b45ce7d12609750117a8b9f45cec5fbc19dabdf498132ae3871f
+7b30c381d86c65ed3471fcdb55def6123a3407152978bf6a0a519b305da6
+114f0efe0bd3c68f68cac1672ee085498a8e6fd32638d9a60604b744ec7d
+adf8080c> ND
+end
+end
+put
+put
+dup /FontName get exch definefont pop
+end
+/Times-Bold findfont /Encoding get
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 80 /P put
+pop
+%ADOEndSubsetFont
+/Times-Bold*1
+[
+49{/.notdef}repeat /one /two /three 28{/.notdef}repeat /P 175{/.notdef}repeat
+] /Times-Bold nfnt
+/Times-Bold*1 findfont [11.9993 0 0 -11.9993 0 0 ]mfnt sfnt
+144.501 537.3 mov
+(P1) sh
+182.505 520.296 mov
+(P2) sh
+133.005 463.8 mov
+(P3) sh
+228.939 490.8 mo
+243.939 490.8 li
+243.939 478.8 li
+228.939 478.8 li
+228.939 490.8 li
+1 1 1 rgb
+f
+0 0 0 rgb
+%ADOBeginSubsetFont: Times-Bold AddGlyphs
+
+systemdict begin
+/Times-Bold
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/four
+<10bf31705e925b80b4d4cbc4e928debcbc9ca1ce5a446752e420eab5615d
+cef61aee7d97d9eff1670763252051f2be6419a384475d66237624abe7df
+bf6e4102d5fa21a734cd00f0c9525ffcfc3a0b5db0af7e642e07c3025b71
+28> ND
+/five
+<10bf31704c1fb570da2787659fe061824d11502990202c6ca9b1b5da7d96
+0cdc349fd36ba74c839bb1f6ad5b2036aeda9f35d253d86da9773dd61de0
+422dfd536357960cb12f0db9ec77f07242af63d3096a64c3445c4655da1d
+3f19cb4456eb43ca711a9ea13df4ad219690fec0405819e631b49a78e94e
+67647654af6c2c1b1a75609742d0f8441ecfc35136febc44d8aae59aaf7d
+8b88b3651059> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Times-Bold findfont /Encoding get
+dup 52 /four put
+dup 53 /five put
+pop
+%ADOEndSubsetFont
+/Times-Bold*1
+[
+49{/.notdef}repeat /one /two /three /four /five 26{/.notdef}repeat /P
+175{/.notdef}repeat
+] /Times-Bold nfnt
+/Times-Bold*1 findfont [11.9993 0 0 -11.9993 0 0 ]mfnt sfnt
+229 487.8 mov
+(P4) sh
+159.497 313.8 mov
+(P5) sh
+259.439 457.8 mo
+274.439 457.8 li
+274.439 445.8 li
+259.439 445.8 li
+259.439 457.8 li
+1 1 1 rgb
+f
+0 0 0 rgb
+%ADOBeginSubsetFont: Times-Bold AddGlyphs
+
+systemdict begin
+/Times-Bold
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/zero
+<10bf31705e925b80b4c8f1fcfb5b2fe440a74f62c796f3c02eb2da9ee8cf
+3e749c77619068400ca89c7ff72323032874cc719b493cec13438cfd7c60
+1a938141b249a6344fe7adba210563b145c5c7fdeb53dd40d430a2aa7888
+168bd4bf2698d90932777f16b7e6a801d452cb01444444badd4929588478
+5c2db1fce381dd65450cfad1ad35a39b11fd66b6c6b2> ND
+/six
+<10bf3170422f935763e872994057543ce516e412e89a49bbc1204d62c175
+ca9d1f51644268fd25cecacf256df345b741363b23f98a608f15fd547f72
+00ef03f86eb4e44c61909a23296955b08f2771fc97c22a2b74bab2a8e84a
+f4f8604f1a71e930f22c46eaad1e90de83acf4d8a5e4c28edd51c9df340e
+2d52b5868c7a5fd083ea171c4819194d1bf4bc737f3833f0f4171f47f512
+371c97328c1500a428075fc7d5b3c272c7618a32f1d1fb3f1f5127d8ad2b
+3b1b912a6696> ND
+/seven
+<10bf31704e7ce76dc241686bc20501ea6e7c96a17170122b38ebad2a9949
+f6af8d4a89b98118652167542a74de2ba301ca2bc45e339e3ae683f4931f
+043d89fd8fa9850065> ND
+/eight
+<10bf3170599acabf992f0757d5e6110d0b202583f1f37eaa3993e2f1cd0f
+6e2622e3038d71367894f4d7032548bfcfce20f6b689fcb6b5a6254cd40a
+57f3279a61197186e879de36aa303e142e3645176933121430692e7d7ebb
+506cc17ee9a0b5fcbbc35b4e0ca4bc539673a52c07e974690d1b4e3e7b30
+414514c9c4a69719fb0eb20a52293f89414475f52809d90dbe81091c74fb
+4c4dadbb0d931073181f5593d9dca742706d4ab9098d680bf1c84eb32b33
+f14a05583e424b60d3cbfbb323701a5b41e6da60d0f26788ef39cc3d0958
+7823ca82721fbddff3435b5a34de0e71ff21dda5df3656efd4419938b2c4
+470fe8e64677cb89eb7c4f1b21ac33694d> ND
+/nine
+<10bf31705d64a97b18e1d0c26252f36d43809f58e8523f9ddf78e8047717
+f29066dc4d29840ee57ae4b42a94d32fb40701e46b2363001bb79897b78f
+07a6186b92686a103837d7cdc6e3e3744245ff59de2a1d399ca8540f1c30
+c9a8541a5212f9caf65fbd8253c13d1a37e50b3c931f53d63eebadb9b257
+d82f4a0ddd6c07d70303ef7dcaedbf224ad7acf31f562053f842644420fd
+b779b2493077d34338a3116b99be03d0552359238e501a8016fcea411abd
+1d0406> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Times-Bold findfont /Encoding get
+dup 48 /zero put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+pop
+%ADOEndSubsetFont
+/Times-Bold*1
+[
+48{/.notdef}repeat /zero /one /two /three /four /five /six
+/seven /eight /nine 22{/.notdef}repeat /P 175{/.notdef}repeat
+] /Times-Bold nfnt
+/Times-Bold*1 findfont [11.9993 0 0 -11.9993 0 0 ]mfnt sfnt
+259.5 454.8 mov
+(P6) sh
+/Times-Bold*1 findfont [11.2423 4.19473 4.19475 -11.2423 0 0 ]mfnt sfnt
+122.022 303.857 mov
+(P7) sh
+/Times-Bold*1 findfont [4.45364 -11.1422 -11.1422 -4.45364 0 0 ]mfnt sfnt
+57.6792 344.517 mov
+(P8) sh
+/Times-Bold*1 findfont [11.9993 0 0 -11.9993 0 0 ]mfnt sfnt
+43.751 285.8 mov
+(P9) sh
+120.755 290.3 mov
+(P10) sh
+109.939 291.05 mo
+116.189 285.3 li
+118.189 289.3 li
+109.939 291.05 li
+0 0 0 rgb
+ef
+116.189 285.3 mo
+116.439 285.3 li
+116.439 285.55 li
+110.189 291.3 li
+109.939 291.3 li
+109.939 291.05 li
+0 0 0 rgb
+f
+116.189 285.3 mo
+116.439 285.3 li
+117.439 287.3 li
+117.439 287.55 li
+117.189 287.55 li
+116.189 285.55 li
+0 0 0 rgb
+f
+117.189 287.3 mo
+117.439 287.3 li
+118.439 289.3 li
+118.439 289.55 li
+118.189 289.55 li
+117.189 287.55 li
+0 0 0 rgb
+f
+118.189 289.3 mo
+118.439 289.3 li
+118.439 289.55 li
+110.189 291.3 li
+109.939 291.3 li
+109.939 291.05 li
+0 0 0 rgb
+f
+116.939 287.05 mo
+117.439 287.05 li
+117.439 287.55 li
+114.439 289.05 li
+113.939 289.05 li
+113.939 288.55 li
+0 0 0 rgb
+f
+0 0 0 rgb
+/Times-Bold*1 findfont [4.19753 -11.2413 -11.2413 -4.19753 0 0 ]mfnt sfnt
+89.8169 259.833 mov
+(P11) sh
+/Times-Bold*1 findfont [11.9993 0 0 -11.9993 0 0 ]mfnt sfnt
+144.001 96.7998 mov
+(P12) sh
+/Times-Bold*1 findfont [11.2067 4.29118 4.2912 -11.2067 0 0 ]mfnt sfnt
+196.666 196.274 mov
+(P13) sh
+/Times-Bold*1 findfont [7.62038 9.26837 9.26839 -7.62038 0 0 ]mfnt sfnt
+194.595 246.868 mov
+(P14) sh
+/Times-Bold*1 findfont [11.9993 0 0 -11.9993 0 0 ]mfnt sfnt
+224.75 313.8 mov
+(P15) sh
+305.008 315.804 mov
+(P16) sh
+/Times-Bold*1 findfont [11.1407 4.45985 4.45987 -11.1407 0 0 ]mfnt sfnt
+369.779 323.626 mov
+(P17) sh
+/Times-Bold*1 findfont [11.9993 0 0 -11.9993 0 0 ]mfnt sfnt
+277.002 417.8 mov
+(P18) sh
+%ADOBeginSubsetFont: Times-Roman AddGlyphs
+
+systemdict begin
+/Times-Roman
+findfont dup
+/Private get begin
+/CharStrings get begin
+systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if
+/space
+<10bf317079c757bf91> ND
+/parenleft
+<10bf317005ad1d5c1c85b66b1383105b1f75e2f991d0ce88be4badf85803
+21509df291e14c112ffb01d8e602a943619bc30f04ad5bec7380a8990646
+3af8ae958b6cf03f> ND
+/parenright
+<10bf31707a09dff2c026d81f6e9ddfea5c974e53cd1d466f61f5191ea85b
+8cec99ca7116d955b56580cb6386f3c883b5f08253cc6274f4e286cc5255
+2ab414d7588be021c3133e> ND
+/comma
+<10bf31702451e0db362c9688b7e8c23461139937b5c7b11901b7615e58eb
+ce0e45846e0c6f23dc8426fbfe9ea1e740f039ff8cf61996b7c76b9bc2a8
+> ND
+/hyphen
+<10bf3170498b62f3d5e85685025146d3ebb9df6a4eac4b> ND
+/period
+<10bf31702451e0db148ffcede57c04e4080790f3ed0657a1eb7c77aec952
+d15bc36106> ND
+/slash
+<10bf31707a099488765253767b6ef342c7f7241110bbcb09ce46e123db> ND
+/zero
+<10bf317041f0a9492c2035cd51a2904806f13f17c2620c4aaadd106266c6
+25bbb5c21416837f1d1cdfe459e81f1a1013c16f86fd9a27693c8872ab97
+faac2150af6ee3e0ed7161e755af6eba20495920179a1d8f20f4ee7a5dfd
+d241c9cbc5fe8591b62af839950b19a3476f9e4d7507a1470207e05b89ac
+689b789d08d0d5ded4eabe098d4b8bd1dddb4935e637c1> ND
+/one
+<10bf317005ace4116f46739a291c133ef5c0ce2c8299d65de3756bb6940c
+b4355dc475faba14c0bd0d8c1136c951297252e0da77fbc30bfee79150d7
+5cee48> ND
+/two
+<10bf317036d1f7d632bfc8e1eacd9b006cbf62552fbc3e1ddf0431bb1541
+532db9a4c5a8dc835909798fb06d799bb3302bb11635991e6e69fb7b2121
+695dc70dabe319d810a0839879080304965b0d9ade52577069bfb1ebea9d
+40ec431e0eb5c0370e6018e714e9085ad98aa8950aeafd8bdc268bd16545
+e444488654d53d43bc587df4359111f64cd5a11a6755b08b2253ec1e> ND
+/six
+<10bf31704faaa95022859bfa4d40a634d16b5c6e27e8179786696c20efcf
+f2088b8d3116daaeb3f47f771c5b59cc0afd89139a7c37c605cf8b53dc27
+380249aa5ea705e51497228cbe7f92dfdb05cb2c745bfad479a4a6102917
+98805f1e4ffd1913dac316084a3ad05d6714a918c36f9d6d45844ed149be
+369d7108e7fb694a36f8c56232e1bee9c1bea2fe67ff99030d5c6f5a581f
+b878427e68d526f4869e604a9c89abace85b55824dfe246365ef13eb1536
+bf4a0f83> ND
+/seven
+<10bf317033461378fdcf6456106803c68654af3ae8d9d7ea442e5214ba61
+233f7de8bb4ebc4461d99d860d36ba1db7097fc3848df1337b3cacd1483d
+0026ca578af6a7c7> ND
+/eight
+<10bf31704ab2181850c1a88d3f8fa202c5e0a8894b70ce17f00448b7f184
+829e93577c1d58c14cc019460ebe7600631f8f4acc93b4dd884803c9e3f1
+eb26f7c2cd1094133dc32c948b33940b19fa747b701ca51c9ee927a38f52
+04f2614165cbc422ca4714c03eef07c163ee39fa7bbff5cde214fd39a16b
+09cf85564b587c881bfef98a02ad1cc0a265a943373623af31c74485a733
+18d0f6f7f1d5ed232a51a44983dace620c95820f016744af813aa536566c
+47af1e2278efd37fbb5379807dfaa2e69d27f2b4a59d46b7d8d8efdb20e9
+60c77ba7077adbe4d33c0181893b161aacd6499116f6cdc8c2ee52d69d4b
+91aef33a637784e5f5c64baf9cca7942dfc3> ND
+/nine
+<10bf31704855d6b4077ddc2826d77db5309801db6033b068b760ce80e56f
+1fb06ecf2eae8a8d4e1fba65e387594ebfaea74cca9b3dca0d29b4714ea3
+ab2bd8f1cc4d869edc1f54b56761c869d3fc0b7a14a657708f8fb5e1653b
+8a66c197768c7c9d2f195f6d8f8bd8b8942741d02883e7aa99afc3bdf8bb
+9ab95c6726016e7ced95692a934123bf74336844b858386195bd6f0348bb
+5e0be642088cb2faf5cdfc2d6d90d50529fce477399cd7b4506d009be385
+36d2> ND
+/colon
+<10bf317016ab24388477e56e7a7154cba85b49b50c016d79ec6a751ac400
+8ec5bd2ff257c655573d9b15246e797bd0b4311210b87b998fe71617c304
+2798> ND
+/A
+<10bf31706d7ae346bffe29e0fb34e18312ccbb6302af22689ec4f2127a0d
+d6baf4773826f8362914832b0b84ca343a443e2c16a9118637ad6f1a2e1f
+aa1ebb04f7f1ef2a790258bcc86d11f5b7f6caa72bc1d0e46a538a95ab48
+ad3395878de6486f82> ND
+/B
+<10bf3170435cd0e6190c3cf2f98c0ec5f6d620884f807980d68ea5243935
+1cf513d39c9b25687fe57d2816d113d980a959c9b00fd2e77d4229c2a1ad
+a3e7bbcda819ac24e3b8891eea398527cfca77d0d15f149f4c6d5846d335
+43a76e2781c833d82569ade39651c9c644c3169de3b922cb11cbcc9e3e39
+9313b10f269b5eb4cbabc359d4974298ce89a949ece874012cba69147eb5
+610f92e7d7d066555052ccb6fcf64056d494eb67e8ecdb92927bd9cf4d30
+d18e88a4fe> ND
+/C
+<10bf31704985822027c4890fabf47f18315cf1f514866b1687ca49157587
+c73ada42e87a82a71fa7557e3105cf56b89ad3c5315f5962b1a3c377569b
+d149dd69698c26cebdc18b285f0ce02ffc45fba7040ae76c3d10470951cf
+6e751875b261daf70dccaf37817ea22e49172876625f99afea7e192718f8
+2d13de668d4574b9d8efe1037b5b4dde7df018f38f> ND
+/H
+<10bf31705fc0e33fb137c616b47290d19f226efe6742c4bf0cb058c1615c
+76a279be1139312734c6a234e1f459f5fdcd3610ff64e7a2c26e9afde307
+03bc3a282a32be242e3b866b5d5316e26382db6023d157df27f81ef7cb60
+9e7ce88b3fd76ef1dcfc9e82f7da8a909a> ND
+/I
+<10bf31705fce2ebcdc14a0c146e0b901675090bf7410ca8e892cc450a79f
+cd6263efec258234bfc11447e88090b6fe0bb8d7123ec2> ND
+/J
+<10bf31708ee748efbd7ed856eeb700658ff31ff752d191b29985ca44e9d4
+fa8021d2c2449073a526a39b84a6937e5c32edc6640651b2c3be27d81c19
+ea96e78f4113888fc8b134455074491f7a7ba09c8facafd5a004a760445f
+d00fdfa6b32c0d5d> ND
+/K
+<10bf317040c3589fd99cbe09f2e82b80ab84eeccc01172881d83ee362bf8
+a094002302b824c0515db4f51e613b48286f1aa08a3e05a9abf61b1e68db
+9e2da33e60ee2e1a901b97a6d5ffaa072bd7b43f086fc058039873621e09
+084baea22255bdaabe842c68af5317aaff1dc54c2d77961bae14> ND
+/N
+<10bf3170586d3968505ff87264be7ec883920688cca7d9d7ebef6b14adb4
+12cf47613ab238b5314909eaae4b807ef31a587fe4a79c426c98f895ee29
+85238abac441a7e05459a2603f6d28e75fb6badfa6e81418c0a638> ND
+/P
+<10bf3170599a82ae9dc9593cad300b7f3884414bb0569fe483f3acb617a1
+5ef395ef32cf0d220dc8440aff02a21bdf7646dba480081013ff057e6243
+9a50cbea5f9cb9a46c125151fa2dc458d75a798f192be2eb1f436a0d9567
+1d70b037f2931437b8312c06f4962bec94fe952154308850b7049bbc3ac6
+9301> ND
+/R
+<10bf3170422e6230a952872b5ad1dc4f16e3fc1704a02c61c5e992942e1e
+814f5a036cc714a19b83d8f9ec92957b9cc9c81e547da8ae77f074c9bd10
+73009734e431fccfd615ceda2428e8dccd0571a77f416f593adb1cae7381
+f103392cf96199bef077b31adee38fb7ba883b119f4671e1c9bf208bfda7
+5a094838b33f6ae85649043746a99b52c2cd46025fa2b9d4b4471e> ND
+/S
+<10bf3170422fdb647ca46ef1065574f96a04ba084bc098d0eeb8d73efa20
+25e84f6b143b820d4f40c2a48625d834f7dacccdc9b2e32e077bac2098d9
+6b96f7e49545eb006bae209a0f000b57e1c799126f23a367ce4e789a5521
+430ab838ef6870f4e454f0b7245d3ba7617ed80ea39e731c783b4f750d49
+c02786896c9300404554d9b27a816a32d57c6ee2c1b47b8acb582fdf0220
+ea9f8c2820a6a365a0659a1ae4a29f48f2bcb52fc079d6939efc15> ND
+/V
+<10bf317068829292e78283dcc1feddc62cc7cddc94a0bbb5b543dc95264d
+607dc9177221d004405fdb183b401b7c0c26411ae2fe39905820120b0ce1
+84a326b5fbb8a4c8f787d3b760148b4ab3c28199> ND
+/W
+<10bf317065f5a4c4ed7e80882a865c0b5e0c1db85df74331e02b3cb41a9a
+6239f1b0184328c7e59825e7051dadcbf9f8bceebe04b15a4de4f35099c2
+4c6fa3c162605ac75553c7ac46e3cf5c6001e018a229472674354172448e
+beaa9b338091ff15ebc460b4f961d3b40d0ea372d7e5a196907046ccdf0f
+2834e50c039294b25c1cdd> ND
+/a
+<10bf3170599a125eccdb6ec27d3afe07da389ecbb305faf429012f717ba5
+d7a504001b7d2cf7722bd949e4b4b2e77bccdf0b2b1586d9915715766da7
+59741fe65bc64d6863ec1039a27d8da5681073bc991e2c740d0bf14aed2b
+81d80e811057a7a261d77619d9bcb0c3ef91c90a394016d3a96727d1d488
+dda1e7b4d3ff0a77767d899306fd13aca7aad2910e6e3aad69f172e3d8e3
+85dff5319dcca32104c930e0a4e2e49b8750bab4a9149ef2d730bda10f91
+592a2a46cc0c629469d818798f634569b83f99cf> ND
+/b
+<10bf31705374882f7387637dcbb704d72f8bd63b0bf65f4612fe0f27d529
+60722d7a45438cfde1168810ce04c91811250545cdbd6c10a87a474df160
+24b3215bec7af3c0b61e074082f1ba3141f39f480c2c5a76fd396a487a9d
+6a25d6aa36deda9c976e791661015e179d4f36b29dae4f0f04128d0e5ac3
+dde66d561d7806d481796866491fb9de890bfe> ND
+/c
+<10bf3170435d9d6bdc818a55004ae1aad80b146ef4640b9f7a82d0286ef2
+5db6c5bd65a97018eac616ec8d7499054c6ff6544566113eb456a3efeddc
+ccc8eb022ae4ed32a1cae1639526dcd4d63a5e0b6438bcaa9089a840ecbe
+5f5d623e9d44cd8703af9d371c430fcdb02e500bdbbffe37e3e86fac9735
+d4759aa66b0f12007edc114a586e0532e684a856c1> ND
+/d
+<10bf31705d64a97b172062c3429fc21eef6c195efed3b68a891c1c3f4782
+b3b8f0493f2e3f2184ac9ec14961282178962a45d0e1282fdb9be01eb4d9
+330ed40623df12b195cf16105bcc4a841d7c3ce2fe9e2c90d1cb4d19d886
+f71e50c5fdac49f7a3f6cbb8e9cfef3e1d497b6f65def5b587b04c30a0ca
+285981fa3ef98a35eaa48c3406f03812dc4d26551eeab2e7192ffd8e06d5
+582446be7a8c0a3f13a5> ND
+/e
+<10bf31705d647142da77f80383b39a2be6c45bc647b72e319ff73d610d1e
+62332d342ae09e16e6dc01192625d1af66f730c2b02413523b998639a5ab
+b7a878766d5d5ccb302e4a2339fd457ff9223aaf50bbf100079c44acb716
+0f80282571552fa2e287b218275ab71b88c3093968065977f1def2e827fa
+b94e763732c48dfc9ec49ad18a7a0f2ba5d9d70264> ND
+/g
+<10bf317051174587f37a05df23e24e32408217bf8db3b328f0f5146daeaa
+1ea0b93eefbeb881d5cb9ffa3155e0f4e76e202ca89aac26fddfcffe019d
+b4c15e4612e28d2142e015e9b34526719a1671f68e0202443eff71303477
+43d1a7a6e7b2a9371dc8418b687da58c1e33c99f8930ca86ef07a3b3ec43
+50197c8090ae40568025cd75df947eee06d039359090b4659bdedae20a2e
+32bef9ba6327edc3577a042c8a22d1cb6fbd64fd64754891> ND
+/i
+<10bf31705fce6507854bfd5453e743735818d40d67ec1532d846ec6eb57b
+a379fb65a427f99b32d98a51f57658ac9b227989b26d151d43cea1c989bf
+f139f48a1383fdef993f3563bc63dd976a127ddf8d3d4d> ND
+/l
+<10bf31705863e503408ecf9ecbcc5d318bb6318525c5b52ab08ec840ccd6
+ad0d498b316284b1f457be2054e4989ef3a09e1de6c846> ND
+/m
+<10bf31705ac86a49312a9fd9216ac187bbece8fcca49aeeba8345c5dcb8d
+22e2f311041729efa574dc4f8cea66ff62b9f7875e438aaac2bc968c833c
+59433c927d77707a4793dc203fe495345b66acf70bf0e3c6739b10493656
+320226d1aab14145580caac5297051c2cbc1275bf490dbfb37069939d4a8
+fe2e511651276f25977617430a1fd815f73c447cb770501a519db54db5ee
+ff6657ac892d36d74b68b770f457c3a3ce13a3df663f087684614f2f64cf
+19538a331f9664c459dc237b> ND
+/n
+<10bf3170573e563cfd092bc7aac9e949b8f7a4827fe0f5ce67cfeb547cc4
+0324c0c45558a88f1ea6ca3d00c7850dbdd4b3c992012bc75b427cf6ac8c
+46f4b1290c6a0924e21bd8fe2684be248ea4bd907856e7ca65331eac2fb6
+c7d64a4c51041fcdcbf442862c40d772e99c9a3d2660da8f8d1225eb9a38
+a0939af5d1> ND
+/o
+<10bf3170422f93576c717ee99d6736f12ef20213595672a3889f39fd79b8
+f8e03db4067972748506dd3e394e1ed21612adf9955de5d344645439263d
+16fe05d9f8432033df436bdbe971bdd0b4ca20ec935003ac05958f3374d5
+be4f84a5e6c035be86b4155b925e09a04220f0eb68246a69ca538a270f95
+b47c12aaed3b0426c82ce7bd8f92> ND
+/p
+<10bf317054a23a3541e41e8ecb0847e60b1e31523529115b6758aa977454
+1325eaa79edb9799a0d9e00066067ae6bea37a698c98886274e3f41cd1b8
+578a94c225b0f3c0e92bf5f3f03ed0de98ddd26367108da99886260beb08
+1a3b0855a0e35e3b0e73b0cca3d170c7bbff6a8ac29076da97e9fbc9239b
+bfc88f95a8a50d51b6e1e0fb3f034ff0bb5e891e2b09f42b118fb4882d97
+e05b> ND
+/q
+<10bf31705c36e774c01818b567b3a30f54c9e6843777a6accc2cafc6d62c
+32f03e649a76106692b272964d44887a71a37c0f41a3ac706672abddcb3a
+b2e1842622d684c349659112fdabf6c782aae0bac9563f28fac625d64bf5
+97c35d79be6aacdfddbd7b27dbac2a70805734e90e835d9f4394cb64de19
+8ebedd5445420cad3d2f380bf1ef914ef97d6a6c> ND
+/r
+<10bf3170537b448baee17d92f49ac0a05a119905783ad31b1335f4ce098c
+c861eb004143dfac510557c0ec68b61a660779041049a2f8adbd8b72e40b
+d877d7d4b313643f2fa4d7581b23becdec85b7d7582f7e2f50f829ff3515
+fa749796aaa74d2ed647eccf740e962946> ND
+/s
+<10bf317050d9b80120c19d821533341643354852ea9df97a99fd4ba774b7
+08c1fae708745f9328a1a9a5d21e169ff77ecdcd42f945703d067165d10e
+35df5f72d35341f01fb3026c906bf5dc9a4d1bcd00cb4fd389804aaed0c5
+179606cadf715c7fa2d902f17112979a83434b773005e3a14720c0ac9ccf
+50f62928be58f2d774787655c3e51c4ad2772c2dacd3e4a9b3e3d07c0e79
+b3bf6755ddd2a9f85c3008b885abd5da2aea4dd26daf39a061> ND
+/t
+<10bf3170524a2d22499482a58e0ac04293f60f52cf55d017afd6304f1340
+86ad48ad6f4b3f79315e33aa34c07371b994fceb8da4492a987edfdf026d
+4bc55acf283ac30b> ND
+/u
+<10bf31705374882f7c934ecd3b5e82940591cc2da5136b726bd97deea59d
+b5951369571544034f93f6e9e9bef396feae60a5b9c3456da1182921d60f
+51a03c79c508334f1146b564507198b89948780cf4b60418521ed73bbe7d
+3e228dcb5a9c016f8058dab9750074512ee3321a1b934119d8b6bef7f816
+c990fbfb206a15a63a5b88> ND
+/w
+<10bf3170638a0228cce16401e2a1320493ec75c1c4d2465d588dcde2174a
+6f5049d20d2b454d3f053b001bf9bfb825dea634ce9d3fb5dfdd04855e7e
+dc0d6e4dde355956359d5dc6a40d2c9c8826366d53049d947ee8dde95074
+627941c33de4220aaa3a8af2bf2b00299fde9211e4d408bef1eb22bc89d1
+241b0be5a1bbaa> ND
+/y
+<10bf3170776bfd988a56ee8fe50a75c214c009776a321e560c933ea18fd8
+2d83bbeace10512da5973877666f325826dc5af29e15691888b572f52587
+df0337c16f0b24682fde99afae5ef409919e6bb4ac7d35dd8790071ba79e
+f7780d09de33b41d6b48fb9a59a16a0e5807adc0fa47d6b5e690567815e0
+dc2ee9936d7e839639b3888218268a73> ND
+systemdict /gcheck known {setglobal} if end end
+end
+/Times-Roman findfont /Encoding get
+dup 32 /space put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 78 /N put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 86 /V put
+dup 87 /W put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 103 /g put
+dup 105 /i put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 119 /w put
+dup 121 /y put
+pop
+%ADOEndSubsetFont
+/Times-Roman*1
+[
+32{/.notdef}repeat /space 7{/.notdef}repeat /parenleft /parenright 2{/.notdef}repeat /comma /hyphen
+/period /slash /zero /one /two /three /.notdef /five
+/six /seven /eight /nine /colon 6{/.notdef}repeat /A /B
+/C 4{/.notdef}repeat /H /I /J /K 2{/.notdef}repeat /N
+/.notdef /P /.notdef /R /S 2{/.notdef}repeat /V /W
+9{/.notdef}repeat /a /b /c /d /e /.notdef /g
+/.notdef /i 2{/.notdef}repeat /l /m /n /o /p
+/q /r /s /t /u /.notdef /w /.notdef
+/y 47{/.notdef}repeat /quotesingle 86{/.notdef}repeat
+] /Times-Roman nfnt
+/Times-Roman*1 findfont [14 0 0 -14 0 0 ]mfnt sfnt
+207.939 50.2998 mov
+(Ribonuclease P RNA) sh
+%ADOBeginSubsetFont: Times-Italic Initial
+11 dict begin
+/FontName /Times-Italic def
+/FontMatrix [1 1000 div 0 0 1 1000 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+/FontInfo 1 dict dup begin
+ /OrigFontType /TrueType def
+end readonly def
+currentdict
+end
+
+systemdict begin
+dup /Private 7 dict dup begin
+/BlueValues [-15 0 600 650] def
+/MinFeature {16 16} def
+/password 5839 def
+/ND {def} def
+/NP {put} def
+/RD {string currentfile exch readhexstring pop} def
+2 index /CharStrings 230 dict dup begin
+/.notdef
+<10bf317079bb21e4> ND
+/space
+<10bf317079c757bf91> ND
+/E
+<10bf3170422fec138c7230ff7e19baeab789ca5bef7c283ccb09551e5920
+152b68f4ae9202c0b3dc9ce436192c9236bd3660f1a4c31e38f86b098ad4
+0faea873d69e67fba9e58ca6cfef84d9c04bf5ed0211af7c47b992754a0b
+77dd10b8c2dee46b4bbd80a3899e09c65b8aa861d24429fb9db82951837a
+3a1283595735> ND
+/a
+<10bf317040c2e74a508d6139dce14e3948d239d0634bbfaabf9e8d3c7573
+ed6fbf5dbea53ff369f531ee4a35d5d774411d751e898d06a82fb104c24e
+2e288c130578a51898d70e768e70e25015126de9836190adddf115525009
+d0b5cf5799cade59015ed746a61eea4e41b65101d4ece488aeb0eae27176
+fd995d93360fcb186f66fe5f540946011237ad8713367061b7184db6a67a
+996b98e53ecb5c8feb0582a80d88d56027b3ffcc55dfb4dc1ac3446fc8ff
+d6878cc714f800a67c3909395a6179cde4244303983fcb7be7e1a5e7> ND
+/c
+<10bf317040c23fc2eee4f57240df62f1391a1250ca71eb42052c6832a234
+04baa9e4ef1dec279a752431a80f654f5e0351e445249e6beb05a973cc41
+d8ead12d95f7556c161073e2684409ef6f29244cba09a6bb43b3bcffdfba
+d18d8daa29a3daa3e72edebd8ca6c6c1ffadc0e7cfd675d1eb71cae83aa4
+bb0d1ad30e10be4b78f720e6585f94cee8adb3f7cfca78> ND
+/e
+<10bf3170422f4b41880651ec3b4d2eb65a011be62466a01dda4961f1da28
+4c346a77169bc4c4a7ede011b56ed8c3d1f00f116ed11b99eb4b26ce1c6c
+5397d8f41586907ab2a423b80824b99dfa062fa0ba9e37fea1ae4a5117f6
+72d95befd94dae78a32300bbe65f34382c0e9700cfbfa7edeefaf81da1bc
+b5d10d3e54194c0dc1ac22d93bd61b9e6bbb3969e1> ND
+/h
+<10bf317054a23a3555fb5ead131bc59828cc7f1eacd86033cc680ee8cbd6
+7a73727285e80cbc40f01dbc40114116b796f4f49cc581dd1b7f53c5108d
+be6d1077ff4095e8abd9a2db119ca521dceefb8e4db76cb40c3c2aa5db93
+42df5f61b9bb5861f54e93f8082a054a7e07b5d2512f24d8cdb5ad0ac428
+d185c91cf0e62b83c527874a0e41499f1504cd67f9c86334> ND
+/i
+<10bf31705c397059959e269bc482cc232fb2cd355b1741c991d08977a1c7
+62a5e2889a63c2e040e22ffbaf41c04400cc31c3de7dcf350f3cdfb3edfa
+828dc964cb2f6eb442e0262df25f627edd720f9619db59fd5a8cd100c968
+4c5f4db9889b35c63fc8c08e> ND
+/l
+<10bf3170599590e4eca19c589f591b28c79c3ad915d374f9f929618cfd7b
+7292a0b167075ca805f5ad895e8e3b1ab4dbdd185639273e5baedc164de3
+0d0ee9bfd604> ND
+/o
+<10bf3170435d457c3b609d0dfdc745bd7c1663c0a805d91da8e9d0cc4d99
+e22f87ada7af2132f6337504f703ddd93c8cdde4699cbdaf64ef14809e56
+7a42bb836080942124ca1aef0e63f807aefc933c8563b48027e9d8f1c1e1
+8352efa85eedc9ca490791a4e46850c09204d72255ce696daee7dc1a2862
+811f44c6c89facfd801c3e6416cabfcd> ND
+/r
+<10bf3170599a5b3c2e2dd28b3b10b75075330d11e34ae538e91b40e1b802
+82d48b2a59637d6e097ee2f6d5ecf0c595e0fe2ca2c786a62d5a15f78248
+8110425023e201d5535dfbe489642fedd613d0fa1856971b95976bddeb41
+6a333657ac733756ce26ea5bc0c9c1685f2222cc6612850d6389e5c3f1da
+> ND
+/s
+<10bf317050d9b8012f166408318a0ef0c2b3fc2c4bf046f43a31a13138cb
+3edd33b1e05a71393e8603bde246c06cf021e377498e36cd112cac2862cb
+d733c3012351e466a2c60874be76f3ffb0e88de0326be4951815ceb6e2b4
+a1c764b8b4750919db41ba568a843704ee79cbe791dd797a967fc4bf780b
+33396195d9608a7596aadb157b1c31c1f97e4cad9c00804f33d10c4f9e5f
+1e6e986043994c17686677d39f7196085e4700caad44794150> ND
+/t
+<10bf3170524a2d224620d65b924216aad176698198f7dbdeefeee3b7e580
+1e8252c00721d9a34af4c93982914cf535dd1a9978155b129f9b67696bf0
+657d3fef2c6bfe965ee59c94b9f93fb72b6a44> ND
+end
+end
+put
+put
+dup /FontName get exch definefont pop
+end
+/Times-Italic findfont /Encoding get
+dup 32 /space put
+dup 69 /E put
+dup 97 /a put
+dup 99 /c put
+dup 101 /e put
+dup 104 /h put
+dup 105 /i put
+dup 108 /l put
+dup 111 /o put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+pop
+%ADOEndSubsetFont
+/Times-Italic*1
+[
+32{/.notdef}repeat /space 36{/.notdef}repeat /E 27{/.notdef}repeat /a /.notdef /c
+/.notdef /e 2{/.notdef}repeat /h /i 2{/.notdef}repeat /l 2{/.notdef}repeat
+/o 2{/.notdef}repeat /r /s /t 139{/.notdef}repeat
+] /Times-Italic nfnt
+/Times-Italic*1 findfont [14 0 0 -14 0 0 ]mfnt sfnt
+207.939 64.2998 mov
+(Escherichia coli) sh
+/Times-Roman*1 findfont [14 0 0 -14 0 0 ]mfnt sfnt
+299.316 64.2998 mov
+( K-12 W3110) sh
+/Times-Roman*1 findfont [10.0006 0 0 -10.0006 0 0 ]mfnt sfnt
+207.939 88.2998 mov
+(Sequence : V00338, Reed, ) sh
+/Times-Italic*1 findfont [10.0006 0 0 -10.0006 0 0 ]mfnt sfnt
+316.799 88.2998 mov
+(et al) sh
+/Times-Roman*1 findfont [10.0006 0 0 -10.0006 0 0 ]mfnt sfnt
+334.189 88.2998 mov
+(., 1982 Cell ) sh
+/Times-Bold*1 findfont [10.0006 0 0 -10.0006 0 0 ]mfnt sfnt
+383.439 88.2998 mov
+(30) sh
+/Times-Roman*1 findfont [10.0006 0 0 -10.0006 0 0 ]mfnt sfnt
+393.439 88.2998 mov
+(:627) sh
+207.939 100.3 mov
+(Structure : Harris, ) sh
+/Times-Italic*1 findfont [10.0006 0 0 -10.0006 0 0 ]mfnt sfnt
+282.439 100.3 mov
+(et al) sh
+/Times-Roman*1 findfont [10.0006 0 0 -10.0006 0 0 ]mfnt sfnt
+299.939 100.3 mov
+(., RNA \(in press\)) sh
+207.999 124.3 mov
+(Image created 10/3/00 by JWBrown) sh
+grestore % PSGState
+%ADOBeginClientInjection: EndPageContent "AI10"
+userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse
+%ADOEndClientInjection: EndPageContent "AI10"
+% page clip
+grestore
+grestore % PSGState
+Adobe_AGM_Core/AGMCORE_save get restore
+%%PageTrailer
+%ADOBeginClientInjection: PageTrailer Start "AI10"
+%ADOEndClientInjection: PageTrailer Start "AI10"
+Adobe_AGM_Image/page_trailer get exec
+Adobe_CoolType_Core/page_trailer get exec
+Adobe_AGM_Core/page_trailer get exec
+currentdict Adobe_AGM_Utils eq {end} if
+%ADOBeginClientInjection: PageTrailer End "AI10"
+%ADOEndClientInjection: PageTrailer End "AI10"
+%%Trailer
+%ADOBeginClientInjection: DocumentTrailer Start "AI10"
+%ADOEndClientInjection: DocumentTrailer Start "AI10"
+Adobe_AGM_Image/doc_trailer get exec
+Adobe_CoolType_Core/doc_trailer get exec
+Adobe_AGM_Core/doc_trailer get exec
+%ADOBeginClientInjection: DocumentTrailer End "AI10"
+%ADOEndClientInjection: DocumentTrailer End "AI10"
+%%EOF
+%AI9_PrintingDataEnd
+
+userdict /AI9_read_buffer 256 string put
+userdict begin
+/ai9_skip_data
+{
+ mark
+ {
+ currentfile AI9_read_buffer { readline } stopped
+ {
+ }
+ {
+ not
+ {
+ exit
+ } if
+ (%AI9_PrivateDataEnd) eq
+ {
+ exit
+ } if
+ } ifelse
+ } loop
+ cleartomark
+} def
+end
+userdict /ai9_skip_data get exec
+%AI9_PrivateDataBegin
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Adobe Illustrator(R) 10.0
+%%AI8_CreatorVersion: 10.0
+%%For: (Sean R Eddy) (Washington University)
+%%Title: (rnaseP-ecoli.eps)
+%%CreationDate: 3/27/03 11:44 AM
+%AI9_DataStream
+%GatkKCTec!Q)=A*"8i[BJ21MB`_sf&,;];C0"8GT(fqT`X*Oc`0I#O$'1J$5P#Bt-keGI8j?A>88QF6q1R:V(ZS-T\=R08])mRu:
+%+8tC>YJ,J=T>1<`(U*i7Z\RRc#YTPI6[:*Wna,tE+8s+Khi0QZn<qVN)HT,4I^U<<qbR7_<VuX9nac'c?b^@9c'uItp#=Nf2a;Za
+%`J`ILp#Gdrp$1XC?N5fNig]K3H)n[R^H_YTq3U-d:Ohp"7K</W?b`]rT!sbfq;&))lcY>"p\V//qWc&kdJs5,m*C0prqTXA?]8@*
+%HMqE'qbTI\Xr#QZYM8m92t`+!Z\Rl0a4Gh>ZG$%EO5FuEU]:0`hLBU[Zi0^rjnIg&>6^,r$_Hd1s7I0M&'rQCQKu:-s7(<nMs#$8
+%^92CH^O#^RTD6g+s16u]qYTe_]t_D"3"GueQo?+93G/6d`S::?4FHo<5JI*<_u8`skpp+dF+(*.U@@s at ra328\%dFOl+`hps8V%f
+%huCfjj$S.6p[e=V\%hPTnc"*F4QMd:j5UrmpJ,\`oQ?:Vi?-(+?bNCVa(8^o.A*^Qkudo]_p;+#AT"Z3ERf&S=HEBaD<:<4%i..=
+%Gs;45A#OggI[nu]^OH(WkPq+;.j7)m7so^[G@/*%YQ+F[F,fA^g2S5/hn877`I6Sa^](8MopX!`DX.)qnIpDNYJ1omELBl]^38.Y
+%p962Gn,;:u?iFF*Dr^M[VZRuirhls>b<NZ9Qg6tfRMi>Xh40LJgE2H[4iI5NL#l`9+&1A9&cK:JIQHiX9`,Ziqkr&l^NfbKB at d.>
+%%4V8O\+QflqKJ^JrRjtlSIrJ'm\ca at IGd%hqu'1#pu$ooH*lW3qYGL;@)cDuf^F;q\,P([d@]I`cf6$$?>n_]Q]JTT?XEH at J+]Z0
+%UPJd2(KgT.SDhGf0-9$LnB:JGkPY1Wa-jVIptbOW1>CEa?ZV=4J/'^$iU,s7a2=D:o_\NhM[,lk_>j5`huE?3rREoUl_i^Jj_#+U
+%YJ77ohu)Uq&'Mg_976H.+8u0(EI#tcZ,rV$r.3o.TCq:J<YNX%@ej/1+2W";I.1KloCX+9aqeJr]#.F;`V at fP\$lmG=7PWu:\O+@
+%o at 64LpXf;o?Tl*s%5Xp&rqQ$=5C)22rRK(-Is^Bh55Y7"?ZG>jiQ$HJlDqZSX+,ElnDj3U:S.Ors3B6Ra8IV3IfHl9Do\2_*^HN&
+%YJ5Ae(l\II_o'f-]Qj4BhgP*HBo^g&nEP5Do;f'%]_KPD-"hNd'I32<S)8V^A+e%.0E1Z0nA5,_mMF'W^\cUR2ns\<f?o*Fr,)>S
+%_lPNJN;Mpb8H/G.04#(Rl?_]e?S^LlT"c8[IJ)auKkrs_bBMk at _dB"EIshWr5-0f`rSke at fmc$=4TFF&dhgn(r:/a,=R2S#rYVfQ
+%EMi&7rr1C@^@dule\`L/prCo<r%[9_&-(n+^OQ0hTE"T[Rm6i<X2/MADZ02,p:S0=bN$G7aEL,eUU\>6o8bKmHL&="IE(#shnQ9H
+%H[X`-^Mpmbg\Uj0>>OrL8fm9o4ktP%ho!4elU6Fkk&#Crj79)qH[>YPVsc:2`Bt;B5$PAnrorGLr:$Bo<iEk*=\/AbE8'd\L6=cK
+%l0kdkG^/Dl*kqRK`P_I$F6n[cheMUUY5g:QYP@;8L\!N5I"+5mWGc-.s/Y>%0CI6Il)-a/4O*otJ,=QiqNh^Q8+?(qmJm/uIV2RI
+%0?'cDWI"h at f9c]h4et;j36Nt2,O[n/mB\$$r%s_tAVI at CcNn$-M4ZBqiS./+m=']PH[bnlE:87eY#oE-J3,_/\+S_7G96\@PJ8<F
+%k*S:Pk=dtElIZ1lmNDT0>^&4M%d*36Dst%3qY<)Fo*5\L[&WH:2h.g18&&C1pV2[=j4V&"Y?lYMn;*;&G9>[uOcM_Vq]7R9?higj
+%ht$/Yh`cDs;VZbOGWs10V1A+!?e0]IVh6]"jIYi'H[,:uf85.3pq5-25CZ,kWE at UAg\A75GL*q9bPAp7_NsY<*!79iN;KM[E]5(i
+%R,N>\p?A%&?Q3p.8)N0QIJ3X*H2!7NEh$e4Tn0$N]_)HrH(!]j`pTZc^&)`,KpT4&5PP^mrUsZOX?^NFGk:V(:sV'2QYCng+1Z/l
+%T.Z&Z^NUjgS%h.Gf<8Q;#P[iAp#R!brFN?c]hU]h3nj9"B at dGQ[su,nIsnu*%tTF=\teH#c[UZ%IrL4U)`Y"b!O!DkFi:hqV^m8j
+%E&S=-paJo#_\Krdd/>ARU\1fD?iBlFGL)jml1%s:j5D)0FZAfAou5[0+0PY6h>6tjrS)J%qcf+gITP)Xh8,b4o:.>FcM,l at Dm.=l
+%U;OI$"3q;KMn0uK_uKGdj*a&7qtFE)!hMO;6QG6cT3YOlWqQIDiVfAdg5e_sdt)rIOXI?FcLg26n%\>AHtn]1Dt\MC&RhjZs*,X,
+%qc3LQZ]Bk<DOj"W04Od=(]2VWanMH40<WVUZ-OKYr5gsk^@UdalR^XiV2+ql/d)(-:OVdh\+.b=K^1&3_R"IV#7cq^50VKBnJ#ft
+%PN.(qaq#:u[.sX.>fZPa0)+tH:C[03,:<![\$'`Kl#K86p>$7P_W/rqIgFlEj2;#LV`p(<4hENDoVn&0kN-T2q8n at Rh>Ni10-;b2
+%l.*g>q04:UDtW?"#5R)%k^3GjcS'KhK%iB0acAslj:1JAh6VllO67H at H/44$q/-QN&*r7;s69JE4T++X]q>?!YM@%oAK=QFoPf#7
+%L[X%;n&4[#efXn^HG''3fB;+Ch)f64eF27$e0il3'L'0j+d`)@[hIVD5B*75SbL#+!I4.V.pOO9m"<W6E:KjaZ@@8N(SkEJoJDZq
+%qmS;EBCC9d.A-%eYBRm1GM1b_[bp]Ia643YDs7&5pT3Ql'D\7TO3=;ba2=1'/tM`sO3_ioHs9k>Fg^Zcn at _bQmEbd,q0kPmpGr0T
+%\3BpUio]tglW=,UiL6BFqNk!\p/BGQj4XlX@/T]ngCIe=LFPO[]tsPR7spi_pCR.BC[o)j(q5h.I=&iskfiPrb1WA7o"rj/pESJ6
+%lYA`VEO^BO^Q7@>re2/,]pO_k4J*_:du.<%@.f?S?H[bmSq=di:WE!e#OaAsIiPc._Z[.24iS4blLd+/`<V<G5KR4iU[u#=qOSRj
+%q`VSNQhLRr5P:KF"\en,&tU`64U_*O0g>F)mB_kKof`"tHl^PI'?m(3$5r$ho=pdXI!@%)puV,!="p!@I/WX'gK.b5fDiuFMM4i7
+%pnClLI![U5lc2e+R)SU.^Mi!AYO2GknWiuih\h/19mEiY+0Y/0pkMok&I4rTLOd+Qp3o\!q8Vl-I5)e^fG09'g%>itiUL\ZpNs0>
+%%g2ZQZtkaUeVUg9n)G)G8^P!8!'.0`KWMP1rlor^lEcO/inqLsq$f=^h8=s@?LfpE*l@^JhOL0ckKTp.I.'Eu8,C'2+7JgSj-j5!
+%G^'2?P@$F\Z"J;j4.k<DhgP=^S:?"\qY:rrBCetl4bhuUoc"L$:rg8/:BssmV*oZ>R-tL]o+-H at nRs"8OWT(1Iub]OfQ]9C2qRoR
+%orB5LS%>hEH$K)R-U7Hlrd%(eL[2kH`/'HkYP@\ToC(J.=*/(0mlie^`OWbFI_Qfom0E1NSWh/6hVCEmGRm%.TguE_*VK<t>=[U5
+%ZM/'(5$#\lYQ'5%G//T('&V6S#Cb/2T<S2OGPq:9aQr!g+0Y+S#!Nsm-R8Beg\NT/O50OU#lF,J*VM]$XD9.8CjM>_5Oc,&n6m'S
+%h\$.cmGf"3IpMpNb>J;W&,jPhIU!HZF<TSq]C4YUjX?0%pdqK;BVONGD]XB*kFXHDp%?:og,C\BJ+Pt:iqnf:q-DgeaL*43-QnK5
+%h(E&[4Sq:]rqJuij,\X5L-ET!:L\'apb"l1kitD3dQ?<aDngaR.0(8nI<A]>a0_2cHZtL2s#aWK%uqtYrrHW at S%A+`a!V5md3*1i
+%>h\N4?,biE_fl7--h_q;p%d?tmpO5s*IL]Q:KZithS8jAV:^j\/fsG=(QS[nE>4FW7eL[APL(BWA<3M[K9>NR%tl1Hji?07LI1[S
+%FR?ttn9]3M+Zas=+7k(+R$8*npL5<75+1I2jR_h)qk"o#UCU]Tlr3iW+]m#o57TtTCJE!#L#q=sHoUtNAV4(PG45V+lA;#nLSTsr
+%'Do'&@H=ku3Li5SrQ)=Q^@#c1q)ClLQae&]:GJ[[O&F.]C//99A_ZBob[iHtkktd&BI/A/T1 at eJ<(lI[9ZLghhtDJOI`>LT^94m2
+%AKT[jq(*i\j&efE.3'f)ZYZluHRa<l1rjosQH"3'(s`idfIJ$pSR\bEZH'8+ at pbRtT$)C#HTm`?nB9U1/i\nDbZO"4(/?sVZHXB;
+%a at BS.&[uq:[-$u"JOWl/1/hH/hFk%8p)(<QI9Y=*V4A.Cg1E<:3bCq+aT/HFbo'$3r@%JH(n-'je2*o1DYY[h_6!=bo=!5cn8<NN
+%>@Wck884<Qc^Kl*L=u:Mp:0Ltc]+W(O6'W,Z(,#<rS3IEQXe.O<*JD(R)9PWC1ZXP:Ku!?>aD\8rJ[`;HlUqmIV_10[*E_,/hHE\
+%X)kZ.C^3>>T.:!Wp9Vtde6CalG8G91@@7O at A&?P:cAgl)>VhSPbQ\Y$*$R$UNAL#D94/%K2G<*LcW]WsAj"[.`nGI8#?J(,jX=\n
+%>h^tH at i!hUh':n--W@=(Z1l=Y`"k at Y:Q6UkdE^D,5**4\Fgc=l)>hP]p(S%(ph0$4OmU32\*L;r]]TjO=PAU?S.,"WqSkP at 2:RWC
+%qS'$Nr&j_h<6SiT6>VK/\;cAWAP=R19Fip2>Mmb3f!:nm<T_;.[UmQlX0Leu$g0X](?V&TfZ"dGjBe4G]$Ge;WnWq:r8MCL6&h>K
+%hBJlcV51P:>OH:b`f;@P'q8k.-C<?L_6%YA;EDP1YV-tMYM?ucD7$aqD8T)W"-^f.;/Y^1N$X12NAJ6q6^&bdgT\%")kGV7^3X61
+%!C*N1POC&TfniAJV1l%D[ka<<M]I:<UB_!Dh>$+mc9*;K>j'M>a>ladla`V>_iY^hX8s#N8IX6+AnV,4SoAK`>8Z<Yb?0fMa!MQY
+%k'C`d_N&gDbboEa*k7A2(-DdX86B-c>f+<qI<$)"`%:DY&9/)tL.d@"b0VnbX^aZU9GNp4l]sR6LP=:Ge89sg*X>G_N,9$ehY0-R
+%!M7jop*Cg8EpeSUghmsOY5o=E^`=9!E;@W9jP1sAL+2+m#6<CC%=R3SN[JEY,G,nb'^!gV".6O%e;C#]UPE-E8fNDiCtq/B1<[8h
+%/IV/H;EEQ=q*G)Pg8n_59arUiI"(.H]e*!T,IVtTjZ#d5_e/7;glBo=Nb<"9f!]X)k6=Gq%d1XlFc;@(L3;/b*L'F;8.(P8n<#<0
+%Yh$PU5[V[d?,EB3(!#MuT'*t(Q?@/h'AtF8m0gtldTSTlX!ZsdHhP.(`(^aCkmEf!0"($r,JTJe]lsJSLiH3@@s'W4\#(r$`u7=t
+%.e>cApbnN'jd6_U4!VWIhJH]i at G*ro1 at mi&#n0iqkIOZ"j7"Lq*m\]Zc9\+jS^ZZ,0>KI(@kIka?b)mgloX^!8!oqMG')YsH10oA
+%VX=990RiMFOEL7t"/aqtAV2cGg]IPZ9`-ogi2Scb!'6LZ'B98d>0LAB>eus?K/a^])1$.BXPD]aQXHjONtqe!a>JsooH.q%9T87?
+%E)V`VK3m>)gmFPC at 1QI#?JdKo=;HDg+2]Ee;;bhWL.2RonFsr=Z%u]_%KQqE(sB at ZK[-erL7p;QQm(nA`,:s\MF$Wgd#)m_[tF5%
+%ht&<?[t)A82*4hq$4`OC/*q0p(biDAbasJY at T^Q4C>`k.,G(`?N&-%a5erEYbd7QUpWBIC#qZR%/63a0WL6;4JR^8*Z&D2A)1t&4
+%o`uOilTG$`GSB0o6]LOM`[:njS<;+I\/bDg=2"\\_!"n`d'O_MRu8HVoY)]7 at U`=b(eik#=R+!e7KocJiAaj=q(\0;P at ED7;J$e9
+%7\\nin?%Bu^)5pkD(])L&dTX4oEOkAm=^$#K_N2O5)>hCo8/)&7BC<@""jU7!Jh,=W;N7K(P#]mrP6uA0Q%9>"<EA0?2/kYDTfaq
+%DAm?O=t5i$NjT>qfsm9R!4M&_5gI`Tg:<9YbR15ER4sIp;^qK>:'@hli?<?&*BRO"/a'[o&`O*9"!qlL8Y=65ak&X^kfc+02>:\K
+%.r]d(5R<10,EZMP$^7-S%?mI6p*Tdu&d/dn/OQ$PHi`EdJAlDF8d"e>PB40F+q?`]+=F(?-uH:j8-?'I=l=pLX=6GjlERG^$7m^r
+%XsqpZ=(%_llbodmMaiA9_A9YFcCK1bFTV+ML@@0jB-7]:gFscp`XtiRFg&C>!b&kREE-Z_!7MhG%;nuG(>'`H_Lu!883.DpYO';)
+%&D0GnB,ZoYAbd>Ke-gn]P;@YBE!nB::',uYPh*Q6>k`bSEf6:q#-oP1)db[_%ifg79ZS:9RdJm*!ldOE,)?Cb*O)!#42rE\9FMP0
+%Qgh)<e3Tnl%oI/Y["]D+c%JrK]RY#I_8Yr?_/OR1>rm3]^c!aQ1U(jF+O>'1-pcuQ']O?=WM)?T/+.PBX?a:lhWGa"$=WCVhk1Ul
+%"q7`=`sG+,J9$26Uj[au0VSU^Ws=$&J;V*N-k`e:h*XM1`X,%lF5>e)K6c+o0NlRJ<<md,jfRO9=<1?kj1S)K'6Ag]_A)K_#+oi.
+%J>mP>!=so8oQ1jg(42#<Mbc]A3h3s;054"SaTlTcQt?$t6\^PU\!)AsHE9rK^<\jL%XR,^nA6D.VQ(1B6l]UGFP4A/E]m#+`"ttf
+%+BG$gJk?;Q\_@*g?@+#pXY:bbK'5XjN&*"-5>V^r90-G]8\MM`n9&\2'C(+?$3?QN,.nmQ<=Q]F%D]_1FZhfVR<m>^!?N)<JS>.%
+%Li[4X5`,A75/Lrc-1<6?oZ!$6gu5o2]3#BT!uZ\Vh=)rMV8iU+6EK4Q=#F5CV214J8H(*ILlZCji:@04KLnjhq"9PMG0CBf#&nh3
+%>KBqh_Zr5cAj>iXT]'eY8u<-i!i:D[T<QLZjpoQ(fmRJs$FdZ<E8TkFN14j@"_!$kEqfl(U)i2RT[sJqm>U?;q<88!'AsnPXu`6c
+%8cG9#[4hoEEsFWHdKMQrJT,\SjB9d_&eU4>O5T)XCFTFL4LclJ!$Z*s_/\][SAMEJL2ui/1'#?IONYkm_%.)$-S?E*^S;bf;&?sd
+%NV>#s3NSl)KGA at 3-]G_`D6o6eq.Aaf$'2#,W'BJ(L at GbNo?cb6LdX`I*VpCILXmV at O;,2gUBi%mM9C^JW'D3kM*bZ>&9gUp99-lT
+%,<39-/Q^jPMM*LsQK7'&:%#Ji/dRDn_Cp:lOTP#Kcc"SX2`%]QlAL`Sg]>!MqsK,JPh*-W"=<-uh?'-%mYVPl%+GFgIM*7bga9,>
+%'-dPr7hcqX\nt!j4[SX.,`El/9-V%04V?F'_STGsA%:\.2M9ONV*jQ6E3=mK#o//m>\aMYg&\]n*J7KhbWqLj&u]6?Lf#R(#3a*N
+%KZY9C(`Wi=^J04[7*6s/**qXnaHfS#n&hP_3!Nd\;XOV%7BgeR5)Vm@>Yf&A)Kp``5\e:F]cb#jUI\IgF+qV-7[R=kN0n&k(%WsU
+%iq$8BKQH(V#a0gbah/dI35c/uJR/&d^p2L[R=ZR1^fh63*KtOEn:X&+6>LP0?(m8N6Hrd0=9h[,eYJc\X8unU!hs7m'mBBl^mm[h
+%"c<kUIJ>LD:S%_tU<Lu<!WOM-@';sL6P7BC4[MWg$3sZ=;2(Xf'ul3)(HcTOlo8ErIM)&aH,d7#pOqR]DQ6(?BQ-<lme^%Do,QVp
+%JTXO'Y(H(pV!gCMUd8PuqOts_(N+^fG6lXM.*"_m1#i/<@=CTV^4!k8 at JaKL+'-<r'#YG'D0LHf.(Cc-Kd7jgjlNu]La%G-8-.kl
+%<47K?JCWTNfHSZCVji?_5]InL&F:AI;dCV;>JX:[-TjZBT8j8Gn#M>7i20p<cq)TEE->q<#TrX*`(LKVBLhu0&?tX5<J$)pVK19^
+%'uX2pP+Y!@&@U%2'1=2"'5$*`lEL*oM$8W+Uc2BYpl8K2^WIkZKhQQI)$b=3G)R$CA^1TFaq;iAYOf26F:qrBfRgYS/OgV=YC,G6
+%4&h$o#p5>epP[BB^]T/sWW>A'#BCF\$ihLq35FJK>^'[Sap-,Re6q6dYX3d[C7&"`?7rS0EJ:lEBIXo%2rPl at 3e8_kVTOdbj<G[2
+%Nrp-lCW at +STpJb+J.RAo#0,Rdi$ajWMm5VX3e0X5@"pu:1>jGlb5mS&7VFa$"e8Jn2ge\8]#1.JKqKjDN.Ka[>`j^G=)G6[b,""=
+%*F](g&*]gh\I!E^Zea!!>gkr^/1#mf7?nJTL]@]M7L.)BNKa7WWUQDblNdkgF$XXuh0@\B5iKjO$![0 at Q]OLYb_N\:XbSZCGWF^j
+%3Phnnj'3:pBqJ(Mi-Zde'ZpRu6m!QB_1r:0%F*7J2HTrH%h1*YV>XG6(9ZA68EeV_;Shi/B/n;9#020(^*nB%'Z#`hE&JgYH%JH#
+%GZ3(3JJHPJ]-aP1I99rk%Z-3%jsdngfJ%aU9^OGV,j6K.*ID!6*$o!f'+%)ih"]+!EuB@<KmN0l5R3-T7KiMN:=+Ts6B at LM9Tkm*
+%*'>g?+YIgm(It-ubUX0lGK#IJXc&u1e;,+Y1GOD+g]1EOcGhHpm^pXDL]Jb=65SV5382BgM/=V:NscKT,?u<2O=j'6Uas@>#pL5H
+%:38]YDR0>d7#(+bEBuO#(iLPDK1cM#8]2tl6G&qM<>XfOqWO:(=!=+g<#cfi_u#6#"7JKAQ'D(anPpKQae<QQ<2SSG;8Jf[QNp2+
+%^5lA]X!/RXAaicS&H[5cGnFF?C9=Ybgou!e_N&OGCZ^5^,82O@<"g<dNm(0%5X)`g-3nYk at mf_)[\:D at FR'N7/8RtHidpkk^[5\=
+%4NBm$^gi(a(XNgs,rTG?&]/e&6o>1+&PC:AR,Sj6hcjtgKXep.p&tHR><uZ at 0d2CtG"+V>%oCM$k<gl)!t09\,@/]IG`0R>Pe-:6
+%+VI$Z_j0>kD89QAoeLN74)Y*VQdUHm#d_K<M10DJkgUK-9/fBr`#h>KLHX41ia+8"j0j(I5lj=-&>FnR'1&\a)=X[ZM7I:/Do*/2
+%#mDplm3?]b8M1pD(J,PXh6h[X!CL'PU_Qd!%"h,&qbb]I(cl`O at ."/!fAR8^#RbSuEI6mhJg at o;q?g#Nk])E,6=HQIKH7imJI"7Y
+%H7Pc+%:J1'g!Xc@\Lgtk%"?$'TH1fW4NC:'/VFEWH5R(X\qX(D3^BE5:72NT#)!n5\1W>$U#MH5i\GpIi^X7p0o5m42JXIDpY[X'
+%1ntbA5mK57Q%<Oh'`cL#bU%?7*0:2?E>3Y+$qBD0S\a\3(<)X at 5YM9#RP4rLB%iQY/?f>SP;^Hd?qUU3af\LX1;I/H85jQN&W7Y!
+%#1Wm2Ye3CJ]]#(dAj3OF/l"^87or_;l'#N3-PCD1]8.$NF>%u\h/.oh+:4E$9PT5kUka;Im`\a-Gl,X6G:8?a%&)D&0C[g5o`:".
+%PX^7VT*7bT>Ip&i0aip[QR'klagMLcE+@*<1n4ok"<\&gG[,'GaG&cocGAth`T+FXh>t?t/O at f\!\h^#X;k]KK.?q1Dh4Pe;4GAK
+%Ck7ETEq+Om$=1L#+LSWbV/Jnq'"][:5hY:7$Ff3`"QR^J%icXiHS1!/'D_^G6)FZ?G[6&%5b-2\-NoO;SHH?U4:nA#:^"bMY:*A)
+%bVd7_i;'PG+I*7tLeNI&?UAe,"$n72L%%g`4J==QF"W0.0KOZl at sbLS#Y<V>H#6mIXW=llp$@@fEEUgL1YD,T5lk!Ao/iC&@t_`/
+%G`rE*gr;OFD4mkJ!/*%p[6\N"4>;BLJnf>b"Y..uX<V_;l,6QK,C&k>o#q<[+acZA3f;\Z/]8<cA=XH`LDN5]K6/#1KtO1>i@"^`
+%/qSFo&(3*CEf%Ef at jTc:baZa8EIE]QBP7D62+pbo\?)W.=(MjRfSop@%^(5Uc#&8'aJe,g]FO.jlrG88O1:c!%mu9X3!GLi[_\]N
+%\6j$%DVPep"MCPU<;2L5Ru.=#e.EGI":ds0PDSp?oIrInqgr<&B`i*gYDVHO7#b#G6K3U)JL4%t2q;nn(K;!`/tHCA-YrkI8"@L)
+%3k5V#TA9NmKKMp5I^C=F\@li>Qbm`+n13XP'*0fmHlo*%N=sBX,RADu3_FY/6#d;-$.j-I<T+ at V%P37:m"2P.+4`MYhVK05T_?Su
+%K=d;AOc^Mm%?(+cDBNtj%8tJZ'9]StNSA9\HsmGfL!]E\!&U?S4.-6C9Yc7f^sO:i"(o$X1E\D)4pEE3,o3;-PK8sM[FINu5g_BM
+%Xget\7(?)/LhEjm?MiQ38OOuEdYm/6@*3G%2\q0)S(>KV\.K#R?Q%&(nd0jY+QOmQ&@htXm"e)hduAHO'8Uol[muBY*R!/?Ooo4t
+%c#U<"ZL2t,6%!g/r]i.*_Aj'&^AnM$"L_/5U$t^h#.&hB7I4K)UO&YXM90-[/q`$@WsdE%,<?-;7h-C\7hjb:C`0WVe:O;J;]- at V
+%>cOb)Un!SRehK,9C'7^4L\WK=jap'WAW6H'3n(4>Q!cF:n$Wg_>X0oM_r at p@B'@#jo"t&35DC#F.\PT1o at 81i_6c)16T]',^(2$O
+%2hn6BbJ.;*"k/:[YrdY.-,P0S%5U7m`nd/9bcJD7J*l_+cdNE-bj#<p\4N(F>/o37l%CFddH.SN+AL3I:6+*3r!IE[AkG&'Vg=%h
+%1fmg at m(Am;7bPfhHWf81E%W]*ce[lo7_(Fe!?d<m`iaqU<O8Bu!*ur5#D#N+Anjpe\K<MpH$+bgh(e[8(K:A?B$^8tS3oFb0Ek'^
+%m"RAB<C'V9#cEH@!'a\up6T1m!"feXFc$1[R`g:V)_SfaaMW^3L+u6&b]?$W6PgXg!'L"-jVfU7F#6+#H(;fZ1c6QJ/=;Y74%%kl
+%;Z`%8!^Y0OXR*U9LK"@@lc]A`"@B<^#A#M&EgF9WKUW0L&!6fJEPl?['^Tf^2E1PuEJ,GK(HRHA$Lnu&\,fB<r.m3A2k]\-3X-B4
+%esAP%phq93Y1\Ne0_ak at 2#KYY$iH]IK>[t7C1[P`cPV_&],n@::`:>c2AdU86(&b8GTS))ZB4G8!Peuk,t`;93"Dg>."DO(_bdRV
+%*[![n')`8ie-%RX@)-"@*?g-pOubF$2di.Zc3=Uu0\4Dj&;St7iWc+6Qt;$o6]*WH">;S1!-O804]c!QfbMC06U>qaafW_*KE`)F
+%P5^"bc[m]s$aWr^GG09!k8VPVJO3Ur72*:G38JrBPm509%N7Xm-B<d^N.>#8i at rN16%Vh*5M&[&$`d7s'TPP9KcT8Eb_7 at Z+X>]Q
+%WF3lgd(<\1+p_gk`oM<uD$_Q%<-RaTYX$uGY5L,W<k?1r`M0Ko$:Nb\lS:H:SKmZ"IWf7H&e5*6ir9BRcnHTL$%BVK%i_*mJ/WHS
+%'YjOq0tP]V5rAq&5 at QZ-oU;<:"q,X_GeMTN[X2b_,/*O&-.*^+QmX$o$\8WN%Iq;Ji=<C?d"u_rh9RDL7X.'k^:HGQCc at P9b'#AM
+%JS64<W5P(,aO_#JGA./dB7j$keM/_C!=CLI^ft'J`8FNB$RSAKj:rJcSLcY)Xp)9[r9YlQj%aS[YAD8-0\Sm54df+V#nP'(C4jsG
+%KhmX8*R,#[,P2$B:g?>cgL:o"c^uKs/PsY/WRgA>#[Ys'A[@c^jMah%%2gs.[i5 at J<,Q4#01Z2++;;\)5\W)-!/IQAXqGctV,'t5
+%$hirH=N_ZR#e3C[i.BXHZ34]ij,>?R@[PMQaGGi`OiFfCHL5h(ME at AZ$f9/'@91jbgo9fV35BZYhr-nYEi]b\b(*k9e2lHGDkiOn
+%.3$d+l"u&lQK7Gf3=?E6qLI_IQ\j at bea*<E[i:sE=b[@5`5J3*XN+!e\:E>n`0,c+8LACV[g<?e8>llQXf(Ji'u&Wlp5oid+81qA
+%`Y7A7It8fr`F;;=F,:CMJ?1$hHappG)A05PE=/3:(l,N^Je]C[L06eI!<[D8W$u#/J<]R04;ge23?D]uO!&p_Rs5*5'3oH@"!KQ=
+%e'0ot#IMDR@*t@\+?1RSWZ1XOk$08P's9>e4h2TV4Eco%Jm2VmQj6-G(^N5(!'`<:#]>JI_,"HG$kmj9]B_JuY;f3N>7dFZ))AJc
+%'%>gV!6C)T at idobkh=SnoA,[62c.&#oXW_?HkX\q12CJBQlPOmAV&+n'#G4`2[o<;U+$\QEYNBpI)*!S-.'NN$TP8\ltJ3XTEP$"
+%^Q1dq]WX*cFX7sj3]jp^!4tb5iQi)_J.RA#8+RC__\OD<IV<lQSR;l^\^Io?P.Jdp&#mH7A[oD1)FX$r!>KMI%/bdi-PA+PBJ)ss
+%&FF at LFp.a&U)(5Rg#7'M-a'sm]UKd#>d0&,kdL_9!HiHB$RlfD;&hi<!Z\!Q+%S at C1hPWEa!ahLI:fE!<%Tq,?OUOBX;<[`\EGp-
+%irULX"\'!&*k*.5N1Wj?WbU;8:g8)*ESDc<=O/nqIH];$%UIt/-Hm%gH,#V[h$lHY6id<!&aQ_Se7hEXS_,E&Y+$^"VGZ3RI)Xo9
+%=81?tM;VPpKEnW9=05>^T:q/c2!/`!?9p5!.GV$kaJ:-ASFHf:4K>I8Y)XT;L'F`FCSgKQ7kuaH1C$`q/WdeHba^8Oqo#5gl8SHV
+%<\PK%3_P)]SuTkB^d4:92(m7.*O`7rKuQ..e^uq<Et,%Z&)\ak+1E>U0]Po@)AV*E$16P;`SE+1+92W6gG*@8;j`j^RM^e/aFeOY
+%.Df]j(*m".9EYN7#hNJAETKOs+rWWG98&B>"^Or/#\E=Bi6&m+:R#Za7]];AMI7c+i,C'K(WsNX6pJ0_nmlKAbIdj9M/PaFb22+0
+%7)2Lg<kr+1E-%Ak3OQ]6&ULup4:\1RDQFPls3T1[QXrl?RDt30j)m=@.`+%"E"p/?Q]$,*6[i9O^Mk?j];S:H_7jkUkTn	k>!)
+%4)kGM0o!O+\G-46bj?#B\.A]j=%*[\`8W?a]Qu#L\l,'F<riGGqZI]$ipE#`L<2btYuF*o,j`U]ba?:O[\Yc&!(Q-PM-56q"$j\A
+%B.-/M,F6_n\]&-Zd$VBq`-;nDEH(;B^d/BJ>6N8[V?^G8LMQ(a?caP'_SV<8%sJ\m&pt"AR&<5;CkGA("l1`@[]=.a)'bPF0ht98
+%WFc:UmXi4dM\aRV@/MG/:0c+_5OQ<SG/&q/Vh;\G/t`:J89&k`3miZ%;T!LTbLQu;].;<fF>eb9':HDlb4QH-ZBj8MLOc.-,M9X:
+%?+M at 9mX.,,1NSQZM]n`Q%7XWT"5GGH_7d?qCZ<:Xr%PKO-C+\e4HR!"$>^#W$+&d;&Z?R$=mcZOSBNdCEoG3Z`?=7=l894Hg]:dR
+%&YN1-&2Sjm,QOXmM&E)c;]!?fJ[6<u at c'e"h8FHBFtFutP;h8;:N>>!C5!oXr:U8+;JU6PB(a;ZbV$$#B#A-JLTOQ4)\9.S.I?>A
+%n/!lDY`dhT?q=;;Q\[j\Um[!I((r*NK!83u`tmUfjTPbgGBC@"YOBALc4Wil#)pAD,#<B+Mm/H%FbO6uGbmg=j9i"4FJ<e;3f_:L
+%9O8P'_<qu&[#)Ft$!au1.!BX7[dL:Rp at AKrYaV4NRM)jD%&.?A,aa734<P?tZ(R1%f>. at uiJiA?>JM7:B-u?<\>4.3mLH^6W\J#S
+%7_?*+E>qks1N1<[!!8,T3c<0>,`)PAM8Z?!'*L[X*\(bUXgenG$])gbcP?bJG=*^S6GSO@&iPIX\jcla*E_O<HjF1'cO<O!CnX"P
+%cnX+*q5hhofR5:+%J#OZD)[iu%[_)%3qWG?"[h)qiJ2X[A*Ci"^%\;IK6XsZpd-p`RB4[je12[Z>)=!*(OR""Ok at G`Tt!RC.0+4f
+%FeWNph<d#NZ$45#a&n5RTIu%d,^2BP#GQqZhS$J+#MO+aKKsFJ`du2_V+&^#(U]5GY.5ZDi-?/#`%/F?9X't'c-E)r@>0[qhb\[,
+%!4&4>a+//nrJ"oQ0>JWc>N!7Xo;3g".:h:+`d*<u%MLT+8VL2?^`B]i*s^_^94=25pJ-Bmn@;/C'4Pc.('A___f3KGn_+>f,`'#K
+%LH;Oi1_C-]9WZWYY$>F+7G-1mFN>GrT$Uk;q1K'_"oLG*=ciBk%c$Di*<tX77%Ogaqgf"X at UReZZR#`E\X$Q'QS>t8,L4#qVlA9U
+%m^Cur?q!(NaIcY#adFQimBkTA_,F's79uFF9EO'+"MT2P^s*/?&SR#A>un[Doo\>U&6:`2Ylc\V>K.?$J)EN.a:'t+Xh#J6?5o$3
+%R^*!s$eNrP1P[87Nl^l9d!=q4fI\>!#`@7Jrl%uFiY&W=#Ze+O<$.=s-H8.Lb0:P9:^C9Wg$E<_Nl/eXoDhqX8=>Tg]0+9dkNGB,
+%K(pQP!-&F$k_kcuA%G<[R1I/sM at 2Np[, at N6'Tc14!t&:+<t^;#'_!a5\s]^Pej29`I"kWUqp6B?bkD59"GFWp[8#e&2pi8rDR5R%
+%r%moOIdWToFP/c\A-'WdbVZa`XLKDPU3SR:/n(eWSO:4_kVoW2mr7?nS#:@;hlc-NQ5.jek`_k"]]'Y4 at J2:8H8WkW;/W)CREWc'
+%f2B[R,6?>6)I8lPAW(n=.(C;t"h. at qa/'H*Kg;s.b=%Hn<^I1LRKb+srWR at G%ml^XEpslW. at dR5RE?R#^ucifN\#uA\RtEdBeC`p
+%Mu_-O(T7r?"f=Q`TWX@\JAgNr0b<jpM%RZ at -SlnMiAC.0'AeO/6imT!p`o>CX)ENiUq:+lr(oG'MqRKR*i=-fRmd,X_Bn=O/\c1U
+%1VhOHT*JMq'k'Ds3*$'BBN0`f at V_hU+<fp(0pnSMqBD4;*`I4/X<u42:V6F)Ht+3ob`.25HJC/JVV'mp5\*ss-rW!/^rfa'JSnjI
+%R$gktD\rI`kfQX(72WHr=Drh5>FrhO@)2h"<f#FG(LO9@%98k%,pMj[#:#HFS=nFc=6##!MVoA!WuPbr4_/AJ[L,$4D;_U+d=`D*
+%f!^.bm;A&rZ,@)=/26/6`6X`/R0 at Iu:mrC[A;2Q\(IJZH`g)7EU9uSp>u$1_F at c<j2lO[S6AMsQVhr>i:r8c=4Yj9SrE*;_#R/;p
+%be[b7,^qBXq;FA(McXn,0A:E,/pq-7FhJC[?k=4ONTloDem-nI:PcD/iJY2R+.n`n!g/>:+k8>E-%lF3jbc1EL6)jH&e<1k7 at Pp!
+%PgrJS5R,^ql[c:J^tYQ53F]$0%9UjK5iS/_*<Wse$ZjLMDD at W)f+l"%qHi92h'tua1=>5hPmMtQLJt\f!q3.$LY'[FJqM2A+B6_+
+%9.[DS<McYr/5%\9hhhVG(",2"Dfg-L\gb at G'e^pS_.?Ij;Z@/m9c_-"Q<g*/XGK!bV'%qDGd#'"mNV+33Dk>Z,!fHeEeP)S$3D-7
+%M<@,dJ-`(s$`7]Uk$5Lmd:M:l?8_0h\:anfboWTDX;";Ccs0NU4k!+e7Qd;WDXbfEi.RKc>cjt/AfX.oQD:tT4A7"fGY91;\D8 at 6
+%cE+#,DAfEj191f_!1Sgi?jMRt"m1_^<8;S(5X5e\)1&AdRG`H8B4Cq]*$5je/AWSqE-hWHQklSpO:2R&cliL8OO9RYIQpO-O621,
+%HlG0QXFjr4eqD5H>!'_`N@:H=`lZqDatRA$,kEnK1?c7Bfb`u+FpLZT0)qXO?%cY+YJfjjbgM$B+k!/h*?(l28:4sgqef6q%-Cr\
+%P6$9- at 03rR%k97(iLpEU1Ebu*[Nu+l[g0#ANkhl%IIau*<(o7i<0!rts&tL:j77uDr)hQ$oatq\ASdcI/g^dt1sf at PN/P=5<a7DL
+%<b at c]U=t=Q_X*IZr$=092NZ58fAOj<lmb&[L)WF/QmAd\cBR:Zm?Ae+rW-^!'R@*Rg0'5g)[tfgP&BD(.]P)p^_YaBA0M<p=#oZr
+%2ichiJI?q*?us)UpEnmi.S"c$P^9HDP(C!F.`bkbjr0Yd"c&GeV3Ss['t]*eYN*3=AphoqCfG43f">7QNs+<B/`*l^d@;te1.7L^
+%+_of!>pK%M3YRsK`UXWUWQUamW)slEq+R7c4pc7Di>/^=ZAP'XBq?iFZ#LoiOD5LX;3f$P-AkF[O"LJ$8;pOiK^^.^/:l1#FWN/Q
+%Q?J^b?h-[>"?-fiF%i`RlmB-MPf0NYdjTcM<'fKs,oW[M=8\)j6*!juD?d5Gm8cd=\msi'JKeU=p<DtKPs/<.+u!XEiOic1n?`t\
+%*8i*og+J(kQ85^jEI27"b:$UpW+P,%U,-chpGjSs#J>3Rhh:^a;T3A<m9)fK(UkaLo"UTNS-I%s(dm)JL]Nc.J3nil0Sp%e4?JRF
+%>$kg268fVkT,uc'WjlCOBE`_)h2%B at rjLCt@RK>l!N`KG\ATN#&;OOoos=o7FX at Kgjc2$bM/e.a+\reC?M;WK9e3D1g'Yi%6=RY4
+%d;.!Q4Ta;7>!tCR[ZiK(b$<kj_mM7OXerr%@ui<iXq6!AjMD66c+QF%:NstNS%/XFF-p6fJ?mJZe=%M;+S_*S+Ilq1GqTOf;g?XD
+%)]G$C4$a1oQZ[Bcl[uFGY7-acHZ[I!F2cM.==n-.[!UY+Fh+jG\7jWp'J8_'I8n]ADN2)GT,t;ETEhB;=aZc*^0E2\gg?)"bE-5i
+%)=V$UL#`kf9n<bum5<O']2cj16)gl<G)5L2\B_qB%jlk.%b3":(n9X+k@*2Cq1e+-_M=6S=C`F+$fiaO)m+oB!2uc]/nTRtbcXRM
+%6F30*M=I/+aF_84aFL&'Z4f/TbV3K5r,+d/Sn4IGR+2gLHl]"?pl/t?=o^t[q,NFe$.?rf;uU3+pu97?JRs%:0]Ill\/nT at K]^ik
+%g5(B\g][IfI?,\)ck*QQk at fenPa+6b'?a*X^9_<G(8ncM;CpGcDPP'`p4/)@.tj$U!2kJ`A'!1el, at 3UV<++ddd2d7o at Qg*,4#\o
+%]3IC[?pu&:1hP?X!14gpHG"9cBb/*I8S4'#l-.\W)TZ0t$[NYC9[>k;f+rQjF>35M)$1UJ^q06!JRldC3_#s4[DQRh%@;'k:)aIu
+%-64V7J^g4?2 at nsMn];fh>FS3L"?i^h35ai/4YFWHe)N.$d2F6&a<4]4OZQ>T[t&uhL]lI at qWQp^e*<fnS2:j!/(>E9]]!jDi&7`4
+%l74IO^g'Wc)i_sU!2iC\[B.PhBaA6$>dYDB"]Vn'NJl?2S/Z`][MRFcIOt?Ui3?oN34J0P:"L`d>&LR%?AT%oZg%Po5N,cc-4l,T
+%mHNi(le,"6OZFE\Q8@`Lk2Wm`XbZ"K?l4c3JYAI.@@q2r<JGZJ%&@/V/d[1_R[.D+'YGruAp)X^D50\)A&aC&?>pP3$(.7?ZiJ_V
+%i:0ZmJFls*p09)]k9>!NYQp=+Plu0<C'%X'Be/Aar*4'&1rG$&Q2,%\*+!-s[qh7j+HOB5/('+QYGS"R6W/Zf,'YTg_Qd-e at lCWP
+%;s6(`\)Cmb^7,anWIkjYQn\XMVu[(]Cb_"(,W.acH8uD<DL&=J]t::kjMq5$bd5F4E-M!]k;X@^(Q=/SNSZQZL4F5\g'gN5MMGNL
+%RA)DGh)jWJ.s.c^Tj:emBE<FP!Ns5WFqqS6blauqgWaTu-qE3;c.1ZgPEG*%]K9Sa5nJgT1?$f2E)YBia.3UP:BWLAEk!?sB:U at Y
+%TOjcgh=O2=K at ."D\m^)hlgOPWY`AkVWV-umZ5E@?J#Fua^oY[YaA63[E6XVd#AgBeOj+XrF2!#9ilVPcE6"ofYI$]!T`>U:(#o at C
+%j,+']]XYA$NBe6lEC.`5TJ;CYpm[1mdR&$KOu7:#2U/$`9#fr7""k'f\Pdp.!4OW/:DhL,-W(g0N%*t9E;e#r=<$"f-a8rT,5kuh
+%jc7Q9J/hn[4`4+^2Q-F5J36)$n2, at 6C@P7:lc6@==k,C"@)T##Z0BbM=I4$pXi*CX(e;Ut8#R/i at T*gb))fBG`%(nl+CV\#Qc$T]
+%$+?cg0Q(7HD6Y^_E4E*;>7j!%TIZS`A at t?94En8I at Bmd4;#&/#h4guP6\>[%W2>soUWioG:SPJ1114)rMAC4j?pLs.R8"dZh3^"'
+%CtM?hEJ'BHMi5WbrQAp_VsA>g_#^uK\.[,tVm@$Iguo1,4=orDahqR"O;Qsc:U"dNSRm3MQa^8fIZQr$]4N`jHQS!Jm^BuQT''s.
+%G^0=`E>jS1\Ai6k89_hFFE=JOH"9+_0#4/qMH7d,^(D"qb&Ugf.;G/W%Fq.-;/)rrrh$$$D>9%FI9\\PlH;\b0Olc>p=`)s/-^$n
+%P at EenK\9W8JDrhHXCgF#d1rC7oiU<TKDUQTK40\.ROr%VGu#3.UK=?D3Y7Z5d:h+q9hUH8]UI&!fOJm2 at Csd%7b>$JQE1VbmQaGK
+%Q at 3e^5#$<^#DuM^<Uf'$&j--rlRO2b@"K3Vg?hX:8a90QcA72Fs2E6#8.,G$]kXEa]/hORh$/90lG-1b#V(`bYQ^-]c;ep4G(HU(
+%RFb:/"J(^*g[Uqrh9t\dJsnL50:A(BETb55+ICh`gF$)sQ8d_I%]ek.bbC[3j;>!p3SjM at Fc/D=cFO[L=KS47JWWN/7^Z5!,Cje$
+%c)&s4<Qma%_+e$'7Z_QD(=r[2!,^Wume``jn<"(476r(,+A?[-&2n?<,*A>7R9aMUk2^G1nh=n#5qkUX0,u_6aGN*R,T$j8pTW'e
+%N(FBVN0;hp0?he5[XcIJ%Hs&RZ)E9XpRPAIO3C[+HSS\.ka"E,!0ib?J6D!r-4SC]i!X]Q#ri)F';CMN'42r\_ZcGAc.KhZp2\\]
+%0.*eG%SqU"=MEH+cXr%OJRs&/L82Z[b\9d_lnU9d=:lp_e-qs99-h!1d^cdpFqV#fah)or2NY-SZJ"IF>?OWc.5ou`E#0('>(JBP
+%07XQKq\Y<$l8'&h+2#qDUT1Rj-1L?9mg[-`]!B:DpXO^X!;=(YQ\[(Xf49f-Jd]]gV.TjdN>8[-eVlT-q5PSHG[DV[*lFR$DI_<h
+%"F=8UYMH'-cpL'DZ^,jhCpnK:Lpq)(O%D!$qs9'pCp#$p,Jdf3JgG#"!d&0>a'-'&,T>BW\%$[*K$\J6&.f`sW"amW6RL"[H2+BW
+%AD7;'>H2*Tf[Fi_1n&-Bbn7>q8.:fO5ik^TNUF3rc(_>8TF8i'bq7):#!*#pK_buhiWV>b/f"n,Y*_[n;F61Wm34LI/'!BhaGOj$
+%&L6*`^6*@#\XA8[\>F))1L)@KG'd(8AQQm3\6LK!KGrUe\34Gf/7kKN1O7'dLhtX)'A'>jN:%ipbns3-`,I*2`^A:6bVVb2&(aji
+%S%"3kdnk&O"ES;0j]ZRnZf5`ng0?pJD'i7gVls0/]!\/(\=5u;-`qA:Z/&\pC_;b'dU]YMQ-or- at jP(WqaOg"d5VWq0Xf5\-AJt#
+%VV=g_6$:hTQ=t#cjU_('iK%2GkB8Ep6)G6<QkD;7>q7b<#4`70F.KY)&rkZH`K>fO^rDio+OQJDe!4-!"NV[kQ#:S6mEkos$J0$d
+%lM5%EVeE)P$+ojGB]!=E_o:+:E(7`r*GeL*1E:02q0$Pr9f4cdG;VjLrE?SJh9tPRP$?ROf^,>C!l"jT[^dDGC!RM(i<Ql!g]T]L
+%(ma\"bh5/a?!Y^'];nl:eHp3-!,[o\UrgPKW!k(NAZAkHIAYrAf\0fN]m3OQALK_V#NrPXV][CnH1HVVDY+ptoS"53GA1Sf.V:5h
+%@5t#3Fi#*e'Y_Xb>V#,mCL58CZ7gg_FpUkFLg`R,#\S`Z5`Jhq8ut`5A at e)@fRPF4g_e'=L7$WA#b-A0\It6K7*qVGo*C+%T]alp
+%[YtD\"L0P][#I\Ai%/+s!rWh6baY!.&dSg?$krm>Aan(f%pH$QGG@^09"o>.K<&LueJ%@Z/KjnlGc/eT(meGM!-P>bn"r3$b8).t
+%2)YiCNnc353mH8kR'QZ^G+0Z[)i6/oh>aqM%-LWYlgcr4J-T=J3,Q&<"-/5k=T`NX._;pt8Ah\T<ne)r?\8`mEHU`dC,d.iJ98_c
+%`2'o:Z6W)UZ5)CJ^"q6V<r(ccq._9d,8E1%BX5F?bT&:E;8\j\2CQ at NLJ6?F.&D2F%7kDZD^S^$mg`fNIl/!@+Ek$%,nMUG+Dbk3
+%<5 at ne0o(U5rf,,tgdZ'GT\tFk[\4t*`<K,u%'Dluf/k?''jU1,50G\,g6'XnRkq#<*?,=mF$k;c@:AT?BiC%$]H>7l;7JGM_e%IL
+%brV[d1e;6&Cm^r>$e$.(`jf]f)KN;@5hgUO\@<Pi^cb!T_JaTk`(q_%eUf=kV-#WW_hOGZo0=`<dM"MHfo+'%;EINsN,r4p2e%R`
+%&;b8$-H5r?USHP.#$V(VcYF'M['cCVQIc)Rf'lpG6VKh!H>Qi76;/(0o\iNr3j6nGYp4u\T\0KNghg'Mfars9SCOd7)p#Mi<Nm7U
+%-9V;bLWDr<_!5l7ci+C_GedQr12 at ub6ccuU<+4msm&Yo*'K[\V])q88eq&>VGeXb9e<V%M^1:4T!mW5\RR1?-qLn]u,;=u5gu5<d
+%b2SREj2!lsDL1%F!Hr0]1Lc<i5TgHs\;OB!i2"89V:`!m/OFX4+8"QUG:OO+%'k,3*;UjW">8=DhIN+W\8RHq)m9h@)Q9r.o3a5S
+%T:Zu[_SqLT"X$"lIIH8%%70Cnmi^!uo/'kep(g?VA0QAD':pun5PE&!XLbqNfNQ#C<a;Vpfk_b>hKFn\g2P`7c!8't7SfpGh%\uY
+%,E.RHBDF!.`1Cu$X1a%lABICQ%e2Mq"LHbl/%aUCs4A)h:fRc4gWuJ%O.fVZ;^UGH.*jd(L9nD=KHT?rmWK6'1o-+F0eE"G3cC<A
+%DoM3$DN(-_Ii at J)Xu+<q<8WG(,agpABXl(IFe=u1gOmLHRC3O83Y3%c:]\h@>nbRN32P0_ld9n=XfB4"j6ga9.;so)_8D>u!ZQZ)
+%8%dB,,6q-(rN4'Ogi_FF"manqbHmP3fhKh#_VB\M^f+VMG)X(;]BkhP]C:J(1DA@$Xd`%%Wd3j8n"ta)ma)bH')p<:_u7#a\$71m
+%'SF24R]D6!@:0XdW!VoO_1Nj5Ao/lu8#mc;00C%JBOW;lSES"I!qd:bLH;d:>=$L+>=Ek'RDO#LDC.+aF(];KE9pVk9afam/uZUV
+%i.pF6)^+2_J-hO[^3rb'RVbBI/Q(k]i7:E3.Xj<JrF5?r.0u=3\CfF6^E7(\&h+-oD;0oODRQ*F#E8E^*A2#eDQ;\Z0.*eJS&1D7
+%9.^P?1WSB>fQa5e_<ZD./-N:I*XbZn!WrceUC8=!gnY`KFth at m0!nb&eqZeKq)lSIG3b<YFmPH![BU-d-X1WtJ_dC/`;l;+PJ4k.
+%r#09b?;2eF+YsbT]=-Eeag9+ at N`@l\(1U`"h$/P\O%lI]=o7>B]\AG.B"HsI\^p@!"pOm^fouJ+92IEE+koUIaeoN`$'[2`&>6-2
+%%+dVP(a;q!\*/?>U1p:<GRae([sRMMSNDV#eEh?L%$Jq#KbnqqM$R2S&e!PCGCeIgFk(`sNXK0Bf\"19Co`%ZW]FNji%Brhh9mQ4
+%nd2j@[3:*,"sF6X1LU/\a$;@FPF=b/oq"#FT0\4Ci*G/)cY'pc`706BCU+&A]+?''.YKS9";/1b],Ps<(?gW=[;n0F\[beL?_uE+
+%Ct^oU5K<`MDdgN^GKfKZpIhj!,L!UL_p7+c&Zl=KL&7HUQcDI0mFi,f:gfA^flX\gZo=O&g.u4d`T,pS:bcP%DLC(AE&Id5<8B.1
+%IC5Po<]/KEFTesXS]8U+2E-k37ki1>\mQB]lLe7sd%Wp)K+Zgq&7u,5gUf$fbCNC-AXqD6blTgUX4dKm49X$D$#FBPG+RKk*<;eQ
+%EPSb/02't<KI`Vg`3&?!<WOkq\r6YH'8Pr_[1'0\@_8iT4YPR>,.N<QJDOmAdFH(fQ62$%Sf@;t4i5=B'SV:m7>^C1F`;\]YP)B`
+%4!GZEe`=PUC9iPS(c?LGGTcgB>;f4(\l2[l?uKpO&/K*1 at uG8ib#mJTJOQ6!QLeiH=O^;"PJ`ENXrP$K%,piucm6R;aOLtQGJo>C
+%(-G])"*_/2LL>!\Ra#I,C5(CdBh_F:jLs)SR;, at 7JU&>LLVl<KT$stLLnDSaR]>XZ65"7Q.)Nd;I1IoQG69)8Iq9*CY(c5e"IU7?
+%im\"F3afKW4, at _H#dCI`qm/SS?*pasjX\e1U1<S.%VTMPUZ,54WmfZ2H:76g6sDY/C4<MTH$/7]M,\@NXC^hXIqBU%hn:"`)4/DL
+%N6tmfBS%UTl&*1Qa6XmNc!#kIi]^:3>V$i$*V[jYKoii"5DS":mYiDmO,<ig at TMr_&_h+-;dBLaqkr+l?nAC2)hp\PA:]j&G0q:f
+%/WA]_hVQ/X,A3>RHTQ56lVum3PtqrZTo@:e/qQFMO]Q^V?`FuRLoek41kYUh"N&\m"78,YF(_e9SYUlu:LO=^Vce0;<jLQ#As9,!
+%-U*?9G+a"-U=]tWYMq[6)\3g$lk\P\!NiDL0%&?E(hSKS95HEieodGg&.BA6Y-+<s4Wh"KTB2.T*U$P:+Y0Skeen-qa)N&N]$,V?
+%rX<:XkpCLFpe0bBd3P,o*`h(#%d3q&C;&'8Yo\p9CFo?6!oMcC3Y7FGf@=[h?9=3]OTk`UY&9c->7XJC)E<@$DsdRI2*A<jV:hUp
+%g/(,E)UM$:nP*IcE. at r@6P^Jk?C:>o0%Isl#[Uao)f-W;";4kM]q6+R#-2(.=r:T&De?dqX4[,[0q at Y&Y[I_qE+5;V_HG.Micp-K
+%!lMik9jEjcpDK]"lA,tm]M-<Me<o`m,M<!]EC?nkRSAr8GXPKiX>EH;6)2K-E%[QZmu"f,>0Yi;<ap"]Z5E1"%uePn7<cDE*U>UF
+%S$+jS9YoGYj!qZp:H#!r\8/+"cS]Aa?0k=r!^R,q>uC'Z`[!l+TJqm^4?2:5!YH3HjTFE:D8/]fCu0H9qt[;89!/U)-m-:DU8P%!
+%gD2nh1p0mGiX(NKH1NYFhJMM1r.?)%.66AiA`XghiR`figoH]gm]IMumC^-$&StAM8MtR)iB;5DFMCXp4Dk,RCu,<'7gPcUB81aL
+%]7:_u"@bLtPB\6#-9";,Z[KVJ2o8E*W4 at B39=fEdiR_Jl0RL^WHLA7OYm;/(^\V\4R[*Z.J)E?NDM:Tis"=Ie>ic%&WA>cT+<&]\
+%dn8]Rm=Eh,-bosfgPg7W-A'jkhQ/TAY--EEB!mmMqKO"e[t$YT94YOdV at MQlQ>e]A?b>-'LHSB!%3'0 at Zkc<t(Bp0,&P?_d!XS at N
+%pPX,S1?5W*<8C:0&kihgDMTi,b'HHT8@>k1WMm7Y`;R<-[!)$W/^-qe)gaI\Z\gVt0GEe=H7$XG6gNHS_d9u]WeEf+G>n3,)R^7B
+%&.Wr=qlRYmpUBd6?N!GM-_cN%5i(;;3Otl7m$r7+O,#kh)O"l)NiJKjZ3-u0C-n;El6QPD[Wd=1Sb\G)h,Q;k$sXS)A7(/[\t2&#
+%![sapn[ermrja'cL_oe;dGfhn,;Q$Q5cgXtG_crt?K49o&j*XY2O\4-eL_&7$i<.AY$n_mHT)'Hf*_kWo<>+sBBV5il2B>Q<k9kT
+%XNg)Bi"/0S'ksh?+h^tC9$C>I-l.EO%0H9A3PfDb<S\gS)%IB_Io'rj`0`NSrOA;Y0P^qmH`BP^1bYPFb6N,H(Sd@/Y5U=q8rPQM
+%1b.djL>\E"11"h2BXJ>QJ7Pm%!Ju98TYfb%A5$HSfC!_s+<d\<lf?Ftc,1TFh(CW[Ru^3UE;,C:4)Huuk&T*HG`+WfAa:kUY6hYN
+%ns68m/uY3tPH>n1Z[h.?@*.3Jc)<;t>RCus5A.<D\oh_+J)X'Xf,>p?Qsf:`QaHIu<[S=bZ_s2(MT5;a$+CXEP[1bY at mu;73uqk`
+%`Z2G$?AKK;cfHA8ZA2hfHF.3$k=7TNRd92f<@=ZSdsLGt:>,+RPf$s,[p=P\,rfa+^=d,6-d%gS[l at q_,9fDC3A!Kf+C>CAB at DN1
+%eLeek,#lapb&3?tC_g_dk05sL*Z6&I*R]9Pl@/SsOK56!A&8Z*i^6j60O'X6O%t%t>Hr6Bd\CoQZAC'@AD>e8NTD=d]lJ!P)RniQ
+%@J']aQ25`*LEq[J\Jc5,o^-68]O=,tAamr^Z9Inj\mg25[L'A'DVK9tJ!SQ@('=68*+kqC/$#)AA#R>Q<VAl6F[t6-`jda"Xr8`u
+%>j&+b\,%<\9C0M;Z]C2e(!e2Wdk8P(4kNE4J-NG7%,Tc_4]l19\sVQ%bL[r/>?.6XOBn*-j*E\B4Wk%`d<aB_506)%2tOQ1h<kqo
+%_k'%:@U><+Mj`i9+d`&]1[5A)LclaROSrV;nSfSjVObii/K4r39F9&0jDFKRi,6Y_>MIc at o=^RG#d,a\ic^&gCcG<^V at lR(e+o"B
+%>rss:`([j``dH<C=qe=^^fT:$@u?5$V/GFkFp/=IlWA'rFP_1\&1%`DcaK_1 at f^&\SRKtI<\k[Iq!\ne.-'^-UO8Pj5CH'8rYAb+
+%*4meI([EUp1Y/B6k6dQeJ8+.T=Z)CKn\=e%%\IIn,)As>2Uf?d<XE*7_/3",-1j*CDLO1-K5%b+;?6,.g7(fQm!&lQmlhh+[9>L9
+%$[A]mJ9nNWFQ;e^6El]"m1Wf3Te5a?a3 at Oe:$>KGl?gF7R8qPB=M_s!g*t^$(POXf6!O\7Tg`QhE9&i]):2-N]`NuSAemn/d*o)e
+%$t+GU5uL_\>O9V$6$o,@[9#<WVd7OgYF`F-8Hd(?<1E;('fQ5I4Yq^JWHJaT+;k?5a at -9fC0fU:?o[KlEPNh&Y[Fosl!KXA*Lm<:
+%9Io<G6KHdX\(J^53QdWq,jR-c_uh!r=CP.eAo2!8?Z0q44"M_Uq[B?D2)mCA#IL_r#J/l(,-WfPiH1j at 2Yf@!.#4%'-5QqBIPZDa
+%HZtaciAB_rLU7sNX*-Lo_8k#0c":g*$dm69KcgZ5#%)b46Z2T/R:r:-=*KSfZ-NT'"\CF$ec!$2NadnhLs6&,&p%[Z at SXB?D<P0L
+%G3`qW\t]nugqo+16Jf(4(a.cMO)uTWcl?XM\_;DSeXB7VMek(]hbofiRQEIMX^*$:[CA=((IJ6I-M!EcB+?ZcDr\HI=UUO(mFg8i
+%S!(D<'tJXB?sTFUeY;1V`;m;4p]B`X=cQ_tLh^!>/-+[G91:Z;6#A>:cW9RlWG^:XOkb!>jZ#S5?$L6gG$csC"uSL9S*^<IF[s at 4
+%'VHGL*bI]P?&;=thfHVXI!Ssdi^.oB^:!js0]s=),HjgLd:(eM:$!cUmE*AGY4SgoHIQ(UMiYaVLcLtZ1S:jl>29Z[F7F^cSHbeA
+%`Zq=(RF)o-YXLbBMHJ&:d at 08&bMtqI<XB>?k+Z1Gm1Rn at Hj[LS\C4[!AfcfT3QZmm1s_$r;@$66ABe[KDt/.$;OokH5TedB!r!,d
+%_nI,Pn53lO`F;nLZQahMPL\4&,V9hE-U]1]P_G/AY:KZYY,CZs(lN'^>n[OlDJB0NE^;<'!!"#5Bi_, at C8H!mPLFB/DZ8iV"'a`<
+%\RehF9IFl$c?:*6o55;\DCO1L1\N$4RK4[sA94%gU$`nV2h7gTB+car$?[<K!Z-sf>B9tmp$p"5%+[A>[LNFcU1J*eng8FC!@aN4
+%'D_uUMrU-NHA+!^jjQg!0fRWSm5>"<WABo9g?]k^gaZE"K\Lkk:W1.fD)ptTA2!krlru0(!Lm10bSIK.cJhNZ!d03;%!GGqD?IeR
+%)->mlq9)#aTOH_f9?]-q!V#OnN`cuKR!TLBY'O'kLI&*HZ?"[%WU71UUK==]e".OC6n>m7ln_dPLASr5Oa>98Lf1>A?ZrSo>gJeQ
+%bj6Li&A!<s%B7g3lWb1.6k0$b\uTZa4-Lq;!.rPN3(t'>o@`lZ7iaI20!*+$=Ydg423G_(h\MJ])fim4a(to6:6fY[[PTjGj?Rf#
+%5RJ88ST&@hoa*Y0g:Bn="^@1aJpk'<([UJGdu2Z[l\j#"R6IGPgU;fI"C5N_)okFG\A:"0g27e#h"S0gep^r-7i(ITlM*0=V8"AN
+%(0uBsje>>4p:_iE6B5nMQI&.1d4p\4g\_6a\p&ogf>j7>Ld$?r=k4!Fn32+(d`<^GApo\4nE>XAk_4pOBupu#[?W^&b<;*!_^1O%
+%13D&/r,G%kXQ`MEVU8N5o3R57[qR/fd`l@/"O>#(gq"B<BEMr[OH?3T^R6R&=ih>6n?2LP7%#HqB`R)]6T"^CMig_[.9N]Vn+Pi#
+%K'^*Cpp-s8H,4Y*YR)u1_*XFLQ7IEBP3FSq%0Sa+\_Hf.IL_<Mom)&cHK7`*HSYou5p^,&/Am7#\Bf<mF;l<Bk2'V-BGcg?#[L.N
+%8tuNl!jdMuN3'YeFNqDm]ZL+ukg>[:kOUnn0]HuoZo]TWYaU8Y4$-R>oqX-(/%$n.*SMccGIO3,Z.&%D/[(a#R]U5o\cH"R)8^1`
+%gNbY=g<bPtDtAO)4r\LLiMk(`X^k;X'%7K2B0Fgc/uF-YWjY6N(2s']b\APIJ*p-Uq]GkpK+Zq=!'S7Y;bS<j7!XlHd48fe=rV*5
+%g:H(pAcTM>CaZW./$*Cd8R%/Hk2K?;\kP8QVuh,Ml$AiM7:D%Q*:mSS^2/sFJJ'41nk!Xsi"*H(Tpe8lN7Rk#Csu^P3k7a!%P9F4
+%R$qI\TL^cUJ-c4leP at V61;P>6E7P)_!gm'$7"]!i^7+V6^qe<t_'`crX$(E4jSQJr8?9%hqhQVsbdF+dS<":0nTXJjrRS*LCL at n>
+%Q,8iNq(1puGVmES3<Oeg:YEsmq]J]D)eH;-dZ-u-B-$]b%7'X`o]\>!ahY&@N6+r#-E`_RF&URf=PXXDZmU"(?a'EbCfga5hWe]r
+%:9pKufS6N1OIp*.rFN#(E)3*:J=OV%nn,0/8.P=q?8,H4Qi1#a at 1[G'CnIk>4'o"SaYMBZ?>4Q<@e&eM%H$M-Jk,^bX-dc!S]jbX
+%LU at rL(]rHj;m1AuCbqI"0.#`deuBbD-UA#\DFi^B5#'S7-!:JSe`Xil986Hp]+$O?=6fKd1JuhB>AN1rE)ACPm<V0rj5F`f[,o<1
+%9[o(\FlhS^4fmNLGFQeN34cWZM`?Ft$gR?GY(N1>ik[AW'/Zl4aI1ZtR5i42TK29hpcQ:8LQ(21",sJBJsf5s"oD7*(UJLj(B1Wp
+%c'"2f,%CkJX4F[@G+9q/iMIL#`&T^t/RX$MZM=aJ)kUHqgMVn==G<9T>CGDQ"7`'e#YGMGlUQmF[;=ur,(MXlp]SXs1Jt5OnaR:d
+%8rADFmXljIlV,Du!S\3h[d&Il2;:GkHf`sCU\W,",h3*aj0I)&VV^3V^Re]Pj>rXfF9;bsRL'aXg0T0Kf5i.(:+5gjF16lT%r6u'
+%qD^)T_43(C-pA at pXepPLijAOB(`-J9`mFc[6<Sj2]B/;;!=nPbnp$DL(%Z7%iPT_&O2H.T[Z*K_I)o2J%KjgrVTD"@F#,u(@^M=0
+%=`DMcqN/(b)>R^EJH;L=N,9Dm3fZ*$G44;aZVBq at g;KK8Ru8jjG63qQ:HleBSsWSM1&oO1]m2c)6rD2s2>7Q(=kC(2Ib%nBKr*m>
+%fo'\p1?5Ks8#?go%45otf`Z*W='7F,O9fYa4+$=$-(Z6CNt/Cuor at M#dEfP8QsT>\-jLu"D1aY2r4eYlMV0P9/[?t54\^:4)-WB2
+%+S(\\o75YJ7`'-#bHjQXp;%f[fP78]/VDdY]kFNKCd-GffP,ujR#ps-5LRbb(`s#1M0"m)Ae^0Z4GpmSlP3ZOYbJK<Uhb/Hc<6\j
+%J*]A-A$u%:#"&A5G-&Z<+D,-hG<)?ID at 8NW7$$J6Bsp0+Z;$t;:s7J.=7A'k!18G:6?r_B=);tr0o-A(9g0j7Ta7;I7<T11EPJch
+%n[;[?UW^'/&67J^Uud'^H8RV`JHd8Q\]NKMkrD_7H^e8^Fk\.1d^[q8hIkq(a:Y/+;><GL>@MbXZ`?<4^p5@)E!BE^X7bg[2GCtu
+%!)k(i*hE+lAu>CF1(1rNL1dSm#).5fH,aNc@*7pQKPraae0073T:Jm3QEI,@@3;BXjIHRZbh+]X<Xu(oLdsXsd604/\Z;4Q7oT5r
+%"g4Zu<2Su\Tg#F!LBa_kkEV'M?:?X]"Q8'U8?"GEYV>uV2:cAOLWRuFNF at 3Jml3u@"^;MSs&)*?=$D11,J6Mufi=m(%f"nGG7mV+
+%`gDQ=p at EEVV\eQSV/]S7OMg5-j-W$DB/MPl?Lr#<MsC]+SD3$3]+:un<7kTjQ;%2Jer:5jgAYf1\SQE6Ch`9'&+^=Y>l+`7BbM#>
+%5FZNVK/d,@!.^Na-TOu'T#IjGpL#*)*"J`B\K8`6omoo]\8<;Vd=Dr(EB,BYn7$k72nKOd.Z3VS/I4-+9F at So[;Z3[)XK2)iiI4D
+%)K!XF/_#Qe?R[=Peb.#OCmi(QP<>$M?$NXsE:HNOOC1!h:()%YP[Q3UgCjYRX#]9)]&TJ8!G'udaASg<2DNdi4+il\7&e?bmA>.)
+%\D+UkR.jRjmML at mOaYU"Q-e3#aV at K2hG:a&k=[/V9Z#dao+mgXM=HF'>-8E7Di_t9Cqs\Ur8GZLe^0ip`)FLnh0Nq2+:^3Q(c,5Y
+%2Z$n3/,-$2'Gu8pWm<[rRm!gah<f(UbaGV;5q+&.Bt#s;dUKZG_OT;`d,]Eid`[oPE.cm4<>#W0K<HCa&H9,!:A0`T:!%QWr)sXs
+%\bJ-.UOlLmp2A7_8__G))U+k_ZUAfhK=Kr\qCE?#'Oiiag;_M:r-,NRR5i-63)R&bIkV%%>hU. at 1L$!YiMo=G5%2>\b0<Ec\8U\c
+%'!"It2VH`1!c'P]'Q6I?B5#BNXIgK[(@nE]j_Co+-=G9L=*(p-aM4 at Ve)f/([B&q^EUY"?-(r&C`JEd8Cs[WpZ"0K?Z2,^YZ,?kF
+%.%)=WX=q%2Q`s/1/6Z!>;rs+B1O%;MYK&fYVe#1a4'KJ3Vg.=. at VP_I.>m;>83YB9=a'Y/3:h'WS&Xl:2!"R$(q6&hXVC,6MH>g3
+%4S3>u$0r7)OA'hrCtAG4pueO!6iARr*X$3\E%Ya/YCs+.V_Rl_5a-a[bSS?#],V(!>YSf#+U('0hLt9-+4_f>4(u-f1 at 9&`;s7%f
+%fJ!*V;dKuXZBb%RR0DE)96G0b%pjA\WL;X^a'A+G?B8g&pA8-M#oEDVCYkc<h=.n1#_</f=!5lJ[rmZbSD_9Wlo[)HJ_4[$*dO_*
+%APKa'S.M2r_]t&l5MZ`hqhu(*I4u)$C!HR8kR6Y2h5DdS.TVB;5[6]ML2^VRKVQ%rO(n3j>GeouJMO>4?WKh'C]a'hPC0[o at PZGQ
+%_FW'[c$Xo9&@I(0ST6W9"@F2f'jV5'^fJ[%\"@0$4sM8G%Yn"I!D'-a9SAk5ik#PVpYFU^T3p3%M[.iho0d-B=2()&hHZYgm8YCI
+%-cFsTnTne;a`^N8Fhe>PoYY[Tr'_\bOf.4SFr&@e]4 at rFqgA'JEd_m]R=Xn=$8U)sVTg@)h+PJ.8Mb1_)g=!O.\+nP8Zog(ikT<Z
+%DHNENgVXNun5URuf7t)HD-db at 2(R,JGoJ*#2ScS*TcGJ)+8]WuX&%#^@t\>5B!!(]4JCZ^<*6EO#F9ekOF*VndC5>;EpD*r+n4aa
+%p0s at l+Hdnn[kk0g67#Z]=INoHn8VWhi9lYeKuQ4;EOAI5C!eMQBaZg^MS8s`"mqQ`#r..uJ40_FgT<6im97F^pB at GSUQAZbin"E[
+%fLA3/`AS"hKNUakk*A./KpM?C"#^^]c9""O?)m$h(o3(`TE+^]r(^ksiuYcA[Tfb'J7Wr"mBA[[kq[Dm-eb(e2XiAgHfQ6%mH\\h
+%:dT1"J%3(b1eD[5=hsL2)@utgEWDg30;7`6p/B:]BC7e9<LFFA\XU4#Roq`)mdEr\rQ&?ZP'nu)L1>2iI[C0$rb+'W(9C_(G!=Sf
+%O2RP9.>n%L_B("]HChhNQdm<pT4gt at Cm$UW+:TB(">?>m8(WKU(+:o7W'bN)d.m`>/Tr&I?>\L&R,sk^8`?nWls]]9VBE,-?LR-C
+%HHT_FZAAUQep0pL84p7'7tnjfE^Tf0E-:!O7C63<N[@=<"$^bF>F>&=fuC3&/sY([i0T(PjVcR"P[ADKK$"K*YJV!"$/uiI0IX0?
+%HoiNnjd(YhE0t=9B[j:2pp3ZI:f*(#rm#Nj:G*q`8eNIK(fRE^)7+0:NP=3*bL[aW&>*@ahOhb+23 at JaHHVq,GtFhQ87[E+`Q%\3
+%@Te0cRt!G",o')Q:%r>PJ&uDM`sF?!3pLp^m3`e(h@*ZQ@/<Vdnu<+>(8`6Cf),2:jZ(/Z- at Ho!RhO./XOuh`8KZl3:1Ej*lSRi\
+%f09i;i4)VPO8`gco2O-aRqR"`MK++mfn6+="ZU6d5`s$@@Y"a&B,G?1`gZXtUK5A`01V1P=A?:"A3Vr6^aN[=QX!8ahdq6(T=)+=
+%3>*k4p:E)J6!WGURY8pL#TDRl4:bIa<t<PJBC&4.U'5S'Fanr-hAYXQIeL^=_gjg-H>88tD;7.1'hKWXQ%ZDb?^&C`C.RYIY;e@'
+%n(\?YUePn$IIg!)fnQBXLH+8ZV>e9PV>ks=`DH5W[A-7[@(M?Zq4:/l,B*n&E=PJDD,HlV$#.u\^[8Ln)XQO&MVRdUV'9<P:ddu0
+%=m]qb_qYr(O)C)ZEF:k5a5!L$kZKE-OhF\Q5H\kh.IQ\[Ob$@&'=!A4-X\(Q[@G_uJ+H?3GV5JL[TIRkCPiZ1GBl;f2H$V<9LWl#
+%\Z)<ZlPWISqFS=d;U_!X-9*Rn25?n?A1;q$NQqB at L)u#NBo2;Of_q6jjE;X6Z2P6?0=Pfc5obY78NugOc,5[ak&2W=oMp(d5q3Xd
+%K&7Ks^)X%$`B9ipENUe9K_8gaWou!!/\^J6g6sUV at 3A@+GbR[m=l.295tZXgI=b0ZU'ZWED9^PP7cVrrB'6uJ.4$r$^#>on>d(',
+%5t[Q9pan5a^n_?)ejiZYf:8nE3l,Z^o&"M3l.dlg6$_"Vj>lce?'0jGSTeP[P?S.gq40)CV4;^N.1IWL=hOMZnZ.n#M!-O/NfPWN
+%28&%i=&1$AWViAnj2ub6IF'kM4Q!R/:==V3<`0_+*AaN2n3C-TX2KZ?'pSP?Cjs/9&!gpeKNK906]mKO-!>te%ojE$A\s_6!4=4o
+%F6ZW(K%:SUf0Ik3DsR<]od#fjKD&ZtqsFV1mj*^R\a:A)^D$$IeZeI4YsAeAH:e"pNAGat`@7&=&m,],q$RYcYZ2L/cY\cg8K#:j
+%J at a!ZmACAA_ae/bMH6Xud at o4/8^m)[[W41rAYN8P\T`ipRcfMC=\/ME'O,t<eR*RCY!2K1cTJsX$;%;OngeX)8OGbdj*:,!mi\6,
+%X*Y=)`buN:Vq%(.]qd`Vrt$R]VhWK=deu9"P]1Pc%BfL48[(0(;fh?#h8PaS+1j5^IHNM2,#$A2XC\6p3eKpHltI3Pg_jlZf8?*Z
+%2C5e`l!@NScLiJS+`f1_),n5:'@rX6qlSA<XK at Y8]M*s+I4`3]Me'HJnj9h=1VTaub"CaRI&=&cJ>6 at U[ddj!@G at Y4)!>D$`l>sJ
+%5$fC(.*8$l+k^%#RfP+_8&'Gcb>G3Al`!eRDQIo\r?Z4Aa.P=3((<-B[+Kg)J.i__.]7Dm7?RSm_71pWcoL+5*pc<n3O$ERaElY5
+%d=b,n:W8Mq.50Jnh*.Ba0Z#:uT#3enf<J!ZoJW-7o12'f'fHWsp"7&;o`SI;p;=/48:&#e3H.u`B)%#CpmC@'f>3+9obIW(\e2P+
+%5tp>g6$(T:9V=Yo2J[-K-ZDV\Su2n2j]3Y(FIMoH`V+##>FA1omAsgLB$&Lq#Y:&,LmsOubU^3Gr;J8c0aU%IPYiSde$hQ%GV04-
+%IOss\d'/;n4*/b(2>qGO,!i2E>mn7gchjIAS2,TiTe>G"dt,[[:/t,Q$S33$\81_X#F=tI1+?dHc)8&?S+++1>=mXLmY at N8DXPr+
+%FP<g\)B8#9)Q<V;\'8i_)lq]\0mD"Z>qH76cu3r:Y3;&[V6(WVSRc#H$A,i,)\K%X(`2;\BAR0kjPQs<R.H]`I-(=f:)mf+nhCA.
+%Ls+ZM3%U)SkHqepLlsSH;?l9YY3#VI.Bsfdbl[k7$3H^I at _U/Z6qmr&bR>#JfpY$11>s+tP<>;X&>X;-o].Um3pddeN)pt:F8[eX
+%HK@#K)O`5ee at D#eXS_ at 7/UO3opK267:HQK?Xh]N2M*5f"QJ*6V9JEuQ5_:uJr68M<T$h.4CKEZ/4es('+.[qL'0IaJ?]s]g)W:;<
+%jdP7HM=T2;k^U^0[oLRSM,*,N-I1K8A(2,*O0N$K;pQ[Y/J'$I%NiEZS:-0te7![FKIfA at .0e=arF58trYK58Tul'/\83YU\@2WI
+%(=@\"JSj,QH#&.#ZP.XK(BX?\n0*p_Vigi=j]!-<0HoCe4-f9\RXZ54s'WL3`bquPf0;,;Pp4oeeq[!=<U[rNN][s5ie4btI9H1P
+%YZ?MB*R]AM?HQ4Qs+]K^b(`DqlfA]>4ca%Y5AtSMiCCC0`Qjq0b'n+pOE=Y.?HTbd#If6(][#hZ/8C>q<gILu5a-ilTh at tFFVdGI
+%953V11e&leHu-q9)t:C`h#*84s"s1BnrF<N1>je*AY4-Uak9>F\;%^U@,:&;Qs.3!H:]T4:faLbLXl;!>kG9&QnN,&>TWjBjJ at hZ
+%bc+h5\S6K$.6anndg$jQ.9muu(Br/ZNInK4hl_snDo\!7XEO([kf<5]H"7$#Xp5"eE_f!:acISp>?EWM0kg*Y8S^m>7q,J+QECN-
+%,Q3'C)Ee_1AYeIeb7<An/a%i3^VpQn[]+/4SA0n%Hkb-f([[]-eoVAPUl^gtkP.4=K6f(@,QnXQp&+KIUiT*knGFSX7N*lOFthHA
+%C])]PAR:M.7 at h)um=&ajY1$bpA[;s`VSF$"OaL^>n=ASV(*H12+>t%aH`gc0eh=\!Nf,SBEVT9o]G<S%I;7^dBKu8j\asmCWgHuQ
+%r=?nFGu)]Y$X.7^Fe80AJc3T&fQ7PqTO1o,.;(J4QKqTNrHtO),a2njOYF9c\TK3Z^=g6)U5FeVPj,@#m?QA.mp&-lV]4mMI.YS+
+%<pM3]$[/3\PpF#HMFkW\EX-NnlFC8rL,uqQ<uu94Z6jDro!=UhPrF6':JEhrcDY:Z.])6Mit>!tH6<NA0=6;4qIn4W^o5Xd]hRiE
+%(GG=;Rqe4Jp8:KZ"j8/Z7lm at Ca+n._:f]$#HWLjEc6]3DNPU2F523kPnE:(j-Y(YV=44M5b,l8.BM4#13YBQG(Pa=<2e_3VL?^X#
+%$g=`sY#.Qd85'k at K*BA6R<Cg2Z2+O%rB0eh_>Yd)2pOQ$RU<Q,og"%c8BmF?^JGBi!'ua1^etjdQ>P;E*OjkY6q-[@&!LOIZu7\+
+%mdK[=R8N]A@?aek69"/nADp;:5/hOi30F*fK;706`0Ejl-<O at 8d>R,N5DS&e[%#_SX2fUd5lMlgXa at e3pLmdF;6K4Vhg at NR"[.KS
+%4<E^OgIO4$[H=\tI(b=a3p;R at WI]&</X]0VKUT-m*dp!ok(+l9[r"8d%NWK(8m]kB_;PQ*6*1&6B&'`1+KSR"kL?WK,V9?k#6VqV
+%dL:<V)2[%hcU&p3+*n7u4:,`b5q?BT'Eor>W(ra#e2*ILrmCH2Tiie>*r6piJ2K#0&%p8ZA^gUjF9HNJ;&giqT;3fVFE.T3E`(2\
+%C7I+^F"R`U+,mO,<-`X4hq[&.WM*=f!EBf1=TPU=W,GA!ff"O>m at +N*1f[\d8T_6eS#uI/r at 6t;X!Xf4;s3;i;bo at jWc)q1$U.oj
+%iS[/5S0S7gh1YN5E7 at u^kLZfb2MQ\!*QiTc-,()";LcdrFMtS?BZ7=?o6nnpg*ACr8u^?^g?mhWFX0 at iD&;o6``62!Gku!\Yjg<q
+%^9hHX?6]R[=aI5"d*<R7@?5$80Zb0`4h3 at En=46!H0_qEPJ^mVnme"Hc>.=Y"Q9J-;dMG88Q+E:S="<sUu5n"kTIEQb!a_F8CBJ@
+%Hi4Iq9MQcaFYI#@7K0pOQ=Cm3X1^N-3B7Dpk5)KEhK.dR0&7>DEZSjNh;?pHHQDosUGC$Lef_UF]6cc6.1hPo at QAM)>s(1lPSGU>
+%FZ'tA*Z^N3PZlS7;+:%XG\!Ub9QfRV?,pbSeahb at YbXl8BH6e^XS4_\]dB0QptVe?HHdQ_g_u"jl_2RP>A;Bt8:jCCpf]g_2B#I0
+%j2GY,q.[s`c"0\6%LEEme88%fQDD[X(49joZMaOX['>ekK))ilHGth'/$m]l=A*sm]#V2a_I%>*TU?\611qGsL8dFE2"*/2TU=me
+%E9[`Zs71GZ$&Ju$Z0GgppfGP=X=8EhID<b:1/Co&L;D94$2GKS37q.84_9^=jIi?=f[qMWjsJB4!a&2rjV5s_\2Qgd@$WIb">Pbg
+%>80:/GP at mK;;*?bbuc$*O?Q=:8P4bnQ_^@VC")"aM'TiX9Zp0t\O#A3Q7+hN,J!5M>EgVfk_ffVAZdHbjeX;Rm)YLC;=7"`JV0Ir
+%miSZnkN5<W=U&?HBT3ELTc>l at jM5`E,EEch'LYe_#3=q1;`NQu<ISQc0K2Xuq?k/)kMhd2Ri at p^9QDAYeBTrk5nE,gB_/nRPk*-G
+%Im^@J[*ppHQF,m(/W?ue",oAV#83e4O<uqIOWnf.\T<"YcjlqQE^3Mi?7B+=@_)@qX\eWW at QN3(F'H54kK at eW&kSubd%6T8ke!S0
+%oG?9FV!"!W+1QKh,83DKiF/aKPffGa$+tUKb/M*?)G,P%l,2O[n]P+h>F[&=S'?f&CiZ4?m&18l71NV;eA20_,'#B]9/F8%.NsAh
+%eh\F\G0)43%?7S^Q:%9(Soo?XhCQF!L;C)d:SJrGiH;kI]7cu-5.q!_0tjjc?Tier!.sgLoJENlge:UW"=C,R2U&>BnRU8$rRNtH
+%b</>Q;e`DINUO^V,#b8-bZ/pP08?'S2>TVF:M-. at -T+[JJ*Fj)0/mmUoDKFo<bTVIW\ue^s+795Z;ZcaZCp:rCBcd2+7IOlh-j2c
+%>!`G&iS6c-9R.+k-n,l&LN:[8_UU>ID3rKLl`b6KAGg=3s4?LT)@]uED1VB[`ZE"t/YO)0OPs[J+6>r.J;>"Sb>4oN&j51Hem/fN
+%SH4_)0e#7Hi!l!O3W,lM#!0JI.E+2k1[&\k4PB"J8lk'Y-Q>$`q1c*&\.]iF/.pYA<=]]c4%2J4q:#4b]piT<lf6sshaBPO2B\WF
+%q.1u6-.5)u?iJ;qgd^Q*c#&3,q(O,j:oe1rAbXW1:#9u!#XmjddE;taff+3;iM(R;Cr&#%$>#7(ci(QTTp0pFYOS0DFEo`Sc*YW*
+%Cu5k>T,VhHJkZ`eP)6(1c;B7(VF>U\Cs,6kTfpt&q_QmaS2cKo`OUTngOb[r>*47ZPH+8fm)eFnldc<$))^JIX7,UbYE*nQq7EO!
+%WnQOXM)(I<^HD;KEjVT[??@hBb"Vp,q/,i8cerjLfhE]AP<,#db0]Jt8PL.BSX)M\JpMqNqjG)r_hsel>@=q3.3GG;IMp99FVGpU
+%KYV<]F(=F29[E;dXCZrgD(Z[sjXoP*+/qELB4lXtS!odK,]p,`^9&:"&^<a8<nl#9%,?s'G\RA:r8,.cN_bVZO\3W">`j)Jjlc.^
+%hh:la`eX#M+\ocGYig-VB5o2*[?R?:o1iKYE0<d*hsi'7E<[A[mRVR2]^gMY2GR2D1'p1%Kr*]/D`s;$KFroogpIe.iWEgU)]cQK
+%f(jc%Ys&G9ZEqOn7u/#:c+&;F,X<EJn#h><+.lWlnt-#8qed2B-2P^t:G at 9+UAhr:<,C_JH.>Y^!cq(=e6a]d7*2B)k.0crl1?b!
+%)R`GG+af_mUt-#@LsT(,I8Fmgs3(#1YV/P_7?H7uo%Lm;=BWYDIoH&@dc2+%'&&b+,ZONW/jMU3iir[qIL%l-mAtuY*&hJ\)qn<+
+%=0=TA0ZgJ75<6 at ZWoe3\3oueO(9,WjNksIho=[Zm,q)n)TRr?Z]ee#/H'NonU/g?AgY,=nW'F.`%]>i"p@#J;VN[7C3!mh>-CJ2p
+%_KA-gHRXBiar*%0P1KJo2:G%P-c;41gi6(lAst)gO+sF&B;[Fr#a5g&EV%>>a$u:ZdNt<1i*P3jassjk%LCQ6Q:u>]O-/b=SIC,3
+%:==TmioTr(PIJrG:,r/SCc(6E$;$*GS at mD)*c_THpdL6goC,[*Z]E'jkG?1]K`tL0p at a96;pm#@-%n5S8]N9"*oDO4]]B6$p7,.n
+%UH-8L#3Hr*3DO^s!F908WTrdrfphJp`INT*5dJHNm!NJk2(+F-Ni$J4h9F:o^ug#B@'9[3kG94os#V);)p1?m=2)DZOuB.m:$0Zi
+%K/3mi`\DJK<Ac5?c('rY)=EaFf-L'C*!=ndgC?>!pW[<s7Rk?N$[sU*$>kg4cG_,tE*1_:&hd8nbD=MPLJi:jXDCf at H=ET;#ks#h
+%b_eQ[(Is#rjW%aCN-Dm5l%MFlPDd)H]t3=WIY)NX>2F/UBmnE,#Th3hB/>F)+"3 at iS_nDK:SuRpEFI[XA,d.>AkDTrr+pG[EZjsL
+%d'HUM/q^Z"Tea5&12Y+JJZQq`M<i%8o%?LWQTa`J/@[68 at JsW:4s^8;L4!*%qIJ1=67PWJ(Xu_gGV2%QWU=K at p:Sg=fTADLK=>&m
+%+WVp/Ypjj0j!/2#lWeIEk.,Y;c[ma=@.;:8%mMQeKsg-0b/\%kIYK<-$@L!s"Rm-A[.sC=Kuq063_U?8r.QG+6JrZiK[6t<VZ0E^
+%T_3=Op"MJ5:J$&A-7MWF),UW:P7B at _,qi<*hL8#CXgO at j+5E^uG*:H`GV5/rbV;aZN=rd*a\#]]kHB%J1Yd@:Ot)q:GFh(hG-Z*^
+%r6(eD[3I='K%AVI,f+%H=d_WPV<?HR-Ed/N8Y@>:T'8PQ'VlC!rmfUrT\Aubd)G3iC[:0]i:!OZl"kW>1D:Ho'"sb(ka*Z&#Kg41
+%U<3Gb0UF.PUY>_4\:#f=)?i1Vpd*$`-=E1\Hto0p<DFo[[8Wq5Sltq\FYK.kC=mh%o$<;;;7IL6<[1W\_"kU at 1QQEIYX@hs:]:4U
+%W"0 at 28eR1]gd1TtH"415I<,,3\TmD0h'\BaFR2Q4#L;*MdOE&qK-ZZ=WFBBiS<u3VDsBabNh;D?Y](9c(t\`pT]dg#N=ol%gNjmI
+%'nbAE^c#Ug4.V-oTB>fm3;I)NnW^nj>FP<4TReImWnMCIXZkm:+X("L\T8G8%JRJT.b42D\u4,09E%ar=ekr6hDmS&s3M<$i2o9r
+%B.=uo6+bNidtK<e0:;PtO_,9XqF?LC)30,2-\\nfRNe6C7d"$!(!BZ/n`Db0g::J!21ZGjF4_Y4S.><f!<rl^fZ/]Gl#C1]nL?W3
+%c<NQjc7!@0>n"#g787;:PHlH0C%3;\hCC>^IgW2_2iWe2i22uK.PDaFg2&[k/dAdq.WgN.7!\W7]<n2[*H4!^]H=qG[ppWQnKmY=
+%mqRYK`RJd+;+ftqdWt-3fGd`(_dYcsiSjc5R"m"[h[e10IDJ!b2Rs8'rhQom.^#PXEGA*S'U3==_*_CO:`)Eo4t)2XqTD_7 at 4=bQ
+%,0-*Nd)"aJ`H2a_%XtrbK:Zd:P&nE9Bj[fJ>spVYUS#_Ml&r*6U86VaW^maP=shStMnF<:2b9:5^<nOEl]6Ma9 at 0=+]8a"%m1`9%
+%jb(japoUumDV$W#Ca@$`"2AZhmMSJ-U8JkfpX<0-)T7WoZ73pV(?UY at U,-9i0)#31OToihnj'S#WGmrDkFd+JFa:+Q:$L8;p]-%=
+%hhE<`6/rU!S^U%?nOVc3?`>@.!ri<Gr\iQ`]'&5g,Fde::@FDu9:=T!;NYWpQ83oT6L2lhrBmT&Es72LIF at dr@pYbqTUo,d\R_?%
+%^Z:-KW#nC3e<'Jm;c\G_l7ikLa--%`9UqKuKY'uUf/eI!6m/_/5Nbi08B.8RkdAe(U;gOLFmGH/cVO,$S=i-LPfETpp;Y2O(`W.1
+%HAR)qSL9kj->E"7Q@'$[,i0ipk"aT<JMK(_R_7KL5#*ReqKfoG*Sc2s's-5TXkBB<+:E]o*Ls?Wg]fLTk.-BCS?/IO31rgS3Q:s.
+%VN1pg19LVs>01[6Vi^LXEiB_dl`2JGhUO8^=d<p3%7[7f45`I+i[#t:,>NVdXV2hH?P"W<b#`FXD(!aeT0sD^EqF(4r785.]2fAE
+%J]3hN=h$it\>J4H25ct-2JpAFN)SRSj&`8GP2tk#PA2mo0mn=-C?O[>'uD&:mf-8u<0l%bFS:kGncd=.WbFX/1$(DEJ"5cAM.M,u
+%m$G=[%j<*2%dB"f-uu3Nba4^hiEBL@[+u3W9<h7SFZdN39$q7o[k(V/6VfFC'7Ear<g,q1cs4hg&N+8$d-]t<;oNsV%[tD2_)3[A
+%P0Vj3HOp4'\ML^7hX<1Eht^sQQ<nNS5&P&M&#hO/HtaS61TmH_aC4mPM$(R5B;0"BBjco2q(fd7d%_,Drack6A>B]0$pX+rfb;NS
+%Gh?j&%1(=cifSfuR:YFn0iuC=I2Qql_S%Ljf):=bPAs>YEskseEfo54I?75mVS9Q:D!)m)YMmO_%?WC-QtnH>3YA#S2WD;=/=#*R
+%bld7_Am7F>(</G!#(meFooc^"]d7pd:CHE*8[V+f]d,7LpVV"2_M!/*D$G?Z\_Y at FQCi1L:rh)j>^IP.Yk^\d6GL=F]YX93Xl+WV
+%A-ph70.)tWUYS*t<>LSMMa<!IC'tprXtikL;/rhTVGfMlZjqDM(<HC_r at n)u/XO%s2S\iB$Dua!2R$?^40IJWMnU-[fGH=j at hi?m
+%R<IP,4M7f;)DjhEQd`jtiVW_Ccfq2p=d.G-1KF&>g%.AhOGhZS**0/rNq_d[TBr#FY+:-[Gi^QS5"h[slCu1cn9*["Vc'5>ot!?]
+%j,OV4A0djfPcVo7>7WE.cpHC:Bb/8?q+nMKn7GGsq3_-K4ph4%hSl$.MKSOgCr[m';h&3PRYP54dS.&gYLIF]2KH`Qh4/TXF*AO>
+%Renhc49j!PKggP^l]QAEO9,5FJ6PYs?Pmc6l%ShRZ)M;^No(RJANc#m:uGk^=3<bomG(P1]"A3O+gomV='t]daap@#l'A;$F]-W/
+%<Ek$R at _autMM&>M3Wg=h-!aKj'd+rci<"=52gM$+S+3gTqp*1HCX3eg>VS]hi=64c\iVFRZL+hIT03eKrS*"%U<JF8;!9'$Q["XG
+%C.HEIo0l]F`_=bMCQ#O%T;<(!h`59*>cib\;TAnpP*Oj?g*TBn$U=3m:>IOODAIeWGWQ7e+kUcBhsAr]-,ga,Q,B=(_)Y.nI=.AT
+%PXO#nO#&qghJ(c"H]r)5ea"#^PVVd5--J$YVJi%0)4h4CV'Yoc2msNe9 at _.b#3i%I$"T98K9Ide`TbG^OE'43k[5\`Ho/Fbd7^kk
+%][#7nB*LXoc*.UnkJUY"RdQ[sb1r#lClI!k\K40nHJ:mlq>%*ShIJom6&&L$%$Ye#BZ[h/>#2%ZIL=/,UKD96k9Vpu;nF5,QlF>O
+%?DtX"0opKd.hUhV@)GS4fuDL\GJb8!+Oj&(3RC#.`3-S0&0Uc3eHRJ8\NG/8enTfBR6+N6W%9OPS<@a0[nEC#.btLlF3>;`NF<&i
+%_.o1$VrF(A7c-k#%uCL9+\4:@o!P*8SGLZZQqloCC)@O"b-e3IJ\EoSqJJGhOGe))_bo_gFA/F-UoFK*;E;r:k&8UF9)[!\0HiP]
+%q..p^XMcS'-Is(;jL?jd!jg->0o21&<]g#F;ohJW914)E1X;6[+7^Z>aLp;l1J8?\Vc142.,MOIcT!csC#`P$!_/4OKn&79JK,ID
+%YE"ul]gosuqbiLeF?`lOg#"tI(T^:51g?%KW'/n+Wa`6/<\^!K8s!b`I^e\Nkc$XrWKXrH(WQCm;s8YjgM&"=0E7?4UDOE3;]"dg
+%.4CHHME")Gq>8:%\!9%B/W#0b?k$/135O"_?C`sm2D+b2m@^Ie%2mB/Qp``7.R?_eQml8MFn<K2"VZM/H4+3!^UV&#S[N[fXTij"
+%D:=N:n'bC#fhBn9M!$756_1&>rFc:W;(dZ=dFba3T9#29,f,s8 at ZnRrgN`5L_VaN5d\DD at fMU:R5P$[4G(kM^$#Vmsb=;;T[+Q+-
+%Q8 at _Ge#+1]?WY'e@`q):'L>X-^lWK73iKXR8[#';LLeGu5&b%8 at 1iJ4.hQMH-Gl[;4cr;/oo/Uq"L*rdSJH4_r3E5[C;=$=1'j^M
+%I\0/1ohMsQVF^(X1'X`8K\:E]]*HA<1*t8BcPlW)%F\t8!E.0a(8X\cWH&+A"e$GNFs#DSHjd at _#mDf;SD/H<*DbII^ZJ&-D?Y&f
+%<_sms_FJ1I_%3mc+,FIk=^5L.pd#tN:)]A]X!`L6gJZ9 at eT<'A,h)4'CTlY=o*X1 at 4)>]WP,AjQ(:(DNY^5SA9Am:]N*Ml)iDN at D
+%6]q[o;A<qjDgjb`O)9Y;H6/$`DWl(CHQraRZSSNFF?:?bBq:mF-u=#Qnkdn[^[F:4goKa&XZ?u95QhBb4>!@M\MfWr]cL2u*t'Y1
+%<>_9T8h.$Nl*27^OH+iN\GE>g">7X at XjZUH&f>Guq5?4k5k^IelCnu9qYfeNSO;AWCJI$Sbd/u[CM-)=ce6M7LFOBJr+eO"-^\`Z
+%=DGQ;^$XmF,YkNp62rIDaR]C%+TuMaOUn7qkJb#!^(dWk at _45.D,7OR.+%.A^'IrWa7tfCf$96t<VTG;q98CTphJPaI*dKI)MdSA
+%Rm`_a(c`jcQc@'$SSM5egr>qM7nc$%2!?reL_SCIiF;;:X;i at Q>;RD at AciOUDVU!pGb9hrOO+Y+Icn27 at bln1'p%6c-A[*q76e3D
+%0oda('ts">EqN&3#Y<?fZX',4P!iIa7Pb(0l`8`E+1gfdkUJg^'C8EsaC0$!Ls$5WaY2["#k9N5*2hu?W9iX45kM#D\/A6p>dAn9
+%J0U3jWLN at um']?#]9)2LlCMQ]l27]*6(m_(fSD""eDc$RZg^oN;2A#mpZ3(g&eQ!8k>;JR;V"E_3i71LY7qCiZCg/&^S$RRf[3XJ
+%]Vom3?V*^QZHIFp&`OL)K()L9%(shP(obn]mW!84#<['>?!W\oK>Ii<qtarQnZnAHW6#fW)Z?Q;'.CqbAP/]DMlBc3&g>SO'E!lr
+%Ej*W$)2h6:roML6(j12XH/pf&)^AImHpP>t:Ju$ib#k<$lH.*$/ttBW&a"k[juK=W*#NU6L88e!BeXGIS8[\?C'_ItUsqdkD9O8V
+%b2umI3jBH'SFn=*^KLWM%AXU;%>5:'^-`Da0pOpiMBP*RTU/r8-IiR:Tm_*pZkS+65M#%[?/SUWKdtD#%cS?T%G'c'PO^d]YTB&Q
+%HTi_.\K#O@/UE_kmT=4Jo^#pmkI*'8:T+ca*@3/h%*?GB"qg&f_?G_);XCT0+5`ML[-t*3G,EeHn=.Bd_]EAi5$LWg?>93Oj4`Yd
+%aGaXY[U'lP=$lQ+36fj[;9G2+jQ0ps"N*9[c#W3AS<PUugHo)hj^gG'J5rp0)$NY[Z#%4/$".!:Gfn5o4l5bgfF/n-g.Q[K/cq*R
+%UYGRYh]F`'RK.^\^<u*tkmrHAC7`0MVljq&oHYj5G-6\P'N2iMk_arLZRZqP7_cJVPqCst4d)Sqk;#i2W6N+*A]U8XKJqe"lgUFu
+%;euZQCF0o`:C:76_Z#q5=GaejK at F]X43`&.Gtjp%&pgH&dr-b,N`'8V,e]7f?W_37k?(dZVT-k<:[K4YhjC+5]%VWY+eErK>cbWa
+%5F7.fK8!O";N^CL)-2>u@`_A5Go7U]W&hSC?F)%XnCpJBTLbQefc*NPpi+)2TAZ7&Q(i,h5o>!Ak;&,/[TQ#YFcc+G@%la/qTt";
+%=,MZ12p'P3U+/ra`6nM3`8Ob+,s]eBa*UpeZG(.$92EH9@*'3[\la)=/j/F7;C8b2$QGDm0 at a%)6VapYk&!-L,('&)&7V&\1[XV$
+%RI*.CCWbBhD,Zh`'^C0Kp&`;3h#"GuY+-/$.M)>j4b\Y"RnPkp4\236;W`l!bd5Jd7,JS('$VJocpA[+63![Wb<*EC#$E6D::'M_
+%%!'u`cRkj\XZ8cI\_^%R+n=_)G'idXGokr%:/?r*>jcm8cJ"Um_N,fMqYf74+OndWDjUcj/E`Li']"Ch!iqN>N2^=0?UJ#^/=<!K
+%@H[W`Xe$VDm41IFV7^]`2`VUuZ'[)s#Su<<>Ot`XomL)pHP.]*.Mj=k`0n>@785PT5'"`B,+?>?%3E(MESdUAFuL'98=p(oShF6W
+%=-I^#;L7/rp%]u5^dB3p91V5dF,<3o,7s6Gp(UMSI"-QB=]=/@jkjaU%*Fu`XVbdf;_b[k/kF*d88XYpWtB-Ip(;gGD&/A0gDT(]
+%j[nl6JI%P(rNY?F.)VrF8uUPq/f]@qI84_O3cmi31!bUV$B9m1FaTpIprm,r)FT4oJ#8YF1f2tF;dK@!R\k4lS$sIRUpgENXZ/WR
+%_o^9&:OtRCW%!(0pV'=VY,Nsr";^]<^1k_F_dI%rZLi04QPF&rA9ifpc at r^X#Mpcc`UYDfU(XS7oDVZN-?El"YfmSp$DK\DghfjU
+%d`a.=I^_&C\Tp7_(F<e`KiR6ooi;HfH,D"D/)?_#6W:j7(jsfFIZYm)RcTW9[.C\bf7cM4X&B2m.77C.m(^tRTuYR:NpFL;.Ok1W
+%?!(e'q*VR5h7d5'-Gb?iU,"BUY(eC)kClPfn[+(C)#&`7ZG,Zk?3rbgSsZP0m9$RTTR]n*Y at s5>1]pYV\)`QbXtn8EKd?]<A-!X<
+%1R73Z-<^?87J)*PM3#I>n4TiVj9c`COS`#lNd:8O,R<qV!0oE-0n?8 at caBE%nfULb]#g=E&!t`qVeYh,;@_VR=tHKs?93Y=pQpBX
+%=O@:=_3GP>)o51JFXV<Li!nZ&V%q\,b"'V%c5C2eGFf=o>\#:McX-7Sk+2^[&p6l_j#PNNd5!*S2D2V^M,0BIG@(:'Jn5>!<b0K$
+%Kfi?$ep^d0Aga'!850KX1iIegF^N^0m_$a!C13_-;0>!!.M4;ic;X"R#k'tp'sMLHIT+@@("]MJB/SUPIj8m1+i5h^UG8KX*rW+"
+%o[-8X$[F,fV;TM`$_k_9\ZMH$0;UfOE#O6f-tB(j43kr/>#H>GbN/0\#Mn)6L]YQBC<h=]fa6g]NVn#)Lj`b;L)9A#E`jnmq`L"c
+%#_7SWQ'ST/U1Xsco(,?dCTWuYdipneA]<lZ_&dFOFq6VM9PI%B[+cfRf"1N$Zr'jkY5ZHS>&^1[!L!^d&-l4tNBP?'*0bX+P68o=
+%hpZ;Vqlh0JRlR,tNZM`&)R>N587D25!"#\B<SUu>fc7HG3bV?l16`6Q']aNRBKJL_YCbf/Hb.To?F<X3c*W&Q#\L&Y>]S`dC^coD
+%KHC0Q-9#ME at 1T?,Y at BC_dMom6"D'K`X?B,;YT5l1rT0q'fb6*7pQ<=k*@2R9/Zps:A4($Z.dWmfh=HOZ9\]!GP^C`Z6Q;*j'9j1r
+%n5X&B at HHmrEn@oYs5ZY^&Q.$9g%+Yd!ghen&=s;HHPFf<5Q)oH^Cl6/E^!UC4\<F_ljfaGiE+6D(+RhZR at CQB+iErb\!4,-.;G#[
+%*d-==Ln818GTEab8#IT)q"rG[=md`8Nprjne@)#iqF9#8TJ<<dWSii at ca7Fb9(d-1E89?:Vmcm_-!g,F[sXJ<5U6M=-8D)e3\rE_
+%@@`)*M#YgXX-4Md5!5;T.F=[&p.XlJ^knSs4d`LU7)9rg.'J:hB&IT&qSjlEZ#LDXadqBNP)3bH,9_XH0@`:fChI%5'mIlUJ<K_Q
+%Qb93][lp83.BFVDi^0pg)u!MRT^q#iY=.h0d4TG(P<8A"2MB:h<cmhI<8Co&_<Yc^j at EC]PQ"Jfnj'O"r_640T+[287Jh4FSNhT>
+%\kCmA'3U&VB&G[#B(/*Gej^-/GYa$^qjPHT,FHjXXo"c*@&<8>hZ5XGBotQSp2k>Nd*E`=?W>pY,(AXDcBI5hQ-'W^RahNJricTt
+%UUY?Ek2k@%e4Ja]ZhX`LY0>FB at SGmm8jPZ"2O3-Ds- at .cEM/+7b-=(DkJ$;L./r@,>&[-#9[0;*Z&5s2p.q>6gj!Zsc*L48XgoDA
+%9qK7ks-@$K0qrT5op)(Wr^7>0JRj(UM+i1.es8<q0HO"E[GaPm:7eo1O^MXSpX4YkaKfWsi)8.+q=8V3;uQ)AO:.dQYVN&R]]N'K
+%S-#aDpTMPrNBm"DrgUK&qQUgB"!3`p!u%:"U-a1SqGK)Ej=KTc?LQh&Un=d(#S[OUq^`_Jdmb8kZXCinZ$AAi1B/+WJkr9+CC]@?
+%FQGDoaap:Ef."!WBG\K$WD;.+p>sFuG_=$tFduEkRXS9E.4u-fkl'TZ#J6:[06VA`NaTYD:TjLW?:S4=^YNIm/.5N-4'Jt!p:WJ:
+%-iV4R%el);-VR/W61)s59J,7DmtoIlI30+;%-[[fcHot)UfIu4b_3d+m,FK/+hFQu&^Zn?(rPu+(nM+o.AAGsA(K[]il*[C;9V\H
+%.D]I<MNj:]Nn2DH-g7[8-=Rd8l2UsUjqRCJZ*05trh`60cTNU\FAQN)cY`]gn4^h-QHe7C=.q,:abd\'pl!;@e5t9t8uU^I^2"(>
+%pEP3mkNh3JDl,6<O]%D*q5Q*U.uOjUegNWSh,GUeZ;N0S,%e,,<L)TI$D*[!Au_gfmsPQ#)(l_.j_E$U3c1/*@T]:(!8BTea)D1L
+%F^(d+ at m]b5V#B?#>WM>RpJ^9,.1eVC4%2SW`lFM4gR$%n\tqM65KLM5EIeaP-BYLuCJdt].ARVKm40I)[[ZU;_P/K`Ca[NP8rnAI
+%FEl$=b]uZVr\emj9!C6C5lQ5tf)F*hbVPX_13R<^H>ZX`rHkH_n,C_*cm<FRl>M#=r,ZX"Y'7)1`lgo005dEC_(At4@)5;K45Ns*
+%>^na.EG!<=>HQ6>q5=db\`gXMR6S6aUcUY(M?Rmn=S/FZkmhQ:-=lP-,pF[+?Xk7R;J?A at M$hjSTO7,N5<:.Y2e^2H`gA?I]^Z2I
+%;VI7jo%3UPo:5L)8&Hig$o1DP^ju'MZ65<OY;i8WKnW!#8_)4$Rk+/H0FVZ^I(V3dIW>[7(N^Rn*\_r$<9[M:8YJB9+cr#>il5qg
+%g_(Vj7"oi6O#nKL_nFUs81Z.>V\N(mXR9&AV at W+,I2!q:gpgEL3MBX+\i+ca^=3dpo/lX64I<Gq#tZVV]<22+.7W2<!j>.A3U4)*
+%Tk\>M:%.7<:^O^C1mkR1-dVF9PMc"IITb(%8Jq).Ms3I$^8o\GRlh6$YPBc6=R;`RGq/Q,_A)tWbtCX!8%^KOpB at o;cRj)?NSZ#r
+%W#u60RM(_O"^$.oKF- at p$b<A-S7g\]:oD\W#82aHq<27XrHkKgh5$G(eD>\2p9HI^gc3X8%<]#IogcM@^OU"d_hj;K[I*8[I/]!(
+%I#5u at Tso`r)f9/g1aeH5[*,O*0:!JR_fWudV%["6M&%)b+;K<p>`p2NSS`#L1bGBbrUbEuKY8eK3Rf<9^7-UKm$d,,iPa+]CQoA,
+%Q=Q27)q7,R]hb?S*K*'^38Y/g]a$.ID-0O.qD>&,gL1/Po2#*,0-V.n17Kc86jGhf at DG!LY_,>#]`BrJiD+P2Y_!<XgaB\<:[i<;
+%[E<r+S`GqE45GICcI1j/bD0k"G="V=p&-,=S3eF7\7.S`$)D5QW/S74H2,3<[4Jl#FDd7-DN2)n5I[g&VYWW:D1;4$8_$:L=
+%i-o_dp8F]u.MqseGu<:tr)oqP5dL7V2p#(f*4F!Z4]:]ap$@Xbpt[W7C>\uOXntZ7>td;Y_^=*"%'n.u#^AFt(Lt;TbY_5d0BK9j
+%Yup#=Oue<soiE=/1-N0i"&\BF.E0+ZG?AYhUoFHmF:G0dT1L+)e&<G7F7S+aeiB#?c/MN5[l/*;^#AhL.[P9%/1*-Ae.Vsc4u.9f
+%hjT48EqB!Br1_ZS)SlUU>l0p;&<n%pSGYo`4Olk.%(SB7-V+JCV2dgs>TRK8CTUO%2\Du,aPRIC6-il7nZ$r'ZeLQpH.1m:-2=n6
+%G?!=da-(+7NK&QA57:lecpBB at EGf?hLD>Z$dn(0V-<)-jUcIo_)H!dN/+_\aI%8]u/-6t%?TAJ5'.DW2Y:`]"XIS!<32^A:Gm4::
+%Q4Ri3_h>>+aV+6<Y;.[baXeg<#\G_^)$0,5dQ,t8VTND>U^;6DZoF82XPaR`CWD,IIHH3F8>8^;>Kp[TJKTaI6*o`aTBr)t=W<8j
+%)*qtjA^^n?mVeiBi9[eu`$"'(cYOh_O]YcQG[;?.'i+-#jG5jr``]e(NM??=Yl*2?>,QBu&*J/F8/!bA^$Aq[isV2 at S9odI6GTO(
+%Q:N42$FfoQ87O"K]Zt)],\&Z)@s5.rJbubRlB<a6Z>k/5UAM=u7O`=ug at Qdo"7D`Xdomd+!.qM at b15$GSPDE0n$OGik<%ag*_`[i
+%aI_'DR-&qM?`cs>P"d<\(<!GF/=)3H0`@\/L!2J/3=u(b\7Z55bKj,7NdP.jpTqX?,*#78G^2<-ec1EHB at chp#?%(]Hb^W`;JQF%
+%ht$?J"+q(E<icG.O"FQLBF;o at 8(R($E6QQsCLI+%I/Vi38d._DD<b at 0m*L6ff90UW?M;dZeJ(mB`fj01^/fnkIA:R=OP.BAKgMg`
+%l/>2_7k^u(L[8?S(fHUcS.`MDDS$G,SfB";obO\!3s'(:C3E+=I_sGf2iprm0l:*m#irU82QMEFPO55<0B_FZ)Cr_%9rH_urMg;$
+%!7l!*Jg;]I&5CoP<$LXjT.k_>Tr3A-rDH'Kbb#!F3m!PtX>d-Eb%m=Un*3kic%8r%_GWoL.LHXPC>NumfO4?A8=<+he=8`o_OBFU
+%UNEW!YViG*NE'3Njc\Dk30J3Hs5gm]@SC"mk15a/F%m2/Q9<r#.lAmG'qJcJSSM+4dX<r;%)WaG$ks#@i2E%i=rkl4Y`t?(*,q"S
+%E$Voo`9%,Jra;kucq,a34``.V-M\\0j3tqmi:tTHZDYQ"ONlK9]+.#;RmYJ>#r!"nZ&2#C43Icacg.!@?/3q?'cXOQI.$9#!Yq*@
+%SC;<d]pon1cFbNL5=M:*kPWE]?M:3#=c[+:X7E+U8pMZPO4r1SU%A)N4"Egjb4V4iK;D]Ts5"bdfRdq7X-i[%-1U4c?`\#5JK(l;
+%J?Y=hWBW\jk"?/Q"$k8M5#e#ff^G.N3&U;6fe&aXjh'["Hu^kAbA4drnU9*fHn>\u]@;?Q5d:N+>7F4#R-0sEP3HSM"ocKX74O^`
+%=;uRTp!A\X?FBRB2JnDG`C at gGC\jEEfD/UVJT0G7R5sBZi"Ne-6j:jFUaR*5=<2%XQDjJon=M3f,DWs<M8<4%2X]*%^BlFdRMBQ%
+%1&PF4peldOgT]MS3c.3$,62S0&G]R/jPt1i=4\].=bjnn at IDss,fV*kU1(db/q<LSJjJ*FVqfI#]4;_HEq$5Mm],+)KYG-,?)p)E
+%77i]0bYdIAWr"Buil4!g=fLtPfjM#45s%%Mam1'&_^BLjlsu&R&H'bCEe?O_=Bjt`PDiVIFglqqLcoUE:%obA)VIOu</s3Og]Csu
+%UcQ[Rg;*OZ2<@0]9^2sWpUZMJ&4'/bp+P_/_u:o=%7Nbpji'enPE'5km<!H5Tm1t1Yb7>3;j.OG&Wa/[ERGIXDLlN,+\]B at B`r=f
+%k at RMT$EGG at coO+0ksV2Kof($E933TF_S+7P:5V$(+dH'1j$CUA3NXOn-PnA%W&UJ6Gj=R_*F'Nr3iqBgmNnd5#ut`oS-gT'JS!kQ
+%#C]LSFguI`!if.^[NqSW\g(/Dg.O3me50lGl#-V0STO%K>FRQ<!JhN68WDb(\R#=_o,#2#Afj+I[TiT8VHD(TeBR*Wmf?<e2A5G!
+%n6#bs3Tj#4XpS9(>fINi"P^q7cIHTuj5f<^-ErrS;Ir:Kc9KIt88MUHiGn7p!k$aA(t<T>fjraV^j+pPJUN`4S?+NKI0Y.B;!C9%
+%i"DNSfU9]qCR^NBh!o+=mRL*HSWPCG0o="a(Es>i`Ib3-^r,Vi:"9jrboO)V&r.b]aeL8Of#"9.Y2fJb0/SJLY at F<s<'?k`]>8bA
+%4dTNmkEJeX]^&H9;D09A7?E\taI1(3X,he&e92\rdTri^3fO1,aYVu<\]2*NrjlfW?5,m`&PC<O:!FA')^P;_Va^csPtth`(Mf-\
+%Oi3Sb@``U^apeubX-MYu1bEk,Qbk/Uk$IpA/7*9%n'a00OVWnXe?s3HJ-6J?4:(pqGq7dt;]lh2a7kbrfq+?D%q>M14iKUAfL8H?
+%^Pc[=$Z.<ffPPIPnA>Ur/.V2NhVDFso#>8g1bT1Sj>D.G^Zi%=EDW_.=h[mG3#,-4-&I`4<,uV1Ek`^HD+NMe5;LV]Dl@"GGUD\B
+%ZGn=4hKbf3)Qj_`Ktm828Q+=n%P!I=*<eW)0+r!uEaEUg\62p<ObQRsfTQI(n1>R9qTDsoVtCO.Dkn;;N9]lt:#>$!;Nga5c<-:,
+%`bkF"$16_#-_t*orjEKnW_ei;I[VNYg,#"1F5s]c54cZ(D`5QY?+B at A*m3(nVil7g8WAXpM5;M!,+`iV1lp]\m5I1_/GL-aE\[et
+%1/8<WMVjm"p5Pkir<e_6[N at J4T_?.LGGrei-1d,S&6#q(9B>R=D?Xh.Rlmi]a)5(gcZ)KPoLpO$,0;_(cnGTS.gj*DinR+%S&h"d
+%,.5ug'5XEMGTJq`]'l*!V=1g`!bl)d2ODce@"Ni7qP9Q33QcWA`Cc9GheMINJ"c"[0*.)\7<U1A6d$VXGINXZ5r`P=YOFU-BW:5n
+%U[hX1RAI^DK4P*i\JaSH,rbJ3ASO?j<dlB\$(gtUT7qI3C51\@eJ[NBI*L!)A4o*pVZ8eS#0lsG3I%s"!7#=c at 0i3=OQtRANV,6Y
+%Pel3$QYC=Q=eacN>2cH=C3;=D""i2*s'=s=5Q\>k+P`?(]mk@)_$2@/4lrK]e<cpoRLhu\=WlRPRV+&?+k-%RVI?/$*u&m9A%=_k
+%NNT7PRqb(kkP%tC/?&pdI;e7q`Xe#Tk4H[MHiPIFO<?mL$[1,[6>=m`S+J;!Sn*@I&X[M9EfjqRPH=FTk"@m1&o6o4?63rQA5;2i
+%CU]05I9\D_e3Pa[QPK-ta+p(tAY#t[7'm>eWBKK3GdIbRqF0.S3;gib3Y!PJ(r*&]c=qD1(Z\ptC&Ha`WrpLqqtY(D&Mjrk/^sT,
+%hfNRD-.8D3VsA-RYBQ4gib#(uc;EZfD$RgY#0;!PVaC'j,g3JF;l+XIfMkLBe<VO^=*:Y9pD,=XHngq_H$=XdPT)8!>Llm+1I2VX
+%Mt>1#G`h\\3bE?bIH2$1k2d9G"B[8j(?-3U,"Q9Qc+D)hk%5T#TmB&&_#";AP;6o+g%j)E$h3#"U2eS1S3K8GW at J3W95USj],Tl;
+%,9XL9'[NCS'@nh>E\!QY4T5KJ"<4)*I"_*4X\;hU@`D60)M-*@H84iNfiSF>K+i[Z_]hDhe2N=^Essos7_ictj#.XI`u_$COFqH4
+%<%<0u*^@?oo!Z_&=:3I#]aK_BRjZSafG*Kr60MbT:g6ie8R&G_mf!^J0%`_jDN-IN8fejcTWkO`E(jXc[Br7#>qFp4;X*V5`4A%I
+%K5Tkm`Ol='0sss<@S3G^=Qq-1(&2 at u*4(AmD at L!^"#*Vh>XmYB_#t!#P*:*=S.=/n!B,EY2k(reqQ^Mq)$tmmZ')[,E(ub2&63#]
+%dD%?U-jOW3Hj3sLef6RBm]idWpoVuE^SUms%Sd2tohTl"VLuPOR*8@;b;gq\Qs at t[j(D"ok*/0;%7eM)qBuR(q/aT6Ya'1Qq=rB\
+%H?7R"d4Mu>6CB at _Hr1/39OR8,->C=uae'[&iW,?<`B3Ur]_%j)En at h"iKbShP:N0$?ASna>()J1<Wl0iO1BA&GMW`jo at S+YoAGh#
+%q_aq0L=I$mH"6lZBj9<4 at m%:VTYdT$aLTTo89fN78Im;oV[3oEi\NGdcLTn7)Ut?01nGDQgOZAAr/Q8HEY<!ud5\eC<4\7EP0`f/
+%<X0f*0Mmr[McoTIBgOIO?9?7ckiBg1S[Y$^(9+lcjMhGs]aOKY/b,h<b731ChWiX`?- at d8+0D`^JoC[d#iGAq0jGCg)qIoKik^`M
+%m(Ys&3rgC;ckO<VkIM6s_<FQdQY?>FG-$U6mloQgm7ahM^e_P`*?B)KXCqt_'u at N`hCrEXZ<E(35Fci!Rn8qk/6Q1ngZS9W,%j(\
+%EE at cM$;E0j3r?a,Ul5/%q_^ZMC(WU#JnMGGpF":kO6<nkQuC"jWKAsR9;KC_Z&)NH%-LII*!^qjW'#O<i1-S)p*D3+;`d:.@@Mt!
+%lH#:u;G?&jgP&^8MJ:7.JLGqXK"eLn=S*P-9;mgu+uoFnP?:JFQ>>[E:a^[_`1D:(f at djf'Ofh=f(qdlZ'cI6"o%r;G,Cf*N(&bb
+%H?geZQiO^(ABct?f-dhNk_S>";F5jfD]eAL4Cra!Hir6NPW>UMa-eI(4CXXopA<Io at 9t5>Bh2YTG>e6&CiF"b1M0f^l0C]U&^,Ao
+%HqJ&]dUJZ.5]",h3lY]:?W^O&.(!IIVsQC6[o=)RC5F<'kGdQ*-F3l]V1caUIIbigZDGbD[/1Od^LaR)U3eQJo;)$0n at fZ1-n2j6
+%Sj()F2s$DCG>U6!gXHDT4sMLM$F/$DjUBO=NBFkjM:VoeYJ54r>"d9E3>9??gjcWZ$,-dK0-f0*D(HTj6&lP#V7f.c\W8ml105s,
+%^!f\Mc*6IA,tG[qJU.2[D@!5b9P!:AGF?1BHdh5W;ID(hb)@qE=fo[)8%^+2M#"&`bA;XpI:k7?D*a'\cO!Buo"-kNB<lOr>7`RR
+%n0I5i+KU8$/T&iKF!+Lij-*G7hCY"+s5iE+c'0BeRWd)%#5mn[0i^D<J7-:6c1f)f,0oHLkG;P+9_LBh[UAU[0`gc,VC^ObR::A4
+%C'up)mo#[!4g6a<Mi?B5&`jGT>n1&9q:W,]<BKs52Kp-.TC>I$OTVLZE:\*DK1`!0I"5I`F.nScXN:@UDKK83WOuJ8H^\.^-$,+"
+%\nMR\YPtgcAj;)BCVF`\M>14,7XfWKViFN!+-cR$Y at 0:Z:d8(.g$58+Nl$J=o-N!$@`(/d1mc;m#3IS&QpVkYTOrO(FOkj+bNpq)
+%nj)DB;VGh^mj@<+[)^Z'boQ"]a"&A."KF+n?)*((.\:G3c%Xf$(]urnh%g'h)9,SG,'-(?U.7u-CI<5Bg(TE`=Q/1Y?;H0*^LN;B
+%\4F%/n*\o&Rrh\e#D4ZtXP)McTZG$ZP>,';S187KGZNhj;JG2CddQdi;IH01>.Iu0^ahbV6ADs.9M=MSo4CJ-eXIqQ\#l]gdsQ42
+%he4,XY,ps\k-PQN![%*jMd%:2rXDgOZ]`Y+B2$X:$LDUIr8UL at 2O.HrKuK+,Rj%0>;`.,h8njN:rqca[nm6.V(gA7oP?pggk')uT
+%`X]\D6qAU)1(:J)J^ar&?WbT[WUj?3"A6a24k4moUhVZ/fl^#<U1pD$9J\cnPPo=Gn1n]7bHshnM3-S*DM;P1=a>oEZ346D]YhmF
+%f>a+PP%-8!V:JVUq%"f*9Kud-M0nN)?*Ku-eq6uoX8 at kq9Ic<`:=ALM at K06pU,&([*rAC:kK\E2/E]]?,mmF4C!`kd+jWIT'Ukl<
+%QA<[SRnP^jOm`VcI&`$Ed(]Ut=Xq[g`.4-)fYY/-1It)P3":H&0^%[c-!6aa-C:"*4+AC3I1PhuhqKR],]l4qA#X'=i#EME2f&YT
+%NWG:D%s7$69dDg[-u?!BO"/^d!>YtjK8)C$6d at r+%FL7Zj/^>1:Z&kIi3ToNKZ!nbh$[QHX8nS$\3s*bA'TI!\pU%&Jo2N%3TCPF
+%+/tGb)6H<,Osdgl#[D!Lp]SuCB:#H=%TDr8nr1SEoplKToIFqoK*uX#P,O:iC`ZssER'%T>V]5D[7U=5c=FFbCdjJO\0^,,@\8mD
+%YhP>31:s(S&h0s.":n40dh^l,1S)Bqq;k<$7VR&,Z/bp5Ifu##H]6H"BH*qD*j/RiCABA.dX]o4"0ZXJ"g6rq"c7ZPN3V)D:,3uc
+%Q at iI:Gj'JAWQY.'#9PoV6Ke!qB`I;dBZDF3-UU25\$^tiC%tRj8aQK^5&PI]8%t>cB7Sq4pcu4!CGL%Q780iMMHBE42aI6;k*BB]
+%&B,g=Gp]Cdpij3:b1H+3/[Bsu`?9X_fn/%!l<Z)g]hLquX'o6T])>%/`\F%G`:oP^CSKct<@ne[ja7UJ/6(Phbh"N#^@R2"kEolI
+%r?7%$OIlgp9E*me\.;np]L;Lg=n62 at eWFTcS-,`n<t/I"8RK,jWLK+?3Tu5'=a7-$6tC[t\8nCMG\pOCi[&q'X8l-hf[X2CpUt/:
+%h'qCls#,57WD<`WKY0<O28MiM\:[Lh@,XZcI-'9N$6?1TK584B2VmT%D"JnBlh5][#_jJhI1TA'VRQ/6B.pa^I]$6M1DPs,&GuGd
+%-g.=kjL',6:ZmW>LK!C\+V_RC7c:HN_OD7lgN2%?iTQT3[Q*!_F:6joJDHQ,G_/JJig'^SG_HfLh+"m!l60<53.EiD(q-729<$45
+%,"T=Ue8`j?=1[Ir,_R-DL`[_Rc:^7V1#]pE`OSC4-a7XX(YK&64loSF)OXWD:n/<0W/,qKCAGD"o';2NZEZGbQF[>N'TUV$qB/3e
+%Rr\-s8R6cU#AWBDh]:3s5uN:o;m7#q2&/JB"o??1ZEi3jP3*iAq"U^Ak!tq?4P`0fOsTglqlar,A:S&&UU)M3CpM+%Y at h>k5V\KO
+%!J!af.,k'!jlV6`[Rq$>[JcdrTH<qHCI+Ia\qq^Q1`931"GeDr2("Y;A!YG!lu'MXfUf>>(?hD]kboC%*;8G'Xj=QllJ.p-7qZN:
+%SWf&#W9"dtRABKIfm8(!M2;b@%Rt-)^/OhfVPHQlaAGO&9\HL3^O4ed+L^E/Vj;W2!=tVgVD)2t3CX$FQg+611<h@'q)#l6^H,@^
+%@M<g<POBY715XSI6Z.>!=K;Hn8JRCRr2L>AR_O4p*ooo!4b39PoBud;K>_g><r;C*PMZc at b"a.kit,'`"@@-/7qr-(;*/"J at m/CR
+%;;,Cl,rj3#3Un&1c^tngi-O>$9fqCB`L[LT554j6-k0J*dIir+6087*mjJX;5Q>E>$3h<,^c9D!ET#[LgcmIAf\U>L`FL[Dou9_6
+%:<A?;DWN,c0D5b!IPK[25&Rp184T7Fi_iCSQ5jriV\"jJ4Naq)K@=],N'<Ygm4%qrf1bXZL8HmVHZ/t!9B'sT`gqJTZIQT:6>-DC
+%fM:=DQ at TFm)aXnnigV]mEV8oj)`]M\nVPZ0M^mU`Mp%p?+4lfH".q<mk4P7J[Be^iT]a-s0Dhi%,%n61%295"CA*ofbR3ooMtV,,
+%9c6r4MMD(bWfR!p)feF``fA=PBDY6n,S;31lm=R3XaP.NRf6^7#+tja7,9G5N$HQ'BMjBkngf>7'#gKB76MON,2lQD5WR4ILg\Pu
+%S["`Y_sb#&G>?VW`>Bjtfk14B-C;j^^&?W29/tNPUF@=X%9&-sH8[+oV-G<UH1MU4g<obFf#upLhAKj&W8"N=Vu at g;qq3tVWKkAC
+%RYp8Wk.!*4K:"Vh/$+rtRnPYOs2iO-[YP'W+S'6/Dn:MN/%=6LA5WNidU8"goTGAd'PKul!i[uM(`RZFdLPBlY2a`0`JR at K-j%Dp
+%lN&X48B"3/k/*7Y[ZdmF?+eXYA\XUu'XH84(j=09jCXK!J%O)l,ecIDoT\Un8m%jMZ==_``*:fl<j3r7PXR[P;RQK'gjsKA-*FhJ
+%P**qPY]e*t)NU[@Yj6ZU`?;8E:Pk0:ZCKXheKrF\>^UQ*Sb-R<1b,,S\<mcnaYrtkbKob8 at l/-*ZUmK/?&mK^jTQ[SXD`&Y?4C![
+%^Q2eEb`Ipm]=H,+[Boi13X$r`9NY3'^B+#%<'R at _@4RUY\f*Qq>;97hp,KX3:U3fA#95Q%nWSO\Ng!Sd!![?[PO/Y6>n#\n0bRbi
+%3$p$p%n=XXkgr%^SOi!?EcnO%Wn8Q:Qb1_5UVG;eXHcCklJ)>:=IGFhZKCT98)$(/fok$I$AK%BZ[kZ2MNUVa8?mT0g=#kFkDC/&
+%l'8"+^`3%]\DO*UZX at hpjCH;^T4P?@8oQOX-c+34R-iMBYCpRR&RJt,1U$#^@BjEqBmmT!T@!K"]1cLP7^C#GBYGoN0oI<5MnqQr
+%d$!^P9"!^V-Slb[o6Fos0+kcsF-`GPJU;.C;OL7VV?cZdjW.efL<?&`'m1QE5^8<up+*=u"GoP<>E,q.:oCi&guNLZjFP6q[-8+?
+%D^U<\4+H<m$[:`<Q2JU2e&K&Zpqc=n_h1`ec^.9!fk\t,K&i9B,.-?`-.nEN-1MQ=H at 6N`D.AX>,n>s]d14%ic5O4=)X.]A!HacC
+%@1#Nhq9/G[I[A3Qq4fUJ2.L^iK. at Ok.9tFqKrpW^.Y\@!3-m?5&9?]#_ at pJkr&gAdHtH[=l5LsUd5O;b7ctcQ,btFjN)-5TON=?R
+%f<Z]TXFscQC2Ji"?d)_[Y.;bu/6*T2euEO\ZqZ*oOOdP?6!XlKqBI(.a=Gmfnb68YJ+d$0YK*'bK<c/1 at X8FXo(ePUCY!r_5=T`J
+%IjM[o$Zg>';\BmhM_RrfpFQR?]`l=X$fucE-HZPdFpCa at +oHfCR[Pi6K>i3Afeg[+pR^u3A`_B7:N(?<DrVO$7XcL]Rn.KO6'eRn
+%@DGgW[.VVTqI3D#T`Lb[V@^l`5'#UYc5ToDf:_l*U5(,"+s\^;a6Sj1DA.8;U4__"=@)44>ZjLj+8'Y!j5%FqSh)HlYj4Y`h6%m&
+%;&DAGQXd`4QIm>'>;j(JE9U;kqFu75\eCB"c*d9>Ct(]+^]RcSeDq_NBXFmd=Pd"EY#H\E?"d1$D]klR6p1S^[V8;6E1GCr7bh2b
+%;C5&XSEolhNJ3CE'))]M50=tJ'`OD,BkaWs;a)9bFl-a3`]`?j`[m_Z^+FmcC$6tO^.]9eh!VTG1=\7&>#Q`F5&mAs`Nj`l*)_'s
+%"Yl+Z?W_I(ZKn;*k_97-h6pT9XeAI[bGi%?-ZYuk]X2[g[cE@<l>"a\g<UK&8(-^h&H=L4mi/oWi0V;@F\Kq,P0XJf`,O8L6`<#t
+%%bH at Ko4?3kRrBRqXNCJ!\S;"O9o'kZgcKQalS%-C&Y[c+#Nd-;HG2%AdIkbtJm9HPIS<tj>Sn^,_S,O)jNj]qNMbhr-gEJA-c<&c
+%oA@;O-ZriA.W(Rf)2!+5O_X=W;f+N at B@#<-F&<REm0cnd<@[!P)W7$<ChW3/U=Y7;Fm_P7JMQ<^a+M@"_>mkTj?OWo=:_Zi`)Vgi
+%aE0j[!HeD>)L8ONn;mQK?7Wl5.L>#1?>;`([3:BU3h'Cg*&8<cnDeY%,7r5J*I8jF+=.u8&%fQB9LOE`Q:H8Mdr,!U=5e6<YkU)5
+%j1U)C\PBtENQQ%nOsWu>[f#_OVk.7ICU-?g/WNaM*.qT,34YH:=J:)gD$GAuLO>1GbIl0)>qE]s9>Ll/g4&_`<U_?,>JDa`e at udK
+%Q`0e'i at 7X3Yh7c7C^4o4#GKYs&UisA#'H_(9jYSeo(^,\-uY&ER)1LI.rEYqc`[[P,[7nNf1VrPdT0t\GG#bE1q\F4nseF_Aa2OY
+%]K at N:G>DZ?)$*b=6::@9U)P6&-japII#$Q4,mC_K$+P8/LR+B=_f5Hh!RO5aDsc at +_/IJM)F7)?ois&cTO2%SpRcOihRNsMLrpJh
+%'qF4,<b):-NRfp;BcnU[@%M'[esKO#<9G`PZ'/?FKi;KJ`"ulcPd/>rdak3V0N*;"Xq[G/-bkWf<;u0^Djo!<^u1fY9OAi6d.8q'
+%9rL2*8\?>_Bth#4.OHYjD3dtrAr+]rrLPYJc[IDC,7?>D5#siLP"U[9"mXRgb4kLOY_9Z1f,OS/Nj/1-FLUaOVB=F-_kq7Y<>j^@
+%2&CiR;Gk:;rU59V]E!DDA'\S3LaMaV0UAV.V^MA^]V?nUYphg!0ci/b.;R;>bU6m\]SkSnK6<'Pq2@<3YPje[U5F6/$&"%OY4\T^
+%h%\lOL.X3WT$fbOHIJI#/Z!qh->JjtCUdRg\dGhJ7&I,sb1;(7PER5T=SCjtm7<*f.)%IdhqFTCG*^?NB2gnfO`AuO$OSV%0"!:T
+%=')DlefYdkGEWNbFg#Trk5hA<b-Ptj0pD84'Ti"?-".jrW=GmO#:Losk=mOo(_g7SKpmT95(fFc&U:C?*2/j^:I;D8$OR.\S,ea?
+%nK?8VNX.i5#8He"=%o>S^2Lq5e.fZ5DE0;meA&!$gfQP"(TV6-;n:*F=-!0ER]<0"`0 at CK9Jjd"EV%(GD2<h/_(>rH85?FRGa`Z]
+%?#o0$Hom<fQ`Y+.f>Dt`?uZ=U(l3*@`U at NdK[QV9Sem^e:h`A&Vk!';\Js/<39iJEc.\ZM^cc_]#:83Fo*Si?8bKh2InrOYNYI\&
+%7YDlN?te[L$1-DB0M4KFK.VrH[?n`72H[dJ@*5EY&U!R^"IjL'nh4o(J2'8D6%4n:+GE<k\1ES*g([V&=1<4^jgXq&D'4[Zk9"*N
+%@`erCN;8p%3grr6q6X!9cPI\AU2l>V]r-7RQ?jsi_VaOXVSPu0h7G%:J_A)\.!U\19A_:1QcfTiWlN?0C<QhcCPb6tQcGHXjnJul
+%mB`RLm$(Vff]0!s_'$rLa-'%Y&d_uD6"c3=#4\."iL;Gti'J!u8k6[ddVRIq]$/"B]R=!pCCp5_+Et3W-`0]5eY:*HgI'4ZNL'H;
+%$=P(+Tpc0a+B-tJ)Q"b']fWLKKGOtFqtRT]B;q[F-D<un1jQqs>Oc3dE at M4cpO7t#QK<J=jG\^E:o_7jr>sn)guSJ"1F(A*3OmqE
+%!r7(ZcI>>Q-7A+MnkT`Y(?Xn-D0%+`OO298>2EhH0o_=k]D"%*QU,/C'kl(`4GqanORVb,TO2jlQm3^Ke9'Mip at E)do<"XUXu6<n
+%,Vkf4*?XPmSjTtXF>mpiJcT)iO:@A*f`fpjcc5FJc#c_Op=upPCLU3,<&2uob-]rpndBb[Ik;Xlhgp%J%QrcH1pgIEPK8h=R^d9D
+%C)FS/e$kJS5iY&1GE4&#-Ds[=ng'[L+mcWqQ\<nT0A.WhoFVYse3]0k4C4_uZ<MZJ5\u1"VSg7CUraMi;,]N-Uq,XA$,_e+>@fh@
+%eu7;3dFcP3B*$Ka"7mb8J+VEiaS\;f<nr;f>Pm)BFdQ.9s2q(lo:XNs^LC:m2!9oAb_'-l"QbQ/\,"!tM,Hq;/_9,lRl9`S1+2<4
+%2<dB7*L;Yd*LY,s*'"IZ#If,mNc(&"S-'[[S)b0Co]0`BErh\\KOf/%l8;)hc:QDF'?fR-eOXT0/3TBqjo=CN-IRBR&sW/#\3*>K
+%2JPg at 9Subdoh@@]-&:6V-&B:ZeHmkPn$L>V7]#od7+Kq8m`m`ZeG:OGOO)%S(=+/?qg'q057/Ktd at LkeHaDfqjVoHb.p8&foSe_?
+%oBCP7PuEQ<1a_rtCT3ko+ckt(<iF_WPBeo0*)LS5JVG_U,Ie!,FYsu_S6R&>X&OMP!0`=+#T=P2U-ek)jICh&gbG?ia6WmR*PU+/
+%pr6`ahpO]0Mjp/H5%d:jIFeUW,DAOZW"1D)*n,%b&oB+(gB-(6GFea(]V>-?h]-=0G9<eLf!itgqq+U(YZ,nc(2_j>k:OY4<P'C"
+%c8d<s at 1PQtaM>2462qd"o9sEiEH:B;Bu[h0?HOsS\V,?'^`b\b`[,P:%LVoW;Xib1er>Q$0'Jl6RK5]\fuW>9NaKUi.S7\*HLL7$
+%>?*#=.ET3gm(dZ`DYcmR@;L1CJgPSa8SapOG,Q&fR?RD`^]3)%,;8#dVKD;L\m1d=cVahbA\L:]6XSi_BJC-L)(fh&>rM7:Zb]%*
+%\fY_pF.TKDIbN./_>.s'.j"*M::1a<Ih-/C@*9'f:DVd\6S34h#u(6lc)\t2;sYn+f/6o"k;ELgXW0qke.h*(ND>_)+3]mtE_bYk
+%9rI!i[SkhOpNT7.OiL.9rQ%k?g4$u2o[,36esn[6V/9PIR]j+43XB!('6d>n:(3JuRkS:]+TYK?j=b)l=VErkJU%0(U)aea;Y&bj
+%FnD1Xk$]4T*h98.j97\o8!qt862\B#q-^MkD\)lAViS$FDeJn3q/M69flN_=9-a0/#Sk+aqB%mQmF[%_i575lQaUkl0M,c]r__g)
+%CbQs1%[,Wand72U9E)1RT[@BKXa[V28P,O;+>M*o'/#S$0*e7,=mn3_9a#0 at 6ZOElV:GsQg7Bt>Po<Gui10Md[r(L-F:&H!cupo0
+%Y&bVLBl-`;OS5LEJiBBko&L?gWH&V-nq(l`(nbhVcB"Zt@%'467pFf`O+hJ3FO'4fgiK-5G+3o5Wg*]?hp4V2jBsm%?^cItW^j77
+%h8u4j4PdJ$/N"1<*n0h(HhJmil9(ICCQi1T*,*)QC7$BE?$`Nm4uZG)X7";G2Om.H=Y`M_7m$7_<R,mD2d1,VM&9PmUXc at 0+&F]D
+%Iu`-nYDbkp9mo^i4="sHpFj=r^W_p&f]F\_baEaQ(,CW.&$0rbBh;SIY.5SrjHf?laAVE_D9]e:ffnN]Vau:R[Qk?XUBAhb*F+Hl
+%e'<\=`6Z9>cKpbbZ*3&UKB4'XF<giM/7M9.7K*2/_9!Q@$CapW;)&$6G;or9e@`&e=Z!\RWaT5HZtEK\F at 6Z:0#Cjg8S[D++`:1h
+%*>Z_G.J9"kpjOS6-a`Nq,$c^/Vck!lI0CBcL11Hu4E#BVYX$i4Z;$UtgDK8keX($M.^4F57'9cK/CT8Ob#c,EI++J>m6n$n=s[9N
+%Eu&u6/ZECcP)"&LHR=%.=MXA9-Ku;MYL0^1b\Bp!?$[$"J$s(3OPjikgD#2tMW9QD`^:2TqFennaAP]51<6B0koWJ'^XN_YCL)kn
+%=/,[]GhKB-Z=30!T'VksDBgREW*E49QqaKgUnliL\65LPlc>Q#He4rBbumh].3aTEmnT9X'<*o)lt`&d-Bo%I]U+"$:H;DsA+p[D
+%H%XA+rmk`5T0/F=]9ZC;B]e)'-[JGMYZ8DNCU`][NH,8q+W7c=M#;AdiA"&Ip.Ws;(COlZA5^F^gMa=i+S_n[OYZ6>GD[oBA[M-E
+%,T^a`gB7bPEi;%m9m at oqE:5ibait#sK89"eZ"Jj>Vkb!VV>ZsSRg]F,ePPfBWD\D^SRqFF`"?d7\Um[D$eV!,.cmfNR]B5ol_rl3
+%Fq`pi-tugbU3:=MZ?b(k9n'<fCg/3!0h<asLXJ:,d\O]abTsY3g6G[Y7aq4s.DCl/r=Q?rI6]MBRHXX-mEf!ne)o`BSGV(\U[q7C
+%L1PJ0C5UV1h at K,RhU/6'*H.5+ at HGHif,X7NhM):3.P[d+0niO'QUUWrePJV]b<`c+'YJ5Mr)]ZXknZo#CttABScHm[SDQGCb[XV?
+%ok#;VnI.r@&@X>>EuFSkVHg5U,l,'+L\e(1'286q8l!X1Bt]!Fkq/Fn(V2Ft[?76lJJ)NFS:me?g6Xlh"rS%FXEho;4S0fg<)X67
+%oX1Z9PkYheQ#tRPi3&]*P!V<Ea<'"[i\NI2--O%eW at I&#,tR at 2Zgj^/Q*7nDP at b^)H_\R)rFlY&.5V)H+,bK&?:dbV)EGuf%XJL8
+%;&#n[;&8SA%k4bAe+4l02$i at 3G'GCT!Zg.+kZ66c>d4'6kD8FaE'lu^4#Cp+:=;+GXRLV5KVYE#`R9!_;"Eln[D;q3$>:'of#AOa
+%GqaL5d(Od#CM"$>)p"IAT<70aOGr`eF!PI]:nC=M4rG&LE#5UW76tRimmpn2#cm34g?Lfk'O=^aXk<%P"rp1,3=CD at j[cJq[sfsa
+%FLL+W04!*[V-kdo at .^q`84ffLF<T9L!t]==\0O$VQ.iR+C8"-m(KgX+\4p<$!,UlSZN3a+<KLR9WlpVU]f)Dp;o!K=2:M(QaRi at U
+%Hiq_gma0<h%:O>.7X6U8i_RDX26knfk)sJ#SaU!?^7g\S<ZV(%-fJ"F1d:B:nK1DtcG!l!eZqjdqinor0iGre%/qQD?rfHY>=YmU
+%`PhMX;OZ]E9V(&33bc&M*%Xcd:'0]\!:F*`g2(&sH*Sft5[Y/,KkC`/Xp@/U=FFDtCW#"1gEk76?W\D[nc;8t(4a_t.QA_?%c]i`
+%B&C=Q91i"'9Ha_iWN=$uS%MbYo\OH/fJcK3l\I*O'84%NQ=Y?aq3<DXhdAuZ,^7Cf+M\V#]_uTFh5-aGo^BrIbdSI+bHKMI64O1$
+%C$oq?9c&Wb]""`(2`e\WaXFP34n$l7##TJi;d1#i]3#"R"$E99l??,;lG,u at -$P6"HLff[cRU^]h]N/^,#SL'_tkio,!d^[fk,r.
+%R66RPnPO+j9,N=3%NA@\*l&L+a\eCkD^\tC)SLUu-)D7ggKgu.(UV at a^&B"?4gCu*SMhM2[r$OYl1sM<Fa(B*RnBEOfbjcjqD?1:
+%D;HPB2cmE5V2-,Jqmb"qEqp-C5-3K9oK^<iM+"6URVh.G(l3/DjdC"T[`PrmTaWe,;)P2i&U;4pQNHmUY"^Q/20K%EDEHX+;Rr":
+%gQpXIS(_K)7XYeo[WbM1@(=ZCi;E at 4:/gaHJ at bYp9-#kPMkcIdqG#Gj%:aXRHDoU*1fb"+0ET>/R1U at 5Foo=2Fk-e\)H[<r`AHgi
+%8!0f,0mE`JQ at 0Zrh[a0VDa)muH.3$f3Eu@#g-eMM>"^ch\5M=Bg^I\;)W<gD/"L).SKI<ufP.+gQ7luQ2c]<,jX7%5+XERh6V=`"
+%5,LY;:>/-Dn7*\_rRf6>A'Ql).]4JrYQI'<EcG[$^\aH4j*'`!9=qLnE_jU at egYGleXbFXgHP:d'-)&dptkU;fVbe]WWtiW*/OND
+%I8W[9aO^PhGl:)fVT#bZK76 at .JQ9kP"?pT9F[FjE8I^i%e at .:ON)p2tM`Pq7hh;eJF82rL&pg,U+<K at 1FI&Balo@@5ITmP,QNXE<
+%Q1JohVFa at m)b.:/M1#o#$*&BKX;%Km;6Z\rkB*-/apX6^5ul8GMpUdC=#RpY/M5^r2H'T-Gpm$7[.ghIE7;D.FY-=\2jGq8Fooqo
+%VF'AaGVVEW-'Xqpi.^90<C/SNnrLliXk4[#Qk#s`iOmiP4dVU^au191F&!6Q2H;]Z^./:KWd+)00%64E&T%G^9<&J[j><+ll1,+#
+%VXHX>""WfeJ]SY?VD=$?daXUFS5Dj&2ga99Ki9`uHcZ]lG=uCMhI+4GY`!j*`.E'17*UU.><)2>Aj>LVPKt<@1(GOo[FF9S^rPb.
+%iMM<RhK,,Vh/Eg.%e.fj!5B-Vk18EbnnYLaT("m`>M5ZHgLN#0fV$Jp-iZj&qkV-sN0X(Va>pbVo<i=^mQm;XDQK'lc7:gr#rBY]
+%)BJa&-KZHu=[b\IGmMG64YY;9'fDn/l=':RlKWVV<q7WKZ&h%=hJ`5$Gsod,ag75Fac>T:j<JQ%lT)5n)fr7h7HCSbk at WZr(!`_9
+%,^5QUAu`Pip&%OW26#HSNc#pE$VV)Sl[_0b7puK6)gJ_S?uteO5Zd@;8aEY)O=\HUq'8"orK)C_KsJPY_s.Db%fkukOdQ<c&q*@D
+%$/E:eghl->4K(^"d"S$Z`ltQKn]Q#db\%=!ICZ3]_(Q,`L@/s;3JaeTq&)*a4W<\7j)dOJ6h\.q_HGuS;0K*4L:h>;e2)1"3AAam
+%>`p)#F`(I93d*#jahi^_!]eS[TtJP:QZ.Sd"=>E9QiZ]D/(:>p_W87p\`uX at M4V8WR$QHt7_2?/;H)Qgk-;D,_4Aa+^t4Ji%*?m\
+%gYg)[q3UInI+2o!<.a;;\WaX.M9.n2Vs/gad!4s at nc@(Cbi(_1Pd`*8lmFPW3Gg&td^*ofBZ"/s8aRYh^0CH1]UX<9jl_<Dq4QCE
+%Oh\'L at -KK8lh>i=fB:-;Ir1is/s20-MHc7s*+`&Z-Xp@,o=n$0qtjD-LHLQS,grOb?Y?EK.:p!-r at gXbL]6T22T7GNpCu$:?l0T&
+%jY?sO;ah'6:Ya3gc4OH+S]@%ZOjj+nU5hrap%("BKa at S./QIN[cGI_d?ls+3>bU6]Tb9"1CZK?`_`e]GG`Equ!J, at noim"`Y@#$-
+%5'SL#Q"'^"m3rtX6Jh6(JuJjt*Siq=MS\2GbO?RGmuKdcj;([f'R0b!opm`;%uHF\C_9?]n(!%a9pjp$Yqch]j`BIBI`I]@$:N+C
+%[<"#;-?=0moP)YDP:$#o+q1sKCakuND48L>kDUi!\eaH:1>4XbJffbrXb482)4bB\OUH;-0m;KipAX*tBDjf at Lg7g_1h0kQcG)Xq
+%$0c;<k#f@/#*X8,%++=IFW8D);D/[>(dot$"m9f:2R;:Dkc$KJ6lWe0CL'j-ScfKpcC]g,*/lrK=bW!:o&k.4A?M*fP8[A)#1k.=
+%4NTsMDLls+5f*]l/nJT]A0O*Tg4d0tE_>[XC&lsKNIJp<+;*bFH'5piDe47aPu3$IA$Pg6Tp<H8gNB8\aN']eM#'!lb-EJH2&[r)
+%mn4k>$V_uU+hjN^P@'jS%>tI]\u^$ferAVPJ0q/Boj`';765I-!m9?sCYGuQ=C6b[_e00q/=7%A9CB`4K0]kPbIJq*k3=-B*spr!
+%16a#[]uT'W,Vg$NHWu`PZnYUOOB`!sVdAtlGVa<VmIdAis733r4,ApFbm>SDmCd5A,Wa=(R5 at e\%@sNI:-nR3V0;(8mWM%\mk\Ti
+%(bmS&3FZ`fp#06j"MD$"eX8(,[;RVm.5`oP(\6kT5N#Vn&,BGUD"`?T\LJSBDK^mJ6Z3#bAC64t:A)"2Rr;qaE8bjAk)R+-91ogC
+%#\[8?hNZerZcc/?P$?i4hnm>a_11JlEqW7cVCa<4/2UFOF&0?0*;_LS05drOW at J%$4qi_ljK^RLl3FD^n(Jij71\PF>*Wu"ZE\^]
+%\H\QQq68 at E3[5.#Qd6NPo+LdNlc)b$ac'-,n1`cdGQ4H&mLgeS at 2o9^f4cN1b/^buq>Nki55!uFGI,CbGEjbB+:/+uDqY'L?ko)*
+%:\:3gX'T>C4#a,?bHf\J%=@\$cQh,_GNSg<O4Z-g4p6*_J5s6fb3u]2Qh7^3#c/a2(Ycg^6JGrC]A(hEjH,gkB6#'/92M>G:ZW[]
+%%.j$'Yk"Ol:u<gh?g?(o11b?YS^QG#PFm%TR;FGOUoa#q!*oY-9E*T>hN.kaCFf)/P6UB4g7pO:+*;ak&&6B,-<[biXe`(\O=F"a
+%PJ/rF;/AOG>g?%jWf<@U3SnSKk/Er>j/;:thhbR&'WNQUWVG76J&2]'kF6#6oK'dF6*.XL]"=&rB'Mqo@(^Oi/>;MMefcsj\>S]c
+%c0iC*TYN\%>D_JP]-M4HFjAUd,>W2[%W48EBigb9$#g7_$#iSm.[<e-AP&+XqUYC(!r_"Fn"'_`5gIW4KB<u*ku9gfOf8Wg#H/-6
+%jNg$\nbQZ!NR'cN._k!?+fipPhOs;lR4XI$Ks-mJ-!2Gj,VD"G*JsEhI at m(fC9HI6Ah3!$TM0R,g?(r8=)JN8`PB&_KI>^2+M@>2
+%p74<S$:WTs*+lu^SY at X"jKJWs+HF1aA:BUJ\HSm,W]G. at go&tA+ID2mi75F4_:&-Y"+DABS)nQOo!,qqFA8#\`>]Qo^@0Qpe\e28
+%?,fYFH+&fUd&hjnX&d(iJNWnX;b at 0qZl#i<.eg^mL>)j\8;6[GIc"%$#&$2h[DlHqiK(Y;<h[6tVcb?(QCB'*AXe[(jc3qFEFB4l
+%9<B8V8SHNLb\9LBb*-*4>B:Z\72Qc;2U#[Vbq=5*SqGEc^.f5(n(;*#RK=!lajCB,=nYFD=m^m(1FPR(H7!fjjcMt*EBO5$$I=Wi
+%ol:`nPc*XI`BmPf4Xi;(1c^J:j`=6uV-L\V:LRcj18/otgTt[!2qp7Or(^#:W at tddji#iK9k_cD91%&4Yr>365-NCZ0fSOrliET`
+%f#^sik`#+pUtgem6[Ae02$IL8,bLl*Bo7a&0Z\=ORf`F%8k5P-JoIh#`c>PjGkA:U/c8XJ]8N7e*OZr/H/EI72Ga"2T:5pZZ-T*0
+%\jI?hRD:0']RPgV0,_Dd-"Ze_dnS#U]P2Z1Jn+$^9qp9,_QE4lg,o$+rJH%?AMd=Uarj*dYPe52@&t<1V35`(3s/Fg5bLp?Qc6)h
+%*hfuE-u[`9LMKq2O8#$bF,2q1Z%ZsFM[hLKq(P9 at WSJBPnb$ZOTr!EmjcgMGgg:IVb=N!#bg!l3-g$lZFu6@>Q7$o)-H`sM)c"G?
+%U7rDDULa&_O*isr.DT%2n_ihp%!&Z4rO7W2"KLSOX-nPR5<XB&0VkG^.IqXu3aHM.2(e1`%R*a(Q[mCes#W1TfaYi/TB!qV>c5`"
+%r(5/<5GlY+NX>,i+YmVU?8$i-.QQVbpcZ2YGXRCC6-ba$D:7Z,Ypd0._9FM9D]1N5f"322925uRF at Uuplt0R3$#P*q`nAnsdb9o:
+%&uE<iP_>F:C9uUS(OjZQNno%FH"cCQf5lDOeNn[,7$6BF'e(jWbqLG;-`WNFg&$)d.nW`h:QAgj9u,B789Ilf0dMpGE]`'`W5WYB
+%L_t%#i4HX,CiY:f=O1>,$5dd?prPIc($E1&Y1&cJPX=JYCGXssl(d.$q30YH8)1ao,bO#.7*@/.;rXY;WHUNhh=W1:]AA1\!@h>\
+%<'FU"Yi1mP[.?NrBD932n$8?dP%QKi`PpST*7Fg]G&u1gc"/5BU#82HIF!V[\M?=?Q^^c^YHjIa,Yj6:9o57(DKrrQ)lAB=1PMt"
+%QS[C[D7tD>NoQFM[hS*83FW:aS^(Lp]OgRtRY?=;_6BIH-k3TU-.5#;X>s$P*5>`\0(PKC`7D$P4j,ie"1LG4aH`]p;BWpeh#*IK
+%WMKOLK6sW?$^r?=BBmtQ&ilnk?2,,8G)R3*=U,o\/B+7TX%*$)I/a6]XlUKAkK29o8$pX#4)rBC"lpJTj#bk"5)GDhm;thLpNeOh
+%ckd-Zb-OXTOgh5l]H6B*$T_\d4h89f"g)"o%9qi5&XZOYZ#sqch](nNcENc2DOt#q=[)7k$_ at bs?t)2E74TZS+dM-bP)-E0]jn?R
+%I'lErbb7VKJ3DH_#i'ohJJ5M^)Ss4%$[Q.4N[6kFYoKs.CcC#caGl@@-puhV[:>AdeB3is>si).OMk:SFU>/S9dE>2PtbQb2pEsC
+%?5![sL/4<$_tj?K%J$^Gao`-j29f$VjcNL\@fu8(=i1X>)m$Q%MS, at M4,X86o#BOA<LeM1n/fl\UTR;XNA_M&K-Be#emXT*j7-FA
+%#sVCu.9L_1XE_4^S,"b`HQ1[rDKTS!V9P*:@'I5NI2?/`9?I`>V1unXp*)C.`)tA[CfM?,DUl,O#&&%>#22V2BR:;2ZBPZ'b4dro
+%<'r@``UVaM/`.B"cfJhQ*\+e)4:?p%`FJ>^_\8#KbnT.Z+!$S3G2RhI21pV3T#BCYs4o:9pYOF#25)U%BR,djo1fth#!ii4R"^L>
+%8h"&AeEFH(.Fs\SXc`j1k%PcljFQb"qsR-31,pB]&jNr\Ik5 at UcBB:_``U,F?!W2#l9]dc3s1___tS'E3:D(T3%Y at lWS@pY\8dE.
+%C!^e'W>_%XKgd]ETXAiJk?8g,5]Bj^qb;BI<lF]oO_jL[/K$#%MM`[tTDFq\]JC<8o-kJRDf92ip[Rh@=g)N_IS\LM=pj4FDL-Ro
+%I75iu<,"qo=*%].$XQ!!I=#uuo%rLUc7n\7Z.VQ\@Y(KZKA?ag9Q'XTX"(4CL8,DAO`EN*(3d"BF61rKr8ef>Sgb6m-J1nIpsItk
+%-tB.D"I-V;)B:3_P;mXBNP=8'$R`icm7DD;/"T7'^P(6&)!`>-gQkFeT6eM0_/!B1e^-gC.P.rNe[m85>%7B]jX[/*TR"9rs5fSp
+%^#n2c at X&1*h6qo"_T6Qm!_TX4 at +JFP=o2>A`<X]]q4OA&'Hq`KfOi$N:Hb'-T9hh=-[!O>"rH(]OGMmE`'((Ba8);!5GCcfn)I^r
+%[$L!3^*)UB7[;*kc%W(mA^,f/I'CtpA"Sg4!iqfM`J398A2NC$OW]V*foo:6T at qJr2^p8"!0K?6XT/"0LsM[?a3V,s=\4)7[YG'"
+%nl3n>?rVU%'?Cd(\(t;u=GKpNkFeHAMd+3.;bgnI;U[a(p0]CX)"L:#V;7YK*Lq-;'I)2+4\E,K at 7;u.qrYaE0%t2)3)M]4W_c!R
+%+#(2`N][3P=]_E[Bbh(8#\Q<bTP/[MC!(Sp'%Bf0kf2`IFhO-n!mu>i#&9kpeE=:qEEj4Ta>Z]!N\YfACuL&UeS]#;T?a#M]O!$]
+%Rct,#_do\lYV)Q3;Z(P-(""id-"+3%4_8>\YXb!7a(c&cpfmkC24,c\MNH9ZO]P8Z'6oh[jEeeF2:lf>Mbd:gkB>@_E;d at 4l68:k
+%0W1B_PJl4Z9UEDMMI*u4P2o at Y_>N)D:7dKHqQj?B%<,ckFfkDa12*D0XfU*;Vt+dWc7`7UUs@#>N&!k!j/0#dF)g[Ens]G+(LA;T
+%*pRd65<i2Y\D86Lm6RI<ReNTS#u1\3B[,(TT?XtA`,YACPD=JF6T*ecff<IjeTX:1FjJeR9M$),1o*NEr-"j\*4A+JgWiQDl1p:t
+%;PQK+,bT->5:S,Nm'3D,hR$lnZK+Q9rO;GO5`:fE3>pMJ<lIRH00nNc=sJ>fN!<G1=Y^=$SMJoir>l/T1M5a-ZNm\sV at pA-E_fV>
+%13$bH*VYZ'4a;P]nT%O!^1TOB^[H(kQP-^R0- at gBlOIo:Xd<:X89J&_80Fd:DHADU at qC<:/E_ALGNJKS[M>;'\2#G[Rm#(2IILc.
+%[95FlX_h!=qunC\N4/4O2R3XuqJ[h2hh$gBrIkhZ[nBRpF6S>9VW;uFr.gb[$X"]K/6:ueEKq=!KbKRG)jDL9jKE60fm6>#:Mp+m
+%(2e*VVHZtH=b,PLl(Ta#/93H?.]9g at 4e7b[niBhZiec4%"pE[Fp)#fC3TL;@o-Dc-fN$_:W*U'F.W))cq<TE;+Jk1trj+&:H=l=\
+%FcE(VG$LiVCmgWhm@;ZPCbss)5,)%`VF10:J?&Q((gX5Om[9cG&9F$$$tF5u7P-q(I-MfB2Ws]sZaaHU6"TT5&@CNkP/%KRGjNk]
+%50>nK#8WU2;%VBmR at QR.^[%.'J]R<VhUU=Mb#RcQ`l3:'G$ZVs'7LKn<gq2<[i5 at fe4dJspE,k=g3<>V6m+ at G%YPQ)Kus^4hdhF+
+%/=l<`qT+]/I4%Buq4*<KoIDP]$"Fb$R9m1O0qd2sT3*(3D+)pDD9G"+K*#::U"<;c+e>IucFYjB+n9rREVfkcp?"s>S:ZnjXS"O0
+%$=AFT(['\g=c#%Jd)M$<hZONLMPnsY',^J67dAQM at SKg.X;N>nIn>"oKAAXA?U#9$$N5`3iO at mHBIM"!M`.XsCP$:A>VaTjTGs[A
+%^`UYH"7#J60?0QnnP"81gZ3oBL(OaB`[=C'NM?ZBLJ$>G`=@oE:<._K.=2]n>MlEU.gIOND*Y at QM*3^eCPsne0U.0KD`\hE^<6>B
+%ni;5UGNAsJA>GJpKD!uGTJSg%Y*/\8eT%68f5K_5VZ%[d-tB`$r]$#s,gP)flR$Jj8Yap2ThDX9JTDnh_S1904I)o[[lTsH3BZW7
+%,hqM%>=q%I,9i-km$h7ajNlC/c\/9oeWH'J$M3)$G*4,PpC&--mdPPTa?a4i\3?Kd/8EB9)<rK7i('>S26;9CF"(m8q(k<,kL&NQ
+%"as<G#S)3B\[(Blp>qXhK>V$/WCc.u:PX]d`T<*@T98I6'(WPX0Qs7<A,auQ#>N+Sf%nL3SMCX at incVGpq&u_b-NtP)8T.Lm.O=p
+%2#C%=?j.lUke;n[[TL;1(Ps--L<U)QAnOhU0pkG[9ke\,oMO_5W>B[I,RQ*Dr9'a,*Qapkj-'F]Ed^[!$1Rs+N)OJd^,J,P_=?Qf
+%qi?a2ZCeeZ0e;gnq/Cfi"F5_R\;CF]9"C=p]d[Qq\F.E`=uKkO.-*09%k748'6Z*`*u(^.T3AB,WI7Gt]kRhoGRa&b^(*5re$k`\
+%T3%N=kg*LAi6]HAA'<?F5GnuoF"H0dG/t?a2[0JF0FP:a8mXT1/k)8O?I`s?,M-u6[)8;7OB<d0M#B91b.h=/m]tSm9J`fAQ@&eI
+%;h>g)+S_O$/eaU4m1s at C<\oJ8??/h0 at Ct"p!Z%Ee`-8)c@/iIc-*K+Uj$d(grLLQ](qJF,Vnb8QWc+;DcH=H?$M>$L at C,&co3j#f
+%A;=bT2VXGJVQ7)p)]o\1bEhB%I\rVUF7\Hbp^;fajOoARjT$=nG at 1,)q)%j8\"+Jm)9+kL,/$mXA3tfpanPV,[Vd13TCur1LYGuG
+%i.bhY[HDI[OaKTf87(_:RuDcJ-YGIti2Q;BDAl?NJ9"h4+BUl45+m2^`_F&7knSCDWVJmS`"J>J^Q at eEB'60(42I'_8!;7p=T20o
+%T4A_9ZI5KPqm;Xpn$'"_X at 02[gpp9f,<U+G):%hXVDoP%!^&f-iKJ5UaY5T5.u%p&Y&gk/@VnnK._4`J5b&1V1:&VJCDj/;N8@%M
+%q4Te\"UqrBIRI1^@sU@"SnR/Sik41YM$6T!@3S*gm^V!^Gl6\BO[WC)IP=0]:'1MGfD77k,/q647q8$[]3-i6F72[o)[@uUNkEpl
+%a`2&j&0>ENf\G:*FT5cD#(!)&IbB/SE?b^*<X\8P,LD]EPK&.4/Nj-%<9.$!50*Db^+nb0AEe^r>b_"f^'l&f;fs2XJ?ra%*mCfB
+%cRO]qg'CqOQH,PGp^/>C[b(sACUfanRCHFmeD3[p22JR7H#A5io<07#9.m;"O&5a[9JLUT.i1_Y`]NCZ-]3D7mIpVA,=T/2?Xg:L
+%?bW?M"/&W"]iIL.Jmo5[51[>McWNrkVJ#FF)bZ4/7iXBd^c0[*b8gF9J?ddJ(dP0]8>]m9WqcM*978&:>+J43P7f0D]ccE"CToIO
+%k<4U=(_CV!l2r at LjW*'t#Z$K5<OIC!ATCpT at WYWg5[ZWWT*E1/Hu8_c=[qM7Qg>TGRh'0BDDO at _Xm^>`=Kh,g=fa3$pY,b-<Q+.4
+%2MADMS)^'JX.K\+-hm:BDHlbX<Wm*Trt_8+f`a="qTVV\+e:X+_92_,)RFX7gIul3'C_DZ0-k+EN3k!3>aY9sFlSIi\nX#PjrQOO
+%/=T2bDM[*L1=rlWP=E-7g+Ej^."7'FA<WOC7l3a[P#ldNj=AH?)t]ljUdj&O/q+mhRO8\3+e%^X#r=@2D]nDaV<u&ZIa)9QFS&!6
+%WcI14R%Jlhdo86JWPEW<^4bu=..ku6DCO5ZZ;E5(Fnu,u[T[<9TimC3d%Yg=q'M)[D94$ur`3sXge8.]r2)X[fq$O4r%2*Vr61?E
+%Ck*n9-]NVOMKbeQ(G*lYlT4apXNlYH[F<p)9na;"K>`YU\%Y5h>?K't4.#'i,1:cPpk9TLLPa>(>G3'^[%EW3'KW5N::iF+]@PIJ
+%-1=Sg@$79`gN*0VV)d4rI:J]qFfZ&cCtOCIE at V3c9p_<1kg'+kae_(u`_O"q\K1TEhbM\`;S+GS#id65k7FLU4*.3h/^^NWmBH!4
+%0Gt6I;0jGn>]p:'Ra9)c:E>UB(4cEIjo"5a<%K;9:2X%Q9rSpMb7#2]>^(dk4?qh,P]"Z#%E,3M-+YY6-f<><;U]'a%+=1eeN86u
+%p.8L3gO_gIM(2)_g\4PH8.5t,^S\1M=`1ihPtt1.7H:_-Ug4O[%sh&'XnF3koCC=CL-G]*M4 at SlB3k8)Sic_H4Xej!ea0Vghh+.6
+%Xpt[sd5U7L1X(=)l^&0'V/5n))L[M(9.H(G_m[)N%MkX[q9W?MF#>&bU"TPY-A:;sPtO1?$Z,7S3OST\.b6"-^o$,4$bpS#W>.LP
+%e0E1Ym8c7M:=&*j1t?c1QP'SC-ODG6_:k_USD-G*[kccQ,IOSH;*EP;+Q[9B`^!el'jbrmC:2$JH7R<LR>-'>*)I/5FdY>,kBYD2
+%nkRbek/PABBseFMGhqJ6<P[G;+&d$)HB9a8e!j9LjYDtV\bq<20&4O29V:)-F!W2=Llj&kR!\$_]JFu^V41n).TL-0jPW(hqBNK<
+%U3h(qrd?@L57l$8U+doL-.E)Amu4*i]lSAlbT>Y4*B/;Ym%,lLLRm%dRurZINJ9_,7TQ2K*$&AGZ/Q>5T"O\_R;6%f9t'S4q0<4C
+%"k3%D+"VmCH%lbD3XQd4`g!ZaS2$7_01!=bSpiPGL@(_<^VA!m?Nk-2bI?/./MEmK5ke2I[hF8Y6qUJtV)f)HLfY4#^>=W"O;E!$
+%+YO8d/6;t1-AoRe_e[o'>YF?+^@OIZc?<%`>O.I3lQ`,a8kR1MG*m5G,=Oj^5AuTGfi<KNcFa0??\'?p'!Q,Gag_Hu,"%C$@f*!H
+%)5(r?PmpaQ1AGL1]6?;Bgagp_\]+O(o<4'4b50J7($#bM+1uRh';r*qQ0Oq$l&C5&&Z6RDnFN-400o4kPS=.lF<pS?@7c#JOQX,'
+%WC;deC#c6A at W4ST$8ma1AibVna&1V)NK/(iRreh"]YqcRXD9K(f?g=2q:db'o:AA:?$Z:75-JT\$_k[obd+NeRaM;9P4$];4SV:*
+%C.tUPjAe;$O(L4t`3?K;BJ,oUm-s"6^KJ8(Eb>fO);EVc?Z#D_WjU6kEbamT^Pj at hBS[[6%$G"](WD;*_`<P<:trETEa-t&+33q5
+%35?G)+`a='&tK!K_m\M?]T;%LUsf39P/0T6]BVA\\6mH3:/&t!`IU<kAOW(jIiTo90$9L%m3t+!TQ"rc-\b-?4.)bG?1NA_IZXj=
+%2sorF[+,6!'j>Ln:;-sE,q-5Q\6,=nKM/Z<FlmLE4]!NfENHt`A0c at gJQ<-lDGqu<.L8!@2W[[1=J8t)7$*k'K59nq'"iK@*BPt*
+%og&iL0tXCkI3[CB1KYOdC9K%"q<+%`0[IkP)Y9m!U=Wj_-df?j!YMhGk)ZJpqDs<FmO9*M3KnO(>4:DUYgNQFU(Xt/>o!>"i5sh:
+%KUe7/#_N*>L;B!rQZ&,G54Bo[$MQ#- at UAe1'!lWeBf]3Dfm*pIbd][#`?`LPC@*j?hmlqKJ#,];.8;l2V7ljHb^8?OI_W[b at P%:W
+%,jQG1r]I]X7'(ZA89k!%\[c&s:oeB_4u'`".XX4nl\`V=.Ks#3cAg/HG"0h9eIG`13ROHq)=g1/X1"$[:Y[Tgm:HQ%;o:>biK'BK
+%oqoGD'\_67eAe5)&;OQRhC(!]id*:TMAsb,A$.8n(IPf'=8Xpq34UNQG*$nd(cf=0Ijf-/r&j`ICQprFL:JQ\M93k*6)LWaG_kE_
+%>@^Lk3iJ.&(2istJaZEW1/HT4qagN%*-^HN'H0j?DP:%1`<'EbGNTg*/]HORS+qi5q->FNejPUK9RBo`=%@pQ^$CbUOiMaRg3E5)
+%%RpQBR*4SLe9e at n4@l2>^^;-IB!<mm/p9#L<>>u=l)?r>=4RMCDk2PWH>.b,hOhnclB,'.>EUZhObNT#GR5_$);$ZU#1I\nZ%qTo
+%E2Bn[YWeFf9WN<tPB\#Ve*j>Ej,C<ad:,Oj5E41I at uY:W;s%`Z9.m]YGE/'I&&PS3JY<c+a65#JIa68]T2T]8fSb`RSXT;qhtS%*
+%>Z;N0354gk?3(ZTkq!_QB?L!@ZbeYR'gC3+.3O8`QEC-IF2ZRpM8Gn8a]&mdUY""nrYTEf,dAkhT:L=$i9Y5#A8s#JX9>CGC$&XW
+%\(;X&St(qI4\5S6WoT>pdn8)XH=@7a]P2NMSaDYNf7)c&4D0P[oplSu5oN)$qO4gL$#IuX>f8Uhk:?fg<@UaY<.B).cj[G96p*6]
+%b=i1DjVm#EqqVoqbskc7<\Os><ID`I;07sa]-;eYYq`a3Ro[q=^J3\I,1Nu/O](BK<]Vfs9`s;N_0RK'-4%u_aS3cHI-5GLIUIG/
+%'E7!/o'!FA2=tVR6IZ-B"D(T$O=Wu4^a`P7`t51=#di]XXGXO;@?86B:1`iPo:YhP1%(P8YMCZ*DQZr,$ckJ*n#U4gNpM8:5Y.%Z
+%g>[/QoJh$[lcZV=\O'/%9=((U'DsYJf[]^!Pk"m[7]ZnS_AiPG6Gj7sSO)C"419H6RBZFQm.91j at j^;e)'B,k&8[KUF3Hi-Uo4ZZ
+%s4gOsItEg5W+pN=k:6Kn0SR3WNXE?5.%(WC+BK37ZXKK?G48D\1P-#F#ZRagMKt`)Q4#+2fZ$QYa1ErGPjuigrn*N"$%9j+^Rg/*
+%]$ZHDJ65^IER[NVTYbgOo0/@fZ(ZJ-1+g_CNhdYZj+NS2GpdMbnVkU:CRJSp4S63.jcu#5!X5l=?_-9ED-8qJ1c^1$42hkFhY]dF
+%",SA(2CE-a\:h&NaR;8:hD2H++DMjhB:CH>'U:-EekYXC,qDP/FO!l?)pRr5B`URrS`;n`8TLk?gU/j*G/C*lEB\3!Fi'$,l"%54
+%8sg[$m&9dbYIo66;JYZ$:@\2FIFId[ibXJ3/iBs7L06]SOBQ#33"Ti*q>"nJGiKUsjK&Y39GO;UR"DL3AUab/oBj,/I^a0U"(QcE
+%Y8Xb7Z.f*.)9I:BnFe:Q9_tr/_:b:f at B.1LacH)m9B\5%im9$q_.^Su[I?mV1KUR%bH?^Tr][`np]:UpT;q\0[L;;dA,=m>p`l(-
+%1*;`5NuT[W*0dfHTn,_0k/NOVkPTasb<`S<!'c2]T/s^J5rVN&5)&!VV at PLf%n8+M^ZkN`^E:sH:K+DN*IEECM#F0S=)chirb-(2
+%:l`q&;@d1nA1.r#O*[lBA)iilV`Ep"IbSpH at k3At><^oLTO^kTYk4h&b,$!97PQiu?loiq+@>L%8YWSPl=^.Y\[pA'7@@pOm_Hel
+%gCA>ta_gDo\Q8s3jan5$JO8F[B1ubod5`"9T?@rH-;aT0fXH^)a2dsSh^G`g8VVo\AaY_WG?=FJJA"tO!s>f*WXST&%U&dFbt:+g
+%d`4N_X0eGW7X]ctN4%!&.dKXV\5JU%Uh0,[W,FHm4#F2DI($_MWQN'2^X=GDMmIHpc&LQZ2O6(qiQDG@*I=qOs!UR!P+Tgnq6Ika
+%0sZ*@\asZFjY62NTKVFjNnN"7YB'%al%2gD%Pb`pBOe\5b!Fe[W31jI1,AgpO:3U;Pu?-ok>^KQp:ZTn0%fY4b8YViH(+L#@te>?
+%F9fjbODfD+oGWqKY0lT)gWLaGS$0OUO*^@*osaC;AKn!a-cu:+c<7&s;1X/RDq`i=<g\?$o'MFtb`-F!5bE^r"PHBb4Pto\_WJY3
+%>.osbR3b+f%LkN++$)l0JpHOtf-D2jYo`_&N"SF74k!f:qPh#Ch<O)K/bQ4t\1ur&!&<Ya4?gegJ%P*gA>E;?T.iq2HZ%.=9#gRh
+%CB"&s5(nS6-.i.4`sHo:jpH3,q(ej)*b9(*\)7s"qj<^!#8[,m)8Z7sjPL7SpI[.#7aTJLcc9TCq[mNqH]EFPL(`<kj;s[K/UR)5
+%XeT(B92YK//I)>#KHTu=o!M"L&($PZOPGtsWMRT*n55otP8mXg_QGn&\aIMDr[+g"E1p$PN\e^>&\'3O&H'EZiA%KdoY;EPYPi/T
+%$iHqo(quu:n7^G*9%?WZ]IjG7huJRDUQnipEt/%B2O)7/HT15u%Lt!G`6>6Ro%60SFuG5/0?#b#0D8/4:U+EU,f_&3mVBAY)BeJo
+%*5Bu!+Z\0PEN?TpWHeJ#j`t:h3dc(e3)AKU&A:_)s(NA>%1feCn-VF1D=AgPnP1G:Sd;"*S-mq_BC__(i3[C"Vu$0HAo?[/m.7NX
+%PZrZMd(,j&'68R[6VNR8'"kNu&6amcOhW:W=&RG_/idJCARZ%!44DCI#4sOlL;YM&mZPT[b\lU/B\=stl,flPnsW?kX-Z9 at 9mS?\
+%riY^Sk%ki<mnO^fFf0h>rR!&Z.OlksLdTXtI<&i,.BX7jUjnWt60H2j)%.E[C]-e8S;1(gL\Dg#gmuLsqL$!mFC6m`-/u]XhH;/%
+%lt.beJ*(7aPhO7Bgm1IPCBl)f;aEO4d^009Y4Kn/gK*'Uc$dL*._50Z,##;SOd?iX5^.X>P`1_g#&qD%F1Z#6da"7Ie&pKpCnBZM
+%M0(t>PmK2j;!Fk?TA+9^P6aiPLR\j?<[jggNnRB5D+GcB,4[?\^fun"6:YA?Km0+]`n!eq.5Rh*gca-ic&o+e^IHlWM1odP/Ik[&
+%_6F$;6"`1XQijj]X78efl+n`d?`(2r]@I9;a"h at mJ&!>'@8W!"(VEV@##\-,d_VRj[:cp?am)-eVFKK8m/#74a0mXs!j>6daSBf:
+%ml=3=Zq6[5']V"ochUPV:`gJU1(!]0".(-A90*Z3\!3$!Z)4BHfNsltN:9#&gr=6K>/c:O>R2J!WBP6I<%3D-Cs5%U2<C[J@^6`S
+%Q?pQn:ngIOpQOlOVb1H3>8)^m;3"q3o4"uh]89&+be>Y\af;(G?4Zb+H.C^C=m<LCZMeg/GT.5&,r!%ZQ_#/gX.,I*W1[u#-(3VO
+%1:[[OEh_i_$#-cKKmF_5/(aje>S@]qd!LdBRBld-_e4&\jmSHsnfY!KM$X<7H<JD;;urVE\)sCXoufcqU-A6+!h,tk?&hG3hjrCB
+%9stB@)ZT/g#^JU`e'B=qb2>c:[I,/#p:OuHo$m9BIX_j%a)BKs5ea=4$?ps]gK[]<nJBI>,__bS,jqJ[o=\:?-8qc^8j/'U\0H12
+%$P>3PZ9`CViR)?,UFnoe^hdO1p:[P_jF&+oU<mHLF%Tk2\PXgVC"Zj60mZS^dZclq6N[]Epaa1YgiI=``3HND9`AZN at T7sVYDmAM
+%8GMSm2q>To#12=PcWV+/,J1<e");$8dC%`+k9UB@,Rl7!\RfFA#e>oS[?S%p=BS<RqP?1$TIJIfa(#giN.-RQf6"Jl1<k/=55'Di
+%SR(KK/7S=?A!*L9B)Whs5aY%8NEqc61Fr`5*G5UIDAZ8Ws#+kQ!hL,&2n\:kr!1thU^Er^,>OMjU_;@\I)PK\DOG"%q\Jt5)+",F
+%N0](:&N>3`Xm_G:e4@)hE+(,\"(j^.mM!R!=s!R5UJ32_p!fMjjh2jb-`PtE"paJ6<:L-/r&R\p:9MQeOEiE@=nK-%&bnGDS("dT
+%=0!=e<>oB&!A81F-ILZP%25N>8XEiZgpe?LioEpGjEd&'MM7NAG<g,fJqlSo02Q)d+CMF:16Sm6Tkrn'Q.q[ebi<cuhjj!cf*&<a
+%cQJC35T77$nj[fBYb[R6:!Z>i+KTproO16i'"jBE2jS^iH?n"sL0X+\&54i,qiF3G<Z(uo0PN3_-")sRgK.TgjSj&^hW3XDm?:/Z
+%>Ukdr^\r/W/<`tj'G-G22]>dbm"sK54ulG\$\Z=k:5j^2^3tTWKY.0)=b#Ze2M-M?;(OCXSNAuMXZrO:JYr$%C_k38,:u6dBuU>,
+%"_Td1%:C)DI.*k:&mO?N5(`gCSAP^r4!AP-1%.fT0"=IfQ)%')]]NSSJP(bY(&-#3?G<lT)\3\E4n!_RYWje(0sCQEDE&SSq,5%7
+%n0rL4o$YWq[[`Lhkn at O)(kcP)hT3U4_q>k&F6&p9riNdh]K\6e(rKSm%`e<rV'tN&dd30QHR++Wm8-kEGW)3IM=hdO(NI4$Yu"6I
+%:I$9C<&^7n3L6Rd:KMD(/+G\><_8=p3R'_iIIm.$mu,3LfqrmZNc+FXAVqa^X4U>81PNu>RC8$+].\T[PUNO2.DQ'A:gb-q&Hb04
+%9C[??g7l%3npP=No/`WpCULV`0%rQ[L)*0[f#^?U`Ad-W=GXWK6!fTT829KqK$oLeM2BJ.:<lugKamc;mp,%83_LN;'%h$]&YNbs
+%eS#e)8@?9F#=!*@`jm5?XEU%B\!H%a0Sc9 at q]:rGnjX at 2,psI!c"E[.W0^p.'O>?^c.1+W9ao4Mie!KZnaW#R;JrT<nNlltB`+`\
+%M5.iIpm at j0WP1nA+pR.!s#g$fjagj$&c'*W6rK&gkt'er[\Vpc>iUHW$seX0mQo/3l'[tg;J-!^Q at a#g)Eo0h>T],o=3&eb?Y4/O
+%C>fhi%8)/cXg[=oG(cJuf=?s5:Xl6`7"A/*>ONUY:VtU=8E]^!c=sJ0FRUE&+;K5)?m7cR.R^/h8]JH&U2N-)3Ol*;H;[rD<0?)7
+%q_VsWD(d1D7j-m=j;)8"LD$S(0r8=,98,R&MNdgjfh]Iko(4d*DE2P7n])t%fQku',rh5"R&d_@;WlYR!_M*hZr>_j6 at _T*^UE at V
+%k1MY6n`B`(aTt.J/<TM;hX*H9W3!$T&m8/g<!qpbSdOpjViSnk/c?mYC?3Lqf'W]CF)qd'L9%c,U]%G%NW0QKoBL6h\s;r3]r at C]
+%[ft\0=(=QXm`,knLZNcf/G)[J,]jDH%mZ,S8O2[WWQ$YAGsD:bc^tI^N`I8LH/CFX3e9/DS_VDuZ15u at Rh9VhF-L^3<T#8J3VU at W
+%6/5!cjlgt!bfdBKEio^hSgVI!#5ZkA[MZhG5m`XTCm(_[#RhLj(S(dN<.?6[k(_U\s5a6!'k?-gS`;VK?CCIn0H$DR,4'F<\OWrs
+%4-PK(80D`jng4IqP4"M,.+94/4n;F`VI,aKL)%Lp+.I"X$c].b+k1AV$:T=i-^Tm[@$R4Oph.-[@@`-CJlt_=l2!G%_\+Yh%rY%W
+%/pVm]GJ7I'HiP.1i\(,iM)^bo-Us,<8_"_Y=Uq6]]_KFgJ=(7;5CN`p=^e<'q6;GHV9MMT*2gI/p;-QDf@=%)[%PnGMEpn9nK$#s
+%/G;eH+,k.YCgr3A^8r`-H_I=97$?i$i-mtS=%LMuhS2:+rYNl'28/a"RT&9ZC%ZSM;/us<cmd>E+Ou.S!/=m\O76#@ZH5gu?gO5.
+%>-1SSXW.TklA\#g:&^n`]sUchBL<ZF+16O3>V(3.R_=!D`)(7gQ9:mNP at Djd#u1T<E]U0X1P?0O9g6r\[#2B=Fc:LIPA-\<1^jIf
+%U.Wc2E3k#lQ<3D#H*ep.I,%k'U/H<RD-h2VQkn*K;RV'k!E4WMn>7&JS'$?f at 3\WGLm-_2GGk$W;0Yt,fkc8/[ILK\kY5M1@=)m"
+%*@SLs*QaQ)9ChBZ9.n7:GMT94$_GJ^AYFHl:qcZ6kNZn"pddC+qReX.T#R3YF[tQIckYdG9K(AsETZ- at ELo`:WQhs.;6[*ub60?!
+%rQGB=&kLl-C9$CWXJEi0SE(,ZH*mcgqSOI!\/uIWSBd?8EO+$TB%dsa=ubq*eOsf.jKbhN2jQtjE2UI8 at 47;2ru$C^N\k_n!&k)\
+%O%Nd=_H&5Ek at SOocWLm=hDJq,hs\3K at OL9M"Ms]*'7PsN/+^2s8Rnj7.8[O\:74a\=41aDSuiu`q*?=K70d[r8g(gO:seT)+VuP0
+%T<BigJ5l at oVfaMPM5R?NWpG1WdlX'<2M3h^['edi-=^N^+]GDF?Y^B*'?5,MkD,/fQ#I?!aiHD*#9.l_$GF\68,[H-8D_$/4pBul
+%`?Hp6. at uRt)a`b8b$.3gOIE=GNWFFb^ukRIe==>UKkB\b-17o$,SCa"Ih$<2V?*6i=LUNmObmujIgeZ,o5/Y6q?L%[F(;:M.F.Z1
+%4;%N8.XOs,J]1/,2-6Hd2g$l(rp+&ZkR?3*J/Bb5(iAJDH.8h>/(NQr_=pKCL0IHo'?)jU:B3XPY[i<E?5Ag!DOGXSQOCUu6JmWC
+%:+kR>hh_8FPipb:4=uQf[%;>7C7gT>]F"2&Rk!X->PuK4bh9X&Yk!sX[rBf5Ca_CMD5iKcSJ!3"_\b#Nrd:kZhZ(aP0#?P:RoA*a
+%"!k84)m,$+UGY8bl(nSK at uY<'_tJ6U.-WMB4"AU>-W1"SF\'gDh=frTImKK6I8-.&h[[fI.9LEan6*p*k2^"e/Xc7;cBaX/*9eeE
+%p*F5o/"UqRF5#6hL[6?-U[(+uB;ea%ErU0m.93KC*cukD7a73-;3d;c68U=AIdGoX9 at B_!B4^c`+)tc+H15I()ks;VH(%j__XWo^
+%1]9$%GZV6?Pr)N\8k[-sC.kA/e<^i`Xd#&lZpu1sO8\]Z98=EQb,?SGr3BlPC/\?J?Ft6AGMQ?W66ZK-NHK]N8^u%\#[U/]]dQbp
+%1`E]qVQ%)THk(Vr-cH+E1E5ppe&t2hX#f*Krt+/[K5_,,hVn6aaa1ML\UfIa8*[%5'E6Fj,N&02qb>_lOJ`\fGh<%"66JKXi0D9H
+%Y#7K;b.!e=E8CFgM3C!tD^pG5;2tL0I8*KuK:]D-K;fgIO5P#Pb.+GL?jcWB+9[G=G4*J*4AQ%b(](]^.G6Y)cMn$S]Hi)-S*,<,
+%4R<X[^/Ktd]MH&\8USmQ:CVimO,jQrQ0)l?ac#3.EDlquEWktW7aPRVVcZKAUpeasHss<QEH&>(8b"8!c4Y?lQ9 at -#;W4oA):jiS
+%e\Als_K0JIn%i4ZH<*eL3M(Oj-"d%DOG,c$k(J#WC)SZQV"3aeRnI3AV2h!OBZ@!1C!1M$]^hLhEJ").Ds#`X9qQdGd_%CFJc!ZD
+%b$hkX896AGJb"ea(Qq!tK%YQSPRF2hm.2`'F56tM9t`@'5Q.[oFNKqrqi&GF.-9M;%%4a$">`r.+.7mq_':Gao/ddM"WuegkE*hY
+%2bWTu[<sS-9p9EG;bhe<AFQ=OZAuS]E3\Za!7'?l?+BNT>`t-W+>"tI^A>,3ZH&-\Q))6JUm at gn^f"(2Y$akmKbn&&9(H([4j;K$
+%3[b:LWCP1eCsXKGm$%m!jj,4`B/-aQkEmW^Ut6A#KQ`Q)=faN?F>f48/-&Td)u($S6l at q\d/!305#Y!hPpU%VVAF-q("mR.:B^7>
+%-U6j+8%<LNah:Ge^O'A_8X$n$fZ5"&i*`\8(5cJV at 8-FTrE=-]k;Eb,$ETG2q1W>];fks(9;,Okk$&5"*'\P[mtB]5,]p/'OdFfj
+%5#pMUf<$#[^<5%M)RWMo8oAPQkBYI^Z07XY9`<1((7jogr=b8ZXG3Y)HN33ijj<D%Q$L),Z^Fp0)c"lCA[MR at 92Pi0eYtX9Pa)L4
+%$rPT!dA[k\mDIu,*^nkQ1UgOhp$S28jYgoNICC?'i>R,Fql`Et at uk\g[j55p4hDgC3soMDVTWU;lSTuB4-%_[Oq=jYDZ`W9PSa8]
+%Wt at 9_K#O[j'ESmW&(47Q'N!N(["!(BNoP>F at n<88f98uAs(hg%PKrsYe'07IC>-elQL.7CcXF4^^GMmFCTeN49%YubDlKX/II(gh
+%q9l]3U7#%&;o4Xm`.FPAhm2sKiJ64YH*HL+=i*M9;!<KpD`"9nNR$3oJ$";2*nV!N7,!f9n$ZBMeRpZ6.GH\g2o4THs"5mWqGF4[
+%TZRkRjLC?C57jjAm9+`ERQU";Zq+1G1ThH&jeqhW)C?J at S,%6jr3lnKWc`Am8_3:A(t!:.,-KDd1poX-cC:;&Kj at Ul,$)dG"?Hgb
+%]3A<.[cqYR$aI at TJR,7jrj(U/#Dj_tp`(r>CBR3roR$[uh!LuU0m]P0#?S5^%:JM[GAb=$W4?2?8pBY at go1?9?3B7MOP6u-^\hc_
+%Y<]2Iql,a0##i8VQ+!`,o<2&/YHs:P\oI"RI29g^jmHV.l7VB"PROP;M.5ih/;tb8hQ(MNN^;qfd%L_'!-*gZkE-p]>odA&dU']t
+%ku8C*;i)Ht<<?0=DZ at sqojh;bP*#:3R-7Zt8g1\5Y>k:XZe]e:&iE]?DU5Wl'BfBE=q5C4^A^#$2.bD9CBrN.MiT7YX*fM0&&tgf
+%4Hcb"(`S8Dkd6SL&3rN!*3]>nqhWbBST[mdb*<r0-S_N#Ys;j[C/uofl34fWX.7=0)ok,[!'J\s`$^DD`2IVAQ"3b;>"SY&>+HEr
+%YZ\\?J>2lbW at u675bD@4A(Nij_dU0TWrGHc-MO2S_+'8S$*pTQrq)F2^.!N,^q[??,nKs#F/+MX?lnI8:n/HN'j][Da@;78J at 1L+
+%$g;54ndt";3- at W./5T#%Y*5*t:AQd^eR\A#buIB1,>U(f$<q(k]tp at A97-(u at QIU4e>IB%lh713jrhNCK-F,dW385'F""\H_gCfq
+%UL!b]rncEB%ceei%@rhlr_(r6E-&uh;Z1Hch4!<SN!T<-0>H@]<-Y^Gnk"o_NJY=>r)!e8I)sGl-2HgI1l#@/*&&\VF\l at .#Pgb/
+%A&k,2/.D%7.r2TUOYG0340t\e)LXr4*E]0,qcI%`48gjFYdqJA*oG'IJ_A)$C=kLE&j.m5@>VlKT[)*Me2RbaI(3'HjqS@'T/F0,
+%+cd]NEuoBg,2h^QRKb.eB015N6sSSUIb_aq$'-qUefmkp@")T/RZQGB.$^"g/E="M8=IR/g5!iA?,t at O%=O(DF#u<B1QqKC;PmI$
+%h?hS&JD=r73`.RZB4^*P,#+ss'6+LP];<.:Z:<7DpB/uNY5_>EWh4+Dk6;TO<^kCqlq(?QiS"bGMkr4A-^lq$K$+SAqSZU$3/g9o
+%Uc$ggdH&\Q8]:Ij]Ua[k,+k+?U2<ZqQZ'm.ZDM at _XS6"D\=$Y+8FCY!E\f$a3?KGYn2B[/XRitP\VdI&Bc.*n1Eh(AL*#C+e[4Ei
+%%%QmYcbQ at N6lu`f_ILl0j![8$-ie"Uba$XO?NS:-qM8[%2d;A42O4Cn1^VeLK_:,1GN-lB,CFB-I-jSh<J.+^cWSU<K)Q)S@>+X2
+%4L$#["tHR7EdXs0HpNJ^:u(l4jL<#l*gMq&ENX0'QhjV;/7VH$52H6H?Z\9]N)saijr:F4I,s,flYn-VoY6Jr!^LI,XabpM/V)s!
+%20gl4mO&/@hs#`Np6f3p@@\O>7>IOpHjV4fQCkos+!]C+N6f'\q)fdjcrDROSFMC$_X_%+4]8$[A_u%G([l6 at Na+hf!.e4MU%P\\
+%I`RaP7_c4PEdWHQDg$h'B:9;Z/GBc#IaP>i at ASuLXX9@"Euj&_)E3q"B?HY^hbjU^ru?sq\dFb)5/)I;LMK[,?RPi"VT?VAh+Up!
+%;Wf6J#.DO;;\UN+Y*'C at RGV,0[j_BA.ZZbbV7^I,!"d_OGS&R9-.dj.0sI5O^e(E>mIdq-4\kB\P$cpeq#^;*JT*MN)7L7&%u)4;
+%qH at J@iliu]EQ**R-DnDPRX#.Sp^$;(Z_e)?p#s&6Z=I5_kuL;/YNcgWOl1g+O(<e(hKS4U&U1KW`04Ti`,jn)P3bT[nl,nJ)0_Bb
+%10%[ZZM_X1N`tkn91!*[ZpDZWSgO8h at 1q6+FHZDUdSH#f3S5V#W+WcB#=t=ZgQ-3>/)J+Rqp8TIV!;)o-1DC;;JeLt=- at c5[EK/D
+%-C#pMFe4sU[)ie@\c@^T#-Fe#:ss-O?LG4tJ>#;u;B\lEY'Fgh/n\"'mlUo#o&s-7%Z35=S^-,j<SJcZW^G&#C3t$6b&sM[*^Sns
+%!Sb':aP?/iES9%Z at Mk^N%`q4S_%J8E;XW1UHAXRaX__<YrlbsJ[6;iuJ!ht5=+\?^Vah]UY5L^6kgF8d3I,PWXYK)9_Q.fh9i(aB
+%_>!1.hH0DsdT'&jC#X;!SN.i!6S'T2D$&s=C<c/-r]AMu?kCXZP%Ok1YOe5XiC$d6r?&CLk/N_(P]ao>YKWI8`ke^]7A*J^k%<^N
+%(1+Mkj5UVBfKnqBs5fpqM at LE23p^UjP4Us&TpC;Q(s85OjZMZ"4=P:AYeD6U:!I+[B:PEO=Lg^?]OEnDh=u8c&Q?'t@>r>'UuOim
+%3tRTt.IXQp[/EEq^Su-l-TdsCqqKLco?:@6Y_HW5Ot*-7[tuAA95qWM$6tnCb%ZZnr80inOg@?ln!t\5Sg9kVm:rP.Q$@C7QgYa+
+%_j-BKq+dO at l:Dn00O_6d9t`&aeJ;W"fH'aPABY at 5mX/c#FYB8qm&]?U at UQ'Z)/SAI=]CjG\g0DFP)dRp5a^2ppn"j4=sV+]UhQ)\
+%49,Ta0D-;2]#o%WFf)%i)-k6`S9*'ITmhI.5ekuni0%V(.qO(qOhoaZ)I7q$'5+`RX2FVWZI)@Q/jn]AjZNA)Qu!%.)jCTq@!LNT
+%_WP1kB;q#lp>diq;VLk0#Rk%Jo'%>^"Sp/'-!$9dB+Yl$q4=o[F.%FRI.!2Fj#K'd0l. at iEX.l?U)h\'M[^T!8WF)`\^J"qk,KA"
+%#uhOrf at i`S=d`V$$_AdmEuFSmbM6%$Q]2<@4A#]h^C\LDlF<eT024[;NK=20](X>-8p.1>aiOj4[\H[p?C@$0-o<p6GDb1oMiB_p
+%Sl0T8Ysu2Q^5ftq^M8d_S%V)fGd$4/1S`c$B'm^'$V0<(/nO't0uV?O^eLDjl"d[[1H0-LV7%Y<5UoEMe8^knjYfutg2H."VcK6i
+%nd'i^;U8(4/\Si-,H@>r:@o]C]4+^*L0`?m at SM;K8ua!&r6;&A1umbIMQE,MOE5OWjPnpW?hFE@%n5l]QX&t.K at I]gl2LL,T(\#N
+%]%Jo%VKF,SI]]nS''qV^a"*XQ1F6QWW1#KVPP7b%7?\i_fGn3-AM(*#PNVn5 at 5$.ALqf2mI#*h27iauiD_;P/f5t:Hg,_^[R_JIc
+%;Fn#E:O/S57Ug[O'H?-Z^1$\tdJKCQLb.:.mS14*9a66\$!6QGE[W3GPG2iW7(=G-SW%`D;UB!eVtNMeQ<^Okj[IS2X]-e6Y*e?k
+%a)(M\Y;80cV.J#>T,&2p6F./qg,O"fYDkn?(Z)VZf:7X7:&ERBgkgj2/.uRecc6;(*So(&VgppC0&t(U2Rq[bXbaJkhoc\k\oF"m
+%IW>V9F702Kej/rN.E^DKFUCj7Q3=0gk+(DRDDtUBJ%:)'e]W at +PcNlS/UX\`IVs8o(RgJ21</4E;'Pb1dsVqOaT>Eu_Q,-t9Ad11
+%AH#3`e#1ht7Ch`9(L_,6M$I7"J2>7g]/2/Kq;nm_5V?M3ZmVra.%PBJ>G,hn;@n0;&Wc<G3A*Vp>)1qcrRWSo[&(-M>"X:Z"MA$S
+%;W-_LThOTaj^7&U/]lob+qkbbM?7g#r,SBKhl?q.r:]kGk4r:6RjDtF+O$(b<08WI?a`<mD<s^lBZW7C$^PQ+7il8(AG4!/__KG$
+%BJ#aib at Sh&rIt0oMmb#kNLVp_)nJA8n3/>8.1:lVmg[c;TVT3.i$XP4X=9UBdi2YC,b14MHFBBHQT-`DN6Vgljh4gZl>!%:Q;=u=
+%hW?$"G;:FMB-4AJ=CdGRBL<#$D>L^YK2nE`3)p&RK&;R5H0)DMWNdm:;B]4e+dJlEC(g1X2Af6Lhb=Sq`=^5\9dQ1T`=La%9?^\3
+%SP+-3oAs"FZlC<,Us>!H,4.lhr)@M!G&)[[;8I>Rh#9Ahk\'6f:e?jg%Qt\fj;1f+qh_:qHHt0o85LB:oEHBCS)ZH`9tLDA8/lF2
+%SA9g/g^UWUAY&MB6`_GrnL`gtRM\?dc/_$UPs/Q#<s:=ZPVYa%Yj<c+Gm1_Ub^H+X8=\i5SW,pjp-Qn(2G&o&G/2?Y,lo)SblkuA
+%ADSsU1@[M/_t$d?Jt$K.m?UIgHHu`:,PBFpph=8\AZLE:rX:l_qUND_f^!p)$NlP<#FlW"0J9gE;YrkoLo:`?njtf7-Jh"ITU*C+
+%-P(uJ;760Gnk`lOLoBBdC1?6N)Y6<V#qAk'=>qcBfN("E;)8/TViq\KffBk=^1$SVZP`]:`htT[boh.IUq(NaFc33&&UV\OBa.QR
+%LVBrgllK?6oH&MJ#/6VgRU22)Lff;<mr-s4<6p8=AACta+47""4FrB\GDR?$7VFJUR[9R#qF2ocHb<p3(>Y!V9r`oe^m!"PR3hd-
+%Ud;%QjgIStk\_0U&1Q3d at 4-<ab\,&T41fs0lb(X'6?O20ml5lGj1SiYK,mDtW<1WT;<0B4D`t$V0,2 at jD9X<O^/1"\Bg/]W7T>m\
+%5_9cf+prjB30J2ESf(,-%sFsqQBt#cZo+^dr)XBObKLCdo5b0-IE<!1\fEY.;+`gM<s30KE]gdQqV;t%>J&/7b'jaBl:jP]S/QXX
+%*BOLfDG/0c"G,j.4M@!&9SD$HHiT@)OLXu5!UYQI<542b'\$W?1'e7oS5C,TDY`3Jja+]qon(NTbjU&nW.U9GR'okeJQR959WiNg
+%[R^E;+<uQ,E:V-Ko%U7hD#*\ur4:_aLhlY]p`IlQj$8s"Ca:0P$SBMi7nK\6m+Y%b.X<9-W)JPk_jq^:N20YBc6m9L#]uOmMU!n5
+%+klX)C<9bZ.p*LVkBp*$L+*mcS;Q0=q,C0MKCb\qO9B_Y,Oq##HP9[`SCJ]uZYJ5gkfpqO>d.(/>'6Ac"3ncCRWs4[Y,?2[6:E1[
+%H15/WoEPS1^?\AQ2$]NMfD]FS>n`sA2PmqtF0V(R)@+J2'QHse+Pf]M>"Z-DX>F>Edb0%NO?/$WIQqB;kPFG[C&@\0qfrX>k9^=p
+%fD5%nF8C'bp&&^m5*$,C8p`_3R&p,;LK,sr:Y_c"De5S5c\)nnVUZG1Q>]J1H<=XTNN@)Le\Ajl&D5"UObAu&p9E>"B9Tm at _urRb
+%,!@ZNCSIPXAt]XJ,N50ZQX?tu'!t4%\%ObTVSA:8&aVHRN(eia2J(<XHV9iG$=nsEKZ]o_dPIae1N=46.FBh8LUD,nb&Gg^3\'kF
+%:5#S^EpHo%j-:gJo\5kYQ$E60E0DC8)3_%`"`s'oj;VCfa()iJ"M#iN2\YdU:hT:h:fC6qka8j[#",57G"U56URB<BX.+sYR;@CQ
+%/k]Rn3H%n:K9_\>]&:M.mWGO'lgE4^go#J7;Q!.MTK-W3,1n-DJr9;IerA]*7HCA.)C\::0eG29l>qjOY'e_+:&(tJ>>D0kfS0Ff
+%;O/t#.sCg?q-Rqk+q*8T`gr?QQdRMlU?A648('m;DBIX"EUY+*aK-`!/OkA2?k!b6T)6Q1^k?\t$8P&<`i^uLd6n,r!'/3U`o+XD
+%<4,I=]/:2+RBbmIZFSnNKn.7=3VaB)g,eLd#ukSm&?I8MG_;cuBbL7DLoTR0j36CL36<=-"(BK!I_"28h$d]Jj-PRjb^4*0+`B*g
+%Z<<D><_B[__2jLd#d]l9p7-,O2O3T<Eb28^Rlh?K7f0\Ia"%rbLa#]?\)b]_;1WSLJKIU?<[I(BaPgHC<bEP44QeSe+RK6rAe_T+
+%jRA:MqrSmj)gPsCcP%%WdN7Gi^*2UGc_<&PRq:m$jGMU-UnY+!&o.=j3_A%j2u-57_VLj\9_?2Co^iW=Nd6V86:$'1%/tV.<@[sY
+%"Js#QNd\^Y#b?]8_![noHF17pkno(QkO3KKFkX3/9tq at L%T7W%^#XK[37$%g,f#n&KTg^[+^)90Rr-o-Mi7XV-knEQl`P$>nJL>+
+%/G"<oW8q_'?S<nnLT.nNd"IiR>pdV\Rq>%p*,kgP=TN8$`Q-;Nj_]-W%]%ukEQrr%SgKmr6IjLWF7qX2kZ-=1:g\\&)aRt.h&c37
+%f^iCWe<[$Q`-Xr)-b0 at -jI!sNZk.7fTBYX at DG_#/W*]q027^>GmSIfsdi?37>;%F:?Ml-sT_PFa,]*E4b9%nqR5P&E;2urhQi.VD
+%H=C<6NAb:EO&>o4&]DTKCcU]R+em[gq[rNJC!p\b/5VJCnkGLsXgl_ao!aQa;\XEo]DY at EAAj*X\?&5:!GZB9S at ut3=J2K2$^FfV
+%4FY`]b_6TmGXO[ij"KT;ghV?]lA>\As3ACAI`#CaRnP&*X+VXZ'nJk#SLLj`!2nroJ488[d*9A'HKmjjb&Xo7UZ\Hu\'VnDX<cmr
+%#2GY$kKsDg=D!s0h&t7<=rf!UpuMB7(N`\kCu'o^k%lDq(>``e#s!:g/^N2fG,e8h5D<]`1O&4Q5I5:@Ce1ZdI:P#BcQ%9TCmC?A
+%W_END;;LeT<b]n at I^,SbnhU2800sIQD&ho]@q;q0?#K+udI1IK,3G]4e?\1)SPOOm,>'rET6)A+Z0InIDgnHmQ;/4^10\99^J:3K
+%S[.Fbns)cU]"ngr'4]T;eR%J[p'_n6N at 3Nlp?+hDUm at u:K6_n!NLXU,=HC"^jq`MIPs,[a"ri`Di[:SVI4^$)a-G/sGE5rU)&j??
+%NM%pV#`^\;P%sUK5S4"%@bg$oV/ijqQQ")6G5e'F%\N?,JD>1;E_8j98K_LQ`l:;!M=B`D.D21^,u9>PhT7F=_;^gY!S*Cpf8@(#
+%n;FQuAa>Tkf?L(t9qHcpGTp<%VL^sk`Y1Y9oYuL>G:keV)S%/(TDN(WSB=ckN1L<Kh1QQf^UbaDF7H&a2`^H;?1$e2f2g1`B`+nJ
+%iIU[]1Y=*XYep)+\I)/<0e>[CI@(WYR*9DLGUh#Kk.D!VmlbrG?ST*Z0$M/L"aj2'W8%,e3BFSlAmg at r#M!r;)fkm_SX&Ms]oeJe
+%0dplSEGRB^WEW7lVZ`m4>SBh`p//Zu-Q^IqW?Kr.(VVO1+mQue,Ts32N`qh>M*?<;[sXEd:.5.=XlP>O[!YmIQ895&kA"5GXQrEF
+%=Rn_uq3HqX4:4OfI)6$oBhdP'n=58u]0(PrAK0M/WYg^Qqp[>\q+?jeoDXR((QIb9kd_ at Bs2Y%#fl`Q+c;Y]M8n]7+B.o"F4Il"'
+%:9Gd`C1.n%0D'mML at +&Ro&m^W/f:Rui'qYJ'>S20'BH]*3p2?*#E>7i,9djU")fU+1(Y#dLj92Z7D"*SD2sl&FZr:CcraF$g+uKl
+%W`lqGGAGLWns80CWfXuo*)=_*F)Q?6-0XF_C'gcu8=d(3"3`Lh5SbYH_18\pHX.(X;hZJd0snJn`s$kkf at H"K$hXbq[a9]J;/h>Q
+%6GAGeigt(:n7p9d at Y\O23%+/M1J=iZI.UhIR52+ZR at Cr0I:mHtC2o![R_M=!LX+GYk=j)Wm+1#RXa:UqCl"0=4]C>W?Q at tl:0rCo
+%?d&(u4toD1];O,VJOFNbkXPq6j\X+5-20TJRt1'IiH7F)9=7R0V'j>\F&#O<Aka1VEJG!m[s.>5qb at OD_>-%GdsS1V_r/J<jeJYi
+%aGj=d<i,1+DWtV[8k,[.3S5pf0Afd!S;<rkksbP0k<Mg_B.D at YdH?>H7$EAM'jdsThl5$.SVE27s-(c*$Ce8l<P>j]JaDH];M(hC
+%$0JT<8;jiM9;/uOEo at 9F^qOVQi*_O0Kq3sH\K9j$*`UGTB&33U^^83@(o/''!Bc7/U at q+\ONps-#mF8EZK\<\8D16k.bBc^ON9)m
+%MZB-J1FEP=RQL4'(2,sEh+Z[tU.ou3><(kplJ!=d%cENUHPnh?-4 at 9Y^8kEf!Lpf$I]Ko<JC%$)H&=p1M.7o;JN at MD6H;eR5u^K4
+%8Vl#LeR5Ph9ZcOp[TWJJ4LVKG#u7BDUc+NdRO98:k0=U#7s,K(ef8[e&ibJ#l"_N)[Eg<42_(06DAcaFeCL0)+W%^E>pOOgqD*3I
+%#'H&B4PC9GiqjfR$D%,'C.jMT:Lg&!56]m*YIcQQr-k,hCH)d2lSX<kX at WSAb:2\!,D5DFLr)PLCoNe7jM at hIl?\j,E)%)eEu<21
+%_JLY2&^Z\_riffK88!buQo+W9bR7=eBGI/][l!C@[iam`f0Sg^&3j<8J^BV<C-C)KCHb&CS/B2-qQRAX-G'gT".%baEgM'Gpn[*Z
+%:oF>LdC"aS/P=n`pINq$kkP2-X52(86N5Y&k9n>t at 4":9-BW.<S at HdZP&6CUEbSE<VM(KQ[A at j;>eb#)]]rGR?e6XVT%GPT at c#@>
+%P;LXQM!_b,ishlr[WdJ#7$RF'Z<UGZDL6Ma8X`YGKRWmPgLer$M`5i0L$V=SJOB#rfq9n;\LTuh"d-&F]HhQiYac]:I=)Zog8MZn
+%SCsIY`r/9CC,XD;=JQEfDB?tP+R?^7$2N1.*#JI!RZ_\KQV(UFkNPBmD0AW(_QVg&T\5OHR&iIW]&[E*lj%5-%ScQ)Sp-0t>rWgf
+%2-Le4nL at d91be:orfp;bR!'U6(;m:A-m\\L,cc?pdIj#"a%:ST]pimDXs<2lY-(`tK at .8#fkPt/Ve#Et7OK[V'ReL.(CYBGs'(MW
+%*bJ/<f&JkA3nrZ>a_"[:8o?5P8"a'4_E\hc5<l??JP.)C\MoT'C('a(UTTnU&.fLcSu:rU/6#W4nFH"%V:AhN:6V>Q$UEo4bq[)l
+%?WJsa$BZIlQepS="YV)/&^d[//5nA1pX27XB^6899H6a9_.It\MHd_,]<=[OcP1]QTdZt,_9WU%6=8Seadl&Hj(#X_dcRpqekoKp
+%4+#I5TY(:;$_94o"KD#k4#TBcKQaXo8U[!<e-$`DqSXZ>6h*,[WK%c1ML#1]^\a7CX4sXS[3puR83N>$#3"W)*Q3F;1qoI%.?K]#
+%`eTe-dC9ej4kgq\ITGTY>qqcZ3P1Y&ai.iY=:"k1KMdpb?9<QgrnU1g[Lb.hFkl(;_$DV&qi#GQ]tS^=L0m:@_up=+g5]VJ)AWX.
+%4%,,tR+Z8gD.YJu8]57h@[6sqVlU_Mp89d&V32LX$BZP=Dkt^\Bt8A!*jf(f=&.+cq#(o$o#X1u at h['^T^i(K)fQDiRV/)[KBMT8
+%9ne"hJmrZI#[j74cF&rV-lu2d0bup-K^P]:[Pg("R%,>b]3bQkRQ!8BZ]F>hU!]'VV?tN\[F8'_/"$[/O&!.VjD;2FcA=+.[e3@:
+%9RmUV[n)m![FZDCTTXh_gmsL9DbL(W#l./<S at md<G>qo>RqhTc>bjqBcp[Y8(:H;Pr[<ZZp&]d-C<,2n>)ph8!uu-_[m3.J3Odk&
+%#-aqf2RtSgJ*g_]F9B4D!tPc/WqfBF\X'3#HDYl9BO$04P at sL2'A0aO[`k0[cmksK@'Gj*83V&91_l<?)rJrm.bG_`G2*]m^@ec=
+%Z@:\=^llTad_VG)IYQ$Eeq27I:9bPC^t<$IBIkP\BdiLn,mQc?P^ltWHuL>Ken$#e]%B'@LU5qZjU&2Zb4 at K"O at AVNWX.ONF7%o:
+%r*pk9UhrO[5Fm&=[htX3.XWhcjnVVH\g&B=>%#Uc:J$XH[Hfg/pK`t89;c<c%%<^GXL)P2c$UEW]LIOMett*Le"<*F:G8?Re/'Y(
+%-7PHAU/hjd`U^6g$%uRt%_J84Y_ibmoC'g[MKZ>R?P)-g9IN-o at t=&_PL']B0qdE;9LH)-?<OLP,4)mEI^NbZ91o!IP.CkqGgodi
+%\]A,>0&#pd4>I"GG2*:FDu24`hrb!(aid9!13kTF+n\Tn6:r9(_CmY3Q16jh?ab.s:CL0u]U&m`1C!)$od6Or)K&0;mkAd[PIL/8
+%`a- at H+.P8=#@ae$Vc).hbf&AR("tbq-#tWqHg_)`cZb7KT=KUos+$S2fgl(eehY,Z1SnGFo>A]C2,Q.*9*QH%)E.`m7rV_"W at uR\
+%`TRRAauMXGG8&cTm=9*2>i-O_"P5HU^l?1lAK at um8.Gj[%"ma[XD^A-Y$(2IOXjo#Hgan>fG_cK/;&rPP*i^$S(\?fN/IMH:*ZYs
+%NLHo:dsUfJfLHLQFgKb36"V^/iO1+3DqNBhnd*Yq"5\F,k/a;^6AR^O+LW30MlX8j9d2bB<*RFeC!KXqhn+T&[ie].\k at 9%:Elp4
+%>idB+s.$<2Fdn!!V:.(Sl1UR:/jqUXEDAUh"Q,G$Fj+hl^)f;->Ug[q6+M4-jr&tm3VOX']M at qN4M9[r/@_^:XTT37_3J)UNL)MG
+%82\eB$g;kr,O'p-kk:q2ZbG(AGjG/-5A%jW@*kH at 4%0UA;KD54/_)T-fM[U6`D16AhT7WtmuAMc9#7N#[jk*nOl8fCI"Kc#nu@='
+%!UtXVES(KJ4)L^+DP,k+11X2!*>9b_8;`+6:u<_]jb)729W7?X:99R)]Npim5?0`E&aXZaCF1>S at XroerD7s8<SF4F;V"`K6kp*V
+%`$_%7\"`uJra$'&4(W"9E>!)/!cK^TUc"A?V(r0Gh4/u0i??GA+Q\;gZ/Pr;B!EL4-==gurIoiVs#COfeLgPb#pnciY>7&^VMiL:
+%P$=6D,(^elPE at 0uXC%Rec.d,YNt;3/WQpl-_U/+_C0VSjFA*ctOdF`0((f)AofutZ%d`n&:'Xo?d2%ql6lt"]05:B53+1HL*@:5>
+%k5o\nSnGQo^d(N`+1lHS)[&B'N`-p#keLZs*[HFjl3-48QeH-RSt223Us,Ut\i@>9(X+\7Rhant,#o]_pU:M at .60I!PjtTODH#RT
+%E@`NMUG3!!;F4)-2>p"O=As"uf9nY6?[dD'Af_2apQQ2RcHKRN_F at MnCuh#6$\RX(_jW&(-.T1 at ipAll<0nT>>[3*fELsAsH.q>g
+%OOb.YXGPn%($Vr-o8j:'+7'$MF6`L-<of+dLs/q-fLG,1coo*3'N2 at 1EO,%B'gCkh-?c;h`Df($bLWY;NQ_#!O'K"@aZmE`W\/H6
+%%!HGN@!`LiZ0Aobc""BEqEPek'r6oU1RUgI_6XrC2BnI9.ISW]k<a"K+loI;Op8e;G7_V]!@2o1irIE.l)eW')fG=iO.hT),0hY$
+%08W27a$*HdV&@0bEfkF2R\h#A;Rh>J[IQUj;e-pZ<'Ia*&oZIfJne_mHsfSuZOFU1"=m!6_"5Llj-h9t=m.ZPg\DQ@)l+nj&lnn?
+%Mq-,?-roL86!-``F49^p>9Zdl_"]L9Ntul*+luK&M/n/=im7]sQ3kD7`lK_MaF+S))B!=eYU"?Uet4L`jcC1\NQ#M$dWKHVh>/5B
+%2J5,hI+.=5;iN9q@:NI0O=`TG. at S*3E-=n^HajbE>]fQY*uZDP&]q_'=F11V:4:tX*rtCO(![Rsg_.'ZZ8 at 8N&#r+HUKP-N/-0PT
+%Kg(kB-boSgn<)<:5atp0$lss+0=.j0b1rOePi%H"Y%J:mIaEl<26FaA<6-GVA?oJF#]8:DV%Ch"aW3t#`DQWoiQI*f5C$j9LX9p:
+%H.RsAf:Fhg&=h$K[SfDa0i:(7,^>$.>V_Af_8`5<b@/N]kfh3O;?Kf4,$;?D>G#Hs/&e>ZK$G;TO`.RF at OKf*4+kEEQ1i(53><Wa
+%9ifcu<+u975^)_q3SS>:M%?rLLh+guIiuS$Du#D at a7Xhc7"f.V^+(b7lIbJC^"]_Dh3rgiA5YhBY192`5#.cZ68r,DW%^J(E)*]R
+%:@M!XOU#0reM5<@^S%%,kN<!JV+ at -]pE,*VU[Q%iTB1t?kBXQ4b at k[8Z#$eRR7d6#$`\GGjgjFs=lNe;<6YMBK=L=O&!(&g.rQeQ
+%'*2*Yn]reGK_$=Cn^8^XTlno^hU"$+V-J)kYa7":\TciEoa at Q_,on3`i7LF3WZt3l?SE7gZ$nd=O].uJKrGH6i_J:mdm"\sm,dG$
+%1c++P.9bq*$Fl/Gfu^V\j2GN:13J<Ae]le=qQGkZbee+[DU=uiOSH?>VHY^Jq!7B0kg18cX]B7Kq#!'s[4IUn-(gGaf5$RhC>J:t
+%&i;uI at 9J(E3rF at VXS+bi*Qa`N`BA3fg>)4Wbj.AZo0'i2s.&TK&-mA(;LtgMD\fHRZ,(W<BkkrZ1CRnor_OfP;WP)$^?2#iPau#C
+%$$Ll"gRe=8U.VsfEIqg;^3(n:Wu!n^cb-'%bJD#k9g\Vl)HZ[?^!$"'N(($983(Kjb!@6d<_k=Bp9Z(79Y7]-JD\)"QEe#nPkT3W
+%iqd_&R2L<Y*$,fc')bsQ*Q+Ic4uu#Z97`MZB6eU6fP9LkXd&SO,e,<`-'#dmmI;p!@/?H-m\":)#'b>MI*'P)'K+2+8l)]i8*7p!
+%VTP*S5$r`s[.kVGWognXe(Ie";Ag70<adR?ru%&8<^?=Wr:%4Yhabhc1548F>YP1tp(C;-JH""Ejd4_a\7SU]/pcsD7ZM>S>uPoN
+%<._Rp>dEfa.[O+<b,,%7`*I:;(RR8T9MbJ]bIKP=P0ZM^e.:,V^?DJp*+[Ptf-A&:U4mE*]*7bGR?4``86T>_5]Y.M@!h^`*LPQX
+%7WWP70*j'N0->=.e^CQEk1PpJrieiFBC[c!d&F_)kJdqjcHAf[=tLO,3u^+i"$tWJB-Mc<2k33AOB,cHR@#?n-SG.-XD(G27G`R_
+%RZIAP'rNf`LZ)<05^m\8"A5/HhFrO5l.EB_n0Z_i3c<+dJu)YYT^Xfg4>s^]Ptdal#:UnT2q_;O3JC0+ekU(a"T\MX4chCl-Eh1A
+%q4kQV$[lm`8AtFR^-h1Y;>UO["uQfC.+,;*;u0U5o?:@XZo'E=0Zc\p5\9*)a2$Q?F$\Y#Hemo(Sq5[gXB"Dc?otla.6huH3NkKZ
+%._4U#G4lj1^\jHM?WlM5K['6V29hRtm6pWR(^QV9nI%eG3[splpral*U@$7]g>6hlbFbg*Zh`&5mpia"RgJeBjoq<,TEpG)1_OEX
+%]&Q%6UXaaiTUbU#]SFXPnc^/Z5=Zn.[6qRI!EEbt##U'Wg5DPNT\6*\M%U8e)irAQcC[e[]nh:GL$T6AOu8.TlbUCgp&15qA,Y]f
+%K#qUF[k6(1T]Cg("Nr[)e%.%)a9XZ]SKM`E$mQGBkE)g0)6`)u-#%O,?3sb(;Sttq[ANk`QUFO?l+\U&RS^rTXu9i,7cu:`pR5?N
+%4S=+IYMPZ>K66^cK8)sddIAgn&ZL3`OBC(*j6[V&mK>XO&=saXUs#5<0]pY]%SL#ODeq6X/OqHhiQth71`gB#=r!flPLl2EmqdQ#
+%.32_AQO3M\\I:B(o$B,c#IsBfXE*m2q"2Vs at lue9lqt/e0$Sg at S4rGgHrP`YLk@(Ufj/I'#ubZq[-IH[-F".XZ!]qGI5B*[)<Db-
+%kE4kKV4=7FQ^9V>;r5N1N+ at N_)#h?o$)f$:6^_Gj(3(@9mh3Z30JUDToAWY9fhZ'X70pe3:4Pi+AiP'[osngWjd>/kI!P'[cA4!S
+%EhI.:i?`ropC at _6G9iZK5=^31n9ggj(RB-f>INKl>SIWF=hR<8^,goq,1E9`)jH^NHhlb`.g7C`a#=V;(<i!+FnCUW;BmGs&g!^$
+%B3jbShos01af8&KbLajY)iDb/G at gG%7rG-\9L'af[KQU_gB]@m0Y!NR>uP_jnS7G_28O at U>[ftKR+]Re=$<UDDbY^p([gutc_PV[
+%=aUt8WRJI+cltlM1^jfB":.nc;\^END9HLt[_8(DO$I1NfK!.I>[EFf_SX]T#3)U8 at 704F9THSFn!K+A(?:NlajW-R<i!OWaut6a
+%rS?6go0B7;/T\>dj</Z'e'A4]BQl;.XaOmdK^p:(*`1I4@*q+<aa8WBMWC=]V`b"aeLR8_;s:I6b/kEKk"HMtrT)MhSE.,+[Ft[=
+%MH)W3UfgelK(pZ-c:`P+,_Nf$qqc5P28r!kPFh at KOPqV<\&8T]<JfCPQuCC`a^Q(iluk;8j^bA(0DjOrnbeLjoCaRF,cpQrYa\/I
+%ADuLr(Xq[tOcSX/0G4<lo<(did"$HNc9[u!X.@&Pp+m_b7+.T`7CuX,<5k_*$<C/lkGeK_qc<oiblEC,$Xru2OW at pYnMZK2TGr(n
+%T/cufs"K)AqVKep6ar1D8h%0OW6Z;np;1`[8BgN\SdMQJ'C_WFP4Y"0:<B62,s3H5,hNoVG9k:+'A>R<-GOG?VS415l#f71/_?k&
+%U1W&c]g42#OC!=Ze4pa$E?h2IGi]%uR[0%5D=AOA,E\'G%.j%dIZS<[kHcYEo=F`n?V at PLY4H8M`[("9Vlh_1_hHPm`A7q#<!u;i
+%G'+^HT;E`c.4qY))"]9N2Yk"EOY?RV">*FeDEp$d9DOpY\/P"8\.:X#R]\ZJ5mP6*T;DN9fp??:8=tF=^\kU*]Zmn/L0e?YYH8^r
+%cjc,.aO`n'o1Dh[]`]EuPIbC"l8>/pP(1BD2dX3NiPN)OU$KSW:\(1.^)L:RAEO[o`R^caOo9L[lQ#tZeW\n#[t]sXN[]u74lt?"
+%b2dJ at lFh#VV<0%+kBo.5/ZJ;D<Rh]2Xf[bE\,]]`#Ic;@WR%"8]Gn\)S`O,Yhqa0lq:q$2juf;5 at pE22JT'_C1M<i\96#@=(ua.S
+%4=c:963-A!o1Vfcr:N at B04:*W,^Yh4N=sBV-iBEJ</Zb3[f`oeK:Vq<.U3H&orPQd at -)iXld,Ku<lr)0$E9uQL+K-_J9VH6M/R=-
+%@X61[G:E\=HMcT+Tb6tng$8%WX^53Xg/%pGT-0WpZk-t.4k7_tT@#BDR^Q]QoL+]:NBC-?N7^o(WRnhKCZj2d.n+LRO-q853.?*L
+%k7$JJh'qd\b at 71<@%*YmQ[*U#eU"5#QC.JP_.lO[2RAS5nG$2hN7IrtdHt=oN)q]XUX>k^aKfa6:%L2JG:EWOEM=buO#(3Qc'Gs-
+%3\U(Z%6puq.D\3.Veo2-nhS9R&u$_#8&`""k>o8$/%U=P&FX3:C2.t;"of5f9.N<oGoaIO$Y:p<e][Yrm-\sBIN*5Bkp%!*0B8m%
+%HRDH!#M?/4'C2G?qB1nU"_re21mFIucBi@]D7M*j@]MQrKp!e\&29C7L8a!2FEFYN1N_t_fX?4!>!YdghEYO:,)9`>khM]_kQ at 6?
+%^T`%F6-eH@],TOa(QC)h0fRgH8htRIeKoo0$/')T\SQ=bnmWqe?aOBW1\k\](2P\7V$WrsEftAL5'Fdn6JjiB8B:K]VeB#W09D*O
+%i7*oI]2($i^3Sn3R^RIK#b_?ds%><o$0t1@@\6j6(PN<$o:Y'7MmVIe\(5DY1rR(jb[)fs=]/$j at 831c1a9@mXgU,&JSg]^C&_\t
+%V:2:NceGfRGom0sLJ9M(0ZRKNlX%RS91nuPqXaJ>9CeX\H<pZ4R)"S>8jo#^Xj5\;`QQA8@:)6hC($YG"f_&VQCtbsQ@:j0k-6F4
+%.u+%M6bcFbGcoW.-Uc@&IN"t_idghmb9SpI\h&dm()%-L(j;qc6VnWBfl)l4dWVM[7p56]:EI;Lplq&7?T-qj75C\ogCF&D1j$7U
+%U!B(?PZ/lmI<nXSc:)%-+/c at q#OOh*2bUn^s44ZsU*9froFbP'>'$rJA[\mBNVFouS0YmLUs'I7_j2!F)JHZ49>L,.RH1#/)16im
+%Y)d^6;cJ]]1jp=<*$kZ>3fdlH7,j74l6A)_,3lfd\,eK#+,Qkbb,aYs@\Iq57+.<1DBUm20+fq\C1HbA4Z5j8^'!sclBU^dVNCcU
+%r*InX*Ak[d8*I$rq'iBk#:+<F(Zi at GH[G6&^N6aLP=4rNo25tNXHL_Ib7?A&^E,GM3HXVr52Mj2;-5MLE)L^j6:W(q8W]?L1sH.^
+%JHD,(ZCAX`JYUO\=AHi(K87:YeF-,[cPJ$R;0>diLNpLVP5[;#c%!=l:F1'>C]/O9q$LYU=i]43/p$,1od)]TrZ`OYjF-=KWngc<
+%H^(N&bojLO*]Y10/#gFXZW9:bP!km[MRso4VV^1,/5;iiZ_iE('T8F;A[9hW$tY&j\'mg#4RjDshYAh($$gk$Bu8hnan%^'I!5AW
+%8R at _Va#gb8E^#<:<uRM6[:m-srY.7(Zf.S!T?T#[qQl3ddbVuCTL[pY-104;_piR2Ierl`(#*A.nt*2#D544W9mUa#P<`Knn&[Bs
+%'IdS4/EF1%QVgKYSP"VGAG5S$Qm2gW(FO+`%sF*eX]?'48kQmAg<$Re#W1J[PbK@@h8n,LH!(@UE=k-k[7nq[=/#7]UlGR*]d,MI
+%KCk*;0&SWbL&89SVoQM at J1k8FJfQh_\l$C'aVrp[IC713ql.l,g_er3d="b5^WdqG?(^?rb%89JXX7`EhbX&h^+\*bGKa\GFSsjO
+%QCgZBBJEm4<4nEL\W<gnhB'/#Nmb9[Y\Naa\)Dq161/2g_YA_a*b"!e3;;p/3]g*_#((7\JHrG,-u_A7hnGo7gaVq4KkDn$)7buk
+%iUK%bD<pc8jm)]lQbAe$ksVq]=Pr6;m4FC&*&PBJgkeM]OJUf,rcb1%:K`l:.$%+g]^l,`O)Y'>qesdkP4+!BXjKt-Q0kbcca&K?
+%N>:^bcMlS.[m2qZFVPnTr_1MV5,D]UDBIiT+L1RG/R"&o,*#[BNR!A4H1nG2EQ^VSC?1<]^.^65TH1]cQrPLmm at BsfUWI#WbF3/-
+%j<[R/ETgZgQi-3$C,=p\;96jP^"M!_kq[ksjLMOBBNXe9_Y9tjc<uJdkgLoS.Ze&oVqtS'+p&;W=>#-'M:JGHR:FY*`tTXa"UI at u
+%MTJ+*4Bke6Qi>pE0/jk":)Wb2)%Lh1ZhE)JBt/9/6-gj,Cr))S9S;-;:GcIFKioH8m?08j56l.WrU(A[mAaGt@>s.C at m:aUhC5&N
+%qahk)O1fc'[3J8G1uC7-s0)`)!>7(dl0]/O*hbMu=r7]F%A?Fs*hZ>CGXT&S&X>e^87m"q&Gb5Hqg>#'*bM9+I<cc*8XW/AZS)n3
+%k%;f\c.:U,<@OZ'k=]u:m$?`"5;kHmWm%QQXX`\9i^(BAR2M\LO`ki'6I)J+MR,`!+/`l2+YgB;Mp!HnZlNk at cq?SjZEpc7OqR>*
+%*mPGa<3P4)oPO[H'eGj!+lCCMP,<o&c.^:>7g7;#I1D5 at lr"QGod_VnO:PCT1`ZkYX6koEDM_aLeR!- at c=s5`lPu]XPDrSYn6ie]
+%"C^gOeM9Tk<*!lO-$5/-"=bXaqUiDh(TJ;Y4B,7b<8L43#nZ%7CJ(/McT\]&>q%<&Xm.-G<[A7ZP?`WgOig+mr5TiHJ8=sBeT&D?
+%'upj,!cUcD1NSQ>;;3]4KIW`0!6EGIeS/:]9?E-&&p*!`E<u:"8-IH4Yk"5Qp--);&c'Etb`t5Y^rXA/)e<bNm<GL;%Z!&:;EcQ'
+%(6-IWHj%VT3t"[)XV1[qd,H$o/ZOq8BEe,)U^:VEfMDd1dNh6%>H!bJ:pSKf;OQRqG&W'$ah4o"+-PeX at akVPa9bdC/IsG(H5,ER
+%BLOY9 at 4SY-C@!GC82 at eL)(<E#6($@#Z,V9^ff=/Mr8:<3HtS;E+S)ij819ancaIgAH'YfsW1.uKXFRQ`FQ1M)$&Ui<dlAHU-\*"s
+%k?u?=APTOVFQY)pQ!r*'7'4GT9->N)-+poYkJPCa)f?06j20p1Y(2?d at aeK@mLgq1`D=0?hJd(0(/>1S#7c]K1t/S%>*![3MHqde
+%:tieNd at rB+l%o\#0O86%9N>NS?&!M("$)0s at N2i6Jp:/KB-$!>mBFQ]9]@J3&i)o"8Y2gl7rmOcWZat?-"Jk+M=e%=7EkO+"Hk at -
+%:Slgt,.E4&lLJ"HWRm?L=tg3<_VM7"kF)Tf^Hq7V"UcB&,Z>bVg'G'(VbZRYhf]l%F at SH8Ku%<`QRpWBnE(Q;g",XdFNBID(A2(Z
+%i>[\uKEYLWdS5RSCo?2 at f90hkVVt&Ws/M)8&H(n7Xus_d#tl/%+0qZgnrr[dMUi at ZTAL[#[1aa0NkR>_]Les(GIE&mb=e188^uh^
+%kHK)KpUCn',8U`[:E\]XG?#WOeP2*&!aak!GY?sWXM:kQUol:A&\B^)XV/1I95193DqQsY3;4R<7C/c:W.0%qlU\.`WmUFCHB\'1
+%GmLt6$'V8c[e%uT#.t+aXIG.N2c$S^l7s.#U59"YTuf]],H1CEAOp'eD;Y\8Qt76VPK8f%BNd>]V1MHcgU'OmL+D'iB*,lE`Gr*C
+%!aD^li6CB./jQ"nCd>o5,5&3E08f.I`tcH/Nk^Ta[)F:]NV*C/B-!tNd3eqrGLF<$-dNC#h/.WP8!M(BN9_g2*cgApHf,c[%F#q%
+%)psg at Y^=gdm7E\VPteY^4L-`t/d>*/XV/13J9^A!S$(R--Ae"FHqmb3I+itoWfe'9-/4b``''GFUIMpkh8`K0;VKPda:h5"XPkU`
+%jQRDP3#Qf#HiP6\64b.B?E=>$96V4",U]Rh[!WNQXJmFFCl&Cu/e76"D*fC_DqO\6kR?s0$1ngHOpp!L,tN"+[5q#F-aPJJJl:DF
+%(#(8jCc3]3;u&G3j\DC<-D)E/a>dWXSAU%l*g7a1DGH^(B[ZDm*mckuCnJgcUp[(*']CtG<6-GD1RdH7i!2:9U?kjB%>*?@9nuH<
+%3j1YCZL7l=4[]I"[Rcc^ZP%doc9>IRLmMkTRnPf6)"=77'>I+13gCl at ikWi<&NA)2WITQtX-+Qckbu-,"8:>,c9dOg'rPqiA?"J>
+%qIZpVF^?aD%ZHL<mY>lO]*BCc+#u?o\T&VY?Wl:PP*<`s`kqk[#Uh88eRArX6JbI8#>fNf1??X&@p^?l1tj<Q$Hpn6(/[2YYdgfo
+%+.gCa_$&=88R3]CfqolI$bTbdTYJ[eO`.!46^ml#^osfn,g0BZ!*?HRfn<>RPqf?gQohq&ZpM078RZF-_o=i/$8N`T;AF++V3ONM
+%RNK^[,$9a2\2-d!M_DOL#I%7^CDDp4[64o6W)PF,9edY=OE+9q8R\(pT81(!,<?mTb1ngV:k>D>DV,]J]m+"F2g,NsGmjGA<((mh
+%>Q&JVR7okdBb3qK&\hnSnk^=5]gW"4PB8ACO?q.-U-fT!-V9B-m313OFS7"d05+#`ULA^qpFb!.:F7813-hcA]/81m4?)qlJUM7`
+%O%9d5`*KZ*Cd['6PgjkY<b[%L>>?/E;p=FW[VI?%i at j42QZ2:\Y0K#'HHEIM!p7Dso!Wkk/^kTiAT=kI.W;bW_SsX&/iXL,:>"E`
+%)ciSI.`Ai9<LsnCm,98Pg&@4.iBKHiSN,VRk[dB7[80'o"t']a3Ok6D'#5<_s"X=j-De6),Kpd#Q;R!Hk at 8S!2&>RI#sD9KU?>.!
+%);4o/G\qIGJ7NYT2HhZ:G7r[E#`L:!(<ZpTSJBf41,b>SaNN]7m&Bh,CEId:7E<-+O:\ag7e.N2#iga&WdOQcT"QmNpT1$MK-0\]
+%g0T?0]&kO[.)k=L at X?RBAXo!HlqgG5=#Cp25dQ]4]h"AtCGPn<Nkc'">Yj>q)4>P/;UX5:#]B!PV\^Co=2]L:+%4KHTaZu%$i#ab
+%hIW"ca:kAoqRZ%r9:Rc1b*N\"X^RVgpK^1KB<kWs<086(O_=1DJ/L?LJPRWM`"uN%h!2"le`<F8Wb'['?[L"[piTdEb9G`I+!nP^
+%,^#7[osB:0/P1]H*IkHNF-g?3W%dIXnFib&BPNRODQCs3QectX^)#pFf:<"a<lr0!5V.jZ.d*)PTEP49k48[].X9$##U05R!krJZ
+%;;Z9`5"0W?9@))"2d&K$R*6%\bfb0eU[q:opMK_dW/"G6N5NJ8T3XJ^]5;>.hCKh6P[(+9YgO^*f;X>lc1j at l.8T0GLRDfs]b=;o
+%IB'<V3?C./Mj!phq"@.b=?6<$DE#nJ8H at T1UX),3pF@(+.CqOh]lQlCX'@TAjQ>odPL=>8%r@,F:"ua/<?Kh5*gK5o49m6S%t&_d
+%E/_`AGHNWGaQrKZm^RX#ee'VOSW04jJ]hp=V at kdb$Ohhc>HIe^o[l^B/$PBWB2Yl07*fpF[$pUFIZ6j\WN/\J*@<cbT&Pnph)otS
+%*38&8"&lFM`2U$&kX,Vj3QiGW"3$b!_FgqH at Z$!g95(k3c5(]<prfK&:b<(<Q"1mG;@6BY!_MrG;#l\KiEVB_V@[G$K8\!C]<ptY
+%8TJIa`pds*<6A:l'5k]5BT\t&'V9kG[^'rri*C5P"L!k?3DVncX!^\a8CWZ?\`p2!iJ26)Q^O!GSug]5=0%3LDdB$0)D3b*TZeI6
+%nj#k+d-X,cA/&joa[T`i,@#6s at ql7T:$nLD\YY=LmGqB68^8&G-P_8D@'VpZ)R.BGQql.F.,Ufjd(*3?/L7MrYA2>hZ.Bb^.56RU
+%ms2ah[n4`D6p&\4.^!%=OG!U0M`8jhXUb$&Oe`U]npJl<r(Za94>jQ4g0-g&Ycj_^"a:)A+F1gAQuFIlZn>@qqUK)'a8K0,6l^0#
+%f%f>J/-`j at .J+<i,7qu(W<G2LpK;=C)\k<Wa#+*"8RTVK:%Oi at n^6Wl6\sfQm-I at T6&\ne&FqM5GWDkk3'nO%MPrQ*8ODGP:QiP[
+%N$_0^=:4Nt at lAT5qtI&eQI?H]n>9NnP,3hn8r=`#^SKeYNIZjf-BS;YPF>Wg8^bTYFGMK$7eo)X'n*Rb89?(X?99cf,;G5\6NZ8s
+%<0+A$9/8DEI?]ik>SYtp>s<AIC*8t9P!mG6?^0jVh^Eu&7?^.8^<1%:19)j&-*297'g-l-X2K)hi&RjB/6A*%fMbQLQFgZU8h2!E
+%L+B)R!WFR`LUm.;-U"9J:5b0EjN1\#/?1eB4r?\"ig%,$^TeQWUmC$07oXA"clbX@,,54mRQ[[Zb(=3c#]i[0IEU=8ka]Vd23X>h
+%V;uMR)=!R4=c20G@^FHW<[,2 at .Z]VWS?nlnK:$5,p[E,F-[!]dhl86 at 3'pN[c,(W.>k55d&7 at .$b-3XAG]:u,ki%&Jp,:,a*@^du
+%ApJYOQ:CICB#4Q9IEHG%JQs.le6nHGRlfL#(`%)Vk.n#C34jQ$F3lO63G at u0]0HJ!E.E\S3mUN0i$S8j,#XI_2.4b]\k>:@3t\E"
+%!A3iK8Y/3V)u5:[*M,cglF9-^+ at Pmr[WRW!h(fL\;)G`^.lOq8YXat.26Pk']p)"CWi'>P1%dY)M$i:)1J<4n(pIhK+QcX+&?HZ&
+%@S%@aZql]B3Kg17^nJ$NorJIT8)WR0n\AVA5&Q:4R"G35.;)qNT&&JX&C*r1j at lL_#E"_8Ch^=&fr"[eN`*#0n$\n[T8a]qBar+h
+%ft=BPfYH#EiZ]<-B(>R4h;g^JO.=nH=r[UO;rYIBWFM7_g8/Ul0&806;FCZB.-+,VSs4OdkGc_'5**TR6XG?FV at 9k'?jTNa,sSp?
+%UmpD-Wshhufk'-XSA8"P,HfWe4?`(!lh7?$IUn.,J*:-<F)IF'gu_,Ki at ZR+<GUFVC6Q?UV5NuW)_bK<L7jUnR"KiFRO-6sq:.j6
+%I:ke%#T_p2I*M0unB[m1,&@5ZX!LEH)rr;pE9IF9i8fkF)\'7In][%oXqaa(62AYI8uPNr\4ATM!$HcT?`@3;`GIZ-8"c$UZq=AD
+%lq[$=FJYU)NfOdDM^&],PS[S1'qg(GG[eNB.=QEVb],<#Xg!prYg;6aMNr_WNcSfI!(aR_VP-U?1&<`'=#iT(mp+tV77D7/<LPq5
+%]1YJhN2X'0MCR7p]nGb1[#MH at 7*'Emg<kFe_JD7'&fXa`k0W=4-j2mtNVTGoZ/rf4"rC)5hZ/l%SGh_m+lSh0hF.a-7<MfpSiebN
+%^>L-)3OBB1YYc1d$!@RMO!HP3`<D%9X86gf_V%.'WNb`POr[TmMhIIa10Mm8P1Gb*&s?8;kh?R=G*:!OJ^'>`(0`8D_t>@dB%kr*
+%^T`pPP4!M/fl\m>YgMCaS5XG8IQ?0J!?[pe;^1'D=SB^@.b?]%<,tmalmRP4"5?i4HZ]N!Ucaegf.OK[Q*m&>qHIZ[Xf>lrd6 at J:
+%dMcS;hCMrn_>B[3IfceRmVNl0ifMP2)H'1gR+JA%%4N.9(>gID3Zb]-MfC7LK/"dTM<J6L?S"(=DcTG$eN,ke9-NP&i0KDV@:9"S
+%@SO*XgU\s;fFW.,>WPQ#N!UOV7GF69S2&SU4FkI&?&kP_O3=>FaG2D%pqP!W37E[^k2kWna at bk(2Hc5$KTGM`,+Q"&Y3n%piksD`
+%!'/0T`_i6O-WVSK]H%nnnblm7]8^=UpEm/q-&K9/Xc)S^2AcKQV&>`BrVPZk>J.?*]SLjKat<\!H,>%NcK.flnN]8k_+gCHS!'?p
+%%U>-Z/GAjENeI*S[h[7J?Up2bRQJKZ2 at 3K1/P(D_/r^`WYrKonm#'OC(m6`&-;X=;euEYPI4.5a%T`7AeWa%K&bg-V*CjsF&m:CF
+%+8@)`fAVg%1f`mb[YTRqD>3KX0PGUcU"P#*9\ZGgOG*+*0k#6JBOI0"*k\D6J1M%o-\dfK#0G7G#;`I_E/F/pJ)+0kLV0;85iWGO
+%=*uJrG+Fi>N0'i-'*rP=m-*<m/p)u+-+:$-D=(lr<Q`0N\TF?:&ua>[eL3UIQ>>5$bt3d?4*'bgUf']gOsEP=UF[(eHWX+IepK/4
+%4p;nuG]k%8e[%6_g]3Z!\,f4g@@m5Q4 at GdXfNA6T`L5p.*.a(Ge8%WJ[<`U%(].C\[212(jh-hQ"%9(_e)`:6W?RA6R*cmI8u+1a
+%D%A9snX6G9d]D)3:\BWMfBKaXP<F6K\V`fr)seVBU*tZdO5.a>:9u4G/g/HVL5MK09+FT8V`Wf>f8ln&%[%/t6"g6q!52E"ai&LE
+%6="_HT)0'9At/.+]nB6EH#Yrf)G"^=L"gi(q2p<1`874H_]]cX=<)9Xftt=IA$aA'=sWblEdV/%*1=1&b\jI!RM/oEp1&!7eLA5t
+%3P(qh"XD1EjtJB;E^G^Q6<8J/9&W=k90=T4Ot)@6M!oP"5VX'_N#^*Cm8e*;qmptO:fUbVUbl7f^QBb?o2uG=]R&-o'_N`?_Wt/#
+%=/;;<=]JVh;`$r*NpBX</BB=CPV07-&h%DO.=*>0bX`IFluLVdM%"\'h9sfL3),K#*1n!H_I?S.:lC)Of2D[mg:!E/*E?-2PrU.l
+%Rnd82F!?S"aZHE0=,FV0FZe/)2\s.'nlU"#klJ^A=_"F]J8OI5b90OX-b7 at Fj!L0s$\hQKXnb4tle)cK=emGY8<M9ZJ!XF,+'DU<
+%m^RKJH5E/5(dHXZh-7g4Lrq^8X6<c(2Y49pIuXJ9QOp?THC8<^;Hk`M"U&oP/`p"iDSKMaI8UgbZTMHF601 at hI;UYW%<i4qF37GP
+%n_O"VCXG]p7 at _qkg"Q";L*1!F)+'p"39kQ9ZWo*:QR"J^fA!.+V:&:X;h!6]A9`&:.2&GW<<aFEJ6ru/&Cm)02N*r'Bq<3iq34?#
+%. at LBcT9D]29p-nnc_;hI_tBZ?i_&$+Xs3&k]$>=fWH%?`;CE.DbQWhW88qF$`o@'r8[GFUNp*XG]GcLSN`-mboVl`:"'Z>oI2&$$
+%^Zn7jd\A^3c`5K??!Y9fb+L8-09\3hq'K9.4Z-DZ$FKluKUV'T<i"8BZ[!$'@)?^W%!IB3c"2:/s(%Dkp"1#P9DCm4assTd+bGbX
+%aGgp)4XCjK&hZ7+9"MlSq]]>h/$j"mLkF#6mT07%*_i)UGc$rYAH6>M$"p1FXd63)KSS(^4N$/(gHjtDSMb>/'\X$T/igp+,-,R*
+%DRN_?$J[2XX]c8\3P:&+h+Ec9D+!3),q'b=h::AuQQGK#cnul"mE[u8!KjpS\Zqc`KM%_+j,-d;G#G-X?NHaAG$4 at NamZ2I6].0i
+%<QEpJA+3*&Yt#g+PDIc'7_lg2B at F?qMSZQDn6j-lA[HFM]krgl9sduWh.*uMk<8oEnS!es47q&;MrL:JS67rFTPV*j7Prr^cCHPS
+%^`EP4GA]E_RrYn0K?DQ;&kJ?6Nk at mTS>l:AdFps2@;ThpXa<[JbEJ/)@-E at K>]LQ!i2bjd#Y(j7*<3>uC,6qoD24?t1S(=2":#LG
+%BFHG0e+K^`cQK05oHSRa,Q<RMgA%Oi'e:\<g<heXI@[Au;]Rb-rU#6$-_?7Om.0"frR`A5NhKr^AdMc=N+t1B\&jPQ3EN@#AOmU,
+%,lI/RZ6J31CNYLqT+8BS("1Ok!Wu>aR?sA>8DgDf6.j_kPr-CeZrfsDU6AGK"r:j"8J_(cj^pX at i@\57[V)-7Aa*WBb[c\'6J*Z3
+%K)-1A,ms$<MRY#F#j.mgYG;#e8E9>$eLg1URmb_#V?eFe-f@:W8M[r@]]D.K9Q#6Dfg<$K\&B6D6Ge0Tk>HYm6i"$])Y[?FYM=/c
+%Xa!`<g5f5&;O9^*Qj'HCn@/u>]8Pfrg-C07m?4`QZ:OP"\S/JI0s""s(/pbDis3GK8QAo;]-Fil(<V(M@>PED.nM9GM%ikM4hCek
+%T!(2.XN>#YI`C;JH5<,3Cl>3,7!)Ap\BY;*<J:^<P1'L@^uhpN!Ma8!f8WbHes%ZsNXci-ngK'1>s="G3cD0Ve6i=Y.hHl`g*S!?
+%\=.c3g*gQ>6PAH(s88iKX$%k*i!ccGC]b_$.Fgbl$sDHX12!pZ=aZ%bn1;*1AOO5NYEmV7.&:h?*Jb*g:eL;#=`c<?p<-Yl$d*?l
+%WeZA_"e0i1I3nqXN^BFu^6hDs6nL/qgT)uJ1)A>)pO8#Uen+M/H^?TB-&^sAT02F?%.'#kCsA-+BqYuLX/p'A>%(n8VobZ^.0!hc
+%8H.9,d"nrWD;;SEo8BDjJOchC]F6^n3uRsl'0S-;+7+jS8R\iGR2H%I;hl5lf,V3W\!p%p$=cJ"O:"169MpUW[7nt0%l at EuGsmmm
+%=>'jTm(P&,EaTb1L-nMHg*p$>EiV:eV')(oELf0OV-^])R!-,'#%P+b(e3=uo!hCKH_Q.M;O;%>3tLNX#g,Jn])elQ4qdG,18!rJ
+%<\84i#T?4XRu7tr5cAQD>5=.DE[(Zk[MEga$+Ls(53//><NWZR$//sg*"HpK9IiUWD`7+.Y_1DGW]krXHk:!p'G/5Fm;i>p&'jk\
+%`4a at m$;??#:&5Bs3ojJaEE]8)Ou:?jhSbn"H'2EAh*!O5'SAmn$^j">331*WVb.Sn.U2.\._k5<05buq8ZZsPmAbeU>N-/D:G0a,
+%g.b;WS>ncL=]1LT\N3YL)(1Y4m5?i*Q=K"U^k)-9h7P/HO<P"7oZ1/qkH[.CM%S^>k?Q>!p)L.>*f9bo3m_$Q7D at NhHI>2n[,"7Q
+%JJI.bSkA-]1D1L@/T3X(1P!)Sa:a;jcu'^8+k<7n"/jC]*mS?]Va1_:k#`i4)Jif%IOPMEa`m7n:XIC-`="iVn at K"jI>Qamlu!H:
+%.>r2R3?=)V35X?2d<;CVSB</^Vg*IYf[Ut_hG3RuD@`D<C<_A=gV at dI:1%+q<s(g+.DN,XOA/V#OH-njTZ^P`*)NQ>bu4_`_NuFq
+%%hBS:$RjiE?^7Vr=5]e1+U+saJqjS?jNfa5"D9+D#<M3(b4tL(qp[Rq+AH!]>_J8,>7*tiYP(:64uECR`:%5P#9ujCM6GYSo(G@/
+%#B3H4JXOO&.0+s)EbJ4$@sb-e]l>Ie%JHh<"g"K?V at b36)j_1qA?'hNJ08B+kO+Z-L-ajB=KZ$QiK/=@Ku7h2m4;8?k1+7Mb&2I&
+%6Y)P%hI.4;ap;)"@2G/>*:CI5;ME%&3Jd%B&NsZ361JA5jto9<"lgEI-`r!sK22`V]9kn_`cTk1P\_/<Ruf07mTO%cW*cbH;+ZX9
+%0,N;0!2Gp;%tK at 6CiJH.N-..liK<N)R'4su;-I4pSnHYQ^"npVfd:!P[O7S>l&"^mn?]lI:+>PX3UqFM=+U.HZEnL0e86tO=iO\Q
+%1p'LSF"=pn>lr?6&0u7j,ZW)f/GtS\Oi-lWF5WXf-4dlTEM&4:?ip87$mnlaNZJmhn-EBREth,*heb-/48Nm\61TG1ei,3OGAM2a
+%\JFYY?L'Lt9+Rb9eZQ'/lJ_F^?HtTK[oIHJobg?O4\kD4e&eLoPT#]3JiCf3mbAdoj3XY:*TUoXafP]=,83]N8,rpTG&<DQ=fUVA
+%elg56F*%p5'fNSC(JjiLl9tbY<7\D]7F#W\k6n4a[\`CkEd;Nk,72;RnsF$)%MsQueU<^K"7+4JO(-W>_mc&#-VWO(9iWTU?LS;:
+%)@@AR+l>F%CSoUi1jahcpIXf[A8md9bLri?`M(WJ3)Ab&UJl-W*QCO$9qbrLms/FF7*e2W?(0',Bs>r66of>sSeu<f.!A0-ln4:B
+%FrcE5ZPJE+E!2-?Td%XjXTrWonX/>_!hC\is,6o(p&BNWs!L"gr2-rI+5["%^&,^JgFn$G+5U9&nFk*3s7j)%ldp(Qb?s0,q=Pj,
+%qd9?igM\]nn\>%ODgqL at fA!(t]3iQbKtk at J^](+FHTciVl[&p8/1duRnVb//f at u)4Dr:J at qp>/#n,!"_CiA_rh.-HM>lK&oG=@L9
+%iP5<e]D(].?F*YKkrjc__u;-^qt9g`E'M!s='tcGs7g3=]uTg9oBX#,T7?U5rpDpVFT9O^0E8(7?[]V9o?Eori946LrPuAh?D%2q
+%Q[ec'gHWH"rUoVDh#HsC/&+7Gn,@[%s'Fm'pW)+FJ+Mjt+8R):huE5kq=`XRDr5OFf<=W:^\R#]qg\/MhV\?3J)B/^M4aeBg]$0D
+%Dnc%.m>lYPdmpr(pL!ss-a.<8I/V<^s*J)J?i&fWq=Yp1lLk%(Gl<'*ros*2oCr",^3STX5QAb7m at 2_jhn8d]Rskm/+8t@]=+Bth
+%lSnd7hS+L,K=V#FV>em2rqZ;lcTf),n)*$oe$&cES,VRHqu6Tff5I8<q#:9IqesA8r9jR=3<(#eEW2AUs6_9'qK;]/rnH?0((A&q
+%Ip7,(r&am!k25nes8MS+J+NX)p](0SD`_=tI-Y/<Qe0iEh`lNK0DY-9 at N9G4^\Ye_kO8BP:[i]/k3Mn_5.!7MHZso7_>Nsj[F]=\
+%phe@#jCc`Pa2d'Z2t8R"r:'F9rO8HO4/)4hc\D,\O'hlMr(=7cmd+"M2hpMWGhg<^(Bs.er5qsUNW0X3(B<]6>C(bI?d.'1J+R=H
+%5CW at O]mn?qp;QWA+T(>o`;8^Grq"&+Gg.0lh9N4YLNfr:pNtR9go$M5oV^U&T+0`O^OFf7naGp3Ufnj)qnN+dJ*3dpIcOnuIP4p)
+%G7sJf5'99XGFuY3Du]OupE+l&F88g<m_;H+rlR_Mp[qU-^[I;S?LC%*q:m#M\GTl)J,2,gDi&ko;D?ZJo-Z0fLQ?o\rC?nai?LYX
+%DJpg#Wp<qc4+=]E^*&O7L>D[_++AGsp33_?`1Htp9qL]drpp$VgH4o85Q>Z:n*g+RO8!SMIX=;oHhX\Xq=+1HrT!j)J,]$MpCH`^
+%DkDOKiY-e!h&h-VIttLXr;HV at oXRc4qtAQAIr'VuLT:FCihdgTGQ7H%T7>Z=$hQa.r9E[Y*KTjdh>CLWfDETi?JjQ;5B(&i7k_p"
+%qq(f:l8RMCb883Ds5q5j21<%oIc2=GnG)=MT3fja=1j[AH'ReF?M2UI^1N!mHi2=G]p.^;r[VdCAVJ/45 at U]Yg]u[N[i4`(^H:lN
+%G^l?oq=S7Zk.3``(4ZA+Kq*YhrncPGHi$q#YMQZG?ha0drVXS2ir4?jkM'@g0D)mTkE#$-Vb?k+@^r7is8;ZB5 at F5XGJmu5\?=#G
+%D:QCF`OW8:.t;\kR"t_:.ST't'n:PWj&;OMlORpjrjOg.?TgWMVe\k"+91t7QfG>Q?[qkGq>-_4gYTVZJ"E;+psmi_5F.hm/:)s?
+%:Tq=gq0h.LpL.B7e33a![,Cl?ED_dX`peKQpiIV(ci#4UhuPt/SBhe8Rsm5ultsB64-oVjA8,DPm$A+Wkp=ZfEdlL/%fZ*LYNAK!
+%r,f::=&1Glrp[CXKm[.%Isgou\KBDu91#/Gs)bM!I_YZiGAk#5?cReIojm73S+HG=+2=9%1=p9O5Me1*oIF;A`K.QhO+']kTAido
+%oeHEha/gpYk5!9g'Pu]cchhODT.e3'n^D9ATC)<qmH<B at 2!B3T4NL=eT'uO3gl/E'a.Ml/:OdibF5H:SRoi2RjW;G@?5^63-U[^h
+%\NK4sIC:<6md\TopRa&'q57#No'&n5h<OSR=QGO8>j&H2phF]UB6X7BEo4=s&,l at a(YI?[=82U8kKPo1GBUgo_\V\7r:HJ.pO;Q)
+%T=q!qci;Hi*q=\_a7COe5;pR\-b%*6dSDL]T7?mD^]2"!kJuP)+$RS:rUJ?*I;t61_Y^5J1:R9245i,j(@I*jo4clC!8i1o'<W$W
+%p3Fu6hVuktAUA^Oe"ojToXp:]e#tKj=!)qK;a0*VpCG1<3,NQ%m8%p$;fmmm2`+n2'.`pr7/f^#A+&RMoPs!3V=V=tjgXS0Di5!o
+%=8V4_IbN<Hp/h:FoDZ+]O(\<Cj8/%",WNPae%YcF5%!pQO8e7!X8UI'++ESrD4lCYqSVJRI(1Y5o97/iq2P1AF?d=Wk?CTO2Mc?'
+%4RUrWS=e(?rh'"p='tm`q(Ie)Gc]M@^?0":HoAa+md'CtDa&D#'>;%"T>Au8D]cg\anL-6O-P#$#1K0&k:[Y?.4W(@=[,4So6jDS
+%`BEn^:[OXt(@gW4HeGLG=$"`)aKRepiKLg">+kNLY5+^Zae(r;o*'M.6(]=?(]XF&l=I>O`86j4n`iW\r7+^mj0SRH0?,a7+%73"
+%s8(O[k2N$%hL'Rt0=XH!iH#j-&;ug';;lcp/3_DWqr&dil4NNXIe*9gO-\`*'0`7O:Y.O4rqWIpLl5'm,DD_-qm7\W]]1q`qkcSh
+%@l"hhAb.ik%Sq"i^>Fd)4tl-KVp.Z!Bd`0Ds4tH24UE#;^P-mZ=NX*&qta+757N[GDW1-7="fcU^O,k?:\a/rIpDoY9:d5gT4%Tp
+%A59=WoZQF,r8^;mTCfJ)I_*j,1Em_N5<`EI]J#k)Z/>&0G.tJ;^\Hh2a7uiVhnB$ce'i]eUn5Hnqt;C#(86b8lX)9I36N$'). at tL
+%m&rT#FAJP&)&2o;kP4fDns@@sft<q7V"n(Z-8m`0A[m5;q8sMWEkafN_0s&mUH[Z at imkfVqW^RpkS66Wbf:MA2)4h9h!__cIJB<p
+%r92<l%3HZFICb3+H-m;Xqbd(anHW.R7qqG`P.]"t5 at +<PSCe#Ffp)8orqjN-3PuZsrr'b7r,h&Vk5U?@pM9pb<r:PUI`Af[5D(?M
+%r5+/9rnYKZJ*F3"PF0)K.2DiM?gARnQ_F?3JcYi>oS28I9E0M;e:7'Ys7U(i'a26%"MFU+e%;4kjXC6qVlFtu^#PaAhuE8^rY5gr
+%hG*'Qroq\*Qi:2jr:o<eIod.31+NtJ!:ocqFmbNmDh#^X^\if;pkuo8LH`c$04J\,rtllm\GDP1qT(>DL[X)0$94#`^RZ/4'(urb
+%+.M<P5>N*kZ`D3kJ&[isVQTgnm5'EEZ&"hpQhKhp=7K7-pe_+aKfqYLqYJ,.7m?"u%R+Opcb at gdI/;f_Mm4pN(\^Giib8F#7cEu)
+%<<)e-K`4XfHWn+TNF]5A-6/FY^;L4?(TLiZ[Eg/X:Z1Y^FS:Suie!eJ.%_aP6m3YeGfKd/lT`)VhttV60:j?R9E4O'>=!%Q)1nGq
+%:#SrXH2.K55Q+I4i$T$sp_e>L$r1+2;Yti13p`W'(oEhT=^u at J=QJIHo2W!&/R-pLa,UWYk-BX_bC2V at 5a#Hh+m3 at WGuJpd53CeR
+%:.qU"-mUk5El>\_[ON>ZVAa%2`gf(L*?eXi3W1+fW5DZt)NK"EWLIbYb_8hiGXG=q#;V0LUUF*Sfgg28<4\jtnq,T-[)]#pm>sgo
+%n*72;q'kk]5F]<h.Ttmkb49WFG]t.!S;,;9hD%+ketiU51da??[WK9>P*bh[;(]94ZV5d[E/:C"27>%b768_;a at L>V`uu+?i>-c8
+%90):JSn46I;;&WMp>Y9iiKa9!Tm5UtPk*VXZ;0pdqn&=+*D0%3c6h19\]&P\XWmAY[N*_M3Z at GQDoq0c*P&?pQqO%>&Tk36?Re7>
+%!BSn$pCTQbi-AidoQH1tVPrkU=lq,uPkUC)<cRRc/c@)@ChN_p#u[,>>T(-4q7fVK4<Z$3c<(j9WG at UC6,>HJ2%D!NYLs#VDG:s_
+%k:+3>P4?WHk0$Za],\G22bc"3kOj]hZ?`q&m5iZ:A].kR7$80jfFYW9>OmtpQG0D[DEAEuF3mkN^2<!!J_N1??S*3hD,Y2Q.2Aq+
+%7_bc6eh6ce/6-+<$Yi1\b#^^:'C<7LP.cj^%o':+?l.N8YC9*4Y<p\T;ZT at B#C24Q#cKX\DVNfE3?uNm%oD.UDE6$\S$@oHAVSZ<
+%;Qeh?+'t`g&=:n;=l->*f/Oj'qq0#j`7b'(Vk/BMY7:5-bA7[qcIaMeA8S7")FaU$N9</8?KMj at f/t at o<]bXhL3g17IQs&tFL"Sp
+%+hp'-qr+I$ki(!HDLC3L\2?-&fqsfoK8OYM<OlY%Q%2ls\uNYMCn+=aAZ;R at Z^?=Q:91aqCTsF;FtFc>KRDJ#8iGs<nHX6'KsDcm
+%E53<SF2Dp=p9s#A;EC$g:/7QIQ9![/0'eXqIQZ(o+0fjmLEjI[Xi>g\D%$6PW)_.jF&jN at K<9IUe<=l![])6g3/dVdC=H`/6T$/O
+%=\C_j;j3Yq*VO#Rk"@<Q4?1O8F3?="S3:_;1:D'O(2dmO.I/,<HAm`Qg;=PhU$1&I#FS=eOmR6^l>kDrj`7P;D!/ZZ7:)qpj;NF:
+%%_V-d"j5DkR!77(?FS8Z<'#PFPEid.>=kY:M))1bMFuRK+pDMp51M1=l_Q5LN at XCO>#k?PW[*WnmQ#4uqs9\m/F_$:Q)7J4(tc?7
+%9p/YW.;<oRrmbOaDDI,?V'^K#fL2r,C?kahYd^Q^lL^Aom<1]H2TK8ZZcc(&9?\I?\&l9NBTOrl*NN/7\Fe>9isgd##BCMj90Qa+
+%8aC at K70_MO8X(&<E)_P"86-Z#'F/bcCpV/clHZ8U`gAe,[irF&7Rd5iB2PJ:*"TaI5WBo6D0?s0Y#';[6X.$>8$_Y:)$%r1bI/m/
+%pn[jdQd!HIm1P3$p[d+-6]SRSd3nIjS<V<+[-G$P at 8&X,)6g_0p4\8Gi=nq1"Jn0*3HJKW/h'e_0XtM;kt'!,T9uZ(M2d^+=I)Pe
+%Qb!@VL:MFVo#SqHrbH%qf?lK<5Y'4GhA1Aj#=%\JM"[iXStki=+J'\P6&`&tI>7-q9DQFO1kN-7<dN;%P!K/;gdOYkA'+5?MG02`
+%.J"[-)(naG9K%`"_G[eH?eH7jc(eV=Nq;r/McC]ISWMUWbA"jmEHjKc!=S0e at C;HV^@&L@"h3tVGk*W3'HB\>:94[9do!a at 0Gds,
+%m]63!/,lFp4`a>dS7B<VAMBk-,Z<YEgX:6_/<cN=[PC=+.aKslEQX`U[S@^28QGh(IQ#+5H9!^RMWV4f/\7H-/8XL`*3(QjGWqp`
+%<\d at V2?6 at ONbYeRY(cY=/*;Y/W_q:WkL2.*kNjP36nbgF?RFb+.:Er._sk;1WM\fCUO&`a'=Ars/((lMQoQGB'^*R:`3.7_PKBSo
+%4J5ju2kn70Aok$3^!C:T=kod8g5<iYYE;ho5BDs(L.t at cB3f*;;m7jQ(V1&Ic1%@g=c$[0kc$<c%sGc.jJp):2HA9so!6^u2MQq?
+%Fttp(P'mi9hrQt"S6>VCM5,qh`QLGC=$I)I%sq?]ASc7Po4gk>QZJAb!7MN^Y#=toA2"un#@:h at m8RiG+Ye8%caLE$[gp'>S7A+f
+%2Pe/c;-nC%<Ji9:o at 16"p=D>N,FQ_-Yo#G:06%n6K%nk5oSWYLOf6,e(u4:J<oo3h`e63%ak3Em'hB[X:U-*X)VN;/ib_HbEUh!K
+%P_eMKpc at T(ZeUj]MNhR+m at e4%1^g>cR=J\qRUg2u64I=!*O4N#;,Z2,NOa3[8=(($__Tl&.kAOR`iVrggS0m-&uH3un]<a9CaJEM
+%2!^AEDM9)7-;n):Np8#,[?GeArAl,Zn1h!_6!PH:WL5C^;JJ\J<Hpjk`Rul(<jV4%T45__Gi6S#Q]JUU4?BN_FmOCAqWY(Y<(Q(P
+%V=F[M(>7rAo%kpr*;WG1iPZ&qb1LI:;0bK4i3PT31-!?"'-_ruQ6(2]ruplkE6B`KB8)jX&uAs*.?X[Uf@\dPB:l!KVEeR00U#>m
+%P[^3W]jk/L^I1XYk.pG]h'IrY$Ri3i$fNq?nsG??%OccH:&+n"OMbp\1=LuZ_ at i>?]cp].RoE.uD)f!P;b_5deL#)Y/]-Uc@`B'g
+%<s,#X[oe"SX+:Z$9&QCSF(ElNMK;=TSdfXU.O*&[ad0&RIMpoTE!'IIbsU3^KW!f<4fI`u'6">kN5G9GX/JS'!)BLle.B+mVD&3C
+%j]1f.-8La_AFSn;#Fk8b<L*W-OJ2g&lQ#]Sea?6i=+;F7Sj^olC?c`epV>CB'k/+>3LfB.f*HGFX=cPjVOm8pYGlam+D6sNBN1f2
+%KFG`IbEe".jNegg0S?r3g$TTXXc=hB*Lue!i()(Y3CX\'#5bp#r?,9O/_Kb\q&7[.,uJQB<%+pSl?FR'%s]Y?&2mu9D61mcPH9?=
+%LlFDDM(E'a0qlg"#O+\/;]1H9)hZ;fi4r9/rHe!c.)-V`$X4\H<Cn7Jl-aVS9SeBJ^"`kVGNaX"(QW4lN&G5[Uu0[u-rM=G#p.@'
+%.(UVNNU>d2,,f\?eE_.PjUiV7SJJAi0NV9!8-IQGdQZYs2fQ6:q.H9Cc:*l!ZgHn!i1[rH'@:A0nql^R>s")"eCSJ5rN.MFU[X:2
+%l/u"N.k:G#/YoCEk$h7CNVojGHOqDq`@5u;F7o?.e,6.kF-9(llRql9KqopO!;k\''S8PuHC#C6Kg7Z&6,D;qg:eZ!!s:KL`GFeY
+%cAk!=7_Qd^X^\]raJ*kO7Mq:geV8S5m6S%fl,oMDjUp3=D;Vna$B[H=&-Wh%P*E9aH0Pnh'1\Q`r??UL$LPmSqKnZ_c"_^IlVut`
+%Q+;\C?R?pXHPiftU]XH]/mXUOP%ce+goKP#UKaX!<>ZUo,pe>Rf6E<+c1+D_9nK+:"NtI(!/)k!-dC7/P$\nVaR*$L>"GZJ,-"d3
+%S^#R\Sc*^H`<;A^RROl1i&mfL!<sNeaDYms`f=_-Rt6MZ5Yem]__<KKRH(0",chIa.N(S@:C<p&.aLcm-8rSKi_uCl9SRrGV^d)P
+%(h$?n%]e:;,Z9TD<Y0ZbY7 at Zn7mG[qeqMBn`HuS`OE-K7o!"W`htT)fCiJ_h!?_AgSc'pkm6cNh7bWl*eLn$1q/C?[Qdt)ZZdZIb
+%2[g<&-]PnNeLH+Q+oI_NYAO at bcm%_E3O'9i+9p9__hS.`k$UlqGHbD:;tUu&G&N977d7%*Q_L at YQM';ZOtnlQX:AJrTRCf"0$+E7
+%[D3n2&2[n"!n8YMXkrc#b(+r>cR*6JitiB0_FK8]A8"t'>tUMnai'l;q/pS;CN`tB=@oaLnd4r>foZE!Ubm&Il/]#FjeOL9)9M.m
+%;%4V.mus'f8s5BP(Nu#Ra*>^-M#eD`huLEQ2.'H?q*E2EA;b-_B3VdObu1&G%$KZffa`Wi'KBp4KFE)+`7;M^e2PM!Ntj=Y.e9XQ
+%j at 5U(aOOC:Kr.YDda$,n&p4Mo3,"m5#eZ;nj)JkTX=X(8ofDg6W&H//0`u!`03,q$DGHYOm3n!>ZgAcs2:V-XVGX=?7aS;8?+p2I
+%4V)#*d1-9deuOq7N9%!0+!`M6 at U2i;&qr_.U[>uV-?3?<,FL%7J@&m-o)-u@&UJV0`O3kM2i.i at j5*imQU1NOrK1,dnh>"-]9D_f
+%8*E;a;]]IJZ&3K0YYau(3Y\`91g,LUpK`iU+u^(kVNb1Z4#:_T+qp2I`@&n8K%O'_,B2T\0HYRuUD+ at Wqpa%=&'"`:XbruX=h1'L
+%G(+--cE2JhdZ"UiKn'[dV"\+U0uc5WUs]A&,b9g&UWp>#B3_3?F%@gYXJM`/U&]=65tqgCO4G!?X(k"BSJ/E9+??1eD?]f/ni-'n
+%LcAMYiblR''#oOFX(,f>V"S-@)l=PhMNYKNqrhu9?(oW5"\YVQVkR_VE6O3(Z_%5Vf-\tOi4"g"7?p#H8!m\Z>nY8BruEjf&Rq:P
+%`+Ggbjl&iGh\C>?99SYEP/Q`h;hM8HerhO1HNZT[=L1?Njs%tpDg%E$:V8sT[Uc^(Vh=L'$I_3qIt9/j+XNr5o>Hq\TI8"=Rj,^:
+%;LZ%F66Q97RsKafLp.op+"iTpZWm3(`3b`_O.os8g&8^3Wds'PJ'@JkKVeeZO[#:J")!Bh]ghDq+C*DU<1]!noNW`N3M*u5h"Q!N
+%'R0B"!7-[r9"S/q@:m^4',LjXOpq\d<J5QD?2&X6P`%"7][[n&:"%N7jUp66D.XDOVnG^/"GF`SbA[3$aL_JETCcO3XH>!W]e/=B
+%"O0prlV&e9Lea4qFbg`rK at R&6&mWms,R'S//Eqs$Bp^%WW\Am"#f+RMTBfnk/gN0>%DP!/a_!7 at ArX>J!.QnG*;Ti&Hn`q&,jL+Q
+%74X8eqU%FnFKTc*IYPGb(Jt=1l;cOQ14WAb>H:F1n:NV&9Oo4_8.a;/@>dRR%P:;EQN\C`6QBd(#CSBMcUn_L>^2OQa.Z(pELSNB
+%`8`D^GEFU4bH=U3)%VY)-!.aj1^L^facc$!1m[[i>hcc/eZ0qAFjJM\>Ug%X:VqBaSUrtgR.,o_k<FZ]XX9YqNTN&!WS)!VnksBr
+%eaP#c7(h/HYCcn+"A@<eW$]NI)i`p/<n_4\!Cq_m?8hE!\&l[;q4:4o<MC>hMBopCgF;Ub,23;#I\`RH at U!sd</Wl>;s^\j4Mhh:
+%#7p2Uq&iJKXmYMVA<R'SP9)9.,a($J6.LD-a#qC>^II3d+au6G9a^Z%nti:<E9:0PaVqG<r-_QUHaD#ME:_Kq3W)to.gA,XSEXGE
+%@1D<DY**ucl-,l\/U>5oJn.j7dkr0.^<rY\qt7I`cq>k_XV/K^5]<!TH;7Atk1A+[J<[CV8bV=?'nCQ2!B;5)+^(jdj!co?4VmP=
+%63/P%\epT$XU.h>%Q>)!C263VVd2m7=6FQ<F(\LD5r[5\Dt$Lu3.;N;_"AUEP1lXsMUH#X=c=URaQ<e%S9bVid\f2IqAWA'/S,*+
+%=66!_"&b@>b0 at N?Be'WjOE$0)#L5o4#nE,)N5%mq6Rm9_a[HN8M`Q0MHPNM7k?k?"9"mT+Yjrj7YGEmiHuP<9;I5T]WnGB1OYH:D
+%'fRDIbiKs*mSaNG>FS"UjtS$0I=aS)UIq\d6qIFo[4K5O0cVLKdYB%Q:"m\;=j]\i`!([eV^a at 01.t0O@,`V.^I"GnjCj`;A*V;S
+%637ZgrPu;cbP\FFs33.#;'ure;AVof6["$,+F$p)Ng at So]H?49Z%sLrNl+WmlcI]$F)$nsGaHLg"/)fO at T=t$8H<Qu7)5<;bP7*K
+%YXb8R5B\t;Sd/Am&219<;qT@%P#YK._-69rW^qaK]ETMldl-@)>ZM2)ar.TDGoFgAAa]\E_Y3N$@uYL>'.9Z0OAU*I2G1kS[_\k[
+%ns&><DN7J]?R2pc1X9LZ=6q,eTUqS,EW&Rnpqc?7;Zq!166YF9QrKR?89,l8r"C8Q%k;BJ_32*ZOAUclA1k)U[K,EGad46cA;MR-
+%Mu(DN&q8d1TLoYB3RN[2%gH`'6sG"\C7S2ZIcB089pK#>k`@io9_,R5lM6C%>pW8gk)fuGg_r,>s$=*K\\=iKOdgGo2r]MUR00fH
+%Qad9LMIUGKS(4(j.CiU^QiMq9[^sTbQ(m&!RgNX5IOg9I]HteMZ at qSWCmPllHTLLegr:ck/X&^7$)?h9:'^HOmSU3W at B65YW*&L4
+%?hodVTId*3$"Z4Q at WaR>`7-_M/AE2nG+a>NPf"_)$(<NBZQmc\O/d9\!Qne/!K;#uo$O_P1(*%;4F5RtX`XZ=O""dY??Je*$ciEs
+%'SV/H\Uk-bMXp,!X6OHDZfQ`>;inVg at VnuJ>mt'/Gm$po!DMi9.3b!knL2"rCp./r*:Y.<,t;FT+/`XgLKmRZ]6TIcESD[f+.*,s
+%LXJeAW\Z4.>0/@<aM6Ag7EVc=^)snbe5fKOqm7nP-')G"(Q#gs:+p(/e]5>[:=Y.S\(u*uQB"HL%\V4KYjn-tisO&LRQ&4KA[*T_
+%.&`BKJ7NrrWi-OiK'Y^<#+gE'HT^M?o(_ at 8DB;gr2c]`;7Inr1/\b;kltVh3mir?+P'LJLX6e6'/A7X7*4lX8lk$VN.;R^i2itOL
+%<kr<ob&m-2MV]jdVl.At`j+],<=N^s-crNJYhTLU3X1e+A\4))"-eW"m8VKaauilc\Gg=6!Vhi&YXUWu<?p05rekL@#&K;8X>](8
+%U)YErn\U*I`XCEQffID>8VGioD,:t!%ptAtbrl+=0E>JE$(Qk]MUn=R'II(OV"B%h"^P8aYZ_2T[k?]<PA$T/d?d47fW"6IQF'me
+%TXGqMQS=`mV*M8Tg47e+00/P7)q`dIRWS,8laV5iHV%.W=pjCbQW7>p4dK)c6L(k=lcQ#762TG)</Y9lX0;one)Z?_(lfHZ_BeiD
+%>T>#jf&jLlR:brtQ7#`I85,41I&Uquj"$,V>8=hD'$BM%8a87i-V9b3//o*h`UR6:]-Q&V^5=N5TNn^]`Jn(S44nRG\1'I.oJMtQ
+%8iuL/I$-<1!Ti<?VNU)(h9_KmP'"VERGL'DS]1Cmd\)]nVGMNUO.;P?h+,7d`^h`&Sda'E*;3u`RhGT;@#4a6.dlC9s*fYn0U2Wa
+%G2ijIaW3oZfVr$Q=q?4p6-O><9KrYc4#ARhXG17&npj4f;m*)rDt=P^,G*]$B;'#aB>W12K2d6SnW]h$,Z=qmMVY3`?R5Z1;sfmk
+%-ZcR-^gs,D&NcfC.LX^e;m&b]L2T)WSjdL(^9l&Q(/E'2jQ*sVC=s9 at cd`]IH^j2IZG,">@t0+;9;p9^@uk$,J/]r<kDSF%?Rj`-
+%G#,tIO;/hs^+O\Y%_eJN05jPNOqY0E48)5u/-i/^g0%$G,/Y)F[?2G\..Cc*2M[Ou^WE'0H9-f'J2iW at gBoh#mcXoT78"e0B7#D5
+%HbFEO!1ZtR&&/5l;h0h>>BspGW4aX](/Ko<ITh'bA/SI7'BE+aYd4qdBb_ZrPBu&'g[4&GNA&0A*MA\BkR4pe,7m at f.r\C^MT)5F
+%"hpk:$Gd7#Y3N&Q9uNP4F_ at O,&YH=9(kbd83$6R<l(SY`_(A4oWQoIu9-C9t[o*QSh at B+:FXFY^h_j'i=, at d')o!G))p3Z"A`JY+
+%j]K-_J)+6RQHrHk;)Mao'pH)._(rMU^1HlU`D*cZKktP0j(To/$khPCDaA4u[X)P at N_(8$b639]irQ.K^r0om3%jR%lNW#7E&4BE
+%F2_`g\QnPGY'2aJX'0>dgt&JLK#cuG*)G1O]4J8%0p`%[\6@%n\A2p'DEOPfQss.TZJKoD2pK?.ohX+N[_siX/BJk^GD/>3O0c]J
+%Rmcf;M5uoGH31din(8On%]ZKV_0qJVHcP/kbsjn4-Qu_)^Ou;CeO9etEX?'1\Wa\TGj/nr'Fp)W6QNm]'tc$,[3RHS+pTDh&'q^t
+%]1nOt4I?:s&ol$IAnfu=%HY)_*BMdU\7Kq\LWc8_Fr+QG49u_jD#JPH;0It-ZKa@`2NRfJ)csAGUn*1!G%Hi#&[sO[*(WU)=@N/!
+%.WUYOk5be%@[G\>Q'6g/+p\cgGBrYG[7(71:,,GFZ:GGuc*<3?AVE!=^n"%OD=q^F7PIsTcBq7aQX(>nOdsS\1*0Do-8+K:/tJMa
+%YETWSB.5DM=KY=?+NN!rSr'tgjg=-mFqQP;5Pf!^Th=5H*m_01+:1o1J=e1sU9keLFom7%XKYh'PC]/;PmrX.SG1]gJA!o=M.G$Z
+%]-hRWG4uu3dOT-RCLRV^O>'4$hNaYm)[Nb#o+XWV3ajsg0+'P#+F7*U5)7T=%6jG5`$E`?EGQHl\k#VkPR_J!U*<mnaI2EkXtUcU
+%&9pKG4`"eq\<C=19RZ[_qqg^rKLoDsGI3t4@=f-$hS[@I><Q#!`KO,Ka:Qn5PgL";a__T.Xd_1AJII04a"%%u>s2<cfju:k%:.A$
+%XHktoMs&%VR!VC/.4%a>:\?sU/Dd3UQWsu`D4]6+;@uoY;;ke&TF0$Lk,e,VD6'Kh+MsgMVBXHX!Y'QVkm_hneC_=uSk/%\?2&bj
+%1U<b0Yb?(D\"S'qm2:b?Ml5Xo=I2sG&Q#+,G*-0inTBQ$G"M0p<Kn@$HHb4hJ1(UhNgnOto:a[a<es"ERV`1h<kOOmi=U'6G-?1U
+%Y]I2p"gXs[V0*9/o1uoq<N'="T/O54p4Z*`Y3=eQ0n4-"du+%mZkIdar3\$,9VTk6XY@!$AZTLiJB8VXm>KKQ(m747>M]j=:?$7t
+%V!ce7>M[rc;?WhO:"R!d7$D3P8R#B7q.?-rfeD\B<m*:%8mCQTXna7(q4a;+!C.:>ahpZZ4c*uqAV8T"s$G#-H5%0\Bf[#p\ti++
+%Xfc&P/A-)T$'k!2P",;Q],TIQTe=2:"#OCdRBb4M6Z+3Vm&FSe=H=u>U>FYei@?f3iBL2ARRVH\9!<IqYam]282uAVOt^\t"8aMd
+%juSr/MBLGDOb`B(PC8m\`?5K6L+,.JjaY0<DmIB+K#\E=JIrC<7;K6VIbCd1GuiP/\5ioS(:)SAk914i0lAb-[Xp=uBjXOpPp[rN
+%oIS<HDRh0%dg>2gmhi'V/;XdjmD/;oR&5>6*eY at YCq)?V9^IPRArm^L at q"2+0>)U`2n!I!@=/X.2 at 2tFVTKgs$!$Ach[[UN<ns+U
+%Uo-_DG^e(fV;B%H7#k\S3;@9IR-1=*1Unl,Zan9S\-rHNq3DZ75Z3Xc(\1=a"E:qBJ#i-fP1SBd&<2CpfE`;Drqdj3hN6Bq at e$Kc
+%#hZb8!CWYT2'mjZ/M0kgie8?I75 at l[D4^OUeEk(FSotd=f at j1*m6ZCDiEZUB0%k+BMin4dCoUB7>8r-Eas)Emp^#fm_Li4FUf%o8
+%GK&,+EVistVu[HjS((spFuB at 2Rl$`Vl!l_+&,C5n&;M\]]&ZOA5H=Z&nu=')E8;h3?>T$WT`pcb7cl#uZFd.2i)8S$/sghg;][=6
+%f&WK4o:Gd\l'?D[)0RMWZUYNMS!k/g"G15JQ(h0.D7O)7T_4oCdfd?PP>T3`W=7'aIFPDfPr/[Vp?-3PQrF4h2O24)i8u"WY`=O)
+%YB>$A?JI*A at SuPCj>k=Y_m)<`UfX>+;V%lU0._X*#mu:iem-Mo0gr/8P_Dp-#f[X"^>F6fHXm`eX7jJs8Cn6,_>3Ou at V/irXJp%]
+%kr?r+1&B-.#9s#9\]%4p8/C8uiJk'Oqm&7[74RJDWW<cuXoaO(M`7"!n/)nuNmlX2Tbj2'Ymqn8#Q?k8Eu9`WjOPI'C1Cnm)ToTr
+%1LKX!d,*Eu[O*HY'eUW"'3()u?4''^bPl5KXFj3jA4"s10.VZ6/]t.Fg1gWpHu+4Ne"H4-b.],m:-gD\3bO at V&MHq.1-UrP6>A_R
+%@e\-l0*gogX$G;pX/Whl,(85M!0W*DQpgmG+O(9dTm":C!fIXe0$,T"DMF'5a"XMKjCUKLXmC5D/FFU\pWWT+btO6=dA at -,-aCC7
+%Q4<%)Od?r?8rk5nEhpjP*:2"V)pftF-*errKiP.Xk946dD!C8e.B'+%f$j1P5";F6e%Q%#4\UQP"e>@XH7GV!Wl`9$4B at 5?\8`Wa
+%[_4BKoO%blA$<2_1@*u.oD\1E%6+QaE2_OqfZ-[cLWc_Q$KLQk\5Rghc*DA0`'oeJJPT at R@$ag?[PE6#?2rRjCQrtrmU-))IX73Q
+%f\7[,Lf<JKZZTRafcE9b[s_Kb';]aa,U=Qq7=`'h;ZY?j+m3=!>R(<A%r<(\P)M63>Nh^@/=U3<goGa*_1^(u4W]*\_4Hq&nE*V?
+%'![13NU!86ot,i[W\sgT5!5s-:^f+d'KVE<W)hTA`$%k\Pu^T]0^d3k&i%J=mJ(\tBFrmQ6(<*lHEVK3O#,L*O&o1I#s2CoIZY%Q
+%F</.?.`2 at pe-^TnNb\5B'[*\?r+%nE4_0B9`-/D??"_Z(,>\k!JMhB4"Efp1563?!gYV9HZiqHt#A+jMg4L3B9b<nJ?<BNO(^]K4
+%NW_[@`cH<.QbsMfX1!TXO$p&dJ-`dJW6#X9l9T>i'7hNfMq437X@;'==O_Y#:WLn=%6S[GWe.S3^`:m.?L_qZW!Yg'4$5W7(!2lL
+%g0BCjW^;.e$Tn604uoMMLldMr=_q at Fo]9?/euj#LE0)Tr-I+UW/.6B\*V_ZsfqN8%GerAGL?1i?l/1l]0Xi?n:B73nAB9p@"`37i
+%5d;,FnFjea^-%fmGF0cF$LUqWaY%N<7*^e9=og8"5Ws/XTZs4lMEDXqV'NC_P%*unf-:U^(:U9Q)_IQm):rXrbQEOc.r2thX?C5`
+%Q:=PR$,*7=J(Pur#X<=OKjF)=\dA<n-#C\VM2^+$7m$kbg7%q'nFJ2HOo3`>9TPNpmWY'n>TTU.cApf!MXel<YrJdrY<9eie:0N)
+%N7VXCXf.+L;R"k7ZJ51e^V5+*YpoPiE at p?>RP7:g8^"_D>^Wk*H+#*Y*NCkn`1f]jmZ$\QR`.Qb(KTJ5DBG#mr at .*FWfdM)o:45;
+%@49iADfBAbW:9(V^jK2O6`l2QSO at a<Out%H17<,5O]O at I(L;@brNJY(XGac<"NejM<c$ul<G_n,[oH)BJr<q%0bX9?,hlcIgJqlG
+%]E%E\1)IdEOrf5,'dbbOjHYBFQ)W<[AtsSCR$WL!9O_jXi?2>LeZ)j at c!ruR_,(Y>KSf"6j>p#GA>$9%5Uero4OkQ`)_.orH6<^T
+%MKQ#J*9<2T<tQPWSk<Pre5:skJN!PX,L<]dXXZ6,HM10qIIVF93E:D`*>U.`]e3\"d9f`m7/a/g\YdFYCd'p[5N/=3q*=#bVV;*_
+%9i[<jbCiRs>K8gAWn50G#LJdihjMQ_\W<gWkGeCJ5&cg)ScX4=comT=.M8(,ne'JaE^,Cu"Ek*t8YqGq[q(H`X$S&Y\54Z*`>[Tl
+%S at J+)#`4m<lsP9tD/>Ql^eCE"$-n-VO(5UJKiJ9o91a$,!-15_F10S"-+O";EfUIm#_0Ba^9<Wqn at E`L1Ml?Om?0qNeVl23Kc2gH
+%i(-(VA]I=elcK+r5JdngUZRo@)^I5/RGb']-s;:8o at Y%sX^P63:MX&R4P66.m'EorfNuB5-54YYn.`ff*b?I0Wa]#PYu._B:/^:a
+%*m,3Eqa^<\Q[jZn\Ce%P5`I?sQSXo-RWJ7`4B2HQg"X;4I'(:f6'8=NJ-_>NaT<L95%,kNSIu4lEeoel]IX@%\\b at GlWM0O;^_4E
+%5toc2=<1q?Fi!g537J42+8JlFWNYB#*kn310b85 at 2f#\#[*&TtY%5l7X@:e+I2Uruf,C1S!+Z-=0%E+K[<G\Mc_C<_CD8nhhsbcB
+%a2C\l?%Z>kW\plLri+](/FO=OII-`fjrK+eVcJV>MS?)/^<4F0?/37%G/5!-/eD]R&EKX!Vc,V6Z:itF#djVSG9??W3f.koR9db+
+%/#o3kg7:BKhuP<ja4"6E"_#OPVC'8hWoDga-Z^NSgcQQQ<CjMjP"5G^)H#N<Z`Wq4:uSX(/4YdDSg4ZF2oR;Z3t'hl-jW:5hp!lk
+%;k-XoX+RKSKf$Vl>7+64noO\%'s.t'L:T+K%F=(N?MB?a#F at 6P;3(U=fNiS8DFmXBQNX+%fIdKHlF[F8L<njn?[+n(So`mZMe8#;
+%G!m`ai?Ap)AKEsoX*@s2J(Wf+Y0^tRf](BcWN:04V#]N#@M:8BIG*cXRQ?@;J[fiT;=\f2`*0%5DF at cQJ8JZ=,eD$1057m^?m>"%
+%(KSNZ?;=)#F]B"^T='<(X$u#@[X at Yk]\6es!lH-$?IiQj2KtJlrW&154kMsU^e]BE>er[AFb4>=ZK$0l1"Elgq\k<03#o6rAlp/Z
+%+L<5S8*=fC'*C192D3c.(5ZU5eK)cPSa@]1gbo[#[kW"B%X!":9:Qnt*qXaOAOUWAPpQ^:MX5J^G,rq.8<iN.5GCc;q`KAJn_rS/
+%&[p\m<5"OpGk-h"2 at e']g+7DNc!?i(-R/3#V+e=Z%i^eGe,nY1e<;rIK=,M'^.d(m:526(`)AAnBD%u^JNXugB43 at J.FgdN?5D>a
+%XkCuNffcn/[1uJ]O+XA6K\@0;?W8m+ju0qG8pX0&I:is0JE)<lnp\A+[F%D&Nc`:a`g1[gWX'$2"C>2e]pH-DFc3]hQtGOGWrHi<
+%<-A;]0Sn&bY$oE^PZW7\7*f:D,I#EN$r9,&U?+ue6oB\mj>,[EWX;/tk%4'"I^;Leam at rra5.%l0/i\TaQn(]l%lfI)70!5(@M`@
+%eWid'oBcBs]\G^Mb:YU*'T3k_9-DWE#%:\&lCL<nJI(+B;BV#Sdq;OESBXY1L at 6Ao*am%%7>G,2S](r+hp0C:/@gm#m(pD$4.>2o
+%)(+SKSJ$HthQ,2?\9L,O,60GS@`9^]Xn"GcQ-3&`cc1mc$_V at 5[#/.gapN(YJ:1A!B\sj10?t0bZA2Gm$[^$S_eW_X:b9_A/#__8
+%!mY3:g$&KKgRKAITsAP4XpPQ at f5l<Z'49c.<H<QA:2\oQO&#Gg#&I=8`O?lNGrZ9QIHMRaQnTjspj65qBYZWR0"YB#14Y#C![W$1
+%&JX_7MlHaeN^E/D82Oi5bqSW<(Q]ND$;*2QBW=O-Usej:ZD`s at lt0!6KTWm3S$e>p92il0n.V5lf;bK:R?;@V[%F9/h9seI(eqFI
+%/&>-r*`FG0(@k1bGhS<VMkuaiL[7P.,5<s]U4?OTr<nW/-5+"b^kq+NFkK_:$p%Dh$T[J>6$JIO@)iRca.#@)^h<0ChnHQ"cmENh
+%4F^Lg at b#4$1rYuZKp8D4$H?nZQe>oInfBcHHEcS&ap5"uR,]daNtc33CYZLm?8!hDW:=X]9$(b;?iYs'#f"'XiF_Q0'"S>]fOpA_
+%UT(9<7?u5%\@$n$'S/i9GrQ^8W1V47/i]/88H[EAM#c[SNarG^_A1CpRPB"o+#,9Y#+aNqe^;@!m!i!40kT/GR[27FfU%AN,PJ at +
+%h;^rP%BC0/Fs(79bH?(+q)Gr7G/%>VN at rVB8BE@B^*)"n5^IHTkERr<%3.+-U""pf0SP#GVO5(2+#Q'YFV9+s>mVQ"k%SCa4F>Sh
+%!9T(J[LV<R!,AR:++e_0L,#cP.Ku"VX8Zn.`)<g>A9ZZ\-f\2>[OU3S3.DE'F1!G3Eb;A]W:!ZQAJQ5K'dQkW[@&;m.=/7<Q2u`Z
+%76Ajr]&K/sAoW_S)ruoYS(%&%Q'7O>m9I%o6 at Js$3gm!m+R-Q@/IOPAOC0R7W[Z6b:"<0d]>-\<LUg,WK<+$XK:E>&$<%1?YVd`=
+%_&k+OgY1`Ti:bHKm5GO0].El\f/-4U[W_rk2R)Xb;p7R;1:<$`Vn:(MfNlekZ/uN*3mFB39"Q at iWFQN"'V;dt9r^p5&4N=UDn#uK
+%&MQM5T\pTiF=f;!eNr/GD9TQdN)gu/+jRF#!/^ol&=Gd`":jV$cYAT%#=OjY((V21We8F*Gm[-WK>P'V%oT=M at 5'(lG8n+%n:3j<
+%J_Wge_;LZi8q[n&N=@/cA5/H3NS0g4LU[WPS at CWI(07S]R7`"0$tGWjA+_r=@qa<TLsG)M_,l5,-[rbr"ZK!A+O.)*eF6)`@jm%W
+%m:781V?'M:_M1c7=64][qV06%a.4?bj7b4"h5)k<QB*[Df20d3`3Lh"]-ZKL\0U/bX8F%S%s>;OZorJF>M;ge0]L%m3?(N6E)-:8
+%\IsL#P-QApkt>'0GI8a8&d,c$F61OJH[8]EPGEF8pEKhGlcm.8QROVEjuQ`[-O_n;%'S]G9=,Y=\#p2T%X]Y--d3Ut#h$aS.6c%*
+%J=s*oXA:q:%SC2MV&lq:jToWuTtKjB*sAEFSIUPC+H5j;r#%[r4XXK8G5eF$n;kVs=(F2p#fkB_3*5";7+&/Dg<%X+UgdJ<mBD9m
+%>a9C@,MCPu:1]W+cT1*mb,"QPFoM*?gE2pOVQae/J/YBEJ1luV3+[!4L0qn&"DbuCG^B-ja.RHR[Cl3K[ZqE(4M'ZA2leGeaP/[O
+%e>!s@`B-i=YD6pt!7.'TPE8epgK2E5js\.oCX?>O,_^n at K=SpVnLk6?X-i74Xohf:GaQZSB+6c9n"u=.ktA7ca,Z\U4M^!#EX+=]
+%2,ON^0nN9#^iLtf`bS,\Z)<#o6f8;L3u$-1[q[Sr.Ci2M:J[PQ_tj1H=2iViY0-,)$`UGtE.S1fKF$Ck1EIipLh2mfA[2SdSN?GW
+%QVFm<*P?W>3CT_F+cL@!M?-74ih"Yn")=*$Z\aT1HFEe?2XKrm^cFQ,nTQG((o-[N<[1\?joVJ^s/WDn`.LL##FINqR>IH:^[90g
+%A`\LW*d<9#!l,'rBfhd+]/R#VG*Tdn<8Y6GP<D(5*A1%"#7&O;d:&G^iN.m6XV:X_n(h(`qkO97RI$NHP)R4CSC:)@4P1-=nlZdc
+%2[cd!-^?N)[=:m3H-fO"Mr9c.C2n9-PoD'QlLG#+!6F_,OHIJ&*k\Y&4skrSe_>&IfpqhVm,j`LM*77+&[4%d#sK',*,m&BTpB,T
+%l,<<,CZAt"[s^0[<DSeM:)3rIoN\%D=7&Z_J:b4.9RN_q!&8j/Gr\E.EB_h8e)K%$IMjLVeCsD$k3(%Oi\>7)hWO<t#AC_,7.WmN
+%<D?`Fhr/5a>8MWI7/t;Fq>JIA^*NTBjJhEjdY#$3RiNop<)1b&=+ZNgA$pQQp:;bkVQ(INVRaft!kHt=]4uTOU at oP1,3M\nFF-T?
+%;FuR;7EN,=nQ;:PE%@k!4EUDS]- at L4p<Fn-o!4WZblaE`$%(S1n475'(Ff*a![0[Em^q:afd7[R5+OB/_AUP5Uca?7Uuu,qJE%o?
+%3%cs[n=V8fJ:V!`Soh8sTSCSHAf[0GM^V/_9qlFP.S3B!>(#tu04t0 at S_k#)4_2[>(kX1:;N[V'nppfql\uU0&-T"51"iu>X41ap
+%0(-Rh/5FGuRR[6lheBK$GoV.-YSC(E!r!8U!0&Zp8QcOM*B3eLbd3Lm(@2gb<&:\Oi1RgqMN+s1A8oYX8ctS392#[l\Bj4Y2$URi
+%DJjsVGt\8rgR>r"j@@*)WBP3DZtqS0%Q:Nq%h!VJreT`:`Ypg/#U!!0V,5i=*E;9h3^&p)Mg61h3g7E$(O>m(D4 at 1E40IKe1N:Aj
+%c_OO at _m;7 at -7@S%]?T-#A[Z*30Fh"%j9-fl$da/Ilas,Z+)8$K831+Q`)K,ip)E5K+GA!-2HsCjmmUtE%t*a&e7BDHEcn=Ea.<0Y
+%JYp+8_GVZ\Vn=+.j*BYPWu_/W0Ji&(n4u/W3uGf+a82HP3pd<bfdJ^H at i]F at SQR%&):]pJ*=:$&'=ERcEN;/VgIXCVS9Udd=DS6M
+%p&ZgI?ZCW`L"Jj#Rq64>]K4i-=5Y/ERc:rHX#$K>#sA4AG$0Nr5utd&FfGuLkUk)7FRm)pW[',e->-DAUgGC^];_6*i`Kj6@(fT&
+%XV\/&,`Ns<HH`ge9='14(7uk(FqYs#^Ns\@Hga\cP%1*\WXVOIn=Vhg2C!1p0qUPR0C>gZoo"0WWSf4]H;WOW<DcO0WQ59fVh%.E
+%pjO56BMeeNldC]fkA;HsPJ)bE:Fq5eos4\*qsC!;*K*F<4:$9_($'NRlA1W?Erko*.r!JfLsco^1?4Hh,bE9_X`BVQ2=N<RF[JJ=
+%qkS&(364QWh*EXNVre-V1!>Y:bq;c(7/[$.+[L(C1ms"88NWWF=\#cp]J$d-8MCn$Q=s%RjbYmlI>@&u`[GB0+^lL15:`Bm(_u]b
+%J6ff$4p7DE^cG5ZA/U%C-.l4tV-A,l@;glpm7A/72R5&l9H8Ni6suE!#mLp\F,WUEa0>XT]EL<O:!enPf:qDKZ=8SXfl'M-hm8#k
+%m(*.u3,Z2H,U!:/73rmuQUdRHKL2adh[gDQMO6^)^_:,?p-W at H&:$D3A;Aip].#dILL07^q!e/O[&;onG*peip%5_7;d>PW.O;@]
+%q/bc%g*.3aPl9I8MnIR<T$s64BO;bc/p<F-3 at an6OauUgScYXT]bmh<[23[_n3lVuSU?)=`V/+;\M8"2.?Kau]%t9sYhXc[6o,GX
+%!"QaK7UYPBj_Z9Ri(2T>Rn^qD5[f%<.90dr[VI*BBntLWJ7@;kghjQs.`kkc6jZa)fN0C9d`!HXV'f.=3=/?S%j\.dKt&)toPjO!
+%?#hcL9X]\$&/[>KWq7 at fN/>e_nN]8T2R#g+p+>?=O,3/+EKd$$fsP\rg:2R/>Wf+m`(@U>6u]qDP*k!#DO*e\M$;""3%;LdXD>/O
+%4:_Mb<UH!;6dG,IXI=2c2t<[OCeahl6'(\:q)5^m8;AWcSi'c'l9<8bGRWTV`S#_<+DF[Sklt&p#AUB[ZM!D-Bm-R48R2RI^rr at f
+%+d08C5b<=/5O.LQk$2Ft`-=/[,^8c6K@:E77Z`\J\M3^Bqj,#G5T';JQR6]E\YUO<hm--461kf66[hai^F81ppS::jJ?PZ&0-JNm
+%0#1?4M-[1g[L7PDEHNPH[Kg8ZT39A&+]KW at YV`]n^u[bCL6k]a!*C-)hG%HP,/=&pbmGU)FZ?cs`5BMG>95CCbXmk,cB=O9=k6mT
+%*PPZ"?]UTqkcd"0</C24aQ1.TEZ6dMJ44 at W;f`.Gi(/q%#)p_]o at b*B[&fG*JKJaP`M]kl<EqOlJb73D_olXL8$n2<in#_=W6;4C
+%mq!DRk`<?h4#k)edA&_B"m0q?58.QhILkcPr*.6*!s+(:HWg2Tg\/m@\W at elYXtj5cJ7FTA-j[MI/^2.2:<BhVh'Xr^cN=Cg0#ii
+%6Cd\JM4BAq<$&4m(PWU@?-]KdmOpKRRZ?.bm&5&r'E#,Zo>S%ui]@S[<WgMcZA9%lk7JbrJ!D_4oB)c#-oO1J2(PGU#;;YQXU[PI
+%3hL9[9hs(+;9=CV]UZEg$K6grf.;.:#a2=+m"aM%!0HDD.[e@';);EKL,- at V2GCbe_\1ZKl"q5L.3dMjOfcF;A4Z(,SgLp&R`L!,
+%e*>)u)+0-)0sss=TU&e,-Qr;VF7gR#Qc*nW`*lpEh;XTeB-+npM4C<Zl#i;*;^/t`SZ%PKI;LpqlEeR,<nNt\T*E$S'7;"rDAtZV
+%7W+(:A6p*i!<s#?]5d$;:"s63/Q0_?H]!,q=QIjW(Ft9:OnY)(bUL9e8\Tgo,VYGQ5l\+1NWDu.,rOVor2962nG!).Q-1C!&YhlM
+%A!"#)WrW];AGi7J"P$.fAtUD__D=e^SUp1d*JCHF"b?>hBLfed%2=<Yp**$IRtP%iNd:0rWs>`JOhJZ8#@,5eG#]T#N,k3,QV1o!
+%'#57W:2No"3023VONmB5:X?[:RDqI-77*K/=+IkFcQ8mk_6k)XZE&gIVHcu9UFt[!L4;E-8oa.?efh0\OHe.UMTgP)^6HVughY>/
+%?%>P!C`m8-;-9fcBU!IX[7c]O>CMj;?G'3aG"H)%]?Fp,O^4V'+LjDt at kWSRlctl)`!R^@=g9Ft,hX9*NDC6g%MR(8Hc'0+q,;CK
+%JRsS-6BcIC]@hL(1dCV,12^N5ZYNn"\s-2UV.KB24CIX.H'i)bH&IBufL[ui1T+s*dTG2<^:S6lj!E#4.emc.acEH8pI4(-Nj;)h
+%ebh\SFmU(4.<V8`8sCE<cBD=9[9l1PDS^b5FDg00qefE%$OCCO at jP_cncFbfgP5IZXEcl8ZB1B7@GrnB]KG?in`-"/>qBe<!_9Mb
+%*>e$43pGI#Cj.pj.pHBY+935/]%Pq7rX(8#U+Nh<Zg/V.\Zh<TVhQGTUl&3ENa%UYO%eF=]i(C+IGj/1,6GskGT:+;o"46VSeL75
+%P&brBUHVoJ&ofgfAb(n9&S*0.jILGp-<Vl_Ra1UZ3nH'Hl9/AE@*d?dFN2c.H=>.91Hmo0WW"t=m2F78NY<Cj(Z)X0GZMm4Y',s\
+%UJqQRLaG7/-pqiX#EQXA8igS93O$`(,!A#(JrM:mf9m&&J*P9]ieCqR"P"gA;f)V/0X3@)k>@G$793kPMj3^Ci2%\q2@$\$@#4aU
+%#a&Alnek'qE_36-AQ=h-#Udb8jZo7Y/^/?OO:-o at 1NH.Ml!b.YWG%q7.@;o6XI)/MCf/&!mKglM(V(\7N`jLM39$F6ADB3]6K&cW
+%Y!*,CeEUkZC_4L?Io]'cN[?39N=mKbqN[Nq3@$hV3FU6D#1,0!dulnA>#+;+l06ka$'NPAG6\'I3?K28$0uM-#g5-e*"7lXi0MKU
+%!0,)WX^B0S)=kRRmn`.L<q-=7A+/Q!S?7bfd'X4 at H,tV.GrZ=6%frqhSctKp5HJM7A"N'kf<tmJ$b"nCbh at MtV+/l at j.dtfnp?sE
+%pI8>nGj6a>l7Q(SYX6'gRiH!UZE7^Lh4plcQMVJdB(0,u,fro:Y?`_8YnrrR[12p;1D=PISG'6K:2E^oU"22"j`r4KfK;o&+=?.%
+%UbR#g,^T.f>fI+Qs"9qOpI6(hlEcK3qV@;L!E-(0X)Q<OA=Fr_V*'ctN7uu0ku at uT\Uf at HRsdhj9"HB+p*/[n?%iAs's/bk8#=9Q
+%_BWaOX<WjS=R3Cf8r?OoP9!;I,E1%'L#"1p.J`8)Mj!dQa0*C6&t-ffd/c23lWOJ*^qj&`P#]e5oXq2<5f0T9,1'Es,W`N9(Y^QR
+%]NQ;XnYkA$Z*Xg;,-7J)KZ(qhcgDHoisPA:>+2Es#$,tJHRXaN/9-9\3GF=d4]/N*mBh%kb5a#+C:9iYKNr03icTSf((]Te^h8FX
+%'fMqk+Sj\"`R\1g;YFMDc5lfiq2h5Sg)4MneYC'E8#`d$NIr)/C_.\=BeMhCSC'!8e]AMWSH^-:`EelBO7)O"D?jll*G)HoOus1U
+%8:H_lgnJ9[^(3GQ`_[$AUg>=FS+Bl-215*Dq[$u1JRgb<6Uis3nYMfYenhbJ0q_/4+e+)h;!iGq,1Bss<Y;]63ZKp at kQ+?ZLEFWE
+%YW7Ui]ltSogM]#_M05*OIl9rj5TU58'"P5/qmeAGK)#T<L5uN\*DUiZ6&Dr,4Mt+\/O)goXkmHh@;c>\duO5J&!Oj<"p-mBD9>_Y
+%Ufe08k9^EJm]IO*WOf4)Fca.[I%9B.bt2fBe\R-N?ML"DB,6AY&BX:]bu*cF[(4k2j7sX+7`<s#`f<IhC_9Pgla&_YkJ'O\MG84g
+%l`mM+A<qI&63/;l2jbo?CQ>Vu]C(8^]-r1k<r4/YFeo\RfNHJ(k-j]jFL*u_ctRj,k?S4IkS`sZJ_t):Fg7]6>n1(f^f[W`"FJAZ
+%!F7Vh,DAuWG'R>FHa0^W(VWOO!m7`@Gb$abeo#$N"/$IF"cBeRZBn,AiOlX*S&69J<aKBg[P!6IXpWKHic\!f_6W*[MHi2sfqV:8
+%$#\+bCERc*.RFF8A5p]21AF5R8:/b:D55dPG`l<Vioe]sCr%Hu8O5iZb_7@`#D&qkI=W'B0.9+abLuIQV$&_H<?u.<)Ib#F!83"l
+%UnPjJ2m1j"%;N1aTR)bm/<j:%7H!lV19"c\_01+YM1%3Ue6F1+gVpML7:Ja)W_OE6J3q5[Ap,W^N6a5?GQ=>;fLq>5cEUt>!niF*
+%,e0OHE/IT7AcQDs4C`H,iVt(ehNB/)OW`'NqeABH+Go4L\c3t?*^p"7oXuJ42-$%VmNc2;p/"cdl/&f0ki=G\T6%=@VO(%PR+g at T
+%`=2Kko`K\W]Pe at mg#-\\OSDcqdrV=[nKb=$VE?jujRE"c-^pa"nAtt:\kP;*m-D.\T"NVVAI/BYRCi^nBB.K=0f'VM at f\nf>mHjk
+%D@(I'f?9;L`0^Ucd%:qg:??[S2Q,%grDL?PSWb86OfN^LK]Nf<`:XD)Y"q&8BnCC=VV<lJI8 at R;/K_#?+2s7AagKO;CGb5V8od)d
+%:dD;"><%(qjgh#e0'CT@]UU2;p!Y&\2)cB%J'<:SgZ5-0KU;QP7$?Ul"%0KJRo;KuGk^.iP),7YFsYm[[Uk9&(1M"R<:D][a\HY6
+%39AGngmriE"0I$E\s.o_^bh7TfK>u(bhQ.M4r[uDj++o#(+lTWOs2K%UQ8U%*(LaOag^`SiC=PH8+`;BfX!NsP2!PNqHhN`ad%,Q
+%Ssuk,i9K58XCUq%iq#:Ca`s1u0^JW7hAYVI,fT2AA#<4pMBFc[>H)Wi]J#+lYE&POX]+ikZ:K(T[Nm3qNIn7:^dnd(#k;jIW]6#R
+%l$hBOBu=V33=e3Pa`Ur$d[VidZ__hS%p*3p_+?)<bDM=7_U3DPe[SRg'6<XP0=)3VQrZ;KOkt/<S'k/Ao.KUppa/Oo(Cofl;:%UF
+%lAC#3CK@"iDC)F`gp9Koofe5sgEn"iXBKl?"?kOmRa/5(0\-0X<Y.jqD51QC[%qN^\41PQ=Taa#PH\B4rrYCH>*2?%R%pJ*KaQDS
+%=&+.N at P0dF<]miATA?h,+;Y'fTMKSDRPpeL_2<j\=`U'@oh\B(kM6q34_g]#W!&b_n?>ml03B]d3+_iX3FUt]['psJUbE;FaTn%>
+%=[aUr"I,`,&a'3sEl`%3F@,uVF?5'>mQc:]B<pV$&4OA,)MOd9mXL&+D-HJ?nRd>b:@suc\E2cH-S at Q]*ON`8PdRsc':YS[0@]Xt
+%Bj;_oSK^+[`_Q6tfOcqn!Rm:SCO=0X*P$dNTgg]<l'Ti78Cf0"Oq9qQFlnRNnstfN;1H'3WaJ+ at I@aDcdm_N%pUd=ucNSf)*3;nc
+%nGV)Mae>FpH5kZc]e!)23iD819?J^<&n_e:cTbJ#@1Vtc/;`OJcD-i4E1HRgBf!+kHT&:d9*>.AQcmGIPbN$Qf^DaR,?[1e`X[f)
+%VaQLilPk=.nM@)q4p!\_!<"/H-[q[$<om\..%tCDbM at GOe]Bk_>cP))9$HkfguM91Q=UD:"4&AC.n(;MQ5$\&Z!"q'n:#Da%P\Wf
+%4Q-]e.j-j/PsWlUT/=+T*Dtf[Lhl/2/7kI!E9;97Fk\oH8:]Ff)BCSWW8ts9/`_6tp`0dGlG-f?F.t.`$F>D5i\g6\AR""7l)\(]
+%)Lr[L+h2)=ei&DeGm!frUEeHTdPRUY+K(D\m"rD\48<L=T3P0>buWV[qu-^30W1:#cMO*j,q&AYD8hZ%aWRE6cCYLfVns&$F6RLT
+%'>EQ#&ru\=cb/E>o9M5$69Fk&VFa,sbeprV&c at OHAf^#,MY:lXRF*DaIe(Y9Z&te%gUlNLjj,4[j]WaN%VL[#Np3&0]'>D',@#M.
+%`"OR!mB7?H30AH$]D>d2WWVgj=W8g/i:-Km(:$=gF?s4u0;#_3Uh.LMcV#0Nlh6fV3XDh]SFf4+WTq0TqtBM,Mb5AmHtZ(T0>4P4
+%=<jAbP!bX^CSKk:&slKq*_=X8s*,XXfTQCfe"fHeB!oUCP8dVl+t>H%n$8kOklg9)#f`tLWj^]tCS1"=Ur/,QHV6h2-6>nS&6'7?
+%/9MVI'4smtc)5Jr!I";#X6hS-3.bZ/3r.`[@<n?Gacqq*D/D(S0h3\n\m$K(QQ<F7%0hbDE'/5tH;5:EnWd:$]idlLUF$>0/\UOT
+%Y+$a,</$#-SEA/'YV?De)oU[KI*\'+.$=/WRpk`H44t>*[3W6d\e^r?61gh_fgY%!7PP!$A+grS)Z_UWV^-d<E^Z9_F2HA'P.Ed_
+%/)uD>?mdD<"Q:o:.$7Up8!.ij8/pb%frr'64IFV[3S+2-;a_TS7+J=5, at tiXq9tPR9aJ&f<g%[;jW%3`Y[0Si%jN:Gou(akZS2p,
+%b0!cpp?$sL[3`;i-,O&uc0n?I/bR8j>Pr6T6JonAJG31m-8&1SMj%]fMa%7)UdgGDo$/uHb+pBf>C:+<\J'X3ErM*tfn7sMg!IeR
+%*Dq&G3XHR3KD'"M at a!S4.#=b_fVT!\K<i*i08gG%Y'3%]NUC at Y(cLH380`p<e*efdNPM7Kp(ZLK4eBGM"$Co;3O?*Q4p#q4^A>1A
+%G1t.JKC&1MHUj\sW5"W at X,U at lT!ePt+L#^[\Sk%Z0;7ITGtFDrI'jWfcmX/o%`r0>=uA>5LJNBdk:F at W`#gd.jtA/gpko='Xj*g,
+%jbQCI5?VSle_6jXKA5u[a<"q3.5`[8f#-/.qKSXcmOBh-!H4i/M2t.:Cf:3dG.pO.f?#BTcahF:*soG6<so?+V,#d6Huc?3/;?HY
+%p'V4%Z$-eV8kQ=*BNj#kKn0=,=&!!A_bTNR)Ib=:o'El2+)^u?gUu.!p at k0hdUO=q3JULW8K\l9PRZ+gH#q_7L[l,"f!%PHHma!k
+%JTkELI2jgB<=7GF!YW6JGWo"jHS.V461E>lN&c*[G\]HL+TN[>I\-J*R+?AiZ#gW)E_$&Lj:LH"(01JM4fB!(:3R.)2]jPH1^CtK
+%i;b`.2+,Y4H`0?n!pZ7'\e7SOg>lOQX.8&@=PBrr,jte]Lr0a=3?2hjUZTMuZs<7F%j"X0L`bApP\\V0b*AULD8:</pm'>5!dL39
+%JV=kcYiKr.#><U]m0M/gX$Lnl..&oE.`9cKWDqLRXik=-Hs5/V*;R@%&[lmRgH0Hn:>ILCirJZTr_b$?.a"h)Tp63F[?NGD=jD?k
+%ECu)Umm.4,Hf.Xoi3M"$6_WsCTBJPk/X.kdOTp'[C!K!4+NOTZ1PlDmA$RIQV?af<$-bf`ZWc#lbU6sjjSh,Q:Q=U.qs9Mo=[BuA
+%PHF2I*s$/9U512Z?&3bp?9L$rPDEoQ;2%]bSqV&sCD&smrg)&X`J-Wcnb+h69YKe_3"+HgD*_$$H0&@j2=>?q(p*=nnSA_lQ)O^E
+%;\UeHJ%96nc+%1P at qYFrCWn^@OJ\P`3ohV1"Hr"W#F"7a'6<=B+o"IF+G&e&qjfC*TPr$:c0IfA4p+C%PNkft`kKZ=p$l6LBbEs3
+%gDs8"U'h2=J!pZKPF,<M>-)KIE4[_8487=*KKl'p4nX[OL?EF+]]n'Ump+[ae.c7VFba";?kM43[[&?FBS=nX]tc4Bo4D>[_/pi(
+%[$XO_n at 1@2G8<P9hBdntmHd"DT!X8k10Y$#dIt;R%e"fDnp0ddaMsL3:%=X(Q&oQ%0M,g^cj7;/J)Z+"kCstmM17j"mnUGtklBki
+%>!KlbB_eom+6c980-E=G+M")JSK6q.X(<D at 7L4a(SaQ&LEOr/N"poq[[N'5Wl+k$P)FOOiO\hFSFE"@_8Ta,LJBg"SHZt>OaYh,1
+%i`Ya@=a5Z=n?5X(,p#R*:SLj>=@--JCeb*S>lka&@DZlt7O/X+1:Ri^O$p<9pH'[jooD8.#%\1%Z)rSu_/)2:A1GbFK6u=UHDJBq
+%7!MTf<&3$lMn4OA@&t7LAWa_mfh,(7Tg/:tkW/'&rP<C&m>loFA&)a&4l.:7o]Z`2KN\.JhW9EqYot4'^7%KKT$A)/%`R1/i=**V
+%ItF;,4<P1&:[ULI7%g*.jZ="(L;C'0T:Tp9^[N_r5OdaF=Dpg=49iMbqn2ZgYq:%ae8O\oBOKG"?8<U<R<IAYoYIYcPKf4;l0NWB
+%^)mN;"=6aCRCN:=U<_<#:@RboJ_V*bV#\*Wjl?>K&0cGN_%M\I=HFCBX],]VI*-FT3Fsi0+#XI(>&5t+%UeSF<0u,*[5*H<5WK'.
+%0kMo,V"E`eqL)lVJfVh=U]qapZi<OIDU,jU[fK\F!El5pE_u at KDout>m$Lj,bW"!"ok@<.!ZYeEI,,`W-E0o?c&1Yl4P"!UKriN/
+%HZZnT!u!(F]*Gn3+2t[PgVK2=/jLOuAhIR7.IBi9M8_'dl+'^"Oc)#&?74VWiS?gIRBBhZqr23upLfu-UkJ.W.]OF7fZ,;gWc5-B
+%$YsKf8sn1LP)_ct&;c\DHRqQ_R#s'i+@`l"3FpBWflPm%FS%PpF!rAup8Hg,.gD23]P"^GNQb-KD:@Bi(]&;.695k_29mH.ak4e_
+%_CjBZYqa3+N,<iOfLr@<(4"fj2U_"sFAd1;;Q?Scc4^K=HZP1]-YM1??=b%+oY6O$:>gN^!pPnE>Z]CCD<h#Vc(l%_)jGuZd``0#
+%#D_l<DNH65.u0/A;A2*<n67Y=&5#cKfe$l$dS[=#B:j5JY-VB+!eMPBM#cZoPn!M"4FbcO2*H:Defbc[Z+9`6#<&Ns"GO]J8jO*G
+%=qLp?59sF,Dd7$_K%OG\(Je/SFgso&D_B_"a,"]LpWhG$*KlQg$+p-+K_Fe*?'.3FbW5:I:1T*LeZ2LAoQB0rR?X/]3<j$t(>T;k
+%B-,efD48P+=43$W@*T_9,#6"IS]Qq'9)_!J4`#VK<AoB"\^M=Yr)VPf:Z.0qB)][o)';)g_[8`q1(TrHlc"?a/DO.sk&d6I+RlEL
+%IMo,P*E\6G4/ml8>9\Z!D8XVkiB3*ZQcWlRr,NM\_HXRLYPF+u;NQ6'<FP>il$tN^^/c=O&)b_T8kks>^)-l7I7p7"%!O2G[/@9l
+%`R:7</Xl!brI!bY;1i at Zpo`26W6'HkCb#f#Vsss1]D]8cP=0X&+?[1UV]Ho6RP at 2r:^fs+Y+*o\5T>5`[lk7NT?<>hnq`L?rOKXI
+%pFu;4mS5UfVB=;6d'>F`;LNYGE"WhpM"_m="QUb$hY,qnm9bUl)nS4Q1$d?X?r12Cc;GXb]HXj=*lPA1lfI?JGku+IiMUDso>NgI
+%)dPeW_`P5#Bic8;VIpS`XU^_MOEUWb03H"u;+*7:)sb$eZncppRM<stQ(5*%QTJX"eYuXf03871h+,6pffFPYI/Z.nTJ/4"^hE3s
+%1M;*?WtALBW0fsAPj'&O[3RHLWka1U="UTAIA9J_W\mC8"`?db2u6A9h'mZ6]6GlSS_b&";j2>8QaH+s/$&1s`'JkqfPO+=KOh4X
+%`2&s at flI$n"7U'CThiCB-7o-De^!+t5q@]W[[J<3#\+_hhKBlM?[cjQqg[]fe&CUO1K5GfMubh`U. at mop1MJ9)^q5;GUWRC.=5ic
+%CefCr5<&lqEHTAt9H:T,luanBjY1g%;eTQf9\#/.'QG8gr0o+=0=^!U%mK=//>EI[Q9Q\Y at -Zk3qu5=7S8(")eDF;Ve!sf_e$`Xf
+%6)C(^gsn>YU8cAfpNnq]54">Hj+#t9N7ZNRntEL1_H^fFUnVB,V/qbaR[9uoS'R]'\.:31qe(!1/`^7$!pjr$[rRRmD\arCTY=8I
+%b9*TK@$P?eHM<MYZ&Y6!11%p_U&L_b%q-o;M&C>K)pVFiFd53\OR(KOCB%e.,^0?I::smPEW$'pj;&e^. at lF`\mYk`@*,l^d14Jl
+%Aikh>\HOYqTKnGUo3AN[ab<=^gQD=:rAk)Un"N]NMWD>ZKTpU,=-m+-nr'INrApCHKsMTF&^9$kKfn0::OIP+K!eGoo/.o1<(M=;
+%ZmMB+]&)e at jN8e/Za[3\Sk#T$9j$:J&dJ%nnK2en4TAYg&lLa-_idapq=EXg]ZqNRlN=TJo<D2BQJLWT!nTqeVQ at f;f&m>/85"kR
+%YiS at D0hI\/LW;t1R?-l+:9]aZ91VZg7Nall[ksIn'o+E\KeNa1hU_Uk`8b+l[R`S@#rN>DrNuiDEI<l>4)f9UYFc-@>aL#6;`%VB
+%7Ck?%h1V-kTVX7jIXVCZF+?5K:8+D"d!FTaRmagW=:eE2'ek4JC81fu-kZ6FfQc5,K8hqZD9L$rgU[QJ;6edK_U'YU)nZ_U[Q9cL
+%OY>+s3IB/Hfn(pEDH7.`!I*j"kUTHumeP'1eW]VTCJ&Fr?AJ_<\JC9M%GW0sP'"P7%Fank$_Z)2b05$Um9?QS4cD+fGODqi6#ieL
+%?)RDk<0YrED_J:RLZ6oX+;Ld87i*#)1BH[^Kk5kUW'WfkX3iS3_4["J>/GIr5C5ef<H_(s8)Q'T;=0Y.>"=kI<_a?HLh5=o*u=FL
+%&2SdX**hPP5.56ul27c6V"1_E1J;?HV)Jc`.9kqpV(FXgo.P"#1^:*6Zu*>p\aG*Jjb\H`HktA$]K.g+#9H=Y'jPRRk<hteZ9Y:^
+%ruO#1^O:jdbo`Ba:l2ltF].>cCg6R'$!c1S?8U%e&#)tTTgbTDs%OGWJc;l^FdVbP2d>?R#(/E=;u&fLH)&jEGNi at mg..Eq&gMSG
+%P at NchP=,oMb"Ju3[FP$<NE/Y<FFn'*6\*RA%Y3`:odFjQhLp($DSEk::G1#b9ejaGT0(Rm+Q!?heJ&WfA$<=C]70t)3j[HD>qM]3
+%3u_8<e9c&Hj at 15e<0DPD?>*47ClVgcF<GqbS&&. at 97e.UTOeI#^D7M#I_[/,"d0KOU\6rW1p_QRqGJE(%2Xa4AB+k%+Q;,:2*iFI
+%K4K&d_Yh(SZIHgWMPf*Mj6;gCGX0<MVt).*;^O at A?LrX1i&ho;7t>$NA2"_PPE.hATNePs2feRlp5IMEeNX<3>mK[,Sr<S9mWki"
+%J0eMgUi)$rCR<^'HZIL@@t:[(6^PZs.R93FdE=E/,mt at DOrN+pE1Y`m?R@'`BKR#+9-o0=5=n0E$Z3t+'0HPNYTl>+LEIcbVrWGI
+%8uP7SF+0;+*X:JegtKOE6?^i/UP#a\43oh*JsQ6858.RJ$o`U+?XD6g!(%drLEdDMHK;4D:=]B?RHTE5E43Ib8pO":8O>Q4%%fpn
+%VNQ]<rCJYUgRj,KoV+(a21iQH6JD3%5tO;j%#id.Q^"7G&JDN2%'_j][*KrmmB6.K2D8.:BFu:$0Mdj4aYh31+!(CM6',ZET&5n@
+%S4>F*R^gkCS=L<[gKg>i&+g*SJu&C<29t7u??SENg2fHbSI*ZWflGCl8:dB/UM4)2j9Vd'cXEnr%U>ip;X6s9!$B_g1r0DA4JD at Q
+%k&MQppp$/3s4M9pDSf>9b.U[$qIuN[SJLfH%rSM8 at e8(RR^Q"_+"?9IU*U9hoT#Gc#6>t%WnO80FVYohF[EW%j>_&6-8Dji]\,4I
+%WM%P,p:G+Gr at _i>f+'E>;HCuo99.<H?5?/BM1$b?k-0EEgJ;*3HWOOWpcurRq6A%A.A$FlT?F/0(_iNB6K":`\`1D*GU-[<(b+T'
+%EA7m14##a:dn:8Y>L.DS37sD@#S)aOjLEE'DBa06I9fjq3TjVoC<t$#ndoF7Qj^5Q<!R:K'5N284iot6NN0eZ$cMn)KH&%f]_&o8
+%EkWlOR29#8NdHRf4m9+jZd2XoDa#Xb/Cndp8poO7&-4 at B4#q0i#,(aQB:Dt"PAQ:W+en(l'smQ9H,$,Np0[dkr5rZqp#Y"Lk#*1R
+%:(J)%%Fdqk0rJ9)XV-l*Ye*>6TJ(*][6g at .=1L%I8^Z$rKrdBebs(<l)_a#4X5Lm[c%.b at I81ZuLRe?P?hsWU;dCu_p8+DBH!2k-
+%!gC/7(9eq^cE_\Po-O/.ff28&Rp#2Y>]";*;2[#;#PmO("=9lq%/O,1I,W$_1@>A,6M:(Q%.IjFX4Sj,7c&!a/pS)JXtTb#eZ.c!
+%o.Nf$S$Fq1)NV:;2X-")T^q"jC>d`35HIE\SpZ_:qWScl3jQU\S$7Sojn*s181WlPIV#g?+8iN/E?`jR#sd3]K+A)$:QmGk1<*W:
+%<D]]0$qW/\JdOB!Ocbf&Y*<[H^*sHr%B#6Ba`i3q8j:pE]a%l@<aL];>L6l at l^5nbL=pS$Ctfe1j<nYXIgkC^,fYM-^napf7MaUC
+%I"?Z,[LRURH9%6W at _P'(#SH/CAY(r"U"4sa_fLg-P-,H?Y2e-4OS6<kN(gnp%!MbY,[N`u:%':Hi\a\2)59Rd)f0nF\No:HHp$4$
+%H]<rt=,u`";<RKlFK46/OpK>l"!oe!r*8Vmc9:'#l27gh`m<TN4;\tPheC!8#4XfL903rI7kH"IV at qQB\a=UX<XYq9PPCt"J0U=(
+%\I1gs3t(N:3 at YO9PQ8,)n5A]Pb0NE><H]9^h6u>9H5BQ3\B`]a3:`SVF9$"%K$j6e`9VcMKoc.9+p/_**(!R`X&p,]:>%8g,b^"E
+%^Z?.\h_.g%s7sje;BsukYoU6#o3 at Xt[):#Lm&!E0fMi#[:ZIKp5iL2B at gQY>N(^$.F5)X&GN.tPU+j]5?V!Wj%@oPsgVqu/:H[9[
+%-Q>@US;CT\oKptgQ$#tY54D2bnC2%Y_VLI?/_C3N*fH/3`&YqMWT[+4P\t5eEY0"o+>nVs at XNZnT3o.XCdZg6_'2%oZ5ssRB'2'\
+%R:Q/A(Rq<3htUUXPq(e<mGe\@Vne8d4!ke3e=]#),Wi4Z0ii`E!_LU>5c6%`_kEIPcpt1j%+ at +NY)NXm[X63HUb_I-Yd-U3R[lA,
+%J^).2SEeHGHK6+^C,bdoo?O8gENTeNW'\hC["SJWm4gPNfO[2T!Q_3phZts$V:n;:]\O?E;2b92"4^RV?W'_b`Wcb`L7rf&J at t<>
+%1O at f,b\bOQr^`Pn4h\jZg8_,.V`.VVg-XT8^O2%E[o?KuX195uD2h//GZWFTTT]5`jLCZgk\o'L+g at E^RQu=Odj-UBZTt;1U2unG
+%:<L!Y8Cq]R*V&>V&!C,Io_-rl9%;%Nb.[EjQRh0:+QeEn\gHfJ)QcuQZsqnH+MKDjGR*u5f>Dl7Wce]FG"akP0_Lf[Cm>6,ihWRl
+%h5rKSoVF+VkKa](:>iPSo$T4=2,nWXH_45sAE,n*YT2g\0Id8Ok*:;p:JTb47m\K)ELLrc9Wbt_]N*Kfp=Bd<^+.;dGVh9uD(i<f
+%,UQ9,`gmmR;YG$QUA@>t/!XGI<>i#1NaTTo at .26QbXqkT]6,#3C?)*(?fj,q:>7`&he$nUpXcFS4g at R.4/`5=+W[Kb#IMo^`L+f;
+%c=&_@>Z+RuplnmPkXB:6P!b7N5^':3FeS9E%p&:CN2\th+S7cEMjY%c;5K%H1h'i#n2N9VE%I56V=Jo.+7KI3*0M/^mZ\43SpZRW
+%P98\,J-K4WYf$qo@#sXG+mBR&:R)p\'1eD*klKAhHLo!_X32a3)r<.nS+mdF[4N9m:'HoDh.JtN=AKm7$srKQ065K[?uSO"N=)/S
+%^s-,WRUt at 2LH<\_4K0IM7U&].:Xm!*K\SQqM3%F_]1R0]4Meb^Nd5RIVf7*m4IU1O\=?f@%cN;:O'^A-,T3!>jsgSmZHD7Ud&cV9
+%A-u8a<0$=5.E>f8l'9,efhcre-Z55B6G)L@<(u?s\;YdVK,?J1c9$"LoO[\"l09PjI+,c;+lopUks+n+o>MPt*]trEik?[%It at 2?
+%WbR'tA,2BpW$MA\onoO>-.a3?;u	]?YKRM$dNf8r=P:Mft*E?og^4Xd3Mf`>3_V126j32#WAt9eEojdP/7a$K'*uYd-jSH'PRe
+%Y#hrb6JQ!C;p*%GKc%)fVOeaWQQX]+NRXS(W:"&!^&#CsK>th2f:-``aGO#iR at euhR9YS1WB<0<ir_5DrMbUN#L1A0N_O$/<lq1c
+%.>i4-^gbl)fR%?u4IsQB at W)`M.f?bYh$J$X(>:#j6e*HPc*[k>_F@**=PE+X2bF<RP($n9a5SQ$4-^Yr_d&b*h#jR*jEQ./Xll#>
+%DVTP?<\$G59p[-Y.^CiD9.:I;9-]9HO$P#^9J,HSi9DQSYr_jhq=(2L/'oek,Iu`F:Etu98R"sg!j8Ku:eee0R5Ru\+Y/[?dPOA[
+%8O;",VgEm`ad)5..QPdR9f."`)=NdV^dd"<7f)IFjb6m#hD%XGOn9VU`*<rE+V0CGS]f[m0!'=11j/Bh#H!m9)%.&?_img"X)2B+
+%MeQU+A?+>;D88AII!J\#cOW\B]XF?iNnpfDO at Zo9Yj(?Y5JfoLQPTOAa_8rr8^WYnaqgte"=Me;ZIlg>mQ6db,p]?+oCJX:2Yjp+
+%%BreSoTNqjdhbX[5[_Q2lmmu_Mb*qfaUD4=!n-WbK<B."3ig>"9-W=PpSYO6OS:%;o-3'=Xf``a`)=1KAYb6&]B3.7^un9DlRlea
+%_+ckB]XDKmSRCeJc\UKp\@g&Bbl0-XMq#N=ZXFt[dU'%ARQ]'E8Ys**+0Z;aJ%3`?s&r;CHtJp"kHlT_=J\^RBDjjd0,+Vo-R%e-
+%"T0prQ"-T66$"C+1AOunT("sG$QSngnc%4McN.CO[b4-K'I`)f_p&5PU3KQuU"%ilPrF%!mg6UERQq?]XYU:>\Om-$gmT4p`0f-\
+%Da+1;k`a0fQ_-+cA>Hm\=+Ih9.2B"9BPd>][Hj3of\HPL_SqfhHWt855"NoR2Tp!l at 8rc3:)e0;I4jX-b)&gd5$850+iG7+@>tf$
+%G%E>5Z0%q+bkgej*CP0'!WSbGi<Lu.Wh=a2k?H]TI?p,^j!OdO[rAho"XR!!Pcq<+7+g<ep>:%2dN#aQ`1kQ0j$D?m!6t1 at I`jpo
+%)5\Wbl7>9\(ph+bN?1 at mfsN)8$.s;b0GR['I^*NZ>U&&`dIF%TF66E'8Y$/cXC"3(EOQ5o*^7cfTlKbZ'MafWDb:b8RNd5*3;Fj"
+%Xtak)S7$JCK:F,nGr<,b7"/$IeQb69\:Gn>Wo)DD/T6V=;df#a-";iR4A',p3o]a);-mPM[HI)S^tD"E at 0u(G:pG6S)u1j--(hC5
+%<nG>'DHa:+ODFmhr(:jqq\8%8O9To;1k71ND.$VHiTI?t:"f[f'67j9mmRc;k215aJ_Ed&ou;$&o91S?jc8,>nrhrbCcJQe, at QXn
+%m=S$*a'cj7!k,L'!e4Ts$Xqf7[ZToF27.V3r3q6*HSU#qjdJ[(G>/42936[TMbOEDk.gefb7:"!L[0#<;QQTt?=Xs6I!!fH"pl`h
+%P>1:e,q]@.k%!M2VGt6hAA10..Lpa!\Yf;$pFZ.0peuWV/E2i1F2#Z0h at 7EIKsU5Gao*4eJ9<Pfcde\"SKsMsPS_3bAt(RCF([.n
+%UQT<A"ho'"l&ZCU>W9u8gcF5[K!=a-V'dlR2d&W7A1gi3<\gO=Hc!s9%=\B=]39(hk2o?Gf.;iVI0q-=S,,lLkYk.N*r9<P!5=6W
+%EBqOh`FKnoUM$]@6UT1n9dfItoKp?'rX4/?Of)mK0un[C="9mh[^@0@\3E<n/!$VSRDb?jOW9V`pVP57%9f`]=KqIA//'9bVIZ"b
+%gs`B"j]cA5QRILoJ9e[CH7ighbtG.4=oli+rgB/-8p,3ff!"\r14(1%^n$>P[>d"(Ab<4kr!*.J']H0nRkgS*Q!]Hl\<oAR89o"<
+%n'jkM[HE1O<+=HaCkFW&HFtjOd*JM4'[AZu_[Y(Oj_<^QXj]Z:S--[!(V?3R2)u+N%NT;#Rf,:T(X;gJHO4jA;C+b>g>@iGK*>K)
+%N+.j?c^q&MOhC\5aZL4#-L!l`9i`qJmM$sjrU`3&H^!>[W/.C`?GT-B@,uY=`9(lPCakN]$i3f;1&YCQ;E@)>of:#Fd=JQ"Dd at 6"
+%kt.Z"]b<RZ6\ac5/q:HSg-]UV(3<Dt\L$/'gfi:N=hunaHK,d8Ot%7(VPTL@]?DJ.4IA&Lqdd>WPeXTo3X8<SJAIFQahhU?3:A68
+%k$BC_2uoQkeDPf at GB5i!#\WWFBW437SS4IN-3$cROF[,d);5s"?ceD/^%@UB=><.PO;CaMR=k+o9j6;n0;+X at b(Z2gPgm.pVF_1g
+%ngHEb/:0P/:LI`=rnmpKm'Ji#Kk[/._FL0@@^jW.f>,2ZQ]LL1=-Un4:Bo'VG:KdHhdoBT+n(_1BPMY^h_c-C0KBaoM4K3Ze!r"n
+%7*FSZRb4g5ZCq>YjIVV4q/UdV)GY'SaN_e[h%]]#3NYHJl3r>GcDsb4h]A at m%*9u*_T"N^D>11TpG"t[qbL*.4nldQd7Yu9@<J2k
+%"i1]1_2V$d>1f^b;i<fb8daj_oMO-m1,rqpR9Fd3KL=]LjV1b<@it-87^>_8f":s\K\NidXJtFp&gq7sPLk:0;N>:=P[ZRWgg%>N
+%;_ZqN@<eb<5jC#=TCZQ%o\+`,orV/V]d.'O5Z2&`k.ERk8_+8ieiKV9<U7goXYklaq]:"h'=#*XD[MYJW_Jm=S9bLT;"Vk"d:O_<
+%`[pQGAi at Id2[bgqE-ALj6fqZ%5/hb8Bg!p7=Y2HMbTH_q6l:.);h8IP5]$S;me-BNo.DYm:WF,YDb'Q:;$OBP0iD"(dj at 7Sr6jrJ
+%43nihCqcT/OMW2sc:I._[JKL2[q.(%2&C^OnmQ8BNHqBOc]h_0Zc'G+1J"\$GFZ&+cC5bC8]3E(m7 at u9H@M%qWs'F at 6!k6H=m)#'
+%KAH?5GWdKT2&TeA3D4>.1HFUr9B&TeP#oB'kY4gSJUi*a!QBSO_L<GFr?fi8Fl$>kjf.($Wh'X`/'MOMSTt,<[&FFib^B5'$%]"G
+%1CnJ[nJf)q>bb*DIhG7 at nEW/ACc7aKX#+[h6*WpRWE_SEI1&k(TImr`3bZPV45L1)pfo`28?;uc4j/s]12*$;0O$&5PHAChKM4^Z
+%a]eMDfA+r\^EE7=*-t6!FB2qLm2.MFSK:eR[`Wpi4,TG.n9Cp=TnOBNap7HRmPeprVaNAU02g62(NsiD+9jd8UQ[3Uh>k=Ri??]k
+%[;G@:.jsNRKb?aS4DWL/'FD,7AoMn\Q=P#+XF$OKRu4+fklDb!L6mX1.c2gB16>rYCDT>*6.X5)buM"4YaLP`AVD,Uqp>ZKTrKB%
+%;1MEp\*A&N%bN3C!o>S)h7ULVpJ7Am*lsZnWr89q1eBL"$*f:3XmOB4Y$rUV2a21Z-WX$UU<:5"(;;<pfYW*L&>aSWb at 4D-$\he8
+%elg0mrck;"#1 at PKP9K(P/GARW\YbReg59'D at Q)e:#ro3E]A/\G83TWPLjEEW&rD-uXa#FcmLTFTRafJaoX=s8"SfYe%<<C/3e"Ik
+%)%KE^B'Yt>E_',c)D(`"8[L)%Lfr?48)$e]"V(cFN"^@g`Oh(faEcs at DtN$WKSr:cLG[]?jG/AX2HQpAKg*jqWQWkt!Q%/!_b0lj
+%OIHKJdb>EMcq?%@h`S4jB)7:=6mFE/jiB1T3)^USqW8K6W[t^YJXOW1q:qU75B*n)UXNGEp<kgD9*ftf_/$07-j4n5C<lJMM/25I
+%+&chXg#b>:A#B=,og+M2*+#)q,u?AcZ0,3VGLF>t?bWW9*$GOl"ki;lAV$,tQ%HE-hc"CrO;t5NPslq&4#na4*5UsRQ2DtY:NLQ1
+%UF6ik)RAS?PELDXdi?^K./uttbb#/o5"QQd!$nC]:g`81]q)oD?`4oSjn_O$H$kj8P##.3_"kIZ\5,:Zn8$Ig6K1)C/5RP`"$TVt
+%g/=dg8C at _;!%f9k4LL=L[d&.mUa0lKf at cMr9eaVAl\=SIUdEZnikZ)[0foZlJi+u]9CC_43XZUBP*[_GOON3Y\%\N_T=MXLGJ[&q
+%[Oj"VfgpOq>977kr^$09\-qqL"nVJ9rAo;DH*W!f#&6/!G2DgV#]cbP==R2ZM;>h;KIZlrHIIi[l!UWU!/Go3fmkhM-_HigdYKnG
+%eR)W7nr!BOnlLe48^Y)dO4>mU`D;1s--]J7+#r?_;+6fB]1FZ:&0 at CsAg\h"MrP__90,/N,-ggL8jfAbQJ'*QD;eKD(OMcQj=`CD
+%`QlOOg at O'DNq6E_oR-)>qC\D*K;')h')kX=%4W%WJoHN+1ZZ/uksV3"ZeX<%(A=eUP60/'kr2o2%I8UR?qtOigGRjFg'cpGPLpb[
+%LpuO<-$a:[QJm76g><$q;M!OGZmg3="$9ZFn:.agVK%a)pS:bSkXODO)o#d!/IA4!Q`f-1%>ld369R@']rEWPGY"J,3\%^/NngYH
+%@mg,?8UXfR\!?i5j9;8AHZIr&80FqqX6)\h0Clu='e=u\p at .B6CpI_VP"Q+iT`YoYO[EL#E$+KHq^Bd:c43i.;r1DEiaBkJOINcE
+%'Kb,IM.f"Q9)km([ZsthR7k%mMR3#ed!6$$<aT&n,6<Y)L=K0mO+FA?W4:LR&JAe!*UE(NruN\4!Q/#r>gppm*qG61M0NV=@r"]Z
+%KM3urU_iUeAW#/SYT<VIQ)Q%cEVF9ACt-VK(+ef4!]^LR`^H1uLY/n._/!>S.-j at 2C^&Vu_`)]K\_(ieX;\\W%akYJa["FGb(VNQ
+%X3?#O6mq\o;n"rU7H)Uq\9$sLMmsVYVG?]fOOR7 at .5?ush8Ig\:\$\TVt[oA<$\!u%.&r)p)-Gjemq,-1<3!-l/JSf`Bb3#qZ;H`
+%]XXT>`(o6>k?;U-4C-p"n'Jo]*`I.g>$@C[?Eg.:25c)^b,fa->8/Y?h!%"+=@c0"R4b@/]XIK>Dl]4'90s;i"bSIqP+)odHp1!,
+%kgbjp$i=,R'-c at qSAWqI0&EBLKUT1mo\KD'0L8APZYoL/Zem]u16$h0'I:>Z^eB;KXI5,[CCV!E^qbsM(1"RFV=ES>Z;]=HCj"i#
+%HeEeuJ\df<BQa,YXgbUMfSjBtmG=6"q=hhMCn49&DcDn45f9/C!js,9.k5<FKuA_UiX_X583=(Bg*qk]8^OA>B$KVH2f4D:9dl4I
+%<5UD-U?lgMCTp.3EfWAu^S`ibY/+eLq6F=J:8%uCl;K+jrpkLFZW_tD<@+6CITtR#W:OD4/>U58/!.9*Q)J(D2A/WD^eXnnZ#&e=
+%s&pq9I#<oRRK04tR[iX_\eD?5Pp/f+p"$s`fq3n at .V8sI, at W%$&%qdoVcNbdM`Xum_Ka.Klq'eu('=YVSg;;XCg^084o+sMIH2s_
+%_`-5/bZOr=_0>/cRq5+,Hq?II754bWL.$R(L%;e:8TUsRF8?J*G9,cC=ro=lcOjj at R?T;!(`2P[S5q*EPMAd/Fg0H0';(A'?K-Ya
+%WLlG3e5"d7Phl^f!B2M8XW1iFl85LRRXtpe<U<@0-^iAT^WV<#9N!Eei44'VlI7[2E3%ZYD-nfH9M0aU:=+`nDLLMYPPM`8-*ifH
+%N'6G'.LI>b at b?VG_ot/_8FdL>1>-K?!W\CI&Y1>DC at KWtBuR$8\M=';lW[;CXn;#,WMNacYU.tj[a%mH1IlJZ?"l*Ma]Hd6[U8`Y
+%`MGll,_%nT8seX,V at BQ;oDJ+<X8'+:._uh#Ukc?E',#(q\oA6J)V\Wdi,4iqo(SP\&i[)HbqKBi*JT0l_^`&pq[44FLf0:>HqOU.
+%n,dFJalMIJIprE5m;jpZ-Eesh?L9e5Er4#rbKtY+"M;;_i:pN3c)csRb*@bRn2JdQk);QQ51+f^F"Usk[ccMF6s2C-05Zg+N\@$Y
+%\1PI,l),Q])*1[*3dCsG1/+G6E-I*1KRBC`qe9S=cJ$IF;F*Kf']/jgcQp%oqidu`.?#_P?Z9R1S?9q<g'OQ[#_Hrl4\#pKe8r'H
+%F"e8`XurgOi>f_hQ3!UWI79429V0K?E)XLVBEH]e0!4<NA%ZnZ''M=U23bc/#7UU\,2=_'qWN96%1=$LiSS*o(jEo[Op99*Xd+b'
+%0GpX]cQ#5`?LrAHIZ-8+YZI at +0b=/bDmSlqfh''2OtXR#q][If"89?H?(!/m"A"-f-%pr7n^@8,RS0aRhpk9KkLY7\]X2'.2"eF&
+%r?tbb-P5i(@qmq_k/Mm+6(K*.8V[*<55B,tp9sp^k=o-VY<Dh$fZd;qUM'^=Y&&,so"?<WP#r at 0lLR``f6fiP3THka:94=dGY#ro
+%_;_,bCaV"NRuL:UmX(`Hg5R'cOHu-3HsRHpg0Bk'3+lGlK<'V2;dT\]-+tDf4NM$(E"c;ZEaaepOsd&OaEKEScqm%a]</p$Ume*r
+%U0njCNo;'W at Rm9@bn at c_l4np"3G864.%j;0ZeE62:M>+,ED:aC)4ncu,gR//N"LD(%1O_j7"+VT93 at T$h4,'T1$?X-\^,5gk\cnV
+%fE2984cDVrB6(YN/VrdJDD1&1PC)lSSlDW#A?0m)BP'4aX#l0J!.ss7$Wpc=%Cqd/$tdjKW8i:t)lOT]>+n5sFiJk0^?HW-3-EP_
+%o-%ob at hA>n,X.$+O&X:Hn+VtmHTm%BPT'C`UHGHX_$[8PFM(4<BT`Q at lrn[,Y3hQdokM&^?3Xt>V)q8p"cqiKgKW3L:#>`.Yi[_1
+%@V_=6*$&j*_4;Q4nBZ!k>60YTSFY#*FWf(lJ&h;"hs#J8NEk6DM/[\!Offpl5EaJsOk)$<Im=soT!GZM0?`>1!\.N'>[4LcV!;^F
+%Tb@),67&Ij,XE`CODUID-d at fsqrTs*_7qY]c=oh\:$s</37YugL_%q92oe5LCO?'*W7Ls/CYj=0##C,(&k=J:f8W3,JZ(hq/KcR1
+%iaEWt+APNV8]_F:f'1/#^M!,QZL_RBG:jk:%W'X"pq1S:WB?Sdg+L4,_/TZ&ic)]PaLtq3fA4MT2e0f).2:032R5A>8Lf#".=HP0
+%l`"Ol:`<B(>M^j-S]8K>rH_$*Y6S,&n!gZ+e08E=T7q^EGA^qn(DG>uHDEm'afUBA;*Lk#$nYXIjNWTihNe`&Qsq^?TpD$cDi\`_
+%pmfJUO0$cokJ4;_G'Mnsm\GJS5%Pr,%9EuBdZOSXP!HM[#]_3J9+r8N/ZJ*B?Q6Lj:=nqs2]cJ\UVW3\?j^02e,#Y+=:!7hr(ggh
+%>U?`2'\k_sM)%;MOE8;m"m_S3A`N4eDR`IGU:QO-6S8WcG^_l"rd`+Vs$r[VLXVaMr<@EKf at p>`(luAZ)u#h.(F^BU!"E5WJf8Z*
+%adaX8*LWD!]t$@e%a;1#D?)/C(<E.0PQ[)J]7C`bL&h[7>R]_0WW?XP;p[`CU8CDHXehiM`-u$bT;b0&8[je/hA!QtBahQI at mAd_
+%M/!?/^J/<#\X0Z#;8X&Zn2)SS'#,[.S?Kn&$ZXL-6,&J8[fADe0&k*=@WWtfZ"(:Hi3Q:*k$DQG-Ejbl?0l]<#Z'$r&(H+/a>G&G
+%V2B5=o/J5'OaO*kmfWHj,]T!#4:RZ%YI(]p77m("kfL<[YU."%MqkZ\Ce&N(.,%l#gWAg+-p$8?Oh6*g2l(n"N[dhbS:sGR47BeD
+%T1kpB6>c:d`aLQNE#OT,!1B0D7Y:V*XhGd!$<ed.\\AH=6+qAK3-Wf`1;ZcicsZcM at lrV?ZgqZEX/OqCSTd5J&\OLGZrtVD/r(\9
+%RfR6ki(^I5Q]W9*'IjKh.(h&=gH`LA-8Hu'%V.?73,e47'@B&gCm<m'VO[Rd\rd:YgHNT[;QUH]cp=aB-#fCP5oYsJD,0T,pUj<p
+%IsFnj[$..?#cL'pG,KO2j_U#ZXVrr:kFZJ+L:7o1T<CT_MN0rR].;bMeLu?2h1B+2(31d0VV2LcI(P5;mZdtC*"VH[#oY>2p3B==
+%$e&K%NRufANsRHtTk-OP%:Z5FR>5OgJ'DJoU:'n*r4bIU\+QN<Q4.5$ME:>L&:&._<]M'LB;^r+5]r+_KkZMkH_qYV[&kAf-AT.%
+%rMfc.F/!eB$88[.JnPdA:9*;8Q"En+&Ra^mQMYHfq_<D)i&st00.c$sc%S7b8%h%8,h]h-U-f%CJF?_u1j9kbj(7h4BWM"lp\.up
+%PI.MF#i:kh[_;r=jCP0pUltHinc#o/l.OPWX/&j=Wp(b6<LSejab"d?]_fc5^J'+e%86$,fJ;jDAF02!P7MPXId$a!>rg89+:.fE
+%&\YgZqIIQ+;Vq at F<;Tm!4NW5$S10>Jl1.Jf5F^Otqc:I>R8W:q_%?!?Xgr8I*4Ns8<Vbi")`f\a2MO.ES[6ZC9;=gC]66u;[aKQJ
+%(T%\e`p[TU[0Q+>\p^OplLY(ts/M:jqpf5 at bLD;p7oHtmC&MgP=2LThBr^9bOWLl4aB)5/VCAolZ.iFiPSj%\rks/^0=(ttVF(YW
+%!jbB:V$$Kn_!`ge`^Md0$(1?><_$m-)iq(;P*`7s>WoR72pWl67i6o7[MI(VFSt4&f'#S+"pgr*Eh8"CdG0Ug=IT]&r&>r3etZCc
+%a$c,^H2OA\INh]gHr`AkAm%qW)OJs1NE%O0-c"lJO<AO[Dd1uimIH`4XP="h?$=c`Q(VfC(J1ClY@&cr`5<'K\+O8M>3^Dgq>Z0Q
+%_:3]iAESSadZY_?XG_cJ#D`:Pm</8/bY,0=K6ia\cI>k*7jWZgk9DFE"DHs;`OC(p^)d^Z/O-4Xdd#@fc^Y0sUgk at 24!:Qa]-ZXo
+%?DG_S?s*1QCc!::9V at K?V-n$NSe'_ at S>=m`!?IO\H(1[K:fXO\Kfs8;M-fnj/]E+X7hr,E*$A1I@$B)c`loXVePa`WVX_(5n\;Mr
+%g.nA at e'GPVO<h^5XP"/$&i/pt4^)[#0e8k<jM<`#7E;B<22qG/nY>eRAMH1kLNG<i#c=IF9:CH,!=aKo0V%$.2d9[:@2$>(dt?XQ
+%ZI!JUE0,=-+g$2 at g',g`p/T6crEp&#:dohjl"6S2"(]Q\,rheZY1N-UDUZ3aJUs>d]=f['!gVJZ;'sHkj5\SP+sp4kfT(W_-Q)dO
+%5]XD\N"\PS:/:3RD,R[o\R@>%h8H/mM-9*1FF"bpp`.-b58uLO*c8W>E-hXDiB1n=LVE^(WaI0P9:(od1CDg\%sdZY).1%l>Tqoh
+%hR4kqDtB'E<p`94_o`%d04c"lKcj"GmRfXs4QAounO-+c!YS'?6T48`\L8!40Kq!t(HYXN]==^u2o[i&@6t0pNskV'M!)KmWFQIt
+%K-P)_'m(fcHsXQ"S4$"%:]@(+bbral;nq[Cfi(S',TiiADam]W9 at t9*ISU]kr0++ggK,rA?Fcaf>mm'T0c*cT62lIK?2g2a<FU>5
+%+hYIFUpS;RnQg9!O!<*b'"Cth(F-1*gUqoX$M">, at I&dq%hXc"<,e[)c,[+l5phej:0oc�n]&d^9IJa7nC6)MO/`D&TlJ^"Jpp
+%7"oW^WPOBhR[oXP+J4'7T-_jTS)A$S4J1^&;mWqT6n%WS=:YX at dr!2'$3YWq=\dkGDQfYL:18BYTgA>DQu\giB`"Uni]M=g@!K,t
+%BU'%T8PYRdjh0 at RqXp==nH3TjcZ=N84`l$b"06AL7.-;Z'fE8(m32kB9_l(tBD&N&:LSmHkJk<tqrJIEZFQ>c/EV%r<Wi".^Rg?g
+%%f4pr#aU83M;e+A\a++ at 2X]hURs<,32T>]?.nkQ_*uO#K?WNnel5MR]*+'(Mc6JaSZ;=%NZm[kTOGh90Gn3sH$.bEi;T]bO-6G^@
+%<1bR03e6^>Vp:2[>`O_f)e"p,$I#Q](iFl0FoMAjKl_49]ZP*1d]GO%T.mhs"Gq%sKWKN#qM5Na3m at f9YfoH:K$V9A9US'"/X)(u
+%G8&Y%roj_8Q>*;Xj at PjY6$ZZq-aFa;ZM1)iG[gVUS52+;\9dBKU_%*nZ#nPR>Cc(8Q[@B at eW_YFp,9n/@*;0^$V>_KksMX9TkO"h
+%4?jlBj=-/@'S<hdqco-8WNr<(n$m?RfAKR<m.e9T<#PSqK4sW1I5\h(QIXi\r5Gq43:GW)^p4J_KhDhZ!Xf(E!r<Q3;ga$*CtZ8_
+%q=<I$oqP.-Y`YQJcEtD9(J32Jn/>+Xf'/]>4]A$!.@;)=M_-@\B"%s]EStlW;DY+plNpSH+uNqNQSqdjA:g+VCe>]of*7`-%l/#f
+%NG5g.p2SEiD7,D$DRHYEb;nF3<X][oU/MNU(JNI at g/k.Hd1SRlqYI at 1cGA[^/k#UYB'"<&]UYAU5/cqC at Sf(N-$f(Z2fVWUs(>B^
+%niqE7.9lq";Yqbi[`JMV7aT>CZmOO)D2PTCjd1p*;\''7F0Ls;a5GR0M<\?65[g]?LmV8imT[D=:@7aa*@-j0`8+,$EefJN:/dNS
+%=)Mtdq<a12nDo#O'O6Cg61?sc\g0ncMU%J4&W_n)<*\#18Fe?V?L0\NEK3:5]*hCDctU%,,'WED],Ws(1Bd!.g`U=W8WZ!s5nl%]
+%f3l+\4,AOM>]=k8hL9`s9=+*%@B[SH_;GRrPn0C_=oEZ("I.et1\@g!2-,*F@<ec2BqXtC9M;$nqIaH at ceR0U<rVLP:AVIuYXV$X
+%;<$'Zn_rn>YO-7,,&r0,fZH^.Yu62uTCQBS,WQe[>h,"g$+O)7A0dTdTSQ.8EM1US:,j]WjTb+JacLN,=p0_fl?u?i$o2th:Q-,/
+%FSPs0<,n3Mk@>bGhWnN-8'ZHQ*LEgpQ_3FT!4qJ*ga\Eq#cCJ*\3`Ju['o/K[%1D6`o[*2#bB/%TW?31#]@=M.DXtLpY5hZrQ`Hk
+%T)6d at 5NcZO*/')dV)`#J%tO"j_YT`!Q2E'pk12:`+5H5M(cS1*Qc5c5Kgp9YQt%o*@dc>q[4tk[E\8"AV at 242I;D]&iDL:6hWD,-
+%LI0GQTGb!"e%R`Jd)gIR%k4bX!5Id!n]Y_/8mitle"K0$i]8Kor/uA)q'D0M?HA79^(b&::8sHhR"mBOJ/N+o2CKegWo3'jX at nui
+%>e"H&h9-:<NPN#O^:\jJRm1q"OC5[I)a,X>s4R<TWS;,u'UoPUe&^(i8NJ%uCqG?9Pof=qhL(.6:Q*E%g5njFQh7!GYfR\4FN_mT
+%ah3JWq2"<nkJ9%!V6hkGa-$OF:`J at q(S%j?g\bqF&.1Q$%-rA?'IIX1X[aHU&A%JNQl?5EK:)X,Va$;i%`oJjR8@<!4#=K2"bMNU
+%^snqWFj at PJdF4Zf;j89lMaVc5DHVguKmQVST:PacYaQ at a82G76k8$?W.V[TsU-8FcGp`B6DkHEbP.u2R:W_X(RPUG_GCAk'jr"-p
+%#k$i=XR*cL0JmY3!;%?qVH*2g1\E#\X6'N>%.PDPQ5#p2fG!)oQBG+RgG0.']WD0QXqH:fBN at -AU[<=b03^4=NZjV_D^8fqB_K6`
+%grW9e(drOH/XY?TocR[^cWSuB[5 at s*W;ZPC0;4/tlH=Wd[Cnr-L4m7:_/V:P_a^7X8;jEkEddEp(K<I\3UFjR_2ae<2Fk0HJn>"=
+%^Q^cN)0L3_8$cZb+XpBRF9Z4a,s"I+1=brg.jZIUUgt9gBs``JKj97ebu58IO!Wo6$Q-O%gQ'Mm,I9WiI?9Yn$A#j.9hqD.EgXWV
+%@knV/OI)J2PLT7EYo5F!?oUhp![8r$groSN%D at E6q.P/$Qmi=Rf^6=se=7Nh.gp)?d at 3r\7F[<b<^PC1kk-6J+2RC6VbdiT?<!OT
+%Dn)=H0fT[b*(!32cl39:lsqaYr=W3K$5l=qM'M?h;c'@N)k1NUe""\S8e%>Egc;>%*s(Nmes8AcDGsNg9bbZ=[&or6JbYYUD8-=$
+%)B3UG1Fs.A8gYspYQGiC>sG5UX65jR-Vq#]$FcSn4CA7@"@]B%7rC8\8P2[5\p7'JpG49GHcHc:<bj>*5rKO/37rdgN/cj#KP?)d
+%ZWN3SFMO29ajQU[@8c`WiK?-:R5e$G-!40M_1hMYEXdJN*LCL+`/'b'8nnq^*0;q6 at H5CtjLI9nSQD)9p+sd0p1m<SCH8W*T1q<s
+%@5Ki,eMlX/f90m at 1$24.Oq$e81dtZt6>jh0$ZYHEXOFYROXem0:4u-3J(ZA"7chaRCbjUSD,@[4&kW"6ogf&]$WQp?n=C<mTL\0l
+%9,e7UbpH_"cG+d_lcq)e64u8Ek;=Q=NB2nT=Q)%V//MUIJ;XQ1Uop:nAm7DiW&$6Mm\\p*5=o;#&f'$PPBD*M"-+B+4QTW$FhE"]
+%(hso\Ku*S.nu]gO#_"e"Kelh[e1\o>h(/aV.5P.7R<1+*,_=`"1%UI*$stS2Z9WKSk2;u*X.T58j[BMq2.=VG=ZR:`S53oN]G9_W
+%#!$&q!Ma!NbOOX&oqk\D]%;.GlCn]=;mX,s8._;Za^DZX,c/X<DKfa8'lGo>MuduZlIMud*&5N&#D6c_ at +V)g:JC,)oI:4O"lalG
+%R9K#\VOce/l6S=9II\Nc"1[83CO at a=:h&@0C)Z*LfT9p54[2#fa$nQ(:F-hSAdEKSQ)*6n:bf13abS:_>6oP:"q`LF_Q?)*SDst,
+%bCoFOC9^?CJQkBh<qZVEb)JD>PCh]ti\7RLFj,I`"VPsY/41*Y,g_#-$,jjJM:[]UkQ'f.Bs-V5IDqqpKhrZ!rG]mOb-fGH6IZZ8
+%k!&.aEI4qJ`b(B.cD\*P#1ljKe3%"`/;&3H+Y)lFcj<!R0-m(US.,RZCF\#XH<Euk at F9/VB%onCh"_QZD9o0bXD@)K#n:]28"TGu
+%8'lr"1*MGN3XT7ogcCM\Z;!"?6gIIA/2mu)k'tnY#GJ at IWjCl5'l3;*iW09Iann^@@.'_rl(#l8+$RH8cb=<Q8La!/n!g"cCKAaf
+%(%&B$;G%0g%C3b(ZHiM_1Bk at ceC*VKTd'fnd]_un23N6QXa_*tDaHV:K?mV^E32\Fl/=V"5<>q#^NW+g6cYiBbU0WFgRsmsQaUe2
+%jYTmQU^+oJrH4U,)qdjYkC+%S1raeT-g]oI'96NcW9=1RFBVTshL$JkpXpt(,Yb%Gn5%1eGui\)#P6s,U*EpP=iFoDU[l[mRI"uM
+%d$D8!-Xl.EX:oiuYkVWR5DZA+rNp!PqagoFC'p:C6kE%;Z)>"6_e>BD!lG[7nppJ*;kb"g^fBMB\Q9)f5sFIGU#7o5$,/ClI;Nk,
+%C;B@/><6J'D3$g(3lbIVT,,S1X',kO-2H5G!%1Uc\d?s`Ar4=aJ[mHsN0gW`S:;%LbNLj at lkD"M\NZ'gHeiuj$(DbOdUt&<,lST)
+%mK?;M8O6KF*u4`=Z)s'sg-Fi<:3GKWkc9=6DA!;589:&Q at rF^(S!8/B0TC(a-$$?RP8(rI0F$*K(gO!QL]K.\mj.>c+]tm40 at Ysd
+%P8Jr7k<S+^DXBKA8rkD6]$BE.<;'OF1!+uV%YFA"EK,"S&m.%aTmUpB>^'`s=l.YKMf/0 at P.jhOU'd;BTp(ucSbU$1r$-TY&<beY
+%-!Y8L?N)fskUVVQ2?j/FlRc$^S!IB`h_DOb2Te#f0sCMKU`K"FK2jt/oVpNLq)iq\q,Y<6BRT\4KYE]T-J@:Wl.4Em]8/Z`KHRRl
+%3d[j)=.a19&qu0l2=(<%K4BKVJlpm<jNTCU9\^@PF5 at dkIYFqRMHH*d^?*HZU\]u$n@<u[#+;!\-e62]-dr'qUa5l>qdQ<)FkbBl
+%6X4e]NJFG,VeGbbjAi at 5Q-"V*\C5NTF759Z.`0k^kIeIN2dKXNkn<\'qbBVbQFq-7G;([)p&.bUs(j"rK.cbNC?:=6?JQ@#[)2Z'
+%8(KlP,-#V9$qS[uVj*kOP#$%Xkm`g`P9%kqo4UoFoA5jWNc>0$3C7s8%l'iF5G!A>fLX1'HP?!r73qR1lK?Y[XAp.+V&EcUCN8ZS
+%&&Yl^=r=VGFlnbG8E>mq4ROa1XZB*HFTHDmMbfnDDGriXW at K/XC:rXIg_l8ZDaM`0h\qreBU[/hB`Q4gHSlkdhkE3)UNt^IV(M-i
+%j]N*b,r2#fP':o%`W=st#4632%-\b"Qn-s_O5`@#)SS at 6j.(g at 5f*]n4B1qU.BKiP=mT8OX`qW/lb(FP+f`E]=:q$S at MguLMomOn
+%HEP;O!/<FOV;C'>`g,TMT#tfA4-D6b^LAKMqrOqD^R[`B>*/pGd^upV4Lk;,4jLNuU*4LP'Pa//@il[+*+eeX_-FQM%I,+LI>YK\
+%BNDE>%O0;QQ(De9fm4d-^Xl0r.WB:e#., at N>n]S(n^42jr]I*"iRa,;j@\$:9qjN'UM*9BEZZ!%ScjX<J&9p.YEOXocnlBX?aR06
+%ZJeC"Uq?a.kPd2^@Uo#^fun6GIo\JNCYWY0qm-@>PER at _5YfqMRt\A70n[TB0:Z+Wn1/pL1bMaeH4p\ajqMd/jaHE\2&-!WPV'F^
+%Ekc[qDApHj`?g"NUn1 at W3NLJ]EM(aCqCP4,Nlc\saH2d<P.2RQ,n!eo4JI at mKHtlQ8/XrdFNX_o]1p-Fd073?Y_!/- at 7/1D=TDAc
+%3CB8sm2kT>W4Z7BBXh at Boq]MXk`r[s+/>eFf&\fPR6As3FcZmhC34h)os(nV+iO2)0^&(r++*4hm8+;FZs-JKk4$)uD>R;@b@=(>
+%jcE'Im[INp8b3$c4#\g"BNk&qn,!Y.&hoB)/2BAWI.$p9.:F^*1GFN0):9!K:>nt_doo^RA?+deSXae):aDU;"$3Sl&qY"^VaMip
+%[<V==)FrXehDFOMqU['UO6;YR+HMR;*;k2W(cbS$<KZZ`T+)k_*>H-:QuhHLZD#RA%.l_QTHcc)))a:A4+Sp6F4_gJ9=GnDA*U<]
+%hj\kB$Ljdd9uss4`%Y%r7W at 5]<$^?MDTY0tjd3b at q#mci&li9dG8cp0pFg[6EHs0/T&oDuhXM:Q_O->aiOY&CH^jZ(VFqN5T]Fut
+%:L]qkl"&QR^Lq=\ojM*3>"a%Ak:p8^/@s4qb7f6[NCCh&;#?qtHqa,)Mr]$55.Ls`-d-Ch0a:^PC#EX^I^RX'Erat/deKRmQFp0R
+%+kLilq^9AR2NlVfbe$/1.=DP]]u]Un8#VXNaJI3i$sMIe;H"ZNr at LUHGIoo,n%)13?ok7!;.qP%LRKj7&,Jbb%I^&FJB<u$GC?gh
+%>c2tp1+;T;<uXq1dPj%Zi;f%2D'\TaIurHLd?L>M:'G90-Vt\Oe+?b"9n&^<;0aZLiB1Kj"l%///4F[MG91N`@m](:MC'e%.[-5_
+%NQr=J`_[mcK3Jq$__2<Hs%;?Vaf(tFUf at .)D$Ue6->WW>_DDDZ"lSFUG%ODMF+N#pVS:1:rAJ*J2T:#a)K#e#DmXb at L.$o,N0!og
+%AZIBnJHa_alB6JkmW5D`?^roXpAi3k^l,V66ujhB]-gR4DNoXp_:-JIV!M`-NWp>NE:3fZ8>cinBM,nu/F1f*c#"G8_,OAa]DB79
+%Z;2R;HR'SYp11>s'BsWP8rC6-/q`;GSrX3#kPWS60dV$,m"j%UZ92iqE',O/I=i`2Zl:p#C1T5n!5["F?5&LYb0\Ds]r-N]an!Ru
+%AU^#gQ[M!4CK/LEjdaeP2Xp4X96^oQo!+"CCmMd`L$8q\0+q-TPV[r&R"Jc1J*)I;KuntIF$Q6$`@EPXrqUS6mNg%Vpe^+\1/.TH
+%s,!>KWs at +Z]N=ZIV,IAib>%uDp.=tg0R\f6=^-59nosp7"W^n9q$^>m6(I*6I.tXR9>0O at iLl;gLA2F1pIUXkl.YalFo'acEqZ1A
+%&QCb>XuK.O#k#J^.p9fGo/IM7IjsJmM9tj*!21GjGJ"(-8r2FX7=B(0p05[NjXhkQS2 at E76!,;nq6t<fAO2r1kQ@[85r;3uK4'j<
+%`(Xl&ghu_!'F"b0YOZCZm>P3a,/4+-l>!%hS"/?2Zsk(]:[/=+.WK''[:-aeCHc=mcF0mplAd"&rj1!"6:!i_pR,(Co?nQ#Xi_#W
+%E&.#RqT7WZ#]^Pa$F7V-!/M at C0U[eUg1g"cV/!du;,k[]581pnC+fQWWie-b5KE.NG.is$iCALRA+d5/W>W*30k"s]0$GR$`L3sM
+%NKY/u at B%E<G$4tfg?km5qaN\[fO"RrUP6m#@GYY$#sG0H"_,ZQ-$&.=9]&;`I,imFdcF01]W`h8$-KdfLXT>u!+8G]M1sKOCqb:'
+%BYJ]Ke4'Z4]=ZV]<5g0*N<XX1;(#kE(k$ijQ0Y#t`1B;:2n/_a;0sX7:7$#FbECNIi.Xk`o^g(7k@%j!dcM9;r5i at f9YbZlm<<M?
+%3Gg!V_cc$6.I8,HoU[08(+8*kYB^BacCg4<:9:8.^NnLq*thme?@R6um99&LDj<f=HiOH`dX^*U8$hs>(PCAWnSrlsOX"(pgQ?`"
+%XA]8pqQkk5i2$p\F7:GRFl"%ljt:giM:B7g^,aJC,s8pG-X9n8F!g`njl-2>8Y at j_S,+$=OM2[9C<[>69"eG`Z0"dm1LIPtF3qG[
+%iO at 6]li'F]HCi-cDT26_\(#saO?/T:;l;4e at AT&:9tDrZcr65YaWaf[N#]E?I,pVG"1/QGNGk;,dT]PSrkP4Db4FGn4#`d7r8Rd_
+%j;*nM3d;i,%e7V]^P&SsP_kZpd$)E(VnLO!>U?@'GD1j]:?XdSnR1QN;7.ZX)C"+_]Bd!8;i4QE_)J8,2Kt"7>\0*`[01-p4Y:V5
+%%@q4K44fheHfs22XH#Kcn!fU->hkO<R;W8NX`W@%);6h?'0Hce,>pjkCoZ[)!ucu]L+,UZIJmd2Q\sc_M%/TYkNM"E#*^4EST+Ue
+%,.=\=?$:POWNfW2a at Dhd*sU,XQD1[_*6^R97TERWcO+,jf&VnLWrh8)-!Bdg:o0/.F!*-=9o.$j72-ue2eh.^GT[,XYY)!6R;73T
+%RNpu;'+b,Bg[)Nfdb+;&RHN>l-15P8/-F9&;.BB=RX#opj\fk$3Uk/4-NnfE=.7P*eP9"[@D4raD9d(qjW=,:=?f2bPs349`KJhr
+%BPq8SfO6UpT<"NQH5RFe3Mh:tnfdP%:;`H_)L26+3 at FZJAk][Jn]@bRgZ:cUkj>B0p=)>BQ%VVYUPl#;bP7Wb]kMlP.#Vo;_HT,;
+%4GbLH8W/<%QBES=W*gsei89Gk=o14'b#[ZLhq1lrb^6Tg[\o+`eCg,Re+3KE1gBm7jIGDE+&i'dH,huY/Jlk^,uu4;l9Oi69,bl^
+%Ee!7ge:`sKT!l[<+)(W>Rcp\@W=(#q[rXc`cXZO3kW/8sH09^+R(B0uk'7QK>hEF#ARR;(c?l8N5R;N at LpbQ)43KDV95"Fi#c()W
+%\DC/n2E>Ys;D0mrh?j=\h@&7HW#l2i=sd2hkC*Lf3B+^:=6#g8ZS,]ZJ1sE]/>4U:n?TlXNsYLD&5NP8M\^0;/@6,^^%[(dAk"s!
+%U<`43&oi[TG"m=PJD^ZlGF_*o!:X7M4RI[skM\mob[N$eUa="GK at A8Z<[HOZaqM!ICl;GjZX;"ifKN^(H"&:A9R`r7q)K-r'N)Os
+%j=f#7oZ;4X.&E)D^[X2QZ%'-:Eq1db4;]. at n#8R)T[4\5e:!tuPQZ4fF./*ZbJSWKkrQUuYr_g1&`b0P"X*KT-;=k$FgEBPa$ZMS
+%p(7g!, at ZPTq-J#eA)<0\c3qun8[Yr0Z#/&nft^bQP\9SDC#.<*;(5icU<!ck-ZY_plY`\DR:u=hLnSdNS<HiKDp>HNC`aokV[+Mn
+%=Y-p]rGS'3 at 6<!Pm]'!\o>hkYTGesB\&V\Shdd#i5omqgg0_=Si!g61\b/&_&Jet(`X&fFeer:\+)&pEdu&97o9=Y=+ZJhFP&\XH
+%"e4H10A6%J17Bt)2a&fJ#:W6$9&$,_r<:%aD:!YY&,VhgYHfm`b*U4S4;D?6N?-J"WTI^_`=sX)/FWG9^P/P"_Is:LS.&@]Hbu#B
+%[:cVUD[&PSR&[+)P,4h(Id4(3j.+ at +]r[a,K'3b:J-L#W#\.mWf_n"/k&&@]V5C#>>ImN01K^t$>s,3De^E\>d1D5el^fZmPRR;s
+%&0/!=E\c4Y`_7=17^B3YA[L$Q$t$J:`d[JFWFbX)fq'L8f]Pe7b>m6/h,<Mk[sK\'F#.11oq.u<YpQV"H*(7>#C!gQD0V>s.mr>"
+%-;sQU,Z?%0H6Ll31/B#HQ0>F9*c-*XhDmSdC^D<mB\8>\AO?#m,,@?3fr33D$#gk_cSK^mYd0`2F^^qP,fV#[2>LJmIYkri/T!sM
+%mBV>]Xn1f2G'<3gMn1;LjD3$u-/;!XI1(QR'.R!D<J`NHh<t9.m(iobi4i1O3_Tm4rc`[_rNqQN!bAAK\d)*#K^8R2_`kkAF1r2O
+%4Apc$+-3<&.FhUb]4F&>[@Ag?QY6aPf`1 at 0k;l=+^,&30_.NZ]a67!d[O]4.46-Vc[-PXCKUT()VqlbXg*[Hj at mVt%Otp$(n+GJ`
+%-oiTW`0p>SY$<o/)Tc'G=^iRC6Kg)51'm#+'7[d]5=5[6U#B;'")I)4f::l:,>4=bE\)*\SUcr^5m190bMMo7Spbnq4]oUfO']P2
+%M>IT<Fcp%.!i]=g7>]Pe.k?gW2=PV;9@;Kf:Gs3m2fWK+[`BmmSbiWA-gtaa)C$@CYe8,HGMrTEC(MkaA`)N:@EM:KYXqY:''6[b
+%hR:\[k@,YtkC>/3L$7;iRKb50.*a at mCe\-0aGV/EnQ;Xp0Y\J?g$@%YAS=g?i&Xk1%:[=2B2D%["#ldhFQX*r"*76%aHN47]?sm#
+%<Tur!Aga[#d6fsXDNf\_NGYA^-1[FB#.l"=_>>"T<b=uP?lJAo#o0uT>e+ng&u)O.lBjHl<%Fc2G1_s;B>mu`kp"8j9e8M-Jji1O
+%BDR^&-`A?,';;j\RD9-,&Yi(VIPRV0-]F=/YD]T3Z,P((GC6J/KC4m'G0u%&3X,F1FfitXG',j]GM32!Ni8ZC at X2)r-%_q9Z-3g$
+%^oNl;jk&kC;+MVT8#K$LheD!q^[9ir0Rp`U75sn3'jA`eFH<#0*sbIqrBdg4:C8/W'`W?>oAb=dV3^-L@,0*Io+pc,WipL^0`dXe
+%V4"IJE%:EilLD;t_(`:*D*</`:Do5%,3AKs*o=CG]H!O#8N<W=0Geb]*S3C*;35Jeq?,+UV<(D at 9W!]5k at lG2k`O4'%p>M`_<6)o
+%`]W81d_sF<SBK)CcPL4T*I*ps^E,Do7ZY"gW'([6H-8hj-.-_iD71eNmc=\AV at KbqO_t)_M/]b,++&)-#qtYcT-/B]5V>j(F\NY/
+%Dn=DsUk>]TV>3A"*h_)mr-#`7KrOs#'rKo`b8d1p8oI5Q9j3!IBUBb#<%].V;#)(6l>_$7A:^aQcIHlFPDcQ!]mggS8X(0jdT7Y\
+%XU[+lHoq3m)r58f_(pGTZs=1.'8uFk;u*N]J1 at DH*'FIg<=,?\f8TVM9qWapK(iLpY#3ai.phBicg+.o[_;ckH'63kco\A`3OsX[
+%8k+q.NU,'r,S"Ue2f"O53$AI1RJ4><KF<S=-ZeKGD%_AcZq;7;.Qr<I`0J(&IF62%`\&F45WA8F5!;GqhKQql>&3C.p7T!4+$jL1
+%,#r#K<8L[&ek-I\mQ&+Z);efH;PJ$1p-t3W&m-MO-'`*5(]eoo!Y(u6)@[+WT1"mJ/c7O06%Gst^g&)[kG]4!Tl\A>&d4ubR?KP2
+%9f;idRU4RLa13U\P(2.kUl9dKl)Aq_9A`B>AQQ52j8.C];m_"pOlXO76(Sbk>##&uE+".GaWpVe7X!!'f%4HL/+N(sN0u%^BE!7^
+%^+MImPP]!0L%*icn&t4jig009SJpDSVN8k<LuEa5:+.++qHPHrMV,G0ZLnXY6"mFu`[E@*,mD+X+iBb+f\QF'VFtVqC0 at GjhoX%g
+%T#Os0H]!1<EW$XUe.S-CK/epd(9GEhQi!_W,3ICO:7LYoYaX&YKG?n:PaTbC7%HXBK&5\@VD7s%FrMr9akY#QcN\+<D]06_^%d%`
+%q$lWP6!-Qk#GZkS%RHM$hl-sY[$@Yl>p^%*m$L^OgiXS37,-ks:'#ZfTllop!f7b>&*,82,9E"7#nU1`Fk>!tm2Ea..Qo`_L?#9c
+%)`EDj]_fMlaNqnn"!@jBfA$n+s3Y^?hKuce'GISPT/B]_Ooj*@H2X/+Z8p!AXQHk8FI_"\NtB:Rl%0.SEa4.`$FB4ZZX.*^FLBL9
+%3-HgJ^O_.qfVMqqLu2s:kTLN9fL]25WZt-F\J>Ks9VSh@>cdE0$?!u at GnG89`dh`iFTd/7,H=&&-<q';$=0jTj^?Vp4!nCei%\pp
+%Te1Cq?@FRqZ$VK$bl1.r3N9t]_7/<k)iqEk)jr`[]1+bKRC`AE/mkJ`,BIGE++9Mt(W+pMg&C86 at ed_F>%*;\J0LgO'j+4QA?-?]
+%FkUP=-,g01SWa#MgYVPr0A]8>L\6gH;j;<&^Z&h`0t3!lTX5sSTOW'F&6'jTaOb:$"*G!b\]ZQHHIE at .(P6Kq"oGT=WBJ_jn"/#<
+%!]lj;Rf.=KS:d?R/*7*5I$dE:hYq+)ni$,#&epJ3.N+42NS>'^q(e4-EbNcTS@]*De,d+SG)fCLPljcNn/I<=Eg*IY?+-TgklN)g
+%gtX0t*Ad6G$_015JC9+E7HR3i,&>443C3MM)J5;)3o_C at V9J(=PhL2fk`n8Z3Y:F0>72X]HDRZtkr3eRE-QPS".b)1^ir/4b6#Z]
+%"D6`VQ/@tbq]Ls%P$-73hA`#cr2S#!^m,V$dQ=^qk^fT at ZZ3Bfc91[LWX^o$q:i-tD&mo),fhspdT0,>5lUt:HR#BKKA:Y"K>V'-
+%W(-hDX)Q]5"bo9e:r:LIHD#s*Mk&AZWR4YWS_I.CD(Q`4&mU?Ks.&3O0f0t at kc+0F:R*[]J$ec5`-`*p4B5V36%s8^IQ at Rh1S-(]
+%@U/2U!+_Ka'E@'<H;Z1f"JKF$C=)ceX/d0q-Eru*W.Qh&f)%P at 7XN)Z-d:5?T>lUKFnR*,GHc>u(c$%XLhKpC2<7fBljJB!V"C>U
+%C<bDn/s/=YI._m;S)+8Eq?>XCl7<`e!dis3<[U[Had-&!U>3<m>nP_@'T!TEI_"sS4n$^-h9TX*76P5o#KE=5M'=7=J1:Q]($^rs
+%KUZ%>^9T:C]`hm_k)dR80^"E?T)cu47b;E/JueiaT:5:RMFKp)RsB@`9TJ[kX=T4Je=m/o/R'TIl=\u]PWnc6RF3E4Qn at Xh0N&jh
+%eW3&$pAiFY7]t4251O/#`fk0*Zi[\"^00Dc*_F=kpt0g&hf#Z?C&Ddu1K[l++_4%<QGOdP]7t"&\bF at t""T&]5(34=1AV<n\.k6O
+%s,m\t\c$j6#p*[e)d6qe3Bo2s\R=VSe]>IN6nCQEXj&Gp&)@K_nGjU2O$p`!>Ej[cN?V at 4;8*qRB\qru6)U=kk`Rp"2n[l)D!4-^
+%in8;/^.1&u:G)'t7;2RTXjmO.0Xt,$1F*Ybb6blaZPGB;:&?K@!]T*Y-IZ!gnW#3rE%23Lm!1GOY:5d,b.:A!Ph`,(,T\sB[O+?t
+%fd-##fCajA?OL9!b.=JC"BkZjcZ%;r$7:qdZda/N`nYl9#K_Kj3cP!F+V#.LkACtg.BqEn4.)5*rEtuM2/XS;(0l+HT;VPNHgp"]
+%lbfj_VenXUK+_"A.TbSn>8a1%qpHSL+3@>h707$&`j5*',P+k9kA(WMCudL+ at M6_EiO"d4V'ikqe!"?=4^kCFQ;2"m*UGsK+Hn7Y
+%B/,C%1XbkK:.XZ=Rr9[,"[gTdnXA0[DFI9>P/GJlE`"Mo<DQA]D*3F9odQ(@+*b[`+Mcref8g*0V=bkM2j^f#m5O,Qn^DQb2hSVo
+%+/`OF')qEVU[-`6X/F["f^?-eJTI=S7MHb=0 at 2/GX*1=9?&7M\W=;cYUd.]^p!'biPp7<.S9LA_;0-A&"oQsljaklIc=]c0J*OCP
+%R[UEklFg>[HL:.^puHg*"l>'>m3Y_aOVRg\7k$%:0,'.g9)=11l."O_e\<#GGrIW#89o499AV%1ep!>*4<:5/"4p0HnhcT\'nu9b
+%)9fF\c&%2\@Dn\g.kruteBfb]lI7 at e'CjESS#ST+"taq.A>88)@?ntU\Of!Z\ZTR"'CrDpS?ug-gpMl'5kH68;,H+Wlb'6*nuQnD
+%Bc4"__oFY=65&C<(&X>@8n(]tJS\_sIiZ!mP^HCS!V>@LWGD at Rk66;"mssM?Ne<qT^BNJaKqJ^8ZA!R6n-nX,e/=c)YnTA/UU+5&
+%VI"Pncb$"::BcQ/f(r%@dqWXuiaN4Kp/#8U5\)UiR4cGBjh.4&9k0:799^t!5GqaPmgSG_YWTgd<'j<>5n59HZs\;E8YoXaQg;$>
+%[LIWIBjAQu;9S4#C!CqU^_P$96(?SF_!R`j0l;_F60'r0+P^(ADrj/3g>T<')4CTPra<lIBOZR2Ys*\IaqWn\pAf_oVX[DYK[ft9
+%Mj;cP$"_P!(&:f\j[^@0U6^:(;hu5an=$I#*8q%;1UU\;3!&D'1=o,8OHk2f-26%L8sfu-4g:Fh[I+RmD3pPXRHlRD#'PHL7 at LdW
+%P,p?;'eN**K+]t/&D at 4uI]6g/`/X[);F:7m^5CF((n\b<kg^B%Io_+n?!:\Z;$"U;Y)PjGo at nH.3c?2L<QAbJka%d=+I;p5[R'KX
+%m\5\TcZAO'R:_l9VgZh)bJ2KM)%"$C56esiSY[g<`LMJ-i93`TKa:afL]"p\8;aD<D>`R at 45qb.&9;Kq-\\j%NnLaReo1BK6/9XB
+%/IVh0[pNGp*f0%dc+^pSC?;ep/'jhRqu[od]Fe2u'7[3=&Ru<P at p:%5MOIC-P/5.e1[&j0)g,[Jh).H`Z/(^bQWptmqWH_u2Y*K]
+%%h=i2BX`!kIS!qFFKs4U`NTt=<om[\)d7/ab%arPH<1!^@Gn/60_3sgC,frn. at S>NSm.*$APM]kZ$pGIIR_YckEiO$XOD1KGEWE&
+%6aG$%'R+*5h&fAQe(2seJbDe,adL9n9\NPNRB2L%-:9;qk'#dW#C9e4-WX/+heMXI$6T5k6k.mf`jU`f\_kNo3NR9%A!8[Gn3dRc
+%o='ml=41;u%nTZ0&"g]Br]iWk]1k"A*2Z0Bo>]@Pbd'MTb?-2p2#lag at 8*McR$MJNDtH5t$8*?`^kXLqn+ at WAOn&^A]pk-KDA4gG
+%6B!?,N#fk2c0j>O*6rOb=#V9lYD*tM@:M(EYeOf88Ks!,+"7r=j5OOm$fZY2jCt'\)_AW-!.1A>a"5>8c-7L77$1;N^rp/\2Z3nr
+%LC!1a]$SMtnS&M2KD(roLAm]Uc]E;JneHs.>9U,Lh11t;ns;$C80-nV[qXK=+2=*TPZ,^!M9.3In3ji596MKc]O-c$Z"0VV at ueB2
+%kFa?-#BU3R^r'bW#O)9W\mI),K*Qa?%q[sIEY1#NUn at .CJ;Me)Ou,-rFaX!T6;-Om3,H6m:*L<eX:bPWP<,$Y=79In1+Yj?<jD+D
+%Z4^Rs+sjITcBhE15_J`mHJ!TZ(OnSf/dLM4e,TbPj*cF#Pc$RADOjZ?nM(93h!_sP^ZIn`jM&ncp:^#q9$TFYA8Yk/DWAh<Gq,7"
+%Wk`onNhm\e-ekjtFg+0qHJZJ/Vne]+V2mKc2D<3tGn,*J97Jt(lr1u@]YU\6Brp39S`1)mGtXU'^1"M@`:M1L8CZrc]JQWen."[Y
+%2rfiCYVaCZJ6ka+2f%%tcJHEaAOO_T5*,YNZt'i]GTODa4iR-<F"2=^QVTB8d\gF$%YF_EoY)b.Am-7s:5j2`"Y$&2PYN-nm(7;C
+%<Q[(#aa"3Pb9sfIie5TfpgEsriY8EJ2KY3&Q'c#\OMiFkRk'Sqp$#E4c?>X\<*P=)\rstaZ"R:7:=Cm<o-l;T^g$*>][Ve at aDg+(
+%1!^>A7!sH4q,6s:/DXN^gq'Wjd/P#DA4s3k*'`UNKOCeNFmmFI\uTY("A'.iZRUpDBe=:N8jpfXL2u$j6_Ko!.eG$k/c^(,[`t>r
+%dQl3MGip"(G%#M.MPCCDhil3KM_&_?PP')/FCIUfn(AS>0EVgo%a(=D1s1rtmF>5LdE2Wae_d\^4QV-@!a;3Ord#YZ9DQ+2(4%pG
+%ja9DN at X=2M.V0.`-D*\^-h![PB0KL<6biC]Zt93<*%d?Hp/s`H-E<H6+U)?VY(Xn:#XC;sXH<"3bY*A]m6.*8S<kJ!s%[Y]K7!!o
+%rf\#"*j0kicl5+nUR3WU"ZM1UPnEau:V'6=`ia!ml:H4rI*E,5n;SL3/#Kt\k)TsUj]%9-!Au:F8C88FBPtVbWRk at P#t=h.jTBA!
+%M/8A[fgcKleZ#89AL%EWnd`YrOe-o3]6\Z.Eo_N7WQ``goPjD';k>P_-&2"WolQ$D6j(gb;<LLP)@+$eO!"Qch`YNPa[Ra!KC2hA
+%I:Z$B:G)/cJ<0V.T&IL:cUflW?Z4X!jt39@#L3KF-]VEYY\B7BrG_r7p7T?`RaU8:RAo8Jn5>teQ5d-5Gr:<'P1J_9gh?02$3FSM
+%PQ5nhIq[Kl7K8N2PofC/m67B*=a&&"3`*r16V3K_<-2mdP+XEg.0d/U*VG8`B!;7tYq-4@%UluI,ZP at MftN`n\%Ts!3U</$POt\G
+%^\2%;-"*SE%F"*/`,qGE90Y=:&$b36kNB,7co"8;l)U8RSQ(t3i?0suk<J.J:W9[K$`jE:8<MU7rPlRJlG%#U+k0l6>Zn35*(<HQ
+%5657I/p&kSh'kDD6*b'n77P!?W3A0<;V<,nd?,&<2m_WdZWt^?>HhSfj5W:km$$eSdl?eHGr)[T9Aai$hT7`RppjuVc`MW^RR<O7
+%P[eU)<RJbRbnrI&#h7\h_eDDGkFhosJUMi_]B8s6-AhtbD`"9AK9=cmH.m/PD:d`?k+0-B=2)DoaJqmJV`&IZ%ctQhdQrA^1,P&J
+%/"k"Z`a]&QIFf8R[]WHbMb,?@,g6NLYUlWSH>j1._20:3FP6=P at QHA'GTtN))Q at nf@akXP_R+sB)hf\s5Robu3W@"O5U9Otq0Z4V
+%0Dfug[k,QBn at oRh9];G<S\(:@EKKr^%Sq[OTgI5)C9p#:-!R^rG at OmTr)iitD3deAIS6f,OLFQ?9[2!^1Of_0?k$_/3Ao8S#AQ'B
+%jC]B)E3)PWI/r'']'.pVZ_cFiQ:U)E3^rjgPDB5%pR*KcM-qio?p;EZ;tS>'LS!\7#C1:uqll3n%-k7)!A4[t_>j:/l^pW=_+QnO
+%,TlS"4(3d5i*psh4(I=842k!m+U9C:^rP>94PUp>J=QL!W9[UpWH:fl4j#F=-RItXk&eqXY4^ge:.'1d#;)Q:LLt,:``%,K5t2pf
+%*4[_Vl48A at ZBGY(O3N8TAKHrOq2m&k%-.I[WGKdV5;sl7=h_pN_RQYSo']o"=%>6D-`FN-[Nm/Bh\7;W]flj;m*h_Z2`h]$:XbR`
+%Fk8^'L'^OU8P7/'I^U;"o81N9Ef+8a>'Z6`DJEW/+nBQ>FT_f-I$_K"<.Wh^'WEoXOk_*XSB7=iV+"FJAda=6M\O(KhLU'^%cY9,
+%<X0j7;u%&hmO<M#BfVT.%EP6!;+9e/ol.oF>6BhZs0rS3\g'EkVnD3/:a4K?Gn-8U"f!Waj'st<h-A-TIm50/eNs`4VhDqE8Ok1Q
+%&Gtj*bF1cDc;BI;q_.fN>;Ge9U at js:Vea'lXFJX3Vj:q%Q0=-*\PJ2*>)<d;A;f=])Lf6?oVK64fc\VOn<h-1E0)jA5"QqM`eh5u
+%*K((S2GpOuF0oYYQ&Ja*B9WYW.X<st][P]q&<m]tJg[aB%8r`k,d*CK8Rp#I&ZCn_W*UOC9gqs`q5D%A<`P at NM#qrA.6MWDR/UnN
+%Y-'e5d'7,,@[Xqp(0qOYBEpIYNl8Ka$3-[$rph*J\^>u(I3j'CPncqNna>N%p1\g at 3R::I?1[-jk!-nE.i$Z60.L</$$9Sc\D:+T
+%%Z at Q9.?Em]!rRB)"9m6o$O4^BcXpYf6Vuf+;86lU^n#7$)Kc(@NM+1[+(6Pj/AKN-c,Idj)g6ana7;9O0/mu0.N`>D.<cWdh(.f]
+%I6W;/Dp#qYE)+'mAh%=T9J7$V2"pN$!4&1_jaE,-lTKU5di^bmBLeWRT=CahCLl=cJJnVK>-A at 8q"ciJK,]P2p0rl'b:cP<)HQ0V
+%MN`6ED'mc.]"t at Q/cV1FOI+12e80gK=(Ao3V*7\kFq(>Dh2iXLj`]:Z7H1p\N-:u5PXrXT)ua7g`n#.b5?=k>84^&_\r"jVfY\bk
+%6OV;ZgfEc4Nb,.0j^:UH\=H./%OXOaP]ZERUPiOY0W-s3G$_.OC<@QimuktF'%XI`c8bu$:f+ds5V`D\O1+JH>9#_T[H]%[5[El8
+%Nk70BZ7Ytg3]:tq.<YJ7?Zta"a82Hfr7E:H^jGVj)8c+*rnPkjfL5%,%l-X&T57L_9HbY?l-=)$YN]'H5q:?9L1'9n?+JbK,_mC`
+%Ul'4>%l4#'QGAgHm/b#=L'd<74DUOn4`J8HH#KT\%G?pJ&N9%PV7aBZLn;^;=W-gGbBu at GX6JnUFn!-p:%7,U^NH*:ZeKo2Cb,gJ
+%!t2^k+6]5i?QuDel,+hp8l#nV1X)FQ8CQ!N'rD)eF:IdbpAA76000B2?,r1")"WT2H':l2GI?ll$t?HFQeepGFtD[<:Hb*72)NDI
+%=nF/Anca":W;C?G:kPm6daUm"@-^d:kmFb%709$r)b4qjSK!uh\sNW]%dd1%n=9`#?8DIJXIX)4JG<S",a4B>_:@8g`qe\.,(%tD
+%]H0jb]+,d94]`.)VNXa"G@\t&Pm!3(d50,(`:- at Pl'%$$:iF)K?rQ##mAWX:(WDM,GeeR4r5$&hq'Ou=%Ip0[RRB!#Pd_A-$5kBk
+%lFIS?@'Q[8g3MOS.i]J\oi:/HjEcD'F5n[X61/<`PFi#B9:k5,lroTW0/mO,"LUOT^Ti<7H#m(S9opYF`SZ'8N[DfWZ8L_5c&/`s
+%(>tAE95^Abl_EOXHTJCOJ1F,^JO:LeJc0jS0I:/!`lfr(VJ1RQ(=%`6FS+ at 9;[]nBds9qY]mT7S[\cpR)*)W7Iu@]5kNeUNj^8M5
+%X7<Hc/WSrXlulj?Z0*R<M+T/'DhirubuceO&M`u4=3p?)K&po8IN*k"6VAa<SrF at H9HH3c@'E#DA^Y5j<D']RpVE/c6OYG1/:jt-
+%0*c7A8=5<8b'($t9gu^h%i<-6"_eYUocjZM;^&p5qF_mWVIW:[jr!Ts/8,^@b;u5/[VOu^6DqfMl\1'WKP,lm'W)kP,gZ]n#7p'2
+%gUCtYk60]s"Ri8:+c12qVAk5`</uNtWI010j=`$3PeD/.[Xe"&`dUYdp at ssE+[Lh;+PHHtH/pg?iAE>qY`<$CL7,S<he!sA5?]\l
+%RZ,iDrKF354pU*\nNh9nd"lSX$XRWCNVd26Qss%4$ljOTfFM*Pq>[UQ"*if63P^EMQN`M,aMadd^N)-fS$Ya>:G2k7o6#,/oC:`8
+%\/ASabGm`7DsF5$n%ZMk8]TJ.*.PCO$YtP\oE62Hc!tNL:g851ZtLcsh"T=VVAttnbehq,cS9"sC2&6T@=UJ0[iCdD:FZBeRp>mN
+%p6dU8'kME2Nj!7pTd.Os_c4L28^q+eak!I'2blZIhd:>;6:@![@KuU0H[O at +#A<-<k<nJik[&n&T+[`^:p,=?;IT1nN?$]BJl/Pd
+%Zi0IB+jcB*bX0U($*"ooNPWpFk^6<&l9sWC^<A:VB1s\\T_O65Kg7R>\`>3N2^F"W983K!mLSlUOFlrq3Fq?#%H)_WD"\Nl/l6mM
+%4S,Id1J^4,$rbfX&VFo7Pb4>;HdZm@]HnGAY'!TV9=;8_8a-JHV";=_nhE3?lY7m,fM:L\@TN*"W4`#OTb`!\QsHWPD%JWNiKlK:
+%@jE4W0HCF^4i]Aq#UnFc4l_1_q/&B<UQo*BY3tsuS=)Y<ZHeq-AN!=Nk4=^j7>bk=L$<k?.hIUH6O&h,\s[_^eb_OX8=ECW/jDqM
+%50Z?SC4aQo<."@fccsV/#8""r-&'_([8\`Y?^^,#d7[)OQ)\U2"_?"[U#ENn3S4%IpK@'QjFlHsD.QM2RsO,7>5,9(H*>7F0:_#5
+%KeQI5-5M03K,K[BJPAYt,#pH]dA&"smn>m-Z-?>#Bgun9l(-sVYB!K88fj2Gf(+i%Icm\?s)r=;[Kj3i\J'7Z9;6dMcOlsH%934`
+%^<JTRT6[W+,tKSt.2D6>";?SRN>R'o)gb8XeitlFQnDHTAYhZAj/;oc]o^kg>PAr=@`sP5]T!;ifPY=Mf-kP\V=`($kPFac!i8u"
+%04U*EEsoo+U<>e.kLgsGZ0$l)EDb[>2qX91'!,*MKZs^ThLKNEBHf2P9ssAHK:HS.<FoZYA+m:ubO!^_Y[:LBf:<ut<8&k+o]3Vh
+%QgIO*#Pb0d)"0gEi^H8Wo;@O at -h9-.>NX0/^4-GE$*ErlVmWKm0ljm(+/LT#79sV`GM<p\V^/PHJW3WoZj:KhQ)!KdIC^)&=7YMB
+%\\s5%Ru!!W?`(Kqb;uN'&ijPjVlfgVbgD50.=r5A6178*TmiK2,f,td7jiAbcW475P;0.C&2aP>:HcW1qcmA.$6?jG;"CjJ:Ah!n
+%(\-l:)aVW'%WKNA4*p<YIe#gEqQtLN[;QJBZ7Iu-_CJP#Hds?4HI4Xa_94qh<nUij9][+0,;YHa8KGSW=9j3#)E!?Winfj<DH+K'
+%k'-Y`V'n=-^f$"UK-RjkgH4_Q4o$LM1k9-_!>no!U]tT^o;4kMP(m(HVX-O'`=$Dsl&C(Ec@;?J9(MmL8dlN[//bLV:0.,NY9^7n
+%qJZ=8G^`u4QM_(VJ8_'O_6"@VY[2Pnq2]QW7&dId0ae$o$u($<&[!CCX$lr[e+PU#\M"-0Nnqa\G>&i-FZk!_h.ZSQ?'L&cE`Hpu
+%AgEALI*O=q-/O#0aHs/n9ocm0_].N42PsMmmceNbQ)>N3cUWjbb6]dHEi&P%d$t^W"PO0/>&$56h/:W"0 at e+7JFRsD(ankW\`PX>
+%i60^f at 1mOM?(9o-3qos=%lTiNo4&'][Had(<@F:a8<_,\6PYeHMHiiN3(L[9mLABba_b,s4AO-7NW!G75[t#!pV!G%Gft/'\9JAO
+%KHBSuDB.YSc<UqVoM:`Q'E#kVni,2YKtd!o;ku=d4ts"a0mjijSNPY6WOeO^@"5qnrB at Amhj89..B0BWl2tfEPaig69lq?_$^s2]
+%2:$o<UTk0hL#hL8W#"j, at At,)/@jr>)Y;g&'aBFJgO>tnXudGVZWqYsN0+Je(tCD?K4NMY-Zb<i+5B;=@"gClda>Lu>F:HUc/qp(
+%'_lDjPWuVVm-1)[6KP=oCV$D??#[-a*!_?&3G>tnX\58@^45>n'N>TgG$i>P/bhrm%<Ch)2Xu-Ap>_j`]io%fH\1NjP)0'e6Op?+
+%?MiBP#86>5@>E6E--n!5&tJ3QjrPZb$5C&0LdLp at r:l9TeGNR3;31-mrR?gDRkspA](\@sl"5(#n?O1)(i%>hq_Vl)X*4G>,iQQD
+%'!bapVhMdA/PBRFboJnQ0rKH?=T!T-6\'S.1j,&$[5Pc.[kJ$S[*B9j"5GVS;f!e<-[^ET5p10]A<?%uK<snn;?E>[Up=dm at Z^,+
+%,SXA%cF9;2))j#1gl]U?U?+9\4f)b$gTBdi0C,LYOpI<0PETL$U4nr[)9d%RSZrCnTsF8Z%n+GH08/fZN:hhDe/ZOc5R7o.:8g8q
+%nrfm4MrNB$iU=/n\/6%K-\kM)nCZfU5tipJjV<.^C!4)M$/eCg at QZ%4&kSnOPa%HC)@5UH,QQTqTf%4_NB2&g!P_'(__r5F/8!2#
+%hijOW[);#nNo[lP,n"lU?d$L#I>l4X:fpAc`CAofCPuUkWAt7.Eo5BOq3[.C9!riT+M""Q7]m12nk=:7E]G]\>o'MnPQR_BBD]pW
+%3OMBJo9WhXDNhj8=O/6(7`mmXAgM-bi^GS+kZUOYk22LA1#':g=GqqMgYG6I55RBd!=)WJ`28h=E"FPSo3ae)cW^TfF5&#Yb)D8?
+%*5S,FXkOhopICF%24g3**B,bAZes7'm]T[dfGjF>_%f>@Z95Ti40_Q.[??SThRQ'g_+W60c\%t/qu$S\]/K6QE($uf\EP"bo5f'!
+%L?g!j19,60Q'Z&/g"-,-TkA"mW6)I[89igd,_7[(WYQ\T^!VR!3J\CgOOrDPaHDkZburGS0VgE`BS:h62UCW\g0[2U8AX*>@m'7J
+%4XVid*9O7''Zglh<1?SZEG'j0m:=p`\JJIMq6bT"E"VYGL1]-Z-Ki0^kO5\!A at D:jCT_rAGG$T.XW61Vq3`N4gdW0F0_ZoZ:X]^s
+%?UHkQs0aK1Y_9A/s7:k;VFUnP6')TZgU&/l0'?]PgbpASJ[T^7[]'C4#.D%\[j=>"GAq'*=0*[EfMJ1E)cM)K?_"i'>^9jn!p4Yo
+%Yc*B,W!;f=;]-:Hjr5P[4>*rU32n0h#<jd\l[SQAC^8sj-UGKrNDnQ7=GESDej>0iJ$jD;UhusAg,!/MqJZHq0=t/@J5'1!^N'R_
+%I2Clo_+eFKLQ'%eXO5WBq"pr=\EOb>SjLQ)pgY+("4i2Yaom\eO_"dp'GOlZ/=XR^Es.BR9s5ADBQ\/d8F9$9$\dZZV;TPGaI3=0
+%:k.6Gi3[@:`@nL8hs;&$g^5g+M)2\7<o1$3;FO\g+stS5bQeFZR)09gArT[0p&Gm6:Uc8P=_ThFq>`/1S at k@rJn)M[ZFjcB&*&J-
+%BC6elceoTi"dQF]0G&T/,0$u+%?N;(l+%e@,m2BDHk)n84np`2%&5?Wa%?'@jePo1i!ZTCEp1g$IE4^bl1h%i0\8N@=Y>5Rq%3oa
+%.93O>o$Z%O9RTJ&Dj'<;XFOT[5.C+EWg_+s(V"2[oB&D<fM[p$Bts%2XnX[rc_no9DggaA@(+d+]TI$g=4/W\omFD$bK;PuTPNLV
+%qi&=O2GN?R1PH?B[V53m)\^K_)PE$mPGO:$e`VOh0*\?:6qU0Kq?R.Aq8>h+jM at k?;q7pZ#+=/8!GB0#`uSM>LX`1T2&uZtY:n#o
+%*D(AO'8[+"h+&H#T"$mm)akc&d,I$)Xq/r]VU;<>n\[L52^AQ=EmY9Hm/G/4/p#Rfa23Tki%:IU;QDE;Y1+`D?gQ9Qk>rnH39Zet
+%EVpugi`!Q-MCX!m$A%NK%b;L!oiYLq"q0 at 7$MCg;BK8paMSUEk at PtB.^JnB)=Qr31qE8S)r]2u_='5=[i(Ze(:*GAVkEr:RVu,7&
+%m@"`$M2TPulD1.JVCK<3F#FE.5rY9-NP)>T_IWe$eOG&q=O>beJ\uCkZqKXape2tb"k)M+S9#rbjHM'#GC8HqD:>Z^ZmEP,,6qZE
+%S^KRj6#_[57I%kIk.p3]$J"+>Q%$"Dh1O!n3V+LpnS,#)C;V0hY%eeAW2=DoAYkVZ>hjKl&0kg#Rt]g9L#MZp;_>'3;A:aIR/'V/
+%9#3mlJ9s.,.+4j0UQ(q*r]]$&I/h!,WggEfFOXe2^r`EIIU9M8)"bL;<<C-G`l2&'FJ/tY]enbVb*)i;-f$uqd9JUk>ucl2?)60q
+%#`4'(CuH[#k,fb,-fplUc[[Hq5/8^_F5\;[XA?Cd8oV+`E"e<@g:OVs(TW\"I<3lX4*&(*'hKMOOd at NO:Y`u91o6"?InGV5L`<7P
+%F-(E8Od=_4j!Cf'C/^77*.)1A=qf/%aef)Y%S_iGe.kPF(Re0>+HcNUQtJjVI'<Y)!E09%rfSMRpU8njKA.^l-XZF\qHSmZU]rm6
+%p,_n!!I<0::i,s::Ha`2olipBjJ,)(8IHB0kKYf(G'46t?]L>kb8H"h739Bl\KV/j0a8h]B4f1m5&Z&76g?8h9"BT`]Q1W at j'Y_3
+%FTgRK1f$;>nmTY!($hJts,VP6%c>=N9IK^/flngkego:"YYqVK>G[#*`8CJFobssBn)T:h;o.1<5j)Tjj$?\unr3.8^D'MZ*;hp^
+%<@t&25.,r&4-\MsUo_%CI"39FPW[&q\We5olpOZ/b\qrn;c5^7`(_nn&Vjt-%;P5Fn!;nZVLEGea:/O$Ie&p=]pJ?KH%`^G7)E"S
+%DmF5e'D"n7"sZ#Ie(]i`fS2PO8+AXqZfS]m,.MP0\UN')BW5)"Um(j`;RVna3JDt1:TX%_8 at XP&6ls_Dd&0QkTaSa/mDEf_F'[r)
+%lNcPQ]ST0[cP',):W1#fCu(+GU*SM1Ud5R^Qj\K][D?k;;AQhsZSFjk:[71Ll$$<OZjEXSQU4b5H1-rK"9"F8(\4Nc1>#-t.LJ"S
+%;AZbj'r[t8 at BVBJ!e&hM$hlLYn,5N8`.Kq`a"ZoJF*Y!.<)mV6XU"mYPS:fQWgi81qoXjY!j=g%(J*cPVihsPJs3bY=ncVoA:4sX
+%O13h).=__A";XR9ha%OVDq#[NU_l')p9Llg".iJZg+SO3`L7!,;Z0QMHr<2ec"W92kSH.`>(.[`&E66T?lfaLp.E55_:n%[Ks-mu
+%*U'o+-g_4\7k3r%^?CQWmpf/U%X)&`-.>NTFNMf),nY.^[?3O&JF)N+\RE$\]FBIk/^p4$2%@-`61UT))"95WT6BL\)Q83H_TDMH
+%n8k8gX=rn8lb"[g=K2*E.W9ee8$Ah>jg at srql"!Of]5SNlk9V^_k>JOr(cVoW>QYG6qcIa8.7YkGE!M_CH9hSm)=@hUtGOu`rhTG
+%Ge'a.c!uS]_/!gPr>\UIoA/m(A4_qn,`jJ4N^HQL.AoH.*dOW at D.@OO!YjTN63*,)WNe=X:8q!;9'[EFr7^s^RQ`A?=t><9C:i1s
+%BBGU!Q\\<X4=Do at NLf;gSNKS60#[0W`6!M]HqE`",f:5Mfr_WX(nU:pPM=>i15R'/FZLq2>kB$&,nK.,BQT?>&*eF!ltWP[ch!G=
+%n(-o)qrQ+hK@#jR_gKUuCr>ZqDrT4k:@[IndT^)eh^IPj=M$ZOg\3IX^H%_E,BP!_SP/gZBscDuc,A%@I2:!!pGC&i2F\f.pUO\^
+%77VtK'_V+A;WC=jMh,7Y:%4=+'DXHUAHT,8q]Fgeh1eWG,nGlIi*\<QAT/UlJqL%#EMYo,R*&8t/d[2 at DOAY8!`\LN4+?BB8:2lE
+%oE.ig,"k!jWOiJr6:7)g8*[:HCI[#ni2gCW#1mZB-%\l`)_b8eB"_5gWaB5B\d at IRJW)MIWFlf^RHN\>-Dj<SAte96Qin'LD]?)-
+%.W"cDCtd.EhIk]dO!HJLQ79i/NWn#m=Y,%I2_I\>/2CS"*J-;;:$@h`H.j(H=qcbE*qD/SDU4C*n[=nGeI/jP9m5I#`Prf)GLQd@
+%oQH6t1EJ!)FR\lQF,'YR-GnqqQ+Vf4-/GXVN[Z9CDaYfT6ZBBRIhTYdZp<A9f<ni at gSRQeQ7"a5iB9&*a]C'"I2p1$;Z^YaQaBuA
+%A5,3eErn(:9hA#V2lQP?CVbVJ[9NcZTs1%F7QVr$CVgjI0PSlK&"9Wkq!Bp9;B9*pZgd:rW(f^Yd%#^rBO[(*<f[C*);J!gfR,6E
+%aj/YNLPj`#b_2F9O&1tkr!$gUMm[AE!>j;ar3jCmI1gJJmE]@3LVPFsrA\P,76Sp1Oi9G#6g$Z>02O:J?9<(/Q(?scfM(IK5sLli
+%n""Vlbt:Ipkr!(n#FkP5jj(42NnJ#=&R)W6d.hOq4'l92-k_]lb4R%2ZdX+hr4OZl*JT)98i6nTHE:A&S!raiOIl%$X5m+R9M<N`
+%og!?7%qmB!\:0"](P/:\L:p`#XCPJs2qa\.!4&`8!(ebA`R7'I37t9:g(6=e5,FpjfBj]e`W_mEl=ke*#.4r*$7hM\FiaHLi[Vbt
+%VZC#JU\LpJVLH.a at +tS6^HbO<2n'.bd\qrGeP8Xmq6-=6qMSt!,f\coge?R2Mst<3^/EX`8QRh(&s1ESCZkV*D<33TS$O>QPE-k(
+%C`?PXn?8Y+r`IJiiGpZ0CYTc8;tOn+s,C+_Tp:!,N:7QC8VGKV#j>oZUT)Zu>P!)8.n;PEGq/hJNIG&2[3poL3VVkJ<[,$up&5Um
+%RE at sbfkSI*,ipnO/=R!h]]Z`@o$[JD?C^7U'+]/bIlt*A294FN7c'm-Bc\=JbgLaf%.n31XZo^Cs7`l1RZbUHhfA:d`TSC4eT(17
+%:!?*N49C!J8t/D.-VrNOi(UotcsOof=/+mP6*G],flg0MZ69)#Q`".Hl1.i;&aA>I;rs/4j$h01IIO^E5\r at uY_4r'nEhNAZCOp+
+%.</2ngn)DE2:lP/h&@Yg*Hr[t#c=j;c(4L.;aL&)QAlt[Wk*_qp#:=1%%hhupmOf"_<+8"OmB/M8 at li\D6QlegOhVN7)5q`j=[r;
+%X2DUI4Fb8?Kn9iV];]M4I+Mq$E[Jqh9OI?M0['?-\\^Pi8$nuO(?^H:bh/mgrK,3>dXAPoD58;J*:'A^Hh/HK0,h9!"((:"295eI
+%:TTW:A0lV!3>S&]a0S^rbDf*LPk#*;Y<#MVZBX`SjeT]f^==Qp$G(G)kP5/ME*2%EOonVoD-SS)=*'UI(7&Zb9=Ero;HGS at WqsO?
+%d>@WVo[oD7VgV2P./Ds5kTuF$.YLBuC+n_W]FVuD4LFeY,nOPP-9NlmKpKUSn*-gIW:.$dB5:i[)shYI6tfm at H-b#]fo7nA>O]<(
+%\FeX6"SI at QRWGd)COYikZO&JLT9+Silt7\g-[D62M51DDXd!4OAX-8>o&Kh/Mh06u72DjpUZ>#Gd)P2M]N`QmS>HjTLRlefU8aWJ
+%P2e73bE;?_Eccq(=/CFA(Qrko5=b0.1d9<])_\+4Vl`BU"\kP/coqiZ*4_n[HknWD6o7.NI4u_,["e0hjPiX3 at PQuYl-Lt<Po_Fn
+%(,A\6kf%9_^#,g3O\-N\J=X+.gK7-ePcE?rm6)cDrp\acQ,um at QqD-<Q#/qD'?-kAISBu)HDq_?A]h[a\W\ZQQn5[efF-mjk?bm?
+%/^FCnrdrfO0^%Dce*&GV`mA@;1ojTI.Z&i-J33P/b`u;4FpfY<T]8n<=.CaHl9X:+>cMKY,7rA at d6Bh%LY`1UP[BtkYota/2N5Gs
+%Q("(39eFgE<0&sQB\m"nleC6c5Z\[h^2^l:io8)ITVQP8M+9OV]LAtQIJ(mN%'_lj/0tFo-^q1 at rphgN*M#<`^lmU'Wt:YjN3\2.
+%qrN8WW6I,)S8%l?aE+>SaYP3fes5\hZ`e,.7T9?o('Vb8g_\&`HC8WYNoZ=S3RQ*7kjcsNQJ5\ceAg^u7B-M+:^^a8DQ\4m)aT at X
+%YQ]K65t'm6p:Si^FtZE-4YK/<[LSoOO>;<j;V%4u1O>GrA+.$DRHOJeL`R>XkX"PdqMqu]i1O5nkAR3Nj1j0Z.K7V/*SN$C8k\/2
+%$Q^4Jmn;[CG2)2VY^i*:T_-B,9GUiHWL7/ZMDkcObbuEsC>gaE%=Onf'lM5C9,Vb(T.W]%,!GNa3Ug/Ljn0'j8W;S%HnJ?L;4&Z#
+%S)ShMaE-WX:lQ_gO\_<g?\9hHlQdbVDT,[=<^P1cM<<S?iF&RTp`nB&/DXEE#7MpII>IQ-,o1EEe4`i^[]G-Lh]T(m\R!S&DF7]t
+%RAW=?#_f0[_%#sA&_r3V?OH>9o6`3=bEoSd5>[C&9EbiBa&I. at LRXQ-(gLK"ntd\$s'I#BKM/9%d,j;BI/mU9F3/0EQRTtPbZjZu
+%oB-Duf*1geWB.$$)_08"j]\=tRUaDWI31\ZF1)P(jAP:3H%)RTUtU4I at iBY:bA_^$N3fD4H=a5^_BAi.Qpf'G(ZVs0HI.SEj37R5
+%>lrHuI2Ca;F(grjK=F!#m*THuA/Wm'$BJ-e_/X)hmB%-m9h9hZ;M)Ap at V]DGBqEh:^NV(!D^]J5jiN8Hj4r2.("nZIr[Ab`:,Ppo
+%G&FC?ddEoqUtV at 2,F-bWIu,DjS at k3Q)o#[f3CX!?IalZ?,K9D at GQ+g"8O,tZR?Xlc)U7eT[2L`c>(W%lM"`CFGGU>A9>W3OElC<`
+%X"H$`iPuf4:(U$JDMDcRs!#s[f,l^@,_ujuV<?A;Vt9'X.[A?,:)#3Dg-Eg)JVr]MMROZ.i(4=XlVouaN)'AQ>-83[('Hp>e.P!+
+%`6T-9HctlgY>dF%RF>FmB7h(Rh3ujI6)9L`@nPk&:WUhCD5=gRep3h8jkZ<0RWY6'^/C?DAH>Copuo)t;ZJ'IEgOE;gbV0H%`s0`
+%]O:VX4%YA7[[Mm+kY.2A>=hp%1nsd.PMb6QM[7IDgYN?&X_qLghaF/G/B+OKN&>>-cM7tfr0,N%<+>@:do$?mfZ=S9qA&rOlWeht
+%E+NBCm$RTLrXViN`D*T3;UI/8fh*FCQsRiOgN/s;4iAj3mEMt4^JNC7 at 1C/"OS\f/fe)P3f;Y*Rd$LAi]ME!C2`-U9$]]q:f$Ark
+%]c.cL!R<V_&52\a];tPq*!@""73s1KI#S9uEUbk[N4<r5ESLkSkLrkRb.GT\@*hO^_a7FMIe-eae*)/1!^6/S)mtG+>Q<Os^CZfH
+%X/9r%-2t2aG^G$BNb]C&lBfq@$&j0Z%.X\K$a:uB\)dUk[O=aC;:eu>g^A97l52#0DkRZ5'%RE"V`o2<!j9h]fKVi`brVH^<=uN3
+%*aA-'IUYZ,4IC4F"UN7$'-APJVM"s=O*,sDgf(07GO3@@+=4 at 7cu]02T at 38&jHj=#59Z:dP!-G3'FYeuKY1MU48]CK`3DS+S$;KI
+%X7]s`Y$gtpmS<HpO*n^D4#<Eqn.^9UhCDj=TV(b\4W\V=R>ZLpi9W@<L9b9'ei's.a9bfO]O#[B^N[hg!'E8OWJ3tSI;1kpBmJn%
+%885]eBlGt9%a\/J'QRkQX8,WpRIVAPP9[$fMHlA&`Uo(9j%@*2fnpXc(pdTINL(]6P&_hGBh^?HZnkUIf\!KPE8^i[@.+LbOhg=0
+%Tm_u4G28">_`4*L7ON=eNd`D#.n<9 at Y/<jLG1+_C$1bDdZR.RDYO'd=kXG!Ef($Nb*Dc5^5%'9:"QPO[5J at JS#fNU)MGFH[?2J=m
+%J.M=h?1>>>;IF8MC8ntZO?M>W\cjP5f>,:s*rE#TnM>>_W8`[A")+gX at eloWgQG^E"87S"pF3!skW at OHc-`>Z8(G(l"!Be=8VO]P
+%. at IngXqp8,R15n9P<CpY5K@#591If[rpORk=Y.,=\I)85C5`jhjp9(H`1])Q*MX^,&]m$Z/QQtfn6um+$_Aod:MD6^']5A*^*P**
+%%^rD(j8,"EV6.1,]/2#=Mi5nu.epoiA(*CI3Z;4[UjsQp^o/\Ag+=uL8bT3q&UD>ecGk*gl(9!Igi6%S,ELltEV<:<IB:B49&MM5
+%oI&kbA$:FC=?DjDI at QQ,#SZ:2*Gk(8DAeWT\>AJA+lRp<3u>kp\QSHbY2bRi/T]Tlp)M+255se(E3hdQEDl<Qdj-)u\uX>@QBVT1
+%0>U`8BYj(.dLY-C$Emg4Dl`42ElU[Y,hXT\M]3tMKcJTiifZ[]aRcC2lkqLV+_ue`nL(SV.)\@*C)K7]5XN?,H?NAX-9K%^1(r&s
+%;K8,W'cH+R.BnBNNj@\3Uf?^5GI^KgSIu`>@hY8=9AuFkQ:Oqnb'*OR^/gs=YA$\qrRKr3G@"Fhg\rt;9oYXR!U.j\$7]>YnbIUr
+%Nuj$X!?XW&1-8=1O(A2TEJ$-\9HVR)MX39%Sp.R8XX7*:c^>D`S;8MUYFAFCfLY;j45Vn;2X"\>r8+;DR_5nmF2(AR<Kc?se##X,
+%fWOJMP"R>lbP1 at P*/.o1Z*P/Qn='V`?u"[sEl at UemR+Ht-^pO+p>[gQbucQj!6G43!Y?j)*@SI(e`t\/YUeT!P]GD;%&OnY*I3(4
+%!9uYR8-@:._0)6TH at Wr<=d7+;:P-JfFSH(a0\X)kaBo"c1h;u]J('J$^,bD@&"Bc:1NTqANq&Mb7fb4c.3E'4Gnh9Em^Q+CeKYbi
+%nHf)bgr%iZ`<@;Gh>1h@[$_`<qgh3L5k$iJS+@:C(UD&IF/<)fba#_<6O=\^<sf#C.H<%0]O.[-3t)l-mMaSq?sMb:Eb9\ZcY22]
+%o&eh1qK.!J`!E7*iuRou0kK99ZCF*-o;U.b/t?*EHX^!X6_H:uo8b*IK#bB2K;=$1>d<(jKeaCf^Qq-$gN19cRi@%VX`Ns'j(Gi1
+%*A!Y0*S=9^%@>&`C)ju]S"HFF-sXnPs89G at B61Cq=*^od.M1Y61\]F/+K7=^0*,j<(6qIk.G5+4QhQs>"h3R+0U"0m:6Dl+/l:"K
+%kHI!f?piMp;>;_7)n92ieoHW:(BSd;^P-?e-\DhFoD[Fu?O5nciBN*Te)^3S;l?F8I"_]*hUm,:ojCgh*&,C^EoET-I.o"0P03Tu
+%e^q2/G5Oo)PppFMKgSR?X at 6e\GquG0Oua_PGCR1>IZj&==t[0%5rN8sf/OG5>;CRKiRZ4(;Zes-a'MiM&;C'=2<=GES^(-uM>'\\
+%El)2\NPVXdRXgqr_KaD#:Mgtc6>@l,Y&'i452JX7oaO`lYd\VKHAX5`b^H%1STPi@:%X@`F6QA8^(I9rDq;\\O!6Pn)::,kG1Q>.
+%q@?>4Q<]_s8o8DN:7_!4l!K>'Kr"=_g"TV8m=d`i1GcPWN)VCFS##:ESh6g0&(-aa8&Ot`6&aT:\kF,MHC#IIk*:VfZ)"=D?&b>l
+%0Tcl80.%.\8NT.sCOHiuQJg&d-%HuW_SIj*W%A;48/5'+2)g.flPp585(,JKYkR:AZ91t at R-)XO,k*57WL\UO$"Wks61%H7a-*.u
+%[?p?g1!X34O`[gtAF]6d0,tL;iE$(WrTmPH[&ijC,*c;_CJR]7l at n;P4)_'6]V>f8ejZ+#7,:@botXN':`4FTT]E+JnVghu2$M]R
+%7YBmg!-&QU*T,e5fe#p$RWLmN/\*<]MSdLm"YbRtSCNT=J"o&H]Y>3"@noa?3&tW>_g!FfY4mURk1"Uo/)tB-6[haR`2+ at tkZ]>S
+%T$pL5RY,NSj at Hk,(uGMtaRkEW.iMUjpQ996n28A[2s3q`j_I(o(C"1+;;"0,&IsEsp?jotJYh]7p1gg'N:SkXUe8qQ/d6B:Hd7&s
+%nUY_sK9>#."4_c:%o[h6DUU[LUZNmcTZdp]$da$s)-\G*-.ikcb>D#sL[C_(Ojho5ZaNGngoTAFbCe*E at B;7P8L]],6l=uW298YV
+%e.98R&=XL1+JtXODSD/],5F@;o&f^n>-P]+C[e6pSWip8d5W&DLCaQgJ/_a%qRB49q7Q=Kh(JkajFJG*\!MC?#J17Rgi'q8kFN(!
+%2$]?eb(@j,^QtDc[bRLIr=Ne*/T?#0 at Q%kC$LCd4g!HaMr'\m.RXKYP<!;"lq0?BY(PK*&WJ$P/STmnp'AD9p739][%94,Q:$ojF
+%a\R5,i]"J9IR>R.<F:_`;JYFB#Fk&*/pf(8`D0XaqSH:)O)2teC;NdZ8J8kN5%CkWC'?T)A[g%t=*54-gp3HE^btp-,U6%=8&FCO
+%I`F1+.]MkAA_TO]kB_+M#QcuQT^1=tltjnIl?'neLS5*X.4l at ugZgo/)0_1X[@`?=*%gK(W.73k!2oCh:$XlCBAt`8gW at g^`s.gm
+%U;s(\k#bp=h62U`TBf"Bm[dn(WJgo#RmLXW.&Jeu2o/-rgQuFY]./Y`8KBI\fDKpm[eV_3BnJ.lHr^=0n*eAn.=*6tqf?B#l#i7M
+%>99SRcSJquA4,F*DFl##XT$B<2a=&1`9c,Om at Fr>FV!'/&p!F:SH6+h4eM4ldr#Gs8b'$n5,K6YNLsUs/*AVd%SsA>?;F(4jp3mk
+%CiH0[M!oe]TNhb'VMNQ\"DWsogOqU]@KkcDVTOJSdB52h'[3.kYW!PmZFT at 0s*csr8?PG%Sc":pFH_)&?+TV;&5436:(<dT)!Oa@
+%e at G1"-4!VOPY%_:ER(u\AJ%>9HBJkm1jeX#Q-pr*SB,6jjN5qW/kI[P/>2aKhL+eT3!j2Fk.LM(]6h]=E-h.rD*@+Xfrl=)\&?r%
+%^M*6d(K"Z0UnL_h<UiUcQ9)TT3R=NOI at PX>0d at 4@ps-QfD#&4BM8NSsq>hUfGb#CB;>2>R3]dT:qqE`5 at M/"mkmtA>eECs#7l'C#
+%qSf>mCNUn1]e1;)EXIHCG,r5]>H.r5jUWDH:u,Qan9u`_7].I#"OEkt6pG9HDTa/p5kFb:,#9AmdjV+c`gR]oZi#)f6IN'Zb=TLR
+%5dh[>B4<ceY>GMkM:B1/J;[XY-o([DL2]XH-k]m+R'-'@"'qp\\U_EK<E]d84PTVrA!uPbURoqU"FdfDj[^_lIV;]7IT7cX_LE7;
+%,)&rJ67sbmkMnWM[3h&\lhq4/VP^[ZPc$C,BB:5 at ffpW)RLfg$*Y5rg%mc#.CSGp6MiFO9VJMt%SicWkQR(1d(k>h#=+`#:FIN[&
+%0C1IZgbT?khmX<4q$QK:o<cfu/SUmaD1(sG0N,?&"4pQ=_[&c$])nIB\EJ`BA*]j:-ckGaj[q:fJ+?'sY\se<hnE5`-BhL:WH^6u
+%61gO[VR]"/RK]="3l@"mWr0*+^:9N%7QG'24EMV[D"j`4gIuqoQdkQ;90^BCo#`i6PF'oP-)RN1Th!UE;,l8>.Sc"I?[f!+G[lu\
+%]!4JFA6%Z<G'oHE^\Jf32s,V6de!mbb2iUEN6QF7f)V4.heJRdfs^QtqHNL!ah&(,gN")$+;7K`>BX15%1&Ldi"Wor/9B,-bcK%I
+%0I3s^A'iBKX0dk)QK7$[:>DphP(9rUHd^=kq7IPP3=IGFZ0KSHcIj7g\*82R>k at GMRG*TKF7LH'<N^3:K(:C-MWt%T,eFo:"o%-_
+%/:U,6ae1I1;Y-YRd#6#P3,eL>!VlcAa^WV6$A<1j?>YBG\Rrt.S2cTZV'@lUacF++Xfe2o]T'Q=m>O;i&"t'_)$>`n\`4Z[OV%="
+%,f1,*%,[rl*qP#[#pjn,imW$lYZ-6r&lKui>CH\!jCjCD]R9:gXAMhT0#);g#q`W)(]/e`"P"hHaTE0PX]#K%o^ItP\%--YQGX3[
+%d<1)El9Ep0Z-nqjW\Y8i2V0_sP^utGLVfQ!ifUNG9D*4m%KK4`SsF2[_X'o:Y3u"ATU8].4_9>eqT!]h5"3eO%GN^qInc:$MYT1r
+%dltljHqj\/rHS8TY$'Z-I3V0S!aTI/D1d3.$^o'O6D=.LO)$7noNcM%'59VtK=9aD1j+)*"24^:iHjkd_7K at d/+Ul6\%JbHId`?^
+%63<kJXW6H5.f9o3HNXGRdK>3Lb3-d<2oS*Y^L[%C43tl.`+)j(cW9-NP"CMhJqrAY.5V>cYa&3fTQ'dl=BF?*p3hcr\Wdj]3)A_$
+%&:-l49>*o)1q3ERHk;:teF4B/DNuae-kc$,\&tqU4 at t8X#3NnPHUBI3)l$M9agH7H`/`J;*r at 2ILVWOURBDO&,6sN=:SP#&?S@'!
+%00q#^U>,(ATp@>K[(;9pG5W*YbJb at _-5`/<SJ\jge#Ot&fp#mLAoq:!SM_Si^7WN0a=SVP:$I@$PH84fHS.b;P-:!)k^iB%d2tj"
+%_O7:RLSi*sDK7-kf,G`fr;-K?>e at ch\fqZCk/Sl0\P+lB at OhC=O#-U:T+lOR?AQ`^H:sTIokePq53M_3=3q&O%f49pK:"1P[\J*,
+%;%qgoU)3u&@h:7!CbaZRr(9dJo6jNAk4tp&(hTo"YK0srPSK2X$"YG;0qrPZ`Oi6'WhWkRUiiou07F\KZ(LtCdOMeG*FRh19*]!Z
+%Ld:6_bq,9t<_`<n_WS%u_PQtJ01\':k<m\IdVAc<euep[*Y%/i,g=c>KeVs&m1\5Lpc;7iWi?V7.d,hD0*)M3BPS)S$<>7Y]6gn,
+%Dgl$X_KF!RDGsJBIk3&$T.R&/;F(H]pV?-#>C.Qh]s]@PZ\I\Yg(I.<OuW1^aZo)XkOb+2[\[Fm"!#HWeO>=@:S#CaIf.q\'W)Qa
+%RMuQX3;'8L"(9\a]pe.gAOt7:!W>e87?D%P[40d7TEP^'Q5;E$DE7eYDcW<`hj?hZW97P8qEBiKPOB'H2\rH>,(]Xu&XR'1:'lc0
+%H2RpNZY+2Bnm.K8]]Omk'G-me9P"3&k"0lE=]b5E+qh,>WA3#UlS$jNLDP>/niT`//s<me*bO>\A=rf!M"A7jEps/VllWau+2R7f
+%Lls/m.ca2]-+AH8,;6MoZ\01T!^RrqNKk#)Zqg;"2J4hV9S3PuOVE at aX/NYOfB9-%.-q*:9t([KndCa6)>=!*:^3-,\R0X14aS[4
+%mRa0UH=!!E8p2j`T,mMaL&^dI-r6t:-eY5X1i,UhcC7Ht9^W<kZAc4c095+u3 at E`r),(ZbHl?Qmb<L*cO3-reJ@&7G[m"mqVf=O<
+%?@M2n+#0FP#n'U`YN9r/jd\@D_gssHe/S:HofF`(6)U[pmC=QNjm/X;X=D[En4rRu$S5rt'KI.7dc!?kn/ctY+I`@ogq-rd4'd%d
+%]b)!#89MV+g88u at QcQA&Gd8@%G`;roYpi'a0Y+sN#W"A/@m]`W:esthAPdc$g#F&$e_BG>EtM#!Yp'4!@B'*IBp(nsMC%R--][!?
+%mR`e'J2WPB4uY6UFe=1)3k+o[q6NhIKCWEE"fpY=MD_g2_#MqOY-tULD1H"$d`V\c\a9n2/eDL9QRg4s]^=3,gG6kOf'9i$q;$KY
+%"j/'0C?MtFLC56JJIUhWZt]<n9!tR6U`?.DrJBF`^lTJQUO(_ZBo/GfcS?l>m.VmR^@Gg`_E.:comDo(\rH??\sM8DaqhF%\"5B=
+%A<8]gN$eJs'&F2,=aBVgaROKd1f%rY@@*'=I#oWerSc$MOLe$2Tk6r3geh'8?CJ\D6#QLg2op1A#XCS'^'Aa1E9;6?HGWK?XeIr/
+%Th*R>ZPhtjbi`\XC['le?*&2!62ie<5PI2&k[WO1=K!JXGgRJ.#^RLX6-t;9KU%4WAjYGN2Oi+#NdLli(MC.H9sNA?#Z;oa;31%k
+%g;%JcDB49'igI@*65fl4W@%uJ,K*]`B>eRZ(Kbj'J@"dD,nukai3uO=s)oYe%G(a5go6KgC_!B8Q8fYMIVX84*_fjXG]2 at +A3[%9
+%dGW84 at pH)-[i9jj>Ne1PbLDm%G7#ItlLZ9qVT*'jHp6#IO>lcBrh&Z4';[at;o`jJ/;cQgI[_b4'tZ,GZT24"$UJoI_NYY`*4_EC
+%2/R[u>cl5$A$B4dc(a\Wqke+1BT:CQ56H4)RId],^)F&J:P"!O*NN,'V&r+Y0RA"V#."kNiSBSCfG@^\f^JWt9ufC%P6KsH'`bkj
+%kQ!R#Vr3,@!.<Eh6!!gR$%t>4;e:6Z;M8;%E^^K'%>MJTLBQu+n_gt^*8"nNGo0[9RZ!Y'VJK<tN<*gP`s51_UngX85h&8oJcV<T
+%hlD0]BO"f\&n?DF$,,FCm;ofm!kMC'bDM?u4%MK8<$Y0+n.8nKlcrJ5Q?Z2/aX:NSRrp#o@()$83mtBIR?b$9'qNm0o:B31Y"hDW
+%nl-5PTD"j57VP'f^HIF8gb.gu"6jp1QGV8NX:0Cg+*/\IL8dXJo3ItRi161Z3k(_"]<6_KM?t;^($&/7`Hk'iRpi5*Y.n\HEtVTP
+%VFM?5pp0fiEle"RKm#KrY_#D at BQ4"B0WY+@$WAOW-Bf6>H.g!Ocf#7chQ.1a;04k/hNKMSGf.VAq]u"MdPl]a!5jHDL?V2OW7W<X
+%%%D;uW=(%Hd+cc=:Wc3H`/["epRfpm8m;u\/Yi\O!MndHJAI<'eTK]2eDO5?>(?A;a,clLRu$mb2C`Q87Y+J8<XtSUa40 at l0)L!V
+%LIGs9qt at +;nf%Af5*biM0,PnB at DDGX&j]G$kTt?IB8q0r3H4QWJWt;'!DL'OFc>@Xop?,V3cFgP/`oPlOWSGdSHqXD*([/r>q!6\
+%%&a9WDP?%!-Eu at -G4]QQrnMO(&JcIkEquV7j88i'C]RC':iH:9Y6Y'eA at nf'L!"^E!)=q84t?3=+,\\$Kd_U.1k-heV9N=:93K>D
+%1<BbCqVL1FGi%GX[J_)'NT.sB<XK,e9u-?ed,6rWpm4)39aMJk#o[\c<P2W#g^)JOH$[UFa+mIQV\tm]K6_IuN*T+9?T=HKj>Z2T
+%gr#WB((l^n_O><MWJ$$C at fVIrlPHKVD09ol-(h"3IL#ToUf!2oLUQhORDJ!=Y+M:3c0('2_^NGlD#)^8^2kciI("6qm_3t]09`\5
+%-:k,)8-p9s3a69l7#PkHlKP,4fE`baf[<(-<D*Tn7U/s,VsU7Yhl"6&UA8#K:3"SfJ_O+CqLZcVRQQN[PNq^2+d03r<*8YnltrV#
+%c#IL2\[n?9^ATZJ7QL<9L&4o:3sBmU+:0g..2dDQ4)3m-\3X&oA!!"X2tY;&T\0[nT'F&F\Ykkk#,?M3M6n`'m.Hu?rDn?\7$=O@
+%&R^k`]!32G`W'\(FqO1O9prZ7+g0cJU^lA6Ep6e(YmeW[MXO=5W7+!`*'UVpk,$eh>c,%[JoI:d7Nq./,e8'4m3lH?><hm3%-^7P
+%GH%XNCUt1F)Q0(NP%050IMisl)9N1XF9jG=%1a(D!TGMt(4OZ3B&VOh"TumTks?^h)U0]N^=N^F=1_[u<U/n\m]S=n+$M_uhQ)+H
+%Y'hDIIFEqmK1ueL[YL!s4TfKBntAn>^4VOt+qQt91o<mk7GpE+=_5Jp]SWBfbeH!#(\5J@:>7ELRp)EFK]&!2>k*q(:seSJ,h.E,
+%[N&V,QD!F3Pe=#$!Ubr;d4\^Y8S%;2?Nq&'mYk^"l7 at VE7UT*=-A%`(Y8o`C/8RKX$.^uK%E&E0h^PdCBkAO1PbQe<V,U&=_Kmt5
+%FrS"X4 at P#Ae8/aP#QJn)8OXc!K1THk-U[W0X.rA[qNT&M at of=NpA"Dlk-Ckeg4F%<n;Xsp65B0>n*)UZeO]XZSd12"5i(%,,K1er
+%mlH4afZ-QePWLY(]`^l!qRa`"FgBM?p,JTi$2'j:eG at DuHQcQJ^cH/q.u5M1Q7'"BqHl6id6URfcXBDuH3IGP_%b?DGrh'AYU%9T
+%V3LTT2UMVPaXAcnJrQqn at 7R*#=qX?sb)V")n[nA%\!%-.Ym;=BanqG=QE_.QO[Q8U6qUah[:[M*R'PjMnlh2h=X+_DRnHB1n"=)V
+%ehiNZ9Z1BSS%MsM9bc=p(r9hd`j"c,89G&O-S+ at 9d4\qu`1K!a-E$r01cT55JNdZbjS2g*N'N1enXD`!qQ(qj2N',AVApi*`s=/g
+%Ys5f9[N1ZuJe]iUd[,F:nK[.G+KVE09YqU09_m1;Q4E>n;qES+ at Ue%X$.*"@n3.$MRtE>!,t%25?<QPFG[H*gAdXU,(tnAunHJ^N
+%$FK_t+[bB#&F'[qg>6PYX(.;rXs='bW,T4A(**!dW%l18GoO82W1O;mP+*P8g#QIcC1V*?osr[bXn at CiTkc74\"Hm6i4+m]AWhE$
+%n(^,c*?[hB+)\i7p&YJ>$4^58H;er6`?G$;,X-r/p0/U3UA<.A,D1e&1A.Ns%^\uuC[3ba0A>g8>mmQIqV,;6%o4n,@*st$\og,G
+%=Gc4a:6Tf1']":h0(H3g)CC`nj-O/M:*+d>b3D:+rf5"4[%?3&-1G=BmUVt(XHL;7_1"7u6Jj^L-romsQNWop]Pe9hriQIQZ_'b%
+%IA)X_'=Vt)UV3*4NN"N^FTOGEY]!\KbKW:i3M&O8R,$TNVt^!%i3oY1e]L06'gb?=CfBlt,dro7XHu8uD?OMtnQGM,QcucD307HD
+%!/T>T$C6T*F_WpKBoehVqpg#Op;:$OBH06Drpo!mN9NJ,`U+K(Em=%d"I/+JYJkaqS3;#3049YLO@,X>Dq'pWVU1&L\!L\d\@bJ?
+%c;(FK_dnSaCG',bB/3,#90'8j55mc[i7jZ)JYu[+A1<QK9*RKJ`#%u[.!UU:8LmWr0cODDH*":A!u%P1qHbV,Mf`.o(S7+$XPNf)
+%g3^JR>*glrn:Ib[-NPHl=uZrccdV?<oh..E4nJF$q5i\deE8->Yn2gRIS!nW(+;4U=bEa]e?`G9X'cR+ at sr49;@37[;TYFPY2i(d
+%kt#Qe?q at r-hlS-=#N at f=dO>s,nKf7\UnhUNB(INs3T00l'Ho(tj7l.[Ie2BolVt>!CsF-mFZ=)_QM4s#Qn4WrA7fcjAlnfdSU)Co
+%Z*Q]*..9]rO-3/m<O)SubR)D/J+BQ4Wcu=;aO8l;rg(,LnfVnD96T^P#P/q$`-M!ZrB9Bn-,$4\Re*Yo3tk.sR(e_\cWj,p$uT\%
+%;t[B.A.t6Dc-2)*DfGYMpD<^%.k(^9S_FQ%_7E at 4>fX-)`S.2W6blc08U4o7aT#?c::e&=nkoGXA#tTmYte--8S7#!Q%8'`&#S>D
+%@.BP_!^flmRRMULI.X1qKt3ZM?MZlY<7\<XU>rMg59 at hl62+W/qJCFg=g"@KRR!8:-h6pc3l^D%qEqf at eRX/@Rn%l&h@`iB<i7M'
+%B4Ihr<WPjclNKR=gt\ut0!%mOf8VAKJJmcBcBg$<`L[Z8i=U*q8N&^3bi at b5VNI(RCe]2^<LAu'B:aNmUs/8(oMht_C'bC@#C5`i
+%#SK=K$B>h5V"%c_PZ2^$79;E"+)fePa_.E*rn9QLW+;K)GX&5n/AYqpSTensFl*=n%:YC:9ML9m5sPCo`J2f]E'PCD_SOr_&;R9@
+%9kqcjV.NRW`-ts4[XJ,#dXt&EKe".X4PZ30Gg0kMm,F3!9<,dT4UfL9S35%mL`Gd%1i'Na?clT95m(ATGs6!"dua=e(g$TKWF/iC
+%86u%;MMRqB`.>_a0DQH">;[:Yo$0'1=HZP`O"@]-4b=[,">!Gr\ia=tF:0)"kbD'?!9rA at eZ./-(Fsu6CGX!a+9.ptR:V7kRD\B=
+%mh^)/\+Z$Ih6^W]2VIo;Fo(h-?J"g.-WuT`o&?C8B?qIVDi9=WIlnVt$/B-,pgb]@Q5"1.h-We/_GT<_3f+.s"S@[7VSCnt1#IP,
+%B(,.3F.>9 at +I[X^atZTZ+E06Zpjh*WVpBR-YF=E1faR(Uk>`POjY7>nBZctW8R]3&+BtdpD4$mtSX!qCNOk at T(U\C"7NK9s[-[.2
+%H$V@=(5';0&tWa)!,p[L-,W#/&D<7:s$8LTJMu-KUNU_G'K_EEIsHkup;1H,1.Nf[AUHMseB-'_TiB5!HY#g?db$k(;Cf0\IEA9<
+%]UI.tpI`<3G54)':NF(>Z'KI:7BbsL8K$r:'l;Iah;4[/;L$t!qG.%7-1!2Y!a at 9\PuOLg'\bP at fl]<@N,JX=]J='ILM(If08QLj
+%bYNZ)<$,'E;Kb21_Eu$cV_IY<Hu^GQ;#ToT6_[2)b)b:#@h./sl`NY7Pp[+N,lYlZn2c&3b1VD%?#]%">iLD50E"9 at d004eUn^Y6
+%FuRgS8FTRF+5M*TWIGQnY)K6Wq)aGNH!$T=a7S;"GQ+B^gj/6ManbQDE],mLk<!U=d$0,V"V1H)T!2bOT.q)qaf!<LL7>%'nlM]-
+%'K?uEd=8H$=FQLa%-!BqD)j7;jK(jRK]S*CE]5E5-Rg4Vc`J+3?+RYXGi\%.oPD_B?[JmW+1&SD at f8L*,gXMf$C#"*D[g/2b0?3l
+%_)fu$AH'HMnAY4q0a:0$@#1/m'*+NU/g]%8'A at a\qDcq'Sk*-.);[QVnju])>1?sae+)-/fFSl<.9.!Fb/Hb(pob!'l]7EZME3k&
+%3b+-Enl:b81S#dS#C%6TFrFriIAsHR<,74IqAPGA,igt-gVM at GR)]a+9"M$iGg at Kmp=Ut/%H;CaCN\[([cD-[c2d/j4TI2P3&[GX
+%%kVdCc at r((;%DE_KP_di8R5GJ5p,g&3E883!U!B[iq0QUJL&^1A?#%NN$*0YJn9#O?fFX$c>TDa]pV!,,?g(ijOo23Yj7%;;Z.jJ
+%FeEsAXt\'F';<YbVE at mo:>5+\mj4Tp*.M:"S_G4-7TKUh^f<9_8V%6rdSa\tOL'$m9eL6Jh>d2!r$c at LfuFtT71YFijtJ6LVflG4
+%Pp/NVD;;d7<rK?&92m3i1d8).k at L\@0d?)./oo7gj=j[;[J-JWR[[@Fa2$*dG"lP<TUl[([G\2C;512_E_qJmr>G,O^6.^':EV-M
+%CPA8)kggjje-iaSblQ#;4YYf`MHiiHhd'/p&%$2mNabfK_]Au.NH at 8sqK4S'3qD0>()Ig)=s$jrF5$'NPSNP$hYFZ-$E!qam._n6
+%DV`l/+gS3H<+!ERGk40M:UPp%d)ii>(=ObrgjdhMl!Kk]d\5G(*lUjA3iOZ#5".8bjs+]<:+^jYo<sZa/p:EV.cn*r9mrrgk[hb:
+%n_?gf+&")KaVIe_]:MNf,t/JJ`cG?f09G@/F,j9f![;1fYE1. at ds6gG3U)<ZX%PI5,H6NA9;;9T8(4r8I=:u\cFHM+f;k5R/4lM)
+%YD"5sTSn9[`^f<,5:?iU"9>/o.kRRJlFfkUo6cq`f%l(4/a,'jofB??M,Y7&`^HF#75)$35flUJ5-6%D"NR+XQ1)h70K%/oLdi*t
+%N at tg_m*4qu'kS'A]ViIr>%MH2C3lO&4JspX>^^1^;'5#>>)>B^)lajjT0,e)Y"hf.oXE&dan(tGgs8!I.%Ve$qi_h0qG*7FB/jcN
+%KJZ%PBaSDI8GFefH9cp".N@'6JA^<-!9$o8\S.tboAD1r>BN9bGi at 6/lUGdar:AM<E`5km1>%#,CH$$2JIa=D,X>aV$4j9q+Bk"b
+%#Xe.fZ=;gb?24:NfC.c_$albY*aGB%PmmF_!JK&M^p;aS7YS3N$a?mF[&7<H#R4R[-on3oR(P)4e<J>3TA at n5dB"@P=?l"Z]]cU:
+%;ejUp_',co4t9dgC2LW;bG%SB4BN0`4N9K08MK92lmm902K$XBG7O1XbJ<dS/=B[:(D=KpA+J5Ca3+'=q)JTYTRVB#r:<lonu=>i
+%7W;T^jWK0)G(aQ33X.ps?AcKgq0Sf,T*#sQm,"#r:R*+a_MU<]SO.g$cM7!#H[Zb<;?@HjUn"TYasUWf5e_U[7F%1N5SiVOh)^-)
+%cJ%),&d+pS(qj_8-SlHPjJXQ-JpX%^T!?u at s2L;?1sS4fR1j$g.`Tf)jaMc"K\0Ug,?*LKg0)_mL:1b7+E.jT,?]YYEH:lp'W;7;
+%,XDY>UgE+"+H#>:- at S/q at cEpeBeIN3M4%#`b]VPAIrIo@*Idg\pIUD,1nVXfSHC_'S'QkJ at rZ$O,NgMSfu_1q+=E_+.P7jac<7*2
+%#,Cu!<iC)sVO(A$;^te[IGLte"mmO-N)Tm;.[GW0F&cC/8NphSEG-s:_4gp9.-E.\s&kgu<ql0;Pg=MtND3 at GDUo],Jm:H`p*qn*
+%K,EtaN12Mc7W<r`T$!fk0K\7NrgW0e4m;c1rTsCE$+QQ$'mkU32pZ6se)[FV7?\P/j7!^MK<sEe/Z*)%`LR2&AS7R"K)W+2Z'/1:
+%=<5j7qfX5I]38r2f95^#2;'_[pJ4]&[d_UrC]Xo`\ro+g`(OiWQiCG"EmJ)c+h14d+.]C$FiL#"MI7o;hi>lW:>T(mjig"i:*1Xb
+%eKUIlkhf$<BQgYHg2d$XQGIbJmkZiV;02U))Oo^5eBHM$WMH1#[J0iEmeos4.9%!2pW(eST)8MPi*h-h4%DJU'&?l-X;1_a3\=l1
+%QSPni7rIslXB".Ii6P=i/icC!@+.`l"'SKt]L`Aj;Kr+XhR_Dd+/Bet/e2nX,e=r&=M.3Dd_"o at ACe]+cDNW^m^E<ih-.\s.iW%f
+%-M0,nXjdh9DL%i8(jS;HI\J_$R=u+.6Zp4GEn(7 at bBp]dYggI#^6Fb`a'/.2./43aalQ7AO%tfEpq[FYA=Vi$O2kP\R(V1&7^0nJ
+%)O$Y]0[%e-Sm8DHcaus2Cu*1GEY3a]$ae(43k0dN;c81'*Qs$3).PI\);k)-W8"1"Q#+Hl]G/<%rQplWjVXe>-Oo0rGcn%5m2N-S
+%4=`"hJ4P?fr2QES:<d`ja.8)g#ls$KS3V.!=))DMWjrg*1uKI1.\s=6P9k?D1'n"P+=&S\RBXb%$TUGVaYUFGap);#"l8[EKsCh%
+%:*q+[`)AY1-!G^R#P at djq%rM!rIXTB#j1jLdn](4R,L1uU27Sc/:Sr:F*Yu&a;8QQY.(8+`F at q1QZ]brS0't_%OK"/>>KhJ:I<t@
+%jC1F1?ZQ*%eOhT/13uu\2sXhMpcr%=pTku+IDchdq%+4T-&h#.C"<JlS7ccGbA"qtR]G.<V)!IiIkJc@,A\ne#rrQsZoILWW;r&j
+%+BJ$=/nT2(!=*-*c`-,Bbrr&*YnDqV_ENFh'ZEaD_#t'`47XM\C.pTH;AqW!*Sojib)G$']u;otR:k27'$)37f\Yk"7p#30n)8el
+%51h.2n`Mg#Dn]'Pr%rLG>4Udmf at 0"WE_\AH:<u*-*tq6gg4GS#>GnuYNdRXmCa7>m]'N-[CGGb/HO,Y6kYFMBT?4K%RhYLfj&ss_
+%R0)Gbh_Foi%`&%B[U/7pRZQ+pZ-64oWP`L*Q]<%AhYU$<G`CMY\NG=\6V]4"3qp7Imkkbk89TI'P`AD`0[I#R4c)YEkW#M4Vu)u>
+%,^.jS]+%MsE<DbriTMfBcJtLsNB[:&*sWTEWE?>iTfo+ at Stba[PACg?^180,E"I"(Fj3J1L,;O.lm\g+!"5qq$<!iT\=R>;IS-N.
+%Kt2OtWaIfI_.^93b!t6Qo*]^E<>a`P,cU&`c2$]IUR>5I$J%88)"K!64m0cbC.Jkr:[aKq$hjUQ8KO7?i7B66VW^k6HTfEM%30nE
+%:BqCNDuIU3@@,a#J_A[R8L1AAZ6p.3EWod;BbclWB?EJ"#eAkOTl7eg'OudjDN/+B7li4^_Yn3If+ff%6o+74W8'N=auHQd-3po<
+%`+7Rg_*jV-H_Dn$bpd0)9_loK#.0t8iW(='e&$KVrm;,R*s-S#^@=cnrNp<.?[8?ZZrLFI#/3RuSV#g+pRNPsc at -\e\>L,hJHu?h
+%)_-'''48l!$64f^@D.6C:gc_BgO>U"#0Jf-J,;hCTdQ/4LC?)s3(=*/]P%&nqTGG_kh`[<Nm7C$\QS4->lU:-,AY!jS>gn\..5Rn
+%;^/'&I^!9768q2b_;V`=0;sq1]K6WY#8sS/Dot?O5R^Fll;l;q,F at qnhZTk>gubHfB[")h3R00#/AtCcDceRcH#KTMFYuMFf$&/U
+%G+42;94526))D2UC5Qkr*USI"9b,M!"3L!KS7(Z,s)]0#K_,$JJ)/&seOl>AdJ_IEh&1T'->7s3GoRYn]c,L>0EcZ6EZIpFI8ub7
+%41D4%//L.sP;q8d4V.2;^O3D(985R]5:,\;%o4*(h=@M(c]p^(!-!!baH&BSkp=;Y)FDWj%G4@:T?s([%J)/;S#;[X<&C.]YO.b3
+%7e^Tj'QY([55+HUTK$p]&B2-0+*'Rm`C9]5:i8:j"Q!-pHd'Vd[7d3\@qFdiidT,(nk*p1fi4cMHHAcd'[@CnJK**=Xuik[m&p0<
+%r?^Xg4FFug2)PqbJF,1]hC=iq:bp.CqtaeG0o'$=!IGd!Y.Wq[oUc`t at F@A451.#9SiUGqL:^!T.eWi-6l[:EY^Csr;u2q8=fIF6
+%NK&5?M?ELgT\"g3Dp++ at EAi!IqjB[Ad[$j*:0M)_H at T*@j$a$!ZYIDN]UIBJSka_B5g,XAEiS[I)s\BUfr4sj3j&,"nHLiYWpo;r
+%/-#00Ei2Z9V>q5::$[<R4m+]J8sd8!/lT<JIdXRriPU6N7_#M)!6P0@#PGT+BS]Zi4-D*eH'6cIRoC8XdMe*kUl+&dBc#:jh>'.d
+%$uJ_ipr[oZ,$h`"*1m7R.eBRRIs*oN\l`\M43!QHabHh6=*uQu\e><#F)[Y\QZ;U8c$($7cqVToG?hIeqrgW6J)i/`o?+5"3ZjU9
+%a;$;NVXk#7DX["]5!.S`+i;iCqCqkk>=W<(F6h].;q",Z>6ZB.&M1dmWgACW9jCu2^35g/qj4KND!2Tu^iIhBp71uKerCM$8\'s[
+%]W"EoeqB"\rVBJ(9D6"6S_96!4EK*(hY,*:FU#FcBM*1gQ"?L+Q#<XWAPJppF1)H<cRrLMRT at F1\WP?;8A2qXktO9C\aTbH#0&#?
+%:;S!=W4B&QXFJI)H,:$bOCQ+^fm1Kfh7%9BZE)\W%bFe2pqKm.''6]@5:dK5m5\<C"B&'$\X#aWk*M-8'*@`=G22L*]4BtM@!/FW
+%YTM'?>0h</&rr/GMKRp6;C?MS7XXX7haDui07fnk)b^n:P at .->Ng`;Og+\?r<[qJAAm8'c>0!\:%.Eug/\`tEGU4Ah-("``M:Sh:
+%4uY3dJ@)@(`TlB!UjR3b%r[D_Kf33<GurT<;c+<:\UN at d)!cJsPd0Z$*]M]R-*ed:ClCf%ckp!##oVB?3cJPRYiF4tHVG/TV!gR5
+%M^[V#7H1Q at Z!.T/E_-+rps9dr^9O$t+T$+LdK(dW9!k]1,(smDo"O4Z5"HTkeR"_SoWjNCeD"5<jGjCf"n8<!XnhE5C*-fdV4$tJ
+%,q/ikP4[2=,\Q30fJgoHcS*1"pj&35%c<GES%k/Er3\%R+#s/(?Cu/MSTN_um4fq[f$$(>CUAMIU.Mhj9[h7=#:e&P at BK&Hh5u8u
+%B3hU),;n1oWsB),N,fG-AD)_]^<gkC#PX"<c1V/#2?i??Ujg+\JYtFSQ&F%p7Dfi=O%Bl$s&;bVW>NdCZ6?#0PQu$^RfBrG7Gb(>
+%?E,aApZ5/I`+GX)4D:17gsarqDJKm=?-W')j>7r,O,CGr$N#r&25n"I%+h8Zd`Dr,.5L*jM2!@Rp.si)8Z04ROaiJraR_H5]N8ni
+%'WO*gG!VoaX;WYcFB%X at Z4'R4A*"]ZKZD<b<^bA<7F.SIL+:]K(QDb'0`",TRb at 4=PuHp=OY at 5ko9"23$d7"_i4n0jmi1Q-5DR at E
+%eVD]?]\#X3X2"@pO$/VT!/)*?C8CXLdi2I]M(),"a)))S\2A37-/P57iUFN_,G(+aC'"2cQl#triNjmD1`mu3bKe')$_ACBIoEoG
+%#[`EZA?<iEd2mkF='I+LkNuJC%t%Q+14MAGMCXKE=%4hdT-e5$&37j at b&P+.qWrqeYfhuPUR=5n!cI,RRbQBM%:q]3 at qpF:i<qZ[
+%e.SfVMhXbA&<dK`1\M015qt2-3I9fq:'h>d<7R'p00/he8NN2^rEI_MN-%!@e at oB)j1.01/<20Hjc0ub`S/Q[-;LfE'h?)?YI62&
+%Y;8^5J[:];pg`eQR].a.k%.0U'DY=f:;XIaEXtn_XXE;e]BNbYVUt9VNSds'IhIAd!upTERt#^U9.K8!@(@e\\Sf"%7rm<r>fXFd
+%T3ElR2cRr>Pk$tnH_:f0e'7!ZUsE":JXN^<e64]W40b[*X2=!W^TTb9L8T;Lq62Em%&GhYWB3escCK9%&:#GniX<l,4C7_,f7[)6
+%2Fnb<aen9i^<W$SEl7IPN.hQZI"MLNapN&51)cDMgLmcX&QjPL,f`SL`nUSVEF1__I/J(GW?1b$)9QmQ#V9j9'>,6"+-jGORF%u+
+%_r>M__)I0&DnGBEnkuW*1(1M9Kt+SaXD&o\U2?m"qToeZeki9".tU3f9N9ZhBcU4G4e>`<,l:O.nHl"h\YH,KZY^(sS)pc;8'(O$
+%LXLhbMhc!75tQ?jmIq42?C%Q=)7W\0b]4fAfC_=FrRF.Kbn)&<E[pm7dOq&`O:7%e.2kk8&O%dLUH at SY/.t>8\kSD8Y[88Mjq4^2
+%Ya at K5f&[7)]UD514)bF[]jQ]Pl_3!p at s/)pHC at EbQj<q/s#Gd,aW`*==R".9S*#-Q*T]c)!8!54=eu:f)Lj><@((\21qUhk;t_6H
+%Rl`RH\Vb?r[.i6C:VI6Db.hZdI/BO;/V3R;KTB<uoqKDOB*L%8DkS\*g0bcUM>e4?0f.],3i)KIN5 at 6RdaC]n9hDV)]([:*#OWN;
+%:/4[NGnp-b<\G_6GA86nXpls>E.:POZMa$BQ=qC9b,Tj]</J#f].5FQ3EG^u8Z(54dta7 at 8rIc(WK@@SY/EBlIt*)(Mf!Qq*/*4K
+%h@@M<2\^9Z+'M*N"PqqOl-'cu7VRJ8!G>0B]iO8\0gD1oj5aq8gZ$qmrq,._lW<^k&l<iRh59g7;K,L^4ULUWYf at V`MoV.K5-aoq
+%S:FmuYp at m;RHKd/m1B)aVM13=*q5OeGEM6j"<_Y_K=:=h"6[/XB.p.6_F`,J9Q':ehUMa0YiqTT#^Qq=FI8.)nmh:*C7^k%GaW6+
+%;gFeSS$Fak3H(=m"FH#]a!tH/2gFYZl3i/ZPcs[\no'-V'BW6gM/9335jUUdP`_9e[:afWRYQ7Zh]^g[]F6!V'mNBKi+O%uQhQkG
+%\$&^bSf$'`kn<Tjq=kDUH#(,o:Z7MpThuRfC3qd7WO(p6=&2XqIu/p#)k;HXRg_S5#(1g>c.s/D[)\';K;q5KOi-3"\loS235K(;
+%g</>.&+**eOjD=?Gfc:iI/\ps]K$SG^ZEt]C0L0ffg1oqbp8;>WIi!Ukr3$hmFP;qH.IgagJ55+3GesH&S]o$Ctd<@['a!43f@$:
+%2bM;DBX#E at Mdn7+0$^+!*T\*<*,ZMSCF&Lu/]3!ThY$*V"kYfthq(ptgX36@<@kMIU^MRlag80mZUVBW6+"V:;uTm<q=rsGepe$)
+%e?dQI?1+,lPJ$c_q^8*#0"d6sDtCkim4q2sI&d`I&H"i0c8TtrZDG4D03*>3P6p)+hX<j1fG<8!Os\?u=F9B-ZOa'9Q>BUiR!Aq-
+%1=ZW4-P3AYClg1LMSK"'0<o]ZEOg-_f"Cdq8dsuchUp!RE`-eKYlu.1oj@]N8Mcr&?V`3>_3Mrc#:0rH6Z"*[mO$j5`lLRhZYm[$
+%8qkO)Fk@'W,[R1,(&Mn6"1\s<4gf9,9R,]pN%g\*G??.OmjAsm:@*2%=<"RIC$hCS=l+,S%0Oe<So6B!Wb39IS&*`JX_gRAH'frA
+%2ZAm$nh)gY1nX16<C7oA;KlFXpHDD3F"'aN3a.BXi;\6WR]^^=9(5B at E^I<XK:c#/(A(Zpi(4OP>F8u>K?-c)1[jL7+rh51nMXu4
+%.Wo"TcU4O^DfTpKCNlD.W'"C4Org$SQ4g[R>Y'Oo-O'-gC8%=5b:>"p9kDE,KgB)r]8AYAnmM4D9+G`):r-Jnb4"Q&okaEd#8VCD
+%*0250el`^k\XX(n$cOJ7iQ4WIV+d8%Y2D)Ve"7b:$:94`om+kq^kTRC,*FL6aToY41Eji/IL;qiIu)i;%Y84I'c.fAUN+2IAjeL<
+%//j!GcPsLj4Br at c)B at s^6og5?_^bAW;Kr>9dj%\VD5g?PFnQ!s`=DDh>1.g+Cu%r)iqOOQSPrSB$ZDKs>ZGX;do.2>[L&X%2$5Dl
+%$m+_<Y^?fgIAaK90_+/k04d'+F'k+kS(7hBX5qu(oQVb^g0ir5O`)o%)Y4a6TDP@[T=^[jHWhalM3B;<5R-I(VTB'A*fCmPH102&
+%!)ANk\fKM?!rA8s9(YSUDkpd6k<(rgQkW:%nEBg')=dQ=rB9AX_Qs^[Bt_*e`CcX0+Iae1:)QbQ;Va>e!Ke"/cMjkObTh6T5YS\o
+%jlGc"_`OtBY:6sVgD7<oc^l:;kA-QaZ%1&bd.#f]9NO'[c\<N^hj)+,k/ue2(oaW,#P^.&iRS^9GsWi^)h.=Qm3MD-LKdH63+9!U
+%=*iLLNL&XJS\tZ;'S=.r\\$[JC&]WgdJ4I1L at +B&'pcnM=n&+_>#Ni*Fh.8`msJ1[F=XU<`PQaFA]6n92'THO]3*kcg at TM=4C[me
+%CS;b4r>=+J0K2m>4d0G9UNq;Jqjid9_;OcL`A58>h^\f#e.IZC5]+WH8_uI^`nK&h\H!H)\>%;'e^/V<4a6&T*1W:7U7P=3GFlT+
+%26[VBF_iW%]Ct>&TXc?++)f!h8-7TVjRN9h9#a at oM75sk&T?)[BmrC&`Q"p\["e252^eI_cgqE7.eAjHd[Y6j)LmW]7,ELT*ir"'
+%22+mjob()sFk/L0BV1h-,Kd8'(H#)=Q41068_g\$`LCeFh,<nSNFqmga7AJ)[+U8Do$62F-2'9GPAScU#u/CSFI:;7qBj/0&,a+g
+%J.oe9Y#on?rGeTq6up)@Rf`OG=g:1nK]K3\r)>a8/;f\<KFCedY`c2&Ydali?29hZ>=sr=V;*>668la4S?rg-_KpTimn*+$09"*J
+%cHl<ggt8uQ&#>"u^U7jKUka?^EEH7LfUbA(d&Z&_(T0,lno<U^R at mVrC%iRZ;QY\gZ^==?rcS:b<oKSfl2$Z"fpB6R\b9gQ8ns[Q
+%bTs9$o&eT)h0J?W_WK#8gNE]5f=DX?`o4j?cH1B7m&]M0'7;c6%4f*mWR(D8O*S9H&P99*dRltL/53Ue'3NNZT4bdua!E6[XfGFd
+%cS9\s*7bPeWLFI@=tXm0LElsP%=8uhZRO"q/EJQ[XtAH//0Gual";`a$7&iRl<n at hT^lG6cD#.j@$Tr?TCks-O<gtk]a]Zas+ at +=
+%8q`Fq02(g*NGE;,jf0b_!jdq>iHV0b=/r+422OjU1>1S)fD(#]eZseh;AF#-KiC*t?K^n=<6;i*_U@\GNgRFH28`='1>U5GJi@\R
+%ZBaZD9?VRmk#:'&dn'NY^@&@];[bhuLhpA2Q?0bpmBq/pS-F-c]G(+5`C3S:,qe$-<"1#eb;f7OGY`[M+$DpE?cerI8JJGd):KKI
+%^gbu=S)0(\6KcMra_h1Q;/k/9]T,5@'ogF-+)nhL;f\]q2ePkK2ooRj&%iRe=hhk?/keVB[&ZIU^9AT/q1t[i-3qh at lGHSe3d\S:
+%H(O]P1W`d)N"J)6fN2`Bi3C48#(1jrIedp*o-],P-'@d7"#okNBmDXq:[h8fg&#be?V-XiP+;lDr.7fV#;c![2^Et5ME]+FVGs'e
+%[TnrBiO7+4.Z at hN=&U"J[*MaLEE>t:hnA2-ObF8ZiRYUSHWgWO`!8A at E8oQ7A-5Q9bpQ7c3q"iAR4?[[7V-/Qms82"A*g\cj)AH=
+%i6YA;AITEVGQfY\mb<%]5r?:QH7l\'\j?Lo\M)/[7O9nIBTYH"D5\"?h-)-#1[D*-7!nO'pb4+/a!"e01&U?2"d16-[0m(RC3R8+
+%Km,slX@`(Sfmn?a1>^]Vj6NSbVhn1>gdl`6Br]dsZ!L?l+=NCCGRWDE)t"R?GY3_+1so2s*2udgMF.Cb]8a.Ck:^&+9R[Mnrt29$
+%HO0H)BZ^hn[Q/=IK\2&g&abK:iG)s.p+toIk;q>j\Bnke;dTK+]!DO]F^8(As"PG8[Mf[smJM`9=N\5Dh<+'0Po4"',Y3O&]?0+%
+%\8Z8FK9I*/!e"^_8*2=I-c$RDnca<$,kj>[/ZG_K']&JBP%QL*^'B7^ISi6oZs*pg.a=MDF&=E]ZLQ+qI^`!gDm#<?`0OS#TqHOW
+%#p9B5Dot+0QUFu53GT4JqiQTJYHl(A,jb6;pjJ;9mJKia1NH[,](dTT6pZ(;3G5,8EY\!k_o1bMf5tD&&0Y^D\spsk5W@]PjC-b!
+%]F%n9kf?&)jC$@22_o4iIT7h(K'r21FE$k@%CIqP*hI-Bq.UXFk?PBb-cEH7EG3uf#9 at T.o9AeKo%=qP9?tpt''*,65X_F#Vkmlr
+%]oOU+-6KLg5,X6jo,_]hfP-qh<f>\#)fis<+?IQU%RM=6'Mg'.kNO=8J%J?h\oqCAK;=cb7Xud?I[u4JbM6RbPfC-Fhi`"]>6KX8
+%#0XJG9Cn[,`ORirhm8codj")4;hFs+9$8&>=u<<scT[WDpD<`T'hC:?W:s!Pq)5`tO^TR^H9'&b^\jVOWX2 at rD\g!hEsg68F<RD+
+%m7qIf3%NZTR0)*j7`au+j"W_/RfGN#oRb`nSLLphZG3pjD-LV%3&bd at 8D3Xcp>$:aPi[hS4hC#s)-De:ClfLfXTp^F4/#!K7HKF2
+%nnCF\BUFFE'>b]il#(q_mVRB+0AHr;-57ha'I?cX!fX_,6jb-4?@D]&aW#B/GJ>6_UQ:tl5H$9s8/TuU'1a]ERCuY7ZKoV4#Wa8.
+%VF/S;"2?D+jBN.]lMi:H;UJgh^BYR\DjIS-H5SXHAa2[U$"cTgo3TW_(rYUa'<j#8ok.3)[NW]\=W)-!jDJ$cQBTP-ma&V7CZ?*D
+%_qr=fD6Y*I4sIBM9C.Ab3/WfSqqqBt!gRBnr<in?hI041/`^:6fa8&faiVm/FdAO;$Rb&*HD^o-!qqg:N[$tc$A+8CfpuZC>,:Db
+%,1/J+?(5jrjpGamN81c?<h#ERP=2YGX1p)R#0jGo?+QX!Zj:7YPoK0kF_Up3=m;/VgW at G:^PKM8eo6("Qh5EmHArk^P>p<rcTh;i
+%Nu]G;C6Gi%aiaor95WGT>An:3%)k0ia]+o\.]<VVE&-s$g at PE$#Jd!06.<:4>bSgK+7lp/RDes)guBF<'ET'p(h'h7qht6)ePnM!
+%"Q&W5TB#('e:P',Bp"a\-PCNbU--J3XmU=lA5AV4OiJ>"c\Eek!bA?#Lg-`O\A.SA3U8g%@:/uoBJDI%(AOn32B)@qQY4#^8.g9"
+%.Jd0PEmPp1Z*G<E)=o!hh"L*Wr"iP<2*[LXC677rD]Rr-BGm(lcT)F`@Z3&0'T^i<%i-qGocUKY/;9s:c9f9cck7b at 5ak_JSZ,U2
+%W>X#kbG?dP20hq/GH.#bX=FmRkucInamRmbm_=FRHSS16I<6.'fAp*",RrQ@>n06=7"n^eSsXMkS`H'c]YiVqh(52gYU<fQ9*`c\
+%QCKc--0WgpSof4/_SO<12_*'*jAP\,D9`=I88tuc3fAF]`?n(2#Wnd!BZa>n2iKRjS>LcL+-\..3s]tsgI_0>5[Q:k@[F6#['?kl
+%=!:odbR(gbG%cLUXtT]m0$U#!V`%Ncq:g(7Q'#Rf+Qm1Kh?WS[j3.s).fOJkfl_+\8QsbN.-+DY2D!-pqLKo7:he6CGLK at Tp<P!0
+%GV0Ldoa\Q\U!]7"T!*"\78T<JE1?H"(*UaZ2q-:&MXU3]7+JpqKeb1)F.9<=4b,=Yl6':CS at SmoI.YT>VWd1"BGd`5S>:&C?rb2.
+%hPGV+Bp8[:q4e4C2&Vuh'fhf6_jbj8BOMJ+^&p=fdnkY,D#N$H>WM[d1Ei(6Bifn-]6>4TWI%TSAAId7QFsn=l&.)O0rKDU!3U&*
+%AP\DVgH^QO7jSF3.sLD+g&9V<M_2=qPKmn>"9n'"SO2SL)qL"elb"p>Q(bO\RbJHM=)h!o at GUq@W)Va;ZAk/X]<M?3**fGf,@^,-
+%Y22b"6s;2%BG/g_[usj6cfKaR7J-RVp)Wh1)5YlpD`n)ocCIDJ9C>B[6XQ'J,'ThBd.^1-bnctE^R_U7;]td7N!kJp5XTut5#b:>
+%`Mf'?HK)Vt+c6CAIbL2 at ap$tQFg3gTcIobM8^Vq7-=;sE%JOdi%"ha\b)tk109[4TG;pf'o)sLQTrCVIihg3bQZ0YpWS].bV&#Tl
+%(edY&k9dk>V at 1^,(g"`<`TG_rOR+gnVm(RKVU>H]TJt2_"i5J.kFKQ?WbITj4SRBH"k at 2N*NipG!+=Tj]`L;VZl[EG(RER_o4cZ&
+%B>)cs*Z*m5<)it-5<5$9@\4Y#P6=C`j"meZM5]r"ff=5L6!p(_de^a+7)YcEG_pfY`TU^ZR9dn8XZ",=.I?qm=n/_3a\N;tQ"@i,
+%[51YZDY_iK4&aPLBb1j!$"k<sk98q^^2jUV#V`'[IHsbkYYtK-ki!S,j.ET>8\p\mn<)&!0DIj40KJru/0P'+e\C"CLi`-SZDFn+
+%^r*Cka?<*-Agi(n6e26fPKA at C*6i]N'0,A5EsTo#VkKgmq';iu&X`%rp3<+)aAnM_Z.=RQ)JT9T)eXo'^3Q9ib%3;9NYKa0i'RN*
+%`E<@nm!BV!-0Cl2W5<USIBpK7r+[O$^2o1oe0mkA(?64\$Y&Z%:gCMB-HbXHHqeWr\o7s%D599"7-6+Tc at tkXO>VRJLSNp"2VO]q
+%rC=FG[iiLfe8C!sdlF]"ZNZhjQ9_XCf\!`W at jh!@.`c/nBh(.X]S>-2mJ]kP5_?HCc(k4TZ<NJ8ciT.\]RDJP5*rS\4`*-FrHuK@
+%B%8c3s2n,B"-V&';5e6!;Oj:]elk*HaZN`oJ0_2;XX5Uh&.hVXI!_N1EZBr7:F00<6mLee/m;Rsd]AO+C"NK*_Y@\f_n+!4'%L at 0
+%'RQg?"?GX""bd1n*BkgCS:d"bSU07=EQLi"c=9>se:Se>0=45iTg;+OG9j at 5DUGm^Z,Q.ENK2Xf/3[Ci]b8Xl.iBipbnm#$-#QC1
+%(<rGG5ca^EpsjI\8s"u$rfo:%%p at HI/(*Cq=.Oq23r:Gn_f]_')Omo<g?hhcT%6dq*),TeVCRL`V;[Upo'KBNrm[lA]\/YMZpmoK
+%oAIb8e"pr^^BDQo53$J*jq?@N2eW-JN)>dSN3QR#e=)O_^Lc4<p?F,62spSr_66^D%/M6XU=<A[U,=[ldG&(R at H2BU,^f'kVj+3M
+%Ui>L'Pu<t&*p&'m7/TKb*r1P- at f&&6-=RX-*/TOM"2`386kB$2835qh+Idt3T<^W+V!Ts:(Se*@)^2?M3ZJ?OWH/#Z?eI'n^trlZ
+%]kYWpWeb]iK$l@"W%4L]9f7V9)(Re/4g7SR??/^,'\hNaeJtN`54KXFR.neQ\Ze6e5<gC>r:=/m2G*]o\1imhAPu$9a.VsTGF"`E
+%BrnNmf_H+s4'0tJ;bNklPF([f%P7o:k)_`:Km8W+D(UCj;bl$PQs-HbIOPhl2(Gl_TMe*knC`-c-rlC4H1o26-&8()?m8X7X#XUg
+%ndStq-0b'cqJ;/LZos7/b$s@@9-=q&lAE#u&[XXeA5_[%k+3Bo7[e at CB@:<CEt0U.k,oUo[D3Fu-q6QZkq%N_ at U#Bs<Q<H9*+"#j
+%CFMBZ#4_\G_d&TTd+?D]DB#Rb<!A'Em$;G25O.NnWkj-\5,=:#2*S^2o)e1f;n*/6[KG19#%Ud.KRnkFPG]]FP`m_hSP?/+B`:Hd
+%Vrob`b"^qk[%t345D;dgYs9@'R`U\9d+"o"=-1iqeg"lRjl*OnR)-C!9Fa9 at A0q-#&mo_ at P4Q,*C8e63iGt)8jcH$>]KN:M9Bsm$
+%hCc0?$L)=>Z>JjXabg,gGXsc/c6O:gYfnMD,<rkB=FS)&YCMd$+=APu<;`u_,6p;lS.C!^6s0gCYPVjB2;=T. at K4n[S(X=Us3*S<
+%EGi\APYdiXNYt(SKj:hsUN3BQdX at L?(s06&s7>lGP4siCZCu:i_KVTsG?Q8)]m).)7`^#NA/,&LGkSSc<e_l]-%,JI*?&i(CV2[R
+%Gf9t@@+7T-8afE>(n%l2Ea[NT1d51o2DN[LOqf)=Uc'2hPuC/JIF3u`&BYekP37,\XHcRJ0'9%a=7Wi!@iU,aFb4Bf1o`JPZK#eJ
+%h)Z-j`^YT8fhtUs)1WnC?ML4i12*9HZX6:*2AJO#a6GQ. at 3K,EYY6MPG+%4(=&SHi6;bmdBcES?r?gD)D<)mK*H*s7%oua(),jrt
+%anUFrP``.7qo8n=J!htICg1pdlmeQ*D*E[-8a:#_)Gp^[_^3!`1o%smf0!X3]RYqdO=>O:Ya[Zc-^LmtijPb,qUS)dbtPL=hXQl*
+%&S/+G_">>RR1?aD4b*"A(]99rB\P+[4m89>N^aJ<e&g?cYm`_h<.43jSQ*4hF0`op2?)6OViJCP.cb;8]<u"KiHNp`Z-V<.$T4UK
+%D'A.TMQQt_7W-\/bZm0:ItLGH0RD3j9hN"^'J`Sh&[b:er6ia2ql.[c;e([lk*1LJID:G4[8P;=l:YhRGW>9$=TXZT_+tEgFr&@T
+%2.U at 4Q8!"XqgHIlnXUWne<*WA1-^kCH)B$8Tr.in[45_NaH^6i$=i,4P4jmoQ/d)N4p3thhqD"YS2\E1L'P8D8M.L6hdbI9k"c\i
+%jCQA!l",mpE,;C9k\<f!=pGP[iDsa98u),X%sq9?i/_%2Xf8/NTQft(<(O\$XSrsCCPp at 1](<Z%FkD3fLmcuR;bE8oUJ!qn,7-^D
+%bP=86d>WaU[*b"@1/pNur at -t6M4LV?;Fe$UIhUNj\5V#7KQhn_q0Y[MEE=*e!=R[_.Oqio^J^U:0cWEN[DC0DQ(:1Ij_4p`3EhL6
+%'$9-s6p84g394ZbQ`s.d6S at K5eut5Q]i^o\oXL<^jM'0Yh&j82gt`q>9oJ[+WFb\Y-1,&`.g\`)S!Du9O(b\gHjL,2oOF95KV[p!
+%Xi&G76$Ii,j$`l]>FoT=hfe5>oTVHC_nm[jYmari%K at Rf.V4@))\bY/ALPom&?OD3.9D?T1'FQ]$+.8i>GfDnd#)O!;7Y!Ak'j5K
+%7BM$nj`hf!0<:spl<3Y;29HWo`.h?i:uSf2Nd@)QD[fOicEfqd<>^rddV`\m`rD^Wp$eeA;^abX3Y/&ic,'f[_-Ye=?Tc<P#0+(6
+%Xl(_;?X4Ek'/\fG91%[g?N58=TQuLonuq)YDL*TE<Dse@==iX9B$o3Xp%'IXaE&f+m"$N^dcl#u#2Os>9Nq$Io5]FjXHlk5T*NnF
+%9L=>ch;VjP7NdZp5;.;^i87e</@O.3EaHlhn*B7CleO,R<:ln)3eE:N^piCJc!oVdNlWMBiI'&$`Vr%]biU>f[&X)f*\>XRr at 4cM
+%+3.*N&\^Cg4R](Tj\5pr"^.Q,k#j(Ujsr$)8VsY],X<$NP at cuE.B;0q4BJh`jH<l%.V*TBq]I"o[u%<1OKZnYh$.93HRGOcGZa!.
+%V=(Y5b2DL4nP'j/ap-;Siu:VRN)Zpl7o(bhL)H`=?>0ER3LH?sGHPIklCKcCD6jc%W>7ZfhEJ?5T'2X4HgUnV?9VF$Hh>k2DBlQA
+%Y`@G)npu-Z-Yr9NhS>Re1%u8EEBIAY*o-H=#Dm6=<7-)aKhY=aD!e/jP8"5pJsLDS`[X1g>4TMCkLB*sj3:D9cOXDXJbT1,f*2IX
+%Urie.ntN<"o\EG7l&HbPdBI'm[fXu<l/qm6?[1n at N;e2>eY^(8%k!,)j;in?rk%:C\ZcnC[l6h<+Op$W4nc-Z[BD56V!7*CPB71a
+%P_EF%Ije\>h4p,b:HYBA*`,1W1^PQpkahLq,/hRI+*ttCIN^)-7(('qpIGYf,;nXk-^Tp?Ae3EPAs,M5H'q_*+8a2^I<YA7Rd[%8
+%9&(<Tc_l2D%5r!PWL3Y5Qh6CSh4J?V!<:,+/.!c+`JWXL"A>OC98)p7Cd"g<;kr38#_JSl5g4Q+.@(Ao+T_'+>Y&uZ\3)+LfW at kr
+%Oh)]u2.u[;^6H9ek:-H+-'iGr1P`esh2\ek at 4oL+k?6nF=\IDLmd3,[^GY2"mj_>KEEF at jpk`4Sf+Uo"na:U0I0"nh_%q^]R6]C1
+%7\R2ZFf(2`7%[6n0^S4V1_d;OmUN]d]Rbdd;jg7Qac/FMP5g,5BdMhP'6juIW)"W$S%#`9U9F<VdeN*</GU"FjIkU22R?jIO,auR
+%b.m0`R1+2>1R#"3%1m5JPfVrjNleB,GE_Kf6XXT4V]MFYm8P=r*!?L)Ss/#Nm`3Q48t!=sCRuunZ*P'?m8,[,:rR\nhHo@^`Xqgp
+%%,_I:cU/q5<*Y$r5,K2sZ;7(HSa9aXN)nbE_>bDH%Hjnf_QmPp"e`e+A-"nT6:oX^P%P($bU"oYY,hT6fU+"9[:e-Pl[SiS">)qL
+%`1BoO-PW at s+\e?i`80B$(XDYg2]&tu#5b_HS[q?-UD=b0*K+iapXNQX6o#VNGuoiCmE7L:N-JZOJ'B$jbP_dW-o1P5-FlFlO4uql
+%3lIKMS!u\;Zu!NSbkiE+CcTCo&6)0F5cV,(\pG%qJqEFTSjAj&nlk;aSVNJHYj',r&!2TdR-(0I&h"9>1>jZ]MRM!G3pBZRIK)&]
+%K.,8kW##?`HVAbUUFToL/NAk at Hk<er>bK+uho%BEbDhUK;Il]P`s_#8;dSn*H.fsm1t/b-A8g#G=hZ)(=(K6eF]%&&9F7)+RZ7qP
+%aqksGB_!q)1`W2!SUuI`6[h2aUkCc9Eq:p?q*<_Ao+e.MH!YV84IRok=PJ?A#-&!.GmVo2DWl!&0Ngf],U_NE$%Z5#I)dLNg*q7:
+%/HsUegrH1SG]R*\_3:/deqnP,"R)`kcm%j_-`/OmhVY_C:>1#@D5AnTWUh!l]R3D0F>92[]p!tj),+k*l)'808L_1_$VV:Dc`V3I
+%aT at V^iu=jqSp5;81k!^M^H$\=MRXKE>uOf_(FYoGB)W)C'tS)0s1^"`fe(T!:+'8jd;P6CEfP.;/0)66\]>!fK]L at k"XdG*%H8#p
+%#Wq+J9-ro'=A)ZLlQ!\CRo^pR^HI:@AiYTV?2q"3F*N?"- at s1`1Na\6b'gjJSTfN4VlFM^VR)o%M2K_J5I<9&4o_1FAe,j>;+KTg
+%B><Xro(fmS`YA8$+?-K[E"BR9lh[2]7>][9rWGaQ#ZkJLA1bmO*eCUIe/(*6Ml`&W+st98 at U/uRIJ(/HFV7\h=35#/(*f;7Iok2E
+%g%B5uV().ckL2UIm$C<<?+<OWZ_<>:p<eE9KjJi_iL1Gs71GG_1>0Fhd=P/5X[IW$^DU)-q7:]p1ORb#o!R?-Z[PhFg-h^MZ#bl<
+%R5f'*'RZSJ,fU#P;LLhQhec_l3<ZV498b8IO,lq`oa;E*"*--f;aI">C!W"/njBs_^RRU(\JL!5b%'ubj,li>A(Ek?hX>o":(LFi
+%:[:.3FZatbfRDCo&J@#'Hic(APNP&8=pnj]m.=S:c:iV>&-RiaOn0aDoUG(/o\t8+0*mG+HKt8fGLCK\]n5EG.WRM`W<+G\jbj;2
+%';Wm,8D26+Grs\iUtW4+aXWK3>Auk8aM`iG)#0(n,1-\TkQH]V0J$PY\-TJY"6f?HDH/p_5C;Ps2a/pa(e+E;8KJO%[&_(KCTr8;
+%pP2%B*an97jB2tCp0d=,km-=6(iU\f0h at qm5n0<4,!0rhA*ash2G`("\L8VSMnt:T9gX"]c5,K^,o::S]0NP:$2m&"h6Xs76&qG6
+%1t]K#"nRc$c74V<@.)C\f.pLubaD`"'6'O7I)N*4\j"0k.I^4Sr&@pfFdqeZA`MRUCL*,U0btXE-%1hR;k6(,gn]q:E".M5[bJ&m
+%b*4- at FqRc.;ZW?JX)Vp4k8^Fnb[gN4pUAV-d.$*5_4ML`$o.ckZ,t&oEW>q$F"s:9[k4L_/aRR2=;9WpTooe*)j;2a@/XTh9:.fe
+%4MX/"YK:S<N906Rf+t1=frR%^oja\$ZM^YFpN'MJh?N;tU,AK$E\>pf'%j])doJCJ[<UFt?YZOn)GK"`'gEpmC:Q:f2eN4k@:,C+
+%Zi=c<c9aVm8L7NapDJ^*&NQsP(9I3!fkTboG4d at _^,GBW[+4^WF)i_q2&@He_+YB%52S!5-C*`ID"=.=P)BObF[Lmo/d#S>KMRJ5
+%#HtFCOg)=-5$e2]4tV:M(Z=FJ;)4K'?']n.j at r/a,gCA$LfgQS8K"\WP=L8'@CC<0WL-$RLI#b*:X9_RO*eG%oIdaAnr:e9:Q:R'
+%*]k%e-]fpa8eBF'rp8DTPb4cOe0Te!;P*$D:gW-kb9HDJ+IG++)#b_]9[(7bheKJ$:>`&MjgLFhH]UoBIr5#GI5>"`@qXrs>OoJA
+%BsX+1cJ_9[E=gqf.7)=)4?nM1Y?s)6UiK\NAZi(QQR!E:PSJjli!(3'lJZA26V`#pHqTPb.-'8r9F,(,gS at 6[B>H2]o'I&%Clpls
+%2E5;ji"PAp6RgKPA^?]Vq/epH8`&Oq#a+o=n(l7$'@r!U:dF2WE6W!$8J.\NB=0P'ARbV*3$qH[Ikg2&*5=ft^iGt%VlfpZQrV#C
+%L2UK/0KR)%BkuD/oUKu6,)A6`1m&C.!r.^1!sH-amGF>Apb4M%0Ts"q"QS'"br79Zf0.ZeM0l'\Ys$f*H-Zq at GNB5GN*+=NnA0_]
+%f'0AH><0eaANPP$-dNAG%uR[goWkTGH"WDoie98<'WOX/&"Sd:?'8l>Bt>babLKBL]`BX,_&c?#FfmO-5G>G`#WkZOm0O2le at FS1
+%ht/*R16bAOhC,/V,ho1^->$kQ/mm#];kbJUKfL:OBX=NMS5<=^C>p;j^^Q9Z$!m$m_6p_f.ag-38F]?mT[<AVT>]s:.0t=+oM=r!
+%p5[CPDJPa@:J'28#1^HTccETFX0\Xi+#">:mMr9m3HZdY#PHn&rVX(OX"EeX4=.h0+mqhd0+g's\go=oR`N])8RACfPJ5 at RN-1n6
+%3V<Q9%l;#<bp^Z.[YZn6pd&:1,Y\al?oBn!f8r=!Tha++pUlG$9<\=lO^CfI49Penr2e4`V[bK.A"W=!dgW]Z#u>r^^*LjRmf3\p
+%THGO;Q at +2L8=(o:3JZRjd7;rl+$VTB\mUmOh^::'&d(-E#TS_dS1qaS"J(_TG;.b3JL,IbaO2#TX;eoY.[s]8]C<J-ShX<?K1S$B
+%E+,M;DC>2b\@c\hP/c1f]2H2eNI%S/VJJHSR7 at nbnGALdhmN_6U>lHm1($U+@`EsFqIr8Le%bX"lm-mT=B#"3Z+T8l2IIuK,1gGr
+%e\r+o56'l9/0qe8/<a8/4O]llU`EeE5+j&'6[L;6RN%3RIumo0npE-%#+>8l+%;Or6)+n1CFKfd&7Jik0XP^;,GXcMBr5jMmKDeB
+%,=+BJ[j&R&cHa%ILYSYcGo6T]l4i<[$GONMdH2&YpfW'f-Wr&_T,ZUcG6r*AYhY:R0p_m0?t;7'mhuaEU2[LLb'!Z,j:3_PH6+e%
+%$e/;pF.liWQo!XBE_66A(-bej]g?6;+ou1q6r(0o.HNNZSS!:6aC?AG=.kW0qWH&PU8J^lOU"-OkG#k;T-+0?2QXEs4I)J;i%YV+
+%,\QK,GKm$YrC8N"g?d at 1#-&)T at mf8GVS6c_ajt"4]]rQ3*dnZ0R*NuMI?YU324h#=]>;9cg at Gu)[2STDT%'VZ$RcKrai2AYbJ7l[
+%c?<[]ne0m/qVnP<)"$VeQD<A7\^A%uTA7C$Ln$DnODGRfRI6d,6q9:`49mL8.[u0i43aUi at CO%A67Mpp`B]tHC6cm.(PJ4aE$l`r
+%YkOa<l at EX/,Oct,";@mDKt:+"G8Df_RCBj.2=PD)M>pU\;/6eDISA'H^WsdTop=l%[7g#scpE_5+3PtKj/uT-9Y$>I/=63s)^W#'
+%EDBa]Zs43&BVVfLP_!6T4iCn&4p<U+mYb4PaVV3&P6]DeD7aOH]#E(t6[3(b-ft,D:;Pkj=Df:9)mI*RPW,mG+bfS%/TUP!4qu]\
+%RTub>%<g[VUtlYgfUkAW%dSCA,eL_1DsicfX5F3;os)AE<m%M(%#AKCF.J6.h>2WgM9N3-A]?J#"H4_/.J#$aZ!$gmE2R&pIN-u/
+%eM_NR=RP)Q'&j)6o6o5/c^bD(dU.=feSQR.m/g_3&8Y'k,PPU!qju:lir)gfJr9`+DX0KQGp'ZI&"e3Oo5[(@"%knpSqfU,hGsQN
+%UO&L=Wf!Z"Z*@0aVtO%nO at d(imgH;M+75;P)JC at fCnW::P3!u)EDttiHodjU<L77R at hK%Aa"5[jj(%AdVJtdDEbU-S8==.PmD)8.
+%U6g.pa[?UOF6sr&?1]oppLjkH8Z[Wl+GNTgcTUZO.FAfC>4!/_.!4A"?R9=Tn#P#cnjUgdc5jsqpu=d%o3LXuWDINhY=c=VPJ!O1
+%^89+WT%bUOanp8UmI0^>-C^]Yflm8TQY(CNaNL!O_9Q!6A3(F[-2!XB>+1:!&(Yf1$@_7t4P!9A4Ff=)"r0-#1WA,t[3?uWr:!\L
+%2d^A^7B-7ZSES`R at L.Y<GenAHkFOGlkADdgK+^T1H`)cS5>N2uhJ<*9W2_:f\l2XpQeA/\\?GXnPLms<^jA]6O":cp4JJ.`"K;I[
+%.i2V?<%tNqDGB0qCQF)E_*HaKP8""jeHC](e%,^)dCO/CerbJ[.\Y+37bmI=;FhQ_pQi9r)4,Fc[*0LJ^H(5<`n"]B&9u$9`2k?:
+%7KQ4o(5ioX8Y0#+-^t%t?=4nA3<slQ"5>Ssbrl)Y+Rt[+aE"0`8t6)^%flVU'rOM,eip at 5"'k<mPuN_'8>a,g1p5LDcEZ&#kT+DA
+%XQ)+7$K%-,f^uqYSJbT$;i6Ub:>KMX&o5?1b1&cdR(Tu#bKk?;Rs'-IA=I?CK-.m$59lMW5Rl>eLSjN%ba*>8&h&D,R!`2 at e!=9@
+%Xp/5g9Z_ at tIGJj>;s`WYdC;5rI[<<`Z(B!i3S4roH(Z]is7rnm78q:bCHh5_WFSaV.N3X8(>KQ7CeR#PJR/'p*JK(1N*j3[40S9[
+%Jjt#*D#*[gc(Epq05*`)Ms8*r]JQg>R<miPVLk:q9m.n>Z[DSr%-*Y71u,c_F6>`laW,qo6h6lZN'`R^!2g!o?#$lHQtX2m"AP3Z
+%Qu4j/l><p`;%gT90(UiDBfSnE':4=4\pmsJXGN%4]LbC)X!@cs$@Yc;8=1Y&Gi!Kq_JqPb@))<i!ko.ZG3Y+k49!HK)L)UBRVYL!
+%FfL/]H"X3>#](c?"XrH6-<(&La*o^U*96]lo#\)nr</8d&/'5<c%FQ3BQDjiTA$9NE>^`=5LMDB561t3r.BTTCkS[14`T'KaL6l"
+%ka%T*SfAo!fl5O!h`5_C2^[I+?!io>WF#q>m4:092M$-m89p21(;n23n,ZtEpL7,_(l1j]ZfGC`,`(O&2b]d,o>"oD.M at C)Z\*`@
+%m_<Y#0lXSMQaI9nS%n+^-Ldiqc7cFPX$t&ip%la+aYMJ4oj]7GnHjcI.E6e;=(@_0LS2j/`J\03OK.89hGUO0q$r7GUjuA';Yp1M
+%:-Z'Z at XE]?QO2<5jOFkj;fND36Hu4q at qC5(^89hMn%i9?'\Cml;lXtcM5]WJ$Z[P<`HuCHVd2]D+O`S=$['d.g5:CZ:+`U_Hq at +h
+%O4'3+&UG5qH1X.lXIa7gA]Q42)2dS.ofn)2P7gbKIEj/9O8p5JRUspK8g<>:Na]brr#K\j1G6M6o]?'&"G at RHjKq-_TU_MlkS.H`
+%(?s1W;WKqJC15O$P.#N(`8]9"H><P/(<lUhI=P="<0-_L1u&SL3^N$JCOtq%`k]=>A4#+d][arkq]S::F,.Qq@#7<(GK8Pm88CNM
+%\P0o:"!QYj*lp.5Zna59`"NK,A at UIWK0\hA#rK%6Vp&QI7\fHY#r:!1 at bMjkO*aSqY"BEp$^r/5cu["FC%BI?oDGIt"9Bq.oZESM
+%*_WPM)h\)SV0eVB,SNF]W at P_II1EE(\jW`,:]akdG;+j!X\>^-)fMu+^2=tK-*`#NQGNBK$(l1CZGn+nE:7jCRY.#LA40**Y at FO>
+%Rb[lr>DS5?e\c2rH.&/p2JB3f&5.=rS>h`n>B?ed8+c]G4Y\c9CYQLZg*uic(p3DYOIN[e8Zb`m8AKVP!KM5&kL#16ln<H.'#KHY
+%pnBh\:,>ApAL&O!M3abU,/)/R[j1;\!00tHmM at s&m8Fpa$&0;A)h)+bA89\k!ZHq5r@(5Lq@]XnVcJNFPBp!e(U,XUV7&68lrWnf
+%XY4jLYGnIu`$/k#*)mRHlRsEM?:;1RPiFu7HW.DqaDehDg#OB);93U4R3o6?dRG)E4]2-p*__"]k,VP:>KR9,YIH(X0#iKfrkUAG
+%DAQ]@?$[buVdp\AelMhb5-H9H+LU8FrcfgDb'V7.m;D3oj77>APR/JO/%e(C"ja9Z"%R8#cHQWLG:9M]-_]I.#<?AjE]!*HL%I6d
+%fRAnVs5)5Y/][TNS at aji1!&R:C/S<-a;e4JS>MiqlTs"!&`d81EV_+,'DejXJG,*)2r)&WDPeh-lXbB9%tPB[5]&bZ:=I)eRq\j%
+%?aS4rB,Mo8WXs!R<KSEEPMT?UB703F+s5,kG;.Z6f<1N)jT\iB\cDUQ4jqZbp\l^uJqO3Hr7F_HQCU]Hq&S5>Z;:=u$n(h([eEq-
+%PfB9!(Te':oA1nWdY08 at nLMNDQ,!pRU>V!$7pL(rRJ^p#\m%fgDk`;<#`i3&S=OWP7$_&(NZ"gKO1o>NCN<KNDq]u=P76%o,#JnF
+%/bYWpK1)Q@]O9'iEGI0u+/Ste$gcj/7)XY^hY;k"12Qq*/_pp^+fX_b0Tt)3Qf7[%(qjtkhD.OV+/Mt!bR]s>inR`N3rtrAVVfB#
+%CuF)M at Y3YI^P1p_r at 7@DY=?V;"tD2d#o2KGGTo*aoMh2_D5Z^(;S1't1d&HoF^#5A?LK=s1mC,3Lj'Ko>Id%bKGNl%7aP9:D5:PI
+%'OdJqGa1)mqZKk'&5m?cG+FigDQc6\pm`.#?<UK7r6BrY6I&eeS'^G2l5WNp_Rr4hPc31:<cYKiH6%jEa34]'FfOP&B!>!AOD\bU
+%Vk+cml.T0cQGn"i!Rml at JX:^B4X3oV)48_scu[h,>h^_X+d833O+?\PTbP>o^6=p@/i<u^0M4%gU7%/]O;_<+-*^q+)LigjWR_Ee
+%,O7tW6N#S8dILCN9'Y$[c`$TsIWmPPeS.*er4XUD9`i%,o\DG1nq?2P^k@)ob'tcdmnOXtm'*JdEu6BPoD&IFPF.J_Iap0^jY]+$
+%B6)`!<1^5cjK>$<A30K>5;bYDB;-08bH*pp'F-SSn6/[h;6:@,>Ij_DJBgt<TkDi*fe1i_JJa5.)nXOZ*;_d07qV[t9)(, at hnubt
+%9?V5OWJ[]%R at mH1G*Fd>W1>t1%okMW%+NMXE?:'N;M.1-oB)n%l7i(XmB<pj%TCa;XDA>k1'""uTN972M%l_$2l at TUGY+;6OTp,s
+%0 at S3/p[^Y at TV_No%-IHIA$BTPnq^1Aie9"lSoeSA0YK\mhH1ut%niWuStTHMp[5u_!<0V at jfs@BbpPZZSWq*s=GhBFB"t='Sgrsb
+%kF)?@3=,7L6I,=S=CiZ2l5+JQhiF at lS7TB3Q4JTGn)-KZpk>kj7;SqVh)rE0WIku2K)79"k!t&LAm:Z-$7GU7EpH!'l>1Y7)\R&Z
+%Zb"0if[bY7%so;"HCor4e4//Q`:;EmMmkO\#>/+?X[tl*3HDO*:,CApj6R$g-Xn^jhN(Lk(#TjDh.Y83e!Oue4R21=WHOAt3Bn%V
+%KW<%od7Fep/[^JgRk<VMk7WX[qDM(CUTXpQfBklsC,mt$Fg!"8g3't,D9c%hClG\6o:D:3rH6](c9hnLmp`2*G$`#2jB,"C+N!,u
+%1h'\d-jY$e"S3%ojMKj324,o!qe\jgk^o<tU;ao^/&sEi8\Vk9/'mu[C6FkoBQ[I0o94ue$Jh][*\P><Q1k8=1<5h$9V-*j@%!W'
+%I:mQCC2up[YUJG!9smui10>ZIPu%(\]sMGD&AQpJ#52TKQO\%B:PoO;8m4#uZVuH?)m>dPj=2fii0sm\dMW1'DJJ!h3u4)<H6d8:
+%+AW@"^<(N2;Q;$%"U at 2*k!\>6I:M!@m/aoB]7r&0[<LqOH&(_?PNDsgJnRr<(qE'5UofUWOEd6c&8Y(#j:.pDm$qa#*62hY?T#nX
+%?^-Cf&tBF9,n\O at PWZQW3/!-0)?%<8,.^2'_/[mQd_[llFWPEgps*F0",W2H$d5<s?>rUr6MWG]3:E%E;%V6gO:)Je9:Sc)ZNoVt
+%+FWa&R4?\@-d2_K'%>m5G)/ICpar*pO7M%IDlJKk%E#@PeiY+ahE1D]e'SYMq#Y_c2<[Fd?;+5kg<`\I$KmE09]8L)B_CG8#G<+T
+%as\A_d*\q:.ihE7fuSLkZsV+?V]Qn_[nq2.AWrl.:`Th/s7'_u9/O;3 at O\aLdrrS9r?6X\"fCbP&rT'!40>09b2MV\SOX[B9U+U2
+%l?s.LM;5%1LLl!*#=6`!"<mfR-fOD&W37<-lJl.<</F/:JV]hj^#(7LrT*]T at jc5SA,5898nPUBq=jNP=k8r0O`(eSDUUhAR6_H;
+%_5[IV:Bna\9_kgSS'P^"Ut'.M>\lnkG'=#MSWs"\L,NXF`Kk>L*1/-V^YXc6-3B`+BKL)TZgtp"G?_.2?GAqLOKMo=*/^1bjIjRA
+%eXeoe/_leFN=HR@'R3H"_GN=)gR<N0X,%\agp3]=&sSM_qQ?2cM=um(^;8lqT]7./^43tGVeGI[;Sl"VO>m-$0?6;dh.07P4nCS`
+%Mno'sr^T949hZ#W=S\(`?m'J+e;@%S1M(E1g,tZcgV6]TCER#oe;^bjEQUN;$plB"Y92lgF@`#'irUsC'BI$c$J\hnYW$iu*-,*:
+%$(C6+M9!]M'pP at M0\iW+,QYe>1Jl)gFNQ4.W]$<m<&%-.cL\CeI[g,'$C7FS1&.U"bT_hL]Rje%gOgsJOVl7,a%&UQb2kKW3ks\0
+%oqc`_kW4LNY'N"IOGWO_P),=A94H6ai'9S:`D)URF7F*>s/]boCZO_,lfK7^M\KqZMP,:scqVET[r7rsdV\@=:F/HU4K^$)OT6Rk
+%8T'hT'fgMjmq9pg?g"4:`C<$f)9@)Z.0RMQb``1APK^C(NnH,Z/G&%'0BEcA-(h`mC'EXh8eEW;;Tim8Nt>->6FnZFRV"RYTL"UF
+%@:(Vg7B?9ep6OHQjiFoaRVjdSDEhcN-O2O*rV at 1?><"$mpip$!N[3Q%>R`capHp-4!+ at aSf'iRa<JcrYA9Wh-euJ%@f4TAm58,rX
+%gD\M>BWnsOqGI>,f9of_;fE_D*(do9PN5:U3lP<"g6u68l^(O*SPGSbjCBON2%)26_dk3AO_uCH^2o23^amNU*8n!X'g at M6%]O8Q
+%[(Q2P!s[R?45mr<>T,I#NO(b3;dGRX5\]m69RH-VNcIQO8i9+a,iu;-*a>h%@%/0i4?U;kMo<Zhn<jk_F%c+o5(1Hc_o<Gm7Y&uY
+%qWamIV,;oVDq_0rOJ4RsM#tl36p^3JCd7m?#BnEnm-C/T1Thfl6/]Om]0H%%g$,m!;n;e].:etWH:71cJ<upp45NUf+5>NJdkE)_
+%p!E=K6"_Q*Zuas>h_f\G$pgPDUu/$NpX1`0!a8OOkK!_DL1\o(l1lmfjt9\`.et5J:5$N![p:AFT8aZ;`RJLu]2d8cCa2//0R[t,
+%n5,%=QDCk`dTFL1c1BVD3Wo'Xa^uoZgC&W&L+JSt8C#r)2c*n.N9<u!r'>u#Ep[m3FnuUW[X=Pacf:@Di0bbjJ`T.Bno<V*[NphZ
+%O1+,4r5#/hD7hj6,VIFPnhDllYr7l<A^bHe&Q0GOj<4[]E9p=ZHh+TT%Kkc)*ig_Je,,`0SH=M(;X4#sZ#T8'oYi^8e#)pL5EW2l
+%igo_Wm9/P5^RAsFW&AVAo^[E-UMf]7S\Sb\di at B4q(=00THFu?nF\i$F6o6Q+Q>fg]W%Gs9?J&#`TRu:_Y69oeWW9C at Vai_C5/<J
+%S8a8>BQ^FoDVA+Sk+>SuS2>Gm=KZd6pUg^lm_St)Z.qDp#k(iarFL:Q%+4XCR5/G15Ke/[=]RkZ_(X!]O<T6qcNS at FMVS'!q,he*
+%aUphhQE:43fOF(dinqL1RcobYI910a7&F:f>Ok at JA1YLFMml^G:>@>^DDf'gC-kH4:4=\5Dn\4GV2h(e$i>G"'iY^8lZ-L=]X^h[
+%&;4%]'V.cP,^5"qb?V>U^8f=6P0DQP=A(s3gp8TaS%:1U?I=qSOrX=5h]*bb9;i+u,;Gk?4Z"N%o'"Rm^i6up at nmt4b&Q9s64Qq&
+%l6%-jBdJ&)F#\G?%(li:=kdq3^QZqbS'!#2P]OM+W.3r-/SIi].o-OPm/IRJ1oJ?Fks>Y27jT#@+X';`5<"ZXs7=ofVZB)EOu:CT
+%DU at uD2G`L]O"E4\$>[=3Ss-N>nS'&F?.7qf(/cl?9jVUHT/*fui)pTS]e'ENhgF49)8#?_Tq, at T.2\5YWSBJ:(PsB5gW(51#$[.A
+%n0!>U8:?`/REP85Z#j49-DD")-,kd1M8b$n2:23\5In)\3,"-q0]f"#RlE/tE^&<ar:5Nbr:sNcmDf+H\^l`CE at Xq0c=jmB[82s*
+%b0s,PD+g/fm6crs1H(g?Q$64e/r`KRAK8A:brQ0<*S_6&Yk18t%=6tP>++d)l,/t6"!S2IJdd#5\Dndhq=`L7^M1mY(BW[!pN,__
+%>gbl*,&[df0*Z92s5R91V$+dBN_knHV3\l]s*s!l,sZZhG3@]7%e0ZtiEB,q"Q(TWq+4f;j at u8.a!;GK`Uip-f1?CQ;a\SZa0>=n
+%7Gjtu at B*OopM<r*_*+T?Ec:+B)e+#SkAGj8DTn\7Z:sT!]&]4^^lpY6X&nmDm#pr@\GjWMJF$i_P*3N^p=MGPnb3ng1,pSQQ6R-s
+%Q?9j1iKJ+q>S19d,9)5F&5f0,JjDSY_)iCXQcc43>1W%Y4_TcqG^1[IkFLZ*QL at L7D5TA$ZZ.MkC)<r/I9)1Oh7 at bX2]'6mp![-h
+%,FR/^)""Rd_1gMgaj3emVtbX[!K"=alm=KcW;l(#'WUr;iAJaIa(?.,SQ0HKr#XF:]YDHC5\"Sq=%+CmOdre$(Nap,_5XW6SK</R
+%n2,D:d<EFn6dlDQmj<InpphBPU=a9J-NWHNn`Q/$3HN#&/S.W`)BP/a?JoCmN_aPE5/`qrZ/cn15 at AQb\.;kj7iJA=ZC!=YictM4
+%k=J]YM6lM_9Y!o>JDg(u,"Y=m+V9s.+U,m`R&MESI1P[kT0L$:eB^)>6q]Q%[, at RTFSaE=8$D=8/?\/.IE^\@nqse?c#od.\8$)f
+%YE:?3k(V-m`J#ST0-Ed*mFcVSEP$$kic\^<CZ\Adj$-2(^hE"]qdebidk(\4;iPo0,q"RS,2$D2gP-=KNP\0YP[qi at ejcM)3tIlU
+%,jm]E?jb?7rV!o`^bn at OA!t('+2S_UP07/b1'CDELGjruQWp)SH_>L[AP(RQ1*%rbhD2u+p[>B>:7cr\Y6d%Q_eT6A66G2A]eg[/
+%jc=PGpJnbgSNP&b\shAT&mp5uJgQePie6^_PVof8L<d$V&1,Z0-e4`>\0\5cK27?HH7C35'2NM/1BD+#W31fDKa_Y!5#!p3Di68^
+%Z?G=NYP"gA+GGGa*/O9(jL(2(&n<MOJ"Q0%XhVB.;SAqBm7E*.`[RBp7QL.,1"Z!K9q4gD(Bp.d6X*=UVR:%5-S[hf2j%/YUb`f`
+%B_oiYS-*9/(3VGFaiWb!ONfu>BC'^fC2E1'e;Dc&Y;[>lU?u=='mC]m'[lR=QJB5Y=dS)O))L]O2b6c33<kh>\ZXSGhfIqD_)o34
+%_4Es;JRJRmq0e_f,6'\oNOu1M/ZCEk+;-R=?N\E.H.]]KXq;gRY\+jAZJ:?fGH[!p!25^34(44:aC^C'Jq&euDW=qI8`JOJ6BlkS
+%`L2V)O+[EYl`TPf'N)+]poF(.d at A>Cpm.Ge4Q)a*,i$mdJJ?Uj$";IUEE3`9C&VQG*pE32q,q^Y`DW62>?]K=^>'61B&.-\6HTC!
+%@4GHDLZ%Hp3Hd&E0+Et22_Sh%U/1b>K#'f;j/.a+TH+`pVsSc0",J5tn7Zmhl>p%8SKFJ9<kjiK"&KMDIFc]9V=:++;I`I5YKJ-K
+%SPh\M-9$!!Z_kUH>h5Hj>,<lpV?EQjZQ<$t-S[TZ-j=gpL&@N<"'+<cCd5M;Ie.`es.5I>'A-*$->o=9A7r[$9k/d at Clne@L7X%V
+%TmEJa?mdT%e;;Aj,V%DZ8:?F'o88s?nLS$<$?T>.qQ6[Jh%Ke8bcl4kAjZS$U^^Cs!p`M30[Ol%[-2;Mr_\bFrp4.XPp99a6ojG9
+%.2ghu:l__NbB8.).5AI^<6h)[1)0/B%eop=bHKuVf at u'.iBeZZ*H1B\qK<7fM/hFjmB5OK&ORT+_$f+ at W8#/sjWHoS2#Xe:HV(66
+%e<Hl>,ib3O9!YLpTJrE9NpY=kgLMt^≷\RU/8;7P6B;i5X:rM)Jd%EII\T)33hdU^$7jn%4lbLSh^PJZbNG^b+\3+/,Fi<TP_Y
+%,4'O5+UR#"2a-X1(d5g%4JV(a<p^bWCWR=(:[eI`\a>rnPt%k?j:!$s6+M;;r5e?Q,57_X7aP?9k"mKU2>(!A&gG5ug-nTUP3&b>
+%ZP#q.J>>SY9am1aq:GM>9'cjSI?%aEDl#01KX5[24Jo/W0$][HZV[f#$:<RskpE8*,c^6<N2`"(@<+PW$02VK?>Rj@>beCo?m$E^
+%gaRNQc>Z(%d;oEXKIj0)JU4uk2 at E.+E9\V,Xare\B3=[YRB_a8$V]\FW48"hYhb"f'3t+%7P:[[O=n8(Sa<+I&*1?:B]tJR-9d0f
+%T7!98b,6c*"L%IKgI`VT9ri>DAV!- at dk^rYe/pA;7%&H.)F/o*a6P[^Em#3p<"b]maF'NR\$fUp#'-k1G<&+S0<q"&!"YBGPV8-u
+%(<8JA)b$L>l#A>V?"K=n;ufg5P&%f;GKjiLc7NO9"af-qG`N%9FOfuQqFqrm at VjCsP3g&/AlLfK])dYoH>]OVotR!3BAh"?=TYGW
+%SF;1*e5$.61=r*>ak0ggZQkgMj9W?)ZFi>HF,tJAWC;^-cNKH)rL7WI#PChOX1>TinNag;?>T*>W.R1EcBT,&6`Gt]!1Z0UAeGNl
+%TEgM'#V$8*cha<s[)b\3TV%2n;BkUn>;+f/fP90Qg'V8)Ot(UZ"c^WY*fEp_-b:K:U1kol"sX?UUeY=Z>\FjV-iK>kjSS_B#D[-8
+%s+(WE1#\^g0\p^=hN,tL$7RK&1(YBdOYp$G)$O+r/Djju_Jm4R@^G"&2LbecA^MtMLX&K+P)=-$SghRKjDjhW2;)Db(G</F80l/O
+%YYfFI^'a-)"ntI#dSanQ`G*pfouP$3A]gVL+6W7igm\([-C](Po;'W=4!Llgar at AR[PE$(nd+6oMLKWO[PLK'A[O+ZD?lPa_$,'f
+%6eFAa"O,HH6(C/O6I0GU*g%iI"Vp78jNciJEX_ts/NDc]=bs/CjE#2fqJFoWkB[th0!ahJ3'BJ0"rd-$82-RbZRr_IRNT?*amnKF
+%f`T<M4D=SK/"!MNjo&o"GW]gSUqHJ'IPi3MlY^G269IQG<JkR$:NlU/c/jpij*b/[c1O5,.k1"X>+D&/?%K[7:*uSQFRAB>>E=+W
+%6 at rI?-:GSVVGY\T0>!$"AA<MfSA9QHeX?#?]C&?9L\jK!W81uHc<PiaV,&9s'+j!bO80I4Lt1$dE/9KiN19^g(fZ`,aT,\4aJb*\
+%+q:\\q;ut1<c/O6p6B;rMOb'6.1AAHRJF!>c><jpa_OHhGl6ItH<A`ZNtc^T:O7)j0=SJ at RW?$f><rI_CAOpdhF9'gS!mqs,UJsL
+%Dr<SL3`W5(6mdj_QZo?SHO'J]>TmH at R!H,QA]C7!],um2/lmKp/le#/?\c>K7_&;Z`*k*di0[0bF-dLS)4^pNk$7A:/*Z;OdZ"UQ
+%7R,:lC&U;^pI1GAI[H4E.E6u,cfCKYZ,*70"JAP:hO.3h_g'RM52.LsDB2r*e<+/'"HHHl;h=Hr(?\u;k6Uf\iX*Ks4XE at ElV:q0
+%O(rhO6-<CcoV,_0J at 8sRbdi49NV4&d$hD8nbi(VENKS:rP9Z)%M+[S$&96-JJ[fh8Rre=*k&Or>IX#V"N at g0O.JJWKjUaP3]m$J%
+%jbiYo5q_KAjK*42q8:pc/'5Mifm>tg&p?H.^)=%Y<9/L8bCmX_6[(f?[\Ma6mpJR'TQ=8]frsk"%n'8 at ppEjsMM,7nOnf)>@Fk+7
+%[6HQn5s+]Ua\lL>Hgr3K:,\@Nl>XF7eD+k at NFJm[%`WPb97^cU-[ABm;laomT_NZT8L=bX)ZLFVB"b<FR?Ol(PGI_ng$i9<#'%::
+%Xkg+pgNOE[es(o0BNCi>?fH.`k%u!Y_W8nLm4n1s"JT(]nS1/Vghr^2lhT9PVD$CYqmD_^p-(\]Pq#RJ\X^Ui1co^8>u'aATZLhb
+%QgPj`Y32AHhs.n4jk"RfPK(n#rd+('N`Tu0 at p%&'AL4mL%nZt.nQE=7o<[Nh;f:A.NLS<X;dcu at Q4cc/iJ6TdS/.kS4;6U%Fj`L4
+%bbT,k#"eI9g,4,5#%0c?N[g<X`9UtQ/BBXueL,BJ5N5GF/N/K+Wn2*oEa!;g6O-uT$'3MgV,0E6#P+#GBimf"eQF8L90HL$B+8.t
+%J0;.:WBLhRHh,I-T!S%-`gnH*h%E^Ka,GYhhGoMkCf:sc9S$Yql<L8#BN\GmrGq/S-d_gZN5:]3 at ECr/WLm at GA'q$+Do%u495/MV
+%JBsDh9FS.3D"TSO:Q!I1-DY!u0:n4OIrS/,-6O?K$S`hKL6I.U[sJPZ0djJl^d<@'ZKl5^-XR]:ZgWMi3Q%OUeUqH[qM+NY*[g'#
+%mC9D7<iU`Xetl0Eg/Ljh[In&6IN6j%2`gM$@u\ndO%JaRW-i&GO;Ci.dV)u#jO=H1ogXcDfHKXNl^6Ibd-qa at 2n;6OXhiR2cJV$'
+%2\<.iV at 47.HS'LFgjug8=XYN<^/VO>,u`;#juNiY>>"9oRDLmS=+$i>Uls6"eft3?)GA=]\\f at +Z4_.&7hp\IUbU9\7Yf]PQ.(@^
+%6`%+&bajnll_RCJTgA/kIn]3$?.S)hU+N!MOF(\ua[0MNfY(4l(:s`LRR=+pP,k(2P8)@\\gFElN^a,=PSDibr:5$?*9c1^^oJYC
+%NdTfU-/uMTND6WM at S`d;\WhjH=!HCcI)]>.F$6-#Vj0jrYoO/mQIlGWQNX,q&^i[#PBl`M\2HJV-"hS6CYB,k'"a=GYE.Hu5a]DD
+%$(t.e%n>t[O]_CnNdO at Mlj_=TDfT:7j.Sj::!*Rp+pj*?VD-*qr/<P:4=K:O..^j at T'V*Eo:qqL'9,_M8 at 8T`fr3(Y97=AaQ(\CF
+%[p"qJ1_nWg(rAa7%c<jOENkO'2YLPk0;4;3fGoRrQW+ at Cr#jO#[u+spD6-raWmZNJ'/6q;h72U<Bct/eMf;^D2eusC>5RtBYBNqb
+%nK8XNVjM+`)?`#=#l0M^2[;qRKB4tf:69GQYSkfo[OI\?"+%<5'-)K!<Z;,h=o2/YCT_)tG!^?`bPTQ6g38M'93II:+,j#0/AJhS
+%2Vlh_]%N&O/FP]*bpTRM7NhrC^f%hrf?oFnQ'>og!ic'C*C)[e$U.iAg@>a?h(7,@*rJ0t5<m0>[W;H(1>C<peaLl8XGbo&@*[84
+%\\P9Mk^Jf-1ouCo//'#;dF3 at 8:Jp^Za_$O-h*2NU<MM$f>LSK:,?=$AB]?UW^$:aL2cirLd.4edJsM$R8WNN<=oQ=[?R[4sY.o$/
+%c&0e9)m/'p0/_@&ZaR6rYO8*Yl,l5#kbUB=aa9=*&/4XoG&,9X24#nS*5fVX+de.HAamf2&XC=&Jp)Z75$"SJs)M]3igG<G7;Yu'
+%YZH6WHPfQ:9P7lWltc'XH37pO*3$T.NYQa%W$(nFFA\C_n#q(a"Pu(Qc["!Wa>(1QAM]B;P9ljZ)uMgq$#V,FEuPHR"*o]F]ALI<
+%0t$FTS`1>U2EDJuCc`t_W_']!E"ZR2H_C]7(JJ^TIleYZaYP"GDFSC:4Y!FTbr&.Ig4QprU:,GbD\%Kt"BINh?&D2.4VK!F at O9om
+%E=3$!%aFZhMA#;5-Nbi>CP"r6O-[aWlclU6.b7E\lqO;6aF2HEjYf0/JDMHWg0$@18[?Fd](M(7]Ba8cAjZ[!:7ebUF2$C$4#53Q
+%ZW_r7YL_r5juC*;oq$%dIkGK/o2l'&rq)Fug35!"P,IG>:$PN9d;=4Ab4T\>rNlKddVaGtW>-aO.C at +`+*FB:YE6-]#0-*ql'30F
+%IZ/,)G2Wb^!DR+)kE,H7m"M#VU![=1Y&r*,A*0NT,6aujT/<c\RCM"+A7Rn8c)9%%M^ugZV.i^Q>i]<F1<54dS-iJM.6qFmW'g&B
+%F$aXUPk'K.":ql9cT68Wo)$ZC)d`??296u2MW>T7SYr"Ui7R=Nl[`rC3VtHqVO8u;i'%.0-_[iUX-5;3YRLN$Ej7b2/o.)4HCP1T
+%C.Zp#1=e8S\$kO;miu#[fgN:s(D*3L?i<-`mY=_YOnU]O2UV1C/P7!-am.h-goXoPIr'6[5`JWII]p9d&$Or>Gr"UM6Rg<"6UYFP
+%lfUj-H+A8 at DXZ4prmNo!.GJGQ/3$<7=?b(b0oO?sVp:3Pe,?-$c-^Zk8s%8hFQhN6V:0S at oOQc92`VdDZubH2,m%p%O+S\smbkP[
+%?l(*h3\i.!m:f__p/@<*p%Oj#B$K)ke43B3XSdCJI"GAn)?^1`$'WpV9C4+`85"5-mB$Q1>_Jp_O1!UoY;\Rq']$FN5:>KdCm048
+%Cm#Ho:T3BC(s3S1H%2]M/3mPPSI'3plka-u:7QVMjY*#TUD(2inPAZ)KAI&cT/G66EP3="2;<>tLa<(3;7VuNG@/*rg^VOgm12E/
+%77IY)@k,hIb2]rbZUZJaB\aGDNr?q at d,7I>k!IEK\&+?Y8\1HieSRg2!D:YEY271WZ-j[;TKb:i%dScOopIqPfo&Zui@=Na0<Zq;
+%H-'\n==Fd<(2 at S5>6CGK(am*E>43kg.q3A=8_eQc,m1l/IFYX)D/J^biR66Bl6$!`QL&e(,NW#kSuZU0>4SW\0l.0Kf?!u`HZTYU
+%Pa%UT;IiIa^4UW-"lG0'!>R[`9WK)E]9^CKZ4O(IhD0;qm_]at&G'r5m8W20-S$j6MM5>06?o&QX:;'M\`^G*2'<CHJE`aRcj:mB
+%UYc:KL:W'1%)f7>EDj/mHe?E^misZZfQ'lmaDi=J'6(JJ$R%P,nJgp1atcPA%=9^H37)FcHCTk(]&UIXXO.[*73(J1X*ci/P!Jl(
+%->A\4 at b?#k]%SYFm<nuWQ8n<I4mV?LQ5KSS?#4h6Uoho!F'eWaGNoKQU'])G'P,7&CpnbE[t7><9S6GF8*;h/\t':ac6J3g$Z/an
+%qT:'G-^+NC=l;YMOr1X1Q+5SX-J]rb"U=,nDd>b"e>o)cnu#4u.q<>M*;>pY[bY#1N'6SsR:Z)dk7DC9Wd7 at Ba*4]<[/!]MR^)#1
+%KJnDr01k,%r2I$s-iX?i:4pWO>1(IUCcU_jnel\>4^BKMLCCnG^Zi-n1O$s+P.L5DBQrO7qe^DB5*pneDrmOU"@\e'J)5]$Bdpe@
+%<Bf8_=f at Ph@?Dj<X`arTP9<,19^(AOXh0kVk^?02J:'iC+=ZXpHj*[q=QT)jL&!LC6e(#aQ/\fj!Mlk$9I<1G(<Jrna3iZe]n
+%D<!dCX,^p5IQqJZ7*<i?$%,\b&.9.;V3tBWp\Yfd]E,6^l[RZ`h8\2lm+q at _[?40/bKZH^m`WW-7s$9o0D/=>nTS[.YiQ/-4VKXi
+%iUkk;7Ol,2q)g(IP39ftp6hY5'Q.rg4QU!7E_t'^JgW)4h/Y\=2s$j=)ES4ojcl#\&(L?uF-1P:k<812 at A"%O`=?i2maUs at iB"&F
+%^9j(*rY.%CB60U<M*?.ZEOG'13rpZ50G#Kec;!5m]`IX<+f#]CcTBuGouf6`@R3aknkEM-Si<^?eAV`d#Hap=:\gk4+5o%nrIUdn
+%l2,&n*dNK2du@%aW6KbLFd[NV,uU($nRW/!bCRW+dM*/$qqtJ#???Q0HLn0d_c9?lmkI6ZR at BRD:n1e0k"40Qrq>IaaZa,`V^K:5
+%jSSp&cmPa^MJ1_#oW%J+^;n;I8`XF>E]hFbJM5RnVcV!;*V.kJ%2q+C?eq07FDh6Vb.Ba%j!0OV='-7k?dYafH92oFc)gtUH%B5a
+%F7g/?oBXa8207'RjF=lCRBalY\B`',I9a;83PCdk!sN0^7<VU-R]R&m at V]U\GYRuEPgcEB%5gA#6 at U+^0%'CIWm):<2g925S at go7
+%52RX;@YoD*c$8<"dLT*dfZ at PROR:fD3"TSHkJ3F#X!.8d!bDJk#X5u*6/^+aiKI`RCUCJeW0k=GZ4f#9eA_#d3LH-K64$%$(5W:j
+%pB7sq&B7Seh48lcT#b7O-FD-(o&Q>M'5VV+Pd006H'V%lq.2"**ZN4Jl8D9;NL5!3e at Xg5s6`1l30.Z1Qt0]m^k<9=YF!X4YrPYI
+%3m@\PEY<6?>e.ak9n>a)F%giZ"H+C`MoHac at +M,T2$3'];jQ"D!15-X>#rkbb/GXTq)ri)`g<\]n^g*5b(O/DQAiB5gspK<*N,[Y
+%YdIUhUHkEl(`\XDN- at i/3D$-1[i7N"/@I<a:H_Nkb?k&"]t*inipHS:ID(Bjc:h]la[*@N/%7(JM7H6aP-N.3$#J>hW='F at SkNpR
+%IA:@=`n:tGNCd6N&l?96JfJH-bn;h[niUR2I59DMHXj^)N=:$"*'$U>&^?]VO<;=YD2cJTN^hIY:!RV=41=_q,(P>n"V0\d"Wf&A
+%VX2;*^,A=C=)p#?D(=QdOd:N?_o)k_)#%].gJ]G:bJ:]7qV:G_>@#m?dWjN$'rio7 at kHgNZqh@1K-">DMZ^#!;4?31>u?&H53Aj$
+%ms!lABLfI9EtLA*,O[QG!#_@<%@bXsoTWeI6,7L_P6ec<HnM`+=&ZUTpP]fj\Wa]6IQAm=pd-6e'L599`ns'Tr1'X?W(Cu*`8"S\
+%P8BWpHR/.ElD8/i<R at pVWjI0MWQc;_O;h<*\Hin*s'\D`a#P9d3td]&,&\c]CFWYk$cuZ8:,&(+L;UeV\I_dM5']R`O)n`.YYKVn
+%^Kn[goD/dSWAeiZYLLE<dW5#bT]ZGh2^!>r_/m+3,/,F;2B2LGag'b_kJ6h>o<0&+V&5[cE;@?]3a$o"dS[a1B$V0ds$Msl>M0gJ
+%@+FZfOM!@m?1SukIL('h,L'1*QmKaG".5o0!K9.J[n%e*ZkI<I;cCB^YV)ApY7_CH>[O+O]Idsl9ab`lS at KuD":`g&$&5.D>i*tS
+%(NC at OLGX]V1XLCbN%7(AI=a&k]d-?rGsesEci/=!<(;s,o(N6E**0OmID/=Y,KGLr?X@<,**!Y@@M&<+Z0-=IN-T8s^LLhl"(#Zs
+%Cig3P`*FJPNQX3]T-jFhUU-oN_)&L/m8'p=2lMY^9%0[dq,R`_/7+0W$NH!.GUF at V5>mn)#be;F=.?!-9&u;d,)C=$%5RH*<E".$
+%9-<r7=(op at n'/`U4i!M\*;-nuRNNpO at p+)'<<CNG0hb5#B6p,OD?l@)p<fYkoQS=D8Id.*dLr?Rck&ippi2l#b-qNfhD\)ZAY at h@
+%X-^tX?dZPAR!B1<3(N.!CuF*Wkg*]!9R2KJbhf]>8D%6lZcu at WFr7J_UM`X at ce51M\gY3.gcp'g3V)79EWu)JLXp+<6dXfP>(U6m
+%D>I^_S91f\*V<#"ZK at KMIAGG3+iqkSWOeo-l7Wg*N>GjZmn^e9mb4WUaL-;#@e<--I*5%F8)!Fhb%ss#!m<QW`9,J.mBP8gXf^Za
+%3+OpgHD6RP<)h*.a6C%ie)'"jhGFC>02/tt>I^AuF/bO8GLG>(o"bVijk)2/Z;XdL]Bk_6=C%HXc-dZ0<2YA at 41fC4>_Z)]#m&Gb
+%o#Xhr<56QT*T4]q&f&Ruq7$H)hePpTZNY-+q`WpDXC=#LK1Jca're^2P4>l9cREPV`d/YhY5AZHh%/Y#q5uR]dOmo8G3ZIK?'kDr
+%P`S_"r0[\5fjSSFcW%Pj*S=nMSDh=,Ush^W at njWc(iXbuMl'PRA#?edc%sRGUi3uiU`\d"&La+R\KjhscTLbW![DU[obu[9nS83k
+%enI:;m.[*aYN(C3aN08\pKhcIE[_`T;0P1d at k'?MSXu)<2'1=J*:8&N!,>Vu2'I;tXIW:o.Anm+057)Q at kQJdI&2\7fE)E:(o+As
+%gfMAWUJo^8)GRbj$Vk7XlWFQ%9.Kb-S[hn:'4kO,-Ci9hN;U,W*t=_[_:4T#jWhFT'\//lL`S)`Ui)B<8SGcXlr]pl??K.pda-"Y
+%6:S1Un*&;_Tg[>A%K"0a5QX)9W+C2tbDr.N<:Z?O#B-7=T&+8qS/)W=e`9Gup0987ie._=]eLHI3glng29<,b"ls8!^a)r8^G[!'
+%buDsp9H(GjDJXAql^G\4[)*nSQM7Jn\>BMaqZ=U`4lmT!Lr%j2`L!n0C9*1qZ4:ULPjb#NR`A'cq3P0%OuO1,Pp&.t(A](1[l3UZ
+%M5K)'/=+r1>tC=KFuH<%,?"fuh;_+jU^/d*gdVokX^l5(HSa4YnCs*656R]#S]W8cV;X.mA]]<=XL7)_;0ieESVDE8Qc4^+B46m.
+%b at c&nJsBba]?L%K)c`nL5q6*!BZ_XX('/<nb7d%R3tE^Hc?M at fk5SZtmSZrEdJY*>aL9;+d8C4r2gbZ6EjO%V5`1P#pSTY/b at U(b
+%M9nt&keW@`1\KHSMV1>^ptK]tSA4=cTZlO>9TARX,gc#8RAXe6a]D#L*k]b<_o.V=iY6/>'L$9>",D>&HE*ae:]^tu)],TUMt.u3
+%A[PfI(YLg(`,k^./GJ8cQ$iP0[!\cbP[@JW?I[NMiI@&SG]5rT;BUIj)ekaWQ"+XE$m2`!07r;K&uJ$q:P8\MI6*t]`g\4_Pe(9*
+%Z^51JD&t\,?=d4!032rIK at d3!-XWFlFQ->9*5XHAm>\7!3_b&[M0U;0!m7tWCeV498T5n?e6\*r&01?*4FYdq3lcG'KL"Z4//Z`V
+%d<t&:]O2H4K]_)iMh76jpE*"14sE"T!<&+./cq.kr38D_:j at Et3bq;qVV4!Y:OEkur^Krq<ih`.&mcl-*UrgUm4S7'RoSSD*1P<X
+%32eoE_Pu_C+u<A,gR@[!H'Os+_TMj^&ss\G*4clUIaNB8.+ADjn8(Z#:(04/8Qma6ED-(!'MkT7h9e=ZD:u:(Xf'mrF2)]'=Kb8b
+%5Q-SEPG"H^A4aDjg;Kts7(n9d!om75)8'Fn3cDKE at k2Z(mSp_Io39Bl/:_eGK<(/Ge/&87*%m/XUG3;(Ps'65;k1Mpg`b1`[K;_)
+%HNp)SF.D:cK>V8u!1^jL at QR@es86)Yq,sG4:GcG5V"t4(%UGCp at b[uAEN#$4o>Rmk\1V/E='X288j+E@[bo98qWa#V=[?4"BCD(3
+%b;(KB5VW0,nc((aZk"JiaelmR[O%*5,eC(=1-iq:[:hsUkLPmSfGZm(g2ZlLCo-\1I5g6=<a*pp$JrFZKITrTA-uetH)t4ukK&Eb
+%__HssVVKSY06q5CZ,,"J-Ii=(pN9Zb-%OGi3QnZ&0?Pjc.U#*0;LM,>pVG'Y$lAMfjbFq^:2dalkEOYTK>12NBXGu]4Kfsfm3;jI
+%CQ-2SbZJ)?-+E;hM=FEA,tXB"6iE8!2K2pfjukZ>`gm at 8&M!'6mWRU5*uVP<Kt/(KJo?[p,OocV_Q3N- at XA.Wrna=r@"#jHPMM4_
+%Df=X[_J/:\rgZl;lkF:]6,Co,TO-F7o*&3 at X/>F'7f>DujCm,I5f1YZ:_9fCr"qF/>IGf#.;keA-(\!(g/#]b4ZTN5IJLRKNI0)o
+%Ck)/:@6cVgT!H1V?M$\(n?b']Xgf#>?\>-$ndRaYG7)?S&':s6^^]&58UT*8g*\[=F;n/t&Y>m#J#pj:''3JVKA^g9nUY3;)MUY2
+%?so+VSVIn%NUOOA>>sn#g[i%SPt<]E7:ea<Vof]mbCTD(].Lp0D>p8BfMW`1OL(9bI[FcdUfg2=5B<Q-I8*OE>tQY at P*&3kJHj0d
+%Z<of0W?rHuTD*>o^JJ4D1IL](RgpW_kCSG.ieb#5Wh_,,=",mu/=f:EI?=>'3tnc;0cFeM$6 at EabES9A(jgj1j;0)G0=g"G^>+<F
+%K&anR]\C7tG"sV(<0Bnmq.$,=@1e_Qo8T]ebj%lUau&p3J_0?qh&(EZ_'b('<s$E7eE,^Y>\a7;MB0sD2u-iU#RqQl]fp`;_QdHc
+%pn6h\RG4B(9BI*k\oLO4N:1;A;Nm=s#:B[p9-D[h5oM,YDsN@@+V2nlbP^i=O_?$*fXu#GJPPJJq5FKPgO0%sfUjnpnajI:L6#:1
+%kZBO8G/l&Q at q!dXJEG at bOcGf^DE^?!W1A[&Y"V%T3nr%@bFe^J_c6*EE(kC:jm.hP'3tBa#I6O-19p8`-f+LZS(k+upc<VK#.A-W
+%0qk5B"L=?I/LZDdNQ7Et97)tmhjqDA=D:]V]q.5]:RWj,F&E0JjRA?B!]tIGF.jVDOh:.#j-PNcc$agb^'S;K(U":C=ZO*$pL9Nh
+%EDE8k[4eWG!k@[[k)+HGE9'7Er#;hUegY^j8jXb1*(Z3Q]PK$@=AQ)iBqJC&A(A5Z8?%uE>$P:K/J75ph3[_88VG72;dS?A/;#/B
+%72G`3)jNL]s.(\p4qM_=[;siG*p1S3T%>)YQ6/I-R)EK at qeTWr,?N.8GM01WW&[2DGk=DYB%)@jP!,Z^DD>stg1I';"l108kot#c
+%Xt+VZXNpDd2H?I`P:gl>BG/sCUNX,;AG&9RCe)Of!TUD(p2sDggthVYpLKoo=[S"@^RPreqibq`"1_.*T6jK=R-uD5g'\D!8O8A9
+%:+/8=,aZ,o;d>iFcNBQARWTQ$EdaSPDH5lRnuRlFqmOZdS,FmDWe7T2lEG^Kma?sjNR1<(iStVu:=gr>c at jhLe`WfC9'+B"9Isc]
+%Hf&TdS@[(?*ZggTpn4%jnmH=!FcS)mDDGL,*3$,(2?GBFq2<#`l1HmE.].0S27>X=`94ZcHIE9q75K`cXKuts*#.L\5V81cKWom-
+%2R+X^k_p[%-;rr-Y*W\Nn*=%qQ1k:id_;k_GW)1%ALdOMB@*=8\!V1qUo]Q.=eY"d;/a$De at X$S^O4R$6hE"<#,f`n7_s0'CsDj0
+%GF]/4LPB$#(R1ls*%;TQV4. at jkN,0YV\8I<^:/l`S3>EM'U6%q at Fs7=A`HBb\M)V.G9-hg%dlMjEa1F'8('fBI9n$fb1'8A+p[/o
+%qdqkXgCeJ)*1kV'K6\jo9M>!?8$QnHBXki?04$\Z8:Rtt_ciio;N\p^KULd3r6RKB9tk9jffeF:[tY(pMu]sBQq^k<_pjmXB^9tL
+%#oGr_=)Qu"9;2*ifmMTa>tk).4E:MpVf&3So1[*ak+tKe<3/[KKCuDQs#I$.;S[ieBH5#F-G_b+/`H3((5j1JW0)Cu_XbS`-6_g%
+%LY8WHlRa\Ac-YOP6s#C'2fYrqUe7_tHuHO'Oj`0?1o at 1Cft<'_Us06OWRM?S2(+#=m9*\n,]aD.AW7<"M8;C)XqI'B"1cHX8.&0F
+%jEi0kpZ.!kF at FVDH^UXs44>B1B=?,X:>5XGV$?JZ,2`r=$q4L]U+2IERV1P&FA at V6OroN$eRP?@p'#)2[RdZe'U(!jpa%)L.spb@
+%kgAsi;j!rqYrc#c&N<mhpW_bA#Vg;mhWtQsLAdY3dmj9l9CtJ*mH0nJPdlnI2tbhD68b/G.s\4?MTAa_-&?Gr1d&j*:VQGj::^#C
+%-=LCZIHDR5%LA at E=6Hl$<1U)=W`:njSQ"cVaQ^J:L5iQD<SNoLhSDG<a5l41*%+X*(gr_`3.Ld=2Y&3"%"ETD,4 at UO,dLs%aMTLd
+%AH&r3[HbK%0Lu2e\YK#Vm0pZdjqFi!.HetG4[m5WhniT.fuOWZgHt1inq:igSO'i!XEH4FCK&qG[Ff$&Zf0S>ADc<[cE7n%,/u9]
+%;p2.FgUX2Ha(QL2Td=FDo1e>b.QJ+"T`0<9?=o$IhK,0LRLTu#!itCO_)-&MR3UV=&Hjq7ROLL=mdt,_0;u,ibg(moGJ&FDc[5ht
+%#()q<?::coh6<&4i!E3PDm#/P\N7Q'PMJ-\]kLhd"V/.["?05o#[ghVg?Y!CHsf!-Emm_=B[tIIp7V"ehOotB+2PO\lK8]sg8cQ,
+%fsg>_ZJL<tb:iReY,Y'p.CYJ=Q^b$G*Yb!Y=70iD"8$:L_lKieOiYB9/p5Lr^$1Go8e0?3W;%^>=HHjF?;(4Fg!&Pi9`(\63M%;a
+%KDp<:)Wg6iH"=;L[`;Im""3kcY\nK"lscgp>n8aNSHm7N;P=,TB.71+,*dhE7#1\Zf(R.jJ=gBgKDDKiRQAp5qjbE$QI32<N;tfh
+%KKF,?+C+1n/a!IldY\GFn`:$uVq06K-D3Al,p.#-5*t<8`^0%KP^E*Um%\I=CbNF\Y5*ma4K"1Rqjh?kN-GtHK'76PNYhBg81_l<
+%S2)FpSCFHQ_Nu\LE.H\`Hs^.E6&#\7M]Yk@"F=2;9VKp6k69q0TMJ^ujn\!4mbC\AbB%&"L6si<[FkIPCk!(r%Lm%P$J,OgSRG\G
+%'a4uFga%t7;r'S*o/%QCAcb&.VfW9]:Rt#4XK68d^c#Yd\2I$[=5M]PoehpWPMl3+I#<k7M<6c%I3d&(9EkDb5J5`l-RSTX[f:dX
+%%AQgIh)=R"Go?f`McF)2MC!L[qs/Ye`*6j%P//8R_p2d=<1Ad7f]Iq$I`bI0Ki3is>[UGr$X9JBo1slqVZr`T7_^s-,hd=8T#3m5
+%Wii[)Y7H4*;D42-_<==SV,s6ePZW:[%8,oWnqp!Eq>.);fp/`T@"Q_u0mf-!(oG,/Qd&ojD_261%h<sGIm/*"]Oq/aQ[2t,o2mnm
+%O-5]p9XQRn%*$B5<gp4uXG>d"g/\p\]FkENDdKO*P/$R_OMKrG2VsiCo0GR"8!HcmoSr<e?;i=".pfcPoKWGX6FlYIF5n,Fm\['7
+%\LB/F:S4j>kH19H=qacF%VJ)_q%sr'%t3oQk:iapaBPH*g#iQe9!R=%f?__o2:guG$q,b`J8>2sEq2 at l@(CE/;_'4>YRF'bRM/*8
+%l-f;5kREVF\B5tAH!R"PT+?5S7f6in2'(84N;5[7P__lH[flg+KK;_<nDN0m_2FRr,$de5hkLgQ6E\+OX-;\aW0QTP1Cn2$O-u(t
+%c&Lr48HR=O^i<-_1cf$NYeIDheNch$g9/HZBVU,DfrB%i-cq5ZQ`LphXKdN2p?m!9n)3";aR[SM\kT"8]Q(9Gj0N5:^)C5tml`hN
+%lcso.JL`&<DbnT at lSo'@Z4e)!a%C4BY_o;s8;M/]XNF#k at 1[eI@!/n-Pi28RcJ.@?S##U;/8nE<,j+31[!JW`X,kLANYH-#D%4'J
+%82lZncE%,=FN1IiejQ@[oo1)AYhM%3V,g6rag/f at nP4&UF)R^mVB5%hQbc-3*J'DJh*;,f`bqh at Be&i^>Ek+8/qW4fEd"TpHhLfa
+%`L!dUK&cK*^5qD*dR`r.#qA<Mg_9n?P]<WpX;22 at 5&Z_lh2d%%B'qKs%NbOMr8IXa\Rr7U`(&#j,1io,.3J5:DC4?FOU/4$`Fr-*
+%Eb\5;gkK)[,k.8?I?3Ff%'`>al)0!SRcN%2MTWZroO'S/+';:Z_9R3KS_93ej]jFL=,n,'F;s!>b at fkZP/8\/kcJsi8>EE_=Rl=S
+%FDJt\#u9G<==:5@`da(1=lpuOI0eh]6'Qu^D'_!g5T-$eSEDj/FK[8&5(BV6$K^ZPO0Xk]0'mFQ'aE/`qh,r)^.b-M:1u:g/&+6/
+%Ofo0"]UTSKa>7bQVfUY^@XD]/3AjJAEp.9MgHqX(<bKj"Q!*l6]JQ)Kof5eNj=c<2WK4Q<@bOdrP7;mo%BS%h;e+)FT7o52os'^2
+%)Y-pO[VXE"S3fK<eA$[pVp7=,O!F\b,H#YN)LpXD6Qco-e34[bnftS'Z,?qf,`c[qcC4?c%QuD4E3N2mfL+\9;)1[BAUDD-?^oJ$
+%A]h,nL$EQuG"s]>Egs'6&'N`0N3>MpkaoO'('F]1L!M+i%dMul<1G?r7EdE'dUi$Z:*F366_D'+!8WlEq?om,qDBYLAn6=;DQ5p-
+%>9S!Mdu%b&+$0K3m0G4cBBlfRD]8't. at Tn*d6Ne<Z3XI>]=.*7PAZ6G_UD70ZZ&i_H1OrI at +MtbPiFdTjeeuA_/jM;Q-M\W-u:el
+%NqXF?=3GHk1$t<(>uiMJ2n=E14?RiUqo/r1-a.4k\"U-c.EQup+WIc\*.p#K^>A7"l0UtF^0Sokiqa93[B-A!.VIu7-'0HGk:a&g
+%,K61Op!Q:_=\4""%pFKW63V+m!dS&$O>m7gn8kqKOeZk7!p!^_\TE[TCmWk=FqC^=3rplE0ej@[AE9fQU:cf)09`eZ_4Uh%hVW(o
+%kqcGbYFr.&V[YYc)8#d2`\PtKK%k+/'AOaFRTrdmXp5Z&B19Ng8j!/Y5+ at gIaiF<9*!*.CrOlST/LURq2Oi;[B"L'KR\rL;$N4$n
+%/r\e#cb"!l/NR6k![G[aQ#B_i2u0[Yek>58(3/^=q[f\e(VmSWEUkegk`$icOFEtm6<]8]c=@aihScG)+nE=q_<IW6[Mpf'c[>DU
+%#>u0YQ`A:C`MqLT>LQO6Y?(!O6 at 9)FlrWf=K4VG>P9bu:*_LDKEEC&dbagk`brc0gG9C at 5VL`mqF'J5]!n*D+ at HnU.c_`:,-"Rj5
+%6DA)B<lc8<Q072bT%=ZIQhpEKrn=5AY.%jV1^>X(0I9Qr=A,4%fAoX5]Mit)op9`Uh7pE$='.bu/%cpK#H5n(H at eWq+Ug`j&>$)-
+%k`iN^%_<([Cl7RZH1M4iR)dl7V`pI65o=%k*2N;VLU,<jd^!U3*`DRK\+g9LV)<3e([V(fi:FjhhHWNChShB,=sS?;gZl]$Sc_cg
+%/(>Co[G/ZGnmK\BF=G="M'8p+QgNVh+C9#K-N*T)4arFW_R),n3JV]tT?X27J5Vj"Juf6-VF^n=)KskM_9F#*D6&koSpC?L!&Rb8
+%@.(7iP+ut2o^@O.E\Koi(-D'iR:^4UEK,J8hjLPZKd at F,jY6`5O1fc'[3J8G1uC7-s0)`)!>7(dl'I4qE4tMa_J"I7#[M3<!/3bW
+%_o!^WW%9\m197a9aT"H]kPH7i0JfQibM-E(b"VArI>RGI2d9m3[T9j-4_/8-MJliJnk%c!8c-:BaiMb8SWSSg&4no<<.'^dY]XTa
+%0d65ufn+hEh<Bft.?Ft*//UHnoQEE`a,&+;/FY[&>eM8<-`>8EVRIiD-VH*97?p`f8IDf!VC[a!!=7(6,Cjm-<1f?.1t#8tDPt4-
+%K;p<%O\d_37;Q!`J1$hDI$A1`$<WR&pUV0hm`:1V6SVa(ieo>n'h"='kZI1XS\'jb><N]JD_/SRPe`KS>tmIE!45`SkFjR"dp`!j
+%C57h, at 6*5FII>q*K%0iAD<#@H7W!O^:X4%O$.3s)csa)&Y1ICjZ4q3M:F_U2E;$P2WRLN&jWtOS@@W3ZF-iUJWGUI*kG7O3O$T!u
+%L=kmYgXU-1!?MX%6;WRZS&MF=CR*@S+.'S/Ea;nQ<J,qJ1EN8Jlu3B`hG4XkL`<!%L]:$N<$2E&Y\bC!,sA^gi5L]>3.j8uQR%lM
+%8%7"5/3mF9,Wa7#N?X:+OZB>&p^FbrH3^bJ!4lE,jt/=H8itn/3`;YsP@`m`WQmg7<LjmVC;+g$D\$&A^g.\*&)7E]@ZUi:LM%Gl
+%(L-&.(`Nct"M2aR.IGoaW(^)"I^/cWFX,=?/B5#(*^0o,_/#K+N7h+#Zu7"pb!oL/f2t`/*-sU+S&Y4dB+eRkh)U)0Q%q2o745k0
+%WU?Vr]J>Hrh-J#GTD+SSibfrJU2W,6WpQ&EVm]5"WCg2$S at 49Wc,4-+6Dr7,PuAr@]Qa]Nr?f9+W0?9&8s-fJn?1@@5)WB*E^u1-
+%Y4H2J at 6;e&4.r#JB.'Tb>t"m>MIHhcSUGZ?#$#9H6c_Vn[_ca(;Pmj9>WV-aDmHVTVP=Sr!rkuJCbBm+?@Ch$SL8rc_\;[LW8bP6
+%;?`T7WF*SD/#k?D!"aq)FGF/Sm\bB7Ndshf*pK$QpH42dnV:,.eMPX+Yb"IJWG2]H%1]lLf-9]Z&noCr2\M_8S9mh`^k,2`,["M4
+%r+n@]T(_2B,%JOfarLOK[aS:)!:\E:AFdQ^f3j`s at gCGYrFTtIP<GQ9>7&aV1AC0A(+^#Ya@&ot#G8,\#PDg%fju13d<8`Te#$7?
+%/:f1f^<<%aX^iM)_Lm,\/*+cPcZTI($3$8i,s.t]Pq"K7RUqVFJRastN)*%e20t'QQtQG.02cVPEDCNCMjLF/S0dr2icfKB'rb>.
+%ZgK5$Rr`"Y-;$K/K]qttj5a0JOHcNiRk<1n"Ad>.,`fK)Xqb:`<<To"BTd^j<Qf!\UEoH8V?lcWdra]4_""q*KIbAAY\Q%R_kZI<
+%8f0jgUa!F>^,s/Q[JUA,?Cd284KHI.>KR1?7d8aFekph;dig'$Q\3_^Yrq2kZ"f at M%h_'e?0]EAp:_FH- at mhA7ae*\D2Z?%&.cqE
+%q0(+i4cG#<ipgMcc.Hs_gdm)n`/o at s.h@5WBa1XbAc)&BCTYVD1AEh]PiNe.MYiQ3aGEf=74IWr?)3S*C8-'afmt#MMMKr,nOaS^
+%A>Nr;G5XC_Fm;l%+p3i7,:Em[eOsm at 2'Fa^buB//ns#gQhXN&leNImS.BKkuiC'plr$(b,KZ<VRi'FSV85Dq=V!)mXM1)4T\TRE]
+%4#TPoL_0mt\0RYaEP`ark&VG]HTG*, at RO**Kr+ME37BPp;.U^n:E\WBb,Kn-\>NJKmU7Tq#2F4N*de,6C1lTJ]^SF7`&&i6G0etM
+%]s\Y8*nj1PN]*qA-Q!A9)+q4YeB&g*]#[+ at LLs?1Z.Q7[LrVs>%1*GTbK256<1-4T'6c&=n!TF\<KrEGEjI]PfLrm!6$hq`QT-Tp
+%D&lW1-V1c*^i4H3,Je=:=H?Y2!`cX(q#a:@4LEh=fKW?M8leh12,sf?4re0A'bHLHVMp3[PLmf'j>mGL$9?:EVe]<_^eS2"n^U^s
+%4d%]1A2ti4 at BT_tCeAH/NTcS">4op]N59[R6)]/"V<eH5*<TEfDMmGt_l;FhWhf$ZY_1t:F[$l;RuC(ZiWZ=##/Vd[;rQ;ufu3<S
+%f#N2>okC.bP"#!pm at NlpWc+/5Z`f.HmWP2'F?g;E`jTre$m/3ZYHmoio2s/o,!M'8#TJRH@(SjNG2K-+;[7*<l%#FXdC)S-ZTuYj
+%M),ndi_Es4`2j_GBF'&>CgCW^,RAALFclV3Mn<@'Orf>$c/iginB0UXVM=?"NpK`9Bs[8QZ#<r`?B=AO-O!muc23`aQ!d<$4G-M8
+%CBQb1dUj$B at 5I.7X=#/p1(_J-5@>6<)_FW=kPTp($fGCcFrCu%2E>VW,Uqo33YDp1WmelWQ4:R^@')e?&;b2<&Tlct(HW6LBp;+Y
+%#$qTSm9A\7V.^agmdlsLl3ZOSQ]n=j1EJL:fl<IMg25ac^nh_m[>J1b?16]&XB48De[,6b=6l@#8Hrmu7u:Hn2N'RX
+%&f)3eEjgA+fWoE&)#?rcZRFL<7Agd7Q`4,28q"[99SC+$_N.?'ptr*1cpb25BMmb/SM>:rB7nWEI$qWGc&6#nUbPT"4F0Q#c6F]Q
+%a?[l$PJ"-3X7?Q><l[,?DAoKW/=csKF9K7=7H9n9JmFZFln1ofP#Ia#E-tS-BWptM1ri`4),->-qD\MF*bMU=:cMEpb.eNN;8>r\
+%C0T`F1BN?O,gDRtXcns#s)OXZB:!,>G%RgsLm.I5=``UB(J<`tCgq,F`>XYOA!;9$Ei_St[Fdi9p3$k]0mKn#KshFel(Rn&VBEfn
+%&BZcq-ZW0VF)at7%/G#[$*B[KjADq/V!`Omk<lXOfbWEBEm0L^&Nr3gYff)K;fg+,r#sfM7XC]&R9"/<ps/>3mC2*99:(Yg><'r-
+%E's3,$b+P9M\$DqFKm>+heqFpaRVX6HlZh6/.G?jS'n3%!HR,tAr at Eq;0<gjhM81?MA[4aV/0kba,q7nd8ZW;iFC%F(q(2lBU-4h
+%'d,&I8bW*`m4dDM8PWo-`QeP-"X?T8"FF`VELI$'X&Nqrc,e;Vi[7EL:.GMM_GRROOHKj0kB[LH/n#VMYUM;b;q1.d>gPr""*'"T
+%^ke3mEXZ`:$Qr6XPat0YZ5ntEF(eiGAKTXt\_5+F9Vg_.:;N8X9=o$]/1$RPA\'.R`bA`g30O^Yr'\PecA8%DlmQS/N4]XC8md`$
+%Nsqg"3bR!ECbe_VQ`AP[?ikLQ&X@"h&?B6_atUo?2JQ\eGQ?/a[:smWX[j-Nc0%..8*lu#jVG0=<hEYG'j:hB*k&GpNWBm>01a&R
+%L/$r^3T!TsV,l6F-?DDtao5jXI4.+Y*2pi:%?-"%)L1a]N]$K-]$50sJ,(!&&[;p/X-.YoErRVnhRZ(HK6U9AS[3(3;A;-o7p$r!
+%*&ua#M at qRB5&N<>U:QLCP4)E8d$MkeOqeNjVj>Ls2uAi0d- at OI^\1))=^lN^$;2$`#c4geilASt2V%)W\F%oq_`Yoe"PH^fS5Eum
+%r7D,&F7(*?O=sbaiZgto%M^gscuVm3a"/f$^*;.rGna-9oYc=iJT#[uPM=jSHlN+tkM_p<iHj"PLe"b!]E#*l'gN/>>Nq;u0:"2H
+%QBFIWW\9ElK^F&I'n&i`"fiXHbM17q\QrFCjUJ:_F^d at 6Q4:@!G425n^4LtuX3/`(?GsA"RVF,rbMJ5k(s+!t=Xb)OOhbh"aqZlp
+%7e:tBqj59;. at nOqip:\f\A2L?;u+)s`&!_/+^B;9I4G$a3S5!W*GA)<_uXC+1]%]gLR^!&(%o.!<X-d6`]NRc^#j]d_<apiBfW%7
+%qndO8ibqR1T!C#%Y?%.IRe87.o7OAelRoUi"9Hf5 at Bms+iS5S"1\bNY*/H6f2Gm$i"<)^,`g-$a*][um%nW>SXG`?a;F\hSX$\i>
+%5,p->J:$YKRIoA^8\'%FDrjib7HeSH4F46LpGJ*?ducX%L(eXk2RTHPU)0lnY&jS_SqH&2D%3^^"B8%hgf at FlPV+5Wg_=BVZ$(d$
+%X'2<\Dnu`QH,/T7o:uD.=:n(9S1/-8.. at M9.GY%LRoKYZ%Z.\6fq.B,W''DM+!;"_pk%PQSuA"e72rPnA5-3d-oHgl at SYT#gmgGG
+%+M4u'pT@`3goH at HTdhWDo4>\:?UaAljN1$Fj&0kRR:$ETP\^k;dSrR6l=7O7^U&YD-)W<^lA<b[=YPWO$BK',8oIW%ChlrF<#6&:
+%a7\h2MHq"e!.i&X?e/VW3nG21J<^,rA^D^Oo;qt6[Y?I`C!5kjD][=fp(UMWEr:IT=7C-thIrGmE`$_Mg$Fd+ngmN#[RQ"fPB4m.
+%$k]siGohiAPi'nVrl_#1m*rI#(UJQY4=3pk?/=@T+IYTQ at -20!OgG0TGhI%ZgdktXY\]?]Di6uk69;"q0:_c5j5lf<MIk5b!JBHM
+%:`DZ.bTK]C,\38%@cn</</c<!.Q`ip,%7(K at mgJCV7gRY7GZ.BWN6M%>YnM]i54GTdI%Y at 4(hj[Wg\S=;6=c)p's);1^AlFCh.4N
+%lk>jkW?Lk\PM`1]\rELcR#JV]VjR:iPWKp,a"gZE[rR\dd1]s8_s&"BE=ebGg`;"2X&;2B]W)U#NK:DDCM.upRqSE.eBYg(of?;;
+%EQ7Rdf/==dnut=DnZ+&+4^kqm6:cVA8E+kXp7NKK4^3T%-fS*HN#e`#2'Lq)J4)YeFjb=Qo$0A]C+di)Z)l2N8hs9^"#99tB.2XG
+%E_n].G7oSr8T(;(a.=S0;Jc[b2/^7qOu]s3Yf`928DY$E,#KsDer%Ck\P3N;:J$?>Zg9*3jYk1\Po*W)<S2K=-KR<bRAq:W,4TJJ
+%o#O>hr"1A"fV1qN%:J'=5B+n4g1.W0!?8b:#=aq&dp!N`^`hG'C!qbmfe2M0*Ou95OiC#<ZR?[,QV&CdZ.<YoZ"JiWXE\ue;47aE
+%NfR>29)>r'Qg.;Tk1CT5Gol8l1*tZrHYEoDs!^IYj9>VJYj)$3]j1]%.U4=N@[G^o7seq(#jMPt/M4rMioG\SRZcjnScE,-(@2^X
+%'bs=/U4,o1QPc"TFtRh^WuZT7@<M7M6Fi:C(I]AG1g'n1W*K9fhIrDf$CZ<;&oA-C[R&Og*`0=+/=,8IbA<:pII0ctS;p%7GRK49
+%J+5?-:bWTb2n-3.@#AX?bN\f4dZV6'W/DZ4d1r.!3))^fZ8koc%M+de\f6fN6q*HRP]L9 at 7?!=\+*)sP&O0eV^FI3>Ku[oL4S4mY
+%:;JQFCi]/:H5WF^d/`o_3qTbNdObm.9<+K>4boZ#*8kXs^&ZoPF,)kDd?Jo;9Y0?j.G98_btU5(;o/EEGLWd?12.uA-a,,c2M58U
+%\VZ#%LlX2n;c'f>nA0?VGl[5(,a^"6 at NeW2\YSD1B$;Oh<;k7(cYaIhY13O7M9adW#EGQ)#gOu$*eiY-GYFWYf`ERUPYBC7\HM*8
+%U^T65_:Xh0Cl3(;6V^*b(U)C0MC!_)b6kch@;b+(PuB3]N`F.sJi>m7GFY`gGa at YRFg4(WC]puc!G44B<GjQu9(L9i):p3"3F5*Z
+%2D!VIA]Ge3pr4e#oWYNK*j+U.\j(#XO)g![4'1*tQ\@U7Hm`_8T\c8VR3nA7E3Re5g%-7Rs/,A>@[j258k4 at k#I-hhco``X`?%;S
+%k09F<61_&I*c$%'K'5hd/9mR'-YAM.Eno3R?/:u\Ydh%k"KaVPQ-Q%;QotPp?<qiM+J;C?6gMrS4/mfXNFf9XNnH8$8paMOYBL8L
+%>W1RFdgsc$A.S0Kn5:^K\eV5%2rqH5D9P at XaVD;)k:BB3D.]76[]!K at g$OHbp%`UVZF=Ve`q4g4G9V*hd:;ITau>BBZJ,]#?M>W=
+%0BOl/pe4?N_HQ9%cN1I2oa;$WM3O=L^(I#0`)b&o4;G^7W(HDeHfeF74A9lO<-GfFTkYX.Zar6V&0uR*Xi0sh[c*_GoSXD8TQAld
+%=#2C_K,)f8FD'>@eIi'u86W:B2M5R``cu\'*DX#qKcf[h^D8[Cae(r;bgIKcfUZLB.*f+U[YXsMF*D]L:uO'jHa*bBe$HhqY%DW_
+%EhFVVjm&@MZQ1 at E!>*6[K9g8a3)He**DZr+C`Q.M3:f=hC8Ws'$1 at 4!Jbdneeo9<DQ0,<r2)XDbE/#YucW.'Xi/ScZPq^Z17'*Vs
+%TQ259H5ID484K3[gf4UH31`j at c3Kn`\-(7_:[?NpW"l+r?AAQaK-Dq9l7c2<-TH<a1DE44(XQh)r,8\-e)Z0VJ.r^]Oh`d+E\tgM
+%NpDGc!)`8=d=UOT>B^EPMV>"LoecDCJ at RbAZ]Sb,U'@Q,VrjaTCrGP,F7nsX._C8%iF-l)$>Tn)AIG3'Z/B_'9f#Dq)6hEg!?olW
+%71!OKU<r$_7eG?Q)5(!ThI_[$R,.)Fgp$Ojee)>i/IWaV]>dt3_mpdV.%:C9, at j%pbJQ-.bQY:ZY7C6co0<Mh:&Dmm[b7Og3Grt]
+%S(pt-#820IGCeQMnUo=JBqRbl9+-KD,9ClWFX[;,$*pC/n8*?SVKtro-1_UL4LRUo8NcC?gEO<W at J07W<K at Z'l%A%sm3K?R7H*Oo
+%Rd*R,9nEG3p2"$kXUA5APbr%tX6&kET&e/$eV-umbf31_&3qFBDmq0:S.!Xt9X\9E%/]8>K<p,>ZZ]2;:Uf&(-OZH>Oc/K85nK04
+%>"&aL_L;#\V8^Iu8Zit+PfRn8dVPDdfE<<aNoG[sn/KkB+>_&TWa`Vf\g=MpRMHR\aU,D3n\Ojl:4,O=]1.jsP'D_SP`!qn*SZcY
+%SUG0I[&a],b-FmtK+8L9EJLNI3Od<]@5#"7fWR4$@@[n)!O6SL)_')qddnSE(A21ZOX!N$V#)'4@/L2[DkV$5b?j<?2Yc8$.G<TV
+%4E-G;@!@V;7m,Or,q!9?Mc?t,[i at uN).8^r&D2NXdb at _8b?%MtK`!P:\<ES3Z>6ik]2Hc]7T@@pI;"dcW>/!N>s,Y&g5q37asnGW
+%=CKT>imd=S4)gCZPe_FIFfA,Pm^:gu^Ia;5YW&bp28tZYgfu*DLG&?1aYP<m-VnGV;jYdG-]'?3IpMRf:eUREM!U<glm04`_.dO>
+%GX>BG:7@#J)k$:[P.["J>CVt[,>=8:WU@?'-r6s8pkcq\+U$J8G>5bO^i,Nb^St2m:kb%eOc.p'qb`!G:YRMB[bMA)jM2-FgEq'I
+%MFFgm3`dm(UQ\a%9WTW'kp3Glh3uc:Z`r[j\FVI;Md/kOr,6hm`Wm1SY_/'M2%+afQ]YPu=@m\7KSPQA>#(`)"QOgn7PH2*i9:MS
+%@HJp1940Cb9P"I$8%:p!DUkN9m!iL2B?+.GLuVTk%"P,fnJ$F?frCifE[JkE'djQ`3fp5aX2N,*8EIegfZ3CWhDt8r-*[NJ!$8<&
+%N!s[penmqdq"@9pY9$]/+I>Ubfnbko$D%fj5a##l-$f0=a)_mN#"=nu@`P56X&Z<1'6fY,m#oD8#QG`bVJqZGY"A/@m(".86Ro*f
+%T09$KOTSJ*%E1N\X<[sS0'Tc/c$4=DE2V-BX[jM0O9?6FUg8#L'AS6Oj5!JoH.).0pMQa$[+!X2Gq!6:rl4CRRDh.(dboI!hkg at Z
+%1Y54\0khBXKAECRjkaLOl>X$M6o*F:L/aS@#*dd[&<FQOP50AQ_V)9UkJ^S]3(G4[3OQ^n!b`'to,q4fDiSt'IWj8tXNo%%ngpL5
+%klH@;]iGW^/>je@>E8+H[oZBm@<IR6/Rk9k at 1&Zh52*7t'dTe2$e?t,a!lc..Rj3VTf>!?GiQA8]r at J+pPKO(J#5O:p6H$YQd*u#
+%5cY]2k;u4Vb%%Vu at 7G$I5a\:W`B6gSD$sc4G5M9N*6>/i6-a/4/.m36!+]nDZ`WgY/@]=:+H2\IM*#eGfn(L36d"/JWmnLg at Ut]?
+%]8$[#T3?9mb`$k1U:8=e[e*THfiJN?rCkKRZ@)qc+-Js$PmUKYjNg`[gmh4db!l+E0GM.(<Z*P[=H\:>`<%nO!jH,dM/RRSnutt'
+%*'5$kPh!>Z);Z_KhiVMLZ/rSdh^pp:?gt`*-%!="=1\KU at o!HgiuAqV,.(RPP9[=l-^*g^_!rku;AFse#F6+6dsP55 at K>6\*ph;/
+%I"I#@q`p(qSji<?(=JA0I1nB;2#6UN6Z-6gpGeB_4!%XA_!EDa5fZ=Jh8cDc,g<8&%^\+X_cW\f-M>&EM)%`,am-dBFUplMi&Bp!
+%KO\.A^H"ouD"<:]2Q+^7i/B/%T\8-fR^^qh`;<:oCKM1Z_ITbrCb+-`9X],]<l^>R8-f7e02J<)d_XC@!Ym:?q2O`6<-_>H7#>Ih
+%i9YH,*N[Bh3LZ[m at W]D:'K=oECCK,_Q,7ht\6 at 6cdC3eKldDo@#H9O`ZRj-knoF.7bTR+W$J((Bg.Pgn+uo5;p;a,QdVpb$SC/i!
+%QCk\1H``C+8r-SdVqR\;kG+l=>gLOgFik#';u0K at X.)f+/F`QQ=hTPr:JM6#h^a8`GokH$LlAcB!)F<!g]STA=`BRB_bNgH#h2,o
+%GEjuDNQ:Gupb?j:g"E9J;KeM?G5K(c/EL*Je%pQ#:ks6kM$mPo\Frb\XNc4[iOG at f=MPjdlZYcA(?q8 at gla\M/3c^?``A8ISkP_D
+%q[erC=k<Jn-ErdN;j)`ubE`0e8(FWk+c5ES,W;b;1D+GS@<7qJe@%@qM<2jhOk"f at m.-<&A<D3\qm,K#/iFDZ\k4W),JXc>l1=tr
+%`_lE.\HMCsZ:Ilh%8C*i!34_XAlblrIE5;qY`kDpGkOWENtO6>^O__K"bKBP<mhi<KF*l*,tF?s6gbMB!>X]faqUge=+-5_N<8]6
+%7>%E6P/3:S9nD":=oHHMB&aeIfk`X>F/nZ67>fo(B at LnWa@V9<\O<\B3;Zr[jYHt=9Rj(%VeGsE5L80E&O+&[W[a$GfcFP(Crj`i
+%CnKkN..]j;HfS;jNkGEpZ5Sg$PORRb8QbB3X16Wd,W5DI-=0cjJVKsEqN*n./?X5n+ZlM,S5RS.MG%@OHH1s.GY4b#"8t*[H<2QA
+%;_XrCl5je"1Dr71;iYGdRJ8fh$eKhf?D/A6+pd"8O-n?g7;_&E\@TXI8*"PCmh20SVoRV3;*2BTCS\D%qFMtCBN+rL(7LOj9SgWu
+%%_J&"?'`a]oo,oN`Mp^s9%^a+gIK9I?mlE$AcdLd1'-=rVT=[jBe"@2#WY!Ik/16;<-"X?]BmI,:22C3aO-FZNatgP5rm"AH2WBZ
+%OprS8-Pq`4N(lS\>?K?".<2jq.AgL\V9T_).N'jQ8P[=n![-4%98Jh4VpmcHW<-\3LC0UbG\VTY7Or[`o&t1X(4NO at S3&pk7Xl#_
+%D$sUVXWQgs#M5rC96CXMr#t[(?%/f>,TD>kAl?(i-J?pf,\<365dCT8CjSe(&1q-PLrHoM$2I[T*mYH=Y/3&=WLVPd*,C?g_]:K4
+%9!TfPW\o17m,T8q8XXEWl*i+-Yhurcr;E,kP!YF])?;@aXgETDC*U*l*35j.4'l)*ko(mj^qj4<ZfDX+_30"m#:Ye"'Nfsol3%11
+%6(3):.JG:J8o<?i8NHPm;RJ%`RNQ/NP?_r-S,F\k*:Q;?VG[%H4IUK\9,b/&d>VEYY&U8s_<napdUnoj%Gm[X.0qL#^Fe7ebmi-i
+%H'C<&(,#:[NK#^6D!b;iFr[]e&j9B19;(s!ED6>pP*?M5Q$B_Fij,::b at _3ln+jqf/Edl/MW%m#BLI`LFmBWN0dca\jtp.p=COFV
+%:Ff=L4ZG"uq1^"o7YZ1`Y[,XtCHOb787%t%XAp/3-L4Hd.YOa?Ag(%,/8_Z7$#=L7_"RS at -f7qsrj$l;JR6[s<r6s!CQS;HY-qQ;
+%#T2lF?I:m(GALM2/[mmr_TXV*VTdc%Y#70!F\4Wt&2mcG%`dSX/2737OtCa.(\X-:KP$d1Eti2TAjS&ReP?rd<S@;T$H',>*UdEj
+%2!o=G22qgQ&aa[;e4tS=A8//Y*^4r,$srI at DAdr7aeKLpjT]gY=pQPa``P/un^lG9Hi+RSO'3\glfS--5n9Ed)I(d4?9_5[7FIeY
+%K5ooY/g.cjVEU)2D%\IhIGoI<T%Q(jc,e+q*QiSsZA&PkQ(GL^=jN]\g&BOiJu6M#C21\Le0q>?g(i?s4%WH*1VrUn0]nn5q64mi
+%>K!csIoC+=%NZil1fh8%Os]l*/B_<40&+R*Fcmp=N'/Ys.;Ddf86oGo#FVd,9^Bs^dHI7-\Z%qS&f0QW?G\>Fk8]5qR$C9;,1>[7
+%DcDn@^-?Lk>]CZn$+?\s-M>ZTV:f=%JMYsE,>O7pLF!o7e<[bM`chV)JHud_<g##7`<HTK`hDSK8?b2C;\#,afRbEkcAoLh5a1kf
+%0!JbH7s8u88bR'?6cKE0%&hC&\a!iOWTf7tO>$EoDbNsSlQU[CHdj+7[dJT)=i-2]g='2C\#PuPi,138I/WUIMg2]N#!nF.5e=2/
+%0`u]&B+iRo3$/nu;\);!/a#11 at -'EL/">TDMHMOV30-Mp;&!'ES;*<[8'VY.+ub?25Xm2a:V3HI\$WMcU00?"SD'HKAb`U5`_2\N
+%i/-?oFs7i[A9TH.r+4\9.N[>h_el?Lm(o4GhW,#"c at WDAJPPX,5Y*,W3oY=-N*h.mh2)D8g31QZWA`ft$T*a=i>+S$:mELi=&Y>C
+%?bu7eRc7<jXhMSMZH9(B%-"Qqfq^Rd,ff,L6IPEH8cuA%T`gDhM+;?P7s1ACPhOgKrfKqB[*'3:.Y3;,e at 5NCfJZdYcYSluJL\<*
+%$X'$['\lpOVAo4SJ[c?Sr[B31D;/>@lXD0VnWGgkG^@Zgj48Ih;qYW"L\d^9?eP2#f.!8XF?g4:mA('h]I@>[`pRB>C=g)/\(8<a
+%XDa7 at O:6#mAaqEsHCiYV4$=;0!:'3(W_-JglH<1FMQWpT/XbMU&LM9oAL[guW&l7LZGMN-DC+LBCUdFV1W,93P:/2&7`(2*0:ebG
+%(dn#+D7,L#jCo.'-g7%)*)7hQi74PY[TTH#6c+aSqD5%USG&L!R8[lB>JUD$R]P"q3H(l^#."_]V,>h[$1#u$!uVoTqB4t(TK%d7
+%p5I!,SL!:e1mLbfacCStAq<plq9uN`QO;)RO<VeiaqlS!>d#[kRsgQ4Zt(g8+\Jq6,3I_D1)t-mlE-KRfX[E82ik8 at g/@2aqZ`is
+%XCRmG`=aQj8WCdUfjqC=?C!Q`+XAbumG`9hm'QYJ3(8^cbsnQ+PTc5uLo"!.E>+Te at 0$p&-$!&'LqTUKfF\hB,_n;'p2])fp.;7H
+%Jbc2&&Y"HD$C%3ACm#spWm`#X'=2^Lnqm/n2U:P7"joaF$Cg;dMk6Q=eWpX'I\3HkA\#77r>n^tiZ0\10<8g0>!8>*8_Q^'jbUf#
+%0-21W*$C[E/DBY]*a?KG0:oE+-[Fd#J?5rk6 at 3$,bF8nDp=7g-DT*5F#_6TT;kg>8$X959]ms,u]"p'X=]eCEC^#304/J1+$at?j
+%je at ZC?d?r@=bMS<QS+dUVsghmDJLU0b1^u5jCB$"5[rpDo\"B<7k,Xh;Nr8dq_14fehonsp,5ns\$RZ]^m2)i#cT'&:bhU*,+`1X
+%?D$%1Cp[\I`&HqI1(MjF]d0rP+r0FZqrW0'G^7p`ll=s$nco#YC+8D)ptKd_\#AN!ic'f]AH,=&pZheYJH&Dm5lYH'G9>]@Z+^%P
+%X4o:VnK6VXs7#a,#QOS.j6P<8r6&I)s7u=0a896Cj+m?Qlcu^5[t"8!0E:0^HOPE$bP8.-fD#*mhi)c_Y@%>+N][(P8][r>r8R2%
+%NV;?(gGaW>4q'X;]5dj8gREO`pUL4q])D<-hUOIDL&^`0n(tOWGn#QkD0NE6 at H^]`p[`P-E'M""='tcGs7k`&H]QA1kN@'H56(%H
+%j5#'rkl-oE?iF,N^A<6Sk*nTmfo`JPqN#PZ]^FhZQ[ec'gHWH"rUoVDh#F\[Q/A24GQ45s^R+cbqRE$lDuT\6_t`9hq`hgZDr6!?
+%p)WmHrp"t4Rr?$Os!L%irV\s?pZ()%q!!jSm2s(>k*uD'rlFgsI?Z7's7NRFo"+P8fAHN%^ZUm^ANVT6Du]@2?GHMqfADY\T3d$2
+%^V=.CS+kt5o>gJ!Rl=](1[a5lU]:8S*:LUerFYuVg\7n"0_\q[e3Efc5QC_*s21>rrr%7nqUOJP1Z"XO5Mj0SqT\UNhqrp1s)#9$
+%hq`c$kJ+ntc9Lphhu2VA^M_rcJ,A!X`ooL59*F3b^Z4ckrk4'^pQogqS*s_!s5uUr48>9->Q=!']KSRXroq=GacDc$j-U5MeJGYR
+%J+k%0K'2GY?f-A)TtNJ@]CXJ^k-+fa]mfRhDgPe;5AU6]55tPkM16EA_qTD0hZD?rj<)-`2QV+Pr:9U@=%QH at Hh`kr:Z6RZ*k1\1
+%76#Kt'[6[SYB;>p$]<iio:,_gY/^F80>%8S]5R,tHQKIGSppiq4oZdn:I"BA+7 at 0bhY?>YIbd3#Hi:Y8b6Hoh]tC7-rU0Z$!3cFq
+%]CCr3J!V%R4F[!RrFc,T;gnQl)B/(M?JgT<OaS.7Abk0FDu&/&IJ`u`?]mtY.cgI[8]-&>UF!\R<NLBGmB9F%s7#,kHe`$.abKfe
+%EI;)QHs#5Zf"CQ$0)LEbIes"5s8(\!39>&NO+3FKc--Opn8W)h$.APg]CWd%r:"stmp?$N4oO''4PA9_jnmrEGN52Xs)5Xon&DDh
+%pM\r<Hgfk*HT0f/Gl7:7nc!u"s7qHILNiO&cTc[E#s[qIO$DF7_co8&IXcd*\PL!;p=35oCk!:WX$DQc9g?A\rp_@#s*?dCk_#2s
+%e_>!I*pN((q7#mtpQ)Mj^:F2li53?l?B0`#YK,\RDn):'095T%c%kItqK-TP_E7VQn^gi,]q1:gGU&jP.c!0mp!0bTAqNj*r6j<4
+%Pips'.r4*TKuXQc@]VfL0>&fQ2;[5?GMLsCr]Y2jlc7/mFa^tTrr/)hl$rR/52Nu"qcMXWhR,:LO8f%(s"M34Hp at ITqlBOHI^f at T
+%Z$lXo8Y8?Y\+K0^+2 at XWm/HU:GjGOa2;d(fj*Ojt)gf<i=8.JqplDVqKK`c5V\_K[j_;.%nE0+fHh6dXo2BtHQLsh>:OdLI*fK^a
+%LQA(2s67#[h7NCDq.Yms4h^ZdKnO;hKDqe#>k.a+Dnl0'0/)T3IX#%8IdjkGa%'Y75C at jiO6>^*P998oSp/KCLs/T.RTK3kSc9_R
+%q`hBn037eiL&LY,k?U*_l$3M`HG<PQV)a"9g%hZr(H[-AgW)WEY0oPKHEl69lhi%P:=F^(fGD<KrpJTHY/f/a?sc(Mq=E`rIa?'<
+%k-rRBb4ir'VLa3XX1n?`\+.jAM=XYn$ElXjTD=l9ji9KuR at Sp=I.;KSXn))&(bU8`/b?<^T"4gtgQr+-mt_5El.tr:^RL_?[JfkV
+%?K(.pDgp!DrFcl1W4q')f\\4><r?JV?Ta[1r at Q>RjOZQOfmj%TZCZRB'If[BjO:4ps+*W<prRYB4,gB*G'eDA%kmZol[Kc7(Vdc"
+%5/+Vc?TrD:ah'b9p?ag%_\V\7p$"F8metr05C5nmT)Y^\4Q?=HNoroSIr(/B:Mu0LUn:oC5QC`=GlN,oc]?!25(&*SqW"K3qViEA
+%K_J7sA8_ECG/A/]/_h.^kL6_f!5A9g-X8+9m.6hK]Z$LqbPq(0Vb<Y2l$4H(:VXnG?@D`s:\fAKh`hP8j0Z at 2[QiI,:XLUTh9^Pc
+%:TWaf'DW_)O1D%'e&Q;Y/tLnMQet\JhA-ngYP-EIr3WHnmB?MkkP]*D+4'Qea7[u$88s%LVLA>kI(nb++8sA!=8Sh.55a+ng;*L_
+%onUk/pi'6IjsQ)[o,I5al$dZ8caT3(D%P`.Ghfc83'Wr]r'0diYJ0eJo3WQ2n5um_I*KiRq.tL5h:LZrhgFp&- at 0rcI0NL)]R9p`
+%-f=C#4BC`-(ef93T"eOCVl9MKAGlc?bkF9>(&-4i5IGDn>K!Fplt*La?g0sC+iE\e&"h)-dfQ@!GKp/@:];=HShK"8$Mk/c^A-lH
+%="g?A,PJjaN`SFPk-(@3)5#/TIrQL\rM-=OmpEi!_-Hp0h4"q9$3mu<0748I'4S6;05;I;T>fu=Im8<+?9JAhdn_$7qp@/]@)Ah+
+%n`fo4b<Q$V'liaMIAG6]D4fD?Mg,)r[r98b2E!o7?T*C$k4&#OkPLgKkjsBiIG.r%R<FbMs52jpglnE$n6:,RNFgkdBOCf(q5<3A
+%dlfgBqW_XTpigZ6r!>Udj,]+jG00>Cne6tST?QQMO+-p&QCkhRq3-:$f2)/:C.:U$ilB*_T(g410D6?VdEWOen/$TPj)t=P\*mXQ
+%rTS#[APu=_pjN%'*fEk8]o=Z]=.EiZp5C[i)>7.('=t);q[A at 0q/cI\HML4oeSO*g)UePa+VU?6^,"J.^3o%#=1MZ[hV^S)r)"R+
+%!qGP_?@DLA47nCO.-BQJO.)I5#O_?@d6;qQ*e*`mU5"_iQTj6Ccb/HJm/8 at 0rV2!qn>!AbGtD=S`h0F6F&)(Rs(k=*8H8YHVju]R
+%FT;@!It#!"DY*nIX*_:+(T[LN"@$C#T:`q5G(/De56('0p:k]Oo1;X5oTT^_bcg[JT?C(1/Rq%14MB]4o@!YG55!f\dD,Y5:Bc;&
+%$N[Fprq,XA7X9m,c`&B8:%.kTp\2H#YCFLm[s&KGofp.co[86TMB@?Gp[@Bu7:o!J!C36j\'2PVo^.\Vqj5(e)Lq9YqU"D-q*e!5
+%mQUo30<Y<9Rm-D$p>NXXQi^%CgM`tn]nF);hT+c'q9RMYrp4Cjnt.Y6LT0V=IesPI?S%p`aec]Ja]1Hg)h+$eHst?^T>(;Ds,dh;
+%\qA<Hr3NU!%A/+Ej'qAug;X"f]QdVqQVf_*&CnP0"JJ$naIZH$B-Z*1T*\"7QS5V[c\:YNE:%^<p_117*1ad;Qaksd*m3Z%4&O)>
+%0:q^KoD27drV&MI`J\@7qpKulgfDd*?\Y6:>#TZF=C-Hlk>-S,2YbD3%XnUg4bJsMJCH;\O]:rE[!:F'.8*_]8%'r%q6 at 9nGu"eA
+%fe5(U\I-caKrGr>Q+`6e8Reo!^515eOl4aZjs8I8n>;Gg8$l8]2+lODGep?5[7.\301kog!SdFRPNJniFk<%iYV/#,II$4=VmO%+
+%0m"@Ho<pWUEM!0`"(j!`,]Xs+2!+\70orU^Q_M4e8H!;/oWA!]a1d;XA3#sC12ZQ),Yr?Z''K.SUDt\0aJ+nk>1<O'X/5]ngrc at s
+%PkXJ$]5mOehq0=1S6oIKTsi at 6j7+D=DSNR6/ugqd!AC(ePRii0A-NKd*onV/Z-5)ECYr'>YjP&IeWcRblfA9"PsaF)/us8 at Jl[#L
+%UY>Os[kLEPk]K+NeHt]`dIaQ+k1#ee/1OR?kLbP>h9f..T#^,MhMs*;lMM at nH1NX3j/MC:jEKBub)09p71Jm3cL+I8afC1gh7f[b
+%B$TdYXiE$&W=lIV0g%WP at 4Vc"N3hqqijBDOrKD7bQ,JaN[g;(=K=>32OX_U8Lct2imFJJ1XB%ik;(X;)[+Wg'BM+SI6IrV]W6Wre
+%EXg7fg2%Nbq7nlA?'>?!UMNtiBp5SU2^c!J,g!HTS*b>r/mp<*"c8ks3dR)Bq\W0dfado0Y#I&KE27HWdOM=kW)m.!Sa3Q<0OH!C
+%9APM9j`-o,hlhGGC3 at ZldDru':*\?3+`Zm@%R"`E]Bg$f1;1aX2(T.*C;8XPd>bIAC*VAm-RkB=Zdh:Hf.Qf!>M1(`@D<"N;qCD[
+%fo at M'=V^L1V!_;L.]B:^o1A,&1";]8A27*u>Eb=LScm+hY"CHf,n8P[[ck_T!*slCLeT]PNJg^@;K\PbH7`]B]HcO&SN*S5\'*7P
+%Ep5L^DK^._RP8JZ!foK8j2(oT6eU(3cAfCL44eOj at 9\t[:qatO=;H-4ZUmRdb!S&W7;BfO\KfZO0@"4sZ--mVE'VGe8Nq>hFF/2=
+%l5%>mgglU]>JcDDhB\q"(]J[LHob:j6;,Mc&[S^Z5MF>jKd.])W4'?Dc:qsIe[I."n>a(.q`:PgL,7fcS<0AKBmCuYk.7n(dI,\q
+%B8<D8+"/XdF?3D,$'Wk)]<`IbgUVFj:AM&;9r4c<fqTgjp4fbTP/J-*_k"Ckj3%;DO\2cnc<K6F*KO9)ZcQi4.fiFfYH)_c=(YN5
+%\W`%nF-ci&H,p2"jldpQFq&M!,A^SMM>Y`N3CUQNEZnd^-a;cCC^si]4F;4dW\qC#UQ]^R*CQC at E0,F]MXi*SjT`h==hN$<)d*LZ
+%bb[AGB>Y*hO7U9^VF,N&G/J>P.^_.5)TKd8H/Vej^g9f#i2*WpiP9<_U:@\nV#>&/O3D6!*d&a2Epi5lSBF`Ta&[D2W#\+83S<6O
+%?iURpZ*.k'GjL.9Dbbi8O*^:,2Q:GP6X0$8q9;b1A,rk(8*Os#`HB^pc$/R0EG1]IDq9C*D:A<FI,am>0alm:+H?6flB`.tS.W[Q
+%bDe.]l![MelsFp"pYA$j9bq+\Db)rc_NBJHjL83ALPf<7;hN_/6U",W)-!har:n'7nce-21(hVd\_rP8-XL]D.5f5C*K?=f8[Y_O
+%BLt<Nl7nN$`Vg^`-.u2LAJi8M at oW$07UdiuXBrDjV&u_72tm0HA;Gl[p^8,n=0MDAHE`6`dr"GQp4^_VKa44rVj46VaM$;HC2uV`
+%GDk(7U3!HZrn/KC3Y)q#&LNGnfqVQj at P*4K?:l!P/$PDml7=X_``=`-4)$g+`C$GIAQ&XflHNr-m^/Hn:tb9DRdGB)MGn!9iqRic
+%Mu),,IC$B1PBBkn)I#Q4\hjXjC2FclWNK!!4sY)YeirWK/=--idV]^DQ(4$V\VA%o-`F4(S7%@:V\8_Uf5S=ILZ2"U=C$qX3nUT[
+%\l>"&N+)K]X[ZVEa\TO;<mLVeLSNML.kp+KmRE_AE"'?N]'",RdK/N^%h,qj%dq:FNON);F4*(k?Vf0B9e*)j82lG7;aa4m?=LW:
+%m4$+^h9t"VJs<,6s4LtiSV(*@j]?/`j.p4Lf*c7<A%S(EDni[QgiesC\6hkm`ISP;Z9YZ\PSmGQ9Kj)#-e"/=9-lZVHdjNgbOi+e
+%>MK$-c+OcP_3sIaC_$Zq.DILuS:&+<ibCSaQ,d]\fkpn:-*\\]'R[8I,Uq326-/TKY2$SS29Wk&=Gqd);rZK-k_$+]o*oSA!#pCV
+%&<RA$Cf/<,#SmeL1n:K&2E,,IRPGT!l(h_IlfA8\H:WrH9u.%a`hHpR]AeT'na4I,b0:8k<N^ajD9HlMJZ[2[G5+W==.E"0p@%i&
+%=oUmWbF#<>bO2Gp_5B<]KUF;QVO(:S7Jc3jMu at U`$BH^,$YU<3`rg,/,f>k>ZOX]T.!gIFh%<@Mc3k^=4"g8N3VQ2S!CTh0)djsS
+%R7%Al=GjUkc<Y/E?$11ZPKP?D;j.[L4DgJ2WS/&uKde(@!ah$3BPWOK0>h4/)5VO)-ZJ(O!VpP8/`D8/0ZA[&@ol/@Vp(n9VTj*X
+%5kcnSaVA^g$>2d*fH'nH$8s#2JK,k:io*'@1b5Fg+Zk9I.$<tp9`(t0(>#0)jiVr.G?%BR$##15;,/Jd-$EZA]@p at g<'%i#!,1o&
+%_!4og0>OP]^lfh\Tq%*Pd29YOoo^Ln3KQV5fd,E$U65J[l1)\!F_lr)a at n-<4)i"b:cu*q'4%1C26a)*j/r_):;e=iO<tLaO$S;J
+%o*W2_;s%MTEd=dn:E7$_K>Q9@[%tj6bJN:QlFG$m>:OTk-rSbd>f\@am?M*W at dViD4e0Z#aWM51%DWo_1*N5*),-"dHQ)aE.noL9
+%JjOOm;\G>N0oq3/aLR0W.X0tK9L#Aj+nRa\dA*CC56U&Z9J.T-"tIETC)\_g`+ at aIj1%.K9+J<1G`UreG((3;%6;spBR)ubE.d5t
+%(QM8EgL[\_G7lH>2.bK4nlp$2L)T5pW;BD^?<&`R9U>jBGi)4^6g8imiZM$;D-7&]]X)^mdel"-oHi*QpkEqU;SA?Z(F[3H$/@.)
+%0foLKg8.&p!0^&5lD,h\.Y"tdFbn)iK(mrfK+k[hTC]%\S<Ni;G9N0!+l,u`$Tf[7]%JmSA-nh9&8Xn*a.4%PTZ[jfYlbVaaHZE9
+%Nebq@;D?rsXqtV7,s+2a:MOq=!A&FT>9)KGFRt/==b<3:<D$7OmRuKQactmH$pL"pE<qH4WSNkWnh7rb`!D9r2!enP4kC0O)buYM
+%IF:`XmUC[MO]3Sr1G599(1l'[[hC-2/Ljs5<Eg!h-Wi]!N71(\!>`>QZ_NC&6qGk"UZrpgZD!q]6D'GsWX*h"!dp[lMdm4NUnTl4
+%H=CD=OZZc,m_^<:KLcP3-,]4']h318MAfRKba=i(AE.4,1l%'95uL$7(A0"OE5YIh=S8XmCM[McBB64cIpSo!CQ at -YlSK"+;mhW6
+%#a+XN1-il7JXNNB3F8S!3fsCRIM#2:6pDB at Cl@(K[uIJCUl(7`Ygqg<;)b[>gq64-OK?j. at mUH$V-\?&lKlE_>'ueq4KCLR^q.Lt
+%83XILOjUbcYtrboOEro;U:A<:/8^'*N5J,0"lc%X^353IR_5i0fcM\!3]\a;A<XqUp*6_.+/d"Z0Pj at h^r<l]h]-9KqKa)9[Y6.q
+%Yt;:Ie!70<e!:"ACsN#A'I[k!3S[0[0e7CPS8Sg2R';LFHs&O^0EF'b&qs>6_;,]fN2o1bn)S(1DLpqt#5<%29Ys]-;TIlYc/<d@
+%i)CFmc`E`/JN$JNLSFo?/h,*jC175(\Z6a2UH#&E5Em09WMs`]BSfhC0LuKQc'XCh'rSW;61E%Nm.)2NF$,eJ?VF/7a4ba:!\ZF#
+%*##t9R5iCo)@<mo27$"/O`Z[m8\=UY\]Qm:VWPcNRFFQ'GZ((u6H+6BK9+(InQj%)dN\@^j9UObBAFGSr,]n+.-dICMYVh@?IG"Y
+%lRf]aeoj]+cL.]O9d"MuCJu6M,41'm=Q5dT:?))m+Z!7%Pn$D!-gsJ*I1nuB#Z!4sn=To2:_+i0TR!Oek`GMuEQc/!/GA^V*d']i
+%m@"*cl>ANC,C,^+Q7>+8gcQ0B3O$J!_jd,b`Jt%?&8N!qXe#,I:20:LWg?5W8G>Mm[EUup-brrP8ab5pHool)kU?g?;oDs"(Kk]]
+%cK^[<>nE^-&hD6r^&e^t(BH>W6KW;#s/I;CUsm@`7bCF[XWreHr60e0dIG<CW,?[_iUIUlPjAd*jH(C-d<=K-c<G(>A![ppG=q*i
+%5i-q;Hm"5Nf$mVF9(M1=3YpMljF&l^Nq/l[i`lPg!W`/mP(5PSdg\8]bIIVHFX<dBK/]W=eX0##s,^(DZ4>$h+8Mi^5np@"0XuMW
+%SP0E(`(F at 1!<3"_T+'J8ee=l*Eftl$!(JMQ_pPH965fjrEXFiUE)"u+2lIf@`tHKEJ)u#N99t$j,>6_M/i0eo%YqmDqD,D8be at -m
+%_"pBeo_%u+!TU`ZJ02Vrf&arfDiqW?#r^M*>`VP6'r&GM9l__g6aOiu9.lXMV:NqcDR,MBB8[^eT:9(LR&ks?jJ&]]`o\K at gnb"s
+%=V]ei0C.,iXjT+Kc#OR5W`28TEnalqh5LnKo!&tLLkoCnm`R$I'jGGurj3W6i0=(0 at W3%bJjNEP5542-m33M6$.e;(3/:$3j at D5n
+%6`/J^'NuXM7h]atlr>.'%:iFYS61+cZZOQr/(KF<+">@6LJt9SY%C9(_&6C=p`UfYoaN)eB!Ib4:3,Sk]'f1J.>*]I+d[e9&I0r`
+%lC3$`CEBtreI5#9/-01!Ul<S`[qh6>b1V2'X_*R"q"urD^.^5<#d:%%=`i@$OE*D'4Ydd.$*HiXfIG]1HP(286b:L':FG:";@('0
+%p!;_R"E,P?lRjhIptm7W9E%,Y8^\(Na.ZioaThpm9d73LF5Cr?OB7gios+j3:GlXZ!3]mF_`:qK>Yr^Y=Ci[?YQdt?7/!ke#ujn2
+%8M/4$VrR)S-3_9VkuBENp.IT`iq`,[jHGEc/UtAn),hJL);Pi7amXI2gaPbtUh_\b/lG3>#ut`lT.AeVH%QM)1Ui4=ZkO,98f7/n
+%\Q%mWSN^A8ElCc<-.Q[bYqeV0`G.0%<otq^A@?BH')s9`nLXQJ at ALg%fIu0,Qb5Y!<$!_(Dpai>R4=/h&oLbpSGcSQ^6(/#pW+H&
+%g=8V)"g6j^E'(Vl=r&PSP;F at 2.:*-W2JQ=FPa'\W;3je%nr]Ag2!;1),W;.?eW+/E$R(@;NF\+fZ^?f!N`1L';IBn&S*;SWHjWV"
+%WZ?i.0"Og/.&s2F$?_Lfr05d/@ddse5qV.a((=7rD\$-"%ll$CH&#"kQ#0<SZ`=/?,jD%G9o$:JPX&co*]Qr<ne<T8]:qp,0j#tH
+%&6Fg[=!W0nR:C&)Z;qj9lTBa^&hF.E8CbWmJ`TnbKH!*V.Ckd]80YIE.Wn9\7`:H/&Bda":0\e(=%&NXh1UkX>4W3rW6[n1n%EbT
+%`Y9fe\J!mL)9=l3\qu0R-S.N?F?%Cc6R2tY^Idj^AGkq%8#BMi.TbD[,?V%X9-Lc)qac0ZH3g?N[Cf8DNI*RK3s*7HO at h@ud;gln
+%4O*[<CR at i]*67[$a=B]uk/IW>B<A9-jcX"[B8oG!PjH?u.DL-0>5(Gd2AJdZQAJ2q0gRFd!'"Q-'J<t%+oj$+X7Dti+1b1<R%f7e
+%4;(O&&GN*nJdh<sD%]"kT8Ii[GZo+NVj\X-I[)49Ws'?>TBdaXU!/'d5:bd/\Ks/66M$E1\Z`WqJ)rE9,cd2HjOWGkTHNRp at Ha$h
+%49;NbM5,>k.Rb(m#ND'T5[<F3K'H6Ob)"=1-Y`[9jju`LUPH86lDDPlS-k\'!,V<BFuQO6'pU#NQ@!mWUqm1?K2>MiAKK&ibt*PE
+%f\lPZU9`85?/SHl;3R(qb.'j0Qk&+"Sl_0ZML$k,:FG1.ZOYn_n/pd/a[u;&2J at Mm64YTW@8Wn4*E*HkgV]nPl;ICVo4OJPg8t<q
+%@3km<^5O0XBF^>m4bSbT]SkUQ=<gbcR[?e.4$4p_l3-CjV.HjB.YeVkeLYIV)[e3]44W&#Dq6e(qh]N\HE$(d)c`!IqG4TClM8Z(
+%c)fBLH"=3R=MJd*jP1 at A7GkA\Ok\!shhVpQSR(F.7;a1A!M,4OjPJgRj=,@%MnoN1YYdhi3RCLNL*e^b1oQ1gkE6adP'0S9*8s)A
+%i["><Sn0H?-+p)T6m.F at lR<j];SX=W?a>5d>)6&uk+UX0)4haZ14,^R#=_"I/#sfClHpgL(^]De_[F@,2^4_KRc1LlnOu\'$i_9$
+%D3EW2<25oF8`;iGm at -Vl)QpKN at o=F&df!N.amcS_p/()o<'Yc4%WS*Lp1fnD"BdFOZ'^-u<UEo^6Bd^](OR:?PB?j=q^fpJTI,o=
+%f44\Yj_/$@Q)qJ\2TW5MC_7Y)3nV\WOo*rM!W52f\c7:$>\bfF/HT+<f&6GTP;tB)W.\8BAArR/U<hV8B:HBM2ToJ0ot-%0`!39'
+%CV=kE=>@;M\Ksnh,Eel1^ImeD=66Ze at K\2f'l,KBAY32U'EaN[.Bdr-D,,+\2?Q`@[8e9T\&ch<FRu`Z\B@(q.?^UK$91ZN]G at iL
+%QJA$X,kI2.I[;08fIsO=>?*smG)5EQj9#`D9(@/+#2<riR1:8X(kCVoaC/g4?W at -5bn;D<9Z\m5ZmD,fGdlVAr?`8NPbF;-#Zt9"
+%>;`qiCiK2q(6DWqWaI,DXYo]W757u2;TQa[io[8. at 8rmO*V'16Cm]%P9cbUP^P%AF<S#eK^ZC:cG^ohi8l+B\33c]4kE#25/gU&r
+%I#"[C.EAn&_!9]G-lF&^B*GUeKi_-H"tXK!N^.GG5i!bW&OD5[$A/Sr?MK\Tj]PLkD"W%?N;U22e129Tfe!C!V3sK=(Hn'aDF1@>
+%r^tbfJp+=@.Z5G4"gA<re"j]Z),IOt715=C"ZKqXbha'B\L.'X,3L;7QmR0ISPPOTb&(tPZB;&^m0_=e9A$?2-tllF<_;f1?X&f6
+%"7_OGJe=hmQS'+*il3R:*Gd_oJg+ZZ$??b@"n7Kk=aV^O"";4X2Un`mV8V\Z,aZ0JR[JDT4,`]&6uF9]!5u4EJ_*IjRLHCePZQF7
+%jId('@;j/[jq11a9c!(*X15'?r:RF]b]3^Um)BXqb0MY:`?>Odn0!N+XQiF9d1p?$6UR`4XC;trWRgk(OT at 36[.sug&Nb4)=_QO2
+%RANs"2ADaL;gr7+J>M_sa]W at VpkX`5I!fq_Tm(3YP^Nu)##54[.SDp*O-Xdm=AK,hb at ae!OB0Y_W=nOtDj8+6nn*LaE8'p=O$K+L
+%^9PGhKI,P2j;Z;51^A1"4C;&8rd)q9GnRRETRh6:r="K^s8!kX93N%_\sj-!"8a>[:7dL)&S<J+Eal>MMU(]TN2\8^V3M(rZc&)Q
+%G.(@Kp[qd.Kt?F7(t.)O.AZ9GmuY[?\"Y)279G`.FsuD_>Wc"\eO5MoYH,:R;]CURCf.KV\Xkt2"G at G8Mk"IoRS95-iGD2$b/\g3
+%$^?m*=8>bJopQeM3(cDkP9O#^$qf+ob9c]24BV`XbE4&H'/<9;+em(:nJM^h5m6<%JPX2e8SpQn[j6f)&f=3DK<2 at i\p#pS($)Km
+%2b at oWgb),2;`CrE9benY%41#YZ>i=F8r:I0^Jn6jjg.os<"0[__5(p`YRHPoJZF^)L\jn1D=)'_-.2bG2inR]H']"TB</5*,`<$g
+%=p\e+!HL:F'cr_ZD&.=EbY&]P67',Ze*OW.\tkO_b-.Tb-uKS at b*1.Sq@[hK7TqbhEGU;jNu&eqZJYd#9:6V5R'"SlkHbk$a?NbK
+%D/B!Eff2NuWLK\FVZqti%<M.t>ibWOKPnp[<F9Vg?^\3DP6R5Q&NglEluE/FmL'V%)>UES;j"745t^Qc1qD,\f)Y&`&2;A"`ZB<9
+%FL5n";90K-(uf^V9cioS`H&n0Z<dO5kM*?!VNd;G:c?gSn%lX&]fPtb/K,-qL\`35\)fUj/pfA,?(a^p="65a\/fs]SKjN'lp\4%
+%fjD0(q8,7c'ft'68PVb1=s[P#KGP0#5Y.7h]<POF$@YEDoi-Xg%<%MrWbI_DQf,5V,kTN&JRR+2MGC2:*;NL+3iIl8mMJiq>!6*B
+%Bh,HK]Loo:p+QddY`Cr`0&o67`PeV!m4ua3]):KQeF6Utc!^8Q4/H&BER.$X?1,.KfhOk'iCDcV5*Thff%nq\2o**P74+kL"&[d2
+%1-5N;g+uls8Vmf^/#if^Zt/K=6,;?HrC$3KP2-d2EP$@Q+BC7^:!S<g,S^X'15TeY$snc5CH\l4A(Xc2b^D#([R'O<\`#"Kg*%]T
+%7j049*fFOG!738[aboCom7:3t;+Vm3APJAo6mRhA8EOeW>Hhh$V!l7[]Y0l6*sn.@;!r"sAI>^:0u?+b<[%ULi^kO`A5MC;:Veap
+%DM*ITh5hofXTktpECe1t=d5^s-`7h"8!qu<a&G9Z;tMYLmTVG;&a4jp6rR!CS]o5Uj[:iVk"2-?=cj8N92V17:lA&=?qp^HaY'oA
+%#"1G2h/$+]5eA.^)7uX&*$rd?H"+[3m#O3>)7*MW2H8gX]/1%g@$D'LHV+d.FZChUf-N#T>sGs4]./!S8JW2F at U9D;gH-YoU"[$7
+%@$%&mV(B&A"Ob`K7Y#80d7/.!h3Ql4*[N6'$;sD%C'-et<7%:el's'?<XWN^T9@$lip#O#@@"<P:CHU2dn]8/?.m'tMc2d\[DF&E
+%\uiU-#q"!@CMa[i at Ru:-R3]mb=_GF1"fiM&b96)LCk>Pfkt"ZS1f1@"G<sbR.CGUa15,=V3fCuJbUP4:jRYJE&WUMOLQFNf+us+X
+%^F!Ui!U:ns'h,P+^K`mYA(Bs@`$O-HCVb;tP at NR@;ET=KJ6bKe5IS.sm2$Zb*&Bh^B#tBMAK,[5+mH;4jf8j:h2;&B]8*TB;"W\I
+%.J00V_B,#]Rt5EsU(pqAXD at .0P71E,K4&k2fe%eTpQJlAgj`]`O:PYkZ9Q5 at nS!ol6 at AF^eP7H9>iMJ/2)7_61^i]K]kY/lF^p5C
+%O-0SQ\_2Gp+Ua.sjJHc,@=$@n9ffNZF[sGT/RB$>,<L2_c3)riecQPI(7+?\p`_0PON'L79![,hCC6J/,Hr%27GV'JlKj4;_mULg
+%Q-IqV"`#[,4l3OU2-#=0G0o^5[+YMHKkrJ\g[Y3;pVGpMS7;-6VJu%V<5KaXO>3a.Yh0Cq5Oi:b,2^8<&u?)!+=.(78N:9-B3SkA
+%A;&O[<,,k=>%:L$d/Nq.nhB^C<0"q-S9C["6u'$cKkpn0$&^AeWs at V*c;.Hj03'J`IQ"T*:?cIOiHZj]9Yd(t$#UCDWp_!]h#J3:
+%<F.Ua.>t<fWf)N/Z[/fI:T8)m8KlhLg$RA#fKO2&b9gu&8q(;FQE[le!/FilC8k. at j7JFO*<bAP'nD6E`TF(Am>s^m)1kMHX>Sbf
+%:I5FAZ&Hn$!b?(DA;*1^,9j=r.SA-f>TKuH at Ip)e"6jj at p^FbL'm*eFLhu7JB],bD;noQ+6uJK4=<hKbC0Q$O>;R3Db]Y;bG3boH
+%-*e1"6%o44RLU[@e at fl'LO)[98AR>2<f[4Rd.-1/_%hL<^4pc*16c`g]m0Z5/&.l0WCeJ+&rHu;W/4u>8[B2?c;PKBh'3b@`;+lJ
+%"n%L(qSt.,-t$6gSNg`@O<^?8=Z*Vc8if^'EK#A@`.<_N=)RPm1n"TY=a21XfY/?bA1kn,4'o0`+Y"6jMk$1dp#.VT^`B>X.iH2N
+%#L6<lN!K>,JW,HVWWNQ/MiF8WY&A_QB>3="TY7V.D,#pYG*B/Yd>GZ]HPrs+fKUCQ at dR+mDdBL:Z8-Z'huUj->s<oLHu+4NT.2EQ
+%.n#j,G6tWSXE1hK5'ZhO8)Y^kMp(fP\Ys^259"^tDe3\+WU6qM,(85c!+_@<g^YVOLa$R!.2aPe$Wr@<_MnVI<GZ-Jc7t9PcA1'_
+%BrfbJ&]_)^JS4D!2D[d>7%:an5Df(+ZYVm6-;1ScHRt8)3>ZB>QQPS?YoD%;]I1!5qh96jTBu<mZJ![KFpGeiYcV-$a2__3;YqC-
+%p(.MqhY8E(,DcW=MH#e!O*N8dZZ+qiQIY[q'pDU9!o!h2ECd0lf?X8KZT$eZHif.7Ou2fq4C4"c at hcpGKQ6'&d\PUHm>)-&ZjV8;
+%0u;o&:i%Z"a4^.#>%3IQ)2?t`";q(/?<U7rp`tX!*?PQ!l[3($WqA($p at 3OoNH&FD2NZH<!pk&R^14WXaLR\,mFu7)W%A(*DDmjk
+%$iRE%A[?3/[G4=.JdIpsHT_::K0:`+G)=idoX1N4nJH.mI<A at Z2;oY-LSr\%D&8D4cn!Z6d7EIH%WNDsgnSQ``]a)^+pM2Z*C!:@
+%?%dC/%WH+B'*&V&h'.-X`5WRJG3j1QqF*08d4'ns.`2 at pe3hXFE##F?@C,msaNnUV]8$f07RT=QWm5;17_i(cCNJ at b$$\_39!-'W
+%[_:EqBF?jr:3tWrfRk!`jNUYW"A:-I,=+KDO[)IZGb/GQ[]W)-Z8%`Y-Xs(8Rdp5*Td(u)KAN;><)FR,CWk>27Gsb>e0=3/!2X$\
+%n;r0dUo'.]bV;][Rh^Q`Tu#@'&h?9R&66O0:^uqoRf8PJSc(XBSC7ZLL6X3`@3<q^>h7cWX5 at lXM_^`B%Kahj)m'TtFnT%C7<34P
+%98KIW(CbKRMk(FA[\WIcePM>N97Ccai at 7970B0t*'2SJsA;]2OStpDl.!Un)E!SkWI>X>-l?\UL#P"J3U8lF;$!I?A+ at i0.-+_W@
+%JQ;5'm%!093ujGE(JhOA_KkFb4-NZs-=gi/e9.cXH\eH<p6MO]?2)%b6$3k;m=`BV`Z'^^DWX7IPH;mX$U;tCJd%Fp5--Ahgi1#R
+%2K="q_E/!O98.+ at F/KjE$m)#TgGL72<QrcmgSXh)*9/r;-p4`gYA[c8,VJ\-E%V#29t3aM:M!B574p]fXL9K)>,LdCYt.mfFm&Y+
+%AoUYQcO"hnm6eHUND`TFhS(DN,)IjtkdoQEG$)o$J+;f.-kDk=DCFImRiT(&2,\;i0UZq9,-PYq/oXd"EalB@([5t^2C?!*]%PFp
+%X4iqsMQi]L$8,;kY^V$]ad-dR43J%f;Ggf!\]CdgR!:bBq$ZcTQ%UKgZ6I/'oHDIt:08#]:HEm8=\Q6G?:OP=%rcKM-WC\TROR;Y
+%lD*BjZ_3tCj?2s33Lt"X0!g'LPTAP\@pR>FNcf1Hd3ok$0"'%l*SY.<TZo^_=Q`hIU5FRO2LEs*4aT6YS>s8k%Z>0^]k/sPk\iQ5
+%%ok0kE(r'fAdZ1A.q"Q'S^.NbYACcjYhODQ>u=j<Wma0$%a%,/1!Ka+4Sq4hV;+/+r0YACX'FE3cTDC'XC-9":Kf2.>Eq--=j.P4
+%%oD)5&4?8SUK1%-\@s.D&rd9q!a)N-ab`SSQ+k1D7SCSKI[.PT4.&V(#f0ZJn8ZZQV6D at 5@4B;m(8N[N[(+,t5VL;?8N>?'42P at e
+%_Y7oC.D-.H9qnjFMJPj&aYJ)dUTV1[Ha\`iY.,3I'h]($O-m/hifmrFV]-m;;f/L0RC!kI^L"&4gDXZMYZo$9i5,-2bruM>L$]Vf
+%@5?6C%8T:&k>;GhVBTW[*#f'>TrYA4*m,3i/g'af1;l\+ at CBUtJJqaq'IrgA\F+2)hnf"KWa2-<\N,%k2\.grKIn((/C9OH'8 at cU
+%#K)WA3^h$rSsBM9>QIbK)qi0T%bTDJc9oBB!NR#>Al3"#MARj0JLK&M<EBuW2\4eF4mVZt&$m&+9#o&fAQQ2#DUp#uoTks$p:2*3
+%p]+h+$Vgl>P-oL8;U;*7?^E0caAW1Y;r/\PK<=n]l0D/iU&\J8EOotnD+TT]*6gPNbtbAP/V.nb"G']u(2>+#_(PKlY6tL(BLmQa
+%Tj7IGMl;F7b-(HQ<qd2eAWS<qCLn=PkZH9^3\Uk:jMo<$8M5:7.QDJ]T"_=a&?lc:];>:5PT\XB*!fRnm,Y>>:f-ISD4^MEaS.a8
+%Td]\nbmm&YTgWRrBEoF"DDu&eVE at X7W]=Z7mou\&hEb2C(56/0jc-3 at ppkgM43/fu2;uR1G<CokHc%K`*1Y<q`p6UNZnIp:_Cb#/
+%GZKa, at CmcfMt89_)*WtVII>5mcT1MqcMX(!"Q1*H'%MKP,EX?ZkN7%Mrh7?$?(pH#@fq6C2o.PYZP5[[aYpC*f^h;If*ZDP/.f:.
+%0M7pSJ69;FW7A:o5ZQR*<t\eM-^6dfclBrDoF!20!`,^>gHs1ua.p5i`#][a!Kg[`\&Ahu!-_B!4Y)(YI[Siip]F?E!j`J[>1A_>
+%j9c*#WtS1UWHKMS7Z^pS['-a6qA%-#Rpgj^+AI]fkko::@c3PG_f:Is;\81'l.8K<_4.6dqsL/T9"p<"B29hEGgS$;okKbsfj'kD
+%Bjq(c$239.0"jPIZ#$hSs+mS1Yk.cQ9"U[MZA1N`68H<aB!q%pYj:d0Xj(=Qe_KNh3>#[>/nM>Br3B1F81ed$J9k*`Ha"3"#P0R>
+%Tn+ua:fWMeXJf"i"SQf9SV==na+N,G5KUFk>>%o1jW`tCkIu5QHQ5F"+;@U`jko at XELD2S3t=#`kNR4$p0p#?*V6A`P7^JFmRUtQ
+%D/AHp;ak*(<CISo!)ICbVo`%]9QT]F:PGgOHHIkU'e1/RlaeY#JJ,Gc8s2"AKJ`hcCr>`F"DH@&eSM=o!5c[Qpkf[i4fWsAO5Y:u
+%A>dW]SpSt,Jb3EXItG=.iM7^T3\.4fNb.b>!*374oJFn><H)n(OR$cH@[lAsKn)-RFJM3iet='DTdp\j7ngrQZG8j[lB8JVah[D:
+%,f'R^gfnmAe^I[&_"hi_GWG?Ka;Sft0 at 5_k%#Z[%U^(u[<GKM[j1f*tGh,=a at V3Q94."4`cD4GmbI2aUcIX#@Pm8[6"I/PXoBHAR
+%^,UjO*WP#e,Ijis<q.g/C!@-kM3Yqi8L at -!n":LAfQhX$JD#,/7sV%LgJLPgM;--nHlNf,is\q.Ib at J6hER&rCUO85Q,DJ2OfD/s
+%("%6N6%K>P<XcaOjgaG$V!#&Z<7.2VUpfcl-skWLpoDXjLT2Z]5))H]k%]X%B/tOe\5cA*fa#4tdjLEPa-%D1!PGb[ab)9f\*[cZ
+%ADce.3-FS`/rOJL^^V_K<a.]R-Yc%.*c6#9?a^@n_87N7Lduf/lLk[fokV$=MSn]0 at -rm1cX;V>m'>?[i##p$b^9GX3pp?1qn>U1
+%:i3OP.Ol'I2`VAt[Tsnl"uu[U`?TbWD*\?JAfZO=iZcdT20r>@8ZD'u at GoY!OOD#^]MYjT<5K]'cDc3,$A^_!<rEUQIFpDp>u.Xo
+%XL(/`UrI3XRoJ\V"$#p<p`5>'2g`$>120ZufHc#<6[GZ'%\Ao=>8l-eeZ\&$LSM,-H<!$C(ECW-Uk*616i_9d8$[djiI^5;&1DL+
+%+#,9Y#-Dq';&ilsP5UHth@$_J\Pk&MT<U&k<leS$DARQk3+Q&;MIPIiFNZ:](\p%F.JC9Bp5S4u8Yfl3EaKAn.Zdt^Cs5FAf]J!H
+%%AchLKF8$""!"3,`(*CZC3?7HZn&uQ`-#6d["38ai'JE.?Ygb<Q09LN:u[<s(_gTA at BBYalQD,V:;UVuJ5p-(fJ+c6q7Se^H;'^j
+%)1^l7Ht"!RQ_B?h;.>hoCeTjP=I$mGOsJ[/HE*)1A at O0Cg4<"H^:<<p=^78'UFBA1Vs?Jr-SH"aq2R6WjDT;nhPc,W9gpZO5<*T9
+%Q.kmVISKE]P6E23?AYE,*r1FrKo6dmhB;!uC5$@%1>&%Yh;F?W%;Ka#G&Vg,@/F5bm9LM,E=`YE[dDm:KjCr#Rpn.0M(LGPFh4(/
+%mng^-HPkkkT[PHmS+2^cViX'C at H2Vpf`Y:>*^l-(X>eo9rWnl&1B>iT at -Lj,!3:ah"l#DEX'L8KM:=D/Fr!?*J/9EYY,#fU5._Vh
+%CciiG%'Xu\TN3%+Y3%/Yq$mbd2L^cLm1+b/3Nr9d0YdbtnHO"]*?,3Tj!#(5X;W$KYfW=fNuM/A4re#IbW0[nm1t`;--0UA.H>TU
+%bL<_BSsV5hl#]=+o(V&m_7()mhWfh7,^>F5(COu&V:B(S"UATd1PjQ^3R9B1$g^fF/F.6+7<qbL"7c79cjn^TfjWsB2YnFP@(*=q
+%786\?AiM*ufbXBJ$6JJK^"]-hW?c.=<PXEs4`WHBRc/Ac>e(K!?BVT?3pB:<Z`DX-Po=e3H`gV`?r*uUpefTNpEKhGlcm.8V^X<U
+%jucl]-Oc6V,u!*5M0<AXg4Rf5^aj[n at I@MnO?St%n^6[QVFZmCBd_\%8M%$o6WUQ6 at 1A*iN[ju.d=@TRRMqNN0ZHKOB.B;&fg$><
+%r)%Il+-1->aD;D!NhsqZ>^\-k"#'js)EV/dMS.$a at 1,pl'a2EFC:_nX2b?#GHX6CT@*NG'nn#<1V,ZnDjmaf4HWS;0#/m:[ggU`-
+%L^=dLC(=3Tr2sO+.jjX93+lG%Tus-G/p+S6 at Y;=Q'0P!^?T,kb:<]nA[_n/eR<4XS@@ia[[E>)haF7\0RS03IOO.YpQP_IVXB`5t
+%ZHhYpOQD"J\XZR/<pZ?]B7&VoD="MPkNiFugeR8[-F+tUYOg]9.SdY2C'K^.,iGW#?Ln`<W+r1,e[Q?@q7G]KW\@Lc[h%ZjQ%(*D
+%_pojW]\"[Tb8a8rJ5j@(fm,3N4!8"#-#f8'!a_cQj%&7K(/m1c1'66o<$5,8G*1C7&/Au<cMCrIMe3X/7s_WB<ZCc-gSml>,Xs]F
+%a;C]D:hgBug.@'?NpP?:C(_&_kRK:fQnoC9?%:Uon]KK5(PjRP2$1Q!0kij+PBFX&eZl1I'o-O:4<+"dL$`hfni\sOmYMFsKF;Ee
+%4DgYQ<up5=b1J'VnAq*1<8`6P&5@;t\n!l^a_+nhmM9'L:'t^f at fI9a=u8,'+ugmOb"`EuEl5ga5tc_H!*T:-16U;Q_<Y"N at m]B^
+%]aY49c%utODOa'>isb("7C?@4%W;O5iBfXnh(HlE*T+&p-WbTMl>2t at Sg<Qk/-^Xh\NjZmJfc-9./9;QpR<Tk5RcO:?4PE*c:9pD
+%Wm\L"TK!7OerCP&5Be`(;s<!0C3T,/5c`HIbo=4E8;a>QWM<U4?,a6 at s+^ZNpcM\dP5S&E<"2"T_-<8^%[>.9:<u()Jrk^s[<S9X
+%WJ++mU];F0\Ol0R/iGYK_PWN-^B#k5De`8*97!Or#6n&AR5G-ik_j]fX+qptc[@cNYhIrZ"A`?'`'*8a9m=Gq2ul&R)VIQZFsIX9
+%oB&p;(0bXm_5ob at _T'jbZ't#.<0j,.N<,''<8p`0*BZk8/qAL&78N2",H,$+\64S5_]h^9AWu?3[&U.ZdGgqi5+D3qe-;SJSg;T>
+%5)d2XWCTjkHscruE[+!q"G(:uq6p&"X41ap/oG8-Z;Yh3VGViNn$L`KHl[O1Y]$BS"R\oZ"#Rma,\9"&Fkl(#1='!@Qram1/i0X^
+%>(bo1!Sj5GJ.BOIgp7#V$BUhnB]D:?K at GgbkI<tX_tl(octmJ%H]T=T`^hCBLSJE^PNuT]C[eQY(Fg/CSS84e&ctU'ALZus(7bXL
+%Q9%0t9A-rd5J<5s*@H.0.;bQIAT_7o8S6n at B:cnc]r35)1,(*2Q'abkS(hc"<$7VD;Pi\RH03UUA at A!OVbF=`831+P`)K,ip)E5K
+%+GA!-2HsCimjtl5#<qj#l7t;LEcJ%Aa1_?L!_n#OKV`DMA=X[/-.tkCX0JFl(hSN9!rN]Bfa^L at kHR.JSJ4R'2]JTp/o?WW<G0l9
+%U's+Bg,]k:FXLp0G/c-%aOO&.bJK)`$BE)[:crhta&CtR:oFr[#[t(+9S""8]C?7+UU"d.'!]`<mO%GuDqei)kOM3)&,E\ZU):>X
+%foS8@)jb.h0:A>96'?\Zr)Q`R]u72"Nko`gG$8O]VN]"2,X#b?k0e'RO2WK'T\[Q,WaEHIA#cWR>;C?-bC0U$69M2QB:BJmm?l4j
+%kEkICEW+siA(pDd7(k#;"V+p_3n)"Dl811CpJCe9;\4IgS9=(4l$;/Xp13Vh.9csRBcF1-%DU`J]H_b+aFg^`;N5*tToM*X0f,J(
+%>"P4GXsblq-Sl7C7,mG^d'CM-?O],VG286Va?D$l.1WWq;(JRKr7%7p5%Y\\VV1=S9>p:3#ml2.V9("483.#NbrV"FjdL28P$kGN
+%:&%^41*(usYRW_+qphVRnnO8ppB#">7Rauq?l/9b%ftiTY`=no=U$$?$$L4*dOi(&^"mR)HP2(<NGOOs'-A\a at QRJ0FO2$WX78aC
+%3&\R'[ibp\$/2ZG.@=A''g!thITmH\Z!(g;8Mo9^a6f1F,_SFhGaNk,-D#(;?Tk\o"#]&3L`(jV49:ac5K%:@,*,5oF-BRsieR.?
+%QpI,L++>;gG+YP[fHD:Da(X4=<<L`s'!>39mQ'o?Clo#FdB\V)M`e=e$r2"UTgSY/FgIQrDcK*Ri6HBj:B=>;?4>CNePi[hSr!>A
+%'f/)0^3_"^k)CMfE\^[>Gdngc%;8Hm,;B2Vn9\OG[dI8S:6H!F[#M?DF=[Y2`[@$L&]S7k2A23sfI`d".N<.OnstX`C[36<OIEu!
+%1:`KA*e>q,M<as`/<N,XW'V3XDWK9ag#I:ud8lO!fmsBZE<i41n%m89fIR1:jF^kCB=1o+jG`egaSm*%q)OpMgZG]!gNUfZdqV.<
+%`%.;_%N%hOF1\r&%iAAW61P^b$Ek&bdd/Pm0*8K&k%nR`SDBrf'\S2NM'lS:CZ;6#HE7o(+7)0-kqFDdB+5ZM>3B!0O$UFHSaFH.
+%Oqo@*DD9%KT[m9t>CR-RY)Y at dWTue[G^1%6V%:-;H1#tVW2CTHF-17Znfj3qOh5k+_<D4V,KNC6>hC4WbFZKt5T';JF-ARp];6a>
+%hm--461GN26[hai^Q at kDE%5u7Got@(ZC"[`m/e7RS_2&A@(Y at K(`,\OCjR;eNg[:+*^X_>)jZ5%!P$oTddZg!)?;9th7H6p8`Z5Q
+%\61!9TjCJG&b.Q[e!:73c[d8)Gb=O^3QkU&hr1'p:lEB<%Wp?m8Ld.)FfaZ>`,ZeP_18$1=C#tP=l;i3jT^ZJBBHT\E9O`$rW[hY
+%/Jk%j&6<f4J-F@[-OrqAeJuunS.n2#WM'`GIk22d\g&A![<DjGG[rt+F'N*Z-h18ilqi!d#lcZjB-;^9E_f>XCtl5L0,Kf3&N34?
+%h3hJ0T.C![S^2ej]LH)Rr$=(W4Pm?i`QgeQ(ZM5l:#n]QU at NOD\M0Nj*cbSXF+:IRQ?:o*B1K)YFRVelkDR$9i]@S[<WgMcZA9%l
+%k7M#si#.U:H1RmdfPGeQC0!e3%ph at -=r_poFaga?2`X1I7k*n$M!ML-$K6grk:CiJ#a2=+m"aM%!0E#4$M:oOM43*q16gJ"Y[c\3
+%)OA_s8T1)hV2/sF/6d[^aX+22H^`a8BHmJu8;euKB1u?u3-;(85qTQ8:-eM5kNW;F08\d9Lr6ah]>Z'TcTHjk&iiC=e&s;iVF5mJ
+%3)L[sqV#hkeL/P8[]qnIIiA)?:[j4feM_U/N8,&Bah2T#$k0com)G_41i8Qg[RaCBZ_sbX_]k.*\QCj;NP&Qn0W4]/-i"7\OhaZ5
+%"8t`U*<Vt;95;7hq+pBDi:.%;.[NY!,"@]$`ZSn1<Wa=*anSGs$**0n%kEa7$-t"kFY7J8miYTK/c`Q?TcNr,G>S37m7!*r2 at 6p7
+%`B<sH`<4]PaPL at W"0UX(G#]T#N,k'(=$cRT^9Sq#AXeoHcD,CnAFog3=a-2X3K>nTqE at qIMP>Qc,DjkJQdG^clXjtY0q5B(m]<Jq
+%M$+fK_`dJ^1%R;k:4,#ZJi7Cn,,j6Yqb)3=4F9=N[lPBta]3$o]d/r*`:r"aMQJ\a+fFTPb,D.'fe6^)Up5G3VMs"1W(`@+8K%>#
+%3Me4Q8oSmkdS-?/?Y+0*26UVtfQ/$.b%I3/h*Al.i6AP<0#j>UBubTH=!WD]HVRRIA?*D7m)2;jnl&p[^0Akjb26t"4':VY.3(?p
+%fb`pnZM?(1;;B;SS#gn>[;@ESV0;\>#41er+6K.GDcet6H]!g+cKXoMmE1VE\Tbe5iOJR67h*3/p8O,L"XK*B*iW"sW`Pa@&UaR;
+%cT+/CIa4j[/H=+f:L-!SG6B,&)XbWWger3bgq88H.c^'Wj4]dZ>@9:SnWB&7<*r7i_k]Hs,7h!(]u7kZ*'Z!?>br^+%@]L(ek182
+%]<S%kh17)sg\dcGY+4&F]fYn&E'Z6_6dsA`Zh?1q;C8"3XG!KNe9SWTKmI)UI33Rl.NA!`+!3rT`!5cnK'?4kFW5Tabg2"(pbYid
+%a7U))]JRgqO-QnF,j;3hYlK');a=FDI%&K#Np=ki%JH#UNu^mkHEcSX42).kG5kc_]2j(1r<1.f$D5AhbR/EJG>-HYD**<WA<X[N
+%8ti\s?XEb$Q1UQIo>!,B.co?C"C'L5?99$jJ+fL?if!&LP%s<)WY&'b_F?\\=.NNrk".C0,f,s';2Tn0)Ap$CKDb9j+Lu']B1VT)
+%OOVp^.aT)+&C!0!-"REdQn]T%Q9s#[>hejnEu\Ljd=F>-_<f\5M;b8mMC,GP*!Po`7N6qu9\ZG[;?#]QN*B[].f@#FY$OMZe7uI^
+%)T4#`5J*2Pq]a18.$4R">knuR8b&!ST!W.S&G-shWMQ4K9b[B-4[%J^6*e1oG4=rCkPIeHb3?Z3#ZD\J#Er4h&scHX"Z.jS[!+&,
+%18t?lgn40"A8NYa`nm'D37PqfTWnR=H-'E"jg_534[?*rdfL3Q at EjJ?3SW*9ecY2AcMF at lMgghQ>#SbKO![0b4eH!R.qMR6od%(o
+%P0,@;jDFeA.*Enup29)#:#32R)l8rj09[Y"7>\FQ-<'?,%8o%D]?En6_DltQ_`BMIR8b[Ilu_*J-]lB4'9\OmfuTQ75,i.$J]g%W
+%H2]H[CYp^T\>Ps79^DFTF9GK^D5b<u:I[gF5c)-^,8IWC@`k`1@*]!+ at X%6KMU[l;Pd)1P6`e-XfW+3_I9*1B99d2erR48/m at i.6
+%9:?K+Rn at jL'FBH#g0H[TBp7W4Vd'qh__^Ho*[G8_:#ZVlTrtF(3eE!,Aen[t'7*u1)PgaVKT^$@!L"O0l at sIRnZ#`p0e+"I9-dJ'
+%=<E;(_T7(rm$#B-297;?j\kC:^^?jj_%7co`!2,_BgT6T8iU^LhH<07TTZ()MLHr7g*Nf[pGXZ&m)'"!h1cZ#Bkrh.A4,JDXJD'i
+%jtLul=&KS)/LtG#ip3_"+n'9G.eMQ=6$@nO$Z`W/7hOp2#@7"%$3eno\>l-:5)enCG?bA.[T48&:);</QJuPNaUK7<iHtC>N+(HR
+%:\KnPoruaWUm at B2W1Tk:PXn!]5H1Sn4<FD7Egh-OXT at gg5,^IY5[D,d5GT8/b1_Bs.>O,0\f/@h_;Y-?$T<2 at aa9B8BmdO2[THUO
+%s-##,"S*+;=],XVg$`k.$I4,l\B1oa5.YTUm6HNan at ZY/n>8uZ-Ik31lbgugbJ]e*kV+_tO9dPrO`K*>>hWWJ3G:Z(ghlf#;B6Ko
+%s&-BG+8:%tqa0%L[90^%,OqYmSWunoKUCThZV'&<bnnZbq-/k^1<,Gkltus1+f$\i+*pV4s&jDEOQpZJj]2PKC%3%6"=)V>m)8NK
+%.kEd5?.$*]!8P9I8I!d`=7T@/en(uZ>0m-1JXhqRM4SJ=PpB5OOA>tn"9!P`W8c!One6tiC*DN&iIJ(d`CM[4YFU\hE>S at l9*db=
+%Qipu6'93=nFFRkVZNTnID?\!(?+sN;iF1U_C\,FUaHNM1E31^kn)_FXUi<rDUu6DC(i?X%UtPX6l4`uF7b<4 at MloTK\B-/@\5_rV
+%_+7h<gpZ[g9RK`CR.qO.euKoj9aSBF_>.JsoteGo^jX!I[;SkC;9MOVp/-^*YqnscU`n;7Rm?\!:0KQUESm-gn";#/J__S-\WF,r
+%;?OCX;b9-m[%PU;'72SpC'K?B0&C^eP;?rKeO)&6:h[2dS6MG(QJWpL(k?fNHP2a_3I5:E8TeL-,[om;:(u,uAcg,83FfDCJ=l7(
+%CQ?[\k59:<G//4ee:agWI8e@/%p2'_&"W/.KPi\-RkH$N<QF_Ol"H%:p"YdoK0p-P+&AW![1b_a!C2^&k@=DcmD"e8H<==UJ6D'l
+%K(uZll<%k7<iiP+TqniDbtghrh<aIh85NbhJO\j!#redQ],7#9MGIU&(Sl+L,WKfZ%gufk`#!DVJu7i^QR5FG:;V+RF1H5MS($po
+%2>JYD]Lo>d7UDiU(Jp:\R>1j$oc<#d9pXso'"FH!GNS!$RBKs%frqs&8c?]RQaTUPW_0cb^EA[bf,5D@]\]1L3Pg&;DD-h`$#Xsm
+%h1dLKXL/U4bGTra#u5YQgVG=7Y3#*4],oPgpSgegkR1'?WPpb+krgis<46:H/7KUga)0503aYd\j_=?aQSQTY7;_V_4)juB"OIbZ
+%juiA&c+)h#Qa"1?Zs%K]7_j)_g'k+o?Eoc35#m!%Odg.t1Cn)G^YcX+3fKleSTE#>C/Y_?7VaMSc at kq\#l*]+f5I4Ks#2.L[:)YN
+%jYmOP`WBdFpdBqS9k^flW0Zi^VG'(2`p7d*X<uPI4\0WlqI`IgZ9>i3M[<-NM-O*IBN@)r::_ at 1C2?43T&FN%63n74 at klCNa8&Om
+%$>eQfSfHVj.It?,I67itLeV0[f=Y_GM=+Emg<Vo$$E84pVJhrOn?H`ebnKa=SCDZGWl)49nXq"flJ'V'Q:4Hh[Md\1XuA0;=YU6K
+%<W!Bc3S0-V.`!)NPqH%??G:I>.uLn,[%_e_G<WWO?U-4FDF'oU/2V3-FT[MR(0P[K?o=l0jR_e>9lDm$""F>M&NhV&rsP,b,Ym$@
+%BMKDT"RW=G-n1)WHh%2K6WOf at 3!!Ti8Ar'SPoT?@?ofH\C-#WdF\a-qRkrag!JmI7HAt8;D"eHLDjsdTDS0-1PnUhX)/f7preX9D
+%C'X.12.\@_I:CZMq*Nm^8E9]BkS2FD1j60ca#9F7%[a+]?JA+2m)Tp3%Q/QP9uho&7^>5*Q%TFKY;96BPj`_4NVY^`We/2VknpDp
+%VMc at 5pUd=ucNPDo*NW"dnGQjOjA=5HI>i',?KtLIcD`iO8NC?diiGSolYij!^r(OY,k9[0GuPFmNf2aWD2-VUc_bl4BqTtPEqu)p
+%;RE!<m.Vs:OfY-mK*-_jPc0^TrRbINr6-V07f[0(TLVn!iqG<=<W3_g&uq8.gmn]$1:L"rQ`@-.-)Q,O2u1R&X]%J(Gd_Xu;M6c>
+%8MRh!)\U/!mjC'[&2UGP-_/lE$:mp$V,4PQ:R\olh4hi/&D,.BWF_^IE9;97Fk\cD8:]Ff)BCSW=NHIb>0,$5g@&Eg[@B,lT:Dj6
+%</"IA54P*:R'J=4OEB'ZkVW>pRR;&;gfW;ZZK;TYP=J-K-)G<@G<enNCY0;I\T[Ji=FP9RnMRDXh<t.G-=BS'pGed`MO.StK=9<r
+%oL/s5KlMPsJ=Hs:E6kYmV+p`Jf1S*WB0Z!Zr9#YG150o:,>FA6I4u2lY%R7)*B/)-0.GV]c"FIS&b(uchN!R8mCBnfcRM/G.$SLq
+%fQ4Q#A9FBUWNR+$P%95-09(2XjhLa/K**J6Dm?@H8lZmn\!j^e;@F%bJ$"k[b+T46!da[Th'=Qgqqu`kB at FHjAsa&0lTHUY;.?PO
+%n)?MPrnO6r8\PB\WSjWI2$@]jZS->I'5pTeI($ti'U=G"kU$9(*;%mI!uIh+N=*pf`KcW+=IC?_2(e:&dI$0$l;nA5XTYZ4gqS3.
+%mEMHES*#&j7]@&^VKrNJ#ZR,$M7Er!--,/s2b&>"^O3HfV&`'Fls8e'G[=M/k%c_`jRAgZ-84LP"[I92Z@(>h<hR9Zd=iSOh4^Fh
+%AbYsp/\=1tUb&8f$BQifE%TZN#s;3rT`D"d;_&f>TXBt#gm at K?&d9SESpPOI460-p`V37C>Q\7>d&S9-<o.eXq3+\"YaI4mNsA.i
+%9B at T/+Gnkt9VOOUkt=V(7`*=DZ\F!oPeY/R=^k5PZ$MESjnb)tcl9j*]WXGbe2o\Arhi[_4B%'9<V%HsjO!Lr-_Hk>AC%A'mrHT3
+%VC7"%5blXp7&'!Y].M at G4NLQ(^1sl2(Tb7!gt%bsA$^$$B0pL8=&.Q1=">'_:/1r)Y=2p[,)'0i/5m.1!mF5q=A$[s\+*M]H:"jT
+%B<<k3JoFH0hm&5*R&uUt)L8'P(#G!H!b,um4q1*<EXrrnU8^/]W<1\Em&nm^@YD8WZQ/=$pG+6-%!a&F(;uF$pQa5ti)"H@$?;XY
+%,I#Gn%o4?]Q?M%Ri,6_>+"M-)c+GaO52WVhla%Almi#`EOUKC>f"VOp`b(Ze9B(1&-+D/mb#IB$SPY#0a_Tpu/;Bq-,cCY.PMc6p
+%bARLQ@:mXZ-%u_VYopWc):cA>d0TOqbFDM=[WZY0)e3"D0[iRlJV:WT`ch*sq[C*;\7c#XR5-'P*]^GrouFW7:!1"A5$@542gXIr
+%!\VaJ6GgAfe$^Tq>\i.2_b$9i$OTV5G8$fF8jG<lXm:1Bi'>(XP?5f/dlO4XR#@FrHeuCG\,Gl7hYTh?qbIH2Qq&]t6RfYn&=i'N
+%%Fc\LF5'EEnf,[$YXGP+PI^*qmsLi$EO6EZ.;/ei8GiPIq+(PR\HGJ/_,!!Ek1lNeXn@'q!/)'_H1G$G>1;TAV3?.i45qWO6^X2_
+%X99kr:aO2Qm[D\]I&oT\*"Z&("4Sl[)0-5?TG!@pW,JEo8gMB_ah,o#\\.C;[bnBQ]F4'L%Y(57E3+2CRMQXaEmlC#GY!rA*nYY#
+%CTm!FQ/C+H@(R0KQ.1Nln2@`[.P::#ano0NQE#Af/PKNQ#2/ZOBudS_(oHFiV8=k9\hFNQe&$juaT!3<Ye at ZV]dnlsdbQZ;%PVhZ
+%01F<-Yqg)_Lb_;oQ;Y^Zb?9n at SPl3ZHP"'5*k7CI\.RJ9..k4;'-3B]$`2$GU]DO[1hWJ*&EI6p1Ps4_`n[..R3)"7-8Z)r at n#&\
+%bU6sjjSlZ&:S#soG3j;GEWHd at 9t%o156BCQ71i>>]+FRk]R&7A:ElY:6kqI#HPX2lX[rdQqQ$Ua$ALfRnb+i0R!RFGE<t:HD6]h>
+%o#eWr)L"+s%+Z<X*8:Iu'(p`UMLoUA0,JKEN&u#9G"*Ra`dC\bC!$a`6QQ:q+IN^_0NkP:+d[WhJkonc&t&+"ht9kRqR1e.]O&e,
+%=!5V-;16R at f]u44+2??a- at t6b4[Cs+Fl>UF:G^s;&sLI1Mfik;DYHk7kLhn]nDVJQ;m3^an9bY62]_emS^b>B:%9N/GA%]r(=CrM
+%CRIM>7bI:,(V$;ZhXIoc9InMbC,1pgj3_i'=UZ<rQStA#cL.I[PP4K?Ada/Ag>3 at jiLR/Z5#4?IfspUY.DBi,'!a1mP>l:I7c8._
+%'-Abh2rk5sq^2O?StrEP%UdR5qN:`4Q=&DAOab7=!hp>=P3WG/iB[-C/HZkG681OgFI0JU:=l5*6,Fao>E62gFC8HEA*C[J-5>So
+%*F.or,eE:uJBg"SHZt>OaYh,1i`Y_j<1[M&r9GbSM9dDr:SLj>=@--JCefXH\caL+_M$ZqNCYC6A8hc at O$p<%pH'Z?qT#1'@qEh%
+%@p9%tK at tE`Of9ma%%_1JlB)8a'B)O9Y`Q,u\YqTG!eY5!PXYSgb#X+'$N8(2UZ]-7o`r+&gE-_l`dhRE4l2g=l,sl<#XeGbhW9Eq
+%Yot4'^7%Jj:Zi4,LZ5R?3!8RDTAX?#&!dIpOZSYs#ddO8I+Q3g0_gq#e*(E6Puh,fJLB'oH;gR"1%5A#kIn'XD4,1;IUe^3"+(@:
+%-1eC-Bu^ZT+5D`5fc5:#c at ./.qbb.":pPp8'DF^oe4He.":pP5aGllu$D9mpIQft8KGM7eP9h&-YTP_c>,`>kplsf2EloZo*uG/1
+%/N0#&#;Gg^W_7+&>+*6.TU^Y((c)n&;L7nCrB at Lf_2_u/;?MpIg&E9_2s9"fgAk8B5Sg?5*7XoCLU(,>]?MiBk*tV"qD>0'!KOI3
+%^@#KH-E0o?%7P?="$JP>#]9:RUZ7=OQpBW`4igY'.(3F:%^qUD!<Rg.PDjd_Zo<7V(0?LEF/>0l0$\iiSbk;Omg,=l\opg9S!t#X
+%cSi>0K^K$Ze]fGna!DI#\1[jjCMIBPR-6M$`ufS_`6.m=.ZkEW,g6gU&_;"5=`[mBSG"i]4YCgd`C/,q[9NNc_.45JiV'U?fnlPB
+%qO;E"DtdF+[m`QAo14.ImcB5.9D.i1Qsp9>[_+BM9<Ie$H/I:5ddF+rWB!BreP^_V#mB\0\]3OJfuD3>Qpt3Shah'$E/mL4*VmXs
+%C0Ir<I33el.>?CYjWLW]F+`boTmW^Bj9atkTqf*HK[(Y:Q4+CZ'%C93"O/)1-!PfmS7gb at b69@<(5-T<^jKa&"+D38hfO9 at cX)TR
+%8;1Gfmf$o*2Q4FpKu1-\Jg at pMYpdEa+jna7`i[f<M#Aq%iX$"'%egk%RnIqXA$g3ipWhI:3[?!X&pF)o'ABoWF[b^`1$?bj].>c!
+%XPSBJVlq$]aJ@<RcL[ij^nNpLrlS`_VG.`WnV&fp$CLES6c;Rk_jUEnVW?WUhm;^2>(lu>-DrFDq-C3V7c94hB)]\")';)g_[8`q
+%14r?trRua3/DO.sk&au)8`3Z+r&.G-4$\_M4';go[R:6tD8XVkiB3*ZQcWlRr,NM\_HXRLYPF+u;NQ6'<FP>il$tN^^/dHg&)b_D
+%V']"Zhi%P*h\%>!_juKn>(53]`R:7<XYn_Np at FPR7h(J]iObg9;3UmafN&V%:?)F7G5SlrP=0X&+?[2h;\+q+bo!0W:^fs+Y+*o\
+%5T>6+gR\Yb:M!+DH,Rh[r`ig5HT(RhmS5UfVB=;>d'>F`;LNX+i?Taj&YD)_#fsD1q;B5Ag:n&a2g0K- at b.O9_4\LfS>A2MGsu[Z
+%4G[QUpWLs>nat5uiMUDso>NgIN%Q8en.&a$Zmu?lknuo[e,`JZda#W*!<aAX779MSZ(C8J/!K/!8\nr:jGX8Q4:,N#c=.1Aj_DT8
+%qZrQ5>Gof3cTe<J'Sam^0H*(!bh9__h2&-V.cq;$1-Hk\Q3:fn$65B'(;uKODj4rh[73`dYa^d!D1*i*mM*@V>s'TDV`2T7e7:_!
+%9-X9&b%a$Jm at XsqG+0((+^&SD0kmP)<pq,G!+'Mck`]qT$,lk>g,WC`BZ71rX*Lp>39t:r)okhLjjuEGs#\Pp/lkc=U&%;h%'\Cu
+%78e045I1d5J\q5=LZ3fSZF;f(F6`Al`Aoo7X#2gjETI+8YA9!E_pjZ>Tn3"o<BG4u`.?G0Dkb$Rm>=h)ps?!C7M-OiInJ#&eFhbs
+%raL"F[@:^lDd.\>S7$3_[U<9)V48(OeMg6t=dZ>[cZF1Im#SC@^Mdl,lY.aB:tmp;?>,k)U1=V-F-/_VQ`2!pc^t$DT3U7H%s-b_
+%jBa27[N<o"*+\-"AX<g%h^FWKLZoACdd16-#,rG]bhSER<SS8Q&,Q;W/-R^^6V_L9\LO:j+]&d3]!]!+J".h,h*@\JYLc6KIt9Mg
+%Kh#HA-f_dU2?Z"DjP-ff%^/?64, at o>!gjFi5`?]S>d.`!_PI+sQMOAQFV`cIRn=hQP5 at 6jUoZYg]$qA60;]NWlY*.2c<a=;0QTH.
+%H+LOKnaWjjf!a"oY;u>MKquPZ2=Z at LonHt>/!l4 at h?K**O%Af0YeFBg%.HIJ5NIuQrjf6YUiM2c,b4r+n`.a(:6$4g!#BoF<m&ao
+%Rlhp7I=u7UCAa,V7u0Z=Wh.%m)o9Q?=e6ZU-])@t`Y1AK3a+*Y.A>DrnRZi9K/m$'e>9Z,be]MSRX\$oc38,dnp*d)O[/.a)C4>;
+%8^?e/USE)49J at f!#(B=pJC\N#erXte?C#"O[As#t%@j$m`0kWQ'm5/[kP77db)OGnQr:&:&S+]W%F at M"_!f4]q_9(,e7g!U-_.Vf
+%$Q>dLZ13OA:ImCR&kkccbPTAIkhhoDB[CQ](q?%C!cc$3q at WSH'7>*iF0Y"%HBg at a2A\#7!gm4#8 at o)oOWmB.i;7-8o,nF6f&Oos
+%G'iU\=X\V6 at ubd(gV9Dk99ZMWHQ7s/f$E2Z??$IoYE_@&S!G.%@#LN]3+"9h'/W/n''d"GrDFC>3n_mn^5Md>&8bJ$2<>g/_n\[J
+%=,Lc6<Phs#;0G<gD%hA#aL=L[Ga(4uaDW'N2.J[3C`fYS4800*N4nk<E0[_?E\+KNR*WNj/#G&j_Eo3bouM8?H!4P*Do[XK?M!I'
+%/0=L5Q<_7`Tq2cP/^"3`NrC!Ko`"UoWLH+fN^4t9GO&M!VmDBJOV512O1]/#CECD\AVV%LErJ"7i!&rZ_s/r=Wt/FqA-VpO#ZLPm
+%pNipi4\t<INnR!gQkH1]SrmOGBTkgonB+D>qV%80lA\h:6?Ifj!^hLcC)t*]Mq4ZEI<cL[9tU4MXWnX\IT&r2b3)O-&]f16AP3Ae
+%Up4!*X?AcLA=ZliYca;<o3I>+ at HtNa?ZMnP;APFA\%U._qUlk%I-<ih[Pri at J<pC!5!a;u8&#<:$pS-^e,i3u[o%LFXYmG4,5P30
+%2&e.V(W^J1F?m^Ra_QJr*XBgLc at u(@'kF;#.2>Rblc.C(.I_kJ=&7pN4Jtkf35"DPd_Qe>3(JL-Y%04#gQR[\CS9Ffo\Z(;\$BYB
+%?EX8fW:)cLL[\R at -Z[O3D$MW^&gDHkUg:S at VekFg'ug5XYmanFe#ECB7Ro,`Pa<plJ4jcn[t?JKO1ii(r1NRZ5V87W:&2=F7'I4i
+%St"Y(!/)B_ANBr+&NM-RoM at k;&tSW`eFkTc<c`$Y#70!W>E99.P3op9*"*t`#C\#@j;;e24MSP-;$!AOpVW,LJf_I<Ki at ZZBI<T;
+%2k7"R at AUU^gE[qKHA3YAQ`9%sTKh$9g at j];28*Z3F,ci2>9WD36U=:.e-q;enqWI)W!E^aRglW6DUOOpqX(HZ5rLAtZ"O^j#acE"
+%X5o`1plCI82_<%U9@)L_#b4D,g2#\GPB(hA#dM!$Nuupplk:Z;s3N`h>Bnig*,DbRcupa$qhF4(^E<]+lAqfjOcgrfc at -75Sa3Y`
+%PYu7%M&b.Q2*Xh)Yn<SSq:&"(ZSd3uV<1#&`oSP+-)oZ=26EM5H.-I^YO^W&MA2PXG$<AgWUhWo]Mu8VJV2f2k<2*2Q>KW=d`4D,
+%NOh*Cg`CJU2fFnIfsi*s9gL70B.j,M-/&86[)6\"/m_FVbLoOKcI8q]dVWINAPMd7^tS<WX(LhCld\0qnmHo`E`J"[55B9qF<?.0
+%lV7^jP9j9lYR<Q+Y^%-9jth!3%(866aH<Be+tRPikp18Q-(tnj'ZJ2!c:2[qF:eDVWg%SM\"_EEPPaGbc2o[9B!##;*e]A-_0*<0
+%5YX^J at .at<I7_;8jDA6"?@FnAF+K_q=\$Lq`3(/'\8\e#<Qa3H/>TOQ_egpoI1nsUBYiBDE at 5/pM at Y!@GniuXX\gQ9<!TOmXXD3e
+%4'HD!eK<+E3OW1"hAoZM`F7seW/,8_7T,7,jm$WHTVT`uef"X=@0<GCg<@1ONS-m\V at G+ej]Q<k3G7/uM-40h+/WiaXEgFRarh17
+%q?Ob*om<RI>&*G/5KWLb0<TlJ>Rh.o&-.J:T&REFIZKI%FKcX/TAjTqlYEmF.6GU8pE1k5ARWs3HKPZ;1h=3;N!n1nG;6n&?*&WV
+%&<+83Xk#T@@b8)<k_cBccM<f$k_HIPD)<;LFZ/J[[%K2 at .Vdo"Tc[s2JLB at 1$N5();B;I8bpI8c8ND3+"4G=Lg98`fiF.3f:RoMu
+%7fncqgW9\PMl4[`7N#^>Rjoi:1kqea$A&UBP:\"*TA1mGnpF at Q&/n:a]9D^]b+3pc at D)nPVH.#]KNkOu*qqBJCRWM.#IA8WBT_2J
+%Z2HD=h^pQ0j9-g+Z8&Ypcab]jDo^Epmmo*ETobZ1:D?,`q+-pO:92muXQAqV,H%@'`/![R2(GCbYJE]*?AAu6!aR'X5`ne0,0/\#
+%<)4C+7I1t0I!3%ck!j_\h()fAeb at 5VI3n/`re!u=4"6$EHo"U)AsD2R?-BeAH]cTl*&)gOGMp<:@I[V?VFqKH?s;9p:^janOIJjQ
+%kN''9$!T![)CP&J8H;717rfE%k'%Tt`H+uup*g$"^$nqfr5oNnoe&=cX,a<,^YT-Z26QPo9cSH(2ECh;[:"+T'CkpjC>gE;QH2=G
+%15F3j%M]?pif`^":(hkdr?J5mo)/VYqObMb/N(Cn+59ZZRrR2aTH-csB/a+J_58^GH5V4F!=GI%*_R=`A\2KA1Cn(kGnOb*MS^Xr
+%]on<_)S1$D\!t!NSp7I?:H!f43>90CkXs8cQ$$!/IGgGOi2+[8KY&\\>HirAHWuF;,d+[OQAY+9S'k"_XBYm^<D/>/Zl%\-k3$sV
+%1u$B"A$AMM[B.D\9s\o15UMm_hZ`VYff))sJ#/$IF8NHLjXDl.rf.<)/8A!'+3>"/8rT%U+HXOC"a$3m1)u1^%=Q0`bqQD2F)<b,
+%[G>&Y-C'F["Y18of'Kc#&)0e%c`%B`d3JCa:qNF9STd9RNcT>672:.2V'Z'&:S3gW`%Gg^$U at 0Er'lL9e-- at siU'[j71o36"r=SK
+%?;j\b`Wcb`L7rf&J at t<>1]$#pk-jA9IjE=HSmLG=D:R.(e!m?hg-XT8^O2%E[o?KuX195uD4M'ZiE]H-#*n94P2dTATYFc"KtqFi
+%CBF>'9p<6NcN9(a7-?Zm4"8oZ+C2H:Fi;XR5"TL_l0YfcPc0p%Q$_a_eiVu4+Qd9cF\URY)I9:hBuR`G6%#Z_nIFtIYD4o7Wce]F
+%3$oU`R!MFIgVSRnEDk>'h5rKSoVIZ.o/"=G'6s%R?5dFZL2'IrmrQX6D#>XlQK*@a2C_HkbU`JjSt*HGNeBr0j##rQ3OSEuo2\k8
+%fj>_Hql241i6g&q97*Y'-S]V(1[[Z`9%gsBM<Z%nX]0TUX"n(B*5R$g_;5R#0pD[tG3^tEeAb'/?72.VVsPH$O."e[rC-D!':VX+
+%#?:bN8;G`I"'Xrj at SGlXkA302\>6,snL:_*d>QQuP!b7N5^':3FeS9E%p&;n4K%mHK@'4_&2P=JU.U&:[)Kfri,NI5fWe98P_IF6
+%rI?QZkE*VaG,KFanDnX!7t,mH!?,dZJ0ee=!IJ(L%nVOIJ#_QPT0TCj:'4U6lba*gXY,YgDg4cG2XrGde@&oO-P]TEG+\a*A%aQm
+%)8,$-hW1Kk^u1%")\k80JVUeO@[?h/+6k\pnt^k&)f7mW4]1[A&G"m5,X0omgf:*3`Y7]CEQj%c3/-t)jjF"i_<'`mEsPk>I.XG1
+%,g!i\2cha/Q;o8mL5*.O=Jdc0:$'HfR<&4BSA%ge2&e#`l,:hE8SC$l:;oURK$1Zj%#[u\dWm4C@!u1k6+T+652UI#[LdI^POo)D
+%ID-OCd">sW8_fZNk:^d<7F`#YmoY#b(Fk8+EIG*epa+N5X],$IS\*1WT1"Ac.O at NSe;JL0l!QQ1]\?>I`@D`"@V!siP%jb1. at XL]
+%J#-Rq#8OtB3T7h%C$/L1(:mf]%u%O23DCq9 at k'3BoVS3!eSC91l:1&7<N8-hY$QN_mQp$S!r&1':h<([BBJC73TdK_P>iSCrpbP$
+%g[\8T:CinPi>e?,S?7rIq,.pkEWBS"0^QJ0+@[`aT at fV8P7%>,W&k$_`^6/JAuM/OZahsp;RTF8")=<rm7->J9%%Y%ku^%oH`%LO
+%GF5EE[!UFS+??$#pZT.6]Gn=$aD(nB`,nS6>srjJ at OWUTEbQfhjY:FZSuDm!"0Oi9*in=NO:P-u\HBNs2j+PtGT)F7QF,c'0Aq_f
+%&(Mqp+Oar&<O*5D,Y^YeR4AR?oQ8Dt^:9=H[RuQ1<>/)tI)b>Y40VTUUQI`%;gG&bd^tLeE[3dQ%l'CRI)lCniQgQO";fY%#b!gM
+%rrZ3Dk_t3$o\#F&Z)__pS&M`g0/D)Ej#5OSAUJbS`1 at 3,p:Ri(iblA4'-NFC19g#o'n1gs*\K&@l&sG_pQM<rQ]s("EsXJ%04_>5
+%s#a(2;bBTMC<Y"VQJ:3HrFg_X!hl5S)jn?A,(Kht]8D#JZ&"b]n<V:KdM.e/-Q.%)=K=eXQ<Fn-n&_3]nj;3">g.!Z2JI=4X?k at a
+%Z'HtII+peeaT8"M`N5u)r<>2D'_5GXi4?_VI at _%e/TA8GhTYsLlAO0,qq,^-,&+5oOCh;\F&H`@_$;LofH4ue`kP%OK[8#UE_^sZ
+%!\.b:5O6Y+s$C/`*XPtf+lIhp=.U at J%[o2qQH?o<n:^hP>1di@([iHSI1CLug4kTk:nX1DL5,lj:%>$(6E.H]=$Gt.]I2H^dff4u
+%e[gpjSZ at FZ`3$R[QPf='nE0=lJNg'gJ,)h%RZ+WJismb%-DeQo&8bW78*rL;06T9>6FbY\AKS:&ie,2)Yuu8!%\r%]ES>qAn$A<E
+%.jm+.qqP(_Pn7SY"WF#Hg6K at q`gWAH1[Df2G7`l<"T2o<_[j at 1WIj\d`j`C)qiI',j!OdO[rAi:Mj6OB;SL#J&V7QXm(_rCUcE>+
+%M+*u?a0;k=!1N4TIs%CC%+>eAFV^Zi)mcHQ)EiZdZ>3%O'!N`L0GR['I_dfe/s1(AkkNSe\al`NUs9)leup05gg^Cu&"htDWH%T?
+%$7EqtDb:b8RNas.S:$HKf9eL%:9_=V+K#KI?;7R1Oe3=k9.h98gcuJZeaJDbb?JIi$;?IZ,1`077u;%a7iZ#ro'/iM4cd>_cCT\'
+%C,#[lMT'A`a?M+&q0]$J\i,Rfdt00,>l1_fYN2Rk:Ec<<BlFkX"5$N/#0(d(IdRQlUckA*+_OCC^$25"rf%-dC,6m[)p89-Dkab,
+%47_=j-,\WKiO$UcKKVB)_^^KaK+Ulef[^B9r.2Zr_R>5:,MA!od,Mb1hbMq8(Xr+`Y%a^2/;^$`F;7>I0c at Kjs.5]44)EIfY0SCd
+%Z"iCk-I]chUQ`\T84^jnCeE#(E at LZ<+"L\TV<WISoB!edEQB*D2<?L)Dn1qLTCPoj&XOK/o6$Y5G69R at iUC+gEdriG?p,C=kA&AL
+%:(g2tapVWlZV?k]ak7'a=@b:7!^F6VF@]2,Y(pYnh)`/,`PTJbQCbV=A?q`%PIXKjU1?rOp4Sc`L499c]3=VZbfuQ]>uN9%5)#*?
+%VLF[?qUC[W:AlkM!8l^]*0 at FH1"jj*d;)n/L/'me2P%cndL-):q(MBBcTFX<`uO\l]i,4`Z)u28M>JOI]CLbMP"Amb&BR5[IkU..
+%hOp,;&.>r'N]KH]@nL?)j-ae%.c4gGG)8Pa!19+BU$#l3hRpcV()4Q3j.D/W<iVYL[=4[UQIuXC"R\sBY;+JhPgRCGo,IJr;1qG<
+%2eBW]/&-n_Ftn43On.)Whl2[$CX36h0#Xp'fEQ2+oQXY(TZ:=-.%G9tL7:mbQD]R8b;)6AY;n;\H,8SNY/tD9Ep-?SVV1E2HdSoZ
+%IkSX at 7&m$gS+[@;c!\AR1S`U_kHj>#E$Se>kJ]R3dS8/FJsrcK!8Jkmm/#sl<d9hc9;mZF\mE3CADk]+%#E0]f[s(Idh_7F!QXhV
+%NCrF8l.>)8^I/=PNI#Ag0[c.SWI$"?/.<E9c!:6gl*Q5qXt8_4luGb5j1/1A\[,bkE9`E-6mYi4hPR-5l+>1a[lg$:+8]N[)3eL_
+%G@)^jV1?C?>"Rg2(7b,_ at rj::BcMX6#;s#`qV>]F"lYua#$U;Q7OOWOA'+ab0-h\>(oMOHdT827C+m83"=lqI\)dcDn'&WDo-UU,
+%j;4naSWjM!,#D1lAt(,%.*85lhB at 6*kpN^@"!;]<9m56SP/=TP']Gf^L=iUaaYbdApZ3X3knW;8luRgA_k"s9b'0hA2!!I*%8DiM
+%rk#)&M+s!58n)EUj>:Mm/((ZtVC)$&VJK96cK(R]qY>/X:)ZlC?HC%*L#&!d.rng??I]brX.37`k._ at s=q&LgHO1YKn?kEkIb_sH
+%4mtU,l0Pqk3(>R'P_ at S8q@s,pP[QKtWN*6uH)DF)Ss:#>;s at LdZ]W'i4382iSIuEdZ]nCs;?f>?99#`BdFP5qW.a3aChRS[K>^@7
+%m,[g]M3MYY5YA;:/oIgro-kMnk:jPJ+X$HEi6V'N0m[hH++<J)A1rcV-'4 at YOu[H?E>!R`c<?"q[KV(>W--3*i4_]f_F/2QpJ!qO
+%::2OWAuAs%0,/j*;7)b5R5'VH\sZ9scGRM03B4Vnm#ZMEM,,k?=D>Gsn=^U9%d(f\0+l3ppJ`8<%B*"Zf=eoTC#6hJFEDk=m-X$9
+%2p-Y1&ne5e3c3mJ`,EmAHfoZ!KZuGk&>ZPOTed=-0!5,#n?$TIXQHtKR!b9)6Xu_Pb*]J-FI$#fE!FE!qi6SXh=YaI.#E0QY!$Kn
+%U%]A&EC$8V+7plLO`aD*F0[kLL=^L#C.SW./nYJc(j!a1In>$e:@cP/(;7hh9-E/aE'Q/99OY],PCA_YOZMq_%=)]4V%uj]oTd[3
+%HCad-%;8ZV&t/Rd[j;/`HHnXk)9-U]*cd6(:&ha`EX':me&>poahCBr7N)tf`0>tVa/3bUap#-UGY8;/36 at 2idusJO)f6kOK$HhK
+%P"AF&jZ1OuV/*BEChY&VcsF"Yrp)`#qTCOJrOYffV.;V$R;"b&bBp-WQ*P784o68=9ItG$/7'L:N:"brnSRid[GOn,)W)>[C#05f
+%>Vh2"S(uE5'ok5gD[[[R/QWm<2cr(#[oZ01?1G!rQW#0R^72sh[3NfSNhC`*k;F&NT@*g"ndTLHf2TIgIUsY at -Iu3amQoFs\gJ5/
+%3c*qgTra at 9H9_8a5H?9UA/(\8p8pBHK`cLUKRif$;`F0Ko)?b[bQI[(7(*%mQR6FD1a*WsUp[lreVi'N^l8l[e;;]h?`_Db.2KWZ
+%q&!PTh%li2?HZeVM at 5/A/CmtI;#V;1*5g3FhNK,F8/<0B?1-rfWOAPPR$_`+WW\jMp=<m84d(k(!i"P<T0sl2 at k4,nOZR(Sfp^F5
+%>P(u!1BRJ\RKg;3K9"j;Qja4tgLfcAK5sL]M&IrAC.YcafSE\^Y".5!aor7[?u.4W@#B.I)3OO95<m_W'+o*tZ(Il7mNrGSEnXct
+%Sh#5^%B0a$fDskQrIIjR'6<[E<-incK([RHoJb)IM4+@:7A;Rm+Q^[!rA[^kjne*RFK-n&r.19XJGIumhgaA!mR*n]9^S['mO_T2
+%o*A[06D>%X"W)6Wmn[1=J,_6WFtDD'=)R@=5Xcb_*9H\<OI&5S]Z6VYEds5f2YuuUIHCeq3%2jk[o*uDM67PoSc#(".tH\OAZ74A
+%'>'Hl;TBB^c<JEJjNhO8Y&G)OJjMiUHLG+\5K5Mb1^2#d;^1fHJ^>4tJeWa2<"A2/4M&#f\*FEEK</<".6ETOP#:f7aosd)eeiVl
+%K*8q9*E3[/$"e`$W?:IOot/a0m6Hgm^^"QKR,Y*)j>X+%K1SYk33TYC&"6md$eGL,nOSA:F2W\M\mompX9EB;[[,^bLNJhVbdkB>
+%kWqt%Dr1>B7XsRoVVMP;H.Z5"GhJDZ@(/8:B)BWCa2)&SQTLSLkNae-8":qGG\Nh:@tjNG%ml at .,strhooRhN$VIA7hq+?89Lqt1
+%)@:A+O,sf!UNH(+q'_5i_cZiq'p2SamukFp1f'"SSc)[hU/_%i-s"c4bO,J14<UZFEdft3jUoA)F5(Xh;S"ij6+`r!'.ac#+&j-s
+%eOu;NN29N\j\N_iS0EH^a_l8kQtYNhnJp`")!EuO]_X7QQ%PeG at 1rQ7f+M%0eck"DF(WL;"4N)l\S&I^0.lNlpEg'<kL1NacC:pD
+%Jq5qe?#S>>Iqp]r+&%8BLkrP&o-JZtg6U4bkd8)2,,G@[,/f_X\Ue$;EVMb,ZY<\*m#@5Z(:l)9OH$HP[qYtYae^KuH\8%cW)-:8
+%IIBT?9g#5tIijSkM&a'+G6^M4+\DVTZ=E!Fh=:VET09`&[n%XAkH!`2*j=[Z)(S_plg3T^K at j_^YU#PJCdSFQ=<`NL0uG$crQe?\
+%HHcq"0N6h+9&a7#*0>rcknH58X:ip*?7>cMp=`PVh,c5fL(oF:=m8$Q!NWC9cU^=T=0pFT8<8>''i_9e5!gI<ULTiXr80c5$Q-=;
+%a>M54Die>5S7p5"@;JY0R?4DETCbHV]hC."%CTag>FA+Ch<l>]`($kfCdDXY&]f6\BhX2*FGQ'-MS7S`MR%,1b>utq0RQgnOGj(_
+%SQ0/Y_6J+!:GS#S8``8UXY%bG2iCGt/Z3K7.Z;0;>B/iW-Pg\V`hlN%6:bi at h38buZ>O.:iK:cKfBI^$N/E9ESUm@%g--`Qe!`sD
+%XE1Jm/R:Iq\i>LLjM!og$XVUa=^iat^QXtP!`)n-nf=asi,+?h5tc"bj2G%uU?6QZ>FDnM]LC3LiD0+Z at 3IN$B"F?Zn_Vi0I8DSp
+%Q at pS[$O3dm,rZ7<Hp1!,kgbjp$i=,R'-c at qSAWqE?+`a#(2D!Xd.cl__?;T5b^.pjc[ObVP\C8BVBFj8"D.utg7%h.[cS^[%Lh^F
+%@F<%uW&/sn8Tr6[M63pcB.obCHJ2cOF$s:t=R3)j0/d;X at _7[qq##JJAQWTo^tU>1?D-9&MEpQqjbh47Va=k!\Dd`HgIOE26/!cE
+%=\6u,>D?a4j%Uc'Z3b(tR;*SY9pGVDH4;8Z/,.]^qg0f6l5GV)R4mk`k7jBCV`oeYShKQ10WQLE^8StkefV7>ME8Y`7O9 at hhLWVA
+%X@*5=_+5t?!^$AX`3Qd<r9LXjP#&?F;\Qs2=-HRR6[)ZaAYhrGCjgCZ0`,q\0#\7XEJrJklDM>mAl!:6HZ&7V\Hq@@n$+5hV-"-7
+%G^,Ag&$UUVh)FotoCnBV&.IH(5;HjPe-Fm1kM2.>$1fJ9PSCt3".LS<]3A<"f0!c-[HF'/"O5a-H,#ZcCT$>$[-C?-.OiAP4#3_!
+%b/%>#-.I7HepJ+&/DIhU$V=6W5`!obg_Q.2$$-,+.g`<tA"r6FWY1bP$dQBB9 at SmDB[GXR_K[@UQ9=Zl]7r at hT+3hqp5SHt6HGt`
+%pXol,m&?aUN&EU:.pX@#b^/\KkBBc/YnXOhQnZac1P[5_E at 6sp<[n(l3SC,?,ub=;)EOu;Pqk:qIsZZ\lEHPfrACu>(FEriG,DC*
+%.WjcC<n`h+3D@/-I^]3p!u at 4uRO@p[8QE>QT4Q`L\gPhMIf(D(m=\)J$8/-0[6bN>Qdg-?EuNJ7J$jp@=fTU$B80"5"Ke/%%PW5J
+%$BDqPF]n2MDIO2h3HjpE&QlmXYU(Z\MmNG?!H>No]hFj,Z4qSllSQcSQZ&1`q;;R&GqZu'\"8si+&A+_%qkAjdYd1G5^YcCrX at qj
+%k;7&%]haKjC)l-b+LrM"5.,B7rg)7k*9%hs;Rec5#AZ)a7+^DcT'-LV5'-+hO\**L?@E7sj=<aZrBKsKP.S(cR;.i#R%jW"Y)Eg&
+%<-b:15fu\1FM%#^D9/NE_tM?k9H^q<ZiYr&#TkT"5,nC9*dsH'2Q)(pqE7(WW$ZJ?T)5,B9D9]_Sc_fqP*c&RKE"8kRfu8Gq]8kW
+%!eu1!=7M(5NYk[B!*ZA013#Dc7d9+m8'm[Ur*AWL&]]1V'rPrn_uAuVXLn/l,iJpKQerOl8BTG4rGGkAVTK5HP2L?e+edtEC&K@&
+%-._n\C*`HI25!,d/_J@;qGJpD-s.<6&FqSdC(E>e`d]a0SKDB6LALa1pYT$=D>]Od-EY_JSph+7AuVh.1k at A_2Rs@o?4pI6/.#Y+
+%pnln`4s8+?o:md1X8P\98BJccih30-PF76O`i.\=F/Bf.N>rUnC<BO?Y6bDM&u?)`fa)>3FYI7hX5KhMpS2"!H-?Y6ilXnH/Fc:%
+%KN&KXDMA328s[[B2#&Ar-E43t=O&M=n8D05[n<9^-%;'-.g2bkcM!T%5at5U9*_X`U$Z.3H`lOqiCPRknk<K-(pQ$#T`HH1e/+a_
+%KU'[Ck)>CZ3Cd\LI"pC5m`$,t4[9S8@/Q.ZamlB8&DLXK?I"U-m_rsgXubYjUY5mGRGm5.mNgcn#i9J4YeF?]E\3=hbb4d-NqXi:
+%=N(9h$4Tn_)>F+,VK6_9e2+;QB47hXK<WB>nNiuJ9XQGBIP5uPnI^/EeBmY(jZ._u<aZB3j&JuDP;Mc:f7g-`g3uUoYGSA>bFi[O
+%F;O2Pi:4I&]N%,HjK6`@eg(?!XBiP\FKg`.GB*u*5<Fb3!nMsDb!5gi5bd*6*T+2OVsg05EcW<J_VL2A\rK=1,c>Rc[(]Z)%ql'u
+%;cYOCbAqj:J;P/(M[O]ie?Yf0/B#5R:e>@H8PmMTAD?78P at hqJI?Vs&nF$apEuL3ZPC(Cd:3Ef]ie)@=_f:e7g7Ee8/nk:*4`<H0
+%K97 at M`6h3RF^rfc+=[q5$cpJe)!mt'`(B2=.Cik<bOjeBhCElEmedpVP7,Er__u6^HsSf.<1ZboD3s2'i&H?#EB)n9be:4$FcYXf
+%LG at dP$:Qe;NNCE(P"M<a9&H5eHKc:W9#GCbjK3I]1nMq at mm3+d4`#9@^,`5f/OF&h<;'JP[?4n"-E:#;8;0Tu>7m-qHq`oE>-rb#
+%RhoGhQ4VQ5 at b7DPjJCYdA(q;RVfKp)>A20#?s"F2Hf$4,8I+2mAKpTfY*p(r,QUXcJT(o,j at I"O-FV1-Up:rS2K79<Y!72L4N?f_
+%_3I8n$=*5PqOU2Z#ga at aT>iLo8nPO]\91OZAUY%2-c7S at l]m6Znb32G4I6+Hh8tX"(W7A>rdO/1!L#,88"TNhV`0,")qYm1Ns!*N
+%*daeDmPhg3;ECl[)S26RC</1WF-;3#bM6q$c2D?ufGk:Y#,%,mJIJPG8H>a$)e`[/0OWib(IS"eC&f.-'_I#EeC<^!>"\'Sm-"';
+%R4 at 9fFG/`@U!V=CA'!rUI_*o><=NPi9P-;qQ`L%dL*t3te"erqr/M&(^(qqFMgMB+q*kX.!H at sB`0l`sF=0S`gMfO<_^N0<YAM]7
+%YHu'IGhiYaah%;%qX5N:k/46!&T2M.a22U;+6qk__#>iUS0T7R"/a-iD68C<8Y4X^o&DNBM6FoC&$6*'88]#.>:Y1aR at P3akBhR<
+%mbck1WF%/G$VueQKgs-Fn%4^S9VCW:D=X@>@5*1M)N".fR?pE5K)S'<^)ToU=sej3^Bp;o]l[[BGLF,Z_G19]@/NZ-45c^:nnf5E
+%W8I-j]:QeU]U1pj+m)Od__^PH!GUu[6a8J7OW;7Q.LW1']IOEF5ec\11+4iJQH:!(]Xb(:6j&-ZURXMWb/rP@)ju5_m8Np4ebZ6K
+%H4m8\#ok=BcphPkRhIpXSek#`0/"f?FqV.d!EFppGC!n"c3A"5WZgtRrL#Q[p9oSIo5uHHd1JogGNG;_oin%u7o4$O6D!8]<8.G)
+%D`89O]gC)kn_an?TWq\Q^5fb at _DIWLj*g?ba(-h]TqtrT%:Z5FR>5OgJ'VVqU:'n*r4bIU\+QN<Q4/?o7 at j5\LqGVjWuMS7Zd[#P
+%TK:-k[V9SKp.@(3Bj2#b-AT,Or`&oR3RKl1KpPnr+IWG)PH+CQV-+LN"BbJtjo-1]IZ,<bGb:t2.gu,`ab at B&Nd>uN8[<W:7#+MV
+%#CP]tTt/X&*\WufMmg43PJ?jtR\Y at k+S[)DCjcbYaNI1i8L<g]ir*S<e$Gt8[ub(DWMY`t<bX&G,n&iEnEqOqr%e421b@%6D9K:Z
+%PHjT&P'lcWq-!1<m)jn9!^Wn0&CJZ_TMJV8On.pIU=rsSnK\Y-EMb,oVTW>0qq:m1Zu>UFlBFm_#=Gk27<@-[3Gnq_WdJoL%@rjk
+%)oEV^c<4h2V,8D2?/-*jXYaDVKrIGGnN5HCm=@?SDI4lJAU4@;IoT*prG&X[D<aL&,H4uGFST]W08)R/do=LN,<]_HOKYC=9N.s3
+%Z.iFiPW7n`rJC8F?Y0sr:PTR;"D3^<PRcVU!Pbt23H)288\h-_D0;XD^j'C,PIuS:EVJ6$h`RNu+(5_P[C'C#U>m&6[73(^)'Fa0
+%juf2JU:D#XYVm;jr\u0pX at KZPNeo)EoCt\BrN]*gnQGCHRt[M/1bPcV2HE+C:Op\3+[P,A5$6S7G57UnXP="h?+=XmSY1eTCIt;k
+%Y@&cr_ug7:gNkUa/Tnaor-p)G?u!=oZ>3Q%kt)C0f$-O>K0p_ZH_%kdo+KfW6+oj>=6_9kUCoh$k9DFE"DHs;`OEA.Y6T]/odA;8
+%[<a^^R'QcSl*_&F*A"5O]-ZWLY>OF:0J*,92OY0X-;[7[;D9s7cbXfN-g<oBTEFd3Dq!2FW_-8sfu'\Yk[jd(.HW]%<Nm6[J4sC'
+%9i>Vo1Q,(290K&>`n/e%s1M^fFqU at 7I`BWe,S?&Lc"=d=+nM,67hnCN=o%t<_mV!C3_h!%@GKIq+16SJModD.UmoIk0JtFbdM-L)
+%B^ja\Zh#.&L'>"%2UVC\4Xe#i$gf8K%MDPm,jKTJ?1:O*ha2Ub+,o.kWlRsjh$b!.J4t6s"Qu#hp%j*fD0f830J)DNDQcZb5c&YZ
+%Pf`L4ppbFWLrg>3[V*J+#R2 at l81li^EC*4R`Mn989M0Ju)b*3L6YnfFR$HN'Vmi,8k7FNcfkc<%dH90g[jOucc9mdXo^0t'(!Hfg
+%G$.s,UQFm@/.XoTj,4_@/#58JgGUAK at ieN^eIDX&-ju>h.Eat+"Ao5E=6eK$)3<;h:ZO8S+H_<oZCtpoU(!FJr(tIPG,honm@*1m
+%(umT2#oSskDQ=".4O9Qk-#4&64Hh[*6$L2`fDRd`PA$rWaknq-q:$QLoc(XR:GFSeI#s6#),UPig$UinB<'nOT1lZK^4H?3kD!HW
+%(,??^,c9.VqutEXr%IH<`;%<)nFe>pdV^kZGLc(CMH#(g^d[Xm7UiuHoC>$na:loqX=K;n6nkK9_4;c-*t,?*9I<9#]P-jES5m"n
+%CDSI]ms at GZ$6*Jl)RhrEfpp#LL%ADFK+Y"<4"&'655V?%''RV8E5`I9-[GR<m-P#iMS(ds_njoG)tL]E6/Gk4bI=D(X66]c(g^?Y
+%&:H^=gh/"g5$)sq4ERl:p2!O"<AmAa3E`AIo5Yr(YM[id+(1:[T'O#HU#Vu?[L1 at 0,'QZ>`G/jtgJ&<V:AM;!B6E.\;qPL@\M<UK
+%I^t,62E.stC/.932,HO-CY[ukXM<#7?l<3F%'QSM?#R'WnP"Gh`*5F4.K7(P at 1mZH@#R<t\Ic/JhcRe=nO7tK*m$7(8fcm;U>2i&
+%gf0TBk@>m2@#^,2;RV*2q(S85qF!Wt!JJ@]\o-MH3A0H2KLqas0Q5(PE!)?,oC!2l\5(>7GBm"9h3r-WK[K008GoD1ADMU+O'%7h
+%BdU'<AKDa$I%>)sPhFOA1:`3[2j(6'T:Sl29LBgJ:ZAYlPddK1,24grHZ*)FQ`YbUq1Q)-X-_[.$;lNp[Bla`!b@'mmX`!N.9d_X
+%D2O7fQ4"Q`9B()j&&%CaU<.oUr"rtc;]`%i"RRQ'P8^o/AP!?fmDdseK.fBlj7e^8AaGlsU9SA"Zgga[<dU1o095_DGpa-<Q at 1G;
+%>[lV(=:k6Bd%:l:iq%e1bI66ebC_>/7gho+7XfA=dfuT&,[#3*Q[js7S^+4uR0%M+_;+!:Ce5d(]/@B[".(g0RN^3c:T37gW@;>$
+%Beq&0->4jJVUSI`D6S;7OE#p'R"eVFT?jUn<cg0@/%Y.%kBIM at 0i/.5:,Rt`R':S;Y=tL])EcRHqQ=VZ_<4Tp,(>/IGoe7b-RQHX
+%(u at sq.`\h?:L=&JmO@`,b_fU'-gs!J9-@#F^Z<^!2o+_soJ._pa`]5&@Otj]-!RBP%L*#VYa3%a_(Uh*l<K`B@;AFG0s at 2)[sZSn
+%g?l:jOA(fNpFuEc*?tJE9joqc\W[]MDf:;akM at S`?p2aFK&?CQ,uGR]FKQmGG\#=$ij.uAP&GX:@]tt6k8>\%].fNNSX.GGE\H6^
+%Q\.eWLHrP9)^Of2(ShOe&4I#[2&MqT"EBNn$dR&dgM_#62LPPLp,[R>%"?!!q7q9EMnbi-!TeOabkbB*)AJfK(g^t?1f3s\VBo%r
+%rNe$)B5VNe/-#<c-[iX(YdT?]UVs(Nn_roIgtNoL,&r0,fZH^nU=<;-:O-oF,WUekY%gPo"C+b;)2T[G-mDQ'**-]N-X;o'EeAP`
+%A<q6"=p0_fl5c`n#+7OEQ]2h#FSQ*4<,n1lF#&j^n+ElR,Nlb9Nm#tsbKk5:!8[;P*gOeNK[V<KY#%q6XmO6!`jmC(>e]*2TsN;Q
+%>trTf\FhbV!0;?[Espds-Qa-fpR?#LcHh_7#S5URk(oQM!83utoelOqq,;[bX_")QEjNe at DFE/q`2(&"7X(Jl at kq6,]1th4N#'-t
+%bJ],!6?h'G`fmN08qP"9,Wg9",`N;&!P:P_MlC9YCo at 2m'&*QYS%]eN:+KBI1F\_%,t\g%6(-i$e=4T6M1kRhNdUe'Ln.=6V1cWH
+%K]r]b:ntL`1 at h:L*j90]dTk_I9p=h at 4,e:d^?tORjkDusOn4/-gGRYtUhp$Co5ggIVj1+5)kNphX/hG+7'[ZAKGKgomB5:c`9jJA
+%AQ^`5;VWRHkWNbQ"Uj-Ao3O1j,'6#C\mc)[B"=/idWmB(+:#:dNci00e[E`k0a",r'>Uj?:J,'4Q=rGX!.iLf+3%h./2i=K?Zc,X
+%WTPhcg/]P"R)7.m/l.&ViAb[h:OtRi*-Lnj1LQ*',CYj?m`mC7Z*eQ>.K$Lc57CTa at SY?F>i3(\&<f_TG)g5H^M]X"^>@V"4]Cq7
+%0&e=*r3\Pk8U^?bN\STLpIB0]T4DLDeq9Z1;[8uqi%_?sZ-Lj_@'5q/E&5ES,V1B,jfg,DZRmJuN8$)q6 at 2o;i*7Q0Z)h*ioUTjF
+%Z[(5m8T5*+e:2*d7Y#(]SBRPZ</NtPa.`aDUJmd1%%]IPqma'=!#`2*DuC;p=K9+%2cf8c;Df`dOTs.,knl>T`'IQp`KTV?ca]Y-
+%r8b(0#6d1A<4"Zcob951JG;d:PE`?%YrS82bqViu$V<C3Z">:C7?D)\3ijhX,ep-c.pa-2U:$/"0X2KA63!l4IpTqKc.dDXVAL0P
+%`UlGkXssSF^,7p)50I at 9;iJg`oKll)DORB(hh]gM=Tu^rUa at 3^P0:POO4_fP\<2ilQ\UulciQ;SRn(`ViBUOB6]'ZQ67JXHbd8"g
+%m\/7!k^<TG^RmhM@(WF&0lORl\+AZCG]3p3rBbEJOKaq^2"XFKXV<OLbS*M!#H".f`HQ3orD%DlcRUkp&p!0.^4-9Q^IMMnH9.q%
+%[$rJ*O,0p1'4LDeQ.u;.jCp=)!bYU\#aA"ZYcn3KW*PGld:sY"lXV8&=lIBRc3#ttZCm#BHfT?+R\[ldW12tWIm9];Z?IiSYZc)c
+%%^NY=LP$W2`F'Z5+A=":R0>HWXol+C8s\$J#a:u))_QEbaM`XM/\u2\)I,fT-.ge1^i>dN:5jF3Vkb(O_>u*l(cHhj8=l;L0Cu3L
+%d2jYqc at 0\gE%M<<p9Q3'-&e]*=S.S5n[51HELubKI`[=(%8 at G$[#j$^cpF9!)=-q^BV\6XMA+r#dD'K5';P,/82clOZSj49:Pg at r
+%ZhgGHrroEM%=$2*+4d4Y]qp]\>I-nfaSCncE'LlZ-mX at bH!XE9fVk!Y!t([b@(GO]#$`EM-$An912QV/U!Cm;FuKSkr$6t&,V#t)
+%([LPj#!6udi$l/3Y329UDF;Z<I:7*/?$tu)A-BXe[;lJpYPJE*^DgWYOtrg*Pt?2%Es^o!M4&ieAb^!XOTh1)RtHWFY(#Z*PSYda
+%eV#4bVfjO at 3M0t8]G6a'%<B7C"cRo./@R!FW&LQ9Xa>ITV_6+7G&$=.L]kP^R at GfEQ)%A>cH"b?\\\g9^_eb\A(fS12+J'1dD;KE
+%-eNhqgCk7thg-"=6%Sf;/5tVi3pe2B<%k55mW0K0A,mDcKZ<2\"XOAeVktV$C`AOSZKI"lGhcgmnl0Y7+,3&,<(YgB#o*PHPC+d\
+%YtEAq1l-CM&WQq#EfMYL0,)J1WPp3T"`=?hXR$0iPT+[[-3_3r`*lubFdiV-$7+n;=b\==8>,q8'8VXs'<`94d/hP;dp13Jq?ir\
+%6E#k!IWij+b-fH36IZZ8k!&.?j7ZlsNQi`<S9(CCEcPHnM41?cK]OJNIu$]Y&iq1Lm=g5BS[2aTnWHLfTU4bn&f//=DRQ*Hacg):
+%5BopT?sQ\q8a*N5kK*6Yj9SrR+;8e:?Uk-UMHf6u?+0":I;$<.Pi[YQOSKtUs-$8]'%PNR]F#RiOEeQ,,C.&d!9P>s:$52.rp]_V
+%qX")+PE`pZn9GkN[YB*'W+`(4Pu9YVl6Q8M/c,l_2H-8A8hFnZ'KU8BOa^U1Y*$rOD#L[gHP>\<*rC=2#o?=)8.Wa$rR#?0rk5@$
+%2sV:pK\8ceD`d4FjJAt_C,sNQ#3g]DD1CB=ksi)orcptbN5di<ie3kmE5GJr#PJ"EM,%gn`eQ2Mmll\N,\\/S-i^!4PHeT;*mBOL
+%6q=b)6cES.U[l[mRG6n8TTQgA-eZ_Y=XW]t at I_6/rZnXMp'\drnXBen/1Fh-&4c(5\ZLX@`h"GS:Mj8n^2VaM5\^fBMB\Q9)f
+%5sEnS:iIEK"CI\q^,?jq)K<@:C+#"Am?+<Wbjj9_VhO^%Wg3^l-9i^\Duul;Rp_e*Q3^/*Qj^f>]S$c9rB1-b7ZU,OVdN*@FUZam
+%Aa=mmCguamNiCZopg8ui'0)s="_ at jc/Csh7g\Q1h)sCPZW=F;&qPmr<LP.u<d\JX<lqJmWP7eB:VD2sY+u``?83q%r at pgmD_+L7`
+%%!ZK3-ZMom_/]d,=ksoQM/CW;*/IkSXkadjl#V`8Y*6M^b'qN at 9QK'YK4)B!]1+eg#qR$l:qjJ1Y.Luu/8o:6WZ- at j8REo8;2%]2
+%cq2NB:AeKSrXlk=#g)Jh&hZ(60E9a at kUVVQ2?j/FlRc$^S!IB`h_DOb2Te%FQre_bBnuW+aXWiZqUB?7I%J!iI&l0+COQ!r6Jooe
+%PO.bgFDL3Gh8Gok64d9qSR!&4=.a2d,mk=c`NTI"%#tXK#\&'`c'r/8RCFc+k.EJ_r<cj/'X:]mq3EC\S;Y,o%A2r&@?A#U2,[`H
+%Hnl/(8kQr2h:FQ":cFu#*b*sq)@oX6:XSINa]l7V/kd$C_4 at 1`SpQgBZrf<BSt).VIab\NR4_o4Z0u-)Mrai(\q>9bWUGmgs+d"=
+%%(aY)(6g?7Gg!7?V%qSU3O8@@Wi3dK1E\\rT2L:/90U15:2cM!R-\4PLIZ\8RJ4_&o/n*[2+PaEa<5*Eo&KQ?'dG;ClqP^e'p7,b
+%W1R!I=K=249/XT5(3+,s_=4S.#_PZJ=+2Db,*-:(\3h6>FdA3U!oD-:a"gZNVLfFZ=,R'Xn`k==B1Qog#W_'qCM:GVBehKB!?e<-
+%Mt'@;']&R)c0GZeD0^mcc[%i+Om.O^]Sf-6%erL2`7JH9dQ'';=*QbJ`Vl<ApiraW3L+JI_?KBjX69jf[`Y1=E at g\34(4=q?KOP0
+%l9G>"@T-)3UBZ$AGpPl)oiMjBlj_aL[l9^pjnQEbZDr":nqH:/X at -^9][cQ,3<Z8q3=scudDGM5nhYT^D]qP:i,fZJS=O.3*#9NJ
+%H<"f74fJYY&DfUi>8&h0Z;qGZd=[^UCa.PY=>#*lLFuQagr^))*iQ5uTrIhNdVjW,e%+u67h]p>la%qc)XpT\-"XWZ'OF61_6#qQ
+%[cZm$iAPHi$0A at uZhMK/Uh3N]JH'Eb(d5./))uuRXj7MhZb4;[37o;[!)H@]'EL4"(N1)K7`Gi`MnX.:Flc^$>10p_C+Kn#^i)sK
+%-X,B)ITa"OT89d!Qd+ at TS>q>KZ"\4"+$3EI-`:4-cY)9%W?_(?N]%oAk=LaY0g1]0#31lhPqe=Ji$BP'hQ<U_913mF!b"/;@=i1#
+%?5cp3"R*X__CH"%$7KP#ZV8!Oj_%QL:]m0BY3-iTEJsM4>`Ffl<!V`0S&if[f"Q9g#ifZAHiiuG[4NQ?q&MBVoU,q*qWW/O#;GPr
+%Pd*6]YI1fe.bj&>,cGb)UgEdi0=.JMe#mk3?G=dnkhG!=&.oO/O..[U4dpcdr3%PX.]FpPKmO]b&2-f;:D=HoW`5Cdq.LQl>o",G
+%VsJqoqj2u/gZ'_[$$m2EhRUXgGEt24HAhd1$0:S<;B"Wd&Vbq1%kC+EeNm2G]A&,"USD><Xu5 at sH+7[ho-jdTO#,/1638#_1S#nE
+%/(aC2-=KPK&(`Q/=J"tK4@'-qe']T(h0!1o-nlmUSp`)Omh at _B+.2Ul@%7#rX at Nt(?RL%9R[rnSlC-c(>a. at oheTmb.@,WA*<X0$
+%h1k?-d[-CT7;TAps."BJqfGFXj*(!?7[mQcj7:W%ZL`)Wdq&s8N>>]hf_]P;.Lq3eK9l$^Qa^<p?3g2G9h7KOG(Y`jE!;[7IKo3n
+%3'BnE@,"a$IoOFNQ\m-N]$AS"\RP at Oam+<:h,m,qI0tnGQJGc*:ac4(9:nEc[(<<6VEWB'X%BTm]/uSPV+qt;3iK\gBJ"7[RP)Rs
+%qF6q`n"Wt"UaG`ihs<HY;a.+NPkU?AN at 3o;2`7D[!@0\[8Dklp=E72,;hjEp'g&0OJ]d2HVL]GNr'%N_nlD'0o72B+C_u-;'[abS
+%H*$h#$%4$59i<AhPF+Lmc7=K$e4A3L;$:A'-"5nBM0pfkFXn=Y<IR at U_ShGUg-8&oL&emeqtMhiN+lZP0Y?&g2`\S/-4E&7G]-?p
+%j$<$l(/N;=8.ggNZ(Ik/[H/R9+BttZU`P$^S1=9bcC(h^!96f3"`5oTg_M""$'h4)b.l3;bK0<Lg!A%#)INQ^ZNmj>3j"pH.IEG%
+%XAd.s\+*E*VP78Ieb at TDqt)Uhc at gf\:Za8oO^9E/Uptau))Q:()C?l)o/DTHPhaH5,=W%IH.#+>(fk\R#":4[2f)1<b%Nm<JtLGs
+%-7$846T:e7Se=XAb:AL8q-bUWp2^A?;(]i3\Y]UKi8MaMGR_%NZ&##g87.UuF9T,)&lG<d1LnN\#CiHIR2:G_P6\M>!HB:tYIJ!8
+%n`?]38XcXJU!.jpR.pd_'0TK"T1mH!?HLre:'$G/2u2(%cXia'VD#29['eL1J#@3]d*^[hB=Q(mi\K-K]6BigWN4m=*Ag[6&:^GC
+%5$'%N](Z'7:*4g^c9ATZJh#r at X.:S8"A`DB8f$sU4H at SQ0;TX?&UM/"+Ol&+NjiE-&7TlW;4jW<I^RrZD`OfK>k8::KGAO!J!Io%
+%$i6Yd+"5["7AH)2(/4:UQmo.lgMMD!_SC]c<Ba-]SP`$+ndD*o>tss*F/LrGXdB>H(\NJ at PrQ+OV:g1PepPWcSS_X?lAd"&rj1!"
+%Z@[O-he-,TcV&%)[jj&<g<%PTknehJ,03?#.EE-O"!CWkJ]Ulmd4W(mQ)Xks6r>Cgr(7CTW4`0NWOf6[r>`<,f_%F+L*$_:"80&$
+%W>W*30k'Jq?'n.'M_ee$)^d;u_GZZVmBd'W[+eOHpPjFAM7rmG7LM.a at GYY$#sG0H"_,Xk&ioPYVJg)kI,imFdcF*/>hP@,"QeEn
+%_s&[u!&2hr at c;ndRkLBMRdV7V[?3cQSrVNqWjj=bd/_KMl=?t0UT\T-jglf`Z)>t(bq4Eoe=Hu<e)dZA=V;[.]oX\5IQb-mH'ju6
+%[!BV'Ir\Xe-=FBGp`1>P/o5'83&L&Y_X8RCmg7u]E?bDVRYUCj%/S'([$=Vc2qKYW+lW+Uop9mVmaWBXUXBF:%j9gs)N^HHB_J%o
+%iZtsOI%4M`jN&+uFsJ+KlP)Xus"#<QGc?>[*/nF.c<GqUgs,7<OkSF52n/Ce&>%d2'5jtB3>6h64?VLN$$7M);dTV-l$KL3XZ7Rn
+%WHVki1j=P=q5UQ&-]NHoIOhP0mRQiro/+1(/#HB0;MUNge="gW3c-S].tqMJdWMeu4_9J5/92KJR6t'%O8Lag5jM8$q/'&*H4+K=
+%+#oKZH+od8cHTu;s#>PYgd3bf#>`:X+l;eF04AUY12Z,"oH\GNBs7.`=%Omc>p5rE'Dg!mHnt>hW*5?<%2%sM]Bd!8;i4QE_)J8,
+%2Kt"7>\0*`[01-p]b%]DL<_X6Sb/cAff:uJeBq_#I7(!Z`P"7"q,WU49#pn%U"op&K#b]T6qU"5:%`mV5f9=m@>[p/?b]b;V4neC
+%Z,+*>*5*?0JF_a0'CL at PM!aN`0"\dbe6&hQnrXaMLQgpo92XA@%d"g-UFKL7 at g+T(f&XlD<IsZ%P17,OX4##+3KQ2O-B$+F9b\hm
+%2ea??4:m)gfKu[A:0O9 at k*bgZ'@6YVa6^DgC$b"Jk4s25`-k at 9AK[Ea8kcuo1Tt:d0"%Q-#EG=%6GQB;V&B6Gi$@D"k53o1c1rs+
+%gr"T3k_E2AV2qs+Z/ik6bq1Ig4,eph\`2[$[m:Uu;]=:;*tjX#Bc(ng"4)HBk<pE<N9N&K^,XY\]3IlG^"nSeHYT428jXc=d7%".
+%Ac0ilhD at E8PXW$W_FH^'4GbLH8JRr6V523R.Q3JtnF*b`\b'ZXb#[ZLhmoZARJ3H$D,6+heCb5_Vu$C!CUWpaP&nYA$rd&QH,huY
+%/Jlm)&h=PXFWbq,,n4B?\USWXQ at tBbT%N)&&%$e/9m!F,W=(#q[rXc`Y at HuPd<"MIo$.:50Qg.tbk!#t\Zin&b/.U/SG,A%JIq/`
+%&<"k13t%JT-+!\o"B)(<>bA!"RiHWq;D1\#]G1QA]beIeW?2;j+qpu:F2*9nS=AETX)UnWfb^k=YV8M8/>4U:nA\jbc3a1.&5NP8
+%RhkCC/6!#QhWM+OAk"s!U9<scM7BH3G#*IRJDajqGF_*o!:X7M4RI[s0t>UVZQNgb[%qqpE*Bj(71&]ljU#$5[`'fFfe:rUYR_Rr
+%?FCS--9p#Wr#U_KMQ#A^q$XSQI<+-D8uZ at U+8_N&fKWP-3V`p]_o>3^HRdAb-u4i[l98#K8ch,D3R(%hA[!4H\dn51W5B\t5sDS&
+%!3$bmBj,aa2Cr!X49TD4+7\8F,,X"_mfg0Zk05g:GlbK*WOB5X[LIYM%3..$4Ib5"lY\^3.ckG4'Y32`7#oH-h2t=q7([A(%#'o+
+%S<T1_CUgORI?5/6,)k_s6"jWt^L;l>G,ckD/XTGfOZ1'@2*g)\a'/W&A-i++DT*%OY at Al'"2n=`rD#So_MlDM!OgK=-X5R2Xl2CE
+%[SCM-ZHj`U`Z7o3::XAA'7B^(gHJ%q;o\.#k69uj,q2]*)k,Ph+C*>!c%e(,h^nCL)mcPlRCpL30ii#TQu5JQ+/:Kd0L9)lfAH/"
+%1fY2Y;ZPoi=S9QFVAu^$Mu(.*#`Wo*U)H[j at NG)>GC:CmCl[^jj`D5q%Y4c6+:]E#RiD^Ghe1HOXnc2#l)<NT`tU4[24N"4Zh:OH
+%S_b"hZ"UhC\OE'PiOLGS+dA4LZ0$J[[.2d>p/S#Les_c\laUKl-Z:NC9R[edB1X0>*(atW._E/ob4<aC53kBRk)3 at A.4POj\<c3h
+%C)J&InJ5lWX0fSp1eqF&APYuTAJ1mW at SJNI"9MMYrgN8kQ4N#HMfZh&0TprugMpMd&A:VfPUADKl5Z>pa)gNkVJ\FlG#P,9"tE)O
+%/CIF[:U9I_*'S(N1KnNP$4aPjdC&@\lmng5'aaFgf:!??US5C*5a2S?(7_DCRGX%:^En6rJIVB]W,`n*"[W/M4je^ej.u`9fA!kA
+%;43+'r;$L;i)t*7/:r,B"HP_f:C0q![3Ts,3u55o/P2:B$RFC)EVX[HVBXo_,/IYCs,(<.0l>Y[@C.'GM[eB_ at L5@q=7Q`Ch\tkf
+%7/3.rb_i2iQ-a0WG&*>4P#pX:HYuof)`s&?X+a\c,"+c]0=`hDk.)+S^ZdsM#E,;7ZWr9fSa0F"NphrY=n9X2h$0C"P_qa0GINpP
+%lg'LXH4LHh_oP>$?a at WKKUZO*]1rN-ZReM$'r at 1\af./eES!k2gItC$48s0XcC*B1V`8he)cWHBVc at Dh@*sMd<R/5b(\"X3Ts at hp
+%4^KX4\]Fh0$&V-F4I=jX[UFSbN9m&:[R at SnkEaOQ89q](b`W$C)Nc3sJeZ-gV?nr+(_u$&B[ALk-NS0n.]!>(gG!8:7H_R+3f3+H
+%)^G[NRaR<74c=NZ\R\d<([[W]Yf]ZNkt&B[%QZGTKn>W3A&9,M at X/C=8'kG-/R<m at Yk)+ua>MnuSWf-HFf/-H=`[<F6@*>NQGbX2
+%`eBnb79QdMj_%1^F[UGN%s`>M=opeuC=LE0:,n4MD<ghQ$0<sOXF,BPI,t_O6`8c1Z!n-Q9*X$;)qsKin>FdD4qlW"klBUT';R[`
+%L<b_=AT<q?P1g)-,ERIX1XjLMiQP.i3iS08R>S`-^eK:4]A[.HI,Ts#l9?f+PSMb4HEqrA.+.\AP#Zs0nF3RTa%=R[ruk%cisT8M
+%X>T,l4F'q6kqZ]L0M+km>Ku,+jE9bX[KXK$[5PIb4Lh;J\$dLBor0"h\/W(#T&7(t:-2ksEe5=`-eM:XB_hM&76`:S=,LWG<O=kA
+%XSe_]6:3kGIGP+!0n at 8+imcDpc<iZ"[tgP.c?),:/t[VVEl*eW+!"0?&'B1j-&7ZI\F5feM7 at p.6)LW6QeTS>s2m_h=g+HEF8ZCu
+%m)P_ at Gcj:a:S.6B/A=>jVc-.l<u"@!JO2IadC/u?p-L6-pVU%!Jr;7&J/TrOh9'W`o".6+gaK(@i>Dc`cU"5\mVY`7=B*DQ)Qmms
+%0oFW\BAoCL\PXi)2)<\H+=#(=Wt3qJW.bK"oP2j`*k"iUjm>h)Za'[:.(/4$.?I at PK^N)$nq/cMP4T%:F,d]UZK>9Z3bN`P>a/cc
+%2o%(Bo%4FuVi,^nmbb:4;'\uu3qWK0"3pIH/[>R.U`_SeI^b_a!Kl;N%_\i9!q;@R8Rj>E%q$]'V=/_;[.99!Q]P.=)gU83*i+eP
+%GI7ab/u]rFKBfUf"IUQm<.RV<H!<R=.m;BncNtrCq#5<"&oEs=D^9$DJT^CZUs_pX,9W$td&[pTUOcA0-dh#1.f[aY&>1K`0UIUp
+%H)ehKka\rS"MlL1k+YS.WFio7VAC0EGuZ.gnh8aUPjq,(SsgJ%oXtu>\=0NApW%`NU at fX!OrK%+4BDZ!3<<6uJb`RfO5q7>m$LSM
+%YK;HAinlmXAk%['r:aTI?$)YccOXlHnCsE#bOG&aQ8=%dNUM)?7qE.JE5$*8'Fn`';Mp;T2K#F/4TfjY1b\aG-nC]3"i3hT"&25N
+%mX:>a;OWbPf'1D&o!4+MYnlSqigtM0I+8:5$-]84S4Bgu>DIb_c`rRhQrB>_g2mRN/P1pf=@!']RE6FCe2aL8d/1K11hJt3h9M:f
+%A8Yt9B7mSY2[tV@?@77jr!hrSPH]qqNf=A]3!<g,IA\QVdT3ASE1&\AY[^F.nLWF_:UFtFmhDG8$XM>_.?K at JpHZI@I`*?XPQ5^d
+%>^$YU*S:):<9^re%ii&dfrunfk1pP+Z2Aus3<4)-J'Iq.o+14Hj1W:bVO2$sqlI?f$RmbMQIjG&$_)d]`l3=K9ZN"'rs2K7S1]&J
+%-H?;bXtU5j1\;=(d1rE:E9pFmJ#>GoP?n#:L\P)YM$AOpJWm;n<OXC4-7ol$R#B,^\@07U.(CREk=%K6)^e%kX<[5()po9$C;Miq
+%;<W<`/dJFHgbBUW%3C_!'&$5"k2ch('\mIScg6]<R>Y88#ep8ogj!W#Z]V5nZtk=nPZcSp`8u+K2DS>\rR"D^mQu.;QgLst-&)r#
+%==[)8'2YKHVZP%uNbh^I\5#+[XJ at h,UJpa at FPD0Ar67<;j02jQD2M5/dB at dtGYC#8&<rL!!Haj&!!JPm'_u=pk<L&]2g;go6Z:[e
+%CF.W!<3XuSV)G3kh_S=m#j?52CA@$S3!VI-=3M3Iq.q*XH2AO9jC at Cp,Ucj1>0(@[C-5$ljNCLPae:lDE,lVDW<700m2Vf".gMT'
+%i--rfaA&PWFCRt]dfi3#F*!NnGFOF2?f8kr'.?QlW\RZ8'3RDga9g9*C7&.AlAS$C9:=&Z.(/5uk`n8Z3=t=/>72WB^!bH;l$)RN
+%iU#7j%<N)_"5aPnD?Pi0"D6`VQ/=U6pH]kT6=rqbH#If)nlKZV!d at OM9(0\bU'I,Jbf8253V/QO<ctA:boahY\+Rsd,sfPEQF:f`
+%"o9V?[l72g50/AO*ZY1-76L^>=bXcm<aZ2d#:8_QUebdb`$2*:H"uscDqB.cWO=8]QNYoln=S/L+D/kg&UN]Sk>S3NacA'e&8f,d
+%IpT.WEDRh6l;)&c3od2;.E83e#XF\)2">LeV\bWh6kF+QU^!Ac[^s%)k6,tW'(oeZWV-89Y0ju9#:IaJVOtk?Hg9lfT'se`+^iC,
+%SKK,^>&)-\fWm.5)NrO$jqfjabZuE at FSM0f<H!0om-C]h_n36[>S>[.hm-h]8LrI,Mc5k8/(#)_/P)";!Tu*PI^\eG9\0/;Ama%t
+%:?''4-^I/_&l:h.^ugp4-.N8[YFp8S=^HC^`\>U[MmM*,2i\jYP,XE.(GCB at rIn%lGV)?/+f3Gr4]`t#Gs58p7-E'o#1/L7'0Pro
+%*sG9/qTqoMP82<-F`eP#SZ1/#6Ep1abfE8Ve"&\Q at uA9aC@8G1`_#&a30Hd0YoGs94c&PcBjDWA>MtIBXl^2#,(3,C&7rJ.BWnu@
+%_pcM(#ebZ_n9JU;'7t3Q/F39]'5j$4HJ&robSW6RV*X2?^oYZ^6[u()p=1Bsq4VS at DD?S'5+mrAn/:^doXeR0#+ at B+<&mABC)iml
+%UZVedIUAa at ieZI\MT=DO"'pds_h$u2(Gl!=!eW$jgFq;b4g<08\*@gbKS$M"i%$Ks5nhkgB1WiJ&a(j97P2#lN8VUQ-lB8Qd9(lm
+%Z.r=0I9N?*/q"Q+aOA;_gsA_QaZHorqEj<t!naufY%^$bepd at C/DY0+gcWn5i;^J/ad-aY3W at h6&qWc?W`+&s-[.>pD+c-FK"u"Y
+%M2u*Z$2#jWh4QLSmcbi3YXo([+!nik,5p;V,3B7!p#ZbHA8"3c'"l497+Hkschu[!IJ#bunFlQp/,3i5:X,O8e74WAm$+7R;>,G&
+%O7SECW6m/IZ2nH<ps"qH.Y71KLcIA6)aQ38A'&[nan4#Fh2^aAZDX;0C8%K10\-_WT+&eO$JVmFNJKC=o.Wp1lC,r+PJMjEkEU9d
+%m68!g8TBp2bL<aH(fAhIP at khqi;3#/\JH?4_`8jTiITUA$IR;u%cj*iXLA))]VPMuSF"KCY4CU09M3/drc%LMYGp&Nm65@\ef96^
+%S+];c)H&68.As4iV,4;4EK8P'.2PmTVhFp/=R!tj%S"aUbahjVB.aAc[lV[L:('(S.?4A,e*8bIDe84ITgl`*HT=8M?`:aZ&[pL`
+%MD2?15NjMlL%WUligu>4+D3`XGA-Y.__1B^Z[n>W8&"&4P%K,$)9pX8Zu"ZH.6sKT8nt\!H8Z!!ChRnLiB\;8-h^0VbqCq2bHEra
+%$X+aGotaX.SjR!>ZnX>`oAQoGjc8+ATDMmFZ^;'pfJP$.RFU`ZC5%3%74P%)]YW10WF5:uF(K&'[+sVMRfXainc]33nP2YLb5Xac
+%0\:dl2^V/2WKD`,EW4NHrT3X&^@jWr\X_]QkOqF(buk=00Ia'H)hVd*B;Wu46to<QUG+aP[;Y>qkPVtM7=QdPCM7L5M05Q$"s?ql
+%(tq>-o*-Cs3R2^i:+tf/YVhD+;D1nMd/TVV"hc^fA&7^E,cQHc*.o5+@&_lVG`k\.5VL`gk-b`rcI9:XQ(sYo9 at K@$Y^ri,LBMI/
+%[fNsbm`2[X:'Hd7aF\A at e\.7FUhFD%^!+h3GkT1T4G>+/k_Sm4'N:kO(V'bN">l*^MB\ka#@:5%P:)Sd-S"\d>0;se1dmIU:/cu#
+%Rc$&-4a)Jl#g_"Xjl$?Le&Z>5 at 6dla9.IIWf-k&[GkA6%Pc/_Sf%tRaBp;2M\SP[:=!5pb`_3VS<)l>R8d6SRC-cMDR/*S=7>MoY
+%*MeA^c$\&>:L\\ac_FQ?)#g31Q_gjAI7+5i`c>oAd\#F*1Y-gb;5cN>oqP`7VLkcB"1CMdp?nZ7C!Ukge![)Yl-nM[BDEe.S<;`f
+%r%SI`mjqIQ/`m2+#"MGj.7Dg=*V06a,:TM8GND'(j+oWL+QUsk:C:[**4)PWeo1BK6/;.&(']DSgFob^*f0%dc+`%T[IW#IQ06I9
+%rW/#mh?YY!M8*-/LbX[eA#t`kU1P+$A?`>r%(b6:7NL0ND@;P;Cpt_GjVCmtrjhd6NVk0pK**D3m2FU7QNVJ((Q at K*L6_8UP^b-!
+%BYA73X&\9K>kAP^JZJL\aDW0"iMZdRBHi(TDCJ=r9C\j`IVOjk7aGkr05$of9ZN"I9eKrdaZb)#m`:p15FT_Bf$_Qhp.XttREAl1
+%g/eEFXH8#\6S#e2G2#4loWW2)=A at n)>CmYhpulWCC1+LggErZXIOD2ZYg*7X-=os2BdKS:?R9VLdT^u-8Q'(0T>Cd2Y^2a^RppP#
+%9NB"%[]MVMb6E)?A#3GXr4c0c0pQ?[>,qD2dJL.JE9X"u5&;ZqYMZ"2PW,Q-h2M:!7M-jm`0`<rfKjoBE8RhZE/rDX\d:*;2:U7g
+%N6,>BrgKf6M'Q8PUf@,LMi157&H?eq:X_G^@,\KnYQnocRjC(q\X=^n-k_CFp2ZP!9g=6+6NkTO]$SMtnVN%"6$prrZi6J-c]GP_
+%q$P'(;+R%.)fQHYrXq[%W<8\=Rtc at cnQU'dE[hqk0f`e[Sk,2Ya\F+4pBu"!Q<`\2Qt(*e3Ts*$!Sr;Wn?CTo6$e'nm[&k$fRplG
+%a(@IWEY1#NUn at .CJ8(uq:"%rjea:OE&m at W*`o5'Ekp.Ih`[VR.2lUkTEqSiYQ!l*kZ&3r7Pa)N,Lm5\A3aYJc!"ILPl='9]>l8d!
+%\K$jk;Zg-`)XmR(;kE9M\ogVF`5`igEkcsjIa*XIaaK^Qm!IilPalf<aP=]<h8YTWpFOn6X9u=uE%Ki?4PA7cW=Cfl]ps:#dOB,^
+%6Kr!>TZrBM?CjM*9'n:0Q$j!bNAm5i1(F).f.#Q-/T450e2M=c:O at P9+,P;,LR1JQ$GJehs(7cu"&!^Z#j?ESnR`4lip87u08sST
+%fB9D'N0Z/kMs$5'fi)_%4Ju(IIJG. at .XgSNm3)0g8ai,MA#A@=m)0b(^*(DDS^PVP.JmG]fICGMXlR+tn`:Eh5&io%141d(IW5]p
+%DB$/Z/!ZKR.S/Q^P0F`_Z1dE\^Rjb*DR!S(f%.q$m'^S1U/'/k*qLg5P/,]!JU+4.?'4*O>K/ceR*jpbo?3K3dB!["DH[G'Se at 1V
+%N1o#bh%8f4M at +b<X:'R7YC/@-[PUf;-f2C'\6i?DL#T%^qtHnljW[@Pk[_At".e'Ui-TXe,L!q*K7e3B!0)#pE-num7'pucBD)"8
+%$;Ys*Sq,CiN5+5idSbOsKSA:=CcS+a\!WcJR7c."]u_W6ilV'FhO0E?gs@]<&8bR".n>M.]jm@)\qqp!C.Q0CJ1G%`#6L"31b5 at a
+%,P+g*Bm\1(4m-AZp"tUdA8n`ieph]Af#)VP+*s];A/)AJY2I=H\2*%b*(cKrf[pr+=?QuZM6FI@(V\9aH,Z#7ebn()<DMZ.&Q"*h
+%N"h8&K]WK/RX2YiRS`'P;*N?mR`ICtQ$q.OXu\GiZ"s_4^V#29RRkafZU;Df"Zc.dO&T_)IsSX#X!pg[jV#K,TR+2f(SZIoPc41!
+%!H!Hrgd_p-SF;RqJRg!jNK*@.!.AENSkgs0-\-.2X$":P=e:gfJA0mI"3at9dghlUPYN4-U1)Lr5PjCEn/XfO4#NkVj"aQT=5fuD
+%'.c*'=S$87UF!%c,Il.X[hT%[J11NeG5fjm^Pi(;F"0?0e_5FD_m:>Oa)mu;G;ggB,#cmk*@*pVFA`N\9*a_q7Eo3 at G[aeg`#Z^<
+%:J%Q-S?dVpPAbf7.<<uuKdQ%WRssb@#"l['nJdkGPDJH[TpC.DYT at 8qM9jLXe"LQ7SC:Os=$*B8A\oQHF6>dN`)"@Z$Oa$;Zq->5
+%%/n2[V<Yg/b9>AB^KapE"WTs&g-5UJ0.q?%ZJ?rjiBab\Sjc,_.B'I/G#I!8!msOFW1-q2N`e!sTIj8#lhG^c-Mo&MnMJPg9&9t-
+%i6jR?Qk(q^'Rm2&a)c#<]B52e-fp_"BN6nZHT+D(,Q`*!pi'DufQh.\>[X2\gS)1WSV^gli]@V6FYNBT2Ga3%\/dW#ah2[2r6!XC
+%)-M)RmF::Cd\0n_;EF"p<JKWJE<S1Ee9FZ;T^V_D_q#P0Hnd&rKS14/#*u+X<=^^u/N==fMCuL^85,q9##>@_?<aF8XVg`IXt]5c
+%oM-Q%,*2m20?:h0)i-m44eL%-m:@BCl'CEJ"TC>HRjhV6Zu\0i,mK2ZjR=GY'IkqFW]&$f;6i'+HoK&Vb)`sVg1I>&kP*Ie$#09f
+%cI=BS2=m/b$J&VYQr>eHFJ*dj9n&tU"CiICoDrp7lCr?Lc'EBC=<`mZl4i>E9HjP.he/t-,_E-XK)#Q(OeQdF4S1b&,KPdYfS>I1
+%APfRa%<+mh$i\2=>5p.R#;>U0P'k>:G/=IHi*psh4(I$o%uQuQ6O"p[^rP>94PUp>J=QKVe9.mI<&uA<*p&a/P7mL<F1Q!gfD9JC
+%V]i[CK9jiX6aO(-j!fAs+BooZ*4[_Vl48A at ZBGY(O55CdAKHrOq2m&k%-.I[WGKdV5;sl7=h_pN_RQYSo']o"=%>6D-`FN-[Nm/B
+%h\7;W]flj;m*j at sS"0lMVs2?k]'GnN_ZV<f,UI#N5?eZ"q8?cW3CPWAXh71k2`3=S&G`fZ3eDoQ^.VcLW^(GjMH$%=8F@$<cK)gc
+%dNU25Z\:a,7>bMdmm+Tj#B at Xa<X0j7;u%&hmO<M#BfVT.%EP6!;+9e/ol.@/[K[R=s7+_il#-<23TWC7L(^bgc80-+'TB<tO,qi8
+%GB5>Drr%cY<XUdlT+VK\-QSo960u(E/Sb\V4%Ca6mD%l*m`E\*7-c^S:=k"b=T>+D:G'i*.a]'3nsC=WZk=ITaVMWE2#MB\kt?BH
+%Z9b('iA$0Bi#lU`I?I!%N"^8t3Yi*0Cnb#tk%N4;.iGI4c6s47<Ut%sGc/0k+XeEr"]&Id)PfE`86dYuP/`qp>G+`/U3_)HD(:]p
+%bt%`'Yc=/Y8/0/"8E#\8_XqJ:EHTNgL5mS''?g%HZ07?95WcL7E?rgM:A>':op>EoQ5^i8g/h`BHWdUq'CT7VDP*6hOn5)Bh)/!b
+%C]8Cf\5I;uoqM!\O?aWEJGW&pA6=N(96kXZ&`D7[-Rb?o//TWo4e%uG$pfmI7/a8G!-bU-B[d2F2M)E_IY=9EZi!"R2A[_GD6j=t
+%4I4SR^>.);;>EJ89=_t8mTs&Z*6/A5IT%#:KQH.,2H(dj@="%qV6QZ=!Kcsg.dq/+>OU5iSd+/16O2lrs26c`=sNp1%+H,ud<]A+
+%`Rh9o(u-eRZ560PH[]Dodq6!OW&T'hdq1p at WZ.K)eaed#!-u[+8'P)uE&GZ4?L%+rCtE'Ph[S84<:7YI/J?sS@^I'hVF1bdhsh3Z
+%1%pXfriooa6pd'ef3OW4_]JMr**S.>k-e_hE\'TF."`PNj*$H?*DV2M-u&20UPiOY0W-s3G$_.OC<@QimuktF'%XI`c8bu$:f+ds
+%5V`D\O1+JH>Dr[">4n$`:_u6gj).SiljH%3N_Q$J8tGt'QehPbYo]-l+.M=0GY_Wj6eEI8T,X44RqVcc60 at ClPH@H3.:bh/h0I9B
+%28)UE87ahq#c;LfQ-0V3E]@GsW]4)N+LCO]'%etr*WR0rR.)08ZfW.["",(SpNB`jO?H/H at FLfTb,ZJ:ka at s(PqfJNbbm8.R][]3
+%#QL:A"<[(/>M$DG]AMeo`c<;D?t"9@".aN*9B<H>4`"T%o[MeY_sGKt1bJ)n at 61&Uf,ua+aR:GQU4_sgF\I(60qYtB2nA!g=8VF&
+%+9i4#f`R`/^bS[\e:S'76\AX97A#/]?P$:h]"_hX2:sr=9s$ef[SDOCXt\%!,g[FA0p52tgrTEC`?ZRMka57umjrGLP3FW/m8Q^Y
+%`"spIR?U)GY1B1fc6kgifjV5XH9AJ2)E&.RXr\WX-_$XpaI6Nj#p?dRB:cYjiKLXt-PrDJhJiS3VSY"?;ir%QMBe2OJFRIOK6ooT
+%9tiV+i^GRZM.eXnD^tf%10C4!FXMFM at T*_Xn at Y`$3&Ir,X3BhMo`RkK`_gW+griSC578g)4NYk$[3i at hDU'L6C)]&0`WG;ac!^o9
+%6'd<@J+I/2RZ)<!CWPP*'k'6W^a7m)gcd%98'-JZFC:.1=,rLHLHZITqt"i99#<]MQWoJDdf;TaS.SQ]kdgMd(1_Qco>J7eq)i8+
+%9r"jIEo'ap(;Zlnf/M+"?jslPnZeW:NofOGG%.SYk:*Ni8gh#bLP%8)[V/P_ at N8aXT&2I1bMPL44+ZLe-'JV\7L:.`NuUqLfHKE5
+%kqi>h-/6<6?r,&k#*g<s5hFVS"#Xg=bf)&C^K at _;,$rZPMdaDQ1l?q^&Hf;;OPb!T-')_ at 1*mr^%/=$BZjGl+NG"^I>.LBSBlWck
+%TqN"URG\L-.7YlpFMZJC6b:tE*SU9K!B:M(ql+[. at U,Yl:8')$@pimuh]E$tb=Wjfmp*Lg+FVVhc`+]$hbu]aW/qrDgKlFlS-D*g
+%-Dh1%kk/DPR2becp/-jtEl$=;]I)m89Qfkc(mg$hU=4leF<b,]>.\_.(RrDYUDdb&QH+XVJE<C&lZtO at -dIeUI&M?o&:'(*%/'Ra
+%S,(p:9lbN*+[D['RkpRqs5)dJFR:]]qCoR]T*Dt.nffD$A*7k0fu>SE+nEtnFR1o(Hcpuob>Y<-1O7o-U]rd>^uT#A[XNO_.9fkH
+%$UbC*jOq3-^pITL$)$&6iYT)MKX%O*PKS#pAU=b).6\fM&me8+rj&)2XU9(.'P,8_"fE\8,e5I<J<.+Y=3WN\/*Al&V9_X*)LVII
+%n at XEp"\b'dS(DT%Z+VS'V+Nl)0-;29/c!77jQr5+W_qU)pt5Y<Di.,W8A*05)92Jgdn),>INa+_cu"kLneBn!P!OXFRfV."&+Z*L
+%K(&FO1A&6an at ptAa,*"sW')#iq9ua>-P&AX'R"60+PSR2-`6*iFIWDN8VWgP?'O&@/KRP_qV[NYhUc!rAqsi$/Hm-KM4 at DdC-EAt
+%GFpnF at S[cGldWQViasJ6nciri,bu$L"$s6U2U)C,b4],eGgJUg%;9XdOpg'q]mbqs'. at 5=H'>2Nk"3XA54YpKEQt at 74g/H$@W>ht
+%T[I"&dn[&lhhM_61[<-E-V<!h)$j,70_plHn%S8$=h4/)U6W!Z&/r3IWb(iR'>6#E8L^f?F_sMI=Ys,lGV2D02?)BZQFnM(+h2>q
+%fi.%1hRKiAII'5Ul^6gg;]MMCL.];#+u"-nUX?eae'Y]s(!TKq[,gq5WCJ_PfucA#BT56idld%u0$6c-A!5PLhU0L74E^#JmOci[
+%T_:$_,-Q&ZFAMZL6-@\B[En'kI+.eWpM*i_`0-TfdCr1+J]Q;rdC6Eda-:?;'/P:*Ehuf;$:I%+qB+8rM>a]%Ih=4)HoT=(\Bp*"
+%G(t$sneP+q+7+HZ0@(tAHH#_9#.Ze(5g1C_%$Y_&j7+1+NbBIM'g?Yj/VtXe=sZkpCno>rn?!$l7&H`Y[XE.Wo;o0rD!^Q5SrR<K
+%S_=);$Z#+?o7MWeHf^NaI$a0)hl5`<hinf/qiH_\&Q/,s.3m;uHk"eq3O?Kh?\1s<lTOEFD/)pa\Qu1q;AZX5Xu+)/m>I`<P$%b"
+%7]K'a"?,>`W-NHVmKD4.]_Qn,Yp%XEio9Zu.BiNPNiB'INg\7.X$/Ob1h'7<i.PsoHdR,;hkhkpn7M1;aW)>-eQ1",%-nZsc%*r8
+%%l)$e(Y=1(LMnK']\.3NrmQIWpi_dZ+QYur\E&s8T"C&U]F^Ss/`(:1)hY"=$dP[>b*9kOop-l:BUdl:AKDPdm&sZkEf at JiR7OET
+%%c at SnK=trXRR at 9umn%"J.UbU648k^J'FZOs<2.atQ<VQ"STVc2I$?]2^p56e(g#do#&>UXVF(*AL0.i\llX1*"gs9\7_V4P5>E:H
+%H%%+eL'qUZN7CTLX8DHh&m#YC\,Ip at 5HeBdIK^n1[nk?.ed2I]0>*;B[rQDD;IuJ0('G`sde!Ma>Y-8DM>TZ;m:ccF?OE)$]8pIj
+%2IXDNp#J\dUZ(Zb;&1Y)<O()BOYle&3O`7[Gk:#>?cGDj3V"eX2o)>-Rp*A5Vm#VlSn^MQ+"8Zk-b,8ZQ/X#SF%S+tBIE.\WHfc#
+%h4biqWfK:Dj7U2B:?2_%c"$%TQ`i!X,iC_q2TZ2HmUto.CbeND`t5areQ$go:c)%2-BTlI'pC_:>YLqQ8%mXE%Ht(=D-.W;:<aH3
+%rFO;?@g9".]r"\PbB$FgGRF"p*q*o_%.Q:>/dHh$Vb3urIbV4"2`NXJ^@0dQ88Wg(?rWn2pbH#6H+(IcFYtP_rdJ)KI9a\(0AiF$
+%;HXme#M)-g3Bo?hkVs=n1jNDCSd-Q3 at hm8sajYr@/`(!T;DW>qEmI<7k.TM!$k?dUrCWPaG:jM@\a2X",8W6lWb)#3af>#/k1h;5
+%n.6=d(![dk8)'&A at 6PSdRnK_Yi2`DFrn.4VVgE.aQ+,bTl'`Z;_9Mgs*%20TT]O2&/pVL7rh5fX:`],nZ&m.5n<N\dj>c(7iqN67
+%j.X?'>%cTM"P&K',5)*K3P`d`m:2V,8?>%/*Ccrl4JRR%E2I!2H\?2`:um?U$K]%niu8<'q7.K?*o6YgW>jSUBD)@JmsFKOc0?M3
+%AO/(+e=;m!C!,L;mJ<YM_Li:CA at Yr?$[EOmQGi!V4*VBI:A]UIq"l%d!;f)rC6ZZE2ST[00F$sPc4UEcgbEtNCaP#eI"/^n+E>,+
+%OQgn?Zg9,=!h5gXZ>8<+ORY at E$7o`NgJ.F$S!8'`8E3:hEgr8a;DYWGf(HbDFk:1r"Np2TaY>p*_TV*NAf+3SXMK=`m(C^Jd4rNH
+%iO_-\rPi>^%ceKM":,/Y<1XSF8Q54LEGVuNpY$']N!kZ06`:,IG'RL at VO*53$GMM,A_kH2n>'AFSs+MX,Z8GNb">nJ"Eb.dJ8P83
+%)SX?hSN*m)h]f+0RgKN=1M>)'a\<gnfR1c&]FV#Q_%,XDq)GjEnQ6S7CMC0.Ln&3s1$g;G#D$%GRlWGLZggYeerCOlQ]oY7[GsQE
+%$-u6sVkp*1JlRnQJFn*[hcu7AHR(h*q.9"Yq>66G9EJXugk0KFJp&eR'XNLrPn[X*I<cF2XZMNMG\FA<*NJhdf?"C;<%ScQ>&(j4
+%=P8fAqk8An1.[nh2Si4%>V,%DhHXpRk<Q^FRP_,9`/JWiaLKQ9:X?Yf>2`t0bUWm!%)'gSgbS983^qXm5&PZ/(81mb9tNLuM@/hH
+%$W-9FaOe<Aaj/hIGHf<;eMS;KLOdKIFW7Kr/2PDV*g[=!4#99!p74Icb=3caN.Fj6pd"5+2Z1Z_XO)L12SOepBc5fu($u8o)O#eC
+%kXT4US.;Rt28k"ZbRHbU"-;,ViaT]3Xu\h1r:!=dai#9F(.d1TVL=bWYuR&rbGPCX+jX`K9Uir\*8(5f4a*7;2P4U+2378;oOXe_
+%_ttcFZ_W-+-t<nPhPKdWRUP8m88%5FQK?gO+YCh9r*Y^;P(?@>jMSbkXU(fI\X4tXSHs_<D-a>n.RB at 0>MS5mP+]fV\?Xm@<YA>I
+%W)&&*WBHn-:>[A#4>J_oF#tRJ<5`KM"8S+Z$jor)SWR8#QWX]d<"d at VT,3O\5Pe`q"7a[#T\l!R.IC1f_lZS_6ASKg[<3C`D5Fr"
+%1LXqmDuhsP]2OW<9j*+`EX/dr(ZI!^:"s(e)1s_IUTZuQpJ%].f.Gj($73mTO'VMh=<"[s'/Y_;Q36JP:jC*fC_C[2&L_6M]jBco
+%e[77X[4>N8'TrunJhKnECDrF(rTuRse+O5'IYfZUAuE0!<fl!.SB4d:npV=<.`/J(0kp&g5"IZK'P?BBeej\=%ra7J\m:9 at 9"V(R
+%#B2E\jQ5/0*:j>sjXmfg(e96AF76Vf#/=7hW17]`"0m&"@SD-r!#^EQT$'E(1;Jjnk=.;A#9W*#@?dVH3!oVoS?tm-Hsp#PL at 1#V
+%LE)PJN_aBjF8aRNjT=Y4+-F@%;WXo-027GOe;#=L-Ah`=$97\CF":V#WjuqkJZAu/Da#G#4Z/Xqp=oSrME`?VI&ajMelR;2Aujb-
+%)p&;5--`/_cc;N\X;o+`\e]b%cPH<'VWiJ<VXPbP(+m7JA"oAs"-cYuZIHB_I4cB6 at W6'WUt"J$O!"Fh:Q3dq*j!LH<P;":OI=oB
+%E:uqL4RhHQ88S]4dfEkLqN at r;/W$W[,&tH,qhSb,':3?JKBONa=r\p8og.<S2#?i$I^gcdL8;UY/pcKF_d=;I10<:Z/:<6SDrFBS
+%>'1^'V'^cm@](P7^D\986.Zg.it&C2TCTZl>g\I.#[E^=Yg*fYce9j+=9-ZGW3=H7bDBt3$jK!3X+>^!V:$R)8g!o\mnkV,f=A`0
+%_U9e:Db>=t$8G4=\%,[]]$L?'Y"<&f\@=Z!:+FCsWo>NgB=H5+FL0`OaNM^N>UD.,D$65V"g)ViE;0luFt)5ST;dL?5e9(BF,iYI
+%S.Z"lNc2I!qm>ZPD+X6Oa?`pTVmO`s&7"4&Oa8ak3H.$06?Tfk8jD!]*^OGLS9^9spbYuO[:,.o=#Fe^W2=DoAYkVZ>hffY&6mF*
+%2 at IFQ$H)*iVcm-EV'oRq1%V0=Q%Feb!V^>8:o$O>7iO`3rI)!+q>Ps8<&\UUl);WDJ<NWqr4MI$1$EtVWW\3mN/Ot-kX#m<H>1C6
+%PU?PU::bolU:G/`\uH\C\k'4l&/,$.ftpC&bZdB7:<GT3T)hjlI=PJIk/'P@=J'WQQ/H9Ki$KQ_[!-"o030<#qrXbon!<R)Y=J^D
+%LqHF7Ic<O<Td`Deqbp[o5hnABS/Wod'PXPK4'oe(Y;R+5[rF7%V_ujaQY[QOkKp$':0j!(FJ0!E#84#^NHnR#aTicH*AE1dl7Y.1
+%rFl)Q41O[`EUkF%VU)(e5\cseD6IsG$-6?L!QC at SqpaX3>(7%s9KkK?RC%JfHL;cBcH]j,lcX8\Gr_YhYfMIL?EOQ">)\#'j-eS?
+%R*V70q2fpG\l(.("0^Kti](&i8KEA+1sM61Q@)diA&\:WfDd(fQc&PP1XjHp;YJp<[.R&!+0:^maAs`52Xr`@9>*eFmQ3EQj]&HB
+%+OIZ$g3?Fop,o*4kq<4i0*a_&A5u:eUebj#c42-Z'Ii at M4!1+#/L=1J==to at 2`hW$%J-']jHS0>2f[<)D8adpX?hj%inY50g=5Rc
+%$b9\sfhYofU5s=)Sk#0;5pUiCng<*d4#,(2Ah[]SR,2]p^io($4GqbLSh7u/'u>=IaRu=Z7n^O)-`$suPHqTtcRJdMIU\"l6GcaH
+%,P$A66_?+KL+WbX[h$)rS*Mi]?U$4Ti(ZVFHCfXbGp<5FB'VX(M3;gbO9S"h0c'sEC4kQTV(?^qAn?Y`T%)6"ddOR(BG4,_/qpHI
+%o%k_t#PoeO0B?!PA[%:r<>9-1Ub6I^.SrcN_d6cs"o>[$([c&=hYVlNM$IgJO($bskON$<WN+<K>6k2\PS:fQWgi81qoXjY!j=g%
+%(J*cPVihsPJs3bY=ncVoA:94-a'7r%'YoA[!fNkXmiVbf2eid7;@K'%HeI#o!Db1=m2&<U at SMJ&WI?<75,fXnjtoV)oF%-k/O'hk
+%#]V+e0FrnaH_k/V?u9u>_UhJK%eMg/PE#dVOc"M8(VOh]II,)2_/AS>A9u at g0"H8B,U-!s2KG]!O?L9-2_<R>[m:S5AXX:,VEsr3
+%8A5`W"!6Usdn]k?JJs=hS8:Cs56G2(I9 at q'k=nOf9$Kk'H2h)/H9LpOYDp]\7iaD%-:d'*T=D-c$p"j?n'k[+R^(73ZipAEM4oQK
+%f2dNA/Os!2]pMT_'O-(aGb>ZZ0DDicGq>((GjR)]TAqA;^AIl"/4i`u">])nEQAG;jV2Cc,L:J:D%,i1J0MWq#QXEW27Brm;lZ%R
+%deZE?^CL73VU(0Sek4o'g9,VKR<^.!,pF!.%gpO)@qRj"PD>"9L"MrR3;F)S0<+oAA2p;FLR#:^_c%UkEk<2_-IF'C:'\`i(Hi"M
+%ab.,N)VrKd#PG_kFu at gikBY7/GADE%rGlPo+>dZm0V>WugTZ%KS+ngs;nVptoG6)r2[VP]f'\+`p:ZFDDbd2*#b=J0kE<Po)XTCa
+%1U/c>T7sTL4j>aHN at g6OqcpAjU8(!`ML,,1WUZdF`BZ,=-?r,&M>We;Z at Q)Wr=AGCDSrW<OpAr_E+:Y9AT/RkJqL%#EMYo,R*&8t
+%/d[2 at DOAY8!`\LN)aEs/,eat3q>mKDOenVFeADE/TqP,o,P>-_2'_LriN-LX#1r2m-%\l`)_b8eB"_5gWaB5B\d at IRJW)MIWFlf^
+%RHN\>-Dj<SAte96Qin'LD`b?M.W"cDCc]eNhIk]dO!HJLQ79i/`e%uq/=+&5)jd@/(7?i"%`'..-?RDk4RJ&4Xbju3%s](:\*(g&
+%G[F28l at iHc-9H2"@Ufk%)g/t&]q&ZaN$G0]%Xt!\cEMfR7/6\`P.,D.Umi+=Qr9[S7Po->"F$@52\DQO$ab>(?&&TtI at A[PH*Xag
+%hGa$2I+?Zqa$KV[-'6,e8\<MHf$mVU-P.NSPf+hiK:8FC(+eZSb9`et$Hm-nZt$DL->_WHP6P=_T\1f5^Oq8JWoIl+(4H^Og/N/$
+%brN:a-8r0[lB*2LKDR(tRu]upfm2??9grkVAjXbX8#SspIKMFI at P+'T^dU+F^Fc\JR)Bqdqf>p&+n1A5^Q"[c;3*M%A20/"dJ4%+
+%"j.#&CZeEmZ?*\4G14!,cjqM^H`,[sZ]YoJH>U"KK?\f+Ep),)A%#N=KU2QZ2#^_KNn7>OMM1&tE]o9P*:t6aIrC64_[nLnW?qX2
+%O-M57;q$-tdSh37PoNDgBhA-)%`F,"J;-s[lPGA*&L[uo31<:U8sXUKPG;7g+PUW=OOQTs/.KJ:_-Z6OL,e\l.0V$3mXr_%(NAfB
+%VZD+uW-+b4=NS4S6f-]7<sa=9%G5tJ`Fi1-p"Q;He*c,`"`b6d\Q+`X7QkRjG!`4NJ)te'?Sq'p0a>DTB(GY!KJ1gJQ-)ir]!B_L
+%J:+M%46I]$.o-K+S/jnbHjmi!hpJHUIjHE7a*J4%Q]"F?j2S<qU1[F'n&-+MXlL.'KWi`o,)iZm5X/Hm9pMU/R`BbY3P'L];u)2_
+%o[Bh?4^hmI\S#9R'#EC%mls+&WEaP5X[]Ba;I5R/ZDjM at HYtnr0AZZi`L6]^nM%HKa$]`-F0)KYj=TYgk2A&9/<+kuLAm.Hogc%P
+%J"G4W;j(8Q>>?6I)#[Z9Fkf)Q'D#',8)V][Bep(cjGCJ[S-^#6qCB,U9(`$&o\'h?D>+_s$c:5<H0Rh^/mfnBOZr1n<?<SR?Grqm
+%#Ccs^`-/Hf96`f,hd7!Dq`/5R&f8O&r>F1c\P<h'hC7^T\-nEDR)V<HGLEfm"k!3MG()-El2pt9Msm&gI-S9#CFY;HRih#eY.I^X
+%koRaM_++B?&+W+$!OmfI]AP`P%eK,[r!dug$9fU$Y,5e$?'ckZR4(-PIECNb/FTLu$N#W$d>!rkS0.S]A#D*T6S>i>pXpUqOb/6A
+%ejgtZk!e!21i02s][da2O98CP=<GN(9)+uu/2X3CF&:K3NChrjnd(,V3`,[YPjMB1Uqlf?eL$Lf\p&>\q#U)+=Q"Lg"&fcu>UpIh
+%F-L_]Q>(kB[cP,!=#!+CqS<TfM>0"$fT`_?I7k8&q;i%K-'MaeKLrF`0BT[T&&jYn[.X;B&7XuQ4>"4"QGWUhl)CJWn$8[#CL7>d
+%*-;3LBO2Bucdd'hNAcAmn at X0SH>c3'H9j4/3EaWb5C)5@"<-i,8AImlZ]f]s4O31Z;?W[o9!H:?b,ROKnc6YJ5j7;RMc?NMng&]u
+%A+K^bXCX4`;[C at 3S^=1,WLK3:@i4.c8GODh]"t/B;S].;8NN62U\@5751-)D0;iukX[PV]9q?@P0al)C\YX"f(,i?a1dE.20HQIc
+%L@]9Ci^R'[1$-.6cn%#=*\/*D1/H?^`G-^4hl4b\8fC-KS[IM4=A8.IWn6>!,:1e.nD23Oa\crC8o#W9D+*+l`MZ=W9a/$!;D5u3
+%P^1;j-XRK?=`!9*(XPt']mMcJ3</1=$YH0LS;2;`UVA&l6_B at 5=f([g8L0f1gqe2GY/G(_>;/>Ih&`D<`Mqjn*orm7V4,si!^Rj^
+%qT"A7k[!+4q:.J at 45t9rRh=;`;A1jcWF^C0lLC_Qc'un+ICks^kc1Au2pV.n>WfP;PSDD$nH^M(\&_RGYMQgQ+a+*JV1`7K7+7F:
+%?XCaQUQ_Sh=Ro[B'a!uj;:^hM^YE`2[<]cM1Mu"dGqLs2H%s8j](-kTp/R+#L^G9 at U>X[nqZ?Rs0=/pSOZZMq-b<Fn*Uer(\_SQ%
+%D;4o.O_R/ce:O'gRk%gt:68p6Ck:JQ&CJ%Q4n&#p4\AUBcc_E(Xi'<,Us*2IPVo?!N*`Buf_b)?juNGGU;Pt.4c"_ZhcS&4%[qNf
+%r`6$^rbLnjipY+BTtQVhZm7iBi1UVNI;+)EDTBC(((g'DP[:nXa^QbP2%rYhn`HK\1TCY6>'N\?6Q[^rKcBX*;MH18Vb<278C+qF
+%%NMOa]Y4CtM%RCWcXf^&$F?OL;k3;<Gtu$]Wf_r_o'$eUCJa,0SYQD(XnZX@,o#0uB[2#=%M%c\5B7d\dZ)4h^ejUYLKIna at e#aS
+%bsZ\jb=Xbd%H9F9gBE!F2Un"[GmY7H:jAuTg`Z&#_4<RUV%Cs7chG;cHq=_@"6F4A<5 at EUVP;8E\QLqH_%jC&?YYc"^GRcB\:b2!
+%>s</Y"7S(<931)b9K>"BhO;KQ5>TY9/uWEYlD,nJW'mPMCOmOBNZi31A,DCZZYaq6QVr=Zo-7Nge`O2uC$:7%_r6S1cC.r&Q+7M5
+%KD5OX&g^I`Cq#\[5qe+U2ZnkY#tQlH?$JlaTj^h0ipP=#8"U6RAPd_&4Al=ca.3OD[osJ'+U-^o$/W+IXbDJ+Gu at 03hOW<6UU9-K
+%-QBp`F&t"rj;@jo;`%7?C8C>=gfPGjh+9%e[5mIrQ./`^M'HM*hTPPNhlkcS,Ch%(l<r)'iqphZJ(U)5+=>l;b1?lXk4l#]%@Bd?
+%6-C%^H^3d+;TIiEiK[3Lih292(ROX\@uPg`#UM_p6aQ'-&SfPU&"%\V6oIN2kLC!=oB-E0Q-[fC'IuH&5g%<%MWp%VGDlOk,_ghl
+%.NUN<-i[0u<s:bqJflsdM'#7IB8X13jnIP3.\#MCkq8:._$n.t9ks&<d`1B'V/kTDA7rtA;I2*D][#d4DG43X\kah`.88p1!$rn<
+%FB[NM!"oCEb?]VcR3+_MAA:]BYl2,),fTmi9gWc?VFf@@,ch(d;>g%-Dt!*_"Qd+0D[)h7[kHi]U/3P0imVqfRP]!Hr!*Z0a_3"N
+%0mM_mW<+#^EW_bZ76ejS(Z.2Wfp<73B"jQ1!Qqs_#o6ktqIO`V;@#4Y(NROpS7c4?nVU(go;pCoeF[1U#%B\cI=7OM(3Yc)eB9c6
+%bKif;-S_eD)G#kla$N\iB>N[nN!m],kF3EHV>AEleTlHF6%q['aTs8$,6<2(Ga]sKgc="HmY&GumAXRV?"-M^kTu-qTrU;jGqR)n
+%qED8Ocb09ImGYn4^N[[N6mgWfl'tP+^MFhFSm[h'XeK/#;OT4h;(mVh*hdi[eg14&*.ZQT7EI"D>)S2`_6-'ERnEH[W5GNd[0#cq
+%D`S7,=(bk++/?ee*RFDY#[&O9/bi%)Yot.u-=':GK(@(&LP^j:+TVGF*cIWs$MF=W at r)IIA6&mtfC/Vd*=!n*'H?iSWGIaag"iN5
+%\2Yhrh%JH#:[fNf"[_$uSaT^`O6O0+g!@8lfl)5uqdhpXkp1kYkSncME7KPh`m8fjipnlAr;sdfD:f8.`RLu+m$!MEW"=3ek0AJF
+%PVW>bElLudP8sGKGZN8`cF8qaG-06OCq:UZV]7/Hd"5<iV$&R83sm?*:s0Ta-GPK'(\u(9J46aY1GgfJ\G.!r4np;a85 at X&A3 at 4T
+%;OH+hZ?:-F!Tmc3$p'Ndm!>@RDoq at W'.J]V1b"DZlG=P>:mb=ER(utE8f;g#V at aI%B74AdCaNKAWW1A(i*WVHJK)0`aj9a4.D?IS
+%5 at XQc.f:G$Ro1_"*>!>[VpPK.e-C36hZc`)XZ<>VrouiDm+CP<Uf:\'%tf2pZX1SrfJT@[.k1t#[3COjT?:tCB#P6>-MBU"SC0ma
+%g#d(1-N-',^9nm[n^1&\b`,6:oR1eg8E\-3&9XT2aVk#ec*arioHWQ!Seds;P09Ds0I<R(/OcHq6F%PMW82")kQbK`E_]2a'qHbc
+%QilW*-]@Im>)E@"\)t$c8]e``<gA)<T+\T>e^eK%AgLi)n[V?t5AWD>NT6\,D,69.&4?O92$HL^j^gWtIPj&.Y;jYW(p>[mZbr4n
+%Xsn&F1!U_N0*TqI9'iV^5#Y+(Jo3dG$92p=kH_(JZdJh^Jpb&D`kLN"0o:HcWZDuireJ%*;9YDs'd)[$rj^Q8Qb@%XESIs`IsMRZ
+%ljn0-<.)eE8I2-[.^c#tV*X*6n<Ge5E4_;*"#mC"lPJg?.XQd&paD(H)s)9`USP>[K:5S at EX3V05#mk2""#m9XmeCN,ZYA.pkN'*
+%j2W$.8 at VdJmOH[r-hpD*@erqO/ebi at UKfDT2DEi5#;/D:`K#A5qm=g$EFC^_OW!j,hYCf at 1^0fDE.@=l-2R,"`h_Hu4oTcjPpO'`
+%06>mt\>^EtrZ%l0dUa>hhfo(`@>GZf&VMgD"*OH2efPSb=L63CiS:QVIT,A(5\o7m at cd-M.H.]Kd:Dfj;i2,*8c=&"]B7!8SLfu^
+%gN6#N2\pK&G=f58;Z(LfoZ.^#2-j:(M'Zj2T&#H)8>Zq[>Hn1CBlF6Q-N58\9J>bHkr'PMF-G.'qusYLWs'1[)$!5.6=m\0-24HD
+%^%qrFio<c_LTSI%R_dRrlUqCXhl0$_O<t=;qlJ<M,W;,\\Qm0#335Q(Ij5(c>PA<s90el!%(#YGqGGp)#CZ/Oo at 4@`NgA<P54dh`
+%^a18f at r-'i`K$P%h5HS'&W3-(KRQ_b@;WC2!frpjrA5DGb_t3RL.2e at n/I5/q$E;o=l[]9d]FO2AM2M0_T'``Jq.d^\;MHtQYOnX
+%K*?h<#.4kuMd/ZqN%a?3m at -N#r7ai9/e<aT_,Piq"916U%"(X4djJ]j<SGBF;iBp3XNGYkZt<tM;<1pM(_:GE'_%&3Q@$&:VP<n<
+%&r:COmPoQ7K.t&_meq5)lrL3?72)m->Dg/RZC"g4j*,5/;j7rL9=a2W?WZ6'DO0Z>YOtTn at bcFp^01pj'kc\U at -u:71.a>LRt9Mg
+%?;nSrQFn#G&n\p.En8M>C:`L8X!7]cZDNZ!Db8Zuos1ff98(%kYl"DO7'f#/aP\uFT?[=gOM2\5F/V&mDVm3l8p\NZ8:]f]STeBF
+%ZdRobD4=]]gbXTOra\c%3WHJ_\e`)4+3D5P--`i:W2Y]_#gF\lB(]2&#NYFs:Y3HZP'p*KKpEt)L@"^SB4>pTL(>QbS!di&i$RR<
+%lcKs:Y^`O)]\^-H=\:jISuGFZq!5FE=ERp`Y]E>PmlC$>/V?bgmGu9P>u]@pHYB+e!D4("G-4e?E@$s^YB-eO:?/:0IaNBmSZ0kX
+%i\\^#qY0ka"D981)Wo#a\t2[si)F=1AN?[<erJ\<3KKR,V8uq53j5'eNTJ\sk[QV/)`O-9<D2g.C&4$+Ms8VV1a^8j0KitY,Ia-p
+%;b*0<,fZ'o-)#Zi;Ui@^`_Bp0a9SIVP6UBLK-/.A^52k`E9G[_5Xr%uY_s62$c4i#`Dfm_c!]'_7fobfT2$Ts]fDl>&(J'_o4ApS
+%GSKMoc9U1gZ@)><p*ZPD8Pt&mbP0[,B,F\q*@rR@]R9\da+IRjPlOcJH^-TClb&$EAX;9.PEVA[+Z\N,)_*r<W.KPB&Z7!RpQ8i(
+%G\S<M_dNn:>h(9pnS>\45Wd8)n2q^6%\g#a)gjBPV(#'$:2%6c2^M9t=IH#dAl+\t\s)/m</8Kj><tC6e3o(UF-\hF8##$i:C(`2
+%I94':XsQ0if5sMfW^26N<T;strPYm"q"@*Fd`'-!2?6">B+.tkd.4qAZI.TGPilu1SbU at ZI\U0cFHK()s"$Su$l7KBi-YcqZ3rXl
+%_'Un^e$P2d3?PjIeA:N4p\hl4aor;FHFjVco4:$Xm4l1Hn&?8'2rOdKISa7!Y$90'13"h\SqpO0Ef)tqs5]-/^1Ne@:!2O7p#]O$
+%FG:fGSJb$lGt]?t+BPR/N[grUnBHO:]XS2$h->-pI8gg#k6[G5a4JdlmBp1<IgXmiWNRA&UFl-M at UKpiK.BV;Q`2R/GFlDCAY>,I
+%&4H$]1 at P7_/qOu8g[E"ikJD2_!MtRW+S4a!-"jqDpZH1=K\BoDSDGSIS$P0[p+#+hB[o at sU??sL5/27jK'nNo]J,*K6<W&B_TL2"
+%4K$=.mI'<b8$c8a<J<e=q_3-_PMUrec(U6V;$qBp=/2#0RX+PAk5)F-OU>^*dh]=)Ya+ArS$KDi0N:H'7'Ni?=KK#9!D[LbD=k_G
+%*<dRp/>jn89g/g(8/(_L at Ir?)@r+`%eG"U$D5"4U]sn(G!=U==](S0H4#<ouSM9YDkX'&WbD#c#3_sV4*@,UkVkQ1Ab;p^pTMQiJ
+%WB=tFq@;)Epl,)n1:6SV5pa,+R+0h0X,FRdooT#krFj^:;_0nn;':-_Lb&kOFQW3BGY.8BP&+Q.,uH=pj/)C:5His.IqCBO0]nhM
+%8q?j<4aAkQO2PX[cHJ>_Y4?2JK,!]ujt!$>Ln)dS.:emt?TJ/K8(=,t*S[PV;SoX*_-0l+c<\1 at J9JZi'>AD=%7)m$*nJoOWJ4pC
+%-Q)Br3R#7UPAD2AVpV"p_ at 6ej*2s&"]:UDu(P7o$ic?ArRaH5H:kqWD5TKZ#3A<TW1^8bffs;1^L8.[*\)Zf308BhTe]>7a+#/jp
+%P&I0iGMW at P$"V,V_)$_+hGch447?g6:o-dP<2q#&>l.hC5pWKY))4[gkO).q9bP^-9L_aJ>g;AnjH at RcHEZYZpO:+R0^COXbtgFV
+%;^R7JUQ93VT]9\"C<O::c5uaLUGo`>&p#E0SSG9a8*[D0d?Vk"/lh/jGpF%Zo!"&@goJG\?`0=%R1!"ZTHb#O'*9ZKT#=?9B+Vhm
+%m4p"(dB9)?T^,715%en/B)P98fT^ccNWcH8KgSj8@?B/NFk:D%'u?R at _'9Dh)[6]=G9UU?.M>PH9F=/ZA(K\K%.X]]NuoY<'Tr]\
+%EggO?Gl]nJT7[f?ISF-D!eplaI3b>>fjqh*ZI,77c&2_7\-7j)e*gZM2tB7spk$D*V7/8-V-95okdt,s[1LNfID7t3M2!&DS=U>f
+%fqt)\R=tF1;&/q-SX9fb;.PIs::UY at X;IIgn!)=j8D^KC0+=>=cJk]`XiW[Us,c(9#oV-D:iLG;oYNcp+XX at KdRc&LP.mBjL$!aM
+%fTTR'>ea_JmYtK]Y+X0Z/u67$aJa1+0Y%&5;t/p"YY3<k3chd+Kd*noc-+!qg"Hm?=02uX*,4gJCs(_2,;P7\Mk6F]S,8L%aYa"=
+%)eHn#,9VETDB5-=?6Q-(d7a_k1"T*?K7Yrg51t%4hkmCD_oDQ4?@EgSR'#l)H!%<,PC@@)m/^Hi`ucr4'VEGsf.^!,@]u#`Q?n9,
+%;4C!OBlg:63SJoWV-`2A;(CnOroB2ANVD,r8LFDuCS9RPs"R0q.hF4t"*cLXcZNOrA/]lsA^Y2FhV[R9`SW$251j_u=j2Ll3)+3L
+%B_=2)FRFZXpr]qe3Qj4b15Ec/aF]I=.p&q&2SN=WMoRes\%YE8eunC39;gkB at Y!PoYU%/e2kN*CHi2]tlW%oK_ZOIb1T&C<KD\`[
+%[daaJX0=%Mo<XYI at Or>NRhr=,)3#nodVqb%NugS?-I:\afr"u6#<4)h6+89SXs85"'rp>`,r]o)5c0d+f[M02o$7!@ErPYgnlE+R
+%!]</pIUlst,kC,YEr\Zrj?o"76gujYT/Lr<&!A9(k_Y-lf?qE4%F.O9Of3-mD.k8k-&2!]aV2!M7HM&W\tpd]gqI.^$W7R9S"(`7
+%8<gPX*UM7m7lK/cSpaar*MUr(K<FK(fO;&5Q at l1n&m.'D1D,k&=^d*&S/L<W=fS=p[nR*X-:^j)2G at QQ,nF($qaF=TWkY.26=]t(
+%3aJAPkJDsj)T9CfbB_)))k^o;j>K1LJG+H)IL=].n)1pB+sqlDZhUuF^&!FVA.,*XHd]sB'gDIH\b(`c*qu=E30pEo%s"?;57k!,
+%,<o<)Sn(9=)=Wr9Q-8Xp0jR<m[(Va"4BI5D_I\d9^f>\JiNr*cF6H?'OOGkN4kIMk0b89JWr(JM4 at CqR0jO3e>Ub at R+U5B\M@(&8
+%IhM(i]>VE:E at R='U'9`EHkJaV$#$:s$&n#Ts+h2[EL[qRgIAYE(((`^Gf<lufN"Lg_\E:Fion(N([$cT/?@jc3Z2BsllhGg&bSM!
+%HDXBf:;W+qbH3-hfA*Qr_=j3<P^LmGp=W9c(CXJQ\#+?I'Eu\!)<`CaR@'N^\1c=3.^7Tj@'O<#Y.;iH&:`T`j at J?t&W<OY6DI+Q
+%Z)0[NU2%g%8/h+cHID!fUL`=W;sZm#@kK]#Pb@?5%RpAFJ7l#ji!`nRLILfE'V&F*)FuTJJ"=WJr7FdP]N6aSAK/=ZbI[Pa[QgC*
+%I/,;VJQ<$SjHDmRQ#k\W4RoA,DZs!S)ihp-\0S;tCcCi661N1n8]@.]TCQDHCScJKk2N/;B`(XS1P(ApF^loXD.QQbmF!>`KCs]`
+%Ze199lpm1=aaNIT$TD0K+;7-G;HI[Hao&P]HK5]&D`&7^[826;_FZg2P,=OGo1u`2oagY-(`t,6VIhE5Gun[OfQP-`M98XpL"K9`
+%+)cE2BM_!!F+@/e>&H=TULUt4H)V2'.D*)c9nhW4UgS\\Up<Vs&`hgOZZC!NM/;Re:#VKt7/tf'E2o&=\M$PR=Vj,s^Z;ab'uLpI
+%:hH^[9%84Q*.IP?hp.oLV;S5]Oar3cT8GZ0B"c`qM69j5,`N\gs5[#[8Z#IVP2-:FYY\nV;,cYT'9MftV4%+<=_*,1%VDI(_tYq]
+%%P`6AZ'm$QaIa#`=a&nkO>rWZDbr-7p(eq27<usi:<6*0nHm99"u'V[UmIEj7 at tbJ!S`t[F)AViEijD-_1s;^J]_tpm+q1c!s^+K
+%jS)07kCo"M+!>"l^a9!d?B64$U3NZ!/)c`J#3(ZUg_.jE at YbBpJQt*65-3*le]Z[:c/^Ws1mga1"M1_0mNQ#1VeVrF&H"KC6E&!Z
+%=KZ2eo:&&a9J5LWj[o45WG&mkNFM-tAKE8Q]f^]Qbj,uBdpo(6[<eETMb_^)("kWd/g2s[1LS<[g+p?$P/l^TJ<sh$8^R!APX-mN
+%k_,#=nkFYA;k:D3l#oh^BL]Z4emCUM5UR3\U'P,Lm9%OlFWr^Kp,l2jlpK?B=T!eH;^L.=9tnd%7A3g`VFf^:k3X3lck7aI33K'p
+%HWoAkpfKg?!@54"_3B,SmUgbi.cuiXHB$XUFOQStYFg'F*P6QU#F;VD6m47p^XrfJ2Fh7DnjlSQ;H7:)I!aQ,N0NUEG/(QnV3kAI
+%!5Pg<rJ*5O+u at 3$oo0VTDWC.VR#6DPOk;iV15p at JJ/p\[q+gal:4\&g@%mh*ikpX2[ID!3eO$FIZ+b(*?jb?*!_g/l%g=Qs at a(/h
+%b/Cs[e2I1ZaT9uX\q^%:IQ%GQOZ7K&>3*R)OQF7^FC3`YHuPq9dl(*adBrnkmqZ<%%H:5Jme!m):P<AK'2S?!P at n6JZ>!a<H..('
+%8HIX:qF045miuBO>IIb^R3"+S)`U;#rd+ri#hlAmH"uDb4:%B'2YgsOO?IuQ,ng/qB,!nmUhH^[;AsaYQ&h8Dn3i at B53EB\SNd1;
+%c_'Y,h$T\J>ecjae5!%mO*)jKFP(C6qBYZXRbM$BG\n74?$.BAS,AoUS94BXE84Qo,SG at L4/W at 1*C<'=K[tgAKU6:;i:oL*dBej\
+%!Tk22[@L$sfgQ0E,Ss==ldFM&CE'_m^jP[r>\P?u!FVlS#l5da=K,rOCJ5OHG'/>AnY[ZIS8-uk:l,,],ZG6)"P);,PC[N[Vt?97
+%(7]hhHEJ;`>B"h*g[J`<W?BUHbroQAX7^ZRJ=p-14B]kWQcjR[+L15(,,;$T at O-=be!Z:Vo4 at onn(AAN3jho,E1JP;4K*^u.*r^@
+%071#c>.G#,F_8LT&_7r4QaAVeHT#-2b^j9.>gglkn1)J]C05//d1\_HH:s[tZ-0j"X/&OBIkr+G;j=*hU21[[4>VUmLp?Gea:mnJ
+%/L0WVI)r2FSqG,dn^Rtsh.CbZS+'AG5W&O*m%Y](I/3u_*;c_@]N?ULY!'<>#PA;=h4-h6G4Trth#\)QZb8J[X;9("9d3NE/"ah3
+%29"U.UqNV#9.`EY7\,,3RVL`\I>DQA>f77bIkV2BjWNr3\M4/s<M%BkO)@$M]NM4)Qp0FO]Kk&=WEq1HT!XYV_S.tp9%q's)3K';
+%C!AC`@rEhXWt"5T\a3RlMN[&",Z[+r4_]l'IKFtF&g=ekdM2u7l!,foYP20;oHlca82q#VNOn8a5(UKS/Y.$%5;dUi)kni0F>-aW
+%5M[(?+fT<:43_pH9d?3m^bRc1U>X"Wj]@U4IN1#Je(K6d6ukVHa-VQajYpA1;JA"V]O8n*"t"d/?RYPYD;^JLe)5OJZCp4e,8VGc
+%kXS2$!7h2[%rN>`+,- at sMkDkBcK1iSQnUgE1H.HG,A@]NH4]L/VnnY,-s0YD';bh%ac?FS++:*R\g=>89<Dq,jhm-$6"`(fo:,,H
+%g6.BrV>./$RbqW?FCLU8]uOQDg>]h0X.HtYrcq26^&8=naDEmh]q%R<e,ak%Sc2c%*_m38]R(c4SR);[Y"9XDgpA,D at 8l>@hlarr
+%W$q53mC<m]BUf0][B^/d2i7Vn0^TVoNb\^^]kU'PQK?FU2\oili@:1DH8WG*+3bQ4FURK:^Yne#J"1<kot4+(0+5Q%A][GrhY0D-
+%g:@iL&;K>nUnY6LlY%^T),)CQi'ZB,4:TV at r3Wo)A$JtfR*nS-@>>/6?3hHS7g]39#JMWq at PL0dD6Ji+l^Sp1=tWTH3TBi'ao!t?
+%o4B[0Y+2bTl/i@$du"""I%,J-PM@?KE`-#GN?OSVn6ufVd<>HiQ):[$m^(u<[,:?1hLm`N&c'e>*\&tU][6?#Z_[E0F(Eo1E=lD=
+%G)PgZMC"n^?)bI)hXAX`Cm#*&W[:UF#J&+qROHQ-)j#A,WB3!>8NF5$:ib)!_NPR5<UXZ!B^5?VDm*jRetH$to0VC/<1L\\n[g+Y
+%,Klmo]MaP2m3EEI499euWE"#0)K2cr-`ldOMiU_q5#U at EQfUt.?3s/S9Pd>04LtX&nnQsQWRW^o9 at hkibP.[_$HSh(^>-8sRJ@&^
+%HL6Qr.J)p!T18c[ID/+4WLa]0PrQ@])bJ$KC4UO?mpSqY]Z21ui?G'-iRMu5>>ML4`aF\m:A(R75V3s>Ys[ZM3o4,=\L<&KSd._.
+%m1(DPFhd;l at es:npaHX97e1c&X0l`S':'Q7S'R7-L-9u'(\&Bc#>B4F/BA82&kW2a.%D'%dApm<grop(ap[H#-;#3$.3-(R$A;K-
+%=HHPJla\(?0[h+-3bR<MI`S42+5D:nL<5'B%8F9dOk2_uCWc3BTu;?a,?7,SI\LLLQ(EoLJ+BqgL.->#7h(i8Be1puLJ=?5?VWMe
+%4Ne&I,Ditj,>Xu*gGMO#"a0/l]Eg)TcfHU$<Oi1d)`a[#[LAA at hCX3p4IE`:Q at Z!@&9ce0MfL]fg_>3Sn at 5a-q(*dnfDIN<(Z9\=
+%^nRZnKd9TS at P<sD.CBHIaZS6nkQ:8g*F;RKR;ic:knoVA5YMEH^uS7Fm]TY]RHF/kO]09$7/-'<n\r^`9jP.3do,/Zk$A<neEafG
+%b?S*nouhX;=F:><^/c1%#*FDe3R#;\-YZHGaLq3Z+>)h"(2)7@;ENOkFIFK)GOeVs2`'fSBZU6id+DD29>W8VB!q9GEk\9#T#@8=
+%P-X`fZE/X,VFg?#,%4kNNn6oQkm;1##P+$T>Qb3L?/o?`UU=8<8+Xkm^qo`Vo!nFX$+R5G*)"D#bR)J$'[r14X9V-c?*LeMaNg0Y
+%k"kPOP%RoB(HS$Y9&=L5YT[eNaET%@0oA]^/\EEfD$c0Z1BD!llV^8r"DfG9k;1L=@I_:.2u+f!!C&D#C-@,3AfKh+=4<*nLd^d&
+%52Q.;,Udho/43?rOlg-VQ-e/*h$_sI91m#-Q=B)O5Ag<h3?STC.4:>K`?\AG23k"jHg]B at Ml`;5[SR%4=!YFS_>WMh93953r.A(:
+%H4/T]7WgM at a'+GgO"n?Ks'1, at s0Bb.3<OpqK;\Eeg at +<oUm<Nf!';[cm?7]D4WJ4\0M1+*XrHZhJX#6X#@06uQ_%A`RSJ;!2-F^C
+%@<1R8$hc/c(+qRaA42jHNr5IFa//sWW:RnIGKsOQ5Yf.WV6;gXG>]E4:JTnZ=CT&, at 5"&[NA.XMECHb](#+;j$$0s3B&Q1j4h5 at e
+%ZqZ%^C[p?i-5nGH&Q?0!LC>^'I+`5>c at M]/nBWCE2HcM at -1gmX=K.Jhh\p)!TO*+<@p`D8n@]HZY^[0=cj<`EhmQq-RREk<RhM#9
+%qO1'/:C>r;#;L^0KBP>@O`+T?A)tSqSD at k^k!`d[91tg@%5[@?<l&f4OB]`2&Lo.%p\!d!IKd6`.UKN'cqK-id3%+B]KM,=j=0Dk
+%:p\o.16_JaHK at f^f``?dY:'B=m1KTG7@?3E*4*#mcM at ER]l<l-XLDm`5@=E\`gn!rHOCOs?^T"o^J>D;U.`08j5"bLe-Wm?.7QQ4
+%I8[aU9.H;q)n+O.Rc32q0$--ZXkF8K+d0%>N4GS&/BKL*`:j'&s.Fr3B6"0IC;l:24LSBJ3/ArrOC(Ak96<s5JI9G6FQMVh`l\fc
+%QqlmmV'%D=C!C"0DK<"*o)iarm at D_;I";_[fU?dm0VYS$_gqbLrB@;iWYt#g^X'`//[qQ?07f(9=NpOdIH=Y*ka5pu>YUl_r>Mhj
+%8Q_#G[3nTnnD?b_F,%2f+&/OUWL\VanX=p9NW:/WlT at e;=H(7dHk_[*Re<)nYMA5iWuFoh\.jq_OXg:k]2 at 1ZD@tNk5N;!JdeGB^
+%bJl5=0^$R%i7s]*jb%dBJQTk9!f`nd,AfV:/pUO;rnfLZ,S0ps;=@NRKGBWG\c)IYF^a>si'*Lo3iESO3 at p$Yk[DMYdSWV_:LQ-D
+%>BtE>ON]D,-)7'BQED+\baPHp@=-*C.Y4(W(NJ<iqLe2hp755^%aI,E),c'/Rln6AAS6n.:G[cVYIp%hb_2)XYsOt&GH^)&roM1&
+%(L^gETQZOC`e,cBd=E?4`G<9K/QDt/V at k_Dq""4D7j/7]2>OrXJ!?n5A$n_6a5[*l0THXSkJG\d]/.WNou,Da_ULf,^Q6bs:=#e%
+%Pfm-&p/e\J`2E&e;5NZ&b-HFRG"Q6ZYk5J4&G3lbc$JWk$IsIY[c]D"A%ftZ;WYOC1P.&<6EW)cV?=UR-VlIVSCD+cb+lYeS0U5g
+%m$f52FuQ7qE]$`fE0)1&\H`]lI/"Bq.<nGE]f[aCk+[a9DH]6\B$2KmOWsX;qt-VGH#hmBXT#F,S!A0RYsHui'6lEk*Jp2Q%Te72
+%rgSfTV<-Wc337dc[1a^<WeX;`aW73i;(fe9>][?%rQioE7tu^J*5=VkQ!ej]B.<3,P4D8G^jJ9Rb5kA0Agg%WN\SeImE_-iQ=S>B
+%QXl\KReJZ"rAhmJITe3<eh9p&^7HMmW%`36nG#X?L>#[&L/Hfq7KZ:]9&Pi.<jP;X,Fa3P.SlDo98[V<6Pk/map0'f)k^BB)XLqp
+%Dea.OpuUPnZSJj\E at l7!SaZN/:@ctUZFlZ-m)ULY?aief52Y[proPJ!P!r\^eFW#eKD]SkY`=c7"!rNQ/.J5Q,i4]Y9r\"_Bj3Ph
+%S5Udi!JZ-=;9/<q].E)+&C9_!?"Aso7g2;%O%VKf#p'5pjqo1ZhrjY-:@;+<4=?U!^$ND30jPh6;1bYRg5m#Gq['Q^$J:*t8^LV>
+%p<om4\U%+WQY+_J4 at mZ3/srP<,B'il=%pL&9G??dH_t<jPQR%2C%Mq9OU/>)INPtel_)m]FT9NW4L#\dqiNm:#qF\r'2G),SJOo+
+%N.+a'e1$@t6nG`THdJ*QqSK</b]9m4Hu#'u1]&H,qq9P@::B at D4Z"V*?*8e(qRkRPP?&$OH\9%rIrboX9>83-McM.SW.AF42L]gT
+%N[:Hi5;TK:g%=6+gZ/a:WB0WLh_<RceU`rjO+OSInB!+Q]IBK.L^-n/4OT=iP+_C+%`k#)p0c^A.(o*R at Y)H>=VP3*mn>`'(t/YT
+%T#;p=\GsuQ1_<B3%mh1OqQmejQ:6CtCB*M+;bR(YLi?o^:!MQe*6uI]CqWOR5'H*b.`-hYmZX/:?Qj'7UNF6ASd8%>fMl8:Dt8Q-
+%Hi at j9Jg1#4H,ss2'OC^\'TN5B_`.EfQ3tfrP+"[!ZD9)8Knu8l#`GolnQP>bL&E8CAGE]86a'.,(Di/1>`PCmH2_T_Fl5!d9.AH\
+%o1SY%S>\\%f(IT:-DT@$GoNguX[qS-C_j`ET0C6paTW+CEd7^o;qn.EH>#WL%n.R1qEGUlb9OpZ-WN>Z8l(@+XC+(q)Zq#\6X*0J
+%`/epnOUV5)!nI,lVOjLl:R99CA%m?@0n#p_Uuq`=KAAhgN5%"\es1!pk)I(ZA-iQf%c)<t1bIk[_n2)7.OO#YOW=8b(#B.7\XBk:
+%nOm*WZl3S-opd(R(^h<&;!BnjEHKK[Ups83h5c3G*o]as=FWUYp8p>T5+2N8;cD]JZVuE#e!=ODn(EXBEu9L?F4+FT8KuGuTs_S'
+%4Ei#RNKWAUKI!efL7qND,RS[epY`3YR7S_lRjh$VXONcIh7(%`Htm^"H#[tEHR'P5%7gM$fc2:A/so1&R2nZ?deP`1YQ]1L3s+uN
+%Uqp[cB>Z6GG^M3#8Z=h[qbjU3#r6GZjs at A!QQ9G-.N,&Lj19\G[V?F"nt,1lkA3j&K-a?@:[4mhC"7Y@*0"jf<5o70q(PhWmOAkr
+%g);ULAN8&/&RXN:WNQ.%U*@-K\-\.4%73 at oE3%Y3YY71]"2:bU`T6hX1mO(dgK*Yhp67c-;6\YCa$ZP-2q+EEs'95VJ^L at fJb:t"
+%mJ]j`_9V26O'A>t.WE:cDj'&0I16l7bBckT"Y>3`&#AbqCH)BdS;V2<X`D_I7pVS_V)]Y=b+mllgm"e%b&ZQA1o"_J_FEh?_H/a9
+%CZKN at doo^"[oI806Ua9o1X:m at Ato946Es4mQs//84;oe#R]nQ=gX:D!4Em99Zk<u_.>rG)6t)J.;fp/R+$-PWjYfS+'BtfNofnM7
+%D`@RiNes9IPAm[+0.g:h5WN0Z8Xr$^rQ(OjeB`S?&r$\m7&<pf8?LEhR==;o0YslH%0]t_CJa>>@X/Tc/Bj'04p?gMBIA at oPH'%7
+%7jnY'4ddhXPN-%cShgq;.Pr&N*fepCh#T"L,1(U2I9j5&e0<H85ZN&(A!jh'b#"isd"f"AHT3o_GBuK!QtflsT[`1DR?Nit24M.K
+%F"U<P:Fc&c0 at 9?^-KWQmgcc!XL1\jJaRkVa>upTJr&Re8Z9\MH_'8utWPET&;O-F]=nK2gKWt!`Xh!&Ch!"RsXo%4WU_77CqZPO=
+%f!#2t=s- at d^r at fc\B]V<;'$niaWJT]M0jF)mpWBVaa"Y:8#JM[5g_)"n=9UdY=X7U\J^A6Bs/:[A&[Y&_0ut)](/[<:>]pZ^,T"h
+%6=54c8&%L!G+6GHNBY@?*d]W<jt%JlP'Z)^Z?<;#`iHd(RcMYE"nBlJbYsZ- at rB)eEi3C,Q7RCG+J6(N>d),0WTA4Fn[gk0J":\_
+%>jmlK;ZHgof13hF:ZWn+qI3n:a/)ZD,"QQ at Qo:UI6g-O&nJ<X(0/Vp7+G5^1]CPp";C"b7&LXYYkg.?gJ)4kbmm9<4+C^k*dreL_
+%,V1"XQ]Il^\Iok&,/(Zo7hER@]A#b`J2Dl*]2j>86a9+ at WfejAf?*+,G+8Kg2Pi*e1C#gZ6L7IdpmJJD0+a-TgIlNsl?c\rbB_sl
+%(2X-VmU:,]CToNg0&N&uotZG1keM_uM`_)0nN=h0n)m#2]TXM`,oJTqEs\;GL0a9RG9kl#QX>'2jB,1K.I>bK5dS0"I(2-O8#A+`
+%Sq<E%9RI=jd]'.mniH3/Kj&1ERX\_!3qmK;H.=gL;T7DBc,ru35-i*t2.3=k)(77AV$3+EK>nsfjq87W$K-VYcBA$r[J=BV00`#'
+%CkpWp1j/8)S\ZeseUqM<6K9qZdE]ON'8Fp@:2nBTH*dfg-i?&T;k9WfI=J2f>ou31[hHMcO&5-0=`*pjq'gI6j9>*6qukF*XS6+\
+%Bc0H]B0go*=Jr!gs6OnKA<e6;a0`q%!t!;VQJ0WlUc`?cG+8F,-RiG1ph)oOJHRu=8KD0t,rN$PJ$9'$jKGBk>c-PBc;`(MA'ZAg
+%0GU_Y^uZslD_-ohjrc.ONtBuZOj++&mj0SC]3%^C3IN*p`chRS1H!sd3IQ14c1#C]B'\nb;UC8(quJhPI]/MG.LMI<0t"[W^4.GR
+%(uWT_OjBOcG8(s2L&[c?$Q7?gbcLAt)]b0NlIuUBH&BZh at nR/F>)@MilcGAM$/n/7cJQlN=.A9'<!1(X6#MEFGG>q32b?C5Yl10;
+%R[D\%'IUs"Q2mmgCH,^5Vi8]MSn>!fg5V%qSnApFT$N[oW(fNh at 0cR(?*KT!og$[jhCT<j26`K%A`W0^<dbMd4p+u/GuO=0;ksJD
+%Y_+hhc?&!cj0%cChJGJ%=CY`UPFJ*sbKlHF>clK$]2%=$h8l at 3&UlbK[*%2c\:V1g;LsZFbCTR/@l'#\ht5!gqlVH7CrV(>'Z at n!
+%kf]-0$rXd&L2oaGf at 9Nf%9>ZaPnmLf,XP at W<DZ;cApCQ?:.;2d!-0,UTK0,)27+ma>`'O?n..l$db(26OuanW"G%d/&f9V&=Ce1\
+%S=eHp);G[4K<XNjDYVXH=b7,2'+fTO. at f9.XZi0UH@2ajMtb_ at 6$Y!aF8M#4VfON8n=Gajg[?-*+3FFc*qL$879ZMQD/"L)=S^KY
+%4mWX at a)=Y,P2V>$Va15/+`II&YorHf\UKu^,oJKV4fcSlorh>BTIlT/=V.2h at Z&?VL^DuP`q-_tCBH06ZT$S![,P-2<UH\^RD-s2
+%QXd$-2O9ba%"p)^c9"<A5\+\e<W&qVfpmQ-_3k.A.XG9>:MOXGKOU`rCqh\n0p>Qj5m#h2*op4Y#rdm/`XZ$>pUQ\I at lAIJn]anm
+%=cSLFZB8U4n+<fY.sU at RE55<mm#pZ-k;JiK^/G451it6Oo&[d at e*9PG:,4Y$cS5SF'1sA#Js?jNVmq+lq+*O!7\VDUfpdlM at ec/]
+%&0+p%T7Zi&PA>;!.HlbOB3A/G$BVH>a5E^S!;EDFHE$(C6<`9e106W:%^3]R3c`Ghml,CK[H7D6jme6JEbZ37\_fQaf1_\Xg%cdi
+%3\E_94NC at o,T6i]j.I`i*coJcfO^iF2E4"B%<PL&UT[WYO%6?2qXBu(**i!/@_FZ,m0T?X'TM:EA;b-]9=?&H#8($7f8Pr28@*ER
+%Smj/VYi+5+5q98GfCNh%:[++M0R%G+'l;0*0Uf,;ZBKLor.5qT'o'4W8ZFhK3M5,;1_WM[_-1?++^[RmF']iZ2X02jl$]jU_>\p<
+%aTHSgISJ7(M at T<mf/$`MhuM8R3dBk5lR/hA]A1+)An+I[Og#bFSiBQi'mO;e<DYTG.0JZSjFZ->^'Vt[N"+dY22\d^l*TLWpS[[k
+%=0)N:ahW7sEq^+nj1(PI*728C-IW_;-G%FR$VfT.:*C9Yb%D3m60j at S%Ua<</^3tI+2.1D+],Z1)kSt;:TIOgPo&^YHf_)9i+k1,
+%.2^q73&on=m&.[ZH[8O%LbMZ6TlT<VnWb(pi%Q^;o`eSeJJA3'a(a6G.+`;6*@i.`Slj8Z1>$^3(`C]iT&jVN06_$+Hda<%2WqF/
+%AuXg2rGSQmXS).*VXcU>\5P1WM3Lp7_2>o3h#nT"LX-UJTKZ- at mQAE-A?9+O.>&1^(nS+aXeI+30&)#-':bM4S!S#f1%2:-34"RJ
+%&4]a6 at BnbR]q$(leHh"91X"$'C_d at 1J_>3XaS8]6.CNdtZjS':3BU4N,emjL"C&Y<Vph"XSC_-ClR(2c<oS4WmZ/.M_;OW65mt?J
+%j1nLVe[TLP+ila/lYqaMX4ie!\5dC^E^?H`M5,LKo0AAsb=B2<AB;Ud.;<]_4DEkubG-sZ=8k#V^s.!F5O*WnQP>Kp#V@\g?o(6#
+%6>p<lbdR^lSn>]7d<)P)p1J+Zh-7LhR(M#CZ%(('`JGO"']3)DaShJ?(\*9?Em'g_GZV0;0e:/k/qmbpQ'i/>q_;U(/'0AR;j"ZV
+%,qFC at 3)`o_DGXEFm_F:W]B3o'Q^jE6n-(Jse3LqQp=!PuY?Vi.aWpuVl]6b<*-N2<uC+nt*=ds-+'#PQ"GMM<8+7e1'E8gdOP0
+%WW-<Q at XL;Snc:dGl"dk at V)f)E2Wf98%aY`=?4X3P/N3mPg"FaoBE!ER>GBh5Bn^iu!FgbA(CC#qWX[SOC0$gM3r(?-/T9XjWQJ^e
+%XCq<?VZOZu[+[=V)q6F;_Q,2jr6$&$SN:JQ!_=k!XTOIQSC]_N?2B#\9]]a[H-d1Y%gs-iiNC<),khZdeDjH#+]bl98?ON*8R<'I
+%;Is[/enEPX<W#Tc]:bbacJR#]BPXon=4Sl:l,rC$Hj7rsbb"t:g$P0l@]9t+(fukJ4/rp#nSLkJSN(;NKB(IpCcAQFI$^r9\d=f!
+%JSXuG+$IaDO.=13?J0I!kC\p9\Y=f2FP]8Cm+jhRB;\rh7/5J1+/[q5lc?/WDVb28C78gHbFg+-Jjl%uoobEHMlVcef>7%Kq""):
+%)g]I6YZs$1Sl:-fg<i56.CUT;n*3c`2'M")^HU2cP!-!;B/X<6c^]-c\%OP'SUmpqRaO8hAQ^BNV;&"Y=js=uSF+2=ZV/oAVNnEg
+%grO1XUgE&=oHp02>ke at 4"61%0-Xi$/e6LT9efSsNSoDS1A1[L0#B(HkqpnJ:G#`n3iVI:-s7],XU0O&`LLifc4XZ/E5RNB!f5fqd
+%Iei1b+X!E>_!TFP91F at 3<gUr/qltONoh7k,iAc+Y==8PGFWq(Z`93`h9a'\P&ia(0_'D<2$0DBNW$s!nD'i,s9'&_%D!Pe>lZa//
+%i<+SEjVR%ZYG?fU"B.Q3dG"9:k9bosOET0M=<61fPY\ITnA^8dB[\8hGBM`/MR)`op$3C3=P$3>N-0(4\@Hc7OX97"B.SXe`n9QN
+%aM>gEJJ64Z*N/niCRVaWI0ZKO6lB&V'#VT, at 4a%P+n94)6X.M)`a75Km)(,@#GgE/dC'r]#iBO]IEt9/O>Kk9]f*jnAWK++gK\73
+%*=M9Bi(5(qoA<?n5/(>r1[.+s;?6D:l(u3AB?TJCDj$T]?\X!uo.Ict^*Q9.IjZ!,CKIAsE;!qX52U`Pl+D#j at n`,gR;X_0B_rK4
+%PAX$]VON2C.aNal>2r>g>6U#3\l^OSC:)r#&Jg`NjW:;?Z4B<MU#YKWg`KEPgB3u#'VpeQq>mo,T&,u:/k3ks%9*$d-9W(C;`UDH
+%@OP=#L6)U:*jC'.rp-!eH*9,OWQ(1[QTLTJRsdp"TP4UN:M1KUY=WDO2:n=]dsRfN.cU:Rm'jp3NI#rsE#jq':2U>1Oc?N/BP::Y
+%s(&:'FNQZ^q%lVQ4Kjn-]jg<#:q\<c$R3j"C9ZdJ;731 at Z@R$:.q_Nh*]$Gn&P6II4b%bpW_emc1jZRHkR/, at B&g]WVp^bQ at 2ek%
+%,98<NQDZ+HJ%mSMDc6o?3D?$G5-.fJ`?l4)rO'C&N^WjU+KWXb>Dh<#]hJk`0nnlWFrQ#GDTs,<M7;YQ3.*C1M!(SF>/20`',s5b
+%q!:QTbm-hfE\MM5Ju:PZ^StHKKWdch1=k4Qd2mkF='I+LkNuK^*r*,5AH!'Z'NYiiY)H[R5#'C'+EEX_PiI);o[s[T@$_c*:, at 1m
+%$+Q79CMm4'GEhdUNiD^1KeMN^;G4)L/K,gM5YNdqcIaWa#0"qSjQN!b3$g7,;H6*`]]A/2,jARjol!G%1Xb+L;#?,AN9B?aYW/Lf
+%Q9.i('PfX_QoMqY<u_BF^"UV6]ZqYq"O:>2ifCq9ekAg61bVdjT?(ZNF:u;&OaH,Qd<]iYI@)(aI<tjPC\tdkq'Ro\19eU_[eZ9a
+%\YQP!$'p>JRd6i_4He/Wj#Yc9rS20[\=lg/9e"scg]M+AT5H9B-%2YB$I!lLV:MB'hMF*i?55B-q0h at 51H`p'abOG)Agjc9:#05]
+%Fro.sK?+G2(LK^&jmd@:\L*ip[6`6N:,YPeoQ at S^P8fgCALpOEi7fYVXfV"m,,7G,^LJ$0'S5qt:3+R3ABZ'u'9AEBaN%)3PNoA"
+%b#!QM7UU3<RGcV'ql&;@aFmTj*u8cn$,/]IH/%^gOI'ufP?Fi40#Y0"B2'=R'l?V*e2Ig[CCPE4\0>$sb!^s>SCUP+hrAu.8[:SB
+%*hP]DRQHs!1>B7A[p.]mH%`9VF=9l9Y]tut*gDnefmY#/lt)TBP(?g`aXm/uHsQ2\l`UMuBSHdIQ;bp*PBPmnKk+;E9 at 6l,JadBq
+%)Vli4As!p.fBo:`Jc3a,166+VJAp"e[k:adjOGOPfRXt]p4=T2Y;a^l*4%_Ge'h!*`'bH0rT=kM-&\:<@AQ2,D4:26G*G)a!aIeo
+%A<dp4CAbJ9J_:8qBQfMB:>%RT2g9.oEu!XnC%&BfSpVEgP^h0Qq2R\C=p""U#TpIslU?_)c4")OhEk<3[)"H3'E'A]@qNG8F at bfp
+%)22F.V59BgRZcZTFmhP4%bruUS=H>%o.'=OXBnHK*n3H@>T6j[i;PVTamuVO>,$R-.BE$e;^L#7m]Ne8j]KVp-^e_q:Z&Ol<a)$Z
+%9oU^^F=#M#s8TRuA[.5tOb<-be_?c7m=msQj?ouhNM,$131X2]d3q_N*,t'4gM:@1'_B4V3DQ/8^+HK>lVATdZ$o,k-39A:ctuC)
+%,R"uAh3.h7"a`<5C[p%Th'Y,<N"`FR0UBWq,P-;'ZlL@*e$O)b^]PYLkUr#=PlLrIC=$!fA)R8KrTqMq=uZiBT#o7Uh1qH7$5T12
+%$:1lSL(4m&6 at Nb-=3XZb!A>,Rm8RESntp438BtEd/]"%<iN^NAmg\-"Vtr_&)s-BJQMd5Fre1(]INk8]0b?DW+_ at GqGO:fiVrlqJ
+%r]?npQBsnuZN>'e'HBgLrph+OlAg!:`Y7BY.pZW at 2'9RV0lP=Gl7%,O4#G*37r=;6.Woo_q<A89lS$Y)]YOp<^W@%o at _g$>gtZaT
+%97*bm4/a'n4#oF[Tr[9/KG,ofX/udOo?c?Y+8P8^M3iVS`oiEH`1%F&r*)o:XJR;)P9"2%e4e:=T.27jR=5hCep^>)P at pG"[NBVG
+%Qd]PC&s8JS^nr]c79b,HYHqmgFecnQLB^B[=r^IlGB!h(kU=2Jj`%7[?R(urCDlPeo<,RJ>_%fTrdB2`Zi^cL<lIDK8\2^(S36[@
+%2eur.(dqRZ46;M,Q]Ee+CAk%Q76N`gguY-,43>*a[!r^7m_\iLpbkA'cn9C8cF<(X"MkTMG.td[OY,\6IAtZ\SP8OunU;jK_RAAt
+%PVcMq_:j7FT09,R=gD2 at A*+eRb#BImSj9NWZ9bc%./rM8]u8WYa5tSq=nCX.Po/#Q]Wme.jJ:Qt at gb>BlG*6%P at cq,^7JBZK.DfQ
+%DNmDb&%+":oe6F at 0Xb69D:WQ+:8tJn[r1nk%#J&!AAu9PqEXI9ISXfc'GI)6-mO]5_%!FjkPYPDfSTRP'PlH>5[+%3AX59FGJh3O
+%V<=>,Rd/Qql#&2`V:N("Zoh$GEuTVNEd8H_)k,+Hri2ZR#l0OX4%kY\f5Uujn#MQ[)JhDlmXGP"UWE>D?f.m+MJtM<8<<rTh0D0=
+%q`riYV(<#&d7,)[s7^$NFIcnn_'AiA'?Zk]r/Ae*TYD*@:PtOsat0kX+ud'W]Ush5E(HqHgR,[Qe8^1,&![dAaj!\$^["iejmc64
+%oZ39`.<,a?Kgb]`;F%F_(2=bm]TVj6</+(Q(^-_A>>XK]*XmP2jKS%X.bKZmr/PMrc\?pu?nllNnHaa"/$#BeQ]n+`U%lPN4;fTQ
+%PR0.l'mulgq at fZ$60QXi54@/5ki`s5,0?:@Hk6]G'8!m]VdPt`LU_3]&83ChEO"IX)E1 at DNMpHE7H8=JH"6T?LWdM)K*-O^.&V&o
+%=N0,r$BMuDH3=S]SdHcFB<2(dG)0e9-f(]9efAlVNo.\*3G"Jhn6PXUX/`:DH>3o/2BfH,Aq7jj_.2:.Q>aU5YI%=C-=6WK[EKtG
+%mV=T at Y4]Wq._0^MH9=a5m]c4JO`-IuNHkp,c[A[>cX"kp4Y;kq`5rZ.+G4c:e)Z-1O2['9]Q`&N!)ANkV'"F,!d^=K9(YSUDkpd6
+%kM/8]QkW:%nEBg')=dQ=q`X/V_Qs^[Bt\*EX-GX`5W2K at SMHX-Uq1VT![8r=SGcO(Qq(m=5YS\/ccI%r_h6O$f9G%fobB+YZY)hR
+%q:__!=[;+BB_[QLdgaRhZf-\pGNEf1F62sTN79b\"+2$NYjVqG4<]ojNaFn_4,JC?i>*(P:=q)DPofWgUEt1k-S`FgKj_,`mVXmi
+%)F%dk3e(UCZb9YO_X\PU"Wo4j,rOMlX;Cor_06V\[hAR8/DLFY.g?Wb&ZK'me`,Gp:LD/Z,;t$]/%!3l+2cYBk#uN$B<pl91sZ\F
+%^[mR9B`*:W==/9OYqY*-*O1e.=SCh-,ju^?@r6%E>_%`O>g[2OC1t#PSi_":%aI[,;,=3U4&=e&)V>;\3]<<#?"<g:BW_[:a'5c2
+%P!FeR>TU\@P4?ptiiS>^`1&SZR\*DbZ*C8YXl2D<c&"X[qfr;jQ2/N_C!O1pNBbB?,&bA=&([SOR_i_uob()sFk4/n[*R$R&S::H
+%7?&"=,t%'&&i]^?nE0JpDQ.rN7PfDDA,Z$Sp=Y81o$62F-2'9GPAScU#u/CS[$f/#qBj/0&,a+gJ.oe9Y#on?rGeTq6up)@RKEFF
+%=g:1nK]K3\r%*#+=;33V#oTUR at 3r[Y_;ZBCFQHkYDCIa>P]Dtt$/#aAEmd.Q$L at 4B^*h1/]J(tmK:hbIE+ at A64cgla\@$+DUka?^
+%G$%dQfUbA(d&ZWTMpn+Fq)Im at 9[G:_g$^kEA[*0Qc=/+DqATF#Xhm.Wde,,-Z7g:.Ep^>`Q..A,R7UNHjNXr0]CX[9K[#MF\*XGJ
+%Y0.rVNPgU^S<NWMf\*]I-MVPKC0#W_;P3RN&+ah`,*HK3Um6nm=I=,S-a9'>SnG[sa!E6;XfGFdcS9\s*7bPeWLFI@=tas1LElsP
+%%=8uhZRO"q/EJQ[XtAH/X<8Q7l";le$7+B'l<n at hT^lG6cDk^r@$Tr?TCks-O<gtk]oKt(s$>'Y,sobtQR-nPg,1beEn(jjJ_<Oh
+%3,U2BQ"hae9d3Jn9K%.Y)P8^h=]WmS=p/&>+dEP6f=AOR<H at Q1Y]RIU,N^UUc*1089K2`;n0SWG[PGPFdP;kNngSJ#kp1e>Y<+>p
+%'S?nu,$UD;jd`MKHgSY=e%dSiG9['n]'.8F`233VWWj&nAXn*jhUC?B7o.M*=#+GU&k/mG`jD9J@'OP%Vt]2[deU171/+?)$4`WD
+%C\s<%dE$_-!W0!eOt0PC3GUsr5q\]mn/uhZI>9C[R"cSo<IrMF at 6"J^&OB&`%\3(=S#Ir]p3`M'4PQ38P-_Y:,BD/9YHZ?'`tE/H
+%i2chRje&[$T*Y"P7*]!FgsDgnjh4lGJsVYFhN*ls7`mQLlpRf5(R/r"R%X_r+UKu,oKf'*V;f/9F%,YRpQ\KR at 2)AHRaQGRIBG>b
+%]7R'ZNge!V(-59F>ON^.Zo1[9%sD.:`&!Qe"&6;M-Vc47hIVEt<Mi3EKp<t!lb6B=fPemPiPZkSTqs at LCTq3c.pt)Uhpu9EU?Uc@
+%F1EmQ'cIq$qni9*/VL!F>%A.L)_+6S[oQ*"bkc'MU:pA$Hl/*Sj,bpS)#dO4!m-Y'g4b)9[6%[Q_Rh!FetflU2IISqN-Ek9po:=a
+%BqgeRf9.1GRd0Qhen_8j"@_keO.i%[_h#(RVdp','.rmqOW*ne3#'^oCn*)$rigOejS+3&+/-ifLQK8?;gqiQc&#pT`81o\BOAsi
+%f5=Vs5D-+^Y+oip$[jojjn3N^pcC)JgZ.5Q7?'Ri)=*F\9&<.D7 at sF/]L\34SXc"qe5V<CqaS]6Ql4c`_,%hESflahKkcn8:7SjC
+%'iEZZAOX?aPM;QWV$4-#(/lVpSR2F(Jbbe at cD!t+XMgX:Lq3K*6JtquiHu8]HX?V6abP%gWIYpIX]f"X'*=mN4QDs<;/*QVmO?&l
+%k[i at f?s!s`BJd;ic-S^7imd$tg,-GL>Y=5$6#,Igd/#[VD&e").:7[EGq1p8qP&_uQuW^5[J]s0MlLhNg<L@@gUT:#m%/ii[D$oY
+%GlmeXNR!].oU,jX<?)P^.J at K?fM_0JMN>kL>Z.3C7)F3[2 at o.2cX!S?D9WMM at q-(@@pTD6&1<>_PJQj4'=ts7V);O?YFRu-b!@8f
+%&fJGZ6c1[g(c\@smDQK0gsq:TY`-EhmEs?E-Xh"4c-c9eVXh*M3qnkH^Q$Ys#*BZ1/).C+-2%3?s%*CBNAp,c'77G&Xsu3NKL at Hu
+%q<aN at P?Khpan3i0pN96iR>rn1e>1oWm0I>NHRVlY>M9 at nrH:<C#@\?SB8+&B2Lf?HXe"fsDF`I(ljr:A9cY[P^=p:?!g^.)B\fH<
+%cBa$haMA(;U"t#kZa1;p<*N>9=<O4_`/04/pc0M1_4'fS-fNq5=89YGctYmeP/sAnWaC9R2jd-%7+A8U^QQ6,2gb;rEBa6Oq>>jP
+%6]QhN%5i^d@[,P]eLS8'>_ShL!bFF2N'$OP;G>BdJ>rO?1*ID"7JqLO+o>mIC8I8:F&8`/oU0)VF?]04r...]%Qsj9jeVlllH2$G
+%(d9J1c%Fg=9#u%9q:GSuMn(`@d:1at(pOh1&`b07CU(f1`5YZ-9\f[A`tPC.bO8e'\Fg>YWbs![_Tu7Z&4fQFrnG!EjB+BE^8Z<K
+%:bH-?H/gk^[%nhs.%B$a[])]ahC9/O"4OY,[puR[k/k\="gH^fm%5PTQ!aJa3AP96Q##W1cI3u)<E*kK;q7iJE+c"GG&8TG$iD4:
+%p0,B0m9J)kIHi\-]M2:Dh`Ur*90RNTe>l0\<[BC at HsLLAT&4iuMd\$J8Pc2b4]+L6d"7I<GLNE"3'70FN=),_NTUZ1-2s:@-- at La
+%GNBn732[=t&A\XQNSImZ5HL`9K1+W,&+hl"^.BnIS!k+<M0^@32^umj][l at Sk=G<2#o at lWOn3s&1*Sul>(jCsl at f$bYE6*9F!(,+
+%:Q?33e#gDeMe/Z7++&:qX+D&5pQqVHFW^nu+qQ9:nWYaMP/2"]DOLMiMm_[pdn^FY)t0o(4;0<A1@[B&+[q>E`gu,:])KN4`jm,n
+%esN;\FNmtP2\'!m`>;(oWi7e^l6A1H\_(q:AZ$m$.H4);1PU#uU,*gj\gH*Y>JU3(&9Ubq$+Z+7 at eH0P9:_lP)ktMa8=6 at FWnA%A
+%0!phTP+$Ui];V4\1EQ8N(]Mk!F+u"(N.)*0['1nuStL$VEncRGo*`*n]hFo:JN4?JmBk/J+26CGa;\PXPSd-*MYMpg-Ap:EDrQE?
+%jDY?tQFWQ>:BgA:dhKE9c(^2WS[f+'Z=$GKjg%5m4E8((a14$VP+C<+4lgP9d8`YrBgL%^J at uKQDo\7bPZ7SD#.!RIrfXXm[nt/J
+%<,>[,kO\jJlCcRsL[M%3g?kM(8FTk*E9\Hcq1V:JIX8`:;&;N$o##=i>?QV%kM/a05:aJ"LCdJWOqc'?4O7lU-M.;`*3"R,7<%N-
+%`:MA0f9i;%J"pGJVK7p3*J7?,RsULmc)+>F\FN-%phDQH[462VWJ<G$JC).U[!`0sm&-N[F4pDrEO^&_\Rn05;Q!e,cL'J*OJhMD
+%NKF7bpFCN9_9s-&DIQB:&cl7di6.]727J,JBoYdsOB1f)8$`$"-Pfp$D^M%(p'D)U)`i]$D)\O8M:[#]1+P_)9/X1)S?CkA_S`t`
+%_,72KQch9jK'gPZ4E7T%SO^WT/R?&RW/7mmLndO<BAQ6iaZYsu3Yg'>8(i+9_e,-6lb<#lKK=;m0e^'bfa`F-*f8[7i]uC.C210W
+%rVYCV.m!oDDoK5J3!_A%(Ze$G'NpAu8ZX;rgDHYUYi2LNaeE$ZhHUk$A*oeWS"(2;2f8+C$.a(qk/T0S[BCQqDYGoC0lVmmi]U)q
+%pCNd^1b!<'7Wf%#4-TN3i`Ks3.?D<p1j*]QbAXu]9S7=r9O;OQ4T``#"+L[$pMVMjcj"gfCfq=>GB_n84KY%f3QcDM/QYbS`noZH
+%[KHTMD;-SVP=+Y5k.\'qhORH3:-%X2G4i?fJ"iqMYl2\KoFh&^(nW'5WZ@^GrCB>9Qc[OX$Ous\CmEQV2Ba7S-,E78,:c4gUX&3m
+%Ao4q!7S[CLJ'<e*>t]WMaK@'-^9=)YqKL,d?Jh0.<_e9t=ACjI(d8HZGOh;k5`,P/.bhER71Lj at T7A!NEB!k7/"%)f#ll(Ch"lUE
+%j:@H<^W@*4!)`^dc&+J.O""9oM[DQTqhs6n,[lGUkAnW^!,s\2d%-s-DKu;]*G,dI3T;kpF<R9pPWT!\T"uJ/dhK?mj`dd`iJ<4l
+%^qdsXiMga%kHT&19UI%nZR>NE5Yc<"JKObqL0octBJ-=Sgf0p4?>=qs&j+u27<<2XUdC"0"ndILHp/5\Y*k.;\e8A6S=2'86:i+F
+%%g%m($__Y#HmWA5T_RIo\WMkp-WC&-Y/r7dYSFR8iQQC=>kZj&bth!*f1g)Jgq'a(H[-?:ZMLpQS5ET[D5;?)-VkjNg]$?_rX at I3
+%aUi+d`Y`#H(HA&1fn5m))pEapiGc-g)UNuq-a!KlkbKV+[7r*q:+^6e3YBIr>!mfcX3%Ij/Fa8_:E=h0TQbDrM>^3r=nb</j\.:1
+%?>IujOABTC!cPsNAU22)b&e9H?cNk-WK.0Bk:m-o#A+u?-D6l]P;o+ZiHK:`9$kjn7bQ:D*W.Rt7rk:h79as]Y9%T/[RRO at m_+U?
+%fW\J*]Vp0'Sul$K<be'V5,V'/Qs^WQSn!=Po-a(/l'a.h0#mcic9sj,<N!#gNtYlC$52UiYH/8dWSM<*^+O*.:I0>29?hE0V&u,.
+%,W_6G:X[=n:Z;1LUH7pW0DfIC at Nj$L.uR)f\uGZA(_?M&ZTXdNAA?ukq1CIm9s-4jCACbC9(MnGF^s()X*EI-qmQ^C7Y*;XPLtaj
+%C\<S9`3;aMLP^\DbOL_a^#ttbWbR^6SU4@/?#"_N'+P]G([68,)n(UjgT6cu9u(`o-Ls)$.iT*agqt<"S9'=!$Mo1np,nPIcV.W'
+%[YAXP['K":)"=Afqj73&Ft![iAo$X26_7:HPe.`rL4Mg"q*],#.>5cEfl?A0>nV;%/\+erIhu1-TT]/iGI1c702LcJp;I"/N'R"/
+%F&CU9jf@=V1n'Y#*P!2C`Xgp/DEau'Kn[@gO)WjaWWo%u)GQU3Cq"S$3FFRslldmtF6m].10?^$UlBo(6Ikg'JXEN9M7j+Y&lOA.
+%f&K9"MTj5L-iTDOHCf\E=@o[XKW3*QJ/+?Fe"c6821j<N,k`XEM3F2i-jnK>D>PMjGM:07dW*Mp04Kntjmp]ma^!sJ:r^^b23M^*
+%-U:LeL1J_8$CeuB3gm",V,K at dpeFmnG^9hYr<\7i1.e.BPs*n\;K8ZC%boYgf9h';eJhM at rLeO/+WY?GH55THe/tQ,'E2hRYdFq]
+%XR$5q%>Q9+9/KaG\nlOJXj3X903US'LS7ad,&a2%`O5OkA5\?inlX=6NkC"A0!2ej.1KfNOu?2Z539ZjhYgl'pjjS=foMHoRNn/h
+%\$].%A`XGhPCtB?m.B<);<9F06^rCKU#iSA^, at .h9#",%%"QAc\lj)$aWQ at M7d1lfl*\D!$YF_hPQV%J3 at UlcLG^/6fR`+2i):lC
+%8hbPH-SqgVhCO?Y>@25ZF#*bOo16g1%7a>`D2(&_r6uO'_,cN;W=hku at 4G_3hcfs(dn<<i.uMH'b#*i\4ItrJ8BuPO.euQTIJ%+b
+%s'9mC[`2@&,`j="pc'94DhU(*S7fLoKGH7V,0?X)Vb2ol]DQ\WfJ59I>q%Zde!cF7+9/,p*)Mo!7\m_27L'4\$^B^t?9E#bPE:^5
+%C%a.S\#<dVK9CA/CH")M2]8p]D0k#!&Tu)_K8/&W:OsC6+q\/VTqjGWT'`jk8QReb6- at 752C)]S at m7+j.L:3chSQatgpMg0PTS at 4
+%3)BEG^'WN77DLt at E_7FTXQhU=_I/Ps")fV5?\.p3%A`tY?bY4%jLj,F3iUh\$FQ)Idm,db%$66;H80,'LLIB3b1_+A)+brLp)IL"
+%FWsR3>L2<;Vf_ddU;1 at f>#Fb`9$mo"fNQ)_^(QhD\ACCYn\trc7fp'bQFS&YbZRH2#05uhmC?>R*IOm$[nJ1"DW[I*12W"8[b[qC
+%m^W[M>1.<UQYZ@:[TMnf\(*eSk^6T*HC:LC5V=:jksB!b*8A4oVJ@$^C#pZf?$-LBWI]k/VAObrjlQHjA<a&J70RbT_8!]k_PgWe
+%B2/&q1`eb!H.nLuUO;Qp6FEA<F%Ztq)6Y>[g;/610j&hd`]\I?P_ at 6kA6ke+Zu`21^K.HP13DU"Yo&2"nR+rc`ph. at 4*)JF*fk7,
+%WB\[t at QVJ[>f3A'>k7><mX+OQ(9$;*a$]*&NlH$SVEa9Z9XS%/%a*a2CWT2DpJDHJ<0Z=%=n/VnV:qSdntoAW]`,#3/Ss#QRI>:]
+%IFmeh!CIDS[CrK&-ojb`KT&D6L(]gDH-i9'#u,-/,Iq?`JAh=`dKpOJ;k'SCA0q7&Zt"'QY.4l-r\3p=N\]Us2JN=0\>rS.C,:@9
+%3[nMtIR%\$T49?4JS<6U$n-2(*oeQ0`@$LgHF\"9bpG&ORBhQPb'C*r93u_F5.0Wp1I9-2X*qTEG$DMh2r^;BlZZ7Mk.aRC^[>,8
+%NeMCPMJ#)H\UO)q,[AfZ at 5\d^Xol'A3s,]C!M55`q5\@XWni-YTm+sanf/&GPB]P7]E0&O6S;?\$op6pL5a8OTJ7TlX&W'#&lW<H
+%;@aCRF\B/:N<u:1VX6e53l at HaSK8TTqJDSZFV)9gRc:;Z`B2X!;ihY3?Bmj2f;:Om@?/)[5X at KX(7A-1YRH\<4**1V#Bd2)QhjCL
+%nGMN5P\)c\.jtRJAW(s+'K6sJf:KI'YLJ$/'I"2Ij\AH8j4%E8Gab:NN;W7Mj0<KJ,o0KZ)@'B/o2W-\l]_2@&esE;'N4Y?'.N2<
+%4:d'^6<Y_<H(9.?5ql?_WkH`2l7"&'6,RU10JOf67Y@>"4B:lh/lXI3f)fu!aoUtsl<ET1/EKk'U)Z4GMr_[_jNGeWi7s at 6,u<KI
+%dF-#54upjL.20(grT>5dkMUfSe:NbAVU5\,SfF>G;R,d>",qg_;$HQm'5$j$b$7ggX9/dU7.$dQ%ss0`pF":PlmTF*Q_4]=grDSa
+%aOtFiCGOsdZV%\-=S(C+W%:'4ENE&^=_;5ao]c,tN%efFl1+9QV/o,+<o0T!QYXJId;3`8!>@J\SN(hrA8:D$1:qD0&(@Kn5"FHn
+%[?dEJRdb[l!?YW3<tBZMe]MbS[=b]Dg6hG^HV#T#nl">[RU7fD&O17t=YUuQp*p<(CW]W(I%>sc:<@>>W()sb#53Y7EMpf+5;'>(
+%K6tqDk<m:ZU"5eW^mY>ns*:aV%\uX\#;kO2?R+dHVi&nC3SpN>`?]=)UiXu/pZ90ZemTHpq'rC=ICC:n%-u"s#_i2#bH5ho0C!Io
+%NlXMbl'ZkaA#F'K?WK_Hd8_RY('H&o]km[E^acoc-!Qsc7,pG'KF2E+:k$bQnY&C-OdeT-Nn=1q:,IfBNud\O'_Fn1c9G&V+nNo!
+%WcQB0LUuPX>1%id.pqu*eQ6P#PP-DEB?3<0p'iq4X9#2-p30ll7oFGYT'6 at T,6q'Y;HA\j_sn&!86qMekP<eW<]?mF]e'g!3Lt_g
+%or_4E)-T?.hXA":l99049Q[ODS,+=O6R$<km^7HlGn\M&rp`Wd\japb"p9$1b#X;.&D*LdPttsC at CNhWo@X#mSEISd<9_D2Kd>S(
+%DP^Z836B.Ohno3k!]blb#er0HYRug\BfYKQ*Rfj/T/9s.h>M"8BOfi<Crpr)L"+R,Pt$rVH.jSE"f]pBaNZ($)TYdJ7*ml2B6QdO
+%mjk7)e]Cqa.FcI*bFr`a`F9l//YnV\dm5`,kZVUG?]>sHd[DSHb?'_GXKZo4n"2sTBX+HVSpp'+,O6<P#<&0;hJqu(biDBa]Nf6D
+%.E&Kt&lJ$m24%.YGn]%@k8;2Mp"'W1(.=aL7M)Q/"He++1T4iV4L[E*_*T$A]#TF&1[H(+?1#M7?mGoK`(FP at 5<2&%dtj1M&ce:l
+%^9G/Nrc>>!9`StTYT;?qplc"fKGoY0VjL7.8EE1,0\;/n_m<T-e$%S4i&2J>cZ4-m,$BjS1j1nqhtlcA]53=70]qu0''7i6F%dG@
+%]^#Kb4V3tW/_m)Ag]s>0##RU&"4?EGCS#H^!o;>2!CJU1GN?$j$pR'T*B=5$b,4Fk8K\9G\u0lZD'mD at W?ZL+<jKQ=(N2K&,/RcW
+%O1n5Z4S[$KDjaM1S_hmg[pnRu068q*;E]eMd=8jMU_c8,;ARu<'8aR2JK)T4HE?^4>[qKY&[G;llkK;@_&QmLQ[<XWp?suc[&b_0
+%>BP&1\&dA?)6mCOeG!4F"O&i"7u/JQ$Omh-H'r:`N_kL+6,E=>^RfRG66-6?Go,ps+E"CY$Ie3$YIY5cbnhS*D*SI2eHFC7"DKYN
+%FLQ at Z/>?R9'6)?P^ap#1A!/e<PWS],"k/[ja.nlDF'J7PPEl:$M07\YkbeebOnPpke!DHNmjaWe[bb=pl")Yn5(f$Aa-9+2P?HU$
+%$$_fQ`5\0^MRY2d-!+Q,W?U]^oo2(:5a#`,_mIQ":JRFWn+iTF_e6!*MrE&@F_,WFo#YV.T9.Dd(X;gV2e=kY-2PREA?.`eD=V#Y
+%1%(9[6h`,Jq&k9NSCtC0,g3#M>iHf5LO=6DA3CZCWJZ%n".3Kfaopb6Vi]@Ya,mCgT2g%EDp[8bckq)+Nh]Ra:Ns#6c;3P$F\Ths
+%p6.C3;-N1=/e*$NhcNX[LQ1f%U[[BO?h>K:r*:4N$N1a%Ro`"fLY]jjIF#-l7-nB4Jtm@>/$Uq:(?B1j5hQn;$_5I1f#V52P@?2M
+%/caqGqV;!0M(5oKa^m4C,F^uK=4SPJoknQA.JJ2PdloDNQV$p'gnhd=:e!qOBL(`IY;u2n9o=it%?jmLftYm2_'c`n,!X3,$nLan
+%h)`4e5&1i->4:f\^F:IGU/Bh#3C_n"S at 2r851"Wh at mR\*?dQi;gWMC.+P(gP;<?m/ETsZU6)&fn/nTP^aHJCHH#d2>.!P<M1WVNL
+%_XL6E9HI_,nd''UqYSD3h9X:/i<oNtS`d\H7o'TKcak_qi[01O5_aOSSEEO\JZOKp^5L at +M6@JB+L,V at Hq6*m- at ._d3+)%\Jg-AL
+%3^1l\F<#G,i;&Up*6rK&^^43?@Y*YEBlbFqG-aZp:,WuhG-+BBb%/a4>`]"BnR2P)IUe[71dX/_!MUJ@`Ch*cU%ZG*qE1Z[ePH"e
+%hRVRa#=]B%aBt(j0gS1=3c)#)lh>UQ(^/t%VTqf*jT&s)k"_Fq:d0^:-h8=2o[t87Yj!O at A*5SdDII&H[&oRN&jj)FX9dQ+A7sr(
+%+ at h`&Ur%>,?83)hIE]98KeJ#t2cFFpHZ'8R*MK$(%c>+XTo6*cZJ_-,=m-N<Sk4=JX<kGAa5/97;B,Nn>R>PBmQ"k=gph-*P:\L)
+%)/^aKO&T&K4bqggNE!EB68RB`fTp*k&PbCoWkt_8:%HiE28sVH<)@24r1<f?BgcWZEfApPMdqL/J$IX:A;.PnIJ(.<cRcOWVd(h?
+%F=gT/hZKR8$Zm>O)U)UfA(jSC43p%)5/j_ICZ(05kLS6#Uu'e+2(\Eqcn6b3lJ;E/esNq_qGjo"'1^>WN at 0::q_2l0dnu%4Sb/b5
+%Wia+u9j7'Cnu%e#PC at R20GX;ugm\1CPB%#tr$Rb?2;`$``^SsqhRHsqO3^j"YHt9:M=S&gn#*:RGF4Re=g, at I!=WRdM"LLd3B!in
+%f4L689U74J*7kW;P.;!WGnW at jJfVMHNZqnMH%!:'6%)o:JM+a_Q(heA/%[A0N6%KM2Fs:u4;"hnWKK#AT-o[(:W%#7!`Lh/!Y0k8
+%VOsG/VB0rll1C:t+SeLg];NZj8roO"lP%>T=="7;6%=(G(6kGes3r?Jel&+%TMStSA'6(bTHKU\`#/ItX\?rgdD".C$_4q0rQB%.
+%eb1,R4T=(*e,*a_C<"QClW<Yj^1jp>>gD:uQZ3Sm4"3JBG<A*C]!#HsIACm6h(mTiE0hgeRZnP?Eo7-B=6eaW1.+faQ@)>e4t,IM
+%@n[/:WnX=;b%JOC3qDYN&T!Rm_)=8bFPmht)ac('RBl!K[!]G-js4m9G(`D6n+Z6^h?iL9$RhZh1q7-RDb1P8KkIeL[:NhGQoHEh
+%2ZI77eMr!ceH!d4HCqY>b;$&NN=B6'$ns`ZenJpQ[.Kl0AKlpj>;VHShu`\41BRciea;7^\G.a6V_F:FI0AT]Kplpd$Ee`U>ncs)
+%G at Gp+J+B0Mk3gA0,T*eT9AkF-%BS#c_mXTKDp!5-]hb4E4<>2JoBBgjp[ZU5?AfWN85lH*bs$55Ed(*L]h?gKO^G8?dch3CYm^8E
+%8uZm&U&>:oV*`g3Wc([@kbQK=p\^m)d?1+r6M<kdr?g2U%5KXoPB?VXk+32#0eUZNa[_gPXl+kd-)r<[d1+=hGaQh]Y:R372HWCo
+%-6+I`aVZRNIIeg at qJloE?S)0)qm*nFZ_?.-VZ3tJCaapNhtC^D>O'bl;ToXgM-G1ae]OD.=_\K4]2e_'f9T`[Gou/t$+:7^2e%8n
+%W&`@5@>WK%B!*D)V9Vm55*I_PNP=N((H=V&!"1_q5p!F.Zq8+F!WsT[EX2]PWU[]W'WML_U=R!?10uNFqF<u'0raaU&Bs^O5/WpP
+%a?5N3b(!,Aggs*&ip69#-kF#o-rbbLPgEP'rO!kU[Y3`^L7:XSD6JEdco>dV0MB,UC?QoIE`N`2'Ic%NJB8FG9)@G]BTi[efT@:L
+%Dt(#Lr,/KMEma?0k8!ZK\I'?N_Vp"Q)gu`g_+2<&F`WX$cK<rJb)L;g98tf?o)[0"P/)k1=&s_')N9K4)uRi,,S>nO#F=SO$!jEX
+%n*AUtoVA^gn:b at tcfo;^;LV';c/>X\,FElXdkrR"\dU-R>+Rk*Sk#Rs?NWKb+U1;\.Y4$-N1#0W>YXd:0OtBUq$/!1QiB at H%EN<6
+%&4mFA>p_84DB'mrnK)DAE3&C0l0]c^3o at Cj^Fl%IGOl<T7j%=X!3"BraB'tg)KSB;946[jq'DZ/>]`.g\l3MRCu)>NO(g>8!1RA,
+%34&&l&7;/N[119$rHI<4P\#.^0ff]l.E,O?f,Nkr\$B8%5D7!O<Dp"3fn)c1(`ea&X]A%Sc;CKBT+CKpLs$Os,Id[JEjb*["af;2
+%:t<,?Yh^ZtJ?021Xt<F\V^cr8_Bm;AqtXOhku.Q/$_oV,[@DdtKAG1AGeC"o)KE&?)(r,heV$Gb6l;f-o26ZA##C6AC\r!'E%^PR
+%M7m(%q#sQ/duOYHLU-"#jMWgX>._,3=B]#4>ZtK^Pm='i^#.pRE2_Q*?A;8D at LGTLRnZG^M4.-4:iN-RSNNJGQVs)C6dqUgd`eq"
+%i(]o0^J6L[Vi+_)ZMOg!V?5PpLF2B$kHoOXg at tq98KYc:CI4^IeDe(JQGLdL?N1r=[H5>VX0&<X#qA0:kF5gkipZ_:FI_']GQhcS
+%`jq/l'&mo_/J"^`8TL+irQ1$3gtOe9('lKn6mLD6lnE!Y=@<ZSft:+sbL1enCFf3)[U\mdq5%q0bt#6F)INhHXSJY3?d:);]IfFR
+%8Dsd>Y<M'-XL+)+HANCtHO:i%D$Ne<;niMuE+m[;#qkSjT+m(R]IT.N?K=%h8ZGd0"7H"f at 59?E<_!A41?l?p`Ste6^\1'-f[hn=
+%R!\tTPLYnCQ-n6cHV_0#01!@4m.Y663`mqWE!-L;K&ZU?laQ%P"Wch\^%U_L&u]u)0OP0p-GYajYj?d6l59&?.L<l0JPin!T?B?Y
+%>j@*j4kFti+6NYNTjQ-`+=HV-J'q1W:Ba`edurA9..C14W at c1:hLkP+fB\K at b!liIO\`F4PT.a8P)?cKnkM at hcbuhVZL9N)"8lZO
+%1s>Z]qQ;8PqOLl[i&"=Yg1*2ud[KB2hI\O*K>_"VLJ/N_bf;kM!a66&_IjFt-E61"G/TX/M);>X$q(f at n*I4j1\pcFCH_Kfk&]^G
+%j*:KA,4YI]Fl?;u\*d<Dh!7Pg:M&E]B9_SfM0SU*h0o0II?M]akV(\.hu(pHc2i2N;`33QC7 at nPJpU'PAt,)u,0PW3/53lU]nXS]
+%ad37ZVS\uMB4.U()l6TrKTR at J$N9+F9rBDIhjtLPRm[[9cl+PscK*bZ7e5>O7:T/G#^l)_dH0O_A(>qNT*/.OAPRHlWcFM%>(ZWt
+%IlVdkq%7jIC&F+4To_do1797bi-XQ0XFpobG/LG=>d3oM\/u-dbqqum&6_eY833kW5SpQG2JjH@(o7l!N+^*-4tD=tJTGaT$^Pd(
+%f0RU(@IorjDJ<omjoL#LN(;*<;Jd\`<+`C;!LVqnV0o$%J*m[Q`%pL@:O->P`j3-&+:ofidK*M=oK\8^!9sUC^SKl=#f54B<cilX
+%SUVq#,<:pdD``qoG(apQ[M4%CRMP5abc/I',rdg]YA.]>QMcuA,ILIZfos at CE/?@CciPP4DWgSs?.Yt0hBK8M228pX@&9KXb=J:\
+%lf:F^pDmkh3HYXm_0\ki0%O`Jf9NDQQOHg`>]O11>gsJ"GsjKl%\qnoBJS01\1e.l67!/,EqQ%8CL8oPr4V4pn!$H,jJ&BR-XabR
+%!Pue:K+ln&+4="'\BalWHbT)DY9dkHa2+'+DqY$pcME,NFM4%o4NpIib0/9B+#aqi>\p]-3Ln9Z+3cLBI&,`hI at E=mM,!+LHlS:S
+%D."pe8-<g7&DEt8)[d>(pP,?_EZ`ct7Sg_"2C=`Cmj4=29O:mt;rY`l@(G\I<tB'jA12 at oOGd,%!>PdQ-Qsa/&cb&_3>g^7S3O78
+%H#E^j#;nU97tMb2AipMb"[YqlUY%WXL$O"sX?$W',_ZCMjK0b.!j9Rm0PDHdoi:S)YMf?^Oou=/G_"%keWjfggQA,^WO$R^3*AJo
+%2(q/p#'TosJq\#oVKb7Df(mCqLSX."Qq!Ye+h;DKC[^^33Qi?TE4`8+bN./+"P\)8Rq%r'4?-ksNGFF1 at ki?r)"bLD<=T3We'fjn
+%<tYf`3V!VX-fmI0=b;OLT`"07hh:m1gLCY^mIXt,6g*U8\\8AtWK6XDXNG;*Ythtr1/tR'2.c_'a]*XSi+e-h+7%J0k1ChZk)A<=
+%0Iil530^o%X!QXHOcgDTC0X at Q^YJ'd[Rk:2&FD4R>Ec^'iaaMk,#Y@"FFL;BOOps at r:)q[l[e',g3ZH"/h[eOI;D3P"L!&gmJ4+X
+%6jPOWe?`!GI&=%@kO6p[9#6kdFSI79q&?$:(s&K(&S:WG)_XQ:iQY1U^TRSSCn6fPP3I$?fnT^_kgPbfZW[tbb;k:\J+ at fr<QqrU
+%F4-EPD]p6.aH4mMP_!jqEhH?a'eRk-bG<4)$>O"t&!FADo#0P;07%C7Hkss&'RbL3=B(@Sq_[(<[Q6_>(i+]k-cWs9emq,'^:`"7
+%SbjQsA93OAl!T?:/U,7l?BE`i_K2-"8I%T#KfkH0882X=>_sgBr5`ihb6NUPLD+?978B8eqMdu']+SYQ!Q;?,hB2K\RTu+-Jeg1-
+%StP7sQ.+f\lf\(<bm4AI^?Ln=q`L0Ffes'3JP(-SAgA$TDlG8%5(*pDGIg2G>YkK+l?=q<c`Km?BH+/-&RW#-mul>=5Khut@)=;H
+%XK:s5(>SeWPNH98*#T>%`TpXkJgRrkbSDBI<qS0$;P*NXKFM+c'?$'j*bQt!gt&"\`tA9!HVY%ZaP&PUU39.X-:[>!1utNN=Al15
+%(D8E/C4P@"eTnMG2#A*#'+&*c6@@1O#H&FamP5CfWC4qU&!>^(bjC3J#CrQ`]_f[.>PjZ)@tGjno7im(-^gD\WIT^I7XrRCKYBk=
+%ql*ShrM6%6q#tS.H)YWi%/Z;QD<o/9n21sRPZS%tJV-Q=J,LZ]du10UKl[+3CN&Jr)&]S90UmH#0+,7lQt\;`+DlcTh\3snm(q37
+%Dn]t_]qq7'rJIY=mp[i(k8u8(m</NmfVM)iF\7snDg_dCiU^74$W9W(iK&2GXh7:jD0Jp>*LEu$UJ(Yj]Ya!@?gu9c4)j7=n(`k0
+%G_`T9GnLHJG*#XW01W?D=\)mUM=(%ns6i+Qh/[lR`468T&;,qUW$]L6M9JiYc=u#.[N78r)F<dHMpkH&RF$/C!89g>hf/20ge:T9
+%f$!]Q*Wd^@JD,O>S>M&T2UbR)^1a9mcS at nOeO$Lf<^hT[:O64GTCKaaML7PLgqdCu>e=VAPT+"MlN6F:oLM4$hYU4["UP?oq6?De
+%b"egIq&S5>Z;:=u$n(h([eD4P9&n4LMq3TXH#Jpfl,#&@nLMNDQ,!pRU>V!$7pL(rRJ^p#\m%fgDk`;<#`i1pc;(lc,0R)Oa,JNa
+%8)H/b27]cb2snN/8VV!rOXLL4(4/cs6)(3\]O9'iEGJmD5*l%H0<g4Y'+kJlHK-)&aftTMB^'s_#t[i%LQTM]^'qdF_<@Etn<PNo
+%r[=o&@=G-`&Eho5fEq%p2uPX8?j#T+&ecNdp_B[hp8c7Z]G`(4(oXh.,ZK`ciJHK#cr4 at n[@OJ<9'n*pd.$\YeSQlLH+g*idSTMi
+%,2PnYDrh22,d^ZD0nRF9D^,EiTEs;J`2f\2fI*=QJ<4O3Yj7gLGC0!S`94e3o$Y\'iccG3(NS at Fgk8]U;s.gD($67ZVF8*EY`b3`
+%e*BP at 4_?=VW)Js[RDCeL6+WnHS9edPVJFrGZP;/F"ADI\!\a:cH:Fi61,,=pT]`K6\[GL;67+9E*Wb.)6RdVhI4$a`>\XuF@$G'W
+%U7%/]O;_<+-*^q+)LigjWR_Ee,O7tW6N#S8dILCN9'Y$[c`$TsIWmPPeS.*er4XUD9`i%,o\DG1nq?2P^k@)ob'tcdmnOXtm'*Jd
+%Eu8*Ok48bj-SZhHrMj at FbA28(cK)@uWB=DPa^$pWa`R#\IVO<gc9trk0!kO^;B4J>_eV\@7C><MD<:UY!'3K8KUtmCB"M/p"_&bV
+%D!XbYEpW+^*LZGm.cJEII1ONl0.jg/V^e^4A:dD_g/6/BTQ]Va4B0uN0i0ZQa*BA-8IbOOc^U81X2F-S\%gJtFdRbEB4Yl"P5tpm
+%"LVDS9r&WLG&t6gK9qhu&8 at e=q(h?]F$C2b$!On^`aHMF4pHArP"1b"&hgW=HIA4L_Y!iSH"2]l01qs?StTHMp[5u_!<0V at jfs@B
+%bpPZZSWq*3YnZflb^NJ,4]TkNcSL&B3=,7L6I,=S=CiZ2l5+JQhiF at lS7TB3Q4JTGn)-KZpd3TB,.?!fDB@]Se3QO0i-n at aq9`TA
+%fiFu$_?k[Qgc?"M3h)]<L4l&oXR<=r[^Ddg_]Hk!hP]<e[?:/-EP/^Ji[rFEJJ)"(CXNbcNa1tNe')q53'.2]M3s43pELAs"h4_?
+%2qiB&1hN3qO*Z+hWZ at mKcHej.TrN*JFAbJJ9<BE3ArHH,\V/so^.f:?kj(P-FaHru=q8bLh.r-cm5eO'2J4ID2TFF,H-a[*r]4h$
+%kFmR7GHk(%40RRTEi^O2&7KQK)R6Dm/-pHi"S3%ojMKj324,o!qe\jgkQNu57#QWF[N&kIPC.ZQ=.\rAe0HUhd- at n>k9giT'tR?@
+%4^<^LQ1k8=1<5h$9V-*j@%!W'I:mQCC2up[YUJG!9smuiA["Gr.\H!AHYLgg+b$gt%.))t0-0,dSeMtTQ*b/uAu>c]2I8D)a]2Z]
+%^c)YBUb`;-gsinYG:Y4XoLROS5b8\"I?WuCV,U**$4_C3b_aOKqSom^gB2bcG7A%?C[]j)nda9\-d;nY"OWeV0li-I8R!,9+Rq at P
+%+P<,$aW!dgff at I&30)U<^1ra:^*jZV,WHeQ8g:"_=RtfVi=I?]Ab?!(M<GS7#KKE:8.4$Kf6Ok<iB*6[%jXci?<A8^p4@([&^%!X
+%_0MZCLk;;N67ss2/o`p at cQ8HpJb6e5b>anl5%,erQC&`nZpPP5_/K.FH'I3`HV66oD]!pLYiZ7sp"l[WSrS!0b87D3X$J,=EA9o@
+%CI:U/;)iJ>B,5qAM,mF?G6$oZTo9&Y!ZfNX\'jg-Q]8Yu6MojQH2>>XH\J1E0:Ns;JEfD8r-s2#[7%nK:b9S/EnX95Tg-Ik^;0@]
+%?(r1C][I5QW#Vu.e9T!+bX>%:Uu(;(Q,nr"F]\i]F:\Rl:(Zu7HP4X'JGT,)Y!1/(:6gXb)2Q?_gA at H3cqf+O20K&A30nLNVdu+:
+%OFL$_R:Z=P54T0"c>EEu1G_Rr,rkQ^q8n0>N[_^pqW>+e2JG%;-PtO"Nnp7VGph^fR%]MmeRD1[>7O=@XC#na+VTE%,.&B"OBHj:
+%pU_.jO4UT!(t-sXO$cdNMB!?+UtW/QVhJ=gYgGagK)uQ5:H0i%Cg3+LGSO(#Sm-A[;M$ZE9A^Jj.aajXaZ#U"&p,+H_Y5^.mhDle
+%;G&nt&Fu]*o&]Z0[[X at T^1Z<bH4fq$bl9's]SWV=*%O6o$OfGkJm.\YE2K`(9:JHIZi*NSZj$ST9AM"c(oR9fcQIo&qt4I03?=:G
+%s0t<fm0'sR[fZ<T!piWf-\n4WGCjH(8E)?ZD[T1a)]3HlJ!,=jRMdM`;`\J+,ukmYBW;oI*9VTN&\h'<:'F9fpDEhVD.\nt.^.cu
+%m.OgZI3aR<qXK\FTlPDfPg42emX",&2S.2m[B#l.11[,lTd8WnnKfpR$ZMc3Yi;P&RCW)NV12OOo/6)\PBCr-cp\^c/rH=6!9g:g
+%e(])?1t$7-mS>,tcTJ?WTof=!5tPs[3YaZ"K(!?tF^O=-/]C1Ccn^^S&5rjf/"%akFsi\lNuYK7l<38qVd at LhoLhAhS(.kc4d at 3n
+%cD?i[(`soo"GLqtqDHN<:dK^RBu at Yi";\-)\(Y&(a- at n,&o,"kOLkC\[@J;ekkFC=S?6a,+S#!1\fFAX`EWj6S+f8o?iXUmS(@',
+%crGpeDe+'IrRS"7>h>mdae&kYf51u]<4(7^/q']!M<dhe\LBKJ9TGq+c:RT&%\;T2-uI52c1T7/R80YR1NG76hjO_:qdHdp]L]Mo
+%/DiJ,J)HT&57VX6n-U7+7YasO0O!?2MueS!S"9'+8M6!kJAt``oVjIbH(_Nj&>hVaC.Gh/*i5=#4Hf9f;NIs3Kj^AjKKMB1BoBpM
+%g$kCA9liu!Rm)8@'Z7p+!ChUh8,DMHntf3:\Sp3$?'(d;Q&,Rc]#93S_:X55P7R#OCU('a:<^4s-j>/(VsXK=S$LLW\YjKB]2Qd3
+%$[P5/P^o*nQ93riC-K)6qkmjpId<]l1P3nIEbOXCM8*is/fB7+'hQ/7"n'em'EVH:e*"dR`J/!RS*B`"hrZOlIOb.:3DP7FBt%@q
+%PFmgNe]$$MW4Q'X$#ChN5;7M+5k%Sd8M*MHoqepP4dtQ?%s8*C#Em>,(q1:ai=/p>(Qb/pJT%3soGGoHGkcmqe`GNHId6PI(i9"+
+%3M+8E"i2u`"9Qbto&Shb at ou;@9ce/n-2E26P.0u at aHF%u1W[VTeAp9BFtT7r98\gbJNt8S&-Ku at KX3%ElejH^0&a((@Pb^d$/-h)
+%a=*mFcOh*$ImdX[@kqnicgVSclQP+V&)<aV*r2kYQ at N]P#>Hl/(H(JIs3M'G2DWN#Y+G*f&ci>;d0X0`_`5\cfa&csjNj=Ll*R76
+%Ti-h5_('j4P?L*e,U0\ZD6 at L78]1pZfSrq`g?,8<$f1`%lC!juc5"O1DWm\DT\R47^hPFp%Lg5OeRj<!Sh,V0H.,G)[$[I at SSlSB
+%Lbnh&9FWE`)#%8Xf<*,rhjKO*\"4QO<,L;<@#$>"mNMT.Mkc-sB[V+$[Rt)qbB-B at .?]Y\9>,RS-18^REpcuG];$^+jPf0tEr>'h
+%6W*-iM7g(mpKU#Wi45-mHf`M#8qnIiP+q/.WZeo7Cg#n`c14k7[ZP+?B#7^Y]&oT$\_bi<CjAGqM'Y1Se\4%/oTi;cYXW(eVgE)P
+%'_:J;7_iuV[:;rN7`o`-N'\"Q at HnsVp!T/eWQsJ`3AL"Eb\(e5Xo2!UIr$TuCfAXL^8([q93'?-#ZdN4W7_+jY\?jl"k,dD1.NW-
+%mi`iD$pQ\40`UatGGbI-O-2BCTPi-J75ds)H&jO78IB7H1nKo<2XtK&X'O3:JeldD#b/KXQ at 6p*hLT<&T_Gl/S:C*L-YD_ZkCn(o
+%&^,bLR at D?Yo6QNY;S%:XEGD`N8-f_M=HCs%3LdQa58Ho$[;I2RY[(/>8<d3raB&JG:]?P.99+XjBED*RqRMG-dj4,**Qp*3aNU9[
+%[FoHQT:B]Q8.`6S<Tf=lb>S3_)5fUa`87q%C#;,HBKfqdBi0.WF^o,bW\3>ieS`r0T^CZtG_2b.!cH?mhpBM^LJArBA0):r!#9&&
+%9>DPal-?ca#5q8#DSH`*B>'pQJ)las+qf/o:jk'3F8I'23[l@/2K4>4X=^jX>PXm!V^qk[;mSRSc?>!kGRE%K`CB?F;OsGe"\mkG
+%$$f3R+^I4606!K#coO%+%!)i8+&hfKMAW5%'m\,[`>%)pW[IOa0!HLB-[G+q8En.\aWkA#s4*9B('%.]J?N;(Z`m*J#N5G/;ZX1j
+%X[u.]-*YGH+c3t[(m;]a!OWoH^p^'1h$folCZC<A&fK at 6,_LmcjUr!m=Ua/dGeR- at mF&:PJ*TC1oYAX3aZ])4Vmh%d)JV at QWL]%'
+%P-9&6$JoE\B[X"uLN7J+MdAW]`B9</N>A9Peg at m<gEcS4lLkpa:G*b%pQXK%jqRJ1*KGh'rbZmSEr<2q7<)tjRN9.u2';:j0b)L^
+%RcRN]$$[^CD;BdrcQG4?Q*f"mcO$0iY9`r[bW[ksi:(X4Q]%KZ;(IOK(3C1N^(GiiR at Z2N*7Rm;UnH[D.H^k at G3\k`-Kmh0.3"VD
+%6hUb$%NG/9/+6"RF]T=lk"IlJJDiW4C+F:I?&^;bBat]E^0`,l#r;_$;DY,aQle-7KWacpIIHd*2k'U=At<TaB/qR=-Rt\$oZPWt
+%4#`)`\PaNUplW35D,><0W!TW\SEjtO8u]Aj=gto&AG?>hkdWdf:+:(ID+iXo/8WSdWG29C#nn.M]l0O%*,E+nJ\tGsSO:MUig*,Y
+%f^-&?`'RsB,C<$<A-?\CdeB;f:*pTt*>U=4C$^<GhAbCA+8iB;0E$Y[`MDS#f8C'Re,5mKin3ADkN<n"h,INTp8L_UbF>ubE6\?.
+%/@Lc*?f#Q"%Hd-uJ<A36GYBd8L=Pk83lq2u>foe_APQOUm9:31Jma0W8kj<BG'(lq=a*5GfPHA,BA/Pac9^4uf%\$=6tJLrP5:"_
+%2p%Hf1L=$^6;A[+)QZ_5c2Lr;"\mRNguGgA<#VQOOGs at ISrLC+E_p5HAb#6<]tX.U2c?[-[%]_J&DoHYe'0;=^,"h#O57aR7!):F
+%q)GbC'Q7/j[XSq]K67iQKg at b@!JRDC>g#,]<bl+k'9SfD4p]j.;glY\GG<*SSk6%T%K1U:!@lh&AR0<=_*fFuc`Z at .e]PH3ho_=+
+%n%:r<]$)n=grso[If,cnT+'SuN=GRiC(:X[5g/WNPS*`33GR>D*H+N')$5r)8ba2p?Hg=<Q#hojJV$&.E0oZ=Wnb9GC''&l'(1E=
+%"sKHjIL?'7]"*f=PpD3-.go5F,o1,C,!QS6S#j6)Vbok$QJestQ](!":<-FV$M/dhP*0c_[foZ+-ROLT)oYrSoVD;@)0hh#YKP7L
+%6S=\i1t^6Fmd]Cf-o:0YEthLn-jio#OurkK2pJV>/:)#T/@p*e!uHCVV[*J;oo, at mH@g<:8>!?RW=C&6i5;>74fcn7flhglRT]Sa
+%!Y.IYXS#^XJ',WXqFQZ,Q+\f.KQg&eS=86WI at 2r-VI`nSib=[le<pr"U<\'Y\X^UrTV<.UW>>&O4q1JF9A+c9BDpu[@/iA=.4;?l
+%j at n>eccOK31,k1!>-^R(,TD%>L55&R"U$o,_5C%5:*riK7RQHN9UJo*KT0Vi+Xtc at M<hXB at WtTJ5Vp=/?'u-*%$3APGm^W+ at Db@V
+%l-Q0.2>]m0')AkpSQChNaUlWUQVGTK^4C<P9j4^KZVQG:25,'aCs#Sa><:R6\!>j6s''C`SqIK&I!309;s;sf+=G0W&%B.smuJ=N
+%BFeG=SjV<@09h(tq9\c_*pu[!/Z#=,[??K\,Zg.72$L\XCiX?iG1n9iBpLHpT%<N8!]P.NW<5)^:._f!_hm^.pWRS5=!0A>Isp3s
+%8Te^h9,-U4kmH3ThX_=/8mYN3E[&AL-Q\H//UGkJ%tN%p9Z]):Nb?n6iNebS_>=@"@%,j,.9gN)W_UjTnK*pqpV`-jr[`*i.;]3i
+%[;QP?P#>4s/P/9>3**X>8Qi?H'n97nBciG$.'JInOt-KVT2^Y1iMb'WbkA.qk(@V2NgIe.<Q`:+Ed\;VqP57`/Y-cWg/"Hsm_tPS
+%fb5^qPF"Q6+R$eabfr#fC(CNS at F(L-#O;d71`/A7i(hA!C)*\fCMpJO1_$?(1>WotoPoU#+-RSs34Zh8c at _!)M$i!CBK3gS+)5=X
+%2265C:$cC4I<m$n9g_9l1c=eXI/W.'KN13A!@E&f\)(-m$#3Y7$S)Sn@[`VY5G\:/=X)#T44!s?Zp%g23L*gOfVanj9L at n%bWiN.
+%&i>\kosr6p14P/:6j.b="JgErr3nZ:OkhDu,u0N-XEKk3H;Xc7[7RP"*o&WNnN"(;N>:f.CZ7Jq.*tu?F6Y](8;aZ<G=f)omEDMN
+%C3B[fC\?IR:[<KhJ^;-"B<q_5^H(0ZmAZ]\11dUO5E`:\3bLr8HcZkACLqd<o]@4\pf!(bc^tLj62NUoQk/JQE)q$o#NLA_rOge@
+%),LQ^Gb$?8Ckbh(1B9C[@*Kr6N'RsoT+P$>Pb7V7c"W;u83oHZ<MW%@P$9Tq:tTO;]@mU#Cm$9UfRh+R6]X[8b7e0D$IQ5D2hR4p
+%!`CDMEaEDo>:9Bl*:eN*c@\JBj8ZoLb*[-D8sjKUH1+8dG(l0G-lIi#S]D]uZ&A`8(m]*EF(%&c+0esf>ams/n$6UAO@/3,?V*[F
+%&^Q\M:\$JkopY6O]nMC31_NB"'Ps#(Q`iaP^Ylii='CL+ZT. at +V]L+cVbHp8i8]4aSm,-#c=D!VFIoiWCe*Q/>^8]EhH%Ya<$"?<
+%=OD%>eoiAHV6%+:e*R/,0Xq+$CBtm"P(;5S3f*CJ9^$cHeg'`r^RtYaQe\"A>`Re#Y6APY.1;8\P'kP,7DCG/o3;gdc6CHG$`E0#
+%JUn"g-5$`bok[9=UF(e`4?:+q4*pt\O9\KeE<Ys!XLpc7(6>@&Js7)/b-0qPCY^T0?AKtB[n:X7m)`$&^:Cn=CV5_oUq+5&CF(9U
+%;i=R1\gt!XiahW%6.`hGZLt_/+sb6PC-pusCDmSliaio<L[:@gPS:PC>+IZ\[d23QEk"opLtYSCj370$<;IlG1BGn*rg5pTN*'@[
+%#)CjP`jiS*N'To.Pmm.NM2^/%0%/\3Q#E6qCZQo%@pb)4V:_3oR)73;S!i^Pj4ornOM$n?J]IfHYD6\ko12`VnYA*Vqf80qU+*Pj
+%]bP(^WMZ<Qm;9d.^StoO7T.)PH3:puf;Vr],;N[i>2Gh<m2b]fEeSlI at HQ77Po4WumX?Fe\l\t_\PtlWIi\5t)r^'\&r3<.Jn$E%
+%cWs.BA98T+Qufr.Y,%s/8iJ46)uW0OVYTtk]J$jtpVV[F9/.2uIjWM>M%(f>-NJSCo?N#X*la,0o at ZlaE9l/fUQ,IM-ZGm(SI1=Z
+%YrM4C4\*#S&l0(Ymo]]+\F)2nnYg%Y&Z!&C6SAdi!GFQ,adi6PenEC(C-fQnOZ?[E]MUHPGB1Wa,#Kf("sQh=0+bTf at WUu:b$8h#
+%_%0?/Za%L>1$'HrV&Y(WZ1h"YUg.o21<=$tR%1RD2h+pkFX>_-14'OF9>\upa>]m%Mi-<YX%`;H4`gqYCchKqr=2l8!BQS/SGi;5
+%pcoNnJm[hCV+B6M':D(H'4tN'=o2]M(UQPjOY$0:^DHnnmpo?WTao[)7Es(heL6_empI]5Ijkp\od#U_CMG_E)\g'43QWP_=6!Z)
+%bH/0q.WZ5GHBL*+0,qWZA.Ze^e(WUb]RAsPc^N9Y%a at U&i_+[EgUo+*=dXU4[QR)dSNp-^11"ffT%hMRD`rRh_t5^TZX7LIAFK-=
+%;5s-Yb2jn_VV-e.D`P'EJgR,'?+P*q]:O5hJ#i;nQ=%u6:)Z2)qWkt93aSf]NaY);Pa1<!4t%"V`Fn"%bg2S>9Y#.U1i>eS9S(UF
+%>"U'ZKccn-Ea"FAn4\51e4KZk16];K)'mU*CY.Jr)Lr.E3N?%R'!KJ8=HI5tW__]sI`.dj>AP#6<3P%gjg<_YL(:r1'-=!(V,0E6
+%#P+#GBimf"eQF8L90HL$B+;PU!C:8T;LKU.p>he94D3i8NB9l4\g=@uNYr(Y]k]>LZ;!p+0a3HbWO#DId'BkcqrQ80:S at S>)1s;F
+%_Bg!AV1*.cN^ZAIhh!qHQDN+`!'X1>0JUASf]m+(SeReA9Luqt?9B<(rl$VNR=KNu/B!?t(et-EhX3,Za.2'O!Xn69b-%XjT6t(3
+%be=UBj:$eF<=bO`kSqOVH(:*([c>A&=K)WS=>,);eY[Y]X0!a"nDg2@\^?O8)JbR<Gt`7V5iiYPK"RI3P=GG4+K%\JW]*O<^^b)1
+%>fYo+KSF-uH'92Sh\p;?iX at H(Fp$]hhitsoIBQ<#!-]P;5o.VaZ7hL1<65i^K"6mFYq;eq.9$!gl&)[oM,]Z7ds<8>:LgBW.sH5j
+%6WPCkjJ[\"LbpFsh<7\iY]>%$C8c5tK"4h.Bta/<1GfA$jH#.'WQU_M]4fCN)<>+-@^6Q5"Es6uXi5/YQ0-HYL?.VHj!4dbL9?AJ
+%$V-tC9M,ZZ0#,'T/I+<q/F[Bd+%O%ac4Y-Q`JmTr94C\m)7budr)Y)sQ[HeV)KS'6#H*hZ+0cgn*gYF`^R#)"%h[5M3g4j[f!mV$
+%#pj52[qj\)U_:;&`NP?X3'`kJ1'sUNSe"<YAW^*i^Q*\3g$B0p]l.q"dc7#gqG#*7hBE8_Br3T+"oO<;Xun,nj='V-pR^`(^[n4m
+%SeI)XP=S]*o5)q<n"i3RM98YISm*eg(Rg6IB+/2n-&6D7VDq]!.3&/gLmQIW0Ph69lV"73C4;7ZZ<P;Uco0IW3`YF\^'PY3\Sb[D
+%c8:ViW'r\H]pgmb`EN03.^+%q)t>$eY, at Y"QPoud)[Q8_J=D0:s2"7E;^Y*qE7bT_=kf1cV?+A5nHf[iI]JG/PcT;5S2JnP5s$5O
+%LunSIC at ++&kbYB&`=GG:$'nq))Op///)BP]#*sJ)XlbgIE2/MH>$rdclg*cQ\!E7k?NR5(H6#74!=M(s,hhf!m+i at k*tS at Bd[qWA
+%CYLiLY08eHE:l;72/BHY'?ll5//O\]!8Xhi/e)Ti,g-=GDtGk-r_q>E;mKQdB_RR@<n4.kh:D4-_FTqQ0:KE=_Hun+pm\=`H"d"Z
+%2aPX'T-QpRq^hbUjKFd[;qKneQ=`QuUQ*joVb>;-goN)mqpdi/1gTp(%)$b<5C(S\"_(s?NSW</@a/IW,KFc-H3gBW at i9[";+,!c
+%OJ!WPOcS&WjhG%<\TfH/8l=?-.dU0mefMgE37Ab5#Q*5%VVZhA4@^m)U18m_3\!\7(gYW(r;Cb6O21X)m5]*2(c_d:V/5;aBX6\4
+%I"S'31r8RtE,J$OBHRhjDYLcI6qj_0=/S$3P)YJi1u"#sS8-KS5F_inp0QrKqur9gf\]F/6h8HVJt%m+IZI+d?$"7'U%Vl3Ni4Pe
+%g=sO'5(Q^o=-k*DGL&[uXB<U=A)+peZpSn_SYAM6c,kLYgmT>tcD+%;dX(M#J;Q56%sns=3-&AJ=LjF:/YI;YX`i:?;j&^&Zu3Q%
+%bO.E\`GB2fe]CaUEmAl5Bh'LrF&kpFk1)NKaW/@Q]\_*Hkg)[,F<2_>k"eceVgXn0.!]PKeYN0I);V_+Tj7W+m%<s;P]l)f9W^!?
+%QA*obrM,BPnJ.3FhSApB-bWDfd>tP,a"BJ_4.qF(oc3O/T=rU8,W&[ua-BD'D9Q6!I\bmYmumr6//*6^OGrPhU%re6GB)^]U,;9%
+%KSqso,'08V_5X[3QNBQ5NB.2<1afXg5q,TC7IWQHqQ+c4P2C24f^R$bX[*`U<$]4$ml]^m#KKk8>Rtr2bh7IP1<j at G!qu`B4:.:2
+%]/hCI"O#`L.2U`;i3N&JW5iVVVNsW at -Y#;<IqtP!p-,4iS5"*PEWP]%p=6p5eGX@/?0".CYt]='8W+5%8@!P$#^<<cr#].6$W(=a
+%0>H+DK88&t^-!9Tp7W15\07TObk:S'be2`E%C^QJ2ZIJ3Um,^P%5'V6&6M-C0/8C2)lLu>K%'[pi6BYlMO#BQ5O$P*[7dF`[->]D
+%D/OANL1obs<D*JK1`cln2Vc-P#[eGp!'2kaC@,_<iq?;D^A<1MBX?i<EpBDJZE3tMYC(q%p_j8<EX at r\Ml$+\Dks3lWqP!F at P5OG
+%L<!J6R+E8u6&KR:l(=10;7=T[9fC+Ma=#L.9FU$?<o0Gt,7Dkb6YF8?%f:r^]+_(`a7>S at bNM@^Fo2o#oq6Lrhe12VDd;acD9_dF
+%1?+II;,j\kS%Gk2)0^]h:A_rT8WhC%a-[5+L[t4GR+W^L%CC#2362$X4(rT/Aof,/Qs8N at l6P32W9Uf9_Z1uq>$#Y&n5sB8&^[/=
+%)2E at O"ne9G\Cld:8`;/lkV'+j\[ge--EJa/h\KsA.9cnFfGH!O,[0XbIOelEb=UK6UEp#VI!sPNXDMhBbi.""m-5\l2O<]Q[j1!:
+%5+\fi>.Wclhdb:OYcj2h487qGj-5ds)H(*>P.lQm;?bs7QN7g_6VOO!]XpeqhGT0[>jjFla6phZi=PU$o'KE<OXDZG8]AP!-6^#s
+%6.UchOPKG3XVqb+ at DMN^''KI\P0n3#H:(t)H3RhZqD]p-^HHCDjnB?*:2Dp>=6)=POpO*!HQaY)5CVX at 6<PXlY[Pi]%L7;s7#t9O
+%9R",cL,E//\VT:9A!QM;5S?WFd3NT">mu)+7ot'!TtLt%fb2@([q at k;bn?dY]8KC%O0l=jHd3#6mS5q(9f/Q3Q%JAtNQnnMn5cc-
+%P%bJ#lKJ0.<4B3-d!8$ADP8Xs:g]WDk@>2j+q&cH9+o.n[1[]\etedG\A7%8i2qp9LjG>m7/k]X at V&68S)\s=`jYbJ*b16m;5VQD
+%oGg3"<`P4Fp%Zi*RPqnf75NMbS'XWdi[$%DMEc7Wro?9Tk;7uWW>1t_cH8_.OO(_[m-.-13+VOOqb=77R^j_G9'XQWUYV'%m^LGP
+%qHOM2^6NnG&eo2;r-8C-Uo"!H<;Cdn9;,6%KLM27[FuYB:4`Jb0qj*/[I.(IU\?Wg!V.+RK;>_an.fVb>W$X6I0Ki6"BaZ0<eU(X
+%l\=2*YX>d,U#H4N&qo%X(*>P5D]A/5>]j#pnG>6;,uT2h9]2\/J at I9F<17N$J'Y;0k7)sd>Q<Fnm5Eh(A+-ijWJt^<=`2N\F^I'+
+%5,)PDGc at l]MSDM/LFl"-m[9`i#cHRG0N.GSalbr]Q96hg[EfOmUi;MRjXC`+Ob7ra&3O)]n!<R]\LAnSe_!1?>Y\G4nj%W\4;U"Z
+%J)8)7)@"?W>jMG<i_F?_)m7*$j\%Zai(jA at F#M'qTBL>L5HZp#s!GPB!!\%N`jlDGZo9,A,(qd^l$:==Vgd=]81_gg9>1^Kc1>P4
+%PI`a4o:Qh`i[Nc,j<L1lX^?$(-%4Z%^a%/:BtBEu'",8']Il"$[7':k;LDW"d;iVLP;G]qmQPl\Sep3LN8FJIb&Gm/jEjQ49'.I4
+%'bi#sZ$Fc?T>/(M6aBM?b394O2Yk(:$1u?=]HWef,/(#S45XOYQR$UWD`Jm"jM2StNROq=dggY>o`gDEiid7E8\-j3I-'1TbOL_7
+%V(8VTQ`k($@D/4iJ`aB@@sNW1k]?D0:%R\t&N+XT\`A7Rs-^.6c+)&WdJC at lZZCFI+U/:n:5\D8Ubl9rQGhA"[d]aV+"4$Y.2lrM
+%!/:D;[ToQo[oJnJ`,G)#5WO+4Y'n#UY)=Uk2)XEV"%kd;ojT;(<?U&*O`;M`p<J4BfiCK0dK3t^hZuE[Y!LuBdI9^^f/;:9$rkI.
+%'%r,0&*i0M:CcN`Ks1\(%u\AYqg3p!:'fl.j6fZ*HV`^0&gk!4>OpjG$kmGr)O.Mbm<P!hnbH`FJ0#ZOHg3L^"-&[nEn%__8H8*D
+%`Aioj2je,cQGA.b`ik`VcXLs'Z0O4Om)_i+=``[7__hT5H-S/+!>$f64>%On9S6K3?I]=['2L'ZDZMOfm^0'_LR!chVXo/u at Z<$@
+%BB$+K\s*N;jt%Bk_mui2kW;O0T4)NAA4D,4OYJg<B,U0$/96p!6JcVTBX6:5!'^'@[4QaiDtiDJ-]5D!2tch^E]Z(62(&X^Y-$Kb
+%&1?Tia\'Q&%j\AngSZZ'!-g9$(&!WQ!?#NCGVgaUTh7TCIMV!0dqY29M3d<bHg[*.IbGb$ASYhde)\SARZ;($ljNV4][=`4/E^[l
+%?/FYtG.qHJ?QfJA\6%Tr5%!5f;JjQo9]0\2UjaU+1X`-Uh at XH.=>rpD^l!,mp9Qnni`697c-tifGM[(C1J6\E)cioOS;_SF?_Dh9
+%(`i8<)He%^Kgf]j-ZqlR4o(JCHGA@&pRrVXG0NJ2glK,*_uO=m3](Y6$gB+Xc@^Z/4sgkb1\`N-!EW40-23?4Ydot2$@Y#aOE_q3
+%7g^B84QGn'-%8Tf7+A"l-t;TroZ<"bYW\0EF7iG<V^go^03)1>rRBs</BA:%f3AFc`;d':T]7"'jrFcM&s9Yd_DN(3eV.P:j\@Ls
+%nqP&t._-*k$pJr*6BAIW.9NK3khiONhKf&&o$eVhSQBRb'PY+(=O;, at Z5X?;QJac.&eX#b1Rei%_W4hgRrdM7^A5g.qbiAI+1Q^W
+%#G!D1,3^N5CU7Z2dJk@]jfRmg+]u-6#UJk48CtM/[i[qBBr%.H"1,q5B`M'm'#;RUHP_NlS9CW$IVPl!)qKooi2ZuK("_&M+)_N+
+%IFH'e+_Rs7.7(j.8:k7u-SKE']8JY.`C$*2U`&C/%)s#(Ps3$Mj'E?G]=]:jfk5du=t1c<)Ys8]71QBQ]09SufTG42`@nDM8WKg-
+%+u'B$UtG9#2TED<`8 at i*[K/%gDDo(]FQ0Hap;UY_JPVJXR*f'dlen17h"IXI_Ah"DBVjrl/GW<OOXsgqG7+A-G^(SR-U1Ls1'jSS
+%H<6T3+%kU[dNXKgj:*m7?)jdk(mdGUAZsIP+5`QC&UJsb760XU\MZZFn4-W,H;t$n;_^s=3G3Z/Y&4K-s7Xj8h=Pp2mn"!kBVZqF
+%V4\utnF5I!o9F5%-G47hJn:V1OfOhkIUCL90pm4rV)V!.6Yt]9<qPRZEi-LfCh at Th#pa=?]@l<p>W[nsWDU.#N9>"U6X:BY#5:pM
+%<fT:fXBYf)fqJ),l4A(4\<c&T=I[%W*%0RB?O-NB^9%,V<$/*I>6m!j8ZH[-JGRHB at H.NXq"p8ZKtDN."`eJ:QPdDu)rL4KqN:LK
+%[kaH&Lqkc at +gH;LH$en#?>D(%.LqlkS=Z\?D_3GNp>^8LmqH]Z0^krkoG=B1N\0$_cad$!YWHRf)>W3DRW<5&Sa;RUaY*Id$W\&k
+%H#m\\;QA3^c^e at N[TnPa#RLOZ](3sAlVtX at Ih2&+F,:[U%/IC6<8VIbn?W:6OS_3##HVAkP(Q;$,o*DhR?I*HMU*_be&H\SPHOfk
+%E8;&eKDDZ-$.:FndWXo`'4$t$[ZlkMMu8tGH.cV?/'h2-BH>`9I%9/L5=h]/8B.*E;_VU)Vi.EQrF;_8J'Een"/KkLb+p-BWY$YK
+%#?d4dl";(52Zb4Aqt1la.Ih0TlIKZ4SF$!A]W^@N9ZY;5*qruZ at WEn4Jl-_Tk@5u!Bq:i[oJI]@<#k:O;ZLQ7OYn;//?GC at YUQJ)
+%#VTnbTjnl*5eb[b?Yf`HDi at QH*:>?9o[0Z':Q;7,^4K;:aEfHH$;2lES=R2n]b=s16k`>X#"F&Gd#SB+NaV.nQgt_p@>\ehC.&TT
+%"f^6%/I at CQR2lZ7f;hZh:\krs=i^jal5dS70pG4t[pf;="%](t#ZZU,;KhF)VNSD>4a7&DG^?\bE*>A;<Kf at qg2jr$MA%a=ou:fm
+%k[^87f-&Bc0-E2(!%+t.q6eUPC8U*_^nd*^il3m#[B:rP7k=LGA9lMDMedX#]e9pjh,CK(L)@S*?@43fYI9n0-0q3.5l%!CVKogB
+%R=BJc-](d,;AkWRAte[%F)06bOD)drcXMa%gd8S_\$JXH(n!.hmN,Gm,Xn)gju/B!CF*3VhOCc>JDZYtp`U41kYsH3-k26*/5,-[
+%@'(FcNREIClnlr0]3K.XI23%O[=!_L,Zkp"\''^p[8Ec((8S7tLo+G:D%Y]L]KFU5]CTu>l\q/tD#S39\4]CZ7e_+?,MOtL6q\Oc
+%hs^q#aNZaJ!@]p)h4M9W0:0(&-UKc"d"<KIBBlm1'XNMEn[IBs3.KEO6(,t\Ql>#:8>+kN1JcQL-!qh#H13^6%hh1=MGpTB;#%!>
+%%NP>>oMe>ST`c'u2AWBoMt.u3A[PfIMsQs$i]2BRQMY^mQ@/Y1[!\cbP[@JW?I[NMiI@&SG]5r$.?HdFNAOA<atYe]L6'uL(Vt,`
+%$.GTtVnml74rqsij%Y[@9&6_&fp?3pD&t\,?=d4!(TY"5_/!*!PHW8F3cQZ-%Ukc\p;U-KSL-Ri`&nWt"dEp9fU->PPMeo^W4a%m
+%+ZS]3H2OVmFH5g-#_C24//Z`Vd<t&:>VM%S6M#)p77#+pq[]MS+-E'eJH!YR(P0XFrn*f at -p0]uSTRM4VV4!Y:OEkur^Krq<ih`.
+%&mcl-*UrgUm9]E at 2lk*g3B!R:EDUkjKN$3d7:rj8[Pd*uo3-G]#V5eU,VV<m3-6Z3IF397.+ADjn8(Z#:(04/8Qma6ED-(!'MkT7
+%h9e=ZD:s$I>#2PmkC2G.Y[3GMJ,1*i-UBgGaHC_][>@gpM0]OS"NIDH1O-lfFl%#j`jX7)\l7^nb\o)NYQ2sc%B`<d;-sl"F1<dT
+%NlF1<=8'uq:N>s^F,*QsgBpoCm2::@b]/['%h=qs!cS3"MsWW4rU[3Dk%BOn4jeXoPNig?3HSE\Mf#dM`h?!obSS%Ji4=H\>]E?Y
+%Q$Po_D82EOp!jr7Z@]G#cJC#EQ=WlbJRJ?7j8ZOJd6<pC,b#!:fp50pP3B2<aoET/f:ilISQf$=@r(R=CWG8#Z^&Zdo\GU9gX;7n
+%;t/q?,ZLHe,Z>8dc=>\q4%DL,)NI,]1ZaW4s,r.L()q(\BMr^:H=*T3>QQlZP-YRds%mUd:sf@@Pj0Q+h$5`W0eDGljbFq^:2dal
+%kEOYTK>12NBXGupn[oVDD]^tf>@Sq]A&d6f>]T/EQP^6u>*;j13n-qsD$.h:h7VntfXUN\2*sa&aPBU=q'4oP?t!pWTAZ36o148!
+%X73-<PLuHlJA6<l$!:Q=b[boBjkH8L;`IK7c_",cOI`+_,UaN+#1SR#I(nMgDq-[.fVj;_NuZEu'hDH[!XdpeJfc58`Ki*4?&BS7
+%:Pi^`]_5:oISYtR;I=nABB,Sj*8 at +a@MmHcS>U2mSJQ_%0Ka33D(DbWrm0M9<5,'(oM35ij[4(S3,le/D\A\MT(^87&)G6)EJ3L(
+%^`P'_Ld_%TiZS#$AUNE<]7qJ++;e3kA*5!=8E2dMq:68Wme6R]Bk=T;[%];um8IR'\E1MQ[b[8. at Vu+=B at p*&EfdVoAU^"Z`2$O+
+%/3e0N@!taG?<p/S99PE,21YtPo<M^e^8WFrCnLHAR_M[)[512?Ssp36Ep&%/ET2h]o;\T9O]Nte9Iu`)BRQ!>;*,GoE\SJIFp]88
+%T4Q0f5E%bA-h7WXfU#i^Q7o]iQf.XY/+7YcPFYWF"dS-]EW.BY3%TY:A\JbAQs#uZ:miZf/b&V-WuE:E0)-^>k=XZ7M7S))LmOPp
+%Q"!7)lV0QF'1.>*Ej&8F^2WG*)a5\H=QVN?d?8bZQ*+ at j46&C?V:6d6Q at kBQ\0[5NKHQ8<g:)2o`fPsgct.\$L.F-6F_kABP!CDf
+%N;QWVR;K\<I-f/rrV1Zq&&ZGeI<6/sWSMP$ngH'#*mgGR2:<)#d*3q/!k$L]d?Vg$?Y;IsB).W4GaRdP(lkSUVgSFehZT90i.7t*
+%RS9f0n4C+fq<%Bd$bjpBT7O+IDbTAm.tOduFpeX$7,p#!ma@\<k'&3A%T_:_?*@m9e<;3qqDkMV066j0#(`>U]"-1Jc,e`9[dhPY
+%TB8="']4SKe;Mq5dB&koYIbXKJ"4t9:[Nin>l`J^DQ]@.%S-LBkMLMqZVI3h[Nm[2`dnj"aCS#T_g6 at b9`(oK)QW"YM3NmcWPu7k
+%g_,apf6oZ?/W!<7H-5G7LLj:-^W8b!Cnl$KoY6Rn`Wm\'>:X at 2k@'s at l$3`TAGIr:JOqud[EnR.4`]*>HnYBi)`:,6'p"r"gMC%I
+%>dDD7__$V&;qk!qVP'DG3*jJifQDmCS^i!L`MQ6a at a[]j#>G7]Dq+3`PH6B)a`_cr*&%jAB4#:/aPBSJI8BRYT/D9mqTCmmZ9S-h
+%1m$IVqRJOBJGFX\VS1nqRhXpSjb2'77WQ$Y35rispcO'uX')pZ,1lQ\moFS6/^N]q^Mg`cZ.[IOV)g"4UCQSpi@^\Rh[$oK&3`j_
+%kB*9ClqE40<IJbBVH!P2`Pc5?YkPhS_Pr4np$glj^^&*eQ3V3#XF"J,G*D/'j%+U[Yn:*KaC"ki:Tp\D<AB3^XKglT-U,k9d at 4`M
+%.[iX3@\'(]j.IgP")=72,_YQ+[>@&_7V<-D1Qa0-EkNa1IUBi9=*YnW+RSJUKkKu`<i2V;F9W23IMYomLQo2d0Iuc8/F#r2ML,$m
+%jHm((BSbLQXhh!CM,Ect2d>nQi*@]4kFpiMjom&G5=Z'7[8aKIp:T0/mo8<&f_>*dP-_&IRY&t21[KFWX))#I/,'4Zrm#"]^qni>
+%9TG$Ci(0;-\BbO.8XUJh>NB1>IGZR\ITlk+Q, at ZHA2"N?KkY9#r$]"u!Y#s5kJ^(A%d at p*H<?*T7OiG`%q0'PJfe1:XiVAR-+g(F
+%j4;RbJJ!G**4)V;E0tsW(2[?<.fgkCk/o8<la"lagha]BL+XhO#p)*Xq,=cLkBSE6Eq at _R%P$&*n%nkPKDuoj5UkVV/Mmst(R&6t
+%o9O at j=Gt.Y$IhV[:LX(X%?h at tk/2#bj7S_\9/AF#.aaMkbY;@.'<)W1/`.MMD59#`+H>XMB/ZsP124&r="6)FC!FaB:O<jY.`kr5
+%6s4"&Iq#Y.[&_-Aa$B'4(Qni!$i++c`]Z?@,[HOScsGjJk0C=>c'ds?P*7g(J#P^r]El"L(djEe\>Y;HRcYKt#bBG<ZK+Mb8+i6_
+%]7%L5Q7Z#$,fQR:#_#@$jiSXW%!o:nk#A-*EU;!$<5ab3l$Y?J#XSsT]f1:iZsc0Hr3T?$bS!(c9Y:*I/g[Zrr(T?JYu"/,`C_3;
+%SK]ghck8`*72d4X]dM_5Gc+gCB9TPSV`s^4EsDh at OfNP+1TJaNC"94%MU&2C?-)9FqhC*;>#j=F$f8]abE'c_XZ9.PjtOS)#BBb8
+%dqn)>@N#1;N^_fK(.i&Yk)b?u_TD^iT5)oiUbG=>bIODEh!GN`2Wb[SXsrPYnNB=XS);(eUho)rn#_[4V*&0*6YDL`)69<dhqF=g
+%9eA7 at mqd5,(>1XVR^6cuS;?].hUHQqf64<2b@@o>iR!`Eq>$n.@[3I>E)?QtIP8%G([nn/8PKGHG_&lcc!VI!j33X(l3IH[43\J4
+%2KsJRq%qPj/=;t7Z0ur;LnFJI>RgBhTtH2XZ?F,X*e>\$e\AXY>3G/R6VVaY9_P?3SJ=-NXqBG[!@*,ojL!MfNVUA3PiS^0][<aQ
+%h<[Gja1O\]G<^\%5Ln('1pg=Y]WuJ1.:g+$GEuV&:L-ta=As)`;4!cQ7iiA3_H6/@*!>hI+2b.[duh_fq_!$;h7`'2E(UVi3iMg#
+%W`Y?87'@p9l"oL&1T#S!P8m@/qE]Tq%#o<#XunJnG2)&Xjae(m3`n>O2g-oSK!'kHn]lbt$E;C&ag73b%?Zs0P!k*'E7Xa';o$^j
+%(5)F^G+(J at _#'Y:<L2%AqMbJ3g4VP+mN>d"4"]V&J^TDa&b0lE\l7qY(DG.8cm9d:PgAI$XDs>K2s$WZ$i?mW1#!'hNb^gf0$e7l
+%ms_/P4X6OdR39)2WT-GG58$W[+fC:@.jt!=S+%^r59/Ui*8_RaHB;Q%dGi3R&->"rG,EXNWUg138^OB:g at BW3I!9HWJ`SmG#"-V'
+%\6<]u-FQ,F</62a!JP<BK?c/&Oc"_o<GiGjQ`4jDpj&;=D)6a6Zr9!hi2=jFDcYFI5%#<a8mE=4e1:"Tj8,39O\,%hGs7.F/W&UL
+%#(7c at m7[]_7R+Q?F!i=/n[AIH!Y(o&HJLLF!I5Rd;AZCHp_5$!BD_"C1rNU1dZVEhB>`#*,ug at knCZlX]RJ"!bCrj;5PEs9f8_,e
+%dX9pPs2,mC"\?F.V-h(a_Y#7`=r7]F%7-gk%o=Z24?Pa3Lrpo?,W!&IM#?`5ID4#N%l7.Q^:XnEV9C42fp;sTF0fH?AntP?"")u1
+%P[u&,569Uj25hDWd4]Yj76;i=<X3rm\lt?3*X'(oH>TsEG4aK at .pk;;KWdQ"%3fmiH:7l:[nha]>^;J5#(3lGZUQAG_\<qhAJ8m!
+%V.dd#Bb*<)T*kn@>Kl!8WH4F`migHR&[>"R<DXACN5<dt2,?$1(W2NF-<nuF,RRog*j"M@>Ac2A..YtQhO,;R+J2Yn-n@#N2h"]g
+%PuNU=Gd&d]!u4p,R4HV'N`T%rnW]<'>K4X%DA*doDm at F9MFZL(E(1dj/d71J%ir?#(_\n7:Jh>=D,.m1MLe9QT?T"]=C^ra5n]jm
+%O9GX;SD7`_N8;W0\M>3laT.K'/4_t&_n$YW(Ee at B_T7I8QVH2s.URctr%Zu-/$,P*gs7`),"VJa#]R]3a`JjN>ZUa<UEeTXF:mfA
+%dnFEf\I.KN1>A<5C/smn0b;1)2.h[j$9M_G:2iaZ#98.M6/)mZ3j>3?HF88op:;<G6:Y/g"IZAme`io@[3q!5"\cA/Am="lk0RF7
+%]+)i%bt5K_V?Gc>b06ikj*>n?i3JA,28[P2q at nsJPkhcGo8IfA"k^sM_'#(5DK[KE/]48MFGnACas`be`#]cHVQ>YKE!sCd4*Wak
+%.d*el%G:eH&*m=j-YY*/P:nC`1q[Z+h;H^EOYN at d%b0PW41:OG8t2i!'#K:WN_(gf*24b%m[bbKSAW4X&Y1H;OfH&&:=RB1d%mYq
+%D$?)]h5P_;'`5pg;.V$*#StI:fkeY#>]/ncMq_ at MERn6p9?pJ*7Ymt6TIQn[:9hX"1sXYuV&#hsqJ*@,[em&]AS:EFEs<.]9)RB>
+%^WnR777h<bZZ\L`b[b9Kg4Hu*2EjYETs%"1[$]^Me3rfM]<b$dJJX9Wn$QLD at S,fp4nV^Sak.LYWU+:sK at qLEh(C(EK=1)HlHG6,
+%Cs5mJpV=`.7<a@<KB9PAbX,c-$lVRk3N5l?p.4oQQ)W?Momfuj)_A=t>`O;q\[9Q`FR'L$qgg/<P226oZ at TMie5poZgRmnD,J`oR
+%;Ih1_]DO'ClKbC]%9XjII`a$Gf'5$$?Ah3uJ1\JUaJc8#'R88d?f[ZZP##TU4ZYa4lr]5k#T.sjYluSfjm"*"(F+ia$U]qdDI;K3
+%5^os-KD\9j:HNENCm1ph`RDUHgEAT.*<-=[6T[K_,Z(gmX(Y^4diU&n#arb`-%_aOlS<]arcLf1F=\4,Y/uD at 4X?_L%bU7_H(J-l
+%'=LPZ</<L?qmRSl8i54RD2XMHd.V=uA3a2WoSV[Xl_L\?PAWNR=a*Hl<I42!f?&>X.[_4ZisBg:]B>0l6 at s_DW:MGML[<q?;lN0Y
+%;T-4n:V*(o/X&_.p7][?5(G77Qh:O!Y4\6\BX>t[p2eFRj("!FggI7m=n/a1^rRPTLg;5i4*]3Ir=Pd#^@Z(=,Yf&9eZG/q=(Tf#
+%i]HMU-BpN0;s`W-;fFFIVeO?E4P!M,d8G^fF."V>TrKO-fmrI7QcJa;iAPl'HG`b'A/EQ7p.pR$Za8Pq9#tc<HCCS^:b2AV@\90P
+%X((C^6(Ch[,7c`Ho9$ht,6UeILI at pJCKc!@Am"$0OlE3_K at 4[91#oZr]L[rY&spH?.mO;?@;D;<npV8`M/bMjcg:-*VU.I/i0Um_
+%C^0;j+6Jl0#:YqdEF=#ZI&P:441E4!)%Lp6Su`sK%N5At\0^=./e?P.$98mFPTcB.`nC;7a0JEd34E$EQZ,Ge;drICF<+1#4fcgD
+%*[OiPbN39r*k9G;Jti;rYE&qT7`4f/CpQ7\I?p at ZdqU@o='0tFONWYnU1]O4Z:/gR1,-jQQ.52Y[[UNFXe\>9m8ub^eF0_pC/Y:T
+%%V[aW%"ipPGRCG-A9X/>8q!8`?$%%\W];5CNN(i8ARo"-=uah'kZ&ZH-+(54g^GhgMd>Zb4g"XI at eZE]I(1fj=8@*FXCY"UUh#D6
+%'\rMoA$t'S4]rMh3MR%u]8bIrdm.ONfr_=Y+>'s!;)\Kf12YYNBpRb3P+!,`6KXtD4>6B^Gt^Iao%PYklT/0hI4ENo at W3GU;Bc+n
+%8tMc[aWL_0ZL3lnfV.."b?F9J2Bc=!]M at LITGEGH_':!fGSm.`@2hs1PM4;EkjY7g8Wfj:h at -'/kAee7b<AGgO;MEH%`l>b6TNO\
+%C0<)3<^Un.\+g*dau.PC$9$cN5-N8sc!`HgY2':'/P:9?Sa*O?HQIFS\fr(\2Kq5^Su`:jR^tm2&O%IClZ.<\<lk`Le:cG:8%iW>
+%6.&I$1Idhhc^mc3J4ND9Jg;<74ACuh@^Wg"3T0$>L>5g(5s<QkpJh3q.[shK3h:jO*7=KKeIIkE-lQ3hZ@[sG><Ge at IQ2i?ah":P
+%&d?I!a?SA#pQ24S.DEJdjHI at uPP0PdP*)<O3[4qW+d-qXW;%>Q at I)3L at m]MuZ3:Eh]@.Kr;]lr3\RFj_dG+Ir*[=#3ZbYb6EqP#8
+%St%i[S)0=XT.I[/'NIU3-Rm9"R^+n""X$5!Mu_:O;LM/Tdn!+p\XiRP%]Z,17RFok'X:fs!1n!Vo!'e<:r'(F]@X`XG"4`t+,\/Y
+%(Ve(D:dJ(&L5s7 at e[aF:Yi;W9H/mI+8-qECg""Ti"$g(EEZY'$594oc'K^D9%*SHIm;qai'bgal[#M+h(q&ni4ups.-UcjC6&3#5
+%=fu39Z4q3M:F_U2E;$P3WRGmZne)8:0M]Th\P#e`e at +ePF&I5*`umtu6gXNhm:s*)!0;hM+fNA>c/Ma/[E at a:O%\;R\ZW'dWkh!`
+%)%Y+5FuY4kn#(pF`!t(N_ga!7.Za`NfX;9LP+GknnDZoZS3`_!9+jn7UKa`X$dacq7-?S,;.ME=ABq/"5/ZfKhLR4 at J1_5O]Hnn0
+%Bu`;87k-?6ZHSh>eQKtdWmcQhRW%$"gV]<hE*!5$"8BXE)!"!Ri>DjI`R[$N`_$:OJZeQX8iq5F.[/A7?gRbnh2$.hMt&?cLJNMN
+%n=$3cA%%ULm at 2.uZ4V!&CFgfR%R$?Q9k4*m1PmdFmMnOSb!VWHU6AsS<-M7I?C=9JmbYr/TD+SSibfrJ at cMLk<8/kh:MlF$;O+='
+%3,K=7Rto66KMJA7.]5h_Gju>'opblJTMCN2/">mRKQjilpK=9nOumu+F.F[g%bl7Mg&]_l3'0,(lRF*_;\V=/n*IBm0rQkV*C:g9
+%Z5$-XP;3=5jjI#(Ga"+e0HG"T')8XSA95"so'-n7loY;2*M/q%72>P at 9,2D$Vg]4ZXf0BY!'hM>diEU?]:\B%3W_58Gbe]4ht%\.
+%`ue>VMJ8^i at 6Kks;q2Gp)B<]"Y!q9>,g_]mY9Z6:3VS[JJH_AK8@$$GpfVUn4mg:d7)k,YPrf,!Co=D0!T9eiPK='m?%YRhNu^cX
+%p7&`m:%iu*D^@sKbM9RN=g1.V+qmNo*IP:b*n7+0B:!ak7GDZB:9.jSZNQj6qqgHTDC,0f&K]0NlUHnNok[\@Ol1^L<O-+<;lKg#
+%X]ZE")*!KnA:.;GW6mtK_E@]3H]_cY)s7n?^Nc0Xc<5a;-%8?3<KW_]CXsL0B6,\!c:$nEJIl*.Bq1\C%$GXIok'-T!5Xl*3ltlL
+%O__oP7hpS-4.>5:05B1AG*HMYeeDQLB:?"$&NCi at PAoW/$$L0?EHj=2:'i.9PZ20pds!1,(<`o>jPkjjl<,u>fMXme1.q!F[Z9?G
+%SdmK;]H!._NTE0uMcGC/H'%N at lr#d&YkMT4Qit-J)G-.$DHeCCKQs^qSo4kYe\aA&-QYMG@`Ek\k!gP:,)5.\>^6n)9/Bs-.GL2%
+%?>DE9Qbg][Ua4i2<ns$`6;EcV.nXNRmimHj<YO<$bmqr/;`rj$Mc[2\-S%@G\*M(kXAbH@'cCt,(r<)B;nWlh;\LpMcqNOK/5I.0
+%i#SGq?elASO@#@8%O[/,i"qfr-T%FX":p)!6[E2S-UjX0:[BShbcQf\fWd.<6B"/h^a8Mu2^dDNDa('B\#2%$.RkZe;-8,dJ27Wj
+%&QQhJncTU)XIKWBJU<ghk8pKuD870Iota]0U39#__$ba'7nduuAG=l=ctcj:j.W"hjCkm"Fb9-KQXOYfKKAq(?5NDbp<`.t3YqTm
+%(%Jei]-2aACcNqB7;^L%FlL]ciB=N1UPa((<c7Vc%ss.73Cp>Zr=[-sWi`%rn,s%6*#Qu(@O)dC"7&h-=eMeg.=YaIRYOqU'`3[N
+%=34(7USb%6a+qS!70*u,B=>(,Ab+P7Kj:P6^dcUIlu^KE"k]e)4hgcm]1::=JLj<%g=WG+&=\j:AL%%^W)ik:*b2Dp>7g'@Hn"s/
+%F2n7rZ^YEFk2B;-;cV7h;qSp+X1BC5q+\l+ at I\s!@Kg1VSl=V!S_:sLUt3S7<qU1$P`hO">M;7%oi0i&P0L]^7_7?"ZI/b2g`"qm
+%Te_!P!Pce6\'JP5LPtpinf_flRXjc at g"Ce?N_LOqWMTcL#"I>kmE>V\f-JXDCkt00r=QA>,bZCV\Zg4E238rrNRpVm2_=BK,tN=r
+%1,kQ3RD:>"F.+#E;`_3_Ff*^'j2J`XWHgY,=.L%UaYiNc10/ua<U^Dd_6+C>O at bp)@#*"&$aH:VBZWLZ$iGNX5]!eQeXZ4=.P61#
+%g"U430\GHnAW`dY+6lBVJ>l9ScW`=&C4io(h*E<h!CtLRF'e3(E26>P+W5MNBXD]C8!]l\,eMBDY,Wk2]3\7(g<FltP\8$NY%kFs
+%B)n8rSCB$+Q$0inZ`mb]=,LYha0*uPS!+9/2NKFN'k7WF?*ij]>ie3$HSKpZlLn^d!_3m'DXR^$:JM_rqKD\e)gFu]@6$Z"0_`jR
+%=n"+BJD)`IieD;U@%q/ZOuk6HX`C[FAd10k\EtkB7Hl58`eC+K-JC$5n46Y\E66f(j^QEI.:D?uh9;U(QPH&`"CJ$<fdZS/.l%_1
+%.LSHnU#CL%1-uenhP3MrF*,FSKq/ZFS+1(\:,O\ZSWh&M+nFh?[5sA=YTX)pCJXN<m]O\[J63iH,eIcdAo[,fJ>FLKN at Z"2PS3>g
+%,[bgnqNdYg*/*@A2M-+7&"u#/R`JmBK[@aGf^pl084)93aXR6Zn3d:=BuRO#Tk=K<NCfQfR9M$d"om[DWR!3;FR@:#F,6%P=BT_*
+%)])--%;]Kfm)9m$D.AcVj`7Fh8%$u:7eV!6_D-:R;[[F_T[H3tX&VHAfcZMjg/$e.Noo>k`#8.3-k]]b>KER="\IPCI*RL^S$FWW
+%qrO1a2^3Qkc<uu]OJh6*SbYX]AW67F8MdL&-LdS`[G#PgP:p3&WbgWV:VdL^k:YO^[k'j.Pg[OR3./>pcQUI:$1i;,rN\7>Z#r[2
+%%L'q)ql;;P+ at XgtS9Z3^Jgk<E.4f%'.mB!;d#P!JGniMdRf^LY_ at 3Q0pSJB*93dX.^K!@SGBT.uR96`#J9&Is&er0Rfi+Cf!GIUq
+%c*8-HRT]QAl-JV8!)bd+((F14i:/A-nDFqFi<#J]ZT(Cum_T.0KJO008.LSLR3BVT7^rHh`(ScDe0`r/=?MAi,ujT34eJdWbeZ\.
+%0('F$WO&ttg;-Zbfib1FEbV'+eUTHd^q``V*9iF7M9V'Dp;k>@:oEq3ammG;C8#]Lc,qB^jE[^sN<^e<G83u#2 at cu1[]BmiI'HN^
+%$c3"-<iSm3Rr=ca1"(H83BgmgXY+fRHXZU#Ki4Ue!8q9Y>O33RVYLCp36ABrh(RsG8\NU\]@:BZk;h51bc;7#a-?b7fWg%5n508u
+%Ia#'o^2;\<3.enm%??7s#b=se4*S5b'j,D1U!H"eWKYV1[8eZ5*7lF:OE:sPDJ5LP03(2R2iaWDOtr3h<U%ksah3cO&3QkVb=FSh
+%Pap+cVo6 at D71<=.Fg_WM'.aEcZ8ppb\O8>UED##0Cm/;!ib=#2WAMn6CJ+NW"4hP]*hABG=jc4R8,s,71o8Q?9S(58/N:Bff'[et
+%;<.;eJdd3KFdSBI>N^AR!"e>PS-n5$e>S0nZ at .*&>]!LA/b#oIQfNLuCe;!ur4u<[H"81:c\nmgF.+[_m3#NfB&:i#g3P>h?qmX7
+%bK7&k^`Bh0-b]-e*7QDe3sU*Ej$%7YQ(0CP2tCE'O#U^I<*2Tk[ok1^i7o0on#bta(9aQV,-Qj0b at 0?2K4Rg>o<p$<Z(qk<iS!n'
+%i7$js:RH9t2(9+BOO_SA5KFmd]#[q%CN6EaQn=;Ag/!(?q<e]u4+X9`0br at X[L3n$F40QBI2RE4Ci4%>[lhnGcFT9HCdeU2S1DKd
+%Q!(u76UGDSbG$s-?T;krP!fR4qM:,bn44T\C>TOnS`[#3Q#]blb9P!")g`[WQ!(mcp at V,UDj$pO];i at 2.*Wt.3ZB,'f\u]Gab8p"
+%*!jH=\T=7odnS5JijnBF^RXKFpd/0elkoiS&jFpA8sn%\KTqtc9IA>N0ORn='_3h8 at 4;`^4DCBD?k+[g.=s>ZD%[!n+Z-$"5\.4D
+%5fb)\=!QJk>SWNZ^#0!gi<We0*82&@o:]hbQCP$*WtD04;-1sj>D/JeLBD(2G5:!;9:(!JYr>XY7:j4"=7rW8]n&:Kaa.2AN[>EU
+%!Lo8>iCfVS#XEg^2rSsQQr7tIiYG=+DT[Pk4LXeD<hT(7FjF6Sd\jZqTKfSthko&f"s+n+3<%)>lr3*D_AocmTY(]%A9sj?T?c"!
+%js4f34o3Dj>0!5/$;ca)Yl-KXgT!1^;aN+ZNAR.'EE8[-8_qt=0R.V5)3Q0&FtV*.EJj<kHH:Rr'VCrMQKDZ-O,1h%b-J)&gC6P,
+%-kXZcmF`be!"`HpS/jO$=Xu&(A,5HMOKFVi.E`+^4k+^:-`uAdl03^ani!EUTJ0u>-V+lUbAje.Lfl4I5:)Sca]4HW:Y at Is!g(je
+%1lJ*rjhk%u"stt$.rfOeE3*_s$2^:"hW1]*KDeZLDjg;/3AE>qM7%/1BV+Q(Rou^6o6cbZUs?Q2UfEe@]!80#q7)YN*Z`9V<RfXf
+%-FKTr_Ou\50t,=mI(jWF#c8E7J8fa5,nM";B;O2)p8g1"4t3G$J">kI[W:Adjb9mT..$#'IFdF[:YpH8FQJ4<!%X/LnU0[h5<O8#
+%#U<-`WTG$Z8eGf)_Y!ncJ10`Zk<@stH-k)HSj-^fX0%UsUbW-`i*FW)^)?")DU at es#htQu7]h\693e:H&4gQkK%2/gCis-N/Q7eE
+%-dkGX>Ze'BM=YbW)Rc6#%f'bj;*<$EOKBueYZRs1m?gVjGFgQi4/bU-fr!hmO50OU;Eh<RP9q3`^.Nk4S:@odE%qDPHm]G`-qC/D
+%-qo1Z[-,o6%qi1SdQ9L1#9G+LQ'u>_0S1sC5h9GI at U$*MLR"rcGc%`'&%3K#ZSIg<CV_XRRrHWW2'2?OeiRD7[QX?4(qBTENfM3j
+%!750'pJlOO"<pjU9WH&aYt^8Pd'aP9$"@+BMJ\iH$he7+Sr7psI#V:5:FoRH,e]-44jdVG<4:PlbX,>lpn5Oil=krm-[X\aGm)K)
+%#um[?oa?&?EAAqUmQF.K3MbC6@=reih<(qDL1;mC7De])3tZHn(7!l2CaAn9VhoqUTjYREXmH9j6rRDea3U$:ga,Hrm'qkSf^-Li
+%&jh`*WNpPhT^:(^OF/9&]%!RH$cNl964SIc$,T./OKJG\'XqsB:.s`C(NMJ=]0rsHd22%YL`SqdgsbN7c[JKq0WZn+DM%U&IWfa^
+%ZVC8tCfAV"ncVB[k34SaRN#e\%O>h-dQ*[%mPhbQG/]Y:)mMPOD*bWKj?h-d/DNO=Hs'$,c,.:%j*g"iZn%8HU1fI=8F>K$T$s)^
+%PIsie9/AcD<@#+U".1GsB4i5ENfkMEZW)2aNb at B,E<^"_TG19Z4[\9CS/[YIi)Bqk5E`?%[XelJ)5UWO>&u*Xp^o,/j>M\%NDEPL
+%X[kNS+[ZRmp`SI6ZGPP1?+6ekm5\T"J6`X=X3%MbPOVP6G;ddW<r'l-,3lIBfhO1^k!6pFMR:dK^A`DbSnI<eYX(Lr*?+9LAOg&B
+%qEXP at YT87?Ha74OBUZcR:4Hg#HPHFJb%$?HQ>S)krT,$;,/HY<U]_BY">uQJF!_.:UXFLjj^AIi.uCUjATjT27CLBZ=5.n at Dj%rr
+%d]sFkhJ?4RK;rAR$nQaJjb8;:1.;VR1Y_8l$C3N7\Z.`'dqk0?BN)S#+dhZ&&MKN#G_RDhJ;8cD9'Om.:o1]G^TD<^*[47[\2?H_
+%EI)IZe(iPDmCLhc-iC'lO.2HK>oP]!%pZXYR<sl6;t!`#H$kk4:AFLn&'9;UGPT$e>)F-I=tb:6Ybe=+5\N`bZs<<a!)4Y</>)H3
+%#Rd:P\W?-G at r:`ie\P)8jXu7eGr3h3mXRZdk\7F;h]LR0DoU6Z;RCu"D>,\q=:PQdU]]i+[O%q"%*Xg?@[V';96%srG5<4S[Fp6U
+%m0^TD2&FB,6c.'q*8B,:@e(qmZ8K(Hs-IeNFj*\@09U[e"n'jG^g4*TE+<p],-'biS8#;M-.i50`XRQdC3t#p?;3JP&:iCoQ3;0h
+%I1Fe&D'fnNh(o-(YEc3JZ<8^&@@_1K`f]0f95pK'=EVG#3<gsAVF-/AiPpJlM;[T+=B$C\I55bC*OOjO2O-<FFP>[`<!tgj;l?Bk
+%OCieZ#.P/#\7DVW:p$>Igni7l%!>oBUG_PU;<4Xs$(CoD.*s2iB<pW4NmSiu%G(WTia&8^c^EAP'VlGN;<@(WmR;Z:40#WMA%,/A
+%:ruJW8$1F"d9#Mrh%Ne3"$+7dEMNqW#N0/$Tq8OIFAtsj9%k/ecN4+jdQp;.ATjfpl8_?+fZ"f%,%ki#72a>;F^]1?qdJfHYgaEm
+%OI0<`XRP3(NZs_4!n%Z9+IV?MR8;rHfrp<$rV/L:_/7_OEK=tFBs*J#*Si&$e^&e7?05F#2aI9`2,,!&OQt8GiTc5SS7#V0^dWik
+%knQ<"?EC,4;bbBH6PbaU:g4Q.>BF)F[j8&Hrho&Oi at KD=]W.NUpU2JTh-<mL.Aoa6T[KF6bI_ltl[dL6N2p&%^Z7sm*Euf?(!g]T
+%,R+8pP4a!f1<6rp*5c=Q--WTSDETru82b6"Q1T1;eiR$m*0"3&IgCX^/C`C<+P=2BSu]6n3$cUGUPTUd/mau`ZYq`&aH31l?l/_F
+%2%[jQELWsFn"+ER/$Pni"ESU8/Rj)]]r2U:;=1O6,HrGb+Xj2HoP;M at UfD%Lg(Q%gK=nL+<;)tPKQ>jVC15ETZUrdW/N!1%NI+d*
+%6YSe:*5Y=j1QV/j8<98:Z/iugV,l$X";Vi(_=_#G.rs=d]YOe:4?b(g>;d!sj>PY]A&8i(2J:-'=n#.c=Q`nK,i&m58g+IV^h2hR
+%.Z3=<-q-K%QjDJ=:d*L>g5oShAHsH[@eW&C8\3E/,e`%s\HgiMMTX'k*[=cqd6-F<m#=)GPGFGYFg?.h:2K at +gaKp/M?VY%bH7QW
+%P*MMpAE2#?T-8LB7/GsnX_R.LRI)8>S'>;AHjJ47^()@aA.La.01U!8=Ugr6<Nq[!@b=044HCcV,lH6NA]G(?,[7:\DAUGolOeRi
+%Z"F>.G2$;$Y8-PrV;?,?eMpN:,^8=D[_mRDT^(";bHWY.__*t=_T0)V*NW_4/=k'$bP^S"eM7g(8U3A=.o*RN1u9d"3Y_"pbg%E!
+%Z75c34C7'#M1+$m8 at +b=4dsR8Xq@`\4&j)7`bd:Tcnp>o4`r!:'+=;OKWd(N'Dj)[QO'IoK?kdtTej1C;/Q"k1%qs6/0r/RX?m+V
+%;Mo]+5GDsodPs6#jL0pZLe\s];s,?EEZS+=EBj/:425u7I="Pe5Uh5=CNDrL3-aaI,R/YnUpX9bW_/Ar,PGqAat!Wk#Y6(0WP+J-
+%qSV>RM/S"j9K9:e;>J`l=0ROna\-g!A%dNp%6 at Fta?J4OGX_>]%b)X:eV9\ZV5KFX;9]Qh51HYZ"^E\E[6Vu]F;&VkdPkBm4A$b'
+%-DX5FjD63R#p71!S^?u(hbigt7\+4jY at 7$#`mFXChb>kaESdM-pIr:os(>uIPK[Ob._#_q9iK3Ja'dHVA3G`ZZ98Vq10"e9AoBps
+%qE at R7kG\`"c]4W9c;MS@)I^sk'fH[iF"!O`d0b8BPY(`)<Hkc11RlLmK_D;K"Le#-3>AfiQL&HK[ccOS5m`7q28ZeXFWQ;eJ3s*G
+%a3IYGW4"6Z^H<O7(ojWQdT6pt\[fZuf<+=4>s5]!KLl(u'f*#&9X)9JT(W.f]biig6)%:!]@_fTXf2>02UsDA at EN:g#g9L-pYY't
+%/iEhmUM7#%kfEmfYtE8Ak&FLBcU:#80cLdMk1[-F8^)sS[jb=VDoor=-o#lU&Ss\>jM%'#ohC>#/gK-!>Er`+.5^`S3Fg/();'C/
+%$B\=<:h>eS96G;s7ZAf4j_MY.m)CM1?Au*6#739reAMX.MRb"Hfa5j>7R_:_A.VX>lV_8<T.G@[RSCbemhU>\m-K/:oBqt3oep+C
+%#1So$.<pnpAAj>ODOjO_`6C<)A.Ja%:MH,p3350FXLOh`]4)EUkgoK9O5B.8,W+3[]%QJ]WLh0t>&poe6ACaPs#kSImAo at jLQZ2g
+%K1cZ at h'<j$\7iMOfX.6'=d?jT[O-D>CK0&a^/la\B$$4;5)`\>5Vr[oPMT(pQ::DGUU82o?V%F^<>GdO<!`cRmM=6``AT("GPYI[
+%MT?MZCHZ*1_'WTr[1fu0NXS<B#`sO]''55cSdlF4BR.^<A7)(RMs;KY/>E2XO0e/F-mRedM?8[_!=)NXHonGbJF?GElYXPiK(_*N
+%Mq2!rDO!@UV9t`C3Gt"HF2))m+imWe<a=!X!fI`.Ti\Ze7R`VtA!uDB:6DdY`*M58Ke-4j7'W:tG<VRYQ<(;]PP+7+'@*KICR_DC
+%1+fiJo35bu)L=P,.2705"NokP9X>s!g/\5:;/gOjE/\>D9tCcq.FfS<")ZpqcA4D#]0kMsbX#lSTAiGqC$OF>"6ZtSDs^:)!sV%3
+%hE`G?E$=/n6^=u9qlPY6DN\E/D`k,Y'o?%gCVFa\k$YOn,c)A_8N(oNGnTL39X\J7mk:0G>#n<g$<f&d"tUfqX'UQ,U3i'UZqAP1
+%YQ]d+EAgYJlI[AJ-f[ZsmmXP*9D4H9mX=HFW_^.W:onAn?Mm9C)m%NQ!KN/7l;Ma1i14D at A<So.EL?p-B$6WGV#p<598UJ[?I%N_
+%+(79(bTQig?:GY8/o`>90sV*!.!\FF0^jeP+VFl,b*/&=;U)B@,Zu#hk';gg8bjZb,OMN5[5G8dPJPJ_2;GLjE'3;_h.;KY]<fe]
+%iOk;:'W6#/@QAE$\Z!Y`"BLri<#\W\p=k%f]>Gk at KMb]K*8 at b^^as<Can'>@k2[r^7(I[*=QPRV!*HNFOAM/1ie0m*mFSDKe$:8W
+%q:$`DKlE\.WJEa6%jm4h4OT=^dKE;oAlHYpY^=(D`H45=Z1.qp26M7,.F1pHU8I2sXdGLb*UbGtZMdIESW\]'?]J29#JLI1=4ngq
+%o[9TpnSqgi@\P)f2jnlHcCWMFmanD.?(a&Q>=ndh&dPeCIprd[b68P'Z*)!IAUTnVo<Xra<OFed\5!?WG at gZm(`a#rJ_3Wrn0/MG
+%IVt%U31?^rVhL5M"(4<o(oEGu%I7RQ7WMCJ.3M,r&ic%/'a<\AbN/=,U.[CtXI`ZNFu!)%JS\ahPGH.U8u7o,eWr6h=@FuMdZU,\
+%gBBjLA![`U<R4_3'W2;*W?*O67c:95AK.c,=imGf79]K*@WUu4GT6TMn?sofe[Bq*(EHbYAhMUg..E#9Is1Xe>*<\-,+;*V@[gn0
+%^QFaX1',K8bd$Oa;+#Hc!^b\4S!T4te`-*M_;QkK;jYY+K]ZB(Zl/:n!DnqB=\u6Zb at N%+8P%!?gI].TZ%W(qFlMlQ7$&+_jO4*B
+%)/Z5K/&atkB/tjETfZRa($QV`FMP^rkd0=\@_n4OJ-RNcPS at 5O[- at bqa[)A at _^Y=/hF_Y??:d0P-;q6&$^r37KLr=)K$Ab.D[q"8
+%B at GN,3'<XRlq88'ld:Yu-*D6`ikb#lP1!s1b73="="+D+q7eN;,g?eIR<b#W',E4ns,E!na)(-EQ?F7OX:d[!B1nojF)anPk`V/A
+%16m*m$f\Id2To_@\*s.3Pq;-:`"g2'(t"-R4mUZDb$n':-d?A.%^Eru,bMM:H1g+&*98&j?l9jE3Pg#1c`Qa0(a=6Vo!2;-fUJs,
+%0kqq$NACs!ibE1c<DHYK1Bb/4Y<2Q_WqVk9'+4AX^/s[I4g%*-GIuRH\KYF_]6Qj:B\p"6RC(cCA.(3&fUFX3=".$*F*1)7YRi]t
+%/e5q]dk!3T@?N3`KGX?Ib(OAtLN=0a3mE=[@]Q+P\uN(3 at hjaY-?ZtV("0J47Fj:6n4'e678Z,M16\QBSpC+tFYe9]\%-)JjXQ<d
+%OH^^2$#1WZ-l?IM9Z:@OJ*c](5Wrk9m&Z]JRg1rmZ>+2Ya*IVGM&&[4Xpi=0"^F<9.8>45NERW51Aer[/j6O\L746m00>Ee3b8a0
+%(+MIe9=(3S40ngch$$N2dF?[%,H4O>mBeCP at s4$8Z=edLG at A]UC\(ur!8!$:=8lg4Gs-D27+#-,Sk5C''<j$39t5!m,M#G at a><Og
+%bbh==Gp.<IM&p3Al8"Wo_kYUF@<5A&Ca:RQVnIahWm<[6M_Q`IQpdatESdW>OaV`7&@pdWat;83ZCB?*GEuj!h$))3YE(Y'4ror*
+%i)<kN\f0HDA-=)=PZgYaXDTp]YVH\OcUNNBBqOd#.??>gP3hPFlN/nG^ZPY;`cGZ\VitZkQ8)p/^s at PR4IE10(6Y,X\-Vnn:\i$&
+%'YQ-)2mc*BEGFh-Q]i`^(o]ZholdCiq#^!XK#uUt&$^q7b@(r-faX_bHQ+c&GBG55m>CLD_)(a\1sg9G!t855"0f(&/u"``if*J2
+%`#bDbWgD2=de_&\iEYFnd07T>"nHB:o^8$2ekS'&VM%lpPH>7CQIU3d;\2(]gL;P)ECb8.D3hr<]1'\K)fN4qeW`4a;qmdH at E)H3
+%<[5u54VS096r?J0%Zg-1d(;@O5t]lA3B>WE4D047nMK$q#7mh4"m9VY--clX5"8J`.\tT2QqB7s'fL]SCfWIYNB#$7H;R4:r^1Bb
+%<\'Em;'PODXn/Ko;iXa;)r*Z`WL\4C!a?tTOH:A>^^&W69)=sXniBU$GA/5$Z]Tid/)56aSg4kKU>.ufM+-0Bf>tO*8T;?'9b*bd
+%F8!+$T'oXe=PTU!W977U4nLM+'9`o>+fh/5!J!+?bfJG-XB"Y6=81;BQ]q):EW_K at eZpb*`D4acg1[C>iYk(QSki@#CIrrbb#QhH
+%'riSO><Kc5c)OHk?k%76A40IC&^7?[rFl`8l="<"EH)U[L<W9AdJ0OOF:;[#rjER]fgMG*J9lg]b/N=MU'+dS8n4>j)EK.V\>2?1
+%3m26p8Wl*Ak-5X`J>:4YSXB"d(!'dK_6,W[g*0rgRV*c'6<,,gg_CMNdEA-/fV4R_>b7gU.6I?&Q?<s6Q((#:b''`aSH^O+Co;Zc
+%d`M1),-fg&8OcAH65$$bqBTP,D(``R[\M]Jl&VC)=aBTe>H09ONj>iRC;iffA1j0-ThfDc<mN+V"n]+=3=@!]nST/P"(8%_?c4Bk
+%Hu(\jeY`hD"@F`*\r!Jd<!`q_kUDY#&k;46V8SCeBI5aHEOKcj?>?*sH6/HW.NYidaJhE2]#Z39P-$e4TfFhXG9ifJcXPq)ISp`j
+%.7%B@*F[@eo2KPJ+R\u,C06d;/aW4NRM>48=aX at H;qC6]Zqf%=+t?)&/p[!V;!%c"`+RJ`(\62krd"$e"[C*Rk6#7C'c,Np,$J;a
+%.'TnphK:?7TKrQG]:9Kc.PIlO9(W0g<TjY)e7;uFl*1umg$P#%;D-Ve23a$U*;ac"^<7]g<4I&/4?7hF-#d'MEDY5hF!<!<?igs&
+%Dl:paZT_7fWKj4UOPGW]dC-24!jL:U._2E^+U,$]#U-"(BLBbc98[tGXa,><e$.5[3>(/E?ck?-kOt(_\r0Oh"7M`B;;pVFJ$=!E
+%&'HKm?`Kru/)kKf2;P"$gPWm#G*2_VrSO[Urr`6bnH&TXdGB:rqoAEu&$Klcpr.`1F8l-m2]qtXhi=mI^[Wt,IK/K^IiRp,q+nZg
+%%DV_rrp_q^r1!<F1&U,dj0-=,hre?r1Z#gZIf8RohWS&%+Kp7aMuW9aZk'@t^A5D7 at IP`'NVib/hV;VPa7 at hnrTg<8Pr.QUs75LE
+%hRB\6%=gOBGBP6/kZ(7Lo6((P5J3.\?hnjEnE,%DO3?SHkBGfIs6fdSmQFp!s3%;ns/S4gID1.$c(FH at aB)aIVmdaSpMp5Vs7#a:
+%5JMRDp$Y-#s0DZihk'gks./>fQhg+H\=<A6rquc5puD8K5J66!hgPCq*VXOPl@/c&Dn`d^PFq at Dr_MSQGkX?crUIAqrHI.Ho:O_Y
+%q7`bfEb4[Rrq0&nfDbRARm6rI]^igra$oUe5Q94!pOE5>:ZMAnf,skXmoTDKrHS8<+$R&M?MD3[oCY'&*ZdQBcYq,!m[MgH`]q1c
+%s4R^!s!:>:UYl%AmpGfR]G^1qhojKPrq;iOk5;j]rq4l]T&9>BrnI<g_`dqcrnBF4*U[qHR=G8)-h$nSqtC$Dhu5N'hsjnP#VZ&q
+%Ih2/>29`hMI,!QVl1Oq'rq!UOYBdkTYPu`2o>C$h5+Iu;GUYA-\WC0H@>j`$s,e[R^4,\HrAPhPS$Tdi5Q,!hqB+JX2]qt+k at O4j
+%k254ZmuNt5QdJ%1I<Y]C8F91Kn[iGOHM>H5Iij-),UL-Z?V1&-SsSJW)_YQODs'R:'Ti>uVXhKPpbb4LkqD16gctY at q]ETMk!&d_
+%6h\LjDd]g4T>^-G:]0C2qsg+6I_)(W[h%q6s2j_ at K5dGhhUA*GGCMN$fDk^'pkQVr98p8AIeJ9iBE$1TIJbK3)=N_ph[*5DI2\G`
+%q;(4Pq:iZ4qkoLi,`he%aS0&)L&]:c97$K9=RX2]?_r/MiQLEX\AA*,%K5POpq.UBYe4GH\aUt!qhL5]qY`qaqV`YQj_jULIr,R_
+%R2,_[j3IK6U[L9fkC8!ViUPRX^&FTdrRmZ&g"$#^qqnl,j.&@6DndC_`iG0pDr6"jn)(g*2r8q,r:^-[rdI!0q1nj&GPJYn5Bu])
+%5Oe*%5MX#k><Mn6Ism<e:VZf#eQ76:Ii*sA5_dHV5JHUcnL$R$H9;u,K9l>`gM[<<l0Z+Y\+-ZrO0?41\c%$9_SV@?NeNOta5b]g
+%\=8g<Nq*+nLZ`ILFD^rm48Rq+f2k2MSr^(",G4QWh)es9cEFroK2-dkdb;C!kMQ7hCZ/iY`sY+ at X?YJn]IRkWhVWg,gtVAu5&KoW
+%a3)YLID.93rf[`ShuDq)hS":5=PU+:[5VHRrqk+C0Y_l1C%V5p=7ZguDZBNBqpX"?I1A!ed_gQ`r9EaUqp.@`Yn(*kHtQZC5Ioe/
+%f^kBC\j+EVIs_tXo_FA/^$+u8:TO/D2fJ`NRuabET at 22rUo09'qQ%g0=KJ\jI/JBj:VUc8hR,So:OE$)l-1<P,HT?5o^?..`Uiu@
+%rU.S9]Vp2PiG$.(_;h72+-#7ZnF>a,StGmUI_Z&1hDq2Q1,o/H?J4(Vrc]p^s2`X&=P5>Dp<u[+GNJb"k8jKbrEda8k4n1QkHCI^
+%m/5g\*t.nS9)n\O`H"2Eo9Y+i:&jHe?i3+b]6A2(*acs?IJ%.6c^XP%4WhG-h_Ne5h]M<T#5XUgqVoQN`^`6>c;3sZ]_\"Ek$s^D
+%+7oDBFp^.s`TMZXb0Ll6\G5<rbg6!/k4\Cb?Q/RL,9GpDGL(L3DJhqqp>aJDKr7/Mq)Rp;UJ7hbqJm*VJ$4f8nWTYonQ[./[liE,
+%?h\eXs8?TRHN*/-UjTb;:Ug2u#8[-q-eJ1\0YX"1mFg;Z]\Kuus'_F)quZclq!*<Xq7PB-n+uh6\)3\d>I`S6dr56AqmkU6p5V="
+%s%bk)`;=6hc]@;hfGsXXg`!q!5ImkFrr'J!rqB`k+,AU!p^B+Sa%mNE`ARJtn"4(1h#<r4K\q/\\1cjeVe#r2I.P<Q\5Ik1k<8ij
+%Ma%H5rT-aLQTkAro0Sa=^W')VIJe at dq0W^&H5P5RBlha>J$R7iU/QHNU%s;4=O at p3nipS)F%;"`O'>sr3kq^K^SSZW/M;-OmAC3a
+%BiF'H?i=3TqpSG,T'7&Ol`8p)i;D_3qtC'bI*Ku%qNik<p.Nk^ppG%IJaoYi+$Qme_c?N$T.JR>DoAQOqoM8jhcfl`6&]%,ESl6(
+%r,eP"s3.scqVhb+IsHFYA%fVJ2(ul/Zh_:V?]R-no>-?QkiML1)*E?=p(=BtI)";(=K1Ik0^Zu,rc7P#U at QKhock_9htIgdgf*[U
+%Dr5rNLeeQ7b at Yn2dYWE>L?mk at 5+0Tl"\N.iRf<\dr&H#b?be$'oGM+cn]q`L?:O6Nm!X."YC720?ThsU5+AbTi]=7>7o@=a]m_nm
+%\bP@"2]j(E$uSpLp`,#9`+%h8PW0^JMpM"oIeZIHH3F/DT03,HULe\cKMO&We+LtPJ,ZDtio1XJ8>55$5-;pCn+]Uqhi+ILCka.J
+%D#T15iTY4*pH)7"k66;1[(/^`m3KCF^W./$-UHeO\*u!gbIWnb^Ae--Vr at 0p4Zn2il=H.R+5Xa-*^BV`O,KWRan%mj'9&QUbj!Z=
+%Ieio-T=jC`PCE5W:\X["7RUbGa2cAppVjHlp)BUNc5/G/(OuACFoBq$mp:MBl"N=m;GZ9HIJ[?37B#8'`g;T6c8%h87[TeVqlA$L
+%h:&9M#"?9(3W;1Tr2&pu2Xb8fC&ZYEM+p]O)=ASR^@K7Dgoh6,E1\f_W/l1SGkE_n^A?4tH:8>YoC9di:!EP<p\X>k+$M%_5Pd-4
+%_oKejTC1ZN?M"BoI['e[r4s-C;;1o[,VLt6:Y5V,-[*=U2C3gJs*jH9cL;"KJ,f"&5@&QDq>]I)4kmc1eUBE.T<YNEceo*k^MmVR
+%J+mpZ?TP:a,c5L+8qhcWf6W1tALRSE0q]V[hXI"[l2NE/qJX+3hu;u?K#!_,J6*hBHM;KU4 at S2k<#(IkGPqI=r at e3:?a7E6h*b$:
+%q_t-RqJT[0j,a6>>s5F5X at PGRaOBm$F0@]Sq]j,[jY+9d?i60QoJos$&Q@<YNre6uX+0rBO8P`#q!L;BJCF;egM&r, at 5"n[YrQ.i
+%o5p*Z]:-D1B8l(`lFOaf5""NMMl9d!C%$Lk'i3qG+!iUJf^n.$Y<Uflj?oO,i,],&lmmM%V]YoJ)#LU^EISZUSegg,'M]0,org#7
+%kg'C;Vq([t8G;=]_NDt%95O*=U&$'?qcjd5"R\HDB<UMF0)1iini>])'_:dPBDh52rmPZ_^!D)riYfVIoH-<,'suPY+m?Jf'HS!T
+%QQP_mdiXhaIe'^qT7L(ii8ca<Fj*o4`B6:7/o*Ztl"]8"2FT\kG.'R&8_lSb-&*sP5rQ,)-0)1Gn"["*(mIT.EB5?X*'.CHKK>XZ
+%P`b`sFp]We.JX'!(j3OCB[blckIr]Z49'HM]Vn\OSS8Q1P/Gu)?<07deb+lpgFo&J`@6f<o[fZfb?uWWo2)53mmi at _D#84Ol!'4u
+%Y9lhJfge*s&lOqS=C0.W`nQV<]WEZRmmiC9T^X+_8h+OP!cTZUm]1(QMo&BKX)ma0dG'%YRqQkjWMDmqUFXCF8XJ7VBrPAPF1)*U
+%3g6Na*nNsl)JhOW96O^2CPp`XVu.[nOX[?13-Efq!NIZ*]_5W/oBZIZiXSJdn[#E-Ce:2LrB,r>hM[T^CYP:FBC`8T9RWF at +,Y/1
+%:FUN0`='@"='1^_fkfir]6oR8WdAdDEPj6+?/6;Cd*!EbT+$la&!OPP8O[+6okLVL27G"I;7IGa+."Ysoj5X at G8p)+(5)"<;E\lR
+%+5:ZF[YG4HIb@,hMMMr>]_Ad9^TN`'*N;N)XE`--5F\)j=X"2Ehl`Y4=513"@)gf5YK4fjQ=t>6$J^ZA=YZdRWnQ5Je5hVUf04(q
+%f?(OQ\V(aZI6-]X=fUgu7*T7*Cfe5H]emQf_SJhpYV)PSAaO]Ea*, at JKbuIS093p051@5Qq_FE$Pa8&)I4YpRek%$)m7 at XJDeZn$
+%%c]=XaJh!I$$!6+mulkRd0?EZm)P<R9:"8rT at n"Hql:I?7lbD;?u&C2?'b/N3gWheT1.mkoqR+jb4_EKXr'O>.82'S`F`bg.a!tT
+%36%[:o=CbA);?(cps,M4%MZ1)VP<VC&;!S]k?>$">8ls$3FrF*Wq,Q*oX2>SH[f+d\suG2F^"p.4ilX""5^r(QgL:^FkLS9caAIL
+%;,'CI-9GX=i3CKI(%ipb`Q/j`($"S>-qdkdce)`oe3r,CN^JtVmZ?W*lq5e[C14Wo-I&uH*UUM]8Pp9&Gk$/B<]i]AbNKPEYe`QX
+%bI<3N+3LOj]NgIkBBdsu2=U+8ZF5+JapQ%Kn9kef:Xug7P$N.bdF`.(D!BX+C#oT._B,7CeN(JlF3s>'a23#V\nn9l=1kEW;fVFX
+%8ZBD_l]rg"`Th:&DTB7:5BEQ^CRa?bGXeUk("R3LR7g/f'A[GDD!oI4MCNbs0lE$B*srP3?`Y/o`5e/ta#1`FAr4S>?(F?ilR<S>
+%V/cWa0#m&O'umR]kGqdm))40#-db5e`s`3`pM3^``2VN7f.;j3fk)JP!.qa\Vto\'_<c/j\DD<um`B?KY!o%m-<%faq(47)lOqk9
+%aToKN17SeYLE28!9+KYl4+/A<j7+NBEGamAm*E3NQ$;S:[tWQ#_jb`GD9`<hi#$f4lbR)gGl?n-M!_,G%q1a&p,KGPhAtJ^F\`2A
+%qgMNDAm8MA4kY57^)i&QC%l6,kMB71c^%B)*\M'`qp_B<5$n&*@Y,hVG[dZBjWH_QWKd>(`ok(jk.=4e9]QXsk=IXQOAu/O.e$8S
+%%<Y8SgM4f"kr44rp.c\Ope/>/4/,,2P"dS(,MS'A>BWP3/nl\CAQD^1Wu*FFk=7[i8ufC._mUOh$G-]kQu.d351`>!-'6Xb\$5Kl
+%dIbGM?W at MS/fB/TA**"+?7?,KBQL\CrQ;j9fQ-#gB=V_&lI_n=D)aDPTV]9>CWOk*WiCPl#bR+Z"^-Kb,>I`B`NiUh+ISRR7I^^9
+%k#EB)`noA5>K'>UO'h8cR9nR25`L)r(V;cqjqLe'3NZmthNlD0Z"n?*^%FhiCrO+k>M7-0+sN#KT`AAeF"+N*MqD!e6^A5d>`#ja
+%Ho$\W]V;L^"A'?kA4E^FZ0)GY7=l2s&a-O?IEaX>mdm,1P:Tb$'9^YKX.:llAHH?YIMJoGek,;YY,%=-s4u?VG'!c)>dE1AF4?1X
+%=3:/`Y!Y,*4Rdp\G1j[E\=rFn95b;$8*T>r)QCg]eIU>FEFETQ.Dea%Q_utMWN05Q9d*&1.e''91>=gej\UDkKfMmt2JKjT<YDif
+%fs^UtC<p`ufnfO%P$T.'i$JaE)aorW--2l,;0=W'WO!;EPIF&]@^f#q>I(TKn$:_1YS/"%hDVtJ!Hb?F90"@?E0.OI:KXGJ>?nVk
+%!+*e5a<_!3/Ik at lZt9ki3ju)4/pY^IYU.Gh?Kb at 5[O:noD";t+gD7SZ+$;q:!s#q^j?Wp,)cnj9Vr9O8 at oo*K'Zo=0@,L;3!4m2A
+%M_7`;#0"TV>%P>"LGeVhWXDGD$;sm+I8XoTE%QRA^#q<KaUP^>R[S*Nogb2EM(k8N7<+[M;1!mjF4ppV<I%7kX,r5*d6SEBi at kuf
+%=#(T=/.djIeum,K.6hGcI(N5I"9H(YRY%%G5"9Qtmd5&]R1o^YV!L"T8pE+:'V)?@EO21Ib/V'Qj?+fV:Yqur)8^[Q0:c%L-[#qt
+%4&,gj+@"6,(56+MZcEbOmg`+N`+T,?fsFr""8cJ@#B*@C*HdkbNrk\LVaUXB]-Jb*\D\qX&bTXXn9`oo!Qb\E&BXJQpYhXqAdT6X
+%':=Fcl!Cf4h\F&gqQl\sGn9hU9$&:W/9*XAl/\MU%ZFq")s]D9:@J8a>.c>h\gZbG34/un%cfTKZZ.H5"5%0k;PPZGE[Wi8]\>h2
+%nfKbQSlhPD<G`D+M5=bg/iWukLR)_M966g1<cqm,<PcP/=C_K=jPfnh#Z,Imi6,u;4R=gUQTEm>_$`@RN315pWk,_d4AMcFX44ge
+%"YOY,PkGY)EXG<`-!6C5HZi<uLN3b?7)HD6Gb[SP`:H\)'BB(`LAp6 at PP]m'clDM="(c]!ULG0?Y%!9g*B?:3:RQ/-4cX+GBIMLD
+%!Vn at 1$V?h=$LjnE#"q!s=Z=D]XUaWZ!c8%Pa6g>&r%(AWE[h[Knqd"s#.^?Z*1a1?b9Z?@,Zp(A9!j_V[pGs>29t5Yp7XO[WaP1]
+%0'=8F^8lX9ZLLW)6(VV$=TTMSZY[:[r&-Y/jjlWjL9bohhR8UaW5Bhbgb))O3s6)JAO)7UP=mXqUaC^<J%4Dl`8bFHqs;S<$+m+]
+%q,A'RaaMCFO at XjGh,*MI4!jp<feU<Qq4.p*Ce0E'*>f$S9+Q-L!ton#<;.5)LX.\Q0]#F)(F29m4$-tKC/XL$/9`OISD>K5o7Sbg
+%JfUI`8Q at Y99AmQWPiX_15*p,+#`?0lh2Z at C0=:r$#`Fm'ltDYI9*_[1LWYoH=X?geYs2>^.[#u5(JeJ!&o1(nM%dH9Ke8%RXU"8-
+%/0Q%Rl(#rt$f9Oh;8EhgUghYInW+jF:f'l[cTrF;KKErM^<i.a;8PA^BTAmY(`?!m:KEJP0ZbUa;?BV40K`"3EZ6F$`YCBfVC!&2
+%38#k-=^td"<"P-Z]u^p-ERQF=IB(d8)k"M[\LY^m96>F'BtIfEB#/gDee&'/&t[2KkVOV?;fO=cb>_1`&cfd%6A^T`LY at i,Oh0hd
+%P-pBN&b6I at Re/J[k#H&`=1Jj)2&^%"#bd.*9C?")I972ADf^T0..[G?>Ki#$@lr0WX^t7UMVa!0b?5:n<D$_',HPDqp;*d?kNMKE
+%X)$1[I?i%U:ls)H;9:&P*#>e$Yn2='%VNV^.E)?)lU$#BR`47OF\(.#VZ+L`b;rF#_?*D8![t95qsR at R\1-QZ,AkK&Pf[sY0fWRX
+%/sc%(F95kPCgJ at o7<u`*$'^CL5KWAiB%l#Ac1)51hjg'eAZI:$DoZPr[n?t(W46k[ooos!Oh*Un'ejYgGns6j$Q.2ql#7W]+`mLR
+%l8V at 0D<jP]`+jih8g%fe]EqDSWpA.:YH5u$mI;s0F343r`.WN>I?uDP;R4Cn_98!uZWs/cE/RsWgXHj-#759^Qea#j$&>u=q/B"O
+%[8>DE<+_4gE?>):j7.PFf<CFFaS[JG_BJGPGD%(<h!k\c3[gJ,Ic.;oXCTb*Mf,c,h,9c<]*_dVaIMd('aKsnHQ`KW[q7.SGQ)X&
+%9N"- at K9Emhq^-g,M'5`L-Q+1S:k:bX#82"&4B2Q,8GhqegVBmAp at R`7l@*QYC[0Y(]@e0bjCJg*.f?Mko0b:_^_T9HDf-I.3tB1p
+%XAr3+G1Q7EA]\#R?5g(C[O76=Fj?sH!8b"LElXcIgSrak:H?4Z)X`d!8:oT:<j&gqJd=N)=E,tA'jr`.#aeI*17*po=.Q!.SN`o)
+%_J[5+*FVY$B-(TA:.J>4Fdnj0O/Ebg>[QD6BC*]tedH,4hHE"2\u_R;;artQo'V_("$u::VOeDtP"/lbZ/A(umA&?YPR_7>k7W%$
+%s6%.`r6*cUDSR,mc34KUKnta"?<*Fo at P17P6UJ%N3[jBEjJ/1A:oj`6i:90X1+f"..sZsQq#=9=12K0Y:R%!_62E#1(pT_K8#Hb&
+%B`QN'+m>T52.=heTR;8(9-g_=Q1$FZ=o(jM/6.bC`5k,'*!S(^bKPPoqd)tslO.R8fAi>'N9 at nWIK[E$QQ?7D7I&_VfP"o<4YC;I
+%M#I`<8ZBW<bp*0=[q#u8;EKZ>aYEpi/ZpXRDGp:<ZLUkTM\\gBbsh36b5e-?,.pQUb*9$1Z8QdK;AKqG'L>8fgKgW2W=IVPYnja'
+%LgLe_9.96D>AGJ_Zl>LmPkdmWE!6Ar3`HkYpZ=a.+rTVOf&u9WL.D[46oX<sU=[cA=Wm9*'5c[o<?I_?A5lHs=F2F%FO%"he;*3/
+%.8$[s;lj!!Ai]h+)-N!p+WmWT%3cm+Z'o)rDWsd)mdo?cK9,=AQ%Fc'#;5f:X*BnF*k2a"$qWc:!F]uDN/g-3X%3KWke<9^ZUVP%
+%r%n/_6ni?](K.4`3pcu>.353*)%2i8f-D5MQ0jpOLpu at e?"V0U"*5h="Q6*PkNsr+Y9Yi6QPLM;mgSe6I at o+:B8;&ucnCdIK7W/3
+%O^-EkD^ec//'R&M[Kp;;-"EhOY#AuN0jB$1:sEWTAKj=B##W0(p/->CMQ2?*'^(>%nb!NY!o`qH.Mt#>,p+dbIQT=[A0OiChl]Ym
+%P_N+*2oJ)O4!"iT$;poh>"k3=e;7p,Q.#><iO^FRnAbLPD;lup70L17`dDGP<B7A&a(;2Mggj_hN.r0"&]D+[9d\@^S0`g3g9"<5
+%hkVBdAY1N4FI!pD"oRe/=/_)#"6SPo\oKT*FYOTIm4*dq5<"XA,Y[kod`8\;Fcf%BX15.`:2X4C7E3\"bD/EA(I==Gg6FNA-+.u^
+%,uU at WUa@2.Z0XGqc),Nh':H['80V1])'m3Qk$t"C<+(mufL#LJqF_s'H4u3GLS:&'f?"q"j\utg:/Zh=ZFX$%rTlVEKj;]N at F=Z>
+%ct2s5JoZrs.$Rogp7s[[,/?j7/R$bJR/9V^7/#qto2I&4XeN/&WH9)3`PMXq`OL1N_P`b]`g5\#PlSD@'8S9U1*DTV9hZ.$?A2+`
+%iNpVH]jsJCWHD4>6^BJOQILFeAo_nNi_7**g8sQhKI#!7D^\,(/ol:,Q0U<)3+1't&3n9%b*;3=)Xa3$!%H at T+>47f,fop2[qh/r
+%_fHiTDY^>4E@[&WZ0!Zkh!4)Jq:Y!UP[`1k3o*j)fi7AF"A;*3dC_um]tEhkk?k<!2OSWVc;u3.gD"IAHn]Qkb"?"nq%\)(LkJ(5
+%?JLY-RjXkO?drF]J>BB:Qt.6OU`p.r;`;k>V(>XM!(F#g/pd#\l_KBj<03226KS=.rY/\#TH::2U.>,[n.$+-"c%OVftlrT8WpSe
+%J<BE5%O)S/S2^,I1B*bI@\]qZ5P^mtfrb7SN_tt8<g&SLQhQ,aUu-s$?U!r^YV,K9o:-MPg;k:j?QK2eQ'2QTbIAuE2S5T["Vd8/
+%s'Um/ep=Bd(=.'%@ho0NePk,V[$"EgNR1ksj].EI'6jsQ;14[S0K1:&eKJCSj)6l1SVhWB4&J@>5/J`,&ohAALl6La'b8l\CDhL\
+%)/mVXJ/c=SQsV*Dj]BQsobHaS'QV)cQ'*o")O at jf9ddoVn>YQr&g+Mas6%6irfqmL5sEX8/1GoO)0L0?]4nN>VN*MgRDa;o:cu]'
+%P_i&V??\gJ,IjdWe;uR(==A<l[Fa9:CMrPfhG*:3S25%^4\"a%h(#Jg1I[c^dt`3ZZHH=aYCYci$26mGZ+?(Pai3.n'C))nkEJDQ
+%*r#c,NND3ti/H_GGpeNd"OsVP6rl1l<RHOJ0t&X3LP4i2)AY=p-OGfP+%L=6r&;qWQD"jr;u\!P7[J/<#-ANB8&:O&TU$@fb_LHl
+%\$QT?NAI!9:rWU4TZWO"OD=H%&UTH>oZ,pEiK5(Abo4jrfT(2'-'Et3&&M at -D/cLPan)<G+,T^9ULt%f>1YJHO;HUL08X4a=VH.\
+%FU]fC4]dBJ:BGkh90e([(slAY611ap/:4)49"bTrO5S, at J;J]?,t1WC9&T$?IB-7&Y`6)m[QlalZd*A!*,[gibuKc#h%g%h5V1^j
+%_$u^![[@m3X[m6sIEKYOR06JQ/0hH(3R5uaDRm*u>@X.60S/e#6u$1`e]1R+>octiXa4m,dd`,=WPYj%3qf9dG#aHni)R#dZVgG,
+%2,,eJ=e=o)B at c5+->#(''GOd56$nOFbY0r+X,O[O,G$*)C92lZ9[@9+95;T)\OSD.C$U!=@>"M&/%/I.ULf3/DF?[]%\jGnVdcmT
+%p6=h"_1;V8/rL^HQL\&+03^#Jilb<V!_lm^abP'JT%e0=iQ2otBo.A:[CK:ild#d%SnA(\D(687JlJ_;s/Lq'Wf07ch at _c*>)#n&
+%[WG%B'X2#OoepNKGlI7SAjoj4Qi!'r:>c-Wi%$sA"67=;24m**Vn.u:X7%(+I&%J6*WR^3,G/LgG+TMnEYMiL&iF&gbB3r&qZ5tC
+%.>eBtUfA6oi:XsRoIS7U at UR18@5 at E6k#&<U+D8.tba2r8HsZGI<k/O9P52.\57?2YL8ZSRPS_+^S55 at E?=>t,im]MQU)2UD>r$b.
+%/**/KdqYDB5[p2K@<Oh;(+?YsICGJ(26BrIDI1%h77TZ(o!Z\lVu0^q&J)fQ-4*/+Tj>*7XG at h)>^!@5fEc5J*=Bm0lP.,n;Io<s
+%?k8nM]A$/_"I0=t2j.G:_J3]B)=B'$Wt;h)kQ2=AXor&Y7;3CI[Sp at 4:Q^8j'Sj@>MipRUV)DJ\407G5T(1F];DQDrd'FZ]J1Edl
+%4;EVk9Yl?(DQkT at JO`e6bmk2>6F)2KXJAbSMamuim*k)A4@\\m\S%UM-YJl?"m]!/?:t$UAH8%0RjVjJ8_kU8roW7!Wt)hd!i,$j
+%82kK#aAGt&;*8%%d:,6V&1sI#`e1X=7SK(S#C*!VG*4a&FF_i3kC*QVAFkfZ%43V,O!3=]QDQYje*$P$1@`tK`QOIL'aG2L$g_Lk
+%XRasJ0j`/"aOXWCO<<+&\T%+]%$*)88WsdN,uo#@pL-`ijY!YDpmpNC`3ZeHR^0,0YncPm]48ooVkoKXZb8`[`cg)N,eXIVEn_(H
+%*.j*HW2Ypco)<cCQ[!74XcYK`oe"_##F^0^@dbWi>-B7dk=g,i8t+25T%3u)jPL]dP]a[:7Nd_s&)sBU'j$%9299f04B>7D^unT@
+%$.MAe;bMp[Z;,eeJmf3V20Rmk0gSPR:VeVS at Zppadd&$Tlo*Z]R:ZJFX6<9@]6S91A;R99=S/JH&_VmGnRgIaU0XJ2 at HP=)<f,qE
+%<+Jr;)"32NgX]aM**WMHDfQoe6g_8/Pt"B?s0JmO+Wg2,)q*#40<6(N$T;/pAj?B;4<P@[Ql'ZUGH&bY('-`J\/Ec^\WXM!PFtOO
+%U`_('&0o>]c<9iREiMT43!jS at KTV92*9+9^!Z+Lt(`/QVRiB[d.Ai2UDVK&=`Ac&]5pB$/jkMjR8;q5LUS$Kh^K2S#<B[>XEZ=h_
+%WHpL+0\IA\F7IF+-fF.$&E-TNn%(4Wq3hYdj=Wrd9&4k(OPU3Ce(e[(@E2#2gSPa/>]GQCY34N71#KQENqc<!$_[0?Ha_[F>KQpo
+%)sY65i*H%_STN9qNJFE!I?Ctmnsg2V4dkXh:nr[oPoFSq%R/%\&PQ6r,"]B40AAGM_E=D)3nfij:.F"gEj')lM[*9*,YXEX=KO1Z
+%^S33(Wkd_R[n8.#Zq?KSE*=n-H<I_m0P(>T-Ui0<Hmql4PXGLq%%0qoSh9<9,?YL/E\An*9Ypr!@o'>PGYm^<imR"5)<;K;HLOR>
+%poM>EY^;(pZ<<?1cU;#Dm^@Mr:-qG/8)Gj]CtH1u]9cYZ^qD!N-=t*t;;-sa3ruD11Kfi3M$l4B<!dADai\Ec^ttRZ7++\jh%Mbf
+%]<t$<.iHJZk<N"/MM,E+]X;#HY=+J[Sla`&CoV74^2E)A61ce=@?Cc]O:^<E&<fMC`N`hOBU56ci;-P;&f#Fd'$-fIBi:4PjKT6+
+%ghg^42Q`,6SJ[m+\+B5:@1jC!*DNe4+ne)hfS at C;6i^7M#mH+nMOaMl32XN/&9+b@[A:%Wi7/GMWOO41P"b9(1aD#d1Y_VjiWjI<
+%^'2`/9a3$JI?9J&.]Tb;=dc:Y-mm\2WDbu2'&mjZ8eVeOZ)JD\$(s<3AX:Vl#fj3>bt87T(W7q7=&bZ!bE?#"fWZ(eUX!bsXAl>3
+%Pr[VPbl]=1jatXHP(R7Mc:RAFai\GOc`ZW;JmEM>70]f[Qhoq>%S9'e1bLa)AEZD6(0_p`Bkagai0m'@OW6p$AbVW`$*(Uh'U!dr
+%JC#\X1oOb>B=Y:4Jsko%A2$G7S\-f'Z8V4:LAUMJ'74Iq[P5PW<)7P:0M%pUlgB%Mag:89X8IMcdU@;G7l"5u=`7ie9#f.3LiOuG
+%TN"fM;H+D at P\]kr:ioW*X_+(3Tc?pBYumSHZ9h>Jcgq_,GSY]5RH#`Z,F8(>;PkP/5(_IbVDeI at 2ils#FaFdAM>$=?Y[5-+=SSm/
+%&)RV"QVZJ!X_qhLKn]lR%+'O8ATacR%Ct4:kH^iD`J3Pn7=DQ!_cLY&H>qHbq9D*2%nkp,^c!Xh2I*\dCZX8A"tI&I0Y=RU(."tt
+%afZTN5HkpE#;7FUT4*V%<$JIV+2)lpP6i:s\1#OZ%$KJ9L%`u%[GA1#0uUK?Q3.N*g4&3.$]4DLVJYm3HIABZ3jAZr7n0HnY6_q+
+%*Ba\kJaX`I!K"l)bB?^/OVDrZiZH\r=`(Z+KhR at 9fF3q;DCd>]p;4.EgPr>Xk3Mqs24!/ADd%pZ.RI,sk]^oJBn4An[[=MjG^e*<
+%@.Hc^1&>H[3;@7r at 1WF[QkXmLlisbfpbDi3DrF]Q;MRc(nc4guS<B&AXg'6/6L/7k[BP(]Z)LH2s8@(c(j]@8a5SgK]?sCu2-KE8
+%2M0n@`KlhL6$T^,;c33\Oii]V9l4oLHJ2)<?FC%b@*O3)2u.W^GE9RX!/m!IYFDP.MlhtrMhD#8Ej$rg.;G&<+^:AqFsScLO5&Qt
+%MAiLP+'FdR/?U>8@@*?bk1'&`4le,G5TI!0OE"-5IS/3%3CK&SGcPkmAt/ZhBYc!\Oh"&6Cu*TC at 1Vj`aD7l7Ou01>LMLYW]Vk`o
+%]%er&_eqp9g_UJFgNf_8\>nN;0C1$JgZBI+#[3SJet15(9h#Gq>m7[mqP[\Vm"@e=@=Q"gK1W%aY?J`8>gjZjY`=O)j1da!4LnU6
+%"lQVO;!'%@(65IT:B5"WQP:`GW+8mo1#W3l;%,0netU`@b/1''"Cm?Lhf$3D4d&86QmE4GCoa9$a(u]8`:GQL;qnLOj"qFik]]fB
+%M!26cMl3)m/BH)Q)e$e\jU`eZ3B#O[MG4:PZ08_iRE8>K*hrelE>lHH+`)2W>Qquhi'.jqQmf-tODo?KYuAL3[I<;&(H`eH2tjV\
+%C%98^nl7_Sd<B:XU\,K$VkZqeI>\&i@\&jN_4(K:0ZNeV+^Er8l\kWSBusKug'"oYTU!b_B8aobG>EY:9d7!TCi>MpH?\te6'qPY
+%9h@@A*Hk\`O*_%\'NrKD:u[&)O]G5f5fm?J at K[B_'EG4B'74k^@;O)6R-g!Db+'Mmr$iY1k2'`,;rgETWJg80=C4;9#4uJi"=q.*
+%!\'IWOlgWY_>YFd!I_h3,)`a6GZX^_IX`o</Zic3!3?1T]&e3b9K"9+YCUU&J["R%YAu=[B],p^2;.bla5Sc\2\'@I[MLE\Ujs-2
+%*mfp7 at XYn4hEROD!QX+380!h`Tr6]98phSQ0^^*C,?L!ReY[4S>]?BBi'WG0*lj#[[PE6#?2qkVCY[#cljbAXi2?=O-2!9oEX:Fi
+%JRGq3pEEV>LZ,\&k<j0H'+;7"'W25 at fA67_h0't)@VW>iRpDer#T1/+?oBS.cZ5>rZ6 at fd7cG1WfW<rinJ</2=dcV>_lfT7/T$Ed
+%E:`CrK3F-=s/8+DX\NTBQn3qtWNM:O676c/e%k&d9`m*;_$:T-aL^d6EVelCZn$9L6R/3'Lp6+Z\a/?7[Q(X(LPs\9Os,f[73#/B
+%*gicFC+b9WZ[*KibHHs('Kb)5A5G$*g/1dk7`.+c^<0TJo>XP@"0,=8/]P-ah6'(KcuF*3e#o0'G]B4[R;.gk$(Jb%:lf`E&5k9T
+%-cq^WWtC_8%-Hu7=N\-c]KT!P#g29qmnboW;]26DbL`gai1='#:"!)C9##3#+T^D^OubKTa!A]D<XXM5#%+E'X9K\1<;iOY0uR"%
+%qGWQ#p@!BL:)g,J[S7bOqiFS9ZM&HJrJ#r0<7.4W&6K_)W&X:sfl+QAEapV*68[N3BV9-Jm"@(%-'_8`L4Th:noL')=!`0>&MN"4
+%Gg`K;;sY"c,_]1;L*rr%LHsqUVe4V^X=$#L&.dJGWlSG1T+qn<E[9 at BU+8tH'Xd\>F-]VdE(oD!4Q-JMk:%)59NDUkOJNOff-q'o
+%+c[JqCR07Rm/(B"eP58:'+UoWD]kdaR0T-UZ6ip3r&i.0(0#;NYdt6`_u8`N`8qR<mi;*S"feECSQZjbG^QgMXs#I">(5&V<lJ.9
+%(q4KQh1=C2IJXp,ELDT7CZu(<_F<a=WethqET*m-[66h#13JA/7>e+3SaXIb`BhU0-f at G$&*Y8q8jR`KqkES;,dQd1lZ/'?@4D$O
+%`N*ocHcS<i6OEMAm*OjnO_X3;ac,6uGt#&YJYO-I&t<1AaHfK-0tERmC.&$&C1AFp_KtW#\5;h7qYB4u>IKOYgh&O1M>B9X7>eBZ
+%iq8u(0?BJ]&t6VYC'_H!LFg2#@6MOkg$nB at 1"G"OD)@=P!!a<c65<oYR6n'O4?=NC$OS at Sc4a!-e(KK:1(3;3e\Tcsf$tc$.&AL`
+%UL:mLPX5UtXI#K/2ZIS`R:eNp.Lr3*lqoE_p2o.O<I6SD(0bX%c!Un+hg-aoW`J]128uYa.I\Mr^a==fT+==BCq:XkgN\6S9jC\u
+%dm!72W^<72blP16q`E9'g,l#+R)9t6Wbq*8ScX4=0KbOHXV@<@eP/dSo*""S<-KJ';#TFQeWMYiD\F%G`e@:k/CoF.`$D!*?fE`6
+%V-n)R.c,n#bbT94i%/"*3+f3h=O`tIPiO/!Z5Cbf>iR*&QXlU3*:/1ri at jfBpT:5?]FK`lU9H:cCe5Pe13b(>XL`_)[YTpG[M;gX
+%[iQk:0k#jVfoCKPDNN(9Z)'WadV;bY\le"%29\[#[ta"\KC,)-I296ugFINdA>4>gSq;45UC:[-S!_`HC_SFTY.Uo_-s%h+I+2Lp
+%&0KSZfnO&CC2CFYVq>)1]!KY2#M\jKG&c6tk3s,B4P3IDemq1S5Y&7Y(m<Jk$q"dn&0WQK=qW*$"\b%pA/.0f?t3+p%fn`qXBoG*
+%RfYrY`)m<Q7&aK,?!YP-4FC*"X at k?5bZ\g5*@L`M?-/\M=c9N5>@qp1kA"tq"-<g?37[aqf%s\(4cAaC/5bnuVZbeT\jNn2>O<`b
+%f:hQL#'@,hl*A^F,o,ih2")PD41.D^"NK+,"D61e.$8TT]AQc'/eH+!+m&6KC@/>YU*('s]A!9gh+'Sn6)#@%_CjiqZ)":??kT-R
+%NKY<F>k7M$E98?,I4K%DYS$E;gZF\sJRnLo+BY>APInh%4fq)VH/a;rhs2,7Rc"@=*J?79M9oGN%PjL/DT6inFe8!!k*R*5?^X6*
+%#?e0,'S?"D=/+]ocg<OE5t4/:#rh"\j*<c>)h'O#i,hFH?Di+HI9C\/DFmXBZVlGcgEe"FS2\:.n6%m at F'#JgcA<>do4,WNJ6s!`
+%<;mo!7%SLkX68U>LDk)SKq9*A%05hO"RB<).=eplD.3[QkC&AoD7Cmt5hrre.!`B)@U5n,<n=tc<Gc(q,eC!NW-[g(3JQYZ(KSNZ
+%Sk_kcKq-JL7qJ*F4Y2Wi+hR#XM]Lp[m\[XD<WSch19k!P#G;4mAL$?E-m`<D'b&#]-^^c0ksdFf+M%>_?Xm%,/!?_f_ZD8PRL2R4
+%q:jiG^b(t/isq?P+OV:9YEL)\2b>Uqh*XnjHlXZ]Sk;'6U0!rGeI#fm\Lsr2_uQ):m(\l>]g5K!XOu3U`)AtSH2\dp?-bmg_jt<]
+%R9s1).Q\7/3]p&NZe/tL2`lLa6l:\PR;=%]CfDHR$X<q0T%).//@F3J]SgE9TStoGPp6F4Bp:c34WJ6M at 4^:*i)[fm12cj;daW3G
+%M#,<*YFb/'#>kd5`KMbK>Br:_PHS`A6,r:S*RDQ.$n&\tT%/-BJr.Jfl&;O"/U_W=#RjcK1f4bP['kCON$ZM$#>b(nVs::[liLFc
+%WY)bDbE<koE?0o^8b52L,I#EN$r9-=ApmP#`_$U]9T4k4fE.a:d?!WKr,.M\PhEloO#enT?>T=2OOpJ$FMqBr72=4T/3Y&hg(l;(
+%c*MHp*1R>rHJ?!_VRUXi+:]#)Bb7.!-jNN2$:O at qdnrLKR&EGZE],Ec(qu1ZG^tZuM[m:D3f=_4^C;%;Na*K*6Oi_mg<kjfOen65
+%J52k+brB/0GK_,Sg'BsfN*()_Z?b;p[)ur_GL+;)H:,.+i$=21P!3G`4^d.`a)J*>s/U2D\)Lg2n%tYgG'H`_'NRj^@B+\[[1L1"
+%ZdSs![Q?^r6Y5#48pX7f:7gM+R.qS4W06bqG&m3RH$!5r%G7a%p;W+lFHW\\^2jbk9Gg\^r7[IsR\Pt9bN;_hD^(Cn_P`iIBd_rE
+%2R=B\QB:t\'$ZfE)$Z\o">]"<6)eH<pa/\,<-fTYY.P#/c6=VH_T:QaS$e?+[qk$RZ'2aMMT#WUUs(6qGhPsCLi,?/k_-]e)-2?C
+%9e6j:p0*aK)cl8t[oeO*l.080Mr;ohMA>JUlsF]?0r\`uJ4gpWh_P(XPJj-JB$h;l,hT8?*%5Z.*,c$A!2%4TI!]]r!Qo!pKG<Di
+%dBPQT=):I)m)`\oe<?!B_\Tm^Y96f]*dc23I)$)F3SoYm#`q7:)RllIf-=="+!jfp2B/,blN@;LoK`0lN=@gn\$@Jt;e4N+JO`(R
+%Vk+BiP_E<[fLsVqjHt^tZ%REl3u8\QbI=9uBn/SOF#HOoKHT4_cUT*ShnhQd<mD+WiP&fCFE(%K5B_B,Pg\VfZ#kH7^*Ho+GAXrt
+%i7[.P=e43pqVIuOG/:f3a"^8ma6g6P1e1=c-**.)Jlks&oVuD27Ol857nd_IFeU3f3)CRP0RY<4[cFAf-i-6C&j/o?e&nBoP[aq7
+%ikYG#lenp4-i&K(:B\P-/e\br&@ANk/?1c<RrJO2OkjHdS;cY*k(Ll3 at A[Z;ROdudC#E6N.^DI!=_=on3VHi\)TPF4@&N4f6kYU?
+%ZFFQQ3q<%*RVueX=d"cAB).t"pT0mt4D<n>cBOF*jsbPM'W*]%H,KEnH0_W]Xs``cc1=XFN3'T%7B8TB#Jg``1%;hAc at o_]B`Kp@
+%RZcLbO-0reD/sf=Hi7 at L?&.fQ(B/:b&!OHhh*Ha#XVdO:15Ui>0h6AtS*]T?]XW;*jj9[L/B,kY8s$BA4d<2A]U`j?.Wl8r82SHu
+%[t$[E-H$=CF:23^Q5RL'TQ%_*B#SL$@!s5ANLl[E:aFtQaL&"HR[qdmRmf4V&6T3>4BPG7*)*Nt.4"^!$JRIfOZMk>K/krqpg5_j
+%!t+Q&E[MkX#+sp"&Q5\K)b at 3TRP9dAM`Djh0am-6\E\5F8+%"#ZBCGl44rZZ=?TI((n,P-U,2Uln<MqdM-k1D`=3GB8FnbJC3ZT7
+%1":f-ZBH0El@>C;(mY@!WBljC[q/EB<:)sKrX#q62KX*Zq5TF'LCKVflsWbSe at 6Ak8U8lUrf7L!Fgg.DcWh1t[%/[S`7Z1l)bA4m
+%\p^_d#sg49fb0kJ-*,^aC?m@/]$!6<hRHrhYE\fZeI;0s"U=;;^.G4O0SnjR>S8Cm<5KqTgi/*nA#\.6dGr"mGs,U(?q6;BDNj(T
+%f;hW*,jWoS\:]rH>cEL[BK<pJe4:T[q?*Gm0o\"I/f.rTLZZns0X\6</CaKjc%1@,VS+1[5sRDq/rt)HXh51[&AW#HCe6,I,&;rc
+%7,_)U$mVb9;YJlkjfn,piA6!A`S0CrDZ<A+hK,^W<?h.>Nfad,8!gd*)ZD'1:hQgh:mpjcN^4CRg0J[C[Ltol8(V#0DKWo&GoJ,U
+%[!TQ(MKbSX?RorJ+!3<'-6^8h.nONA4f+;>ar3+'3_:Kgd9nR]@f0B:DA?`Rd<-ST!=s63Q#s.\3FgD/`+RfV at n4ht&+I*"gd+VE
+%9b^st_9oYNnSYBF39$*OUS`@^6f:[9/(LiCD6oSD9<P#qF&dA[E;j2:=#)d at r?9FDSW^Y0i<0BVeI._7kH_Z$,*l at 5QcUH0FZ*7t
+%aB[A,l=NUWJ6S0DA89UHnp1nB at SP6Q+09t>Ch!*/caM_G_]F:h<=+o.a<hiD at rrbAD.-[2ktoZfh:bt*i^"@9!G2g_Ag4/=Dn at c2
+%)*?p]ETNl`!#Qk+m0 at 6$p)@-T]1QFM.!EV:@8C7_%MpJLK*1;.kcdajE7VtVeqnj@!H+utI8U*,]IHPXr`9-J<*-%l[Y'ckeqNF-
+%_3O at t,7RlD*s58rVM8 at ZVo2Tgae;. at R(0)-#uC^Hb<J9^')Oe9?"uAHKV$`KE3S#cpi,T>3CGXJ@/dVaG)Ou2Xh[&(Le"E0AXTOX
+%q\Aba.aM=iNH:R:8U;bB!FU4+d$VH'7gK+[4_Mh6AdT"Z_mb_oK64EjO\VMuoPOm^:-tnej2K6gS]b<hq6mujh)c.oW\m397]nV3
+%+t>qEBGOfRX_lJcTtVp=:Y(kCs,oKE6Vi$ten);mjYE+MF3g*oUu>E-Su90MNDCdp!$.fE8aSbq2E-Z5VNYQ*!@uT:8lXM;H74aX
+%##W1(2$G)cMg5BC_i`F24rc""[W`e/P8=CBcZqe)SZi>/!0;e&G*+6p$&%f\GuVDpMG6'tQ%r,e\2c]QP<FWBdW;WI^i>N0*6PL<
+%#78<f@%^->P<-kmC7#EIemZ\)Llu<%,e>n9.Va.6puo?9B)V#%!GJM]M6i0PU[LGt&sOph(]\WhOWk?g5dcAp>C;!%C9q4_2mWY?
+%WB!Z$W*emQh/$-+%R!bC=&TJ.pEca=)I[lRZ5iR!md^mVB.Gt>s,_AIBp.L9OD*O"25DYcB/u,'m=,FRLQO7gopn0-h,TjTmLfgC
+%!/"GR<&3('inCCRAH$u`mVWH+bAI]3>QH4!+FQkT/`1WS8A0%,:KYOGHgW>5L=R at 2Oo":*,<:Fk<m/48f"hs"Od?f-_5Qi89P`R"
+%;EtRh.YWr?U2@\IX4(a"C$N"Bl(/OU*i[m!ff#M">?A&N*4TM@)0dflC,r*lZf02<HFTI!UgrtN:'o&+HK3;`>R[%.1MFoFh8GQL
+%HR2 at N%%-o-oIL=1bg]n+CX)ZmUqI1aE&`Qq%8bn5Flmgjs$*05)ZuBYrCPPMjg$G)6jY^frQ/ItllP*"j<\:i#(PLqT<o8MeFGtk
+%dTtS.[[hTm^LWbfgkn-jm(+Q[I@,#T)qcqp5E-<i"`(B>m"S8O4:.V`Kn at r4"L at AFJQL%NM$j'nN-3J2&8Of.:r"H-UW[h-q'h>B
+%qHJ6?3S9e,AU3j\'@PD$`8n.SLjl2q4dBcV`4\pci'(18l]t?<Ul7m.1hJi"d^d05i_r5VS+uF2lL2<^aZA7 at Bq)dX?Qfti:u*MD
+%-ogUcmlg,X3EOJuOmcPA/Wh5[YL:*T!9gjI%I[*I^d5Limn6T@!6%"rdS9''3)]*?mpVI*J<XlF:>"mAS*&PO#V[n5Q]f=l?)YA1
+%?-F)293)[>m]0k)9kGreeE#*3TZn/,nuDj'/(RE%$L3i)8/!,LACNE6-2?`1_0sWf,gpM8nPU%p)aT'bV0#Rfb+rrRe"r,$VgPq+
+%B-N^k7D_7qOU2Fi?nFFOr at BE+?&b*9cQ:F57TIh\?oQI^0dJa9_KpfUMWGr`P$heS[;L&Tf^1jnm0absCP3Og9)N8]R'T/SisE:i
+%aXSB0NlqU9'.m+7+ at 049SpnfYU19N'Kl<GIrp:U5N'uuMZYm8/.7022<l=!fQZtl\mm`To:mZj6jG]mq7"UqNI#+p,U#U-uge=\d
+%-4YkH3<o at +I/&+=[%Fm4STC0SQ,&3!H*RG#:J*$HeNK8UFqg?R7%6h;/oidq%(86=6=9/eID[DTDe5Rk\`Z,R:'mY`>`:cMVPh7>
+%M+"lb-SP)Gof`#u`qbO(.B1G[FC2rYdXHbua^ut1!c[`!"!_j;XlUQPEe>Ua(b_[p)GiGAUm-$V/nYu_3+W?'":*F]XI%!%Z4gC,
+%;^d2R!F?WqUle_$Ub>RC1BgFm#:?Js$g$-idn?o at geEdZ))(.WhFWYr+=_YtHl7X_\gIQ)0tG)Z<N at 9U`=\gC=qCJ"(Y6%koubmq
+%j^MC6&4^tVKAZf@;oJUJHu]>/Sm8Le_NF>6lb6]8jo%h]Ao+&sCrt?Nc&YJ>Tf+Xi$FW_/UnF(;Q&$OK4s/4T,jDXj)k_N&[D'9X
+%GdH)j:E3&2ZioV/-&.+W^"?Tg\THQ-2(k]jJfYQd)/tcMq?$6CH#_>Uj00?Q9;@E08hIH/O'-9hjCAsN'_]C]H8!;ON"QC`ca$i0
+%;mtS((\MX:PXhqsU)EM`Eqpe+pFMhtc:HcXpI$Rp3ph(o*%ccpa:l\K%=YF%[1\,cOIZ3nWb"&@g/;g%%35F.m3=C!q+2&]SrCDX
+%7G'A`T76=,6^X5:fih"fb7P[A&+%UE6eHVo\kI9M:\$UCct0scQDgru!L.DP;B)E>8I+YssSUQ+q+c9W3PV"a]nN9dh at 3j.Df
+%D'f/sr.pZ.R(=WH-Bn`dUjTLg30;[lBQ#fJa)!X"0AR^%@alEM==<N3!o_s'1j`KD]Jf;,P3gA;[X`iZ[:`&48]i&WJ%<#VJM1(?
+%lOcZcmpYB;OcN+"%\<@/C9OJ8\bsY3[++Ws6<DAtWXEslX"LB.;Miilg1b!J(k-1*NHr9ZiR[,i*HjsGD4][H2Wp"EPnMt4I'?eY
+%geC3_$#kpo$@h5,,kL.m/D(N*Cs>kb0R,;]=tMq2c?CPk`<L1.'R0#A\-H:RKMRUGZe_$NYb23`4qt>R5b\rm6*KTAW&[q:65e at k
+%OX%U+@=^<EH.uqtU?;;1C'=s.O0DjVFD<njK`9**XI^ufR)Y`-4LW+Z>(0OfJlJ@`YPo!p>@9GmEB.9K[gC0CR0WLPaJioLYHp[0
+%/?/)>)q?f2hq9T[5)kTVQJ;62V^9+&"@!e#6t6atTe3NVPS_'7"U9DY]+`PT1sokBMU\'<Cl8'+()_P__pXX2GouTc[eLW%I#Dhj
+%@&E"9psH$M"K2]"=5Z7?;]LJ'rXt<]O-cB$*0p*#(7JMh21`Xi'n=Bg,h6lVY7>*iKGe>nSM+V'd/d4k\Hq,A/FCeW4bD\^',Q4=
+%liM481WM:9?o;=tXR+bF%g`uCh,QMi3Ku$G?[hD^]s=1GjY\?0m%`]9UmfWAIE]>uV at t&3NM+Ob57uC^T)GLu/Y5+uRTl<kUu\P_
+%NF%dk8)jD_.E0jUlB"qe'4oZkU$S,L:XW@\*E,FB"B6_iQDBIeW16bNBI,XL at VM^dVQ[9alC(d1=mS//-fq\Zb&3k\5k&C=#8^mp
+%VmKqtOt2^3Siru$0/D'b:3L(j<;@ss+5\[5"m'[1oc5UTM%ku?^$H."38+3FRj`19S5%Qsf\3d!S5MFs!sA7@[h!OUQ8^@bMESqu
+%A`n12l?;:2QJB+0O`9+Pm%XblIJ_Mar;mU%$BN[b8(FZc56sH&SEHE6D*R2^9pYfmcDRfbq`=ik?4HX=#]?V%:M/J"09u!Nn8[hf
+%nguPaanSEL.B5%tcXB_DJ<>W=k?_WWG`Ej]9<M/*a+hj1&8NRTjk\S9SaO:Yj)'6A!*;q]J_lso27ObHXeG"Belhkf3 at PV;I9+3`
+%.dB.P^I#UeQ+dbiEg7+1Jr^Ee!b)7W*PqBIn%+K@)s6<MEdW23\)Vc at EF,)FoZ,*U-kc1%SQLED_^V6/EB[+]2FmFPWs3oCUW8B@
+%IQc>)k8iH7+hRb*[U#rFmXBat'8=cmC1`11`&f;[qmN%\>I$iWAu/>Yf.X?-U.Y8Vep1Yk8!WZ37Y7aXDQfT>b<PmM0(HpP5"W/)
+%3n4Ka7:Ds_c`9em<q at T*.[&`7QRG9f=Ug<pn3MO!&WkeRdk`9F1.Z0H<#''U-&C\&oo_(a/Beq at A4n([8$;6)]/^A)Xlr$@P[J\"
+%o#,KFF%)9n'93.iC825(32UOki$c at N'B9j1Op\rWV5kDp,dl at nV?ZS4ps3iSkIucC+A/Fp&QaELE`2hrQm_8=1B]iGFDC(':=Fk[
+%Cemk#A<:U\V]G[saSA"4P]HUR'#N.Qm(qa_Q%\8K:'$?41 at 6(iJkYIF"o"q-3E_gXP-Oam3=`GO#AC3SEF/4&=#o\_EXr^soX)D%
+%Hrr2`DpEP![Io(HQEu$SbbC`jUt1bHntSbfIEs:mrCU5B9KbtMStpCb%XHfX1s0j\NkHCC=&V'Fr^LTKdE<el7T!X^Wl^L;BS.!.
+%q(Aud].d";mBB?E;^U&;"$<(Jj9ao;jFlUT6oHft[SNpV=5\*o6(\*Lce<S9)=HbP)UnOG(*.sj>T9^4hNO(a-Vu8\qaa/X\!ZaO
+%%G5`QMV+JHQm+EL*bF\-o+7tl$b!']8Y9"^e.UjrC&dgf;L at VMl]S-`fqsp<*^p-=X`bLU>M:@up*geHp at -;:L'J$Q:m6,+DQ)md
+%Jr\bsSXDp5o7W]:Sd$X2"ed1[IDBA`Qb&kr;S6b1CQ&UT_ at d0?&D"lFJhZcP-i50oE=MK]B=X7Q4g;f%Ftc;i/@!$#:R[BIM%Yj'
+%UN`#c&ZFchTq^F9\TZ*[q#(Y[5PoE9B=D:Q at bM_G5M8lD3\)XjK/q/H`0Jh>I`dNcVYGHf at E<fMW="&tEff+Mr.#dSp//d(hEb4+
+%PsW;D0WqE'Rh):k`#[H\N3-(aNK_=<TV_EdBQ?J\8bcV at 0k8kE`05VF5X"IT"fWe[&*bMk$RLt^nkUa8)35"eKq)c2C26(]WXihS
+%##Nq?c6#po#A%a;l]f:YAR,aQY2Jer_$-=?Luc6Bnhe):2d<@6\c56eH3/?tZn/21l0S/RBa*[,,i%HN#9Vb[]QTsdDKt$s,C%Zb
+%.?j$;m.K=LjCMfEDfh?`01Z55mRTA)8hTM8nf0KZ'(34*?`B%m\pp\aNK<tL[XFidZWaG4pQ9^Lo$5CT&OO]ZqcTb5b2s)p`r%F/
+%//dJ=20Ln[fFZJsWXh6>_>gUI.nFfkol@*bag?;O:kB;H%<c3,QPGf,l`OpU<<2GnnK`bQ[O_/'2s[d#I'%&\k^f7fe;9c3hN]?`
+%c&b^'^B=F\_l2S<JasJ5[;$lCR,NRuLW)e<.^,D'CN10bF\<!)M3nEWBG6C2q/h*tL9h$T->j"+,@/#f:#TO<)f,&_&]g06$ui=#
+%WUJrco;$?;Vki6o-5^U,FJRUeRd(R^Jk"@Ce;LJ#;Rjgsagb=>2o/$i[+r+Y_G#>T>aY:(%G%R&;,%A.'Z'TQMtOp%e\HUK.CF(j
+%!`@-4H1k*mMm5'0Bqup',b%'mJkfK-Wc?p`>jn=4XF]1Q1V&UQr_`j-IoAp%a0_M_UD%u32JNGLJM,f%(R$Xi:=V]d+AcaXesos5
+%FI&ODOViUm*IAEe_)ZgR?V,BLPpBf%!DX<XF(PKrN]CUUd=@kW9l#d7*Tm:oh!BRUg8PBW]DJImi?#4PfH3032[J5UE&M&oI&`4k
+%3RZ:lam6Jd,6ruD?9b#L1M\@cEWUb4'@4_mp"Os at YP#-*A-'$^]`mq=j4(?dbcFoV!CB@`#Fh?GKY#jgbE8I9Qi`8oT+Z$:j``F;
+%V\Gc;Q7kelU.B7a.NTABnq\sYH3?so;(bS3i1,Jb<p+M\a>^$YK50sSm!+e#)i_L"K.`fBf/!p@'^IitnXD)U"XS+JL[NC0.5G8F
+%%'j5]K9Q.mR4iEHHrQAMI==I-8Zjj'/9nigj`?%JSD7E`0bW:0A at i:TL0/47QBk;M580RR`3t:sSm9Ipa`fnLeaHG'ZHsDTAl=P(
+%*n#CIm\t$C``U/=i/cWeATb__8B]KGUFp,<UPdddgNVTFUC!S<qTX<PeXLR#K.^S\05.cSb)Cl6L:%n(*P>i3fmKgp4<lf<*bHJ;
+%qL62'$$7"UYrh-9.Fk:>8<)2$WgjCa2%f?.Og!Y'2?.S_U2.Z0R*0C^A;pc<PjjM at K:C4sa&+GE+&&)G)NEA7^faC7qg+ at dV"E!!
+%g1>VU+Vk`]PS1O.f$UR<[%)4q0%JU-S34^D/;+Q]C<'eZ2idL'F;3B?M`a#6#u]i<"8d<WF:aqQ@]t(%WY=3jUpZhA2AB'X85.o!
+%q;>c5_ODq:iAmn%e5_9<l/P&q,h9ApM_0jQP\i4Zd9LU'!4$&HeuSQf^iQXnM,]'e8h+,F@(gsL`)dXoiFtaNh!TQ5cb=p7"PeSm
+%a]W<2I-LnM#;*7B3l,Q-9uuMRX.%m[+pM!J:a:3e(B4c.8gI0bI:u at m\HM<%L+"L0"+0S>AOBK1aZ'<4WCXt<^m,o1-"&bWIqh#M
+%6$5sG^md.5nc=Q at 5C/;UcYW=d at W.`:Hu?T"i0=th-5g^sGlAYKT%"8(@;F"hm/"Ytna_CF8!(ah6.%-U;ebT/+-17sUE)$_M7g9`
+%CtOk#3#uc+igPl6/W=4gU+6N^A7&uPGUVJ6L`?#29N21RL!h\RnP'fWjR.4fSXp3Q?9;8[!9*gq%*>3;62DGS,e_^,'V/0F9TjG=
+%[_u=,SCcY!nUZJkDFictNUs(q/0#J>HeJn1e"0;$p<l5+o]>Wu5G`$TmF^l+C*QkEhZa;geL=??ani9WR/!(JN/mta#!e6Fi5G)"
+%_Q*MY%OG(+F1F at CXCZ:?gb)T0k=SGHEc1FqJ$i#PD;a*ia\!/bW$TFLIV_OlLV9>8X@(4=:7cE:D^uqjM3UETC-QG#l?A.!cTtel
+%#H*l93l at B7dFW6e*$G>tgM:oPggM?bp1PU6gM+ET_:<S[@!m!h(/blZ$2MMTia^->]L1+MbG*Sg`+TXs/TYE=UWAl_n4XlDad/0g
+%!Smc:SZH6qm,cs;7q;A:ou,Idic_s&,FF!A`SBL$^+!B/;%MA]>LF<*U_LiEP6'`D3.cKpSLn]qQb6YAd6 at GqpZ+PW8WtU1;]f_B
+%2!]d>(jA,q?gY at s_gG&'So$Zt22ZpV]^g5^jClm,Xa*tCF,<5oeqZDD.n*LJl'qNqd3D4P\F\.)-W'fs?SONZ,4QG\qPmNF!I:_K
+%)_&banFtNa=eZnI+>9CSceD1BEj6.HQZP-fgM_i2+L'^DdM!q(WqS.6j5J<9.\5X9d#n`BH='%D7QUDjLGJDN7)rq5>Y7k==FslM
+%?_;rlHZJ&]1oX?G=g>JWEW[gj7&?dB>rK8WSO!-g_75aqeX$)Vn$B]qFEl8^DojDMimC^95o"sn;E$<h at CG7LI/:hgYk=?d[_K30
+%#`cUag^h^=bM.D=VMlK9[*@[N*2rr%N_5TjHdW6X(biP*j.SQaF1U]Zhl12=LP:t(e3j>CV%9`j\flX&.P):l1k07O at h?"j&qg)P
+%4]eAN7+--p:323Gaeni>8qLiOCB8_r7)R.d/i%o3MA\<.B(,9*#^E=2,lo9R>D,R)-S0ZpWS9sG3IfTkE0Bcb/=\"%,nd9A-rR2i
+%B`l$lr6"oZK1Wb?A*lKA7Dq!9W*2'.UmrENrq,8m'8#S]Q/l4g3QDg[cjOOZfn`1@]kk1>=dTHIb0!cpp?$sL\!l(*&n,Ubc0n?I
+%/bR8C>Pr6T6JonAJG6HB9O+AIMj%^%i_P(bW=_cPH07*Bb$7^J[eQp=k"ZJjan\$lYm7V#Z<8DJFL8p^d7HT^%GI^'Bj:#a6:!Fc
+%a#6rU)O0'cH<H1<GC>d0h<80WKn1CC7,!6;1B"qMg'AZjDGMG$dpiO3);sI&jNQ&4qZttoq<DI$mBi8t#2/0$p25<06N(2BX>Y*M
+%H.MgnJ\]o3PAa#40;7IXGtFDrI'jWfcmX0V*0S9[[$Ke&T7-9W^Lm:Y+?n"#RD5P:i at bs7[l1"MQQmCls(%O=Wn,`R%W5bbb8t76
+%.5d3+Qc%JDrck&DG81pRJ2^E(`5a)-2Q?[8GJ6X/f?#Cu4m,:1r(Oo&\QVOkf4E[ejHFA]gL<,kdsaTV.J at YR<(RD[L8K+lXpc9U
+%\8(U"(j9(Qe.?\@P at r42pYiPf^<M$)BRg'H+:[puKl\YrQNVn]S[*gX,]@S4ktlg1fc$/ieTWe#4mednPWk+nJgpq at +9@=+!'D>P
+%TKSVakofcc-H;Rf;nTN0Y7Q5G69e9F8ka$3gpV;;cZ2PRalF#q,mZ#PM&oV&18h`r2)cU-:c&EqeDUBbb at 63r6T1l2j9"V9.(U$_
+%0l?J6ZrJaIqlK1oCaAHNH\fS3BK7&Jh4s,O"LQtVaU]FjjG4&L*Tc!j\oQnFFUZo?"b%c*@0+$cXas(P4]q8=eq9f6hf]CV(TTiF
+%4]^8k/Ja)?GuL]HMmY1]!r94- at 6!iX"s[sQDJejb at CUEgb`)_K)u*'goNSE@)A/^&OK#(@1!Oaij):i[kl)WVE3TZ9j90A=[N#X&
+%Du)kWA_f];1)4MRa"kmWkT'dd=T2!'ZC!AU-V1*>]rqae6I8h3[KH+m=V82/0%s7eFJBlR>eXH.`-[]ME70et2+CH]'D!ip]HXOc
+%2VF:MB`M"a9ZWfZDJEr"6B(nYlFVWk&6QSnbpK;oG"s$/[WG`T.'1(%mu#-@%1Rr47QJLI5cdBPhj'q/>5uc7>;>/5*0$N:8$4T(
+%'L8+-!pbr'J.P8KK,mXOX%g[3+,&Pc)1r'h47 at C,<._h9T/Wt*ZL\f%Ea;XOni$2&e()KWoqG##3GhPgc"^NDOSI9u31.X[ZI32f
+%>CbIVPLt/h:*k:4ZHq#NDDjU!_ra\6rdH5;Y>J5G$.U&"`IUI"\(Or^&>0WDr9+<%WLGhoXT[*F[&BEeV!rUcgijN$8)C'OkG>N^
+%./'H"I$<5M@#MJf6ZmY:l^,q]cTsIl]PNJ/*3=fEN5-^()P@[eRt&B^MpDhmK$4-"J\<GqC8D$"1Q-]m5GI8[2L_GDEP-hc`.R,s
+%_KIocI94TWL5ZZP%m/V/D6_QtBP!8ZaD]8l2P1KGX(Vq?=3cK9]VU6rh3(0MSHdHOAmk(&d3-!^fMaou?&m&`b^b0``@g\+jS'p'
+%"c+IX"jZ6ufV;*4 at OFjZ/_Gkii^O,r0_ at mmHZHl"ZCud7q(u-\X>..@&36+p[hbCS1<ACAp8]6K0JO02PRS!<CR^6nK.&FP#!lDQ
+%0<At9.&P@`r%iYZHW#?t)nQ!1E+BA:k1o"q=e!-QiIin\&*7(l(`OFbiTmOI<:tA$!-]h4H\F9&T)T(FVX\&>E$)Umq%J=&.[KNa
+%=;qIZZ@*YI/AC[)bCAKmFgKqhBR(#6JbFBX.q;fGg8Wu^jj:eLJpGIcXC^+*K at 1"6,#1$dStr^M8c*rN0G9Ud at a2ji:DS(NlT2l"
+%,6r7!.$k#!;4!p$cN^(3YN9:$`XXQ at N/q!hL'p3,\<<@;$2Xrs5t[&0B%I&WI at 9A`>/"%7YSASLi$QH;`KQOX]NDq0Cd>5"fTt#P
+%j*UM"8C5V,GNUl7'bQNrW\4T75PLl<QHX7<b(]Y'3i,#7C.j)PXIcWmfU>C3e:'d4h!..c9b]p`4n7`\@g48VG]jU<eN\q.(Uo#K
+%-!c$di63HV*\$JN?AZX$j7HTUV3-Zl?XDp09u8tY-CM#BPPaKSK_r)M/h*L+5t,q&$2/@172>5`^quNYR1^i-:=AZ&*[7k0IZI)H
+%Kc(1Q"Cd&WS3tk4QT_7[9h16PSO5,oZq'N7^1&eL`-]#mCh.]uBq,+a>NsnU(=I%3:uaZ9St(0'+m`*T4?'.)J[$f1bk=s#]LC\$
+%[Z.Z+W_R;(;+e6\hK]0RHZ-(W2fc at sneS)7QMrh+f*RsW&kGMVnZnV7CfB63hFpNb[QunZ/'ZkBH>k:)klH']\T6ot/N'6.#JVR;
+%"JGtkQQ8A584Ud&+$Sj*\B],G$A\lE>6HXP=kJ8^`q),p?dl>_ at i\Gj(n8-eg49]J0L;D:Co&82DI"e#Y^T-M[(^O\FU;N,MnXGQ
+%6E\4S#5RDE?1o*eh!_ptG-_ZM8V2V$IX+9WG,MLa*@U'?H#/gYL7Hf+:\jX*irb^6R`KcGPS%#>-er'SCtH%.,!3N#AlJePhIq^)
+%$%Fpu+3BcFF7+C`rDBULJB-`X"XUnk[`&NBdDsJG\0^1qa*CcQ86oiS.DK6eO,Scsb2/ZVlTPXQC51V8.V8p!nTcJiiP:b8J?!Ir
+%))Rk]Z10UF%#nVsJjFW3(\KYXd6e7]:T>o2SLGRUB$&ZikNDs%q*V+f<6$pB^sTUob0Fs=Tp_4=[S3suVKlt%os+ICjjm:]@oiB-
+%BM6k94tX4."GYD#J;kS!0$, at NScT0nY2RmJ@p:aD-l*MLd[9>I2$_J4i8D',_=(<*P$T2L1:KL"Qg:6&I?M2Uc*Z^?FUPRXN42b.
+%h*sA\M-Ru3N^!Sc/PSERnXoM.6fsA6*k at Y\l?=q\0*u8?%TcsKg_UK1g"61CoO0k11jo(t>/GYANsqdV#TC?CQRV<ZJSod'd1LN:
+%'SNjb07O!'LIDg&OD_/_]$SU\\SG(s=XlFA5qYsMR&dRG_K`U00^Lt)VT@?Q1Ze5SBa9?cEsdj1O#(jc06T8uX,)Wn"J\Z:#c]2%
+%=f;CWjh(b:Aa^RLg.SPF&h<6[,]d039"d;TDfQYTb1GlPYq\+=:Z at PY5.n0>:I at 5-"+o?@6r$;(>#.iG. at erc`u9J0RiV at d)eT6B
+%5H/f9(C=8"Cr^93lk.Nhg at 3+%P^WA8%JTnJF/FlG;eN$mOr+:;p-b%-h!E?<_f)2e52r:2?`36B%b[BK4FV5Z:?$$59hZP;5MPL-
+%,5!X4,?&8`ISA:P>SM0#p&(:-YZJHr'G!BLC6h_M#0WX%F"h`"pqFLFSQ"o&RJP[(h_Z]_gU&Q"<_t7."*aEtP at t_Dlh`K/*!c?c
+%D#EakRdk^X8NtYt9pc_8-`JM^6Kq`#OQL+ha6'_k540eb\,F5"GRM(68V!q`F=RS6q.A;+"4T8%AGO,b#Z,5YY'5Lt$p&"gan[FS
+%$2"Q%Ihn=OR$]%p[c(JV:q%"7#]ea)>Oar'P2pL'd>?Ij,HedHS(tk*0;XkP>rN](**De!<bmIl,I8CY3?A4F##HF3Nd3800lg]#
+%rcUq_-iH(6mb^a8O;,h8*#;H'SQoH8$02n$$i5!&;[[4kW$@\?+-etE>b:`cfE>toC!>2!qkZX-@*tEf6L&m71!,\R`b04BaIYnt
+%GYM;t/eSA5TCs at IaZTT.=;"Ll_^CUB!;ZE[A6pY(%"/,64Wc39BA$"N&\($A1M&HC8"V$E,:upA@*=PfA!/B=&!)oB1*>P5S7!A>
+%QB7?XCk;Ae\u!65X*Eo-g_T$[ap62+-6D?%[jq29,h,AXoG7rLEVq*FGM(;?]RD1EP:cr%VeA?][<-1T\d:%5Ya/Hmr;6cEcN3$!
+%3JE@%60n.?*YRSS at mNef<kntrW/V!pU.!p`@cRD(%Q<UZ&!dl(gU[QJ;6edK_U'YU)dE[rUX%tLj at f,`c<`>@[NH"6blrYXi,8K!
+%IH:c!4eK8eod%5nRSoW5(ErlRXp(V,"8>?K,[KnfZfuas"]4N)AS/Qfp8om14cD,948J8N:u%m=f;Uon`CfH/D_J:RLZ6oX+I,[E
+%O"RY*c30Xj(R>@GUC%>#>`F1]$O30gBF3Qbr+q0IX6c9qNkf(2U=q-:[>l`qXdgfO+iq(u5:kl"+_EjZ**hPP%d]W=SKG;$<;rG8
+%L1J;1H:,27fePRR=Dl at G?b7'%(jKJ_NTGKI\t;):0C-+-6X[*CF^u6uHPB,U@)YsgLRON?JP8T6%;U9>I"p.qT/FZ^'"ki!Y0,5H
+%7eK:Y>hV\S1sn/k@\L(pM`s0$Rl9a;rIJC"R.Jj`/TNV!I5ut[r1Wk2XOB=.l!08&8!TGSU[=Y8A*7Nh6k8_/9>LDXQM9[(<_>]#
+%Jn5!NJC/*P^n-J8UW at k/'A?0mq0oFj(T;d]9_-?h::1\TGJdub$AkR`='Mah56>Ad=mWAqQI#/.N at SH&]f'5<UCU6<P'XUNd%^Bi
+%*5-a`5k_WFK<9Zj"?AY3FUCXR#RUu)@$/q?8VsoRH_ at JuZ[<tn;P,fc/drQ;DARC[_R[d(Jj^Xbal^m&q0NieWJN&=9ss<,djlm:
+%J<!],j\%_69PQQ"k5E`E)&bJ)J75Tk0GN9*O$%3NgTpJ/RB*g&B;Ak:r]-qG3`q1,>kBCacVnZc/Fa>sF\AN9]*tTRjJ!C/!*c]:
+%>mf&\!)5pQ0 at uGT/4b:aDJ6M31M2]]cB\=#nPhb*Q&&01\KjSI&4<%Yi'@?r*V!]%";)5+,o?2M69PsPo97\t0^r+aCBFeIfhG\3
+%%_e+n]\4>5,4u1i-HP6bDYcK1]Vn[.To\rcObeT1\SHmtotP/eqVaB'Xfl00]Hl5W+^TJL,>jf,jFNsgf*g=+k?p0\BFJsATPn$X
+%mJK=;8O(]5N7RQdPbY/_$/:pYZ"7h$N[jnmY4b.>03>Dl&KV4F(J1[gRcO7)NrM$haKeIbDbL;Z,<G3LEN)Mi4"#^6?(AqGlOW[q
+%P59ZASB3 at qlunDsf6h6n';0ckEmHC0JY)_5Bj[[s#cb5'_cZ(_m4+rs>#umQp-Hr!'7=VL-ZhOpP5B'T++(!_f=5h2$"HOVpI7mC
+%Vg7-@>0O$0\@!O"k,Fp&[!h6;80KW$/TK^AGKY8-&:e=r<L`Wcc=3P$:+3T,*66=Y,\As;LOE*_MUe+&^O&P\rrqfZg9HR&PgsgJ
+%P,%WUCSc-BfQUKI4>F'`r7%b"]CL9U&!T2D+.HN#ijhka>X$uaT]is#!nUu)eILpINs'9j7Z."8>RZ8P%NBHLl(nXn>@T]c*,J2[
+%":%A8EicU0Rg:$&^T8pHSF`jr[HHV"H&/d,b_91MeU[s6 at SLfI/i$7e;&*2]K32KDE$KXtQbJencIZ</k!dkKE=]=T#9>GPluSH_
+%Ru`7[(2LEs-,+;,BE9\E4#u^S$pa>+cSht98[^KKKo##e'smQ9H,$,Np0[dkr5u;+qXX'aE[_JcVa3a^"#Z6^bUHV#Wrs_KG.6$>
+%kR/=pXjC\:<Gp#U;D`Mu+Y1l2Zd1Yt##*8;.ek]/F(!8i>Z1iHOOHG`Q*9($e^[Q5htfp9-[KbA9]g at t^kMhKAFUAs2>;H6S=kMZ
+%d/+MY)d?[M`CSZJrj`8"8LY%"Ib$Sf\=t/$h-aKdrk=9khX"\dS:Y/0*G`(F8J&MJog;e[c#_1FCdL at N[;D]/=KAc"J"d+3 at 96;.
+%#7pbuP70SLk#U]D>EnCYKl&_V$W"q0q\kPsY0h]0D@[9TCO+o-VEY]D[+e>>&6q=l^,3tLHehXeWMVBq[8 at K7W0qH>.J`%"WKu_:
+%_LU!PlI_YTk?%*4P7?h at n1qEB=sVm44ncCH\QRBtG!)./)afP],`V2PJc'DB0d.nu.@#mT`I6$[JUBPf%XLWk3=CPZI".k%,0EEu
+%4EXi(en-Lhk8H?,>phg at a0/>`m<K.!1A*\E\.e'MnH+SaH5ARWYG$9b&1qAK@,nT:"Yr$rj69n?)QUSRNpeJqkOK^:Wo$B>"Qu8*
+%Ou9$4>jY_?4l;0>IcGtKF1;;_:(<-M_D#8IGQuXFc at o`+KnS5\,!.0]rCPXV6.IrO?V1AZ;E9oP5W$6^n1L<-iil2b;!`n&Ep$MQ
+%#cW%$Bj>ds`V]<\W2t!0?Z+lEF10HsTW/0jl^s!bpJ_MBq6r`r16aePVJrJ9#SED>QZnV>6gGgS`Kos/.+8.nj_:\+mebXs at c*.!
+%Ad.R at 1-3&3&e$Zu6.a<Tisei[FS/bQQmg]8e!t\;A'0up>>l4_q<jMYAC/]",J;jfSb'dP%=#/j"O!5."\)RVk,GGGK'`ZT_uVN.
+%`ZX&2M;EhYXP)?;A0>m:A[59WQedmDC163J.'-Ter2.I.r\?^QF/R]GXrE!^HELgB2J\bPgB9:Ro_C,,Vp2sG_>5Z^`1,N%*@O^7
+%)=_oE0P417qY3U)?rLO949g?^AhB\)'URcTb\cPgeng(t%@_..!NkbGnhd=>r%(sD:p=Q09mkT*@X_'pBS[_?7toY+rU%8hl#rSt
+%6Ro+_1G:?=5C`R#9H\L]UKIRPlJXZg%&GS$8.0 at FC+bCBT/3^EFnM2T8iJY)QnSr^K)jtThji(!#;Wb?s8!s[VY0R"heB-gcCE`j
+%D:'-Y55sYb,e0\n,$N7Y3,.\`BFaL2\hg91IkEbL at 0?A\2,jj_-F>+]5Mn<>9E$KhBL?mePI$IYm0(j[Ro;fc^#tTT(7O)D)b,[1
+%q,4bi5%M?*%L6H\p/fkA?)5l%b*Q/Qq\[8<C)ud$T(@7fA#3q,:l8c"Tn02`jKU:!\.U/hc.:]3K1oVZ)*WP)pi-?ghTJR0m+"qW
+%l0Ngn3KfC%"N#2LcdPA&abY3g?bhkhGL2H`a_RF/>W\ia?>eW"l7VslK5Y+^jW$CO)L6$M[IPRi:3+ at F#[8bT[jP%$UUQL\Y at 1E8
+%XH=`pD`ua"@5WcP5hp7J#)Cnl.E1TuF7$>_KE!ZigUk5!hKWLNWU-8b?k;M+>&Z_WSQ1WJ]]kq<#90"/<@L*XQ7%"+)FSVeE=U(8
+%<M1u:rV43DI\,`PSnSa^*Y`(\_a at C;E/M(@fE+/f%1>65b+,d,H)2VP"oK@'(sD?3%L\kUNoA'?D`g:;/JbS/$mK)?lgu at b&EuuU
+%*97c(Q,758CMeKE at BnAE&`sPkLrh"C`KJr@%/luRb/`qVT73jX"tG7l4Na.`1`R>Pd<_S)Ah*:((Kem:+7;LeAlkR'&87gj.(CYi
+%4VU5SS;"mOqgl at Oo\=\CI4L>'E!<.YI^M;,+$I-(>\su0MOol8eWV6rR.9;g#2c`/jO)?$p(tmdVP^=4feZQe^Q$\Y$F=>3jXm%5
+%=XjaFVST7!a at 1%cpQAr>l;Th5`"f@,X#ERN-dh+Hm`cM6/o-XL^o,Kp at g%,IX<`Z"P5+qYcDRUE!pgrNYN/"rnL(ImFqh^Pg7rd?
+%^SQ#')>B>ncpae,W0;PTXt^qjB9 at CB9!W]\,%$:f>!Oi;59j`<9CAu?N:*@UG;CUOfHfjsb1Au3X5T``G;uKLAR\=Z7Z?3RF/+$j
+%&ma<arM`D3a4AeAcc\K8S64]u'+V%DM"8dfr&_sSQ$AJ7K>To;E+`C(.cT\YF"s1pe!RIAE[b at Q,$b[DbSl5LQNkCl7.q:@F'qo)
+%^C><5^suP#PL'_<PAiG3-:#^38n(&&Za8I9*DB'$NB&#;Ve#6q at e:.OFb4cI3s?nMoA^lT[tJtcecT'W!1fK08[=8qc:fdc6r5Lq
+%,ecAFNQa2dTPM?n8(qHqr"&AW8N1jd=7A\"_%0<dOjoQ&SGECo;>$WOA.rM-9XRJn,(ZP(Lcf_^@@s.Zq8jFSZGT_bEM[EEWKY['
+%>\jX'b'l1qB4i\I'Ld>W;-K!UkMRNGP(4'g5V(X#S=STTRMS7g-iYPJ`Ji)ELd7RqfbD'P7^uSp$hGQ at bs$#trDU_&a$T-<Y[l'q
+%b:2kf]/9U%.4YLiDI)3kpup\bU7X%UXa*,[3c[gF+uP_FiqbtWS+k8#">cm-[&M(C4D;:MIGKqg==OmY8[O'5M^8F,@(!&f<u-^M
+%8HEbO$n+gNBmGk-f8m=#<+MsSOmnt?.5!:7IEBI at Q>_sff?Y@'/KJW[d`&]OPEd-WGu;e3MV2oedmG:^<=Q)=N8<Y7&_mGSlg2m_
+%^S8G5rO\-8"sT6(M?[eg6pE&ap)\Us6 at f$n2IlZCUd4\`SL`m1-RGE`-M+SCSGOrR#4I\9obIW.2fe#jdH7)^PAHZbWt/#$T<!Yd
+%pO)N1 at GBsq=/p,i#R^fn8S!'*+Pmf.MC4X7gOA8%?Gh,qh)A%N:K+AG$/N-a#Ya$B4*HH80*Z>Yrtjm_b5I[!FKW_VHU$ouF(8)t
+%>QN6\eT97.A,9YY"!iPX/Q)4-CF;;:bT30a2si:Kc<mIY3;#INq6P)ce%O'ZKiSM"#$@PgfrJE3bA=8jWA:gZH[#cmhFbS5-9M.0
+%bE=>'T4`OegU@\bR6GNZ:N?huMmHLl<$C?RX;V\\43 at KVc:sbfesfdk)1)cB]*Y. at Ie?e:.F'UfnPX!3$F_a:R]Fg\80PU2A1Rb.
+%&d2-Qjm*^FA)\-s[Y^"trKo+-C/*teOCJ1biPn#-E;&d(5+WZo0;`]ON:j&IdA\Sc-\@O8o'[LgL<Bm((E2?K!R%OcFWp=>6>O]^
+%j,Y-M6D=7(Z"SDu$r);pO\3PQF7:T?%I8g[9Mo,%agL=%pV>IGO?sE=+',Xk%3,*j,pf1eoN'S`&T1dVjcF9Xp&%F"RemfY)3tJN
+%@5NKdoke)AVr?gA0MU7')A at .WUu.X_.d#W5:nT_q6+sNCi;=jX>Ibsh:0o^RD&Z5cr(,J8 at lpcTkV3qE["*"qOMDqT*$K-FfJ\o+
+%=:?e<49+`UI=!\scfLTblHbV!3_<D(A/1;Z]D:p+l*A3=c/JM(U(jY//oNKS*'QDt>_@]ogrZGc]FpQ_0CuI>78p5C7l"Em//<rQ
+%d9KWLdef at -Gl0!T2&:2RiAk9.BmVcM1D^PYAKgel-ihh^TmNpH/aF[e,c/-bQ8[K^BqLp/@#fq/ZS(a292:977-/`>p=cXTHW)IH
+%]O^8`MbPPA=ZVrY'd-,g<+o'P)//dm5ea;\:;bkW.GH_f,4/;7R;D.9)50hXl0$P,UBU,r^;g6l3u=+J9GkI/`GFbfF(j#or$B#f
+%n<e\mhtkPq7!Hj05M%u^:_MNo*0drt6G4n1W$IeLPlQpdPl1EqcJ]49=TG^7lg:Va,Vu<.Q8G2teu&"DAo!_]KF36T\J]]GB&_'.
+%XC=HrbW#NhQsuo'3F;%'H#&h]&4PO&`:t5qND:?SCc]=^59E==1j)a:MmMu4W,*8k-QadUXo4ge8 at eGAnEN@,RYu%0L.76U`<1G1
+%'p$3L-YKsBFCKNapp;U$6iNMV_jhNJcJY.]"tkZ@[;DB2^9e^$qX]%?FsU$47G+ts(hj0^[[\5S*^?8[:OsbdniJMeOd9mJ4quLW
+%"U![8;.A-Qca1KXr*D]Y7+Lr;4sC)A^1T]IcGmki,+5lAIgS04^M?e@#=uTna7prAE,O00l[t=k1eQRciF?<;0Q-%DQV45>Uip<(
+%2eA=[nf?&Y]$?i]H\PI;*$Hf2U at L2oSP7pX(:iPC]_U1rj3=7pg:mGF=XjR`?IVRsQa,J]T,a>IR7Q?<HoS(@rRC9_4"gm&j>G:^
+%Il'461`8scVnJ1Bpg]iJ)+e2WOK#qcQ4^28+l&A"XLp=okKfX)[Zb(&??T4![#%%>D4>C2`1SB:JpE.<25["]aprgO#r^IN:J(uC
+%5#[,q3Z2D9c6V#W^u(K>m&!jKbHT;%RLaTlY:JM,-IS!"9/JI_])1rfMC(5A&h&U-JWS?N/[%RcigZChYFDh#"ZV]m;X3GgkrEH;
+%Xa)'#,8YN%f!!//m<M]5+KTTiI@>XEG\SrY>O3YPI)FS0m.t]D'D/s;,c.j152[9kZr.N;pZY`jlqiGmR&$b)2W^K5m!2W0:f!p+
+%<R!u;#ONd8A9UX*'[BTOfh*.WE%a)33^m8FrhC*dB=";2kmnCSA[@TPIj at p`aT<p1*kJklDU#(e[%5,(;MBYN?\1Moa2I2\I=:ai
+%;j4m?@[',U at S5dq29&5O"Z^?=db>Q0je10NLOf7CGmP.h8_c6.8NG=ubaP)K$,'1-a[a`j->1=Lmce=A_)`)7PNC`hK!7W)>phhT
+%pgU)mU;2OfBK2ADp3VWMm_#G!a_F(X!l+0rohP*2/uGDu'4YrNpV0Q0`0!#X<RtjtT-o)'p=MIQ)^0%3=b at iN71PlNcuWpokC[\q
+%.qUZJrPmp9e/B7s9NT5u?)"[D\q)Y.Y1Rr'[-OlM)b3K<1N;_Q'+MXi8<!uY%KE(SM3"`Z8skguq(TIQ.o].s5]o([E5Iu(k5 at s4
+%96HD!^9Zrs:0do%pOiX+!G;c:m@<g<4HJ!;De[9k].::618M*i-I_:fkANVT\rb"WQf")?Gj.6[&8)ipZ$XPLqDA06ilE#8qG%ir
+%N at +NP9cIeClk*/3Xra(H"Xk26(>pbb[,WDnhG-`'PAIUg=:7//oggDiBp\!:UQr"(f!;-+9L=*J>5>Z%AEtn`+SP7bootX(:h6Hj
+%(bb?K*`^@kL%XeV'Jm#PnZmCn#W&n>LW-aEDq9A5M.h9DUni8hE,s2G:2Y)B-W`:a!5C75#dmoSm+l(2jP4&j0m(C@<aAI_0`,_l
+%=4`HXP<4BaH(E\h4FKg4fZ6"a2-a)UDY]EG'Ur3/$+U:DfB]#-Yj&B[O+jl+NpHZ-KE&$Q,a2)U:>*,AF;>A=.1u^=Db]'#^WQF$
+%:GWOB9+oeS93n!^RF6aj7$?-pk#=!C,69_eE)S,b:OKDss/&onmc7l2rH;D0hK^]29dq\3B!GHN/OT>D9Q:J6bBZm<Qm5aMn9;F@
+%PGQuj>%;$MXf2qPK%jM%L%e,%8dU<"?[`WEJ;p[UJjf$g"_;CH.rWgB%Eo+IHYFDZ2 at MWq94K^sS8OguEt6>99dOPYkc6#W[U:=l
+%?+V.p]-nIT*.Y;bY_+C]D.H&[49,8a?CZgjZ\\Q29m/I at E0/Q29(cHR")US7=N:UO#O)b`qO3M8#GBN"', at U8hPS&5AkC5=%kSEb
+%M#f%qNp4TPZ7+<`Vk?t"alO&W9Er`(rqu]C/p8<t]k(q3h/dMVJtGR&U(n;p?n]$W1OXc4>5A-;'\]g.F'lJ_;ZIP\&93rP91*"e
+%-1`1)Ic^PS/St(@bPKEpEc=j:m;AaOYS(4j=?H=Aj]2B'OigR)F=)/Y-`)hJGb)=,hrO6?:9JOMV1M$$ep?diaZmd%#;cV,J#>]s
+%:BX!kU^L'#P#=<=YOUi5Y2?B8e.&^(IAH3l5"\;dV^iSAr)7+\OUi*&RWM at tHmb9b8u-p?O4<W!bHq at Cg&N4fj^X1G2NlsrSe!.o
+%H/lQ_`]Rpd3A+PI4NAZ]]$:luDWm,66*M-+8_I9f#9VAs2DOCc&u#Uk/\ZMr$QAu3gRE at 6guMmR=lEprl@[p`&=`&/M]N+IJR7bP
+%rgp=.bT:bqCuD.@>)j?CHTh^$Y*9?;Z.)-M2_QSQ$@cE$\hP?k=_f:uff_Y[TT%=@Vrja2 at Lco<QWHR]Z+is2MU=O83d::-onu`<
+%;k[;bZRrd"SFV3/,0Tf<UmFRWO3VU[a[k[U\-D>`c;(T7Cjf,oBN-WrFtf4_H'LStmrOBaV'`h-).B8!ho9`-f4(E9Gk1.3Hr^`7
+%<eO'>4'bKUR918Y6d1rAh[N7,!p-$8hS-A$?eq1cLn7ClkW3Xj/dM[D`-/h"j8H*n0Rb\^c6+=fRa7>]X_D!7n"\A2-A[ln'T3N$
+%mcF^sZ,GW$K[$B6Og?uEW`\Jn]KnHig>8h9Ua;A14R<N7/tkTp3VU3'=Z#Z156$$^eg5 at t<o"c)m=ut[K?0(<qfU'i7"+di]%nQ]
+%W1L2]#C3tJ(M9aN.BKk2?OpV07Dk9n9!AaFOC3nbqS`keB_O_])='.A<5D7R9.>^M-$)<mihfZ at FL+S-j*@?jTA"'bM0319KH!f/
+%g1R8R(^-qS7Q_mrBj]+c9-HG&Z;sf, at f$Ff1lmZ>p@*P6Ke?cc<[--PF1sqhd;ksEZ\5S at -"TE?Q@@6iH1`r3Cc'e)I;EIEM0HRY
+%QkC at G19q(K4\$XX8Z"3Sk0Y>Ap*o]=f."kROY'd'GJWcCh*Wgg4*O_bh#tdH#sZNseg6Rh at C3HsqqWeaZ+$77or0JLLMk)%>G#$9
+%`>G(*aU98kWH;'J,g3cUWJ="75$b)\\M5QHc?'86`bYI1,Y`&0Ts;nJ;R^c<d-0I3C6AAtKe7Oh5 at o\B_#7#3C'm(/iQ?ACZ at fV8
+%\cj[fbo\UIU(T>]KA=VN[H9&u('o,qNsH,mWAi;F</L at X53miI3OL+hEEY&@[4/XpOQH'_W^X+WlsJDsHCbZKJ)hTXB(+_R9!V8l
+%[Y2A-T+NE+M.>,SSppD1k+YNoTJH`X+!r[?T[D?78$XuWM0<977h1G0hEn(/j%QaWek0b$jZ7bAI+QgOCRud9o"eLJAUUg$b7NEV
+%Cr5A-'.^s]Rg._M8b)olG?+i]5:fl8eijf]S&H+ln?S%\'-!a<P*hL;ICWp&<]Akl&hBGJ-BkE`@GF9(hlbR]6F1]n]tV7Z18h:k
+%BUAP#??8l8$%D/<.,t'nIL<DbK'/%a4D4UYgS(Q%Chm!J at d>%*>foZ<YSW7O&gX^1^J?Cb42eldM^A05)`]bV9R/KUeN%`<`DT`o
+%,gFn1#6V:s#ObR7&0A<:SZI:o]5RDm(-h!EcBX<,%e:ZfP#@1V^jq1fM=CQbR+-O/?U);d]S0bg#5aNC$_T]Y:-Icplq!KsWMcNt
+%jr`5,&_PpFo"!mSF0%OfoHS&;503W/4C1*48"`jp;H?@D<ni`sX],emE\!j7PI9P:pgi(?-!j-*H3?R1G2fs'oM1b]\62C:jVSY2
+%Vbr`+'O5V6"^e!1A4D4NDA1#?8[7?-kMA)GWV^eQ;6t1W?PGgR-,7c$ct6&oI:BRoq,lko@:e#2:HH7K6AVJ*D8q6;At:q-q2.8%
+%Cpm4B!6N=uSLC1HnBoTs`Mf$31&]l(>>p<Zo^/i]V7A9g9<p?jSQ):58$^RG`6;Z\Q1M?L2]f35FOE:nhbL3"Abdn+#1Yk^IeMe<
+%nSKXQ at T.4h4ffBeOLV*`4.ju`#5bGAgs&_kr]W,3i[/?p%!-sPdnjul<iO8o^MjjE.*JlRDi)7B?@XUfR9Z9\:CMccII:[hjHZR_
+%X'MW#Nk]tJ%*]#QYfh at oNkb8*bkcRYgj(l3^QDPRB*@5cM=tR9B0E/,HgZ;SPZ?c=ecs7`q!tDDg[\Q`^Mo!AkXa[tj;k>DC_C$/
+%]6g8"jSR0/T110h>'fur<04:'L%kVs1J.#_ra`#p$=etm(V;F\S5JC1Foj*C6.##9F0m*SH4J[g#;^qpcI3+7c67S>%/?X`.sgi!
+%mb+*3DX-rr9q[rj-$o!+ShJo`"F:PCbt;=1K+7ef&T/@$rTnl=%1=$LiEsPG[Q at qh8HWY&f#kr$1`3'acQ#5`?LrBC5=QXUM-$4Y
+%0b=/bDmSl_Z]g%Y,[Z"%p`_.c"89?H?(!/m"A"-f-%pr7o;2,H1m_>-hlDmdkLY7\]X2'.C[+R#oV5f&S3Y0=N2\u$QlH(I"Ef0T
+%,oQ"6qqQ[*[C>Zr`ga>-?[MW(Ya_Jl7aV at Y>hS1%jEjI7-*\_?/`W=HYPE]*F3]iH33Dm-i?9KX#E+5'1/;F*2B/E35L5a,BK's*
+%5cQ87q7J$kZq6KC3+jJ7_:?ATWNUo?P2;7C*TSq.\;;^h\Zj!saV.Q8jLZ9:BII"=HdL];Ume*rU0p!j*5fN[M;9Y0DO1&l;QgY%
+%c8jWd7KI?ESLkkpp4Tku4n#qQ:PL7%+NZEn!Fs()XG-qD+AlKnaq@`%URO&+.cq_=Ab$^V/%Q[4&G?)iG_>NVr_/>Rh1F8hj7[MB
+%Hu^lHgN1mo0,`:m&BtV2B6>R6(I7J=PCW>fg5p)q`*`eo-[!'TBu;D)Qr[m^U<^:;h`%*Y';qFID*A>3`>F7k%Z(]?h.Na!OnX4E
+%PDtX],Gg-Dk:"[@CTmkU(`ffC&t5VI#J2TN-.hi`Z?eB6/RAWm;l.)scNTBmXlHPK\L)6CQEV\R\74jrQ(rtK/@^m2#l`LS]G7Xd
+%PZ.S??O%52p@%dJm5oabUlh/D+;+$Z4OS@?njd`s(/*tOAc at 3<O?I1:6GG(,G71?on[Q):#>$KtWl%0Y.gVE)7Zmn>>XGl9XuU3^
+%XP5\uX9\d>J30YPkr-)=>iAWub99&?[ltc:WNY^b-g-*TJ)'Y8ZSr^Mnjsh'UgH%r/HhdL6+2<F>`-?MRR!C-:6LbZ`j/8khWMS8
+%#O9TqYs#X:>WHVqk/-;8P>C;^o[%afXpg=H#SDgo0$`8LMHomXrd#D+m\<THA(erg4=-ufq53fO$*BPciLi$/2FlUR(Ja#49`6"X
+%q:EMbp[=TXb1%VG(.Vr.oj&LSenUp?<KC+81q=>u3QfClNhJo-LV.p&okb"$N at B$F$:S:D]fifpi,^BG4L0[<49pVkZ*X1Qd[bIk
+%Y#-P:hX%7FJOC./6kTcl!'uY+HYHsDCeH7inS85Nc0>(gkJh#u*ZA8i"K&t'5HXC"KS9DCZ2\P)P,i,:Rt=l-,Z3^E&99Q(;QsJQ
+%=;ZNpE5Q`G&Cm?,(ihq/J`lc+k7<qrq&anET:Oj:mPh@#\/km&@m'H[Dqo8W?)2RE"#P*OMq*o%9'.B*n!:N;g7.ugkcd&_`!nsX
+%d/k1bLQVX8FZ7[aVI at 9W8M5bg2:V[^\gchJKrCuuKsd/pS(Q'Qo.sCf3U$gkf0c74?cJ2X+8b:l92md9r at s`%jBf"[[i1hl at o&<J
+%..KACbkYG$Zn1X=(??DX]EQ+ at G7eIWMU@t7`GWR&JIeOFb.Y5TS%R#N\)MNTKI?*J#O9'RjI-U_;FS+/GoR3qOaO*cmfWHj,]T!#
+%4:RZ%YI(\EU*P#!lcG46YU."%M`e?fYTp\I'Q'uMm::BP'V4^[RCdrq2l(o)*%a95EY]Q:n%A*YIPQJO$an*/)Mc0,_.b1K"(Y^Z
+%)%$-E[JFo+.;5+Tk5H]<#5-DuiS7#rap:'D5_JS[NU;7CcH<V)XJ10a47 at IsBCKC0dY=,N>n52VD[*#JK+GrL>Xi`B;lD7?U@><>
+%C]jLILWH.(GZlG(N:Z271(as0ZAio$Laa^$X);GLcF-O=X&SD_(?e>k at O5u`r';9aj_[c^fR$pQV8'[A<8'pj)?a"_DVXKI8N@`c
+%<NCkua7X*!Yh at b<hTsfI!(BC#_;1Ap(=d>ONZCEj;%%Z402l]m"MW\[/GBK;43)t88:nir at J`+J$4G<j)NFL%D]Y+UfS#Q*R5]qm
+%Nb'93l2Ei,Fc+c at -h.081u?fE-<i52VA+18-Qr!6N3%%V=O'Yhc[b:#o at p.M*SDs^d&1_<BUBe%EqiT3,N_D[J.u=!)1lN7GYY9u
+%4-aDT]FeQ5T9f at iSGP$e@,QI1P-- at oQR*I=3]ZKeW@#aLN=m6mD&i&998;S("+%Ur*\?%1r_EILbA*4621jb=UpK_O=<]CKV'VD>
+%c\V=nm7kouT&2kl25cm,,$UnCR$T at k2o*%dh"/_]kKpG$2mt<e/ks@"5>1R`KBHm\?aD6fH4'k\IR$:SmsmT)5tB)0Iu.oi<Q1.a
+%R)bVh31)>5,knY at 4g]/#$gNsK*sY0?B16mp;E8UsPH'"PNt%YI#91Q"R*JiJJ>H*dUKuXgVQD[^o7a/2Zgg-2Ds`*;LMgHKL1PZ2
+%j?HX:L&Gbla_g<1^*BU_qfMXL>VCap`R at f03?p\#Z]MAbN_EBOEj=A&$^<X81]<1):g[fJGYa)-L'2+LG*EKp>62LFS2kMn&P9d6
+%O)9$87_j7ZD3MVcmW&!V'&PgDQlf`JT!bt62PT4JGI9n!$5jtBU?4S/BVN$P`NV6:T`-nrSubGi0TLu:47i57S,KWd8b#sRPadB"
+%9JeB$dl(5m<)8%h?Qh_pg-/WnpicJX+BE@^YqB:hj\AXji3fB.pfB/6 at H)ijcYYh5L6fDW9`Dd?5qk0&%bW]jSFiT^&aO&&`PJ7/
+%WP)&6Mg:0He=bZo^FOGlmSO95Z1F(l9`h]nNT+/IldpbT^\X./k?>QfCWoq3STNTjjpi/,o%fIMZ.CDq(`4$;$6)]q!#$b+BIT=;
+%K]h8TP*>M\'$u4*P.,/j#$%M"Y3]Rq:\:smYnZdMLFQDa3C'Gq_'Z-;cC%,"X/2E8:#g#)a8b!KC-.8I9g at ZM6]q_qZY$OOPE>Ua
+%h4ok$`iOQ:OC?n.'HO*7eM-FWa,eq=Q,VgK*7E)B+IJU`/85GL"Z6!kKA$&0G/FC9$_-AYRiW8NP(e(C"UBl3)%uU(d4TYj[r7tQ
+%dLX?:$!$&aQu3*81-h^!>Cpogj*LYflScF,'H!-WFLP>J6(h+;DTZMc@!l3??,U92!8B<gB`s&!%j[L2a#G6<n)Dj25:.[<c4-PB
+%m3+A.8Ba\EVpekpj)YK)r+rf-nn at X^KA.'<$0S!R*r>TnW=!6h>.^l;Ro.7MI[152L[i=kbSAPHjDCA!q(WDZZt]hs&!R7@^6E1O
+%'nRib].<Pjo8L_)O!et9&<KFL%,'"6F&<.cE.03G2`k$n]66niDN&S*_h8Fj+1KdQ+J.cAV33]l&"Z?3XIqZ6iTpK6_+D#`o&O_X
+%_0kO0Sbe?'Kr::T8No\ahi+K8QY^jcq_M7Ao&!-Kh7eI at Hfp,m\e[%1k9QqUPPbU1])3rCX2OePK^e[bP1"5(`-9c!4Gm*fP/'NR
+%X[Zd3D=d<].EE1L:95t+4 at Cm#;SenJ2'342JkRL]S\/Y,%%L>+Uh^brO7.E`1^Y13D&TlJ^"Jpp7"t57;hG[[1cm)*5X,(F*tme_
+%9lS&acR4#7eElQ-&W44Xf#,>TF;seb!^Y[JQHQb8gT0MA;]&hDBFoSTVVGf3g-/S^m6#Kr at .nD4UK'3C(HGWuQ1K#<f!!u\M'$,h
+%I%KZ9i1]2-S[JmOdis!.j2GbBCYMPrUe^`n=(c[6dSne+kIE>:pjTc,=>i+ELMBRSB/NLMnS?q at Eid%#L0tm(:COG)aB`_j[IHq?
+%hS`V^Zml!h7q!$P5 at BF7I(9fr<8Ufqb4.oNEZW=ZPtE(Ud%]<sKA9FlY30=AT4!Y;Q;Y/A1ANVmV#!JFdK,$=S[r^uE&fQ5D1kKP
+%4"tTp`GbpDXn28l/6jRcb.BbaQ>Xr)I_t;l&0u^(&[Li<cpt1Ul801,_D2W2#ej'BA]jB(DOF`t\=:Q?nkW%06)L?9P:(A'#g1oM
+%3K`\GOhE\*`QQgsidAUG_UV:t+GD42N7qF`C]Uh/0DE9<eW_YFp,9n/@*=7_QR215dYD.Q6IFjYH%$/Wj=-/@'S:Llp.:7uWNr<(
+%mrm`/Y/-GGf^X=1WA=1l#LV21pY#>=,HJLNne]>mik1H[@*:a$'eV4[#qQA[$Kt7k9_%pEY[uSWn`@S%oV7,9 at 3[usSS<^RDN_(]
+%iCcGT\PD<eoLsfsVdSr^+h"0XR,&Zg`.?)L9?iR`XX@(fMq!ur]<muh-53a#@oMY@\Mi)&IunZ&eX2(kYb07CgK&DQFXt&k0B[Qj
+%=trhZMG?$f0:8t`['*/oU)H/EqYI at 1cGA[^<[*!F=a;&70./*YK,EH>$nB<',YqbH-LN>Rs3-@(rZgkjKhEOaC;8iU2E/G;)>#[1
+%XiY`;QsqUQq'B7F=UkW<F0Ls;a5 at cS7!5Y+TWkgLLmV8imT[D=:@7c/3_1U>M0kV;jUMn&SYe*1Y2%-UjgR1c_fP8[;m;kU#Jom,
+%l&mG(.lpap6p*5>;fPra,K[DWH*PsmNUmRC_He!OJ54:!'=jHI[*-915=;)MaUOF,S-r4"4bt9dll$;YG_.nGc37kDkO#af<u\mR
+%ApYO^%0f&TYC,7jc,Hla83luV34$>a\d$,$(P\:13=QZdRV<(-:&jQPopHcRe]PXTh+8\A'W`l1djXbNEI>:.0),([PXo';'"7AY
+%XXH&-jAR+i,tSU,Ju`)'3WU$277O!X!fDe5)Mckre-Qq&]A0'M1mqo[\e]j+XEoY9P!PrTrFI4.#$l\n-WOEJk+#, at _0c.Hk/_g$
+%WT/"VoCDLC!^LtCJO_#l!TE[-W[ee57Vd at VVK$KF(mj^c>3N%F6!'7k#]@=M.DXtLpY5hZrQ3)Kci%J1TCXib%`1SVV)`#J%tO"B
+%_YT`!Q2E'pk12:`5IoJ-(cS1*2e#\A6DM.gbV:!;ia!q,2F\']c=Q"PFJ1d4+61ID/gWgCD3CGP'Ttojc%')lp;POe::=)M8;V0b
+%pe>+T0rL9eJXM`rLCtnil_)Jm9Bo75QUF/e+\07q.E'LZV,BWf*l<"$AuO,38JueP"cl`k/nlqWiMO`he/cOi"5ihJo($W>rlB at N
+%K'f"C1f?73Zh_.1\'rJJQjlj?aOSg43[.^c>saHAO*4TC%c[32ij,X&&h37354fmSq1=<<R<^HR2\A(m;-bo2?*dd.FQkoR*0>g,
+%#fjO7Uh\ZHpR$M.kQtX!pEudk at 8!sKI=OTHc4=D?$l0f#oIi9(M:?U4Ci([9.SO8`As]D\n8OmU[AQ9\F,i;-i>F=<aUu9ZFEco6
+%Q.T9MpD!V[M&ur&Gqg[\-Ecgm,)Af:9fkkPLL3!d6soEM_k&=QHPc4:4T=')fqc at ZCWDfPr;._KRnp>q#OB4Q[&F/SJ+/h+a]N3@
+%8MF5j#IkZ2%hb0BSoWHsh:\*W;9!I@"eiW3!-#(RJQUL)Er+(ikLmLabp59'9^9AK)'_DQ#>XDVDCWUJZ=D:6g!Qcp&dH[PV0uTQ
+%"+Z?aa1$L(4Y0T?p)>OU%]L?Zp.0i!d<#d9IGuA$U>j;f_.R"LEIMr\PCnH-(Fn,YeTqRk'0uJle4IeblI[*$`TEO6KnUeC_-"#V
+%SKc-1<?9YU&s?U"Z5#$P2UP^M243$TP+[<SPWpg/nE+RL2H,PCJR\Hu-W_#aH/G'\6D*?nJLSTL+F51a3B'Z1f5JTBbcHETCf1oX
+%.EU[XhFDDG-/?R3j3,>68SEYqkKTdalu8UKW1cUt6D5)j2eH5"=ng;/9CtE"h;;#%)R*LIT9qQBcJ*Vb*]uE8OFEl^&kLZs?5iYd
+%YZ;)K7coOPliU0_VW'Zrd=.uRS*-%T3XN?<:u=J=bho0IFZgaD<8(%\a at F2"c\\n$REBAr:@^4YDh0\q&d1fR-s5,Q%FhQ$KkN?(
+%WHBtZSZHejD!(g<:g$U_brp*Z),4"<9%;+,g:s7W1"eXS(g*oN$jYHjqnp5[oO9M7'+h#QR`p@%1"QG11*oS/%YRF$Nt%GgBk63g
+%\X$X2E"+FqO-4;F8)UmN>:2nQZr9k\&E//(=UZ664s\J!WL%m1fk?G1*,!$q7(ANb48[]q_\,F;""a;gSG68cm5WF;'>J'FS;*ns
+%93TF(3+sI1rJYmqFu3*n)T at R&QKV[6Mht;V1*i at 5[94H5Xf"Q"s&o<J^]+ at 8^';75KFdCrq;0OhV6/FH9B?#kGIX:#&epME\NI&E
+%+`,Y"]E*`4FKjPBE<@g+W04`<DAfm/P#,e'DS)Bi9E$2j#p_"'[28/u!!YN.2W-$nqQB"N=)LCM7X\]a^0Q-Plsp76*49ekbE)K'
+%=hbnb:m*T/op&*mX`Fg08Vrl8R`b-M1*R)_=Z-L$oj%IF2^pCXJ?&uL/l(e5=E6UQ<d6,G3ud72)%.;[:0DI1hGA,_-!U-?DGFK%
+%61!+Nf+A=@1G_$o/h0GlEh&3&;fdX3`dojP%`bl_7;Io#A>4]B2,CIR:pq_up:p8M"G-^F]i_/Q*Hg(-rhs.$,MhNH`5r!33!bMi
+%AID*=Hr!I(I+U>&gLSV at Vt%:=HK;'d at Qt9PSuIm[q\q!h[O1fH>%<hj#AFb>66dHRC?6F:W*Ug8#?$IS3Xa^EqH2D]UaS1afLuX(
+%+,IhIGj at 6uOq^I:Xg/@4.$-^k[3lM)V^Ge,DP at 6'S#<fg;tLemI=tE7]D_)Zl]l7Rhh7pUKZnksD9)%[JfC1N2EBqeMrj$2C(iI#
+%QO1i,4T>tXFsM/rd+Sj6V`SP/!95Ajlp*5I#ph-KD;8qhac\#9 at Xmm;>/7_HIZi&l>L&AoIE3#-dQo5 at OC(KYN/Cj&0jV6P`I2F5
+%Bp at _6foZ"O2?/k:=;'07F1_hu]T at BR5pLZijoFNbU.sfE2ZE4A-%5K8P=\AT-hoe4<EhgR-WIJ%Jk at I41j+u[jd(;u0UjN<-)Hp9
+%<!jX+YXlO3He1gNA[_S at Pe@Cr:lg%=P(\`?9r*R)SGq`ZCB*/@U7696$GpU'qmW-gEq7Z0/[_*\$A7udfXAP4drZg=$3*+45t5 at S
+%7rcC@:,q2\k(A!Z^I4tW"lmK:Jp/;+3Kc4YRZi5!cH01n at h7_@0;9[r\"R7dV,@'No??TC1=/Qt`05$"hlIK9`j#5H- at ZY0/c161
+%nG#QX0pWM+/VkO:nn([UYet.@?NS+Y4n=-tSPp^>8Dkt=P2*)@^`]9867=gRH\*nGI:&J&9+<l;BXO&Deb7)5>ip:srmO40EE,X4
+%=d,Hi"?:s1ekNBo2bO9#&'T`90O@)$\c*Y#/Yg?3Z;\!'juS62qm,l[&iMIf8B4\G8c152g^0M#PCg)l4r3JaM/E2RV@@W"lr43R
+%'7Elbha9^R&SY.23;+[5^Ia9;#LaO!,E\HI?_ef&K/'Tr_dK<9+9oKc]T]k'LL at Xp]rZ)[S&@3uIL\cKmFL]`W:W)=6J"fc8S,Zu
+%(R#gujrdd0f<.s\=9?Z8.?nc=OmB/$,KlQ[Y3JL6<mk&A;,e\P-?PDlUD#joN.6M!'1-_$[tKZ6d`Xk`)Ysdc\W$X*jEf"6aeko$
+%lZZ%iZ]0!#-0CIWPdEf,j(+EM.=Gs>Cd(YO at _Pk3J@3,h)+*6'!gE!>eT>TmYMI-h#XT)*:Rtc-X&kp-N?noFs2D2Eg^K2LL'V76
+%>KrXGp6iE at N97c/')`/Cr=lM;gA.$^K:IkWLka7KM_N6-R2W%WG!;;u:aIFHL[Jps25hHi6P$HiG`@KVpnqfujlA!u!>d'jT&<Ai
+%FjI`o at Tk=QD,8I#>JKFVP"_4HT at e?BJjo6Z9\mOt`74NO\c9Q at -jEu>%h$MpFhD9e^sWSUq]&c986&XJZl+sq[neG=pEcHi3N"f0
+%.SP">cblM at Oj&/^ep3htTUI*9De'D8CAHock7o3nBC&@:k7s-3(T<s)2d!+91.sLAck^V:[))76X9aGL<EK/jN^Or1i,ON3[-B1g
+%eHNUR/WODB\kN>SVQL[8;WH<rjN`kBq at I\mq:<o?7FPdZ:'3aVgDAn4r%5MO3L\P5=PE<U;kEZ4<$Kct-$^;^BH6N$15N-Q18Ju%
+%@]o3B5)T4teaW**NH6T*J:n<eGui<+Uhl;ZUZ,D:X`qW/lb(Go&Cl=3<lCl.(e+u,U at Lp4T'NX,JCtmO;f?S0j3$n7:M!PjNoUSq
+%Y?6Y,IX/!S[rVgO.rlc6]q^;E_<'#,EP@,@%=uu*W,[!@I;i;-'^A]+\b)[9e3eKX'Q6^m>f^)/LdVbSHErB<lX@@%]cXg^JTE>#
+%TR*9B-AJDWUJ&B#Gu!P>Y9-K[Q*/H%6u0S.d?KmWIStD.#m at a:"PT<JPD%\lBdAqXf$<+k_ipN\Gm"&LrF>K<`b+/qjgI?;Pg/b;
+%\)LeF-ic at iGu=e+FBuO^L`73fQn8*NH.A0el"`lN[]6Sp_ud\6"e97OTDE-DMLHblQ<Z=l^N6Cr)T8Ml-%G;U4eJ6b/O#edqkT8%
+%D`QNn9V*UtL;`^TiYmbK.TaVPU4AS`,^Qqc1+X$b/IR7!R"Pd?eTtq;"VIC06OL"JJ17.]U!5@[*g`KrGs`$SG.X>mUr4k9.s!R3
+%7T1>/bAAFZHWg6s5pD8gdI at Oma4@\P&Ee8iSC;*lGj)'[TcCkT>>rQ(n at mK-p8Mkpa,lt:+d76.2ndFuk"iVC\U"!;e"Uc1ha'Y$
+%^cZM?aRj0:\auGjKW1cM^_H3J6pnUHKg/F.[&?l6Wog'^S9.n1,b;4C3pp>fJo6XI6m_%c4F60/8)@D*2!Zaif-ZTso13SWa%$sV
+%IQjhM3E6;aOmR$.L6%@T't`%aF6DMfU!BPEoKLPc7gfW6fZ\H/"Kl"U':XY,>s2H5e73d<&+Kc;i(Zk6OE]<5 at A:Pri-P*r8A8$X
+%P^d)`07e!.'<iZP<.1=mBkV\(J#R4DbB$PO/:XknNi,tl`cMUpf6&%DO%E\n\eMF"9)`ns8aOnTSW)=FmhotW)2ua3CWXlFF\J,V
+%6oS:_H"-6SZ)BW!C(FLfa'@JM/U8Ah-T<4IAD%DI[_W\l)Yb2[^Yn`83IksRC&CgG93s*:OR"qdqr`ju at jJ,LR<N-YV=Z2fp0)WX
+%3C9;/7kT5h at aODCP+)54l`VYW54.c[^6^ltJE``t7\R62*GW/"&*k0O2S>)W!L&u!GCQsj]M/-kH;`TmXu;lA9Ae6\:'ZmACa4M'
+%pg_E/),2!;k>^f,l3&T3F.*;2D"@JQMTT.+'$^R`;QsGcb>L_5J*4*!1FDaR<&@1?W(^[o1chfG`_[mcK1?N0iKo4_IjFTeACR_l
+%Uf at .)D$Ue6->WVu at 2]4>!pns^3&@F_\\RQH;r?[.I[`%`R,Ye>%?CV%2d/=06R"rQ`lEOoZIP7r^k-C1lB6Jkl#Wl[?TVo3mK&8*
+%JJY],6ulLZ\0k71*\77K#;7=N1M&d<F)-:,#gXR=@d17?MPdabY-LeCfA+AE/XVE1AQRbjX6e<UkW':d5!57Fr'Yk%KTb?_R:O[W
+%d;,,BI*UV#(/o6,#EBWQ,ihN1Kk"6,ko1>QUtr70<@aj7":0HGc^Ksf/e$QphKqjCPq9*i;W`b&I+cgX]LK:K0B\cF["3uW0B"e8
+%b/Y]TZ6=Wn$I]aB?;!\;;U14I_]8T.rb#OC/kd>91'baS:qYe>iQ%:[ng%qH_M9o8Q!rY_peUNm?%"I[bBkOR=#pLM]%l at RQTgaa
+%DO\AYma0NkO8PQ_5s\"b)kZ(=1Pj4ZTC:W^d\X*m96SZQ)+4=Y^AD0#aQ_FMkB6XRUN6(%'bOD*='Y,LOWo#O_bdXp&*Iq3IX`g.
+%BSk+-AH8DF1j?S9dtJ at N>Di7sh=do27X<0K^#kbbTHL=toDGX/?<PW&*Vr%#Ft=Q.oW_ee:W,q at 2;E*@CD6sW7'H/qK'eM#.Zn'<
+%e`pnD:RaGZ8SQ.+Ge'b+]W&i;AM)0XqmPWcG4'24>#9DG!VW.F5*6TP_tlRGML8`6A%>TbU")nM^.?$6RhA"^_Fm1\p_s4<g'^TO
+%@Z>QiIB6BWfHlDI3TO7NpdXWSi(2C at jm2*>*QP>WOYZi*:`H at 2rD1\:-&N"M-gAK16=-/gCYUmp&Jpb5r,/Di^nKSUC;4]*@nuC`
+%Y;'4j&I\1oK2(Pa,qfg6^6$F(G;=S.'B'nV#*LT?Wo_C#X<]4W2B5J!f`QbeFqP0!4P>,X][2&p^o<;%iqIQEmSq.Oac-LLY#-QV
+%SJZd'9.JOV&W&Z)k&,)4o:u"Qn=2+D--MJ(0^OKeiUlH at c-F5Fr2%XgQM?Z]H85NEKuEH<OE+bSCVuic5888OH$W6t#E'8c^XkT$
+%#A;CR%]?G)_S<X!aU\]]0<`.'drqqgn/mobd!Pg"&(6!`"@ofme/'L;L#_4cOs<K*.(:Gki)ll_lMY?%_8/bb9]oe/;g$q8gu`Kt
+%B8P-PI_N@`[tX>L(7]>bh9;;N"6JM;<_8r?+e/<H#Y<i_X_Q)m+\KEm_k=OR`6;;"m5et:oC,su]lefM00N+k>IS'f[3Kfr)+^;i
+%h5Sj=j02EPQ6olR>L6<7.*3Z7Tq",bp&)la,6P:_[@Q25jeTAYB)R9Jfp([3g$[XCB(:oa8Bi_3PB?:^C`MFdci"KR-7RDEDF.,3
+%GG"S$+*3^C_V>kMg,bqrr5L*O5DlHe$.BI%^:_(L].g'P'd%gE>%)K=R)i8cq,9q*L><5gbA$06"5ZUVHCg[K6UMk7QJXWcl<N,&
+%UR?$(afT[?mhshrn0`H#bX\I^,hZ/C<sLQ5=rO7T[J0?`AR?pEE=j/6bKeMY0aoHpIQQNff8A4pcL%p\qbE.$=sY89;1:K]Y-\n.
+%4lp)>iA at R?`BI<6dq2>Rpp2F]hHZ54=(,+_QoG?Ak1X at .H,#2FjS1(h,Cp(d:]t!Y[FIk71XJ7*rb^ZJJ*NDLG9r7I*6:8"NgI8Z
+%$*an,'1@]A[qXuI9Zj3_Pi]]CP>;JZ8ZjnFh\VfYgqnGggU&uUjd1>HY7pl].]`2]eh39$fV,j0j^X(n&3j6dSE2XWic@]o468ih
+%d4u/@/o'>?QfO\#j-_VbVSs at Lg23/aBqr.aZ"$Q=<)H5#,WNAKlFr57RFn"K#EH+2[T*$XVh-9N"Xg8noXC&A\O4>JndGH1Ft/i-
+%9hsBa]_OY`e3!8.e at Ft'&X>D(+o>6rheUKfr^:eP\=[2ET/uFc-_f^3>#SlV_P[kHn$JmA9IBL0cGl#$P0t"j4S=9Vc`W+B'e+:!
+%AGLE:kO3Q;]d7t7rCPj+?lu96.=lbN">1KKfL8qFb_,LnkW09,h#_'Uq.XIbZbM/O@#dLPP`G&cF_d3$c;*Y98WgK65cOJZ3%OZs
+%!*Wo"eT("9&<h2,]6H3Y8NHYL[KIACBTja,jTF?Vbg/;C4rrYI!-Zhc?''bT+lE/:2U'CdVaAo+I5MW2'ZKKS:D4:%XRWH7#S[91
+%bF>CMO?Wq.RUd20XG`AYY7FB$f=EBh?E60h9>n9+,s(qbH4'?H,L=QAil:&7HCpfsnO4&?HR408(8Oa/)aGj;D#7^L1EZKaM^Tqp
+%+^ist#^B,K)?aWrYta$Zb!8OK7l.'r.)-2A"%h)FIMI##UEdiM('PiR_Bqtb0?](rCQF69%IGA]Hq)$gS+F>Op;Xbu#!4J'2^R#*
+%(<!YTYHi^Hk*0NM1MPYs-UjkZ9o'uPS=IZ?\ZIqkBq8r39o,K^P+7_6;K!#rFg_gDU/Q^W]dsHVMuGZZ:t\UOKY%Cdl8nJ?(oRWE
+%r:,#)i0t.++4RE[U&B,8"E/fMbG3tZO0C;_0h-[F[Ecm[GX-%(:TLT2R]#MY#e=qFP`/OY<SIWuJ'#,pOjTE`]'4Kk3Cl_6<8*'R
+%pD4+%ZpF;W%/)Uf]un?r.UON at nPY<G)EXg#;U*8GM^_=2=Pi_[r$kFkK[CK!3>klrn:W5\CX8`hD[&PgS>rO-P,27crR>,F`]9M5
+%H<E76`M,^BJMi6N8(]-n_X at .92/d8Z.lA=^>j[m[B!>l'\p1Y)<i"2kU*1;SpG9:W;_gI:,rgR at E\Z.Xc^?[4)p,hZPgNZ5141+/
+%N;_gSV3]6l_Y,P&".pfp/QZNXG"Yte\_UoSa2<9:lT[hW5SMb4]N6\[K0.pVD0V>s(P]p99Vh$38Z#2 at oKoYDAY).p.a_VP4kT=6
+%]Q8(QfFgXdctkeH$PT6NM3.;hL/FM:'B"+14jVVP-d$=!eB1%q8;ou at C@Xq3IYkri/T!sMm7+qNeiC=M*KGP:e?pJd^?/Tt_L48j
+%[fD4>U!eNkPrSBiEVHqQ%mI2ursMi0_k\F=J#=[J05S98+Qn&TpE1rLE1J)#huc)7cBgs2O-JSMa5\U79!suGNblb1QEqn%&oE1&
+%q`c]_Y1$A2]2BmkCuugZN%UuE]-<3B6[l7*]1snCW9Hp'iU0pF*J"J<':N'dPc5;lXOh?LP#LpDS8$=:b&q3lOaOPj92("0#lQ&N
+%#/NE'ipSi)BBW_X1jkVTYdJO8CX2I`OX3XA3NCha'9H*HLu@^pZ?L_fYtsh^@;?_UkiGI'\=[`Hb[oD*5\cU=.']MRZ8+GJ#!VI$
+%.=.KJa_&Tn:#%a->N?Krc@(?1PP;EkN=d][Ye8,HGMrTEQ69-bbJ)#4Kdequ^a;@08<i;#HeUH[c\djUF24+*[clLERKb50<h*;j
+%?qhkDj@,/^(s"N7jq"42]H.McL?9`]mRsD++D)ST%'&N=fM*_Jh0FY6^g'f!ntKdeDD[^HWq<#KZP-BMkoh'=\&gpk`jS^j&p[/1
+%K3^$h_>=LA/$l&[0F`2s$Pg2V>e+ng&u+enl8EF\WE)PCmD+mpB#V9!e$UUI26m'Q$*'$LcL`:+:/FT6-UNf=RD9-,&Yi(VIPIOD
+%-B+4.n!gM._.)W84$H](6$LEN]4aPNSHAeT]%1L<]/gtj4)KRK8(>n2Z+MWJ&j]F-+EIZ at n7lQ=q)+[&$:uW<d4&#AG8e!5DgOD_
+%bTC3%U7;#*$8#hCFcW,1*sbIqrO-7%T+jD8/,jOOoAb>A;YBed(cQ5iGmdDSeQ9>@QiKgCd`ba53#-_0HG")\0MJU.XX=YI.H at P4
+%89oW`LH"W*08J_7/tCBcR"Uu;a7Ta^'I6krrb9d+9$<LZR7n>IcO26fk`O4'%p>M`_.O1L0on<%1pQZ(cK4GekDM-e%_U!J?]U^r
+%UW5k0'[MDP?@Bqh,Wb?TAnrUY?@IuMlJUbgQL6=tDP#G\k^/:Y[O'ZHNoeI^LCe9EeiF?Aad7*Nfb+US+>Aajo1(.Eaa1'2S*Njp
+%iAgi?_/fd#H1J&gAF\]W4.Su)\>iAo%i""(MRMWUgC%/O\t?FJ'O5aJ"4UH;*EI?IQJW#YF/,8JKfo\kT7]DBh;'A[?r\N9C:LRk
+%`@,3aT7qJ%j\DfIe]:RfK8_A=Y4g437kHi+VCsiEQdbX7U:f<]HrbDU/#Cf:4TuIuK[?9*7XgFG:m)m9H`dsUQ^VF'l^[)4H;Ti2
+%hZ1DRa`B]2SZ^[,\US6<UI_&tF_Upi-^s;E>,2?MU`_SeIeT7L!Kl;N%_\i9!q;@R8Rnkp%q$]'V&akh[.;Ol8B<7,NP*9/#AKt-
+%XYum<RehRuW:&A0OBI`;'po]#[hZ8Ml(P7M:,$D%pQr4NBY1El,=sZtXE-lXQ"KS(!I7q$bt>f/)X(?hM'dXXphp at g!*+;p\O?)9
+%;_82?kEI8=#Y)?\(N!>L2>c2d^!O"\[4%0#J(\/(N.3,;WHg3khk@!ce_Jk=55*/6XWMR/\M6(bF%(VF'7^f;R%JNk802GTkBpa@
+%-52EX^G.ZZSeRakn%nk3kWDZ/+5.(\\!ld/n8WEjH%8YLms!ARAIZRs^1er/%VBQUMMWNpgeQOK#4,H*?B:XS<\d;TJsSe.RYobR
+%g/FkABhE,CV_R)Nb9ih#>,6G$8+,pD/J_/U?oAJR4GpQ!3XgDHc]qJJS at YfNVE5'"9kk*R$6i$`9]jtqSPK-8hWNOg0mbj&l]nS_
+%DIn]<K=(S9%>grgI(MmtKDN+l<mfX+;8E<hTZhU"<!?1R9%>FE'*f+mbc*)[Fmo,oqsO,P!IDE*[8'GI7#\b`ns/nn*g/hr&0pAL
+%C$6YK`il73b72/D\/!2A:#S,$I^"[jkOZjtO9=6QmUr$hd;CbsHaqfE'<T5;CTdG)$;?6:oln]Hbs>[rC-MMga,-Si#Z87)/pNI)
+%`s)6=R"_^]H3r_I`Fo`$]+rb$[tiDbV%5T)DoF&L#Xgm:$'hL$7Hn[;+sE#XW/QdQ/%e3b>;CD/`#Z)0+W=r5J`#7=ef[d&Y(mmK
+%Y1L\TTPDE9F(*YX0ki)1/TkK.IP=.*]sdLUr^`3_W5Us:\)3YoDf'n\13JlmNGsb1C]-t4^.c at 4k/sJa=uYUsKXYsSrp!?ipqV`o
+%_A#3877qbRYajpu<[ERf[*urcMA%rf-3%8[^#e,^hFTeaooa,iP]EgR`QQ,.ZAF4,Zm8D>UGi5c<$G0"fDV'=FbJW,jXhR#f++hh
+%_7$.k at p-1gT'>chcd`I+3h2Kor,`sLPFT`Fjp1a12NP#Rr>cdH2Y9!C'J3[oA2F?FDBpk*AL`u+d$A<(\I$+%!P+qJN_k7k"&;>T
+%l\mH:PGp>ICh\.*^^*(^2i7+0RJ?:U:)rOaBu84 at F!X#4[H!+6+FU#>RH:<kGfY(XZ[!Ldp,io"P/f3\_L,tQK#gclFS0JHon,>r
+%4hJ.TcG=Y]]:mD5TX^W0N4cgola(p[jKYn!f!L[&ND<K&eW(h-OoeR.-Pd=Xd*uJ^Y#`f8\,97VU#n:`%*RGWT'&^tN'f16j\uTZ
+%:[E#gUpPN2)b3%Nr2#<t"u*@jL]+?j&-re=37pcGCZ32UV_ra7oFu5q51W\;$O<"$f7NLadi9KBbsr at ll+H1XV+f!<?$RUIHk64h
+%<*R[?KlCCJ3Wk9rSgp"7>j at 1HA=5atIrIQaW0AZ]:bsFUk^9\deW&f,fM,#gcBqPrrLI5hA$lhBQuSUE)S>C9X!N&*S]sO;OF]JZ
+%6tE^TOF+6D?O/J6V$G8KBZ?FO7/H-:Xk0W1oH)Z:0=D<[A%B)rY]"p4f"!01A4nIK;3%eI<s5rS7A9sU?S;9CchfM$pG84c;30t[
+%JaH46M'=7=J1?)o/#u=C&T1o at q9$"UoIUot0S_4)DKFYond1COAMd`+#d3k;4uMB.'TId1G4YE4R2k>a=BQ:0WC78h,?lO?l=\u]
+%PW&3.RF3E4Qn at Xh0N.59e^$RdpB8^]7b6g!TB\."j$bhL=omZZmjK0t,H4d?+57jTpRANBNLr at Q`n&`'&@*L.9ApFn]7t"&\bF at t
+%_c@&VIJWGYAb6XfE at EI)rZr6GPPog\'0OMVG&*p?jSZfpaot.^WCDp5&[D8\[5PL]5'.mn`rigV4;.U!YUBTJ2MtHo7/:R;TR!<q
+%"^QR`TM+:#hJgHogoLT`MJ'hXqsLL&IVOFh/AcR8[^B:HRgj8cgC+AlAN at S.@+KoVY)1Jf.W?c\@5<gGC@<"ULJq&(ABUaQrgI;A
+%;d$SDKp'(??,Ru"Q*%TjR;A%1C=i-4b[1LWYHk=a>(WjSma#hb+2oQ>l<.l6:1LH`dm5`sP7AQs8r/*fqK3WDbSAe#jppNaBKtDf
+%]Z)NkeUe14r9pW!qOW(Z>CF!rr3YjhAl&Qo\]Roqb#*mAqnD^Cq+!3iW0T^%J?^['k/]ZM_"AVaS3+9 at TU<[&A2p]%HKiOhkO`:F
+%;GU].d*c&7CBqII#%TKCm9,oJ`#7fb(agSO:$13L@):32,[OE]c`L;JSE021Zs4<(W9VLHZ].IoI=98nM\!JZ*"_&t_!C.bdF.k$
+%jI9\]])SY?V#BqUm+ie%iQ#Z"P_=PciTTsk;QH_LIG!t)3<Ierm>WMNUgB]m:02;.:gJn;S>crr/u1a.$2)QJd`@O\7aAWiSQKrG
+%L'%A/*9D(9Kq-JR`rFP&b;;)[Aa6t&7_Q<Y3BfH1W5(J,[_kLj0X at E;kU<9]oudKtQBM4mB0(0ZB_>HE0(0"NJWps@^>s^*B'h8i
+%c-rr)Cu@>g+O=XG[9=`e.YE")ZoR[G+H2[$3tcW+9+B/:X"MYKRYYU)E)W%bcr^[XN(ikk336#g,<*a-51fHWAjS]TP*;3UC3OO$
+%69t/e'i at e6BBrf&0R;6[ZEt$TmdRb_JWN:qJq@?TV^*VNIuk,`oj at TUM3;dl,[c(k^GVn'HsY0$IjZe6EuagWrs67t$UG at OAIJ+L
+%i#1+6WA?M2g/@\oN6ZJ2RsO0V5OXc058BhK[&q$[3`0)`&/QT/g-ZhN"sSscc?(3^0B`;<22sn"02\n!s."*5XYHV]_=D[nWJ$][
+%K,dWoBsI@$,aIeK?EVb?gXbaR:ZE?oN`o129l&%l#-PBS'""Xo#2C91+4Gs('gupa$c8H7pKm9GU7FI at 1.*kUfcHXR'UkD^,M!)r
+%9UUK;j;%_,d+$r%MNGCkGX4>aSkpb>W5t<?.7`CI&4QT/9Hd_XJn)68lj+sM?E"[__[5P"O]bc&J?7h`<,rMP;8QT-k\83h;="4_
+%]cGO!09[G5CgcF-+OWs'9<uE6<CE3H"smkr60JTAq5'*?M!OjWUkFcaI+;+j at XJg7UK:A2rh0C[FkIE)L^I7Cjk<8$5JQSnXRdd5
+%:j%/OO)EX9$=_+!YRQc)%i;?DH_0Pjc8<_74rlM1Q9WgBkm>)F+._?__,?QL at SX^ME:bE;6A-*++oe`/P%*^&2u`CRNd)iP67ska
+%Uepd,0mfp4rLTW&`4^QI_OshJqrRM)"#1gig"0uA<^'_,H2\63+5f-;NNginpcB*XN&b\p at somXC.84q#!;_,TZb%8e<-ltec8jm
+%G'h)3DW,'T5PI at NOoIguE1eJN?0*"&P/'iWK$c^"YS'."nh6gKXg^H)[AplGX8ZNdE7I/9q<^=&*&XB'9k7)(4iQY`;g`;\?Ws4s
+%dIYr[bLpO2drFAkP7*dGZ4A%74#6!eO/DK%[Bt"J]b5^5VXbOep(]k?/#8i[d)rN%h=f.s4`&k#<`;$9fAM>s55Lb*)VAoH[Ya4Y
+%hoY.DXE+Ao8XWM%=UD)'=393^oN'g9OqcTeVf72OXe+\2VO6`\e"YfHgX_pbAXtlJYu7`<rpS9D9Vn/EQ>/U%oKI+,$ltSJLHU@[
+%piX/=H%X8rh8nJk'JXVpN%#F!*Q7[mpMD12F.CP+9o.2tTuM7b9]d8%f1\>!,gkTrV8 at F]>[6lPpn&4FRc`i=$a0_a,>bGo/BM&>
+%bp3<XO\f;eQbu4.q at Te<,$5*966fFJ-Q\udm7Cs7qK&5k6e;+q.hGKG+^HU9^eGC99,Iu2%Wn:Y)YW"MDp&I0WFYqFjHNYh,$g?X
+%4-9[&0?D[GEhdtkNko#aUarPPF9eta_e)OhklL4`?S93*%sI<#c$DWc&2>E*TCA1tBrP`<dbm[Hm)qU+>!fF4iPo*d+sOkC.M:Sm
+%WH3o:p$Ol+ at 4<\2ML at RNPmE"uPe]UH?V1V)%G"2;@Im?$r-I&,m$-C+"'CZMn,$=d4OllCl]S9(O#`<_IZHPgRSToGq`:(rGN>Zd
+%S9&kpgr)80`h*3W<bl/F"mSN9Q>V)Alt3:t#9/>&Y<*Tc&i^PuoW`_hk+I["kE(J)[$T7a0nm::)pCpB#5u:#'^q?RpS;Ng)n:lo
+%4hnXj7(no(9;=NO?`0KF1X9)(968;_kV^QRAdo")ln,<BN+fcRkHR71Q8#"jkE2gu;Ja*1Vc$$5q';L\IHj8g+S\/mn!aAgVWEBq
+%`#.[O+N;f^d`Fs-qd-hc.V0L"jLbWcjV&&p32&,G5+"OK3/&ik%:,fi8k_Mc,]QDtAd!-jD>Mb#f63QdXB:ESXlOF2>I5qYVeI!/
+%q%OW:i*5K^][Ve at aDffaA"F^bB^tooj\+EC<eV,EXT`T<M+Dp3:i;hA#]t,VKsh3:"i)2>36\?R%2@'DGHMN!"08J!*&V^8SlE.'
+%A8)ugXLE8D',q"#YJtg?)0fP.;!o$j;2u?.YI9=E<j(qnrgljC.1b2Hd+X`SfDAZcb0Q'Od!M-3k7d+re!%FB.=8!Pq'89hH2kfE
+%o?i./g>E'1fBp%eZq/b0B*kE(W+''A.2WG3,u!Gd!4&#)Kp64\?Ks=`n+j?R]_%lr4400!mPo(^-RW:bN;NP")a,IAQm6_W2hoJ?
+%&bk3W\kL)_Y3<[d8U+$YbmbZf7M"Sq;dNMrrP2IEP[e>k%>ll<1^4S])fTQWoe+^H,6*PkJ[X&r[`PZ<UNU\.WM.U[:C-gY*UM6C
+%HL at 2llJ3o1Olq.i1.1rf_p)O_H*Sod(sWB:dj6&k#,4thcBAC<GCFNR5mVMFB?C@?NDqfZ\mkd5$WHVDC7.9eI*Z0])'7#m>U0FD
+%oqia;h at c9#i*;psij]^4RjRsY+#e`=$q`X\.8:kMR7b1#0.!&p\KU.%=&TqfBjI=HNV:)g+RfP.$#nM^LPGa:qNoF*oQW<1pF-QT
+%EbZZEJP+eTPr+=k7CT^h"Ei*`0q^+hW)"*bK*C1iF\NEk#jXW"WEO8`nSLt6m9QU1g"mF3Ub?T]eH[$A!@u--?rfoEVUL3%qQ[k_
+%La=E45EANoVC?O[?e&EKUr&?&S^>TOs-s`e("3@&fE0DD7;=Wc)uGr$s/IZ+:d9E>Z<RbsMNY>r!lePOk[\59;fom/ABR)nN-nQ#
+%@;R![Z9JJdSe=jYF3-FS\X8#X@`<0^j#rjtPO-6:3:AAC1U)C&hfN?laZ*,l))I<9ein9%+jEL!0t5N0B]AbpN#Y at klCRM(ZllXF
+%:]\,B5/"F(F8`]``Ic&>)U_i&j>CeGNa$HaFZ>S1k:ZPNf at LnnF@klLk0;>J>T$F#kV#qjl4J">1jRSq9Rrf)qEi*N'af=C.4'Y#
+%)*nImV=[auY/)\L&L<6g>n83X91+=Z!ZeI-eZMr3qVY2;2A#_X&1%q0!M,S;?`X])U6V=rB8(N]a/cd_3<k'7Q-a+Mf0&HUc")Z+
+%iX7b/#s*bI9p\;<je4)*X$+09j"f`:en/d*0#Zq6e2dnMa,/)@/Ib_OQ[fFo at .osd1CZBALP[?BdpRdAog\cX\6!h#\KA/S>SEDo
+%jOIh!nt.6@!RC-i<FQTW2B9P\K)JBj2esI\T'I9T`AR#"7clJ)f>7a%,esT`j%jNA(=etBGTKF?A1'HIK<oX(*7`?erj7mK-e"1&
+%8M]f*[hTE4LEn#*^,gCBCEX'+P=(E%bMu/#qNX(sZ`S$A\=1m.h9J=0B at 3F+=L%B15%Tg=%sj8kf0].c5:G4,Q%d7e_.d=!OMpsW
+%-Ys4P!_95+bYgYa,pc^.a%aF\WO;<c?GBQ332%^u\(\89-$J/[,BUU_$tnqUhS,JM$0eAPb*]d+SNapo-EJI=AUZjJ&$5TF at qdql
+%0QF5-84#7. at ONDjDk2"R"-7hr]J*<9gklfF1e!P^+]=iPPF879<g%&FKucQ;iF)+>^01b]a&uFJ,=#3'&sDZ3Hc'PXR<o=_Tnot0
+%eog9:lo/bj0TQ.m\Ppr4o@%a&>942!@SNDke!)6tAH<hoX-rG==r.&5)$t*pC1ogX'`K^G6Fha$D\lX/'RFq_;LI5Kd>pGRR6-8V
+%0m?C%J43Rid(ZEDAm^heMc=ssN?)2Z&(+pGhZF>&gh$?1hQgsZk?N7*iX7_:)0T at 4O]LM\>c!1oJesn)<ff?,1t,&d>8h.=#MgkT
+%2gE!_h;Jp0&"eG$YAt"KSP:B4Q%Pm;k11TPPFJLWhCk at UUgEXiIi#2d-9DkEnhsBjjH_Lu3Ds+A3RZ9ZA9hXP^-*6;&dW.U=$2M]
+%\^LlbTW\"Z*nbV0"%h6:m,f]8Q>Y^<bKoS)nih,dPH(,7aZJWLa,;GUY,,H(^&Sf0arKo\WK;4[Y]qUXmQUdNG2i]/e+=B-jIg.,
+%Y^dmqnQr0Ob7]=ef5`_5!ZW^VLH@`;:@(u0T1bZ3PCp<u!C at jNlf_\nk[(69TZ*b_@=39;XE2\Y!^=@J$U_cknNr_EOSLTD8=\,\
+%cfY;L=pgPh28WYefd!'miJBoLl5]iB/O`hhqj%Xi)6hM7AQZq'Y6#Qr0FY6g9>j>L at Ihlb[6CNKH'cul6;=I!SGLM$O/W,)aW*gq
+%<p4KY`qs*-o+Z#M@#EhNfqD at dh0(@_hn<I*)\o5<$;NhT%g+PHL?&9<@P'u7P1@$/Pb,c6p37Q\L`Y]e at RkGi6gZ:m*P(3Ro`[FI
+%"FX*EkJKe+_>7S8FfOf@;RP#=4$_[LSc'h8CI)6I#+D3XG&)Y>"H4F>h)Vt.-\/Vh-$Q"7GXTU.RSZ"FIL6OR34G,5rKAm][%Cja
+%.3h&8aYiRZ]LIX[/\"#(1ab3/qUL5BdE*cjPRLL3Lj6N&ReLTDQ$AD5[*oR[h4uQf)k>u._N%T87e.\.n(eW/g><YG*,M#3*lPDH
+%);>6@*1$>B=k/Ts8J#=Z?=1jU)i*XFS<AjdYI;ZQ1V0!WSr4*X2l-gEh"Q$Gk2u#M?Q0s-S]$)5h2MqecI";-e)GJYM2BZe"NMBl
+%:EH<GBq#IY!H#CPGnF\<0B!]fK[6f2as2l@`4`h*22?O`mk,#XYcsHWZ)LJLj-3=kR.)siaRr^/.B)e at E<W<<CDKa!Xcq2_8n;=r
+%WUS=MB"<d%3eKA;EljjkR at h'Z"QU&`;[W#b"`@X%rC*fY`=`1@`J'CI8tlGiCJP2uPFm\J[ok^4:[AqS#%Gd+_h2Z6POfet1E7\A
+%,^8n'1H.%9P'5R?iY0g'#68Qir1Z=ha`1,sH%ZE]B?MCP$^,H!c-[(-`RH0-aeZSO!)UaEJ[0(s_$_$JC7pdRc!lAo,C=^$3A%e5
+%+N`Cub&*5e=mG'\_;pb,\N.:QjOVN!R3Y(8VoE(H^q@<?/>4E3&s;0lISNCsIVim1H$lqB>V6D'anI*j:W`9,EoB/%fOM^^,Gi2L
+%O+kCK]H!<%0JDJJRNk`g^b6(.`)@S#DSE(R=l&=)nYTX,c<4B#W,%?^O4:p5YZ^,SRqSWSL>^VWfZk8QEck,=Z. at S!PdWuVMqYYX
+%_3\b at 2(9+lc7`8Fn!epjDsP/j^iJ%i8VC`OKFa8:N[G\1OE6i^R=CKbD<61b,j,_k8e=XgCYR$`)Dr/i@[1sB(9FKk2tZ'<(pG3D
+%ih1b=5\qq2pKN-h,<D&_8]MeQrg!_)JpCMtR:a'3XseBq*$$[hoH?=1S=qXuBI/54Qo]I_2qu&F)a>\MLEUn,Pn$BE+dsGdMGcG=
+%Au>.t;32l#qC$^RiZ/'aS]6+R"nq_Rnf^;Qg`Y;D at X7#ii8HOJ?*JWZ#/e[?T^T+GEqYq0[O's68cN8"MpK5L7!oQ:4uAuQnUfBH
+%IH/&o1o;*i0a%/4*pa+_p\_5bDu`\(+U at d=os,_2&=MbIqiRBDhP<kdH!2 at VT<F_?S<*^,rFU0=0!"h&]W%M-]`7OH-6;.)EW"M0
+%/?C#cckCNf2Xa/\JNCr[9T*NR_!Of)DT[OPaXh9*oGgf<DO)&o(^A'fH-:c<kG/_U\&lTBDP%6qU7t=6cgd:f.<MB\GaM*J0o>bm
+%I^-:1`/R]WSbEqjRLkVBZC1eXefJ0U:ZngLj4on`45F]AnPd<r'$:qC8LeO_^HKX2VI5W<nZ'?OF9o87$aYr$?\5:IF^sTI"*D7+
+%-?UO&11+W1f<\7#[@m;[oS#Q>6ZU:IFDj\S"d\KZ>c0g- at mUO:hl"ZEpD1REk1H1?r`l,iA9d64[q_MioaFdOW=ac!^Qb at XU1_no
+%$G856HEMBfC.ksZY"@lK9@@sD\U;U2`O]4[349J\TpXAX.Mglhk"r*A=j4$Ao/;DoOmpO5Zndf+7[OYga^4j$(C2EN%R&iIp\ZqB
+%\^="R\>suT)J:Bn^9$oQ;45[mOSO:b@?KQL9jr?SeI'7[_N7'[[;Mk4>kPfA+-LBgQ-2sdZ;!+dUmb]^2:^Q3hfH,ED#m$D at n@h#
+%GV)q=k#WmU%=1SpY#9E06igFI/^WulLn&8Y\bdq'96*@<fs.f[bY>cjA$,X\J\8HUbmUF/6m2u(Jr)p(l<m)VD9&NKF-.r at SS54K
+%m3bhnA8JT;D48ijIsS#<gm_Q5PENs3[FMpbNSf$HfY?6HU?t86?g^<gkF1V+nC*#SWI\fVdC8qKm5+4]Z3H.32l36sP at +HSV\,\B
+%ARgcMeb1AM[+D6+G-HMmD"X;;NHA*a+<<ZLpSQFCk-'AMm_jVm54Um+'rrJWDU-;]$+qD&6mNE[Of&7#K437%DFO%YLH*Z#PT
+%Ee?6++i.>.9\=0Zcl;JV$;EpcUT(\MEKKdnYc;O+*R(,#F.JlU!;:t$2X^L9T[L:<8l*1EFZJkhF+A2OM>_kD7D+F)H2a%jksW5i
+%D<m_FhtJci-DC+(o<^Qd./)H!e46JG=]$h/`1-.PZVcn<rkM"'8m2?Uj at WeMk!%T-Z7C4lpKV/pW_LFNm4VCEnRW`IC_Aa?6DL[Z
+%jNQ#-]dSIG[R'@NkFm?oW[,EM_+,_kFO!qAE[>3t[ifDi<*jm,.JC<^"r'+G)kl?KIQR(l)I14iMeiMF-T]$h\#d'oIJi/ki:LUN
+%?>JF81hBg/5)!(8/G?+<,jA=`oEHu?TNGcTAXLUphF;*$Z'%.u+0Z7KW\nN(&]B)CNSUOd!R:**G=k`ZZ+s7o6A'W&/[orT"_[C'
+%mUuUDSciG+Ocp]bS]mQ1j\$M$JXNgY'8m[V#3h+pKuSV45"bDD5tVP%bUaX4R8-fSj[Tqb&H0*:/3H/#?;#_N+i(Q]cf!L_"B[=i
+%NVrNkmtjs(Qspg6+;iP6!$b`?-<H'%6)XCT#'+&XQ4plkA+)Ti^sr&<8T^`d+*LL^.a*`ZX"bium,`;+\M!F7b<[2h68gjp0"X'X
+%Vehu/\[eWAnQ2;s5Wg,;.P2IHON<^H,=-BC0G%nFltNH0-bA-.)dfV+4TXU9^bJUF$$+R+C;H7?/]&dkAThpR&!jbuFa1.4*/u%-
+%i3$']h5s#k6p[80[WYYEmO3*1Ol at AR`HH/bO%jN0_VfEKSnRIDHNkBE=M=0j9&VYR3T8sHa:im4ZanK&hjh:uo]_ttXX<i1cc4l#
+%e.hbnYtpM9r;+4-9#pF4ZukhSJ#2GLS-8`dXnDF.%K!keK18FD at o+7L"/4fRctK06=BNr2H#7gJPT5Z_3%lOQ(IkfWNtk=4aC3=V
+%-e4UYDQ>HNN7mnTD0"GM,gLG`KePtKCg^5coFI*bQTLUVTDZN(<!ZO7E[VrF41^.AB[CQJV+Q<BG!c"7qp1l%V'/gp"`I,eoXkQL
+%esGD^;'6)q2nh2lPM>gBh1UApQY4X0>i(@AFPJ"Z$#^Kla(OiO(%0=-gO:KJmS"7u+)o:%<n;%.g[ma?r?:M]3j%H\,ufIPD.r>L
+%ZCsOG)ic>2s2pD+-_TVbEf><dkEf!#=H>JK&"n:,l^2QjK7oQpai%"s?J;;+PNu]001?KpC`jnEj`4MF)f/XiUMoSY8VfCo-cY07
+%EuY8J$_aP+'%cFH1>K_`\C3K3,ReY4fM/W=.%]r,klu^Wq3"%@is'/L;ksOS5=oEf]u;,SXX=fbaNh8amMRr4leIWFPG71t-U";<
+%AD=6PIBVD!bE<-qhij76GbTnYcPasRREeoeqbYskUBdN'L)7^NbDc*UO/Y.$B7LO9'V)DsFN at +DRP0P.Rt\W/DW#87E*aMN-,=uN
+%$Tg)V>a/=ZXe[P8K1l8 at l4)c6\X,i2`MTH4`77+Lf,t+HednnA;%Dm0M$<em=Uj+b=L"5RK76U6Ej+<]6]U5U;C)]o\6dA!\UBFW
+%RS^MY8rJ\MWR_j&Nj@^g0["lCa6$l4?7Cf?it]\t+u:ta4NK&3H-PHX1c-ac"Xs[IpZM=r"Z`t\o(/2Tp)]F4s&dSm&4Xf*k[l&Q
+%pYnUr>A.23!Tr:+(GX[Udo_N`(>IZJC7fpF]RWc-19mgU#2G'#SU%F]]&tYte at BE0$t[GtEfT)&W7s$3lKuup@>uXHI/QOSIEm1c
+%hYkt3++%L(0t:]V<L2h!Bd_I[\h<((eou!D>4BtIbO_C*n:&+Pjee#"*f`d7"qSD"FagKjfe=HK-MsOl0_2Nn,jTU`)gZ[>Lmf:g
+%JV9AL8eMsCUW)3p[5Zh/(C.33"*3aU#?fJ1^:>#d,7J9[%N;#_Q-F)*W4(:h"&^g3p_XN(B$Z<l!Je5N!(HIr/(Gs[J)"0LD*+0Z
+%=mjg@<IQNl$=&6HQX)Ca%[1sAO6cPmAMW"fW\rBj`]MP6NE-PXS,CKn!cFcl8XTC:b,8s.Ofoq!WIJ4*Z!0OuPQ1Hp-;u/l>p.4D
+%JSeR&9UBfT>AaZXr]o4L)okp0/3C;M`O@]jNH]>Q]iV9\VV"_;"rgKf5[U%q93caQBEI=>7'NVGe#3KA,uYZqVWJ+.^H=-T(-&9=
+%Q3TUW*:&+H^MF/7SL6_<.?.9[Dcha at PH9HLU]/6`Boocgp;NU044Arma>N<ZXTCCl%K=KZ]_5WeZNN5SV`eQ!c<uX?"i9(TXi<`;
+%GipN?/;l_Nn/8GgCf)NmS;AdEfVbD3P%E;lhBb[bR,,,\OGd/k/d\LOkqZ(+5$SH/4I*!^:^Zm)o*S5SG.@;n[eQ>_ieCZ'Ai"ER
+%=38V^-n&)KAL1g6gs:A0E.BC]cJ,EU.QJR.U at WIGN6b,0WR_;n1$@WZ>SA+K"d7t!Z[Wf^KKO>E\:+Xs==I?3g[58Tmo75mp7_RC
+%"t)!hK=5<@)4SsCBR1%MbWiun9>PT[ri\=r$Z5Bu<CQ/`1Njj\:i8<XW<LN=02%T]TO3.9!_Z.NZ)##h27c[-P5LdpqLKB#lIG&u
+%^0FZZg%#2'%:J%?8.%k%1,J=,ri$W^7caAEH0)GNr#X'_RuK at i%K&hu7AlH42e?,PL(SMZr+M]cn=rb-q8uCi6^B<-I/1cM1ReRs
+%UXitTI]*$I1%rTEe=9(/a[mR?!%sl\W=+!U7HRb&X(2F&fj+Vk^P'W@?S7,`VD'kJ!*69VanjhWkh7Bs(L4S537^33H,_au5%:2(
+%ET14FUod=c:J^#+HU;U@$I%S*(TodsQ+jAAe]l.OLZn4Cc9teN?%uU`8Y at 0le7@`D,K)QT9VFHF&4c7>hgsdE?CX>i%-q;\+]+Z9
+%<GJ`<Su5ClRu<RGeYF#jJgaY%g[Rq57>-pioW@#G<p$T,K6N$G:Cc6GoOnqJR""IE[GZ(tgX*)p@@"F55*o"ob%.O3&Y*oEBFVO5
+%Chi$BjUnX/(i2)39Yc82Fqcq6#"6(fDM?D9_GVL^*m-?1,">=a!d;WY>bkl`oj5'Pphf(7CopQ<B0HSRENi!IR+iT?*C-;Zghilp
+%lp8sjZWtd<a]*YV.\#-GaJc'VFs9o72P.3P8g5m*-R4F1B+g\fiT^K^krYeH<m.<f>UM8tUSsH0L\:cCC0j`47?'ef5oKWLZJ53S
+%Jal\uQc at KOO$*IjQT"Yb4'lFDpV'T5'RL]6A(f7`,/!TsN.39P#!cF8s"Hi^h<8r4C>:O7[65'6s6A:S96/6\6**i(\\=[:;Z_At
+%=jZ<R75.i9ElCRgZ[6X)O:0dSZ*[T5OfWtPe+\(4q8QJ]JJ:LYVJJJ:+-Y'9,+AHZ/Q*]4S3!gDPZs$PeCG'^@FJ;IMMumH/(;rn
+%d6*b3)A))YUo7$oO`WG,KRs;_eE=h6)q*f"%EK$H69+Y)*/Sjij5q at e&(rr<P%W8,;A:62d*]:'5E>s.IJEo_Q at IZ=is8h<:D?Jd
+%3WtkXJ0B7,*4sMABjp>NE>!OWU[YM/K at jP6#XMXQJOnghfl<D*Rpc&RHHWlt/g1>#ghu+2=O]n_JTirqPL%g-=>FC*qIe:W,G1=?
+%pG"JQaaR.]h+=us8 at 9P@Pj?Ck.3UV>2nr#!7P!o=3$RH`YVmWN\Q[^3:fWN<UHIco"k5115EB>R9Bi6JD4nlY,rZMelWjua5S%$j
+%Sn,'18s!t7,,cIC2a>D5WL[teVLr_Rf1]G$)On^X20cL.hl at N5`<*B<]Hot<jm"sh0K4VTpaYB"eq8-TSuKtB`5Y!Sh'ddofFrNE
+%YJWM-Nb^+rqkfMA7r=<QqLY9&'&Z='f!<#en1XWp'g;s2UR4R4!WBSnAL\*o&>!e^G4RoLA]A(A0G!)97'_-1J?nZ4r+jM/7mA7k
+%_L4]g";1N9&@AAFNn]l*cooUq#i.YCVfS]lBus4"S3C3c?/akX:C7U(:C:FMUQWf.,H7[kd*P3efVVW at QHk5u_OM#+D*ou3f)WJX
+%"/-A=[KI\i[("<A_0/XTTs_=Orimn"Ib.OXe%bXB)0H'gIjQe0d*5?42$sL7FX=?];glaKl/Ee'[<GLK'A<^CP.nY_&8^7&2+U7m
+%E$jp_?S;XHWA(_e+ at V/F%A'BlWFYe"I__H%+MH,TChD5q7,/s(O[R#J)!^Jr%?hNBS(e^mB#8Y_f86)@-HPjZgjOIq)`QZpT$/5A
+%[_5;1Qe^hoS+fQ"im_`gG?P""di5i+\RrJ`JuC9M>S&b%\sG_RS_t at S0W1OdlMD3mJN1Ngp7q-+d<2maFjdd;8hsF^5)RM'hoa at 4
+%WK4\M.X)tWbQOCTM3!)EcJgPA1ap+9HUV\h7OQRrpp2?&G4&Z5&p.nLd^ndQ5%.?*rU&Wr8iXK=e*cA'7$cbRe=_8NVmQ9fpNNkf
+%8MLk!P]+Sc-a8h6TRDk`e((l]\4Zj[n/<GMaR at R0g8@]F:4>h$)_$0)r&%3@<su,<Kt#$E[A2$k1GLKoR6Z!n@(mRAdls<b9LK(o
+%G:MV55A\'0p3Vt]M!gd6g/8>TH)SjPAh]W at O2O("'_bl)*:,NnAkY%mPHPM^Gn97VWf>?rQ5B#@mSa#FcB_4=b0FEZAP9I?pR!o0
+%BbI=go0)=iY_B7pEX(+_M>-_WN8\\MVYLLW7sF!V^1eK+9<`#;BsKo1Ac$hCALJLE+<1'c at +A7IK,PHsoO4`hU6!8Y0T[W+8]Q\c
+%RJF.>=/u30n]bshToY?A`ADOH11t0;mf\5pWD[`45REh#;+WAHKO\neba8H2lg!e#oFrRb'QEmLQR\,oSYaib"EC939>;_Ef90o=
+%g2"`3`AS1.3ESlVSWYm=Wgq9o2Kl*-@^N]QjYDCG2WLWH&TF0$jg?G480)<9j=$Au'.0mf[37#9bCeGhRWH0g]TF:-A;Vp:N4JWs
+%f/?b_Ij6m)8]*)7?^Mjc3L3D'Pf\4)K3bU9`+om/)Ks`qa7B#X9_"F">K\?TE7n^\&e*BY'dN?oN`e13PX[_/H'UJ.rc&\3oDb)g
+%Kf^U:X>'L8'$WA0Ob4g%f]9f(i(R=Im at uC2$[fuOWB'N[B-Y'cjt$8-V5]N.ph<>CNTH<]X-p&gVeSsL7]n1s8a6LQIca\8TQ;^:
+%J6jWTViB)aajuc^Kd080FMi`CX1\I-)LeZGa2TZXFH"pQF:-8Q\:>oLZIS6&+?>)O.0,iu75W\Cg[AE:Cc5llc+liJ88N_W2#D#>
+%RpEh&R\/IQ=E%$pNOo'+Q?`bKina'O8Zer3R3Jr(`uXCASaZ^B!q!D]VH);/?L<O4>V>5q'C`]am\j=2#X0:+m.asE?b+s;[U5YD
+%eeFh>3!kTE<kRJ[eV57k3NZO>@Qc)eLW&*)i_VQ:9N#&W!2.Ad.r\M;I0 at ts*de>UPW%!RnmUj?%J^#>V&%Z9&:4s:$=Gio7E1$4
+%lhi)B[2)$9eJ9:,Kgi8r#p0D!Q(\Y,io*fC8pic_R5HVTgf6!0oX[ue5cLuN3N,=%h\9,uI^om>=rtXq<AaC'd"87kn,*5IM;6l9
+%aIuHAS#`*AC at Y^lS[B9YH;0 at 7YIU(6]b]SM[!edVZQri0BM1V)2QWJ8O0t7NKPf"pTM@\*?uR*!<PcG5')Q0%LP3k$,d)/t3%iUb
+%Wr<N<%>7dQ#r'4TkTga0=!F<0/WQ]#eSNLj]rW404Qi^A__h4(MlJpKjN+lE?a(-Yh,Ec,6'S?RFIB7#Ce at T3PKC,0TZhb#4"N&@
+%s7O@!r\X.!\(\kiHYb^n<]0F`F\hVu(hArT]4OQ_`o$V;ebGc'FjQ?u<rCO,7kI41?;qq(&(AIE'Z(pdZVoLN6G.R&XorA=L4K8W
+%>lR._r9j42:R#_j'J9d1c[C))6'Ep.,oMh/mPRuc.6e;Of'%b$P6,4,fmkB]+bCdhM3Htg1/!I^@c6culdT1;$$@>SoQArCa<"#b
+%+.>:U[7gbOqcOGY0WF==rjKZ;bSWP:>jsV97Y8mGFsGUEX,qFaiS%\7p=9Io,)LhS_o5o#RoY;ipNcam4Y$[XOS;T#1AP8-29D77
+%4#26+j1m3aQfSSOL`b$!RTl:(qClEW1A+!e[n6>I*jq,^K[R>",PU=hg0QUPWs65f'5EU2;P$u4`Q:aISoQA=V>>72f?9.Fh3 at I9
+%MI1IuoOTK+V92A\o6m*&-l$i>m*>2)k2EP[ocsd>+?I#5-EcJZk:E^`!1.NF2c<^36sB58)57f7Xm!#=B.s.J-rBKX(!oT#_c-o*
+%@aeZ-CO%"Z,C*tWpIcXIfM-ToGmga.qqok#8Q"AV7F0Q!&2lN4!f549..WrGb at NWd#]@KM[Qa??L]k,;?CGr@?<_mLb-MC2jI_Na
+%QgA?4od"gQdtsk+6>_rpMe//JGOj_oMMm&4b=*2G8u(H=rm8[I"+4:qW19^rMK_.U8OZQ:/L<nG^rql26ZR:$7lR8p9c&t70L&(r
+%SS3DF75J7Fm7plDL^KS3kFcl3Ou[PuebC\3?AW?G55JYL-ts.RgW7@!ZG^M#IFFlmBdu8H1+ZsBUsY+N8p\6NPp;PNM?#_Ra1&@A
+%4=F3JakLH#V"<QWP:Mil>VVMP6n6rI[O6r.Q2I'XDJs)(LmKR^cK at s:,[dq3c=&B!T:C9(mV[%DkPGX!UVNCTG>4jI,T/tASYOk)
+%j_5m#E#EU"hj(_bX4;+(";u<2Pi`?K'ef5&mo1otBcSE0eA8hHHt^.K"Win8SRZX^0%[ZRJR'3P0pA'&9Wq8UhGg.nF8<"XF)qCg
+%<>>8Kq>Q5/(Uo$[_V$7Wi<8]e\Z5;P)cnf5mQe%A&<*2o\e=e]bBS/OnoOq+IVW/@_#.`-2<<OGpKKq#T(1f6gG_Tn9+=Ue+`V\Y
+%p^U:#W^^\j"d!+hE9thtJUFkjfk,"j*\!Hih(4EVGK.)HmZO?Rn*M!g>#57-+QhtOL)5"EUf\"/i3sOk1bN at c42#%JP17nM11XhZ
+%nG*)6o2dGRPpn_gQ`2\4^5&#"cG+pD[s1 at QiagHg\+50(Af[MYQ"lB[>5b>n40s'CYG<X"M%;IgBSUtB)BZ3<3A6'i`-_W_=0?#<
+%fLANY"B/C73[jlaWe$iZhGVnN#>/7[`dG%U+U at W'OsD=$1G=spqrTPMDZEF>"E3:8SJ$mu/Etq(kJol[;_Nc<,U&%m]#=IlW:IAl
+%;?Gc7I'p[#MQTN-f.dR:-hYD"\W1(^b$mG?.!b8KX=kNtGfujoU,o_o,96OaELk>@Jj)pKlH7=5"c>eu4Gss0+R]cUSN-.9M!(>l
+%Hf82CU]p[IE\qDY at .<AYdH0*<XIR/c$<rWG29Gc7NQ_b_Tn5XuNuN6I]ZfQ%ebCaqN_PqNj`0G/'/[^ZH?uSdWq(m:FF(J5kcs7e
+%Z:7(Q+5&[/L0&CEp%LR5dWJH)5&6dF?H=lAhC.E#WO6'#.tKC159M:M1A/V8>?U at cU?HhXJCrG'1iqQ>GLRTN-M8ML:(;RBfcXE%
+%[6ro8.Ng_=8t`lJU8SAIn1I?&[S:QiX>J1c3qE%5`;Tk8/[mjq&:U.]HFY54Dss<mEU$LJL$.O:ascXP8kH&-8aiXST&l:udc]])
+%9],VTgu]FS,l(:bRuS3?:Ytob^*E_6iFZ!%5%ldnB at CV2>cJ*6[NOF(So:Eba\0K$T5qn:)k/H4iShfoqb@\pJ?FW=MuSi7 at pXZ#
+%glikd1Fg(-24Vsa-`ASDL/+IF!R_0MAe%d6?W=\E#Cn0V"KYPl\1p&?YA1Ttn6$;*Yu+0l3"eGS]^7;ck8pU=Ou'#J=O%+,"M6Oj
+%[=_"#QcG?5Q(O//+koP5`N8YLVou\-AMrefXF-iuS]_)!ORUY3H)CX5%-0$"rnK:oJe#nOPIt<#o=.>M"h'kQhWRXsXLjRu%VS9#
+%cR6K@],)'DhmU39Hs5@?PeW&A_,uRjb8FO4^n('=0_d#jRAe'^NMiT[XP:i+B_iJB+R<9[j)AR:6L:*8<rP0/kMdgjI&Z>]h:YCD
+%>a\p>)96f(JN^q%)XYdbR=:j,&%a\1j$DtrlX[K/HebK)[R"8L<q8G2H/6h4E\'0cP$1(#0)''b5R'4*gd!F at BC;qJe'eUQS;Kp.
+%3;FI!i;;GHRM^&-@,na1$I?,XMNrCB28PrP/;Ak]o).X\kgSbme,m>Sr[YC3#@%3l(r$WMW10Z*4sg36Bm>&X<Vk?9^#_n$\ctX;
+%'F&i9jonkNo\4Bd2HpkAVl4;],45WH#'K8^iGYP&T+]]^\>R(,/-K3`H*MjX(7TG/f,$ls2L0,TDu,;*nZXh6 at L<[2=!g+)9M>`n
+%i:lVdoA!9CkBEGE:EUsidcn;kf2(Y`.J]gmaA5?<P at W#-2?h"VR#lMbBSSggLH$%TFVAr4B=6ToisKB_n*X`$rK6R#m:<)X#bIco
+%j1W<0/,C,Jg]!#PcWp)M!,&cL1R&VQ[C1'K6;F1?i:WBts1M at V"Q7B>9/TC`kYpME8]s3QHV3%0R0I<QjT%I*9Hf0,[$`QnO=B'a
+%3&uRoY/iKr%AmLn)`Ig6a]?X4^mK342dT_X8]m0cVCfp"CM0FsZ*@m+@,M(J@%RigOhg=0TmcCOm(*iZLN,."NDAcU*;r^$=,rZ`
+%N,GI#4)*:P$1bDdZR%LCYAD_gkXG!Ef($Nbh4Nb at I)$HR$-"&AIXDn0&;X%0'qY[9](XTd!$CKY]ARU[V81Y%e?]"<Q0d1Lcn.ef
+%^',P^p"3mt`6['nTo(?M%%t!PMrgRbfp9j>*H4d?HVQStS\DGTf,RN]GuT3YAcTb>2lSJi.OER<c.+#//$hOkH*Sf!nE3!eernG,
+%SH!q>Hko at -GHSfIPhPjGOlcqkDT&4YP9$D?J.]m`,qW/>U@;n-W!f1J_G=kt"r,s\c[I,cs#O at ap2OqAf[<gT(:uCB!K4eW2ALVK
+%m8u6+K9#XM78cA^"^ogo*:92]q'>hh\Ij,+8^>>#Q0Fn]f%b7>5pMG>h)Ka1YWc)sf0\CO[Ibj1k$r=[j1[B'S,,)`%1jl-GO955
+%95YW2(q=/)"%0s*0R!`?N4E*]Ofm`*44^t/4aW4dZ%)]#Qb^l>0ZQc(QV<Tr5jE6\G-n,'8:1`XE^gFS=-A$j`[JKKOhRs'-cktA
+%_FUt0IMXq8C(!&#q8=S7Y`e0J<S909;FB"BYN&DfePM'O\CE?`S:Q?HMtQF+R3k#3D__sSO0[\!Yq%TPj\fIgU\8`f6DRRsfQXl%
+%#FuJD<auf2iCMpuJ!NW(E6:rMpDt:$LY"@0p&=+D06^`*_V=lA[nVjO\cM$@JI3l4Vt'S2kDp[==90L0pbFp-ViPBe6#hN7]1sHn
+%_i!e><M!!np1$[q4J+,MgjUE89YPC:&RluaTC70ZI+Y*UFn0m[/nsmrC<ld\a]:uj+&8:HH"+C_lUEM3">/N;qp>en'Ok\o(>q+\
+%Y/&Q*TB(gmL#$q.VNY\2ZJ(AS5VloXJ-$tu+:1<3/9dcJ0c$fk?Y<GfhC7QjFVme.f]ma1W;r6.C68^rM1XJ:C\7[ah.BM:f/X-I
+%>LDEe$%^LTI6miF&>gVgXSnW;<;+R&T7#:=ookf=-$G6n4?3af#taq0qjUZ,T]b`%.]%HE at OE4jhiiDs<*F9m7o-I?RLF&q7I>Oo
+%,7,Lfou-"jKS9e:jib3^XmL1 at 0%Ee8`l=9qJ8`T?_2n=`[:k?3K##&&[<. at c>XZkr0BX5?Rmc-2gP%gs*Y:&XWVUiErbG1Fpl[2+
+%:We'be;4R2(=egTQ0Supc-H6^aL1"^T%G/7i#,UtpM?Ns7J!]0&DQn at E;&Du@=IOtqrdb-XB5^c-=@(e'RdlA27;08DeS`@PS8aD
+%)=u1p8=[rLZ<cS"^8XAVgTTC6Mh.\`m(<J&rE3)HWMX2^&7"*IjU5tJHY"O4#+QlMCL!O0>>DXgd]js^e5>um8K50G(=mM_n.u.L
+%hnOkYQ7"a3h!4jE\K;+ALZ(IQMTb)S/Q8RC211)\=Ph\Uk=]GgRN/R#;p0lAB(4WKbXj;IT2o=J!]]]pfiP&H)(UK2A[N;Ig#U7k
+%hFd'`>i,'d>51[pcXjZ6EWk'W, at BJ'Cp(nLJV6NNZV1g5V&Xhf\O%#(YLJZoI2e`Re._;9g>mk#c5VC9k;<9%LP52h6_E'ffS%aL
+%DHo1i<IMN8(?uj36t,QB9(`m"Eh3(gk;MW_Ngf/JQ06S\gAE'gF5F!J^E5m``\O8s?L4cZl1B0pAX6TPCJ&Fa#YpBNM!89(gm+],
+%`nB*K?L<G1Q8>jgK at s22"E0I#^Nd2S*^)o$EZ>P;;[+ss]BM(.FQl_59USrp](\'Nc0K-",_h/'0R>Hf^eQrdEK'9Z$s8-DT:,c.
+%PD+WpXAE+4^6'nBZ>+7]X4B9D@"%l.&n17R+_?(p^3uG/gQ94G@&J/Ol6_VSWs?$s#p!f=$IiCrcc.s#\0C0F]u]3po+)fOC>gB<
+%B_h!pk-Ssr+sN:TJu_[B at d8[.KKF+N*5&$R!nJJh:SR8%_:nG/5#d9c'I^Ml;*<mj18[;uc=l]0*?YidS)YH80tX8299W+a]-TB^
+%:f1>_V>t4)PI#Rsj0)F;qYT#44Qb-]LQcf13K-J&j*FK,CJK::]J?W:3TO\],HcqjK"b7EiALSP`uKJR,!G2M@=0!o+O`+N?-psh
+%s7^'!cIXJjhjcduQ*:-]].iFmO37H)MJsC`YkQ*3%P20-E%V?a`&KF!6E9*olr$Xb\*)PU'-AV=4;d="2GhYbnM%AkkVg+9CXh-m
+%#F,$MD#q4c2.OhJXTWtpAi\!_o!&(V1NN>lA_&mkPD@\XGC at gU%ZGOB-n474JI$me<.c/j0)a^t"0m,k$Y$]Xm,n2D,*L7c/8pQP
+%QNc-KNh&B<m@;[-O2fS=H3c6E&TE at Q9HVlc/Y at 6Y])-'3O?=(Bn?t+ at s3<6K)>DnR_RX;e\E8=i6WoOso at K-]hjXH6ZTgeDYm*tl
+%PF0VJSHA[4iuDa_5^oHj4_C<n3u(&*6[i at 0_Zc`MFXgh]B.'9Ljb.dfG*0JlX.cQ1TrEJX3r)A98c7^Ma<)ga\a#Y]8nuU5qI"CC
+%g%A#BZeB+$>$ot*o8uaM\sP0&La7gb9qS[mEO>k<g9TDqLT;=#5]0_";;dmj%[)r$DL97_^&NE9P:ER##A)XVA*5n_!<`FF-Kr&7
+%3]dR&X(=>#k/5Q"es)I.o5/WAlAReqi7^sqF,lQ/5#ae at 7"A3]/QM*u=D-VLmb>k1`lA:Kkb<K'CNHQ]FnbEfqK)UKeD4%S30d>`
+%Gu][%$,q#KoHnfS*9Wc, at 94aP0<+!.oU8!O^17/d at +o#4/YA:.q>5O0BSmjfc2O6$D0fLLc'AS`g at NNi]\!cUT1;f#1oh]Ys5li$
+%SsUPQWBF1sDskGB2F>\`^GCC`^?5m<YM'FO2CT]Ug at hM#A)epRETA,%hr./XS_$fDc5betKFNsk!V+E1'9im at aqXA+P!DaF\kT-@
+%,ZZ%JA#^N9*h=2O7)A4m#CFA9.@]Z![I9GLK]HlYgrPNn86<oWThBUc!J1VgaJm!3SWVc.6Cg4,=+\dcPqo=<4jLV3*>UpdX!\c>
+%8 at .FG:ao*Oc&#+`9qL.ajc\\fa9$\.Gk8V at IM'g#b^&g/:A:!0iUl?og=kfdfrs+NDi(e*IaR at R/u$;>840:Y>Jqb/=mG4)b'>U>
+%C&<$"'/T3`MsoH%`n"LlRCJ^o/UfrP+PnFJ<7F'fS'FbVIXg*`9IuoD4oI[UQPt:tjIXTlOaaPaq-"dF=C5)=<B5b!AuF0bY:W`W
+%KCT8.1oRPr/A0koPgQF#4M`g&%+1,=O4uG2-dXu)ON:?kSi"T(P-O-Qi%0A$:.Y4=GrZ0J(<DN-E$f1\q:a"eHQk=#'&`$j<(]j!
+%P9F2W#=[V[%b$^"Y<\Gn_H]@`m4)t,=J"pWmBK at 7mAT4?oYAd6]c>->/0>d1TjQ?+\aU\0L.L9fMic,>_>3k$8Zdj1c$KE4Yc6n=
+%m`O!)R:kP%EnET",FT/N:A0HLfS:Tf`&1CQai-`t\"mi6q49\A,aTe.D]"!pAQOL7BQT^OkqAP^lJ+0(/jGC2]_Mp$ddsiKgb!66
+%#]4t\nh<tM2?VQ*lb`uuRN$fP3F$YoVQk9kP7qJJhf:$2`]naD9\9jYV!gFI,Ep5"KN((&W?BpXRV?Y9Y\(^!S'LO#1f]"W=:ai]
+%QVidr$4i\_"ku3)f/D)!^a4.$l-`AtM7dj<oAh4k8r78]BBTrX=VR,^Vi$\5h:>ru2;T0]@GTS-4L.E9I<L"$8\b'>kVqZ(RAK-R
+%`6.0A*fS?bS[STe9&FBS[+Tc4GPYP6\&l5mFus^[o,n]A'3e484V\6n45^gengnk-o$"2Zi at lO_i+(-VeZ6':DjKJD0hsj4Dj#XY
+%CO=IW.J^Un?o\WH$*id?B<Ko/Iuii?'jUA"5ag>b.<G&&Iu at Q9q$#k[fG)g13Cn<JQ4*-*$X!Ff7Zp&O32G\,O.[;QB5ubo;ZcLl
+%S<LpbgCsqR9O=iT._005c($bT.A\7I29Colo4-H5s*5Q//(tkl)BV:11,9%Hq/aS:!$`ZX+\7803"4]B%3G+nU^8>n at cGjYFKe_s
+%EtV at rC0Q-KRRs]>TtGdD`2lg53A/'Ykm8rN*J8c+.Y>Vd-clH'V6s/*qt0B?%?J&4?e0+MW&NP*Z1niQ=KJmkT^%I=QHf(r"D(tA
+%fV(!3L=fFjC8q2LdfH,`dF46f;j`!T_q!Rl&JUGoYGJ>I=T=a`02Ku:@Dau4ia:0r]OLjLd'QSh)kRd/HTth$Kko7`Eo0D"P<d`%
+%I,!T9r'Da9Ki$trl/UJ)++9J\qF"MJ]@/\)CK6]+3RIZl#hSsA+09fbZ6I$lGg!_AjnJbA/gM"^hTA]eX26OKZ:?V,._VVH=nt0>
+%oVPa3l'KVcEUmAY6gV/EIZ?i<,+4Z4/pK at YPX:QF"'\ns"U`jGM07oc at c*M3PtPi=K(F(J$)*+W[+(QJ7W[=6`!=[L/e,"4VctGT
+%"c<GqiiP!&.Sl5dL4M?EH6;@iH".Q3(348O%'_&NON7?VqB7OU;l8k'iQ-T3ers4Egom'\p6QndI*q<Sfhfj.$sMK\Wcn=T"mb(T
+%F;'U,bYAR/f'-0LfPF0a=u5GRY-TInhtJoe'"MSlU+*e&BTcAsC!WWSV;uD;%=0-KC%R0XZ>ufkp7^_*Q^\sed.K\[,6'jB1Y46u
+%L9AV8UA6MN:+fHSUmT<>cJqTIC_m93d0`b(8oJEG=$O.ikAuY:5CsqiFjNpu(rVB'gP4^E7nn@]Lgo7]1j6_^JLtKGJR8_@=2%H[
+%ei`ts&%bspod_d6+([n$ImTP09T5o#;t4HMMs=u>2JF1JpPYZ_DX;"#MR6"D>6A!;_9r at P+<lnn_.K"W?`U&:0&cCSVSZnYP@'Dj
+%;QkkOWMS/C'<PL;_`SjWa%;Yt=USZp%GE2<Sa^cq1+]FlCoNqc\%Di#W1[uf5UfYa2k9<`g#)_?e:lYA>s,!]_YI;3YWl>ifqj9+
+%no'*4\[M3"pA3L?nB<AVs(4n`eO\]TQR)TI/"P-rEnZY5i<jNP1K>5;l908"5Pjngj%u+ at E7`l9^r*-I73)B7h<NNYf0tE>N>^+C
+%jA?%OVGs%Jh$$ud:h=oL;s1"kORm(\RJ;bEA:f+;Atnb3pb;LR1&54^RO8`hT+E_.]5gM7*6d_-.%!/E$^0tY4QJ at IA>XnP"Crta
+%QnhIcbKIJk9bEM<D+or"[_DZ[X`Ja'LEt3+atZH\*dF''"-S*'q]jDX6HHtROKa5mP(*V<HOqK#]Mur[iKW+%if:\,'$V%uL^O?:
+%$l^]=<p2<hbNbVBj>-*ZR!MX5\uh]EOKZu/2,Q=>rgRdKeDqFI,8p4OVGIJ\bILu*d62gl[,$X0Z1P[`&!ZEeSj"OaFUJ05Yu%$'
+%nN=o/?)1mFAF$n=KZ)rsJ0iBPlh'1-*h.3P?C&DQ6-#<h#.=B3'Ab+[2Z_?%Fl)ttgGt7g)=d9%J,+m$SP3.A,()8W at k60\M:`j$
+%lU&:i&%R)DiZE92.aai'nl<CV$H8kt9`f5iDi_\cRR!"Q0p3%8Bnc<>@g1NgOQ>7%;qgKIX6GVBQp[n>eX&=nS%_:>rPXW]f\eV.
+%=N73LKtubuYRtJ`NlHb5OeA;AWlh"0p9Ma'.FmbNIWH)n0sMl&J75GR:MGt\Ar7o#)]+OicJ=[<'`i.qZ#+Ah)!a?d4*5B3SapEQ
+%!XIi'6jm&7V\Nu^iIV#uKj8J)IG4b<'VrVJ9Y'O$"YL?qba0j&`4YKe2TIl#!S6P)LA>,)2[.?q3-B7FjMM._jhM(B%rE4K\5M^*
+%)_&g@>(>Q+<A7qii__i[oX)P4KP-\d:\O[LBA[s>Bjk:mds=2L!R4+1T^JZNOg9ZmgTBX4%iM/P*2<i?]nA<ID-#LU20(f#"O.=D
+%I()bi*^7XXM8$SX$D_93eCA at aN>nn?a%J45,02 at .o*3mN*s'IGchDs-"jVLu?V;69QW99j3YX#(Cc2BDP5.5bD(U1K[YqPrALDts
+%r1EkVFS%;,gf^R$&pVe/V[.Sh6:&tOeqB<AQY&SBpbA8cZ]9D6jqh[<?<+8`6jQ[9K;cg-=rV^'rRM":0:nR^/YkN0/G0-3ItSXh
+%oo+-TklT$t"#qf\>!g')#(A(Vq!UU;eSn5Zc(2E_aQ at G6Di%u?l*mPQk0_ZnL\J4d:\KtZ&e3^Q1WHh+J#<;Q\qSFn[7l"ZI&?rW
+%X%k<'C2,:h_UgT7$$e<;oDa3aQ71:^SN;M[A5VDR[G+*#Y1Po(c/r^$/d0^m#ua=GEo^QTf!OhtE7H]KNkoa-2ljfrS;4+QV):_<
+%r!MX>A^8>NI5P%sT*#%)3jq^ZQI^nu at J'-7$t^[&_RgseYcY9kYi#$qX,_N:-4 at an.faa^d/e.%:Vd.`!;NdZJunP-'*r[GVonRF
+%V$OX*iee`*)[pq3%LLe4j2#jG33^a&nh@@Q1`&*-9\HRr.Ke69Nt7EISrt_6!)X\X$3k1DIBW>fU+s06--#pl&ph_eg=LX\">m/A
+%_hsLm4%R"gWCWC?i?>j!et&dH/b*/SOtX\d2sX)i^hamNFei`r1+QjQ.QXU>f0-\2>b-b8jB5$TI+iqq(o at 06r;%[*EkA+t%&D at _
+%=pn^+CLPSZpm<;b0MF at h-/\A%"?pPaCifKQZKp3V>qr%*Z%Do<Y#l3+D6qu2?FJ`Jd^]W7;puru?@5n),rt&Lq*I0&%9PnA-T$'s
+%H'jNf7LN-E>tcRM9K?osioffb6>tEZr[9gMY4j1L)W!/gnMuGTK_,^]/\pl6[UK#0#V*7g)T1]B:?mE;'D+2(duuPM#-jpbiVmU2
+%>\T+JV1ga7.Y*c]#Vc&$Vn0$6P1mIrRaquk^AeI"Z\b(,m%DdmA/$H2Dl(q\mSg"s]BnuLG)Oicp[)+kj>HSUF"6Pt?SFlc_`@@4
+%&j]G$kTr(^B9da%3H4QWJX"@M!gn((l59Jsop?,V3cFs,/`oPlOWSGdSHqXF*([/r>q!6\%&f2#\'f6N&m4Ts48Q?9IiZ))#`B3p
+%\bsoRq7_>8><p\$W-A%@Y6Y'eA at nel5\1rOJ.p(gNs`ShLZ5^a+UTA$c(@QrWO(2R;\h-U9_-#T^/&tlT""K/D*Q)#TXZ_QPleft
+%'C`XG1q88QroFW;;o6I^Jqi$b.,Ms$2hJGBSsFE8n_o]-Bh%70?s\e^Z,(PRKp1ahIT*u*4hO@(&L"\5XP(UT8pGS8#/Fmk^HeW0
+%X./u;q'>@:41I3mNI!uV[&&P3)-gM3p?>`.Hp0MFm"Ms*/K_UDG>?,Gch;8+h%/uKAPtG."=[=a.=m+VB+%FuBTW`p4^HPX.tOK9
+%><41CC'ik at LmtF=Z at +S&qt.?V1k4i<.IMI)E-j'0?h!j(,S)-CUq.Np7$;_V$5Yf*H^h!7F.=^uY%B&_*P]G2-q>AYn3"j>V]]=P
+%8:jNO9(kBY'=Dj[DU?nu(o/JDmJ>p7d-LhT?L#8[\Yknl#,?M3M6n`'m.F^TrDn?\7$=O@&R^k`HE\>[`W'\(2A,Cd9prZ7+g0fK
+%U^lA61A%]H=9`7h`HS)'e7bKj%\MAso2;,t0%4&>5rd0mUQBX(P2*Y+Fqc\0XWRHTL3+[9].BGZCUt1F)Q0(NRU_(85)bEp%-7R<
+%3Wp5ZL'J$]!-&]*$btn*ZZ*)0JcXteF<M;DNTLobheND4X$&&U.eWI>cW?KJ%j.>mmo;U5e at lI]^1kLG_5;r6gV_+uSq/b1q6!QR
+%^4VOt+qQt91o<mk7GpE+=_5Jp]SWBfbeH!#=7X8+:<,"8Rp)EFK]&!2>k*q(:seSF,ZKCWNZ;AYQD!F3Pe=#$!Ubr;d>'<k,dMX?
+%?Nq&'mYk^"l7 at VEp;!Dm9a!D/?gTsn/8RL#$.^]C%E&E0h^PdCBkA[5PbQe<V,U&=_Kmt5FrS"X4 at P#Ae?!9;SUW]?U`pB!_'C_F
+%PG.lSePW2hI7iRb0cSM'H[L2qF'2FC*Po*^q"D6765=XUpN2g=C8<bXkFKS)T^HU'O^\mtGFcVkm!b'4jc7Q#0*0Larb6 at qRk1t2
+%4\hbD6 at C4'FnoX(*Jg!iYW at bl"gK=Xo40aPru:,O3p9053 at lU`8!)gVQsuL0:F?bZQK3;(P`hWR- at -df)9#TPYgLuCFu3C'-#kcF
+%X9Ta3^QHQb>YMqm7Gq9?hL/.$p9g9J,[rnZ;X/k/<^V&MPY;!$Y9eI[20,Cs\YeHd3Xm%6VMU75+r6s+jP@[gU=bdI#egp*G.TA\
+%<(F`IZ>r,Br=TlAr-=KEJf=,GK;5j_k[V%eNdik0#_Y__^ZjcqcUNNGYfP6MjVV\q7SjDNmErVOmBEH%>ej5gIHd['+"7Et at 4gSO
+%'#'`Db,;,BFE#Qs\n[?B'@R^hJG+_NpF3W0*-CEp)2`q5`_p`oqqA#eVXW5qOo<u1(Z:o9;"J%;))>iT:hT:InP8se*L"un,n]'#
+%KtDc=i2DDuN>X(bgV at r!rB-1)h#*hg-MPqe.r3\7cb1Z at XY3?X?#.9j"jOn!a,Q$+PMDbEF8sm7J/HK-E9Edu(H at LTct2J3VWpp6
+%6h&2hHji[7[lj"Go:ZacFs=*1e;%KpcoPU<DU0lHBX]@5XdliaD`9734MaF<<B"CPf("i1-(ZbO:"D=$1^!`f`5a3?2lU=/^BQ2G
+%o&+kkX<,mWmqD&\lNt9MJHu)H,QjTFQ1So$p03\.oR1e4;FQYW,l"1nI<,tkG;Y2JoBQ/FKf2Cqgqh['p1dnjVRj.a#h1QG^1e=`
+%2ZpUu5<GQJEdqGchWH-!D,]u)Q%NZa#Sm<C:;ttGfM8$D?4&R%4X`+Cc_=LTA=d)BJb4g$5h%D`YRJ\(WTBMD4a,->=6kRp%qiR]
+%j7rH at QZqlAR,31_\Ga9LY5*KtJ.c.RYo<(sX//Sd"\^WPEp/_PNET5r'\]eQp<j?Sf69s?3GI#%Qjf+)b at Sor9P-k6.2TGEa8ZAR
+%r4%n?n5L24=it6d-%hD+iX>Q^'YHj.U_Ti4cULuB*c%kT^kCs:^*<f$O\V8 at L$'d!CH"JNp>4[eXihO5nUdk\-NPHl=uZrccdQgg
+%qPBX3T)&8RI+E=BQKKQUYnDuZ^SJ&<$PXVfXIZBue8pT:.[YnN=H=\0.Y7Uh.[`*2NVmH6*D,W4%#NU.]6+8O5`G"[NFFU\?h.&Z
+%8nupi2SX:!"0QN0&`Q\FNdIeqS+"A&9m)B0k55fuLPs/bH!`IaaauNKAd6l4lma*i;%LShFr"a"jW/(,;0'dj.e`n63?`\C:\No,
+%oM/L#=dhG/hn#nJ4:'a*P)Y\%@%P9)30,,(^)%fdV"YR(F2!o`B*-0`doS<iR;;&U_:>W4WZK`XCn_QPRX#M.%B_q[raOc!-0='$
+%F.4=!=L6,5lW=Xo=N<7>#l)Om.F1Znq0t;YPO at j05&+GRN-,^jed6(Ma_X)L&eH)I_,Pdg=M1K1^sH&4AeAAk+8mTu at BLrlQi<$Y
+%Q$'0okl+]>h]Kkc62+W/g22%G>t7P(9d!..PPG"l*TQeYqEqf at Mokt<2NRY*I3biBA!sW=T8fC>=TtmDXqq6>E-&?l]!=Z1?FM#e
+%%*VfY3FAe6K0:HH_BWTU8N,r9B"rSJC#l'BgJT(5$d;2Z1XEcr;J(,OH7Du@[0-a1:7f'26,JCQ_3'>91u?E>P%lVLkiSc(j6a9[
+%neimN^U?oCQ->-omq;<K-.o<+o8X9km[M"u6#9?@e8uN6qY>%^2O'M["6-Nt%b=C.kc,[^W?lbQRRJ*MrOD!+qq@[=#EK9$=#bYS
+%\/W9R-(h$<MbD2GW<2\a0J#:FH't?;3B6mmCUQH7b$1#p"'h"75&/s'OS at oT0D<jm_6ABN](5M.&OD,-"+eL"nhJY&Beo>Oc86GA
+%P#;@B/@Cp0JfNGH/5gc)4C;!.%3-;Yd4$/foP]9FU=EWf.t:K51WM-js.5LDAW!b<@<TBZ$TcC6kJd"0>-T<AS:'-2IJ\Dq1&]?g
+%Q6_C$\>\$0EX)?o at UYfLNs82X[ojV5=\67P7 at R3LQdW<]PdmSc at KHr=IA;he0/kHE3tTa)h$l-[WM9Nh\]:Nd_ZUJOB60"BGT:f$
+%HmeZg)4lc2J6mD*<M(n)M'tYg#&Qm<e,9F&63V2CoHNM#<-r?/V-G%jetj7,!"[LuZ4#gZ<QSJ3lkP`R4OXFXl^fOC3orV;:E'2&
+%C*WjtY2;b:At0PsOR at UDM&5m&B0S.A.R at YGEl+f>U%:UMQI4$4.<S6m#8'V2fH0Z2PJ6O$5-s%,KQ$8KDe>X&G!Gk)Y/qG"dmK<S
+%gi+!Ef&tlGS?u1=gcP/!r0p at 3=RlX($sJoqUH49Lh>,_]3L5VArli#1A^cEID3HW/B$m$=qM(t5W",WiH5)$dJ58pKi_B707Qd@*
+%a!2%M.L at RhmY$NZA9ZU1M8C3-+;RNGO[\5Grm$b7SM=Dhks\k:KDUFQU4HtZHk92Ze">GjZn)jf['Ym3413SQM$R0Pe(";d`8Ng0
+%cIVmbi+%!1U`qpHlorPeoG)C)3(i?q+,S@/JkZD0r[(ECZKKQJY:,Q0PD9Q*9@;j.R)2_YAGAXoa\lRC;,T3+8!^OD]Fp at 5*aoYH
+%.pgKVTWk&aKFC)SC?Tg)mc*5gT?GWg/^Jq6[1:u)G:CN-I=4\YNtW6V`OanE`+5+%/+9$OU(tfJL#'T^kL7Hg+M!"G?7o"RChgSH
+%<"D]:l_3P&8H3<HFa7MBqkV@^7HnA\LD<M#CL^a>?t`?8P5%lY'?T1I.SstH at d5E-n7:dB1$6Y\mF,]/8U:m937scYb4tj3 at GRm5
+%m,$rA5aILnkKn#M:X`bo5J/N2WaasN43=bR?K#`4Q^bN:DZ!\i4KZaD@(W9 at +N=K'##tG)9,sLD,q3_r6h`'=Rtl5d(Y2s?LOEr5
+%Q&fOmodhP3g=<,eP%dRpeG$%6O?!`cZ8q/&nK\_0\'ito9V.^cX[YnQCdJceFi.%TIM.>Qd!Ke7fZbZTU!4:K4B?2lg?s=E90P3n
+%rk,aPDL3WJ=Udn&\$.kb$=#<JehT=AS>GgkEa]@@rc\S-:J$2b50f0io^MW`%[0e9CA4Q2.2$1J`m%.gdk<et6rc!5qo<jX)RaAn
+%,P%Gm,3Nc:%YH'(HV`q*\S5&n$lk7E[oC?RlM3,7$gpG19!gH^%a&a`59mn\2c<rW#t.4&X`+q'h&:ruA`-Uq3FJ8$"pTHROc.?Q
+%HYP%$J[Vu=;/@\0fV;iXOcG2`^Lj?/8,aH>EIlN7omucpVsX1Q=i&,?SW@!LE%5hENc1*=[UT[Z,0P:-o`Zmt2\0HXWE+!A)EAVe
+%@TqkukE!22rC_2s3g=9nUUVaO-^Ef7VeAQII"[L/WJ.NrhH%ta@]-W6;JrPfe;&p5?=o]BccnlV_1Z9cCb`?%lZk<j;D_fn4L_0[
+%!dPhFk at c.e+As!F$AlVRSYt\9PMUFe?-9kTUaFMAM<]R3:#BCQoplaVk9f.mDdHVO,_:!M(6UY.0)C\8+/tn2THjpZ!/O7L[$"Ts
+%mWJAokJIG3Si.:!6#T&kj21 at 4;H]A)'7C3%*G?gOP*;no=[skGN\-YLhim).C7ZpeN at Hb'?QP6\S)")pbTbDV:OQNUb1%Vnl%,l(
+%R`7%&op)5jnj";J9'kNh:d+%@jC,'.Fb3Md^L^/8T%@f at I]g4LnN<f'T=dG<GFFa\_f>PrU`$1(;]sOZ_KXh_"7kbSfuO@$*!VH,
+%#c at aM78$XP#A;HAWY<7h$b,8)=)t(fT==6TS!$C._<qtAHW\/mI&MT=!<P?\nDH>0U/cJp0I2,j.jj];Ktk71IO"#YW#]1;huZ>;
+%1>k4t&71P#bAoBW("-DG^rD8ZR=]hu$lXC>3N)=0H!_Pj.A:ZE];+8`=h at I=rD"Hp7?8H_WAt=kLSS8OW,.I<gA#,1M^J8r?pVHs
+%)"Wt;_3c0\DVV5D\0]>T3QRO="4q=rA84,18Gqn1ahLM1<j)29cRAhorTb]gT;V7C=+)eXK&]`X#8*c?,>9''Yp8n2V>,t5^K6lr
+%3KQPImToYf<%3tTXG at P@.J2faN'D6fk;Q5!&r7APj`I%m4pd,Po&ZVpE^jL?=erMalNgrZCNmB]%$5chHIJliAgl6O;,pKt[q.=?
+%p;<d-[neGHj33P.S.L$D0n/79pBuX!`:d(KRJNN+c>oKeZpi^LJU<b(aVnuSPKOK65V92a#s'a_och]^;*9monbX2[M0C_N\Ko'>
+%AhHA*UY>s%E(?'3Iefi77?6IbT>Ib%"#Sc%c\IEgEF_Zdk:*@_ai*?b-_5Q526Z&c=]cFXN923aU!A(W?=$9q;Q8[ClXo6-BHLAd
+%U`+2KYm_>7X3q&Anj-iJ6Z\(i('X1o3G2(bce<bKh9-=,525$R2GN"S=D+iF10X26-o>7_)!qau2dn+ohupMOPt-1/G/D#c2q9?\
+%d.`=lg%<Z*E#\<tp'>4i4KBKp-9l'E20ja8%R36939r0K at Tit6gfY4r:=a,.kWc["-X#PdeM/Y]mmP%!X/37G/LaJ!PMIVdr^dGV
+%<rSMK9cu_s=&R)*GY-.rp^`Z5cht0bK'ROVd@&-[BC'o@#c=?hS[][$if1oSc5]76oFW;%/@*rZrk67(Af#5gC/1DBZL]*Qqb.IN
+%Q^ke&`bK`T27)t"(/iM9>5SC]pO9'+'IjHTq`_F#kJ$s_n1_YESKjaeM=)oOedDFASJEuTCRJ>e,<+=*CFsHNnE25EQh3EiY\GKH
+%!GrWOhB[afWB5SgDd at 4C&$d#pXq#J0,e>M6=M.3Dd\lL,ACe]+`htdVm^EBkh-.\s.gKWR-M0,nXjlcLh"!R#ht)4bI\J_$R=tb$
+%6Zp4GEn(7 at bBqi/YggI#^6Fc#A$,SQ'RU(kjRT218#Jl]r*TcsA=Vi$O2kNhR(V1&7^0nJg*\g@@@!N94h5-lIbr6^cIRt;(G<R#
+%@tD(-[goS!m?CRX@`NL3J&^-b@`C>i17$tIPtErE6!aoXiS!m88N@!ShFU'p,G&[cHi"!d+4#WV=[46!;1;MA8u$!CZK"\KWrrEC
+%*_r at gXW'.)O_QMf%Lr2gTaGN#cX]V<P"^JC&I=4$E[<9Bd6c,SD"8#&MR#P#F%&$8Bq_UoLQ`%#54K?4Di%L:blKsk<W:o>FUfg\
+%Kj\fu3ULqVPo8H-'4ophA,.@;T?C_N6G?!KFLs-lY8/Y'A_g+._tigae"L=I at d>J)s%*K$JQsa^qb+)aVHQR29Lc3Sj3 at F%.R)4F
+%bl')K0-;pfANn$8E!bS#>ai'O(>%*:luH6K>Kg+7Vc&p(f:U5 at eHd,;9L:d,PnrPR+;H$IGJkt[f#;IN5N#pCr](]VXgof:2-*$u
+%;E4DXT;%]E.[V=ZDESMN?&T)6Ng.Nn<_&4]R5/81F`6fp;!(p,L'4fG@]]%jYG3Uml1]/4;'-d at lMfs)S8WjQ"oL3!(UW8^__7A,
+%Q/nHGBUkZ8$9ff$5-tJ05&?5<o!RX*j^]<eDU`69.U&n3:YnHXm"53N`;c61X0YA`mrU\8Q9%rpI-j!"+5Ht-5Ln=X4^SlNqEC4U
+%l8a"^'$R0sa,KbA;^[SgpO=fV%rTIf77cTjGQ1u*EJA#ULJ6sB":arB9APeF'TA')RWNl$.77R2NOIU"";s/F8K!Q&ZIjFbF1'DN
+%hu)NmJgV<!fI=0TFP]qQSnjK at U7EsjJI!5`]SO.2UhiDuV$$E*;c/&Kf1lZNW at bVd='^;JVjrIOHUFf at G92CaC^lY^]IW.]lj0UF
+%`4\`?/Ua)Zff_e\Yp:'ceYa8T&FuE.E.HZ=LW?=eahAMes1orkbj"m[8Y[^qeG!9FJ$jh0;"*Z,U#W8I\0^K^qs'Q.23gSHC*7l_
+%^f!Y[Q'kZ=fmKY*P_5&*DA2jn/4VEQM!rnCeomk<OsAbRg3uc$&k!uI+,.kn6_KCuC2S&Wl^jJ;>:>kPR'@Hr_T/05-GYkl*,LD]
+%'29I^jE+Rmn&[e?jo7]@DTauQBW>E?Xlq:=e<c2LQ^WK/d<q]sGVA7%&bfg#%;stMMip>YJ[,`M43rbeA at DVq@G.bAcl*7m#]MjY
+%e(-dpC?t?DkTI7NEqYU2V?b/_J;3eJ5?iWJ1C)a*3m"WeT1a'f3\K%aB%k=000a)!?SdSO1rGPK.A\,ffKn^Ja=oT$QM:XVEJeu'
+%+m'nWp$tiAKE/s[UnqZ</NIk-+7u&\e=>:+F;p3bG>!rPb6SJq<7NK7$\$seW)8OH8DKY:DU)t&:iH`b[OX_bT2JCg/T[Xl&@opA
+%R<g"O*BPY$jh$"'NB+k$rIr"(@dRbR:5A'4BYg8K^)drp^oKR-%&LBLf,ZOJH"V.<:@UI_Ro1WCW]aH:BXB(*e;nnsk])(IB]DX<
+%m-L at -pA2[j7S^ETC?'Bq:BLUP>Slt+Y%N&PnX,'Xno=gj;rf=u-?d:SCXD3Tjsq0 at kLso<;qpNmlTN5B`MS^pHS-^A>S!S([cN;"
+%O%D'^5O=V=qNSc7`O<gg$rabPME+^L4s]R:N%M4Y[ua<QlDg2PoUp0#YR90YXtoF\I^6TJC\O0cQh0\M0/';UL]\W`an2iW=TBb3
+%%(NK*((t]@AIu)Tdd,&&hNRq;66Jtu8'*-IGKEdMN)t!8$!!i$J";DpnH@#?BJcR+FNI-t*,KH8o.E!f57Dj$\GFe3(_Gk<7seS<
+%""J/EC@@r5k,elE'f')@n.2QX>gF4mg=4TnDZONs'2MA'*b/bE_`'Xl!)BHBSiPZ#AjI/<>rhI/D^9PlUh'lUZ-]if.+30Cj/b*0
+%rGn=K@/>/s&r$o)()Z#5K`t$8(HAA6V*[PN at bm/O=iur at -JG9<fI<rMW(3l_?'oe$4l;gFUWlWEA<!d/,8KI_m@\q5d&G6]!rps@
+%R-J.[&aU>f,YnnL-,/C9R]8GhcnYjHWI*H>?DI<KHNeL)1 at Gn.lo@7UP50TJ(:SR#[n3,$8ugs0<bBg+"6Hn6pIq3MB#tVClS*aS
+%I_3!2Zi7LX+4m?'U6.$[P*cLj at 4'Ms6K0/kY$,0[bKKM#fACH/'gKKS;86:0rCq&t$^mgGSksg58+kGdN:[#%<"DXq*37A$as<Q=
+%gLbANA%Xi)?!T=a&!G)@:6%rQ<Pu,>;Q%(j^s98Z=.cLXZ#AF=Bdfc`if!FUSnq[,!YGOp',;m'N_Ir-f+6I$F)IRg_`ag!pb4(6
+%(q][r9eLTh8'9fPeMR9oQ'=\IXiCsqKR.u?())65'I258k at oD@kY"6-50\r=SR\"Fquj+($Nob9o!R%)*O1:XjH3oBpn?2o*./<i
+%HgWg)T[?EjB`/.!"T9U5'9&]`OKc0_6jY at O?g;B1:YT'nX.Tlnq"lq`0F)hI*K2;3!\0&XY$X at O0q<d$Yp@<Ri#\\AEilr47`7W_
+%/qL[7lhXSFKic9t=V,(K08214^"MH.g=8TWUk=<)#S%b_X#D1()c$]6/.ZooqId!GieI(GLbacADH8$oKoa\d=HZ&2cbtUIM"?V>
+%X9[F699KcUa\edLeVOjOc-#pGL\`--UfMhZMUBW8JZ-&g`h#7-g_IVg6?L>!^JOh&HEG_ns!gS at fU&D#3g6'sT?"Z;DL-aLp;,(e
+%r,VS`*8UO`<915gRH9"+5O8"<k/TpRNS>LaU1DMrF1FcpV^S!U>KSeYlo\*i*phGrDpmGkBQVhUC,o1e%CZLLJVd7l@>ZW50Z4bG
+%cL0!V+_ at uC^q!0*qC&<b0WX-rbt2J#3jr_sO/4p2OBgC["o9=9OW-/!Nna@?Ts0c(??>Sg].,VRQ:R)?JJA*E8Irf?<)2VU(s8,L
+%+f%Dg#Ai:ds10OGhQ'@WW\NW0j\D\kAtP5KBUXM-;q].`/ICfNbk:,Z1`n-,MR\*Bqj&)LW41pu0?;@1-T?^T8>BrH)OcoE5FH:7
+%Q1>DSr^@GBcg/[BhQV-!W8<cm"d.rOC9ZjL;731 at dQk@#Q#fV4*]$Gn&P6I?HN*Oj<1tYPB_6%nd2+:`b`2q/S4ZS7KPB).O#0ri
+%XA;QBs*cQ7YGhX(*%"H^+',H6 at M=U%qV#:?7O!<a#T%$PQJsi!YA#.+VD):m[im0Yf"Bs)nb/I\L[W2#nXNQ[$eU6N6mIKuT08%(
+%q&h+i"r$_aGe+Lb:$"DI^(QRL=L[Uk4T]87[Si^>gUFO.ppBR%rWYB?.u68g7P>pW->4k?3QY^PEP6&^m"Q<aQPk"FRG<5mm_Z at h
+%\#[4`ANdM4C41?c.lk>n&t;UR*K`6&-5Re;lkKq]@V?m)oZS,A&f;=^(.8)6jQ,2Dl!3*4Db9sbdd;:XFi,KEF)uA(*)eQ7*@Dnc
+%[@9NWS7)4ENe4<<D.P>+B97KBB.ZRBa5F5iVP\a0f."g;j>0q"$/^W]h)K!42*'h at VMBMj?GFP2IW%gW8IW0=Cp:NgroJR2WN9le
+%j\S3`h/o!EjL!7CNcfD+qbe&EW0F\=ja.R55T.eDS',;5T;eIb1LEeS9 at 6;6`0qHJ'fNPsIH=ln4O%rhLLj=p.'53uh-jK1%dM/%
+%jFuBI0-m=`GSs)U$)_l^O>O,(:!kbFSLqnCL?2h]$PPYt)?m.#(#DDj1aqZKB!FZ7=F]Z_a%T%Dg]9KVCn*mWIQEuu%st#ZjZ>C&
+%M]9_?Y6N`OjmGM`Zmu$YGah=p4%,FE]oNnR.9ABpL"b]^>haSUZk6?dm\u^kdh&h9YY5R/"H,m?W3Dc?3a0o)G[<t)lqb14-]jq^
+%Ni%i\[Opigb?GpHOR8MIV$S(V&(06dP4CI(ha\6)?)OE-i)WE)bC'M#\,3].<s)S^6\H<"WT=(N]5WKk1+^GABIq=lpp=RkmZ\s&
+%8dq]b\gU3ZIpl`Q8$lF7 at d91^QRc2/C(bs]^`=EgJgGH at Rq><Rfc at TeBdP]H+rm!Kk7fZtMk#$#V*Am8ReIP?Pb!1&XrR\OKbdd*
+%r2ieHkm'RhG*+ASloTYTGA`.V$c6o3hIdcjq(d1DIqR*j)h22%"P/2:5&-A7M\_YL)8M?HKs"ZpK409XqGUM:b^=KqOP9:^$GXZ9
+%Q;7!c8rE0(hLF<#\8NWP3CTe,<TG7.H6HEQW.D%\2RLiHrAG\<o!_\(U4G9QX7FY:,q_9k]>>bY at jN4fA?)5nhR'pR>+F>AN at a"0
+%,M&"Wq.k@\Cnke,+T,"-FsohlTo_)+cmj&\kk5ceB9lXV8eWH\3-4r`m:?bAo>>9&:7aqh/Zp\k:EMd*IRAT3!L3mdD+]:'"]mS;
+%P5nA^]:FM\G\jAI':Wp[$.qZ`94EmCGs47B%[#X_=u^fc!KVMJ(Wh\k!!J<scrOI_i-_/Gp1!kr3!n<1aj'e?6VUqlMp<c*T\"-M
+%LC%*,5;qtGa]!6]0,*_r.PGjg;`4h*k:Mm`?r-=^=QPJ8#&h1RI3F]3noZ!Hr_?:>_L)\TO\O at CLn0<_1=D>tp.W_0o5G6>4/<hH
+%QU0]=!H6'o*)-P7nfDl;`\nRlM/g3:?"2YJ+28sRDp,Vi.=C\J1s1D?D3$"n<H`fdl3Srp0 at B96K+lU]P9FVYJ<(5O\_Fuep/nSD
+%Y\9,AEd55a2p5V8-WmJ%^+jlV6[Ma\jKgWh?Lt";5(>sJhOKD_hfA!im99'?fg1oqbp8;>WIi!1dr3+[g97JlnuNMLqOlTWSi24a
+%LpUt"2Jm01g=i$ESQ.2>)C=NQm'+DoMdn7+Y0N[L*T\*<*,ZMSCF&Lu/]3!ThK>mC"kYftmk:l#2UJ[p7Bs)[,[K>$:7cm1Rl.K'
+%%&,>>SaqgFQ]Ee+CAk%Q76R2ZmX!4/S`F'@g-5m,GN!raI%)39[*'Ggo3HGtK&@. at G.td[OY,\6IAtY]4.5#tj8DRqKl+Ys-u#tl
+%K!fs5T7'P<Z=L:]a36WDPc6ic4b7!6AV4M*;#Do[r?^#I4K`m'ad*`m=G]?"ar>\Q5YfHR1q'-2VuFlS0PSPukNciY4h-Z"DkdG%
+%I;!PUY/:Ct_e?TZD:WQ+:8tJn[l/S!L;Y#fZ=2WbI3A8-^Lu61-mh(J;+;DIK0-/tSG*\U at jgt3;lmC[J@,#Eat.HjmtQC)9$]F6
+%2:]$mdV^bi;JY#!=s'W`\W+ at 7\\*jGL?>hU^M,)A6L)k^iSFg^AhIXtOH)6Y0_iC)Ml,e[CC)'8VjpTO>iTHrV?Qp`&9q*kr)REt
+%]b.fsD<Cd:9S>c"/`+M67AZ"pr->6*n4de\HM_!G+tAY?R\WHNA5A%dBJ(RIkE>sn27690LujndQ_lNKo"lM'Q/.$QTCQCbj!BJ'
+%7o7$.m,`FjgNkdUo)jo]F,ia%b[+Ee"hC-3PmbPY*oY43M5<n5H*6']*RgW'KaL.r*qag)AjAlD3"\a5`8lPY^mPbp9g8g1N'G6t
+%)i$[7R>Qn3QdN<OdV_H14"M;"/'f0HpH2[j7N*91F$r$J'>l<nVG_XAT$no\R.XE,\N44(Gd0UuM`p;g"h*it$ZZ(S`m-$6m"Ons
+%k?M#(V:/@Y0X_:]9f3#(jpW<s<j6rZ%Xk1]OtcFcn#p:\l#U3q3HqS9:05QF443(SqK7RQ(Q*U89P_jV^jkd1RXX[N54*'P4=*ao
+%YQ,Q:Z^N3_9R/1$>i`TA:'PZP*%q3:"r>S?PYe)5b'G99"$Pi@)98Ol8q9G#GKGZm?eb$8mhMF:=@ha0 at pc@Vf`8=7 at dTE-A0TQp
+%!tu4pOll#FqSbQp3rrg-SU4,W8/`PVI_;Q5k-(t-nXhs3C<kEhc-?AG?UDYKjI'n!DP%A&jM!."A"P9<k@(0p)'.Ya5_jbhJE at 0+
+%Cj#[88_Zi'gCC][+E>8)JZeXL2]=9ilT0k/Agmk8ST8qT!RpfmZdJR^gR at NsU(s!7fIckp.4qO`mUa*,(D"6\&A".ZO(.'+86I[/
+%5`J>%nu`c&^4#i=(*9aV#@!lB55c>,Q8$og at m-#e2ktYI3;]8-6p]l%6cCgs at uQ*B:[3b,"Mh;j^F"6h(`I1"MrXqEK]@qR_c0"(
+%2>,amZZC(db)(FBS_SJlcd]`o=P'g_eF+=A00jSQ^d$\-m?%N4%-6sZG*IrHQ4e+qKHo?LH.)VD$B'm<?"jc2a_srHaZn)r.&kEd
+%ek'qsrG)6Z[Lmd(NdIu_("F!fbGghY,-A3./Y[Z:7Z8a"-SB/0:b3K!c]Yfka+cOfVfk_`dkmNH_]J-AO0R##[$>hFB.:+#l'lLY
+%r^piR#,]XU2V0l2SpoVdjTD"aAokr&qs9 at _PpDLp51LA2YK;\#_'1.;/`C?I;o>>#q+Sj`711XAjU;pV^niR]noIIgOf+G5`(e<b
+%fTq`p at 9$Ejcga/4IcZ9'fcL']hh<#=(@H_fdDr at po-?K[9=MgE!lO^7b(j;O2dW$*>fk$;he.OI=iu3._(1Gon95X($.7W1Y\Y'2
+%WKF>jBp3t5]9R0Hjf>1h8^:#H=sn6KXkK>dIO&`II(sMg0QCA&d;0dt]]GZbLW.QI9f'V at do<[%)j'odO+3Ra9,<X8)^VUseAf at i
+%b<(:*r9np>>CKh_En.`nV>_Huf>:t at n=I2tOf\42f6^%DYgTbBTg,$0SB=_>e)]6"rQbi1Z''Q:e#Pa>D5n)C('uJj-/u#[<WQ6X
+%:AJ&]e-AS)b1#Z)/G^G69i<12]R3k6Q`j[nj"FJ.+V^;loRu7jZ<sSs!nS\A[E)m2GHUHB,F`6Jc)!k52&9*S:jS\UMc1qrh?loR
+%RlY$H'%IC`Q-"-#Ns'C\?tCk;4"W&EnKjge`gfd*kkMa<&l(1V0HdZDq-))>g9fHQ]K$Gf;KsS[5HB^6HqR^jhkt3#Yuo#VBBMGF
+%9n)^;D1<ja-6uI,H=oq+#ltgbVL<bDIOgsB)^N<(lD*:a.D3)RknT3%7j"tmROPdFQ(,*,oGcl>q#_-o2qrQ/dY2DVJQ<Kkh%uAE
+%0HUn6`8n]O:VE1=;J4>M.F5>KGpYP0X"be'*W$3@%!X>.Fp#J4^L-urqYZ0m:J'W[`P;pGC0KK+`@#mZg$JYsWGeS+"3F;k8q'&T
+%LP$IZYT&`jF%%238Q.+a.m6rZ?[,rB<#%m-[&YX8#MS>je$pp,Wpcm39Osh!7C`"#@S^e"Pk\Xa2,67Y8N+qKgO/#!6K_Wd3)aBl
+%e6#gUo"4<oAW6SRHlPli!ZYD/ZEON@<kJJLF8'N7VBD=6IPmJH;I,uIZ+D[50A8a+HDa4*d']Q61j*T!jNjp2p*A@]5K/CD3BI`H
+%ieZQ#AL`d(BrYGUBN)Ol'e[-LnmY=n4(SNVZ,q6'I?(M".\A%Ka`B&uJY]8ODeHb\H9b:PO74!tfesfeqfk_f^bjG::E6?208`*t
+%*Q,nMEp!s;QV;i=aSujPS9kP;mqBiS$ar'8CkUH1 at 1hmb3T8]:$LDEPe]r<Em;\iGVP_#_9cef)Kk#HLS at kd4kW<9;11/-b$+ at p=
+%?]Z'qEj(\UP+%h3d;@bhGnr3rHQ`+J(Y'0e]<tJ;dbK[8(Sr<*)o&K<G at bfAF/?5d[a\an"g.Ah!$O%G;q>)n8X,L-ZPG:)+'AmI
+%.Qa.r_J[\Xh^A6Hc7_%/,H"PBMf1pI'SL+hF#GL"f>9[^Ql*O'RLT`6+p<lpGI&/*kXM)24A;6!=+O!N*B?ZM*"6$N7])0_Y:AX,
+%cn00)#=i.N:`E@$iMi-8T6=(Sc:-K56>S_"LPFW+d';.\:FT'^T<6LDEfN>I+MWd9+sOui/KJ'\I8'/cq1q]/F.,WZn%n.;S`[Iu
+%[A^4<+_PU"U3"QE+;Eg'nROD"So-mh\%B#ECZi)]86S#e"BZl.f4eo#jq\&s1q&tMQB]!b&JUNc=M?q%RcbqIcE0,'T%-f3(/a7d
+%'(!))>/h]5U1%V[p8Ok%^Yh>U5e?JT]k:g#\%u'5L7+.ejWM>:noI^0-8:k%=n'/N.6Q),KoDJ-40]gbXCNtq$><'O+h-?ha7qo9
+%!pm#8(W>J)9VJkXrQX_C>FGHKgq9U2A^a`8G=0/DQ5?ZMFPGJ(YSK7O+>L6-%r-926A904aqkHHdtB^.0F'fiKK!#^h>APRg\M7a
+%\//=C-r(CXPZ7;`0^8iU.>We+p$GhD2sP#DIQu+J+$6*E:gqG-0X.5tOBRSuH`_U*f9<6HF at r3"LR<&dIT_QM\Jd0Ps&18?U:lA4
+%%k_DM/75OO12[TEe;6@&b_XR-]pM#<LsMbB@(DfWT1rVEL)e*DA\<;M]3P_G:,;j\5C5-:`[P("HP7X4 at QT0h6u"<>fS.s;MNE\l
+%hu7j%Q"Kjj$OF5u at 8GE*jBq]8$46jVaj:!1/ibp-:6oh`SJ%.pfMC?`NYF&o#WBh;GEQfXOf#UF7.7p5D9D75/"Cl?E`3"?2D+eR
+%M.#FHIoD at 9RUtSa\t8N##\Fg:)t-aKC&m$ll',K.ai4CsLqC at OE.0m8oQ?dPN>lf"<89FY5PpV)*?t/kP-J$/b6MC at g:$1RhUZ-Q
+%MJpq,WBa6Y:_C(mAE)FPklVD+J3fr^VJYA(6@"DPk&#r1M=k/ba#hQq">3(r_J1=i(\&$:C#L0HGf'W3Ngjrb$dtoL7:)^[8C1(g
+%nf4j@]%8s*4_;K!*bXOr+-qikOKB9ADOEQErlQbPXRk5&IJ&f!`S>PcnC;"$B]-p;T)#B/7J-PTk[tpW6%]H]b&0=Qb_K_JgTt,H
+%^X-Glq8r8-KC$U)lR:(IbG\*^c=of]@uPE*GdOW'Y`Nk-#D"aE.5Y=O(Aa#CQ9asDd^3cS9We.^c$1kL>[#g[a`E?L;oO](?&@c=
+%a/Z:6G2F'Ss!:(hP=\+/URPB!-I5R;C$:<8EYoE9._KNi`/G)k,d4$+*W@\VB).C at 4o'fHFRYf/aZ6,'Jj(dQ8V\ZA*/rZrUXK',
+%/nH]bk$2;S"BR[eZe1$d2DOblfF]E!;m%=Y at AJb>2#Wp=TKG6i6)\@4-fIu)IE==b/mYes at q0/S6G>"<'6:YMcj!9N0DofBc(AOE
+%2H::`gNI\(O^hRVo.XS at KD=2 at jp!+Hs1*^I3judK/aP&'E[qkD(?[^V5a"1,[-+-pl)/_%B+bh>QNs%,#@2ePd?pPtYAMcX:mV#u
+%S+BYr+ilZ&e'u^$n+ at hle\!/]1+U[lS$!&\J29^\+BoGJ\cqVOoZK+hkiUc9(ocbiUi+4\<Q4+WV0oU`PQJ#c;$=V%$r=!_*)>eX
+%br[&T0F2OQJK+K#.)B/srbNRWS:.Q.&=:m\=+YM*G8oVBHW4Kc_".FrhHmGY7@'F1;nbX"f/39.-V2L!+ at MZn&d5"q484m(IdN!2
+%QJ.g"kHoYh!qh:CTlf#ulUKlV?C8sZd+M=AD$d, at 32c8MDLZV)Wpo,UNL!taYlIQ>/6(dEZ$/iBmj)WlXY/UH'%E>YP#ubNjap5r
+%o_q_]*VHWSV:E.q4TM2$SOLaqmRaiS?^+&)GGI4FpQq>;/O2OM4(2]u5jYTi(D6t(LA[cnW15&i;(ILr`-WFj'F?\qZnkjL$dP7-
+%@V`'9ZZD=oUA:Z\^*^Z7mbdpZ#.=/i,L>a`-8>_mE(%A%$2bi2;j/QI9uj1biI#99^Jc+F/NDiHR$snt9mHJ.(S5=pY)LJ\c)jJY
+%fkKA?@JTmsV#f:8Dk8NgK(JEU4,Kk8diq;-m]5FVWls$V>fi93^pn6."aG'$4j)OrQINP<C""MD^!j,*(Z\@k<<9Nm3L3u\T,cmT
+%"@ol[1T_aUW:;Xr3Hh)^?^e+FqS4FG`1\H$M0rjQk[;o.?-'+L2T3Zcm/)iHnZZfN:CGj at A]"2L1Jn*hq:4dm;pia%&.m"kB-+tR
+%+luJ5o+FS+?q=l+et^;pV>_.T_`dG-5 at Z"'Jh7#],G/1In:UXIEq2.l63JF2J%o+ukN"@/94q+QLLG[pH]fYu;#4E,=T\Y!-3Li#
+%1uBl\i3^DG+XfjNL5IVEPF.M'@)=_Pj)LM3=1.sd[3cm@:^\,m3&<\ic0IJm/rL$WUhKH)*t$(<c78<nhokL>0aGrl'qUo[PMJmV
+%Y?#,q4/ZaeNIk,C0ts;e&<"kiikdQ/;-m>`CQ_WFKhEh.,NV3613Xm`/tC7 at X8s#"*$mPLdI(Q15LMF""UVW3Fu,YVcAB_.>Hmp;
+%$1tfcNLa94G%*,.JkT4;G(_ZoCT*6BmdK3C,\Yri4PHDN]-S<r/\i4 at lfS?4F#eTodrpAscR0]M<a>h(YPc<r+;p^aKrVR1`S%5%
+%X\1#cR7D#uOCU5ZeV#4i!og23D\)J8N[(h/W?gf$BV_0?7E]I at RMGBB%9qab(r%V?=BCncUAF2C at P@D:+QkkaT^]au_oDnEF)Vbi
+%;_S&$/m/M7H-@\+HE`&%L%\%i1oP*RNo\a./_\c([b/:&d1I<5MiSZsYJdct9#aIto>Tm7M&R+eU=jT=ct`P*IPkDp--4&Ms2pbN
+%LTKe5Q0<5IX%kr)Sc+iHiB"ANNQp&YmIhuB:MZpI%]8kCe!3>AddTgHq=Z7bIqhq1hX"f<X\gXfH#R>Wku'Ij?NT7rT5h;PF,B88
+%RkoP5`i.!:``Og"C/%9khm.,.HZ^(,Rs+gti7BA2#(7+g;/34>d@(pGkj:'dY]2Ze'#++q;bC%a;RgeO8uYI#O)i*G,5rclO*ni'
+%Z$i)V'<qj'Nl4?b!F]P,U5+(T,b9!oOA/$U:YD=Pde9*.Mp^+[NK at 1a*=`1ce8kS0?eI'n^trlZ]kYWpWeb]iK$l@"W%4L]9f7V9
+%)(Re/4g7SR0"E9PMXBllC(=3 at TD4E^bkpMd>hGYCT:Z^/rcp+GS"tEH>aS!E18uM-A'k"e43Pn31q'VBf_H+s4'0tJ;bNklPF([f
+%%P7o:k)_`:Km8W+D-[@HVjt++0NG(JIOPhl2(Gl_TMe*knC`-c-rlC4H1o26P!dPO0G,hWeXS<nq$+'tP&u"lIC;Uag7H5(AMJ21
+%&dUq"\tX%K"RSrGR8c5M\`ZD_OeuC?R5C>TS--p$\Z81t/arlKMU at MZ3_NnFfN'@uQ*GE<LDSk4.LT%U6+fG at 0NTS-oX1u[gI<YF
+%<P`**]B't&O1KY4C9SeE%k4;aNDHb;]R]jr'Q1e&m/XT'!L]39 at A)T+jCsGTb=S&FcDK,P2#g#1Vrob`b"^qk[%t345D;dgYs9@'
+%R`U\9d+"o"[ihMuX at L].b/:-)R)-C!9Fa9 at A0q-#&mo_ at P4Q,*C8e63iGt)8jcH$>]KN:M-$<m"D_JJ&(=Le]A6\<Mabg,gGXsc/
+%c6O:gYfnMD,<rkB=FS)&YCMd$+=APu<;`u_,6p;lS.C!^6s0gCYPVjB2;=USY^bu>c"p/;IqBaY34Ij[8uTuga,HYe68$oJ;)qWc
+%krqd0N9"3$s*8o^aa6H2fha\dn=?KKSJK=M04#s^#e at .1N8hS[ced7*b)cb3KF]0&6fY;Q`gcRY=.IV=7SP.ro^5\8Oa3:#%LcQr
+%`ht?+->$F[ZJso:e:n(*Els3F(X;.DTmVES4O8puXaCb%0fR at k-%Ch6`\AlE-b+=eUO&+I45QjdXV4QECc#gm/bKgF!@ST>Kc`o:
+%KBCiNqiu87;\>gQXDUB<(,G"SbG9_tQg$)L9?LO5-qa:iD1hGehrL9"NEcUfj"72$_9/cA at k%m6)*dVV1 at c/ns4BU%0D":pD+i04
+%?)<abc)4B"8NdM^,K^"3\>0q)Aonm`R]!6X(Qaa^11ecDG#KdJ`3T%eDL5!RD_2<4Atg%5Nis.V+G6d"9^aKol$t;>o+u>Xi--G3
+%gMWGF6-#L<1hq!":>VS#A_=hsl?g]r;XJ)AaX5Kfpg`'L3prT?OJaDlepb/ahdMG^5(?cge:>iRKqt%a\d%4NEgn[lk/st-)e?O7
+%d at 40S;USRCOI7#CW+CkFQW at GL:JF<H)H0ThV]>X#q^%3$Q#bGT?V9 at p_i^ik#s??85:KRd=ZEn?OIboF_PA4=pDJV&GAc277nQ at o
+%r'8ipR7]PrRf7*QC*>r7XrN?s(`O!OZu6AV*5=<(+lMncet2`u]IC9F4NKBRC<7e%*ojsnIq!t$??SGq?KPo0a(G1#Y/XGAFl8o4
+%DRGe31jU8:YX_+grg4GXRTc^#H7*W'KuE<'lJKI%9p,6XGM[PW%N@))0iQhR8r8^@F at jPu,[i*03M-O.RZYs]2EI!oL'gJa5:)jC
+%YqrdZl:=tHDaHMiGNtWdnEpf3TC40QmV8LT@"Gp^7AVp6=/qH.L>rNG2Y];0Z4i&&4O&C38*_m9,$B;VW2GsiLYQ_*&sat^aJGEY
+%qR,BQ([G"h*]Fasgpc"Hqd[+#]6bd:BsE+7[;>iSV#BUs-/hu$Au0b',F[pG?UDUer>9-&+mD$al``0QclM&d30Cu0QD`I([iKcR
+%4XJFjYV:oHPeelSiBQBiV9G$BK4;p#$j at O_K!ec.jXMuRL*6.3JQB6jbLDmjg1&c2<3A$i\_lXk;6/St3F2sLbGm"_H<.[gNA:Yt
+%Z/J\3<-W8;UE8Rm>6>SHo5'O\'aDi(Bt#lGj*sngH?cF8'FN0Yc9l;HZ`o$ZYZJ9S(Jf%WJT:(&/,2a(=%a\l5u[3Y,W&9`ooH!W
+%R`EK&s#M4eVH75(25P;C76+^4MnVBST.`JrSkC5<%m5u;:=&MckU**:d[J4EQP0L3[B/*Z4K+i\&e[%f((V'7!bjLdH-&tgs5lZ0
+%@XB[LkG90f^952XhT\qn75)fW,Ig8SHqV3//-aDeLg9Kbc5/'<m-g.UCn<CJX4i'k6$Wt.=%P"=3,TXonEn?VGpa=WD_f*Va:_K,
+%cT5Jm?`D6q-,M^)!):s<Re<n_W,dCY>fi"h97 at 2IONi4?K7KKJ-GCfo^,E$6)h9g7SVYG*_]$QFFdHZ?#"P;GDo)cY2NSt%hbZ at H
+%Uh]!SH?-PSbRi%mQ520:K at u*&k=VVKmO>Ks2Z#2!C>j6pm8IfbM670"k8s-Oj`C+!7piCb2GuUBl_odl+1RYZZ6h6d%BT@?F!'oc
+%a-.7u_/6ArOLV/](!Y?5f]8:@erFK%8RZ![BGl#/XRbC<90Tl[S9dA@]GYJOq#RQGnG]'Cg>G5R<-^`-?M$+,^3ck.h3$_\)HKPk
+%<^8\nh0`T/$Z@&Od@[V:g=1?DiP_sl]Rs&%J%+2o(\XU&p?%/NKUSL3a$+[Hp at W!N1`]kEP&<RIZI$eW%gB&/HW7<4M+9DZ"%oMR
+%-3<35]b;JkKG_8q6go9E0B>NbW:nm6*_AYIUuqU at j:X5om%HJ\9QI()?D\J9a1h+Ehd(Z<ju[:<&pK*.o4d)iK?Y<B.VA_Q-%.%-
+%pZIr.^cuiN,p?j-=>:ef@#<BEM/]&YX_2cdC=LuN6'0P5Lfs1-`KHo@,iJWm$`WOrQcDK1]="Uk;E#l,k3QF/Q]a;t4QR["`2-]1
+%b[E25\"db^Qj[p$Guj`?ee3/,HTR;EDp<Ra]1S?+**,T3Ic=Dnon8N6]_a:^0-H?4fRiTS'*oPn.$U%(cI=S>kjq at JL>C[HL4V>'
+%IE\"I2c*%./Q6@?\WNdqnm at J.Xb>JG!j at .pogo:7o6,:Yo_#pr)IK%o-(dMp*4-^.Al^JFdEt9Qq)9<>PC]lZB(FKN!@"Y&'"NDO
+%R*5na2u3G5"GR\=lJ_!Z:,T?&6#^5l3U%RII`tKgPf_+Vk*\OU4"Con%TRQV<Lc#,m<+Ft$rMN!!,b*`H"[>CMG"N6a#&E at p;qBf
+%P8u3=dAhOEpcl[1iS;s9/.4pF!(s=\(@[M4PVe at JGqK,J\`=-flfp\N)q+qop'f\qrJs12TLGf1fQ2rGKS!/UU^;+5\2ugrKer\]
+%blr!K_>YuUV_4.OW'Y!lA+?\i^:MLR8-WQfmj_2;I6#?$&^RNGYLs"t\_k7UMTgLQ8T#+4j#.I^%^G0ljsJG</K6AXo6s1N>L)^_
+%"P&VjOK*,cm[aQ5TV-YCB@(7b]TtTFk@#YUCjPX6"!f'1VYTGV"Nl at h%/?,;7GI'4STHB:^AfrIK.,8kW##?`HVAbUUFToL/NAk@
+%Hk<er>bK+uho%C<Q5^ttV8uE*Nu-"PApLr]k%4RQdnIrRP.ajcVgOEX?',`2eO=o4AP0asdr^7F;SLLS6'IX\VVqf'kS+_i+7e`#
+%-RI8>OILIac3NA&R]eE)cL\(5i6coq_V,4$0MkJ/btF-VF$k.ELWL_Y-92)C9aJu6i&`92dn[H;DcnbWaaH9DM)Vn$+$=6d@%CEo
+%9n7](!#95:3\c&.o)>e$3GIgH[?Y&V;s,qb\U7)-F>92[]p!tj),+k*l)'9[P#?<H(76SgSmC6pP6E4G`]$Sl4RqLNC&4G$HZSsU
+%'lbrj\u)WH/l4_lc284f>3M\`s8SstB"(1#31XkC8&%dTb;mS5Z>f$!jWYd7&<\jH(7\pG1l+f[,OCMq/sWN9 at P(T"YB'[WCgNN;
+%r:UhFRcPBLFoAYhcJ]5$RfjWscdZs!.ei2qFl)qnS>r`kR*L0/-7VUqrQqD"meI+2C%ebC*d&12I.iI>,bMhE at n`TR!cmmi#ktQM
+%\?>9<<g8DGlq_S"Nc6;17b3/Rm1CbY6 at FEk\]>[,/7MND-.W6-gfL,;?RJ^IFtL6u`aWI7kjQYT,eMoMXYf-gmsNj0L&Edk^4j2k
+%2]Ko\BHI]I>j+%X*j/(SZ)D(D9.'NP3\'n-f1P*Oq3tg3SZc7q2oB9F,%'Z,4mP&'UeN]2)`u+(Ru,U[9Ygs[:LYkGQg+tTphkG(
+%jq,Hl0.j2o4?bCreLsJC&'2`6:Bc#AVEI_Xb7E]prc/5=k$Amr.?DT'N(4q?NEQ9DH,'6%3B^W at 5HXOifCA((@Ja3Z77c2:n-R/I
+%:S.0*Be>EhYg[e.3]$:@64bCXNLUN9VVad;V\eNsI6g[tdSn3L\W`&KmM.jV;N\lm9bfWR.pjjSS02Z$7*9DuaP4f`,Lrqs8QM7\
+%fn'T05UJ[R^qam4&rB'`7jgQ$K;!N]j!*!e(dO_VFK>6es4KIMh"\Zu at MJWV,^E)1d&mitXMOc3h&ciPH%;m#P%QcTg4QpLV]V.!
+%@_di5`uoeR#;p>oM<rl?N3QU>fK="$je at D>/d<iC2 at 8'i3%N(4,o<QM?(b8XKRP#LmTJM,+NM`+)XQ=MJpBk"B9gAY0R)a?CRH_u
+%k"HQe"Is*;+#.PfY0X at s$G=jm57Ua]h55Noff1qY>1[:XN(&J*8`(cC<+jN#2eaKOY+a4dG!!-DR<!u0:4fKb.R92F2/Z.YS-'Lj
+%R4Q,9rcT1l)P.onps\5i+m*,_2AoX at mXJSl0'4t5D9FA0$ThW%(<-#5W8n$9`hWep=T=c^''@Iq&$Sk"C[rB'A,3\.[0<OR2JWap
+%r@#$Gb)^jm5GpC$D6SI(Xm*cdZWQ6Z@,jFE>MXDNib^&kWM+'B0R8j_r/CQQjkcfjS.//G]eHp-s4*p869G3=-!ALe)2<,C3NY4m
+%=R5"Re^EdMl;s^-D;+l$X5tAajAOQE/jo\lR3!Q#^0Qan.a>BSj?&POM[%4E6\],("(L,?:PrNbYHjoofNV[SY('9?(-nN#E-%j(
+%REN`*b<@0A-DV*6AiWXTXAc-p%+j[aUVYD5gUb1"bb9R)+L^O4B8W\/?#D^:AN*/o;>KXZEO+#&BB&ajZ3=886 at ."NS\#'e-g<j<
+%$)+bkV`?/iQh]4=a?(dUjpa&"^ITjgo3\kC[FkVZmo9=-gIek:81'D4[f#d3RB2j^1\:I.I'7JBX<j3SpsEXm7/'GK&G.!h&#&FW
+%f1[9cge,'"FY2Ap$&0d<"ecpG6-#7:pmK?f';$T.&u6&\Gk`*h6C@$r.?X1(Y`"Nh]0ld+A5BE=NYrl4K_i\bb&jNIq%>9O/r2O0
+%S%Kab'&WT"]:!l[3me!9kSt&7g!!YuKP9=Im7_Ab=?e-m$'`\A9Y)._DkS(W3DT%lep]VkQ*@OP.uXKu8(]k>/Xr&tF081>0kZCk
+%1'1\\T5eIn!4TQ<3tiDPB''ds;R_]pgq$>RbtGlq:UOut?Kk4$O7lB+F2Qd=3J.GZ<c\Rpn=Y>TqJ4_a:@_-4cCjpRF+hSdU23$,
+%D!PEa=j(UN_A[+q<MS6&c:@:T8[N\U\gd3nePA6>!@r?0*_n/,Xu!FLTsRc)4%f25#n3BS\`04<oHH=OPY&sQ.&5ZFgSR7`AnI2Y
+%?d[Y-U*@U23?\-2Z_\D,YcpOG`'(\_)'0;%]&8hWf at gG08C)r6`@i*]Ks#@n,Xu-96/[ZtIsPJ1GAK0Z>MJe"Q at o]Y;!m$:N-n:3
+%3a7L;!@)UMcEUQ@;_Lf26%-475C[P7eX#r<Ss!L)&9fAmQ\_(th%c5H9k<BYP#prHV!g)WA)6?Q:47]R_[Nbg1D]%KgI.MVr#d[)
+%OsYqq0Uj!LCIk/!:a^#&HS4?td]7jsj;4"@%fsKt5O1,\WIrFdfVeZ!1rEUrKI=K?08]8X4+KX4-qFZ(-/W&kdUc'Rc=+4so[3Bt
+%`t+0)((@P1qkSsA at N]:eJO>Q_'*agT6)UOY*K2n%@#5m1ZLe>Clc/CZasIr'??fdRc^:c[_'C!1\?O at .[hF,l>[B>o8`OXD?)cWC
+%7_R;R;`5`ebTdFApjH_m\#mK&kd\I4N'\/NQuQMjI[\VpqY.^aSO?6\CC4E.QM6p+"t\k;jOt$V\i>;`k<E796DDZ=19'BW1[THU
+%g at 7&Y!ubW&[&4P8\\X[/#KbLAcNcgLOI:Uf;0;UU1tmJmQ3*0O&_:Lp6gM`H1)fVDAdZ$4:6=m-&u>,I/+W#Cfm,OFOF-US0*?_s
+%SUu7>K!-nA[(-;DI[4 at 38]jKbF/(hiQGD&\bPdeDEs]&W7YW_rXo\&=$<PuT>h=HqmQapPk7OJq5b1fsKlXk8c?q.c-2Bo1r)>!8
+%$BZor"H:_?3SA/DPiEa+Re?J!O+k)KJNe,?T.a9(Sl2d_*WT32M[nKiJcs0KYi=C-<-G9na"1JYS?\^D24lMo+2'@CZWG<fW&!"b
+%%>i,pqPFiP>Ee%:WaAJFoLX^E3]f"f;.f=IGeUWT"p=&:StFZ9eW=/-Uc/0R5]J2F/l#.m"08gkgPMcg-,?AM`E.==g=?(+NWk3\
+%NTOgIj=[l+jLj0!A=KO>F:SO&3mu.13H-EIfebPABeIX=]*7%*9)7p)#3p;-X$h-G+OjA at 48I6V^%\$t%n%?YJLB\,QtT2Be:h(R
+%GJQ&%H->M\"2D:7pi!PT[3e3$a7OcNlV.4^Iu01a]+hFK/^ucSZ!9UXm^hMrPUf>NEiD:6;1a-6kJRFqjbd_>)hf<0$k/'X+XW]Q
+%.<o",04o&I?c7+]*^%3EmAg!G(/"`<iJBFaPiKqI"bX;'EXO>OJGn#r]TJHp;HPU",%j^16_Wn?a`Zn#?j at 09g+C-prV;Z:Yb$&-
+%ZHJ1(jt965$?!Xb+"L#sV9J5GJ64-]f=>#=XoI"Ea:.rLAfR"1^j*/R19WGORs"0+GPWWL[upVqD*nPdjUR:n+^Ru-hfo%mgo6qk
+%rMA+Ph*qIr/eA3q_:A`KEY"JLmn"NEhG4:u\2Z2-[dJ4)#EhaYn@@^C0DFKhTHs0qGo5W'?0+jCWop at SWb>QK)]Js0C-T*0RDaIA
+%^>O>9d8&AnJN!)@(7K7g=^Fu<2c\_VVrO1IF\29i-?4Qc9UTK1+&h&SKhK1E9,!gbb!^Sm#=_l1^!,5)-?>38CZgfDU7_7k7nZ*?
+%@U8a;@b;t!gs_:N&j;ASeW,3:6MI&L<FR<T^1sbt?dsJkgi4<p5>EIfhk_rq$ME!KWe>^^anr((>O%1<gboa?hRC+8J$2X'faRgj
+%g[1J;Rb9\D05%9h4&9^Wktl=PWQ/i(dS+1sYb$Otpo2m7=?H?L!8:Bh<9+J3'Q^&!MOZBk_c*8dI'MoMV=rYbU2uNS+V7i;"im%$
+%HcemN]<,`T8e?RBSM%MO4DCmCYPFBTWi"#):0CRLZUmf/?gfWqY:Vs?mjX5\Z8`QhLfu,=U^DLQ>_JA=_8'ru23A9t*X2:jJ[Usn
+%.0)]8#nT\+FURE-FkNXo,6=Q=6C[M(\DLqqO=YA=/T8H\0'PE1R5o)4F20AeXiigLn:L1d=\l&W"I at 1](+TBK4KjuF2#YaKJUpqc
+%*9\g^Cs,p=pB1VN`)A]>bFK\&E>h)*!;r0_S/NPQqo"@%E4tjE;DF=ZRJOA@\7S5ja(@u<GGo5\NmF4FHrko0e,QFkAn9"Z.6:?g
+%FdkNcX9k4A;\(Hfo&b*J5ML<tg?gI9gK\5*quBdo)7b\/C:I#&1k"7i[[^9_5T.5TjQg9G<d%cZ)LTX\--mn3Fi-XBZ("6Oj6A>p
+%/V,6Y4c]tlYU*9>5Ufe7q69Q];omj354D=HA54a,)LDN$g_1689KkFe?25WaKn8QK?b>J_YOl"M7X5tiq=BosTAZe(BLCC0l,(?N
+%1p=Pc^$p#?_9KqG]9C.CI/2.uj2sk1mbYF`F._)qNkraZH-cc86B<r'VZic"C:LN&d<oj<ROn1fh/;l7gM15-8bcV4REOZfjYS8Y
+%>RHe_rc.V8-:3IX-3^q^,oKNVn9Yd7_B]/to:CRHNl1YpqjmHsn9%R6;h$(FnRokj^f)B*A35[N;dHo)GK-Y8^d_4(J3r+-67(Q9
+%lj&0_0j\35TDT&Q:EW4/+b9mN4BPmG-FY#kWLZ'hQ[t at n, at 0p3'4>4g5:BXT7VI\2'5*ksCjS^1DM`)gaUs]ZL9pUQcB5HG0`ecL
+%qQ`dirBd`*B<aJ*$-\#hQIiXD(d8_Q#D>D#McJkH+>Q+)P'847+Hdu,0Qg:=".(=48.<Ye%fT24s11A5^tDIiei%VfrgN/B^mFmW
+%^Vm.R(*2_jlQ\bCb?RusO-*,T-NpTL)#(:ANGX[rJn<4U?4<SqWeNld9>+O"*>0em!N!f4o^U+qIV,(fp&rbq'<j at 9X!LN<iZ]S#
+%RR?8YaoZj:9>r"1K=`0QY,f76<9s)f;:3E"j@\p!pXYp3>==,edm-&(FjF^SMLYV#/Zoe88Pb,&dZV?WHAd>:H6#j`:U]dKA/!f.
+%7J#jAT>B)M#q;9+kE:6aJ;l`eR5Crj&[Ip:=R[\fa'6NA9/%`A\c3EH_M&CYm8"TJ-RT-[79Iq]*P+q%S>W"q-N,'$>:32t:Apor
+%(;OS!XA at 4K=G93:=MIYLm9lt.UlM\qpjQZ\lt]<BeEtF`:#*9$,"+>5#b2Bj=O_A8m-Osj/LW`JBp`ub6sRe8H%qPaVT"gF6G\]k
+%\%@#!W-pXVVH2cB)6D_/'YZ(`L)N<N]Arj0YGoWDW?Q"AoA^.'%Tk_cI^sp!hpdT-!9K\V3O@%ABpEOFYTKfcQYAoE!VD\ho'=cf
+%i-M:ooZ@=`YbcdRKD=6EP_up>MB250lhE)h%K*O at c3ktH_Tg4AO)2YGcT,\LB$QMN0i>TDV(QG%qnm4n11F5oZRt91DbAZT[5pT)
+%l0WJf;T`k$WI>i7n$i&0d"&37o."LQjC_r/c;-fFg4go]3cQ;Do;)XNc<Zu2.mgRlTf\AJ7P)Ioh0Et.1#af1+d#C(r;7,j/]6A(
+%\8qX09#8,Hm'sH!Bfm^Z at Pi#uH$PRP=d'2+-t;hH*(f?ePeNbn("uIK3LsNm`fuhDf"eLsg!dB9li^Zo;,<$;ck&18,kBPo68ZB3
+%C0`7.J%YKPDNg4AH3:Lq8+r[=gPVCGZN/EC)"Kger50RLIK&B0<n^d#$/;Yn.et^:Jp@:21>Qga@#eN=,ZpsT)>_oc!#%Q"-,(M0
+%j;%Z=-eZYSjO892p"49[3^:aiOMr`_55PN0XLA:%DY)/u#_mOOX.(K1i+!!PAb^:&l]d+q23Z[AO8/b3e(QCopHY7\O:!_`k_j1R
+%>b/qU<UQBSST!g[e#<r?0!dP9'T`WL<sbN_jSoZJYKY6*-#^IjO6Ig,+pb+VBZXt73+4Tp[H`Z.)YbjN,Zu]%)f8S#aRQ(8(%<(_
+%I&Y3-F3Yd7p<U-^Al#r<(:Pp35"Uh-ZgGFj`DDXm!1=q at .AcBAMO*/)9eH7<ccU3Y?YFeYEhtV\N4in18=K9B. at 2[R6570ib[(VR
+%YUg.,fQkC]#FW]kL8qknV"5r0R"t1@`T?H>b9jOMg2kJ/*IRKR;dP["C3n>mr1%<-AeBlO?tusuKH)7@)TrN^$lc\<-0\p=J+Wki
+%\2P">TWC*O+d3>(^I:fi_am=5H8pj/p@;eiI1Jg9>_':WOnV@[eIM1<AUlc7QGcOKkI]ufYlYk(pQ_*gH,?a=4h"ce*oYWt\\LJ,
+%ALF0\4:b3j#D8TTPH4(m*EHoV\V,^8\#sUaJ]R.?V3$Fpk8*S__L*jmW$S.V3f4M+Q at Bi&fE+Lo-7)tENP[j[eH(>&>DHMIjLj6J
+%:Ei!c7?s3?<YiIA+M*[+QJa*s3gi$!;lMISO>\EM21_$_m%%HQ at d>ai_*sopSB;8KaUHTL/`bD;j"aop(8%GU%O>Fcq at n1bGLJ?7
+%[??+:C]ZbDmEW,AU(T4qamfZ3:)HS8D!a<@8`N^DTEh4p!uK4H`.6 at aH7asgK@]hh0Mf)Wa;nDbiYLP2Nf'.C.T96[^4&Pb&,3]"
+%iMoZ-U#YlAnS&X*Q(m`]0p!bFIg.7\@oWFh3I,hS87dQNh4MU3OuK!dn3)UG$0YG2F'DtW,B,!->u0S8C/=9?WD9=C&+``kUN%XG
+%,'97GkE=i_jr7VWW[b%A6#%q%rrLIaas?Uq3\]=-qC<+%nRl?5qN58pkNp9K+&rV3VWrM1Q at EW%XZof_[3QDbC=%u]L'G%a8*?Sg
+%`e]27ffRK3d7e<%kC2:#'O)SIJ%>Nc/uZZ%oJnF+6_4]O-m5J=nn95d=LO^J%3<*Wb_J^k]ul[UB:f!GTMEk^r at eHIrUDVp1RC4u
+%Pa$EdL";I5bS6rKLX$i3,la\dHK?$u21G!hHk,)\lVJWALsUOt'AH)]r"_p[DpI].FjX+kSbtVA?RZ52?:i66h at HY<KNnCAcKtGU
+%;j+Jg=3C)"Yl>_+L_!kV)HXkCqU3XK]9kXXBGTBaM)%:6bVS"r1f-0J&!C-%i`0WtPM_I at PFpAgQGBpEFF;a$Gh)[J4Jk$bIO'r_
+%p0G>-)*Um68o@?A,0>tJ4a!3]c6$[h^c2pI1&$-M!j;U5 at -^:ODOSR];r^_NY>)EW'[?H!BI-V8DN.D+Li01l`85;B?TFHL>gTro
+%_B41hW4m-[W`RApH)Z-BnuQ,p$de#eL!.Iq4#-2Lg!a;@c0IKV;"cMb8nR6$r(N-9":l\-mRSS2[>tLMNg!kBiKIL`gq*c3-$I&j
+%80,AdkE9L5E8$VQ9QQ at MDu[s9^6+k[,m7CWQJhZd@\Q25C;5PIE1uhD+ at kQr1P<fUD%eJlo:k\)DHT\/#n7XRI']f\9!\pA871IW
+%I;LY)ff[3VG)Ci6)=jVVSC`taJteFZ%,^E9i6TCnk:sNib89qc!L\$6_4$is2rouf-&itfg&oE[!k3)g?*BK-a\BT;O.&(kq*<i)
+%2K!k,Dt:&>b\$7u\m!tLqY$`\^mlP$diq76;*Sc1 at fRe2-5$Gc;^6PiBfJ1%=rGBNRa5%Eo#hh\U7;@aK0`'s1`K)Z>q-i2`4:j+
+%:EU6T,4aYOBbb@@Rd)pE2^3W^1@]o`8_FKpUXrgk9f5951a+jIP7pe)e69os#0nMiVs)e9F"WP<G^Gi.e(c=p"PaX=j.CLN68nTj
+%T/;W"gN7A5LAq_#Y6<E=+h$5hp"%U>%X at dNG'Z%06oHZp."#mqW%AA>NTA=#O!N-<ao)]74YW*t5ZXPQ=m8sJT)>mVpK2+DS0:Zm
+%3+/pdFQI(tUDm#M#akY\c_-S;p]?>LfM52r#qtq+prO>>^8"=8K9g^b5ol6.eX\a^30]gZad:NS*53&r;6:>O!0%J?TZmd0rbYHJ
+%fcO$t5LS*&\_a:uOZERV3CS;0;]beWn$0l-i#'N*c2EmNEZ+H:krZ5Q?cGUM6.i_Bs*/,[8[JVur[0oJ&DJr$[mf2%2TmGL7e>\M
+%44:CG'/8mNg_VcR0tUV*a`bjYM1YEdNAtGmcq/o!itaC#&+"bS at cd.V'cfZQHMMP/C0$IL,+hh]p at P_2CB?CT88qD`60/DCjcjUt
+%nenVTC;b2:N_W2C7W.J&@TFf/1HtU=P?3?rK2D at B"n/"V[7<gq-NuinoLln<s4hd]2:;0BgKZB5hiIRT"bATe23;>07rEm/aB_Um
+%4q5f%[=)c\."A[TWJ8th^i$+jAJ=*gJ*%W%Y^F37/2sIoo)'RGLoHpf(ZncVhHGHCam8#LZgpl<C`c527cnPR$$l]kNTs:P0MF8)
+%ASau:m%U:jUBsX0j-8Rd:FkG6M;P:?.I%t,?b4K5E_,:,4HnSB9W=)k:gQ at M1+H6UYCY-t/^@WTS]aLS3P9OcZU'=>PW+gpS2 at r*
+%#(6L^'GOU'<&l`Nhkp%l8p7p<So1iOmLd%O at a.=RF;Fr51i.L8/sJi:NSXQ4V!+5eeKcsa5U7c"bu1G`#>ajfbdm0-S@#-Fa9PlQ
+%EZSZsJT)q,,f/mo1[U<72G?9Wr;"i83J;k'B5Y%Z_76C@"O"@*1)o6u"I,R at Y"HI+=UlopO<\VpQ]&YR<W,sFbO)f[jBFrF[hhrO
+%T<ktiK,X];rJ at iq%LOIFhH%*1$+QA'@;#1\8-B>DXCfrX]cXg8On+Lum]bSPFe.jpPW/Co at H4r$+e=MaR`hN\'d.LeW?jJ,a+;?p
+%o\2AtT%'H4]EP.6\[Ats3 at 3/=P\ET^7e0ci+EKb at QBE'K2Nm/`Vt^e8P3g3imL!:ZUWDY\aqdIiS"DECd!`56r]A5u;%q;9bEG-?
+%,rlL#<Y*'Sa'S-]=4F!EF-K0m*a at p7ost]NZ\+?pV`/ITpc'3V1SST$Bn"O/n!IS:fHS*:OSVLTSQ*<[MD4d!41,GoPbp35?s/gu
+%:cfNK:Ohqdh/b1AFj>g]f+4]#E8\+ZT6jL[3\C)*mXB?e=_C$]aINt5'%CsBqbk\Z[W_[-9Z_391jqj?fgu\@S2Tn]:#70`&?$f;
+%\#I/K)MURDCMN\c=eOEoCjIm#TB4h_`QCt&5:":+E&d6nlX]RmnY3U^g'i,58ihN?jQ?cF:C[XOl6<2Rl)_TUQE`sOI.j8ZJGha=
+%fa6^4Jfq]L9B?5<ZSq:^'UTs%q%F9gd%IsT]A-2QrW at d)h^6D8pn]*XVMIKF3Dc;p]Pn908YaD&/\*-Vn6#6>?6!)\(MF$KR$d_P
+%S''#fdqhSfZ7lj26OI;\fU[!TjD>nW#08)Q<`<h3pH:f("UZ-DeF>P.j5?!^Meu.b:%K6O,%EdS46_=NZcXMB2;&U=D;_)OjnkcA
+%h<5qAJ]UBY3Q0J>>ui.75q4qSlZF'-fIn10`/4D;;`gP9PV6!nd3i%Mmse69-\Fh*f"B8X$pBG,i=<KIl<;rtZtlA)Ini.JdbMBB
+%\^h5Go,<k*(C"!$jkbPSGe_u!0 at Q-(&1qgh.>&E-;l8#<=UB'P^Qb]@70;M@$fnl6\b/&UZ0Ko(,D)pI>6XAt`R6of^OL5[d2bsX
+%Y1-L/9RW=HaX9N?;1>J\Dl^gI\5gi1C3XsPKTJ<dr)A^6Hug].*BB5upA^^7W#e(QEau;c\PL<YKN1naSObU`GD at cn>d at MHWld5_
+%bh,Tk90q1bZRsdu\s4kNW$JVnLVDJ$#Dh4L.K\0l%-VdDc&"b.S_=>dY.&SuBu<J%cC7\P at 4Fqk`1pYmP!%8TS3//'hLkX*mC9R]
+%8`u./AWgoQ3Snu05BEe2=qe`pdfL9]^B6C=WNfi7#XRUO"QMWj`/*C8"qp'J55Xb)+Qu\.7N'\bHG7J_kreF>V'\cBXd@%KP1CsD
+%c"".sg0Duk=q"i'f at mN+RG'alX9\CSQ at e^H546 at Jh=nS/:+]pX0I1^<\T(q/&k>R'O#9ZA[N5b65m6M9qC#u4Qg;\$l*f/;6li^/
+%MAM*^MZ`ciT_6EVEb3 at 4ck9&\b!SBPEFbO!I(Eh`jU%@No<gL2NVeo\XW%T+<i##Nd<\r1T-WH]Vk)JpQ7D:VLE=]QCcj:!n#C7V
+%NCq`4*5("M3XN/6g_!>doKp>&HJofHRI/Ac_j\dO+q:2s%"&Akj!*=Tp=Z+RC!5l[!p$HWF7##ndQg2ED[EEs#&S8Xj'!h,"NCY+
+%:m/5_QG8^bHf:285^-sdkM=f$nH;YH\tmsa^/(d#PI at .+Rm&!V8M$ZqkOf"]P8IK$L5o]&@I[ib^.f3W<4=(?fs$iqHV!hjhTc9_
+%`9nnsh#]%]Qp#_j9^BGsEm+UCaVs[!X*GJ(anYpAIq:)pp9HPI8\YE%fK1AKpDH=R3$k5`,8JjsFM=7'PAP/A&RHY+)hMT3;5.<I
+%5sC4C3u-).b,8NKf'I<<BT+!WGpg/cS`B at .mn?)cV`;)jEEi"a/logcX:e7=FmW"C/q246Vmi$`19])7[)^l'(LijZ5==7uiq(7q
+%,iYE$S&h+orhIB9:rU0YY=Xa=2S1C*XBMsjpTWf?rACGQ)I'P\.O"nSjJ8n^d,c,JVnS=;HLNr2e)Zc^hh'O:VAC6/:&8o#F#du(
+%Z.X_(!n'$ecRI=ak(84hb*j#$4=]I*^roInTA0QtLc8o*P&n_DJB_N_5'5m,Br(1>@`"Xlk5d9,-Wt:4cE=3&jZ:WeK%'IP,U$TN
+%5ZhcU'H$FOVOGm)4g=C'rq&ZY5MrOU/`eO]"oguee!GMDH>VhWEBRCg at hq:l=/6:?XrB77<L\&XNEdni(I%.#(Qo3AJ/fT=B at eTO
+%mBUScgOY'\R6*9cs"%R[UT+"TPEB?LG9LpmC92J)3DnQEaUXfr2O%<W/8Sim8VW13D,gAGo?bTIii^0#VBClSDr5mD>k<S4QKb7G
+%&>khZ>kWK++aBG?Zp>\Dh"ps("0J%B9?KG`l"GA6Q5Qj9IuhQlo)-[X9q]<B?3;koq at J_PV:i(Vr`BDN?^4:;aeR(ZX1<XOi_'hV
+%cpXi^:=tS%=YoA]kR<pi;=[D-;U%4X>Jb\Jplq_YVa=9Gn`2#W'4Ah<l:T,HA3be?Br]j9/&%[ug6I#tet5Qe'FqEg+P*l]f1lfJ
+%N3t59ICe%>ro-C>opSpg-QV1cVeip^jj[AO>ii5[30f:P$8*EU[[c>OCX)QK at XbP!,-N[kB.fk(oTO&N#KCL1lsq<'PL0UYRsh<_
+%f]c/\f[M^V'rdm6D_aRHgV9g?mQ?jbUug9pgqR#qQf2-d1[^em85PX5#+(giY1SfmF68\&41VW4SjCVP at 0(';I at Du9s#NZ0];agB
+%WA$[^&iL&'"3HIHfXc++&KsuTB,U-CgdRL?f1&Jb:eSZr0ZYAI1WE5,5=[ZAnZ at s"EGf>29"r7'9L\$_6%>)@fC^tXW7Va\ebX=6
+%SB:$j8kre9E)':DDX+Yq$L5Q_0PmLDX,3E)Ik_$9o_EY*=`MO%;On"r>15XKg^dt.h.Vg8aob(@.U&!ji9I1"G*bWN%?Eq:05'4;
+%:];'Ei1Z`^dm['Z%LVILp,pk+6kXll[(0iB\LZF[O&%R4hatTaW/%cECZeJrpeO,R0rM>/AWcIWWLm+QS%12YVS]\klV9REd[*!n
+%!`7BLO"$EZ(`ZM>JihLLIa=pCWc0EAO7'+,]H- at R-RIjWp62#'gZCNLfjEm=0gSI at 8:b;=cb]*I]s3)q-SG2DM9F!d.bA?)I>eL(
+%MOC^=/2&7P3\,4Kel1r'#lnXNfX`T>Tn!0lL+?&Nod+DkkW'YeoX/<2-qGP3p9F53OX_5X3Tm[s);7#GNiu$tFaEa10t\i4cCR`J
+%$?o-uqu4%p>Ok#EmDG-,+ct$1[s&1-]*796\F8C"\)dK"6QPR1$f5s'>N(9VO<G^7IbM\f8ZJW:Pc%QFEL5`YZE'jq2k<['mF4nc
+%A1u1?-J?k:?9mF</hhG+`mlMp2ISRbIJTNQNog\E#4A\`].U&m9mMQs>rc2A>KhFX6:K"sb#_>+f^HaG'"gYOHJefXHAF"q7aLV+
+%g,!!bOt1dLi!2qsgH/ssNEF`Q)*$K*EqQ%!Ol)d"mQ[P-TXFL<Ti+d'lE)@(L^_==(F:M'QET;o8hB?3OqQk60h>4(?gj1.YpUOa
+%3JQ5$Q,\1_cGoDFR''&l3)?\QTj43(KY"#/9hP:S<85)';^Zq/jF$M2a<(PufU04[7To,p5W7u>;t==eiIV9/k6B]J=]VX+om"_u
+%(6k]Te3h5[",/qaYi9.J at iHd3R*9hPE@"Ij]*f&q\E$#:/?-XN0#!15m%[>ejL],>k`2Me5)-85I%RXcV^oOcYOpE#8g-JpX)h]\
+%JO)uY1B3-Z+#$>UR=,;Y5_ at S-lSk_^b8'nR&tDP7I%:#A[U+OiEiqTM3CW'`Z($OL&!ha109H2La#^LF7A@`bEL,.X1.tCm!3%lu
+%[GQVKjto9bQEd]H]l-WX7frq+l?Q/'-4WU%2Wubb[]l;?PtoSAJ75RO)sM)8mj at NA3:gsP5j:5jH_EUqP<c"h[HC%8p/^ACaCR"b
+%Jo7\ADi`c1 at i^&6OlH0m_'E^o-6)PB]bA\+0(!%/OKY8m)a"5fi!ur3AVJB*l='qt-P*;H"G8GmJ`AP<$A7oU5,^InEY0baB;:?K
+%#[DE9V&KbGD0o>g+cK,nV&!:^Qu(uk.!9g0.oIOZ<q9iVE^2nT"BNeUX^^Ul?^X9qO3`)jaCb>lfMEG!mR[`6%4CWCkhN>&Z4\Gc
+%Z*=sF,:/XQJ-Ej]%<a?4kPHJ^$]]#o-h(CWXTEP,SFe>2kU,;W1 at .RR8$?6_*O`FrZ(4?..?9">P4S6E8H0L](]?s!Z$@+_?2N+r
+%&*oH/Ii<^)ceieZlH>T3cB6D92M:CQ]T+L\W7K_GfU^/0L_hT<c,JD^,b^IQ[VWMq?lfLgi,&p3j&cpJ>>kcHrg4!TYM"4iT'R7m
+%T_jm6PF'HIr;3n[N$DmWZ;-S/\Y\N!AUC$7 at GG!rfluEIr%'PKTZ9HPiO#1na_fN1nWG9?QXaY=+<0mEkproE^64cUVp45kZpBfE
+%i`l6/Ht9 at kV;2OL"RT5=Y),<pl/+Fd2faoPELer<pO'*=`,BC1C.<CNG"J2t4uqi\f1EClpI^)A\P>kTHu2Sf6!(_c,3"^_nr[qo
+%pHko:kKA&)R6hDXM&K7'a`s>drd[V57!9n"]%%no-^G at FX3'92)qc&epR*b7.)1oG^*o+@)pLei>eBROo4kD_,^er/dC9lP'-'pf
+%H>#,+?"'8X&epM\P!&7/^\d].XE>R5l85+)k%nCBF&OpWG,)Nu$oZZ.;n]l(=Qh\$c+lkB3(7cD2u#F6X*-lXN(;('e%NEsIU91=
+%0-SP%gTrYF:<)+N6rk*S5UDaHaS`6Z?>UolI7iM''Mi\lV<GH_M2I8;!Y0:SGK?'AF@,4]KjpgLB[8Mb+3XPUbBcBH8A5dJ_=hO4
+%bb*Nq;L8Jl-U$olW9Ia'kW,:&PR"[XXZPf=Y]Kq:WnaShp_o(^0&L`'q^M%<@Jl]C5_85r at iUPEFq[0a>;5]D?l+@%A!Y?LIqOc7
+%/?0KHM\DMrFikXLj*i at G*%;McnnTB-V#LL9lQeCOm]Xjr`YSLAe34gU*$8,I&Qd*uGSGMn<(Y4Ik:)$geqqLOgN`=F[8U.iI4;Ms
+%J at 6`iI#NG/>.^`SrP$F-^Xtnt5g?a4hqIO,72qn@=jG^(mtVEA;'l"F:0!1)>rIi@"$'f at ooc^I2KqGKoGG\J?hSj:+7`/bPnWG%
+%]i*A8CfZO)WV$b at Eqr@ZBW3A)9OC`!ESI/]Fj<Q*$,.>X&mf1`X](XOYg\f3nT`aV/L5s.?Cf[8<oE@,(OO_tL2ps.U(LblF5H%r
+%)9ThWbI?jno'- at P>*/8h47_0ESp]l"gDHfSl(%]U9-nqWT8lO/VcPJunMSQd*-fY`r=Cg]m-W5l,Mr++;uU"7=0_[Lc?I^hH-fn/
+%IadgZc$'T^\YQ;P2tB7k5V#%aG%,p/r*da-4/6dORV)tdf%*_C.5(PfS<ME21koZ&>GY*kB9AV3:!Ff;ITj>fDp\PYW6S8:EftZQ
+%VSRjXZVl2q8+n1q7,)1G(oM]92Ck]U`\;N(jdklh/M)SWU,e<rHr%X0HE,7Oq-3.;U-!/SAISnh$^^/MTX-$7SEDmo?YnM3in#bZ
+%V/sj?8F0W?0p-<F!fe^+XA5=?.Y3n>FkA at 6IXM:RO3&5$#nnr%#V#FF95lF3HMA928[L%ND?96PdXd5Uf#:ZS1\@L<*+;21p%RJA
+%B_!g:$-ram at q-ZO,fFX70_9IK+[>)lpCULu%oIL5mJGrPULa(H0I19j'W??)X at 1r"rlsK!4KohbG/?jO0Yr)";l_h,dp-`Q=b.Y"
+%p!8VXI*u,l[)umA3s at ++=;']6e<r/IQNT<+JlB?[+p)pY]B2.$[j!Xk$dY<tT`*GLCCk,tTsPaE\,<*3(@HNTnclT+BaM(A7[AJ%
+%Co9n&W"mO!/;S-l[7cq)2b@(uV,!hLe=Y;:!I,MUc!Iru)]Z-rE?n$hKL_gmdHF&Tg4kmAK2=q3ZP1QRP"t>>:S"1Fn0*9Tlq1R7
+%jOcn*50kAGdLqata<\!:Vedr.$`Gn;<];:*2]3tlTJ:O_<*M=#%:i at 7BQs:6m;=r2\RC%jMtf:&Kl`Q9lRm'kJmB"9,0e3*1uuCa
+%ftQN'f$]rOq)gX=<;MF<;"1^-55;f:."-o5cI&'(PIJQ>kt*9`gUgb?<Zm[[Pq7B4jMh5;'UD;jNUhHNE\E?h_Z+c>43D/RJF7iL
+%$^2VB*R\k(*q0q:85(gn8M8q6ZuP1n+X]dJ#J9_ at +8hZOrUcUnCmmbl&tEU00)mKqkt4p0)YDg"8\WPN>X)^()_!dpHSWRV6;H4d
+%LIJk//qRMQ&7/^A/QD=o<0Q,fY(a<hDUk^Y&,&`5i6HK*RWkW[r'E!P=mb%HOY,/<Y?-"_UY:M/\Ss^N4M0)c^tCuoIgrnJ8FdiR
+%Y;(0OKEI"SJ=a/Cfk_SRRh_RRnDh"3(dQ3sVoi.`%26)^Z at c99Dl2+"@uOa:RU#buKUQ<Eje]6HT!m(lDId.#kLjT6=Tp_k.B!E9
+%ijHL\:4-hKH1iPG]!']dZkK\%dm]u_n%ddSZ1d_Gmj\520tt)e"5q=<;[6C=6W^T0]/.9nWQB13=UWUT>3=8;(.tl+E;2muj5E3k
+%bs*MD23)k[88)"_Wn_Gc0.)WWWUlj at lRqO(O+b9YR[T"thfTU>*;iBK[("BP+%H6%))6:4SRZA7F>hid%=bt=>gL[K;Rp/j6UfIh
+%J&]i.GPIBr/6a5Dk&9V;Q4n$d>8fMVK at N=C'cY?SPDpb9Mh_H&!0;N/:+uY/b/hOX!E4m0VGq!-qR6)OT"pc>a?8,,hD=g/eDN>b
+%Gnh>Mm*\`so#9geQJh58H[5hO2f$`be&06]\0toEO%5B[TAU[d4JiF&-\c[]$:=o at Lip>eKdC2Ch7G_e.?nXj,bit89]/m6DZ/N>
+%^p*Q"&)o70gqs&63Z+#m4que2eFIrc;X^&iQ3al'F)s`dq:=CD#58G*EkJstOgo`b6>"2/^)uAN%\au4lg#62g1a:d<9Da7M/XMA
+%MNub^?NX9/TmkX`8AUGcU;P,jFD_,m6Ya$8DP!#%Of*?f*EdR;fdp`&"/ntdZBTFEgIaO_d at 7IGJhXCZkt^A#^?5*[DEr\(C7t/H
+%JM;S"8iuFPPX<Jjo;F#/-ckM[4UC0G[q5T@^SJ4U?Y*u+8[9nS`pY!lUl)@;[.+@?mlp!$)N0''D)uk!$/5JTA?+gSp\O61Sg:#W
+%@QLZ6dV<:SU at 9B2Vg4mkY[Ns0gP06L57c#:e%1Gf`t5(]:FBE. at 253j`!T7nXhPPmZ>%f3GbR3l[0]HN67[Wmg<sW)]9iGE1W5#L
+%^1n+_aJL0W"aT8[-U0T!3oYIYgLeb199<j7$Pp5_JEBG%>hmk$R3br>InmQ,ScY7d:I73>K/L%^l9#sMRJL.BFLLoU/`plDgQN#$
+%:U72'*`DaM.<gpK1rVB#ocu+]*$`Sji?6pX?LWG\FY5q=Z+U!@Et'0s_tik6d+O1PSDf3Y`\Q/lP;;`MpGUg`Z.o2SFc]M0bqurg
+%0L9+B5ek5g5&ZrP0+(JKQ\%.df-smTAH&AlkLM8VY1'6qlaF at Gd28UK6WYiOB[_2G,h[,A^ES26PQ9pgUo:]!AVo/;/c"]#0qlj\
+%\&kV1U<'Y2lb2iq<oIg*&BH.k=tc2q:V;gUnu18H$])>!9,epfZ!gsWGQ]J,H)H-e`^e]/pGU\M-R,0Zb;1l;.p at 4JVMm&k?OiV5
+%D`R/#@dQp\H5t+81,#C9\_$@InC<0J%=Oj+f=c1;)n%WYGKP_7!_-%t/oC$jIV%:Dc8b2%5:8lh$QNY+cl^EjG@>*E<&W+7/`IcI
+%Msm=TOdaOKTOD_l-`N;O4/8h1NXQ#SS7u9BNPf8&4[_PbC1\I:#oD*(o&++567%>de>'dkZK1/2c^M)D4FCA3WMOD?FCJaM!0_*0
+%U\LsI[4NbGj,K?5q"")XbHeRa\MK"6;mWNSptJoVgYImSA,1APWbL^\7t$G,9>J82ro`(3.u[D)C2-;%0hM3OhFSH0-XI!VljPVN
+%C at LX@M0hl=<cbstg`=!;;hRN^bK74lPt.FI>UC0n]9n9 at 3X&Y*:-ipHDma=F*/4LC6VF'c6qTq`%I+CF$0`=`=m=tBB`7Y/Od4fo
+%BK39YUg0&B5Y*6[Yj@(**<#YlpBbE!,f5:!(H<Du[1PPs`A69>?5V7,M<6"BF,j87)ZiSRI7KL.a`fK+4WdtsQ&#&s!+eeCpYVS8
+%oJT@$IdJaG]fjfpk3k;`r44u_KK%;3Al]8Ej#8mN^;4$iVFdXN/?,E9RoA.gL-k&87Cn2]W'PiC&tY:Y!/W8rTe&bD>LuL&m9>cl
+%P2QIpo7FG(U*Al&c4]qO-]=6E[;M$%bo,:(CO(k%mR3HuHdQm?[9?QnVUsiif5'+<.MU-0F)F;`6&M#)E%:k:g&%!55b-:Gnt]<.
+%1--p5rBWUL&$r/aA`AfffC(Z3G%g$(>UcX&0913GDS"^`Qg&QO=SZ"SBh;..)=lr"8<T;0.oPKhD(gT8Bb2%_K%4U[+?Kl2'ZYn+
+%mFJjQ$'*loe-3p+j:.9hT#"L$ol8O33V41#L_F0QlWFhFpT>HUPJIaVMM6p$j@^&)]30OB5eV$IB6)O"9uHG_ba1lrR50>S8cn"h
+%6r7Tp<W,(q6C]t72K/P4>I<.0]8jSZrhMHXM.F.WPLb08q"ol--/tc8W[[oWXW4bh6+CQZ-6o%0>J`qMpElL;-!BfO\CWoCFHOF7
+%cBP4hX at Ecc)*m\%"he-c#NqtSoMoB+@<4G?jiR\uIIg_)>lApYHYOBGK6"4!S;987I;ZP)/!hpVUjtZ5%*dHF-[qf9^&5CoFT3up
+%-3l49,W3kAi2"$enJ*4C&PLG3hE:JS2Fh4B:0@']?u)>mX.7\Y$(hI)W"`&'VB[2A1i<2CUFGI)AcWruL.KdQ9Tl@!IGo=:H)r;i
+%09bD=)N9saMj^@i)KPSgX7X'g(1Qpu=&XjSQ6P3rMGQ&e0rps,\VeXqY5A.aboMsq_H'E-J@!AlrC`eZ:?<5<ZkM\(jmRSXO^4-k
+%ahHk]OHTcRX>`nXP"e%!Z.0dMC5Td;2(.YF"S.h%G:pp+)OIV2/mQ,b9ni7`/d at d!!fZ4EEhUh09/Ons6V#YM3TlS*p&8UD-9'sG
+%01P9f_TgBj`Io'V(cs1PS!)39F]]8\457Vfb($(S-DbCSq#M3+"5.^O[bk,&Xq8 at YHNWBje[bDL-FkapW7TOX7h-sGi7*[U**.W,
+%haYV:(u%+W^1:FW_+P0#%=BDqpppZ\6Uem?`E_#.CGSdAInO<"Aj3/Ok<CtoQPRFNLcd4$&+8lmDE/l!UPufHp$=i(In?$S6>su0
+%G;;jr_.c`cK"'oG-H5/7V#YgX,k%_e/.FFFk/gKhQ6Z@?#8Q8]Rb_A7NEH;r65[ID7R)gUJ]4e@*3^e<d:UXg3t0^T=QDK_PQsIX
+%#kGK=bV9Q=9mTeaTM at VG[(Z^Z4LrqH at NJQ&-CN0JTo1eB<1Sl\(@"dE"Il`.bRNa<Stka6*IW[Ec&rqJnjLLUJ=L2`9<uW13X^5F
+%iM4M(.g,Rr"4ajHV8(iUCS*$3Y2 at a\CWPne,hAJ*A at o9jb<h_dX!B25X#uKZVJVs::]]LrZrYg<=pAN-/`G*EKS:lVeb`L2"&5h!
+%@O>9MkNo`Tk5&e1N0gZ/iD,R]-YYW9)7)!WL[[bPUTp>aO`Yl4F5-MNm<jTn+Q6XXKDBnGa%<Zf].nl?NKF"%>g,a.b'6FP-",O_
+%E<7Z14ke6UP_iT^=>s$JS)&@jL!;$*[r#6 at qJn@B`I*71Bju22_eWe&?kjHRWL_NRjnIhGT'H9'=5J^U<808HEH=A8IM2gFiT\^n
+%kq&X.$p+t$QM[%;fZi?\bQ_<HiKi7T;S_Eip+#k%TKqLj80041Pk'dJK9l9m9bC6dih2+<\'QKU1;WZTim6.Jd at RA2?b]QSq=IUT
+%1U%u\Y[2A_-kQErNe3:45aZa@,YLP^8da0L]N,i3\X#=n@*0Du"0:KL=>BU3'a[%K_PU_3qOi>MJpHPP'?F*jjE=k/Ki=f/l=!!)
+%$-I-Nn5t;*E(NHF:X3c7oEg^k_/IVMn+l*Q1[[mj2LXNSKcbEBr.q/DI':ed.7X>m,aGjE(PcDKmN at V(1Eg&q)W#oKFet44WXR)a
+%A#99#kste!&+*XJ&ou]_2Yj>O?>N^sRXhRS&62tBT7+@(D"LF0CPSFj-DgnTdi\sOTq&d.WUDJ!1_pU9$Bo(po.h.aHrTqF>E4&%
+%SF#g$BP!h7q.Qad+D^',#8T>$DX[FLQ"!7D$Q$Rjas9!I-Ao_an<7>-n(8KKg(JnUb1['4d(7oo*n#nW52$sBD$3$sp0gF';6PUb
+%C2r"#?3tOH(Sd7m:U/tb*CR2X-/L*K/)oNYA=WQgA]c-KY3K;0P("gA>=sercB1',`-82L_IHjI^mD`$H[^?\*_,>oeeI5EfB(Qd
+%.D[*;jlobO5Yo?Q/`iMeFh5.)8H. at 6O*9"0)8 at OZ@%i^K+I.P5=Mht:lc`GE/XZ%A.1);kE_!9=.f4W_pVpV'3L&MCSI_uVF'I%a
+%_oeD<'!n">BdJkF^$K@#UN#TS@])]OOtrW89au5B\/=!cH!<<"jKW_/oOis1B<">GiT"*n at ps6N@WS&]X*u)]9DGgTQV`++enuYP
+%bU0=#V#op8'8DJ_>iP3J_A;RnW><R_H!b%Q7W*Us8*WUun))9(;Bl7d3/,<5dH']"f6OL#jJk1M2KO2=P(0j;R+[PLD83!^_83dZ
+%#1?kGFud!M6TsU10uNFT]k?DY'5G[p/U"Eu<[><DP:fsCSE.qk4\D\K#=!EUh:cle7Nj#[7-huC:T[Ro-NAFCs.2lj=D#Xp%A<Q(
+%@tL=)=G,Dt&O0Y<UQHNaH7Gmb`QaX+T2g866(9d`l^2eU?\%Hk0H\M_X\"Ut)3VF,YFXmge at 29-KNdH_,fn.=93Z\=i^N1K-KF+p
+%0Dn*s9ggbfe=2$jb<&ud[H\hic2DEIA0)kAo2R.93*2))ff[?=/58A#aPR8^\F%m`Gc/K`$)h(+ol.4oHh+n2+#4ua07)E#]nsk-
+%<!YtLoph)Be>.55;UX0A=As4HlV.DY at 7Ab#m'3d<:;Nft`ZVpiJVK1fZig+r'7[7j'YH.iATPAbK[WGhW]rA0Er-2=AL$NO/1<'K
+%jE#M,B(\o`]b!mtR2["=D*^B)3&uSi, at AS`G_ITH)6"32-l8[sPI)Sl?=\41:gL7c.6m'0A7cu0=K$H9lGl^FC#4UC at gsQ3Sfq&N
+%Sk.P>o:&A/ZLm&a<8d#c(;X_TTN+_C'Pbte1+>u>0\%,KiLuH\Wa(0=Qb7k(X8nX+.d#>PA#Yl^ErqOpDMfCfgss!50HI:bLQU[]
+%.ke'i62�Qg1%7N5h+[X.J?XM<J(ig-Zu)?AlG-CO#d&nV(('q?OE`Ca]4cBs="LWuqq4$oYj2a3-GG&duTP24D1F^Sb&i4=8?
+%8WjcrAt%IF6EQMhc$OBK)?G:kEoDd=PbV11,b[%WB!NtUDhGH@>Vo%`U9i<&0CNqd+nSnSUt>/T*g9uC=PPMbrmXE&C0?Y at Q6Vi=
+%M75p(g[Xi&cgT/s8ZadT%^Gh:$c61A$8T3-6Q=^EGp6GW!;_FG5XB;=)$id<Om;qq7=D_JSN.:nWJ)B%krMbHm at ot"[#Vp"p;$Kn
+%^(8A&m_RBi^IA;'cCK6\Q7ht?M9U[^q08;%d8c]G%>)GeX`iXL(T"#j$4S;Sd'U&c<F(gonL1I*dTU2E*"pTV)m\7cMmqd5:Sm/7
+%7AKdd>5+boD at Z]9Pf/1^E_1i[Z#6 at OZ;lpiq(d?9Nk>X`91kQ]V*5 at f]CtK6Q5ab*1f3Il%EuO+HZ&GjM>&L3,/76fI1KYjMOo3<
+%7am2uWGr3e4L@&U>3e$@d3Rk2YUlGpHbdWhX-s/M&k)-+BF_jEJ'R(E]r#juG=)XHQ=.OZY)DEmJ)l2YKG0eu;_8>[52C]:Abh/C
+%A-2C!m^WTkcLAmJS3l311$G]3$8^5P8U9<j8G5!R9!DdTe<'/LZ0QqTa):XGT=J*)DU5Qom>?P-dj:N1hCLFG`O2fcc^rb:o0?F2
+%IjK[!iPhKpdHQS'b=A6Y3.bd912p^T_+W3s_2MU8=/'pp%I9&2_/IMo$eBX(]fc$.a+3i?[/&2.kW0%(BgJ&lqlNS_3_Rt,(a1S.
+%7@:nAp8de.gGZKocIJI8G at c5=)28<6DJO2kP)T6h!1Lf:d<7A/Tt.IaNd6MGpRXI"3nRK+P&/J&1LcAc*.Mq;lkFs`\63Y2l0=mj
+%AMHDB<:5V*CR\:q@*G=fnm6.%<A=t`11IumeHXV/9]h4*>-?@2P&1$/9WPABfTm8J`GkNG\[O,B;@3QU+!:Nd-'.c9,U(htR*)j*
+%ZBRbD'iG5A\[rW:M!s,fdMlDCk?9t8hOL]II\H4br7[I&[%2e-mj+S6<?[c^fQA8$<o5q.U"=5lih%ZD[.otM1pbhBlU6qOK at fu]
+%/a!b^Bp+utf_gMFbD(lid&0hr.I00bR>YK.5:AboJ9?1mjZBBa4rjKK.RKnA/rSo#89k$Q6.m/$E?-jd<p,WMpV"LiW77!+b1!&5
+%8no;)?L6f;2o3M)#HJFdl9t&`il`D]G6&(m1\_+1*1]UZj'7:>op`nn"9SM76VkMoJn6:@)_'\$`1+VXl?WB!;M"0KD'M?_co7V(
+%guS&1=*^jDn\I]n4+H=)euh9TaqdebY7gaM3A%[U8aK at 15^Q*cUZ/\RMYDI<<0@%JHTrJDUug8.lkdQiB&YpaKC?J:Mh^2)CM[3p
+%-1X8)8#,Va4f*?0`[i3p>K;:6[XXM9XS&qrApEMtVMZT\:BCGsR6`+@^CUXdk:5Koa4`BZM#tN/+r`TS.6ng/H-<[ofQXgfG>0TO
+%`M=66!GS/U;nssihQuUX$l<^N(Ho[%lB$Xg]e&cm4<l2t3b%oI,6dCKK(A2)@TekQ1o^j=31cK8o'oF3_-m/QO44#\lDgBmMYGnJ
+%&<T$j1lN)DS=N_-<Je@\O^V_`4 at 8@dglL0WE0Z@/:pX*aE;hCe<rQOo#sOJYOMJTkK!Tj8"h=cVO'?n=K:VA!=t6HrQ\b6'TuURR
+%PUZ3`W5QpF9SLVGq/1c8mp+ZcH$$kMM*=uBa%FkCj$^Q0r2CAlRTj_$_3toR/<kL0o(%KE^YJ<EdDn#O6&h2S1T5EWRbAY:aXEu4
+%=gf<?'Z;SS9Hs[SSCG9T1GX\I4G,9X_`'uXOf2d]ZB58NWFt:i'$+n\rT@[?`otIhqgKAG:@4gO?qTgH;ijLXdIi%Pe?>!pR"T?@
+%5n^,eL5i?055 at 7od5T7@r4p3Ln&B<?FZedO(\oDfoDoJ5IF;Y8h1JM7mE[`#?X*#Bmf!W2c$Ekd5@"S+/[\eZ&0VsQ0m/iV/2P%j
+%m(I1q**[TXq7Qe-L\bIf%+o+G0?.CM]R", at C8'10jY6t!aG at oTNd/W'aWjO+YFkPlq[tt7Z\h3FBrNCXm;kg!<b5g[^9%3Xhbe^/
+%K1[(^f?7\BFfEJ&r#C!5(Z=eZ%:jYIkitF>D*"5ICY:janr;E0%`MR[9`F%JUnS`N[^qD8an.+-Bcp2O):Wa`\Ai?<(%\0ETl7=<
+%8["Ac;\2gL,oSLsAQ%`XZVp3$e<:'[Zr;NS6`YK-7LG1o;N"0sE=7T0*d<?a/=2%<ahte5[95O%aY1FrO3gA\9G.;j(?hogL`'JK
+%6`p6:4IJgf9*[/=/d!FS&<C"<$X\pbNZ((<H$+DrC2G,>4N'XWP"lAjQfqr-k!k)J"(=!]2 at -nJKZ532O'R[=;k&!6].!1^8MLfG
+%er<:Q%3q_*9a,'M"t3VC3K?!7$l_Q<Qo>;_)fbUEg./nN&jkkZqZN.3X#C"\\M:%TZ,?ki^Ft^@?a+>c3TLm>"-bER7#/CjS:\^_
+%p:1SY6Hqn;C#lj3;=CmW>Y<7 at h`P/e$Z0_PB+_!*5o->>R!91M9*<`%'_DH[E.o`_0\.\)SJ&3uWeV4b8Y//R@`W!a at E5Wd!D^nT
+%T^J1,)W52Oa=N[[:!#Fp->-DK:,3<X023Ac.i7+s>lO at N2;kKrKe$kIe!s&p>K>q5Asb]L%PW^U,3O at bU0K4D(6TGiYf^.=TI2/(
+%)5CkDP"OK7\=i3Bna_e--s%G_+P>;R!RL$@$:mT5 at g8254m-?9fVD=_b@\_>Q7^6Of-'@<_k[er#bt8\SV&e531Ek]9]HD\GrnlI
+%/IedQUUEu,,cNs"EYOD4-MQ+c1Mi;N4Rn`En&V:rB,`lM%OKrUfWHHEPnI-7)YO>\rRm5e"+&UJ3id6D(t_DS8DIt]JY\M at 79H@@
+%pj*pR*-`kXE'ZK(N$8Ap:nTLVRNJ[T[[Db;/MN\21H9 at grE63,C6?(..PdnDJt-6rqk7`'XjMdDPHEok_:Ht@$Zn/.VVZp9!"OXQ
+%9Sg,0qMPK2XI+o at iDA\tG`O/AY9caV1Aqh,g4B+&&^eXH9&d_M7>P,J0gYY:[f0j4r`N8&8-(lMKquWEMik6pIZla]BT&]J8u@@@
+%I1V\l\7$ZBB&-,eH9AI/C^)[pqF]0N`g@?WXXfQ,ZC^3*P%u@?)Xnkl`p$!2Sq)`abp'[YWKE\t3%<%75)Y=]8KC/i=jdTR7L+>g
+%]h5O$OH>qk$W7"M$[OEsj&S3L!4kM^TU?rn,OZ$V+aI\r3J!A at s$),?0u69Y3ritCi"[l;MWpLC%QF_G9S^,(%m]L>4\FFo=4nHJ
+%>KGK[MNJ\uqaD\E<d*0>Ql_6Q=WXPI*.$d_H,L.oUuMa&JLj3W]44F)+P<o"G5+<mrF at Ol9JaQ1,N)J@'tM*Ma0&7;9!_E\g_HTS
+%89mM3/33lIQmgOToZ[8ME9UFb#ogsb#Hb8V!5]Aje\\U]W`hojWG,A-6ta;Xc%4?9X-.4nJl]8dEktWH:]:@9_an_dOIDaD#'gdR
+%+7V0KnuT'SqWWkeo!X,o$!8rUnj&Ho5lO_#>'6=V0ouCa^'"&=V.XJ=@p[%;@W:0X^<9*8odOj<A0l2IA!m@?$M">U(dnSE21oZ,
+%!oKG4qoT_]MK``Y8gpu8bZ4%9>/UFrSq/hs3>L+g=OZhte2e<SNKbc;^@Iee8sVm/63$<oB#kTtlCJrIe79d)?9g#d8Re.BN^6m`
+%_2eR]ZN;odUK2$=V"7A_A"HWP.1nXcZRbt''>S?ZBniu+Gn%/#<QUfU'0+OGeim8AlNDm0ctu.UBCp>R^erq<a_h4^6O$Jdh-M$W
+%k(HG6P+7ZVP?K8HB/+(*AsO/e[_6M5/)F'_BP;"*iWAtb$A>LkTlq3cfE_>S>)H>JQ5"I"_WmhO_G#M^mb5Gn5b*!AH$*i;OjM+[
+%?LW<]QBf/aS>$HmFJ/D$WmDlZ!IBab2eFiU2oN)0I$/qnAc5I)hNKeEdCX)7^pYa@*_d:Xi)://'Bb*V9Y$fb:QDr:K>`:>^jsg;
+%U+](^jUrl&%_=XLpAL4aIcfc$lDjJ5[?(TQK7,4QL:Gc$-Nafo_?t0u=h(-n1tl"F:spNiLj7LoF9eqC]g)Y!%@ZVFZL#`m\Br4r
+%gcJYVMd+Ph>4r_<R&P)U/aDg6FSq-)OjQP7,:Ojq:4'"5.K/]]96?@%@ksgC>(]PZ8kMl5^m3Wf1UYdS0MI^E_8hcB"PV>Y.7^;$
+%T-kj"#^X$]V<1;&[t62#B"9f.M'9s/@'qC'M<tBPPR%`B"<^rJE6pq=-:nAm"fU3A+CE4TC;PaWr(q)7C]HPn"T`kJD9J+nCJ&ie
+%9#)jS[=ORRJ:"oC>T5FeA:itPo95rS;52d)Z9BPr.S'_Jl3Ha#SI)?F*9hqp0H.M at Ut;oJ4[?=S5\a%E0D-$Im%)SD4rOcH+d5A5
+%FMQQpB2S_//!$nfX[A\)ao`e'OBRIca\7k2JX/mQr$90!V?T")8c<D]!R\&%2>&fub3Ksdd-G8ZG,S`)CiV"O. at 14A>e<P4p&],n
+%<4B[o8g3Egje5%C?@W##qlK'67L9-K&WFW5.GNcaj:n[ie?DUFlc*MQ'?oq;:t(BPggqen*k?Hk1fX`/VJH[3Cg?SKgj3eH\nDFC
+%e?pP5@*MkW[Ys#5!($`4Ij=1uj-Z1pe%cPa,fY)h>BjK9.S2-sF=b61`N[KNY+,]eGR+I'ZE/)W6!TqXf$#?*[sS1Z<>)\c_O4?4
+%F+qC8o$DY%>&>V^**PcB-sQ"fQRaD0FQV:<V5,tPOpljHeM:ZH!)]7KRL78/,/<]6,nZdYOHZ[b"J4(r\<i.\));h+g13!EQNOJ<
+%4a7:/q"*jG+i5^q;9r/Y7"cPo;ANXj;$YMep0cEI&"_7u%7lgbrH5sj1*BYWq51SU-\tqLrIE)o[7cGr+Gj8LU1Krf+C.NWN)g'U
+%3FG4lH3)PH!CV4:c)$!TW!!2'A?,oXH6?@iM3HMRR7q"JZF7<LVS+&=2OQ*tl_H'$P[n]kd*0>46U&.*ES8[5EJ2pYlr+O%Eg\"!
+%aZOYc9ECB`"#-\.P&E6E'b/#'5]da^WmE.f&B%n^Z!(g at 5_?$^4%C2BB.9*[K(;CfJn1Hr7oPIhg?OO?(DnS*8_[G"NC5fF):TPk
+%5Q`uUQSpKBQ!.;I!/-^+Ftm[0JgOZ8foBn..,e"eggH[?l;@331=/l'NkbWg>t6=T at -i!c924[K:b<$6KFS("1$NKp`Fc+kF=OG>
+%N(.t10p_,?bYsBgUef+*6E$cF6 at l,k3(fO1>0NtqLRVkLg^jB:.W^Tn=n^bgMEbkU)f)d[TZ!]eX$^oq-O]KBRt7&#i<(27aGPS,
+%(>N,]R\W'hNa<ug^h[fTZ0TF\8Lu!TLo4Q&CI5LB"tD\F`kb=U^8&i-iaDJ'"*A-*Fc=V"7JEN."thqWga&2@#%eW2<mj9T%IP4_
+%-r>7)eG7Y7etDo&SH@\VD.Vg:r6$i#Q<=Qc3!A/gZ7$<J,;#>S#4deI50WUEp$"#s'YN:&f-$;:,PWZ)d+:;M2Y%2de/Ngf[Pb]k
+%bZ=tpSr>7L\kGS<AUqSF*oVa=o*4\uD>,c_H`$)8CEPpiVQXR9AO(?ieL<@\UKQMZR)*Iej23u&,<qsm6iI\!T2aOoTM7>304Y0#
+%cjo/I=o1u!2`0o3!s!'MDq42+]'1k%KjZ[Xrri\bE7R>Ekk2t232K8:i9tDo#f&f"[9J9C/l>flP+&TbaJ2oWVpPF@*82g0W55?!
+%#^U1L[QlU0=%2ijm=($\fAm.F?KRpKb&)puKe#*:H8%XQRq%BnZ;)hBI#qh=5erW#o*Gs5khr89@%r0#_B,:B(S/=K!@`XbFJZ0:
+%L9=c6iX8Yr`+oQJRjlpdSf?0$Q7W@$7_=p at .p^^7(pG5uYoDbr?*r&0rCKE[I7\0=QFO:-W,?,$PW^kf2"=kMe!;JYiMNK<='(N7
+%.C>P.**ZS_2FTqME6a_0db:WR$BlF%*:HLg^8AG8-`20NW6PdNG\62hK6WbQSbEaDA2nkVVSG)HeAr?g4tn-!aO[a.EhiK"bF(^n
+%J#(;t99t][SH0q2=d-oW3eI^1"KA3(h>m3f:s>)+1Uosj<"`8g%iQ<@&f$Y.i?3?2RO#- at Nm,h4jpc0]OX,I+8=<,/ipOqs^*VDt
+%:o0*`@$6>/TbN-$H8HY,R3qA1RC,[W"Ut[cr(tc'F="2hNrW[p2B$V/B'A'S_-!RJ:Vt?XjoFfLBe!DPe%.0,!-hP%01[D_10Ui&
+%<d'mKo1He1"067n!cu_qo1./>[Ci&aS#*%A<01HQr08ND'ueUm at pU'WZlT;P7M)U-Ge8"=9s.Ht'Gj.rD%V1"Iiehn/M)G'UbTYn
+%R"71?8HJH&kUo+n_67A!71Z_8Q$%mfB4GoG6"I#e/R0W,HC+ru&lMtlD^HnCMHrCYoHa!/f2UW.`$`q9rMhJ'>F$t>PU'Xp4YA_m
+%EL2Dp9:a0GZC*/>i4#Hm]-J=dn"<FVAjSsj2GB4Daaf/D9m]<H(?C.!RalM6=Ag]BY4/o9R:Oaf^[4=:D%%_W<M:4.)bu]l>Tt%n
+%NVjK89kLB?;-nHP4D5g7h-W$&[DFnV'opn!hSH/@NgaL>OG"_o!Y+*BdhOIdf)20KM(UhXWZ(VDQDm,5NZN8gkG16 at 7d.2ijEhJo
+%U8(/[APE`@7jXMk(/M5U_&=/L"^@TNqn/h.c^N7WGH!JC[0Y^L866n at fp;+1FTjUV'&W'Xo4/@d0<Rr#9dCTS&F6';\*j>Nk^b(n
+%<or+$Y['%U4*@.&8P@>bH"e-]E_V at A'GUJ-9`fj>Tt7A!_2UVeYcS*8ouQlO%0eYjC`%4Vh'q%bQ^mX8L'j1e;Dd'9]k.i(Ck>0]
+%`m=;7O]_o'(8,&3%eY<CjEh*-)(NA'#0<^(]j\,UHD<U..3m+dLJfU"m`5gsF&!+t85H\&ONrcs"UO!U\gsoc"N`DG>A\Q:UCWP!
+%O%D]3B$!6'.#0I3i5pZAVWb,^qGU<'+ at Qg8#+ZHQ7g$+X3!HT!M)39s[7p5r\BQ/*Pg$9"bL!1K8Mj$SbVG&t=?- at l2Bhm0.n^3\
+%Q."pY//0*V+2e\paTgRK$OT3RMlNGCUS<(b:7ET3-7^X^YoS0o9!Thd>o=`U$tuA3oL!!IT?^DSe5YYI(flq54a$0;FTjW03i at pP
+%+>?FH4*>T)`Q^g>A-Q?/25g:S;h,:0)tfC+AODu9BoM>aSgJE50X\8J+h-$$@Pn1'b=S03\f3a9X<`(I,IMP4S1Q;MV38<L_8WN>
+%/#cDZX#+gE\\]9rehuu$3&ouEjqk*VmDF4(m<p0m+MAq6L#tT>!>rmh2!ET?1b/6iYQ-U at kHm%\1OB;D;X0Ah<RV=0e3FX at P>S**
+%@bu^,e'%9LWU:TnR4Mhpl`ug4:P_T:FHgn4BrPKebKDGp#'Lc-:d*Wd/Y$`(akI1L,I4q-)>Gu]Ab0Y(?K?Kq_iT&8FA<1<OTV)r
+%F9PGRfXVBc1'N'p("N>g)p-pdNZf4?`Ku4+dI.JT0p[L`J:/Zu$6!=\]LIT28(5?YhR#1*Gp_n$]VCO\f:?Q.Fc.0PiWS]s'YGQJ
+%6J^JC#!PhKYa;lAAPBJB*U at I0JGn_f.f`J\]Q0Fh'[[AUCmIFZ=5!du$K-kE/OBhp'-EFSP=+M*$[SGp4'_NN"fZ$qds=]-*LSXN
+%mDt'C19.20W8tm!LClg""gS6PS^+5S1K\6YRZM0j1(d9uP9:%p_h"R8nd!ND0rB"!ShU']/7a.5a`-pLc_rsgnT5q,?<"/=f:Z*b
+%S1KTg._SGB'k at CaLblkhRU($j-hq"^!AchZi0V:S]Za?q?\k0#\:HVmr<2d1XG/K41E'M0Y2qG-!.b?%]91!@`OT%M&N&Hs!<Etg
+%UOF*fn$2(/="#gB8RJ\hA0=fb$Yb.XV/$I%O+__L&S*9V+Esf3TJgNb4^\1I'VsP"hfg&+_3+tTAHJeUNR,Pa1\b\,B`rQDPL`TW
+%>VqOB>6qllm(9Yhgg8im-G^jD2m%I<U1YL"Lf44R\k5##/Rtg-#45&[j?VY%_'%3l$;uj/Z)-T*I^NO5fPK`maMG(V20bZb!5>0%
+%SO^4?5dRg"ECYsDlO*eN&bnqc&0j0_&ot31!6W^_&!U2BZJaiNd`I,[;>.\6E=O5?Q&6omf5%m4)Ce?O/XDMQGNPbiIj@*^@],;9
+%0<:&3c"t+URP#oe,NL8ha:>+d-Y6HpI[-I/dimV1X-O;DPV4gJ#MrapFcLmMeWEUk?S3i<(sC%4Md_6kGu3etdK//`BAH[b!XukG
+%Op9:/G,-ZedR<r)24SS'c/HRM8=tum*,@\1#@MEL6C5[lHpDnI at E\g05V/n1/e>^_BNtdo%m<GeGbZSG^2bU:7-Qd(.B2sAJ<2;?
+%7-A8W)J5dD88a(!$WngJQ/qe at qOo-L6DPGCK*7Z%5msAbItcYe:<6<CNA3Y3k<VHgo1iBOXs4fC=UMQ*3Tqk\Jm[X8PG'.lPE?-*
+%%*9`Nb=/mp-_2bIb__6BkeuUD7L0o'!jF/]^+CAnP&IGN%(7NH`@saq&>Ek'=TEadbRoQK&b#o`r$?G7Z5<.,(2t<NA#dd!NjHaa
+%(!*,H8"R^.?D8WUTVJ;-mj?RX=TRo`UR[Fh?r=$t2P."nX;r\pV=Or+0);-n%g+[\Q\p)h83F'']3-9rN09ACW2S9*,sn-93(_F/
+%b#(^?UfJP8%A0UGDSRC.G4:jF0%!TY$4BW6huXA*-*rt3)-4(e%p[BsWc4Tq+.BKdUf at Z<rWW"rJk.AnVQ_3+:10)>"<mikZu[NH
+%;nne at OfK'([.7 at 7.U>]G!iXTP*Zoj]Ng)A(TEHLFBQ[?eJ5DIe>U`'"KPK-]/WHIa3+SDf(O`7-"*qp\[M[O//NjUXFJ#e#%M'+4
+%cu.BX(Y\cqZ"YP0+kNHNL!c']P$"Vp;u7&<I>Q8kI[V6IaVO1]fKJHk@,G],MLA&cEn[q,^]=lWCH?VqPt=G<iV0#>FdA>f\Ob>9
+%5GUH(j+)7Tfld.o#W?q3N(leX[*32UV!2$Db at SI,'a8T at FFUH1<<5E2ji>=5Q,Q!D%,Cc,Q1m3Ngm'H7V["DeI(9J%G\D"B>f1"P
+%Nbj<<WM/aiU2D#c?;gI#PKL\j4a0 at 5$c!Z3GUT>GWY*oO3,R/q>pq&%V!I+R<M`A/!rOfcA]3_aU^$\n17/hfs6=D:1B<%0R'rG/
+%+QmB^,\XuHVap%^)LP>32$0=<,i+(U_+9u877 at 80NSk(n^^ECPFfS]O+t&=;om'^6YU at M9^!_0u2<3d!H?KV>#4=D&1GUS639beV
+%<aaNLfid%Bi3(SjqC`joh`@:u+=ZnqF1Pg/+f&k]1!3Mp7D)]+T0ut/Bq`<CKPI<+6;oP0/sk(cb(n]d$()1=&^Z/MFrE`adh\4B
+%G-RdORBeHu6l1J%Vct!?jdJdZ;f%WWPd_&T9'>,J>d_u?-;lBao12oui)5ko0.TZgE<3E9!ARM=fgS<,QNjXPZYT^>8i'olFor)d
+%7)C)BgI!3-Q*MdF#]L9j=Sm]m#,of=@Gjligl,!'1#!J,+$B_.XsKFg!.e$h0BYd%]8&R9(+X6knnnZBApHIQ!XKgg]E(H21+L*P
+%PQ^Bc*;Gi*aK,tKT@?JIfAIe\['LP=?qLEm09_>hP1_]8'Ju(Ki,<.:'XUYjR^0pNaXD4D2UG.5gd_+8ZN&)&T[0dJku*pH>8*pi
+%@qa-7Dn8e[hFr\A(jg(YMR"tS?FeKbJY9$A+d;YDRAGpTn$R,.27'C4$fk at uKFh0,<._Jaa at E'a=2G8*"+2+[6MlKMnf4T[!oETj
+%Z:1T`R1e?D8t2:k"RDI>K+?BsXVtJgp^\Ys at rh#G@&@AePkhJS%K6(KdePX"7o^0]09'oQn@>U<b",W&q at H16Wo>;YEI9C3I)oa1
+%?LWD$2%jAX;4l,FONZEt.++3S#eLO/mk^nMO;YM=92X+e)(3alMPc\g'j\7*Jmi+sW)g]\McM1+oFgBb6ViDUVisMmVKO]-J7-1n
+%&sUT5/BQl[!.`Wc[F$l77^FGVd+5\oa at qo:V:U`nV*s<_WZO!O,n.YEp(TCm?.:o@&j_N,R4OB"TO at uE$o!FhKU%KYm%ok/e,cqo
+%\KVQD8Eb1+WVL?YA^57jo88_U=\:>adu:T/J?gCn=+I,%iE+2^!t.frP<=k7b-b"nFp,/W6sc<CJM/HcO3HZg+IllHU<'\a?OB`l
+%79b<-.VWHE*7AY"Z8/39CC2r,K-UKY<l.S+2a=YL`;oL4>Pe\+[#!KQmmXRd;[=)k-j/s*8R"An"1;s[$n+krfQ,fOoXE$:Jh-0p
+%-hB;lLAlm6I=ZDY3`(DKNGL/fW*'c2 at VnhLgPuuc8bn"j5`5o%cm:5W;[<"L"RErre)r91dMn]4Co]f8dB4k),,]LJ^s.TLMO,AH
+%D at R/P\puQYhs5h\Y7,]QKKsK3/sj+nTMC=RX`4F;Qb%tjPZWSj`6qO!;Pg$H8ri3QFf9&d`$raH):g94365X,-&gOYMB?TK`j-RU
+%S]G.^U8:N(!P#q<$%s@:$<h%L\KrcsIO$!]XYGsCOGBK)V3t8Cf3!Nm$pY+0qGa8nk<=[>US*"IQ#Y=e!@5J8Zm-^N'k'aL9>DXj
+%l at U;`@!c%-MJh6d):8pCb6RXnosg5mK,`GZYS2Z2;Dg4Ri9iIIl"`b`:(=ON7P/*+=\Q5i:KI$Ci*mCr3'jBo=9\aa$^F(uNfM]:
+%M="XV?3BF;^F$E>LIsLm&a"a1YOskb"[%IGeo!;KT@"R(15c5l"Vbr3AD(SE+-\$2R:IN,I8*q6b\U\"Mf,9?>bBhegJ'FtgP[el
+%=#qtFq$/qi-d\2k?e#k"%E,`sk%F=teK))`<03&[BNU'G"#tK*OBM9M"Z_Z.E2JEu&0Y2O:,ga%O7FOYIdA\;3a&WoO`J!kKL]dG
+%DQ%u:=/M/:6X>bhJ'1D5`t?m,E0MmZh,qK<M&h$$+D1b"`#?K<`&P:0gsZA$(H$J>lbBeh\7?bZ!S!(LWg3EsC08?G/sJtRJ=Hqd
+%RMH+pWX9%-+eupf*,s(X)[mS.MD?V9H3siY$G9p&!-O2N15dnYjiA$h,Fa'5N63rai3OsD>50l,Tuj7k&*4L9J]V)[E(%N.1d^>(
+%&qmU*_c`;]1kPI^=LrNR.r%F[>(l$rH<!.$^:-e-'$>NW<!f!kb#ZM/@!e%_")J5uosK2UadkIK.QM0^CGIdYd"9Y-enXFfRF2Pk
+%4\]3II>S;skqCH9[75>marZZ(T`%r5cl(1&<SKgO7&E'PRe$*lohY528Bh1h at Q!ua8Qsi>EYtH_5LAq9-/TW:;/I"f3S6l'ln;d9
+%/e.$Q5otb]N\3\EL_;dNnt?\Ri*2B*^X<g'd^9P.KuK+KO6%dBY"iiC9JhusPSr/G(=3C+KNAN+/e;u5M6JhDjYmoK[[;/Y=^EDe
+%B/j3EK2l^sSk`l/\.*BZ5`D+^'*JToQ$0EH`b+JCq2J:?Sm3*=9;<Mk<ffmED&P];cLM-?('Gu?cj7V,<<@r3p'>%jIF]uP<S#fp
+%_t=Jeh??R][KF<K'J^)-p8+69;_uMd"8F4V`GGUWd[#GCG/@k*>bO6N7gTr@;/b.nTH2,[bBfOh at r#esf11!@_2L6N5SA<)9HY$5
+%>,7J,p(D8;c60(MIl6p\8i\2V_1h?5).FtVod(6c-hBM;g:H3/!.^?VM:;;tK75!:9FqDuL^D?]SL@%-V%TrV8<a]TS94%.E+^.q
+%c'A45G#gsZV*%We"1>s80LPNTZ5hd3lKAAunW[qo=%?<n>QifC/?/Fg,J&Ph%1b"sAMB:.L"o+2\Z?uUKUl0S`aMN+F9[4q-VA1-
+%bjnf.(oW6j:j/p-Wm at 2#WhrWdNosf77k?\!7rnE9>7A;8b@#5g5G6=eVoGr-!tLKb=tjYNH$U4D'G?5OI,aciQo%n&*GN'J4XN*'
+%BV#RJ#^n*$ZD=mCb)4:]p@=)REZ4=1@[m'G,#\Yc/Ybr2!HX7/2(c/2oe%@5;]^9s1[+W^0KKU]5_b:/rR_*g=3)S>\.#=T&R_(`
+%VhTA^1O+Ln/.'9*/Y*:!BEFbUnKd.1[X`e"l,k/@+0k[akZ<$>D)Zm2[Ck3r(V1/`SVU*cnt'&V*bE]_!3#&,eQ;;\d?>H$jua;B
+%Rko$<ZERp1aQgd#e]siT`C_Cp?Um.$-JG2Or#ok;lrR^2AJE?"f&PL_?=5%Ii,[7p%^fgP3,1n$7F$ip*R4X-Pe9"Y<\>Y^8_qXA
+%Drd!4NBkd#2'l^03KcaO&6 at Eo-';Q%igNok8]X"5C\_o\G%&K.[(ZMn,OHXk+Rq;9o[?OM/^-VL?oO5?S at Nf/"6X(]"koGRm`81S
+%1rZc<En<8nD+R)MgC6+I>f#iZlDP3`A@[]RHf3W#\h.L(aQJjAlt#YN_s/FuZZ+KL-%3T1Uaf6a"O\%eOmJ8^n=9-0iT*_;?fLTQ
+%XTHR$*5G`Tl^am23!TS;Su#ad6$p$cVM#!,JufZsA4VG[[m8gfO9$"W(u;$]2ha#k),*M-(U(_A;loU]FsTIM5o at XeK&r5Q1i3sM
+%PXl^"jR:GuJb!W\&&sN%SoBbm]@+J'-TfOHkY"1tFa3%a"$X8k#eY!-flSmrjrf_'Y(;S(WU%%CH>0)M$O-AefV'1JX#cAE!e%B4
+%8#blLVI!>#1+d?Hapt<GUEn_!l(9\k<KpX,TFg`sqB.6f*X4AGZ=5I)*6\jU'92-7e9dY-$R(<<8t8LOVNVQ9aEFE9Q*O]6)dol_
+%BdG*>s$3j;Pee8-bs9hPbWMbqN&!p4M)/)s":Gu!Q=UTq(e(bgYX^;+oeaLl<snIQg^eERTEgPu]Y]oiEtiq.DWK^K3lY>k9f_:c
+%OuX95CCQkIf2Q_ at 2,lY/cE_nFB[GMe_s$_qU7 at 7f0$d*fG<L3BP#51?8ZqgD%/@$74*]]GQ:_Lj>Hc*fR4SO="]?q+>[#tWK+t[4
+%Z't0M<^gah<YO-+eBDWE-"2*<6U@'N6<((`Ti\^eE@=J%,$HGKT+-cjZQsr&7#S-fb5H*</=M27dZMp_;O.TTYfmM at .k3&*W+pX;
+%XjZZ)<uY073E>%i$I2*9cWQrY<`n*G7i)i<35X8#Mj"*JmP_Ei6Mr.m*ns$@P?_K#<jV/4Jqf.&/m%mC#Kfn!.KHdM5oU`@m?WKQ
+%39de:15Lcs!<@o47oQO01WdK#a:[?[2=_Zg'PeH7XE-8E3&rrS+ZT$B6sV'uBEJDlP9r]b_H%<W-3C<)=TnoL4;n9FO+=)JO.oPK
+%K-i)'AZB<FXU1['<tO-YH9oB,Z6HFoeS1ck4cs[g2?P_aY*(ZrB,Yh#5##0n:WQFaTEbJCJs%?oUUaVO,W]I5l!7C!jI)I!/k at +"
+%F-s"F]@Rme*N_A^I-dP\!u.t<r)"Xrf]Wcmopgj[F9=57Z^R10m<0 at l-%Sm5/.t"JVP,<8%-T6-+;IJC,(MG>Zqs+2,:@=q%o<^I
+%mm)`8Cj,5>gJ.SD6Knbf.4#D.`2FU'$t&5QJV8%dJ98n*)9J<gXgoSkJ::eQe1[4;bM](&s%5B`<i4QsDKQgGEeF<q-IE+iY0:c$
+%iYT/&"WK9#lB6[+6]22:?m?55'`cq&/!(^QLoF^?9aSQ:'T_AX\"k9dNS'D at .u0DVJ'jHD[*XSu=1FG>]a5&?*%k`6.LQ>,J8((m
+%jc6hNnN^Jsk%d\9r!H2>6ec?%=)f_;OjZNN,RWPu'P5QgV00ujX]K7,kNH?ukREb89,/32F>]n=TYSqn=i(*!@76?I=tLEkXe&b_
+%$7rmo'&]cMNfq%[8SK37Y,)C(KH/&<7uZ=6%Kq(>&t?*BG@\1e/$tcq*)+6QX0D,*dpmMmB(T'S+;$FVj:It^U&/u^h?-eakE)-G
+%:`7'6eNq_'UkoYA4)MCLqY#&&F;BUId!;I,:V2gf1mqGY#`W(19BhR0cWg0SjWirWC+.p(9G8t&U&-4a<eFronqIYLL%M at W^T&U=
+%!k(Bb+-Qi4PrSqAWX3TpMP\)L;?/X#ZO.l^m/`*@)e0R4Y8L:bnfJ5gmK00;d'\TGFJY_-0qsHiSj`aW$a*%2f.ED;R5T(S6"S"V
+%PHrVsee/c$[;d">8\('@fB'+:F[C($iC<<2MS,8.>Lj=-O_4i[S#`'=$R0i<$?Am^T?,HtV at K,!-RZ'nq!4A1Jm,.WM_r&>LJ:Z"
+%Q],fp3-__K#!63>B$/3Yk5jXL%R9K-cnR9XaTh$JU^G)-*_B*@3\sZ"<81]<Y>rS\$2"2s;[lG9BQ at 9/qVab(C'O!&dt+b5[R19Z
+%E2C_f"s"+^&La4B'ncETVc@;g[6^B&Gf at VK"NFXZ>?i<=]],LD\s4'%^R=__/hGhVI4uHQc-h'ZQN:A:,Eb`!M&'<)X.!Rfk-B!K
+%\k/;_(J)tGI:_Q1:bSO at P09_sJr^W6N%cXEd8TBrBsUU1KEZlcZrMVV.$l-M0L'U)Wdo)`-\u8tRiuN/OLWRn^rb[HP`q\o3c=fg
+%-KDQ?`(F'fN/)1AO,V<!LQR2,9X<J^mGXi*!Q`e(P8aPn$GmH*,[$9qHPPK(c_T_(^<Id/Oq>6)0Y\7^asc6j^a6UEA)59+8*Lk1
+%&Tt5[j:rtd4'<Rh;72Rn'C[hd+MtYifa"%4EWN3kn63,d-.-_Jkt5kC73\!@-Whi-fHki*AN*28l.pIFOm/d/];&1MVpZBhH%j6L
+%s%P^60T14&!!]'cr!<3BQ+:ulcN^Gc)&t)oK'keJLcS4u%r!fG*bM'#@1?nP2B]bnSV>:c#nkOgV#@s&QQioi#\m+kYfQpaLQ_.g
+%[ZZ&[W=AK at K\_XON"qPC!8:3o#Uo'dEeqsq&[J=qR$rM>"T]<lf1:6]\rLkL"=S:4WRrp0M4Tk6ig1>G'Jo)*/b##]jP5("#Mh>?
+%2gn'Q*YK[dcX=i at IOh8]Y7scrJ;,_3b'.!_7ZUhRKp`TQP6o^TDILYOM6[[e7n;D8#R5<D5nH2J3(m.4,mMHG!6nPK3\9=8j>+TJ
+%ZaId:\L+ccM"qJ?D,KpjhoZUr8#aa.&qTUP6LG;SdF\NJ4+bOSNC+5t5#c2Vcghs[Ou`]f&*6-B0GVAYWIG"mo0AA*Zs4)IK/O(e
+%=>bmNF&j#4'!qe?V'BNPi(H[#dp[Nq:f2D;+UCB7FbOA91DIPr at 7A.gmj_j,kj2e*akL)eYG^Ta6_QD!P8Nc![>`HE3YJ=m,I+(@
+%Un at oXJe)U^*cbA-?o?tDRWjifbVJ"o/u(n>@0NJGW<7":p2"/5e3jpiU2C$cPl^f04eWo=2YVTRP3h24e7</%!"=f!d8]l)d#n\[
+%.O>*V%)@X4Nr$SbmpSfk=gBZ950SH4A^\RR^ZF=A3EBV62mh"6%<s$R`MoLad%`(%0MpRL2m8s78ai.YekAKmRMfkRe2DtSR*!9A
+%FOVVXA<BCdJA5ncH#a-;RL*B/]Rk&i>p at LNn0.ob!s.SP>Lc"KN=`3@&1HZt369&j+!tG*ZL;0.)i%Ig<n:T8Cgf9ReOYof"%m&?
+%#g;HUp$6p1fc6A%`aB7d+LM=T-Sh,sFo8YHjJ>GP(cWgI,as2H?+lR1=j]l2e<EmSoV_$'^e31ATmf^D_GQPHD%5#)Uh*9)I0uoZ
+%1K"`W$4,O9.E[3hbWnU-:0E:p'*os)%$%k at i!.s at Q'CbL^k('Z0PBGW>'?@M0BRmjAKTu)-/I)L80,3X$i8G:mU-obZ9!5^?@"mr
+%,.mOMbLp:rehc]2J76R4+^*\g&lA\]I$IgN#IEn5OCgOGT\7MPQ_SuF-EBa8n#mFV%4,OW5g\f)6,:oH%6aFdLhKiiCt]!8,\8J^
+%bhC`\[5G<cC?L/X;8W&/f]<k?O:(?&m4Y1tfi88LF'8Z!rZDA'CRujc3#%Ci:T[i_]i,IfBn6^FFITU12+lHh.Ntb:8g#j1P,i:D
+%pEqhi"3^cCL855/&A#i\Q5]ppYS<p7M&,7A!d4jbJ<9=9ckO<.f<^X/)@5K5MC;'c,r8`Y)[L3U>dJ>SAe_C>/E73&PBGD].?W'C
+%lqM9BDaYtl6sh.HSF#UAJs?iU$o at hb2]ed^&)B'b1lpi5BMhlO.*Erg=mJ<kc80U3L/CE0GpMM(K,o<(JH`')*,7LH'#JZkWRpG^
+%:@#?=P7MQj\s>Bb,Jf1""!9'IXsKnF3[G7U<6Vk0<Mn6g'3D^(75;8t!I67oh8,=G(/.mFG)r?:1RSif',\pB1[3qm/?HlBm1n!!
+%<u at V?kRg:teA=q-\QhXVM6t>eJ at mE"9V,SM^<,&@='9<ZD#s;38mFh)r$R`U$tZOm,fdKgWEMc7&N69H.>LnT2\rP&^toRT5'`)D
+%L2)<^Qt1a!+9>$Y)9E8gBeXcE#e?#sf#;CR<'`l=F/9METMr1sAN:BeO<BsN;%O/A;LZ:]]$u92ePeE.I53_m!`?g<(e=tXPu'2H
+%6sFsF at F]neat5'#bJR<a+r.^fO[/THI;e1GRC4OW.O.GKf(M]R/_F20WRD2VpkiI#3D.:ik`5mCfn/X\dLZ,I1ZiDeQQ!9*A:K.-
+%8!P0t,m=H<dUkbQ:aS3>h^Fg'0EJs-n?JrAJO?fp%:j`Wh`QF:ROp*eQ-ih_d51pd<+c;M%6;CH(D$QIf`MDC(d;&F@$"n&1tu!X
+%2b'+[4m5'Un#[f?#Z^]L18$q?"no.&.>4RbUS]oUPE^ej]$JTBOFSY(8'#$QMfs+g_a?$gO;-CT^oC$>!"LdB2b[VO8m9&j48*\T
+%oLX)R8l3kg;X2KAe`Mg"5JrtSGl_O+giiKeC7_je@*GdV(r$<cL6`1%mF]LV/O;!ZH'>F`&/and9"O+@&)'),8)Z7<LBIMTTS$]j
+%[aZf04"dK@'>;'(TocZG<OA`47R0SA18/ri$K=ZGc,++Y*hWAL[32-s9!=oUYn>AS3Os#Q+t1IZrc3&aAk0FcGbhLn!dWl]/SFku
+%(r7=M=Iu1rk2`Wjl*V,b(I0WH<(:M!o.M-78k%!'M+NpjKXN_\Km!P]"I.4kSbubqn#o\d5gW/QYGOMXEh2=d4^<c&E(-YKg>Q*A
+%UulA1#>'h`05n[SMf+&Wm98+,2XBe(E6q!LE*:R./"&k_;'nt&adgk=c5"QVGb#ZI.,)\LM0''#I\>oAb/VUY%-K4hnK]W8Ba9Q4
+%@+33RaJj94e..)SK$`4RC at QGtn_bSJeg!go2W3e0J9&isPgptC!auLW1DkW+rLq4A!qi'hW0?m>s5la6E'`!@YR^X.V#`0jrOJ6"
+%EV!@WJ\4W`l8,tJ%=h)r?]r(P=R+hgE(6/iYRC)/'<%TBJP%\8KuNYc,+EMM/f<4qCc+33jO?Gp2Gk2NC>/chW\]jdI[A=1B8o+a
+%*FP((YX<ohp18<m1.mJe]qf9A9^F$7)=3gY8pQhH*FO\, at o?kP75`F"_.tRg+jUs2VYYl+d@<[7HrHJM!%]NGC'dD'5-5]'Ri/6E
+%!fJn5SMu=eLq5f6OF0LOP\ilm8r$>@hcXA6G$!?73pUj)(nWWX%^JkZaW'46/nGpB,.p1K;Ll(,;?3DYU$:5;#s,YGg5Dj!dU\"V
+%8"I0U<CRYlHemVQc#Y=JSLsp>-]A(8K]J)n1(nXkXbCdi-]&,uOsfb=O;)23J_i)jfV<HPG#p^tFCKdoUt;*29'(utDJiSUqNW=l
+%oNcT*$-LrGj=YPlCl3UnB2V2\jF#[tk'B9282uq?"sVZebfTs*&]h%'HCX.*gS9I)oh%.oYWcHDckk at 8F<Si+aQ--<UcXSnY]a-T
+%E(\KbB4tk>B-eNNR1Y#eqIrYM,'jN:LXs=L`8,IT at gB^+@>7LE`#RRhneFjEb0h3(keJ7^Usc&-BlUbH`p[JbO*!e2V&_0rEl&8G
+%=b$_I1l4X6&$SrCo[U<FSCb(,o,JRMa.u->i(=Je.^UUDd&\YDRr\\P(i+r'_*8&,U`i&RHW6GY*emNbFe-;rV6Y[D".Iq3Q)i,0
+%!%\,GQ5Iu&.:\Y?=VBhmTh<aEa@^\8MN"m,4WoL$,Y5-"@/mTtFu3cSK=ih]V!N?ARqOpTXS6rV[(aOr;/nq5./>CY*lcp4'+4q>
+%-*Pmm!bAr0 at j[8-c<Al'4*Y\#J'hC`!,`olYTYPJq*Lq at e5L%9K[N$)l6JUE"'[;-=*N=_\ctMZ@"&h>9[-]N;P at n9G_\OPL3QQR
+%2\blt1#2)^R>7D9FJ=;iR7lqOq103T%:]V at Xf3a[_t'T-PRMj?('gCe!-er50X`9$6Pf_UY/$[WSOL#kJRf\N]_74.!3O@>S`'+J
+%]hAXC%%U"t/gV.KUU::K0(eXc9HAfGEqDtE1mI2<Qs=0#jXJ[S;-/_\8>2NFprMD$"*?9 at 70;jU*t3:4Ik at qDXKGGBXh5H1+],?]
+%&9C?]R0;nrkoU,b+"B3Bkfn1q;CO&kQ+`;O%9Z8>aMe-,N!>9>fqZWaP4_`7edDM/ECUa&%:Bk"?d_knn[3"NW;</1"(4Yu"`Ik&
+%<=4G6%+,A(B./^\QCnl&A<:EGLITUMm6spQ1IsYAjpd8>3[F9qA0i?B#JcELeJT at iKLP=iHtrOX'[@jL0qql#-n)*Z=sST(e<FK7
+%muJ6!W2aW3lb$jD:2qX1.p:F>7Vh+Cf&a9\&HsCS,.SnC#]]oQiYJoO05B/IaleNiMr^\">SdD5'sj!j(Tc^&KECFRW*Lc[.;M`a
+%`,MPG["`k")3(@l7Ono'Z=3T]^hSG=L;9^^;@6%,N)Hhs]',Hg07)eO:kYVZY)%&!*3t2.32N/Y:rKN[69Z7f'3Sen_o18gRNJ2Q
+%i(AQL#jfIaQ*%A1ARII:.bPLV6jgNs)A<29Lgc#moEn"!PV%?4ae@*J]3%T$!;o_DJP+g+!O?SH'^I=7>?\&r9!U[VE^1Ek)k$^k
+%/JX'cI<W5j=G1c8Ek$uVZ9RU>c0GQ49jD*(0FsejIemdRr"!]ernY=NI at STT5(7qOn7DUqLLL+9pE+m_QZmpZr`28Zp%rJ&r8usf
+%^3M.(GQ7!l:LE9<qY>pBZ#ALtmdoq/o:sT7nq5-TAU\k%nEKQAO7(Q_ia/*=I!G[H0CQZgH$D7W^\cjbg&In@^Dl'[*e41RqI0AQ
+%hu.!_r:TfVIf;*MSDO533.1_tn_NY_IfI6erF*EhIJ9ekUNDU02D=9?p@$>rJ+riDnK[F&_`.!RQ_3s9f6?i,C&%8rGOnW(f at Ta=
+%VYT'"cVe+f3o5;<I&MD`Vto0 at l0F-#bEqsaZEE*`O6QW@=\ntWn_G#+R:`.lhMjaLr]GZMs/9k)GF-XJraGeN))QVae%H.(s).c,
+%LHkWNI[3t4l2AZs+8,?9Gk^1Gn(s,CLQA(A^AIjNs7#p]j1EY/n(rQAUWq9"T8&K_qJ;)]mLLCgrh=W9r8lbdJ,8g!B2.+W:S6Nm
+%rVbo)No(<+cX5jZ5Q1MIGNCo5D&VSumV:cE^&RS1d$6eC>i).nqJ#^[rqsV#W9a6;s8#l&7>n!lrdOW]Fe at W"r:28^o\Ig$JM+?O
+%T=@NpF6D\0(S?/s"2*BZhAuMG]K=g$hjs,Y]#lIIq^K8JYM='pQ2?BP8q,s,ipWDOrr1_\gB["!^N+8fQ$^EPOuN<]h:&ReqgSD;
+%_q4X4q!c=J^\[MP4n3aTJc<s.q<sJ*s':$(s):4#c0mlFeo$m?s.gZ^q=*M%i')AkcSHj8*o'6rnKNT[a"Y7I_fX,jmBaG$]Y%C6
+%RcF;%]AIr'Id;FQ&b"cKbaOQQmK5\a?iLi.ku7/-:]=GTqkj,fpmr;WAGkfNqQp'pT3(dYF*u:Uh2f>)AGe0pr8urs-^,furEk$N
+%RkI#+2#jJo^XbmFdUfW<rUKN"e45#dh1'bKmJf1rprE32Nkf0&QNYXHjn3i at De'd^j)=q#2aL2mlTFU4:RCl9J,I4^*M<8!pHQo0
+%ro=",LZrgSVg\:0mCVGGrZ%R0='p^nn&NK at S)b(7$h%-2qWGAH?V;nsHqaO1gk1%T0)`I"hgt[3hs08%7Q^UM$*h8EK-Xt&\Gqrq
+%b('E7iV<3 at 5<]!aq[_+Ds5EL_s8MuKq=3'_H2-mth`T\B=Z92?mO(q3=nqH8f:UspPs7892g!#J29KH/X&17>nY>cPZXK,0\mh<!
+%r7Ka`BH1lZ1sQNA$27G5PSuB$f/_4uie:[pC[<nORacb7aH%7;r+rhK!cb2j1XaWd<lj>QG/_0T'Z]34S9=]hm"/g1E$@s53HjMu
+%4I!la8%:Z_e0u/pbZ&VW-t0.PC0)FU at s+fsHH;h8L60VJ=82C%51IXLXG<ZcYATf+C\hZ#*1 at P6K5Vf7+S(AsmFjpSCsQB^fl5Pd
+%ICJ[*h&5bo.tQRML]4*k.<kHfh<fB at h0GX]X*qVKpP8_C:`SafHe?#Wd"F9s]r%klFf0j=XZ0DFk1lR*oDX,"TAMd/+1<QBkOV:&
+%+8"hn5O7q\c+2EoQ?l&Mc;*QOl#]$.:A`N.eE^<*WB&M?C3_:(q'eCsO/M%.GW>,P]46?WoZ=4!\NX'7nlTSZZbuTX3ZJZc_u?l%
+%oS639fB=if6`I]B&)$rp5OFNCqu(uAVs*b(c+_abQ2<noVQIHlmnUKiSoq4amWY4n][?=PRY=(dSFu(Ee/pP(Hd*):;Jf3YWM6as
+%1RE7Im\EuJBJ+Lt;;EJ(A-TVGFsK/Up=u5rmtZ(i($GsIBJnj#diI!@mrE;@bu*f7Dg#;Eq4:d-\fmG,5G[_P51_0anNgs(du)=/
+%[Z$7>l5:W6=ZbZB*O=9\l*Xl%m2NTng-[!AAEC?aBm1T)bBAEPBU?P^>_BmmJj5e at BC3s=p?5h0Q&ZZrafM9?7-u2Ace@>JmIe0d
+%4^?caHIl[YW,9hB!a8?i,>G^DQ_jrMC7RkC307s^KO=Jll^i at W'<ccB-$uA4r-,p34'+Cgbe3>,S*<fANIL`511bo]pP8W!iEa"o
+%Z2Hr>hRr=>a1QJCoJVk+XC*27 at 5T&hrB]9[L6DS'Y13a28DDiFfo=:<eje[iD'OFn[L at jAKcAm_Z"5qbEPV.T-/sCib)MsOhN,rO
+%lUTu*D'hbaMs7rdA7;NHj-Wu4f`Id_O]ghA)(dBtbKYXNd@"Flpegnt_#NMcLSD#T^rU=ZYU/)5?t6^OpD_&1c8LR7/<(NO[;?h!
+%RiinULF>/PnIVg`d7MCBTOW(jPY-.iA/;HA:<AW%NYUUhmU3T#V8MDUeknqQDoZVup1/3ZFJn)b,mWh!*4Ft=<QgLt%c)0pH<\'P
+%WtX'c%'/G"@!W*rHIT!j(_5TJcar7#bbZ+]-Fc`c/OIX;XE:Vso6aV=BeH"j<qjO4'NggQZd!1q=A`UC/o=@%k&[/NY1B5<E\j&?
+%#i#0]i8ud#Z?.^O3"('qh;)LHQ[VG[]kfJCk&U._SNeFVbmCA4/,?6VO^.MAXrC0W/iarC\K3]-_a\(/20[o at F(.ha\fl'*%aMm$
+%kP,0=W/m]H7[o>`);`J]oAKXKD+;&S`SGOSjbmcaf)DH:Z8Hka^384uHgT.3<9mCCp!fW$`gIkpRmjJ>N7u[=p2qn)gds[#-21*U
+%>5DQ?>BYW5pt6^[kq,SFZCNu#g7hL?g?O'Q%"R0*YCd5bGrZeK95O0 at V^s`Xf8d9tY07/>N<BkQabS!Vi(MXW9Fc><LU3kM`C6G7
+%CW\')[-9Rj3^PT%&88`cQQ70ggQ$ZPACR,d$/$@*jAH1X-*sL=BHcAG#VdVf*4O&1*Q)-NUR6C0&HqLZ0(-BiGgqFd)KTs=.ru\m
+%HoR0KF!$J>R'UX]]Ih?eXNZe0PcSMtFo$)+:N at mMU+&e'<0 at lRUd_1-ghB@k-Eg3c1G`n1Jd-!pB0Ef-ZWlIBX_q7q_QR]alfhL"
+%YN+;:0W\XK=,p;0HH.mQ]lI>Vb1<Mr2<t/*YVKk_qf>sT[iVZR6Z;;+)P"ZLhK.2=FOTu at UE8QI1]*>QpLjMLmPXSpo6rdeQ&Ni>
+%=hccUGNSeZChp1rG1O"5R;8;VgNgLlb;RBkZVGSqAD\<&*M+ at NAS=h7RrM\m_e/8qfYu88JS(8=CYEG>Ae`b_bF*7Ef277dWSH_f
+%doP\5PNf0D[fJ>0,$_ME9>C<N7Z_e2[&2GZs([aVn9C4Xg<7]TkD_s7[S5YioB4D-J(=oh4.0lrjUhIIS&MW+dWoK6"95jmp2mal
+%h#GZkW6GU6,GZjDT5Fkoep[QXXo9?T,VDmH"3\IXhs4\Pfjpp."I#EJ;5>XFVDO(65is8=OT6^9G32ijctO^J/IGFTBA;HnmJ#2e
+%8R0B]>fibd#>QQ-V)B,FPP.#r3bjprXkX??m)n(f^GC&6d4bCJp8f4XC;2s?A)2U!['H76m+%[$?$+&!CGjsQ$%C%Ji_"'jeiSo.
+%h^B7e9/_uMXtTt&\%gWYUK`^A%aAqIpj548I[J88MdNcTiH8 at B;RZ)/6"SKQ[ZBCJ1[DK1)UD"4U\Pa>1RF3>-AB/$$Zc$Vrf]1i
+%.F=JR/BF0;dhCc3N`$@/@YEjb./X?XPokHRGV at H=KC^4V2lSep]sfrVL\<fu#/hlPS)NPCe\\\edtb?uQe&NQB00g?qs*+HUNVpr
+%>aU'a8f$2X%G:(3MJ66:9aE$/J3.HFT*0s!J=$=u<PG7/3_KKU!l-q!UY5*K$i[d-Iq8kd8V6t$iIB+OAq$cq=0m!*%<=@",.#a%
+%Qp"=CZWqjhU:'U\,f%\VN4kPu7rN)qcIa)`da$+XF-]+r%YBBGXFst13,??7%+/hJs3e91FGckt'CCR((Nl5hV"(n`*db\=Y/9P-
+%encq6X"7P.Gi$;Sbe at r=Y!l)-]JR)N0B&Z18C#T(mJ]h#jXI7tY0FCWCmm;`RpIYSkb1*Vd(:7BqaN88dV at kc0@mbE*`A'.M]QfE
+%879`9aku,aq<Ol\G2!Wm8>L1`S#.6E#iMO&]HrB#S!SEk533EsdmKO9=F&eB)pE at N4c^u!MPme?V_XdaHRJCH<5rtsc=TVoFoI?2
+%;sI+m33,QAXs599k)"N?/pE>d`NNMJ0+<&jh/E\6c@#QHcF,gjmXuZ_EnX/s09:0-NRq&fQ,-5l2MqA!@RMjdCF4aX`?:!J?5>VJ
+%lt*IAd4Gm73QPh\UYV7Q-!I)UPAL1'Ene_(?#$o>M<n9KMCTQTCq>XU%9I=HXe][7<HJjrOf.A:3d"#mVG_P.X.H&%2$oon.XgA/
+%phlXpa1[fCMZugs=7(,H1XJYVYci.XJm[[eZBGu\J*/*I,(gE_mg+AKlK_H;2*1W:[pBW;LXbeAs3;sj'(:l7m#ZY\"/`fA]YMsS
+%^NS]H7W6Z,+IcA)f.cF1oIMUBENL,W$!c%YX4SeGnT^fF\!f%ATQ"oe$1;B7dufJ,muu9`HWcq1S"iP#qCYkgENN-LmW at Ts:19-&
+%>G(BT`ap0nrUKasOMqkD>1VrhTM:s^NrIi0W7B"Qms*^ah0 at cNgj%U7hY)kEVsc1UckW0)bIB at Z;86sAE/>@5$T-9UNQ!YGmB\u*
+%f*I\2m71H%.GQo&88!a+Y-g]u0pXt,Y=^k:O%$b0-bFWlZP=F]O[uB4g"U)f()j&S;gm&soS(m38HSO##0kQDTHliqKouij*D/Z*
+%24(/JZtO"P^9H[3DSb2f%=9a0G1,*fm4;u*Re'H^lElH*DJn$,jucsCU`M)p\[Q\GcKqp`ifpRA<?!#XW at Y_dRWH@<31ot^:A3(u
+%Xe]1q()-'el.UDYRFH"hemW-peA at BQ\bD]AQAdt0,k#+iftG at 8Hh44.c*lceeWul19I2Hng:O.qc.>/6UE;'r9?MFM`)8-i at QBMs
+%`^N36`5b-1G, at tLhpH8t6PAYI/NV_-pdVqg at kW]*1mK)Ffh"4d9kZ1/m?lDSS1f_9TA#;U:rSjKigberp6+??;V[T!edS,/XR>(q
+%2K:(%3.iC-]qi9,KQiUMedO-Emj7M;UqZ<\m1t%/Z'_*,/;\\[ls6icf at dcD4YOqH1iKiK`/C"j4.-n,n8XX</\WLM/N*N2N::bZ
+%(h)`MR$:A;cqCh7&2V`ehj.m1S0eMe[s#m-,p()f!uJ7^H-F/$r*,>4gO!ifjP,:4eG*i`\ac324nLIeO,m*a\_tDugLN")_Mjrm
+%VXFI(F2CS<7[IZC_fHRLdn>,&E;s4f%G'D!>J.[tFoPkZp\-i"ZA;KcbB*$5B3:bBSq.W9X11s<eC79rd]@+eMq_n.P5/HL6+m5_
+%mII#4cQr,XUj]Y0n,0b8",?^I)6G3o(p]'c?ef0/$e%9_bF%E0]9$fmA`9qS52R3Pm1Pl(r5(S5P]q!nmLm>`(NRK'_%Eq\.9T6t
+%^"GLQG=,VK.3\B;VO2:Z)5hhl]o[GA1/CPlcY*$sNX7_[K?LUt3=&Df-e[%3=nU*S:Zn=Oo$8T9d6Gt&T#3]Y]`2hTm8)!,a_G"N
+%DOn=sGtWLYgrIn!dtD at R:D08:SjN2/fW$Ju&FMcB9Vur*TlOkH?Rh8EKMM)K/-j2'Kh7"QN]qn,`]b8S?.66fBrQ!MM5C&.p2V[t
+%ase42dV1_E9B?!bCS$R#nk!oiV<U7Dn*#rbW)2Z^<-gCXra."G9^=kn\eJqT@[+7i\mO/UdJ`r1pQqcUo4XQZ:%p<05O*]9PF]s9
+%%GH<6s48%%'#,\/;(X[kCPUGC!TrM3/Ga>C)EX at J]XA&KbMLa_MQ04IW",*qa+3W,("M"raB/($>!^]+T3nMh;o)AYqB)"D'<Sh#
+%HUk&b[(g+_ at C]gU at C:5iY at 4PEAuT4:@AVNLh/S^MIF`\ubUbQb2ET+-`YpA,)eY-^[[=PB=9[Aa_%O@%6U"["gJ^!IZbEmS;RF<t
+%4=kZCk5;TdZ0H]`40c^^[b+Jb(%Zi7s,0SelQVL_?cS;sqISjQ9>si:`mVFG)cljsXKaI&8KH<l(2C+rRT3WmYQ--p+'r/bCJ4''
+%C2.OnV3Ou7(jjoUYtIR$);So3S)L+bAq.baWgIK+2,CsOaV7FWWdQ at E:q6'2:pj)H[RhK=n#L)+<68--*R$0[2,R"H<9C*kn?k-V
+%3bkXTC<Z-i<DljF-/H4l[8MAC.?C`ClK%kf=#FQa=B/*r5/#eIqC/J<db/Y@<'cl>I4`uI9m-#]6KY=mE\FT=Up@#oeQ%T/=1)(9
+%AX,Duh_%dd1h3n1aP#^7f!R]Bb`PZ@]&I at .o@'UW`ga!#FemF*)Qc%XA>PW;j1>5&<<6X%o\HIL736NNTO$i5es/Md>+k%oYG1-Q
+%oj933qGgM*nCa?ZAck at H^uYS`%`$-bA&L>pMi/n<YLWKP#-)UnAP)JU=deqmF]lFFi,3,WO4 at h+ZmM&@2^S!41Wee"m&amRrp2`F
+%Q"=O1^NA.$Is$o-r)L,sSauLs]muC!^FabY)eaNn$Q)epdPcJ#j]1TLdTs0"g<RCDX-6?Z_$dbK0AZ*%0\icg!5IB$r-B*]UGoUB
+%gHI9[a#<n[+*mVWWO3];=6ojsHdfNsa6pJeml^7:]mja.=EQWgeT3kbqPh*i]VrBRcBJ3,Pr\0#pU7 at bhmDf1FADa\oAn%YpjPG7
+%D9%=<mKrd5IU2,s[;PQj*n2OQ]rsu)l?hFbSW+S<rTPC/g,A;99j3rAD+$h+.-7Rp^Ebp[dhk#9hQ-B3L)AK-JrhZhVad8j=u7)a
+%Kd(Dm?G:DtM$^HsF)8lqBq+:FRVuL)hUS7.^92]bOM:[PHSb6B$n[=8DqC_tE(!XmDE[:na6IPj.FX?;o%q_.DdH"%>tYO7gSB?e
+%!]Wp60+.W;$CC$IM(e,igEN2jan:l:8!-H(qZ<aaM"cch,iG:JEF5bfVpHm.8W)<:8mg#YpW]g/YqN+?QMS^oMaj%7nQVc(CN_^<
+%?U_:OQ;KYph3VTSc*&mkk,f.9op`CD&1Ykufc:K=%.2mVPkH8*Q5%7RlP>1V(@Qj2GFK9&4N,V*[RFV=;V9e3*?Nf9?&KM2Y'\C$
+%0(k2_UO'b\C2mO!;a5.]5=<c+#%Nbpkm="E.3P6Dh55^o9*.8A#4dTn.6F./MM]Wrh*bN\e!]rnFKmCOg]J?*3k[(9pLK.6"=L:e
+%DUS`s:"*+3p:?><$A"(WW.G5cR&o$FLXH77-AEe<02`9/V/;ps\iK+`He?d%[;P?R?$[]/]M$^H];3u^9nF-R]&df2C"9r*KH/DO
+%_q&.nD`#9.'Z<%8OKC&+ehoae,&"_j"8N:^"X52BF)>[&9I9I-g]ELu_IKB!ZF=sAjf1Ks<cZ0Zj?p$39'_V+C?2`Cf`>fs9$bX]
+%GjZl[:_KU)UH at t(UF?>q6"<nr$ZnjHU*$YTMj6Foml1I%<B]p0,e??K:ER75.)J at 4+0fYa42ri;<Lq0.l&kiCe[GM:[`;f6,b2ce
+%(Qj'6Z.W`)dTk$L%]`(H4f7m#i?"2pI%j-k?9^o*O8I2Sh&ZI=k\c.Cd1fCoT`SghRP82H9"8?1Ya51Aa0(QE<*eHE7?45`kn0n"
+%Iu()S]rB`*iql0m):E<V.uP9X(5^dM`t$L+(Fe5<:>A_ph"BT[ke'<f"RB3;&T,ldj<DG(@jVo==gYl('KB8]Ygje]aRn:/Le?9W
+%^8W:\F=-7A76nF(9+ZuS1]1c2oJSp<3Upa?O3#f'PQX7u+lEoK:8ETPs3;l^@bPa8ftLI7p/J`Y`hbA1r$?LcgH+ at hQ1:lon[A/k
+%S4'JGghNfdh:\Fb>WHrcZe2iu:_IR*&0fdn0l/Z9]2aeMEPGPWQW!s"A\f%n\$&dbs85kMGA9*E;KmEPe860iEuMgTAD_U<[lK?\
+%3pU*Pk&#P/1(H6Qaf0rroVHm*FBce2;pW"5gFp)[2d)aCAgEe<9bm;0n#U<WT=/rqq\pa3joF^"DS(JN1?!],EtMp9BuTqom$sn]
+%4kM^4SZ:iajZ\@CU"D5ep40X'-+L*UGAa^-PXF4f\B5ug*MVF7rgiqH3K&G]-Z*/OD1-_nV772ber25D7Jnk^cm6,&G&K7-`T&Fs
+%rN\Al87^jLL:rN9`a=bQ05^Zrd"80^J)NKEoim>]]C9]-]KF3^IEXWkn][G(l()5[O1kQTA"LI7chkai&+;_h55c.gch(F)<Kfg9
+%^!D)lBpX[MQ^W9K0O:O/K>EnCG5'1B=%0<=92m*4JHYZ)PQs[C;]]LJ1?$_P.$l?pDsW\lWkp3B4ITBaBOkhCV$bMF)GghKe;764
+%5og)>i)E!="ATDN-"%'Fia7IWBB$[L7[UU:,5C\.?)aTa0_dCn=!$OP;(M/-"`_i?Z=6"UV_';i>F_NJ.Ge9q^)aoG[?$nh>'cRU
+%P&JLqU02kZ]`1R`"]tWQf;::X[?KM5Nn#QG7Zs@!)VI]lLHEka7N4i67t5`)<[tNlo/H2slP$`j?.n@^-#SudM#=N]bm_V%gNM^;
+%ZPK8=fk\J!c]mqt,t\Ai0uY.]NZThk[%.fP#+mFbr+2=[?;TYXm+41RCgU"nqjlb#nqnC<i<E6T:EJE-U@!eb'jFqCEW$)(L2,f%
+%K=#_D\_`\"M\O/pWS[lU,Mg",9K<6.j*p`$On:f-=4PYMSPe,Rf]rXb[d>U6&*FRk8%\IQoY1fYLj6[1H)s'4G'>04Br!5tFh/@m
+%F&re#]XdHF3KTr'\i2KFH2g&$L;heKL^-CLO<V!ce8eW[:[iMPn`q%(erl%NX"E2.\W)dN(D.Oo7qD!YhasT`"SC\(#=Wj"MCYO[
+%>,esDeCn%TXn8SgTD6'o`-,1dH8Gff&.)fn>*GLM?.CYrIIM!o.4J4qD`u!.;bi%%GXaDJ[</So[C:tba])+Tj4,P#+0CjoEJeBF
+%4&@eq;ECbHf$k/Ok%opP1,.q;.i?co;_I$>Vhucrc:$^QZJ.O67&W$K`a><>rKk%RTD(JG/%OYT[.<*@O5?K00R.GBge37TUmAH(
+%obj$2+tKOJ,/RTm)<K+f'!k/2I.Cpa&aAOpMBsj^Zm@;QgTB'HN^Gc;C!1M&C'II<_.c+DL=k&k>K5)h(7WI0\r`b^b5@)A]lom\
+%9;=dA@[oU3P"pC<BhJu=ktTU!DBgQnct34bIQ_bk?q(=;ndrG0QbNG\Sc'=E.(p<fHc=UBlmYN7FGNFY#$HRB3_2"Ra,jbUbXT$)
+%'1oEEB:6h5&h5]=58PRI&XZ7fKuZjs&KX:@SU>?JCRN8\16KYIhM9%8J/Ih\l%3^X_(_[BA;[),+B+ at M+W/f+r*p"d+[M23+lA+B
+%E0;HeNO at 8\<b<m/%t>JRl<hCCs"tWZJ+bAsAb$blH4=[Rdg^Z54Ed8?XHJ":fbo9ZHfOpmnbh7R[kh?H4KQ6d^&,\8MUe;CW]PO[
+%&a>km]-?Y>:A`n#WTB*kDmHIf='$I/'1`/MQXeq2!b=52hS2rGnp88knPc&6G4.ij[_$9Q+Itpa<[Rf,Q'E%FY7MMujA\Z>q0G4l
+%?V&4G1QH\!p30P)=+'`)h]+SIV^if52T5"XAM*Wur;-+%f8dpfpu4/YYmOjnP[E='e%8uRpru""B02<GB at YT3J9Y7&q*\<;MgN1H
+%*F at WEV/Q*eXflaEae$1<HA1"4Q)a?.T"o:=gr89s9g at 4r<Ou15pl[[@Q\I.9J at BNiAtAM`dUOr0YmqVHOsA&-?V5)2ONcpqJj1M:
+%Sraf1MZaH+%>Jk0 at QZ4q!h<8`C"g^g7:No/?GnVV(qquJR[j^#(A?_#cDBmXAUS](;jTArelgErYAIdOe?5Up]p at OZ$$a:)]*cWn
+%DAMGdfT5Isp<tNUs*O0;ST\'/TrWg)II0aTXlk2[hj8J`qo[/G<,Yg<>C,R9I-p-=Kr4L6^UPcDrUS,];R>hj7K)XHd,06MoS<2$
+%nDWnUJ,]4Sr^o'3p*F"O:4(uM`#<p@*r1OJE_l!chs$Y_%"G=rrLSFWa2[mD:]*kCl0ii#J*T\@A%\IerL8"RmiHu"icrc2n5b;q
+%Nai-$HY[i$QH._Q=KIS&rf@;XNSd2R?tY10]4-C=P!Yu[d2m9CaY<kpp2;"bA`@M>B:V$Z`*"K]QgDOrG!`+.l]hq8ZBZT`@C&K^
+%qlX'l9R2T1Z[5&Sl=1'9le-.?fLbBOed at I]Q$M<BZZWCBHuJE"e(j;;LTMMU(hY#9=ha036p*\d%'.)S[eSF`hlO<YTTMH"mXE^t
+%hrBo1'Bjf-\BQMDiCgoQjeB4-SeosBa(jKJdq. at b6Z7_&)ZR-rakmDK^?k/=/3J1ORJp at XnP@;\rFiY*3Tn5j%u,T6%0+_tKigDK
+%M]5Nh4\j!bk-uH*hsPJV3h4dBCC(i6KO2fIRJ&W]*ClL]`.]3_AHqJgZ%C(83Q8/!beORDaGUoig2KX;c@,?t4N&DO3OZ/eW>H#p
+%!mG$spOFI-+D)kFZT.6JK`nN;UJ")S1'Q:eC\duVOcPq?:/SQYR/B59jXqIs$_fmF0qeDEhR@<u(KtT)g\+iPkI7PIoH%@K0u(r@
+%Hk'0?Qc'$<'3C8t\3U7D0a-M\%bBQrV]-nSQU_eY`"[<LT:oHeOdH3#]Fj8gQ\[%L"J;50<K#7XD(K*78Qa"G68[Zblj7#`Fpm.I
+%P=g</[%,`Q`kT2l`^ZpY3UUbYqXZ?<3b'4PjgX/*rn:Qkop!P1Y6&T+pO6f973_KN_qiYM+"hi$]=pmJgf#3eT\c8?OESUtDZ;(]
+%MSK+8/(B,s:D=H[dH/*_)RDEYG4_NPI5Dq.]C*+f at rSmnLapHZ(u4IAJZ3Z"p>T0Z2Ap^(ND[\tA:kiW7^op3Yfn?loJ*ZDmNQjs
+%81M-VJq6r7pl<#6.G*u?3R0'+9:i at L0$mVq!*p<MGQ=os,MIR;i3f(;Q at 6QPml/TnSeo>=OVi8X!a;us<\9[a.5sf3iR^%XTW3g-
+%XZ_g+PcXVD5CNP?rBIc]PAU"FN!Gr]nJsatN#7s8\bS/Y28+8l(b`E;/f61RR4BXp'J,29&46UWjledPS:T\0k8Y$1aVuRo,o at p\
+%d;eaTJ%hs2i_Q+-!`bY1o^'6lP'^eLB7BLO4aoC"O2^HFYE5\fFk+kqbS;cd1tHB!Ul3PdH/t)j,UmAUoAH[NRT7D__D)[OP<:Ne
+%[nY#0R/1KoKZ,tHBN<43SG6cQ`()n-\=:[,GLe)<c+tnl/I[Mfa#SBORe8$(>63Z%JTtEb*Z'4kb+lAB@#lAsOYUgB/.461K#ta"
+%Z*saf4b>j=4S!e*qcJ*MFiUrA"J#,f?[Y4 at 5:;9P$^UWP#Y8=lDs[Sg4&pAq_nsjD\F^a:nC=DFcl8?&e1mGCUt7;70Rbl??]E?r
+%dCJWsNXPn/s535"K9oQ2R3f-X-Hq3qdkL8/SueeGm"A[*0l/&K?KGm:MNl0.1DucHPMm[*(i#t]H&*Rh/m30ffN`1KIIXGqEO(%P
+%mG at VLas9a%*<,l=\@3io4/,AlK5j_#S)(=*$hp$d_f"u at +m#<HhFRI`RV^7/Q,&aa=fmT(qmmT*]nc-c/QBT)6(P7!>kfW>h8cqV
+%Bef+/2.m^U][bI*Yfjj6(MCA at Ai$;MQ\3sFVeSMcWWV.4_(RIS\kCh$$+]Ek1?pol$Q!=/HOK#t&m:@[(p2Wj\>kIc*g=s/_qhCV
+%]5a0j?Ofge>DuOB-XE6//r.O20(Q!3?K"O`94jcN00,q8]M$<%d]L!OZc6O#_D&BJ?28*\fKNId?rnfR7,$RD?RIF/an1a.-fs%;
+%DfepidS3/n5X.be'R4a`X0,6o0<''>WLNDA/o8*,PO?;_]<LLF%UEQf4)NF3$Qn&b?=-gV^6)gt>&FA:^@h8fjSG$CDkko+P3PJ,
+%Vou\3a$fbIVU>:.4E%[a`NG0BJ[F[M$fe/+MkpP*HQ.5Z2Utb[J("d_KZa.njA#GP[r3R#WgD9ED;Y&m,,`#$gZY at b06Hc'n5jgF
+%A<$Pn0-dMaWE*#5.a%1flKn=R^F^1)Wk\-(/Q2J&;R,!6qp+c3^\deGph?<@J*10bbc.8Ho;YMS!iu(\Zb6,cX$CqS;CK'0#`Rjk
+%2JDNm?%*i%pli1*F+=3J2cYCa#6&b;^q-*]<3(daNI\'PKMN*9n/a44kl)RphpN4,Ju/a>p])##6H(TcnL*2rV7AH",=&5_Ht!(T
+%D8#2a-X7lFGl27X+E%Dh7XS=@JE1KQ1=[<'5j,KC4$O^#ShlOXM1T at ia]tfs2R#!-$VqKR$5_K!i%]4?$uWQ`ItS3D+f"?9PB"d*
+%;AtM at I53j%3_B_ at 2mBJ/e/!rc at OX^n'"[$m3<lup*IAT%gQL!qnqQbZg-\e[;PIl::u7S'CLbe\OpcF#@RPt?AS]@!c?p$37F#jW
+%RuJIp,L)-a@/<eQa:u'IWKU$"_Z^8E3LKgCF^h8<q^K35)pHuCd(8@'3G`$LC_8&H24Y]MrY<^h$K-Efi(`(/1.s>Hf7X3B1q7bD
+%c-T."h.&.A2ddIo`G(n\fqIEt(nLR$2,<o9kjEI8Xan0d<TW\_jP1MEI^]?j5-CQ\Xe3KY(':`<!_ltr7e&o:L5,3u1V\uIo8u]k
+%U!j:?o)W=3nWGYXc_kgS[%Z#P_+dRG#01fn2k:^o<?$c>R1moa('&5H%rhti&e(==lE$(t:DpBcd5BXu]&D#>F=1%sEefrG?1!WE
+%dZO;#i7q4'*6b*o<D-RDmS at eNDQ8PQi-THk(9X4(U,X<(:905XBJ(;=7gG5lc+:7Ch)QfRc%UF5-<-d7J&8kq;<,qg.So\LrKqRP
+%NUoi!erLYldY^hfG<]itl-)>"hYf\SK[1,%;5Lano/brh?*:^.#!ij,`fBK.'(>!?H`W.;m.&qFOBiX4pG>DaRiH\,(P_XJQT\"4
+%b7a0(K0=0e#N#-h\)&D.l at E#baYf^"q.A[?]gnKtE(!2KFO(/>o\&E at TDD:U=\BB:_+OtnE&TH'kKl&Pcm2$lFka\C at Q$Lh3M4Lb
+%\caF%7#l1b8:7N<#pAfV$As3kIP3a03c%Uh<p(k^dc4C^6GbSX0fahHKN?C,-KiOCUukkG*:=D[q$IAokLT+V1-(`rptF?6=(E8,
+%#0f0M"m2kkZRlR43[8l?U2mC+&`#C[^&al)1aMcN8.-A?\J<CVb*KD3Kk<$q6hacC_WP)+mMLU8O7Br&&6mcXR$stYlGC`+FL=$V
+%Bi1NEPPUIqMUeQo`+4Fp8>nUQ,f.b6g+K\hg_-Mr^'8.AS$k7&Tf$uH_N.X7HBa-Dr=4P8R`YNQ6X$1(QV-XoX]=c4_qPNs9ag]D
+%_t.TP.BULFFu%"uK2ZnbC),/hKes;Q>UuEQOVGocSTs7s_jBYAZo2?dT+&Bi+aP6cXaOB8n,rc'(Sgd4rM8V*?^"8<o`n[RV#FaF
+%T.GDD5K*?K\32"`T<7#TlNf/r-.N3+_Y@("['R,(+-JbFCGtB`0H5,K/)`ANoGVjuNB4aBSR/'dY>M4LW7,P3kr%bu)Kg at c3k\"R
+%?DC9!;5`$EdqdIt2<sfPFo!DZ:0-CX)X<ju^[m8(Di:487*STDi308`4MU3!X6Rm&Fu7";DUT7!9A`Vog1ojrpMfjbe"bf$@t*kM
+%go%p^L?nDI?P^nI4DT3-%m=k$V`o%hA'b$>X833gj7W/inbRb8Qp6n1*"Pg.Wj]YKmP-*]5%G/q0Q1k/:Af]*P%6.;<mp'KX`s=]
+%>@`TlTIs>1CPVoMNN4T7&=9&%'08cq.+8D7%FcU3 at YW6@iBrr)d'AKobMHb.38C-Vr8S!cY:"6J"VmMR1a%PY'S^[;C*/[F^&jC"
+%k=71LZ<rSs*;_,'iQatrMfcquH:/4Ik*NShTjP[lbA+1H2h"bTOP=/FC;7K"jJ?4fRK>SL.5KCchV]h@@@Z&KXgKY4Ac:(cpCc1_
+%6JbA^HO5(TE/tNWCCc*%H4p>jUJ&Tf+MIutQZ;NolS=K?gi.Q7nJ!ph+1gIV.t5H(J8RqY"L+D=ZJo15/qi2H[C"fg;bU=Fl^<Le
+%Q=/L2\-OJVAmMeLcH/XaYANNj+foVBP8RZ3_I8_i)LFZkm7OS63aM3Yk0'bX8Io$Lc#:96c/$c2Yp\rJ6P8(cZK`$L%Q<]'P2!T7
+%h#q8&M`Gf"n"X*@Gh5M?gJ-8fQj.u"[mAmg&J$gkIMLTkY]a$3a,j*R`6lTP`P?F7dqHqWDoTWACPO<fdW%lKatE\S[(9[3kKPO6
+%TDqri`$#.#>rj:_]b3oGK_<D>*>:li1Nb?]gT3`Mq5-s1K!qsVq]p-mmZUg@[qVI6g*r<\9)1`TI&tI4^=Y6,TVS**B\.B&*B^Kp
+%h1,`^$X^"XNBsY$Y,VJ.>"&_G0T'E%G=DWWirDm,YIq$jl\`BYfUmT2enp:b&K]1aG]XFI6)ETOD#V#b*<4<.HH5I8mjbZalGl*7
+%hW[5-nf=!`3F\F6]X$>^gu$[cZ22ppK!g%X93oX]^;QZ/jqW*R]OKVPkfn\7b+(S1Q%#Imdi<:s(m^bL:?qYXH"d<+V&j5g!n3U*
+%e at Z2bK<FE4bhsVTbjX,.aJ+5g7,tS1`atW?b/fN8%Eh*q._!FYeppGbKp?YVF0QR:rQ<q)FYef4/$Q"Fff5Y$grY8]IZ'/r?tK$^
+%-Qkk$/3RO]*J-O4of$j$)cqCfe6Q_=QT8>ZFZ#4lQlhLHq at 0t&SSF`pFM(Oc?0>lokaIEX>Qt-7mlEB>:j9Y]!+n/d%nQcjc%BR_
+%Eha=r4p^?P*k!6-V0^/es%j,4NVjfo'h;Klhjnu<\)>"%rjPM:jXtr6D;fu.5ir^'>b5MPSm;K&Lqlmmo]lRK99:qlj78FiRfIaL
+%_k$0UHqlaV$8VlL6eIU<kAC<[MJuFqG0,H]GHlV]m%G6<UNX9[#QaJr"a)r!0EktuPd-7j"i?<T_8_%3C2l."FO]:I at N[7H0s7-f
+%hX89XV at M=NWggr/^NIC+(Mr2ZXduV;jc'\$4)WX/>THj&32a]#b&?QaHn`Tms4_M<1!8Qu+tj^g;;[QU+`&CfEI%g-UJK<tbpjTW
+%*uJK(JMA.NHDn[5npYMXE7-e;D'dJ*MrW`a%S8fY+!EA--Qt4)&JAT?R%M)F7uI9]&E at k2Sb&'PRO:cBY0nVlgOo<I*t2WgI<gW<
+%jt52<QAjP<=)bO]I%Z$*"R7.U^3-R/!et`!'jpUTb#\uK8UL0Ho>_"1,QOId$0Xs23aKNrq>bWsfg,JaYF^63JM*6rKNVF>@@;rd
+%c88,YlhM>Ne!*.8WKgYeV3ZG,I8&_28IFA'pOn8F(rHEq&8J,/lD^V/C8mk0K8,X'?MKO*<P!iZ,6;R/VTdIQ<LK=hi*;&MDP+uU
+%IfGlrW%<\d;RT:?5ZSjab,s:hZ8_]\Y"O-!GL=V1W%)dnSuR*BNTdQjk9,aMViH@`jdEOe6aqnDY8rBmR=3:Jq/"QXd!j)02)1E0
+%0!i<"@\8n9le!cNEl_%!OcNrf&^l\20mq&3'eoq.Z;3NM11%S[@G4583h!$3\%ZFQ89l[_6WL"`KS;?b6g=NGb+jt:(&b#Xj-ZL4
+%-5`ZnGLi7a6-L)>c$8Ylf`K^KYj%-mX5Jjfc=i]3+SSIi,NM%Sr5Ts4:=^/D<fY^jgh&oO1TA'WmBW:\?2>23[Ckh2/fBVPn"_hK
+%9,As5\u.L4C$Cg,l\:F;PoJPkrFb>SIfIBWBUT;<Nngap'V(stFHUJ/BhtR")GSibX),WNSA?\)&B>I[K9umJjUbI)na/MEn#LcJ
+%LHJM[Z at BI9rn6_1&D5Wi2Nf)U*H7K4>ORpXl0u^+I:Bb6gKg!/&RVRPAQ,lredXimB37%QH=%YD4!2"R$L]TK)eZ]WSE76g4I0L4
+%"0:q4\&Pnf!9/6d"Qm77&#Xo:KtkpLD=_`$>hn<AhTa%XJa4d1\&lX,?,AGuQ8W6kFpol0?_"rT(-([JFZt:TZ#NFC at N#'4>)`[Z
+%F'T.h:d;97CDP,iG0UthdIp6#Ys.nj#97Wrp,?It7it5;8*bqI3m/\r&`N4#!cMb]825 at MrhK2Dc&:50L</-G+q<.[OZIk=#3+A$
+%]64"&j!T+sht>`s+?&)Yft)Sj%2pbh_j0I.*M()BHUbD`G>a4:%"GD2iq2$769OH)4Q6(&4dEN at Y<1Zb#JBJTf,]rR+5TtLVr@!Z
+%LU3=tFr.\$p:Ii(Sn<1K+\!91G;!C\]5ru($@s-?]R*lUDLq\P<\Q(?Z[j,u8*?:$cBcJ#T`]b(ZR%2<h(1P8-Tu7UMqns%BGu6+
+%AaD)8)T`mF.)>p/31^K(m<sNR[UjHDLL3dZaUt.(85I2gagh4AH]h_H3VAb&Dg_hA:mq'/(Fn9,a1GQ<nobsehM%U]N%1J-l\]7/
+%JlA,q),%lfq7.)OI^eA4UZ8f"oR#Kap<"ifrL>-:@kaedbU`*-Hd\[mL^gYhO28r&JZ84'Wq6=B4>tER,:Cs^l?ut%19`Pp=VaKA
+%l&=uW,u#8?A"TRBC[@B]8%IoVglD<C at 9jU41gXLLqL'Tkn'^UT`ABre$*<$=RY.bGo4khegN6_f<F&W^=j=I>/kWRR@'XgA]C':E
+%lI?6,X0kN3rcTWbc$[c](rslll\;m6`F8,a_tXl4NW,F-`RV$H2o>E+,"kMbK;<B8)4OikB<MtC=(cEO]@3c<`fnD7So"?d>;:?q
+%==%T)/A7I:[h)I7i&2a_lL]u`JRd+1m#"%pC*7Wr/NnSZFT<M3N+O1-c?;C7doiA:kQjpRLa/e;G)88GcOF1Mrmu#:F$!]5lhZ#S
+%7boI8$!eO%LO&. at GcDSH[-H+2r.!JC$.)>9Z7abpdZ>40ngVQo(Z&_]DJsd5qP8%=.Df3HgR6Z`7>u8R?Lu0=[omguVJB\s]8L4@
+%]4C9g33:,>4a^/pG+?<)mL^u+YM/lfn[cH<lhe9-s2rr;Q!2I=^LHVo`46VPq?66WJ+;/JDjtp8m/>3g\s+sm[$=9PLVFg_7pufD
+%X1p2ignZ%f,Ob>ulfrh4lcOV at qDP`=a\:lCgMHj=*Xgj%[SB'a#I!WLQ,;i$rXZ^@:JJ0>pN]4"ng;VQ/JQ8T8_?pfRPp;CTT*2G
+%LeB%i:#ms@,JRq:GH$5AGddsMFW5V[8A8sf?T42;QaA!U4XNi<6oY=ghM5F'K_?1c+P'c:>0GPnroRWVi-FgV at 4/tD=9q$I?+Ht;
+%>ZV`u,Ak&ZK%eX(Rs_Gdmr\3TD&Olu8;09Prm1!+<%KYYX*am#-*T8]oN(gpIJD:C5i.Ono)lMAo&l0&$\.T^GHn1=2QaDW3&;D2
+%Pe?CUV:+a$C>E@,Rmb'@(g'Sc]0->9F6\c9kBn;%=U/@.8atiM$LG,&Jj%f[6?JcOJn$Le]AZ>@iDKu.N4=07*bVGY9sOBBk^!R/
+%T*)faFeZq*6DEW-73e(dWuCYNYY[8^q*%_Y4dlTq[oc(F8dO!Q2<dH6k%[LMD_Zpfdb9'HV/KtO)H6$`g`sD#4oLheIQO\F)JK7_
+%8R+*70Jl@']Qq#RZA;)11i76f&s;.l5Cmp]_RX>CZh%)[*OqYE6UWYb8lsqfjkW%Hi78#-,VhFXaUJ3]8Tb]YI(@khHWYq9#B\l.
+%m]97?9#[PZ4]l^\;GQTt-;I2<4TTlRXfQFKC:ME_)fAa2bM(YL4(Ip>>KJ!HQC4S?qq at -.;3Y+27)2kbVH9lNBk<C0nQ60t?`J3)
+%7-(JUV"d]NW[E(l*(]-"XB`@iM9M\qZJl<%RBq(U)d(q at Qn?O593.]AGh$ZV/E%,Pe$JdZa'Ja*PS0&UH3odCasFR0F-+&1\Mn]$
+%d3k]9C3W:B4s at ZNcp5VS2Ci-#HNgsIU/jb)YR"RD*N(b/f*Xl&JJIc*Su$6T"_^0FK`\[/93'"V,?J2noHe.QpqsY$SHWGKmk+fG
+%0pE*C>sR7eo80cLs(>t$Y:"7nQ!Is\P)e2o@#6[0\*g=S='QSUm;ko9et1=H#jlQ/?,,&;nn`+AVF\g$R;NCqShDt4CZgC[f%H8S
+%rc^tn<eX!t=F](Og918SStjH`YNuCu'P(G"8K^5l)_]b4?#rq#IKS<Uq;=B7P?ZH/*Hgt1c#Jc0a!n8XS-?3#+VBVlYsiOAM*3\%
+%C6>T6P%QA0>C/c!Y#ALoHXp]I6q_&6H;1AFc2P3Z%O?^m:f^V;j`RLCqmXMj=%%Vcr0hiFXf(l0Afe99f9UQ3&)G)iC2`FpB!#C>
+%b."=WeFih/pU\]CICm5'h7^-)DlNWCdRD\rS%hC]-Qi(gDtBSHTgh/;CHTk>mj'MjGbUtcrf14_?#TV(h>-qJo:<;e0"=[6P$]m1
+%I_1k^]&M30m:i!^$kDsQ]3OFHdLUQ9J\5+f(T$p)<p8bj*02fuOVLM2E[Yl(/oWn`:7d!F91p2l(,W2;)+1BY-2MP<4mM4R4f#"&
+%;KQDLL)b]qT4No31;d[dBYk\@kF#jNG<0Ec$HXST-@<k?j+a$pGq.pYL&m>!X-1!_Zo9a%>T/\/_9Nn(hqIXnq6__2HF2B2C;e9M#T67La/<a5dC$fg,BNC_)d_d"m"quU/q#[=t&</
+%41+9&+B>TnL3/J2"B at m4lJC"N*/Q&VmYTOYn[^)SpV`!``(f14#E/!Q?LIjG691N;Q@;d6Z2J4;/,mEVme):kk!drcqpFgj^,*Fn
+%hgb\*lhhhGpE,.[+,K6a^/$K=?3<6l!M.hmcE!`6lFan"M:Xo\\gMssJBffbDf+C at q;F:!,e`d'^]*lqDa(r9q"=U+hu1UqR+b@#
+%:Yn53ocNO5V>Js'$t$cpT0LK*gAQLcJ"@a3Xl&r+AX.`A=;5[hpIF'85If17hf-'`$31!cmdC+5rr)l\eUMnH*rk!Ts89X<a2rf!
+%msiU.QV78k^U9"!=2'Z\:VO5Dq60,Yg:&0kZG6*)7 at +s9*&2F;s*i!ao=&T8peUbR.LVTP&%?I-I4H])Yq4a4<RsCgMtS=fYL+tq
+%DsKT2Y>iW5Wc1,u283ie>pc`r_cthA>gE=[^DB)V?En:#G:bae^\B,1o.jbJX^+'&kBP0/GO/ZFmte^rDqM4Th!i#??d4T/&`0qn
+%pA0O2O6),>Cjj4E8hTQA2\7&V]W#)jMbSK*^?9("/9;Ukb$K)ZRO.^@>`a;=p>&Mahh<qr\#g]8R@*>Qdep^8G at TNb<=\J$epl?l
+%iR at -.H[g:lEf]P@?M9,%)cf#VG.d.1Rgs?HDqQ[tr at 9Gkl:Eq at YaQ`IM=@\0#1rU^C_-:+g%q;,mC0_egq[roiE_qtl=N4ahfc:5
+%]'X>f'-#f9r-#a?ANfCgh9u,,[M;t/J$N at lRs>CI at sp:O3RB'6`-u at P+lUo:(&K5gC\dAjD(duh^(&7+D`chKbtWt?NoFQ^->QJ?
+%53ZYp<\n8F&`0qNi;0%3*TDN2>Mo$m]TTnk;?;r<S]uUh97nkM+e(8'5&FGRn?1joj)+hPS!2I*d`,UshH.+?iMTI9?U"t6S'eUb
+%GGaobne"iR<4s&#<j,cd-he-Wa4-nj0E*bOs2r5DS.bdc00+&`DE28meEL)a:Zf9.>iScX'e%c7IW2d'[K,ZXIp.9Ao!ule/9c>e
+%A)0=sPs6mkDj@@0U>*e<Ug\)f"6;X(f:#Z=^O2FKhLAAP]PY9dfR=c(I!KpV$_b,S2&pc4B4_<EZ+8'SSGXDgZ9#'PlDO:/l><$V
+%&c/s?\=ggqY05#XST^!O=1;i?90&PIV=rm&U>C8r^?sW0W]a[&h\,J?f8.u4HsbrQZX/"3l-o-2p!tHVQd320GFF8`Y2UCF9dd9k
+%=riF.Fck35h_oDZ8u at o<T`2 at uD4;8Dm9C1&a4l&=I9PJ%%gfGIDmR#h*q]XFJmnV[NgUji5>gCI8ir^rFX,s1DnbU\JZ9"MAZmsH
+%r#. at 6R\n;I^9'8<=e&gm>5pLIe++@,;W!gd=2jX9>n3`A>$7<*^T`.'pYkimJhhU!nTsa&oJ>Ncrk>`VX8<=_Y9#:0kT at R<FVa<6
+%pA8q9_i%rhFce;[lJ(ckKaP#;`RN`+nsaO3:H([hd;PJJH!BuBIImDPho-Dff$n'tq7<&6e%Hc.$jWFj5*^?+:QJ>"d2t,L7/gJ?
+%o6kpU_e]5gLNW<'4FEX1?*OZg7&I'N.KbH;+C9%>NKsBDhWfnYd8K4n8EtNCikOM at OU[aPH._PN](g,gfAX+c:8FiblH],S#npY;
+%F/Vm"MdQD^m(HW,VE8f>G&LdgLVB"(m+0?9R9[j,!UO4UJCmJA(Q;NR'*5F/``O-Fs5&.'l7'FPIXCd1\"#]%)"R=!c&XM\//IPV
+%O2!=QiBTQ-8O,0-r:j3NgLu7*V25P2$>nYga5:OHEhH7$$u3jQ^&NMX@##Vbk;':tlJq?V<H4\fVi9eH'#<Pro;*_Z3Quju at is%3
+%0._lDit6IWA0LXo3DLHUBZbY:q"Gc"@i4G&.T<gePVJ5dIj5Ocb]PFC,VXZg@=GMHq8h[\hfJ?[YP\u`71sJ#SrNm]p\*e*C@?n&
+%!iKiL1:B/6$_6YTpCo=!@Gc&I?J^DoN7ck_cdY/!mX1VA1hF2mFHss>C5n:hj-[L'+"[OEU8N,=")m/smn&Rs4Gpp'2q1$pG_qV;
+%i'kB[?)G86m7.WpT2V79:R&7l_rL2D$)&-T[_U>SdJ>5^En2bY5E4P[QZ.->o4?9us*)6VjZe1h]8s^]#eL"cUd+^OV_C><-AS-;
+%gQ-V_.WW at fHD5Foq",C&ALIES+o.AOEV^3pr%HrT56L;j$G<M'$G?<7\$F)ie2<YR.,cdFZkNNs,V\&MEb8q9]3:/fR#;;"5[UQP
+%34_8Jk)&cQ#1GQ3M3eF:n%g`he at V9cr&W'22qtI:H-2=kibKNBQO3,QI]&M%kC<$6^]2KlrUT]4qffgR`UEfje,K^KT0E=*n[m]W
+%_YtQ?rV:s<mGEEi+7Sb!l-l:'a'\i.huD^)k9L`9bMW8R^\k8jo\\q`5QC/t`kVKEkPt)@J+pFerUod&J,,#;s2FehkPt7JIdu%)
+%q'B([s+^PLc[dpJa"hR*_CJ_gnCIc)ZM=gNK4b3298n)d8ef?YPN2>8&U`5@,/AK?NukI6bOZ&]L:Tr1%34atN\F4Q7=:\N1`.t'
+%5Q18QOoBiO)SEo!,_,IRLlepK4RO at g]%*jOTfii2k!3M,J=ub<n[t>^._h;(@;)7F4h'`2"3GYo?h1gY\f1SZ7'mMD=+e:EaV/m]
+%X-)Q/[!]P*KO"l?&V%M5pJ:h4\/J_"-0C[sHWH!/QUiXJ'QXaTV.TFO<@X?oc^anYVMX(oF`Ls$Nn[)+A[YpK5N`j_AR'tnHQORo
+%2X!M:8r31'-k+,8&oT1fb1i/>Rj!!uG?#C.23L4"H22`gT?#I"m=Dcrqd9"BR,V5=14;HA=0uUK.NTgV&br1ecMJJ=WP!GAOS%.g
+%fL+pncODXZ$eKq4b*4JbIa)g2/%uI(U*i\O5=olFdDh%LS5e?7-s)?dQ#Y#AX2=UB+G$'Rr9L=\V^6lL^AY833hud'16a+!h;1k_
+%p2V5\]T>.'I^p$JpA'.\#eXDuqq(i_hhZrMiu"pXK"qbf43hglK"V_Z_K/KN3g)bP\HFDZ\_N$-M<ag-Ii3Ii4/ic#$:;p;'r"Iq
+%PsI.HJFh%LQ.NgJf`lUq7'"=H)/-7tN;%8jbIAGI7?)hcZLI**&;I0MDoaGlc%"7]/cu:0U/-&'rUDn.UKeOjbK,2#(PL at qb6=TE
+%ksEYu?Kg5t+m05"HdcOOJX8Cc?iSRiED+[?M at b$+Hm8$,7;-\P$mb=/pl>4B'tJhl?c!QRq%i;rjWAsKlehX2'>FHQIOR"/2oqnR
+%jrc;TEXP\@q=,+Z`J=Du\E	B-;,.r_HXcs5=TNW)ZI7cY!tgZqfs;V^akrUT]"U79>l\%M&r"8bhIenB_+_N^_tI<d^4`<+#b4
+%F6W6;'-]I/$f_akpfCoYs2Q3<!;/SVNKE;#5Pqp^rq$0ga.:]ZqTHYLg\K1QrSk<$r5ES=rMRF/N?6X\$p.F[/1:Xo,f5HU at GrWo
+%g:X$9chB0L-N,p?ChB$_:1(WKptPPfI"'u^S%6K'1+)-rKVcuS;1*j'Gt;aNF-"C)f:s^I;$;Ke!J^kPd/lW#N!WiF-6p8GP>!^&
+%5XarY6XdYim.=QarUg[ZW<<2E/pj^5^*'$dUp0b1hq>.\f$?JhZ#PbF:g?O at 8'<RF%62*YeWogn,Wm"(g8E8u2."kJE:b'6J/&Z'
+%lHrCK_Or]mf6M&-O2lN=!Gk80X6`Q>DDd(d&Ds0)NZ6Se]f\ccr/QeuQ\aBj])0#4fip0J?R>&`StQ!@h15&6RK2F3'.=54E-l8J
+%rPOK?]0qP`-OLdf&A[XW0`k_0MR0["js)@[/Ns"t,.YrH0K;Jh)#X0. at fbQV?sE81JG9iIKADYYI(R"H0U*#_GJDG-?i at 2=`m4G@
+%HrsU1r.AO+S+4(bF`f=gl#Lp*PO)\<CNmCJJ"5-es7iMLrSljUs$e%Ds0m%*JM>Vo:JCP`a at Vdm=3OgnJ's at lMkKuNjl'Rc:!3+H
+%Z:+j2IA,7ZIWHG))e'AP,f1b3L]RK>X_/$9eGljJW7uReV>4InT0.TJM. at 2u^khj'"#]O0/@<S"nZ)W--dFe6Ij,Ch=dkjrWCBo*
+%0)P[>\+,5m[`.,G7s1mSB95oUP&^s*s*=8)3HVa$6[)$_L[G5Cs/_p+qEO`$?&6At]g?puk\cI6>sSE(]DJMYh*8mHr[E$b.q3]s
+%iO7BEI9RT$M[/QDZ+GLCh>L:=m[ms4^N8c0f;*V7rGV`(GQ7/>s'MDaci1C\rhIZ;BQJ9C65Q"bs7madpc&6BK/tNc+s at -@3(:?`
+%aJo=-O)8Y/T2AhW'C%9&iE\^4PneG!:@LZf%\eMJpR*Al[m0f.%u2b$J!ZI,.`LPu+j79mBn?`I?YXu0Wf.)U`5.Dm>^h2=!CPW>
+%`ah^S5urD3fT__#YU-22?a1a^S>S1[3+4\$OubmWZDfhu0Sl=lKBr8=jS*M3Y,QFB*dhq!08AhK at f]4,S)9X&Npqf[(fXQt&_&.O
+%)']2HR=1Lu_AX?VBdb[$8SA*icS=/W#m5<U'7:q3;;`'="5nQb7^^&e`b*!pK:2dm&i at BX/>o-[bHMs]+:`B28V%'#=AcT::a7]Y
+%-J-1"A[Q2.-Y";^"be84cZ/jrb=Rb,5*!\2D1W'a"It"]N2<c*%pNj;nSkCuHpZiIM6?CUkDEM,=Upe^/HGC\G`T:?%,On,>hZB1
+%J7h@$SdJJJ:;+1lr)**9U@`47>.frb0\L-h-hrp)WeZ'<;&m"b?m*T5-Rj'^>td,5,93,RHBN3oXgEKP)#*3H`\603Dj!DFPuk7c
+%;H*Fm8X[!7PhgmNn,/KQG!84q->8s,.iSuE4r=<Z[bl at XdHG64R-"f+[M&[Ah:lWQBc[c9gLIjd5<!RHJ+!,]r[4eNo:MKcrkCNQ
+%48uEk8GA,;U(K[mXPdCm%m$Dfpq^9U>laN?:3^#CY`:D!)4cg-<-0>dp`*'td%*50T,-5#b4)9eP3`<H$`iG8XAQ`[+,j*+###8Q
+%Z,gbuT[S+SY=;.l7S+GjU++g?ZN:^/V%Udq<Gc at Qqne7]godnW6tg>.fNPXK*'@m_dmSL*_^Tii,d6jO&H4e5EY(+T'^_UHQ$*XI
+%.q6USgPsiCFqc4sHr/2$=5+\hlFLm%p6H(K36%/E/3Id+E(d@;BR>(<FuO#kl'KGr3PWU3D^aOc4*I--ca%`lm;!aT-ZP<J*PPkc
+%_B0S,,4$[0frGLk]t4)f^1.LSp at 2NJG7G<N:UHsR(t>4`en>*m5Lst]MCU0_5u>Hak8uuYV?u_2.4T997!`Xf\;(Y1JTp*6%>GF(
+%K;8%&'*GKkgr\a%>W4cYnZ(&(4q=.%U[LiAk-,()"m`@dD./Vs,+-c%a!C*fFCLD;f))f+Zr,SD/pH&q[Ip02VSE%;D#Sueip.]Y
+%'@k#/4*CshIN'%KSp%WBel6+j:5d!0kA&?=\dIuLM^Jqnm['oI>0#b\'kNL%'[CkOl4]O#K20/3F;?b^,L^3u$'VI#*.C8TN)fT<
+%$WoW[!"0BIf>o7qbr(dW3+UdZj!s;:?(Bq(,_*C#(O)Fdo=Vg!0n/\Pqroc"Z/\2)=OreOD&M;bC#4pNN28-)lj2t^9lB3>8*F/&
+%^H.MEffdXVEVu.n@`se at N-ib0^Zm+/&btVO06b6nrd8MZ\N8WPdsH/HNn*iD3]]'?h(Etfc`98ESM&%UlLjh;-i[4eMHJk=CVi[1
+%oF"A(V[7lK+.F_HF9hNGJ2n-N_2ZrBiedB%A$<phH[$OFmeEs/22##am6 at oq5Q1JQIFCi8@rWFhBWfH?\`O80]B.%:^A[![:Y*:"
+%ZmD at sWP,%L/J2pCI>?oc-aGnIa#S'us7E=.?]a)BZ[%eL6'ZA\gZV4#J)HuYpE(bB'oU8si=[d[/M2,,F=V4#p\W,Oc?F]3bKh[b
+%*XO'Bi`GMDB-4iFr3V6/bH7CXK"0\:cBk7QhcT;1Bm.X at 4SO7"]s-?5p%Pl(bpCoeoiiRrM?K+R)_b(!V)`Lns(B1r_p?HlJP(NB
+%=m[!(&GRBAERs6t>_pO5p2aIEIieGFM at U?tXUMHeS)D4l9`-`a*J"-GbM;KXOSZ+MEp2n[X+@>-#\]+*-n_<K?B97ST^dCr-:r%8
+%#IBG.hN2+L1?e!m`PqA.QB=X;<D at 3,LaZiZ"a;aqDD03Ld4\9ASL?QpH@@t#l0(oa%L2[7V1HtuXa^U7Pck[]cVs^A&Y`odI-pRX
+%Pq"BtSM":CGOg,Wcaq$i:=Ch8^&9n`!ChW[GQ.-T4`eAHo&Fq_m,N(R_Rms8a([57rlD"T@",nZCU0'qB'X_6*d?[nQ`&UUf&Ikg
+%Dqf<K4i?(Geh%\eE:!Hf,kVVY7;_T.E\$F;o;P!DRfMX;f1ica]@it!iqQ_q/"8UNosh@!E]2N6d/<0"VL00kC+<RX%g]e:$-cr`
+%fRbbbWpAkTU%%m,6$47q2\imD>o*V^g.!%nXQ;bU'P-h.!$AS9Mn#<3f\B4nWXRu&ciqsF_u"R1lit#To-H,*qj6_$3IuMGk!/^1
+%&_JPoa]ViM=8L+"pNUs6bJg.?Vjs*f\*,Im-_BFfbUUThkV!G]7Eot%/?h]H(E]S=TZ^\Wj'908f.*EHjafQLFa(K(IXZ=c*VqHp
+%,X;o\$2$nL>lMVgBY/E4AMY!KiER&[mODjT"Q"CTBl$!2]U%2t5OWOL>n9%\]\3ak)r/1fV;6]?cM^$P:Vo,;?$B'6XnVaYX*s/s
+%hmr3b:>7;hS34GG?guNa]Q#?lm_kCmpU%N*l`\o,(.PS:<$+&%*L05FPT>5&KkH:_ji/ON$K]:cj-l;Ql^>E/&K`s**.CK*\&O.T
+%_#Vu'LNg:e!^*6G at 3d*?VlCc]IXfsl-C849a-dr/V;:\99tn/"2Ei0u_2tohn#N59*F#LbWh%GE\eXS=R30C*PK.Ot3s7]cH,%Q>
+%G1f.\Xlp1qW%p9-O>6ZpLJ&d9`c<sB:*Q5^C=B)>%!VU4D><3Cf"0nX0DY:$\Sn*kkF8`%92>,g-2-/sfNk/RN%QjNN'u$;4BAm_
+%lW<d at -a(I0-Y4ScUhpOe2-q]3XEfXR)YE6r+J]q(U:jL@;@PR#VPKo at FJ1n<&Da+Vb"WU.c_A@%g'(SL5i._\iFP`OQfdoU'Xpt\
+%k0%$4(20I^2c at c?g\j!dXkMKD&+itlJdUFU(Ie,$48EjE9,)*XA"4A\Fc(l&[!ccNVI0q\MV_;G]cjX+"%&pA'$W?A,534a;h3=[
+%?u-ccp(LkJGA>rsol`F#[f44l:Ef<NYdTU/gI/l+K71"g1JGBF2o=s?3U50Onh(%3Mhjb9!h88RO$n'304t;J3h!)'iD0,]!S?.C
+%.RN!qjA6<<Y%0`8<:QM__.h^Yfd2aIE1u5)o[`q6=*P]LFqON]7sm$$0nARlH:0k)IKk*0ppcEoATu\r<];r at 9HmS9H7*<E419'j
+%-ltI`7h)%J[7B-rg"V/4S`&P4n$,'C\@QP4iAO$m75X$gno5Hj\I6Wnd_I;fD\qj9N"(0]^kKM3KX<,;*I[qPL[A%"?DH\qZ[JNR
+%4_NNYDu3-j?I\kS^/4fp0l1"6$[/jf9j8sQ]fIh8g$V<nYOCLB02fa^Z/._23uQsX5Q'%BK2j]+l3E0Ys.=f<2qPS:T,3Rg#ftnY
+%ieMq)IQ+;JROTgV[=[[_i^4jdr=0>dH-e57p`%TV[0G_;*<4KkmrKf)2<arr9EkjkGVJ"]9sofY/YC7TRp"U!g3mD!5Pl&/&''o+
+%="Tk*qfi).0>;i0LQDK,n,E;&(jrG at K.gmHJXR]En at qO#r at mPNc_GMH;%crPrDhJm`hMG!!iK:f53]j>\f$=aQris?'+"F!:/c)'
+%$n5fAC`86c(`<ro#BM8UQemOtRLb&6,SVYj,,&&(2/bZ[co=B5-*7p+lX_tQ]D.c%LJD4i%u5PUHu2HgCMO,[03$IHq@]6V9h0(*
+%Pe9ICcdj)e"BVCKpJ[VuBXXBGEaP`568^l"[5<9j;-0oJSS>1M<\CooDa"9/I!"jk`<Op.D2,$qUeeTK]RBfC2C$V&:qFS>::_pu
+%(`g+)8WqHl7G`q'8)dhb5@/$QQ2[S\"W=`jr9hT`?\)Va'<HgJ6AD&%"W"246 at WtcYo$10ZiX/Fgs6t0Wkep>"3t&Z)1<a$huE+W
+%2W*V<Pg`\u#X<&[DK5:nfP5`ooc$$"f:/"&/]Ij4jP\D+Y3#m50K*CHS0jU6R*dVY*c3=\aa/FaLGiQ4RfTYIWMXmrN)6OW(7q4]
+%Gr&V\@-NZB*&qSY"\5FOBVaY6dTf4$#_uB\_"gc1>-2:^g7n>R+5fd!9oDCspIZ#ta9$DD]$7rTTPm"(%`USGZPGUtRej2e44#C9
+%LP1>"DeCSWUsr<9(E,1bEgr6Ul[@(Lh0Hu(ijs1U4HLY<B.&Y:`Xi^$\d62^"f88a-._E9FIQf3cCII%RVceYe>G!dCqt<[7[VVI
+%`+Ko8_l(@=F#r_mPY,j"T8BlZ;`;#=gNPkm<NK_b&T>UCK82Hn;_gIXot`,^Kg9&72So4VR.(s;cYM)FRC.412La at 3i-Xo(C"e7O
+%FlPom<^K8EO%%(]E2nco7KAeh&'SQA"Mjja(u_iNis[(Ml\R<R.dX+a#c*MKKsgI(]Zh$g)k@"g.?+'kb!&+78fC'"#ej95dGbLa
+%`!lSm7c`Yb;At`j%pN-'.3%hJ:NiNH%cjOS6_hknq]]:Z/Jk2hAIraa857O#P>)[rEU2R=B9Xe!<ua;S[L,]b2M"A=8RR-uC++Bo
+%DlK=?E&kW$?4J'9_BbE0<YJt8Uh86ul,;(G"HJmD3.We]3]O.^(O(c5B;!n+O>^1]Qb\B-kA-SYZA at Tb9)Yi_PC.;gM_l_](!>L(
+%*O:/!"b<Q`;e6"ML+O&I</a-B:ie7+8>!,R%-\WUZJIQ,/g6f3%L#IbZ[V:<<Wun"A at t)!2+*@Y_>SBu at O0UlH8JWj,eK!Y4J='n
+%!RI1=X+>&$A*j;b?Rm]IE.ik&nQ9=f:l3B2TlY#Z_*`/MZn=rlIJp`i7QjpC%+Z]3-?Q>di&(49&d*"3f(oS?+G2KG!i]n2\=/Rr
+%ZW=@OnaG*5"dMfP'eriu`b.nb\JU6VSV4"3EHL%#k.=unL_(@Pip6TrR2]e`,aC4?)JX at 0-uR/AS9bg0ULRL=:4M&-*JXLh!l"OA
+%MZnFd&0nRf5`ZV([P8UB"K)_Y2"=Mo;,ljX2X4cS3NhiIpAOHo5EqP/m$2$RCPVN73O=6[_YqjsIK"ZB.YjA.Y=j)i?0&]d#J^#!
+%HIfkg]qsY**tC6)JQYPEKVI)bI%'<2fL)Y.o_e!JM5"SrBVoj=eXu,8_J at IFmGu48<&A7#@dAZ!MrW=J&D43r%TKN%3A&'#5 at 7U!
+%-;ZnJbnc'4'OJXf9*49rTgc&>2V=:ges5qS7^1Noqrj%E4QijRNi"d'mHe_Co5P%)[rKt:(EV9i0aL--JpNu?eXVNuO$MAF4+fe;
+%o:RF-X,9"k_E^Y#$AplpL\CYpO\i"Drf-_26gkVE5Fpi1Ij\1[&Z\7b*[W[;(c_Ru='sFRi^Q<Fqufj')FI4o#+S:BQ(C5W45bm0
+%,,=ABd!@CU_5uq%VLk%iIB"-&:cMrFP<S"6>VF\7`ito<hl+O%T-6.cq,#nYU,!L&<B"u/[@1SdEjW9b)oIMP^@hP+2`WOl!_-cG
+%2]Sfu)2\gmUbTu2D7jXS,uB!?au5%0D's_&*u1 at _MLBBB5(tr--N\@''GZWA->?nJHHD-`-nF'B+F,Qfjq9!MP"MFXd(CPN;^-"n
+%I-;aYl!8)OG=\XP#i1$eAXH_l?QWN79$eLSMCYs'UoC)!"!319P7[]lR(lG<iSY-Bo.c6+'t%T<VkAtE$kd`aHNm]^]iFebBKRgg
+%_>tD5d=L\(K=5.QlKZ%pK+6'n=&e:W=e(aSB^uJTZnICOP_UgMH-n,kb_Ep'S at ntF#N+J+K53\"iO at 2C\F`k$"[55UM=6;'[VH"u
+%T#-rg'M)LGCE(L]-8?Al$pI3#)^W9En=:M9fKu/qZ%]$KG"%(n>E!i*Mk'obiftRaq&=qtLdj2.46XKS_d\XNE"qL`.71$u*8.lq
+%7%pf^a(:s;G&df.?]a#>i19k)PGJP!#b=AT9Pj";(B\/;i7fR at YBTa=peg(.>4G=<KBAJ3Mul):EV9ZUF2cMgWcIHRI`Io,o]N+d
+%o%iDtq\DC%k*$\U.Bt6^25BI^g)csM.do5rj*KTuU'kuQ7n\k*P3Qr[DPi^I.\U?$\Gc1Vru?R/iR"&I]fN"iDR*X\4 at aJ7M'nO(
+%2,Ue;pS\-DoD1j?1OkZM*Y"L-4RAL7kGJI<pd%>EWc3 at t529*g089KXD/?Tr1752:ekuC3bdT(Zl,QBH2oShGB.AU-0DW"Yg%RCb
+%+J12`V2&mK>7\X/mM<m"#?d%?E;\3YY`,eqcnh=6 at 4gs:\Us:!]\/![0\1BZLeKGVNu:#63"ZuV>A#n6iL[Tag#+IAi*a+rKSIRo
+%`EIZClPfa?f\,8Y_DFHTnRT,Kab0BVRZO028fc^2o=[_5jHJ(DRZO[o,e&A;25_mb[c>I79W]0D0'I_Jk?-&?"IatL^1fVd+#ME&
+%HV4Sj8m`2:m(]IrP<T9VK!fT3D`jTB$u`iVfk5N`FQcrAn+lT$1hiMVns6/R![_1_okoQ&-\rf\OiD):OfT:8lGEbU_C*/ThcbeK
+%88/Hi>;KCFW[LQk`b)RU_1$:JEV3JZMe`u*3o>MD6&B`96[)%cl0g$-9?W#_VL3c5g7#q[jY)2WVD+OZ_&3=)3(fod,i[u\Wdsoc
+%Agj8^:2m"&'>cLH2O!<dqT,^6o',>JciVqFf\-r2AQ"dJWk$TR]=U#*%4j(`W]$`hn#l*?6HmRUm-]>l$*"@<@e+Ng0#<DZ<o*-M
+%s$>_6pOg&G85MK)*V*(8G9mB<H1<bu<A]-4oNQ`s'@dd8;<>34-[a&#:65@\[VCQgNZ8>"&+Qs[`*HAQ)r#ee*RPq!!\m&&q>`=K
+%jgV6sIKI]c7Hu96>)pd0bt;k#q_u:.:(T5m@^&L/bq/PJcm$?m3.-IF8<ZPD+`O*A2=9:T]O>Kp[N/7bc!\%6(0*6"Kt3AgQa..8
+%9R8-?]-qk>^d,.:C5m<a9q]-^VAHaV at 0E2>(=?qL1*2GL7su=$\r%?TP]+<t*oIga`W&]qICO at PfrW5<Sg=2q:'/q-R&LPiElS=/
+%*rrqX12s6f"*P88$)t=KjNhpK90E.l?^i:%mocIPCZ#I&'\eDh&/]:R]Ca1Bo3nH4n<u&J]Z^/"MtBmWZX;Z'>`i;S8a41bo^H>o
+%*W`%@d'?i]n6"&dp1aKn at R`H4O<fJ;it!l%AR:P3As7<TLo"MWG388,p2PqrW2WY`_!B4^Up)r7kG?r=[C/e3F5&rQrW3K_Ogr!'
+%-I1"6d5:E=gC2:45>TX&B\T*7C0)?[qhXNGRPlu6_X'!XbNC\Xl/ZO`(lQK_Qa["fBI6SFI>2pNS>_)p#.e-'*HM\MjFKK4[P<CR
+%]VAX8qf-:6cL*SISO#:u)khV_WQ\$p[RHM)$tdr4<5&B<[P!:L);LW:bDdL?&ja]61$dcqf'm((,puE+F5+:JoJ5`OdnSCU]&R`[
+%3okk.Ou5bVd*_9Q!rtUhgi3WhJZs,o9"a3R)57B)A0*(Jd06bUp-esq=3/MiI0S0COKtd,V.D4<!Q:&!M]EidjAdu_Zo3u_e*$GD
+%^&k$;S at S0<#FrfgXS1.fSdto<:qi0)\n$1,%Rt$^=OsDZ^FAc/EaFRimt;d)T+&Fj<K2DRaf5b/]M;F%B<1ua98KN$!KZjoob>.X
+%j2&]+9SX*Y+\W[<^5M)n)CT4V[]n%GXOim4=Io01A8f49-R$cOFq`FVmAtE5:LJ4.4,8Nqb4s!l>_5C5<tZ-kdkZ`N,.O7]o=Jdk
+%Kc+jcU(oitYC(WU$KJrl,L+hL96l"Abs0*4Bo:2>&B5O?"8,,>3b.]/#L-W]=Jsnho]&UicCdpF,U/iN4[8_r!l"7NM2Q`UK0A-H
+%pi)PW1#o!>]b=.=L4DM6E. at is1;&.]9>7DpZau`8r9ep;;Bj7Z&'n39N3rpr at R68X%uY5Hg8IJl;]7R&Zb2"MWQ!aA<jFcf(l>q#
+%p0]25:.<X?ha>!D*egM[YQ./%2eZG9JFh=:r)32&jHIq>lELEPm5$A/X;ZsSkn.[1:N/("N:c?E1S&oG`UA7N%3@,O&W?:m#CE9>
+%RWZC3/i!I[,$EHRe-<SZ`IeOGE4^a&%644+HR()4s.0f(ECgmN4*@!f&/E;S<N,?*"IfGb4>NJHQK!%W]j67dHIlgp?,NJ\28_s9
+%1,LhM#/IMar(VANOI/ZtL<eF=^mDuLhYG:%cr&V)p6q'YJiZajmFF0]3-jN-%0k_t3Ya7Vi!NnM*nYB"l6`#FFp#t(kftIn$'=WJ
+%ZF9CUnkg)V/OTTSBI[hqHNc[8ha"63cS4,u=A!<dG\rH%TgM`F6q8;r$**kZL2*>DJ6 at -pKmMn^FB>lkMDdbd?mP\6%S^(Qg at i$s
+%DhY8>XEgIljmPmBjV3o.\:"DI_aJj=1FO5;q.q,8/_-PMY&]r46E;8_EUok0g+NK(DLTk`lOg!,8q0\oX"\Pe,ckO4=FmgCHn?[-
+%duW#%_)6>\6joI:JM3;.=^16ajEtX2E^+:/3ePWQ)Sh>p0tYWbfU'HVoFEI#`C'66]A!B$3,3CZ:7I'@_8?o)GRe-.mVKn#[,k!j
+%-^@!AAi<"uC"^X#^(W]ONm..CUYT3%Wh^=@pQQRjBf!!\/bu)OAIf-DRV"G\Rj$^q(t0;+=>tWsfpia\m*lnUPr6M5::R?G?+6,O
+%hUdK3/!T%qjM1oHCMcLBhFP>eBGBS,'9_-L0]gqQTZP;K1t##?VNgMJRPnfRX_2_\$3f)ab#gIp.9&/8!62enH[lRXabEP:-ugmR
+%of4f3aP`iLa?3G2F.sF;ER"q<i,H*'ZFEB.[%Zo&P-WBs#&t$nP at oUGPh7tH]B%NCac1]B2qJ_oL-7'm&4 at 1kAa8r`,6*f^*<'3n
+%A[<#WjIK\5cCFOuE[jT"e%j%L`!8%PfR34F83Aj64`h6EHs27:_M#DJlZ.l)':O4p]H#*=co?kd$DeK6M+:a5<0gA8&uB%[K4mc2
+%2Sg#*bfM'p%F-6Z11,8XV!_B*!&f.FGfC;[cEXN"3JD4=FhX4f=3u`d*'6aX]8L^[/Nd0=f8%8gOd-f9,"GpPg*!SHH2c at OXj"^h
+%RFYhYZV(JJ214ju51o9._=XTu0R7Q2s3>'T!F4L[F(oSarQ[.(O%g[UC;RfIl[Rej]W2ID2\!N'<-lioA5rR)Sl"@W%AnGkSop,#
+%DFt9tKD1R6q"?]Tj;Y5aHfIY%)kH[Ca,uWa2,DIY_<Z]rbP/`CjZAqaHGkG9.!0cn_g72q?I8cTGCr9h>$r5`5UBJ0(lrCG2g/,C
+%D*2R1T%BZOQ8u#9KC9<D"KaTS=e7mZn?JLKRu+oSd`VtD8YT<kH'EB9XVF7fOr`m$!`_6'HA&jH])iBE:(7KcKQfaam'YACOA7^"
+%"1DaR;I.2aC;01_qdQ;pZHjMVXCDT9Okr\7AC[VV4No+PfAqp<AjdT<q-!CBHr;":F?h=.LVWdj(k'bhR<;6blW-LQqMpg,TiGb<
+%2GQIhA0PXb#:qdB(ag'59%:T5MSnF7!m6aq%COPe2ug4OIdLEB3<UWhQ]^/'[N4Ha/Xe^V\/mnIhoroBe[!snEs)oplR,>j:nF(T
+%4O<LD*OjLg^i%giq6PjL!'Fg6L6tsm"'dr0$g!DNMC*/_?E1g.fViE#b`cjo`%q$pl&ppbNQQLJGtfEArlYGV8[E'*AMkn2mjC/T
+%"L at 0U8i=Rd>*G5I]pS;XgC@%$ZFGcg%>dY>s$d9?+*0I\JqRZN#"oReEB1<)Adrj`R$.qDg/YFbF._EaJkZgdrMpI<,0&R.8/dce
+%mU>d=:C2kt6RIJ]N]T+_)Ys8/<_HWZ#g_2(.AF2.[bK?)X3=n"-`%p<2EClM?lq5&'ceg>Vb*Y!3%"ng(Pa;?Gceb=fOe`k]V7$A
+%5*<9TMi4ru;kILTDQ5ic`@:&75mbI<0WC\+i*kcHaPS"3NBNgi=F0t0=9P0[gR;NuJXr/<XJ^(O`QTB;"n.p?Da1Gn_8m8!CTgf"
+%c!_c(nt]-2[;\GH,.FEVU4Kq90]c4sT1!N5E-NZ3Q4ZjSBIr6<Y8N?croI/C<mFk;18Ha_-]P=8hoCpE)5HJV. at dJj_le8G:*GbZ
+%A$d,6\K35Qk"HS!n[I$9SH(ZJd_BXR0ULX0mB)Ld?tT75BN%l':qm2I8jR[T/;BGc_Ug7Hn>@Q`9:WqGq'JueI at T)bED24\E4uDf
+%fXsOB3kTS#aR0BG^,bfpM8;a_=?Vcj.[F)DBW)e,(0;'QCYLSIi5ZRA#]TDiT[KSEmB5ph.prbC at +b=tocB6R6qL340^3154IJeZ
+%;`k:%Y0`u:P!rGa>D[)8^inO[DeUp+0&dOUif1GsL%Z=O.0X/@:;ooS'0)A(./K6*0[[tN5'kJe`V+#a&g/FA<k0.h-aSpe60WgB
+%b]p3a'45r^(>Zl+L"F2'&9uaNoKXF[MJkm"Ku[J]edo0GkldiS-Kks.H'OI5T<B,)7db^a/]1++p7`4l^'/KGg)P3.iR14TJD,#W
+%?8UpYeZ3T0/T_<4&!j#&W+3D<4nkV1j8g][a66)aR`bfY(VRa'[ubh\U?6ROn'gMrL#,oXO_)]%KGBk1F+-jnX@,dVYV3_3Ab4,f
+%:91%.TemY+;"qsGiE0gll=ke2Z7<PQf at l2.](40B`<+6G78.kJ!:rSdb7GJ_a0mU%P*Rh5ZF8FS=!:`*]7gp*o^mn>bd7D/&-f5#
+%K*b9k5H9oJ#!%#?*hL^nND#1%6C&p9R3ZG1>KsYmCE;APpeo$Y4ejoEFi46q7S/"28mG[3"Cp7EBG%*3qrj64.$sdE=f6#q.'gGt
+%9Y/X7:_om01j1g/bG(4:A"%B1Ts at d#%]1J-(2l`\N'6ko+,G05WD+Z#6Z"^Sg`J(ffu*B>0"'d"q_4)F!#[ZFK*uqq\S$SgQhQ,k
+%(Hl*<(<V'Y9 at hatJV]e at 8UD>#rP!u)^.n&1ZpXGJ-u8ntfu1:FJM7B,N5`.<7opM^""Easn#j\f#3n%?&^c:,H7"ig13@&ag*[%F
+%ea[o\/.WQng!i`p=_J/Q!8Y1=8_lQ2/R:qXTG8jmVRkVmJpGm/?/q7mT7r"M-eZTuYBD+[KB1C$NV6+n*E";cVh0J7C-a.N[jufl
+%>'.PNDVO_@&R?ac^%L6G#U2KI`rb#s9T at GK.sCu4$:@J`.k%6dmg at mtQUS[>O4,#Y%:6l)d+47OH,3$lW2lTKbgGVmR&Ha`gGE)E
+%\9-QOCQ%JB/jLINVaN!(<F0Q+^eu,b46K6n>P.,/C`0U,>V/\-gQXRpkYs)H(YX5RHKN/5Us9oW4ei()F;bNN`=fn>/F!Z0OpBX-
+%e)^>@ItfQ2f!r.faOMO(+[f8WT/TVnFgZ2#0;Stk>(7>>hbhsdW2QM6]%p0SI:(H6FTT$ro#!&0+h:<_YkL3=IaXt[G4MNnPGPIn
+%7`@DG3pWelOpJ]PiOdiOgF4te0(/u;PK9MPh7K(r/5NZDJ8XNFhT+%5[*bQW)houP7BI.H?njRQ'@,gsbUR/e4]E>Z[r&>k;=%h2
+%WsDjH<qB2HEc6GlEp"'T/O2tD"-D2W7>:@m0&^c]nh<?;A\1ZRRGqXb6Z*Poo3$OD/#kLC0alf@?.C:0I,g:98tksrXHZaG;`ZcO
+%RS!)X^.&VQ,HIR4ZZj:R&M&1(I[&"4/'Q`,rk$Z).u#iUiXdf7;roiQnG3XJAO$6jC$:eV;7.u3U@'<*<2:LS%Ab.T9mjH*.[a\"
+%;LXmn)bCE^!D&8tf%Xal9Bus(kUhf,L#"o0dH[2n;[PJ-eeK,HjTOgY1[PD^!dcu%rC?+fa/HUtm[St<JXNdsebd:2:okBC&X]co
+%A0jS\5B#ndKm`r2 at WJ0Y(pttpicEp<*9pMk&ePla\_0SQTYQGI/f(TF*Ve>t'g1>OF[<'WUjIoHV1aLB#LrXW^2ECm1QS<@[1Wc:
+%<%tAEW97AV#p,Ba-fHj;$:iH9g\F/"Bn"5]c;43=0dMXHoVp>?N?tq1Ki"a=?V*BDU>Ao)Rn5hb!PBlkdj:e>+<Q0-erk:\fjum`
+%8?'H:2fT(F<oE`"9 at dj4R=**Y4!g3@(Ubf`n;QW^m=57:W]A[BYfs[2?UF=n-Zb9skTTqn=^TTAi1Ok`Gc_ at h(F&,)hQr`^%!&Dq
+%,J[@,+/BQQA-o=gH>WslFtTb`Y.pE#"cd>*8uHW!:N5iI>;'SjbT[7'klAF)=G\=q3VNk5ATgYIVkE/82G=fP.X\:qT[p+D:HAN5
+%"sFth.J7qS^^J\7ZcAcrOO\3lqC_r^\MUFE4&g<B at GEs?FNq\5]KT!+2F=VS]"WO6oN'QT<3(meVSkh`]XeZK`KZY4=+;*[PNS>8
+%m`qlo/U^jM>.4-jCW$<I+ba?Rai!bd(/GB:L%b=S)^i'rZf\rN!OOhMLFD`,V)$Oo39^2uFb)i<KtpA/M9:8 at nR`ogXFc4fDg#Wr
+%S#&uHao%Idlo&Z1/(;/X-LCM85-FrUQQ:g9X2n[sFpeso"^$"2-W_pm[[[0NkX4+Hi+k`^[%a`/:BW1AQl"Zm..jH!%p7f+<1PV6
+%LNqjsR_nP`m0?L$QCt[Vc:)#,2F75Q>i]'I#;B2.aXhA[gTpil%JmI=<],JLef%Bd.o6Z*H9-*!(B./n#dtJW1ZYlP!q>>m[!<$V
+%J]kQ=d2,&4[A9t1Jf+SRH at JQHos5$$_M0&#]\2j*o-ihd*e\7$M^ZSVVW6Z%^1`Gk\-Q^e0D[_:P("m:;9XoKC+IRaI+siJR3s6:
+%N^%0r:/qZ67qi`7HC7Ics5HkP[q)oX!H971,<V^p`iG%13PB5WG at S0OKk7&jL;9aP9&pD:J6_M]bBuOe7W6k("TV"&F"aR7FZ_)[
+%X0`Ap-?g9W$L)".cUPfQ3P:8MK(i`bbG_i6a39\p[S`sPDKDsO[8fpdVkks%bc_CoM2GSurr(rr>9kY@&X'=(H=HWL[XP8_GjTn=
+%HY91?9#UNM8UooedsQ at G(;.RnOm81Vb30m4cO7-%K5I$`>L^4V'>+_e+(X$D*74Z<MQ.CMGkMl5?d98^O-P,pNW4>_>)N&<9B"?,
+%r"o:=laAVRc[EPSKPl1#I]>^rFp at aFH=*=O<%iM]s)\W2rE+Cul-dpul"c^n`jlQN0;%gX5GIsUpA4(&'fdu?(?S`H]eaF&7G9';
+%[?eFKB*[$g0eEoqkjl3sW*?5p'k/X?'^N>9[h:elWFX_IdC at TR'`</d6H/5XJ"a\a]lp;#MqKUWS_>eBDC;\Lk,EJJidoU9/V[\[
+%AX^37Upjs0pVl]G90@:."i#5dQG2g at Vo)dV(7fI10)\37Q`o`E$N%>^de_dFBV]o(:Ta$&/>q7ecID.<.lhh/KA*4s=\AXnWNp,W
+%0L6N$B)65u[<8"N?&=t?F6'AN]'mfVE>[KRK&QXPIo3nP0s()'j_Coa^<g.p`GqP7+h:KJD_Dla4^ZL6>4UhSr2tGTfD1uA[a%ZP
+%#?mAV*UR4JV5`WhVs"&/RGR_MdO<J1;%lspWpG7.qg,;nP81..g5/)<3dP$Hg/Op$'XY0C+U)O?,=2`0b;QtcR?s#N0?tSs^t.Fd
+%#ggYoUSHifWn[4UZI#-a!RD?0E6RFN:-:Vs5*<i8oJJ3XT>]k^YbB8]%6k0UN=WLnnVcm!a8Lk`G5;OtHN`2f]f?0TS&Z\B0%97B
+%D=?[inM-ptP)1tM.p53K!h7o\;,pi$DM+`:HaXsXCgZf7;mR1\,6uQ<.N[dS36dfC<%l$\*A32E:>d/kVnkCji4/3o\c^pXnU02Q
+%49!hp=r6UcL^2Leri^%dr4M?E##Dt;AKVM$o1!V=4.:@g]K+%"M=3A!$7e?%%=S$iW;]/Cn/GJY3ml';hoH6;-b+W[8qI@''515\
+%!fSKc\n).4H!X6bpeB:6%NW2_op[.K6^UfYH5K^geT2#I$*IPR<tpF,`KIF-QfGH6a/6V.AO#UZZg?iqhHom\B6`G>2p=>'fGqg&
+%^igZFKp=h#m^R]cJT6jn)4]@)N^7Nmg"11ZLq[VhDcQ2=*u*$YiYP%$'3h,$*(&.j4[(g%2_b:$n.=j5%`^Spmm<7Q;0?>:$W(u'
+%N-Wc*qBuEk\GjNhhnFeE4tbO/$`'<P3:8<N0)`N/c0iJACZ"%,h+`C%q!D;\(ZMF$o.`pC_isb6n^MX at pp6tDi!ep6XBbj7XRgpd
+%g/;85&.SDg4([fTe)4fFT?:UL2tdDJ`N_0ncBNI738kCqHmk4/Ybp[(K:EG?S,M.6gGc@?a$'6CJQPG#AjpM&_>TClr?!\g%F\(C
+%GH>QsF(LT\j1=(`r:ZD7j'YEPZ])f(D0=Mq:8P7^[o`3DYE?[=-YZi$#Zcihat+JNe,]:;q"X_F0RtOAIh8%"c[#lYC=?u2"P9cC
+%&+mI%Q)sI#l?Cr;(m#h%Jn9F5?<sWK[r?OsDd335!^IH`E^Ra1U(/mqC,<l]l&,nM^GO%c8+e-bTjJl)>gCYG*%L61aI/#neF5&m
+%Jt061aH'er*,;XH^u>e*0S>WeT:B0O]=?6\V-V#SH>mEF$F32Nb^=ETR$,M3QuXq_SPZtX7:!=4b:t6;'-eS7VlXQ6f0O$rr,V_f
+%0nj($IKI88IT,9LE/BT_$dm`MgUHAb%nnRMiuP*<gcpkA]h::gU`\L3DRm)lDU!4R"$G9+[ar0JBlIQ;P_4CO$r9j,V3_X.IJs'!
+%>[YKY at dtKgB8L]>mYBpb27I`P31D7m60A<4?WWL0QlS#P)1r=W\4k>r7D"rbW. at -Uhm8X6q;U\:e(MQ-rCj((%=',]E]bY%e'R\L
+%nRpm0W<E!>H]BH-VYho`7/[-BgF':3 at JbGM?dD>q at P)+o*gVh"poZaPGmrT+&NqiE6"=g,,I-gr3%#*;QpBff^,f5H8#Z&.REjqm
+%6menC'Q[]"GOa<</n$j<;1,>)PKq95H3`L1ZT"E?9ICBZWd]SfeKs^2<!l*6?tqeXn4J1EG6Yn1T$tR7kF95qKcSJ))D(sDVeF-N
+%?Lc/i=+/2B\,:QqfcSPUk'=I.92DkNh2`@RBliUKf5l;*J+^]$qq,hIioRF.:O#M=:U4u\j at o^F]DE9Yp4C76.:ag3r+q6'Uckp?
+%LXYO@&arlrNj67X69BYhA8^ff^YM]#LX4/V]Cdg;`0Qt\(seL at I?c)CZ,GWFlmEI0'n`#$](Rn7&7L-h-$\Y]GW at XQ'4/u*7dq%$
+%VK&iZOo\8iWQ`,.25tgKYGH[_lSS1mfa:mQ`Tge^I_$5qOeu$0Q#Qoq\BC&FZ9(4:IasWs[9T at u'sln2i[Rrphb1_!Ac`L5Y_KPc
+%6j&-5K%YAjGlK,&otsYnVtfm6n(c5b=7pTB?Otc-aX8BNBkG!)='4/9mjF4qoQY:Zj'+J=2]/\"?])t=K`/OAg1!N[CUN_beW\XC
+%.?qun%crbUs1=HD]`1L,QAu=%34)SrAm at D7o`ef!mW!-'Rk=RYdT&*:&obBadA#n53?lqsd<>&6+8uV=r8u7^d4GlU)=D-ADW*?'
+%3qi+f+3REE:P5:23W^Ci[cn4'5OdgEV*D>NUL1*VgOoAM;=h'AHf2^X/NX*L5kb1b[R^*PDl84l7"Wn(1O<IKk-,AQfS32g""cFY
+%!EUaQOTbQKK1CI/K*i%!G:iAZ8ird%;Q'q;O8%dh9#^CAg-0#m2t)_bqfZE*$/]%V/Jm&ZN%K8,nt at Z&^Ubij/+pE%NtWs$U[$u1
+%hE9WKBDtssS0H_eiTld,j=O(XYj@!SP2bGkVgpQ_-WY at -bF4QJHNHU:G]jIbNLXW+_Oc[P(8d%tJ6!N!CrSm((DRI0epd0D^Z9Qa
+%EiffehJ@:GnDNuB<_BS-9"p]N0^?fbBpmgmlc8A?V:?tZHGjbOfuf6t]:h&R"4g/Q2I5#Q at aiI+898[,;ib68/g-cY?ap?t^J[7t
+%W0\Ij[R(H[jXF>$=9MpZI`flm+^9W>A8M`JZ!o$;IoV=8&LpuUV<7C><UV&ck1qB%,Ci4Z+Qu;41OqSWI<`qB/GRjp(:n0$lA?QR
+%mlFS6!%58(pl?GFPF"lsLP56.cO[m>-;p",bH?tq$oPB+%Y.TR]UDUk7f?>F`DgVRilPk74gtTUS=()7'[>R(G'/k\i-ikQpd5s$
+%bI9:s;CU5H\o%7IT(sb-3!F3!C.j%X>4nhm)d[rfgI'U7f5m]OJX$]D*m"&_?-gNW[^cXt)md._?_sAQQ$,"JA/t6I8jJBIRE[.S
+%U<(/oIE^tDM+fFsES9?(r&d:B8Z=e7IZXTaMtOf6PHIcM=4Id4d.]gHU^-]XbT'9d/hDMS%jc'D#A]oX^AL:o_[S!8ZTPB]8`kNd
+%X-nLPe`OKAWqK]c\+k_cT)I\"*hBT>dVeH5I<qRANE//6lUb/^!dq*ECH]VlEYVfFIR!6<B=5+>Fn$36.MME+8*mMll?.`[H.d=m
+%a(I%D[u<!6$u+iuUaE4X<_9,,?=i-)gi)^55JQ0;Z- at m/$bu)VpO4?5hu!@uln6]G_S*Wbm5NjF"KlG""^!$O0o`gaJd!fG,K<Js
+%nCp"IW1"1c\p`d/]6 at 9AbfoPb-Ej.gO-KkYSlCt:42f&-]_W+$fDPV"5p;;m3:1XM">QK>:;6MG8,.giG/oPOTQlBVkU*q)7Cs0-
+%gPba=Iqqm%78q$J=rjI*Wlq at I7*$/7;,.R9R</W at 0nW]12]R<rmi-mFY2A`fDq:,ujUJ`jjAemWLK;&Sm</;+H,,^=\$tEaSo=KP
+%J*"4,ld7jr1[BP;NFFuLLR/kG?=XCZattLQPS%X4kq7)dE32nZIcSAU%;W)6Mml7BhFoA*.Y>%9!XH[;lFEZjL(!Zi]%VNc[Si.7
+%DSAqfNG714gk%5ZqWY-pYE$Q(4#`%ff5jBL?jlpQY,AYKTZuk at Ye%4RC2FDXSp:8N$i4qB+-+/B<aMKgJndN$X-2p!YVc]&9F%cf
+%$pSTn3$5uSf&996*R4Hj($A/;qSZ0Fqte>D<,?HWY3#m`ilmkb.^lsA.A^4j=:1 at .!_W3m]!-sei/[D]`M;bXoaVPMV=%,m4'%ke
+%>rbcr.UCi`"2uf8%,[.uK%WJj)1(!Mc$'^)@%F\C&pkQA&Um\+$*SQ-rD`XYGBUYTN5)mYQr@*Vp&\2a8QMl#lu8.iSD[Ri"u-Xj
+%(Va<DG^'T\D3*[\FQaB=-R6M\pu&])/I<u=4t at m&aI<[gZ%Zrj`6$GGQ/-bG3'\d+31nXWN_ETq"Z:I3#SA\[QXTk.P&;+Z2u8O.
+%^(\4le6A7<MZ5m_$Tor>]@=_+cesPF\nq^rU8,RHeoR%B*RMIO`023'S%d:EP7\`96oLLc2"[IUc:Yo;FWIiH$%`=Y+l3Z>W1HnX
+%cejP6pA3sTf?:cnOVR$VGqX(CN.MFLVaaMa`KAY-;X;Bs'f'N$(CUq-XJP"$a6ec\KqZOAD9m9IpdEL.hJMeq4cuArAe3J%AWj5V
+%lB_C_ at +;CJrg$Dt=N[4grchQV\t</XTF^$D*]%K?s)8/_X5&MdfYEP+kkqiD)[2aP+jfX[2+N[pnqK$\!h/rMY0n#>W^$?V<Qjb,
+%a="1#IspCQQQ!P>mB*)UftO'rm;d7PA at q6g32gp==<P;e(`4 at c_Af13879fOY2F8=*8Ojn$m9fSr9[_L]SC^mj2K+mYKLfT]=#E-
+%k0?9a_Nf1Fff'fJS,-F at 1C,`pZh4[;Y_W1JE4U4]f8r at 6/5>=s8XHGW?guroI2Ws<kIgN4fk<Jr8t<tF!Kg`)//gH7`C['&kEc1U
+%YC*0gD=4;e$Zn#PX^JX&D_XJ.2emP\pu,#7s1<p'j-lRRS/4qm at jd=%&aL*K:Ve#e;SPnNm;p6bp(BL`MhfbuR*gq04ZM6OT$5up
+%]fDW"kI<\I/VWP*ks9R.Zl;Y[f(\6t>=Q57aqr+j\!:3De6L[.>7(11/'5sjU1HX`9!;-SM4jSHl<^ZDeTH7k:-[6+.k%\I9Cepi
+%\]PtTq(HH#D'kms]X0$f$quVU7,&oB&O8MT.7\d^-W^:IcJj%to4%:J0LfOnV<2//mie"Y%^Q)ea@%`&>>OSe.%(2/b5RU*,OOuf
+%i5Df_k2o/MH;Io[9\ct_XM-3TG1JX+,q286&T.35.$[tk7Z#9Gr9A at odp@C*N7Q+IinA0.R_`-H=6^bP"4$d%em;"F02R$4^=V]+
+%r2>k,f6Wp(H8P^4+E)D!1f^peNIOTY+^'-I][X\>8ZX at jo0'9R4hg.fWR]V;I%%>PZ]W@:aTDo)o(n]4`$JR*P$VF[e?*:p5/Q!Y
+%Of%=fXg7M;BNLQC[@reK`L%'JP)P]<8)jo\K2/CJ3u35&bZ]cYNSqc6jjN(,8:=/q4M9j.KR]eKgXRa/,N-+fX><[Wb#V/65*mfk
+%RaKEdY`)u:0;K+QMo./L<Y;fJ)CJ7Y_?HPZ*iQ)(q[SE8a)L;'[2^8d at h*JB7/WgIDT;c<23$QXTVO&`ZdmSG:4]:2p7"Nkec;bj
+%5iL0KX<TiX#Qi$cLJ:FZ]eB$JTQ%Y>E*2.9aClUV*.0?DG0,,OC95"LJu0i$gr5M#dsT:"!lSi;O&K,;#7`jO%D!GPB1?7ejTCg)
+%g^0L^R;$YpS_>cQPe6fi&i?s=[iA4H@@^@!VBg.rKEr;`[Tg-YL9c_BL@#bag-$QTCi9An/^k"UJe1+hlL:`@mtDZX=hiR/nCW>7
+%%atUBY5>6Uo_jLF8'K?VVA\3I(Lo)]KQIL48Qp\^Zk>Q7nA#`CT-NS\81pnoXBSJ=S6:cAXu1<,LW_Lh/LHKo2]/Du&)rOGk7\Ni
+%,;E_"4#c/7eGiCT=OJd3B-8jsJ[PmOTibh@$93s4JIV at l9$^QYGRamLg43hs!1bI''tPU&Pm!\RQQF^9lM29tqKPp,Q`P`PWGmho
+%&R66$W5XW]i%S;p)o?LD),U$j9F!Ugf/liq%+ae,`7M;#8hhWfVX$P\fe4rl9,11fJL(tFiGq<X9DQMX.f[AkJ!@rHdSrb$MRjYE
+%Rd7n1#^Vhi>pSp&Wb55KHh;[ADb80725ZHP+AntEWWR`H[6jcU at 6M^p=4N1XB!bu935(<rg(e;X3- at S:Bkj4)%%$D[lL4[;:NF at 7
+%Ncd0:7Z_*C)::(XjS?J^9*/uD'h[qt[ZI,%Xu8rO4_:.X#KVLoqAOKj=ZFqD[C,7,C&91QW52,),KBt:dBt`675jBZ6O\mmWZ7:F
+%bAnT2N1u8[@OSB;H<m$*jNuG3 at B6X/qDmWe3pM1:^OO1h##YSmc`(>e%Z\ZCmDd.PP=P:`QY=C9g)9>NM!PAEgo>m)i,_MuYt>>E
+%q9h+gk(+:o.$6TB`LG at FZiLmE:F7(5`J]M^ScG*<)[b(#m#:,S%'MC!</RdC#bH5PE=%NjiNScA0knpgCm^O5-Pjd)6DZsX*%-&/
+%Asbg6?6eADW]/4eam*KW7CVX]!:g_cq-j!90:X/"(DJQ%j,]m!F7-WOq4&iE7ELu.PR^SLJS/R8LGno/0VYKL@*q-V+gLGdfFk?Y
+%:LJ0cTG&![6=K=n0O5?'Sk*hmTEUmB]CTA7b,lS.6nlY7!]lid at GMLJ-tH(/2<JR;[FsMtr3[##P)0?V<&VU%7Q<N2lsJXMk0jbe
+%pD=s2M.DAF+t?DmEXO()ne5W=kKm2JYSk*?TR9hUL*U\74G(#AfOBB at 3Jo9jo=lP.!Eb+u</9]Fc;b&!$+!*XGc!<Bs,`BtZA5-R
+%Loh*NN5Etk616r4TGo)Tf at iF$=#2IKn.a at s>*S/Hh<@KS<PHINlQV*Bm]E+1hl9K_Lp.#b5Zm7RAsJam3,n4(elOH]rEI?_r@'QV
+%7ZXrkpWl[+eK/&b2C'YBSQI]HK=*M+$I40gV!;)T,V*8n`V76Cm;1kXD'5uUX?S\u+a),cn/c!=L&\0ud$2FV_pZ$=-^Y7F/?GR[
+%#?S^k\s2nR_<nN$hQ?S8ZH5NKOlf6/L9k0\#/d&a0WHS]pUoQU)a]8F4k&O"2shJVi9tgMd)NTdTd?.<4*lPlZ"T9'e6K[EacToE
+%C'6Y,(i5L%+pemskA;\P9HMV/n!t>SX`M_TH#jGOWkP=PQ)s(mdm=X-2C=UiV#H85O at JG'P!/r26$8kEU@<fh&=Y*l@=0\4P'qaF
+%2"MO>4Z,WFTeMn2d88TJ69,Y,`AX_,M4"hug-tLnNbh`P^K at U.m.5Jjca5pb(Z#%iT3la8X'U;+h7po=nQ3L(m4UYPq)=p4\D&-,
+%L#S_AMjRZL?AEfr;^R.%lql`cI!<.k1+i:u'jbZW at H@AJcR\d9*jo=eZ<L"f"qbkHTq5nSlIP)_S8^m*c^QHS#1&ctSVJa-. at 6g)
+%OLR;Zn8VWdMnl08P/*b"lE?o5#\XRVKN6*F!\E#ST!`"#JAj58:3Zr'dEb8F*s.ZFp9LhF-,t,_;EMEs8NPno.NPgsUmo.1[*'&k
+%E_?Ge1f>bEg91RAS."VbBC"$F1RDc_4H9bAD%INpc>!T?=V!#n.r^tX>P%.+"_Z8D,S5.R!4N.j,_KZZSL8,$[_U?HA6ne\C+pe\
+%:jR!dY^i2M:bKL'LNR@&E&>Cj*'F&H:gd#/2E^QW_uqKZ%)6`j"ZiHp#?60VU<eFOQ1e/YRl%<&BgUam(\<Et[=e>Z_X(3D[10ZA
+%3[GgRh,^m,YQD!h1oS]tYV:`"d:!_%dKYD#22;rkJ_tB<Kn7hYn>(ir<LS:_4=f60W<dDb=N1K@]pf0RYn[>1AD4QOJP]h[9/h`P
+%JjjM)AI(pDTY/]6Yt.=k6q3qHN.q)G0ZOR2%Abg6)SGhY84?X2dKa*/a2ktMaMQI3(YliN_F*8V-J]U%Lg^3_ at +?hr86'+;q?$N+
+%+Ua%F+_Cit$C?a&E]u6e]!29#?hB=PBqbt^LG_#qDrn&S0nCfjaRpE:gBRQDRuNYMG;^c.`!MB'"[p*Y\/K?%*"['dFH*6\P2?SL
+%kl34'6C'J66Y[EFKqZL57f9du8'%TrHQh%(OJD.CobIA^Ud8'tI=2"f7nsCddI;a<_5MFTNi at E#72qR+D]XiI_1"#$BY^QZKkm:$
+%;QATOJJ`s5XLf:3O=(I]n?a]BlM_*o at kW!uCF*ej[\A(5;Rg#0KbW0I3g!=$@D>%Lq.Nr1Ca2.*i%^*1D6"]!BKdEQVXUF27c?V$
+%Y/&dk(jlYGVCc?j31jbdCM3YX]hO9$+BY#Me0i%6K#(!_E\3IV7EP$*jAH:HZbj'(B4]b`K+AYiLn)!;6r$\QGcaECShHo<<c#V+
+%hb/L%fSQT%,HqZaJt.+hI'S>lbR75[CD8\'CJl^4 at m;WZ+$#SYHZ>M?Fi$lfQrCBX;.,YITX#28YZ11^_-Sm:O5stm,d_=b=KHm/
+%K98Z+*URD>]*g<X21DWfBM9b\6(g&O<mF]C=XYipOJ/d`mtP^8je6OL'KCtE&<JKXO9fcZn_[Y4[L)C("0[8K&7=[2hf!m[`(d3!
+%"dl\LJ^4DdaR^Eni;r%-3;B.GFBDqR4ZH#IFD_r<VCq7<^r,kmpsopp<ceMG79tEg$7VNs;7O?WC at R47"$GoRO[dS"bg"uUF[.?/
+%%,4t+8Uo\-8LY0gE@>)._H5;U^LQ100p=g`iQH+'>So&'X96[5JN4^if-[pF-/Ut"-b%%5gn]uc3/GN5)=SaR0u>rH0pH[3,Lj;:
+%kf-*>^GJAh`:G9T=<t4>+g_r.bsPh(]g6Mb-%sJKP.b#^QY/G\NWg^KFKV&K=.#cVn/\CW%(*t_-JtfA7tA:A5^PnTSH<S^8],B3
+%X7PHt>X8.,+oP0U- at L08O&G#6UT$Y?(-kn/<b;X,Qj^PpRisjR9OJ%af5D+f+Otk2J<I?u1_YVP at 7hoqAmcHpi[uZV]L=^Z:8O>>
+%X:L*1C:>R)8Ac4"No!6sd8g?3!K3(/aAoEo!:+'[<VdB^^k7e\29)\)IF:Ms[$/iLP/^djJPpSl2;/diaeP#]^i:O5g'j98bgq>/
+%6-,o9keqe$dCcRNo1F4WM1oiRIn._5]OO(869m6K%(NX%_PKVl![kma-8c-%.kiBBUY+o%]a_AZbEEJK3ha>ioq`,K$p]?\Aj@;)
+%%EH=s60t"G@`5l^[&Ascp4.00Z2)V[`*D\bZ.n)k+CaQa,J"U;'"A6$@#EqX&`AfMC!)(4OiVuU4-;o\_744lAtgOc:"jN<-R(`l
+%qgCGd`/tP!2o/O1K9\g_D6(M!e62H(?$Ws#ad-AV[D?DI(Z5`/NZKnSCkl)RoC1]AgQLe+[Fr6I5BYWS<H4'M).jgiH<Iif%N[>;
+%Pu<$'2$DPr'KEj#8HkDPhq^i>i(7HcRph[hjFiB5fhK0kaWt"l6]?%(OMOgH7O]t!X$8s#];h#.<P3cbGN0MSN$:iqO'rZcp6HA"
+%N%2ocraR\KqR+`\NgNd5\Z0b%n\.-2_'KOin(50R[?dH.)X3@(@D_4-\I'(Y1(N.Pof>pRBF=(U'OcjX&E(^g<6:q+KgrB^`6Y=1
+%Qp]&)LEaF4*Q]T=.@)B$NKt+XQ\:k7d&eB]j+7F_*^@,gFdopuOJK3X at C%F76J#:H2]]DCFNI]Q)$ZGif,&];^t^p:%C^d>Wl0,F
+%jUPm''lY_G/p#9+aTj-bH,JSA[Pr)g?jcam(0O`3aJn15Ar(1%'EL6!"%'%e5*thSJk<"$J`ugIUgc'5*>befj!A$KmKQa at 7qQUp
+%5S5/`82po11f+YSW-u/e15\4,l?*`t(l)s'b:3mGW-#j!SAPs?Z=uZ[@cTp#_J[bk[N=+P&icl>6JV&JBWIWWL1kBgAL:g/P+JGt
+%-Kj;MS7W$VWWF!U*c#KHk_EEsV_&r06O->!<UCWXTL4YA!`o2q^a*]$JA'WgG.8mHO:L;+ecE'TE',TtkfT1lZr[X8:GtK]`97UY
+%&ARuW<ij*09X/A+khQHWE+`%%E`HRiFqH7YgBjPeZAudg#mP38QI0:0V!RQ0^K5+T^Lq;aJBKZ at P)_Z83QH+JEdX'd*t.+lCINU]
+%O@^7=/fF.(Y:\[0a]3lZ7ki$g^aSam8rq"`;F-7g&M$a:H1B_Loq9bWW8n#Q//g36&D8Xp'SKWtH>U6Ir99s7h!1<gP2rj9`dPp:
+%;f5'*AT($QKhB^FUM`?&HU;I<GjBNiU\Y\J)GDgJJOpXK_Z9s_;C(tAflq-%dhQH:*.*4&BJ][^bs]&`H3Yc?AL"C1&=kUimm
+%J-Oi"Z3A%+C;!*pkQLb#LtpH>JJbFeS-#b_)01WlZju1Q=Dp=CP+l]!!2a at e[F%[GRiqSH.99dW3DtS,a;1iQ$a(qA>^QTog0ipC
+%ia];;/et5MEBmB0)]@R.NU%^u0u0G;h`D?.WYPb at 7&$(PfZdG52#UcQ6sTk]!&g$";OBU:iNk8Mk'E!m4d?_I!uE)g,l^#%WsB'W
+%r)W%eAUfPpQp?HteWq+G,+!(<.1'b;H=-/XpkbkhZ+$u5!`OaRmGrilo>HGs;5B[>MG08c>Q[mc8m7b7E&pXa^toJ^hb at IEDHW7u
+%]'+#"#kgB>p>WYI"182%P&Qj<YU:[Zg)N!`#s'a!+7R!`BQ"87AejMF's*nTG6O^_G.\gBDL*26Y%`r)A(_,X%W1bn]7IHr3`<3l
+%p*1k%GJ))/)"t+)mO<6OiB?ZR"3^7`XS6G)=r'5D5*F4!TK$q:U+C5taL0rn<5s[42$u at D^^mocV/41baod;!>Y5+l*[ia"hAFI5
+%o`6'KZ6mAW9;NK!DtS/\-UkF"nDFLbR6EE,H/LIiGS(m_l%q).l<p&*^j-Y/cW[%md;;Lfi\Ro4YmQ%6H1A=ndihK_Tr?Kn^.l_X
+%8'5Dj*7%7RAnF97,l<2jjb\G5(E\UsgQ)mA;@5R8LceC"P4XhX7S_sf0jqF;7H2i3(<een50's2l![AQ<12p-1=V07eAJ`j\h=F_
+%!Q2i%O"==VV8,USY.;diZu!%VUe;>d>q2<$b\857^+ZFr/!gqTT^lq"9hKjem'Ph&i6_Of7T`<d1eSfOXY3:QS?a_#f`cSRaPYu.
+%Z)%ff"98.d0*E>Bf9G22Z at t^3c?Q-^IK2WHa&I0YKg_ at 1Xkp`3c>*NI%.Pf8%aKp>/Lans^dGdRLBt]hHg-f'?n*Caa[_!:;:TR5
+%,YpLbZ;1ifeGH9L5Ial+bJ8Ig9->o1#!=>MRXI\N>'r(Jo$H7]^aB5-qNCVilGO7C4'tL2`I/nQHZZg:bUY9FqaOpU5#1Vnf#6iO
+%!YX"]WKAjmCV`!0Ma`]uoolS>[4+iknT:6n2M[fk&C+`42!`pG03,@@<6_uIqb/([HK-lLEE2EH7AJDA9CTn at oKg>,)_.7^*V at qa
+%%Ze+$h/"XA":"16Oa).*SY4Ct-_]Vt27Fl-$kC/(>h13GDNP&2Ot^jC]E4Bl"*GH3<-d4"2htQ:_=T+3fsJF=":if-T%#$G,+#<%
+%!a(\j+?R$$1cK.n;4rZA.Mkq[Z6:Ed]nMm+e3PP!7["c9NbkeD6g\;KV+s+^j>RSIKBTWUf:i.,E*^RJOZ#%ac&]<W#u$K\BG!LW
+%Jf9etR?Fi+]"GRm?E6b)K:1H4o9 at CdTI5&]`mP,1RfmD#7,en)bY_,qNQS-?W77lC._a+Y?TpOj5fHZ%+(7u#;-Se/onb[?egisB
+%kc:$`5LfH.kKC(CL]3eP2`,1K34OL6NjNCHST+ch3$TNB770g"b.Ed\&j1uC`3EpqlFRcAOueW'[/MbZ)qf1O-X3M3lu=8=<FbZk
+%eYB:G(cLhLUWIh\fG]Br)ouc2 at E$oDd23;p\oX"&IFc:"MOWgM7<L7kdA.de5U76kC@@JWqa0*R<BlV+eEOZFJ[WCnJR at jK-_nAR
+%DNG%::@l1`&-j5H\AtNC)+5\.p6pdb-'F1=YHr1oPhSFA7_%'L8;ClA6IK@/U&)n^WDV=U%(6^="FB)2o.dV;jJ)>LI'&QL2)o$R
+%KX\?K5(V)97pLs.>GrA[p"3eoYea7cW<O=I?Rgo,pXM"$jYDI6BSZDW\[lC^Vfqg,TGYZ;5SNRh_fsK;)-spC7>+m_6k.Eq!,k8q
+%MCukr6\(T<$c'bnd0?ame'NcFQ2$L!Gdq8=][Y$!ie<393 at U,kC^W[B>8s$2+Ul5Y_AGaAZi[W5^::W`7c>LL"aQGoB>]K;ASMTc
+%bq\lKK:*FsC(DZL'c]WH&7:>J8shgS,Lq`3Wlf6qin=\tM^`sBRj2\MUY=7p%7.4\;kQ1r0U9eRn>pQ<Zir.W7<9[f2MNeV8d;@3
+%N*u-E;THtrjUR+]&Khs*?.C'>D]4!1QV-os=DT3=beu<8a2/a2Xn.Bk!/8QC#q;t<It at i%eR%m&n+s,0F_3%`VQm95YSQ2b6"Xf=
+%N07Z[>_R:p<?SDb6Oa$EH\.A$h!IQWpmi=u]*<EAr<n1JWTI5"JBbW:O[I.P%Y$+9%p_Ue:*)@ah'nEjF>;\u at FYcb34R&7WKB`q
+%VG[qi/sRQ?-"=]E5cQH>TOG>6)-V?;Xj#YaU3TC9[RWD>qH0,\Q^->ja9nk5i)Osbj#R*ebs[%\T"B4*)=>[L-tIA250*O&e]ha^
+%OEQ3,fNtMZ3UI/<BR2q_(Qfd?(@T+lX1\Yd,uS%,g[+CPB at +7ce<GXAB@').D%ZnscohBV8RT63E><c1 at ZkDf1Ua)"1EG];UuHm#
+%NE<guZefj3rc39p^B at KG<D=B,d>9%mr_E6*r;2p33AEpGj<<Wt'^)Da3"jJM,\A\B_uR)@Z%9XZpP["*H%'%)8r^,gjJ:B2SG"r/
+%\lOg at r#j`S8hi4S=]W7,\f$F%V(_=\)W*S<9@[Np)mrHe-!C.KEe,!YD=,H.IKW2KG>b'N)e\*b:E#^=^qql=J')pD^A[-ll6:C7
+%>9'BP<,X7dd_-;h[ABgbmI9Eu^AHjFpRtmpqZ%&p])1ISSUq\u8BhU;3YFA5JM:&^W'De>CqE1gB2NV+HQt"0jK:2:OBT9G#577#
+%Z=oj2"^>4?C6/ae1k[dje_O*A5qK\d=kLS]i)/K"!1ug@$7s%9q^QpZSk("#d4Er-VW.SZo[u+tV-EGh!)6804!sL(!`YKdJh'a\
+%`K3DI(.r#j+,T,L(u57r"__U#0\$AgYsZcQ%uqJB^QKl`c<b?;QPX$;Ku\h'VZ)6'a9d.iVLWctFJ76_3Kj5!i%)^]P`8)pKZ<1S
+%"d$Su>Z\?a3A_&i-a79qdog5U=!GN$6@/\H;-]0&e:e+UiaD7S?Bb\3Gf-_e*2C5EjuW'C=<[tJ-$d"d"AqIa'KLV41X)(p at KIjC
+%iJ94n3j"gm&Efc_n-:D5oFFN'93RA#Pn28d!2^FXPlq*_/Z;Kl-UX'd6^M$fM0)-h)bj[94Uu`gV#io'F\<__9Ru^PL(C.r<G@?m
+%ORbu'CJK(M<CSTK?!Tm/a=P=(.\p`3\KSP`Eft?-2fQ"b'PM#dAHn7d0fSb#c%VBd9Wi6Q6-^ojDjnX1[I2<I:q<!QRV'&Hr%ZOp
+%@a/Y7D+I58M_e"3!eI5B-BF<`&-Yn%Ad,26#%0U"9<CeAYlN7l-"UDCV?.*!&Fp)8K=S7t8;A4LLn`U5;7e/R*7AYL!QM4X`m?ce
+%rb0?:C]U[TA[@TB%Od9/2'a+i[:t!poA/_e!sH0fe!(B4_,']X6Pi$!9<)c_eH>g/UEURb!,"*)(WtP81j'&t2<^e8MjPFlnh>bj
+%#2A`"2a/#[2 at V8NG-:$Xb)!cnkB(d6R4;g@'7gq7=NEu\baH'/�=8aok[W%lIGj-<2K'$0!HO,Qno(T?&0IVVqkXeBhktS%sZE
+%8U5:Um%.FU2UXE52?be-nr:Ck=]U^\peH(0oem_l"jA#-bOsRAbdj?OhNZ;`VhWe2o.peB'G]r=0FnP-Q]Xtu4]ZM08uUfeE5+"L
+%.2a\JU8sS8!S308SV2S^Fp#2Fjs-ek)R]uT8 at F;:qFRe)[VZF8;2^KuU*E at 6GFS8Y!9[Yn_osB:4j]@Kb'KB:!,]UOrm1*[#o'A&
+%j@>?Mi/=k.&5CnQ^+*aY5cJit9\kY33U.Ok=NbTUccN9Y,0Mj-G,!J:&=B>c#]'X-cFihFJ?.<I6u94I%P0(Dq\Wg&Si^mer^o[2
+%l?P<a5,);\9^qR>TL1f.%?_#YBIK,?T/Zc+D.]!3RuP[1*2^Ofc=?H[R5nPu"N(#jR)V*'<84Kd[3G]rO;'M.6?JQ*0:#\-4m':V
+%Hg'"C`u,PS#K8ss^TK`3H-V!WMT>*#B/('E=?'&Vo=E8`&FZ?s3e5mNZ/JR,=/92&^Lc*`mdc*X_1KUf]?t=@4k/mIosL34;``eI
+%A98Npcs%b4Ejsm#&1q&m#r%LQOKcX1Jn0G[Zn;#?G>hL/XaS<5\gl"$[/eGd!SI<kpq9/__[^=6:Lmp)L1&3riA7i79-F0o?)/aZ
+%W"b>i1hO&J>I*".J?EXa24EZh5 at YT4,X4/[ak<]0Bqjc0l0pBB20u[0$3]A<[$rdT1QsMKC1;BNb3:CoQ5U"odtml5#a?^ZJ-TY%
+%l-eNH<.7P^UB0[u%de%;h+b'g*GuOLP>X_KS>;WC'="l>^h_iRq*Yi%W*!`98p7<HVrF::htQec2)V!$$8a4>[Q8b0YhDEJSaU=T
+%Q.:!rTeL!iU+bD at jl+;!lA_9qcR#R>bJXP%;qnVg=WuNugF]c9K at R.6?rti'M-.$<I2qYq8;/*(CF/T??p"%[PlhGdh'F6NRt"Y9
+%#))sb%DtG&Z-%;Xa[iXS`QoULB*#&2h)<qi>>hViO=47K=2SlH'5T+2nEHBLNKRlY?,Do.QB9+$^0`<fn%[JI*S=YXaR?1A>mr[7
+%:6P:P&>3QaqXP.qjeWepjgR(M%K&;daY1Vsh_Z'l"(DGZm);6fcC(*;OZa<[F^Q+.cmKqFGX^Hc^,C:Z@"2,0JP=6gO?=Kjm`dbj
+%#AYZk<OmZOFj$#^\j5dB#9<1lH(aR!Y]/:]-kDm_bRnMRA5HjClGCR3eKI#*`PXGVdeo(\'[P>'2BkJ^#O`QgJ[E'@BYIXI5'YAa
+%fX]maH0,KIVkFj_"DCZiTFq]2GhtWNdZVQ\+b!0[=!*ZdoKWRt.>8WC[UR^q\jLaT:?JMifN at 8ZW'qmIU*LWL$#Se%Y[@MGSsWoL
+%L?1A<a`7D-ZHn+41[)AO\=Wn%Dtib0,Y.8H.$o/"0m'g.#?M)8G"*2`fdU=:)t5C>7Pb.>mV?ec:S2tOgJmF%c96e%C5j-6e9hs\
+%-"b*Xlj(R3s8?d>Dd##V7=F\*Unl=!A`QNaPH6&umt5Qt6CV"BI=F!NIEd0h(F2sk>dgV4i9X\?&:K0\#r'i2=&nWYlb.2!PI9W+
+%Ss?0j1])G9PV*SWf<>2W&u$.Y<)RYKd&:@\$8*CmQWB&<>4"He?C2'OTq:`Ml$ibG&<hjFA4a5V#N:ub<]#uqq+Nc8"*Ub:n`Ma3
+%.L.:#7]fP[_5/6t2IrC8@*+/ON1U/Y%Llfd%St at cXdY@^oroeWfH+CL4"\Xm8s3 at cD-_rK*)'K$*p*DAJ)6jK<j<'Qh]\3QZKHY4
+%_m:5ek;iV\4h.6[dk7'5BH^0[oinq*ner,9PS0Dd/`P.@$W4:J+6`NJDLb7bc,47XMX&L&i,1u>LW5%"qlLJ/Akl_JM2Me,c`kj]
+%iW*%7(fHiK3'q%ZMf(.b"1$:,W&Hn+3#J$T/aY)'McW4J\CiZ)VGIW!1SrP-7(^sb*]F:BMTe&]qVIp3T_a0>m.ro$XQE1!6?&D"
+%5%pR((4qG$YFg%<Hrs_&:c6dQhAc&$:!g_N9YEF\=on`uJf]g0Kc!U1jOFOTRHm.^2dmIe>?CHC5j1^MU5aXOH]lSbq;ZHKWE-YM
+%rqg[D$\)a?%M$+Vp^r^?;-((Z3BaPOClhM+O?8(E!ZhSB!]Kj31_4gsK"O1`6J$l,?*IlZTgE[.?n]bQU$De0+gpf`IGk=ZQ]TEF
+%)s at 9gK/$^8J6K at 7=c0qH`!RVDJRM^(62GVG4E&m,1,3O6&<)Y_+QFe<[n/=t)eQu4RU)2%$igqmZPce8[kWd*.rY]`8e[#HBUQ7u
+%DJ7%H:29p!_+hWmDILPl,3B3Y9M3W*E-njXMaT at kh!c*<XsX5Vf6etD2W"85)_>D?bAMPt1fjsqHYNokh*Ke^[k:alj^T92!mmb&
+%;E9"KnFf:8Zt/.Upb*6kn3O%e$UkAL`V63&^MA%=-Y`6Y[0'Ta7T.iuNjURqkI9:`7Lkai,ph/E;5:9<C5gA_]ZjK,Z<BW$4`%@@
+%WS-l]ZLK4L(t+")LKK)&![VMQ6t6TF9A(N.A_'!-6O%p["g`:N@%pK=E_!!%UN(jj2n)*3S;Q#QK*EIN^-X`_e=XM]Er<>/?qO("
+%l%p#RR'5Ui><@f:;B3oH9J-W7Ai\8<^+:IgLR&aI*kq8)Q>hVnRZWbZ-n!cbD'"/b(eh>N-9t]?c_1qU!gg1tmt>=,AEbBLG4V6t
+%^q5f;G4)qW=U?paj773ACcl?nGF#'3`RaWHoMm6C9"<43=hY;o?`+ZF_ at W&j:R#+O&0&0PO2Z/@*rQ^6kOC2NHC;B*eEdPK+^qdq
+%@-Q5ZS=-Mkbq03/Vm(1sQ,(.SY^R<MqgkVCR8pSYSkD$T/Zf/2\c at 0Uh4L`g\/7T\,+6Inj;ODC'A%rT=L/hbmb%WF:prn1W;^&<
+%gZaY9CR6X!0EdHTHr[lp&2Hp_%bAK^jgijd?,T9G/.%o%#Q_u0M7^[.T7:&M9(CH#,-M+A>g^'U&>.uY`+QiH`46^\<34WH+L"k\
+%]-82?_$4#<*F>jqbFu$D*.FC7Ddmf`SB_j*&p'5)<51;n)pRe&5h[ldl8JbYUXQMg7G:.%E;Nl+`Ng\/U##%CKTgGQH)tImnRruk
+%;j(?hg^H/UR>FAo1;FCC[U]T+JfAPdVD=rTAKBlpWJs-WIf?^W51FKTG@`<QU`K:cAe4#<-!DlHRISeZEmcQ&F+CQ`-_l5E#$66q
+%m:.;MWjoMQ]WD:t,CE'sKQY[qY\H<-'Gq>gC<W!G+\'XmnV]_%^:</Y1F"b[@pT%<5=d0224R^F=p=&S8r12Bk\9n8d[Vr6j4H1`
+%beD^$-"uK.XQRML]t.8Qd?JOib=6LtRn3=L/*Inc0(>-anX/GqJ'/`Ocns&EFFt)#Kg]MK7'.c<1lTlgDY*?*EO[FKe:hEgmQbfS
+%Da>J*FBEr at 6)?T8!7[)pX"*[0,DE"9aM_[Y`n,r>b(0?O$Jq)M5c#POT)NQ/ZJP'lKNsg:5Qc(Lm2eR+?7Aoa6VQ2NaX$Q$41T#m
+%!aABm!+E"`@!+jFcrC#-g.niBPod/;.VH67jrDQ`O=`"\4DJ0H8^b'mdf"@;)(DN*b[q^>LbAS[;1.*`&q"O$V(?j7&#UeS[:sXB
+%V[<JBIaG?BK3tO%IrqbRcp[M(g3rthhu)t^l5K46lH4T\HcTuNr.m=)BjKbQn/!KbboJn]aPVMK^H8J4s6Cc.Q]SXW=s(A,hL@/6
+%/Is/4IKG_A@'_;?'SofZYXV/PX2>7J"R at .?[cRbk_QR)IK^7P;Uts"8g8:Ug>/K#9Z`D+NhQ;]ST";kD?];6aRe]_tPJVM';efYk
+%!I*qV,OmaK[<Xa5>PDk'#5$/U&"`CF`g3,MX#@dBlqO<,@#On08ppXXr4To<r`HUA\3K=!cJGY100I"ahW)r/Rb/]&21h!fON?oj
+%.f7aDs0`(-$F#cMY,`r>MrR6Q!1a@=KKF?PX"B"On5d+Dl5CRfQp2/]cA=K8ZTH---b^mf/Krr4ApDR!NZqdO#^"!3mDb')47c&*
+%l8=iPJrB'ih5 at 6ki*)AhRXiMjU*rGldLG(<FF6a at cunhGXn8eZ:Q)S)m7T!GW/g>?AntVV2o'j5O2Eo3\NTXf1pSF+/a5FFCe%@V
+%gto7/W3qgKUrU:S6hG9_;gJXPgE1t]h,1CO&ded("R*hdjDuL0:8<L+kh7=*DSdY6]&.[L^b<W5d_7rD_$GbGAkb$rZTa7U't+jE
+%[]/cQ\6A8`=3^DQqpO'e(SK^%-?rA(3q3I.lj<"n2/Z!09B>hGZ\**+P>BNg"bHY"Cp:T7Q<-S$BFor@[MFYNO4qtqB%?]["NP6b
+%@AJhbBi\QP3glNEC6B?@.-5t#hmtFB0][!nemJ/Z5UQX!Jor+sV#IkuWa1<(0i7_)>uuQ(CRnRn)gUB$/(]dBSpuo^2C,c.bq1+!
+%X>&]+XMRkp?Jo at P][rO*91aFef;<sVMfnJ%i*e5)&GmO$\7tn(>MEKneVYHkoX2l,Pk)H"`WgMXMA!)DTn9(fS$W!h:etWl<_8dn
+%X;'n.+nY)l?Cg\J-MGBaUU4D,n2qiJL^T>@<,?RJ$GCatkQhr[>iXimCmah2D at S%eU\>VRF8J)0BhQ\9[!V^gO(*<FS)Zs4_30rk
+%BcIqiL<)Au,`;OQr$*:%.G8LLMksmB(V"Xi;7T&?/HSrd79)))/YM^].p-5C6#`CeZ/W6`9RZfZ;B.S&g8t4WbpE6._LU[n`p/SM
+%U(%4bd$DihB;M at AJ3!;WrXJ)gYL<C;4>p-pOBD\-0b]jg4ON0u/M>XmEVMrqmU5H<ojdk@/f5=;hZaH$HuL^K#2L$\3;N(0RLQ,g
+%36iTnd'8bp\t@"iMSj22jJ-JWo4/#[lY1QZ3EA&*h&X>4j4^*lQ3nZmgW7kTr&J(NQhHTH"-;Z$3nUkrREp'`W'qaJ\GI%g'ShqR
+%[AhFTi<K3HHqi9Wh?HJm;I?=2C*BrAKY!a,ao$Cbq/J_o&U5A[mbD0saGuk#K_N:Q7\kK at p4FPVK>gen*7EkqLMK[*"]c56dZ>r+
+%"tT7R+=jBn5,io`M4g0'Aio8B[Jss08(Y.Il"TkroE1;mKBqH'NF6<qCV2bXqT/f?ViAR$7:[=n(KE6&7%-8UlN.b?fG5NmE'!Lo
+%fk^u]'fBl#G>%"XF5'79%hs>>pa<X3a7AL$+i#q&+JYEh2LC.TTc_HDgJR:<Ju8oa6QXoV7n0<P4S?kroFY4Rnu^QOqtXq.#':bS
+%mARM1n5G7!i&iS8hK!lmiLoj>(0c%=6R=^./#p&TMMcQk[jTE@*T'<Na$0Hp2FuMqDi<hQh.e;sc::_N8u&fY+\b6K<*B)tQfbeF
+%1<LI"q,^0Si,4HP#\!=kDmbbJFcut)F/JEDH#1o.]Bc9?2g&Cke:?fLC8G6:jh=EhG]D/9Wn>bGNn@*)oj`ntmX:g>LUL84Y1iMf
+%_R&q&<,kUb3L[j`_?HBa8t[E^*gH9SUue;Qe%W]ip.0@>[l`b!>U/GhbHflrm53YuT$>u.W+SmDAjZ4#fV<35bRB7S[B*D#E0p5C
+%<96dXS8=V/U at _<<-<klV$r&UCU%&-jPB(6?$;lMc97BLb.I-#p<bP#_PnMb*(,*lU+ZO\uC8/*MQ;Ana2L+*4m_cd5bprJBH+!;s
+%T!fKLU#21pq35ZFLEDG!91:RNCk*"`7iS,Q-:Ommpj1*5cS%7Qm:E8[&41FQU61nQL+[;oh=3lK\])oDK5EG\_%m'Ce?*9'<k;%9
+%m`;IjW"MabU&l]0c\eaL>iBptUG$J2jq$0j,3:]YSnNQqlmYmu\,J\g##AH^51&b&+'Eh)W]D3;$)0\LPgp#@2WjKUas>,##.;f$
+%561e`15 at 3N$ZKX%7VgC(Dh]$L2Mg,q]\3@/`*sZlHB/-OLKcJ/b)+W96a9!PLS*/XE#lZdKItI8#j`m;5I^;Op]^sbA3CM$7_D8*
+%G3Mik!G[3)[IOA=@l&3I89e-BaM]5g^'%KW3oHldjn!hSFbA/(.G(_'[1trB.VPW>.$d52WnG`3F9T_o3iZ?TP*p.U7L]NXVqH`D
+%'EY&#YDoUrI*sdI!n>R/!MWnQ?DQM6MC0E(AtDDs-a+OBhB_CLmQ^VSSuC?eou-sI"-]b%V/Wbic0d"HA4cS&C&ernm/a:]XZ84<
+%E5E3+E,`%LFei,Q;7$P,3\"q4NV5 at PQJ(Y-oi@)!fN at c/%&tg$oi1W];8:V_bS^TH!mQ:Og)+kX at d=*F!2>f:YU,VF?#=<F-;r_[
+%q6?%R^rHi,mEl?5]+]'_>,cPXq^4=-$!!]tor)Y/]/78oOmmJLPUXXR-']AXcUh%oA[.nA4/bP?$n;UbqO`\c[gL>.`GKqOUcM]\
+%C/^!K5Uo$[BS0eq[YB%5plbrrV2?l'4 at sB]e;sQV&4%7?CpE[8_c]A&A8DP:rQPW2f(0k6cK:kOMtBq<n[hW)Bq)3J28Q:=P6EqB
+%kb#lbp-<dK[lNLq:r@"9j;jW[.%61UW#mjYj*iheF,0:!LI(``i+O,P8ib)^$9W&^TJg&>01mFf!2VaI(Tp/B9r]r.5uh<0EoV.F
+%U)F3-COSn*k[l'f$uXALYmMl_&&p-hT]UVY)c@\9ZT$hGMD_[hONukQ\).ML/p+_%rVj:IH at aZ%);*Z3S at L+[r]W3X*G/5hkoc;s
+%9grLE\TWV2s2NpMoidY$=(:V"p`Je?JAuQ9niLpI:Jqc,$sZRQO'k*[jH;>EUG!p,,T?UThCI07aM#n[\(HotgTi(9+PG0>k/krj
+%aS8m'frBN!"\gK!cqN9L)%Rr$Zq,h0J1_s+'3a(U[5%Ff"IXm,_,m*Ig7Q6&2E;GM:EbfUWa$#c].?lB@[<&5#5.R3Ie@"9@`;\m
+%NMe4NDt`%Uk1b8HS(,c*(NX=J$mmp3<HT=T79o_to+t-hYOO%e=VI*3)AA+R$S`$QR;GsP:*l8Fg%1YLc\V\_6n]HY)SEUmU60BC
+%;KHic#\JhPdsWt%T9j2Oj_6/NY5(0Vj4.1VB?r_7o!=h^H!9(;P:u(fS_8HoRP-k0fb.6qIblM.R+aDDDhSC`1ON"IfDQCJ/ql++
+%h=,*D2?kG1e at gQZcr[PsJ!7L>ltYtV4Zf8aQ'9aS$43-:fu\qX[i^8g#ao^h*@2]5cWafgmWm^&ggRCpj+C5,h#023Po!qY3 at jPl
+%+TgW6Zn&EI+GBdDT$.DU=.6!t't^!pbGoFH((spD4WCO*AVJtT+Mo/S`++'f82Fj'J(G*M_/fISe+Z$72G)c9__Z8I:!KH\2[65&
+%%FLa'3B;dZ!MG.GjDM5'/UG?(8`@L5?JMa at ZPP^^`Kke[]cPDZkMa2Or4SJu=-NL;![,88c6AQNm]=glkLg6*Q7/!nNs$Op4g>df
+%0Kk"pdrs at 7%5*!=<IrXKBsV)sAXM"'V$i#?r<"ZL)Z\5Z(S>JTU*`UN!kO8<+2kM8 at jC>(0PLse0:7m'@D0,R?LF.])sc$$g]mBA
+%(uJTtC-E\OmCi=4,WE%_V]8fk2knDdVJ.mVo!Z?%5nf"QH(_[-(X&M at DpI'6eCSEB);gkAQg=0^j^'P1[[22=2r5s5p3TI52gP,o
+%qPVMD2Z@@3gP4$t%\<,TW&+8/9+/eF(AHoGVsfjQ%OPaM[Za]FDI5"UXa"4<_LX?VF(`A=Wq at ./k_:$3PfIj;J,0. at iLbluqEDRT
+%XR:;1TX)_.;inHR^\[rJLi[^:A=E4rLG,>RGDE>;:, at 65?!X?4BP?tY<uriTFOEu3,F;%0"(r5rl\fu_5%QhNn7m8V0#W+;p1f:g
+%DM<j;qss)'J""1B-2)F/)Iu8miHm`!H;Eg%P:<sV2o+ at Z!,/3#]+"pJ_p)gES>Kn%o\E?rR&JON?'#aMdgAt#;8\gp1uT$2Ge#l=
+%QLXX2^YBq"m%fD>Hf6W-R_bBE2-jKp].\t^Wq!JL/k0=eV(.h at +1RkA,<4J`5F(.4H`0_!mGX7HY.dIBCr0du(7fa8'"&qLZWn\G
+%NMVm5D2,shX32TN-fcr4o#7WD[mf0,:X:!KBo8NWqkmTM0%K,&Ho9GMbOWX.94K7)(TRJ3gjfh^?e[H%Q9Hqh*l>=,BLoP,BXpr$
+%;K3O8SN.,)<ERu17H4V(79NlIZBJCj#_.*6C=C(CDs at VeBg^R[#23K74:&X/E5C(WFC?LD"f;Un),4NYhLaSa8-!cJ;gOstBrQP)
+%I<r<E[etD<^=]qK2YjZqrF&aD48V-oY:'4\Pqi+\4]bDOlMbNo<uF9XF+7gDY+ppo/6]!CrLZrMdmSn&KBe*"X7-8@/jqThM8]0f
+%Id.kH at +%>k1MPPn!1A(+Nb?9;9`5os:\LW9LT/q>@ambm*jk"B8k\II/_f=I?@'$D?>\&%=8Kg"_bp;?<aO)/H]pU#HE)Zc.hbBq
+%);8%r<rc[,X63k)+l'/R3+m8]8 at 1k!3pSG-d-7l3SR],sj)Cm=<R=B,jIcqF"%3nn=#*m9=_O9AM%-dt$g/omo+&ij]kIY,@/JdA
+%I^(igfgX4kmc%&m*93NH?d-R6R<rk at LFHGC^_6SoRtYd%`s6-g at 8oDV.\^e;]E'OPk3Gk&XX:+k'/#!3hjrnrC[uN=?EEdJ+Y3V&
+%HZ8rScs:VSco8-8E=%]#SGmo_-*g.]AjQ8,fC4ZTL</IY`F.h%>]P&q=&ESS at +^d>_WA#s-f:-6IJrkMG<c&ES%G_:okaG6V7m$4
+%,>H:l4=X`^mOn,j3p<'"B+8)q\e`DX9q2tX/'+ns5;kPC)kRk?R#2M^49Ek#(UN[QZ<o6-o=TH`&mn?+IEnFdmcXDX6n!qj"OnH:
+%RIj9p:uJ=HYVClgf6EDcFF&'uB<3<:/#S93D]@.u-raq9]L\fCfYZ.Q$$/'DSu;Idb?qEsX$qEHi%K;pHi*#8dU%1JT-c6SlGbs*
+%TQ#m*b'@aM<@'k"*#i$Gr_/-i&Je!\%#E;biFkQ(q;LO.@<Gf)>#X9HXUI"W_V-P,DA6ar%l;:5*f9?r#j?LR'=)k'm"NI`$Lu<Y
+%I'N&,ClrqMdu04[1s%C5l;&'4*^>;!20mr!(!,/L?E- at B1ij2"C:AUh,a_Gol7PGWQa$oB?BhM2h at 0Ti_P4!1LYaC\XDIe_8DI@*
+%cg)/4U6gf3 at X6ka$88m5b74/%Bj[IfiD8K`o+8q5>eQTUk8!dO52,V-jgsr;,)BZ$2N*PsT%7QN?"m8sZ+]5N2pIQ#<aE=Kk-L+t
+%%;Qf1.MDlJ,D3c4doWd8H`.2m_=ISX94YT2hf-4Z3cCj7Ct5J3D/FpgOAQi!MbrTmR.rk';4!ZoiW,M)I$jKu.e,/UlOTI3oYg>*
+%HasesD;,:gphBMA&S?<WW`O9<med1K2E%Fk4WJnYPecbAjAc at Y<RFi+fT,H`Hd5%@)j!5(%!psoeND,3lVnXPXj<"bV4tk==eY]%
+%%5$O\2t4BL.Ij\GNOG;p!_oHl)MjDdah1%73ud+sDL#l%4mg(DO8N^>D_?Mo))%oT]fGMp_i44Led*RVf"kjpCnd,oNDg-:e[Gfp
+%Uo>=LV:ZX$AC@^&./A3Gr*h87>IC at Trp*qhci<cu5KKIGq27JIfDkJ6K`d2(XrKP0%D(Ync$sXlpbm_Ca_r=XA3q_MjMbl^DQPgp
+%PdknQKkp`tMUD"nj*%ql[p-PeDEYMNGB\83Q[q<GJfYB9oLV)G;2Wf`>u=fs(p&Z=DGU&ckcZZ]2M"r*Gg1e!CA1N'hM at 0U$&)eB
+%?3mhbR0iTJTCT^dCE)p]96oK at fdSQoR;E1)db2CSG<U0OruOq"E2]6)lUlTsPWbf-Xr<Tj%A0MJHg8BDiX[[=l<\i0Elq^rrN[7.
+%p\9#UYGU:7.=3qeY?0`FU:jmjQTO0fPf94TO>"%!^`u`MYZ2).^%RW5a972S*p)!H+[2"_NMnD2hAOC_#8PjZI?DA-ZPCM/2XU1P
+%C&rscnnH$a+E;".jtGhj7^bR#iS"PgaKTOX\G.++4IMj(&E'U7GdXmG`DR42)0d\cqY,"Umg]0U*5.lepSRrO3k\eG=2TK2NaC#n
+%X/Wku/Cb[WIp\5)Z4Uq2C-qoMB4[`6\p-puo6QAVHQ7BkJf:nWros224s;^KgmBBOOANf]Y#SmoV2N7mT2d7QE&t3=Nl+M^AH6,7
+%?p_dI?T$#l(<bE at 6;H8u041]6Bo)-k)sVF5DuX"\q9NC8#NW at D,*pssPhSG%icfuq41e[dkhCW1P=+db"('7hq:E4u0Z[i-ID*,]
+%T)@:P^tuL,1=S6n,kOlh]NB+iSL6W6N@(&NErBor>U6Ae'\9+CH3p!X"dd=s>ia381qq$pQo:7<S\YjDZI-osFHm)MkR<j-`P`5n
+%LPRIC$+nkZS3kQC5t1<Df+0J`6a5*+dQ#0'C3b=*H^('2otZrK4r[/RC%k=/KC^bf4kduGhC]d-CC7qB[EYVN?P"\kFj=I:)kU4"
+%EMWOB#NR^(BaC16kfBSa`.4$RU%?oA&;XdPk9`o73^]U7%Wc6o1E9H#;D1oMI.IOnFDl6LZLd-NiL:lS,&+%59D%h^G"3WETVNB:
+%I22.#nWG!jG[uCHRsCJ+p1`_,*5hU3E,a/m=2nmgq]ZqrHQ%VK0il+`B/BUndFeRLpC(Fc(k9Z:-V57f6<KnN2b\;N>Fod(rTBq6
+%k94`=IDEmY%3a?p79!RF84O%mj#e=!G'7klg)ej[(jd8B;r9d&q)/hW[umkYdqF#>,J\08q2Kd=Tb^6J'qbR=ERQdtVY]9]9Mq<]
+%A/C?4't5a'9kF;gK[?@.TcYj5Z"&h9_P'2_fK^5pAca?`=[M_2'6j4<)@PEU__I$q:bN'b3 at 1*[f'I&\#!BuKLRMt^\O3<4>M2.U
+%-B7:e_PtJj(Tp*d*Ql2VTj9AaU+Eo-(RAa-3G4Q'O?bS2asOFl;@&g at eq>!&(YOQ!6&UfB$+)YZ:p61p'HnI1$'o'LS_M=A]bcs9
+%pn<Y#Llf2@%d]M._;bC9(=W+h2h<jLFNjr?3/%RA+C\tN%Q%<+Xq".-X+B^*gW:#qMEWA>T'^F^=g\g`e+Q>>5f+paU`(>9/k(%L
+%=D"q%L!XVFG2LpRP)Y3P09/Yr*rrtac'X'^6'aqfCV\YZ&j/p7nr3X01D7q5qE?e()4&eiS"UsV<T^#e=L<HLhD6U5NQu&qFb$n:
+%pbWJTALA*CY_Ai6,t"Q5`(!2d8n2C^[c2V`ioFGnN-05enB=PhX35XUZ_!%ZoCt4T/Qn"$3&+hl)EqgaTKdB6:cJO/f.mmc[#umG
+%F/[g1M$lDs%,+M at j!;(5S1ci]7h_0Sn7RWX0-XX?)r[6s1<mT[c/$5%!k")'P;!/1&8qFa1f2qE&@-94f09+UU-UqldMZf"J^'"u
+%bY"-L4DJr7Zp?TVoO,o&_A1jDm6\;M>b+#6Xgf5\WpApfPgYKOPi#_E*iVd"`:Ls9W&A$=Z<jFE`lMtmBb6"?NhbB7Xe$l$+IcZc
+%!@[ILfuf"o)@ftAG@!$9!<5ATL;QX-BSm(nKpr'`XVh+n71oVoG:#e at EB*9@\WgM8No1L at 9V2%Ap7iIM<R1YJ$**#(g=BAOL<'f^
+%o5+i;.<$>igGC>e9V9apfZ#a5\P$qf7\J9JBD],8>^\`'o8PDl%AruWGgo1mcI\R>%*hgej@[QYNCI0(8[-oH5Pm,E[2#a`P+^?W
+%V(`!58".TUls,?->pC at Af&71F0e$P$C7Y[VAA0p"f?Jb!5/FG`S,ebk8'#WeCY^XPA6TnKZ9eD8!fWZ\f=t^!%X<C,X2e^hCAd`9
+%%"IitlVj;jo95p;G>\nIZ-!Ff<b*@eHXhr@(=DF'1kAegA%8=,e]1]n7:ABGGaHPYD1G8of'[t5cRi5)`kT(6KnkGF"jd1Gs8#68
+%r:g6\bJ3lH%tF2[^\Wl's37JAomB[:f0B0A3fik]SH$L)5PiiYq"qi%eURJgLO\kBJ,J]g5JI*Z^\rr&^rQK6e,P"qs#9il?>.*L
+%-#(:I;UFQqiHo?l`J].2.M\QjZNnYaJiJ.nbf9Ao:\QbC-6.K;$d>/8K/s6Sq8'*I'O+MC9ljXn^<7uM%r*<Cc;&5KZ=:DK7e!)b
+%"lI at 5nl`H`AAL.]lkbi&WYf]EN%brH[c#[N&&^k)G*)hSD??4gV<M[lSbs&J2M]*E$V*E?k at u>9f!f=c4'96gf^WHAE>#^u-O)oP
+%;X\lUFBNfT#ous&P4;k&_Vm>A(#8S3W30mLd"3>cBl]SD`3n/A5gRH6..o3d`F7dujIGOT</X5ZZHSqhaN9,H$h<U/Q^\r*MR#:l
+%dc=;eiI#uf#.#+P0oN,RP6c?[FQB)"57oN6Gl3H-aKa5EQum[j:<B9#W@[482eKtg93m)!3Q-5RRM!E:]`M+$9"eC>F?@FoQr?+1
+%:\iqN^R!EO:e!W$Z=*2@`.pcL>..2`r9qt<2rtZe1oH6$>Z2u/<f at 4Kl8k(8:P:F8N>@TWQ1RjN+I&D6R-e4[hdQ4p/F'@*=^2k>
+%U=$2h=%jiqO(VqZJ+Mcmp'`YN,l%XtU-23?G)"AiOBG+]]R_f#P8]Fu)_g8/1)LaLlZjk+W+scK)&f81ejN#ui"q`mlV;;.BRj-d
+%YH-F!n]5M!0@#,imNn4E$mUf1[Fi._r!5lEIh.gALM_$/Z=>]\_<iFUp.XfGZb9%:pGmCZ)ADkUWCH$s[q=6UDD63_g0.mC3\@uX
+%-LPc*q;_BhT[=B*qIePbd]tZX*N>@-GIm^"L)HTUlV+dbCSNtnV3s!*^uT;Wb@@MpqOMOgZ^1LYp^_2<0>=Z5"UF/q/oS!1-`)r&
+%[]8YSmA$t*SW0Yh\"m.P at 4AC;V_.PgqUBObbj*E/:8bSR-*>:'f-eh7Z'`cf[i_5"dqB`F%9BX-fe^^]Es^:N8]VilR3bQ?n at AA5
+%cU&ZMjpe\8/qI9Lb=uF8Dd>e+ at D;9L'"S(2*-A.A6q8a47b0@$h,$UB:,XIr`li(g[GePTj@?^4H!8UIQs!3f,om_6B1BO-+CG+b
+%Q,a,3Za?bfk>T[6VhOp0V-Z=+I6-UVhV8lOHDP_[kEpET>Lt*'m(:/_]&H5gbbd%BpT>cRqrIUH"WpShA1WcjLbJPtWY)#99ddUJ
+%p\)ZrHo,9(SGJ_ZP^%e?m74,,(.<(BYDQeOPc=*K%!t@>22fY'm21.C%mt>/:\N>pU>2poaMmONl/\P>;Q!PBkPBs.NER/Mk.lh!
+%9>%Y`ioQulH:,T>5%U[]lVnhJQir/eFY1BVeg4j at NJ'&dXkYj?0o+uO at E?pZJ6#mVIKO-L_!4h_kJ829X;l*R[sE"'%1]k)'i at 5j
+%XrKPMGRc1K\jD:3lqLRm=8/OL(O#=P'l!rPS7GJ)g97RS2=L1_Po3&`m/c>"HF7D12`I"Kdf'_LH2V\cPN"*rE]VtCj2AgffY)h<
+%70BgXF:TILBI.Na at K<Ik!?>W/"bAY)*qFNteNc.O&b6?ji[utW6(UD*T;Piua7UlgFElMR[Rk-=b(jf+a/!9\J\k%Vi)hOIq\B3#
+%mc6h*!bM5T'`9Q\#bOgQguF;naU3@:/J3\'&]ucHX!fdU/K=2GWHC)?\kmqe`\\EN)`GUW?,fMB]^Pd1;kDh15FN.(l>ao at a@%%Q
+%_47D5Z9]AM=UY0M%._NL5gc!R/lYC*8Xk1-^AdqBb3F%]qfh'LX*, at ekef`=1PiNH$FUm6YhtcP$.lT04(fH1':o".rk7DGL]GOZ
+%cYkF+G,"&LKS?X563DmrWl at -\![c.1dj;,)QO[Uc6T27FSh)hmAIlMRXSsu`6pL at 6O*MA[AgNR,>;P7u0k!5Zh_u8oj!QW+%gnh<
+%eggS[RAlS"?&6dKcf5"4d9N#p';DDT!<bAA4IF='!o0c-Ub`S5.Y8sm.UTT2q9>>KEcWb$KY2>H*1Ld"j9J=mn3%+f6N5>,0[LtE
+%cH>l^jinAO9>XI+!SPb5/;J^kAVBn8%rn&?..qq)3.<W0h9SF!C6)?19[BES*G+XQ%^DejCQd:#AG-Wkq\O0ZoVrZN0+cA<s&bd`
+%c[G:3LYK=#79`(cZARpHnS7W"r&D.&0lQFMfp#d at aq"cIkHR4Xlb<]Fb&.AE/!Ib*b0oI[g?3%M&-o?(9W(@NP5q"IW_4*S<(+uR
+%_*hR4`8\9YOELL=[IgL at Gi)o_'@q&E<oHJFR1g*R6MUaY#ePJAQO8$^,H<l[;#U'._dE-2E5jL35fW6]<X&l:,oj?AW"j$adDDa%
+%VL0ku43Yl at H!\;g<OrQD63'li$.J at dm_H5;^7X0>e'DXZOJB0m:aCCt4K4Fq.VB8.Wd5Ar9US24J+3_2G%8]3Kl_*VAah1F;H=a]
+%C5D7e,t^CE/S5mGrTPS5!/h:QN\W/>)FZE(3eTU]^u-Weh,3DenQt-4_L(E<1sj<De=r7s(oM,b&I=u?E8(GnqtZ8 at btdH+`$3(.
+%I at C<mIXel$^E at F=Q&-"SH-,lmd<?:`ONU=aKSo=n15ffAeI]H2NLR%J(u&gq]g>MH#D-'CXeo8J at sWmOc>@W-c9^Yul"5Rsl^jRu
+%#WQmq0*fe;GMoq[U.KEpb0of)5l9lrFu0H?aP$6iA#nqMk-I6V%3:3W7EaI5n*?[Q>>DQ.FV2n at MTcaOM4dC>(Mff8QH<4.$%mGn
+%J$3EU/EtWE9e5Zu$O"(dmXTKj=(*E,C`tf0fQDd]LO:?:5X(B,YG7 at LfL*a>XlkH;-\5dKbieTT*8=5?]Jr2k&j=fVE=$M7'c!FF
+%E%\no>C]H*rnM^UrRUOd:DG8'*VeV/-_IN"/+r66Hg['Ci^a`;!4X"fDM_Bb[.4:00Ct?Yb_,[;(Zt<'hH&-b2WCfA,]AX"S0/o[
+%ZfF=2JsetfBmT`M&7f`)$"3r'/TM`'G6'c44h1D^4*JkZpQ at c)\P!YqE)jJ1 at YRh&ahl^G0sWi0F(8,LcfJ`<LYD.hnkqE$B+\?*
+%D1J5<F(1KicO'Oaje<tH,Q$c;@d^#mO0&s,B/aXk[&2m1m9oZIKg?pI'Ta!MXJNEbg3B`TUW,SC#mCcL_usJRMU/qNMnAVOeSdka
+%p&\?eYb)EAC8kG("4HK\,eAd\]%&H^3&k]H5$%pTiOlBq?ou"3^a>dpCcl5j,&#XsrF@"T$D]Bub2^Nt6Vd^2amo+WKgu6ApceC!
+%LWQTs8k`Zu$%KLYoR!R at S$j05E7F3;Pem8Q'-GgAB=RGY12+WZGhb!AFjCRY780Z0E?OACiXL''f99i72F&'lgF\`\:akCj\JZPl
+%@78"d?E^GR6VZ;<CoDmKO&I^o1Lk.`P0U)e4b])%cmphX5?]CE&l^p^SY=A#Nlt&i/>;1?l#E0Xrd-s063$7bZ#ls*V'si-T/*l.
+%r(55'Hs[$i0&dlh"a&=^B$'AFjG)ak<p at 6L25_C;m;g#KVWD8.@^&6(_ at -aU*.uf5*$qh9)6-X$TIj,?7a!Qf>#_?6q*7VkAGW<2
+%ApYe,,f0l-iRj.t/M(Zg=-%CC<<rk<_P[0A/-$heiDWA#7WWGCIER)7Y`SNdor+G".uHq<M&H3E_aB6XDF);J/f`ri2CV*ML^OGr
+%i_ul_6E.B.<U2m9qJEjem@:>]EG_s,9=6`CKm9)QV:!;T$ab&a]g8sUIO!TN=$3R\\pV3omg`UT]$GAUnJYM,GIot/gP!!07^,;+
+%h*Ujj]dDS9-9,?t$m#m4Oo+XniZ8P/B54"jK97gs,V#>$a[FjoFD0(1CLoQfG,;Xe?>SYr`VgBJYAAQ_HD]al]n9sP!-L2"fnG+o
+%_J\dhnJ3STM9NI9ne48I,b<O5o3aTe0fCfDE:4Z7/h]8h;q+hZk,u08lT]'U'n=Q=%EjB.+nb)0?JYp>$fZ.B8Aq0,Yuib#eq29I
+%E=fIX*^H7,+%4Eb(^3?/\<4PEhiHc'32bnjOO^`uF7OJ3cK?-ch2k.c/)ZE"Ftor1Z;!=0iBfIl"mQaQ8EFFBM,M>,"lC)s9c@^.
+%*n9)F%FYjZ8SaNh)Zqs**_UR<.URb2#eMTh-L"F<gaP&M`?O*_R_pMYZ#YEU,o$Vp25ph/?2d#FpLXmu3Z&jf7S5Q)AR=u\0JTnR
+%]bQhL:j.M]+N[hH9;j>M6fNq,T'5[!af*p.\8DHIihXFN"oBp@;.Y_M[s;I2Pc.rG9IaJ=5:L_o&e9[T?b.3a'5YC-"0;:YEA!$-
+%hXe%Yis]IMS`/Qm2APrEN5I.NkS+ReQ@>G`7"guZ_C/he%BRbPFL2X43q,)1Rq67jO/iXN>&^YGZt+0\#+Fu2?"sjW((<E91L1q2
+%.5^`l'.s.Ahs(!@!C at r*H+DB"!Xn8^leh7:^.-;a[5[bG`Z6n1:r!N1_G#$"$)Ei"GuS_8is(fJi!)u?_qr1qZKBBf3,2mA'nKj1
+%Ui6<-5).j":9!2Wd+g[Y41+R9(+q:Q^m/*J5B`j_+iJ3/$(""*$YocKB^thf('T&DA+eC6WZ*k6PU?P=*s=r7S&]@K3AFR[Rr(nV
+%"U2L=QpjbY:'X8uGLnl2PW'[sMcJLXm at _I]nX4t^)a_8HYg#d*d#Gi`6l-cd&>1eB'?f5a`IY5K?4c()[%LV5=#j;OF&O'6#3.[V
+%Nrc/Vq_kcI]?`eEd*rojPT%j+2p"HHV=5<Zb\a&S^]V;-4n]eR(97(a9K3</Qf4(#Gu2JRU7WJ5/5P!6hW&XWARY<5arnuk6\(q^
+%CCHUYD.!!M at Cb^4$FSf23Z),Z,A;/)LDB/jMSGLiH[04ZGtc2,A)!6gWiq?JB%S<^&Y"[[%VGTV$>$s1 at 3Cj%Cog:L9b#jqMOWFN
+%9R5+G:?PEYLJ89\jR$#8(9SYUb8_;1E0',jgI3[r,qP!L<GL^AHZiB'="g0*et4R=+OM0X?aGWH,>63iLUtI?ZRQ&'&U??>BPqrP
+%OL'X%]N'.loF^7)ahFGXN?Htm^FnsX9"]Rie&FX58/[;5dn5;<JCujZdVVb'WV=!gj5BKOFb>Yed- at OahZAK<NG="eSTb!G,P at NP
+%ZC_S>@<rp]d-ZY3F-7&=f:`e/<2VLC%7$]M,K68K_abk:(GgsiZ_J!@:mo=[#!@!jG7f2b_je52cU&as'L10'qAKb#DkA&1`^44I
+%iLmNg8"rn(iROXYh1Z"IR:hcD:O527JpVsTU4'MM''h4#6B+^&_Y&J at ZNkVXP9F.q;&ATS at pE1K+gml>j[p<GB>9Dm3i>f1c?:`L
+%s#Kgbf,q.YX4+c!LdstA8\qCK!tSgKaU17u4pM"Clta/<UYunaW0-t2)h#sL:Qj[roQZG@@(@YGVVV&<FLYSI8Ziqgn?R#_9(%`q
+%1FhD1771Qsc?.KYpE(-]_'g#QQlY+1i?e2r6D9^'(-K<7UBT_Bl`=sQD?Ql,WshKF"-Q1JG=iI0j874SKdrei2RJ>:Whmh'LU9fF
+%kJ<&SK'W6,)iF5SVpICL]W]Z/qb'n<9'b.&&n,_iG?L4*,s8p$HZuLM at g1(ELA(F3I/Ss^+N.[BW^59fE-a(,"7R.WHh1=_iN2O&
+%\835UNo6qYW,24=qZ,X..?:rPhmsim0.HBf/74DcA:5'6NJ9#JJBC,\[2DYjO)ECkB[^CGCnkfooCLBSiWo1XU)%'``[rU[X;RuA
+%1)"g5c0_5org5San_K.BDIEOLYB[GIn0$ZL]ODrU at W[A at 2na5'Mu7OHTK>`DI*OcEc,#*L/%YQ$Q*4OW2>1:KKR'&L5fISlVQ#7K
+%cu1^=[U6ZX_n58QH(Ygh:J;.HAE,FJ&!%!+*cV,dlZZ&O(-d"X;CH-b]?T>dK3I*%#U&L<OQO4EBu*]T(iH037P1u\5nQ0cL&Pt5
+%KqhtHDeuli2PDd#](P'sH-=Qm*]C,FEWaa:C89mML7S5h11tbe/GNh8*b[-oK:JAP>YrhuF#Db3]"<.,R*02Z%V,i(V(BSOgtpXV
+%h>5fTdT9M^A]O"nMGihf0EXbR`LielJAJ0*?#EtO<e))ZnSBkqCZ1>:WFD-P;4!fdh5nF`(B at NHnRmMpWs,cH$KY:K<X#jWn[/m6
+%i5<^>AC7hn1-m[X^SG(TU>FPd9;r5Z*Asqe/,QDTa-iT8d4p?5YSa*uH>\C'o-\M>e[L<-/jFaMq+8s#Fa=G-g"7QI?U`cI&nZ]1
+%G'JCt[()fX;L%Q,:^UPDfEFioA4cZRG?EJc4Kb_VErgIL&^NZM:8VCP<"skZE3o<r7Q@]EFT\`efl*cN(HJ8[Il+k1>V.mBjj-:3
+%I<$:$eR0%>^@Os4(H,rX at q-:)mh>*"2UYp/0Y>0hfOj#4ctGIAkPeMJ*I:qQAtdAS0]M+BDsLuIe'l`A3*M3GXns_<!H.VLO.Djs
+%04PrfcsKl0)qf,)[(bUA=:1RF9$Dlf$fT#if4OO)m(4I=(G*FpHt'K'C&pbrIbQgs6#F>LgK=XLPfO&CSeoY+4WQuL^0m(1q'#`?
+%X&HRfb>j,u^$;k\84_pUWKt%^jV6d2, at 4K=W!MVKZgp?*AI'0*34WAXlP,X0*8ZOj)+o]F at _Pb0U>LX8,Tu,.>+ at a'r&+&4%RN?U
+%[N\pUf0RY,-Xh>fg069\N>Q(@`J'80.Hu[IoU#_t'9Q8]JqtdF9qL&F$J4D\R'S];*@leu_UY":-Q:n_$Jn:JU?sh)e`^uWPc]TN
+%CfbjMWq9,+0 at AX.Ph\WEa$UYd3?k&Ml]2>aAaNI^McrG=/P-\CGTQffXWo>\,kGB#ne[M5oRadjOBe3V75;0eZ^mt*cr>MmH!.kn
+%$pmGd$g&N*%6Zk$>+Am(/CAf9=ES85$_\<P<ID4d%AU.Aaq&eT^3L)J at k/?VaNFjQ,r(?Mi<U7s#WoACR&"hrR<[>JiD6]mpS$]-
+%Kkj!MXQXQn73C8!Jr^F<$X$BPBU/E4lSB(?Y+EAiLDXm;T[YZj,]<U&Ho`K,V'fXCSVUTqeeFFPq`_KEE_sX??BjMt>0]O3S':#A
+%F<?a;_FnBc2_1$QTXOp,U5lea$aSmi12T7l5b"VRd)CW(]c_(m6VG65G4&gR"j9LIKq6=OKpX/#H'$;8=cG4B,,AUm2_3?`Q7_==
+%kX\&lF9J/%l3IqYXnd!).")nPKr?.WOp7ID_t+V!%%j%Be6Uq9&^^iqG'l/KCVdEUI*R"[DHE+a:dHR`W`C,u1n[>KL<s2?DYL`)
+%Jb^qgr2I:!elFo_:fU/\bI!1T?dq^<#1ma8.]ZH13SR,3 at CtrdmEr+:<ep6AS_++#Vc&sQA1s\Y>/*Q)*,0?AdKGdn\&RAbGiqF0
+%RnUg+KK@[o at li#ET=t_gn+g,T#YtIGZ3P5?\d8r6a3sA,`Upk4l0*@u/1nI!BAanY%^4]Dnb;Tn=peAVp0(EGT\UBd3P9a>5.>ds
+%(:2H)UAL&RfSX<&,8EJ4*pbo1BAQ5->9g/^$*E<-n`3BKUk3'rF-5T;\tSK[(7o2])/1_nYa_oL4]M]iBdOE/(.`Lr6g[7ADoD#4
+%qN"qD3Pl7*2^u(P[!9ru>/f&K[[JoZ-B6YYl)W!5ae4b@*hAKt*,Odt4?Hp/:aAdWe'm^I3dfZHrl$/tlR=#FQUR0kI"r7g!+:_)
+%>a#*"KP.X;_ at +B!#_Y8Qr$d\2ip8+[:=9>[lfJ'`4e-n(BPdCi_EPIFbbK,Q:&$c5ql_]go9,$G0*_$TI!,5s'B)Mr?u7rPqcJ=r
+%I'88LN^3u$lRZAI?tS'SX4nTZYUN$!psq;c_Gl)-3r+^T/J*6afGW:33a.Wug#G@!Vge3U>[G!@)5XPjbOu8cE^NNJ;d\9LhI;4$
+%;gLdE4GC,bN:GtB03d`dN\R6 at 2g,`WGonRdRmO0@=kE</0#S%h[Tm<&UNLK_Gk=XqA##r\hcV/$$2`"/lG7'qg[76FN,$-a2\A)d
+%T!Wlb>sZ2f5410t&BS(e$Q`nQA:DD"b2r(T^4UBRnXs2uDVsf&BBba"bFRXYJ*I%Ep%"1*(;ru%Z?oSN1a%AS/*$uI0SCU;4uRaa
+%IdBl^ISFO+05G,I079NVT+Zk3$XJ:u-5.2dET14*Y'b0iEA38D&aIs7KER$c&$;e'lJ1.a\an9eJnU/G&7)/@,6?t?Mft$Tc5&3V
+%mRFeSdn#89SgQ87:/..n\PU:[1J6i?(-6M;+s"MJg,21Fdh1l=UKnZ(ktsUBNKj293#T[[](eSe+\c(P<^9,(&f5:[,st&ro8=AD
+%2a]lr;l$5/cck\$N^>(0Ql8N=QnEU/eYo&l20U+AI at 7J5Q^\gp+S(Ju\2-YH5bq\$d0J:8N<!@K$'THf&2eXf'T]-Z at K=1s`aq/S
+%P3j+)*79cRp/-GuR+c7dbAFQ^,OQ\PfK#I7(hb>?J!_[Jo\6d"DC.O&XN-IR$fW>,U-SJ>gh&5r<A3/F.a+5_\bBqs?n!Em/Q3nA
+%FVZ_5XbV4>a;O!G)4d@&-fT"09#Y_ at b@\KT at Qed]EMej5Y`&02FJLqkb;o7_eHt at g'dApR;lq4%1<cd*n:&QmU;jP(cokH3h31#D
+%3rF]%4hl)7S[*P1L-S]h.UMGL^dhqB=/]VYc5 at pq)Ng^M,:fJu:C2W(Yh$e*-m+hGeS9Z<<sZLTp8Mt;DCc1=$Wu1)(eZSspq`_s
+%_[u;&P!s<r]KE[`jePFiMBl>GgqL=RgV5Fc4W3=<Ve(UI6N3'%[H7/Vj-M",!_-W[Hs$kp]SEm7bZ)1q(H_b^<PQ+W.2O<W*Q>j6
+%oM_OUkrnb`Zpu&6N[s[O6?N^G"nff"Eo6H^OG0I(JXjDmaZ\_&pkAYf(jWjM"eJ%V)MLXQ;&s@[\"Z%EgrRNn7VA!$'InoI]!5R^
+%`Q2Y$p0dCp'WSX_F,a5`lBd?d#'rt(LFD\.)Y/]KM'ItdED-*f$nBu.Ep>u=mo$pH_3\H546"e!VGEHC\rR)=<C^Sn+]+="8C.6&
+%G\ZDn<8c at Q?j_Op_l.sgHl&]LW;^16af;n;%SmVViGZ;<qEUWBBG*b0O3>/fP6d:YOE-:lgSi``h&-Z<72"9<:P8-C"LsW=e4GJ=
+%2n'imn7p3]lPD4'0Kb-U_Gh`aZe!*IWRID""iVM:1t#-+4B*Ku1Gjsd[_HJ%!fk>sLEX7l?E3,<dF1p>O at Uo.SUI<DaRC6`g`%cm
+%VC)_<6[TJ2UMXW-!::=sWoONUXf*+Pit at XJf3ZqT;o0RI)c<'62Nkt6kfk`pHQL.KHn*EJI-SGV?bu-o at jd@3B;%/SF*F;ZoiB<K
+%=m/S6c;R!oqXeaYPUA^6D+<"0?el(<M8M'9::38+2o:#[B8#'P(%_#N[]e:E*GmCcmP[uuoF]'"q)"#=X$na^3sf(0_\?0*LX]qj
+%L][25$i!K?Y4uVq;rcXm_ at P6\;<FRu\%<^\1-'D&n"2P*YNh^G=j&+&_;-/Bdq/^*ceZc4J:5u=(N6"dc8'-iBR,;m,grXVXo``9
+%nB6Qs2.sFQ-;F"iHHPqL1WVfl(R]U]k<;_k.>(>n`]ec`3IVVj+79]Ja$raqMZ;kp\PUO,^#k2S$\Wi!T'*</fZq`5h/#kH3V[dJ
+%L1g"T$f8E4j`MU[OV&K\Gnq1[rZ\>p;q\%Q<^cHUW?&aYi':WjTsTaTc-9Vi4s,09IW`3JOt=<_(>Eml\!)U6ME3l++U;IN%;%=&
+%]4Q90.lGZ\kSPtSOaC`7e87&b*p1J(<SD;8)m4bJ57u!b;m='LJa2L*mOt`*dYA#rA?WYt"b5,G4,;b`,Yb<LSDGoqk?G]E>!T<T
+%=s0X;a3%nF1<Vicf7rT0p-]#%%pq_+<[:55a>HIG8-FO)F\T>Zc*'&N)?.iRMQg<LNFurML[VM$0'OWEH`55j!NHD81^cCqk.V^B
+%&5)R]346^fmMN'2\i#(c(,_'QC0Sho^d15g9Bd9p0=u2NW\"Q:'B>U$/lu!Wd:(A-CS'%?_?Ol%REmuD]2R*lN3N/f$;F`,<gHmH
+%X66.2.2m/Hi<ZUqIP%:ia%isfY6uhG`u($sNb5sSbX&5"-R!SDBJtL1M:q-23*Km@\KpYbaVuu[.8hgC9HEmH>9$4.8]8N4_rp8O
+%e$J$Tqf-u!TC)8AO at o>sbE8QdIA[tV-lGK:XlV.L2m^Jplt'4@>Y/LO^=VJ+rMl.+M]FF"?bk,#%_BCnKki\&,C0B=QtIYD_Uamr
+%,OKWTCKC9%gl5>EcUq80g55nT;;CB/-lhK7<USN at 4&ZSQ=$:Wjb$s,="X@"'I2K[3c#$7Md/e7.SlLe5l)\AT`nCmo'$3.J4",u!
+%58qOol8>TVFY38P%dU#!^29-!08Ktt4V,+mYAb\U`qG88&9#prk at SV4%+emLni1"IrZbq)CumA9JZPETKNHhCj4Hr!BrAEA?b8bL
+%?Huk?lKMgC#Hr)nr;G at iJ6P3!.YWSBKnr[&[O>FpT/6$PcpapWo.(m9kGq90-Pl=`3hF2JL9o9WDX#&%IsNh5GO)-*nTl]kj"s+`
+%@"qW:Y.VQRn[Vg:37c]*ReaO7N%A[q\W?6I`t(T7UVf7?CN5\,(fK"\Hl^B0MuW`C]/PAaWs*e>qr++dF>(f)NFO)==Z2qm]YV!<
+%[,V6E0Ia3p["*>tJer81CIQ,,:gkDB[(AX6N,_-^aLfT"W/PmAHT%XG#Rn;aGL3F"ba>!LGpj._KLE767o7p7Q%0?e[7*'.aaTCj
+%W1MQ;;XsZ:g71 at V3Ni]RN.+sDn;,p:7tX>gHOH,]b%Zp\$-Wf&3X/+i3&a1RYoN3&rAjM>0aiD3$eAhVc2bGcYG,CPV at l5sF@RQ3
+%kCmQ=aeXR.G=hJW_-8XK`(0/1DkL'b,J+.3<ZKsIJd_ur+BECLWb9^uMm at hdddUM0Ia<7I(JJ1#_j8%KJ+%"eOGgtL=q!1>Uml,I
+%&>n'>>Z$iR#G"$$?<miXc`);@R)?dr/Xq*OI>G1NIuVZpJO?Y at 7h$ZBg+OTfi at 7L("Kk6;9pm0OHl`bN5\sEimn\q<6tBI+'%S8O
+%lF#q9iCUK34>(F025A9FXdZBNV:_AmqJ'lV[^M_`h8IqQ8+'G?$sD>21f&\p12m)4M6u],hO at BQ,'CA%Y]4^R93SKr'sLT%'MUa_
+%d&[&GR/DKh]6=&JG^;Z2AO.]!GOVX%'OfX^h"#u)Cf)VdK_+F=)iH%5N:/Uf4Lr!0b:Wtrcc-Qg3FFHPhem0Ha3U at f*jn6 at c-`WJ
+%\+Dema#K6_<u->TLn;*:fqNmT at dD]3Toen3\O#O_5CSWE#c6*TaNeQ5U;$*dk9!DV'suiRR#i-Y(RjZS_W<pP?<T@'TMW/'2#7X1
+%f>EDH-.D7MFuIM8&q8&GX_TlR50kJI)!\i9B7,&W$C]5R;ANZm>tBNZ<nk.Y_>G"\r0BX=X#k]PU8$G<kppMsT',XP#7t_7XbVD>
+%YE;*^-T]+`3<\V8,sm8j'.a"O:X)9mDuD at PFE!)((hAC,+c`dV"cQrOmMn]u,Ke7O9SGH][shmY*a-AG>=9pg0+i?N/uqfo#(E9N
+%>5Z(V_l(-nT7su<C%le!m(ZUc*-QN66ko_BDJ\_/oO&XK at HY-W@l`PnS<7lA'*dnUJ$(aB+^C+[W8dDV)=2.^mqWM)E$oDqMF977
+%6"I<I`7j/gJJ;E237)YoU70Jm1AAK1FbNu"NepgC4A*q\W#U0P_+bl!7q2=<0h=ED,PP+eRUEo\mZTg+*$->"efrg9"CtO"L/#C!
+%m4l7/`i9WV\"Sbi.>g\1W`3RKJQ"BU5d&9eWsLd1#>_''+J9$,'rW_I\@.9`7_>s0/](S:CpFSr[9pSQ&$trrp87DN`Y+:b#Q/-l
+%">GM-Y@(3h4XLm2!:gl;Bop/R1"5X]O)*g3R[<@1kO5I!0^j;k7!$#64glomgoi?>jg<pXVAE(6YK5&dqG-Xjs$9AhVhXV\>)ns4
+%k&=;0')AUb&pOih9:,?6W+R'`UC"oc-8PH#d;dp4IQrG=,Dr=8R.*6s/#m6g_b!Nl\QC^Wmsp,5%oN84@$uWGoK at rU4.^mb3nC&-
+%&hlI=5jA#nHE.XjJ["lrq,kLXE(H#S(r<d/HW8&9%=uk.c9`L(qsWu:F+&83p;q]H"I*seg"_]ilt5u>>YYdTCs`XtCY_EE00aX@
+%cqM4-b:`RCU5!9'GLiK,8t?']X-[?WIK^'o]TU[k at L>6mDQV.to7:h$5VeS_+)cP)CDkI3$fC[%omdT-']GE>\Z!3;o!?KMgoRpC
+%\*s!-Z?VWT;5gG;$[G6b!fNs?6p*&.I(U4t;A^mqO40[eg$@l:r3.![WL<eA5Miff;1P1Fc[tW*RPmLPMYA-?a`5t2FqA0b3gRIT
+%nu8\IG#5D#n!=cV7o6FM<F!g?8VpXJ'T#$c<j/RJqdkfmI/g_6V3V,18>3JaHZ09ncKkg\2G;FV99eCu.,VK8'^5&G2q=nZSJ?XY
+%'I5`K7Kc,4JU\$_JWko&nQt\Vn]$:tc7h:!25[0kH8US9HmCZ2%I.Fl#!n+K;8pjm6GWbk(Pp5XKZTM)[eWegdiB1>f))Mk<HnZM
+%cqC'W+>Dn_mf(SBk]I1k/YLfd(qH?/gH?LmW<7G2E&X+j48,A#MqBZW&e3nE.mQKZ8p_V.co!>2JYG!@ncdO.`tG2H*V,r9&MT(R
+%0#r_?a3A[jd2-`[i<Q,.ol?,<9==jR$,9Ll<Y,QIY/9JLAZ5f2YXVkJ4guC]@:]O\Q&S<e!j\CBf[%+G8Ne8&oc><(BI3p@!fNq[
+%phsdu2$[HnWp<2Dfsi+.,9Lp,LN_[n<Wc(!ge@*NX at hT"UKkL at nlq'Y'r/=\+pDcb:,n^RP0cRGH'%!q#@I0d`Jf-BRi0.AQE9GU
+%f<V=+0^TnAF&XL5&Kotn%3569WFbtO)dV&[T=M$&Z^AAGfk,nOi6O5d7hS2O.H7q#J%a$\+[bgOF(sbWn[0)cH+hPcAL)F'>"G72
+%WnRmQ+?q-HGg?^"Otgju,QcC(pf%SP/'=5 at X1S>K:Y3ZqatgJ*Q3ds*!#nbW:%?[M8i_1^ZSn>%D"\K%i[nn?K"G85V!HpP>Xhb.
+%jRjR\1c\\V+_Q at Y1[LYojP3T$*aRq\<@6G>T.b67(Li$RA>ll^hZJ&&*W182*dmj=#kfese/BHW`bc%q at kQB,JinMYQ$AkSP_c_5
+%iAuoa2.bp at fP4QLI`T7Y(GX%fbQYIB12F4<nchE_p&"/jUtD@*fItF9[RP%*qUk:&. at eC`I2k=eeAM_s/LDjtNX:[NSLfKg#V][1
+%f=).&h=mge+p+(&/;6UgAdPk]6=[FV6M4ck*8+L<BUT8!8ksiF7"0sj7ip'_d2YhtmSD!M.rc4ppJ<8Qilt#j?Rt-4[#:APPE"AW
+%%mlCAJm"bd65W=ho5J<d!Zogi3YV.!')#J?o6mN^C#S8"83RJ#G./[1=B*H:Eha3A18J1Kr-@>G4E;'S[2ErX#4Q#<``SX*3*aGI
+%BmuI`TfSI:eXo_$N/r[Y#_cuU)cEe-"+?@'1:&V.rc++9qpm;ROP8JA,c&GC- at 1O*'%jHV1tCa31mrTkQSO-A5c0:o/D)2m>2?!a
+%"5jCE*F8V_f$H.A[kh/M3Q9",9pt5N&sld8b_-9L)o)"^(>-:Fo8sQGpeKkAL!2Q1);-]H?QpGtYdaVeE[J.`(GJWUVg:l7<.X\6
+%_Tl,!'!fAAV\TKmXI%dIZR,/%@8A;oef]P2A5gm0bI<4]A&%05j?j4)7NQk,Y#jM[aOZ&U9\.THKo9cVP7LSi_BokN.o*#IJ,rNG
+%"LFJ_Ta?TrAu?VjjTcbV'ES`G3tF(BA$jLXoJ7A3Z-lO[%dIjsbAa[=XU%lX2"TAP<Dpb&C^d5TnCqC\Yh"LoenlC$LVi5K)8GmQ
+%!OtkqGS']s5^87%p,_uh>p22Q_Hb\#Q@"@Ll@:>8.9*hcpDg_I:"[MfI)&NA4"p at 5qNk:d.l]H_0`D_!(?F\Jn.78>ri+)q_8I3E
+%!Ac)/flCkNDAls=*G&.$B<IS<TUEVrGKfpm9VIU+[_YoSP/C";C#RAKW?/]oD7OZ:QfT-fd;/jT\gRB;Dn'"a:V$:pFCC$6*#U^h
+%NO3W]Ttggmhl1eb:M%=9TA23?Ipa(E#.Ip_g7(6]N0TX:R@$kB/X#jrAW+QNDXo:,KGVm\rU>AC%G\R<:($]G=-Th^<W!"XqiQX,
+%W$,R+59?nGKQ+3UDf9V:#K.ab>G_O&2u7=H6P(0X.YJ(sN-]2=/V*D$5+Dj.'&qd*Heb4>f0O@;,$m"'C%cF6[VnkQR`4i<)SZ.9
+%)f"-$e&q.:>[38.*8N2:m&0fiq&c6JCuchMP;oi]?P'\A\lig>XF/p_5JQp_WKe"^,qO)N?aOaGQ\]4AfLh4b#b#hWj9CA.olVc,
+%hoku1L(!\0c(`m:r4K\krM8k2n<smD_7K*l*ZnlQpg9Z.muFsKWh#3Bd'sg`EBNO0,6T,o.\3#gI9<rUda at 6$IV,DbC+8#6S`L.,
+%aU at SfDIL%E?-)?5=p:e.)/joQSUWG7efnA6aU&5EP'InCoG1QMeXAX//^\GsNbAIP3D-3N.566'G&*RL?o)$TC9Su at 00V4Z?b-UJ
+%pc at hDdaKK>ll%l';ceBL#Kld%BR`-nmi2194!2'(D,FJXe(H'02U!_dLpda65A"JY$+me$FqhjTAmXl-;cm((&%ecq(T)$XdT8#J
+%Fh'H:m:q"g/hT)uT1AX<4+U\0A^j at ShHW6VcBf]&Fa5Fm+eg3Ln7[m#!TcYZT$8qF^m8=kp0YE<+1h0nA"V`G]5O8)hTF#-^OFpc
+%Fgh:[p_kTJ?`u3=m."S_rkIa8#EKJc/a<)RS<CA%pJrTC$AE>W9VE2u5CRl;N""f`[#=iR."1sILCYCN9sAs)bPOB&$29,L]DUZ.
+%$kMaMhN9>`bB!b*%c*V)/8eP(nT,L1H6JCU19Xu2F86aGg7,:lEe at a!qV9ACEc:,nGG7=KbPBMfHR%f>aVu5Xk)KFQ^dU<[fJ2XX
+%mgEpC?N&Bo?_?5`@1!UZbkYcUFDic9eF1Z2<<-C^kgNueVo`,>8%WWTL/Zq<89d3.-'JGXh2S<DV9`Gm\fd+rjl`Ta9qGjXfUTek
+%m_33<I["sZQ.Ed!+#Qksra^$OBee:-2V<1.;cpVXB.]+7ce8FoX!&94WK'atK&ObpGC<4)8s\`/PDbi7aGVU&m&mmj9o-1SmBjQ]
+%bDrsq7BG<Td2VGTCGoAfbn4`>9pK2g5+TIU0sjmo(g'7SBeruS86+LqQbhT]k_/;27i'Sjd[<03-o^*M:5fK2n+"ptqO(VP]Fkc`
+%[4W<cai"'3%L9-oT`q;QL<P at a$YRTYrci,PB7=P7+F at A>,==d(pB&b[)@$l3HI0]C?#^%=B+:qG7?!)('[lu&MJD=nn,LU$re'\<
+%n.[C:-Q`:T:d8$:qIR at r&Sg2`gH1#ha4&)]_ at 3AW]J"X$1TTfq,$q1_fR!C*BOBZmre%Drg0'TJ6Se")Fn61pb'8[a>aDG'p&$6p
+%nrPEQ)jFFe\&-HMGrHQRqma+&*tuuL^0D^IgTOsL*3:cHC'ahR)N':J^"(fmHBgEm]T"%pV;#YHp&RX:PjFDP!L$]\B&/>Z5m]Y8
+%N!1Bq<eeZ!VVNZ9i'*KbX(:]%C&kn*]Dt+CCVk5dqmH at 7$6O-1=Xi(9oJ#uEC41!enb&I!5MA0Q^O+^Y(1PS0,nfsH6g5Gj&Mo';
+%&I*a8njcKP<F%+-3#t?3j<Jt,/mUE]gW,s7/<>VF>>9VS/cN9cq8HPtC9RC,-J6i%_pG$%p;'*<Yde;Y`9]MV!AndP.o1f=:;jA/
+%?OV64"d_nrjj9oE7d_5WoP0A..QN-F4S=LrUJPQJDNKF+3)^U>=/U9u1Yh%l]hW"uA1Z\,5fd2Xqp9).e:8_"@<]Pqd\rIXLJ,-R
+%BR53GT)D;43fOm`QJR)815mZPePq5KH04Y]hH:08!ke6(7ub:Ld'p>^aXl2jA=^gCUqD^:Y`0<TZ.:&X'>k)j)-/N2>gkl-*T-D6
+%9<St*B"iSp)RE_N!->7o09s;>_L'ca\JgGEOofLtDMVV`eJ(;g<:FJ*QOS+oRN,mih-*7hg.K*CbF\=C.^Si1 at ji,lU.X(E(^OBu
+%BsbJ$j"b?&,(Kg#,Uq#L[@+8!(a$Y_QI"L.0%#3C>a`6Hhff:D[D0EC44LR3f_?Ie16s(k"Yje+Mk*L(.3pabI;+&i'Xg`<IJXlZ
+%ahr>j.$B_5p:?_&W-2Dad"V`qn^<j,Lt=jdQ/3EuLK`JNbf\os[EoWKK:J4S-9Q5 at 8g3f-fW==\5XBq5ShD)13gtC.""&Wr.84!/
+%;cm;f20\CP2H0B66"S,"X]\e%%3`kC\FH#&ZgGqh$o(NPW;]E,a0\)@J=hBbbDVpX7AEP;[/3HR-sZ_]J*L/T_mi,"Vs at uZ]Nk<n
+%k&3YPUM1g%KW\N_RhZgh/I5CfW?q`,adT>W?8jjUg6Ra`WDGR,k,AWW&2SS#EJ1u*.N/DI*)4SR/f3*GUqJ=Rqop(I1sA_nQSj8C
+%Y&&<I#gbeW'1!JF%[X_\>+P;W"5]%bkX>N]GQU3bcarfWqT&IC!$5M+a'J%\\$#F!\SFP_Y3r%m!)cGSXrVY&:&.%.<YT2c55)Xk
+%8g#2]OZ[G?EB[b9i<(\!Bbk[+$N2)Be\DhZeLqOb>h-Y/]-Q]cB-F4\MN47d2Vg#AA/+:N29$;h@<^=J;S'lpRCTbZO at LJ=o2B81
+%\f-*_dk^=A&o3VP.ksKA!apH3<J3G^^A0$2dg#+LM7'`@;r2R!mCV)1*(`EsG+F8Df?%dS4BJaZ*Q?js+0#E\H,-"THoqr0"e(NQ
+%hQP.s&%8rL>G3L'Eir=N6a=d at -GNXbWN+;!Q?Couf1\MpbNH*k4.H3/2;P<5A8OI'i1j#h&OXCGV_BR'El(_AE--FVJrZ2C7tXLt
+%&ZpeS,+I$=[?$e;2.2c_Q5e&0!t+sFZc`VRp%Q_rF0/G?l'Z?_C5s2m/qB7#-EK&]2uih[BRP^RK0n=?-FC'R$<J+J$l6No**C<G
+%h[N\Pk;I80e]ID&rp6d.9K-?GX:+.BMo`9]MtVh*]3VS/!r1EZWu=P`^A-SmjC<K)^qdF%#p%iM-+B1uYIOK>4u6B2jgKJ;^t9X+
+%5HWQ0ad,fn37+;PJ)h2ufReEsHLg*P$5pi0>*\VAjK"(^a)T(d]K"\Or:pu$0uIO4[L-A4m2'7[Z;Q&BNsYBu<7PI0K]?Tm^>uJP
+%h&TcLSOVWbZr+c!Eq at Vh4F(i#ggtUJ15#-UO3EI7f&`_>mAc._@;QOK0dR=UJsCuY8k*urZf9k;<i\FlQ&U0@"ds/Sjo/`C*c,<m
+%m#`2:;b#l-4/JC_VPF;c]L;>)C%Sls7EbHVjN"3j_jY-\QCZYHrHEC/s7O6tTDNP42WA7U7[TO'l/9RL5!IfRb3IgOZ]?l^2P1Yf
+%008qRN$n3lmrl/*LHOj1^le#oD(O`Fmc/a+:uMRNqoaCt)Xpl#Ht>=EXk%?7UY=C%i`n,#m+u\nU=jr%136bY#u#_rl at Ql?:7o=Q
+%g%1"AHQ$mo:Ld[j-ff+[bU)c/j_]:d_Zpg0h_:^X$Z#0N"rO at 7[&bO%hk&59 at K=\]2J`?bpi1IgFVT3t#3:o9Is4O*m0AXja37=S
+%#Me;2o^ft`Uf(Ck?k2\XngUUE)F$*7r6;'g0.jX_4;GI3b2&,Q+(K-7D%*Po\ENHb:8tJ-_^r6]mmb at h2=UXbNULIP2;@upd1DuG
+%la+)_!T6<qn&a,(#H'L3]gLn8gS$$A%:i0sl6">]hGl(,ICh*j_S+ct43ADP7HuhOjk%OIX6]J!]m-.Ml&Ng$RB'fk$h-;jBmt\?
+%185YuI=08Nhr/8P^PC%!jAU&hU2.NMP)s%"s7&bYgB+9W_5_9hO,DHW1iFji4+m&Ld$:6+O0)f.2oYd+`#\^$KqI8nQ!NK7I=!-`
+%;%_s-bJ_?=](s(EYo1p#cI[3J?d?h^(I!.\DRHVt2o[g\Hg7:D:Kb3_pCCJcpkG8P(Fs.aK:C5W]PeGE4Pf^edJR_E&XiPss$-ML
+%5$0mdG29mDO at VOUXhO\uF$&j4]q(eoXLBt]`@-4_e,ek*UJ7)ID6uu/Zc<=)rSsnCh0'GrpYhn!nS/)2#H>;Q#OCV&l_/qI=a"iM
+%RostTN,,cS`'&5#k>u:WW>]K at oR3`VA.SKm&+R3.Aj3fO",M:&]B2FVW[jfKjYD6k?(;c\H]UHLoC;NZ3m-Pe&r/sELQttb6K(hL
+%3XOL"@ZG4Fj2gR_US`,tQnE<M`t!LdM4'KNM/koCI_WGK.)Ko+';2AOVKWIEG"uK="??0hNokL&@VMHP+j_\!j6c9-:m%4tpl`aG
+%XUjm/=g+DE9ef0lf6ir1oes"/2l4 at Z2)TaE&c=`t+.8dX<@l45<OCIV4!H81\T=);h'),Bo7IMHG9qMHNL+k(o94NRK.5E*WHljQ
+%<;-!86U";R&<)o%+,"GQ9]0P6-9 at 1G]omSWJUE8LfQF;6O!:@b5-YYn"R!J0ir&ObBp.YU*9gjSeQn4_6:0%9=BR"_H!KHb59TN!
+%Xp;-A'_:\ZH<Q)b?>)R+^7!k"mXN.;/U?(SpWl'-ICX&Q_/E:+M30i'kRR=`f at QYpr)QG\8;92_hct%MfXD8!*"'\kXtERjT_,:g
+%-B<u,0,rG?"L%!,[jkfCYiW41%17cK/GF72UA#Oc)#[4S]'IH_HSE=uOl'_H<T-RX1%""Z$:Z-$eTc!P(LL/4-q,8Hh$,SB at H2e>
+%`SMF at D"TRDdol*5=phn!'pmnI.3AR]!EiRjC19l^K!uM at n4'#aenr"dEiI<AepBoS<nlZWWR(GehS)/D_e at X4q^mISB:0P>H(Ta)
+%F[UQ\DE`DpCQUnfN[`Pu(JFVinLV&[1XWDsn59=SduShJ>,\>tp;'c5K"Cc$e%`FUVl;t.']cnDef#'2_'tm1Np?lT6!<RFfoHo?
+%IdYO3Aucm4(-,_;0A[^q3+2\^>Sd<L^.3P^?f,S[UWm[8YPi\&_MmpSTpPMWQ^:gfB]OeaM&1Afn*<D3a1'+$6LooL)6pZ!Z<%aJ
+%h)1_`?QV/A?A?KBHuVR+L:;Hno'b1k0)_,ajE=qjaLMMe"Y$(Ys(L.3/ulrlo;cI83p:2/?'fS=N&ML at eF3]e*,15bQ1h';qse[j
+%jB\]I0rlNUh,?sbo!-g+eqb]UhR_[fGL(^7pal(".BV1=84%N1A5E'&cTeul*n`i%5-;fk,4W(N$WG\$qeinHmh\S[b5Kte!CFP,
+%VYo"[^V"rc](YY!BTD-$n],s+#H`.Er#N&MnoFnAA-<O+MuJ!Cq)f^Z1$*H?p`b08Vk'I[E<<pa^D at lZj?`-2HoLgBjnEA9mM.15
+%?-\5LRu;tXq/B295I]SD$b>+]+7.19A(lEVgJgVuM#k]^a5F_DF-g2#k,3Ae</$ch1lCJGYFI5Z9qO-$g4qiQ'Ak_CkUE=Fef/nf
+%njb'^HBJV;>Ym`Uk2O9D8B(Wm3>#Tuf?B2 at +oH-`NEsGTFnJ9oO)P*iiL"H:g*u'k/M]s"UM4Tm_#Ptp]UTMN,1,9)X!a2k<kKTU
+%^EPPCYgs+$f\*kGT^q5[\b6eq\2NsAGR^,6o/2Bt'O'=WqG9INJ`Rj/h\qW%Y9X\KNujn:J"O[jFu$mdf at 4T2j-"gG*67YUV377S
+%A]W;P_]HrR"uAjD\ZhmiE0q8DF0?/m2jr2TH5&hd1I`I at a*'<<\JNV2Q`pE'Kre/W;[i.bj6m^%*?]_I&+8C28Ou=EeXtJ&Zl2-"
+%95aj`?d!j%%P]!:R)+hgTc5I?Y*!f'>63LYroGg4@!j5Up[QQ2nX^-a6O,UpgUST(GF1l,RTPH^5)?K)Gm,@)[.9f92tO*=+F'Nn
+%!.NTF^*9>$Huo+8$DfkK#KG[sV\94SjBG<t:T#kPk?j_6!86!kO1uJ7Pp)"RLCUgg8=8I-T?/[J5^k$N9:Kl?7D`(6df%,r^8J"t
+%)RAKB5?SAah9O<=M%OV\ePfdG4$'9li^7naVrYTcq)UfJECfm[6s&JLcRE3*A#1UeXtBd#7qH97X08F>lZ2j"gnP5f,P^IO.Kg(j
+%=dZNI!-:.]mKD'*EmDsV`>TU-VNE\Q[16ho!,P=#gmRKUCi@:Hfpf[!iT#-579-i at F)$%<bVYh0CliZX_X=2 at HYIViEMPu@FI//d
+%^t*k at BA(Hk0O+6l9&;fu;BO3IAT2bKRpbbJCGeX,Pa#N)_R&?nk[=OA^)=At65&36TAVbXS$0NuZXsJL[[>tkZU#E0S\;""'=.Jt
+%(uVq/A.:Aum'9ED4bcP2!RPopb7ISbd4\2G8G$UA_SJ/?l at G4jcF8s^&<L/5\-mWaZ3Fe8m_[q!>JOjoe&dbA%g6:ST\Aod!0sP?
+%/RpJ7"2ia.Ln.'F#^k)b`BckTiY69JCd\s&n9+"Y4f">d(D.4=S_;SGYr_'SBaD*Ok:0Lc#jRJUr5NIaolTsL;JL@^q&u[8.>N!"
+%BhG_^+.?#p#/VTD#to!XV%an;ORF6H8/+:TN\5&k.q at Ru[D[Z-e%TbEif'uD4iq+YX]T&+i2_k0Yo=F$LGOn7rNH at r"An3V\ui?n
+%A at 5DL=_@$65NfMsj;tK$8Os2^.$XJ:Rn.<%,"j.OepP?+ltX$JD\lqb^+,FERj/41 at EcgT9hMZ5/]]9*Zd+q7Zb4ATU_]+(pjD_Z
+%h*R5J"A*X*)K at 9+6DO)2P_gJ!?`"`iJ?;#cLXKqb`tneVdc8$.oT*?ZgQe:h,"+DSMe7,m.Fb^S99"\9-f5qR5H:U<5b97NI>'Ja
+%@ZmUP]Ga^N[*VYLVA9[16L!>Y.Z^Vr]IpS4PQuIaW<G:gs4.0h?Hp;VlhJ;?2:m0g\,efqKYiWr\as'9l<<S7BfZc`2G*clpZ<qh
+%)ukW at gGZ?Zk<^'u9es8?ZbUT<8,^lQE\:b[bb=BZ"q89O6D;V%kWC%9QYe82Hch<.Ku07YKL]t[AIf]dg^"dnO/^;Xb2fl>30=@o
+%!t2qjG:e/#=t%(>Hl_bI>^iEr(*908b0i/2OfL=Nc[#%Ee61;[HL*i>fYM$k;MRbD$V%G)Tah$HdLO/OW)maAW1 at 9rB2L"O/DH\M
+%X- at TD^SM#aF]WeHTEa-M-6LMYrliWCFgMs;Ou+Ccl4#`?>jhL!Z)#EN^%u_!7i76\[eLW]X8./1<PJgsks:BpEjACYf.e@*j*,Zu
+%bjH4YR^P%15O?C5g!5U<_4LJ*d9,GjG'"WV)7=/WqDcneN.V5ff*-ljD,q$JQ2u,M\_=cC",8JE;.Xka8RP9Q0D0;Cd.*L!d8Uq-
+%Ii at 0t3QUZU@10]L9?7MTRN##ao:CITkk(/elu)VTQ&e9&UU^]E>ECSDOu*eL1AnTc=V2hCIbR<IR`Tp#/d\7IU!bT-KSpL(+#Mkc
+%R?)"^kq#$[hV5?L'MGDF-5>Je- at A3'8n,T"K+JcB8PGW6cQS&>BE#005&/ci;Mm<g'P`d!MdgL7mJ5p#5M>cIRpGRSe/K2E$]afd
+%j^E^E-$:,_KVRTj`$8"f5+=>m3(F=Ag/m1GD"KePGgY?6"+,M5I"%FXSfp2a\(dgFD2Tgh;G:sER)od]8WD#7(esiF^=.]NMtV1:
+%TD$.r2pT;nqfDf4GtYm,]^P60[+q#>MYioT,Qt`9h:%t:W at s6MT'K\uWh;bp9eNeo%KYNC,[>ur<m/G[0VJY0fg6 at 9Pf['`GmYAO
+%.BF%CGXd%oOGB;pAdcD5iaW1s6t4C^NJ4)"ERb/>)L at K-S<c=^(4]5gBPSBWPFTKY]GD6eKQ\u\KR#f'7EUHlNPFn'YXS`ZDZn<8
+%.Ycs&kTc[d-t+,?RO%+,rO0C!punLM"O2iu[-S.u;a+p%nCa+AY0 at T'ag#"7%q?0[#-(4X:?hTLc6Pe)=!mc"`I1I:%3rS&.<NJM
+%\Ck;H;#K&`G#'d*\Q=\$@I\RO!T0S&5BX(@7e2f(Wh`"U:4Ej.cplIT:_#r`fKtsT+P8$5D"@o*Gl[cj7(K2D;HLPmXo at ggqq)jV
+%QH?b_7i^5 at SXUTiRlj+Eh\.?<@=&#Pbt5_XMe.,&ig+WZ\La@"k19S8[MpkWkCRVi-!1j_b<9q;/hB1c=(,/%\%"dte_lH]Y&%?h
+%@eW=E<E#q%)3+3.Cb$LW[bN-S^-^CO(27MTC)$0*C at cC@BNc\?P?Ge?^X]2[\VfB1j%\mP[@DU*@Q6fs=LE(a-%9RU[Sf)^EtBF>
+%CjkH at _0\(Oq\:e/35>9*rfS_tE8O1A6\'CROK2tFl<_hFd]JIGm2)'@43Z7qd=\s`0X`/e-(S4Tl/Ub-&^Hb*`bH#k%8oiS)R*im
+%Ki50Q]jsI/=SS_Q0Y[T&&)8(Kb`[H<F-Fqp?[33Cck$KR718LEk"4t]4,c4VXsl*1-R9EfbI^pIhu)r8^O=r#Hb]TdZS.+,H4H%>
+%;=noA*uJVumKPK$kKi92Zn at foDTFL!2:S\g+P;7gB\=JI8<\R4.4d=p(rTKf_]jQ<C8^JO<&2dtD/f[)n-IXDq9 at HF1t9Ba]Dj!t
+%2J!r'3&]'aak[Lm"Kl<7PMAYFhV1I at UeJ?sG6=uEF%ihoN+$=J=.?BqUWlq+Q22>E)TUeqhX[M]ld&iP'B!YUjr`49<fS+.i at IG9
+%#u-%rVgLS\NZ`sLKPTT&9Kqglp>6l02hVWnosVX<o(eR2ja3uKrrgXXoNlT'faa:9QE0H(-n1bJmATQ at Sc6EIZfpi3Bmp.i?\9cc
+%oYh:tgX#'9nlKb_YJG[-_mCZa*G-0-g&[n2+%Ge6M#?^&9cm&sD;n?Ss)TFRg77:EUZ9f)"b+Zirq.m^W+Efbru+VE&7,>4=,OD<
+%n:#YmrJ0qM5]`i(oL,taN),I[*m0/&55tK]'of^(ro$g?$YaUY70QgUO6ln'U!o/'s82qibeu?%e\Q4lI`;\I^gX[L&PSUF*FQLs
+%*:0?f0URYp=J:RkL_*:Ze)MPTM3r.UkH69+joPP2iZRW%Y)XiF'a/!7,O0t9f"fR+Gnk3Vj1&sif;t?mGH8q']6`f)G,F\[$.=]H
+%?bJ7'YK:Eg*&shj?rihZRXMA1+bCG\Yp:Q[ZAF-LVaj'+5OaqH/DtYe"!r0G)!ColU:*!V'L_*m*'2H;aY3!0BHY%"V.t99B>5"_
+%UP::ig^U;co=A,#kPreM-+%a:[,Dq+<dMqaGr'CPaC)41huY?kY+5V.AuocDQ>N9ZcL+OUfVa_9_GP(e^4DZ92\M^3[Y%B1hH47;
+%5[t,&ao*@kK_&[M%D\hGYM(I$0D3e(Y,sHZs6Ni'%*uHjYluhW!T+S#o`k163inFa+,5)%L]hqEG6;5Imq+MMn&U&JMVj(I\]jD$
+%h`_g0V"Le_\Ns#_(>b[om5V+[8jhI3(Y`gg$QfAqf+9/Y8nX!3V[tAMeg8OAc)5iqS4 at 1q@To>E.77:/,^('X*15j_bsP*OfGh?*
+%>"hG at O+imVisHs8=)E$<Ol\FL$t+3NXJt]%.]U%\^l%"jbsR8=[VH%kWgh>c<uT$Xe#.2;TU*5&pmD%KkSSSUZ$jV(nX;k?BTjA[
+%rE#>T+]MI at 9TaU59pc-;U8YleFO`^U!TsYXiPQG5!$0l84&AmrDU!@#bWM2gr%.%[j`Q[Y`8nq7EQ[4$n+sJeguOao4?N%^]lORY
+%:Oi#/Ie=5DrpZ!K;bit!rU&@srTuiKl7YC#O8o1qJ+m$:hZ!4%s6:a\(m"FrXaP(hk^T\i at Fr;/"*IlM=\9Zp0mfk]nUn`3=sQ(=
+%9+ at n(<U9?$[,0QW)=jt4`/O(E2[K%p0E[HI>/S.AS5bi@]kPXonDqIATI'WcFP;DY&=0IG#KN@^ZCJ\:4MWZ?f&OS,2+95'1^ZTE
+%3kc=W!e-^T98K5Pnl_/S/r"^jl6,K&%LI6ioq8Yt1a<uLc^9ZKFiGk-F9=sibKA`DcG0C?^I\&H!3S=/*7h.75;Ei at +N2ekO@-f/
+%3&iXO_oEIg4[Z^f/c2jXW4H"rBauec_N%9So85BS_k-<!oMP.oC;L$.Guo`fXc3)=7RcI^&OKD3UG=53bIFJQc5).T?_Dm_l&PA"
+%BR-8eGo)E- at AmYsO`XErlJk4P<R[addcK&ApM\YQB82Ne^mV(:<0 at MGK6#[l at 9t@[O`.LJOIGU,c`R[t!)aW5B2!S3,kQoIo/_8G
+%B755^bpkN]=o8p&OJ@*.ofPs$R3VO[k-s?kVHqIp\iY=][VZJW'C;-s_YrL<AB%ORj-fZ<&S?3kgtG&*G1nC:cr)397SKQi5+A^[
+%,2GECm96"p;uVNg(_0c&d'UFX]S*23Ctcb6W>o..<N#T4p1F(J8s>_J38TNAJkCpcfWrYXO!+*E at 1FOCr:YMr/;asMg#;Buo*u`I
+%Y2Jt-oH>p?^A6[0'Q"t0);]p)9OT)CI5-$T at A@^:@Xb[<kSlA]jmZW`I.pQq<-+Co^W#=h[n%tuboM8C.nepC88><=s#fi"@M3;E
+%^a+QaC55HXM(mjUV[t8`C#+a\60R)ujlOO-F#MbuZNN_C^uOoY4/Rcc+*R48=5W,nqm`mK!H#?n0dCUc]n=?8EaV?QcQ&uUQ2P!6
+%ZeDIPiR64YAf6W&C&r3sG`7<IrePHc@!'._J+U5<UYFq'q#W=J at tjG"a#ua/ZafrTApW8s;EX'-R6t-6REq2EB!1R7?0?H)FL,]?
+%)8SZ)p41Q:b8k97NOB5s*2^$egXQSnBQtQ:+$8S3Tm-sa."3R>T(U"624JJ6qL5gVqYMYNXkJQFM*L+B=7PbO-:WB\dWIE*Tfq4"
+%NEJ$"J%a%qZnkM;f6]UJafk(S+[(>O,s(cU/"Nm(]D.F)_^KWnS7f33dc[*X%pFtUH+#+aKo$ree$SabG,+&\3`mlsUtklHVu34V
+%OM^SmEDYlNX?cCE]k/<779Aabo^&+ul-OS*rOp[ao<K;Gb0Fm6T at fGr[\QC^;^?MdlA`!j2FYHu>FHYN]<_s#m&iXe]uK"iqU$j%
+%eWdYa<bF>>),F"_mBCroQ$='rK&-$^Of[^#Vl(*U41n\bC<f#!g>2F[:):664`FQU^AY)[LI%:P^fL2oT5kGsA`bq=d,W at cQpOfr
+%CH3l<nBJ:3K2S]-VflM at ot2VPf8WXW?n;VhU0cY#?%uRo#k]0cqBPqmqr8A?QOU9/2%8&&.A8jSdSp^uO.,n7JU/1sCm)YokDUJk
+%hh"%ua2Qp9#FK4fGXMp^=X,Me,PGme>'?06ah]FDNPf^1klfV7d-*YfkV!!RL-^H(n?,Rqh/gZ[%+cZH#_nqrfoHoG>:Htb0NftY
+%YMZ9$&`nc6B!38gAF2h^l;XC^n0b,oJqh(QgRMdCJAE>9bWD-:F\,7/[d$_#LWc"P.]tU,_Rr[MjU]?^A[kG&I-s*Sh'eeCj7[(t
+%k$U:E5]N(!.:LU'^[\;'D<RCJ%t4qH^hloF-uCqC*[bc8AA\8u5Agn3RR;aT#&:7S*U-KU*;K:n^?;KoD!2/f3VgeiX6sugF#D*\
+%236qWZ]#95X]^=Ho2lRGRkg`$A at 1CP^Sdc-\.O^1of%=<1W+$*U&JZ*r59qu;TL`]K3>Cd(nT<%%XfoiR*^iaAB1c%k7gDo?LAn@
+%OUc^*TGQN/Qe\*;6[Abf=tLCM)(%"FO at +f0K/!*4:AM;ibE5.N-qXg_g`a#ML`V'5QKthH?Ila<V_i0]/\h0m(A&.;jRUEb_Cb:*
+%5Q93:rphlXrqh3AV18*O^\c:UnXI:?Ea^NpUg[p_]!1^hJ1i/)p'C>B--7]&C.R)>QB[q%3fB7OBT'q:%:Lu6J>Wa5X)K._$%Zfe
+%2!@0>O3uJ`Q))"mD:*-Qf2A[Hl'7-Q^'nV6>("jLiG&<nD+5c"Z$g$lDI7cI)P`;Z]7UF/VF$UQ+mTX'TTHUIicis2?(s0j[Rg9?
+%iQNo:0Ak[*a4%.*mk>g_ftuOK8eA"r:tIX*8Dejtg:#@&76ZFNYb*AARH6M\a4dqdSY0nMSm4(rLmb^>rXW90M.R2,kG["CN>?8q
+%fSt=omF$2tWqMm]$Tg.Ai;@@P]r6;7aa(Sp=DP6e5ZrJ?ajOVr8-,()]%AZ0DoPKUj+=SR(F\ng?bdCj53Df+GEfdo^A3Yaf!T:!
+%#?OjVnfu?j7m<?'@Wo^cD]'t8d`#R_?FGIu:4DON"7SRTdHtV`?#<Y_?K%El\ZghpN`[oR&>lQ:1 at YRtK&Q;>LjqdFPKJgR1n<K\
+%7-J?W>(G;<)oOL&hYblo&#;O5`%)(d_-'rm6g56q&(i(0QnZ8:lnYr:,56>NO$f4kapT>._pX9YR)'@L#BqjhWYWq62Zp:)a428r
+%g]Ds^K<@2M4%BPqeL[F%b]ip"g\uQda0El4*KCJJ.nljLGE at Y!-)'ZTr(VQ3LDeBrN8nN,D19AU^Vag:hbQ at N__jAqkU5g/rV^9I
+%L4HIqH?K!K6rmMK@"(!IS(T;8rN's"q=!nl_6kAG>]UctZ2o`G_N2du"XDhTeLH>>/_>2-N)C*9W=GLpdqOho'%J_ at IoRtVoe*(Y
+%@sKcE*2cij:_iHbb$EL1X]MUidS4-a(Z.>Mk'rGIfl/%f6*CDbPbJ<2iT_9R9T!3qDAXEk9@@?pbtBtUQoIE5P5H-V4<Bgo#IP=,
+%i>%Yob$VJ#dHLnX.TLcZ'M?3 at m>Mf3UgilD2VPh<;i=0!i5;FU)ue+4SmH(G1[H0`>ML#`V:TsH9f#=TAsoPDcu;)dQdCm/5+C`_
+%<U>UdYCMnAp^73-"-6bP*.QdB3:q;Kini!=r06h'+E;OaMj(;8TaCWf2LsO^Zc[9CCt410lBn<oZ-:rS<HK`2=J'mYeTuJOX8EmE
+%_FMhe%!=BNTqnDT084+Br(1a]%Q9C"gFjcb7Zk!j+7O\!=u/qeK6>kJcE]Thj#!(,A/ZirB.lA:mW$q*iqi"M.su\VMu<@@e;iG&
+%^AR#P[P(u1&O?">K+P`:^&Ad2@(Po'V&t.''u`%Gj4$V.G&rF<^?9reKCg!Z?^lE-8&+T(oc$UK8X&'-TG<4s+*)Qc<;n4u$@paN
+%ir3;sgUJq&M1$T*9tk3>,QsY1EVH2co4)u*TJT:`B9nSU3ZQ;2Ntg8GGpq8X1 at 3.jHPkgC/*im;"9eZ at DbmD.=Dim],UlD&[IAR+
+%=W5b*nQhV\[hbY[ljQl.H(IY(fC,g,a6^s>QusHL,sO]Q"#2N0 at kKOMr-#1(X-%#g2]+3B(#Bq3`K)WP8gmsDLMmb-UmOi<&Ltuo
+%3IFS<*Dugd[Tjs`jCCj"fdk"l_=G?1FJ\f!Z2ue]4ucF+#0tAErO"`2:0h0T?V6g*7DQ:`Ur"+"/AIePof^p<L9E"<`9I1#$WDro
+%Ch29q?=GV2\n(M8O+ro0E6?EE6j7s;ZU=*>f(Vk1)mT:GcqH>F?;VomN.^Z5Z6-Z%cL6l?@)2?;P:,0Z"jE-L%I;uBJO8gLET*$<
+%8#PI-^:Cn_^(HZnJsomo_qp$"s1rTCfdt]k0_n8n[?nKO/KrlXA\He2=^q+:g7%U+[N*j$[&Nt"rW]W/TVXE\2iYDp=<,XW=T%/Y
+%]>+?t"`&?G-Q&^_[tDkJlCrj]Nb-kZ&2d5e'(E@",aF./Y,JMuAF-1^i%%c#$=9<-rS%r'!nMg?&%rqJh7%7eHm!@"+Q&OlLo0E3
+%W9fATQGHG=GCL,`kYip<p>D-R<97=i:1298K6XZDC.FOWd9<&`qQW7c$>A1sR&;D0i.\LRQt02K2X at Uu-dQ,Z^,=NQYF94dknnTF
+%?ZY>o9mnL_VXu])Vs3'XD2nbh?[F"aE.GZF?[2>!37qV8^"X!kE,kRgT/eVUc2#HsIcK6\g0"Hu1rID\IK%L+K[UF<#/1DIJMYN0
+%7pEWb%T+k`EN4OMjJ$P1YGTk.%^F&ts$`H$USC%aW0r5.k.Y/GSJAE/g;f3'Z00/o6\7;7)KK,on#;Z+A<Xqo^[[@,-7sfLLL+8O
+%\_,g:`QVL?\iEa*dS\1c'h1dL^C6C^P;;X_1H&C%?sP[MnS96@(eIO"+ZJ9L,^o==n_Vc=jo<t+)=L7WjqNa20Uh#pQ\[Q9#tpTu
+%h[*V"B$'\f6^i4DeSSe7JK?+R*:[?#!_SeLhs_q@*S2<!@\Pp`d3i#k0Ju;%/9pJ`FG.?Ag-riVTF8k\0U*d at 0Z,&;i,4RpcY%ia
+%B^E at 7`r2ThJZOAle5\'8'eSm\\XlcIMI`-*-Ya-dJ\=4YgM88BXd:^j49Y*L3jpQPU"mP6hMY6EGat.IK"&3NIPUG-9k^])n-Wc6
+%OnDUf>J)ou$"cfj7D]?5G>_=2U</uTK$2nIdN]n<=aRi.nWA+</0W]pCa5cF%LkmW/[*o\F(5RET*\Hi$6'86olZ*\ci_u\XoYiG
+%`h<gP2!?j&&;B62AHI((F%]/&3Xf)D=-D7`(0&YGs1!_SLJ1[CkE"*;[C]PM`ke`Ipai(5V+4OonF-87hnoA;ST47_8d%p6P*Z,r
+%+8kH[#ClT.s70SW%as+(n5jNfUqcj\HH<PQ-A,ZdnTsu?<Rk1]!ZJ;=@O?Rk+lnqPdosJ&'ZVVI\hQYhcb%1*lokK$!j=X3E?K`2
+%2,a9qr*\&!E!.jUcp1ufW.O'hOG(B9J_>ZF^rs"9D?"TZqVU)PrQb9*hpr57O+1Rc>:;#Kk]jAH75U/k<S5KHTX7[g--u?!.MYS#
+%q!*Nd%n.ET(LcBO-jrsLT4_"e(aj25._m7ZWUBhE^aq%BhE=M-;;Sr!\^1ED131(Z]ett-YkV,Dnpr"=@b%8!%0!Mjp=&:U98uc6
+%<LAB9:DqkOoj4`T>T5A.GdS at q@=#l>7e<p!PU(%GJ-052O<nDck at CE-S,eVgp>OqpE;p_;Z/C+C[&YogmH"CuY`\bMgZ)Z$p at t2$
+%oY5<sIs'N(?^?QEj91LC5J87;RDhK)F-l!cUo>!P+!<<NE$$khlPrk1oE`9(32bXu0$Lt9pfF%9\-S!o5[#I>3:4!a1Oqd1/<1M@
+%7:(3ZIOsG7Z68IYBHLttrnEpPhbe[t)k3MX]7'L%W13YH'i(_fg&h`K#GE)^Ti=QP@\isS(@jf!U+j_)f_:U$T:19,$-iM2NrJ])
+%nu)N]n9ncno&Y(#FT!6 at o@EL)A+,4t"'3UW]@*;VeXrbE1A:H%Nd&G?1;(pP#1.nJoL!$ibX$u:cNa2h*"J.#'f,o-;)!2r>rZam
+%U]1eaAYm`j!huoV>0_S*>H&#=mn<?gib,gekd%l*=)as3Af1roF'QWgRWoqfol)UZn]`"lKV9Gs_lkfp',.'sY:5,A68o+Kb6tkl
+%L90bgoZ#:8Sd2ja7R["=<>C%],-ctfI,/5>;W,5HOZajV2D?\_B at -dcD`S\p`ST*0Fkp\_,TtsD6')0[$sJ<hF+hC\D,Qg.N`">0
+%#l`s)e\^MgJb<F#+%0ekM/,U=h$H&L>Ye3.#js3Dq.!MV59,T#/0'sr29/!"5*"q7,7jR8NEH(7E@%ahP>0(eh?*'W_)-lHm:/(Y
+%D at 0[1Q+mO%U7UG,CmFl8+HpT?=\FF,WD/<`%KV)WW60p97,#Zg!Xa$-7t0kU^2[)IpAu"l\)9Y4"&!nUkUi9)d0u0TKW6O&M-9%B
+%`r*/$$)fRO,<Ju!$eAFLTnPJOM'D)9@@p7G6se0liqF`YZC#iIE5Vc\3gs\??/W.#kTTG5M06+SYg=B&Fk1dlS6AH4E#8#p%M_jA
+%T3jWp]2GNZgCYhD4f[achXkQfT<!EgfnJVfr9[@pg'NT5iI3ILbU1t@*_,8uj2-!LG\SBi=r=S%#uYZQXD'#BA2 at he9PkiB=DjTZ
+%11t7je8X/Q1j!?(?I^C_Wm0U)Ejj'k-")>FA,.IH)?VQ/1[](Cols5Gfs?%=3<Z>QECAKs-sf!Y4f/N]IW8JC at kZ,$3pTM_!mAco
+%YIP`DHOUmeCeP<:5!dX]jmm*KjA1:'GAb$YT3*JtYNF-dVVj]3\.5,1BfIdbJ+k=XdeW6)rq(]p7;\EbW+:.brkK'<'DA$qOBJU`
+%5G+eG0MCa+1/%"I1Rdp!c(%#DABmsdo?5.'C+'&X7=#+hS!iV<4:MPE@;cZsi!mT5_Nmuo9=U at 5`88YgG?SWT^-<"@%2I/bkJd;k
+%+MXE=BA8-:;t%iASZhLhIsXsbbDF[oI3D+K_!X=fEaJ]>nV&>>X!]O:5r>=?'3r9([<o6i%N'T,oKg?4 at Gm#&n+(J/nGbn_>BoVS
+%Q<u\cS%T6tBcd2<hZ!fZ4&l, at cB-4fK*GoMGRtn8K(h)baT2u,ZNDC(??)='8bb,(Q]LlkGH2n!G at 6?(X3p!N85J:?R=TY"T`9FP
+%?o?"*g!,JnPHs32/u!.%[WmjA2gH;-rr)`<S/_E7;Z-4Jjp3f1<^V'!^_TFAUWMh`T#Udm1VRqf*db>>oVH2I7pgqY*IX(=*IVXF
+%n*!Cdp5Zj_jlPMckEfeinD8pP^N=]ZHPtPd4FDJWh>)$]W^"DL?;63IGVoQ)ZDDQS+1J0^Vu*O0ai*?4N]:pV>FRn]bH;GO[aj^K
+%#/JX``mi at X@8.$2f^Q:,#/gq!-cf<MEk'nl#tEEO*KL&C';K\N1?"@UP/n_Ps6>Yc?8L,u\YRejhKA^AZbJ'^pKW7H:]PZ`#>e_'
+%n3\kI[oOQdS,RF%-3KOPZ$[#KE<-;kQaJF)P&iGs]R7Q5jWe&P:D&G_m9)WRk0TUndJXb2ke\tCSfG0Ice9!+(e>BdnbI5ZJ+B,a
+%0/X>YfX!S18Qq0^.UGQ!%#C<YaIeoH2<hl(bHCQG>n*CY)?2>DF_&fM]C3qRh'"_fqi<@6p%E/cH-5KXd\aWn;n0nn at db8aXjjE8
+%WJP8<Yn,H/j$RooT2%HJ4P*+G$o.AmlDlT3p^<5an^lB0rmUMq3L at U=^A%"=cZE().O7&4:P8G=HoBQcrTJ-$ikI-4g&Cclci3"-
+%A>DW6rS^nM^;n<&j2WhDr@<q'r6l-]9Y[4a[s5L*3I3dQ7W1mudmP=L+2_2/es!^n2kLCLodJ\!s$WD84U+)LaVnLC`koFpV<kth
+%6@<S2B/kS9q%/"j0c^#>0oSV9SAMnVs7FhbV"e$CfsmTmT<Pe[ghd/PKQ1g\h[8]rO.onV>]6VC<3IBN\"[1!'=>RfoJL,C_ZV3l
+%0BOk7I1j"^CR2JG5J5Qie's^nJuqf/MNhf:g54^(K3'[Z6,[%E<s0f26''WF,?XTUJhBPn]t-F5UmAd0rkYeQ-bRXq&Mt&C-QW,o
+%aG[9b!+u'ENfEs7^0WjpHs<*5#CrIU!*XNf0D&YG,`?H;(P"=oH:Jp%jH"0hA;(+!o@[Wsjfsj%N"iqOBGmHm2sUL*rV^0:r@&`t
+%o/%]9kg;D:oBfV:#BosXZ0))0hO?B(H<f'Rmu$%Q^l'DtLb:+=_0dFMamEt\#ZJH=*??./YR2(a%2=&&O at 9-Fc988"H-QEr'L7O_
+%<?4/;;99>oEnn3\[FYUK$9 at 5H+qUf:S;^5*f*?`a7k'$uh+Y!lAR*B=P4u_Z]FTV$('"/Y*VMQ\n!joTok1<OP7ce;8&VED;1_ei
+%Wd.2/:NLHsZD\"Vj%&,<iAr;9RY91u at NB;X7'ECn9;'e'Ku/&Cq4M[(.-3%feIc:KLG;??jU%_%8(iseh:XEk\Yk9GdH5=n\i(5G
+%bp=BUR*GLQ_%9mWG)69Cf644cr^gF"QX`\,`i`g,k"d&j]IP91cqTaGa9GhEJA,7C[+V4Cd6.2GR<6>-HBk\G*p(*e.7n70)'U.h
+%_KX;hS&3shlY2sCZ?-_9jV=r)3BuM`Oce#6BA4/=Dt[.O,pJXj,Oor9bBbtX_ap^aJ;ki,KdCAm?12HR^@V$%.J479X_D,iS,A<1
+%aMG#d=tWdG7t)IdcF+/spInnpffVbK`BlD747D[T(12VZ4!XOB1"^4W#8Gn)'DAK0i@=1P'+mQ_\AHUl,R8CGat=?/YdPYOW#jU,
+%)@=)49qV*Yr/4gj?o9"5-5L)sB2g$_l>pd?,2*0CZ(+m3=dKDra`ST>[YUoGJ;,IM,h)H\jU9%\;p'1EoqKmtIC;Y)Oj<)O<o#SY
+%,0G-'H*q9mIEr1bRLiueF9jrA_*7&9__rn;RI_W<#W-=Dm,kLG*X8B/Y&7Te'D?]S7`nK@`]]a7oD4.5FduNs\?bITR>X_[,^RDH
+%nk:)%Un))6-OFmf0=h<QN:d3Y"W!5k9n?k7A[7QN^8t=Rp,:K%W7V^qMuoo2kgu:*-BoKPgWNK%GAS_P$72=T3l++/Qbj%%%d_J?
+%muO[Tdg]bklNu*d*+K-u!jm9r!n8nh1)L-/kXYsh9MI$-.5WN8+/',0$q`)ug.>M^d>?krab;Qug&FWB:qEbe<ObRZ5<0(=LeMde
+%.Zjg+s&<cWSpV`aY%XFtKrAWIU.fWmXt)j_?-YH$XuQT7LY]E7'U*On\j'lRX!B6@#'Xr9Q/cWEX307Id76l[*b@?ao<@U%Hu)6:
+%TRf8'H]*^A2<:F0IaZYF.56BND7KlsrU^h1+2AfH#B2-rBkJSK*^#I#@t"dT#)ele8b6'/J1M5N3kDg2,FN(9MtEl:;3s;Gp&`VK
+%b7YD!a[;jUS$d?%>A4XgC2b1/?="pF1-G,@?A*==q at Sh1IZgsipA+7l09b8G-7TR"'3VRRBq62'CLtdjI<b`&eH2*)ht_^YfC!DJ
+%6IfQ)<gT8jLNR$@d!=t7mu7)--SfiA41\XsTYPI>p'aqglL2!7%q!IqAn*dq*IlCDPQ((g\+f^;$=I#-4?ocs9.;F_/4=hBW!9R'
+%&<$!,C7.WY$bZ0?9IH<mUmnc9Y;&fh_?sBN#[)070l(tKhoEYp/\>d$MFmD^_YZ^uJp..\K:a3:\d>BS4Q:e0`g5e]8APOX271@@
+%]cYAOSu&3q7Ssak3%<r36"4&)g;br at F.5iZbb;Lujp]7$o$S/]Q1Y34JV^h:[I;H+C-!%GbpW?\0c<ZnRjo]_ZnC'7!J[d1lDs;a
+%P&eLp>d/"._UK>sp>/SS0VpNfOh<N(S$eO5IakY]Z&:I^)RQL4G35Y84hj`0B_R%LQG_;HM'QbGdEk')p=j3J%WGdR4QK(:DDR.%
+%)8(KF6K,"^NmT,ks$WSO4%Bu4nC=70,qSF],`uI8djm`RIUN_e>,c"\n"N;JR*""7;9%GK<REdL>Gd8$E-#f5)'B9`;P-*C4Y\FZ
+%7T@=tfIG`\BsVrq[EOLlQ.Gu at C[4@#^Toh#M[8rAG<!EU0klpI23L8J8l^rhlZbH1LC??ri3$(OUqJSp;,YA#HEOB`AmAY,"&Dnn
+%9l*IIEqOW,C+J)f0)['S+Pi[YmONZE?e)jYGC,Jb$pd2CQYRSXCjq5JL_VP_-*iTGSl3EF@*>o;a$NQE;2CU(:sh\<gT0hr)2QB?
+%-.uo;Q^9+$1Af9g]<*s)GO*W=)R3(R\h[lE=c[GTd?fPUgeOf*^:_VC;K\ukXQ$dH*O7?B^#C)V>6?3?^jg97mbn4P]o-B0RGX$;
+%@VN%3CJ#DeU%18)lG'R().<1.\paZ?VA7ZaZM:7VZ.F=]GYtOL`Bh,;CK%O*I:WVXs5KqRlOEn^:C(=WS_/o!\)!"EI!_gO<cmjr
+%*Hcd'..\m<@P5g/)m-Cm&]efb^"mVD!pp-+%:?2QK]<MPZ:1Tr'[F\A>d6jM0JHkmN5WsaE/M/b<YHpgTVLSud%h9U(FQ=&eA0p:
+%()A>*B6[$R_W*4!\k<\R)TQ28k:]8BRoQuDm')]9nI.uQ$2ISaero,_M-J#M#'oI/ZAf9DZ8Jd.(KI8P`DOem.h39o&)-dSq#\;b
+%hFPsR4p=lSq:BfDR>YF;G+m8-fKg:Qo\r_W$]SfG_Q)\/UZX_NS\S6$$2%Cc8cTJRH.D+P\nFCai^H^+R)_lSfpgdMS at 7u_Gp/rT
+%hukL+LHi#8e-nHeDsb0mljGX#_m^ir2!;L<A]rOOm/V0Il"%sZih^Bf;`Fs*6E3cl=32prd%Ul^(MTI/YB.-2IL:8_;'pd_0KrAo
+%TR/N(g>OGbFu-)n8-)Y#1a#Mk.l[Y_dgZ#7@?&seVV0kea1Bcof,sT>@:]CPEKecp"4YVh*b[hjl4fML,;IL8.mp/)'\8b<15K0A
+%Uj8Tc"")W;rAKSm_&qj5l/,IO$I/oPL-3A3=eu<*jkD47",1EBN1,;^)2W8X3RoMQY+:t(e at 7p'qJjR;+^IHZOm1/QV4cg51_$X;
+%OuWZNSn&/,L:<)^e&.MLPZZ+We^`&ZBbR[dF&kJ\HuQYP5o;L36$9VWcE8uj:QCOBeOk^],uRT)Lf#D-mEHEFb;SV8fb9<Mn?_*p
+%kJ]o)k/-ZZXU9!pl]kq'I#+="63h'B"S'R84[?EOaCDNg#-$o`!&(B`_EN4t6Xj6$QAI-7'VSH'7G^;QWl/O#=@Ic at 8P!)%T[BM]
+%AcRUjT!>u,`Q:gkdN;!l5gm&L5uoEM<9><?32oJa3a2jaG+KDn$15??8)qE+i[*$fT5!"bScP6U'rG!:-BU^K;%flY>^V%pjCbKU
+%0M(VRd=i at X6:X>!.PU;7MH<D`=F8WpOp7D<.?<S!kGL9of/cG@(1]9fQG<a'l,C02!BO,3Quc%aNg84]TsZ2Ec.L at 0"4 at 9$-KjsKSAuPceqldqhJc(W1m at 8i^<6D
+%:O#*pnp`8?q>Kuk+b='aO/,eBaC'lZ.AuNI*[50Cl[1<Ha-U;5g#rS"N0(qi.W]^Y!l"c4)"l\TEKOhhD9V"V39VO=.mbjN``e]a
+%V,'UtUYQD.O'*(6&snqC-^@Wp6,U*FVW'umT5!jd?WXCRYLeb)Q6[^f/J"F(E63lI05`ZK#e<D_RV#0'Cd+g)^4T<LWK!Q]R/kds
+%"(c'GKA0d(,9n'YEX8\:4X-nkPD5HH\/p\kNBq[nHO')74etn*K:Tm-;;I;M38Pn;73sa at 8#Iac/?9>bVLffYQt+,tNT4,LHc`m:
+%l@;K:MSc@:0,ZDd"l\0/qs!Wi#c<`WA*F`J#sf:`Voe.1E:?RNdW8 at 3']G!cpp9e1m:sI3MTSWs]k^4u;m+<Q]&[_jH!=K3-!HbR
+%d,D)*-99b4-B+JGHBuP]NE9&@rCe#F"42Z.,)0aWm\>/GX:@,lMYbc5CH\U^6>e;2Vl&-DQ-WpS0iGO/HGJ1-m?nGiK"B2M0muhX
+%58.>[mEo5\0^H4j/Aus%rC$OOOX_GFXOG4k213fS-RKcd98+;+\#dk00(!qmf)aUWDs>'%L_GPNC at YKZbscu`+(Ip+giaY$RE]u(
+%\6ID^oOG8cg"8!6]/n;_9O7`n/D7t-+fHj^*&:V684a+*B,j7JbPCF%-?ZQ9o35rGO.HBOEBm<"KbdUhND!==N2qYT#e,;29<WQ!
+%J@(dK4ZY'T*TIm/lG6_L?tU2aL2cqXXkhho"p/P=,!FN+6g5>WQo<'KBpke7&T:tblUuiBkEMMT'1"t0cM!U5=sr9H5EBK5PA^DI
+%H"!BFHFl at 6A(\=Ah0Se\?.1%Ok>edqZArb3Q?E3*]ROeT^U.aZoVG,\m5V6B)SOFSE[WQc*q!"PeG@];DI3>,e`Ft5QS8C8m$Y;g
+%LN38OTD[[ZhsnJQ:B'@As5W!cGBl'WqW&I-[XTVrZ=!XnpL!jWk/@N&o<5mek(T5i+4jRIa1m!ks,S.c9MK^-^]*!`eQ_kDroD]2
+%rpn>%^O:a'GJF.DeZ8<1%tFE7cYm0=rV#O9jn"C[ddMZH^NfbFjjf8j(W*iYlWqfESRG,L5<QSc]t&&.F/\%f*U<4K3&[rm^OH(B
+%i\c3FrlseQS^=Eqf5IkL4D7>kRLFqa5Fo"(?XNa!e]%Q;4')CYHY5cLKItG`DtNpjHhmC3O3c^Rs,I$9Ssb9a9ktdDrg[<0\U=#H
+%gHT%O4^_/@Dnb;9[ktRbnc'[qr:0dA^UZ>9\c2$Zp#VYpMnI6"pMS3A2fE%d^\G9>kML]7q0YiIF8>Cr`*L*ilZ-fCh!pd+-Z\h7
+%`N/Sh2toMfGOOJ917(#fqle1QcKbSNr\(af*k)FOJ%TDmprD>-rdO\&c!>pI:;a\\9ghLb5FHFC0)te8rCYMhAqOM68AH&9:?Ag3
+%s6?qkn%Lsbb&:u\2"6,fPYIJDI!PPMIKe`nli2+tr6=C`DdU3q?[[BEf00"6-FYdnHUQntIrk/)aeqX-mO'sT^3Oib1tScmgg%QW
+%)KT+Aju+NdIQUgeD/!0D>OH1J*Gr?^/U+S`Njda21q%#p*,W67>AdAs`6jlt5A[l[4+I/(p#Z"mc`c4)ZUXGJC,UGS[WGPfdq^"<
+%aF/L2SnuQ2Hi<*GD_D$4WPu!r-Z`pEjR6mur:-7p?=2L"O5%B,><?@k\1]eR*Bt[g2K`eAgopZolE7e07JhLQ^\YRE3W.nL\,=G<
+%/tThk3e-f+WG#c_5L2^qVjkkrDn^IPEr.Z8S,89=Z_;Y+\"tnN.&635hUjAsZ0VDdr`OoVD8q)*<3Ct:lQppA7+NI;hY#^%T#'#s
+%^;%6D:iiJ=pY#/-X.*2jqY+psG/XARMBpO-?ug0mI<5DcilgNJ&")CSY\Lcp5F at d$M80#0G;h0.?9Z<bZDkqd%0*I:T&%&,rT=#$
+%'AVUFk31]*l1mT]*?,]G+,<sJ8EaZl*h/3HK(EDCJG1POq*6rZFnt/qkEgD,9(/;nfUuJrRLhH.Fnt1Sl\d^V3cR6u?tWsKFdJG,
+%$"Ije-8aS33S^H_D06?fQ8unX9 at 9R**mEUBqnB0mKL\.b^V>$df72AhGhZ$CIt,5jj_['E0-:i3qET47Md"*;p>\[<V2+g9Xq'p)
+%/YpMKgt`p=`8a]gBj26r,)U)EZ[!IHl19hJ?!MgRmJ2[0^Mbk\jZQ*/r;Pj/GMh7^h>HqPH1`sW;6S8P>e[ln)<O^RQ2QY=+54Es
+%YQ*q9NepKTj"?D2K<=nbQWNA)$8^LT_*:3'DJF56+B*2U[#\[4K48Y$kNW at mb:V!!.(hIN3KFeZ*s>\f;nMOPX1g%[im,om"0TV?
+%-?<>=`rf_PcaJN>rVdCqqj8#r;fBkH.Idq2=kgM3:Cp^a;AanZXStpglGq*5h\;IHA'4(dk8/5=#OkTZj_lbYIs6&7r8RS4jdY/"
+%J%+AQkbAdBGK',3-*A<kce6qc\IFtuOGgiPrO>R%rr29=o9V*`Y.hQY\p42c)um5rc00-=qt'^*]?]k0[PYb:d2tKI%taUql575n
+%I/gfA3G4S2nb_qJh7^YbXW'CS5;\;mbgb=qfm:fq\LETT;uAG at R`K?,%M.WLe_cqUInpRRdI7"nQ6qR4]sE+`)/(aJ7WA at to(m7u
+%r>&r02j[TI%r`k$>l=>ngdj3er=-7)rkLn9&$C at Gho3ns\%PoaSEa07fC'M4=%9heO#K#dQhQ3R]0D&epPY;Djh%>Zcf5djH],m*
+%[)_ at E^UYH]qQ$[?QP\hS6Mf!$*sdM^cei'DrIO1sl4A<Q.I"8NrEre^?<k4Tr7h16H?I'\UeT+W`dWh4q<%V*"-?)UIm<s^;]!SG
+%^-AHtWM%T9$JD:'ULV#FchaWRL>1._T4%J2lKNVPjg1qCgh-Ap'5cF"oV*RIfa!-tH+p81on<4VXbf.UM:/ghM'EYp_a:)6m#!nk
+%BPf4AGUsVTO6X#"Qg><Bo"Nn[,8TCY&_NQ[$pFiQZEYqN81_olp>^rtq,jmMRkf2J=Hj=&Mm>&LpOp"s;m,5[G\AumOWP6pif at 3+
+%T3oAs6mca9"?o*uCs#cI'Uc2)M&`9IbI'Q4bWT+aD!Q%)q at L=>40c%un41,)>9rP0E?HJj!V#.nWU&;J@!cE=Rn_/dn`5.J>FTUX
+%pOdDRhnM4a\[hQaF(k&QPu at Q>8,gB'^V14(rn<TDm)eUJmn$rA%tuq--W"h)-GP&JlgiT'%e#OHF\?bWD!>UQjk<S7]o-.MeDWR5
+%[4TM.9g*bl\[FGtMcVi]]&Z%aZ1_C*QD:m3P\N^*m3pLK0WDL[U\k$`[J'f1nkM/p:#Se&'aO6Wh4Jhj^Y70U*O!j+Y>O-(&_ZA*
+%g=.%Sn(6b*TtPbpEIDmUdE72WY9&M/odBafi(eY at s50B+s8-p9oD$X-a1jUedOZ2jm1\]sjS8bqSI;bmDQeib8bm4#`]T5WlLf?h
+%.CH#J*!rJ0(5GCHWIKX=jhi at .g=r1e0$`APjoNouo&YdfD_>C'DCaqYN;n>9pAM?P50Ca/?Z3$+q,<*]2E$gJ-\ZBZ6 at 30>aP"i2
+%G;l_o(2E;p!8-'EHU92!G3"^&n+q95'&Wd9$QBSUgqpPii2Feh#BTJ[Pn-e#D"[)k8CCmEabW_/#9-XoSg"Tg?X:DApA3dn[KPCA
+%20/`_Y'A3#_/3m51u<jFgiXpO3X:/X*:<mYCbuNf`d9CpqsXHkjq&U(807B#J'@Y4;s.TTH(tlX,Q?ru*uA".\iTljX)0HVa-76]
+%b:N)lr%+[)ge$AP9=53,Sr7TIruU48R*5Zm^O4`a!Z^!nRlgGdR.!NYo0!j$qWAj1A'F["T><8Eqbp8P)"To1I"*JAneguSe5VG_
+%haIbIk45![hS-`!K'7EuKT:6/d4UXII"--YFn>?'s8)$?ioR)u$=A0A*l,t6hL,1/bF>Pj2kRgqGk(%CX7M[%\j>4`KC)9L_mAOE
+%rk50(r>8SiZ1RA0C-,U98#u#j[Jc&2oQ[G(2j\$(?bZ?q+ZtfMUX!t$21F^Sl?(^DbBFiuJY`23bNlVJTaGY+RZS'VrhK0#RHL'G
+%!$?-G^CYa+9=&nqBthF:ghNCpIJ(k3*56esfqD-FJa\Ws5[B`<5J)3_,5qJWbo@/kp)E\/:#"1AFp>ZFWs@=4qe#JdB"(!UG?-uC
+%r9iS?YQ\>RI7?`!d=JSt*[:+lW<7u_7n93!d:[Rn)'+,p2b0Lfd:`)M:ZgjsH=)(i&$T0>IUEMPYud"#YH?%4kkk2gI:'2.nCq&7
+%j^%khGOc[JpW.3)IJE1o^)K,j6i9F.RbYaKn!`1P*FkQO3etW1TAVdlObV])V>3:-KCj_jQu>qFIQS8BUWkGVP"fac&o<rajO(9k
+%lLN2lc7eX6I,@"OYf0`-O^qpF8t/`=*_A,lWDM_%8LCmR&!%s'f[_#`6Se1_4H<Wn8:H59EDuW0.1bH.Q2]h(\7pM;A74-2*0(G$
+%s((?@#K+?aabT4M at pch5.W-S6H"::9S`AilBKd"$V'Fg3QAq?87B,a7l+Tf^rha5p'D(krprtb$0/egGq5Bqt2nU.Va^/8cfUO(o
+%lh8!$\$ke7MHeMR&*@htd]q=_r8VJGr!]lCgDBKj<mHK21L#p*^?;BVQf"CL\G?#ap%N+*4-(02Aq\B/jo3Xodn,fVc0/i7D=3K+
+%/[WEP[4TY`OVZZZk&@]SNY^?r69A at a:U\X<(Z*JcroKGHoG6tF^\$C:,lVdCM8*E3GY#,LEgrMRNd?11hd/DjDtd<sDJM-IpAT0j
+%acE^+(s^NinUC6frquK?f5IiF?J\6nETAJCE4Cb]NMbn)o at FenHZeknhi?0*f5nVoQC`#$h-AiuXutN>U9BN$IjT)O*\`XL;=)bf
+%%uf9Kn;&&UPCC[M*(c@^QJ>!YUjnC8mrm-TO, at Z81&?Zaqjt4kk10;!2s47l\@LBqdcToi*Si3k[hY*T]PIKAVMqgm>j2dHoJWa2
+%m1"MoDD0mRs)D;(^HDSC]Idl_Fl<.\HN!!sc1>lRI!PC8=hVKDP/#l%gig^;#cG_OY*JiEhTZ*#JRkj"CaX+_e48Yb:!D^)QqncG
+%<ZgHRI<3--4P-@'<<(4j;>PBcr?,n7c$_D$OKJ";24LJMV9/X;MRNCI2=4+h>!=9%qkMY<[jE,U>3\VYV*70.s)LcunL2c-[\iP=
+%aG\g(7%O[0g":,4#'lWjpfD[EclB0uUG_cX=EEq4m,oV&k;JTCrSs;eS!qpUS3*0\7s"*3c5k0?UH,ep"6aFDh.k5Pb2[n,kM?_j
+%mR(JofPX%7LWmg.!*Q_;WSAhnhMG9B;l8<3<apC\lslfUG^p at 8q4Vl<))6)@0RQ[k0n+=hF*$fDq\c6]6_Wp4:nR9+]A]6KbO+cr
+%pCF4Rq@/uJ.6mX3?XK?gs0#3oV!7$RoB2HY^AlfEH)5XamsL$W&Ei3L:>SL=!'J&>]Bu#7YTDSD(#uKc(uoFR=6_O9,/98/N*g6a
+%iLe0:ns`:Tdeq'O>a.INSA"r9E+.mGjf[D0`*Zc/YrmsdE`9MabII;EFT10af5DbjY)f(C"P^0L^UQe[^jT/7@"$]U(^h:Qc)p-F
+%gK3:&5JR!aq=t,oL/$L;h2rfS#\<bWDI2ngFMD5:daSa2J,>4OfVWM#Aig+PT at K3A1!b<igmJiQqmRN>IFoYA4)8nEC*D!"3qjl!
+%F'C[K7r@[mc$^kkgd[2GhoWJ0Ja,PRL>W!j]:5-'%oJ!<-"IL at J(Fh\:JL:soLGbA_fXjU<$$KN')i0NhS`[U"ap8W8qIQcb_K*[
+%>FNi9"MkkeG>AhQkH?MqI!^:H0q+lLj*:TH(]7[_5hOLYBY4Rk\4bB-W%q!*4da,mM:>bcLNpu^m_A5FRR?jp+3,rs,fb+KlT5(9
+%D;;K\HedAcXZ8N3D;<_>rj]FW>B>&5gN]eWps`r%ld3Yl*fB]AB==aIr%lM)*[uL9ad`1kndV(2Y!-%$^\=sL9##j7>+uOnATh8Y
+%c6G!ih%#FFRod?h+5bnDm^I=9If2X?Ge\q,2FZI9AGEp!@D)R?eAnFS3"P-P,4<D6s5*HFf!;+i at qP0\-9a8LNt4fHg8_i2-OB([
+%On&EWT<00C-et=YDVFDsf.D:K`Pf)WfbTY0R!?%g$1K at +M%:kF\4I_/$2:%"Kl6j]2o]S.PfVglA_ at Z(pOOdB>J3?fP#U(5Nr"g2
+%:A\nYO+!`hbmu<N/H#=oq9.CIr*0Yt^O,kKq1!5U,!X.qp?);=D8#;F43r/=s5RMtRW,P]-hP^2htaA&+oAb/+ktcq409muA5cEQ
+%nhL%>Gg*U?bkuf>b`4%7K9act$pE`sQ`i;)V+(.V-s[p!h3TK122R$'D,O/*/_jmff?s82`/+C`U1g%jp.*(H5";@<%Y&YE[A?<;
+%priK#Km>olaD\+[c(h9]D/BoHYCi(K23B9;6/'t-SlQ*\J)8tnq!5!PD*>;I,"VQK:^$$LTDcBG?iB][$S-tMD4-j,qSUS$5E33.
+%&]unHs8:l[QS6s?o>rZbn/_AaJ,/4#f3dE?$+AgPjNm!Bs8"C at r5,"P7fVp1J,eRGDa0BaFXM[7-31aCJ,aOa/HC4tja6iBs4@%D
+%s#&O0IZdHTJ+EX=J*uC:ps["Ua!\WH<a5$j3P0OaEd+G3[?GA_44i5#DZ-rQ>Yh.Mq*JrcFSoM/[X+BWp@@slP`t;$pZ8dER'bTf
+%jP+^DRPak>mpeKU?9YNi\R]RgVkFhi546^ep5itk4eMG:$hlo9Qc<^^pt)@.VE[!De5NR#mSBmEr,XH[VV\.$f1s#f3lY0F[-b5r
+%P#'Bun#JOpNgja=51-:)SW<_?e*ZZ^e/#U"SG$'->.o+XrK9r^X%AU(qC3M]dh&pd"SqY6>%?(N>fud7itl1djf[VOQV[;oa(?$&
+%/7[e</WZT=#O0_cScQ72eoUmP(&kTqXl-fL7P?hrlfsfX>gG^iF3l(p0m(GXLXQmAY"PdT5P/Hp`n?IaC)Ca%6`=KRC?LXn*ciaZ
+%6*4XT69=pljQ!N,[885\8$Ydn@;.8FT;Bre3&A3Xj%)0*0V??=r^dXQkW%VkBhR^3N:Dk;aiJl%9b41`gqi3ges$Y>ka4"F.VUHJ
+%kopi1dQF3\n6$SYfj_qJDp at rdJ,Uc:O0+C1pL5Zq+,8/[>1LX at En87s6e-(T%;hWJfV147ij7KsX at I)C`E5ED*9X;^Xl:5-i,p]a
+%)okq'BcG[&n9sM<XMj=(4tasB'DXD+R9;N:/m/_\[-9:_8#s_7N<<HtabEW*TkO`hKHSmBZrGDg3$rZE`YhD&6'4ejNT6C at UVko/
+%d4GHV+U,FVFkg'S at 2;>f(eTH`g(e&V:4Mkl4*?""ktZjMdiYWPHk8F,=L(3l8?u-B./?h1.[?O!Ld3"_&ucSc4mEl#O7Mi91WQDJ
+%HLQbU*!b+"Rm at mL`.t>@_E$BAEFs>&ZR^B^A(ASqS-K)^Q$rc>+]LVNf&ldONja2to/_J0>F*P,6b;PrLV0Y1RFt_[lCk)0*laab
+%6%:JA(A62Ih,%fed`JW7W7t- at TktVo1!-aYmR3e8(i.VK9.k<]?N,>2e/k>>mS3<D2O#@\o]CkeWbdYJ0&Uk$?FM(>PHEm6;PJ>\
+%#DN5X.V`],qDcD:N`]DCfq_[0Fm(.iLZ%]^&+-m;A,#fJ+e)EVH>7fiD6.7,^3^a6\@.K!j)q>-Shdm\607n:DbV>&C<sebIY4"j
+%T81f874dELb#j>XFNYXU^&1i,BfD'bDs3l)l!Cp`1!//2IA"WBjVQ&$0dU+XEG_^4`j)K+TV%5Z:EjbYLh?L?&>QTmY:H+,#qmd4
+%BfYjC*Z_'%*@-a\Zo=,M[e>gEM&cgejP9OP'HM@*/3]Y-5D3K at 3!c)Dkh+8GA-=uWSPPtOr1Q$I&9kC)m at j0H9AVb%N';oQ>W[D)
+%VHhDeF(::PUPH\U8K?JeWgk<"9l^ug$H:(Zn at MJ>!Vq'.a4BsKoT='@#`3?Ong%:_N3MU%4W;!t33f<WD9^03V:PnQS at +E:7jr\e
+%DgtEZ8n1CHBVW;QUa>5<<Mp]Y<0jec!0naaZmY7Wl*7'+]JfUo,8dFhO_"r2#biu4M_hdjb!@#1=gYK.D9DYqLQ42Z4YfAMkb5,!
+%TB+)3W1As^mjGTY\7aGJ+8F'>p6;%ql`3Z\6t[O!;<YlU]gN+4-b7FSe78o?O*Y9*W#g&h`hh95(dj-Y9c5H_jcYdu/-9PL\G?]I
+%._ at qJF@"M)jbP9lr3sm+)n.08@#(*U.2T\@:!RbCVd9o.OK?aqmEjdsQe`*q/pP93e8+)LJ79q<2)UCU&Z>+I/n/n`n&Gi=7aMWf
+%IbX+n+bXq@>)R7sH-dKc6ojL=HB=V%7<r,5,^6e,AIN^[89U/[bIZW*Rr00c<o(2"O"mHiY[-m=Bb051-p^(8:,V:`fUuQ;'[Xpa
+%:p+;HBphE5qEhg\0js4sj&!-cFC:iHdSlb(//K5$k^R,>Q(k;N&8>:=()M@!WB=Ld+Ks.RF)g%@TBY.9m1Z"F5ub.g,K5qD2oN$t
+%aD+5OUR:6jAU/t2/WQ at I@E,81ja3#6)e/06k at H]IG+D_REdJ]32KY98q`^$JEu"Gk)YmX15m376#U1.7#[YPJj?f!k&6-1M at pmZt
+%;@@2&,H3LW$R$<h:l)D;T4kM29(^OkZmH%^Oui^5GqTY:8_%+0k[*.:GH,+7M.Dk]$Aj89caerXQ3rJAWp3C&1:+7MdK/`\c1<?n
+%U8o5\DK[7gWWPFtVuqBb_fJ_TG+Q56CFiYm9jUi'>1E=oChKCK,21K#Tie at 195\G/o8O]iRRFDX"d_t%g!A^>Og6V\e7qTM-ekuk
+%l84Z&j"g-ZjisY4*#Ueg)M])peKc>#;thZNZomupP%p:_-.F at h(`=L>"s5H!CRi0;lIVZAHF)r1q;k\mH:A)>h6t;]o_I[B4b*J)
+%qEJlS9YfO=^ETT$=#Q:Kg[Q2?'IqTB80lUn=SX1abZS/N0\V8,D0)KtPb;T!Ym0HSFDc/?ggl[C@!dBZKs at 7eY4?g`MJ?)G[V7k&
+%r)f'-%=":g$$\&EW__.n;UpURWcN+semKuSEV<Gl^3)'EVu"b_FshdI7?(Flk4*3XRJu"i3[ufVn5(<a]Rkk"9[AU_^Cf42(joXb
+%:J2RK-i9t>;"Ir:7TJi8jDT$I9+B]Anq,6uW30lFE_W[`[0P-3=N at +N:LAq*"B0a4Ph?5J^=`l>%rn.'<*5"<:)W1KISSDt7sZ:O
+%c`[/aJkuDq\cBt(Qh,nQ at sMdd(.uksp8;"'E+?-H6cDD'E*'u.%T7MNC'HEplnnUX.n1R"Eq5#XRT+M`redBhq2G1^@H`Rb,/>O"
+%*k$5kj_Lrb]F/26lbrS#Y^NIMAbj]amK,Ki,Y.PdL1Fc>e&i[Ue7YcTY!_S+T#M+u`ubPCJ"7WZ1/_s"I?aH!n(F,X#G2K8BO3d^
+%9?`AM9P6j at hb2FY;sClF3<kc'8T\f1o><]B"#j8T0+p][I<r45"Fj$HS[^:\A,#DSR-D*5-:?jmI5bJBG/dkK"ncAjV%;-7j^YgA
+%ngV5RF;_^e-,t"Y(O5SQl<&W_MMt-*%-%X,Sap_"4P9]3Un at SM?V^Uk5KOW]SNHZ6eJ'5cMFo?:c-Xrpk[<#2F?Ir<a_)JbbG\l7
+%%fP+,XS[8%(,K8+,1>DkN`'F2RKDT!7&/CFSQq>+d2^6%QKG3="?4i"Y2^P>f0dO'XIE,JFBU<WSO9?On$2CL/s=YVd-N@%RHb8=
+%NM9m*LccNEjJ3']A641fae9<Q3[-qS[s3k*UoI%1c=Z!q?S"XA"$&1!objrsl:Uh/D9TMEM&]K-kb4<LlHVFP;+SdOl:')B at n7(f
+%(eYhh_`D0E_[rM%Wn$FrEZM:a02L'7,[HB3TmN1'R/8bp4ko(3f!SF.RU-#?2CikjhX):pW'P5I;QA6/6GM'Fm\&9924,:-D77UP
+%?<KH4QCGO)SuhOpgGT1hlaB&lVOOVE4YOE++%AO at HdKaP8$48pUBir[W9:9PZ_Y/8-2&:'PALBT:.eq298`ZG/Z69^4kP>Ko*Fe;
+%XW?AofYd.j$C(=Z:ZM2D=PGoslge.>7?i,73*[6DDCG<D[,(+8UYSahdHl88;Uogt"oQXL*Z)OII<f8%d]XC`No4?gp>,C-UJ1gA
+%COSB6:D-/!LSN at 4R>j:T1u$(Ai80[eC/NgRh7IXX+og[<J+D9:[m_XO(\+bn\k=^7omStOAJNfH#HU=HE/+*j)f=Cm*'!Y/UaS[e
+%m;o`#n(Y+sG51FT:<Ar^\aL".NRQ"=_sY!T;G3pC/+?eMi4mtXF;Q+1ZE=_,A#e&p?dDo:*^46b8cou+11lATm!da/A\RlL2Y%-T
+%#AkQHM%pPSp<)pPh#U'1Xc<g4IYS4]^$SVoq8$k8mQOd=FP`nG:E]o=)XTn:W2YHK+uQZ9EBFn;ga;[fNYSupf;@<Ei`H1Pr:*SV
+%EJ5KVr)o'jl:OcW[<>?.JEP:'1gIl23V!'prQhdnZiEOK[OZa``_V<-GMcWUd0>pKa=\0!i7U$G at 4d5-X@m&.[]Vpsd><#fo7[KB
+%T!2a`Ye,^=U#/$rN`0)La_KG$7noPZ8V!f&ksK+i;c^3=oG!7rRPZMAOuXl1&aEJ4*</tp?:uFGO8*@(`L]9#%E#S+0;mNjj"f`u
+%AHqZV\tQ-rN%]V27R%UB7Df`1T9i,[BVk2Fb6+2895%;f#R-:Sm%K<_>26Yp]N:n(9C/6WB+<qg0B3Srggh)ZTm&WSjM"@C%q[Jo
+%j5q8dm]#FtYnokVkd!U%,)9rEE^S5jHCtPK at 6<XFk.-Sg><G5^"au^Po&PVBku/]1WNR$3[,=l,?.V'3JtPDJ*YBh-&9A at bDuk)<
+%[PiJ?$W=V[UftqeEiOF0P+'ZRS%"e23aQB<i'e@^[e7mGL17/to8NZad4ML(B!G>aHn%_DU(*A&di]1Y="tae,_`DlC;%Ps/8rpC
+%"0@$5W`f at uGT?"^Sc%Ha'19k?_>]ll*^AR)-Tk!e9t0,PhL82p;7D(GIea`WTBHs'r/(MNj$1Q^+6SU,Z*BE8MhXndD(:8'_]bro
+%&/;P-#(rXn!^ckVX(N&.&-iS)R!.6J*X=Jl=A^LB<$N2!@b:YV>lTslh0%m:p)^`JFuGgn`F$nKp)`@[V6f/`$K=#7?h'U&g at CY+
+%@!9!(PQ14!UTrt;IJN:+G8HlY?+bRTVt2k)rqgX+;#KVY^@RgY"/IliqWs+nDZ0"tk<p&0oD-?a2m4iWcPc32hD6fH)g8\k("S1s
+%CK#`XhS3c7+-Hi='*TO2!bW.Fo[&po/1ZGHEp:3.%io4drik/ICrA<7O83_6,H_;*l^1%#:6dSn_]!B=1$nT)Aa6V^_tEf`NW/::
+%[F(UpoB,&_r]UiAnWeq>BR#FXJ2oo/a*Xugrl)VWrO@(5++)rgHefcjfcPRk[s?ADa&TJ$g"A'V0fGA%k5H\7H-\(.C"DFrbN)kU
+%F#15;AciUkb44LoM?%=]#ok at umZ0il<K5JOO4i.O3US_N>oGGNl'Re1/pcp=.rClE^pB"#D0)1>g%fY`CA)n^!+Jl)r%.3:.4I]G
+%9STjU.7pr'2'lHp"6"67K at W`]Lo[D+LmsahYmR+?$"atl%1uG`$8Fal#J>Y:B=CMYL1&ka+G5GE'`]/8?AG(o.VIWCTM<lBi3CQ<
+%D+_.HK?7U`$!+LHS7Cr#3U*=lb=U[)rT,"#=e-FU*9"H"g.pA#Jp_9oR at g3?^se)Q'#_ at LUFg-bEd$h[=sG*m`b!sYN>R:"W4$o(
+%+0OGJ6:H=Z0Eec-29hi`HogGuoQdqP\upld&/:f1=P#Z)7-bbH*O`%b%d at A,2*f=*BqOP!,&g^3^("qIm0`tM(W#^M at GckC*fYo@
+%:^_W!9S"+9#gR=S7Z>0X3YP:+X!m/^D;g#:/<#S))X#96JCfkFe<Xt_f)\N;;?^H1=^$poNW-o&[);/h=PE0T"74l,i3T!@QNj-%
+%A)ijAVeY$$i^k?<g1K[9,D3\r;Z`sKapC5V-N(BV. at M+eOKkV0,HXiMhXCBR2;4598CrpcPa61tkDpo(@.Ch(2=Nt%Z?9<u0K+E)
+%8V\Y>PBnJp`Fl at Jg'O=EO>%Seo=BCP4Nb#fLB<IHWfch8laIQnXQ&oX:1kLMTZ`4)K#`/AAC2\T'\:3OhAYRWnlXM)kH'tU&!oO_
+%2)6Y.?.Eu4k%e7hPUtbk,or&53fZ3KID+7X&@r"j:($"U)r5_CTc6"Hr6f1-lCrO)ls%b-O\!a`F_Sc*ScbUXm=[=]&bnfZ[P/9I
+%G*RhjD)550_d1$J'3fcG>Qq4/pui\\pU[B)<0>7-(7)h`q[:SR'oBpFhrhjk4*_CDGr&BulHVsuFW-",05\;)jDN2Rhf;t+rB]$#
+%dYK(!_J2.5Soe8>>?\,X`D;12=PI*5;YRnr'3fcG>QlZ0ThreHL7#6MW`bHR0GcX1/[r?r"CVjT0-qcE"Eq5;(FrLDj*Io3>DA-Y
+%XD1:;C"/F at Pb"%_5GkM6=2SpbZOp\$(kK+/5"M5meh+"ipEf0b_&@0)A\dWPF)"@WL[0Je<@s,qFspS"bPJ6=7?PAsI1M8;e(Iq=
+%i5PA<qre`OCX*68EK<K15QGT+V2_V-SPMga'YM3R\2<H2:KX0b"q\kQ?sTVT6>73461t#$CRj^Z7;g>1kF at iU%i7L_2:RqXF]E"2
+%lk:!DSQ:/Af5c+PMnf`Laubj[\ZTVD!38.8%=Z)fo7eJ'JdY5H/e72mD>.POK at 0SPDO3g5K7V^_SamA^Ar`Qh>-Y#68/m1=cK4-g
+%Y92)i/_qJN".!"G/Wm5]a!`3$molVh?C!P%_fInoXDpO%+P,lWG!A"uGfU^],>R7TJTr26LeFMFDidfCr0@>$HMM0V9;<!5Q?QYB
+%5SMO\+n1Y,O4X`>ECN]J\Eh1V at S<n[X+8`#V$j=Smhogko\YEi\@uQp(^bVj4-SP_LYK!+S,JFQ$'/5'U(L46Qc]J(/59hmPc9Z1
+%C.`gpP:J8`[+jur-po[1K/QXd95JPm9!<r4XaJnAJi1j(D/o%)3O>R:K2p:;on5T#MlUdM.6V=7hRR3/q:XM,fa/kDitBV57=,k<
+%4QAG#PZZHe!L]9dDUk<-!BpOCk#jkpKUl\>T\H;?a'c?\[WC"h^tMDiZs5ma:GrDm['c/"Y92)i/_qJN!u at 5.]XKGpr--FZ>h1k/
+%I1*NA\EA>:mC_:o&+E6?B[u=uCg at +-\iuU*Aa.%erK-DEE=Q)p9:PqQ at N&<Bmd*[;:?[lahW#-pqWl]j(No2i3Lckg_l7-;l+53-
+%ba)3bYYNK"AP(#$Zb*#t!h_X*8\r-tCF4^Ba$\F>R1r;ZG>.&;ZdDg=dsuX+mK>**A[g9f;+G"PLUM9$K\@g;QI^sm+kAAMj2A3Y
+%.6PAQGqGR./:jrT-2fJHJkF]CW`Q*'n@>csf7!P)&X"73*TY8QhJ6a+dbtXN87V4n at 9Q[hgM#*5Xce:Jo._W(aBLBGSW+J</M5Z_
+%i$`OLl^!j[C]99P_&DLbk-FmO1?$pPi at 85TiT?kGSJjgr"cT%YAT_562g't#Td\VAoXVEa8mWcN==KT:.p<!g`Y at OcLkI\?i[V0T
+%q089*ih]e([5Ri/1Zu--'VgD*Poc?S!RWOt]J[uWjfts106<]?mOnR+F`h[u]sb!$7:Cm]=m>n>?e4asMHEJ.QFX6R:9J-C!sf at p
+%2*EfI^lMkIC?bEq(Z$R61/%&Sr0[&EK4Ij(DJ(36?tKYtbIm`9QBRYVbWB==7U+\dl-K-LR;uHL`83O_I:7r^[b>4s<A-,"Qh;XD
+%H$=Zu+e<^m-'nf+VsT^,!'j9^fSO!5&[7 at gei$gi%++qMPi-,AeM@#lN>R31`Fpn=Lm>qJY7tO7<C-gH!c+<ag[a4AbC!s3LPt["
+%LQIZ(@I at cP"M&a1*u3dap>c5JDYmq\gZsA3(YmkXB_t"Y&X8QiB_;)G(SCW"+P?XncX,CSI;qTgFM`I>rYPQYfN!Fse*&"g$9f_"
+%bY7o++jSj\s%iTQ:X\B`qs8B"l$Ds5n`T>KrsA6<akur5h='ucDY`l<%R4n"oAAs8.?-t"r0B at T-(=jqF3cBQR^o+P<nD"dQkMbV
+%2&V"o;+h'b[0PaDd*ObC(fOo`*0KlJ\_2P7+DYr8ndg)s4Bl1H_?_j6U"XB*H&WN<&PAjm[5O'GAb)-&8O8h%_[WE;bXFfB-_6p]
+%?6bu at QW^!`A<,"">qgbI)Ll@=.e^O^**Em_Dct.'\iA$W. at c/!I<`USrN&BC0]i"8UG^0^P/eh),U[_\@jGRoNu2FU!Rf10eT7W&
+%371OH=4)7_R*$YiqrXp1'R"D"1n;f;d,(J?Pc.53ZoH1H,&.c:s+MVC\oL=13Nu>OZ]mXaGQk<oE&'5J;0E`5LDH7._ss&)VZQ<.
+%"L1%8Fn>J&ao=r,l8G0gEZJ4`kW;XuEK6Ae]fCH2Z-\AR2>=b\VGT`U(^Pq3bR;$aRqW+]=K_3oK"C^!!Rip>L(^/,f,22t'O,s?
+%+t?6?i]MdFm?Pm, at Zk\%ZNfsbm5<25F_2#scb["a)4O1:ELP';-WF32kkU8L/mqH at p-=4S8]r6RK90V\5QF(8R(G7O`"+_h?ZIdf
+%X_[pF48.Z+F(a^oW4's4)n<qNasXnu+$`ib>uhbif+\QuGpIC\-*S?43?'NUB/F3piZL<K_Jn:4[#ssXcV3(.g"Qpm6-H56]p.fY
+%C.M<k3_^ee4"8\)PMl0$&R7\>Ou]oGafW`?He<2EKc<+<S*D1KPcpcC(!1p$e6oV4E+6j>:YOHTl at P'.Dt`fG<i8>9$L]>O>i$$4
+%WCA%0UIF\qpYh<YB&9%[OC'-YM&XEZ7`\sRd6k<8KX(`@8:)q75?q)I2PNoZ)C)8N"iS=t<G0>?R&Q1TF<jBA>=s.&N)]c`f4LCt
+%?R]1^RHE1rl<t/g-t6`/PpGU5+1-ZQG3g1pH\`?:CWQMoIo1?5hK4H+B(egdDT&=lao]<d)04S]\")>-:^B[dnb?5\Nm)32V1 at ij
+%)X/<5iOi`i,$BQNkWmc$B\BtaS=`]$IW88L<0B2J at GrEGnL=g4dOp<=>M$];fPAOM%;AAtd.6JLh7JFA:UUhZg*Xa%D=/,r$Kh[5
+%c`@6%X1aQ?i4aBH56;M^]?N7n/;`3\";f5:\;"\E<FU*G_Skue8Mr?-kR<C0bee:4DNnc0CU9NGAuq0rTOJ=sQ;%te$fqJ+"@;YW
+%R5%/!>rIuq29slh/UPfpn2#,s8$sFY6Rdj3mb-#M(gZhN@)Bj*gMP&a3?A(pDR2IW5N"X]I>S\K6M(^VG;n4rp>+"C/%oAWCk#]d
+%XF=b]],EdT,49b4TqDE:Bs.sff?ff5Y.Fl at B/cP2cB1$B(-J^PY]PC&"=%%8+??.9(+VL=W2SB>c1_=qJX6d:J1SWV?,uanm^=c!
+%mm9kaQ6jS=l!j.0R")df2^KJnLQJOQJ`nZ5Rqol;nJGq at H0<T-'KFYFC^j];hkr_8arQiqdP#+G/Xf("'P1<nJ?s&-Q[j1n085*j
+%-!?-$I2Z&fAa^i6K/gEJJhScJHSu\9?9)a_\TJMITC95C9A[o5Cr5=KbHCb4bW;]c[@MnYUfLLB.#Ua-1Dr7odp"!S\L?0g%WDNF
+%?Rc6LXsSs!H;1<'9(BTtnuoKX%<b2AM=bB-RXk+VANIp at CgZ099GfsPd;]_$LPkA^LQfr`24!Krcq+iL7fb3d>V0Kf+"lNbo"4:t
+%kf#e4?77GM3Z)Y/C,$?b8Z)njaZ#U[<G%eUPF*sCV6HQE1[^AS^RXtBdb(`%)if%H+E]H)@f0I=Wr#hhlktRoY>'<e>%@k&X4(9D
+%KGI_F5jiqXiMeX"[P&OGG`\E!TNpM^Y\kVaH,gd0%J6Sk4Mt<:_OsA[87I1T#JR30P/).VKH'c^,U8m'0=!3XOpc"p'0eF9H"`!c
+%B'l9d/N;U,'/-EPMaW.h9YU!+YYD*IEd(5X5?nEY at B\K$]P1Ou$*c+Q',h2)?t")8gSp%=*gD!3!>&!6b.aWlF,'E:/#RB<$u8JF
+%Ute]$Zpp1/PWV&akt-ZuMN%YSAiDaXc&$kgR=M;Q'*m6M>&b$gdWXXsCI7/5dk*/Bgq!^D_a1o:)F5s<.VBoZ1t?&,4f,)\Pm<?k
+%E91kQ_gi6:f;tE=&0oG+D=*^2``p?dW<#^bj$(=F86sSZ?K)O)mOGh_NH+t]d=Z*X2<h/DRD7Ct1UZd#P)c()q;Pm4NE&!'8ANQ!
+%bM?a6*qn<)iCI2f?(ltYPE:\p6g85u8MkB"AT-llo;=nn6clO\Ju1aG8QJj.8Y`('nIdj?lAHZarQYc`+M]GEXqQIc.(K=[MD"l?
+%!=.elA at no&OG&@WCpaOO\kK2?Z>MkVODa!s`n^?ZZn9Q(jLJlaa3n]F;>+B4[>0BXPE-UN7Wo`p-R9$j"lHU($a*VIiaCbBCE;2f
+%W@!Tb%k55_Q3:0j`Yp4s&Z,:i^_Z&9QF:<a/X5!?(Qt(A$RV]13%cW?U!0#(`"s-o$]$2LZaQ3ZEtpNHeq[t((X<+\hb,Xh<V2Bg
+%,pR7dN^4LJDI(-t9\XDk?R=*Xl%]!hAZP[AR_CYb&.lA4G-3eQn-aNPU1`-BVMo3<hK=DBi\P)PXZFoPaOnA*Os.CT$"q5&[@GoQ
+%=e&PiEkC%p9X891KCVl;];C;R&phoo_JIn4L&!(_1u#$UlWL2e9L_\d2[E]G9EN^HWqR*,Kt<`ia\&ZFqD\C7JUj<@`X^]KNoQ%h
+%m`Y0kPR'=IR(>`IWX#3%AN[iFmQ8_B385*#gmkW-lD>`tY;qEK]`g)-\(?):a7AcgcL'LpSR5a:^>#h#`'l'6$[<&VJp1`q3=A!X
+%pi(F9.7gj^TSO$<CU;J/Jk?6;.,aQ&D,g%U=k.r/T;S)`UrZ#Ljq"2ZPOR&+.:+Tg8E^hf0hlOWJlBI$0:'c.!f1OJ!bKN\XCS$K
+%RWjJrTFFhkTEhP&Y&;+`"D\G at X]j^>"SJh"cSOVE<39i_eIa+ at Y*fs\L+rF`^bF!TN`#d*I2Y*k8lp>t^,Uq)*O"`k1BKp^e at NpR
+%:DdP<<'cBt39Z2<;CP,\qXbPs8>\Z!.MX3$962VS(_B at QO)%1F.\(Y>C1E9/Y>I^]At?c*$BgZHi$+.ad)QRuXg&$ck_.fE=`NJ*
+%(I_A[L5%'@dIo[/0]B:U#]"rt/*gV#CHJkCC(F(-K\:XD*<a;TF0LX;P at ukqF"V2^LlnK(MmOZ#+ at u$jM,"][/YNE('.F^)_;UV%
+%K2%d+*#%)!iFR'>G7UcqPU%VZW9gl%Yk04c8HIDA*:Silk1]'B[j@,?"tN2)'oI?uja+C>HlDkk(4BXnMVoU*a\O;"b=W=fL-FAH
+%hGR=cCA'R=li at H()bM&r;M8&BjO;Uu9*uMVV-jUeOJDP&lCBcOSC at Yf-AmWF:M>K]]p%L.6I9WuqgVUl3r3e6"KLT_+;\@GKPUVq
+%GNTHsW\CmQ8/J%h4KXug:qCRcY->(N$\RYGUAR-L8^&JO96S\/*4l)POefC`A9o4Ue#[!/.d`pjfkDeA7GfL4-#t6XYBr)u@(UZg
+%q9GWdEB+4%f']Y=K7l<_-'`R?bm(3VD)<VpF<tAH8d2#j,UD?Qre<nageAF+[LRsmM2lR5^8IE>$;i"'3EYCYOjjXPX.Uk4e[:+m
+%b1.>jA^M&BJOlTVYS]>p?+9HI%4b2W9['fO-BDaLJJiF/",9s8o-?`6*1TLb>&.,.28'H9$,V#,g6h(b_\Vf6U+mjn#3rZe&?eOO
+%a0;'ZJ&n;$SOSTYnc4N)QuR>t?<8lpFW[/bPtGP,;<qDjXf5YC'g"!L=TqD[$p(_gg#:!<;_(^CklPXe$PO.50>%(\:mh^$:W^r(
+%+S^s?C8O[od7+gjP&ICu9N2Jn8A$r"IB/\W[-(Cd1U`$k`b<0p8ri\DRt/?gbT)<T69-]F^PkF*?OhjaMNL/-M5HY[#c=PmIO9+j
+%7h\"A`[<WjjV0U,Pi\XrAfec+VLWkJ:eEk6TW3W^N)DNT_#h\8gP!AK3,#2b'I7oK'KU23`e9@=9PoC+l,`W0fWU#3a>p#Gq']-3
+%)N,!g$<`cV)]mC-/;QTmTE,3o:]_P4&:b+^XCk,'Y/lpVLQU:?&glQYUGLr(&@*'[B1^>SdSqn'$:4sAAT^#l/2;[`)0tm;9ZC;;
+%08if.;9o^:Uf7`PP,TC(STBT.5U%U49KZR%*LheoWrB4>feY@$FqDH<5ke-6@<`/6ET$p$\]/JjR-h9-'Q\LZfXsO[7gDRtO:_mG
+%3,4k2*t:e14p;2gOnmaC<:DYT+e9:!3DFCsC^<pZ]K)3o;a:UWc8%E\JO<a22*A7%GckYCYhb@=UM(/6,or;'(<j!Oh2O&GEL@[7
+%ltS;^3#;9\3Lhh[:(H]@j9JX^m/T`IlEs6Ig<6t<]=d]a$?n[Jb0?k=6d^,i#$&7VR4>878(ed-99I"(3BoZW+hg`EAV&d&R72:U
+%r;#OlaqX(q1Qc(rBX"d<U<Bf<XB*'=!oc\;TE.&1TqRVTa:4&i;:;eVe-i"4$]m0dUOjX.L]Y\@TV'%.ba$[3riD,t;D*hT1=YFu
+%<e8\"ZH<SB/'e(9Or(iI`/:P08hkY>TLDfAZ.]LjNS1<4_TpsIAnG>#2N=prATA at 0q:t\Z)[h'N:cuLEm/$>a*?[#k$$siW8@@`b
+%"iu5H"):k4.n^4d<0(Hn6"4)>"9F:3H'`;=Eao6]CdSo,KpC&NNcl]$<\nq,.?`!SSsCN:7K.q_5^On%i9\=?/8ZlKlLY[JSHqi1
+%W$uk4(95mHToP<Plm[HhEfDGd6-s&i at UW7J+Z9HP*a!%tQG,dcVNtfO<+c6tE#B'?3[mR#.b#&];UUan*hh4C4!#I!dO"cj;W_W/
+%&Y0O50u&=f73rWTDm7lGbJ8tt=81*@g)lO$BGE=<$j_k/XdC5_-S(b.lB"be9?P+=9pl=)VpZpNAQ:BGmJ at O/+I5W]!gQl=+EA*?
+%.[6Q(TW7;dctG%G7=&p"L5dgW>l$=n-lk!QFNU>GCudiQB\*:m>h2D8't^djE,o?#W6VNX7R]>!HE[a^V)dZ&)--u-_Z<D!\4-Af
+%/kK6PZ>(A>7b'lij5Qo\K!PKbK`HeLM$g:F&HMJ0=rMf(Gugo7!""TiW,7iC#kDs)(pjPfj,QRA+hm!rd&eFjkS\B(mD]6u5u3Uk
+%(X1DR]b2-h'YWNrO_Nj?0pT*<:m>$+9'VH9RU2#Z0,O\^:gsIX%)bfTCo4Mur*,mbd(:C%>(p_+jMSHn=k]DZ>\QbR*^Gr`ab%/C
+%`a/n0q/Lp]4%Sjm0jQKkm>AMg(?8q@=94'85HtekEF1UFFiQUl71;/]9pfo)%T1t)LcruD78Ps$WYn:KTZ!@f8?7*>=Md;!*>IPH
+%M5YjD`DA@*(aO+`Etuq&k-9V3-CKbC\GVo+M:[irn#6$SKX8m%r,W3:4 at e2`L%'a7`CJXQ`&b;tN#(2ZEc4t.H#>WX5X7K!oPm6f
+%7YM`Ihb\H+1+YsN;TusMWC5$1keNB2G(Zih=>@OsQJ-%$lf_NWPH:;5N&B/_%'"@X*)284fEN5o8EPLb>Bm_JCRIXdO611U/^=s,
+%".Din#V;07;Xa+"+U`hUI&])%'#PU4+_o'k=]$LgAV")rc=9]?3**#tX948ZRAA&A6ad5&4;GF4JqiTk(g at 5K/hTF!O?u)rCG2W)
+%Y;:Pe.-072/?M,7f.>$DI!02&Z!4L@*9Dcdf&(]:Z/b\oqLh_<1V&64dR^.Ii+1lG*p*I0mN5.>Q&W@$r=h7;g8JnD._P6$6h+Q\
+%EiNjF(h at 7fj4>I(]BY+A(j,h2;RD=gU._UWAijg-C?2UY]kh0$ZEkf<bI.(>h(#'CiY[m+)CD`/cXuMmX4n,7-0cY+f>-L,>,8ko
+%9dX9G]o>;t at I0I\#<%8R]"3rj3F-6OCqY*/Up;?F at l75=W?=7%`SmdlD5?HV[Kb9^/!H6Kb*pGH'o"]M!%i4Cc+6feBNu]VY+rF5
+%r[c>`JQA<;OQ2M:V*H.u)lYf@>3q2242m)q2Ui3\jUOG8)bBtb:/(rlJa?%S5`h*5)8UpmU!&jd3M?ACDMC7GNZsB0k1],r at LSOg
+%CmkuKA]^\aEkL6ITr#2n8JEsMV_BGQGbYj73%^A\VTtK8e^-"+f%tj=bBqE^2H_<L][jmUI\??/%jXUBk/U*G"M$(HmQnacKW)a3
+%X8ua5gX/KlM&$E##AJuh$QIO2H>cer8>jrm2<KmoO)_gr\9:mKC"+U>(>5K->REbH<Jjl_[8R'3S9"Zf7-+Ru1ODY2%eIhW85ro7
+%4JK'"6ZAG:Wd_M'Y3 at a&qE5hu8Qt=KCUJ5(UrLiqjEju6Gd+gtUY;b4D-f=6Eg=3_-3SlDg3#$8m35M,/X-TDAo"KHb;Q^d^WHYl
+%N(B?#5i9to"?sQR"jN48@"/[l9K!tRmBf7>^nB=]Y$24"0ZO`r:SA1 at +*MGbN=n2X&'u2&V5Si at Nic$\Y"C[7gu/]=">Iqf`T, at F
+%d\FkgB$(c$,tEA<RLLab=pA&2KJ.ggnk@:Y)@9M(80BoU[4rTUY1$*U44#%6Xs%%2"r0 at 7$5TpU8:An&DLRH1d"@bEQUa(G0/Dh<
+%1`23@@n*PZ7LSq8>*X2on[R1>,P;u>jQLm?j9[GZCNE=N7-e$VL/stA*)][`@t&8L/>cj_4htjn,m+PG]0L3_C!Z9[(rT&.$.W\9
+%":T$294!TI7SB23Q8ZFUe=KN4X.UA=>S^DG6S+>li\)]tEK+^F.pT7uN^$r+QoR5G3O!cA$urO\Fm&I#TH9%n;Jd)?bN[Fh'MrGO
+%Nch"TY\=sD1("AV6gY0s&n%7[70&WFJ9.U5gE0itEl^RQ&h:Z(nDG2`>i/S55a_GCUU4(rJ>E73>*m*re./d<.b at iB><kB&bol4&
+%&;lP,=_H<:_V7Ti.:U:9^+p)e<F%0[R("iA_W2rNN%3Qd^JlgAQ6HjYS56hj*=Os%W#njB8>RuhS*PAj*5G66?6JXN=Ud;n%Za$!
+%DY8fuEo^3>.,^dBkAK4J3-!!p<0morif_f;5M!3YIYuX*TFPMP,cQaNO:t-VM at -=cY(o>eqUY.&fXLS*H+aI4W6^p$daj$pNk*B!
+%7h6Li+Y6Wb/5M]T8ipFP`&?XiA;53A1_A+$L;kG#>h%+-6T9)nMc<@c,Mbcs!=YusnLfft5s;2_I]CDYfG"_g(5*d_6k!@YL)A!p
+%qF8PtY-D9pVUd2,OH*t5o!Kp\4)8D?kWh:NI9,fNn9gBN&j,ZJJG#n)oP,V$\O%cm63g4 at T$7D3pgu=Y\1O231m3tP3mDjUW?b1Y
+%q\4&"pek9>cBLu%-Rh\hTJR"N+K64Y+_;=c<Dj13K4H?OZMnl9Gi[0&=jBoTOOnH=5RYFF:5PF%S0[2r)/OrDkd4Ht[Em&<8lQOA
+%;4*bJ6&R$DL^?X^6(JNsZuUJUmNQpKHiVa9W,-$\\VE"EHhC%[0 at JjDk,M70WDK5k&Ue;b08fOiAg:do at T[rT[_Z+G.%$dWWCJ)W
+%/:>:A#Wug-V]`2fDGR:tc87Z6\tr,,n?b2K at NA#aO+V at B1PjO\X3S`lo3&K;>hoJPL\N8'b`ZJA)ZL:*@SS(>FYrEWVl5Gpa;CME
+%G$I_Q:4/5icYgV1aC1+W`iMMM,')4Td4#)1oO\.qDZ"RG"CrD3M.JH\-E3md!sXEHYTi9$C^pKI!"MnhE3sR!J9@'%kR^]/*LQ&5
+%2KUa*d(l;b!89C?6:[KB\\^=UckTS4?n>.>XU&`5*/NVe2,+dH*lFkkiWf"NRf,U(&t at r+OD?YbBXW;<$FQkF.P69SD_aPAFW%kZ
+%LO1]`&;N#,Aq<p)V`#e<CD2B_:$nHnN15*%l(pbiN`ut<4JV:lID8_b&0*_FI2r?"]gn=AXbK3 at 0P1I@B!^u-0T-`BZ.e_%e+:*=
+%'fZJ0:=kQBZGAn%Ka!GG0H`T0WQ`^(J&qs.6[\rs*=[kF)ur^Lr at TZPi$?p=b at PJ_6T:=!l.i(o<<eF,SkE8h'Tej],r]Fq*uO.5
+%_>9fPcObp9b#.AESL#.(.MpO&B1T7C^LPIkSGh$gbmq*Z2>e'F5b^,^^mZ)En/NJD#2V,&`mo[hUrjIGLD5A7gCi+K"pqB?REEXH
+%!cSCg$"hnt6u5L$l6.LJY+Ps\QZU;(6UaNtk1_.5,qW4]VgIGuM'5Df6Wl^"n2RZVI*9,*R7.o=m$HFPS1]L=i+QZ-PG6QDf>#X4
+%^ljp?9?fepgJ5JJW]LpK?-3=`^t1RShq??+VJFp$%`42sO68J.$i1)2-:RW8-Z"X_%W(jlO;E$Ee!R&uC,\(S+iYjPSMY)=FC-&^
+%P`#_NehVr2Y_LO9B,F$I7tjN<T2:l<CpBL-JU8TpRsIUQ,U`t1aGfk/g;Xu<f'8oKQU-f=']`Sk=k60-a3X8L72=<c*3EI81TEjO
+%MT`i!!XQt1DmMOMQ7/b^ldBd7(78PcahoqV#,*LUf82=ce3kGG+D<`c%&5es3a]8bVY3h`m%&_4hJaR`oBRqi>nF"^eV=!3BB[0S
+%U`%4G'gib-*"Hi*E`=TV3AO5 at CIl[g8L59QdT+ at lAX8uh\Z6=SgI"R5R"=1I)DrF&]ZgeUBkA-k-0!37-YJ8FVe"En$[tG(.MF+1
+%,nauV+Es[76V(-SBj",4VsR at ZA7"l]#e_ES.c#79;9(f!UP/R<<kl7+%:_&25,obI6+i?//8*e$"fgghe<WCE_PW`\J=uJ]^=*+E
+%MD6MtG.2eHDC)-\k&7/Q>ub(2+PRV>Yhh2+Z'%M9I0!9k_T>r?0)@SDM]MO[ksr6)ZiQ0NW^ICZZN9kqJQE&[!p:q2>nO^rRCEod
+%<$<.trFto_9#!VfW8<'/6L at utHY9r'"b9$f8+l^X]M\UXLh,LOj[7:3YT]r$YVLErI]N4(Uo^"ogjrir.&c?q%KNdYBShBGkt61p
+%5TX)@Q<(?&8/rBQ][N$ZQFF2*/3[KI1JYcfd`+-4Jsol-,nDFm#C]^a<JWlq7'5*,i"Z at hXJkk%q+UN2)C/EJKFBT8:_lq3*,38d
+%(f"GMifPd7d^Hj=[</`)]sQ"'<>efE+bZCIJOr'@IL\OA7a7U29kp1Q42NsJUn$0IHl`phU[]Pnl_/1B?s?_@`5k\-p^]"!$2!fF
+%SAjdcB40st0$JR'(p%<!%ONl(;+_5,-B$BdK\q at 3b1Ql5TM\3oPba>baW+Xe5,PsmRPb&(0k_%N&ChM/=P6LfRZ#,T])m^Qk9`j&
+%#"87TM]B at W%%*`K*.hmmWkm<t;7PnCK*c^D4HcBA;PdHjj:qopNb*OZ6`B]oP3!d]b+ObeX&[,;f>?kSr*n_:bs7Pf>#c2-4^_4L
+%b9Z/B[YA)C\ht_G;W`KZ$u-J3ZE6F at b`k"T$)qmHaQVUe[mhsO`kNhOPg,u6$m&/0[bCk`P=6d?FC;.X"I[eR0-U+%+Ve#=8Su6o
+%?u](-J,i9,W/(;E1ITX5/nK8Knl^7_#B2Y]dF]P]4%jCb[L at J&R6np?J=s-llX=TN"JUjq[n.^f;,84Z5H6H#?'YnCW4ne!K$@&3
+%eE$J+V&]9bL0B,T2'CbEZcGM[b<B;G#[!Vuk0'd;PL\TM0NE3oE\[8/jrtp*,DqVe+KUGi5bZ:[VDOfW-WDnF!u*/D*:!f'M?\0J
+%>QsQfd$H8Z3WG>\/%NW(,V1+)fcgc\mD\S at 5]P)g3/V)IQ3?a!PpQnT5a#W4Pae2h)N.E\l.SJhl43@$,H?_A at qKae1a31%T2*-c
+%1GEBROV'^qePo3&IZXlWU\#M+\$H0")9iF*8-dbRUU!4.&Fup^!3pLE_H,k?Fc2_=W1OA)$oaut8TJIg@'Xe^1okFbC:tsU9P?Dr
+%/Br1 at 7aR$UktV9i:8HL7/[@4cH]FgYMm&K$c2#:MWrA;1Be:K?ot+$7e'nlInfX=T;b&eg\0Hl[77;rE.QtOS1QZ?k,ssLX_o;l"
+%2bI:T>-f>`]L<up25%T`Kk<^^rf97J.hUG7j<pFNQ^F%8J)=,&1hk,FA,u+]0\qorWa&b*fP4"M=]pYCjj[Tq\48kL0qGdFOjO2@
+%Dq.`bftr^;!rs'u2>>^#ioUe=;@s/[1jM9uH)5gBP&2AJCl2@[6P&HNDR8J<c_*3JP%cIaR$_J$b\2*R$O^[HN4s<n"K*kRZ:>KL
+%Ncg>[k7"'eeG6Q>QDQ=11eqbh,X?GHP3F^W%id6e$Ge?9gVJ'["/LjrDEmA"kh4(?Z]'F+p'">*p!4AMb&+Sp7_g)("JD]!S"\nV
+%%s%cm8aZhBg0C_\Mn%Qa$+^h2NqQB5=dh$Z<].LbMP1rmMcg\=D$a%63t!63)G@?-S%Qe at R*1X`i%648D(LuDhrbYH/@PY>8DD?M
+%0Vr1O.16tiHVf1^A;OLF#\$7e*]=5[lk.dp/`AgV)E=/NKk-<$N@!OVT!3_Fd[DkJ4K;u;<&eQDA/3kJrZ4&p3r-;!`NS#AHFD<1
+%k"CL\227t)1#%dHC9fJ6nGr-rAkj-0hf&Tj227.d98=6KJT?jWG,V5/6PI5gqEgdJ\g'QJ,+c4aN,Kq5l4j%@kC$gRlibsshVOfa
+%/]??07^U_G9d;E+B\+4I<d(/5+YqUa,fqU,81uAJ7hBi"U]Y>M#RW9B^?B;!Et,/nTW/R5l>LruFHe8I#A&-&p6<cYn9`A!%?NY_
+%]$`li^m+-$'3D<jBNSKY5q",g0.$dJ'S+?Z2`:^+2b-+QR1V5IPHeFqK82sB7.'`T7ONi`!-M,\<=pQ(_t82"@6Un:!-e+5cEJuj
+%m008:b]nkDZLP6Y[#AM&=O]62=uOJLFTjFq@,o$/5Vr34%"B1t(AJI3!nUh9Zul?W6T2sWCq-ig\4r,#WZMpHlSb(45-?\VCL.k+
+%2j8sV_3s$\,(F2jI5)f\s(t3XToN*>ZU-%"TIWN:C^`bufB5_k%^gp>Dm\>tZj%afZ_+V*PO9iVmdP%8^[/6,OJ,c-:H)HF?Eok*
+%>H]A1F.`0td1V50oW!mIqi%XfZrsefYqC0BJD=e3>;Sf\[A5gd`>V)DGrq31fEr`B:FL^2KF3TPlRVS.#&ZH]VleaE.]$(MJ1q&n
+%'Et)`,T^>=[PmOAlPpd5-NfNB):iVsLlC/I.k1YHGkr,hPp=GU+iN+$YpNJ#=i:;I4A?7>^E/65N,J9\B)t-DXVo at D'N\OpT@?Wm
+%XG%NoC(ArNX"TZRFS6:)HJf?\e!#;+WQ]A6e-&mH at LhZ$IDPO%FIGtWkXqCr*^n/sSBL&\B9b=s)&C_U5/jmakYcZ9/OGG1?;?(r
+%P*l!C)m*ZRCbdW!3G0X#[*4Ld_FZJ!=e]2AarNcnrb(`+6;ao*1Wfj1+T/C+*!Gs>Po#u.+_T?0ZK,W`MCJ0S8JE4/5S]b+64C$t
+%;`EWL$aE/heg:Y"<TVn*%&$7K0909hRYepRede])6G3g]'8^S`(P"nSJ4(!@?SkqE]F(YF*+9`s+(c$co--j^dKmk%@[RGE)<t5R
+%AVBa[(hh8Hc`jRKU6B&fQ!\8`.Zu?6+`k5IaWm8kV-<!la/1@*_:Xm'[rb+'jf4F3;\"D5UEgah at b!e=eAcVQ(;E(k9_nfa#>Cp9
+%bg5!F&@H.PRuK[oBojN.dODhS6.3K><FK%TT]"$%3Cd#<7 at 5ca!Xp\GT@)X9?EFM%B5-[@:=UVC$/2=H_ at rFNg]fQFaVA=:!WDme
+%Yl^7d[T)gOV_^sP)uG!P`3G#MT+;8T-rTM=Au_hpCqeLIGZ.:b=>>_M;JB#31;O8N"#JW3Ad!HbS*V>P0:A*&$i!;FfaBYhoHFQn
+%]<r=u-oWP[/gJDD at pj_?op^@-VIb^?kk_R at BNCc.i`aD`n_sa56Ossj8"hVo$UbOE((F*k at -A+&5K,N8#4QHtL>5*rdQGm>;/B!K
+%O1Z19Z%/k'[k'";)b'5&VH>[deRE,%Bfa_:7e'FY9hg>469[.Snu!o//HtBR;Chl21!U=Jf7^\B!%SNoFrbCg1Jk(R?5UG1KTUdW
+%'g%#0EQB*B4t\,]ZZ9i'Ar>^&E.A0?*l at g)VujK5Q&6i*^<X=>E?Z<6:%9iWcb(:R4HG7Vgf>%kH0YK4T2Pp$WM.*[+Q]uh$N[L%
+%\5C=JLbL6e*trT>n>$13T;l:HbFk`(Mr6GUD\QU)DQ,F5Z5S1U*menq-X$]!*%,&HD:Hc4-f-dr<6^M2gP%B'!SGG4<NH6]`Z&DW
+%Zq]RSFhQ1/AQkX)V$IJQ0-N&@.JX<>s$VjC`o`Vo/8<]=),Q<V#\54E6&g1)9/diCntA4e=k6gj*eH=QMThB89eSj;`.B-?E<48T
+%L4EQ:0I:2W107Cfeeg:"cUt_W6/cTYI1o"#oTD7h!@W!ps&<'C#q"Z:%b(YSB.Xud67a4uAOO=%5T/N]69tBc)F,B:;m at WMIg68g
+%%;F-%cB7.dCfu;t=slEcEJ_m!+=3fSW,'Y^b#i)3Ifmr!/Y^(C,f;o_ndYim]2ehQV+;$$;C8AN;kM#AWiqk:;T]JLI2A1qC5,6_
+%3 at 2Hag)N)=]M5CsebNqY.c-iB6J>i3UW0PZQFWc+\AK3&:.a"JW')b^?puSJDK/#)!Ep9-(0H+`6'u`9,Lo`cCIZ,W/-$)2<U.I=
+%/3jl&kYO0J];iQjD&*T3Z5$rE(t#1_Ldl>S:`)Oo";pfhVQ_c^,ZkU8ErNA[9>!]%2:b55fZshI"C4g&PFEb(<[9:#(*U(2SJ&Ua
+%e;2/ApN*W(F0".Ajkc.QMd at XQYa5X-"*VJF,o!M\?+QXcU'J)9kW4Ob]>>@bepX6nn4N>I7ZWYe!*#VeA.i]1!#7&hKF"M<M'MP=
+%$8BAuOB^pY&nKc[!YYF77KDI6YG!(rL(n%p:t.L[g8(PI-2si443bMe\T)/2'cVa.-3QMO$el,6X at p\?YT]s@>QTNAi#2tbkJ/=R
+%84_cCJUi9V+"(3N;\TT'mgE?[K9(dBHIW:YX>+o$bs[)S3="s\*FqaZ?r1qM7E8C$PL'n^HsEdQ$50N>(oe0Gr=<EU,%[r\EX6#J
+%%KEBPYq,rk'H#MKQdj$`<q;sr[0Kt`Z\.KRl;H.^+rC?H<\d118%No>nYlRaZXn5L*p*0Jr"tU<L`Rsr4)-ErJ$r;IS84:LVSOY\
+%!X*&M"rJI*f6p%P1#oKo/*hLNZ[qC at fFDOfX3!_f/fd5qB=>FU7TCm"i[=#pR+^#I$THQFJ#JfbhPls1J]6SYYSg$_1(6aS at n<@A
+%K@&os-;oJ:gdOXV1Y]d_aIpe0WfT[a\]S^8#4A/c8lL]@6Eo0<_p-Uf0dr`t$.d79_b#"E0]A1,6UXhI'h2R&k<>$ifl6u at W43&l
+%d at nR9bZr^SX95tFFu_I>cUgtm;NS>eF+k9&AiSD:Ttgc:Y88%L1:*/b3bYDfdAO"3:DbTP0l.!,)S?TG'&A`5*iD^BD\NX]<+SfL
+%DJ2EL0s?$<ME$tjCoK3%KURjqO%'4`i]0*Cb8S_:`aGj%%!AV"`<]5=VS")3Y$"jSU+J\G.Juk,apleB8gQG3f27L^1YYEtIr at X%
+%A:DWS$!a5#TqXs4B3;oV[,=C977c\uR`Y<,, at +ubPRoBZRA:6%c at Oh8"@OY3SK[G<%D3YQ*47"/Ru-QqdLe6\!&u//9roA3A4'bt
+%:`Ir-7q^YOgRRai/O=Madj0l^g8K9OC#Vm>iP^m]Qnp98n at 1="&>1mO[U<9oW13Y4PSq;`J2J2l=N\e(F*4%2*b%CD.ihNL3m?B\
+%"p<u"Bgb&j6\MDb5cZF1ndI6m+Bk"37iG7`-;Lq3T8,F$nkm]pJ6<EO$3sEa#^\FY?)Uh(S`ghPkf,0sLc^OQK:"TbOib`E<o\MZ
+%#S6Z'djt<SU[hgT:%CbhUQq0NT]4dj8=O/N86[mq?o80L,*_bO.OED*cTl_s(\-\)>kc6ii2j_M7O-7+J`_Fa\"OmjJ2Sre^Vcd_
+%Rb2'mD=qO]*7Y<"k$&&*4uilf?G5/-L^8QF^6CNf1kHHqTaQ+PQ:I6M1AWt at 9+%/25FN4Z8RmF#HsmRhO9Je0R7j=;eh_^&L4Cl%
+%6:lK8fRep&.k&pa]qil+6k#lS!>*j;FH+2B4'[-R!!hIBE]k$hJ1UB=/^'E[<dVUin=D8?MN#c0)$aB5P6dU$)Gkgm=b^L[PqX,H
+%KoGn2X/@()B;$>Zp@^Fd"WM-+Takt6*U(LdD+e2tK&4_I at 44H1%gt2f,Xbbee/?5f4iS4649W2P?-&`L at fR//=c+,3I,2)rW6k_,
+%iKjm,"^Z56,aUuSSFT*l(_qk'h9)gY].B!.g&NMI/.:P39&j"UYXm$CBEkLaf8%s at c_es6nSLlCfKu)f4_tD^OE7a39/]s/-O4jn
+%OY1(5iSg18fk)\nCcS'2MDOf?@!^msjs6b>"2fhsA<UK9)/VFp_Mk*u_4"o@/_>"n_5"#Q6dkY]=Mcfs-&-"9IB4X>G<h>>QkU97
+%\Cg$CCZEog=MeSkml\Xo"]u1/DI+fp/AkR(LN5$]^=TJcKO9Z,I*N4\,mV:7JY&0&+8B-i$K<n-R at 5^g)S(FkVJ3EI=<NXq at ppH1
+%`BRIIZ\2o.Z(iW2Ats+<VqkYqDsnW.bR3/V#+1hb7a8;c<i(U%&D?Cc24+KOlDjYa\HZ=@?Rda2_34bsACs\JK9e&A_BecT9!o?h
+%-EQ,G'%CW0A!nGCofBF!C*d*?$nQ16F)"\)1^cC%%08-"neTO at k"1ftc1djL?Y:bh!C_&0\BirYA1,SP.XQ2qWLgs4"Z[OA^>kLr
+%.E<mE&X=LVr]]iQ#mN1^puJ[(;#4&?Kp#Q4-"lBYd-LspN"TK]7U2$'OaM">nD*MJ>7\g$9N'>,)KA7\I%C`12q_mg0B%>Dj at Bmn
+%dRLW&PL1ke73c8+O`c118j"lkoiBLZ>/t6?<KO%L8?KO6'H.&K86qu[#N&=G*!drg&R/Kal\jj[!>3f)$,Muc&or<r'$m't`['m2
+%!k0S at JMM:IM5D^ACrZ0)3WMF$P6.G6_ZXQ/6rd`+iNo@%+ugg/>Y4q at N(. at 3;Yhcjr\a;[=C+e111%@>Au4V7()%a'-T#*cW62$8
+%TFPV@>iB/RHpE=TR$tkj*1U]aGT^Tb8/AC]1`!%jcurLrX47fWS(k%HM^H!>b&,Urih"gTXG87S5l<t=IGm;"b^PW(LeIf'W_A47
+%7*_($hA?A(GAD>3nq+)OEgW68!U2KjYu$X`S';<:<_D7'`RYnhS_C1NTK-dmTF8j,BB0*cL,GtL9aEUU[A3R"8oi<+=\LYT6^=GC
+%MD8cMDL623Ykg2BT#iFlC;FUAYo2 at u4f;N+%M!#nj_"RjFp;nGl"6gX\cj9[CI&Y:!VqqZ>_7_RU3#C^S\\mT0W,eJ%gGHm4i_;_
+%S%QWPZXZiN4sm^V8?8NFdMc-8ndT\5(W8s7dPblC%>5L'cWIVGZDL'&Y7*F5(Rn`T,D8nE:I\2bVb)oh%PX=M4JDh<b9#P18Zua%
+%TTtSg7Uca_'1\DITbIt]UfRe#0=G0hfRPr\5:njMAq>:jqq_r9'J:Mf:cW71=.B=a>WG:KBq$/`\&'eQ7+DeF/-EbE<)ZIh1/NWn
+%Vl.g8&N9/j&r\@p(]f<J-4$$cOk!_<1Pu9nRO)<Di$JUb&WGPb_=Smj#'q(uePXKR:)+CiA!s/>,F5L?lE_'(E^:;@+#:sq)*1UR
+%)N+IY/hXL8ab&8P&>O!GELoq!dU6-S_S,)X&U$GaMnosfoUuHs]s'*7%Q(S](a=&%M at Z^^&oqOiPTH%jY'"WVZ`5J!-mYjUKi'*S
+%feH<lD@/?VJs@$\G%"7&Hb`5(lpM2!K.+gnX%V,3%8jbAm7=W-8dI-l\>3#Up(B3H^J\2kKEeA\TC\'[%@'LOKc%LTgpe&FA"AnB
+%19.GY#d.)bEA==9MGT2<?<4fZ.;2H(j0M"NT8 at b;,O!H6c-IYH8Cs,GH$Sr-W^0!k#-C>NXi`ns<PKqmU-&`c[+8\^i-&MZoOf0+
+%doV>r#*a#+K*[J$(];.]O!Q%[?pG!=E]*'nQ5D/3Y)1Hh;;UC?a;p6[3(9*cVW8!,nkH&gnQ86%A,4RR^'WU4DUaltV8A-ZaH^nC
+%(o!T at 7<]n'SLYPCL'?h$.s\r;W:u\f86Gs!A_sJRVCGDtU(rV(nNM:r8[T7n$)f:R/Rl=9'uH-!bOP'/"G*$kkB_*XVG%/@5fGM7
+%2O>5]JJNQ'-q__*jViG at iec);HS[5%8cbUlTqJC5J@`[XJLs;#GuF`KaqA:SL.\[b-q6Bu.pN,1=O=RTm5sB6<%U,'@J6_jK)kK?
+%Nf8+l_g^apc(m%+=ZR8V(3iQCc8I.DiUOE0-$ai)C0XuC2)NsuIZbI*e%<;H6-mmYbVF)C*o5bA:!2Th)rdea]=HA092u$35b>r^
+%e at FdULq+D#hodq(.4BGs$(sndK!P9^8HVLd5gIC'B6nT,b3$-q[5$!,KLJjueX"S7AeLF/#rODq\e38T"elm*<V+k$lgI.DJku_p
+%o%c;T[7#7j8gYAD!e(q8^n-gk/'(TGCUE+AGcR%IhCp7\0MaC&mSV^OK#f at .bukesXtHi96!bg0a+8(L<brsYO",+ukX[ij\X]!"
+%p+fKK=MR2gq*=mPYE]3*?UD at q_I0!iH:%CncHO%3A9A8]%\h-&5"1H#N#.s<_)#r&7IQnM>&k_>\tCDRO'u at i@:Y\@HSo\*3:q/D
+%Z=$%!f.I>5/aQ?bd_[u?0>Ns4!"+'L+U-o#XQ%PbCFgAF^d.V at SBgpE0^s/k9ZHARaG*Ypb>Mq0<_H(b)90'&Rbu;@V`e"`$BQ"M
+%RMC')?7oekiC<A7<%Y10HP!qP]1NEN2&+nG\Hr&-NeI=B/+X1UO<[NgLY at 8t=+uYL-DTmZ08?QaC"#P]b*_Y>!TXTdD_NMuC0="/
+%_k#Wf9A(ZZWEQHY%'(ckU)ZVH@\Lr#/M(&!U/K79fp%_7Zqos>Uk`2lI6skj+TJtRR_EtH[6;'.OWsDnXHrrE0&^jJ%ZcBD]UZf"
+%Ze:L-fpir2,$&K at nkt3_Qt=N=gmO!O-D at 90<JlI1pp+,(1"k_:OAJrEJp$AB?W*o$2bD,4c7FpN*0Z5O3,(_`Zlm#Q\'!4`5>Z7[
+%[m,>P)6#1ILJ;d*od[fbj2<?$5_[L=dQi]*0GiqEOGuLDRM-/6`JZ&69fT\J]"lI6l6^$fic/LQnLS*VPmrPO<c^MD6_WX+S4nn8
+%5i'jWMK=mt5l+4 at 2mtmCH$]\dJM<m4,-UqC8sg0%H>iu60?Klaq6Cb"U7?S"Q6^C-+``ZEgN41IN$)*Ck6Vb*Yn#\gp9V\c4gdZ[
+%hf84UC[/*BZaMT`ob'N`?ja>7.9qd6PEnqOEoS'!$trX%=?aYh:T4Ldkm;G4,L%`QH%Q$,AI,$XrfBoES#5Vm^`e'L/$oT_r&DYH
+%W9V1(7\4kd\Dq?c!=@4j6XNr7B'KJ%N/l at 4Mb4=O^UKR<fP?,M`0m%JkqS":cbjWD"-4d=h at OQqoT3K5BB6]6'?[$a'd8niJBO5*
+%JQVGR]$qI$PNHXc!(%i%G.ROP!\UG^-kDpcU^!2C(b8lW1X\r&P-ndJ>ZVq.`,Ih/F/<ii>1-)0k"M=pLkJu5SM:KsQe./E6"W$7
+%L+n7qb:D<n'Vc`deE\]P@&S_Z9Ln=_=1\Y;aT$fr#BSJF5L"#]KhlT+;PSCU[?oV*!ea][-(.(<$g?YtSK.i at 5`"f)h7Ma^;G5>=
+%/N**(HW^#9[5Ts!!O at r+%gV4.WdeD#l.W6!RoXG3h%)5AW?"Db[&e"6<h#Bb/)L8jq4af$P+%S#W`14a*0$5]+^2`SRAA6d&o3nD
+%17J/VoTIAd,:Wk%/=c-G.YWU]aUKA-PuJ?RW`8`nGDl_Pl42E!QR'Xu5-P$_BW,\^/-:U1gN0ckkQ at uZ9b1\RLPc,`Sh6ob3:Jtp
+%L%(?XdTtV..G>h`W9#1%Qa>&Y_b5^T7VBX at fj%d]^qh%N3bU^R<^J=(]7?u+[kR?rqUZH"2Hn+T,DO#"Td"[o)I!)\H9U;4#=Cng
+%a</*o*hXfE%%%lR_.[PE_T`]Ec/?0N;K'dlD^U9moajN5e4DFI3/n7qXqj>[hDc,[1JutCcLB=-peQM+r32][OhfSWEnD),TA9or
+%b]"T(9E at J;K$4ZWmS)Lnp5Z.(Zd0>Pdd`Q;k`95o=PAH4SmL4W]>9,t,/Ol5B/tRp"L'p7V*F<p7C5SN*Cuq at ZtHX[O9h)Cne/2c
+%>Y";1;%/p\28/Ksj2kc!joV^sQ1-S37Q)Ui#UU at +8=3dBYW8#DD2Z_j=4O:IL72K"_?qkgG55`lr02o)Q;%)ab7Y\6"VimS]%msR
+%<\HPfV878m,ptgV*51X6At:=m3kY`Pl4V3>Da`tn(i"?$]'1Z6bF.ub063W;,nl=1N?SS.IdUBPbfNrl=YR!P_`DB*6?Q4ae-MG=
+%mPkkfY2tqNXr?<60%^YP"L6Y@?1i.n;d\U[[D5q2f:W$Kli7N`?PH!:%6<e?)s!MU;gM$a&>Qd4bV>bQKrX>_9uPiX_D*TWhMI7&
+%%'C>-iDh^s:pjL6D'UP<D3@=R=@Mm:'sEqgLrqMQ6UkHd'QM2EK;Q.+Mj;0;F>Acm.$HJPP(HNm\C"4E)HN!@H'DQ$F_QVCa\c'O
+%d2Wq1T3&^bcAr#qRGpb5Q`<6)0:]_;SP,6rfjY.+0:!kJQ(!k(DK0T5AOW$iV]Uuf/b;Nji*)8jb;hXaj.M]gP->Kt$R)(W'NNtu
+%.Uk]88d#SA82Q_30B-/(F5h/l>U8:9M6 at .sH5<YrBiM;p.GWdE^-6W;LeK<"fr]pEUnm,[W3tjX1pLY1+==J3b8c'%l:VAq"73.g
+%,1Jraa)Yq5-tL+5Ce[,(o<Hf^.U:sYYAiE-]!DUU)sW_e>B`WpeJ(.2Fb_X[\`gD_0O*(9cU9#,0.^of]Xu2%:+pD'p3%Qboh&4a
+%1SdmcIFL5bB7uXN>II-%%XD0a,U%6a(pHn_f]WWUlY at O1>/MZ.fcX,0C78+)VOF`PItlQYmpD^Vr!4:qC5bZYB_#A(b3VB7iRoud
+%`\_8.d5H["0C<p3Nl3E at LN_6/Je$`KBu#9?UcbqmEHu8232H_S#N)"`[87oJV>'WAj#54Ape[ON0[&LW\`pK,mD.-'Q=O@%]VE*;
+%%-7=cli!cj"LZ$n6[r#1o$D-/'0hioKIWFl;?c^h9J+qpDqr4o8mY.u(r at j!U5AYf(8#2JJuX+<_<O?fbN%P\rs&L?<DWbL)p&pr
+%i>U:s!",?urRN at 5%Qd>PLfR0JL;kQ=EI%_e4[d[#g8n[_Q4drPA67cjX,t at f+&bL>F[2;D/R<O5k7G=fiY$YLM5HO+-!J,#&ulCG
+%"?tNQ'-'@-/hHNS]cp_ at +X"<6M>.6o- at R*_;Yceb5kIG[Vae/8WHR=AMYl?PBOR?@gO$N/4%_X,5q!L$bW&moa`R$^m6-ZI;^q/d
+%RC[J^f`A/ROU,j!cQl(UdEFWK:uH<SN)iRn7s0N!M6PieJ^&50@!nE,Bab2pOBFH?RHBg)753'j6,ehdMSLX",sOCHB&T$Un4.-r
+%VGs%;%c at D!m!s_SLeB_pQ4bJ9?<0?4 at e?A)7QO)jkcCHp7"B!e$l(Jh9>ZO)'>6mZ>mZGl^S*[_lBjj-GuVD\BYD=H3)?O^G(CGZ
+%pV%DUn_eO)AqI1AKinnD,PtYZ,RW_3*3te/3)CE3Y>YG'__5u'YQbLPL19DWQ<T'D!@.kDC._^37,Gt!'MH;CUgmjUN-pBg&LE)f
+%I0rSJ5^=%Q/pAU<AJJ/5i_1M6e-^*<JJ2Jm/d#&F;[MWm&6?i1Aa`PoF%TK,^=Bt'I[VH_H8Whj76S.N587i-m)P0o&A$IU8F2pM
+%ojdfY6?.7`q#<R*n,'G,G*Rh;Scg:Y at j:9:V,<LFU]DG-*;8hCq*CE/Y)2*K,9**Q at u\L3#CBk($m![4p",F#"^5Ra,,NpgTGEVI
+%V(#6?XWj#pJ.G6C[JcJA62f/Z8>X`]^"6H>[J#'@kFJ#^c9!gAOs^UFfA,hDp:]ql?@2(IY'"$UgO[iX/L:)dbtrmX;K%bS*K\8J
+%jJjjg7Vac at h4VfJq[oC?a'ls5n!QQ]XZ/PTk)!U2Q-Qrp8G=dZ6XhJG]PD;`*Ad<Vh>0m^3 at huc'kUT>Le*>g"13f&@P:asGK!t9
+%:cTdT#n3]/'lb$E.dHel?O_.Ql\Feg)KcL"(BAM[c[MgZf)EbHHg-\q$U(PZ4LZeUG at Ujo^k_/X<qNb*YsR;O8aD[#[68`%"6n\l
+%=KNQX,He5*n4oZk*'>S;4C+JS>l)&DEE/hTp$[[(Kjp<d(obF4WF]0*e/CU+BULm8Z;aL:UBpZFS+k)Xe7mRF9FG%N<1B^>$qW#I
+%"cC;hp6;UqQ?*/,&8/nAeN-7KLgD(3YEHH*1#\:TJc:Pc't/6`pEJ$&c+0s':@7VAjL0O.FfXMYePT7Ks3YBkiR^4%M64p"`M#,k
+%C+>T6C-5CB<U0KI"H9R!/'ZV2XnZVI/D2'fah<?J=]JaEeWJU%on4L!&S<?YJa$lPG[K.oMn<]9H`GdV\%Z[?f!Xq2L".;!)t<>A
+%H#`MXeO?K[`KOOrI?Kc/"9Bc;%Z at mur'JDaG/[14+7[LtBu at LcIq\&W]bgNlZB*PR$D'XDP2kfb\mdErfRFJ1+Wb\0#qS\%"T at TT
+%3tW;1'X4IR'=a--Sm+iDNcX1`B(onB=&R0l0#L%,"FeHoY7,So_$E2d7rU$LWu/I1RL2PGL&im]l<>J072Z+B[`<059L6HL]dlB(
+%fDlpm7rW&+)fgBHcJ4 at FUEh(rZZN1b1U5lo)pJ(jL&E/ka;,_(chf'<?2I$OVGM])*sQ>&g=p\na69dSc*nHX_II]j7h?mg#COPV
+%`&K8+i%]NWWf:i2./Wp;OH9oEY#>_uLo/(E:.+&4CJ7_Ygp+Z7gJCo]32a&-;[6+%E_tP)f*rWFkscEhqGr.%L"s6Ig)Vj)R*OLu
+%`O!960nZL.ZBRup:YP6]8%24.?n`%`.YjG0U/ORo&bc3M:d[d"F8DqqKoM#e\2u3A<5%g%qSCpRHrj>-<ds4\L0@`5]QXq0pOKb9
+%HNd/kG2ZG?*`S/T6;LNb/TefS[;W%LV4%/RFD(G/#)s/hTp7"WgfN\-YA;OBO\%U37\d4&UR^k&!.YU5*/(d'8]=B3X[.c,\XH6K
+%_OHh`qfD3#3oK;q3+sBk#Y%c1[r$tF\gtlZ$o[_n5 at 0L-GDU<`dmN^o/*hW2?&07Q.;61fOe7)]GP/!@VD[Z=j*/-!jHAKNmPFa[
+%qFYe`g8`B=k-2r'dCCIinkq:_fakU;`?Z2Q9"dUW#q<fhiHqTZM]4bYm_0Wt_m2\5`WRnX%KM**PctfZ,5\e#@cRf&h3Il.>qEl4
+%*Kfd(`CH_"5%09-#fNtlO$EBWHePS4Id#?=5:RJnoj=>=lD$'rqsV8k\PIVKrb#SenJFS%:I"mT(LEj#KAZ_,F0Bs^7X@]+cSJpS
+%i]XJ.n_+Z6rL3YfO. at Mc_lY"?rnC3h[P-Gd[smPlV`ti4II<KO1EVs5pN]DV8?[G2dI2$EHr6>)&tned<Q\@,5?`+_'g\pkc8'Ce
+%)DBa at .4h0\"]6R&]gk.,5Je1P0h9\FCL#&3D!fV at .,_,P(BtXH)8[@_N`;*/^VBC at O:PD[_dN`7]M[R`3/Pd&1MF:N"3,Gs:M#p\
+%aPQW-!o6JR[cb]R)scXhlq!?moqOXA"Q:&Z`s#`e&q#`55$`/]0`lBtapi%MV4^hYeQbK<pi"ASUr>A:/MbqM;gGp#Sus*O,F?Ll
+%R)8aF#RXl-`0Dg\RRd"EkRlLR_2Wl>fk;5h7cr]UN=;EDhTr-7EB%,YdM;pu+]=4TQ6("c1-qN5OAitlhL95rYe?#&=5-M+A"nE5
+%=_SW9*n]b?P2`o\m+&!;Da`k>V:D)L*tiVc]:Omt"oc+>54RJZa"s"ts+JH'/9gZ`^c/3qQT=.U#ZZXd959tj^((pBf:POT+%mcO
+%GE3\D`%/&h9J$>0,[V!bQj-B6]!Kc4C-/HqrNU7cj*Q%/HaNO-\?$Jj[BfU88`It,8iRDS*%$Y^'@BP!OupQQ3tsSjRIAGnmkG*B
+%\kNH(&LMn at 8f;_hjcC.#Ni?tLI0GgsWHKVXYtWc3*K,27pm*U!Rg-`-.]UK(b2=O-ao%5uA at Ls==UJNc/_f$AmKe`8We&[+URT at 9
+%3]Tq>d\/I[jmbQs=&bs6b/]gBHRNGJWns(DklumK<lh8L\jfe4'4G%>?cSJY9ti1 at 7X^Ith4XLC'h*9Hl4.3'cIq`q.Ar$SO_[?i
+%UOku0g`/l$l`fU:RA]*Ks2#+E&q\L^^dq8VQB(@)#S.*!AJbY49=$!eV16cFZ<C%:Gc$-E[g`J3RAPktPns2\JCNs='6(uFj5\_A
+%PC(4O*8`kR!8>P;>;LV77+Q6ZA+s#ZmkfJs:CZI7iCY*40Ysa95qH]!Ir#s\LT>X[:[$0*pX\e[Rot9TZOK4G:WR8s;N,d_pf=0(
+%IQh^dD!l8!c>JD$.?_TH$Pk!X,j(@dq6$("6Gac_U,U:jU)f'KP?nD,fsP6+orl<D;c;O/loj)"Le'l_d+\mFD.M_h:q)^Ia-)ha
+%eoR$%c3.4Q*RYmaW%`ir8g*7n;5&3I&s=7Vh?R[/GRi,?aa5C.)$!`.U1/_Zs'"#ENFNFQP&hV at 5dB/*Vk&!pr4korV)CJ=XI3(g
+%k2[9`bXpmQBg"J!F!0q03irS06+_V(+>rR]ja,!I;k`C0%/Ded+:#n[g>2&4Y%k.sI)6Pk_=G`l0Ll8EK,<]-*F&&&Vqdgn,:(RY
+%2^^VF04jL3#)kODlf'2\B.3G60:Kul-tca1ijUj8gSc$rY<!5nP2Z*u$@D7O1)Z4V_gsna3'bBA.n7Zbj$?\%!A`Eb<"!gEWY_g!
+%fhbN_SeRkcbCX&7kA?K+X]s<dhgj,uGAj4a>ioibA80`#e#6P#GNkdY4(VsEo%p-I=]rujQ]n_2<q+Y1h at N)X;QpuG,Wr#EfUQhu
+%.K`p3U\;cucTs^5 at V^#i<Gf at p(=pD2$C/`E[8pc?/'-"Ui]ALn3h"KAH[I3*gmTX.qPe-(.=6K3[(B*mAi]<<V(s].WO<%'?F8X$
+%j`V`.`o&GZ;8'&iTV'2/002PDO3&(M_f1\4AuX85N!\;j7Or/lZ2iXj0B`CoX%fU!2MkfhTA-<3VJ`jYL`j#2UmMk>Z\k\ER^iXS
+%=LA>G1![apCM,K;Z)*O+$#dq8[SVr+iuZHD44hI>%,;.b\:q at fi8']q>FaqLnCc$SVO+0eE2.nF5\@-jGY)LH#!C4>CKa7MNCKQ7
+%4HW]T1qS3;%*_,UF2T[h1^T!heTH5WB<a]0X'O?#]4s`*;E7j)iET'G'p4YS!Eisp,`Mot?0O at 2SV^3:oc?r=*"#_DH36:&ed at YE
+%RMKEGQ"u!Kn>XFYCpC]/\uILQ8CUc-0KU5p,3i2aC1`8P4WX7GRl,oWAHf":Y"n;S8RRaJh6`e at N5n@nW+35[]'5)\DQ4e`Y\\p4
+%%Ck&5XTZFJ0/#;Pc"I-F^8K@#S2T,6]YEO7n&'&r/P2k6!l"A, at q!KTY9`D@`U_XTBKrrJ@;i_9l%$38NNPBCm"d$t"Z5T3_lcWO
+%bNQ2'\+I%82F[B)+r1\%'Hf:pgkC1oQrleC6gQ at A.[l=!&0ZmR<_ZMRSG#GJa;ODqH8I2%BU\c/%L)p:1j>DIOo#@/:3Hi09>Y#p
+%qde3Q at kmp-df<FD*eQS-1oF,N4T.Fs'i8T#&9V&G$?Z&@;L*&@e$c*`o*S+CY]\_>H$(Ce1GO`R-O5VLXi^R+(TK)i9,Dcf^kq<\
+%@:I,BITG4)9R<f,Z<Ok,[S*YMCYTg>%0RXl)fV>p&lpcODVAW3Eam5.8A_@[U*h2%0Vc'FW0(aR8ZlU9LL`XUN)9K9P&\CrUKot]
+%9Q\`KLOqLHMHZP90W,d[lE^*5;C<>U>FaUnKn/=UA&0)l"hiG7Y,UDCT$JA)AZ$iGn4Y.3+0M4\VqFVD at LBB@+qcomPalmX5bi>*
+%GCfUm&J>B9!i,q:Qn#$=l7-aDd:n[GPg(p<0fp\]IY)i@\I/q^2-&]&*\BOO<8l6rYf0opl_ghM#8/Rl+>Z"qQS2:UDidBeSo_eV
+%^%K4>554V\T7?R6O3VC!5PW0t?[hP at B@g.].J%fMWLo=QqdD/HF=)n\bB)RA)^>@9lf_8uX;.=W3`3SG-O)6h7T_<HhW2&fUU+/0
+%VeiTbg\-D&''B&L7-iQN7:"T$Y?G85DIUmW)Is[ni8cCDiFt`1;N[kRN4-4N"tTdf6\gGh/]$u?:OcErk_#LTl)!S25QA8uT7>t5
+%cb8iG9<[2E+1cT!J=ssUiR[B@!gFs(Qr_qk_QO`]n=Qp+Sjh6"YTIe^UgqTMVa(4"H`A'/V2D94.=(H(4\cVFX)r0?9=;J>eG"2Z
+%jPY-M)kT,3;%Deh\Xf3FIa%-WHDFqP_+0#<N.g0SX%33KV]Y\hNu&!@"I at r.!9S!rOPbB\BmkosqD\;`5P`(s5O at G,SrZ,9gl"Dh
+%goIWknF+Pmhtl9eV`stUGUIt$-XV>a^AU.=kM`;?V54^+K$i]WI%RsgbEr8*cfFc5WGB5_CHp<-po5u0^pU?)g5kOQcgTSko\*+;
+%D0(LTAle`[91bL;9d at c7'l/;UT"jS^EV871IMjmk3$qmM:H)PNh"Zo1Q,N%Mf*7H.e\WMGNUU2W0l'?O)bY=V.hf<'b^5;m<$FaX
+%$QSF94suCT6lp:43AhAKT]i"`DZ3 at 9TVTou!LjY*4GjBf!PqgfXOM5?no(r5.]EbLa4m[qVpSs.Wa5.F8ME]pL5N?u$BXiLDb!c5
+%<dB'_3$c3jWuHB7hgP>%J%$Nig[T_OA6:]qs+^DtE;'SQr,/WPpM#B%*0GF6I`?%[=%faEkZ9S*J]k_KZlp`BZKT>+-PHb:Q"$Xr
+%8VM\W\%\^aEhr_&6>AK*P4hZs:BCsq=Qg?56'B$n/n-`0/oW6ZnMkm#%.A]OP]km$'_f'+jGdb%e]L!>.:aUj8GhW]O:c#A>e`n(
+%7$d%+3,'QMJ9'sTDeum<Q)\ib]oAU-cKK"#Tb=5]H/)F1BJ,fi6MejV(r:B]5rLQi(IU^3"//P(bO>Mg0IdJWM`Xmdj[X<G\"gSA
+%LY%?FofKUN.*:Bl:lDX:7j>o=>:l\lD2:!\SZ3f,O1dIW6"_9dm,d-5,Uj6qmNho'a\rbKoOu#9oRm.Cp<hC8o:12ghf+8[l3aG/
+%U=cn,$(h%<CFb1*jlaJIVR>2UQirK,31;GQLc`/(EkF2d:)'I6B0ntV_\p";$.TQM(i1,kreP[C:$HI[h$@>hN*<oRcT8-Q.\6-3
+%K[7?T@^&H?/<b#MgKp=2>D@@?(S\:7,R2;b]ose&_;9mWdXDCT;$$q%$mh0&Y]+Y at E$u`66^jnEl.ge-IVB\/O\7r3F%jl=m9H-E
+%Q at C4ICQK`XjPe_A'.fZ_YRU(0?*Rq(U,VZF80pb0DcA!,qJmJ1e/&l$!RhjbY!E2:;Z<lr\L_C7,@'>[-<6(Brh"S%1q-Vo0r1b?
+%MfJeX>T!M4R_Pqe<74l.(DB\I0DA#Pq=K=<k)>=DSrd=WHLc%d2t4^P-ND),Y?lWCn=#toop(knqY<eVAC-h[>hd:.VRZ^VT6`Y&
+%V0'[]K<3SsP"!(C.4ZN(ZtKB*egI&6pcH%\_WS]'l=XINn["SV+F!@\MlC'&hS'RGe6XjsO%?9M^@V57k2peYBsk's$'``D*\c$i
+%kQp at pCOOFpI:CAH/Y-<[6$9LIrqhf+j^tuoT0)MrF;tGNN]FC[pbml:R9346CU\00>39r4CWLXrgWuLnb-fjtQtrOb%1hRukK@=@
+%p*$d63c7.mj8%#>fD:k=YFsXu`lYfnd5I>T&VK%E:OaBSLGn^+_1(k><EWh5kJ)I]g%JQ#l^IhlES]gOlR-IgmBo.?>3Ch47,;R1
+%+1WGQ+-L[SoY0nKDPi5A1_3`09:EgsFV$I'Cj8nr*U%.KhD@=>O$l9L$pC?UmeCQF`l1_tNW%_E]m,V&fQi>+52\4I)hrRK%l<+<
+%RJ4>un?pquk^49:?GF)GjDignmXsELn7=g=CPD8d6"g^q.,Q(-B;>X>D)PaE1^h4fbKcEh22!4_X_hqPYnQ0M=8gWrn(]H>pk.qH
+%S".?Y'?t?$<1=]8>M(TO'JFBM%C%M1qQYs4]R.2NK*uVpBb&15^7p&8+Gd8YZQUH1D*!mIUARND'9*^N(?M3$Ku\1p[O.sM4Du'r
+%Z2b3ZF:?bXN'k/9"<(mP'2;R=%0MHMP_b$`bRo+O*@o_Z;-^3 at 0)@+J9aB05;qUS*OP(;'b=4,bc),^jab+0j&:/Q)$U+pBDN;!K
+%/d2!j7?A?lOlh>qf3:hs[[c\0e6D>.A0X@/CCK=)l/VEfP]\=[D/'Pb:dMp?/,.?UlaA,'nIl)X8!)!8UjB>4D)sLi/UMPRT(RW@
+%NMO%l4\[Sso'hL6J+(m)0+)?(C0U"X1<b;Ua-Y,5Ue6MnfX%Wd#jIEH/]ki?W+`D?:lG!7[1K8a[?'B at QURU8/[j3Y>)_1jD--/k
+%[0:unG%QC(lO52rGkhC)r\XC=?3H,SiCsom%@#*2R@(kUp,KU-03j-9AaRbH``]q at MV5NooVLHKNGM,<#Gp-!-ZJg&-?d^qf<64p
+%T2%j2,u/-R4>]uooH6!@H[PBe>:sb[4eDF*WiZ*q2jDfl6rGDrg"p>[8sqN[DNo<aHZa1]%T6G$JDb5'^Z[*IDWo"I*K#T'N!+-g
+%]\`lhLanXSGLu2EdJF;,%hrC)lQ)pVfm>q at 8h_J]'H^iXGVj3e^:4)9SSSF4ZK!+4?,uUpKrDEI7Lh&RVNFP<rs]2Li037/[XkM@
+%eP:Qj*)NYFS"C5JYq3PaHftE<>6*X#YR^GFWK\g+j_ImtS=OZkD9kLP/DAbZ'42W5-CXG02F]BCSFoM0]DOV at r/^fPBcM&pR]=02
+%rPcG/&449iDn2Pt:!7ukNRHE4fH%!*dc-o,[!$No`Qss5a<m.385+4j/K^)l^&[cj7NY"E-)6u:0"_J+>[9+"X_U-U*TM:3/t[TN
+%RkC=\f&H0HT,f<)!@1[rpo]VE?ooFQ4X`6i,5>2hmIr:69j"-cKcQ$P!s9$')@gS9VX\E7Xg=(pX!^)4):uLP7)pKQ_Ja8rYfB!?
+%\WpXW33W:KQ<=[B4A00B[DhNMi4mr5PQNgn`Ps5 at UUBU-NSC!,5]4'S)[)'65tX;KMAA+(dR$]f.r+_&1(Wg<gG0TBP-03_Du<)<
+%eP&J/55WI^V`\,"FO?D(nQ8k60Q4B54]G&9g)]M!qpk$!<]Aj8DSB&_hEH)B?0_+VW#P2%YHpILG^$aphXl+UduF*uS*im-hihrl
+%,J at UadFca\-Z1(U9$d2Rh4>I?&#pZY#eYCP^*!DLej?@>"'O^+'I. at RSoc2YYNR@BSXHXCs4.p%!rMUiUie"CG-J^sU%n-iPfCp.
+%]V6no=`Gj*4"Do$+c!?YZ&Rb]Jo<!Z=sLYQ1`9&$:.*4-Zk*OhU3eJr;Q/DuJ+/>o+QX5G>/m[9;s`k#=:Bi%@'+AHl4ZlG:2>pb
+%!`s:bg,kU1-:(uf)=Onq9P*E'R*de3L$_q8ZbtS?F;*&k-,p8t]d at DPl;%@?<5mADo&>Pc7WkJ]52sBdUcRQXqV7ltfqm2"07Ha?
+%+C,e(,1OihAF%,LP#(NHLs%:d?sEKpj#ULZZY`NZm>C$9PC%>-9e2,rn at t>t1lB9Zl+FVZ;1_/?$GhD5GDAU$n&@,S>m`BIKsR-F
+%:C8'i7)t7sPDe.[^,qA'DY+O^T\#/g%=8;*[%"O!l*DR<KZXJq1JD;M[Ft7^NE].+LCg_Q=!EIminD[e-db)6Vh]\%ArKK$FQQHg
+%SnW_R7iJ_8W&XEI2ig?J!a2;9h7,s9[R_+c1Ri6WQr7 at _&.HorAI!qP>^7U"=+gPeb"+>@etUk"\WJG)i]f^dLK9]Z>ggLKKec%>
+%<M.^B\LR"IGX0 at GML,GNgR)3>CA_&n?G)u-@[=fAU?//O^*tpD)16a0dQhHn_ at d&MA&?in&o9`sc=k?,e-H`NRM*>1YJVcO;*SV$
+%527/-iMAR;[M+VFA&[Cd>`Bq[TM(8mld%'3Su?80 at VN2Wfe1G5"J at GkIp`'!SUHSSR;Ojp;27)fTKH6MoJ(:m_*+g:5K^bb\*J_$
+%!L0Ln0JP7uBZ_T[IFQH<`!g9S"BX4S>;dC"G=p]d?'U[u*s&`KWdgJ9EXaLEGrnnIE[%6]$1\YqQG>^5d#fUa"e'q[V`:1Jlm-W>
+%$9`6DWDo<:$XG$1(maZH0iLt?faE3.8cpT,&(e6b3dp1Nltj\h;O5c7)BV!7`_5AI&H!s9l:.SEU:bJ)=UTFGa&b*2GQ/<]4f`bQ
+%?L(RnG=pkMk`g8D^<uaFMpiC%$r9uG\h9j+NX?Vql.p;NL;E!&K_Htak_EnrDs^XNG/sKtK*FD_KV)ft!A72^6\B/9KG!^"FKCE>
+%dIp7`:nSpn<LS^5$'FcEJ62\?UHHtH_E-:Kk4-D#EDNE-SrqiV8/#&p?Noa<o+>_(VVH<R$Y3Z;'-1Cs2An(ASs>2Q1Y&qkaN%*H
+%=G'kqqZN.'-3#"@=IdN7;6(Fo;h0*DjjhTT@(R$!"V:Ae`V7Z"InWMH[=O7C`F+p0k*0ftOdh0-K/0Eh]\Y:P3!#/Aq.^HfM;th?
+%PZD5XE[XCKXS1T8Zrn6s&sfQ;Lu:i>q>C"(E7,D;N(h?]MI+*,U9?s*4cpK$X1L3N\5[Xb#5KAb4A?AgG3RN%moI&8a6$51DmS3L
+%N!S!Vof"J;5Rg at H7kC9s>\:%=P((9U@<r&HRVm+[Gq>RurPPLP'j9'7_;;DfH8?'#fF at .@>tuir-'[i2fH!Ro_gCu-S]^V#ag>I6
+%PQ[_qS._X$-&3lBi(b`26A at T3Gei?P5\.;pKn7e,=O1%6\P#f\Yd$n at p<b]c@@IAAKmdNZPS%T5'9Pn]Y'6po&.$&A7M;t-.1^&&
+%8H#406=pA,Ue6S-4V!qTA_iYU>6,8<g'bD1MTO?bdLubD'.icbMbCudb^beXraj3=B^S8Qe3kF:(9[=oc:^o8&jpV(dA1L#0,``\
+%G`'4[7nn/'NH&#<dg:gf3VCrkplqQt`g)AG/<#G*(+Ti0aVW8/,c/&JBPtq%KS#Lf\HdO at mZo]=A^gpD at 7mnCCg"J%@V=)B'o;3s
+%.\I[k(ibE0!*1mMb8-2[<pE'p!$^@M7%2@)d88pI02-M"CTE`fCMb`)8l;i*\k\&tPi-u[o4'__2b\6KC`^P4X2W:8q!K`=d5MJ.
+%^em0[;e8,m=A2].b`dCBH;gRhP).i3`$`,nXXc[jQ"J\r--df5+g2V^[Hp0>$:!s!mRe3%F*$.]$fuN\S at j^>e>6F=P*Dl6/kLBK
+%QJ.'klJ!LR0D0b)WocWkJL%nGV"1TA%]9p'=U<NE=4jnW,`#0O]hOM`>lXJ!A9L+$APea=(4F%L/h?[6,G.I^at5WDTp\6+)QO03
+%c$C,C=eY at PioJ%r%HIHH>\fKP)!pWkc>aq7/9[BDeD/*ALQ4;f.+23%N2^W70VpXL9B8.u2<-s^LH6pNaqq/_`E0bZN]<[IO.Ku%
+%^Sl%1Goo,CW)7594IJ7s]G\0cOGJ4+Uo@<[a8D+b!6]<*eU/Y2\L"98,'DPo;K8Fd$Fn>;$!6jn/EScj3#=']3.]>J*`61d0\QiC
+%S;KjhREHsG'O.+SYJWsH9kL$W+pubnRYAZ;H8+A5epY[:+Y+p]7GqDe]om-aVb*m4dPVBbRI/"Bf2MmmjbR5igo*=^3(T1s[Y9^#
+%!fdkl!)4>"dX<^,FZn<\rTY6PrDMXs6W"M/U`-l;q2O2`JS[u2b/1J'Bt8gb&S>g]XgKa40X%`+P?JK;LoD9[EWV;OkuQ*cdWN.,
+%]l%_e0Qp=^ia)qsaiVZW]?@:Q,m;YqFX:1MkXT:mi*lmN=p"mAcV at Dk"I3`F6)%5j?[#'rf`R^Mg6 at 4bFP87&h*rW\Zq,QN\-Qoo
+%A/;P<f#WsZ=_pZa7T\m`"']d4.o=B4J5h\h=/%C!9hQq#Oup5ll)$;9gBQ"kN&#j)@XCO-bJ)>'4i7;>fLa at OOpOS@3=.*IiQJUG
+%T&uHR]=R7mXiAr$B#`u0THj5N^%%8I'B4A7gE2F/M=2Lb2fi?ReH45HRA1.mNC3 at K]o,aR(mJhS]]4Q*TIP!u_SEs*Y2)>P?:c)H
+%Q;8qCeb2ZnEWdVBVS?3:A at EMp)'*WQdI[aTRMg*GlZ^-MXn:l.hP;uu.oYjYZ!($P:N(sZ,<`UX.i_?iVSqSX10`A`3o:goDp=GS
+%1m)W43fU)8E#P7uT]j#NR&!*4h#O#5<r1Xl\E=&H at Pr2UP6slMEFWSHe3\sJXsE`qg/t]EiQS?nc6F+&b;sbooLJJ@/:SqNEpf!3
+%Tn>fh2jGFr6^;16aG8cl1S$@ab,\WY<,"%%3:6%i-N$n^a+pSCU'Lf:b#Ag at PDVp7ao(TnLTehf^]P(RlN at Cl5:JA>+bKf6L..%N
+%SAG`F=0 at iC/<#,GOY_kA.+E"S@^-1hSK%=YZ2 at 2E@C:<?1ne(bK5F3*]25taFTpN_bh'_2AhlEVJR:;b2<^EQZ.H9&H:2K^I'A9m
+%Su"cK6Sa+%23qN:L-WpqbkgI`b/@_IoL15k<J[1cbF<T8:*XtiKh-o_ATH'%JYiHa,SKX%_Ch at S)6 at j!!iT"<%hiS7WaX%iWWYB[
+%Xl:#a/uTeRemd^>]!!6uW^*!_mqk/aWM$bdl"2.L\5D0aeRSb(=)pVt-o/D-l<pc0.kBM9Z/8)5g>LZnU](fgU?Hk*<=`p0FJeJc
+%*9f#8+?eiuP1>_%bV[la\4+2'knB@>;oD2*Gm6(5lFkWH?$iE:`8Q7S:aLZK/p88#Jb4O3]kV%+.b`#?="0+_E%\]HZ!?U]RM&Yg
+%>KV!3Ug'i3E+cbI;O1ZF7*[30i)V.-j,0j3V]il\-i(g&<NLdQR<E>R2IMc7R]7\>qc^*eN89c17Q8m/oh:TBPd^A4X_cus:eCj:
+%q:1@@?&gA,_d<,E$DT(9K124AqHlS_1RJ`2]4WpNBXQ<qaUTENK+P==]6'fB)A(I"Xl>#NU:YUB=2k]?3_-k_6qSrMk'kF645q"G
+%N9%Iqp.TNNc6a)A9O!Z_;=]\a.?Zq^5Z%KNaV=QT)N:/!S5shH*Fmn<9"CEqE_dq5ZO41;+/ujudi4P+F]G.AibXSsE at TPg'R=(C
+%qKB%t at P@BMm_]Ikhi)H?I`Zth)Po at Y,8`a;1Z/g.kc=euU8dtI9spm<U5Ks;@#u`oHa!e&>4CUMUm[0N?9X[o9!6I^C-g+0RCd8!
+%8F/u&A!KYDeLaEhV;c6In at +Nk$=HXNRC;B8fe1>"Gu0c.NMMbjN?q30OZi4T;l$[8U;Y*Y.i9G(@Tt9LV&XDK+E?OAY4kJap]d'1
+%@FK6gYmaIWBk`8AY%W\+F7J+5A$BiDD7YiB=<,E)mY]iq:\5&T.7R;'`>FLq;2ik?*r:\@!&-D]rG*bLTS%d)HVIM!/Rla>,%KhU
+%!d)a]\DB9;(MQtdNPf'`U\!*$J`phC#d%/f)HLKErXaIMUgR&peWS?5CbUDW0UDnJLeP<(KF[(JQW)V.OWX5<;)_P/A$DhTo1=gG
+%;"mfm&Y?7/\s0qVE.u;a="$a_YMa%Qhd/d08kFUnO/0m2nVEk%<JQgsO;)O9LEm*9SU]>taM>F/c1:e56&OLbl>mO^?kUgLEG#hJ
+%(`S<C8qmpGi[M"E-iJ_8X4H1gfJZeh9=R>Eq$q.Z$'ei40!-+^5/I_>0RP?4\g_4!D3u#`&d>UtbdUJd\ju$F:NRBpe^RM#nX6E&
+%_^?ba[K66uR8O[*]-+)E1)p]&2J`\-"Lkp.hFa6Y#/Hq\o\2<1SI\gX9ZG[5`g+[0PhhQ)88DJ_[jZ''=N=(,i]\gCL"gOna;`>N
+%M6\sdP*#T at Pd_?#jZY,==b48nUc9#tF+k/R8dR%W*F&fEB?`VgZ=DU#1&'<269eq\D:9ImYFUhf47n&Vl\>QlhF/AWcp@@efk;1j
+%^_21?7.0HM-M+;VLZu7mI9?(E5/?CO8Sg4"gK]]sTt)nq;(9-:)P at Y:e0lOtSF0N:@/L9<8p#l6?#^`Z,7DZ184?JlaC?o-3cdL0
+%MMGYW]6*$Ee&)91Eao<S_HZNY4iNt2S]W>T]53lPF,GSghXhmf-d:p8Y`2WHWeGQ:h,4<mW!NbE^OHnKeUq^r1`l*7M=JU at 1<e/*
+%_N9-mOV%XNhk!S8^aIhoZ?[0RJQkI2/JHte.[``4Fc6:aOjJY^2aDmNkp_Y$Z:+l[n7^n8[PF/6;]19X-JKL3_6nG,GV-:h8,#oI
+%ih$&mCO>GDj!1sE'Z(S\!'3Qk!, at sZZ,7&6mjlQ-B[gjqbbpkDcS;9EBNn0O_];0e;'q-qHK&jC2IW2&P\WE[<I&q9Ua#5 at GpMU0
+%CIKfJ:#nL#$aBc_TlM$plA]&>U^\l=deLJdh00cIf=n%3K.;j^(^iB5JbJiQkKuIT]oLV"@RmZiSl5J_^]A;RR[L0)'A;-N at +00?
+%@=@1"OIZrb?Ei>nh%+41K:9T'.n;X7fHu[nC>@<H-T4p!o'k"kJ#OZ5BZ"g[A3qA-$K4/t:D6<e/%(]Eo<RR+31$0.S]>]dQ5?3B
+%@g00\r"5^(YVI(0K!afk((a_d42`2F([K!i"_s)5Fut at pTQ9d!\MeKj7i->!E6[-O,!k;;=Qt$rOS+N0Hgs!/]u5qQ`%iYpTgt=<
+%>kNKO=31-oTc(A2jqdJYACls#<9End*q99\hn at H?4[r5*cs>;pZ,\>Ce at ea!!FGtTneC4cQmq2A=Ak,-dMR.p'Cnq/c]tDA-^Cre
+%O+N9HD^X5f]T^j46E*k5-RRE"_;\JH[I at 9goOg,E??],gf[NKJ`D+dA3o4S!k$"p39m`nPaD$[;8S[`.krL,IFk;:qV0U+86,@=h
+%alh+.1R`dP$p2^ofW at gqB:-U<L39"W?>',5kWFdCW8`7t<H&C39;^R+e!EP[,Z3nZ(.]@M[nS#lnbOVW$&M.T(7(6JQ`:ML#-G/f
+%`/tHhB):^?k+LK41e)jK>,P^0fK&3kn at ZfVHblY+]\1YhVP!J2(3TNm53HXKQhJ($?q_8l/'Ml`-$[ch3Gjsh&3Gp"?'1dD!fq8S
+%S_)Y>8DEsb7'b>rDLk\Nm`7IB"K4B?P-bqb/d_KJfgD:I]gcVe*(@!-#@52-[f!FOd at 5DeaeKeDQ1_`*N?ug9k[tNERUH7368S(H
+%adp5r$b^K]jsdA3-US;<!d!M;.L!;Yl\l*'TN$EobN=Y?Y$0%(1-e1OBmTG?Zf"!o\3g6q5JUN/o_8X4hWZ.E3Q]+F9S9:F/Hqid
+%FMU"l$ZK(+IYV]X9h!>Z2["[eoLmmg=A\CW$]]8d8$;SR@<4d;3*U8KGN at pFiE:^@2+tdhbLP<j&WGFEW^\S%!BD$LF.+`Th;uYX
+%a<>7i#'e,,9LaO>UIe,$a_\A<B]N6F>GDnS0RarDfsA2JHee>l&hg!OP3BgkE5RUMC364&Z,;kT;mctbd*8\MaE/RCbup:XOhYP8
+%Y9G at G!.gX>AB%:&G5*315rXR7l4j'q0*]Ho*4I`;a\T,W80:XJV?e4G2*>:K8gjK'!uI$V_PQsCkf#+0Z]Dn*6L#?K/$6#rc(ZGL
+%QQ,M!WrRsM!_#cKWN2s(deJ[d>fhCpU#)6L#>4U[&b]*=U<-pg<>\AE9\[*6,)B5/G&8=p'V+QN?&50hoBfuB=f.4i[]8E5*J(n1
+%C:>GW^]saRBcdWKO8t);)Rd5r7YDmPQg5EJA;Zp-M7!\6L'q)C63/q??Y]&K>MWb)$j+#8!#!fJJnZ9D>=p3,EchjL;a42jn5J3q
+%N$7cW>h'l0qUJi'$VpN:'^<=#.d+ojogqUK0Bn_$lr/h at D-Cg[.cbHS\n+YH-\%?_H:gYlRMi=e6nrCo5$-_969D_j1Jlo]pDqm!
+%1"sS9Chn#'[h^Ehk=;C=jMo]@P@^6iaAo7n;c0W>`J*5a5[16r?2%BZ*q;E9EPn*:2l1$];H!(D/_cDIc(8!33%RL+qZpBO2Wln:
+%=Yr4$0U-E&-JPM,[C4Xkq(`#GTHuT6rU$,Tc=2WZEF.,P4mnf";_cRGKj!'="[/rY8<"G]ZtU^qr]9Xi1`aZ?lk^<`UeHL0,#8Oh
+%Os'YW2>'8BUcp7a1*.t..,c^rk":q9=a?OU-fc-0j]Ra,&Jtrg6$A>I6B'FX.kV#A)R3#d3S#Eea#9h7MYe`kRN:OhODUmmm;Zm$
+%%a`@q^A4mJE64QU=tO>u_]#gBWYW*u:XfqQo"jFSlm*n`(\SG&A\)^WPUUgl^l806Uh at 5pMec)5pQuAt*k_SI%W[lB(?=]ZeCKa]
+%3Po_D8u!on(`^jAbM=teUcBb2S`lH:HYYVg3rNk325cNu2@'pf<#ulMljGqlAg6*0=A$Th;G%+#Hk1BUTKQap;0h7$fnR.$[Y0)T
+%QP6P,;DU>CQ&a!T48+B(O;'cU0V`i+8r=W(s5Z9rL5AC<1fl</ZDU"jU$CPYqN't]TmC8o.F.3POXV,H>3%$(q_fR<Df1F,UuFk#
+%e'dBE;ISRsoKZk,IZMA:j"+j:2(/eo/`c>AI/:2e_Mm(/W?]X/quLLmVEo0e>KX%Fp#4$G&-go&"'<n>$\YFuV=#oZI#(_Uauj5V
+%MTZVV'JugMQ#+LfFa=C[nrued08 at L&KHX9;hStbdSpJ5(OD1r_Nuhid\7X\>%NgIiSiS8A_9/BR`.aenck'>'8=CL65;'1::>t!:
+%jlm^.F1(bdkboAubfjD3("ZFPjj.-W=uE3&^<$rA0h&B9/e6ru9PcblT]2;K]pM@]842\f#b[-L?As;p)kb6rrZ8i[Go,F'db8q!
+%I*/i\.19+45,eitCLab(SUMb97?3'#/%(S01g)cP)TNhfJX(QrFIsB70i80]_>';_%tI^f?O,[l&qO.o>d2E<0#(UMHlJJ(G)mlo
+%W4%_Z-n_HgZ:OW:pJB?2%4;=f;i20D%/Ef@<]UYlor99r]U15hlnZ%YnMU!i?;pc8Zm7a?&$c$>2Ecma_.20#8pTO!BV&4k]GdjM
+%'kCL'Q[m5l1cc.R3J'mSb)m,A?rE>1mUWeLEeb(Q'\"OF3e*DHC_lpAh3hl--GLbR]tj]?Jd,N6N8d-#ojiT%i>IE\cH8%VfQF`O
+%3&s9!/2#UZeAtRYVj&r@;kQps"t5Mg^ih3B<[%on_[gb;\_P13HH"`;/P/W(=)\!P0QSFj)T8e:EVV/8Pc3\<DA`bQ7Ui[Q!=#+N
+%^>#-UN-)IKNurIL&9Urm'h8<n.Y?n&AUB<"ar at +#JZ`"YYZ/Y%[76K46Z5.;e'h!bPDI30Glb3rku4bZ8S+#32<i,W98]$(:j8SS
+%[emEBA:V$&bl_JVIpY"1W>X*$XDC<82O'MLUkP7[,Jo8%O[Yjj*.]5ZZ\IQ&e>T,#RZeU%B_p#u;ValK8mD6[as34>TOrqkTH'p!
+%EXWHP5sJAXcMr$CX<"QD$^km0MoilX^o!/hWAHb>Qd[>_1(%f(F;Ym&UW"ZZ]I9J=a;T-/%bfP;$X(S%Cdtq/LSpP2NG,^<MlBla
+%:5SbiYlM]UgrafF"6f"mi\>=jP3t/Ap;T)b8a*3tNIo=PSE<M*k*35o7+Zs[d#r:Hj;758(('8nb_;MR?82f"\@+%H+`57(h+1S:
+%<*VmTDGYk"J3)GBLdoJP6AZamAF!SVJbIWp-F7:?THsX]!%nn'5T4`##n]q?Q;mT-N1E at 8YV8OM/Tf[>?d2.9e96EhYcPA$nC>.$
+%mBEUifBu'aLmM)a?*D9c#6kGA$O%`"0s9XQ.lF91Cl*$k`iBun[=I.bbc(sdF5^*R-RklPI8\]_geB]-jclL5.26q[gN#o at TMmO[
+%@pOk*\8e?5FA?Pr;"MQ%WjEM6 at 4>S:]n8`Ej6/p^Xs*`'`g^lTB8S77pQBBTjVEn]Z8Z_JrKoaj.VMgT/"F_QfTq1eTo78M'/bfS
+%U87.X=8<?QJnh?b(WF>")Yhk$2Z5eg;^od]SSfblG]R!LGLHS`lqlM!BA#?n@:CJ6YleSoeseP1Lc(->cb5J&4OlV.*R?DHD_X.g
+%Ha53$)H5:3f/Sl,eejtGLo^fl5j")gacW+]N6<4ZMhAScoK[WeagtgFq39?%a+I6 at f$,)BSW+0J394cfk=/7=eJi!;T_;A1m:SiP
+%Z<8pKaVMDPbGB3QO'k4=8MLfa>,8,<@&6$o(C!FrfaQrRr"0X\S+/rkE5G2F=^(qIOt2cg[dP::%>g$+][tbU$Yi?F!<Ama[d/Y7
+%gnmbHB$\BjRnW]YN+B<_nGd+e)[%;Hkp(D\9nHiL/HFa`7raTso,K,tdI]t"OL_Yg_/&g5qeY`MN4p,8;&2pZTX1*N"!QE$e>0tl
+%RI63s0UK).&DH5BO?pg1Qol^-CLM9u]iV!P,EBO=`E;riYl?5)Hc4i/b:+bkr#kS2,7Z,r&`Or at H;B7 at BBsA*,YA__;uNrU$;3n"
+%A."L,b["TI`]aI(e(&!Pi.4]jCUQe+li7bQIR[mZB]+C3;][D1C@!3OSc[k+gIQVA2eS40We5C&cE"tEaeV%FiW)%I+JO.iY;94s
+%Mf5uKIZa^V[<slR$^-%93gRPpZ%WUkig#67iWmF$KR#=h5%,/fob<`"A)]5h"cfoV]X".Ik\V.?;bL4u9uU/q6ie/<*4inm[SMHK
+%/1`kSIihRfj,Q3iR*!J)(Ec/@Vq0K-^4Ml,^@?*n8q]sZA15I3p[B)8NnVSUKdHdWP'B?'VpZ+a'N'JR-Q*,l?0'!S_6`\g2c:>.
+%-+7ofA.VhMUYAP%-l!>JGI=#(Q0Wj]`_?"ra'Q:O,`=CaQ6g>hmZ`SZH>FcEQ(V31Ns0O>)Z<d/0nVV,]"*@[9'2QicKYEu_."Z]
+%>$P#YWm&YVV"QMcVTL=2Uno^P>BWUAQohe%b'J at jV,D[+Mn</L%d7EBk#Fp2LklB</;s0gC>%Z_M0I<V>-(eIGuZ)G4MF:53R#Q,
+%8s=WT^!($Y78"T"86ZJobMS+I-Xo"XmMud[*!iLMR!6NYM"3(P4-m;=]<cU?l:G?5/#h^`rB6a7+]7]pSFb$<,bTY>PY9(\P"']-
+%#1TB6ZWuI@:!.hMDFu3 at ms6lA3@3d#XRYiAQsJW<1?jGSln&A`p?6&o(>^kD#n5YKB/tb,CV6qWa=P]sparWa=JTXnE**t]6CBrK
+%hZ>+YKo@"liSGFYlX;%rE(PnCoKBtEd%.93iYSYEWu8`lTcb_;';sau,6q3Z9"\cFDpF<Z'`j_0)&E-$Vc<G,/J3791*MW4$:!c2
+%VfI!FC3t#)#X%#Q;2A0JUI[`(h;(=-JhHMSjWI=cO!4dZB6aS.#[=U(#XQ+51(^(*_Lrl&$TB(*q7.m0djPW518_PAYA`Yb?i6!l
+%/Ca)PI#K5e#D_W)+U7sZKG*_<5Q/Ji^if3Dam6\`Iibci-fNKumCs)P_*@MRl"p!6H2._AJ)lF):]==*KjVUWSgfEaZ0R&R7HLXf
+%;AZg-I at V&c.."O8`FR"qL3.rr at OBuM<t\iINbA_JH],fPhjg3O7>up14-FMGK2>9po9n;NJS[C2o">Lp$8G7N0.=%Q!F_H[>a;V/
+%*BQZo4Ci([A6jnm[ZJ$&ia'"<QJ%c^ZnBH\_8.9Ijl,ZK%H$A*\?0#Qa$.2Ml;'YCeCE)bpHSZJX3\o,Vsh1p6LG$V7\0L+g,kag
+%m+-%,aBgp/\_2oM"fHo8I?"')#A_)a%;mF4e(6rjRVu/K`l%,djY\Yg_i!`A4td'?YfHJOh:)ph&8dE$`bKSUG[/Ch(T[$plRX4>
+%&\!Du?02grhhP25rh8L]I/`h0T"fdQa/'QU#dm0$1KHLSj)l_!2]<pmlD[`2SE(:B,H0(5,;lgj>lAH at BBI[h.sdi0B$=l"p_N2,
+%Gh#Bt.ibJnb)$]TbfboE!jWN9b0h9m`b\*b at CJa5X:gU2GBU\+Dt'3K>Mo&"QX7Au6$]?:Y$SjB1G?N:dcYLr;7<'#pL!pTo,"$n
+%p*s%KO at W:,WV9P*MMq.5@/`Os:^/06n"h5;\2T"H>44#9iaq/B8,r1hs*=60LL6K.)i)XM[O]'61GVVA98fB#:/&o^r8b'CKM_O0
+%V;po?e*oK-h;r^k]JNpLcOBW\>8Qo,.U?sCB+'d0Wa%Z].2`a\j6=!qp>#3$bqEp_Bm3dlk0L72ooUmT^C?UWINA0SY*nMH2Vrd?
+%rUU<%7q=eqC'1+L1XM/#`X9$DBNQ1&Fs+NN2_^SVMi1/VLp=_O'G?iUm&25RO4d-qI9cVYBC?/N0:nTd";ZKrflI%no1Rj3;HbTX
+%BL`Ri^rk?KBI7FuDn<>3lkfQZp/-$<hnPCeSq_t_0l$So3#eOF#B2jlT6HU*%eNs`/o0-?Vo`MpP<0?>jY[jPCIV%M:E]ID[B+IZ
+%Cskmo at 6@bGAPQV:R1=\-F[_QkkcX:gBZ(0F1P2OVk&%e5+E[!,E-%),D at s)'Qg*!qc)q-W7Xo9hEN/ZZ6,'..W_`0:!ltG=BGig7
+%6H:Cgj9'o4PM_qOZ-D6?aq]_>$cKfk:s8j'Di`,W]Wp8`osWsl[Qc.]^:GP.,HP/Zm`\_t)Af<qTGNsk9;&fceHC-Z@,IDYqn#'A
+%s7mFho9u52K9u.\VV3U'B]I;f[YBs5S.#[Wh2K=3[SWHAWKjrtOg5*Xo:hXnC;e4W?$C;Yl7&s8VoE185Prp$f#?nEc7TmkXc0Mg
+%Z?I4'#F/"*b<D7,d:Pf"l-rgOKY-Cl1frsWagJ=AF!,:#p6-(DqDgF62(Z;ib%>2=8#tfB4D03L:ijK,QIc&"c]$?9E&*$lEt'md
+%n7$)SW(a9eD[AS7+^8$O\Q$_U!Fo"7:6D`:"AGS,n1b4#8R#eM^-8nibDo!MMIe>.nE'IYg66*M:Q:P8X(NXc"g,1j&Z"k+eB!OI
+%TA]+ZXALRd]X$".9A`dLk8.34rH&nbReg>-FfY/PQ0K0kA(uQ*DA3>F:]J-Oc=1".W1"M,?`ohuN>ZmW4oMME\^QIpis=*HcWnJ'
+%"N9%#)6r0bK"Z<Og*fa6qF*#\6*l"c\.i2JXfVpJ_.RZX2d$7$du+;s5?_FXZXk,'Q>"ru=HqfRP78[.m>5gf42Ng9>\ke.2PF%M
+%.4s9On'a.\k3L%2Y;645"`Y1'fu9HYJK$6X+o@/iD?q*d0t"_>CJ-.72GA(-);Qa\bDR=N.s+n#+)T#+<=7Wt?rpZlkSJjR2qV9n
+%e/3BRQ-I#e*AKVD"BcQ[iAb_n*%DPkgU.ccU;HB(OIIt.+a=s!Z<nU-qTC:"'ECQ\@lJ8^o+ at d,V-DNV<VAM8ZFkNE2dUKb)OD8D
+%/[7BUrT-6=FVch;bBn[8+nK#98]L*%DP^QEHK$gpCsZ,-S+e7+:g^\FI+ZK%n.SS[I/<8dT6oP,V%5fbfurFsEd#FU<O6F1$Wp\R
+%L5NJq]!))45'5 at NRJ0b.<pH`[AZ0d]haYSI+j=OD-Q.kLCKFd^9*RmbK9c5CR<2n^<fC2J;m]Np;V7,oOA%.sg0D?cM3KS,[fiWs
+%)ZVA=iC,K;1.'_TYtJ=7)CcJ33V,.s,gd*XZOpdLhrt&\;qNcN at 2hWVL`Y9I0PZ7r:Y&$pMRCfa&3-!L/+ir4f;:p4$<],1VkYgc
+%Y at l)1/qFV#h)h^V8>37$UR%jFnLd>)*>t0,M5a6CCo>HAj42g<$oW6%;'W?kEUCEf,ir"maC7&EVnh1+,6Lq!'Uu\YD&K0$C+M^B
+%FHj2_2VTq+=p<]6WXSTGG&]=kQW%DMpga"0.VWS*F]@mp4AO`QPmhjHRo?q+>_iFoZiP%gRs^+JY*bfdm*u$t_OT*?Ajgf6kV7BI
+%]6H79c`e?an+TO/IN>3_QB)##o"K8hA]%?)n27KD<M$AGWVtP/Y;IZ)gCQjWEOUY[cpH9s]]Ll%EHn#/_l<UGCG0OMVjpU$WMX/$
+%C7fJ.oX[Mg*:q>1Z6q,V]SS?\JBehnjrhW<_-)*4P6$us0"cPrFa`$M0]np25UnZ=8[/4u";:TB"@B:O"jbq*r_V><.N'G:nU4!o
+%N+ at L&aUIe=cNT)@ESFXt$%&`H=)N*5/j+E<-PuB2$"gf&Ea]*3.ub$md#OLBMn@)bT"LX842itXd,).['P(_:UR$n_mUV")%1=fG
+%h1h?!_r.f3]/pd'g5-qF9tcE"%4Si:$:43"^ZK!>n/;Q:XZT&lU.N1LQFV9RMtTjP@!Q?E))QF0e0;a0PH&QEkDQS^@So-M"-kg1
+%2ddNlSuq!qELRY=4L(H:l;Lf.6>/8eZp`-)H)*80dM%>YCdNMam*-jT&9^VY<*V!X],fCuRk7i1qJYm<J%X]bZbL2IB(Y]7^^E"m
+%q.bZ++&m/a>RQ)jrLVi(Xa7<2!tCgS'Xd(A/tW=60:pq1n\i)]lm9a0BX_K;&t#7/rUm)Y/mgGP"[B]1(l[Oo-7%e4>n4*nOd4X:
+%_qYBT=II:sXbge^_03)5(>GdLF$>MM[LZ<XFFd-A/tUA5ZT^W#pfq`PZ@)YWT<-[_jN<u%YaH4jq;U)0c(u%unmfUEXS_+E=(ctm
+%7?mZTadJu/648lU6j;`5pVr>Z_gf+':Q3DiY*5gXFC[-;Cq$j4i6RrqY1%N*&N>4dA\Fsm7N%eDVbsgP]b,\+kYh$Rl]lrf3!c%a
+%&W%l=fQ+1LUnYni=M4V-m.b_jWD9.IO)d;[RHIqfFmll-?@Dg<QS)(4IR]=5NhF8RU.)"d[9FPFE(1;2rUKB4<,%Fq#Z45!%_hBN
+%IFR"62EPMk-\@)j3/u>5K"u'4GoXXnJuZV0fSbT1hW$8 at Om9f42Nnq/mIAp#s+C!M'0Ib?!=!HY"DQ6;Ie$Y;eshN-C#N?RAac8k
+%$e5DrFM&c2\D<<lHn1#Fs80t<=p+@;d`Ib1$HflN%(U3PI?*7c at _.`H)V'MD8T_38DuB9sl$fJddMh]IrcNnG78lAJ<e31opsd!(
+%f3\2=cb4YtKcbU9l0!Qej]B`j85DEbpgAN]Dh\hSAa"i<Y1bLjr98,!+uq0ZKUPq9D8W<+Deii?0`WnJNQ#CCF38sBJ>!N$XarF+
+%9uDbUIj)MZ`L74e\3_fP^$hGJQS<H=2='Z#Far/](T[)Gch]3qlFtrXId/9kO*:N$&#]3h4GU7\%M-kQ9u$7SEc0KSK:DXfRsK[U
+%pjno\JZhikYWhm>,SN89HP0-0p:)6td)G]rV(p4T8oO0H0$GS:0GW`MFRLMp@<CE7QVk>\UXMO]HXEeB*4<5f"G=BI8#*g7aNL]D
+%,mVK.\rXE?:StALf6l2Sqjh#q_A,,ICrN.<LP_)pa;7j%<YO4SjL6]eW9liiI".F+84cQoJ3(@tlpmsbUKk2sgTZUK!d&F0<*::9
+%%Jpjpka?"D"0 at D<7qk<H53fGEb[?jjA:;PtXtH(!l@`7u$=TcElU#q`YS"a-,'ifdJA?i?[C[\EE`BCH-emTB+H;t]NlHcr at T<%L
+%D_>>hSm5oG%GQd33NP6fkd\'/P.p6kc,t>:#K(H!P<!IQD8L)@mFEoAiTc(.1g5`)lTeQGq65q!Pfi3uR"^W#V1QHX"H8Hscc$IQ
+%OqCIRM5XbuQ%1<"LE+tDU3,p&,n<@AFj5HV(!IRT`O]/letM/g6'ptL!mA5NG)a&gf&[NLSJ(P<'87Jf&.%g4<)WS,N.K%dBpH?W
+%!.2,k6Rb`9$j6;<'mFDO]A2n]9.dZ"UG#)Re\s/m$u#8ICc(#$Fg1p6<TecPFu,`6 at CNEHY@6%R>qEkG3qcF8]mjK3-]V?h.Q=m_
+%oG(GC\m>P&<t&-ASRIM4:c/bEdK.N.p=?lf(KlO[M(8ub&BNN"6=LE]H7Ct!c%<*VVm6c>E\cun4IO*)?P?b`DRXf"%VKQk2;Y&L
+%Zn8.mj*,7*@p_o.AC4GD9P."Q_5,>'>8*EtOqF'i1E>IfPc`/,'$IH3npuT9)mou:rbt:0RfSLT$O+BB\ld*@BW>=4DT7khm.N<o
+%2=,L!Q`G(Jb&JXg.[$7Cra*aE%0`90Pe_JjC];#njCC[!BQAjb,D^p1TsTh(bse*Kq7S,fbfOG7esM&!6uB_hT=-9$-B_ at Kf!R::
+%K$i2K]5aIZB&@44L>?b5 at L:>GdJbBV%W9H<r_Z,ak.ZdfKb]Ho5[HnD[EKe4G!n#q,4eH=j(6_^M/U%r*J>7W_m]!_`G5r?@P).]
+%dIbV*Z*8p19 at Z5mAiuL!Z>UC__eur,\IM]=Mujb)V%ld$%>diZ:5XT&L5Eq"\e]?*q(M-Do9O*3'4bj=VoB5.^FO4$ZmUc$:53WA
+%<4G`d5U2R=DE'+P4Iq:?)g4$/b[K26$*RdH>J"-qX%2B,^;t?M4NDI%%*-Wa)`Q&[HsPkmhY)]cnC64HYaeMhea#+EkL2Y\=hT:%
+%Z at M3lbHnZK)E@).>pQNS;)_p8*m.?S%_>gb+B'iL1uDf:]Rm[/6)eu3j8_`i-2:MYq#VVFSjE>GO"il\nX"9gBsC_`o6W%T6JK+*
+%6.+C0e596(-*T-5M.2ahF,?sOE2\ki)[Vetd0sbMYuehI<N1[R$rIgoZ$-n:j-'G*d);%,.QCLX`mFZ>"<m>:3o^55/8jQb`[WP&
+%Cso`'1DW<Dj-5"Rp1e%j at L"EEeC"a0/?3jGOe5GpQO;m-$H0s\VTaOar,Rk=#c09'aLm*j6B:mh`%&eO1lk1a/Q8o*k;HC5Yb;eR
+%B\/=Vg`Ul">iG0S:o1_,0i3\kd1[GHPVG*,=5u5<l=+Hl^W0UgX"<<i_IS"S5$8%8FDt<k:Th];9h,"YN-%-`2X3>Vb%jnj-EAn5
+%[hY#kDH8Uq\l#0lGB.D=`Jif!9NArt>kmNI>og$(b2,V-^1R5^H>>fKp4&#;P?f-5H?RL&o&Ke:7b*^7a68QcRFPEBm>,QUj4[k3
+%XbJ3o#Zg/O#-m1Iii3.sW6>Uj(38[)'02Z5O)ZCbNP*t#>.Cr+f_L\&k_XH`Y>6.<S%TYr(P at 7c+M!YdaS6)OLHk%.ZVVf7;m5q/
+%:XC'FVLbfqaKp!ZB5 at BU)*!U*Q]u"=N:4Xe4F&.Ql)Qe/6VU$dHH<RQ[I)gs at 74m_Wg2B$h]Hj`[*SAH&K`t&_ia=F=_97kIOA&J
+%rb@/I at 7tLX..-W.^+1_ at c3FP;>"$_lVnc0o'=sr>#E;:$\/q"SU#dC%!o[M"7ls\o<BA(\-CIcl3pgDt.FuG+Xnp"iRj$GRi"EEY
+%WqKoLg*+3VRu=0gVuSG>W.7S'q6.$-NC[94Pn7%f2.8LjV[PAUkl0VWI>[4V3>+^3#io[O6<GPCq at j$.\6/9mick@%@q_?+?MY^-
+%O>N*q,OLc%Qj'#7<$h$4*nArjeX;\%C*t0%UW8\Tg'Xe")]_qb<-RR>K!ioOgK<A_)Gl`_I1o)oHZUfA$+4<dd)Hi6':Fd-O[$f.
+%<*df9Ti3_ at j3_^)ai+A at U@K]$RDE2K1R%""H%/Im.cmI]P1A6UVBEX<91h!iO at BqQ*YX[#FMH1tr"q)I`YYfT=n@%c6>TWu0Y7"K
+%b0,FXg5N6$*ci792D$rgKp?)Pke4ST:SXeAG/K?jFHQM,-ZrWH,H"?%3DT]5HNjqDi'O:u>Y8)=4q^a/,=aNUP=@#@n(#-h_;lb(
+%R7l,-_YJ#?V)W_npI)6P.:Ao(UfiA^U`r)c4".'j/3GL4iiVcH1X=ggIY:*V<*b+"_SMMbO:e/h1`Ft:N5<,i[C%m0:1cDAL"aLB
+%&QHa)8`Q\D/#i/m\HOCmbBlIAZAE(qNV;^).)NoAc]AWR-D5CO^5UnA`H<[VlWF\YQ*%mJc>(<8+[itT_.U]HT"/MiLLrs$e!Cc7
+%(m/YcQ7VOM)`:XaDNT57Kkkl6nGU!'m>>6fBfAg$[5b_O6;b27(%A%+N&1YE<67Zap&Ya[a:YFYes&nj+?V#gag,*f"T'0cNHdsd
+%P`8O,2 at 0D\V+XKlF754$(#S#G0n/E,'^h7e/-3YWHhX at r"'MBn)F5"lB[$URWV_,XCKIF^E1A<=AEsr-\n5f`C3k'DWC#7g(J>GD
+%1d/k=BaDei&\;)[oMQ]5f1jH=pV at CI\Jlmb/0gBNBp*?j:V+2TlVQZ/_p(og6KuSM\!8-;Te]KS!pN>kbo04TD-E^6I92LM&96Mu
+%!V8!Y4';P9N!s)A&,B%4-MR<NUE+4tn'ICA/U185J-,BhenL6^'=Kk at h,_KcToESOHMoFqN+qJ:"K5:>Y]mW6'Vg^jSHHXZ"=4a$
+%?"lZG$C#W"9=o?,oe#jfq1^>lol.SY1`_s4hA*L%##ok^0m#S_0k-WD?7j;M6rGfb`N"t?X)/H>OFU5Lk2I!J_ssmEfr>3ekRXTF
+%9;>)-:3UM43V1M\S-C\\h]I/K#:)j"Wn(_=$*+80Sgdg8CD2ef;atq[]L6N_Qg^1(TH,jgW1\4465uh#picL2M&YiD-mM7*<H\^.
+%W"6a'+g>Ip9Hls<8/j'I!S&c$B5N;3J4'g0l<c8fdW6[Pig.7k*j9lI:%geUg1Ig=m;pW%,Ya$;G<Rj.&WmnE[\C#Y4![[/^)jAS
+%QSsInUtYo$Ff'.1:['*K)V<c-nOV8c4<uNKL#03V[E=VA3t]qKB^[1(gN5(mu/Bpr+ at Hb1g#b8'osn"8>\AomK_.$-!*4b5,B
+%Q8bRO[o8uZ8`)R2!l[VW7^Eu5m`0*C!m,-S!3epU?9+0iY:79NY<AbpY2/NH/M_m87BfYlhNibI"o:m.(<,Rnm*2mgTn3W[C:A at G
+%`aYp;q^\2=S(YOQ&^?\DWnNFVR(H`SS%UJ/A-S$n%M1/h5@:I+/ofuW,+3d8Pk#L79U$r5+1jM9*3lqu"?JE3cHYas_->YTmCOC=
+%+=VNt6E.[[Y[INg0`'J!%'r_6FlV-`Q at 5.UT,C-)]WpnQ@;Q-f&heBnbq?(jM4`U+KQ'9?0e#3e6='s,g6q>=Ao?It0fmWVhhL_=
+%kNW,irNM[W:H\[G^%V")cb452nW`#;^`&@p895*+";B0:LrVkM*OS[mg=\)0)#*=%QW/2tK6\.0 at N5LWj-H28ZJ<87.374T"Ta/r
+%+ql(ar`HF&7L4=]eeM=bgH(&CKFY&#MJ4g'FS()-@$"+;&mRai'g+,t;6M"K28$1g<RN!%+\r-LQ121(M^3W#II"U4qkQ+mFYXLN
+%.$dpP'_b<FrBQpPk-eb.k/cm&!f+81[j at WM$98NVYo"k1>M4odG9Z3aUcmf%!+tJm=(s1K.RId-EkS?og=u6EKB*b&HUY;[b2Nk'
+%9e#bafVE0o`;V#bkHRV(BZN0IGfHLPUF27"]&HIb)nRq3C'4UUH81,NjLbaB#KVL'0o_b+dBB#d<")HEHUK>tX3 at qqC)`@6/<hao
+%F:QPtgbf:DV*^Fm,AI?iUGoAOQ+^^=<7&f$_(.1rgHbW4Pc):i#i]O[*@.>CXDpG&!3rYWEP<ihoFc!W]p70qA06CR!\7Yf\6o]'
+%+LFqA0':Kr?86"Ma2u%/J#A/5P^Tb+qu at RoF0.d@P?kR#fd.dGDfj%&fe,-)',>@RIdbHn+oobJc&1n-eO<'m<Q\`(\EFEIYn7CC
+%UoIkQj2(7SNA1j.gRC**;+kn$%Y^dU`Z;!U\;#<EA&0u?,mWTF.'KsZKB,AJ#5H80Bq"G#IH4)MoP>bjA9'YF)/@[7-83)^j;HJ2
+%1@,+HP8O#r_\?kEKM;a+jF-mm?5AaR,[*'_Y3`#o'!'0G`4"TJ8^Pp?;TC(fNUa4Z\W`e\<%CnVgGfW<BuV3Y6p-/,1Hf'!W at CY_
+%>4\Hn,F/cNH\]D&:uL"g(+XJ+P#]NF&DKeQ8RD7DHQ+cHX4`@g at am;WKV_eS]%&,#&W/G5gWu9KW>M2Vn5u0])I!eF4-+uQi(0Ra
+%T<J<Jbns81&R2 at TCt63UH3RsQMj-_E:+*Xdqli3RD9HE'9$HK?JIrBi#apDJ2&i6c-ilda:PEk*#&#hA-'s6`9;Jf]Z$eSjG.+T[
+%RZ"D\ifQePmMaDD#>L?V3M!O&5k\It<XG at kJpB*i,6s%c6m4\PXJMhu(K(kVjJh.05ap^"pa`Pm,Zb7?_.LC`A`I1sr,u;bB8!jh
+%*h.Nd;9]jl1i*`0\1[<Y1mO%]?1:7=npLY)D,thek5G'GaGVd98iQTY+tL2>J^qd.U:0W."6;!6%!>LLHtZ"!+R?0Pa at NHl-e!C;
+%OY#o<V906iW-g at O`R:5-WG0B4JRY[XaGsg-H:1H"FU=\Vk\+h(Q$fIM8e3SAlEnW1U1aeXR2RH_^`cFC9"AhVmh]f4ae+EPjj.Zi
+%5KBXa'1KXj8Tp%.5[@7m93R1VXLWGHAB.2V-\Y"&Eq072o][sN8&iBH;j$u9IU&mF(9.Q#CQqE/C?OTI>NUl$$(q<3XfG&Dg^'rB
+%5HtVf6<=1DF=*!.GSFjQjo2d\\o9:GZ?6e/J5T\GH9maUG#_1H/I<+?Tb$=)^`F\bGIoZ1LmUAcB#lduFb`oJnA3I5Odr+Zk=XD`
+%TkK>.EC*NA)#8%<;J7EQFHc)C-*2Zs\0sm\<`1ot"Q5<GpNoK))kUOXN/<3(-dRHl(Be?XiPXZ(9hqg*X<bIt0[a-W11L`TJEi8"
+%bsdUbN33G^p(ic7CC/<\A57ETekr\+Q!Cf0,Q!*e3MJ56MJ1-sP8ds"XGfQiPUeY at 6"9@(ji9+ra+P at e(s>SZ+1S9d8YK%i"Pk#!
+%r_hHblZCkC:f3^a)..'_37WsBo^sIQ!@hsFVPpBUEP$j2#RJ.!'CEWX6XI$uEr9 at 4r@7C(l^D4E#30 at u@JVT[92P!kPl&`a<@;&<
+%Kfm3pU_1[J/L7pJ_Gj(eHAF=UN8b,`Q7 at 28MFY?^7H\Q(_>&g>)Qm=q>R^]97W<TT at PsfjX1$j8j"@p_O"45Ul&(m79t?(J at bC6`
+%lb4W#5S^Y'!_2TX!B06PC?>=Bak1QUC9L:!</fCFFVr/&"Zc>3#uGrZ&Tc,C at tfZtkn7!lVeaI-9=3_cV,7D!?P2Y-g(qPSXU;fg
+%,64*-//d at jTN36?H$$DN;-`O[Y:boUXS1$'"/*l8oW3Uc&;Hu:p`+X3L*<U^][%ne>Ol<NEu:2U*]+egY!q>U"_.h!!_*_:abaQ<
+%(2.V:1/8,kJUY(09[S.J0Y>/4XuO:#8X3gG6Wq*q8I"^\/MCGM4g/qYEmW:(e$<uDiIC+123VR at I#"%lNG9(oX7f"T-LL)Dd\;U!
+%/OcGm\ntSm"gI<d?pk45d/r)/3m'&!WA/9ArZ+_pf0D1:FJ`RN.^c-R:*#u$j9VKL(:%_r9q5L[J06r.g9c[m at rEKL,eO2pZ-[,[
+%5`<:=;D'e*r.O.+f/scDB_\Y9AFh)17SXR- at T;ug7=E$5'>/N4>!Bf*7RCa*\IW_I&?6r-PJTj=/Y+ at W$f^1*FWrPD_h\Y<6-;V]
+%K*dC;m$/MAa'*P)Dhd@@P\DDF.KMQ"Q97R2!;dC1Q+:%nm+#t_0h+I:4QXZ:P<2;o5oj<eMB*c73 at KmI6d!EBLUq_<X5/B1.%6j8
+%/Mn&(-f7lZIl+[s9)VT<YtdqYpaSNU;W59PRi=mjjI7.GjJ2U])HR'?cT"C3AAoe_P2SM2d1D;V9_#J_Q;^O+>20c:0(clBTI$)2
+%B@^\Q^hg`6M02CD^prUIXW%7:/'=/0'`P)efItn9dq-t1/39"QIbFuhfjQ43;aaR]=?O_h1.#-_$WU+]A5TdRe_F\(7qo>`Or7oT
+%0Q(]@ip$clK>8TYXDYnOEYFXiA^<n1mm;O2#pjSIb#<^m;pU[X&EKiO(+Fd7CJm]2o=.'uG6WX*hD$[:^NLo7CPD_`Jr!$C].<l0
+%p',#&BF3KNl(upCgd]H9NY5'ICn at Uf^12=J5`8Z6PC\JrcH]p?WA#g:ZY'ZX'5B$Ic(6NA*KsEB9>]DsBK>IG<R$NMmks0?Uu5TI
+%s-3"QGNT<O'LC7Zhn,KAb1&1/N]!o:i92CTYT"+(W.mUBY33o;_ at 9M[#VW-&gm5ZI9IiZJ1/Yd`GkE)a0HmnJM2`/$q,40im6ssu
+%VeQEK;rr+d?:j"YcZeBl[gasoWdhHG*n1.F1XKY_hDB"]7UKK-0'6X1Up^;.qjFdVBXoc?2l1b!d[!R\,hO1&3n0?R`NZb^:$7s#
+%mB.t"/_D1uTM7M\R<,QB(s$go,0^KJ:+b+;"A'2a"F)C at +4[japnTG"'@!%]\tKo"P4p\9S>Joda:iD!n>#NXfq+_&(*%(n[CBD@
+%1iPtkT&Gc;LT*@SR3&U_FA:H<X#q*6HJ04m*FGYN[kmmhN+JEsP%JW>1*Om\rCo0K($9Ta:6,s-O]P1_9_7k.4_R;XXi+>Lm6fes
+%4,i.7?:&ad9&;UTLdTUu9`B1HO[S<hB^c5<3Rlh at M,brVgCc8m>2J#"Jl8s+rYgofI*o0o[XhsXO\&M"W$ia];+if^&d.)k$@t3?
+%#bu;+GP6[PPL"^=D'p<CEZ)iHkdN"hJDrh at 1JpPcs4a7ad8n9[@4(ju1o"@d7V)NcYe\e,8/\FDSW;`&1H1Ih at iK/#>3$9)?BdQh
+%#g)1_9)+&5-X,4_HWQ5B'MKc2[JbFo+g>m]1P^Hr0_"TX5nmh:mVH<$Zr.c[""2L$p,Yd:)9S%?"(js3D4mT>a#Hi+Q;nKOM\;jS
+%,)puW3?#qm)T`I#95aWrKPm8;4Y2kO+&7g?e`p.4R.3adq^ehk+jiu%d"\\oK1e=[Xq!2?A(%`7,bVS#OE?TuI.pu)QIB$mq<>DH
+%i&sj.@@XDf9bs!?Qcg$YA`7ckmW4+tkeYLu3p'ACQ5^R"`i!RNP`"\F?Ho&t]]%.6,uc8CpaZ:FB+ddM>/!poUoK8>P)6H_'/sW\
+%..No@\WAjMdN`iCQAIL!"E_0kNPh#+KPC/sSZkoTkQlnfHU-*BkS()?U:"hNGRnS5Lq=M+;I?7[ZVVs-`oEB5^)0 at b'cCX/9MR-&
+%='soS>bAAIN-=2od<!gQH]/2=-P-ST+PAP5)'I3BWG7HU9m9^rL#f`]p9Y<jH"8Y2ojNGjE*nUA+ug;EjG,(OM^Y>TZ>C%S%#L\H
+%D\d+Dfcg#$VY(..WLAP\/*f^L9(5l]p_o-l1)QFE7&g=jPYmuMa91O,>L+['a&KaKNWr6OrP]2X&IV7;DFQJtd>IV:qo2jB2#P.b
+%A<.;s4VW)&g&UZ?iSdL`_jcF92\-=8*Z!Tp.(jOjGgh34VW$H-K>AL^K'ueaW(G2"6a\gnj?ed4R4#5]m5.&M^ccM^ZKRks4l1p0
+%2jcj"i].i]+:peBl[XO)&96>iCF8n\J'WOHo.PD(jdJ]V&;0?kl^:It<\ugo9.__7]#G/c2&-#$_o9Qa/Zt=7dJ"aKASV<0Pdo.D
+%W!)T.li,26gOaGinpX`=7XN*/W[)<eHD=F]$R5eT1RkF2h-YtZ;FdMGlsTFP/G8\MlWD?@hg1K_dPAN1/t&e/6OLYg&1;=F`EtW1
+%$]T6`ouI`lnuOIF&ZF30L6"D0M\:R`DogL_53Nh0mRWHsp]ua'^)Te[Dif%:(6bPG1")G@$`,RtRB6qJ7lZMVah6g?>$!ZcXJ\ct
+%.go7G,"!*A3`"`,%d//VbQJV#D_$dH*en<.(eJHeQG3kI(K_gD-mSAJb-fSb)qoPh3IjKc-%_`tB`3AIoO0VYYA#b$$s$*<<YCdR
+%QB6E;M]2/fLcs!@`u&'6i0$#2FjM^b(Yc`WqZ[jfD3IJR8)=1$R%n5N$_8RU1l]V``Bt33,pTItm^SLIfWgE,pK-8]>1G6lit.DO
+%6BoVZ at V/i6KRJO6-qR=bQIr2VaVpJ])E&7EBALEVhi at 6X8_0O.WuU*-X?0u*4YIQXL#i%4%^-?V"G8cboo'6b"o5nZp6Z9lm3VX.
+%OObAOYKF1%/eX&6;]n^Ve at s7[5'ieJBqHN%+Qn=jGXJ9C&=QqT=A\A38%)EM#sMh5Pe;/sTEZ-#i*?IRb/8OCf*GZgO"hKT#^4.(
+%kVakQ2BJ,r*U#jenAS\d&]HUW94p$f2=+<SU+2JK8B):</8K%)Z7;'8-K=;`F5i(eS;\G*eV3>7`)Bij1JsrQBj8EH.tBpJL_I*j
+%(:\$/+"C%selo0M\%6j@=btlb`K)*q:R2G_?Tf7</ZKMb>r?S7iFgl1Pu?ZO/D[L6<ZaN-9NB8=A(ilT$uQDrC%@8SNFO3Ud)Q>M
+%G)@eKXiagT33%ZrnbA+m8^YlrKq+ at g7EPtFK%1rcb>Na\F0uU2oW$=IUHtL(Rc[iTi<]rFh9*%t5N'FX$q=ki#Aq_kO6*s4:^7KG
+%qGtB9<'jZ$!:0^:bBl2uD3stpAnKfS$B'F$gscqodo4H at 3-^*0@;I2b$>*+9b<hJ3\cG9L?a=hm-NSqphW4a6E3lLAHH7+7>H+/q
+%NFoAF-8P;O'_p at cGVu>sQPt([at1^m!1k#Dem9jg"'["tH:'RK-Oq-s*_7N9SVE.TqZb6/@%lNAJDjEZ&)13\Bul_ToE'@$Lc\[>
+%8R0/tftOS?VA:;U%QJ'Rar\?47t;<oX"1i]Ymrtgg+J=Ae at CWJbKsP)<T[\;j[*<2i]*Jr$Th+2]!c2altG=+0g!Jg[%krj(A);J
+%:1c at .cH%opBFU0Xods\h<RU.hA;]?S/s5*7_pjt_'__mr'Yb.9 at _'C*f0PPMJMO_3H3N'Vl)QUZ!SN]FEFY^Ch_]_Pl=0S4e3X*h
+%EKm;:!`#ci%:dO/WGS/>1'+bE7Dk.Td?763RE5 at c)RRHn%;"9L;*P`"QQCBP;lGD$fBLlI-s383!o<'YFLM=",'GJ(SJ]&7]Of4r
+%W19-N]2b,[/TrXue_R/%p^j[]0^+XWM_b6%3kdSM`3AlY<1)WF;*8.o+S$n+DtKDZln1X6^/\j=XY*1PnRr!'MkR7Cnc9#h-NBlS
+%i=nQE8-e`7SLj/eBSC+ZTW5OKiJ<2Mm]QMI#5R&2L)Ds(jS1$ZlK9e<l2nguA(tjh_*eG3!%*ogT9AW at Q'm=tIYFUP.ouOb];$$^
+%$QEVCn-:+V^L<^s;JrTm*f.Ln2s,rO+q(, at SMh\7[(U-i\.JuTMD^H&R46mk5c:Uk3L5T+V?+"]]4h:f+dCA8-n5;qJREtE\.\1a
+%\t(T.BW)5J&;*rNlBMSbGgeH4d13F^^21sL27Pa5MHJfqW$%W$jjsAWDD+=la]%m32OD9hZhI at la=eA'oc=gOcH1Mm+peMT<07&.
+%4&nSQ?Fjmi$go,I(D;"/J`/Dl_rW!u1]>Vge^F&nDg4C98LobogSRdY8;+6omjF.;Bf.Q"h7-[(Fe"%%,AK.)qXtMuPbckE-G_O7
+%6.#tpcIBnp&)QkMaVmb"0::rks,h,!9[?E)dO9ua1R8Ms*SlO"!2VP3e9*:SA&tdA1c\@B_'.gl-0.k=\mi&LEBQ/lBiWXY1o#dV
+%RYqK1lWd4*eb,498IT^;N),(o+&-0P_bi+Jmo[D&Mh:>8FkL.?!5T=-B*A:j<o at A*rOK0n=I*[tCnnGp#].\'@@CXuec`D`L38.j
+%Y[=@bT\Y4='!`6sKrSU^HL=A%3i3j^!7o+NC.J(6+JbX?N*TQt*pKtsgjl?o)iB!T:V4WGC(B)/DoVoB0]g.sFB>UM4TfR%jD:1H
+%*Kdd?GScB^(IaBVNL3C40QZ^8erE<`8i[/Iqde;Mb)CIo.G)*s%sSb)K1Am7VSNi2/=,^c5'AeqLQato)CI"Z)uYGfp#92+,#r6K
+%@m\jOR:=t%URJ. at GCeA36EQD=:;Z5]Z,fG;o3Ie4'!LS!NE&HXI#-j?(-q,mZr)70h2"N=0P<5rI[;$:.RqU'l6_h+.Hi>-T)^kt
+%7YB(<meoSl]+QUW07=_b.3SF4QIFo;Zk, at ka>KKr7pKf]:3S78-J--K4o/X(^,urk0nE$$L(b%67AVd27j_u=Y*VqW,c at clX=K>p
+%)[JG7Ynt-uXFm.@#`\:=NJgS81?Onl3N_QhXHsB35n,C?QMjET;;=N at Tu&R7FD"+^K5BI65Gu$:apOB)J at CWmltB7N1"nd, at D,p&
+%*N8)0s#m(g<e'bf40SrENoW[af:"G/Y%*%Q.7sP,8abf%mnaXH&0Y%o4NmRmQfGdaMDI.=IH)?@/OMRCBc. at RKk9Tb&dEO.]\i3W
+%70!KkF'Sj()%<&h&_(QQ*uu>R)O2!AJUlW\R^*<n at AjL7lcP:I3T7g:o9&kCCqcrnQo-+X^;hZ9OW>:G-]a=m&Lep2V0iKa+CJh9
+%Oel@*8BI</UZ16QY^&Q_.S41D_MhEHp-!3o$uAm*<up`9c8!AV7\Y8sZa=#CHm,sJj$5fI/S/lD)l<q;aX>gW&`hN\R])DoV>"+2
+%bAVr2gi2e(c@])tQ5<]#f=!NnVrI%C1b$q at T6B0O9k'3[2eP:PEP3(PX<Y779&FT4Ebn=B3%2]&gQlf$\d6uP/4$6h.5*2b.c0kJ
+%UdHteA+PjPo0g4-:!m"`jopIT##Gr:o3^:BTkl'K2sXRV&K?'9i:MtB8?/K0,:9;gN8CpQ[hcc6kFY4c0$?Pp:J7QolVWGD[b?t-
+%kg)N,Wj*<\_&O[4P.0o(D$EO7#i'hS at r(22.QC**'pN/FhX+^laF3H_'(<\KNWg"M'k#-^/_3EPRDoHC-6Kb<9R(Ek!HdXs/5AcG
+%po^4t.oU*k&.3[C<aP?9iHV8FI-Q&"&>ZpqBnD7)?I6Vo=<`u'>2NrHY4QoMD7?fHj[+ckf%+]1.Zp2:5k)A:p<CPjcgNmoQuoE0
+%/5 at JE7s].oct1oKi?O<4H'YRpDXMb)JViqX1c_QEgM6?d^IGFPN,1eqZ)]USqlQ%/X0F%I2FDBW#gbdIW#\:>jOVsl:g2iY@"E30
+%(]IPge(Vg/\R4*/gG]#*cA\Id[DfFgQSh]VT(LI:AC0]2cG2cEDV_p9gMCJ0Q&7D9AEMEp89It+5YYR%q=KcfOFko5KE+YZi(0eP
+%=E@?R"PmhbH2GqR_;>%:H!7.!a!&.&BtA:nKY8L8"iF/fmn.unXIDt9nV!<&%oiTaP!8Xu5e"'t1jU.s<X2c]k#&>h=Mqi=<o*W/
+%Cq"^MPV!m93QBX!iW]Zm7$*IgYJoB`1:e7p)dmIOlu%?TV>X82[;]Y85h3aNaI$.uDh+eJP!9kVQ9i`iUM7"-4>N5RY.Xk!(4j^>
+%E3onG*Z7BSq[G6dB"nY((,u0TpfVs)DM"I6r<CnWfH2+oqi9WIhgWD2qK<5&\:Dhn#i;*O,I;]E_&GXn#P=Q\`d!rdPH('/WfN!W
+%g]U1Cj%9Z7C7>,`0E`l^0J&Trnu+bDe-3)O:;?HJTu9rKe:bc:7[-R;0c$:l>5,\)&O#>I]/$@O'X at hs@/$1-P_C:#U'kk&ba:B3
+%#Y8!i+sN:L>M8pYc8anpZ=,UYcuPRrKscfXC8D&:bi6K*eiP:2]J`X7K!1e$GdB5Pd!us2i]=gX3.KI'$1)g<=g4"DXBsPA#LX,8
+%:SHH!.$I2WHQeaiG^rptU;5l;KJ at -m6L'ifLsBY8\\qpbk+%`f:+.f45q9/p^mQ3W%5B4$O1YMP=p3$]nB!6Gk\@MD,?$5EOq#=u
+%R=U;ZUCC:/lUKW^!?1JAII6=B%h'5pL2<mZ'S$k[M")7l8,d=f3. at TV_6=qnR6eUu76e($:KP+Ui_VeLB9qnSXRLb]c-NiZDY<iV
+%^.)<$<-'V9RMW*E,to;/*%<>6M*"8mhtK]Tfp:D3aA%A@,(eo#5^QE.$4(pAk3r0(2sOoVcuVeE\d?Zhi,Zqsg)I7R5JeBNQXYoi
+%bP9NM%tn^B9ogp8ec&7iWc#!P5`FN7(2ZsOYRUofabs+\D7OVU at L$k[\g$XB/.P>4P:7Fu$C:m.Dd1KqrQbNfBp2u>k+&PZSJ<6s
+%8k7l^d7`/tNE&$:i.pX/A:js?2G?Z>9Li5rS3j^8&]gni1l)Of5jB(A-e3jSF)MH+<h_BHg*Y9DQ/aD7r5l^S0*=H[!^sqEFd'JR
+%'XDkG)mKW^H)bkU=c/#g79Q!@E?\HSMCY/`\mnDCh;o6%Q,+lSHLZ2f2BK3:"m20PnU=)#"o#jmTVd$&"IF37MkjB`era"Ya1WYt
+%9WgfE&Hi>eo)L$2.N4R'pb'<pGXZW":^p=b\:U>GJQre,+DraZQ+dF9#u7bb?;W],n70_=3,iAa`p/F[9jjZ.X;F2V$T3YZ^OtWM
+%A>0_LRhD0u[#s%f$<B(UcDX9C6W1_S>;F&g"oP/"dRnuY>Y$[0F"\f)UT<_+7P8%=.VfA['=RH5&,o[TYqe!ol3&Ke_oErb&K7KS
+%pr[D(WqKsnMBG;7$)UNP%b;@0%Y,.eTLjl6;ECam(TpI]Oo7`+dp]W8D*oU^qm at 9l\UE3*#BJ,+Ks:cI7*$U,9tj#ROCDg>AobrB
+%+9slpl+Ik_oYLH"2EA%p4BX/I;u0/@kMjoB/V*&*>=1]:FlbPQEPX:2fVJtFZGZ,8R?rV9@(jW"Tifu-,q"CH"WBH5/3Y2uc*RM_
+%cFR!jV-Thtlg'"&_-&<N(uO(*U#IfDB:i:GW*tc"Lmg`2$gQH\F'bPrkVI3_l.nOL7%]$t%V9aR/n$t at 9k')V"]#boG&\amY?&Oq
+%?(0"5gQjG$gqF-8<gjd?e[LDn\3^mYj:F9.,.6fk23M\<+Mk5#]Ocqmc6kP?TNWHl>qiD.iCSbCQ=N``>O,C.!D/jk[1!@l5igN[
+%QF^>=/')!QKs6YG96,-g\h$]k,>5An-,3JeEefL>g:aO\A',"1QOZQ*EOra at mTX'L\O1`q3RNl8#U:Ls[NNibBD`TXWWkX`fl1SB
+%>9OnG**W>\Bj^1+&Ig69[H*[AH'#4S]cJUWU at Q#6EBOV)C#F+LkDGL#S(Cerg!D5-MP/7R^=qYe9Z[QGc,;8LFQtTOi=g?G87W'Z
+%eZ.K3"DI4;<eish at X3`i5\^K1Nfmri0ApRlaR1MJ3"W9UdY-,Ik7[t$6W)Y[Bi)otVrCW]c(1!FTP\E,oL)nFg#!%ZKc;ISpVu\(
+%U!b&d#8kT(nB6N]99SWer)](d\@@)Wk].9<^iT4bLL\XhCPgbk*^j8_&NhBLWU5SnWti[!#a41.Le0YA$F6)MQ)I(BY<X<Jr2V3C
+%o:A3)SSt?N?JVuO&Hf)?n1;Cm%AJghHJo(EfU at rKBa<2_b$b>:;H:Ye>'$<ii5MBnQ&=O;A&E&5LKAX`q?qjM2Aj&U_M5gi2;GjL
+%'EBMhaTA"E]`lSj2*]Sq5(osEBnZf?;u"`n4TG>;='p4?Ki`.TF`mBT(Vb3oXRI.9[@sg48?ZK3jnf"Ya;uG;03^KC-9[3ce)!<q
+%bNTI`LC:1.V]BG)M5XXZRh<\rm^5"++[7tY8\>7)bt`%JoO$?hS='iQFq&a#_0YS*?3'S#5Gk72WMEbqbhNIga#e9&KF3"ZgE:9[
+%f!"I!bj=c`XRSH!<F2FIbcT2aPS*=#Z(X;!0C,Z:TDch=00]D;nDEo at q=o#<I.d;:NjhK`NR*"P'CY`R*k!(>XP.d^1Udia-,Ig-
+%B>3lHQ\`a9Zi<+)APm11H?D7IT4A"qe6i1DF0 at e%=)N0*$9n(/p\`2>puhO_Iid\I\+ZH_H_#Zce0jaG:#h3\n.&.P5pl)E:ZK:S
+%nFfT:)fteo*<+KZ_qR#!#G9#j3e7O(`]Gl*2kIoK1P'JgiBcVq:/:9D at 2b1bLUVFFhjD;+s8#qWLMolE*WESg:>kN,lJ".H#G9#j
+%3e7O+`]Gl02kJ$Yro'L;*8^6dHF-+cCT$]9Msq3Mj'h-K#S6RnE"84e^EjP<ZtXpF"2+5DpB:Cq^+kE3Hg;`n,>[6)PrUtJ1u at lN
+%+(XjGTC'PQrYo5?aG]ku(SCZKg\4A`A-*;:c_(%:hSO!^A--\k1i>L.)c#FqR_U.Dj/nlf_bT7Zq"4l^bZct(2f8RWG5Ur+&+n1X
+%O2(RK-f4gsK3\AXGJF1"0qNdm]AN;DQi=Pa\GLuPqmeB8rQFYXr66SXmdKr3J,2D/dsq3YrF\@o_=t[caH+%'YPl<[rUE,PkC<EE
+%r7[3[a1L5RcL6)Z&,u8eqg\Ua^\E<Yc[Yj7s0_U7agE5ciSXUos6j(-5P\s,on2/q`fkYGCQCLRmsjm]+(u/)^&9>YjT#(?s8,+M
+%m9$\jJ*haa5Q8-AoDi\#:%*DsSQGg<5Q74?5Q'Ziig[[Hc[>VNrmlSn`Vb8lGfIcrI-fJ!p6i\fbn'I7]`/69oDe*R^[#)FjP%Z2
+%pXaoopO<+F^WCf\g2HeiTDJH"nq/%Z1[hW!hXIq&r7aI3)o)45n,*P8d!rdsIGar,2gO36Du at GtrkukVVYp$QJ"uu^DfD2dA,_HP
+%qO`9#f=q*Hj.B]SV4We:I=l=Mom;2QO8d7Ns-mqUmI=ceq1&:<5PQ?"K27!`c0"MuGCS at SqQASFrltK61Z.jAhW3N7J+%SDp#D[Y
+%qrqJbocO-jJ+elRm.'h!n<s=?.mNq$+90L at s/@r&Ef\!06U1+as6qt^o\gneL#;e'n,;j=^MEdh55MnJqn\p"jkp#`0DmohEVl[6
+%li5t4-h0%STD-+hoX0&4h1,6g?iJlrqjH4-J'Yn*afk[BhmS6C-h>["HL&oE(I.ouVgn[frk6X*k_[>%J,^%,oacQ0(AKCeq<D%r
+%qQ%C%+9'@\76U>rhtd**rgf[qrP[a:X4G&XQ!aPk]Cr;?qAWf=XoJ+hIdZIp5J at U(iEuM8?i9Bu%a/A>r9aHXr;@^djpSB*r3QFJ
+%Dh%aJI:41DpQM6L#JZ1 at r*A4X^2LnprG-m;s27Ppq at eAApOD_N54J*"s5G,LmGn5XrU7cJj'k1NXlITSkCk"*l$'ReO14H,s6pi>
+%pKPrck[RDI^\n[liF<u0V/>.7IGf&CqX;.Cq693Aq=o?r[rpWLE:'iXm5+dnTDefEqmmh?P2e7f#YCor`jB0kKOG6:;VpFbESFE[
+%Q'kWp-d()pY?S=$G&Cs]DFsB2W9L:Ll._ft;0U at Sm616\DnZH?#SKB at Q699B7.YsB7)AAN%GQF5QSTgM.dO^I]4Q52\+d-h'9sFQ
+%&XaLSR2HT>lHJ/^]heXm^[-CCmSA?2dl[U#G at 1BPYLQEUM>-6fJ,[?8]m]g:s)o<pH0q)AK^.f+UA)'6+T.j]oCbu[a++'Skf5bh
+%?UMDRq%k-#X/ME"riH_1r0O%iq>0QoH2O`CpYZ#95Q89Ep)6]`^Fh<t./mJGO<`[JrVBS[TC]1gBqbLIST!X&IpKLBUj_WS]_>24
+%+,'Y$AsCfX?i86b_suY!h7E.K(OpdR9ob^phY9%]^[j$7USR&NdEhg^k:k1t^OL[tqBnN)q_-I'H0r(jpU at p:Red4UrQemLIe.[^
+%II4GG^])IsTD[BGrq,`)oPenS_(##WT0L$\h/@`%p"t)o)rLM[mAE2GeXui:;Sb`Z5PrL9qif.>5Q's<IJ<U\I/;<!r;E8ejEe4c
+%LVc:Q?iTlPJ+M.2-VqMPMdQJ$hgY*?]5B3^PQ"'Zr6;GFci=!p?iT[=Ieade*:83eIbBh*j:<;,IeoC\q<.eRMbcS4I^<bXg@%S(
+%^Aii[huCM7]_S[J[$VgUX+0t!5UF'\UtJlJCX($%g9j#k6h!CqHK4P-g)EXNN%`[doT3"&L>)0Wi4nAU6AS$cQu_DFi3e[4^t0FO
+%6CjQQ"-kG at 6?=84dDWtHKn2i"'W=,)',)pm;DDPr at N6>kcn?oJ0U4<lpjUML02F)XmX]k$TW!Kr6opD0K%rbU^"?`NJKuX!Nr3/$
+%!Vg2u*G.$:JRflBOqXl4"g`g=e/$Cn7L,l]\"OK?*n_>i/5f#GTYmF>o*.*._UXl3AK@?tUh'QT(Od&@^@ad.5 at TpLjT,c=(%f[)
+%Om,AlIAHR2E#%o>,+PDj&79%jJr_[sY7PJ.@/Vh_k-2)\7sA&Cb];c46KANLl[-_DBH<a=K+#/kbYTJj[<'*2Ca"JU1cc%12N5A*
+%q_d?\^:/05](EGI)q>nP:=!P8dmJ$S1""kBm'%$/SXVH(-(%Lp6:#"ch>4Ea=mWqD\ECM5X+"%::=dZZoDE*45,ot9X(EW+WLB%9
+%6e/9Np&sHPAgYU]JblE,45gK04[72$No_-^r6fkNReJ;`T;;n4-M,`CI?U(FmE#Ak.&qu9kH!k5nr-RU2O^t&@aeIqSd=(]hO4[)
+%2jh-j9Q!%<Y<B.sf=o7.R_OaCWYqnZpeWSIgE01ga_?(bKs@&ad%@-S!Nl at i\9'r\Il?,PO/L1ko_?E8f>6/=ZLu67BD=&VhtAD[
+%o$7OGT;JB[c+pPF5 at 9q*mj6HD31YC,k(i4!HJ:qcID(n>-KF-3Ecs2Zl(X5NZcS4DG\9\<+UE7hU$-Vp;SJ,*"B;lm8X<[]"Y;-M
+%9pU4s/=F":'s?g/e5U*O::VpVE%1Y<X)QtCDMmkCP,1":Ya!"9b3hkf:(qQ5-:_'i9sKJqiAcs0FFT_&ST5'=WV!gcVodH#S#2GR
+%Qr8,U0-G8TXt2J&]cG at -IJNchVr%Cj_OJn=0nnreI!0*ob%^TXW`"1'AbXX;BKTu]UN#$M8`ldNdSff,q-huV6K-YgDTf"4l"ih4
+%0:=)X]r3OCN7ImSHo at Am2r7'HI%20IGn/<fnaaWJhEs:t.pA'6pP'_rZQ&HOmrkurO\0&33M/H/gZq'pT&pD0>ZF5eAs4%[F<Lle
+%45*o&A?ct%>bb!ZobI1ae!WUOh&C&+,'h:GQOD/>jm`SeaI,ur/+IeAVH)_7'69g60Gm37:kC-fjj_;c*u-b%n403s4%^48HK"@H
+%R9Y(]JiXC at qV9;<G8BajZ\]'N-pDl,R=H\i/m.=I0U)F(a-ro^,:Aq<!KT at aEWH1ln2QF*`M`K(,WUgJNRg0iR9J#I]q7KtC^;-Y
+%^jgR8Q0;H:_nRr*k?e@'TX-mf2$uCo"Ce17(:O0]#D\3O2c;aL9$ke7Zn"bk!r>:p*&)Dh-\@8=Z(n*&b]"k.7ApJG]fH)9K`8m$
+%JHJ8;$+.fOTS<O[M+^5)`4E!QJQbCj\>>=LAu60DQ7c0%!4a"_`^gJoII!LD'**<_7Z$+ur[S3Ya8Z2_s/2oZ]Pd>/M5/c8+V'KO
+%p^^QAaL9K,d`.G^hY3DufiS2\FShK.Bgg9agG#;b`AX?VJ#[e9\aW=0T_r`)Oh,/ZRFSCnp*(&31"p[p^AFKJQ'ReIe*3k#RCOF+
+%GiiA0Z1O004a:4=FEOBmK<RlQFX_km,69ocE#Ae0-!R/l^3mI>)n8EE+dYu]g+!q3>g));:fD<&=&DMZEKo-9?I4DK^*dK_-'&]Q
+%NW2k$Aelpn;Yu._^F0c4rLO<_GF@>aQSgLPS#qQb<\p at Q&R3.&c$`H:]&/.gW8)XfBjss-#:h1D:2rt]*e;aklH)jne/YF:(`[QS
+%RkoW=l'uR:g+r#hL>I^q>:P9&@_g^]Qc"X5$F__*CVPNSF%9b(7m[6[b4taZ'N&&1'8u0iPurHuWc<Oa at Zi@PhUqY_FS:*>^VPcl
+%2RrjskP9-Q5"s30PIj!"&tGccg`.odcVdtpkE\;P]fVh$*oUsI)N:Sc.\a`1Q.FGrhQ!_*2\Mm`h5d[+g28)lU/OS]3,,AOShj%5
+%B?Q(pBJr)>r<cm4JX1jgGC-l at g(@"uE<pEY8)?>aef3JS`K/'kP-S at R4MC+m([7K'l1DgN+i<.,OA,*`=_25!R4g(Y`H8a3EJkYh
+%G5W0OEqma1e.^]_Kc5fmCf(%@nmJU.[r\DRAusZIF5(o84*)T+-B_kB_(hfWcM+-`6AIb:24GYYO-b!JG*#qs]q8(&h.Q3"3d3b\
+%8*<-qqM6QB.Va//Rc7'1j-0"2%Z+n?+Y'K?8[W_(H9Ror<,QKLn?rHQQFM_ZP4=s97VQX/=C^PmA`TaZ at lP9@'g1RGMds<g4\QML
+%pQOi]it,BmUV>f7<puMe`g2]rMo40S]o/7l=%9CG\\qjL at VKFi[3g3+>ZY9$9-W(t'l at Q&Du\s.E[H9_Ee`'@akd/4G#9^T:!b2%
+%&02`jCBRpNFe-=I^@"0YQHB.$F2chXmb!c=\UWrErJ9?sFUf#@[;X6<^(]n[^\?=B\&R;9[c)H0cI%W4`nBgq+7DYu2Nm1Y\qrYj
+%n"lZ3p^_i[ZGDhf%'Yn.mRaao/=Lp,WIX:<K:ae_/<AZcpa?fnIIZ at 6[gsK6L%FgF:J`V;'E%BQou*R?O1XSIJ,[<303LCh9*E#c
+%3BE>SIJje!2jHIj/d$isjTCP/iVr]8R>n7Bj9mgbc;X2gCj'qZ1bWK%g-DQB]KLTj]="egZe^8X at bEnq5-Q(na)a8K;Q5'gEZM<j
+%!_fqW&,nuR%=#F=`?'R8AjVu4&CDI"b2(ms=gF7nJpUC6s!0Up4YLRnk@;10b$eCP$X"_JA2aJcH4KKsSM(RAZjK$b9Fp_`%OU@[
+%<Q+V at lnFhl2:WCOG*\'q6j`63):(CFBQ`ohCGqf^o0leO\^0qH.UZE4jQD8eq($Ud`qI$NC&29q4$E*,a-3E&7qq_/TmUg$Zq-PY
+%E`.1m3?RPl>7SQN6g]W9$t`!;2$97tS5.)%fC_agF7RfEo'B!:WSm1+cq.WK4FtjN,)d?cZ%j-ol8Mp1m^93V9ELKo?`->QnSfA;
+%`rU+X+:*Uc%B-cd#?t:(Zo?H-fBjGFFtWV]c78jNGP:,]$B?`XOn]Bi#HMZ+,-I\R)>Im=nOFG:=U5T?0 at 0Ll10OqW8#`tE50"nu
+%b;oI=<t[[(8$B-+nT3Fp*Xf*a9Q/gV9ZC_'e9S+bp3:R88RA?&F3Cr1XbMj>b&8=PAs;h_Jd0'mIlomtH_C^o2]X!4/FuCRVN\*g
+%$Zufs#-<d?f&MLVp<+Cl/2)!;<gJSkg;5XY_=`^?lZ3[+pB"ls9G^4*q.[eoM#$,f8Oa-nX+Om3H!kdRdaZfKlAPS54InW.hgMf>
+%X8mb2JoSLucVJK(cGo+cR(ini)c-3?j68>&K4VBEZVtqPBG&R'b at I#)\Xaefdr\I_9f^A]DZdVh>E"`%,kZ%1>0bVUQ2?8RHg,pB
+%((%fq_soRc`qWC5`fI,ScI8PFe6.h_Tg.hTKAJ\^54t_Y]\U[\WB(bY+$GlRg(O)=7$i;M?s7ho!tS_T"((,oi5nhCPF$<HTc]0R
+%JM[+/Y+*3W%Im%X][@?1BS]`"h2ZX*1t^bM[?*;*GZ$c_SHIaZ".n!QpEIJ4*q'oMN"GLH<7+A.(HQu5\=Zhqb*R at A"c[<?JCA<Z
+%pM+.4c!=F(6>-&o_:*?9j'`XnQKqJm0<)s9=k>-H9([V8U)<dtq"XIA\BL.iHTt8clhSp33iP?=9k:G$i at 2bd372A3p59saaf2AH
+%berT-jCSTCRAq/I*iE:]3\TLf2s6WR<@5XcmmpO*[J>'U*07afj+E!;o[6KXIoC7`HTF$$%RhtS?W418&EO8%1jZe1`OMgJplW1c
+%2.(7<;rd0aXh(4B9o&7#pDt<%qG<o3gWNT2'Dd_.h]ljfeoL)d4T&f8WcL/NF?8h#fW/>k]"Qbl[KBI:Ho_)q.X=3a79B==UD`Z"
+%RN[IE-i*8gma^i2Hf]!i at 9_$8fTN?%ThMC%n<cIoEBn#;l`Ek?lcs6lEK2Ia4lc>AcM0'e887X+&*^.BEMZpiC_tbE&6ITYn12$4
+%cd%SI,Yr,8q5UXo?(tV33?)=_Jq&:D/A^Nq(/g)d at Y#VI2]*X@(fCYMJq.1/KBh!C'XbbCa"qj4ePG8i8Ki-HhcE4+hH_dTZtE[d
+%?C=H%bbiO%^R&LU]p^paY"m.%a8#f):%m"n\28KAEH5.+BXuIq.=HVm^7:.[=TYc!DQjL><h8Osj(49I@*hp/RDFZugG2cM<O)\l
+%;.A%7]imX*-Bk0>V0ciLC at A5U;T[bXlgACl*V+[P'^ks65!Crn]^Y>9cS+scqQct;024Cb=3W\k)g8gZIa+^#R%d+%UZZ>hOVaj!
+%VBNIlP^V"glccHT:gbGaL'#>01*)qH+^dn'IU<pio'k?.o&=T^0/`YG*Qi%`_7_D8X*>&f%TPbPLZ%2cMK6<!REWMuF4P=[/r):%
+%-T]`_iJuABNfT:]%>BVVeT&+qC91XGUSW/b=Y-m1/luSqnEPVrjil5A;rt-tECr\alLIceDa#M/0Q['O-FUV)B1f^_j&J_NX7OW]
+%e'tum?7]a\$En^KCI at Bt*0-;FNMK!NbfKV$f)b'!\\Mk#7Z)Qu8?,8p>r%2!WfiTF(KcAIW%&[`Ote!HOBB/NMl!;9#4[5JJ@])E
+%ni2`;KFm;SWNB)G>lr3F"0b2)"I;Uai3SCQ%1acr.h3#Po*&ZEpN at qI%>cTV`R[7AUhm_3`-:X!HLg_"S'gH;n*gj*N=l5?qaqj3
+%'7A9miXa\VH?P5Di8uPJjXY,O>fGa*Q^V- at PYNi%e]C6D\"YH`F"<"=]YgUI7'GD>m#(K0d*iF5TuC\#cd=t?$hhcmm>;_VEn0(i
+%8U,8>=ao at F_>Wogfd,$u[4bEom$OKYBMWBmAWBH3>3+!$d!8`hrIpEJA<JR3W?Q*GTLdl3+$Gjb(<^t);YfB7IX:oP#bg`rDcF^E
+%2SK^[IW\A,onn;!3XF4VLdJ7Fq3QD!`tndeZ%W&tleS$X02+5DMbVRGI/o+2D-T^,5Lp`>VBjKi>F>t3HZtJR+]GYB/Rhh$i9M;E
+%&mKfe.c)'c^(#,/<Up#!@q\[ESpB>sbC2:>a\F<"'R6RO$4^10PX5P]F!N4]TqVj/76+faQ("IJ[ssW;-D2PW'<8C'fS(b(l#N^P
+%<&"i\Q]mLj>t[.VjX\^a+5RE+?gG(V6q&1(obagq_AV,7kh],>\/J_J+%IY.V&CD*Mh4pahK0?C.53&nVWsX\1_*=8=]SP;\s7%4
+%1">^=qHrGR3d>Z\$R&Z]A+(b;%kGX:;%FK=G,XRRP_WC/`"l=!Ql]iA%7dVK>cU.a/7FRCge'%6-rY7;^947neTU;+an[_c:ops2
+%)BOPTjR-iU/mu,bW>0!?a1NZ^;EpO$Udd!sV%jGi'6T,&Zh^38<D]SHN['C]%<<bK5olsTWhTo!WN)m<$H$,A>*%V2.?=75\RqLh
+%=e'WDd%.>>S^5V/<i?GQr<^_@,06!CkMtacl-i4D/?-ep4[uehKqgjGBqrLkom+Mc.3lC`A_WCZk/m6T/Z9#YNHga at 2C`fCTj"M.
+%:bjP$eZM9L%_^ug"Xd7DfohTq$l'*g/8"HfG<Ys$Q at 8f=ZTLob&QdP'W4XuL4#7XM!ub+^WVQ&?Xp6[7#G<VPWoqOUE2T3@>7dc#
+%%Mb&#oaL:1HMcmS"Y:uP#YO1ZfCjRUTp3l.G%-n6]gpL5?``=%?!S%>m_+u8VrPZ0nRSK$Ejn`KDK2cWK6)8q#WtAlB<-&NXFl=H
+%5tq=+,_;Z&$50g1,.RIEq-8qAB`tS07]lfcf\=Z08o$J2Hgbi#Xi?kC]iBm>g8]U-C<K=1\lB?@??->(.]"fUEo*Fe\qet=IX>u`
+%mol<,odUp;MSh;Y#:.%[\GtR\?oA$bs27b488:"mi>cdDTnhg;`PQs\=cQ8,X7pWnZG:Zs;tV=oIY)ggN"a^)#Nq;'laRX)dMmDZ
+%dmW.nRu5tBJbheb)/km9jciZk:&k!92GUEML6R9,S]Lc-GB5SB7ik%1j>][+g/"oPc2#'Km/65LoOt\p]Gu4ViKe at i@n5(QSuO!.
+%_soMb`3"JMb%9[EP[;(SH"k\`@pc]NV3/ouE4tVu7`]@tBC!=eL77+g>FM[=QJS\?A/d&NBPn%XE&7d"6`q$2Pr'KFj$HOSgr5G#
+%SW^Ih:Xib17co]]hl""t'AoJ+Y#FLR9q:SBW_.bT0S7XNr+SOtu:s"PWGK at U-c/2\&\p:.fnEnomr%srsD^S1l03rq1 at fUIS
+%!P^\90F2q$hXGqQo>fasJ,`=]GCmIl4.T&VM&Yph*"Cs(b-`VI"eI$M&&Am`5#$(40416;cT=)I,$n!`Bt@!frPI\rOL;'4VB;qs
+%:Ed-u'qs]'&9?IpGUG!fQb(;t4Iqp=`=_JOQ!-_I$Kk'Qp'ACG<Q3JBMZh>u@*ZE<^@&d at JT.Qr!k$d$:)?\qd[6Gn^/Ita-(Vc'
+%DDA4lFUrqIqq6jSaq;4pg0DAj/.ZD4WU#TS.0hl!hacq<$LU/3WNlN7WcE0KW>ZtEg#sk):UMr=Q!8sCb+rJ*il=M)]lE`.e*7Pr
+%Lgb;qr8k)YMog59j]Y9=U]&mAI$F&NiI6KK.o?5>SPnHG\A,=n[9%)m]VnsqgY%JE/'6.NeI4TB&#?Qe`<^!eM8b`jmC at Z+V8V5I
+%Id*\g59>Z4@,]WUM^R2!2'iG;AkQin%b%37KD?@.\ujH,GX>Xa*m8q9X`[i#DI8]@]AF@(5;o%L&d/Nd"0Ua2o7$$PoB!e>R3-aM
+%fjm#8Lc;g*?#.htFY1+,iIe3r3Ft%I02!<(>)TsKZkbhRYLhlVKg>qI0]i17,(!bj6FJj;oP>B"[3sOL$qd,M;>"CGH9OWE'O<',
+%Sf3,W&'gMSk=b7e557>@*(tSg;iF2j.M88QoNo*gBrb,M*QG!XEb6-rD6X#mGYmHER>_qNfI9!]Y5#5:eQHqVC]eS3pMQQUB9p3S
+%)Y'pHM=2HZi66<n,rEYo2kHk-&)B<<-HU@/+jaJbR>tZ]VOoGA/@rX?L(["1d\FqZ9_LUhYC%\;hQ[c&>EuO?\k)#1;K)7[SY*_I
+%Vl at M&EH>3H#NbZq\J4H%Kf;\tV%YAh*S8-/d![2F1hW'SjO78_\2U!'"1,skR:b)E#TW$/_BJ8'\1U@>kN^J_?\f,S([528HFYu4
+%@I+Rdd?MZP#O(XWDrkPE:[ZPa;lu at P<GTR/pMWFY9e?62Q@;=1pPCFR5@)S at I0-mak`b`8q:6MJ>Ff$M_"7E5-i5I`[71HC:bJ0p
+%O>b[fhPl0*57\\o0M2STJXO)L0W4>Jl[.e[a?:t4)@^?k7:$PS!K2=8m:F']*eY6aJu!c*9+s7?6</oi^_G1X&_)Gl4`2]H6:?^u
+%6+m]J#F%e(/Z'@=3N]:<Yq8\4.8`Q3dF)JSODXe=k)uNJ5f,J`L)hBrScDs2#@SGS?4]R.!mb9Z,g^*2A-<X@(ZNLbk*Jp?`>5.V
+%#*aKhT6V<S-rS$i((CCN1k]GZb,?dn>\pZq%RLKm..i7t`g-]@W\t6LitdWA.`H(7MJ.f6a!_nF at Dpu2,tt\u+BC<akSN2hLuM<Z
+%Z.#;<b*EAAGY6a7e)1&LHC,b+U-Lrj/Ku-f=b.etcSC$)/kjS4mMBK,J[%0nbPVDmCI;4Vh(@u<q+D82"[,k<J\/-p*bJS&0u6oO
+%p=Y#m851*UCRI^SO?XN5QAO[f]!*?":k08.39/]/U=^nbO[9lH[_]8861gCTE<O3WCbuYA3\X#DOgBA$;tig4d75u-V[Qaqb/o5:
+%$^`Cg5@^.u8'eX#GdN5jc1TGnp-c"tO$D9CA*:tGl/Z!Y*01^cp8!N*1ql6\!K4W]7p'Q#?>"li++902V-8in%/ta(Y#[%OK.$C?
+%0@!>dcOUf7\%V.kpLhnS^q)IIo8e\%l]:P]O798M$'\*7j'B's@!fAg[dj*Q+k4Y]FO.$OO2b:/#PQ7LncJ:-$,ZZYU6t$!a/\L$
+%#t!&"psF0PP.9pCqFo>ErKFekl-TTX/Tps%p\86[.s<1hpUTDL$EP"oeL1YA3\\B*R&O9nF6]&QP3NW2<1/K$gqMCaKO1K@>]pG1
+%U2i7[,%rkd%8<oK"0)Zk6i`0I!s=udL&EUMK/c2GD?UaXEd?ZM:CJJc$qB;k2(82,![(D..0W)."]3]jCIs/s&TUWu3)bkR(-"Dl
+%]#e<Gb+%_hR3.`nb[:lZ_Rb&=<"`'*d_Zp$UuZ!2S5Qm=@H54m^BV[_4;OUq!1sE-TI24CAK"3PCGM0U66nM?:*Ee/6h>/SP_)u@
+%E"MgG'Ja?r at U"snb7J1lM'AAi?ajG1.0qe58Z6KPYe$T<OXYI\Kf*s/o at N?m&(dKf<otTk(=klbFGU?\Ji-K&d_Zp$jQf^Sf$kJ2
+%9VmG#:as7=WEa4DL45O_$YuCj'PR)D(6rkCQ#SmNdCQVgX2j6-=iMu5159cT46$7;:U(qN/!fRAd\u)-RBOU[r6<`'%G&$r>*Yo$
+%W"J?aEg=PE$#?S6Y/VA=R^F0tMDKk(X]W2,!4;iCa1BCRa/qU8nl'6c[jog<RX/#1Gq/c9._3o*"rB>pi>>5q6Gs]femITZ;J+\!
+%Rb3oeEkTb$c`WsQ.LiJA9)iA!"Of"N&[WU[UVYD!:o^Kk82F:5HqFDPWa[fXVG(Y6)SpBP#g3tS9;qbTMce@,iI!@heB:Z[;&*7k
+%OHC_e&XF/A,ud;SX))[[Ogtb:6!:bM%BQP\a\"D_A^(ioVUE8KW:Y]M)OkaYfmX<c3WsYWd6J6[:_I6X-5Js`c.GDiN"ihg[pr>Q
+%$VI at L6Anr#a9GU3 at 6dsp;H/>c%:l8*[:<,O$VRFU4PmAVOT^]#\^JReq*kiPb[<]%L$?0K0Xkri#g44E6>*`t7BSKai/"<kat0W&
+%P`b/bk5pL_F2>_^W!k=m/lYaeMDCG$ejQ?BQY;Hl&XKCQYU1j]/fF*\RuQ)q%2-M[*TPqLq:FmT?I;,fKcX]ig-_s9LY)qs'_';A
+%15O(P)H[Z<<*[Y;,[dt^q;j&Xkp6K5E$Ass*OtW>-*jq8ck+M=SO0'$`WBVIQA1gH`1f!PNGZjAPq550O<N;O.IpJI/ePD;Sn>Zr
+%VWAhWKf+"[DeNVFL8$oolS]CY'h#Jq8MBu,=E,g1p9V(P^,ck$ZA[f7?V=og/P4G;K)<crSo[LQhD(0Z*(P6b[s_'Odnq3r[F4HD
+%78=rs_.Z3iNQR>,M]5Qom6#k at U8"n)j^CL]7\*1o;n!*'lL17ZSDq+E2n/DLQt%S5Y]ZmdP]n[?a3Y at n5q&Y73e-F[9]]\K>EO(j
+%.\m!#UirLJ:HmKH^"EiF*[;i5I at fa2YnF/Z,nTW5#hq?.WG,2DX%Zt at l9.g+ZMVcmaMW`BbT*kuS[qfTVf'W65gk^Wf\C:$:#aH]
+%Tcb4eLC/:MY*VldEC8#(aoQ;-do!]q.Tk`1igNt:^af2uMIMj'TF#>Q\IhGf$[_ghdP.q0XPHYM%B4=q8VQfuI:tA\eNfR<Ef&dk
+%@^S!%:/1l-E\f<Q)`f[qF0hn_k1$N%ETer@>5"cXbrEL4_gZ6gnidF#-X90;9PPU;6=OC'a7s)A?*C2JH_FkQ1u,>aq\3_TKO]BA
+%Q)QUE-7\+9^)!""?&?L2.LiJ98kIiM;X%7Zl)u4&WkBak;Rt4rcIEsqTT4&TZHL(=%P2Q5M5a\_UCGA";l]t'PtO&Ic9cZn'p,q&
+%]6%9%^kE*&\^[!$X&fG[e-h8prESu7A;m^M<:qG84!@Gle2i`2H.^Jp8WGQn?Oq5CQ?lEVNR#L"C-I at 8^-nX?0oM=S1@*+1!BPKC
+%8ZZq\Z[25:,HVM)+<pHE-#las5IA!&7VYd)m:riMe3;O%L+Y%$gtesV0UdWV>+"UcDF.EVd(QgX<SrP6-b+a'Nha;!OU20:_.YDo
+%3%Yq*Wp1ulB^ohO]1g->;9>Uj$*r;KU',"76Pm`t14;;K7%Aml3`tUtZ9r*gln044$sL]*YDp-?)&Eo4>hIDW3TIt8/CGMseA?f`
+%G-ka\^mi#ig'l]^8CNFf#\,rlZ_JP<@CuZ-obbJ8&SBd:,<^qN"Ibm@>c<Gu:tQJ+4L6>-\1m*A.c=_=9K;D6)P7,<D+"j"pt at 36
+%G,/u]#iqXT:&,8\<0N`0FV9E9`hEfBk`?i8Ho[R3_hlVeYnIH`.'g\E+[Xul=K154S@/fr,7($)+9L\,_Pi.l)P7+Qg+]`d4*n-!
+%:"[&Dk^aHO%Qdjj#D#7RT$GW<M at 7V[0ak_uF5!R*7k8?&bYBP/%2aqEG[>;Y-BQXpGMqdkK'M9_ks[OT],Ba>6O2`p;Ob6tYbm%g
+%Y,?CA#M2Y?LB]?.JK8Yb[$tP*JU`*=#SZ1_=]p4mh at Uo2L\@CP_M1^YNe8.B?\8p_HP=tJ+pHL06P-;KM8oG0.Tac[#rI#f^^<[C
+%2+lp^IG+s`S>FQK,%hA3L.N*?@&+RXl4"E0mAt7Oj]^]pTGNO=SbF$<Ym.B9YmO3Rq='b=KH-8+4-`*VR8bq>VUE6e<'E!^f>\%7
+%9)WSf$hTQgkUbEl(-*n;WETOIlB_(G/^r]+gj+6>8?A,g0Q'j+h3L*S'Z7'M\l#=SK"jlOF at -mu3_]S[26=VcjX)!#f2Y'l?EW1s
+%ePXRIh2^"UK[an^]+H.MK=Daf;V]TEKSDR*Q#`?LNqL+0G.(DU2Xb*fcOjsa0'3m&B+#I?4\#uog1]2 at .FXCSc%^S7d1r^iL&'M4
+%8$+!OVB%u</?"(rL\+-tF((pTf!#Z>lngb[G3nc2Zm%lt\M#a1C(c at 9%WZlbqN*$I(.&YV2K;2/Z.]7Gm^fJMQ'lGsGQpGkN)dXp
+%kH'8MI#aV&gYha1)6:jeW=q0M?.)4hN&mk0qO#7=OA)?V5m>IqH4_'&q)ARWEO;5gZ- at I5E0/&C/Vo at F'K6d1:Xf_nc/[a<%4OGN
+%)3!f\"fT`G!aGld-Z4k3+qC2[#O>J'+7P)3%MDWP8(]kg'O;t:ilL^ijj4gaGj3+>:5nim+HV0a0p\B?qc`Y0(`kJJ[H3nhA2)&0
+%JnT;f_JC1Ek.Z4XWm2 at shrs.!2HF.aaU"#!;TYA8Gmu$OaG8g_EnU\e8H?DAV7kRa&k*[KU_q#u'rRE=/1ck(6?Ii)Q-;Z!K0^2l
+%cbUk35KPj_+X7`MTuaO9/EI(5O[%&e;]IH:%H'BV^K'N&g"2rgLFQCBE4="Wd^UstBEs*.'hJ-jIZM*HF>T3t&<!%Pq]0AS%o#>P
+%me_Dn70]uOQ<9!YM*k8T/"@e[.^?uV*m?kb,EOFR;'XYPG&*mC(<=&E^3U/\b;f&P.RDGm;Y6bSUgao/KT^<0RW(AWMUn),9aDc0
+%-Z`%hFX9kRGmgY]Ti3Ra]X+'\Le9tU<!q&E,q)\E)Pb.#aeGNb'0+i$q"=bo_2+,mPQ6LFi1[=];7X_K,r at l"2M'K^V[tMUiVBoO
+%.QNWCl*Vs-_hr:cVj8LI(5e#`$@GiBFM_&[-@"/_%)5Y07hm$b20Ukea66Df_$u[7?`#UPl`'OLE4jiE.r![/1,c^uW0/bgf6gf.
+%QHtm5VXVbIaMJkX[d\V[AeUH*4>8 at gM99G6mI`;tm#"VKN`Eg4di:%CFV(;aMO_]e#ur^;Nf]A*d9;@HdNj!nnId<XBMg9("b\jR
+%FKDpL+IQEI70=DV`tCgC<\,ks.e6]:NaV.1B()m^-FsI4H9GqC7j>H:FX1'l*=:;iNXV2Sl[etG<5oYP`pGR<[lEFB43r1OVNOI:
+%<&VAGoI*A.8;&uQ at i&0;V:rV@[S)>a(EaAn,Oc>AFq5-P0cmt43"4?RHY6,G9M<jO:fmZiWg5`sR6>DGBE2k#:jDRpGW3ru9.Ncs
+%hIncK;1\D#'ifB`=;`hqBod6`[^QP'eEJLY_dZ%fOa=)L`rI(sM+F+KoiO:K^kX<)nX5UG\TXPJ$>\96jNnL>Oar6+Z$t>""ILck
+%_bR^30;2&B][)ZR.fs\`kma\V!0^OTr^c[6'iRIB<e%IS6p=Shf5_<CZtsRipEEYZ-l5IVZrmu_$s99>iSjudX58iJEu:EPhRU]*
+%4r&Xbb##eD-!-!>U9E10fn7LjG\Ib$(Oc>t/o9ag*&mDLBpbNFO]iU$oa at MJ_\_f\E^LU^h,K]0#[kN'%:,?BOVd8/*nMcD#O,7+
+%U3_",rFOK+cdR&eBl:U/k<02oZQ;,0oaNHo]\[.Hcfoc"a82sE'#n_?$%-+AKk+Vu5C#or"Qha)bT%]+F);n/NXm!YF'\hb'TD*\
+%U_ZE=pegs,Yi1iq@(u[ca^,+#B.-jl3%P%c%O2F)U.)ln2/WQJ>qcL/7#$&HC_,T1"VU+F`di:[37i)DZI>6GDVQ'o`^Fl5GUJKA
+%@;XjWGJkE@/nC\@irZgun!\TD+pj(JB#%N0 at C\)gZ/7Q[AA+2K*r'\I(/"ROguFhA#Q"F"^fH9b'O2+u-JW;jmB#3+;%Y:e?r.1S
+%WjO at h;2QF=J.s#QHh--MSDLR/V1'&]8?I<<$[>LO$YO/iHAuu4j>*+/ZtiHe(bRG"eA4P$U_kAZ<?;@hb+[')7;-TOc>p2D_M&G)
+%R,_0m[,K"&*/rCa)@WfG]-]C*<O^_FZ?*pNU5IF&8K!=7[j"ZI&W?jImQM>>R4;V#N541#A6BKV(N<mblXlB46KM74+c-Qn7(++/
+%MCoMUETHqp3]Yfk*uWf].#mNe2aHE#D\asAkeI74]^"E4E3O at kU_X_(=PuOCW,3:NBe8bH_?(5t/F^H_^l<,9S:cqb=O8`rFiI6I
+%2p1k^[2U]jEHB\=(H-ADcMf5ln0!Z>4:!O?5+j^<^me8MFBqDI3_<_Ta--X.npMV2I)!^L16C8/-dp9LioZGXN`[MpCOjHIop3OB
+%&qG2mROj;5p6cFY)IK\CNQH*"k5<7m!/?O)rMA!uYH>cOT_7Bo%m+_%\c^R>on3!s$R!nhH&j?'BV09q:<lS0G0Ekf:3Wqm_mB49
+%_:m:%P:A)?6WC>hSLL>e(PK:.2&ZDLjN<mV!:05oM(rkAZK>iAY"oBq\OM^)p?h7e.NX7o:i<eVD>c0#8]2oU#-i],AI'P(!H8$/
+%j&4Che`rOGO:NVM>Zj%\?=@tOOVik('lV]u>$AOt=7FL3=QOcR4Y6eu68ac)L1(f?l0J-!Nso'.^$KN[JUj:>"ChG%#hRA(<lF8R
+%4TOG=9d+$&!eY!rX2_BVT&p"o<BsY?\6nua1Y1?6%j at W0SLM?j<EN[/M=hm#o.rW[h29ULZo3fGWtsb7X,mse_7Bjo.NK1$hOosX
+%-VLJYo!"ei$_;K&:#.:d;n&!OM<T7bdGd9q6G0>D%*$F`LnMtFJ[knb0ifHJEb7#Q1D>AnUhc9QOQKt=#NcY8l;k`iQk7E"CDA1P
+%&3>k/Mja.Gl'R2 at hL"ClXg,%;2R at +gqE(j7Qr""5ZM'.jrOgk[DnAN6rZI(CL08k4JQFKB-lPKYa</cg.Ssi,A0KUjkn<bQ^'?9u
+%8'IJIU51(I`3tg08JB\lN-cE\0RDQ at eF+VNSg$W?Z/f(6"eI2=S0/!V$IYs\aM,-DRiLSgN,T&5dkLsqH:Kthf@)q-f5]us2e2Df
+%oJJbA^A/)0As9nI<^HDZjc,is9^]`^4'sPN?R_=ZV[b%7*KJPDEf(.l=HG&Hg2rS,mFW_Bb]F+KgWETWgR.7BV+$]_+p7E4V])?g
+%fp2ZA-V%<O?bLVrb^^-Z11+9%NTT4]8#$7YqHP=e#I+Jml\%JV&m*HtY<X>oQUN-Y.VQ3)-5n&2f/dHFU[DPP9d3</EJr+m4NeXI
+%6"YK'PnK(Ie.;adUMakh_U;"a19M@(fUQ6I)l8q\LoV5S4^us;MN*440m$S:);Hk/%ZmZVa-g3<\aEI2?^K0%&Zf*>0qV,o()9\X
+%&FNN)5b[$VG>O!i(;m4_7[PbsMl961<gZdD7p'7',8;bep!h'cDuhA-^gR_??/dU\Bcr=S5gfXkCG1L2LpCo#DfRO?g>S'`&r'*C
+%'%m:t\'7SP_[t,p8HZ1\_(=%gBEQ^&(jJ_#[H*_*dP;OU,F2mWU(/lh3G%K1'n at P7,RqP8a"nKF$_D5-4r&ul>L(TR/?-qAbCImb
+%;kB!^(dpA,B`L%"4Y="sSBn^k:pdpl*ASY7%]Rd$]8^7oU6&2#[@?To3b"B/2G??gPb,H*8i)\#I]'+8E[FcV8.jAolZZQlKs1 at Z
+%e4 at 9RI)ff^BVai:da-ksgcZfY#!O6Dp7/K/qiH^@8!?o:+q/4kG3^Hs=qPok.,d<6K^DG at _JY,1Y_VNZ at 2/Bo:hMf)pJ8[&j83^u
+%C<U^M=Jb-oEDK\j_$\=0,X#Stgs at N.8:siO7rR<^j`uClXGPNRhS::me?^pD#lo-B]cs8b'k+R;$=!9 at KH5JM7*bt,#e;smpb#-3
+%ld]ru[Y_AD_l.a`BR>4DG.Bl.g>;_[)]t/=4:`FC5a&hEO]ARfqXs<)i)qnW`8%K at I!"[=8LNHPa?-Uc$hS9Agl_0!G044Q0mEa5
+%dp:Mekj12YW9a^8P[dKV%\ZWbK8.<)<nCP"$QQan.(d7:W`K8>qKMbr\41D7euQA^P,uPq%dkLUd3mt+'nAXf(qKkA-D5&3!qPO4
+%Z[2QsqGm at p13L[gM=gJLSfq/R&<*aY"f4Z5<$W"ah#!J3!$&R8-Pp2l]b213?]fq<Uqu2;]N+M4<+_A^pQUmn_hsnhVlXDH<m3/M
+%hhm4#<B#/AFEN^GcdMRL&qUDJE3oXSa5p;FKQGNFK\^2FB;3)^&7"PtUG0XB+oscGI5rbd5]nV#4>:\25TgELTaN]tB1'.S-.&Vt
+%dJssu+RL)?gLpimCQCIneIFhg%@YbGGGC</NAPC_HK_lB1.[n,T]jCE.+G\_TX(`PI3#etlF;Jn*cFUO',=$q9sVK>bE/NG`/biL
+%G*JqS<0[.s]u=7CI'<p%44_^;'_Xom,/m&2<tIX;M'&lIJ<#!7BI*\$%M7TJmsSaK7,"kg>AAP85Xj$PJSmZq0cb5DHHE//U^c'[
+%)AdXl:+inOXYbfNGG>n9>RI8ACs'J>mNG&_7.%@)IltGpX?;YJ_nP4>O&2s1[@:F_g:n9ONX:=8Mi]Hc(Ell$.+^[aGal$`XH6UK
+%'RId)L3Ic%VP]Xu+;':/=?@kmQ<KdQm8uHa;\NLD<li(2#$*P2DS6e(kaP;j[='p\SL9K<Vs33\_qA`ZQ!+hfiP:0dE(Iuu6]TG_
+%0)golYl#.6"NNq0h&J#-X*6(QlJnp)b]YM,'S&OU)#2Al``0,E]%'Hc'rKc`r5QNggp$--GrM9V9:+[9il,4`TQ0>STS%bDVUtE(
+%AD3/r`n;lH%ZocL]cLj$)8E*MTA-5gTa<po)eQ=EFEH=g=JNZVY`cBEngagSZn.4GfHLfE7Os?@X:Rm(+V%ee$J$U8JTpT"-4n!D
+%"Hidi"B&bO"VOf@,UtTW-):lVQ37h`<@?:":R;2-X,ojV,kW4j at D!4a%lAPN3Q)-AD^Itd#&GCq?K16D at uJ3ZkIr@WUI*r<0;6M0
+%JC4_]6K%0H!MohZ\%uP3$a%Tc#Xg(+*\`0J_%uW8W;Ju?=O at 0R(uN2O:kb_]6`6Y)bSF\7<(.k/iZ_i[kLH)YUWoFW&'EmRJ6E0H
+%.Tp)Ji3lo(-\F6d"`_O.EQ2#<N!hC[:kb_]6`3 at V&>qn.79/ERau@`Z=-up%9m"T8;4Ko^Y^Qd24G!5L1Y`/2?AA(mPbYm[,2p/E
+%$V at Z7'eG)hoTWAadXV=kQsZRO&O8ifS59kk)nk=DSOpcI"X&dKoZ:c6g@=[Z?]!3K#<a6@!;=BH83?\/cjN+]=?eRCcm at +>a5B]Z
+%Z=dc*=;Fj:rJFg6)IW9;D!B&IE"Id6YBaH&<Md%uY%g%3fh$V\]ZqAa[1>/X?Yhl!#h*TEiC)k&]a#p[SEGc-(R?^'=Lk58<@(#t
+%jM01j6g?(?>;@DaOqFZC)>iNYZ!UWhXsb/L-,91_<=c(YpFql"XUd,R_M3?'c1Mc)"ljS4ju:)]`1:k?%$\*FG9e.QjVBar@)BIT
+%,GBjsSEi[I$d8D?mM=FY*-2;tkM:bMdYWWK(=24F72AR6T%5,]J9 at q7+/joKVf?Yq;N:Qn[Vt](DT?sgFFdI2R/[ME_BC]n3,=&<
+%e%QU0n+]ZQ>/\/83oRl[`poa;Xpd4Dbch\H2-rM("7<uQS4R7!4Gupq"!04R(J>ZKXs=F#BFo9gMD]>o5E1>BEgo(MT5#3c"71/9
+%(Uh)tM$b]?YoFB$LMSM,"3X;'ib5-G3.Vbjnq"A*WY"VW4T25A8W_VY'HRG;b+$TJ/DTN2bheg$c`!:j`$JC-q>=*r)O,KS^Q'f$
+%SP9T`2>J<XH;hX'KfKaif;a2)gYoWeN"/T?%;XPg?I4H#G0/tkc5q+Zm`koi%Zh;nO.#9u5du')dfH7?C%Yuk at pO"D(o2Ed_A3aR
+%<Eq;hNoQq\,=g[MSHfX1+:BrtX^2<UWgD&uU&i;Y$ej\e<fmp*Ij8FkL(C2S_R"_8'G;;ZPiBA>@C=K#'siVYftn-'-!ZEVBg>T>
+%6>@ql%KG!U0[DFC-O)\%[FSmm;-Xb\$:I=RNn?)0!E#?OqEF,96/ld+8"^>8A28%MSl$sa^MP)XI]2*V`f)QjR$g?1BCkbdoppd4
+%Abg/!/(N0Y at YhLL6fS>34c_OSAWLfN\ui3BXlf=YDcp`jWJ"DhLecHfK4SmRVrb!jeoFb at Th8/Ab0kiPX^j2*U'=dRoZh0+<]67e
+%XSL&Z:W at J"Rj8qTC9hkZ[o.ssO]X=X&J\?B'NTmu!rgbIGQB`I6KO=UU<^6_@]g&$=2X$4hefo:l?s$]e"1Xb=ii8r.0N8Bo+3dW
+%q?s!9#Ufh2Vb*[2UUC)1H)eZqn2434;^K[)9i\5sTr8TT<1K,O0SGB/jtDDIrW-=jKPZSmTQQ#o'sc8^U0:NY+f^`S!7'&4RbV^"
+%FQob?4/-s,a4*15?nX at IU$n+DQZX3$*!%51CT$YY'EYh_&5pXXaKN;2$Anq9eI@%oeofSS&bd/OURB_&fU\>t^_cj$b/Pa7E1Xs4
+%"uN1[g?*CNH%.e;QqbmsP;HF<hOaK2rJh2n1b#ddYecEAJ!j!MUKUjh/4M#OHosG--f/Mp)0\6LQ!62U.OiV?nU>^Mg1h]7Us07G
+%&P)FE7"GP9OtAfLR?@F5L>3`&Z7=;-TDnA+3ZY'RgYPFuIg+5(hSV05I*:i!ln3M;E>5NIQKb4M]$dFA9KLQ4ka;;)6o0&qp0lI_
+%Pti[^`"D708h6(!k&1>J6)QHSibm#M9B'eS]BLt38pSp&K'tAUkG./7*(Jhtaa?9YF;oE815qa31j"l?%b*i#JVKH0SQ(d/:U\;B
+%mqeRJ(-f at d=nlt^$#5J(gV/0+*2hY,SgMVp`nsOqj87]L$h"<Bn'5RlVp13M\972\cHZ1Up3<qac_eh^L%k;l)qUZt,A6S>le[Zg
+%hsp?kgYUc"3?"H\5+F2<.!scs$VJ,8IlJ:#]+T)S5(@TcH8nT)V"5Na,iICJV"2nq),F.%o^O,NQ?pYp$E2B/@,P.EBK;8dBQ5eS
+%%M5RL.pT]0kJ>uV2uZ$Yr6./~>
+%AI9_PrivateDataEnd
diff --git a/documentation/figures/rnaseP-ecoli.pdf b/documentation/figures/rnaseP-ecoli.pdf
new file mode 100644
index 0000000..832cf21
Binary files /dev/null and b/documentation/figures/rnaseP-ecoli.pdf differ
diff --git a/documentation/format_a2m.tex b/documentation/format_a2m.tex
new file mode 100644
index 0000000..35cc643
--- /dev/null
+++ b/documentation/format_a2m.tex
@@ -0,0 +1,110 @@
+Easel and Easel-based tools like HMMER and Infernal are capable of
+writing alignments in UC Santa Cruz ``A2M'' (alignment to model)
+format, the native input format for the UCSC SAM profile HMM software
+package.
+
+To select A2M format, use the format code \ccode{a2m}: for example,
+to reformat a Stockholm alignment to A2M:
+
+\user{esl-reformat a2m myali.sto}.
+
+Easel currently does not read A2M format, and it currently only writes
+in what UCSC calls ``dotless'' A2M format.
+
+The most official documentation for A2M format appears to be at
+\url{http://compbio.soe.ucsc.edu/a2m-desc.html}. You may refer to that
+document if anything in the brief description below is unclear.
+
+\subsubsection{An example A2M file}
+
+This alignment:
+
+\begin{cchunk}
+seq1 ACDEF...GHIKLMNPQTVWY
+seq2 ACDEF...GHIKLMNPQTVWY
+seq3 ---EFmnrGHIKLMNPQT---
+\end{cchunk}
+
+\noindent
+is encoded in A2M format as:
+
+\begin{cchunk}
+>seq1 Sequence 1 description
+ACDEFGHIKLMNPQTVWY
+>seq2 Sequence 2 description
+ACDEFGHIKLMNPQTVWY
+>seq3 Sequence 3 description
+---EFmnrGHIKLMNPQT---
+\end{cchunk}
+
+A2M format looks a lot like aligned FASTA format. A crucial difference
+is that the aligned sequences in a ``dotless'' A2M file do not
+necessarily all have the same number of characters. The format
+distinguishes between ``consensus columns'' (where residues are in
+upper case and gaps are a dash, `-') and ``insert columns'' (where
+residues are in lower case and gaps are dots, `.', that aren't
+explicitly shown in the format -- hence ``dotless'' A2M). The position
+and number of gaps in insert columns (dots) is implicit in this
+representation. An advantage of this format is its compactness.
+
+This representation only works if all insertions relative to consensus
+are considered to be unaligned characters. That is how insertions are
+handled by profile HMM implementations like SAM and HMMER, and profile
+SCFG implementations like Infernal.
+
+Thus every sequence must have the same number of consensus columns
+(upper case letters plus `-' characters), and may have additional lower
+case letters for insertions.
+
+\subsection{Legal characters}
+
+A2M (and SAM) do not support some special characters such as the `*'
+(not-a-residue) or `\verb+~+' (missing data) characters. Easel outputs these
+characters as gaps: either `-' in a consensus column, or nothing in an
+insert column.
+
+The SAM software parses only a subset of legal ambiguity codes for
+amino acids and nucleotides. For amino acids, it only reads \{BXZ\} in
+addition to the 20 standard one-letter codes. For nucleotides, it only
+reads \{NRY\} in addition to \{ACGTU\}. With one crucial exception, it
+treats all other letters as X or N.
+
+The crucial exception is `O'. SAM reads an `O' as the position of a
+``free insertion module'' (FIM), a concept specific to SAM-style
+profile HMMs. This has no impact on nucleic acid sequences, where `O'
+is not a legal character. But in amino acid sequences, `O' means
+pyrrolysine, one of the unusual genetically-encoded amino acids. This
+means that A2M format alignments must not contain pyrrolysine
+residues, lest they be read as FIMs. For this reason, Easel converts
+`O' residues to `X' when it writes an amino acid alignment in A2M
+format.
+
+\subsection{Determining consensus columns}
+
+Writing A2M format requires knowing which alignment columns are
+supposed to be considered consensus and which are considered
+inserts. If the alignment was produced by HMMER or Infernal, then the
+alignment has so-called ``reference annotation'' (what appears as a
+\verb+#=GC RF+ line in Stockholm format) marking the consensus
+columns.
+
+Often, an alignment has no reference annotation; for example, if it
+has been read from an alignment format that has no reference
+annotation line (only Stockholm and SELEX formats support reference
+annotation). In this case, Easel internally generates a ``reasonable''
+guess at consensus columns, using essentially the same procedure that
+HMMER's \prog{hmmbuild} program uses by default: sequence fragments
+(sequences $<$50\% of the mean sequence length in the alignment
+overall) are ignored, and for the remaining sequences, any column
+containing $\geq$ 50\% residues is considered to be a consensus
+column.
+
+
+
+
+
+
+
+
+
+
diff --git a/documentation/format_ncbi.tex b/documentation/format_ncbi.tex
new file mode 100644
index 0000000..bc91b96
--- /dev/null
+++ b/documentation/format_ncbi.tex
@@ -0,0 +1,271 @@
+
+The NCBI BLAST databases are generated by the program \emph{formatdb}.
+The three files needed by Easel are index file, sequence file
+and header file.For protein databases these files end with the extension
+".pin", ".psq" and ".phr" respectively. For DNA databases the
+extensions are ".nin", ".nsq" and ".nhr" respectively. The index
+file contains information about the database, i.e. version number,
+database type, file offsets, etc. The sequence file contains residues
+for each of the sequences. Finally, the header file contains the header
+information for each of the sequences. This document describes the
+structure of the NCBI version 4 database.
+
+If these files cannot be found, an alias file, extensions ".nal" or
+ ".pal", is processed. The alias file is used to specify multiple
+volumes when databases are larger than 2 GB.
+
+
+\subsection{Index File (*.pin, *.nin)}
+
+The index file contains format information about the database. The
+layout of the version 4 index file is below:
+
+\bigskip
+\begin{center}
+\begin{tabular}{|l|l|p{3.5in}|} \hline
+Version &
+Int32 &
+Version number. \\ \hline
+Database type &
+Int32 &
+0-DNA 1-Protein. \\ \hline
+Title length &
+Int32 &
+Length of the title string (\emph{T}). \\ \hline
+Title &
+Char[\emph{T}] &
+Title string. \\ \hline
+Timestamp length &
+Int32 &
+Length of the timestamp string (\emph{S}). \\ \hline
+Timestamp &Char[\emph{S}] &
+Time of the database creation. The length of the timestamp \emph{S} is
+increased to force 8 byte alignment of the remaining integer
+fields. The timestamp is padded with NULs to achieve this alignment. \\ \hline
+Number of sequences &
+Int32 &
+Number of sequences in the database (\emph{N}) \\ \hline
+Residue count &
+Int64 &
+Total number of residues in the database. Note: Unlike other integer
+fields, this field is stored in little endian. \\ \hline
+Maximum sequence &
+Int32 &
+Length of the longest sequence in the database \\ \hline
+Header offset table &
+Int32[\emph{N+1}] &
+Offsets into the sequence's header file (*.phr, *nhr). \\ \hline
+Sequence offset table &
+Int32[\emph{N+1}] &
+Offsets into the sequence's residue file (*.psq, *.nsq). \\ \hline
+Ambiguity offset table &
+Int32[\emph{N+1}] &
+Offset into the sequence's residue file (*.nsq). Note: This table is only
+in DNA databases. If the sequence does not have any ambiguity
+residues, then the offset points to the beginning of the next
+sequence. \\ \hline
+\end{tabular}
+\end{center}
+\bigskip
+
+The integer fields
+are stored in big endian format, except for the residue count which is
+stored in little endian. The two string fields, timestamp and title
+are preceded by a 32 bit length field. The title string is not NUL
+terminated. If the end of the timestamp field does not end on an offset
+that is a multiple of 8 bytes, NUL characters are padded to the end of
+the string to bring it to a multiple of 8 bytes. This forces all the
+following integer fields to be aligned on a 4-byte boundary for
+performance reasons. The length of the timestamp field reflects the
+NUL padding if any. The header offset table is a list of offsets to
+the beginning of each sequence's header. These are offsets into
+the header file (*.phr, *.nhr). The size of the header can be
+calculated by subtracting the offset of the next header from the
+current header.
+The sequence offset table is a list of offsets to
+the beginning of each sequence's residue data. These are offsets into
+the sequence file (*.psq, *.nsq). The size of the sequence can be
+calculated by subtracting the offset of the next sequence from the
+current sequence.
+Since one more offset is stored than the number
+of sequences in the database, no special code is needed in calculating
+the header size or sequence size for the last entry in the database.
+
+
+\subsection{Protein Sequence File (*.pin)}
+
+The sequence file contains the sequences, one after another. The
+sequences are in a binary format separated by a NUL byte. Each
+residue is encoded in eight bits.
+
+\bigskip
+\begin{center}
+\begin{tabular}{|c|c|c|c|c|c|c|c|} \hline
+Amino acid & Value & Amino acid & Value & Amino acid & Value & Amino acid & Value \\ \hline
+- & 0 & G & 7 & N & 13 & U & 24 \\ \hline
+A & 1 & H & 8 & O & 26 & V & 19 \\ \hline
+B & 2 & I & 9 & P & 14 & W & 20 \\ \hline
+C & 3 & J & 27 & Q & 15 & X & 21 \\ \hline
+D & 4 & K & 10 & R & 16 & Y & 22 \\ \hline
+E & 5 & L & 11 & S & 17 & Z & 23 \\ \hline
+F & 6 & M & 12 & T & 18 & * & 25 \\ \hline
+\end{tabular}
+\end{center}
+
+
+\subsection{DNA Sequence File (*.nsq)}
+
+The sequence file contains the sequences, one after another. The
+sequences are in a binary format but unlike the protein sequence
+file, the sequences are not separated by a NUL byte. The
+sequence is first compressed using two bits per residue then
+followed by an ambiguity correction table if
+necessary. If the sequence does not have an ambiguity table,
+the sequence's ambiguity index points to the beginning of the
+next sequence.
+
+\subsubsection{Two-bit encoding}
+
+The sequence is encoded first using two bits per nucleotide.
+
+\bigskip
+\begin{center}
+\begin{tabular}{|c|c|c|} \hline
+Nucleotide & Value & Binary \\ \hline
+A & 0 & 00 \\ \hline
+C & 1 & 01 \\ \hline
+G & 2 & 10 \\ \hline
+T or U & 3 & 11 \\ \hline
+\end{tabular}
+\end{center}
+\bigskip
+
+Any
+ambiguous residues are replaced by an 'A', 'C', 'G' or 'T' in
+the two bit encoding. To calculate the number of residues
+in the sequence, the least significant two bits in the
+last byte of the sequence needs to be examined.
+These last two bits indicate how many residues, if any, are
+encoded in the most significant bits of the last byte.
+
+
+\subsubsection{Ambiguity Table}
+
+To correct a sequence containing any degenerate residues, an
+ambiguity table follows the two bit encoded string.
+The start of the ambiguity table is
+pointed to by the ambiguity table index in the index file,
+"*.nin". The first four bytes contains the number of 32 bit
+words in the correction table. If the most significant bit
+is set in the count, then two 32 bit entries will be used for
+each correction.
+The 64 bit entries are used for sequence with
+more than 16 million residues. Each correction contains three
+pieces of
+information, the actual encoded nucleotide, how many nucleotides
+in the sequence are replaced by the correct nucleotide and finally
+the offset into the sequences to apply the correction.
+
+For 32 bit
+entries, the first 4 most significant bits encodes the nucleotide.
+Their bit pattern is
+true of their representation, i.e. the value of 'H' is equal
+to ('A'~or~'T'~or~'C').
+
+\bigskip
+\begin{center}
+\begin{tabular}{|c|c|c|c|c|c|c|c|} \hline
+Nucleotide & Value & Nucleotide & Value & Nucleotide & Value & Nucleotide & Value \\ \hline
+- & 0 & G & 4 & T & 8 & K & 12 \\ \hline
+A & 1 & R & 5 & W & 9 & D & 13 \\ \hline
+C & 2 & S & 6 & Y & 10 & B & 14 \\ \hline
+M & 3 & V & 7 & H & 11 & N & 15 \\ \hline
+\end{tabular}
+\end{center}
+\bigskip
+
+The next field is the repeat count which is four bits wide.
+One is added to the count giving it the range of 1 -- 256.
+The last 24 bits is the offset into the sequence where the
+replacement starts. The first residue start at offset zero,
+the second at offset one, etc. With a 24 bit size, the offset
+can only address sequences around 16 million residues long.
+
+To address larger sequences, 64 bit
+entries are used. For 64 bit entries, the order of the entries stays the same,
+but their sizes change. The nucleotide remains at four bits.
+The repeat count is increased to 12 bits giving it the range
+of 1 -- 4096. The offset size is increased to 48 bits.
+
+
+\subsection{Header File (*.phr, *.nhr)}
+
+The header file contains the headers for each sequence, one after another.
+The sequences are in a binary encoded ASN.1 format. The length
+of a header can be calculated by subtracting the offset of the
+next sequence from the current sequence offset. The ASN.1 definition
+for the headers can be found in the NCBI toolkit in the following
+files: asn.all and fastadl.asn.
+
+The parsing of the header can be done with a simple recursive
+descent parser. The five basic types defined in the header are:
+
+\begin{itemize}
+\item Integer -- a variable length integer value.
+\item VisibleString -- a variable length string.
+\item Choice -- a union of one or more alternatives.
+\item Sequence -- an ordered collection of one or more types.
+\item SequenceOf -- an ordered collection of zero or more occurrences
+of a given type.
+\end{itemize}
+
+\subsubsection{Integer}
+
+The first byte of an encoded integer is a hex \verb+02+. The next byte
+is the number of bytes used to encode the integer value. The
+remaining bytes are the actual value. The value is encoded
+most significant byte first.
+
+\subsubsection{VisibleString}
+
+The first byte of a visible string is a hex \verb+1A+.
+The next byte
+starts encoding the length of the string. If the most
+significant bit is off, then the lower seven bits encode the
+length of the string, i.e. the string has a length less than 128.
+If the most significant bit is on, then
+the lower seven bits is the number of bytes that hold the length of
+the string, then the bytes encoding the string length, most significant
+bytes first.
+Following the length are the actual string characters.
+The strings are not NUL terminated.
+
+\subsubsection{Choice}
+
+
+The first byte indicates which selection of the choice. The choices
+start with a hex value \verb+A0+ for the first item, \verb+A1+ for
+the second, etc.
+The selection is followed by a hex \verb+80+. Two NUL bytes follow
+the choice.
+
+\subsubsection{Sequence}
+
+The first two bytes are a hex \verb+3080+. The header is
+then followed by
+the encoded sequence types. The first two bytes indicates which type
+of the sequence is encoded. This index starts with the hex value
+\verb+A080+
+for the first item, \verb+A180+ for the second, etc. then
+followed by the
+encoded item and finally two NUL bytes, \verb+0000+, to indicate the end
+of that type. The next type in the sequence is then encoded. If an
+item is optional and is not defined, then none of it is encoded
+including the index and NUL bytes. This is repeated until the entire
+sequence has been encoded. Two NUL bytes then mark the end of the
+sequence.
+
+\subsubsection{SequenceOf}
+
+The first two bytes are a hex \verb+3080+. Then the lists of objects are
+encoded. Two NUL bytes encode the end of the list.
diff --git a/documentation/format_stockholm.tex b/documentation/format_stockholm.tex
new file mode 100644
index 0000000..04c58b7
--- /dev/null
+++ b/documentation/format_stockholm.tex
@@ -0,0 +1,252 @@
+
+Stockholm format was developed by the Pfam Consortium to support
+extensible markup and annotation of multiple sequence alignments.
+
+Why yet another alignment file format? Most importantly, the existing
+formats of popular multiple alignment software (e.g. CLUSTAL, GCG MSF,
+PHYLIP) do not support rich documentation and markup of the
+alignment. And since there is not yet a standard accepted format for
+multiple sequence alignment files, we don't feel too guilty about
+inventing a new one.
+
+\subsection{A minimal Stockholm file}
+\begin{cchunk}
+# STOCKHOLM 1.0
+
+seq1 ACDEF...GHIKL
+seq2 ACDEF...GHIKL
+seq3 ...EFMNRGHIKL
+
+seq1 MNPQTVWY
+seq2 MNPQTVWY
+seq3 MNPQT...
+//
+\end{cchunk}
+
+The first line in the file must be \ccode{\# STOCKHOLM x.y}, where
+\ccode{x.y} is a major/minor version number for the format
+specification. This line allows a parser to instantly identify the
+file format. There is currently only one version of Stockholm format,
+\ccode{1.0}.
+
+In the alignment, each line contains a name followed by the aligned
+sequence. Neither the name nor the aligned sequence may contain
+whitespace characters. Stockholm does not enforce any other character
+conventions on the name or the aligned sequence. Typically, gaps
+(indels) are indicated in an aligned sequence by a dash or period, but
+Stockholm format does not require this.
+
+If the alignment is too long to fit on one line, the alignment may be
+split into multiple blocks, with blocks separated by blank lines. The
+number of sequences, their order, and their names must be the same in
+every block. Within a given block, each (sub)sequence (and any
+associated \ccode{\#=GR} and \ccode{\#=GC} markup, see below) is of
+equal length, called the \emph{block length}. Block lengths may differ
+from block to block; the block length must be at least one residue,
+and there is no maximum.
+
+Any line starting with a \ccode{\#} is considered to be a comment, and
+is ignored.
+
+Other blank lines in the file are ignored.
+
+All other annotation is added using a tag/value comment style. The
+tag/value format is inherently extensible, and readily made
+backwards-compatible; unrecognized tags will simply be ignored. Extra
+annotation includes consensus and individual RNA or protein secondary
+structure, sequence weights, a reference coordinate system for the
+columns, and database source information including name, accession
+number, and coordinates (for subsequences extracted from a longer
+source sequence) See below for details.
+
+It is usually easy to convert other alignment formats into a least
+common denominator Stockholm format. For instance, SELEX, GCG's MSF
+format, and the output of the CLUSTALW multiple alignment program are
+all closely related interleaved formats.
+
+
+
+\subsection{Syntax of Stockholm markup}
+
+There are four types of Stockholm markup annotation, for per-file,
+per-sequence, per-column, and per-residue annotation:
+
+\begin{sreitems}{\emcode{\#=GR <seqname> <tag> <.....s.....>}}
+\item [\emcode{\#=GF <tag> <s>}]
+ Per-file annotation. \ccode{<s>} is a free format text line
+ of annotation type \ccode{<tag>}. For example, \ccode{\#=GF DATE
+ April 1, 2000}. Can occur anywhere in the file, but usually
+ all the \ccode{\#=GF} markups occur in a header.
+
+\item [\emcode{\#=GS <seqname> <tag> <s>}]
+ Per-sequence annotation. \ccode{<s>} is a free format text line
+ of annotation type \ccode{<tag>} associated with the sequence
+ named \ccode{<seqname>}. For example, \ccode{\#=GS seq1
+ SPECIES\_SOURCE Caenorhabditis elegans}. Can occur anywhere
+ in the file, but in single-block formats (e.g. the Pfam
+ distribution) will typically follow on the line after the
+ sequence itself, and in multi-block formats (e.g. HMMER
+ output), will typically occur in the header preceding the
+ alignment but following the \ccode{\#=GF} annotation.
+
+\item [\emcode{\#=GC <tag> <..s..>}]
+ Per-column annotation. \ccode{<..s..>} is an aligned text line
+ of annotation type \ccode{<tag>}.
+ \ccode{\#=GC} lines are
+ associated with a sequence alignment block; \ccode{<..s..>}
+ is aligned to the residues in the alignment block, and has
+ the same length as the rest of the block.
+ Typically \ccode{\#=GC} lines are placed at the end of each block.
+
+\item [\emcode{\#=GR <seqname> <tag> <..s..>}]
+ Per-residue annotation. \ccode{<..s..>} is an aligned text line
+ of annotation type \ccode{<tag>}, associated with the sequence
+ named \ccode{<seqname>}.
+ \ccode{\#=GR} lines are
+ associated with one sequence in a sequence alignment block;
+ \ccode{<..s..>}
+ is aligned to the residues in that sequence, and has
+ the same length as the rest of the block.
+ Typically
+ \ccode{\#=GR} lines are placed immediately following the
+ aligned sequence they annotate.
+\end{sreitems}
+
+\subsection{Semantics of Stockholm markup}
+
+Any Stockholm parser will accept syntactically correct files, but is
+not obligated to do anything with the markup lines. It is up to the
+application whether it will attempt to interpret the meaning (the
+semantics) of the markup in a useful way. At the two extremes are the
+Belvu alignment viewer and the HMMER profile hidden Markov model
+software package.
+
+Belvu simply reads Stockholm markup and displays it, without trying to
+interpret it at all. The tag types (\ccode{\#=GF}, etc.) are sufficient
+to tell Belvu how to display the markup: whether it is attached to the
+whole file, sequences, columns, or residues.
+
+HMMER uses Stockholm markup to pick up a variety of information from
+the Pfam multiple alignment database. The Pfam consortium therefore
+agrees on additional syntax for certain tag types, so HMMER can parse
+some markups for useful information. This additional syntax is imposed
+by Pfam, HMMER, and other software of mine, not by Stockholm format
+per se. You can think of Stockholm as akin to XML, and what my
+software reads as akin to an XML DTD, if you're into that sort of
+structured data format lingo.
+
+The Stockholm markup tags that are parsed semantically by my software
+are as follows:
+
+\subsubsection{Recognized \#=GF annotations}
+\begin{sreitems}{\emcode{TC <f> <f>}}
+\item [\emcode{ID <s>}]
+ Identifier. \ccode{<s>} is a name for the alignment;
+ e.g. ``rrm''. One word. Unique in file.
+
+\item [\emcode{AC <s>}]
+ Accession. \ccode{<s>} is a unique accession number for the
+ alignment; e.g.
+ ``PF00001''. Used by the Pfam database, for instance.
+ Often a alphabetical prefix indicating the database
+ (e.g. ``PF'') followed by a unique numerical accession.
+ One word. Unique in file.
+
+\item [\emcode{DE <s>}]
+ Description. \ccode{<s>} is a free format line giving
+ a description of the alignment; e.g.
+ ``RNA recognition motif proteins''. One line. Unique in file.
+
+\item [\emcode{AU <s>}]
+ Author. \emcode{<s>} is a free format line listing the
+ authors responsible for an alignment; e.g.
+ ``Bateman A''. One line. Unique in file.
+
+\item [\emcode{GA <f> <f>}]
+ Gathering thresholds. Two real numbers giving HMMER bit score
+ per-sequence and per-domain cutoffs used in gathering the
+ members of Pfam full alignments. See Pfam and HMMER
+ documentation for more detail.
+
+\item [\emcode{NC <f> <f>}]
+ Noise cutoffs. Two real numbers giving HMMER bit score
+ per-sequence and per-domain cutoffs, set according to the
+ highest scores seen for unrelated sequences when gathering
+ members of Pfam full alignments. See Pfam and HMMER
+ documentation for more detail.
+
+\item [\emcode{TC <f> <f>}]
+ Trusted cutoffs. Two real numbers giving HMMER bit score
+ per-sequence and per-domain cutoffs, set according to the
+ lowest scores seen for true homologous sequences that
+ were above the GA gathering thresholds, when gathering
+ members of Pfam full alignments. See Pfam and HMMER
+ documentation for more detail.
+\end{sreitems}
+
+\subsection{Recognized \#=GS annotations}
+
+\begin{sreitems}{\emcode{WT <f>}}
+\item [\emcode{WT <f>}]
+ Weight. \ccode{<f>} is a nonnegative real number giving the
+ relative weight for a sequence, usually used to compensate
+ for biased representation by downweighting similar sequences.
+ Usually the weights average 1.0 (e.g. the weights sum to
+ the number of sequences in the alignment) but this is not
+ required. Either every sequence must have a weight annotated,
+ or none of them can.
+
+\item [\emcode{AC <s>}]
+ Accession. \ccode{<s>} is a database accession number for
+ this sequence. (Contrast to \ccode{\#=GF AC} markup, which gives
+ an accession for the whole alignment.) One word.
+
+\item [\emcode{DE <s>}]
+ Description. \ccode{<s>} is one line giving a description for
+ this sequence. (Contrast to \ccode{\#=GF DE} markup, which gives
+ a description for the whole alignment.)
+\end{sreitems}
+
+
+\subsection{Recognized \#=GC annotations}
+
+\begin{sreitems}{\emcode{SA\_cons}}
+\item [\emcode{RF}]
+ Reference line. Any character is accepted as a markup for a
+ column. The intent is to allow labeling the columns with some
+ sort of mark.
+
+\item [\emcode{SS\_cons}]
+ Secondary structure consensus. For protein
+ alignments, DSSP codes or gaps are accepted as markup:
+ \ccode{[HGIEBTSCX.-\_]}, where H is alpha helix, G is
+ 3/10-helix, I is p-helix, E is extended strand, B is a residue
+ in an isolated b-bridge, T is a turn, S is a bend, C is a
+ random coil or loop, and X is unknown (for instance, a residue
+ that was not resolved in a crystal structure). For RNA
+ alignments, the annotation is in WUSS format. Minimally, the
+ symbols \ccode{<} and \ccode{>} indicate a base pair,
+ \ccode{.} indicate single-stranded positions, and RNA
+ pseudoknots are represented by alphabetic characters, with
+ upper case letters representing the 5' side of the helix and
+ lower case letters representing the 3' side. Note that this
+ limits the annotation to a maximum of 26 pseudoknots per
+ sequence.
+
+\item [\emcode{SA\_cons}]
+ Surface accessibility consensus. 0-9, gap symbols, or X are
+ accepted as markup. 0 means $<$10\% accessible residue surface
+ area, 1 means $<$20\%, 9 means $<$100\%, etc. X means unknown
+ structure.
+\end{sreitems}
+
+\subsection{Recognized \#=GR annotations}
+
+\begin{sreitems}{\emcode{SA}}
+\item [\emcode{SS}]
+ Secondary structure consensus. See \ccode{\#=GC SS\_cons} above.
+\item [\emcode{SA}]
+ Surface accessibility consensus. See \ccode{\#=GC SA\_cons} above.
+\end{sreitems}
+
+
diff --git a/documentation/format_wuss.tex b/documentation/format_wuss.tex
new file mode 100644
index 0000000..f5c2ccf
--- /dev/null
+++ b/documentation/format_wuss.tex
@@ -0,0 +1,216 @@
+% Expects to be a section; whoever is including must
+% provide section header.
+
+Easel supports RNA secondary structure annotation using a linear
+string representation called ``WUSS notation'' (Washington University
+Secondary Structure notation), as originally developed for Infernal
+and the Rfam database.
+
+WUSS notation extends the common bracket notation for RNA secondary
+structures, where open- and close-bracket symbols (or parentheses) are
+used to annotate base pairing partners: for example,
+\verb+((((...))))+ indicates a four-base stem with a three-base loop.
+Bracket notation is difficult for humans to look at, for anything much
+larger than a simple stem-loop. WUSS notation makes it somewhat easier
+to interpret the annotation for larger structures -- such as in
+structural alignments output by Infernal.
+
+The following figure shows an example with the key elements of WUSS
+notation. At the top left is an example RNA structure. At the top
+right is the same structure, with different RNA structural elements
+marked. Below is the WUSS notation string for the structure, aligned
+to the sequence.
+
+\begin{center}
+\includegraphics[scale=0.8]{figures/rna_elements}
+\end{center}
+\begin{center}
+\begin{BVerbatim}
+ ::((((,<<<___>>>,,,<<-<<____>>-->>,))-))
+ AACGGAACCAACAUGGAUUCAUGCUUCGGCCCUGGUCGCG
+\end{BVerbatim}
+\end{center}
+
+\subsection{Full (output) WUSS notation}
+
+In detail, symbols used by WUSS notation in \emph{output} structure
+annotation strings are as follows:
+
+\begin{sreitems}{\textbf{Bulge, interior loops}}
+\item[\textbf{Base pairs}]
+ Base pairs are annotated by nested matching pairs of symbols
+ \verb+<>+, \verb+()+, \verb+[]+, or \verb+{}+.
+ The different symbols indicate the ``depth'' of the
+ helix in the RNA structure as follows:
+ \verb+<>+ are used for simple terminal stems;
+ \verb+()+ are used for ``internal'' helices enclosing a multifurcation of
+ all terminal stems; \verb+[]+ are used for internal helices
+ enclosing a multifurcation that includes at least one annotated
+ \verb+()+ stem already; and \verb+{}+ are used for all internal
+ helices enclosing deeper multifurcations.
+
+\item[\textbf{Hairpin loops}]
+ Hairpin loop residues are indicated by underscores, \verb+_+.
+ Simple stem loops stand out as, e.g.\ \verb+<<<<____>>>>+.
+
+\item[\textbf{Bulge, interior loops}]
+ Bulge and interior loop residues are indicated by dashes, \verb+-+.
+
+\item[\textbf{Multifurcation loops}]
+ Multifurcation loop residues are indicated by commas, \verb+,+.
+ The mnemonic is ``stem 1, stem2'', e.g.\ \verb+<<<___>>>,,<<<___>>>+.
+
+\item[\textbf{External residues}]
+ Unstructured single stranded residues completely outside the
+ structure (unenclosed by any base pairs) are annotated by
+ colons, \verb+:+.
+
+\item[\textbf{Insertions}]
+ Insertions relative to a known structure are indicated by periods,
+ \verb+.+. Regions where local structural alignment was invoked,
+ leaving regions of both target and query sequence unaligned,
+ are indicated by tildes, \verb+~+. These symbols only appear in
+ alignments of a known (query) structure annotation to a target
+ sequence of unknown structure.
+
+\item[\textbf{Pseudoknots}]
+ WUSS notation allows pseudoknots to be annotated as pairs of
+ upper case/lower case letters: for example,
+ \verb+<<<<_AAAA____>>>>aaaa+ annotates a simple pseudoknot;
+ additional pseudoknotted stems could be annotated by \verb+Bb+,
+ \verb+Cc+, etc.
+
+ This is not a fully general notation. It is possible to come up with
+ pseudoknotted structures that could not be represented with 26
+ levels of nesting ($>$26th order pseudoknot, in the sense of
+ \citep{RivasEddy99}). However, it is unlikely you will ever see one
+ in nature. I believe the highest order pseudoknot known is the S1
+ (alpha operon) pseudoknot, which is 3rd order.
+\end{sreitems}
+
+An example of WUSS notation for a complicated structure
+(\emph{E. coli} RNase P) is shown in Figure~\ref{fig:RNaseP}. An
+example of WUSS notation for a local alignment of \emph{B. subtilis}
+RNase P to \emph{E. coli} RNase P, illustrating the use of local
+alignment annotation symbols, is in Figure~\ref{fig:bsu-alignment}.
+
+\begin{figure}[tp]
+\begin{center}
+\includegraphics[scale=0.6]{figures/rnaseP-ecoli}
+\end{center}
+\begin{center}
+{\scriptsize
+\begin{BVerbatim}
+ {{{{{{{{{{{{{{{{{{,<<<<<<<<<<<<<-<<<<<____>>>>>>>>>->>>>>>>>
+ 1 GAAGCUGACCAGACAGUCGCCGCUUCGUCGUCGUCCUCUUCGGGGGAGACGGGCGGAGGG 60
+
+ >,,,,AAA-AAAAA[[[[---BBBB-[[[[[<<<<<_____>>>>><<<<____>>>->(
+ 61 GAGGAAAGUCCGGGCUCCAUAGGGCAGGGUGCCAGGUAACGCCUGGGGGGGAAACCCACG 120
+
+ (---(((((,,,,,,,,,,,,<<<<<--<<<<<<<<____>>>>>->>>>>>-->>,,,,
+ 121 ACCAGUGCAACAGAGAGCAAACCGCCGAUGGCCCGCGCAAGCGGGAUCAGGUAAGGGUGA 180
+
+ ,,,<<<<<<_______>>>>>><<<<<<<<<____>>>->>>>>->,,)))--))))]]]
+ 181 AAGGGUGCGGUAAGAGCGCACCGCGCGGCUGGUAACAGUCCGUGGCACGGUAAACUCCAC 240
+
+ ]]]]]],,,<<<<------<<<<<<----<<<<<_bbbb>>>>>>>>>>>----->>>>,
+ 241 CCGGAGCAAGGCCAAAUAGGGGUUCAUAAGGUACGGCCCGUACUGAACCCGGGUAGGCUG 300
+
+ ,,,,,<<<<<<<<____>>>>>>>>,,,,,,,,,,}}}}}}}----------aaaaaaaa
+ 301 CUUGAGCCAGUGAGCGAUUGCUGGCCUAGAUGAAUGACUGUCCACGACAGAACCCGGCUU 360
+
+ -}-}}}}}}}}}}::::
+ 361 AUCGGUCAGUUUCACCU 377
+\end{BVerbatim}
+}
+\end{center}
+\caption{\small \textbf{Example of WUSS notation.} Top: Secondary
+structure of \emph{E. coli} RNase P, from Jim Brown's RNase P database
+\citep{Brown99}. Bottom: WUSS notation for the same structure,
+annotating the \emph{E. coli} RNase P sequence. Note that the P4 and P6
+pseudoknots are annotated, as A's and B's.}
+\label{fig:RNaseP}
+\end{figure}
+
+\begin{figure}[tp]
+\begin{center}
+\includegraphics[scale=0.6]{figures/rnaseP-bsu-alignment}
+\end{center}
+\begin{center}
+{\scriptsize
+\begin{BVerbatim}
+hit 0 : 4 399 52.56 bits
+ {{{{{{{{{{{{{{{{{{,<<<<<<<<<<<<<-<<<<<____>>>>>>>>>->>>>>>>>
+ 1 ggAGuggGgcaGgCaguCGCugcuucggccuuGuucaguuaacugaaaaggAccgaagga 60
+ +: :::G::C:GG:A:UCGCU+C:::: U+ ::::G+A
+ 4 CUUAACGUUCGGGUAAUCGCUGCAGAUC-----------UUG----------AAUCUGUA 42
+
+ >,,,,,,,,,,,,,[[[.[--------[[[[[~~~~~~~((---(((((,,,,~~~~~~)
+ 61 GAGGAAAGUCCGGGCUC.CACAGGGCAgGGUG*[ 29]*GGAAAGUGCCACAG*[96]*G 229
+ GAGGAAAGUCC GCUC C A GG :G G :GAAAGUGCCACAG G
+ 43 GAGGAAAGUCCAUGCUCgC--ACGGUGCUGAG*[102]*UGAAAGUGCCACAG*[37]*G 226
+
+ ))--))))]]]]]].]]],,,~~~~~~,,,,,,,,,,}}}}}}}--..............
+ 230 GUAAACCCCACCcG.GAGCAA*[77]*CuAGAUGAAUGacuGcCCA.............. 344
+ GUAAACC:C C: G GAG AA UAGAU++AUGA:U:CC
+ 227 GUAAACCCCUCGAGcGAGAAA*[64]*GUAGAUAGAUGAUUGCC--gccugaguacgagg 342
+
+ ..........................-----------------}-}}}}}}}}}}::::
+ 345 ..........................CGACAGAACCCGGCUUAuagcCccaCUccucuu 377
+ ACA AAC GGCUUA:AG::C::: :+ C
+ 343 ugaugagccguuugcaguacgaugga--ACAAAACAUGGCUUACAGAACGUUAGACCAC 399
+\end{BVerbatim}
+}
+\end{center}
+\caption{\small \textbf{Local alignment annotation example.} Top:
+Secondary structure of \emph{B. subtilis} RNase P, from Jim Brown's
+RNase P database \citep{Brown99}. Residues in red are those that
+Infernal aligns to a CM of \emph{E. coli} type RNase
+P's. The local structural alignment is in four pieces; three regions
+of the structure (102, 37, and 64 nt long) are skipped over. One
+additional stem is treated as a 40 nt insertion. Bottom: the
+Infernal output, showing the \emph{E. coli} query structure
+aligned to the \emph{B. subtilis} sequence.}
+\label{fig:bsu-alignment}
+\end{figure}
+
+\subsection{Shorthand (input) WUSS notation}
+
+While WUSS notation makes it easier to visually interpret Infernal
+\emph{output} structural annotation, it would be painful to require
+people to \emph{input} all structures in full WUSS notation. Therefore
+when software like Infernal reads input secondary structure
+annotation, it also allows simpler rules:
+
+\begin{sreitems}{\textbf{Single stranded residues}}
+\item [\textbf{Base pairs}]
+ Any matching nested pair of \verb+()+, \verb+()+, \verb+[]+, \verb+{}+
+ symbols indicates a base pair; the exact choice of symbol has no
+ meaning, so long as the left and right partners match up.
+ Similarly, pseudoknotted pairs can also be annotated by matching nested
+ pairs of any alphabet character, such as \verb+Aa+, \verb+Bb+, etc.
+
+\item [\textbf{Single stranded residues}]
+ All other symbols \verb+_-,:.~+
+ indicate single stranded residues.
+ The choice of symbol has no special meaning.
+ Annotated pseudoknots (nested matched pairs of upper/lower case
+ alphabetic characters) are also interpreted as single
+ stranded residues in Infernal input.
+\end{sreitems}
+
+Thus, for instance, \verb+<<<<....>>>>+ and \verb+((((____))))+ and
+\verb+<(<(._._)>)>+ all indicate a four base stem with a four base
+loop (the last example is legal but weird).
+
+Remember that the key property of canonical (nonpseudoknotted) RNA
+secondary structure is that the pairs are \emph{nested}.
+\verb+((<<....))>>+ is not a legal annotation string: the pair symbols
+don't match up properly.
+
+Because many other RNA secondary structure analysis programs use a
+simple bracket notation for annotating structure, the ability to input
+the simple format makes it easier to use data generated by other RNA
+software packages. Conversely, converting output WUSS notation to
+simple bracket notation is a matter of a simple Perl or sed script,
+substituting the symbols appropriately.
diff --git a/documentation/install.tex b/documentation/install.tex
new file mode 100644
index 0000000..aab3908
--- /dev/null
+++ b/documentation/install.tex
@@ -0,0 +1,18 @@
+
+\subsection{Make targets}
+
+\begin{description}
+
+\item[\emcode{make clean}]
+
+Deletes all files created by \ccode{make}, such as \ccode{.o} files
+and executables; also deletes files normally created in editing the
+source, such as emacs \ccode{~} files and \ccode{TAGS}.
+
+
+
+
+
+
+
+
diff --git a/documentation/installation.tex b/documentation/installation.tex
new file mode 100644
index 0000000..a716fb4
--- /dev/null
+++ b/documentation/installation.tex
@@ -0,0 +1,5 @@
+\label{chapter:installation}
+
+\subsection{Configuration options}
+
+
diff --git a/documentation/intro.tex b/documentation/intro.tex
new file mode 100644
index 0000000..1a7c2df
--- /dev/null
+++ b/documentation/intro.tex
@@ -0,0 +1,416 @@
+
+
+\Easel\ is a C code library for computational analysis of biological
+sequences using probabilistic models. \Easel\ is used by \HMMER\
+\citep{hmmer,Eddy98}, the profile hidden Markov model software that
+underlies the \Pfam\ protein family database
+\citep{Finn06,Sonnhammer97} and several other protein family
+databases. \Easel\ is also used by \Infernal\
+\citep{infernal,NawrockiEddy07}, the covariance model software that
+underlies the \Rfam\ RNA family database
+\citep{Griffiths-Jones05}.
+
+There are other biosequence analysis libraries out there, in a variety
+of languages
+\citep{Vahrson96,Pitt01,Mangalam02,Butt05,Dutheil06,Giancarlo07,Doring08};
+but this is ours. \Easel\ is not meant to be comprehensive. \Easel
+is for supporting what's needed in our group's work on probabilistic
+modeling of biological sequences, in applications like \HMMER\ and
+\Infernal. It includes code for generative probabilistic models of
+sequences, phylogenetic models of evolution, bioinformatics tools for
+sequence manipulation and annotation, numerical computing, and some
+basic utilities.
+
+\Easel\ is written in ANSI/ISO C because its primary goals are high
+performance and portability. Additionally, \Easel\ aims to provide an
+ease of use reasonably close to Perl or Python code.
+
+\Easel\ is designed to be reused, but not only as a black box. I might
+use a black box library for routine functions that are tangential to
+my research, but for anything research-critical, I want to understand
+and control the source code. It's rational to treat reusing other
+people's code like using their toothbrush, because god only knows what
+they've done to it. For me, code reuse more often means acting like a
+magpie, studying and stealing shiny bits of other people's source
+code, and weaving them into one's own nest. \Easel\ is designed so you
+can easily pull useful baubles from it.
+
+\Easel\ is also designed to enable us to publish reproducible and
+extensible research results as supplementary material for our research
+papers. We put work into documenting \Easel\ as carefully as any other
+research data we distribute.
+
+These considerations are reflected in \Easel design decisions.
+\Easel's documentation includes tutorial examples to make it easy to
+understand and get started using any given \Easel\ module, independent
+of other parts of \Easel. \Easel\ is modular, in a way that should
+enable you to extract individual files or functions for use in your
+own code, with minimum disentanglement work. \Easel\ uses some
+precepts of object-oriented design, but its objects are just C
+structures with visible, documented contents. \Easel's source code is
+consciously designed to be read as a reference work. It reflects, in a
+modest way, principles of ``literate programming'' espoused by Donald
+Knuth. \Easel\ code and documentation are interwoven. Most of this
+book is automatically generated from \Easel's source code.
+
+
+
+\section{Quick start}
+
+Let's start with a quick tour. If you have any experience with the
+variable quality of bioinformatics software, the first thing you want
+to know is you can get Easel compiled -- without having to install a
+million dependencies first. The next thing you'll want to know is
+whether \Easel\ is going to be useful to you or not. We'll start with
+compiling it. You can compile \Easel\ and try it out without
+permanently installing it.
+
+
+
+\subsection{Downloading and compiling Easel for the first time}
+
+Easel is self-sufficient, with no dependencies other than what's
+already on your system, provided you have an ANSI C99 compiler
+installed. You can obtain an \Easel\ source tarball and compile it
+cleanly on any UNIX, Linux, or Mac OS/X operating system with an
+incantation like the following (where \ccode{xxx} will be the current
+version number):
+
+\begin{cchunk}
+% wget http://eddylab.org/easel/easel.tar.gz
+% tar zxf easel.tar.gz
+% cd easel-xxx
+% ./configure
+% make
+% make check
+\end{cchunk}
+
+The \ccode{make check} command is optional. It runs a battery of
+quality control tests. All of these should pass. You should now see
+\ccode{libeasel.a} in the directory. If you look in the directory
+\ccode{miniapps}, you'll also see a bunch of small utility programs,
+the \Easel\ ``miniapps''.
+
+There are more complicated things you can do to customize the
+\ccode{./configure} step for your needs. That includes customizing the
+installation locations. If you decide you want to install
+\Easel\ permanently, see the full installation instructions in
+chapter~\ref{chapter:installation}.
+
+
+
+\subsection{Cribbing from code examples}
+
+Every source code module (that is, each \ccode{.c} file) ends with one
+or more \esldef{driver programs}, including programs for unit tests
+and benchmarks. These are \ccode{main()} functions that can be
+conditionally included when the module is compiled. The very end of
+each module is always at least one \esldef{example driver} that shows
+you how to use the module. You can find the example code in a module
+\eslmod{foo} by searching the \ccode{esl\_foo.c} file for the tag
+\ccode{eslFOO\_EXAMPLE}, or just navigating to the end of the file. To
+compile the example for module \eslmod{foo} as a working program, do:
+
+\begin{cchunk}
+ % cc -o example -L. -I. -DeslFOO_EXAMPLE esl_foo.c -leasel -lm
+\end{cchunk}
+
+You may need to replace the standard C compiler \ccode{cc} with a
+different compiler name, depending on your system. Linking to the
+standard math library (\ccode{-lm}) may not be necessary, depending on
+what module you're compiling, but it won't hurt. Replace \ccode{foo}
+with the name of a module you want to play with, and you can compile
+any of Easel's example drivers this way.
+
+To run it, read the source code (or the corresponding section in this
+book) to see if it needs any command line arguments, like the name of
+a file to open, then:
+
+\begin{cchunk}
+ % ./example <any args needed>
+\end{cchunk}
+
+You can edit the example driver to play around with it, if you like,
+but it's better to make a copy of it in your own file (say,
+\ccode{foo\_example.c}) so you're not changing \Easel's code. When you
+extract the code into a file, copy what's between the \ccode{\#ifdef
+eslFOO\_EXAMPLE} and \ccode{\#endif /*eslFOO\_EXAMPLE*/} flags that
+conditionally include the example driver (don't copy the flags
+themselves). Then compile your example code and link to \Easel\ like
+this:
+
+\begin{cchunk}
+ % cc -o foo_example -L. -I. foo_example.c -leasel -lm
+\end{cchunk}
+
+\subsection{Cribbing from Easel miniapplications}
+
+The \ccode{miniapps} directory contains \Easel's
+\esldef{miniapplications}: several utility programs that \Easel\
+installs, in addition to the library \ccode{libeasel.a} and its header
+files.
+
+The miniapplications are described in more detail later, but for the
+purpose of getting used to how \Easel\ is used, they provide you some
+more useful examples of small \Easel-based applications that are a
+little more complicated than individual module example drivers.
+
+You can probably get a long way into \Easel\ just by browsing the
+source code of the modules' examples and the miniapplications. If
+you're the type (like me) that prefers to learn by example, you're
+done, you can close this book now.
+
+
+
+\section{Overview of Easel's modules}
+
+Possibly your next question is, does \Easel\ provide any functionality
+you're interested in?
+
+Each \ccode{.c} file in \Easel\ corresponds to one \Easel\
+\esldef{module}. A module consists of a group of functions for some
+task. For example, the \eslmod{sqio} module can automatically parse
+many common unaligned sequence formats, and the \eslmod{msa} module
+can parse many common multiple alignment formats.
+
+There are modules concerned with manipulating biological sequences and
+sequence files (including a full-fledged parser for Stockholm multiple
+alignment format and all its complex and powerful annotation markup):
+
+\begin{center}
+\begin{tabular}{p{1in}p{3.7in}}
+\eslmod{sq} & Single biological sequences \\
+\eslmod{msa} & Multiple sequence alignments and i/o \\
+\eslmod{alphabet} & Digitized biosequence alphabets \\
+\eslmod{randomseq}& Sampling random sequences \\
+\eslmod{sqio} & Sequence file i/o \\
+\eslmod{ssi} & Indexing large sequence files for rapid random access \\
+\end{tabular}
+\end{center}
+
+There are modules implementing common operations on multiple sequence
+alignments (including many published sequence weighting algorithms,
+and a memory-efficient single linkage sequence clustering algorithm):
+
+\begin{center}
+\begin{tabular}{p{1in}p{3.7in}}
+\eslmod{msacluster} & Efficient single linkage clustering of aligned sequences by \% identity\\
+\eslmod{msaweight} & Sequence weighting algorithms \\
+\end{tabular}
+\end{center}
+
+There are modules for probabilistic modeling of sequence residue
+alignment scores (including routines for solving for the implicit
+probabilistic basis of arbitrary score matrices):
+
+\begin{center}
+\begin{tabular}{p{1in}p{3.7in}}
+\eslmod{scorematrix} & Pairwise residue alignment scoring systems\\
+\eslmod{ratematrix} & Standard continuous-time Markov models of residue evolution\\
+\eslmod{paml} & Reading PAML data files (including rate matrices)\\
+\end{tabular}
+\end{center}
+
+There is a module for sequence annotation:
+
+\begin{center}
+\begin{tabular}{p{1in}p{3.7in}}
+\eslmod{wuss} & ASCII RNA secondary structure annotation strings\\
+\end{tabular}
+\end{center}
+
+There are modules implementing some standard scientific numerical
+computing concepts (including a free, fast implementation of conjugate
+gradient optimization):
+
+\begin{center}
+\begin{tabular}{p{1in}p{3.7in}}
+\eslmod{vectorops} & Vector operations\\
+\eslmod{dmatrix} & 2D matrix operations\\
+\eslmod{minimizer} & Numerical optimization by conjugate gradient descent\\
+\eslmod{rootfinder}& One-dimensional root finding (Newton/Raphson)\\
+\end{tabular}
+\end{center}
+
+There are modules implementing phylogenetic trees and evolutionary
+distance calculations:
+
+\begin{center}
+\begin{tabular}{p{1in}p{3.7in}}
+\eslmod{tree} & Manipulating phylogenetic trees\\
+\eslmod{distance} & Pairwise evolutionary sequence distance calculations\\
+\end{tabular}
+\end{center}
+
+There are a number of modules that implement routines for many common
+probability distributions (including maximum likelihood fitting
+routines):
+
+\begin{center}
+\begin{tabular}{p{1in}p{3.7in}}
+\eslmod{stats} & Basic routines and special statistics functions\\
+\eslmod{histogram} & Collecting and displaying histograms\\
+\eslmod{dirichlet} & Beta, Gamma, and Dirichlet distributions\\
+\eslmod{exponential} & Exponential distributions\\
+\eslmod{gamma} & Gamma distributions\\
+\eslmod{gev} & Generalized extreme value distributions\\
+\eslmod{gumbel} & Gumbel (Type I extreme value) distributions\\
+\eslmod{hyperexp} & Hyperexponential distributions\\
+\eslmod{mixdchlet} & Mixture Dirichlet distributions and priors\\
+\eslmod{mixgev} & Mixture generalized extreme value distributions\\
+\eslmod{normal} & Normal (Gaussian) distributions\\
+\eslmod{stretchexp} & Stretched exponential distributions\\
+\eslmod{weibull} & Weibull distributions\\
+\end{tabular}
+\end{center}
+
+There are several modules implementing some common utilities
+(including a good portable random number generator and a powerful
+command line parser):
+
+\begin{center}
+\begin{tabular}{p{1in}p{3.7in}}
+\eslmod{cluster} & Efficient single linkage clustering\\
+\eslmod{fileparser} & Parsing simple token-based (tab/space-delimited) files\\
+\eslmod{getopts} & Parsing command line arguments and options.\\
+\eslmod{keyhash} & Hash tables for emulating Perl associative arrays\\
+\eslmod{random} & Pseudorandom number generation and sampling\\
+\eslmod{regexp} & Regular expression matching\\
+\eslmod{stack} & Pushdown stacks for integers, chars, pointers\\
+\eslmod{stopwatch} & Timing parts of programs\\
+\end{tabular}
+\end{center}
+
+There are some specialized modules in support of accelerated and/or parallel computing:
+
+\begin{center}
+\begin{tabular}{p{1in}p{3.7in}}
+\eslmod{sse} & Routines for SSE (Streaming SIMD Intrinsics) vector computation support on Intel/AMD platforms\\
+\eslmod{vmx} & Routines for Altivec/VMX vector computation support on PowerPC platforms\\
+\eslmod{mpi} & Routines for MPI (message passing interface) support\\
+\end{tabular}
+\end{center}
+
+\section{Navigating documentation and source code}
+
+The quickest way to learn about what each module provides is to go to
+the corresponding chapter in this document. Each chapter starts with a
+brief introduction of what the module does, and highlights anything
+that \Easel's implementation does that we think is particularly
+useful, unique, or powerful. That's followed by a table describing
+each function provided by the module, and at least one example code
+listing of how the module can be used. The chapter might then go into
+more detail about the module's functionality, though many chapters do
+not, because the functionality is straightforward or self-explanatory.
+Finally, each chapter ends with detailed documentation on each
+function.
+
+\Easel's source code is designed to be read. Indeed, most of this
+documentation is generated automatically from the source code itself
+-- in particular, the table listing the available functions, the
+example code snippets, and the documentation of the individual
+functions.
+
+Each module \ccode{.c} file starts with a table of contents to help
+you navigate.\footnote{\Easel\ source files are designed as complete
+free-standing documents, so they tend to be larger than most people's
+\ccode{.c} files; the more usual practice in C programming is to have
+a smaller number of functions per file.} The first section will often
+define how to create one or more \esldef{objects} (C structures) that
+the module uses. The next section will typically define the rest of
+the module's exposed API. Following that are any private (internal)
+functions used in the module. Last are the drivers, including
+benchmarks, unit tests, and one or more examples.
+
+Each function has a structured comment header that describes how it is
+called and used, including what arguments it takes, what it returns,
+and what error conditions it may raise. These structured comments are
+extracted for inclusion in this document, so what you read here for
+each function's documentation is identical to what is in the source
+code.
+
+\section{Modularity, reuse, and ``augmentation''}
+
+The usual use of libraries as monolithic black boxes means that users
+have to install one or more third party libraries before installing
+\HMMER\ and \Infernal, or that we would incorporate third party
+libraries into our source trees. Though this isn't too impossible --
+modern software installation tools automate the process of installing
+dependencies, and modern code repository tools like Subversion
+simplify the process of tracking third party code -- it often seems
+awfully burdensome, because in many cases all I want from a third
+party library is a function or two. Biosequence code libraries
+invariably provide a bunch of routines that you could care less about
+(nobody needs another Smith/Waterman algorithm implementation, but
+every library is going to provide one -- \Easel\ is no exception), and
+they invariably use bewilderingly complicated structures or objects
+that you'd rather not have to learn about just to call one little
+calculation that really could have operated on a simple C datatype
+instead (everyone has their own sequence object, full of rich and
+complicated information -- \Easel\ is no exception).
+
+You would normally use \Easel\ as a monolithic C library
+(\ccode{libeasel.a}) that you just link with your code, but \Easel\ is
+also designed to be sufficiently modular that you can grab individual
+source files out of the library and use them directly in your own
+code. For example, to get Easel's sequence file i/o API, for example,
+you can take the sqio module (the C source \ccode{esl\_sqio.c} and the
+header \ccode{esl\_sqio.h}), plus the always-obligatory \Easel\
+foundation (\ccode{easel.c} and \ccode{easel.h}). Many of Easel's
+modules are free-standing, and only depend on the foundation
+\eslmod{easel} module. More complex modules will depend on a few other
+modules, but the total number of modules you have to take to get any
+particular \Easel\ API is always small, because \Easel's dependencies
+are constrained in a hierarchy. Each module's documentation shows its
+required dependencies.
+
+There is necessarily a tradeoff between modularity and power. A fully
+modular design would mean that no Easel module would be able to take
+advantage of functionality in any other module.
+
+To minimize the number of modules you need to take to get some part of
+Easel into your code, \Easel\ uses something it calls
+\esldef{augmentation}. Each module provides a base functionality that
+is as simple as possible, and which depends on as few other modules as
+possible. When more powerful functionality would require additional
+modules, where possible, \Easel\ tries to isolate that functionality
+and make it optional. You need to \emph{augment} the module to
+activate these more powerful optional abilities by providing the
+appropriate modules; or you can just leave the optional modules out
+and use the core functionality. For example, if you use only the
+\eslmod{sqio} module, you get the ability to read unaligned sequence
+files like FASTA or GenBank; but if you augment \eslmod{sqio} with the
+\eslmod{msa} multiple alignment module, you gain the ability to read
+individual sequences from multiple alignment files sequentially. At
+compile-time, you declare (by means of \ccode{\#define} flags in
+\ccode{easel.h}) what modules you've got, and this list is what
+defines what augmentations are possible. Each module's documentation
+shows what optional augmentations are activated by other modules. Of
+course, when \Easel\ is used as a complete \ccode{libeasel.a} library,
+all modules are fully augmented by default.
+
+There are also tradeoffs inherent in using objects. So long as you
+know how to create and use an object, it becomes a powerful
+organizational tool. But objects necessarily add a layer of complexity
+that impedes code reuse; for example, instead of just calling a
+sequence alignment routine on two C text strings, you'll have to know
+how to create sequence objects first, and you have to carry along
+whatever extra code is involved in dealing with the
+object. Additionally, nobody likes each others' objects.
+
+\Easel\ assumes you don't like my objects any more than I like yours,
+and that you are going to prefer to use \Easel\ objects only when
+calling \Easel\ functions, not your own, so you will probably build
+simple interfaces to exchange data between your code and \Easel. Thus,
+\Easel\ is designed to provide obvious ways to create new \Easel\
+objects from elemental C data types, and to extract elemental C data
+types from \Easel\ objects. Especially for purposes of extracting
+data, \Easel\ objects are \esldef{translucent}; often, some of their
+internal data fields are stable and documented, and (contrary to some
+key principles of object-oriented design) in these cases, you are
+encouraged to reach into an object and access elemental data
+directly. \Easel\ functions also try to minimize dependencies on
+\Easel\ objects as much as possible, preferring to pass elemental C
+data types as arguments where feasible.
+
+
diff --git a/documentation/macros.tex b/documentation/macros.tex
new file mode 100644
index 0000000..326a417
--- /dev/null
+++ b/documentation/macros.tex
@@ -0,0 +1,70 @@
+% Typography.
+\newcommand{\ccode}[1]{{\smaller\texttt{#1}}}
+\newcommand{\ccodeincmd}[1]{{\texttt{#1}}}
+\newcommand{\emcode}[1]{{\smaller\texttt{\textbf{#1}}}}
+\newcommand{\itcode}[1]{{\smaller\texttt{\textit{#1}}}}
+\newcommand{\itbfcode}[1]{{\smaller\texttt{\textit{\bfseries #1}}}}
+\newcommand{\esldef}[1]{\textbf{#1}} % Define/introduce a term (to be indexed)
+\newcommand{\prog}[1]{{\smaller\textsc{#1}}}
+\newcommand{\eslmod}[1]{{\smaller\textsf{\textup{\textbf{#1}}}}}
+\newcommand{\eslmodincmd}[1]{{\smaller\textsf{\textup{\textbf{#1}}}}}
+\newcommand{\user}[1]{\indent\indent{\small\bfseries\texttt{> #1}}}
+\newcommand{\response}[1]{\indent\indent{\small\texttt{#1}}}
+
+\newcommand{\Easel} {Easel}
+\newcommand{\HMMER} {HMMER}
+\newcommand{\Infernal} {Infernal}
+\newcommand{\Pfam} {Pfam}
+\newcommand{\Rfam} {Rfam}
+
+% \api* functions are for the API summary tables.
+\newcommand{\apisubhead}[1]{\multicolumn{2}{|c|}{\rule[-0.4em]{0em}{1.5em}\textbf{#1}}}
+
+\def\argmax{\mathop{\mathrm{argmax}}\limits}
+\def\argmin{\mathop{\mathrm{argmin}}\limits}
+
+\DefineVerbatimEnvironment{cchunk} {Verbatim}{fontsize=\scriptsize,numbers=left,xleftmargin=1.0\parindent}%
+\DefineVerbatimEnvironment{userchunk} {Verbatim}{fontsize=\small,fontseries=b,,xleftmargin=1.0\parindent}%
+\DefineVerbatimEnvironment{responsechunk}{Verbatim}{fontsize=\small,xleftmargin=1.0\parindent}%
+\DefineVerbatimEnvironment{asciiart} {Verbatim}{fontsize=\scriptsize,xleftmargin=1.0\parindent}%
+
+% Set the color, size of the numbering of source code figures
+\renewcommand{\theFancyVerbLine}{\tiny\textcolor{SkyBlue}{\arabic{FancyVerbLine}}}
+
+
+% Description-like environment for documenting functions/APIs.
+% puts the description label in a minipage with a large hanging
+% indent.
+% Good christ this took a long time to develop.
+% hanging indent trick stolen from Peter Wilson's hanging.sty @CTAN
+% minipage allows multi-line label, and puts item on next line.
+% customized list inspired by Kopka/Daly _Guide to LaTeX_ p.213
+% SRE, Wed Dec 27 11:37:18 2000
+%
+\newenvironment{sreapi}{%
+ \begin{list}{}{%
+ \renewcommand{\makelabel}[1]{%
+ \begin{minipage}{\textwidth}%
+ \hangindent10em\hangafter1\noindent%
+ {\bfseries\texttt{##1}\vspace{0.8em}}%
+ \end{minipage}%
+ }}}%
+ {\end{list}}
+
+
+% Description-like environment for producing lists like:
+%
+% label stuff, stuff, stuff
+%
+% label2 more stuff, more stuff,
+% more stuff.
+% \begin{sreitems}{Longest label} \item[label] stuff, ... \end{sreitems}
+% SRE, Wed Dec 27 11:59:43 2000
+%
+\newenvironment{sreitems}[1]{%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{#1}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \addtolength{\leftmargin}{\labelsep}%
+ }}
+ {\end{list}}
diff --git a/documentation/main.tex b/documentation/main.tex
new file mode 100644
index 0000000..c6a2e88
--- /dev/null
+++ b/documentation/main.tex
@@ -0,0 +1,614 @@
+\documentclass[10pt]{book}
+% alternative fonts:
+% times, mathptmx, mathpazo, newcent, bookman
+% xref http://www.ce.cmu.edu/~kijoo/latex2pdf.pdf
+\usepackage{times}
+%\usepackage{fullpage}
+\usepackage{relsize} % the \smaller command, used in \ccode for example
+\usepackage{fancyvrb}
+\usepackage{array}
+\usepackage[numbers,sort&compress]{natbib}
+\usepackage[pdftex]{graphicx}
+\usepackage[usenames,dvipsnames]{color}
+\usepackage[backref,colorlinks]{hyperref}
+
+\hypersetup{
+ linkcolor = RoyalBlue,
+ anchorcolor = RoyalBlue,
+ citecolor = RoyalBlue,
+ filecolor = RoyalBlue,
+ menucolor = RoyalBlue,
+ runcolor = RoyalBlue,
+ urlcolor = RoyalBlue,
+}
+
+\usepackage{ifthen}
+\newboolean{completedraft}
+\setboolean{completedraft}{true} % if compiling the entire guide
+%\setboolean{completedraft}{false} % if writing/testing a piece at a time...
+ % comment out the \ifthenelse
+ % around the piece you're
+ % working on.
+
+\input{macros}
+
+\setcounter{secnumdepth}{1}
+
+\begin{document}
+
+\ifthenelse{\boolean{completedraft}}{
+ \input{titlepage}
+ \input{copyright}
+ \newpage
+ \tableofcontents
+}{}
+
+% A \sloppy command helps a lot with line justification;
+% we have a lot of \texttt's in this thing, and they screw up justification.
+\sloppy
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Introduction}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \begin{quote}
+ \emph{...using another person's software is sometimes treated like
+ using their toothbrush.}\\
+ \hspace*{1em}\hfill - Webb Miller \citep{Miller01}
+ \end{quote}
+ \input{intro}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{\eslmodincmd{easel}: the foundation}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \begin{quote}
+ \emph{Lack of skill dictates economy of style.}
+ \hspace*{1em}\hfill -- Joey Ramone
+ \end{quote}
+ \input{easel}
+ \section{Functions in the easel module}
+ \input{autotext/easel_functions}
+ \vspace*{\fill}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Biosequence data modules}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{alphabet}: digitized biosequences}
+ \input{esl_alphabet}
+ \subsection{Functions in the alphabet module}
+ \input{autotext/esl_alphabet_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{sq}: single biological sequences}
+ \input{esl_sq}
+ \subsection{Functions in the sq module}
+ \input{autotext/esl_sq_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{msa}: Multiple sequence alignments and i/o}
+ \input{esl_msa}
+ \subsection{Functions in the msa module}
+ \input{autotext/esl_msa_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{randomseq}: sampling random sequences}
+ \input{esl_randomseq}
+ \subsection{Functions in the randomseq module}
+ \input{autotext/esl_randomseq_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{sqio}: unaligned sequence file input/output}
+ \input{esl_sqio}
+ \subsection{Functions in the sqio module}
+ \input{autotext/esl_sqio_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{dsqdata}: faster sequence file input}
+ \input{esl_dsqdata}
+ \subsection{Functions in the dsqdata module}
+ \input{autotext/esl_dsqdata_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{ssi}: indexing flatfiles for record retrieval}
+ \input{esl_ssi}
+ \subsection{Functions in the ssi module}
+ \input{autotext/esl_ssi_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Multiple sequence alignment modules}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{msacluster}: Clustering aligned sequence families}
+ \input{esl_msacluster}
+ \subsection{Functions in the msacluster module}
+ \input{autotext/esl_msacluster_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{msaweight}: Ad hoc sequence weighting}
+
+ \begin{quote}
+ \emph{... as if someone were to buy several copies of the morning
+ newspaper to assure himself that what is said is true.}\\
+ \hspace*{1em}\hfill -- Ludwig Wittgenstein \citep[cited in]{Altschul89}
+ \end{quote}
+
+ \input{esl_msaweight}
+ \subsection{Functions in the msaweight module}
+ \input{autotext/esl_msaweight_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Multiple sequence alignment formats}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ \section{\eslmodincmd{msafile}: input/output of multiple sequence alignments}
+% \input{esl_msafile}
+
+% \subsection{Functions in the msafile module}
+% \input{autotext/esl_msafile_functions}
+
+
+}{}
+
+%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% \chapter{Pairwise sequence alignment}
+%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% \begin{quote}
+%% \emph{And how will it ever end?\\
+%% unless the day finally arrives\\
+%% when we have compared everything in the world\\
+%% to everything else in the world,\\
+%% and there is nothing left to do\\
+%% but quietly close our notebooks\\
+%% and sit with our hands folded on our desks.}\\
+%% \hspace*{1em}\hfill -- Billy Collins, \emph{The Trouble with Poetry}
+%% \end{quote}
+
+%% \newpage
+%% \section{\eslmodincmd{swat}: Smith/Waterman local alignment}
+%% \input{esl_swat}
+%% \subsection{Functions in the swat module}
+%% \input{autotext/esl_swat_functions}
+
+
+
+\ifthenelse{\boolean{completedraft}}{
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Probabilistic modeling modules}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \begin{quote}
+ \emph{Probability theory is nothing but common sense reduced to
+ calculation.}\\
+ \hspace*{1em}\hfill -- Laplace
+ \end{quote}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{scorematrix}: Pairwise alignment scores}
+ \input{esl_scorematrix}
+ \subsection{Functions in the scorematrix module}
+ \input{autotext/esl_scorematrix_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{ratematrix}: Continuous-time Markov models of evolution}
+ \input{esl_ratematrix}
+ \subsection{Functions in the ratematrix module}
+ \input{autotext/esl_ratematrix_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{paml}: Reading data files from PAML}
+ \input{esl_paml}
+ \subsection{Functions in the paml module}
+ \input{autotext/esl_paml_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Sequence annotation}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{wuss}: RNA secondary structure annotation}
+ \input{esl_wuss}
+ \subsection{Functions in the wuss module}
+ \input{autotext/esl_wuss_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Numerical computing}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{vectorops}: Vector operations}
+ \input{esl_vectorops}
+ \subsection{Functions in the vectorops module}
+ \input{autotext/esl_vectorops_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{dmatrix}: 2D matrices and linear algebra}
+ \input{esl_dmatrix}
+ \subsection{Functions in the dmatrix module}
+ \input{autotext/esl_dmatrix_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{minimizer}: Conjugate gradient descent}
+ \input{esl_minimizer}
+ \subsection{Functions in the minimizer module}
+ \input{autotext/esl_minimizer_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{rootfinder}: One-dimensional rootfinding}
+ \input{esl_rootfinder}
+ \subsection{Functions in the rootfinder module}
+ \input{autotext/esl_rootfinder_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Phylogenetic inference modules}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{tree}: Phylogenetic trees}
+ \input{esl_tree}
+ \subsection{Functions in the tree module}
+ \input{autotext/esl_tree_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+ \section{\eslmodincmd{distance}: Distance calculations}
+ \input{esl_distance}
+ \subsection{Functions in the distance module}
+ \input{autotext/esl_distance_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Statistics modules}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \begin{quote}
+ \emph{In any case, my experience is that while engaged in
+ cryptanalysis I started to believe in statistics!}\\
+ \hspace*{1em}\hfill -- Albrecht Beutelspacher, \emph{Cryptology}
+ \end{quote}
+
+ \input{statistics}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{stats}: Basic statistics routines}
+\input{esl_stats}
+\subsection{Functions in the stats module}
+\input{autotext/esl_stats_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{histogram}: Collecting histograms}
+\input{esl_histogram}
+\subsection{Functions in the histogram module}
+\input{autotext/esl_histogram_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{dirichlet}: Beta, Gamma, Dirichlet densities and priors}
+\input{esl_dirichlet}
+\subsection{Functions in the dirichlet module}
+\input{autotext/esl_dirichlet_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{exponential}: Exponential distributions}
+\input{esl_exponential}
+\subsection{Functions in the exponential module}
+\input{autotext/esl_exponential_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{gamma}: Gamma distributions}
+\input{esl_gamma}
+\subsection{Functions in the gamma module}
+\input{autotext/esl_gamma_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{gev}: Generalized extreme value distributions}
+\input{esl_gev}
+\subsection{Functions in the gev module}
+\input{autotext/esl_gev_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{gumbel}: Type I extreme value (Gumbel) statistics}
+\input{esl_gumbel}
+\subsection{Functions in the gumbel module}
+\input{autotext/esl_gumbel_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{hyperexp}: Hyperexponential distributions}
+\input{esl_hyperexp}
+\subsection{Functions in the hyperexp module}
+\input{autotext/esl_hyperexp_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{mixdchlet}: Mixture Dirichlet distributions}
+%\input{esl_mixdchlet}
+\subsection{Functions in the mixdchlet module}
+%\input{autotext/esl_mixdchlet_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{mixgev}: Mixture generalized extreme value distributions}
+%\input{esl_mixgev}
+%\subsection{Functions in the mixgev module}
+%\input{autotext/esl_mixgev_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{normal}: Normal (Gaussian) distributions}
+\input{esl_normal}
+\subsection{Functions in the normal module}
+\input{autotext/esl_normal_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{stretchexp}: Stretched exponential distributions}
+\input{esl_stretchexp}
+\subsection{Functions in the stretchexp module}
+\input{autotext/esl_stretchexp_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{weibull}: Weibull distributions}
+\input{esl_weibull}
+\subsection{Functions in the weibull module}
+\input{autotext/esl_weibull_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Utility modules}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\chapter{Core modules}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{buffer}: reading from any sort of input}
+\input{esl_buffer}
+\subsection{Functions in the buffer module}
+\input{autotext/esl_buffer_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{cluster}: single linkage clustering}
+\input{esl_cluster}
+\subsection{Functions in the cluster module}
+\input{autotext/esl_cluster_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{fileparser}: token-based data file input}
+\input{esl_fileparser}
+\subsection{Functions in the fileparser module}
+\input{autotext/esl_fileparser_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{getopts}: command line parsing}
+\input{esl_getopts}
+\subsection{Functions in the getopts module}
+\input{autotext/esl_getopts_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{keyhash}: associative hashes}
+\input{esl_keyhash}
+\subsection{Functions in the keyhash module}
+\input{autotext/esl_keyhash_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{random}: pseudorandom numbers and sampling}
+ \begin{quote}
+ \emph{Nec Babylonios temptaris numeros. \\
+ (Don't attempt the Babylonian numbers.)}\\
+ \hspace{3em} -- Horace, Ode 1.11. \\
+\end{quote}
+\input{esl_random}
+\subsection{Functions in the random (rnd) module}
+\input{autotext/esl_random_functions}
+\vspace*{\fill}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{regexp}: regular expression matching}
+\input{esl_regexp}
+\subsection{Functions in the regexp module}
+\input{autotext/esl_regexp_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{stack}: pushdown stacks for integers, chars, and pointers}
+\input{esl_stack}
+\subsection{Functions in the stack module}
+\input{autotext/esl_stack_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{stopwatch}: timing parts of programs}
+\input{esl_stopwatch}
+\subsection{Functions in the stopwatch module}
+\input{autotext/esl_stopwatch_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+ \newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Optional parallel computing support}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{sse}: SIMD minivectors on Intel and AMD }
+\input{esl_sse}
+\subsection{Functions in the sse module}
+\input{autotext/esl_sse_functions}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{\eslmodincmd{mpi}: MPI parallelization}
+\input{esl_mpi}
+\subsection{Functions in the MPI module}
+\input{autotext/esl_mpi_functions}
+}{}
+
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{File formats}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\section{Stockholm format for multiple sequence alignments}
+\input{format_stockholm.tex}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\section{A2M format for multiple sequence alignments}
+\input{format_a2m.tex}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{WUSS notation for RNA secondary structures}
+\input{format_wuss.tex}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+\section{NCBI BLAST database foramt}
+\input{format_ncbi.tex}
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Developer's guide}
+
+\begin{quote}
+ \emph{This is the great nightmare, when you're doing something long
+ and hard, is you're terrified that it will be perceived as
+ gratuitously hard and difficult, that it is some
+ avant-garde-for-its-own-sake kind of exercise.}\\
+ \hspace*{1em}\hfill -- David Foster Wallace, speaking of \emph{Infinite Jest}
+\end{quote}
+
+ \input{codestyle}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Installation instructions}
+ \input{installation}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+}{}
+
+\ifthenelse{\boolean{completedraft}}{
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \chapter{Credits and acknowledgements}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \begin{quote}
+ \emph{There are every year works published whose contents show them to
+ be by real lunatics.}
+ \hspace*{1em}\hfill -- William James, \emph{The Principles of Psychology}
+ \end{quote}
+}{}
+
+\newpage
+%\newcommand{\bibfont}{\footnotesize}
+\bibliographystyle{abbrvnat}
+%\bibliography{master,lab,books,new}
+\bibliography{master,lab,books}
+
+\end{document}
+
diff --git a/documentation/statistics.tex b/documentation/statistics.tex
new file mode 100644
index 0000000..d38135c
--- /dev/null
+++ b/documentation/statistics.tex
@@ -0,0 +1,103 @@
+
+\section{Overview of all the statistics modules}
+
+All statistics modules require the \eslmod{stats} module, in addition
+to the core \eslmod{easel} module.
+
+Sampling routines require augmentation with the \eslmod{random}
+module. Using histograms (including the \ccode{*\_Plot} functions and
+parameter fitting to binned data) requires augmentation with the
+\eslmod{histogram} module. Some parameter fitting functions require
+augmentation with the \eslmod{minimizer} module.
+
+\vspace{1em}
+\begin{tabular}{ll}\hline
+ \multicolumn{2}{c}{\textbf{Core support:}}\\
+\eslmod{stats} & Shared and special functions. \\
+ \multicolumn{2}{c}{\textbf{Distributions:}}\\
+\eslmod{dirichlet} & Dirichlet densities. \\
+\eslmod{exponential} & Exponential densities.\\
+\eslmod{gamma} & Gamma densities.\\
+\eslmod{gev} & Generalized extreme value densities.\\
+\eslmod{gumbel} & Gumbel densities.\\
+\eslmod{hyperexp} & Hyperexponential densities.\\
+\eslmod{mixdchlet} & Mixture Dirichlet densities.\\
+\eslmod{mixgev} & Mixtures of generalized extreme value densities.\\
+\eslmod{stretchexp} & Stretched exponential densities.\\
+\eslmod{weibull} & Weibull densities.\\
+\hline
+\end{tabular}
+
+\subsection{Available densities and distributions}
+
+Every module implements seven functions:
+
+\begin{tabular}{lll}
+\ccode{esl\_*\_pdf} & $P(X=x)$ & probability density function\\
+\ccode{esl\_*\_logpdf} & $\log P(X=x)$ & natural log of the PDF \\
+\ccode{esl\_*\_cdf} & $P(X \leq x)$ & cumulative distribution function\\
+\ccode{esl\_*\_logcdf} & $\log P(X \leq x)$ & natural log of the CDF\\
+\ccode{esl\_*\_surv} & $P(X > x)$ & survival function (right tail mass) \\
+\ccode{esl\_*\_logsurv} & $\log P(X > x)$ & natural log of the survival function\\
+\ccode{esl\_*\_invcdf} & ${ x \mid P(X \leq x) = p }$ & inverse CDF (often useful for sampling)\\
+\end{tabular}
+
+\subsubsection{Overview of parameters}
+
+A summary of the parameters of the elemental distributions is as
+follows:
+
+\begin{tabular}{lcccc} \hline
+\textbf{Distribution}& \textbf{Location} & \textbf{Scale} & \textbf{Shape} & \textbf{PDF} \\\hline
+\eslmod{dirichlet} & \multicolumn{3}{c}{ $\alpha_i > 0$, $i=1..K$ } &
+ $\frac{\Gamma{\sum_i \alpha_i}}{\prod_i \Gamma(\alpha_i)} \prod_i p_i^{\alpha_i-1}$\\
+\eslmod{exponential} & $\mu$ & $\lambda$ & - &
+ $\lambda e^{-\lambda (x - \mu)}$\\
+\eslmod{gamma} & $\mu$ & $\lambda$ & $\tau$ &
+ $ \frac{\lambda^{\tau}}{\Gamma(\tau)} (x-\mu)^{\tau-1} e^{-\lambda (x - \mu)} $\\
+\eslmod{gev} & $\mu$ & $\lambda$ & $\alpha$ &
+ $ \lambda \left[ 1 + \alpha \lambda (x - \mu) \right]^{-\frac{\alpha+1}{\alpha}}
+ \exp \left\{ - \left[ 1 + \alpha \lambda (x - \mu)
+ \right]^{-\frac{1}{\alpha}} \right\} $\\
+\eslmod{gumbel} & $\mu$ & $\lambda$ & - &
+ $ \lambda \exp \left[ -\lambda (x - \mu) - e^{- \lambda (x - \mu)} \right] $\\
+\eslmod{stretchexp} & $\mu$ & $\lambda$ & $\tau$ &
+ $ \frac{\lambda \tau}{\Gamma(\frac{1}{\tau})} e^{- [\lambda(x-\mu)]^{\tau}} $\\
+\eslmod{weibull} & $\mu$ & $\lambda$ & $\tau$ &
+ $ \lambda \tau [\lambda(x - \mu)]^{\tau-1} e^{- [\lambda(x-\mu)]^{\tau}}$\\
+\hline
+\end{tabular}
+
+Additionally, there are \textbf{mixture distributions} composed of a
+sum of one of the above elemental densities:
+
+\vspace{1em}
+\begin{tabular}{ll} \hline
+\textbf{Distribution} & \textbf{PDF}\\ \hline
+\eslmod{hyperexp} & $\sum_k q_k P(x \mid \mbox{exponential:}\mu^k,\lambda^k)$\\
+\eslmod{mixdchlet} & $\sum_k q_k P(\vec{p} \mid \mbox{Dirichlet:}\vec{\alpha}^k)$\\
+\eslmod{mixgev} & $\sum_k q_k P(x \mid \mbox{GEV:}\mu^k,\lambda^k,\alpha^k)$\\
+\hline
+\end{tabular}
+
+\subsubsection{Dynamic range}
+
+
+\subsection{Using histograms}
+
+\subsection{Parameter fitting}
+\subsubsection{Complete data}
+\subsubsection{Binned data}
+\subsubsection{Censored data}
+\subsubsection{Truncated data}
+
+
+
+\subsection{Sampling}
+
+
+
+
+
+
+
diff --git a/documentation/titlepage.tex b/documentation/titlepage.tex
new file mode 100644
index 0000000..55ee2ec
--- /dev/null
+++ b/documentation/titlepage.tex
@@ -0,0 +1,31 @@
+\begin{titlepage}
+{\Large
+
+\vspace*{\fill}
+
+\noindent
+{\Huge{Easel}} \\
+\rule[2pt]{\textwidth}{1pt} \\
+\hspace*{\fill} {\large {A library of C functions for
+ biological sequence analysis} \\ }
+
+\vspace*{\fill}
+
+\begin{center}
+\url{http://bioeasel.org/}\\
+Version 0.3dev; February 2016 \\
+
+\vspace*{\fill}
+
+Sean R. Eddy\\
+HHMI/Harvard University\\
+Dept. of Molecular and Cellular Biology\\
+Biological Laboratories 1008B\\
+16 Divinity Avenue\\
+Cambridge, Massachusetts 02138\\
+\url{http://eddylab.org/}\\
+\end{center}
+
+\vspace*{\fill}
+}
+\end{titlepage}
diff --git a/documentation/typography.tex b/documentation/typography.tex
new file mode 100644
index 0000000..622a808
--- /dev/null
+++ b/documentation/typography.tex
@@ -0,0 +1,31 @@
+\documentclass[10pt]{book}
+\usepackage{bookman}
+
+\usepackage{relsize} % the \smaller command, used in \ccode for example
+\usepackage{fancyvrb}
+\usepackage[numbers,sort&compress]{natbib}
+\usepackage[pdftex]{graphicx}
+\usepackage[backref,colorlinks]{hyperref}
+
+\input{macros}
+
+\begin{document}
+
+This is a test document for looking at alternatives for typography in
+Easel.
+
+Source code, command lines, and output are shown \ccode{like this}.
+
+User input is shown \emcode{like this}.
+
+Names of software and database distribution packages are in small
+caps, as in \prog{blast}. (In our \LaTeX\ code, we have shortcuts for
+the \Easel\, \HMMER\, \Infernal\, \Pfam\, and \Rfam\ packages.)
+
+A \esldef{new term} is set in bold font when first defined, and
+associated with an entry in the index.
+
+Names of Easel's modules appear like this: \eslmod{buffer}.
+
+\end{document}
+
diff --git a/easel.c b/easel.c
new file mode 100644
index 0000000..4c5a2cf
--- /dev/null
+++ b/easel.c
@@ -0,0 +1,2338 @@
+/* Easel's foundation.
+ *
+ * Contents:
+ * 1. Exception and fatal error handling.
+ * 2. Memory allocation/deallocation conventions.
+ * 3. Standard banner for Easel miniapplications.
+ * 4. Improved replacements for some C library functions.
+ * 5. Portable drop-in replacements for nonstandard C functions.
+ * 6. Additional string functions, esl_str*()
+ * 7. File path/name manipulation, including tmpfiles.
+ * 8. Typed comparison functions.
+ * 9. Unit tests.
+ * 10. Test driver.
+ * 11. Examples.
+ * 12. Copyright and license.
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef _POSIX_VERSION
+#include <sys/stat.h>
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_MPI
+#include <mpi.h> /* MPI_Abort() may be used in esl_fatal() or other program killers */
+#endif
+
+#include "easel.h"
+
+
+/*****************************************************************
+ * 1. Exception and fatal error handling.
+ *****************************************************************/
+static esl_exception_handler_f esl_exception_handler = NULL;
+
+/* Function: esl_fail()
+ * Synopsis: Handle a normal failure code/message before returning to caller.
+ *
+ * Purpose: A "failure" is a normal error that we want to handle
+ * without terminating the program; we're going to return
+ * control to the caller with a nonzero error code and
+ * (optionally) an informative error message formatted
+ * in <errbuf>.
+ *
+ * <esl_fail()> is called internally by the <ESL_FAIL()>
+ * and <ESL_XFAIL()> macros (see easel.h). The reason to
+ * have the failure macros call such a simple little
+ * function is to give us a convenient debugging
+ * breakpoint. For example, in a <_Validate()> routine that
+ * needs to do a normal return to a caller, you can set a
+ * breakpoint in <esl_fail()> to see exactly where the
+ * validation failed.
+ */
+void
+esl_fail(char *errbuf, const char *format, ...)
+{
+ if (format) {
+ va_list ap;
+ va_start(ap, format);
+ if (errbuf) vsnprintf(errbuf, eslERRBUFSIZE, format, ap);
+ va_end(ap);
+ }
+}
+
+
+/* Function: esl_exception()
+ * Synopsis: Throw an exception.
+ *
+ * Purpose: Throw an exception. An "exception" is defined by Easel
+ * as an internal error that shouldn't happen and/or is
+ * outside the user's control; as opposed to "failures", that
+ * are to be expected, and within user control, and
+ * therefore normal. By default, exceptions are fatal.
+ * A program that wishes to be more robust can register
+ * a non-fatal exception handler.
+ *
+ * Easel programs normally call one of the exception-handling
+ * wrappers <ESL_EXCEPTION()> or <ESL_XEXCEPTION()>, which
+ * handle the overhead of passing in <use_errno>, <sourcefile>,
+ * and <sourceline>. <esl_exception> is rarely called directly.
+ *
+ * If no custom exception handler has been registered, the
+ * default behavior is to print a brief message to <stderr>
+ * then <abort()>, resulting in a nonzero exit code from the
+ * program. Depending on what <errcode>, <sourcefile>,
+ * <sourceline>, and the <sprintf()>-formatted <format>
+ * are, this output looks like:
+ *
+ * Fatal exception (source file foo.c, line 42):
+ * Something wicked this way came.
+ *
+ * Additionally, in an MPI parallel program, the default fatal
+ * handler aborts all processes (with <MPI_Abort()>), not just
+ * the one that called <esl_exception()>.
+ *
+ * Args: errcode - Easel error code, such as eslEINVAL. See easel.h.
+ * use_errno - if TRUE, also use perror() to report POSIX errno message.
+ * sourcefile - Name of offending source file; normally __FILE__.
+ * sourceline - Name of offending source line; normally __LINE__.
+ * format - <sprintf()> formatted exception message, followed
+ * by any additional necessary arguments for that
+ * message.
+ *
+ * Returns: void.
+ *
+ * Throws: No abnormal error conditions. (Who watches the watchers?)
+ */
+void
+esl_exception(int errcode, int use_errno, char *sourcefile, int sourceline, char *format, ...)
+{
+ va_list argp;
+#ifdef HAVE_MPI
+ int mpiflag;
+#endif
+
+ if (esl_exception_handler != NULL)
+ {
+ va_start(argp, format);
+ (*esl_exception_handler)(errcode, use_errno, sourcefile, sourceline, format, argp);
+ va_end(argp);
+ return;
+ }
+ else
+ {
+ fprintf(stderr, "Fatal exception (source file %s, line %d):\n", sourcefile, sourceline);
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ fprintf(stderr, "\n");
+ if (use_errno && errno) perror("system error");
+ fflush(stderr);
+#ifdef HAVE_MPI
+ MPI_Initialized(&mpiflag); /* we're assuming we can do this, even in a corrupted, dying process...? */
+ if (mpiflag) MPI_Abort(MPI_COMM_WORLD, 1);
+#endif
+ abort();
+ }
+}
+
+/* Function: esl_exception_SetHandler()
+ * Synopsis: Register a different exception handling function.
+ *
+ * Purpose: Register a different exception handling function,
+ * <handler>. When an exception occurs, the handler
+ * receives at least four arguments: <errcode>, <sourcefile>,
+ * <sourceline>, and <format>.
+ *
+ * <errcode> is an Easel error code, such as
+ * <eslEINVAL>. See <easel.h> for a list of all codes.
+ *
+ * <use_errno> is TRUE for POSIX system call failures. The
+ * handler may then use POSIX <errno> to format/print an
+ * additional message, using <perror()> or <strerror_r()>.
+ *
+ * <sourcefile> is the name of the Easel source code file
+ * in which the exception occurred, and <sourceline> is
+ * the line number.
+ *
+ * <format> is a <vprintf()>-formatted string, followed by
+ * a <va_list> containing any additional arguments that
+ * formatted message needs. Your custom exception handler
+ * will probably use <vfprintf()> or <vsnprintf()> to format
+ * its error message.
+ *
+ * Args: handler - ptr to your custom exception handler.
+ *
+ * Returns: void.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+void
+esl_exception_SetHandler(void (*handler)(int errcode, int use_errno, char *sourcefile, int sourceline, char *format, va_list argp))
+{
+ esl_exception_handler = handler;
+}
+
+
+/* Function: esl_exception_ResetDefaultHandler()
+ * Synopsis: Restore default exception handling.
+ *
+ * Purpose: Restore default exception handling, which is to print
+ * a simple error message to <stderr> then <abort()> (see
+ * <esl_exception()>.
+ *
+ * An example where this might be useful is in a program
+ * that only temporarily wants to catch one or more types
+ * of normally fatal exceptions.
+ *
+ * If the default handler is already in effect, this
+ * call has no effect (is a no-op).
+ *
+ * Args: (void)
+ *
+ * Returns: (void)
+ *
+ * Throws: (no abnormal error conditions)
+ */
+void
+esl_exception_ResetDefaultHandler(void)
+{
+ esl_exception_handler = NULL;
+}
+
+
+/* Function: esl_nonfatal_handler()
+ * Synopsis: A trivial example of a nonfatal exception handler.
+ *
+ * Purpose: This serves two purposes. First, it is the simplest
+ * example of a nondefault exception handler. Second, this
+ * is used in test harnesses, when they have
+ * <eslTEST_THROWING> turned on to test that thrown errors
+ * are handled properly when a nonfatal error handler is
+ * registered by the application.
+ *
+ * Args: errcode - Easel error code, such as eslEINVAL. See easel.h.
+ * use_errno - TRUE on POSIX system call failures; use <errno>
+ * sourcefile - Name of offending source file; normally __FILE__.
+ * sourceline - Name of offending source line; normally __LINE__.
+ * format - <sprintf()> formatted exception message.
+ * argp - <va_list> containing any additional necessary arguments for
+ * the <format> message.
+ *
+ * Returns: void.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+void
+esl_nonfatal_handler(int errcode, int use_errno, char *sourcefile, int sourceline, char *format, va_list argp)
+{
+ return;
+}
+
+
+/* Function: esl_fatal()
+ * Synopsis: Kill a program immediately, for a "violation".
+ *
+ * Purpose: Kill a program for a "violation". In general this should only be used
+ * in development or testing code, not in production
+ * code. The main use of <esl_fatal()> is in unit tests.
+ * Another use is in assertions used in dev code.
+ *
+ * The only other case (and the only case that should be allowed in
+ * production code) is in a true "function" (a function that returns
+ * its answer, rather than an Easel error code), where Easel error
+ * conventions can't be used (because it can't return an error code),
+ * AND the error is guaranteed to be a coding error. For an example,
+ * see <esl_opt_IsOn()>, which triggers a violation if the code
+ * checks for an option that isn't in the code.
+ *
+ * In an MPI-parallel program, the entire job is
+ * terminated; all processes are aborted (<MPI_Abort()>,
+ * not just the one that called <esl_fatal()>.
+ *
+ * If caller is feeling lazy and just wants to terminate
+ * without any informative message, use <abort()>.
+ *
+ * Args: format - <sprintf()> formatted exception message, followed
+ * by any additional necessary arguments for that
+ * message.
+ *
+ * Returns: (void)
+ *
+ * Throws: (no abnormal error conditions)
+ */
+void
+esl_fatal(const char *format, ...)
+{
+ va_list argp;
+#ifdef HAVE_MPI
+ int mpiflag;
+#endif
+
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ fprintf(stderr, "\n");
+ fflush(stderr);
+
+#ifdef HAVE_MPI
+ MPI_Initialized(&mpiflag);
+ if (mpiflag) MPI_Abort(MPI_COMM_WORLD, 1);
+#endif
+ exit(1);
+}
+/*---------------- end, error handling conventions --------------*/
+
+
+
+
+/*****************************************************************
+ * 2. Memory allocation/deallocation conventions.
+ *****************************************************************/
+
+/* Function: esl_Free2D()
+ *
+ * Purpose: Free a 2D pointer array <p>, where first dimension is
+ * <dim1>. (That is, the array is <p[0..dim1-1][]>.)
+ * Tolerates any of the pointers being NULL, to allow
+ * sparse arrays.
+ *
+ * Returns: void.
+ */
+void
+esl_Free2D(void **p, int dim1)
+{
+ int i;
+ if (p != NULL) {
+ for (i = 0; i < dim1; i++)
+ if (p[i] != NULL) free(p[i]);
+ free(p);
+ }
+ return;
+}
+
+/* Function: esl_Free3D()
+ *
+ * Purpose: Free a 3D pointer array <p>, where first and second
+ * dimensions are <dim1>,<dim2>. (That is, the array is
+ * <p[0..dim1-1][0..dim2-1][]>.) Tolerates any of the
+ * pointers being NULL, to allow sparse arrays.
+ *
+ * Returns: void.
+ */
+void
+esl_Free3D(void ***p, int dim1, int dim2)
+{
+ int i, j;
+
+ if (p != NULL) {
+ for (i = 0; i < dim1; i++)
+ if (p[i] != NULL) {
+ for (j = 0; j < dim2; j++)
+ if (p[i][j] != NULL) free(p[i][j]);
+ free(p[i]);
+ }
+ free(p);
+ }
+}
+/*------------- end, memory allocation conventions --------------*/
+
+
+
+/*****************************************************************
+ * 3. Standard banner for Easel miniapplications.
+ *****************************************************************/
+
+/* Function: esl_banner()
+ * Synopsis: print standard Easel application output header
+ *
+ * Purpose: Print the standard Easel command line application banner
+ * to <fp>, constructing it from <progname> (the name of the
+ * program) and a short one-line description <banner>.
+ * For example,
+ * <esl_banner(stdout, "compstruct", "compare RNA structures");>
+ * might result in:
+ *
+ * \begin{cchunk}
+ * # compstruct :: compare RNA structures
+ * # Easel 0.1 (February 2005)
+ * # Copyright (C) 2004-2007 HHMI Janelia Farm Research Campus
+ * # Freely licensed under the Janelia Software License.
+ * # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * \end{cchunk}
+ *
+ * <progname> would typically be an application's
+ * <argv[0]>, rather than a fixed string. This allows the
+ * program to be renamed, or called under different names
+ * via symlinks. Any path in the <progname> is discarded;
+ * for instance, if <progname> is "/usr/local/bin/esl-compstruct",
+ * "esl-compstruct" is used as the program name.
+ *
+ * Note:
+ * Needs to pick up preprocessor #define's from easel.h,
+ * as set by ./configure:
+ *
+ * symbol example
+ * ------ ----------------
+ * EASEL_VERSION "0.1"
+ * EASEL_DATE "May 2007"
+ * EASEL_COPYRIGHT "Copyright (C) 2004-2007 HHMI Janelia Farm Research Campus"
+ * EASEL_LICENSE "Freely licensed under the Janelia Software License."
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEWRITE> on write error.
+ */
+int
+esl_banner(FILE *fp, char *progname, char *banner)
+{
+ char *appname = NULL;
+ int status;
+
+ if ((status = esl_FileTail(progname, FALSE, &appname)) != eslOK) return status;
+
+ if (fprintf(fp, "# %s :: %s\n", appname, banner) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "write failed");
+ if (fprintf(fp, "# Easel %s (%s)\n", EASEL_VERSION, EASEL_DATE) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "write failed");
+ if (fprintf(fp, "# %s\n", EASEL_COPYRIGHT) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "write failed");
+ if (fprintf(fp, "# %s\n", EASEL_LICENSE) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "write failed");
+ if (fprintf(fp, "# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "write failed");
+
+ if (appname) free(appname);
+ return eslOK;
+
+ ERROR:
+ if (appname) free(appname);
+ return status;
+}
+
+
+/* Function: esl_usage()
+ * Synopsis: print standard Easel application usage help line
+ *
+ * Purpose: Given a usage string <usage> and the name of the program
+ * <progname>, output a standardized usage/help
+ * message. <usage> is minimally a one line synopsis like
+ * "[options] <filename>", but it may extend to multiple
+ * lines to explain the command line arguments in more
+ * detail. It should not describe the options; that's the
+ * job of the getopts module, and its <esl_opt_DisplayHelp()>
+ * function.
+ *
+ * This is used by the Easel miniapps, and may be useful in
+ * other applications as well.
+ *
+ * As in <esl_banner()>, the <progname> is typically passed
+ * as <argv[0]>, and any path prefix is ignored.
+ *
+ * For example, if <argv[0]> is </usr/local/bin/esl-compstruct>,
+ * then
+ *
+ * \begin{cchunk}
+ * esl_usage(stdout, argv[0], "[options] <trusted file> <test file>">
+ * \end{cchunk}
+ *
+ * produces
+ *
+ * \begin{cchunk}
+ * Usage: esl-compstruct [options] <trusted file> <test file>
+ * \end{cchunk}
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEWRITE> on write failure.
+ */
+int
+esl_usage(FILE *fp, char *progname, char *usage)
+{
+ char *appname = NULL;
+ int status;
+
+ if ( (status = esl_FileTail(progname, FALSE, &appname)) != eslOK) return status;
+
+ if (fprintf(fp, "Usage: %s %s\n", appname, usage) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "write failed");
+
+ if (appname) free(appname);
+ return eslOK;
+
+ ERROR:
+ if (appname) free(appname);
+ return status;
+}
+
+
+/* Function: esl_dataheader()
+ * Synopsis: Standard #-prefixed header lines for output data table
+ *
+ * Purpose: Print column headers for a space-delimited, fixed-column-width
+ * data table to <fp>.
+ *
+ * Takes a variable number of argument pairs. Each pair is
+ * <width, label>. The absolute value of <width> is the max
+ * width of the column. <label> is the column label.
+ *
+ * If <width> is negative, left justify the label. (This is
+ * supposed to mirror the %-8s vs %8s of a printf format.)
+ *
+ * Caller marks the end of the argument list
+ * with a 0 sentinel.
+ *
+ * Example: <esl_dataheader(stdout, 8, "name", 3, "A", -4, "B", 0)>
+ * gives three columns:
+ *
+ * \begin{cchunk}
+ * # name A B
+ * #------- --- ----
+ * \end{cchunk}
+ *
+ * The <width> arguments match the widths given in
+ * <fprintf()>'s or whatever generates the data rows.
+ * Because the first header line is prefixed by \verb+#+, the
+ * first column's width argument is inclusive of these two
+ * extra chars, and therefore the first column label must
+ * have no more than its <width>-2 chars. For all other
+ * column labels, a label's length cannot exceed its
+ * <width>.
+ *
+ * Up to 1024 columns are allowed. (The only reason there's
+ * a limit is because you're going to forget to add the 0
+ * sentinel, and we don't want to risk a <while(1)> infinite
+ * loop.)
+ *
+ * Args: <fp> : output stream
+ * [<width>, <label]... : width, label pairs
+ * 0 : sentinel for end of argument list
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if a label is too wide for its width, or if
+ * the number of columns exceeds the max limit.
+ * <eslEWRITE> if a write to <fp> fails, which can happen
+ * if a disk fills up, for example.
+ */
+int
+esl_dataheader(FILE *fp, ...)
+{
+ va_list ap, ap2;
+ int width, len;
+ char *s;
+ int col = 0;
+ int maxcols = 1024; // limit, to avoid scary while(1) alternative
+ int leftjustify;
+ int status;
+
+ va_start(ap, fp);
+ va_copy(ap2, ap);
+ if ( fputc('#', fp) == EOF) ESL_XEXCEPTION_SYS(eslEWRITE, "write failed");
+ for (col = 0; col < maxcols; col++)
+ {
+ width = va_arg(ap, int);
+ if (width == 0) break;
+ if (width < 0) { leftjustify = TRUE; width = -width; }
+ else { leftjustify = FALSE; }
+ if (col == 0) width -= 2; // First column header -2 char for the "# " prefix
+
+ s = va_arg(ap, char *);
+ len = strlen(s);
+ if (len > width) {
+ if (col == 0) ESL_XEXCEPTION(eslEINVAL, "esl_dataheader(): first arg (%s) too wide for %d-char column ('# ' leader took 2 chars)", col, s, width+2);
+ else ESL_XEXCEPTION(eslEINVAL, "esl_dataheader(): arg %d (%s) too wide for %d-char column", col, s, width);
+ }
+
+ if (leftjustify) { if ( fprintf(fp, " %-*s", width, s) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "write failed"); }
+ else { if ( fprintf(fp, " %*s", width, s) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "write failed"); }
+ }
+ if (col == maxcols) ESL_XEXCEPTION( eslEINVAL, "esl_dataheader(): too many args");
+ if ( fputc('\n', fp) == EOF) ESL_XEXCEPTION_SYS(eslEWRITE, "write failed");
+
+ maxcols = col;
+ for (col = 0; col < maxcols; col++)
+ {
+ width = va_arg(ap2, int);
+ if (width < 0) width = -width;
+ if (col == 0) width -= 1;
+ (void) va_arg(ap2, char *);
+
+ if (col == 0) { if ( fputc('#', fp) == EOF) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); }
+ else { if ( fputc(' ', fp) == EOF) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); }
+ while (width--)
+ if ( fputc('-', fp) == EOF) ESL_EXCEPTION_SYS(eslEWRITE, "write failed");
+ }
+ if (fputc('\n', fp) == EOF) ESL_EXCEPTION_SYS(eslEWRITE, "write failed");
+
+ va_end(ap);
+ va_end(ap2);
+ return eslOK;
+
+ ERROR:
+ va_end(ap);
+ va_end(ap2);
+ return status;
+}
+
+
+/*-------------------- end, standard miniapp banner --------------------------*/
+
+
+
+
+/******************************************************************************
+ * 4. Replacements for C library functions
+ * fgets() -> esl_fgets() fgets() with dynamic allocation
+ * strdup() -> esl_strdup() strdup() is not ANSI
+ * strcat() -> esl_strcat() strcat() with dynamic allocation
+ * strtok() -> esl_strtok() threadsafe strtok()
+ * sprintf() -> esl_sprintf() sprintf() with dynamic allocation
+ * strcmp() -> esl_strcmp() strcmp() tolerant of NULL strings
+ *****************************************************************************/
+
+/* Function: esl_fgets()
+ *
+ * Purpose: Dynamic allocation version of fgets(),
+ * capable of reading almost unlimited line lengths.
+ *
+ * Args: buf - ptr to a string (may be reallocated)
+ * n - ptr to current allocated length of buf,
+ * (may be changed)
+ * fp - open file ptr for reading
+ *
+ * Before the first call to esl_fgets(),
+ * initialize buf to NULL and n to 0.
+ * They're a linked pair, so don't muck with the
+ * allocation of buf or the value of n while
+ * you're still doing esl_fgets() calls with them.
+ *
+ * Returns: <eslOK> on success.
+ * Returns <eslEOF> on normal end-of-file.
+ *
+ * When <eslOK>:
+ * <*buf> points to a <NUL>-terminated line from the file.
+ * <*n> contains the current allocated length for <*buf>.
+ *
+ * Caller must free <*buf> eventually.
+ *
+ * Throws: <eslEMEM> on an allocation failure.
+ *
+ * Example: char *buf = NULL;
+ * int n = 0;
+ * FILE *fp = fopen("my_file", "r");
+ *
+ * while (esl_fgets(&buf, &n, fp) == eslOK)
+ * {
+ * do stuff with buf;
+ * }
+ * if (buf != NULL) free(buf);
+ */
+int
+esl_fgets(char **buf, int *n, FILE *fp)
+{
+ int status;
+ char *s;
+ int len;
+ int pos;
+
+ if (*n == 0)
+ {
+ ESL_ALLOC(*buf, sizeof(char) * 128);
+ *n = 128;
+ }
+
+ /* Simple case 1. We're sitting at EOF, or there's an error.
+ * fgets() returns NULL, so we return EOF.
+ */
+ if (fgets(*buf, *n, fp) == NULL) return eslEOF;
+
+ /* Simple case 2. fgets() got a string, and it reached EOF doing it.
+ * return success status, so caller can use
+ * the last line; on the next call we'll
+ * return the 0 for the EOF.
+ */
+ if (feof(fp)) return eslOK;
+
+ /* Simple case 3. We got a complete string, with \n,
+ * and don't need to extend the buffer.
+ */
+ len = strlen(*buf);
+ if ((*buf)[len-1] == '\n') return eslOK;
+
+ /* The case we're waiting for. We have an incomplete string,
+ * and we have to extend the buffer one or more times. Make
+ * sure we overwrite the previous fgets's \0 (hence +(n-1)
+ * in first step, rather than 128, and reads of 129, not 128).
+ */
+ pos = (*n)-1;
+ while (1) {
+ ESL_REALLOC(*buf, sizeof(char) * (*n+128));
+ *n += 128;
+ s = *buf + pos;
+ if (fgets(s, 129, fp) == NULL) return eslOK;
+ len = strlen(s);
+ if (s[len-1] == '\n') return eslOK;
+ pos += 128;
+ }
+ /*NOTREACHED*/
+ return eslOK;
+
+ ERROR:
+ if (*buf != NULL) free(*buf);
+ *buf = NULL;
+ *n = 0;
+ return status;
+}
+
+/* Function: esl_strdup()
+ *
+ * Purpose: Makes a duplicate of string <s>, puts it in <ret_dup>.
+ * Caller can pass string length <n>, if it's known,
+ * to save a strlen() call; else pass -1 to have the string length
+ * determined.
+ *
+ * Tolerates <s> being <NULL>; in which case,
+ * returns <eslOK> with <*ret_dup> set to <NULL>.
+ *
+ * Args: s - string to duplicate (NUL-terminated)
+ * n - length of string, if known; -1 if unknown.
+ * ret_dup - RETURN: duplicate of <s>.
+ *
+ * Returns: <eslOK> on success, and <ret_dup> is valid.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_strdup(const char *s, int64_t n, char **ret_dup)
+{
+ int status;
+ char *new = NULL;
+
+ if (s == NULL) {*ret_dup = NULL; return eslOK; }
+ if (n < 0) n = strlen(s);
+
+ ESL_ALLOC(new, sizeof(char) * (n+1));
+ strcpy(new, s);
+
+ *ret_dup = new;
+ return eslOK;
+
+ ERROR:
+ if (new) free(new);
+ *ret_dup = NULL;
+ return status;
+}
+
+
+/* Function: esl_strcat()
+ *
+ * Purpose: Dynamic memory version of strcat().
+ * Appends <src> to the string that <dest> points to,
+ * extending allocation for dest if necessary. Caller
+ * can optionally provide the length of <*dest> in
+ * <ldest>, and the length of <src> in <lsrc>; if
+ * either of these is -1, <esl_strcat()> calls <strlen()>
+ * to determine the length. Providing length information,
+ * if known, accelerates the routine.
+ *
+ * <*dest> may be <NULL>, in which case this is equivalent
+ * to a <strdup()> of <src> (that is, <*dest> is allocated
+ * rather than reallocated).
+ *
+ * <src> may be <NULL>, in which case <dest> is unmodified.
+ *
+ * Note: One timing experiment (100 successive appends of
+ * 1-255 char) shows esl_strcat() has about a 20%
+ * overhead relative to strcat(). If optional
+ * length info is passed, esl_strcat() is about 30%
+ * faster than strcat().
+ *
+ * Args: dest - ptr to string (char **), '\0' terminated
+ * ldest - length of dest, if known; or -1 if length unknown.
+ * src - string to append to dest, '\0' terminated
+ * lsrc - length of src, if known; or -1 if length unknown.
+ *
+ * Returns: <eslOK> on success; <*dest> is (probably) reallocated,
+ * modified, and nul-terminated.
+ *
+ * Throws: <eslEMEM> on allocation failure; initial state of <dest>
+ * is unaffected.
+ */
+int
+esl_strcat(char **dest, int64_t ldest, const char *src, int64_t lsrc)
+{
+ int status;
+ int64_t len1, len2;
+
+ if (ldest < 0) len1 = ((*dest == NULL) ? 0 : strlen(*dest));
+ else len1 = ldest;
+
+ if (lsrc < 0) len2 = (( src == NULL) ? 0 : strlen(src));
+ else len2 = lsrc;
+
+ if (len2 == 0) return eslOK;
+
+ ESL_REALLOC(*dest, sizeof(char) * (len1+len2+1));
+
+ memcpy((*dest)+len1, src, len2);
+ (*dest)[len1+len2] = '\0';
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_strmapcat()
+ * Synopsis: Version of esl_strcat that uses an inmap.
+ *
+ * Purpose: Append the contents of string or memory line <src>
+ * of length <lsrc> to a string. The destination
+ * string and its length are passed as pointers <*dest>
+ * and <*ldest>, so the string can be reallocated
+ * and the length updated. When appending, map each
+ * character <src[i]> to a new character <inmap[src[i]]>
+ * in the destination string. The destination string
+ * <*dest> is NUL-terminated on return (even if it
+ * wasn't to begin with).
+ *
+ * One reason to use the inmap is to enable parsers to
+ * ignore some characters in an input string or buffer,
+ * such as whitespace (mapped to <eslDSQ_IGNORED>). Of
+ * course this means, unlike <esl_strcat()> the new length
+ * isn't just <ldest+lsrc>, because we don't know how many
+ * characters get appended until we've processed them
+ * through the inmap -- that's why this function takes
+ * <*ldest> by reference, whereas <esl_strcat()> takes it
+ * by value.
+ *
+ * If <*dest> is a NUL-terminated string and the caller
+ * doesn't know its length, <*ldest> may be passed as -1.
+ * Providing the length saves a <strlen()> call. If <*dest>
+ * is a memory line, providing <*ldest> is mandatory. Same
+ * goes for <src> and <lsrc>.
+ *
+ * <*dest> may be <NULL>, in which case it is allocated
+ * and considered to be an empty string to append to.
+ * When <*dest> is <NULL> the input <*ldest> should be <0>
+ * or <-1>.
+ *
+ * The caller must provide a <src> that it already knows
+ * should be entirely appended to <*dest>, except for
+ * perhaps some ignored characters. No characters may be
+ * mapped to <eslDSQ_EOL> or <eslDSQ_EOD>. The reason for
+ * this is that we're going to allocate <*dest> for
+ * <*ldest+lsrc> chars. If <src> were a large memory buffer,
+ * only a fraction of which needed to be appended (up to
+ * an <eslDSQ_EOL> or <eslDSQ_EOD>), this reallocation would
+ * be inefficient.
+ *
+ * Args: inmap - an Easel input map, inmap[0..127];
+ * inmap[0] is special: set to the 'unknown' character to
+ * replace invalid input chars.
+ * *dest - destination string or memory to append to, passed by reference
+ * *ldest - length of <*dest> (or -1), passed by reference
+ * src - string or memory to inmap and append to <*dest>
+ * lsrc - length of <src> to map and append (or -1).
+ *
+ * Returns: <eslOK> on success. Upon successful return, <*dest> is
+ * reallocated and contains the new string (with from 0 to <lsrc>
+ * appended characters), NUL-terminated.
+ *
+ * <eslEINVAL> if one or more characters in the input <src>
+ * are mapped to <eslDSQ_ILLEGAL>. Appending nonetheless
+ * proceeds to completion, with any illegal characters
+ * represented as '?' in <*dest> and counted in <*ldest>.
+ * This is a normal error, because the string <src> may be
+ * user input. The caller may want to call some sort of
+ * validation function on <src> if an <eslEINVAL> error is
+ * returned, in order to report some helpful diagnostics to
+ * the user.
+ *
+ * Throws: <eslEMEM> on allocation or reallocation failure.
+ * <eslEINCONCEIVABLE> on internal coding error; for example,
+ * if the inmap tries to map an input character to <eslDSQ_EOD>,
+ * <eslDSQ_EOL>, or <eslDSQ_SENTINEL>. On exceptions, <*dest>
+ * and <*ldest> should not be used by the caller except to
+ * free <*dest>; their state may have been corrupted.
+ *
+ * Note: This deliberately mirrors <esl_abc_dsqcat()>, so
+ * that sequence file parsers have comparable behavior whether
+ * they're working with text-mode or digital-mode input.
+ *
+ * Might be useful to create a variant that also handles
+ * eslDSQ_EOD (and eslDSQ_EOL?) and returns the number of
+ * residues parsed. This'd allow a FASTA parser, for
+ * instance, to use this method while reading buffer pages
+ * rather than lines; it could define '>' as eslDSQ_EOD.
+ */
+int
+esl_strmapcat(const ESL_DSQ *inmap, char **dest, int64_t *ldest, const char *src, esl_pos_t lsrc)
+{
+ int status = eslOK;
+
+ if (*ldest < 0) *ldest = ( (*dest) ? strlen(*dest) : 0);
+ if ( lsrc < 0) lsrc = ( (*src) ? strlen(src) : 0);
+
+ if (lsrc == 0) goto ERROR; /* that'll return eslOK, leaving *dest untouched, and *ldest its length. */
+
+ ESL_REALLOC(*dest, sizeof(char) * (*ldest + lsrc + 1)); /* includes case of a new alloc of *dest */
+ return esl_strmapcat_noalloc(inmap, *dest, ldest, src, lsrc);
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_strmapcat_noalloc()
+ * Synopsis: Version of esl_strmapcat() that does no reallocation.
+ *
+ * Purpose: Same as <esl_strmapcat()>, but with no reallocation. The
+ * pointer to the destination string <dest> is passed by
+ * value, not by reference, because it will not be changed.
+ * Caller has allocated at least <*ldest + lsrc + 1> bytes
+ * in <dest>. In this version, <*ldest> and <lsrc> are not
+ * optional; caller must know the lengths of both the old
+ * string and the new source.
+ *
+ * Note: (see note on esl_abc_dsqcat_noalloc() for rationale)
+ */
+int
+esl_strmapcat_noalloc(const ESL_DSQ *inmap, char *dest, int64_t *ldest, const char *src, esl_pos_t lsrc)
+{
+ int64_t xpos;
+ esl_pos_t cpos;
+ ESL_DSQ x;
+ int status = eslOK;
+
+ for (xpos = *ldest, cpos = 0; cpos < lsrc; cpos++)
+ {
+ if (! isascii(src[cpos])) { dest[xpos++] = inmap[0]; status = eslEINVAL; continue; }
+
+ x = inmap[(int) src[cpos]];
+ if (x <= 127) dest[xpos++] = x;
+ else switch (x) {
+ case eslDSQ_SENTINEL: ESL_EXCEPTION(eslEINCONCEIVABLE, "input char mapped to eslDSQ_SENTINEL"); break;
+ case eslDSQ_ILLEGAL: dest[xpos++] = inmap[0]; status = eslEINVAL; break;
+ case eslDSQ_IGNORED: break;
+ case eslDSQ_EOL: ESL_EXCEPTION(eslEINCONCEIVABLE, "input char mapped to eslDSQ_EOL"); break;
+ case eslDSQ_EOD: ESL_EXCEPTION(eslEINCONCEIVABLE, "input char mapped to eslDSQ_EOD"); break;
+ default: ESL_EXCEPTION(eslEINCONCEIVABLE, "bad inmap, no such ESL_DSQ code"); break;
+ }
+ }
+
+ dest[xpos] = '\0';
+ *ldest = xpos;
+ return status;
+}
+
+
+/* Function: esl_strtok()
+ * Synopsis: Threadsafe version of C's <strtok()>
+ *
+ * Purpose: Thread-safe version of <strtok()> for parsing next token in
+ * a string.
+ *
+ * Increments <*s> while <**s> is a character in <delim>,
+ * then stops; the first non-<delim> character defines the
+ * beginning of a token. Increments <*s> until it reaches
+ * the next delim character (or \verb+\0+); this defines the end
+ * of the token, and this character is replaced with
+ * \verb+\0+. <*s> is then reset to point to the next character
+ * after the \verb+\0+ that was written, so successive calls can
+ * extract tokens in succession. Sets <*ret_tok> to point at
+ * the beginning of the token, and returns <eslOK>.
+ *
+ * If a token is not found -- if <*s> already points to
+ * \verb+\0+, or to a string composed entirely of characters in
+ * <delim> -- then returns <eslEOL>, with <*ret_tok> set to
+ * <NULL>.
+ *
+ * <*s> cannot be a constant string, since we write \verb+\0+'s
+ * to it; caller must be willing to have this string
+ * modified. And since we walk <*s> through the string as we
+ * parse, the caller wants to use a tmp pointer <*s>, not
+ * the original string itself.
+ *
+ * Example:
+ * char *tok;
+ * char *s;
+ * char buf[50] = "This is a sentence.";
+ *
+ * s = buf;
+ * esl_strtok(&s, " ", &tok);
+ * tok is "This"; s is "is a sentence."
+ * esl_strtok(&s, " ", &tok);
+ * tok is "is"; s is " a sentence.".
+ * esl_strtok(&s, " ", &tok);
+ * tok is "a"; s is "sentence.".
+ * esl_strtok(&s, " ", &tok, &len);
+ * tok is "sentence."; s is "\0".
+ * esl_strtok(&s, " ", &tok, &len);
+ * returned eslEOL; tok is NULL; s is "\0".
+ *
+ * Args: s - a tmp, modifiable ptr to a string
+ * delim - characters that delimits tokens
+ * ret_tok - RETURN: ptr to \0-terminated token
+ *
+ * Returns: <eslOK> on success, <*ret_tok> points to next token, and
+ * <*s> points to next character following the token.
+ *
+ * Returns <eslEOL> on end of line; in which case <*s>
+ * points to the terminal \verb+\0+ on the line, and <*ret_tok>
+ * is <NULL>.
+ */
+int
+esl_strtok(char **s, char *delim, char **ret_tok)
+{
+ return esl_strtok_adv(s, delim, ret_tok, NULL, NULL);
+}
+
+
+/* Function: esl_strtok_adv()
+ * Synopsis: More advanced interface to <esl_strtok()>
+ *
+ * Purpose: Same as <esl_strtok()>, except the caller may also
+ * optionally retrieve the length of the token in <*opt_toklen>,
+ * and the token-ending character that was replaced by \verb+\0+
+ * in <*opt_endchar>.
+ *
+ * Args: s - a tmp, modifiable ptr to string
+ * delim - characters that delimits tokens
+ * ret_tok - RETURN: ptr to \0-terminated token string
+ * opt_toklen - optRETURN: length of token; pass NULL if not wanted
+ * opt_endchar - optRETURN: character that was replaced by <\0>.
+ *
+ * Returns: <eslOK> on success, <*ret_tok> points to next token, <*s>
+ * points to next character following the token,
+ * <*opt_toklen> is the <strlen()> length of the token in
+ * characters (excluding its terminal \verb+\0+), and <*opt_endchar>
+ * is the character that got replaced by \verb+\0+ to form the token.
+ *
+ * Returns <eslEOL> if no token is found (end of line); in
+ * which case <*s> points to the terminal \verb+\0+ on the line,
+ * <*ret_tok> is <NULL>, <*opt_toklen> is 0 and
+ * <*opt_endchar> is \verb+\0+.
+ */
+int
+esl_strtok_adv(char **s, char *delim, char **ret_tok, int *opt_toklen, char *opt_endchar)
+{
+ char *end;
+ char *tok = *s;
+ char c = '\0';
+ int n = 0;
+ int status = eslEOL; /* unless proven otherwise */
+
+ /* contract checks */
+ ESL_DASSERT1(( s != NULL ));
+ ESL_DASSERT1(( delim != NULL ));
+
+ tok += strspn(tok, delim);
+ if (! *tok) tok = NULL; /* if *tok = 0, EOL, no token left */
+ else
+ {
+ n = strcspn(tok, delim);
+ end = tok + n;
+ if (*end == '\0') *s = end; /* a final token that extends to end of string */
+ else
+ {
+ c = *end; /* internal token: terminate with \0 */
+ *end = '\0';
+ *s = end+1;
+ }
+ status = eslOK;
+ }
+
+ *ret_tok = tok;
+ if (opt_toklen != NULL) *opt_toklen = n;
+ if (opt_endchar != NULL) *opt_endchar = c;
+ return status;
+}
+
+
+/* Function: esl_sprintf()
+ * Synopsis: Dynamic allocation version of sprintf().
+ *
+ * Purpose: Like ANSI C's <sprintf()>, except the string
+ * result is dynamically allocated, and returned
+ * through <*ret_s>.
+ *
+ * Caller is responsible for free'ing <*ret_s>.
+ *
+ * As a special case to facilitate some optional string
+ * initializations, if <format> is <NULL>, <*ret_s> is set
+ * to <NULL>.
+ *
+ * Returns: <eslOK> on success, and <*ret_s> is the resulting
+ * string.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslESYS> if a <*printf()> library call fails.
+ */
+int
+esl_sprintf(char **ret_s, const char *format, ...)
+{
+ va_list ap;
+ int status;
+
+ va_start(ap, format);
+ status = esl_vsprintf(ret_s, format, &ap);
+ va_end(ap);
+ return status;
+}
+
+/* Function: esl_vsprintf()
+ * Synopsis: Dynamic allocation version of vsprintf()
+ *
+ * Purpose: Like ANSI C's <vsprintf>, except the string
+ * result is dynamically allocated, and returned
+ * through <*ret_s>.
+ *
+ * Caller is responsible for free'ing <*ret_s>.
+ *
+ * As a special case to facilitate some optional string
+ * initializations, if <format> is <NULL>, <*ret_s> is set
+ * to <NULL>.
+ *
+ * Returns: <eslOK> on success, and <*ret_s> is the resulting
+ * string.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslESYS> if a <*printf()> library call fails.
+ */
+int
+esl_vsprintf(char **ret_s, const char *format, va_list *ap)
+{
+ char *s = NULL;
+ va_list ap2;
+ int n1, n2;
+ int status;
+
+ if (format == NULL) { *ret_s = NULL; return eslOK; }
+
+ va_copy(ap2, *ap);
+ n1 = strlen(format) * 2; /* initial guess at string size needed */
+ ESL_ALLOC(s, sizeof(char) * (n1+1));
+ if ((n2 = vsnprintf(s, n1+1, format, *ap)) >= n1)
+ {
+ ESL_REALLOC(s, sizeof(char) * (n2+1));
+ if (vsnprintf(s, n2+1, format, ap2) == -1) ESL_XEXCEPTION(eslESYS, "vsnprintf() failed");
+ }
+ else if (n2 == -1) ESL_XEXCEPTION(eslESYS, "vsnprintf() failed");
+
+ va_end(ap2);
+ *ret_s = s;
+ return eslOK;
+
+ ERROR:
+ if (s) free(s);
+ va_end(ap2);
+ *ret_s = NULL;
+ return status;
+}
+
+
+/* Function: esl_strcmp()
+ * Synopsis: a strcmp() that treats NULL as empty string.
+ *
+ * Purpose: A version of <strcmp()> that accepts <NULL>
+ * strings. If both <s1> and <s2> are non-<NULL>
+ * they are compared by <strcmp()>. If both are
+ * <NULL>, return 0 (as if they are identical
+ * strings). If only <s1> (or <s2>) is non-<NULL>,
+ * return 1 (or -1), corresponding to ordering
+ * any non-<NULL> string as greater than a <NULL>
+ * string.
+ *
+ * (Easel routinely uses NULL to mean an unset optional
+ * string, and often needs to compare two strings for
+ * equality.)
+ *
+ * Returns: 0 if <s1 == s2>; 1 if <s1 > s2>; -1 if <s1 < s2>.
+ */
+int
+esl_strcmp(const char *s1, const char *s2)
+{
+ if (s1 && s2) return strcmp(s1, s2);
+ else if (s1) return 1;
+ else if (s2) return -1;
+ else return 0;
+}
+/*--------- end, improved replacement ANSI C functions ----------*/
+
+
+
+/*****************************************************************
+ * 5. Portable drop-in replacements for non-standard C functions
+ *****************************************************************/
+
+#ifndef HAVE_STRCASECMP
+/* Function: esl_strcasecmp()
+ *
+ * Purpose: Compare strings <s1> and <s2>. Return -1 if
+ * <s1> is alphabetically less than <s2>, 0 if they
+ * match, and 1 if <s1> is alphabetically greater
+ * than <s2>. All matching is case-insensitive.
+ *
+ * Args: s1 - string 1, \0 terminated
+ * s2 - string 2, \0 terminated
+ *
+ * Returns: -1, 0, or 1, if <s1> is less than, equal, or
+ * greater than <s2>, case-insensitively.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_strcasecmp(const char *s1, const char *s2)
+{
+ int i, c1, c2;
+
+ for (i = 0; s1[i] != '\0' && s2[i] != '\0'; i++)
+ {
+ c1 = s1[i]; /* total paranoia. don't trust toupper() to */
+ c2 = s2[i]; /* leave the original unmodified; make a copy. */
+
+ if (islower(c1)) c1 = toupper(c1);
+ if (islower(c2)) c2 = toupper(c2);
+
+ if (c1 < c2) return -1;
+ else if (c1 > c2) return 1;
+ }
+
+ if (s1[i] != '\0') return 1; /* prefixes match, but s1 is longer */
+ else if (s2[i] != '\0') return -1; /* prefixes match, s2 is longer */
+
+ return 0; /* else, a case-insensitive match. */
+}
+#endif /* ! HAVE_STRCASECMP */
+/*------------- end, portable drop-in replacements --------------*/
+
+
+/*****************************************************************
+ * 6. Additional string functions, esl_str*()
+ *****************************************************************/
+
+/* Function: esl_strchop()
+ *
+ * Purpose: Chops trailing whitespace off of a string <s> (or if <s>
+ * is NULL, do nothing).
+ * <n> is the length of the input string, if known; or pass <n=-1>
+ * if length is unknown.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ *
+ * Xref: from squid's StringChop().
+ */
+int
+esl_strchop(char *s, int64_t n)
+{
+ int i;
+ if (s == NULL) return eslOK;
+ if (n < 0) n = strlen(s);
+ for (i = n-1; i>=0 && isspace((int) s[i]); i--);
+ s[i+1] = '\0';
+ return eslOK;
+}
+
+
+/* Function: esl_strdealign()
+ * Synopsis: Dealign a string according to gaps in a reference aseq.
+ *
+ * Purpose: Dealign string <s> in place, by removing any characters
+ * aligned to gaps in <aseq>. Gap characters are defined in the
+ * string <gapstring>; for example, <-_.>. Optionally return the
+ * unaligned length of <s> in characters in <*opt_rlen>.
+ *
+ * By providing a reference <aseq> to dealign against, this
+ * function can dealign aligned annotation strings, such as
+ * secondary structure or surface accessibility strings.
+ * If <s> is the same as <aseq>, then the aligned sequence
+ * itself is dealigned in place.
+ *
+ * To dealign both annotations and sequence, do the
+ * sequence last, since you need it as the reference <aseq>
+ * when doing the annotations.
+ *
+ * It is safe to pass a <NULL> <s> (an unset optional
+ * annotation), in which case the function no-ops and
+ * returns <eslOK>.
+ *
+ * Args: s - string to dealign
+ * aseq - reference aligned sequence seq
+ * gapchars - definition of gap characters ("-_." for example)
+ * opt_rlen - optRETURN: number of residues in <s> after dealign
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_strdealign(char *s, const char *aseq, const char *gapchars, int64_t *opt_rlen)
+{
+ int64_t n = 0;
+ int64_t apos;
+
+ if (s == NULL) return eslOK;
+
+ for (apos = 0; aseq[apos] != '\0'; apos++)
+ if (strchr(gapchars, aseq[apos]) == NULL)
+ s[n++] = s[apos];
+ s[n] = '\0';
+
+ if (opt_rlen != NULL) *opt_rlen = n;
+ return eslOK;
+}
+
+
+/* Function: esl_str_IsBlank()
+ * Synopsis: Return TRUE if <s> is all whitespace; else FALSE.
+ *
+ * Purpose: Given a NUL-terminated string <s>; return <TRUE> if
+ * string is entirely whitespace (as defined by <isspace()>),
+ * and return FALSE if not.
+ */
+int
+esl_str_IsBlank(char *s)
+{
+ for (; *s; s++) if (!isspace(*s)) return FALSE;
+ return TRUE;
+}
+
+/* Function: esl_str_IsInteger()
+ * Synopsis: Return TRUE if <s> represents an integer; else FALSE.
+ *
+ * Purpose: Given a NUL-terminated string <s>, return TRUE
+ * if the complete string is convertible to a base-10 integer
+ * by the rules of <strtol()> or <atoi()>.
+ *
+ * Leading and trailing whitespace is allowed, but otherwise
+ * the entire string <s> must be convertable. (Unlike <strtol()>
+ * itself, which will convert a prefix. ' 99 foo' converts
+ * to 99, but <esl_str_IsInteger()> will return FALSE.
+ *
+ * If <s> is <NULL>, FALSE is returned.
+ */
+int
+esl_str_IsInteger(char *s)
+{
+ char *endp;
+
+ if (s == NULL) return FALSE; /* it's NULL */
+ (void) strtol(s, &endp, 10); /* don't need result itself, discard to void */
+ if (endp == s) return FALSE; /* strtol() can't convert it */
+ for (s = endp; *s != '\0'; s++)
+ if (! isspace(*s)) return FALSE; /* it has trailing nonconverted nonwhitespace */
+ return TRUE;
+}
+
+/* Function: esl_str_IsReal()
+ * Synopsis: Return TRUE if string <s> represents a real number; else FALSE.
+ *
+ * Purpose: Given a NUL-terminated string <s>, return <TRUE>
+ * if the string is completely convertible to a floating-point
+ * real number by the rules of <strtod()> and <atof()>.
+ * (Which allow for exponential forms, hexadecimal forms,
+ * and case-insensitive INF, INFINITY, NAN, all w/ optional
+ * leading +/- sign.)
+ *
+ * No trailing garbage is allowed, unlike <strtod()>. The
+ * entire string must be convertible, allowing leading and
+ * trailing whitespace is allowed. '99.0 foo' converts
+ * to 99.0 with <strtod()> but is <FALSE> for
+ * <esl_str_IsReal()>. ' 99.0 ' is <TRUE>.
+ *
+ * If <s> is <NULL>, return <FALSE>.
+ */
+int
+esl_str_IsReal(char *s)
+{
+ char *endp;
+ double val;
+
+ if (! s) return FALSE; /* <s> is NULL */
+ val = strtod(s, &endp);
+ if (val == 0.0f && endp == s) return FALSE; /* strtod() can't convert it */
+ for (s = endp; *s != '\0'; s++)
+ if (! isspace(*s)) return FALSE; /* it has trailing nonconverted nonwhitespace */
+ return TRUE;
+}
+
+
+/* Function: esl_str_GetMaxWidth()
+ * Synopsis: Returns maximum strlen() in an array of strings.
+ *
+ * Purpose: Returns the length of the longest string in
+ * an array of <n> strings <s[0..n-1]>. If <n=0>,
+ * returns 0. Any <s[i]> that's <NULL> is counted
+ * as zero length.
+ */
+int64_t
+esl_str_GetMaxWidth(char **s, int n)
+{
+ int64_t max = 0;
+ int64_t len;
+ int i;
+
+ for (i = 0; i < n; i++)
+ if (s[i]) {
+ len = strlen(s[i]);
+ if (len > max) max = len;
+ }
+ return max;
+}
+
+
+/*-------------- end, additional string functions ---------------*/
+
+
+
+
+/*****************************************************************
+ * 7. File path/name manipulation, including tmpfiles
+ *****************************************************************/
+
+/* Function: esl_FileExists()
+ * Synopsis: Return TRUE if <filename> exists and is readable, else FALSE.
+ *
+ * Purpose: Returns TRUE if <filename> exists and is readable, else FALSE.
+ *
+ * Note: Testing a read-only fopen() is the only portable ANSI C
+ * I'm aware of. We could also use a POSIX func here, since
+ * we have a ESL_POSIX_AUGMENTATION flag in the code.
+ *
+ * Xref: squid's FileExists().
+ */
+int
+esl_FileExists(const char *filename)
+{
+#if defined _POSIX_VERSION
+ struct stat fileinfo;
+ if (stat(filename, &fileinfo) != 0) return FALSE;
+ if (! (fileinfo.st_mode & S_IRUSR)) return FALSE;
+ return TRUE;
+#else
+ FILE *fp;
+ if ((fp = fopen(filename, "r"))) { fclose(fp); return TRUE; }
+ return FALSE;
+#endif
+}
+
+
+/* Function: esl_FileTail()
+ * Synopsis: Extract filename, removing path prefix.
+ *
+ * Purpose: Given a full pathname <path>, extract the filename
+ * without the directory path; return it via
+ * <ret_filename>. <ret_filename> space is allocated
+ * here, and must be free'd by the caller.
+ * For example:
+ * </foo/bar/baz.1> becomes <baz.1>;
+ * <foo/bar> becomes <bar>;
+ * <foo> becomes <foo>; and
+ * </> becomes the empty string.
+ *
+ * If <nosuffix> is <TRUE>, the rightmost trailing ".foo" extension
+ * is removed too. The suffix is defined as everything following
+ * the rightmost period in the filename in <path>:
+ * with <nosuffix> <TRUE>,
+ * <foo.2/bar.idx> becomes <bar>,
+ * <foo.2/bar> becomes <bar>, and
+ * <foo.2/bar.1.3> becomes <bar.1>.
+ *
+ * Args: path - full pathname to process, "/foo/bar/baz.1"
+ * nosuffix - TRUE to remove rightmost suffix from the filename
+ * ret_file - RETURN: filename portion of the path.
+ *
+ * Returns: <eslOK> on success, and <ret_file> points to a newly
+ * allocated string containing the filename.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_FileTail(const char *path, int nosuffix, char **ret_file)
+{
+ int status;
+ char *tail = NULL;
+ char *lastslash;
+ char *lastdot;
+ /* remove directory prefix */
+ lastslash = strrchr(path, eslDIRSLASH);
+ ESL_ALLOC(tail, sizeof(char) * (strlen(path)+1)); /* a little overkill */
+ if (lastslash == NULL) strcpy(tail, path);
+ else strcpy(tail, lastslash+1);
+ /* remove trailing suffix */
+ if (nosuffix) {
+ if ((lastdot = strrchr(tail, '.')) != NULL)
+ *lastdot = '\0';
+ }
+ *ret_file = tail;
+ return eslOK;
+
+ ERROR:
+ if (tail != NULL) free(tail);
+ *ret_file = NULL;
+ return status;
+}
+
+/* Function: esl_file_Extension()
+ * Synopsis: Find suffix of a file name; set a memory line on it.
+ *
+ * Purpose: Given a path or file name <filename>, and ignoring the
+ * last <n_ignore> characters, find the rightmost suffix;
+ * return a pointer to its start in <*ret_sfx> (inclusive
+ * of the ``.''), and its length in <*ret_n>. If no
+ * suffix is found, return <eslFAIL> with <*ret_sfx = NULL>
+ * and <ret_n = 0>.
+ *
+ * The <n_ignore> argument allows iterating through more
+ * than one suffix.
+ *
+ * For example, if <filename> is ``./foo/bar/baz.xx.yyy''
+ * and <n_ignore> is 0, <*ret_sfx> points to ``.yyy'' and
+ * <*ret_n> is 4. If <n_ignore> is 4, then <*ret_sfx>
+ * points to ``.xx'' and <ret_n> is 3. If <n_ignore> is 7
+ * then status is <eslFAIL>.
+ */
+int
+esl_file_Extension(char *filename, esl_pos_t n_ignore, char **ret_sfx, esl_pos_t *ret_n)
+{
+ esl_pos_t n1 = strlen(filename) - n_ignore;
+ esl_pos_t n2;
+
+ for (n2 = n1; n2 > 0 && filename[n2-1] != eslDIRSLASH && filename[n2-1] != '.'; n2--) ;
+
+ if (n2 <= 0 || filename[n2-1] == eslDIRSLASH)
+ { *ret_sfx = NULL; *ret_n = 0; return eslFAIL; }
+
+ *ret_sfx = filename + n2 - 1;
+ *ret_n = n1-n2+1;
+ return eslOK;
+}
+
+
+/* Function: esl_FileConcat()
+ *
+ * Purpose: Concatenates directory path prefix <dir> and a filename
+ * <file>, and returns the new full pathname through
+ * <ret_path>. If <dir> does not already end in the
+ * appropriate delimiter (e.g. / for UNIX), one is added.
+ *
+ * If <dir> is NULL, then <ret_path> is just the same as
+ * <file>. Similarly, if <file> already appears to be a
+ * full path (because its first character is a /), then
+ * <dir> is ignored and <ret_path> is the same as
+ * <file>. It wouldn't normally make sense for a caller to
+ * call this function with such arguments.
+ *
+ * <file> may be a relative path. For example,
+ * if <dir> is "/usr/local" and <file> is "lib/myapp/data",
+ * <ret_path> will be "/usr/local/lib/myapp/data".
+ *
+ * Returns: <eslOK> on success, and puts the path
+ * in <ret_path>; this string is allocated here,
+ * and must be free'd by caller with <free()>.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEINVAL> on bad argument.
+ * In either case, <ret_path> is returned NULL.
+ *
+ * Xref: squid's FileConcat().
+ */
+int
+esl_FileConcat(const char *dir, const char *file, char **ret_path)
+{
+ char *path = NULL;
+ int nd, nf;
+ int status;
+
+ if (ret_path != NULL) *ret_path = NULL;
+ if (file == NULL) ESL_EXCEPTION(eslEINVAL, "null file");
+
+ nd = (dir != NULL)? strlen(dir) : 0;
+ nf = strlen(file);
+ ESL_ALLOC(path, sizeof(char) * (nd+nf+2));
+
+ if (dir == NULL) /* 1. silly caller didn't give a path */
+ strcpy(path, file);
+ else if (*file == eslDIRSLASH) /* 2. <file> is already a path? */
+ strcpy(path, file);
+ else if (dir[nd-1] == eslDIRSLASH) /* 3. <dir><file> (dir is / terminated) */
+ sprintf(path, "%s%s", dir, file);
+ else /* 4. <dir>/<file> (usual case) */
+ sprintf(path, "%s%c%s", dir, eslDIRSLASH, file);
+
+ *ret_path = path;
+ return eslOK;
+
+ ERROR:
+ if (path != NULL) free(path);
+ if (ret_path != NULL) *ret_path = NULL;
+ return status;
+}
+
+
+/* Function: esl_FileNewSuffix()
+ *
+ * Purpose: Add a file suffix <sfx> to <filename>; or if <filename>
+ * already has a suffix, replace it with <sfx>. A suffix is
+ * usually 2-4 letters following a '.' character. Returns
+ * an allocated string containing the result in <ret_newpath>.
+ *
+ * For example, if <filename> is "foo" and <sfx> is "ssi",
+ * returns "foo.ssi". If <filename> is "foo.db" and <sfx>
+ * is "idx", returns "foo.idx". You can remove a suffix
+ * too; if <filename> is "foo.db", and <sfx> is "", the
+ * result is "foo".
+ *
+ * Caller can either ask for <*ret_newpath> to be a new
+ * allocation by passing <*ret_newpath = NULL>, or can
+ * provide a ptr to a preallocated space.
+ *
+ * Returns: <eslOK> on success, and <ret_newpath> is set
+ * string "<base_filename>.<sfx>". Caller is
+ * responsible for free'ing this string, whether it
+ * provided it as preallocated space or asked for a new
+ * allocation.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ * Xref: squid's FileAddSuffix().
+ */
+int
+esl_FileNewSuffix(const char *filename, const char *sfx, char **ret_newpath)
+{
+ char *new = *ret_newpath; // caller either provides memory, or asks for allocation w/ <NULL>
+ char *lastdot;
+ int nf;
+ int status;
+
+ lastdot = strrchr(filename, '.'); /* check for suffix to replace */
+ if (lastdot != NULL &&
+ strchr(lastdot, eslDIRSLASH) != NULL)
+ lastdot = NULL; /*foo.1/filename case - don't be fooled.*/
+ nf = (lastdot == NULL)? strlen(filename) : lastdot-filename;
+
+ if (! new) ESL_ALLOC(new, sizeof(char) * (nf+strlen(sfx)+2)); /* '.' too */
+ strncpy(new, filename, nf);
+ *(new+nf) = '.';
+ strcpy(new+nf+1, sfx);
+
+ *ret_newpath = new;
+ return eslOK;
+
+ ERROR:
+ if (!(*ret_newpath) && new) free(new);
+ return status;
+}
+
+
+
+/* Function: esl_FileEnvOpen()
+ *
+ * Purpose: Looks for a file <fname> in a colon-separated list of
+ * directories that is configured in an environment variable
+ * <env>. The first occurrence of file <fname> in this directory
+ * list is opened read-only. The open file ptr is returned
+ * through <opt_fp>, and the full path name to the file
+ * that was opened is returned through <opt_path>.
+ * Caller can pass NULL in place of <opt_fp> or <opt_path>
+ * if it is not interested in one or both of these.
+ *
+ * Does not look in the current directory unless "." is
+ * explicitly in the directory list provided by <env>.
+ *
+ * Note: One reason to pass <opt_path> back to the caller is that
+ * sometimes we're opening the first in a group of files
+ * (for example, a database and its SSI index), and we want
+ * to make sure that after we find the main file, the
+ * caller can look for the auxiliary file(s) in exactly the
+ * same directory.
+ *
+ * Examples: % setenv BLASTDB /nfs/databases/blast-db:/nfs/databases/nr/
+ *
+ * FILE *fp;
+ * char *path;
+ * int status;
+ * status = esl_FileEnvOpen("swiss42", "BLASTDB", &fp, &path);
+ *
+ * Returns: <eslOK> on success, and provides <opt_fp> and <opt_path>;
+ * <opt_fp> is opened here, and must be <fclose()>'d by caller;
+ * <opt_path> is allocated here, and must be <free()>'d by caller.
+ *
+ * Returns <eslENOTFOUND> if the file not found in any directory,
+ * or if <env> does not contain any directories to look in.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ *
+ * Xref: squid's EnvFileOpen().
+ */
+int
+esl_FileEnvOpen(const char *fname, const char *env, FILE **opt_fp, char **opt_path)
+{
+ FILE *fp;
+ char *dirlist; /* :-separated list of directories */
+ char *s, *s2; /* ptrs into elems in env list */
+ char *path = NULL;
+ int np;
+ int status;
+
+ fp = NULL;
+ if (opt_fp != NULL) *opt_fp = NULL;
+ if (opt_path != NULL) *opt_path = NULL;
+
+ if (env == NULL) return eslENOTFOUND;
+ if ((s = getenv(env)) == NULL) return eslENOTFOUND;
+ if (esl_strdup(s, -1, &dirlist) != eslOK) return eslEMEM;
+
+ np = strlen(fname) + strlen(s) + 2; /* upper bound on full path len */
+ ESL_ALLOC(path, sizeof(char) * np);
+
+ s = dirlist;
+ while (s != NULL)
+ {
+ if ((s2 = strchr(s, ':')) != NULL) { *s2 = '\0'; s2++;} /* ~=strtok() */
+ sprintf(path, "%s%c%s", s, eslDIRSLASH, fname); /* // won't hurt */
+ if ((fp = fopen(path, "r")) != NULL) break;
+ s = s2;
+ }
+ if (fp == NULL) { free(path); free(dirlist); return eslENOTFOUND; }
+
+ if (opt_path != NULL) { *opt_path = path; } else free(path);
+ if (opt_fp != NULL) { *opt_fp = fp; } else fclose(fp);
+ free(dirlist);
+ return eslOK;
+
+ ERROR:
+ if (path != NULL) free(path);
+ if (fp != NULL) fclose(fp);
+ if (dirlist != NULL) free(dirlist);
+ if (opt_path != NULL) *opt_path = NULL;
+ if (opt_fp != NULL) *opt_fp = NULL;
+ return status;
+}
+
+/* Function: esl_tmpfile()
+ *
+ * Purpose: Open a secure temporary <FILE *> handle and return it in
+ * <ret_fp>. The file is opened in read-write mode (<w+b>)
+ * with permissions 0600, as an atomic operation using the
+ * POSIX <mkstemp()> function.
+ *
+ * The <basename6X> argument is a modifiable string that must
+ * end in "XXXXXX" (for example, "esltmpXXXXXX"). The
+ * <basename6X> is used to construct a unique tmpfile name.
+ *
+ * Note that this string must be modifiable; do not declare
+ * it <char *tmpfile = "esltmpXXXXXX";> nor <char tmpfile[]
+ * = "esltmpXXXXXX";> because these will not work on some
+ * compilers. Something like <char tmpfile[16] =
+ * "esltmpXXXXXX";> that explicitly allocates storage will
+ * suffice.
+ *
+ * The file is opened in a standard temporary file
+ * directory. The path is obtained from the environment
+ * variable <TMPDIR>; failing that, from the environment
+ * variable <TMP>; and failing that, </tmp> is used. If the
+ * process is running <setuid> or <setgid>, then the
+ * environment variables are ignored, and the temp file is
+ * always created in </tmp>.
+ *
+ * The created tmpfile is not persistent and is not visible
+ * to a directory listing. The caller may <rewind()> the
+ * <ret_fp> and do cycles of reading and/or writing, but
+ * once the <ret_fp> is closed, the file disappears. The
+ * caller does not need to <remove()> or <unlink()> it (and
+ * in fact, cannot do so, because it does not know the
+ * tmpfile's name).
+ *
+ * This function is a secure replacement for ANSI C
+ * <tmpfile()>, which is said to be insecurely implemented on
+ * some platforms.
+ *
+ * Returns: <eslOK> on success, and now <ret_fp> points to a new <FILE *>
+ * stream for the opened tempfile.
+ *
+ * Throws: <eslESYS> if a system call (including the <mkstemp()> call)
+ * fails, and and <ret_fp> is returned NULL. One possible
+ * problem is if the temporary directory doesn't exist or
+ * is not writable. This is considered to be a system
+ * error, not a user error, so Easel handles it as an exception.
+ *
+ * Xref: STL11/85. Substantially copied from David Wheeler,
+ * "Secure Programming for Linux and Unix HOWTO",
+ * http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/introduction.html.
+ * Copyright (C) 1999-2001 David A. Wheeler.
+ * Licensed under the MIT license; see Appendix C of the HOWTO.
+ * Thanks, David, for the clearest explanation of the issues
+ * that I've seen.
+ *
+ * I also referred to H. Chen, D. Dean, and D. Wagner,
+ * "Model checking one million lines of C code",
+ * In: Network and Distributed System Security Symposium, pp 171-185,
+ * San Diego, CA, February 2004;
+ * http://www.cs.ucdavis.edu/~hchen/paper/ndss04.pdf.
+ * Wheeler's implementation obeys Chen et al's "Property 5",
+ * governing secure use of tempfiles.
+ */
+int
+esl_tmpfile(char *basename6X, FILE **ret_fp)
+{
+ char *tmpdir = NULL;
+ char *path = NULL;
+ FILE *fp = NULL;
+ int fd;
+ int status;
+ mode_t old_mode;
+
+ /* Determine what tmp directory to use, and construct the
+ * file name.
+ */
+ if (getuid() == geteuid() && getgid() == getegid())
+ {
+ tmpdir = getenv("TMPDIR");
+ if (tmpdir == NULL) tmpdir = getenv("TMP");
+ }
+ if (tmpdir == NULL) tmpdir = "/tmp";
+ if ((status = esl_FileConcat(tmpdir, basename6X, &path)) != eslOK) goto ERROR;
+
+ old_mode = umask(077);
+ if ((fd = mkstemp(path)) < 0) ESL_XEXCEPTION(eslESYS, "mkstemp() failed.");
+ umask(old_mode);
+ if ((fp = fdopen(fd, "w+b")) == NULL) ESL_XEXCEPTION(eslESYS, "fdopen() failed.");
+ if (unlink(path) < 0) ESL_XEXCEPTION(eslESYS, "unlink() failed.");
+
+ *ret_fp = fp;
+ free(path);
+ return eslOK;
+
+ ERROR:
+ if (path != NULL) free(path);
+ if (fp != NULL) fclose(fp);
+ *ret_fp = NULL;
+ return status;
+}
+
+/* Function: esl_tmpfile_named()
+ *
+ * Purpose: Open a persistent temporary file relative to the current
+ * working directory. The file name is constructed from the
+ * <basename6X> argument, which must be a modifiable string
+ * ending in the six characters "XXXXXX". These are
+ * replaced by a unique character string by a call to POSIX
+ * <mkstemp()>. For example, <basename6X> might be
+ * <esltmpXXXXXX> on input, and <esltmp12ab34> on return; or, to
+ * put the tmp file in a subdirectory under the current
+ * working directory, something like <my_subdir/esltmpXXXXXX>
+ * on input resulting in something like
+ * <my_subdir/esltmp12ab34> on return. The tmpfile is opened
+ * for reading and writing (in mode <w+b> with permissions
+ * 0600) and the opened <FILE *> handle is returned through
+ * <ret_fp>.
+ *
+ * The created tmpfile is persistent: it will be visible in
+ * a directory listing, and will remain after program
+ * termination unless the caller explicitly removes it by a
+ * <remove()> or <unlink()> call.
+ *
+ * To use this function securely, if you reopen the
+ * tmpfile, you must only reopen it for reading, not
+ * writing, and you must not trust the contents.
+ *
+ * Because the <basename6X> will be modified, it cannot be
+ * a string constant (especially on a picky compiler like
+ * gcc). You have to declare it with something like
+ * <char tmpfile[32] = "esltmpXXXXXX";>
+ * not
+ * <char *tmpfile = "esltmpXXXXXX";>
+ * because a compiler is allowed to make the <*tmpfile> version
+ * a constant.
+ *
+ * Returns: <eslOK> on success, <basename6X> contains the name of the
+ * tmpfile, and <ret_fp> contains a new <FILE *> stream for the
+ * opened file.
+ *
+ * <eslFAIL> on failure, and <ret_fp> is returned NULL and
+ * the contents of <basename6X> are undefined. The most
+ * common reason for a failure will be that the caller does
+ * not have write permission for the directory that
+ * <basename6X> is in. Easel handles this as a normal (user)
+ * failure, not an exception, because these permissions are
+ * most likely in the user's control (in contrast to
+ * <esl_tmpfile()>, which always uses a system <TMPDIR>
+ * that should always be user-writable on a properly
+ * configured POSIX system).
+ *
+ * Xref: STL11/85.
+ */
+int
+esl_tmpfile_named(char *basename6X, FILE **ret_fp)
+{
+ FILE *fp;
+ mode_t old_mode;
+ int fd;
+
+ *ret_fp = NULL;
+ old_mode = umask(077);
+ if ((fd = mkstemp(basename6X)) < 0) return eslFAIL;
+ umask(old_mode);
+ if ((fp = fdopen(fd, "w+b")) == NULL) return eslFAIL;
+
+ *ret_fp = fp;
+ return eslOK;
+}
+
+
+/* Function: esl_getcwd()
+ * Synopsis: Gets the path for the current working directory.
+ *
+ * Purpose: Returns the path for the current working directory
+ * in <*ret_cwd>, as reported by POSIX <getcwd()>.
+ * <*ret_cmd> is allocated here and must be freed by
+ * the caller.
+ *
+ * Returns: <eslOK> on success, and <*ret_cwd> points to
+ * the pathname of the current working directory.
+ *
+ * If <getcwd()> is unavailable on this system,
+ * returns <eslEUNIMPLEMENTED> and <*ret_cwd> is <NULL>.
+ *
+ * If the pathname length exceeds a set limit (16384 char),
+ * returns <eslERANGE> and <*ret_cwd> is <NULL>.
+ *
+ * Throws: <eslEMEM> on allocation failure; <*ret_cwd> is <NULL>.
+ * <eslESYS> on getcwd() failure; <*ret_cwd> is <NULL>.
+ *
+ * Xref: J7/54.
+ */
+int
+esl_getcwd(char **ret_cwd)
+{
+ char *cwd = NULL;
+ int status = eslOK;
+#ifdef _POSIX_VERSION
+ int nalloc = 256;
+ int maxalloc = 16384;
+ do {
+ ESL_ALLOC(cwd, sizeof(char) * nalloc);
+ if (getcwd(cwd, nalloc) == NULL)
+ {
+ if (errno != ERANGE) ESL_XEXCEPTION(eslESYS, "unexpected getcwd() error");
+ if (nalloc * 2 > maxalloc) { status = eslERANGE; goto ERROR; }
+ free(cwd);
+ cwd = NULL;
+ nalloc *= 2;
+ }
+ } while (cwd == NULL);
+ *ret_cwd = cwd;
+ return status;
+
+ ERROR:
+ if (cwd) free(cwd);
+ *ret_cwd = NULL;
+ return status;
+
+#else
+ *ret_cwd = NULL;
+ return eslEUNIMPLEMENTED;
+#endif
+}
+
+/*----------------- end of file path/name functions ------------------------*/
+
+
+
+
+/*****************************************************************
+ * 8. Typed comparison routines.
+ *****************************************************************/
+
+/* Function: esl_DCompare()
+ *
+ * Purpose: Compare two floating point scalars <a> and <b> for approximate equality.
+ * Return <eslOK> if equal, <eslFAIL> if not.
+ *
+ * Equality is defined by being within a relative
+ * epsilon <tol>, as <2*fabs(a-b)/(a+b)> $\leq$ <tol>.
+ * Additionally, we catch the special cases where <a>
+ * and/or <b> are 0 or -0. If both are, return <eslOK>; if
+ * one is, check that the absolute value of the other is
+ * $\leq$ <tol>.
+ *
+ * <esl_DCompare()> and <esl_FCompare()> work on <double> and <float>
+ * scalars, respectively.
+ */
+int
+esl_DCompare(double a, double b, double tol)
+{
+ if (isinf(a) && isinf(b)) return eslOK;
+ if (isnan(a) && isnan(b)) return eslOK;
+ if (!isfinite(a) || !isfinite(b)) return eslFAIL;
+ if (a == b) return eslOK;
+ if (fabs(a) == 0. && fabs(b) <= tol) return eslOK;
+ if (fabs(b) == 0. && fabs(a) <= tol) return eslOK;
+ if (2.*fabs(a-b) / fabs(a+b) <= tol) return eslOK;
+ return eslFAIL;
+}
+int
+esl_FCompare(float a, float b, float tol)
+{
+ if (isinf(a) && isinf(b)) return eslOK;
+ if (isnan(a) && isnan(b)) return eslOK;
+ if (!isfinite(a) || !isfinite(b)) return eslFAIL;
+ if (a == b) return eslOK;
+ if (fabs(a) == 0. && fabs(b) <= tol) return eslOK;
+ if (fabs(b) == 0. && fabs(a) <= tol) return eslOK;
+ if (2.*fabs(a-b) / fabs(a+b) <= tol) return eslOK;
+ return eslFAIL;
+}
+
+/* Function: esl_DCompareAbs()
+ *
+ * Purpose: Compare two floating point scalars <a> and <b> for
+ * approximate equality, by absolute difference. Return
+ * <eslOK> if equal, <eslFAIL> if not.
+ *
+ * Equality is defined as <fabs(a-b) $\leq$ tol> for finite
+ * <a,b>; or <inf=inf>, <NaN=NaN> when either value is not
+ * finite.
+ *
+ * Generally it is preferable to compare floating point
+ * numbers for equality using relative difference: see
+ * <esl_{DF}Compare()>, and also Knuth's Seminumerical
+ * Algorithms. However, cases arise where absolute
+ * difference comparison is preferred. One such case is in
+ * comparing the log probability values of DP matrices,
+ * where numerical error tends to accumulate on an absolute
+ * scale, dependent more on the number of terms than on
+ * their magnitudes. DP cells with values that happen to be
+ * very close to zero can have high relative differences.
+ */
+int
+esl_DCompareAbs(double a, double b, double tol)
+{
+ if (isinf(a) && isinf(b)) return eslOK;
+ if (isnan(a) && isnan(b)) return eslOK;
+ if (!isfinite(a) || !isfinite(b)) return eslFAIL;
+ if (fabs(a-b) <= tol) return eslOK;
+ return eslFAIL;
+}
+int
+esl_FCompareAbs(float a, float b, float tol)
+{
+ if (isinf(a) && isinf(b)) return eslOK;
+ if (isnan(a) && isnan(b)) return eslOK;
+ if (!isfinite(a) || !isfinite(b)) return eslFAIL;
+ if (fabs(a-b) <= tol) return eslOK;
+ return eslFAIL;
+}
+
+
+
+
+
+/* Function: esl_CCompare()
+ * Synopsis: Compare two optional strings for equality.
+ *
+ * Purpose: Compare two optional strings <s1> and <s2>
+ * for equality.
+ *
+ * If they're non-<NULL> and identical up to their
+ * <NUL>-terminator, return <eslOK>.
+ *
+ * If they're both <NULL> (unset), return <eslOK>.
+ *
+ * Otherwise, they're not identical; return <eslFAIL>.
+ */
+int
+esl_CCompare(char *s1, char *s2)
+{
+ if (s1 == NULL && s2 == NULL) return eslOK;
+ if (s1 == NULL || s2 == NULL) return eslFAIL;
+ if (strcmp(s1, s2) != 0) return eslFAIL;
+ return eslOK;
+}
+
+
+/*-------------- end, typed comparison routines --------------------*/
+
+
+
+
+
+
+
+/*****************************************************************
+ * 9. Unit tests.
+ *****************************************************************/
+#ifdef eslEASEL_TESTDRIVE
+
+static void
+utest_IsInteger(void)
+{
+ char *goodones[] = { " 99 " };
+ char *badones[] = { "", " 99 foo " };
+ int ngood = sizeof(goodones) / sizeof(char *);
+ int nbad = sizeof(badones) / sizeof(char *);
+ int i;
+
+ for (i = 0; i < ngood; i++)
+ if (! esl_str_IsInteger(goodones[i])) esl_fatal("esl_str_IsInteger() should have recognized %s", goodones[i]);
+ for (i = 0; i < nbad; i++)
+ if ( esl_str_IsInteger(badones[i])) esl_fatal("esl_str_IsInteger() should not have recognized %s", badones[i]);
+}
+
+static void
+utest_IsReal(void)
+{
+ char *goodones[] = { "99", " \t 99", "-99.00", "+99.00e-12", "+0xabc.defp-12", " +INFINITY", "-nan" };
+ char *badones[] = { "",
+ "FIBB_BOVIN/67-212", /* testing for a fixed bug, 17 Dec 2012, reported by ER */
+ };
+ int ngood = sizeof(goodones) / sizeof(char *);
+ int nbad = sizeof(badones) / sizeof(char *);
+ int i;
+
+ for (i = 0; i < ngood; i++)
+ if (! esl_str_IsReal(goodones[i])) esl_fatal("esl_str_IsReal() should have recognized %s", goodones[i]);
+ for (i = 0; i < nbad; i++)
+ if ( esl_str_IsReal(badones[i])) esl_fatal("esl_str_IsReal() should not have recognized %s", badones[i]);
+}
+
+
+static void
+utest_strmapcat(void)
+{
+ char *msg = "esl_strmapcat() unit test failed";
+ ESL_DSQ inmap[128];
+ char *pfx = "testing testing";
+ char *append = "one two three";
+ char *bad = "1 2 three";
+ char *dest;
+ int64_t L1;
+ esl_pos_t L2;
+ int x;
+
+ /* a simple input map, for testing */
+ for (x = 0; x < 128; x++) inmap[x] = eslDSQ_ILLEGAL;
+ for (x = 'a'; x < 'z'; x++) inmap[x] = x;
+ for (x = 'A'; x < 'Z'; x++) inmap[x] = x;
+ inmap[' '] = eslDSQ_IGNORED;
+ inmap[0] = '?';
+
+ L1 = strlen(pfx);
+ L2 = strlen(append);
+ if ( ( esl_strdup (pfx, L1, &dest)) != eslOK) esl_fatal(msg);
+ if ( ( esl_strmapcat(inmap, &dest, &L1, append, L2)) != eslOK) esl_fatal(msg);
+ if ( strcmp(dest, "testing testingonetwothree") != 0) esl_fatal(msg);
+ free(dest);
+
+ L1 = -1;
+ L2 = -1;
+ if ( ( esl_strdup (pfx, L1, &dest)) != eslOK) esl_fatal(msg);
+ if ( ( esl_strmapcat(inmap, &dest, &L1, append, L2)) != eslOK) esl_fatal(msg);
+ if ( strcmp(dest, "testing testingonetwothree") != 0) esl_fatal(msg);
+ free(dest);
+
+ L1 = 0;
+ dest = NULL;
+ if ( ( esl_strmapcat(inmap, &dest, &L1, pfx, -1)) != eslOK) esl_fatal(msg);
+ if ( ( esl_strmapcat(inmap, &dest, &L1, append, -1)) != eslOK) esl_fatal(msg);
+ if ( strcmp(dest, "testingtestingonetwothree") != 0) esl_fatal(msg);
+ free(dest);
+
+
+ if ( ( esl_strdup(pfx, -1, &dest)) != eslOK) esl_fatal(msg);
+ L1 = 8;
+ if ( ( esl_strmapcat(inmap, &dest, &L1, bad, -1)) != eslEINVAL) esl_fatal(msg);
+ if ( strcmp(dest, "testing ??three") != 0) esl_fatal(msg);
+ free(dest);
+}
+
+
+static void
+utest_strtok(void)
+{
+ char msg[] = "esl_strtok() unit test failed";
+ char *teststring;
+ char *s;
+ char *tok;
+ int toklen;
+ char endc;
+
+ if (esl_strdup("This is\t a sentence.", -1, &teststring) != eslOK) esl_fatal(msg);
+
+ s = teststring;
+ if (esl_strtok(&s, " ", &tok) != eslOK) esl_fatal(msg);
+ if (strcmp(tok, "This") != 0) esl_fatal(msg);
+ if (*s != 'i') esl_fatal(msg);
+
+ if (esl_strtok_adv(&s, " \t", &tok, &toklen, &endc) != eslOK) esl_fatal(msg);
+ if (strcmp(tok, "is") != 0) esl_fatal(msg);
+ if (*s != ' ') esl_fatal(msg);
+ if (toklen != 2) esl_fatal(msg);
+ if (endc != '\t') esl_fatal(msg);
+
+ if (esl_strtok_adv(&s, "\n", &tok, NULL, NULL) != eslOK) esl_fatal(msg);
+ if (strcmp(tok, " a sentence.") != 0) esl_fatal(msg);
+ if (*s != '\0') esl_fatal(msg);
+
+ free(teststring);
+ return;
+}
+
+static void
+utest_sprintf(void)
+{
+ char msg[] = "unit tests for esl_[v]sprintf() failed";
+ int num = 99;
+ char *what = "beer";
+ char *s = NULL;
+
+ if (esl_sprintf(&s, "%d bottles of %s", num, what) != eslOK) esl_fatal(msg);
+ if (strcmp(s, "99 bottles of beer") != 0) esl_fatal(msg);
+ free(s);
+
+ if (esl_sprintf(&s, NULL) != eslOK) esl_fatal(msg);
+ if (s != NULL) esl_fatal(msg);
+}
+
+
+
+static void
+utest_FileExists(void)
+{
+ char msg[] = "FileExists unit test failed";
+ char tmpfile[32] = "esltmpXXXXXX";
+ FILE *fp = NULL;
+#ifdef _POSIX_VERSION
+ struct stat st;
+ mode_t mode;
+#endif
+
+ /* create a tmpfile */
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal(msg);
+ fprintf(fp, "Unit test.\n");
+ fclose(fp);
+
+ if (! esl_FileExists(tmpfile)) esl_fatal(msg);
+
+#ifdef _POSIX_VERSION
+ /* The FileExists doesn't just test existence; it also checks read permission */
+ if (stat(tmpfile, &st) != 0) esl_fatal(msg);
+ mode = st.st_mode & ~S_IRUSR;
+ if (chmod(tmpfile, mode) != 0) esl_fatal(msg);
+ if (esl_FileExists(tmpfile)) esl_fatal(msg);
+#endif
+
+ remove(tmpfile);
+ if (esl_FileExists(tmpfile)) esl_fatal(msg);
+ return;
+}
+
+static void
+utest_tmpfile_named(void)
+{
+ char msg[] = "tmpfile_named unit test failed";
+ char tmpfile[32] = "esltmpXXXXXX";
+ FILE *fp = NULL;
+ char buf[256];
+
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal(msg);
+ fprintf(fp, "Unit test.\n");
+ fclose(fp);
+ if ((fp = fopen(tmpfile, "r")) == NULL) esl_fatal(msg);
+ if (fgets(buf, 256, fp) == NULL) esl_fatal(msg);
+ if (strcmp(buf, "Unit test.\n") != 0) esl_fatal(msg);
+ fclose(fp);
+ remove(tmpfile);
+ return;
+}
+
+#endif /*eslEASEL_TESTDRIVE*/
+
+
+/*****************************************************************
+ * 10. Test driver.
+ *****************************************************************/
+
+#ifdef eslEASEL_TESTDRIVE
+/* gcc -g -Wall -o easel_utest -I. -L. -DeslEASEL_TESTDRIVE easel.c -leasel -lm
+ * ./easel_utest
+ */
+#include "easel.h"
+
+int main(void)
+{
+#ifdef eslTEST_THROWING
+ esl_exception_SetHandler(&esl_nonfatal_handler);
+#endif
+
+ utest_IsInteger();
+ utest_IsReal();
+ utest_strmapcat();
+ utest_strtok();
+ utest_sprintf();
+ utest_FileExists();
+ utest_tmpfile_named();
+ return eslOK;
+}
+#endif /*eslEASEL_TESTDRIVE*/
+
+/*****************************************************************
+ * 11. Examples.
+ *****************************************************************/
+
+#ifdef eslEASEL_EXAMPLE
+/*::cexcerpt::easel_example_tmpfiles::begin::*/
+/* gcc -g -Wall -o example -I. -L. -DeslEASEL_EXAMPLE_TMPFILES easel.c -leasel -lm
+ * ./example
+ */
+#include "easel.h"
+
+int main(void)
+{
+ char tmpfile1[32] = "esltmpXXXXXX"; /* a transient, secure tmpfile: 6 X's are important */
+ char tmpfile2[32] = "esltmpXXXXXX"; /* a named tmpfile */
+ FILE *fp = NULL;
+ char buf[256];
+
+ /* Example of using a secure, unnamed tmpfile.
+ * Note, the new tmpfile is automatically deleted, so to cleanup, just fclose() the FILE */
+ esl_tmpfile(tmpfile1, &fp);
+ fprintf(fp, "Hello world!\n");
+ rewind(fp);
+ fgets(buf, 256, fp);
+ printf("first temp file says: %s\n", buf);
+ fclose(fp);
+
+ /* Example of reasonably securely using a named tmpfile.
+ * To cleanup, must both fclose() the FILE and remove() the file by name */
+ esl_tmpfile_named(tmpfile2, &fp);
+ fprintf(fp, "Hello insecure world!\n");
+ fclose(fp); /* tmpfile2 now exists on disk and can be closed/reopened */
+
+ fp = fopen(tmpfile2, "r");
+ fgets(buf, 256, fp);
+ printf("second temp file says: %s\n", buf);
+ fclose(fp);
+ remove(tmpfile2); /* disk file cleanup necessary with this version. */
+
+ return eslOK;
+}
+/*::cexcerpt::easel_example_tmpfiles::end::*/
+#endif /*eslEASEL_EXAMPLE*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/easel.h b/easel.h
new file mode 100644
index 0000000..d275047
--- /dev/null
+++ b/easel.h
@@ -0,0 +1,498 @@
+/* Easel's foundation.
+ *
+ * Core functionality of easel: errors, memory allocations, constants,
+ * and configuration for portability.
+ *
+ * Contents:
+ * 1. Macros implementing Easel error handling conventions
+ * 2. Macros implementing Easel memory allocation conventions
+ * 3. Macros implementing Easel function argument conventions
+ * 4. Macros implementing Easel debugging output conventions
+ * 5. Defined constants
+ * 6. Basic support for Easel digitized biosequences
+ * 7. Miscellaneous
+ * 8. Void declarations of missing augmentations
+ * 9. API declarations of easel.c
+ * 10. Copyright and license.
+ */
+#ifndef eslEASEL_INCLUDED
+#define eslEASEL_INCLUDED
+
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h> /* for FILE */
+#include <stdarg.h> /* for va_list */
+#include <math.h> /* for HUGE_VAL */
+#ifdef HAVE_STDINT_H
+#include <stdint.h> /* for uint32_t and the like (C99) */
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h> /* some systems allegedly put uints here */
+#endif
+
+/*****************************************************************
+ * 1. Macros implementing Easel's error handling conventions
+ *****************************************************************/
+/* Many objects contain a fixed length "errbuf" for failure
+ * diagnostics: ESL_FAIL() and ESL_XFAIL() fill this buffer.
+ */
+#define eslERRBUFSIZE 128
+
+/* ESL_FAIL() - return an error message, without cleanup.
+ * ESL_XFAIL() - return an error message, with cleanup.
+ * ESL_EXCEPTION() - throwing an exception, without cleanup.
+ * ESL_XEXCEPTION() - throwing an exception, with cleanup.
+ *
+ * The X versions (with cleanup) require the caller to have an
+ * <int status> variable and a <ERROR:> goto target in scope,
+ * which, yes, is a little hacky.
+ *
+ * Wrapping these macros in <while(0)> loops allows a statement:
+ * if (something) ESL_XEXCEPTION(code,mesg);
+ * without the trailing semicolon becoming a null statement after
+ * macro expansion.
+ *
+ * All esl_fail() does is vsnprintf() to the <errbuf>; the reason to
+ * have ESL_FAIL and ESL_XFAIL call esl_fail() is to enable us to set
+ * a debugging breakpoint in esl_fail(), so we can break execution at
+ * a normal failure.
+ */
+/*::cexcerpt::error_macros::begin::*/
+#define ESL_FAIL(code, errbuf, ...) do { \
+ esl_fail(errbuf, __VA_ARGS__); \
+ return code; } \
+ while (0)
+
+#define ESL_XFAIL(code, errbuf, ...) do { \
+ status = code; \
+ esl_fail(errbuf, __VA_ARGS__); \
+ goto ERROR; } \
+ while (0)
+
+#define ESL_EXCEPTION(code, ...) do { \
+ esl_exception(code, FALSE, __FILE__, __LINE__, __VA_ARGS__); \
+ return code; } \
+ while (0)
+
+#define ESL_XEXCEPTION(code, ...) do { \
+ status = code; \
+ esl_exception(code, FALSE, __FILE__, __LINE__, __VA_ARGS__); \
+ goto ERROR; } \
+ while (0)
+
+#define ESL_EXCEPTION_SYS(code, ...) do { \
+ esl_exception(code, TRUE, __FILE__, __LINE__, __VA_ARGS__); \
+ return code; } \
+ while (0)
+
+#define ESL_XEXCEPTION_SYS(code, ...) do { \
+ status = code; \
+ esl_exception(code, TRUE, __FILE__, __LINE__, __VA_ARGS__); \
+ goto ERROR; } \
+ while (0)
+/*::cexcerpt::error_macros::end::*/
+
+
+
+
+/* Return codes for error handler
+ */
+/*::cexcerpt::statuscodes::begin::*/
+#define eslOK 0 /* no error/success */
+#define eslFAIL 1 /* failure */
+#define eslEOL 2 /* end-of-line (often normal) */
+#define eslEOF 3 /* end-of-file (often normal) */
+#define eslEOD 4 /* end-of-data (often normal) */
+#define eslEMEM 5 /* malloc or realloc failed */
+#define eslENOTFOUND 6 /* file or key not found */
+#define eslEFORMAT 7 /* file format not correct */
+#define eslEAMBIGUOUS 8 /* an ambiguity of some sort */
+#define eslEDIVZERO 9 /* attempted div by zero */
+#define eslEINCOMPAT 10 /* incompatible parameters */
+#define eslEINVAL 11 /* invalid argument/parameter */
+#define eslESYS 12 /* generic system call failure */
+#define eslECORRUPT 13 /* unexpected data corruption */
+#define eslEINCONCEIVABLE 14 /* "can't happen" error */
+#define eslESYNTAX 15 /* invalid user input syntax */
+#define eslERANGE 16 /* value out of allowed range */
+#define eslEDUP 17 /* saw a duplicate of something */
+#define eslENOHALT 18 /* a failure to converge */
+#define eslENORESULT 19 /* no result was obtained */
+#define eslENODATA 20 /* no data provided, file empty */
+#define eslETYPE 21 /* invalid type of argument */
+#define eslEOVERWRITE 22 /* attempted to overwrite data */
+#define eslENOSPACE 23 /* ran out of some resource */
+#define eslEUNIMPLEMENTED 24 /* feature is unimplemented */
+#define eslENOFORMAT 25 /* couldn't guess file format */
+#define eslENOALPHABET 26 /* couldn't guess seq alphabet */
+#define eslEWRITE 27 /* write failed (fprintf, etc) */
+#define eslEINACCURATE 28 /* return val may be inaccurate */
+/*::cexcerpt::statuscodes::end::*/
+
+
+
+
+
+
+/*****************************************************************
+ * 2. Macros implementing Easel's memory allocation conventions
+ *****************************************************************/
+/* ESL_ALLOC(), ESL_RALLOC():
+ *
+ * Allocation and reallocation wrappers.
+ * Both require <int status> in scope, and <ERROR:> goto target.
+ * ESL_RALLOC() also requires <void *> ptr to be provided as <tmp>.
+ *
+ * ESL_REALLOC() is a newer version of ESL_RALLOC() which doesn't
+ * need a tmp ptr. All ESL_RALLOC() calls can be safely converted
+ * to ESL_REALLOC() calls.
+ *
+ * The result of malloc(0) is implementation-defined (either NULL or
+ * a ptr that may not be dereferenced), a bit of a hole in the C
+ * standard. In Easel, we want to avoid having NULL as a valid
+ * non-error result of malloc(), because it confuses static analysis
+ * tools when they see dereferences of possibly NULL pointers. We
+ * therefore treat malloc(0) as an eslEMEM error.
+ */
+/*::cexcerpt::alloc_macros::begin::*/
+#define ESL_ALLOC(p, size) do {\
+ if ( size <= 0 ) { \
+ p = NULL; \
+ status = eslEMEM; \
+ esl_exception(status, FALSE, __FILE__, __LINE__, "zero malloc disallowed"); \
+ goto ERROR;\
+ }\
+ if ( ((p) = malloc(size)) == NULL) { \
+ status = eslEMEM;\
+ esl_exception(status, FALSE, __FILE__, __LINE__, "malloc of size %d failed", size); \
+ goto ERROR;\
+ }} while (0)
+
+#define ESL_RALLOC(p, tmp, newsize) do {\
+ if ((p) == NULL) { (tmp) = malloc(newsize); }\
+ else { (tmp) = realloc((p), (newsize)); }\
+ if ((tmp) != NULL) (p) = (tmp);\
+ else {\
+ status = eslEMEM;\
+ esl_exception(status, FALSE, __FILE__, __LINE__, "realloc for size %d failed", newsize); \
+ goto ERROR;\
+ }} while (0)
+
+#define ESL_REALLOC(p, newsize) do {\
+ void *esltmpp;\
+ if ((p) == NULL) { (esltmpp) = malloc(newsize); }\
+ else { (esltmpp) = realloc((p), (newsize)); }\
+ if ((esltmpp) != NULL) (p) = (esltmpp);\
+ else {\
+ status = eslEMEM;\
+ esl_exception(status, FALSE, __FILE__, __LINE__, "realloc for size %d failed", newsize); \
+ goto ERROR;\
+ }} while (0)
+/*::cexcerpt::alloc_macros::end::*/
+
+/* Convert MiB,GiB,TiB to bytes, using binary definitions (2^20, 2^30, 2^40):
+ * Pedantically speaking, that's: mebibytes (MiB), gibibytes (GiB), tebibytes (TiB).
+ * 1 TB = 10^12 bytes; 1 TiB = 2^40 bytes.
+ */
+#define ESL_MBYTES(x) ((x) * 1048576)
+#define ESL_GBYTES(x) ((x) * 1024 * 1048576)
+#define ESL_TBYTES(x) ((x) * 1024 * 1024 * 1048576)
+
+/* Round integer <n> up to the nearest multiple of <m>.
+ * Particularly useful when dealing w/ memory alignment issues.
+ */
+#define ESL_UPROUND(n, m) ( ((n) + (m)-1) / (m) * (m))
+
+
+/*****************************************************************
+ * 3. Macros implementing Easel's function argument conventions
+ *****************************************************************/
+
+#define esl_byp_IsInternal(p) ((p) == NULL)
+#define esl_byp_IsReturned(p) ((p) != NULL && (*p) == NULL)
+#define esl_byp_IsProvided(p) ((p) != NULL && (*p) != NULL)
+
+/* Sometimes a shared function API dictates arguments that a function
+ * doesn't use, and we want to silence compiler warnings about this.
+ * Putting ESL_UNUSED(x) in the function, for an unused argument <x>,
+ * should silence the compiler, and should generate a no-op.
+ */
+#define ESL_UNUSED(x) (void)(sizeof((x)))
+
+
+/*****************************************************************
+ * 4. Macros implementing Easel's debugging output conventions
+ *****************************************************************/
+/* Debugging hooks, w/ three levels (1-3).
+ */
+#if eslDEBUGLEVEL >= 1 /* for ESL_DASSERT() macros */
+#include <assert.h>
+#endif
+
+#if (eslDEBUGLEVEL >= 1)
+#define ESL_DPRINTF1(x) printf x
+#define ESL_DASSERT1(x) assert x
+#else
+#define ESL_DPRINTF1(x)
+#define ESL_DASSERT1(x)
+#endif
+#if (eslDEBUGLEVEL >= 2)
+#define ESL_DPRINTF2(x) printf x
+#define ESL_DASSERT2(x) assert x
+#else
+#define ESL_DPRINTF2(x)
+#define ESL_DASSERT2(x)
+#endif
+#if (eslDEBUGLEVEL >= 3)
+#define ESL_DPRINTF3(x) printf x
+#define ESL_DASSERT3(x) assert x
+#else
+#define ESL_DPRINTF3(x)
+#define ESL_DASSERT3(x)
+#endif
+
+
+/*****************************************************************
+ * 5. Defined constants
+ *****************************************************************/
+
+/* Making sure TRUE/FALSE are defined, for convenience */
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+/* Some basic mathematical constants.
+ * Assuming IEEE754 math with 64-bit doubles (53-bit mantissas), we
+ * want 17 significant decimal digits in our constants. More is
+ * a waste (but we do it for some anyway).
+ */
+#define eslCONST_E 2.71828182845904523536028747135
+#define eslCONST_PI 3.14159265358979323846264338328
+#define eslCONST_EULER 0.57721566490153286060651209008
+#define eslCONST_GOLD 1.61803398874989484820458683437
+#define eslCONST_LOG2 0.69314718055994529
+#define eslCONST_LOG2R 1.44269504088896341
+
+/* Define <eslINFINITY>, <eslNaN> portably.
+ * ANSI C99 makes it easy (at last!). The failovers to other pre-C99
+ * methods are legacy now that we require a C99 compiler - but no harm
+ * leaving them in Just In Case.
+ */
+#if defined (INFINITY)
+#define eslINFINITY INFINITY /* C99 */
+#elif defined (HUGE_VAL)
+#define eslINFINITY HUGE_VAL /* assume IEEE754 HUGE_VAL = infinity. ok? */
+#else
+#define eslINFINITY (1.0/0.0) /* portable? */
+#endif
+
+#if defined (NAN)
+#define eslNaN NAN /* C99 */
+#else
+#define eslNaN (eslINFINITY/eslINFINITY) /* portably make a IEEE754 NaN */
+#endif
+
+/* Define crossovers for numerical approximations.
+ */
+/* log(1+x) ~ x and 1-e^x = -x approximation.
+ * Same threshold appears to be optimal for float or double x. xref STL9/138.
+ */
+#define eslSMALLX1 5e-9
+
+
+/*****************************************************************
+ * 6. Basic support for Easel's digitized biosequences.
+ *****************************************************************/
+
+/* Most of this support is in the alphabet module, but we externalize
+ * some into the easel foundation because ESL_INMAP is used in unaugmented
+ * sqio, msa modules.
+ *
+ * A digital sequence residue (ESL_DSQ) is an unsigned 8-bit type
+ * (0..255). A valid digital residue has a value in the range 0..127
+ * (Easel can represent alphabets of up to 128 different characters).
+ * Values 128..255 are reserved for flags.
+ *
+ * An "inmap" is ESL_DSQ[128], or *ESL_DSQ allocated for 128 values;
+ * it is a many-to-one construct for mapping 7-bit ASCII chars (in
+ * range 0..127) either to new ASCII chars (in the case of raw
+ * sequence input in sqio, msa) or to digital codes (in the alphabet
+ * module). Valid mapped values are 0..127; any value in range
+ * 128..255 is some kind of flag.
+ */
+typedef uint8_t ESL_DSQ;
+#define eslDSQ_SENTINEL 255 /* sentinel bytes 0,L+1 in a dsq */
+#define eslDSQ_ILLEGAL 254 /* input symbol is unmapped and unexpected */
+#define eslDSQ_IGNORED 253 /* input symbol is unmapped and ignored */
+#define eslDSQ_EOL 252 /* input symbol marks end of a line */
+#define eslDSQ_EOD 251 /* input symbol marks end of a seq record */
+
+/* If you try to test sym > 0 && sym <= 127 below, instead of isascii(sym),
+ * you'll get a compiler warning for an always-successful test regardless
+ * of whether a char is signed or unsigned. So we trust that isascii() is
+ * doing the Right Thing.
+ */
+#define esl_inmap_IsValid(inmap, sym) (isascii(sym) && (inmap)[(int)sym] <= 127)
+
+
+/*****************************************************************
+ * 7. Miscellaneous.
+ *****************************************************************/
+/* A placeholder for helping w/ portability of filenames/paths.
+ * I think, but have not tested, that:
+ * VMS: #define DIRSLASH ']'
+ * ancient MacOS: #define DIRSLASH ':'
+ * DOS: #define DIRSLASH '\\'
+ * Setting DIRSLASH correctly is probably not the only thing
+ * that would need to be done to port to other OS's, but it's
+ * probably a start.
+ *
+ * The code assumes that '.' is used for file name extensions,
+ * such as "foo.bar".
+ *
+ * This gets used in easel.c's *_File*() functions.
+ */
+#define eslDIRSLASH '/' /* UNIX directory paths have /foo/bar */
+
+/* Some generic macros for swapping, min, and max.
+ */
+#define ESL_SWAP(x, y, type) do { type esltmpxyz = (x); (x) = (y); (y) = esltmpxyz; } while (0)
+#define ESL_MIN(a,b) (((a)<(b))?(a):(b))
+#define ESL_MAX(a,b) (((a)>(b))?(a):(b))
+
+static inline float esl_log (double x) { return (x == 0.0 ? -eslINFINITY : log(x)); } /* avoid fp exceptions; log(0) = -inf is fine */
+static inline float esl_logf(float x) { return (x == 0.0 ? -eslINFINITY : logf(x)); }
+static inline float esl_log2f(float x) { return (x == 0.0 ? -eslINFINITY : eslCONST_LOG2R * logf(x)); }
+
+/* Typedef: <esl_pos_t>
+ *
+ * <esl_pos_t> is a signed integer type suitable for safe casting
+ * to EITHER an <off_t> or <size_t> on this system (i.e. as a position
+ * in memory or in a file on disk), where we may use a -1 as a flag
+ * (or even other negative numbers).
+ *
+ * <esl_pos_t> is for use for anything having to do with positions in
+ * large buffers, strings, or files, where we want strict control
+ * of integer range limits.
+ *
+ * Note that POSIX requires size_t to be unsigned, and off_t to be
+ * signed.
+ */
+typedef int64_t esl_pos_t;
+
+
+/* ESL_ANALYZER_NORETURN
+ * adds some optional support for clang static analysis.
+ * The static analyzer sometimes needs to be clued in when a
+ * function cannot return: fatal error handlers, for example.
+ * clang, gcc, and other gcc-like compilers support the __attribute__
+ * extension on function declarations. We detect this support
+ * at compile-time in the configure script. Functions that
+ * don't return are declared like:
+ * extern void fatal(char *msg, ...) ESL_ANALYZER_NORETURN;
+ */
+#ifndef ESL_ANALYZER_NORETURN
+#ifdef HAVE_FUNC_ATTRIBUTE_NORETURN
+#define ESL_ANALYZER_NORETURN __attribute__((__noreturn__))
+#else
+#define ESL_ANALYZER_NORETURN
+#endif
+#endif
+
+
+
+
+/*****************************************************************
+ * 8. Void declarations of missing augmentations
+ *****************************************************************/
+#ifndef eslAUGMENT_ALPHABET
+typedef void ESL_ALPHABET;
+#endif
+#ifndef eslAUGMENT_KEYHASH
+typedef void ESL_KEYHASH;
+#endif
+
+/*****************************************************************
+ * 9. The API declarations for easel.c
+ *****************************************************************/
+
+/* 1. Error handling. */
+typedef void (*esl_exception_handler_f)(int errcode, int use_errno, char *sourcefile, int sourceline, char *format, va_list argp);
+extern void esl_fail(char *errbuf, const char *format, ...);
+extern void esl_exception(int errcode, int use_errno, char *sourcefile, int sourceline, char *format, ...);
+extern void esl_exception_SetHandler(esl_exception_handler_f);
+extern void esl_exception_ResetDefaultHandler(void);
+extern void esl_nonfatal_handler(int errcode, int use_errno, char *sourcefile, int sourceline, char *format, va_list argp);
+extern void esl_fatal(const char *format, ...) ESL_ANALYZER_NORETURN;
+
+/* 2. Memory allocation/deallocation conventions. */
+extern void esl_Free2D(void **p, int dim1);
+extern void esl_Free3D(void ***p, int dim1, int dim2);
+
+/* 3. Standard banner for Easel miniapplications. */
+extern int esl_banner (FILE *fp, char *progname, char *banner);
+extern int esl_usage (FILE *fp, char *progname, char *usage);
+extern int esl_dataheader(FILE *fp, ...);
+
+/* 4. Improved replacements for some C library functions */
+extern int esl_fgets(char **buf, int *n, FILE *fp);
+extern int esl_strdup(const char *s, int64_t n, char **ret_dup);
+extern int esl_strcat(char **dest, int64_t ldest, const char *src, int64_t lsrc);
+extern int esl_strmapcat (const ESL_DSQ *inmap, char **dest, int64_t *ldest, const char *src, esl_pos_t lsrc);
+extern int esl_strmapcat_noalloc(const ESL_DSQ *inmap, char *dest, int64_t *ldest, const char *src, esl_pos_t lsrc);
+extern int esl_strtok (char **s, char *delim, char **ret_tok);
+extern int esl_strtok_adv(char **s, char *delim, char **ret_tok, int *opt_toklen, char *opt_endchar);
+extern int esl_sprintf (char **ret_s, const char *format, ...);
+extern int esl_vsprintf(char **ret_s, const char *format, va_list *ap);
+extern int esl_strcmp(const char *s1, const char *s2);
+
+/* 5. Portable drop-in replacements for non-standard C functions */
+#ifndef HAVE_STRCASECMP
+#ifdef _MSC_VER
+#define strcasecmp stricmp
+#else
+extern int esl_strcasecmp(const char *s1, const char *s2);
+#define strcasecmp esl_strcasecmp
+#endif
+#endif
+
+/* 6. Additional string functions, esl_str*() */
+extern int esl_strchop(char *s, int64_t n);
+extern int esl_strdealign(char *s, const char *aseq, const char *gapchars, int64_t *opt_rlen);
+extern int esl_str_IsBlank(char *s);
+extern int esl_str_IsInteger(char *s);
+extern int esl_str_IsReal(char *s);
+extern int64_t esl_str_GetMaxWidth(char **s, int n);
+
+/* 7. File path/name manipulation functions, including tmpfiles */
+extern int esl_FileExists(const char *filename);
+extern int esl_FileTail(const char *path, int nosuffix, char **ret_file);
+extern int esl_file_Extension(char *filename, esl_pos_t n_ignore, char **ret_sfx, esl_pos_t *ret_n);
+extern int esl_FileConcat(const char *dir, const char *file, char **ret_path);
+extern int esl_FileNewSuffix(const char *filename, const char *sfx, char **ret_newpath);
+extern int esl_FileEnvOpen(const char *fname, const char *env,
+ FILE **ret_fp, char **ret_path);
+extern int esl_tmpfile(char *basename6X, FILE **ret_fp);
+extern int esl_tmpfile_named(char *basename6X, FILE **ret_fp);
+extern int esl_getcwd(char **ret_cwd);
+
+/* 8. Typed comparison routines. */
+extern int esl_DCompare (double a, double b, double tol);
+extern int esl_FCompare (float a, float b, float tol);
+extern int esl_DCompareAbs(double a, double b, double tol);
+extern int esl_FCompareAbs(float a, float b, float tol);
+extern int esl_CCompare(char *s1, char *s2);
+
+#endif /*eslEASEL_INCLUDED*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/easel.tex b/easel.tex
new file mode 100644
index 0000000..35dc71b
--- /dev/null
+++ b/easel.tex
@@ -0,0 +1,413 @@
+The easel (esl) module implements a small set of functionality shared
+by all the modules: notably, the error-handling system.
+
+\section{Error handling conventions}
+
+Easel might be used in applications ranging from small command line
+utilities to complex graphical user interfaces and parallel
+systems. Simple and complex applications have different needs for how
+errors should be handled by a library.
+
+In a simple application, we don't want to write a lot of code to
+checking return codes for unexpected problems. We would prefer to have
+Easel crash out with an appropriate message to \ccode{stderr} -- after
+all, that's all a simple application would do anyway.
+
+On the other hand, there are certain problems that even the simplest
+command-line applications should handle gracefully. Errors involving
+user input (including typos in command line arguments, bad file
+formats, nonexistent files, or bad file permissions) are ``normal''
+and should be expected. Users will do anything.
+
+In a complex application, we may want to guarantee that execution
+never terminates within a library routine. In this case, library
+functions always need to return control to the application, even in
+the most unexpected circumstances, so the application can fail
+gracefully. A failure in an Easel routine should not suddenly crash a
+whole graphical user environment, for example. Additionally, because a
+complex application may not even be associated with a terminal, a
+library cannot count on printing error messages directly to
+\ccode{stderr}.
+
+These considerations motivate Easel's error handling conventions.
+Most Easel procedures return an integer status code. An \ccode{eslOK}
+code indicates that the procedure succeeded. A nonzero code indicates
+an error. Easel distinguishes two kinds of errors:
+
+\begin{itemize}
+\item \textbf{Failures} include normal ``errors'' (like a read failing
+ when the end of a file is reached), and errors that are the user's
+ fault, such as bad input (which are also normal, because users will
+ do anything.) We say that failures are \textbf{returned} by Easel
+ functions. All applications should check the return status of any
+ Easel function that might return a failure code. Relatively few
+ Easel functions can return failure codes. The ones that do are
+ generally functions having to do with reading user input.
+
+\item \textbf{Exceptions} are errors that are the fault of Easel (bugs
+in my code) or your application (bugs in your code) or the system
+(resource allocation failures). We say that exceptions are
+\textbf{thrown} by Easel functions. By default, exceptions result in
+immediate termination of your program. Optionally, you may provide
+your own exception handler, in which case Easel functions may return
+nonzero exception codes (in addition to any nonzero failure codes).
+\end{itemize}
+
+The documentation for each Easel function lists what failure codes it
+may return, as well as what exception codes it may throw (if a
+nonfatal exception handler has been registered), in addition to the
+\ccode{eslOK} normal status code. The list of possible status codes is
+shown in Table~\ref{tbl:statuscodes}. There is no intrinsic
+distinction between failure codes and exception codes. Codes that
+indicate failures in one function may indicate exceptions in another
+function.
+
+\begin{table}
+\begin{center}
+\input{cexcerpts/statuscodes}
+\end{center}
+\caption{List of all status codes that might be returned by Easel functions.}
+\label{tbl:statuscodes}
+\end{table}
+
+Not all Easel functions return status codes. \ccode{*\_Create()}
+functions that allocate and create new objects usually follow a
+convention of returning a valid pointer on success, and \ccode{NULL}
+on failure; these are functions that only fail by memory allocation
+failure. Destructor functions (\ccode{*\_Destroy()}) always return
+\ccode{void}, and must have no points of failure of their own, because
+destructors can be called when we're already handling an
+exception. Functions with names containing \ccode{Is}, such as
+\ccode{esl\_abc\_XIsValid()}, are tests that return \ccode{TRUE} or
+\ccode{FALSE}. Finally, there are some ``true'' functions that simply
+return an answer, rather than a status code; these must be functions
+that have no points of failure.
+
+\subsection{Failure messages}
+
+When failures occur, often the failure status code is sufficient for
+your application to know what went wrong. For instance, \ccode{eslEOF}
+means end-of-file, so your application might report \ccode{"premature
+end of file"} if it receives such a status code unexpectedly. But for
+failures involving a file format syntax problem (for instance) a terse
+\ccode{eslESYNTAX} return code is not as useful as knowing
+\ccode{"Parse failed at line 42 of file foo.data, where I expected to
+see an integer, but I saw nothing"}. When your application might want
+more information to format an informative failure message for the
+user, the Easel API provides (somewhere) a message buffer called
+\ccode{errbuf[]}.
+
+In many cases, file parsers in Easel are encapsulated in objects. In
+these cases, the object itself allocates an \ccode{errbuf[]} message
+string. (For instance, see the \eslmod{sqio} module and its
+\ccode{ESL\_SQFILE} object for sequence file parsing.) In a few
+cases, the \ccode{errbuf[]} is part of the procedure's call API, and
+space is provided by the caller. In such cases, the caller either
+passes \ccode{NULL} (no failure message is requested) or a pointer to
+allocated space for at least \ccode{eslERRBUFSIZE} chars. (For
+instance, see the \eslmod{tree} module and the
+\ccode{esl\_tree\_ReadNewick()} parser.)
+
+Easel uses \ccode{sprintf()} to format the messages in
+\ccode{errbuf[]}'s. Each individual call guarantees that the size of
+its message cannot overflow \ccode{eslERRBUFSIZE} chars, so none of
+these \ccode{sprintf()} calls represent possible security
+vulnerabilities (buffer overrun attacks).
+
+
+\subsection{Exception handling}
+
+Easel's default exception handler prints a message to \ccode{stderr}
+and aborts execution of your program, as in:
+
+\begin{cchunk}
+ Easel exception: Memory allocation failed.
+ Aborted at file sqio.c, line 42.
+\end{cchunk}
+
+Therefore, by default, Easel handles its own exceptions internally,
+and exception status codes are not returned to your
+application. Simple applications don't need to worry about checking
+for exceptions.
+
+If your application wants to handle exceptions itself -- for instance,
+if you want a guarantee that execution will never terminate from
+within Easel -- or even if you simply want to change the format of
+these messages, you can register a custom exception handler which will
+catch the information from Easel and react appropriately. If your
+exception handler prints a message and exits, Easel will still just
+abort without returning exception codes. If your exception handler is
+nonfatal (returning \ccode{void}), Easel procedures then percolate the
+exception code up through the call stack until the exception code is
+returned to your application.
+
+To provide your own exception handler, you define your exception
+handler with the following prototype:
+
+\begin{cchunk}
+extern void my_exception_handler(int code, char *file, int line, char *format, va_list arg);
+\end{cchunk}
+
+An example implementation of a nonfatal exception handler:
+
+\begin{cchunk}
+#include <stdarg.h>
+
+void
+my_exception_handler(int code, char *file, int line, char *format, va_list arg)
+{
+ fprintf(stderr, ``Easel threw an exception (code %d):\n'', code);
+ if (format != NULL) vfprintf(stderr, format, arg);
+ fprintf(stderr, ``at line %d, file %s\b'', line, file);
+ return;
+}
+\end{cchunk}
+
+The \ccode{code}, \ccode{file}, and \ccode{line} are always
+present. The formatted message (the \ccode{format} and \ccode{va\_list
+arg}) is optional; the \ccode{format} might be
+\ccode{NULL}. (\ccode{NULL} messages are used when percolating
+exceptions up a stack trace, for example.)
+
+Then, to register your exception handler, you call
+\ccode{esl\_exception\_SetHandler(\&my\_error\_handler)} in your
+application. Normally you would do this before calling any other Easel
+functions. However, in principle, you can change error handlers at any
+time. You can also restore the default handler at any time with
+\ccode{esl\_exception\_RestoreDefaultHandler()}.
+
+The implementation of the exception handler relies on a static
+function pointer that is not threadsafe. If you are writing a threaded
+program, you need to make sure that multiple threads do not try to
+change the handler at the same time.
+
+Because Easel functions call other Easel functions, the function that
+first throws an exception may not be the function that your
+application called. If you implement a nonfatal handler, an exception
+may result in a partial or complete stack trace of exceptions, as the
+original exception percolates back to your application. Your exception
+handler should be able to deal with a stack trace. The first exception
+code and message will be the most relevant. Subsequent codes and
+messages arise from that exception percolating upwards.
+
+For example, a sophisticated replacement exception handler might push
+each code/message pair into a FIFO queue. When your application
+receives an exception code from an Easel call, your application can
+might then access this queue, and see where the exception occurred in
+Easel, and what messages Easel left for you. A less sophisticated
+replacement exception handler might just register the first
+code/message pair, and ignore the subsequent exceptions from
+percolating up the stack trace. Note the difference between the
+exception handler that you register with Easel (which operates inside
+Easel, and must obey Easel's conventions) and any error handling you
+do in your own application after Easel returns a nonzero status code
+to you (which is your own business).
+
+Although each function's documentation \emph{in principle} lists all
+thrown exceptions, \emph{in practice}, you should not trust this
+list. Because of exceptions percolating up from other Easel calls, it
+is too easy to forget to document all possible exception
+codes.\footnote{Someday we should combine a static code analyzer with
+a script that understands Easel's exception conventions, and automate
+the enumeration of all possible codes.} If you are catching
+exceptions, you should program defensively here, and always have a
+failsafe catch for any nonzero return status. For example, a minimal
+try/catch idiom for an application calling a Easel function is
+something like:
+
+\begin{cchunk}
+ int status;
+ if ((status = esl_foo_function()) != eslOK) my_failure();
+\end{cchunk}
+
+Or, a little more complex one that catches some specific errors, but
+has a failsafe for everything else, is:
+
+\begin{cchunk}
+ int status;
+ status = esl_foo_function();
+ if (status == eslEMEM) my_failure("Memory allocation failure");
+ else if (status != eslOK) my_failure("Unexpected exception %d\n\", status);
+\end{cchunk}
+
+
+\subsection{Violations}
+
+Internally, Easel also distinguishes a third class of error, termed a
+\textbf{fatal violation}. Violations never arise in production code;
+they are used to catch bugs during development and testing. Violations
+always result in immediate program termination. They are generated by
+two mechanisms: from assertions that can be optionally enabled in
+development code, or from test harnesses that call the always-fatal
+\ccode{esl\_fatal()} function when they detect a problem they're
+testing for.
+
+
+\subsection{Internal API for error handling}
+
+You only need to understand this section if you want to understand
+Easel's source code (or other code that uses Easel conventions, like
+HMMER), or if you want to use Easel's error conventions in your own
+source code.
+
+The potentially tricky design issue is the following. One the one
+hand, you want to be able to return an error or throw an exception
+``quickly'' (in less than a line of code). On the other hand, it might
+require several lines of code to free any resources, set an
+appropriate return state, and set the appropriate nonzero status code
+before leaving the function.
+
+Easel uses the following error-handling macros:
+
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\ccode{ESL\_FAIL(code, errbuf, mesg, ...)} & Format errbuf, return failure code. \\
+\ccode{ESL\_EXCEPTION(code, mesg, ...)} & Throw an exception, return exception code. \\
+\ccode{ESL\_XFAIL(code, errbuf, mesg, ...)} & A failure message, with cleanup convention.\\
+\ccode{ESL\_XEXCEPTION(code, mesg, ...)} & An exception, with cleanup convention.\\
+\hline
+\end{tabular}
+}
+\end{center}
+
+They are implementated in \ccode{easel.h} as:
+
+\input{cexcerpts/error_macros}
+
+The \ccode{ESL\_FAIL} and \ccode{ESL\_XFAIL} macros are only used when
+a failure message needs to be formatted. For the simpler case where we
+just return an error code, Easel simply uses \ccode{return code;} or
+\ccode{status = code; goto ERROR;}, respectively.
+
+The \ccode{X} versions, with the cleanup convention, are sure to
+offend some programmers' sensibilities. They require the function to
+provide an \ccode{int status} variable in scope, and they require an
+\ccode{ERROR:} target for a \ccode{goto}. But if you can stomach that,
+they provide for a fairly clean idiom for catching exceptions and
+cleaning up, and cleanly setting different return variable states on
+success versus failure, as illustrated by this pseudoexample:
+
+\begin{cchunk}
+int
+foo(char **ret_buf, char **ret_fp)
+{
+ int status;
+ char *buf = NULL;
+ FILE *fp = NULL;
+
+ if ((buf = malloc(100)) == NULL) ESL_XEXCEPTION(eslEMEM, "malloc failed");
+ if ((fp = fopen("foo")) == NULL) ESL_XEXCEPTION(eslENOTFOUND, "file open failed");
+
+ *ret_buf = buf;
+ *ret_fp = fp;
+ return eslOK;
+
+ ERROR:
+ if (buf != NULL) free(buf); *ret_buf = NULL;
+ if (fp != NULL) fclose(fp); *ret_fp = NULL;
+ return status;
+}
+\end{cchunk}
+
+Additionally, for memory allocation and reallocation, Easel implements
+two macros \ccode{ESL\_ALLOC()} and \ccode{ESL\_RALLOC()}, which
+encapsulate standard \ccode{malloc()} and \ccode{realloc()} calls
+inside Easel's exception-throwing convention.
+
+
+\vspace*{\fill}
+\begin{quote}
+\emph{Only a complete outsider could ask your question. Are there
+control authorities? There are nothing but control authorities. Of
+course, their purpose is not to uncover errors in the ordinary meaning
+of the word, since errors do not occur and even when an error does in
+fact occur, as in your case, who can say conclusively that it is an
+error?}\\ \hspace*{\fill} -- Franz Kafka, \emph{The Castle}
+\end{quote}
+
+
+\section{Memory management}
+
+
+\section{Replacements for C library functions}
+
+
+\section{Standard banner for Easel miniapplications}
+
+
+\section{File and path name manipulation}
+
+
+\subsection{Secure temporary files}
+
+A program may need to write and read temporary files. Many of the
+methods for creating temporary files, even using standard library
+calls, are known to create exploitable security holes
+\citep{Wheeler03,ChenDeanWagner04}.
+
+Easel provides a secure and portable POSIX procedure for obtaining an
+open temporary file handle, \ccode{esl\_tmpfile()}. This replaces the
+ANSI C \ccode{tmpfile()} function, which is said to be insecurely
+implemented on some platforms. Because closing and reopening a
+temporary file can create an exploitable race condition under certain
+circumstances, \ccode{esl\_tmpfile()} does not return the name of the
+invisible file it creates, only an open \ccode{FILE *} handle to
+it. The tmpfile is not persistent, meaning that it automatically
+vanishes when the \ccode{FILE *} handle is closed. The tmpfile is
+created in the usual system world-writable temporary directory, as
+indicated by \ccode{TMPDIR} or \ccode{TMP} environment variables, or
+\ccode{/tmp} if neither environment variable is defined.
+
+Still, it is sometimes useful, even necessary, to close and reopen a
+temporary file. For example, Easel's own test suites generate a
+variety of input files for testing input parsers. Easel also provides
+the \ccode{esl\_tmpfile\_named()} procedure for creating a persistent
+tmpfile, which returns both an open \ccode{<FILE *>} handle and the
+name of the file. Because the tmpfile name is known, the file may be
+closed and reopened. \ccode{esl\_tmpfile\_named()} creates its files
+relative to the current working directory, not in \ccode{TMPDIR}, in
+order to reduce the chances of creating the file in a shared directory
+where a race condition might be exploited. Nonetheless, secure use of
+\ccode{esl\_tmpfile\_named()} requires that you must only reopen a
+tmpfile for reading only, not for writing, and moreover, you must not
+trust the contents. (It may be possible for an attacker to replace
+the tmpfile with a symlink to another file.)
+
+An example that shows both tmpfile mechanisms:
+
+\input{cexcerpts/easel_example_tmpfiles}
+
+\section{Internals}
+
+\subsection{Input maps}
+
+An \esldef{input map} is for converting input ASCII symbols to
+internal encodings. It is a many-to-one mapping of the 128 7-bit ASCII
+symbol codes (0..127) onto new ASCII symbol codes. It is defined as
+an \ccode{unsigned char inmap[128]} or a \ccode{unsigned char *}
+allocated for 128 entries.
+
+Input maps are used in two contexts: for filtering ASCII text input
+into internal text strings, and for converting ASCII input or internal
+ASCII strings into internal digitized sequences (an \eslmod{alphabet}
+object contains an input map that it uses for digitization).
+
+The rationale for input maps is the following. The ASCII strings that
+represent biosequence data require frequent massaging. An input file
+might have sequence data mixed up with numerical coordinates and
+punctuation for human readability. We might want to distinguish
+characters that represent residues (that should be input) from
+characters for coordinates and punctuation (that should be ignored)
+from characters that aren't supposed to be present at all (that should
+trigger an error or warning). Also, in representing a sequence string
+internally, we might want to map the symbols in an input string onto a
+smaller internal alphabet. For example, we might want to be
+case-insensitive (allow both T and t to represent thymine), or we
+might want to allow an input T to mean U in a program that deals with
+RNA sequence analysis, so that input files can either contain RNA or
+DNA sequence data. Easel reuses the input map concept in routines
+involved in reading and representing input character sequences, for
+example in the \eslmod{alphabet}, \eslmod{sqio}, and \eslmod{msa}
+modules.
+
diff --git a/esl_alphabet.c b/esl_alphabet.c
new file mode 100644
index 0000000..4013f8f
--- /dev/null
+++ b/esl_alphabet.c
@@ -0,0 +1,2553 @@
+/* Implements the standard digitized alphabets for biosequences.
+ *
+ * 1. ESL_ALPHABET object for digital alphabets.
+ * 2. Digitized sequences (ESL_DSQ *).
+ * 3. Other routines in the API.
+ * 4. Unit tests.
+ * 5. Test driver.
+ * 6. Examples.
+ * 7. Copyright notice and license.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h> /* POSIX strcasecmp() */
+#endif
+
+#include "easel.h"
+#include "esl_alphabet.h"
+
+
+
+/*****************************************************************
+ * 1. The ESL_ALPHABET object
+ *****************************************************************/
+
+static ESL_ALPHABET *create_rna(void);
+static ESL_ALPHABET *create_dna(void);
+static ESL_ALPHABET *create_amino(void);
+static ESL_ALPHABET *create_coins(void);
+static ESL_ALPHABET *create_dice(void);
+
+static int set_complementarity(ESL_ALPHABET *a);
+
+/* Function: esl_alphabet_Create()
+ * Synopsis: Create alphabet of a standard type.
+ *
+ * Purpose: Creates one of the three standard bio alphabets:
+ * <eslDNA>, <eslRNA>, or <eslAMINO>, and returns
+ * a pointer to it.
+ *
+ * Args: type - <eslDNA>, <eslRNA>, or <eslAMINO>.
+ *
+ * Returns: pointer to the new alphabet.
+ *
+ * Throws: <NULL> if any allocation or initialization fails.
+ */
+ESL_ALPHABET *
+esl_alphabet_Create(int type)
+{
+ ESL_ALPHABET *a = NULL;
+
+ switch(type) {
+ case eslRNA: a = create_rna(); break;
+ case eslDNA: a = create_dna(); break;
+ case eslAMINO: a = create_amino(); break;
+ case eslCOINS: a = create_coins(); break;
+ case eslDICE: a = create_dice(); break;
+ default: esl_fatal("bad alphabet type: unrecognized"); // violation: must be a code error, not user.
+ }
+ return a;
+}
+
+/* Function: esl_alphabet_CreateCustom()
+ * Synopsis: Create a custom alphabet.
+ *
+ * Purpose: Creates a customized biosequence alphabet,
+ * and returns a ptr to it. The alphabet type is set
+ * to <eslNONSTANDARD>.
+ *
+ * <alphabet> is the internal alphabet string;
+ * <K> is the size of the base alphabet;
+ * <Kp> is the total size of the alphabet string.
+ *
+ * In the alphabet string, residues <0..K-1> are the base alphabet;
+ * residue <K> is the canonical gap (indel) symbol;
+ * residues <K+1..Kp-4> are additional degeneracy symbols (possibly 0 of them);
+ * residue <Kp-3> is an "any" symbol (such as N or X);
+ * residue <Kp-2> is a "nonresidue" symbol (such as *);
+ * and residue <Kp-1> is a "missing data" gap symbol.
+ *
+ * The two gap symbols, the nonresidue, and the "any"
+ * symbol are mandatory even for nonstandard alphabets, so
+ * <Kp> $\geq$ <K+4>.
+ *
+ * Args: alphabet - internal alphabet; example "ACGT-RYMKSWHBVDN*~"
+ * K - base size; example 4
+ * Kp - total size, including gap, degeneracies; example 18
+ *
+ * Returns: pointer to new <ESL_ALPHABET> structure.
+ *
+ * Throws: <NULL> if any allocation or initialization fails.
+ */
+ESL_ALPHABET *
+esl_alphabet_CreateCustom(const char *alphabet, int K, int Kp)
+{
+ ESL_ALPHABET *a = NULL;
+ int c,x,y;
+ int status;
+
+ /* Argument checks.
+ */
+ if (strlen(alphabet) != Kp) ESL_XEXCEPTION(eslEINVAL, "alphabet length != Kp");
+ if (Kp < K+4) ESL_XEXCEPTION(eslEINVAL, "Kp too small in alphabet");
+
+ /* Allocation/init, level 1.
+ */
+ ESL_ALLOC(a, sizeof(ESL_ALPHABET));
+ a->sym = NULL;
+ a->degen = NULL;
+ a->ndegen = NULL;
+ a->complement = NULL;
+
+ /* Allocation/init, level 2.
+ */
+ ESL_ALLOC(a->sym, sizeof(char) * (Kp+1));
+ ESL_ALLOC(a->ndegen, sizeof(int) * Kp);
+ ESL_ALLOC(a->degen, sizeof(char *) * Kp);
+ a->degen[0] = NULL;
+
+ /* Allocation/init, level 3.
+ */
+ ESL_ALLOC(a->degen[0], sizeof(char) * (Kp*K));
+ for (x = 1; x < Kp; x++)
+ a->degen[x] = a->degen[0]+(K*x);
+
+ /* Initialize the internal alphabet:
+ */
+ a->type = eslNONSTANDARD;
+ a->K = K;
+ a->Kp = Kp;
+ strcpy(a->sym, alphabet);
+
+ /* Initialize the input map, mapping ASCII seq chars to digital codes,
+ * and eslDSQ_ILLEGAL for everything else.
+ */
+ for (c = 0; c < 128; c++) a->inmap[c] = eslDSQ_ILLEGAL;
+ for (x = 0; x < a->Kp; x++) a->inmap[(int) a->sym[x]] = x;
+
+ /* Initialize the degeneracy map:
+ * Base alphabet (first K syms) are automatically
+ * mapped uniquely; (Kp-3) is assumed to be
+ * the "any" character; other degen chars (K+1..Kp-4) are
+ * unset; gap, nonresidue, missing character are unmapped (ndegen=0)
+ */
+ for (x = 0; x < a->Kp; x++) /* clear everything */
+ {
+ a->ndegen[x] = 0;
+ for (y = 0; y < a->K; y++) a->degen[x][y] = 0;
+ }
+ for (x = 0; x < a->K; x++) /* base alphabet */
+ {
+ a->ndegen[x] = 1;
+ a->degen[x][x] = 1;
+ }
+ /* "any" character */
+ a->ndegen[Kp-3] = K;
+ for (x = 0; x < a->K; x++) a->degen[Kp-3][x] = 1;
+
+ return a;
+
+ ERROR:
+ esl_alphabet_Destroy(a);
+ return NULL;
+}
+
+
+/* create_rna():
+ * Creates a standard RNA alphabet.
+ */
+static ESL_ALPHABET *
+create_rna(void)
+{
+ ESL_ALPHABET *a = NULL;
+ int status;
+
+ /* Create the fundamental alphabet
+ */
+ if ((a = esl_alphabet_CreateCustom("ACGU-RYMKSWHBVDN*~", 4, 18)) == NULL) return NULL;
+ a->type = eslRNA;
+
+ /* Add desired synonyms in the input map.
+ */
+ esl_alphabet_SetEquiv(a, 'T', 'U'); /* read T as a U */
+ esl_alphabet_SetEquiv(a, 'X', 'N'); /* read X as an N (many seq maskers use X) */
+ esl_alphabet_SetEquiv(a, 'I', 'A'); /* Inosine is a deaminated Adenosine, appears in some RNACentral sequences */
+ esl_alphabet_SetEquiv(a, '_', '-'); /* allow _ as a gap too */
+ esl_alphabet_SetEquiv(a, '.', '-'); /* allow . as a gap too */
+ esl_alphabet_SetCaseInsensitive(a); /* allow lower case input */
+
+ /* Define degenerate symbols.
+ */
+ esl_alphabet_SetDegeneracy(a, 'R', "AG");
+ esl_alphabet_SetDegeneracy(a, 'Y', "CU");
+ esl_alphabet_SetDegeneracy(a, 'M', "AC");
+ esl_alphabet_SetDegeneracy(a, 'K', "GU");
+ esl_alphabet_SetDegeneracy(a, 'S', "CG");
+ esl_alphabet_SetDegeneracy(a, 'W', "AU");
+ esl_alphabet_SetDegeneracy(a, 'H', "ACU");
+ esl_alphabet_SetDegeneracy(a, 'B', "CGU");
+ esl_alphabet_SetDegeneracy(a, 'V', "ACG");
+ esl_alphabet_SetDegeneracy(a, 'D', "AGU");
+
+ if ( (status = set_complementarity(a)) != eslOK) goto ERROR;
+
+ return a;
+
+ ERROR:
+ esl_alphabet_Destroy(a);
+ return NULL;
+}
+
+
+/* create_dna():
+ * creates and returns a standard DNA alphabet.
+ */
+static ESL_ALPHABET *
+create_dna(void)
+{
+ ESL_ALPHABET *a = NULL;
+ int status;
+
+ /* Create the fundamental alphabet.
+ */
+ if ((a = esl_alphabet_CreateCustom("ACGT-RYMKSWHBVDN*~", 4, 18)) == NULL) return NULL;
+ a->type = eslDNA;
+
+ /* Add desired synonyms in the input map.
+ */
+ esl_alphabet_SetEquiv(a, 'U', 'T'); /* read U as a T */
+ esl_alphabet_SetEquiv(a, 'X', 'N'); /* read X as an N (many seq maskers use X) */
+ esl_alphabet_SetEquiv(a, 'I', 'A'); /* Inosine is a deaminated Adenosine, appears in some RNACentral sequences */
+ esl_alphabet_SetEquiv(a, '_', '-'); /* allow _ as a gap too */
+ esl_alphabet_SetEquiv(a, '.', '-'); /* allow . as a gap too */
+ esl_alphabet_SetCaseInsensitive(a); /* allow lower case input */
+
+ /* Define IUBMB degenerate symbols other than the N.
+ */
+ esl_alphabet_SetDegeneracy(a, 'R', "AG");
+ esl_alphabet_SetDegeneracy(a, 'Y', "CT");
+ esl_alphabet_SetDegeneracy(a, 'M', "AC");
+ esl_alphabet_SetDegeneracy(a, 'K', "GT");
+ esl_alphabet_SetDegeneracy(a, 'S', "CG");
+ esl_alphabet_SetDegeneracy(a, 'W', "AT");
+ esl_alphabet_SetDegeneracy(a, 'H', "ACT");
+ esl_alphabet_SetDegeneracy(a, 'B', "CGT");
+ esl_alphabet_SetDegeneracy(a, 'V', "ACG");
+ esl_alphabet_SetDegeneracy(a, 'D', "AGT");
+
+ if ( (status = set_complementarity(a)) != eslOK) goto ERROR;
+ return a;
+
+ ERROR:
+ esl_alphabet_Destroy(a);
+ return NULL;
+}
+
+
+/* create_amino():
+ * Creates a new standard amino acid alphabet.
+ */
+static ESL_ALPHABET *
+create_amino(void)
+{
+ ESL_ALPHABET *a = NULL;
+
+ /* Create the internal alphabet
+ */
+ if ((a = esl_alphabet_CreateCustom("ACDEFGHIKLMNPQRSTVWY-BJZOUX*~", 20, 29)) == NULL) return NULL;
+ a->type = eslAMINO;
+
+ /* Add desired synonyms in the input map.
+ */
+ esl_alphabet_SetEquiv(a, '_', '-'); /* allow _ as a gap too */
+ esl_alphabet_SetEquiv(a, '.', '-'); /* allow . as a gap too */
+ esl_alphabet_SetCaseInsensitive(a); /* allow lower case input */
+
+ /* Define IUPAC degenerate symbols other than the X.
+ */
+ esl_alphabet_SetDegeneracy(a, 'B', "ND");
+ esl_alphabet_SetDegeneracy(a, 'J', "IL");
+ esl_alphabet_SetDegeneracy(a, 'Z', "QE");
+
+ /* Define unusual residues as one-to-one degeneracies.
+ */
+ esl_alphabet_SetDegeneracy(a, 'U', "C"); /* selenocysteine is scored as cysteine */
+ esl_alphabet_SetDegeneracy(a, 'O', "K"); /* pyrrolysine is scored as lysine */
+
+ return a;
+}
+
+
+/* create_coins():
+ * Creates a toy alphabet for coin examples
+ */
+static ESL_ALPHABET *
+create_coins(void)
+{
+ ESL_ALPHABET *a = NULL;
+
+ /* Create the internal alphabet
+ */
+ if ((a = esl_alphabet_CreateCustom("HT-X*~", 2, 6)) == NULL) return NULL;
+ a->type = eslCOINS;
+
+ /* Add desired synonyms in the input map.
+ */
+ esl_alphabet_SetEquiv(a, '_', '-'); /* allow _ as a gap too */
+ esl_alphabet_SetEquiv(a, '.', '-'); /* allow . as a gap too */
+ esl_alphabet_SetCaseInsensitive(a); /* allow lower case input */
+
+ /* There are no degeneracies in the coin alphabet. */
+
+ return a;
+}
+
+/* create_dice():
+ * Creates a toy alphabet for dice examples
+ */
+static ESL_ALPHABET *
+create_dice(void)
+{
+ ESL_ALPHABET *a = NULL;
+
+ /* Create the internal alphabet
+ */
+ if ((a = esl_alphabet_CreateCustom("123456-X*~", 6, 10)) == NULL) return NULL;
+ a->type = eslCOINS;
+
+ /* Add desired synonyms in the input map.
+ */
+ esl_alphabet_SetEquiv(a, '_', '-'); /* allow _ as a gap too */
+ esl_alphabet_SetEquiv(a, '.', '-'); /* allow . as a gap too */
+ esl_alphabet_SetCaseInsensitive(a); /* allow lower case input */
+
+ /* There are no degeneracies in the dice alphabet. */
+
+ return a;
+}
+
+/* set_complementarity()
+ * Builds the "complement" lookup table for DNA, RNA alphabets.
+ *
+ * Throws <eslEINVAL> if the alphabet isn't <eslDNA> or <eslRNA>.
+ */
+static int
+set_complementarity(ESL_ALPHABET *a)
+{
+ int status;
+
+ if (a->type != eslRNA && a->type != eslDNA)
+ ESL_EXCEPTION(eslEINVAL, "alphabet isn't nucleic: no complementarity to set");
+
+ /* We will assume that Kp=18 and sym="ACGT-RYMKSWHBVDN*~" (or RNA equiv).
+ * Bug #h108 happened because routine fell out of sync w/ a change in alphabet.
+ * Don't let that happen again.
+ */
+ ESL_DASSERT1(( a->Kp == 18 ));
+ ESL_DASSERT1(( a->sym[17] == '~' ));
+
+ ESL_ALLOC(a->complement, sizeof(ESL_DSQ) * a->Kp);
+ a->complement[0] = 3; /* A->T */
+ a->complement[1] = 2; /* C->G */
+ a->complement[2] = 1; /* G->C */
+ a->complement[3] = 0; /* T->A */
+ a->complement[4] = 4; /* - - */
+ a->complement[5] = 6; /* R->Y */
+ a->complement[6] = 5; /* Y->R */
+ a->complement[7] = 8; /* M->K */
+ a->complement[8] = 7; /* K->M */
+ a->complement[9] = 9; /* S S */
+ a->complement[10]= 10; /* W W */
+ a->complement[11]= 14; /* H->D */
+ a->complement[12]= 13; /* B->V */
+ a->complement[13]= 12; /* V->B */
+ a->complement[14]= 11; /* D->H */
+ a->complement[15]= 15; /* N N */
+ a->complement[16]= 16; /* * * */
+ a->complement[17]= 17; /* ~ ~ */
+
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_alphabet_SetEquiv()
+ * Synopsis: Define an equivalent symbol.
+ *
+ * Purpose: Maps an additional input alphabetic symbol <sym> to
+ * an internal alphabet symbol <c>; for example,
+ * we might map T to U for an RNA alphabet, so that we
+ * allow for reading input DNA sequences.
+ *
+ * Args: sym - symbol to allow in the input alphabet; 'T' for example
+ * c - symbol to map <sym> to in the internal alphabet; 'U' for example
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <c> is not in the internal alphabet, or if <sym> is.
+ */
+int
+esl_alphabet_SetEquiv(ESL_ALPHABET *a, char sym, char c)
+{
+ char *sp = NULL;
+ ESL_DSQ x;
+
+ /* Contract checks */
+ if ((sp = strchr(a->sym, sym)) != NULL)
+ ESL_EXCEPTION(eslEINVAL, "symbol %c is already in internal alphabet, can't equivalence it", sym);
+ if ((sp = strchr(a->sym, c)) == NULL)
+ ESL_EXCEPTION(eslEINVAL, "char %c not in the alphabet, can't map to it", c);
+
+ x = sp - a->sym;
+ a->inmap[(int) sym] = x;
+ return eslOK;
+}
+
+/* Function: esl_alphabet_SetCaseInsensitive()
+ * Synopsis: Make an alphabet's input map case-insensitive.
+ *
+ * Purpose: Given a custom alphabet <a>, with all equivalences set,
+ * make the input map case-insensitive: for every
+ * letter that is mapped in either lower or upper
+ * case, map the other case to the same internal
+ * residue.
+ *
+ * For the standard alphabets, this is done automatically.
+ *
+ * Args: a - alphabet to make case-insensitive.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslECORRUPT> if any lower/uppercase symbol pairs
+ * are already both mapped to different symbols.
+ */
+int
+esl_alphabet_SetCaseInsensitive(ESL_ALPHABET *a)
+{
+ int lc, uc;
+
+ for (lc = 'a'; lc <= 'z'; lc++)
+ {
+ uc = toupper(lc);
+
+ if (esl_abc_CIsValid(a, lc) && ! esl_abc_CIsValid(a, uc)) a->inmap[uc] = a->inmap[lc];
+ else if (esl_abc_CIsValid(a, uc) && ! esl_abc_CIsValid(a, lc)) a->inmap[lc] = a->inmap[uc];
+ else if (esl_abc_CIsValid(a, lc) && esl_abc_CIsValid(a, uc) && a->inmap[uc] != a->inmap[lc])
+ ESL_EXCEPTION(eslECORRUPT, "symbols %c and %c map differently already (%c vs. %c)",
+ lc, uc, a->inmap[lc], a->inmap[uc]);
+ }
+ return eslOK;
+}
+
+/* Function: esl_alphabet_SetDegeneracy()
+ * Synopsis: Define degenerate symbol in custom alphabet.
+ *
+ * Purpose: Given an alphabet under construction,
+ * define the degenerate character <c> to mean
+ * any of the characters in the string <ds>.
+ *
+ * <c> must exist in the digital alphabet, as
+ * one of the optional degenerate residues (<K+1>..<Kp-3>).
+ * All the characters in the <ds> string must exist
+ * in the canonical alphabet (<0>..<K-1>).
+ *
+ * You may not redefine the mandatory all-degenerate character
+ * (typically <N> or <X>; <Kp-3> in the digital alphabet).
+ * It is defined automatically in all alphabets.
+ *
+ * Args: a - an alphabet under construction.
+ * c - degenerate character code; example: 'R'
+ * ds - string of base characters for c; example: "AG"
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <c> or <ds> arguments aren't valid.
+ */
+int
+esl_alphabet_SetDegeneracy(ESL_ALPHABET *a, char c, char *ds)
+{
+ char *sp;
+ ESL_DSQ x,y;
+
+ if ((sp = strchr(a->sym, c)) == NULL)
+ ESL_EXCEPTION(eslEINVAL, "no such degenerate character");
+ x = sp - a->sym;
+
+ /* A degenerate character must have code K+1..Kp-4.
+ * Kp-3, the all-degenerate character, is automatically
+ * created, and can't be remapped.
+ */
+ if (x == a->Kp-3)
+ ESL_EXCEPTION(eslEINVAL, "can't redefine all-degenerate char %c", c);
+ if (x < a->K+1 || x >= a->Kp-2)
+ ESL_EXCEPTION(eslEINVAL, "char %c isn't in expected position in alphabet", c);
+
+ while (*ds != '\0') {
+ if ((sp = strchr(a->sym, *ds)) == NULL) ESL_EXCEPTION(eslEINVAL, "no such base character");
+ y = sp - a->sym;
+ if (! esl_abc_XIsCanonical(a, y)) ESL_EXCEPTION(eslEINVAL, "can't map degeneracy to noncanonical character");
+
+ a->degen[x][y] = 1;
+ a->ndegen[x]++;
+ ds++;
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_alphabet_SetIgnored()
+ * Synopsis: Define a set of characters to be ignored in input.
+ *
+ * Purpose: Given an alphabet <a> (either standard or custom), define
+ * all the characters in string <ignoredchars> to be
+ * unmapped: valid, but ignored when converting input text.
+ *
+ * By default, the standard alphabets do not define any
+ * ignored characters.
+ *
+ * The most common ignored characters would be space, tab,
+ * and digits, to skip silently over whitespace and
+ * sequence coordinates when parsing loosely-defined
+ * sequence file formats.
+ *
+ * Args: a - alphabet to modify
+ * ignoredchars - string listing characters to ignore; i.e. " \t"
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_alphabet_SetIgnored(ESL_ALPHABET *a, const char *ignoredchars)
+{
+ int i;
+ for (i = 0; ignoredchars[i] != '\0'; i++) a->inmap[(int)ignoredchars[i]] = eslDSQ_IGNORED;
+ return eslOK;
+}
+
+
+/* Function: esl_alphabet_Sizeof()
+ * Synopsis: Returns size of an alphabet object, in bytes.
+ *
+ * Purpose: Returns the size of alphabet <a> object, in bytes.
+ */
+size_t
+esl_alphabet_Sizeof(ESL_ALPHABET *a)
+{
+ size_t n = 0;
+ n += sizeof(ESL_ALPHABET);
+ n += sizeof(char) * a->Kp; /* a->sym */
+ n += sizeof(char *) * a->Kp; /* a->degen */
+ n += sizeof(char) * (a->Kp * a->K); /* a->degen[][] */
+ n += sizeof(int) * a->Kp; /* a->ndegen */
+ if (a->complement) n += sizeof(ESL_DSQ) * a->Kp; /* a->complement */
+ return n;
+}
+
+/* Function: esl_alphabet_Destroy()
+ * Synopsis: Frees an alphabet object.
+ *
+ * Purpose: Free's an <ESL_ALPHABET> structure.
+ *
+ * Args: a - the <ESL_ALPHABET> to free.
+ *
+ * Returns: (void).
+ */
+void
+esl_alphabet_Destroy(ESL_ALPHABET *a)
+{
+ if (a)
+ {
+ if (a->sym) free(a->sym);
+ if (a->ndegen) free(a->ndegen);
+ if (a->degen)
+ {
+ if (a->degen[0]) free(a->degen[0]);
+ free(a->degen);
+ }
+ if (a->complement) free(a->complement);
+ free(a);
+ }
+}
+/*--------------- end, ESL_ALPHABET object ----------------------*/
+
+
+
+
+
+/*****************************************************************
+ * 2. Digitized sequences (ESL_DSQ *)
+ *****************************************************************/
+/* Design note: SRE, Mon Sep 18 09:11:41 2006
+ *
+ * An ESL_DSQ is considered to a special string type, equivalent to
+ * <char *>, and is not considered to be an Easel "object". Thus it
+ * does not have a standard object API. Rather, the caller deals with
+ * an ESL_DSQ directly: allocate for <(L+2)*sizeof(ESL_DSQ)> to leave
+ * room for sentinels at <0> and <L+1>.
+ *
+ * Additionally, an ESL_DSQ is considered to be "trusted"
+ * data: we're 'guaranteed' that anything in an ESL_DSQ is a valid
+ * symbol, so we don't need to error-check. Anything else is a programming
+ * error.
+ */
+
+/* Function: esl_abc_CreateDsq()
+ * Synopsis: Digitizes a sequence into new space.
+ *
+ * Purpose: Given an alphabet <a> and an ASCII sequence <seq>,
+ * digitize the sequence into newly allocated space, and
+ * return a pointer to that space in <ret_dsq>.
+ *
+ * Args: a - internal alphabet
+ * seq - text sequence to be digitized
+ * ret_dsq - RETURN: the new digital sequence
+ *
+ * Returns: <eslOK> on success, and <ret_dsq> contains the digitized
+ * sequence; caller is responsible for free'ing this
+ * memory. Returns <eslEINVAL> if <seq> contains
+ * one or more characters that are not in the input map of
+ * alphabet <a>. If this happens, <ret_dsq> is still valid upon
+ * return: invalid characters are replaced by full ambiguities
+ * (typically X or N).
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ * Xref: STL11/63
+ */
+int
+esl_abc_CreateDsq(const ESL_ALPHABET *a, const char *seq, ESL_DSQ **ret_dsq)
+{
+ ESL_DSQ *dsq = NULL;
+ int status;
+ int64_t L;
+
+ L = strlen(seq);
+ ESL_ALLOC(dsq, sizeof(ESL_DSQ) * (L+2));
+ status = esl_abc_Digitize(a, seq, dsq);
+
+ if (ret_dsq != NULL) *ret_dsq = dsq; else free(dsq);
+ return status;
+
+ ERROR:
+ if (dsq != NULL) free(dsq);
+ if (ret_dsq != NULL) *ret_dsq = NULL;
+ return status;
+}
+
+
+/* Function: esl_abc_Digitize()
+ * Synopsis: Digitizes a sequence into existing space.
+ *
+ * Purpose: Given an alphabet <a> and a nul-terminated ASCII sequence
+ * <seq>, digitize the sequence and put it in <dsq>. Caller
+ * provides space in <dsq> allocated for at least <L+2>
+ * <ESL_DSQ> residues, where <L> is the length of <seq>.
+ *
+ * Args: a - internal alphabet
+ * seq - text sequence to be digitized (\0-terminated)
+ * dsq - RETURN: the new digital sequence (caller allocates,
+ * at least <(L+2) * sizeof(ESL_DSQ)>).
+ *
+ * Returns: <eslOK> on success.
+ * Returns <eslEINVAL> if <seq> contains one or more characters
+ * that are not recognized in the alphabet <a>. (This is classed
+ * as a normal error, because the <seq> may be untrusted user input.)
+ * If this happens, the digital sequence <dsq> is still valid upon
+ * return; invalid ASCII characters are replaced by ambiguities
+ * (X or N).
+ */
+int
+esl_abc_Digitize(const ESL_ALPHABET *a, const char *seq, ESL_DSQ *dsq)
+{
+ int status;
+ int64_t i; /* position in seq */
+ int64_t j; /* position in dsq */
+ ESL_DSQ x;
+
+ status = eslOK;
+ dsq[0] = eslDSQ_SENTINEL;
+ for (i = 0, j = 1; seq[i] != '\0'; i++)
+ {
+ x = a->inmap[(int) seq[i]];
+ if (esl_abc_XIsValid(a, x)) dsq[j] = x;
+ else if (x == eslDSQ_IGNORED) continue;
+ else {
+ status = eslEINVAL;
+ dsq[j] = esl_abc_XGetUnknown(a);
+ }
+ j++;
+ }
+ dsq[j] = eslDSQ_SENTINEL;
+ return status;
+}
+
+/* Function: esl_abc_Textize()
+ * Synopsis: Convert digital sequence to text.
+ *
+ * Purpose: Make an ASCII sequence <seq> by converting a digital
+ * sequence <dsq> of length <L> back to text, according to
+ * the digital alphabet <a>.
+ *
+ * Caller provides space in <seq> allocated for at least
+ * <L+1> bytes (<(L+1) * sizeof(char)>).
+ *
+ * Args: a - internal alphabet
+ * dsq - digital sequence to be converted (1..L)
+ * L - length of dsq
+ * seq - RETURN: the new text sequence (caller allocated
+ * space, at least <(L+1) * sizeof(char)>).
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_abc_Textize(const ESL_ALPHABET *a, const ESL_DSQ *dsq, int64_t L, char *seq)
+{
+ int64_t i;
+
+ for (i = 0; i < L; i++)
+ seq[i] = a->sym[dsq[i+1]];
+ seq[i] = '\0';
+ return eslOK;
+}
+
+
+/* Function: esl_abc_TextizeN()
+ * Synopsis: Convert subsequence from digital to text.
+ *
+ * Purpose: Similar in semantics to <strncpy()>, this procedure takes
+ * a window of <L> residues in a digitized sequence
+ * starting at the residue pointed to by <dptr>,
+ * converts them to ASCII text representation, and
+ * copies them into the buffer <buf>.
+ *
+ * <buf> must be at least <L> residues long; <L+1>, if the
+ * caller needs to NUL-terminate it.
+ *
+ * If a sentinel byte is encountered in the digitized
+ * sequence before <L> residues have been copied, <buf> is
+ * NUL-terminated there. Otherwise, like <strncpy()>, <buf>
+ * will not be NUL-terminated.
+ *
+ * Note that because digital sequences are indexed <1..N>,
+ * not <0..N-1>, the caller must be careful about
+ * off-by-one errors in <dptr>. For example, to copy from
+ * the first residue of a digital sequence <dsq>, you must
+ * pass <dptr=dsq+1>, not <dptr=dsq>. The text in <buf>
+ * on the other hand is a normal C string indexed <0..L-1>.
+ *
+ * Args: a - reference to an internal alphabet
+ * dptr - ptr to starting residue in a digital sequence
+ * L - number of residues to convert and copy
+ * buf - text buffer to store the <L> converted residues in
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_abc_TextizeN(const ESL_ALPHABET *a, const ESL_DSQ *dptr, int64_t L, char *buf)
+{
+ int64_t i;
+
+ for (i = 0; i < L; i++)
+ {
+ if (dptr[i] == eslDSQ_SENTINEL)
+ {
+ buf[i] = '\0';
+ return eslOK;
+ }
+ buf[i] = a->sym[dptr[i]];
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_abc_dsqcpy()
+ *
+ * Purpose: Given a digital sequence <dsq> of length <L>,
+ * make a copy of it in <dcopy>. Caller provides
+ * storage in <dcopy> for at least <L+2> <ESL_DSQ>
+ * residues.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_abc_dsqcpy(const ESL_DSQ *dsq, int64_t L, ESL_DSQ *dcopy)
+{
+ memcpy(dcopy, dsq, sizeof(ESL_DSQ) * (L+2));
+ return eslOK;
+}
+
+
+/* Function: esl_abc_dsqdup()
+ * Synopsis: Duplicate a digital sequence.
+ *
+ * Purpose: Like <esl_strdup()>, but for digitized sequences:
+ * make a duplicate of <dsq> and leave it in <ret_dup>.
+ * Caller can pass the string length <L> if it's known, saving
+ * some overhead; else pass <-1> and the length will be
+ * determined for you.
+ *
+ * Tolerates <dsq> being <NULL>; in which case, returns
+ * <eslOK> with <*ret_dup> set to <NULL>.
+ *
+ * Args: dsq - digital sequence to duplicate (w/ sentinels at 0,L+1)
+ * L - length of dsq in residues, if known; -1 if unknown
+ * ret_dup - RETURN: allocated duplicate of <dsq>, which caller will
+ * free.
+ *
+ * Returns: <eslOK> on success, and leaves a pointer in <ret_dup>.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ * Xref: STL11/48
+ */
+int
+esl_abc_dsqdup(const ESL_DSQ *dsq, int64_t L, ESL_DSQ **ret_dup)
+{
+ int status;
+ ESL_DSQ *new = NULL;
+
+ if (ret_dup == NULL) return eslOK; /* no-op. */
+
+ *ret_dup = NULL;
+ if (dsq == NULL) return eslOK;
+ if (L < 0) L = esl_abc_dsqlen(dsq);
+
+ ESL_ALLOC(new, sizeof(ESL_DSQ) * (L+2));
+ memcpy(new, dsq, sizeof(ESL_DSQ) * (L+2));
+
+ *ret_dup = new;
+ return eslOK;
+
+ ERROR:
+ if (new != NULL) free(new);
+ if (ret_dup != NULL) *ret_dup = NULL;
+ return status;
+}
+
+
+/* Function: esl_abc_dsqcat()
+ * Synopsis: Concatenate and map input chars to a digital sequence.
+ *
+ * Purpose: Append the contents of string or memory line <s> of
+ * length <n> to a digital sequence, after digitizing
+ * each input character in <s> according to an Easel
+ * <inmap>. The destination sequence and its length
+ * are passed by reference, <*dsq> and <*L>, so that
+ * the sequence may be reallocated and the length updated
+ * upon return.
+ *
+ * The input map <inmap> may map characters to
+ * <eslDSQ_IGNORED> or <eslDSQ_ILLEGAL>, but not to <eslDSQ_EOL>,
+ * <eslDSQ_EOD>, or <eslDSQ_SENTINEL> codes. <inmap[0]> is
+ * special, and must be set to the code for the 'unknown'
+ * residue (such as 'X' for proteins, 'N' for DNA) that
+ * will be used to replace any invalid <eslDSQ_ILLEGAL>
+ * characters.
+ *
+ * If <*dsq> is properly terminated digital sequence and
+ * the caller doesn't know its length, <*L> may be passed
+ * as -1. Providing the length when it's known saves an
+ * <esl_abc_dsqlen()> call. If <*dsq> is unterminated, <*L>
+ * is mandatory. Essentially the same goes for <*s>, which
+ * may be a NUL-terminated string (pass <n=-1> if length unknown),
+ * or a memory line (<n> is mandatory).
+ *
+ * <*dsq> may also be <NULL>, in which case it is allocated
+ * and initialized here.
+ *
+ * Caller should provide an <s> that is expected to be
+ * essentially all appendable to <*dsq> except for a small
+ * number of chars that map to <eslDSQ_IGNORE>, like an
+ * input sequence data line from a file, for example. We're
+ * going to reallocate <*dsq> to size <*L+n>; if <n> is an
+ * entire large buffer or file, this reallocation will be
+ * inefficient.
+ *
+ * Args: inmap - an Easel input map, inmap[0..127];
+ * inmap[0] is special, set to the 'unknown' character
+ * to replace invalid input chars.
+ * dsq - reference to the current digital seq to append to
+ * (with sentinel bytes at 0,L+1); may be <NULL>.
+ * Upon return, this will probably have
+ * been reallocated, and it will contain the original
+ * <dsq> with <s> digitized and appended.
+ * L - reference to the current length of <dsq> in residues;
+ * may be <-1> if unknown and if <*dsq> is a properly
+ * terminated digital sequence. Upon return, <L> is set to
+ * the new length of <dsq>, after <s> is appended.
+ * s - ASCII text sequence to append. May
+ * contain ignored text characters (flagged with
+ * <eslDSQ_IGNORED> in the input map of alphabet <abc>).
+ * n - Length of <s> in characters, if known; or <-1> if
+ * unknown and if <s> is a NUL-terminated string.
+ *
+ * Returns: <eslOK> on success; <*dsq> contains the result of digitizing
+ * and appending <s> to the original <*dsq>; and <*L> contains
+ * the new length of the <dsq> result in residues.
+ *
+ * If any of the characters in <s> are illegal in the
+ * alphabet <abc>, these characters are digitized as
+ * unknown residues (using <inmap[0]>) and
+ * concatenation/digitization proceeds to completion, but
+ * the function returns <eslEINVAL>. The caller might then
+ * want to call <esl_abc_ValidateSeq()> on <s> if it wants
+ * to figure out where digitization goes awry and get a
+ * more informative error report. This is a normal error,
+ * because the string <s> might be user input.
+ *
+ * Throws: <eslEMEM> on allocation or reallocation failure;
+ * <eslEINCONCEIVABLE> on coding error.
+ *
+ * Xref: SRE:STL11/48; SRE:J7/145.
+ *
+ * Note: This closely parallels a text mode version, <esl_strmapcat()>.
+ */
+int
+esl_abc_dsqcat(const ESL_DSQ *inmap, ESL_DSQ **dsq, int64_t *L, const char *s, esl_pos_t n)
+{
+ int status = eslOK;
+
+ if (*L < 0) *L = ((*dsq) ? esl_abc_dsqlen(*dsq) : 0);
+ if ( n < 0) n = ( (s) ? strlen(s) : 0);
+
+ if (n == 0) { goto ERROR; } /* that'll return eslOK, leaving *dest untouched, and *ldest its length */
+
+ if (*dsq == NULL) { /* an entirely new dsq is allocated *and* initialized with left sentinel. */
+ ESL_ALLOC(*dsq, sizeof(ESL_DSQ) * (n+2));
+ (*dsq)[0] = eslDSQ_SENTINEL;
+ } else /* else, existing dsq is just reallocated; leftmost sentinel already in place. */
+ ESL_REALLOC(*dsq, sizeof(ESL_DSQ) * (*L+n+2)); /* most we'll need */
+
+ return esl_abc_dsqcat_noalloc(inmap, *dsq, L, s, n);
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_abc_dsqcat_noalloc()
+ * Synopsis: Version of esl_abc_dsqcat() that does no reallocation.
+ *
+ * Purpose: Same as <esl_abc_dsqcat()>, but with no reallocation of
+ * <dsq>. The pointer to the destination string <dsq> is
+ * passed by value not by reference, because it will not
+ * be reallocated or moved. Caller has already allocated
+ * at least <*L + n + 2> bytes in <dsq>. <*L> and <n> are
+ * not optional; caller must know (and provide) the lengths
+ * of both the old string and the new source.
+ *
+ * Note: This version was needed in selex format parsing, where
+ * we need to prepend and append some number of gaps on
+ * each new line of each block of input; allocating once
+ * then adding the gaps and the sequence seemed most efficient.
+ */
+int
+esl_abc_dsqcat_noalloc(const ESL_DSQ *inmap, ESL_DSQ *dsq, int64_t *L, const char *s, esl_pos_t n)
+{
+ int64_t xpos;
+ esl_pos_t cpos;
+ ESL_DSQ x;
+ int status = eslOK;
+
+ /* Watch these coords. Start in the 0..n-1 text string at 0;
+ * start in the 1..L dsq at L+1, overwriting its terminal
+ * sentinel byte.
+ */
+ for (xpos = *L+1, cpos = 0; cpos < n; cpos++)
+ {
+ if (! isascii(s[cpos])) { dsq[xpos++] = inmap[0]; status = eslEINVAL; continue; }
+
+ x = inmap[(int) s[cpos]];
+
+ if (x <= 127) dsq[xpos++] = x;
+ else switch (x) {
+ case eslDSQ_SENTINEL: ESL_EXCEPTION(eslEINCONCEIVABLE, "input char mapped to eslDSQ_SENTINEL"); break;
+ case eslDSQ_ILLEGAL: dsq[xpos++] = inmap[0]; status = eslEINVAL; break;
+ case eslDSQ_IGNORED: break;
+ case eslDSQ_EOL: ESL_EXCEPTION(eslEINCONCEIVABLE, "input char mapped to eslDSQ_EOL"); break;
+ case eslDSQ_EOD: ESL_EXCEPTION(eslEINCONCEIVABLE, "input char mapped to eslDSQ_EOD"); break;
+ default: ESL_EXCEPTION(eslEINCONCEIVABLE, "bad inmap, no such ESL_DSQ code"); break;
+ }
+ }
+ dsq[xpos] = eslDSQ_SENTINEL;
+ *L = xpos-1;
+ return status;
+}
+
+/* Function: esl_abc_dsqlen()
+ * Synopsis: Returns the length of a digital sequence.
+ *
+ * Purpose: Returns the length of digitized sequence <dsq> in
+ * positions (including gaps, if any). The <dsq> must be
+ * properly terminated by a sentinel byte
+ * (<eslDSQ_SENTINEL>).
+ */
+int64_t
+esl_abc_dsqlen(const ESL_DSQ *dsq)
+{
+ int64_t n = 0;
+ while (dsq[n+1] != eslDSQ_SENTINEL) n++;
+ return n;
+}
+
+/* Function: esl_abc_dsqrlen()
+ * Synopsis: Returns the number of residues in a digital seq.
+ *
+ * Purpose: Returns the unaligned length of digitized sequence
+ * <dsq>, in residues, not counting any gaps or
+ * missing data symbols.
+ */
+int64_t
+esl_abc_dsqrlen(const ESL_ALPHABET *abc, const ESL_DSQ *dsq)
+{
+ int64_t n = 0;
+ int64_t i;
+
+ for (i = 1; dsq[i] != eslDSQ_SENTINEL; i++)
+ if (esl_abc_XIsResidue(abc, dsq[i])) n++;
+ return n;
+}
+
+/* Function: esl_abc_CDealign()
+ * Synopsis: Dealigns a text string, using a reference digital aseq.
+ *
+ * Purpose: Dealigns <s> in place by removing characters aligned to
+ * gaps (or missing data symbols) in the reference digital
+ * aligned sequence <ref_ax>. Gaps and missing data symbols
+ * in <ref_ax> are defined by its digital alphabet <abc>.
+ *
+ * <s> is typically going to be some kind of textual
+ * annotation string (secondary structure, consensus, or
+ * surface accessibility).
+ *
+ * Be supercareful of off-by-one errors here! The <ref_ax>
+ * is a digital sequence that is indexed <1..L>. The
+ * annotation string <s> is assumed to be <0..L-1> (a
+ * normal C string), off by one with respect to <ref_ax>.
+ * In a sequence object, ss annotation is actually stored
+ * <1..L> -- so if you're going to <esl_abc_CDealign()> a
+ * <sq->ss>, pass <sq->ss+1> as the argument <s>.
+ *
+ * Returns: Returns <eslOK> on success; optionally returns the number
+ * of characters in the dealigned <s> in <*opt_rlen>.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_abc_CDealign(const ESL_ALPHABET *abc, char *s, const ESL_DSQ *ref_ax, int64_t *opt_rlen)
+{
+ int64_t apos;
+ int64_t n = 0;
+
+ if (s == NULL) return eslOK;
+
+ for (n=0, apos=1; ref_ax[apos] != eslDSQ_SENTINEL; apos++)
+ if (! esl_abc_XIsGap(abc, ref_ax[apos]) && ! esl_abc_XIsMissing(abc, ref_ax[apos]) )
+ s[n++] = s[apos-1]; /* apos-1 because we assume s was 0..alen-1, whereas ref_ax was 1..alen */
+ s[n] = '\0';
+
+ if (opt_rlen != NULL) *opt_rlen = n;
+ return eslOK;
+}
+
+/* Function: esl_abc_XDealign()
+ * Synopsis: Dealigns a digital string, using a reference digital aseq.
+ *
+ * Purpose: Dealigns <x> in place by removing characters aligned to
+ * gaps (or missing data) in the reference digital aligned
+ * sequence <ref_ax>. Gaps and missing data symbols in
+ * <ref_ax> are defined by its digital alphabet <abc>.
+ *
+ * Returns: Returns <eslOK> on success; optionally returns the number
+ * of characters in the dealigned <x> in <*opt_rlen>.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_abc_XDealign(const ESL_ALPHABET *abc, ESL_DSQ *x, const ESL_DSQ *ref_ax, int64_t *opt_rlen)
+{
+ int64_t apos;
+ int64_t n = 0;
+
+ if (x == NULL) return eslOK;
+
+ x[0] = eslDSQ_SENTINEL;
+ for (n=1, apos=1; ref_ax[apos] != eslDSQ_SENTINEL; apos++)
+ if (! esl_abc_XIsGap(abc, ref_ax[apos]) && ! esl_abc_XIsMissing(abc, ref_ax[apos]) )
+ x[n++] = x[apos];
+ x[n] = eslDSQ_SENTINEL;
+
+ if (opt_rlen != NULL) *opt_rlen = n-1;
+ return eslOK;
+}
+
+/* Function: esl_abc_ConvertDegen2X()
+ * Synopsis: Convert all degenerate residues to X or N.
+ *
+ * Purpose: Convert all the degenerate residue codes in digital
+ * sequence <dsq> to the code for the maximally degenerate
+ * "unknown residue" code, as specified in digital alphabet
+ * <abc>. (For example, X for protein, N for nucleic acid.)
+ *
+ * This comes in handy when you're dealing with some piece
+ * of software that can't deal with standard residue codes,
+ * and you want to massage your sequences into a form that
+ * can be accepted. For example, WU-BLAST can't deal with O
+ * (pyrrolysine) residues, but UniProt has O codes.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_abc_ConvertDegen2X(const ESL_ALPHABET *abc, ESL_DSQ *dsq)
+{
+ int64_t i;
+
+ for (i = 1; dsq[i] != eslDSQ_SENTINEL; i++)
+ if (esl_abc_XIsDegenerate(abc, dsq[i]))
+ dsq[i] = esl_abc_XGetUnknown(abc);
+ return eslOK;
+}
+
+
+/* Function: esl_abc_revcomp()
+ * Synopsis: Reverse complement a digital sequence
+ * Incept: SRE, Wed Feb 10 11:54:48 2016 [JB251 BOS-MCO]
+ *
+ * Purpose: Reverse complement <dsq>, in place, according to
+ * its digital alphabet <abc>.
+ *
+ * Args: abc - digital alphabet
+ * dsq - digital sequence, 1..n
+ * n - length of <dsq>
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINCOMPAT> if alphabet <abc> can't be reverse complemented
+ */
+int
+esl_abc_revcomp(const ESL_ALPHABET *abc, ESL_DSQ *dsq, int n)
+{
+ ESL_DSQ x;
+ int pos;
+
+ if (abc->complement == NULL)
+ ESL_EXCEPTION(eslEINCOMPAT, "tried to reverse complement using an alphabet that doesn't have one");
+
+ for (pos = 1; pos <= n/2; pos++)
+ {
+ x = abc->complement[dsq[n-pos+1]];
+ dsq[n-pos+1] = abc->complement[dsq[pos]];
+ dsq[pos] = x;
+ }
+ if (n%2) dsq[pos] = abc->complement[dsq[pos]];
+ return eslOK;
+}
+
+
+
+/*-------------- end, digital sequences (ESL_DSQ) ---------------*/
+
+
+/*****************************************************************
+ * 3. Other routines in the API.
+ *****************************************************************/
+
+/* Function: esl_abc_ValidateType()
+ * Synopsis: Check that an alphabet is known and valid
+ * Incept: SRE, Thu Feb 11 15:48:23 2016
+ *
+ * Purpose: Returns <eslOK> if <type> is a valid and known Easel
+ * alphabet type code.
+ *
+ * Used to validate "user" input, where we're parsing a
+ * file format that has stored an Easel alphabet code.
+ *
+ * Returns <eslFAIL> for the special <eslUNKNOWN> "unset"
+ * value, even though that is a valid code, because it's
+ * not an alphabet, so shouldn't show up in a file.
+ */
+int
+esl_abc_ValidateType(int type)
+{
+ if (type <= 0 || type > eslNONSTANDARD) return eslFAIL;
+ else return eslOK;
+}
+
+
+/* Function: esl_abc_GuessAlphabet()
+ * Synopsis: Guess alphabet type from residue composition.
+ *
+ * Purpose: Guess the alphabet type from a residue composition.
+ * The input <ct[0..25]> array contains observed counts of
+ * the letters A..Z, case-insensitive.
+ *
+ * The composition <ct> must contain more than 10 residues.
+ *
+ * If it contains $\geq$98\% ACGTN and all four of the
+ * residues ACGT occur, call it <eslDNA>. (Analogously for
+ * ACGUN, ACGU: call <eslRNA>.)
+ *
+ * If it contains any amino-specific residue (EFIJLPQZ),
+ * call it <eslAMINO>.
+ *
+ * If it consists of $\geq$98\% canonical aa residues or X,
+ * and at least 15 of the different 20 aa residues occur,
+ * and the number of residues that are canonical aa/degenerate
+ * nucleic (DHKMRSVWY) is greater than the number of canonicals
+ * for both amino and nucleic (ACG); then call it <eslAMINO>.
+ *
+ * As a special case, if it consists entirely of N's, and
+ * we have >2000 residues, call it <eslDNA>. This is a
+ * special case that deals with genome sequence assemblies
+ * that lead with a swath of N's.
+ *
+ * We aim to be very conservative, essentially never making
+ * a false call; we err towards calling <eslUNKNOWN> if
+ * unsure. Our test is to classify every individual
+ * sequence in NCBI NR and NT (or equiv large messy
+ * sequence database) with no false positives, only correct
+ * calls or <eslUNKNOWN>.
+ *
+ * Returns: <eslOK> on success, and <*ret_type> is set to
+ * <eslAMINO>, <eslRNA>, or <eslDNA>.
+ *
+ * Returns <eslENOALPHABET> if unable to determine the
+ * alphabet type; in this case, <*ret_type> is set to
+ * <eslUNKNOWN>.
+ *
+ * Notes: As of Jan 2011:
+ * nr 10M seqs : 6999 unknown, 0 misclassified
+ * Pfam full 13M seqs : 7930 unknown, 0 misclassified
+ * Pfam seed 500K seqs: 366 unknown, 0 misclassified
+ * trembl 14M seqs : 7748 unknown, 0 misclassified
+ *
+ * nt 10M seqs : 35620 unknown, 0 misclassified
+ * Rfam full 3M seqs : 8146 unknown, 0 misclassified
+ * Rfam seed 27K seqs : 49 unknown, 0 misclassified
+ *
+ * xref: esl_alphabet_example3 collects per-sequence classification
+ * 2012/0201-easel-guess-alphabet
+ * J1/62; 2007-0517-easel-guess-alphabet
+ */
+int
+esl_abc_GuessAlphabet(const int64_t *ct, int *ret_type)
+{
+ int type = eslUNKNOWN;
+ char aaonly[] = "EFIJLOPQZ";
+ char allcanon[] = "ACG";
+ char aacanon[] = "DHKMRSVWY";
+ int64_t n1, n2, n3, nn, nt, nu, nx, n; /* n's are counts */
+ int x1, x2, x3, xn, xt, xu; /* x's are how many different residues are represented */
+ int i, x;
+
+ x1 = x2 = x3 = xn = xt = xu = 0;
+ n1 = n2 = n3 = n = 0;
+ for (i = 0; i < 26; i++) n += ct[i];
+ for (i = 0; aaonly[i] != '\0'; i++) { x = ct[aaonly[i] - 'A']; if (x > 0) { n1 += x; x1++; } }
+ for (i = 0; allcanon[i] != '\0'; i++) { x = ct[allcanon[i] - 'A']; if (x > 0) { n2 += x; x2++; } }
+ for (i = 0; aacanon[i] != '\0'; i++) { x = ct[aacanon[i] - 'A']; if (x > 0) { n3 += x; x3++; } }
+ nt = ct['T' - 'A']; xt = (nt ? 1 : 0);
+ nu = ct['U' - 'A']; xu = (nu ? 1 : 0);
+ nx = ct['X' - 'A'];
+ nn = ct['N' - 'A']; xn = (nn ? 1 : 0);
+
+ if (n <= 10) type = eslUNKNOWN; // small sample, don't guess
+ else if (n > 2000 && nn == n) type = eslDNA; // special case of many N's leading a genome assembly
+ else if (n1 > 0) type = eslAMINO; // contains giveaway, aa-only chars
+ else if (n-(n2+nt+nn) <= 0.02*n && x2+xt == 4) type = eslDNA; // nearly all DNA canon (or N), all four seen
+ else if (n-(n2+nu+nn) <= 0.02*n && x2+xu == 4) type = eslRNA; // nearly all RNA canon (or N), all four seen
+ else if (n-(n1+n2+n3+nn+nt+nx) <= 0.02*n && n3>n2 && x1+x2+x3+xn+xt >= 15) type = eslAMINO; // nearly all aa canon (or X); more aa canon than ambig; all 20 seen
+
+ *ret_type = type;
+ if (type == eslUNKNOWN) return eslENOALPHABET;
+ else return eslOK;
+}
+
+
+
+/* Function: esl_abc_Match()
+ * Synopsis: Returns the probability that two symbols match.
+ *
+ * Purpose: Given two digital symbols <x> and <y> in alphabet
+ * <abc>, calculate and return the probability that
+ * <x> and <y> match, taking degenerate residue codes
+ * into account.
+ *
+ * If <p> residue probability vector is NULL, the
+ * calculation is a simple average. For example, for DNA,
+ * R/A gives 0.5, C/N gives 0.25, N/R gives 0.25, R/R gives
+ * 0.5.
+ *
+ * If <p> residue probability vector is non-NULL, it gives
+ * a 0..K-1 array of background frequencies, and the
+ * returned match probability is an expectation (weighted
+ * average) given those residue frequencies.
+ *
+ * <x> and <y> should only be residue codes. Any other
+ * comparison, including comparisons involving gap or
+ * missing data characters, or even comparisons involving
+ * illegal digital codes, returns 0.0.
+ *
+ * Note that comparison of residues from "identical"
+ * sequences (even a self-comparison) will not result in an
+ * identity of 1.0, if the sequence(s) contain degenerate
+ * residue codes.
+ *
+ * Args: abc - digtal alphabet to use
+ * x,y - two symbols to compare
+ * p - NULL, or background probabilities of the
+ * canonical residues in this alphabet [0..K-1]
+ *
+ * Returns: the probability of an identity (match) between
+ * residues <x> and <y>.
+ */
+double
+esl_abc_Match(const ESL_ALPHABET *abc, ESL_DSQ x, ESL_DSQ y, double *p)
+{
+ int i;
+ double prob;
+ double sx, sy;
+
+ /* Easy cases */
+ if (esl_abc_XIsCanonical(abc, x) && esl_abc_XIsCanonical(abc, y))
+ {
+ if (x==y) return 1.0; else return 0.0;
+ }
+ if ( ! esl_abc_XIsResidue(abc, x) || ! esl_abc_XIsResidue(abc, x)) return 0.0;
+
+ /* Else, we have at least one degenerate residue, so calc an average or expectation.
+ */
+ if (p != NULL)
+ {
+ prob = sx = sy = 0.;
+ for (i = 0; i < abc->K; i++)
+ {
+ if (abc->degen[(int)x][i]) sx += p[i];
+ if (abc->degen[(int)y][i]) sy += p[i];
+ if (abc->degen[(int)x][i] && abc->degen[(int)y][i]) prob += p[i] * p[i];
+ }
+ prob = prob / (sx*sy);
+ }
+ else
+ {
+ double uniformp = 1. / (double) abc->K;
+ prob = sx = sy = 0.;
+ for (i = 0; i < abc->K; i++)
+ {
+ if (abc->degen[(int)x][i]) sx += uniformp;
+ if (abc->degen[(int)y][i]) sy += uniformp;
+ if (abc->degen[(int)x][i] && abc->degen[(int)y][i]) prob += uniformp * uniformp;
+ }
+ prob = prob / (sx*sy);
+ }
+ return prob;
+}
+
+
+
+/* Function: esl_abc_IAvgScore()
+ * Synopsis: Returns average score for degenerate residue.
+ *
+ * Purpose: Given a residue code <x> in alphabet <a>, and an array of
+ * integer scores <sc> for the residues in the base
+ * alphabet, calculate and return the average score
+ * (rounded to nearest integer).
+ *
+ * <x> would usually be a degeneracy code, but it
+ * may also be a canonical residue. It must not
+ * be a gap, missing data, or illegal symbol; if it
+ * is, these functions return a score of 0 without
+ * raising an error.
+ *
+ * <esl_abc_FAvgScore()> and <esl_abc_DAvgScore()> do the
+ * same, but for float and double scores instead of integers
+ * (and for real-valued scores, no rounding is done).
+ *
+ * Args: a - digital alphabet to use
+ * x - a symbol to score
+ * sc - score vector for canonical residues [0..K-1]
+ *
+ * Returns: average score for symbol <x>
+ */
+int
+esl_abc_IAvgScore(const ESL_ALPHABET *a, ESL_DSQ x, const int *sc)
+{
+ float result = 0.;
+ int i;
+
+ if (! esl_abc_XIsResidue(a, x)) return 0;
+ for (i = 0; i < a->K; i++)
+ if (a->degen[(int) x][i]) result += (float) sc[i];
+ result /= (float) a->ndegen[(int) x];
+ if (result < 0) return (int) (result - 0.5);
+ else return (int) (result + 0.5);
+}
+float
+esl_abc_FAvgScore(const ESL_ALPHABET *a, ESL_DSQ x, const float *sc)
+{
+ float result = 0.;
+ int i;
+
+ if (! esl_abc_XIsResidue(a, x)) return 0.;
+ for (i = 0; i < a->K; i++)
+ if (a->degen[(int) x][i]) result += sc[i];
+ result /= (float) a->ndegen[(int) x];
+ return result;
+}
+double
+esl_abc_DAvgScore(const ESL_ALPHABET *a, ESL_DSQ x, const double *sc)
+{
+ double result = 0.;
+ int i;
+
+ if (! esl_abc_XIsResidue(a, x)) return 0.;
+ for (i = 0; i < a->K; i++)
+ if (a->degen[(int) x][i]) result += sc[i];
+ result /= (double) a->ndegen[(int) x];
+ return result;
+}
+
+
+/* Function: esl_abc_IExpectScore()
+ * Synopsis: Returns expected score for degenerate residue.
+ *
+ * Purpose: Given a residue code <x> in alphabet <a>, an
+ * array of integer scores <sc> for the residues in the base
+ * alphabet, and background frequencies <p> for the
+ * occurrence frequencies of the residues in the base
+ * alphabet, calculate and return the expected score
+ * (weighted by the occurrence frequencies <p>).
+ *
+ * <x> would usually be a degeneracy code, but it
+ * may also be a canonical residue. It must not
+ * be a gap, missing data, or illegal symbol; if it
+ * is, these functions return a score of 0 without
+ * raising an error.
+ *
+ * <esl_abc_FExpectScore()> and <esl_abc_DExpectScore()> do the
+ * same, but for float and double scores instead of integers
+ * (for real-valued scores, no rounding is done).
+ *
+ * Args: a - digital alphabet to use
+ * x - a symbol to score
+ * sc - score vector for canonical residues [0..K-1]
+ * p - background prob's of canonicals [0..K-1]
+ *
+ * Returns: average score for symbol <x>
+ */
+int
+esl_abc_IExpectScore(const ESL_ALPHABET *a, ESL_DSQ x, const int *sc, const float *p)
+{
+ float result = 0.;
+ float denom = 0.;
+ int i;
+
+ if (! esl_abc_XIsResidue(a, x)) return 0;
+ for (i = 0; i < a->K; i++)
+ if (a->degen[(int) x][i]) {
+ result += (float) sc[i] * p[i];
+ denom += p[i];
+ }
+ result /= denom;
+ if (result < 0) return (int) (result - 0.5);
+ else return (int) (result + 0.5);
+}
+float
+esl_abc_FExpectScore(const ESL_ALPHABET *a, ESL_DSQ x, const float *sc, const float *p)
+{
+ float result = 0.;
+ float denom = 0.;
+ int i;
+
+ if (! esl_abc_XIsResidue(a, x)) return 0.;
+ for (i = 0; i < a->K; i++)
+ if (a->degen[(int) x][i]) {
+ result += sc[i] * p[i];
+ denom += p[i];
+ }
+ result /= denom;
+ return result;
+}
+double
+esl_abc_DExpectScore(const ESL_ALPHABET *a, ESL_DSQ x, const double *sc, const double *p)
+{
+ double result = 0.;
+ double denom = 0.;
+ int i;
+
+ if (! esl_abc_XIsResidue(a, x)) return 0.;
+ for (i = 0; i < a->K; i++)
+ if (a->degen[(int) x][i]) {
+ result += sc[i] * p[i];
+ denom += p[i];
+ }
+ result /= denom;
+ return result;
+}
+
+/* Function: esl_abc_IAvgScVec()
+ * Synopsis: Fill out score vector with average degenerate scores.
+ *
+ * Purpose: Given an alphabet <a> and a score vector <sc> of length
+ * <a->Kp> that contains integer scores for the base
+ * alphabet (<0..a->K-1>), fill out the rest of the score
+ * vector, calculating average scores for
+ * degenerate residues using <esl_abc_IAvgScore()>.
+ *
+ * The score, if any, for a gap character <K>, the
+ * nonresidue <Kp-2>, and the missing data character <Kp-1>
+ * are untouched by this function. Only the degenerate
+ * scores <K+1..Kp-3> are filled in.
+ *
+ * <esl_abc_FAvgScVec()> and <esl_abc_DAvgScVec()> do
+ * the same, but for score vectors of floats or doubles,
+ * respectively.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_abc_IAvgScVec(const ESL_ALPHABET *a, int *sc)
+{
+ ESL_DSQ x;
+ for (x = a->K+1; x <= a->Kp-3; x++)
+ sc[x] = esl_abc_IAvgScore(a, x, sc);
+ return eslOK;
+}
+int
+esl_abc_FAvgScVec(const ESL_ALPHABET *a, float *sc)
+{
+ ESL_DSQ x;
+ for (x = a->K+1; x <= a->Kp-3; x++)
+ sc[x] = esl_abc_FAvgScore(a, x, sc);
+ return eslOK;
+}
+int
+esl_abc_DAvgScVec(const ESL_ALPHABET *a, double *sc)
+{
+ ESL_DSQ x;
+ for (x = a->K+1; x <= a->Kp-3; x++)
+ sc[x] = esl_abc_DAvgScore(a, x, sc);
+ return eslOK;
+}
+
+/* Function: esl_abc_IExpectScVec()
+ * Synopsis: Fill out score vector with average expected scores.
+ *
+ * Purpose: Given an alphabet <a>, a score vector <sc> of length
+ * <a->Kp> that contains integer scores for the base
+ * alphabet (<0..a->K-1>), and residue occurrence probabilities
+ * <p[0..a->K-1]>; fill in the scores for the
+ * degenerate residues <K+1..Kp-3> using <esl_abc_IExpectScore()>.
+ *
+ * The score, if any, for a gap character <K>, the
+ * nonresidue <Kp-2>, and the missing data character <Kp-1>
+ * are untouched by this function. Only the degenerate
+ * scores <K+1..Kp-3> are filled in.
+ *
+ * <esl_abc_FExpectScVec()> and <esl_abc_DExpectScVec()> do
+ * the same, but for score vectors of floats or doubles,
+ * respectively. The probabilities <p> are floats for the
+ * integer and float versions, and doubles for the double
+ * version.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_abc_IExpectScVec(const ESL_ALPHABET *a, int *sc, const float *p)
+{
+ ESL_DSQ x;
+ for (x = a->K+1; x <= a->Kp-3; x++)
+ sc[x] = esl_abc_IExpectScore(a, x, sc, p);
+ return eslOK;
+}
+int
+esl_abc_FExpectScVec(const ESL_ALPHABET *a, float *sc, const float *p)
+{
+ ESL_DSQ x;
+ for (x = a->K+1; x <= a->Kp-3; x++)
+ sc[x] = esl_abc_FExpectScore(a, x, sc, p);
+ return eslOK;
+}
+int
+esl_abc_DExpectScVec(const ESL_ALPHABET *a, double *sc, const double *p)
+{
+ ESL_DSQ x;
+ for (x = a->K+1; x <= a->Kp-3; x++)
+ sc[x] = esl_abc_DExpectScore(a, x, sc, p);
+ return eslOK;
+}
+
+
+/* Function: esl_abc_FCount()
+ * Synopsis: Count a degenerate symbol into a count vector.
+ *
+ * Purpose: Count a possibly degenerate digital symbol <x> (0..Kp-1)
+ * into a counts array <ct> for base symbols (0..K-1).
+ * Assign the symbol a weight of <wt> (often just 1.0).
+ * The count weight of a degenerate symbol is divided equally
+ * across the possible base symbols.
+ *
+ * <x> can be a gap; if so, <ct> must be allocated 0..K,
+ * not 0..K-1. If <x> is a missing data symbol, or a nonresidue
+ * data symbol, nothing is done.
+ *
+ * <esl_abc_DCount()> does the same, but for double-precision
+ * count vectors and weights.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_abc_FCount(const ESL_ALPHABET *abc, float *ct, ESL_DSQ x, float wt)
+{
+ ESL_DSQ y;
+
+ if (esl_abc_XIsCanonical(abc, x) || esl_abc_XIsGap(abc, x))
+ ct[x] += wt;
+ else if (esl_abc_XIsMissing(abc, x) || esl_abc_XIsNonresidue(abc, x))
+ return eslOK;
+ else
+ for (y = 0; y < abc->K; y++) {
+ if (abc->degen[x][y])
+ ct[y] += wt / (float) abc->ndegen[x];
+ }
+ return eslOK;
+}
+int
+esl_abc_DCount(const ESL_ALPHABET *abc, double *ct, ESL_DSQ x, double wt)
+{
+ ESL_DSQ y;
+
+ if (esl_abc_XIsCanonical(abc, x) || esl_abc_XIsGap(abc, x))
+ ct[x] += wt;
+ else if (esl_abc_XIsMissing(abc, x) || esl_abc_XIsNonresidue(abc, x))
+ return eslOK;
+ else
+ for (y = 0; y < abc->K; y++) {
+ if (abc->degen[x][y])
+ ct[y] += wt / (double) abc->ndegen[x];
+ }
+ return eslOK;
+}
+
+/* Function: esl_abc_EncodeType()
+ * Synopsis: Convert descriptive string to alphabet type code.
+ *
+ * Purpose: Convert a string like "amino" or "DNA" to the
+ * corresponding Easel internal alphabet type code
+ * such as <eslAMINO> or <eslDNA>; return the code.
+ *
+ * Returns: the code, such as <eslAMINO>; if <type> isn't
+ * recognized, returns <eslUNKNOWN>.
+ */
+int
+esl_abc_EncodeType(char *type)
+{
+ if (strcasecmp(type, "amino") == 0) return eslAMINO;
+ else if (strcasecmp(type, "rna") == 0) return eslRNA;
+ else if (strcasecmp(type, "dna") == 0) return eslDNA;
+ else if (strcasecmp(type, "coins") == 0) return eslCOINS;
+ else if (strcasecmp(type, "dice") == 0) return eslDICE;
+ else if (strcasecmp(type, "custom")== 0) return eslNONSTANDARD;
+ else return eslUNKNOWN;
+}
+
+/* Function: esl_abc_DecodeType()
+ * Synopsis: Returns descriptive string for alphabet type code.
+ *
+ * Purpose: For diagnostics and other output: given an internal
+ * alphabet code <type> (<eslRNA>, for example), return
+ * pointer to an internal string ("RNA", for example).
+ */
+char *
+esl_abc_DecodeType(int type)
+{
+ switch (type) {
+ case eslUNKNOWN: return "unknown";
+ case eslRNA: return "RNA";
+ case eslDNA: return "DNA";
+ case eslAMINO: return "amino";
+ case eslCOINS: return "coins";
+ case eslDICE: return "dice";
+ case eslNONSTANDARD: return "custom";
+ default: break;
+ }
+ esl_exception(eslEINVAL, FALSE, __FILE__, __LINE__, "no such alphabet type code %d\n", type);
+ return NULL;
+}
+
+
+/* Function: esl_abc_ValidateSeq()
+ * Synopsis: Assure that a text sequence can be digitized.
+ *
+ * Purpose: Check that sequence <seq> of length <L> can be digitized
+ * without error; all its symbols are valid in alphabet
+ * <a>. If so, return <eslOK>. If not, return <eslEINVAL>.
+ *
+ * If <a> is <NULL>, we still validate that at least the
+ * <seq> consists only of ASCII characters.
+ *
+ * <errbuf> is either passed as <NULL>, or a pointer to an
+ * error string buffer allocated by the caller for
+ * <eslERRBUFSIZE> characters. If <errbuf> is non-NULL, and
+ * the sequence is invalid, an error message is placed in
+ * <errbuf>.
+ *
+ * Args: a - digital alphabet (or NULL, if unavailable)
+ * seq - sequence to validate [0..L-1]; NUL-termination unnecessary
+ * L - length of <seq>
+ * errbuf - NULL, or ptr to <eslERRBUFSIZE> chars of allocated space
+ * for an error message.
+ *
+ * Returns: <eslOK> if <seq> is valid; <eslEINVAL> if not.
+ *
+ * Throws: (no abnormal error conditions).
+ */
+int
+esl_abc_ValidateSeq(const ESL_ALPHABET *a, const char *seq, int64_t L, char *errbuf)
+{
+ int status;
+ int64_t i;
+ int64_t firstpos = -1;
+ int64_t nbad = 0;
+
+ if (errbuf) *errbuf = 0;
+
+
+ if (a) // If we have digital alphabet <a>, it has an <inmap> we can check against
+ {
+ for (i = 0; i < L; i++) {
+ if (! esl_abc_CIsValid(a, seq[i])) {
+ if (firstpos == -1) firstpos = i;
+ nbad++;
+ }
+ }
+ }
+ else // Else, at least validate that the text string is an ASCII text string
+ {
+ for (i = 0; i < L; i++) {
+ if (! isascii(seq[i])) {
+ if (firstpos == -1) firstpos = i;
+ nbad++;
+ }
+ }
+ }
+
+ if (nbad == 1) ESL_XFAIL(eslEINVAL, errbuf, "invalid char %c at pos %" PRId64, seq[firstpos], firstpos+1);
+ else if (nbad > 1) ESL_XFAIL(eslEINVAL, errbuf, "%" PRId64 " invalid chars (including %c at pos %" PRId64 ")", nbad, seq[firstpos], firstpos+1);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+/*---------------- end, other API functions ---------------------*/
+
+
+
+/*****************************************************************
+ * 4. Unit tests.
+ *****************************************************************/
+#ifdef eslALPHABET_TESTDRIVE
+#include "esl_vectorops.h"
+
+static int
+utest_Create(void)
+{
+ char msg[] = "esl_alphabet_Create() unit test failed";
+ int types[] = { eslDNA, eslRNA, eslAMINO, eslCOINS, eslDICE };
+ int Karr[] = { 4, 4, 20, 2, 6 };
+ int Kparr[] = { 18, 18, 29, 6, 10 };
+ int i;
+ ESL_ALPHABET *a;
+ ESL_DSQ x;
+
+ for (i = 0; i < 3; i++)
+ {
+ if ((a = esl_alphabet_Create(types[i])) == NULL) esl_fatal(msg);
+ if (a->type != types[i]) esl_fatal(msg);
+ if (a->K != Karr[i]) esl_fatal(msg);
+ if (a->Kp != Kparr[i]) esl_fatal(msg);
+ if (strlen(a->sym) != a->Kp) esl_fatal(msg);
+
+ x = esl_abc_XGetGap(a);
+ if (x != a->K) esl_fatal(msg);
+ if (a->ndegen[x] != 0) esl_fatal(msg);
+
+ x = esl_abc_XGetUnknown(a);
+ if (x != a->Kp-3) esl_fatal(msg);
+ if (a->ndegen[x] != a->K) esl_fatal(msg);
+
+ x = esl_abc_XGetNonresidue(a);
+ if (x != a->Kp-2) esl_fatal(msg);
+ if (a->ndegen[x] != 0) esl_fatal(msg);
+
+ x = esl_abc_XGetMissing(a);
+ if (x != a->Kp-1) esl_fatal(msg);
+ if (a->ndegen[x] != 0) esl_fatal(msg);
+
+ esl_alphabet_Destroy(a);
+ }
+
+ /* Thrown errors
+ */
+#ifdef eslTEST_THROWING
+ if (esl_alphabet_Create(-1) != NULL) esl_fatal(msg);
+ if (esl_alphabet_Create(eslUNKNOWN) != NULL) esl_fatal(msg);
+ if (esl_alphabet_Create(eslNONSTANDARD) != NULL) esl_fatal(msg);
+#endif
+
+ return eslOK;
+}
+
+static int
+utest_CreateCustom(void)
+{
+ char msg[] = "esl_alphabet_CreateCustom() unit test failed";
+ ESL_ALPHABET *a;
+ char *testseq = "AaU-~Z";
+ ESL_DSQ expect[] = { eslDSQ_SENTINEL, 0, 0, 15, 20, 26, 23, eslDSQ_SENTINEL };
+ ESL_DSQ *dsq;
+
+ if ((a = esl_alphabet_CreateCustom("ACDEFGHIKLMNPQRSTVWY-BJZX*~", 20, 27)) == NULL) esl_fatal(msg);
+ if (esl_alphabet_SetEquiv(a, 'O', 'K') != eslOK) esl_fatal(msg); /* read pyrrolysine O as lysine K */
+ if (esl_alphabet_SetEquiv(a, 'U', 'S') != eslOK) esl_fatal(msg); /* read selenocys U as serine S */
+ if (esl_alphabet_SetCaseInsensitive(a) != eslOK) esl_fatal(msg); /* allow lower case input */
+ if (esl_alphabet_SetDegeneracy(a, 'Z', "QE") != eslOK) esl_fatal(msg);
+
+ if (esl_abc_CreateDsq(a, testseq, &dsq) != eslOK) esl_fatal(msg);
+ if (memcmp(dsq, expect, sizeof(ESL_DSQ) * (strlen(testseq)+2)) != 0) esl_fatal(msg);
+
+ free(dsq);
+ esl_alphabet_Destroy(a);
+
+#ifdef eslTEST_THROWING
+ if (esl_alphabet_CreateCustom("ACGT-RYMKSWHBVDN*~", 4, 21) != NULL) esl_fatal(msg); /* Kp mismatches string length */
+#endif
+
+ return eslOK;
+}
+
+static int
+utest_SetEquiv(void)
+{
+ char msg[] = "esl_alphabet_SetEquiv() unit test failed";
+ ESL_ALPHABET *a;
+ char *testseq = "a1&";
+ ESL_DSQ expect[] = { eslDSQ_SENTINEL, 0, 4, 7, eslDSQ_SENTINEL };
+ ESL_DSQ *dsq;
+
+ if ((a = esl_alphabet_CreateCustom("ACGT-N*~", 4, 8)) == NULL) esl_fatal(msg);
+ if (esl_alphabet_SetEquiv(a, 'a', 'A') != eslOK) esl_fatal(msg);
+ if (esl_alphabet_SetEquiv(a, '1', '-') != eslOK) esl_fatal(msg);
+ if (esl_alphabet_SetEquiv(a, '&', '~') != eslOK) esl_fatal(msg);
+
+#ifdef eslTEST_THROWING
+ if (esl_alphabet_SetEquiv(a, 'G', 'C') != eslEINVAL) esl_fatal(msg); /* sym is already in internal alphabet */
+ if (esl_alphabet_SetEquiv(a, '2', 'V') != eslEINVAL) esl_fatal(msg); /* c is not in internal alphabet */
+#endif
+
+ if (esl_abc_CreateDsq(a, testseq, &dsq) != eslOK) esl_fatal(msg);
+ if (memcmp(dsq, expect, sizeof(ESL_DSQ) * (strlen(testseq)+2)) != 0) esl_fatal(msg);
+ free(dsq);
+ esl_alphabet_Destroy(a);
+ return eslOK;
+}
+
+static int
+utest_SetCaseInsensitive(void)
+{
+ char msg[] = "esl_alphabet_SetCaseInsensitive() unit test failed";
+ ESL_ALPHABET *a;
+ char *testseq = "ACGT";
+ ESL_DSQ expect[] = { eslDSQ_SENTINEL, 0, 1, 2, 3, eslDSQ_SENTINEL };
+ ESL_DSQ *dsq;
+
+ if ((a = esl_alphabet_CreateCustom("acgt-n*~", 4, 8)) == NULL) esl_fatal(msg);
+ if (esl_alphabet_SetCaseInsensitive(a) != eslOK) esl_fatal(msg);
+ if (esl_abc_CreateDsq(a, testseq, &dsq) != eslOK) esl_fatal(msg);
+ if (memcmp(dsq, expect, sizeof(ESL_DSQ) * (strlen(testseq)+2)) != 0) esl_fatal(msg);
+ free(dsq);
+ esl_alphabet_Destroy(a);
+
+#ifdef TEST_THROWING
+ if ((a = esl_alphabet_CreateCustom("acgt-n*~", 4, 8)) == NULL) esl_fatal(msg);
+ if (esl_alphabet_SetEquiv(a, 'A', 'c') != eslOK) esl_fatal(msg); /* now input A maps to internal c */
+ if (esl_alphabet_SetCaseInsensitive(a) != eslECORRUPT) esl_fatal(msg); /* and this fails, can't remap A */
+ esl_alphabet_Destroy(a);
+#endif
+
+ return eslOK;
+}
+
+static int
+utest_SetDegeneracy(void)
+{
+ char msg[] = "esl_alphabet_SetDegeneracy() unit test failed";
+ ESL_ALPHABET *a;
+ char *testseq = "yrn";
+ ESL_DSQ expect[] = { eslDSQ_SENTINEL, 6, 5, 7, eslDSQ_SENTINEL };
+ ESL_DSQ *dsq;
+ ESL_DSQ x;
+
+ if ((a = esl_alphabet_CreateCustom("ACGT-RYN*~", 4, 10)) == NULL) esl_fatal(msg);
+ if (esl_alphabet_SetDegeneracy(a, 'R', "AG") != eslOK) esl_fatal(msg);
+ if (esl_alphabet_SetDegeneracy(a, 'Y', "CT") != eslOK) esl_fatal(msg);
+ if (esl_alphabet_SetCaseInsensitive(a) != eslOK) esl_fatal(msg);
+
+ if (esl_abc_CreateDsq(a, testseq, &dsq) != eslOK) esl_fatal(msg);
+ if (memcmp(dsq, expect, sizeof(ESL_DSQ) * (strlen(testseq)+2)) != 0) esl_fatal(msg);
+
+ x = esl_abc_DigitizeSymbol(a, 'a'); if (a->ndegen[x] != 1) esl_fatal(msg);
+ x = esl_abc_DigitizeSymbol(a, 'r'); if (a->ndegen[x] != 2) esl_fatal(msg);
+ x = esl_abc_DigitizeSymbol(a, 'y'); if (a->ndegen[x] != 2) esl_fatal(msg);
+ x = esl_abc_DigitizeSymbol(a, 'n'); if (a->ndegen[x] != 4) esl_fatal(msg);
+
+ free(dsq);
+ esl_alphabet_Destroy(a);
+
+#ifdef TEST_THROWING
+ if ((a = esl_alphabet_CreateCustom("ACGT-RYN*~", 4, 10)) == NULL) esl_fatal(msg);
+ if (esl_abc_SetDegeneracy(a, 'z', "AC") != eslEINVAL) esl_fatal(msg); /* can't map char not in alphabet */
+ if (esl_abc_SetDegeneracy(a, 'N', "ACGT") != eslEINVAL) esl_fatal(msg); /* can't remap N */
+ if (esl_abc_SetDegeneracy(a, 'A', "GT") != eslEINVAL) esl_fatal(msg); /* can't map a nondegen character */
+ if (esl_abc_SetDegeneracy(a, '-', "GT") != eslEINVAL) esl_fatal(msg); /* ... or a gap... */
+ if (esl_abc_SetDegeneracy(a, '*', "GT") != eslEINVAL) esl_fatal(msg); /* ... or nonresidues... */
+ if (esl_abc_SetDegeneracy(a, '~', "GT") != eslEINVAL) esl_fatal(msg); /* ... or missing data. */
+ if (esl_abc_SetDegeneracy(a, 'R', "XY") != eslEINVAL) esl_fatal(msg); /* can't map to unknown chars... */
+ if (esl_abc_SetDegeneracy(a, 'R', "YN") != eslEINVAL) esl_fatal(msg); /* ... nor to noncanonical chars... */
+ esl_alphabet_Destroy(a);
+#endif
+ return eslOK;
+}
+
+static int
+utest_SetIgnored(void)
+{
+ char msg[] = "esl_alphabet_SetIgnored() unit test failed";
+ ESL_ALPHABET *a;
+ char *testseq = "y \trn";
+ ESL_DSQ expect[] = { eslDSQ_SENTINEL, 6, 5, 15, eslDSQ_SENTINEL };
+ int L = 5;
+ ESL_DSQ *dsq;
+
+ if ((a = esl_alphabet_Create(eslRNA)) == NULL) esl_fatal(msg);
+ if (esl_alphabet_SetIgnored(a, " \t") != eslOK) esl_fatal(msg);
+
+ if (esl_abc_CreateDsq(a, testseq, &dsq) != eslOK) esl_fatal(msg);
+ if (memcmp(dsq, expect, sizeof(ESL_DSQ) * L) != 0) esl_fatal(msg);
+ free(dsq);
+ esl_alphabet_Destroy(a);
+ return eslOK;
+}
+
+
+static int
+utest_Destroy(void)
+{
+ char msg[] = "esl_alphabet_Destroy() unit test failed";
+ ESL_ALPHABET *a;
+
+ if ((a = esl_alphabet_CreateCustom("ACGT-RYN*~", 4, 10)) == NULL) esl_fatal(msg);
+ esl_alphabet_Destroy(a);
+ esl_alphabet_Destroy(NULL); /* should be robust against NULL pointers */
+ return eslOK;
+}
+
+static int
+utest_CreateDsq(void)
+{
+ char msg[] = "esl_abc_CreateDsq() unit test failed";
+ ESL_ALPHABET *a;
+ char goodseq[] = "ACDEF";
+ char badseq[] = "1@%34";
+ ESL_DSQ *dsq;
+ ESL_DSQ x;
+
+ if ((a = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal(msg);
+
+ if (esl_abc_CreateDsq(a, goodseq, &dsq) != eslOK) esl_fatal(msg);
+ if (dsq[1] != 0 || dsq[2] != 1) esl_fatal(msg); /* spot check */
+ free(dsq);
+
+ if (esl_abc_CreateDsq(a, badseq, &dsq) != eslEINVAL) esl_fatal(msg);
+ x = esl_abc_XGetUnknown(a);
+ if (dsq[1] != x || dsq[2] != x) esl_fatal(msg); /* bad chars all X's now, upon failure */
+ free(dsq);
+
+ if (esl_abc_CreateDsq(a, goodseq, NULL) != eslOK) esl_fatal(msg);
+
+ esl_alphabet_Destroy(a);
+ return eslOK;
+}
+
+static int
+utest_Digitize(void)
+{
+ char msg[] = "esl_abc_Digitize() unit test failed";
+ ESL_ALPHABET *a;
+ char goodseq[] = "ACDEF";
+ char badseq[] = "1@%34";
+ ESL_DSQ *dsq;
+ ESL_DSQ x;
+ int status;
+
+ ESL_ALLOC(dsq, sizeof(ESL_DSQ) * (strlen(goodseq)+2));
+
+ if ((a = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal(msg);
+ esl_abc_Digitize(a, goodseq, dsq);
+ if (dsq[1] != 0 || dsq[2] != 1) esl_fatal(msg); /* spot check */
+
+ esl_abc_Digitize(a, badseq, dsq);
+ x = esl_abc_XGetUnknown(a);
+ if (dsq[1] != x || dsq[2] != x) esl_fatal(msg); /* bad chars all X's now, upon failure */
+
+ free(dsq);
+ esl_alphabet_Destroy(a);
+ return eslOK;
+
+ ERROR:
+ esl_fatal(msg);
+ return status;
+}
+
+static int
+utest_Textize(void)
+{
+ char msg[] = "esl_abc_Textize() unit test failed";
+ ESL_ALPHABET *a;
+ char goodseq[] = "acdef";
+ char *newseq;
+ ESL_DSQ *dsq;
+ int L;
+ int status;
+
+ L = strlen(goodseq);
+ ESL_ALLOC(newseq, sizeof(char) * (L+1));
+ if ((a = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal(msg);
+ if (esl_abc_CreateDsq(a, goodseq, &dsq) != eslOK) esl_fatal(msg);
+ if (esl_abc_Textize(a, dsq, L, newseq ) != eslOK) esl_fatal(msg);
+ if (strcmp(newseq, "ACDEF") != 0) esl_fatal(msg);
+ free(dsq);
+ free(newseq);
+ esl_alphabet_Destroy(a);
+ return eslOK;
+
+ ERROR:
+ esl_fatal(msg);
+ return status;
+}
+
+static int
+utest_TextizeN(void)
+{
+ char msg[] = "esl_abc_TextizeN() unit test failed";
+ ESL_ALPHABET *a;
+ char goodseq[] = "acdefrynacdef";
+ ESL_DSQ *dsq;
+ ESL_DSQ *dptr;
+ int W;
+
+ if ((a = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal(msg);
+ if (esl_abc_CreateDsq(a, goodseq, &dsq) != eslOK) esl_fatal(msg);
+
+ dptr = dsq+6; /* points to "r", residue 6 */
+ W = 5; /* copy/convert 5 residues "rynac" */
+ if (esl_abc_TextizeN(a, dptr, W, goodseq) != eslOK) esl_fatal(msg);
+ if (strcmp(goodseq, "RYNACrynacdef") != 0) esl_fatal(msg);
+
+ /* test a case where we hit eslDSQ_SENTINEL, and nul-terminate */
+ dptr = dsq+10; /* points to "c", residue 10 */
+ W = 20; /* copy/convert remaining residues "cdef" */
+ if (esl_abc_TextizeN(a, dptr, W, goodseq) != eslOK) esl_fatal(msg);
+ if (strcmp(goodseq, "CDEF") != 0) esl_fatal(msg);
+
+ free(dsq);
+ esl_alphabet_Destroy(a);
+ return eslOK;
+}
+
+static int
+utest_dsqdup(void)
+{
+ char msg[] = "esl_abc_dsqdup() unit test failed";
+ ESL_ALPHABET *a;
+ char goodseq[] = "ACGt";
+ ESL_DSQ expect[] = { eslDSQ_SENTINEL, 0, 1, 2, 3, eslDSQ_SENTINEL };
+ ESL_DSQ *d1, *d2;
+ int L;
+
+ L = strlen(goodseq);
+ if ((a = esl_alphabet_Create(eslRNA)) == NULL) esl_fatal(msg);
+ if (esl_abc_CreateDsq(a, goodseq, &d1) != eslOK) esl_fatal(msg);
+
+ if (esl_abc_dsqdup(d1, -1, &d2) != eslOK) esl_fatal(msg);
+ if (memcmp(d2, expect, sizeof(ESL_DSQ) * (L+2)) != 0) esl_fatal(msg);
+ free(d2);
+
+ if (esl_abc_dsqdup(d1, L, &d2) != eslOK) esl_fatal(msg);
+ if (memcmp(d2, expect, sizeof(ESL_DSQ) * (L+2)) != 0) esl_fatal(msg);
+ free(d2);
+
+ free(d1);
+ esl_alphabet_Destroy(a);
+ return eslOK;
+}
+
+static int
+utest_dsqcat(void)
+{
+ char msg[] = "esl_abc_dsqcat() unit test failed";
+ ESL_ALPHABET *a;
+ char goodseq[] = "ACGt";
+ char addseq[] = "RYM KN";
+ char badseq[] = "RYM K&";
+ ESL_DSQ expect[] = { eslDSQ_SENTINEL, 0, 1, 2, 3, 5, 6, 7, 8, 15, eslDSQ_SENTINEL };
+ ESL_DSQ *dsq;
+ int64_t L1;
+ esl_pos_t L2;
+
+
+ if ((a = esl_alphabet_Create(eslRNA)) == NULL) esl_fatal(msg);
+ a->inmap[0] = esl_abc_XGetUnknown(a);
+ a->inmap[' '] = eslDSQ_IGNORED;
+
+ L1 = strlen(goodseq);
+ L2 = strlen(addseq);
+ if (esl_abc_CreateDsq(a, goodseq, &dsq) != eslOK) esl_fatal(msg);
+ if (esl_abc_dsqcat(a->inmap, &dsq, &L1, addseq, L2) != eslOK) esl_fatal(msg);
+ if (memcmp(dsq, expect, sizeof(ESL_DSQ) * (L1+2)) != 0) esl_fatal(msg);
+ free(dsq);
+
+ L1 = -1;
+ L2 = -1;
+ if (esl_abc_CreateDsq(a, goodseq, &dsq) != eslOK) esl_fatal(msg);
+ if (esl_abc_dsqcat(a->inmap, &dsq, &L1, addseq, L2) != eslOK) esl_fatal(msg);
+ if (L1 != esl_abc_dsqlen(dsq)) esl_fatal(msg);
+ if (memcmp(dsq, expect, sizeof(ESL_DSQ) * (L1+2)) != 0) esl_fatal(msg);
+ free(dsq);
+
+ L1 = 0;
+ dsq = NULL;
+ if (esl_abc_dsqcat(a->inmap, &dsq, &L1, goodseq, -1) != eslOK) esl_fatal(msg);
+ if (esl_abc_dsqcat(a->inmap, &dsq, &L1, addseq, -1) != eslOK) esl_fatal(msg);
+ if (L1 != esl_abc_dsqlen(dsq)) esl_fatal(msg);
+ if (memcmp(dsq, expect, sizeof(ESL_DSQ) * (L1+2)) != 0) esl_fatal(msg);
+ free(dsq);
+
+ L1 = -1;
+ L2 = strlen(badseq);
+ if (esl_abc_CreateDsq(a, goodseq, &dsq) != eslOK) esl_fatal(msg);
+ if (esl_abc_dsqcat(a->inmap, &dsq, &L1, badseq, L2) != eslEINVAL) esl_fatal(msg);
+ if (L1 != esl_abc_dsqlen(dsq)) esl_fatal(msg);
+ if (memcmp(dsq, expect, sizeof(ESL_DSQ) * (L1+2)) != 0) esl_fatal(msg);
+ free(dsq);
+
+ esl_alphabet_Destroy(a);
+ return eslOK;
+}
+
+/* dsqlen unit test goes here */
+/* dsqrlen unit test goes here */
+/* utest_Match goes here */
+
+/* This serves to unit test multiple functions:
+ * esl_abc_IAvgScore()
+ * esl_abc_IExpectScore()
+ */
+static int
+degeneracy_integer_scores(void)
+{
+ char *msg = "degeneracy_integer_scores unit test failed";
+ ESL_ALPHABET *a;
+ ESL_DSQ x;
+ float p[] = {0.4, 0.1, 0.1, 0.4}; /* A/T biased background */
+ int sc[] = { -1, -6, 6, 1};
+ int val;
+
+ a = esl_alphabet_Create(eslDNA);
+
+ x = esl_abc_DigitizeSymbol(a, 'N'); /* any: A/C/G/T */
+ val = esl_abc_IAvgScore(a, x, sc);
+ /* average of -1,-6,6,1 = 0 */
+ if (val != 0) esl_fatal(msg);
+
+ x = esl_abc_DigitizeSymbol(a, 'M'); /* M = A/C */
+ val = esl_abc_IExpectScore(a, x, sc, p);
+ /* expectation of -1,-6 given p = 0.4,0.1 = -2 */
+ if (val != -2) esl_fatal(msg);
+
+ esl_alphabet_Destroy(a);
+ return eslOK;
+}
+
+/* This serves to unit test multiple functions:
+ * esl_abc_FAvgScore()
+ * esl_abc_FExpectScore()
+ */
+static int
+degeneracy_float_scores(void)
+{
+ char *msg = "degeneracy_float_scores unit test failed";
+ ESL_ALPHABET *a;
+ ESL_DSQ x;
+ float p[] = {0.4, 0.1, 0.1, 0.4}; /* A/T biased background */
+ float sc[] = { -1., -6., 6., 1.};
+ float val;
+
+ a = esl_alphabet_Create(eslRNA);
+
+ x = esl_abc_DigitizeSymbol(a, 'N'); /* any: A/C/G/T */
+ val = esl_abc_FAvgScore(a, x, sc);
+ /* average of -1,-6,6,1 = 0 */
+ if (fabs(val - 0.) > 0.0001) esl_fatal(msg);
+
+ x = esl_abc_DigitizeSymbol(a, 'M'); /* M = A/C */
+ val = esl_abc_FExpectScore(a, x, sc, p);
+ /* expectation of -1,-6 given p = 0.4,0.1 = -2 */
+ if (fabs(val + 2.) > 0.0001) esl_fatal(msg);
+
+ esl_alphabet_Destroy(a);
+ return eslOK;
+}
+
+/* This serves to unit test multiple functions:
+ * esl_abc_DAvgScore()
+ * esl_abc_DExpectScore()
+ */
+
+static int
+degeneracy_double_scores(void)
+{
+ char *msg = "degeneracy_double_scores unit test failed";
+ ESL_ALPHABET *a;
+ ESL_DSQ x;
+ double p[] = {0.4, 0.1, 0.1, 0.4}; /* A/T biased background */
+ double sc[] = { -1., -6., 6., 1.};
+ double val;
+
+ a = esl_alphabet_Create(eslRNA);
+
+ x = esl_abc_DigitizeSymbol(a, 'N'); /* any: A/C/G/T */
+ val = esl_abc_DAvgScore(a, x, sc);
+ /* average of -1,-6,6,1 = 0 */
+ if (fabs(val - 0.) > 0.0001) esl_fatal(msg);
+
+ x = esl_abc_DigitizeSymbol(a, 'M'); /* M = A/C */
+ val = esl_abc_DExpectScore(a, x, sc, p);
+ /* expectation of -1,-6 given p = 0.4,0.1 = -2 */
+ if (fabs(val + 2.) > 0.0001) esl_fatal(msg);
+
+ esl_alphabet_Destroy(a);
+ return eslOK;
+}
+
+/* utest_IAvgScVec */
+/* utest_FAvgScVec */
+/* utest_DAvgScVec */
+/* utest_IExpectScVec */
+/* utest_FExpectScVec */
+/* utest_DExpectScVec */
+
+static int
+utest_FCount(void)
+{
+ char *msg = "FCount unit test failure";
+ ESL_ALPHABET *a = NULL;
+ ESL_DSQ x;
+ char *teststring = "X~-Z.UAX";
+ char *s;
+ int status;
+
+ /* 0.1 from 2 X's; U -> +1 C; A -> +1 A; Z-> +0.5 Q,E; ~ ignored; .,- -> +2 gaps */
+ /* A C D E F G H I K L M N P Q R S T V W Y - */
+ float expect[21] = { 1.1, 1.1, 0.1, 0.6, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.6, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 2.0 };
+ float *vec;
+
+ a = esl_alphabet_Create(eslAMINO);
+ ESL_ALLOC(vec, sizeof(float) * (a->K+1)); /* include gap char for this test */
+ esl_vec_FSet(vec, a->K+1, 0.);
+ for (s = teststring; *s != '\0'; s++)
+ {
+ x = esl_abc_DigitizeSymbol(a, *s);
+ if (esl_abc_FCount(a, vec, x, 1.0) != eslOK) esl_fatal(msg);
+ }
+ if (esl_vec_FCompare(vec, expect, a->K+1, 0.0001) != eslOK) esl_fatal(msg);
+
+ esl_alphabet_Destroy(a);
+ free(vec);
+ return eslOK;
+
+ ERROR:
+ esl_fatal("allocation failed");
+ return status;
+}
+
+static int
+utest_DCount(void)
+{
+ char *msg = "DCount unit test failure";
+ ESL_ALPHABET *a = NULL;
+ ESL_DSQ x;
+ char *teststring = "X~-Z.UAX";
+ char *s;
+ int status;
+
+ /* 0.1 from 2 X's; U -> +1 C; A -> +1 A; Z-> +0.5 Q,E; ~ ignored; .,- -> +2 gaps */
+ /* A C D E F G H I K L M N P Q R S T V W Y - */
+ double expect[21] = { 1.1, 1.1, 0.1, 0.6, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.6, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 2.0 };
+ double *vec;
+
+ a = esl_alphabet_Create(eslAMINO);
+ ESL_ALLOC(vec, sizeof(double) * (a->K+1)); /* include gap char for this test */
+ esl_vec_DSet(vec, a->K+1, 0.);
+ for (s = teststring; *s != '\0'; s++)
+ {
+ x = esl_abc_DigitizeSymbol(a, *s);
+ if (esl_abc_DCount(a, vec, x, 1.0) != eslOK) esl_fatal(msg);
+ }
+ if (esl_vec_DCompare(vec, expect, a->K+1, 0.0001) != eslOK) esl_fatal(msg);
+
+ esl_alphabet_Destroy(a);
+ free(vec);
+ return eslOK;
+
+ ERROR:
+ esl_fatal("allocation failed");
+ return status;
+}
+#endif /* eslALPHABET_TESTDRIVE*/
+/*-------------------- end, unit tests --------------------------*/
+
+
+
+
+/*****************************************************************
+ * 5. Test driver.
+ *****************************************************************/
+
+/* gcc -g -Wall -std=gnu99 -I. -o esl_alphabet_utest -DeslALPHABET_TESTDRIVE esl_alphabet.c esl_vectorops.c easel.c -lm
+ * gcc -g -Wall -std=gnu99 -I. -L. -o esl_alphabet_utest -DeslALPHABET_TESTDRIVE esl_alphabet.c -leasel
+ * ./test
+ * valgrind ./test
+ */
+#ifdef eslALPHABET_TESTDRIVE
+static int basic_examples(void);
+
+#include "easel.h"
+#include "esl_alphabet.h"
+
+int
+main(void)
+{
+ utest_Create();
+ utest_CreateCustom();
+ utest_SetEquiv();
+ utest_SetCaseInsensitive();
+ utest_SetDegeneracy();
+ utest_SetIgnored();
+ utest_Destroy();
+
+ utest_CreateDsq();
+ utest_Digitize();
+ utest_Textize();
+ utest_TextizeN();
+ utest_dsqdup();
+ utest_dsqcat();
+
+ utest_FCount();
+ utest_DCount();
+
+ basic_examples();
+ degeneracy_integer_scores();
+ degeneracy_float_scores();
+ degeneracy_double_scores();
+
+ return eslOK;
+}
+
+static int
+basic_examples(void)
+{
+ char *msg = "basic alphabet example tests failed";
+ ESL_ALPHABET *a1, *a2;
+ char dnaseq[] = "GARYtcN";
+ char aaseq[] = "EFILqzU";
+ int L;
+ ESL_DSQ *dsq, *dsq2;
+ int i;
+
+ /* Example 1.
+ * Create a DNA alphabet; digitize a DNA sequence.
+ */
+ if ((a1 = esl_alphabet_Create(eslDNA)) == NULL) esl_fatal(msg);
+ L = strlen(dnaseq);
+ if ((dsq = malloc(sizeof(ESL_DSQ) * (L+2))) == NULL) esl_fatal(msg);
+ if (esl_abc_Digitize(a1, dnaseq, dsq) != eslOK) esl_fatal(msg);
+ if (esl_abc_dsqlen(dsq) != L) esl_fatal(msg);
+ esl_alphabet_Destroy(a1);
+
+ /* Example 2.
+ * Create an RNA alphabet; digitize the same DNA sequence;
+ * make sure it is equal to the dsq above (so T=U were
+ * correctly synonymous on input).
+ */
+ if ((a2 = esl_alphabet_Create(eslRNA)) == NULL) esl_fatal(msg);
+ if ((dsq2 = malloc(sizeof(ESL_DSQ) * (L+2))) == NULL) esl_fatal(msg);
+ if (esl_abc_Digitize(a2, dnaseq, dsq2) != eslOK) esl_fatal(msg);
+ for (i = 1; i <= L; i++)
+ if (dsq[i] != dsq2[i]) esl_fatal(msg);
+ esl_alphabet_Destroy(a2);
+
+ /* Example 3.
+ * Create an amino alphabet; digitize a protein sequence,
+ * while reusing memory already allocated in dsq.
+ */
+ if ((a1 = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal(msg);
+ if (esl_abc_Digitize(a1, aaseq, dsq) != eslOK) esl_fatal(msg);
+
+ /* Example 4.
+ * Create a custom alphabet almost the same as the amino
+ * acid alphabet; digitize the same protein seq, reusing
+ * memory in dsq2; check that seqs are identical.
+ */
+ if ((a2 = esl_alphabet_CreateCustom("ACDEFGHIKLMNPQRSTVWY-BJZOUX~", 20, 28)) == NULL) esl_fatal(msg);
+ if (esl_alphabet_SetCaseInsensitive(a2) != eslOK) esl_fatal(msg); /* allow lower case input */
+ if (esl_alphabet_SetDegeneracy(a2, 'Z', "QE") != eslOK) esl_fatal(msg);
+
+ if (esl_abc_Digitize(a2, aaseq, dsq2) != eslOK) esl_fatal(msg);
+ for (i = 1; i <= L; i++)
+ if (dsq[i] != dsq2[i]) esl_fatal(msg);
+
+ /* clean up.
+ */
+ esl_alphabet_Destroy(a1);
+ esl_alphabet_Destroy(a2);
+ free(dsq);
+ free(dsq2);
+ return eslOK;
+}
+
+
+#endif /*eslALPHABET_TESTDRIVE*/
+
+/*****************************************************************
+ * 6. Examples.
+ *****************************************************************/
+
+/* gcc -g -Wall -o example -I. -DeslALPHABET_EXAMPLE esl_alphabet.c easel.c
+ */
+#ifdef eslALPHABET_EXAMPLE
+/*::cexcerpt::alphabet_example::begin::*/
+#include "easel.h"
+#include "esl_alphabet.h"
+int main(void)
+{
+ ESL_ALPHABET *a;
+ char dnaseq[] = "GARYTC";
+ int L = 6;
+ ESL_DSQ *dsq;
+
+ a = esl_alphabet_Create(eslDNA);
+
+ if ((dsq = malloc(sizeof(ESL_DSQ) * (L+2))) == NULL) esl_fatal("malloc failed");
+ if (esl_abc_Digitize(a, dnaseq, dsq) != eslOK) esl_fatal("failed to digitize the sequence");
+
+ free(dsq);
+ esl_alphabet_Destroy(a);
+ return 0;
+}
+/*::cexcerpt::alphabet_example::end::*/
+#endif /*eslALPHABET_EXAMPLE*/
+
+
+/* gcc -g -Wall -o example -I. -DeslALPHABET_EXAMPLE2 esl_alphabet.c easel.c
+ */
+#ifdef eslALPHABET_EXAMPLE2
+/*::cexcerpt::alphabet_example2::begin::*/
+#include "easel.h"
+#include "esl_alphabet.h"
+int main(void)
+{
+ ESL_ALPHABET *a;
+
+ /* 1. Create the base alphabet structure. */
+ a = esl_alphabet_CreateCustom("ACDEFGHIKLMNOPQRSTUVWY-BJZX~", 22, 28);
+
+ /* 2. Set your equivalences in the input map. */
+ esl_alphabet_SetEquiv(a, '.', '-'); /* allow . as a gap character too */
+
+ /* 3. After all synonyms are set, (optionally) make map case-insensitive. */
+ esl_alphabet_SetCaseInsensitive(a); /* allow lower case input too */
+
+ /* 4. Define your optional degeneracy codes in the alphabet, one at a time.
+ * The 'any' character X was automatically set up. */
+ esl_alphabet_SetDegeneracy(a, 'B', "DN"); /* read B as {D|N} */
+ esl_alphabet_SetDegeneracy(a, 'J', "IL"); /* read B as {I|L} */
+ esl_alphabet_SetDegeneracy(a, 'Z', "QE"); /* read Z as {Q|E} */
+
+ /* 5. (do your stuff) */
+
+ /* 6. Remember to free it when you're done with it. */
+ esl_alphabet_Destroy(a);
+ return 0;
+}
+/*::cexcerpt::alphabet_example2::end::*/
+#endif /*eslALPHABET_EXAMPLE2*/
+
+
+
+#ifdef eslALPHABET_EXAMPLE3
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_SQ *sq = esl_sq_Create();
+ ESL_SQFILE *sqfp;
+ int format = eslSQFILE_UNKNOWN;
+ char *seqfile = argv[1];
+ int type;
+ int status;
+
+ status = esl_sqfile_Open(seqfile, format, NULL, &sqfp);
+ if (status == eslENOTFOUND) esl_fatal("No such file.");
+ else if (status == eslEFORMAT) esl_fatal("Format couldn't be determined.");
+ else if (status != eslOK) esl_fatal("Open failed, code %d.", status);
+
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ esl_sq_GuessAlphabet(sq, &type);
+ printf("%-25s %s\n", sq->name, esl_abc_DecodeType(type));
+ esl_sq_Reuse(sq);
+ }
+ if (status == eslEFORMAT) esl_fatal("Parse failed\n %s", esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected read error %d", status);
+
+ esl_sq_Destroy(sq);
+ esl_sqfile_Close(sqfp);
+ return 0;
+}
+#endif /*eslALPHABET_EXAMPLE3*/
+
+
+
+
diff --git a/esl_alphabet.h b/esl_alphabet.h
new file mode 100644
index 0000000..bb387e1
--- /dev/null
+++ b/esl_alphabet.h
@@ -0,0 +1,129 @@
+/* Digital representation of biosequence symbols in Easel.
+ */
+#ifndef eslALPHABET_INCLUDED
+#define eslALPHABET_INCLUDED
+
+#include <ctype.h> /* isascii() */
+#include "easel.h"
+
+/* Flags for alphabet types.
+ * Do not change, only add, because these codes are used in file formats.
+ */
+#define eslUNKNOWN 0 /* 0=unknown is easel-wide convention; don't change */
+#define eslRNA 1
+#define eslDNA 2
+#define eslAMINO 3
+#define eslCOINS 4 /* for toy examples */
+#define eslDICE 5 /* also for toy examples */
+#define eslNONSTANDARD 6
+/* ... if you add here, change esl_abc_ValidateType() too. */
+
+
+/* Structure: ESL_ALPHABET
+ */
+typedef struct {
+ int type; /* eslDNA, eslRNA, eslAMINO, eslNONSTANDARD, etc. */
+ int K; /* uniq alphabet size: 4 or 20 */
+ int Kp; /* total size: alphabet + degen + gap + missing */
+ char *sym; /* "ACGT-RYMKSWHBVDN*~", for instance [0..Kp-1] */
+ ESL_DSQ inmap[128]; /* inmap['A'] = 0, etc: dsq[] index for a symbol */
+ char **degen; /* 1/0, which syms inc which res [0..Kp-1][0..K-1] */
+ int *ndegen; /* # of degenerate residues per code [0..Kp-1] */
+ ESL_DSQ *complement; /* maps sym to complements, [0..Kp-1]; NULL if <type> not DNA/RNA */
+} ESL_ALPHABET;
+
+
+
+
+/* 1. An ESL_ALPHABET object.
+ */
+extern ESL_ALPHABET *esl_alphabet_Create(int type);
+extern ESL_ALPHABET *esl_alphabet_CreateCustom(const char *alphabet, int K, int Kp);
+extern int esl_alphabet_SetEquiv(ESL_ALPHABET *a, char sym, char c);
+extern int esl_alphabet_SetCaseInsensitive(ESL_ALPHABET *a);
+extern int esl_alphabet_SetDegeneracy(ESL_ALPHABET *a, char c, char *ds);
+extern int esl_alphabet_SetIgnored(ESL_ALPHABET *a, const char *ignoredchars);
+extern size_t esl_alphabet_Sizeof(ESL_ALPHABET *a);
+extern void esl_alphabet_Destroy(ESL_ALPHABET *a);
+
+/* 2. Digitized sequences.
+ */
+extern int esl_abc_CreateDsq(const ESL_ALPHABET *a, const char *seq, ESL_DSQ **ret_dsq);
+extern int esl_abc_Digitize (const ESL_ALPHABET *a, const char *seq, ESL_DSQ *dsq);
+extern int esl_abc_Textize (const ESL_ALPHABET *a, const ESL_DSQ *dsq, int64_t L, char *seq);
+extern int esl_abc_TextizeN (const ESL_ALPHABET *a, const ESL_DSQ *dptr, int64_t L, char *buf);
+extern int esl_abc_dsqcpy(const ESL_DSQ *dsq, int64_t L, ESL_DSQ *dcopy);
+extern int esl_abc_dsqdup(const ESL_DSQ *dsq, int64_t L, ESL_DSQ **ret_dup);
+extern int esl_abc_dsqcat (const ESL_DSQ *inmap, ESL_DSQ **dsq, int64_t *L, const char *s, esl_pos_t n);
+extern int esl_abc_dsqcat_noalloc(const ESL_DSQ *inmap, ESL_DSQ *dsq, int64_t *L, const char *s, esl_pos_t n);
+extern int64_t esl_abc_dsqlen(const ESL_DSQ *dsq);
+extern int64_t esl_abc_dsqrlen(const ESL_ALPHABET *a, const ESL_DSQ *dsq);
+extern int esl_abc_CDealign(const ESL_ALPHABET *abc, char *s, const ESL_DSQ *ref_ax, int64_t *opt_rlen);
+extern int esl_abc_XDealign(const ESL_ALPHABET *abc, ESL_DSQ *x, const ESL_DSQ *ref_ax, int64_t *opt_rlen);
+extern int esl_abc_ConvertDegen2X(const ESL_ALPHABET *abc, ESL_DSQ *dsq);
+extern int esl_abc_revcomp(const ESL_ALPHABET *abc, ESL_DSQ *dsq, int n);
+
+/* 3. Other routines in the API.
+ */
+extern int esl_abc_ValidateType(int type);
+extern int esl_abc_GuessAlphabet(const int64_t *ct, int *ret_type);
+extern double esl_abc_Match (const ESL_ALPHABET *a, ESL_DSQ x, ESL_DSQ y, double *p);
+extern int esl_abc_IAvgScore (const ESL_ALPHABET *a, ESL_DSQ x, const int *sc);
+extern float esl_abc_FAvgScore (const ESL_ALPHABET *a, ESL_DSQ x, const float *sc);
+extern double esl_abc_DAvgScore (const ESL_ALPHABET *a, ESL_DSQ x, const double *sc);
+extern int esl_abc_IExpectScore(const ESL_ALPHABET *a, ESL_DSQ x, const int *sc, const float *p);
+extern float esl_abc_FExpectScore(const ESL_ALPHABET *a, ESL_DSQ x, const float *sc, const float *p);
+extern double esl_abc_DExpectScore(const ESL_ALPHABET *a, ESL_DSQ x, const double *sc, const double *p);
+
+extern int esl_abc_IAvgScVec (const ESL_ALPHABET *a, int *sc);
+extern int esl_abc_FAvgScVec (const ESL_ALPHABET *a, float *sc);
+extern int esl_abc_DAvgScVec (const ESL_ALPHABET *a, double *sc);
+extern int esl_abc_IExpectScVec(const ESL_ALPHABET *a, int *sc, const float *p);
+extern int esl_abc_FExpectScVec(const ESL_ALPHABET *a, float *sc, const float *p);
+extern int esl_abc_DExpectScVec(const ESL_ALPHABET *a, double *sc, const double *p);
+extern int esl_abc_FCount (const ESL_ALPHABET *a, float *ct, ESL_DSQ x, float wt);
+extern int esl_abc_DCount (const ESL_ALPHABET *a, double *ct, ESL_DSQ x, double wt);
+extern int esl_abc_EncodeType (char *typestring);
+extern char *esl_abc_DecodeType (int type);
+extern int esl_abc_ValidateSeq(const ESL_ALPHABET *a, const char *seq, int64_t L, char *errbuf);
+
+/* In the tests below, remember the rules of order in internal alphabets:
+ * Canonical alphabet Gap Degeneracies Any None Missing
+ * 0..K-1 K K+1..Kp-4 (Kp-3) (Kp-2) (Kp-1)
+ * ACGT - RYMKSWHBVD N * ~ DNA: K=4 Kp=18
+ * ACDEFGHIKLMNPQRSTVWY - BJZOU X * ~ protein: K=20 Kp=29
+ *
+ * ESL_DSQ is an unsigned 8-bit type, so don't test for >= 0 or compilers will complain.
+ */
+#define esl_abc_DigitizeSymbol(a, c) ((a)->inmap[(int)c])
+#define esl_abc_XIsValid(a, x) ((x) < (a)->Kp)
+#define esl_abc_XIsResidue(a, x) ((x) < (a)->K || ((x) > (a)->K && (x) < (a)->Kp-2))
+#define esl_abc_XIsCanonical(a, x) ((x) < (a)->K)
+#define esl_abc_XIsGap(a, x) ((x) == (a)->K)
+#define esl_abc_XIsDegenerate(a, x) ((x) > (a)->K && (x) < (a)->Kp-2)
+#define esl_abc_XIsUnknown(a, x) ((x) == (a)->Kp-3)
+#define esl_abc_XIsNonresidue(a, x) ((x) == (a)->Kp-2)
+#define esl_abc_XIsMissing(a, x) ((x) == (a)->Kp-1)
+#define esl_abc_XGetGap(a) ((a)->K)
+#define esl_abc_XGetUnknown(a) ((a)->Kp-3)
+#define esl_abc_XGetNonresidue(a) ((a)->Kp-2)
+#define esl_abc_XGetMissing(a) ((a)->Kp-1)
+
+
+#define esl_abc_CIsValid(a, c) (isascii(c) && (a)->inmap[(int)c] < (a)->Kp)
+#define esl_abc_CIsResidue(a, c) ((a)->inmap[(int)c] < (a)->K || ((a)->inmap[(int)c] > (a)->K && (a)->inmap[(int)c] < (a)->Kp-2))
+#define esl_abc_CIsCanonical(a, c) ((a)->inmap[(int)c] < (a)->K)
+#define esl_abc_CIsGap(a, c) ((a)->inmap[(int)c] == (a)->K)
+#define esl_abc_CIsDegenerate(a, c) ((a)->inmap[(int)c] > (a)->K && (a)->inmap[(int)c] < (a)->Kp-2)
+#define esl_abc_CIsUnknown(a, c) ((a)->inmap[(int)c] == (a)->Kp-3)
+#define esl_abc_CIsNonresidue(a, c) ((a)->inmap[(int)c] == (a)->Kp-2)
+#define esl_abc_CIsMissing(a, c) ((a)->inmap[(int)c] == (a)->Kp-1)
+#define esl_abc_CGetGap(a) ((a)->sym[(int)(a)->K])
+#define esl_abc_CGetUnknown(a) ((a)->sym[(int)(a)->Kp-3])
+#define esl_abc_CGetNonresidue(a) ((a)->sym[(int)(a)->Kp-2])
+#define esl_abc_CGetMissing(a) ((a)->sym[(int)(a)->Kp-1])
+
+#endif /*eslALPHABET_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_alphabet.tex b/esl_alphabet.tex
new file mode 100644
index 0000000..03c3853
--- /dev/null
+++ b/esl_alphabet.tex
@@ -0,0 +1,501 @@
+The \eslmod{alphabet} module contains routines for digitizing
+alphabetic biosequences.
+
+It is convenient to represent nucleotides and amino acids as array
+indices 0..3 or 0..19, respectively, for efficiency and other
+reasons. It is also convenient to index the residues in a biosequence
+in 1..L coordinates instead of the C language's 0..L-1 array
+representation, partly for human readability, and also because some
+codes (dynamic programming alignment algorithms, for example) have
+boundary conditions where initializing a boundary at coordinate 0 is
+convenient.
+
+Real biosequences do not consist of just four or twenty different
+canonical symbols, though. The \eslmod{alphabet} module provides
+mechanisms for dealing with several other biosequence coding issues:
+
+\begin{itemize}
+ \item Degenerate residue symbols representing uncertainties,
+ including both IUPAC/IUBMB standard one-letter nomenclature
+ and nonstandard extensions such as the use of \ccode{J} to
+ mean isoleucine or leucine (\ccode{I|L}) in protein sequences
+ determined by mass spec;
+
+ \item Symbols for ``any residue'' (N in DNA/RNA; X in amino acid
+ sequences) and ``not a residue'' (a ``translated'' stop codon '*'
+ in protein sequence;
+
+ \item Standard and nonstandard symbols for unusual residues, such as
+ selenocysteine (\ccode{U}) and pyrrolysine (\ccode{O}) in
+ proteins;
+
+ \item \emph{Ad hoc} symbols representing modified residues, such as
+ the slew of one-letter codes used to annotate
+ posttranscriptionally modified nucleotides in the Sprinzl tRNA
+ database \citep{Sprinzl98};
+
+ \item Case-insensitivity of input sequences, for instance allowing
+ both \ccode{a} and \ccode{A} to mean alanine in amino acid
+ sequences;
+
+ \item Tolerating common malpractices in the field, like the use of
+ \ccode{X} instead of \ccode{N} as a degeneracy code in nucleic
+ acid sequence;
+
+ \item The semantic difference between a gap symbol and a missing
+ data symbol in sequence alignments.
+\end{itemize}
+
+The \eslmod{alphabet} module provides standard defaults for protein,
+RNA, and DNA alphabets which follow both community standards and
+IUPAC/IUBMB nomenclature for representing sequence residues in
+one-letter ASCII characters. Additionally, the design of the
+\eslmod{alphabet} module is flexible enough to allow an application to
+customize its own alphabet, to deal with these issues almost any way
+it chooses.
+
+Table~\ref{tbl:alphabet_api} lists the functions in the
+\eslmod{alphabet} API. Easel maintains alphabet information in an
+\ccode{ESL\_ALPHABET} structure. An application usually creates its
+alphabet once, possibly even as a global variable. A digitized
+sequence \ccode{dsq} is an \ccode{unsigned char *} array of length
+\ccode{L+2}, where \ccode{dsq[1..L]} are digitized residues, and
+\ccode{dsq[0]} and \ccode{dsq[L+1]} are sentinel bytes (of value
+\ccode{eslSENTINEL}, 127).
+
+\begin{table}[hbp]
+\begin{center}
+\begin{tabular}{ll}\hline
+ \multicolumn{2}{c}{\textbf{The \ccode{ESL\_ALPHABET} object}}\\
+\ccode{esl\_alphabet\_Create()} & Create alphabet of standard type. \\
+\ccode{esl\_alphabet\_CreateCustom()} & Create a custom alphabet. \\
+\ccode{esl\_alphabet\_SetEquiv()} & Define an equivalent symbol. \\
+\ccode{esl\_alphabet\_SetCaseInsensitive()} & Make an alphabet's input map case insensitive. \\
+\ccode{esl\_alphabet\_SetDegeneracy()} & Define degenerate symbol in custom alphabet. \\
+\ccode{esl\_alphabet\_Destroy()} & Frees an alphabet object. \\
+ \multicolumn{2}{c}{\textbf{Digitized sequences}}\\
+\ccode{esl\_abc\_CreateDsq()} & Digitize a sequence into new \ccode{dsq} space. \\
+\ccode{esl\_abc\_Digitize()} & Digitize a sequence into existing \ccode{dsq} space. \\
+ \multicolumn{2}{c}{\textbf{Other functions}}\\
+\ccode{esl\_abc\_\{I,F,D\}AvgScore()} & Calculate avg score of degenerate residue.\\
+\ccode{esl\_abc\_\{I,F,D\}ExpectScore()} & Calculate expected score of degenerate residue.\\
+\ccode{esl\_abc\_Type()} & Convert internal alphabet type code to output string.\\
+\ccode{esl\_abc\_\{F,D\}Count()} & Count a digital symbol towards a countvector.\\
+\ccode{esl\_abc\_DigitizeSymbol()} & Returns digital code for one ASCII character.\\
+\ccode{esl\_abc\_XIsDegenerate()} & Returns TRUE given code for a degeneracy.\\
+\ccode{esl\_abc\_XIsBasic()} & Returns TRUE given code for a fundamental residue.\\
+\ccode{esl\_abc\_XIsGap()} & Returns TRUE given code for a gap.\\
+\ccode{esl\_abc\_CIsDegenerate()} & Returns TRUE given a degenerate character.\\
+\ccode{esl\_abc\_CIsBasic()} & Returns TRUE given a fundamental residue.\\
+\ccode{esl\_abc\_CIsGap()} & Returns TRUE given a gap character.\\
+
+\hline
+\end{tabular}
+\end{center}
+\caption{The \eslmod{alphabet} API.}
+\label{tbl:alphabet_api}
+\end{table}
+
+\subsection{An example of using the alphabet API}
+
+Figure~\ref{fig:alphabet_example} shows an example of creating a DNA
+alphabet and digitizing a short DNA sequence.
+
+\begin{figure}
+\input{cexcerpts/alphabet_example}
+\caption{An example of using the \eslmod{alphabet} module.}
+\label{fig:alphabet_example}
+\end{figure}
+
+\begin{itemize}
+\item A standard biosequence alphabet is created using
+\ccode{esl\_alphabet\_Create(type)}, where \ccode{type} can be
+\ccode{eslDNA}, \ccode{eslRNA}, or \ccode{eslAMINO}.
+
+\item An input sequence \ccode{seq} of length \ccode{L} is digitized
+according to alphabet \ccode{a}, creating a newly allocated digital
+sequence \ccode{dsq}, by calling \ccode{esl\_dsq\_Create(a, seq, L,
+\&dsq)}. The caller must free \ccode{dsq} using \ccode{free(dsq)}.
+Alternatively, if the caller has already allocated \ccode{L+2} (or
+more) bytes in \ccode{dsq}, it can call \ccode{esl\_dsq\_Set(a, seq,
+L, dsq)}, which is the non-allocating version of
+\ccode{esl\_dsq\_Create()}.
+
+\item For an input sequence of length \ccode{L}, the digitized
+sequence \ccode{dsq} is a \ccode{char *} array of \ccode{L+2}
+bytes. \ccode{dsq[0]} and \ccode{dsq[L+1]} contain a sentinel byte of
+value \ccode{eslSENTINEL} (127). Positions \ccode{1..L} hold the
+residues, where values \ccode{0..3} encode \ccode{ACGT} in DNA
+sequences, \ccode{0..3} encode \ccode{ACGU} in RNA sequences, and
+\ccode{0..19} encode \ccode{AC..WY} in amino acid sequences.
+
+\item Both sequence-digitizing functions return \ccode{eslEINVAL} if
+the input sequence contains characters that are not in the
+alphabet. Because input sequences are often provided by a user (not
+the program), this is a common error that the application must check
+for.
+\end{itemize}
+
+\subsection{Concepts and terminology}
+
+A \esldef{symbol} is a 7-bit ASCII input character, representing a
+residue, gap, nonresidue, or degeneracy. A \esldef{code} is the
+digital internal representation of the symbol as an \ccode{unsigned
+ char} in the range $0..127$, suitable for use as an array index. The
+\eslmod{alphabet} module translates input symbols into internal
+digital codes.
+
+We distinguish between an input alphabet, an internal alphabet, and a
+canonical alphabet. The \esldef{input alphabet} consists of all the
+symbols that Easel allows in an input biosequence character
+string. The \esldef{internal alphabet} is the standardized one-letter
+alphabet that Easel deals with. The \esldef{canonical alphabet} is the
+fundamental set of 4 nucleotides or 20 amino acids.
+
+Easel deals with all of the complications of sequence encoding using
+two concepts, equivalency and degeneracy. \esldef{Equivalency}
+defines how the input alphabet maps to the internal
+alphabet. \esldef{Degeneracy} defines how the internal alphabet maps
+to the canonical alphabet.
+
+Equivalent residues are symbols that are accepted in an input sequence
+character string and silently translated into an appropriate internal
+code. Characters in the input alphabet are mapped many-to-one to the
+internal alphabet using an \esldef{input map}. One use of equivalency
+is to map both lower and upper case input to the same internal
+symbol. Another use is to allow several different input characters to
+mean a gap, 'any' symbol, or 'nonresidue' symbol. Another use is to
+silently accept and ``fix'' nonstandard but common input ``errors'',
+such as tolerating the use of X to mean N in nucleic acid sequences.
+
+Degenerate residues are codes in the internal alphabet that are mapped
+one-to-many onto canonical residue codes, using a \esldef{degeneracy
+map}. In addition to mapping the degeneracy codes onto the canonical
+alphabet, the degeneracy mechanism is also used to deal with unusual
+and modified residues. Selenocysteine, for instance, is represented by
+default as a \ccode{U}, but treated as a degenerate code for \ccode{C}
+(cysteine). The rationale for this will be described in more detail
+below.
+
+\subsubsection{The internal alphabet}
+
+Easel's internal alphabet is a string (\ccode{a->sym}) of length
+\ccode{Kp}, which contains:
+
+\begin{itemize}
+ \item the \ccode{K} symbols of the canonical alphabet;
+ \item a standard gap symbol;
+ \item (optionally) any other degenerate, unusual, or modified residue codes;
+ \item a mandatory ``any'' symbol (a completely degenerate residue);
+ \item a mandatory ``not-a-residue'' symbol;
+ \item a mandatory ``missing data'' symbol.
+\end{itemize}
+
+Residues \ccode{0..K-1} must be the canonical alphabet. Residue
+\ccode{K} must be the gap symbol. Residues \ccode{K+1..Kp-4} must be
+the degenerate and modified residue symbols (there can be zero of
+these). Residue \ccode{Kp-3} must be the completely degenerate symbol
+(such as \ccode{X} for protein sequence or \ccode{N} for nucleic acid
+sequence); all alphabets must have such a symbol. Residue \ccode{Kp-2}
+must be the not-a-residue symbol. Residue \ccode{Kp-1} must be the
+missing data symbol. Because the 'any' symbol, 'not-a-residue'
+symbol, and the two kinds of gap symbols are mandatory in any
+alphabet, \ccode{Kp} $\geq$ \ccode {K+4}. Aside from these
+constraints, symbols may occur in any order.
+
+The digital code used for each residue is then the index of a residue
+in this string, \ccode{0..Kp-1}. The only other value that can appear
+in a digitized sequence is \ccode{eslSENTINEL} (127), the sentinel
+byte in positions \ccode{0} and \ccode{L+1} of a digitized sequence of
+length \ccode{L}.
+
+The rationale for the ordering is the following. Most applications
+will define residue scores in vectors and matrices that are smaller
+than the full range of the internal alphabet; for instance, it's
+common to only have \ccode{K} scores for the canonical residues. As
+much as possible, we want array indices to be the same whether we're
+accessing the full internal alphabet or a smaller score vector or
+matrix. So: we expect many applications to have score vectors or
+matrices that only contain the \ccode{K} canonical residues, so the
+canonical residues go first. We expect some applications to treat
+gaps as an extra symbol, and provide \ccode{K+1} position-specific
+scores or a \ccode{K+1} $\times$ \ccode{K+1} score matrix, so the gap
+character is next. We expect a few applications to optimize degeneracy
+scoring by precalculating them in \ccode{Kp-2} vectors or $Kp-2 \times
+Kp-2$ matrices, so the degeneracies go next (the gap character at $K$
+might then go unused in the score vectors and matrices, but that's a
+minor inefficiency). The 'any' symbol should be at a predictable
+position in the degeneracy list, so it's arbitrarily placed at the
+end, in position \ccode{Kp-3}. The most robust applications will also
+handle the not-a-residue symbol (they may see translated stop codons),
+so it's next. Finally, the missing data symbol is expected to always
+require special handling when it occurs, rather than appearing in a
+score vector or matrix, so it's put last.
+
+\subsection{The standard alphabets: DNA, RNA, protein}
+
+The three standard internal alphabets are:
+
+\begin{table}[h]
+\begin{tabular}{llccrr}
+\textbf{Type} & \ccode{sym} & \textbf{equivs} & \textbf{gaps} & \ccode{K} & \ccode{Kp} \\
+\ccode{eslRNA} & \ccode{ACGU-RYMKSWHBVDN*\~} & T=U; X=N & \ccode{-\_.} & 4 & 18 \\
+\ccode{eslDNA} & \ccode{ACGT-RYMKSWHBVDN*\~} & U=T; X=N & \ccode{-\_.} & 4 & 18 \\
+\ccode{eslAMINO} & \ccode{ACDEFGHIKLMNPQRSTVWY-BJZOUX*\~} & & \ccode{-\_.} & 20 & 29 \\
+\end{tabular}
+\end{table}
+
+The \ccode{sym} string contains all the symbols that can be handled
+internally, and all the residues that can be represented when a
+digitized sequence is converted back to text. An application might
+still convert some characters for its own purposes before displaying
+an alphabetic string; for instance, to use different gap symbols for
+insertions versus deletions, or to use upper/lower case conventions to
+represent match/insert positions in a profile HMM alignment.
+
+The standard DNA and RNA alphabets follow published IUBMB
+recommendations (``Nomenclature for incompletely specified bases in
+nucleic acid'' \citep{IUBMB85}), with an addition of X as an
+equivalence for N (acquiescing to the \emph{de facto} BLAST filter
+standard of using X's to mask residues), and equivalencing T to U in
+RNA sequences (and vice versa in DNA).
+
+The one-letter code for amino acids follows section 3AA-21 of the
+IUPAC recommendations \citep{IUPAC84}. The code is augmented by U for
+selenocysteine, as recommended in 1999 by the JCBN/NC-IUBMB Newsletter
+(\url{http://www.chem.qmul.ac.uk/iubmb/newsletter/1999/item3.html}).
+It is also augmented by O for pyrrolysine and J for a
+leucine/isoleucine ambiguity (from a mass spectrometry experiment),
+following usage in the RESID database
+(\url{http://www.ebi.ac.uk/RESID/}).
+
+
+\subsection{Degenerate residues}
+
+The symbols from \ccode{K+1..Kp-4} in the internal alphabet are all
+treated as degenerate residues.
+
+When creating a custom alphabet, each degenerate symbol is initialized
+by calling \ccode{esl\_alphabet\_SetDegeneracy(alphabet, c, syms)} to
+assign degenerate alphabetic symbol \ccode{c} to the alphabetic
+symbols in the string \ccode{syms}. For example,
+\ccode{esl\_alphabet\_SetDegeneracy(a, 'R', \"AG\")} assigns R
+(purine) to mean A or G. For the standard biosequence alphabets, this
+is done automatically to define the proper degeneracy codes.
+
+For amino acid alphabets, the default code is:
+
+\begin{cchunk}
+ esl_alphabet_SetDegeneracy(a, 'B', "ND");
+ esl_alphabet_SetDegeneracy(a, 'J', "IL");
+ esl_alphabet_SetDegeneracy(a, 'Z', "QE");
+\end{cchunk}
+
+For RNA alphabets, the default code is:
+
+\begin{cchunk}
+ esl_alphabet_SetDegeneracy(a, 'R', "AG");
+ esl_alphabet_SetDegeneracy(a, 'Y', "CU");
+ esl_alphabet_SetDegeneracy(a, 'M', "AC");
+ esl_alphabet_SetDegeneracy(a, 'K', "GU");
+ esl_alphabet_SetDegeneracy(a, 'S', "CG");
+ esl_alphabet_SetDegeneracy(a, 'W', "AU");
+ esl_alphabet_SetDegeneracy(a, 'H', "ACU");
+ esl_alphabet_SetDegeneracy(a, 'B', "CGU");
+ esl_alphabet_SetDegeneracy(a, 'V', "ACG");
+ esl_alphabet_SetDegeneracy(a, 'D', "AGU");
+\end{cchunk}
+
+For DNA alphabets, the calls are is the same as for RNA code, but with
+\ccode{T} in place of \ccode{U}.
+
+
+\subsubsection{Implementation: the degeneracy map}
+
+The alphabet's degeneracy map is implemented in an array
+\ccode{a->degen[0..Kp-1][0..K-1]} of 1/0 (TRUE/FALSE) flags.
+\ccode{a->degen[x][y] == TRUE} indicates that the residue set $D(x)$
+for degeneracy code \ccode{x} contains base residue \ccode{y}.
+\ccode{a->ndegen[x]} contains the cardinality $|D(x)|$, how many base
+residues are represented by degeneracy code \ccode{x}.
+
+For the two kinds of gap symbols, the degeneracy map is empty; all
+flags are FALSE and the cardinality is 0.
+
+Because character \ccode{Kp-3} in the internal alphabet is
+automatically assumed to be an ``any'' character (such as 'N' for DNA
+or RNA, 'X' for protein), \ccode{a->degen[Kp-3][i] = 1} for all
+$i=0..K-1$, and \ccode{a->ndegen[Kp-3] = K}.
+
+The storage of the degeneracy map is a little wasteful. We really only
+need rows \ccode{a->degen[K+1..Kp-3]}, but optimizing this would
+create some index translation hassles, and it doesn't seem worth it.
+
+
+\subsection{Equivalent residues}
+
+The concept of equivalent residues allows an input symbol to be mapped
+to a different internal symbol. One use of equivalence is to map both
+lower and upper case input to the same internal representation.
+Another use is to allow several different input characters to mean a
+gap. Another use is to silently accept and ``fix'' nonstandard but
+common input ``errors'', such as the use of T instead of U in RNA
+sequences (or vice versa in DNA), or the use of X instead of N as an
+ambiguity code in nucleic acid sequences.
+
+The call \ccode{esl\_alphabet\_SetEquiv(a, 'U', 'T')}, for example,
+makes an alphabet interpret \ccode{U} as a \ccode{T} (encoding both as
+\ccode{3}, in the case of the standard DNA and RNA alphabets).
+
+All three standard alphabets accept \ccode{\_} or \ccode{.} symbols
+as equivalences for the standard gap symbol \ccode{-}. An application
+can define additional gap characters, such as \ccode{,}, by calling
+\ccode{esl\_alphabet\_SetSynonym(a, ',', '-')} on one of the standard
+alphabets to define additional equivalences (that is, you don't have
+to create a custom alphabet to add new equivalences).
+
+\ccode{esl\_alphabet\_SetCaseInsensitive()} maps both upper case and
+lower case input alphabetic characters map to their equivalent in the
+internal alphabet in a case-insensitive manner. This function works
+only on residues that have already been declared to be part of the
+alphabet, so when defining a custom alphabet, it must be called after
+all individual equivalences have been defined. The standard alphabets
+are always set to be case insensitive.
+
+\subsubsection{Implementation of equivalent residues: the input map}
+
+Internally, an \textbf{input map}, \ccode{a->inmap[0..127]}, specifies
+how an input ASCII 7-bit text symbol is converted to digital
+code. \ccode{a->inmap['T'] = 3} in the standard DNA alphabet, for
+example, and the call \ccode{esl\_alphabet\_SetSynonym(a, 'U', 'T')}
+sets \ccode{a->inmap['U'] = a->inmap['T']}.
+
+The elements in input maps are of type \ccode{unsigned char}. Legal
+values are 0..127 (values that can be cast to the \ccode{unsigned
+char} codes in a digitized sequence) and two additional flags with
+negative values, \ccode{eslILLEGAL\_CHAR} (255) and
+\ccode{eslIGNORED\_CHAR} (254).
+
+\subsection{Unusual or modified residues}
+
+In addition to the canonical 4 or 20 residues and their ambiguity
+codes, there are many unusual and/or modified residues. For instance,
+there are many posttranscriptional or posttranslational modifications
+on residues in RNAs and proteins. Some databases try to capture this
+information in a single-letter alphabetic code, such as the Sprinzl
+transfer RNA database \cite{Sprinzl98}.
+
+Additionally, and perhaps more importantly, proteins are known to
+contain at least two additional genetically encoded amino acids,
+selenocysteine and pyrrolysine. Selenocysteine is represented by a
+\ccode{U} according to the IUPAC standard, and pyrrolysine is
+represented by a \ccode{O} in the RESID database at EBI.
+
+Unusual one-letter residue codes pose a tradeoff issue for sequence
+analysis applications. On the one hand, an application should
+recognize symbols for unusual or modified residues, and be able to
+represent them both internally and in any sequence output. For
+example, no application should read an input selenocysteine residue
+(\ccode{U}) and output it as a cysteine (\ccode{C}) -- this changes
+the original sequence and causes data corruption.\footnote{However, at
+least one the main public protein databases (UniProt) has already
+chosen to replace all selenocysteines with \ccode{C} and all
+pyrrolysines with \ccode{K}, for fear of breaking legacy sequence
+analysis software. So, this data corruption is already a fact of
+life.} On the other hand, most sequence analysis applications would
+not want to take the trouble to define a canonical alphabet larger
+than the usual 4 or 20 residues, and then have to parameterize that
+alphabet, just to be able to handle a few rare residues. (Pyrrolysine,
+for example, has only been found in a handful of proteins in a few
+Archaea.) It is useful to be able to deal with probability parameters
+and scores only for the canonical alphabet. However (on yet another
+hand!) in some cases one \emph{would} want to write a specialized
+application that parameterizes unusual residues as part of its
+canonical alphabet -- for instance, an application for analyzing
+posttranscriptional tRNA modifications, for example.
+
+Therefore, Easel must not force an input selenocysteine or pyrrolysine
+(or any other unusual residue) to be recoded as an arbitrary symbol
+(such as cysteine or lysine). That is, unusual symbols cannot be
+treated as equivalences, but must be allowed to be part of the
+internal alphabet. However, Easel \emph{can} allow unusual symbols to
+be treated as noncanonical, and \emph{score} them as some other
+arbitrary residue, as a reasonable approximation. Thus for most
+purposes, unusual symbols are best handled as a special kind of
+degeneracy, with a one-to-one degeneracy map from the unusual symbol
+to the ``closest'' canonical residue.
+
+Therefore, the default amino acid alphabet accepts selenocysteine
+(\ccode{U}) and pyrrolysine symbols (\ccode{O}) and represents them in
+the internal alphabet, and maps them as ``degeneracies'' onto cysteine
+(\ccode{C}) and lysine (\ccode{K}), respectively.
+
+When that behavior is not suitable, an application can also define any
+custom alphabet it chooses, as described below.
+
+
+\subsection{Creating a custom alphabet}
+
+Figure~\ref{fig:alphabet_example2} shows an example of creating a
+customized 22-letter amino acid alphabet that includes the \ccode{U}
+selenocysteine code and the \ccode{O} pyrrolysine code.
+
+\begin{figure}
+\input{cexcerpts/alphabet_example2}
+\caption{An example of creating a custom alphabet.}
+\label{fig:alphabet_example2}
+\end{figure}
+
+
+
+\subsection{Scoring degenerate residues}
+
+To score a degenerate residue code $x$, Easel provides two strategies.
+One set of functions assigns an average score:
+
+\[
+ S(x) = \frac{\sum_{y \in D(x)} S(y) } { |D(x)| },
+\]
+
+where $D(x)$ is the set of residues $y$ represented by degeneracy code
+$x$ (for example, $D(\mbox{R}) = \{ \mbox{A,G} \}$), $| D(x) |$ is the
+number of residues that the degeneracy code includes, and $S(y)$ is
+the score of a base residue $y$. Because scores $S(y)$ are commonly
+kept as integers, floats, or doubles, depending on the application,
+three functions are provided that differ only in the storage type of
+the scores: \ccode{esl\_abc\_IAvgScore(a,x,sc)},
+\ccode{esl\_abc\_FAvgScore(a,x,sc)}, and
+\ccode{esl\_abc\_DAvgScore(a,x,sc)} calculate and return the average
+score of residue \ccode{x} in alphabet \ccode{a} given a base score
+vector \ccode{sc[0]..sc[K-1]} for integers, floats, and doubles,
+respectively.
+
+A second set of functions assigns an expected score, weighted by an
+expected occurrence probability $p_y$ of the residues $y$ (often the
+random background frequencies):
+
+\[
+ S(x) = \frac{\sum_{y \in D(x)} p_y S(y) } { \sum_{y \in D(x)} p_y },
+\]
+
+These three functions are \ccode{esl\_abc\_IExpectScore(a,x,sc,p)},
+\ccode{esl\_abc\_FExpectScore(a,x,sc,p)}, and
+\ccode{esl\_abc\_DExpectScore(a,x,sc,p)}. For the integer and float
+versions, the probability vector is in floats; for the double version,
+the probability vector is in doubles.
+
+For efficiency reasons, an application might choose to preculate
+scores for all possible degenerate codes it might see. HMMER, for
+example, turns probability vectors of length \ccode{K} into score
+residues of length \ccode{Kp}.
+
+An application might also choose to score residues on-the-fly, using
+score vectors of length \ccode{K}. Each input residue \ccode{x} would
+then have to be tested to see if it is degenerate, before scoring it
+appropriately. \ccode{esl\_abc\_IsBasic(a, x)} returns \ccode{TRUE}
+if \ccode{x} is in the basic set of \ccode{K} residues in alphabet
+\ccode{a}, and \ccode{FALSE} otherwise. Similarly,
+\ccode{esl\_abc\_IsGap(a,x)} tests whether $x$ is a gap, and
+\ccode{esl\_abc\_IsDegenerate(a,x)} tests whether $x$ is a degenerate
+residue.
+
diff --git a/esl_avx.c b/esl_avx.c
new file mode 100644
index 0000000..4b49d45
--- /dev/null
+++ b/esl_avx.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#ifdef HAVE_AVX2
+// This file is just a dummy target to make sure that the functions defined in esl_avx.h get included in the library version of hmmer
+#include <immintrin.h> /* AVX2 */
+#include "esl_avx.h"
+
+#else /* ! HAVE_AVX2 */
+
+/* If we don't have AVX compiled in, provide some nothingness to:
+ * a. prevent Mac OS/X ranlib from bitching about .o file that "has no symbols"
+ * b. prevent compiler from bitching about "empty compilation unit"
+ * c. automatically pass the automated tests.
+ */
+#include "easel.h"
+
+void esl_avx_DoAbsolutelyNothing(void) { return; }
+#if defined eslAVX_TESTDRIVE || eslAVX_EXAMPLE || eslAVX_BENCHMARK
+int main(void) { return 0; }
+#endif
+
+#endif /* HAVE_AVX or not*/
+
+
+
diff --git a/esl_avx.h b/esl_avx.h
new file mode 100644
index 0000000..dc3bdd8
--- /dev/null
+++ b/esl_avx.h
@@ -0,0 +1,107 @@
+
+/* Vectorized utility routines for Intel AVX instructions and
+ * compatible processors.
+ *
+ * This header file, unusually, provides many complete function
+ * implementations; this is so that they can be inlined by the
+ * compiler, for maximum efficiency.
+ *
+ * Contents:
+ * 1. Inlined horizontal functions for 8 and 16-bit quantities
+ * in 256-bit vectors (__m256i)
+ */
+
+#ifndef eslAVX_INCLUDED
+#define eslAVX_INCLUDED
+
+#include "easel.h"
+
+#include <stdio.h>
+#include <xmmintrin.h> /* SSE */
+#include <emmintrin.h> /* SSE2 */
+
+
+#ifdef HAVE_AVX2 // don't include on architectures that can't compile avx2
+/* Function: esl_avx_hmax_epu8()
+ * Synopsis: Return the unsigned max of the 32 elements in epu8 vector.
+ *
+ * Purpose: Returns the maximum value of the 32 elements in
+ * an <epu8> vector.
+ */
+static inline uint8_t
+esl_avx_hmax_epu8(__m256i a)
+{
+
+ __m256i temp1_AVX = _mm256_permute2x128_si256(a, a, 0x01);
+ // Swap the 128-bit halves from a into temp1
+
+ __m256i temp2_AVX = _mm256_max_epu8(temp1_AVX, a); // each 8-bit field in temp2_AVX now has the max of the
+ //corresponding fields in the high and low halves of a
+
+ temp1_AVX = _mm256_shuffle_epi32(temp2_AVX, 0x4e); // Swap the 64-bit halves of each 128-bit half of a
+ temp2_AVX = _mm256_max_epu8(temp1_AVX, temp2_AVX); // Each 64-bit quantity in temp2 now has the max of the corresponding
+ // 8-bit fields from the 64-bit quarters of a
+
+ temp1_AVX = _mm256_shuffle_epi32(temp2_AVX, 0xb1); // Swap the 32-bit halves of each 64-bit quarter of temp2_AVX
+ temp2_AVX = _mm256_max_epu8(temp1_AVX, temp2_AVX); // Each 32-bit quantity in temp2 now has the max of the corresponding
+ // 8 bit fields from the 32-bit eighths of a
+
+ temp1_AVX = _mm256_shufflelo_epi16(temp2_AVX, 0xb1); // bottom 32-bits of temp1_AVX now contain the swapped 16-bit halves
+ // of the low 32 bits of temp2_AVX
+ temp2_AVX = _mm256_max_epu8(temp1_AVX, temp2_AVX); //bottom 16 bits of temp2_AVX now contain the max of the 16-bit fields of a
+
+ uint8_t temp_stash = _mm256_extract_epi8(temp2_AVX, 1);
+ temp1_AVX = _mm256_insert_epi8(temp2_AVX, temp_stash, 0); // low byte of temp1_AVX now has byte 2 of temp2_AVX
+ temp2_AVX = _mm256_max_epu8(temp1_AVX, temp2_AVX); //bottom 16 bits of temp2_AVX now contain the max of the 16-bit fields of Dmaxv_AVX
+ return(_mm256_extract_epi8(temp2_AVX, 0)); // get low byte of temp2_AVX
+}
+
+/* Function: esl_avx_hmax_epi16()
+ * Synopsis: Return the signed max of the 16 elements in epu8 vector.
+ *
+ * Purpose: Returns the maximum value of the 32 elements in
+ * an <epu8> vector.
+ */
+static inline uint16_t
+esl_avx_hmax_epi16(__m256i a)
+{
+
+ __m256i temp1_AVX = _mm256_permute2x128_si256(a, a, 0x01);
+ // Swap the 128-bit halves from a into temp1
+
+ __m256i temp2_AVX = _mm256_max_epi16(temp1_AVX, a); // each 8-bit field in temp2_AVX now has the max of the
+ //corresponding fields in the high and low halves of a
+
+ temp1_AVX = _mm256_shuffle_epi32(temp2_AVX, 0x4e); // Swap the 64-bit halves of each 128-bit half of a
+ temp2_AVX = _mm256_max_epi16(temp1_AVX, temp2_AVX); // Each 64-bit quantity in temp2 now has the max of the corresponding
+ // 8-bit fields from the 64-bit quarters of a
+
+ temp1_AVX = _mm256_shuffle_epi32(temp2_AVX, 0xb1); // Swap the 32-bit halves of each 64-bit quarter of temp2_AVX
+ temp2_AVX = _mm256_max_epi16(temp1_AVX, temp2_AVX); // Each 32-bit quantity in temp2 now has the max of the corresponding
+ // 8 bit fields from the 32-bit eighths of a
+
+ temp1_AVX = _mm256_shufflelo_epi16(temp2_AVX, 0xb1); // bottom 32-bits of temp1_AVX now contain the swapped 16-bit halves
+ // of the low 32 bits of temp2_AVX
+ temp2_AVX = _mm256_max_epi16(temp1_AVX, temp2_AVX); //bottom 16 bits of temp2_AVX now contain the max of the 16-bit fields of a
+
+ return(_mm256_extract_epi16(temp2_AVX, 0)); // get low 16 bits of temp2_AVX
+}
+
+// shifts vector left by num_bytes bytes. Assumes that num_bytes < 16, and will fail horribly if not.
+static inline __m256i esl_avx_leftshift(__m256i vector, int num_bytes){
+ register __m256i temp_mask_AVX = _mm256_permute2x128_si256(vector, vector, _MM_SHUFFLE(0,0,3,0) );
+ return(_mm256_alignr_epi8(vector, temp_mask_AVX,(16-num_bytes)));
+}
+
+#endif
+
+
+
+#endif /*eslAVX_INCLUDED*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_buffer.c b/esl_buffer.c
new file mode 100644
index 0000000..43bf861
--- /dev/null
+++ b/esl_buffer.c
@@ -0,0 +1,3227 @@
+/*::cexcerpt::header_example::begin::*/
+/* An input parsing abstraction.
+ *
+ * Table of contents:
+ * 1. ESL_BUFFER object: opening/closing.
+ * 2. Positioning and anchoring an ESL_BUFFER.
+ * 3. Raw access to the buffer.
+ * 4. Line-based parsing.
+ * 5. Token-based parsing.
+ * 6. Binary (fread-like) parsing.
+ * 7. Private (static) functions.
+ * 8. Benchmark.
+ * 9. Unit tests.
+ * 10. Test driver.
+ * 11. Examples.
+ * 12. Copyright and license.
+ */
+/*::cexcerpt::header_example::end::*/
+
+
+/*::cexcerpt::include_example::begin::*/
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef _POSIX_VERSION
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#endif /* _POSIX_VERSION */
+
+#include "easel.h"
+#include "esl_mem.h"
+#include "esl_buffer.h"
+/*::cexcerpt::include_example::end::*/
+
+
+
+/*::cexcerpt::statics_example::begin::*/
+static int buffer_create (ESL_BUFFER **ret_bf);
+static int buffer_init_file_mmap (ESL_BUFFER *bf, esl_pos_t filesize);
+static int buffer_init_file_slurped(ESL_BUFFER *bf, esl_pos_t filesize);
+static int buffer_init_file_basic (ESL_BUFFER *bf);
+
+static int buffer_refill (ESL_BUFFER *bf, esl_pos_t nmin);
+static int buffer_countline(ESL_BUFFER *bf, esl_pos_t *opt_nc, esl_pos_t *opt_nskip);
+static int buffer_skipsep (ESL_BUFFER *bf, const char *sep);
+static int buffer_newline (ESL_BUFFER *bf);
+static int buffer_counttok (ESL_BUFFER *bf, const char *sep, esl_pos_t *ret_nc);
+/*::cexcerpt::statics_example::end::*/
+
+
+
+/*****************************************************************
+ *# 1. ESL_BUFFER object: opening/closing.
+ *****************************************************************/
+
+/* Function: esl_buffer_Open()
+ * Synopsis: Standard Easel idiom for opening a stream by filename.
+ *
+ * Purpose: Open <filename> for parsing. Return an open
+ * <ESL_BUFFER> for it.
+ *
+ * The standard Easel idiom allows reading from standard
+ * input (pass <filename> as '-'), allows reading gzip'ed
+ * files automatically (any <filename> ending in <.gz> is
+ * opened as a pipe from <gzip -dc>), and allows using an
+ * environment variable to specify a colon-delimited list
+ * of directories in which <filename> may be found. Normal
+ * files are memory mapped (if <mmap()> is available) when
+ * they are large, and slurped into memory if they are
+ * small.
+ *
+ * If <filename> is '-' (a single dash character),
+ * capture the standard input stream rather than
+ * opening a file; return <eslOK>.
+ *
+ * Else, try to find <filename> in a directory <d>,
+ * starting with the current working directory. If
+ * <./filename> is found (note that <filename> may include
+ * a relative path), directory <d> is <.>. Else, if
+ * <envvar> is non-<NULL>, check the environment variable
+ * <envvar> for a colon-delimited list of directories, and
+ * for each directory <d> in that list, try to find
+ * <d/filename>. Use the first <d> that succeeds. If
+ * none succeed, return <eslENOTFOUND>.
+ *
+ * Now open the file. If <filename> ends in <.gz>, 'open'
+ * it by running <gzip -dc d/filename 2>/dev/null>,
+ * capturing the standard output from gunzip decompression
+ * in the <ESL_BUFFER>. Otherwise, open <d/filename> as a
+ * normal file. If its size is not more than
+ * <eslBUFFER_SLURPSIZE> (default 4 MB), it is slurped into
+ * memory; else, if <mmap()> is available, it is memory
+ * mapped; else, it is opened as a read-only binary stream
+ * with <fopen()> in mode <"rb">.
+ *
+ * Args: filename - file to open for reading; or '-' for STDIN
+ * envvar - name of an environment variable in which to
+ * find a colon-delimited list of directories;
+ * or <NULL> if none.
+ * ret_bf - RETURN: new ESL_BUFFER
+ *
+ * Returns: <eslOK> on success; <*ret_bf> is the new <ESL_BUFFER>.
+ *
+ * <eslENOTFOUND> if file isn't found or isn't readable.
+ * <eslFAIL> if gzip -dc fails on a .gz file, probably
+ * because a gzip executable isn't found in PATH.
+ *
+ * On any normal error, <*ret_bf> is still returned,
+ * in an unset state, with a user-directed error message
+ * in <*ret_bf->errmsg>.
+ *
+ * Throws: <eslESYS> on system call failures (such as fread()).
+ * <eslEMEM> on allocation failure.
+ * Now <*ret_bf> is <NULL>.
+ */
+int
+esl_buffer_Open(const char *filename, const char *envvar, ESL_BUFFER **ret_bf)
+{
+ char *path = NULL;
+ int n;
+ int status;
+
+ /* "-" => stdin */
+ if (strcmp(filename, "-") == 0)
+ return esl_buffer_OpenStream(stdin, ret_bf);
+
+ /* else, a file. find its fully qualified path */
+ if (esl_FileExists(filename)) /* look in current working directory */
+ { if ( (status = esl_strdup(filename, -1, &path)) != eslOK) { *ret_bf = NULL; goto ERROR; } }
+ else { /* then search directory list in envvar, if any */
+ status = esl_FileEnvOpen(filename, envvar, NULL, &path);
+ if (status == eslENOTFOUND) { esl_buffer_OpenFile(filename, ret_bf); goto ERROR; }
+ else if (status != eslOK) { *ret_bf = NULL; goto ERROR; }
+ /* yeah, the esl_buffer_OpenFile() looks weird - we know the file's not there! -
+ * but it's a clean way to set our error return status properly,
+ * recording the correct error message in a live ESL_BUFFER's bf->errmsg.
+ * note that esl_FileEnvOpen() correctly handles envvar==NULL,
+ * returning eslENOTFOUND.
+ */
+ }
+
+ n = strlen(path);
+ if (n > 3 && strcmp(filename+n-3, ".gz") == 0) /* if .gz => gzip -dc */
+ { if ( (status = esl_buffer_OpenPipe(path, "gzip -dc %s 2>/dev/null", ret_bf)) != eslOK) goto ERROR; }
+ else
+ { if ( (status = esl_buffer_OpenFile(path, ret_bf)) != eslOK) goto ERROR; }
+
+ free(path);
+ return eslOK;
+
+ ERROR:
+ if (path) free(path);
+ return status;
+}
+
+/* Function: esl_buffer_OpenFile()
+ * Synopsis: Open a file.
+ *
+ * Purpose: Open <filename> for reading. Return an open <ESL_BUFFER> in
+ * <*ret_bf>.
+ *
+ * <filename> may be a relative path such as <subdir/foo>
+ * or a full path such as </my/dir/foo>.
+ *
+ * On a POSIX-compliant system, large files are memory
+ * mapped, and small files are just slurped into memory.
+ *
+ * On non-POSIX systems, the file is opened as a stream.
+ * On a short initial read (if the file size is smaller than
+ * the buffer page size), the file is considered to be
+ * completely slurped.
+ *
+ * Args: filename - name of (or path to) file to open
+ * *ret_bf - RETURN: new ESL_BUFFER
+ *
+ * Returns: <eslOK> on success; <*ret_bf> is new <ESL_BUFFER>.
+ *
+ * <eslENOTFOUND> if <filename> isn't found or isn't readable.
+ *
+ * On normal errors, a new <*ret_bf> is still returned, in
+ * an unset state, with a user-directed error message in
+ * <*ret_bf->errmsg>.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_buffer_OpenFile(const char *filename, ESL_BUFFER **ret_bf)
+{
+ ESL_BUFFER *bf = NULL;
+#ifdef _POSIX_VERSION
+ struct stat fileinfo;
+#endif
+ esl_pos_t filesize = -1;
+ int status;
+
+ if ((status = buffer_create(&bf)) != eslOK) goto ERROR;
+
+ if ((bf->fp = fopen(filename, "rb")) == NULL)
+ ESL_XFAIL(eslENOTFOUND, bf->errmsg, "couldn't open %s for reading", filename);
+
+ if ((status = esl_strdup(filename, -1, &(bf->filename))) != eslOK) goto ERROR;
+
+ /* Try to use POSIX fstat() to get file size and optimal read size.
+ * Use filesize to decide whether to slurp, mmap, or read normally.
+ * If we don't have fstat(), we'll just read normally, and pagesize
+ * will be the Easel default 4096 (set in buffer_create().)
+ */
+#ifdef _POSIX_VERSION
+ if (fstat(fileno(bf->fp), &fileinfo) == -1) ESL_XEXCEPTION(eslESYS, "fstat() failed");
+ filesize = fileinfo.st_size;
+ bf->pagesize = fileinfo.st_blksize;
+ if (bf->pagesize < 512) bf->pagesize = 512; /* I feel paranoid about st_blksize range not being guaranteed to be sensible */
+ if (bf->pagesize > 4194304) bf->pagesize = 4194304;
+#endif
+
+ if (filesize != -1 && filesize <= eslBUFFER_SLURPSIZE)
+ { if ((status = buffer_init_file_slurped(bf, filesize)) != eslOK) goto ERROR; }
+#ifdef _POSIX_VERSION
+ else if (filesize > eslBUFFER_SLURPSIZE)
+ { if ((status = buffer_init_file_mmap(bf, filesize)) != eslOK) goto ERROR; }
+#endif
+ else
+ { if ((status = buffer_init_file_basic(bf)) != eslOK) goto ERROR; }
+
+ *ret_bf = bf;
+ return status;
+
+ ERROR:
+ if (status != eslENOTFOUND) { esl_buffer_Close(bf); bf = NULL; }
+ if (bf) {
+ if (bf->fp) { fclose(bf->fp); bf->fp = NULL; }
+ if (bf->filename) { free(bf->filename); bf->filename = NULL; }
+ bf->pagesize = eslBUFFER_PAGESIZE;
+ }
+ *ret_bf = bf;
+ return status;
+}
+
+
+/* Function: esl_buffer_OpenPipe()
+ * Synopsis: Open a file through a command's stdout pipe (e.g. gunzip).
+ *
+ * Purpose: Run the command <cmdfmt> on <filename> and capture its <stdout>
+ * stream for parsing. Return the open <ESL_BUFFER> in
+ * <*ret_bf>.
+ *
+ * <cmdfmt> has a restricted format; it is a <printf()>-style
+ * format string with a single <%s>, where <filename> is to
+ * be substituted. An example <cmdfmt> is "gzip -dc %s
+ * 2>/dev/null".
+ *
+ * <filename> is checked for existence and read permission
+ * before a command line is constructed.
+
+ * <filename> may be <NULL>. In this case, <cmdfmt> is
+ * assumed to be be the complete command, and (obviously)
+ * the diagnostic check for <filename>
+ * existence/readability is skipped. This gives you some
+ * ability to skip the restricted single-argument format of
+ * <cmdfmt>. If you need to do something fancier with a
+ * pipe, you can always open and manage it yourself and use
+ * <esl_buffer_OpenStream()>.
+ *
+ * <popen()> executes the command under </bin/sh>.
+ *
+ * The <stderr> stream of the command should almost
+ * certainly be redirected (else it will appear on output
+ * of your program). In general it should be discarded
+ * to </dev/null>. One of the only signs of a command
+ * failure is that the command produces a "short read", of
+ * less than <bf->pagesize> (and often 0, on a complete
+ * failure, if <stderr> has been discarded). If <stderr>
+ * is longer than the buffer's <pagesize>, we may not
+ * accurately detect error conditions. If you must capture
+ * <stderr> (for example with a <cmdfmt> like
+ * "gzip -dc %s 2>&1") be aware that the parser may
+ * see that output as "successful" execution, if it's long
+ * enough.
+ *
+ * The reason to pass <cmdfmt> and <filename> separately is
+ * to enable better error diagnostics. <popen()> itself
+ * tends to "succeed" whether the command or the file exist
+ * or not. By having <filename>, we can check for its
+ * existence/readability first.
+ *
+ * The reason that error checking <popen()> isn't entirely
+ * straightforward is that we don't see the exit status of
+ * the command until we <pclose()>. We can only <pclose()>
+ * when we're done loading data from the file, and that
+ * only happens here on a short initial read. If we do get
+ * a short read, we <pclose()>, get and check the command's
+ * exit status, and return the <ESL_BUFFER> in an
+ * <eslBUFFER_ALLFILE> state with <bf->cmdline> set.
+ *
+ * Args: filename - file name (or path) to plug into <cmdfmt>; or NULL
+ * if <cmdfmt> is complete command already
+ * cmdfmt - command to execute (with /bin/sh) and capture
+ * stdout from.
+ * *ret_bf - RETURN: new ESL_BUFFER
+ *
+ * Returns: <eslOK> on success, and <*ret_bf> is the new <ESL_BUFFER>.
+ *
+ * <eslENOTFOUND> if <filename> isn't found or isn't readable.
+ *
+ * <eslFAIL> if the constructed command fails - which
+ * usually means that the program isn't found or isn't
+ * executable, or that the command returned nonzero
+ * (quickly, i.e. with zero or little output and a 'short
+ * read').
+ *
+ * On any normal error, the <*ret_bf> is returned (in an
+ * <eslBUFFER_UNSET> state) and <bf->errmsg> contains a
+ * user-directed error message.
+ *
+ * Throws: <eslESYS> on <*sprintf()> or <fread()> failure.
+ * <eslEMEM> on allocation failure.
+ *
+ * On any exception, <*ret_bf> is NULL.
+ */
+int
+esl_buffer_OpenPipe(const char *filename, const char *cmdfmt, ESL_BUFFER **ret_bf)
+{
+ ESL_BUFFER *bf = NULL;
+ char *cmd = NULL;
+ int status;
+
+ if ((status = buffer_create(&bf)) != eslOK) goto ERROR;
+
+ if (filename && ! esl_FileExists(filename))
+ ESL_XFAIL(eslENOTFOUND, bf->errmsg, "couldn't read file %s", filename);
+
+ if (filename) { if ((status = esl_sprintf(&cmd, cmdfmt, filename)) != eslOK) goto ERROR; }
+ else { if ((status = esl_strdup(cmdfmt, -1, &cmd)) != eslOK) goto ERROR; }
+
+ if ((bf->fp = popen(cmd, "r")) == NULL)
+ ESL_XFAIL(eslENOTFOUND, bf->errmsg, "couldn't popen() the command: %s\n", cmd);
+
+ if ( (status = esl_strdup(cmd, -1, &(bf->cmdline))) != eslOK) goto ERROR;
+ if (filename && (status = esl_strdup(filename, -1, &(bf->filename))) != eslOK) goto ERROR;
+
+ ESL_ALLOC(bf->mem, sizeof(char) * bf->pagesize);
+ bf->balloc = bf->pagesize;
+
+ bf->n = fread(bf->mem, sizeof(char), bf->pagesize, bf->fp);
+ /* Now check for various errors on a short read. A short read can mean:
+ * - a small file; success, and we have the whole file in one page
+ * - popen() "succeeded" but the command failed
+ * - an fread() failure
+ * Sort it out. The trick here is that we don't get the exit status
+ * of <cmd> until we pclose(). So (assuming it isn't fread() itself
+ * that failed) we take advantage of the fact that we can set the
+ * ESL_BUFFER to a eslBUFFER_ALLFILE state on a short initial read;
+ * pclose() and check command exit status.
+ * This pretty much relies on what <stderr> from <cmd> looks like;
+ * it needs to either be redirected, or short enough to be a short read.
+ */
+ if (bf->n < bf->pagesize)
+ {
+ /* Delayed exception throwing. If popen() failed, ferror() may be set too; evaluate what happened to popen() first. */
+ status = (ferror(bf->fp) ? eslESYS : eslOK);
+ if (pclose(bf->fp) != 0) {
+ bf->fp = NULL; /* error block is going to try to pclose() too */
+ ESL_XFAIL(eslFAIL, bf->errmsg, "pipe command '%s' did not succeed", cmd);
+ }
+ /* now deal with an fread() error. */
+ if (status != eslOK) ESL_XEXCEPTION(eslESYS, "fread() failed");
+ bf->fp = NULL;
+ bf->balloc = 0;
+ bf->mode_is = eslBUFFER_ALLFILE;
+ }
+ else
+ bf->mode_is = eslBUFFER_CMDPIPE;
+
+ free(cmd);
+ *ret_bf = bf;
+ return eslOK;
+
+ ERROR:
+ if (status != eslENOTFOUND && status != eslFAIL) { esl_buffer_Close(bf); bf = NULL; }
+ if (bf) { /* restore state to UNSET; w/ error message in errmsg */
+ if (bf->mem) { free(bf->mem); bf->mem = NULL; }
+ if (bf->fp) { pclose(bf->fp); bf->fp = NULL; }
+ if (bf->filename) { free(bf->filename); bf->filename = NULL; }
+ if (bf->cmdline) { free(bf->cmdline); bf->cmdline = NULL; }
+ bf->n = 0;
+ bf->balloc = 0;
+ }
+ if (cmd) free(cmd);
+ *ret_bf = bf;
+ return status;
+
+}
+
+/* Function: esl_buffer_OpenMem()
+ * Synopsis: "Open" an existing string for parsing.
+ *
+ * Purpose: Given a buffer or string <p> of length <n>, turn it into
+ * an <ESL_BUFFER>. Return the new buffer in <*ret_bf>.
+ *
+ * The memory for <p> is still managed by the caller.
+ * Caller should free it, if necessary, only after the
+ * <ESL_BUFFER> has been closed.
+ *
+ * As a special case, if <n> is -1, <p> is assumed to be a
+ * \verb+\0+-terminated string and its length is calculated with
+ * <strlen()>.
+ *
+ * Args: p - ptr to buffer or string
+ * n - length of buffer/string <p>, in bytes
+ * ret_bf - RETURN: new ESL_BUFFER
+ *
+ * Returns: <eslOK> on success, and <*ret_bf> points to new buffer.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * On any exception, <*ret_bf> is <NULL>.
+ */
+int
+esl_buffer_OpenMem(const char *p, esl_pos_t n, ESL_BUFFER **ret_bf)
+{
+ ESL_BUFFER *bf = NULL;
+ int status;
+
+ if ((status = buffer_create(&bf)) != eslOK) goto ERROR;
+
+ bf->mem = (char *) p; /* force discard of const qualifier; this is ok; mem won't be altered in eslBUFFER_STRING mode */
+ bf->n = (n == -1) ? strlen(p) : n;
+ bf->mode_is = eslBUFFER_STRING;
+
+ *ret_bf = bf;
+ return eslOK;
+
+ ERROR:
+ if (bf) { /* on error, restore to UNSET state */
+ bf->mem = NULL;
+ bf->n = 0;
+ bf->mode_is = eslBUFFER_UNSET;
+ }
+ *ret_bf = bf;
+ return status;
+}
+
+
+/* Function: esl_buffer_OpenStream()
+ * Synopsis: "Open" an existing stream for parsing.
+ *
+ * Purpose: Given an open stream <fp> for reading, create an
+ * <ESL_BUFFER> around it.
+ *
+ * <fp> is often <stdin>, for example.
+ *
+ * The caller remains responsible for closing <fp>, if it
+ * opened it.
+ *
+ * Args: fp - stream to associate with new ESL_BUFFER
+ * *ret_bf - RETURN: new ESL_BUFFER.
+ *
+ * Returns: <eslOK> on success, and <*ret_bf> points to a new <ESL_BUFFER>.
+ *
+ * Throws: <eslEINVAL>: <fp> is NULL, in error state, or already at eof before any reading occurs.
+ * <eslESYS> : fread() failed
+ * <eslEMEM> : an allocation failed
+ */
+int
+esl_buffer_OpenStream(FILE *fp, ESL_BUFFER **ret_bf)
+{
+ ESL_BUFFER *bf = NULL;
+ int status;
+
+ if ((status = buffer_create(&bf)) != eslOK) goto ERROR;
+ bf->mode_is = eslBUFFER_STREAM;
+
+ if (fp == NULL || ferror(fp) || feof(fp)) ESL_XEXCEPTION(eslEINVAL, "invalid stream");
+ bf->fp = fp; /* a copy of <fp>; caller is still responsible for it */
+
+ ESL_ALLOC(bf->mem, sizeof(char) * bf->pagesize);
+ bf->balloc = bf->pagesize;
+
+ bf->n = fread(bf->mem, sizeof(char), bf->pagesize, bf->fp);
+ if (bf->n < bf->pagesize && ferror(bf->fp))
+ ESL_XEXCEPTION(eslESYS, "failed to read first chunk of stream");
+
+ *ret_bf = bf;
+ return eslOK;
+
+ ERROR:
+ esl_buffer_Close(bf);
+ *ret_bf = NULL;
+ return status;
+}
+
+/* Function: esl_buffer_Close()
+ * Synopsis: Close an input buffer.
+ * Incept: SRE, Mon Feb 14 09:09:04 2011 [Janelia]
+ *
+ * Purpose: Close the input buffer <bf>, freeing all resources that it
+ * was responsible for.
+ *
+ * Args: bf - the input buffer
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> on a system call failure such as <munmap()>, <pclose()>, or <fclose()>.
+ *
+ * Note: error handling here departs from usual idiom, because we try to tolerate errors
+ * and continue free'ing resources; only at the end do we return a failure code, if
+ * something went awry.
+ */
+int
+esl_buffer_Close(ESL_BUFFER *bf)
+{
+ if (bf)
+ {
+ if (bf->mem)
+ {
+ switch (bf->mode_is) {
+ case eslBUFFER_MMAP: if (munmap(bf->mem, bf->n) == -1) ESL_EXCEPTION(eslESYS, "munmap() failed"); break;
+ case eslBUFFER_STRING: break; /* caller provided and remains responsible for an input memory buffer */
+ default: free(bf->mem);
+ }
+ }
+
+ if (bf->fp)
+ {
+ switch (bf->mode_is) {
+ case eslBUFFER_CMDPIPE: if (pclose(bf->fp) == -1) ESL_EXCEPTION(eslESYS, "pclose() failed"); break;
+ case eslBUFFER_STREAM: break; /* caller provided and remains responsible for an open stream */
+ default: if (fclose(bf->fp) == -1) ESL_EXCEPTION(eslESYS, "fclose() failed"); break;
+ }
+ }
+
+ if (bf->filename) free(bf->filename);
+ if (bf->cmdline) free(bf->cmdline);
+ free(bf);
+ }
+ return eslOK;
+}
+/*--------------- end, ESL_BUFFER open/close --------------------*/
+
+
+
+
+
+/*****************************************************************
+ *# 2. Positioning and anchoring an ESL_BUFFER
+ *****************************************************************/
+
+/* Function: esl_buffer_GetOffset()
+ * Synopsis: Get the current position of parser in input buffer.
+ *
+ * Purpose: Returns the current offset position of the parser
+ * in the input buffer: <bf->baseoffset + bf->pos>.
+ */
+esl_pos_t
+esl_buffer_GetOffset(ESL_BUFFER *bf)
+{
+ return bf->baseoffset + bf->pos;
+}
+
+/* Function: esl_buffer_SetOffset()
+ * Synopsis: Reposition the input buffer to a new place.
+ * Incept: SRE, Mon Jan 31 13:14:09 2011 [Janelia]
+ *
+ * Purpose: Set the buffer's internal state (<bf->pos>) to position
+ * <offset> in the input. Load new data into the buffer if
+ * necessary.
+ *
+ * In modes where <bf->mem> contains the whole input
+ * (ALLFILE, MMAP, STRING), this always works.
+ *
+ * In modes where we're reading a
+ * nonrewindable/nonpositionable stream (STREAM, CMDPIPE),
+ * <offset> may be at or ahead of the current position, but
+ * rewinding to an offset behind the current position only
+ * works if <offset> is within the current buffer
+ * window. If the caller knows it wants to return to some
+ * <offset> later, it should set an anchor to make sure it
+ * stays in the buffer. New data may need to be read into
+ * <bf->mem> to assure <pagesize> bytes are available. If
+ * an anchor is set, this may require reoffset and/or
+ * reallocation of <bf->mem>.
+ *
+ * FILE mode is handled as above, but additionally, if no
+ * anchor is set and <offset> is not in the current buffer,
+ * <fseeko()> is used to reposition in the open file. If
+ * <fseeko()> is unavailable (non-POSIX compliant systems),
+ * FILE mode is handled like other streams, with limited
+ * rewind ability.
+ *
+ * Args: bf - input buffer being manipulated
+ * offset - new position in the input
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <offset> is invalid, either because it
+ * would require rewinding the (nonrewindable) stream,
+ * or because it's beyond the end.
+ * <eslESYS> if a system call fails, such as fread().
+ * <eslEMEM> on allocation failure.
+ * <eslEINCONCEIVABLE> if <bf> internal state is corrupt.
+ */
+int
+esl_buffer_SetOffset(ESL_BUFFER *bf, esl_pos_t offset)
+{
+ int status;
+
+ /* Case 1. We have the entire file in bf->mem (or an mmap of it);
+ * Then this is trivial; we just set bf->pos.
+ */
+ if (bf->mode_is == eslBUFFER_ALLFILE ||
+ bf->mode_is == eslBUFFER_MMAP ||
+ bf->mode_is == eslBUFFER_STRING)
+ {
+ bf->baseoffset = 0; /* (redundant: just to assure you that state is correctly set) */
+ bf->pos = offset;
+ }
+
+ /* Case 2. We have an open stream.
+ * Then:
+ * - if offset is behind us, and in our current buffer window,
+ * rewind is always possible and trivial: set bf->pos; or
+ * - if we're a FILE, and we're on a POSIX system with fseeko(),
+ * and there's no anchor set -- then we can fseeko() to the
+ * desired offset (no matter where it is) and
+ * reinitialize the buffer; or
+ * - otherwise rewinding a stream is not possible, generating
+ * an <eslEINVAL> error; or
+ * - finally, the remaining possibility is that the offset is
+ * ahead of (or at) the current parser position; fread()
+ * (respecting any set anchor) until <offset> is in the
+ * current buffer window, put bf->pos on it, and call
+ * buffer_refill() to be sure that we either have at least
+ * <bf->pagesize> bytes to parse (inclusive of current pos)
+ * or the stream reaches EOF.
+ */
+ else if (bf->mode_is == eslBUFFER_STREAM ||
+ bf->mode_is == eslBUFFER_CMDPIPE ||
+ bf->mode_is == eslBUFFER_FILE)
+ {
+ if (offset >= bf->baseoffset && offset < bf->baseoffset + bf->pos) /* offset is in our current window and behind our current pos; rewind is trivial */
+ {
+ bf->pos = offset-bf->baseoffset;
+ }
+
+#ifdef _POSIX_VERSION
+ else if (bf->mode_is == eslBUFFER_FILE && bf->anchor == -1)
+ { /* a posix-compliant system can always fseeko() on a file */
+ if (fseeko(bf->fp, offset, SEEK_SET) != 0) ESL_EXCEPTION(eslEINVAL, "fseeko() failed, probably bad offset");
+ bf->baseoffset = offset;
+ bf->n = 0;
+ bf->pos = 0;
+ status = buffer_refill(bf, 0);
+ if (status == eslEOF) ESL_EXCEPTION(eslEINVAL, "requested offset is beyond end of file");
+ else if (status != eslOK) return status;
+ }
+#endif /*_POSIX_VERSION*/
+
+ else if (offset < bf->baseoffset) /* we've already streamed past the requested offset. */
+ ESL_EXCEPTION(eslEINVAL, "can't rewind stream past base offset");
+
+ else /* offset is ahead of pos (or on it); fast forward, put bf->pos on it, reloading bf->mem as needed, respecting any anchors */
+ {
+ while (offset >= bf->baseoffset + bf->n)
+ {
+ bf->pos = bf->n;
+ status = buffer_refill(bf, 0);
+ if (status == eslEOF) ESL_EXCEPTION(eslEINVAL, "requested offset is beyond end of stream");
+ else if (status != eslOK) return status;
+ }
+ bf->pos = offset - bf->baseoffset;
+ status = buffer_refill(bf, 0);
+ if (status != eslEOF && status != eslOK) return status;
+ }
+ }
+
+ else ESL_EXCEPTION(eslEINCONCEIVABLE, "attempting to manipulate an uninitialized buffer");
+
+ return eslOK;
+}
+
+
+
+/* Function: esl_buffer_SetAnchor()
+ * Synopsis: Sets an anchor in an input stream.
+ *
+ * Purpose: Set an anchor at byte <offset> (in input coords) in
+ * input <bf>: which means, keep everything from this byte
+ * on in buffer memory, until anchor is raised.
+ *
+ * The presence of an anchor affects new reads from <fp>;
+ * <mem[r..n-1]> are protected from overwrite, and may be
+ * moved to <mem[0..n-r-1]> as new data is read from the
+ * stream. Anchors are only needed for input streams that
+ * we read chunkwise. If entire input is already in <bf>,
+ * setting an anchor is a no-op.
+ *
+ * In general, the caller should remember what anchor(s) it
+ * sets, so it can raise them later with
+ * <esl_buffer_RaiseAnchor()>.
+ *
+ * Byte <offset> must be in the current buffer window. If
+ * not, an <eslEINVAL> exception is thrown.
+ *
+ * Only one anchor is active at a time. If an anchor is
+ * already set for <bf>, the most upstream one is used.
+ *
+ * Args: bf - input buffer
+ * offset - absolute position in input, <0..inputlen-1>
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <offset> is not in current buffer window.
+ */
+int
+esl_buffer_SetAnchor(ESL_BUFFER *bf, esl_pos_t offset)
+{
+ if (! bf->fp) return eslOK; /* without an open stream, no-op */
+ if (offset < bf->baseoffset || offset > bf->baseoffset + bf->n)
+ ESL_EXCEPTION(eslEINVAL, "can't set an anchor outside current buffer");
+
+ if (bf->anchor == -1 || offset-bf->baseoffset < bf->anchor)
+ { /* setting a new anchor */
+ bf->anchor = offset-bf->baseoffset;
+ bf->nanchor = 1;
+ }
+ else if (offset-bf->baseoffset == bf->anchor)
+ { /* reinforcing an anchor */
+ bf->nanchor++;
+ }
+
+ return eslOK;
+}
+
+/* Function: esl_buffer_SetStableAnchor()
+ * Synopsis: Set a stable anchor.
+ *
+ * Purpose: Same as <esl_buffer_SetAnchor()>, except the anchor is
+ * such that all pointers returned by <_Get*()> functions
+ * (i.e. as opposed to just the last <_Get*> function)
+ * will remain valid at least until the anchor is raised.
+ *
+ * The main use of this is when the caller wants to get
+ * multiple lines or tokens in the input before parsing
+ * them.
+ *
+ * A stable anchor prevents buffer refills/reloads from
+ * moving the internal memory around while the anchor is
+ * in place.
+ *
+ * Args: bf - input buffer
+ * offset - absolute position in input, <0..inputlen-1>
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <offset> is not in current buffer window.
+ *
+ * Notes: We make a special call for stable anchors, as opposed
+ * to most anchors, because the <memmove()> call here
+ * to rebaseline the buffer's <mem> is expensive.
+ */
+int
+esl_buffer_SetStableAnchor(ESL_BUFFER *bf, esl_pos_t offset)
+{
+ esl_pos_t ndel;
+ int status;
+
+ if (! bf->fp) return eslOK; /* without an open stream, no-op: everything is available */
+
+ if ( (status = esl_buffer_SetAnchor(bf, offset)) != eslOK) return status;
+
+ ndel = bf->anchor;
+ bf->anchor = 0;
+ bf->n -= ndel;
+ bf->pos -= ndel;
+ if (bf->n) memmove(bf->mem, bf->mem+ndel, bf->n);
+ bf->baseoffset += ndel;
+ return eslOK;
+}
+
+
+/* Function: esl_buffer_RaiseAnchor()
+ * Synopsis: Raise an anchor.
+ *
+ * Purpose: Declare that an anchor previously set at <offset>
+ * in buffer <bf> may be raised.
+ *
+ * <offset> is in absolute input coordinates (<0..len-1> for
+ * an input of length <len>). Because it's supposed to be
+ * anchored, this position ought to be in the current
+ * buffer window. If an anchor is in effect in <bf>,
+ * <offset> should be at or distal to that anchor.
+ *
+ * Args: bf - input buffer
+ * offset - absolute position in input, <0..len-1>
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <offset> is outside current buffer window,
+ * or if it is proximal to the active anchor in <bf>.
+ */
+int
+esl_buffer_RaiseAnchor(ESL_BUFFER *bf, esl_pos_t offset)
+{
+ if (offset < bf->baseoffset || offset > bf->baseoffset + bf->n)
+ ESL_EXCEPTION(eslEINVAL, "anchor is outside current buffer window? can't happen.");
+ if (bf->anchor > offset - bf->baseoffset)
+ ESL_EXCEPTION(eslEINVAL, "anchor is proximal to current active anchor");
+
+ if (bf->anchor == offset - bf->baseoffset) {
+ bf->nanchor--;
+ if (bf->nanchor == 0) bf->anchor = -1;
+ }
+ return eslOK;
+}
+/*--------------- end, ESL_BUFFER manipulation ------------------*/
+
+
+
+
+/*****************************************************************
+ *# 3. Raw access to the buffer
+ *****************************************************************/
+
+/* Function: esl_buffer_Get()
+ * Synopsis: Get a pointer into the current buffer window.
+ * Incept: SRE, Mon Jan 31 20:45:22 2011 [Casa de Gatos]
+ *
+ * Purpose: Given a buffer <bf>, return a pointer to the current
+ * parsing position in <*ret_p>, and the number of valid
+ * bytes from that position in <*ret_n>.
+ *
+ * If buffer is at EOF (no valid bytes remain), returns
+ * <eslEOF> with <NULL> in <*ret_p> and 0 in <*ret_n>.
+ *
+ * The buffer's parsing position <bf->pos> is NOT
+ * changed. Another <Get()> call will return exactly
+ * the same <p> and <n>. Each <Get()> call is generally
+ * followed by a <Set()> call. It's the <Set()> call
+ * that moves <bf->pos> and refills the buffer.
+ *
+ * Assumes that the buffer <bf> is correctly loaded,
+ * with either at least <pagesize> bytes after the
+ * parser position, or near/at EOF.
+ *
+ * Args: bf - buffer to get ptr from
+ * ret_p - RETURN: pointer to current parser position, or NULL on EOF
+ * ret_n - RETURN: number of valid bytes at *ret_p, or 0 on EOF
+ *
+ * Returns: <eslOK> on success;
+ * <eslEOF> if no valid bytes remain in the input, or if
+ * <*ret_n> is less than <nrequest>.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslESYS> if fread() fails mysteriously.
+ * <eslEINCONCEIVABLE> if internal state of <bf> is corrupt.
+ */
+int
+esl_buffer_Get(ESL_BUFFER *bf, char **ret_p, esl_pos_t *ret_n)
+{
+ *ret_p = (bf->pos < bf->n ? bf->mem + bf->pos : NULL);
+ *ret_n = (bf->pos < bf->n ? bf->n - bf->pos : 0);
+ return (bf->pos < bf->n ? eslOK : eslEOF);
+}
+
+/* Function: esl_buffer_Set()
+ * Synopsis: Set position and correct state of the <ESL_BUFFER>.
+ * Incept: SRE, Sun Jan 2 11:56:00 2011 [Zaragoza]
+ *
+ * Purpose: Reset the state of buffer <bf>: we were recently
+ * given a pointer <p> by an <esl_buffer_Get()> call
+ * and we parsed <nused> bytes starting at <p[0]>.
+ *
+ * <bf->pos> is set to point at <p+nused>, and we
+ * reload the buffer (if necessary) to try to have at
+ * least <bf->pagesize> bytes of input following that
+ * position.
+ *
+ * One use is in raw parsing, where we stop parsing
+ * somewhere in the buffer:
+ * \begin{cchunk}
+ * esl_buffer_Get(bf, &p, &n);
+ * (do some stuff on p[0..n-1], using up <nused> bytes)
+ * esl_buffer_Set(bf, p, nused);
+ * \end{cchunk}
+ * This includes the case of nused=n, where we parse the
+ * whole buffer that Get() gave us, and the Set() call may
+ * be needed to load new input data before the next Get().
+ *
+ * Another use is an idiom for peeking at a token, line, or
+ * a number of bytes without moving the parser position:
+ * \begin{cchunk}
+ * esl_buffer_GetLine(bf, &p, &n);
+ * (do we like what we see in p[0..n-1]? no? then put it back)
+ * esl_buffer_Set(bf, p, 0);
+ * \end{cchunk}
+ *
+ * Because it is responsible for loading new input as
+ * needed, Set() may reoffset and reallocate <mem>. If the
+ * caller wants an anchor respected, it must make sure that
+ * anchor is still in effect; i.e., a caller that is
+ * restoring state to an <ESL_BUFFER> should call Set()
+ * BEFORE calling RaiseAnchor().
+ *
+ * As a special case, if <p> is NULL, then <nused> is
+ * ignored, <bf->pos> is left whereever it was, and the
+ * only thing the <Set()> attempts to do is to fulfill the
+ * pagesize guarantee from the current position. If a
+ * <NULL> <p> has been returned by a Get*() call because we
+ * reached EOF, for example in some parsing loop that the
+ * EOF has broken us out of, it is safe to call
+ * <esl_buffer_Set(bf, NULL, 0)>: this is a no-op on a
+ * buffer that is at EOF.
+ *
+ * Args: bf - buffer to set
+ * p - pointer that previous Get() gave us
+ * nused - number of bytes we used, starting at p[0]
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslESYS> if fread() fails mysteriously.
+ * <eslEINCONCEIVABLE> if internal state of <bf> is corrupt.
+ */
+int
+esl_buffer_Set(ESL_BUFFER *bf, char *p, esl_pos_t nused)
+{
+ int status;
+ if (p) bf->pos = (p - bf->mem) + nused;
+ status = buffer_refill(bf, 0);
+ if (status == eslOK || status == eslEOF) return eslOK;
+ else return status;
+}
+/*----------------- end, lowest level access --------------------*/
+
+
+
+
+/*****************************************************************
+ *# 4. Line-based parsing
+ *****************************************************************/
+
+/* Function: esl_buffer_GetLine()
+ * Synopsis: Get ptr to next line in buffer.
+ *
+ * Purpose: Get a pointer <*opt_p> to the next line in buffer <bf>,
+ * and the length of the line in <*opt_n> (in bytes, and
+ * exclusive of newline bytes). Advance buffer position
+ * past (one) newline, putting it on the next valid data
+ * byte. Thus <p[0..n-1]> is one data line. It is not
+ * NUL-terminated.
+ *
+ * <bf>'s buffer may be re(al)located as needed, to get
+ * the whole line into the current window.
+ *
+ * Because the caller only gets a pointer into <bf>'s
+ * internal state, no other <esl_buffer> functions
+ * should be called until the caller is done with <p>.
+ *
+ * To peek at next line, use Set to restore <bf>'s state:
+ * \begin{cchunk}
+ * esl_buffer_GetLine(bf, &p, &n);
+ * esl_buffer_Set(bf, p, 0);
+ * \end{cchunk}
+ *
+ * Args: bf - buffer to get line from
+ * *opt_p - optRETURN: pointer to next line
+ * *opt_n - optRETURN: line length, exclusive of newline.
+ *
+ * Returns: <eslOK> on success. <*opt_p> is a valid pointer into <bf>'s buffer,
+ * and <*opt_n> is >=0. (0 would be an empty line.)
+ *
+ * <eslEOF> if there's no line (even blank).
+ * On EOF, <*opt_p> is NULL and <*opt_n> is 0.
+ *
+ * Throws: <eslEMEM> if allocation fails.
+ * <eslESYS> if a system call such as fread() fails unexpectedly
+ * <eslEINCONCEIVABLE> if <bf> internal state is corrupt.
+ */
+int
+esl_buffer_GetLine(ESL_BUFFER *bf, char **opt_p, esl_pos_t *opt_n)
+{
+ int anch_set = FALSE;
+ esl_pos_t nc, nskip;
+ esl_pos_t anch;
+ int status;
+
+ /* The next line starts at offset <baseoffset + pos> */
+ anch = bf->baseoffset + bf->pos;
+ status = esl_buffer_SetAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; } /* we know bf->pos is in current window */
+ else if (status != eslOK) { goto ERROR; }
+ anch_set = TRUE;
+
+ if ( (status = buffer_countline(bf, &nc, &nskip)) != eslOK) goto ERROR; /* includes normal EOF. */
+
+ status = buffer_refill(bf, nskip);
+ if (status != eslEOF && status != eslOK) goto ERROR; /* accept EOF here, we've already got our line */
+
+ anch_set = FALSE;
+ status = esl_buffer_RaiseAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; } /* we know bf->pos is in current window */
+ else if (status != eslOK) { goto ERROR; }
+ if (opt_p) *opt_p = bf->mem + bf->pos;
+ if (opt_n) *opt_n = nc;
+ bf->pos += nskip;
+ return eslOK;
+
+ ERROR:
+ if (anch_set) esl_buffer_RaiseAnchor(bf, anch);
+ if (opt_p) *opt_p = NULL;
+ if (opt_n) *opt_n = 0;
+ return status;
+}
+
+/* Function: esl_buffer_FetchLine()
+ * Synopsis: Fetch next line from a buffer.
+ * Incept: SRE, Tue Feb 1 15:37:34 2011 [Janelia]
+ *
+ * Purpose: Get the next line from the buffer <bf>, starting from its
+ * current position. Return an allocated copy of it in
+ * <*opt_p>, and its length in bytes in <*opt_n>. Advance
+ * the buffer position past (one) newline, putting it on
+ * the next valid byte. The last line in a file does not
+ * need to be terminated by a newline. The returned memory is not
+ * NUL-terminated.
+ *
+ * If the next line is empty (solely a newline character),
+ * returns <eslOK>, but with <*opt_p> as <NULL> and
+ * <*opt_n> as 0.
+ *
+ * Caller is responsible for free'ing <*opt_p>.
+ *
+ * Because <*ret_p> is a copy of <bf>'s internal buffer,
+ * caller may continue to manipulate <bf>, unlike
+ * <esl_buffer_GetLine()>.
+ *
+ * Args: bf - buffer to get line from
+ * *opt_p - optRETURN: pointer to allocated copy of next line
+ * *opt_n - optRETURN: length of <*opt_p>
+ *
+ * Returns: <eslOK> on success. Either <*opt_p> is an allocated copy
+ * of next line and <*opt_n> is $>0$, or <*opt_p> is <NULL>
+ * and <*opt_n> is 0 (in the case where the line is empty,
+ 8 immediately terminated by newline, such as \verb+"\n"+.).
+ *
+ * <eslEOF> if there's no line (even blank).
+ * On EOF, <*opt_p> is NULL and <*opt_n> is 0.
+ *
+ * Throws: <eslEMEM> if allocation fails.
+ * <eslESYS> if a system call such as fread() fails unexpectedly
+ * <eslEINCONCEIVABLE> if <bf> internal state is corrupt.
+ */
+int
+esl_buffer_FetchLine(ESL_BUFFER *bf, char **opt_p, esl_pos_t *opt_n)
+{
+ int anch_set = FALSE;
+ char *p = NULL;
+ esl_pos_t anch;
+ esl_pos_t nc, nskip;
+ int status;
+
+ anch = bf->baseoffset + bf->pos;
+ status = esl_buffer_SetAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; } /* we know bf->pos is in current window */
+ else if (status != eslOK) { goto ERROR; }
+ anch_set = TRUE;
+
+ if ( (status = buffer_countline(bf, &nc, &nskip)) != eslOK) goto ERROR; /* inc. normal EOF */
+
+ if (nc) { /* nc==0 on an empty line - then <*opt_p> comes back NULL */
+ ESL_ALLOC(p, sizeof(char) * nc);
+ memcpy(p, bf->mem+bf->pos, nc);
+ }
+ bf->pos += nskip;
+
+ anch_set = FALSE;
+ status = esl_buffer_RaiseAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; }
+ else if (status != eslOK) { goto ERROR; }
+
+ status = buffer_refill(bf, 0);
+ if (status != eslEOF && status != eslOK) goto ERROR; /* accept EOF here, we've already got our line */
+
+ if (opt_p) *opt_p = p; else free(p);
+ if (opt_n) *opt_n = nc;
+ return eslOK;
+
+ ERROR:
+ if (anch_set) esl_buffer_RaiseAnchor(bf, anch);
+ if (p) free(p);
+ if (opt_p) *opt_p = NULL;
+ if (opt_n) *opt_n = 0;
+ return status;
+}
+
+/* Function: esl_buffer_FetchLineAsStr()
+ * Synopsis: Fetch next line from buffer, and NUL-terminate it.
+ * Incept: SRE, Thu Feb 10 09:22:47 2011 [Janelia]
+ *
+ * Purpose: Same as <esl_buffer_FetchLine()> except the
+ * returned line is <NUL>-terminated and can be treated
+ * as a string.
+ *
+ * Args: bf - input buffer
+ * *opt_s - optRETURN: pointer to allocated copy of next line
+ * *opt_n - optRETURN: strlen() of <*opt_s>
+ *
+ * Returns: <eslOK> on success. <*opt_p> is an allocated copy
+ * of next line and <*opt_n> is >=0. (0 would be an empty line
+ * terminated by newline, such as \verb+\n+.)
+ *
+ * <eslEOF> if there's no line (even blank).
+ * On EOF, <*opt_p> is NULL and <*opt_n> is 0.
+ *
+ * Throws: <eslEMEM> if allocation fails.
+ * <eslEINVAL> if an anchoring attempt is invalid
+ * <eslESYS> if a system call such as fread() fails unexpectedly
+ * <eslEINCONCEIVABLE> if <bf> internal state is corrupt.
+ */
+int
+esl_buffer_FetchLineAsStr(ESL_BUFFER *bf, char **opt_s, esl_pos_t *opt_n)
+{
+ int anch_set = FALSE;
+ char *s = NULL;
+ esl_pos_t anch;
+ esl_pos_t nc, nskip;
+ int status;
+
+ anch = bf->baseoffset + bf->pos;
+ status = esl_buffer_SetAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; } /* we know bf->pos is in current window */
+ else if (status != eslOK) { goto ERROR; }
+ anch_set = TRUE;
+
+ if ( (status = buffer_countline(bf, &nc, &nskip)) != eslOK) goto ERROR; /* inc normal EOF */
+
+ ESL_ALLOC(s, sizeof(char) * (nc+1));
+ memcpy(s, bf->mem+bf->pos, nc);
+ s[nc] = '\0';
+ bf->pos += nskip;
+
+ anch_set = FALSE;
+ status = esl_buffer_RaiseAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; }
+ else if (status != eslOK) { goto ERROR; }
+
+ status = buffer_refill(bf, 0);
+ if (status != eslEOF && status != eslOK) goto ERROR; /* accept EOF here, we've already got our line */
+
+ if (opt_s) *opt_s = s; else free(s);
+ if (opt_n) *opt_n = nc;
+ return eslOK;
+
+ ERROR:
+ if (anch_set) esl_buffer_RaiseAnchor(bf, anch);
+ if (s) free(s);
+ if (opt_s) *opt_s = NULL;
+ if (opt_n) *opt_n = 0;
+ return status;
+
+}
+/*------------------ end, line-based parsing --------------------*/
+
+/*****************************************************************
+ *# 5. Token-based parsing
+ *****************************************************************/
+
+/* Function: esl_buffer_GetToken()
+ * Synopsis: Get next token.
+ * Incept: SRE, Sat Jan 1 19:42:44 2011 [Janelia]
+ *
+ * Purpose: Find the next token in <bf> delimited by the separator
+ * characters in <sep> or newline. Return a pointer
+ * to that token in <*opt_tok>, and its length in <*opt_n>.
+ * A 'token' consists of one or more characters that are
+ * neither in <sep> nor a newline (verb+\r+ or \verb+\n+).
+ *
+ * Because the caller only gets a pointer into the buffer's
+ * current memory, it should not call another
+ * <esl_buffer_*> function until it's done with the token
+ * or made a copy of it.
+ *
+ * In detail, starting from the buffer <bf>'s current
+ * point; first skip past any leading characters in <sep>. If EOF
+ * is reached, return <eslEOF>. If the point is now on a
+ * newline, skip past it and return <eslEOL>. Set an anchor
+ * at the current point. Count how many non-separator
+ * characters <n> occur from the current point <p>
+ * (expand/refill buffer as needed), and define the token
+ * as <p[0..n-1]>. Skip any trailing characters in <sep>.
+ * Set the point to the start of the next token (a char not
+ * in <sep>.) Release the anchor and return.
+ *
+ * If caller knows how many tokens it expects on each line,
+ * it should not include \verb+"\r\n"+ in its <sep>. This way,
+ * hitting a newline will cause a <eslEOL> return. The
+ * caller can check for expected or unexpected <EOL>'s.
+ *
+ * If the caller doesn't care how many tokens it allows per
+ * line, it should include \verb+"\r\n"+ in its <sep>. Now
+ * newlines will be skipped like any other separator
+ * character, and the only normal returns are <eslEOF> and
+ * <eslOK>.
+ *
+ * Args: bf - open buffer
+ * sep - string defining separator characters; <" \t\r\n"> for example.
+ * opt_tok - optRETURN: pointer to token in the <bf>
+ * opt_n - optRETURN: number of characters in the token
+ *
+ * Returns: <eslOK> if a token is found; <*ret_p> points to it,
+ * and <*opt_n> is its length in chars (> 0). The current
+ * point is at the start of the next token.
+ *
+ * <eslEOF> if the input ends before any token is found.
+ * Now <*ret_p> is <NULL> and <*opt_n> is 0. The current
+ * point is at EOF.
+ *
+ * <eslEOL> if a line ends before a token is found. (This
+ * case only arises if *sep does not contain newline.)
+ * Now <*ret_p> is <NULL> and <*opt_n> is 0. The current
+ * point is at the next character following the newline.
+ *
+ * <bf->mem> may be modified and/or reallocated, if new
+ * input reads are required to find the entire token.
+ *
+ * Throws: <eslEMEM> if an allocation fails.
+ * Now <*ret_p> is <NULL> and <*opt_n> is 0. The
+ * current point is undefined.
+ */
+int
+esl_buffer_GetToken(ESL_BUFFER *bf, const char *sep, char **opt_tok, esl_pos_t *opt_n)
+{
+ esl_pos_t anch;
+ esl_pos_t nc;
+ int anch_set = FALSE;
+ int status;
+
+ if ( (status = buffer_skipsep(bf, sep)) != eslOK) goto ERROR; /* includes EOF */
+ /* Now bf->pos is sitting on first char after seps */
+
+ if ( ( status = buffer_newline(bf)) != eslOK) goto ERROR; /* includes EOL */
+
+ anch = bf->baseoffset + bf->pos;
+ status = esl_buffer_SetAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; } /* we know bf->pos is in current window */
+ else if (status != eslOK) { goto ERROR; }
+
+ anch_set = TRUE;
+
+ if ( (status = buffer_counttok(bf, sep, &nc)) != eslOK) goto ERROR;
+ bf->pos += nc;
+
+ if ((status = buffer_skipsep(bf, sep)) != eslOK && status != eslEOF) goto ERROR;
+ if ((status = buffer_refill(bf, 0)) != eslOK && status != eslEOF) goto ERROR;
+
+ if (opt_tok) *opt_tok = bf->mem + (anch - bf->baseoffset);
+ if (opt_n) *opt_n = nc;
+ anch_set = FALSE;
+
+ status = esl_buffer_RaiseAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; }
+ else if (status != eslOK) { goto ERROR; }
+ return eslOK;
+
+ ERROR:
+ if (anch_set) esl_buffer_RaiseAnchor(bf, anch);
+ if (opt_tok) *opt_tok = NULL;
+ if (opt_n) *opt_n = 0;
+ return status;
+}
+
+/* Function: esl_buffer_FetchToken()
+ * Synopsis: Fetch copy of next token.
+ * Incept: SRE, Thu Feb 24 08:54:54 2011 [Janelia]
+ *
+ * Purpose: Essentially the same as <esl_buffer_GetToken()>, except a
+ * copy of the token is made into newly allocated memory,
+ * and a pointer to this memory is returned in <*opt_tok>.
+ * The caller is responsible for freeing the memory.
+ *
+ * The token is raw memory, not a <NUL>-terminated string.
+ * To fetch tokens as <NUL>-terminated strings, see
+ * <esl_buffer_GetTokenAsStr()>.
+ *
+ * Args: bf - open buffer
+ * sep - string defining separator characters; <" \t\r\n"> for example.
+ * opt_tok - optRETURN: allocated copy of token
+ * opt_n - optRETURN: number of characters in the token
+ *
+ * Returns: <eslOK> if a token is found; <*ret_p> points to it,
+ * and <*opt_n> is its length in chars (> 0). The current
+ * point is at the start of the next token.
+ *
+ * <eslEOF> if the input ends before any token is found.
+ * Now <*ret_p> is <NULL> and <*opt_n> is 0. The current
+ * point is at EOF.
+ *
+ * <eslEOL> if a line ends before a token is found. (This
+ * case only arises if *sep does not contain newline.)
+ * Now <*ret_p> is <NULL> and <*opt_n> is 0. The current
+ * point is at the next character following the newline.
+ *
+ * <bf->mem> may be modified and/or reallocated, if new
+ * input reads are required to find the entire token.
+ *
+ * Throws: <eslEMEM> if an allocation fails.
+ * Now <*ret_p> is <NULL> and <*opt_n> is 0. The
+ * current point is undefined.
+ */
+int
+esl_buffer_FetchToken(ESL_BUFFER *bf, const char *sep, char **opt_tok, esl_pos_t *opt_n)
+{
+ char *tok = NULL;
+ esl_pos_t anch;
+ esl_pos_t nc;
+ int anch_set = FALSE;
+ int status;
+
+ if ( (status = buffer_skipsep(bf, sep)) != eslOK) goto ERROR; /* includes EOF */
+ /* Now bf->pos is sitting on first char after seps */
+
+ if ( ( status = buffer_newline(bf)) != eslOK) goto ERROR; /* includes EOL */
+
+ anch = bf->baseoffset + bf->pos;
+ status = esl_buffer_SetAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; }
+ else if (status != eslOK) { goto ERROR; }
+ anch_set = TRUE;
+
+ if ( (status = buffer_counttok(bf, sep, &nc)) != eslOK) goto ERROR;
+ /* now we know that pos..pos+nc-1 is a token; pos+nc is the next parser position */
+
+ /* copy the token */
+ ESL_ALLOC(tok, sizeof(char) * nc);
+ memcpy(tok, bf->mem+bf->pos, nc);
+ bf->pos += nc;
+
+ /* in a Fetch, we can raise the anchor before the new refill */
+ status = esl_buffer_RaiseAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; }
+ else if (status != eslOK) { goto ERROR; }
+ anch_set = FALSE;
+
+ if ((status = buffer_skipsep(bf, sep)) != eslOK && status != eslEOF) goto ERROR;
+ if ((status = buffer_refill(bf, 0)) != eslOK && status != eslEOF) goto ERROR;
+
+ if (opt_tok) *opt_tok = tok; else free(tok);
+ if (opt_n) *opt_n = nc;
+ return eslOK;
+
+ ERROR:
+ if (tok) free(tok);
+ if (anch_set) esl_buffer_RaiseAnchor(bf, anch);
+ if (opt_tok) *opt_tok = NULL;
+ if (opt_n) *opt_n = 0;
+ return status;
+}
+
+
+/* Function: esl_buffer_FetchTokenAsStr()
+ * Synopsis: Fetch copy of next token as \verb+\0+-terminated string.
+ * Incept: SRE, Sat Jan 1 19:31:57 2011 [Zaragoza]
+ *
+ * Purpose: Essentially the same as <esl_buffer_FetchToken()>
+ * except the copied token is \verb+\0+-terminated so it
+ * can be treated as a string.
+ *
+ * Args: bf - open buffer
+ * sep - string defining separator characters; <" \t\r\n"> for example.
+ * opt_tok - optRETURN: allocated copy of token
+ * opt_n - optRETURN: number of characters in the token
+ *
+ * Returns: <eslOK> if a token is found; <*ret_p> points to it,
+ * and <*opt_n> is its length in chars (> 0). The current
+ * point is at the start of the next token.
+ *
+ * <eslEOF> if the input ends before any token is found.
+ * Now <*ret_p> is <NULL> and <*opt_n> is 0. The current
+ * point is at EOF.
+ *
+ * <eslEOL> if a line ends before a token is found. (This
+ * case only arises if *sep does not contain newline.)
+ * Now <*ret_p> is <NULL> and <*opt_n> is 0. The current
+ * point is at the next character following the newline.
+ *
+ * <bf->mem> may be modified and/or reallocated, if new
+ * input reads are required to find the entire token.
+ *
+ * Throws: <eslEMEM> if an allocation fails.
+ * Now <*ret_p> is <NULL> and <*opt_n> is 0. The
+ * current point is undefined.
+ */
+int
+esl_buffer_FetchTokenAsStr(ESL_BUFFER *bf, const char *sep, char **opt_tok, esl_pos_t *opt_n)
+{
+ char *tok = NULL;
+ esl_pos_t anch;
+ esl_pos_t nc;
+ int anch_set = FALSE;
+ int status;
+
+ if ( (status = buffer_skipsep(bf, sep)) != eslOK) goto ERROR; /* includes EOF */
+ /* Now bf->pos is sitting on first char after seps */
+
+ if ( ( status = buffer_newline(bf)) != eslOK) goto ERROR; /* includes EOL */
+
+ anch = bf->baseoffset + bf->pos;
+ status = esl_buffer_SetAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; }
+ else if (status != eslOK) { goto ERROR; }
+ anch_set = TRUE;
+
+ if ( (status = buffer_counttok(bf, sep, &nc)) != eslOK) goto ERROR;
+ /* now we know that pos..pos+nc-1 is a token; pos+nc is the next parser position */
+
+ /* copy the token */
+ ESL_ALLOC(tok, sizeof(char) * (nc+1));
+ memcpy(tok, bf->mem+bf->pos, nc);
+ tok[nc] = '\0';
+ bf->pos += nc;
+
+ /* in a Fetch, we can raise the anchor before the new refill */
+ status = esl_buffer_RaiseAnchor(bf, anch);
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; }
+ else if (status != eslOK) { goto ERROR; }
+ anch_set = FALSE;
+
+
+ if ((status = buffer_skipsep(bf, sep)) != eslOK && status != eslEOF) goto ERROR;
+ if ((status = buffer_refill(bf, 0)) != eslOK && status != eslEOF) goto ERROR;
+
+ if (opt_tok) *opt_tok = tok; else free(tok);
+ if (opt_n) *opt_n = nc;
+ return eslOK;
+
+ ERROR:
+ if (tok) free(tok);
+ if (anch_set) esl_buffer_RaiseAnchor(bf, anch);
+ if (opt_tok) *opt_tok = NULL;
+ if (opt_n) *opt_n = 0;
+ return status;
+}
+/*----------------- end, token-based parsing --------------------*/
+
+
+
+/*****************************************************************
+ *# 6. Binary (fread-like) parsing
+ *****************************************************************/
+
+/* Function: esl_buffer_Read()
+ * Synopsis: Copy a fixed number of bytes from a buffer.
+ * Incept: SRE, Thu Feb 24 09:25:04 2011 [Janelia]
+ *
+ * Purpose: Given an input buffer <bf>, read exactly <nbytes>
+ * characters into memory <p> provided by the caller.
+ *
+ * Suitable for copying known-width scalars from
+ * binary files, as in:
+ * \begin{cchunk}
+ * char c;
+ * int n;
+ * esl_buffer_Read(bf, sizeof(char), c);
+ * esl_buffer_Read(bf, sizeof(int), n);
+ * \end{cchunk}
+ *
+ * Args: bf - open input buffer
+ * nbytes - number of characters to read
+ * p - caller-provided memory for storing the copied bytes
+ *
+ * Returns: <eslOK> on success; <p> contains exactly <nbytes>
+ * of data from <bf>, and the point is advanced by <nbytes>.
+ *
+ * <eslEOF> if less than <nbytes> characters remain
+ * in <bf>. Point is unchanged.
+ *
+ * Throws: <eslEMEM> if an allocation fails.
+ * <eslESYS> if an fread() fails mysteriously.
+ * <eslEINCONCEIVABLE> if internal state of <bf> is corrupted.
+ */
+int
+esl_buffer_Read(ESL_BUFFER *bf, size_t nbytes, void *p)
+{
+ int status;
+
+ if (bf->n - bf->pos < nbytes)
+ {
+ status = buffer_refill(bf, nbytes + bf->pagesize);
+ if (status == eslEOF) return eslEOF;
+ else if (status != eslOK) return status; /* EMEM, ESYS, EINCONCEIVABLE */
+ else if (bf->n-bf->pos < nbytes) return eslEOF;
+ }
+
+ memcpy(p, bf->mem+bf->pos, nbytes);
+ bf->pos += nbytes;
+
+ if ((status = buffer_refill(bf, 0)) != eslOK && status != eslEOF) return status; /* accept EOF, we've already copied what we need */
+ return eslOK;
+}
+/*------------ end, binary (fread-like) parsing -----------------*/
+
+
+/*****************************************************************
+ * 7. Private (static) functions
+ *****************************************************************/
+
+/* buffer_create()
+ * SRE, Sun Jan 23 19:18:40 2011 [UA975 IAD->SFO]
+ *
+ * Allocate a new ESL_BUFFER and return it in <*ret_bf>;
+ * with all fields initialized; return <eslOK>.
+ *
+ * On allocation failure, returns <eslEMEM> and <*ret_bf>
+ * is <NULL>.
+ */
+static int
+buffer_create(ESL_BUFFER **ret_bf)
+{
+ ESL_BUFFER *bf = NULL;
+ int status;
+
+ ESL_ALLOC(bf, sizeof(ESL_BUFFER));
+ bf->mem = NULL;
+ bf->n = 0;
+ bf->balloc = 0;
+ bf->pos = 0;
+ bf->baseoffset = 0;
+ bf->anchor = -1;
+ bf->fp = NULL;
+ bf->filename = NULL;
+ bf->cmdline = NULL;
+ bf->pagesize = eslBUFFER_PAGESIZE;
+ bf->errmsg[0] = '\0';
+ bf->mode_is = eslBUFFER_UNSET;
+
+ *ret_bf = bf;
+ return eslOK;
+
+ ERROR:
+ if (bf) free(bf);
+ *ret_bf = NULL;
+ return status;
+}
+
+/* buffer_init_file_mmap()
+ * SRE, Sun Jan 23 19:02:34 2011 [UA975 IAD->SFO]
+ *
+ * On entry, we've already opened the file;
+ * bf->fp = open stream for reading
+ * bf->filename = name of the file
+ *
+ * On success, returns eslOK, and *ret_bf has:
+ * bf->mem mmap'ed file
+ * bf->n size of the entire file, in bytes
+ * bf->mode_is eslBUFFER_MMAP
+ *
+ * On failure, returns error code, and *ret_bf has:
+ * bf->errmsg helpful error message
+ * (all other fields at creation defaults)
+ *
+ * On exception, returns error code, and *ret_bf
+ * is left with all fields at creation defaults.
+ */
+static int
+buffer_init_file_mmap(ESL_BUFFER *bf, esl_pos_t filesize)
+{
+ int status;
+ /* mmap(addr, len, prot, flags, fd, offset */
+ bf->mem = mmap(0, filesize, PROT_READ, MAP_PRIVATE, fileno(bf->fp), 0);
+ if (bf->mem == MAP_FAILED) ESL_XEXCEPTION(eslESYS, "mmap()");
+
+ bf->n = filesize;
+ bf->mode_is = eslBUFFER_MMAP;
+
+ /* open fp no longer needed - close it. */
+ fclose(bf->fp);
+ bf->fp = NULL;
+ return eslOK;
+
+ ERROR:
+ if (bf->mem != MAP_FAILED) munmap(bf->mem, bf->n);
+ bf->mem = NULL;
+ bf->n = 0;
+ bf->mode_is = eslBUFFER_UNSET;
+ return status;
+}
+
+int
+buffer_init_file_slurped(ESL_BUFFER *bf, esl_pos_t filesize)
+{
+ int status;
+
+ ESL_ALLOC(bf->mem, sizeof(char) * filesize);
+ bf->balloc = filesize;
+
+ bf->n = fread(bf->mem, sizeof(char), filesize, bf->fp);
+ if (bf->n < filesize)
+ ESL_XEXCEPTION(eslESYS, "failed to slurp %s\n", bf->filename);
+
+ bf->mode_is = eslBUFFER_ALLFILE;
+
+ fclose(bf->fp); /* open fp no longer needed - close it. */
+ bf->fp = NULL;
+ return eslOK;
+
+ ERROR:
+ if (bf->mem) { free(bf->mem); bf->mem = NULL; }
+ return status;
+}
+
+int
+buffer_init_file_basic(ESL_BUFFER *bf)
+{
+ int status;
+
+ ESL_ALLOC(bf->mem, sizeof(char) * bf->pagesize);
+ bf->balloc = bf->pagesize;
+
+ bf->n = fread(bf->mem, sizeof(char), bf->pagesize, bf->fp);
+ if (bf->n < bf->pagesize && ferror(bf->fp))
+ ESL_XEXCEPTION(eslESYS, "failed to read first chunk of %s", bf->filename);
+
+ bf->mode_is = eslBUFFER_FILE;
+ return eslOK;
+
+ ERROR:
+ if (bf->mem) { free(bf->mem); bf->mem = NULL; }
+ return status;
+}
+
+/* buffer_refill()
+ * For current buffer position bf->pos, try to assure that
+ * we have at least <bf->pagesize> bytes loaded in <bf->mem> to parse.
+ *
+ * If new read won't fit (space remaining: balloc-n; read size: memreadsize)
+ * then make room for it:
+ * if no anchor: ndel = pos
+ * else w/ anchor: ndel = anchor; anchor = 0
+ * n -= ndel bytes are moved
+ * pos -= ndel
+ * if (n) move <n> bytes from <ndel> to 0.
+ * base_offset += ndel
+ * if (n + memreadsize > balloc) reallocate mem
+ * fread() a block into position mem+n
+ * n += memreadsize
+ *
+ * For example, suppose we've completely parsed the buffer (pos == n) and we have no
+ * anchor: then:
+ * ndel = n
+ * n = 0 (no bytes are moved)
+ * pos = 0
+ * base_offset += n
+ * fread a new block into mem+0
+ * n += memreadsize
+ *
+ * Returns: <eslOK> on success.
+ * <eslEOF> if no data remain in buffer nor to be read. Now pos == n.
+ *
+ * Throws: <eslEMEM> if an allocation fails.
+ * <eslESYS> if fread() fails mysteriously.
+ * <eslEINCONCEIVABLE> if internal state of <bf> is corrupt.
+ */
+static int
+buffer_refill(ESL_BUFFER *bf, esl_pos_t nmin)
+{
+ esl_pos_t ndel;
+ esl_pos_t nread;
+ int status;
+
+ if (! bf->fp || feof(bf->fp)) return ( (bf->pos < bf->n) ? eslOK : eslEOF); /* without an active fp, we have whole buffer in memory; either no-op OK, or EOF */
+ if (bf->n - bf->pos >= nmin + bf->pagesize) return eslOK; /* if we already have enough data in buffer window, no-op w */
+
+ if (bf->pos > bf->n) ESL_EXCEPTION(eslEINCONCEIVABLE, "impossible position for buffer <pos>");
+
+ /* Relocation, shift left to conserve memory */
+ if (bf->balloc - bf->n < bf->pagesize && bf->pos > 0)
+ {
+ if (bf->anchor == -1) ndel = bf->pos;
+ else { ndel = bf->anchor; bf->anchor = 0; }
+ bf->n -= ndel;
+ bf->pos -= ndel;
+ if (bf->n) {
+ ESL_DASSERT1(( bf->mem != NULL ));
+ memmove(bf->mem, bf->mem+ndel, bf->n);
+ }
+ bf->baseoffset += ndel;
+ }
+
+ if (bf->n + bf->pagesize > bf->balloc)
+ {
+ ESL_REALLOC(bf->mem, sizeof(char) * (bf->n + bf->pagesize));
+ bf->balloc = bf->n + bf->pagesize;
+ }
+
+ nread = fread(bf->mem+bf->n, sizeof(char), bf->pagesize, bf->fp);
+ if (nread == 0 && !feof(bf->fp) && ferror(bf->fp)) ESL_EXCEPTION(eslESYS, "fread() failure");
+
+ bf->n += nread;
+ if (nread == 0 && bf->pos == bf->n) return eslEOF; else return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* buffer_countline()
+ * The guts of esl_buffer_GetLine().
+ *
+ * Starting from the current buffer position bf->pos, count the number
+ * of characters to the next newline or EOF. Return the number of
+ * chars EXCLUSIVE of newline in <*opt_nc>; this is the line length to
+ * be parsed starting from bf->pos. Return the number of chars
+ * INCLUSIVE of newline in <*opt_nskip>; this is the amount the caller
+ * should increment bf->pos by, to position the parser at the start of
+ * the next line.
+ *
+ * This is used in GetLine() and FetchLine*(). They differ in the order
+ * of calling RaiseAnchor() and buffer_refill(): if we're
+ * fetching, we don't need to keep the memory of the current
+ * line in the buffer's window, so we can raise the anchor
+ * before refilling the buffer, which can save some memory.
+ *
+ * If necessary, the buffer is refilled. This relies on the caller having
+ * already set an anchor at the beginning of the line.
+ *
+ * Newlines are defined by esl_memnewline().
+ *
+ * Returns: <eslOK> on success.
+ * <*opt_nc> is >= 0. (0 means an empty line.)
+ * <*opt_nskip> is >= <*opt_nc>. (Equality means the line ended at EOF.)
+ *
+ * <eslEOF> if there's no line (even blank).
+ * On EOF, <*opt_p> is NULL and <*opt_n> is 0.
+ *
+ * Throws: <eslEMEM> if allocation fails.
+ * <eslESYS> if a system call such as fread() fails unexpectedly.
+ * <eslEINCONCEIVABLE> if <bf> internal state is corrupt.
+ */
+static int
+buffer_countline(ESL_BUFFER *bf, esl_pos_t *opt_nc, esl_pos_t *opt_nskip)
+{
+ esl_pos_t nc; /* line length exclusive of newline */
+ esl_pos_t nc2; /* tmp nc for a suffix of the current line */
+ int nterm; /* length of newline; 0..2 */
+ int status;
+
+ if (bf->pos == bf->n) { status = eslEOF; goto ERROR; } /* normal EOF */
+
+ nc = 0;
+ do {
+ if ((status = esl_memnewline(bf->mem + bf->pos + nc, bf->n - bf->pos - nc, &nc2, &nterm)) != eslOK && status != eslEOD) goto ERROR;
+ nc += nc2;
+ if (nc2 && bf->mem[bf->pos+nc-1] == '\r') nc--; /* handle case where we've only read up to \r of a \r\n newline */
+ if (nterm) break;
+ if (( status = buffer_refill(bf, nc+nterm)) != eslOK && status != eslEOF) goto ERROR;
+ } while (bf->n - bf->pos > nc);
+
+ /* EOF check. If we get here with status == eslEOF, nc = nterm = 0,
+ * then esl_memnewline found no data for a line and buffer_refill returned EOF.
+ */
+ if (status == eslEOF && nc == 0 && nterm == 0) goto ERROR;
+
+ /* Now the line extends from bf->pos..pos+nc-1 in the buffer window
+ * The newline itself is position pos+nc..pos+nc+nterm-1 (one or two chars)
+ * The next line starts at pos+nc+nterm
+ * We know that everything up to pos+nc+nterm-1 is in the buffer window.
+ * It's safe to set the current buffer position to pos+nc+nterm, which
+ * may be bf->n; the next buffer_refill() will do the right thing with it.
+ */
+ if (opt_nc) *opt_nc = nc;
+ if (opt_nskip) *opt_nskip = nc + nterm;
+ return eslOK;
+
+ ERROR: /* including normal EOF */
+ if (opt_nc) *opt_nc = 0;
+ if (opt_nskip) *opt_nskip = 0;
+ return status;
+}
+
+/* First chunk of token parsing, shared amongst GetToken(), FetchToken(), FetchTokenAsStr()
+ * Skip the parser past chars in *sep; return eslEOF if no non-sep char is found.
+ * Now parser is bf->pos == bf->n, buffer is in EOF state.
+ * eslOK on success, and bf->pos is on the first nonsep char.
+ *
+ * Returns: eslOK or eslEOF
+ * Throws: eslEMEM, eslESYS, eslEINCONCEIVABLE
+ */
+static int
+buffer_skipsep(ESL_BUFFER *bf, const char *sep)
+{
+ int status;
+
+ /* skip characters in sep[], or hit EOF. */
+ do {
+ for ( ; bf->pos < bf->n; bf->pos++)
+ if (strchr(sep, bf->mem[bf->pos]) == NULL) goto DONE;
+ if ( (status = buffer_refill(bf, 0)) != eslOK && status != eslEOF) return status;
+ } while (bf->n > bf->pos);
+
+ DONE:
+ return (bf->pos == bf->n ? eslEOF : eslOK);
+}
+
+/* buffer_skipnewline()
+ * if bf->pos is on a newline (1 or 2 chars);
+ * advance bf->pos to next byte after newline and return eslEOL
+ * else do nothing, and return eslOK.
+ */
+static int
+buffer_newline(ESL_BUFFER *bf)
+{
+ esl_pos_t nc = bf->n - bf->pos;
+ int status;
+
+ if (nc == 0)
+ return eslEOL; /* no newline, but EOF is as good as */
+ if (nc >= 1 && bf->mem[bf->pos] == '\n')
+ { bf->pos += 1; return eslEOL; }
+ if (nc >= 2 && memcmp(bf->mem + bf->pos, "\r\n", 2) == 0)
+ { bf->pos += 2; return eslEOL; }
+
+ status = buffer_refill(bf, 0);
+ if (status != eslEOF && status != eslOK) return status;
+
+ return eslOK;
+}
+
+/* bf->pos is sitting on a non-sep, non-newline character, starting
+ * a token (i.e., the way buffer_skipsep() left us on
+ * success). Caller has set anchor to be sure this position stays in
+ * buffer. Count how many nonsep, nonnewline characters there are,
+ * starting here. Expand bf as needed.
+ */
+static int
+buffer_counttok(ESL_BUFFER *bf, const char *sep, esl_pos_t *ret_nc)
+{
+ esl_pos_t nc;
+ int status;
+
+ /* skip chars NOT in sep[]. */
+ nc = 1;
+ do {
+ for ( ; nc < bf->n-bf->pos; nc++)
+ {
+ if (strchr(sep, bf->mem[bf->pos+nc]) != NULL) break; /* token ends on any char in sep */
+ if (bf->mem[bf->pos+nc] == '\n') break; /* token also always ends on a newline */
+ }
+ if (nc < bf->n-bf->pos) break; /* token ended in our current buffer */
+
+ if ( (status = buffer_refill(bf, nc)) != eslOK && status != eslEOF) goto ERROR;
+ } while (bf->n - bf->pos > nc);
+
+ if (bf->mem[bf->pos+nc] == '\n' && bf->mem[bf->pos+nc-1] == '\r') { nc--; }
+
+ /* bf->mem[bf->pos+nc] now sitting on the first char that's in sep, or a newline char */
+ *ret_nc = nc;
+ return eslOK;
+
+ ERROR:
+ *ret_nc = 0;
+ return status;
+}
+/*----------------- end, private functions ----------------------*/
+
+
+
+
+/*****************************************************************
+ * 8. Benchmark
+ *****************************************************************/
+#ifdef eslBUFFER_BENCHMARK
+
+/* compile: gcc -g -Wall -I. -L. -o esl_buffer_benchmark -DeslBUFFER_BENCHMARK esl_buffer.c -leasel -lm
+ * run: ./esl_buffer_benchmark
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+
+#include "easel.h"
+#include "esl_buffer.h"
+#include "esl_getopts.h"
+#include "esl_stopwatch.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options] <infile>";
+static char banner[] = "benchmark driver for buffer module";
+
+
+static void
+benchmark_buffer_raw(char *filename, esl_pos_t *counts)
+{
+ ESL_BUFFER *bf = NULL;
+ char *p;
+ esl_pos_t nc;
+ esl_pos_t pos;
+
+ esl_buffer_OpenFile(filename, &bf);
+ while (esl_buffer_Get(bf, &p, &nc) == eslOK)
+ {
+ for (pos = 0; pos < nc; pos++)
+ counts[(int) p[pos]]++;
+
+ esl_buffer_Set(bf, p, nc);
+ }
+ esl_buffer_Close(bf);
+ return;
+}
+
+static void
+benchmark_buffer_lines(char *filename, esl_pos_t *counts)
+{
+ ESL_BUFFER *bf = NULL;
+ char *p;
+ esl_pos_t nc;
+ esl_pos_t pos;
+
+ esl_buffer_OpenFile(filename, &bf);
+ while (esl_buffer_GetLine(bf, &p, &nc) == eslOK)
+ {
+ for (pos = 0; pos < nc; pos++)
+ counts[(int) p[pos]]++;
+ }
+ esl_buffer_Close(bf);
+ return;
+}
+
+static void
+benchmark_buffer_stream_raw(char *filename, esl_pos_t *counts)
+{
+ FILE *fp = fopen(filename, "rb");
+ ESL_BUFFER *bf = NULL;
+ char *p;
+ esl_pos_t nc;
+ esl_pos_t pos;
+
+ esl_buffer_OpenStream(fp, &bf);
+ while (esl_buffer_Get(bf, &p, &nc) == eslOK)
+ {
+ for (pos = 0; pos < nc; pos++)
+ counts[(int) p[pos]]++;
+
+ esl_buffer_Set(bf, p, nc);
+ }
+ esl_buffer_Close(bf);
+ return;
+}
+
+static void
+benchmark_buffer_stream_lines(char *filename, esl_pos_t *counts)
+{
+ FILE *fp = fopen(filename, "rb");
+ ESL_BUFFER *bf = NULL;
+ char *p;
+ esl_pos_t nc;
+ esl_pos_t pos;
+
+ esl_buffer_OpenStream(fp, &bf);
+ while (esl_buffer_GetLine(bf, &p, &nc) == eslOK)
+ {
+ for (pos = 0; pos < nc; pos++)
+ counts[(int) p[pos]]++;
+ }
+ esl_buffer_Close(bf);
+ return;
+}
+
+static void
+benchmark_buffer_tokens(char *filename, esl_pos_t *counts)
+{
+ FILE *fp = fopen(filename, "rb");
+ ESL_BUFFER *bf = NULL;
+ char sep[] = " \t\r\n";
+ char *tok;
+ esl_pos_t nc;
+ esl_pos_t pos;
+
+ esl_buffer_OpenStream(fp, &bf);
+ while (esl_buffer_GetToken(bf, sep, &tok, &nc) == eslOK)
+ {
+ for (pos = 0; pos < nc; pos++)
+ counts[(int) tok[pos]]++;
+ }
+ esl_buffer_Close(bf);
+ return;
+}
+
+
+static void
+benchmark_mmap(char *filename, esl_pos_t filesize, esl_pos_t *counts)
+{
+ char *buf = NULL;
+ int prot = PROT_READ;
+ int flags = MAP_FILE | MAP_PRIVATE;
+ int fd = -1;
+ off_t offset = 0;
+ esl_pos_t pos;
+
+ fd = open(filename, O_RDONLY);
+ buf = (char *) mmap(0, filesize, prot, flags, fd, offset);
+ // posix_madvise(buf, len, POSIX_MADV_SEQUENTIAL);
+ close(fd);
+
+ for (pos = 0; pos < filesize; pos++)
+ counts[(int) buf[pos]]++;
+
+ munmap(buf, filesize);
+ return;
+}
+
+static void
+benchmark_one_read(char *filename, esl_pos_t filesize, esl_pos_t *counts)
+{
+ int fd = -1;
+ char *buf = malloc(filesize);
+ esl_pos_t pos;
+
+ fd = open(filename, O_RDONLY);
+ read(fd, buf, filesize);
+ close(fd);
+
+ for (pos = 0; pos < filesize; pos++)
+ counts[(int) buf[pos]]++;
+
+ free(buf);
+ return;
+}
+
+static void
+benchmark_one_fread(char *filename, esl_pos_t filesize, esl_pos_t *counts)
+{
+ FILE *fp = fopen(filename, "rb");
+ char *buf = malloc(filesize);
+ esl_pos_t pos;
+
+ fread(buf, 1, filesize, fp);
+ fclose(fp);
+
+ for (pos = 0; pos < filesize; pos++)
+ counts[(int) buf[pos]]++;
+ free(buf);
+ return;
+}
+
+static void
+benchmark_fgets(char *filename, esl_pos_t *counts)
+{
+ FILE *fp = fopen(filename, "rb");
+ char *buf = malloc(4096);
+ char *p;
+
+ while (fgets(buf, 4096, fp) != NULL)
+ {
+ for (p = buf; *p != '\0'; p++)
+ counts[(int) (*p)]++;
+ }
+ fclose(fp);
+ free(buf);
+ return;
+}
+
+static void
+benchmark_strtok(char *filename, esl_pos_t *counts)
+{
+ FILE *fp = fopen(filename, "rb");
+ char *buf = malloc(8192);
+ char *tok = NULL;
+ char *p, *p2;
+
+ while (fgets(buf, 8192, fp) != NULL)
+ {
+ p = buf;
+ do {
+ if ((tok = strtok(p, " \t\r\n")) != NULL)
+ {
+ for (p2 = tok; *p2 != '\0'; p2++)
+ counts[(int) (*p2)]++;
+ }
+ p = NULL;
+ } while (tok);
+ }
+ fclose(fp);
+ free(buf);
+ return;
+}
+
+static void
+benchmark_esl_fgets(char *filename, esl_pos_t *counts)
+{
+ FILE *fp = fopen(filename, "rb");
+ char *buf = NULL;
+ int n = 0;
+ char *p;
+
+ while (esl_fgets(&buf, &n, fp) == eslOK)
+ {
+ for (p = buf; *p != '\0'; p++)
+ counts[(int) (*p)]++;
+ }
+ fclose(fp);
+ free(buf);
+ return;
+}
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ ESL_STOPWATCH *w = esl_stopwatch_Create();
+ char *infile = esl_opt_GetArg(go, 1);
+ struct stat fstats;
+ esl_pos_t filesize;
+ esl_pos_t counts[256];
+
+ stat(infile, &fstats);
+ filesize = fstats.st_size;
+
+ /* roughly in fastest->slowest order */
+ esl_stopwatch_Start(w); benchmark_mmap (infile, filesize, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "mmap(): ");
+ esl_stopwatch_Start(w); benchmark_buffer_stream_raw (infile, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "ESL_BUFFER (stream, raw): ");
+ esl_stopwatch_Start(w); benchmark_buffer_raw (infile, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "ESL_BUFFER (mmap, raw): ");
+ esl_stopwatch_Start(w); benchmark_one_read (infile, filesize, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "one read(): ");
+ esl_stopwatch_Start(w); benchmark_one_fread (infile, filesize, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "one fread(): ");
+ esl_stopwatch_Start(w); benchmark_fgets (infile, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "fgets(): ");
+ esl_stopwatch_Start(w); benchmark_esl_fgets (infile, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "esl_fgets(): ");
+ esl_stopwatch_Start(w); benchmark_buffer_lines (infile, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "ESL_BUFFER (mmap, lines): ");
+ esl_stopwatch_Start(w); benchmark_buffer_stream_lines(infile, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "ESL_BUFFER (stream, lines): ");
+ esl_stopwatch_Start(w); benchmark_strtok (infile, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "strtok(): ");
+ esl_stopwatch_Start(w); benchmark_buffer_tokens (infile, counts); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "ESL_BUFFER (stream, tokens): ");
+
+ esl_stopwatch_Destroy(w);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+#endif /*eslBUFFER_BENCHMARK*/
+/*----------------- end, benchmark driver -----------------------*/
+
+
+
+
+
+/*****************************************************************
+ * 9. Unit tests
+ *****************************************************************/
+#ifdef eslBUFFER_TESTDRIVE
+
+#include "esl_random.h"
+#include <ctype.h>
+
+/* A variant of esl_buffer_OpenFile() that lets us specify
+ * whether we want to slurp, mmap, or basic, using
+ * eslBUFFER_ALLFILE, eslBUFFER_MMAP, eslBUFFER_FILE flags.
+ * We use this to force code coverage of the different
+ * buffer_init_file_*() functions.
+ * For example, the default unit test driver generates a
+ * test file of ~3 MB, which is always slurped and never
+ * mmap()'ed; if we want to test mmap() we have to force it.
+ */
+static int
+buffer_OpenFileAs(const char *filename, enum esl_buffer_mode_e mode_is, ESL_BUFFER **ret_bf)
+{
+ char msg[] = "buffer_OpenFileAs() failed";
+ ESL_BUFFER *bf = NULL;
+#ifdef _POSIX_VERSION
+ struct stat fileinfo;
+#endif
+ esl_pos_t filesize = -1;
+
+ if (buffer_create(&bf) != eslOK) esl_fatal(msg);
+ if ((bf->fp = fopen(filename, "rb")) == NULL) esl_fatal(msg);
+ if (esl_strdup(filename, -1, &(bf->filename)) != eslOK) esl_fatal(msg);
+
+#ifdef _POSIX_VERSION
+ if (fstat(fileno(bf->fp), &fileinfo) == -1) esl_fatal(msg);
+ filesize = fileinfo.st_size;
+ bf->pagesize = fileinfo.st_blksize;
+ if (bf->pagesize < 512) bf->pagesize = 512;
+ if (bf->pagesize > 4194304) bf->pagesize = 4194304;
+#endif
+
+ switch (mode_is) {
+ case eslBUFFER_ALLFILE: if (buffer_init_file_slurped(bf, filesize) != eslOK) esl_fatal(msg); break;
+ case eslBUFFER_MMAP: if (buffer_init_file_mmap (bf, filesize) != eslOK) esl_fatal(msg); break;
+ case eslBUFFER_FILE: if (buffer_init_file_basic (bf) != eslOK) esl_fatal(msg); break;
+ default: esl_fatal(msg);
+ }
+ *ret_bf = bf;
+ return eslOK;
+}
+
+
+
+
+/* Test lines:
+ * long: \s{0,1}[<line#> _{0,5000} <line#>]\s{0,1}\r?\n (line length > pagesize)
+ * short: \s{0,1}[<line#> _{0,60} <line#>]\s{0,1}\r?\n (typical text file lines)
+ * empty: \s{0,1}\r?\n (parser shouldn't lose track of blank lines)
+ * Final line in file does not necessarily end in newline.
+ */
+static void
+create_testfile_lines(ESL_RANDOMNESS *r, char *tmpfile, int nlines)
+{
+ char msg[] = "create_testfile_lines() failed";
+ FILE *fp = NULL;
+ double fq_leadspace = 0.2;
+ double fq_longline = 0.1;
+ double fq_empty = 0.2;
+ double fq_dos = 0.5;
+ double fq_finalnewline = 0.5;
+ int longxnum = 5000;
+ int shortxnum = 60;
+ double roll;
+ int i, n;
+
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal(msg);
+
+ for (i = 0; i < nlines; i++)
+ {
+ if (esl_random(r) < fq_leadspace) fputc(' ', fp);
+
+ roll = esl_random(r);
+ if (roll < fq_empty) {
+ if (esl_random(r) < fq_dos) fputs("\r\n", fp); else fputc('\n', fp);
+ continue;
+ }
+
+ if (roll < fq_empty + fq_longline) { n = esl_rnd_Roll(r, longxnum+1); }
+ else { n = esl_rnd_Roll(r, shortxnum+1); }
+
+ fprintf(fp, "[%d %*s %d]", i+1, n, " ", i+1);
+
+ if (esl_random(r) < fq_leadspace) fputc(' ', fp);
+ if (i < nlines-1 || esl_random(r) < fq_finalnewline) {
+ if (esl_random(r) < fq_dos) fputs("\r\n", fp); else fputc('\n', fp);
+ }
+ }
+ fclose(fp);
+}
+
+static void
+utest_compare_line(char *p, esl_pos_t n, int nline_expected)
+{
+ const char msg[] = "line input fails to match expected";
+ int32_t which = 0;
+ int nc;
+
+ if (esl_memspn(p, n, " \t\r\n") == n) return; /* blank test lines */
+
+ if (n && *p == ' ') { p++; n--; }
+ if (n && *p == '[') { p++; n--; } else esl_fatal(msg);
+
+ if (! isdigit(*p)) esl_fatal(msg);
+ if (esl_mem_strtoi32(p, n, 10, &nc, &which) != eslOK) esl_fatal(msg);
+ if (which != nline_expected) esl_fatal(msg);
+ p += nc; n -= nc;
+
+ while (n && isspace(*p)) { p++; n--; } if (!n) esl_fatal(msg);
+ if (! isdigit(*p)) esl_fatal(msg);
+ if (esl_mem_strtoi32(p, n, 10, &nc, &which) != eslOK) esl_fatal(msg);
+ if (which != nline_expected) esl_fatal(msg);
+ p += nc; n -= nc;
+
+ if (n && *p == ']') { p++; n--; } else esl_fatal(msg);
+ if (n && *p == ' ') { p++; n--; }
+ if (n != 0) esl_fatal(msg);
+}
+
+static int
+utest_whichline(char *p, esl_pos_t n)
+{
+ char msg[] = "utest_whichline() failed";
+ int which;
+
+ if (esl_memspn(p, n, " \t\r\n") == n) return -1;
+ while (n && isspace(*p)) { p++; n--; }
+ if (n && *p == '[') { p++; n--; } else esl_fatal(msg);
+ if (esl_mem_strtoi32(p, n, 10, NULL, &which) != eslOK) esl_fatal(msg);
+ return which;
+}
+
+static void
+utest_SetOffset(const char *tmpfile, int nlines_expected)
+{
+ char msg[] = "utest_Position() failed";
+ FILE *fp;
+ ESL_BUFFER *bf;
+ char *p;
+ esl_pos_t n;
+ esl_pos_t thisoffset;
+ esl_pos_t testoffset1 = -1;
+ esl_pos_t testoffset2 = -1;
+ int testline1 = -1;
+ int testline2 = -2;
+ int thisline;
+#ifdef HAVE_GZIP
+ char gzipfile[32];
+ char cmd[256];
+#endif
+
+ /* Find offsets of lines ~2000 and ~5000; we'll use these positions as tests. */
+ if (nlines_expected <= 8000) return; /* require at least 8000 lines to do this test */
+ if (esl_buffer_Open(tmpfile, NULL, &bf) != eslOK) esl_fatal(msg);
+ testline1 = -1;
+ thisoffset = esl_buffer_GetOffset(bf);
+ while (esl_buffer_GetLine(bf, &p, &n) == eslOK)
+ {
+ if ((thisline = utest_whichline(p, n)) == -1) continue;
+ if (testline1 == -1 && thisline >= 2000) {
+ testline1 = thisline; testoffset1 = thisoffset;
+ }
+ if (thisline >= 5000) {
+ testline2 = thisline; testoffset2 = thisoffset;
+ break;
+ }
+ thisoffset = esl_buffer_GetOffset(bf);
+ }
+ esl_buffer_Close(bf);
+
+ /* Now we're going to walk through SetOffset()'s various cases;
+ * we'll also exercise Open() while we're at it.
+ */
+ /* Test 1. We have the entire file in bf->mem and SetOffset() is trivial.
+ * Since a file is either slurped or mmap'ed, this is what we expect.
+ */
+ if ( esl_buffer_Open(tmpfile, NULL, &bf) != eslOK) esl_fatal(msg);
+ if ( esl_buffer_SetOffset(bf, testoffset2) != eslOK) esl_fatal(msg);
+ if ( esl_buffer_GetLine(bf, &p, &n) != eslOK) esl_fatal(msg);
+ utest_compare_line(p, n, testline2);
+ esl_buffer_Close(bf);
+
+ /* All subsequent tests are for streams. */
+ /* Test 2. Offset *forward* to line ~2000 (testline1), and read it.
+ * Anchor.
+ * Offset forward again to line ~5000 (testline2), read it.
+ * Anchor (should no-op; first anchor is already in effect)
+ * Offset backward to testline1, read it.
+ * Try to offset back to 0; this should throw eslEINVAL.
+ * (also exercise gzip reading, if we can)
+ */
+#if defined HAVE_GZIP
+ snprintf(gzipfile, 32, "%s.gz", tmpfile);
+ snprintf(cmd, 256, "gzip -c %s 2>/dev/null > %s", tmpfile, gzipfile);
+ if (system(cmd) != 0) esl_fatal(msg);
+ if (esl_buffer_Open(gzipfile, NULL, &bf) != eslOK) esl_fatal(msg);
+ fp = NULL;
+#else
+ if ( (fp = fopen(tmpfile, "r")) == NULL) esl_fatal(msg);
+ if (esl_buffer_OpenStream(fp, &bf) != eslOK) esl_fatal(msg);
+#endif
+ if (esl_buffer_SetOffset(bf, testoffset1) != eslOK) esl_fatal(msg);
+ if (esl_buffer_GetLine(bf, &p, &n) != eslOK) esl_fatal(msg);
+ utest_compare_line(p, n, testline1);
+
+ if (esl_buffer_SetAnchor(bf, testoffset1) != eslOK) esl_fatal(msg);
+ if (esl_buffer_SetOffset(bf, testoffset2) != eslOK) esl_fatal(msg);
+ if (esl_buffer_GetLine(bf, &p, &n) != eslOK) esl_fatal(msg);
+ utest_compare_line(p, n, testline2);
+
+ if (esl_buffer_SetAnchor(bf, testoffset2) != eslOK) esl_fatal(msg);
+ if (esl_buffer_RaiseAnchor(bf, testoffset2) != eslOK) esl_fatal(msg);
+ if (esl_buffer_SetOffset(bf, testoffset1) != eslOK) esl_fatal(msg);
+ if (esl_buffer_GetLine(bf, &p, &n) != eslOK) esl_fatal(msg);
+ utest_compare_line(p, n, testline1);
+
+ esl_exception_SetHandler(&esl_nonfatal_handler);
+ if (esl_buffer_SetOffset(bf, 0) != eslEINVAL) esl_fatal(msg);
+ esl_exception_ResetDefaultHandler();
+
+ esl_buffer_Close(bf);
+ if (fp) fclose(fp);
+
+
+ /* test 3. The remaining case is using fseeko(), which
+ * can only happen on a eslBUFFER_FILE opened in basic mode.
+ */
+#ifdef _POSIX_VERSION
+ if (buffer_OpenFileAs(tmpfile, eslBUFFER_FILE, &bf) != eslOK) esl_fatal(msg);
+ if (esl_buffer_SetOffset(bf, testoffset2) != eslOK) esl_fatal(msg);
+ if (esl_buffer_GetLine(bf, &p, &n) != eslOK) esl_fatal(msg);
+ utest_compare_line(p, n, testline2);
+
+ if (esl_buffer_SetOffset(bf, testoffset1) != eslOK) esl_fatal(msg);
+ if (esl_buffer_GetLine(bf, &p, &n) != eslOK) esl_fatal(msg);
+ utest_compare_line(p, n, testline1);
+ esl_buffer_Close(bf);
+#endif /*_POSIX_VERSION*/
+
+#if defined HAVE_GZIP
+ remove(gzipfile);
+#endif
+
+}
+
+static void
+utest_Get(ESL_BUFFER *bf, int nlines_expected)
+{
+ const char msg[] = "utest_Get() failed";
+ char *p = NULL;
+ esl_pos_t n = 0;
+ int nlines = 0;
+ char line[8192];
+ int lpos = 0;
+ esl_pos_t i;
+ int status;
+
+ while ( (status = esl_buffer_Get(bf, &p, &n)) == eslOK)
+ {
+ for (i = 0; i < n; i++)
+ {
+ if (p[i] == '\n')
+ {
+ nlines++;
+ if (lpos && line[lpos-1] == '\r') lpos--;
+ utest_compare_line(line, lpos, nlines);
+ lpos = 0;
+ i++;
+ break;
+ }
+ else
+ line[lpos++] = p[i];
+ }
+ esl_buffer_Set(bf, p, i);
+ }
+ if (lpos) { nlines++; utest_compare_line(line, lpos, nlines); }
+ if (status != eslEOF) esl_fatal(msg);
+ if (nlines != nlines_expected) esl_fatal(msg);
+}
+
+static void
+utest_GetLine(ESL_BUFFER *bf, int nlines_expected)
+{
+ const char msg[] = "utest_GetLine() failed";
+ char *p = NULL;
+ esl_pos_t n = 0;
+ int nlines = 0;
+ int status;
+
+ while ( (status = esl_buffer_GetLine(bf, &p, &n)) == eslOK)
+ {
+ nlines++;
+ utest_compare_line(p, n, nlines);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+ if (nlines != nlines_expected) esl_fatal(msg);
+ return;
+}
+
+static void
+utest_FetchLine(ESL_BUFFER *bf, int nlines_expected)
+{
+ const char msg[] = "utest_FetchLine() failed";
+ char *p = NULL;
+ esl_pos_t n = 0;
+ int nlines = 0;
+ int status;
+
+ while ( (status = esl_buffer_FetchLine(bf, &p, &n)) == eslOK)
+ {
+ nlines++;
+ utest_compare_line(p, n, nlines);
+ free(p);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+ if (nlines != nlines_expected) esl_fatal(msg);
+ return;
+}
+
+static void
+utest_FetchLineAsStr(ESL_BUFFER *bf, int nlines_expected)
+{
+ const char msg[] = "utest_FetchLineAsStr() failed";
+ char *p = NULL;
+ esl_pos_t n = 0;
+ int nlines = 0;
+ int status;
+
+ while ( (status = esl_buffer_FetchLineAsStr(bf, &p, &n)) == eslOK)
+ {
+ nlines++;
+ utest_compare_line(p, n, nlines);
+ if (p[n] != '\0') esl_fatal(msg);
+ free(p);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+ if (nlines != nlines_expected) esl_fatal(msg);
+ return;
+}
+
+
+static void
+utest_GetToken(ESL_BUFFER *bf, int nlines_expected)
+{
+ char msg[] = "utest_GetToken() failed";
+ const char sep[] = " \t"; /* without newline chars \r\n, GetToken() will return EOL when it reaches end of line. *Next* GetToken() succeeds. */
+ int nlines = 0;
+ char *tok;
+ int which;
+ int nc;
+ esl_pos_t n;
+ int status;
+
+ while ((status = esl_buffer_GetToken(bf, sep, &tok, &n)) == eslOK || status == eslEOL) /* EOL needed for blank lines */
+ { /* each line has two tokens: "[%d" and "%d]" */
+ nlines++;
+ if (status == eslEOL) continue;
+
+ if (*tok == '[') { tok++; n--; } else esl_fatal(msg);
+ if (! isdigit(*tok)) esl_fatal(msg);
+ if (esl_mem_strtoi32(tok, n, 10, &nc, &which) != eslOK) esl_fatal(msg);
+ if (nc != n) esl_fatal(msg);
+ if (which != nlines) esl_fatal(msg);
+
+ if (esl_buffer_GetToken(bf, sep, &tok, &n) != eslOK) esl_fatal(msg);
+ if (! isdigit(*tok)) esl_fatal(msg);
+ if (esl_mem_strtoi32(tok, n, 10, &nc, &which) != eslOK) esl_fatal(msg);
+ if (nc != n-1) esl_fatal(msg);
+ if (which != nlines) esl_fatal(msg);
+ if (*(tok+nc) != ']') esl_fatal(msg);
+
+ if ( (status = esl_buffer_GetToken(bf, sep, &tok, &n)) != eslEOL && status != eslEOF) esl_fatal(msg);
+ if (tok != NULL || n != 0) esl_fatal(msg);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+ if (nlines != nlines_expected) esl_fatal(msg);
+ return;
+}
+
+
+static void
+utest_GetTokenWrapped(ESL_BUFFER *bf, int nlines_expected)
+{
+ char msg[] = "utest_GetTokenWrapped() failed";
+ const char sep[] = " \t\r\n"; /* with newline chars \r\n, GetToken() wraps to next line to find token. */
+ int nlines = 0;
+ char *tok;
+ int which;
+ int nc;
+ esl_pos_t n;
+ int status;
+
+ while ((status = esl_buffer_GetToken(bf, sep, &tok, &n)) == eslOK)
+ { /* each line has two tokens: "[%d" and "%d]" */
+ nlines++;
+
+ if (*tok == '[') { tok++; n--; } else esl_fatal(msg);
+ if (! isdigit(*tok)) esl_fatal(msg);
+ if (esl_mem_strtoi32(tok, n, 10, &nc, &which) != eslOK) esl_fatal(msg);
+ if (nc != n) esl_fatal(msg);
+ if (which > nlines) nlines = which; /* can skip lines that are all newline */
+ else if (which < nlines) esl_fatal(msg);
+
+ if (esl_buffer_GetToken(bf, sep, &tok, &n) != eslOK) esl_fatal(msg);
+ if (! isdigit(*tok)) esl_fatal(msg);
+ if (esl_mem_strtoi32(tok, n, 10, &nc, &which) != eslOK) esl_fatal(msg);
+ if (nc != n-1) esl_fatal(msg);
+ if (which != nlines) esl_fatal(msg);
+ if (*(tok+nc) != ']') esl_fatal(msg);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+ if (nlines > nlines_expected) esl_fatal(msg); /* probably can't happen. can't check for equality though - last line(s) could be blank */
+ return;
+}
+
+static void
+utest_FetchToken(ESL_BUFFER *bf, int nlines_expected)
+{
+ char msg[] = "utest_FetchToken() failed";
+ const char sep[] = " \t";
+ int nlines = 0;
+ char *tok;
+ int which;
+ int nc;
+ esl_pos_t n;
+ int status;
+
+ while ((status = esl_buffer_FetchToken(bf, sep, &tok, &n)) == eslOK || status == eslEOL) /* EOL needed for blank lines */
+ { /* each line has two tokens: "[%d" and "%d]" */
+ nlines++;
+ if (status == eslEOL) { if (tok != NULL) esl_fatal(msg); else continue; }
+
+ if (*tok != '[') esl_fatal(msg);
+ if (! isdigit(*(tok+1))) esl_fatal(msg);
+ if (esl_mem_strtoi32(tok+1, n-1, 10, &nc, &which) != eslOK) esl_fatal(msg);
+ if (nc != n-1) esl_fatal(msg);
+ if (which != nlines) esl_fatal(msg);
+ free(tok);
+
+ if (esl_buffer_FetchToken(bf, sep, &tok, &n) != eslOK) esl_fatal(msg);
+ if (! isdigit(*tok)) esl_fatal(msg);
+ if (esl_mem_strtoi32(tok, n, 10, &nc, &which) != eslOK) esl_fatal(msg);
+ if (nc != n-1) esl_fatal(msg);
+ if (which != nlines) esl_fatal(msg);
+ if (*(tok+nc) != ']') esl_fatal(msg);
+ free(tok);
+
+ if ( (status = esl_buffer_FetchToken(bf, sep, &tok, &n)) != eslEOL && status != eslEOF) esl_fatal(msg);
+ if (tok != NULL || n != 0) esl_fatal(msg);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+ if (nlines != nlines_expected) esl_fatal(msg);
+ return;
+}
+
+
+static void
+utest_FetchTokenAsStrWrapped(ESL_BUFFER *bf, int nlines_expected)
+{
+ char msg[] = "utest_FetchTokenAsStrWrapped() failed";
+ const char sep[] = " \t\r\n";
+ int nlines = 0;
+ char *tok;
+ int which;
+ int nc;
+ esl_pos_t n;
+ int status;
+
+ while ((status = esl_buffer_FetchTokenAsStr(bf, sep, &tok, &n)) == eslOK)
+ { /* each line has two tokens: "[%d" and "%d]" */
+ nlines++;
+
+ if (strlen(tok) != n) esl_fatal(msg);
+ if (*tok != '[') esl_fatal(msg);
+ if (! isdigit(*(tok+1))) esl_fatal(msg);
+ if (esl_mem_strtoi32(tok+1, n-1, 10, &nc, &which) != eslOK) esl_fatal(msg);
+ if (nc != n-1) esl_fatal(msg);
+ if (which > nlines) nlines = which; /* can skip lines that are all newline */
+ else if (which < nlines) esl_fatal(msg);
+ free(tok);
+
+ if (esl_buffer_FetchTokenAsStr(bf, sep, &tok, &n) != eslOK) esl_fatal(msg);
+ if (strlen(tok) != n) esl_fatal(msg);
+ if (! isdigit(*tok)) esl_fatal(msg);
+ if (esl_mem_strtoi32(tok, n, 10, &nc, &which) != eslOK) esl_fatal(msg);
+ if (nc != n-1) esl_fatal(msg);
+ if (which != nlines) esl_fatal(msg);
+ if (*(tok+nc) != ']') esl_fatal(msg);
+ free(tok);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+ if (nlines > nlines_expected) esl_fatal(msg); /* probably can't happen. can't check for equality though - last line(s) could be blank */
+ return;
+}
+
+static void
+utest_Read(void)
+{
+ char msg[] = "utest_Read() failed";
+ char tmpfile[32] = "esltmpXXXXXX";
+ int32_t ntotal = 1000000;
+ int32_t testi = 456789; /* arbitrary */
+ esl_pos_t testoffset = testi * sizeof(int32_t);
+ int32_t i, val;
+ FILE *fp;
+ ESL_BUFFER *bf;
+
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal(msg);
+ for (i = 0; i < 1000000; i++)
+ fwrite(&i, sizeof(int32_t), 1, fp);
+ fclose(fp);
+
+ if (esl_buffer_OpenFile (tmpfile, &bf) != eslOK) esl_fatal(msg);
+ if (esl_buffer_SetOffset(bf, testoffset) != eslOK) esl_fatal(msg);
+ for (i = testi; i < ntotal; i++)
+ {
+ if (esl_buffer_Read(bf, sizeof(int32_t), &val) != eslOK) esl_fatal(msg);
+ if (val != i) esl_fatal(msg);
+ }
+ if (esl_buffer_Read(bf, sizeof(int32_t), &val) != eslEOF) esl_fatal(msg);
+ esl_buffer_Close(bf);
+
+ remove(tmpfile);
+}
+
+
+static void
+utest_OpenFile(const char *tmpfile, int nlines)
+{
+ char msg[] = "utest_OpenFile failed";
+ ESL_BUFFER *bf;
+
+ /* Normal errors */
+ if (esl_buffer_OpenFile("esltmpXYZXYZXYZ", &bf) != eslENOTFOUND || bf == NULL) esl_fatal(msg); else esl_buffer_Close(bf);
+}
+
+static void
+utest_OpenStream(const char *tmpfile, int nlines)
+{
+ char msg[] = "utest_OpenStream failed";
+ ESL_BUFFER *bf;
+
+ /* Exceptions */
+ esl_exception_SetHandler(&esl_nonfatal_handler);
+ if (esl_buffer_OpenStream(NULL, &bf) != eslEINVAL) esl_fatal(msg); else esl_buffer_Close(bf);
+ esl_exception_ResetDefaultHandler();
+}
+
+static void
+utest_OpenPipe(const char *tmpfile, int nlines)
+{
+ ESL_BUFFER *bf;
+ char msg[] = "utest_OpenPipe failed";
+ char goodcmd[] = "cat %s 2>/dev/null";
+ char badcmd[] = "./esltmpXYZXYZXYZ %s 2>/dev/null";
+
+ /* Normal errors */
+ if (esl_buffer_OpenPipe("esltmpXYZXYZXYZ", goodcmd, &bf) != eslENOTFOUND || bf == NULL) esl_fatal(msg); else esl_buffer_Close(bf);
+ if (esl_buffer_OpenPipe(tmpfile, badcmd, &bf) != eslFAIL || bf == NULL) esl_fatal(msg); else esl_buffer_Close(bf);
+}
+
+
+#endif /* eslBUFFER_TESTDRIVE */
+
+/*****************************************************************
+ * 10. Test driver
+ *****************************************************************/
+
+#ifdef eslBUFFER_TESTDRIVE
+/* compile: gcc -g -Wall -I. -L. -o esl_buffer_utest -DeslBUFFER_TESTDRIVE esl_buffer.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_buffer_utest -DeslBUFFER_TESTDRIVE esl_buffer.c -leasel -lm
+ * run: ./esl_buffer_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_buffer.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ {"-n", eslARG_INT, "10000", NULL, NULL, NULL, NULL, NULL, "set number of lines in line-based tests to <n>", 0},
+ {"-s", eslARG_INT, "0", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0},
+ {"-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show verbose commentary/output", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for buffer module";
+
+int
+main(int argc, char **argv)
+{
+ char msg[] = "esl_buffer unit test driver failed";
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = esl_randomness_CreateFast(esl_opt_GetInteger(go, "-s"));
+ ESL_BUFFER *bf = NULL;
+ ESL_BUFFER *bftmp = NULL;
+ FILE *fp = NULL;
+ int be_verbose = esl_opt_GetBoolean(go, "-v");
+ int nlines = esl_opt_GetInteger(go, "-n");
+ char tmpfile[32] = "esltmpXXXXXX";
+ char cmdfmt[] = "cat %s 2>/dev/null";
+ int bufidx, nbuftypes;
+ int testidx, ntesttypes;
+ int status;
+
+ create_testfile_lines(r, tmpfile, nlines);
+ if (be_verbose) printf("created file %s; rng seed %" PRIu32 "\n", tmpfile, esl_randomness_GetSeed(r));
+
+ utest_OpenFile (tmpfile, nlines);
+ utest_OpenStream(tmpfile, nlines);
+ utest_OpenPipe (tmpfile, nlines);
+
+ utest_SetOffset (tmpfile, nlines);
+ utest_Read();
+
+ nbuftypes = 7;
+ ntesttypes = 8;
+ for (bufidx = 0; bufidx < nbuftypes; bufidx++)
+ for (testidx = 0; testidx < ntesttypes; testidx++)
+ {
+ switch (bufidx) {
+ case 0: if (esl_buffer_OpenFile (tmpfile, &bf) != eslOK) esl_fatal(msg); break;
+ case 1: if ( buffer_OpenFileAs(tmpfile, eslBUFFER_ALLFILE, &bf) != eslOK) esl_fatal(msg); break;
+ case 2: if ( buffer_OpenFileAs(tmpfile, eslBUFFER_MMAP, &bf) != eslOK) esl_fatal(msg); break;
+ case 3: if ( buffer_OpenFileAs(tmpfile, eslBUFFER_FILE, &bf) != eslOK) esl_fatal(msg); break;
+ case 4:
+ if ((fp = fopen(tmpfile, "rb")) == NULL) esl_fatal(msg);
+ if (esl_buffer_OpenStream(fp, &bf) != eslOK) esl_fatal(msg);
+ break;
+ case 5:
+ if (esl_buffer_OpenPipe(tmpfile, cmdfmt, &bf) != eslOK) esl_fatal(msg);
+ break;
+ case 6:
+ if (esl_buffer_OpenFile(tmpfile, &bftmp) != eslOK) esl_fatal(msg);
+ if (esl_buffer_SetAnchor(bftmp, 0) != eslOK) esl_fatal(msg);
+ while ( (status = esl_buffer_GetLine(bftmp, NULL, NULL)) == eslOK); /*empty loop, do nothing*/
+ if (status != eslEOF) esl_fatal(msg);
+ /* now bftmp->mem is a slurped file */
+ if (esl_buffer_OpenMem(bftmp->mem, bftmp->n, &bf) != eslOK) esl_fatal(msg);
+ break;
+ default: esl_fatal(msg);
+ }
+
+ switch (testidx) {
+ case 0: utest_Get (bf, nlines); break;
+ case 1: utest_GetLine (bf, nlines); break;
+ case 2: utest_FetchLine (bf, nlines); break;
+ case 3: utest_FetchLineAsStr (bf, nlines); break;
+ case 4: utest_GetToken (bf, nlines); break;
+ case 5: utest_GetTokenWrapped(bf, nlines); break;
+ case 6: utest_FetchToken (bf, nlines); break;
+ case 7: utest_FetchTokenAsStrWrapped(bf, nlines); break;
+ default: esl_fatal(msg);
+ }
+
+ //printf("allocation: %" PRId64 "\n", bf->balloc);
+
+ esl_buffer_Close(bf); bf = NULL;
+ if (fp) { fclose(fp); fp = NULL; }
+ if (bftmp) { esl_buffer_Close(bftmp); bftmp = NULL; }
+ }
+
+ esl_randomness_Destroy(r);
+ esl_getopts_Destroy(go);
+ remove(tmpfile);
+ return 0;
+}
+#endif /* eslBUFFER_TESTDRIVE */
+
+
+/*****************************************************************
+ * 11. Examples.
+ *****************************************************************/
+
+/* compile: gcc -g -Wall -I. -L. -o esl_buffer_example -DeslBUFFER_EXAMPLE esl_buffer.c -leasel -lm
+ * run: ./esl_buffer_example <file>
+ */
+#ifdef eslBUFFER_EXAMPLE
+/*::cexcerpt::buffer_example::begin::*/
+#include "easel.h"
+#include "esl_buffer.h"
+
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int xcount = 0;
+ int linecount = 0;
+ ESL_BUFFER *bf;
+ char *p;
+ esl_pos_t n, i;
+ int status;
+
+ status = esl_buffer_Open(filename, "TESTDIR", &bf);
+ if (status == eslENOTFOUND) esl_fatal("open failed: %s", bf->errmsg);
+ else if (status == eslFAIL) esl_fatal("gzip -dc failed: %s", bf->errmsg);
+ else if (status != eslOK) esl_fatal("open failed with error code %d", status);
+
+ while (( status = esl_buffer_GetLine(bf, &p, &n)) == eslOK)
+ {
+ linecount++;
+ for (i = 0; i < n; i++)
+ if (p[i] == 'x') xcount++;
+ }
+ if (status != eslEOF) esl_fatal("file %s: expected EOF, got code %d", bf->filename, status);
+
+ esl_buffer_Close(bf);
+ printf("Counted %d x's in %d lines.\n", xcount, linecount);
+ return 0;
+}
+/*::cexcerpt::buffer_example::end::*/
+#endif /*eslBUFFER_EXAMPLE*/
+
+
+
+#ifdef eslBUFFER_EXAMPLE2
+/*::cexcerpt::buffer_example2::begin::*/
+#include "easel.h"
+#include "esl_buffer.h"
+
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int xcount = 0;
+ int tokcount = 0;
+ ESL_BUFFER *bf;
+ char *tok;
+ esl_pos_t n, i;
+ int status;
+
+ status = esl_buffer_Open(filename, "TESTDIR", &bf);
+ if (status == eslENOTFOUND) esl_fatal("open failed: %s", bf->errmsg);
+ else if (status == eslFAIL) esl_fatal("gzip -dc failed: %s", bf->errmsg);
+ else if (status != eslOK) esl_fatal("open failed with error code %d", status);
+
+ while ( (status = esl_buffer_GetToken(bf, " \t\r\n", &tok, &n)) == eslOK)
+ {
+ tokcount++;
+ for (i = 0; i < n; i++)
+ if (tok[i] == 'x') xcount++;
+ }
+ if (status != eslEOF) esl_fatal("did not see expected EOF; code %d instead", status);
+ esl_buffer_Close(bf);
+ printf("Counted %d x's in %d words\n", xcount, tokcount);
+ return 0;
+}
+/*::cexcerpt::buffer_example2::end::*/
+#endif /*eslBUFFER_EXAMPLE2*/
+
+
+
+/* compile: gcc -g -Wall -I. -L. -o esl_buffer_example3 -DeslBUFFER_EXAMPLE3 esl_buffer.c -leasel -lm
+ * run: ./esl_buffer_example3 <file>
+ */
+#ifdef eslBUFFER_EXAMPLE3
+/*::cexcerpt::buffer_example3::begin::*/
+#include "easel.h"
+#include "esl_buffer.h"
+
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int xcount = 0;
+ int tokcount = 0;
+ int linecount = 0;
+ ESL_BUFFER *bf;
+ char *tok;
+ esl_pos_t n,i;
+ int status;
+
+ status = esl_buffer_Open(filename, "TESTDIR", &bf);
+ if (status == eslENOTFOUND) esl_fatal("open failed: %s", bf->errmsg);
+ else if (status == eslFAIL) esl_fatal("gzip -dc failed: %s", bf->errmsg);
+ else if (status != eslOK) esl_fatal("open failed with error code %d", status);
+
+ while (1)
+ {
+ status = esl_buffer_GetToken(bf, " \t", &tok, &n);
+ if (status == eslOK)
+ {
+ tokcount++;
+ for (i = 0; i < n; i++)
+ if (tok[i] == 'x') xcount++;
+ }
+ else if (status == eslEOL) linecount++;
+ else if (status == eslEOF) break;
+ }
+ esl_buffer_Close(bf);
+ printf("Counted %d x's in %d words on %d lines\n", xcount, tokcount, linecount);
+ return 0;
+}
+/*::cexcerpt::buffer_example3::end::*/
+#endif /*eslBUFFER_EXAMPLE3*/
+
+
+
+
+/* compile: gcc -g -Wall -I. -L. -o esl_buffer_example4 -DeslBUFFER_EXAMPLE4 esl_buffer.c -leasel -lm
+ * run: ./esl_buffer_example4 <file>
+ */
+#ifdef eslBUFFER_EXAMPLE4
+/*::cexcerpt::buffer_example4::begin::*/
+#include "easel.h"
+#include "esl_buffer.h"
+
+#include <stdio.h>
+#include <string.h>
+
+int main(void)
+{
+ char tmpfile[32] = "esltmpXXXXXX";
+ char s1[] = "hello world!";
+ char s2[] = "... and goodbye!";
+ char buf[256];
+ int n;
+ FILE *fp;
+ ESL_BUFFER *bf;
+ int status;
+
+ esl_tmpfile_named(tmpfile, &fp);
+ n = strlen(s1)+1; fwrite(&n, sizeof(int), 1, fp); fwrite(s1, sizeof(char), n, fp);
+ n = strlen(s2)+1; fwrite(&n, sizeof(int), 1, fp); fwrite(s2, sizeof(char), n, fp);
+ fclose(fp);
+
+ status = esl_buffer_Open(tmpfile, NULL, &bf);
+ if (status == eslENOTFOUND) esl_fatal("open failed: %s", bf ? bf->errmsg : "(no other diagnostics available)");
+ else if (status == eslFAIL) esl_fatal("gzip -dc failed: %s", bf ? bf->errmsg : "(no other diagnostics available)");
+ else if (status != eslOK) esl_fatal("open failed with error code %d", status);
+
+ esl_buffer_Read(bf, sizeof(int), &n);
+ esl_buffer_Read(bf, sizeof(char) * n, buf);
+ puts(buf);
+
+ esl_buffer_Read(bf, sizeof(int), &n);
+ esl_buffer_Read(bf, sizeof(char) * n, buf);
+ puts(buf);
+
+ esl_buffer_Close(bf);
+ return 0;
+}
+/*::cexcerpt::buffer_example4::end::*/
+#endif /*eslBUFFER_EXAMPLE4*/
+
+
+
+
+/* compile: gcc -g -Wall -I. -L. -o esl_buffer_example5 -DeslBUFFER_EXAMPLE5 esl_buffer.c -leasel -lm
+ * run: ./esl_buffer_example5 <fastafile>
+ */
+#ifdef eslBUFFER_EXAMPLE5
+/*::cexcerpt::buffer_example5a::begin::*/
+#include "easel.h"
+#include "esl_buffer.h"
+
+#include <stdio.h>
+#include <ctype.h>
+
+int
+example_read_fasta(ESL_BUFFER *bf, char **ret_name, char **ret_desc, char **ret_seq, int *ret_seqlen)
+{
+ char *seqname = NULL;
+ char *seqdesc = NULL;
+ char *seq = NULL;
+ esl_pos_t seqlen = 0;
+ esl_pos_t salloc = 0;
+ char *p;
+ void *tmp;
+ esl_pos_t n, i;
+ int status;
+
+ if ((status = esl_buffer_Get(bf, &p, &n)) != eslOK) goto ERROR; /* includes normal EOF */
+ if (p[0] != '>') ESL_XFAIL(eslEINVAL, bf->errmsg, "Expected FASTA record to start with >");
+ esl_buffer_Set(bf, p, 1);
+
+ status = esl_buffer_FetchTokenAsStr(bf, " \t", &seqname, NULL);
+ if (status == eslEOF) ESL_XFAIL(eslEINVAL, bf->errmsg, "Premature eof while trying to parse sequence name");
+ else if (status == eslEOL) ESL_XFAIL(eslEINVAL, bf->errmsg, "No sequence name found");
+
+ status = esl_buffer_FetchLineAsStr(bf, &seqdesc, NULL);
+ if (status == eslEOF) goto DONE; /* weird but ok. name, no desc, and a blank sequence. */
+
+ ESL_ALLOC(seq, sizeof(char) * 256);
+ salloc = 256;
+
+ while (esl_buffer_GetLine(bf, &p, &n) == eslOK)
+ {
+ if (p[0] == '>') { esl_buffer_Set(bf, p, 0); break; }
+
+ if (seqlen+n+1 > salloc) {
+ ESL_RALLOC(seq, tmp, sizeof(char) * (seqlen+n+1));
+ salloc = seqlen+n+1;
+ }
+
+ for (i = 0; i < n; i++) {
+ if (! isspace(p[i])) { seq[seqlen++] = p[i]; }
+ }
+ }
+
+ DONE:
+ seq[seqlen] = '\0';
+ *ret_name = seqname;
+ *ret_desc = seqdesc;
+ *ret_seq = seq;
+ *ret_seqlen = seqlen;
+ return eslOK;
+
+ ERROR:
+ if (seqname) free(seqname); *ret_name = NULL;
+ if (seqdesc) free(seqdesc); *ret_desc = NULL;
+ if (seq) free(seq); *ret_seq = NULL;
+ *ret_seqlen = 0;
+ return status;
+}
+/*::cexcerpt::buffer_example5a::end::*/
+
+/*::cexcerpt::buffer_example5b::begin::*/
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ ESL_BUFFER *bf;
+ char *seqname, *seqdesc, *seq;
+ int seqlen;
+ int status;
+
+ status = esl_buffer_Open(filename, "TESTDIR", &bf);
+ if (status == eslENOTFOUND) esl_fatal("open failed: %s", bf ? bf->errmsg : "(no other diagnostics available)");
+ else if (status == eslFAIL) esl_fatal("gzip -dc failed: %s", bf ? bf->errmsg : "(no other diagnostics available)");
+ else if (status != eslOK) esl_fatal("open failed with error code %d", status);
+
+ while ( (status = example_read_fasta(bf, &seqname, &seqdesc, &seq, &seqlen)) == eslOK)
+ {
+ printf("sequence: %20s length: %6d description: %s\n", seqname, seqlen, seqdesc);
+ free(seqname);
+ free(seqdesc);
+ free(seq);
+ }
+ if (status != eslEOF) esl_fatal("bad FASTA format: %s", bf->errmsg);
+ esl_buffer_Close(bf);
+ return 0;
+}
+/*::cexcerpt::buffer_example5b::end::*/
+#endif /*eslBUFFER_EXAMPLE5*/
+
+
+
+/* compile: gcc -g -Wall -I. -L. -o esl_buffer_example6 -DeslBUFFER_EXAMPLE6 esl_buffer.c -leasel -lm
+ * run: ./esl_buffer_example6 <alifile>
+ */
+#ifdef eslBUFFER_EXAMPLE6
+/*::cexcerpt::buffer_example6a::begin::*/
+#include "easel.h"
+#include "esl_buffer.h"
+
+#include <stdio.h>
+#include <ctype.h>
+
+int
+example_read_lineblock(ESL_BUFFER *bf, char ***ret_lines, esl_pos_t **ret_lens, esl_pos_t *ret_nlines)
+{
+ char **lines = NULL;
+ esl_pos_t *lens = NULL;
+ esl_pos_t nlines = 0;
+ char *p;
+ esl_pos_t n;
+ esl_pos_t start_offset;
+ int status;
+
+ /* skip blank lines */
+ do {
+ start_offset = esl_buffer_GetOffset(bf);
+ if ( (status = esl_buffer_GetLine(bf, &p, &n)) != eslOK) goto ERROR; /* includes normal EOF */
+ } while (esl_memspn(p, n, " \t\r\n") == n);
+ /* now p[0..n-1] is a non-blank line, start_offset is offset of p[0], point's on start of next line after it */
+
+ /* anchor stably at start of line block */
+ esl_buffer_SetStableAnchor(bf, start_offset);
+
+ /* set pointers to non-blank lines */
+ do {
+ ESL_REALLOC(lines, sizeof(char *) * (nlines+1));
+ ESL_REALLOC(lens, sizeof(esl_pos_t) * (nlines+1));
+
+ lines[nlines] = p; // cppcheck complains about these assignments: "possible null pointer deference";
+ lens[nlines] = n; // but cppcheck is wrong. ESL_REALLOC will fail if lines[] or lens[] are NULL.
+ nlines++;
+ } while ( (status = esl_buffer_GetLine(bf, &p, &n)) == eslOK && esl_memspn(p, n, " \t\r\n") < n);
+
+ /* now p[0] is on a blank line, and point is on start of next line
+ * after it. you might be fine with that; or you might want to push
+ * the blank line back onto the parser. If so, you need to push
+ * the line back *before* raising the anchor, because the _Set() function
+ * is allowed to relocate the buffer's internal memory.
+ */
+ esl_buffer_Set(bf, p, 0);
+ esl_buffer_RaiseAnchor(bf, start_offset);
+
+ *ret_lines = lines;
+ *ret_lens = lens;
+ *ret_nlines = nlines;
+ return eslOK;
+
+ ERROR:
+ if (lines) free(lines);
+ if (lens) free(lens);
+ *ret_lines = NULL;
+ *ret_lens = NULL;
+ *ret_nlines = 0;
+ return status;
+}
+/*::cexcerpt::buffer_example6a::end::*/
+
+/*::cexcerpt::buffer_example6b::begin::*/
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int blockcount = 0;
+ int linecount = 0;
+ int xcount = 0;
+ int i,j;
+ ESL_BUFFER *bf;
+ char **lines;
+ esl_pos_t *lens;
+ esl_pos_t nlines;
+ int status;
+
+ status = esl_buffer_Open(filename, "TESTDIR", &bf);
+ if (status == eslENOTFOUND) esl_fatal("open failed: %s", bf->errmsg);
+ else if (status == eslFAIL) esl_fatal("gzip -dc failed: %s", bf->errmsg);
+ else if (status != eslOK) esl_fatal("open failed with error code %d", status);
+
+ while ( (status = example_read_lineblock(bf, &lines, &lens, &nlines)) == eslOK)
+ {
+ blockcount++;
+ linecount += nlines;
+ for (i = 0; i < nlines; i++)
+ for (j = 0; j < lens[i]; j++)
+ if (lines[i][j] == 'x') xcount++;
+
+ free(lines);
+ free(lens);
+ }
+ if (status != eslEOF) esl_fatal("bad MSA format: %s", bf->errmsg);
+ esl_buffer_Close(bf);
+ printf("Counted %d x's in %d blocks of %d total lines\n", xcount, blockcount, linecount);
+ return 0;
+}
+/*::cexcerpt::buffer_example6b::end::*/
+#endif /*eslBUFFER_EXAMPLE6*/
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_buffer.h b/esl_buffer.h
new file mode 100644
index 0000000..6180a2a
--- /dev/null
+++ b/esl_buffer.h
@@ -0,0 +1,111 @@
+/* An input parsing abstraction: an input buffer (file, stream, etc.)
+ */
+#ifndef eslBUFFER_INCLUDED
+#define eslBUFFER_INCLUDED
+
+#include <stdio.h>
+
+#define eslBUFFER_PAGESIZE 4096 /* default for b->pagesize */
+#define eslBUFFER_SLURPSIZE 4194304 /* switchover from slurping whole file to mmap() */
+
+enum esl_buffer_mode_e {
+ eslBUFFER_UNSET = 0,
+ eslBUFFER_STREAM = 1, /* chunk in mem[0..n-1] = input[baseoffset..baseoffset-n-1]; balloc>0; offset>=0; fp open */
+ eslBUFFER_CMDPIPE = 2, /* chunk in mem[0..n-1] = input[baseoffset..baseoffset-n-1]; balloc>0; offset>=0; fp open */
+ eslBUFFER_FILE = 3, /* chunk in mem[0..n-1] = input[baseoffset..baseoffset-n-1]; balloc>0; offset>=0; fp open */
+ eslBUFFER_ALLFILE = 4, /* whole file in mem[0..n-1]; balloc=0; offset=0; fp=NULL */
+ eslBUFFER_MMAP = 5, /* whole file in mem[0..n-1]; balloc=0; offset=0; fp=NULL */
+ eslBUFFER_STRING = 6 /* whole str in mem[0..n-1]; balloc=0; offset=0; fp=NULL */
+};
+
+typedef struct {
+ char *mem; /* the buffer */
+ esl_pos_t n; /* curr buf length; mem[0..n-1] contains valid bytes */
+ esl_pos_t balloc; /* curr buf alloc; mem[0..balloc-1] may be used */
+ esl_pos_t pos; /* curr buf parse position; n-pos = # of parseable bytes */
+ esl_pos_t baseoffset; /* offset of byte mem[0] in the stream */
+
+ esl_pos_t anchor; /* buf[anchor..n-1] safe from overwrite [-1=unset] */
+ int nanchor; /* number of anchors set at <anchor> */
+
+ FILE *fp; /* open stream; NULL if already entirely in memory */
+ char *filename; /* for diagnostics. filename; or NULL (stdin, string) */
+ char *cmdline; /* for diagnostics. NULL, or cmd for CMDPIPE */
+
+ esl_pos_t pagesize; /* size of new <fp> reads. Guarantee: n-pos >= pagesize */
+
+ char errmsg[eslERRBUFSIZE]; /* error message storage */
+ enum esl_buffer_mode_e mode_is; /* mode (stdin, cmdpipe, file, allfile, mmap, string) */
+} ESL_BUFFER;
+
+
+/* 1. The ESL_BUFFER object: opening/closing. */
+extern int esl_buffer_Open (const char *filename, const char *envvar, ESL_BUFFER **ret_bf);
+extern int esl_buffer_OpenFile (const char *filename, ESL_BUFFER **ret_bf);
+extern int esl_buffer_OpenPipe (const char *filename, const char *cmdfmt, ESL_BUFFER **ret_bf);
+extern int esl_buffer_OpenMem (const char *p, esl_pos_t n, ESL_BUFFER **ret_bf);
+extern int esl_buffer_OpenStream(FILE *fp, ESL_BUFFER **ret_bf);
+extern int esl_buffer_Close(ESL_BUFFER *bf);
+
+/* 2. Positioning and anchoring an ESL_BUFFER. */
+extern esl_pos_t esl_buffer_GetOffset (ESL_BUFFER *bf);
+extern int esl_buffer_SetOffset (ESL_BUFFER *bf, esl_pos_t offset);
+extern int esl_buffer_SetAnchor (ESL_BUFFER *bf, esl_pos_t offset);
+extern int esl_buffer_SetStableAnchor(ESL_BUFFER *bf, esl_pos_t offset);
+extern int esl_buffer_RaiseAnchor (ESL_BUFFER *bf, esl_pos_t offset);
+
+/* 3. Raw access to the buffer */
+extern int esl_buffer_Get(ESL_BUFFER *bf, char **ret_p, esl_pos_t *ret_n);
+extern int esl_buffer_Set(ESL_BUFFER *bf, char *p, esl_pos_t nused);
+
+/* 4. Line-based parsing */
+extern int esl_buffer_GetLine (ESL_BUFFER *bf, char **opt_p, esl_pos_t *opt_n);
+extern int esl_buffer_FetchLine (ESL_BUFFER *bf, char **opt_p, esl_pos_t *opt_n);
+extern int esl_buffer_FetchLineAsStr(ESL_BUFFER *bf, char **opt_s, esl_pos_t *opt_n);
+
+/* 5. Token-based parsing */
+extern int esl_buffer_GetToken (ESL_BUFFER *bf, const char *sep, char **opt_p, esl_pos_t *opt_n);
+extern int esl_buffer_FetchToken (ESL_BUFFER *bf, const char *sep, char **opt_p, esl_pos_t *opt_n);
+extern int esl_buffer_FetchTokenAsStr(ESL_BUFFER *bf, const char *sep, char **opt_p, esl_pos_t *opt_n);
+
+/* 6. Binary (fread-like) parsing */
+extern int esl_buffer_Read(ESL_BUFFER *bf, size_t nbytes, void *p);
+
+
+
+/* Replaces functionality of esl_fileparser module as follows
+ *
+ * esl_fileparser_Open() -> esl_buffer_Open()
+ * esl_fileparser_Create() -> esl_buffer_OpenStream()
+ * esl_fileparser_CreateMapped() -> esl_buffer_OpenMem()
+ * esl_fileparser_SetCommentChar() -> esl_buffer_SetCommentChar()
+ * esl_fileparser_GetToken() -> esl_buffer_GetToken()
+ * esl_fileparser_NextLine() -> do { esl_buffer_GetLine() } while esl_line_IsBlank();
+ * esl_fileparser_NextLinePeeked() -> unneeded. esl_buffer_Peek*() functionality, syntax different
+ * esl_fileparser_GetTokenOnLine() -> unneeded. esl_buffer_GetToken() has an idiom.
+ * esl_fileparser_GetRemainingLine() -> esl_buffer_GetLine()
+ * esl_fileparser_Destroy() -> esl_buffer_Close()
+ * esl_fileparser_Close() -> esl_buffer_Close()
+ */
+
+/* Replaces functionality of esl_recorder module as follows:
+ *
+ * esl_recorder_Create() -> esl_buffer_OpenStream()
+ * esl_recorder_ResizeTo()
+ * esl_recorder_GetFirst() ->
+ * esl_recorder_GetLast() ->
+ * esl_recorder_GetCurrent() ->
+ * esl_recorder_GetNext() ->
+ * esl_recorder_Destroy() -> esl_buffer_Close()
+ * esl_recorder_Read() -> esl_buffer_GetLine()
+ * esl_recorder_Position()
+ * esl_recorder_MarkBlock()
+ * esl_recorder_UnmarkBlock()
+ * esl_recorder_GetBlock()
+ *
+ */
+
+#endif /*eslBUFFER_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_buffer.tex b/esl_buffer.tex
new file mode 100644
index 0000000..a52a7f9
--- /dev/null
+++ b/esl_buffer.tex
@@ -0,0 +1,456 @@
+The \eslmod{buffer} module provides an abstract layer for building
+input parsers. Different types of input -- including files, standard
+input, piped output from executed commands, C strings, and raw memory
+-- can be handled efficiently in a single API and a single object, an
+\ccode{ESL\_BUFFER}.
+%The API is summarized in Table~\ref{tbl:buffer_api}.
+
+The main rationale for \eslmod{buffer} is to enable multipass parsing
+of any input, even a nonrewindable stream or pipe. A canonical problem
+in sequence file parsing is that we need to know both the format (
+FASTA or Genbank, for instance) and the alphabet (protein or nucleic
+acid, for instance) in order to parse Easel-digitized sequence data
+records. To write ``smart'' parsers that automagically determine the
+file format and alphabet, so programs work transparently on lots of
+different file types without users needing to specify them, we need
+three-pass parsing: one pass to read raw data and determine the
+format, a second pass to parse the format for sequence data and
+determine its alphabet, and finally the actual parsing of digitized
+sequences. Multiple pass parsing of a nonrewindable stream, such as
+standard input or the output of a \ccode{gunzip} call, isn't possible
+without extra support. The \eslmod{buffer} module standardizes that
+support for all Easel input.
+
+\subsection{Examples of using the buffer API}
+
+Here's an example of using \eslmod{buffer} to read a file line by
+line:
+
+\input{cexcerpts/buffer_example}
+
+This shows how to open an input, get each line sequentially, do
+something to each line (here, count the number of x's), and close the
+input. To compile this example, then run it on a file (any file would
+do, but here, \ccode{esl\_buffer.c} itself):
+
+\user{gcc -I. -o esl\_buffer\_example -DeslBUFFER\_EXAMPLE esl\_buffer.c easel.c -lm}
+\user{./esl\_buffer\_example esl\_buffer.c}
+\response{Counted 181 x's in 3080 lines.}
+
+The most important thing to notice here is that
+\ccode{esl\_buffer\_Open()} function implements a standard Easel idiom
+for finding input sources. If the \ccode{filename} argument is a
+single dash '-', it will read from \ccode{stdin}. If the
+\ccode{filename} argument ends in \ccode{.gz}, it will assume the file
+is a \ccode{gzip}-compressed input, and it will decompress it on the
+fly with \ccode{gzip -dc} before reading it. If it does not find the
+\ccode{filename} relative to the current directory, and if the second
+argument (here \ccode{"TESTDIR"}) is non-\ccode{NULL}, it looks at the
+setting of an environment variable \ccode{envvar}, which should
+contain a colon-delimited list of directories to search to try to find
+\ccode{filename}. Therefore all of the following commands will work
+and give the same result:
+
+\begin{userchunk}
+% ./esl_buffer_example esl_buffer.c
+\end{userchunk}
+
+\begin{userchunk}
+ % cat esl_buffer.c | ./esl_buffer_example -
+\end{userchunk}
+
+\begin{userchunk}
+ % cp esl_buffer.c foo
+ % gzip foo
+ % ./esl_buffer_example foo.gz
+\end{userchunk}
+
+\begin{userchunk}
+ % cp esl_buffer.c ${HOME}/mydir2/baz
+ % export TESTDIR=${HOME}/mydir1:${HOME}/mydir2
+ % ./esl_buffer_example baz
+\end{userchunk}
+
+This idiomatic flexibility comes in handy when using biological data.
+Data are are often kept in standard directories on systems (for
+example, we maintain a symlink \ccode{/misc/data0/databases/Uniprot}
+on ours), so having applications look for directory path listings in
+standardized environment variables can help users save a lot of typing
+of long paths. Data files can be big, so it's convenient to be able to
+compress them and not have to decompress them to use them. It's
+convenient to have applications support the power of using UNIX
+command invocations in pipes, chaining the output of one command into
+the input of another, so it's nice to automatically have any
+Easel-based application read from standard input.
+
+A couple of other things to notice about this example:
+
+\begin{enumerate}
+\item If the \ccode{esl\_buffer\_Open()} fails, it still returns a
+ valid \ccode{ESL\_BUFFER} structure, which contains nothing except a
+ user-directed error message \ccode{bf->errmsg}. If you were going to
+ continue past this error, you'd want to \ccode{esl\_buffer\_Close()}
+ the buffer.
+
+\item \ccode{esl\_buffer\_GetLine()} returns a pointer to the start of
+ the next line \ccode{p}, and its length in chars \ccode{n}
+ (exclusive of any newline character). It does \emph{not} return a
+ string - \ccode{p[n]} is \emph{not} a \ccode{NUL} byte
+ \verb+\0+. Standard C string functions, which expect
+ \ccode{NUL}-terminated strings, can't be used on \ccode{p}. The
+ reason is efficiency: the \ccode{ESL\_BUFFER} is potentially looking
+ at a read-only exact image of the input, and
+ \ccode{esl\_buffer\_GetLine()} is not wasting any time making a copy
+ of it. If you need a string, with an appended \verb+\0+ in the
+ right place, see \ccode{esl\_buffer\_FetchLineAsStr()}.
+\end{enumerate}
+
+\subsubsection{Reading tokens}
+
+Because \ccode{ESL\_BUFFER} prefers to give you pointers into a
+read-only image of the input, the standard C \ccode{strtok()} function
+can't be used to define tokens (whitespace-delimited fields, for
+example), because \ccode{strtok()} tries to write a \verb+\0+ byte
+after each token it defines. Therefore \ccode{ESL\_BUFFER} provides
+its own token parsing mechanism. Depending on whether or not you
+include newline characters (\verb+\r\n+) in the list of separator
+(delimiter) characters, it either ignores newlines altogether, or it
+detects newlines separately and expects to find a known number of
+tokens per line.
+
+For example, our x counting program could be implemented to parse
+every token instead of every line:
+
+\input{cexcerpts/buffer_example2}
+
+\user{gcc -I. -o esl\_buffer\_example2 -DeslBUFFER\_EXAMPLE2 esl\_buffer.c easel.c -lm}
+\user{./esl\_buffer\_example2 esl\_buffer.c}
+\response{Counted 181 x's in 14141 words.}
+
+In the \ccode{esl\_buffer\_GetToken()} call, including \verb+\r\n+
+with \verb+" \t"+ in the separators causes newlines to be treated like
+delimiters like any space or tab character. If you omit \verb+\r\n+
+newline characters from the separators, then the parser detects them
+specially anyway; when it sees a newline instead of a token, it
+returns \ccode{eslEOL} and sets the point to the next character
+following the newline. For example, we can count both lines and
+tokens:
+
+\input{cexcerpts/buffer_example3}
+
+\user{gcc -I. -o esl\_buffer\_example3 -DeslBUFFER\_EXAMPLE3 esl\_buffer.c easel.c -lm}
+\user{./esl\_buffer\_example3 esl\_buffer.c}
+\response{Counted 181 x's in 14141 words on 3080 lines.}
+
+What happens if the last line in a text file is missing its terminal
+newline? In the example above, the number of lines would be one fewer;
+the nonterminated last line wouldn't be
+counted. \ccode{esl\_buffer\_GetToken()} would return \ccode{eslEOF}
+on the last line of the file, rather than \ccode{eslEOL} followed by
+\ccode{eslEOF} at its next call as it'd do if the newline were there.
+
+
+\subsubsection{Reading fixed-width binary input}
+
+You can also read fixed-width binary input directly into storage,
+including scalar variables, using the \ccode{esl\_buffer\_Read()}
+call. This is similar to C's \ccode{fread()}:
+
+\input{cexcerpts/buffer_example4}
+
+The \ccode{Read()} call needs to know exactly how many bytes \ccode{n}
+it will read. For variable-width binary input, see the
+\ccode{esl\_buffer\_Get()}/\ccode{esl\_buffer\_Set()} calls.
+
+In fact all inputs are treated by \ccode{ESL\_BUFFER} as binary
+input. That is, platform-dependent newlines are not converted
+automatically to C \verb+\n+ characters, as would happen when using
+the C \ccode{stdio.h} library to read an input stream in ``text
+mode''. You can freely mix different types of \ccode{esl\_buffer\_*}
+parsing calls as you see appropriate.
+
+
+\subsubsection{A more complicated example, a FASTA parser}
+
+An example of a simple FASTA parsing function:
+
+\input{cexcerpts/buffer_example5a}
+
+and an example of using that function in a program:
+
+\input{cexcerpts/buffer_example5b}
+
+One thing to note here is the use of \ccode{esl\_buffer\_Set()} to
+push characters back into the parser. For example, when we look for
+the starting '>', we do a raw \ccode{esl\_buffer\_Get()}, look at the
+first character, then call \ccode{esl\_buffer\_Set()} with
+\ccode{nused=1} to tell the parser we used 1 character of what it gave
+us. This is an idiomatic usage of the
+\ccode{esl\_buffer\_Get()}/\ccode{esl\_buffer\_Set()} pair. The
+\ccode{esl\_buffer\_Get()} call doesn't even move the point until the
+companion \ccode{esl\_buffer\_Set()} tells it where to move to.
+
+The other idiomatic use of \ccode{esl\_buffer\_Set()} is to implement
+a ``peek'' at a next line or a next token, using a
+\ccode{esl\_buffer\_GetLine()}/\ccode{esl\_buffer\_Set()} or
+\ccode{esl\_buffer\_GetToken()}/\ccode{esl\_buffer\_Set()}
+combination. You see this when we're in the sequence reading loop, we
+get a line, and we want to peek at its first character. If it's a '>'
+we're seeing the start of the next sequence, so we want to return
+while leaving the point on the '>'. To do this, we use
+\ccode{esl\_buffer\_GetLine()} to get the line, and if the first char
+is a '>' we use \ccode{esl\_buffer\_Set()} to push the line pointer
+(with 0 used characters) back to the parser.
+
+You can also see examples here of using
+\ccode{esl\_buffer\_FetchTokenAsStr()}
+\ccode{esl\_buffer\_FetchLineAsStr()} to copy the name and description
+directly to allocated, \verb+\0+-terminated C strings. Note how they
+interact: because \ccode{esl\_buffer\_FetchTokenAsStr()} moves the
+point past any trailing separator characters to the start of the next
+token, and because \ccode{esl\_buffer\_FetchLineAsStr()} doesn't need
+the point to be at the start of a line, the
+\ccode{esl\_buffer\_FetchLineAsStr()} call finds the description
+without leading spaces or trailing newline (but with any trailing
+spaces).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\subsection{Using anchors: caller-defined limits on random access}
+
+The naive way to enable random access on a sequential stream is to
+slurp the whole stream into memory. If the stream is large, this may
+be very memory inefficient. Many parsers do not need full random
+access, but instead need a limited form of it -- for instance, the
+three-pass case of determining format and alphabet from the start of a
+sequence file. \ccode{ESL\_BUFFER} allows the caller to define an
+\emph{anchor} to define a start point in the input that is not allowed
+to go away until the caller says so.
+
+Setting an anchor declares that \ccode{mem[anchor..n-1]} is not be
+overwritten by new input reads. A new input read may first relocate
+(``reoffset'') \ccode{mem[anchor..n-1]} to \ccode{mem[0..n-anchor-1]}
+in order to use its current allocation efficiently. Setting an anchor
+may therefore cause \ccode{mem} to be reoffset and/or reallocated, and
+\ccode{balloc} may grow, if the buffer is not large enough to hold
+everything starting from the \ccode{anchor} position. When no anchors
+are set, \ccode{mem} will not be reoffset or reallocated.
+
+If we set an anchor at offset 0 in the input, then the entire input
+will be progressively slurped into a larger and larger allocation of
+memory as we read sequentially. We are guaranteed to be able to
+reposition the buffer anywhere from the anchor to n-1, even in a
+normally nonrewindable, nonpositionable stream. If we've read enough
+to determine what we need (format, alphabet...), we can release the
+anchor, and the buffer's memory usage will stop growing.
+
+The functions that get a defined chunk of memory --
+\ccode{esl\_buffer\_GetLine()}, \ccode{esl\_buffer\_GetToken()}, and
+\ccode{esl\_buffer\_CopyBytes()} -- set an anchor at the start of the
+line, token, or chunk of bytes before they go looking for its end.
+This takes advantage of the anchor mechanism to make sure that the
+buffer will contain the entire line, token, or chunk of bytes, not just a
+truncated part.
+
+
+\subsection{Token-based parsing}
+
+A \esldef{token} is a substring consisting of characters not in a set
+of caller-defined \esldef{separator} characters. Typically, separator
+chararacters might be whitespace (\ccode{" \t"}).
+
+Additionally, newlines are always considered to be separators. Tokens
+cannot include newlines.
+
+In token-based parsing, we can handle newlines in two ways. Sometimes
+we might know exactly how many tokens we expect on the line. Sometimes
+we don't care.
+
+If the caller knows exactly how many tokens are expected on each line
+of the input, it should not include newline characters in its
+separator string. Now, if the caller asks for a token but no token
+remains on the line, it will see a special \ccode{eslEOL} return code
+(and the parser will be positioned at the next character after that
+newline). A caller can check for this deliberately with one last call
+to \ccode{esl\_buffer\_GetToken()} per line, to be sure that it sees
+\ccode{eslEOL} rather than an unexpected token.
+
+If the caller doesn't care how many tokens occur on each line, it
+should include newline characters (\verb+"\r\n"+) in the separator
+string. Then newlines are treated (and skipped) like any other
+separator.
+
+Starting from the current buffer position, the procedure for defining
+a token is:
+
+\begin{itemize}
+\item Skip characters in the separator string. (If end-of-file is
+ reached, return \ccode{eslEOF}.)
+\item If parser is on a newline, skip past it, and return
+ \ccode{eslEOL}. (Note that if the caller had newline characters
+ in the separator string, the first step already skipped any
+ newline, and no \ccode{eslEOL} return is possible.)
+\item Anchor at the current buffer position, \ccode{p}.
+\item From the current point, count characters \emph{not} in the
+ separator, \ccode{n}. (Expand/refill the buffer as needed.)
+\item Define the token: \ccode{p[0..n]}.
+\item Move the current point to the character following the token.
+\end{itemize}
+
+\subsection{Newline handling.}
+
+Easel assumes that newlines are encoded as \verb+\n+ (UNIX, Mac OS/X)
+or \verb+\r\n+ (MS Windows).
+
+All streams are opened as binary data. This is necessary to guarantee
+a one:one correspondence between data offsets in memory and data
+offsets on the filesystem, which we need for file positioning
+purposes. It is also necessary to guarantee that we can read text
+files that have been produced on a system other than the system we're
+reading them on (that we can read Windows text files on a Linux
+system, for example).\footnote{That is, the usual ANSI C convention of
+ reading/writing in ``text mode'' does not suffice, because it
+ assumes the newlines of the system we're on, not necessarily the
+ system that produced the file.} However, it makes us responsible
+for handling system-specific definition of ``newline'' character(s) in
+ASCII text files.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\subsection{Implementation notes (for developers)}
+
+\paragraph{The state guarantee.} An \ccode{ESL\_BUFFER} is exchangeable
+and sharable even amongst entirely different types of parsers because
+it is virtually always guaranteed to be in a well-defined
+state. Specifically:
+
+\begin{itemize}
+\item \ccode{bf->mem[bf->pos]} is ALWAYS positioned at the next byte
+ that a parser needs to parse, unless the buffer is at EOF.
+
+\item There are ALWAYS at least \ccode{pagesize} bytes available to
+ parse, provided the input stream has not reached EOF.
+\end{itemize}
+
+
+\paragraph{State in different input type modes}
+
+There are six types (``modes'') of inputs:
+
+\begin{tabular}{ll}
+ Mode & Description \\ \hline
+\ccode{eslBUFFER\_STDIN} & Standard input. \\
+\ccode{eslBUFFER\_CMDPIPE} & Output piped from a command. \\
+\ccode{eslBUFFER\_FILE} & A \ccode{FILE} being streamed. \\
+\ccode{eslBUFFER\_ALLFILE} & A file entirely slurped into RAM. \\
+\ccode{eslBUFFER\_MMAP} & A file that's memory mapped (\ccode{mmap()}). \\
+\ccode{eslBUFFER\_STRING} & A string or memory. \\ \hline
+\end{tabular}
+
+The main difference between modes is whether the input is being read
+into the buffer's memory in chunks, or whether the buffer's memory
+effectively contains the entire input:
+
+\begin{tabular}{lll}
+ & \ccode{STDIN, CMDPIPE, FILE} & \ccode{ALLFILE, MMAP, STRING} \\
+\ccode{mem} & input chunk: \ccode{mem[0..n-1]} is \ccode{input[baseoffset..baseoffset+n-1]} & entire input: \ccode{mem[0..n-1]} is \ccode{input[0..n-1]} \\
+\ccode{n} & current chunk size & entire input size (exclusive of \verb+\0+ on a \ccode{STRING}) \\
+\ccode{balloc} & $>0$; \ccode{mem} is reallocatable & 0; \ccode{mem} is not reallocated \\
+\ccode{fp} & open; \ccode{feof(fp) = TRUE} near EOF & \ccode{NULL} \\
+\ccode{baseoffset} & offset of byte \ccode{mem[0]} in input & 0 \\
+\end{tabular}
+
+
+\paragraph{Behavior at end-of-input (``end-of-file'', EOF).}
+
+The buffer can three kinds of states with respect to how near to EOF
+it is, as follows.
+
+During normal parsing, \ccode{bf->n - bf->pos >= bf->pagesize}:
+
+\begin{cchunk}
+ mem-> {[. . . . . . . . . . . . . . . .] x x x x}
+ ^ baseoffset ^ pos ^ n ^ balloc
+ [~ ~ ~ ~ ~ ~ ~ ~]
+ n-pos >= pagesize
+\end{cchunk}
+
+As input is nearing EOF, and we are within last <pagesize> bytes,
+\ccode{bf->n - bf->pos < bf->pagesize}:
+
+\begin{cchunk}
+ mem-> {[. . . . . . . . . . . . . . . .] x x x x}
+ ^ baseoffset ^ pos ^ n ^ balloc
+\end{cchunk}
+
+In modes where we might be reading input in streamed chunks
+(\ccode{eslBUFFER\_STDIN}, \ccode{eslBUFFER\_CMDPIPE}
+\ccode{eslBUFFER\_FILE}), \ccode{feof(bf->fp)} becomes \ccode{TRUE}
+when the buffer nears EOF.
+
+When the input is entirely EOF, then \ccode{bf->pos == bf->n}:
+
+\begin{cchunk}
+ mem-> {[. . . . . . . . . . . . . . . .] x x x x}
+ ^ baseoffset ^ n ^ balloc
+ ^ pos
+\end{cchunk}
+
+
+
+
+
+\paragraph{ The use of \ccode{esl\_pos\_t}. }
+
+All integer variables for a position or length in memory or in a file
+are of type \ccode{esl\_pos\_t}. In POSIX, memory positions are an
+unsigned integer type \ccode{size\_t}, and file positions are a signed
+integer type \ccode{off\_t}. Easel wants to assure an integer type
+that we can safely cast to either \ccode{size\_t} or \ccode{off\_t},
+and in which we can safely store a negative number as a status flag
+(such as -1 for ``currently unset''). \ccode{esl\_pos\_t} is defined
+as the largest signed integer type that can be safely cast to
+\ccode{size\_t} or \ccode{off\_t}.
diff --git a/esl_cluster.c b/esl_cluster.c
new file mode 100644
index 0000000..c1385b3
--- /dev/null
+++ b/esl_cluster.c
@@ -0,0 +1,345 @@
+/* Generalized single linkage clustering.
+ *
+ * Table of contents:
+ * 1. Single linkage clustering, generalized
+ * 2. Unit tests
+ * 3. Test driver
+ * 4. Example
+ * 5. Copyright and license
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+
+#include "easel.h"
+#include "esl_cluster.h"
+
+
+/*****************************************************************
+ * 1. Single linkage clustering, generalized
+ *****************************************************************/
+
+/* Function: esl_cluster_SingleLinkage()
+ * Synopsis: Generalized single linkage clustering.
+ * Incept: SRE, Mon Jan 7 08:35:10 2008 [Janelia]
+ *
+ * Purpose: Given a set of vertices, cluster them by single-linkage
+ * clustering.
+ *
+ * The data describing each vertex is provided in an array
+ * starting at <base>, consisting of <n> vertices. Each
+ * vertex can be of any type (structure, scalar, pointer)
+ * so long as each vertex element is of fixed size <n>
+ * bytes.
+ *
+ * A pointer to the clustering function is provided in
+ * <(*linkfunc)()>, and a pointer to any necessary
+ * parameters for that function (for example, any
+ * thresholds) is provided in <param>.
+ *
+ * The <int (*linkfunc)()> must be written by the
+ * caller. It takes arguments <(void *v1, void *v2, void
+ * *param, int *ret_link)>: pointers to two vertices to
+ * test for linkage and a pointer to any necessary
+ * parameters, and it passes the answer <TRUE> (1) or
+ * <FALSE> (0) back in <*ret_link>. The <(*linkfunc)()>
+ * returns <eslOK> (0) on success, and a nonzero error code
+ * on failure (see <easel.h> for a list of Easel's error
+ * codes).
+ *
+ * The caller provides an allocated <workspace> with space
+ * for at least <2n> integers. (Allocation in the caller
+ * allows the caller to reuse memory and save
+ * allocation/free cycles, if it has many rounds of
+ * clustering to do.)
+ *
+ * The caller also provides allocated space in
+ * <assignments> for <n> integers which, upon successful
+ * return, contains assignments of the <0..n-1> vertices to
+ * <0..C-1> clusters. That is, if <assignments[42] = 1>,
+ * that means vertex 42 is assigned to cluster 1. The
+ * total number of clusters is returned in <ret_C>.
+ *
+ * The algorithm runs in $O(N)$ memory; importantly, it
+ * does not require a $O(N^2)$ adjacency matrix. Worst case
+ * time complexity is $O(N^2)$ (multiplied by any
+ * additional complexity in the <(*linkfunc()> itself), but
+ * the worst case (no links at all; <C=n> clusters) should
+ * be unusual. More typically, time scales as about $N \log
+ * N$. Best case is $N$, for a completely connected graph
+ * in which all vertices group into one cluster. (More
+ * precisely, best case complexity arises when vertex 0 is
+ * connected to all other <n-1> vertices.)
+ *
+ * Notes: I don't know if this algorithm is published. I
+ * haven't seen it in graph theory books, but that might
+ * be because it's so obvious that nobody's bothered.
+ *
+ * In brief, we're going to do a breadth-first search of the
+ * graph, and we're going to calculate links on the fly
+ * rather than precalculating them into a standard adjacency
+ * matrix.
+ *
+ * While working, we keep two stacks of maximum length N:
+ * a : list of vertices that are still unconnected.
+ * b : list of vertices that we've connected to
+ * in our current breadth level, but we haven't
+ * yet tested for other connections to a.
+ * The current length (number of elements in) a and b are
+ * kept in na, nb.
+ *
+ * We store our results in an array of length N:
+ * c : assigns each vertex to a component. for example
+ * c[4] = 1 means that vertex 4 is in component 1.
+ * nc is the number of components. Components
+ * are numbered from 0 to nc-1. We return c and nc
+ * to our caller.
+ *
+ * The algorithm is:
+ *
+ * Initialisation:
+ * a <-- all the vertices
+ * na <-- N
+ * b <-- empty set
+ * nb <-- 0
+ * nc <-- 0
+ *
+ * Then:
+ * while (a is not empty)
+ * pop a vertex off a, push onto b
+ * while (b is not empty)
+ * pop vertex v off b
+ * assign c[v] = nc
+ * for each vertex w in a:
+ * compare v,w. If w is linked to v, remove w
+ * from a, push onto b.
+ * nc++
+ * q.e.d.
+ *
+ * Args: base - pointer to array of n fixed-size vertices to be clustered.
+ * n - number of vertices
+ * size - size of each vertex element
+ * linkfunc - pointer to caller's function for defining linked pairs
+ * param - pointer to any data that needs to be provided to <(*linkfunc)>
+ * workspace - caller provides at least 2n*sizeof(int) of workspace
+ * assignments - RETURN: assignments to clusters (caller provides n*sizeof(int) space)
+ * ret_C - RETURN: number of clusters
+ *
+ * Returns: <eslOK> on success; <assignments[0..n-1]> contains cluster assigments
+ * <0..C-1> for each vertex, and <*ret_C> contains the number of clusters
+ * <C>
+ *
+ * Throws: status codes from the caller's <(*linkfunc)> on failure; in this case,
+ * the contents of <*assignments> is undefined, and <*ret_C> is 0.
+ */
+int
+esl_cluster_SingleLinkage(void *base, size_t n, size_t size,
+ int (*linkfunc)(const void *, const void *, const void *, int *), void *param,
+ int *workspace, int *assignments, int *ret_C)
+{
+ int na, *a = NULL; /* stack of available vertices (still unconnected) */
+ int nb, *b = NULL; /* stack of connected but unextended vertices */
+ int nc, *c = NULL; /* array of results: # clusters, assignments to clusters */
+ int v,w; /* indices of vertices */
+ int i; /* counter over the available list */
+ int do_link;
+ int status;
+
+ a = workspace;
+ b = workspace + n;
+ c = assignments;
+
+ for (v = 0; v < n; v++) a[v] = n-v-1; /* initialize by pushing all vertices onto available list (backwards) */
+ na = n;
+ nb = 0;
+ nc = 0;
+
+ while (na > 0) /* while vertices remain unexamined or unclustered: */
+ {
+ v = a[na-1]; na--; /* pop a vertex off a, */
+ b[nb] = v; nb++; /* and push it onto b */
+
+ while (nb > 0) /* while vertices remain unextended: */
+ {
+ v = b[nb-1]; nb--; /* pop vertex off b */
+ c[v] = nc; /* assign it to cluster nc */
+ for (i = na-1; i >= 0; i--) /* backwards, because of deletion/swapping we do*/
+ {
+ if ((status = (*linkfunc)( (char *) base + v*size, (char *) base + a[i]*size, param, &do_link)) != eslOK) goto ERROR;
+ if (do_link)
+ {
+ w = a[i]; a[i] = a[na-1]; na--; /* delete w from a */
+ b[nb] = w; nb++; /* and push it onto b */
+ }
+ }
+ }
+ nc++;
+ }
+
+ *ret_C = nc;
+ return eslOK;
+
+ ERROR:
+ *ret_C = 0;
+ return status;
+}
+/*------------------ end, single linkage clustering -------------*/
+
+
+
+
+
+
+/*****************************************************************
+ * 2. Unit tests
+ *****************************************************************/
+#ifdef eslCLUSTER_TESTDRIVE
+#include <math.h>
+
+static int
+test_linkage_definition(const void *v1, const void *v2, const void *param, int *ret_link)
+{
+ double a = *((double *) v1); /* you have to cast a void ptr before you can dereference it */
+ double b = *((double *) v2);
+ double threshold = *((double *) param);
+
+ *ret_link = ((fabs(a-b) <= threshold) ? TRUE : FALSE);
+ return eslOK;
+}
+
+static void
+utest_singlelinkage(double *testdata, int n, double threshold, int *correct_assignment, int correct_C)
+{
+ int *workspace;
+ int *assignment;
+ int C;
+ int v;
+
+ if ((workspace = malloc(sizeof(int) * n * 2)) == NULL) esl_fatal("allocation failed");
+ if ((assignment = malloc(sizeof(int) * n)) == NULL) esl_fatal("allocation failed");
+
+ if (esl_cluster_SingleLinkage(testdata, n, sizeof(double),
+ test_linkage_definition, &threshold,
+ workspace, assignment, &C) != eslOK) esl_fatal("single linkage clustering failed");
+
+ if (C != correct_C) esl_fatal("expected %d clusters, but got %d\n", correct_C, C);
+ for (v = 0; v < n; v++)
+ if (correct_assignment[v] != assignment[v])
+ esl_fatal("expected vertex %d to be in cluster %d, but it's in %d\n", v, correct_assignment[v], assignment[v]);
+
+ free(workspace);
+ free(assignment);
+}
+#endif /* eslCLUSTER_TESTDRIVE */
+
+
+
+
+/*****************************************************************
+ * 3. Test driver
+ *****************************************************************/
+#ifdef eslCLUSTER_TESTDRIVE
+/* gcc -g -Wall -o test -I. -L. -DeslCLUSTER_TESTDRIVE esl_cluster.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_cluster.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for cluster module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ double vertex[] = { 1.0, 2.0, 4.0, 5.0, 7.0, 8.0 };
+ int na1 = 3, a1[] = { 0, 0, 1, 1, 2, 2 }; /* correct answer when threshold = 1.5 */
+ int na2 = 6, a2[] = { 0, 1, 2, 3, 4, 5 }; /* correct answer when threshold < 1.0 */
+ int na3 = 1, a3[] = { 0, 0, 0, 0, 0, 0 }; /* correct answer when threshold > 2.0 */
+ int n = sizeof(vertex) / sizeof(double);
+
+ utest_singlelinkage(vertex, n, 1.5, a1, na1);
+ utest_singlelinkage(vertex, n, 0.5, a2, na2);
+ utest_singlelinkage(vertex, n, 2.5, a3, na3);
+
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /* eslCLUSTER_TESTDRIVE*/
+
+
+
+
+
+/*****************************************************************
+ * 4. Example
+ *****************************************************************/
+#ifdef eslCLUSTER_EXAMPLE
+/*::cexcerpt::cluster_example::begin::*/
+/* gcc -g -Wall -o example -I. -L. -DeslCLUSTER_EXAMPLE esl_cluster.c easel.c -lm */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_cluster.h"
+
+static int
+my_linkage_definition(const void *v1, const void *v2, const void *param, int *ret_link)
+{
+ double a = *((double *) v1); /* you have to cast a void ptr before you can dereference it */
+ double b = *((double *) v2);
+ double threshold = *((double *) param);
+
+ *ret_link = ((fabs(a-b) <= threshold) ? TRUE : FALSE);
+ return eslOK;
+}
+
+int
+main(int argc, char **argv)
+{
+ double vertex[] = { 1.0, 2.0, 4.0, 5.0, 7.0, 8.0 };
+ int n = sizeof(vertex) / sizeof(double);
+ double threshold = 1.5;
+ int *workspace;
+ int *assignment;
+ int C;
+ int v;
+
+ workspace = malloc(sizeof(int) * n * 2);
+ assignment = malloc(sizeof(int) * n);
+
+ esl_cluster_SingleLinkage(vertex, n, sizeof(double),
+ my_linkage_definition, &threshold,
+ workspace, assignment, &C);
+
+ printf("There are %d clusters.\n", C);
+ for (v = 0; v < n; v++) printf("vertex %d is in cluster %d\n", v, assignment[v]);
+
+ free(workspace);
+ free(assignment);
+ return 0;
+}
+/*::cexcerpt::cluster_example::end::*/
+#endif /*eslCLUSTER_EXAMPLE*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
diff --git a/esl_cluster.h b/esl_cluster.h
new file mode 100644
index 0000000..e1da779
--- /dev/null
+++ b/esl_cluster.h
@@ -0,0 +1,16 @@
+/* Generalized single linkage clustering.
+ *
+ * SRE, Mon Jan 7 09:40:06 2008 [Janelia]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslCLUSTER_INCLUDED
+#define eslCLUSTER_INCLUDED
+
+extern int esl_cluster_SingleLinkage(void *base, size_t n, size_t size,
+ int (*linkfunc)(const void *, const void *, const void *, int *), void *param,
+ int *workspace, int *assignments, int *ret_C);
+#endif /*eslCLUSTER_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_cluster.tex b/esl_cluster.tex
new file mode 100644
index 0000000..8db8c65
--- /dev/null
+++ b/esl_cluster.tex
@@ -0,0 +1,53 @@
+The \eslmod{cluster} module implements a generalized, efficient
+discrete single linkage clustering algorithm.
+
+The clustering algorithm tests for links on the fly, thus avoiding
+construction of an $O(N^2)$ adjacency matrix. This results in an
+algorithm of $O(N)$ memory, $O(N^2)$ time worst-case complexity for
+$N$ vertices. Average case behavior typically scales much better than
+this, as efficiently as $O(N)$ for a densely connected graph that
+forms a single cluster.
+
+In order to work on generalized vertices of any data type, the
+implementation uses an interface akin to that of the C \ccode{qsort()}
+utility: the caller provides a void pointer to an untyped array of
+vertices, the number of vertices, and the size of each vertex data
+element, and a function that can take untyped pointers to two vertices
+and compute whether they are linked or not.
+
+The API is summarized in Table~\ref{tbl:cluster_api}. Only the
+\eslmod{easel} module is required.
+
+% Table generated by autodoc -t esl_cluster.c (so don't edit here, edit esl_cluster.c:)
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\hyperlink{func:esl_cluster_SingleLinkage()}{\ccode{esl\_cluster\_SingleLinkage()}} & Generalized single linkage clustering.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{cluster} API.}
+\label{tbl:cluster_api}
+\end{table}
+
+\subsection{Example of using the msacluster API}
+
+An example of clustering some numbers together, according to their
+difference:
+
+\input{cexcerpts/cluster_example}
+
+The thing to pay most attention to here is the mechanism of dealing
+with vertices via generic untyped pointers; in particular, the way the
+caller-provided linkage-determining function takes its \ccode{void *}
+arguments and immediately casts them back to data types that the
+caller wants to use in computing whether the two vertices are linked.
+
+In the example here, the linkage function needs only one parameter
+from the caller, so a pointer to \ccode{threshold} itself is passed
+into the API. If your linkage function needs more parameters, you
+would define a structure that bundles them together, then pass a
+pointer to that structure into \ccode{esl\_cluster\_SingleLinkage()}.
+
diff --git a/esl_composition.c b/esl_composition.c
new file mode 100644
index 0000000..c8d0252
--- /dev/null
+++ b/esl_composition.c
@@ -0,0 +1,150 @@
+#include "esl_config.h"
+
+#include "easel.h"
+#include "esl_composition.h"
+
+
+/* Function: esl_composition_BL62()
+ *
+ * Purpose: Sets <f> to the background frequencies used in
+ * \citep{Henikoff92} to calculate the BLOSUM62
+ * substitution matrix. Caller provides space in <f>
+ * allocated for at least 20 doubles. The entries are in
+ * alphabetic order A..Y, same as the standard Easel amino
+ * acid alphabet order.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_composition_BL62(double *f)
+{
+ f[0] = 0.074;
+ f[1] = 0.025;
+ f[2] = 0.054;
+ f[3] = 0.054;
+ f[4] = 0.047;
+ f[5] = 0.074;
+ f[6] = 0.026;
+ f[7] = 0.068;
+ f[8] = 0.058;
+ f[9] = 0.099;
+ f[10] = 0.025;
+ f[11] = 0.045;
+ f[12] = 0.039;
+ f[13] = 0.034;
+ f[14] = 0.052;
+ f[15] = 0.057;
+ f[16] = 0.051;
+ f[17] = 0.073;
+ f[18] = 0.013;
+ f[19] = 0.032;
+ return eslOK;
+}
+
+/* Function: esl_composition_WAG()
+ *
+ * Purpose: Sets <f> to the background frequencies used in
+ * \citep{WhelanGoldman01} to calculate the WAG rate
+ * matrix. Caller provides space in <f> allocated for at
+ * least 20 doubles. The entries are in alphabetic order
+ * A..Y, same as the standard Easel amino acid alphabet
+ * order.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_composition_WAG(double *f)
+{
+ f[0] = 0.086628; /* A */
+ f[1] = 0.019308; /* C */
+ f[2] = 0.057045; /* D */
+ f[3] = 0.058059; /* E */
+ f[4] = 0.038432; /* F */
+ f[5] = 0.083252; /* G */
+ f[6] = 0.024431; /* H */
+ f[7] = 0.048466; /* I */
+ f[8] = 0.062029; /* K */
+ f[9] = 0.086209; /* L */
+ f[10] = 0.019503; /* M */
+ f[11] = 0.039089; /* N */
+ f[12] = 0.045763; /* P */
+ f[13] = 0.036728; /* Q */
+ f[14] = 0.043972; /* R */
+ f[15] = 0.069518; /* S */
+ f[16] = 0.061013; /* T */
+ f[17] = 0.070896; /* V */
+ f[18] = 0.014386; /* W */
+ f[19] = 0.035274; /* Y */
+ return eslOK;
+}
+
+/* Function: esl_composition_SW34()
+ *
+ * Purpose: Sets <f> to the background frequencies observed in
+ * Swiss-Prot release 34 (21.2M residues). Caller provides
+ * space in <f> allocated for at least 20 doubles. The
+ * entries are in alphabetic order A..Y, same as the
+ * standard Easel amino acid alphabet order.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_composition_SW34(double *f)
+{
+ f[0] = 0.075520; /* A */
+ f[1] = 0.016973; /* C */
+ f[2] = 0.053029; /* D */
+ f[3] = 0.063204; /* E */
+ f[4] = 0.040762; /* F */
+ f[5] = 0.068448; /* G */
+ f[6] = 0.022406; /* H */
+ f[7] = 0.057284; /* I */
+ f[8] = 0.059398; /* K */
+ f[9] = 0.093399; /* L */
+ f[10] = 0.023569; /* M */
+ f[11] = 0.045293; /* N */
+ f[12] = 0.049262; /* P */
+ f[13] = 0.040231; /* Q */
+ f[14] = 0.051573; /* R */
+ f[15] = 0.072214; /* S */
+ f[16] = 0.057454; /* T */
+ f[17] = 0.065252; /* V */
+ f[18] = 0.012513; /* W */
+ f[19] = 0.031985; /* Y */
+ return eslOK;
+}
+
+
+/* Function: esl_composition_SW50()
+ *
+ * Purpose: Sets <f> to the background frequencies observed in
+ * Swiss-Prot release 50.8 (86.0M residues; Oct 2006).
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_composition_SW50(double *f)
+{
+ f[0] = 0.0787945; /* A */
+ f[1] = 0.0151600; /* C */
+ f[2] = 0.0535222; /* D */
+ f[3] = 0.0668298; /* E */
+ f[4] = 0.0397062; /* F */
+ f[5] = 0.0695071; /* G */
+ f[6] = 0.0229198; /* H */
+ f[7] = 0.0590092; /* I */
+ f[8] = 0.0594422; /* K */
+ f[9] = 0.0963728; /* L */
+ f[10]= 0.0237718; /* M */
+ f[11]= 0.0414386; /* N */
+ f[12]= 0.0482904; /* P */
+ f[13]= 0.0395639; /* Q */
+ f[14]= 0.0540978; /* R */
+ f[15]= 0.0683364; /* S */
+ f[16]= 0.0540687; /* T */
+ f[17]= 0.0673417; /* V */
+ f[18]= 0.0114135; /* W */
+ f[19]= 0.0304133; /* Y */
+ return eslOK;
+}
+
diff --git a/esl_composition.h b/esl_composition.h
new file mode 100644
index 0000000..a87fe66
--- /dev/null
+++ b/esl_composition.h
@@ -0,0 +1,4 @@
+extern int esl_composition_BL62(double *f);
+extern int esl_composition_WAG (double *f);
+extern int esl_composition_SW34(double *f);
+extern int esl_composition_SW50(double *f);
diff --git a/esl_config.h.in b/esl_config.h.in
new file mode 100644
index 0000000..4acefc1
--- /dev/null
+++ b/esl_config.h.in
@@ -0,0 +1,155 @@
+/* esl_config.h.in [input to configure]
+ *
+ * System-dependent configuration of Easel, by autoconf.
+ *
+ * This file should be included in all Easel .c files before
+ * anything else, because it may set #define's that control
+ * behaviour of system includes and system libraries. An example
+ * is large file support.
+ *
+ */
+#ifndef eslCONFIG_INCLUDED
+#define eslCONFIG_INCLUDED
+
+/* Version info.
+ */
+#undef EASEL_VERSION
+#undef EASEL_DATE
+#undef EASEL_COPYRIGHT
+#undef EASEL_LICENSE
+
+/* Large file support
+ * Must precede any header file inclusion.
+ */
+#undef _FILE_OFFSET_BITS
+#undef _LARGE_FILES
+#undef _LARGEFILE_SOURCE
+
+/* Debugging verbosity (0=none;3=most verbose)
+ */
+#undef eslDEBUGLEVEL
+
+/* System headers
+ */
+#undef HAVE_ENDIAN_H
+#undef HAVE_INTTYPES_H
+#undef HAVE_STDINT_H
+#undef HAVE_UNISTD_H
+#undef HAVE_SYS_TYPES_H
+#undef HAVE_STRINGS_H
+
+#undef HAVE_SYS_PARAM_H
+#undef HAVE_SYS_SYSCTL_H
+
+#undef HAVE_EMMINTRIN_H
+#undef HAVE_PMMINTRIN_H
+#undef HAVE_XMMINTRIN_H
+
+#undef HAVE_ALTIVEC_H
+
+/* Types
+ */
+#undef WORDS_BIGENDIAN
+#undef int8_t
+#undef int16_t
+#undef int32_t
+#undef int64_t
+#undef uint8_t
+#undef uint16_t
+#undef uint32_t
+#undef uint64_t
+#undef off_t
+
+/* Optional packages
+ */
+#undef HAVE_LIBGSL
+
+/* Optional parallel implementation support
+ */
+#undef HAVE_SSE2
+#undef HAVE_VMX
+#undef HAVE_MPI
+#undef HAVE_PTHREAD
+
+#undef HAVE_SSE2_CAST
+
+/* Programs */
+#undef HAVE_GZIP
+
+/* Functions */
+#undef HAVE_CHMOD
+#undef HAVE_FSEEKO
+#undef HAVE_FSTAT
+#undef HAVE_GETCWD
+#undef HAVE_GETPID
+#undef HAVE_MKSTEMP
+#undef HAVE_POPEN
+#undef HAVE_PUTENV
+#undef HAVE_STAT
+#undef HAVE_STRCASECMP
+#undef HAVE_SYSCONF
+#undef HAVE_SYSCTL
+#undef HAVE_TIMES
+#undef HAVE_ERFC
+
+#undef HAVE_FUNC_ATTRIBUTE_NORETURN // Compiler supports __attribute__ tag, which we use to help w/ clang static analysis.
+
+/* Function behavior */
+#define eslSTOPWATCH_HIGHRES
+
+/*****************************************************************
+ * Available augmentations.
+ *
+ * If you grab a single module from Easel to use it by itself,
+ * leave all these #undef'd; you have no augmentations.
+ *
+ * If you grab additional Easel .c files, you can enable any
+ * augmentations they provide to other modules by #defining the
+ * modules you have below. Alternatively, you can -D them on
+ * the compile line, as in cc -DeslAUGMENT_SSI -DeslAUGMENT_MSA.
+ *
+ * If you compile and install the complete Easel library, all of these
+ * get #defined automatically by ./configure, plus the eslLIBRARY flag
+ * which means the full library with all augmentations is
+ * available. So, if you steal files from an installed library, just
+ * set these all back to #undef (depending on which files you have).
+ *****************************************************************/
+#undef eslLIBRARY
+
+#ifndef eslLIBRARY
+#undef eslAUGMENT_ALPHABET
+#undef eslAUGMENT_NCBI
+#undef eslAUGMENT_DMATRIX
+#undef eslAUGMENT_FILEPARSER
+#undef eslAUGMENT_GEV
+#undef eslAUGMENT_GUMBEL
+#undef eslAUGMENT_HISTOGRAM
+#undef eslAUGMENT_KEYHASH
+#undef eslAUGMENT_MINIMIZER
+#undef eslAUGMENT_MSA
+#undef eslAUGMENT_RANDOM
+#undef eslAUGMENT_RANDOMSEQ
+#undef eslAUGMENT_SSI
+#undef eslAUGMENT_STATS
+#endif
+
+#ifdef eslLIBRARY
+#define eslAUGMENT_ALPHABET
+#define eslAUGMENT_NCBI
+#define eslAUGMENT_DMATRIX
+#define eslAUGMENT_FILEPARSER
+#define eslAUGMENT_GEV
+#define eslAUGMENT_GUMBEL
+#define eslAUGMENT_HISTOGRAM
+#define eslAUGMENT_KEYHASH
+#define eslAUGMENT_MINIMIZER
+#define eslAUGMENT_MSA
+#define eslAUGMENT_RANDOM
+#define eslAUGMENT_RANDOMSEQ
+#define eslAUGMENT_SSI
+#define eslAUGMENT_STATS
+#endif
+
+
+#endif /*eslCONFIG_INCLUDED*/
+
diff --git a/esl_dirichlet.c b/esl_dirichlet.c
new file mode 100644
index 0000000..3711e83
--- /dev/null
+++ b/esl_dirichlet.c
@@ -0,0 +1,1684 @@
+/* Functions relevant to Beta, Gamma, and Dirichlet densities,
+ * including simple and mixture Dirichlet priors.
+ *
+ * Contents:
+ * 1. The <ESL_MIXDCHLET> object for mixture Dirichlet priors
+ * 2. Dirichlet likelihood functions
+ * 3. Sampling from Dirichlets [with <random>]
+ * 4. Reading mixture Dirichlets from files [with <fileparser>]
+ * 5. Unit tests
+ * 6. Test driver
+ * 7. Example
+ * 8. Copyright and license information
+ *
+ * To-do:
+ * - Fit*() functions should return eslEINVAL on n=0, eslENORESULT
+ * on failure due to small n. Compare esl_gumbel. xref J12/93.
+ * SRE, Wed Nov 27 11:18:12 2013
+ */
+#include <esl_config.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#ifdef eslAUGMENT_MINIMIZER
+#include "esl_minimizer.h"
+#endif
+#ifdef eslAUGMENT_FILEPARSER
+#include "esl_fileparser.h"
+#endif
+#include "esl_vectorops.h"
+#include "esl_stats.h"
+#include "esl_dirichlet.h"
+
+
+/*****************************************************************
+ *# 1. The <ESL_MIXDCHLET> object for mixture Dirichlet priors
+ *****************************************************************/
+
+/* Function: esl_mixdchlet_Create()
+ *
+ * Purpose: Create a new mixture Dirichlet prior with <N> components,
+ * each with <K> parameters.
+ *
+ * Returns: initialized <ESL_MIXDCHLET *> on success.
+ *
+ * Throws: NULL on allocation failure.
+ */
+ESL_MIXDCHLET *
+esl_mixdchlet_Create(int N, int K)
+{
+ int status;
+ ESL_MIXDCHLET *pri = NULL;
+ int q;
+
+ ESL_DASSERT1( (N > 0) );
+ ESL_DASSERT1( (K > 0) );
+
+ ESL_ALLOC(pri, sizeof(ESL_MIXDCHLET));
+ pri->pq = NULL;
+ pri->alpha = NULL;
+
+ ESL_ALLOC(pri->pq, sizeof(double) * N);
+ ESL_ALLOC(pri->alpha, sizeof(double *) * N);
+ pri->alpha[0] = NULL;
+
+ ESL_ALLOC(pri->alpha[0], sizeof(double) * N * K);
+ if (pri->alpha[0] == NULL) goto ERROR; // to silence clang static analysis, which gets overzealous about N=0/K=0 -> NULL result
+ for (q = 1; q < N; q++)
+ pri->alpha[q] = pri->alpha[0] + q*K;
+
+ pri->N = N;
+ pri->K = K;
+ return pri;
+
+ ERROR:
+ esl_mixdchlet_Destroy(pri);
+ return NULL;
+}
+
+/* Function: esl_mixdchlet_PerfectBipartiteMatchExists()
+ * Synopsis: Given a 2D table representing presence of edges between vertices represented by
+ * the rows and columns, test whether a perfect matching exists.
+ * Note 1: this doesn't find a perfect matching, just checks if one exists.
+ * Note 2: written as a private function for use by esl_mixdchlet_Compare
+ * Incept: TW, Fri Nov 6 14:23:23 EST 2009 [janelia]
+ *
+ * Args: A - 2-dimensional square table representing presence of edges between vertices
+ * N - size of that table
+ *
+ * Returns: <eslOK> if a perfect matching exists; <eslFAIL> otherwise.
+ */
+int
+esl_mixdchlet_PerfectBipartiteMatchExists(int **A, int N )
+{
+ /*
+ Basic idea:
+ -Scan through the rows, and create a matching edge any time a row has only
+ one matching column (i.e. a single column with eslOK value)
+ * This is conservative: if the row isn't matched with this column, no perfect matching is possible.
+ -Repeat, this time scanning columns.
+ -Repeat rows then columns - until no rows or columns are found with a single eslOK value.
+
+ -If a row or column is found with no possible matches, then no complete matching is possible.
+ -If a point is reached where all rows and all columns have more than one match, I'm pretty sure a
+ perfect matching is guaranteed.
+ - This is unproven; the intuition is that for any imperfect matching an augmenting path
+ should (I think) exist: it will contain an edge from one unmatched element to a matched
+ element, followed by the existing edge from that element to it's mate, followed by a 2nd
+ edge from that mate to another, and so on.
+
+ It's a O(n^3) algorithm, though it'll typically run fast in practice
+ */
+ int matched_row[N], matched_col[N];
+ esl_vec_ISet(matched_row, N, 0);
+ esl_vec_ISet(matched_col, N, 0);
+
+ int i,j;
+ int unassigned = N;
+ int do_row = 1; // otherwise, do_column
+ while (unassigned > 0) {
+ int changed = 0;
+
+ for (i=0; i<N; i++) {
+ int match_cnt = 0;
+ int match = -1;
+
+ if ( 1 == (do_row == 1 ? matched_row[i] : matched_col[i]) ) continue;
+
+ for (j=0; j<N; j++) {
+ if ( eslOK == (do_row == 1 ? A[i][j] : A[j][i] ) ) {
+ match_cnt++;
+ match = j;
+ }
+ }
+
+ if (match_cnt == 0) return eslFAIL; // mixtures can't possibly match
+ if (match_cnt == 1) { // found a pair s.t. only this col can match this row within tol.
+ changed++;
+ if (do_row == 1 ) {
+ matched_row[i] = matched_col[match] = 1;
+ for (j=0; j<N; j++)
+ A[j][match] = eslFAIL; // don't allow the matched col to match other rows, too.
+ } else {
+ matched_col[i] = matched_row[match] = 1;
+ for (j=0; j<N; j++)
+ A[match][j] = eslFAIL; // don't allow the matched rwo to match other cols, too.
+ }
+ }
+ //if (match_cnt > 1), leave it for a later pass
+ }
+ unassigned -= changed;
+
+ if (changed == 0) { // All had multiple hits, so (I think) we are guaranteed of being able to pick some mapping that will be legal
+ return eslOK;
+ }
+ do_row = 1 - do_row; // flip value
+
+ }
+ //got here, all mapping must've been done
+ return eslOK;
+}
+
+/* Function: esl_mixdchlet_Compare()
+ * Synopsis: Compare two mixture Dirichlets for equality.
+ *
+ * Purpose: Compare mixture Dirichlet objects <d1> and <d2>
+ * for equality. For real numbered values, equality
+ * is defined by <esl_DCompare()> with a fractional
+ * tolerance <tol>.
+ *
+ * Returns: <eslOK> on equality; <eslFAIL> otherwise.
+ */
+int
+esl_mixdchlet_Compare(ESL_MIXDCHLET *d1, ESL_MIXDCHLET *d2, double tol)
+{
+ int i,j;
+ int **A = NULL;
+ int status;
+
+ if (d1->N != d2->N) return eslFAIL;
+ if (d1->K != d2->K) return eslFAIL;
+
+ //set up a 2-D matrix, to store the pairs of components that meet tolerance requirements
+ ESL_ALLOC(A, d1->N * sizeof(int*));
+ for (i = 0; i < d1->N; i++) A[i] = NULL;
+ for (i = 0; i < d1->N; i++) ESL_ALLOC(A[i], d1->N * sizeof(int) );
+
+ // Fill in matrix - OK if component i from d1 is a viable match with component q from d2
+ for (i=0; i<d1->N; i++)
+ {
+ for (j=0; j<d1->N; j++)
+ {
+ A[i][j] = esl_DCompare( d1->pq[i], d2->pq[j], tol);
+ if (A[i][j] == eslOK)
+ A[i][j] = esl_vec_DCompare(d1->alpha[i], d2->alpha[j], d1->K, tol) ;
+ }
+ }
+
+ /* In most cases, there should be only a one-to-one mapping (if
+ * any), which is easy to test. But in the unlikely case of a
+ * many-to-one mapping, we need to do a little more. The problem
+ * amounts to asking whether there exists a perfect bipartite
+ * matching (aka the marriage problem)
+ */
+ status = esl_mixdchlet_PerfectBipartiteMatchExists( A, d1->N);
+
+ /* fallthrough */
+ ERROR:
+ if (A) {
+ for (i = 0; i < d1->N; i++)
+ if (A[i]) free (A[i]);
+ free (A);
+ }
+ return status;
+}
+
+
+
+/* Function: esl_mixdchlet_Copy()
+ * Synopsis: Copy a mixture Dirichlet object.
+ *
+ * Purpose: Copies mixture dirichlet object <d> to <d_dst>.
+ * Both objects are of size <N> and <K>.
+ * <d> is unchanged.
+ *
+ * Returns: <eslOK> on equality; <eslFAIL> otherwise.
+ */
+int
+esl_mixdchlet_Copy(ESL_MIXDCHLET *d, ESL_MIXDCHLET *d_dst)
+{
+ int q;
+
+ if (d->N != d_dst->N) return eslFAIL;
+ if (d->K != d_dst->K) return eslFAIL;
+
+ esl_vec_DCopy(d->pq, d->N, d_dst->pq);
+
+ for (q = 0; q < d->N; q++)
+ esl_vec_DCopy(d->alpha[q], d->K, d_dst->alpha[q]);
+
+ return eslOK;
+}
+
+
+/* Function: esl_mixdchlet_Destroy()
+ *
+ * Purpose: Free's the mixture Dirichlet <pri>.
+ */
+void
+esl_mixdchlet_Destroy(ESL_MIXDCHLET *pri)
+{
+ if (pri == NULL) return;
+ if (pri->pq != NULL) free(pri->pq);
+ if (pri->alpha != NULL) {
+ if (pri->alpha[0] != NULL) free(pri->alpha[0]);
+ free(pri->alpha);
+ }
+ free(pri);
+}
+
+
+/* Function: esl_mixdchlet_Dump()
+ *
+ * Purpose: Dump the mixture Dirichlet <d>.
+ */
+int
+esl_mixdchlet_Dump(FILE *fp, ESL_MIXDCHLET *d)
+{
+ int q; /* counter over mixture components */
+ int i; /* counter over params */
+
+ fprintf(fp, "Mixture Dirichlet: N=%d K=%d\n", d->N, d->K);
+ for (q = 0; q < d->N; q++) {
+ fprintf(fp, "q[%d] %f\n", q, d->pq[q]);
+ for (i = 0; i < d->K; i++)
+ fprintf(fp, "alpha[%d][%d] %f\n", q, i, d->alpha[q][i]);
+ }
+
+ return eslOK;
+}
+
+/* esl_dirichlet_MixturePosterior()
+ *
+ * Purpose: For a count vector <c> of cardinality <K>, and a
+ * mixture Dirichlet prior <pri>. Calculate mix[],
+ * the posterior probability P(q | c) of mixture
+ * component q given the count vector c. Caller must
+ * provide allocated space for <mix>, of length <K>.
+ *
+ * Returns: <eslOK> on success, <mix> contains posterior probabilities of
+ * the Dirichlet components.
+ */
+static int
+esl_dirichlet_MixturePosterior(double *c, int K, ESL_MIXDCHLET *pri, double *mix)
+{
+ int q; /* counter over mixture components */
+ double val;
+
+ for (q = 0; q < pri->N; q++) {
+ if (pri->pq[q] > 0.0) {
+ esl_dirichlet_LogProbData(c, pri->alpha[q], K, &val);
+ mix[q] = val + log(pri->pq[q]);
+ }
+ else
+ {
+ mix[q] = -HUGE_VAL;
+ }
+ }
+
+ esl_vec_DLogNorm(mix, pri->N); /* mix[q] is now P(q|c) */
+
+ return eslOK;
+}
+
+/* Function: esl_mixdchlet_MPParameters()
+ *
+ * Purpose: Parameter estimation for a count vector <c> of cardinality
+ * <K>, and a mixture Dirichlet prior <pri>. Calculates
+ * mean posterior estimates for probability parameters, and
+ * returns them in <p>. Also returns the posterior probabilities
+ * of each Dirichlet mixture component, $P(q \mid c)$, in <mix>.
+ * Caller must provide allocated space for <mix> and <p>, both
+ * of length <K>.
+ *
+ * Returns: <eslOK> on success; <mix> contains posterior probabilities of
+ * the Dirichlet components, and <p> contains mean posterior
+ * probability parameter estimates.
+ *
+ * Throws: <esl_EINCOMPAT> if <pri> has different cardinality than <c>.
+ */
+int
+esl_mixdchlet_MPParameters(double *c, int K, ESL_MIXDCHLET *pri, double *mix, double *p)
+{
+ int q; /* counter over mixture components */
+ int x;
+ double totc;
+ double tota;
+
+ if (K != pri->K) ESL_EXCEPTION(eslEINCOMPAT, "cvec's K != mixture Dirichlet's K");
+
+ /* Calculate mix[], the posterior probability
+ * P(q | c) of mixture component q given the count vector c.
+ */
+ esl_dirichlet_MixturePosterior(c, K, pri, mix);
+
+
+ /* Compute mean posterior estimates for probability parameters
+ */
+ totc = esl_vec_DSum(c, K);
+ esl_vec_DSet(p, K, 0.);
+ for (x = 0; x < K; x++)
+ for (q = 0; q < pri->N; q++)
+ {
+ tota = esl_vec_DSum(pri->alpha[q], K);
+ p[x] += mix[q] * (c[x] + pri->alpha[q][x]) / (totc + tota);
+ }
+ /* should be normalized already, but for good measure: */
+ esl_vec_DNorm(p, K);
+ return eslOK;
+}
+
+
+/* Function: esl_mixdchlet_BILD_score()
+ *
+ * Purpose: Compute the BILD score (sensu Altschul et al PLos Compbio 2010)
+ * for a given count vector <c> of cardinality (alphabet size) <K>,
+ * under a mixture Dirichlet prior <pri>, and a background
+ * character distribution <bg>, also cardinality K. The score is
+ * in bits. Also computes posterior values for (1) Dirichlet mixture
+ * coefficients ($P(q \mid c)$, performed and returned in a previously
+ * allocated array, <mix>).
+ *
+ * Caller must provide allocated space for <mix> (length K), and
+ * <q> (length 1).
+ *
+ * Returns: <eslOK> on success; <mix> contains posterior probabilities of
+ * the Dirichlet components, and <sc> contains the BILD score of
+ * observation under the prior and bg.
+ *
+ * Throws: <esl_EINCOMPAT> if <pri> has different cardinality than <c>.
+ */
+int
+esl_mixdchlet_BILD_score(double *c, int K, int N, ESL_MIXDCHLET *pri,
+ double *mix, double *bg, double *sc)
+{
+ int i; /* counter over mixture components */
+ int j;
+ double tmp;
+ double val;
+ double totc;
+ double tota;
+
+ if (K != pri->K) ESL_EXCEPTION(eslEINCOMPAT, "cvec's K != mixture Dirichlet's K");
+ if (N != pri->N) ESL_EXCEPTION(eslEINCOMPAT, "cvec's N != mixture Dirichlet's N");
+
+ /* Calculate mix[], the posterior probability
+ * P(q | c) of mixture component q given the count vector c.
+ */
+ esl_dirichlet_MixturePosterior(c, K, pri, mix);
+
+
+ /* Compute probability of observing the given count vector
+ * under the mixture Dirichlet prior, which depends on the
+ * posterior.
+ */
+ *sc = 0.0;
+ totc = esl_vec_DSum(c, K);
+ for (i = 0; i < N; i++) {
+ if (mix[i] > 0) {
+ tota = esl_vec_DSum(pri->alpha[i], K);
+ esl_stats_LogGamma(tota, &tmp);
+ val = tmp;
+
+ esl_stats_LogGamma(tota + totc, &tmp);
+ val -= tmp;
+
+ for (j = 0; j < K; j++) {
+ esl_stats_LogGamma(pri->alpha[i][j] + c[j], &tmp);
+ val += tmp;
+ esl_stats_LogGamma(pri->alpha[i][j], &tmp);
+ val -= tmp;
+ }
+
+ *sc += mix[i] * exp(val);
+ }
+ }
+
+ /* At this point, sc holds the Q value from the Altschul paper.
+ * Get the odds ratio by dividing by the product of background
+ * probabilities for observed counts, (accounting for sequence
+ * weighting).
+ */
+ for (j = 0; j < K; j++) {
+ *sc /= pow(bg[j], c[j]);
+ }
+ *sc = log(*sc)*eslCONST_LOG2R;
+
+ return eslOK;
+}
+/*---------------- end, ESL_MIXDCHLET ---------------------------*/
+
+
+/*****************************************************************
+ *# 2. Dirichlet likelihood functions
+ *****************************************************************/
+
+/* Function: esl_dirichlet_LogProbData()
+ *
+ * Purpose: Given an observed count vector $c[0..K-1]$,
+ * and a simple Dirichlet density parameterized by
+ * $\alpha[0..K-1]$;
+ * calculate $\log P(c \mid \alpha)$.
+ *
+ * This is $\int P(c \mid p) P(p \mid \alpha) dp$,
+ * an integral that can be solved analytically.
+ *
+ * Args: c - count vector, [0..K-1]
+ * alpha - Dirichlet parameters, [0..K-1]
+ * K - size of c, alpha vectors
+ * ret_answer - RETURN: log P(c | \alpha)
+ *
+ * Returns: <eslOK> on success, and puts result $\log P(c \mid \alpha)$
+ * in <ret_answer>.
+ */
+int
+esl_dirichlet_LogProbData(double *c, double *alpha, int K, double *ret_answer)
+{
+ double lnp;
+ double sum1, sum2, sum3;
+ double a1, a2, a3;
+ int x;
+
+ sum1 = sum2 = sum3 = lnp = 0.0;
+ for (x = 0; x < K; x++)
+ {
+ sum1 += c[x] + alpha[x];
+ sum2 += alpha[x];
+ sum3 += c[x];
+ esl_stats_LogGamma(alpha[x] + c[x], &a1);
+ esl_stats_LogGamma(c[x] + 1., &a2);
+ esl_stats_LogGamma(alpha[x], &a3);
+ lnp += a1 - a2 - a3;
+ }
+ esl_stats_LogGamma(sum1, &a1);
+ esl_stats_LogGamma(sum2, &a2);
+ esl_stats_LogGamma(sum3 + 1., &a3);
+ lnp += a2 + a3 - a1;
+
+ *ret_answer = lnp;
+ return eslOK;
+}
+
+/* Function: esl_dirichlet_LogProbData_Mixture()
+ *
+ * Purpose: Given an observed count vector $c[0..K-1]$,
+ * and a mixture Dirichlet density parameterized by
+ * $\alpha_1[0..K-1]$ ... $\alpha_N[0..K-1]$,
+ * calculate $\log \sum_i pq_i * P(c \mid \alpha_i)$.
+ *
+ *
+ * Args: c - count vector, [0..K-1]
+ * d - Dirichlet parameters, [0..K-1]
+ * ret_answer - RETURN: log P(c | \alpha)
+ *
+ * Returns: <eslOK> on success, and puts result $\log P(c \mid \alpha)$
+ * in <ret_answer>.
+ *
+ * Throws: <eslEMEM> on allocation error. Now <*ret_answer> is
+ * <-eslINFINITY>.
+ */
+int
+esl_dirichlet_LogProbData_Mixture(double *c, ESL_MIXDCHLET *d, double *ret_answer)
+{
+ double *mixq = NULL;
+ double lnp;
+ double val;
+ int q; /* counter over mixture components */
+ int status;
+
+ ESL_ALLOC(mixq, sizeof(double)*d->N);
+
+ for (q = 0; q < d->N; q++) {
+ esl_dirichlet_LogProbData(c, d->alpha[q], d->K, &val);
+ mixq[q] = val + log(d->pq[q]);
+ }
+ lnp = esl_vec_DLogSum(mixq, d->N);
+
+ free(mixq);
+
+ *ret_answer = lnp;
+ return eslOK;
+
+ ERROR:
+ free(mixq);
+ *ret_answer = -eslINFINITY;
+ return status;
+}
+
+
+/* esl_dirichlet_LogProbDataSet_Mixture()
+ *
+ * Purpose: Given an observed set of count vectors $c[0..N-1][0..K-1]$,
+ * and a mixture Dirichlet density parameterized by
+ * $\alpha_1[0..K-1]$ ... $\alpha_N[0..K-1]$,
+ * calculate $ \sum_n \log \sum_i pq_i * P(c[n] \mid \alpha_i)$.
+ * This is a convenience function, which simply wraps
+ * esl_dirichlet_LogProbData_Mixture
+ *
+ * Args: ntrials - number of count vectors (aka N)
+ * counts - count vector set, [0..N-1][0..K-1]
+ * md - Dirichlet parameters
+ * ret_answer - RETURN: log P(c | \alpha)
+ *
+ * Returns: <eslOK> on success, and puts result $\log P(c \mid \alpha)$
+ * in <ret_answer>.
+ *
+ * Throws: <eslEMEM> on allocation error. Now <*ret_answer> is
+ * <-eslINFINITY>.
+ */
+static int
+esl_dirichlet_LogProbDataSet_Mixture(int ntrials, double** counts, ESL_MIXDCHLET* md, double *ret_answer)
+{
+ double val;
+ int i;
+ int status;
+
+ *ret_answer = 0;
+ for (i = 0; i < ntrials; i++)
+ {
+ if (( status = esl_dirichlet_LogProbData_Mixture(counts[i], md, &val)) != eslOK) goto ERROR;
+ *ret_answer += val;
+ }
+ return eslOK;
+
+ ERROR:
+ *ret_answer = -eslINFINITY;
+ return status;
+}
+
+/* Function: esl_dirichlet_LogProbProbs()
+ *
+ * Purpose: Given Dirichlet parameter vector <alpha> and a probability
+ * vector <p>, both of cardinality <K>; return
+ * $\log P(p \mid alpha)$.
+ *
+ * Returns: <eslOK> on success, and the result is in <ret_answer>.
+ *
+ * Xref: Sjolander (1996) appendix, lemma 2.
+ */
+int
+esl_dirichlet_LogProbProbs(double *p, double *alpha, int K, double *ret_answer)
+{
+ double sum; /* for Gammln(|alpha|) in Z */
+ double logp; /* RETURN: log P(p|alpha) */
+ double val;
+ int x;
+
+ sum = logp = 0.0;
+ for (x = 0; x < K; x++)
+ if (p[x] > 0.0) /* any param that is == 0.0 doesn't exist */
+ {
+ esl_stats_LogGamma(alpha[x], &val);
+ logp -= val;
+ logp += (alpha[x]-1.0) * log(p[x]);
+ sum += alpha[x];
+ }
+ esl_stats_LogGamma(sum, &val);
+ logp += val;
+ *ret_answer = logp;
+ return eslOK;
+}
+/*----------- end, Dirichlet likelihood functions ---------------*/
+
+/*****************************************************************
+ * Dirichlet Maximum likelihood fit from counts
+ *****************************************************************/
+
+#ifdef eslAUGMENT_MINIMIZER
+/* This structure is used to sneak the data into minimizer's generic
+ * (void *) API for all aux data
+ */
+struct mixdchlet_data {
+ ESL_MIXDCHLET *d; /* the dirichlet mixture parameters */
+ double **c; /* count vector array [0..nc-1][0..alphabet_size(d->K)] */
+ int nc; /* number of count samples */
+};
+
+/*****************************************************************
+ * Parameter vector packing/unpacking
+ *
+ * The conjugate gradient code takes a single parameter vector <p>,
+ * where the values are unconstrained real numbers.
+ *
+ * We have a mixture Dirichlet with two kinds of parameters.
+ * pq_i are mixture coefficients, constrained to be >= 0 and
+ * \sum_i pq_i = 1. alpha^i_x are the Dirichlet parameters
+ * for component i, constrained to be > 0.
+ *
+ * Our p's are therefore not only packed into a single vector;
+ * they're reparameterized to implement the constraints:
+ * for a Dirichlet parameter:
+ * alpha = exp(p) p = log(alpha)
+ * (thus, alpha > 0 for all real p)
+ *
+ * for a mixture coefficient:
+ * pq = exp(-exp(p)) / \sum_a exp(-exp(p_a))
+ * (thus, 0 < pq < 1 and \sum_a pq_a = 1, for all real p)
+ *
+ * In my hands (ER), this parametrization works better that
+ * pq = exp(p) / \sum_a exp(p_a)
+ *
+ * Conjugate gradients optimizes the <p> parameter vector,
+ * but we can convert that back out into a Dirichlet answer.
+ *
+ * The packing order is: the first N terms of a parameter vector are
+ * the mixture coefficients pq_i. N different alpha_i vectors follow.
+ *
+ * [0 ... N-1] [0 ... K-1] [0 ... K-1] ...
+ * q's alpha_0 alpha_1 ...
+ *
+ * In both functions below, p, pq, and alpha are all allocated
+ * and free'd by the caller.
+ * p : length N + N*K = N*(K+1) [0.. N*(K+1)-1]
+ * pq : length N, [0..N-1]
+ * alpha : length NxK, [0..N-1][0..K-1].
+ *
+ * Special cases:
+ *
+ * - For (N >= 1 && K == 1) there is nothing to optimize.
+ *
+ * - For (N == 1 && K > 1) the only variables to optimize are the K alphas
+ *
+ * [0 ... K-1]
+ * alpha
+ *
+ * p : length N*K = N*K [0.. N*K-1]
+ * alpha : length NxK, [0][0..K-1].
+ *
+ */
+static void
+mixdchlet_pack_paramvector(double *p, int np, ESL_MIXDCHLET *d)
+{
+ int nq; /* number the mixture components to optimize */
+ int q; /* counter over mixture components */
+ int x; /* counter in alphabet size */
+
+ nq = (d->N > 1)? d->N : 0;
+
+ /* the mixture coeficients */
+ for (q = 0; q < nq; q++)
+ p[q] = log(d->pq[q]);
+ //p[q] = log(-log(d->pq[q])); TW changed to the above; this was causing fit to fail
+
+ /* the dirichlet parameters */
+ for (q = 0; q < d->N; q++)
+ for (x = 0; x < d->K; x++)
+ p[nq + q*d->K + x] = log(d->alpha[q][x]);
+
+}
+
+/* Same as above but in reverse: given parameter vector <p>,
+ * do appropriate c.o.v. back to desired parameter space, and
+ * update the mixdchlet <d>.
+ */
+static void
+mixdchlet_unpack_paramvector(double *p, int np, ESL_MIXDCHLET *d)
+{
+ int nq; /* number the mixture components to optimize */
+ int q; /* counter over mixture components */
+ int x; /* counter in alphabet size */
+
+ nq = (d->N > 1)? d->N : 0;
+
+ /* the mixture coeficients */
+ for (q = 0; q < nq; q++)
+ d->pq[q] = exp(p[q]);
+ //d->pq[q] = exp(-exp(p[q])); TW changed to the above; this was causing fit to fail
+ esl_vec_DNorm(d->pq, d->N);
+
+ /* the dirichlet parameters */
+ for (q = 0; q < d->N; q++)
+ for (x = 0; x < d->K; x++)
+ d->alpha[q][x] = exp(p[nq + q*d->K + x]);
+
+ /*esl_mixdchlet_Dump(stdout, d);*/
+
+}
+
+/* The log likelihood function to be optimized by ML fitting:
+ * This needs to be careful of a case where a lambda = inf.
+ */
+static double
+mixdchlet_complete_func(double *p, int np, void *dptr)
+{
+ struct mixdchlet_data *data = (struct mixdchlet_data *) dptr;
+ ESL_MIXDCHLET *d = data->d;
+ double logPsample;
+ double logP = 0.;
+ int m; /* counter over count samples */
+
+ mixdchlet_unpack_paramvector(p, np, d);
+
+ for (m = 0; m < data->nc; m++) {
+ esl_dirichlet_LogProbData_Mixture(data->c[m], d, &logPsample);
+ logP += logPsample;
+ }
+
+ if (isnan(logP)) esl_fatal("logP is NaN");
+ return -logP;
+}
+
+/* The gradient of the NLL w.r.t. each free parameter in p.
+ * Modified by ER 11/03/09 to compute derivative of log(alpha) instead of alpha
+ * (committed by TW)
+ */
+static void
+mixdchlet_complete_gradient(double *p, int np, void *dptr, double *dp)
+{
+ struct mixdchlet_data *data = (struct mixdchlet_data *) dptr;
+ ESL_MIXDCHLET *d = data->d;
+ double sum_alpha; /* \sum_x alpha[q][x] */
+ double sum_c; /* \sum_x c[m][x] */
+ double val; /* val is p_q * P(c_m | alpha_q) */
+ double *valsum; /* valsum is sum_q [p_q * P(c_m | alpha_q)] */
+ double term; /* term is q * P(alpha_q | c_m) */
+ double psi1; /* Psi(sum_alpha[q]) */
+ double psi2; /* Psi(sum_alpha[q] + sum_c[m]) */
+ double psi3; /* Psi(sum_alpha[q][x]+ c[m][x]) */
+ double psi4; /* Psi(sum_alpha[q][x]) */
+ int nq; /* number the mixture components to optimize */
+ int m; /* counter over count samples */
+ int q; /* counter over mixture components */
+ int x; /* counter in alphabet size */
+
+ nq = (d->N > 1)? d->N : 0;
+
+ mixdchlet_unpack_paramvector(p, np, d);
+
+ /* initialize */
+ valsum = malloc(sizeof(double) * data->nc);
+ esl_vec_DSet(dp, np, 0.0);
+
+ /* Some precalculation of sums for efficiency.
+ * valsum is sum_q [p_q * P(c_m | alpha_q)]
+ */
+ for (m = 0; m < data->nc; m++)
+ esl_dirichlet_LogProbData_Mixture(data->c[m], d, &(valsum[m]));
+
+ for (q = 0; q < d->N; q++) {
+
+ sum_alpha = esl_vec_DSum(d->alpha[q], d->K);
+ esl_stats_Psi(sum_alpha, &psi1); /* psi1 = Psi(sum_alpha[q]) */
+
+ for (m = 0; m < data->nc; m++) {
+ sum_c = esl_vec_DSum(data->c[m], d->K);
+ esl_stats_Psi(sum_alpha+sum_c, &psi2); /* psi2 = Psi(sum_alpha[q] + sum_c[m]) */
+
+ /* val is pq * P(c_m | alpha_q) */
+ esl_dirichlet_LogProbData(data->c[m], d->alpha[q], d->K, &val);
+
+
+ /* derivative respect to the mixture coeficients */
+ /* term is pq * P(alpha_q | c_m) */
+ term = exp(val - valsum[m] + log(d->pq[q]));
+ if (nq > 0) dp[q] += term - d->pq[q];
+
+
+ /* derivative respect to the dirichlet parameters */
+ for (x = 0; x < d->K; x++) {
+ esl_stats_Psi(d->alpha[q][x]+data->c[m][x], &psi3); /* psi3 = Psi(sum_alpha[q][x]+ c[m][x]) */
+ esl_stats_Psi(d->alpha[q][x], &psi4); /* psi4 = Psi(sum_alpha[q][x]+ c[m][x]) */
+
+ dp[nq + q*d->K + x] += term * d->alpha[q][x] * (psi1 - psi2 + psi3 - psi4);
+
+
+ }
+ }
+ }
+
+
+
+ /* Return the negative, because we're minimizing the NLP, not maximizing.
+ */
+ for (q = 0; q < nq; q++) {
+ if (isnan(dp[q])) esl_fatal("dp for pq[%d] is NaN", q);
+ dp[q] *= -1.;
+ }
+ for (q = 0; q < d->N; q++)
+ for (x = 0; x < d->K; x++) {
+ if(isnan(dp[nq + q*d->K + x])) esl_fatal("dp for alpha[%d][%d] is NaN", q, x);
+ dp[nq + q*d->K + x] *= -1.0;
+ }
+
+ free(valsum);
+ }
+
+/* Function: esl_mixdchlet_Fit()
+ *
+ * Purpose: Given a count vector <c>, and an initial guess <d> for
+ * a mixdchlet, find maximum likelihood parameters
+ * by conjugate gradient descent optimization, starting
+ * from <d> and leaving the final optimized solution in
+ * <d>.
+ *
+ * Returns: <eslOK> on success, and <d> contains the fitted
+ * mixdchlet parameters.
+ *
+ * Throws: <eslEMEM> on allocation error, and <d> is left in
+ * in its initial state.
+ */
+int
+esl_mixdchlet_Fit(double **c, int nc, ESL_MIXDCHLET *d, int be_verbose)
+{
+ struct mixdchlet_data data;
+ double *p = NULL;
+ double *u = NULL;
+ double *wrk = NULL;
+ double tol;
+ double fx;
+ int np; /* number of parameters to optimize */
+ int nq; /* number the mixture components to optimize */
+ int i;
+ int status;
+
+ /* nothing to optimize for a dirichlet of K = 1 (alphabet size = 1)*/
+ if (d->K == 1) return eslOK;
+
+ tol = 1e-6;
+
+ /* Allocate parameters
+ */
+ nq = (d->N > 1)? d->N : 0;
+ np = nq + d->N*d->K;
+ ESL_ALLOC(p, sizeof(double) * np);
+ ESL_ALLOC(u, sizeof(double) * np);
+ ESL_ALLOC(wrk, sizeof(double) * np * 4);
+
+ /* Copy shared info into the "data" structure
+ */
+ data.d = d;
+ data.c = c;
+ data.nc = nc;
+
+ /* From d, create the parameter vector.
+ */
+ mixdchlet_pack_paramvector(p, np, d);
+
+ /* Define the step size vector u.
+ */
+ for (i = 0; i < np; i++) u[i] = 0.1;
+
+ /* Feed it all to the mighty optimizer.
+ */
+ status = esl_min_ConjugateGradientDescent(p, u, np,
+ &mixdchlet_complete_func,
+ &mixdchlet_complete_gradient,
+ (void *) (&data), tol, wrk, &fx);
+ if (status != eslOK && status != eslENOHALT) // eslENOHALT? Then take what we've got - it's probably pretty good
+ goto ERROR;
+
+ /* Convert the final parameter vector back to a mixdchlet
+ */
+ mixdchlet_unpack_paramvector(p, np, d);
+
+ free(p);
+ free(u);
+ free(wrk);
+ return eslOK;
+
+ ERROR:
+ if (p != NULL) free(p);
+ if (u != NULL) free(u);
+ if (wrk != NULL) free(wrk);
+ return status;
+}
+
+
+#ifdef eslAUGMENT_RANDOM
+/* Function: esl_mixdchlet_Fit_Multipass()
+ *
+ * Purpose: Given a set of count vectors <c>, find maximum
+ * likelihood mixdchlet parameters. A number <reps>
+ * of initial guesses <d> for a mixdchlet are used,
+ * with conjugate gradient descent performed for
+ * each guess. The mixdchlet returned is the one
+ * among these multiple local searches with
+ * best likelihood. This is a convenience
+ * function, which simply wraps <esl_mixdchlet_Fit()>
+ * for multiple start points.
+ *
+ * Args: r - pointer to random generator
+ * c - set of count vectors, [0..M-1][0..N-1]
+ * nc - number of count samples
+ * reps - number of random starting points
+ * best_md - an initialized mixdchlet, which will
+ * contain the correct q and alpha values
+ * at completion
+ * verbose - if >0, output is verbose
+ *
+ * Returns: <eslOK> on success, and <best_md> contains the fitted
+ * mixdchlet parameters with best likelihood.
+ *
+ * Throws: <eslEMEM> on allocation error, and the state of <best_md>
+ * is undefined.
+ */
+int
+esl_mixdchlet_Fit_Multipass(ESL_RANDOMNESS *rng, double **c, int nc, int reps, ESL_MIXDCHLET *best_md, int verbose)
+{
+ ESL_MIXDCHLET *md = esl_mixdchlet_Create(best_md->N, best_md->K);
+ double best_lk = -eslINFINITY;
+ int err_cnt = 0;
+ int i, q, k;
+ double lk;
+ int status;
+
+ for (i = 0; i < reps; i++)
+ {
+ /* for each pass, establish a new random starting point */
+ if (( status = esl_dirichlet_DSampleUniform(rng, md->N, md->pq)) != eslOK) goto ERROR;
+ for (q = 0; q < md->N; q++)
+ for (k = 0; k < md->K; k++)
+ md->alpha[q][k] = 10.0 * esl_rnd_UniformPositive(rng);
+
+ /* then use Fit to do local search */
+ status = esl_mixdchlet_Fit(c, nc, md, 0);
+ if (status != eslOK) {
+ err_cnt++;
+ if (err_cnt==2*reps) {
+ goto ERROR;
+ } else {
+ i--; /* try another starting point */
+ continue;
+ }
+ }
+ esl_dirichlet_LogProbDataSet_Mixture (nc, c, md, &lk);
+
+ if (verbose)
+ {
+ fprintf(stderr, "Repetition # %d\n------------\n", i);
+ esl_mixdchlet_Dump(stderr, md);
+ fprintf(stderr, "llk = %.3f (vs best = %.3f)\n", lk, best_lk);
+ }
+
+ if (lk > best_lk)
+ {
+ if (verbose) fprintf(stderr, "... so copy md -> best_md\n");
+ best_lk = lk;
+ esl_mixdchlet_Copy(md, best_md);
+ }
+ }
+
+ if (verbose)
+ {
+ fprintf(stdout, "\n\n----------------\nbest mixture:\n");
+ esl_mixdchlet_Dump(stdout, best_md);
+ fprintf(stdout, "llk = %.3f", best_lk);
+ }
+
+ esl_mixdchlet_Destroy(md);
+ return eslOK;
+
+ ERROR:
+ esl_mixdchlet_Destroy(md);
+ return status;
+}
+#endif /*eslAUGMENT_RANDOM*/
+
+#endif /*eslAUGMENT_MINIMIZER*/
+/*----------- end, Dirichlet Maximum likelihood fit from counts ---------------*/
+
+
+/*****************************************************************
+ *# 3. Sampling from Dirichlets: requires <esl_random>
+ *****************************************************************/
+#ifdef eslAUGMENT_RANDOM
+
+/* Function: esl_dirichlet_DSample()
+ *
+ * Purpose: Given a Dirichlet density parameterized by $\alpha[0..K-1]$,
+ * sample a probability vector $p[0..K-1]$ from
+ * $P(p \mid \alpha)$.
+ *
+ * Args: r - random number generation object
+ * alpha - parameters of Dirichlet density [0..K-1]
+ * K - vector size
+ * p - RETURN: sampled probability vector
+ * (caller allocates 0..K-1).
+ *
+ * Returns: <eslOK>, and <p> will contain the sampled vector.
+ */
+int
+esl_dirichlet_DSample(ESL_RANDOMNESS *r, double *alpha, int K, double *p)
+{
+ int x;
+
+ for (x = 0; x < K; x++)
+ p[x] = esl_rnd_Gamma(r, alpha[x]);
+ esl_vec_DNorm(p, K);
+ return eslOK;
+}
+
+/* Function: esl_dirichlet_FSample()
+ *
+ * Purpose: Same as <esl_dirichlet_DSample()>, except it
+ * works in single-precision floats, not doubles.
+ */
+int
+esl_dirichlet_FSample(ESL_RANDOMNESS *r, float *alpha, int K, float *p)
+{
+ int x;
+
+ for (x = 0; x < K; x++)
+ p[x] = (float) esl_rnd_Gamma(r, (double) alpha[x]);
+ esl_vec_FNorm(p, K);
+ return eslOK;
+}
+
+/* Function: esl_dirichlet_DSampleUniform()
+ *
+ * Purpose: Sample a probability vector $p[0..K-1]$ uniformly, by
+ * sampling from a Dirichlet of $\alpha_i = 1.0 \forall i$.
+ *
+ * Args: r - source of random numbers
+ * K - vector size
+ * p - RETURN: sampled prob vector, caller alloc'ed 0..K-1
+ *
+ * Returns: <eslOK>, and <p> will contain the sampled vector.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_dirichlet_DSampleUniform(ESL_RANDOMNESS *r, int K, double *p)
+{
+ int x;
+ for (x = 0; x < K; x++)
+ p[x] = esl_rnd_Gamma(r, 1.0);
+ esl_vec_DNorm(p, K);
+ return eslOK;
+}
+
+/* Function: esl_dirichlet_FSampleUniform()
+ *
+ * Purpose: Same as <esl_dirichlet_DSampleUniform()>, except it
+ * works in single-precision floats, not doubles.
+ */
+int
+esl_dirichlet_FSampleUniform(ESL_RANDOMNESS *r, int K, float *p)
+{
+ int x;
+ for (x = 0; x < K; x++)
+ p[x] = (float) esl_rnd_Gamma(r, 1.0);
+ esl_vec_FNorm(p, K);
+ return eslOK;
+}
+
+
+/* Function: esl_dirichlet_SampleBeta()
+ *
+ * Purpose: Samples from a Beta(theta1, theta2) density, leaves answer
+ * in <ret_answer>. (Special case of sampling Dirichlet.)
+ *
+ * Returns: <eslOK>.
+ */
+int
+esl_dirichlet_SampleBeta(ESL_RANDOMNESS *r, double theta1, double theta2, double *ret_answer)
+{
+ double p, q;
+
+ p = esl_rnd_Gamma(r, theta1);
+ q = esl_rnd_Gamma(r, theta2);
+ *ret_answer = p / (p+q);
+ return eslOK;
+}
+#endif /*eslAUGMENT_RANDOM*/
+/*---------------- end, Dirichlet sampling ----------------------*/
+
+
+/*****************************************************************
+ *# 4. Reading mixture Dirichlets from files [requires esl_fileparser]
+ *****************************************************************/
+#ifdef eslAUGMENT_FILEPARSER
+
+/* Function: esl_mixdchlet_Read()
+ *
+ * Purpose: Reads a mixture Dirichlet from an open stream <efp>, using the
+ * <ESL_FILEPARSER> token-based parser.
+ *
+ * The first two tokens are <K>, the length of the Dirichlet parameter
+ * vector(s), and <N>, the number of mixture components. Then for
+ * each of the <N> mixture components <i>, it reads a mixture coefficient
+ * <pq[i]> followed by <K> Dirichlet parameters <alpha[i][0..K-1]>.
+ *
+ * This function may be called more than once on the same open file,
+ * to read multiple different mixture Dirichlets from it (transitions,
+ * match emissions, insert emissions, for example).
+ *
+ * Note: One reason this function takes an ESL_FILEPARSER instead of
+ * a filename or an open FILE pointer is that file format errors
+ * in Easel are non-fatal "normal" errors, and we want to record
+ * an informative error message. The ESL_FILEPARSER has an error
+ * buffer for this purpose.
+ *
+ * Returns: <eslOK> on success, and <ret_pri> contains a new <ESL_MIXDCHLET> object
+ * that the caller is responsible for free'ing.
+ *
+ * <eslEFORMAT> on 'normal' parse failure, in which case <efp->errbuf>
+ * contains an informative diagnostic message, and <efp->linenumber>
+ * contains the linenumber at which the parse failed.
+ */
+int
+esl_mixdchlet_Read(ESL_FILEPARSER *efp, ESL_MIXDCHLET **ret_pri)
+{
+ ESL_MIXDCHLET *pri;
+ int K; /* Dirichlet param vector size */
+ int N; /* number of mixture components */
+ char *tok; /* ptr to a whitespace-delim, noncomment token */
+ int toklen; /* length of a parsed token */
+ int status; /* return status of an Easel call */
+ int q; /* counter over mixture components (0..N-1) */
+ int i; /* counter over params (0..K-1) */
+
+ *ret_pri = pri = NULL;
+
+ if ((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) goto ERROR;
+ K = atoi(tok);
+ if (K < 1) { sprintf(efp->errbuf, "Bad vector size %.32s", tok); goto ERROR; }
+
+ if ((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) goto ERROR;
+ N = atoi(tok);
+ if (N < 1) { sprintf(efp->errbuf, "Bad mixture number %.32s", tok); goto ERROR; }
+
+ pri = esl_mixdchlet_Create(N, K);
+ if (pri == NULL) { sprintf(efp->errbuf, "mxdchlet alloc failed"); goto ERROR; }
+
+ for (q = 0; q < N; q++)
+ {
+ if ((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) goto ERROR;
+ pri->pq[q] = atof(tok);
+ if (pri->pq[q] < 0.0 || pri->pq[q] > 1.0)
+ { sprintf(efp->errbuf, "bad mixture coefficient %.32s", tok); goto ERROR; }
+
+ for (i = 0; i < K; i++)
+ {
+ if ((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) goto ERROR;
+ pri->alpha[q][i] = atof(tok);
+ if (pri->alpha[q][i] <= 0.0)
+ { sprintf(efp->errbuf, "Dirichlet params must be positive, got %.32s", tok); goto ERROR; }
+ }
+ }
+ esl_vec_DNorm(pri->pq, N);
+ *ret_pri = pri;
+ return eslOK;
+
+ ERROR:
+ esl_mixdchlet_Destroy(pri);
+ return eslEFORMAT;
+}
+
+/* Function: esl_mixdchlet_Write()
+ * Synopsis: Write a mixture Dirichlet to an open output stream.
+ *
+ * Purpose: Write mixture Dirichlet <d> to open output stream <d>.
+ *
+ * Args: fp - open output stream
+ * d - mixture Dirichlet to write
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any write error, such as filled disk.
+ */
+int
+esl_mixdchlet_Write(FILE *fp, ESL_MIXDCHLET *d)
+{
+ int q,i;
+
+ if (fprintf(fp, "%d %d\n", d->K, d->N) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "mixture dirichlet write failed");
+ for (q = 0; q < d->N; q++)
+ {
+ if (fprintf(fp, "%.3f ", d->pq[q]) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "mixture dirichlet write failed");
+ for (i = 0; i < d->K; i++)
+ if (fprintf(fp, "%.3f ", d->alpha[q][i]) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "mixture dirichlet write failed");
+ if (fprintf(fp, "\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "mixture dirichlet write failed");
+ }
+ return eslOK;
+}
+
+
+#endif /* eslAUGMENT_FILEPARSER */
+/*-------------- end, reading mixture Dirichlets ----------------*/
+
+
+
+/*****************************************************************
+ * 5. Unit tests
+ *****************************************************************/
+#ifdef eslDIRICHLET_TESTDRIVE
+
+static void
+utest_io(ESL_MIXDCHLET *d, double tol)
+{
+ char *msg = "esl_dirichlet: io unit test failed";
+ ESL_MIXDCHLET *d2 = NULL;
+ ESL_FILEPARSER *efp = NULL;
+ FILE *fp = NULL;
+ char tmpfile[16] = "esltmpXXXXXX";
+
+ /* Create a mixture Dirichlet file, as a named tmpfile. */
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal(msg);
+ if (esl_mixdchlet_Write(fp, d) != eslOK) esl_fatal(msg);
+ fclose(fp);
+
+ /* Read it back in */
+ if ((fp = fopen(tmpfile, "r")) == NULL) esl_fatal(msg);
+ if ((efp = esl_fileparser_Create(fp)) == NULL) esl_fatal(msg);
+ if (esl_mixdchlet_Read(efp, &d2) != eslOK) esl_fatal(msg);
+ esl_fileparser_Destroy(efp);
+ fclose(fp);
+
+ if (esl_mixdchlet_Compare(d, d2, tol) != eslOK) esl_fatal(msg);
+
+ esl_mixdchlet_Destroy(d2);
+ remove(tmpfile);
+ return;
+}
+
+static void
+utest_bild()
+{
+ char *msg = "esl_dirichlet: BILD unit test failed";
+ ESL_MIXDCHLET *d = NULL;
+ int K = 4;
+ int N = 2;
+ double *counts;
+ double *mix;
+ double *bg;
+ double sc;
+
+
+ /* Create a mixture Dirichlet */
+ if ((d = esl_mixdchlet_Create(N, K)) == NULL) esl_fatal(msg);
+ //esl_vec_DSet(d->pq, N, 1.0/N);
+ d->pq[0] = 0.4;
+ d->pq[1] = 0.6;
+
+ d->alpha[0][0] = 0.1;
+ d->alpha[0][1] = 0.2;
+ d->alpha[0][2] = 0.3;
+ d->alpha[0][3] = 0.4;
+ esl_vec_DSet(d->alpha[1], K, 1.0);
+
+
+ //simulate count vector
+ counts = malloc(K*sizeof(double));
+ counts[0] = 3.0; //2.2;
+ counts[1] = 1.0; //0.9;
+ counts[2] = 0.0; //4.5;
+ counts[3] = 0.0; //3.0;
+
+ //simulate background probabilities
+ bg = malloc(K*sizeof(double));
+ esl_vec_DSet(bg, K, 1.0/K);
+
+ //allocate working space
+ mix = malloc(K*sizeof(double));
+
+ esl_mixdchlet_BILD_score(counts, K, N, d, mix, bg, &sc);
+
+ if (esl_DCompare(sc, 0.701, 0.001) != eslOK)
+ esl_fatal(msg);
+
+// fprintf(stderr, "Score is %.3f\n", sc);
+
+ esl_mixdchlet_Destroy(d);
+ free(bg);
+ free(counts);
+ free(mix);
+
+ return;
+}
+
+
+/*
+ * For any given sampling effort, there is always a possibility that the resulting
+ * count vector will have a higher likelihood under the wrong component than under the
+ * correct component. This unit test runs multiple inferences and only fail if
+ * more of the inferences fail than is expected
+ */
+static void
+utest_inference(ESL_RANDOMNESS *r, ESL_MIXDCHLET *d, int ntrials, int ncounts, int be_verbose)
+{
+ char *msg = "esl_dirichlet: inference unit test failed";
+ double *counts = malloc(sizeof(double) * d->K);
+ double *probs = malloc(sizeof(double) * d->K);
+ double *iq = malloc(sizeof(double) * d->N);
+ double *ip = malloc(sizeof(double) * d->K);
+ int qused, qguess;
+ int c, i, q, j;
+ double maxdeviation;
+
+ int fail_cnt_1 = 0;
+ int fail_cnt_2 = 0;
+ int fail_cnt_3 = 0;
+
+ for (j=0; j<ntrials; j++) {
+ /* Sample component, p vector, c vector from mixture Dirichlet */
+ qused = esl_rnd_DChoose(r, d->pq, d->N);
+ //printf("qused=%1d\n", qused);
+ esl_dirichlet_DSample(r, d->alpha[qused], d->K, probs);
+ esl_vec_DSet(counts, d->K, 0.);
+ for (c = 0; c < ncounts; c++)
+ {
+ i = esl_rnd_DChoose(r, probs, d->K);
+ counts[i] += 1.;
+ }
+
+ /* First inference test:
+ * classify by posterior inference on the sampled probability vector.
+ */
+ for (q = 0; q < d->N; q++)
+ {
+ esl_dirichlet_LogProbProbs(probs, d->alpha[q], d->K, &(iq[q]));
+ iq[q] += log(d->pq[q]);
+ }
+ qguess = esl_vec_DArgMax(iq, d->N); /* the MP guess from the probs */
+ //printf("qguess: %1d\n", qguess);
+ if (qused != qguess) {
+ fail_cnt_1++;
+ }
+
+ /* Second inference test:
+ * classify by posterior inference on the sampled count vector;
+ * then attempt to estimate the probability vector.
+ */
+ esl_mixdchlet_MPParameters(counts, d->K, d, iq, ip);
+ qguess = esl_vec_DArgMax(iq, d->N); /* the MP guess from the counts */
+ //printf("%1d\n", qguess);
+ if (qused != qguess) {
+ fail_cnt_2++;
+ }
+
+ for (i = 0; i < d->K; i++)
+ ip[i] = fabs(ip[i] - probs[i]); /* ip[] is now the differences rel to probs */
+
+ maxdeviation = esl_vec_DMax(ip, d->K);
+ // printf("maxdev=%.3f\n", maxdeviation);
+ if (maxdeviation > 0.05) {
+ fail_cnt_3++;
+ }
+
+ }
+
+ if (fail_cnt_1 > 2 || fail_cnt_2 > 2 || fail_cnt_3 > 0) {
+ char m1[100], m2[100], m3[100], m4[100], final_msg[500];
+ sprintf(m1, "Out of %d total trials:", ntrials);
+ sprintf(m2, "* classification sampled probability vector, failed %d times", fail_cnt_1);
+ sprintf(m3, "* classification sampled count vector, failed %d times", fail_cnt_2);
+ sprintf(m4, "* gross error in posterior probs estimated from counts, %d times", fail_cnt_3);
+
+ sprintf(final_msg, "%s\n%s\n%s\n%s\n%s\n", m1, m2, m3, m4, msg );
+
+ esl_fatal(final_msg);
+ }
+
+ free(counts);
+ free(probs);
+ free(iq);
+ free(ip);
+ return;
+}
+
+
+/*
+ * Performs two tests:
+ * (1) Check to see if the inferred mixdchlt is similar to true one;
+ * (2) Check if the likelihood under the inferred mixdchlt is at least as good as under the true mixdchlt.
+ *
+ * Also, now calls the Fit routine multiple times (via esl_mixdchlet_Fit_Multipass),
+ * since any single random starting point might lead to a terrible locally optimal mixdchlet
+ */
+static void
+utest_fit(ESL_RANDOMNESS *r, ESL_MIXDCHLET *d, int ntrials, int ncounts, double tol, int reps, int be_verbose)
+{
+ char *msg ; // = "esl_dirichlet: fit unit test failed";
+ ESL_MIXDCHLET *id = NULL;
+ double **counts;
+ double *probs = malloc(sizeof(double) * d->K);
+ int qused;
+ int m;
+ int c;
+ int i; /* counter over params (0..K-1) */
+
+ counts = malloc(sizeof(double *) * ntrials);
+ for (m = 0; m < ntrials; m ++)
+ counts[m] = malloc(sizeof(double) * d->K);
+
+ for (m = 0; m < ntrials; m ++) {
+ /* Sample component, p vector, c vector from mixture Dirichlet */
+ qused = esl_rnd_DChoose(r, d->pq, d->N);
+ esl_dirichlet_DSample(r, d->alpha[qused], d->K, probs);
+ esl_vec_DSet(counts[m], d->K, 0.);
+
+ for (c = 0; c < ncounts; c++)
+ {
+ i = esl_rnd_DChoose(r, probs, d->K);
+ counts[m][i] += 1.;
+ }
+
+
+#ifdef eslDIRICHLET_TESTDRIVE_PRINTCOUNTS
+ printf ("%d ", m);
+ for (i=0; i<d->K; i++)
+ printf ("%.2f ", counts[m][i]);
+ printf("\n");
+#endif /*eslDIRICHLET_TESTDRIVE_PRINTCOUNTS*/
+
+ }
+
+ /* Start with a random id, use the counts to infer d by
+ * maximum likelihood gradient descent.
+ * Generate a random starting point, alphas range from 0..10.
+ */
+ id = esl_mixdchlet_Create(d->N, d->K);
+
+ /* optimize id */
+// esl_mixdchlet_Fit(counts, ntrials, id, be_verbose);
+ esl_mixdchlet_Fit_Multipass(r, counts, ntrials, reps, id, 0);
+
+ double lp_true;
+ esl_dirichlet_LogProbDataSet_Mixture (ntrials, counts, d, &lp_true);
+
+ double lp_inf;
+ esl_dirichlet_LogProbDataSet_Mixture (ntrials, counts, id, &lp_inf);
+
+ //Test if the likelihood under the inferred model is at least as good as the
+ //likelihood under the true model
+ int lk_ok = eslOK;
+ if (lp_true > lp_inf +.00001)
+ lk_ok = eslFAIL;
+
+ //Test if the inferred q and alpha values are close
+ // (note: "close" is relative - under the default conditions, they're all
+ // within 35% of the true value)
+ int alphas_ok = esl_mixdchlet_Compare(d, id, tol);
+
+
+ if (lk_ok== eslFAIL || alphas_ok==eslFAIL) {
+ fprintf(stderr, "\nGiven dirichlet\n");
+ esl_mixdchlet_Dump(stderr, d);
+ fprintf (stderr, "logP = %.5f\n\n", lp_true);
+
+ fprintf(stderr, "\nInferred dirichlet\n");
+ esl_mixdchlet_Dump(stderr, id);
+ fprintf (stderr, "logP = %.5f\n\n", lp_inf);
+
+
+ if (lk_ok==eslFAIL)
+ msg = "esl_dirichlet: fit unit test failed (likelihood)";
+ else
+ msg = "esl_dirichlet: fit unit test failed (similarity tolerance exceeded)";
+
+ esl_fatal(msg);
+ }
+
+ for (m = 0; m < ntrials; m ++)
+ free(counts[m]);
+ free(counts);
+ free(probs);
+ esl_mixdchlet_Destroy(id);
+
+ return;
+}
+
+#endif /*eslDIRICHLET_TESTDRIVE*/
+/*--------------------- end, unit tests -------------------------*/
+
+
+
+/*****************************************************************
+ * 6. Test driver
+ *****************************************************************/
+#ifdef eslDIRICHLET_TESTDRIVE
+/*
+ * gcc -g -Wall -I. -L. -o esl_dirichlet_utest -DeslDIRICHLET_TESTDRIVE esl_dirichlet.c -leasel -lm
+ * ./esl_dirichlet_utest
+ */
+#include "easel.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_dirichlet.h"
+/* Note that the RNG seed of 10 is carefully chosen to make the stochastic
+ * tests work reproducibly. Other choices will tend to fail.
+ */
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-s", eslARG_INT, "10", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { "-t", eslARG_REAL, ".35", NULL, NULL, NULL, NULL, NULL, "tolerance for real-value equality comparisons", 0 },
+ { "-C", eslARG_INT, "2", NULL, NULL, NULL, NULL, NULL, "number of components in test mixture D'chlets", 0 },
+ { "-K", eslARG_INT, "6", NULL, NULL, NULL, NULL, NULL, "alphabet size in test mixture D'chlets", 0 },
+ { "-N", eslARG_INT, "1000", NULL, NULL, NULL, NULL, NULL, "number of sample counts in mixture D'chlet tests", 0 },
+ { "-T", eslARG_INT, "100", NULL, NULL, NULL, NULL, NULL, "number of trials of mixture D'chlet tests", 0 },
+ { "-R", eslARG_INT, "5", NULL, NULL, NULL, NULL, NULL, "number of repetitions of the D'chlet fitting procedure", 0 },
+ { "-v", eslARG_NONE, NULL, NULL, NULL, NULL, NULL, NULL, "show verbose output", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for dirichlet module";
+
+int
+main(int argc, char **argv)
+{
+ char *msg = "esl_dirichlet unit test failed";
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ ESL_MIXDCHLET *d = NULL;
+ int K = esl_opt_GetInteger(go, "-K");
+ int ncounts = esl_opt_GetInteger(go, "-N");
+ int ntrials = esl_opt_GetInteger(go, "-T");
+ int nfit_reps = esl_opt_GetInteger(go, "-R");
+ double tol = esl_opt_GetReal (go, "-t");
+ int be_verbose = esl_opt_GetBoolean(go, "-v");
+
+ if (be_verbose) printf("rng seed = %" PRIu32 "\n", esl_randomness_GetSeed(r));
+
+ /* Create a two-component mixture Dirichlet for testing */
+ if ((d = esl_mixdchlet_Create(2, K)) == NULL) esl_fatal(msg);
+ esl_vec_DSet(d->pq, 2, 0.5);
+ esl_vec_DSet(d->alpha[0], K, 1.0);
+ esl_vec_DSet(d->alpha[1], K, 0.1);
+
+ utest_io(d, tol);
+ utest_fit(r, d, ntrials, ncounts, tol, nfit_reps, be_verbose);
+ utest_inference(r, d, ntrials, ncounts, be_verbose);
+ utest_bild();
+
+
+ esl_randomness_Destroy(r);
+ esl_mixdchlet_Destroy(d);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslDIRICHLET_TESTDRIVE*/
+/*--------------------- end, test driver ------------------------*/
+
+
+
+/*****************************************************************
+ * 7. Example
+ *****************************************************************/
+#ifdef eslDIRICHLET_EXAMPLE
+/*::cexcerpt::dirichlet_example::begin::*/
+/* compile:
+ gcc -g -Wall -I. -o example -DeslDIRICHLET_EXAMPLE\
+ -DeslAUGMENT_RANDOM -DeslAUGMENT_FILEPARSER esl_random.c esl_fileparser.c\
+ esl_vectorops.c esl_dirichlet.c easel.c -lm
+ * run: ./example <mixture Dirichlet file>
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_fileparser.h"
+#include "esl_vectorops.h"
+#include "esl_dirichlet.h"
+
+int
+main(int argc, char **argv)
+{
+ FILE *fp;
+ ESL_FILEPARSER *efp;
+ ESL_RANDOMNESS *r;
+ ESL_MIXDCHLET *pri;
+ int c,i,q,qused;
+ double *counts, *probs, *iq, *ip;
+
+ /* Read in a mixture Dirichlet from a file. */
+ fp = fopen(argv[1], "r");
+ efp = esl_fileparser_Create(fp);
+ if (esl_mixdchlet_Read(efp, &pri) != eslOK) {
+ fprintf(stderr, "%s;\ndirichlet file %s parse failed at line %d\n",
+ efp->errbuf, argv[1], efp->linenumber);
+ exit(1);
+ }
+ esl_fileparser_Destroy(efp);
+ fclose(fp);
+
+ /* Allocate some working spaces */
+ probs = malloc(sizeof(double) * pri->K);
+ counts = malloc(sizeof(double) * pri->K);
+ iq = malloc(sizeof(double) * pri->N);
+ ip = malloc(sizeof(double) * pri->K);
+
+ /* Sample a probability vector from it. */
+ r = esl_randomness_Create(0); /* init the random generator */
+ qused = esl_rnd_DChoose(r, pri->pq, pri->N); /* sample a component */
+ esl_dirichlet_DSample(r, pri->alpha[qused], pri->K, probs);
+
+ printf("Component %2d: p[] = ", qused);
+ for (i = 0; i < pri->K; i++) printf("%.3f ", probs[i]);
+ printf("\n");
+
+ /* Sample a count vector from that prob vector. */
+ esl_vec_DSet(counts, pri->K, 0.);
+ for (c = 0; c < 20; c++)
+ counts[esl_rnd_DChoose(r, probs, pri->K)] += 1.;
+
+ printf(" c[] = ");
+ for (i = 0; i < pri->K; i++) printf("%5.0f ", counts[i]);
+ printf("\n");
+
+ /* Estimate a probability vector (ip) from those counts, and
+ * also get back the posterior prob P(q|c) of each component (iq). */
+ esl_mixdchlet_MPParameters(counts, pri->K, pri, iq, ip);
+
+ printf(" reestimated p[] = ");
+ for (i = 0; i < pri->K; i++) printf("%.3f ", ip[i]);
+ printf("\n");
+
+ q = esl_vec_DArgMax(iq, pri->N);
+ printf("probably generated by component %d; P(q%d | c) = %.3f\n",
+ q, q, iq[q]);
+
+ esl_mixdchlet_Destroy(pri);
+ esl_randomness_Destroy(r);
+ free(probs); free(counts); free(iq); free(ip);
+ return 0;
+}
+/*::cexcerpt::dirichlet_example::end::*/
+#endif /*eslDIRICHLET_EXAMPLE*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
diff --git a/esl_dirichlet.h b/esl_dirichlet.h
new file mode 100644
index 0000000..e3b6dd8
--- /dev/null
+++ b/esl_dirichlet.h
@@ -0,0 +1,78 @@
+/* Functions relevant to Beta, gamma, and Dirichlet densities,
+ * and simple and mixture Dirichlet priors.
+ *
+ * SRE, Tue Nov 2 14:35:06 2004 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslDIRICHLET_INCLUDED
+#define eslDIRICHLET_INCLUDED
+
+/* Structure: MIXDCHLET
+ *
+ * A mixture Dirichlet density, usually used as a prior
+ * for a multinomial model (turning count vectors into probability
+ * parameters).
+ */
+typedef struct {
+ /*::cexcerpt::dirichlet_mixdchlet::begin::*/
+ double *pq; /* mixture coefficients pq[0..N-1] */
+ double **alpha; /* Dirichlet params alpha[0..N-1][0..K-1] */
+ int N; /* number of mixtures, e.g. 9 for Sjolander */
+ int K; /* alphabet size, e.g. 20 */
+ /*::cexcerpt::dirichlet_mixdchlet::end::*/
+} ESL_MIXDCHLET;
+
+extern ESL_MIXDCHLET *esl_mixdchlet_Create(int N, int K);
+extern int esl_mixdchlet_Compare(ESL_MIXDCHLET *d1, ESL_MIXDCHLET *d2, double tol);
+extern int esl_mixdchlet_Copy(ESL_MIXDCHLET *d, ESL_MIXDCHLET *d_dst);
+extern int esl_mixdchlet_Dump(FILE *fp, ESL_MIXDCHLET *d);
+extern void esl_mixdchlet_Destroy(ESL_MIXDCHLET *pri);
+extern int esl_mixdchlet_MPParameters(double *c, int K,
+ ESL_MIXDCHLET *pri, double *mix, double *p);
+extern int esl_mixdchlet_BILD_score(double *c, int K, int N, ESL_MIXDCHLET *pri,
+ double *mix, double *bg, double *q);
+
+
+extern int esl_dirichlet_LogProbData(double *c, double *alpha, int K,
+ double *ret_answer);
+extern int esl_dirichlet_LogProbData_Mixture(double *c, ESL_MIXDCHLET *d,
+ double *ret_answer);
+extern int esl_dirichlet_LogProbProbs(double *p, double *alpha, int K,
+ double *ret_answer);
+
+/* Optional fitting code, when augmented by minimizing module.
+ */
+#ifdef eslAUGMENT_MINIMIZER
+#include "esl_minimizer.h"
+extern int esl_mixdchlet_Fit(double **c, int nc, ESL_MIXDCHLET *d, int be_verbose);
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+extern int esl_mixdchlet_Fit_Multipass(ESL_RANDOMNESS *rng, double **c, int nc, int reps, ESL_MIXDCHLET *best_md, int verbose);
+#endif /*eslAUGMENT_RANDOM*/
+#endif /*eslAUGMENT_MINIMIZER*/
+
+/* Optional sampling code, when augmented by random module.
+ */
+#ifdef eslAUGMENT_RANDOM
+extern int esl_dirichlet_DSample(ESL_RANDOMNESS *r, double *alpha, int K, double *p);
+extern int esl_dirichlet_FSample(ESL_RANDOMNESS *r, float *alpha, int K, float *p);
+extern int esl_dirichlet_DSampleUniform(ESL_RANDOMNESS *r, int K, double *p);
+extern int esl_dirichlet_FSampleUniform(ESL_RANDOMNESS *r, int K, float *p);
+extern int esl_dirichlet_SampleBeta(ESL_RANDOMNESS *r, double theta1,
+ double theta2, double *ret_answer);
+#endif /*eslAUGMENT_RANDOM*/
+
+/* Optional file input code, when augmented by fileparser module
+ */
+#ifdef eslAUGMENT_FILEPARSER
+#include "esl_fileparser.h"
+extern int esl_mixdchlet_Read(ESL_FILEPARSER *efp, ESL_MIXDCHLET **ret_pri);
+extern int esl_mixdchlet_Write(FILE *fp, ESL_MIXDCHLET *d);
+#endif /*eslAUGMENT_FILEPARSER*/
+
+
+#endif /*eslDIRICHLET_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_dirichlet.tex b/esl_dirichlet.tex
new file mode 100644
index 0000000..3be33e9
--- /dev/null
+++ b/esl_dirichlet.tex
@@ -0,0 +1,63 @@
+
+The dirichlet module contains routines for using Beta, Gamma, and
+Dirichlet densities. In particular, it implements mixture Dirichlet
+priors, which are useful in a variety of parameter estimation tasks.
+
+The Dirichlet PDF is:
+
+\begin{equation}
+ P(\vec{p}) = \frac{\Gamma{\sum_i \alpha_i}}{\prod_i \Gamma(\alpha_i)} \prod_i p_i^{\alpha_i-1}
+\end{equation}
+
+
+\subsection{The dirichlet API}
+
+The module implements one object, \ccode{ESL\_MIXDCHLET}, which holds
+a mixture Dirichlet prior.
+
+The API consists of the following functions:
+
+\vspace{1em}
+\begin{tabular}{ll}\hline
+ \multicolumn{2}{c}{\textbf{mixture Dirichlet priors}}\\
+\ccode{esl\_mixdchlet\_Create()} & Allocates a new mixture Dirichlet.\\
+\ccode{esl\_mixdchlet\_Destroy()} & Free's a mixture Dirichlet.\\
+\ccode{esl\_mixdchlet\_MPParameters()} & Mean posterior probability parameter estimation.\\
+ \multicolumn{2}{c}{\textbf{Dirichlet, Gamma density routines}}\\
+\ccode{esl\_dirichlet\_LogProbData()} & $\log P( \mbox{count vector} \mid \mbox{mixture Dirichlet}$.\\
+\ccode{esl\_dirichlet\_LogProbProbs()} & $\log P( \mbox{prob vector} \mid \mbox{mixture Dirichlet}$.\\
+\ccode{esl\_dirichlet\_LogGamma()} & $\log \Gamma(x)$.\\
+ \multicolumn{2}{c}{\textbf{Sampling code (requires augmentation w/ random)}}\\
+\ccode{esl\_dirichlet\_\{D,F\}Sample()} & Sample a probability vector from a Dirichlet.\\
+\ccode{esl\_dirichlet\_\{D,F\}SampleUniform()} & Sample a probability vector uniformly.\\
+\ccode{esl\_dirichlet\_SampleBeta()} & Sample from Beta$(\theta_1, \theta_2$).\\
+ \multicolumn{2}{c}{\textbf{Input from file (requires augmentation w/ fileparser)}}\\
+\ccode{esl\_mixdchlet\_Read()} & Input of a mixture Dirichlet from a file.\\ \hline
+\end{tabular}
+
+\subsection{Example of using the dirichlet API}
+
+An example that reads a mixture Dirichlet prior from a file, samples a
+probability vector from it, samples a count vector from the
+probability vector, then infers which mixture component generated the
+data and uses mean posterior estimation to reestimate the probability
+vector from the counts:
+
+\input{cexcerpts/dirichlet_example}
+
+\subsection{Accessing information in the ESL\_MIXDCHLET object}
+
+You may need to access the information in the \ccode{ESL\_MIXDCHLET}
+object. The data fields inside this structure are:
+
+\input{cexcerpts/dirichlet_mixdchlet}
+
+
+\subsection{Augmentations}
+
+The \ccode{esl\_dirichlet\_Sample*()} functions are only available
+when the module is augmented with the \ccode{random} module.
+
+The \ccode{esl\_dirichlet\_Read()} function is only available when the
+module is augmented with the \ccode{fileparser} module.
+
diff --git a/esl_distance.c b/esl_distance.c
new file mode 100644
index 0000000..49edc94
--- /dev/null
+++ b/esl_distance.c
@@ -0,0 +1,1648 @@
+/* Pairwise identities, distances, and distance matrices.
+ *
+ * Contents:
+ * 1. Pairwise distances for aligned text sequences.
+ * 2. Pairwise distances for aligned digital seqs. [alphabet]
+ * 3. Distance matrices for aligned text sequences. [dmatrix]
+ * 4. Distance matrices for aligned digital sequences. [alphabet,dmatrix]
+ * 5. Average pairwise identity for multiple alignments. [alphabet,random]
+ * 6. Private (static) functions.
+ * 7. Unit tests.
+ * 8. Test driver.
+ * 9. Example.
+ * 10. Copyright notice and license.
+ *
+ */
+#include "esl_config.h"
+
+#include <ctype.h>
+#include <string.h>
+#include <math.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#ifdef eslAUGMENT_DMATRIX
+#include "esl_dmatrix.h"
+#endif
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#include "esl_distance.h"
+
+/* Forward declaration of our static functions.
+ */
+static int jukescantor(int n1, int n2, int alphabet_size, double *opt_distance, double *opt_variance);
+
+
+/*****************************************************************
+ * 1. Pairwise distances for aligned text sequences.
+ *****************************************************************/
+
+/* Function: esl_dst_CPairId()
+ * Synopsis: Pairwise identity of two aligned text strings.
+ * Incept: SRE, Mon Apr 17 20:06:07 2006 [St. Louis]
+ *
+ * Purpose: Calculates pairwise fractional identity between two
+ * aligned character strings <asq1> and <asq2>.
+ * Return this distance in <opt_pid>; return the
+ * number of identities counted in <opt_nid>; and
+ * return the denominator <MIN(len1,len2)> in
+ * <opt_n>.
+ *
+ * Alphabetic symbols <[a-zA-Z]> are compared
+ * case-insensitively for identity. Any nonalphabetic
+ * character is assumed to be a gap symbol.
+ *
+ * This simple comparison rule is unaware of synonyms and
+ * degeneracies in biological alphabets. For a more
+ * sophisticated and biosequence-aware comparison, use
+ * digitized sequences and the <esl_dst_XPairId()> function
+ * instead. Note that currently <esl_dst_XPairId()> does
+ * not correctly handle degeneracies, but is set up to.
+ *
+ * Args: asq1 - aligned character string 1
+ * asq2 - aligned character string 2
+ * opt_pid - optRETURN: pairwise identity, 0<=x<=1
+ * opt_nid - optRETURN: # of identities
+ * opt_n - optRETURN: denominator MIN(len1,len2)
+ *
+ * Returns: <eslOK> on success. <opt_pid>, <opt_nid>, <opt_n>
+ * contain the answers (for whichever were passed non-NULL).
+ *
+ * Throws: <eslEINVAL> if the strings are different lengths
+ * (not aligned).
+ */
+int
+esl_dst_CPairId(const char *asq1, const char *asq2,
+ double *opt_pid, int *opt_nid, int *opt_n)
+{
+ int status;
+ int idents; /* total identical positions */
+ int len1, len2; /* lengths of seqs */
+ int i; /* position in aligned seqs */
+
+ idents = len1 = len2 = 0;
+ for (i = 0; asq1[i] != '\0' && asq2[i] != '\0'; i++)
+ {
+ if (isalpha(asq1[i])) len1++;
+ if (isalpha(asq2[i])) len2++;
+ if (isalpha(asq1[i]) && isalpha(asq2[i])
+ && toupper(asq1[i]) == toupper(asq2[i]))
+ idents++;
+ }
+ if (asq1[i] != '\0' || asq2[i] != '\0')
+ ESL_XEXCEPTION(eslEINVAL, "strings not same length, not aligned");
+
+ if (opt_pid != NULL) *opt_pid = ( len1==0 ? 0. : (double) idents / (double) ESL_MIN(len1,len2));
+ if (opt_nid != NULL) *opt_nid = idents;
+ if (opt_n != NULL) *opt_n = len1;
+ return eslOK;
+
+ ERROR:
+ if (opt_pid != NULL) *opt_pid = 0.;
+ if (opt_nid != NULL) *opt_nid = 0;
+ if (opt_n != NULL) *opt_n = 0;
+ return status;
+}
+
+/* Function: esl_dst_CPairMatch()
+ * Synopsis: Pairwise matches of two aligned text strings.
+ * Incept: ER, Wed Oct 29 09:02:35 EDT 2014 [janelia]
+ *
+ * Purpose: Calculates pairwise fractional matches between two
+ * aligned character strings <asq1> and <asq2>.
+ * Return this distance in <opt_pmatch>; return the
+ * number of matches counted in <opt_nmatch>; and
+ * return the denominator <alen - double_gaps> in
+ * <opt_n>.
+ *
+ * Alphabetic symbols <[a-zA-Z]> are compared
+ * case-insensitively for identity. Any nonalphabetic
+ * character is assumed to be a gap symbol.
+ *
+ * This simple comparison rule is unaware of synonyms and
+ * degeneracies in biological alphabets. For a more
+ * sophisticated and biosequence-aware comparison, use
+ * digitized sequences and the <esl_dst_XPairmatch()> function
+ * instead. Note that currently <esl_dst_XPairMatch()> does
+ * not correctly handle degeneracies, but is set up to.
+ *
+ * Args: asq1 - aligned character string 1
+ * asq2 - aligned character string 2
+ * opt_pmatch - optRETURN: pairwise matches, 0<=x<=1
+ * opt_nmatch - optRETURN: # of matches
+ * opt_n - optRETURN: denominator alen - double_gaps
+ *
+ * Returns: <eslOK> on success. <opt_pmatch>, <opt_nmatch>, <opt_n>
+ * contain the answers (for whichever were passed non-NULL).
+ *
+ * Throws: <eslEINVAL> if the strings are different lengths
+ * (not aligned).
+ */
+int
+esl_dst_CPairMatch(const char *asq1, const char *asq2,
+ double *opt_pmatch, int *opt_nmatch, int *opt_n)
+{
+ int status;
+ int match; /* total matched positions */
+ int len; /* length of alignment (no double gaps) */
+ int i; /* position in aligned seqs */
+
+ match = len = 0;
+ for (i = 0; asq1[i] != '\0' && asq2[i] != '\0'; i++)
+ {
+ if (isalpha(asq1[i]) || isalpha(asq2[i])) len++;
+ if (isalpha(asq1[i]) && isalpha(asq2[i])) match++;
+ }
+ if (asq1[i] != '\0' || asq2[i] != '\0')
+ ESL_XEXCEPTION(eslEINVAL, "strings not same length, not aligned");
+
+ if (opt_pmatch != NULL) *opt_pmatch = ( len==0 ? 0. : (double)match / (double)len);
+ if (opt_nmatch != NULL) *opt_nmatch = match;
+ if (opt_n != NULL) *opt_n = len;
+ return eslOK;
+
+ ERROR:
+ if (opt_pmatch != NULL) *opt_pmatch = 0.;
+ if (opt_nmatch != NULL) *opt_nmatch = 0;
+ if (opt_n != NULL) *opt_n = 0;
+ return status;
+}
+
+/* Function: esl_dst_CJukesCantor()
+ * Synopsis: Jukes-Cantor distance for two aligned strings.
+ * Incept: SRE, Tue Apr 18 14:00:37 2006 [St. Louis]
+ *
+ * Purpose: Calculate the generalized Jukes-Cantor distance between
+ * two aligned character strings <as1> and <as2>, in
+ * substitutions/site, for an alphabet of <K> residues
+ * (<K=4> for nucleic acid, <K=20> for proteins). The
+ * maximum likelihood estimate for the distance is
+ * optionally returned in <opt_distance>. The large-sample
+ * variance for the distance estimate is
+ * optionally returned in <opt_variance>.
+ *
+ * Alphabetic symbols <[a-zA-Z]> are compared
+ * case-insensitively to count the number of identities
+ * (<n1>) and mismatches (<n2>>). Any nonalphabetic
+ * character is assumed to be a gap symbol, and aligned
+ * columns containing gap symbols are ignored. The
+ * fractional difference <D> used to calculate the
+ * Jukes/Cantor distance is <n2/n1+n2>.
+ *
+ * Args: K - size of the alphabet (4 or 20)
+ * as1 - 1st aligned seq, 0..L-1, \0-terminated
+ * as2 - 2nd aligned seq, 0..L-1, \0-terminated
+ * opt_distance - optRETURN: ML estimate of distance d
+ * opt_variance - optRETURN: large-sample variance of d
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Infinite distances are possible, in which case distance
+ * and variance are both <HUGE_VAL>. Caller has to deal
+ * with this case as it sees fit, perhaps by enforcing
+ * an arbitrary maximum distance.
+ *
+ * Throws: <eslEINVAL> if the two strings aren't the same length (and
+ * thus can't have been properly aligned).
+ * <eslEDIVZERO> if no aligned residues were counted.
+ * On either failure, distance and variance are both returned
+ * as <HUGE_VAL>.
+ */
+int
+esl_dst_CJukesCantor(int K, const char *as1, const char *as2,
+ double *opt_distance, double *opt_variance)
+{
+ int status;
+ int n1, n2; /* number of observed identities, substitutions */
+ int i; /* position in aligned seqs */
+
+ /* 1. Count identities, mismatches.
+ */
+ n1 = n2 = 0;
+ for (i = 0; as1[i] != '\0' && as2[i] != '\0'; i++)
+ {
+ if (isalpha(as1[i]) && isalpha(as2[i]))
+ {
+ if (toupper(as1[i]) == toupper(as2[i])) n1++; else n2++;
+ }
+ }
+ if (as1[i] != '\0' || as2[i] != '\0')
+ ESL_XEXCEPTION(eslEINVAL, "strings not same length, not aligned");
+
+ return jukescantor(n1, n2, K, opt_distance, opt_variance); /* can throw eslEDIVZERO */
+
+ ERROR:
+ if (opt_distance != NULL) *opt_distance = HUGE_VAL;
+ if (opt_variance != NULL) *opt_variance = HUGE_VAL;
+ return status;
+}
+
+/*------- end, pairwise distances for aligned text seqs ---------*/
+
+
+
+
+
+/*****************************************************************
+ * 2. Pairwise distances for aligned digitized sequences. [alphabet]
+ *****************************************************************/
+#ifdef eslAUGMENT_ALPHABET
+
+/* Function: esl_dst_XPairId()
+ * Synopsis: Pairwise identity of two aligned digital seqs.
+ * Incept: SRE, Tue Apr 18 09:24:05 2006 [St. Louis]
+ *
+ * Purpose: Digital version of <esl_dst_CPairId()>: <adsq1> and
+ * <adsq2> are digitized aligned sequences, in alphabet
+ * <abc>. Otherwise, same as <esl_dst_CPairId()> except
+ * that only canonical residues are counted and checked for
+ * identity, while <esl_dst_CPairId()> (which has no
+ * alphabet) counts and checks identity of all alphanumeric
+ * characters.
+ *
+ * This function does not use <esl_abc_Match()> to handle
+ * degeneracies but it is set up to do so. Doing that would
+ * require that <opt_nid> be changed to a float or double,
+ * or its meaning be changed to be the number of canonical
+ * identities.
+ *
+ * Args: abc - digital alphabet in use
+ * ax1 - aligned digital seq 1
+ * ax2 - aligned digital seq 2
+ * opt_pid - optRETURN: pairwise identity, 0<=x<=1
+ * opt_nid - optRETURN: # of identities
+ * opt_n - optRETURN: denominator MIN(len1,len2)
+ *
+ * Returns: <eslOK> on success. <opt_distance>, <opt_nid>, <opt_n>
+ * contain the answers, for any of these that were passed
+ * non-<NULL> pointers.
+ *
+ * Throws: <eslEINVAL> if the strings are different lengths (not aligned).
+ */
+int
+esl_dst_XPairId(const ESL_ALPHABET *abc, const ESL_DSQ *ax1, const ESL_DSQ *ax2,
+ double *opt_distance, int *opt_nid, int *opt_n)
+{
+ int status;
+ int idents; /* total identical positions */
+ int len1, len2; /* lengths of seqs */
+ int i; /* position in aligned seqs */
+
+ idents = len1 = len2 = 0;
+ for (i = 1; ax1[i] != eslDSQ_SENTINEL && ax2[i] != eslDSQ_SENTINEL; i++)
+ {
+ if (esl_abc_XIsCanonical(abc, ax1[i])) len1++;
+ if (esl_abc_XIsCanonical(abc, ax2[i])) len2++;
+
+ if (esl_abc_XIsCanonical(abc, ax1[i]) && esl_abc_XIsCanonical(abc, ax2[i])
+ && ax1[i] == ax2[i])
+ idents++;
+ }
+ if (len2 < len1) len1 = len2;
+
+ if (ax1[i] != eslDSQ_SENTINEL || ax2[i] != eslDSQ_SENTINEL)
+ ESL_XEXCEPTION(eslEINVAL, "strings not same length, not aligned");
+
+ if (opt_distance != NULL) *opt_distance = ( len1==0 ? 0. : (double) idents / (double) len1 );
+ if (opt_nid != NULL) *opt_nid = idents;
+ if (opt_n != NULL) *opt_n = len1;
+ return eslOK;
+
+ ERROR:
+ if (opt_distance != NULL) *opt_distance = 0.;
+ if (opt_nid != NULL) *opt_nid = 0;
+ if (opt_n != NULL) *opt_n = 0;
+ return status;
+}
+
+/* Function: esl_dst_XPairMatch()
+ * Synopsis: Pairwise matches of two aligned digital seqs.
+ * Incept: ER, Wed Oct 29 09:09:07 EDT 2014 [janelia]
+ *
+ * Purpose: Digital version of <esl_dst_CPairMatch()>: <adsq1> and
+ * <adsq2> are digitized aligned sequences, in alphabet
+ * <abc>. Otherwise, same as <esl_dst_CPairId()> except
+ * that only canonical residues are counted and checked for
+ * identity, while <esl_dst_CPairId()> (which has no
+ * alphabet) counts and checks identity of all alphanumeric
+ * characters.
+ *
+ * Args: abc - digital alphabet in use
+ * ax1 - aligned digital seq 1
+ * ax2 - aligned digital seq 2
+ * opt_pmatch - optRETURN: pairwise matches, 0<=x<=1
+ * opt_nmatch - optRETURN: # of maches
+ * opt_n - optRETURN: denominator alen-double_gaps
+ *
+ * Returns: <eslOK> on success. <opt_distance>, <opt_nmatch>, <opt_n>
+ * contain the answers, for any of these that were passed
+ * non-<NULL> pointers.
+ *
+ * Throws: <eslEINVAL> if the strings are different lengths (not aligned).
+ */
+int
+esl_dst_XPairMatch(const ESL_ALPHABET *abc, const ESL_DSQ *ax1, const ESL_DSQ *ax2,
+ double *opt_distance, int *opt_nmatch, int *opt_n)
+{
+ int status;
+ int match; /* total matched positions */
+ int len; /* length of alignment (no double gaps) */
+ int i; /* position in aligned seqs */
+
+ match = len = 0;
+ for (i = 1; ax1[i] != eslDSQ_SENTINEL && ax2[i] != eslDSQ_SENTINEL; i++)
+ {
+ if (esl_abc_XIsCanonical(abc, ax1[i]) || esl_abc_XIsCanonical(abc, ax2[i])) len ++;
+ if (esl_abc_XIsCanonical(abc, ax1[i]) && esl_abc_XIsCanonical(abc, ax2[i])) match++;
+ }
+
+ if (ax1[i] != eslDSQ_SENTINEL || ax2[i] != eslDSQ_SENTINEL)
+ ESL_XEXCEPTION(eslEINVAL, "strings not same length, not aligned");
+
+ if (opt_distance != NULL) *opt_distance = ( len==0 ? 0. : (double)match / (double)len );
+ if (opt_nmatch != NULL) *opt_nmatch = match;
+ if (opt_n != NULL) *opt_n = len;
+ return eslOK;
+
+ ERROR:
+ if (opt_distance != NULL) *opt_distance = 0.;
+ if (opt_nmatch != NULL) *opt_nmatch = 0;
+ if (opt_n != NULL) *opt_n = 0;
+ return status;
+}
+
+
+/* Function: esl_dst_XJukesCantor()
+ * Synopsis: Jukes-Cantor distance for two aligned digitized seqs.
+ * Incept: SRE, Tue Apr 18 15:26:51 2006 [St. Louis]
+ *
+ * Purpose: Calculate the generalized Jukes-Cantor distance between two
+ * aligned digital strings <ax> and <ay>, in substitutions/site,
+ * using alphabet <abc> to evaluate identities and differences.
+ * The maximum likelihood estimate for the distance is optionally returned in
+ * <opt_distance>. The large-sample variance for the distance
+ * estimate is optionally returned in <opt_variance>.
+ *
+ * Identical to <esl_dst_CJukesCantor()>, except that it takes
+ * digital sequences instead of character strings.
+ *
+ * Args: abc - bioalphabet to use for comparisons
+ * ax - 1st digital aligned seq
+ * ay - 2nd digital aligned seq
+ * opt_distance - optRETURN: ML estimate of distance d
+ * opt_variance - optRETURN: large-sample variance of d
+ *
+ * Returns: <eslOK> on success. As in <esl_dst_CJukesCantor()>, the
+ * distance and variance may be infinite, in which case they
+ * are returned as <HUGE_VAL>.
+ *
+ * Throws: <eslEINVAL> if the two strings aren't the same length (and
+ * thus can't have been properly aligned).
+ * <eslEDIVZERO> if no aligned residues were counted.
+ * On either failure, the distance and variance are set
+ * to <HUGE_VAL>.
+ */
+int
+esl_dst_XJukesCantor(const ESL_ALPHABET *abc, const ESL_DSQ *ax, const ESL_DSQ *ay,
+ double *opt_distance, double *opt_variance)
+{
+ int status;
+ int n1, n2; /* number of observed identities, substitutions */
+ int i; /* position in aligned seqs */
+
+ n1 = n2 = 0;
+ for (i = 1; ax[i] != eslDSQ_SENTINEL && ay[i] != eslDSQ_SENTINEL; i++)
+ {
+ if (esl_abc_XIsCanonical(abc, ax[i]) && esl_abc_XIsCanonical(abc, ay[i]))
+ {
+ if (ax[i] == ay[i]) n1++;
+ else n2++;
+ }
+ }
+ if (ax[i] != eslDSQ_SENTINEL || ay[i] != eslDSQ_SENTINEL)
+ ESL_XEXCEPTION(eslEINVAL, "strings not same length, not aligned");
+
+ return jukescantor(n1, n2, abc->K, opt_distance, opt_variance);
+
+ ERROR:
+ if (opt_distance != NULL) *opt_distance = HUGE_VAL;
+ if (opt_variance != NULL) *opt_variance = HUGE_VAL;
+ return status;
+}
+
+#endif /*eslAUGMENT_ALPHABET*/
+/*---------- end pairwise distances, digital seqs --------------*/
+
+
+
+
+/*****************************************************************
+ * 3. Distance matrices for aligned text sequences.
+ *****************************************************************/
+#ifdef eslAUGMENT_DMATRIX
+
+/* Function: esl_dst_CPairIdMx()
+ * Synopsis: NxN identity matrix for N aligned text sequences.
+ * Incept: SRE, Thu Apr 27 08:46:08 2006 [New York]
+ *
+ * Purpose: Given a multiple sequence alignment <as>, consisting
+ * of <N> aligned character strings; calculate
+ * a symmetric fractional pairwise identity matrix by $N(N-1)/2$
+ * calls to <esl_dst_CPairId()>, and return it in
+ * <ret_D>.
+ *
+ * Args: as - aligned seqs (all same length), [0..N-1]
+ * N - # of aligned sequences
+ * ret_S - RETURN: symmetric fractional identity matrix
+ *
+ * Returns: <eslOK> on success, and <ret_S> contains the fractional
+ * identity matrix. Caller free's <S> with
+ * <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <eslEINVAL> if a seq has a different
+ * length than others. On failure, <ret_D> is returned <NULL>
+ * and state of inputs is unchanged.
+ *
+ * <eslEMEM> on allocation failure.
+ */
+int
+esl_dst_CPairIdMx(char **as, int N, ESL_DMATRIX **ret_S)
+{
+ ESL_DMATRIX *S = NULL;
+ int status;
+ int i,j;
+
+ if (( S = esl_dmatrix_Create(N,N) ) == NULL) { status = eslEMEM; goto ERROR; }
+
+ for (i = 0; i < N; i++)
+ {
+ S->mx[i][i] = 1.;
+ for (j = i+1; j < N; j++)
+ {
+ status = esl_dst_CPairId(as[i], as[j], &(S->mx[i][j]), NULL, NULL);
+ if (status != eslOK)
+ ESL_XEXCEPTION(status, "Pairwise identity calculation failed at seqs %d,%d\n", i,j);
+ S->mx[j][i] = S->mx[i][j];
+ }
+ }
+ if (ret_S != NULL) *ret_S = S; else esl_dmatrix_Destroy(S);
+ return eslOK;
+
+ ERROR:
+ if (S != NULL) esl_dmatrix_Destroy(S);
+ if (ret_S != NULL) *ret_S = NULL;
+ return status;
+}
+
+
+/* Function: esl_dst_CDiffMx()
+ * Synopsis: NxN difference matrix for N aligned text sequences.
+ * Incept: SRE, Fri Apr 28 06:27:20 2006 [New York]
+ *
+ * Purpose: Same as <esl_dst_CPairIdMx()>, but calculates
+ * the fractional difference <d=1-s> instead of the
+ * fractional identity <s> for each pair.
+ *
+ * Args: as - aligned seqs (all same length), [0..N-1]
+ * N - # of aligned sequences
+ * ret_D - RETURN: symmetric fractional difference matrix
+ *
+ * Returns: <eslOK> on success, and <ret_D> contains the
+ * fractional difference matrix. Caller free's <D> with
+ * <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <eslEINVAL> if any seq has a different
+ * length than others. On failure, <ret_D> is returned <NULL>
+ * and state of inputs is unchanged.
+ */
+int
+esl_dst_CDiffMx(char **as, int N, ESL_DMATRIX **ret_D)
+{
+ ESL_DMATRIX *D = NULL;
+ int status;
+ int i,j;
+
+ status = esl_dst_CPairIdMx(as, N, &D);
+ if (status != eslOK) goto ERROR;
+
+ for (i = 0; i < N; i++)
+ {
+ D->mx[i][i] = 0.;
+ for (j = i+1; j < N; j++)
+ {
+ D->mx[i][j] = 1. - D->mx[i][j];
+ D->mx[j][i] = D->mx[i][j];
+ }
+ }
+
+ if (ret_D != NULL) *ret_D = D; else esl_dmatrix_Destroy(D);
+ return eslOK;
+
+ ERROR:
+ if (D != NULL) esl_dmatrix_Destroy(D);
+ if (ret_D != NULL) *ret_D = NULL;
+ return status;
+
+}
+
+/* Function: esl_dst_CJukesCantorMx()
+ * Synopsis: NxN Jukes/Cantor distance matrix for N aligned text seqs.
+ * Incept: SRE, Tue Apr 18 16:00:16 2006 [St. Louis]
+ *
+ * Purpose: Given a multiple sequence alignment <aseq>, consisting of
+ * <nseq> aligned character sequences in an alphabet of
+ * <K> letters (usually 4 for DNA, 20 for protein);
+ * calculate a symmetric Jukes/Cantor pairwise distance
+ * matrix for all sequence pairs, and optionally return the distance
+ * matrix in <ret_D>, and optionally return a symmetric matrix of the
+ * large-sample variances for those ML distance estimates
+ * in <ret_V>.
+ *
+ * Infinite distances (and variances) are possible; they
+ * are represented as <HUGE_VAL> in <D> and <V>. Caller must
+ * be prepared to deal with them as appropriate.
+ *
+ * Args: K - size of the alphabet (usually 4 or 20)
+ * aseq - aligned sequences [0.nseq-1][0..L-1]
+ * nseq - number of aseqs
+ * opt_D - optRETURN: [0..nseq-1]x[0..nseq-1] symmetric distance mx
+ * opt_V - optRETURN: matrix of variances.
+ *
+ * Returns: <eslOK> on success. <D> and <V> contain the
+ * distance matrix (and variances); caller frees these with
+ * <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <eslEINVAL> if any pair of sequences have differing lengths
+ * (and thus cannot have been properly aligned).
+ * <eslEDIVZERO> if some pair of sequences had no aligned
+ * residues. On failure, <D> and <V> are both returned <NULL>
+ * and state of inputs is unchanged.
+ *
+ * <eslEMEM> on allocation failure.
+ */
+int
+esl_dst_CJukesCantorMx(int K, char **aseq, int nseq,
+ ESL_DMATRIX **opt_D, ESL_DMATRIX **opt_V)
+{
+ int status;
+ ESL_DMATRIX *D = NULL;
+ ESL_DMATRIX *V = NULL;
+ int i,j;
+
+ if (( D = esl_dmatrix_Create(nseq, nseq) ) == NULL) { status = eslEMEM; goto ERROR; }
+ if (( V = esl_dmatrix_Create(nseq, nseq) ) == NULL) { status = eslEMEM; goto ERROR; }
+
+ for (i = 0; i < nseq; i++)
+ {
+ D->mx[i][i] = 0.;
+ V->mx[i][i] = 0.;
+ for (j = i+1; j < nseq; j++)
+ {
+ status = esl_dst_CJukesCantor(K, aseq[i], aseq[j],
+ &(D->mx[i][j]), &(V->mx[i][j]));
+ if (status != eslOK)
+ ESL_XEXCEPTION(status, "J/C calculation failed at seqs %d,%d", i,j);
+
+ D->mx[j][i] = D->mx[i][j];
+ V->mx[j][i] = V->mx[i][j];
+ }
+ }
+ if (opt_D != NULL) *opt_D = D; else esl_dmatrix_Destroy(D);
+ if (opt_V != NULL) *opt_V = V; else esl_dmatrix_Destroy(V);
+ return eslOK;
+
+ ERROR:
+ if (D != NULL) esl_dmatrix_Destroy(D);
+ if (V != NULL) esl_dmatrix_Destroy(V);
+ if (opt_D != NULL) *opt_D = NULL;
+ if (opt_V != NULL) *opt_V = NULL;
+ return status;
+}
+
+#endif /*eslAUGMENT_DMATRIX*/
+/*----------- end, distance matrices for aligned text seqs ---------*/
+
+
+
+
+/*****************************************************************
+ * 4. Distance matrices for aligned digital sequences.
+ *****************************************************************/
+#if defined(eslAUGMENT_ALPHABET) && defined(eslAUGMENT_DMATRIX)
+
+
+/* Function: esl_dst_XPairIdMx()
+ * Synopsis: NxN identity matrix for N aligned digital seqs.
+ * Incept: SRE, Thu Apr 27 09:08:11 2006 [New York]
+ *
+ * Purpose: Given a digitized multiple sequence alignment <ax>, consisting
+ * of <N> aligned digital sequences in alphabet <abc>; calculate
+ * a symmetric pairwise fractional identity matrix by $N(N-1)/2$
+ * calls to <esl_dst_XPairId()>, and return it in <ret_S>.
+ *
+ * Args: abc - digital alphabet in use
+ * ax - aligned dsq's, [0..N-1][1..alen]
+ * N - number of aligned sequences
+ * ret_S - RETURN: NxN matrix of fractional identities
+ *
+ * Returns: <eslOK> on success, and <ret_S> contains the distance
+ * matrix. Caller is obligated to free <S> with
+ * <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <eslEINVAL> if a seq has a different
+ * length than others. On failure, <ret_S> is returned <NULL>
+ * and state of inputs is unchanged.
+ *
+ * <eslEMEM> on allocation failure.
+ */
+int
+esl_dst_XPairIdMx(const ESL_ALPHABET *abc, ESL_DSQ **ax, int N, ESL_DMATRIX **ret_S)
+{
+ int status;
+ ESL_DMATRIX *S = NULL;
+ int i,j;
+
+ if (( S = esl_dmatrix_Create(N,N) ) == NULL) { status = eslEMEM; goto ERROR; }
+
+ for (i = 0; i < N; i++)
+ {
+ S->mx[i][i] = 1.;
+ for (j = i+1; j < N; j++)
+ {
+ status = esl_dst_XPairId(abc, ax[i], ax[j], &(S->mx[i][j]), NULL, NULL);
+ if (status != eslOK)
+ ESL_XEXCEPTION(status, "Pairwise identity calculation failed at seqs %d,%d\n", i,j);
+ S->mx[j][i] = S->mx[i][j];
+ }
+ }
+ if (ret_S != NULL) *ret_S = S; else esl_dmatrix_Destroy(S);
+ return eslOK;
+
+ ERROR:
+ if (S != NULL) esl_dmatrix_Destroy(S);
+ if (ret_S != NULL) *ret_S = NULL;
+ return status;
+}
+
+
+/* Function: esl_dst_XDiffMx()
+ * Synopsis: NxN difference matrix for N aligned digital seqs.
+ * Incept: SRE, Fri Apr 28 06:37:29 2006 [New York]
+ *
+ * Purpose: Same as <esl_dst_XPairIdMx()>, but calculates fractional
+ * difference <1-s> instead of fractional identity <s> for
+ * each pair.
+ *
+ * Args: abc - digital alphabet in use
+ * ax - aligned dsq's, [0..N-1][1..alen]
+ * N - number of aligned sequences
+ * ret_D - RETURN: NxN matrix of fractional differences
+ *
+ * Returns: <eslOK> on success, and <ret_D> contains the difference
+ * matrix; caller is obligated to free <D> with
+ * <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <eslEINVAL> if a seq has a different
+ * length than others. On failure, <ret_D> is returned <NULL>
+ * and state of inputs is unchanged.
+ */
+int
+esl_dst_XDiffMx(const ESL_ALPHABET *abc, ESL_DSQ **ax, int N, ESL_DMATRIX **ret_D)
+{
+ int status;
+ ESL_DMATRIX *D = NULL;
+ int i,j;
+
+ status = esl_dst_XPairIdMx(abc, ax, N, &D);
+ if (status != eslOK) goto ERROR;
+
+ for (i = 0; i < N; i++)
+ {
+ D->mx[i][i] = 0.;
+ for (j = i+1; j < N; j++)
+ {
+ D->mx[i][j] = 1. - D->mx[i][j];
+ D->mx[j][i] = D->mx[i][j];
+ }
+ }
+ if (ret_D != NULL) *ret_D = D; else esl_dmatrix_Destroy(D);
+ return eslOK;
+
+ ERROR:
+ if (D != NULL) esl_dmatrix_Destroy(D);
+ if (ret_D != NULL) *ret_D = NULL;
+ return status;
+}
+
+/* Function: esl_dst_XJukesCantorMx()
+ * Synopsis: NxN Jukes/Cantor distance matrix for N aligned digital seqs.
+ * Incept: SRE, Thu Apr 27 08:38:08 2006 [New York City]
+ *
+ * Purpose: Given a digitized multiple sequence alignment <ax>,
+ * consisting of <nseq> aligned digital sequences in
+ * bioalphabet <abc>, calculate a symmetric Jukes/Cantor
+ * pairwise distance matrix for all sequence pairs;
+ * optionally return the distance matrix in <ret_D> and
+ * a matrix of the large-sample variances for those ML distance
+ * estimates in <ret_V>.
+ *
+ * Infinite distances (and variances) are possible. They
+ * are represented as <HUGE_VAL> in <D> and <V>. Caller must
+ * be prepared to deal with them as appropriate.
+ *
+ * Args: abc - bioalphabet for <aseq>
+ * ax - aligned digital sequences [0.nseq-1][1..L]
+ * nseq - number of aseqs
+ * opt_D - optRETURN: [0..nseq-1]x[0..nseq-1] symmetric distance mx
+ * opt_V - optRETURN: matrix of variances.
+ *
+ * Returns: <eslOK> on success. <D> (and optionally <V>) contain the
+ * distance matrix (and variances). Caller frees these with
+ * <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <eslEINVAL> if any pair of sequences have differing lengths
+ * (and thus cannot have been properly aligned).
+ * <eslEDIVZERO> if some pair of sequences had no aligned
+ * residues. On failure, <D> and <V> are both returned <NULL>
+ * and state of inputs is unchanged.
+ *
+ * <eslEMEM> on allocation failure.
+ */
+int
+esl_dst_XJukesCantorMx(const ESL_ALPHABET *abc, ESL_DSQ **ax, int nseq,
+ ESL_DMATRIX **opt_D, ESL_DMATRIX **opt_V)
+{
+ ESL_DMATRIX *D = NULL;
+ ESL_DMATRIX *V = NULL;
+ int status;
+ int i,j;
+
+ if (( D = esl_dmatrix_Create(nseq, nseq) ) == NULL) { status = eslEMEM; goto ERROR; }
+ if (( V = esl_dmatrix_Create(nseq, nseq) ) == NULL) { status = eslEMEM; goto ERROR; }
+
+ for (i = 0; i < nseq; i++)
+ {
+ D->mx[i][i] = 0.;
+ V->mx[i][i] = 0.;
+ for (j = i+1; j < nseq; j++)
+ {
+ status = esl_dst_XJukesCantor(abc, ax[i], ax[j],
+ &(D->mx[i][j]), &(V->mx[i][j]));
+ if (status != eslOK)
+ ESL_XEXCEPTION(status, "J/C calculation failed at digital aseqs %d,%d", i,j);
+
+ D->mx[j][i] = D->mx[i][j];
+ V->mx[j][i] = V->mx[i][j];
+ }
+ }
+ if (opt_D != NULL) *opt_D = D; else esl_dmatrix_Destroy(D);
+ if (opt_V != NULL) *opt_V = V; else esl_dmatrix_Destroy(V);
+ return eslOK;
+
+ ERROR:
+ if (D != NULL) esl_dmatrix_Destroy(D);
+ if (V != NULL) esl_dmatrix_Destroy(V);
+ if (opt_D != NULL) *opt_D = NULL;
+ if (opt_V != NULL) *opt_V = NULL;
+ return status;
+}
+#endif /*eslAUGMENT_ALPHABET && eslAUGMENT_DMATRIX*/
+/*------- end, distance matrices for digital alignments ---------*/
+
+
+
+/*****************************************************************
+ * 5. Average pairwise identity for multiple alignments
+ *****************************************************************/
+
+#ifdef eslAUGMENT_RANDOM
+/* Function: esl_dst_CAverageId()
+ * Synopsis: Calculate avg identity for multiple alignment
+ * Incept: SRE, Fri May 18 15:02:38 2007 [Janelia]
+ *
+ * Purpose: Calculates the average pairwise fractional identity in
+ * a multiple sequence alignment <as>, consisting of <N>
+ * aligned character sequences of identical length.
+ *
+ * If an exhaustive calculation would require more than
+ * <max_comparisons> pairwise comparisons, then instead of
+ * looking at all pairs, calculate the average over a
+ * stochastic sample of <max_comparisons> random pairs.
+ * This allows the routine to work efficiently even on very
+ * deep MSAs.
+ *
+ * Each fractional pairwise identity (range $[0..$ pid $..1]$
+ * is calculated using <esl_dst_CPairId()>.
+ *
+ * Returns: <eslOK> on success, and <*ret_id> contains the average
+ * fractional identity.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEINVAL> if any of the aligned sequence pairs aren't
+ * of the same length.
+ * In either case, <*ret_id> is set to 0.
+ */
+int
+esl_dst_CAverageId(char **as, int N, int max_comparisons, double *ret_id)
+{
+ int status;
+ double id;
+ double sum = 0.;
+ int i,j,n;
+
+ if (N <= 1) { *ret_id = 1.; return eslOK; }
+ *ret_id = 0.;
+
+ /* Is nseq small enough that we can average over all pairwise comparisons? */
+ if ((N * (N-1) / 2) <= max_comparisons)
+ {
+ for (i = 0; i < N; i++)
+ for (j = i+1; j < N; j++)
+ {
+ if ((status = esl_dst_CPairId(as[i], as[j], &id, NULL, NULL)) != eslOK) return status;
+ sum += id;
+ }
+ sum /= (double) (N * (N-1) / 2);
+ }
+
+ /* If nseq is large, calculate average over a stochastic sample. */
+ else
+ {
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ for (n = 0; n < max_comparisons; n++)
+ {
+ do { i = esl_rnd_Roll(r, N); j = esl_rnd_Roll(r, N); } while (j == i); /* make sure j != i */
+ if ((status = esl_dst_CPairId(as[i], as[j], &id, NULL, NULL)) != eslOK) return status;
+ sum += id;
+ }
+ sum /= (double) max_comparisons;
+ esl_randomness_Destroy(r);
+ }
+
+ *ret_id = sum;
+ return eslOK;
+}
+
+/* Function: esl_dst_CAverageMatch()
+ * Synopsis: Calculate avg matches for multiple alignment
+ * Incept: ER, Wed Oct 29 09:25:09 EDT 2014 [Janelia]
+ *
+ * Purpose: Calculates the average pairwise fractional matches in
+ * a multiple sequence alignment <as>, consisting of <N>
+ * aligned character sequences of identical length.
+ *
+ * If an exhaustive calculation would require more than
+ * <max_comparisons> pairwise comparisons, then instead of
+ * looking at all pairs, calculate the average over a
+ * stochastic sample of <max_comparisons> random pairs.
+ * This allows the routine to work efficiently even on very
+ * deep MSAs.
+ *
+ * Each fractional pairwise matches (range $[0..$ pid $..1]$
+ * is calculated using <esl_dst_CPairMatch()>.
+ *
+ * Returns: <eslOK> on success, and <*ret_match> contains the average
+ * fractional matches.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEINVAL> if any of the aligned sequence pairs aren't
+ * of the same length.
+ * In either case, <*ret_match> is set to 0.
+ */
+int
+esl_dst_CAverageMatch(char **as, int N, int max_comparisons, double *ret_match)
+{
+ int status;
+ double match;
+ double sum = 0.;
+ int i,j,n;
+
+ if (N <= 1) { *ret_match = 1.; return eslOK; }
+ *ret_match = 0.;
+
+ /* Is nseq small enough that we can average over all pairwise comparisons? */
+ if ((N * (N-1) / 2) <= max_comparisons)
+ {
+ for (i = 0; i < N; i++)
+ for (j = i+1; j < N; j++)
+ {
+ if ((status = esl_dst_CPairMatch(as[i], as[j], &match, NULL, NULL)) != eslOK) return status;
+ sum += match;
+ }
+ sum /= (double) (N * (N-1) / 2);
+ }
+
+ /* If nseq is large, calculate average over a stochastic sample. */
+ else
+ {
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ for (n = 0; n < max_comparisons; n++)
+ {
+ do { i = esl_rnd_Roll(r, N); j = esl_rnd_Roll(r, N); } while (j == i); /* make sure j != i */
+ if ((status = esl_dst_CPairMatch(as[i], as[j], &match, NULL, NULL)) != eslOK) return status;
+ sum += match;
+ }
+ sum /= (double) max_comparisons;
+ esl_randomness_Destroy(r);
+ }
+
+ *ret_match = sum;
+ return eslOK;
+}
+
+#endif /* eslAUGMENT_RANDOM */
+
+#if defined(eslAUGMENT_RANDOM) && defined(eslAUGMENT_ALPHABET)
+/* Function: esl_dst_XAverageId()
+ * Synopsis: Calculate avg identity for digital MSA
+ * Incept: SRE, Fri May 18 15:19:14 2007 [Janelia]
+ *
+ * Purpose: Calculates the average pairwise fractional identity in
+ * a digital multiple sequence alignment <ax>, consisting of <N>
+ * aligned digital sequences of identical length.
+ *
+ * If an exhaustive calculation would require more than
+ * <max_comparisons> pairwise comparisons, then instead of
+ * looking at all pairs, calculate the average over a
+ * stochastic sample of <max_comparisons> random pairs.
+ * This allows the routine to work efficiently even on very
+ * deep MSAs.
+ *
+ * Each fractional pairwise identity (range $[0..$ pid $..1]$
+ * is calculated using <esl_dst_XPairId()>.
+ *
+ * Returns: <eslOK> on success, and <*ret_id> contains the average
+ * fractional identity.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEINVAL> if any of the aligned sequence pairs aren't
+ * of the same length.
+ * In either case, <*ret_id> is set to 0.
+ */
+int
+esl_dst_XAverageId(const ESL_ALPHABET *abc, ESL_DSQ **ax, int N, int max_comparisons, double *ret_id)
+{
+ int status;
+ double id;
+ double sum = 0.;
+ int i,j,n;
+
+ if (N <= 1) { *ret_id = 1.; return eslOK; }
+ *ret_id = 0.;
+
+ /* Is N small enough that we can average over all pairwise comparisons?
+ watch out for numerical overflow in this: Pfam N's easily overflow when squared
+ */
+ if (N <= max_comparisons &&
+ N <= sqrt(2. * max_comparisons) &&
+ (N * (N-1) / 2) <= max_comparisons)
+ {
+ for (i = 0; i < N; i++)
+ for (j = i+1; j < N; j++)
+ {
+ if ((status = esl_dst_XPairId(abc, ax[i], ax[j], &id, NULL, NULL)) != eslOK) return status;
+ sum += id;
+ }
+ sum /= (double) (N * (N-1) / 2);
+ }
+
+ /* If nseq is large, calculate average over a stochastic sample. */
+ else
+ {
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ for (n = 0; n < max_comparisons; n++)
+ {
+ do { i = esl_rnd_Roll(r, N); j = esl_rnd_Roll(r, N); } while (j == i); /* make sure j != i */
+ if ((status = esl_dst_XPairId(abc, ax[i], ax[j], &id, NULL, NULL)) != eslOK) return status;
+ sum += id;
+ }
+ sum /= (double) max_comparisons;
+ esl_randomness_Destroy(r);
+ }
+
+ *ret_id = sum;
+ return eslOK;
+}
+
+/* Function: esl_dst_XAverageMatch()
+ * Synopsis: Calculate avg matches for digital MSA
+ * Incept: ER, ed Oct 29 09:29:05 EDT 2014 [Janelia]
+ *
+ * Purpose: Calculates the average pairwise fractional matches in
+ * a digital multiple sequence alignment <ax>, consisting of <N>
+ * aligned digital sequences of identical length.
+ *
+ * If an exhaustive calculation would require more than
+ * <max_comparisons> pairwise comparisons, then instead of
+ * looking at all pairs, calculate the average over a
+ * stochastic sample of <max_comparisons> random pairs.
+ * This allows the routine to work efficiently even on very
+ * deep MSAs.
+ *
+ * Each fractional pairwise matches (range $[0..$ pid $..1]$
+ * is calculated using <esl_dst_XPairMatch()>.
+ *
+ * Returns: <eslOK> on success, and <*ret_match> contains the average
+ * fractional identity.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEINVAL> if any of the aligned sequence pairs aren't
+ * of the same length.
+ * In either case, <*ret_match> is set to 0.
+ */
+int
+esl_dst_XAverageMatch(const ESL_ALPHABET *abc, ESL_DSQ **ax, int N, int max_comparisons, double *ret_match)
+{
+ int status;
+ double match;
+ double sum = 0.;
+ int i,j,n;
+
+ if (N <= 1) { *ret_match = 1.; return eslOK; }
+ *ret_match = 0.;
+
+ /* Is N small enough that we can average over all pairwise comparisons?
+ watch out for numerical overflow in this: Pfam N's easily overflow when squared
+ */
+ if (N <= max_comparisons &&
+ N <= sqrt(2. * max_comparisons) &&
+ (N * (N-1) / 2) <= max_comparisons)
+ {
+ for (i = 0; i < N; i++)
+ for (j = i+1; j < N; j++)
+ {
+ if ((status = esl_dst_XPairMatch(abc, ax[i], ax[j], &match, NULL, NULL)) != eslOK) return status;
+ sum += match;
+ }
+ sum /= (double) (N * (N-1) / 2);
+ }
+
+ /* If nseq is large, calculate average over a stochastic sample. */
+ else
+ {
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ for (n = 0; n < max_comparisons; n++)
+ {
+ do { i = esl_rnd_Roll(r, N); j = esl_rnd_Roll(r, N); } while (j == i); /* make sure j != i */
+ if ((status = esl_dst_XPairMatch(abc, ax[i], ax[j], &match, NULL, NULL)) != eslOK) return status;
+ sum += match;
+ }
+ sum /= (double) max_comparisons;
+ esl_randomness_Destroy(r);
+ }
+
+ *ret_match = sum;
+ return eslOK;
+}
+
+#endif /* eslAUGMENT_RANDOM && eslAUGMENT_ALPHABET */
+
+
+
+
+
+/*****************************************************************
+ * 6. Private (static) functions
+ *****************************************************************/
+
+/* jukescantor()
+ *
+ * The generalized Jukes/Cantor distance calculation.
+ * Given <n1> identities and <n2> differences, for a
+ * base alphabet size of <alphabet_size> (4 or 20);
+ * calculate J/C distance in substitutions/site and
+ * return it in <ret_distance>; calculate large-sample
+ * variance and return it in <ret_variance>.
+ *
+ * Returns <eslEDIVZERO> if there are no data (<n1+n2=0>).
+ */
+static int
+jukescantor(int n1, int n2, int alphabet_size, double *opt_distance, double *opt_variance)
+{
+ int status;
+ double D, K, N;
+ double x;
+ double distance, variance;
+
+ ESL_DASSERT1( (n1 >= 0) );
+ ESL_DASSERT1( (n2 >= 0) );
+ ESL_DASSERT1( (alphabet_size >= 0) );
+
+ if (n1+n2 == 0) { status = eslEDIVZERO; goto ERROR; }
+
+ K = (double) alphabet_size;
+ D = (double) n2 / (double) (n1+n2);
+ N = (double) (n1+n2);
+
+ x = 1. - D * K/(K-1.);
+ if (x <= 0.)
+ {
+ distance = HUGE_VAL;
+ variance = HUGE_VAL;
+ }
+ else
+ {
+ distance = -log(x) * K/(K-1);
+ variance = exp( 2.*K*distance/(K-1) ) * D * (1.-D) / N;
+ }
+ if (opt_distance != NULL) *opt_distance = distance;
+ if (opt_variance != NULL) *opt_variance = variance;
+ return eslOK;
+
+ ERROR:
+ if (opt_distance != NULL) *opt_distance = HUGE_VAL;
+ if (opt_variance != NULL) *opt_variance = HUGE_VAL;
+ return status;
+}
+/*--------------- end of private functions ----------------------*/
+
+
+/*****************************************************************
+ * 7. Unit tests.
+ *****************************************************************/
+#ifdef eslDISTANCE_TESTDRIVE
+
+/* Each unit test is given an alignment with certain known
+ * properties:
+ * seqs 0,1 are identical
+ * seqs 0,2 are completely different
+ * seqs 3..N are random
+ * The alignment may contain gaps, so don't assume that the
+ * # of compared residues == alignment length. The alignment
+ * contains only canonical residues, because one of our tests
+ * is that C and X functions give the same results.
+ */
+static int
+utest_CPairId(char **as, int N)
+{
+ double pid;
+ int nid;
+ int nres;
+ int L;
+ int i,j;
+
+ /* Self comparison gives identity = 1. */
+ L = strlen(as[0]);
+ if (esl_dst_CPairId(as[0], as[0], &pid, &nid, &nres) != eslOK) abort();
+ if (pid != 1.0 || nid != L || nres > L) abort();
+
+ /* So does 0,1 comparison */
+ if (esl_dst_CPairId(as[0], as[1], &pid, &nid, &nres) != eslOK) abort();
+ if (pid != 1.0 || nid != L || nres > L) abort();
+
+ /* 0,2 comparison gives 0.0, 0 */
+ if (esl_dst_CPairId(as[0], as[2], &pid, &nid, &nres) != eslOK) abort();
+ if (pid != 0.0 || nid != 0 || nres > L) abort();
+
+ /* remaining comparisons shouldn't fail */
+ for (i = 3; i < N; i++)
+ for (j = i; j < N; j++)
+ {
+ if (esl_dst_CPairId(as[i], as[j], &pid, &nid, &nres) != eslOK) abort();
+ if (pid < 0. || pid > 1. || nid < 0 || nid > L || nres > L) abort();
+ }
+
+ /* API should accept NULL for return values */
+ if (esl_dst_CPairId(as[0], as[0], NULL, NULL, NULL) != eslOK) abort();
+ return eslOK;
+}
+
+static int
+utest_CJukesCantor(int K, char **as, int N)
+{
+ double d, V;
+ int i,j;
+
+ /* Self comparison gives distance = 0. */
+ if (esl_dst_CJukesCantor(K, as[0], as[0], &d, &V) != eslOK) abort();
+ if (d != 0.0) abort();
+
+ /* So does 0,1 comparison */
+ if (esl_dst_CJukesCantor(K, as[0], as[1], &d, &V) != eslOK) abort();
+ if (d != 0.0) abort();
+
+ /* 0,2 comparison gives infinite distance (HUGE_VAL) */
+ if (esl_dst_CJukesCantor(K, as[0], as[2], &d, &V) != eslOK) abort();
+ if (d != HUGE_VAL) abort();
+
+ /* remaining comparisons shouldn't fail */
+ for (i = 3; i < N; i++)
+ for (j = i; j < N; j++)
+ if (esl_dst_CJukesCantor(K, as[i], as[j], &d, &V) != eslOK) abort();
+
+ /* API should accept NULL for return values */
+ if (esl_dst_CJukesCantor(K, as[0], as[0], NULL, NULL) != eslOK) abort();
+ return eslOK;
+}
+
+#ifdef eslAUGMENT_ALPHABET
+static int
+utest_XPairId(ESL_ALPHABET *abc, char **as, ESL_DSQ **ax, int N)
+{
+ double pid, pid2;
+ int nid, nid2;
+ int nres, nres2;
+ int dL, L;
+ int i,j;
+
+ /* Self comparison gives identity = 1. */
+ dL = esl_abc_dsqlen(ax[0]);
+ L = strlen(as[0]);
+ if (dL != L) abort();
+ if (esl_dst_XPairId(abc, ax[0], ax[0], &pid, &nid, &nres) != eslOK) abort();
+ if (pid != 1.0 || nid != L || nres > dL) abort();
+
+ /* So does 0,1 comparison */
+ if (esl_dst_XPairId(abc, ax[0], ax[1], &pid, &nid, &nres) != eslOK) abort();
+ if (pid != 1.0 || nid != L || nres > L) abort();
+
+ /* 0,2 comparison gives 0.0, 0 */
+ if (esl_dst_XPairId(abc, ax[0], ax[2], &pid, &nid, &nres) != eslOK) abort();
+ if (pid != 0.0 || nid != 0 || nres > L) abort();
+
+ /* remaining comparisons shouldn't fail, and should be identical to text mode */
+ for (i = 3; i < N; i++)
+ for (j = i; j < N; j++)
+ {
+ if (esl_dst_XPairId(abc, ax[i], ax[j], &pid, &nid, &nres) != eslOK) abort();
+ if (esl_dst_CPairId(as[i], as[j], &pid2, &nid2, &nres2) != eslOK) abort();
+ if (pid < 0. || pid > 1. || nid < 0 || nid > L || nres > L) abort();
+ if (pid != pid2 || nid != nid2 || nres != nres2) abort();
+ }
+
+ /* API should accept NULL for return values */
+ if (esl_dst_XPairId(abc, ax[0], ax[0], NULL, NULL, NULL) != eslOK) abort();
+ return eslOK;
+
+}
+
+static int
+utest_XJukesCantor(ESL_ALPHABET *abc, char **as, ESL_DSQ **ax, int N)
+{
+ double d, V;
+ int i,j;
+
+ /* Self comparison gives distance = 0. */
+ if (esl_dst_XJukesCantor(abc, ax[0], ax[0], &d, &V) != eslOK) abort();
+ if (d != 0.0) abort();
+
+ /* So does 0,1 comparison */
+ if (esl_dst_XJukesCantor(abc, ax[0], ax[1], &d, &V) != eslOK) abort();
+ if (d != 0.0) abort();
+
+ /* 0,2 comparison gives infinite distance (HUGE_VAL) */
+ if (esl_dst_XJukesCantor(abc, ax[0], ax[2], &d, &V) != eslOK) abort();
+ if (d != HUGE_VAL) abort();
+
+ /* remaining comparisons shouldn't fail */
+ for (i = 3; i < N; i++)
+ for (j = i; j < N; j++)
+ if (esl_dst_XJukesCantor(abc, ax[i], ax[j], &d, &V) != eslOK) abort();
+
+ /* API should accept NULL for return values */
+ if (esl_dst_XJukesCantor(abc, ax[0], ax[0], NULL, NULL) != eslOK) abort();
+ return eslOK;
+
+}
+#endif /*eslAUGMENT_ALPHABET*/
+
+
+#ifdef eslAUGMENT_DMATRIX
+static int
+utest_CPairIdMx(char **as, int N)
+{
+ ESL_DMATRIX *S;
+ int i,j;
+ double pid;
+
+ if (esl_dst_CPairIdMx(as, N, &S) != eslOK) abort();
+
+ for (i = 0; i < N; i++)
+ if (S->mx[i][i] != 1.0) abort();
+
+ pid = 0.;
+ for (i = 3; i < N; i++)
+ for (j = i+1; j < N; j++)
+ pid += S->mx[i][j];
+ pid /= (double) ((N-3) * (N-4) / 2); /* first 3 don't count */
+ if (pid < 0.15 || pid > 0.35) abort(); /* should be 0.25 */
+
+ esl_dmatrix_Destroy(S);
+ return eslOK;
+}
+
+static int
+utest_CDiffMx(char **as, int N)
+{
+ ESL_DMATRIX *D;
+ int i,j;
+ double diff;
+
+ if (esl_dst_CDiffMx(as, N, &D) != eslOK) abort();
+
+ for (i = 0; i < N; i++)
+ if (D->mx[i][i] != 0.0) abort();
+
+ diff = 0.;
+ for (i = 3; i < N; i++)
+ for (j = i+1; j < N; j++)
+ diff += D->mx[i][j];
+ diff /= (double) ((N-3) * (N-4) / 2); /* first 3 don't count */
+ if (diff < 0.65 || diff > 0.85) abort(); /* should be 0.75 */
+
+ esl_dmatrix_Destroy(D);
+ return eslOK;
+}
+
+static int
+utest_CJukesCantorMx(int K, char **as, int N)
+{
+ ESL_DMATRIX *D, *V;
+ /* just a crash test */
+ if (esl_dst_CJukesCantorMx(K, as, N, &D, &V) != eslOK) abort();
+ esl_dmatrix_Destroy(D);
+ esl_dmatrix_Destroy(V);
+ return eslOK;
+}
+#endif /*eslAUGMENT_DMATRIX*/
+
+#if defined (eslAUGMENT_ALPHABET) && defined (eslAUGMENT_DMATRIX)
+
+static int
+utest_XPairIdMx(ESL_ALPHABET *abc, char **as, ESL_DSQ **ax, int N)
+{
+ ESL_DMATRIX *S, *S2;
+ int i, j;
+
+ if (esl_dst_XPairIdMx(abc, ax, N, &S) != eslOK) abort();
+ if (esl_dst_CPairIdMx(as, N, &S2) != eslOK) abort();
+
+ for (i = 0; i < N; i++)
+ for (j = i; j < N; j++)
+ if (fabs(S->mx[i][j] - S2->mx[j][i]) > 0.01) abort();
+
+ esl_dmatrix_Destroy(S);
+ esl_dmatrix_Destroy(S2);
+ return eslOK;
+}
+
+static int
+utest_XDiffMx(ESL_ALPHABET *abc, char **as, ESL_DSQ **ax, int N)
+{
+ ESL_DMATRIX *D, *D2;
+ int i, j;
+
+ if (esl_dst_XDiffMx(abc, ax, N, &D) != eslOK) abort();
+ if (esl_dst_CDiffMx(as, N, &D2) != eslOK) abort();
+
+ for (i = 0; i < N; i++)
+ for (j = i; j < N; j++)
+ if (fabs(D->mx[i][j] - D2->mx[j][i]) > 0.01) abort();
+
+ esl_dmatrix_Destroy(D);
+ esl_dmatrix_Destroy(D2);
+ return eslOK;
+}
+
+static int
+utest_XJukesCantorMx(ESL_ALPHABET *abc, char **as, ESL_DSQ **ax, int N)
+{
+ ESL_DMATRIX *D, *D2, *V, *V2;
+ int i, j;
+
+ if (esl_dst_XJukesCantorMx(abc, ax, N, &D, &V) != eslOK) abort();
+ if (esl_dst_CJukesCantorMx(abc->K, as, N, &D2, &V2) != eslOK) abort();
+
+ for (i = 0; i < N; i++)
+ for (j = i; j < N; j++)
+ {
+ if (fabs(D->mx[i][j] - D2->mx[j][i]) > 0.01) abort();
+ if (fabs(V->mx[i][j] - V2->mx[j][i]) > 0.01) abort();
+ }
+
+ esl_dmatrix_Destroy(D);
+ esl_dmatrix_Destroy(D2);
+ esl_dmatrix_Destroy(V);
+ esl_dmatrix_Destroy(V2);
+ return eslOK;
+}
+#endif /*eslAUGMENT_ALPHABET && eslAUGMENT_DMATRIX*/
+
+/*------------------ end of unit tests --------------------------*/
+#endif /* eslDISTANCE_TESTDRIVE */
+
+
+
+/*****************************************************************
+ * 8. Test driver.
+ *****************************************************************/
+
+/*
+ gcc -g -Wall -o testdriver -I. -DeslDISTANCE_TESTDRIVE esl_distance.c esl_getopts.c esl_random.c easel.c -lm
+
+ gcc -g -Wall -o testdriver -I. -DeslDISTANCE_TESTDRIVE\
+ -DeslAUGMENT_ALPHABET \
+ esl_distance.c esl_getopts.c esl_random.c \
+ esl_alphabet.c easel.c -lm
+
+ gcc -g -Wall -o testdriver -I. -DeslDISTANCE_TESTDRIVE\
+ -DeslAUGMENT_DMATRIX \
+ esl_distance.c esl_getopts.c esl_random.c \
+ esl_dmatrix.c easel.c -lm
+
+ gcc -g -Wall -o testdriver -I. -DeslDISTANCE_TESTDRIVE\
+ -DeslALPHABET -DeslAUGMENT_DMATRIX \
+ esl_distance.c esl_getopts.c esl_random.c \
+ esl_alphabet.c esl_dmatrix.c easel.c -lm
+
+ gcc -g -Wall -o testdriver -I. -L. -DeslDISTANCE_TESTDRIVE esl_distance.c -leasel -lm
+ */
+#ifdef eslDISTANCE_TESTDRIVE
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_randomseq.h"
+#include "esl_distance.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#ifdef eslAUGMENT_DMATRIX
+#include "esl_dmatrix.h"
+#endif
+
+static ESL_OPTIONS options[] = {
+ /* name type def env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { "-N", eslARG_INT, "10", NULL,"n>3", NULL, NULL, NULL, "number of iid seqs in alignment",0},
+ { "-L", eslARG_INT, "50", NULL,"n>0", NULL, NULL, NULL, "length of seqs in alignment", 0},
+ { "--seed", eslARG_INT, "42", NULL,"n>=0",NULL, NULL, NULL, "random # seed", 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "Usage: ./testdrive-distance [-options]";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL;
+ ESL_RANDOMNESS *r = NULL;
+ char **as = NULL; /* aligned character seqs (random, iid) */
+ int N,L; /* # of seqs, and their aligned lengths */
+ int seed;
+ int i,j;
+ int status;
+ double p[4]; /* ACGT probabilities */
+#ifdef eslAUGMENT_ALPHABET
+ ESL_DSQ **ax = NULL; /* digitized alignment */
+ ESL_ALPHABET *abc = NULL;
+#endif
+
+ /* Process command line
+ */
+ go = esl_getopts_Create(options);
+ esl_opt_ProcessCmdline(go, argc, argv);
+ esl_opt_VerifyConfig(go);
+ if (esl_opt_GetBoolean(go, "-h") == TRUE) {
+ puts(usage);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80); /* 0=all docgroups; 2=indentation; 80=width */
+ return 0;
+ }
+ L = esl_opt_GetInteger(go, "-L");
+ N = esl_opt_GetInteger(go, "-N");
+ seed = esl_opt_GetInteger(go, "--seed");
+ if (esl_opt_ArgNumber(go) != 0) {
+ puts("Incorrect number of command line arguments.");
+ puts(usage);
+ return 1;
+ }
+ esl_getopts_Destroy(go);
+
+ /* Create a random DNA alignment;
+ * force it to obey the conventions of the unit tests:
+ * 0,1 are identical
+ * 0,2 are completely dissimilar
+ */
+ r = esl_randomness_Create(seed);
+ for (i = 0; i < 4; i++) p[i] = 0.25;
+ ESL_ALLOC(as, sizeof(char *) * N);
+ for (i = 0; i < N; i++)
+ ESL_ALLOC(as[i], sizeof(char) * (L+1));
+ esl_rsq_IID(r, "ACGT", p, 4, L, as[0]);
+ strcpy(as[1], as[0]);
+ esl_rsq_IID(r, "ACGT", p, 4, L, as[2]);
+ for (j = 0; j < L; j++)
+ while (as[2][j] == as[0][j])
+ as[2][j] = "ACGT"[esl_rnd_Roll(r, 4)];
+ for (i = 3; i < N; i++)
+ esl_rsq_IID(r, "ACGT", p, 4, L, as[i]);
+
+#ifdef eslAUGMENT_ALPHABET
+ abc = esl_alphabet_Create(eslDNA);
+ ESL_ALLOC(ax, sizeof(ESL_DSQ *) * N);
+ for (i = 0; i < N; i++)
+ esl_abc_CreateDsq(abc, as[i], &(ax[i]));
+#endif /*eslAUGMENT_ALPHABET*/
+
+
+ /* Unit tests
+ */
+ if (utest_CPairId(as, N) != eslOK) return eslFAIL;
+ if (utest_CJukesCantor(4, as, N) != eslOK) return eslFAIL;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (utest_XPairId(abc, as, ax, N) != eslOK) return eslFAIL;
+ if (utest_XJukesCantor(abc, as, ax, N) != eslOK) return eslFAIL;
+#endif /*eslAUGMENT_ALPHABET*/
+
+#ifdef eslAUGMENT_DMATRIX
+ if (utest_CPairIdMx(as, N) != eslOK) return eslFAIL;
+ if (utest_CDiffMx(as, N) != eslOK) return eslFAIL;
+ if (utest_CJukesCantorMx(4, as, N) != eslOK) return eslFAIL;
+#endif /* eslAUGMENT_DMATRIX*/
+
+#if defined (eslAUGMENT_ALPHABET) && defined (eslAUGMENT_DMATRIX)
+ if (utest_XPairIdMx(abc, as, ax, N) != eslOK) return eslFAIL;
+ if (utest_XDiffMx(abc, as, ax, N) != eslOK) return eslFAIL;
+ if (utest_XJukesCantorMx(abc, as, ax, N) != eslOK) return eslFAIL;
+#endif
+
+ esl_randomness_Destroy(r);
+ esl_Free2D((void **) as, N);
+#ifdef eslAUGMENT_ALPHABET
+ esl_alphabet_Destroy(abc);
+ esl_Free2D((void **) ax, N);
+#endif
+ return eslOK;
+
+ ERROR:
+ return eslFAIL;
+}
+#endif /*eslDISTANCE_TESTDRIVE*/
+
+
+
+
+/*****************************************************************
+ * 9. Example.
+ *****************************************************************/
+
+#ifdef eslDISTANCE_EXAMPLE
+/*::cexcerpt::distance_example::begin::*/
+/* gcc -g -Wall -o example -I. -DeslDISTANCE_EXAMPLE esl_distance.c\
+ esl_dmatrix.c esl_msa.c easel.c -lm
+ ./example <msa file>
+ */
+#include "easel.h"
+#include "esl_distance.h"
+#include "esl_dmatrix.h"
+#include "esl_msa.h"
+
+int main(int argc, char **argv)
+{
+ ESL_MSAFILE *afp;
+ ESL_MSA *msa;
+ ESL_DMATRIX *P;
+ int i,j;
+ double min, avg, max;
+ int status;
+
+ if ((status = esl_msafile_Open(NULL, argv[1], NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+ if ((status = esl_msafile_Read(afp, &msa)) != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+
+ esl_dst_CPairIdMx(msa->aseq, msa->nseq, &P);
+
+ min = 1.0;
+ max = 0.0;
+ avg = 0.0;
+ for (i = 0; i < msa->nseq; i++)
+ for (j = i+1; j < msa->nseq; j++)
+ {
+ avg += P->mx[i][j];
+ if (P->mx[i][j] < min) min = P->mx[i][j];
+ if (P->mx[i][j] > max) max = P->mx[i][j];
+ }
+ avg /= (double) (msa->nseq * (msa->nseq-1) / 2);
+
+ printf("Average pairwise %% id: %.1f%%\n", avg * 100.);
+ printf("Minimum pairwise %% id: %.1f%%\n", min * 100.);
+ printf("Maximum pairwise %% id: %.1f%%\n", max * 100.);
+
+ esl_dmatrix_Destroy(P);
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ return 0;
+}
+/*::cexcerpt::distance_example::end::*/
+#endif /*eslDISTANCE_EXAMPLE*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
+
diff --git a/esl_distance.h b/esl_distance.h
new file mode 100644
index 0000000..8f3759b
--- /dev/null
+++ b/esl_distance.h
@@ -0,0 +1,77 @@
+/* Distances between aligned sequences, including both
+ * probabilistic evolutionary models and ad hoc measures.
+ *
+ * SRE, Fri Apr 28 06:41:13 2006 [New York]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslDISTANCE_INCLUDED
+#define eslDISTANCE_INCLUDED
+
+#include "easel.h" /* ESL_DSQ declaration */
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h" /* ESL_ALPHABET declaration */
+#endif
+#ifdef eslAUGMENT_DMATRIX
+#include "esl_dmatrix.h" /* ESL_DMATRIX declaration */
+#endif
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+
+/* 1. Pairwise distances for aligned text sequences.
+ */
+extern int esl_dst_CPairId(const char *asq1, const char *asq2,
+ double *opt_pid, int *opt_nid, int *opt_n);
+extern int esl_dst_CPairmatch(const char *asq1, const char *asq2,
+ double *opt_pmatch, int *opt_nmatch, int *opt_n);
+extern int esl_dst_CJukesCantor(int K, const char *as1, const char *as2,
+ double *opt_distance, double *opt_variance);
+
+/* 2. Pairwise distances for aligned digital seqs.
+ */
+#ifdef eslAUGMENT_ALPHABET
+extern int esl_dst_XPairId(const ESL_ALPHABET *abc, const ESL_DSQ *ax1, const ESL_DSQ *ax2,
+ double *opt_pid, int *opt_nid, int *opt_n);
+extern int esl_dst_XPairMatch(const ESL_ALPHABET *abc, const ESL_DSQ *ax1, const ESL_DSQ *ax2,
+ double *opt_distance, int *opt_nmatch, int *opt_n);
+extern int esl_dst_XJukesCantor(const ESL_ALPHABET *abc, const ESL_DSQ *ax, const ESL_DSQ *ay,
+ double *opt_distance, double *opt_variance);
+#endif
+
+
+/* 3. Distance matrices for aligned text sequences.
+ */
+#ifdef eslAUGMENT_DMATRIX
+extern int esl_dst_CPairIdMx (char **as, int N, ESL_DMATRIX **ret_S);
+extern int esl_dst_CDiffMx (char **as, int N, ESL_DMATRIX **ret_D);
+extern int esl_dst_CJukesCantorMx(int K, char **as, int N, ESL_DMATRIX **opt_D, ESL_DMATRIX **opt_V);
+#endif
+
+/* 4. Distance matrices for aligned digital sequences.
+ */
+#if defined(eslAUGMENT_DMATRIX) && defined(eslAUGMENT_ALPHABET)
+extern int esl_dst_XPairIdMx(const ESL_ALPHABET *abc, ESL_DSQ **ax, int N, ESL_DMATRIX **ret_S);
+extern int esl_dst_XDiffMx (const ESL_ALPHABET *abc, ESL_DSQ **ax, int N, ESL_DMATRIX **ret_D);
+
+extern int esl_dst_XJukesCantorMx(const ESL_ALPHABET *abc, ESL_DSQ **ax, int nseq,
+ ESL_DMATRIX **opt_D, ESL_DMATRIX **opt_V);
+#endif
+
+/* 5. Average pairwise identity for multiple alignments.
+ */
+#ifdef eslAUGMENT_RANDOM
+extern int esl_dst_CAverageId (char **as, int nseq, int max_comparisons, double *ret_id);
+extern int esl_dst_CAverageMatch(char **as, int N, int max_comparisons, double *ret_match);
+#endif
+#if defined(eslAUGMENT_RANDOM) && defined(eslAUGMENT_ALPHABET)
+extern int esl_dst_XAverageId (const ESL_ALPHABET *abc, ESL_DSQ **ax, int N, int max_comparisons, double *ret_id);
+extern int esl_dst_XAverageMatch(const ESL_ALPHABET *abc, ESL_DSQ **ax, int N, int max_comparisons, double *ret_match);
+
+#endif
+
+
+#endif /*eslDISTANCE_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_distance.tex b/esl_distance.tex
new file mode 100644
index 0000000..199f4b3
--- /dev/null
+++ b/esl_distance.tex
@@ -0,0 +1,149 @@
+
+The \eslmod{distance} module implements routines for inferring
+mutational distances between pairs of aligned sequences.
+
+Augmentation with the \eslmod{alphabet} module provides distance
+routines for digitized sequences, in addition to text sequences.
+
+Augmentation with the \eslmod{dmatrix} module provides routines for
+constructing distance matrices from multiple sequence alignments.
+
+The API for the \eslmod{distance} module is summarized in
+Table~\ref{tbl:distance_api}.
+
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+ \apisubhead{Pairwise distances for aligned text sequences}\\
+\hyperlink{func:esl_dst_CPairId()}{\ccode{esl\_dst\_CPairId()}} & Pairwise identity of two aligned text strings.\\
+\hyperlink{func:esl_dst_CJukesCantor()}{\ccode{esl\_dst\_CJukesCantor()}} & Jukes-Cantor distance for two aligned strings.\\
+ \apisubhead{Pairwise distances for aligned digital seqs [\eslmod{alphabet}]}\\
+\hyperlink{func:esl_dst_XPairId()}{\ccode{esl\_dst\_XPairId()}} & Pairwise identity of two aligned digital seqs.\\
+\hyperlink{func:esl_dst_XJukesCantor()}{\ccode{esl\_dst\_XJukesCantor()}} & Jukes-Cantor distance for two aligned digitized seqs.\\
+ \apisubhead{Distance matrices for aligned text sequences [\eslmod{dmatrix}]}\\
+\hyperlink{func:esl_dst_CPairIdMx()}{\ccode{esl\_dst\_CPairIdMx()}} & NxN identity matrix for N aligned text sequences. \\
+\hyperlink{func:esl_dst_CDiffMx()}{\ccode{esl\_dst\_CDiffMx()}} & NxN difference matrix for N aligned text sequences.\\
+\hyperlink{func:esl_dst_CJukesCantorMx()}{\ccode{esl\_dst\_CJukesCantorMx()}} & NxN Jukes/Cantor distance matrix for N aligned text seqs.\\
+ \apisubhead{Distance matrices for aligned digital sequences [\eslmod{dmatrix}$,$\eslmod{alphabet}]}\\
+\hyperlink{func:esl_dst_XPairIdMx()}{\ccode{esl\_dst\_XPairIdMx()}} & NxN identity matrix for N aligned digital seqs.\\
+\hyperlink{func:esl_dst_XDiffMx()}{\ccode{esl\_dst\_XDiffMx()}} & NxN difference matrix for N aligned digital seqs.\\
+\hyperlink{func:esl_dst_XJukesCantorMx()}{\ccode{esl\_dst\_XJukesCantorMx()}} & NxN Jukes/Cantor distance matrix for N aligned digital seqs.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{distance} API. Requires: \eslmod{easel}. Optional augmentation: \eslmod{alphabet}, \eslmod{dmatrix}.}
+\label{tbl:distance_api}
+\end{table}
+
+
+\subsection{Example of using the distance API}
+
+The example code below opens a multiple sequence alignment file and
+reads an alignment from it, then uses one of the routines from the
+\eslmod{distance} module to calculate a fractional identity matrix
+from it. The example then finds the average, minimum, and maximum of
+the values in the identity matrix.
+
+\input{cexcerpts/distance_example}
+
+\subsection{Definition of pairwise identity and pairwise difference}
+
+Given a pairwise sequence alignment of length $L$, between two
+sequences of $n_1$ and $n_2$ residues ($n_1 \leq L$, $n_2 \leq L$),
+where the $L$ aligned symbol pairs are classified and counted as
+$c_{\mbox{ident}}$ identities, $c_{\mbox{mismat}}$ mismatches, and
+$c_{\mbox{indel}}$ pairs that have a gap symbol in either or both
+sequences ($c_{\mbox{ident}} + c_{\mbox{mismat}} + c_{\mbox{indel}} =
+L$), \esldef{pairwise sequence identity} is defined as:
+
+\[
+ \mbox{pid} = \frac{c_{\mbox{ident}}}{\mbox{MIN}(n_1, n_2)},
+\]
+
+and \esldef{pairwise sequence difference} is defined as
+\[
+ \mbox{diff} = 1 - \mbox{pid} = \frac{\mbox{MIN}(n_1,n_2) - c_{\mbox{ident}}}{\mbox{MIN}(n_1, n_2)}.
+\]
+
+Both pid and diff range from 0 to 1.
+
+In the unusual case where $\mbox{MIN}(n_1,n_2)=0$ -- that is, one of
+the aligned sequences consists entirely of gaps -- the percent
+identity $0/0$ is defined as 0. The calculation is robust against
+length 0 sequences, which do arise in real applications. (Not just in
+bad input, either. For example, this arises when dealing with subsets
+of the columns of a multiple alignment.)
+
+There are many ways that pairwise identity might be calculated,
+because there are a variety of choices for the denominator. In Easel,
+identity calculations are used primarily in \emph{ad hoc} sequence
+weight calculations for multiple sequence alignments, as part of
+profile HMM or profile SCFG construction. Multiple alignments will
+often contain short sequence fragments. We want to deal robustly with
+cases where two short fragments may have little overlap, or none at
+all. The most obvious calculation of pairwise identity,
+$c_{\mbox{ident}} / c_{\mbox{ident}} + c_{\mbox{mismat}}$, is not
+robust, because alignments with few aligned residues (either because
+they are highly gappy, or they are partially overlapping fragments)
+may receive artifactually high identities. Other definitions,
+$c_{\mbox{ident}} / L$ or $c_{\mbox{ident}} / \mbox{MEAN}(n_1, n_2)$
+or $c_{\mbox{ident}} / \mbox{MAX}(n_1, n_2)$ are also not robust,
+sharing the disadvantage that good alignments of fragments to longer
+sequences would be scored as artifactually low identities.
+
+
+\subsection{Generalized Jukes-Cantor distances}
+
+The Jukes-Cantor model of DNA sequence evolution assumes that all
+substitutions occur at the same rate $\alpha$
+\citep{JukesCantor69}. It is a reversible, multiplicative evolutionary
+model. It implies equiprobable stationary probabilities. The
+\esldef{Jukes/Cantor distance} is the maximum likelihood estimate of
+the number of substitutions per site that have occurred between the
+two sequences, correcting for multiple substitutions that may have
+occurred the same site. Given an ungapped pairwise alignment of length
+$L$ consisting of $c_{\mbox{ident}}$ identities and
+$c_{\mbox{mismat}}$ mismatches (observed substitutions)
+($c_{\mbox{ident}} + c_{\mbox{mismat}} = L$, the fractional observed
+difference $D$ is defined as
+
+\[
+ D = \frac{c_{\mbox{mismat}}}{c_{\mbox{ident}} + c_{\mbox{mismat}}},
+\]
+
+and the Jukes-Cantor distance $d$ is defined in terms of $D$ as:
+
+\[
+ d = -\frac{3}{4} \log \left( 1 - \frac{4}{3} D \right)
+\]
+
+The Jukes/Cantor model does not allow insertions or deletions. When
+calculating ``Jukes/Cantor distances'' for gapped alignments, gap
+symbols are simply ignored, and the same calculations above are
+applied.
+
+The Jukes-Cantor model readily generalizes from the four-letter DNA
+alphabet to any alphabet size $K$, using the same definition of
+observed fractional difference $D$. A \esldef{generalized Jukes-Cantor
+distance} is:
+
+\[
+ d = -\frac{K-1}{K} \log \left( 1 - \frac{K}{K-1} D \right).
+\]
+
+The large-sample variance of this estimate $d$ is:
+
+\[
+ \sigma^2 = e^\frac{2Kd}{K-1} \frac{D(1-D)}{L'}
+\]
+
+where $L'$ is the total number of columns counted, exclusive of gaps,
+$L' = c_{\mbox{ident}} + c_{\mbox{mismat}}$.
+
+If the observed $D \geq \frac{K-1}{K}$, the maximum likelihood
+Jukes-Cantor distance is infinity, as is the variance. In this case,
+both $d$ and $V$ are returned as \ccode{HUGE\_VAL}.
+
+
diff --git a/esl_dmatrix.c b/esl_dmatrix.c
new file mode 100644
index 0000000..7b15bd1
--- /dev/null
+++ b/esl_dmatrix.c
@@ -0,0 +1,1593 @@
+/* Linear algebra operations in double-precision matrices.
+ *
+ * Implements ESL_DMATRIX (double-precision matrix) and
+ * ESL_PERMUTATION (permutation matrix) objects.
+ *
+ * Table of contents:
+ * 1. The ESL_DMATRIX object
+ * 2. Debugging/validation code for ESL_DMATRIX
+ * 3. Visualization tools
+ * 4. The ESL_PERMUTATION object
+ * 5. Debugging/validation code for ESL_PERMUTATION
+ * 6. The rest of the dmatrix API
+ * 7. Optional: Interoperability with GSL
+ * 8. Optional: Interfaces to LAPACK
+ * 9. Unit tests
+ * 10. Test driver
+ * 11. Examples
+ * 12. Copyright and license
+ *
+ * To do:
+ * - eventually probably want additional matrix types
+ * - unit tests poor
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_vectorops.h"
+#include "esl_dmatrix.h"
+
+
+/*****************************************************************
+ * 1. The ESL_DMATRIX object.
+ *****************************************************************/
+
+/* Function: esl_dmatrix_Create()
+ *
+ * Purpose: Creates a general <n> x <m> matrix (<n> rows, <m>
+ * columns).
+ *
+ * Args: <n> - number of rows; $>= 1$
+ * <m> - number of columns; $>= 1$
+ *
+ * Returns: a pointer to a new <ESL_DMATRIX> object. Caller frees
+ * with <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <NULL> if an allocation failed.
+ */
+ESL_DMATRIX *
+esl_dmatrix_Create(int n, int m)
+{
+ ESL_DMATRIX *A = NULL;
+ int r;
+ int status;
+
+ ESL_ALLOC(A, sizeof(ESL_DMATRIX));
+ A->mx = NULL;
+ A->n = n;
+ A->m = m;
+
+ ESL_ALLOC(A->mx, sizeof(double *) * n);
+ A->mx[0] = NULL;
+
+ ESL_ALLOC(A->mx[0], sizeof(double) * n * m);
+ for (r = 1; r < n; r++)
+ A->mx[r] = A->mx[0] + r*m;
+
+ A->type = eslGENERAL;
+ A->ncells = n * m;
+ return A;
+
+ ERROR:
+ esl_dmatrix_Destroy(A);
+ return NULL;
+}
+
+
+/* Function: esl_dmatrix_CreateUpper()
+ * Incept: SRE, Wed Feb 28 08:45:45 2007 [Janelia]
+ *
+ * Purpose: Creates a packed upper triangular matrix of <n> rows and
+ * <n> columns. Caller may only access cells $i \leq j$.
+ * Cells $i > j$ are not stored and are implicitly 0.
+ *
+ * Not all matrix operations in Easel can work on packed
+ * upper triangular matrices.
+ *
+ * Returns: a pointer to a new <ESL_DMATRIX> object of type
+ * <eslUPPER>. Caller frees with <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <NULL> if allocation fails.
+ *
+ * Xref: J1/10
+ */
+ESL_DMATRIX *
+esl_dmatrix_CreateUpper(int n)
+{
+ int status;
+ ESL_DMATRIX *A = NULL;
+ int r; /* counter over rows */
+ int nc; /* cell counter */
+
+ /* matrix structure allocation */
+ ESL_ALLOC(A, sizeof(ESL_DMATRIX));
+ A->mx = NULL;
+ A->n = n;
+ A->m = n;
+
+ /* n row ptrs */
+ ESL_ALLOC(A->mx, sizeof(double *) * n);
+ A->mx[0] = NULL;
+
+ /* cell storage */
+ ESL_ALLOC(A->mx[0], sizeof(double) * n * (n+1) / 2);
+
+ /* row pointers set in a tricksy overlapping way, so
+ * mx[i][j] access works normally but only i<=j are valid.
+ * xref J1/10.
+ */
+ nc = n; /* nc is the number of valid cells assigned to rows so far */
+ for (r = 1; r < n; r++) {
+ A->mx[r] = A->mx[0] + nc - r; /* -r overlaps this row w/ previous row */
+ nc += n-r;
+ }
+ A->type = eslUPPER;
+ A->ncells = n * (n+1) / 2;
+ return A;
+
+ ERROR:
+ esl_dmatrix_Destroy(A);
+ return NULL;
+}
+
+
+/* Function: esl_dmatrix_Destroy()
+ *
+ * Purpose: Frees an <ESL_DMATRIX> object <A>.
+ */
+int
+esl_dmatrix_Destroy(ESL_DMATRIX *A)
+{
+ if (A != NULL && A->mx != NULL && A->mx[0] != NULL) free(A->mx[0]);
+ if (A != NULL && A->mx != NULL) free(A->mx);
+ if (A != NULL) free(A);
+ return eslOK;
+}
+
+
+/* Function: esl_dmatrix_Copy()
+ *
+ * Purpose: Copies <src> matrix into <dest> matrix. <dest> must
+ * be allocated already by the caller.
+ *
+ * You may copy to a matrix of a different type, so long as
+ * the copy makes sense. If <dest> matrix is a packed type
+ * and <src> is not, the values that should be zeros must
+ * be zero in <src>, else the routine throws
+ * <eslEINCOMPAT>. If the <src> matrix is a packed type and
+ * <dest> is not, the values that are implicitly zeros are
+ * set to zeros in the <dest> matrix.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINCOMPAT> if <src>, <dest> are different sizes,
+ * or if their types differ and <dest> cannot represent
+ * <src>.
+ */
+int
+esl_dmatrix_Copy(const ESL_DMATRIX *src, ESL_DMATRIX *dest)
+{
+ int i,j;
+
+ if (dest->n != src->n || dest->m != src->m)
+ ESL_EXCEPTION(eslEINCOMPAT, "matrices of different size");
+
+ if (src->type == dest->type) /* simple case. */
+ memcpy(dest->mx[0], src->mx[0], src->ncells * sizeof(double));
+
+ else if (src->type == eslGENERAL && dest->type == eslUPPER)
+ {
+ for (i = 1; i < src->n; i++)
+ for (j = 0; j < i; j++)
+ if (src->mx[i][j] != 0.)
+ ESL_EXCEPTION(eslEINCOMPAT, "general matrix isn't upper triangular, can't be copied/packed");
+ for (i = 0; i < src->n; i++)
+ for (j = i; j < src->m; j++)
+ dest->mx[i][j] = src->mx[i][j];
+ }
+
+ else if (src->type == eslUPPER && dest->type == eslGENERAL)
+ {
+ for (i = 1; i < src->n; i++)
+ for (j = 0; j < i; j++)
+ dest->mx[i][j] = 0.;
+ for (i = 0; i < src->n; i++)
+ for (j = i; j < src->m; j++)
+ dest->mx[i][j] = src->mx[i][j];
+ }
+
+ return eslOK;
+}
+
+
+/* Function: esl_dmatrix_Clone()
+ * Incept: SRE, Tue May 2 14:38:45 2006 [St. Louis]
+ *
+ * Purpose: Duplicates matrix <A>, making a copy in newly
+ * allocated space.
+ *
+ * Returns: a pointer to the copy. Caller frees with
+ * <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_DMATRIX *
+esl_dmatrix_Clone(const ESL_DMATRIX *A)
+{
+ ESL_DMATRIX *new;
+
+ switch (A->type) {
+ case eslUPPER: if ( (new = esl_dmatrix_CreateUpper(A->n)) == NULL) return NULL; break;
+ default: case eslGENERAL: if ( (new = esl_dmatrix_Create(A->n, A->m)) == NULL) return NULL; break;
+ }
+ esl_dmatrix_Copy(A, new);
+ return new;
+}
+
+
+/* Function: esl_dmatrix_Compare()
+ *
+ * Purpose: Compares matrix <A> to matrix <B> element by element,
+ * using <esl_DCompare()> on each cognate element pair,
+ * with relative equality defined by a fractional tolerance
+ * <tol>. If all elements are equal, return <eslOK>; if
+ * any elements differ, return <eslFAIL>.
+ *
+ * <A> and <B> may be of different types; for example,
+ * a packed upper triangular matrix A is compared to
+ * a general matrix B by assuming <A->mx[i][j] = 0.> for
+ * all $i>j$.
+ */
+int
+esl_dmatrix_Compare(const ESL_DMATRIX *A, const ESL_DMATRIX *B, double tol)
+{
+ int i,j,c;
+ double x1,x2;
+
+ if (A->n != B->n) return eslFAIL;
+ if (A->m != B->m) return eslFAIL;
+
+ if (A->type == B->type)
+ { /* simple case. */
+ for (c = 0; c < A->ncells; c++) /* can deal w/ packed or unpacked storage */
+ if (esl_DCompare(A->mx[0][c], B->mx[0][c], tol) == eslFAIL) return eslFAIL;
+ }
+ else
+ { /* comparing matrices of different types */
+ for (i = 0; i < A->n; i++)
+ for (j = 0; j < A->m; j++)
+ {
+ if (A->type == eslUPPER && i > j) x1 = 0.;
+ else x1 = A->mx[i][j];
+
+ if (B->type == eslUPPER && i > j) x2 = 0.;
+ else x2 = B->mx[i][j];
+
+ if (esl_DCompare(x1, x2, tol) == eslFAIL) return eslFAIL;
+ }
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_dmatrix_CompareAbs()
+ *
+ * Purpose: Compares matrix <A> to matrix <B> element by element,
+ * using <esl_DCompareAbs()> on each cognate element pair,
+ * with absolute equality defined by a absolute difference tolerance
+ * <tol>. If all elements are equal, return <eslOK>; if
+ * any elements differ, return <eslFAIL>.
+ *
+ * <A> and <B> may be of different types; for example,
+ * a packed upper triangular matrix A is compared to
+ * a general matrix B by assuming <A->mx[i][j] = 0.> for
+ * all $i>j$.
+ */
+int
+esl_dmatrix_CompareAbs(const ESL_DMATRIX *A, const ESL_DMATRIX *B, double tol)
+{
+ int i,j,c;
+ double x1,x2;
+
+ if (A->n != B->n) return eslFAIL;
+ if (A->m != B->m) return eslFAIL;
+
+ if (A->type == B->type)
+ { /* simple case. */
+ for (c = 0; c < A->ncells; c++) /* can deal w/ packed or unpacked storage */
+ if (esl_DCompareAbs(A->mx[0][c], B->mx[0][c], tol) == eslFAIL) return eslFAIL;
+ }
+ else
+ { /* comparing matrices of different types */
+ for (i = 0; i < A->n; i++)
+ for (j = 0; j < A->m; j++)
+ {
+ if (A->type == eslUPPER && i > j) x1 = 0.;
+ else x1 = A->mx[i][j];
+
+ if (B->type == eslUPPER && i > j) x2 = 0.;
+ else x2 = B->mx[i][j];
+
+ if (esl_DCompareAbs(x1, x2, tol) == eslFAIL) return eslFAIL;
+ }
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_dmatrix_Set()
+ *
+ * Purpose: Set all elements $a_{ij}$ in matrix <A> to <x>,
+ * and returns <eslOK>.
+ */
+int
+esl_dmatrix_Set(ESL_DMATRIX *A, double x)
+{
+ int i;
+ for (i = 0; i < A->ncells; i++) A->mx[0][i] = x;
+ return eslOK;
+}
+
+
+/* Function: esl_dmatrix_SetZero()
+ *
+ * Purpose: Sets all elements $a_{ij}$ in matrix <A> to 0,
+ * and returns <eslOK>.
+ */
+int
+esl_dmatrix_SetZero(ESL_DMATRIX *A)
+{
+ int i;
+ for (i = 0; i < A->ncells; i++) A->mx[0][i] = 0.;
+ return eslOK;
+}
+
+
+/* Function: esl_dmatrix_SetIdentity()
+ *
+ * Purpose: Given a square matrix <A>, sets all diagonal elements
+ * $a_{ii}$ to 1, and all off-diagonal elements $a_{ij},
+ * j \ne i$ to 0. Returns <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if the matrix isn't square.
+ */
+int
+esl_dmatrix_SetIdentity(ESL_DMATRIX *A)
+{
+ int i;
+
+ if (A->n != A->m) ESL_EXCEPTION(eslEINVAL, "matrix isn't square");
+ esl_dmatrix_SetZero(A);
+ for (i = 0; i < A->n; i++) A->mx[i][i] = 1.;
+ return eslOK;
+}
+
+/*****************************************************************
+ * 2. Debugging, validation code
+ *****************************************************************/
+
+/* Function: esl_dmatrix_Dump()
+ * Incept: SRE, Mon Nov 29 19:21:20 2004 [St. Louis]
+ *
+ * Purpose: Given a matrix <A>, dump it to output stream <ofp> in human-readable
+ * format.
+ *
+ * If <rowlabel> or <collabel> are non-NULL, they specify a
+ * string of single-character labels to put on the rows and
+ * columns, respectively. (For example, these might be a
+ * sequence alphabet for a 4x4 or 20x20 rate matrix or
+ * substitution matrix.) Numbers <1..ncols> or <1..nrows> are
+ * used if <collabel> or <rowlabel> are passed as <NULL>.
+ *
+ * Args: ofp - output file pointer; stdout, for example.
+ * A - matrix to dump.
+ * rowlabel - optional: NULL, or character labels for rows
+ * collabel - optional: NULL, or character labels for cols
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_dmatrix_Dump(FILE *ofp, const ESL_DMATRIX *A, const char *rowlabel, const char *collabel)
+{
+ int a,b;
+
+ fprintf(ofp, " ");
+ if (collabel != NULL)
+ for (b = 0; b < A->m; b++) fprintf(ofp, " %c ", collabel[b]);
+ else
+ for (b = 0; b < A->m; b++) fprintf(ofp, "%8d ", b+1);
+ fprintf(ofp, "\n");
+
+ for (a = 0; a < A->n; a++) {
+ if (rowlabel != NULL) fprintf(ofp, " %c ", rowlabel[a]);
+ else fprintf(ofp, "%5d ", a+1);
+
+ for (b = 0; b < A->m; b++) {
+ switch (A->type) {
+ case eslUPPER:
+ if (a > b) fprintf(ofp, "%8s ", "");
+ else fprintf(ofp, "%8.4f ", A->mx[a][b]);
+ break;
+
+ default: case eslGENERAL:
+ fprintf(ofp, "%8.4f ", A->mx[a][b]);
+ break;
+ }
+ }
+ fprintf(ofp, "\n");
+ }
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 3. Visualization tools
+ *****************************************************************/
+
+/* Function: esl_dmatrix_PlotHeatMap()
+ * Synopsis: Export a heat map visualization, in PostScript
+ *
+ * Purpose: Export a heat map visualization of the matrix in <D>
+ * to open stream <fp>, in PostScript format.
+ *
+ * All values between <min> and <max> in <D> are rescaled
+ * linearly and assigned to shades. Values below <min>
+ * are assigned to the lowest shade; values above <max>, to
+ * the highest shade.
+ *
+ * The plot is hardcoded to be a full US 8x11.5" page,
+ * with at least a 20pt margin.
+ *
+ * Several color schemes are enumerated in the code
+ * but all but one is commented out. The currently enabled
+ * scheme is a 10-class scheme consisting of the 9-class
+ * Reds from colorbrewer2.org plus a blue background class.
+ *
+ * Note: Binning rules basically follow same convention as
+ * esl_histogram. nb = xmax-xmin/w, so w = xmax-xmin/nb;
+ * picking bin is (int) ceil((x - xmin)/w) - 1. (xref
+ * esl_histogram_Score2Bin()). This makes bin b contain
+ * values bw+min < x <= (b+1)w+min. (Which means that
+ * min itself falls in bin -1, whoops - but we catch
+ * all bin<0 and bin>=nshades and put them in the extremes.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_dmatrix_PlotHeatMap(FILE *fp, ESL_DMATRIX *D, double min, double max)
+{
+#if 0
+ /*
+ * This color scheme roughly follows Tufte, Envisioning Information,
+ * p.91, where he shows a beautiful bathymetric chart. The CMYK
+ * values conjoin two recommendations from ColorBrewer (Cindy Brewer
+ * and Mark Harrower, colorbrewer2.org), specifically the 9-class
+ * sequential2 Blues and 9-class sequential YlOrBr.
+ */
+ int nshades = 18;
+ double cyan[] = { 1.00, 1.00, 0.90, 0.75, 0.57, 0.38, 0.24, 0.13, 0.03,
+ 0.00, 0.00, 0.00, 0.00, 0.00, 0.07, 0.20, 0.40, 0.60};
+ double magenta[] = { 0.55, 0.45, 0.34, 0.22, 0.14, 0.08, 0.06, 0.03, 0.01,
+ 0.00, 0.03, 0.11, 0.23, 0.40, 0.55, 0.67, 0.75, 0.80};
+ double yellow[] = { 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00,
+ 0.10, 0.25, 0.40, 0.65, 0.80, 0.90, 1.00, 1.00, 1.00};
+ double black[] = { 0.30, 0.07, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00,
+ 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00};
+#endif
+#if 0
+ /* colorbrewer2.org 5-class YlOrBr scheme: sequential, multihue, 5-class, CMYK */
+ int nshades = 5;
+ double cyan[] = { 0.00, 0.00, 0.00, 0.15, 0.40 };
+ double magenta[] = { 0.00, 0.15, 0.40, 0.60, 0.75 };
+ double yellow[] = { 0.17, 0.40, 0.80, 0.95, 1.00 };
+ double black[] = { 0, 0, 0, 0, 0 };
+#endif
+#if 0
+ /* colorbrewer2.org 9-class YlOrBr scheme, +zero class */
+ int nshades = 10;
+ double cyan[] = { 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.07, 0.20, 0.40, 0.60 };
+ double magenta[] = { 0.00, 0.00, 0.03, 0.11, 0.23, 0.40, 0.55, 0.67, 0.75, 0.80 };
+ double yellow[] = { 0.00, 0.10, 0.25, 0.40, 0.65, 0.80, 0.90, 1.00, 1.00, 1.00 };
+ double black[] = { 0.05, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 };
+#endif
+ /* colorbrewer2.org 9-class Reds + zero class as dim blue */
+ int nshades = 10;
+ double cyan[] = { 0.30, 0.00, 0.00, 0.00, 0.00, 0.00, 0.05, 0.20, 0.35, 0.60 };
+ double magenta[] = { 0.03, 0.04, 0.12, 0.27, 0.43, 0.59, 0.77, 0.90, 0.95, 1.00 };
+ double yellow[] = { 0.00, 0.04, 0.12, 0.27, 0.43, 0.59, 0.72, 0.80, 0.85, 0.90 };
+ double black[] = { 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 };
+
+ int pageheight = 792;
+ int pagewidth = 612;
+ double w;
+ int i,j;
+ int bin;
+ float boxsize; /* box size in points */
+ float xcoord, ycoord; /* postscript coords in points */
+ float leftmargin;
+ float bottommargin;
+
+ /* Set some defaults that might become arguments later.
+ */
+ leftmargin = 20.;
+ bottommargin = 20.;
+
+ /* Determine some working parameters
+ */
+ w = (max-min) / (double) nshades; /* w = bin size for assigning values->colors*/
+ boxsize = ESL_MIN( (pageheight - (bottommargin * 2.)) / (float) D->n,
+ (pagewidth - (leftmargin * 2.)) / (float) D->m);
+
+ /* or start from j=i, to do diagonals */
+ for (i = 0; i < D->n; i++)
+ for (j = 0; j < D->m; j++)
+ {
+ xcoord = (float) j * boxsize + leftmargin;
+ ycoord = (float) (D->n-i+1) * boxsize + bottommargin;
+
+ if (D->mx[i][j] == -eslINFINITY) bin = 0;
+ else if (D->mx[i][j] == eslINFINITY) bin = nshades-1;
+ else {
+ bin = (int) ceil((D->mx[i][j] - min) / w) - 1;
+ if (bin < 0) bin = 0;
+ if (bin >= nshades) bin = nshades-1;
+ }
+
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto\n", xcoord, ycoord);
+ fprintf(fp, " 0 %.2f rlineto\n", boxsize);
+ fprintf(fp, " %.2f 0 rlineto\n", boxsize);
+ fprintf(fp, " 0 -%.2f rlineto\n", boxsize);
+ fprintf(fp, " closepath\n");
+ fprintf(fp, " %.2f %.2f %.2f %.2f setcmykcolor\n",
+ cyan[bin], magenta[bin], yellow[bin], black[bin]);
+ fprintf(fp, " fill\n");
+ }
+ fprintf(fp, "showpage\n");
+ return eslOK;
+}
+
+
+
+/*****************************************************************
+ * 4. The ESL_PERMUTATION object.
+ *****************************************************************/
+
+/* Function: esl_permutation_Create()
+ *
+ * Purpose: Creates a new permutation "matrix" of size <n> for
+ * permuting <n> x <n> square matrices; returns a
+ * pointer to it.
+ *
+ * A permutation matrix consists of 1's and 0's such that
+ * any given row or column contains only one 1. We store it
+ * more efficiently as a vector; each value $p_i$
+ * represents the column $j$ that has the 1. Thus, on
+ * initialization, $p_i = i$ for all $i = 0..n-1$.
+ *
+ * Returns: a pointer to a new <ESL_PERMUTATION> object. Free with
+ * <esl_permutation_Destroy()>.
+ *
+ * Throws: <NULL> if allocation fails.
+ */
+ESL_PERMUTATION *
+esl_permutation_Create(int n)
+{
+ int status;
+ ESL_PERMUTATION *P = NULL;
+
+ ESL_DASSERT1(( n > 0 ));
+
+ ESL_ALLOC(P, sizeof(ESL_PERMUTATION));
+ P->pi = NULL;
+ P->n = n;
+ ESL_ALLOC(P->pi, sizeof(int) * n);
+
+ esl_permutation_Reuse(P); /* initialize it */
+ return P;
+
+ ERROR:
+ esl_permutation_Destroy(P);
+ return NULL;
+}
+
+/* Function: esl_permutation_Destroy()
+ *
+ * Purpose: Frees an <ESL_PERMUTATION> object <P>.
+ */
+int
+esl_permutation_Destroy(ESL_PERMUTATION *P)
+{
+ if (P != NULL && P->pi != NULL) free(P->pi);
+ if (P != NULL) free(P);
+ return eslOK;
+}
+
+/* Function: esl_permutation_Reuse()
+ *
+ * Purpose: Resets a permutation matrix <P> to
+ * $p_i = i$ for all $i = 0..n-1$.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_permutation_Reuse(ESL_PERMUTATION *P)
+{
+ int i;
+ for (i = 0; i < P->n; i++)
+ P->pi[i] = i;
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 5. Debugging/validation for ESL_PERMUTATION.
+ *****************************************************************/
+
+/* Function: esl_permutation_Dump()
+ *
+ * Purpose: Given a permutation matrix <P>, dump it to output stream <ofp>
+ * in human-readable format.
+ *
+ * If <rowlabel> or <collabel> are non-NULL, they represent
+ * single-character labels to put on the rows and columns,
+ * respectively. (For example, these might be a sequence
+ * alphabet for a 4x4 or 20x20 rate matrix or substitution
+ * matrix.) Numbers 1..ncols or 1..nrows are used if
+ * <collabel> or <rowlabel> are NULL.
+ *
+ * Args: ofp - output file pointer; stdout, for example
+ * P - permutation matrix to dump
+ * rowlabel - optional: NULL, or character labels for rows
+ * collabel - optional: NULL, or character labels for cols
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_permutation_Dump(FILE *ofp, const ESL_PERMUTATION *P, const char *rowlabel, const char *collabel)
+{
+ int i,j;
+
+ fprintf(ofp, " ");
+ if (collabel != NULL)
+ for (j = 0; j < P->n; j++) fprintf(ofp, " %c ", collabel[j]);
+ else
+ for (j = 0; j < P->n; j++) fprintf(ofp, "%3d ", j+1);
+ fprintf(ofp, "\n");
+
+ for (i = 0; i < P->n; i++) {
+ if (rowlabel != NULL) fprintf(ofp, " %c ", rowlabel[i]);
+ else fprintf(ofp, "%3d ", i+1);
+
+ for (j = 0; j < P->n; j++)
+ fprintf(ofp, "%3d ", (j == P->pi[i]) ? 1 : 0);
+ fprintf(ofp, "\n");
+ }
+ return eslOK;
+}
+
+/*****************************************************************
+ * 6. The rest of the dmatrix API.
+ *****************************************************************/
+
+
+
+/* Function: esl_dmx_Max()
+ * Incept: SRE, Thu Mar 1 14:46:48 2007 [Janelia]
+ *
+ * Purpose: Returns the maximum value of all the elements $a_{ij}$ in matrix <A>.
+ */
+double
+esl_dmx_Max(const ESL_DMATRIX *A)
+{
+ int i;
+ double best;
+
+ best = A->mx[0][0];
+ for (i = 0; i < A->ncells; i++)
+ if (A->mx[0][i] > best) best = A->mx[0][i];
+ return best;
+}
+
+/* Function: esl_dmx_Min()
+ * Incept: SRE, Thu Mar 1 14:49:29 2007 [Janelia]
+ *
+ * Purpose: Returns the minimum value of all the elements $a_{ij}$ in matrix <A>.
+ */
+double
+esl_dmx_Min(const ESL_DMATRIX *A)
+{
+ int i;
+ double best;
+
+ best = A->mx[0][0];
+ for (i = 0; i < A->ncells; i++)
+ if (A->mx[0][i] < best) best = A->mx[0][i];
+ return best;
+}
+
+
+/* Function: esl_dmx_MinMax()
+ * Incept: SRE, Wed Mar 14 16:58:03 2007 [Janelia]
+ *
+ * Purpose: Finds the maximum and minimum values of the
+ * elements $a_{ij}$ in matrix <A>, and returns
+ * them in <ret_min> and <ret_max>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ */
+int
+esl_dmx_MinMax(const ESL_DMATRIX *A, double *ret_min, double *ret_max)
+{
+ double min, max;
+ int i;
+
+ min = max = A->mx[0][0];
+ for (i = 0; i < A->ncells; i++) {
+ if (A->mx[0][i] < min) min = A->mx[0][i];
+ if (A->mx[0][i] > max) max = A->mx[0][i];
+ }
+ *ret_min = min;
+ *ret_max = max;
+ return eslOK;
+}
+
+
+
+/* Function: esl_dmx_Sum()
+ * Incept: SRE, Thu Mar 1 16:45:16 2007
+ *
+ * Purpose: Returns the scalar sum of all the elements $a_{ij}$ in matrix <A>,
+ * $\sum_{ij} a_{ij}$.
+ */
+double
+esl_dmx_Sum(const ESL_DMATRIX *A)
+{
+ int i;
+ double sum = 0.;
+
+ for (i = 0; i < A->ncells; i++)
+ sum += A->mx[0][i];
+ return sum;
+}
+
+
+/* Function: esl_dmx_FrobeniusNorm()
+ * Incept: SRE, Thu Mar 15 17:59:35 2007 [Janelia]
+ *
+ * Purpose: Calculates the Frobenius norm of a matrix, which
+ * is the element-wise equivalant of a
+ * Euclidean vector norm:
+ * $ = \sqrt(\sum a_{ij}^2)$
+ *
+ * Args: A - matrix
+ * ret_fnorm - Frobenius norm.
+ *
+ * Returns: <eslOK> on success, and the Frobenius norm
+ * is in <ret_fnorm>.
+ */
+int
+esl_dmx_FrobeniusNorm(const ESL_DMATRIX *A, double *ret_fnorm)
+{
+ double F = 0.;
+ int i;
+
+ for (i = 0; i < A->ncells; i++)
+ F += A->mx[0][i] * A->mx[0][i];
+ *ret_fnorm = sqrt(F);
+ return eslOK;
+}
+
+
+/* Function: esl_dmx_Multiply()
+ *
+ * Purpose: Matrix multiplication: calculate <AB>, store result in <C>.
+ * <A> is $n times m$; <B> is $m \times p$; <C> is $n \times p$.
+ * Matrix <C> must be allocated appropriately by the caller.
+ *
+ * Not supported for anything but general (<eslGENERAL>)
+ * matrix type, at present.
+ *
+ * Throws: <eslEINVAL> if matrices don't have compatible dimensions,
+ * or if any of them isn't a general (<eslGENERAL>) matrix.
+ */
+int
+esl_dmx_Multiply(const ESL_DMATRIX *A, const ESL_DMATRIX *B, ESL_DMATRIX *C)
+{
+ int i, j, k;
+
+ if (A->m != B->n) ESL_EXCEPTION(eslEINVAL, "can't multiply A,B");
+ if (A->n != C->n) ESL_EXCEPTION(eslEINVAL, "A,C # of rows not equal");
+ if (B->m != C->m) ESL_EXCEPTION(eslEINVAL, "B,C # of cols not equal");
+ if (A->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "A isn't of type eslGENERAL");
+ if (B->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "B isn't of type eslGENERAL");
+ if (C->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "B isn't of type eslGENERAL");
+
+ /* i,k,j order should optimize stride, relative to a more textbook
+ * order for the indices
+ */
+ esl_dmatrix_SetZero(C);
+ for (i = 0; i < A->n; i++)
+ for (k = 0; k < A->m; k++)
+ for (j = 0; j < B->m; j++)
+ C->mx[i][j] += A->mx[i][k] * B->mx[k][j];
+
+ return eslOK;
+}
+
+
+/*::cexcerpt::function_comment_example::begin::*/
+/* Function: esl_dmx_Exp()
+ * Synopsis: Calculates matrix exponential $\mathbf{P} = e^{t\mathbf{Q}}$.
+ * Incept: SRE, Thu Mar 8 18:41:38 2007 [Janelia]
+ *
+ * Purpose: Calculates the matrix exponential $\mathbf{P} = e^{t\mathbf{Q}}$,
+ * using a scaling and squaring algorithm with
+ * the Taylor series approximation \citep{MolerVanLoan03}.
+ *
+ * <Q> must be a square matrix of type <eslGENERAL>.
+ * Caller provides an allocated <P> matrix of the same size and type as <Q>.
+ *
+ * A typical use of this function is to calculate a
+ * conditional substitution probability matrix $\mathbf{P}$
+ * (whose elements $P_{xy}$ are conditional substitution
+ * probabilities $\mathrm{Prob}(y \mid x, t)$ from time $t$
+ * and instantaneous rate matrix $\mathbf{Q}$.
+ *
+ * Args: Q - matrix to exponentiate (an instantaneous rate matrix)
+ * t - time units
+ * P - RESULT: $e^{tQ}$.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ *
+ * Xref: J1/19.
+ */
+int
+esl_dmx_Exp(const ESL_DMATRIX *Q, double t, ESL_DMATRIX *P)
+{
+/*::cexcerpt::function_comment_example::end::*/
+ ESL_DMATRIX *Qz = NULL; /* Q/2^z rescaled matrix*/
+ ESL_DMATRIX *Qpow = NULL; /* keeps running product Q^k */
+ ESL_DMATRIX *C = NULL; /* tmp storage for matrix multiply result */
+ double factor = 1.0;
+ double fnorm;
+ int z;
+ double zfac;
+ int k;
+ int status;
+
+ /* Contract checks */
+ if (Q->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "Q isn't general");
+ if (Q->n != Q->m) ESL_EXCEPTION(eslEINVAL, "Q isn't square");
+ if (P->type != Q->type) ESL_EXCEPTION(eslEINVAL, "P isn't of same type as Q");
+ if (P->n != P->m) ESL_EXCEPTION(eslEINVAL, "P isn't square");
+ if (P->n != Q->n) ESL_EXCEPTION(eslEINVAL, "P isn't same size as Q");
+
+ /* Allocation of working space */
+ if ((Qz = esl_dmatrix_Create(Q->n, Q->n)) == NULL) { status = eslEMEM; goto ERROR; }
+ if ((Qpow = esl_dmatrix_Create(Q->n, Q->n)) == NULL) { status = eslEMEM; goto ERROR; }
+ if ((C = esl_dmatrix_Create(Q->n, Q->n)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ /* Figure out how much to scale the matrix down by. This is not
+ * magical; we're just knocking its magnitude down in an ad hoc way.
+ */
+ esl_dmx_FrobeniusNorm(Q, &fnorm);
+ zfac = 1.;
+ z = 0;
+ while (t*fnorm*zfac > 0.1) { zfac /= 2.; z++; }
+
+ /* Make a scaled-down copy of Q in Qz.
+ */
+ esl_dmatrix_Copy(Q, Qz);
+ esl_dmx_Scale(Qz, zfac);
+
+ /* Calculate e^{t Q_z} by the Taylor, to complete convergence. */
+ esl_dmatrix_SetIdentity(P);
+ esl_dmatrix_Copy(Qz, Qpow); /* Qpow is now Qz^1 */
+ for (k = 1; k < 100; k++)
+ {
+ factor *= t/k;
+ esl_dmatrix_Copy(P, C); /* C now holds the previous P */
+ esl_dmx_AddScale(P, factor, Qpow); /* P += factor*Qpow */
+ if (esl_dmatrix_Compare(C, P, 0.) == eslOK) break;
+
+ esl_dmx_Multiply(Qpow, Qz, C); /* C = Q^{k+1} */
+ esl_dmatrix_Copy(C, Qpow); /* Qpow = C = Q^{k+1} */
+ }
+
+ /* Now square it back up: e^{tQ} = [e^{tQ_z}]^{2^z} */
+ while (z--) {
+ esl_dmx_Multiply(P, P, C);
+ esl_dmatrix_Copy(C, P);
+ }
+
+ esl_dmatrix_Destroy(Qz);
+ esl_dmatrix_Destroy(Qpow);
+ esl_dmatrix_Destroy(C);
+ return eslOK;
+
+ ERROR:
+ if (Qz != NULL) esl_dmatrix_Destroy(Qz);
+ if (Qpow != NULL) esl_dmatrix_Destroy(Qpow);
+ if (C != NULL) esl_dmatrix_Destroy(C);
+ return status;
+}
+
+
+/* Function: esl_dmx_Transpose()
+ *
+ * Purpose: Transpose a square matrix <A> in place.
+ *
+ * <A> must be a general (<eslGENERAL>) matrix type.
+ *
+ * Throws: <eslEINVAL> if <A> isn't square, or if it isn't
+ * of type <eslGENERAL>.
+ */
+int
+esl_dmx_Transpose(ESL_DMATRIX *A)
+{
+ int i,j;
+ double swap;
+
+ if (A->n != A->m) ESL_EXCEPTION(eslEINVAL, "matrix isn't square");
+ if (A->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "A isn't of type eslGENERAL");
+
+ for (i = 0; i < A->n; i++)
+ for (j = i+1; j < A->m; j++)
+ { swap = A->mx[i][j]; A->mx[i][j] = A->mx[j][i]; A->mx[j][i] = swap; }
+ return eslOK;
+}
+
+
+/* Function: esl_dmx_Add()
+ *
+ * Purpose: <A = A+B>; adds matrix <B> to matrix <A> and leaves result
+ * in matrix <A>.
+ *
+ * <A> and <B> may be of any type. However, if <A> is a
+ * packed upper triangular matrix (type
+ * <eslUPPER>), all values $i>j$ in <B> must be
+ * zero (i.e. <B> must also be upper triangular, though
+ * not necessarily packed upper triangular).
+ *
+ * Throws: <eslEINVAL> if matrices aren't the same dimensions, or
+ * if <A> is <eslUPPER> and any cell $i>j$ in
+ * <B> is nonzero.
+ */
+int
+esl_dmx_Add(ESL_DMATRIX *A, const ESL_DMATRIX *B)
+{
+ int i,j;
+
+ if (A->n != B->n) ESL_EXCEPTION(eslEINVAL, "matrices of different size");
+ if (A->m != B->m) ESL_EXCEPTION(eslEINVAL, "matrices of different size");
+
+ if (A->type == B->type) /* in this case, can just add cell by cell */
+ {
+ for (i = 0; i < A->ncells; i++)
+ A->mx[0][i] += B->mx[0][i];
+ }
+ else if (A->type == eslUPPER || B->type == eslUPPER)
+ {
+ /* Logic is: if either matrix is upper triangular, then the operation is
+ * to add upper triangles only. If we try to add a general matrix <B>
+ * to packed UT <A>, make sure all lower triangle entries in <B> are zero.
+ */
+ if (B->type != eslUPPER) {
+ for (i = 1; i < A->n; i++)
+ for (j = 0; j < i; j++)
+ if (B->mx[i][j] != 0.) ESL_EXCEPTION(eslEINVAL, "<B> has nonzero cells in lower triangle");
+ }
+ for (i = 0; i < A->n; i++)
+ for (j = i; j < A->m; j++)
+ A->mx[i][j] += B->mx[i][j];
+ }
+ return eslOK;
+}
+
+/* Function: esl_dmx_Scale()
+ *
+ * Purpose: Calculates <A = kA>: multiply matrix <A> by scalar
+ * <k> and leave answer in <A>.
+ */
+int
+esl_dmx_Scale(ESL_DMATRIX *A, double k)
+{
+ int i;
+
+ for (i = 0; i < A->ncells; i++) A->mx[0][i] *= k;
+ return eslOK;
+}
+
+
+/* Function: esl_dmx_AddScale()
+ *
+ * Purpose: Calculates <A + kB>, leaves answer in <A>.
+ *
+ * Only defined for matrices of the same type (<eslGENERAL>
+ * or <eslUPPER>).
+ *
+ * Throws: <eslEINVAL> if matrices aren't the same dimensions, or
+ * of different types.
+ */
+int
+esl_dmx_AddScale(ESL_DMATRIX *A, double k, const ESL_DMATRIX *B)
+{
+ int i;
+
+ if (A->n != B->n) ESL_EXCEPTION(eslEINVAL, "matrices of different size");
+ if (A->m != B->m) ESL_EXCEPTION(eslEINVAL, "matrices of different size");
+ if (A->type != B->type) ESL_EXCEPTION(eslEINVAL, "matrices of different type");
+
+ for (i = 0; i < A->ncells; i++) A->mx[0][i] += k * B->mx[0][i];
+ return eslOK;
+}
+
+
+/* Function: esl_dmx_Permute_PA()
+ *
+ * Purpose: Computes <B = PA>: do a row-wise permutation of a square
+ * matrix <A>, using the permutation matrix <P>, and put
+ * the result in a square matrix <B> that the caller has
+ * allocated.
+ *
+ * Throws: <eslEINVAL> if <A>, <B>, <P> do not have compatible dimensions,
+ * or if <A> or <B> is not of type <eslGENERAL>.
+ */
+int
+esl_dmx_Permute_PA(const ESL_PERMUTATION *P, const ESL_DMATRIX *A, ESL_DMATRIX *B)
+{
+ int i,ip,j;
+
+ if (A->n != P->n) ESL_EXCEPTION(eslEINVAL, "matrix dimensions not compatible");
+ if (A->n != B->n) ESL_EXCEPTION(eslEINVAL, "matrix dimensions not compatible");
+ if (A->n != A->m) ESL_EXCEPTION(eslEINVAL, "matrix dimensions not compatible");
+ if (B->n != B->m) ESL_EXCEPTION(eslEINVAL, "matrix dimensions not compatible");
+ if (A->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "matrix A not of type eslGENERAL");
+ if (B->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "matrix B not of type eslGENERAL");
+
+ for (i = 0; i < A->n; i++)
+ {
+ ip = P->pi[i];
+ for (j = 0; j < A->m; j++)
+ B->mx[i][j] = A->mx[ip][j];
+ }
+ return eslOK;
+}
+
+/* Function: esl_dmx_LUP_decompose()
+ *
+ * Purpose: Calculates a permuted LU decomposition of square matrix
+ * <A>; upon return, <A> is replaced by this decomposition,
+ * where <U> is in the lower triangle (inclusive of the
+ * diagonal) and <L> is the upper triangle (exclusive of
+ * diagonal, which is 1's by definition), and <P> is the
+ * permutation matrix. Caller provides an allocated
+ * permutation matrix <P> compatible with the square matrix
+ * <A>.
+ *
+ * Implements Gaussian elimination with pivoting
+ * \citep[p.~759]{Cormen99}.
+ *
+ * Throws: <eslEINVAL> if <A> isn't square, or if <P> isn't the right
+ * size for <A>, or if <A> isn't of general type.
+ */
+int
+esl_dmx_LUP_decompose(ESL_DMATRIX *A, ESL_PERMUTATION *P)
+{
+ int i,j,k;
+ int kpiv = 0; // initialization serves to quiet overzealous static analyzers
+ double max;
+ double swap;
+
+ if (A->n != A->m) ESL_EXCEPTION(eslEINVAL, "matrix isn't square");
+ if (P->n != A->n) ESL_EXCEPTION(eslEINVAL, "permutation isn't the right size");
+ if (A->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "matrix isn't of general type");
+ esl_permutation_Reuse(P);
+
+ for (k = 0; k < A->n-1; k++)
+ {
+ /* Identify our pivot; find row with maximum value in col[k].
+ * This is guaranteed to succeed and set <kpiv>
+ * (no matter what a static analyzer tells you)
+ */
+ max = 0.;
+ for (i = k; i < A->n; i++)
+ if (fabs(A->mx[i][k]) > max) {
+ max = fabs(A->mx[i][k]);
+ kpiv = i;
+ }
+ if (max == 0.) ESL_EXCEPTION(eslEDIVZERO, "matrix is singular");
+
+ /* Swap those rows (k and kpiv);
+ * and keep track of that permutation in P. (misuse j for swapping integers)
+ */
+ j = P->pi[k]; P->pi[k] = P->pi[kpiv]; P->pi[kpiv] = j;
+ for (j = 0; j < A->m; j++)
+ { swap = A->mx[k][j]; A->mx[k][j] = A->mx[kpiv][j]; A->mx[kpiv][j] = swap; }
+
+ /* Gaussian elimination for all rows k+1..n.
+ */
+ for (i = k+1; i < A->n; i++)
+ {
+ A->mx[i][k] /= A->mx[k][k];
+ for (j = k+1; j < A->m; j++)
+ A->mx[i][j] -= A->mx[i][k] * A->mx[k][j];
+ }
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_dmx_LU_separate()
+ *
+ * Purpose: Separate a square <LU> decomposition matrix into its two
+ * triangular matrices <L> and <U>. Caller provides two
+ * allocated <L> and <U> matrices of same size as <LU> for
+ * storing the results.
+ *
+ * <U> may be an upper triangular matrix in either unpacked
+ * (<eslGENERAL>) or packed (<eslUPPER>) form.
+ * <LU> and <L> must be of <eslGENERAL> type.
+ *
+ * Throws: <eslEINVAL> if <LU>, <L>, <U> are not of compatible dimensions,
+ * or if <LU> or <L> aren't of general type.
+ */
+int
+esl_dmx_LU_separate(const ESL_DMATRIX *LU, ESL_DMATRIX *L, ESL_DMATRIX *U)
+{
+ int i,j;
+
+ if (LU->n != LU->m) ESL_EXCEPTION(eslEINVAL, "LU isn't square");
+ if (L->n != L->m) ESL_EXCEPTION(eslEINVAL, "L isn't square");
+ if (U->n != U->m) ESL_EXCEPTION(eslEINVAL, "U isn't square");
+ if (LU->n != L->n) ESL_EXCEPTION(eslEINVAL, "LU, L have incompatible dimensions");
+ if (LU->n != U->n) ESL_EXCEPTION(eslEINVAL, "LU, U have incompatible dimensions");
+ if (LU->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "matrix isn't of general type");
+ if (L->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "matrix isn't of general type");
+
+ esl_dmatrix_SetZero(L);
+ esl_dmatrix_SetZero(U);
+
+ for (i = 0; i < LU->n; i++)
+ for (j = i; j < LU->m; j++)
+ U->mx[i][j] = LU->mx[i][j];
+
+ for (i = 0; i < LU->n; i++)
+ {
+ L->mx[i][i] = 1.;
+ for (j = 0; j < i; j++)
+ L->mx[i][j] = LU->mx[i][j];
+ }
+ return eslOK;
+}
+
+/* Function: esl_dmx_Invert()
+ *
+ * Purpose: Calculates the inverse of square matrix <A>, and stores the
+ * result in matrix <Ai>. Caller provides an allocated
+ * matrix <Ai> of same dimensions as <A>. Both must be
+ * of type <eslGENERAL>.
+ *
+ * Peforms the inversion by LUP decomposition followed by
+ * forward/back-substitution \citep[p.~753]{Cormen99}.
+ *
+ * Throws: <eslEINVAL> if <A>, <Ai> do not have same dimensions,
+ * if <A> isn't square, or if either isn't of
+ * type <eslGENERAL>.
+ * <eslEMEM> if internal allocations (for LU, and some other
+ * bookkeeping) fail.
+ */
+int
+esl_dmx_Invert(const ESL_DMATRIX *A, ESL_DMATRIX *Ai)
+{
+ ESL_DMATRIX *LU = NULL;
+ ESL_PERMUTATION *P = NULL;
+ double *y = NULL; /* column vector, intermediate calculation */
+ double *b = NULL; /* column vector of permuted identity matrix */
+ int i,j,k;
+ int status;
+
+ if (A->n != A->m) ESL_EXCEPTION(eslEINVAL, "matrix isn't square");
+ if (A->n != Ai->n || A->m != Ai->m) ESL_EXCEPTION(eslEINVAL, "matrices are different size");
+ if (A->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "matrix A not of general type");
+ if (Ai->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "matrix B not of general type");
+
+ /* Copy A to LU, and do an LU decomposition.
+ */
+ if ((LU = esl_dmatrix_Create(A->n, A->m)) == NULL) { status = eslEMEM; goto ERROR; }
+ if ((P = esl_permutation_Create(A->n)) == NULL) { status = eslEMEM; goto ERROR; }
+ if (( status = esl_dmatrix_Copy(A, LU)) != eslOK) goto ERROR;
+ if (( status = esl_dmx_LUP_decompose(LU, P)) != eslOK) goto ERROR;
+
+ /* Now we have:
+ * PA = LU
+ *
+ * to invert a matrix A, we want A A^-1 = I;
+ * that's PAx = Pb, for columns x of A^-1 and b of the identity matrix;
+ * and that's n equations LUx = Pb;
+ *
+ * so, solve Ly = Pb for y by forward substitution;
+ * then Ux = y by back substitution;
+ * x is then a column of A^-1.
+ *
+ * Do that for all columns.
+ */
+ ESL_ALLOC(b, sizeof(double) * A->n);
+ ESL_ALLOC(y, sizeof(double) * A->n);
+
+ for (k = 0; k < A->m; k++) /* for each column... */
+ {
+ /* build Pb for column j of the identity matrix */
+ for (i = 0; i < A->n; i++)
+ if (P->pi[i] == k) b[i] = 1.; else b[i] = 0.;
+
+ /* forward substitution
+ */
+ for (i = 0; i < A->n; i++)
+ {
+ y[i] = b[i];
+ for (j = 0; j < i; j++) y[i] -= LU->mx[i][j] * y[j];
+ }
+
+ /* back substitution
+ */
+ for (i = A->n-1; i >= 0; i--)
+ {
+ Ai->mx[i][k] = y[i];
+ for (j = i+1; j < A->n; j++) Ai->mx[i][k] -= LU->mx[i][j] * Ai->mx[j][k];
+ Ai->mx[i][k] /= LU->mx[i][i];
+ }
+ }
+
+ free(b);
+ free(y);
+ esl_dmatrix_Destroy(LU);
+ esl_permutation_Destroy(P);
+ return eslOK;
+
+ ERROR:
+ if (y != NULL) free(y);
+ if (b != NULL) free(b);
+ if (LU != NULL) esl_dmatrix_Destroy(LU);
+ if (P != NULL) esl_permutation_Destroy(P);
+ return status;
+}
+
+
+/*****************************************************************
+ * 7. Optional: interoperability with GSL
+ *****************************************************************/
+#ifdef HAVE_LIBGSL
+
+#include <gsl/gsl_matrix.h>
+
+int
+esl_dmx_MorphGSL(const ESL_DMATRIX *E, gsl_matrix **ret_G)
+{
+ gsl_matrix *G = NULL;
+ int i,j;
+
+ if (E->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "can only morph general matrices to GSL right now");
+
+ G = gsl_matrix_alloc(E->m, E->n);
+ for (i = 0; i < E->m; i++)
+ for (j = 0; j < E->n; j++)
+ gsl_matrix_set(G, i, j, E->mx[i][j]);
+ *ret_G = G;
+ return eslOK;
+}
+
+int
+esl_dmx_UnmorphGSL(const gsl_matrix *G, ESL_DMATRIX **ret_E)
+{
+ ESL_DMATRIX *E = NULL;
+ int i,j;
+
+ if ((E = esl_dmatrix_Create(G->size1, G->size2)) == NULL) return eslEMEM;
+ for (i = 0; i < G->size1; i++)
+ for (j = 0; j < G->size2; j++)
+ E->mx[i][j] = gsl_matrix_get(G, i, j);
+ *ret_E = E;
+ return eslOK;
+}
+
+#endif /*HAVE_LIBGSL*/
+
+/*****************************************************************
+ * 8. Optional: Interfaces to LAPACK
+ *****************************************************************/
+#ifdef HAVE_LIBLAPACK
+
+/* To include LAPACK code, you need to:
+ * 1. declare the C interface to the Fortran routine,
+ * appending _ to the Fortran routine's name (dgeev becomes dgeev_)
+ *
+ * 2. Remember to transpose matrices into column-major
+ * Fortran form
+ *
+ * 3. everything must be passed by reference, not by value
+ *
+ * 4. you don't need any include files, just lapack.a
+ *
+ * 5. Add -llapack to the compile line.
+ * (It doesn't appear that blas or g2c are needed?)
+ */
+
+/* Declare the C interface to the Fortran77 dgeev routine
+ * provided by the LAPACK library:
+ */
+extern void dgeev_(char *jobvl, char *jobvr, int *n, double *a,
+ int *lda, double *wr, double *wi, double *vl,
+ int *ldvl, double *vr, int *ldvr,
+ double *work, int *lwork, int *info);
+
+
+/* Function: esl_dmx_Diagonalize()
+ * Incept: SRE, Thu Mar 15 09:28:03 2007 [Janelia]
+ *
+ * Purpose: Given a square real matrix <A>, diagonalize it:
+ * solve for $U^{-1} A U = diag(\lambda_1... \lambda_n)$.
+ *
+ * Upon return, <ret_Er> and <ret_Ei> are vectors
+ * containing the real and complex parts of the eigenvalues
+ * $\lambda_i$; <ret_UL> is the $U^{-1}$ matrix containing
+ * the left eigenvectors; and <ret_UR> is the $U$ matrix
+ * containing the right eigenvectors.
+ *
+ * <ret_UL> and <ret_UR> are optional; pass <NULL> for
+ * either if you don't want that set of eigenvectors.
+ *
+ * This is a C interface to the <dgeev()> routine in the
+ * LAPACK linear algebra library.
+ *
+ * Args: A - square nxn matrix to diagonalize
+ * ret_Er - RETURN: real part of eigenvalues (0..n-1)
+ * ret_Ei - RETURN: complex part of eigenvalues (0..n-1)
+ * ret_UL - optRETURN: nxn matrix of left eigenvectors
+ * ret_UR - optRETURN:
+ *
+ * Returns: <eslOK> on success.
+ * <ret_Er> and <ret_Ei> (and <ret_UL>,<ret_UR> when they are
+ * requested) are allocated here, and must be free'd by the caller.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * In this case, the four return pointers are returned <NULL>.
+ *
+ * Xref: J1/19.
+ */
+int
+esl_dmx_Diagonalize(const ESL_DMATRIX *A, double **ret_Er, double **ret_Ei,
+ ESL_DMATRIX **ret_UL, ESL_DMATRIX **ret_UR)
+{
+ int status;
+ double *Er = NULL;
+ double *Ei = NULL;
+ ESL_DMATRIX *At = NULL;
+ ESL_DMATRIX *UL = NULL;
+ ESL_DMATRIX *UR = NULL;
+ double *work = NULL;
+ char jobul, jobur;
+ int lda;
+ int ldul, ldur;
+ int lwork;
+ int info;
+
+ if (A->n != A->m) ESL_EXCEPTION(eslEINVAL, "matrix isn't square");
+
+ if ((At = esl_dmatrix_Clone(A)) == NULL) { status = eslEMEM; goto ERROR; }
+ if ((UL = esl_dmatrix_Create(A->n,A->n)) == NULL) { status = eslEMEM; goto ERROR; }
+ if ((UR = esl_dmatrix_Create(A->n,A->n)) == NULL) { status = eslEMEM; goto ERROR; }
+ ESL_ALLOC(Er, sizeof(double) * A->n);
+ ESL_ALLOC(Ei, sizeof(double) * A->n);
+ ESL_ALLOC(work, sizeof(double) * 8 * A->n);
+
+ jobul = (ret_UL == NULL) ? 'N' : 'V'; /* do we want left eigenvectors? */
+ jobur = (ret_UR == NULL) ? 'N' : 'V'; /* do we want right eigenvectors? */
+ lda = A->n;
+ ldul = A->n;
+ ldur = A->n;
+ lwork = 8*A->n;
+
+ /* Fortran convention is colxrow, not rowxcol; so transpose
+ * a copy of A before passing it to a Fortran routine.
+ */
+ esl_dmx_Transpose(At);
+
+ /* The Fortran77 interface call to LAPACK's dgeev().
+ * All args must be passed by reference.
+ * Fortran 2D arrays are 1D: so pass the A[0] part of a DSMX.
+ */
+ dgeev_(&jobul, &jobur, &(At->n), At->mx[0], &lda, Er, Ei,
+ UL->mx[0], &ldul, UR->mx[0], &ldur, work, &lwork, &info);
+ if (info < 0) ESL_XEXCEPTION(eslEINVAL, "argument %d to LAPACK dgeev is invalid", -info);
+ if (info > 0) ESL_XEXCEPTION(eslEINVAL,
+ "diagonalization failed; only eigenvalues %d..%d were computed",
+ info+1, At->n);
+
+ /* Now, UL, UR are transposed (col x row), so transpose them back to
+ * C language convention.
+ */
+ esl_dmx_Transpose(UL);
+ esl_dmx_Transpose(UR);
+
+ esl_dmatrix_Destroy(At);
+ if (ret_UL != NULL) *ret_UL = UL; else esl_dmatrix_Destroy(UL);
+ if (ret_UR != NULL) *ret_UR = UR; else esl_dmatrix_Destroy(UR);
+ if (ret_Er != NULL) *ret_Er = Er; else free(Er);
+ if (ret_Ei != NULL) *ret_Ei = Ei; else free(Ei);
+ free(work);
+ return eslOK;
+
+ ERROR:
+ if (ret_UL != NULL) *ret_UL = NULL;
+ if (ret_UR != NULL) *ret_UR = NULL;
+ if (ret_Er != NULL) *ret_Er = NULL;
+ if (ret_Ei != NULL) *ret_Ei = NULL;
+ if (At != NULL) esl_dmatrix_Destroy(At);
+ if (UL != NULL) esl_dmatrix_Destroy(UL);
+ if (UR != NULL) esl_dmatrix_Destroy(UR);
+ if (Er != NULL) free(Er);
+ if (Ei != NULL) free(Ei);
+ if (work != NULL) free(work);
+ return status;
+}
+
+
+#endif /*HAVE_LIBLAPACK*/
+
+/*****************************************************************
+ * 9. Unit tests
+ *****************************************************************/
+#ifdef eslDMATRIX_TESTDRIVE
+
+static void
+utest_misc_ops(void)
+{
+ char *msg = "miscellaneous unit test failed";
+ ESL_DMATRIX *A, *B, *C;
+ int n = 20;
+
+ if ((A = esl_dmatrix_Create(n,n)) == NULL) esl_fatal(msg);
+ if ((B = esl_dmatrix_Create(n,n)) == NULL) esl_fatal(msg);
+ if ((C = esl_dmatrix_Create(n,n)) == NULL) esl_fatal(msg);
+
+ if (esl_dmatrix_SetIdentity(A) != eslOK) esl_fatal(msg); /* A=I */
+ if (esl_dmx_Invert(A, B) != eslOK) esl_fatal(msg); /* B=I^-1=I */
+ if (esl_dmx_Multiply(A,B,C) != eslOK) esl_fatal(msg); /* C=I */
+ if (esl_dmx_Transpose(A) != eslOK) esl_fatal(msg); /* A=I still */
+
+ if (esl_dmx_Scale(A, 0.5) != eslOK) esl_fatal(msg); /* A= 0.5I */
+ if (esl_dmx_AddScale(B, -0.5, C) != eslOK) esl_fatal(msg); /* B= 0.5I */
+
+ if (esl_dmx_Add(A,B) != eslOK) esl_fatal(msg); /* A=I */
+ if (esl_dmx_Scale(B, 2.0) != eslOK) esl_fatal(msg); /* B=I */
+
+ if (esl_dmatrix_Compare(A, B, 1e-12) != eslOK) esl_fatal(msg);
+ if (esl_dmatrix_Compare(A, C, 1e-12) != eslOK) esl_fatal(msg);
+ if (esl_dmatrix_Copy(B, C) != eslOK) esl_fatal(msg);
+ if (esl_dmatrix_Compare(A, C, 1e-12) != eslOK) esl_fatal(msg);
+
+ esl_dmatrix_Destroy(A);
+ esl_dmatrix_Destroy(B);
+ esl_dmatrix_Destroy(C);
+ return;
+}
+
+
+static void
+utest_Invert(ESL_DMATRIX *A)
+{
+ char *msg = "Failure in matrix inversion unit test";
+ ESL_DMATRIX *Ai = NULL;
+ ESL_DMATRIX *B = NULL;
+ ESL_DMATRIX *I = NULL;
+
+ if ((Ai = esl_dmatrix_Create(A->n, A->m)) == NULL) esl_fatal(msg);
+ if ((B = esl_dmatrix_Create(A->n, A->m)) == NULL) esl_fatal(msg);
+ if ((I = esl_dmatrix_Create(A->n, A->m)) == NULL) esl_fatal(msg);
+ if (esl_dmx_Invert(A, Ai) != eslOK) esl_fatal("matrix inversion failed");
+ if (esl_dmx_Multiply(A,Ai,B) != eslOK) esl_fatal(msg);
+ if (esl_dmatrix_SetIdentity(I) != eslOK) esl_fatal(msg);
+ if (esl_dmatrix_Compare(B,I, 1e-12) != eslOK) esl_fatal("inverted matrix isn't right");
+
+ esl_dmatrix_Destroy(Ai);
+ esl_dmatrix_Destroy(B);
+ esl_dmatrix_Destroy(I);
+ return;
+}
+
+
+#endif /*eslDMATRIX_TESTDRIVE*/
+
+
+
+/*****************************************************************
+ * 10. Test driver
+ *****************************************************************/
+
+/* gcc -g -Wall -o test -I. -L. -DeslDMATRIX_TESTDRIVE esl_dmatrix.c -leasel -lm
+ */
+#ifdef eslDMATRIX_TESTDRIVE
+#include "easel.h"
+#include "esl_dmatrix.h"
+#include "esl_random.h"
+
+int main(void)
+{
+ ESL_RANDOMNESS *r;
+ ESL_DMATRIX *A;
+ int n = 30;
+ int seed = 42;
+ int i,j;
+ double range = 100.;
+
+ /* Create a square matrix with random values from -range..range */
+ if ((r = esl_randomness_Create(seed)) == NULL) esl_fatal("failed to create random source");
+ if ((A = esl_dmatrix_Create(n, n)) == NULL) esl_fatal("failed to create matrix");
+ for (i = 0; i < n; i++)
+ for (j = 0; j < n; j++)
+ A->mx[i][j] = esl_random(r) * range * 2.0 - range;
+
+ utest_misc_ops();
+ utest_Invert(A);
+
+ esl_randomness_Destroy(r);
+ esl_dmatrix_Destroy(A);
+ return 0;
+}
+#endif /*eslDMATRIX_TESTDRIVE*/
+
+
+/*****************************************************************
+ * 11. Examples
+ *****************************************************************/
+
+/* gcc -g -Wall -o example -I. -DeslDMATRIX_EXAMPLE esl_dmatrix.c easel.c -lm
+ */
+#ifdef eslDMATRIX_EXAMPLE
+/*::cexcerpt::dmatrix_example::begin::*/
+#include "easel.h"
+#include "esl_dmatrix.h"
+
+int main(void)
+{
+ ESL_DMATRIX *A, *B, *C;
+
+ A = esl_dmatrix_Create(4,4);
+ B = esl_dmatrix_Create(4,4);
+ C = esl_dmatrix_Create(4,4);
+
+ esl_dmatrix_SetIdentity(A);
+ esl_dmatrix_Copy(A, B);
+
+ esl_dmx_Multiply(A,B,C);
+
+ esl_dmatrix_Dump(stdout, C, NULL, NULL);
+
+ esl_dmatrix_Destroy(A);
+ esl_dmatrix_Destroy(B);
+ esl_dmatrix_Destroy(C);
+ return 0;
+}
+/*::cexcerpt::dmatrix_example::end::*/
+#endif /*eslDMATRIX_EXAMPLE*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_dmatrix.h b/esl_dmatrix.h
new file mode 100644
index 0000000..af12174
--- /dev/null
+++ b/esl_dmatrix.h
@@ -0,0 +1,89 @@
+/* Double-precision two-dimensional matrices, and some linear algebra
+ *
+ * SRE, Tue Jul 13 14:41:07 2004 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslDMATRIX_INCLUDED
+#define eslDMATRIX_INCLUDED
+
+#include <stdio.h>
+
+typedef struct {
+ /*mx, mx[0] are allocated. */
+/*::cexcerpt::dmatrix_obj::begin::*/
+ double **mx; /* mx[i][j] is i'th row, j'th col */
+ int n; /* rows */
+ int m; /* columns */
+ enum { eslGENERAL, eslUPPER } type;
+/*::cexcerpt::dmatrix_obj::end::*/
+ int ncells; /* number of valid cells (nxm in standard matrix) */
+} ESL_DMATRIX;
+
+typedef struct {
+ int *pi;
+ int n;
+} ESL_PERMUTATION;
+
+/* 1. The ESL_DMATRIX object. */
+extern ESL_DMATRIX *esl_dmatrix_Create(int n, int m);
+extern ESL_DMATRIX *esl_dmatrix_CreateUpper(int n);
+extern int esl_dmatrix_Destroy(ESL_DMATRIX *A);
+extern int esl_dmatrix_Copy (const ESL_DMATRIX *src, ESL_DMATRIX *dest);
+extern ESL_DMATRIX *esl_dmatrix_Clone (const ESL_DMATRIX *old);
+extern int esl_dmatrix_Compare (const ESL_DMATRIX *A, const ESL_DMATRIX *B, double tol);
+extern int esl_dmatrix_CompareAbs (const ESL_DMATRIX *A, const ESL_DMATRIX *B, double tol);
+extern int esl_dmatrix_Set (ESL_DMATRIX *A, double x);
+extern int esl_dmatrix_SetZero (ESL_DMATRIX *A);
+extern int esl_dmatrix_SetIdentity(ESL_DMATRIX *A);
+
+/* 2. Debugging/validation for ESL_DMATRIX. */
+extern int esl_dmatrix_Dump(FILE *ofp, const ESL_DMATRIX *A,
+ const char *rowlabel, const char *collabel);
+
+/* 3. Visualization tools. */
+extern int esl_dmatrix_PlotHeatMap(FILE *fp, ESL_DMATRIX *D, double min, double max);
+
+/* 4. The ESL_PERMUTATION object. */
+extern ESL_PERMUTATION *esl_permutation_Create(int n);
+extern int esl_permutation_Destroy(ESL_PERMUTATION *P);
+extern int esl_permutation_Reuse(ESL_PERMUTATION *P);
+
+/* 5. Debugging/validation for ESL_PERMUTATION. */
+extern int esl_permutation_Dump(FILE *ofp, const ESL_PERMUTATION *P,
+ const char *rowlabel, const char *collabel);
+
+/* 6. The rest of the dmatrix API. */
+extern double esl_dmx_Max (const ESL_DMATRIX *A);
+extern double esl_dmx_Min (const ESL_DMATRIX *A);
+extern double esl_dmx_Sum (const ESL_DMATRIX *A);
+extern int esl_dmx_MinMax(const ESL_DMATRIX *A, double *ret_min, double *ret_max);
+extern int esl_dmx_FrobeniusNorm(const ESL_DMATRIX *A, double *ret_fnorm);
+extern int esl_dmx_Multiply(const ESL_DMATRIX *A, const ESL_DMATRIX *B, ESL_DMATRIX *C);
+extern int esl_dmx_Exp(const ESL_DMATRIX *Q, double t, ESL_DMATRIX *P);
+extern int esl_dmx_Transpose(ESL_DMATRIX *A);
+extern int esl_dmx_Add(ESL_DMATRIX *A, const ESL_DMATRIX *B);
+extern int esl_dmx_Scale(ESL_DMATRIX *A, double k);
+extern int esl_dmx_AddScale(ESL_DMATRIX *A, double k, const ESL_DMATRIX *B);
+extern int esl_dmx_Permute_PA(const ESL_PERMUTATION *P, const ESL_DMATRIX *A, ESL_DMATRIX *B);
+extern int esl_dmx_LUP_decompose(ESL_DMATRIX *A, ESL_PERMUTATION *P);
+extern int esl_dmx_LU_separate(const ESL_DMATRIX *LU, ESL_DMATRIX *L, ESL_DMATRIX *U);
+extern int esl_dmx_Invert(const ESL_DMATRIX *A, ESL_DMATRIX *Ai);
+
+/* 7. Optional: interoperability with GSL */
+#ifdef HAVE_LIBGSL
+#include <gsl/gsl_matrix.h>
+extern int esl_dmx_MorphGSL(const ESL_DMATRIX *E, gsl_matrix **ret_G);
+extern int esl_dmx_UnmorphGSL(const gsl_matrix *G, ESL_DMATRIX **ret_E);
+#endif
+
+/* 8. Optional: interfaces to LAPACK */
+#ifdef HAVE_LIBLAPACK
+extern int esl_dmx_Diagonalize(const ESL_DMATRIX *A, double **ret_Er, double **ret_Ei, ESL_DMATRIX **ret_UL, ESL_DMATRIX **ret_UR);
+#endif
+
+#endif /*eslDMATRIX_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
diff --git a/esl_dmatrix.tex b/esl_dmatrix.tex
new file mode 100644
index 0000000..47956a4
--- /dev/null
+++ b/esl_dmatrix.tex
@@ -0,0 +1,187 @@
+The \eslmod{dmatrix} module implements 2D matrices and linear algebra
+operations.
+
+There are two objects. The main one is a \ccode{ESL\_DMATRIX}, a 2D
+real-valued matrix of n rows and m columns. There is also
+\ccode{ESL\_PERMUTATION}, a special matrix used in LU decompositions.
+
+It is straightforward to call standard BLAS and LAPACK linear algebra
+routines on the data in an \ccode{ESL\_DMATRIX}.
+
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\hyperlink{func:esl_dmatrix_Create()}{\ccode{esl\_dmatrix\_Create()}} & Create general matrix.\\
+\hyperlink{func:esl_dmatrix_CreateUpper()}{\ccode{esl\_dmatrix\_CreateUpper()}} & Create packed upper triangular matrix.\\
+\hyperlink{func:esl_dmatrix_Destroy()}{\ccode{esl\_dmatrix\_Destroy()}} & Free a matrix.\\
+\hyperlink{func:esl_dmatrix_Dump()}{\ccode{esl\_dmatrix\_Dump()}} & Dump matrix internals to output stream.\\
+\hyperlink{func:esl_dmatrix_Copy()}{\ccode{esl\_dmatrix\_Copy()}} & Make a copy of a matrix (no new allocation).\\
+\hyperlink{func:esl_dmatrix_Clone()}{\ccode{esl\_dmatrix\_Clone()}} & Duplicate a matrix (allocate new storage).\\
+\hyperlink{func:esl_dmatrix_Compare()}{\ccode{esl\_dmatrix\_Compare()}} & Compare two matrices for equality.\\
+\hyperlink{func:esl_dmatrix_Set()}{\ccode{esl\_dmatrix\_Set()}} & Set all cells in matrix to same scalar value.\\
+\hyperlink{func:esl_dmatrix_SetZero()}{\ccode{esl\_dmatrix\_SetZero()}} & Set all cells in matrix to zero.\\
+\hyperlink{func:esl_dmatrix_SetIdentity()}{\ccode{esl\_dmatrix\_SetIdentity()}} & Set diagonal elements to 1, all others to zero.\\
+\hyperlink{func:esl_dmx_Max()}{\ccode{esl\_dmx\_Max()}} &Returns maximum element value.\\
+\hyperlink{func:esl_dmx_Min()}{\ccode{esl\_dmx\_Min()}} &Returns maximum element value.\\
+\hyperlink{func:esl_dmx_Sum()}{\ccode{esl\_dmx\_Sum()}} &Returns sum of all elements.\\
+\hyperlink{func:esl_permutation_Create()}{\ccode{esl\_permutation\_Create()}} & Create a permutation matrix.\\
+\hyperlink{func:esl_permutation_Destroy()}{\ccode{esl\_permutation\_Destroy()}} & Free a permutation matrix.\\
+\hyperlink{func:esl_permutation_Reuse()}{\ccode{esl\_permutation\_Reuse()}} & Reuse a permutation matrix.\\
+\hyperlink{func:esl_permutation_Dump()}{\ccode{esl\_permutation\_Dump()}} & Dump permutation matrix internals to output stream.\\
+\hyperlink{func:esl_dmx_Multiply()}{\ccode{esl\_dmx\_Multiply()}} & Matrix multiplication.\\
+\hyperlink{func:esl_dmx_Transpose()}{\ccode{esl\_dmx\_Transpose()}} & Matrix transpostion.\\
+\hyperlink{func:esl_dmx_Add()}{\ccode{esl\_dmx\_Add()}} & Matrix addition.\\
+\hyperlink{func:esl_dmx_Scale()}{\ccode{esl\_dmx\_Scale()}} & Multiply a matrix by a scalar.\\
+\hyperlink{func:esl_dmx_AddScale()}{\ccode{esl\_dmx\_AddScale()}} & $A + kB$ \\
+\hyperlink{func:esl_dmx_Permute_PA()}{\ccode{esl\_dmx\_Permute\_PA()}} & $B = PA$, a row-wise permutation of $A$.\\
+\hyperlink{func:esl_dmx_LUP_decompose()}{\ccode{esl\_dmx\_LUP\_decompose()}} & Permuted LU decomposition.\\
+\hyperlink{func:esl_dmx_LU_separate()}{\ccode{esl\_dmx\_LU\_separate()}} & Get answers from a LU decomposition.\\
+\hyperlink{func:esl_dmx_Invert()}{\ccode{esl\_dmx\_Invert()}} & Matrix inversion.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{dmatrix} API.}
+\label{tbl:dmatrix_api}
+\end{table}
+
+
+\subsection{Example of using the dmatrix API}
+
+A toy example that demonstrates the syntax of creating three 4x4
+square matrices and doing some simple operations on them:
+
+\input{cexcerpts/dmatrix_example}
+
+
+\subsection{Accessing matrix values}
+
+The accessible internals of the \ccode{ESL\_DMATRIX} structure are:
+
+\input{cexcerpts/dmatrix_obj}
+
+The matrix is stored in row-major orientation: the value in cell
+$(i,j)$ in row $i$ and column $j$ is in \ccode{mx->mx[i][j]}.
+
+Elements are stored in a single array \ccode{mx->mx[0]}. This is
+important for interoperability with BLAS and LAPACK; see below. The
+row pointers \ccode{mx->mx[i]} are initialized so that elements may be
+accessed simply as \ccode{mx->mx[i][j]}, rather than by pointer
+arithmetic \ccode{mx->mx[0] + i*mx->m + j}.
+
+\subsection{Specialized matrix types}
+
+Normally matrices are created with \ccode{esl\_dmatrix\_Create()},
+which allocates storage for all $n \times m$ cells. Easel calls this a
+matrix of type \ccode{eslGENERAL}.
+
+Matrices may have more restricted forms, which may constrain certain
+values and may allow packed storage. For example, an upper triangular
+matrix is one in which all elements $i>j$ have a value of zero. When
+we calculate the minimum in such a matrix with
+\ccode{esl\_dmatrix\_Min()}, we probably don't want to consider the
+$i>j$ elements. We also can save almost two-fold in storage by not
+storing the $i>j$ elements at all. Other types include square, lower
+triagonal, and symmetric matrices.
+
+We expect to need to expand Easel's implementation of different matrix
+types in the future, but right now, Easel has just one other matrix
+type, \ccode{eslUPPER}, for packed upper triangular matrices.
+
+\subsubsection{\ccode{eslUPPER}: packed upper triangular matrices}
+
+An \ccode{eslUPPER} matrix is created with
+\ccode{esl\_dmatrix\_CreateUpper(int n)}. It is necessarily square $n
+\times n$, so only one dimension argument is passed. Most but not all
+functions in \eslmod{dmatrix} can operate on \ccode{eslUPPER} matrix
+types in addition to the usual \ccode{eslGENERAL} type.
+
+The caller must not access any cell $i>j$ in an \ccode{eslUPPER}
+matrix. Setting a cell $i>j$ will corrupt the matrix. Accessing cell
+$i>j$ will return an incorrect value, not zero.
+
+The $n (n+1) / 2$ elements of the upper triagonal matrix are packed
+into an array \ccode{mx->mx[0]}. You can access element $i,j$ by
+pointer arithmetic at \ccode{mx->mx[j + i(2*mx->m-i-1)/2]} if you
+like, but it is easier to access element $i,j$ by the usual
+\ccode{mx->mx[i][j]}. This is made possible because the row pointers
+\ccode{mx->mx[i]} in an \ccode{eslUPPER} matrix are tricksily
+initialized in an overlapping fashion so that \ccode{mx->mx[i][j]}
+does the right thing for $i \leq j$. This overlapping is also the
+reason why \ccode{mx->mx[i][j]} accesses the wrong element when $i>j$.
+
+\subsubsection{Notes on the current implementation of matrix types}
+
+Easel matrix types conflate packing and element validity together. For
+example, an upper triangular matrix may be stored either in an
+\ccode{eslGENERAL} matrix type (in which case elements $i>j$ are set
+to zero) or the packed \ccode{eslUPPER} matrix type (in which case
+elements $i>j$ aren't even stored). Using the \ccode{eslUPPER} matrix
+type is 2x more space efficient, and also, operations like
+\ccode{esl\_dmatrix\_Min()} and \ccode{esl\_dmatrix\_Max()} will
+examine all elements in an \ccode{eslGENERAL} matrix (including the
+zeros), but only the elements $i \leq j$ in a \ccode{eslUPPER} matrix.
+
+This design is provisional. We may adopt a system more closely akin to
+BLAS/LAPACK in the future, which distinguish between matrix type and
+matrix storage. For example, BLAS has matrices of form \ccode{TR} and
+\ccode{TP} for triangular and packed triangular. Easel's
+implementation seems sufficient for the moment, and should also extend
+to lower diagonal and symmetric matrices without difficulty when and
+if they become needed. In any future development, look to BLAS and
+LAPACK for guidance.
+
+\subsection{Interoperability with BLAS and LAPACK}
+
+The BLAS and LAPACK libraries provide optimized, standardized linear
+algebra routines. The storage in \ccode{ESL\_DMATRIX} is designed so
+you can call routines in these libraries. The \ccode{mx->mx[0]} array
+is a valid matrix for BLAS and LAPACK so long as you know the right
+incantations. These are summarized here:
+
+{\small
+\begin{tabular}{llllll}
+Easel type & \ccode{CBLAS\_ORDER} & stride & \ccode{CBLAS\_UPLO} & type & code \\ \hline
+\ccode{eslGENERAL} & \ccode{CblasRowMajor} & \ccode{mx->m} & n/a & double & \ccode{GE} (GEneral) \\
+\ccode{eslUPPER} & \ccode{CBlasRowMajor} & \ccode{mx->m} & \ccode{CblasUpper} & double & \ccode{TP} (Triangular Packed) \\
+\end{tabular}
+}
+
+For example, to call the CBLAS (C implementation of BLAS) for an
+operation on an Easel matrix of type \ccode{eslGENERAL}, you look for
+a routine that starts with prefix \ccode{cblas\_dge*} (\ccode{d} for
+double, \ccode{ge} for general). An example is
+\ccode{cblas\_dgemm()}, the matrix multiplication (\ccode{mm})
+routine, which computes $C = \alpha \mathit{op}(A) \mathit{op}(B) +
+\beta C$ for matrices $A,B,C$ and scalars $\alpha,\beta$, where
+$\mathit{op}(A)$ means $A$, $A^T$ (the transpose), or $A^H$ (the
+conjugate transpose). $\mathit{op}(A)$ is an $M \times K$ matrix,
+$\mathit{op}(B)$ is $K \times N$ matrix, and the result $C$ is $M
+\times N$. The prototype for \ccode{cblas\_dgemm} is:
+
+\begin{cchunk}
+ void
+ cblas_dgemm (const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+ const int K, const double alpha, const double *A, const int lda,
+ const double *B, const int ldb, const double beta, double *C,
+ const int ldc)
+\end{cchunk}
+
+The \ccode{Order} argument is always \ccode{CblasRowMajor} for Easel
+matrices. The \ccode{TransA} and \ccode{TransB} arguments specify
+$\mathit{op}()$: \ccode{CblasNoTrans} means just the matrix
+itself. The \ccode{ld*} arguments are the major strides for each
+matrix: the number of elements in each row, for our row-major
+matrices. So, we could call:
+
+\begin{cchunk}
+ cblas_dgemm (CblasRowMajor, CblasNoTrans, CblasNoTrans,
+ A->n, B->m, A->m,
+ 1.0, A->mx[0], A->m,
+ B->mx[0], B->m,
+ 1.0, C->mx[0], C->m);
+\end{cchunk}
+
+
diff --git a/esl_dsqdata.c b/esl_dsqdata.c
new file mode 100644
index 0000000..14b6872
--- /dev/null
+++ b/esl_dsqdata.c
@@ -0,0 +1,1700 @@
+/* esl_dsqdata : faster sequence input
+ *
+ * Implements a predigitized binary file format for biological
+ * sequences. Sequence data are packed bitwise into 32-bit packets,
+ * where each packet contains either six 5-bit residues or fifteen
+ * 2-bit residues, plus two control bits. Input is asynchronous,
+ * using POSIX threads, with a "reader" thread doing disk reads and an
+ * "unpacker" thread preparing chunks of sequences for
+ * analysis. Sequence data and metadata are stored in separate files,
+ * which sometimes may allow further input acceleration by deferring
+ * metadata accesses until they're actually needed.
+ *
+ * A DSQDATA database <basename> is stored in four files:
+ * - basename : a human-readable stub
+ * - basename.dsqi : index file, enabling random access & parallel chunking
+ * - basename.dsqm : metadata including names, accessions, descs, taxonomy
+ * - basename.dsqs : sequences, in a packed binary format
+ *
+ * Contents:
+ * 1. ESL_DSQDATA: reading dsqdata format
+ * 2. Creating dsqdata format from a sequence file
+ * 3. ESL_DSQDATA_CHUNK, a chunk of input sequence data
+ * 4. Loader and unpacker, the input threads
+ * 5. Packing sequences and unpacking chunks
+ * 6. Notes and references
+ * 7. Unit tests
+ * 8. Test driver
+ * 9. Examples
+ */
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_dsqdata.h"
+#include "esl_random.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+#include <pthread.h>
+
+static ESL_DSQDATA_CHUNK *dsqdata_chunk_Create (ESL_DSQDATA *dd);
+static void dsqdata_chunk_Destroy(ESL_DSQDATA_CHUNK *chu);
+
+static void *dsqdata_loader_thread (void *p);
+static void *dsqdata_unpacker_thread(void *p);
+
+static int dsqdata_unpack_chunk(ESL_DSQDATA_CHUNK *chu, int do_pack5);
+static int dsqdata_unpack5(uint32_t *psq, ESL_DSQ *dsq, int *ret_L, int *ret_P);
+static int dsqdata_unpack2(uint32_t *psq, ESL_DSQ *dsq, int *ret_L, int *ret_P);
+static int dsqdata_pack5 (ESL_DSQ *dsq, int L, uint32_t *psq, int *ret_P);
+static int dsqdata_pack2 (ESL_DSQ *dsq, int L, uint32_t *psq, int *ret_P);
+
+
+/* Embedded magic numbers allow us to validate the correct binary
+ * format, with version (if needed in the future), and to detect
+ * byteswapping.
+ */
+static uint32_t eslDSQDATA_MAGIC_V1 = 0xc4d3d1b1; // "dsq1" + 0x80808080
+static uint32_t eslDSQDATA_MAGIC_V1SWAP = 0xb1d1d3c4; // ... as above, but byteswapped.
+
+/*****************************************************************
+ *# 1. <ESL_DSQDATA>: reading dsqdata format
+ *****************************************************************/
+
+/* Function: esl_dsqdata_Open()
+ * Synopsis: Open a digital sequence database for reading
+ * Incept: SRE, Wed Jan 20 09:50:00 2016 [Amtrak 2150, NYP-BOS]
+ *
+ * Purpose: Open digital sequence database <basename> for reading.
+ * Configure it for a specified number of 1 or
+ * more parallelized <nconsumers>. The consumers are one or
+ * more threads that are processing chunks of data in
+ * parallel.
+ *
+ * The file <basename> is a human-readable stub describing
+ * the database. The bulk of the data are in three
+ * accompanying binary files: the index file
+ * <basename>.dsqi, the metadata file <basename>.dsqm, and
+ * the sequence file <basename>.dsqs.
+ *
+ * <byp_abc> provides a way to either tell <dsqdata> to
+ * expect a specific alphabet in the <basename> database
+ * (and return a normal failure on a mismatch), or, when
+ * the alphabet remains unknown, to figure out the alphabet
+ * in <basename> is and allocate and return a new alphabet.
+ * <byp_abc> uses a partial Easel "bypass" idiom for this:
+ * if <*byp_abc> is NULL, we allocate and return a new
+ * alphabet; if <*byp_abc> is a ptr to an existing
+ * alphabet, we use it for validation. That is,
+ *
+ * \begin{cchunk}
+ * abc = NULL;
+ * esl_dsqdata_Open(&abc, basename...)
+ * // <abc> is now the alphabet of <basename>;
+ * // you're responsible for Destroy'ing it
+ * \end{cchunk}
+ *
+ * or:
+ * \begin{cchunk}
+ * abc = esl_alphabet_Create(eslAMINO);
+ * status = esl_dsqdata_Open(&abc, basename);
+ * // if status == eslEINCOMPAT, alphabet in basename
+ * // doesn't match caller's expectation
+ * \end{cchunk}
+ *
+ * Args: byp_abc : optional alphabet hint; pass &abc or NULL.
+ * basename : data are in files <basename> and <basename.dsq[ism]>
+ * nconsumers : number of consumer threads caller is going to Read() with
+ * ret_dd : RETURN : the new ESL_DSQDATA object.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslENOTFOUND> if one or more of the expected datafiles
+ * aren't there or can't be opened.
+ *
+ * <eslEFORMAT> if something looks wrong in parsing file
+ * formats. Includes problems in headers, and also the
+ * case where caller provides a digital alphabet in
+ * <*byp_abc> and it doesn't match the database's alphabet.
+ *
+ * On any normal error, <*ret_dd> is still returned, but in
+ * an error state, and <dd->errbuf> is a user-directed
+ * error message that the caller can relay to the user. Other
+ * than the <errbuf>, the rest of the contents are undefined.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslESYS> on system call failure.
+ * <eslEUNIMPLEMENTED> if data are byteswapped
+ * TODO: handle byteswapping
+ *
+ * On any thrown exception, <*ret_dd> is returned NULL.
+ */
+int
+esl_dsqdata_Open(ESL_ALPHABET **byp_abc, char *basename, int nconsumers, ESL_DSQDATA **ret_dd)
+{
+ ESL_DSQDATA *dd = NULL;
+ int bufsize = 4096;
+ uint32_t magic = 0;
+ uint32_t tag = 0;
+ uint32_t alphatype = eslUNKNOWN;
+ char *p; // used for strtok() parsing of fields on a line
+ char buf[4096];
+ int status;
+
+ ESL_DASSERT1(( nconsumers > 0 ));
+
+ ESL_ALLOC(dd, sizeof(ESL_DSQDATA));
+ dd->stubfp = NULL;
+ dd->ifp = NULL;
+ dd->sfp = NULL;
+ dd->mfp = NULL;
+ dd->abc_r = *byp_abc; // This may be NULL; if so, we create it later.
+ dd->magic = 0;
+ dd->uniquetag = 0;
+ dd->flags = 0;
+ dd->max_namelen = 0;
+ dd->max_acclen = 0;
+ dd->max_desclen = 0;
+ dd->max_seqlen = 0;
+ dd->nseq = 0;
+ dd->nres = 0;
+
+ dd->chunk_maxseq = eslDSQDATA_CHUNK_MAXSEQ; // someday we may want to allow tuning these
+ dd->chunk_maxpacket = eslDSQDATA_CHUNK_MAXPACKET;
+ dd->do_byteswap = FALSE;
+ dd->pack5 = FALSE;
+
+ dd->nconsumers = nconsumers;
+ dd->loader_outbox = NULL;
+ dd->unpacker_outbox = NULL;
+ dd->recycling = NULL;
+ dd->errbuf[0] = '\0';
+ dd->at_eof = FALSE;
+ dd->lt_c = dd->lom_c = dd->lof_c = dd->loe_c = FALSE;
+ dd->ut_c = dd->uom_c = dd->uof_c = dd->uoe_c = FALSE;
+ dd->rm_c = dd->r_c = FALSE;
+ dd->errbuf[0] = '\0';
+
+ /* Open the four files.
+ */
+ ESL_ALLOC( dd->basename, sizeof(char) * (strlen(basename) + 6)); // +5 for .dsqx; +1 for \0
+ if ( sprintf(dd->basename, "%s.dsqi", basename) <= 0) ESL_XEXCEPTION_SYS(eslESYS, "sprintf() failure");
+ if (( dd->ifp = fopen(dd->basename, "rb")) == NULL) ESL_XFAIL(eslENOTFOUND, dd->errbuf, "Failed to find or open index file %s\n", dd->basename);
+
+ if ( sprintf(dd->basename, "%s.dsqm", basename) <= 0) ESL_XEXCEPTION_SYS(eslESYS, "sprintf() failure");
+ if (( dd->mfp = fopen(dd->basename, "rb")) == NULL) ESL_XFAIL(eslENOTFOUND, dd->errbuf, "Failed to find or open metadata file %s\n", dd->basename);
+
+ if ( sprintf(dd->basename, "%s.dsqs", basename) <= 0) ESL_XEXCEPTION_SYS(eslESYS, "sprintf() failure");
+ if (( dd->sfp = fopen(dd->basename, "rb")) == NULL) ESL_XFAIL(eslENOTFOUND, dd->errbuf, "Failed to find or open sequence file %s\n", dd->basename);
+
+ strcpy(dd->basename, basename);
+ if (( dd->stubfp = fopen(dd->basename, "r")) == NULL) ESL_XFAIL(eslENOTFOUND, dd->errbuf, "Failed to find or open stub file %s\n", dd->basename);
+
+ /* The stub file is unparsed, intended to be human readable, with one exception:
+ * The first line contains the unique tag that we use to validate linkage of the 4 files.
+ * The format of that first line is:
+ * Easel dsqdata v123 x0000000000
+ */
+ if ( fgets(buf, bufsize, dd->stubfp) == NULL) ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file is empty - no tag line found");
+ if (( p = strtok(buf, " \t\n\r")) == NULL) ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file has bad format: tag line has no data");
+ if ( strcmp(p, "Easel") != 0) ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file has bad format in tag line");
+ if (( p = strtok(NULL, " \t\n\r")) == NULL) ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file has bad format in tag line");
+ if ( strcmp(p, "dsqdata") != 0) ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file has bad format in tag line");
+ if (( p = strtok(NULL, " \t\n\r")) == NULL) ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file has bad format in tag line");
+ if ( *p != 'v') ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file has bad format: no v on version");
+ if ( ! esl_str_IsInteger(p+1)) ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file had bad format: no version number");
+ // version number is currently unused: there's only 1
+ if (( p = strtok(NULL, " \t\n\r")) == NULL) ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file has bad format in tag line");
+ if ( *p != 'x') ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file has bad format: no x on tag");
+ if ( ! esl_str_IsInteger(p+1)) ESL_XFAIL(eslEFORMAT, dd->errbuf, "stub file had bad format: no integer tag");
+ dd->uniquetag = strtoul(p+1, NULL, 10);
+
+ /* Index file has a header of 7 uint32's, 3 uint64's */
+ if ( fread(&(dd->magic), sizeof(uint32_t), 1, dd->ifp) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file has no header - is empty?");
+ if ( fread(&tag, sizeof(uint32_t), 1, dd->ifp) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file header truncated, no tag");
+ if ( fread(&alphatype, sizeof(uint32_t), 1, dd->ifp) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file header truncated, no alphatype");
+ if ( fread(&(dd->flags), sizeof(uint32_t), 1, dd->ifp) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file header truncated, no flags");
+ if ( fread(&(dd->max_namelen), sizeof(uint32_t), 1, dd->ifp) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file header truncated, no max name len");
+ if ( fread(&(dd->max_acclen), sizeof(uint32_t), 1, dd->ifp) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file header truncated, no max accession len");
+ if ( fread(&(dd->max_desclen), sizeof(uint32_t), 1, dd->ifp) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file header truncated, no max description len");
+
+ if ( fread(&(dd->max_seqlen), sizeof(uint64_t), 1, dd->ifp) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file header truncated, no max seq len");
+ if ( fread(&(dd->nseq), sizeof(uint64_t), 1, dd->ifp) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file header truncated, no nseq");
+ if ( fread(&(dd->nres), sizeof(uint64_t), 1, dd->ifp) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file header truncated, no nres");
+
+ /* Check the magic and the tag */
+ if (tag != dd->uniquetag) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file has bad tag, doesn't go with stub file");
+ // Eventually we would set dd->do_byteswap = TRUE; below.
+ if (dd->magic == eslDSQDATA_MAGIC_V1SWAP) ESL_XEXCEPTION(eslEUNIMPLEMENTED, "dsqdata cannot yet read data in different byte orders");
+ else if (dd->magic != eslDSQDATA_MAGIC_V1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file has bad magic");
+
+ /* Either validate, or create the alphabet */
+ if (dd->abc_r)
+ {
+ if (alphatype != dd->abc_r->type)
+ ESL_XFAIL(eslEFORMAT, dd->errbuf, "data files use %s alphabet; expected %s alphabet",
+ esl_abc_DecodeType(alphatype),
+ esl_abc_DecodeType(dd->abc_r->type));
+ }
+ else
+ {
+ if ( esl_abc_ValidateType(alphatype) != eslOK) ESL_XFAIL(eslEFORMAT, dd->errbuf, "index file has invalid alphabet type %d", alphatype);
+ if (( dd->abc_r = esl_alphabet_Create(alphatype)) == NULL) ESL_XEXCEPTION(eslEMEM, "alphabet creation failed");
+ }
+
+ /* If it's protein, flip the switch to expect all 5-bit packing */
+ if (dd->abc_r->type == eslAMINO) dd->pack5 = TRUE;
+
+ /* Metadata file has a header of 2 uint32's, magic and uniquetag */
+ if (( fread(&magic, sizeof(uint32_t), 1, dd->mfp)) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "metadata file has no header - is empty?");
+ if (( fread(&tag, sizeof(uint32_t), 1, dd->mfp)) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "metadata file header truncated - no tag?");
+ if ( magic != dd->magic) ESL_XFAIL(eslEFORMAT, dd->errbuf, "metadata file has bad magic");
+ if ( tag != dd->uniquetag) ESL_XFAIL(eslEFORMAT, dd->errbuf, "metadata file has bad tag, doesn't match stub");
+
+ /* Sequence file also has a header of 2 uint32's, magic and uniquetag */
+ if (( fread(&magic, sizeof(uint32_t), 1, dd->sfp)) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "sequence file has no header - is empty?");
+ if (( fread(&tag, sizeof(uint32_t), 1, dd->sfp)) != 1) ESL_XFAIL(eslEFORMAT, dd->errbuf, "sequence file header truncated - no tag?");
+ if ( magic != dd->magic) ESL_XFAIL(eslEFORMAT, dd->errbuf, "sequence file has bad magic");
+ if ( tag != dd->uniquetag) ESL_XFAIL(eslEFORMAT, dd->errbuf, "sequence file has bad tag, doesn't match stub");
+
+ /* Create the loader and unpacker threads.
+ */
+ if ( pthread_mutex_init(&dd->loader_outbox_mutex, NULL) != 0) ESL_XEXCEPTION(eslESYS, "pthread_mutex_init() failed"); dd->lom_c = TRUE;
+ if ( pthread_mutex_init(&dd->unpacker_outbox_mutex, NULL) != 0) ESL_XEXCEPTION(eslESYS, "pthread_mutex_init() failed"); dd->uom_c = TRUE;
+ if ( pthread_mutex_init(&dd->recycling_mutex, NULL) != 0) ESL_XEXCEPTION(eslESYS, "pthread_mutex_init() failed"); dd->rm_c = TRUE;
+
+ if ( pthread_cond_init(&dd->loader_outbox_full_cv, NULL) != 0) ESL_XEXCEPTION(eslESYS, "pthread_cond_init() failed"); dd->lof_c = TRUE;
+ if ( pthread_cond_init(&dd->loader_outbox_empty_cv, NULL) != 0) ESL_XEXCEPTION(eslESYS, "pthread_cond_init() failed"); dd->loe_c = TRUE;
+ if ( pthread_cond_init(&dd->unpacker_outbox_full_cv, NULL) != 0) ESL_XEXCEPTION(eslESYS, "pthread_cond_init() failed"); dd->uof_c = TRUE;
+ if ( pthread_cond_init(&dd->unpacker_outbox_empty_cv, NULL) != 0) ESL_XEXCEPTION(eslESYS, "pthread_cond_init() failed"); dd->uoe_c = TRUE;
+ if ( pthread_cond_init(&dd->recycling_cv, NULL) != 0) ESL_XEXCEPTION(eslESYS, "pthread_cond_init() failed"); dd->r_c = TRUE;
+
+ if ( pthread_create(&dd->unpacker_t, NULL, dsqdata_unpacker_thread, dd) != 0) ESL_XEXCEPTION(eslESYS, "pthread_create() failed"); dd->ut_c = TRUE;
+ if ( pthread_create(&dd->loader_t, NULL, dsqdata_loader_thread, dd) != 0) ESL_XEXCEPTION(eslESYS, "pthread_create() failed"); dd->lt_c = TRUE;
+
+ *ret_dd = dd;
+ *byp_abc = dd->abc_r; // If caller provided <*byp_abc> this is a no-op, because we set abc_r = *byp_abc.
+ return eslOK; // .. otherwise we're passing the created <abc> back to caller, caller's
+ // responsibility, we just keep the reference to it.
+ ERROR:
+ if (status == eslENOTFOUND || status == eslEFORMAT || status == eslEINCOMPAT)
+ { /* on normal errors, we return <dd> with its <errbuf>, don't change *byp_abc */
+ *ret_dd = dd;
+ if (*byp_abc == NULL && dd->abc_r) esl_alphabet_Destroy(dd->abc_r);
+ return status;
+ }
+ else
+ { /* on exceptions, we free <dd>, return it NULL, don't change *byp_abc */
+ esl_dsqdata_Close(dd);
+ *ret_dd = NULL;
+ if (*byp_abc == NULL && dd->abc_r) esl_alphabet_Destroy(dd->abc_r);
+ return status;
+ }
+}
+
+
+/* Function: esl_dsqdata_Read()
+ * Synopsis: Read next chunk of sequence data.
+ * Incept: SRE, Thu Jan 21 11:21:38 2016 [Harvard]
+ *
+ * Purpose: Read the next chunk from <dd>, return a pointer to it in
+ * <*ret_chu>, and return <eslOK>. When data are exhausted,
+ * return <eslEOF>, and <*ret_chu> is <NULL>.
+ *
+ * Threadsafe. All thread operations in the dsqdata reader
+ * are handled internally. Caller does not have to worry
+ * about wrapping this in a mutex. Multiple caller threads
+ * can call <esl_dsqdata_Read()>.
+ *
+ * All chunk allocation and deallocation is handled
+ * internally. After using a chunk, caller gives it back to
+ * the reader using <esl_dsqdata_Recycle()>.
+ *
+ * Args: dd : open dsqdata object to read from
+ * ret_chu : RETURN : next chunk of seq data
+ *
+ * Returns: <eslOK> on success. <*ret_chu> is a chunk of seq data.
+ * Caller must call <esl_dsqdata_Recycle()> on each chunk
+ * that it Read()'s.
+ *
+ * <eslEOF> if we've reached the end of the input file;
+ * <*ret_chu> is NULL.
+ *
+ * Throws: <eslESYS> if a pthread call fails.
+ * Caller should treat this as disastrous. Without correctly
+ * working pthread calls, we cannot read, and we may not be able
+ * to correctly clean up and close the reader. Caller should
+ * treat <dd> as toxic, clean up whatever else it may need to,
+ * and exit.
+ */
+int
+esl_dsqdata_Read(ESL_DSQDATA *dd, ESL_DSQDATA_CHUNK **ret_chu)
+{
+ ESL_DSQDATA_CHUNK *chu = NULL;
+
+ /* The loader and unpacker have already done the work. All that
+ * _Read() needs to do is take a finished chunk from the unpacker's
+ * outbox. There's three possibilities here:
+ *
+ * 1. A chunk is waiting in the outbox (unpacker_outbox != NULL, chu->N > 0).
+ * Pick it up; signal back to the unpacker that we've done so.
+ *
+ * 2. An empty chunk is waiting in the outbox (unpacker_outbox !=
+ * NULL, chu->N == 0). This is the EOF signal from the unpacker.
+ * There's only one of them, so only one reader will see it.
+ * This reader raises the at_eof flag for all other readers to
+ * see. Now instead of signalling the *unpacker* (which already
+ * knows it is EOF), we must signal the other *readers*, who may
+ * be sitting on a conditional wait for the outbox to be
+ * non-NULL, which it will never be again: so we signal "outbox
+ * full", which really means "outbox full or at EOF". Then the
+ * reader recycles the empty chunk itself, and caller just gets a
+ * NULL chunk and a eslEOF return status.
+ *
+ * 3. The at_eof flag is up. Again we signal "outbox full or at EOF"
+ * to the remaining readers to wake them up, then return eslEOF.
+ *
+ * The reason for the above verbosity is that it's super easy to
+ * get a low-probability race condition here, and stall the threads.
+ */
+ if ( pthread_mutex_lock(&dd->unpacker_outbox_mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread call failed");
+ while (! dd->at_eof && dd->unpacker_outbox == NULL) {
+ if ( pthread_cond_wait(&dd->unpacker_outbox_full_cv, &dd->unpacker_outbox_mutex) != 0)
+ ESL_EXCEPTION(eslESYS, "pthread call failed");
+ }
+
+ chu = dd->unpacker_outbox;
+ dd->unpacker_outbox = NULL;
+
+ /* Case 1: A data chunk. */
+ if (chu && chu->N)
+ {
+ if ( pthread_mutex_unlock(&dd->unpacker_outbox_mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread call failed");
+ if ( pthread_cond_signal (&dd->unpacker_outbox_empty_cv) != 0) ESL_EXCEPTION(eslESYS, "pthread call failed");
+ *ret_chu = chu;
+ return eslOK;
+ }
+ /* Case 2. The EOF chunk. */
+ else if (chu)
+ {
+ dd->at_eof = TRUE;
+ if ( pthread_mutex_unlock(&dd->unpacker_outbox_mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread call failed");
+ if ( pthread_cond_signal (&dd->unpacker_outbox_full_cv) != 0) ESL_EXCEPTION(eslESYS, "pthread call failed");
+ esl_dsqdata_Recycle(dd, chu);
+ *ret_chu = NULL;
+ return eslEOF;
+ }
+ /* Case 3: Another reader already set eof */
+ else
+ {
+ if ( pthread_mutex_unlock(&dd->unpacker_outbox_mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread call failed");
+ if ( pthread_cond_signal (&dd->unpacker_outbox_full_cv) != 0) ESL_EXCEPTION(eslESYS, "pthread call failed");
+ *ret_chu = NULL;
+ return eslEOF;
+ }
+ /*NOTREACHED*/
+}
+
+
+/* Function: esl_dsqdata_Recycle()
+ * Synopsis: Give a chunk back to the reader.
+ * Incept: SRE, Thu Feb 11 19:24:33 2016
+ *
+ * Purpose: Recycle chunk <chu> back to the reader <dd>. The reader
+ * is responsible for all allocation and deallocation of
+ * chunks. The reader will either reuse the chunk's memory
+ * if more chunks remain to be read, or it will free it.
+ *
+ * If <chu> is <NULL>, do nothing. This case arises when
+ * the reader is at EOF.
+ *
+ * Args: dd : the dsqdata reader
+ * chu : chunk to recycle
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> on a pthread call failure. Caller should regard
+ * such an error as disastrous; if pthread calls are
+ * failing, you cannot depend on the reader to be working
+ * at all, and you should treat <dd> as toxic. Do whatever
+ * desperate things you need to do and exit.
+ */
+int
+esl_dsqdata_Recycle(ESL_DSQDATA *dd, ESL_DSQDATA_CHUNK *chu)
+{
+ if (chu)
+ {
+ if ( pthread_mutex_lock(&dd->recycling_mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread mutex lock failed");
+ chu->nxt = dd->recycling; // Push chunk onto head of recycling stack
+ dd->recycling = chu;
+ if ( pthread_mutex_unlock(&dd->recycling_mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread mutex unlock failed");
+ if ( pthread_cond_signal(&dd->recycling_cv) != 0) ESL_EXCEPTION(eslESYS, "pthread cond signal failed");
+ // That signal told the loader that there's a chunk it can recycle.
+ }
+ return eslOK;
+}
+
+
+
+/* Function: esl_dsqdata_Close()
+ * Synopsis: Close a dsqdata reader.
+ * Incept: SRE, Thu Feb 11 19:32:54 2016
+ *
+ * Purpose: Close a dsqdata reader.
+ *
+ * Returns: <eslOK> on success.
+
+ * Throws: <eslESYS> on a system call failure, including pthread
+ * calls and fclose(). Caller should regard such a failure
+ * as disastrous: treat <dd> as toxic and exit as soon as
+ * possible without making any other system calls, if possible.
+ */
+int
+esl_dsqdata_Close(ESL_DSQDATA *dd)
+{
+ if (dd)
+ {
+ if (dd->lt_c) { if ( pthread_join(dd->loader_t, NULL) != 0) ESL_EXCEPTION(eslESYS, "pthread join failed"); }
+ if (dd->ut_c) { if ( pthread_join(dd->unpacker_t, NULL) != 0) ESL_EXCEPTION(eslESYS, "pthread join failed"); }
+ if (dd->lof_c) { if ( pthread_cond_destroy(&dd->loader_outbox_full_cv) != 0) ESL_EXCEPTION(eslESYS, "pthread cond destroy failed"); }
+ if (dd->loe_c) { if ( pthread_cond_destroy(&dd->loader_outbox_empty_cv) != 0) ESL_EXCEPTION(eslESYS, "pthread cond destroy failed"); }
+ if (dd->uof_c) { if ( pthread_cond_destroy(&dd->unpacker_outbox_full_cv) != 0) ESL_EXCEPTION(eslESYS, "pthread cond destroy failed"); }
+ if (dd->uoe_c) { if ( pthread_cond_destroy(&dd->unpacker_outbox_empty_cv) != 0) ESL_EXCEPTION(eslESYS, "pthread cond destroy failed"); }
+ if (dd->r_c) { if ( pthread_cond_destroy(&dd->recycling_cv) != 0) ESL_EXCEPTION(eslESYS, "pthread cond destroy failed"); }
+ if (dd->lom_c) { if ( pthread_mutex_destroy(&dd->loader_outbox_mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread mutex destroy failed"); }
+ if (dd->uom_c) { if ( pthread_mutex_destroy(&dd->unpacker_outbox_mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread mutex destroy failed"); }
+ if (dd->rm_c) { if ( pthread_mutex_destroy(&dd->recycling_mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread mutex destroy failed"); }
+
+ if (dd->ifp) { if ( fclose(dd->ifp) != 0) ESL_EXCEPTION(eslESYS, "fclose failed"); }
+ if (dd->sfp) { if ( fclose(dd->sfp) != 0) ESL_EXCEPTION(eslESYS, "fclose failed"); }
+ if (dd->mfp) { if ( fclose(dd->mfp) != 0) ESL_EXCEPTION(eslESYS, "fclose failed"); }
+ if (dd->stubfp) { if ( fclose(dd->stubfp) != 0) ESL_EXCEPTION(eslESYS, "fclose failed"); }
+
+ if (dd->basename) free(dd->basename);
+
+ /* Loader thread is responsible for freeing all chunks it created, even on error. */
+ ESL_DASSERT1(( dd->loader_outbox == NULL ));
+ ESL_DASSERT1(( dd->unpacker_outbox == NULL ));
+ ESL_DASSERT1(( dd->recycling == NULL ));
+
+ free(dd);
+ }
+ return eslOK;
+}
+
+
+/*****************************************************************
+ *# 2. Creating dsqdata format from a sequence file
+ *****************************************************************/
+
+/* Function: esl_dsqdata_Write()
+ * Synopsis: Create a dsqdata database
+ * Incept: SRE, Sat Feb 13 07:33:30 2016 [AGBT 2016, Orlando]
+ *
+ * Purpose: Caller has just opened <sqfp>, in digital mode.
+ * Create a dsqdata database <basename> from the sequence
+ * data in <sqfp>.
+ *
+ * <sqfp> must be protein, DNA, or RNA sequence data. It
+ * must be rewindable (i.e. a file), because we have to
+ * read it twice. It must be newly opened (i.e. positioned
+ * at the start).
+ *
+ * Args: sqfp - newly opened sequence data file
+ * basename - base name of dsqdata files to create
+ * errbuf - user-directed error message on normal errors
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEWRITE> if an output file can't be opened. <errbuf>
+ * contains user-directed error message.
+ *
+ * <eslEFORMAT> if a parse error is encountered while
+ * reading <sqfp>.
+ *
+ *
+ * Throws: <eslESYS> A system call failed, such as fwrite().
+ * <eslEINVAL> Sequence handle <sqfp> isn't digital and rewindable.
+ * <eslEMEM> Allocation failure
+ * <eslEUNIMPLEMENTED> Sequence is too long to be encoded.
+ * (TODO: chromosome-scale DNA sequences)
+ */
+int
+esl_dsqdata_Write(ESL_SQFILE *sqfp, char *basename, char *errbuf)
+{
+ ESL_RANDOMNESS *rng = NULL;
+ ESL_SQ *sq = NULL;
+ FILE *stubfp = NULL;
+ FILE *ifp = NULL;
+ FILE *mfp = NULL;
+ FILE *sfp = NULL;
+ char *outfile = NULL;
+ uint32_t magic = eslDSQDATA_MAGIC_V1;
+ uint32_t uniquetag;
+ uint32_t alphatype;
+ uint32_t flags = 0;
+ uint32_t max_namelen = 0;
+ uint32_t max_acclen = 0;
+ uint32_t max_desclen = 0;
+ uint64_t max_seqlen = 0;
+ uint64_t nseq = 0;
+ uint64_t nres = 0;
+ int do_pack5 = FALSE;
+ uint32_t *psq;
+ ESL_DSQDATA_RECORD idx; // one index record to write
+ int plen;
+ int64_t spos = 0;
+ int64_t mpos = 0;
+ int n;
+ int status;
+
+ if (! esl_sqfile_IsRewindable(sqfp)) ESL_EXCEPTION(eslEINVAL, "sqfp must be rewindable (e.g. an open file)");
+ if (! sqfp->abc) ESL_EXCEPTION(eslEINVAL, "sqfp must be digital");
+ // Could also check that it's positioned at the start.
+ if ( (sq = esl_sq_CreateDigital(sqfp->abc)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ /* First pass over the sequence file, to get statistics.
+ * Read it now, before opening any files, in case we find any parse errors.
+ */
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ if (sq->n >= 6 * eslDSQDATA_CHUNK_MAXPACKET) // guaranteed limit
+ ESL_EXCEPTION(eslEUNIMPLEMENTED, "dsqdata cannot currently deal with large sequences");
+
+ nseq++;
+ nres += sq->n;
+ if (sq->n > max_seqlen) max_seqlen = sq->n;
+ n = strlen(sq->name); if (n > max_namelen) max_namelen = n;
+ n = strlen(sq->acc); if (n > max_acclen) max_acclen = n;
+ n = strlen(sq->desc); if (n > max_desclen) max_desclen = n;
+ esl_sq_Reuse(sq);
+ }
+ if (status == eslEFORMAT) ESL_XFAIL(eslEFORMAT, errbuf, sqfp->get_error(sqfp));
+ else if (status != eslEOF) return status;
+
+ if ((status = esl_sqfile_Position(sqfp, 0)) != eslOK) return status;
+
+
+ if (( rng = esl_randomness_Create(0) ) == NULL) { status = eslEMEM; goto ERROR; }
+ uniquetag = esl_random_uint32(rng);
+ alphatype = sqfp->abc->type;
+
+ if (alphatype == eslAMINO) do_pack5 = TRUE;
+ else if (alphatype != eslDNA && alphatype != eslRNA) ESL_EXCEPTION(eslEINVAL, "alphabet must be protein or nucleic");
+
+
+ if (( status = esl_sprintf(&outfile, "%s.dsqi", basename)) != eslOK) goto ERROR;
+ if (( ifp = fopen(outfile, "wb")) == NULL) ESL_XFAIL(eslEWRITE, errbuf, "failed to open dsqdata index file %s for writing", outfile);
+ sprintf(outfile, "%s.dsqm", basename);
+ if (( mfp = fopen(outfile, "wb")) == NULL) ESL_XFAIL(eslEWRITE, errbuf, "failed to open dsqdata metadata file %s for writing", outfile);
+ sprintf(outfile, "%s.dsqs", basename);
+ if (( sfp = fopen(outfile, "wb")) == NULL) ESL_XFAIL(eslEWRITE, errbuf, "failed to open dsqdata sequence file %s for writing", outfile);
+ if (( stubfp = fopen(basename, "w")) == NULL) ESL_XFAIL(eslEWRITE, errbuf, "failed to open dsqdata stub file %s for writing", basename);
+
+
+
+
+ /* Header: index file */
+ if (fwrite(&magic, sizeof(uint32_t), 1, ifp) != 1 ||
+ fwrite(&uniquetag, sizeof(uint32_t), 1, ifp) != 1 ||
+ fwrite(&alphatype, sizeof(uint32_t), 1, ifp) != 1 ||
+ fwrite(&flags, sizeof(uint32_t), 1, ifp) != 1 ||
+ fwrite(&max_namelen, sizeof(uint32_t), 1, ifp) != 1 ||
+ fwrite(&max_acclen, sizeof(uint32_t), 1, ifp) != 1 ||
+ fwrite(&max_desclen, sizeof(uint32_t), 1, ifp) != 1 ||
+ fwrite(&max_seqlen, sizeof(uint64_t), 1, ifp) != 1 ||
+ fwrite(&nseq, sizeof(uint64_t), 1, ifp) != 1 ||
+ fwrite(&nres, sizeof(uint64_t), 1, ifp) != 1)
+ ESL_XEXCEPTION_SYS(eslESYS, "fwrite() failed, index file header");
+
+ /* Header: metadata file */
+ if (fwrite(&magic, sizeof(uint32_t), 1, mfp) != 1 ||
+ fwrite(&uniquetag, sizeof(uint32_t), 1, mfp) != 1)
+ ESL_XEXCEPTION_SYS(eslESYS, "fwrite() failed, metadata file header");
+
+ /* Header: sequence file */
+ if (fwrite(&magic, sizeof(uint32_t), 1, sfp) != 1 ||
+ fwrite(&uniquetag, sizeof(uint32_t), 1, sfp) != 1)
+ ESL_XEXCEPTION_SYS(eslESYS, "fwrite() failed, metadata file header");
+
+ /* Second pass: index, metadata, and sequence files */
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ /* Packed sequence */
+ psq = (uint32_t *) sq->dsq; // pack-in-place
+ ESL_DASSERT1(( sq->salloc >= 4 )); // required min space for pack-in-place
+ if (do_pack5) dsqdata_pack5(sq->dsq, sq->n, psq, &plen);
+ else dsqdata_pack2(sq->dsq, sq->n, psq, &plen);
+ if ( fwrite(psq, sizeof(uint32_t), plen, sfp) != plen)
+ ESL_XEXCEPTION(eslESYS, "fwrite() failed, packed seq");
+ spos += plen;
+
+ /* Metadata */
+ n = strlen(sq->name);
+ if ( fwrite(sq->name, sizeof(char), n+1, mfp) != n+1)
+ ESL_XEXCEPTION(eslESYS, "fwrite () failed, metadata, name");
+ mpos += n+1;
+
+ n = strlen(sq->acc);
+ if ( fwrite(sq->acc, sizeof(char), n+1, mfp) != n+1)
+ ESL_XEXCEPTION(eslESYS, "fwrite () failed, metadata, accession");
+ mpos += n+1;
+
+ n = strlen(sq->desc);
+ if ( fwrite(sq->desc, sizeof(char), n+1, mfp) != n+1)
+ ESL_XEXCEPTION(eslESYS, "fwrite () failed, metadata, description");
+ mpos += n+1;
+
+ if ( fwrite( &(sq->tax_id), sizeof(int32_t), 1, mfp) != 1)
+ ESL_XEXCEPTION(eslESYS, "fwrite () failed, metadata, taxonomy id");
+ mpos += sizeof(int32_t);
+
+ /* Index file */
+ idx.psq_end = spos-1; // could be -1, on 1st seq, if 1st seq L=0.
+ idx.metadata_end = mpos-1;
+ if ( fwrite(&idx, sizeof(ESL_DSQDATA_RECORD), 1, ifp) != 1)
+ ESL_XEXCEPTION(eslESYS, "fwrite () failed, index file");
+
+ esl_sq_Reuse(sq);
+ }
+
+ /* Stub file */
+ fprintf(stubfp, "Easel dsqdata v1 x%" PRIu32 "\n", uniquetag);
+ fprintf(stubfp, "\n");
+ fprintf(stubfp, "Original file: %s\n", sqfp->filename);
+ fprintf(stubfp, "Original format: %s\n", esl_sqio_DecodeFormat(sqfp->format));
+ fprintf(stubfp, "Type: %s\n", esl_abc_DecodeType(sqfp->abc->type));
+ fprintf(stubfp, "Sequences: %" PRIu64 "\n", nseq);
+ fprintf(stubfp, "Residues: %" PRIu64 "\n", nres);
+
+ esl_sq_Destroy(sq);
+ esl_randomness_Destroy(rng);
+ free(outfile);
+ fclose(stubfp);
+ fclose(ifp);
+ fclose(mfp);
+ fclose(sfp);
+ return eslOK;
+
+ ERROR:
+ if (sq) esl_sq_Destroy(sq);
+ if (rng) esl_randomness_Destroy(rng);
+ if (outfile) free(outfile);
+ if (stubfp) fclose(stubfp);
+ if (ifp) fclose(ifp);
+ if (mfp) fclose(mfp);
+ if (sfp) fclose(sfp);
+ return status;
+}
+
+
+
+/*****************************************************************
+ * 3. ESL_DSQDATA_CHUNK: a chunk of input sequence data
+ *****************************************************************/
+
+static ESL_DSQDATA_CHUNK *
+dsqdata_chunk_Create(ESL_DSQDATA *dd)
+{
+ ESL_DSQDATA_CHUNK *chu = NULL;
+ int U; // max size of unpacked seq data, in bytes (smem allocation)
+ int status;
+
+ ESL_ALLOC(chu, sizeof(ESL_DSQDATA_CHUNK));
+ chu->i0 = 0;
+ chu->N = 0;
+ chu->pn = 0;
+ chu->dsq = NULL;
+ chu->name = NULL;
+ chu->acc = NULL;
+ chu->desc = NULL;
+ chu->taxid = NULL;
+ chu->L = NULL;
+ chu->metadata = NULL;
+ chu->smem = NULL;
+ chu->nxt = NULL;
+
+ /* dsq, name, acc, desc are arrays of pointers into smem, metadata.
+ * taxid is cast to int, from the metadata.
+ * L is figured out by the unpacker.
+ * All of these are set by the unpacker.
+ */
+ ESL_ALLOC(chu->dsq, dd->chunk_maxseq * sizeof(ESL_DSQ *));
+ ESL_ALLOC(chu->name, dd->chunk_maxseq * sizeof(char *));
+ ESL_ALLOC(chu->acc, dd->chunk_maxseq * sizeof(char *));
+ ESL_ALLOC(chu->desc, dd->chunk_maxseq * sizeof(char *));
+ ESL_ALLOC(chu->taxid, dd->chunk_maxseq * sizeof(int));
+ ESL_ALLOC(chu->L, dd->chunk_maxseq * sizeof(int64_t));
+
+ /* On the <smem> allocation, and the <dsq> and <psq> pointers into it:
+ *
+ * <maxpacket> (in uint32's) sets the maximum single fread() size:
+ * one load of a new chunk of packed sequence, up to maxpacket*4
+ * bytes. <smem> needs to be able to hold both that and the fully
+ * unpacked sequence, because we unpack in place. Each packet
+ * unpacks to at most 6 or 15 residues (5-bit or 2-bit packing) We
+ * don't pack sentinels, so the maximum unpacked size includes
+ * <maxseq>+1 sentinels... because we concat the digital seqs so
+ * that the trailing sentinel of seq i is the leading sentinel of
+ * seq i+1.
+ *
+ * The packed seq (max of P bytes) loads overlap with the unpacked
+ * data (max of U bytes):
+ * psq
+ * v[ P bytes ]
+ * smem: 0........0........0..........0
+ * ^[ U bytes ]
+ * ^dsq[0] ^dsq[1] ^dsq[2]
+ *
+ * and as long as we unpack psq left to right -- and as long as we
+ * read the last packet before we write the last unpacked residues
+ * to smem - we're guaranteed that the unpacking works without
+ * overwriting any unpacked data.
+ */
+ U = (dd->pack5 ? 6 * dd->chunk_maxpacket : 15 * dd->chunk_maxpacket);
+ U += dd->chunk_maxseq + 1;
+ ESL_ALLOC(chu->smem, sizeof(ESL_DSQ) * U);
+ chu->psq = (uint32_t *) (chu->smem + U - 4*dd->chunk_maxpacket);
+
+ /* We don't have any guarantees about the amount of metadata
+ * associated with the N sequences, so <metadata> has to be a
+ * reallocatable space. We make a lowball guess for the initial
+ * alloc, on the off chance that the metadata size is small (names
+ * only, no acc/desc): minimally, say 12 bytes of name, 3 \0's, and
+ * 4 bytes for the taxid integer: call it 20.
+ */
+ chu->mdalloc = 20 * dd->chunk_maxseq;
+ ESL_ALLOC(chu->metadata, sizeof(char) * chu->mdalloc);
+
+ return chu;
+
+ ERROR:
+ dsqdata_chunk_Destroy(chu);
+ return NULL;
+}
+
+
+static void
+dsqdata_chunk_Destroy(ESL_DSQDATA_CHUNK *chu)
+{
+ if (chu)
+ {
+ if (chu->metadata) free(chu->metadata);
+ if (chu->smem) free(chu->smem);
+ if (chu->L) free(chu->L);
+ if (chu->taxid) free(chu->taxid);
+ if (chu->desc) free(chu->desc);
+ if (chu->acc) free(chu->acc);
+ if (chu->name) free(chu->name);
+ if (chu->dsq) free(chu->dsq);
+ free(chu);
+ }
+}
+
+
+/*****************************************************************
+ * 4. Loader and unpacker, the input threads
+ *****************************************************************/
+
+static void *
+dsqdata_loader_thread(void *p)
+{
+ ESL_DSQDATA *dd = (ESL_DSQDATA *) p;
+ ESL_DSQDATA_RECORD *idx = NULL;
+ ESL_DSQDATA_CHUNK *chu = NULL;
+ int nchunk = 0; // number of chunks we create, and need to destroy.
+ int nidx = 0; // how many records in <idx>: usually MAXSEQ, until end
+ int nload = 0; // how many sequences we load: >=1, <=nidx
+ int ncarried = 0; // how many records carry over to next iteration: nidx-nload
+ int nread = 0; // fread()'s return value
+ int nmeta = 0; // how many bytes of metadata we want to read for this chunk
+ int i0 = 0; // absolute index of first record in <idx>, 0-offset
+ int64_t psq_last = -1; // psq_end for record i0-1
+ int64_t meta_last = -1; // metadata_end for record i0-1
+ int done = FALSE;
+ int status;
+
+ ESL_ALLOC(idx, sizeof(ESL_DSQDATA_RECORD) * dd->chunk_maxseq);
+
+ while (! done)
+ {
+
+ /* Get a chunk - either by creating it, or recycling it.
+ * We'll create up to <nconsumers>+2 of them.
+ */
+ if (nchunk < dd->nconsumers+2)
+ {
+ if ( (chu = dsqdata_chunk_Create(dd)) == NULL) { status = eslEMEM; goto ERROR; }
+ nchunk++;
+ }
+ else
+ {
+ if ( pthread_mutex_lock(&dd->recycling_mutex) != 0) ESL_XEXCEPTION(eslESYS, "pthread mutex lock failed");
+ while (dd->recycling == NULL)
+ {
+ if ( pthread_cond_wait(&dd->recycling_cv, &dd->recycling_mutex) != 0)
+ ESL_XEXCEPTION(eslESYS, "pthread cond wait failed");
+ }
+ chu = dd->recycling;
+ dd->recycling = chu->nxt; // pop one off recycling stack
+ if ( pthread_mutex_unlock(&dd->recycling_mutex) != 0) ESL_XEXCEPTION(eslESYS, "pthread mutex unlock failed");
+ if ( pthread_cond_signal(&dd->recycling_cv) != 0) ESL_XEXCEPTION(eslESYS, "pthread cond signal failed");
+ // signal *after* unlocking mutex
+ }
+
+ /* Refill index. (The memmove is avoidable. Alt strategy: we could load in 2 frames)
+ * The previous loop loaded packed sequence for <nload'> of the <nidx'> entries,
+ * where the 's indicate the variable has carried over from prev iteration:
+ * |----- nload' ----||--- (ncarried) ---|
+ * |-------------- nidx' ----------------|
+ * Now we're going to shift the remainder ncarried = nidx-nload to the left, then refill:
+ * |---- ncarried ----||--- (MAXSEQ-ncarried) ---|
+ * |-------------- MAXSEQ -----------------------|
+ * while watching out for the terminal case where we run out of
+ * data, loading less than (MAXSEQ-ncarried) records:
+ * |---- ncarried ----||--- nidx* ---|
+ * |------------- nidx --------------|
+ * where the <nidx*> is what fread() returns to us.
+ */
+ i0 += nload; // this chunk starts with seq #<i0>
+ ncarried = (nidx - nload);
+ memmove(idx, idx + nload, sizeof(ESL_DSQDATA_RECORD) * ncarried);
+ nidx = fread(idx + ncarried, sizeof(ESL_DSQDATA_RECORD), dd->chunk_maxseq - ncarried, dd->ifp);
+ nidx += ncarried; // usually, this'll be MAXSEQ, unless we're near EOF.
+
+ if (nidx == 0)
+ { // We're EOF. This chunk will be the empty EOF signal to unpacker, consumers.
+ chu->i0 = i0;
+ chu->N = 0;
+ chu->pn = 0;
+ done = TRUE;
+ }
+ else
+ {
+ /* Figure out how many sequences we're going to load: <nload>
+ * nload = max i : i <= MAXSEQ && idx[i].psq_end - psq_last <= CHUNK_MAX
+ */
+ ESL_DASSERT1(( idx[0].psq_end - psq_last <= dd->chunk_maxpacket ));
+ if (idx[nidx-1].psq_end - psq_last <= dd->chunk_maxpacket)
+ nload = nidx;
+ else
+ { // Binary search for nload = max_i idx[i-1].psq_end - lastend <= MAX
+ int righti = nidx;
+ int mid;
+ nload = 1;
+ while (righti - nload > 1)
+ {
+ mid = nload + (righti - nload) / 2;
+ if (idx[mid-1].psq_end - psq_last <= dd->chunk_maxpacket) nload = mid;
+ else righti = mid;
+ }
+ }
+
+ /* Read packed sequence. */
+ chu->pn = idx[nload-1].psq_end - psq_last;
+ nread = fread(chu->psq, sizeof(uint32_t), chu->pn, dd->sfp);
+ //printf("Read %d packed ints from seq file\n", nread);
+ if ( nread != chu->pn ) ESL_XEXCEPTION(eslEOD, "dsqdata packet loader: expected %d, got %d", chu->pn, nread);
+
+
+ /* Read metadata, reallocating if needed */
+ nmeta = idx[nload-1].metadata_end - meta_last;
+ if (nmeta > chu->mdalloc) {
+ ESL_REALLOC(chu->metadata, sizeof(char) * nmeta); // should be realloc by doubling instead?
+ chu->mdalloc = nmeta;
+ }
+ nread = fread(chu->metadata, sizeof(char), nmeta, dd->mfp);
+ if ( nread != nmeta ) ESL_XEXCEPTION(eslEOD, "dsqdata metadata loader: expected %d, got %d", nmeta, nread);
+
+ chu->i0 = i0;
+ chu->N = nload;
+ psq_last = idx[nload-1].psq_end;
+ meta_last = idx[nload-1].metadata_end;
+ }
+
+ /* Put the finished chunk into outbox;
+ * unpacker will pick it up and unpack it.
+ */
+ if ( pthread_mutex_lock(&dd->loader_outbox_mutex) != 0) ESL_XEXCEPTION(eslESYS, "pthread mutex lock failed");
+ while (dd->loader_outbox != NULL)
+ {
+ if (pthread_cond_wait(&dd->loader_outbox_empty_cv, &dd->loader_outbox_mutex) != 0)
+ ESL_XEXCEPTION(eslESYS, "pthread cond wait failed");
+ }
+ dd->loader_outbox = chu;
+ if ( pthread_mutex_unlock(&dd->loader_outbox_mutex) != 0) ESL_XEXCEPTION(eslESYS, "pthread mutex unlock failed");
+ if ( pthread_cond_signal(&dd->loader_outbox_full_cv) != 0) ESL_XEXCEPTION(eslESYS, "pthread cond signal failed");
+ }
+
+ /* done == TRUE: we've sent the empty EOF chunk downstream, and now
+ * we wait to get all our chunks back through the recycling, so we
+ * can free them and exit cleanly. We counted them as they went out,
+ * in <nchunk>, so we know how many need to come home.
+ */
+ while (nchunk)
+ {
+ if ( pthread_mutex_lock(&dd->recycling_mutex) != 0) ESL_XEXCEPTION(eslESYS, "pthread mutex lock failed");
+ while (dd->recycling == NULL) // Readers may still be working, will Recycle() their chunks
+ {
+ if ( pthread_cond_wait(&dd->recycling_cv, &dd->recycling_mutex) != 0)
+ ESL_XEXCEPTION(eslESYS, "pthread cond wait failed");
+ }
+ while (dd->recycling != NULL) { // Free entire stack, while we have the mutex locked.
+ chu = dd->recycling;
+ dd->recycling = chu->nxt;
+ dsqdata_chunk_Destroy(chu);
+ nchunk--;
+ }
+ if ( pthread_mutex_unlock(&dd->recycling_mutex) != 0) ESL_XEXCEPTION(eslESYS, "pthread mutex unlock failed");
+ /* Because the recycling is a stack, readers never have to wait
+ * on a condition to Recycle(); the recycling, unlike the
+ * outboxes, doesn't need to be empty.
+ */
+ }
+ free(idx);
+ pthread_exit(NULL);
+
+ ERROR:
+ /* Defying Easel standards, we treat all exceptions as fatal, at
+ * least for the moment. This isn't a problem in HMMER, Infernal
+ * because they already use fatal exception handlers (i.e., we never
+ * reach this code anyway, if the parent app is using default fatal
+ * exception handling). It would become a problem if an Easel-based
+ * app needs to assure no exits from within Easel. Because the other
+ * threads will block waiting for chunks to come from the loader, if
+ * the loader fails, we would need a back channel signal of some
+ * sort to get the other threads to clean up and terminate.
+ */
+ if (idx) free(idx);
+ esl_fatal(" ... dsqdata loader thread failed: unrecoverable");
+}
+
+
+
+static void *
+dsqdata_unpacker_thread(void *p)
+{
+ ESL_DSQDATA *dd = (ESL_DSQDATA *) p;
+ ESL_DSQDATA_CHUNK *chu = NULL;
+ int done = FALSE;
+ int status;
+
+ while (! done)
+ {
+ /* Get a chunk from loader's outbox. Wait if necessary. */
+ if ( pthread_mutex_lock(&dd->loader_outbox_mutex) != 0) ESL_XEXCEPTION(eslESYS, "pthread mutex lock failed");
+ while (dd->loader_outbox == NULL)
+ {
+ if ( pthread_cond_wait(&dd->loader_outbox_full_cv, &dd->loader_outbox_mutex) != 0)
+ ESL_XEXCEPTION(eslESYS, "pthread cond wait failed");
+ }
+ chu = dd->loader_outbox;
+ dd->loader_outbox = NULL;
+ if ( pthread_mutex_unlock(&dd->loader_outbox_mutex) != 0) ESL_XEXCEPTION(eslESYS, "pthread mutex unlock failed");
+ if ( pthread_cond_signal(&dd->loader_outbox_empty_cv) != 0) ESL_XEXCEPTION(eslESYS, "pthread cond signal failed");
+
+ /* Unpack the metadata.
+ * If chunk is empty (N==0), it's the EOF signal - let it go straight out to a consumer.
+ * (The first consumer that sees it will set the at_eof flag in <dd>, which all
+ * consumers check. So we only need the one empty EOF chunk to flow downstream.)
+ */
+ if (! chu->N) done = TRUE; // still need to pass the chunk along to a consumer.
+ else
+ {
+ if (( status = dsqdata_unpack_chunk(chu, dd->pack5)) != eslOK) goto ERROR;
+ }
+
+ /* Put unpacked chunk into the unpacker's outbox.
+ * May need to wait for it to be empty/available.
+ */
+ if ( pthread_mutex_lock(&dd->unpacker_outbox_mutex) != 0) ESL_XEXCEPTION(eslESYS, "pthread mutex lock failed");
+ while (dd->unpacker_outbox != NULL)
+ {
+ if ( pthread_cond_wait(&dd->unpacker_outbox_empty_cv, &dd->unpacker_outbox_mutex) != 0)
+ ESL_XEXCEPTION(eslESYS, "pthread cond wait failed");
+ }
+ dd->unpacker_outbox = chu;
+ if ( pthread_mutex_unlock(&dd->unpacker_outbox_mutex) != 0) ESL_XEXCEPTION(eslESYS, "pthread mutex unlock failed");
+ if ( pthread_cond_signal(&dd->unpacker_outbox_full_cv) != 0) ESL_XEXCEPTION(eslESYS, "pthread cond signal failed");
+ }
+ pthread_exit(NULL);
+
+ ERROR:
+ /* See comment in loader thread: for lack of a back channel mechanism
+ * to tell other threads to clean up and terminate, we violate Easel standards
+ * and turn nonfatal exceptions into fatal ones.
+ */
+ esl_fatal(" ... dsqdata unpacker thread failed: unrecoverable");
+}
+
+
+/*****************************************************************
+ * 5. Packing sequences and unpacking chunks
+ *****************************************************************/
+
+/* dsqdata_unpack_chunk()
+ *
+ * <do_pack5> is a hint: if caller knows that all the packets in the
+ * chunk are 5-bit encoded (i.e. amino acid sequence), it can pass
+ * <TRUE>, enabling a small optimization. Otherwise the packed
+ * sequences will be treated as mixed 2- and 5-bit encoding, as is
+ * needed for DNA/RNA sequences; protein sequences also unpack fine
+ * that way, but the 5-bit flag on every packet needs to be checked.
+ *
+ * Throws: <eslEFORMAT> if a problem is seen in the binary format
+ */
+static int
+dsqdata_unpack_chunk(ESL_DSQDATA_CHUNK *chu, int do_pack5)
+{
+ char *ptr = chu->metadata; // ptr will walk through metadata
+ int r; // position in unpacked dsq array
+ int i; // sequence index: 0..chu->N-1
+ int pos; // position in packet array
+ int L; // an unpacked sequence length
+ int P; // number of packets unpacked
+
+ /* "Unpack" the metadata */
+ for (i = 0; i < chu->N; i++)
+ {
+ /* The data are user input, so we cannot trust that it has \0's where we expect them. */
+ if ( ptr >= chu->metadata + chu->mdalloc) ESL_EXCEPTION(eslEFORMAT, "metadata format error");
+ chu->name[i] = ptr; ptr = 1 + strchr(ptr, '\0'); if ( ptr >= chu->metadata + chu->mdalloc) ESL_EXCEPTION(eslEFORMAT, "metadata format error");
+ chu->acc[i] = ptr; ptr = 1 + strchr(ptr, '\0'); if ( ptr >= chu->metadata + chu->mdalloc) ESL_EXCEPTION(eslEFORMAT, "metadata format error");
+ chu->desc[i] = ptr; ptr = 1 + strchr(ptr, '\0'); if ( ptr >= chu->metadata + chu->mdalloc) ESL_EXCEPTION(eslEFORMAT, "metadata format error");
+ chu->taxid[i] = (int32_t) *((int32_t *) ptr); ptr += sizeof(int32_t);
+ }
+
+ /* Unpack the sequence data */
+ i = 0;
+ r = 0;
+ pos = 0;
+ chu->smem[0] = eslDSQ_SENTINEL;
+ while (pos < chu->pn)
+ {
+ chu->dsq[i] = (ESL_DSQ *) chu->smem + r;
+ if (do_pack5) dsqdata_unpack5(chu->psq + pos, chu->dsq[i], &L, &P);
+ else dsqdata_unpack2(chu->psq + pos, chu->dsq[i], &L, &P);
+
+ r += L+1; // L+1, not L+2, because we overlap start/end sentinels
+ pos += P;
+ chu->L[i] = L;
+ i++;
+ }
+ ESL_DASSERT1(( pos == chu->pn )); // we should've unpacked exactly pn packets,
+ ESL_DASSERT1(( i == chu->N )); // .. and exactly N sequences.
+ return eslOK;
+}
+
+
+/* Unpack 5-bit encoded sequence, starting at <psq>.
+ * Important: dsq[0] is already initialized to eslDSQ_SENTINEL,
+ * as a nitpicky optimization (the sequence data in a chunk are
+ * concatenated so that they share end/start sentinels).
+ */
+static int
+dsqdata_unpack5(uint32_t *psq, ESL_DSQ *dsq, int *ret_L, int *ret_P)
+{
+ int pos = 0; // position in psq[]
+ int r = 1; // position in dsq[]. caller set dsq[0] to eslDSQ_SENTINEL.
+ uint32_t v = psq[pos++];
+ int b; // bit shift counter
+
+ while (! ESL_DSQDATA_EOD(v)) // we trust that we'll see a sentinel at the end
+ {
+ ESL_DASSERT1(( ESL_DSQDATA_5BIT(v) )); // All packets are 5-bit encoded
+ dsq[r++] = (v >> 25) & 31; dsq[r++] = (v >> 20) & 31; dsq[r++] = (v >> 15) & 31;
+ dsq[r++] = (v >> 10) & 31; dsq[r++] = (v >> 5) & 31; dsq[r++] = (v >> 0) & 31;
+ v = psq[pos++];
+ }
+
+ /* Unpack sentinel packet, which may be partial; it can even contain
+ * zero residues in the edge case of an L=0 sequence.
+ */
+ ESL_DASSERT1(( ESL_DSQDATA_5BIT(v) ));
+ for (b = 25; b >= 0 && ((v >> b) & 31) != 31; b -= 5)
+ dsq[r++] = (v >> b) & 31;
+ dsq[r++] = eslDSQ_SENTINEL;
+ // r is now L+2: the raw sequence length + 2 sentinels
+ // P = pos, because pos index advanced to next packet after sentinel
+ *ret_L = r-2;
+ *ret_P = pos;
+ return eslOK;
+}
+
+/* Unpack 2-bit (+ mixed 5-bit for noncanonicals) encoding.
+ * Important: dsq[0] is already initialized to eslDSQ_SENTINEL
+ *
+ * This will work for protein sequences just fine; just a little
+ * slower than calling dsqdata_unpack5(), because here we have
+ * to check the 5-bit encoding bit on every packet.
+ */
+static int
+dsqdata_unpack2(uint32_t *psq, ESL_DSQ *dsq, int *ret_L, int *ret_P)
+{
+ int pos = 0;
+ int r = 1;
+ uint32_t v = psq[pos++];
+ int b; // bit shift counter
+
+ while (! ESL_DSQDATA_EOD(v))
+ {
+ if ( ESL_DSQDATA_5BIT(v)) // 5-bit encoded, full. Don't need mask on bit 31 because we know it's down.
+ {
+ dsq[r++] = (v >> 25) & 31; dsq[r++] = (v >> 20) & 31; dsq[r++] = (v >> 15) & 31;
+ dsq[r++] = (v >> 10) & 31; dsq[r++] = (v >> 5) & 31; dsq[r++] = (v >> 0) & 31;
+ }
+ else // 2-bit encoded, full
+ {
+ dsq[r++] = (v >> 28) & 3; dsq[r++] = (v >> 26) & 3; dsq[r++] = (v >> 24) & 3;
+ dsq[r++] = (v >> 22) & 3; dsq[r++] = (v >> 20) & 3; dsq[r++] = (v >> 18) & 3;
+ dsq[r++] = (v >> 16) & 3; dsq[r++] = (v >> 14) & 3; dsq[r++] = (v >> 12) & 3;
+ dsq[r++] = (v >> 10) & 3; dsq[r++] = (v >> 8) & 3; dsq[r++] = (v >> 6) & 3;
+ dsq[r++] = (v >> 4) & 3; dsq[r++] = (v >> 2) & 3; dsq[r++] = (v >> 0) & 3;
+ }
+ v = psq[pos++];
+ }
+
+ /* Sentinel packet.
+ * If 2-bit, it's full. If 5-bit, it's usually partial, and may even be 0-len.
+ */
+ if ( ESL_DSQDATA_5BIT(v)) // 5-bit, partial
+ {
+ for (b = 25; b >= 0 && ((v >> b) & 31) != 31; b -= 5)
+ dsq[r++] = (v >> b) & 31;
+ }
+ else
+ {
+ dsq[r++] = (v >> 28) & 3; dsq[r++] = (v >> 26) & 3; dsq[r++] = (v >> 24) & 3;
+ dsq[r++] = (v >> 22) & 3; dsq[r++] = (v >> 20) & 3; dsq[r++] = (v >> 18) & 3;
+ dsq[r++] = (v >> 16) & 3; dsq[r++] = (v >> 14) & 3; dsq[r++] = (v >> 12) & 3;
+ dsq[r++] = (v >> 10) & 3; dsq[r++] = (v >> 8) & 3; dsq[r++] = (v >> 6) & 3;
+ dsq[r++] = (v >> 4) & 3; dsq[r++] = (v >> 2) & 3; dsq[r++] = (v >> 0) & 3;
+ }
+ dsq[r++] = eslDSQ_SENTINEL;
+
+ *ret_L = r-2;
+ *ret_P = pos;
+ return eslOK;
+}
+
+
+/* dsqdata_pack5()
+ *
+ * Pack a digital (protein) sequence <dsq> of length <n>, into <psq>
+ * using 5-bit encoding; return the number of packets <*ret_P>.
+ *
+ * <psq> must be allocated for at least $MAX(1, (n+5)/6)$ packets.
+ *
+ * You can pack in place, by passing the same pointer <dsq> as <psq>,
+ * provided that dsq is allocated for at least 1 packet (4 bytes). We
+ * know that <psq> is either smaller than <dsq> ($4P <= n$) or that it
+ * consists of one EOD packet (in the case n=0).
+ */
+static int
+dsqdata_pack5(ESL_DSQ *dsq, int n, uint32_t *psq, int *ret_P)
+{
+ int r = 1; // position in <dsq>
+ int pos = 0; // position in <psq>.
+ int b; // bitshift
+ uint32_t v; // tmp var needed to guarantee pack-in-place works
+
+ while (r <= n)
+ {
+ v = eslDSQDATA_5BIT; // initialize packet with 5-bit flag
+ for (b = 25; b >= 0 && r <= n; b -= 5) v |= (uint32_t) dsq[r++] << b;
+ for ( ; b >= 0; b -= 5) v |= (uint32_t) 31 << b;
+
+ if (r > n) v |= eslDSQDATA_EOD; // EOD bit
+ psq[pos++] = v; // we know we've already read all the dsq we need under psq[pos]
+ }
+
+ /* Special case of n=0: we need an empty EOD sentinel packet. */
+ if (pos == 0) { v = 0; psq[pos++] = ~v; } // all bits set: | EOD | 5BIT | all sentinels |
+
+ *ret_P = pos;
+ return eslOK;
+}
+
+
+/* dsqdata_pack2()
+ *
+ * Pack a digital (nucleic) sequence <dsq> of total length
+ * <n>, into <psq>; return the number of packets <*ret_P>.
+ *
+ * <psq> must be allocated for at least $MAX(1, (n+5)/6)$ packets.
+ * (Yes, even in 2-bit packing, because worst case, the sequence
+ * contains so many noncanonicals that it's entirely 5-bit encoded.)
+ *
+ * You can pack in place, by passing the same pointer <dsq> as <psq>,
+ * provided that dsq is allocated for at least 1 packet (4 bytes). We
+ * know that <psq> is either smaller than <dsq> ($4P <= n$) or that it
+ * consists of one EOD packet (in the case n=0).
+ */
+static int
+dsqdata_pack2(ESL_DSQ *dsq, int n, uint32_t *psq, int *ret_P)
+{
+ int pos = 0; // position in <psq>
+ int d = 0; // position of next degen residue, 1..n, n+1 if none
+ int r = 1; // position in <dsq> 1..n
+ int b; // bitshift
+ uint32_t v; // tmp var needed to guarantee pack-in-place works
+
+ while (r <= n)
+ {
+ // Slide the "next degenerate residue" detector
+ if (d < r)
+ for (d = r; d <= n; d++)
+ if (dsq[d] > 3) break;
+
+ // Can we 2-bit pack the next 15 residues, r..r+14?
+ // n-r+1 = number of residues remaining to be packed.
+ if (n-r+1 >= 15 && d > r+14)
+ {
+ v = 0;
+ for (b = 28; b >= 0; b -=2) v |= (uint32_t) dsq[r++] << b;
+ }
+ else
+ {
+ v = eslDSQDATA_5BIT; // initialize v with 5-bit packing bit
+ for (b = 25; b >= 0 && r <= n; b -= 5) v |= (uint32_t) dsq[r++] << b;
+ for ( ; b >= 0; b -= 5) v |= (uint32_t) 31 << b;
+ }
+
+ if (r > n) v |= eslDSQDATA_EOD; // EOD bit
+ psq[pos++] = v; // we know we've already read all the dsq we need under psq[pos]
+ }
+
+ /* Special case of n=0: we need an empty EOD sentinel packet.
+ * Sentinel packets are 5-bit encoded, even in 2-bit coding scheme
+ */
+ if (pos == 0) { v = 0; psq[pos++] = ~v; } // all bits set: | EOD | 5BIT | all sentinels |
+
+ *ret_P = pos;
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 6. Notes
+ *****************************************************************
+ *
+ * [1] Packed sequence data format.
+ *
+ * Format of a single packet:
+ * [31] [30] [29..25] [24..20] [19..15] [14..10] [ 9..5 ] [ 4..0 ]
+ * ^ ^ |------------ 6 5-bit packed residues ------------------|
+ * | | [] [] [] [] [] [] [] [] [] [] [] [] [] [] []
+ * | | |----------- or 15 2-bit packed residues ----------------|
+ * | |
+ * | "packtype" bit 30 = 0 if packet is 2-bit packed; 1 if 5-bit packed
+ * "sentinel" bit 31 = 1 if last packet in packed sequence; else 0
+ *
+ * (packet & (1 << 31)) tests for end of sequence
+ * (packet & (1 << 30)) tests for 5-bit packing vs. 2-bit
+ * ((packet >> shift) && 31) decodes 5-bit, for shift=25..0 in steps of 5
+ * ((packet >> shift) && 3) decodes 2-bit, for shift=28..0 in steps of 2
+ *
+ * Packets without the sentinel bit set are always full (unpack
+ * to 15 or 6 residue codes).
+ *
+ * 5-bit EOD packets may be partial: they unpack to 0..6
+ * residues. The remaining residue codes are set to 0x1f
+ * (11111) to indicate EOD within a partial packet.
+ *
+ * A 0-length sequence is encoded by a 5-bit partial EOD packet
+ * with 0 residues. This is the only case in which a partial
+ * packet contains 0 residues. (Because we can end with an EOD
+ * full packet, there is no other case where we end up with 0
+ * leftover residues to encode.)
+ *
+ * 2-bit EOD packets must be full, because there is no way to
+ * signal EOD locally within a 2-bit packet. Can't use 0x03 (11)
+ * because that's T/U. Generally, then, the last packet of a
+ * nucleic acid sequence must be 5-bit encoded, solely to be
+ * able to encode EOD in a partial packet.
+ *
+ * A packed sequence consists of an integer number of packets,
+ * P, which ends with an EOD packet that may contain a partial
+ * number of residues. P packets are guaranteed to be able to
+ * encode at least 6P residues in either scheme.
+ *
+ * A sequence of length L packs into P <= MAX(1, (N+5)/6)
+ * packets. (1, because a 0-length sequence still requires an
+ * EOD packet.) This is true even for nucleic sequences, because
+ * noncanonical residues can force DNA/RNA sequence to pack
+ * entirely in 5-bit coding.
+ *
+ * A packed amino acid sequence unpacks to 6P-5 <= L <= 6P
+ * residues (for P>1; 0 <= L <= 6 for P=1) and all packets are
+ * 5-bit encoded.
+ *
+ * A packed nucleic acid sequence unpacks to 6P-5 <= L <= 15P
+ * residues (for P>1; 0 <= L <= 15 for P=1). The packets are a
+ * mix of 2-bit and 5-bit. Degenerate residues must be 5-bit
+ * packed, and the EOD packet usually is too. A 5-bit packet
+ * does not have to contain degenerate residues, because it may
+ * have been necessary to get "in frame" to pack a downstream
+ * degenerate residue. For example, the sequence
+ * ACGTACGTNNA... must be packed as [ACGTAC][CGTNNA]... to get
+ * the N's packed correctly.
+ *
+ * [2] Compression: relative incompressibility of biological sequences.
+ *
+ * Considered using fast (de)compression algorithms that are fast
+ * enough to keep up with disk read speed, including LZ4 and
+ * Google's Snappy. However, lz4 only achieves 1.0-1.9x global
+ * compression of protein sequence (compared to 1.5x for
+ * packing), and 2.0x for DNA (compared to 3.75x for packing).
+ * With local, blockwise compression, which we need for random
+ * access and indexing, it gets worse. Packing is superior.
+ *
+ * Metadata compression is more feasible, but I still opted
+ * against it. Although metadata are globally quite compressible
+ * (3.2-6.9x in trials with lz4), locally in 64K blocks lz4 only
+ * achieves 2x. [xref SRE:2016/0201-seqfile-compression]
+ *
+ * [3] Maybe getting more packing using run-length encoding.
+ *
+ * Genome assemblies typically have long runs of N's (human
+ * GRCh38.p2 is about 5% N), and it's excruciating to have to
+ * pack it into bulky 5-bit degenerate packets. I considered
+ * run-length encoding (RLE). One possibility is to use a special
+ * packet format akin to the 5-bit packet format:
+ *
+ * [0] [?] [11111] [.....] [....................]
+ * ^ ^ ^ 20b number, <=2^20-1
+ * | | 5-bit residue code
+ * | sentinel residue 31 set
+ * sentinel bit unset
+ *
+ * This is a uniquely detectable packet structure because a full
+ * packet (with unset sentinel bit) would otherwise never contain
+ * a sentinel residue (code 31).
+ *
+ * However, using RLE would make our unpacked data sizes too
+ * unpredictable; we wouldn't have the <=6P or <=15P guarantee,
+ * so we couldn't rely on fixed-length allocation of <smem> in
+ * our chunk. Consumers wouldn't be getting predictable chunk
+ * sizes, which could complicate load balancing. I decided
+ * against it.
+ */
+
+
+/*****************************************************************
+ * 7. Unit tests
+ *****************************************************************/
+#ifdef eslDSQDATA_TESTDRIVE
+
+#include "esl_randomseq.h"
+
+/* Exercise the packing and unpacking routines:
+ * dsqdata_pack2, dsqdata_pack5, and dsqdata_unpack
+ */
+static void
+utest_packing(ESL_RANDOMNESS *rng, ESL_ALPHABET *abc, int nsamples)
+{
+ char msg[] = "esl_dsqdata :: packing unit test failed";
+ ESL_DSQ *dsq = NULL; // We start with a dirty random sequence...
+ uint32_t *psq = NULL; // ... pack it ...
+ ESL_DSQ *dsq2 = NULL; // ... and unpack it. Then check that it's the same seq.
+ int L_max = 46; // We'll sample L on 0..L_max. L_max doesn't need to be large to exercise well.
+ int P_max = ESL_MAX(1, (L_max + 5) / 6); // So sayeth the docs, so let's test it.
+ int L, P, L2, P2;
+ int i;
+
+ if ((dsq = malloc(sizeof(ESL_DSQ) * (L_max + 2))) == NULL) esl_fatal(msg);
+ if ((psq = malloc(sizeof(uint32_t) * P_max)) == NULL) esl_fatal(msg);
+ if ((dsq2 = malloc(sizeof(ESL_DSQ) * (L_max + 2))) == NULL) esl_fatal(msg);
+
+ for (i = 0; i < nsamples; i++)
+ {
+ L = esl_rnd_Roll(rng, L_max+1); // 0..L_max
+
+ esl_rsq_SampleDirty(rng, abc, NULL, L, dsq);
+
+ if (abc->type == eslAMINO) { if ( dsqdata_pack5(dsq, L, psq, &P) != eslOK) esl_fatal(msg); }
+ else { if ( dsqdata_pack2(dsq, L, psq, &P) != eslOK) esl_fatal(msg); }
+
+ dsq2[0] = eslDSQ_SENTINEL; // interface to _unpack functions requires caller to do this
+ if (abc->type == eslAMINO) { if ( dsqdata_unpack5(psq, dsq2, &L2, &P2) != eslOK) esl_fatal(msg); }
+ else { if ( dsqdata_unpack2(psq, dsq2, &L2, &P2) != eslOK) esl_fatal(msg); }
+
+ if (L2 != L) esl_fatal(msg);
+ if (P2 != P) esl_fatal(msg);
+ if (memcmp((void *) dsq, (void *) dsq2, L+2) != 0) esl_fatal(msg);
+
+ /* Write garbage into the buffers, so nobody's cheating on the test somehow */
+ esl_rnd_mem(rng, (void *) dsq, L_max+2);
+ esl_rnd_mem(rng, (void *) dsq2, L_max+2);
+ esl_rnd_mem(rng, (void *) psq, (sizeof(uint32_t) * P_max));
+ }
+
+ free(dsq);
+ free(psq);
+ free(dsq2);
+}
+
+
+static void
+utest_readwrite(ESL_RANDOMNESS *rng, ESL_ALPHABET *abc)
+{
+ char msg[] = "esl_dsqdata :: readwrite unit test failed";
+ char tmpfile[32] = "esltmpXXXXXX";
+ char basename[32];
+ ESL_SQ **sqarr = NULL;
+ FILE *tmpfp = NULL;
+ ESL_SQFILE *sqfp = NULL;
+ ESL_DSQDATA *dd = NULL;
+ ESL_DSQDATA_CHUNK *chu = NULL;
+ int nseq = 1 + esl_rnd_Roll(rng, 20000); // 1..20000
+ int maxL = 100;
+ int i;
+ int status;
+
+ /* 1. Sample <nseq> random dirty digital sequences, storing them for later comparison;
+ * write them out to a tmp FASTA file. The Easel FASTA format writer writes <name> <acc>
+ * <desc> on the descline, but the reader only reads <name> <desc> (as is standard
+ * for FASTA format), so blank the accession to avoid confusion.
+ */
+ if (( status = esl_tmpfile_named(tmpfile, &tmpfp)) != eslOK) esl_fatal(msg);
+ if (( sqarr = malloc(sizeof(ESL_SQ *) * nseq)) == NULL) esl_fatal(msg);
+ for (i = 0; i < nseq; i++)
+ {
+ sqarr[i] = NULL;
+ if (( status = esl_sq_Sample(rng, abc, maxL, &(sqarr[i]))) != eslOK) esl_fatal(msg);
+ if (( status = esl_sq_SetAccession(sqarr[i], "")) != eslOK) esl_fatal(msg);
+ if (( status = esl_sqio_Write(tmpfp, sqarr[i], eslSQFILE_FASTA, FALSE)) != eslOK) esl_fatal(msg);
+ }
+ fclose(tmpfp);
+
+ /* 2. Make a dsqdata database from the FASTA tmpfile.
+ */
+ if (( status = esl_sqfile_OpenDigital(abc, tmpfile, eslSQFILE_FASTA, NULL, &sqfp)) != eslOK) esl_fatal(msg);
+ if (( snprintf(basename, 32, "%s-db", tmpfile)) <= 0) esl_fatal(msg);
+ if (( status = esl_dsqdata_Write(sqfp, basename, NULL)) != eslOK) esl_fatal(msg);
+ esl_sqfile_Close(sqfp);
+
+ /* 3. Open and read the dsqdata; compare to the original sequences.
+ */
+ if (( status = esl_dsqdata_Open(&abc, basename, 1, &dd)) != eslOK) esl_fatal(msg);
+ while (( status = esl_dsqdata_Read(dd, &chu)) == eslOK)
+ {
+ for (i = 0; i < chu->N; i++)
+ {
+ if ( chu->L[i] != sqarr[i+chu->i0]->n ) esl_fatal(msg);
+ if ( memcmp( chu->dsq[i], sqarr[i+chu->i0]->dsq, chu->L[i]) != 0) esl_fatal(msg);
+ if ( strcmp( chu->name[i], sqarr[i+chu->i0]->name) != 0) esl_fatal(msg);
+ // FASTA does not read accession - instead we get both accession/description as <desc>
+ if ( strcmp( chu->desc[i], sqarr[i+chu->i0]->desc) != 0) esl_fatal(msg);
+ // FASTA also does not store taxid - so don't test that either
+ }
+ esl_dsqdata_Recycle(dd, chu);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+ esl_dsqdata_Close(dd);
+
+ remove(tmpfile);
+ remove(basename);
+ snprintf(basename, 32, "%s-db.dsqi", tmpfile); remove(basename);
+ snprintf(basename, 32, "%s-db.dsqm", tmpfile); remove(basename);
+ snprintf(basename, 32, "%s-db.dsqs", tmpfile); remove(basename);
+ for (i = 0; i < nseq; i++) esl_sq_Destroy(sqarr[i]);
+ free(sqarr);
+}
+#endif /*eslDSQDATA_TESTDRIVE*/
+
+
+
+/*****************************************************************
+ * 8. Test driver
+ *****************************************************************/
+#ifdef eslDSQDATA_TESTDRIVE
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_dsqdata.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-s", eslARG_INT, "0", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "unit test driver for Easel dsqdata module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *rng = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ ESL_ALPHABET *amino = esl_alphabet_Create(eslAMINO);
+ ESL_ALPHABET *nucleic = esl_alphabet_Create(eslRNA);
+ int nsamples = 100;
+
+ fprintf(stderr, "## %s\n", argv[0]);
+ fprintf(stderr, "# rng seed = %" PRIu32 "\n", esl_randomness_GetSeed(rng));
+
+ utest_packing(rng, nucleic, nsamples);
+ utest_packing(rng, amino, nsamples);
+
+ utest_readwrite(rng, nucleic);
+ utest_readwrite(rng, amino);
+
+ fprintf(stderr, "# status = ok\n");
+
+ esl_alphabet_Destroy(amino);
+ esl_alphabet_Destroy(nucleic);
+ esl_randomness_Destroy(rng);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+#endif /*eslDSQDATA_TESTDRIVE*/
+
+/*****************************************************************
+ * 9. Examples
+ *****************************************************************/
+
+/* esl_dsqdata_example2
+ * Example of creating a new dsqdata database from a sequence file.
+ */
+#ifdef eslDSQDATA_EXAMPLE2
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_dsqdata.h"
+#include "esl_getopts.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use DNA alphabet", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use RNA alphabet", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use protein alphabet", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <seqfile_in> <binary seqfile_out>";
+static char banner[] = "experimental: create binary database for esl_dsqdata";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 2, argc, argv, banner, usage);
+ ESL_ALPHABET *abc = NULL;
+ char *infile = esl_opt_GetArg(go, 1);
+ char *basename = esl_opt_GetArg(go, 2);
+ int format = eslSQFILE_UNKNOWN;
+ int alphatype = eslUNKNOWN;
+ ESL_SQFILE *sqfp = NULL;
+ char errbuf[eslERRBUFSIZE];
+ int status;
+
+ status = esl_sqfile_Open(infile, format, NULL, &sqfp);
+ if (status == eslENOTFOUND) esl_fatal("No such file.");
+ else if (status == eslEFORMAT) esl_fatal("Format unrecognized.");
+ else if (status != eslOK) esl_fatal("Open failed, code %d.", status);
+
+ if (esl_opt_GetBoolean(go, "--rna")) alphatype = eslRNA;
+ else if (esl_opt_GetBoolean(go, "--dna")) alphatype = eslDNA;
+ else if (esl_opt_GetBoolean(go, "--amino")) alphatype = eslAMINO;
+ else {
+ status = esl_sqfile_GuessAlphabet(sqfp, &alphatype);
+ if (status == eslENOALPHABET) esl_fatal("Couldn't guess alphabet from first sequence in %s", infile);
+ else if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s)\n%s\n", infile, sqfp->get_error(sqfp));
+ else if (status == eslENODATA) esl_fatal("Sequence file %s contains no data?", infile);
+ else if (status != eslOK) esl_fatal("Failed to guess alphabet (error code %d)\n", status);
+ }
+ abc = esl_alphabet_Create(alphatype);
+ esl_sqfile_SetDigital(sqfp, abc);
+
+ status = esl_dsqdata_Write(sqfp, basename, errbuf);
+ if (status == eslEWRITE) esl_fatal("Failed to open dsqdata output files:\n %s", errbuf);
+ else if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s)\n %s", infile, sqfp->get_error(sqfp));
+ else if (status != eslOK) esl_fatal("Unexpected error while creating dsqdata file (code %d)\n", status);
+
+ esl_sqfile_Close(sqfp);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ return eslOK;
+}
+#endif /*eslDSQDATA_EXAMPLE2*/
+
+
+/* esl_dsqdata_example
+ * Example of opening and reading a dsqdata database.
+ */
+#ifdef eslDSQDATA_EXAMPLE
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_dsqdata.h"
+#include "esl_getopts.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-n", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "no residue counting: faster time version", 0 },
+ { "-t", eslARG_INT, "4", NULL, NULL, NULL, NULL, NULL, "set number of threads to <n>", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+
+static char usage[] = "[-options] <basename>";
+static char banner[] = "example of using ESL_DSQDATA to read sequence db";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ ESL_ALPHABET *abc = NULL;
+ char *basename = esl_opt_GetArg(go, 1);
+ int no_count = esl_opt_GetBoolean(go, "-n");
+ int ncpu = esl_opt_GetInteger(go, "-t");
+ ESL_DSQDATA *dd = NULL;
+ ESL_DSQDATA_CHUNK *chu = NULL;
+ int i;
+ int64_t pos;
+ int64_t ct[128], total;
+ int x;
+ int status;
+
+ status = esl_dsqdata_Open(&abc, basename, ncpu, &dd);
+ if (status == eslENOTFOUND) esl_fatal("Failed to open dsqdata files:\n %s", dd->errbuf);
+ else if (status == eslEFORMAT) esl_fatal("Format problem in dsqdata files:\n %s", dd->errbuf);
+ else if (status != eslOK) esl_fatal("Unexpected error in opening dsqdata (code %d)", status);
+
+ for (x = 0; x < 127; x++) ct[x] = 0;
+
+ while ((status = esl_dsqdata_Read(dd, &chu)) == eslOK)
+ {
+ if (! no_count)
+ for (i = 0; i < chu->N; i++)
+ for (pos = 1; pos <= chu->L[i]; pos++)
+ ct[ chu->dsq[i][pos] ]++;
+
+ esl_dsqdata_Recycle(dd, chu);
+ }
+ if (status != eslEOF) esl_fatal("unexpected error %d in reading dsqdata", status);
+
+ if (! no_count)
+ {
+ total = 0;
+ for (x = 0; x < abc->Kp; x++)
+ {
+ printf("%c %" PRId64 "\n", abc->sym[x], ct[x]);
+ total += ct[x];
+ }
+ printf("Total = %" PRId64 "\n", total);
+ }
+
+ esl_alphabet_Destroy(abc);
+ esl_dsqdata_Close(dd);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslDSQDATA_EXAMPLE*/
+
+
+
diff --git a/esl_dsqdata.h b/esl_dsqdata.h
new file mode 100644
index 0000000..1c0ac83
--- /dev/null
+++ b/esl_dsqdata.h
@@ -0,0 +1,141 @@
+/* esl_dsqdata : faster sequence input
+ */
+#ifndef eslDSQDATA_INCLUDED
+#define eslDSQDATA_INCLUDED
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_sqio.h"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <pthread.h>
+
+
+
+/* ESL_DSQDATA_CHUNK
+ * A data chunk returned by esl_dsqdata_Read().
+ */
+typedef struct esl_dsqdata_chunk_s {
+ int64_t i0; // Chunk contains sequences i0..i0+N-1 from the database, 0-offset
+ int N; // Chunk contains N sequences
+
+ ESL_DSQ **dsq; // Pointers to each of the N sequences
+ char **name; // Names, \0 terminated. Ptr into <metadata> buffer.
+ char **acc; // Optional accessions, \0 terminated; "\0" if none.
+ char **desc; // Optional descriptions, \0 terminated; "\0" if none
+ int32_t *taxid; // NCBI taxonomy identifiers. (>=1 is a taxid; -1 means none)
+ int64_t *L; // Sequence lengths, in residues. The unpacker figures these out.
+
+ /* Memory management */
+ char *smem; // Unpacked (dsq[]) and packed (psq) data ptrs share this allocation.
+ uint32_t *psq; // Pointer into smem; packed data fread()'s go here.
+ int pn; // how many uint32's are loaded in <psq>
+ char *metadata; // Raw fread() buffer of all name/acc/desc/taxid data.
+ int mdalloc; // Current allocation size for <metadata> in bytes
+ struct esl_dsqdata_chunk_s *nxt; // Chunks can be put in linked lists
+} ESL_DSQDATA_CHUNK;
+
+
+
+/* ESL_DSQDATA_RECORD
+ * The dsqi index file is composed of an array of these, aside from its header.
+ */
+typedef struct esl_dsqdata_record_s {
+ int64_t metadata_end;
+ int64_t psq_end;
+} ESL_DSQDATA_RECORD;
+
+
+
+
+/* ESL_DSQDATA
+ * The object created by esl_dsqdata_Open() and used by esl_dsqdata_Read()
+ * to read chunks of sequence data from the database.
+ */
+typedef struct esl_dsqdata_s {
+ char *basename; // Basename of the four dsqdata data files
+ FILE *stubfp; // Open <basename> stub file
+ FILE *ifp; // Open basename.dsqi index file
+ FILE *sfp; // Open basename.dsqs sequence file
+ FILE *mfp; // Open basename.dsqm metadata file
+ ESL_ALPHABET *abc_r; // Copy of ptr to the alphabet the caller told us to read in.
+
+ /* Header information from dsqi index file
+ * .. dsqm, dsqs have magic and uniquetag for integrity checking
+ * .. and stub file has uniquetag as text.
+ */
+ uint32_t magic; // Binary magic format code, for detecting byteswapping
+ uint32_t uniquetag; // Random number tag that links the four files
+ uint32_t flags; // Currently unused (0); reserved for future bitflags
+ uint32_t max_namelen; // Max name length in the dataset
+ uint32_t max_acclen; // .. and max accession length
+ uint32_t max_desclen; // .. and max description length
+ uint64_t max_seqlen; // .. and max seq length. 64b = bring on Paris japonica.
+ uint64_t nseq; // Total number of sequences in the dataset
+ uint64_t nres; // .. and total number of residues
+
+ /* Control parameters. */
+ int chunk_maxseq; // default = eslDSQDATA_CHUNK_MAXSEQ
+ int chunk_maxpacket; // default = eslDSQDATA_CHUNK_MAXPACKET
+ int do_byteswap; // TRUE if we need to byteswap (bigendian <=> littleendian)
+ int pack5; // TRUE if we're using all 5bit packing; FALSE for mixed 2+5bit
+
+ /* Managing the reader's threaded producer/consumer pipeline:
+ * consisting of 1 loader thread and 1 unpacker thread that we manage,
+ * and <nconsumers> consumer threads that caller created to get
+ * successive chunks with esl_dsqdata_Read().
+ */
+ int nconsumers; // Caller's reading with this # of readers
+
+ pthread_t loader_t; // Loader thread id
+ ESL_DSQDATA_CHUNK *loader_outbox; // A loaded chunk goes here, for unpacker
+ pthread_mutex_t loader_outbox_mutex; // mutex protecting the outbox
+ pthread_cond_t loader_outbox_full_cv; // signal to unpacker that next chunk is ready
+ pthread_cond_t loader_outbox_empty_cv; // signal from unpacker that it's got the chunk
+
+ pthread_t unpacker_t; // Unpacker thread id
+ ESL_DSQDATA_CHUNK *unpacker_outbox; // Unpacked chunk goes here, for _Read()
+ pthread_mutex_t unpacker_outbox_mutex; // mutex protecting the outbox
+ pthread_cond_t unpacker_outbox_full_cv; // signal to _Read() that chunk is ready (or at_eof)
+ pthread_cond_t unpacker_outbox_empty_cv; // signal from _Read() that it's got the chunk
+ int at_eof; // flag that goes up at end of the input file;
+ // .. <at_eof> change is in unpacker's mutex
+ ESL_DSQDATA_CHUNK *recycling; // Linked list of chunk memory for reuse
+ pthread_mutex_t recycling_mutex; // mutex protecting the recycling list
+ pthread_cond_t recycling_cv; // signal to loader that a chunk is available
+
+ /* Error handling.
+ * Pthread variables don't define a value for "unset", so for pristine cleanup after
+ * errors, we must use separate booleans to track which thread resources are created.
+ */
+ int lt_c; int lom_c; int lof_c; int loe_c;
+ int ut_c; int uom_c; int uof_c; int uoe_c;
+ int rm_c; int r_c;
+ char errbuf[eslERRBUFSIZE]; // User-directed error message in case of a failed open or read.
+} ESL_DSQDATA;
+
+
+
+/* Defaults for size of eslDSQDATA_CHUNK
+ */
+#define eslDSQDATA_CHUNK_MAXSEQ 4096 // max number of sequences
+#define eslDSQDATA_CHUNK_MAXPACKET 262144 // max number of uint32 sequence packets
+
+/* Reading the control bits on a packet v
+ */
+#define eslDSQDATA_EOD (1 << 31)
+#define eslDSQDATA_5BIT (1 << 30)
+#define ESL_DSQDATA_EOD(v) ((v) & eslDSQDATA_EOD)
+#define ESL_DSQDATA_5BIT(v) ((v) & eslDSQDATA_5BIT)
+
+/* Functions in the API
+ */
+extern int esl_dsqdata_Open (ESL_ALPHABET **byp_abc, char *basename, int nconsumers, ESL_DSQDATA **ret_dd);
+extern int esl_dsqdata_Read (ESL_DSQDATA *dd, ESL_DSQDATA_CHUNK **ret_chu);
+extern int esl_dsqdata_Recycle(ESL_DSQDATA *dd, ESL_DSQDATA_CHUNK *chu);
+extern int esl_dsqdata_Close (ESL_DSQDATA *dd);
+
+extern int esl_dsqdata_Write (ESL_SQFILE *sqfp, char *basename, char *errbuf);
+
+#endif /*eslDSQDATA_INCLUDED*/
diff --git a/esl_dsqdata.tex b/esl_dsqdata.tex
new file mode 100644
index 0000000..471e9e3
--- /dev/null
+++ b/esl_dsqdata.tex
@@ -0,0 +1,332 @@
+The \eslmod{dsqdata} module implements a binary sequence data
+format. It accelerates sequence data input in four ways, compared to
+Easel flatfile parsers (\eslmod{sqio}):
+
+\paragraph{Asynchronous input.}
+ Disk and CPU resources are used concurrently, using POSIX threads.
+ A ``loader'' thread does essentially nothing but read chunks of
+ data. An ``unpacker'' thread does CPU work to prepare loaded
+ sequence data chunks for consumption. If it takes time $R$ to read
+ and $P$ to process the data, instead of overall time $R+P$, with
+ asynchronous input we only need time $\mathrm{MAX}(R,P)$.
+
+\paragraph{Predigitization.}
+ Sequence data in the \eslmod{dsqdata} format are already encoded in
+ Easel digital sequence format. User-oriented error checking is done
+ up front when the \eslmod{dsqdata} file is created.
+
+\paragraph{Bit packing.}
+ Disk read time is rate-limiting in \eslmod{dsqdata}, so minimizing
+ data volume is critical. Sequence data are packed bitwise
+ in 32-bit packets to reduce volume by a factor of 1.5 (protein) to
+ 3.75 (nucleic). A packet contains six 5-bit residues (protein or
+ degenerate nucleic) or fifteen 2-bit residues (canonical nucleic) and two
+ control bits.
+
+\paragraph{Separate metadata.}
+ Sequence data and metadata (name, accession, description, taxonomy
+ identifier) are stored separately in \ccode{.dsqs} and \ccode{.dsqm}
+ files. This streamlines unpacking, because these data are handled
+ differently. It also allows a deferred metadata read: sequences may
+ be identified simply by index number during an initial processing
+ sweep, and metadata can be loaded later by random access for a small
+ number of targets of interest.
+
+Table~\ref{tbl:dsqdata_api} lists the functions in the
+\eslmod{dsqdata} API.
+
+% API table is auto generated by the Makefile,
+% using autodoc -t esl_dsqdata.c
+%
+\input{apitables/esl_dsqdata_api}
+
+\subsection{Files in the \eslmodincmd{dsqdata} format}
+
+The format of a database \ccode{mydb} consists of four files:
+
+\vspace{0.5em}
+\begin{tabular}{lll}
+\ccode{mydb} & Stub & Human-readable information about the data \\
+\ccode{mydb.dsqi} & Index & Disk offsets for each seq in metadata and sequence files\\
+\ccode{mydb.dsqm} & Metadata & Name, accession, description, and taxonomy ids\\
+\ccode{mydb.dsqs} & Sequence & Sequences (digitized, packed)\\
+\end{tabular}
+\vspace{0.5em}
+
+The database is specified on command lines by the name of the stub
+file (\ccode{mydb}), without any suffix. For example,
+
+\begin{userchunk}
+ % myprogram mydb
+\end{userchunk}
+
+says to open \ccode{mydb}. The \ccode{esl\_dsqdata\_Open()} call then
+opens all four files.
+
+
+\subsection{Definition of the \eslmodincmd{dsqdata} file formats}
+
+\subsubsection{Stub file}
+
+An example stub file:
+
+\begin{cchunk}
+Easel dsqdata v1 x4019752601
+
+Original file: refprot.fa
+Original format: FASTA
+Type: amino
+Sequences: 11432138
+Residues: 4358716588
+\end{cchunk}
+
+The first line is parsed by the reader. Its text format matches
+\ccode{/Easel dsqdata v(\textbackslash d+) x(\textbackslash d+)/}.
+The first field is a version number for the format, $\geq 1$. It is
+currently unused, but in the future we might need it to parse
+different versions of the format, if we need to update it. The second
+field is a 32-bit unsigned integer tag in the range
+(0..$2^{32}-1$). Each of the four files carries the same randomly
+generated tag. The tag is used to make sure the four files belong
+together in the same database, as opposed to one or more of them being
+inadvertently clobbered somehow by the user.
+
+After the first line, the rest of the stub file is ignored, and can
+contain anything -- even your own notes, if you want to add any.
+
+\subsubsection{Index file: .dsqi}
+
+The header of the binary index file consists of:
+
+\vspace{0.5em}
+\begin{tabular}{lll}
+\textbf{name} & \textbf{type} & \textbf{description} \\
+\ccode{magic} & \ccode{uint32\_t} & magic number (version, byte order)\\
+\ccode{uniquetag} & \ccode{uint32\_t} & random integer tag (0..$2^{32}-1$)\\
+\ccode{alphatype} & \ccode{uint32\_t} & alphabet type code (1,2,3 = RNA, DNA, amino)\\
+\ccode{flags} & \ccode{uint32\_t} & Currently 0. Reserved for future flags\\
+\ccode{max\_namelen} & \ccode{uint32\_t} & Maximum seq name length in metadata\\
+\ccode{max\_acclen} & \ccode{uint32\_t} & Maximum accession length in metadata\\
+\ccode{max\_desclen} & \ccode{uint32\_t} & Maximum description length in metadata\\
+\ccode{max\_seqlen} & \ccode{uint64\_t} & Maximum sequence length\\
+\ccode{nseq} & \ccode{uint64\_t} & Total number of sequences in database\\
+\ccode{nres} & \ccode{uint64\_t} & Total number of residues in database\\
+\end{tabular}
+\vspace{0.5em}
+
+The \textbf{magic} is used to check that the file is indeed a dsqdata
+format file, and to detect byte order swapping. Valid values for the
+magic version/byteorder number are:
+
+\vspace{0.5em}
+\begin{tabular} {lll}
+\textbf{value} & \textbf{derivation} & \textbf{description} \\
+\ccode{0xc4d3d1b1} & ``dsq1'' + 0x80808080 & dsqdata version 1 format \\
+\ccode{0xb1d1d3c4} & above, byteswapped & above, byteswapped \\
+\end{tabular}
+\vspace{0.5em}
+
+The random integer \textbf{uniquetag} must match the tag seen in
+the other files.
+
+The dsqdata packet format is only defined for biological sequence alphabets.
+Valid values for the \textbf{alphatype} code come from a subset of the codes
+used in \ccode{esl\_alphabet.h}:
+\begin{tabular}{lll}
+
+\vspace{0.5em}
+\textbf{integer} & \emcode{esl\_alphabet.h} & \textbf{description} \\
+1 & \ccode{eslRNA} & RNA \\
+2 & \ccode{eslDNA} & DNA \\
+3 & \ccode{eslAMINO} & protein \\
+\end{tabular}
+\vspace{0.5em}
+
+The unused \textbf{flags} field gives us some flexibility for future
+versions of the format.
+
+The maximum lengths of the names, accessions, and descriptions in the
+metadata file might someday be useful (in making allocations, for
+example) but they are currently unused.
+
+Likewise, the maximum sequence length, total number of sequences, and
+total number of residues in the database may someday be useful (for
+making decisions about how to partition a parallel search, for
+example), but they are currently unused too.
+
+After the header, the remainder of the file consists of \ccode{nseq}
+records of type \ccode{ESL\_DSQDATA\_RECORD} (defined in
+\ccode{esl\_dsqdata.h}):
+
+\vspace{0.5em}
+\begin{tabular}{lll}
+\textbf{name} & \textbf{type} & \textbf{description} \\
+\ccode{metadata\_end} & \ccode{int64\_t} & Position of terminal \ccode{\textbackslash 0} of metadata for seq i, in bytes\\
+\ccode{psq\_end} & \ccode{int64\_t} & Position of final packet for sequence i, in packets\\
+\end{tabular}
+\vspace{0.5em}
+
+Storing \emph{end} positions instead of \emph{start} positions allows
+us to determine lengths, without needing an $N+1$'th sentinel record,
+albeit at the cost of special casing what happens for the first
+sequence $i=0$. For example:
+
+\vspace{0.5em}
+\begin{tabular}{ll}
+Length: & \ccode{i == 0 ? r[i].end + 1 : r[i].end - r[i-1].end} \\
+Start: & \ccode{i == 0 ? 0 : r[i-1].end + 1}\\
+\end{tabular}
+\vspace{0.5em}
+
+This is equivalent to treating \ccode{r[-1].end = -1}. Some of the
+reader's code tracks a \ccode{last\_end} variable for the end of the
+previous metadata or packed sequence field $i-1$, which is initialized
+to -1. This -1 boundary condition is why we use signed
+\ccode{int64\_t} types.
+
+Packet sequence endpoints are stored in units of 32-bit
+\emph{packets}, not in bytes. To convert to a disk offset or a length
+in bytes you multiply by 4 (\ccode{sizeof(uint32\_t)}).
+
+Keeping the size of the dsqdata files as small as possible is critical
+because the reading speed is limited by the raw size of the
+data. Therefore we don't store separate positions for the different
+metadata fields (name/accession/description/taxonomy id), only one
+position for all the metadata associated with sequence $i$. The reader
+reads all of it in one chunk, and parses it for the stored \ccode{\textbackslash 0}
+sentinels.
+
+For the same reason, we don't store any information about
+\emph{unpacked} sequence lengths, only the bare minimum of information
+that the dsqdata loader and unpacker need to locate, load, and unpack
+the packed data for any given sequence $i$. The unpacker determines
+the unpacked sequence length when it unpacks the data.
+
+
+\subsubsection{Metadata file, .dsqm}
+
+The metadata file starts with two header fields, the same two that the
+index file starts with:
+
+\vspace{0.5em}
+\begin{tabular}{lll}
+\textbf{name} & \textbf{type} & \textbf{description} \\
+\ccode{magic} & \ccode{uint32\_t} & magic number (version, byte order)\\
+\ccode{uniquetag} & \ccode{uint32\_t} & random integer tag (0..$2^32-1$)\\
+\end{tabular}
+\vspace{0.5em}
+
+After the header, the remainder of the file consists of the following
+data for each sequence $i =$ \ccode{0..nseq-1}:
+
+\vspace{0.5em}
+\begin{tabular}{lll}
+\textbf{field} & \textbf{type} & \textbf{description} \\
+name & \ccode{char *}; ends in \ccode{\textbackslash 0} & Sequence name (1 word, no whitespace) \\
+accession & \ccode{char *}; ends in \ccode{\textbackslash 0} & Sequence accession (1 word, no whitespace)\\
+description & \ccode{char *}; ends in \ccode{\textbackslash 0} & Sequence description line \\
+taxonomy id & \ccode{int32\_t} & NCBI taxonomy identifier; -1 if none\\
+\end{tabular}
+\vspace{0.5em}
+
+The name, accession, and description are variable length strings. The
+name and accession are single ``words'' with no whitespace
+(\ccode{\textbackslash S+}). The description is one line, may contain spaces, but
+may not contain any newlines. All sequences must have a name, so
+\ccode{strlen(name) > 0}. The accession and description are optional;
+if they are not present, these are 0-length strings (\ccode{"\textbackslash 0"})
+
+The taxonomy identifier is an integer in NCBI's taxonomy. Valid
+taxonomy identifiers are $\geq 1$\footnote{I cannot find any
+ documentation at NCBI on the maximum range of the taxid, nor can I
+ find a clear statement of whether 0 is valid or not. 0 is currently
+ unused in the NCBI taxonomy. 1 indicates the top level. That makes
+ it look like it's safe to treat 0 as ``unset'' but it seems even
+ safer to go with -1 and a signed integer. Unless NCBI ends up having
+ more than two billion species. Currently there are about 1.8
+ million.}
+ This field is optional; use a value of -1 to indicate unset.
+
+These names, types, and semantics match the corresponding fields in an
+\ccode{ESL\_SQ}.
+
+\subsubsection{Sequence file, .dsqs}
+
+The sequence file also starts with the same two header fields that the
+index and metadata files started with:
+
+\vspace{0.5em}
+\begin{tabular}{lll}
+\textbf{name} & \textbf{type} & \textbf{description} \\
+\ccode{magic} & \ccode{uint32\_t} & magic number (version, byte order)\\
+\ccode{uniquetag} & \ccode{uint32\_t} & random integer tag (0..$2^32-1$)\\
+\end{tabular}
+\vspace{0.5em}
+
+After the header, the remainder of the file consists of the packed
+sequences, with one packet array for each sequence $i =$
+\ccode{0..nseq-1}. Each packet array ends with a specially marked
+sentinel packet. The packet format is described next.
+
+\subsubsection{Packet format}
+
+Each packet is an unsigned 32 bit integer. The two leading (most
+significant) bits are control bits. Bit 31 signals EOD (end of data):
+the last packet in a packed sequence. Bit 30 signals the packet
+format: 1 for 5-bit, 0 for 2-bit. The remaining bits are the packed
+residue codes:
+
+\begin{asciiart}
+ [31] [30] [29..25] [24..20] [19..15] [14..10] [ 9..5 ] [ 4..0 ]
+ ^ ^ |------------ 6 5-bit packed residues ------------------|
+ | | [] [] [] [] [] [] [] [] [] [] [] [] [] [] []
+ | | |----------- or 15 2-bit packed residues ----------------|
+ | |
+ | "packtype" bit 30 = 0 if packet is 2-bit packed; 1 if 5-bit packed
+ "sentinel" bit 31 = 1 if last packet in packed sequence; else 0
+
+ (packet & (1 << 31)) tests for end of sequence
+ (packet & (1 << 30)) tests for 5-bit packing vs. 2-bit
+ ((packet >> shift) && 31) decodes 5-bit, for shift=25..0 in steps of 5
+ ((packet >> shift) && 3) decodes 2-bit, for shift=28..0 in steps of 2
+\end{asciiart}
+
+Packets without the sentinel bit set are full. They unpack to 15 or 6
+residues.
+
+5-bit EOD packets may be partial: they unpack to 0..6 residues. The
+remaining residue codes are set to 0x1f (11111), indicating EOD within
+the packet. The only case in which a partial EOD packet encodes 0
+residues is a zero-length sequence: there has to be at least one EOD
+packet.
+
+2-bit EOD packets must be full, because there is no way to signal EOD
+locally within a 2-bit packet. It can't use 0x03 (11), because that
+encodes U/T. Generally, therefore, the last packet(s) of a nucleic
+acid sequence must be 5-bit encoded, solely to be able to use sentinel
+residues in a partial packet, unless the end happens to come flush at
+the end of a 2-bit packet.\footnote{If we ever needed to pack an
+ alphabet of 2 or 3 residues, we could use 0x03 as a sentinel. This
+ seems unlikely to ever happen, so I'm simply not going to include
+ any code to read EOD 2-bit partial packets.}
+
+A protein sequence of length $L$ packs into exactly P $= MAX(1,
+(L+5)/6)$ 5-bit packets. A DNA sequence packs into P $\leq MAX(1,
+(L+14)/15)$ mixed 2- and 5-bit packets. P $\geq 1$ because even a
+zero-length sequence ($L=0$) requires an EOD packet.
+
+A packed sequence consists of an integer number of packets, P, ending
+with an EOD packet.
+
+A packed amino acid sequence unpacks to $\leq$ 6P residues. All its
+packets are 5-bit encoded.
+
+A packed nucleic acid sequence unpacks to $\leq$ 15P residues. The
+packets are a mix of 2-bit and 5-bit. Degenerate residues must be
+5-bit packed, and the EOD packet usually is too. A 5-bit packet does
+not have to contain degenerate residues, because it might have been
+necessary to get ``in frame'' to pack a downstream degenerate
+residue. For example, the sequence ACGTACGTNNA... must be packed as
+[ACGTAC][CGTNNA]... to get the N's packed correctly.
+
+
diff --git a/esl_exponential.c b/esl_exponential.c
new file mode 100644
index 0000000..2ca2ba0
--- /dev/null
+++ b/esl_exponential.c
@@ -0,0 +1,699 @@
+/* Statistical routines for exponential distributions.
+ *
+ * Contents:
+ * 1. Routines for evaluating densities and distributions
+ * 2. Generic API routines: for general interface w/ histogram module
+ * 3. Routines for dumping plots for files
+ * 4. Routines for sampling (requires random module)
+ * 5. Maximum likelihood fitting
+ * 6. Stats driver
+ * 7. Unit tests
+ * 8. Test driver
+ * 9. Example
+ * 10. Copyright and license information
+ *
+ * xref STL9/138
+ *
+ * To do:
+ * - Fit*() functions should return eslEINVAL on n=0, eslENORESULT
+ * on failure due to small n. Compare esl_gumbel. xref J12/93.
+ * SRE, Wed Nov 27 11:03:07 2013
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_stats.h"
+#include "esl_exponential.h"
+
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#ifdef eslAUGMENT_HISTOGRAM
+#include "esl_histogram.h"
+#endif
+
+/****************************************************************************
+ * 1. Routines for evaluating densities and distributions
+ ****************************************************************************/
+/* lambda > 0
+ * mu <= x < infinity
+ *
+ * watch out:
+ * - any lambda > 0 is valid... including infinity. Fitting code
+ * may try to test such lambdas, and it must get back valid numbers,
+ * never an NaN, or it will fail. IEEE754 allows us
+ * to calculate log(inf) = inf, exp(-inf) = 0, and exp(inf) = inf.
+ * But inf-inf = NaN, so Don't Do That.
+ */
+
+/* Function: esl_exp_pdf()
+ *
+ * Purpose: Calculates the probability density function for the
+ * exponential, $P(X=x)$, given value <x>, offset <mu>,
+ * and decay parameter <lambda>.
+ */
+double
+esl_exp_pdf(double x, double mu, double lambda)
+{
+ if (x < mu) return 0.;
+ return (lambda * exp(-lambda*(x-mu)));
+}
+
+/* Function: esl_exp_logpdf()
+ *
+ * Purpose: Calculates the log probability density function for the
+ * exponential, $P(X=x)$, given value <x>, offset <mu>,
+ * and decay parameter <lambda>.
+ */
+double
+esl_exp_logpdf(double x, double mu, double lambda)
+{
+ if (x < mu) return -eslINFINITY;
+
+ if (lambda == eslINFINITY)
+ { /* limit as lambda->inf: avoid inf-inf! */
+ if (x == mu) return eslINFINITY;
+ else return -eslINFINITY;
+ }
+ return (log(lambda) - lambda*(x-mu));
+}
+
+/* Function: esl_exp_cdf()
+ *
+ * Purpose: Calculates the cumulative distribution function for the
+ * exponential, $P(X \leq x)$, given value <x>, offset <mu>,
+ * and decay parameter <lambda>.
+ */
+double
+esl_exp_cdf(double x, double mu, double lambda)
+{
+ double y = lambda*(x-mu); /* y>=0 because lambda>0 and x>=mu */
+
+ if (x < mu) return 0.;
+
+ /* 1-e^-y ~ y for small |y| */
+ if (y < eslSMALLX1) return y;
+ else return 1 - exp(-y);
+}
+
+/* Function: esl_exp_logcdf()
+ *
+ * Purpose: Calculates the log of the cumulative distribution function
+ * for the exponential, $log P(X \leq x)$, given value <x>,
+ * offset <mu>, and decay parameter <lambda>.
+ */
+double
+esl_exp_logcdf(double x, double mu, double lambda)
+{
+ double y = lambda * (x-mu);
+ double ey = exp(-y);
+
+ if (x < mu) return -eslINFINITY;
+
+ /* When y is small, 1-e^-y = y, so answer is log(y);
+ * when y is large, exp(-y) is small, log(1-exp(-y)) = -exp(-y).
+ */
+ if (y == 0) return -eslINFINITY; /* don't allow NaN */
+ else if (y < eslSMALLX1) return log(y);
+ else if (ey < eslSMALLX1) return -ey;
+ else return log(1-ey);
+}
+
+/* Function: esl_exp_surv()
+ *
+ * Purpose: Calculates the survivor function, $P(X>x)$ (that is, 1-CDF,
+ * the right tail probability mass) for an exponential distribution,
+ * given value <x>, offset <mu>, and decay parameter <lambda>.
+ */
+double
+esl_exp_surv(double x, double mu, double lambda)
+{
+ if (x < mu) return 1.0;
+ return exp(-lambda * (x-mu));
+}
+
+/* Function: esl_exp_logsurv()
+ *
+ * Purpose: Calculates the log survivor function, $\log P(X>x)$ (that is,
+ * log(1-CDF), the log of the right tail probability mass) for an
+ * exponential distribution, given value <x>, offset <mu>, and
+ * decay parameter <lambda>.
+ */
+double
+esl_exp_logsurv(double x, double mu, double lambda)
+{
+ if (x < mu) return 0.0;
+ return -lambda * (x-mu);
+}
+
+
+/* Function: esl_exp_invcdf()
+ *
+ * Purpose: Calculates the inverse of the CDF; given a <cdf> value
+ * $0 <= p < 1$, returns the value $x$ at which the CDF
+ * has that value.
+ */
+double
+esl_exp_invcdf(double p, double mu, double lambda)
+{
+ return mu - 1/lambda * log(1. - p);
+}
+
+
+
+/* Function: esl_exp_invsurv()
+ *
+ * Purpose: Calculates the inverse of the survivor function, the score
+ * at which the right tail's mass is $0 <= p < 1$, for an
+ * exponential function with parameters <mu> and <lambda>.
+ */
+double
+esl_exp_invsurv(double p, double mu, double lambda)
+{
+
+ return mu - 1./lambda * log(p);
+}
+/*------------------ end of densities and distributions --------------------*/
+
+
+/*------------------ end of densities and distributions --------------------*/
+
+
+
+
+/*****************************************************************
+ * 2. Generic API routines: for general interface w/ histogram module
+ *****************************************************************/
+
+/* Function: esl_exp_generic_pdf()
+ *
+ * Purpose: Generic-API version of PDF.
+ */
+double
+esl_exp_generic_pdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_exp_pdf(x, p[0], p[1]);
+}
+
+/* Function: esl_exp_generic_cdf()
+ *
+ * Purpose: Generic-API version of CDF.
+ */
+double
+esl_exp_generic_cdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_exp_cdf(x, p[0], p[1]);
+}
+
+/* Function: esl_exp_generic_surv()
+ *
+ * Purpose: Generic-API version of survival function.
+ */
+double
+esl_exp_generic_surv(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_exp_surv(x, p[0], p[1]);
+}
+
+/* Function: esl_exp_generic_invcdf()
+ *
+ * Purpose: Generic-API version of inverse CDF.
+ */
+double
+esl_exp_generic_invcdf(double p, void *params)
+{
+ double *v = (double *) params;
+ return esl_exp_invcdf(p, v[0], v[1]);
+}
+/*------------------------- end of generic API --------------------------*/
+
+
+
+/****************************************************************************
+ * 3. Routines for dumping plots for files
+ ****************************************************************************/
+
+/* Function: esl_exp_Plot()
+ *
+ * Purpose: Plot some exponential function <func> (for instance,
+ * <esl_exp_pdf()>) for parameters <mu> and <lambda>, for
+ * a range of values x from <xmin> to <xmax> in steps of <xstep>;
+ * output to an open stream <fp> in xmgrace XY input format.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error, such as a filled disk.
+ */
+int
+esl_exp_Plot(FILE *fp, double mu, double lambda,
+ double (*func)(double x, double mu, double lambda),
+ double xmin, double xmax, double xstep)
+{
+ double x;
+ for (x = xmin; x <= xmax; x += xstep)
+ if (fprintf(fp, "%f\t%g\n", x, (*func)(x, mu, lambda)) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "exponential plot write failed");
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "exponential plot write failed");
+ return eslOK;
+}
+/*-------------------- end plot dumping routines ---------------------------*/
+
+
+
+/****************************************************************************
+ * 4. Routines for sampling (requires augmentation w/ random module)
+ ****************************************************************************/
+#ifdef eslAUGMENT_RANDOM
+
+/* Function: esl_exp_Sample()
+ *
+ * Purpose: Sample an exponential random variate
+ * by the transformation method, given offset <mu>
+ * and decay parameter <lambda>.
+ */
+double
+esl_exp_Sample(ESL_RANDOMNESS *r, double mu, double lambda)
+{
+ double p, x;
+ p = esl_rnd_UniformPositive(r);
+
+ x = mu - 1./lambda * log(p); /* really log(1-p), but if p uniform on 0..1
+ * then so is 1-p.
+ */
+ return x;
+}
+#endif /*eslAUGMENT_RANDOM*/
+/*--------------------------- end sampling ---------------------------------*/
+
+
+
+
+/****************************************************************************
+ * 5. Maximum likelihood fitting
+ ****************************************************************************/
+
+/* Function: esl_exp_FitComplete()
+ *
+ * Purpose: Given an array of <n> samples <x[0]..x[n-1]>, fit
+ * them to an exponential distribution.
+ * Return maximum likelihood parameters <ret_mu> and <ret_lambda>.
+ *
+ * Args: x - complete exponentially-distributed data [0..n-1]
+ * n - number of samples in <x> (n>0)
+ * ret_mu - lower bound of the distribution (all x_i >= mu)
+ * ret_lambda - RETURN: maximum likelihood estimate of lambda
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if n=0 (no data).
+ *
+ * Xref: STL9/138.
+ */
+int
+esl_exp_FitComplete(double *x, int n, double *ret_mu, double *ret_lambda)
+{
+ double mu, mean;
+ int i;
+ int status;
+
+ if (!n) ESL_XEXCEPTION(eslEINVAL, "empty data vector provided for exponential fit");
+
+ /* ML mu is the lowest score. mu=x is ok in the exponential. */
+ mu = x[0];
+ for (i = 1; i < n; i++) if (x[i] < mu) mu = x[i];
+
+ mean = 0.;
+ for (i = 0; i < n; i++) mean += x[i] - mu;
+ mean /= (double) n;
+
+ *ret_mu = mu;
+ *ret_lambda = 1./mean; /* ML estimate trivial & analytic */
+ return eslOK;
+
+ ERROR:
+ *ret_mu = 0.0;
+ *ret_lambda = 0.0;
+ return status;
+}
+
+/* Function: esl_exp_FitCompleteScale()
+ *
+ * Purpose: Given an array of <n> samples <x[0]..x[n-1]>, fit
+ * them to an exponential distribution of known location
+ * parameter <mu>. Return maximum likelihood scale
+ * parameter <ret_lambda>.
+ *
+ * All $x_i \geq \mu$.
+ *
+ * Args: x - complete exponentially-distributed data [0..n-1]
+ * n - number of samples in <x>
+ * mu - lower bound of the distribution (all x_i >= mu)
+ * ret_lambda - RETURN: maximum likelihood estimate of lambda
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Xref: J1/49.
+ */
+int
+esl_exp_FitCompleteScale(double *x, int n, double mu, double *ret_lambda)
+{
+ double mean;
+ int i;
+
+ mean = 0.;
+ for (i = 0; i < n; i++) mean += x[i] - mu;
+ mean /= (double) n;
+
+ *ret_lambda = 1./mean; /* ML estimate trivial & analytic */
+ return eslOK;
+}
+
+
+#ifdef eslAUGMENT_HISTOGRAM
+/* Function: esl_exp_FitCompleteBinned()
+ *
+ * Purpose: Fit a complete exponential distribution to the observed
+ * binned data in a histogram <g>, where each
+ * bin i holds some number of observed samples x with values from
+ * lower bound l to upper bound u (that is, $l < x \leq u$);
+ * find maximum likelihood parameters $\mu,\lambda$ and
+ * return them in <*ret_mu>, <*ret_lambda>.
+ *
+ * If the binned data in <g> were set to focus on
+ * a tail by virtual censoring, the "complete" exponential is
+ * fitted to this tail. The caller then also needs to
+ * remember what fraction of the probability mass was in this
+ * tail.
+ *
+ * The ML estimate for $mu$ is the smallest observed
+ * sample. For complete data, <ret_mu> is generally set to
+ * the smallest observed sample value, except in the
+ * special case of a "rounded" complete dataset, where
+ * <ret_mu> is set to the lower bound of the smallest
+ * occupied bin. For tails, <ret_mu> is set to the cutoff
+ * threshold <phi>, where we are guaranteed that <phi> is
+ * at the lower bound of a bin (by how the histogram
+ * object sets tails).
+ *
+ * The ML estimate for <ret_lambda> has an analytical
+ * solution, so this routine is fast.
+ *
+ * If all the data are in one bin, the ML estimate of
+ * $\lambda$ will be $\infty$. This is mathematically correct,
+ * but is probably a situation the caller wants to avoid, perhaps
+ * by choosing smaller bins.
+ *
+ * This function currently cannot fit an exponential tail
+ * to truly censored, binned data, because it assumes that
+ * all bins have equal width, but in true censored data, the
+ * lower cutoff <phi> may fall anywhere in the first bin.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if dataset is true-censored.
+ */
+int
+esl_exp_FitCompleteBinned(ESL_HISTOGRAM *g, double *ret_mu, double *ret_lambda)
+{
+ int i;
+ double ai, bi, delta;
+ double sa, sb;
+ double mu = 0.;
+
+ if (g->dataset_is == COMPLETE)
+ {
+ if (g->is_rounded) mu = esl_histogram_Bin2LBound(g, g->imin);
+ else mu = g->xmin;
+ }
+ else if (g->dataset_is == VIRTUAL_CENSORED) /* i.e., we'll fit to tail */
+ mu = g->phi;
+ else if (g->dataset_is == TRUE_CENSORED)
+ ESL_EXCEPTION(eslEINVAL, "can't fit true censored dataset");
+
+ delta = g->w;
+ sa = sb = 0.;
+ for (i = g->cmin; i <= g->imax; i++) /* for each occupied bin */
+ {
+ if (g->obs[i] == 0) continue;
+ ai = esl_histogram_Bin2LBound(g,i);
+ bi = esl_histogram_Bin2UBound(g,i);
+ sa += g->obs[i] * (ai-mu);
+ sb += g->obs[i] * (bi-mu);
+ }
+ *ret_mu = mu;
+ *ret_lambda = 1/delta * (log(sb) - log(sa));
+ return eslOK;
+}
+#endif /*eslAUGMENT_HISTOGRAM*/
+
+
+/****************************************************************************
+ * 6. Stats driver
+ ****************************************************************************/
+#ifdef eslEXPONENTIAL_STATS
+/* Compiles statistics on the accuracy of ML estimation of an exponential tail.
+ * compile: gcc -g -O2 -Wall -I. -L. -o stats -DeslEXPONENTIAL_STATS esl_exponential.c -leasel -lm
+ * run: ./stats > stats.out
+ *
+ * Output is, for each trial:
+ * <trial #> <fitted mu> <fitted lambda>
+ *
+ * To get mean, stddev of lambda estimates:
+ * % ./stats | avg -f2
+ */
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_exponential.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ int ntrials; /* number of estimates to gather */
+ int N; /* number of samples collected to make each estimate */
+ double mu, lambda; /* parametric location, scale */
+ double est_mu, est_lambda; /* estimated location, scale */
+ int trial;
+ int i;
+ double *x;
+
+ /* Configuration: (change & recompile as needed)
+ */
+ ntrials = 1000;
+ mu = 0.;
+ lambda = 0.693;
+ N = 95;
+
+ x = malloc(sizeof(double) *N);
+ for (trial = 0; trial < ntrials; trial++)
+ {
+ for (i = 0; i < N; i++)
+ x[i] = esl_exp_Sample(r, mu, lambda);
+ esl_exp_FitComplete(x, N, &est_mu, &est_lambda);
+
+ /*
+ est_mu = mu;
+ esl_exp_FitCompleteScale(x, N, est_mu, &est_lambda);
+ */
+ printf("%4d %8.4f %8.4f\n", i, est_mu, est_lambda);
+ }
+ free(x);
+ return 0;
+}
+#endif /*eslEXPONENTIAL_STATS*/
+
+
+
+
+
+/****************************************************************************
+ * 7. Unit tests
+ ****************************************************************************/
+
+/****************************************************************************
+ * 8. Test driver
+ ****************************************************************************/
+#ifdef eslEXPONENTIAL_TESTDRIVE
+/* Compile:
+ gcc -g -Wall -I. -L. -o test -DeslEXPONENTIAL_TESTDRIVE esl_exponential.c -leasel -lm
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_exponential.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_HISTOGRAM *h;
+ ESL_RANDOMNESS *r;
+ double mu = 10.0;
+ double lambda = 1.0;
+ int n = 10000;
+ double binwidth = 0.1;
+ double emu, elambda;
+ int i;
+ double x;
+ double *data;
+ int ndata;
+
+ int opti;
+ int be_verbose = FALSE;
+ char *plotfile = NULL;
+ FILE *pfp = stdout;
+ int plot_pdf = FALSE;
+ int plot_logpdf = FALSE;
+ int plot_cdf = FALSE;
+ int plot_logcdf = FALSE;
+ int plot_surv = FALSE;
+ int plot_logsurv = FALSE;
+ int xmin_set = FALSE;
+ double xmin;
+ int xmax_set = FALSE;
+ double xmax;
+ int xstep_set = FALSE;
+ double xstep;
+
+ for (opti = 1; opti < argc && *(argv[opti]) == '-'; opti++)
+ {
+ if (strcmp(argv[opti], "-m") == 0) mu = atof(argv[++opti]);
+ else if (strcmp(argv[opti], "-l") == 0) lambda = atof(argv[++opti]);
+ else if (strcmp(argv[opti], "-n") == 0) n = atoi(argv[++opti]);
+ else if (strcmp(argv[opti], "-o") == 0) plotfile = argv[++opti];
+ else if (strcmp(argv[opti], "-v") == 0) be_verbose = TRUE;
+ else if (strcmp(argv[opti], "-w") == 0) binwidth = atof(argv[++opti]);
+ else if (strcmp(argv[opti], "-C") == 0) plot_cdf = TRUE;
+ else if (strcmp(argv[opti], "-LC") == 0) plot_logcdf = TRUE;
+ else if (strcmp(argv[opti], "-P") == 0) plot_pdf = TRUE;
+ else if (strcmp(argv[opti], "-LP") == 0) plot_logpdf = TRUE;
+ else if (strcmp(argv[opti], "-S") == 0) plot_surv = TRUE;
+ else if (strcmp(argv[opti], "-LS") == 0) plot_logsurv = TRUE;
+ else if (strcmp(argv[opti], "-XL") == 0) { xmin_set = TRUE; xmin = atof(argv[++opti]); }
+ else if (strcmp(argv[opti], "-XH") == 0) { xmax_set = TRUE; xmax = atof(argv[++opti]); }
+ else if (strcmp(argv[opti], "-XS") == 0) { xstep_set = TRUE; xstep = atof(argv[++opti]); }
+ else esl_fatal("bad option");
+ }
+
+ if (be_verbose)
+ printf("Parametric: mu = %f lambda = %f\n", mu, lambda);
+
+ r = esl_randomness_Create(0);
+ h = esl_histogram_CreateFull(mu, 100., binwidth);
+ if (plotfile != NULL) {
+ if ((pfp = fopen(plotfile, "w")) == NULL) esl_fatal("Failed to open plotfile");
+ }
+ if (! xmin_set) xmin = mu;
+ if (! xmax_set) xmax = mu+20* (1./lambda);
+ if (! xstep_set) xstep = 0.1;
+
+ for (i = 0; i < n; i++)
+ {
+ x = esl_exp_Sample(r, mu, lambda);
+ esl_histogram_Add(h, x);
+ }
+ esl_histogram_GetData(h, &data, &ndata);
+
+ esl_exp_FitComplete(data, ndata, &emu, &elambda);
+ if (be_verbose) printf("Complete data fit: mu = %f lambda = %f\n", emu, elambda);
+ if (fabs( (emu-mu)/mu ) > 0.01) esl_fatal("Error in (complete) fitted mu > 1%\n");
+ if (fabs( (elambda-lambda)/lambda ) > 0.10) esl_fatal("Error in (complete) fitted lambda > 10%\n");
+
+ esl_exp_FitCompleteBinned(h, &emu, &elambda);
+ if (be_verbose) printf("Binned data fit: mu = %f lambda = %f\n", emu, elambda);
+ if (fabs( (emu-mu)/mu ) > 0.01) esl_fatal("Error in (binned) fitted mu > 1%\n");
+ if (fabs( (elambda-lambda)/lambda ) > 0.10) esl_fatal("Error in (binned) fitted lambda > 10%\n");
+
+ if (plot_pdf) esl_exp_Plot(pfp, mu, lambda, &esl_exp_pdf, xmin, xmax, xstep);
+ if (plot_logpdf) esl_exp_Plot(pfp, mu, lambda, &esl_exp_logpdf, xmin, xmax, xstep);
+ if (plot_cdf) esl_exp_Plot(pfp, mu, lambda, &esl_exp_cdf, xmin, xmax, xstep);
+ if (plot_logcdf) esl_exp_Plot(pfp, mu, lambda, &esl_exp_logcdf, xmin, xmax, xstep);
+ if (plot_surv) esl_exp_Plot(pfp, mu, lambda, &esl_exp_surv, xmin, xmax, xstep);
+ if (plot_logsurv) esl_exp_Plot(pfp, mu, lambda, &esl_exp_logsurv, xmin, xmax, xstep);
+
+ if (plotfile != NULL) fclose(pfp);
+
+ esl_randomness_Destroy(r);
+ esl_histogram_Destroy(h);
+ return 0;
+}
+#endif /*eslEXPONENTIAL_TESTDRIVE*/
+
+
+/****************************************************************************
+ * 9. Example
+ ****************************************************************************/
+#ifdef eslEXPONENTIAL_EXAMPLE
+/*::cexcerpt::exp_example::begin::*/
+/* compile:
+ gcc -g -Wall -I. -o example -DeslEXPONENTIAL_EXAMPLE\
+ -DeslAUGMENT_HISTOGRAM -DeslAUGMENT_RANDOM -DeslAUGMENT_STATS\
+ esl_exponential.c esl_histogram.c esl_random.c esl_stats.c easel.c -lm
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_exponential.h"
+
+int
+main(int argc, char **argv)
+{
+ double mu = -50.0;
+ double lambda = 0.5;
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ ESL_HISTOGRAM *h = esl_histogram_CreateFull(mu, 100., 0.1);
+ int n = 10000;
+ double emu, elambda;
+ int i;
+ double x;
+ double *data;
+ int ndata;
+
+ for (i = 0; i < n; i++)
+ {
+ x = esl_exp_Sample(r, mu, lambda);
+ esl_histogram_Add(h, x);
+ }
+ esl_histogram_GetData(h, &data, &ndata);
+
+ /* Plot the empirical (sampled) and expected survivals */
+ esl_histogram_PlotSurvival(stdout, h);
+ esl_exp_Plot(stdout, mu, lambda,
+ &esl_exp_surv, h->xmin, h->xmax, 0.1);
+
+ /* ML fit to complete data, and plot fitted survival curve */
+ esl_exp_FitComplete(data, ndata, &emu, &elambda);
+ esl_exp_Plot(stdout, emu, elambda,
+ &esl_exp_surv, h->xmin, h->xmax, 0.1);
+
+ /* ML fit to binned data, plot fitted survival curve */
+ esl_exp_FitCompleteBinned(h, &emu, &elambda);
+ esl_exp_Plot(stdout, emu, elambda,
+ &esl_exp_surv, h->xmin, h->xmax, 0.1);
+
+ esl_randomness_Destroy(r);
+ esl_histogram_Destroy(h);
+ return 0;
+}
+/*::cexcerpt::exp_example::end::*/
+#endif /*eslEXPONENTIAL_EXAMPLE*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_exponential.h b/esl_exponential.h
new file mode 100644
index 0000000..c7fa0e4
--- /dev/null
+++ b/esl_exponential.h
@@ -0,0 +1,52 @@
+/* Exponential distributions.
+ *
+ * SRE, Wed Aug 10 08:32:45 2005 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslEXPONENTIAL_INCLUDED
+#define eslEXPONENTIAL_INCLUDED
+
+#ifdef eslAUGMENT_RANDOM
+#include <esl_random.h>
+#endif
+#ifdef eslAUGMENT_HISTOGRAM
+#include <esl_histogram.h>
+#endif
+
+extern double esl_exp_pdf (double x, double mu, double lambda);
+extern double esl_exp_logpdf (double x, double mu, double lambda);
+extern double esl_exp_cdf (double x, double mu, double lambda);
+extern double esl_exp_logcdf (double x, double mu, double lambda);
+extern double esl_exp_surv (double x, double mu, double lambda);
+extern double esl_exp_logsurv(double x, double mu, double lambda);
+extern double esl_exp_invcdf (double p, double mu, double lambda);
+extern double esl_exp_invsurv(double p, double mu, double lambda);
+
+
+extern double esl_exp_generic_pdf (double x, void *params);
+extern double esl_exp_generic_cdf (double x, void *params);
+extern double esl_exp_generic_surv (double x, void *params);
+extern double esl_exp_generic_invcdf(double p, void *params);
+
+extern int esl_exp_Plot(FILE *fp, double mu, double lambda,
+ double (*func)(double x, double mu, double lambda),
+ double xmin, double xmax, double xstep);
+
+#ifdef eslAUGMENT_RANDOM
+extern double esl_exp_Sample(ESL_RANDOMNESS *r, double mu, double lambda);
+#endif
+
+extern int esl_exp_FitComplete (double *x, int n, double *ret_mu, double *ret_lambda);
+extern int esl_exp_FitCompleteScale(double *x, int n, double mu, double *ret_lambda);
+
+#ifdef eslAUGMENT_HISTOGRAM
+extern int esl_exp_FitCompleteBinned(ESL_HISTOGRAM *h,
+ double *ret_mu, double *ret_lambda);
+#endif
+
+
+#endif /*eslEXPONENTIAL_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_exponential.tex b/esl_exponential.tex
new file mode 100644
index 0000000..55cb448
--- /dev/null
+++ b/esl_exponential.tex
@@ -0,0 +1,41 @@
+
+\begin{tabular}{lcll}\hline
+Variate & $x$ & \ccode{double} & $\mu \leq x < \infty$ \\
+Location & $\mu$ & \ccode{double} & $-\infty < \mu < \infty$\\
+Scale & $\lambda$ & \ccode{double} & $\lambda > 0$ \\ \hline
+\end{tabular}
+
+The probability density function (PDF) is:
+
+\begin{equation}
+P(X=x) = \lambda e^{-\lambda (x - \mu)}
+\end{equation}
+
+The cumulative distribution function (CDF) is:
+
+\begin{equation}
+P(X \leq x) = 1 - e^{-\lambda (x - \mu)}
+\end{equation}
+
+
+\subsection{Sampling}
+
+An exponentially distributed sample $x$ is generated by the
+transformation method, using the fact that if $R$ is uniformly
+distributed on $(0,1]$, $1-R$ is uniformly distributed on $[0,1)$:
+
+\[
+ R = \mbox{uniform positive sample in (0,1]}\\
+ x = \mu - \frac{1}{lambda} \log(R)
+\]
+
+\subsection{Maximum likelihood fitting}
+
+The maximum likelihood estimate $\hat{\lambda}$ is $\frac{1}{\sum_i
+x_i}$. The distribution of $\frac{\lambda}{\hat{\lambda}}$ is
+approximately normal with mean 1 and standard error $\frac{1}{\sqrt{N}}$
+\citep{Lawless82}.
+
+% xref J1/p49 for derivation of standard error.
+
+
diff --git a/esl_fileparser.c b/esl_fileparser.c
new file mode 100644
index 0000000..f03327e
--- /dev/null
+++ b/esl_fileparser.c
@@ -0,0 +1,805 @@
+/* A simple token-based file parsing system.
+ *
+ * Contents:
+ * 1. The ESL_FILEPARSER object and its API.
+ * 2. Private functions.
+ * 3. Unit tests.
+ * 4. Test driver.
+ * 5. Examples.
+ * 6. Copyright/license information.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#include "esl_fileparser.h"
+
+static int nextline(ESL_FILEPARSER *efp);
+
+/*****************************************************************
+ * 1. The ESL_FILEPARSER object and its API.
+ *****************************************************************/
+
+/* Function: esl_fileparser_Open()
+ * Incept: SRE, Tue Apr 3 08:09:56 2007 [Janelia]
+ *
+ * Purpose: Opens <filename> for reading.
+ *
+ * As a special case, if <filename> is "-", set up the
+ * fileparser to read and parse <stdin>.
+ *
+ * <envvar> is optional name of an environment variable,
+ * such as <BLASTDB>. This environment variable contains a
+ * colon-delimited list of directories in which the
+ * <filename> may lie relative to. We looks first relative
+ * to the current working directory, then in any
+ * directories specified by <envvar>. If <envvar> is <NULL>,
+ * we only look in the current working directory.
+ *
+ * Args: filename - filename, relative path, or fully qualified path
+ * envvar - optional environment variable name to find
+ * colon-delimited list of directories <filename>
+ * may reside in; or <NULL>
+ * ret_efp - RETURN: opened <ESL_FILEPARSER>
+ *
+ * Returns: <eslOK> on success, and <ret_fp> points
+ * to a new <ESL_FILEPARSER> object.
+ *
+ * Returns <eslENOTFOUND> if <filename> can't
+ * be opened for reading, and <ret_fp> is set
+ * to <NULL>.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_fileparser_Open(const char *filename, const char *envvar, ESL_FILEPARSER **ret_efp)
+{
+ int status;
+ ESL_FILEPARSER *efp = NULL;
+
+ if ((efp = esl_fileparser_Create(NULL)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ if (strcmp(filename, "-") == 0)
+ efp->fp = stdin;
+ else if ((efp->fp = fopen(filename, "r")) != NULL) {
+ if ((status = esl_strdup(filename, -1, &(efp->filename))) != eslOK) goto ERROR;
+ }
+ else if ((status = esl_FileEnvOpen(filename, envvar, &(efp->fp), &(efp->filename))) != eslOK)
+ { status = eslENOTFOUND; goto ERROR; }
+
+ *ret_efp = efp;
+ return eslOK;
+
+ ERROR:
+ esl_fileparser_Close(efp);
+ *ret_efp = NULL;
+ return status;
+}
+
+
+/* Function: esl_fileparser_Create()
+ * Incept: SRE, Fri Jul 9 12:50:29 2004 [St. Louis]
+ *
+ * Purpose: Take an open file <fp>, and transform it to
+ * a fileparser object -- preparing to parse it
+ * one whitespace-delimited field at a time.
+ *
+ * Args: fp - open FILE to parse
+ *
+ * Returns: a new <ESL_FILEPARSER> object, which must be
+ * free'd by the caller with <esl_fileparser_Destroy()>.
+ *
+ * Throws: <eslEMEM> if an allocation failed.
+ *
+ * Xref: STL8 p.56.
+ */
+ESL_FILEPARSER *
+esl_fileparser_Create(FILE *fp)
+{
+ int status;
+ ESL_FILEPARSER *efp = NULL;
+
+ ESL_ALLOC(efp, sizeof(ESL_FILEPARSER));
+ efp->fp = fp;
+ efp->buf = NULL;
+ efp->buflen = 0;
+ efp->s = NULL;
+ efp->commentchar = '\0';
+ efp->filename = NULL;
+ efp->linenumber = 0;
+ efp->errbuf[0] = '\0';
+ efp->is_buffer = FALSE;
+ efp->mem_buffer = NULL;
+ efp->mem_size = 0;
+ efp->mem_pos = 0;
+ return efp;
+
+ ERROR:
+ esl_fileparser_Destroy(efp);
+ return NULL;
+}
+
+
+/* Function: esl_fileparser_CreateMapped()
+ * Incept: MSF, Mon Aug 16 2010 [Janelia]
+ *
+ * Purpose: Sets up a memory buffer to be parsed with the
+ * file parser routines.Take an open file <fp>, and transform it to
+ * a fileparser object -- preparing to parse it
+ * one whitespace-delimited field at a time.
+ *
+ * Args: fp - open FILE to parse
+ *
+ * Returns: a new <ESL_FILEPARSER> object, which must be
+ * free'd by the caller with <esl_fileparser_Destroy()>.
+ *
+ * Throws: <eslEMEM> if an allocation failed.
+ *
+ * Xref: STL8 p.56.
+ */
+ESL_FILEPARSER *
+esl_fileparser_CreateMapped(void *buffer, int size)
+{
+ ESL_FILEPARSER *efp = NULL;
+
+ if ((efp = esl_fileparser_Create(NULL)) == NULL) return NULL;
+
+ efp->is_buffer = TRUE;
+ efp->mem_buffer = buffer;
+ efp->mem_size = size;
+ return efp;
+}
+
+
+
+
+/* Function: esl_fileparser_SetCommentChar()
+ *
+ * Purpose: Defines a single character <c> for comments. Anything
+ * on a line following this character is ignored
+ * when parsing.
+ *
+ * Args: efp - open fileparser
+ * c - comment character ('#', for example)
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_fileparser_SetCommentChar(ESL_FILEPARSER *efp, char c)
+{
+ efp->commentchar = c;
+ return eslOK;
+}
+
+
+
+/* Function: esl_fileparser_GetToken()
+ * Incept: SRE, Fri Jul 9 13:03:50 2004 [St. Louis]
+ *
+ * Purpose: Sets a pointer to the next field in the
+ * file we're parsing.
+ *
+ * The <opt_tok> pointer is into an internal line buffer
+ * that may be invalidated upon the next call to a
+ * <fileparser> function. If you want to store it, make a
+ * copy.
+ *
+ * Args: efp - open fileparser
+ * opt_tok - optRETURN: ptr to next field
+ * opt_toklen - optRETURN: length of tok.
+ *
+ * Returns: <eslOK> if <tok>, <toklen> contain valid data.
+ * <eslEOF> on normal end-of-file.
+ *
+ * Throws: <eslEMEM> if an allocation fails.
+ *
+ * Xref: STL8 p.56.
+ */
+int
+esl_fileparser_GetToken(ESL_FILEPARSER *efp, char **opt_tok, int *opt_toklen)
+{
+ char *tok = NULL;
+ int toklen = 0;
+ int tokcode;
+ int fcode;
+ int goodtok;
+
+ if (opt_tok) *opt_tok = NULL;
+ if (opt_toklen) *opt_toklen = 0;
+
+ /* First, make sure we have a line loaded.
+ * On the first call to GetToken, we won't.
+ */
+ if (efp->buf == NULL) {
+ fcode = nextline(efp);
+ if (fcode != eslOK) return fcode;
+ }
+
+ /* Start strtok()'ing this line to try to find token.
+ * If we don't find one, keep loading lines until we
+ * do, or we run out of data.
+ * efp->s was set either by nextline() or previous GetToken().
+ */
+ do {
+ goodtok = FALSE;
+ tokcode = esl_strtok_adv(&(efp->s), " \t\r\n", &tok, &toklen, NULL);
+ if (tokcode == eslEOL || (tokcode == eslOK && *tok == efp->commentchar))
+ {
+ fcode = nextline(efp);
+ if (fcode != eslOK) return fcode;
+ }
+ else if (tokcode == eslOK) goodtok = TRUE;
+ else
+ { sprintf(efp->errbuf, "esl_strtok() failed"); return tokcode;}
+ } while (! goodtok);
+
+ if (opt_tok) *opt_tok = tok;
+ if (opt_toklen) *opt_toklen = toklen;
+ return eslOK;
+}
+
+
+/* Function: esl_fileparser_NextLine()
+ * Incept: SRE, Tue Apr 3 08:27:22 2007 [Janelia]
+ *
+ * Purpose: Advance the parser to the next non-blank, non-comment
+ * data line that contains at least one token.
+ *
+ * Upon return, <efp->buf> is a data-containing line, and
+ * <efp->s> points to the first non-whitespace character on
+ * it. A line-based parser can work on one or both of these.
+ *
+ * A line-oriented but token-based parser will call
+ * <esl_fileparser_GetTokenOnLine()> to extract successive
+ * tokens from it.
+ *
+ * A pure token-based parser will generally not call
+ * <_NextLine()>. The only reason would be to skip the
+ * remainder of a line it's in the middle of parsing, and
+ * advance to the next one -- but that's a sort of
+ * line-oriented thing to do.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEOF> if no more data lines remain in the file.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_fileparser_NextLine(ESL_FILEPARSER *efp)
+{
+ int status;
+
+ while ((status = nextline(efp)) == eslOK)
+ {
+ while (efp->s != '\0' && isspace(*(efp->s))) efp->s++;
+ if (*efp->s != '\0' && *efp->s != efp->commentchar) break;
+ }
+ if (status == eslEOF) return status;
+ if (status != eslOK) ESL_FAIL(status, efp->errbuf, "nextline() failed");
+ return eslOK;
+}
+
+
+/* Function: esl_fileparser_NextLinePeeked()
+ * Synopsis: Read the next line, prepending a peek.
+ * Incept: SRE, Wed Oct 15 10:08:37 2008 [Janelia]
+ *
+ * Purpose: Sometimes we need to peek at the start of an input stream
+ * to see whether it is in a binary format, before we start
+ * parsing it as ASCII lines. When this happens, the caller
+ * will typically have used <fread()> to read a fixed
+ * number of bytes from the input stream, checked to see if
+ * they are a magic number representing a binary format,
+ * and found that they are not. The caller then wants to
+ * switch to reading in ASCII format with the <fileparser>
+ * API, but with those bytes included on the first
+ * line. Because the file might start with comments or
+ * blank lines that need to be skipped, we want to deal
+ * with the peeked data in the context of the
+ * <ESL_FILEPARSER>. The caller cannot simply close and
+ * reopen the stream, because the stream may be a pipe
+ * (<stdin> or <gzip -dc> for example).
+ *
+ * The caller passes the bytes it peeked at with <fread()>
+ * in <prefix>, and the number of bytes it peeked at in
+ * <plen>.
+ *
+ * The parser is advanced to the next non-blank,
+ * non-comment data line that contains at least one token,
+ * taking the prepended <prefix> into account.
+ *
+ * There is a significant flaw in this mechanism, and as a
+ * result the caller must be able to guarantee the
+ * following limitation. The first data-containing line
+ * must be longer than <prefix>. It is sufficient for the
+ * first data token to be longer than <prefix>.
+ * (Equivalently, if <prefix> contains any data token, it
+ * must not contain any newline \verb+\n+ after that data.) The
+ * reason is that we need to avoid a situation where the
+ * concatenated prefix+nextline contains more than one data
+ * line, because other routines in the module assume that
+ * <efp->buf> is a single \verb+\n+-terminated line of input. For
+ * example: HMMER save files either start with a 4-byte
+ * binary magic number, or with "HMMER", and "HMMER" is
+ * longer than 4 bytes.
+ *
+ * Args: efp - open fileparser
+ * prefix - bytes that caller obtained by peeking with fread()
+ * plen - number of bytes in prefix
+ *
+ * Returns: <eslOK> on success.
+ * <eslEOF> if no more tokens remain in the file.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ *
+ * Xref: For an example, see HMMER's HMM save file input.
+ */
+int
+esl_fileparser_NextLinePeeked(ESL_FILEPARSER *efp, char *prefix, int plen)
+{
+ int blen;
+ int status;
+
+ /* First, make buf = the first line again, by prepending <prefix>. */
+ if ((status = nextline(efp)) != eslOK) goto ERROR; /* EOF, EMEM */
+ blen = strlen(efp->buf);
+
+ if (blen + plen + 1 > efp->buflen) {
+ ESL_REALLOC(efp->buf, sizeof(char) * (blen + plen + 1));
+ efp->buflen = blen + plen + 1;
+ }
+ memmove(efp->buf+plen, efp->buf, blen+1);
+ memcpy(efp->buf, prefix, plen);
+ efp->s = efp->buf;
+
+ while (efp->s != '\0' && isspace(*(efp->s))) efp->s++;
+ if (*efp->s != '\0' && *efp->s != efp->commentchar) return eslOK;
+ else return esl_fileparser_NextLine(efp);
+
+ ERROR:
+ return status;
+}
+
+
+
+
+/* Function: esl_fileparser_GetTokenOnLine()
+ * Incept: SRE, Tue Apr 3 08:46:59 2007 [Janelia]
+ *
+ * Purpose: Same as <esl_fileparser_GetToken()>, except that it only
+ * retrieves tokens from the line that the parser is
+ * on. When it runs out of tokens on the line, it returns
+ * <eslEOL>. This allows a caller to count the tokens on a
+ * line (whereas <GetToken()> reads through newlines
+ * silently).
+ *
+ * The <opt_tok> pointer is into an internal line buffer
+ * that may be invalidated upon the next call to a
+ * <fileparser> function. If you want to store it, make a
+ * copy.
+ *
+ * Normally, a call to <esl_fileparser_GetTokenOnLine()>
+ * would be preceded by <esl_fileparser_NextLine()> to
+ * position the parser on the next data line with at least
+ * one token on it. However, you could also conceivably
+ * call <esl_fileparser_GetTokenOnLine()> after one or more
+ * calls to <esl_fileparser_GetToken()>, to get remaining
+ * tokens from a given line. What you can't do is to call
+ * <esl_fileparser_GetTokenOnLine()> immediately after
+ * opening a file; the parser won't have a line loaded yet.
+ * (In this case, it would return <eslEOL>.)
+ *
+ * Returns: <eslOK> on success, and the token and its length are
+ * in <opt_tok> and <opt_toklen>.
+ *
+ * Returns <eslEOL> if no more tokens exist on the line;
+ * in this case <opt_tok> is set to <NULL> and <opt_toklen>
+ * to 0.
+ */
+int
+esl_fileparser_GetTokenOnLine(ESL_FILEPARSER *efp, char **opt_tok, int *opt_toklen)
+{
+ char *tok = NULL;
+ int toklen = 0;
+ int status;
+
+ /* No line loaded? Then we can't find any token on it. */
+ if (efp->buf == NULL) { status = eslEOL; goto ERROR; }
+
+ /* Find next token in the line that's already loaded in the parser. */
+ status = esl_strtok_adv(&(efp->s), " \t\r\n", &tok, &toklen, NULL);
+ if (status == eslEOL) goto ERROR;
+ if (status != eslOK) goto ERROR;
+ if (status == eslOK && *tok == efp->commentchar) { status = eslEOL; goto ERROR; }
+
+ if (opt_tok) *opt_tok = tok;
+ if (opt_toklen) *opt_toklen = toklen;
+ return eslOK;
+
+ ERROR:
+ if (opt_tok) *opt_tok = NULL;
+ if (opt_toklen) *opt_toklen = 0;
+ return status;
+}
+
+
+/* Function: esl_fileparser_GetRemainingLine()
+ * Synopsis: Returns pointer to the rest of the current line.
+ * Incept: SRE, Mon Oct 13 08:59:26 2008 [Janelia]
+ *
+ * Purpose: Set a pointer <*ret_s> to the rest of the current line
+ * held by the fileparser <efp>. Trailing newline char,
+ * if any, is removed.
+ *
+ * Because <ret_s> points to internal storage in the
+ * fileparser, the caller should be finished with it before
+ * making its next call to any fileparser function.
+ *
+ * Any comment characters on the rest of the line are
+ * ignored: this is designed for a case where the rest of
+ * the line is to be read as free text.
+ *
+ * Args: efp - fileparser
+ * ret_s - RETURN: pointer to the remainder of the line
+ *
+ * Returns: <eslOK> on success.
+ * <eslEOL> if nothing remains on the line, and <*ret_s>
+ * is <NULL>.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_fileparser_GetRemainingLine(ESL_FILEPARSER *efp, char **ret_s)
+{
+ /* No line loaded? Then we can't find anything on it. */
+ if (efp->buf == NULL) { *ret_s = NULL; return eslEOL; }
+
+ /* skip leading whitespace */
+ while (isspace(*(efp->s))) efp->s++;
+
+ /* Return everything to end of line as a "token", stripping newline */
+ return esl_strtok(&(efp->s), "\r\n", ret_s);
+}
+
+
+/* Function: esl_fileparser_Destroy()
+ * Incept: SRE, Fri Jul 9 13:22:36 2004 [St. Louis]
+ *
+ * Purpose: Frees an open <ESL_FILEPARSER>. The original fp is
+ * still open - whoever opened it is still
+ * responsible for closing it.
+ *
+ * Xref: STL8 p.56.
+ */
+void
+esl_fileparser_Destroy(ESL_FILEPARSER *efp)
+{
+ if (efp) {
+ if (efp->buf != NULL) free(efp->buf);
+ free(efp);
+ }
+}
+
+/* Function: esl_fileparser_Close()
+ * Incept: SRE, Tue Apr 3 08:18:11 2007 [Janelia]
+ *
+ * Purpose: Closes an open <ESL_FILEPARSER>, including the
+ * file it opened.
+ */
+void
+esl_fileparser_Close(ESL_FILEPARSER *efp)
+{
+ if (efp == NULL) return;
+
+ if (efp->fp != NULL && efp->fp != stdin) fclose(efp->fp);
+ if (efp->filename != NULL) free(efp->filename);
+ esl_fileparser_Destroy(efp);
+}
+
+
+
+/*****************************************************************
+ * 2. Private functions
+ *****************************************************************/
+
+/* nextline()
+ *
+ * Purpose: Skip the file parser to the next line (for instance,
+ * if an end-of-line comment is found). The new line might
+ * have no tokens on it.
+ *
+ * Args: efp - open file parser
+ *
+ * Returns: eslOK: success
+ * eslEOF: normal end of file
+ *
+ * Throws: <eslEMEM> if a reallocation failed in fgets()
+ *
+ * Xref: STL8 p.56
+ */
+static int
+nextline(ESL_FILEPARSER *efp)
+{
+ int status;
+
+ /* check if we are reading from a file or a buffer */
+ if (efp->is_buffer) {
+ int len;
+ int end;
+ char *ptr;
+
+ if (efp->mem_pos >= efp->mem_size) return eslEOF;
+
+ len = 0;
+ end = efp->mem_size - efp->mem_pos;
+ ptr = efp->mem_buffer + efp->mem_pos;
+ while (len < end && *ptr++ != '\n') ++len;
+ if (len < end) ++len;
+
+ if (len + 1 > efp->buflen) {
+ ESL_REALLOC(efp->buf, ESL_MAX(64, len * 2));
+ efp->buflen = ESL_MAX(64, len * 2);
+ }
+ memcpy(efp->buf, efp->mem_buffer + efp->mem_pos, len);
+ efp->buf[len] = 0;
+
+ efp->mem_pos += len;
+
+ } else {
+ if ((status = esl_fgets(&(efp->buf), &(efp->buflen), efp->fp)) != eslOK)
+ { sprintf(efp->errbuf, "esl_fgets() failed"); return status;}
+ }
+ efp->s = efp->buf;
+ efp->linenumber++;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+
+/*****************************************************************
+ * 3. Unit tests.
+ *****************************************************************/
+#ifdef eslFILEPARSER_TESTDRIVE
+/* test the interface for getting all tokens in a file, regardless
+ * of newlines. Also, uses the Create/Destroy interface instead of
+ * Open/Close.
+ */
+static void
+utest_GetToken(char *filename)
+{
+ int status;
+ ESL_FILEPARSER *efp = NULL;
+ FILE *fp = NULL;
+ char *tok = NULL;
+ int toklen = 0;
+ int ntok = 0;
+
+ if ((fp = fopen(filename, "r")) == NULL) esl_fatal("File open failed");
+ if ((efp = esl_fileparser_Create(fp)) == NULL) esl_fatal("Failed to associate stream with fileparser");
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ while ((status = esl_fileparser_GetToken(efp, &tok, &toklen)) == eslOK)
+ {
+ if (toklen != 6) esl_fatal("bad token %s", tok);
+ if (strncmp(tok, "token", 5) != 0) esl_fatal("bad token %s", tok);
+ ntok++;
+ }
+ if (status != eslEOF) esl_fatal("Abnormal parse termination");
+ if (ntok != 5) esl_fatal("bad total token number %d\n", ntok);
+
+ esl_fileparser_Destroy(efp);
+ fclose(fp);
+ return;
+}
+
+/* test the NextLine and GetTokenOnLine interface, as well as the
+ * Open/Close interface.
+ */
+static void
+utest_GetTokenOnLine(char *filename)
+{
+ int status;
+ ESL_FILEPARSER *efp = NULL;
+ char *tok = NULL;
+ int toklen = 0;
+ int ntok = 0;
+ int nlines = 0;
+ char expect[32];
+
+ if (esl_fileparser_Open(filename, NULL, &efp) != eslOK) esl_fatal("File open failed");
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ while ((status = esl_fileparser_NextLine(efp)) == eslOK)
+ {
+ nlines++;
+ while ((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) == eslOK)
+ {
+ ntok++;
+ sprintf(expect, "token%d", ntok);
+ if (toklen != 6) esl_fatal("bad token length for %s", tok);
+ if (strcmp(expect, tok) != 0) esl_fatal("bad token %s", tok);
+ }
+ if (status != eslEOL) esl_fatal("Unexpected code in place of end-of-line");
+ }
+ if (status != eslEOF) esl_fatal("Unexpected code in place of end-of-file.");
+
+ if (nlines != 3) esl_fatal("expected to parse 3 lines; parsed %d", nlines);
+ if (ntok != 5) esl_fatal("expected to parse 5 tokens; parsed %d", ntok);
+
+ esl_fileparser_Close(efp);
+ return;
+}
+
+static void
+utest_GetTokenBuffered(char *buffer)
+{
+ int status;
+ ESL_FILEPARSER *efp = NULL;
+ char *tok = NULL;
+ int toklen = 0;
+ int ntok = 0;
+
+ if ((efp = esl_fileparser_CreateMapped(buffer, strlen(buffer))) == NULL)
+ esl_fatal("Failed to associate buffer with fileparser");
+
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ while ((status = esl_fileparser_GetToken(efp, &tok, &toklen)) == eslOK)
+ {
+ if (toklen != 6) esl_fatal("bad token %s", tok);
+ if (strncmp(tok, "token", 5) != 0) esl_fatal("bad token %s", tok);
+ ntok++;
+ }
+ if (status != eslEOF) esl_fatal("Abnormal parse termination");
+ if (ntok != 5) esl_fatal("bad total token number %d\n", ntok);
+
+ esl_fileparser_Destroy(efp);
+
+ return;
+}
+
+#endif /*eslFILEPARSER_TESTDRIVE*/
+
+/*****************************************************************
+ * 4. Test driver.
+ *****************************************************************/
+
+/*
+ gcc -g -Wall -I. -o test -DeslFILEPARSER_TESTDRIVE esl_fileparser.c easel.c
+ ./test
+*/
+#ifdef eslFILEPARSER_TESTDRIVE
+#include <stdio.h>
+#include <string.h>
+#include "easel.h"
+#include "esl_fileparser.h"
+
+int
+main(int argc, char **argv)
+{
+ char tmpfile[32] = "esltmpXXXXXX";
+ FILE *fp;
+
+ char stream[] = "# Full line comment\n"
+ "token1 # Trailing comment\n"
+ "\n" /* blank line */
+ " \n" /* whitespace line */
+ " # sowing comment/whitespace confusion...\n"
+ "token2\ttoken3 token4\n"
+ "token5"; /* file ends w/ no \n */
+
+ /* Create a test file to read.
+ */
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal("File open failed");
+ fprintf(fp, "%s", stream);
+ fclose(fp);
+
+ /* Run unit tests using that file.
+ * Unit tests have hardwired knowledge of what's supposed to be in the file.
+ */
+ utest_GetToken(tmpfile);
+ utest_GetTokenOnLine(tmpfile);
+ utest_GetTokenBuffered(stream);
+
+ remove(tmpfile);
+ return 0;
+}
+#endif /*eslFILEPARSER_TESTDRIVE*/
+
+
+/*****************************************************************
+ * 5. Examples.
+ *****************************************************************/
+
+/* The first example shows the simplest interface: get all tokens
+ * in the file, one at a time.
+ *
+ gcc -g -Wall -I. -o example -DeslFILEPARSER_EXAMPLE esl_fileparser.c easel.c
+ ./example <any file>
+ */
+#ifdef eslFILEPARSER_EXAMPLE
+/*::cexcerpt::fileparser_example::begin::*/
+#include <stdio.h>
+#include "easel.h"
+#include "esl_fileparser.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int ntok = 1;
+ ESL_FILEPARSER *efp;
+ char *tok;
+ int toklen;
+
+ if (esl_fileparser_Open(filename, NULL, &efp) != eslOK) esl_fatal("File open failed");
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ while (esl_fileparser_GetToken(efp, &tok, &toklen) == eslOK) {
+ printf("%5d %3d %s\n", ntok, toklen, tok);
+ ntok++;
+ }
+ esl_fileparser_Close(efp);
+ return 0;
+}
+/*::cexcerpt::fileparser_example::end::*/
+#endif /*eslFILEPARSER_EXAMPLE*/
+
+/* The second example shows the more line-oriented interface
+ * of NextLine(), GetTokenOnLine().
+ gcc -g -Wall -I. -o example -DeslFILEPARSER_EXAMPLE2 esl_fileparser.c easel.c
+ ./example <any file>
+ */
+#ifdef eslFILEPARSER_EXAMPLE2
+/*::cexcerpt::fileparser_example2::begin::*/
+#include <stdio.h>
+#include "easel.h"
+#include "esl_fileparser.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int nline = 1;
+ int ntok;
+ ESL_FILEPARSER *efp;
+ char *tok;
+ int toklen;
+
+ if (esl_fileparser_Open(filename, NULL, &efp) != eslOK) esl_fatal("File open failed");
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ while (esl_fileparser_NextLine(efp) == eslOK)
+ {
+ ntok = 0;
+ while (esl_fileparser_GetTokenOnLine(efp, &tok, &toklen) == eslOK)
+ ntok++;
+ printf("Line %d in the file (%d non-blank, non-comment) contains %d tokens...\n",
+ efp->linenumber, nline, ntok);
+ nline++;
+ }
+ esl_fileparser_Close(efp);
+ return 0;
+}
+/*::cexcerpt::fileparser_example2::end::*/
+#endif /*eslFILEPARSER_EXAMPLE*/
+
+
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
diff --git a/esl_fileparser.h b/esl_fileparser.h
new file mode 100644
index 0000000..27b4b91
--- /dev/null
+++ b/esl_fileparser.h
@@ -0,0 +1,41 @@
+/* A simple token-based file parsing system.
+ */
+#ifndef eslFILEPARSER_INCLUDED
+#define eslFILEPARSER_INCLUDED
+
+#include <stdio.h>
+#include "easel.h"
+
+typedef struct {
+ FILE *fp; /* open file pointer, for reading */
+ char *buf; /* current line; will be modified by esl_strtok(). */
+ int buflen; /* current allocated length of buf */
+ char *s; /* used by esl_strtok(); current position in buf. */
+ char commentchar; /* often '#' */
+
+ char *filename; /* name of opened file; or NULL (if just a stream) */
+ int linenumber; /* what line is loaded into buf; 1..nlines */
+ char errbuf[eslERRBUFSIZE]; /* for holding error diagnostics */
+
+ int is_buffer; /* the file has been buffered into memory */
+ char *mem_buffer; /* pointer to the buffered file */
+ int mem_size; /* size of the buffered file */
+ int mem_pos; /* current position in the buffer */
+} ESL_FILEPARSER;
+
+extern int esl_fileparser_Open(const char *filename, const char *envvar, ESL_FILEPARSER **ret_efp);
+extern ESL_FILEPARSER *esl_fileparser_Create(FILE *fp);
+extern ESL_FILEPARSER *esl_fileparser_CreateMapped(void *buffer, int size);
+extern int esl_fileparser_SetCommentChar (ESL_FILEPARSER *efp, char c);
+extern int esl_fileparser_GetToken (ESL_FILEPARSER *efp, char **opt_tok, int *opt_toklen);
+extern int esl_fileparser_NextLine (ESL_FILEPARSER *efp);
+extern int esl_fileparser_NextLinePeeked (ESL_FILEPARSER *efp, char *prefix, int plen);
+extern int esl_fileparser_GetTokenOnLine (ESL_FILEPARSER *efp, char **opt_tok, int *opt_toklen);
+extern int esl_fileparser_GetRemainingLine(ESL_FILEPARSER *efp, char **ret_s);
+extern void esl_fileparser_Destroy (ESL_FILEPARSER *efp);
+extern void esl_fileparser_Close (ESL_FILEPARSER *efp);
+
+#endif /*eslFILEPARSER_INCLUDED */
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_fileparser.tex b/esl_fileparser.tex
new file mode 100644
index 0000000..679bbf3
--- /dev/null
+++ b/esl_fileparser.tex
@@ -0,0 +1,97 @@
+
+The \eslmod{fileparser} module parses simple input text data files
+that consist of whitespace-delimited tokens.
+
+Data files can contain blank lines and comments. Comments are defined
+by a single character; for instance, a \verb+#+ character commonly
+means that everything following the \verb+#+ on the line is a comment.
+
+Two different styles of token input are supported. The simplest style
+reads tokens one at a time, regardless of what line they occur on,
+until the file ends. You can also read in a line-oriented way, in
+which you get one data line at a time, then read all the tokens on
+that line; this style lets you count how many tokens occur on a data
+line, which allows better checking of your input.
+
+The module implements one object, an \ccode{ESL\_FILEPARSER}, that
+holds the open input stream and the state of the parser. The
+functions in the API are summarized in Table~\ref{tbl:fileparser_api}.
+
+\begin{table}[hbp]
+\begin{center}
+{\scriptsize
+\begin{tabular}{|lp{3.5in}|}\hline
+\hyperlink{func:esl_fileparser_Open()}{\ccode{esl\_fileparser\_Open()}}
+& Open a file for parsing.\\
+\hyperlink{func:esl_fileparser_Create()}{\ccode{esl\_fileparser\_Create()}}
+& Associate already open stream with a new parser.\\
+\hyperlink{func:esl_fileparser_SetCommentChar()}{\ccode{esl\_fileparser\_SetCommentChar()}}
+& Set character that defines start of a comment.\\
+\hyperlink{func:esl_fileparser_NextLine()}{\ccode{esl\_fileparser\_NextLine()}}
+& Advance the parser to next line containing a token.\\
+\hyperlink{func:esl_fileparser_GetToken()}{\ccode{esl\_fileparser\_GetToken()}}
+& Get the next token in the file.\\
+\hyperlink{func:esl_fileparser_GetTokenOnLine()}{\ccode{esl\_fileparser\_GetTokenOnLine()}}
+& Get the next token on the current line.\\
+\hyperlink{func:esl_fileparser_Destroy()}{\ccode{esl\_fileparser\_Destroy()}}
+& Deallocate a parser that was \ccode{Create()}'d.\\
+\hyperlink{func:esl_fileparser_Close()}{\ccode{esl\_fileparser\_Close()}}
+& Close a parser that was \ccode{Open()}'d.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{fileparser} API.}
+\label{tbl:fileparser_api}
+\end{table}
+
+\subsection{Example of using the fileparser API}
+
+An example that opens a file, reads all its tokens one at a time, and
+prints out token number, token length, and the token itself:
+
+\input{cexcerpts/fileparser_example}
+
+A single character can be defined to serve as a comment character
+(often \ccode{\#}), using the \ccode{esl\_fileparser\_SetCommentChar()}
+call. The parser will ignore the comment character, and the remainder
+of any line following a comment character.
+
+Each call to \ccode{esl\_fileparser\_GetToken()} retrieves one
+whitespace-delimited token from the input stream; the call returns
+\ccode{eslOK} if a token is parsed, and \ccode{eslEOF} when there are
+no more tokens in the file. Whitespace is defined as space, tab,
+newline, or carriage return (\verb+" \t\n\r"+).
+
+When the caller is done, the fileparser is closed with
+\ccode{esl\_fileparser\_Close()}.
+
+\subsection{A second example: line-oriented parsing}
+
+The \ccode{esl\_fileparser\_GetToken()} call provides a simple style
+of parsing a file: read one token at a time until the file ends,
+regardless of what line the tokens are on. However, you may want to
+know how many tokens are on a given data line, either because you know
+how many there should be (and you want to verify) or because you don't
+(and you need to allocate some variable-size data structure
+appropriately). The following is an example that reads a file line by
+line:
+
+\input{cexcerpts/fileparser_example2}
+
+The output from this example is, for each data line, the actual line
+number (starting from 1), the data line number (a count that excludes
+comments and blank lines), and the number of tokens on the line.
+
+Note the use of \ccode{efp->linenumber} to obtain the current line in
+the file. You can use this to produce informative error messages. If
+a token is not what you expected, you probably want to provide some
+diagnostic output to the user, and \ccode{efp->linenumber} lets you
+direct the user to the line that the failure occurred at.
+
+
+
+
+
+
+
diff --git a/esl_gamma.c b/esl_gamma.c
new file mode 100644
index 0000000..76f260c
--- /dev/null
+++ b/esl_gamma.c
@@ -0,0 +1,839 @@
+/* Statistical routines for gamma distributions.
+ *
+ * Contents:
+ * 1. Routines for evaluating densities and distributions
+ * 2. Generic API routines: for general interface w/ histogram module
+ * 3. Dumping plots for files
+ * 4. Sampling (requires augmentation w/ random module)
+ * 5. ML fitting to complete data
+ * 6. Test driver
+ * 7. Example
+ * 8. Copyright and license information
+ *
+ * Xref: STL10/65
+ *
+ * To do:
+ * - Fit*() functions should return eslEINVAL on n=0, eslENORESULT
+ * on failure due to small n. Compare esl_gumbel. xref J12/93.
+ * SRE, Wed Nov 27 11:18:19 2013
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include "easel.h"
+#include "esl_stats.h"
+#include "esl_gamma.h"
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#ifdef eslAUGMENT_HISTOGRAM
+#include "esl_histogram.h"
+#endif
+
+static int tau_by_moments(double *x, int n, double mu, double *ret_tau,
+ double *ret_mean, double *ret_logsum);
+static int tau_by_moments_binned(ESL_HISTOGRAM *g, double mu, double *ret_tau,
+ double *ret_mean, double *ret_logsum);
+static double tau_function(double tau, double mean, double logsum);
+
+
+/****************************************************************************
+ * 1. Routines for evaluating densities and distributions
+ ****************************************************************************/
+
+/* Function: esl_gam_pdf()
+ *
+ * Purpose: Calculates the gamma PDF $P(X=x)$ given value <x>,
+ * location parameter <mu>, scale parameter <lambda>, and shape
+ * parameter <tau>.
+ */
+double
+esl_gam_pdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x - mu);
+ double gamtau;
+ double val;
+
+ if (y < 0.) return 0.;
+
+ esl_stats_LogGamma(tau, &gamtau);
+ val = ((tau*log(lambda) + (tau-1.)*log(x-mu)) - gamtau) - y;
+ return exp(val);
+}
+
+/* Function: esl_gam_logpdf()
+ *
+ * Purpose: Calculates log of the probability density function
+ * for the gamma, $\log P(X=x)$, given value <x>,
+ * location parameter <mu>, scale parameter <lambda>, and
+ * shape parameter <tau>.
+ */
+double
+esl_gam_logpdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x - mu);
+ double gamtau;
+ double val;
+
+ if (x < 0.) return -eslINFINITY;
+
+ esl_stats_LogGamma(tau, &gamtau);
+ val = ((tau*log(lambda) + (tau-1.)*log(x-mu)) - gamtau) - y;
+ return val;
+}
+
+/* Function: esl_gam_cdf()
+ *
+ * Purpose: Calculates the cumulative distribution function
+ * for the gamma, $P(X \leq x)$, given value <x>,
+ * location parameter <mu>, scale parameter <lambda>, and
+ * shape parameter <tau>.
+ *
+ * (For $\mu=0$, $\lambda = 1$, this is the
+ * incomplete Gamma function $P(\tau,x)$.)
+ */
+double
+esl_gam_cdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x - mu);
+ double val;
+
+ if (y <= 0.) return 0.;
+
+ esl_stats_IncompleteGamma(tau, y, &val, NULL);
+ return val;
+}
+
+/* Function: esl_gam_logcdf()
+ *
+ * Purpose: Calculates the log of the cumulative distribution function
+ * for the gamma, $\log P(X \leq x)$, given value <x>, location
+ * parameter <mu>, scale parameter <lambda>, and shape
+ * parameter <tau>.
+ */
+double
+esl_gam_logcdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x - mu);
+ double val;
+
+ if (y <= 0.) return -eslINFINITY;
+
+ esl_stats_IncompleteGamma(tau, y, &val, NULL);
+ return log(val);
+}
+
+/* Function: esl_gam_surv()
+ *
+ * Purpose: Calculates the survival function for the gamma, $P(X > x)$,
+ * given value <x>, location parameter <mu>, scale parameter
+ * <lambda>, and shape parameter <tau>.
+ */
+double
+esl_gam_surv(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x - mu);
+ double val;
+
+ if (y <= 0.) return 1.0;
+
+ esl_stats_IncompleteGamma(tau, y, NULL, &val);
+ return val;
+}
+
+
+/* Function: esl_gam_logsurv()
+ *
+ * Purpose: Calculates the log of the survival function for the gamma,
+ * $\log P(X > x)$, given value <x>, location parameter <mu>,
+ * scale parameter <lambda>, and shape parameter <tau>.
+ *
+ * Relies on <esl_stats_IncompleteGamma()>, which has limited
+ * dynamic range. Any result of < -700 or so will be -infinity.
+ * To fix this, we need a log version of <esl_stats_IncompleteGamma()>.
+ */
+double
+esl_gam_logsurv(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x - mu);
+ double val;
+
+ if (y <= 0.) return 0.;
+
+ esl_stats_IncompleteGamma(tau, y, NULL, &val);
+ return log(val);
+}
+
+
+/* Function: esl_gam_invcdf()
+ *
+ * Purpose: Calculates the inverse CDF for a gamma with location
+ * parameter <mu>, scale parameter <lambda> and shape
+ * parameter <tau>, returning the value <x> at which the
+ * CDF is <p>.
+ *
+ * This inverse CDF is solved by a computationally expensive,
+ * brute force bisection search on the CDF of <x>.
+ */
+double
+esl_gam_invcdf(double p, double mu, double lambda, double tau)
+{
+ double x1, x2, xm; /* low, high guesses at x */
+ double f2, fm;
+ double tol = 1e-6;
+
+ x1 = 0.;
+ x2 = tau / lambda;
+ do { /* bracket */
+ x2 = x2*2.;
+ f2 = esl_gam_cdf(x2, mu, lambda, tau);
+ } while (f2 < p);
+
+ do { /* bisection */
+ xm = (x1+x2)/ 2.;
+ fm = esl_gam_cdf(xm, mu, lambda, tau);
+
+ if (fm > p) x2 = xm;
+ else if (fm < p) x1 = xm;
+ else return xm; /* unlikely exact fm==p */
+ } while ( (x2-x1)/(x1+x2) > tol);
+
+ xm = (x1+x2)/2.;
+ return xm;
+}
+/*-------------------- end densities & distributions ------------------------*/
+
+
+
+
+/****************************************************************************
+ * 2. Generic API routines: for general interface w/ histogram module
+ ****************************************************************************/
+
+/* Function: esl_gam_generic_pdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_gam_pdf()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_gam_generic_pdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_gam_pdf(x, p[0], p[1], p[2]);
+}
+
+
+/* Function: esl_gam_generic_cdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_gam_cdf()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_gam_generic_cdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_gam_cdf(x, p[0], p[1], p[2]);
+}
+
+
+/* Function: esl_gam_generic_surv()
+ *
+ * Purpose: Generic-API wrapper around <esl_gam_surv()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_gam_generic_surv(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_gam_surv(x, p[0], p[1], p[2]);
+}
+
+
+/* Function: esl_gam_generic_invcdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_gam_invcdf()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_gam_generic_invcdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_gam_invcdf(x, p[0], p[1], p[2]);
+}
+/*------------------------ end generic API ---------------------------------*/
+
+
+
+/****************************************************************************
+ * 3. Dumping plots for files
+ ****************************************************************************/
+
+/* Function: esl_gam_Plot()
+ *
+ * Purpose: Plot some gamma distribution function <func> (for instance,
+ * <esl_gam_pdf()>) for parameters <mu>, <lambda>, and <tau>, for
+ * a range of values x from <xmin> to <xmax> in steps of <xstep>;
+ * output to an open stream <fp> in xmgrace XY input format.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error, such as a filled disk.
+ */
+int
+esl_gam_Plot(FILE *fp, double mu, double lambda, double tau,
+ double (*func)(double x, double mu, double lambda, double tau),
+ double xmin, double xmax, double xstep)
+{
+ double x;
+ for (x = xmin; x <= xmax; x += xstep)
+ if (fprintf(fp, "%f\t%g\n", x, (*func)(x, mu, lambda, tau)) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "gamma plot write failed");
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "gamma plot write failed");
+ return eslOK;
+}
+/*-------------------- end plot dumping routines ---------------------------*/
+
+
+/****************************************************************************
+ * 4. Sampling (requires augmentation w/ random module)
+ ****************************************************************************/
+#ifdef eslAUGMENT_RANDOM
+/* Function: esl_gam_Sample()
+ *
+ * Purpose: Sample a gamma-distributed random variate.
+ */
+double
+esl_gam_Sample(ESL_RANDOMNESS *r, double mu, double lambda, double tau)
+{
+ double x;
+
+ x = esl_rnd_Gamma(r, tau);
+ return (mu + x / lambda);
+}
+#endif /*eslAUGMENT_RANDOM*/
+/*--------------------------- end sampling ---------------------------------*/
+
+
+
+/****************************************************************************
+ * 5. ML fitting to complete data
+ ****************************************************************************/
+
+/* Function: esl_gam_FitComplete()
+ *
+ * Purpose: Given complete data consisting of <n> samples <x[0]..x[n-1]>,
+ * and a known location parameter <mu>, determine and return
+ * maximum likelihood parameters <ret_lambda> and <ret_tau>.
+ *
+ * Args: x - complete gamma-distributed data [0..n-1]
+ * n - number of samples in <x>
+ * mu - known location parameter
+ * ret_lambda - RETURN: ML estimate of lambda
+ * ret_tau - RETURN: ML estimate of tau
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslENOHALT> if bracketing or bisection fails;
+ * <eslEINVAL> if data cannot be gamma distributed (some <x[i] < mu>,
+ * or zero variance in x).
+ *
+ * Xref: STL10/65.
+ */
+int
+esl_gam_FitComplete(double *x, int n, double mu, double *ret_lambda, double *ret_tau)
+{
+ double mean, logsum;
+ int i;
+ double c, fc;
+ double a, fa;
+ double b, fb;
+ int status;
+
+ if ((status = tau_by_moments(x, n, mu, &c, &mean, &logsum) != eslOK)) goto ERROR;
+ a = b = c;
+ fc = tau_function(c, mean, logsum);
+
+ /* Rootfinding, 1.: bracketing the root with points a,b.
+ */
+ if (fc > 0.) /* fx>0 means tau is too small, search right */
+ {
+ for (i = 0; i < 100; i++) /* 100 = max iterations */
+ {
+ b = a * 2.;
+ fb = tau_function(b, mean, logsum);
+ if (fb < 0.) break; /* a,b now bracket */
+ a = b; /* else fb>0, so b is a better left bracket than a */
+ }
+ if (i == 100) ESL_XEXCEPTION(eslENOHALT, "failed to bracket");
+ }
+ else if (fc < 0.) /* fx<0 means tau is too large, search left */
+ {
+ for (i = 0; i < 100; i++)
+ {
+ a = b/2.;
+ fa = tau_function(a, mean, logsum);
+ if (fa > 0.) break; /* a,b now bracket */
+ b = a; /* else fa<0, so a is a better right bracket than b */
+ }
+ if (i == 100) ESL_XEXCEPTION(eslENOHALT, "failed to bracket");
+ }
+
+ /* Rootfinding, 2.: Bisection search.
+ * We have the root in interval (a,b).
+ */
+ for (i = 0; i < 100; i++)
+ {
+ c = (a+b)/2.; /* bisection */
+ fc = tau_function(c, mean, logsum);
+ if (fc > 0.) a = c;
+ else if (fc < 0.) b = c;
+ else break; /* unlikely event that we nail it */
+
+ if ((b-a) <= 2.* DBL_EPSILON) {
+ c = (a+b)/2.;
+ break;
+ }
+ }
+ if (i == 100) ESL_XEXCEPTION(eslENOHALT, "bisection search failed");
+
+ *ret_lambda = c / mean;
+ *ret_tau = c;
+ return eslOK;
+
+
+ ERROR:
+ *ret_lambda = 0.0;
+ *ret_tau = 0.0;
+ return status;
+}
+
+/* tau_by_moments()
+ *
+ * Obtain an initial estimate for tau by
+ * matching moments. Also returns mean and
+ * logsum, which we need for ML fitting.
+ * To obtain a lambda estimate, use
+ * lambda = tau / mean.
+ */
+static int
+tau_by_moments(double *x, int n, double mu, double *ret_tau, double *ret_mean, double *ret_logsum)
+{
+ int i;
+ double mean, var, logsum;
+
+ mean = var = logsum = 0.;
+ for (i = 0; i < n; i++)
+ {
+ if (x[i] < mu) ESL_EXCEPTION(eslEINVAL, "No x[i] can be < mu in gamma data");
+ mean += x[i] - mu; /* mean is temporarily just the sum */
+ logsum += log(x[i] - mu);
+ var += (x[i]-mu)*(x[i]-mu); /* var is temporarily the sum of squares */
+ }
+ var = (var - mean*mean/(double)n) / ((double)n-1); /* now var is the variance */
+ mean /= (double) n; /* and now mean is the mean */
+ logsum /= (double) n;
+
+ if (var == 0.) /* and if mean = 0, var = 0 anyway. */
+ ESL_EXCEPTION(eslEINVAL, "Zero variance in allegedly gamma-distributed dataset");
+
+ if (ret_tau != NULL) *ret_tau = mean * mean / var;
+ if (ret_mean != NULL) *ret_mean = mean;
+ if (ret_logsum != NULL) *ret_logsum = logsum;
+ return eslOK;
+}
+
+
+/* tau_function()
+ *
+ * This is the rootfinding equation for tau...
+ * \ref{eqn:gamma_tau_root} in the documentation.
+ * mean is 1/N \sum (x_i - \mu)
+ * logsum is 1/N \sum \log (x_i - \mu)
+ * These are both independent of tau, and dependent
+ * on all data points, so we require the caller to
+ * precalculate them for us.
+ *
+ * This is a decreasing function of tau:
+ * the return value is > 0 when tau is too small,
+ * and < 0 when tau is too large.
+ */
+static double
+tau_function(double tau, double mean, double logsum)
+{
+ double psitau;
+
+ esl_stats_Psi(tau, &psitau);
+ return ( ((log(tau) - psitau) - log(mean)) + logsum );
+}
+
+#ifdef eslAUGMENT_HISTOGRAM
+/* Function: esl_gam_FitCompleteBinned()
+ *
+ * Purpose: Fit a complete exponential distribution to the observed
+ * binned data in a histogram <g>, where each
+ * bin i holds some number of observed samples x with values from
+ * lower bound l to upper bound u (that is, $l < x \leq u$);
+ * determine and return maximum likelihood estimates for the
+ * parameters $\mu, \lambda, \tau$ and
+ * return them in <*ret_mu>, <*ret_lambda>, <*ret_tau>.
+ *
+ * Unlike the <esl_exp_FitCompleteBinned()> case where the
+ * ML fit optimizes $\sum_i n_i \log P(a_i \leq x < b_i)$
+ * where $a_i \leq b_i$ are the bounds of bin i with
+ * occupancy $n_i$, here we take the approximation that
+ * $c_i = a_i + 0.5*(b_i-a_i)$ and optimize $\log P(a_i
+ * \leq x < b_i) \simeq \log(w) + \log P(x=c_i)$.
+ *
+ * Since $b_i-a_i = w$ is fixed, optimizing the above
+ * becomes equivalent to optimizing $\sum_i n_i * log P(x=c_i)$.
+ *
+ * The optimization is then equivalent to the non-binned case,
+ * but subsituting in averages such as $\sum_i x(i)$ by
+ * $\sum_i n_i*c_i i$, and so forth.
+ *
+ * If the binned data in <g> were set to focus on
+ * a tail by virtual censoring, the "complete" exponential is
+ * fitted to this tail. The caller then also needs to
+ * remember what fraction of the probability mass was in this
+ * tail.
+ *
+ * Args: g - histogram
+ * ret_mu - RETURN: given by the histogram
+ * ret_lambda - RETURN: ML estimate of lambda
+ * ret_tau - RETURN: ML estimate of tau
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslENOHALT> if bracketing or bisection fails;
+ * <eslEINVAL> if data cannot be gamma distributed (some <x[i] < mu>,
+ * or zero variance in x).
+ *
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if dataset is true-censored.
+ */
+int
+esl_gam_FitCompleteBinned(ESL_HISTOGRAM *g, double *ret_mu, double *ret_lambda, double *ret_tau)
+{
+ double mu = 0.;
+ double mean, logsum;
+ int i;
+ double c, fc;
+ double a, fa;
+ double b, fb;
+ double tol = 1e-6;
+ int maxit = 100;
+ int status;
+
+ if (g->dataset_is == COMPLETE)
+ {
+ if (g->is_rounded) mu = esl_histogram_Bin2LBound(g, g->imin);
+ else mu = g->xmin;
+ }
+ else if (g->dataset_is == VIRTUAL_CENSORED) /* i.e., we'll fit to tail */
+ mu = g->phi;
+ else if (g->dataset_is == TRUE_CENSORED)
+ ESL_EXCEPTION(eslEINVAL, "can't fit true censored dataset");
+
+ if ((status = tau_by_moments_binned(g, mu, &c, &mean, &logsum) != eslOK)) goto ERROR;
+ a = b = c;
+ if (c == 1.0) {
+ *ret_mu = mu;
+ *ret_lambda = c / mean;
+ *ret_tau = c;
+ return eslOK;
+ }
+ fc = tau_function(c, mean, logsum);
+
+ /* Rootfinding, 1.: bracketing the root with points a,b.
+ */
+ if (fc > 0.) /* fx>0 means tau is too small, search right */
+ {
+ for (i = 0; i < maxit; i++) /* max iterations */
+ {
+ b = a * 2.;
+ fb = tau_function(b, mean, logsum);
+
+ if (fb < 0.) break; /* a,b now bracket */
+ a = b; /* else fb>0, so b is a better left bracket than a */
+ }
+ if (i == maxit) ESL_XEXCEPTION(eslENOHALT, "failed to bracket");
+ }
+ else if (fc < 0.) /* fx<0 means tau is too large, search left */
+ {
+ for (i = 0; i < maxit; i++)
+ {
+ a = b/2.;
+ fa = tau_function(a, mean, logsum);
+ if (fa > 0.) break; /* a,b now bracket */
+ b = a; /* else fa<0, so a is a better right bracket than b */
+ }
+ if (i == maxit) ESL_XEXCEPTION(eslENOHALT, "failed to bracket");
+ }
+
+ /* Rootfinding, 2.: Bisection search.
+ * We have the root in interval (a,b).
+ */
+ for (i = 0; i < maxit; i++)
+ {
+ c = (a+b)/2.; /* bisection */
+ fc = tau_function(c, mean, logsum);
+
+ if (fc > 0.) a = c;
+ else if (fc < 0.) b = c;
+ else break; /* unlikely event that we nail it */
+
+ if ((b-a) <= tol) {
+ c = (a+b)/2.;
+ break;
+ }
+ }
+ if (i == maxit) ESL_XEXCEPTION(eslENOHALT, "bisection search failed");
+
+ *ret_mu = mu;
+ *ret_lambda = (mean > 0.)? c / mean : 0.0;
+ *ret_tau = c;
+ return eslOK;
+
+ ERROR:
+ *ret_mu = 0.;
+ *ret_lambda = 0.;
+ *ret_tau = 0.;
+ return status;
+}
+
+/* tau_by_moments_binned()
+ *
+ * similar to tau_by_moments()
+ * where mean=\sum_i x_i now becomes mean=\sum_i n(i)*ci, ...
+ *
+ * note: the whole method relies on the property log(sum) >= logsum;
+ * which works if all points are valide, that is positive;
+ * log(0) = -inf is not a valid point,
+ * and the inequality (Jensen's inequality) does not hold.
+ */
+static int
+tau_by_moments_binned(ESL_HISTOGRAM *g, double mu, double *ret_tau, double *ret_mean, double *ret_logsum)
+{
+ int i;
+ double ai, bi, ci;
+ double sum, mean, var, logsum;
+ double tol = 1e-6;
+
+ sum = mean = var = logsum = 0.;
+ for (i = g->cmin+1; i <= g->imax; i++) /* for each occupied bin */
+ {
+ if (g->obs[i] == 0) continue;
+ ai = esl_histogram_Bin2LBound(g,i);
+ bi = esl_histogram_Bin2UBound(g,i);
+ ci = ai + 0.5 * (bi-ai);
+
+ if (ci < mu) ESL_EXCEPTION(eslEINVAL, "No point can be < mu in gamma data");
+ sum += (double)g->obs[i];
+ mean += (double)g->obs[i] * (ci-mu); /* mean is temporarily just the sum */
+ logsum += (ci>mu)? (double)g->obs[i] * log(ci-mu):0.0;
+ var += (double)g->obs[i] * (ci-mu) * (ci-mu); /* var is temporarily the sum of squares */
+ }
+
+ var = (sum > 1.)? (var - mean*mean/sum) / (sum-1.) : 0.0; /* now var is the variance */
+ mean /= (sum > 0.)? sum : 1.; /* and now mean is the mean */
+ logsum /= (sum > 0.)? sum : 1.;
+
+ if (ret_tau != NULL) *ret_tau = (var < tol || mean == 0.)? 1. : mean * mean / var;
+ if (ret_mean != NULL) *ret_mean = mean;
+ if (ret_logsum != NULL) *ret_logsum = logsum;
+ return eslOK;
+}
+
+
+#endif /*eslAUGMENT_HISTOGRAM*/
+
+
+/****************************************************************************
+ * 6. Test driver
+ ****************************************************************************/
+#ifdef eslGAMMA_TESTDRIVE
+/* Compile:
+ gcc -g -Wall -I. -I ~/src/easel -L ~/src/easel -o test -DeslGAMMA_TESTDRIVE\
+ esl_gamma.c -leasel -lm
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_gamma.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_HISTOGRAM *h;
+ ESL_RANDOMNESS *r;
+ double mu = -5.0;
+ double lambda = 2.0;
+ double tau = 0.7;
+ int n = 10000;
+ double binwidth = 0.0001;
+ double emu, elambda, etau;
+ int i;
+ double x;
+ double *data;
+ int ndata;
+
+ int opti;
+ int be_verbose = FALSE;
+ char *plotfile = NULL;
+ FILE *pfp = stdout;
+ int plot_pdf = FALSE;
+ int plot_logpdf = FALSE;
+ int plot_cdf = FALSE;
+ int plot_logcdf = FALSE;
+ int plot_surv = FALSE;
+ int plot_logsurv = FALSE;
+ int xmin_set = FALSE;
+ double xmin;
+ int xmax_set = FALSE;
+ double xmax;
+ int xstep_set = FALSE;
+ double xstep;
+
+ for (opti = 1; opti < argc && *(argv[opti]) == '-'; opti++)
+ {
+ if (strcmp(argv[opti], "-m") == 0) mu = atof(argv[++opti]);
+ else if (strcmp(argv[opti], "-l") == 0) lambda = atof(argv[++opti]);
+ else if (strcmp(argv[opti], "-n") == 0) n = atoi(argv[++opti]);
+ else if (strcmp(argv[opti], "-o") == 0) plotfile = argv[++opti];
+ else if (strcmp(argv[opti], "-t") == 0) tau = atof(argv[++opti]);
+ else if (strcmp(argv[opti], "-v") == 0) be_verbose = TRUE;
+ else if (strcmp(argv[opti], "-w") == 0) binwidth = atof(argv[++opti]);
+ else if (strcmp(argv[opti], "-C") == 0) plot_cdf = TRUE;
+ else if (strcmp(argv[opti], "-LC") == 0) plot_logcdf = TRUE;
+ else if (strcmp(argv[opti], "-P") == 0) plot_pdf = TRUE;
+ else if (strcmp(argv[opti], "-LP") == 0) plot_logpdf = TRUE;
+ else if (strcmp(argv[opti], "-S") == 0) plot_surv = TRUE;
+ else if (strcmp(argv[opti], "-LS") == 0) plot_logsurv = TRUE;
+ else if (strcmp(argv[opti], "-XL") == 0) { xmin_set = TRUE; xmin = atof(argv[++opti]); }
+ else if (strcmp(argv[opti], "-XH") == 0) { xmax_set = TRUE; xmax = atof(argv[++opti]); }
+ else if (strcmp(argv[opti], "-XS") == 0) { xstep_set = TRUE; xstep = atof(argv[++opti]); }
+ else esl_fatal("bad option");
+ }
+
+ if (be_verbose)
+ printf("Parametric: mu = %f lambda = %f tau = %f\n", mu, lambda, tau);
+
+ r = esl_randomness_Create(0);
+ h = esl_histogram_CreateFull(mu, 100., binwidth);
+ if (plotfile != NULL) {
+ if ((pfp = fopen(plotfile, "w")) == NULL) esl_fatal("Failed to open plotfile");
+ }
+ if (! xmin_set) xmin = mu;
+ if (! xmax_set) xmax = mu+40*(1./lambda);
+ if (! xstep_set) xstep = 0.1;
+
+ for (i = 0; i < n; i++)
+ {
+ x = esl_gam_Sample(r, mu, lambda, tau);
+ esl_histogram_Add(h, x);
+ }
+ esl_histogram_GetData(h, &data, &ndata);
+
+ esl_gam_FitComplete(data, ndata, mu, &elambda, &etau);
+ if (be_verbose)
+ printf("Complete data fit: mu = %f lambda = %f tau = %f\n", mu, elambda, etau);
+ if (fabs( (elambda-lambda)/lambda ) > 0.10) esl_fatal("Error in (complete) fitted lambda > 10%%\n");
+ if (fabs( (etau-tau)/tau ) > 0.10) esl_fatal("Error in (complete) fitted tau > 10%%\n");
+
+ esl_gam_FitCompleteBinned(h, &emu, &elambda, &etau);
+ if (be_verbose) printf("Binned data fit: mu = %f lambda = %f tau = %f\n", emu, elambda, etau);
+ if (fabs( (emu-mu)/mu ) > 0.01) esl_fatal("Error in (binned) fitted mu > 1%%\n");
+ if (fabs( (elambda-lambda)/lambda ) > 0.10) esl_fatal("Error in (binned) fitted lambda > 10%%\n");
+ if (fabs( (etau-tau)/tau ) > 0.10) esl_fatal("Error in (binned) fitted tau > 10%%\n");
+
+ if (plot_pdf) esl_gam_Plot(pfp, mu, lambda, tau, &esl_gam_pdf, xmin, xmax, xstep);
+ if (plot_logpdf) esl_gam_Plot(pfp, mu, lambda, tau, &esl_gam_logpdf, xmin, xmax, xstep);
+ if (plot_cdf) esl_gam_Plot(pfp, mu, lambda, tau, &esl_gam_cdf, xmin, xmax, xstep);
+ if (plot_logcdf) esl_gam_Plot(pfp, mu, lambda, tau, &esl_gam_logcdf, xmin, xmax, xstep);
+ if (plot_surv) esl_gam_Plot(pfp, mu, lambda, tau, &esl_gam_surv, xmin, xmax, xstep);
+ if (plot_logsurv) esl_gam_Plot(pfp, mu, lambda, tau, &esl_gam_logsurv, xmin, xmax, xstep);
+
+ if (plotfile != NULL) fclose(pfp);
+
+ esl_randomness_Destroy(r);
+ esl_histogram_Destroy(h);
+ return 0;
+}
+#endif /*eslGAMMA_TESTDRIVE*/
+
+/****************************************************************************
+ * Example main()
+ ****************************************************************************/
+#ifdef eslGAMMA_EXAMPLE
+/*::cexcerpt::gam_example::begin::*/
+/* compile:
+ gcc -g -Wall -I. -o example -DeslGAMMA_EXAMPLE\
+ -DeslAUGMENT_RANDOM -DeslAUGMENT_HISTOGRAM\
+ esl_gamma.c esl_random.c esl_histogram.c esl_stats.c easel.c -lm
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_gamma.h"
+
+int
+main(int argc, char **argv)
+{
+ double mu = -5.0;
+ double lambda = 2.0;
+ double tau = 0.7;
+ ESL_HISTOGRAM *h = esl_histogram_CreateFull(mu, 100., 0.1);
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ int n = 10000;
+ double elam, etau;
+ int i;
+ double x;
+ double *data;
+ int ndata;
+
+ /* Take <n> gamma-distributed random samples. */
+ for (i = 0; i < n; i++)
+ {
+ x = esl_gam_Sample(r, mu, lambda, tau);
+ esl_histogram_Add(h, x);
+ }
+ esl_histogram_GetData(h, &data, &ndata);
+
+ /* Plot the empirical (sampled) and expected survivals */
+ esl_histogram_PlotSurvival(stdout, h);
+ esl_gam_Plot(stdout, mu, lambda, tau,
+ &esl_gam_surv, h->xmin, h->xmax, 0.1);
+
+ /* ML fit to complete data, and plot fitted survival curve */
+ esl_gam_FitComplete(data, ndata, mu, &elam, &etau);
+ esl_gam_Plot(stdout, mu, elam, etau,
+ &esl_gam_surv, h->xmin, h->xmax, 0.1);
+
+ esl_randomness_Destroy(r);
+ esl_histogram_Destroy(h);
+ return 0;
+}
+/*::cexcerpt::gam_example::end::*/
+#endif /*eslGAMMA_EXAMPLE*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_gamma.h b/esl_gamma.h
new file mode 100644
index 0000000..96585d0
--- /dev/null
+++ b/esl_gamma.h
@@ -0,0 +1,48 @@
+/* Gamma distributions.
+ *
+ * SRE, Wed Nov 16 19:15:33 2005 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslGAMMA_INCLUDED
+#define eslGAMMA_INCLUDED
+
+#ifdef eslAUGMENT_RANDOM
+#include <esl_random.h>
+#endif
+#ifdef eslAUGMENT_HISTOGRAM
+#include "esl_histogram.h"
+#endif
+
+
+double esl_gam_pdf (double x, double mu, double lambda, double tau);
+double esl_gam_logpdf (double x, double mu, double lambda, double tau);
+double esl_gam_cdf (double x, double mu, double lambda, double tau);
+double esl_gam_logcdf (double x, double mu, double lambda, double tau);
+double esl_gam_surv (double x, double mu, double lambda, double tau);
+double esl_gam_logsurv(double x, double mu, double lambda, double tau);
+double esl_gam_invcdf (double p, double mu, double lambda, double tau);
+
+double esl_gam_generic_pdf (double x, void *params);
+double esl_gam_generic_cdf (double x, void *params);
+double esl_gam_generic_surv (double x, void *params);
+double esl_gam_generic_invcdf(double x, void *params);
+
+extern int esl_gam_Plot(FILE *fp, double mu, double lambda, double tau,
+ double (*func)(double x, double mu, double lambda, double tau),
+ double xmin, double xmax, double xstep);
+
+#ifdef eslAUGMENT_RANDOM
+extern double esl_gam_Sample(ESL_RANDOMNESS *r, double mu, double lambda, double tau);
+#endif
+
+extern int esl_gam_FitComplete(double *x, int n, double mu, double *ret_lambda, double *ret_tau);
+
+#ifdef eslAUGMENT_HISTOGRAM
+extern int esl_gam_FitCompleteBinned(ESL_HISTOGRAM *h, double *ret_mu, double *ret_lambda, double *ret_tau);
+#endif
+
+#endif /*eslGAMMA_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_gamma.tex b/esl_gamma.tex
new file mode 100644
index 0000000..8990000
--- /dev/null
+++ b/esl_gamma.tex
@@ -0,0 +1,53 @@
+
+\begin{tabular}{lcll}\hline
+Variate & $x$ & \ccode{double} & $\mu \leq x < \infty$ \\
+Location & $\mu$ & \ccode{double} & $-\infty < \mu < \infty$\\
+Scale & $\lambda$ & \ccode{double} & $\lambda > 0$ \\
+Shape & $\tau$ & \ccode{double} & $\tau > 0$ \\ \hline
+\end{tabular}
+
+The probability density function (PDF) is:
+
+\begin{equation}
+P(X=x) = \frac{\lambda^{\tau}}{\Gamma(\tau)} (x-\mu)^{\tau-1} e^{-\lambda (x - \mu)}
+\label{eqn:gamma_pdf}
+\end{equation}
+
+The cumulative distribution function (CDF) does not have an analytical
+expression. It is calculated numerically, using the incomplete Gamma
+function (\ccode{esl\_stats\_IncompleteGamma()}).
+
+The ``standard Gamma distribution'' has $\mu = 0$, $\lambda = 1$.
+
+\subsection{Sampling}
+
+
+
+\subsection{Parameter estimation}
+
+\subsubsection{Complete data; known location}
+
+We usually know the location $\mu$. It is often 0, or in the case of
+fitting a gamma density to a right tail, we know the threshold $\mu$
+at which we truncated the tail.
+
+Given a complete dataset of $N$ observed samples $x_i$ ($i=1..N$) and
+a \emph{known} location parameter $\mu$, maximum likelihood estimation
+of $\lambda$ and $\tau$ is performed by first solving this rootfinding
+equation for $\hat{\tau}$ by binary search:
+
+\begin{equation}
+ \log \hat{\tau}
+ - \Psi(\hat{\tau})
+ - \log \left[ \frac{1}{N} \sum_{i=1}^{N} (x_i - \mu) \right]
+ + \frac{1}{N} \sum_{i=1}^N \log (x_i - \mu)
+\label{eqn:gamma_tau_root}
+\end{equation}
+
+then using that to obtain $\hat{\lambda}$:
+
+\begin{equation}
+\hat{\lambda} = \frac{N \hat{\tau}} {\sum_{i=1}^{N} (x_i - \mu)}
+\end{equation}
+
+Equation~\ref{eqn:gamma_tau_root} decreases as $\tau$ increases.
diff --git a/esl_gencode.c b/esl_gencode.c
new file mode 100644
index 0000000..926780e
--- /dev/null
+++ b/esl_gencode.c
@@ -0,0 +1,1182 @@
+/* Genetic code tables for translation, whether canonical or noncanonical.
+ *
+ * Table of contents:
+ * 1. NCBI genetic code tables, in Easel digital form
+ * 2. ESL_GENCODE genetic code object
+ * 3. Reading and writing genetic codes in NCBI format
+ * 4. DNA->protein digital translation, allowing ambiguity chars
+ * 5. Functions fo/////ting/destroying ESL_TRANS_WORKSTATE
+ * 6. Functions for processing ORFs
+ * 7. Debugging/development utilities
+ * 8. Unit tests
+ * 9. Test driver
+ * 10. Examples
+ * 11. Copyright and license
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_fileparser.h"
+#include "esl_regexp.h"
+#include "esl_gencode.h"
+
+
+/*****************************************************************
+ * 1. NCBI genetic code tables, in Easel digital form
+ *****************************************************************/
+
+/*
+ * From: http://www.ncbi.nlm.nih.gov/Taxonomy/taxonomyhome.html/index.cgi?chapter=cgencodes
+ * NCBI text files are digitized by the esl_gencode_example driver:
+ * make esl_gencode_example
+ * ./esl_gencode_example <file>
+ *
+ * The NCBI page has useful information about these code tables, references and caveats.
+ */
+
+static const ESL_GENCODE esl_transl_tables[] = {
+ { 1, "Standard",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 27, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
+ /* K N K N T T T T R S R S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S * C W C L F L F */
+ NULL, NULL },
+
+ { 2, "Vertebrate mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 27, 15, 27, 15, 10, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* K N K N T T T T * S * S M I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S W C W C L F L F */
+ NULL, NULL },
+
+ { 3, "Yeast mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 10, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 16, 16, 16, 16, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* K N K N T T T T R S R S M I M I Q H Q H P P P P R R R R T T T T E D E D A A A A G G G G V V V V * Y * Y S S S S W C W C L F L F */
+ NULL, NULL },
+
+ { 4, "Mold, protozoan, coelenterate mitochondrial; Mycoplasma/Spiroplasma",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 },
+ /* K N K N T T T T R S R S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S W C W C L F L F */
+ NULL, NULL },
+
+ { 5, "Invertebrate mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 15, 15, 15, 15, 10, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
+ /* K N K N T T T T S S S S M I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S W C W C L F L F */
+ NULL, NULL },
+
+ { 6, "Ciliate, dasycladacean, Hexamita nuclear",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 13, 19, 13, 19, 15, 15, 15, 15, 27, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* K N K N T T T T R S R S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V Q Y Q Y S S S S * C W C L F L F */
+ NULL, NULL },
+
+ { 9, "Echinoderm and flatworm mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 11, 11, 8, 11, 16, 16, 16, 16, 15, 15, 15, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* N N K N T T T T S S S S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S W C W C L F L F */
+ NULL, NULL },
+
+ { 10, "Euplotid nuclear",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 1, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* K N K N T T T T R S R S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S C C W C L F L F */
+ NULL, NULL },
+
+ { 11, "Bacterial, archaeal; and plant plastid",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 27, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
+ /* K N K N T T T T R S R S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S * C W C L F L F */
+ NULL, NULL },
+
+ { 12, "Alternative yeast",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 15, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 27, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* K N K N T T T T R S R S I I M I Q H Q H P P P P R R R R L L S L E D E D A A A A G G G G V V V V * Y * Y S S S S * C W C L F L F */
+ NULL, NULL },
+
+ { 13, "Ascidian mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 5, 15, 5, 15, 10, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
+ /* K N K N T T T T G S G S M I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S W C W C L F L F */
+ NULL, NULL },
+
+ { 14, "Alternative flatworm mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 11, 11, 8, 11, 16, 16, 16, 16, 15, 15, 15, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 19, 19, 27, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* N N K N T T T T S S S S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V Y Y * Y S S S S W C W C L F L F */
+ NULL, NULL },
+
+ { 16, "Chlorophycean mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 9, 19, 15, 15, 15, 15, 27, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* K N K N T T T T R S R S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y L Y S S S S * C W C L F L F */
+ NULL, NULL },
+
+ { 21, "Trematode mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 11, 11, 8, 11, 16, 16, 16, 16, 15, 15, 15, 15, 10, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* N N K N T T T T S S S S M I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S W C W C L F L F */
+ NULL, NULL },
+
+ { 22, "Scenedesmus obliquus mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 9, 19, 27, 15, 15, 15, 27, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* K N K N T T T T R S R S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y L Y * S S S * C W C L F L F */
+ NULL, NULL },
+
+ { 23, "Thraustochytrium mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 27, 1, 18, 1, 27, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ /* K N K N T T T T R S R S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S * C W C * F L F */
+ NULL, NULL },
+
+ { 24, "Pterobranchia mitochondrial",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 15, 15, 8, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 18, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
+ /* K N K N T T T T S S K S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S W C W C L F L F */
+ NULL, NULL },
+
+ { 25, "Candidate Division SR1 and Gracilibacteria",
+ /* AAA AAC AAG AAT ACA ACC ACG ACT AGA AGC AGG AGT ATA ATC ATG ATT CAA CAC CAG CAT CCA CCC CCG CCT CGA CGC CGG CGT CTA CTC CTG CTT GAA GAC GAG GAT GCA GCC GCG GCT GGA GGC GGG GGT GTA GTC GTG GTT TAA TAC TAG TAT TCA TCC TCG TCT TGA TGC TGG TGT TTA TTC TTG TTT */
+ { 8, 11, 8, 11, 16, 16, 16, 16, 14, 15, 14, 15, 7, 7, 10, 7, 13, 6, 13, 6, 12, 12, 12, 12, 14, 14, 14, 14, 9, 9, 9, 9, 3, 2, 3, 2, 0, 0, 0, 0, 5, 5, 5, 5, 17, 17, 17, 17, 27, 19, 27, 19, 15, 15, 15, 15, 5, 1, 18, 1, 9, 4, 9, 4 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
+ /* K N K N T T T T R S R S I I M I Q H Q H P P P P R R R R L L L L E D E D A A A A G G G G V V V V * Y * Y S S S S G C W C L F L F */
+ NULL, NULL },
+};
+
+
+/*****************************************************************
+ * 2. The ESL_GENCODE genetic code object
+ *****************************************************************/
+
+/* Function: esl_gencode_Create()
+ * Synopsis: Create a new genetic code object
+ *
+ * Purpose: Create a new genetic code object for translating DNA/RNA alphabet
+ * <nt_abc> to protein alphabet <aa_abc>, using the standard
+ * genetic code (NCBI transl_table 1).
+ *
+ * If you want a different code than transl_table 1, use
+ * <esl_gencode_Set()> to reset your <ESL_GENCODE> to a
+ * different code after you create it.
+ *
+ * Because the built-in genetic code tables have been
+ * pre-digitized with the standard Easel alphabets,
+ * <nt_abc> and <aa_abc> must generally also be standard
+ * Easel alphabets: <eslDNA> or <eslRNA> for <nt_abc>, and
+ * <eslAMINO> for <aa_abc>. The exception is if you're
+ * going to digitize NCBI data files for different Easel
+ * alphabets (for instance, if you're going to build a new,
+ * or your own version of the pre-digitized
+ * <esl_transl_tables[]>). As a special case, if either
+ * <nt_abc> or <aa_abc> are not standard Easel alphabets,
+ * the new <ESL_GENCODE> is left uninitialized, rather than
+ * setting it to transl_table 1.
+ *
+ * The <ESL_GENCODE> object keeps a copy of the two
+ * alphabet pointers. Caller is still responsible for their
+ * deallocation. They should not be deallocated until
+ * after the <ESL_GENCODE> object is.
+ *
+ * Returns: A pointer to the new object.
+ *
+ * Throws: <NULL> if allocation fails.
+ */
+ESL_GENCODE *
+esl_gencode_Create(const ESL_ALPHABET *nt_abc, const ESL_ALPHABET *aa_abc)
+{
+ ESL_GENCODE *gcode = NULL;
+ int status;
+
+ ESL_ALLOC(gcode, sizeof(ESL_GENCODE));
+
+ gcode->nt_abc = nt_abc; // Keep a reference to the nucleic alphabet; caller remains responsible for it
+ gcode->aa_abc = aa_abc; // ditto for amino alphabet
+
+ if ( (nt_abc->type == eslDNA || nt_abc->type == eslRNA) && aa_abc->type == eslAMINO)
+ esl_gencode_Set(gcode, 1); // Default = standard code (NCBI trans table 1)
+ return gcode;
+
+ ERROR:
+ esl_gencode_Destroy(gcode);
+ return NULL;
+}
+
+
+/* Function: esl_gencode_Destroy()
+ * Synopsis: Deallocate an <ESL_GENCODE>
+ */
+void
+esl_gencode_Destroy(ESL_GENCODE *gcode)
+{
+ if (gcode) free(gcode);
+}
+
+
+
+/* Function: esl_gencode_Set()
+ * Synopsis: Set one of the NCBI standard genetic codes
+ *
+ * Purpose: Set <gcode> to use one of the standard NCBI genetic code tables,
+ * using the NCBI identifier <ncbi_transl_table>.
+ *
+ * <ncbi_transl_table> is an integer from 1..25 (not all of
+ * which are valid). For example, 1 is the standard code,
+ * and 6 is the ciliate nuclear code.
+ *
+ * The alphabets in <gcode> must be standard Easel
+ * alphabets: <eslAMINO> for <aa_abc> and either <eslDNA>
+ * or <eslRNA> for <nt_abc>. This is because <_Set()>
+ * simply copies precomputed digitized data for the
+ * appropriate genetic code, and that precomputation is
+ * done with the standard Easel digital alphabets. If the
+ * <aa_abc> and <nt_abc> alphabet reference ptrs in <gcode>
+ * are set (and this is recommended, but not necessary)
+ * they're used to verify that the alphabets are Easel
+ * standard ones.
+ *
+ * Returns: <eslOK> on success.
+ * <eslENOTFOUND> if the <ncbi_transl_table> code is not
+ * in our available table of genetic codes.
+ *
+ * Throws: <eslEINVAL> if either of the alphabets in <gcode> are
+ * nonstandard.
+ */
+int
+esl_gencode_Set(ESL_GENCODE *gcode, int ncbi_transl_table)
+{
+ int ntables = sizeof(esl_transl_tables) / sizeof(ESL_GENCODE);
+ int t, c;
+
+ if (gcode->nt_abc && (gcode->nt_abc->type != eslDNA && gcode->nt_abc->type != eslRNA))
+ ESL_EXCEPTION(eslEINVAL, "NCBI translation tables are precomputed using Easel standard alphabets; your nucleic alphabet is nonstandard");
+ if (gcode->aa_abc && gcode->aa_abc->type != eslAMINO)
+ ESL_EXCEPTION(eslEINVAL, "NCBI translation tables are precomputed using Easel standard alphabets; your amino alphabet is nonstandard");
+
+ for (t = 0; t < ntables; t++)
+ if ( esl_transl_tables[t].transl_table == ncbi_transl_table) break;
+ if (t == ntables) return eslENOTFOUND;
+
+ gcode->transl_table = esl_transl_tables[t].transl_table;
+ strcpy(gcode->desc, esl_transl_tables[t].desc);
+ for (c = 0; c < 64; c++)
+ {
+ gcode->basic[c] = esl_transl_tables[t].basic[c];
+ gcode->is_initiator[c] = esl_transl_tables[t].is_initiator[c];
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_gencode_SetInitiatorAny()
+ * Synopsis: Set initiator field so ORFs can start with any aa
+ *
+ * Purpose: Set <gcode> to allow ORFs to start with any amino acid, as
+ * opposed to looking for initiation codons.
+ *
+ * We do this by overwriting the <is_initiator> field to be
+ * TRUE for all codons except terminators. Because we
+ * overwrite, the only way to revert a genetic code to use
+ * its official set of initiators is to reinitialize it
+ * completely.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_gencode_SetInitiatorAny(ESL_GENCODE *gcode)
+{
+ int c;
+ for (c = 0; c < 64; c++)
+ gcode->is_initiator[c] = (esl_abc_XIsCanonical(gcode->aa_abc, gcode->basic[c]) ? TRUE : FALSE);
+ return eslOK;
+}
+
+
+/* Function: esl_gencode_SetInitiatorOnlyAUG
+ * Synopsis: Set initiator field so ORFs must start with AUG
+ *
+ * Purpose: Set <gcode> so that ORFs can only start with AUG, as opposed
+ * to using the possibly larger set of plausible initiator codons
+ * associated with the standard NCBI genetic codes. (For example,
+ * the standard code 1 allows ATG, CTG, and UUG initiators.)
+ *
+ * We do this by overwriting the <is_initiator> field to be TRUE
+ * only for the ATG codon.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_gencode_SetInitiatorOnlyAUG(ESL_GENCODE *gcode)
+{
+ int c;
+ int atgcodon = 16 * esl_abc_DigitizeSymbol(gcode->nt_abc, 'A') +
+ 4 * esl_abc_DigitizeSymbol(gcode->nt_abc, 'T') +
+ esl_abc_DigitizeSymbol(gcode->nt_abc, 'G');
+
+ for (c = 0; c < 64; c++) gcode->is_initiator[c] = FALSE;
+ gcode->is_initiator[atgcodon] = TRUE;
+ return eslOK;
+}
+
+
+
+/*****************************************************************
+ * 3. Reading and writing genetic codes in NCBI format
+ *****************************************************************/
+
+/* Function: esl_gencode_Read()
+ * Synopsis: Read a genetic code in NCBI text format from a stream.
+ *
+ * Purpose: Read an NCBI genetic code text file from <efp>; parse it
+ * and convert to Easel digitized data using the nucleic
+ * acid alphabet <nt_abc> and the protein alphabet <aa_abc>;
+ * return a pointer to the newly created <ESL_GENCODE> object
+ * via <*ret_gcode>.
+ *
+ * Example of an NCBI genetic code datafile:
+ *
+ * AAs = FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG
+ * Starts = ---M---------------M---------------M----------------------------
+ * Base1 = TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG
+ * Base2 = TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG
+ * Base3 = TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG
+ *
+ * Caller is responsible for opening the <efp> first. This
+ * allows caller to take input from files, streams, or even
+ * to have data embedded as a piece of a larger file format
+ * it's parsing.
+ *
+ * The <efp> is configured so that lines beginning with '#'
+ * are ignored as comments, and upon return, the <efp> remains
+ * configured this way.
+ *
+ * This function is and must remain independent of the
+ * order of residues in the amino and nucleic
+ * alphabets. This allows us to convert NCBI genetic code
+ * text files to digitized Easel translation tables even
+ * for other orders of the symbols in DNA/protein digital
+ * alphabets, including the case of us someday changing the
+ * order of the Easel standard alphabet(s). Once digitized,
+ * Easel encodings of the genetic code are dependent on the
+ * <eslAMINO> and <eslNUCLEIC> alphabets they were created
+ * with.
+ *
+ * Slightly confusing case: if we *did* change the order in
+ * the Easel standard alphabets, the esl_gencode module has
+ * no way to know that it changed. All it sees is the
+ * <eslDNA>, <eslRNA>, or <eslAMINO> <type>. <ESL_GENCODE>
+ * data will be corrupted, and unit testing of
+ * <esl_gencode> will fail, until the <esl_transl_tables[]>
+ * data are rebuilt for the new alphabets using the
+ * <esl_gencode_example> program.
+ *
+ * Returns: <eslOK> on success. <*ret_gcode> contains the new <ESL_GENCODE>.
+ * <efp> has been set to ignore lines beginning with '#'.
+ *
+ * On a parse error, returns <eslEFORMAT>, and an informative message is
+ * left in <efp->errbuf>. Now <*ret_gcode> is NULL, but <efp> has
+ * still been configured to ignore lines beginning with '#'.
+ */
+int
+esl_gencode_Read(ESL_FILEPARSER *efp, const ESL_ALPHABET *nt_abc, const ESL_ALPHABET *aa_abc, ESL_GENCODE **ret_gcode)
+{
+ ESL_GENCODE *gcode = esl_gencode_Create(nt_abc, aa_abc);
+ ESL_REGEXP *mach = esl_regexp_Create();
+ int start, end, s, e;
+ char aas[65];
+ char mline[65];
+ char base1[65];
+ char base2[65];
+ char base3[65];
+ int aa_seen[20];
+ int stop_seen;
+ int codon_seen[64];
+ int x, codon, pos;
+ int status;
+
+ ESL_DASSERT1(( nt_abc->K == 4 )); // We're going to hardcode ncodons = 64, so "trust but verify"
+ ESL_DASSERT1(( aa_abc->K == 20 ));
+
+ if (( status = esl_fileparser_SetCommentChar(efp, '#') != eslOK)) goto ERROR;
+
+ if ((status = esl_fileparser_NextLine(efp)) != eslOK) { if (status == eslEOF) ESL_XFAIL(eslEFORMAT, efp->errbuf, "File empty or truncated? No AAs line found"); else goto ERROR; }
+ if ((status = esl_regexp_Match(mach, "^\\s*[Aa][Aa]s\\s*=\\s*(\\S+)\\s*$", efp->buf)) != eslOK) { if (status == eslEOD) ESL_XFAIL(eslEFORMAT, efp->errbuf, "First data line doesn't start with 'AAs ='"); else goto ERROR; }
+ if ((status = esl_regexp_SubmatchCoords(mach, efp->buf, 1, &start, &end)) != eslOK) goto ERROR;
+ if (end - start + 1 != 64) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Expected 64 char of AAs data");
+ strncpy(aas, efp->buf+start, 64);
+ aas[64] = '\0';
+
+ if ((status = esl_fileparser_NextLine(efp)) != eslOK) { if (status == eslEOF) ESL_XFAIL(eslEFORMAT, efp->errbuf, "File empty or truncated? No Starts line found"); else goto ERROR; }
+ if ((status = esl_regexp_Match(mach, "^\\s*[Ss]tarts\\s*=\\s*(\\S+)\\s*$", efp->buf)) != eslOK) { if (status == eslEOD) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Second data line doesn't start with 'Starts ='"); else goto ERROR; }
+ if ((status = esl_regexp_SubmatchCoords(mach, efp->buf, 1, &s, &e)) != eslOK) goto ERROR;
+ if (e - s + 1 != 64) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Expected 64 char of Starts data");
+ if (s != start) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Starts data is not aligned with AAs data above it");
+ strncpy(mline, efp->buf+start, 64);
+ mline[64] = '\0';
+
+ if ((status = esl_fileparser_NextLine(efp)) != eslOK) { if (status == eslEOF) ESL_XFAIL(eslEFORMAT, efp->errbuf, "File empty or truncated? No Base1 line found"); else goto ERROR; }
+ if ((status = esl_regexp_Match(mach, "^\\s*[Bb]ase1\\s*=\\s*(\\S+)\\s*$", efp->buf)) != eslOK) { if (status == eslEOD) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Third data line doesn't start with 'Base1 ='"); else goto ERROR; }
+ if ((status = esl_regexp_SubmatchCoords(mach, efp->buf, 1, &s, &e)) != eslOK) goto ERROR;
+ if (e - s + 1 != 64) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Expected 64 char of Base1 data");
+ if (s != start) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Base1 data is not aligned with data above it");
+ strncpy(base1, efp->buf+start, 64);
+ base1[64] = '\0';
+
+ if ((status = esl_fileparser_NextLine(efp)) != eslOK) { if (status == eslEOF) ESL_XFAIL(eslEFORMAT, efp->errbuf, "File empty or truncated? No Base2 line found"); else goto ERROR; }
+ if ((status = esl_regexp_Match(mach, "^\\s*[Bb]ase2\\s*=\\s*(\\S+)\\s*$", efp->buf)) != eslOK) { if (status == eslEOD) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Fourth data line doesn't start with 'Base2 ='"); else goto ERROR; }
+ if ((status = esl_regexp_SubmatchCoords(mach, efp->buf, 1, &s, &e)) != eslOK) goto ERROR;
+ if (e - s + 1 != 64) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Expected 64 char of Base2 data");
+ if (s != start) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Base2 data is not aligned with data above it");
+ strncpy(base2, efp->buf+start, 64);
+ base2[64] = '\0';
+
+ if ((status = esl_fileparser_NextLine(efp)) != eslOK) { if (status == eslEOF) ESL_XFAIL(eslEFORMAT, efp->errbuf, "File empty or truncated? No Base3 line found"); else goto ERROR; }
+ if ((status = esl_regexp_Match(mach, "^\\s*[Bb]ase3\\s*=\\s*(\\S+)\\s*$", efp->buf)) != eslOK) { if (status == eslEOD) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Fifth data line doesn't start with 'Base3 ='"); else goto ERROR; }
+ if ((status = esl_regexp_SubmatchCoords(mach, efp->buf, 1, &s, &e)) != eslOK) goto ERROR;
+ if (e - s + 1 != 64) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Expected 64 char of Base3 data");
+ if (s != start) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Base3 data is not aligned with data above it");
+ strncpy(base3, efp->buf+start, 64);
+ base3[64] = '\0';
+
+ stop_seen = FALSE;
+ for ( x = 0; x < 20; x++) aa_seen[x] = FALSE;
+ for (codon = 0; codon < 64; codon++) codon_seen[codon] = FALSE;
+
+ for (pos = 0; pos < 64; pos++)
+ {
+ if (! esl_abc_CIsValid(aa_abc, aas[pos]) || ! (esl_abc_CIsCanonical(aa_abc, aas[pos]) || esl_abc_CIsNonresidue(aa_abc, aas[pos]))) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Character %c on AAs line is not an amino acid or a * (stop)", aas[pos]);
+ if (! esl_abc_CIsValid(nt_abc, base1[pos]) || ! esl_abc_CIsCanonical(nt_abc, base1[pos])) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Character %c on Base1 line is not a nucleotide", base1[pos]);
+ if (! esl_abc_CIsValid(nt_abc, base2[pos]) || ! esl_abc_CIsCanonical(nt_abc, base2[pos])) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Character %c on Base2 line is not a nucleotide", base2[pos]);
+ if (! esl_abc_CIsValid(nt_abc, base3[pos]) || ! esl_abc_CIsCanonical(nt_abc, base3[pos])) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Character %c on Base3 line is not a nucleotide", base3[pos]);
+ if ( mline[pos] != '-' && mline[pos] != 'm' && mline[pos] != 'M') ESL_XFAIL(eslEFORMAT, efp->errbuf, "Character %c on Starts line is neither a - or an M", mline[pos]);
+
+ codon = 16 * esl_abc_DigitizeSymbol(nt_abc, base1[pos]) +
+ 4 * esl_abc_DigitizeSymbol(nt_abc, base2[pos]) +
+ esl_abc_DigitizeSymbol(nt_abc, base3[pos]);
+ x = esl_abc_DigitizeSymbol(aa_abc, aas[pos]);
+
+ ESL_DASSERT1(( codon >= 0 && codon < 64 ));
+ ESL_DASSERT1(( x >= 0 && (x < 20 || x == esl_abc_XGetNonresidue(aa_abc))));
+
+ if (x < 20) aa_seen[x]++; else stop_seen++;
+ codon_seen[codon]++;
+
+ gcode->basic[codon] = x;
+ gcode->is_initiator[codon] = ( mline[pos] == '-' ? FALSE : TRUE ); // We already checked above that it's one of "-mM"
+ }
+
+ /* A genetic code must provide a translation for all 64 codons, and
+ * all 20 amino acids to be encoded. (No organism is yet known to
+ * encode fewer than 20 amino acids [Kawahara-Kobayashi et al, NAR
+ * 40:10576, 2012].) The code must include at least one stop codon.
+ */
+ if (! stop_seen) ESL_XFAIL(eslEFORMAT, efp->errbuf, "No stop codon found in that genetic code");
+ for (codon = 0; codon < 64; codon++)
+ if (! codon_seen[codon]) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Data for fewer than 64 codons was found");
+ for (x = 0; x < 20; x++)
+ if (aa_seen[x] == 0) ESL_XFAIL(eslEFORMAT, efp->errbuf, "No codon for residue %c found", aa_abc->sym[x]);
+
+
+ esl_regexp_Destroy(mach);
+ gcode->transl_table = -1; // It was initialized to 1, the NCBI standard table; reset
+ gcode->desc[0] = '\0'; // Was initialized to desc of NCBI table 1; blank it
+ gcode->nt_abc = nt_abc;
+ gcode->aa_abc = aa_abc;
+ *ret_gcode = gcode;
+ return eslOK;
+
+ ERROR:
+ if (gcode) esl_gencode_Destroy(gcode);
+ if (mach) esl_regexp_Destroy(mach);
+ *ret_gcode = NULL;
+ return status;
+}
+
+
+/* Function: esl_gencode_Write()
+ * Synopsis: Write a genetic code to a stream, in NCBI format
+ *
+ * Purpose: Write the genetic code <gcode> to stream <ofp> in NCBI format.
+ *
+ * If <add_comment> is TRUE and if it's a standard NCBI genetic code
+ * (i.e. with an NCBI transl_table number), also add a comment
+ * line at the top to document which transl_table it is, and the
+ * description line. This is an Easel extension. Other programs
+ * that read NCBI genetic code files will probably not be able to
+ * parse the Easel comment line, and for such programs you'll want
+ * <add_comment> to be FALSE.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on a write failure, such as a disk running out of space.
+ */
+int
+esl_gencode_Write(FILE *ofp, const ESL_GENCODE *gcode, int add_comment)
+{
+ char order[] = "TCAG";
+ int x,c;
+
+ if (add_comment && gcode->transl_table > 0)
+ if ( fprintf(ofp, "# %d %s\n",
+ gcode->transl_table, gcode->desc) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+
+
+ if ( fprintf(ofp, " AAs = ") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+ for (x = 0; x < 64; x++) {
+ c = 16 * esl_abc_DigitizeSymbol(gcode->nt_abc, order[ x/16 ])
+ + 4 * esl_abc_DigitizeSymbol(gcode->nt_abc, order[ (x%16)/4 ])
+ + esl_abc_DigitizeSymbol(gcode->nt_abc, order[ x%4]);
+ if (fputc( gcode->aa_abc->sym[gcode->basic[c]], ofp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+ }
+ if ( fputc('\n', ofp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+
+ if ( fprintf(ofp, " Starts = ") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+ for (x = 0; x < 64; x++) {
+ c = 16 * esl_abc_DigitizeSymbol(gcode->nt_abc, order[ x/16 ])
+ + 4 * esl_abc_DigitizeSymbol(gcode->nt_abc, order[ (x%16)/4 ])
+ + esl_abc_DigitizeSymbol(gcode->nt_abc, order[ x%4]);
+ if (fputc( (gcode->is_initiator[c] ? 'M' : '-'), ofp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+ }
+ if ( fputc('\n', ofp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+
+ if ( fprintf(ofp, " Base1 = ") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+ for (x = 0; x < 64; x++) if ( fputc( order[ x/16 ], ofp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+ if ( fputc('\n', ofp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+
+ if ( fprintf(ofp, " Base2 = ") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+ for (x = 0; x < 64; x++) if ( fputc( order[ (x%16)/4 ], ofp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+ if ( fputc('\n', ofp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+
+ if ( fprintf(ofp, " Base3 = ") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+ for (x = 0; x < 64; x++) if ( fputc( order[ x%4 ], ofp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+ if ( fputc('\n', ofp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "genetic code write failed");
+
+ return eslOK;
+}
+
+
+
+
+/*****************************************************************
+ * 4. DNA->protein digital translation, allowing ambiguity chars
+ *****************************************************************/
+
+
+/* Function: esl_gencode_GetTranslation()
+ * Synopsis: Returns translation of a degenerate digital codon.
+ *
+ * Purpose: Translate the digital DNA/RNA codon sequence starting at
+ * pointer <dsqp> and return the digital amino acid code.
+ *
+ * <dsqp> is a pointer into a digital sequence,
+ * not a complete digital sequence, so there are no sentinels.
+ * Also, caller must be sure that a full codon dsqp[0..2] exists
+ * at this location.
+ *
+ * Ambiguity codes are allowed in the DNA/RNA codon. If
+ * the amino acid is unambiguous, despite codon ambiguity,
+ * the correct amino acid is still determined: for example,
+ * GGR translates as Gly, UUY as Phe, AUH as Ile. If
+ * there is no single unambiguous amino acid translation, the codon
+ * is translated as X (unknown).
+ *
+ * Other than X, no amino acid ambiguity code is
+ * returned. We do not, for example, decode SAR as Z (Q|E),
+ * MUH as J (I|L), or RAY as B (N|D), because the extra
+ * complexity needed to do this doesn't seem worthwhile.
+ *
+ * Returns: digital amino acid code (0..19 or esl_abc_XGetUnknown()) in
+ * the protein alphabet.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_gencode_GetTranslation(const ESL_GENCODE *gcode, ESL_DSQ *dsqp)
+{
+ ESL_DSQ x, y, z;
+ int codon;
+ int aa = -1;
+
+ if (esl_abc_XIsCanonical(gcode->nt_abc, dsqp[0]) && esl_abc_XIsCanonical(gcode->nt_abc, dsqp[1]) && esl_abc_XIsCanonical(gcode->nt_abc, dsqp[2]))
+ {
+ codon = 16*dsqp[0] + 4*dsqp[1] + dsqp[2];
+ return gcode->basic[codon];
+ }
+
+ for (x = 0; x < 4; x++)
+ {
+ if (! gcode->nt_abc->degen[dsqp[0]][x]) continue;
+ for (y = 0; y < 4; y++)
+ {
+ if (! gcode->nt_abc->degen[dsqp[1]][y]) continue;
+ for (z = 0; z < 4; z++)
+ {
+ if (! gcode->nt_abc->degen[dsqp[2]][z]) continue;
+ /* xyz is one possible basic codon included in the dsqp[3] degeneracy */
+ codon = x * 16 + y * 4 + z;
+ if (aa == -1) aa = gcode->basic[codon];
+ else if (aa != gcode->basic[codon]) return esl_abc_XGetUnknown(gcode->aa_abc);
+ }
+ }
+ }
+ return aa;
+}
+
+/* Function: esl_gencode_IsInitiator()
+ * Synopsis: Returns TRUE if degenerate codon is an initiator
+ *
+ * Purpose: Determine if all possible codons consistent with the
+ * degenerate codon sequence starting at <dsqp> are
+ * all initiation codons; return TRUE if so, else FALSE.
+ *
+ * For example, the standard code allows AUG|CUG|UUG
+ * initiators. Given HUG, MUG, or YUG, we would return
+ * TRUE.
+ *
+ * Because stop codons never have the <is_initiator> flag,
+ * even if we used <esl_gencode_SetAnyInitiator()>, NNN
+ * will never be used to initiate an open reading frame,
+ * nor will other degenerate codons that are consistent
+ * with at least one stop. This is desirable: we don't want
+ * to call all-X ORFs across long stretches of N's that
+ * are prevalent in DNA sequence assemblies.
+ *
+ * Works fine on nondegenerate codons too, but if caller
+ * knows the codon is nondegenerate, it should simply
+ * test <gcode->is_initiator[0..63]> directly.
+ *
+ * <dsqp> is a pointer into a digital sequence, not
+ * a digital sequence itself, so there are no sentinels:
+ * the codon is dsqp[0..2]. Moreover, caller must be
+ * sure that a full codon exists at this location;
+ * don't call this function at dsq[L-1] or dsq[L].
+ *
+ * Returns: TRUE|FALSE
+ */
+int
+esl_gencode_IsInitiator(const ESL_GENCODE *gcode, ESL_DSQ *dsqp)
+{
+ ESL_DSQ x, y, z;
+ int codon;
+ int ncodons = 0;
+
+ /* Handle the canonical case (no degeneracies) even though it's
+ * wasteful to call esl_gencode_IsInitiator() if there's no
+ * degeneracies.
+ */
+ if (esl_abc_XIsCanonical(gcode->nt_abc, dsqp[0]) && esl_abc_XIsCanonical(gcode->nt_abc, dsqp[1]) && esl_abc_XIsCanonical(gcode->nt_abc, dsqp[2]))
+ {
+ codon = 16*dsqp[0] + 4*dsqp[1] + dsqp[2];
+ return gcode->is_initiator[codon];
+ }
+
+ /* Main case: if there's degeneracies then all possible
+ * codons must be initiators to call the ambig codon an initiator.
+ */
+ for (x = 0; x < 4; x++)
+ {
+ if (! gcode->nt_abc->degen[dsqp[0]][x]) continue;
+ for (y = 0; y < 4; y++)
+ {
+ if (! gcode->nt_abc->degen[dsqp[1]][y]) continue;
+ for (z = 0; z < 4; z++)
+ {
+ if (! gcode->nt_abc->degen[dsqp[2]][z]) continue;
+ /* xyz is one possible basic codon included in the dsqp[3] degeneracy */
+ codon = x * 16 + y * 4 + z;
+ ncodons++;
+ if (! gcode->is_initiator[codon]) return FALSE;
+ }
+ }
+ }
+
+ /* I can't imagine a degeneracy that doesn't correspond to at least one codon,
+ * but it creeps me out to leave the door open to this returning TRUE if it
+ * hasn't seen any. Hence, <ncodons> test.
+ */
+ return (ncodons ? TRUE : FALSE);
+}
+
+
+/*****************************************************************
+ * 5. Functions for creating/destroying ESL_TRANS_WORKSTATE
+ *****************************************************************/
+void
+esl_gencode_WorkstateDestroy(ESL_GENCODE_WORKSTATE *wrk)
+{
+ int f;
+ if (wrk)
+ {
+ for (f = 0; f < 3; f++) esl_sq_Destroy(wrk->psq[f]);
+
+ if(wrk->orf_block != NULL)
+ {
+ esl_sq_DestroyBlock(wrk->orf_block);
+ wrk->orf_block = NULL;
+ }
+
+ free(wrk);
+ }
+}
+
+ESL_GENCODE_WORKSTATE *
+esl_gencode_WorkstateCreate(ESL_GETOPTS *go, ESL_GENCODE *gcode)
+{
+ ESL_GENCODE_WORKSTATE *wrk = NULL;
+ int f;
+ int status;
+
+ ESL_ALLOC(wrk, sizeof(ESL_GENCODE_WORKSTATE));
+ for (f = 0; f < 3; f++) wrk->psq[f] = NULL;
+
+ for (f = 0; f < 3; f++)
+ {
+ wrk->psq[f] = esl_sq_CreateDigital(gcode->aa_abc);
+ wrk->psq[f]->dsq[0] = eslDSQ_SENTINEL;
+ wrk->in_orf[f] = FALSE;
+ }
+
+ wrk->apos = 1;
+ wrk->frame = 0;
+ wrk->codon = 0;
+ wrk->inval = 0;
+ wrk->is_revcomp = FALSE;
+ wrk->orfcount = 0;
+
+ wrk->orf_block = NULL;
+
+ wrk->do_watson = (esl_opt_GetBoolean(go, "--crick") ? FALSE : TRUE);
+ wrk->do_crick = (esl_opt_GetBoolean(go, "--watson") ? FALSE : TRUE);
+ wrk->using_initiators = ((esl_opt_GetBoolean(go, "-m") || esl_opt_GetBoolean(go, "-M")) ? TRUE : FALSE);
+ wrk->minlen = esl_opt_GetInteger(go, "-l");
+ wrk->outfp = stdout;
+ wrk->outformat = eslSQFILE_FASTA;
+
+ return wrk;
+
+ ERROR:
+ esl_gencode_WorkstateDestroy(wrk);
+ return NULL;
+}
+
+/*****************************************************************
+ * 6. Functions for processing ORFs
+ *****************************************************************/
+
+int
+esl_gencode_ProcessOrf(ESL_GENCODE_WORKSTATE *wrk, ESL_SQ *sq)
+{
+
+ int status = eslOK;
+ ESL_SQ *psq = wrk->psq[wrk->frame];
+
+ psq->end = (wrk->is_revcomp ? wrk->apos+1 : wrk->apos-1);
+
+ if (wrk->in_orf[wrk->frame] && psq->n >= wrk->minlen)
+ {
+ wrk->orfcount++;
+ if (psq->n+2 > psq->salloc)
+ esl_sq_Grow(psq, /*opt_nsafe=*/NULL);
+ psq->dsq[1+psq->n] = eslDSQ_SENTINEL;
+
+ esl_sq_FormatName(psq, "orf%d", wrk->orfcount);
+ esl_sq_FormatDesc(psq, "source=%s coords=%d..%d length=%d frame=%d %s", psq->source, psq->start, psq->end, psq->n, wrk->frame + 1 + (wrk->is_revcomp ? 3 : 0), sq->desc);
+ /* if we do not have a block to write ORFs to then write ORFs to file */
+ if (wrk->orf_block == NULL)
+ {
+ esl_sqio_Write(wrk->outfp, psq, wrk->outformat, /*sq ssi offset update=*/FALSE);
+ }
+ else
+ {
+ if (wrk->orf_block->count == wrk->orf_block->listSize)
+ {
+ status = esl_sq_BlockGrowTo(wrk->orf_block, wrk->orf_block->listSize + 128, TRUE, psq->abc);
+ if (status != eslOK) ESL_XEXCEPTION(eslEMEM, "Cannot increase size of ORF sequence block");
+ }
+ //printf("adding seq to block list num %d\n",wrk->orf_block->count);
+ //esl_sqio_Write(stdout, psq, eslSQFILE_FASTA, 0);
+ //printf("\n");
+ esl_sq_Copy(psq, &(wrk->orf_block->list[wrk->orf_block->count]));
+ //printf("incrementing block count to %d\n",wrk->orf_block->count+1);
+
+ wrk->orf_block->count++;
+ }
+ }
+
+ esl_sq_Reuse(psq);
+ esl_sq_SetSource(psq, sq->name);
+ wrk->in_orf[wrk->frame] = FALSE;
+
+ ERROR:
+ return status;
+}
+
+void
+esl_gencode_ProcessStart(ESL_GENCODE *gcode, ESL_GENCODE_WORKSTATE *wrk, ESL_SQ *sq)
+{
+ int f;
+
+ ESL_DASSERT1(( sq->n >= 3 ));
+
+ for (f = 0; f < 3; f++)
+ {
+ esl_sq_SetSource(wrk->psq[f], sq->name);
+ wrk->in_orf[f] = FALSE;
+ }
+ wrk->frame = 0;
+ wrk->codon = 0;
+ wrk->inval = 0;
+ wrk->is_revcomp = (sq->end > sq->start ? FALSE : TRUE ); // this test fails for seqs of length 1, but we know that L>=3
+ wrk->apos = (wrk->is_revcomp ? sq->L : 1 );
+
+ if (esl_abc_XIsCanonical(gcode->nt_abc, sq->dsq[1])) wrk->codon += 4 * sq->dsq[1]; else wrk->inval = 1;
+ if (esl_abc_XIsCanonical(gcode->nt_abc, sq->dsq[2])) wrk->codon += sq->dsq[2]; else wrk->inval = 2;
+}
+
+
+int
+esl_gencode_ProcessPiece(ESL_GENCODE *gcode, ESL_GENCODE_WORKSTATE *wrk, ESL_SQ *sq)
+{
+ ESL_DSQ aa;
+ int rpos;
+
+ for (rpos = 1; rpos <= sq->n-2; rpos++)
+ {
+ wrk->codon = (wrk->codon * 4) % 64;
+ if ( esl_abc_XIsCanonical(gcode->nt_abc, sq->dsq[rpos+2])) wrk->codon += sq->dsq[rpos+2];
+ else wrk->inval = 3;
+
+ /* Translate the current codon starting at <pos>;
+ * see if it's an acceptable initiator
+ */
+ if (wrk->inval > 0) // degenerate codon: needs special, tedious handling
+ {
+ aa = esl_gencode_GetTranslation(gcode, sq->dsq+rpos); // This function can deal with any degeneracy
+ if (! wrk->in_orf[wrk->frame] && esl_gencode_IsInitiator(gcode, sq->dsq+rpos)) // ...as can IsInitiator.
+ {
+ if (wrk->using_initiators) // If we're using initiation codons, initial codon translates to M even if it's something like UUG or CUG
+ aa = esl_abc_DigitizeSymbol(gcode->aa_abc, 'M');
+ wrk->in_orf[wrk->frame] = TRUE;
+ wrk->psq[wrk->frame]->start = wrk->apos;
+ }
+ wrk->inval--;
+ }
+ else
+ {
+ aa = gcode->basic[wrk->codon]; // If we know the digitized codon has no degeneracy, translation is a simple lookup
+ if (gcode->is_initiator[wrk->codon] && ! wrk->in_orf[wrk->frame])
+ {
+ if (wrk->using_initiators) // If we're using initiation codons, initial codon translates to M even if it's something like UUG or CUG
+ aa = esl_abc_DigitizeSymbol(gcode->aa_abc, 'M');
+ wrk->psq[wrk->frame]->start = wrk->apos;
+ wrk->in_orf[wrk->frame] = TRUE;
+ }
+ }
+
+ /* Stop codon: deal with this ORF sequence and reinitiate */
+ if ( esl_abc_XIsNonresidue(gcode->aa_abc, aa))
+ esl_gencode_ProcessOrf(wrk, sq);
+
+ /* Otherwise: we have a residue. If we're in an orf (if we've
+ * seen a suitable initiator), add this residue, reallocating as needed.
+ */
+ if (wrk->in_orf[wrk->frame])
+ {
+ if (wrk->psq[wrk->frame]->n + 2 > wrk->psq[wrk->frame]->salloc)
+ esl_sq_Grow(wrk->psq[wrk->frame], /*opt_nsafe=*/NULL);
+ wrk->psq[wrk->frame]->dsq[1+ wrk->psq[wrk->frame]->n] = aa;
+ wrk->psq[wrk->frame]->n++;
+ }
+
+ /* Advance +1 */
+ if (wrk->is_revcomp) wrk->apos--; else wrk->apos++;
+ wrk->frame = (wrk->frame + 1) % 3;
+ }
+ return eslOK;
+}
+
+
+int
+esl_gencode_ProcessEnd(ESL_GENCODE_WORKSTATE *wrk, ESL_SQ *sq)
+{
+ int f;
+
+ /* Done with the sequence. Now terminate all the orfs we were working on.
+ * <apos> is sitting at L-1 (or 2, if revcomp) and we're in some <frame>
+ * there.
+ */
+ ESL_DASSERT1(( (wrk->is_revcomp && wrk->apos == 2) || (! wrk->is_revcomp && wrk->apos == sq->L-1) ));
+ for (f = 0; f < 3; f++) // f counts 0..2, but it is *not* the <frame> index; <frame> is stateful
+ {
+ esl_gencode_ProcessOrf(wrk, sq);
+ if (wrk->is_revcomp) wrk->apos--; else wrk->apos++;
+ wrk->frame = (wrk->frame + 1) % 3;
+ }
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 7. Debugging/development utilities
+ *****************************************************************/
+
+/* Function: esl_gencode_DecodeDigicodon()
+ * Synopsis: Convert digital codon code 0..63 to a text string
+ *
+ * Purpose: Routines in the gencode module encode unambiguous codons
+ * as an index 0..63, by 16 x_0 + 4 x_1 + x_2. Convert
+ * <digicodon> (an index 0..63) to a NUL-terminated codon
+ * string in <codon>, where caller provides allocated space
+ * for the <codon> string for at least 4 characters.
+ *
+ * Returns: <codon> ptr itself; this allows <esl_gencode_DecodeDigicodon()>
+ * to be called directly as a function in printf() arguments,
+ * for example.
+ */
+char *
+esl_gencode_DecodeDigicodon(const ESL_GENCODE *gcode, int digicodon, char *codon)
+{
+ codon[0] = gcode->nt_abc->sym[ digicodon / 16 ];
+ codon[1] = gcode->nt_abc->sym[ (digicodon % 16) / 4 ];
+ codon[2] = gcode->nt_abc->sym[ digicodon % 4 ];
+ codon[3] = '\0';
+ return codon;
+}
+
+
+/* Function: esl_gencode_DumpAltCodeTable()
+ * Synopsis: Dump a table of available alternative genetic codes
+ *
+ * Purpose: Write a table of the available options for alternative
+ * genetic codes: the NCBI transl_table index number and a
+ * brief description for each.
+ *
+ * Main use of this function is to format help messages,
+ * listing what the options for transl_table indices are.
+ */
+int
+esl_gencode_DumpAltCodeTable(FILE *ofp)
+{
+ int ntables = sizeof(esl_transl_tables) / sizeof(ESL_GENCODE);
+ int t;
+
+ fprintf(ofp, "id description\n");
+ fprintf(ofp, "--- -----------------------------------\n");
+ for (t = 0; t < ntables; t++)
+ fprintf(ofp, "%3d %s\n", esl_transl_tables[t].transl_table, esl_transl_tables[t].desc);
+ return eslOK;
+}
+
+
+/* Function: esl_gencode_Compare()
+ * Synopsis: Compare two genetic codes for equality.
+ *
+ * Purpose: Compare the two genetic codes <gc1> and <gc2>. Return
+ * <eslOK> if they are identical, <eslFAIL> if they differ.
+ */
+int
+esl_gencode_Compare(const ESL_GENCODE *gc1, const ESL_GENCODE *gc2, int metadata_too)
+{
+ int x;
+
+
+ if (gc1->nt_abc->type != gc2->nt_abc->type) return eslFAIL;
+ if (gc1->aa_abc->type != gc2->aa_abc->type) return eslFAIL;
+
+ if (metadata_too) {
+ if (gc1->transl_table != gc2->transl_table) return eslFAIL;
+ if (strcmp(gc1->desc, gc2->desc) != 0) return eslFAIL;
+ }
+
+ for (x = 0; x < 64; x++)
+ {
+ if (gc1->basic[x] != gc2->basic[x]) return eslFAIL;
+ if (gc1->is_initiator[x] != gc2->is_initiator[x]) return eslFAIL;
+ }
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 8. Unit tests
+ *****************************************************************/
+#ifdef eslGENCODE_TESTDRIVE
+
+static void
+utest_ReadWrite(void)
+{
+ char msg[] = "esl_gencode :: Read/Write unit test failed";
+ char tmpfile[16] = "esltmpXXXXXX";
+ int ntables = sizeof(esl_transl_tables) / sizeof(ESL_GENCODE);
+ ESL_ALPHABET *nt_abc = esl_alphabet_Create(eslDNA);
+ ESL_ALPHABET *aa_abc = esl_alphabet_Create(eslAMINO);
+ ESL_GENCODE *gc1 = NULL;
+ ESL_GENCODE *gc2 = NULL;
+ FILE *ofp = NULL;
+ ESL_FILEPARSER *efp = NULL;
+ int t;
+
+ for (t = 0; t < ntables; t++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if ( (gc1 = esl_gencode_Create(nt_abc, aa_abc)) == NULL) esl_fatal(msg);
+ if ( esl_gencode_Set(gc1, esl_transl_tables[t].transl_table) != eslOK) esl_fatal(msg);
+
+ if ( esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+ if ( esl_gencode_Write(ofp, gc1, /*add_comment=*/TRUE) != eslOK) esl_fatal(msg);
+ fclose(ofp);
+
+ if ( esl_fileparser_Open(tmpfile, /*envvar=*/NULL, &efp) != eslOK) esl_fatal(msg);
+ if ( esl_gencode_Read(efp, nt_abc, aa_abc, &gc2) != eslOK) esl_fatal(msg);
+ if ( esl_gencode_Compare(gc1, gc2, /*metadata_too=*/FALSE) != eslOK) esl_fatal(msg); // _Read() does not read the metadata (transl_table, desc)
+
+ esl_gencode_Destroy(gc1);
+ esl_gencode_Destroy(gc2);
+ esl_fileparser_Close(efp);
+ remove(tmpfile);
+ }
+ esl_alphabet_Destroy(nt_abc);
+ esl_alphabet_Destroy(aa_abc);
+}
+
+#endif /*eslGENCODE_TESTDRIVE*/
+
+
+/*****************************************************************
+ * 9. Test driver
+ *****************************************************************/
+#ifdef eslGENCODE_TESTDRIVE
+
+#include "esl_config.h"
+
+#include "esl_gencode.h"
+
+int
+main(int argc, char **argv)
+{
+ utest_ReadWrite();
+ return eslOK;
+}
+#endif /*eslGENCODE_TESTDRIVE*/
+
+
+/****************************************************************
+ * 10. Example
+ ****************************************************************/
+
+#ifdef eslGENCODE_EXAMPLE
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_fileparser.h"
+#include "esl_gencode.h"
+
+#include <stdio.h>
+
+/* The esl_gencode_example driver isn't an example so much as it's a tool.
+ * It's for digitizing NCBI genetic code tables into the form that
+ * we keep in esl_transl_tables[]. This program does the hard work;
+ * you then just have to add the transl_table index and the short
+ * description manually.
+ */
+int
+main(int argc, char **argv)
+{
+ char *codefile = argv[1];
+ ESL_FILEPARSER *efp = NULL;
+ ESL_GENCODE *gcode = NULL;
+ ESL_ALPHABET *nt_abc = esl_alphabet_Create(eslDNA);
+ ESL_ALPHABET *aa_abc = esl_alphabet_Create(eslAMINO);
+ int digicodon;
+ char codon[4];
+ int status;
+
+ if (esl_fileparser_Open(codefile, /*env=*/NULL, &efp) != eslOK) esl_fatal("Failed to open code file %s", codefile);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ status = esl_gencode_Read(efp, nt_abc, aa_abc, &gcode);
+ if (status == eslEFORMAT) esl_fatal("Failed to parse genetic code datafile %s\n %s\n", codefile, efp->errbuf);
+ else if (status != eslOK) esl_fatal("Unexpected failure parsing genetic code datafile %s : code %d\n", codefile, status);
+
+ printf("/* ");
+ for (digicodon = 0; digicodon < 64; digicodon++)
+ printf("%3s ", esl_gencode_DecodeDigicodon(gcode, digicodon, codon));
+ printf("*/\n");
+
+ printf(" {");
+ for (digicodon = 0; digicodon < 64; digicodon++)
+ printf("%3d%c", gcode->basic[digicodon], (digicodon < 63 ? ',' : ' '));
+ printf("},\n");
+
+ printf(" {");
+ for (digicodon = 0; digicodon < 64; digicodon++)
+ printf("%3d%c", gcode->is_initiator[digicodon], (digicodon < 63 ? ',' : ' '));
+ printf("},\n");
+
+ printf("/* ");
+ for (digicodon = 0; digicodon < 64; digicodon++)
+ printf(" %c ", gcode->aa_abc->sym [gcode->basic[digicodon]]);
+ printf("*/\n");
+
+ esl_alphabet_Destroy(aa_abc);
+ esl_alphabet_Destroy(nt_abc);
+ esl_gencode_Destroy(gcode);
+ esl_fileparser_Close(efp);
+}
+#endif /*eslGENCODE_EXAMPLE*/
+
+
+#ifdef eslGENCODE_EXAMPLE2
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_fileparser.h"
+#include "esl_gencode.h"
+
+#include <stdio.h>
+
+/* The second example, esl_gencode_example2, is the reverse of the first;
+ * it's a little utility for writing the standard code in NCBI format.
+ */
+int
+main(int argc, char **argv)
+{
+ ESL_ALPHABET *nt_abc = esl_alphabet_Create(eslDNA);
+ ESL_ALPHABET *aa_abc = esl_alphabet_Create(eslAMINO);
+ ESL_GENCODE *gcode = esl_gencode_Create(nt_abc, aa_abc);
+
+ esl_gencode_Write(stdout, gcode, TRUE);
+
+ esl_gencode_Destroy(gcode);
+ return eslOK;
+}
+#endif /*eslGENCODE_EXAMPLE2*/
+
+
+/****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ ****************************************************************/
diff --git a/esl_gencode.h b/esl_gencode.h
new file mode 100644
index 0000000..62d179e
--- /dev/null
+++ b/esl_gencode.h
@@ -0,0 +1,88 @@
+/* Genetic code tables for translation, whether canonical or non.
+ */
+#ifndef eslGENCODE_INCLUDED
+#define eslGENCODE_INCLUDED
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_fileparser.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_getopts.h"
+
+typedef struct {
+ int transl_table; // NCBI transl_table number, or -1. Only set for a standard NCBI table, with _Set(); _Read() from file doesn't set this.
+ char desc[128]; // Description, or "". ... ditto
+
+ ESL_DSQ basic[64]; // Basic code table. aacode[0..63; pos1^16 + pos2^4 + pos3] = residue code for amino acid, 0..19 or the Nonresidue code. No degeneracies.
+ int8_t is_initiator[64]; // TRUE for allowed initiator codons; FALSE if not
+
+ const ESL_ALPHABET *nt_abc; // A reference to nucleic alphabet that caller is maintaining elsewhere
+ const ESL_ALPHABET *aa_abc; // A reference to amino alphabet that caller is maintaining
+} ESL_GENCODE;
+
+/* struct esl_gencode_workstate_s
+ * keeps state in DNA sequence <sq>, allowing us to process a sequence
+ * either in a single gulp (using ReadSeq) or in overlapping windows
+ * (using ReadWindow).
+ *
+ * also contains one-time configuration information for translation
+ */
+typedef struct esl_gencode_workstate_s {
+ /* stateful info (which may get updated with each new seq, strand, and/or window): */
+ ESL_SQ *psq[3]; // Growing ORFs in each frame
+ int8_t in_orf[3]; // TRUE|FALSE: TRUE if we're growing an ORF in this frame
+ int apos; // 1..L: current nucleotide we're on (starting a codon) in <sq>
+ int frame; // 0..2: which frame <apos> is in
+ int codon; // 0..63: Digitized codon for apos,apos+1,apos+2
+ int inval; // 0..3: how many apos increments we need to get past an ambiguous nucleotide
+ int is_revcomp; // TRUE|FALSE: TRUE if we're doing reverse complement strand
+ int orfcount; // >=0: How many ORFs we've processed so far
+
+ ESL_SQ_BLOCK *orf_block; // block of sequences to which to write ORFs
+
+ /* one-time configuration information (from options) */
+ int do_watson; // TRUE|FALSE: TRUE if we translate the top strand
+ int do_crick; // TRUE|FALSE: TRUE if we translate the reverse complement strand
+ int using_initiators; // TRUE|FALSE : TRUE if -m or -M, only valid initiators can start an ORF, and initiator codon always translates to Met
+ int minlen; // >=0: minimum orf length that process_orf will deal with
+ FILE *outfp; // default stdout: where to write output ORF data
+ int outformat; // default eslSQFILE_FASTA: sqfile format to write ORFs in
+} ESL_GENCODE_WORKSTATE;
+
+/* Create/Destroy workstate */
+extern void esl_gencode_WorkstateDestroy(ESL_GENCODE_WORKSTATE *wrk);
+extern ESL_GENCODE_WORKSTATE * esl_gencode_WorkstateCreate(ESL_GETOPTS *go, ESL_GENCODE *gcode);
+
+
+/* the ESL_GENCODE genetic code object */
+extern ESL_GENCODE *esl_gencode_Create(const ESL_ALPHABET *nt_abc, const ESL_ALPHABET *aa_abc);
+extern void esl_gencode_Destroy (ESL_GENCODE *gcode);
+extern int esl_gencode_Set (ESL_GENCODE *gcode, int ncbi_transl_table);
+extern int esl_gencode_SetInitiatorAny (ESL_GENCODE *gcode);
+extern int esl_gencode_SetInitiatorOnlyAUG(ESL_GENCODE *gcode);
+
+/* reading and writing genetic codes in NCBI format */
+extern int esl_gencode_Read(ESL_FILEPARSER *efp, const ESL_ALPHABET *nucleic_abc, const ESL_ALPHABET *amino_abc, ESL_GENCODE **ret_gcode);
+extern int esl_gencode_Write(FILE *ofp, const ESL_GENCODE *gcode, int add_comment);
+
+/* DNA->protein digital translation, allowing ambiguity chars */
+extern int esl_gencode_GetTranslation(const ESL_GENCODE *gcode, ESL_DSQ *dsqp);
+extern int esl_gencode_IsInitiator (const ESL_GENCODE *gcode, ESL_DSQ *dsqp);
+
+/* Debugging/development utilities */
+extern char *esl_gencode_DecodeDigicodon(const ESL_GENCODE *gcode, int digicodon, char *codon);
+extern int esl_gencode_DumpAltCodeTable(FILE *ofp);
+extern int esl_gencode_Compare(const ESL_GENCODE *gc1, const ESL_GENCODE *gc2, int metadata_too);
+
+/* Functions for processing ORFs */
+extern int esl_gencode_ProcessOrf(ESL_GENCODE_WORKSTATE *wrk, ESL_SQ *sq);
+extern void esl_gencode_ProcessStart(ESL_GENCODE *gcode, ESL_GENCODE_WORKSTATE *wrk, ESL_SQ *sq);
+extern int esl_gencode_ProcessPiece(ESL_GENCODE *gcode, ESL_GENCODE_WORKSTATE *wrk, ESL_SQ *sq);
+extern int esl_gencode_ProcessEnd(ESL_GENCODE_WORKSTATE *wrk, ESL_SQ *sq);
+
+
+#endif /*eslGENCODE_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_getopts.c b/esl_getopts.c
new file mode 100644
index 0000000..2474d29
--- /dev/null
+++ b/esl_getopts.c
@@ -0,0 +1,2170 @@
+/* Implements a somewhat more powerful command line getopt interface
+ * than the standard UNIX/POSIX call.
+ *
+ * Contents:
+ * 1. The ESL_GETOPTS object.
+ * 2. Setting and testing a configuration.
+ * 3. Retrieving option settings and command line args.
+ * 4. Formatting option help.
+ * 5. Private functions.
+ * 6. Test driver.
+ * 7. Examples.
+ *
+ * xref STL8/p152; STL9/p5.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+
+/* Forward declarations of private functions. */
+static int set_option(ESL_GETOPTS *g, int opti, char *optarg,
+ int setby, int do_alloc);
+static int get_optidx_exactly(const ESL_GETOPTS *g, char *optname, int *ret_opti);
+static int get_optidx_abbrev(ESL_GETOPTS *g, char *optname, int n,
+ int *ret_opti);
+static int esl_getopts(ESL_GETOPTS *g, int *ret_opti, char **ret_optarg);
+static int process_longopt(ESL_GETOPTS *g, int *ret_opti, char **ret_optarg);
+static int process_stdopt(ESL_GETOPTS *g, int *ret_opti, char **ret_optarg);
+static int verify_type_and_range(ESL_GETOPTS *g, int i, char *val, int setby);
+static int verify_integer_range(char *arg, char *range);
+static int verify_real_range(char *arg, char *range);
+static int verify_char_range(char *arg, char *range);
+static int parse_rangestring(char *range, char c, char **ret_lowerp,
+ int *ret_geq, char **ret_upperp, int *ret_leq);
+static int process_optlist(ESL_GETOPTS *g, char **ret_s, int *ret_opti);
+
+
+
+/*****************************************************************
+ *# 1. The <ESL_GETOPTS> object
+ *****************************************************************/
+
+/* Function: esl_getopts_Create()
+ * Synopsis: Create a new <ESL_GETOPTS> object.
+ *
+ * Purpose: Creates an <ESL_GETOPTS> object, given the
+ * array of valid options <opt> (NULL-element-terminated).
+ * Sets default values for all config
+ * options (as defined in <opt>).
+ *
+ * Returns: ptr to the new <ESL_GETOPTS> object.
+ *
+ * Throws: NULL on failure, including allocation failures or
+ * an invalid <ESL_OPTIONS> structure.
+ */
+ESL_GETOPTS *
+esl_getopts_Create(ESL_OPTIONS *opt)
+{
+ ESL_GETOPTS *g = NULL;
+ int status;
+ int i;
+
+ ESL_ALLOC(g, sizeof(ESL_GETOPTS));
+
+ g->opt = opt;
+ g->argc = 0;
+ g->argv = NULL;
+ g->optind = 1;
+ g->nfiles = 0;
+ g->val = NULL;
+ g->setby = NULL;
+ g->valloc = NULL;
+ g->optstring = NULL;
+ g->spoof = NULL;
+ g->spoof_argv= NULL;
+ g->errbuf[0] = '\0';
+
+ /* Figure out the number of options.
+ *
+ * Using the NULL-terminated structure array is a design decision.
+ * Alternatively, the caller could provide us with noptions, and use
+ * a #define noptions (sizeof(options) / sizeof(ESL_GETOPTS)) idiom.
+ * Note that we can't use sizeof() here, because now <opt> is just a
+ * pointer.
+ *
+ * A drawback of requiring NULL termination is, what happens when
+ * the caller forgets? Thus the check for a leading '-' on all
+ * options; if we start straying into memory, that check should
+ * catch us.
+ */
+ g->nopts = 0;
+ while (g->opt[g->nopts].name != NULL) {
+ if (g->opt[g->nopts].name[0] != '-')
+ ESL_XEXCEPTION(eslEINVAL, "option %d didn't start with '-';\nyou may have forgotten to NULL-terminate the ESL_OPTIONS array", g->nopts);
+ g->nopts++;
+ }
+
+ /* Set default values for all options.
+ * Note the valloc[] setting: we only need to dup strings
+ * into allocated space if the value is volatile memory, and
+ * that only happens in config files; not in defaults, cmdline,
+ * or environment.
+ */
+ ESL_ALLOC(g->val, sizeof(char *) * g->nopts);
+ ESL_ALLOC(g->setby, sizeof(int) * g->nopts);
+ ESL_ALLOC(g->valloc, sizeof(int) * g->nopts);
+
+ for (i = 0; i < g->nopts; i++)
+ {
+ g->val[i] = g->opt[i].defval;
+ g->setby[i] = eslARG_SETBY_DEFAULT;
+ g->valloc[i] = 0;
+ }
+
+ /* Verify type/range of the defaults, even though it's
+ * an application error (not user error) if they're invalid.
+ */
+ for (i = 0; i < g->nopts; i++)
+ if (verify_type_and_range(g, i, g->val[i], eslARG_SETBY_DEFAULT) != eslOK)
+ ESL_XEXCEPTION(eslEINVAL, "%s\n", g->errbuf);
+ return g;
+
+ ERROR:
+ esl_getopts_Destroy(g);
+ return NULL;
+}
+
+/* Function: esl_getopts_CreateDefaultApp()
+ * Synopsis: Initialize a standard Easel application.
+ *
+ * Purpose: Carry out the usual sequence of events in initializing a
+ * small Easel-based application: parses the command line,
+ * process the <-h> option to produce a (single-sectioned)
+ * help page, and check that the number of command line
+ * options is right.
+ *
+ * <options> is an array of <ESL_OPTIONS> structures describing
+ * the options, terminated by an all-<NULL> structure.
+ *
+ * <nargs> is the number of commandline arguments
+ * expected. If the number of commandline arguments isn't
+ * equal to this, an error message is printed, with the
+ * <usage> string, and <exit()> is called. If <nargs> is
+ * -1, this check isn't done; if your program deliberately
+ * has a variable number of commandline arguments (i.e.
+ * if the number is unknown at compile time), pass -1
+ * for <nargs>.
+ *
+ * <argc> and <argv> are the command line
+ * arguments (number and pointer array) from <main()>.
+ *
+ * <banner> is an optional one-line description of the
+ * program's function, such as <"compare RNA structures">.
+ * When the <-h> help option is selected, this description
+ * will be combined with the program's name (the tail of
+ * <argv[0]>) and Easel's copyright and license information
+ * to give a header like:
+ *
+ * \begin{cchunk}
+ * # esl-compstruct :: compare RNA structures
+ * # Easel 0.1 (February 2005)
+ * # Copyright (C) 2004-2007 HHMI Janelia Farm Research Campus
+ * # Freely licensed under the Janelia Software License.
+ * # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * \end{cchunk}
+ *
+ * <usage> is an optional one-line description of command
+ * line usage (without the command name), such as
+ * \begin{cchunk}
+ * [options] <trusted file> <test file>
+ * \end{cchunk}
+ * On errors, or
+ * on the help page, this usage string is combined with
+ * the program's name to give a usage line like:
+ *
+ * \begin{cchunk}
+ * Usage: esl-compstruct [options] <trusted file> <test file>
+ * \end{cchunk}
+ *
+ * <banner> and <usage> are optional, meaning that either
+ * can be provided as <NULL> and they won't be shown.
+ *
+ * Returns: a pointer to a new <ESL_GETOPTS> object, which contains
+ * all the option settings and command line arguments.
+ *
+ * On command line errors, this routine exits with abnormal
+ * (1) status.
+ *
+ * If the <-h> help option is seen, this routine exits with
+ * normal (0) status after printing a help page.
+ *
+ */
+ESL_GETOPTS *
+esl_getopts_CreateDefaultApp(ESL_OPTIONS *options, int nargs, int argc, char **argv, char *banner, char *usage)
+{
+ ESL_GETOPTS *go = NULL;
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ if (usage != NULL) esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+ if (esl_opt_GetBoolean(go, "-h") == TRUE)
+ {
+ if (banner != NULL) esl_banner(stdout, argv[0], banner);
+ if (usage != NULL) esl_usage (stdout, argv[0], usage);
+ puts("\nOptions:");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80);
+ exit(0);
+ }
+ if (nargs != -1 && esl_opt_ArgNumber(go) != nargs)
+ {
+ puts("Incorrect number of command line arguments.");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+ return go;
+}
+
+
+/* Function: esl_getopts_Reuse()
+ * Synopsis: Reset application state to default.
+ *
+ * Purpose: Reset application configuration <g> to initial defaults,
+ * as if it were newly created (before any
+ * processing of environment, config files, or
+ * command line).
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ *
+ * Xref: J4/24.
+ */
+int
+esl_getopts_Reuse(ESL_GETOPTS *g)
+{
+ int i;
+
+ /* Restore defaults for all options */
+ for (i = 0; i < g->nopts; i++)
+ {
+ if (g->valloc[i] > 0) { free(g->val[i]); }
+ g->val[i] = g->opt[i].defval;
+ g->setby[i] = eslARG_SETBY_DEFAULT;
+ g->valloc[i] = 0;
+ }
+
+ if (g->spoof != NULL) free(g->spoof);
+ if (g->spoof_argv != NULL) free(g->spoof_argv);
+
+ g->argc = 0;
+ g->argv = NULL;
+ g->optind = 1;
+ g->nfiles = 0;
+ g->optstring = NULL;
+ g->spoof = NULL;
+ g->spoof_argv = NULL;
+ g->errbuf[0] = '\0';
+ return eslOK;
+}
+
+
+/* Function: esl_getopts_Destroy()
+ * Synopsis: Destroys an <ESL_GETOPTS> object.
+ *
+ * Purpose: Free's a created <ESL_GETOPTS> object.
+ *
+ * Returns: void.
+ */
+void
+esl_getopts_Destroy(ESL_GETOPTS *g)
+{
+ int i;
+
+ if (g != NULL)
+ {
+ if (g->val != NULL)
+ {
+ /* A few of our vals may have been allocated.
+ */
+ for (i = 0; i < g->nopts; i++)
+ if (g->valloc[i] > 0)
+ free(g->val[i]);
+ free(g->val);
+ }
+ if (g->setby != NULL) free(g->setby);
+ if (g->valloc != NULL) free(g->valloc);
+ if (g->spoof != NULL) free(g->spoof);
+ if (g->spoof_argv != NULL) free(g->spoof_argv);
+ free(g);
+ }
+}
+
+
+/* Function: esl_getopts_Dump()
+ * Synopsis: Dumps a summary of a <ESL_GETOPTS> configuration.
+ *
+ * Purpose: Dump the state of <g> to an output stream
+ * <ofp>, often stdout or stderr.
+ */
+void
+esl_getopts_Dump(FILE *ofp, ESL_GETOPTS *g)
+{
+ int i, j;
+
+ if (g->argv != NULL)
+ {
+ fprintf(ofp, "argv[0]: %s\n", g->argv[0]);
+ for (i = 1, j = g->optind; j < g->argc; j++, i++)
+ fprintf(ofp, "argument %2d (argv[%2d]): %s\n", i, j, g->argv[j]);
+ fputc('\n', ofp);
+ }
+
+ fprintf(ofp, "%12s %12s %9s\n", "Option", "Setting", "Set by");
+ fprintf(ofp, "------------ ------------ ---------\n");
+
+ for (i = 0; i < g->nopts; i++)
+ {
+ fprintf(ofp, "%-12s ", g->opt[i].name);
+
+ if (g->opt[i].type == eslARG_NONE) fprintf(ofp, "%-12s ", g->val[i] == NULL ? "off" : "on");
+ else fprintf(ofp, "%-12s ", g->val[i]);
+
+ if (g->setby[i] == eslARG_SETBY_DEFAULT) fprintf(ofp, "(default) ");
+ else if (g->setby[i] == eslARG_SETBY_CMDLINE) fprintf(ofp, "cmdline ");
+ else if (g->setby[i] == eslARG_SETBY_ENV) fprintf(ofp, "environ ");
+ else if (g->setby[i] >= eslARG_SETBY_CFGFILE) fprintf(ofp, "cfgfile ");
+
+ fprintf(ofp, "\n");
+ }
+ return;
+}
+
+
+/*****************************************************************
+ *# 2. Setting and testing a configuration
+ *****************************************************************/
+
+/* Function: esl_opt_ProcessConfigfile()
+ * Synopsis: Parses options in a config file.
+ *
+ * Purpose: Given an open configuration file <fp> (and
+ * its name <filename>, for error reporting),
+ * parse it and set options in <g> accordingly.
+ * Anything following a <\#> in the file is a
+ * comment. Blank (or all-comment) lines are
+ * ignored. Data lines contain one option and
+ * its optional argument: for example <--foo arg>
+ * or <-a>. All option arguments are type and
+ * range checked, as specified in <g>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Returns <eslESYNTAX> on parse or format error in the
+ * file, or f option argument fails a type or range check,
+ * or if an option is set twice by the same config file.
+ * In any of these "normal" (user) error cases, <g->errbuf>
+ * is set to a useful error message to indicate the error.
+ *
+ * Throws: <eslEMEM> on allocation problem.
+ */
+int
+esl_opt_ProcessConfigfile(ESL_GETOPTS *g, char *filename, FILE *fp)
+{
+ char *buf = NULL;
+ int n = 0;
+ char *s;
+ char *optname; /* tainted: from user's input file */
+ char *optarg; /* tainted: from user's input file */
+ char *comment;
+ int line;
+ int opti;
+ int status;
+
+ line = 0;
+ while ((status = esl_fgets(&buf, &n, fp)) != eslEOF)
+ {
+ if (status != eslOK) return status; /* esl_fgets() failed (EMEM) */
+
+ line++;
+ optname = NULL;
+ optarg = NULL;
+
+ /* First token is the option, e.g. "--foo"
+ */
+ s = buf;
+ esl_strtok(&s, " \t\n", &optname);
+ if (optname == NULL) continue; /* blank line */
+ if (*optname == '#') continue; /* comment line */
+ if (*optname != '-')
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Parse failed at line %d of cfg file %.24s (saw %.24s, not an option)\n",
+ line, filename, optname);
+
+ /* Second token, if present, is the arg
+ */
+ if (*s == '"') esl_strtok(&s, "\"", &optarg); /* quote-delimited arg */
+ else esl_strtok(&s, " \t\n", &optarg); /* space-delimited arg */
+
+ /* Anything else on the line had better be a comment
+ */
+ esl_strtok(&s, " \t\n", &comment);
+ if (comment != NULL && *comment != '#')
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Parse failed at line %d of cfg file %.24s (saw %.24s, not a comment)\n",
+ line, filename, comment);
+
+ /* Now we've got an optname and an optional optarg;
+ * figure out what option this is.
+ */
+ if (get_optidx_exactly(g, optname, &opti) != eslOK)
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "%.24s is not a recognized option (config file %.24s, line %d)\n",
+ optname, filename, line);
+
+ /* Set that option.
+ * Pass TRUE to set_option's do_alloc flag, because our buffer
+ * is volatile memory that's going away soon - set_option needs
+ * to strdup the arg, not just point to it.
+ */
+ status = set_option(g, opti, optarg,
+ eslARG_SETBY_CFGFILE+g->nfiles,
+ TRUE);
+ if (status != eslOK) return status;
+ }
+
+ if (buf != NULL) free(buf);
+ g->nfiles++;
+ return eslOK;
+}
+
+
+
+
+/* Function: esl_opt_ProcessEnvironment()
+ * Synopsis: Parses options in the environment.
+ *
+ * Purpose: For any option defined in <g> that can be modified
+ * by an environment variable, check the environment
+ * and set that option accordingly. The value provided
+ * by the environment is type and range checked.
+ * When an option is turned on that has other options
+ * toggle-tied to it, those options are turned off.
+ * An option's state may only be changed once by the
+ * environment (even indirectly thru toggle-tying);
+ * else an error is generated.
+ *
+ * Returns: <eslOK> on success, and <g> is loaded with all
+ * options specified in the environment.
+ *
+ * Returns <eslEINVAL> on user input problems,
+ * including type/range check failures, and
+ * sets <g->errbuf> to a useful error message.
+ *
+ * Throws: <eslEMEM> on allocation problem.
+ */
+int
+esl_opt_ProcessEnvironment(ESL_GETOPTS *g)
+{
+ int i;
+ char *optarg;
+ int status;
+
+ for (i = 0; i < g->nopts; i++)
+ if (g->opt[i].envvar != NULL &&
+ (optarg = getenv(g->opt[i].envvar)) != NULL)
+ {
+ status = set_option(g, i, optarg, eslARG_SETBY_ENV, FALSE);
+ if (status != eslOK) return status;
+ }
+ return eslOK;
+}
+
+
+
+/* Function: esl_opt_ProcessCmdline()
+ * Synopsis: Parses options from the command line.
+ *
+ * Purpose: Process a command line (<argc> and <argv>), parsing out
+ * and setting application options in <g>. Option arguments
+ * are type and range checked before they are set, if type
+ * and range information was set when <g> was created.
+ * When an option is set, if it has any other options
+ * "toggle-tied" to it, those options are also turned off.
+ *
+ * Any given option can only change state (on/off) once
+ * per command line; trying to set the same option more than
+ * once generates an error.
+ *
+ * On successful return, <g> contains settings of all
+ * command line options and their option arguments, for
+ * subsequent retrieval by <esl_opt_Get*()>
+ * functions. <g> also contains an <optind> state variable
+ * pointing to the next <argv[]> element that is not an
+ * option. <esl_opt_GetArg()> needs this to know
+ * where the options end and command line arguments begin
+ * in <argv[0]>.
+ *
+ * The parser starts with <argv[1]> and reads <argv[]> elements
+ * in order until it reaches an element that is not an option;
+ * at this point, all subsequent <argv[]> elements are
+ * interpreted as arguments to the application.
+ *
+ * Any <argv[]> element encountered in the command line that
+ * starts with <- > is an option, except <- > or <-- > by
+ * themselves. <- > by itself is interpreted as a command
+ * line argument (usually meaning ``read from stdin instead
+ * of a filename''). <-- > by itself is interpreted as
+ * ``end of options''; all subsequent <argv[]> elements are
+ * interpreted as command-line arguments even if they
+ * begin with <- >.
+ *
+ * Returns: <eslOK> on success. <g> is loaded with
+ * all option settings specified on the cmdline.
+ * Returns <eslEINVAL> on any cmdline parsing problem,
+ * including option argument type/range check failures,
+ * and sets <g->errbuf> to a useful error message for
+ * the user.
+ *
+ * Throws: <eslEMEM> on allocation problem.
+ */
+int
+esl_opt_ProcessCmdline(ESL_GETOPTS *g, int argc, char **argv)
+{
+ int opti;
+ char *optarg;
+ int status, setstatus;
+
+ g->argc = argc;
+ g->argv = argv;
+ g->optind = 1; /* start at argv[1] */
+ g->optstring = NULL; /* not in a -abc optstring yet */
+
+ /* Walk through each option in the command line using esl_getopts(),
+ * which advances g->optind as the index of the next argv element we need
+ * to look at.
+ */
+ while ((status = esl_getopts(g, &opti, &optarg)) == eslOK)
+ {
+ setstatus = set_option(g, opti, optarg, eslARG_SETBY_CMDLINE, FALSE);
+ if (setstatus != eslOK) return setstatus;
+ }
+ if (status == eslEOD) return eslOK;
+ else return status;
+}
+
+
+/* Function: esl_opt_ProcessSpoof()
+ * Synopsis: Parses a string as if it were a command line.
+ *
+ * Purpose: Process the string <cmdline> as if it were a
+ * complete command line.
+ *
+ * Essentially the same as <esl_opt_ProcessCmdline()>
+ * except that whitespace-delimited tokens first need to be
+ * identified in the <cmdline> first, then passed as
+ * <argc>,<argv> to <esl_opt_ProcessCmdline()>.
+ *
+ * Returns: <eslOK> on success, and <g> is loaded with the
+ * application configuration.
+ *
+ * Returns <eslEINVAL> on any parsing problem, and sets
+ * <g->errbuf> to an informative error message.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ * Xref: J4/24.
+ */
+int
+esl_opt_ProcessSpoof(ESL_GETOPTS *g, const char *cmdline)
+{
+ int argc = 0;
+ char *s = NULL;
+ void *p;
+ char *tok;
+ int status;
+
+ if (g->spoof != NULL || g->spoof_argv != NULL)
+ ESL_XFAIL(eslEINVAL, g->errbuf, "cannot process more than one spoofed command line");
+
+ if ((status = esl_strdup(cmdline, -1, &(g->spoof))) != eslOK) goto ERROR;
+ s = g->spoof;
+
+ while (esl_strtok(&s, " \t\n", &tok) == eslOK)
+ {
+ argc++;
+ ESL_RALLOC(g->spoof_argv, p, sizeof(char *) * argc);
+ g->spoof_argv[argc-1] = tok;
+ }
+
+ status = esl_opt_ProcessCmdline(g, argc, g->spoof_argv);
+ return status;
+
+ ERROR:
+ if (g->spoof != NULL) { free(g->spoof); g->spoof = NULL; }
+ if (g->spoof_argv != NULL) { free(g->spoof_argv); g->spoof_argv = NULL; }
+ return status;
+}
+
+/* Function: esl_opt_VerifyConfig()
+ * Synopsis: Validates configuration after options are set.
+ *
+ * Purpose: Given a <g> that we think is fully configured now --
+ * from config file(s), environment, and command line --
+ * verify that the configuration is self-consistent:
+ * for every option that is set, make sure that any
+ * required options are also set, and that no
+ * incompatible options are set. ``Set'' means
+ * the configured value is non-default and non-NULL (including booleans),
+ * and ``not set'' means the value is default or NULL. (That is,
+ * we don't go solely by <setby>, which refers to who
+ * determined the state of an option, even if
+ * it is turned off.)
+ *
+ * Returns: <eslOK> on success.
+ * <eslESYNTAX> if a required option is not set, or
+ * if an incompatible option is set; in this case, sets
+ * <g->errbuf> to contain a useful error message for
+ * the user.
+ *
+ * Throws: <eslEINVAL> if something's wrong with the <ESL_OPTIONS>
+ * structure itself -- a coding error in the application.
+ */
+int
+esl_opt_VerifyConfig(ESL_GETOPTS *g)
+{
+ int i,reqi,incompati;
+ char *s;
+ int status;
+
+ /* For all options that are set (not in default configuration,
+ * and turned on with non-NULL vals),
+ * verify that all their required_opts are set.
+ */
+ for (i = 0; i < g->nopts; i++)
+ {
+ if (g->setby[i] != eslARG_SETBY_DEFAULT && g->val[i] != NULL)
+ {
+ s = g->opt[i].required_opts;
+ while ((status = process_optlist(g, &s, &reqi)) != eslEOD)
+ {
+ if (status != eslOK) ESL_EXCEPTION(eslEINVAL, "something's wrong with format of optlist: %s\n", s);
+ if (g->val[reqi] == NULL)
+ {
+ if (g->setby[i] >= eslARG_SETBY_CFGFILE)
+ ESL_FAIL(eslESYNTAX, g->errbuf, "Option %.24s (set by cfg file %d) requires (or has no effect without) option(s) %.24s",
+ g->opt[i].name, g->setby[i]-2, g->opt[i].required_opts);
+ else if (g->setby[i] == eslARG_SETBY_ENV)
+ ESL_FAIL(eslESYNTAX, g->errbuf, "Option %.24s (set by env var %s) requires (or has no effect without) option(s) %.24s",
+ g->opt[i].name, g->opt[i].envvar, g->opt[i].required_opts);
+ else
+ ESL_FAIL(eslESYNTAX, g->errbuf, "Option %.24s requires (or has no effect without) option(s) %.24s",
+ g->opt[i].name, g->opt[i].required_opts);
+ }
+ }
+ }
+ }
+
+ /* For all options that are set (turned on with non-NULL vals),
+ * verify that no incompatible options are set to non-default
+ * values (notice the setby[incompati] check)
+ */
+ for (i = 0; i < g->nopts; i++)
+ {
+ if (g->setby[i] != eslARG_SETBY_DEFAULT && g->val[i] != NULL)
+ {
+ s = g->opt[i].incompat_opts;
+ while ((status = process_optlist(g, &s, &incompati)) != eslEOD)
+ {
+ if (status != eslOK) ESL_EXCEPTION(eslEINVAL, "something's wrong with format of optlist: %s\n", s);
+ if (incompati != i && (g->setby[incompati] != eslARG_SETBY_DEFAULT && g->val[incompati] != NULL))
+ {
+ if (g->setby[i] >= eslARG_SETBY_CFGFILE)
+ ESL_FAIL(eslESYNTAX, g->errbuf, "Option %.24s (set by cfg file %d) is incompatible with option(s) %.24s",
+ g->opt[i].name, g->setby[i]-2, g->opt[i].incompat_opts);
+
+ else if (g->setby[i] == eslARG_SETBY_ENV)
+ ESL_FAIL(eslESYNTAX, g->errbuf, "Option %.24s (set by env var %s) is incompatible with option(s) %.24s",
+ g->opt[i].name, g->opt[i].envvar, g->opt[i].incompat_opts);
+ else
+ ESL_FAIL(eslESYNTAX, g->errbuf, "Option %.24s is incompatible with option(s) %.24s",
+ g->opt[i].name, g->opt[i].incompat_opts);
+ }
+ }
+ }
+ }
+ return eslOK;
+}
+
+/* Function: esl_opt_ArgNumber()
+ * Synopsis: Returns number of command line arguments.
+ *
+ * Purpose: Returns the number of command line arguments.
+ *
+ * Caller must have already called
+ * <esl_opt_ProcessCmdline()>, in order for all the options
+ * to be parsed first. Everything left on the command line
+ * is taken to be an argument.
+ */
+int
+esl_opt_ArgNumber(const ESL_GETOPTS *g)
+{
+ return ((g)->argc - (g)->optind);
+}
+
+
+/* Function: esl_opt_SpoofCmdline()
+ * Synopsis: Create faux command line from current option configuration.
+ *
+ * Purpose: Given the current configuration state of the application
+ * <g>, create a command line that would recreate the same
+ * state by itself (without any environment or config file
+ * settings), and return it in <*ret_cmdline>.
+ *
+ * Returns: <eslOK> on success. The <*ret_cmdline> is allocated here,
+ * and caller is responsible for freeing it.
+ *
+ * Throws: <eslEMEM> on allocation error, and <*ret_cmdline> is <NULL>.
+ *
+ * Xref: J4/24
+ */
+int
+esl_opt_SpoofCmdline(const ESL_GETOPTS *g, char **ret_cmdline)
+{
+ char *cmdline = NULL;
+ char *p = NULL;
+ int ntot = 0;
+ int n;
+ int i, j;
+ int status;
+
+ /* Application name/path */
+ ntot = strlen(g->argv[0]) + 1;
+ ESL_ALLOC(cmdline, sizeof(char) * (ntot+1));
+ sprintf(cmdline, "%s ", g->argv[0]);
+
+ /* Options */
+ for (i = 0; i < g->nopts; i++)
+ if (g->setby[i] != eslARG_SETBY_DEFAULT)
+ {
+ if (g->opt[i].type == eslARG_NONE) n = strlen(g->opt[i].name) + 1;
+ else n = (strlen(g->opt[i].name) + strlen(g->val[i])) + 2;
+
+ ESL_RALLOC(cmdline, p, sizeof(char) * (ntot + n + 1));
+
+ if (g->opt[i].type == eslARG_NONE) sprintf(cmdline + ntot, "%s ", g->opt[i].name);
+ else sprintf(cmdline + ntot, "%s %s ", g->opt[i].name, g->val[i]);
+
+ ntot += n;
+ }
+
+ /* Arguments */
+ for (j = g->optind; j < g->argc; j++)
+ {
+ n = strlen(g->argv[j]) + 1;
+ ESL_RALLOC(cmdline, p, sizeof(char) * (ntot + n + 1));
+ sprintf(cmdline + ntot, "%s ", g->argv[j]);
+ ntot += n;
+ }
+
+ /* Terminate */
+ cmdline[ntot] = '\0';
+ *ret_cmdline = cmdline;
+ return eslOK;
+
+ ERROR:
+ if (cmdline != NULL) free(cmdline);
+ *ret_cmdline = NULL;
+ return status;
+}
+
+/*****************************************************************
+ *# 3. Retrieving option settings and command line args
+ *****************************************************************/
+
+/* Function: esl_opt_IsDefault()
+ * Synopsis: Returns <TRUE> if option remained at default setting.
+ *
+ * Purpose: Returns <TRUE> if option <optname> is in its
+ * default state; returns <FALSE> if <optname> was
+ * changed on the command line, in the environment, or in
+ * a configuration file.
+ */
+int
+esl_opt_IsDefault(const ESL_GETOPTS *g, char *optname)
+{
+ int opti;
+
+ if (get_optidx_exactly(g, optname, &opti) != eslOK) esl_fatal("no such option %s\n", optname);
+ if (g->setby[opti] == eslARG_SETBY_DEFAULT) return TRUE;
+
+ if (g->val[opti] == NULL && g->opt[opti].defval == NULL) return TRUE;
+ if (esl_strcmp(g->opt[opti].defval, g->val[opti]) == 0) return TRUE; /* option may have been set but restored to original default value */
+ return FALSE;
+}
+
+/* Function: esl_opt_IsOn()
+ * Synopsis: Returns <TRUE> if option is set to a non-<NULL> value.
+ *
+ * Purpose: Returns <TRUE> if option is on (set to a non-<NULL>
+ * value).
+ *
+ * This is most useful when using integer-, real-, char-,
+ * or string-valued options also as boolean switches, where
+ * they can either be OFF, or they can be turned ON by
+ * having a value. Caller can test <esl_opt_IsOn()> to see
+ * if the option's active at all, then use
+ * <esl_opt_GetString()> or whatever to extract the option
+ * value.
+ *
+ * For a boolean option, the result is identical to
+ * <esl_opt_GetBoolean()>.
+ *
+ * Xref: J4/83.
+ */
+int
+esl_opt_IsOn(const ESL_GETOPTS *g, char *optname)
+{
+ int opti;
+
+ if (get_optidx_exactly(g, optname, &opti) != eslOK) esl_fatal("no such option %s\n", optname);
+ if (g->val[opti] == NULL) return FALSE;
+ else return TRUE;
+}
+
+
+/* Function: esl_opt_IsUsed()
+ * Synopsis: Returns <TRUE> if option is on, and this is not the default.
+ *
+ * Purpose: Returns <TRUE> if option <optname> is in use: it has been
+ * set to a non-default value, and that value correspond to
+ * the option being "on" (a non-<NULL> value).
+ *
+ * This is used in printing application headers, where
+ * we want to report all the options that are in effect that
+ * weren't already on by default.
+ *
+ * Xref: J4/83
+ */
+int
+esl_opt_IsUsed(const ESL_GETOPTS *g, char *optname)
+{
+ int opti;
+
+ if (get_optidx_exactly(g, optname, &opti) != eslOK) esl_fatal("no such option %s\n", optname);
+ if (esl_opt_IsDefault(g, optname)) return FALSE;
+ if (g->val[opti] == NULL) return FALSE;
+ return TRUE;
+}
+
+
+/* Function: esl_opt_GetSetter()
+ * Synopsis: Returns code for who set this option.
+ *
+ * Purpose: For a processed options object <g>, return the code
+ * for who set option <optname>. This code is <eslARG_SETBY_DEFAULT>,
+ * <eslARG_SETBY_CMDLINE>, <eslARG_SETBY_ENV>, or it
+ * is $\geq$ <eslARG_SETBY_CFGFILE>. If the option
+ * was configured by a config file, the file number (the order
+ * of <esl_opt_ProcessConfigFile()> calls) is encoded in codes
+ * $\geq <eslARG_SETBY_CFGFILE>$ as
+ * file number $=$ <code> - <eslARG_SETBY_CFGFILE> + 1.
+ */
+int
+esl_opt_GetSetter(const ESL_GETOPTS *g, char *optname)
+{
+ int opti;
+
+ if (get_optidx_exactly(g, optname, &opti) != eslOK) esl_fatal("no such option %s\n", optname);
+ return g->setby[opti];
+}
+
+
+/* Function: esl_opt_GetBoolean()
+ * Synopsis: Retrieve <TRUE>/<FALSE> for a boolean option.
+ *
+ * Purpose: Retrieves the configured TRUE/FALSE value for option <optname>
+ * from <g>.
+ */
+int
+esl_opt_GetBoolean(const ESL_GETOPTS *g, char *optname)
+{
+ int opti;
+
+ if (get_optidx_exactly(g, optname, &opti) == eslENOTFOUND)
+ esl_fatal("no such option %s\n", optname);
+ if (g->opt[opti].type != eslARG_NONE)
+ esl_fatal("option %s is not a boolean; code called _GetBoolean", optname);
+
+ if (g->val[opti] == NULL) return FALSE;
+ else return TRUE;
+}
+
+/* Function: esl_opt_GetInteger()
+ * Synopsis: Retrieve value of an integer option.
+ *
+ * Purpose: Retrieves the configured value for option <optname>
+ * from <g>.
+ */
+int
+esl_opt_GetInteger(const ESL_GETOPTS *g, char *optname)
+{
+ int opti;
+
+ if (get_optidx_exactly(g, optname, &opti) == eslENOTFOUND)
+ esl_fatal("no such option %s\n", optname);
+ if (g->opt[opti].type != eslARG_INT)
+ esl_fatal("option %s does not take an integer arg; code called _GetInteger", optname);
+ return atoi(g->val[opti]);
+}
+
+/* Function: esl_opt_GetReal()
+ * Synopsis: Retrieve value of a real-valued option.
+ *
+ * Purpose: Retrieves the configured value for option <optname>
+ * from <g>.
+ */
+double
+esl_opt_GetReal(const ESL_GETOPTS *g, char *optname)
+{
+ int opti;
+
+ if (get_optidx_exactly(g, optname, &opti) == eslENOTFOUND)
+ esl_fatal("no such option %s\n", optname);
+ if (g->opt[opti].type != eslARG_REAL)
+ esl_fatal("option %s does not take a real-valued arg; code called _GetReal", optname);
+
+ return (atof(g->val[opti]));
+}
+
+/* Function: esl_opt_GetChar()
+ * Synopsis: Retrieve value of a character option.
+ *
+ * Purpose: Retrieves the configured value for option <optname>
+ * from <g>.
+ */
+char
+esl_opt_GetChar(const ESL_GETOPTS *g, char *optname)
+{
+ int opti;
+
+ if (get_optidx_exactly(g, optname, &opti) == eslENOTFOUND)
+ esl_fatal("no such option %s\n", optname);
+ if (g->opt[opti].type != eslARG_CHAR)
+ esl_fatal("option %s does not take a char arg; code called _GetChar", optname);
+
+ return (*g->val[opti]);
+}
+
+/* Function: esl_opt_GetString()
+ * Synopsis: Retrieve value of a string option.
+ *
+ * Purpose: Retrieves the configured value for option <optname>
+ * from <g>.
+ *
+ * This retrieves options of type <eslARG_STRING>,
+ * obviously, but also options of type <eslARG_INFILE>
+ * and <eslARG_OUTFILE>.
+ */
+char *
+esl_opt_GetString(const ESL_GETOPTS *g, char *optname)
+{
+ int opti;
+
+ if (get_optidx_exactly(g, optname, &opti) == eslENOTFOUND)
+ esl_fatal("no such option %s\n", optname);
+ if (g->opt[opti].type != eslARG_STRING &&
+ g->opt[opti].type != eslARG_INFILE &&
+ g->opt[opti].type != eslARG_OUTFILE)
+ esl_fatal("option %s does not take a string arg; code called _GetString", optname);
+
+ return g->val[opti];
+}
+
+
+/* Function: esl_opt_GetArg()
+ * Synopsis: Retrieve numbered command line argument.
+ *
+ * Purpose: Returns a pointer to command line argument number
+ * <which>, where <which> ranges from <1..n> for <n>
+ * total arguments.
+ *
+ * If the caller has already verified that <n> arguments
+ * exist by testing <esl_opt_ArgNumber(g) == n>,
+ * <esl_opt_GetArg()> is guaranteed to return non-<NULL>
+ * arguments for <which = 1..n>.
+ *
+ * Caller is responsible for verifying that the argument
+ * makes sense for what it's supposed to be.
+ *
+ * Returns: A pointer to command line argument <which> on success, or
+ * <NULL> if there is no such argument.
+ */
+char *
+esl_opt_GetArg(const ESL_GETOPTS *g, int which)
+{
+ if (which <= 0) return NULL;
+ if (g->optind+which-1 >= g->argc) return NULL;
+ return g->argv[g->optind+which-1];
+}
+
+
+/*****************************************************************
+ * 4. Formatting option help
+ *****************************************************************/
+
+/* Function: esl_opt_DisplayHelp()
+ * Synopsis: Formats one-line help for each option.
+ *
+ * Purpose: For each option in <go>, print one line of brief
+ * documentation for it, consisting of the option name
+ * (and argument, if any) and the help string. If space
+ * allows, default values for the options (if any) are
+ * shown in brackets. If space still allows, range restrictions
+ * for the options (if any) are shown in parentheses.
+ *
+ * If <docgroup> is non-zero, help lines are only printed
+ * for options with the matching <go->opt[i].docgrouptag>.
+ * This allows the caller to group option documentation
+ * into multiple sections with different headers. To
+ * print all options in one call, pass 0 for <docgroup>.
+ *
+ * <indent> specifies how many spaces to prefix each line with.
+ *
+ * <textwidth> specifies the maximum text width for the
+ * line. This would typically be 80 characters. Lines are
+ * not allowed to exceed this length. If a line does exceed
+ * this length, range restriction display is silently
+ * dropped (for all options). If any line still exceeds
+ * <textwidth>, the default value display is silently dropped,
+ * for all options. If any line still exceeds <textwidth>, even
+ * though it now consists almost solely of the option name and
+ * its help string, an <eslEINVAL> error is thrown. The
+ * caller should either shorten the help string(s) or
+ * increase the <textwidth>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if one or more help lines are too long for
+ * the specified <textwidth>.
+ * <eslEWRITE> if a write fails.
+ */
+int
+esl_opt_DisplayHelp(FILE *ofp, ESL_GETOPTS *go, int docgroup, int indent,
+ int textwidth)
+{
+ int optwidth = 0; /* maximum width for "-foo <n>" options */
+ int helpwidth[3] = {0,0,0}; /* 0=everything; 1=with defaults, no range; 2=help string only */
+ int show_defaults;
+ int show_ranges;
+ int i, n;
+
+ /* Figure out the field widths we need in the output.
+ */
+ for (i = 0; i < go->nopts; i++)
+ if (! docgroup || docgroup == go->opt[i].docgrouptag)
+ {
+ n = strlen(go->opt[i].name); /* "--foo" */
+ if (go->opt[i].type != eslARG_NONE) n += 4; /* + " <n>" */
+ if (n > optwidth) optwidth = n;
+
+ n = 2; /* init with " : " */
+ if (go->opt[i].help != NULL)
+ n = strlen(go->opt[i].help) + 1; /* include " " in width */
+ if (n > helpwidth[2]) helpwidth[2] = n;
+
+ if (go->opt[i].defval != NULL)
+ n += strlen(go->opt[i].defval) + 4; /* include " []" in width */
+ if (n > helpwidth[1]) helpwidth[1] = n;
+
+ if (go->opt[i].range != NULL)
+ n += strlen(go->opt[i].range) + 4; /* include " ()" in width */
+ if (n > helpwidth[0]) helpwidth[0] = n;
+ }
+
+ /* Figure out what we have room for.
+ */
+ if (indent + optwidth + helpwidth[0] <= textwidth)
+ {
+ show_defaults = TRUE;
+ show_ranges = TRUE;
+ }
+ else if (indent + optwidth + helpwidth[1] <= textwidth)
+ {
+ show_defaults = TRUE;
+ show_ranges = FALSE;
+ }
+ else if (indent + optwidth + helpwidth[2] <= textwidth)
+ {
+ show_defaults = FALSE;
+ show_ranges = FALSE;
+ }
+ else ESL_EXCEPTION(eslEINVAL, "Help line too long");
+
+ /* Format and print the options in this docgroup. */
+ for (i = 0; i < go->nopts; i++)
+ if (! docgroup || docgroup == go->opt[i].docgrouptag)
+ {
+ if (fprintf(ofp, "%*s", indent, "") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed");
+ n = 0;
+ if (fprintf(ofp, "%s", go->opt[i].name) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed");
+ n += strlen(go->opt[i].name);
+
+ switch (go->opt[i].type) {
+ case eslARG_NONE: break;
+ case eslARG_INT: if (fprintf(ofp, " <n>") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); n += 4; break;
+ case eslARG_REAL: if (fprintf(ofp, " <x>") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); n += 4; break;
+ case eslARG_CHAR: if (fprintf(ofp, " <c>") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); n += 4; break;
+ case eslARG_STRING: if (fprintf(ofp, " <s>") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); n += 4; break;
+ case eslARG_INFILE: if (fprintf(ofp, " <f>") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); n += 4; break;
+ case eslARG_OUTFILE: if (fprintf(ofp, " <f>") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); n += 4; break;
+ }
+
+ if (fprintf(ofp, "%*s", optwidth-n, "") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed");
+ if (fprintf(ofp, " :") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed");
+
+ if (go->opt[i].help != NULL)
+ { if (fprintf(ofp, " %s", go->opt[i].help) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); }
+
+ if (show_defaults && go->opt[i].defval != NULL)
+ if (go->opt[i].type != eslARG_CHAR || *(go->opt[i].defval) != '\0')
+ { if (fprintf(ofp, " [%s]", go->opt[i].defval) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); }
+
+ if (show_ranges && go->opt[i].range != NULL)
+ { if (fprintf(ofp, " (%s)", go->opt[i].range) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed"); }
+
+ if (fprintf(ofp, "\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "write failed");
+ }
+ return eslOK;
+}
+/*------------------ end of the public API -----------------------*/
+
+
+
+
+
+/*****************************************************************
+ * 5. Miscellaneous private functions
+ *****************************************************************/
+
+/* set_option()
+ *
+ * Turn option <opti> ON (if it's a boolean) or set its option
+ * argument to <optarg>. Record that it was set by <setby> (e.g.
+ * <eslARG_SETBY_CMDLINE>).
+ *
+ * <do_alloc> is a TRUE/FALSE flag. If <arg> is a pointer to a string
+ * that isn't going to go away (e.g. into argv[], or into the
+ * environment) we can get away with just pointing our option's val
+ * at <arg>. But if <arg> is pointing to something volatile (e.g.
+ * the line buffer as we're reading a file) then we need to
+ * strdup the arg -- and remember that we did that, so we free()
+ * it when we destroy the getopts object.
+ *
+ * All user errors (problems with optarg) are normal (returned) errors of
+ * type <eslESYNTAX>, which leave an error message in <g->errbuf>.
+ *
+ * May also throw <eslEMEM> on allocation failure, or <eslEINVAL>
+ * if something's wrong internally, usually indicating a coding error
+ * in the application's <ESL_OPTIONS> structure.
+ */
+int
+set_option(ESL_GETOPTS *g, int opti, char *optarg, int setby, int do_alloc)
+{
+ int arglen;
+ char *where = NULL;
+ char *s;
+ int togi;
+ int status;
+ void *tmp;
+
+ if (setby == eslARG_SETBY_DEFAULT) where = "as default";
+ else if (setby == eslARG_SETBY_CMDLINE) where = "on cmdline";
+ else if (setby == eslARG_SETBY_ENV) where = "in env";
+ else if (setby >= eslARG_SETBY_CFGFILE) where = "in cfgfile";
+
+ /* Have we already set this option? */
+ if (g->setby[opti] == setby)
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Option %.24s has already been set %s.",
+ g->opt[opti].name, where);
+
+ /* Type and range check the option argument.
+ */
+ if (verify_type_and_range(g, opti, optarg, setby) != eslOK) return eslESYNTAX;
+
+ /* Set the option, being careful about when val
+ * is alloc'ed vs. not.
+ */
+ g->setby[opti] = setby;
+ if (g->opt[opti].type == eslARG_NONE) /* booleans: any non-NULL is TRUE... */
+ { /* watch out for booleans getting toggled off/on */
+ if (g->opt[opti].defval) g->val[opti] = g->opt[opti].defval; /* use default string if provided: IsDefault() needs this */
+ else g->val[opti] = (char *) TRUE; /* else 0x1 will do fine. */
+ }
+ else
+ {
+ /* If do_alloc is FALSE or the optarg is NULL, then:
+ * - free any previous alloc;
+ * - set the pointer.
+ */
+ if (!do_alloc || optarg == NULL)
+ {
+ if (g->valloc[opti] > 0) { free(g->val[opti]); g->valloc[opti] = 0; }
+ g->val[opti] = optarg;
+ }
+ /* else do_alloc is TRUE, so:
+ * - make sure we have enough room, either reallocating or allocating
+ * - copy the arg.
+ */
+ else
+ {
+ arglen = strlen(optarg);
+ if (g->valloc[opti] < arglen+1)
+ {
+ if (g->valloc[opti] == 0) ESL_ALLOC (g->val[opti], sizeof(char) * (arglen+1));
+ else ESL_RALLOC(g->val[opti], tmp, sizeof(char) * (arglen+1));
+ g->valloc[opti] = arglen+1;
+ }
+ strcpy(g->val[opti], optarg);
+ }
+ }
+
+ /* Unset all options toggle-tied to this one.
+ */
+ s = g->opt[opti].toggle_opts;
+ while ((status = process_optlist(g, &s, &togi)) != eslEOD)
+ {
+ if (status != eslOK) ESL_EXCEPTION(eslEINVAL, "something's wrong with format of optlist: %s\n", s);
+ if (togi == opti) continue; /* ignore ourself, so we can have one toggle list per group */
+ if (g->val[togi] == NULL) continue; /* it's already off; don't touch it */
+
+ if (g->setby[togi] == setby)
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Options %.24s and %.24s conflict, toggling each other.",
+ g->opt[togi].name, g->opt[opti].name);
+
+ g->setby[togi] = setby; /* indirectly, but still */
+ if (g->valloc[togi] > 0) /* careful about val's that were alloc'ed */
+ { free(g->val[togi]); g->valloc[togi] = 0; }
+ g->val[togi] = NULL; /* ok for false booleans too */
+ }
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* get_optidx_exactly():
+ *
+ * Find option named <optname> in <g>; set <ret_opti> to be
+ * the index of the option, and return eslOK. <optname>
+ * must exactly match one of the options in <g>.
+ *
+ * If the option is not found, return <eslENOTFOUND>; in this
+ * case <*ret_opti> is -1 (and caller should not use it!)
+ */
+static int
+get_optidx_exactly(const ESL_GETOPTS *g, char *optname, int *ret_opti)
+{
+ int i;
+
+ for (i = 0; i < g->nopts; i++)
+ if (strcmp(optname, g->opt[i].name) == 0) { *ret_opti = i; return eslOK; }
+ *ret_opti = -1;
+ return eslENOTFOUND;
+}
+
+/* get_optidx_abbrev():
+ *
+ * Find option named <optname> in <g>; set <ret_opti> to be the index
+ * of the option, and return eslOK. Allow <optname> to be an
+ * abbreviation of one of the option names in <g>, so long as it is
+ * unambiguous. If <n> is >0, the <optname> has an attached argument
+ * (--foo=arg) and <n> is the # of characters before the = character
+ * that we should match to find the option (5, in this example).
+ *
+ * If the option is not found, return <eslENOTFOUND>.
+ * If <optname> ambiguously matches two or more options in <g>,
+ * return <eslEAMBIGUOUS>.
+ */
+static int
+get_optidx_abbrev(ESL_GETOPTS *g, char *optname, int n, int *ret_opti)
+{
+ int nabbrev = 0;
+ int nexact = 0;
+ int i;
+
+ if (n == 0) /* unless we're told otherwise: */
+ n = strlen(optname); /* all of optname abbrev must match against the real name */
+
+ for (i = 0; i < g->nopts; i++)
+ if (strncmp(g->opt[i].name, optname, n) == 0)
+ {
+ nabbrev++;
+ *ret_opti = i;
+ if (n == strlen(g->opt[i].name)) { nexact++; break; } /* an exact match; can stop now (xref bug #e4) */
+ }
+ if (nexact != 1 && nabbrev > 1) return eslEAMBIGUOUS;
+ if (nabbrev == 0) return eslENOTFOUND;
+ return eslOK;
+}
+/*----------- end of private functions for retrieving option indices -------------*/
+
+
+
+/*****************************************************************
+ * Private functions for processing options out of a command line
+ *****************************************************************/
+
+/* esl_getopts():
+ *
+ * Get the next option in argv[], and its argument (if any),
+ * and pass this information back via <ret_opti> (index of
+ * next option) and <ret_optarg).
+ *
+ * Return <eslOK> on success, <eslEOD> if we're out of
+ * options.
+ *
+ * Returns <eslESYNTAX> and sets <g->errbuf> to a useful error
+ * message if something's wrong with one of the user's options.
+ *
+ * Throws <eslEINVAL> if something's wrong internally with the
+ * <ESL_OPTIONS> structure.
+ */
+static int
+esl_getopts(ESL_GETOPTS *g, int *ret_opti, char **ret_optarg)
+{
+ *ret_optarg = NULL;
+
+ /* Check to see if we've run out of options.
+ * A '-' by itself is an argument (e.g. "read from stdin"), not an option.
+ */
+ if (g->optstring == NULL &&
+ (g->optind >= g->argc || g->argv[g->optind][0] != '-' || strcmp(g->argv[g->optind], "-") == 0))
+ return eslEOD; /* normal end-of-data (end of options) return */
+
+ /* Check to see if we're being told that this is the end
+ * of the options with the special "--" flag.
+ */
+ if (g->optstring == NULL &&
+ strcmp(g->argv[g->optind], "--") == 0)
+ {
+ g->optind++;
+ return eslEOD; /* also a normal end-of-data return */
+ }
+
+ /* We have an option: an argv element that starts with -, but is
+ * not "-" or "--".
+ *
+ * We know the strncmp() test is ok for 2 chars, because if the option was
+ * 1 char, we would've already caught it above (either it's a bare "-"
+ * or it's a single non-option char, and in either case it's not an option
+ * and we returned eslEOD.
+ *
+ * Watch out for the case where we're in the middle of a concatenated optstring
+ * of single-letter options, a la -abc
+ */
+ if (g->optstring == NULL && strncmp(g->argv[g->optind], "--", 2) == 0)
+ return process_longopt(g, ret_opti, ret_optarg);
+ else
+ return process_stdopt(g, ret_opti, ret_optarg);
+}
+
+/* process_longopt():
+ *
+ * optind is sitting on a long option, w/ syntax of one of these forms:
+ * --foo
+ * --foo arg
+ * --foo=arg
+ * (GNU getopt long option syntax.)
+ *
+ * Allow unambiguous abbreviations of long options when matching;
+ * e.g. --foo is ok for matching a long option --foobar.
+ *
+ * Returns <eslOK> on success, returning the option number through
+ * <ret_opti>, and a ptr to its argument through <ret_optarg> (or NULL
+ * if this option takes no argument.) Internally, g->optind is
+ * advanced to next argv element (+1, +2, +1, respectively, for --foo,
+ * --foo arg, --foo=arg).
+ *
+ * Returns <eslESYNTAX> and sets a useful error mesg in <g->errbuf> if:
+ * 1. Option can't be found in opt[].
+ * 2. Option abbreviation is ambiguous, matching opt[] nonuniquely.
+ * 3. Option takes an argument, but no argument found.
+ * 4. Option does not take an argument, but one was provided by =arg syntax.
+ * All of these are user input errors.
+
+ */
+static int
+process_longopt(ESL_GETOPTS *g, int *ret_opti, char **ret_optarg)
+{
+ int opti; /* option number found */
+ char *argptr; /* ptr to arg in --foo=arg syntax */
+ int n; /* length of argv elem's option part (up to = or \0) */
+ int status;
+
+ /* Deal with options of syntax "--foo=arg" w/o modifying argv.
+ */
+ if ((argptr = strchr(g->argv[g->optind], '=')) != NULL)
+ { n = argptr - g->argv[g->optind]; argptr++; } /* bump argptr off the = to the arg itself */
+ else
+ { n = strlen(g->argv[g->optind]); } /* and argptr == NULL from above. */
+
+ /* Figure out which option this is.
+ * The trick here is to allow abbreviations, and identify
+ * ambiguities while we're doing it. (GNU getopt allows abbrevs.)
+ */
+ status = get_optidx_abbrev(g, g->argv[g->optind], n, &opti);
+ if (status == eslEAMBIGUOUS)
+ ESL_FAIL(eslESYNTAX, g->errbuf, "Abbreviated option \"%.24s\" is ambiguous.", g->argv[g->optind]);
+ else if (status == eslENOTFOUND)
+ ESL_FAIL(eslESYNTAX, g->errbuf, "No such option \"%.24s\".", g->argv[g->optind]);
+ else if (status != eslOK)
+ ESL_EXCEPTION(eslEINCONCEIVABLE, "Something went wrong with option \"%.24s\".", g->argv[g->optind]);
+
+ *ret_opti = opti;
+ g->optind++; /* optind was on the option --foo; advance the counter to next argv element */
+
+ /* Find the argument, if there is supposed to be one.
+ */
+ if (g->opt[opti].type != eslARG_NONE)
+ {
+ if (argptr != NULL) /* if --foo=arg syntax, then we already found it */
+ *ret_optarg = argptr;
+ else if (g->optind >= g->argc)
+ ESL_FAIL(eslESYNTAX, g->errbuf, "Option %.24s requires an argument.", g->opt[opti].name);
+ else { /* "--foo 666" style, with a space */
+ *ret_optarg = g->argv[g->optind++]; /* assign optind as the arg, advance counter */
+
+ /* Watch out for options masquerading as missing arguments. */
+ if ((g->opt[opti].type == eslARG_STRING || g->opt[opti].type == eslARG_INFILE || g->opt[opti].type == eslARG_OUTFILE)
+ && **ret_optarg == '-')
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Arg looks like option? Use %.24s=%.24s if you really mean it.",
+ g->opt[opti].name, *ret_optarg);
+ }
+ }
+ else /* if there's not supposed to be an arg, but there is, then die */
+ {
+ if (argptr != NULL)
+ ESL_FAIL(eslESYNTAX, g->errbuf, "Option %.24s does not take an argument.", g->opt[opti].name);
+ *ret_optarg = NULL;
+ }
+ return eslOK;
+}
+
+/* process_stdopt():
+ *
+ * Either we're in the middle of working on an optstring (and optind
+ * is sitting on the next argv element, which may be an argument of
+ * the last char in the optstring), or optind is sitting on a "-"
+ * option and we should start working on a new optstring. That is,
+ * we're dealing with standard one-char options, which may be
+ * concatenated into an optstring.
+ *
+ * Only the last optchar in a optstring may take an argument. The argument
+ * is either the remainder of the argv element (if any) or if not, the
+ * next argv element.
+ *
+ * Examples of syntax:
+ * -a
+ * -W arg
+ * -Warg
+ * -abc
+ * -abcW arg
+ * -abcWarg
+ *
+ * Process next optchar; return <eslOK> on success, returning option
+ * number through <ret_opti> and a pointer to any argument through
+ * <ret_optarg>. Internally, optind is advanced to the next argv element;
+ * either 0, +1, or +2, depending on whether we're still processing an
+ * optstring from a prev optind, starting a new optstring, or reading
+ * a "-W arg" form, respectively.
+ *
+ * Returns <eslESYNTAX> and sets <g->errbuf> to a helpful error mesg if:
+ * 1. The option doesn't exist.
+ * 2. The option takes an argument, but none was found.
+ * 3. The option takes an untypechecked argument (eslARG_STRING,
+ * eslARG_INFILE, or eslARG_OUTFILE), the argument is unattached
+ * (space-delimited), and it appears to be an option instead of
+ * an argument, because it starts with '-'.
+ * All these are user input errors.
+ */
+static int
+process_stdopt(ESL_GETOPTS *g, int *ret_opti, char **ret_optarg)
+{
+ int opti;
+
+ /* Do we need to start a new optstring in a new argv element?
+ * (as opposed to still being in an optstring from a prev parse)
+ */
+ if (g->optstring == NULL)
+ g->optstring = g->argv[g->optind++]+1; /* init optstring on first option char; advance optind */
+
+ /* Figure out what option this optchar is
+ */
+ for (opti = 0; opti < g->nopts; opti++)
+ if (*(g->optstring) == g->opt[opti].name[1]) break; /* this'll also fail appropriately for long opts. */
+ if (opti == g->nopts)
+ ESL_FAIL(eslESYNTAX, g->errbuf, "No such option \"-%c\".", *(g->optstring));
+ *ret_opti = opti;
+
+ /* Find the argument, if there's supposed to be one */
+ if (g->opt[opti].type != eslARG_NONE)
+ {
+ if (*(g->optstring+1) != '\0') /* attached argument case, a la -Warg */
+ *ret_optarg = g->optstring+1;
+ else if (g->optind < g->argc) { /* unattached argument; assign optind, advance counter */
+ *ret_optarg = g->argv[g->optind++];
+
+ /* Watch out for options masquerading as missing arguments. */
+ if ((g->opt[opti].type == eslARG_STRING || g->opt[opti].type == eslARG_INFILE || g->opt[opti].type == eslARG_OUTFILE)
+ && **ret_optarg == '-')
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Arg looks like option? Use %.24s%.24s if you really mean it.",
+ g->opt[opti].name, *ret_optarg);
+ } else
+ ESL_FAIL(eslESYNTAX, g->errbuf, "Option %.24s requires an argument", g->opt[opti].name);
+
+ g->optstring = NULL; /* An optchar that takes an arg must terminate an optstring. */
+ }
+ else /* if there's not supposed to be an argument, then check if we're still in an optstring */
+ {
+ *ret_optarg = NULL;
+ if (*(g->optstring+1) != '\0') /* yup, we're still in an optstring */
+ g->optstring++;
+ else
+ g->optstring = NULL; /* nope, that's it; move to next field in args */
+ }
+ return eslOK;
+}
+/*----------- end of private functions for processing command line options -------------*/
+
+
+
+
+/*****************************************************************
+ * Private functions for type and range checking.
+ *****************************************************************/
+
+/* verify_type_and_range():
+ *
+ * Implementation of type and range checking for options.
+ *
+ * Given a value <val> (as a string) for option <i> in the option
+ * object <g>, verify that <val> satisfies the appropriate type and
+ * range. If successful, return <eslOK>.
+ *
+ * The <setby> flag is used to help format useful error messages,
+ * by saying who was responsible for a bad <val>.
+ *
+ * Returns: <eslOK> on success.
+ * Returns <eslESYNTAX> if <val> fails type/range checking,
+ * and <g->errbuf> is set to contain an error report for the user.
+ *
+ * Throws: <eslEINVAL>: a range string format was bogus.
+ * <eslEINCONCEIVABLE>: "can't happen" internal errors.
+ */
+static int
+verify_type_and_range(ESL_GETOPTS *g, int i, char *val, int setby)
+{
+ char *where = NULL;
+
+ if (setby == eslARG_SETBY_DEFAULT) where = "as default";
+ else if (setby == eslARG_SETBY_CMDLINE) where = "on cmdline";
+ else if (setby == eslARG_SETBY_ENV) where = "in env";
+ else if (setby >= eslARG_SETBY_CFGFILE) where = "in cfgfile";
+
+ /* A special case: Any option may be "unset" by default by having a
+ * NULL default value. Thus, for instance, an eslARG_REAL can be
+ * off by default, or set to a value by a command line option.
+ */
+ if (setby == eslARG_SETBY_DEFAULT && val == NULL)
+ return eslOK;
+
+ switch (g->opt[i].type) {
+ case eslARG_NONE:
+ /* treat as unchecked, because val may be "on", 0x1, "true", etc.:
+ * any non-NULL ptr means on, and NULL means off.
+ */
+ break;
+
+ case eslARG_INT:
+ if (! esl_str_IsInteger(val))
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Option %.24s takes integer arg; got %.24s %s",
+ g->opt[i].name, val, where);
+
+ if (verify_integer_range(val, g->opt[i].range) != eslOK)
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "option %.24s takes integer arg in range %.24s; got %.24s %s",
+ g->opt[i].name, g->opt[i].range, val, where);
+ break;
+
+ case eslARG_REAL:
+ if (! esl_str_IsReal(val))
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Option %.24s takes real-valued arg; got %.24s %s",
+ g->opt[i].name, val, where);
+
+ if (verify_real_range(val, g->opt[i].range) != eslOK)
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Option %.24s takes real-valued arg in range %.24s; got %.24s %s",
+ g->opt[i].name, g->opt[i].range, val, where);
+ break;
+
+ case eslARG_CHAR:
+ if (strlen(val) > 1)
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Option %.24s takes char arg; got %.24s %s",
+ g->opt[i].name, val, where);
+
+ if (verify_char_range(val, g->opt[i].range) != eslOK)
+ ESL_FAIL(eslESYNTAX, g->errbuf,
+ "Option %.24s takes char arg in range %.24s; got %.24s %s",
+ g->opt[i].name, g->opt[i].range, val, where);
+ break;
+
+ case eslARG_STRING: /* unchecked type. */
+ case eslARG_INFILE:
+ case eslARG_OUTFILE:
+ if (g->opt[i].range != NULL)
+ ESL_EXCEPTION(eslEINVAL, "option %s takes a string arg that can't be range checked", g->opt[i].name);
+ break;
+
+ default:
+ ESL_EXCEPTION(eslEINVAL, "no such argument type");
+ }
+
+ return eslOK;
+}
+
+
+/* verify_integer_range():
+ *
+ * Returns <eslOK> if the string <arg>, when converted to an integer
+ * by atoi(), gives a value that lies within the given <range>, if
+ * <range> is non-NULL. (If <range> is NULL, there is no constraint on
+ * the range of this <arg>, so return TRUE.) Else, <arg> does not lie
+ * in the <range>; return <eslERANGE> (a user input error). If <range>
+ * itself is misformatted, return <eslEINVAL> (a coding error).
+ *
+ * Range must be in one of three formats, matched
+ * by these regexps (though regexps aren't used by the
+ * parser):
+ * n>=?(\d+) lower bound
+ * n<=?(\d+) upper bound
+ * (\d+)<=?n<=?(\d+) lower and upper bound
+ * Optional = signs indicate whether a bound is
+ * inclusive or not. The "n" character indicates the
+ * given integer value.
+ *
+ * Returns: <eslOK>: <arg> is within allowed <range>.
+ * <eslERANGE>: <arg> is not within allowed <range>.
+ * <eslEINVAL>: something wrong with <range> string.
+ */
+static int
+verify_integer_range(char *arg, char *range)
+{
+ int n;
+ int upper, lower; /* upper, lower bounds */
+ char *up, *lp;
+ int geq, leq; /* use >=, <= instead of >, < */
+
+ if (range == NULL) return eslOK;
+ n = atoi(arg);
+
+ if (parse_rangestring(range, 'n', &lp, &geq, &up, &leq) != eslOK) return eslEINVAL;
+
+ if (lp != NULL) {
+ lower = atoi(lp);
+ if ((geq && ! (n >= lower)) || (!geq && !(n > lower))) return eslERANGE;
+ }
+
+ if (up != NULL) {
+ upper = atoi(up);
+ if ((leq && ! (n <= upper)) || (!leq && !(n < upper))) return eslERANGE;
+ }
+ return eslOK;
+}
+
+
+
+/* verify_real_range():
+ *
+ * Verify that a string <arg>, when converted to a
+ * double-precision real by atof(), gives a value that lies
+ * within the range defined by <range>. If <range> is NULL,
+ * there is no range constraint, and any <arg> is valid.
+ *
+ * Returns: <eslOK>: <arg> is within allowed <range>.
+ * <eslERANGE>: <arg> is not within allowed <range>.
+ * <eslEINVAL>: something wrong with <range> string.
+ */
+static int
+verify_real_range(char *arg, char *range)
+{
+ double x;
+ double upper, lower; /* upper, lower bounds */
+ char *up, *lp;
+ int geq, leq; /* use >=, <= instead of >, < */
+
+ if (range == NULL) return eslOK;
+ x = atof(arg);
+
+ if (parse_rangestring(range, 'x', &lp, &geq, &up, &leq) != eslOK)
+ return eslEINVAL;
+
+ if (lp != NULL)
+ {
+ lower = atof(lp);
+ if ((geq && ! (x >= lower)) || (!geq && !(x > lower)))
+ return eslERANGE;
+ }
+
+ if (up != NULL)
+ {
+ upper = atof(up);
+ if ((leq && ! (x <= upper)) || (!leq && !(x < upper)))
+ return eslERANGE;
+ }
+ return eslOK;
+}
+
+
+/* verify_char_range():
+ *
+ * Verify that a string <arg>, when interpreted as a single
+ * char argument, is a character that lies within the defined
+ * <range>. If <range> is NULL, there is no range constraint,
+ * and any <arg> is valid.
+ *
+ * Currently, <range> expression is limited to ASCII chars that can be
+ * expressed as single chars. Could improve by allowing integer ASCII
+ * codes, or backslash escapes.
+ *
+ * Returns: <eslOK>: <arg> is within allowed <range>.
+ * <eslERANGE>: <arg> is not within allowed <range>.
+ * <eslEINVAL>: something wrong with <range> string.
+ */
+static int
+verify_char_range(char *arg, char *range)
+{
+ char c;
+ char *upper, *lower;
+ int geq, leq; /* use >=, <= instead of >, < */
+
+ if (range == NULL) return eslOK;
+ c = *arg;
+
+ if (parse_rangestring(range, 'c', &lower, &geq, &upper, &leq) != eslOK)
+ return eslEINVAL;
+
+ if (lower != NULL)
+ {
+ if ((geq && ! (c >= *lower)) || (!geq && !(c > *lower)))
+ return eslERANGE;
+ }
+
+ if (upper != NULL)
+ {
+ if ((leq && ! (c <= *upper)) || (!leq && !(c < *upper)))
+ return eslERANGE;
+ }
+ return eslOK;
+}
+
+
+
+/* parse_rangestring():
+ *
+ * Given a range definition string in one of the following forms:
+ * c>=?(\d+) lower bound
+ * c<=?(\d+) upper bound
+ * (\d+)<=?c<=?(\d+) lower and upper bound
+ * where <c> is a one-character marker expected for the
+ * argument type ('n' for integers, 'f' for floating-point values,
+ * 'c' for characters).
+ *
+ * Sets pointers to upper and lower bound strings, for parsing by
+ * atoi() or atof() as appropriate.
+ * Sets geq, leq flags to TRUE if bounds are supposed to be inclusive.
+ *
+ * Returns <eslOK> on success, <eslEINVAL> if the range string
+ * is invalid. No errors are thrown here, so caller can format a
+ * useful error message if range string is bogus.
+ */
+static int
+parse_rangestring(char *range, char c, char **ret_lowerp, int *ret_geq, char **ret_upperp, int *ret_leq)
+{
+ char *ptr;
+
+ *ret_geq = *ret_leq = FALSE; /* 'til proven otherwise */
+ *ret_lowerp = *ret_upperp = NULL; /* 'til proven otherwise */
+
+ if ((ptr = strchr(range, c)) == NULL) return eslEINVAL;
+ if (ptr == range) /* we're "n>=a" or "n<=b" form, where n came first */
+ {
+ if (ptr[1] == '>') /* "n>=a" form; lower bound */
+ {
+ if (ptr[2] == '=') { *ret_geq = TRUE; *ret_lowerp = ptr+3; }
+ else *ret_lowerp = ptr+2;
+ }
+ else if (ptr[1] == '<') /* "n<=a" form; upper bound */
+ {
+ if (ptr[2] == '=') { *ret_leq = TRUE; *ret_upperp = ptr+3; }
+ else *ret_upperp = ptr+2;
+ }
+ else return eslEINVAL;
+ }
+ else /* we're in a<=n<=b form; upper bound after n, lower before */
+ {
+ if (*(ptr+1) != '<') return eslEINVAL;
+ if (*(ptr+2) == '=') { *ret_leq = TRUE; *ret_upperp = ptr+3; } else *ret_upperp = ptr+2;
+
+ ptr--;
+ if (*ptr == '=') { *ret_geq = TRUE; ptr--; }
+ if (*ptr != '<') return eslEINVAL;
+ *ret_lowerp = range; /* start of string */
+ }
+ return eslOK;
+}
+
+/*-------------- end of private type/range-checking functions ----------------*/
+
+
+
+
+/*****************************************************************
+ * Private functions for checking optlists (toggles, required options,
+ * and incompatible options
+ *****************************************************************/
+
+/* process_optlist():
+ *
+ * Given a pointer <s> to the next option name in
+ * a comma-delimited list, figure out what option
+ * this is; set <ret_opti> to its index. If another
+ * option remains in the optlist, reset <s> to
+ * the start of it, for the next call to process_optlist().
+ * If no options remain after this one, reset <s> to NULL.
+ *
+ * Returns: <eslOK> if an option has been successfully parsed
+ * out of the list and <ret_opti> is valid;
+ * <eslEOD> if no more option remains (<s> is NULL,
+ * or points to a \0).
+ * <eslEINVAL> if an option in the list isn't
+ * recognized (a coding error).
+ */
+static int
+process_optlist(ESL_GETOPTS *g, char **ret_s, int *ret_opti)
+{
+ char *s;
+ int i;
+ int n;
+
+ if ((s = *ret_s) == NULL) return eslEOD;
+ if (*s == '\0') return eslEOD;
+
+ n = strcspn(s, ",");
+
+ /* a little weak here; we're only matching a n-long prefix, so we're
+ * not going to catch the case where the optlist contains a
+ * truncated, ambiguous optionname. but optlists are not user
+ * input, so the answer to this problem is "don't do that".
+ */
+ for (i = 0; i < g->nopts; i++)
+ if (strncmp(g->opt[i].name, s, n) == 0) break;
+ if (i == g->nopts) return eslEINVAL;
+
+ *ret_opti = i;
+ if (s[n] == ',') *ret_s = s+n+1;
+ else *ret_s = NULL;
+
+ return eslOK;
+}
+
+/*------- end of private functions for processing optlists -----------*/
+
+
+
+/*****************************************************************
+ * 6. Test driver.
+ *****************************************************************/
+
+#ifdef eslGETOPTS_TESTDRIVE
+/* gcc -g -Wall -o getopts_utest -I. -DeslGETOPTS_TESTDRIVE esl_getopts.c easel.c
+ */
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+
+/*::cexcerpt::getopts_bigarray::begin::*/
+#define BGROUP "-b,--no-b"
+static ESL_OPTIONS options[] = {
+ /* name type default env_var range toggles req incompat help docgroup */
+ { "-a", eslARG_NONE, FALSE,"FOOTEST",NULL, NULL, NULL, NULL, "toggle a on", 1 },
+ { "-b", eslARG_NONE, FALSE, NULL, NULL, BGROUP, NULL, NULL, "toggle b on", 1 },
+ { "--no-b", eslARG_NONE,"TRUE", NULL, NULL, BGROUP, NULL, NULL, "toggle b off", 1 },
+ { "-c", eslARG_CHAR, "x", NULL,"a<=c<=z",NULL, NULL, NULL, "character arg", 2 },
+ { "--d1", eslARG_NONE,"TRUE", NULL, NULL, "--d2", NULL, NULL, "toggle d1 on, d2 off", 2 },
+ { "--d2", eslARG_NONE, FALSE, NULL, NULL, "--d1", NULL, NULL, "toggle d2 on, d1 off", 2 },
+ { "-n", eslARG_INT, "0", NULL,"0<=n<10",NULL, NULL, NULL, "integer arg", 2 },
+ { "-x", eslARG_REAL, "0.8", NULL, "0<x<1", NULL, NULL, NULL, "real-value arg", 2 },
+ { "--lowx", eslARG_REAL, "1.0", NULL, "x>0", NULL, NULL, NULL, "real arg with lower bound", 2 },
+ { "--hix", eslARG_REAL, "0.9", NULL, "x<1", NULL, NULL, NULL, "real arg with upper bound", 2 },
+ { "--lown", eslARG_INT, "42", NULL, "n>0", NULL,"-a,-b", NULL, "int arg with lower bound", 2 },
+ { "--hin", eslARG_INT, "-1", NULL, "n<0", NULL, NULL,"--no-b","int arg with upper bound", 2 },
+ { "--host", eslARG_STRING, "","HOSTTEST",NULL, NULL, NULL, NULL, "string arg with env var", 3 },
+ { "--multi",eslARG_STRING,NULL, NULL, NULL, NULL, NULL, NULL, "test quoted configfile arg",3 },
+ { "--mul", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "test long opt abbreviation",3 }, /* xref bug #e4 */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+/*::cexcerpt::getopts_bigarray::end::*/
+
+int
+main(void)
+{
+ ESL_GETOPTS *go;
+ char file1[32] = "esltmpXXXXXX";
+ char file2[32] = "esltmpXXXXXX";
+ char *errmsg = "getopts unit test failure";
+ FILE *f1, *f2;
+ int i;
+
+ /* Declare a "command line" internally. */
+ int argc = 11; /* progname; 8 options; 2 args */
+ char *argv[] = { "progname", "-bc", "y", "--d1", "-n9", "--hix=0.0", "--lown", "43", "--mul", "arg1", "2005"};
+
+ /* Create a config file #1. */
+ if (esl_tmpfile_named(file1, &f1) != eslOK) esl_fatal("failed to create named tmpfile 1");
+ fprintf(f1, "# Test config file #1\n");
+ fprintf(f1, "#\n");
+ fprintf(f1, "-b\n");
+ fprintf(f1, "--d2\n");
+ fprintf(f1, "-n 3\n");
+ fprintf(f1, "-x 0.5\n");
+ fprintf(f1, "--multi \"one two three\"\n");
+ fclose(f1);
+
+ /* Create config file #2. */
+ if (esl_tmpfile_named(file2, &f2) != eslOK) esl_fatal("failed to create named tmpfile 2");
+ fprintf(f2, "# Test config file #2\n");
+ fprintf(f2, "#\n");
+ fprintf(f2, "--no-b\n");
+ fprintf(f2, "--hin -33\n");
+ fprintf(f2, "--host www.nytimes.com\n");
+ fclose(f2);
+
+ /* Put some test vars in the environment.
+ * (Note: apparently, on some OS's (Mac OS/X), setenv() necessarily leaks memory.)
+ */
+ setenv("FOOTEST", "", 1);
+ setenv("HOSTTEST", "wasp.cryptogenomicon.org", 1);
+
+ /* Open the test config files for reading.
+ */
+ if ((f1 = fopen(file1, "r")) == NULL) esl_fatal("getopts fopen() 1 failed");
+ if ((f2 = fopen(file2, "r")) == NULL) esl_fatal("getopts fopen() 2 failed");
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessConfigfile(go, file1, f1) != eslOK) esl_fatal("getopts failed to process config file 1\n%s\n", go->errbuf);
+ if (esl_opt_ProcessConfigfile(go, file2, f2) != eslOK) esl_fatal("getopts failed to process config file 2\n%s\n", go->errbuf);
+ if (esl_opt_ProcessEnvironment(go) != eslOK) esl_fatal("getopts failed to process environment:\n%s\n", go->errbuf);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) esl_fatal("getopts failed to process command line:\n%s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) esl_fatal("getopts config fails validation:\n%s\n", go->errbuf);
+
+ fclose(f1);
+ fclose(f2);
+
+ if (esl_opt_GetBoolean(go, "-a") != TRUE) esl_fatal("getopts failed on -a"); /* -a is ON: by environment */
+ if (esl_opt_GetBoolean(go, "-b") != TRUE) esl_fatal("getopts failed on -b"); /* -b is toggled thrice, ends up ON */
+ if (esl_opt_GetBoolean(go, "--no-b") != FALSE) esl_fatal("getopts failed on --no-b"); /* so --no-b is OFF */
+ if (esl_opt_GetChar (go, "-c") != 'y') esl_fatal("getopts failed on -c"); /* set to y on cmdline in an optstring */
+ if (esl_opt_GetInteger(go, "-n") != 9) esl_fatal("getopts failed on -n"); /* cfgfile, then on cmdline as linked arg*/
+ if (esl_opt_GetReal (go, "-x") != 0.5) esl_fatal("getopts failed on -x"); /* cfgfile #1 */
+ if (esl_opt_GetReal (go, "--lowx") != 1.0) esl_fatal("getopts failed on --lowx"); /* stays at default */
+ if (esl_opt_GetReal (go, "--hix") != 0.0) esl_fatal("getopts failed on --hix"); /* arg=x format on cmdline */
+ if (esl_opt_GetInteger(go, "--lown") != 43) esl_fatal("getopts failed on --lown"); /* cmdline; requires -a -b */
+ if (esl_opt_GetInteger(go, "--hin") != -33) esl_fatal("getopts failed on --hin"); /* cfgfile 2; requires --no-b to be off */
+ if (esl_opt_GetBoolean(go, "--mul") != TRUE) esl_fatal("getopts failed on --mul"); /* --mul should not be confused with --multi by abbrev parser*/
+ if (strcmp(esl_opt_GetString(go, "--host"), "wasp.cryptogenomicon.org") != 0)
+ esl_fatal("getopts failed on --host"); /* cfgfile 2, then overridden by environment */
+ if (strcmp(esl_opt_GetString(go, "--multi"), "one two three") != 0)
+ esl_fatal("config file didn't handle quoted argument");
+
+ /* --d1, --d2 test that we can resolve the difference between IsDefault(), IsOn(), and IsUsed() */
+ /* these options, despite getting toggled twice on/off, remain at default values;
+ * so d1 is default, on, and not used (because it's default); d2 is default, off, and not used.
+ * IsDefault IsOn IsUsed
+ * ------- ----- -------
+ * true true true [can't happen: option must be non-default to be considered "in use"]
+ * true true false --d1 for example, despite being toggled twice
+ * true false true [can't happen: option must be non-default to be considered "in use"]
+ * true false false --d2 for example, despite being toggled twice
+ * false true true -a,-b for example
+ * false true false [can't happen: if option is ON and not in default state, it's "in use"]
+ * false false true [can't happen: if option is OFF, it's not "in use"]
+ * false false false --no-b for example
+ */
+ if (! esl_opt_IsDefault(go, "--d1")) esl_fatal(errmsg);
+ if (! esl_opt_IsOn (go, "--d1")) esl_fatal(errmsg);
+ if ( esl_opt_IsUsed (go, "--d1")) esl_fatal(errmsg);
+ if (! esl_opt_IsDefault(go, "--d2")) esl_fatal(errmsg);
+ if ( esl_opt_IsOn (go, "--d2")) esl_fatal(errmsg);
+ if ( esl_opt_IsUsed (go, "--d2")) esl_fatal(errmsg);
+ if ( esl_opt_IsDefault(go, "-a")) esl_fatal(errmsg);
+ if (! esl_opt_IsOn (go, "-a")) esl_fatal(errmsg);
+ if (! esl_opt_IsUsed (go, "-a")) esl_fatal(errmsg);
+ if ( esl_opt_IsDefault(go, "-b")) esl_fatal(errmsg);
+ if (! esl_opt_IsOn (go, "-b")) esl_fatal(errmsg);
+ if (! esl_opt_IsUsed (go, "-b")) esl_fatal(errmsg);
+ if ( esl_opt_IsDefault(go, "--no-b")) esl_fatal(errmsg);
+ if ( esl_opt_IsOn (go, "--no-b")) esl_fatal(errmsg);
+ if ( esl_opt_IsUsed (go, "--no-b")) esl_fatal(errmsg);
+
+ for (i = 0; i < go->nopts; i++)
+ { /* Test that no option is in an impossible default/on/used state according to logic table above */
+ if ( esl_opt_IsDefault(go, go->opt[i].name) && esl_opt_IsOn(go, go->opt[i].name) && esl_opt_IsUsed(go, go->opt[i].name)) esl_fatal(errmsg);
+ if ( esl_opt_IsDefault(go, go->opt[i].name) && ! esl_opt_IsOn(go, go->opt[i].name) && esl_opt_IsUsed(go, go->opt[i].name)) esl_fatal(errmsg);
+ if (! esl_opt_IsDefault(go, go->opt[i].name) && esl_opt_IsOn(go, go->opt[i].name) && ! esl_opt_IsUsed(go, go->opt[i].name)) esl_fatal(errmsg);
+ if (! esl_opt_IsDefault(go, go->opt[i].name) && ! esl_opt_IsOn(go, go->opt[i].name) && esl_opt_IsUsed(go, go->opt[i].name)) esl_fatal(errmsg);
+ }
+
+ /* Now the two remaining argv[] elements are the command line args
+ */
+ if (esl_opt_ArgNumber(go) != 2) esl_fatal("getopts failed with wrong arg number");
+
+ if (strcmp("arg1", esl_opt_GetArg(go, 1)) != 0) esl_fatal("getopts failed on argument 1");
+ if (strcmp("2005", esl_opt_GetArg(go, 2)) != 0) esl_fatal("getopts failed on argument 2");
+
+ esl_getopts_Destroy(go);
+ remove(file1);
+ remove(file2);
+ exit(0);
+}
+
+#endif /*eslGETOPTS_TESTDRIVE*/
+/*-------------- end of test driver -------------------------*/
+
+/*****************************************************************
+ * 7. Examples.
+ *****************************************************************/
+
+/* The starting example of "standard" getopts behavior, without
+ * any of the bells and whistles.
+ * Compile:
+ gcc -g -Wall -o getopts_example -I. -DeslGETOPTS_EXAMPLE esl_getopts.c easel.c
+ */
+#ifdef eslGETOPTS_EXAMPLE
+/*::cexcerpt::getopts_example::begin::*/
+#include <stdio.h>
+#include "easel.h"
+#include "esl_getopts.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type def env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { "-a", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "a boolean switch", 0},
+ { "-b", eslARG_NONE,"default",NULL,NULL, NULL, NULL, NULL, "another boolean switch", 0},
+ { "-n", eslARG_INT, "0", NULL, NULL, NULL, NULL, NULL, "an integer argument", 0},
+ { "-s", eslARG_STRING,"hi!", NULL, NULL, NULL, NULL, NULL, "a string argument", 0},
+ { "-x", eslARG_REAL, "1.0", NULL, NULL, NULL, NULL, NULL, "a real-valued argument", 0},
+ { "--file", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "long option, with filename arg", 0},
+ { "--char", eslARG_CHAR, "", NULL, NULL, NULL, NULL, NULL, "long option, with character arg",0},
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "Usage: ./example [-options] <arg>";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go;
+ char *arg;
+
+ if ((go = esl_getopts_Create(options)) == NULL) esl_fatal("Bad options structure\n");
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) esl_fatal("Failed to parse command line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) esl_fatal("Failed to parse command line: %s\n", go->errbuf);
+
+ if (esl_opt_GetBoolean(go, "-h") == TRUE) {
+ puts(usage);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80); /* 0=all docgroups; 2=indentation; 80=width */
+ return 0;
+ }
+ if (esl_opt_ArgNumber(go) != 1) esl_fatal("Incorrect number of command line arguments.\n%s\n", usage);
+
+ arg = esl_opt_GetArg(go, 1);
+
+ printf("Option -a: %s\n", esl_opt_GetBoolean(go, "-a") ? "on" : "off");
+ printf("Option -b: %s\n", esl_opt_GetBoolean(go, "-b") ? "on" : "off");
+ printf("Option -n: %d\n", esl_opt_GetInteger(go, "-n"));
+ printf("Option -s: %s\n", esl_opt_GetString( go, "-s"));
+ printf("Option -x: %f\n", esl_opt_GetReal( go, "-x"));
+ if (esl_opt_IsUsed(go, "--file")) printf("Option --file: %s\n", esl_opt_GetString(go, "--file"));
+ else printf("Option --file: (not set)\n");
+ printf("Option --char: %c\n", esl_opt_GetChar(go, "--char"));
+ printf("Cmdline arg: %s\n", arg);
+
+ esl_getopts_Destroy(go);
+ return 0;
+}
+/*::cexcerpt::getopts_example::end::*/
+#endif /*eslGETOPTS_EXAMPLE*/
+
+/* Using <esl_getopts_CreateDefaultApp()> implements a standard series
+ * of events, including how the -h (help) option is handled.
+ * Compile:
+ gcc -g -Wall -o getopts_example2 -I. -DeslGETOPTS_EXAMPLE2 esl_getopts.c easel.c
+ */
+#ifdef eslGETOPTS_EXAMPLE2
+/*::cexcerpt::getopts_example2::begin::*/
+#include <stdio.h>
+#include "easel.h"
+#include "esl_getopts.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { "-a", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "a boolean switch", 0},
+ { "-n", eslARG_INT, "42",NULL, NULL, NULL, NULL, NULL, "an integer", 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char banner[] = "example of using simplest getopts creation";
+static char usage[] = "[-options] <arg1> <arg2>";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 2, argc, argv, banner, usage);
+ char *arg1 = esl_opt_GetArg(go, 1);
+ char *arg2 = esl_opt_GetArg(go, 2);
+ int a = esl_opt_GetBoolean(go, "-a");
+ int n = esl_opt_GetInteger(go, "-n");
+
+ printf("arg 1: %s\n", arg1);
+ printf("arg 2: %s\n", arg2);
+ printf("option a: %s\n", (a ? "true" : "false"));
+ printf("option n: %d\n", n);
+
+ esl_getopts_Destroy(go);
+ return 0;
+}
+/*::cexcerpt::getopts_example2::end::*/
+#endif /*eslGETOPTS_EXAMPLE2*/
+/*-------------- end of examples ---------------------*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
+
+
diff --git a/esl_getopts.h b/esl_getopts.h
new file mode 100644
index 0000000..0839a5c
--- /dev/null
+++ b/esl_getopts.h
@@ -0,0 +1,121 @@
+/* Command line, config file, and environment variable
+ * configuration of an application. Extends standard
+ * UNIX/POSIX/GNU getopt().
+ *
+ */
+#ifndef eslGETOPTS_INCLUDED
+#define eslGETOPTS_INCLUDED
+
+#include "easel.h"
+
+/* Object: ESL_OPTIONS
+ *
+ * The application main.c defines an array of <ESL_OPTIONS> structures to
+ * define what configuration options are used. The array is
+ * terminated by a structure containing { NULL, NULL, NULL, 0, NULL,
+ * NULL, NULL, NULL} (or more simply, just 0 in all 8 fields.)
+ */
+/*::cexcerpt::options_object::begin::*/
+typedef struct {
+ char *name; /* either short "-a" or long "--foo" style */
+ int type; /* arg type, for type checking: (eslARG_INT, etc.) */
+ char *defval; /* default setting, or NULL ("default" is a C keyword) */
+ char *envvar; /* associated environ var ("BLASTDB"), or NULL */
+ char *range; /* for range checking arg: ("0<=x<=1", etc.) */
+ char *toggle_opts; /* comma-sep'd optlist: turn these off if this opt is on */
+ char *required_opts; /* comma-sep'd optlist: these must also be set */
+ char *incompat_opts; /* comma-sep'd optlist: these must not be set */
+ char *help; /* help/usage string */
+ int docgrouptag; /* integer tag for documentation groups */
+} ESL_OPTIONS;
+/*::cexcerpt::options_object::end::*/
+
+/* Argument types: the "type" variable in <ESL_OPTIONS>.
+ */
+#define eslARG_NONE 0 /* option takes no argument (so, is boolean) */
+#define eslARG_INT 1 /* arg convertable by atoi() <n> */
+#define eslARG_REAL 2 /* arg convertable by atof() <x> */
+#define eslARG_CHAR 3 /* arg is a single character <c> */
+#define eslARG_STRING 4 /* unchecked arg type <s> */
+#define eslARG_INFILE 5 /* input file - same as string, shown as <f> */
+#define eslARG_OUTFILE 6 /* output file - same as string, shown as <f> */
+
+
+
+/* Object: ESL_GETOPTS
+ *
+ * An <ESL_GETOPTS> object is created to parse configuration
+ * from command line options, config file(s), and environment
+ * variables.
+ */
+typedef struct {
+ ESL_OPTIONS *opt; /* array of app-defined options */
+ int nopts; /* number of options */
+
+ int argc; /* argc from command line */
+ char **argv; /* argv from command line */
+ int optind; /* position in argc; eventually 1st arg idx */
+ int nfiles; /* # of cfgfiles that have been processed */
+
+ char **val; /* config'ed val for each option (as string) */
+ int *setby; /* array [0..nopts-1] for who set option i */
+ int *valloc; /* 0, or length of alloc for val[i] */
+
+ char *optstring; /* internal: ptr into string of 1-char opts in argv[] */
+ char *spoof; /* internal allocation: ProcessSpoof() stores cmdline */
+ char **spoof_argv; /* internal allocation: ProcessSpoof()'s ptrs into its cmdline */
+
+ char errbuf[eslERRBUFSIZE]; /* buffer for reporting user error */
+} ESL_GETOPTS;
+
+
+/* Possible values of the <setby> variable in ESL_GETOPTS.
+ * Additionally, values of >3 also indicate a config file, in order
+ * of _ProcessConfigFile() calls (that is, setby=3 is the first
+ * config file, setby=4 is the second, etc.).
+ */
+#define eslARG_SETBY_DEFAULT 0
+#define eslARG_SETBY_CMDLINE 1
+#define eslARG_SETBY_ENV 2
+#define eslARG_SETBY_CFGFILE 3
+
+
+/* The visible API.
+ */
+extern ESL_GETOPTS *esl_getopts_Create(ESL_OPTIONS *opt);
+extern ESL_GETOPTS *esl_getopts_CreateDefaultApp(ESL_OPTIONS *options, int nargs, int argc, char **argv, char *banner, char *usage);
+extern int esl_getopts_Reuse (ESL_GETOPTS *g);
+extern void esl_getopts_Destroy(ESL_GETOPTS *g);
+extern void esl_getopts_Dump(FILE *ofp, ESL_GETOPTS *g);
+
+extern int esl_opt_ProcessConfigfile (ESL_GETOPTS *g, char *filename, FILE *fp);
+extern int esl_opt_ProcessEnvironment(ESL_GETOPTS *g);
+extern int esl_opt_ProcessCmdline (ESL_GETOPTS *g, int argc, char **argv);
+extern int esl_opt_ProcessSpoof (ESL_GETOPTS *g, const char *cmdline);
+extern int esl_opt_VerifyConfig (ESL_GETOPTS *g);
+extern int esl_opt_ArgNumber (const ESL_GETOPTS *g);
+extern int esl_opt_SpoofCmdline(const ESL_GETOPTS *g, char **ret_cmdline);
+
+extern int esl_opt_GetSetter(const ESL_GETOPTS *g, char *optname);
+
+extern int esl_opt_IsDefault (const ESL_GETOPTS *g, char *optname);
+extern int esl_opt_IsOn (const ESL_GETOPTS *g, char *optname);
+extern int esl_opt_IsUsed (const ESL_GETOPTS *g, char *optname);
+
+extern int esl_opt_GetBoolean(const ESL_GETOPTS *g, char *optname);
+extern int esl_opt_GetInteger(const ESL_GETOPTS *g, char *optname);
+extern double esl_opt_GetReal (const ESL_GETOPTS *g, char *optname);
+extern char esl_opt_GetChar (const ESL_GETOPTS *g, char *optname);
+extern char *esl_opt_GetString (const ESL_GETOPTS *g, char *optname);
+extern char *esl_opt_GetArg (const ESL_GETOPTS *g, int which);
+
+extern int esl_opt_DisplayHelp(FILE *ofp, ESL_GETOPTS *go, int docgroup, int indent, int textwidth);
+
+#endif /*eslGETOPTS_INCLUDED*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_getopts.tex b/esl_getopts.tex
new file mode 100644
index 0000000..c18ab16
--- /dev/null
+++ b/esl_getopts.tex
@@ -0,0 +1,668 @@
+
+The \eslmod{getopts} module interprets UNIX command line syntax. It
+allows both standard POSIX one-character options and GNU-style long
+options, in addition to command line arguments. The implementation
+shares similarities with POSIX \ccode{getopt()} and GNU's
+\ccode{getopt\_long()}. It has additional abilities, at the cost of
+enforcing a specific style.
+
+In addition to setting options from the command line, options may also
+be configured so they can be set by environment variables, or by one
+or more configuration files.
+
+Option arguments can be automatically checked for valid type
+(integers, real numbers, characters, or strings). Numeric arguments
+can also be checked for valid range (for instance, ensuring that a
+probability is in the range $0 \leq x \leq 1$).
+
+Options can be linked into ``toggle groups'', such that setting one
+option automatically unsets others.
+
+You can specify that an option isn't legal unless other required
+options are also set, or conversely that an option is incompatible
+with one or more other options.
+
+A standardized usage/help display for command line options can be
+printed directly from the internal information, including default
+values and range restrictions when line length allows.
+
+This is all configured by defining an array of \ccode{ESL\_OPTIONS}
+structures that provide the necessary information. This array is
+turned into a \ccode{ESL\_GETOPTS} object, which is used to determine
+and store the configuration state of your application according to the
+command line, environment variables, and configuration files.
+
+The \ccode{ESL\_GETOPTS} object can be queried directly when your
+program executes configuration-dependent steps. There is often no need
+to store configuration information in other variables in your
+program. This simplifies code structure, by allowing you to pass the
+complete configuration state of your application in one capsule to
+functions other than \ccode{main()}. This is especially useful in
+applications where \ccode{main()} is a dispatch wrapper, such as the
+masters and workers in a parallelized MPI program, for example.
+
+Table~\ref{tbl:getopts_api} lists the functions in the
+\eslmod{getopts} API. The module implements a \ccode{ESL\_GETOPTS}
+object that holds the configuration state of the application, and an
+\ccode{ESL\_OPTIONS} structure that contains information about one
+configurable option. An application defines an array of
+\ccode{ESL\_OPTIONS} to declare what options it will allow.
+
+% Table generated by autodoc -t esl_getopts.c (so don't edit here, edit esl_getopts.c:)
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\apisubhead{The \ccode{ESL\_GETOPTS} object}\\
+\hyperlink{func:esl_getopts_Create()}{\ccode{esl\_getopts\_Create()}} & Create a new \ccode{ESL\_GETOPTS} object.\\
+\hyperlink{func:esl_getopts_CreateDefaultApp()}{\ccode{esl\_getopts\_CreateDefaultApp()}} & Initialize a standard Easel application.\\
+\hyperlink{func:esl_getopts_Reuse()}{\ccode{esl\_getopts\_Reuse()}} & Reset application state to default.\\
+\hyperlink{func:esl_getopts_Destroy()}{\ccode{esl\_getopts\_Destroy()}} & Destroys an \ccode{ESL\_GETOPTS} object.\\
+\hyperlink{func:esl_getopts_Dump()}{\ccode{esl\_getopts\_Dump()}} & Dumps a summary of a \ccode{ESL\_GETOPTS} configuration.\\
+\apisubhead{Setting and testing a configuration}\\
+\hyperlink{func:esl_opt_ProcessConfigfile()}{\ccode{esl\_opt\_ProcessConfigfile()}} & Parses options in a config file.\\
+\hyperlink{func:esl_opt_ProcessEnvironment()}{\ccode{esl\_opt\_ProcessEnvironment()}} & Parses options in the environment.\\
+\hyperlink{func:esl_opt_ProcessCmdline()}{\ccode{esl\_opt\_ProcessCmdline()}} & Parses options from the command line.\\
+\hyperlink{func:esl_opt_ProcessSpoof()}{\ccode{esl\_opt\_ProcessSpoof()}} & Parses a string as if it were a command line.\\
+\hyperlink{func:esl_opt_VerifyConfig()}{\ccode{esl\_opt\_VerifyConfig()}} & Validates configuration after options are set.\\
+\hyperlink{func:esl_opt_ArgNumber()}{\ccode{esl\_opt\_ArgNumber()}} & Returns number of command line arguments.\\
+\hyperlink{func:esl_opt_SpoofCmdline()}{\ccode{esl\_opt\_SpoofCmdline()}}& Create faux command line from current option configuration.\\
+\apisubhead{Retrieving option settings and command line args}\\
+\hyperlink{func:esl_opt_IsDefault()}{\ccode{esl\_opt\_IsDefault()}} & Returns \ccode{TRUE} if option remained at default setting.\\
+\hyperlink{func:esl_opt_IsOn()}{\ccode{esl\_opt\_IsOn()}} & Returns \ccode{TRUE} if option is set.\\
+\hyperlink{func:esl_opt_IsUsed()}{\ccode{esl\_opt\_IsUsed()}} & Returns \ccode{TRUE} if option is on, but not default.\\
+\hyperlink{func:esl_opt_GetBoolean()}{\ccode{esl\_opt\_GetBoolean()}} & Retrieve \ccode{TRUE}/\ccode{FALSE} for a boolean option.\\
+\hyperlink{func:esl_opt_GetInteger()}{\ccode{esl\_opt\_GetInteger()}} & Retrieve value of an integer option.\\
+\hyperlink{func:esl_opt_GetReal()}{\ccode{esl\_opt\_GetReal()}} & Retrieve value of a real-valued option.\\
+\hyperlink{func:esl_opt_GetChar()}{\ccode{esl\_opt\_GetChar()}} & Retrieve value of a character option.\\
+\hyperlink{func:esl_opt_GetString()}{\ccode{esl\_opt\_GetString()}} & Retrieve value of a string option.\\
+\hyperlink{func:esl_opt_GetArg()}{\ccode{esl\_opt\_GetArg()}} & Retrieve numbered command line argument.\\
+\hyperlink{func:esl_opt_DisplayHelp()}{\ccode{esl\_opt\_DisplayHelp()}} & Formats one-line help for each option.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{getopts} API.}
+\label{tbl:getopts_api}
+\end{table}
+
+
+\subsection{An example of using the getopts API}
+
+Figure~\ref{fig:getopts_example} shows an example of using five short
+options (including help) and two long options, without using any of
+getopts' optional validation or configuration mechanisms. The steps
+are:
+
+\begin{figure}
+\input{cexcerpts/getopts_example}
+\caption{An example of using the \eslmod{getopts} module.}
+\label{fig:getopts_example}
+\end{figure}
+
+\begin{itemize}
+\item The application defines an array of \ccode{ESL\_OPTIONS}
+ structures, one per option. Name, type, and default value fields
+ are required. The other fields are optional (though the help
+ string shouldn't be left NULL unless you're being lazy). The
+ array is terminated by an entry of all 0's.
+
+\item An application typically defines a helpful ``usage'' string,
+ which it prints out as part of help messages or error messages.
+ The \eslmod{getopts} module doesn't need this, though, so you're
+ free to format your messages however you like.
+
+\item A \ccode{ESL\_GETOPTS} object is created, using the options
+ array. At this point, all options are initialized to default
+ values inside the object.
+
+\item The application now processes option settings from the command
+ line, environment variables, and one or more configuration
+ files. The application can do this in any precedence order it
+ chooses. In the example, only the command line is processed.
+
+\item The call to \ccode{esl\_opt\_VerifyConfig(go)} validates the
+ configuration, before you attempt to retrieve any information
+ from it.
+
+\item Many of my applications (including Easel applications) typically
+ look for a \ccode{-h} option immediately, to print a short help
+ page. This isn't required by \eslmod{getopts}.
+
+\item The application will typically retrieve, validate, and store its
+ non-optional command line arguments in order and one at a time
+ using \ccode{esl\_opt\_GetArg()} calls early in the program.
+
+\item The application may then go off and do its thing, using
+ \ccode{\_Get*()} calls (and \ccode{\_IsUsed()} and
+ \ccode{\_IsDefault()} calls) to retrieve option information when
+ needed.
+
+\item On exit, the \ccode{ESL\_GETOPTS} object is free'd. This
+ object is the only place where memory is allocated. Any string
+ retrieved as an option or argument, for example, is a pointer
+ to internal memory maintained by the object. This makes it
+ dangerous to free the object until you know you're not accessing
+ any pointers it's returned to you, unless you've made copies.
+\end{itemize}
+
+An example of running this program:
+\begin{cchunk}
+ % ./getopts_example -ax 0.3 -n 42 --file foo --char x baz
+ Option -a: on
+ Option -b: on
+ Option -n: 42
+ Option -s: hi!
+ Option -x: 0.300000
+ Option --file: foo
+ Option --char: x
+ Cmdline arg: baz
+\end{cchunk}
+
+Note that because we set the default value of \ccode{-b} to TRUE in
+this example, it is always on whether we use the \ccode{-b} option or
+not.
+
+
+
+\subsection{Defining options in the \ccodeincmd{ESL\_OPTIONS} array}
+
+Since you define your options in a static array of
+\ccode{ESL\_OPTIONS} structures, you need to know what an
+\ccode{ESL\_OPTIONS} structure contains. The \ccode{ESL\_OPTIONS}
+structure is declared in \ccode{getopts.h} as:
+
+\input{cexcerpts/options_object}
+
+Each of these fields in the options array is described in detail below:
+
+ \subsubsection{Legal option names}
+
+All options must start with '-'. Options that start with one '-' are
+\textbf{short options}. Options that start with \ccode{--} are
+\textbf{long options}.
+
+Short option names must be a single alphanumeric character: \ccode{-n}
+or \ccode{-1}, for example. Short options can be concatenated on the
+command line: \ccode{-abc} is the same as \ccode{-a -b -c}.
+
+Long option names should contain only alphanumeric characters,
+\ccode{-}, or \ccode{\_}: \ccode{--foo} or \ccode{--foo-tastic}, for
+example. They must not contain space, tab, newline, \ccode{=}, or
+\ccode{,} characters, which will certainly confuse the option argument
+parsers. Other characters may happen to work, but nonetheless should
+not be used. Long options can be abbreviated (unambiguously) on the
+command line: if \ccode{--foobar} is an option, \ccode{--f} works too,
+so long as no other long option starts with the same prefix
+\ccode{--f}.
+
+You should avoid using option names that look like negative numbers if
+any of your other options would accept that value as a valid argument,
+so that Easel can robustly detect when a user forgets an option
+argument on the command line. For example, if \ccode{-n} takes an
+integer argument and \ccode{-1} is an option, and a user types
+\ccode{-n -1} on a commandline, the \ccode{-1} will be parsed as
+\ccode{-n}'s option, even if the user meant the \ccode{-1} as an
+option and had forgotten to add an argument for \ccode{-n}.
+
+ \subsubsection{Type checking}
+
+Seven argument types are recognized:
+
+% Any addition or subtraction to this list also requires updating
+% the c2optlist script in easel/devkit.
+\begin{center}
+\begin{tabular}{llll}
+\textbf{flag} & \textbf{description} & \textbf{abbrev} & \textbf{type checking} \\\hline
+\ccode{eslARG\_NONE} & Boolean switch (on/off) & n/a & n/a \\
+\ccode{eslARG\_INT} & integer & \ccode{<n>} & convertible by \ccode{atoi()}\\
+\ccode{eslARG\_REAL} & float or double & \ccode{<x>} & convertible by \ccode{atof()}\\
+\ccode{eslARG\_CHAR} & one character & \ccode{<c>} & single ASCII char \\
+\ccode{eslARG\_STRING} & any string & \ccode{<s>} & not checked\\
+\ccode{eslARG\_INFILE} & an input filename & \ccode{<f>} & not checked\\
+\ccode{eslARG\_OUTFILE} & an output filename & \ccode{<f>} & not checked\\
+\end{tabular}
+\end{center}
+
+
+All arguments are declared, configured, and stored internally as
+strings in a \ccode{ESL\_GETOPTS} object. For arguments that are
+declared to be of types \ccode{eslARG\_INT}, \ccode{eslARG\_REAL}, or
+\ccode{eslARG\_CHAR}, the string is checked to be sure it can be
+completely converted to the declared type.
+
+Strings are of type \ccode{eslARG\_STRING}, and since any string is
+valid (including a NULL pointer), this type is not checked. An
+application can also declare an argument to be of type
+\ccode{eslARG\_STRING} if for some reason it wants to bypass type
+checking. The application would recover the option setting with
+\ccode{esl\_opt\_GetStringOption()} and then deal with any type
+conversion itself.
+
+Input and output filenames can be declared as \ccode{eslARG\_INFILE}
+and \ccode{eslARG\_OUTFILE}, respectively. Currently both are unchecked
+types that are treated the same as a \ccode{eslARG\_STRING}, except
+that their arguments are indicated as \ccode{<f>} instead of
+\ccode{<s>} in help output. In the future, it might be useful to
+automatically check that input files exist and can be read, and that
+output files can be written.
+
+ \subsubsection{Default values}
+
+Since the \ccode{ESL\_GETOPTS} object stores all values internally as
+strings, default settings in the options array are also all provided
+as strings.
+
+For any type of option, \ccode{NULL}, \ccode{FALSE}, or 0 are all
+interpreted as the option being unset (OFF). Any non-NULL string value
+is interpreted as the option being set (ON).
+
+For boolean defaults, any non-NULL string is interpreted as
+\ccode{TRUE}, and the option is ON. For a boolean option that is ON
+by default, the only place where the string value matters is in
+formatting option help, where this string will be displayed as the
+default setting. Therefore, strings like \ccode{"default"},
+\ccode{"on"}, or \ccode{"true"} would be typical, to make the help
+string look right.
+
+Note that the syntax here is a little weird. The quotes around
+\ccode{"true"} and the absence of quotes around \ccode{FALSE} are
+important. \ccode{FALSE}, \ccode{NULL}, and \ccode{0} are all
+identical in the internal representation (evaluating to a null
+pointer).
+
+Integer, real-valued, and character arguments must be provided as
+strings: ``42'' not 42, ``1.0'' not 1.0, and ``x'' not 'x'. String
+arguments can be set to any string.
+
+Sometimes you want to have an option that is off by default, but can
+be optionally set to a value. That is, you may want to combine a
+boolean switch and a integer-, real-, char-, or string-valued
+option. To do this, make the default value \ccode{NULL}, which means
+``unset'', and when your code checks for the value of such an option,
+it must first use \ccode{esl\_opt\_IsOn()} to check if it's been set,
+before attempting to \ccode{esl\_opt\_Get*()} the value.
+
+There is no way to turn a boolean option off by a command line option,
+environment variable, or configuration file if its default setting is
+ON. Booleans (and strings, for that matter) can only be turned on when
+their option is selected. Booleans can be set to off by default, or
+toggled off indirectly by another option is turned on (see the section
+on toggle groups further below). The way to do this (to turn
+\ccode{-b} off) is to provide a counteroption (\ccode{--no-b}), and
+toggle-tie them together.
+
+ \subsubsection{Connecting an option to an environment variable}
+
+When an option is connected to an environment variable, setting the
+environment variable has the same result as setting the option on the
+command line.
+
+To check and process environment variables, the application calls
+\ccode{esl\_opt\_ProcessEnvironment()}.
+
+Boolean options are set by setting the environment variable with no
+argument, for instance (in a C-shell),
+
+\begin{cchunk}
+ % setenv FOO_DEBUGGING
+\end{cchunk}
+
+and other options are set by setting the environment variable to the
+appropriate argument, for instance (in a C-shell),
+
+\begin{cchunk}
+ % setenv FOO_DEBUG_LEVEL 5
+\end{cchunk}
+
+For example, if we connected the option name \ccode{--debug} to
+environment variable \ccode{"FOO\_DEBUGGING"} and option
+\ccode{--debuglevel} to environment variable \ccode{"FOO\_DEBUG\_LEVEL"}
+in an application \ccode{myapp}, then
+
+\begin{cchunk}
+ % myapp --debug --debuglevel 5
+\end{cchunk}
+
+is the same as
+
+\begin{cchunk}
+ % setenv FOO_DEBUGGING
+ % setenv FOO_DEBUG_LEVEL 5
+ % myapp
+\end{cchunk}
+
+An advantage of using environment variables is that if you want to
+configure some optional behavior more or less permanently, you can
+save yourself a lot of command line typing by setting that
+configuration in the environment (in your \ccode{.cshrc} or
+\ccode{.bashrc}, for example).
+
+
+ \subsubsection{Range checking}
+
+If a non-NULL range is provided, a configured argument (including the
+specified default setting) will be checked to be sure it satisfies a
+lower bound, upper bound, or both. Range checking only applies to
+integer, real, and char arguments. Boolean and string arguments should
+set their range fields to NULL.
+
+In a range string, a character \ccode{n}, \ccode{x}, or \ccode{c} is
+used to represent the argument. Bounds may either be exclusive ($<$ or
+$>$) or inclusive ($>=$ or $<=$). Examples of range strings specifying
+lower bounds are \ccode{"n>=0"}, \ccode{"x>1.0"}, and
+\ccode{"c>=A"}. Examples of range strings specifying upper bounds are
+\ccode{"n<0"}, \ccode{"x<=100.0"}, and \ccode{"c<=Z"}. Examples of
+range strings specifying both lower and upper bounds are
+\ccode{"0<n<=100"}, \ccode{"0<=x<=1"}, and \ccode{"a<=c<=z"}.
+
+Range checking occurs before any option is set.
+
+
+
+ \subsubsection{Setting toggle groups of options}
+
+If a non-NULL string \ccode{toggle\_opts} of ``toggle-tied'' options
+is set for option X, this is a comma-delimited list of options that
+are turned off when option X is turned on. This allows the application
+to define a group of options for which only one may be on. The
+application would set an appropriate one to be on by default, and the
+others to be off by default.
+
+For example, if you configure an option \ccode{-a} to have a
+\ccode{toggle\_opts} of \ccode{"-b,-c"}, then whenever \ccode{-a} is
+turned on, both \ccode{-b} and \ccode{-c} are automatically turned
+off.
+
+But this only defines the behavior when \ccode{-a} is selected. To
+get all three options to behave as a toggle group, you'd also want to
+set \ccode{toggle\_opts} for \ccode{-b} to \ccode{"-a,-c"}, and
+\ccode{toggle\_opts} for \ccode{-c} to \ccode{"-a,-b"}. This is a
+little redundant and messy; it's the result of the line-oriented,
+one-option-at-a-time definition of the \ccode{ESL\_OPTIONS}. These
+lists can get quite long, too.
+
+An option has no effect on itself when it appears in its own
+toggle-tied list. This lets you reduce the mess a bit. You can
+\ccode{\#define} a toggle group string:
+
+\begin{cchunk}
+ #define OPTGROUP1 "--option1,--option2,--option3,--option4"
+\end{cchunk}
+
+and use that \ccode{\#define} macro in the \ccode{ESL\_OPTIONS}.
+
+Although booleans may only be turned ON when their option is present,
+you can easily get the semantics of an on/off switch by defining
+another option that works as the off switch when it is selected. For
+example, you could define (GNU-ish) boolean options \ccode{--foo} and
+\ccode{--no-foo}, and set \ccode{toggle\_opts} for \ccode{--foo} to be
+\ccode{"--no-foo"} and vice versa.
+
+Toggle-tying should only be used for boolean options, but it will also
+work for string options (where turning a string option off means
+setting it to NULL). Toggle-tying an integer, real-valued, or char
+option will result in undefined behavior, because these options may
+not be turned off.
+
+Toggling behavior occurs immediately, whenever an option with a
+non-NULL \ccode{toggle\_opts} field is set.
+
+
+
+ \subsubsection{Specifying required or incompatible options}
+
+If a non-NULL string \ccode{required\_opts} is provided for option X,
+this specifies a comma-delimited list of additional options that must
+be on if option X is set.
+
+One case where this behavior is useful is when one (primary) option
+turns on a mode of application behavior, and other (secondary) options
+configure that mode. If a user tried to set the secondary options
+without turning on the mode in the first place, the application should
+issue a warning. So, if a mode was turned on by \ccode{--foomode} and
+configured by \ccode{--foolevel <x>}, one could set
+\ccode{required\_opts} to \ccode{"--foomode"} for the option
+\ccode{--foolevel}.
+
+Required options are validated when the application calls
+\ccode{esl\_opt\_VerifyConfig()}, presumably after all configuration
+information has been processed. This delayed verification allows the
+primary options to be set anywhere and in any order, before or after
+secondary options are set.
+
+The \ccode{incompat\_opts} field is the converse of
+\ccode{required\_opts}.It specifies a comma-delimited list of options
+that may \emph{not} also be on if option X is on.
+
+
+
+ \subsubsection{Example of a more fully featured \ccode{ESL\_OPTIONS} array}
+
+The test driver in \ccode{getopts.c} uses an options array that
+exercises all the optional features at least once:
+
+\input{cexcerpts/getopts_bigarray}
+
+
+\subsection{Formatting help}
+
+
+The \ccode{esl\_opt\_DisplayHelp()} function is intended to streamline
+the job of printing a brief help message, reminding the user of the
+command line options. It uses the help string to produce output like
+(from the example code above):
+
+\begin{cchunk}
+% ./example -h
+Usage: ./example [-options] <arg>
+
+ where options are:
+ -h : show help and usage
+ -a : a boolean switch
+ -b : another boolean switch [default]
+ -n <n> : an integer argument [0]
+ -x <x> : a real-valued argument [1.0]
+ --file <s> : long option, with filename arg
+ --char <c> : long option, with character arg
+\end{cchunk}
+
+One line is printed for each option, in the same order that they
+appear in the \ccode{ESL\_OPTIONS} array. The line is constructed from
+the mandatory option name, the mandatory argument type, and the
+optional help string.
+
+If there is room on the lines, default values are shown in brackets
+(when they are on or non-\ccode{NULL}). This display is all or none;
+if any line is too long, no default values are displayed.
+
+If there is still room on the lines, range restrictions are shown in
+parentheses. Like the default values, this display is also all or
+none.
+
+The amount of space on the line (in characters) is specified by the
+\ccode{textwidth} argument to \ccode{esl\_opt\_DisplayHelp()}, which
+might typically be 80. If any line is too long even without printing a
+default value and range restriction, an error is thrown; you need to
+either shorten the help string or increase the specified
+\ccode{textwidth}. (This is not a memory allocation
+issue. \ccode{textwidth} is provided as a tool to help you keep all
+your text within the bounds of a user's terminal window, and warn you
+when you're going to wrap or truncate lines.)
+
+You can indent all the lines by some number of spaces using the
+\ccode{indent} argument, which was set to 2 in the example above.
+
+
+The base behavior of \ccode{esl\_opt\_DisplayHelp()} is to show all
+the options in one list. You might want to have separate lists. For
+example, you might want to consider some options as ``expert''
+options, and only show help for those when a user really asks for it.
+Or you might simply want to group your options into sections, with
+different headers. This is what the \ccode{docgrouptag} field is for
+in the \ccode{ESL\_OPTIONS} structure. If you pass
+\ccode{esl\_opt\_DisplayHelp()} a nonzero value for \ccode{docgroup},
+it will only show help lines for options that have a matching
+\ccode{docgrouptag}. If you had some options with a
+\ccode{docgrouptag} of 1, and some more options with a
+\ccode{docgrouptag} of 2, you could format them into two help sections
+with this:
+
+\begin{cchunk}
+ if (show_help) {
+ puts(usage);
+ puts("\n where some options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80); /* 1=docgroup 1; 2=indentation; 80=width */
+ puts("\n and some more options are:");
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80); /* 1=docgroup 2; 2=indentation; 80=width */
+ return 0;
+ }
+\end{cchunk}
+
+which, if you modified the above example in this way (setting the
+first three options to have a \ccode{docgrouptag} of 1 and the other
+four to be 2) would give you:
+
+\begin{cchunk}
+./example -h
+Usage: ./example [-options] <arg>
+
+ where some options are:
+ -h : show help and usage
+ -a : a boolean switch
+ -b : another boolean switch [default]
+
+ and some more options are:
+ -n <n> : an integer argument [0]
+ -x <x> : a real-valued argument [1.0]
+ --file <s> : long option, with filename arg
+ --char <c> : long option, with character arg
+\end{cchunk}
+
+
+
+
+\subsection{Command line parsing, config files, and the environment}
+
+Once a \ccode{ESL\_GETOPTS} object has been loaded with an options
+array and initialized to default state by
+\ccode{esl\_getopts\_Create()}, a \ccode{esl\_opt\_ProcessCmdline()}
+call then processes all the options on the command line, updating the
+configuration.
+
+Internally, the object keeps track of where the options end and
+command line arguments begin. The macro \ccode{esl\_opt\_ArgNumber()}
+returns the number of arguments remaining after the options. Calls to
+\ccode{esl\_opt\_GetArg()} recover the command line arguments by
+number.
+
+The getopts module can configure options not only via the command
+line, but via environment and/or config files. Connections to the
+environment -- the \ccode{env\_var} field of the options array -- are
+processed by a \ccode{esl\_opt\_ProcessEnvironment()} call. An open
+config file is processed by a \ccode{esl\_opt\_ProcessConfigfile()}
+call. (The format of a config file is described below.) The
+application may process any number of config files -- for instance,
+there may be a master configuration installed in a system directory,
+and a personalized configuration in a user's home directory.
+
+The order of the different \ccode{Process*()} calls defines the
+precedence of who overrides who. For example, in the following code
+fragment:
+
+\begin{cchunk}
+ ESL_GETOPTS *g; /* a created, initialized getopts config */
+ FILE *masterfp; /* a master config file, open for reading */
+ FILE *userfp; /* a user's config file, open for reading */
+
+ esl_opt_ProcessConfigfile(g, "/usr/share/myapp/master.cfg", masterfp);
+ esl_opt_ProcessConfigfile(g, "~/.myapp.cfg", userfp);
+ esl_opt_ProcessEnvironment(g);
+ esl_opt_ProcessCmdline(g, argc, argv);
+\end{cchunk}
+
+the precedence is defined as: defaults, master config file, local
+config file, environment, command line arguments.
+
+
+\subsection{Configuring an application that uses getopts}
+
+(This section might usefully by cut and pasted into the documentation
+for a specific application, with modifications as appropriate.)
+
+ \subsubsection{Command line option syntax}
+
+Command line syntax is essentially identical to the syntax used by GNU
+programs. Options must precede the mandatory arguments.
+
+Options are either short or long. Short options are a single character
+preceded by a single \ccode{-}; for example, \ccode{-a}. Long options
+are preceded by two dashes, and can have any wordlength; for example,
+\ccode{--option1}.
+
+If a short option takes an argument, the argument may either be
+attached (immediately follows the option character) or unattached (a
+space between the optchar and the argument. For example, \ccode{-n5}
+and \ccode{-n 5} both specify an argument \ccode{5} to option
+\ccode{-n}.
+
+Short options can be concatenated into a string of characters;
+\ccode{-abc} is equivalent to \ccode{-a -b -c}. (Concatenation may
+only be used on the command line, not in configuration files or in
+fields of the \ccode{ESL\_OPTIONS} structure array.) Only the last
+option in such a string can take an argument, and the other options in
+the optstring must be simple on/off booleans. For example, if
+\ccode{-a} and \ccode{-b} are boolean switches, and \ccode{-W} takes a
+\ccode{<string>} argument, either \ccode{-abW foo} or \ccode{-abWfoo}
+is correct, but \ccode{-aWb foo} is not.
+
+For a long option that takes an argument, the argument can be provided
+either by \ccode{--foo arg} or \ccode{--foo=arg}.
+
+Long options may be abbreviated, if the abbreviation is unambiguous;
+for instance, \ccode{--foo} or \ccode{--foob} suffice to active an
+option \ccode{--foobar}. (Like concatenation of short options,
+abbreviation of long options is a shorthand that may only be used on
+the command line.)
+
+Multi-word arguments may be quoted: for example, \ccode{--hostname "my
+host"} or \ccode{-s="my string"}.
+
+Nonnumeric arguments may not start with '-' unless you use an
+argument-attached syntax: \ccode{-W-myarg} and \ccode{--foo=-myarg}
+are accepted, but \ccode{-W myarg} or \ccode{--foo -myarg} will result
+in an error message. This is so if you forget a required argument on
+the command line, we don't silently parse the following option as that
+argument. Numeric arguments aren't checked this way, but forgotten
+numeric argument errors would still usually be caught in typechecking
+(if \ccode{-n} takes an integer argument, \ccode{-n -a} would be an
+invalid argument error); stylistically, we want \ccode{-n -1} and
+\ccode{--param -1} to be a valid way of passing negative-valued
+arguments. However, this does mean that some forgotten numeric
+argument cases will be undetectable by Easel: in the case where
+\ccode{-n} takes an integer argument, \ccode{-1} is a valid option,
+and the user types \ccode{-n -1}, the \ccode{-1} is parsed as
+\ccode{-n}'s option.
+
+ \subsubsection{Configuration file format}
+
+Each line of a configuration file contains an option and an argument
+(if the option takes an argument). Blank lines are ignored. Anything
+following a \ccode{\#} character on a line is a comment and is
+ignored. The syntax of options and arguments is stricter than on
+command lines. Concatenation of short options is not allowed,
+abbreviation of long options is not allowed, and arguments must always
+be separated from options by whitespace (not by \ccode{=}). For
+example:
+
+\begin{cchunk}
+ # Customized configuration file for my application.
+ #
+ -a # Turn -a on.
+ -b # Turn -b on.
+ -W arg # Set -W to "arg"
+ --multi "one two three" # Multiword args can be quoted.
+\end{cchunk}
+
+
+
diff --git a/esl_gev.c b/esl_gev.c
new file mode 100644
index 0000000..ce9bb5a
--- /dev/null
+++ b/esl_gev.c
@@ -0,0 +1,996 @@
+/* Statistical routines for generalized extreme value (GEV) distributions.
+ *
+ * Contents:
+ * 1. Evaluating densities and distributions
+ * 2. Generic API routines: for general interface w/ histogram module
+ * 3. Dumping plots to files
+ * 4. Sampling (requires augmentation w/ random module)
+ * 5. ML fitting to complete or censored data
+ * 6. Stats driver
+ * 7. Example
+ * 8. Copyright and license information
+ *
+ * Xref:
+ * STL9/118, 2005/0712-easel-gev-impl. Verified against evd package in R.
+ *
+ * To-do:
+ * - Fit*() functions should return eslEINVAL on n=0, eslENORESULT
+ * on failure due to small n. Compare esl_gumbel. xref J12/93.
+ * SRE, Wed Nov 27 11:18:07 2013
+ *
+ *****************************************************************
+ * GEV distribution
+ * G(x) = exp{ -[1 + \alpha \lambda(x - \mu)]^{-1/\alpha} }
+ * where:
+ * \mu = location parameter
+ * \lambda = scale parameter (\lambda = 1/\sigma, in [Coles01] notation)
+ * \alpha = shape parameter (\alpha = \xi, in [Coles01] notation)
+ *
+ * lim_{\alpha -> 0} is a type I EVD (Gumbel)
+ * \alpha > 0 is a Type II EVD (Frechet)
+ * \alpha < 0 is a Type III EVD (Weibull)
+ *
+ * Reference:
+ * [Coles01]
+ * S. Coles, An Introduction to Statistical Modeling of Extreme Values,
+ * Springer, 2001.
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include "easel.h"
+#include "esl_stats.h"
+#include "esl_gev.h"
+
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#ifdef eslAUGMENT_MINIMIZER
+#include "esl_minimizer.h"
+#endif
+
+/****************************************************************************
+ * 1. Evaluating densities and distributions
+ ****************************************************************************/
+
+/* Function: esl_gev_pdf()
+ *
+ * Purpose: Calculates the probability density function for the
+ * generalized extreme value distribution, $P(X=x)$, given
+ * quantile <x> and GEV location, scale, shape parameters
+ * <mu>, <lambda>, <alpha>.
+ */
+double
+esl_gev_pdf(double x, double mu, double lambda, double alpha)
+{
+ double y = lambda * (x-mu);
+ double ya1 = 1. + alpha * y;
+ double lya1;
+
+ /* Special case: if alpha is tiny, approximate by a Gumbel */
+ if (fabs(y*alpha) < 1e-12) return (lambda * exp(-y - exp(-y)));
+
+ /* Else, use GEV; but use log/exp to avoid a pow() call,
+ * as that's almost 2x faster (on my machine anyway).
+ */
+ if (ya1 <= 0) return 0.;
+ lya1 = log(ya1);
+ return (lambda * exp(-(1.+ 1./alpha)*lya1 - exp(-lya1/alpha)));
+}
+
+/* Function: esl_gev_logpdf()
+ *
+ * Purpose: Calculates the log probability density function for the
+ * generalized extreme value distribution, $\log P(X=x)$,
+ * given quantile <x> and GEV location, scale, shape
+ * parameters <mu>, <lambda>, <alpha>.
+ */
+double
+esl_gev_logpdf(double x, double mu, double lambda, double alpha)
+{
+ double y = lambda *(x-mu);
+ double ya1 = 1. + alpha*y;
+ double lya1;
+
+ /* Special case: if alpha is tiny, approx by a Gumbel */
+ if (fabs(y*alpha) < 1e-12) return ((log(lambda) - y) - exp(-y));
+
+ /* It's important not to return NaN for this domain error;
+ * minimizer relies on being able to compare logL's for any parameter,
+ * and you can't compare NaN to anything.
+ */
+ if (ya1 <= 0) return -eslINFINITY;
+
+ lya1 = log(ya1);
+ return ( (log(lambda) - (1.+1./alpha)*lya1) - exp(-lya1/alpha));
+}
+
+
+/* Function: esl_gev_cdf()
+ *
+ * Purpose: Calculates the cumulative distribution function for the
+ * generalized extreme value distribution, $P(X \leq x)$,
+ * given quantile <x> and GEV location, scale, shape
+ * parameters <mu>, <lambda>, <alpha>.
+ */
+double
+esl_gev_cdf(double x, double mu, double lambda, double alpha)
+{
+ double y = lambda *(x-mu);
+ double ya1 = 1. + alpha*y;
+ double lya1;
+
+ /* Special case: if alpha is tiny, approx by a Gumbel */
+ if (fabs(y*alpha) < 1e-12) return (exp(-exp(-y)));
+
+ if (ya1 <= 0) {
+ if (x < mu) return 0.0; /* the frechet case */
+ else return 1.0; /* the weibull case */
+ }
+ lya1 = log(ya1);
+ return (exp(-exp(-lya1/alpha)));
+}
+
+
+
+/* Function: esl_gev_logcdf()
+ *
+ * Purpose: Calculates the log of the cumulative distribution function for a
+ * generalized extreme value distribution, $\log P(X \leq x)$,
+ * given quantile <x> and GEV location, scale, shape
+ * parameters <mu>, <lambda>, <alpha>.
+ */
+double
+esl_gev_logcdf(double x, double mu, double lambda, double alpha)
+{
+ double y = lambda *(x-mu);
+ double ya1 = 1. + alpha*y;
+ double lya1;
+
+ /* Special case: if alpha is tiny, approx by a Gumbel */
+ if (fabs(y*alpha) < 1e-12) return (-exp(-y));
+
+ if (ya1 <= 0) {
+ if (x < mu) return -eslINFINITY; /* Frechet */
+ else return 0.0; /* Weibull */
+ }
+
+ lya1 = log(ya1);
+ return (-exp(-lya1/alpha));
+}
+
+
+/* Function: esl_gev_surv()
+ *
+ * Purpose: Calculates the survivor function, $P(X>x)$ (that is, 1-cdf),
+ * the right tail's probability mass, given quantile <x> and
+ * GEV location, scale, shape parameters <mu>, <lambda>, <alpha>.
+ */
+double
+esl_gev_surv(double x, double mu, double lambda, double alpha)
+{
+ double y = lambda *(x-mu);
+ double ya1 = 1. + alpha*y;
+ double lya1;
+
+ /* Special case: for tiny alpha, use Gumbel (xref esl_gumbel.c) */
+ if (fabs(y*alpha) < 1e-12)
+ return ((y > -0.5*log(DBL_EPSILON)) ? exp(-y) : (1 - exp(-exp(-y))));
+
+ if (ya1 <= 0) {
+ if (x < mu) return 1.0; /* the frechet case */
+ else return 0.0; /* the weibull case */
+ }
+ lya1 = log(ya1)/alpha;
+ return ((lya1 > -0.5*log(DBL_EPSILON)) ? exp(-lya1) : (1 - exp(-exp(-lya1))));
+}
+
+
+/* Function: esl_gev_logsurv()
+ *
+ * Purpose: Calculates the log survivor function $\log P(X>x)$ for a
+ * generalized extreme value distribution (that is,
+ * $\log (1 - \mbox{cdf})$, the log of the right tail's probability
+ * mass), given quantile <x> and GEV location, scale, shape
+ * parameters <mu>, <lambda>, <alpha>.
+ */
+double
+esl_gev_logsurv(double x, double mu, double lambda, double alpha)
+{
+ double y = lambda *(x-mu);
+ double ya1 = 1. + alpha*y;
+ double lya1;
+
+ /* Special case: for tiny alpha, use Gumbel (xref esl_gumbel.c) */
+ if (fabs(y*alpha) < 1e-12)
+ {
+ if (y > -0.5 * log(DBL_EPSILON)) return (-y);
+ else if (y < -2.9) return (-exp(-exp(-y)));
+ else return (log(1-exp(-exp(-y))));
+ }
+
+ /* See esl_gumbel.c for analysis of the crossovers in
+ * the three cases (small, large, and ok lya1)
+ */
+ if (ya1 <= 0) {
+ if (x < mu) return 1.0; /* Frechet case */
+ else return -eslINFINITY; /* Weibull case */
+ }
+
+ lya1 = log(ya1)/alpha;
+ if (lya1 > -0.5 * log(DBL_EPSILON)) return (-lya1);
+ else if (lya1 < -2.9) return (-exp(-exp(-lya1)));
+ else return (log(1-exp(-exp(-lya1))));
+}
+
+/* Function: esl_gev_invcdf()
+ *
+ * Purpose: Calculates the inverse CDF of the GEV: given a probability
+ * <p> ($0 < p < 1$), returns the quantile <x> which would
+ * give <p> as its CDF, for a generalized extreme value
+ * distribution with parameters <mu>, <lambda>, and <alpha>.
+ */
+double
+esl_gev_invcdf(double p, double mu, double lambda, double alpha)
+{
+ /* failover to Gumbel sample, for tiny alpha */
+ if (fabs(alpha) < 1e-12) return (mu - log(-1. * log(p)) / lambda);
+
+ return mu + (exp(-alpha*log(-log(p))) - 1.) / (alpha * lambda) ;
+}
+/*-------------------- end densities & distributions ------------------------*/
+
+
+
+/*****************************************************************
+ * 2. Generic API routines: for general interface w/ histogram module
+ *****************************************************************/
+
+/* Function: esl_gev_generic_pdf()
+ *
+ * Purpose: Generic-API version of PDF.
+ */
+double
+esl_gev_generic_pdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_gev_pdf(x, p[0], p[1], p[2]);
+}
+
+/* Function: esl_gev_generic_cdf()
+ *
+ * Purpose: Generic-API version of CDF.
+ */
+double
+esl_gev_generic_cdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_gev_cdf(x, p[0], p[1], p[2]);
+}
+
+/* Function: esl_gev_generic_surv()
+ *
+ * Purpose: Generic-API version of survival function.
+ */
+double
+esl_gev_generic_surv(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_gev_surv(x, p[0], p[1], p[2]);
+}
+
+/* Function: esl_gev_generic_invcdf()
+ *
+ * Purpose: Generic-API version of inverse CDF.
+ */
+double
+esl_gev_generic_invcdf(double p, void *params)
+{
+ double *v = (double *) params;
+ return esl_gev_invcdf(p, v[0], v[1], v[2]);
+}
+/*------------------------- end of generic API --------------------------*/
+
+
+
+/****************************************************************************
+ * 3. Dumping plots to files
+ ****************************************************************************/
+
+/* Function: esl_gev_Plot()
+ *
+ * Purpose: Plot some GEV function <func> (for instance,
+ * <esl_gev_pdf()>) for parameters <mu> and <lambda>, for
+ * a range of quantiles x from <xmin> to <xmax> in steps of <xstep>;
+ * output to an open stream <fp> in xmgrace XY input format.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error, such as filled disk.
+ */
+int
+esl_gev_Plot(FILE *fp, double mu, double lambda, double alpha,
+ double (*func)(double x, double mu, double lambda, double alpha),
+ double xmin, double xmax, double xstep)
+{
+ double x;
+ for (x = xmin; x <= xmax; x += xstep)
+ if (fprintf(fp, "%f\t%g\n", x, (*func)(x, mu, lambda, alpha)) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "gev plot write failed");
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "gev plot write failed");
+ return eslOK;
+}
+/*-------------------- end plot dumping routines ---------------------------*/
+
+
+
+
+/****************************************************************************
+ * 4. Sampling (requires augmentation w/ random module)
+ ****************************************************************************/
+#ifdef eslAUGMENT_RANDOM
+/* Function: esl_gev_Sample()
+ *
+ * Purpose: Sample a GEV-distributed random variate,
+ * by the transformation method.
+ */
+double
+esl_gev_Sample(ESL_RANDOMNESS *r, double mu, double lambda, double alpha)
+{
+ double p;
+ p = esl_rnd_UniformPositive(r);
+ return esl_gev_invcdf(p, mu, lambda, alpha);
+}
+#endif /*eslAUGMENT_RANDOM*/
+/*--------------------------- end sampling ---------------------------------*/
+
+
+
+
+/****************************************************************************
+ * 5. ML fitting to complete or censored data
+ ****************************************************************************/
+#ifdef eslAUGMENT_MINIMIZER
+/* Easel's conjugate gradient descent code allows a single void ptr to
+ * point to any necessary fixed data, so we put everything into one
+ * structure:
+ */
+struct gev_data {
+ double *x; /* data: n observed samples */
+ int n; /* number of observed samples */
+
+ int is_censored; /* TRUE if a censored, not complete dataset */
+ double phi; /* censoring/truncation threshold: obs x_i > phi */
+ int z; /* # of censored samples */
+};
+
+/* gev_func():
+ * Returns the neg log likelihood of a complete or censored GEV data sample;
+ * in the API of the conjugate gradient descent optimizer in esl_minimizer.
+ */
+static double
+gev_func(double *p, int nparam, void *dptr)
+{
+ double mu, w, lambda, alpha;
+ struct gev_data *data;
+ double logL;
+ int i;
+
+ /* Unpack what the optimizer gave us.
+ */
+ mu = p[0];
+ w = p[1]; /* w is a c.o.v. to allow unconstrained opt of lambda>0 */
+ lambda = exp(w);
+ alpha = p[2];
+ data = (struct gev_data *) dptr;
+
+ logL = 0.;
+ for (i = 0; i < data->n; i++)
+ logL += esl_gev_logpdf(data->x[i], mu, lambda, alpha);
+
+ if (data->is_censored)
+ logL += data->z * esl_gev_logcdf(data->phi, mu, lambda, alpha);
+
+ return -logL; /* goal: minimize NLL */
+}
+
+/* gev_gradient()
+ * Computes the gradient of the negative log likelihood of a complete
+ * or censored GEV sample; in the API of the CG optimizer.
+ */
+static void
+gev_gradient(double *p, int nparam, void *dptr, double *dp)
+{
+ double mu, w, lambda, alpha;
+ struct gev_data *data;
+ double *x;
+ int i;
+ double dmu, dw, dalpha;
+ double y, ay, ay1, lay1;
+
+ /* Unpack what the optimizer gave us */
+ mu = p[0];
+ w = p[1]; /* w is a c.o.v. to allow unconstrained opt of lambda>0 */
+ lambda = exp(w);
+ alpha = p[2];
+ data = (struct gev_data *) dptr;
+ x = data->x;
+
+ dmu = 0.;
+ dw = data->n; /* d/dw, term1 */
+ dalpha = 0.;
+
+ for (i = 0; i < data->n; i++)
+ {
+ y = lambda * (x[i]-mu);
+ ay = alpha*y;
+ ay1 = 1+ay; /* 1+ay=1, for ay < DBL_EPSILON */
+ lay1 = log(ay1);
+
+ /* d/dmu, term1. (will become 1, for small alpha.) */
+ dmu += (alpha+1) / ay1;
+
+ /* d/dmu, term2. For tiny ay, use log(1+x) ~ x to simplify. */
+ if (fabs(ay) < 1e-12) dmu -= exp(-y);
+ else dmu -= exp(-(1+1/alpha) * lay1);
+
+ /* d/dw, term2. converges to -y, for small alpha. */
+ dw -= y*(1+alpha) / ay1;
+
+ /* d/dw, term2. For tiny ay, use log(1+x) ~ x to simplify. */
+ if (fabs(ay) < 1e-12) dw += y*exp(-y);
+ else dw += y*exp(-(1+1/alpha) * lay1);
+
+ /* d/dalpha, term1
+ */
+ dalpha -= (1 + 1/alpha) * y/ay1;
+
+ /* d/dalpha, terms 2,3,4: for tiny ay, simplify.
+ * d/dalpha will go to +/-inf for alpha ~ 0, so watch out.
+ */
+ if (fabs(ay) < 1e-12) {
+ dalpha += y/alpha;
+ dalpha += y*exp(-y) / (alpha*ay1);
+ dalpha -= y*exp(-y) / alpha;
+ } else {
+ dalpha += lay1 / (alpha*alpha);
+ dalpha += y * exp(-lay1/alpha) / (alpha*ay1);
+ dalpha -= lay1 * exp(-lay1/alpha) / (alpha*alpha);
+ }
+ }
+ dmu *= lambda;
+
+ /* Add the terms that come from the censored data gradient,
+ * if it's a censored dataset.
+ */
+ if (data->is_censored)
+ {
+ y = lambda * (data->phi - mu);
+ ay = alpha * y;
+ ay1 = 1 + ay;
+ lay1 = log(ay1);
+
+ if (fabs(ay) < 1e-12)
+ { /* special case of small alpha, converging towards Gumbel */
+ dmu -= data->z * lambda * exp(-y) / ay1;
+ dw += data->z * y * exp(-y) / ay1;
+ dalpha -= data->z * exp(-y) * y/alpha * ay/ay1;
+ }
+ else
+ { /* normal case */
+ dmu -= data->z * lambda * exp(-lay1/alpha) / ay1;
+ dw += data->z * y * exp(-lay1/alpha) / ay1;
+ dalpha -= data->z * exp(-lay1/alpha) *
+ (lay1/(alpha*alpha) - y/(alpha*ay1));
+ }
+ }
+
+ /* Return the negative gradient, because we're minimizing NLL,
+ * not maximizing LL.
+ */
+ dp[0] = -dmu;
+ dp[1] = -dw;
+ dp[2] = -dalpha;
+ return;
+}
+
+/* fitting_engine()
+ * Fitting code shared by the FitComplete() and FitCensored() API.
+ *
+ * The fitting_engine(), in turn, is just an adaptor wrapped around
+ * the conjugate gradient descent minimizer.
+ */
+static int
+fitting_engine(struct gev_data *data,
+ double *ret_mu, double *ret_lambda, double *ret_alpha)
+{
+ double p[3]; /* parameter vector */
+ double u[3]; /* max initial step size vector */
+ double wrk[12]; /* 4 tmp vectors of length 3 */
+ double mean, variance;
+ double mu, lambda, alpha; /* initial param guesses */
+ double tol = 1e-6; /* convergence criterion for CG */
+ double fx; /* f(x) at minimum; currently unused */
+ int status;
+
+ /* Make an initial guess.
+ * (very good guess for complete data; merely sufficient for censored)
+ */
+ esl_stats_DMean(data->x, data->n, &mean, &variance);
+ lambda = eslCONST_PI / sqrt(6.*variance);
+ mu = mean - 0.57722/lambda;
+ alpha = 0.0001;
+
+ p[0] = mu;
+ p[1] = log(lambda); /* c.o.v. from lambda to w */
+ p[2] = alpha;
+
+ /* max initial step sizes: keeps bracketing from exploding */
+ u[0] = 1.0;
+ u[1] = fabs(log(0.02));
+ u[2] = 0.02;
+
+ /* pass problem to the optimizer
+ */
+ status = esl_min_ConjugateGradientDescent(p, u, 3,
+ &gev_func,
+ &gev_gradient,
+ (void *)data,
+ tol, wrk, &fx);
+ *ret_mu = p[0];
+ *ret_lambda = exp(p[1]);
+ *ret_alpha = p[2];
+ return status;
+}
+
+
+/* Function: esl_gev_FitComplete()
+ *
+ * Purpose: Given an array of <n> GEV-distributed samples <x[0]..x[n-1>,
+ * return maximum likelihood parameters <ret_mu>,
+ * <ret_lambda>, and <ret_alpha>.
+ *
+ * Uses a conjugate gradient descent algorithm that
+ * can be computationally intensive. A typical problem
+ * involving 10,000-100,000 points may take a second
+ * to solve.
+ *
+ * Note: Just a wrapper: sets up the problem for fitting_engine().
+ *
+ * Args: x - complete GEV-distributed data [0..n-1]
+ * n - number of samples in <x>
+ * ret_mu - RETURN: maximum likelihood estimate of mu
+ * ret_lambda - RETURN: maximum likelihood estimate of lambda
+ * ret_alpha - RETURN: maximum likelihood estimate of alpha
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslENOHALT> if the fit doesn't converge.
+ *
+ * Xref: STL9/118-120.
+ */
+int
+esl_gev_FitComplete(double *x, int n,
+ double *ret_mu, double *ret_lambda, double *ret_alpha)
+{
+ struct gev_data data;
+
+ data.x = x;
+ data.n = n;
+ data.is_censored = FALSE;
+ data.phi = -DBL_MAX;
+ data.z = 0;
+
+ return (fitting_engine(&data, ret_mu, ret_lambda, ret_alpha));
+}
+
+/* Function: esl_gev_FitCensored()
+ *
+ * Purpose: Given a left-censored array of <n> GEV-distributed samples
+ * <x[0]..x[n-1>, the number of censored samples <z>, and
+ * the censoring value <phi> (where all $x_i > \phi$ and
+ * all $z$ censored samples are $\leq \phi$);
+ * return maximum likelihood parameters <ret_mu>,
+ * <ret_lambda>, and <ret_alpha>.
+ *
+ * Args: x - censored GEV-distributed data [0..n-1], all > phi
+ * n - number of samples in <x>
+ * z - number of censored samples, all <= phi
+ * phi - censoring threshold
+ * ret_mu - RETURN: maximum likelihood estimate of mu
+ * ret_lambda - RETURN: maximum likelihood estimate of lambda
+ * ret_alpha - RETURN: maximum likelihood estimate of alpha
+ *
+ * Note: Just a wrapper: sets up the problem for fitting_engine().
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslENOHALT> if the fit doesn't converge.
+ *
+ * Xref: STL9/133
+ */
+int
+esl_gev_FitCensored(double *x, int n, int z, double phi,
+ double *ret_mu, double *ret_lambda, double *ret_alpha)
+{
+ struct gev_data data;
+
+ data.x = x;
+ data.n = n;
+ data.is_censored = TRUE;
+ data.phi = phi;
+ data.z = z;
+
+ return (fitting_engine(&data, ret_mu, ret_lambda, ret_alpha));
+}
+#endif /*eslAUGMENT_MINIMIZER*/
+/*--------------------------- end fitting ----------------------------------*/
+
+
+
+
+
+/****************************************************************************
+ * 6. Stats driver
+ ****************************************************************************/
+
+#ifdef eslGEV_STATS
+/* compile:
+ gcc -g -Wall -I. -o stats -DeslGEV_STATS -DeslAUGMENT_RANDOM\
+ -DeslAUGMENT_MINIMIZER esl_gev.c esl_random.c esl_minimizer.c\
+ esl_vectorops.c easel.c -lm
+ * run: ./stats <test#>...
+ * e.g.
+ * ./stats 1 2 3
+ * would run tests 1, 2, 3.
+ */
+#include <stdio.h>
+#include <math.h>
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_minimizer.h"
+#include "esl_gev.h"
+
+#define MAX_STATS_TESTS 10
+static void stats_sample(FILE *fp);
+static int stats_fittest(FILE *fp, int ntrials, int n, double mu,
+ double lambda, double alpha);
+int
+main(int argc, char **argv)
+{
+ FILE *fp;
+ double mu = 0.0;
+ double lambda = 1.0;
+ double xmin = -20.;
+ double xmax = 60.;
+ double xstep = 0.1;
+ double x,z;
+ int do_test[MAX_STATS_TESTS+1];
+ int i;
+
+ for (i = 0; i <= MAX_STATS_TESTS; i++) do_test[i] = 0;
+ for (i = 1; i < argc; i++)
+ do_test[atoi(argv[i])] = 1;
+
+ /* stats.1: xmgrace xy file w/ densities for Gumbel, Frechet, Weibull */
+ if (do_test[1]) {
+ if ((fp = fopen("stats.1", "w")) == NULL) abort();
+ for (x = xmin; x <= xmax; x+= xstep)
+ fprintf(fp, "%.1f %9.7f\n", x, esl_gev_pdf(x, mu, lambda, 0.0));
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep)
+ fprintf(fp, "%.1f %9.7f\n", x, esl_gev_pdf(x, mu, lambda, 0.1));
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep)
+ fprintf(fp, "%.1f %9.7f\n", x, esl_gev_pdf(x, mu, lambda, -0.1));
+ fprintf(fp, "&\n");
+ fclose(fp);
+ }
+
+ /* stats.2: xmgrace xy file w/ log densities for Gumbel, Frechet, Weibull */
+ if (do_test[2]) {
+ if ((fp = fopen("stats.2", "w")) == NULL) abort();
+ for (x = xmin; x <= xmax; x+= xstep) {
+ z = esl_gev_logpdf(x, mu, lambda, 0.0);
+ if (finite(z)) fprintf(fp, "%.1f %9.7f\n", x, z);
+ }
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep) {
+ z = esl_gev_logpdf(x, mu, lambda, 0.1);
+ if (finite(z)) fprintf(fp, "%.1f %9.7f\n", x, z);
+ }
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep) {
+ z = esl_gev_logpdf(x, mu, lambda, -0.1);
+ if (finite(z)) fprintf(fp, "%.1f %9.7f\n", x, z);
+ }
+ fprintf(fp, "&\n");
+ fclose(fp);
+ }
+
+ /* stats.3: xmgrace xy file w/ CDF for Gumbel, Frechet, Weibull */
+ if (do_test[3]) {
+ if ((fp = fopen("stats.3", "w")) == NULL) abort();
+ for (x = xmin; x <= xmax; x+= xstep)
+ fprintf(fp, "%.1f %9.7f\n", x, esl_gev_cdf(x, mu, lambda, 0.0));
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep)
+ fprintf(fp, "%.1f %9.7f\n", x, esl_gev_cdf(x, mu, lambda, 0.6));
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep)
+ fprintf(fp, "%.1f %9.7f\n", x, esl_gev_cdf(x, mu, lambda, -0.6));
+ fprintf(fp, "&\n");
+ fclose(fp);
+ }
+
+ /* stats.4: xmgrace xy file w/ logCDF for Gumbel, Frechet, Weibull */
+ if (do_test[4]) {
+ if ((fp = fopen("stats.4", "w")) == NULL) abort();
+ for (x = xmin; x <= xmax; x+= xstep) {
+ z = esl_gev_logcdf(x, mu, lambda, 0.0);
+ if (finite(z)) fprintf(fp, "%.1f %9.7f\n", x, z);
+ }
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep) {
+ z = esl_gev_logcdf(x, mu, lambda, 0.2);
+ if (finite(z)) fprintf(fp, "%.1f %9.7f\n", x, z);
+ }
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep) {
+ z = esl_gev_logcdf(x, mu, lambda, -0.2);
+ if (finite(z)) fprintf(fp, "%.1f %9.7f\n", x, z);
+ }
+ fprintf(fp, "&\n");
+ fclose(fp);
+ }
+
+ /* stats.5: xmgrace xy file w/ surv for Gumbel, Frechet, Weibull */
+ if (do_test[5]) {
+ if ((fp = fopen("stats.5", "w")) == NULL) abort();
+ for (x = xmin; x <= xmax; x+= xstep)
+ fprintf(fp, "%.1f %9.7f\n", x, esl_gev_surv(x, mu, lambda, 0.0));
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep)
+ fprintf(fp, "%.1f %9.7f\n", x, esl_gev_surv(x, mu, lambda, 0.6));
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep)
+ fprintf(fp, "%.1f %9.7f\n", x, esl_gev_surv(x, mu, lambda, -0.6));
+ fprintf(fp, "&\n");
+ fclose(fp);
+ }
+
+ /* stats.6: xmgrace xy file w/ logsurv for Gumbel, Frechet, Weibull */
+ if (do_test[6]) {
+ if ((fp = fopen("stats.6", "w")) == NULL) abort();
+ for (x = xmin; x <= xmax; x+= xstep) {
+ z = esl_gev_logsurv(x, mu, lambda, 0.0);
+ if (finite(z)) fprintf(fp, "%.1f %9.7f\n", x, z);
+ }
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep) {
+ z = esl_gev_logsurv(x, mu, lambda, 0.2);
+ if (finite(z)) fprintf(fp, "%.1f %9.7f\n", x, z);
+ }
+ fprintf(fp, "&\n");
+ for (x = xmin; x <= xmax; x+= xstep) {
+ z = esl_gev_logsurv(x, mu, lambda, -0.2);
+ if (finite(z)) fprintf(fp, "%.1f %9.7f\n", x, z);
+ }
+ fprintf(fp, "&\n");
+ fclose(fp);
+ }
+
+ /* stats.7. R input file of 10,000 random GEV samples.
+ */
+ if (do_test[7]) {
+ if ((fp = fopen("stats.7", "w")) == NULL) abort();
+ stats_sample(fp);
+ fclose(fp);
+ }
+
+ /* stats.8. Test 500 fits of the Frechet.
+ */
+ if (do_test[8]) {
+ if ((fp = fopen("stats.8", "w")) == NULL) abort();
+ stats_fittest(fp, 500, 10000, mu, lambda, 0.2);
+ fclose(fp);
+ }
+
+ /* stats.9. Test 500 fits of the near-Gumbel
+ */
+ if (do_test[9]) {
+ if ((fp = fopen("stats.9", "w")) == NULL) abort();
+ stats_fittest(fp, 500, 10000, mu, lambda, 0.00001);
+ fclose(fp);
+ }
+
+ /* stats.10. Test 500 fits of the Weibull
+ */
+ if (do_test[10]) {
+ if ((fp = fopen("stats.10", "w")) == NULL) abort();
+ stats_fittest(fp, 500, 10000, mu, lambda, -0.2);
+ fclose(fp);
+ }
+ return 0;
+}
+
+/* stats_sample()
+ * Creates an R input table containing 10,000 random samples
+ * each in columns labeled "gumbel", "frechet", "weibull".
+ * To process in R (remember that R uses 1/lambda for scale):
+ library(ismev)
+ library(evd)
+ z=read.table("stats.7")
+ x1 <- sort(z$gumbel, decreasing=T)
+ x2 <- sort(z$frechet, decreasing=T)
+ x3 <- sort(z$weibull, decreasing=T)
+ q1 <- qgumbel(ppoints(10000), -20., 1./0.4)
+ q2 <- qgev(ppoints(10000), -20., 1./0.4, 0.2)
+ q3 <- qgev(ppoints(10000), -20., 1./0.4, -0.2)
+ xax<- seq(-40,40,by=0.1)
+ a1 <- dgumbel(xax, -20, 1/0.4)
+ a2 <- dgev(xax, -20, 1/0.4, 0.2)
+ a3 <- dgev(xax, -20, 1/0.4, -0.2)
+ qqplot(x1,q1); abline(0,1)
+ qqplot(x2,q2); abline(0,1)
+ qqplot(x3,q3); abline(0,1)
+ plot(density(x1,bw=0.2)); lines(xax,a1)
+ plot(density(x2,bw=0.2)); lines(xax,a2)
+ plot(density(x3,bw=0.2)); lines(xax,a3)
+ */
+static void
+stats_sample(FILE *fp)
+{
+ ESL_RANDOMNESS *r;
+ double mu = -20.;
+ double lambda = 0.4;
+ int n = 10000;
+ double a,b,c;
+ int i;
+
+ r = esl_randomness_Create(42);
+ fprintf(fp, " gumbel \t frechet\t weibull\n");
+ for (i = 1; i <= n; i++)
+ {
+ a = esl_gev_Sample(r, mu, lambda, 0.0);
+ b = esl_gev_Sample(r, mu, lambda, 0.2);
+ c = esl_gev_Sample(r, mu, lambda, -0.2);
+ fprintf(fp, "%d\t%8.4f\t%8.4f\t%8.4f\n", i, a,b,c);
+ }
+ esl_randomness_Destroy(r);
+}
+
+/* stats_fittest()
+ * Samples <n> numbers from a GEV w/ parameters <mu>, <lambda>, <alpha>;
+ * then fits to a GEV and print info about how good the fit is.
+ *
+ * Repeat this <ntrials> times.
+ *
+ * For each trial, outputs a line to <fp>:
+ * <trial> <nll> <est_nll> <est_mu> <mu %error> <est_lambda> <%err>\
+ * <est_alpha> <%err> <est E-val at parametric E=1>
+ *
+ * Each sampled set is done with the random number generator seeded to
+ * the trial number. This should make each set reproducible and
+ * identical to the sets used to test R's fitting.
+ *
+ * xref STL9/191; xref 2005/0718-weibull-debugging
+ */
+static int
+stats_fittest(FILE *fp, int ntrials, int n, double mu, double lambda, double alpha)
+{
+ ESL_RANDOMNESS *r = NULL;
+ double *x = NULL;
+ int i;
+ int trial;
+ double est_mu, est_lambda, est_alpha;
+ double z;
+ double nll, est_nll;
+ int status;
+
+ ESL_ALLOC(x, sizeof(double) * n);
+ for (trial = 1; trial <= ntrials; trial++)
+ {
+ r = esl_randomness_Create(trial);
+ nll = 0.;
+ for (i = 0; i < n; i++)
+ {
+ x[i] = esl_gev_Sample(r, mu, lambda, alpha);
+ nll -= esl_gev_logpdf(x[i], mu, lambda, alpha);
+ }
+ esl_randomness_Destroy(r);
+
+ esl_gev_FitComplete(x, n, &est_mu, &est_lambda, &est_alpha);
+
+ est_nll = 0.;
+ for (i = 0; i < n; i++)
+ est_nll -= esl_gev_logpdf(x[i], est_mu, est_lambda, est_alpha);
+
+ z = mu + (exp(-alpha*log(1/(double)n)) - 1 ) / (alpha*lambda);/* x at E=1*/
+ z = (double) n * esl_gev_surv(z, est_mu, est_lambda, est_alpha); /* E at x */
+
+ printf("%4d %10.2f %10.2f %8.3f %8.3f %8.5f %8.3f %8.5f %8.3f %6.4f\n",
+ trial, nll, est_nll,
+ est_mu, 100* fabs((est_mu-mu)/mu),
+ est_lambda, 100* fabs((est_lambda-lambda)/lambda),
+ est_alpha, 100* fabs((est_alpha-alpha)/alpha),
+ z);
+ }
+ free(x);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+#endif /*eslGEV_STATS*/
+
+
+/*****************************************************************
+ * 7. Example
+ *****************************************************************/
+#ifdef eslGEV_EXAMPLE
+/*::cexcerpt::gev_example::begin::*/
+/* compile:
+ gcc -g -Wall -I. -o example -DeslGEV_EXAMPLE -DeslAUGMENT_RANDOM\
+ -DeslAUGMENT_MINIMIZER esl_gev.c esl_random.c esl_minimizer.c\
+ esl_vectorops.c easel.c -lm
+ * run: ./example
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_minimizer.h"
+#include "esl_gev.h"
+
+int
+main(int argc, char **argv)
+{
+ double est_mu, est_lambda, est_alpha;
+ double z;
+ int i;
+ int n = 10000; /* simulate 10,000 samples */
+ double mu = -20.0; /* with mu = -20 */
+ double lambda = 0.4; /* and lambda = 0.4 */
+ double alpha = 0.1; /* and alpha = 0.1 */
+ double min = 9999.;
+ double max = -9999.;
+ double *x = malloc(sizeof(double) * n);
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);;
+
+ for (i = 0; i < n; i++) /* generate the 10,000 samples */
+ {
+ x[i] = esl_gev_Sample(r, mu, lambda, alpha);
+ if (x[i] < min) min = x[i];
+ if (x[i] > max) max = x[i];
+ }
+
+ z = esl_gev_surv(max, mu, lambda, alpha); /* right tail p~1e-4 >= max */
+ printf("max = %6.1f P(>max) = %g E=%6.3f\n", max, z, z*(double)n);
+ z = esl_gev_cdf(min, mu, lambda, alpha); /* left tail p~1e-4 < min */
+ printf("min = %6.1f P(<=min) = %g E=%6.3f\n", min, z, z*(double)n);
+
+ esl_gev_FitComplete(x, n, &est_mu, &est_lambda, &est_alpha);
+
+ printf("Parametric mu = %6.1f. Estimated mu = %6.2f. Difference = %.1f%%.\n",
+ mu, est_mu, 100. * fabs((est_mu - mu) / mu));
+ printf("Parametric lambda = %6.2f. Estimated lambda = %6.2f. Difference = %.1f%%.\n",
+ lambda, est_lambda, 100. * fabs((est_lambda - lambda) /lambda));
+ printf("Parametric alpha = %6.4f. Estimated alpha = %6.4f. Difference = %.1f%%.\n",
+ alpha, est_alpha, 100. * fabs((est_alpha - alpha) /alpha));
+
+ free(x);
+ esl_randomness_Destroy(r);
+ return 0;
+}
+/*::cexcerpt::gev_example::end::*/
+#endif /*eslGEV_EXAMPLE*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_gev.h b/esl_gev.h
new file mode 100644
index 0000000..da19902
--- /dev/null
+++ b/esl_gev.h
@@ -0,0 +1,50 @@
+/* esl_gev.h
+ * Generalized extreme value (GEV) distributions.
+ *
+ * SRE, Tue Jul 12 09:15:56 2005
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslGEV_INCLUDED
+#define eslGEV_INCLUDED
+
+#ifdef eslAUGMENT_RANDOM
+#include <esl_random.h>
+#endif
+
+extern double esl_gev_pdf (double x, double mu, double lambda, double alpha);
+extern double esl_gev_logpdf (double x, double mu, double lambda, double alpha);
+extern double esl_gev_cdf (double x, double mu, double lambda, double alpha);
+extern double esl_gev_logcdf (double x, double mu, double lambda, double alpha);
+extern double esl_gev_surv (double x, double mu, double lambda, double alpha);
+extern double esl_gev_logsurv(double x, double mu, double lambda, double alpha);
+extern double esl_gev_invcdf (double p, double mu, double lambda, double alpha);
+
+extern double esl_gev_generic_pdf (double x, void *params);
+extern double esl_gev_generic_cdf (double x, void *params);
+extern double esl_gev_generic_surv (double x, void *params);
+extern double esl_gev_generic_invcdf(double p, void *params);
+
+extern int esl_gev_Plot(FILE *fp, double mu, double lambda, double alpha,
+ double (*func)(double x, double mu, double lambda, double alpha),
+ double xmin, double xmax, double xstep);
+
+
+#ifdef eslAUGMENT_RANDOM
+extern double esl_gev_Sample(ESL_RANDOMNESS *r, double mu, double lambda, double alpha);
+#endif
+
+#ifdef eslAUGMENT_MINIMIZER
+extern int esl_gev_FitComplete(double *x, int n,
+ double *ret_mu, double *ret_lambda,
+ double *ret_alpha);
+extern int esl_gev_FitCensored(double *x, int n, int z, double phi,
+ double *ret_mu, double *ret_lambda,
+ double *ret_alpha);
+#endif /*eslAUGMENT_MINIMIZER*/
+
+
+#endif /*eslGEV_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_gev.tex b/esl_gev.tex
new file mode 100644
index 0000000..f64c8fe
--- /dev/null
+++ b/esl_gev.tex
@@ -0,0 +1,205 @@
+
+The generalized extreme value distribution (GEV) includes all three
+types of extreme value distributions: Type I (Gumbel), type II
+(Fr\'{e}chet), and type III (Weibull). Empirically, the scores of some
+sequence alignment algorithms appear to follow GEV distributions. The
+\eslmod{gev} module is used in estimating the statistical significance
+of such scores.
+
+Most local sequence alignment scores follow the Gumbel distribution.
+Easel's \eslmod{gumbel} module applies specifically to the Gumbel. The
+\eslmod{gev} module is used for Type II or III extreme value
+distributions, or for determining which of the three types of
+distribution that a dataset best fits.
+
+\subsection{The gev API}
+
+The \eslmod{gev} API consists of the following functions:
+
+\vspace{0.5em}
+\begin{center}
+\begin{tabular}{ll}\hline
+ \multicolumn{2}{c}{\textbf{evaluating densities and distributions:}}\\
+\ccode{esl\_gev\_pdf()} & Returns the probability density, $P(S=x)$.\\
+\ccode{esl\_gev\_logpdf()} & Returns the log of the pdf, $\log P(S=x)$.\\
+\ccode{esl\_gev\_cdf()} & Returns the cumulative probability distribution, $P(S \leq x)$.\\
+\ccode{esl\_gev\_logcdf()} & Returns the log of the cdf, $\log P(S \leq x)$.\\
+\ccode{esl\_gev\_surv()} & Returns right tail mass, 1-cdf, $P(S > x)$\\
+\ccode{esl\_gev\_logsurv()} & Returns log of 1-cdf, $\log P(S > x)$.\\
+ \multicolumn{2}{c}{\textbf{sampling:}}\\
+\ccode{esl\_gev\_Sample()} & Returns a GEV-distributed random sample.\\
+ \multicolumn{2}{c}{\textbf{maximum likelihood parameter fitting:}}\\
+\ccode{esl\_gev\_FitComplete()} & Estimates GEV parameters from complete data.\\
+\end{tabular}
+\end{center}
+\vspace{0.5em}
+
+The Gumbel distribution depends on three parameters, $\mu$, $\lambda$,
+and $\alpha$. When these parameters are known, the statistical
+significance (P-value) of a single score $x$ is $P(S>x)$, obtained by
+a call to \ccode{esl\_gev\_surv()}. The E-value for obtaining that
+score or better in searching a database of $N$ sequences is just
+$NP(S>x)$.
+
+When the parameters are unknown, they can be estimated from scores
+obtained from comparisons of simulated random data. The
+\ccode{esl\_gev\_FitComplete()} function performs maximum likelihood
+parameter fitting \citep{Coles01}.
+
+\subsubsection{Augmentations: random, minimizer}
+
+The \ccode{esl\_gev\_Sample()} function requires augmenting with the
+\eslmod{random} module.
+
+The \ccode{esl\_gev\_FitComplete()} function requires augmenting with
+the \eslmod{minimizer} module.
+
+\subsection{Example of using the gev API}
+
+Below is a code example that samples 10,000 data points from a
+Fr\'{e}chet distribution with $\mu=-20$, $\lambda=0.4$, $\alpha=0.1$;
+reports the min and max samples, and the probability mass to the left
+of the min and to the right of the max (both of which should be about
+$\frac{1}{10000}$, since we took 10,000 samples); and then fits those
+simulated data to a Gumbel and reports the fitted $\mu$ and $\lambda$:
+
+\input{cexcerpts/gev_example}
+
+\subsection{GEV densities}
+
+The probability density function (pdf) and the cumulative distribution
+function (cdf) of the generalized extreme value distribution are
+\citep{Coles01}:
+
+\begin{eqnarray}
+P(X=x) & = & \lambda \left[ 1 + \alpha \lambda (x - \mu) \right]^{-\frac{\alpha+1}{\alpha}}
+ \exp \left\{ - \left[ 1 + \alpha \lambda (x - \mu)
+ \right]^{-\frac{1}{\alpha}} \right\}
+\\%
+\label{eqn:gev_density}
+P(X \geq x) & = & \exp \left\{ - \left[ 1 +
+ \alpha\lambda(x-\mu) \right]^{-\frac{1}{\alpha}} \right\}
+\\%
+\label{eqn:gev_distribution}
+\end{eqnarray}
+
+The parameters $\mu$, $\lambda$, and $\alpha$ are location, scale, and
+shape parameters, respectively, with $-\infty < \mu < \infty$, $0 <
+\lambda < \infty$, and $-\infty < \alpha < \infty$.
+
+The Type II (Fr\'{e}chet) distribution corresponds to $\alpha > 0$,
+and the Type III (Weibull) distribution corresponds to $\alpha < 0$.
+The Type I (Gumbel) distribution arises in the limit $\alpha
+\rightarrow 0$. At values $\alpha \simeq 0$, Easel's GEV functions
+revert to the Gumbel limit case, as opposed to dividing by zero and
+failing.
+
+Technically the GEV is only defined for values of $x$ such that $1 +
+\alpha \lambda (x - \mu) > 0$. However, Easel's functions return
+sensible values outside this domain, such as 0 for nonexistent
+densities.
+
+Generalized extreme value densities for $\mu = 0$ and $\lambda = 1$
+are shown below (left) for three settings of $\alpha$; $\alpha = 0$
+(Gumbel), $\alpha = 0.1$ (Fr\'{e}chet), and $\alpha = -0.1$
+(Weibull). The figure on the right shows the log densities, which more
+clearly show how, relative to the exponential right tail of the
+Gumbel, the Fr\'{e}chet's tail is longer, and the Weibull's tail is
+shorter.
+
+\centerline{
+\begin{minipage}{3in}
+\includegraphics[width=2.8in]{figures/gev_density}
+\end{minipage}
+\begin{minipage}{3in}
+\includegraphics[width=2.8in]{figures/gev_logdensity}
+\end{minipage}
+}
+
+For more details, see the excellent description in \citep{Coles01}.
+Easel's $\{ \mu, \lambda, \alpha \}$ notation differs from the $\{
+\mu, \sigma, \xi \}$ parameterization used by Coles. Use $\lambda =
+\frac{1}{\sigma}$ and $\alpha = \xi$ to translate.
+
+\subsection{Fitting GEV distributions to observed data}
+
+Easel fits GEVs by maximum likelihood estimation by numerically
+optimizing the log likelihood function, using first derivative
+information and conjugate gradient descent. See the \eslmod{gumbel}
+chapter for a more general introduction to maximum likelihood fitting.
+
+\subsubsection{Maximum likelihood estimation, complete data}
+
+The function \ccode{esl\_gev\_FitComplete()} uses gradient information
+to find parameters that optimize the likelihood function, using the
+conjugate gradient descent code in the \eslmod{minimizer} module.
+
+Given $n$ samples $x_1..x_n$, we want to estimate maximum likelihood
+parameter estimates $\{ \hat{\mu}, \hat{\lambda}, \hat{\alpha} \}$
+that maximize the log likelihood:
+
+\begin{equation}
+\log L(\lambda, \mu, \alpha) = n \log \lambda
+ - \frac{\alpha+1}{\alpha}
+ \sum_{i=1}^{n} \log\left[1+ \alpha\lambda(x_i - \mu) \right]
+ - \sum_{i=1}^{n} \left[ 1 + \alpha\lambda (x_i - \mu) \right]^{\frac{1}{\alpha}}
+\label{eqn:gev_logL}
+\end{equation}
+
+The $\left[ 1 + \alpha\lambda (x_i - \mu) \right]^{\frac{1}{\alpha}}$
+term can be rewritten in a more conveniently differentiable form as
+$\exp \left\{ \frac{1}{\alpha} \log \left[ 1 + \alpha\lambda (x_i - \mu)
+\right] \right\}$.
+
+Since the $\lambda$ parameter is constrained to $\lambda > 0$ but the
+numerical optimizer expects unconstrained parameters, we use a change
+of variables $\lambda = e^w$ and optimize an unconstrained value $w$.
+
+The gradient of the log likelihood with respect to $\mu$, $w$, and
+$\alpha$ is:
+
+%% xref: STL9/118-120
+\begin{eqnarray}
+\frac{\partial \log L}{\partial \mu} & = &
+ \sum_{i=1}^n \frac{\lambda (\alpha+1)}{1+\alpha\lambda(x_i-\mu)}
+ -\sum_{i=1}^n \lambda \exp
+ \left\{ -\frac{\alpha+1}{\alpha} \log
+ \left[1+\alpha\lambda(x_i-\mu)\right] \right\}
+\\%
+\label{eqn:gev_mupartial}
+\frac{\partial \log L}{\partial w} & = &
+ n - \sum_{i=1}^{n} \frac{\lambda (\alpha+1) (x_i - \mu)}
+ {1 + \alpha \lambda (x_i - \mu)}
+ + \sum_{i=1}^n \lambda (x_i - \mu)
+ \exp \left\{ -\frac{\alpha+1}{\alpha} \log
+ \left[1+\alpha\lambda(x_i-\mu)\right] \right\}
+\\%
+\label{eqn:gev_wpartial}
+\frac{\partial \log L}{\partial \alpha} & = &
+ \sum_{i=1}^n \left\{
+ \begin{array}{l}
+ - \frac{\alpha+1}{\alpha} \frac{\lambda(x_i-\mu)}
+ {1 +\alpha\lambda(x_i-\mu)}\\
+ + \frac{1}{\alpha^2} \log \left[ 1 + \alpha\lambda(x_i - \mu) \right]\\
+ + \frac{1}{\alpha} \frac{\lambda(x_i-\mu)}
+ {1 +\alpha\lambda(x_i-\mu)}
+ e^{-\frac{1}{\alpha} \log\left[ 1 + \alpha\lambda(x_i - \mu) \right]}\\
+ - \frac{1}{\alpha^2} \log \left[ 1 + \alpha\lambda(x_i - \mu) \right]
+ e^{-\frac{1}{\alpha} \log\left[ 1 + \alpha\lambda(x_i - \mu)
+ \right]}
+ \end{array}
+ \right.
+\\%
+\label{eqn:gev_alphapartial}
+\end{eqnarray}
+
+When $|\alpha\lambda(x_i - \mu)|$ approaches $0$, the GEV approximates
+a Gumbel distribution and these equations can be simplified using the
+approximation $\log(1+a) \simeq a$.
+
+
+
+
+
+
+
diff --git a/esl_gumbel.c b/esl_gumbel.c
new file mode 100644
index 0000000..4f37e5e
--- /dev/null
+++ b/esl_gumbel.c
@@ -0,0 +1,1420 @@
+/* Statistical routines for Gumbel (type I extreme value) distributions.
+ *
+ * Contents:
+ * 1. Routines for evaluating densities and distributions
+ * 2. Generic API routines: for general interface w/ histogram module
+ * 3. Dumping plots to files
+ * 4. Sampling (augmentation: random module)
+ * 5. ML fitting to complete data
+ * 6. ML fitting to censored data (x_i >= phi; z known)
+ * 7. ML fitting to truncated data (x_i >= phi; z unknown) (augmentation: minimizer)
+ * 8. Stats driver
+ * 9. Unit tests
+ * 10. Test driver
+ * 11. Example
+ * 12. Copyright and license information
+ *
+ * To-do:
+ * - ML fitting routines will be prone to over/underfitting
+ * problems for scores outside a "normal" range, because
+ * of exp(-lambda * x) calls. The Lawless ML estimation
+ * may eventually need to be recast in log space.
+ * SRE, Mon Aug 6 13:42:09 2007
+ *
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include "easel.h"
+#include "esl_stats.h"
+#include "esl_vectorops.h"
+#include "esl_gumbel.h"
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#ifdef eslAUGMENT_MINIMIZER
+#include "esl_minimizer.h"
+#endif
+
+/*****************************************************************
+ * 1. Routines for evaluating densities and distributions
+ *****************************************************************/
+
+/* Function: esl_gumbel_pdf()
+ * Synopsis: Returns the probability density at $x$, $P(S=x)$.
+ *
+ * Purpose: Calculates the probability density function for the Gumbel,
+ * $P(X=x)$, given quantile <x> and Gumbel location and
+ * scale parameters <mu> and <lambda>.
+ *
+ * Let $y = \lambda(x-\mu)$; for 64-bit doubles,
+ * useful dynamic range is about $-6.5 <= y <= 710$.
+ * Returns 0.0 for smaller $y$, 0.0 for larger $y$.
+ */
+double
+esl_gumbel_pdf(double x, double mu, double lambda)
+{
+ double y;
+ y = lambda * (x - mu);
+ return (lambda * exp(-y - exp(-y)));
+}
+
+
+/* Function: esl_gumbel_logpdf()
+ * Synopsis: Returns the log of the pdf at $x$, $\log P(S=x)$.
+ *
+ * Purpose: Calculates the log probability density function for the Gumbel,
+ * $\log P(X=x)$.
+ *
+ * Let $y = \lambda(x-\mu)$; for 64-bit doubles,
+ * useful dynamic range is about $-708 <= y <= \infty$.
+ * Returns $-\infty$ for smaller or larger $y$.
+ */
+double
+esl_gumbel_logpdf(double x, double mu, double lambda)
+{
+ double y;
+ y = lambda * (x - mu);
+ return (log(lambda) -y - exp(-y));
+}
+
+
+/* Function: esl_gumbel_cdf()
+ * Synopsis: Returns the cumulative distribution at $x$, $P(S \leq x)$.
+ *
+ * Purpose: Calculates the cumulative distribution function
+ * for the Gumbel, $P(X \leq x)$.
+ *
+ * Let $y = \lambda(x-\mu)$; for 64-bit doubles,
+ * useful dynamic range for $y$ is about $-6.5 <= y <=36$.
+ * Returns 0.0 for smaller $y$, 1.0 for larger $y$.
+ */
+double
+esl_gumbel_cdf(double x, double mu, double lambda)
+{
+ double y;
+ y = lambda*(x-mu);
+ return exp(-exp(-y));
+}
+
+/* Function: esl_gumbel_logcdf()
+ * Synopsis: Returns the log of the cdf at $x$, $\log P(S \leq x)$.
+ *
+ * Purpose: Calculates the log of the cumulative distribution function
+ * for the Gumbel, $\log P(X \leq x)$.
+ *
+ * Let $y = \lambda(x-\mu)$; for 64-bit doubles,
+ * useful dynamic range for $y$ is about $-708 <= y <= 708$.
+ * Returns $-\infty$ for smaller $y$, 0.0 for larger $y$.
+ */
+double
+esl_gumbel_logcdf(double x, double mu, double lambda)
+{
+ double y;
+ y = lambda*(x-mu);
+ return (-exp(-y));
+}
+
+/* Function: esl_gumbel_surv()
+ * Synopsis: Returns right tail mass above $x$, $P(S > x)$.
+ *
+ * Purpose: Calculates the survivor function, $P(X>x)$ for a Gumbel
+ * (that is, 1-cdf), the right tail's probability mass.
+ *
+ * Let $y=\lambda(x-\mu)$; for 64-bit doubles,
+ * useful dynamic range for $y$ is $-3.6 <= y <= 708$.
+ * Returns 1.0 for $y$ below lower limit, and 0.0
+ * for $y$ above upper limit.
+ */
+double
+esl_gumbel_surv(double x, double mu, double lambda)
+{
+ double y = lambda*(x-mu);
+ double ey = -exp(-y);
+
+ /* Use 1-e^x ~ -x approximation here when e^-y is small. */
+ if (fabs(ey) < eslSMALLX1) return -ey;
+ else return 1 - exp(ey);
+}
+
+/* Function: esl_gumbel_logsurv()
+ * Synopsis: Returns log survival at $x$, $\log P(S > x)$.
+ *
+ * Purpose: Calculates $\log P(X>x)$ for a Gumbel (that is, $\log$(1-cdf)):
+ * the log of the right tail's probability mass.
+ *
+ * Let $y=\lambda(x-\mu)$; for 64-bit doubles,
+ * useful dynamic range for $y$ is $-6.5 <= y <= \infty$.
+ * Returns 0.0 for smaller $y$.
+ */
+double
+esl_gumbel_logsurv(double x, double mu, double lambda)
+{
+ double y = lambda*(x-mu);
+ double ey = -exp(-y);
+
+ /* The real calculation is log(1-exp(-exp(-y))).
+ * For "large" y, -exp(-y) is small, so 1-exp(-exp(-y) ~ exp(-y),
+ * and log of that gives us -y.
+ * For "small y", exp(-exp(-y) is small, and we can use log(1-x) ~ -x.
+ */
+ if (fabs(ey) < eslSMALLX1) return -y;
+ else if (fabs(exp(ey)) < eslSMALLX1) return -exp(ey);
+ else return log(1-exp(ey));
+}
+
+/* Function: esl_gumbel_invcdf()
+ *
+ * Purpose: Calculates the inverse CDF for a Gumbel distribution
+ * with parameters <mu> and <lambda>. That is, returns
+ * the quantile <x> at which the CDF is <p>.
+ */
+double
+esl_gumbel_invcdf(double p, double mu, double lambda)
+{
+ return mu - ( log(-1. * log(p)) / lambda);
+}
+
+/* Function: esl_gumbel_invsurv()
+ *
+ * Purpose: Calculates the score at which the right tail's mass
+ * is p, for a Gumbel distribution
+ * with parameters <mu> and <lambda>. That is, returns
+ * the quantile <x> at which 1-CDF is <p>.
+ */
+double
+esl_gumbel_invsurv(double p, double mu, double lambda)
+{
+ /* The real calculation is mu - ( log(-1. * log(1-p)) / lambda).
+ * But there's a problem with small p:
+ * for p<1e-15, 1-p will be viewed as 1, so
+ * log ( -log(1-p) ) == log (0) -> inf
+ * Instead, use two approximations;
+ * (1) log( 1-p) ~= -p for small p (e.g. p<0.001)
+ * so log(-1. * log(1-p)) ~= log(p)
+ * (2) log (p) ~= (p^p - 1) / p
+ *
+ * See notes Mar 1, 2010.
+ */
+ double log_part;
+ if (p < eslSMALLX1) {
+ log_part = (pow(p,p) - 1 ) / p;
+ } else {
+ log_part = log(-1. * log(1-p));
+ }
+
+ //test 2
+
+ return mu - ( log_part / lambda);
+}
+/*------------------ end of densities and distributions --------------------*/
+
+
+/*****************************************************************
+ * 2. Generic API routines: for general interface w/ histogram module
+ *****************************************************************/
+
+/* Function: esl_gumbel_generic_pdf()
+ *
+ * Purpose: Generic-API version of PDF function.
+ */
+double
+esl_gumbel_generic_pdf(double p, void *params)
+{
+ double *v = (double *) params;
+ return esl_gumbel_pdf(p, v[0], v[1]);
+}
+
+/* Function: esl_gumbel_generic_cdf()
+ *
+ * Purpose: Generic-API version of CDF function.
+ */
+double
+esl_gumbel_generic_cdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_gumbel_cdf(x, p[0], p[1]);
+}
+
+/* Function: esl_gumbel_generic_surv()
+ *
+ * Purpose: Generic-API version of survival function.
+ */
+double
+esl_gumbel_generic_surv(double p, void *params)
+{
+ double *v = (double *) params;
+ return esl_gumbel_surv(p, v[0], v[1]);
+}
+
+/* Function: esl_gumbel_generic_invcdf()
+ *
+ * Purpose: Generic-API version of inverse CDF.
+ */
+double
+esl_gumbel_generic_invcdf(double p, void *params)
+{
+ double *v = (double *) params;
+ return esl_gumbel_invcdf(p, v[0], v[1]);
+}
+
+
+/*------------------------- end of generic API --------------------------*/
+
+
+
+/****************************************************************************
+ * 3. Routines for dumping plots for files
+ ****************************************************************************/
+
+/* Function: esl_gumbel_Plot()
+ * Synopsis: Plot a Gumbel function in XMGRACE XY format.
+ *
+ * Purpose: Plot a Gumbel function <func> (for instance,
+ * <esl_gumbel_pdf()>) for parameters <mu> and <lambda>, for
+ * a range of quantiles x from <xmin> to <xmax> in steps of <xstep>;
+ * output to an open stream <fp> in xmgrace XY input format.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error, such as filled disk.
+ */
+int
+esl_gumbel_Plot(FILE *fp, double mu, double lambda,
+ double (*func)(double x, double mu, double lambda),
+ double xmin, double xmax, double xstep)
+{
+ double x;
+ for (x = xmin; x <= xmax; x += xstep)
+ if (fprintf(fp, "%f\t%g\n", x, (*func)(x, mu, lambda)) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "gumbel plot write failed");
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "gumbel plot write failed");
+ return eslOK;
+}
+/*-------------------- end plot dumping routines ---------------------------*/
+
+
+
+/*****************************************************************
+ * 4. Routines for sampling (requires augmentation w/ random module)
+ *****************************************************************/
+
+#ifdef eslAUGMENT_RANDOM
+/* Function: esl_gumbel_Sample()
+ * Synopsis: Return a Gumbel-distributed random sample $x$.
+ *
+ * Purpose: Sample a Gumbel-distributed random variate
+ * by the transformation method.
+ */
+double
+esl_gumbel_Sample(ESL_RANDOMNESS *r, double mu, double lambda)
+{
+ double p;
+ p = esl_rnd_UniformPositive(r);
+ return esl_gumbel_invcdf(p, mu, lambda);
+}
+#endif /*eslAUGMENT_RANDOM*/
+
+/*------------------------ end of sampling --------------------------------*/
+
+
+
+/*****************************************************************
+ * 5. Maximum likelihood fitting to complete data
+ *****************************************************************/
+
+/* lawless416()
+ * SRE, Thu Nov 13 11:48:50 1997 [St. Louis]
+ *
+ * Purpose: Equation 4.1.6 from [Lawless82], pg. 143, and
+ * its first derivative with respect to lambda,
+ * for finding the ML fit to Gumbel lambda parameter.
+ * This equation gives a result of zero for the maximum
+ * likelihood lambda.
+ *
+ * Args: x - array of sample values
+ * n - number of samples
+ * lambda - a lambda to test
+ * ret_f - RETURN: 4.1.6 evaluated at lambda
+ * ret_df - RETURN: first derivative of 4.1.6 evaluated at lambda
+ *
+ * Return: (void)
+ */
+static void
+lawless416(double *x, int n, double lambda, double *ret_f, double *ret_df)
+{
+ double esum; /* \sum e^(-lambda xi) */
+ double xesum; /* \sum xi e^(-lambda xi) */
+ double xxesum; /* \sum xi^2 e^(-lambda xi) */
+ double xsum; /* \sum xi */
+ int i;
+
+ esum = xesum = xsum = xxesum = 0.;
+ for (i = 0; i < n; i++)
+ {
+ xsum += x[i];
+ xesum += x[i] * exp(-1. * lambda * x[i]);
+ xxesum += x[i] * x[i] * exp(-1. * lambda * x[i]);
+ esum += exp(-1. * lambda * x[i]);
+ }
+ *ret_f = (1./lambda) - (xsum / n) + (xesum / esum);
+ *ret_df = ((xesum / esum) * (xesum / esum))
+ - (xxesum / esum)
+ - (1. / (lambda * lambda));
+}
+
+/* Function: esl_gumbel_FitComplete()
+ * Synopsis: Estimates $\mu$, $\lambda$ from complete data.
+ *
+ * Purpose: Given an array of Gumbel-distributed samples
+ * <x[0]..x[n-1]>, find maximum likelihood parameters <mu>
+ * and <lambda>.
+ *
+ * The number of samples <n> must be reasonably large to get
+ * an accurate fit. <n=100> suffices to get an accurate
+ * location parameter $\mu$ (to about 1% error), but
+ * <n~10000> is required to get a similarly accurate
+ * estimate of $\lambda$. It's probably a bad idea to try to
+ * fit a Gumbel to less than about 1000 data points.
+ *
+ * On a very small number of samples, the fit can fail
+ * altogether, in which case the routine will return a
+ * <eslENORESULT> code. Caller must check for this.
+ *
+ * Uses approach described in [Lawless82]. Solves for lambda
+ * using Newton/Raphson iterations, then substitutes lambda
+ * into Lawless' equation 4.1.5 to get mu.
+ *
+ * Args: x - list of Gumbel distributed samples
+ * n - number of samples (n>1)
+ * ret_mu - RETURN: ML estimate of mu
+ * ret_lambda - RETURN: ML estimate of lambda
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEINVAL> if n<=1.
+ * <eslENORESULT> if the fit fails, likely because the
+ * number of samples is too small. On either error,
+ * <*ret_mu> and <*ret_lambda> are 0.0. These are classed
+ * as failures (normal errors) because the data vector may
+ * have been provided by a user.
+ */
+int
+esl_gumbel_FitComplete(double *x, int n, double *ret_mu, double *ret_lambda)
+{
+ double variance;
+ double lambda, mu;
+ double fx; /* f(x) */
+ double dfx; /* f'(x) */
+ double esum; /* \sum e^(-lambda xi) */
+ double tol = 1e-5;
+ int i;
+ int status;
+
+ if (n <= 1) { status = eslEINVAL; goto FAILURE; }
+
+ /* 1. Find an initial guess at lambda
+ * (Evans/Hastings/Peacock, Statistical Distributions, 2000, p.86)
+ */
+ esl_stats_DMean(x, n, NULL, &variance);
+ lambda = eslCONST_PI / sqrt(6.*variance);
+
+ /* 2. Use Newton/Raphson to solve Lawless 4.1.6 and find ML lambda
+ */
+ for (i = 0; i < 100; i++)
+ {
+ lawless416(x, n, lambda, &fx, &dfx);
+ if (fabs(fx) < tol) break; /* success */
+ lambda = lambda - fx / dfx; /* Newton/Raphson is simple */
+ if (lambda <= 0.) lambda = 0.001; /* but be a little careful */
+ }
+
+ /* 2.5: If we did 100 iterations but didn't converge, Newton/Raphson failed.
+ * Resort to a bisection search. Worse convergence speed
+ * but guaranteed to converge (unlike Newton/Raphson).
+ * We assume that fx is a monotonically decreasing function of x;
+ * i.e. fx > 0 if we are left of the root, fx < 0 if we
+ * are right of the root.
+ */
+ if (i == 100)
+ {
+ double left, right, mid;
+ ESL_DPRINTF2(("esl_gumbel_FitComplete(): Newton/Raphson failed; switchover to bisection\n"));
+
+ /* First bracket the root */
+ left = 0.; /* for sure */
+ right = eslCONST_PI / sqrt(6.*variance); /* an initial guess */
+ lawless416(x, n, lambda, &fx, &dfx);
+ while (fx > 0.)
+ {
+ right *= 2.; /* arbitrary leap to the right */
+ if (right > 1000.) /* no reasonable lambda should be > 1000, we assert */
+ {
+ ESL_DPRINTF2(("Failed to bracket root in esl_gumbel_FitComplete()."));
+ status = eslENORESULT;
+ goto FAILURE;
+ }
+
+ lawless416(x, n, right, &fx, &dfx);
+ }
+
+ /* Now, bisection search in left/right interval */
+ for (i = 0; i < 100; i++)
+ {
+ mid = (left + right) / 2.;
+ lawless416(x, n, mid, &fx, &dfx);
+ if (fabs(fx) < tol) break; /* success */
+ if (fx > 0.) left = mid;
+ else right = mid;
+ }
+
+ /* Too many iterations? Give up. */
+ if (i == 100)
+ {
+ ESL_DPRINTF2(("Even bisection search failed in esl_gumbel_FitComplete().\n"));
+ status = eslENORESULT;
+ goto FAILURE;
+ }
+
+ lambda = mid;
+ }
+
+ /* 3. Substitute into Lawless 4.1.5 to find mu
+ */
+ esum = 0.;
+ for (i = 0; i < n; i++)
+ esum += exp(-lambda * x[i]);
+ mu = -log(esum / n) / lambda;
+
+ *ret_lambda = lambda;
+ *ret_mu = mu;
+ return eslOK;
+
+ FAILURE:
+ *ret_mu = 0.0;
+ *ret_lambda = 0.0;
+ return status;
+}
+
+/* Function: esl_gumbel_FitCompleteLoc()
+ * Synopsis: Estimates $\mu$ from complete data, given $\lambda$.
+ *
+ * Purpose: Given an array of Gumbel-distributed samples
+ * <x[0]..x[n-1]> (complete data), and a known
+ * (or otherwise fixed) <lambda>, find a maximum
+ * likelihood estimate for location parameter <mu>.
+ *
+ * Algorithm is a straightforward simplification of
+ * <esl_gumbel_FitComplete()>.
+ *
+ * Args: x - list of Gumbel distributed samples
+ * n - number of samples
+ * lambda - known lambda (scale) parameter
+ * ret_mu : RETURN: ML estimate of mu
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEINVAL> if n<=1; on this error, <*ret_mu> = 0.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_gumbel_FitCompleteLoc(double *x, int n, double lambda, double *ret_mu)
+{
+ double esum;
+ int i;
+ int status;
+
+ if (n <= 1) { status = eslEINVAL; goto FAILURE; }
+
+ /* Substitute into Lawless 4.1.5 to find mu */
+ esum = 0.;
+ for (i = 0; i < n; i++)
+ esum += exp(-lambda * x[i]);
+ *ret_mu = -log(esum / n) / lambda;
+ return eslOK;
+
+#if 0
+ /* Replace the code above w/ code below to test the direct method. */
+ double mean, variance;
+ esl_stats_DMean(x, n, &mean, &variance);
+ *ret_mu = mean - 0.57722/lambda;
+ return eslOK;
+#endif
+
+ FAILURE:
+ *ret_mu = 0.;
+ return status;
+}
+
+
+#if eslDEBUGLEVEL >=3
+/* direct_mv_fit()
+ * SRE, Wed Jun 29 08:23:47 2005
+ *
+ * Purely for curiousity: a complete data fit using the
+ * simple direct method, calculating mu and lambda from mean
+ * and variance.
+ */
+static int
+direct_mv_fit(double *x, int n, double *ret_mu, double *ret_lambda)
+{
+ double mean, variance;
+
+ esl_stats_DMean(x, n, &mean, &variance);
+ *ret_lambda = eslCONST_PI / sqrt(6.*variance);
+ *ret_mu = mean - 0.57722/(*ret_lambda);
+ return eslOK;
+}
+#endif
+
+/*------------------- end of complete data fit ---------------------------------*/
+
+
+/*****************************************************************
+ * 6. Maximum likelihood fitting to censored data (x_i >= phi; z known)
+ *****************************************************************/
+
+/* lawless422()
+ * SRE, Mon Nov 17 09:42:48 1997 [St. Louis]
+ *
+ * Purpose: Equation 4.2.2 from [Lawless82], pg. 169, and
+ * its first derivative with respect to lambda,
+ * for finding the ML fit to Gumbel lambda parameter
+ * for Type I censored data.
+ * This equation gives a result of zero for the maximum
+ * likelihood lambda.
+ *
+ * Args: x - array of observed sample values
+ * n - number of observed samples
+ * z - number of censored samples = N-n
+ * phi - censoring value; all observed x_i >= phi
+ * lambda - a lambda to test
+ * ret_f - RETURN: 4.2.2 evaluated at lambda
+ * ret_df - RETURN: first derivative of 4.2.2 evaluated at lambda
+ *
+ * Return: (void)
+ */
+static void
+lawless422(double *x, int n, int z, double phi,
+ double lambda, double *ret_f, double *ret_df)
+{
+ double esum; /* \sum e^(-lambda xi) + z term */
+ double xesum; /* \sum xi e^(-lambda xi) + z term */
+ double xxesum; /* \sum xi^2 e^(-lambda xi) + z term */
+ double xsum; /* \sum xi (no z term) */
+ int i;
+
+ esum = xesum = xsum = xxesum = 0.;
+ for (i = 0; i < n; i++)
+ {
+ xsum += x[i];
+ esum += exp(-1. * lambda * x[i]);
+ xesum += x[i] * exp(-1. * lambda * x[i]);
+ xxesum += x[i] * x[i] * exp(-1. * lambda * x[i]);
+ }
+
+ /* Add z terms for censored data
+ */
+ esum += (double) z * exp(-1. * lambda * phi);
+ xesum += (double) z * phi * exp(-1. * lambda * phi);
+ xxesum += (double) z * phi * phi * exp(-1. * lambda * phi);
+
+ *ret_f = 1./lambda - xsum / n + xesum / esum;
+ *ret_df = ((xesum / esum) * (xesum / esum))
+ - (xxesum / esum)
+ - (1. / (lambda * lambda));
+
+ return;
+}
+
+/* Function: esl_gumbel_FitCensored()
+ * Synopsis: Estimates $\mu$, $\lambda$ from censored data.
+ *
+ * Purpose: Given a left-censored array of Gumbel-distributed samples
+ * <x[0]..x[n-1]>, the number of censored samples <z>, and
+ * the censoring value <phi> (all <x[i]> $\geq$ <phi>). Find
+ * maximum likelihood parameters <mu> and <lambda>.
+ *
+ * Algorithm: Uses approach described in [Lawless82]. Solves
+ * for lambda using Newton/Raphson iterations;
+ * then substitutes lambda into Lawless' equation 4.2.3
+ * to get mu.
+ *
+ * Args: x - array of Gumbel-distributed samples, 0..n-1
+ * n - number of observed samples
+ * z - number of censored samples
+ * phi - censoring value (all x_i >= phi)
+ * ret_mu - RETURN: ML estimate of mu
+ * ret_lambda - RETURN: ML estimate of lambda
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEINVAL> if n<=1.
+ * <eslENORESULT> if the fit fails, likey because the number
+ * of samples is too small.
+ * On either error, <*ret_mu> and <*ret_lambda> are 0.0.
+ * These are classed as failures (normal errors) because the
+ * data vector may have been provided by a user.
+ */
+int
+esl_gumbel_FitCensored(double *x, int n, int z, double phi, double *ret_mu, double *ret_lambda)
+{
+ double variance;
+ double lambda, mu;
+ double fx; /* f(x) */
+ double dfx; /* f'(x) */
+ double esum; /* \sum e^(-lambda xi) */
+ double tol = 1e-5;
+ int i;
+ int status;
+
+ if (n <= 1) { status = eslEINVAL; goto FAILURE; }
+
+ /* 1. Find an initial guess at lambda
+ * (Evans/Hastings/Peacock, Statistical Distributions, 2000, p.86)
+ */
+ esl_stats_DMean(x, n, NULL, &variance);
+ lambda = eslCONST_PI / sqrt(6.*variance);
+
+ /* 2. Use Newton/Raphson to solve Lawless 4.2.2 and find ML lambda
+ */
+ for (i = 0; i < 100; i++)
+ {
+ lawless422(x, n, z, phi, lambda, &fx, &dfx);
+ if (fabs(fx) < tol) break; /* success */
+ lambda = lambda - fx / dfx; /* Newton/Raphson is simple */
+ if (lambda <= 0.) lambda = 0.001; /* but be a little careful */
+ }
+
+ /* 2.5: If we did 100 iterations but didn't converge, Newton/Raphson failed.
+ * Resort to a bisection search. Worse convergence speed
+ * but guaranteed to converge (unlike Newton/Raphson).
+ * We assume (!?) that fx is a monotonically decreasing function of x;
+ * i.e. fx > 0 if we are left of the root, fx < 0 if we
+ * are right of the root.
+ */
+ if (i == 100)
+ {
+ double left, right, mid;
+ ESL_DPRINTF2(("esl_gumbel_FitCensored(): Newton/Raphson failed; switched to bisection\n"));
+
+ /* First bracket the root */
+ left = 0.; /* we know that's the left bound */
+ right = eslCONST_PI / sqrt(6.*variance); /* start from here, move "right"... */
+ lawless422(x, n, z, phi, right, &fx, &dfx);
+ while (fx > 0.)
+ {
+ right *= 2.;
+ if (right > 1000.) /* no reasonable lambda should be > 1000, we assert */
+ {
+ ESL_DPRINTF2(("Failed to bracket root in esl_gumbel_FitCensored()."));
+ status = eslENORESULT;
+ goto FAILURE;
+ }
+ lawless422(x, n, z, phi, right, &fx, &dfx);
+ }
+
+ /* Now we bisection search in left/right interval */
+ for (i = 0; i < 100; i++)
+ {
+ mid = (left + right) / 2.;
+ lawless422(x, n, z, phi, mid, &fx, &dfx);
+ if (fabs(fx) < tol) break; /* success */
+ if (fx > 0.) left = mid;
+ else right = mid;
+ }
+ if (i == 100)
+ {
+ ESL_DPRINTF2(("Even bisection search failed in esl_gumbel_FitCensored().\n"));
+ status = eslENORESULT;
+ goto FAILURE;
+ }
+ lambda = mid;
+ }
+
+ /* 3. Substitute into Lawless 4.2.3 to find mu
+ */
+ esum = 0.;
+ for (i = 0; i < n; i++)
+ esum += exp(-lambda * x[i]);
+ esum += z * exp(-1. * lambda * phi); /* term from censored data */
+ mu = -log(esum / n) / lambda;
+
+ *ret_lambda = lambda;
+ *ret_mu = mu;
+ return eslOK;
+
+ FAILURE:
+ *ret_lambda = 0.0;
+ *ret_mu = 0.0;
+ return status;
+}
+
+
+/* Function: esl_gumbel_FitCensoredLoc()
+ * Synopsis: Estimates $\mu$ from censored data, given $\lambda$.
+ *
+ * Purpose: Given a left-censored array of Gumbel distributed samples
+ * <x[0>..x[n-1]>, the number of censored samples <z>, and the censoring
+ * value <phi> (where all <x[i]> $\geq$ <phi>), and a known
+ * (or at least fixed) <lambda>;
+ * find the maximum likelihood estimate of the location
+ * parameter $\mu$ and return it in <ret_mu>.
+ *
+ * Note: A straightforward simplification of FitCensored().
+ *
+ * Args: x - array of Gumbel-distributed samples, 0..n-1
+ * n - number of observed samples
+ * z - number of censored samples
+ * phi - censoring value (all x_i >= phi)
+ * lambda - known scale parameter $\lambda$
+ * ret_mu - RETURN: ML estimate of $\mu$
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEINVAL> if n<=1; on this error, <*ret_mu> = 0.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_gumbel_FitCensoredLoc(double *x, int n, int z, double phi, double lambda,
+ double *ret_mu)
+{
+ double esum;
+ int i;
+ int status;
+
+ if (n <= 1) { status = eslEINVAL; goto FAILURE; }
+
+ /* Immediately substitute into Lawless 4.2.3 to find mu, because
+ * lambda is known.
+ */
+ esum = 0.;
+ for (i = 0; i < n; i++) /* contribution from observed data */
+ esum += exp(-lambda * x[i]);
+ esum += z * exp(-1. * lambda * phi); /* term from censored data */
+
+ *ret_mu = -log(esum / (double) n) / lambda;
+ return eslOK;
+
+ FAILURE:
+ *ret_mu = 0.;
+ return status;
+}
+
+
+/*****************************************************************
+ * 7. Maximum likelihood fitting to truncated data (x_i >= phi and z unknown) (requires minimizer augmentation)
+ *****************************************************************/
+#ifdef eslAUGMENT_MINIMIZER
+/* Easel's conjugate gradient descent code allows a single void ptr to
+ * point to any necessary fixed data, so we'll put everything into one
+ * structure:
+ */
+struct tevd_data {
+ double *x; /* data: n observed samples from a Gumbel */
+ int n; /* number of observed samples */
+ double phi; /* truncation threshold: all observed x_i >= phi */
+};
+
+/* tevd_func()
+ *
+ * Called by the optimizer: evaluate the objective function
+ * for the negative posterior log probability of a particular choice
+ * of parameters mu and lambda, given truncated Gumbel samples.
+ */
+static double
+tevd_func(double *p, int nparam, void *dptr)
+{
+ double mu, w, lambda;
+ struct tevd_data *data;
+ double *x;
+ int n;
+ double phi;
+ double logL;
+ int i;
+
+ /* unpack what the optimizer gave us; nparam==2 always
+ */
+ mu = p[0];
+ w = p[1];
+ lambda = exp(w);
+ data = (struct tevd_data *) dptr;
+ x = data->x;
+ n = data->n;
+ phi = data->phi;
+
+ /* The log likelihood equation
+ */
+ logL = n * log(lambda);
+ for (i = 0; i < n; i++)
+ logL -= lambda * (x[i] - mu);
+ for (i = 0; i < n; i++)
+ logL -= exp(-1. * lambda * (x[i] - mu));
+ logL -= n * esl_gumbel_logsurv(phi, mu, lambda);
+
+ return -1.0 * logL; /* objective: minimize the NLP */
+}
+
+/* tevd_grad()
+ *
+ * Called by the optimizer: evaluate the gradient of the objective
+ * function (the negative posterior log probability of the parameters
+ * mu and w, where w = log(lambda), at a particular choice of mu and
+ * lambda.
+ */
+static void
+tevd_grad(double *p, int nparam, void *dptr, double *dp)
+{
+ double mu, lambda, w;
+ struct tevd_data *data;
+ double *x;
+ int n;
+ double phi;
+ double dmu, dw;
+ double coeff;
+ int i;
+
+ /* unpack what the optimizer gave us; nparam==2 always
+ */
+ mu = p[0];
+ w = p[1];
+ lambda = exp(w);
+ data = (struct tevd_data *) dptr;
+ x = data->x;
+ n = data->n;
+ phi = data->phi;
+
+ /* Both partials include a coefficient that
+ * basically looks like P(S=phi) / P(S>=phi); pre-calculate it.
+ * Watch out when phi >> mu, which'll give us 0/0; instead,
+ * recognize that for phi >> mu, coeff converges to \lambda.
+ */
+ if (lambda*(phi-mu) > 50.) /* arbitrary crossover. */
+ coeff = lambda;
+ else
+ coeff = esl_gumbel_pdf(phi, mu, lambda) / esl_gumbel_surv(phi, mu, lambda);
+
+ /* Partial derivative w.r.t. mu.
+ */
+ dmu = n * lambda;
+ for (i = 0; i < n; i++)
+ dmu -= lambda * exp(-1. * lambda * (x[i] - mu));
+ dmu -= n * coeff;
+
+ /* Partial derivative w.r.t. w=log(lambda).
+ */
+ dw = n;
+ for (i = 0; i < n; i++) dw -= (x[i] - mu) * lambda;
+ for (i = 0; i < n; i++) dw += (x[i] - mu) * lambda * exp(-1. * lambda * (x[i] - mu));
+ dw += n * (phi - mu) * coeff;
+
+ /* Return the negative, because we're minimizing NLP, not maximizing.
+ */
+ dp[0] = -1. * dmu; /* negative because we're minimizing NLP, not maximizing */
+ dp[1] = -1. * dw;
+ return;
+}
+
+/* Function: esl_gumbel_FitTruncated()
+ * Synopsis: Estimates $\mu$, $\lambda$ from truncated data.
+ *
+ * Purpose: Given a left-truncated array of Gumbel-distributed
+ * samples <x[0]..x[n-1]> and the truncation threshold
+ * <phi> (such that all <x[i]> $\geq$ <phi>).
+ * Find maximum likelihood parameters <mu> and <lambda>.
+ *
+ * <phi> should not be much greater than <mu>, the
+ * mode of the Gumbel, or the fit will become unstable
+ * or may even fail to converge. The problem is
+ * that for <phi> $>$ <mu>, the tail of the Gumbel
+ * becomes a scale-free exponential, and <mu> becomes
+ * undetermined.
+ *
+ * Algorithm: Uses conjugate gradient descent to optimize the
+ * log likelihood of the data. Follows a general
+ * approach to fitting missing data problems outlined
+ * in [Gelman95].
+ *
+ * Args: x - observed data samples [0..n-1]
+ * n - number of samples
+ * phi - truncation threshold; all x[i] >= phi
+ * ret_mu - RETURN: ML estimate of mu
+ * ret_lambda - RETURN: ML estimate of lambda
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEINVAL> if n<=1.
+ * <eslENORESULT> if the fit fails, likely because the
+ * number of samples <n> is too small, or because the
+ * truncation threshold is high enough that the tail
+ * looks like a scale-free exponential and we can't
+ * obtain <mu>.
+ * On either error, <*ret_mu> and <*ret_lambda> are
+ * returned as 0.0.
+ * These are "normal" (returned) errors because
+ * the data might be provided directly by a user.
+ */
+int
+esl_gumbel_FitTruncated(double *x, int n, double phi, double *ret_mu, double *ret_lambda)
+{
+ struct tevd_data data;
+ double wrk[8]; /* workspace for CG: 4 tmp vectors of size 2 */
+ double p[2]; /* mu, w; lambda = e^w */
+ double u[2]; /* max initial step size for mu, lambda */
+ double mean, variance;
+ double mu, lambda;
+ double fx;
+ int i;
+ int status;
+
+ /* Can't fit to n<=1 */
+ if (n <= 1) { status = eslEINVAL; goto FAILURE; }
+
+ /* Can fail on small <n>. One way is if x_i are all identical, so
+ * ML lambda is undefined.
+ */
+ for (i = 1; i < n; i++) if (x[i] != x[0]) break;
+ if (i == n) { status = eslENORESULT; goto FAILURE; }
+
+ data.x = x;
+ data.n = n;
+ data.phi = phi;
+
+ /* The source of the following magic is Evans/Hastings/Peacock,
+ * Statistical Distributions, 3rd edition (2000), p.86, which gives
+ * eq's for the mean and variance of a Gumbel in terms of mu and lambda;
+ * we turn them around to get mu and lambda in terms of the mean and variance.
+ * These would be reasonable estimators if we had a full set of Gumbel
+ * distributed variates. They'll be off for a truncated sample, but
+ * close enough to be a useful starting point.
+ */
+ esl_stats_DMean(x, n, &mean, &variance);
+ lambda = eslCONST_PI / sqrt(6.*variance);
+ mu = mean - 0.57722/lambda;
+
+ p[0] = mu;
+ p[1] = log(lambda); /* c.o.v. because lambda is constrained to >0 */
+
+ u[0] = 2.0;
+ u[1] = 0.1;
+
+ /* Pass the problem to the optimizer. The work is done by the
+ * equations in tevd_func() and tevd_grad().
+ */
+ status = esl_min_ConjugateGradientDescent(p, u, 2,
+ &tevd_func, &tevd_grad,(void *)(&data),
+ 1e-4, wrk, &fx);
+ if (status != eslOK) { status = eslENORESULT; goto FAILURE; }
+
+ *ret_mu = p[0];
+ *ret_lambda = exp(p[1]); /* reverse the c.o.v. */
+ return status;
+
+ FAILURE:
+ *ret_mu = 0.0;
+ *ret_lambda = 0.0;
+ return status;
+}
+#endif /*eslAUGMENT_MINIMIZER*/
+/*------------------------ end of fitting --------------------------------*/
+
+/*****************************************************************
+ * 8. Stats driver
+ *****************************************************************/
+#ifdef eslGUMBEL_STATS
+/* compile: gcc -g -O2 -Wall -I. -L. -o stats -DeslGUMBEL_STATS esl_gumbel.c -leasel -lm
+ * run: ./stats > stats.out
+ * process w/ lines like:
+ * grep "complete 100" stats.out | awk '{$i = 100*($5-$4)/$4; if ($i < 0) $i = -$i; print $i}' | avg
+ * grep "complete 100" stats.out | awk '{$i = 100*($7-$6)/$6; if ($i < 0) $i = -$i; print $i}' | avg
+ * to get accuracy summary (in %) for mu, lambda; first part of the grep pattern may be "complete", "censored", or
+ * "truncated", second part may be " 100", " 1000", " 10000", or " 100000".
+ *
+ * This is the routine that collects the accuracy statistics that appear
+ * in tables in the Gumbel chapter of the guide, esl_gumbel.tex.
+ */
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_minimizer.h"
+#include "esl_gumbel.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_RANDOMNESS *r;
+ int totalN[4] = {100, 1000, 10000, 100000}; /*biggest last; one malloc*/
+ int nexps = 4;
+ int exp;
+ int trial, ntrials;
+ double phi; /* truncation threshold. */
+ int i;
+ int n;
+ double *x;
+ double mu, lambda;
+ double est_mu, est_lambda;
+ double val;
+ int do_complete, do_censored, do_truncated, do_location;
+
+ ntrials = 500;
+ mu = -20.0;
+ lambda = 0.693;
+ phi = -15.;
+
+ do_complete = TRUE; /* Flip these on/off as desired */
+ do_censored = FALSE;
+ do_truncated = FALSE;
+ do_location = FALSE;
+
+ r = esl_randomness_Create(0);
+ x = malloc(sizeof(double) * totalN[nexps-1]);
+
+ /* Fitting to simulated complete datasets
+ */
+ if (do_complete) {
+ for (exp = 0; exp < nexps; exp++)
+ {
+ for (trial = 0; trial < ntrials; trial++)
+ {
+ for (i = 0; i < totalN[exp]; i++)
+ x[i] = esl_gumbel_Sample(r, mu, lambda);
+
+ /*direct_mv_fit(x, totalN[exp], &est_mu, &est_lambda);*/
+ if (esl_gumbel_FitComplete(x, totalN[exp], &est_mu, &est_lambda) != eslOK)
+ esl_fatal("gumbel complete fit fit failed");
+
+ printf("complete %6d %6d %9.5f %9.5f %8.6f %8.6f\n",
+ totalN[exp], totalN[exp], mu, est_mu, lambda, est_lambda);
+ }
+ printf("\n");
+ }
+ }
+
+ /* Fitting to simulated censored datasets
+ */
+ if (do_censored) {
+ for (exp = 0; exp < nexps; exp++)
+ {
+ for (trial = 0; trial < ntrials; trial++)
+ {
+ for (n = 0, i = 0; i < totalN[exp]; i++)
+ {
+ val = esl_gumbel_Sample(r, mu, lambda);
+ if (val >= phi) x[n++] = val;
+ }
+ if (esl_gumbel_FitCensored(x, n, totalN[exp]-n, phi, &est_mu, &est_lambda) != eslOK)
+ esl_fatal("gumbel censored fit failed");
+
+ printf("censored %6d %6d %9.5f %9.5f %8.6f %8.6f\n",
+ totalN[exp], n, mu, est_mu, lambda, est_lambda);
+ }
+ printf("\n");
+ }
+ }
+
+ /* Fitting to simulated truncated datasets
+ */
+#ifdef eslAUGMENT_MINIMIZER
+ if (do_truncated) {
+ for (exp = 0; exp < nexps; exp++)
+ {
+ for (trial = 0; trial < ntrials; trial++)
+ {
+ for (n = 0, i = 0; i < totalN[exp]; i++)
+ {
+ val = esl_gumbel_Sample(r, mu, lambda);
+ if (val >= phi) x[n++] = val;
+ }
+ if (esl_gumbel_FitTruncated(x, n, phi, &est_mu, &est_lambda) != eslOK)
+ esl_fatal("gumbel truncated fit failed");
+
+ printf("truncated %6d %6d %9.5f %9.5f %8.6f %8.6f\n",
+ totalN[exp], n, mu, est_mu, lambda, est_lambda);
+ }
+ printf("\n");
+ }
+ }
+#endif /*eslAUGMENT_MINIMIZER*/
+
+ /* Fitting mu given lambda
+ */
+ if (do_location) {
+ for (exp = 0; exp < nexps; exp++)
+ {
+ for (trial = 0; trial < ntrials; trial++)
+ {
+ for (i = 0; i < totalN[exp]; i++)
+ x[i] = esl_gumbel_Sample(r, mu, lambda);
+
+ if (esl_gumbel_FitCompleteLoc(x, totalN[exp], lambda, &est_mu) != eslOK)
+ esl_fatal("gumbel location-only complete fit failed");
+
+ printf("location %6d %6d %9.5f %9.5f\n",
+ totalN[exp], totalN[exp], mu, est_mu);
+ }
+ printf("\n");
+ }
+ }
+
+ esl_randomness_Destroy(r);
+ free(x);
+ return 0;
+}
+#endif /*eslGUMBEL_STATS*/
+
+/*****************************************************************
+ * 9. Unit tests.
+ *****************************************************************/
+#ifdef eslGUMBEL_TESTDRIVE
+
+#include "esl_getopts.h"
+#include "esl_random.h"
+
+static void
+utest_fitting(ESL_RANDOMNESS *rng)
+{
+ char msg[] = "esl_gumbel: fitting unit test failed";
+ int totalN = 10000;
+ double pmu = -20.;
+ double plambda = 0.4;
+ double phi = -20.;
+ double *x = NULL;
+ int i;
+ int n;
+ double mu;
+ double lambda;
+ int status;
+
+ /* Simulate a complete Gumbel distributed dataset of <totalN> samples */
+ ESL_ALLOC(x, sizeof(double) * totalN);
+ for (i = 0; i < totalN; i++)
+ x[i] = esl_gumbel_Sample(rng, pmu, plambda);
+
+ /* Complete data fitting.
+ * Don't tolerate more than 1% error in mu, 3% in lambda.
+ */
+ if ((status = esl_gumbel_FitComplete(x, totalN, &mu, &lambda)) != eslOK) esl_fatal(msg);
+ if (fabs((mu -pmu) /pmu) > 0.01) esl_fatal(msg);
+ if (fabs((lambda-plambda)/plambda) > 0.03) esl_fatal(msg);
+
+ /* Complete data, known lambda; fit location <mu>
+ */
+ if ((status = esl_gumbel_FitCompleteLoc(x, totalN, plambda, &mu)) != eslOK) esl_fatal(msg);
+ if (fabs((mu - pmu) / pmu) > 0.01) esl_fatal(msg);
+
+
+ /* Left censor/truncate the data set, to <n> values x_i >= phi;
+ * <Ntotal-n> are censored
+ */
+ for (n=0, i = 0; i < totalN; i++)
+ if (x[i] >= phi) x[n++] = x[i];
+
+ /* Censored fitting.
+ * Don't tolerate more than 1% error in mu, 4% in lambda.
+ */
+ if ((status = esl_gumbel_FitCensored(x, n, totalN-n, phi, &mu, &lambda)) != eslOK) esl_fatal(msg);
+ if (fabs((mu - pmu) /pmu) > 0.01) esl_fatal(msg);
+ if (fabs((lambda - plambda)/plambda) > 0.04) esl_fatal(msg);
+
+ /* Censored data, known lambda; fit location <mu>
+ */
+ if ((status = esl_gumbel_FitCensoredLoc(x, n, totalN-n, phi, plambda, &mu)) != eslOK) esl_fatal(msg);
+ if (fabs((mu - pmu) / pmu) > 0.01) esl_fatal(msg);
+
+ /* Truncated fitting.
+ * Don't tolerate more than 5% error in mu, 8% in lambda.
+ */
+#ifdef eslAUGMENT_MINIMIZER
+ if ((status = esl_gumbel_FitTruncated(x, n, phi, &mu, &lambda)) != eslOK) esl_fatal(msg);
+ if (fabs((mu - pmu) /pmu) > 0.05) esl_fatal(msg);
+ if (fabs((lambda - plambda)/plambda) > 0.08) esl_fatal(msg);
+#endif /*eslAUGMENT_MINIMIZER*/
+
+ free(x);
+ return;
+
+ ERROR:
+ if (x) free(x);
+ esl_fatal("allocation failure in esl_gumbel : fitting unit test");
+}
+
+
+static void
+utest_fit_failure(void)
+{
+ char msg[] = "esl_gumbel: fit_failure unit test failed";
+ double x[10];
+ double mu;
+ double lambda;
+ int status;
+
+ x[0] = 1.0;
+ x[1] = 1.0;
+
+ /* n=0 or 1 => eslEINVAL. */
+ status = esl_gumbel_FitComplete(x, 1, &mu, &lambda);
+ if (status != eslEINVAL) esl_fatal(msg);
+ if (mu != 0.0) esl_fatal(msg);
+ if (lambda != 0.0) esl_fatal(msg);
+
+ /* Test for failure on small n => eslENORESULT */
+ status = esl_gumbel_FitComplete(x, 2, &mu, &lambda);
+ if (status != eslENORESULT) esl_fatal(msg);
+ if (mu != 0.0) esl_fatal(msg);
+ if (lambda != 0.0) esl_fatal(msg);
+
+ /* FitCompleteLoc() invalid on n=0,1; but always succeeds for n>1 */
+ status = esl_gumbel_FitCompleteLoc(x, 1, 1.0, &mu);
+ if (status != eslEINVAL) esl_fatal(msg);
+ if (mu != 0.0) esl_fatal(msg);
+
+ /* FitCensored() is eslEINVAL on n=0,1, like FitComplete().
+ */
+ status = esl_gumbel_FitCensored(x, 1, 1, 0.0, &mu, &lambda);
+ if (status != eslEINVAL) esl_fatal(msg);
+ if (mu != 0.0) esl_fatal(msg);
+ if (lambda != 0.0) esl_fatal(msg);
+
+ /* FitCensored() can fail on small n, w/ eslENORESULT */
+ status = esl_gumbel_FitCensored(x, 2, 1, 0.0, &mu, &lambda);
+ if (status != eslENORESULT) esl_fatal(msg);
+ if (mu != 0.0) esl_fatal(msg);
+ if (lambda != 0.0) esl_fatal(msg);
+
+ /* FitCensoredLoc()invalid on n=0,1; but always succeeds for n>1 */
+ status = esl_gumbel_FitCensoredLoc(x, 1, 1, 0.0, 1.0, &mu);
+ if (status != eslEINVAL) esl_fatal(msg);
+ if (mu != 0.0) esl_fatal(msg);
+
+ /* FitTruncated() w/ n=0,1 => eslEINVAL. */
+ status = esl_gumbel_FitTruncated(x, 1, 0.0, &mu, &lambda);
+ if (status != eslEINVAL) esl_fatal(msg);
+ if (mu != 0.0) esl_fatal(msg);
+ if (lambda != 0.0) esl_fatal(msg);
+
+ /* FitTruncated() can fail on small n, w/ eslENORESULT */
+ status = esl_gumbel_FitTruncated(x, 2, 0.0, &mu, &lambda);
+ if (status != eslENORESULT) esl_fatal(msg);
+ if (mu != 0.0) esl_fatal(msg);
+ if (lambda != 0.0) esl_fatal(msg);
+
+ return;
+}
+#endif /*eslGUMBEL_TESTDRIVE*/
+
+/*****************************************************************
+ * 10. Test driver.
+ *****************************************************************/
+#ifdef eslGUMBEL_TESTDRIVE
+/* compile: gcc -g -Wall -I. -L. -o esl_gumbel_utest -DeslGUMBEL_TESTDRIVE esl_gumbel.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_gumbel_utest -DeslGUMBEL_TESTDRIVE esl_gumbel.c -leasel -lm
+ * run: ./esl_gumbel_utest
+ * coverage: ./esl_gumbel_utest; gcov esl_gumbel.c; more esl_gumbel.c.gcov
+ */
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_minimizer.h"
+#include "esl_gumbel.h"
+#include "esl_stats.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { "-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0},
+ { "-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "verbose: show verbose output", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for Gumbel distribution routines";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *rng = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ int be_verbose = esl_opt_GetBoolean(go, "-v");
+
+ if (be_verbose) printf("seed = %" PRIu32 "\n", esl_randomness_GetSeed(rng));
+
+ utest_fitting(rng);
+ utest_fit_failure();
+
+ esl_randomness_Destroy(rng);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslGUMBEL_TESTDRIVE*/
+
+
+/*****************************************************************
+ * 11. Example.
+ *****************************************************************/
+#ifdef eslGUMBEL_EXAMPLE
+/*::cexcerpt::gumbel_example::begin::*/
+/* compile: gcc -g -Wall -I. -o example -DeslGUMBEL_EXAMPLE -DeslAUGMENT_RANDOM esl_gumbel.c esl_random.c esl_vectorops.c easel.c -lm
+ * run: ./example
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_gumbel.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);;
+ int n = 10000; /* simulate 10,000 samples */
+ double mu = -20.0; /* with mu = -20 */
+ double lambda = 0.4; /* and lambda = 0.4 */
+ double min = 9999.;
+ double max = -9999.;
+ double *x = malloc(sizeof(double) * n);
+ double z, est_mu, est_lambda;
+ int i;
+
+ for (i = 0; i < n; i++) /* generate the 10,000 samples */
+ {
+ x[i] = esl_gumbel_Sample(r, mu, lambda);
+ if (x[i] < min) min = x[i];
+ if (x[i] > max) max = x[i];
+ }
+
+ z = esl_gumbel_surv(max, mu, lambda); /* right tail p~1e-4 >= max */
+ printf("max = %6.1f P(>max) = %g\n", max, z);
+ z = esl_gumbel_cdf(min, mu, lambda); /* left tail p~1e-4 < min */
+ printf("min = %6.1f P(<=min) = %g\n", min, z);
+
+ if (esl_gumbel_FitComplete(x, n, &est_mu, &est_lambda) != eslOK) /* fit params to the data */
+ esl_fatal("gumbel ML complete data fit failed");
+
+ z = 100. * fabs((est_mu - mu) / mu);
+ printf("Parametric mu = %6.1f. Estimated mu = %6.2f. Difference = %.1f%%.\n",
+ mu, est_mu, z);
+ z = 100. * fabs((est_lambda - lambda) /lambda);
+ printf("Parametric lambda = %6.1f. Estimated lambda = %6.2f. Difference = %.1f%%.\n",
+ lambda, est_lambda, z);
+
+ free(x);
+ esl_randomness_Destroy(r);
+ return 0;
+}
+/*::cexcerpt::gumbel_example::end::*/
+#endif /*eslGUMBEL_EXAMPLE*/
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_gumbel.h b/esl_gumbel.h
new file mode 100644
index 0000000..4dddf16
--- /dev/null
+++ b/esl_gumbel.h
@@ -0,0 +1,50 @@
+/* esl_gumbel.h
+ * Gumbel (type I extreme value) distributions.
+ *
+ * SRE, Mon Jun 27 08:44:41 2005 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslGUMBEL_INCLUDED
+#define eslGUMBEL_INCLUDED
+
+#ifdef eslAUGMENT_RANDOM
+#include <esl_random.h>
+#endif
+
+extern double esl_gumbel_pdf (double x, double mu, double lambda);
+extern double esl_gumbel_logpdf (double x, double mu, double lambda);
+extern double esl_gumbel_cdf (double x, double mu, double lambda);
+extern double esl_gumbel_logcdf (double x, double mu, double lambda);
+extern double esl_gumbel_surv (double x, double mu, double lambda);
+extern double esl_gumbel_logsurv(double x, double mu, double lambda);
+extern double esl_gumbel_invcdf (double p, double mu, double lambda);
+extern double esl_gumbel_invsurv(double p, double mu, double lambda);
+
+
+extern double esl_gumbel_generic_pdf (double x, void *params);
+extern double esl_gumbel_generic_cdf (double x, void *params);
+extern double esl_gumbel_generic_surv (double x, void *params);
+extern double esl_gumbel_generic_invcdf(double p, void *params);
+
+extern int esl_gumbel_Plot(FILE *fp, double mu, double lambda,
+ double (*func)(double x, double mu, double lambda),
+ double xmin, double xmax, double xstep);
+
+#ifdef eslAUGMENT_RANDOM
+extern double esl_gumbel_Sample(ESL_RANDOMNESS *r, double mu, double lambda);
+#endif
+
+extern int esl_gumbel_FitComplete (double *x, int n, double *ret_mu, double *ret_lambda);
+extern int esl_gumbel_FitCompleteLoc(double *x, int n, double lambda, double *ret_mu);
+extern int esl_gumbel_FitCensored (double *x, int n, int z, double phi, double *ret_mu, double *ret_lambda);
+extern int esl_gumbel_FitCensoredLoc(double *x, int n, int z, double phi, double lambda, double *ret_mu);
+#ifdef eslAUGMENT_MINIMIZER
+extern int esl_gumbel_FitTruncated (double *x, int n, double phi, double *ret_mu, double *ret_lambda);
+#endif
+
+
+#endif /*eslGUMBEL_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_gumbel.tex b/esl_gumbel.tex
new file mode 100644
index 0000000..8fbf91c
--- /dev/null
+++ b/esl_gumbel.tex
@@ -0,0 +1,624 @@
+
+Gumbel statistics are often used to estimate the statistical
+significance of local alignment scores.
+
+The Gumbel distribution is the so-called Type I extreme value
+distribution (EVD). It occurs so frequently in sequence analysis
+applications, compared to the type II (Fr\'{e}chet) and type III
+(Weibull) extreme value distributions, that ``Gumbel'' and ``EVD'' are
+often used interchangeably in bioinformatics. Easel has a separate
+module, the \eslmod{gev} module, that implements the generalized
+extreme value distribution.
+
+Karlin/Altschul statistics are a special case of the Gumbel
+distribution that apply to the scores of ungapped local alignments
+between infinitely long random sequences. Empirically, Karlin/Altschul
+statistics also apply reasonably well to the more useful case of
+gapped alignment of finite-length sequences. Karlin/Altschul
+statistics predict how the Gumbel's two parameters depend on the
+length of the query and target sequences. In the case of ungapped
+alignments, Karlin/Altschul statistics allow the Gumbel parameters to
+be estimated directly, without the need for a compute-intensive
+simulation.
+
+\subsection{The gumbel API}
+
+The \eslmod{gumbel} API consists of the following functions:
+
+\vspace{0.5em}
+\begin{center}
+\begin{tabular}{ll}\hline
+ \multicolumn{2}{c}{\textbf{evaluating densities and distributions:}}\\
+\ccode{esl\_gumbel\_pdf()} & Returns the probability density, $P(S=x)$.\\
+\ccode{esl\_gumbel\_logpdf()} & Returns the log of the pdf, $\log P(S=x)$.\\
+\ccode{esl\_gumbel\_cdf()} & Returns the cumulative probability distribution, $P(S \leq x)$.\\
+\ccode{esl\_gumbel\_logcdf()} & Returns the log of the cdf, $\log P(S \leq x)$.\\
+\ccode{esl\_gumbel\_surv()} & Returns right tail mass, 1-cdf, $P(S > x)$\\
+\ccode{esl\_gumbel\_logsurv()} & Returns log of 1-cdf, $\log P(S > x)$.\\
+ \multicolumn{2}{c}{\textbf{sampling:}}\\
+\ccode{esl\_gumbel\_Sample()} & Returns a Gumbel-distributed random sample.\\
+ \multicolumn{2}{c}{\textbf{maximum a posteriori parameter fitting:}}\\
+\ccode{esl\_gumbel\_FitComplete()} & Estimates $\mu,\lambda$ from complete data.\\
+\ccode{esl\_gumbel\_FitCompleteLoc()} & Estimates $\mu$ when $\lambda$ is known.\\
+\ccode{esl\_gumbel\_FitCensored()} & Estimates $\mu,\lambda$ from censored data.\\
+\ccode{esl\_gumbel\_FitCensoredLoc()} & Estimates $\mu$ when $\lambda$ is known.\\
+\ccode{esl\_gumbel\_FitTruncated()}& Estimates $\mu,\lambda$ from truncated data.\\\hline
+\end{tabular}
+\end{center}
+\vspace{0.5em}
+
+The Gumbel distribution depends on two parameters, $\mu$ and
+$\lambda$. When $\mu$ and $\lambda$ are known, the statistical
+significance (P-value) of a single score $x$ is $P(S>x)$, obtained by
+a call to \ccode{esl\_gumbel\_surv()}. The E-value for obtaining that
+score or better in searching a database of $N$ sequences is just
+$NP(S>x)$.
+
+When $\mu$ and $\lambda$ are unknown, they are estimated from scores
+obtained from comparisons of simulated random data. (Analytical
+solutions for $\mu$ and $\lambda$ are only available in the case of
+ungapped sequence alignments.) The \ccode{esl\_evd\_Fit*()} functions
+provide maximum likelihood parameter fitting routines for different
+types of data.
+
+\subsubsection{Augmentations: random, minimizer}
+
+The \ccode{esl\_gumbel\_Sample()} function requires augmenting with the
+\eslmod{random} module.
+
+The \ccode{esl\_gumbel\_FitTruncated()} function requires augmenting
+with the \eslmod{minimizer} module.
+
+
+\subsection{Example of using the gumbel API}
+
+An example that samples 10,000 data points from a Gumbel distribution
+with $\mu=-20$, $\lambda=0.4$; reports the min and max samples, and
+the probability mass to the left of the min and to the right of the
+max (both of which should be about $\frac{1}{10000}$, since we took
+10,000 samples); and then fits those simulated data to a Gumbel and
+reports the fitted $\mu$ and $\lambda$:
+
+\input{cexcerpts/gumbel_example}
+
+
+
+\subsection{Gumbel densities}
+
+The probability density function (pdf) and the cumulative distribution
+function (cdf) of the extreme value distribution are:
+
+\begin{equation}
+P(x) = \lambda \exp \left[ -\lambda (x - \mu) - e^{- \lambda (x - \mu)} \right]
+\label{eqn:gumbel_density}
+\end{equation}
+
+\begin{equation}
+P(S < x) = \exp \left[ -e^{-\lambda(x - \mu)} \right]
+\label{eqn:gumbel_distribution}
+\end{equation}
+
+The extreme value density and distribution functions for $\mu = 0$ and
+$\lambda = 1.0$ are shown below.
+
+\begin{center}
+\includegraphics[width=3in]{figures/evd_basic}
+\end{center}
+
+The $\mu$ and $\lambda$ parameters are {\em location} and {\em scale}
+parameters, respectively:
+
+\centerline{
+\begin{minipage}{3in}
+\includegraphics[width=2.8in]{figures/evd_location}
+\end{minipage}
+\begin{minipage}{3in}
+\includegraphics[width=2.8in]{figures/evd_scale}
+\end{minipage}
+}
+
+For more details, a classic reference is \citep{Lawless82}. Gumbel
+distributions can have their long tail to the right or to the
+left. The form given here is for the long tail to the right. This is
+the form that arises when the extreme value is a maximum, such as when
+our score is the maximum over the individual scores of all possible
+alignments. The equations in \citep{Lawless82} are for extremal
+minima; use $(x - u) = -(x - \mu)$ and $b = 1 / \lambda$ to convert
+Lawless' notation to the notation used here.
+
+
+\subsection{Fitting Gumbel distributions to observed data}
+
+Given a set of $n$ observed samples $\mathbf{x}$, we may want to
+estimate the $\mu$ and $\lambda$ parameters.
+
+One might try to use linear regression to fit to a $\log \log$
+transformation of the $P(S < x)$ histogram, which gives a straight
+line with slope $-\lambda$ and $x$ intercept $\mu$:
+
+\begin{equation}
+\log \left[ -\log P(S<x) \right] = -\lambda x + \lambda \mu
+\end{equation}
+
+However, the linear regression method is undesirable because it is
+sensitive to outliers. The following table shows the \% error for
+estimating $\hat{\mu}$ and $\hat{\lambda}$ from 500 simulated complete
+datasets, sampled from a Gumbel with $\mu = -20.0$ and $\lambda =
+0.4$, for four different dataset sizes:
+
+\begin{center}
+\begin{tabular}{lrrrr} \hline
+ & \multicolumn{4}{c}{\# of samples}\\
+ & 100 & 1000 & 10,000 & 100,000 \\
+\% error in $\hat{\mu}$ & 2\%& 1\% & 0.9\% & 0.9\% \\
+max error in $\hat{\mu}$ & 24\%& 13\% & 10\% & 10\% \\
+\% error in $\hat{\lambda}$ & 12\%& 7\% & 5\% & 3\% \\
+max error in $\hat{\lambda}$ & 49\%& 33\% & 25\% & 20\% \\ \hline
+\end{tabular}
+\end{center}
+
+
+A better rough estimate of $\hat{\mu}$ and $\hat{\lambda}$ can be
+obtained from the sample mean $m$ and variance $s^2$ of the observed
+data \citep{Evans00}:\footnote{All simulation data are generated by
+the \eslmod{evd} module's stats driver. The only exception is the
+linear regression fit data, which come from an old version of HMMER.}
+
+\begin{eqnarray*}
+ \hat{\lambda} & = & \frac{\pi}{\sqrt{6s^2}}\\
+ \hat{\mu} & = & m - \frac{0.57722}{\hat{\lambda}}
+\end{eqnarray*}
+
+The mean/variance method is more accurate than linear regression, as
+shown by the following simulation results:
+
+\begin{center}
+\begin{tabular}{lrrrr} \hline
+ & \multicolumn{4}{c}{\# of samples}\\
+ & 100 & 1000 & 10,000 & 100,000 \\
+\% error in $\hat{\mu}$ & 1\%& 0.3\% & 0.1\% & 0.03\% \\
+max error in $\hat{\mu}$ & 5\%& 1\% & 0.4\% & 0.1\% \\
+\% error in $\hat{\lambda}$ & 9\%& 3\% & 0.8\% & 0.3\% \\
+max error in $\hat{\lambda}$ & 40\%& 12\% & 3\% & 0.9\% \\ \hline
+\end{tabular}
+\end{center}
+
+Still, the mean/variance method is not as accurate as a maximum
+likelihood estimation (especially for $\lambda$). Also, it requires
+complete data, whereas we also need to solve problems where we fit to
+\emph{truncated} or \emph{censored} data. Easel's main estimation
+methods are therefore maximum likelihood methods.
+
+\subsubsection{Maximum likelihood estimation, complete data}
+
+Given $n$ samples $x_1..x_n$ from some distribution that depends on
+parameters $\theta$, we want to estimate maximum likelihood parameter
+estimates $\hat{\theta}$ that maximize the log likelihood:
+
+\[
+ \hat{\theta} = \argmax_{\theta} \sum_{i=1}^{n} \log P(x_i \mid \theta)
+\]
+
+These are also \emph{maximum a posteriori} parameter estimates, if we
+assume a uniform prior $P(\theta)$.
+
+Specifically, for samples $x_i$ drawn from an extreme value
+distribution, the log likelihood to optimize is:
+
+\begin{equation}
+\log L(\lambda, \mu) = n \log \lambda - \sum_{i=1}^{n} \lambda(x_i -
+\mu) - \sum_{i=1}^{n} e^{-\lambda(x_i - \mu)}
+\label{eqn:gumbel_logL}
+\end{equation}
+
+This objective function is differentiable with respect to $\mu$ and
+$\lambda$:
+
+\begin{eqnarray}
+\frac{\partial \log L}{\partial \mu} & = &
+n \lambda - \lambda \sum_{i=1}^{n} e^{-\lambda (x_i - \mu)}\\%
+\\%
+\label{eqn:mupartial}
+\frac{\partial \log L}{\partial \lambda} & = &
+\frac{n}{\lambda} - \sum_{i=1}^{n} (x_i - \mu) +
+\sum_{i=1}^{n} (x_i - \mu) e^{-\lambda (x_i - \mu)}
+\label{eqn:lambdapartial}
+\end{eqnarray}
+
+The maximum likelihood estimates $\hat{\lambda}$ and $\hat{\mu}$ are
+the solutions to $\frac{\partial \log L}{\partial \mu} = 0$ and
+$\frac{\partial \log L}{\partial \lambda} = 0$. Lawless
+\citep{Lawless82} gives a useful trick here that lets us solve both of
+these simultaneously. When (\ref{eqn:mupartial}) is set to zero, it
+can be used to get $\hat{\mu}$ in terms of $\hat{\lambda}$:
+
+\begin{eqnarray}
+e^{-\hat{\lambda} \hat{\mu}} & = & \frac{1}{n} \sum_{i=1}^{n} e^{-\hat{\lambda} x_i}
+\label{eqn:substitute}\\
+\hat{\mu} & = & - \frac{1}{\hat{\lambda}}
+ \log \left[ \frac{1}{n} \sum_{i=1}^{n} e^{-\hat{\lambda} x_i} \right]
+\label{eqn:solvemu}
+\end{eqnarray}
+
+Substituting (\ref{eqn:substitute}) into (\ref{eqn:lambdapartial}),
+gives us an equation for solving $\hat{\lambda}$ in terms of the
+$x_i$'s:
+
+\begin{eqnarray}
+\frac{1}{\hat{\lambda}} - \frac{1}{n} \sum_{i=1}^{n} x_i +
+\frac{\sum_{i=1}^{n} x_i e^{-\hat{\lambda} x_i}}
+ {\sum_{i=1}^{n} e^{-\hat{\lambda} x_i}}
+& = & 0
+\label{eqn:newtontarget}
+\end{eqnarray}
+
+This is our target function. We could solve it readily enough (by
+bisection search, for example) and obtain $\hat{\lambda}$. We can
+solve it even faster using the Newton/Raphson algorithm, because it is
+differentiable with respect to lambda:
+
+\begin{equation}
+\frac{d}{d\hat{\lambda}} =
+\frac{\left( \sum_{i=1}^{n} x_i e^{-\hat{\lambda} x_i} \right)^2 }
+ {\left( \sum_{i=1}^{n} e^{-\hat{\lambda} x_i} \right)^2 }
+-
+\frac{\sum_{i=1}^{n} x_i^2 e^{-\hat{\lambda} x_i}}
+ {\sum_{i=1}^{n} e^{-\hat{\lambda} x_i}}
+-
+\frac{1}{\hat{\lambda}^2}
+\label{eqn:newtonderivative}
+\end{equation}
+
+Now, the key equations are (\ref{eqn:solvemu}),
+(\ref{eqn:newtontarget}), and (\ref{eqn:newtonderivative}). In
+summary, the inference procedure is the following:
+
+\begin{itemize}
+\item Guess an initial $\hat{\lambda}$ (using the mean/variance
+ method, for example, but any reasonable guess works).
+\item Use Newton/Raphson iterations to find the $\hat{\lambda}$ that satisfies
+ (\ref{eqn:newtontarget}):
+ \begin{itemize}
+ \item calculate the target function $f$ and
+ its first derivative $f'$ at $\hat{\lambda}$, using
+ (\ref{eqn:newtontarget}) to calculate $f$ and
+ (\ref{eqn:newtonderivative}) to calculate $f'$.
+ \item If $f$ is within some absolute tolerance of zero
+ (e.g., $10^{-6}$), stop; we have found $\hat{\lambda}$.
+ \item Else, estimate a new $\hat{\lambda} = \hat{\lambda} - \frac{f}{f'}$,
+ and do another iteration.
+ \end{itemize}
+\item Plug $\hat{\lambda}$ into (\ref{eqn:solvemu}) to get $\hat{\mu}$.
+\end{itemize}
+
+This algorithm is implemented in \ccode{esl\_evd\_FitComplete()}. An
+auxiliary function, \ccode{lawless416()}, calculates the target
+function and its derivative (equations (\ref{eqn:newtontarget}) and
+(\ref{eqn:newtonderivative})) given the current estimate of
+$\hat{\lambda}$. The name comes from Lawless' equation 4.1.6, the
+target function \citep{Lawless82}.
+
+The accuracy of fitting to simulated data (generated with $\mu=-20$
+and $\lambda=0.4$), collated over 500 simulations, is shown in the
+following table:
+
+\begin{center}
+\begin{tabular}{lrrrr} \hline
+ & \multicolumn{4}{c}{\# of samples}\\
+ & 100 & 1000 & 10,000 & 100,000 \\
+\% error in $\hat{\mu}$ & 1\%& 0.3\% & 0.1\% & 0.03\% \\
+max error in $\hat{\mu}$ & 4\%& 2\% & 0.5\% & 0.1\% \\
+\% error in $\hat{\lambda}$ & 6\%& 2\% & 0.6\% & 0.2\% \\
+max error in $\hat{\lambda}$ & 36\%& 9\% & 2\% & 0.8\% \\ \hline
+\end{tabular}
+\end{center}
+
+This is in accord with theoretical expectation. The distribution of
+$\frac{\lambda}{\hat{\lambda}}$ is approximately normal with mean 1 and
+standard error $\frac{0.78}{\sqrt{N}}$ \citep{Lawless82,Altschul01}.
+
+% Altschul says \frac{\hat{\lambda}}{\lambda}, actually, but I believe
+% that's wrong. xref J1/46.
+
+
+\subsubsection{Maximum likelihood fitting to censored data}
+
+A \emph{censored} data problem is when we have $N$ samples, but we
+only observe the values of a subset of $n$ samples $x_1..x_n$ that are
+greater or equal to some cutoff $\phi$. The remaining $z = N-n$
+samples are \emph{censored}, and for these we only know that $x <
+\phi$. $x_i..x_n$, $n$, $\phi$, and $z$ are all known in a censored
+data problem.
+
+To estimate maximum likelihood parameters $\hat{\theta}$ for some
+distribution from censored data \citep{Gelman95}, the log likelihood
+to maximize is:
+
+
+\[
+ \hat{\theta} = \argmax_{\theta} z \log P(x<\phi \mid \theta)
+ + \sum_{i=1}^n \log P(x_i \mid \theta)
+\]
+
+Specifically, when fitting a Gumbel distribution, the log likelihood
+to optimize is:
+
+\begin{equation}
+ \log L(\lambda, \mu) =
+ n \log \lambda
+ - z e^{-\lambda(\phi - \mu)}
+ - \sum_{i=1}^{n} \lambda(x_i - \mu)
+ - \sum_{i=1}^{n} e^{-\lambda(x_i - \mu)}
+\label{eqn:censor_logL}
+\end{equation}
+
+To optimize this, we follow a similar procedure as used for complete
+data \citep{Lawless82}. The log likelihood is differentiable with
+respect to $\lambda$ and $\mu$:
+
+\begin{eqnarray}
+\frac{\partial \log L}{\partial \mu} & = &
+n \lambda
+- z \lambda e^{-\lambda (\phi - \mu)}
+- \lambda \sum_{i=1}^{n} e^{-\lambda (x_i - \mu)}
+\label{eqn:censor_dmu}
+\\%
+\frac{\partial \log L}{\partial \lambda} & = &
+\frac{n}{\lambda}
++ z (\phi - \mu) e^{-\lambda (\phi - \mu)}
+- \sum_{i=1}^{n} (x_i - \mu)
++ \sum_{i=1}^{n} (x_i - \mu) e^{-\lambda (x_i - \mu)}
+\label{eqn:censor_dlambda}
+\end{eqnarray}
+
+Setting (\ref{eqn:censor_dmu}) to zero and solving for $\hat{\mu}$ in
+terms of $\hat{\lambda}$ gives:
+
+\begin{equation}
+\hat{\mu} = - \frac{1}{\hat{\lambda}}
+ \log \left[ \frac{1}{n}
+ \left( z e^{-\hat{\lambda} \phi}
+ + \sum_{i=1}^{n} e^{-\hat{\lambda} x_i} \right)
+ \right]
+\label{eqn:censor_solvemu}
+\end{equation}
+
+Substituting (\ref{eqn:censor_solvemu}) into
+(\ref{eqn:censor_dlambda}) gives the target equation:
+
+\begin{equation}
+\frac{1}{\hat{\lambda}}
+- \frac{1}{n} \sum_{i=1}^{n} x_i +
+\frac{z \phi e^{-\hat{\lambda} \phi} + \sum_{i=1}^{n} x_i e^{-\hat{\lambda} x_i}}
+ {z e^{-\hat{\lambda} \phi} + \sum_{i=1}^{n} e^{-\hat{\lambda} x_i}}
+ = 0
+\label{eqn:censor_newtontarget}
+\end{equation}
+
+To use Newton-Raphson root finding (instead of a slower bisection
+search) we also need the first derivative of this target equation with
+respect to $\lambda$:
+
+\begin{equation}
+\frac{d}{d\hat{\lambda}} =
+\frac{\left(
+ z \phi e^{-\hat{\lambda} \phi}
+ + \sum_{i=1}^{n} x_i e^{-\hat{\lambda} x_i}
+ \right)^2 }
+ {\left(
+ z e^{-\hat{\lambda} \phi}
+ + \sum_{i=1}^{n} e^{-\hat{\lambda} x_i}
+ \right)^2 }
+-
+\frac{z \phi^2 e^{-\hat{\lambda} \phi} + \sum_{i=1}^{n} x_i^2 e^{-\hat{\lambda} x_i}}
+ {z e^{-\hat{\lambda} \phi} + \sum_{i=1}^{n} e^{-\hat{\lambda} x_i}}
+-
+\frac{1}{\hat{\lambda}^2}
+\label{eqn:censor_newtonderiv}
+\end{equation}
+
+In summary: given $n$ observed samples $x_1..x_n$ from a total sample
+of $N$ samples, $z = N-n$ of which were censored because they have
+values $< \phi$, we solve for maximum likelihood estimates
+$\hat{\lambda}$ and $\hat{\mu}$ using the same procedure we used for
+complete data, by using equations (\ref{eqn:censor_solvemu}),
+(\ref{eqn:censor_newtontarget}), and (\ref{eqn:censor_newtonderiv}) in
+place of equations (\ref{eqn:solvemu}), (\ref{eqn:newtontarget}), and
+(\ref{eqn:newtonderivative}). Easel implements this procedure in
+\ccode{esl\_evd\_FitCensored()}. The target function
+(\ref{eqn:censor_newtontarget}) and its derivative
+(\ref{eqn:censor_newtonderiv}) are implemented in the auxiliary
+function \ccode{lawless422()} \citep{Lawless82}.
+
+Results on 500 simulated datasets with $\mu = -20, \lambda = 0.4$,
+censored at $\phi = -20$ -- the expected peak of the histogram; that
+is, a censored fit only to the right tail, which contains about 63\%
+of the samples:
+
+\begin{center}
+\begin{tabular}{lrrrr} \hline
+ & \multicolumn{4}{c}{\# samples in EVD histogram}\\
+ & 100 & 1000 & 10,000 & 100,000 \\
+\% error in $\mu$ & 1\%& 0.4\% & 0.1\% & 0.04\% \\
+max error in $\mu$ & 5\%& 2\% & 0.5\% & 0.2\% \\
+\% error in $\lambda$ & 9\%& 3\% & 0.9\% & 0.3\% \\
+max error in $\lambda$ & 33\%& 11\% & 3\% & 1\% \\ \hline
+\end{tabular}
+\end{center}
+
+\subsubsection{Maximum likelihood fitting to truncated data}
+
+A \emph{truncated} dataset is when we only observe $n$ samples $x_i$,
+and an \emph{unknown} number $z$ of samples less than some threshold
+$\phi$ were unobserved. Thus, only the right tail of $n$ samples $x_i
+\geq \phi$ as observed. In a truncated dataset, $x_1..x_n$, $n$, and
+$\phi$ are known, but $z$ is unknown.
+
+Solving a truncated data problem motivates a Bayesian approach,
+because we need to integrate out (marginalize) the nuisance $z$
+parameter, and to do this, we have to specify a prior distribution for
+$P(z)$. Gelman \emph{et al.} describe a general Bayesian framework for
+thinking about various types of missing data problems, including
+censored and truncated data \citep{Gelman95}.
+
+In short, to obtain maximum likelihood parameters $\hat{\theta}$ for
+some distribution, given truncated data, the log likelihood we wish to
+maximize is:
+
+\begin{equation}
+ \hat{\theta} = \argmax_\theta -n \log P(x \geq \phi \mid \theta)
+ + \sum_{i=1}^n \log P(x_i \mid \theta).
+\label{eqn:truncated_objective}
+\end{equation}
+
+\textbf{Detour: derivation of the truncated data likelihood}
+
+The derivation of the above equation may not be immediately obvious.
+The presence of the $n P(x \geq \phi \mid \theta)$ term may be
+counterintuitive, as opposed to the more intuitive $z P(x < \phi \mid
+\theta)$ term that accounts for the missing data in a censored data
+problem. Gelman \emph{et al.} actually don't even show the equation in
+their book; I obtained it from an exercise solution on their web site.
+To convince you (and to remind me) of its correctness, a sketch of the
+derivation follows.
+
+We start with the same likelihood equation that arises in censored
+data for a \emph{known} total number of samples $N$ (where $N=n+z$),
+but since $N$ is unknown, we need to integrate over all possible $N$
+from $n$ to $\infty$:
+
+\begin{eqnarray*}
+ P(\mathbf{x} \mid \theta, \phi) & = &
+ \sum_{N=n}^{\infty} P(\mathbf{x} \mid \theta, \phi, N) P(N)\\
+ & = &
+ \prod_{i=1}^n P(x_i \mid \theta)
+ \left[
+ \sum_{N=n}^\infty {N \choose n} P(x < \phi \mid \theta)^{N-n} P(N)
+ \right]\\
+\end{eqnarray*}
+
+The $\prod_{i=1}^n P(x_i \mid \theta)$ is straightforward; that sum is
+our problem. The trick is to rearrange it so we can treat it as a
+convergent negative binomial series:
+
+\[
+ (1-p)^{-a} = 1 + ap + \frac{a(a+1)}{2!} p^2 +
+ \frac{a(a+1)(a+2)}{3!} p^3...
+\]
+
+To get the sum into the form of this series, Gelman \emph{et al.}
+suggest using an informative prior $P(N) = \frac{1}{N}$, an apparently
+unmotivated choice that happens to make the sum collapse nicely:
+
+\begin{eqnarray*}
+ &=& P(N=n)
+ + (n+1) P(x < \phi \mid \theta) P(N=n+1)
+ + \frac{(n+1)(n+2)}{2!} P(x < \phi \mid \theta)^2 P(N=n+2) ...\\
+ &= & \frac{1}{n} \left[
+ 1
+ + n P(x < \phi \mid \theta)
+ + \frac{n(n+1)}{2!} P(x < \phi \mid \theta)^2
+ + \frac{n(n+1)(n+2)}{3!} P(x < \phi \mid \theta)^3 \right]\\
+ &=& \frac{1}{n} (1 - P(x < \phi \mid \theta))^{-n}\\
+ &=& \frac{1}{n} P(x \geq \phi \mid \theta)^{-n}\\
+\end{eqnarray*}
+
+The $\frac{1}{n}$ is a constant, so we drop it from the likelihood
+equation we'll maximize. Putting this term back together with the
+probability of the observed data and taking the log, we obtain the log
+likelihood in equation (\ref{eqn:truncated_objective}).
+
+Alternatively, we might choose an uninformative improper uniform prior
+$P(N) \propto 1$. This gives a log likelihood that only differs by a
+term of $n+1$ versus $n$:
+
+\begin{equation}
+ \hat{\theta} = \argmax_\theta -(n+1) \log P(x \geq \phi \mid \theta)
+ + \sum_{i=1}^n \log P(x_i \mid \theta).
+\end{equation}
+
+However, empirically, this form is ineffective, at least for fitting
+Gumbels. The $\frac{1}{N}$ prior performs much better, probably
+because it constrains the solutions to favor smaller, finite, more
+reasonable choices of $N$.
+
+
+
+\textbf{Back to fitting a truncated Gumbel}
+
+For the specific case of fitting a truncated Gumbel, the log
+likelihood (\ref{eqn:truncated_objective}) to optimize is:
+
+\[
+ \log L(\lambda, \mu) =
+ n \log \lambda
+ - \sum_{i=1}^{n} \lambda(x_i - \mu)
+ - \sum_{i=1}^{n} e^{-\lambda(x_i - \mu)}
+ - n \log (1 - \exp(-e^{-\lambda(\phi - \mu)}))
+\label{eqn:truncated_logL}
+\]
+
+This is differentiable with respect to $\lambda$ and $\mu$, but it's
+not going to reduce to the clean root-finding problem that we obtained
+for complete data or censored data. Instead we're going to be left
+with a numerical optimization problem. We can use standard numerical
+optimization code, such as steepest descent or conjugate gradient
+descent. There's just one hitch. These algorithms assume unconstrained
+parameters, but $\lambda$ is constrained to values $>0$. We do a
+change of variables, and use the transformation $\lambda = e^w$ so we
+can optimize the unconstrained parameter $w = \log \lambda$ instead of
+optimizing $\lambda$ directly. The necessary partial derivatives are
+then:
+
+\begin{eqnarray}
+\frac{\partial \log L}{\partial \mu} & = &
+n \lambda
+- \lambda \sum_{i=1}^{n} e^{-\lambda (x_i - \mu)}
+- \frac{n \lambda \exp \left[ -\lambda (\phi - \mu) - e^{- \lambda (\phi - \mu)} \right]}
+ {1 - \exp(-e^{-\lambda(\phi - \mu)})}
+\label{eqn:truncated_dmu}
+\\%
+\frac{\partial \log L}{\partial w} & = &
+n
+- \sum_{i=1}^{n} \lambda(x_i - \mu)
++ \sum_{i=1}^{n} \lambda(x_i - \mu) e^{-\lambda (x_i - \mu)}
++ \frac{n\lambda (\phi-\mu) \exp \left[ -\lambda (\phi - \mu) - e^{- \lambda (\phi - \mu)} \right]}
+ {1 - \exp(-e^{-\lambda(\phi - \mu)})}
+\label{eqn:truncated_dw}
+\end{eqnarray}
+
+This optimization is carried out by \ccode{esl\_evd\_FitTruncated()}.
+The likelihood (\ref{eqn:truncated_logL}) is implemented in
+\ccode{tevd\_func()}, and the derivatives (\ref{eqn:truncated_dmu}) and
+(\ref{eqn:truncated_dw}) are implemented in \ccode{tevd\_dfunc()}.
+\ccode{esl\_evd\_FitTruncated()} simply sets up the problem and passes
+it all off to a conjugate gradient descent optimizer.
+
+Results on 500 simulated datasets with $\mu = -20, \lambda = 0.4$,
+truncated at $\phi = -20$ (leaving the right tail, containing about
+63\% of the samples):
+
+\begin{center}
+\begin{tabular}{lrrrr} \hline
+ & \multicolumn{4}{c}{\# samples}\\
+ & 100 & 1000 & 10,000 & 100,000 \\
+\% error in $\hat{\mu}$ & 13\%& 2\% & 0.8\% & 0.3\% \\
+max error in $\hat{\mu}$ &260\%& 42\% & 3\% & 1\% \\
+\% error in $\hat{\lambda}$ & 15\%& 5\% & 2\% & 0.6\% \\
+max error in $\hat{\lambda}$ & 68\%& 18\% & 6\% & 2\% \\ \hline
+\end{tabular}
+\end{center}
+
+Fitting truncated Gumbel distributions is difficult, requiring much
+more data than fitting complete or censored data. The problem is that
+the right tail becomes a scale-free exponential when $\phi >> \mu$,
+and $\mu$ becomes undetermined. Fits become very inaccurate as $\phi$
+gets larger than $\mu$, and for sufficiently large $\phi$, the
+numerical optimizer will completely fail.
+
+
+
+
+
+
+
diff --git a/esl_heap.c b/esl_heap.c
new file mode 100644
index 0000000..59a8bdf
--- /dev/null
+++ b/esl_heap.c
@@ -0,0 +1,343 @@
+/* Heaps and priority queues.
+ * See TH Cormen, CE Leiserson, and RL Rivest, _Introduction to Algorithms_, MIT Press, 1999.
+ *
+ * Contents:
+ * 1. The <ESL_HEAP> object: creation, access.
+ * 2. Rest of the API: inserting, extracting values.
+ * 3. Debugging, development.
+ * 4. Internal functions.
+ * 5. Unit tests.
+ * 6. Test driver.
+ * 7. Copyright and license.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_heap.h"
+
+static int heap_grow(ESL_HEAP *hp);
+static void iheapify (ESL_HEAP *hp, int idx);
+
+/*****************************************************************
+ * 1. The <ESL_HEAP> object.
+ *****************************************************************/
+
+/* Function: esl_heap_ICreate()
+ * Synopsis: Create a heap for storing integers.
+ *
+ * Purpose: Create a heap for storing integers. <maxormin> is
+ * <eslHEAP_MIN> or <eslHEAP_MAX>; it states whether
+ * minimum or maximum values are sorted to the top of the
+ * heap.
+ *
+ * Args: maxormin : <eslHEAP_MIN | eslHEAP_MAX>
+ *
+ * Returns: a pointer to the new heap.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_HEAP *
+esl_heap_ICreate(int maxormin)
+{
+ ESL_HEAP *hp = NULL;
+ int status;
+
+ ESL_DASSERT1(( maxormin == eslHEAP_MIN || maxormin == eslHEAP_MAX));
+
+ ESL_ALLOC(hp, sizeof(ESL_HEAP));
+ hp->idata = NULL;
+ hp->n = 0;
+ hp->maxormin = maxormin;
+
+ ESL_ALLOC(hp->idata, sizeof(int) * eslHEAP_INITALLOC);
+ hp->nalloc = eslHEAP_INITALLOC;
+
+ return hp;
+
+ ERROR:
+ esl_heap_Destroy(hp);
+ return NULL;
+}
+
+/* Function: esl_heap_GetCount()
+ * Synopsis: Returns the number of items in the heap.
+ */
+int
+esl_heap_GetCount(ESL_HEAP *hp)
+{
+ return hp->n;
+}
+
+/* Function: esl_heap_IGetTopVal()
+ * Synopsis: Peeks at and returns the best (topmost) value in the heap.
+ *
+ * Purpose: Peek at the best (topmost) value in heap <hp> and
+ * return it. The heap is unaffected. If the heap is
+ * empty, return 0.
+ */
+int
+esl_heap_IGetTopVal(ESL_HEAP *hp)
+{
+ return (hp->n ? hp->idata[0] : 0);
+}
+
+
+/* Function: esl_heap_Reuse()
+ * Synopsis: Reuse a heap.
+ *
+ * Purpose: As an alternative to destroy'ing an old heap and
+ * create'ing a new one, empty this heap and reinitialize
+ * it, as if it is a freshly created heap of the same
+ * data type and same <maxormin>.
+ *
+ * Returns: <eslOK>
+ */
+int
+esl_heap_Reuse(ESL_HEAP *hp)
+{
+ hp->n = 0;
+ return eslOK;
+}
+
+
+/* Function: esl_heap_Destroy()
+ * Synopsis: Free a heap.
+ *
+ * Purpose: Destroys heap <hp>, of any data type.
+ *
+ * Returns: (void)
+ *
+ * Throws: (no abnormal error conditions)
+ */
+void
+esl_heap_Destroy(ESL_HEAP *hp)
+{
+ if (hp)
+ {
+ if (hp->idata) free(hp->idata);
+ free (hp);
+ }
+}
+
+/*****************************************************************
+ * 2. Rest of the API: inserting, extracting values
+ *****************************************************************/
+
+/* Function: esl_heap_IInsert()
+ * Synopsis: Insert a value into the heap.
+ *
+ * Purpose: Insert value <val> into heap <hp>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_heap_IInsert(ESL_HEAP *hp, int val)
+{
+ int idx, parentidx;
+ int status;
+
+ if (hp->n == hp->nalloc && (status = heap_grow(hp)) != eslOK) return status;
+
+ hp->n++;
+ idx = hp->n - 1;
+ while (idx > 0 && (hp->maxormin == eslHEAP_MIN ? hp->idata[ESL_HEAP_PARENT(idx)] > val : hp->idata[ESL_HEAP_PARENT(idx)] < val))
+ {
+ parentidx = ESL_HEAP_PARENT(idx);
+ hp->idata[idx] = hp->idata[parentidx];
+ idx = parentidx;
+ }
+ hp->idata[idx] = val;
+ return eslOK;
+}
+
+
+/* Function: esl_heap_IExtractTop()
+ * Synopsis: Extract the top value from the heap.
+ *
+ * Purpose: Extract the best (topmost) value from heap <hp>.
+ * Delete it from the heap. Return it in <*opt_val>.
+ *
+ * To simply delete the topmost value (without retrieving
+ * its value), pass <NULL> for <opt_val>.
+
+ * If the heap is empty, return <eslEOD>, and
+ * <*opt_val> is 0.
+ *
+ * Returns: <eslOK> on success, and <*opt_val> is the extracted
+ * topmost value.
+ *
+ * <eslEOD> if the heap is empty; <*opt_val> is 0.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_heap_IExtractTop(ESL_HEAP *hp, int *opt_val)
+{
+ int bestval;
+
+ if (hp->n == 0) { *opt_val = 0; return eslEOD; }
+
+ bestval = hp->idata[0];
+
+ hp->idata[0] = hp->idata[hp->n-1];
+ hp->n--;
+ iheapify(hp, 0);
+
+ if (opt_val) *opt_val = bestval;
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 3. Debugging, development.
+ *****************************************************************/
+
+int
+esl_heap_Validate(ESL_HEAP *hp, char *errbuf)
+{
+ int idx, lidx, ridx;
+
+ for (idx = 0; idx < hp->n; idx++)
+ {
+ lidx = ESL_HEAP_LEFT(idx);
+ ridx = lidx+1;
+ if (lidx < hp->n && ( hp->maxormin == eslHEAP_MIN ? hp->idata[lidx] < hp->idata[idx] : hp->idata[lidx] > hp->idata[idx] ))
+ ESL_FAIL(eslFAIL, errbuf, "at %d (value %d): left child %d (value %d) is better", idx, hp->idata[idx], lidx, hp->idata[lidx]);
+ if (ridx < hp->n && ( hp->maxormin == eslHEAP_MIN ? hp->idata[ridx] < hp->idata[idx] : hp->idata[ridx] > hp->idata[idx] ))
+ ESL_FAIL(eslFAIL, errbuf, "at %d (value %d): right child %d (value %d) is better", idx, hp->idata[idx], ridx, hp->idata[ridx]);
+ }
+ return eslOK;
+}
+
+/*****************************************************************
+ * 4. Internal functions
+ *****************************************************************/
+
+static int
+heap_grow(ESL_HEAP *hp)
+{
+ int status;
+
+ if (hp->idata) {
+ ESL_REALLOC(hp->idata, sizeof(int) * (hp->nalloc*2));
+ hp->nalloc += hp->nalloc;
+ }
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+
+static void
+iheapify(ESL_HEAP *hp, int idx)
+{
+ int bestidx = idx;
+ int leftidx, rightidx;
+
+ while (1) /* while loop avoids recursive heapify call */
+ {
+ leftidx = ESL_HEAP_LEFT(idx);
+ rightidx = leftidx+1;
+ if (leftidx < hp->n && (hp->maxormin == eslHEAP_MIN ? hp->idata[leftidx] < hp->idata[idx] : hp->idata[leftidx] > hp->idata[idx]) ) bestidx = leftidx;
+ if (rightidx < hp->n && (hp->maxormin == eslHEAP_MIN ? hp->idata[rightidx] < hp->idata[bestidx] : hp->idata[rightidx] > hp->idata[bestidx]) ) bestidx = rightidx;
+ if (bestidx == idx) break; /* nothing needed to be changed: either because <idx> satisfies heap property, or because it has no children */
+ ESL_SWAP(hp->idata[idx], hp->idata[bestidx], int);
+ idx = bestidx;
+ }
+}
+
+
+/*****************************************************************
+ * 5. Unit tests
+ *****************************************************************/
+#ifdef eslHEAP_TESTDRIVE
+#include "esl_random.h"
+
+static void
+utest_sorting(ESL_RANDOMNESS *rng)
+{
+ char *msg = "utest_sorting():: unit test failure";
+ ESL_HEAP *hp = NULL;
+ int *val = NULL;
+ int nv = 1 + esl_rnd_Roll(rng, 10000);
+ char errbuf[eslERRBUFSIZE];
+ int i,n2,x;
+
+ /* Create an array of numbers 1..nv in randomized order. */
+ if ( (val = malloc(sizeof(int) * nv)) == NULL) esl_fatal("utest_sorting():: allocation failed");
+ for (i = 0; i < nv; i++) val[i] = i+1;
+ for (n2 = nv; n2 > 1; n2--)
+ { /* a compact Fisher-Yates shuffle. Can't put the Roll() into the ESL_SWAP(), because it's a macro: avoid double evaluation */
+ i = esl_rnd_Roll(rng, n2);
+ ESL_SWAP( val[i], val[n2-1], int);
+ }
+
+ /* Add those numbers (in their randomized order) to a min heap */
+ if ( (hp = esl_heap_ICreate(eslHEAP_MIN)) == NULL) esl_fatal(msg);
+ for (i = 0; i < nv; i++)
+ if (esl_heap_IInsert(hp, val[i]) != eslOK) esl_fatal(msg);
+ if (esl_heap_Validate(hp, errbuf) != eslOK) esl_fatal("utest: heap validation fails: %s", errbuf);
+
+ /* Now if we pull numbers off the heap, they'll come off in sorted order, 1..nv */
+ for (i = 1; i <= nv; i++)
+ {
+ if (esl_heap_IExtractTop(hp, &x) != eslOK) esl_fatal(msg);
+ if (x != i) esl_fatal(msg);
+ if (hp->n != nv-i) esl_fatal(msg);
+ }
+
+ esl_heap_Destroy(hp);
+ free(val);
+}
+
+#endif /*eslHEAP_TESTDRIVE*/
+
+/*****************************************************************
+ * 6. Test driver
+ *****************************************************************/
+#ifdef eslHEAP_TESTDRIVE
+
+#include "easel.h"
+#include "esl_getopts.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ {"-s", eslARG_INT, "0", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for ESL_HEAP: heaps and priority queues";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *rng = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+
+ fprintf(stderr, "## %s\n", argv[0]);
+ fprintf(stderr, "# rng seed = %" PRIu32 "\n", esl_randomness_GetSeed(rng));
+
+ utest_sorting(rng);
+
+ fprintf(stderr, "# status = ok\n");
+
+ esl_getopts_Destroy(go);
+ esl_randomness_Destroy(rng);
+ return 0;
+}
+
+#endif /*eslHEAP_TESTDRIVE*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_heap.h b/esl_heap.h
new file mode 100644
index 0000000..88caa45
--- /dev/null
+++ b/esl_heap.h
@@ -0,0 +1,44 @@
+/* Heaps and priority queues.
+ * See TH Cormen, CE Leiserson, and RL Rivest, _Introduction to Algorithms_, MIT Press, 1999.
+ */
+#ifndef eslHEAP_INCLUDED
+#define eslHEAP_INCLUDED
+
+#include "esl_config.h"
+
+#define eslHEAP_INITALLOC 128
+
+#define eslHEAP_MIN 0
+#define eslHEAP_MAX 1
+
+#define ESL_HEAP_PARENT(i) ( ((i)-1) / 2 )
+#define ESL_HEAP_LEFT(i) ( ((i)*2) + 1 )
+#define ESL_HEAP_RIGHT(i) ( ((i)+1) * 2 )
+
+typedef struct esl_heap_s {
+ int *idata;
+
+ int n;
+ int nalloc;
+ int maxormin; /* eslHEAP_MAX | eslHEAP_MIN */
+} ESL_HEAP;
+
+extern ESL_HEAP *esl_heap_ICreate (int maxormin);
+extern int esl_heap_GetCount (ESL_HEAP *hp);
+extern int esl_heap_IGetTopVal(ESL_HEAP *hp);
+extern int esl_heap_Reuse (ESL_HEAP *hp);
+extern void esl_heap_Destroy (ESL_HEAP *hp);
+
+extern int esl_heap_IInsert(ESL_HEAP *hp, int val);
+
+extern int esl_heap_IExtractTop(ESL_HEAP *hp, int *ret_val);
+
+extern int esl_heap_IGetTop(ESL_HEAP *hp);
+
+#endif /*eslHEAP_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_histogram.c b/esl_histogram.c
new file mode 100644
index 0000000..df4d463
--- /dev/null
+++ b/esl_histogram.c
@@ -0,0 +1,2070 @@
+/* Collecting and displaying histograms.
+ *
+ * 1. Creating/destroying histograms and collecting data.
+ * 2. Declarations about the binned data before parameter fitting.
+ * 3. Routines for accessing data samples in a full histogram.
+ * 4. Setting expected counts
+ * 5. Output and display of binned data.
+ * 6. Test driver.
+ * 7. Examples.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <float.h>
+#include <limits.h>
+
+#include "easel.h"
+#include "esl_stats.h"
+#include "esl_histogram.h"
+#include "esl_vectorops.h"
+
+static int esl_histogram_sort(ESL_HISTOGRAM *h);
+
+
+/*****************************************************************
+ * 1. Creating/destroying histograms and collecting data.
+ *****************************************************************/
+
+/* Function: esl_histogram_Create()
+ * Synopsis: Create a new <ESL_HISTOGRAM>.
+ *
+ * Purpose: Creates and returns a new histogram object, initially
+ * allocated to count values $>$ <bmin> and $<=$ <bmax> into
+ * bins of width <w>. Thus, a total of <bmax>-<bmin>/<w> bins
+ * are initially created.
+ *
+ * The lower bound <bmin> and the width <w> permanently
+ * determine the offset and width of the binning, but not
+ * the range. For example, <esl_histogram_Create(-100,
+ * 100, 0.5)> would initialize the object to collect scores into
+ * 400 bins $[-100< x \leq -99.5],[-99.5 < x \leq
+ * -99.0]...[99.5 <x \leq 100.0]$. Aside from this, the
+ * range specified by the bounds <bmin> and <bmax> only
+ * needs to be an initial guess. The histogram object will
+ * reallocate itself dynamically as needed to accommodate
+ * scores that exceed current bounds.
+ *
+ * You can be sloppy about <bmax>; it does not have to
+ * exactly match a bin upper bound. The initial allocation
+ * is for all full-width bins with upper bounds $\leq
+ * bmax$.
+ *
+ * <esl_histogram_Create()> creates a simplified histogram
+ * object that collates only the "display" histogram. For
+ * a more complex object that also keeps the raw data samples,
+ * better suited for fitting distributions and goodness-of-fit
+ * testing, use <esl_histogram_CreateFull()>.
+ *
+ * There is currently no way to alter where the equals sign
+ * is, in setting the bin bounds: that is, you can't make bins
+ * that have <bmin> $\leq x$ and $x <$ <bmax>, alas.
+
+ *
+ * Args: bmin - caller guesses that minimum score will be > bmin
+ * bmax - caller guesses that max score will be <= bmax
+ * w - size of bins (1.0, for example)
+ *
+ * Returns: ptr to new <ESL_HISTOGRAM> object, which caller is responsible
+ * for free'ing with <esl_histogram_Destroy()>.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_HISTOGRAM *
+esl_histogram_Create(double bmin, double bmax, double w)
+{
+ ESL_HISTOGRAM *h = NULL;
+ int status;
+ int i;
+
+ ESL_ALLOC(h, sizeof(ESL_HISTOGRAM));
+
+ h->xmin = DBL_MAX; /* xmin/xmax are the observed min/max */
+ h->xmax = -DBL_MAX;
+ h->n = 0;
+ h->obs = NULL; /* will get allocated below... */
+ h->bmin = bmin; /* bmin/bmax are the allocated bounds */
+ h->bmax = bmax;
+ h->nb = (int)((bmax-bmin)/w);
+ h->imin = h->nb;
+ h->imax = -1;
+ h->w = w;
+
+ h->x = NULL;
+ h->nalloc = 0;
+
+ h->phi = 0.;
+ h->cmin = h->imin; /* sentinel: no observed data yet */
+ h->z = 0;
+ h->Nc = 0;
+ h->No = 0;
+
+ h->expect = NULL; /* 'til a Set*() call */
+ h->emin = -1; /* sentinel: no expected counts yet */
+ h->tailbase = 0.; /* unused unless is_tailfit TRUE */
+ h->tailmass = 1.0; /* <= 1.0 if is_tailfit TRUE */
+
+ h->is_full = FALSE;
+ h->is_done = FALSE;
+ h->is_sorted = FALSE;
+ h->is_tailfit = FALSE;
+ h->is_rounded = FALSE;
+ h->dataset_is = COMPLETE;
+
+ ESL_ALLOC(h->obs, sizeof(uint64_t) * h->nb);
+ for (i = 0; i < h->nb; i++) h->obs[i] = 0;
+ return h;
+
+ ERROR:
+ esl_histogram_Destroy(h);
+ return NULL;
+}
+
+/* Function: esl_histogram_CreateFull()
+ * Synopsis: A <ESL_HISTOGRAM> to keep all data samples.
+ *
+ * Purpose: Alternative form of <esl_histogram_Create()> that
+ * creates a more complex histogram that will contain not just the
+ * display histogram, but also keeps track of all
+ * the raw sample values. Having a complete vector of raw
+ * samples improves distribution-fitting and goodness-of-fit
+ * tests, but will consume more memory.
+ */
+ESL_HISTOGRAM *
+esl_histogram_CreateFull(double bmin, double bmax, double w)
+{
+ int status;
+ ESL_HISTOGRAM *h = esl_histogram_Create(bmin, bmax, w);
+ if (h == NULL) return NULL;
+
+ h->n = 0; /* make sure */
+ h->nalloc = 128; /* arbitrary initial allocation size */
+ ESL_ALLOC(h->x, sizeof(double) * h->nalloc);
+ h->is_full = TRUE;
+ return h;
+
+ ERROR:
+ esl_histogram_Destroy(h);
+ return NULL;
+}
+
+
+/* Function: esl_histogram_Destroy()
+ * Synopsis: Frees a <ESL_HISTOGRAM>.
+ *
+ * Purpose: Frees an <ESL_HISTOGRAM> object <h>.
+ */
+void
+esl_histogram_Destroy(ESL_HISTOGRAM *h)
+{
+ if (h == NULL) return;
+ if (h->x != NULL) free(h->x);
+ if (h->obs != NULL) free(h->obs);
+ if (h->expect != NULL) free(h->expect);
+ free(h);
+ return;
+}
+
+/* Function: esl_histogram_Score2Bin()
+ * Synopsis: Given a real-valued <x>; calculate integer bin <b>
+ *
+ * Purpose: For a real-valued <x>, figure out what bin it would
+ * go into in the histogram <h>; return this value in
+ * <*ret_b>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslERANGE> if bin <b> would exceed the range of
+ * an integer; for instance, if <x> isn't finite.
+ *
+ * Xref: J5/122. Replaces earlier macro implementation;
+ * we needed to range check <x> better.
+ */
+int
+esl_histogram_Score2Bin(ESL_HISTOGRAM *h, double x, int *ret_b)
+{
+ int status;
+
+ if (! isfinite(x)) ESL_XEXCEPTION(eslERANGE, "value added to histogram is not finite");
+
+ x = ceil( ((x - h->bmin) / h->w) - 1.);
+
+ /* x is now the bin number as a double, which we will convert to
+ * int. Because x is a double (64-bit), we know all ints are exactly
+ * represented. Check for under/overflow before conversion.
+ */
+ if (x < (double) INT_MIN || x > (double) INT_MAX)
+ ESL_XEXCEPTION(eslERANGE, "value %f isn't going to fit in histogram", x);
+
+ *ret_b = (int) x;
+ return eslOK;
+
+ ERROR:
+ *ret_b = 0;
+ return status;
+}
+
+
+/* Function: esl_histogram_Add()
+ * Synopsis: Add a sample to the histogram.
+ *
+ * Purpose: Adds score <x> to a histogram <h>.
+ *
+ * The histogram will be automatically reallocated as
+ * needed if the score is smaller or larger than the
+ * current allocated bounds.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on reallocation failure.
+ *
+ * <eslERANGE> if <x> is beyond the reasonable range for
+ * the histogram to store -- either because it isn't finite,
+ * or because the histogram would need to allocate a number
+ * of bins that exceeds <INT_MAX>.
+ *
+ * Throws <eslEINVAL> for cases where something has been done
+ * to the histogram that requires it to be 'finished', and
+ * adding more data is prohibited; for example,
+ * if tail or censoring information has already been set.
+ * On either failure, initial state of <h> is preserved.
+ */
+int
+esl_histogram_Add(ESL_HISTOGRAM *h, double x)
+{
+ int status;
+ void *tmp;
+ int b; /* what bin we're in */
+ int nnew; /* # of new bins created by a reallocation */
+ int bi;
+
+ /* Censoring info must only be set on a finished histogram;
+ * don't allow caller to add data after configuration has been declared
+ */
+ if (h->is_done)
+ ESL_EXCEPTION(eslEINVAL, "can't add more data to this histogram");
+
+ /* If we're a full histogram, check whether we need to reallocate
+ * the full data vector.
+ */
+ if (h->is_full && h->nalloc == h->n)
+ {
+ ESL_RALLOC(h->x, tmp, sizeof(double) * h->nalloc * 2);
+ h->nalloc *= 2;
+ }
+
+ /* Which bin will we want to put x into?
+ */
+ if ((status = esl_histogram_Score2Bin(h,x, &b)) != eslOK) return status;
+
+ /* Make sure we have that bin. Realloc as needed.
+ * If that reallocation succeeds, we can no longer fail;
+ * so we can change the state of h.
+ */
+ if (b < 0) /* Reallocate below? */
+ {
+ nnew = -b*2; /* overallocate by 2x */
+ if (nnew > INT_MAX - h->nb)
+ ESL_EXCEPTION(eslERANGE, "value %f requires unreasonable histogram bin number", x);
+ ESL_RALLOC(h->obs, tmp, sizeof(uint64_t) * (nnew+ h->nb));
+
+ memmove(h->obs+nnew, h->obs, sizeof(uint64_t) * h->nb);
+ h->nb += nnew;
+ b += nnew;
+ h->bmin -= nnew*h->w;
+ h->imin += nnew;
+ h->cmin += nnew;
+ if (h->imax > -1) h->imax += nnew;
+ for (bi = 0; bi < nnew; bi++) h->obs[bi] = 0;
+ }
+ else if (b >= h->nb) /* Reallocate above? */
+ {
+ nnew = (b-h->nb+1) * 2; /* 2x overalloc */
+ if (nnew > INT_MAX - h->nb)
+ ESL_EXCEPTION(eslERANGE, "value %f requires unreasonable histogram bin number", x);
+ ESL_RALLOC(h->obs, tmp, sizeof(uint64_t) * (nnew+ h->nb));
+ for (bi = h->nb; bi < h->nb+nnew; bi++) h->obs[bi] = 0;
+ if (h->imin == h->nb) { /* boundary condition of no data yet*/
+ h->imin+=nnew;
+ h->cmin+=nnew;
+ }
+ h->bmax += nnew*h->w;
+ h->nb += nnew;
+ }
+
+ /* If we're a full histogram, then we keep the raw x value,
+ * reallocating as needed.
+ */
+ if (h->is_full) h->x[h->n] = x;
+ h->is_sorted = FALSE; /* not any more! */
+
+ /* Bump the bin counter, and all the data sample counters.
+ */
+ h->obs[b]++;
+ h->n++;
+ h->Nc++;
+ h->No++;
+
+ if (b > h->imax) h->imax = b;
+ if (b < h->imin) { h->imin = b; h->cmin = b; }
+ if (x > h->xmax) h->xmax = x;
+ if (x < h->xmin) h->xmin = x;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* esl_histogram_sort()
+ *
+ * Purpose: Sort the raw scores in a full histogram, from smallest to
+ * largest. Has no effect on a normal histogram, or on a full
+ * histogram that is already sorted.
+ *
+ * Returns: <eslOK> on success.
+ * Upon return, <h->x[h->n-1]> is the high score, <h->x[0]> is the
+ * low score.
+ */
+int
+esl_histogram_sort(ESL_HISTOGRAM *h)
+{
+ if (h->is_sorted) return eslOK; /* already sorted, don't do anything */
+ if (! h->is_full) return eslOK; /* nothing to sort */
+
+ esl_vec_DSortIncreasing(h->x, h->n);
+ h->is_sorted = TRUE;
+ return eslOK;
+}
+
+/*****************************************************************
+ * 2. Declarations about the binned data before parameter fitting
+ *****************************************************************/
+
+/* Function: esl_histogram_DeclareCensoring()
+ * Synopsis: Collected data were left-censored.
+ *
+ * Purpose: Declare that the dataset collected in <h> is known to be a
+ * censored distribution, where <z> samples were unobserved because
+ * they had values $\leq$ some threshold <phi> ($\phi$).
+ *
+ * No more data can be added to the histogram with <_Add()>
+ * after censoring information has been set.
+ *
+ * This function is for "true" censored datasets, where
+ * the histogram truly contains no observed points
+ * $x \leq \phi$, and the number that were censored is known
+ * to be <z>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if you try to set <phi> to a value that is
+ * greater than the minimum <x> stored in the histogram.
+ */
+int
+esl_histogram_DeclareCensoring(ESL_HISTOGRAM *h, int z, double phi)
+{
+ if (phi > h->xmin) ESL_EXCEPTION(eslEINVAL, "no uncensored x can be <= phi");
+
+ h->phi = phi;
+ h->cmin = h->imin;
+ h->z = z;
+ h->Nc = h->n + z;
+ h->No = h->n;
+ h->dataset_is = TRUE_CENSORED;
+ h->is_done = TRUE;
+ return eslOK;
+}
+
+/* Function: esl_histogram_DeclareRounding()
+ * Synopsis: Declare collected data were no more accurate than bins.
+ *
+ * Purpose: Declare that the data sample values in the histogram <h>
+ * are rounded off. Ideally, your bins in <h> should exactly
+ * match the rounding procedure. This raises a flag that
+ * binned parameter fitting routines will use when they set
+ * an origin, using the lower bound of the bin instead of
+ * the lowest raw value in the bin.
+ */
+int
+esl_histogram_DeclareRounding(ESL_HISTOGRAM *h)
+{
+ h->is_rounded = TRUE;
+ return eslOK;
+}
+
+
+/* Function: esl_histogram_SetTail()
+ * Synopsis: Declare only tail $>$ some threshold is considered "observed".
+ *
+ * Purpose: Suggest a threshold <phi> to split a histogram <h>
+ * into "unobserved" data (values $\leq \phi$) and "observed"
+ * data (values $> \phi$).
+ *
+ * The suggested <phi> is revised downwards to a $\phi$ at the next
+ * bin lower bound, because operations on binned data in <h>
+ * need to know unambiguously whether all the data in a given bin
+ * will be counted as observed or unobserved.
+ *
+ * The probability mass that is in the resulting right tail
+ * is optionally returned in <ret_newmass>. You need to know
+ * this number if you're fitting a distribution solely to the
+ * tail (an exponential tail, for example).
+ *
+ * Any data point $x_i \leq \phi$ is then considered to be
+ * in a censored (unobserved) region for purposes of parameter
+ * fitting, calculating expected binned counts,
+ * and binned goodness-of-fit tests.
+ *
+ * No more data can be added to the histogram after
+ * censoring information has been set.
+ *
+ * This function defines a "virtual" left-censoring: the
+ * histogram actually contains complete data, but appropriate
+ * flags are set to demarcate the "observed" data in the right
+ * tail.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslERANGE> if <phi> is an unreasonable value that
+ * can't be converted to an integer bin value.
+ */
+int
+esl_histogram_SetTail(ESL_HISTOGRAM *h, double phi, double *ret_newmass)
+{
+ int b;
+ int status;
+
+ /* Usually, put true phi at the next bin lower bound, but
+ * watch for a special case where phi is already exactly equal to a
+ * bin upper bound.
+ */
+ if ((status = esl_histogram_Score2Bin(h,phi, &(h->cmin))) != eslOK) return status;
+ if (phi == esl_histogram_Bin2UBound(h,h->cmin)) h->phi = phi;
+ else h->phi = esl_histogram_Bin2LBound(h, h->cmin);
+
+ h->z = 0;
+ for (b = h->imin; b < h->cmin; b++)
+ h->z += h->obs[b];
+ h->Nc = h->n; /* (redundant) */
+ h->No = h->n - h->z;
+ h->dataset_is = VIRTUAL_CENSORED;
+ h->is_done = TRUE;
+ if (ret_newmass != NULL) *ret_newmass = (double) h->No / (double) h->Nc;
+ return eslOK;
+}
+
+/* Function: esl_histogram_SetTailByMass()
+ * Synopsis: Declare only right tail mass is considered "observed".
+ *
+ * Purpose: Given a histogram <h> (with or without raw data samples),
+ * find a cutoff score that at least fraction <pmass> of the samples
+ * exceed. This threshold is stored internally in the histogram
+ * as <h->phi>. The number of "virtually censored" samples (to the
+ * left, with scores $\leq \phi$) is stored internally in <h->z>.
+ *
+ * The identified cutoff score must be a lower bound for some bin
+ * (bins can't be partially censored). The censored mass
+ * will thus usually be a bit greater than <pmass>, as the
+ * routine will find the highest satisfactory <h->phi>. The
+ * narrower the bin widths, the more accurately the routine
+ * will be able to satisfy the requested <frac>. The actual
+ * probability mass in the right tail is optionally returned
+ * in <ret_newmass>. You need to know this number if you're
+ * fitting a distribution solely to the tail (an exponential tail,
+ * for example). It is safe for <ret_newmass> to point at
+ * <pmass>, in which case the suggested <pmass> will be overwritten
+ * with the actual mass upon return.
+ *
+ * This function defines that the binned data will be
+ * fitted either as a tail, or as a (virtually) left-censored dataset.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_histogram_SetTailByMass(ESL_HISTOGRAM *h, double pmass, double *ret_newmass)
+{
+ int b;
+ uint64_t sum = 0;
+
+ for (b = h->imax; b >= h->imin; b--)
+ {
+ sum += h->obs[b];
+ if (sum >= (pmass * (double)h->n)) break;
+ }
+
+ h->phi = esl_histogram_Bin2LBound(h,b);
+ h->z = h->n - sum;
+ h->cmin = b;
+ h->Nc = h->n; /* (redundant) */
+ h->No = h->n - h->z;
+ h->dataset_is = VIRTUAL_CENSORED;
+ h->is_done = TRUE;
+ if (ret_newmass != NULL) *ret_newmass = (double) h->No / (double) h->Nc;
+ return eslOK;
+}
+
+
+
+/*****************************************************************
+ * 3. Routines for accessing data samples in a full histogram.
+ *****************************************************************/
+
+/* Function: esl_histogram_GetRank()
+ * Synopsis: Retrieve n'th high score.
+ *
+ * Purpose: Retrieve the <rank>'th highest score from a
+ * full histogram <h>. <rank> is <1..n>, for
+ * <n> total samples in the histogram; return it through
+ * <ret_x>.
+ *
+ * If the raw scores aren't sorted, they are sorted
+ * first (an $N \log N$ operation).
+ *
+ * This can be called at any time, even during data
+ * collection, to see the current <rank>'th highest score.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if the histogram is display-only,
+ * or if <rank> isn't in the range 1..n.
+ */
+int
+esl_histogram_GetRank(ESL_HISTOGRAM *h, int rank, double *ret_x)
+{
+ if (! h->is_full)
+ ESL_EXCEPTION(eslEINVAL,
+ "esl_histogram_GetRank() needs a full histogram");
+ if (rank > h->n)
+ ESL_EXCEPTION(eslEINVAL,
+ "no such rank: not that many scores in the histogram");
+ if (rank < 1)
+ ESL_EXCEPTION(eslEINVAL, "histogram rank must be a value from 1..n");
+
+ esl_histogram_sort(h); /* make sure */
+ *ret_x = h->x[h->n - rank];
+ return eslOK;
+}
+
+/* Function: esl_histogram_GetData()
+ * Synopsis: Retrieve vector of all raw scores.
+ *
+ * Purpose: Retrieve the raw data values from the histogram <h>.
+ * Return them in the vector <ret_x>, and the number
+ * of values in <ret_n>. The values are indexed <[0..n-1]>,
+ * from smallest to largest (<x[n-1]> is the high score).
+ *
+ * <ret_x> is a pointer to internal memory in the histogram <h>.
+ * The histogram <h> is still responsible for that storage;
+ * its memory will be free'd when you call
+ * <esl_histogram_Destroy()>.
+ *
+ * You can only call this after you have finished collecting
+ * all the data. Subsequent calls to <esl_histogram_Add()>
+ * will fail.
+ *
+ * Internal note:
+ * The prohibition against adding more data (by raising
+ * the h->is_done flag) is because we're passing a pointer
+ * to internal data storage back to the caller. Subsequent
+ * calls to Add() will modify that memory -- in the worst case,
+ * if Add() has to reallocate that storage, completely invalidating
+ * the pointer that the caller has a copy of. We want to make
+ * sure that the <ret_x> pointer stays valid.
+ *
+ * Args: h - histogram to retrieve data values from
+ * ret_x - RETURN: pointer to the data samples, [0..n-1]
+ * ret_n - RETURN: number of data samples
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if the histogram <h> is not a full histogram.
+ */
+int
+esl_histogram_GetData(ESL_HISTOGRAM *h, double **ret_x, int *ret_n)
+{
+ if (! h->is_full) ESL_EXCEPTION(eslEINVAL, "not a full histogram");
+ esl_histogram_sort(h);
+
+ *ret_x = h->x;
+ *ret_n = h->n;
+
+ h->is_done = TRUE;
+ return eslOK;
+}
+
+
+/* Function: esl_histogram_GetTail()
+ * Synopsis: Retrieve all raw scores above some threshold.
+ *
+ * Purpose: Given a full histogram <h>, retrieve all data values
+ * above the threshold <phi> in the right (high scoring)
+ * tail, as a ptr <ret_x> to an array of <ret_n> values
+ * indexed <[0..n-1]> from lowest to highest score.
+ * Optionally, it also returns the number of values in
+ * rest of the histogram in <ret_z>;
+ * this number is useful if you are going to fit
+ * the tail as a left-censored distribution.
+ *
+ * The test is strictly greater than <phi>, not greater
+ * than or equal to.
+ *
+ * <ret_x> is a pointer to internal memory in the histogram <h>.
+ * The histogram <h> is still responsible for that storage;
+ * its memory will be free'd when you call
+ * <esl_histogram_Destroy()>.
+ *
+ * You can only call this after you have finished collecting
+ * all the data. Subsequent calls to <esl_histogram_Add()>
+ * will fail.
+ *
+ * Args: h - histogram to retrieve the tail from
+ * phi - threshold: tail is all scores > phi
+ * ret_x - optRETURN: ptr to vector of data values [0..n-1]
+ * ret_n - optRETURN: number of data values in tail
+ * ret_z - optRETURN: number of data values not in tail.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if the histogram is not a full histogram.
+ */
+int
+esl_histogram_GetTail(ESL_HISTOGRAM *h, double phi,
+ double **ret_x, int *ret_n, int *ret_z)
+{
+ int hi, lo, mid;
+
+ if (! h->is_full) ESL_EXCEPTION(eslEINVAL, "not a full histogram");
+ esl_histogram_sort(h);
+
+ if (h->n == 0) mid = h->n; /* we'll return NULL, 0, n */
+ else if (h->x[0] > phi) mid = 0; /* we'll return x, n, 0 */
+ else if (h->x[h->n-1] <= phi) mid = h->n; /* we'll return NULL, 0, n */
+ else /* binary search, faster than a brute force scan */
+ {
+ lo = 0;
+ hi = h->n-1; /* know hi>0, because above took care of n=0 and n=1 cases */
+ while (1) {
+ mid = (lo + hi + 1) / 2; /* +1 makes mid round up, mid=0 impossible */
+ if (h->x[mid] <= phi) lo = mid; /* we're too far left */
+ else if (h->x[mid-1] > phi) hi = mid; /* we're too far right */
+ else break; /* ta-da! */
+ }
+ }
+
+ if (ret_x != NULL) *ret_x = h->x + mid;
+ if (ret_n != NULL) *ret_n = h->n - mid;
+ if (ret_z != NULL) *ret_z = mid;
+ h->is_done = TRUE;
+ return eslOK;
+}
+
+
+/* Function: esl_histogram_GetTailByMass()
+ * Synopsis: Retrieve all raw scores in right tail mass.
+ *
+ * Purpose: Given a full histogram <h>, retrieve the data values in
+ * the right (high scoring) tail, as a pointer <ret_x>
+ * to an array of <ret_n> values indexed <[0..n-1]> from
+ * lowest to highest score. The tail is defined by a
+ * given mass fraction threshold <pmass>; the mass in the returned
+ * tail is $\leq$ this threshold. <pmass> is a probability,
+ * so it must be $\geq 0$ and $\leq 1$.
+ *
+ * Optionally, the number of values in the rest of the
+ * histogram can be returned in <ret_z>. This is useful
+ * if you are going to fit the tail as a left-censored
+ * distribution.
+ *
+ * <ret_x> is a pointer to internal memory in <h>.
+ * The histogram <h> remains responsible for its storage,
+ * which will be free'd when you call <esl_histogram_Destroy()>.
+ * As a consequence, you can only call
+ * <esl_histogram_GetTailByMass()> after you have finished
+ * collecting data. Subsequent calls to <esl_histogram_Add()>
+ * will fail.
+ *
+ * Args: h - histogram to retrieve the tail from
+ * pmass - fractional mass threshold; tail contains <= pmass
+ * ret_x - optRETURN: ptr to vector of data values [0..n-1]
+ * ret_n - optRETURN: number of data values in tail x
+ * ret_z - optRETURN: number of data values not in tail
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if the histogram is not a full histogram,
+ * or <pmass> is not a probability.
+ */
+int
+esl_histogram_GetTailByMass(ESL_HISTOGRAM *h, double pmass,
+ double **ret_x, int *ret_n, int *ret_z)
+{
+ uint64_t n;
+
+ if (! h->is_full)
+ ESL_EXCEPTION(eslEINVAL, "not a full histogram");
+ if (pmass < 0. || pmass > 1.)
+ ESL_EXCEPTION(eslEINVAL, "pmass not a probability");
+
+ esl_histogram_sort(h);
+
+ n = (uint64_t) ((double) h->n * pmass); /* rounds down, guaranteeing <= pmass */
+
+ if (ret_x != NULL) *ret_x = h->x + (h->n - n);
+ if (ret_n != NULL) *ret_n = n;
+ if (ret_z != NULL) *ret_z = h->n - n;
+ h->is_done = TRUE;
+ return eslOK;
+}
+
+
+
+
+
+/*****************************************************************
+ * 4. Setting expected counts
+ *****************************************************************/
+
+/* Function: esl_histogram_SetExpect()
+ * Synopsis: Set expected counts for complete distribution.
+ *
+ * Purpose: Given a histogram <h> containing some number of empirically
+ * observed binned counts, and a pointer to a function <(*cdf)()>
+ * that describes the expected cumulative distribution function
+ * (CDF) for the complete data, conditional on some parameters
+ * <params>; calculate the expected counts in each bin of the
+ * histogram, and hold that information internally in the structure.
+ *
+ * The caller provides a function <(*cdf)()> that calculates
+ * the CDF via a generic interface, taking only two
+ * arguments: a quantile <x> and a void pointer to whatever
+ * parameters it needs, which it will cast and interpret.
+ * The <params> void pointer to the given parameters is
+ * just passed along to the generic <(*cdf)()> function. The
+ * caller will probably implement this <(*cdf)()> function as
+ * a wrapper around its real CDF function that takes
+ * explicit (non-void-pointer) arguments.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure; state of <h> is preserved.
+ */
+int
+esl_histogram_SetExpect(ESL_HISTOGRAM *h,
+ double (*cdf)(double x, void *params), void *params)
+{
+ int i;
+ double ai,bi; /* ai < x <= bi : lower,upper bounds in bin */
+ int status;
+
+ if (h->expect == NULL)
+ ESL_ALLOC(h->expect, sizeof(double) * h->nb);
+
+ for (i = 0; i < h->nb; i++)
+ {
+ ai = esl_histogram_Bin2LBound(h, i);
+ bi = esl_histogram_Bin2UBound(h, i);
+
+ h->expect[i] = h->Nc * ( (*cdf)(bi, params) - (*cdf)(ai, params) );
+
+ if (h->emin == -1 && h->expect[i] > 0.) h->emin = i;
+ }
+
+ h->is_done = TRUE;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_histogram_SetExpectedTail()
+ * Synopsis: Set expected counts for right tail.
+ *
+ * Purpose: Given a histogram <h>, and a pointer to a generic function
+ * <(*cdf)()> that describes the expected cumulative
+ * distribution function for the right (high-scoring) tail
+ * starting at <base_val> (all expected <x> $>$ <base_val>) and
+ * containing a fraction <pmass> of the complete data
+ * distribution (<pmass> $\geq 0$ and $\leq 1$);
+ * set the expected binned counts for all complete bins
+ * $\geq$ <base_val>.
+ *
+ * If <base_val> falls within a bin, that bin is considered
+ * to be incomplete, and the next higher bin is the starting
+ * point.
+ *
+ * Args: h - finished histogram
+ * base_val - threshold for the tail: all expected x > base_val
+ * pmass - fractional mass in the tail: 0 <= pmass <= 1
+ * cdf - generic-interface CDF function describing the tail
+ * params - void pointer to parameters for (*cdf)()
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on memory allocation failure.
+ * <eslERANGE> if <base_val> isn't a reasonable value within
+ * the histogram (it converts to a bin value outside
+ * integer range).
+ */
+int
+esl_histogram_SetExpectedTail(ESL_HISTOGRAM *h, double base_val, double pmass,
+ double (*cdf)(double x, void *params),
+ void *params)
+{
+ int status;
+ int b;
+ double ai, bi;
+
+ if (h->expect == NULL) ESL_ALLOC(h->expect, sizeof(double) * h->nb);
+
+ if ((status = esl_histogram_Score2Bin(h, base_val, &(h->emin))) != eslOK) return status;
+ h->emin += 1;
+ esl_vec_DSet(h->expect, h->emin, 0.);
+
+ for (b = h->emin; b < h->nb; b++)
+ {
+ ai = esl_histogram_Bin2LBound(h, b);
+ bi = esl_histogram_Bin2UBound(h, b);
+ h->expect[b] = pmass * (double) h->Nc *
+ ( (*cdf)(bi, params) - (*cdf)(ai, params) );
+ }
+
+ h->tailbase = base_val;
+ h->tailmass = pmass;
+ h->is_tailfit = TRUE;
+ h->is_done = TRUE;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+
+
+/*****************************************************************
+ * 5. Output and display of binned data.
+ *****************************************************************/
+
+/* Function: esl_histogram_Write()
+ * Synopsis: Write a "pretty" ASCII histogram to a stream.
+ *
+ * Purpose: Print a "prettified" display histogram <h> to a file
+ * pointer <fp>. Deliberately a look-and-feel clone of
+ * Bill Pearson's excellent FASTA output.
+ *
+ * Also displays expected binned counts, if they've been
+ * set.
+ *
+ * Display will only work well if the bin width (w) is 0.1
+ * or more, because the score labels are only shown to one
+ * decimal point.
+ *
+ * Args: fp - open file to print to (stdout works)
+ * h - histogram to print
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error, such as a
+ * filled disk.
+ */
+int
+esl_histogram_Write(FILE *fp, ESL_HISTOGRAM *h)
+{
+ int i;
+ double x;
+ uint64_t maxbar;
+ int imode;
+ uint64_t units;
+ int num;
+ char buffer[81]; /* output line buffer */
+ int pos; /* position in output line buffer */
+ uint64_t lowcount, highcount;
+ int ilowbound, ihighbound;
+ int nlines;
+ int emptybins = 3;
+
+
+ /* Find out how we'll scale the histogram. We have 58 characters to
+ * play with on a standard 80-column terminal display: leading "%6.1f
+ * %6d %6d|" occupies 21 chars. Save the peak position, we'll use
+ * it later.
+ */
+ maxbar = 0;
+ imode = 0;
+ for (i = 0; i < h->nb; i++)
+ if (h->obs[i] > maxbar)
+ {
+ maxbar = h->obs[i]; /* max height */
+ imode = i;
+ }
+
+ /* Truncate histogram display on both sides, ad hoc fashion.
+ * Start from the peak; then move out until we see <emptybins> empty bins,
+ * and stop.
+ */
+ for (num = 0, ihighbound = imode; ihighbound < h->imax; ihighbound++)
+ {
+ if (h->obs[ihighbound] > 0) { num = 0; continue; } /* reset */
+ if (++num == emptybins) { break; } /* stop */
+ }
+ for (num = 0, ilowbound = imode; ilowbound > h->imin; ilowbound--)
+ {
+ if (h->obs[ilowbound] > 0) { num = 0; continue; } /* reset */
+ if (++num == emptybins) { break; } /* stop */
+ }
+
+ /* collect counts outside of bounds */
+ for (lowcount = 0, i = h->imin; i < ilowbound; i++)
+ lowcount += h->obs[i];
+ for (highcount = 0, i = h->imax; i > ihighbound; i--)
+ highcount += h->obs[i];
+
+ /* maxbar might need to be raised now; then set our units */
+ if (lowcount > maxbar) maxbar = lowcount;
+ if (highcount > maxbar) maxbar = highcount;
+
+ if (maxbar > 0) units = ((maxbar-1)/ 58) + 1;
+ else units = 1; /* watch out for an empty histogram w/ no data points. */
+
+ /* Print the histogram header
+ */
+ if (fprintf(fp, "%6s %6s %6s (one = represents %llu sequences)\n",
+ "score", "obs", "exp", (unsigned long long) units) < 0)
+ ESL_EXCEPTION_SYS(eslEWRITE, "histogram write failed");
+ if (fprintf(fp, "%6s %6s %6s\n", "-----", "---", "---") < 0)
+ ESL_EXCEPTION_SYS(eslEWRITE, "histogram write failed");
+
+ /* Print the histogram itself */
+ buffer[80] = '\0';
+ buffer[79] = '\n';
+ nlines = 0; /* Count the # of lines we print, so we know if it ends up being zero */
+ for (i = h->imin; i <= h->imax; i++)
+ {
+ memset(buffer, ' ', 79 * sizeof(char));
+ x = i*h->w + h->bmin;
+
+ /* Deal with special cases at edges
+ */
+ if (i < ilowbound) continue;
+ else if (i > ihighbound) continue;
+ else if (i == ilowbound && i != h->imin)
+ {
+ sprintf(buffer, "<%5.1f %6llu %6s|", x+h->w, (unsigned long long) lowcount, "-");
+ if (lowcount > 0) {
+ num = 1+(lowcount-1) / units;
+ for (pos = 21; num > 0; num--) buffer[pos++] = '=';
+ }
+ if (fputs(buffer, fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram write failed");
+ nlines++;
+ continue;
+ }
+ else if (i == ihighbound && i != h->imax)
+ {
+ sprintf(buffer, ">%5.1f %6llu %6s|", x, (unsigned long long) highcount, "-");
+ if (highcount > 0) {
+ num = 1+(highcount-1) / units;
+ for (pos = 21; num > 0; num--) buffer[pos++] = '=';
+ }
+ if (fputs(buffer, fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram write failed");
+ nlines++;
+ continue;
+ }
+
+ /* Deal with most cases
+ */
+ if (h->obs[i] < 1000000) /* displayable in 6 figures or less? */
+ {
+ if (h->expect != NULL)
+ sprintf(buffer, "%6.1f %6llu %6d|", x, (unsigned long long) h->obs[i], (int) h->expect[i]);
+ else
+ sprintf(buffer, "%6.1f %6llu %6s|", x, (unsigned long long) h->obs[i], "-");
+ }
+ else
+ {
+ if (h->expect != NULL)
+ sprintf(buffer, "%6.1f %6.2e %6.2e|", x, (double) h->obs[i], h->expect[i]);
+ else
+ sprintf(buffer, "%6.1f %6.2e %6s|", x, (double) h->obs[i], "-");
+ }
+ buffer[21] = ' '; /* sprintf writes a null char; replace it */
+
+ /* Mark the histogram bar for observed hits
+ */
+ if (h->obs[i] > 0) {
+ num = 1 + (h->obs[i]-1) / units;
+ for (pos = 21; num > 0; num--) buffer[pos++] = '=';
+ }
+
+ /* Mark the theoretically expected value
+ * (The test > 0. also suffices to remove any censored region.)
+ */
+ if (h->expect != NULL && h->expect[i] > 0.)
+ {
+ pos = 21 + (int)(h->expect[i]-1) / units;
+ if (pos >= 78) pos = 78; /* be careful of buffer bounds */
+ buffer[pos] = '*';
+ }
+
+ /* Print the line
+ */
+ if (fputs(buffer, fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram write failed");
+ nlines++;
+ }
+
+ if (nlines == 0 && fprintf(fp, "[histogram contained no data points]\n") < 0)
+ ESL_EXCEPTION_SYS(eslEWRITE, "histogram write failed");
+
+ return eslOK;
+}
+
+/* Function: esl_histogram_Plot()
+ * Synopsis: Output a histogram in xmgrace XY format.
+ *
+ * Purpose: Print observed (and expected, if set) binned counts
+ * in a histogram <h> to open file pointer <fp>
+ * in xmgrace XY input file format.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error.
+ */
+int
+esl_histogram_Plot(FILE *fp, ESL_HISTOGRAM *h)
+{
+ int imin, imax;
+ int i;
+ double x;
+
+ /* First data set is the observed histogram
+ */
+ for (i = h->imin; i <= h->imax; i++)
+ {
+ x = esl_histogram_Bin2LBound(h,i);
+ if (fprintf(fp, "%f %llu\n", x, (unsigned long long) h->obs[i]) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram plot write failed");
+ }
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram plot write failed");
+
+ /* Second data set is the theoretical (expected) histogram
+ */
+ if (h->expect != NULL)
+ {
+ for (imin = 0; imin < h->nb; imin++)
+ if (h->expect[imin] > 0.) break;
+ for (imax = h->nb-1; imax >= 0; imax--)
+ if (h->expect[imax] > 0.) break;
+
+ for (i = imin; i <= imax; i++)
+ {
+ x = esl_histogram_Bin2LBound(h,i);
+ if (fprintf(fp, "%f %g\n", x, h->expect[i]) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram plot write failed");
+ }
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram plot write failed");
+ }
+ return eslOK;
+}
+
+/* Function: esl_histogram_PlotSurvival()
+ * Synopsis: Output $P(X>x)$ in xmgrace XY format.
+ *
+ * Purpose: Given a histogram <h>, output the observed (and
+ * expected, if available) survival function $P(X>x)$
+ * to file pointer <fp> in xmgrace XY input file format.
+ *
+ * One point is plotted per bin, so the narrower the
+ * bin width, the more smooth and accurate the resulting
+ * plots will be.
+ *
+ * As a special case, always plot the highest score with
+ * survival probability 1/N, if it occurred in a bin with
+ * other samples. This is to prevent a survival plot from
+ * looking like it was artificially truncated.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error.
+ */
+int
+esl_histogram_PlotSurvival(FILE *fp, ESL_HISTOGRAM *h)
+{
+ int i;
+ uint64_t c = 0;
+ double esum;
+ double ai;
+
+ /* The observed binned counts:
+ */
+ if (h->obs[h->imax] > 1)
+ if (fprintf(fp, "%f\t%g\n", h->xmax, 1.0 / (double) h->Nc) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram survival plot write failed");
+ for (i = h->imax; i >= h->imin; i--)
+ {
+ if (h->obs[i] > 0) {
+ c += h->obs[i];
+ ai = esl_histogram_Bin2LBound(h, i);
+ if (fprintf(fp, "%f\t%g\n", ai, (double) c / (double) h->Nc) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram survival plot write failed");
+ }
+ }
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram survival plot write failed");
+
+ /* The expected binned counts:
+ */
+ if (h->expect != NULL)
+ {
+ esum = 0.;
+ for (i = h->nb-1; i >= 0; i--)
+ {
+ if (h->expect[i] > 0.) {
+ esum += h->expect[i]; /* some worry about 1+eps=1 problem here */
+ ai = esl_histogram_Bin2LBound(h, i);
+ if (fprintf(fp, "%f\t%g\n", ai, esum / (double) h->Nc) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram survival plot write failed");
+ }
+ }
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram survival plot write failed");
+ }
+ return eslOK;
+}
+
+/* Function: esl_histogram_PlotQQ()
+ * Synopsis: Output a Q-Q plot in xmgrace XY format.
+ *
+ * Purpose: Given a histogram <h> containing an empirically observed
+ * distribution, and a pointer to a function <(*invcdf)()>
+ * for an expected inverse cumulative distribution
+ * function conditional on some parameters <params>;
+ * output a Q-Q plot in xmgrace XY format to file <fp>.
+ *
+ * Same domain limits as goodness-of-fit testing: output
+ * is restricted to overlap between observed data (excluding
+ * any censored data) and expected data (which may be limited
+ * if only a tail was fit).
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error.
+ */
+int
+esl_histogram_PlotQQ(FILE *fp, ESL_HISTOGRAM *h,
+ double (*invcdf)(double x, void *params), void *params)
+{
+ int i;
+ double cdf;
+ double bi;
+ int bbase;
+ uint64_t sum;
+
+ /* on censored data, start counting observed cdf at z, not 0
+ */
+ if (h->dataset_is == TRUE_CENSORED || h->dataset_is == VIRTUAL_CENSORED)
+ sum = h->z;
+ else
+ sum = 0;
+
+ /* Determine smallest bin included in goodness of fit eval
+ */
+ bbase = h->cmin;
+ if (h->is_tailfit && h->emin > bbase) bbase = h->emin;
+ for (i = h->cmin; i < bbase; i++) sum += h->obs[i];
+
+ /* The q-q plot:
+ */
+ for (i = bbase; i < h->imax; i++) /* avoid last bin where upper cdf=1.0 */
+ {
+ sum += h->obs[i];
+ cdf = (double) sum / (double) h->Nc;
+
+ if (h->is_tailfit) cdf = (cdf + h->tailmass - 1.) / (h->tailmass);
+
+ bi = esl_histogram_Bin2UBound(h, i);
+ if (fprintf(fp, "%f\t%f\n", bi, (*invcdf)(cdf, params)) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram QQ plot write failed");
+ }
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram QQ plot write failed");
+
+ /* Plot a 45-degree expected QQ line:
+ */
+ bi = esl_histogram_Bin2LBound(h, bbase);
+ if (fprintf(fp, "%f\t%f\n", bi, bi) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram QQ plot write failed");
+ if (fprintf(fp, "%f\t%f\n", h->xmax, h->xmax) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram QQ plot write failed");
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "histogram QQ plot write failed");
+
+ return eslOK;
+}
+
+
+
+/* Function: esl_histogram_Goodness()
+ * Synopsis: Evaluate fit between observed, expected.
+ *
+ * Purpose: Given a histogram <h> with observed and expected counts,
+ * where, for the expected counts, <nfitted> ($\geq 0$)
+ * parameters were fitted (and thus should be subtracted
+ * from the degrees of freedom);
+ * Perform a G-test and/or a $\chi^2$ test for goodness of
+ * fit between observed and expected, and optionally return
+ * the number of bins the data were sorted into
+ * (<ret_bins>), the G statistic and its probability (<ret_G> and
+ * <ret_Gp>), and the $\chi^2$ statistic and its probability
+ * (<ret_X2> and <ret_X2p>).
+ *
+ * If a goodness-of-fit probability is less than some threshold
+ * (usually taken to be 0.01 or 0.05), that is considered to
+ * be evidence that the observed data are unlikely to be consistent
+ * with the tested distribution.
+ *
+ * The two tests should give similar
+ * probabilities. However, both tests are sensitive to
+ * arbitrary choices in how the data are binned, and
+ * neither seems to be on an entirely sound theoretical
+ * footing.
+ *
+ * On some datasets, pathological and/or very small, it may
+ * be impossible to calculate goodness of fit
+ * statistics. In this case, <eslENORESULT> is returned.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslENORESULT> if the data are such that goodness-of-fit
+ * statistics can't be calculated, probably because there
+ * just aren't many data points. On this error, <*ret_G>
+ * and <*ret_X2> are 0.0, and <*ret_Gp> and <*ret_X2p> are
+ * 1.0. (Because suppose n=1: then any fit to a single data
+ * point is "perfect".)
+ *
+ * Throws: <eslEINVAL> if expected counts have not been set in
+ * the histogram; <eslERANGE> or <eslENOHALT> on different internal
+ * errors that can arise in calculating the probabilities;
+ * <eslEMEM> on internal allocation failure.
+ */
+int
+esl_histogram_Goodness(ESL_HISTOGRAM *h,
+ int nfitted, int *ret_nbins,
+ double *ret_G, double *ret_Gp,
+ double *ret_X2, double *ret_X2p)
+{
+ uint64_t *obs = NULL; /* observed in bin i, [0..nb-1] */
+ double *exp = NULL; /* expected in bin i, [0..nb-1] */
+ double *topx = NULL; /* all values in bin i <= topx[i] */
+ int nb; /* # of re-bins */
+ uint64_t minc; /* minimum target # of counts/bin */
+ int i,b;
+ double G, Gp;
+ double X2, X2p;
+ double tmp;
+ int status;
+ int bbase;
+ uint64_t hmax;
+ uint64_t nobs;
+ double nexp;
+
+ if (h->expect == NULL) ESL_EXCEPTION(eslEINVAL, "no expected counts in that histogram");
+
+ /* Determine the smallest histogram bin included in
+ * the goodness of fit evaluation.
+ */
+ bbase = h->cmin;
+ if (h->is_tailfit && h->emin > bbase) bbase = h->emin;
+
+ /* How many observed total counts are in the evaluated range,
+ * and what is the maximum in any given histogram bin?
+ */
+ nobs = 0;
+ hmax = 0;
+ for (i = bbase; i <= h->imax; i++)
+ {
+ nobs += h->obs[i];
+ if (h->obs[i] > hmax) hmax = h->obs[i];
+ }
+ if (nobs == 0) { status = eslENORESULT; goto ERROR; }
+
+ /* Figure out how many eval bins we'd like to have, then allocate
+ * for re-binning.
+ * Number of bins for goodness-of-fit tests like G and X^2
+ * is crucial but arbitrary, unfortunately. Some literature suggests
+ * using 2*n^{0.4}, which gives:
+ * n nbins #/bin
+ * ----- ------ ------
+ * 1000 31 32
+ * 10000 79 127
+ * 100000 200 500
+ * 1000000 502 1992
+ *
+ * The most important thing seems to be to get the # of counts
+ * in each bin to be roughly equal.
+ */
+ nb = 2* (int) pow((double) nobs, 0.4); /* "desired" nb. */
+ minc = 1 + nobs / (2*nb); /* arbitrarily set min = 1/2 of the target # */
+ ESL_ALLOC(obs, sizeof(uint64_t) * (nb*2+1)); /* final nb must be <= 2*nb+1 */
+ ESL_ALLOC(exp, sizeof(double) * (nb*2+1));
+ ESL_ALLOC(topx, sizeof(double) * (nb*2+1));
+
+ /* Determine the observed counts in each bin: that is, partition
+ * the <sum> in the evaluated region.
+ * Sweep left to right on the histogram bins,
+ * collecting sum of counts, dropping the sum into the next re-bin
+ * whenever we have more than <minc> counts.
+ */
+ nobs = 0;
+ nexp = 0.;
+ for (i = 0, b = bbase; b <= h->imax; b++)
+ {
+ nobs += h->obs[b];
+ nexp += h->expect[b];
+
+ /* if we have enough counts, drop into bin i: */
+ if (nobs >= minc && nexp >= minc) {
+ ESL_DASSERT1( (i < (nb*2+1)) );
+ obs[i] = nobs;
+ exp[i] = nexp;
+ topx[i] = esl_histogram_Bin2UBound(h,b);
+ nobs = 0;
+ nexp = 0.;
+ i++;
+ }
+ }
+ if (i == 0) { status = eslENORESULT; goto ERROR; }
+ obs[i-1] += nobs; /* add the right tail to final bin */
+ exp[i-1] += nexp;
+ topx[i-1] = esl_histogram_Bin2UBound(h, h->imax);
+ nb = i; /* nb is now actual # of bins, not target */
+
+ /* We have to have at least one degree of freedom, else
+ * goodness-of-fit testing isn't defined (and moreover, will
+ * fail numerically if we proceed)
+ */
+ if (nb-nfitted-1 <= 0) { status = eslENORESULT; goto ERROR; }
+
+ /* Calculate the X^2 statistic: \sum (obs_i - exp_i)^2 / exp_i */
+ X2 = 0.;
+ for (i = 0; i < nb; i++)
+ {
+ tmp = (double) obs[i] - exp[i];
+ X2 += tmp*tmp / exp[i];
+ }
+ /* X^2 is distributed approximately chi^2. */
+ if (X2 == 0.)
+ X2p = 1.0;
+ else if (X2 != eslINFINITY) {
+ if ((status = esl_stats_ChiSquaredTest(nb-nfitted, X2, &X2p)) != eslOK) goto ERROR;
+ }
+ else
+ X2p = 0.;
+
+ /* The G test assumes that #exp=#obs (the X^2 test didn't).
+ * If that's not true, renormalize to make it so.
+ * This normalization subtracts a degree of freedom.
+ */
+ nobs = 0;
+ nexp = 0.;
+ for (i = 0; i < nb; i++)
+ {
+ nobs += obs[i];
+ nexp += exp[i];
+ }
+ for (i = 0; i < nb; i++)
+ exp[i] = exp[i] * (double) nobs / nexp;
+
+ /* Calculate the G statistic: 2 * LLR */
+ G = 0.;
+ for (i = 0; i < nb; i++)
+ G += (double) obs[i] * log ((double) obs[i] / exp[i]);
+ G *= 2;
+
+ /* G is distributed approximately as \chi^2.
+ * -1 is because total #obs=#exp
+ */
+ if (G == 0.)
+ Gp = 1.0;
+ else if (G != eslINFINITY)
+ {
+ if ((status = esl_stats_ChiSquaredTest(nb-nfitted-1, G, &Gp)) != eslOK) goto ERROR;
+ }
+ else Gp = 0.;
+
+ if (ret_nbins) *ret_nbins = nb;
+ if (ret_G) *ret_G = G;
+ if (ret_Gp) *ret_Gp = Gp;
+ if (ret_X2) *ret_X2 = X2;
+ if (ret_X2p) *ret_X2p = X2p;
+ free(obs);
+ free(exp);
+ free(topx);
+ return eslOK;
+
+ ERROR:
+ if (ret_nbins) *ret_nbins = 0;
+ if (ret_G) *ret_G = 0.;
+ if (ret_Gp) *ret_Gp = 1.;
+ if (ret_X2) *ret_X2 = 0.;
+ if (ret_X2p) *ret_X2p = 1.;
+ if (obs) free(obs);
+ if (exp) free(exp);
+ if (topx) free(topx);
+ return status;
+}
+
+/*****************************************************************
+ * 6. Test driver.
+ *****************************************************************/
+#ifdef eslHISTOGRAM_TESTDRIVE
+/* compile:
+ * gcc -g -Wall -I. -L. -o test -DeslHISTOGRAM_TESTDRIVE esl_histogram.c -leasel -lm
+ * run:
+ * ./test -t1; ./test -t2; ./test -t3; ./test -t4; ./test -t5
+ *
+ * -t1 - complete data, fit to complete Gumbel\n\
+ * -t2 - complete data, high scores fit as censored Gumbel\n\
+ * -t3 - complete data, high scores fit to exponential tail\n\
+ * -t4 - censored data, fit as censored Gumbel\n\
+ * -t5 - complete data, binned, high scores fit to exponential tail\n\
+ *
+ * Some suggestions for manual testing:
+ * ./test -t1 -j1 -v --surv test.xy; xmgrace test.xy
+ * examine survivor plot fit, for -t1
+ * do -t2 thru -t5 too
+ *
+ * ./test -t1 --j1 -v -qq test.xy; xmgrace test.xy
+ * examine QQ plot fit, for -t1
+ * do -t2 thru -t5 too
+ *
+ * ./test -t1 -v > foo
+ * grep "^Estimated" foo | awk '{print $9}' | sort -g > test.xy
+ * Look for straight line fit to G-test p values.
+ * sub $9->$13 for chi-squared
+ * sub Estimated -> Parametric for the parametric fits
+ */
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "easel.h"
+#include "esl_stats.h"
+#include "esl_gumbel.h"
+#include "esl_exponential.h"
+#include "esl_random.h"
+#include "esl_getopts.h"
+
+
+
+static ESL_OPTIONS options[] = {
+ /* name type default env_var range toggles reqs incompat */
+ { "-j", eslARG_INT, "100", NULL, "n>0", NULL, NULL, NULL, "number of trials", 0 },
+ { "-m", eslARG_INT, "0", NULL, "n>=0", NULL, NULL, NULL, "number of test samples", 0 },
+ { "-n", eslARG_INT, "10000", NULL, "n>0", NULL, NULL, NULL, "number of training samples", 0 },
+ { "-t", eslARG_INT, "1", NULL, "1<=n<=5", NULL, NULL, NULL, "test type choice, 1-5", 0 },
+ { "-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "be verbose?", 0 },
+ { "--ascii", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "output ASCII histogram to <f>", 0 },
+ { "--cmass", eslARG_REAL, "0.7", NULL, "0<=x<=1", NULL, NULL, NULL, "set virtual censoring mass to <x>", 0 },
+ { "--lambda", eslARG_REAL, "0.8", NULL, "x>0", NULL, NULL, NULL, "set Gumbel lambda param to <x>", 0 },
+ { "--mu", eslARG_REAL, "10.0", NULL, NULL, NULL, NULL, NULL, "set Gumbel mu param to <x>", 0 },
+ { "--phi", eslARG_REAL, "10.0", NULL, NULL, NULL, NULL, NULL, "set censoring threshold to <x>", 0 },
+ { "--plot", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "output histogram to xmgrace file <f>", 0 },
+ { "--qq", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "output Q-Q goodness of fit to xmgrace file <f>", 0 },
+ { "--surv", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "output survival plot to xmgrace file <f>", 0 },
+ { "--tail", eslARG_REAL, "0.1", NULL, "0<=x<=1", NULL, NULL, NULL, "set tail mass for fitting to <x>", 0 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+static void
+binmacro_utest(void)
+{
+ char *msg = "esl_histogram: binmacro unit test failure";
+ ESL_HISTOGRAM *h = esl_histogram_Create(-100, 100, 1.0);
+ double trialx[3] = { -42.42, 0, 42.42 };
+ double x, ai, bi;
+ int i,b;
+
+ /* test bin<->score conversion macros.
+ */
+ for (i = 0; i < 3; i++)
+ {
+ x = trialx[i];
+ esl_histogram_Score2Bin(h, x, &b);
+ ai = esl_histogram_Bin2LBound(h, b);
+ bi = esl_histogram_Bin2UBound(h, b);
+ if (x <= ai || x > bi) esl_fatal(msg);
+ }
+ esl_histogram_Destroy(h);
+ return;
+}
+
+static void
+valuerange_utest(void)
+{
+ char *msg = "esl_histogram: value range unit test failure";
+ ESL_HISTOGRAM *h = esl_histogram_Create(-100, 100, 1.0);
+ int b;
+
+ esl_exception_SetHandler(&esl_nonfatal_handler);
+
+ if (esl_histogram_Score2Bin(h, eslINFINITY, &b) != eslERANGE) esl_fatal(msg);
+ if (esl_histogram_Score2Bin(h, -eslINFINITY, &b) != eslERANGE) esl_fatal(msg);
+ if (esl_histogram_Score2Bin(h, eslNaN, &b) != eslERANGE) esl_fatal(msg);
+ if (esl_histogram_Score2Bin(h, 1e20, &b) != eslERANGE) esl_fatal(msg);
+ if (esl_histogram_Score2Bin(h, -1e20, &b) != eslERANGE) esl_fatal(msg);
+
+ esl_exception_ResetDefaultHandler();
+ esl_histogram_Destroy(h);
+ return;
+}
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go;
+ ESL_RANDOMNESS *r;
+ ESL_HISTOGRAM *h;
+ ESL_HISTOGRAM *h1;
+ double p[2]; /* parametric mu, lambda */
+ double ep[2]; /* estimated mu, lambda */
+ double avg_ep[2]; /* average estimated mu, lambda over many trials */
+ int ntrials, trial;
+ int ntrain, ntest;
+ int test_type;
+ enum { COLLECT_COMPLETE, COLLECT_CENSORED } cstrategy;
+ enum { FIT_BINNED, FIT_SAMPLES } bstrategy;
+ enum { FIT_COMPLETE, FIT_CENSORED, FIT_TAIL} fstrategy;
+ double phi; /* censoring threshold */
+ int z;
+ double cmass;
+ double tailmass, save_tailmass;
+ int nfitted;
+ int nbins;
+ double G, Gp, X2, X2p, minGp, minX2p;
+ int verbose;
+ FILE *outfp;
+ char *ascfile, *plotfile, *survfile, *qqfile;
+ int i;
+ double x;
+ double *xv;
+ int n;
+
+ go = esl_getopts_Create(options);
+ esl_opt_ProcessCmdline(go, argc, argv);
+ test_type = esl_opt_GetInteger(go, "-t");
+ ntrials = esl_opt_GetInteger(go, "-j");
+ ntrain = esl_opt_GetInteger(go, "-n");
+ ntest = esl_opt_GetInteger(go, "-m");
+ verbose = esl_opt_GetBoolean(go, "-v");
+ cmass = esl_opt_GetReal (go, "--cmass");
+ p[1] = esl_opt_GetReal (go, "--lambda");
+ p[0] = esl_opt_GetReal (go, "--mu");
+ phi = esl_opt_GetReal (go, "--phi");
+ save_tailmass = esl_opt_GetReal (go, "--tail");
+ ascfile = esl_opt_GetString (go, "--ascii");
+ plotfile = esl_opt_GetString (go, "--plot");
+ qqfile = esl_opt_GetString (go, "--qq");
+ survfile = esl_opt_GetString (go, "--surv");
+ esl_getopts_Destroy(go);
+
+ r = esl_randomness_Create(42);
+ avg_ep[0] = 0.;
+ avg_ep[1] = 0.;
+ minGp = 1.;
+ minX2p = 1.;
+ tailmass = save_tailmass;
+
+ if (test_type == 1)
+ {
+ cstrategy = COLLECT_COMPLETE;
+ bstrategy = FIT_SAMPLES;
+ fstrategy = FIT_COMPLETE;
+ }
+ else if (test_type == 2)
+ {
+ cstrategy = COLLECT_COMPLETE;
+ bstrategy = FIT_SAMPLES;
+ fstrategy = FIT_CENSORED;
+ }
+ else if (test_type == 3)
+ {
+ cstrategy = COLLECT_COMPLETE;
+ bstrategy = FIT_SAMPLES;
+ fstrategy = FIT_TAIL;
+ }
+ else if (test_type == 4)
+ {
+ cstrategy = COLLECT_CENSORED;
+ bstrategy = FIT_SAMPLES;
+ fstrategy = FIT_CENSORED;
+ }
+ else if (test_type == 5)
+ {
+ cstrategy = COLLECT_COMPLETE;
+ bstrategy = FIT_BINNED;
+ fstrategy = FIT_TAIL;
+ }
+ else
+ esl_fatal("no such test type");
+
+
+ for (trial = 0; trial < ntrials; trial++)
+ {
+ /* Collection of the training data in <h>.
+ * Data set can either be complete, true censored, or virtual censored.
+ */
+ h = esl_histogram_CreateFull(-100, 100, 0.1);
+ z = 0;
+ for (i = 0; i < ntrain; i++) {
+ x = esl_gumbel_Sample(r, p[0], p[1]);
+ if (cstrategy != COLLECT_CENSORED || x > phi)
+ esl_histogram_Add(h, x);
+ else
+ z++;
+ }
+ if (cstrategy == COLLECT_CENSORED)
+ esl_histogram_DeclareCensoring(h, z, phi);
+
+ /* Parameter fitting.
+ * We test for four of twelve possible combinations of
+ * collection strategy, binned vs. raw data, and complete,
+ * censored, vs. tail fitting.
+ * 1. complete Gumbel data, raw, fit to a Gumbel.
+ * 2. complete Gumbel data, raw, tail fit as a censored Gumbel
+ * 3. complete Gumbel data, raw, tail fit to an exponential tail
+ * 4. censored Gumbel data, raw, censored fit to a Gumbel
+ * 5 complete Gumbel data, binned, fit to an exponential tail.
+ */
+ if (cstrategy == COLLECT_COMPLETE &&
+ bstrategy == FIT_SAMPLES &&
+ fstrategy == FIT_COMPLETE)
+ {
+ esl_histogram_GetData(h, &xv, &n);
+ if (esl_gumbel_FitComplete(xv, n, &(ep[0]), &ep[1]) != eslOK) esl_fatal("gumbel complete fit failed");
+ }
+ else if (cstrategy == COLLECT_COMPLETE &&
+ bstrategy == FIT_SAMPLES &&
+ fstrategy == FIT_CENSORED)
+ {
+ esl_histogram_GetTailByMass(h, cmass, &xv, &n, &z);
+ if (esl_gumbel_FitCensored(xv, n, z, xv[0], &(ep[0]), &ep[1]) != eslOK) esl_fatal("gumbel censored fit failed");
+ }
+ else if (cstrategy == COLLECT_COMPLETE &&
+ bstrategy == FIT_SAMPLES &&
+ fstrategy == FIT_TAIL)
+ {
+ esl_histogram_GetTailByMass(h, tailmass, &xv, &n, &z);
+ if (esl_exp_FitComplete(xv, n, &(ep[0]), &ep[1]) != eslOK) esl_fatal("exponential complete fit failed");
+ }
+ else if (cstrategy == COLLECT_CENSORED &&
+ bstrategy == FIT_SAMPLES &&
+ fstrategy == FIT_CENSORED)
+ {
+ esl_histogram_GetData(h, &xv, &n);
+ if (esl_gumbel_FitCensored(xv, n, h->z, h->phi, &(ep[0]), &ep[1]) != eslOK) esl_fatal("gumbel censored fit failed");
+ }
+ else if (cstrategy == COLLECT_COMPLETE &&
+ bstrategy == FIT_BINNED &&
+ fstrategy == FIT_TAIL)
+ {
+ tailmass = save_tailmass; /* reset to original for each trial. */
+ esl_histogram_SetTailByMass(h, tailmass, &tailmass);
+ if (esl_exp_FitCompleteBinned(h, &(ep[0]), &ep[1]) != eslOK) esl_fatal("exponential binned complete fit failed");
+ }
+ else
+ ESL_EXCEPTION(eslEINVAL, "not a scenario we currently test");
+
+ /* Keep track of average estimated mu, lambda
+ * for automated testing purposes.
+ */
+ avg_ep[0] += ep[0] / (double) ntrials;
+ avg_ep[1] += ep[1] / (double) ntrials;
+
+ /* Test data can either be the same as the training data,
+ * or a new test set.
+ */
+ if (ntest > 0)
+ {
+ h1 = esl_histogram_CreateFull(-100.05, 100.05, 0.2);
+ z = 0;
+ for (i = 0; i < ntest; i++) {
+ x = esl_gumbel_Sample(r, p[0], p[1]);
+ if (cstrategy != COLLECT_CENSORED || x > phi)
+ esl_histogram_Add(h1, x);
+ else
+ z++;
+ }
+ if (cstrategy == COLLECT_CENSORED)
+ esl_histogram_DeclareCensoring(h, z, phi);
+ }
+ else h1 = h;
+
+
+ /* Set expected binned counts in the test data, h1:
+ */
+ if (fstrategy == FIT_TAIL)
+ esl_histogram_SetExpectedTail(h1, ep[0], tailmass,
+ &esl_exp_generic_cdf, ep);
+ else
+ esl_histogram_SetExpect(h1, &esl_gumbel_generic_cdf, ep);
+
+
+ /* Evaluate goodness-of-fit
+ */
+ nfitted = (ntest == 0)? 2 : 0;
+ if (esl_histogram_Goodness(h1, nfitted, &nbins, &G, &Gp, &X2, &X2p) != eslOK)
+ esl_fatal("esl_histogram unit testing: goodness-of-fit failed");
+
+ /* Track minimum goodness of fit probs, for automated testing
+ */
+ if (Gp < minGp) minGp = Gp;
+ if (X2p < minX2p) minX2p = X2p;
+
+ if (verbose)
+ printf("Estimated: %6.2f %6.4f nb %4d G %g\tGp %g\tX2 %g\tX2p %g\n",
+ ep[0], ep[1], nbins, G, Gp, X2, X2p);
+
+ /* Output files, if requested.
+ * (Best if ntrials=1. Will overwrite previous trials.)
+ */
+ if (ascfile != NULL)
+ {
+ outfp = fopen(ascfile, "w");
+ esl_histogram_Write(outfp, h1);
+ fclose(outfp);
+ }
+ if (plotfile != NULL)
+ {
+ outfp = fopen(plotfile, "w");
+ esl_histogram_Plot(outfp, h1);
+ fclose(outfp);
+ }
+ if (survfile != NULL)
+ {
+ outfp = fopen(survfile, "w");
+ esl_histogram_PlotSurvival(outfp, h1);
+ fclose(outfp);
+ }
+ if (qqfile != NULL)
+ {
+ outfp = fopen(qqfile, "w");
+ if (fstrategy == FIT_TAIL)
+ esl_histogram_PlotQQ(outfp, h1, &esl_exp_generic_invcdf, ep);
+ else
+ esl_histogram_PlotQQ(outfp, h1, &esl_gumbel_generic_invcdf, ep);
+ fclose(outfp);
+ }
+
+ esl_histogram_Destroy(h);
+ if (ntest > 0) esl_histogram_Destroy(h1);
+ }
+
+ /* Trap badness in an automated test.
+ */
+ if (fstrategy != FIT_TAIL && fabs(avg_ep[0] - p[0]) > 0.1)
+ ESL_EXCEPTION(eslFAIL, "Something awry with Gumbel mu fit");
+ if (fabs(avg_ep[1] - p[1]) > 0.1)
+ ESL_EXCEPTION(eslFAIL, "Something awry with lambda fit");
+ if (minGp < 1. / (1000. * ntrials))
+ ESL_EXCEPTION(eslFAIL, "Something awry with G-test");
+ if (minX2p < 1. / (1000. * ntrials))
+ ESL_EXCEPTION(eslFAIL, "Something awry with chi squared test");
+
+ /* Smaller final tests
+ */
+ binmacro_utest();
+ valuerange_utest();
+
+ esl_randomness_Destroy(r);
+ return 0;
+}
+#endif /*eslHISTOGRAM_TESTDRIVE*/
+
+
+
+/*****************************************************************
+ * 7. Examples
+ *****************************************************************/
+
+/*****************************************************************
+ * Five example main()'s for five use cases:
+ * - complete data, fit to complete Gumbel
+ * - complete data, high scores fit as censored Gumbel
+ * - complete data, high scores fit to exponential tail
+ * - censored data, fit as censored Gumbel
+ * - complete data, binned, high scores fit to exponential tail
+ *
+ * (These same five cases are tested by ./test -t1 through ./test -t5.)
+ *****************************************************************/
+/* Case 1. Complete data fit to complete Gumbel.
+ * compile: gcc -I. -L. -o example -DeslHISTOGRAM_EXAMPLE esl_histogram.c -leasel -lm
+ * run: ./example
+ */
+#ifdef eslHISTOGRAM_EXAMPLE
+/*::cexcerpt::histogram_example::begin::*/
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_gumbel.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ ESL_HISTOGRAM *h = esl_histogram_CreateFull(-100, 100, 0.2);
+ int nsamples = 10000;
+ double mu = 10.0;
+ double lambda = 0.8;
+ double params[2];
+ int i;
+ double x;
+ double *xv;
+ int n;
+ double G, Gp, X2, X2p;
+
+ for (i = 0; i < nsamples; i++) {
+ x = esl_gumbel_Sample(r, mu, lambda);
+ esl_histogram_Add(h, x);
+ }
+
+ esl_histogram_GetData(h, &xv, &n);
+ if (esl_gumbel_FitComplete(xv, n, &mu, &lambda) != eslOK)
+ esl_fatal("gumbel complete data fit failed");
+
+ params[0] = mu;
+ params[1] = lambda;
+ esl_histogram_SetExpect(h, &esl_gumbel_generic_cdf, ¶ms);
+
+ esl_histogram_Write(stdout, h);
+ if (esl_histogram_Goodness(h, 0, NULL, &G, &Gp, &X2, &X2p) != eslOK)
+ esl_fatal("goodness of fit testing failed");
+
+ printf("G = %f p = %f\n", G, Gp);
+ printf("X^2 = %f p = %f\n", X2, X2p);
+
+ esl_histogram_Destroy(h);
+ esl_randomness_Destroy(r);
+ return 0;
+}
+/*::cexcerpt::histogram_example::end::*/
+#endif /*eslHISTOGRAM_EXAMPLE*/
+
+
+
+/* Case 2. complete data, high scores fit as censored Gumbel
+ * compile: gcc -I. -L. -o example -DeslHISTOGRAM_EXAMPLE2 esl_histogram.c -leasel -lm
+ * run: ./example
+ */
+#ifdef eslHISTOGRAM_EXAMPLE2
+/*::cexcerpt::histogram_example2::begin::*/
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_gumbel.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ ESL_HISTOGRAM *h = esl_histogram_CreateFull(-100, 100, 0.2);
+ int nsamples = 10000;
+ double mu = 10.0;
+ double lambda = 0.8;
+ double params[2];
+ int i;
+ double x;
+ double *xv;
+ int n, z;
+ double G, Gp, X2, X2p;
+
+ for (i = 0; i < nsamples; i++) {
+ x = esl_gumbel_Sample(r, mu, lambda);
+ esl_histogram_Add(h, x);
+ }
+
+ esl_histogram_GetTailByMass(h, 0.5, &xv, &n, &z); /* fit to right 50% */
+ if (esl_gumbel_FitCensored(xv, n, z, xv[0], &mu, &lambda) != eslOK)
+ esl_fatal("gumbel censored fit failed");
+
+ params[0] = mu;
+ params[1] = lambda;
+ esl_histogram_SetExpect(h, &esl_gumbel_generic_cdf, ¶ms);
+
+ esl_histogram_Write(stdout, h);
+ if (esl_histogram_Goodness(h, 0, NULL, &G, &Gp, &X2, &X2p) != eslOK)
+ esl_fatal("goodness of fit testing failed");
+
+ printf("G = %f p = %f\n", G, Gp);
+ printf("X^2 = %f p = %f\n", X2, X2p);
+
+ esl_histogram_Destroy(h);
+ esl_randomness_Destroy(r);
+ return 0;
+}
+/*::cexcerpt::histogram_example2::end::*/
+#endif /*eslHISTOGRAM_EXAMPLE2*/
+
+
+/* Case 3. complete data, high scores fit to exponential tail
+ * compile: gcc -I. -L. -o example -DeslHISTOGRAM_EXAMPLE3 esl_histogram.c -leasel -lm
+ * run: ./example
+ */
+#ifdef eslHISTOGRAM_EXAMPLE3
+/*::cexcerpt::histogram_example3::begin::*/
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_gumbel.h"
+#include "esl_exponential.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ ESL_HISTOGRAM *h = esl_histogram_CreateFull(-100, 100, 0.2);
+ int nsamples = 10000;
+ double mu = 10.0;
+ double lambda = 0.8;
+ double params[2];
+ int i;
+ double x;
+ double *xv;
+ int n;
+ double G, Gp, X2, X2p;
+
+ for (i = 0; i < nsamples; i++) {
+ x = esl_gumbel_Sample(r, mu, lambda);
+ esl_histogram_Add(h, x);
+ }
+
+ esl_histogram_GetTailByMass(h, 0.1, &xv, &n, NULL); /* fit to 10% tail */
+ esl_exp_FitComplete(xv, n, &mu, &lambda);
+
+ params[0] = mu;
+ params[1] = lambda;
+ esl_histogram_SetExpectedTail(h, mu, 0.1, &esl_exp_generic_cdf, ¶ms);
+
+ esl_histogram_Write(stdout, h);
+ if (esl_histogram_Goodness(h, 0, NULL, &G, &Gp, &X2, &X2p) != eslOK)
+ esl_fatal("goodness of fit testing failed");
+
+ printf("G = %f p = %f\n", G, Gp);
+ printf("X^2 = %f p = %f\n", X2, X2p);
+
+ esl_histogram_Destroy(h);
+ esl_randomness_Destroy(r);
+ return 0;
+}
+/*::cexcerpt::histogram_example3::end::*/
+#endif /*eslHISTOGRAM_EXAMPLE3*/
+
+/* Case 4. censored data, high scores fit as a censored Gumbel tail
+ * compile:
+ gcc -I. -L. -o example -DeslHISTOGRAM_EXAMPLE4 esl_histogram.c -leasel -lm
+ * run: ./example
+ */
+#ifdef eslHISTOGRAM_EXAMPLE4
+/*::cexcerpt::histogram_example4::begin::*/
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_gumbel.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ ESL_HISTOGRAM *h = esl_histogram_CreateFull(-100, 100, 0.2);
+ int nsamples = 10000;
+ double mu = 10.0;
+ double lambda = 0.8;
+ double phi = 9.0;
+ double params[2];
+ int i;
+ double x;
+ double *xv;
+ int n, z;
+ double G, Gp, X2, X2p;
+
+ z = 0;
+ for (i = 0; i < nsamples; i++) {
+ x = esl_gumbel_Sample(r, mu, lambda);
+ if (x > phi) esl_histogram_Add(h, x);
+ else z++;
+ }
+
+ esl_histogram_GetData(h, &xv, &n);
+ if (esl_gumbel_FitCensored(xv, n, z, phi, &mu, &lambda) != eslOK)
+ esl_fatal("gumbel censored fit failed");
+
+ params[0] = mu;
+ params[1] = lambda;
+ esl_histogram_SetExpect(h, &esl_gumbel_generic_cdf, ¶ms);
+
+ esl_histogram_Write(stdout, h);
+ if (esl_histogram_Goodness(h, 0, NULL, &G, &Gp, &X2, &X2p) != eslOK)
+ esl_fatal("goodness of fit testing failed");
+
+ printf("G = %f p = %f\n", G, Gp);
+ printf("X^2 = %f p = %f\n", X2, X2p);
+
+ esl_histogram_Destroy(h);
+ esl_randomness_Destroy(r);
+ return 0;
+}
+/*::cexcerpt::histogram_example4::end::*/
+#endif /*eslHISTOGRAM_EXAMPLE4*/
+
+/* Case 5. complete data, binned high scores fit to exponential tail
+ * compile:
+ gcc -I. -L. -o example -DeslHISTOGRAM_EXAMPLE5 esl_histogram.c -leasel -lm
+ * run: ./example
+ */
+#ifdef eslHISTOGRAM_EXAMPLE5
+/*::cexcerpt::histogram_example5::begin::*/
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_gumbel.h"
+#include "esl_exponential.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ ESL_HISTOGRAM *h = esl_histogram_Create(-100, 100, 1.0);
+ int nsamples = 10000;
+ double mu = 10.0;
+ double lambda = 0.8;
+ double params[2];
+ int i;
+ double x;
+ double actual_mass;
+ double G, Gp, X2, X2p;
+
+ for (i = 0; i < nsamples; i++) {
+ x = esl_gumbel_Sample(r, mu, lambda);
+ x = ceil(x); /* crudely simulate an x of limited precision */
+ esl_histogram_Add(h, x);
+ }
+
+ esl_histogram_SetTailByMass(h, 0.1, &actual_mass);
+ esl_histogram_DeclareRounding(h);
+ if (esl_exp_FitCompleteBinned(h, &mu, &lambda) != eslOK)
+ esl_fatal("exponential ML fitting failed");
+
+ params[0] = mu;
+ params[1] = lambda;
+ esl_histogram_SetExpectedTail(h, mu, actual_mass, &esl_exp_generic_cdf, ¶ms);
+
+ esl_histogram_Write(stdout, h);
+ if (esl_histogram_Goodness(h, 0, NULL, &G, &Gp, &X2, &X2p) != eslOK)
+ esl_fatal("goodness of fit testing failed");
+
+ printf("G = %f p = %f\n", G, Gp);
+ printf("X^2 = %f p = %f\n", X2, X2p);
+
+ esl_histogram_Destroy(h);
+ esl_randomness_Destroy(r);
+ return 0;
+}
+/*::cexcerpt::histogram_example5::end::*/
+#endif /*eslHISTOGRAM_EXAMPLE5*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
+
diff --git a/esl_histogram.h b/esl_histogram.h
new file mode 100644
index 0000000..893a301
--- /dev/null
+++ b/esl_histogram.h
@@ -0,0 +1,130 @@
+/* Collection and display of score histograms.
+ *
+ * SRE, Fri Jul 1 13:22:45 2005 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslHISTOGRAM_INCLUDED
+#define eslHISTOGRAM_INCLUDED
+
+#include <math.h> /* floor() is in one of the macros */
+
+
+/* Structure: ESL_HISTOGRAM
+ *
+ * Keeps a score histogram, in which scores are counted into bins of
+ * size (width) w.
+ * histogram starts at bmin < floor(xmin/w) * w
+ * histogram ends at bmax >= ceil(xmax/w)*w
+ * nb = (bmax-bmin)/w
+ * each score x is counted into bin b = nb - (int) (bmax-x)/w
+ * each bin b contains scores bw+bmin < x <= (b+1)w + bmin
+ *
+ * Anything having to do with the counts themselves (obs, n, etc)
+ * is a uint64_t, with range 0..2^64-1 (up to 2e19).
+ */
+typedef struct {
+ /* The histogram is kept as counts in fixed-width bins.
+ */
+ uint64_t *obs; /* observed counts in bin b, 0..nb-1 (dynamic) */
+ int nb; /* number of bins */
+ double w; /* fixed width of each bin */
+ double bmin, bmax; /* histogram bounds: all x satisfy bmin < x <= bmax */
+ int imin, imax; /* smallest, largest bin that contain obs[i] > 0 */
+
+ /* Optionally, in a "full" h, we can also keep all the raw samples in x.
+ */
+ double xmin, xmax; /* smallest, largest sample value x observed */
+ uint64_t n; /* total number of raw data samples */
+ double *x; /* optional: raw sample values x[0..n-1] */
+ uint64_t nalloc; /* current allocated size of x */
+
+ /* The binned data might be censored (either truly, or virtually).
+ * This information has to be made available to a binned/censored
+ * parameter fitting function, and to goodness-of-fit tests.
+ */
+ double phi; /* censoring value; all x_i > phi */
+ int cmin; /* smallest bin index that contains uncensored data */
+ uint64_t z; /* # of censored values <= phi */
+ uint64_t Nc; /* # samples in complete data (including unobs) */
+ uint64_t No; /* # of samples in observed data */
+
+ /* Expected binned counts are set by SetExpect() or SetExpectedTail().
+ */
+ double *expect; /* expected counts in bin b, 0..nb-1 (not resized) */
+ int emin; /* smallest bin index that contains expected counts */
+ double tailbase; /* for tail fits: fitted x > tailbase */
+ double tailmass; /* for tail fits: fractional prob in the tail */
+
+ /* Some status flags
+ */
+ int is_full; /* TRUE when we're keeping raw data in x */
+ int is_done; /* TRUE if we prevent more Add()'s */
+ int is_sorted; /* TRUE if x is sorted smallest-to-largest */
+ int is_tailfit; /* TRUE if expected dist only describes tail */
+ int is_rounded; /* TRUE if values aren't more accurate than bins */
+ enum { COMPLETE, VIRTUAL_CENSORED, TRUE_CENSORED } dataset_is;
+
+} ESL_HISTOGRAM;
+
+#define esl_histogram_Bin2LBound(h,b) ((h)->w*(b) + (h)->bmin)
+#define esl_histogram_Bin2UBound(h,b) ((h)->w*((b)+1) + (h)->bmin)
+
+/* Creating/destroying histograms and collecting data:
+ */
+extern ESL_HISTOGRAM *esl_histogram_Create (double bmin, double bmax, double w);
+extern ESL_HISTOGRAM *esl_histogram_CreateFull(double bmin, double bmax, double w);
+extern void esl_histogram_Destroy (ESL_HISTOGRAM *h);
+extern int esl_histogram_Score2Bin(ESL_HISTOGRAM *h, double x, int *ret_b);
+extern int esl_histogram_Add (ESL_HISTOGRAM *h, double x);
+
+/* Declarations about the binned data before parameter fitting:
+ */
+extern int esl_histogram_DeclareCensoring(ESL_HISTOGRAM *h, int z, double phi);
+extern int esl_histogram_DeclareRounding (ESL_HISTOGRAM *h);
+extern int esl_histogram_SetTail (ESL_HISTOGRAM *h, double phi,
+ double *ret_newmass);
+extern int esl_histogram_SetTailByMass (ESL_HISTOGRAM *h, double pmass,
+ double *ret_newmass);
+
+/* Accessing data samples in a full histogram:
+ */
+extern int esl_histogram_GetRank(ESL_HISTOGRAM *h, int rank, double *ret_x);
+extern int esl_histogram_GetData(ESL_HISTOGRAM *h, double **ret_x, int *ret_n);
+extern int esl_histogram_GetTail(ESL_HISTOGRAM *h, double phi, double **ret_x,
+ int *ret_n, int *ret_z);
+extern int esl_histogram_GetTailByMass(ESL_HISTOGRAM *h, double pmass,
+ double **ret_x, int *ret_n, int *ret_z);
+
+
+/* Setting expected binned counts:
+ */
+extern int esl_histogram_SetExpect(ESL_HISTOGRAM *h,
+ double (*cdf)(double x, void *params),
+ void *params);
+extern int esl_histogram_SetExpectedTail(ESL_HISTOGRAM *h, double base_val,
+ double pmass,
+ double (*cdf)(double x, void *params),
+ void *params);
+
+/* Output/display of binned data:
+ */
+extern int esl_histogram_Write (FILE *fp, ESL_HISTOGRAM *h);
+extern int esl_histogram_Plot (FILE *fp, ESL_HISTOGRAM *h);
+extern int esl_histogram_PlotSurvival(FILE *fp, ESL_HISTOGRAM *h);
+extern int esl_histogram_PlotQQ (FILE *fp, ESL_HISTOGRAM *h,
+ double (*invcdf)(double, void *), void *params);
+
+/* Goodness of fit testing
+ */
+extern int esl_histogram_Goodness(ESL_HISTOGRAM *h, int nfitted,
+ int *ret_nbins,
+ double *ret_G, double *ret_Gp,
+ double *ret_X2, double *ret_X2p);
+
+
+
+#endif /*eslHISTOGRAM_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_histogram.tex b/esl_histogram.tex
new file mode 100644
index 0000000..d8e39d3
--- /dev/null
+++ b/esl_histogram.tex
@@ -0,0 +1,299 @@
+
+The \eslmod{histogram} module is for collecting scores, fitting
+them to expected distributions, and displaying them.
+
+The histogram automatically reallocates its bins as data points
+arrive, so the caller only needs to provide some initial guidance
+about bin size and ``phase'' (offset of the bins relative to the real
+number line). It accumulates counts in 64-bit unsigned integers, so
+it can handle over $10^19$ total counts. Optionally (and provided
+that the caller knows it has enough memory to support this), a
+``full'' histogram can be created and used to collect a sorted vector
+of raw (unbinned) values.
+
+Various different ways of fitting histogram data to different sorts of
+expected distributions are supported, with interfaces to all of
+Easel's statistical distribution modules. Data fitting is oriented
+toward the case where the values are scores, with high scores being of
+the most interest; for instance, routines for obtaining and fitting
+the right (high-scoring) tail are provided, but not for the left tail.
+
+Several of the output functions output data as XY data files suitable
+for input into the popular and freely available \prog{xmgrace}
+graphing program [\url{http://plasma-gate.weizmann.ac.il/Grace/}].
+
+The API for the \eslmod{histogram} module is summarized in
+Table~\ref{tbl:histogram_api}.
+
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+ \apisubhead{Collecting data in an \ccode{ESL\_HISTOGRAM}}\\
+\hyperlink{func:esl_histogram_Create()}{\ccode{esl\_histogram\_Create()}} & Create a new \ccode{ESL\_HISTOGRAM}.\\
+\hyperlink{func:esl_histogram_CreateFull()}{\ccode{esl\_histogram\_CreateFull()}} & A \ccode{ESL\_HISTOGRAM} to keep all data samples.\\
+\hyperlink{func:esl_histogram_Destroy()}{\ccode{esl\_histogram\_Destroy()}} & Frees a \ccode{ESL\_HISTOGRAM}.\\
+\hyperlink{func:esl_histogram_Add()}{\ccode{esl\_histogram\_Add()}} & Add a sample to the histogram.\\
+ \apisubhead{Declarations about binned data, before fitting}\\
+\hyperlink{func:esl_histogram_DeclareCensoring()}{\ccode{esl\_histogram\_DeclareCensoring()}} & Collected data were left-censored.\\
+\hyperlink{func:esl_histogram_DeclareRounding()}{\ccode{esl\_histogram\_DeclareRounding()}} & Declare collected data were no more accurate than bins.\\
+\hyperlink{func:esl_histogram_SetTail()}{\ccode{esl\_histogram\_SetTail()}} & Declare only tail $>$ some threshold is considered "observed".\\
+\hyperlink{func:esl_histogram_SetTailByMass()}{\ccode{esl\_histogram\_SetTailByMass()}} & Declare only right tail mass is considered "observed".\\
+ \apisubhead{Accessing raw data samples}\\
+\hyperlink{func:esl_histogram_GetRank()}{\ccode{esl\_histogram\_GetRank()}} & Retrieve n'th high score.\\
+\hyperlink{func:esl_histogram_GetData()}{\ccode{esl\_histogram\_GetData()}} & Retrieve vector of all raw scores.\\
+\hyperlink{func:esl_histogram_GetTail()}{\ccode{esl\_histogram\_GetTail()}} & Retrieve all raw scores above some threshold.\\
+\hyperlink{func:esl_histogram_GetTailByMass()}{\ccode{esl\_histogram\_GetTailByMass()}} & Retrieve all raw scores in right tail mass.\\
+ \apisubhead{Setting expected counts}\\
+\hyperlink{func:esl_histogram_SetExpect()}{\ccode{esl\_histogram\_SetExpect()}} & Set expected counts for complete distribution.\\
+\hyperlink{func:esl_histogram_SetExpectedTail()}{\ccode{esl\_histogram\_SetExpectedTail()}} & Set expected counts for right tail.\\
+ \apisubhead{Output}\\
+\hyperlink{func:esl_histogram_Write()}{\ccode{esl\_histogram\_Write()}} & Print a "pretty" ASCII histogram.\\
+\hyperlink{func:esl_histogram_Plot()}{\ccode{esl\_histogram\_Plot()}} & Output a histogram in xmgrace XY format.\\
+\hyperlink{func:esl_histogram_PlotSurvival()}{\ccode{esl\_histogram\_PlotSurvival()}} & Output $P(X>x)$ in xmgrace XY format.\\
+\hyperlink{func:esl_histogram_PlotQQ()}{\ccode{esl\_histogram\_PlotQQ()}} & Output a Q-Q plot in xmgrace XY format.\\
+\hyperlink{func:esl_histogram_Goodness()}{\ccode{esl\_histogram\_Goodness()}} & Evaluate fit between observed, expected. \\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{histogram} API.}
+\label{tbl:histogram_api}
+\end{table}
+
+\subsection{Example of using the histogram API}
+
+The example code below stores 10,000 samples from a Gumbel
+distribution in a histogram, retrieves a vector containing the sorted
+samples, fits a Gumbel distribution to that dataset, sets the expected
+counts in the histogram, prints the observed and expected counts in an
+ASCII histogram, and evaluates the goodness-of-fit.
+
+\input{cexcerpts/histogram_example}
+
+Some points of interest:
+
+\begin{itemize}
+\item When the histogram is created, the arguments \ccode(-100, 100, 0.5)
+ tell it to bin data into bins of width 0.5, initially
+ starting at -100 and ending at 100. This initialization
+ is described below (see ``Specifying binning of data values'').
+
+\item Samples are collected one at a time with
+ \ccode{esl\_histogram\_Add()}.
+
+\item After the data have been collected in a \emph{full} histogram, a
+ vector of sorted raw data values can be retrieved using functions
+ like \ccode{esl\_histogram\_GetData()}, and used to fit parameters
+ of an expected distribution to the data.
+
+\item In addition to the observed binned counts, you can optionally
+ set \emph{expected} binned counts in the histogram by calling
+ \ccode{esl\_histogram\_SetExpect()} and providing pointers
+ to an appropriate distribution function and its parameters.
+
+\item The \ccode{esl\_histogram\_Print()} function shows an ASCII text
+ representation of the observed counts (and expected counts, if set)
+ that looks a lot like FASTA's nice histogram output.
+
+\item The \ccode{esl\_histogram\_Goodness()} function compares the
+ observed and expected binned counts, and calculates two goodness of
+ fit tests: a G-test, and a $\chi^2$ test.
+\end{itemize}
+
+
+\subsection{Specifying binning of data values}
+
+The histogram collects data values into bins. When the histogram is
+created, the bin width and the relative offset of the bins is
+permanently set, and an initial range is allocated.
+
+For example, the call \ccode{esl\_histogram\_Create(-10, 10, 0.5)}
+creates 40 bins of width 0.5 from -10 to 10, with the first bin
+collecting scores from $-10 < x \leq -9.5$, and the last bin
+collecting scores $9.5 < x \leq 10.0$.
+
+The lower bound of the initialization permanently sets the relative
+offset of the bins. That is, \ccode{esl\_histogram\_Create(-10, 10,
+0.5)} makes the first bin $-10 < x \leq -9.5$, whereas
+\ccode{esl\_histogram\_Create(-10.1, 9.9, 0.5)} makes the first bin
+$-10.1 < x \leq -9.6$.
+
+Aside from that, the initial range is only a suggestion. You can add
+any real-valued $x$ to the histogram. The histogram will silently
+reallocate itself to a wider range as needed. The ability of a
+histogram to store data is effectively unlimited. Up to $2^{64}-1$
+(more than $10^{19}$) counts can be collected. The histogram requires 16
+bytes of storage per bin, and the number of bins it allocates scales
+as $x_{\mbox{max}} - x_{\mbox{min}} / w$.
+
+\subsection{Optional collection of raw data values: full histograms}
+
+Normally a histogram would store only binned counts, so it can
+efficiently summarize even very large numbers of samples.
+
+In some cases it is useful to keep a list of the raw data values --
+for instance, for more accurate parameter fitting to expected
+distributions. This can be done by creating a ``full'' histogram with
+\ccode{esl\_histogram\_CreateFull()} instead of
+\ccode{esl\_histogram\_Create()}. (The example code above did this,
+because it did parameter fitting to the raw data.) After data have
+been collected in a full histogram, individual raw values or pointers
+to sorted arrays of raw values can be retrieved using the
+\ccode{esl\_histogram\_Get*} functions.
+
+A full histogram may require much more memory: about 4 bytes per data
+point. You may not want to use full histograms if your problem
+involves collecting many ($> 10^9$, say) data points.
+
+
+
+\subsection{Different parameter fitting scenarios}
+
+By default, the data you collect are assumed to be \emph{complete}.
+You observed all samples; if you fit to any expected distribution, the
+expected distribution is assumed to describe the complete data; the
+parameters of the expected distribution are to be fitted to an array
+of the complete raw data samples; and any goodness of fit test is to
+be applied to the complete data. This is the simplest, most obvious
+case.
+
+Other situations may arise. In addition to complete data, Easel is
+designed to deal with four other cases:
+
+\begin{enumerate}
+\item The collected data are complete, and they are fit to a
+ distribution that describes the complete data, but parameter
+ fitting is done only in the right (highest-scoring) tail. This
+ makes parameter fitting focus on the most important,
+ high-scoring region of a score distribution, and ignore
+ low-scoring outliers.
+
+\item The collected data are complete, but they are fit to a
+ distribution that only describes the right (highest scoring)
+ tail, and the goodness-of-fit test is only performed on that
+ tail. This case arises when we don't know the form of the
+ expected distribution for the complete data, but the tail
+ follows a predictable decay (an exponential tail, for example).
+
+\item The collected data are left-censored such that no values $<
+ \phi$ were recorded in the histogram, but the data are fit to a
+ complete distribution that predicts the probability even of the
+ censored (unobserved) values. Goodness of fit is only evaluated
+ in the observed data. (This case is what is actually meant by
+ left-censored data.)
+
+\item The high-scoring right tail of the collected data are fit as the
+ \emph{binned} counts in the histogram (not raw sample values) to
+ a distribution that describes the tail, such as an
+ exponential. This case becomes useful when the raw data values
+ have limited precision (because of rounding, for example), which
+ can cause numerical problems with parameter fitting to tails.
+ Another case where this is useful is when there are so many data
+ points that the data must be binned just as a matter of
+ practicality (not enough memory to hold a full histogram).
+\end{enumerate}
+
+A variety of other situations can be dealt with by using different
+combinations of the function calls that deal with these four cases.
+
+
+\subsubsection{Focusing parameter fitting on the highest scores}
+
+An example of focusing a Gumbel parameter fit on the right half of an
+observed distribution:
+
+\input{cexcerpts/histogram_example2}
+
+The key differences from the complete data case are:
+
+\begin{itemize}
+\item Only the high-scoring 50\% of the data samples are
+ retrieved, by calling
+ \ccode{esl\_histogram\_GetTailByMass(h, 0.5, \&xv, \&n, \&z)}.
+ This returns \ccode{z}, the number of samples that
+ were \emph{censored}.
+
+\item These data are fit to a Gumbel distribution
+ as a \emph{left-censored} dataset by calling
+ \ccode{esl\_gumbel\_FitCensored(xv, n, z, xv[0], \&mu, \&lambda)}.
+\end{itemize}
+
+The expected counts and the goodness of fit tests are still evaluated
+for the complete data, even though the fit was performed only on the
+highest scores.
+
+
+\subsubsection{Fitting to a tail distribution}
+
+An example of fitting an exponential tail to the high-scoring 10\% of
+a Gumbel-distributed dataset:
+
+\input{cexcerpts/histogram_example3}
+
+The differences to note are:
+
+\begin{itemize}
+\item The tail is fit as if it is \emph{complete} data as far
+ as the exponential distribution is concerned.
+
+\item As a result, to use the exponential tail to predict expected
+ data, we have to keep in mind how much probability mass the tail
+ is supposed to predict (here, 10\%), and that
+ is provided to
+ \ccode{esl\_histogram\_SetExpectedTail()}, which specifically
+ calculates expected counts for a tail.
+\end{itemize}
+
+\subsubsection{Fitting left-censored data}
+
+Fitting a Gumbel distribution to data that are \emph{truly} left
+censored looks a lot like the case where we extracted the high scoring
+data for a censored fit:
+
+\input{cexcerpts/histogram_example4}
+
+\subsubsection{Fitting binned data to a tail distribution}
+
+Normally, you want to fit parameters to the actual individual data
+samples, not to binned data, because you'll get more accurate results.
+An exception can arise when the data samples have limited precision
+because they've been rounded off. Most distributions are not sensitive
+to this, but some tail densities are, especially those with
+singularities ($P(X=x) \rightarrow \infty$) at their origin. In such a
+case, a fit to binned data may be superior, especially if you can
+match the histogram's bins to the rounding procedure that was used.
+
+The following code shows an example of fitting for samples that were
+already rounded up to the nearest integer before adding them to the
+histogram:
+
+\input{cexcerpts/histogram_example5}
+
+Issues to note:
+
+\begin{itemize}
+\item The \ccode{esl\_histogram\_Create(-100, 100, 1.0)} call
+ defined bins that exactly match the rounding procedure
+ defined by \ccode{ceil(x)} -- all $x$ that are rounded
+ to the same value by \ccode{ceil(x)} would also go in
+ the same bin of the histogram.
+
+\item The \ccode{esl\_histogram\_SetTailByMass()} function sets flags
+ in the histogram to demarcate the desired tail. However,
+ because the data have been binned, and we can only define the
+ tail by a range of bins, it will generally be impossible to
+ match the requested tail mass with adequate accuracy; the actual
+ tail mass is $\geq$ the requested tail mass. It is returned
+ to the caller, and it is the actual mass, not the requested mass,
+ that should be used when setting expected counts.
+
+\item The \ccode{esl\_histogram\_SetRounding()} declaration
+ sets a flag in the histogram that tells binned parameter
+ fitting functions that the origin of the fitted
+ density ($\mu$) should be set at the lower bound of the smallest bin,
+ rather than the smallest raw data value observed in that
+ bin.
+\end{itemize}
+
+
diff --git a/esl_hmm.c b/esl_hmm.c
new file mode 100644
index 0000000..bdab83d
--- /dev/null
+++ b/esl_hmm.c
@@ -0,0 +1,812 @@
+/* General hidden Markov models (discrete, of alphabetic strings)
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_hmm.h"
+#include "esl_random.h"
+#include "esl_vectorops.h"
+
+/* Function: esl_hmm_Create()
+ * Synopsis: Allocates a new HMM.
+ *
+ * Purpose: Allocates a new HMM of <M> states for
+ * generating or modeling strings in the
+ * alphabet <abc>.
+ *
+ * Returns: a pointer to the new HMM.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_HMM *
+esl_hmm_Create(const ESL_ALPHABET *abc, int M)
+{
+ ESL_HMM *hmm = NULL;
+ int k,x;
+ int status;
+
+ ESL_ALLOC(hmm, sizeof(ESL_HMM));
+ hmm->t = NULL;
+ hmm->e = NULL;
+ hmm->eo = NULL;
+ hmm->pi = NULL;
+
+ ESL_ALLOC(hmm->t, sizeof(float *) * M); hmm->t[0] = NULL;
+ ESL_ALLOC(hmm->e, sizeof(float *) * M); hmm->e[0] = NULL;
+ ESL_ALLOC(hmm->eo, sizeof(float *) * abc->Kp); hmm->eo[0] = NULL;
+ ESL_ALLOC(hmm->pi, sizeof(float) * (M+1)); // initial transition to state M means a L=0 sequence
+
+ ESL_ALLOC(hmm->t[0], sizeof(float) * M * (M+1)); // state M is the implicit end state
+ ESL_ALLOC(hmm->e[0], sizeof(float) * M * abc->K);
+ ESL_ALLOC(hmm->eo[0], sizeof(float) * abc->Kp * M);
+
+
+ for (k = 1; k < M; k++)
+ {
+ hmm->t[k] = hmm->t[0] + k*(M+1);
+ hmm->e[k] = hmm->e[0] + k*abc->K;
+ }
+ for (x = 1; x < abc->Kp; x++)
+ hmm->eo[x] = hmm->eo[0] + x*M;
+
+ hmm->M = M;
+ hmm->K = abc->K;
+ hmm->abc = abc;
+ return hmm;
+
+ ERROR:
+ esl_hmm_Destroy(hmm);
+ return NULL;
+}
+
+/* Function: esl_hmm_Clone()
+ * Synopsis: Duplicate an HMM.
+ *
+ * Purpose: Make a newly allocated duplicate of the HMM <hmm>,
+ * and return a pointer to the duplicate.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_HMM *
+esl_hmm_Clone(const ESL_HMM *hmm)
+{
+ ESL_HMM *dup = NULL;
+ int k, x;
+
+ if ((dup = esl_hmm_Create(hmm->abc, hmm->M)) == NULL) return NULL;
+
+ for (k = 0; k < hmm->M; k++)
+ {
+ memcpy(dup->t[k], hmm->t[k], sizeof(float) * (hmm->M+1));
+ memcpy(dup->e[k], hmm->e[k], sizeof(float) * (hmm->abc->K));
+ }
+ for (x = 0; x < hmm->abc->Kp; x++)
+ {
+ memcpy(dup->eo[x], hmm->eo[x], sizeof(float) * (hmm->M));
+ }
+ memcpy(dup->pi, hmm->pi, sizeof(float) * (hmm->M+1));
+ return dup;
+}
+
+
+/* Function: esl_hmm_Configure()
+ * Synopsis: Set an HMM's emission odds ratios, including degenerate residues.
+ *
+ * Purpose: Given a parameterized <hmm>, and some background
+ * residue frequencies <fq>, set the emission odds ratios
+ * (<hmm->eo[0..Kp-1][0..M-1]>) in the model.
+ *
+ * The frequencies <fq> do not necessarily have to
+ * correspond to a null model. They are only used for
+ * rescaling.
+ *
+ * If <fq> is <NULL>, uniform background frequencies are
+ * used ($\frac{1}{K}$, for alphabet size $K$).
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_hmm_Configure(ESL_HMM *hmm, float *fq)
+{
+ int Kp = hmm->abc->Kp;
+ int K = hmm->abc->K;
+ int k,x,y;
+ float uniform = 1.0f / (float) K;
+ float use_fq;
+ float denom;
+
+ for (x = 0; x < K; x++) {
+ use_fq = (fq == NULL) ? uniform : fq[x];
+ for (k = 0; k < hmm->M; k++)
+ hmm->eo[x][k] = hmm->e[k][x] / use_fq;
+ }
+
+ for (k = 0; k < hmm->M; k++)
+ { /* -,*,~: treat as X */
+ hmm->eo[K][k] = 1.0; /* gap char */
+ hmm->eo[Kp-2][k] = 1.0; /* nonresidue */
+ hmm->eo[Kp-1][k] = 1.0; /* missing data char */
+ }
+
+ for (x = K+1; x <= Kp-3; x++) {
+ for (k = 0; k < hmm->M; k++)
+ {
+ hmm->eo[x][k] = 0.0f;
+ denom = 0.0f;
+ for (y = 0; y < K; y++)
+ if (hmm->abc->degen[x][y])
+ {
+ hmm->eo[x][k] += hmm->e[k][y];
+ denom += (fq == NULL) ? uniform : fq[y];
+ }
+ hmm->eo[x][k] = ((denom > 0.0f) ? hmm->eo[x][k] / denom : 0.0f);
+ }
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_hmm_Destroy()
+ * Synopsis: Destroys an HMM.
+ *
+ * Purpose: Frees an HMM.
+ */
+void
+esl_hmm_Destroy(ESL_HMM *hmm)
+{
+ if (hmm == NULL) return;
+
+ if (hmm->t != NULL) {
+ if (hmm->t[0] != NULL) free(hmm->t[0]);
+ free(hmm->t);
+ }
+ if (hmm->e != NULL) {
+ if (hmm->e[0] != NULL) free(hmm->e[0]);
+ free(hmm->e);
+ }
+ if (hmm->eo != NULL) {
+ if (hmm->eo[0] != NULL) free(hmm->eo[0]);
+ free(hmm->eo);
+ }
+ if (hmm->pi != NULL) free(hmm->pi);
+ free(hmm);
+ return;
+}
+
+
+ESL_HMX *
+esl_hmx_Create(int allocL, int allocM)
+{
+ ESL_HMX *mx = NULL;
+ int i;
+ int status;
+
+ ESL_ALLOC(mx, sizeof(ESL_HMX));
+ mx->dp_mem = NULL;
+ mx->dp = NULL;
+ mx->sc = NULL;
+
+ ESL_ALLOC(mx->dp_mem, sizeof(float) * (allocL+1) * allocM);
+ mx->ncells = (allocL+1) * allocM;
+
+ ESL_ALLOC(mx->dp, sizeof (float *) * (allocL+1));
+ ESL_ALLOC(mx->sc, sizeof (float) * (allocL+2));
+ mx->allocR = allocL+1;
+
+ for (i = 0; i <= allocL; i++)
+ mx->dp[i] = mx->dp_mem + i*allocM;
+ mx->validR = allocL+1;
+ mx->allocM = allocM;
+
+ mx->L = 0;
+ mx->M = 0;
+ return mx;
+
+ ERROR:
+ esl_hmx_Destroy(mx);
+ return NULL;
+}
+
+int
+esl_hmx_GrowTo(ESL_HMX *mx, int L, int M)
+{
+ uint64_t ncells;
+ void *p;
+ int do_reset = FALSE;
+ int i;
+ int status;
+
+ if (L < mx->allocR && M <= mx->allocM) return eslOK;
+
+ /* Do we have to reallocate the 2D matrix, or can we get away with
+ * rejiggering the row pointers into the existing memory?
+ */
+ ncells = (L+1) * M;
+ if (ncells > mx->ncells)
+ {
+ ESL_RALLOC(mx->dp_mem, p, sizeof(float) * ncells);
+ mx->ncells = ncells;
+ do_reset = TRUE;
+ }
+
+ /* must we reallocate row pointers? */
+ if (L >= mx->allocR)
+ {
+ ESL_RALLOC(mx->dp, p, sizeof(float *) * (L+1));
+ ESL_RALLOC(mx->sc, p, sizeof(float) * (L+2));
+ mx->allocR = L+1;
+ mx->allocM = M;
+ do_reset = TRUE;
+ }
+
+ /* must we widen the rows? */
+ if (M > mx->allocM)
+ {
+ mx->allocM = M;
+ do_reset = TRUE;
+ }
+
+ /* must we set some more valid row pointers? */
+ if (L >= mx->validR)
+ do_reset = TRUE;
+
+ /* did we trigger a relayout of row pointers? */
+ if (do_reset)
+ {
+ mx->validR = ESL_MIN(mx->ncells / mx->allocM, mx->allocR);
+ for (i = 0; i < mx->validR; i++)
+ mx->dp[i] = mx->dp_mem + i*mx->allocM;
+ }
+ mx->M = 0;
+ mx->L = 0;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+void
+esl_hmx_Destroy(ESL_HMX *mx)
+{
+ if (mx == NULL) return;
+
+ if (mx->dp_mem != NULL) free(mx->dp_mem);
+ if (mx->dp != NULL) free(mx->dp);
+ if (mx->sc != NULL) free(mx->sc);
+ free(mx);
+ return;
+}
+
+
+/* Function: esl_hmm_Emit()
+ * Synopsis: Emit a sequence from an HMM.
+ *
+ * Purpose: Sample one sequence from an <hmm>, using random
+ * number generator <r>. Optionally return the sequence,
+ * the state path, and/or the length via <opt_dsq>,
+ * <opt_path>, and <opt_L>.
+ *
+ * If <opt_dsq> or <opt_path> are requested, caller
+ * becomes responsible for free'ing their memory.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_hmm_Emit(ESL_RANDOMNESS *r, const ESL_HMM *hmm, ESL_DSQ **opt_dsq, int **opt_path, int *opt_L)
+{
+ int k, L, allocL;
+ int *path = NULL;
+ ESL_DSQ *dsq = NULL;
+ void *tmp = NULL;
+ int status;
+
+ ESL_ALLOC(dsq, sizeof(ESL_DSQ) * 256);
+ ESL_ALLOC(path, sizeof(int) * 256);
+ allocL = 256;
+
+ dsq[0] = eslDSQ_SENTINEL;
+ path[0] = -1;
+
+ k = esl_rnd_FChoose(r, hmm->pi, hmm->M+1);
+ L = 0;
+ while (k != hmm->M) /* M is the implicit end state */
+ {
+ L++;
+ if (L >= allocL-1) { /* Reallocate path and seq if needed */
+ ESL_RALLOC(dsq, tmp, sizeof(ESL_DSQ) * (allocL*2));
+ ESL_RALLOC(path, tmp, sizeof(int) * (allocL*2));
+ allocL *= 2;
+ }
+
+ path[L] = k;
+ dsq[L] = esl_rnd_FChoose(r, hmm->e[k], hmm->abc->K);
+ k = esl_rnd_FChoose(r, hmm->t[k], hmm->M+1);
+ }
+
+ path[L+1] = hmm->M; /* sentinel for "end state" */
+ dsq[L+1] = eslDSQ_SENTINEL;
+
+ if (opt_dsq != NULL) *opt_dsq = dsq; else free(dsq);
+ if (opt_path != NULL) *opt_path = path; else free(path);
+ if (opt_L != NULL) *opt_L = L;
+ return eslOK;
+
+ ERROR:
+ if (path != NULL) free(path);
+ if (dsq != NULL) free(dsq);
+ return status;
+}
+
+
+int
+esl_hmm_Forward(const ESL_DSQ *dsq, int L, const ESL_HMM *hmm, ESL_HMX *fwd, float *opt_sc)
+{
+ int i, k, m;
+ int M = hmm->M;
+ float logsc = 0;
+ float max;
+
+ fwd->sc[0] = 0.0;
+
+ if (L == 0) {
+ fwd->sc[L+1] = logsc = log(hmm->pi[M]);
+ if (opt_sc != NULL) *opt_sc = logsc;
+ return eslOK;
+ }
+
+ max = 0.0;
+ for (k = 0; k < M; k++) {
+ fwd->dp[1][k] = hmm->eo[dsq[1]][k] * hmm->pi[k];
+ max = ESL_MAX(fwd->dp[1][k], max);
+ }
+ for (k = 0; k < M; k++) {
+ fwd->dp[1][k] /= max;
+ }
+ fwd->sc[1] = log(max);
+
+ for (i = 2; i <= L; i++)
+ {
+ max = 0.0;
+ for (k = 0; k < M; k++)
+ {
+ fwd->dp[i][k] = 0.0;
+ for (m = 0; m < M; m++)
+ fwd->dp[i][k] += fwd->dp[i-1][m] * hmm->t[m][k];
+
+ fwd->dp[i][k] *= hmm->eo[dsq[i]][k];
+
+ max = ESL_MAX(fwd->dp[i][k], max);
+ }
+
+ for (k = 0; k < M; k++)
+ fwd->dp[i][k] /= max;
+ fwd->sc[i] = log(max);
+ }
+
+
+ fwd->sc[L+1] = 0.0;
+ for (m = 0; m < M; m++)
+ fwd->sc[L+1] += fwd->dp[L][m] * hmm->t[m][M];
+ fwd->sc[L+1] = log(fwd->sc[L+1]);
+
+ logsc = 0.0;
+ for (i = 1; i <= L+1; i++)
+ logsc += fwd->sc[i];
+
+ fwd->M = hmm->M;
+ fwd->L = L;
+ if (opt_sc != NULL) *opt_sc = logsc;
+ return eslOK;
+}
+
+
+int
+esl_hmm_Backward(const ESL_DSQ *dsq, int L, const ESL_HMM *hmm, ESL_HMX *bck, float *opt_sc)
+{
+ int i,k,m;
+ int M = hmm->M;
+ float logsc = 0.0;
+ float max;
+
+ bck->sc[L+1] = 0.0;
+
+ if (L == 0) {
+ bck->sc[0] = logsc = log(hmm->pi[M]);
+ if (opt_sc != NULL) *opt_sc = logsc;
+ return eslOK;
+ }
+
+ max = 0.0;
+ for (k = 0; k < M; k++)
+ {
+ bck->dp[L][k] = hmm->t[k][M];
+ max = ESL_MAX(bck->dp[L][k], max);
+ }
+ for (k = 0; k < M; k++)
+ bck->dp[L][k] /= max;
+ bck->sc[L] = log(max);
+
+ for (i = L-1; i >= 1; i--)
+ {
+ max = 0.0;
+ for (k = 0; k < M; k++)
+ {
+ bck->dp[i][k] = 0.0;
+ for (m = 0; m < M; m++)
+ bck->dp[i][k] += bck->dp[i+1][m] * hmm->eo[dsq[i+1]][m] * hmm->t[k][m];
+
+ max = ESL_MAX(bck->dp[i][k], max);
+ }
+
+ for (k = 0; k < M; k++)
+ bck->dp[i][k] /= max;
+ bck->sc[i] = log(max);
+ }
+
+ bck->sc[0] = 0.0;
+ for (m = 0; m < M; m++)
+ bck->sc[0] += bck->dp[1][m] * hmm->eo[dsq[1]][m] * hmm->pi[m];
+ bck->sc[0] = log(bck->sc[0]);
+
+ logsc = 0.0;
+ for (i = 0; i <= L; i++)
+ logsc += bck->sc[i];
+
+ bck->M = hmm->M;
+ bck->L = L;
+ if (opt_sc != NULL) *opt_sc = logsc;
+ return eslOK;
+}
+
+
+int
+esl_hmm_PosteriorDecoding(const ESL_DSQ *dsq, int L, const ESL_HMM *hmm, ESL_HMX *fwd, ESL_HMX *bck, ESL_HMX *pp)
+{
+ int i,k;
+
+ for (i = 1; i <= L; i++)
+ {
+ for (k = 0; k < hmm->M; k++)
+ pp->dp[i][k] = fwd->dp[i][k] * bck->dp[i][k];
+ esl_vec_FNorm(pp->dp[i], hmm->M);
+ }
+ return eslOK;
+}
+
+
+
+
+/*****************************************************************
+ * x. Functions used in unit testing
+ *****************************************************************/
+#ifdef eslHMM_TESTDRIVE
+static int
+make_occasionally_dishonest_casino(ESL_HMM **ret_hmm, ESL_ALPHABET **ret_abc)
+{
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslDICE);
+ ESL_HMM *hmm = esl_hmm_Create(abc, 2);
+ int x;
+
+ /* State 0 = fair die */
+ hmm->pi[0] = 1.0;
+ hmm->pi[1] = 0.0;
+ hmm->pi[2] = 0.0; /* no L=0 seqs */
+
+ hmm->t[0][0] = 0.96;
+ hmm->t[0][1] = 0.03;
+ hmm->t[0][2] = 0.01; /* end from state 0; mean length 100 */
+
+ for (x = 0; x < abc->K; x++)
+ hmm->e[0][x] = 1.0 / (float) abc->K;
+
+ /* State 1 = loaded die */
+ hmm->t[1][0] = 0.05;
+ hmm->t[1][1] = 0.95;
+ hmm->t[1][2] = 0.0; /* no end from state 1 */
+
+ for (x = 0; x < abc->K-1; x++) hmm->e[1][x] = 0.5 / ((float) abc->K-1);
+ hmm->e[1][abc->K-1] = 0.5;
+
+ esl_hmm_Configure(hmm, NULL);
+
+ *ret_hmm = hmm;
+ *ret_abc = abc;
+ return eslOK;
+}
+#endif /*eslHMM_TESTDRIVE*/
+
+
+/*****************************************************************
+ * x. Test driver.
+ *****************************************************************/
+#ifdef eslHMM_TESTDRIVE
+/* gcc -g -Wall -o hmm_utest -L. -I. -DeslHMM_TESTDRIVE esl_hmm.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_hmm.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ {"-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0},
+ {"-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show verbose output", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for hmm module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ ESL_ALPHABET *abc = NULL;
+ ESL_HMM *hmm = NULL;
+ ESL_DSQ *dsq = NULL;
+ int *path = NULL;
+ ESL_HMX *fwd = NULL;
+ ESL_HMX *bck = NULL;
+ ESL_HMX *pp = NULL;
+ int be_verbose = esl_opt_GetBoolean(go, "-v");
+ float fsc, bsc;
+ int L;
+ int i;
+ float fsum, bsum;
+
+ make_occasionally_dishonest_casino(&hmm, &abc);
+
+ esl_hmm_Emit(r, hmm, &dsq, &path, &L);
+
+ fwd = esl_hmx_Create(L, hmm->M);
+ bck = esl_hmx_Create(L, hmm->M);
+ pp = esl_hmx_Create(L, hmm->M);
+
+ esl_hmm_Forward (dsq, L, hmm, fwd, &fsc);
+ esl_hmm_Backward(dsq, L, hmm, bck, &bsc);
+ esl_hmm_PosteriorDecoding(dsq, L, hmm, fwd, bck, pp);
+
+ fsum = 0.0;
+ bsum = bsc;
+
+ fsum += fwd->sc[0];
+ if (be_verbose) printf("%4d %c %s %8.3f %8.3f\n", 0, '-', "--", fwd->sc[0], bck->sc[0]);
+ bsum -= bck->sc[0];
+
+ for (i = 1; i <= L; i++)
+ {
+ fsum += fwd->sc[i];
+ if (be_verbose)
+ printf("%4d %c %s %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n",
+ i, abc->sym[dsq[i]], path[i] == 0 ? "F " : " L",
+ fwd->sc[i], bck->sc[i],
+ fsum, bsum, fsum+bsum,
+ pp->dp[i][0], pp->dp[i][1]);
+ bsum -= fwd->sc[i];
+ }
+
+ if (be_verbose) {
+ printf("%4d %c %s %8.3f %8.3f\n", 0, '-', "--", fwd->sc[L+1], bck->sc[L+1]);
+ printf("Forward score = %f\n", fsc);
+ printf("Backward score = %f\n", bsc);
+ }
+
+ free(path);
+ free(dsq);
+ esl_hmx_Destroy(pp);
+ esl_hmx_Destroy(bck);
+ esl_hmx_Destroy(fwd);
+ esl_alphabet_Destroy(abc);
+ esl_hmm_Destroy(hmm);
+ esl_randomness_Destroy(r);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslHMM_TESTDRIVE*/
+
+
+
+/*****************************************************************
+ * x. Example
+ *****************************************************************/
+#ifdef eslHMM_EXAMPLE
+/*::cexcerpt::hmm_example::begin::*/
+/* compile: gcc -g -Wall -I. -L. -o hmm_example -DeslHMM_EXAMPLE esl_hmm.c -leasel -lm
+ * run: ./hmm_example <sequence file>
+ */
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_hmm.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <seqfile>";
+static char banner[] = "example of the HMM module";
+
+ESL_HMM *
+create_test_hmm(ESL_ALPHABET *abc)
+{
+ ESL_HMM *hmm;
+ int L = 400;
+ int M = 200;
+
+ hmm = esl_hmm_Create(abc, 2);
+
+ /* state 0 = normal iid model. state 1 = biased state */
+
+ hmm->t[0][0] = (float) L / (float) (L+1);
+ hmm->t[0][1] = 1.0f / (float) (L+1);
+ hmm->t[0][2] = 1.0; /* external length distribution */
+
+ hmm->t[1][0] = (float) 2.0f / (float) (M+2);
+ hmm->t[1][1] = (float) M / (float) (M+2);
+ hmm->t[1][2] = 1.0;
+
+ /* SW50 iid frequencies: H3 default background */
+ hmm->e[0][0] = 0.0787945; /* A */
+ hmm->e[0][1] = 0.0151600; /* C */
+ hmm->e[0][2] = 0.0535222; /* D */
+ hmm->e[0][3] = 0.0668298; /* E */
+ hmm->e[0][4] = 0.0397062; /* F */
+ hmm->e[0][5] = 0.0695071; /* G */
+ hmm->e[0][6] = 0.0229198; /* H */
+ hmm->e[0][7] = 0.0590092; /* I */
+ hmm->e[0][8] = 0.0594422; /* K */
+ hmm->e[0][9] = 0.0963728; /* L */
+ hmm->e[0][10] = 0.0237718; /* M */
+ hmm->e[0][11] = 0.0414386; /* N */
+ hmm->e[0][12] = 0.0482904; /* P */
+ hmm->e[0][13] = 0.0395639; /* Q */
+ hmm->e[0][14] = 0.0540978; /* R */
+ hmm->e[0][15] = 0.0683364; /* S */
+ hmm->e[0][16] = 0.0540687; /* T */
+ hmm->e[0][17] = 0.0673417; /* V */
+ hmm->e[0][18] = 0.0114135; /* W */
+ hmm->e[0][19] = 0.0304133; /* Y */
+
+ /* average of MFS_1 core emissions */
+ hmm->e[1][0] = 0.1068; /* A */
+ hmm->e[1][1] = 0.0110; /* C */
+ hmm->e[1][2] = 0.0242; /* D */
+ hmm->e[1][3] = 0.0293; /* E */
+ hmm->e[1][4] = 0.0621; /* F */
+ hmm->e[1][5] = 0.0899; /* G */
+ hmm->e[1][6] = 0.0139; /* H */
+ hmm->e[1][7] = 0.0762; /* I */
+ hmm->e[1][8] = 0.0319; /* K */
+ hmm->e[1][9] = 0.1274; /* L */
+ hmm->e[1][10] = 0.0338; /* M */
+ hmm->e[1][11] = 0.0285; /* N */
+ hmm->e[1][12] = 0.0414; /* P */
+ hmm->e[1][13] = 0.0266; /* Q */
+ hmm->e[1][14] = 0.0375; /* R */
+ hmm->e[1][15] = 0.0747; /* S */
+ hmm->e[1][16] = 0.0568; /* T */
+ hmm->e[1][17] = 0.0815; /* V */
+ hmm->e[1][18] = 0.0161; /* W */
+ hmm->e[1][19] = 0.0303; /* Y */
+
+ hmm->pi[0] = 0.99;
+ hmm->pi[1] = 0.01;
+
+ esl_hmm_Configure(hmm, NULL);
+ return hmm;
+}
+
+
+ESL_HMM *
+create_null_hmm(ESL_ALPHABET *abc)
+{
+ ESL_HMM *hmm;
+ hmm = esl_hmm_Create(abc, 1);
+
+ /* state 0 = normal iid model.*/
+ hmm->t[0][0] = 1.0f;
+ hmm->t[0][1] = 1.0f; /* external length distribution */
+
+ /* SW50 iid frequencies: H3 default background */
+ hmm->e[0][0] = 0.0787945; /* A */
+ hmm->e[0][1] = 0.0151600; /* C */
+ hmm->e[0][2] = 0.0535222; /* D */
+ hmm->e[0][3] = 0.0668298; /* E */
+ hmm->e[0][4] = 0.0397062; /* F */
+ hmm->e[0][5] = 0.0695071; /* G */
+ hmm->e[0][6] = 0.0229198; /* H */
+ hmm->e[0][7] = 0.0590092; /* I */
+ hmm->e[0][8] = 0.0594422; /* K */
+ hmm->e[0][9] = 0.0963728; /* L */
+ hmm->e[0][10] = 0.0237718; /* M */
+ hmm->e[0][11] = 0.0414386; /* N */
+ hmm->e[0][12] = 0.0482904; /* P */
+ hmm->e[0][13] = 0.0395639; /* Q */
+ hmm->e[0][14] = 0.0540978; /* R */
+ hmm->e[0][15] = 0.0683364; /* S */
+ hmm->e[0][16] = 0.0540687; /* T */
+ hmm->e[0][17] = 0.0673417; /* V */
+ hmm->e[0][18] = 0.0114135; /* W */
+ hmm->e[0][19] = 0.0304133; /* Y */
+
+ hmm->pi[0] = 1.0;
+ esl_hmm_Configure(hmm, NULL);
+ return hmm;
+}
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslAMINO);
+ ESL_SQ *sq = esl_sq_CreateDigital(abc);
+ ESL_SQFILE *sqfp = NULL;
+ ESL_HMM *hmm = create_test_hmm(abc);
+ ESL_HMM *bg = create_null_hmm(abc);
+ ESL_HMX *hmx = esl_hmx_Create(400, hmm->M);
+ int format = eslSQFILE_UNKNOWN;
+ char *seqfile = esl_opt_GetArg(go, 1);
+ float fwdsc, nullsc;
+ int status;
+
+ status = esl_sqfile_OpenDigital(abc, seqfile, format, NULL, &sqfp);
+ if (status == eslENOTFOUND) esl_fatal("No such file.");
+ else if (status == eslEFORMAT) esl_fatal("Format unrecognized.");
+ else if (status != eslOK) esl_fatal("Open failed, code %d.", status);
+
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ esl_hmx_GrowTo(hmx, sq->n, hmm->M);
+
+ esl_hmm_Forward(sq->dsq, sq->n, hmm, hmx, &fwdsc);
+ esl_hmm_Forward(sq->dsq, sq->n, bg, hmx, &nullsc);
+
+ printf("%-16s %5d %11.4f %8.4f %11.4f %8.4f %11.4f %8.4f\n", sq->name, (int) sq->n,
+ fwdsc * eslCONST_LOG2R, (fwdsc * eslCONST_LOG2R) / sq->n,
+ nullsc * eslCONST_LOG2R, (nullsc * eslCONST_LOG2R) / sq->n,
+ (fwdsc - nullsc) * eslCONST_LOG2R, (fwdsc-nullsc) * eslCONST_LOG2R / sq->n);
+
+ esl_sq_Reuse(sq);
+ }
+ if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s)\n%s\n",
+ sqfp->filename, sqfp->get_error(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected error %d reading sequence file %s",
+ status, sqfp->filename);
+
+
+ esl_sqfile_Close(sqfp);
+ esl_sq_Destroy(sq);
+ esl_hmm_Destroy(hmm);
+ esl_hmm_Destroy(bg);
+ esl_hmx_Destroy(hmx);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+/*::cexcerpt::hmm_example::end::*/
+#endif /*eslHMM_EXAMPLE*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_hmm.h b/esl_hmm.h
new file mode 100644
index 0000000..e07b6ec
--- /dev/null
+++ b/esl_hmm.h
@@ -0,0 +1,58 @@
+/* General hidden Markov models (discrete; of alphabetic strings)
+ *
+ * SRE, Fri Jul 18 08:54:41 2008 [Janelia]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslHMM_INCLUDED
+#define eslHMM_INCLUDED
+
+#include "esl_alphabet.h"
+#include "esl_random.h"
+
+
+typedef struct {
+ int M; /* number of states in the model */
+ int K; /* size of alphabet (redundant w/ abc->K) */
+ float *pi; /* initial (begin) distribution (0..M) */
+ float **t; /* Mx(M+1) state transition probabilities */
+ float **e; /* MxK emission probabilities */
+
+ float **eo; /* K'xM emission odds ratios */
+ const ESL_ALPHABET *abc; /* ptr to alphabet */
+} ESL_HMM;
+
+typedef struct {
+ float **dp; /* [0..L][0..M-1] DP matrix */
+ float *sc; /* [0..L+1] scale factors (log probs) */
+ int M; /* actual model dimension (0..M-1) */
+ int L; /* actual sequence dimension (1..L) */
+
+ float *dp_mem; /* memory allocated for the resizable DP matrix */
+ int allocR; /* current allocated # of rows: L+1 <= validR <= allocR */
+ int validR; /* # of dp rows actually pointing at DP memory */
+ int allocM; /* current set row width; M <= allocM */
+ uint64_t ncells; /* total allocation of dp_mem; ncells >= (validR)(allocM)*/
+} ESL_HMX;
+
+
+
+extern ESL_HMM *esl_hmm_Create(const ESL_ALPHABET *abc, int M);
+extern ESL_HMM *esl_hmm_Clone(const ESL_HMM *hmm);
+extern int esl_hmm_Configure(ESL_HMM *hmm, float *fq);
+extern int esl_hmm_SetDegeneracies(ESL_HMM *hmm);
+extern void esl_hmm_Destroy(ESL_HMM *hmm);
+
+extern ESL_HMX *esl_hmx_Create(int allocL, int allocM);
+extern int esl_hmx_GrowTo (ESL_HMX *mx, int L, int M);
+extern void esl_hmx_Destroy(ESL_HMX *mx);
+
+extern int esl_hmm_Emit(ESL_RANDOMNESS *r, const ESL_HMM *hmm, ESL_DSQ **opt_dsq, int **opt_path, int *opt_L);
+extern int esl_hmm_Forward(const ESL_DSQ *dsq, int L, const ESL_HMM *hmm, ESL_HMX *fwd, float *opt_sc);
+extern int esl_hmm_Backward(const ESL_DSQ *dsq, int L, const ESL_HMM *hmm, ESL_HMX *bck, float *opt_sc);
+
+
+#endif /*eslHMM_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_hyperexp.c b/esl_hyperexp.c
new file mode 100644
index 0000000..4e83c9a
--- /dev/null
+++ b/esl_hyperexp.c
@@ -0,0 +1,1418 @@
+/* Statistical routines for hyperexponential distributions.
+ *
+ * Contents:
+ * 1. The ESL_HYPEREXP object
+ * 2. Evaluating densities and distributions
+ * 3. Generic API routines: for general interface w/ histogram module
+ * 4. Dumping plots for files
+ * 5. Sampling (augmentation: random)
+ * 6. File input (augmentation: fileparser)
+ * 7. ML fitting to complete data (augmentation: minimizer)
+ * 8. ML fitting to binned data (augmentation: histogram, minimizer)
+ * 9. Test driver
+ * 10. Example
+ * 11. Copyright and license information
+ *
+ * Xrefs:
+ * STL9/140 : original implementation
+ * STL9/143-144 : ML fitting to binned data
+ *
+ * To-do:
+ * - Fit*() functions should return eslEINVAL on n=0, eslENORESULT
+ * on failure due to small n. Compare esl_gumbel. xref J12/93.
+ * SRE, Wed Nov 27 11:17:59 2013
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_stats.h"
+#include "esl_vectorops.h"
+#include "esl_exponential.h"
+#include "esl_hyperexp.h"
+
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#ifdef eslAUGMENT_HISTOGRAM
+#include "esl_histogram.h"
+#endif
+#ifdef eslAUGMENT_MINIMIZER
+#include "esl_minimizer.h"
+#endif
+#ifdef eslAUGMENT_FILEPARSER
+#include "esl_fileparser.h"
+#endif
+
+/****************************************************************************
+ *# 1. The ESL_HYPEREXP object
+ ****************************************************************************/
+
+/* Function: esl_hyperexp_Create()
+ *
+ * Purpose: Creates an object to hold parameters for a <K>-component
+ * hyperexponential.
+ *
+ * Parameters in the object are initialized
+ * ($q_k = \frac{1}{K}$, $\lambda_k = 1$, $\mu = 0$), but
+ * the caller will want to set these according to its own
+ * purposes.
+ *
+ * Args: K - number of components in the mixture
+ *
+ * Returns: ptr to newly allocated/initialized <ESL_HYPEREXP> object.
+ *
+ * Throws: NULL on allocation failure.
+ */
+ESL_HYPEREXP *
+esl_hyperexp_Create(int K)
+{
+ int status;
+ ESL_HYPEREXP *h = NULL;
+ int k;
+
+ ESL_ALLOC(h, sizeof(ESL_HYPEREXP));
+ h->q = h->lambda = h->wrk = NULL;
+ h->fixlambda = NULL;
+ h->K = K;
+ h->fixmix = FALSE;
+
+ ESL_ALLOC(h->q, sizeof(double) * K);
+ ESL_ALLOC(h->lambda, sizeof(double) * K);
+ ESL_ALLOC(h->wrk, sizeof(double) * K);
+ ESL_ALLOC(h->fixlambda, sizeof(char) * K);
+
+ for (k = 0; k < K; k++)
+ {
+ h->q[k] = 1. / (double) K;
+ h->lambda[k] = 1.;
+ h->fixlambda[k]= 0;
+ }
+ h->mu = 0.;
+ return h;
+
+ ERROR:
+ esl_hyperexp_Destroy(h);
+ return NULL;
+}
+
+/* Function: esl_hyperexp_Destroy()
+ *
+ * Purpose: Deallocates the hyperexponential parameter object <h>.
+ *
+ * Args: h - ptr to the object to be deallocated.
+ *
+ * Returns: (void).
+ */
+void
+esl_hyperexp_Destroy(ESL_HYPEREXP *h)
+{
+ if (h == NULL) return;
+
+ if (h->q != NULL) free(h->q);
+ if (h->lambda != NULL) free(h->lambda);
+ if (h->wrk != NULL) free(h->wrk);
+ if (h->fixlambda!= NULL) free(h->fixlambda);
+ free(h);
+}
+
+
+/* Function: esl_hyperexp_Copy()
+ *
+ * Purpose: Makes a copy of the hyperexponential parameter object <src>
+ * in <dest>. Caller must have already allocated <dest> to have
+ * (at least) the same number of components as <src>.
+ *
+ * Args: src - object to be copied
+ * dest - allocated object to copy <src> into
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINCOMPAT> if <dest> isn't allocated with enough
+ * components to hold a copy of <src>.
+ */
+int
+esl_hyperexp_Copy(ESL_HYPEREXP *src, ESL_HYPEREXP *dest)
+{
+ int k;
+
+ if (dest->K < src->K)
+ ESL_EXCEPTION(eslEINCOMPAT, "hyperexponential too small to copy into");
+
+ for (k = 0; k < src->K; k++)
+ {
+ dest->q[k] = src->q[k];
+ dest->lambda[k] = src->lambda[k];
+ dest->fixlambda[k]= src->fixlambda[k];
+ }
+ dest->mu = src->mu;
+ dest->K = src->K;
+ dest->fixmix = src->fixmix;
+ return eslOK;
+}
+
+/* Function: esl_hyperexp_FixedUniformMixture()
+ *
+ * Purpose: Set the mixture coeffients to a uniform (1/K) distribution,
+ * and fix them there so they aren't estimable parameters.
+ */
+int
+esl_hyperexp_FixedUniformMixture(ESL_HYPEREXP *h)
+{
+ int k;
+ for (k = 0; k < h->K; k++) h->q[k] = 1./(double)h->K;
+ h->fixmix = TRUE;
+ return eslOK;
+}
+
+
+/* Function: esl_hyperexp_SortComponents()
+ *
+ * Purpose: Rearrange the components in a hyperexponential in
+ * order of lambda values, with the highest lambda first.
+ *
+ * Stupid $O(K^2)$ selection sort algorithm here, because we
+ * expect $K$ to be small.
+ */
+int
+esl_hyperexp_SortComponents(ESL_HYPEREXP *h)
+{
+ int k, kp;
+ char ctmp;
+ double dtmp;
+
+ for (k = 0; k < h->K-1; k++)
+ {
+ kp = k + esl_vec_DArgMax(h->lambda+k, h->K-k);
+ if (k != kp)
+ {
+ dtmp = h->q[k]; h->q[k] = h->q[kp]; h->q[kp] = dtmp;
+ dtmp = h->lambda[k]; h->lambda[k] = h->lambda[kp]; h->lambda[kp] = dtmp;
+ ctmp = h->fixlambda[k]; h->fixlambda[k] = h->fixlambda[kp]; h->fixlambda[kp] = ctmp;
+ }
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_hyperexp_Write()
+ *
+ * Purpose: Write hyperexponential parameters from <hxp> to an open <fp>.
+ *
+ * The output format is suitable for input by <esl_hyperexp_Read()>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any write error.
+ */
+int
+esl_hyperexp_Write(FILE *fp, ESL_HYPEREXP *hxp)
+{
+ int k;
+
+ if (fprintf(fp, "%8d # number of components\n", hxp->K) < 0) ESL_EXCEPTION(eslEWRITE, "hyperexp write failed");
+ if (fprintf(fp, "%8.2f # mu (for all components)\n", hxp->mu) < 0) ESL_EXCEPTION(eslEWRITE, "hyperexp write failed");
+ for (k = 0; k < hxp->K; k++)
+ if (fprintf(fp, "%8.6f %12.6f # q[%d], lambda[%d]\n",
+ hxp->q[k], hxp->lambda[k], k, k) < 0) ESL_EXCEPTION(eslEWRITE, "hyperexp write failed");
+ return eslOK;
+}
+
+
+/* Function: esl_hyperexp_Dump()
+ *
+ * Purpose: Dump hyperexponential parameters from <hxp> to an open <fp>,
+ * all on one line with no comments.
+ *
+ * The output format is suitable for input by
+ * <esl_hyperexp_Read()>, like <esl_hyperexp_Write()>,
+ * though it's intended as a diagnostic dump of the
+ * contents of the object.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_hyperexp_Dump(FILE *fp, ESL_HYPEREXP *hxp)
+{
+ int k;
+
+ fprintf(fp, "%2d ", hxp->K);
+ fprintf(fp, "%6.2f ", hxp->mu);
+ for (k = 0; k < hxp->K; k++)
+ fprintf(fp, "%5.3f %9.6f ", hxp->q[k], hxp->lambda[k]);
+ fprintf(fp, "\n");
+ return eslOK;
+}
+
+/*----------------- end ESL_HYPEREXP object maintenance --------------------*/
+
+
+
+/****************************************************************************
+ * 2. Evaluating densities and distributions
+ ****************************************************************************/
+/* all lambda_k > 0
+ * all q_k are probabilities, \sum_k q_k = 1 [watch out for q_k=0 in log(q_k)].
+ * mu <= x < infinity [mu=x is not a problem]
+ */
+
+/* Function: esl_hxp_pdf()
+ *
+ * Purpose: Returns the probability density function $P(X=x)$ for
+ * quantile <x>, given hyperexponential parameters <h>.
+ */
+double
+esl_hxp_pdf(double x, ESL_HYPEREXP *h)
+{
+ double pdf = 0.;
+ int k;
+
+ if (x < h->mu) return 0.;
+
+ for (k = 0; k < h->K; k++)
+ pdf += h->q[k] * esl_exp_pdf(x, h->mu, h->lambda[k]);
+ return pdf;
+}
+
+
+/* Function: esl_hxp_logpdf()
+ *
+ * Purpose: Returns the log of the PDF ($\log P(X=x)$) for quantile <x>,
+ * given hyperexponential parameters <h>.
+ */
+double
+esl_hxp_logpdf(double x, ESL_HYPEREXP *h)
+{
+ int k;
+ double z;
+
+ if (x < h->mu) return -eslINFINITY;
+
+ for (k = 0; k < h->K; k++)
+ if (h->q[k] == 0.0)
+ h->wrk[k] = -eslINFINITY;
+ else
+ h->wrk[k] = log(h->q[k]) + esl_exp_logpdf(x, h->mu, h->lambda[k]);
+
+ z = esl_vec_DLogSum(h->wrk, h->K);
+ return z;
+}
+
+/* Function: esl_hxp_cdf()
+ *
+ * Purpose: Returns the cumulative distribution function $P(X \leq x)$
+ * for quantile <x>, given hyperexponential parameters <h>.
+ */
+double
+esl_hxp_cdf(double x, ESL_HYPEREXP *h)
+{
+ double cdf = 0.;
+ int k;
+
+ if (x < h->mu) return 0.;
+
+ for (k = 0; k < h->K; k++)
+ cdf += h->q[k] * esl_exp_cdf(x, h->mu, h->lambda[k]);
+ return cdf;
+}
+
+/* Function: esl_hxp_logcdf()
+ *
+ * Purpose: Returns the log of the CDF $\log P(X \leq x)$
+ * for quantile <x>, given hyperexponential parameters <h>.
+ */
+double
+esl_hxp_logcdf(double x, ESL_HYPEREXP *h)
+{
+ int k;
+
+ if (x < h->mu) return -eslINFINITY;
+
+ for (k = 0; k < h->K; k++)
+ if (h->q[k] == 0.0)
+ h->wrk[k] = -eslINFINITY;
+ else
+ h->wrk[k] = log(h->q[k]) + esl_exp_logcdf(x, h->mu, h->lambda[k]);
+
+ return esl_vec_DLogSum(h->wrk, h->K);
+}
+
+
+/* Function: esl_hxp_surv()
+ *
+ * Purpose: Returns the survivor function $P(X > x)$ (1-CDF)
+ * for quantile <x>, given hyperexponential parameters <h>.
+ */
+double
+esl_hxp_surv(double x, ESL_HYPEREXP *h)
+{
+ double srv = 0.;
+ int k;
+
+ if (x < h->mu) return 1.0;
+
+ for (k = 0; k < h->K; k++)
+ srv += h->q[k] * esl_exp_surv(x, h->mu, h->lambda[k]);
+ return srv;
+}
+
+
+/* Function: esl_hxp_logsurv()
+ *
+ * Purpose: Returns the log survivor function $\log P(X > x)$ (log(1-CDF))
+ * for quantile <x>, given hyperexponential parameters <h>.
+ */
+double
+esl_hxp_logsurv(double x, ESL_HYPEREXP *h)
+{
+ int k;
+
+ if (x < h->mu) return 0.0;
+
+ for (k = 0; k < h->K; k++)
+ if (h->q[k] == 0.0)
+ h->wrk[k] = -eslINFINITY;
+ else
+ h->wrk[k] = log(h->q[k]) + esl_exp_logsurv(x, h->mu, h->lambda[k]);
+
+ return esl_vec_DLogSum(h->wrk, h->K);
+}
+
+/* Function: esl_hxp_invcdf()
+ *
+ * Purpose: Calculates the inverse CDF for a hyperexponential <h>
+ * returning the quantile <x> at which the CDF is <p>.
+ *
+ * The inverse CDF of a mixture model has no
+ * analytical expression as far as I'm aware. The calculation
+ * here is a computationally expensive, brute force bisection
+ * search in <x> using the CDF function. It will suffice for
+ * a small number of calls (for plotting applications, for example),
+ * but it is not sufficient for a large number of calls.
+ */
+double
+esl_hxp_invcdf(double p, ESL_HYPEREXP *h)
+{
+ double x1, x2, xm; /* low, high guesses at x */
+ double f2, fm;
+ double tol = 1e-6;
+
+ x1 = h->mu;
+ x2 = h->mu + 1.;
+ do { /* bracket */
+ x2 = x2 + 2.*(x2-x1);
+ f2 = esl_hxp_cdf(x2, h);
+ } while (f2 < p);
+
+ do { /* bisection */
+ xm = (x1+x2) / 2.;
+ fm = esl_hxp_cdf(xm, h);
+
+ if (fm > p) x2 = xm;
+ else if (fm < p) x1 = xm;
+ else return xm; /* unlikely case of fm==cdf */
+ } while ( (x2-x1)/(x1+x2-2*h->mu) > tol);
+
+ xm = (x1+x2) / 2.;
+ return xm;
+
+}
+/*-------------------- end densities & distributions ------------------------*/
+
+
+
+
+/****************************************************************************
+ * 3. Generic API routines: for general interface w/ histogram module
+ ****************************************************************************/
+
+/* Function: esl_hxp_generic_pdf()
+ *
+ * Purpose: Generic-API version of PDF call.
+ */
+double
+esl_hxp_generic_pdf(double x, void *params)
+{
+ ESL_HYPEREXP *h = (ESL_HYPEREXP *) params;
+ return esl_hxp_pdf(x, h);
+}
+
+/* Function: esl_hxp_generic_cdf()
+ *
+ * Purpose: Generic-API version of CDF call.
+ */
+double
+esl_hxp_generic_cdf(double x, void *params)
+{
+ ESL_HYPEREXP *h = (ESL_HYPEREXP *) params;
+ return esl_hxp_cdf(x, h);
+}
+
+/* Function: esl_hxp_generic_surv()
+ *
+ * Purpose: Generic-API version of survivor function.
+ */
+double
+esl_hxp_generic_surv(double x, void *params)
+{
+ ESL_HYPEREXP *h = (ESL_HYPEREXP *) params;
+ return esl_hxp_surv(x, h);
+}
+
+/* Function: esl_hxp_generic_invcdf()
+ *
+ * Purpose: Generic-API version of inverse CDF.
+ */
+double
+esl_hxp_generic_invcdf(double p, void *params)
+{
+ ESL_HYPEREXP *h = (ESL_HYPEREXP *) params;
+ return esl_hxp_invcdf(p, h);
+}
+/*------------------------ end generic API ---------------------------------*/
+
+
+
+
+
+
+/****************************************************************************
+ * 4. Dumping plots for files
+ ****************************************************************************/
+
+/* Function: esl_hxp_Plot()
+ *
+ * Purpose: Plot some function <func> (for instance, <esl_hxp_pdf()>)
+ * for hyperexponential parameters <h>, for a range of
+ * quantiles x from <xmin> to <xmax> in steps of <xstep>;
+ * output to an open stream <fp> in xmgrace XY input format.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error.
+ */
+int
+esl_hxp_Plot(FILE *fp, ESL_HYPEREXP *h,
+ double (*func)(double x, ESL_HYPEREXP *h),
+ double xmin, double xmax, double xstep)
+{
+ double x;
+ for (x = xmin; x <= xmax; x += xstep)
+ if (fprintf(fp, "%f\t%g\n", x, (*func)(x, h)) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "hyperexp plot write failed");
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "hyperexp plot write failed");
+ return eslOK;
+}
+/*-------------------- end plot dumping routines ---------------------------*/
+
+
+
+
+
+/****************************************************************************
+ * 5. Sampling (requires augmentation w/ random module)
+ ****************************************************************************/
+#ifdef eslAUGMENT_RANDOM
+/* Function: esl_hxp_Sample()
+ *
+ * Purpose: Sample a random variate x from a hyperexponential <h>,
+ * given random number source <r>.
+ */
+double
+esl_hxp_Sample(ESL_RANDOMNESS *r, ESL_HYPEREXP *h)
+{
+ int k;
+ k = esl_rnd_DChoose(r, h->q, h->K);
+ return esl_exp_Sample(r, h->mu, h->lambda[k]);
+}
+#endif /*eslAUGMENT_RANDOM*/
+/*--------------------------- end sampling ---------------------------------*/
+
+
+
+/****************************************************************************
+ * 6. File input (mixture models are a little too complex to set on commandline)
+ ****************************************************************************/
+#ifdef eslAUGMENT_FILEPARSER
+/* Function: esl_hyperexp_Read()
+ *
+ * Purpose: Reads hyperexponential parameters from an open <e>.
+ * which is an <ESL_FILEPARSER> tokenizer for an open stream.
+ *
+ * The first token is <K>, the number of mixture components.
+ * The second token is <mu>, the x offset shared by all components.
+ * Then for each mixture component <k=1..K>, it reads
+ * a mixture coefficient <q[k]> and a decay parameter
+ * <lambda[k]>.
+ *
+ * The <2K+2> data tokens must occur in this order, but
+ * they can be grouped into any number of lines, because the
+ * parser ignores line breaks.
+ *
+ * Anything after a <\#> character on a line is a comment, and
+ * is ignored.
+ *
+ * Returns: <eslOK> on success, and <ret_hxp> points to a new <ESL_HYPEREXP>
+ * object.
+ * <eslEFORMAT> on "normal" parse failure caused by a bad file
+ * format that's likely the user's fault.
+ *
+ * Throws: <eslEMEM> if allocation of the new <ESL_HYPEREXP> fails.
+ *
+ *
+ * FIXME: All our mixture models (esl_dirichlet, for example) should be
+ * reconciled w/ identical interfaces & behaviour.
+ */
+int
+esl_hyperexp_Read(ESL_FILEPARSER *e, ESL_HYPEREXP **ret_hxp)
+{
+ ESL_HYPEREXP *hxp = NULL;
+ char *tok;
+ int status = eslOK;
+ int nc;
+ int k;
+ double sum;
+
+ esl_fileparser_SetCommentChar(e, '#');
+
+ if ((status = esl_fileparser_GetToken(e, &tok, NULL)) != eslOK) goto ERROR;
+ nc = atoi(tok);
+ if (nc < 1) {
+ sprintf(e->errbuf, "Expected # of components K >= 1 as first token");
+ goto ERROR;
+ }
+
+ if ((hxp = esl_hyperexp_Create(nc)) == NULL) return eslEMEM; /* percolation */
+
+ if ((status = esl_fileparser_GetToken(e, &tok, NULL)) != eslOK) goto ERROR;
+ hxp->mu = atof(tok);
+
+ for (k = 0; k < hxp->K; k++)
+ {
+ if ((status = esl_fileparser_GetToken(e, &tok, NULL)) != eslOK) goto ERROR;
+ hxp->q[k] = atof(tok);
+
+ if ((status = esl_fileparser_GetToken(e, &tok, NULL)) != eslOK) goto ERROR;
+ hxp->lambda[k] = atof(tok);
+
+ if (hxp->q[k] < 0. || hxp->q[k] > 1.) {
+ sprintf(e->errbuf, "Expected a mixture coefficient q[k], 0<=q[k]<=1");
+ goto ERROR;
+ }
+ if (hxp->lambda[k] <= 0.) {
+ sprintf(e->errbuf, "Expected a lambda parameter, lambda>0");
+ goto ERROR;
+ }
+ }
+ sum = esl_vec_DSum(hxp->q, hxp->K);
+ if (fabs(sum-1.0) > 0.05) {
+ sprintf(e->errbuf, "Expected mixture coefficients to sum to 1");
+ goto ERROR;
+ }
+ esl_vec_DNorm(hxp->q, hxp->K);
+ *ret_hxp = hxp;
+ return eslOK;
+
+ ERROR:
+ esl_hyperexp_Destroy(hxp);
+ return eslEFORMAT;
+}
+
+/* Function: esl_hyperexp_ReadFile()
+ *
+ * Purpose: Convenience wrapper around <esl_hyperexp_Read()> that takes
+ * a filename as an argument, instead of an open <ESL_FILEPARSER>.
+ *
+ * This lets you quickly read an object from a file, but it
+ * limits your ability to deal gracefully and flexibly with
+ * 'normal' errors like 'file not found' or 'bad file format'.
+ * Here, all errors are fatal.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on an allocation failure.
+ *
+ * <eslEFORMAT> on any parse error. Diagnostic information is
+ * unavailable, because the <ESL_FILEPARSER> that's holding
+ * that information is internal to this function.
+ *
+ * <eslENOTFOUND> on any failure to open the file.
+ */
+int
+esl_hyperexp_ReadFile(char *filename, ESL_HYPEREXP **ret_hxp)
+{
+ FILE *fp;
+ ESL_FILEPARSER *e;
+ int status;
+
+ if ((fp = fopen(filename, "r")) == NULL)
+ ESL_EXCEPTION(eslENOTFOUND, "file not found");
+
+ if ((e = esl_fileparser_Create(fp)) == NULL) {
+ fclose(fp);
+ ESL_EXCEPTION(eslEMEM, "failed to create fileparser");
+ }
+ esl_fileparser_SetCommentChar(e, '#');
+
+ status = esl_hyperexp_Read(e, ret_hxp);
+
+ esl_fileparser_Destroy(e);
+ fclose(fp);
+ return status;
+}
+#endif /*eslAUGMENT_FILEPARSER*/
+
+
+
+
+
+
+
+/****************************************************************************
+ * 7. ML fitting to complete data
+ ****************************************************************************/
+#ifdef eslAUGMENT_MINIMIZER
+/* This structure is used to sneak the data into minimizer's generic
+ * (void *) API for all aux data
+ */
+struct hyperexp_data {
+ double *x;
+ int n;
+ ESL_HYPEREXP *h;
+};
+
+/* Given hyperexponential parameters in <h>;
+ * do appropriate c.o.v.'s to unconstrained real parameters
+ * and fill in the packed parameter vector <p>.
+ *
+ * <p> must be allocated for at least (2K-1) doubles: K-1 mixture
+ * coefficients and K lambda parameters. (mu is not a free param).
+ *
+ * First K-1 are $Q_1..Q_{K-1}$ mixture coefficient parameters; $Q_0$ implicitly 0;
+ * cov is $q_k = \frac{e^{Q_k}}{\sum_j e^{Q_j}}$; $Q_k = \log(q_k) - \log(q_0)$.
+ * Then K lambda params;
+ * lambda cov is $\lambda = e^w$, $w = \log(\lambda)$.
+ */
+static void
+hyperexp_pack_paramvector(double *p, int np, ESL_HYPEREXP *h)
+{
+ int i; /* counter in parameter vector p */
+ int k; /* counter in mixture components */
+ double z; /* tmp variable */
+
+ /* mixture coefficients */
+ i = 0;
+ if (! h->fixmix) {
+ z = log(h->q[0]);
+ for (k = 1; k < h->K; k++)
+ p[i++] = log(h->q[k]) - z;
+ }
+
+ /* exponential parameters */
+ for (k = 0; k < h->K; k++)
+ if (! h->fixlambda[k])
+ p[i++] = log(h->lambda[k]);
+}
+
+/* Same as above but in reverse: given parameter vector <p>,
+ * <np> = 2K-1, do appropriate c.o.v. back to desired parameter space, and
+ * update the hyperexponential <h>.
+ */
+static void
+hyperexp_unpack_paramvector(double *p, int np, ESL_HYPEREXP *h)
+{
+ int i; /* counter in parameter vector p */
+ int k; /* counter in mixture components */
+ double z; /* tmp variable */
+
+ /* Fetch the params in their c.o.v. space first
+ */
+ i = 0;
+ if (! h->fixmix) {
+ h->q[0] = 0; /* implicitly */
+ for (k = 1; k < h->K; k++)
+ h->q[k] = p[i++];
+ }
+ for (k = 0; k < h->K; k++)
+ if (! h->fixlambda[k])
+ h->lambda[k] = p[i++];
+
+ /* Convert mix coefficients back to probabilities;
+ * their c.o.v. is q_k = e^{Q_k} / \sum_k e^{Q_k}
+ * which rearranges to exp(Q_k - log[\sum_k e^Q_k]),
+ * and we have the DLogSum() function to compute the log sum.
+ */
+ if (! h->fixmix) {
+ z = esl_vec_DLogSum(h->q, h->K);
+ for (k = 0; k < h->K; k++)
+ h->q[k] = exp(h->q[k] - z);
+ }
+
+ /* lambda c.o.v. is \lambda = e^w */
+ for (k = 0; k < h->K; k++)
+ if (! h->fixlambda[k])
+ h->lambda[k] = exp(h->lambda[k]);
+}
+
+/* The log likelihood function to be optimized by ML fitting:
+ * This needs to be careful of a case where a lambda = inf.
+ */
+static double
+hyperexp_complete_func(double *p, int np, void *dptr)
+{
+ struct hyperexp_data *data = (struct hyperexp_data *) dptr;
+ ESL_HYPEREXP *h = data->h;
+ double logL = 0.;
+ int i;
+
+ hyperexp_unpack_paramvector(p, np, h);
+ for (i = 0; i < data->n; i++)
+ logL += esl_hxp_logpdf(data->x[i], h);
+ return -logL;
+}
+
+/* The gradient of the NLL w.r.t. each free parameter in p.
+ */
+static void
+hyperexp_complete_gradient(double *p, int np, void *dptr, double *dp)
+{
+ struct hyperexp_data *data = (struct hyperexp_data *) dptr;
+ ESL_HYPEREXP *h = data->h;
+ double pdf;
+ int i,k;
+ int pidx;
+
+ hyperexp_unpack_paramvector(p, np, h);
+ esl_vec_DSet(dp, np, 0.);
+ for (i = 0; i < data->n; i++)
+ {
+ /* FIXME: I think the calculation below may need to be done
+ * in log space, to avoid underflow errors; see complete_binned_gradient()
+ */
+ /* Precalculate q_k PDF_k(x) terms, and their sum */
+ for (k = 0; k < h->K; k++)
+ h->wrk[k] = h->q[k] * esl_exp_pdf(data->x[i], h->mu, h->lambda[k]);
+ pdf = esl_vec_DSum(h->wrk, h->K);
+
+ pidx = 0;
+ if (! h->fixmix) {
+ for (k = 1; k < h->K; k++) /* generic d/dQ solution for mixture models */
+ dp[pidx++] -= h->wrk[k]/pdf - h->q[k];
+ }
+
+ for (k = 0; k < h->K; k++)
+ if (! h->fixlambda[k])
+ dp[pidx++] -= (1.-h->lambda[k]*(data->x[i]-h->mu))*h->wrk[k]/pdf; /* d/dw */
+ }
+}
+
+
+/* Function: esl_hxp_FitGuess()
+ *
+ * Purpose: Given a sorted vector of <n> observed data samples <x[]>,
+ * from smallest <x[0]> to largest <x[n-1]>, calculate a
+ * very crude guesstimate of a fit -- suitable only as a starting
+ * point for further optimization -- and return those parameters
+ * in <h>.
+ *
+ * Assigns $q_k \propto \frac{1}{k}$ and $\mu = \min_i x_i$;
+ * splits $x$ into $K$ roughly equal-sized bins, and
+ * and assigns $\lambda_k$ as the ML estimate from bin $k$.
+ * (If $q_k$ coefficients have already been fixed to
+ * known values, this step is skipped.)
+ */
+int
+esl_hxp_FitGuess(double *x, int n, ESL_HYPEREXP *h)
+{
+ double tmu; /* current mu */
+ double mean; /* mean (x-tmu) in a bin */
+ int i,k;
+ int imin, imax;
+
+ h->mu = x[0]; /* minimum */
+ for (k = 0; k < h->K; k++)
+ {
+ if (! h->fixmix)
+ h->q[k] = 1 / (double)(k+1); /* priors ~ 1, 1/2, 1/3... */
+
+ imin = (int) ((double)(k*n)/(double)h->K);
+ imax = (int) ((double)((k+1)*n)/(double)h->K);
+ tmu = x[imin];
+ mean = 0.;
+ for (i = imin; i < imax; i++)
+ mean += x[i] - tmu;
+ mean /= (double)(imax-imin);
+ h->lambda[k] = 1 / mean;
+ }
+ esl_vec_DNorm(h->q, h->K);
+ return eslOK;
+}
+
+/* Function: esl_hxp_FitComplete()
+ *
+ * Purpose: Given a vector of <n> observed data samples <x[]>
+ * (sorted or unsorted), and an initial guess <h> for
+ * a hyperexponential, find maximum likelihood parameters
+ * by conjugate gradient descent optimization, starting
+ * from <h> and leaving the final optimized solution in
+ * <h>.
+ *
+ * Returns: <eslOK> on success, and <h> contains the fitted
+ * hyperexponential parameters.
+ *
+ * Throws: <eslEMEM> on allocation error, and <h> is left in
+ * in its initial state.
+ */
+int
+esl_hxp_FitComplete(double *x, int n, ESL_HYPEREXP *h)
+{
+ struct hyperexp_data data;
+ int status;
+ double *p = NULL;
+ double *u = NULL;
+ double *wrk = NULL;
+ double tol;
+ int np;
+ double fx;
+ int i;
+
+ tol = 1e-6;
+
+ /* Determine number of free parameters and allocate
+ */
+ np = 0;
+ if (! h->fixmix) np += h->K-1; /* K-1 mix coefficients... */
+ for (i = 0; i < h->K; i++) /* ...and up to K lambdas free */
+ if (! h->fixlambda[i]) np++;
+ ESL_ALLOC(p, sizeof(double) * np);
+ ESL_ALLOC(u, sizeof(double) * np);
+ ESL_ALLOC(wrk, sizeof(double) * np * 4);
+
+ /* Copy shared info into the "data" structure
+ */
+ data.x = x;
+ data.n = n;
+ data.h = h;
+
+ /* From h, create the parameter vector.
+ */
+ hyperexp_pack_paramvector(p, np, h);
+
+ /* Define the step size vector u.
+ */
+ for (i = 0; i < np; i++) u[i] = 1.0;
+
+ /* Feed it all to the mighty optimizer.
+ */
+ status = esl_min_ConjugateGradientDescent(p, u, np,
+ &hyperexp_complete_func,
+ &hyperexp_complete_gradient,
+ (void *) (&data), tol, wrk, &fx);
+ if (status != eslOK) goto ERROR;
+
+ /* Convert the final parameter vector back to a hyperexponential
+ */
+ hyperexp_unpack_paramvector(p, np, h);
+
+ free(p);
+ free(u);
+ free(wrk);
+ esl_hyperexp_SortComponents(h);
+ return eslOK;
+
+ ERROR:
+ if (p != NULL) free(p);
+ if (u != NULL) free(u);
+ if (wrk != NULL) free(wrk);
+ return status;
+}
+
+
+/****************************************************************************
+ * 8. Maximum likelihood fitting, complete binned data xref STL9/143-144
+ ****************************************************************************/
+#ifdef eslAUGMENT_HISTOGRAM
+/* minimizer API only allows us one generic void ptr to pass
+ * our data through:
+ */
+struct hyperexp_binned_data {
+ ESL_HISTOGRAM *g;
+ ESL_HYPEREXP *h;
+};
+
+static double
+hyperexp_complete_binned_func(double *p, int np, void *dptr)
+{
+ struct hyperexp_binned_data *data = (struct hyperexp_binned_data *) dptr;
+ ESL_HISTOGRAM *g = data->g;
+ ESL_HYPEREXP *h = data->h;
+ double logL = 0.;
+ double ai, delta;
+ int i,k;
+
+ hyperexp_unpack_paramvector(p, np, h);
+ delta = g->w;
+ /* counting over occupied, uncensored histogram bins */
+ for (i = g->cmin; i <= g->imax; i++)
+ {
+ if (g->obs[i] == 0) continue; /* skip unoccupied ones */
+
+ ai = esl_histogram_Bin2LBound(g, i);
+ if (ai < h->mu) ai = h->mu; /* careful about the left boundary: no x < h->mu */
+
+ for (k = 0; k < h->K; k++)
+ {
+ h->wrk[k] = log(h->q[k]) - h->lambda[k]*(ai-h->mu);
+ if (delta * h->lambda[k] < eslSMALLX1)
+ h->wrk[k] += log(delta * h->lambda[k]);
+ else
+ h->wrk[k] += log(1 - exp(-delta * h->lambda[k]));
+ }
+ logL += g->obs[i] * esl_vec_DLogSum(h->wrk, h->K);
+ }
+ return -logL;
+}
+
+static void
+hyperexp_complete_binned_gradient(double *p, int np, void *dptr, double *dp)
+{
+ struct hyperexp_binned_data *data = (struct hyperexp_binned_data *) dptr;
+ ESL_HISTOGRAM *g = data->g;
+ ESL_HYPEREXP *h = data->h;
+ int i,k;
+ int pidx;
+ double z;
+ double tmp;
+ double ai, delta;
+
+ hyperexp_unpack_paramvector(p, np, h);
+ esl_vec_DSet(dp, np, 0.);
+ delta = g->w;
+
+ /* counting over occupied, uncensored histogram bins */
+ for (i = g->cmin; i <= g->imax; i++)
+ {
+ if (g->obs[i] == 0) continue;
+ ai = esl_histogram_Bin2LBound(g, i);
+ if (ai < h->mu) ai = h->mu; /* careful about the left boundary: no x < h->mu */
+
+ /* Calculate log (q_m alpha_m(a_i) terms
+ */
+ for (k = 0; k < h->K; k++)
+ {
+ h->wrk[k] = log(h->q[k]) - h->lambda[k]*(ai-h->mu);
+ if (delta * h->lambda[k] < eslSMALLX1)
+ h->wrk[k] += log(delta * h->lambda[k]);
+ else
+ h->wrk[k] += log(1 - exp(-delta * h->lambda[k]));
+ }
+ z = esl_vec_DLogSum(h->wrk, h->K); /* z= log \sum_k q_k alpha_k(a_i) */
+
+ /* Bump the gradients for Q_1..Q_{K-1} */
+ pidx = 0;
+ if (! h->fixmix) {
+ for (k = 1; k < h->K; k++)
+ dp[pidx++] -= g->obs[i] * (exp(h->wrk[k] - z) - h->q[k]);
+ }
+
+ /* Bump the gradients for w_0..w_{K-1}
+ */
+ for (k = 0; k < h->K; k++)
+ if (! h->fixlambda[k])
+ {
+ tmp = log(h->q[k]) + log(h->lambda[k])- h->lambda[k]*(ai-h->mu);
+ tmp = exp(tmp - z);
+ tmp *= (ai + delta - h->mu) * exp(-delta * h->lambda[k]) - (ai - h->mu);
+ dp[pidx++] -= g->obs[i] * tmp;
+ }
+ }
+}
+
+/* Function: esl_hxp_FitGuessBinned()
+ *
+ * Purpose: Given a histogram <g> with binned observations;
+ * obtain a very crude guesstimate of a fit -- suitable only
+ * as a starting point for further optimization -- and return
+ * those parameters in <h>.
+ *
+ * Assigns $q_k \propto \frac{1}{k}$ and $\mu = \min_i x_i$;
+ * splits $x$ into $K$ roughly equal-sized bins, and
+ * and assigns $\lambda_k$ as the ML estimate from bin $k$.
+ * If the coefficients have already been set to known values,
+ * this step is skipped.
+ */
+int
+esl_hxp_FitGuessBinned(ESL_HISTOGRAM *g, ESL_HYPEREXP *h)
+{
+ double sum;
+ int n;
+ int i,k;
+ int nb;
+ double ai;
+
+ if (g->is_tailfit) h->mu = g->phi; /* all x > mu in this case */
+ else if (g->is_rounded) h->mu = esl_histogram_Bin2LBound(g, g->imin);
+ else h->mu = g->xmin;
+
+ nb = g->imax - g->cmin + 1;
+ k = h->K-1;
+ sum = 0;
+ n = 0;
+ for (i = g->imax; i >= g->cmin; i--)
+ {
+ ai = esl_histogram_Bin2LBound(g,i);
+ if (ai < g->xmin) ai = g->xmin;
+ n += g->obs[i];
+ sum += g->obs[i] * ai;
+
+ if (i == g->cmin + (k*nb)/h->K)
+ h->lambda[k--] = 1 / ((sum/(double) n) - ai);
+ }
+
+ if (! h->fixmix) {
+ for (k = 0; k < h->K; k++)
+ h->q[k] = 1 / (double) h->K;
+ }
+
+ return eslOK;
+}
+
+
+/* Function: esl_hxp_FitCompleteBinned()
+ *
+ * Purpose: Given a histogram <g> with binned observations, where each
+ * bin i holds some number of observed samples x with values from
+ * lower bound l to upper bound u (that is, $l < x \leq u$),
+ * and given a starting guess <h> for hyperexponential parameters;
+ *
+ * Find maximum likelihood parameters <h> by conjugate gradient
+ * descent, starting from the initial <h> and leaving the
+ * optimized solution in <h>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error, and <h> is left in its
+ * initial state.
+ */
+int
+esl_hxp_FitCompleteBinned(ESL_HISTOGRAM *g, ESL_HYPEREXP *h)
+{
+ struct hyperexp_binned_data data;
+ int status;
+ double *p = NULL;
+ double *u = NULL;
+ double *wrk = NULL;
+ double fx;
+ int i;
+ double tol = 1e-6;
+ int np;
+
+ np = 0;
+ if (! h->fixmix) np = h->K-1; /* K-1 mix coefficients... */
+ for (i = 0; i < h->K; i++) /* ...and up to K lambdas free. */
+ if (! h->fixlambda[i]) np++;
+
+ ESL_ALLOC(p, sizeof(double) * np);
+ ESL_ALLOC(u, sizeof(double) * np);
+ ESL_ALLOC(wrk, sizeof(double) * np * 4);
+
+ /* Copy shared info into the "data" structure */
+ data.g = g;
+ data.h = h;
+
+ /* From h, create the parameter vector. */
+ hyperexp_pack_paramvector(p, np, h);
+
+ /* Define the step size vector u.
+ */
+ for (i = 0; i < np; i++) u[i] = 1.0;
+
+ /* Feed it all to the mighty optimizer.
+ */
+ status = esl_min_ConjugateGradientDescent(p, u, np,
+ &hyperexp_complete_binned_func,
+ &hyperexp_complete_binned_gradient,
+ (void *) (&data), tol, wrk, &fx);
+ if (status != eslOK) goto ERROR;
+
+ /* Convert the final parameter vector back to a hyperexponential
+ */
+ hyperexp_unpack_paramvector(p, np, h);
+
+ free(p);
+ free(u);
+ free(wrk);
+ esl_hyperexp_SortComponents(h);
+ return eslOK;
+
+ ERROR:
+ if (p != NULL) free(p);
+ if (u != NULL) free(u);
+ if (wrk != NULL) free(wrk);
+ return status;
+}
+#endif /*eslAUGMENT_HISTOGRAM*/
+#endif /*eslAUGMENT_MINIMIZER*/
+/*--------------------------- end fitting ----------------------------------*/
+
+
+
+
+
+
+/****************************************************************************
+ * 9. Test driver
+ ****************************************************************************/
+#ifdef eslHYPEREXP_TESTDRIVE
+/* Compile:
+ gcc -g -Wall -I. -I ~/src/easel -L ~/src/easel -o test\
+ -DeslHYPEREXP_TESTDRIVE esl_hyperexp.c -leasel -lm
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_hyperexp.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_HISTOGRAM *h;
+ ESL_RANDOMNESS *r;
+ ESL_HYPEREXP *hxp;
+ ESL_HYPEREXP *ehxp;
+ int n = 20000;
+ double binwidth = 0.1;
+ int i;
+ double x;
+ double *data;
+ int ndata;
+ int k, ek, mink;
+ double mindiff, diff;
+
+ int opti;
+ int be_verbose = FALSE;
+ char *paramfile = NULL;
+ char *plotfile = NULL;
+ FILE *pfp = stdout;
+ int plot_pdf = FALSE;
+ int plot_logpdf = FALSE;
+ int plot_cdf = FALSE;
+ int plot_logcdf = FALSE;
+ int plot_surv = FALSE;
+ int plot_logsurv = FALSE;
+ int xmin_set = FALSE;
+ double xmin;
+ int xmax_set = FALSE;
+ double xmax;
+ int xstep_set = FALSE;
+ double xstep;
+ int do_fixmix = FALSE;
+ int status;
+
+ for (opti = 1; opti < argc && *(argv[opti]) == '-'; opti++)
+ {
+ if (strcmp(argv[opti], "-f") == 0) do_fixmix = TRUE;
+ else if (strcmp(argv[opti], "-i") == 0) paramfile = argv[++opti];
+ else if (strcmp(argv[opti], "-n") == 0) n = atoi(argv[++opti]);
+ else if (strcmp(argv[opti], "-o") == 0) plotfile = argv[++opti];
+ else if (strcmp(argv[opti], "-v") == 0) be_verbose = TRUE;
+ else if (strcmp(argv[opti], "-w") == 0) binwidth = atof(argv[++opti]);
+ else if (strcmp(argv[opti], "-C") == 0) plot_cdf = TRUE;
+ else if (strcmp(argv[opti], "-LC") == 0) plot_logcdf = TRUE;
+ else if (strcmp(argv[opti], "-P") == 0) plot_pdf = TRUE;
+ else if (strcmp(argv[opti], "-LP") == 0) plot_logpdf = TRUE;
+ else if (strcmp(argv[opti], "-S") == 0) plot_surv = TRUE;
+ else if (strcmp(argv[opti], "-LS") == 0) plot_logsurv = TRUE;
+ else if (strcmp(argv[opti], "-XL") == 0) { xmin_set = TRUE; xmin = atof(argv[++opti]); }
+ else if (strcmp(argv[opti], "-XH") == 0) { xmax_set = TRUE; xmax = atof(argv[++opti]); }
+ else if (strcmp(argv[opti], "-XS") == 0) { xstep_set = TRUE; xstep = atof(argv[++opti]); }
+ else esl_fatal("bad option");
+ }
+
+ if (paramfile != NULL)
+ {
+ status = esl_hyperexp_ReadFile(paramfile, &hxp);
+ if (status == eslENOTFOUND) esl_fatal("Param file %s not found", paramfile);
+ else if (status == eslEFORMAT) esl_fatal("Parse failed: param file %s invalid format", paramfile);
+ else if (status != eslOK) esl_fatal("Unusual failure opening param file %s", paramfile);
+ }
+ else
+ {
+ hxp = esl_hyperexp_Create(3);
+ hxp->mu = -2.0;
+ hxp->q[0] = 0.5; hxp->q[1] = 0.3; hxp->q[2] = 0.2;
+ hxp->lambda[0] = 1.0; hxp->lambda[1] = 0.3; hxp->lambda[2] = 0.1;
+ }
+ if (do_fixmix) esl_hyperexp_FixedUniformMixture(hxp); /* overrides q's above */
+
+ if (be_verbose) esl_hyperexp_Dump(stdout, hxp);
+
+ r = esl_randomness_Create(42);
+ h = esl_histogram_CreateFull(hxp->mu, 100., binwidth);
+ if (plotfile != NULL) {
+ if ((pfp = fopen(plotfile, "w")) == NULL)
+ esl_fatal("Failed to open plotfile");
+ }
+ if (! xmin_set) xmin = hxp->mu;
+ if (! xmax_set) xmax = hxp->mu+ 20*(1. / esl_vec_DMin(hxp->lambda, hxp->K));
+ if (! xstep_set) xstep = 0.1;
+
+ for (i = 0; i < n; i++)
+ {
+ x = esl_hxp_Sample(r, hxp);
+ esl_histogram_Add(h, x);
+ }
+
+ esl_histogram_GetData(h, &data, &ndata); /* get sorted data vector */
+
+ ehxp = esl_hyperexp_Create(hxp->K);
+ if (do_fixmix) esl_hyperexp_FixedUniformMixture(ehxp);
+ esl_hxp_FitGuess(data, ndata, ehxp);
+ if ( esl_hxp_FitComplete(data, ndata, ehxp) != eslOK) esl_fatal("Failed to fit hyperexponential");
+
+ if (be_verbose) esl_hyperexp_Dump(stdout, ehxp);
+
+ if (fabs( (ehxp->mu-hxp->mu)/hxp->mu ) > 0.01)
+ esl_fatal("Error in (complete) fitted mu > 1%\n");
+ for (ek = 0; ek < ehxp->K; ek++)
+ { /* try to match each estimated lambda up to a parametric lambda */
+ mindiff = 1.0;
+ mink = -1;
+ for (k = 0; k < hxp->K; k++)
+ {
+ diff = fabs( (ehxp->lambda[ek] - hxp->lambda[k]) / hxp->lambda[k]);
+ if (diff < mindiff) {
+ mindiff = diff;
+ mink = k;
+ }
+ }
+ if (mindiff > 0.50)
+ esl_fatal("Error in (complete) fitted lambda > 50%\n");
+ if (fabs( (ehxp->q[ek] - hxp->q[mink]) / hxp->q[mink]) > 1.0)
+ esl_fatal("Error in (complete) fitted q > 2-fold%\n");
+ }
+
+ esl_hxp_FitGuessBinned(h, ehxp);
+ if ( esl_hxp_FitCompleteBinned(h, ehxp) != eslOK) esl_fatal("Failed to fit binned hyperexponential");
+ if (be_verbose) esl_hyperexp_Dump(stdout, ehxp);
+
+ if (fabs( (ehxp->mu-hxp->mu)/hxp->mu ) > 0.01)
+ esl_fatal("Error in (binned) fitted mu > 1%\n");
+ for (ek = 0; ek < ehxp->K; ek++)
+ { /* try to match each estimated lambda up to a parametric lambda */
+ mindiff = 1.0;
+ mink = -1;
+ for (k = 0; k < hxp->K; k++)
+ {
+ diff = fabs( (ehxp->lambda[ek] - hxp->lambda[k]) / hxp->lambda[k]);
+ if (diff < mindiff) {
+ mindiff = diff;
+ mink = k;
+ }
+ }
+ if (mindiff > 0.50)
+ esl_fatal("Error in (binned) fitted lambda > 50%\n");
+ if (fabs( (ehxp->q[ek] - hxp->q[mink]) / hxp->q[mink]) > 1.0)
+ esl_fatal("Error in (binned) fitted q > 2-fold\n");
+ }
+
+ if (plot_pdf) esl_hxp_Plot(pfp, hxp, &esl_hxp_pdf, xmin, xmax, xstep);
+ if (plot_logpdf) esl_hxp_Plot(pfp, hxp, &esl_hxp_logpdf, xmin, xmax, xstep);
+ if (plot_cdf) esl_hxp_Plot(pfp, hxp, &esl_hxp_cdf, xmin, xmax, xstep);
+ if (plot_logcdf) esl_hxp_Plot(pfp, hxp, &esl_hxp_logcdf, xmin, xmax, xstep);
+ if (plot_surv) esl_hxp_Plot(pfp, hxp, &esl_hxp_surv, xmin, xmax, xstep);
+ if (plot_logsurv) esl_hxp_Plot(pfp, hxp, &esl_hxp_logsurv, xmin, xmax, xstep);
+
+ if (plotfile != NULL) fclose(pfp);
+ esl_histogram_Destroy(h);
+ esl_hyperexp_Destroy(hxp);
+ esl_hyperexp_Destroy(ehxp);
+ esl_randomness_Destroy(r);
+ return 0;
+}
+#endif /*eslHYPEREXP_TESTDRIVE*/
+
+/****************************************************************************
+ * Example main()
+ ****************************************************************************/
+#ifdef eslHYPEREXP_EXAMPLE
+/*::cexcerpt::hyperexp_example::begin::*/
+/* compile:
+ gcc -g -Wall -I. -o example -DeslHYPEREXP_EXAMPLE\
+ -DeslAUGMENT_HISTOGRAM -DeslAUGMENT_RANDOM -DeslAUGMENT_MINIMIZER\
+ esl_hyperexp.c esl_exponential.c esl_histogram.c esl_random.c esl_minimizer.c\
+ esl_stats.c esl_vectorops.c easel.c -lm
+ * run: ./example
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_hyperexp.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_RANDOMNESS *r; /* source of random numbers */
+ ESL_HISTOGRAM *h; /* histogram to store the data */
+ ESL_HYPEREXP *hxp; /* hyperexponential to sample from */
+ ESL_HYPEREXP *ehxp; /* estimated hyperexponential */
+ double x; /* sampled data point */
+ int n = 100000; /* number of samples */
+ double *data;
+ int ndata;
+ int i;
+
+ hxp = esl_hyperexp_Create(3);
+ hxp->mu = -2.0;
+ hxp->q[0] = 0.6; hxp->q[1] = 0.3; hxp->q[2] = 0.1;
+ hxp->lambda[0] = 1.0; hxp->lambda[1] = 0.3; hxp->lambda[2] = 0.1;
+
+ r = esl_randomness_Create(0);
+ h = esl_histogram_CreateFull(hxp->mu, 100, 1.0);
+
+ for (i = 0; i < n; i++)
+ {
+ x = esl_hxp_Sample(r, hxp);
+ esl_histogram_Add(h, x);
+ }
+ esl_histogram_GetData(h, &data, &ndata);
+
+ /* Plot the empirical (sampled) and expected survivals */
+ esl_histogram_PlotSurvival(stdout, h);
+ esl_hxp_Plot(stdout, hxp, &esl_hxp_surv, h->xmin, h->xmax, 0.1);
+
+ /* ML fit to complete data, and plot fitted survival curve */
+ ehxp = esl_hyperexp_Create(3);
+ esl_hxp_FitGuess(data, ndata, ehxp);
+ esl_hxp_FitComplete(data, ndata, ehxp);
+ esl_hxp_Plot(stdout, ehxp, &esl_hxp_surv, h->xmin, h->xmax, 0.1);
+
+ /* ML fit to binned data, plot fitted survival curve */
+ esl_hxp_FitGuessBinned(h, ehxp);
+ esl_hxp_FitCompleteBinned(h, ehxp);
+ esl_hxp_Plot(stdout, ehxp, &esl_hxp_surv, h->xmin, h->xmax, 0.1);
+
+ esl_randomness_Destroy(r);
+ esl_histogram_Destroy(h);
+ esl_hyperexp_Destroy(hxp);
+ esl_hyperexp_Destroy(ehxp);
+ return 0;
+}
+/*::cexcerpt::hyperexp_example::end::*/
+#endif /*eslHYPEREXP_EXAMPLE*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
+
diff --git a/esl_hyperexp.h b/esl_hyperexp.h
new file mode 100644
index 0000000..7e06aff
--- /dev/null
+++ b/esl_hyperexp.h
@@ -0,0 +1,75 @@
+/* Hyperexponential (mixture exponential) distributions.
+ *
+ */
+#ifndef eslHYPEREXP_INCLUDED
+#define eslHYPEREXP_INCLUDED
+
+#ifdef eslAUGMENT_RANDOM
+#include <esl_random.h>
+#endif
+#ifdef eslAUGMENT_HISTOGRAM
+#include <esl_histogram.h>
+#endif
+#ifdef eslAUGMENT_FILEPARSER
+#include <esl_fileparser.h>
+#endif
+
+typedef struct {
+ double *q; /* mixture coefficients [0..K-1]*/
+ double *lambda; /* scale params [0..K-1]*/
+ double *wrk; /* tmp K-vector, for logpdf calc */
+ double mu; /* location (x offset) parameter */
+ int K; /* # of components */
+ char *fixlambda; /* TRUE to constrain a lambda val */
+ int fixmix; /* TRUE to constrain the q's */
+} ESL_HYPEREXP;
+
+
+extern ESL_HYPEREXP *esl_hyperexp_Create(int K);
+extern void esl_hyperexp_Destroy(ESL_HYPEREXP *h);
+extern int esl_hyperexp_Copy(ESL_HYPEREXP *src, ESL_HYPEREXP *dest);
+extern int esl_hyperexp_FixedUniformMixture(ESL_HYPEREXP *h);
+extern int esl_hyperexp_SortComponents(ESL_HYPEREXP *h);
+extern int esl_hyperexp_Write(FILE *fp, ESL_HYPEREXP *hxp);
+extern int esl_hyperexp_Dump(FILE *fp, ESL_HYPEREXP *hxp);
+#ifdef eslAUGMENT_FILEPARSER
+extern int esl_hyperexp_Read(ESL_FILEPARSER *ef, ESL_HYPEREXP **ret_hxp);
+extern int esl_hyperexp_ReadFile(char *filename, ESL_HYPEREXP **ret_hxp);
+#endif
+
+extern double esl_hxp_pdf (double x, ESL_HYPEREXP *h);
+extern double esl_hxp_logpdf (double x, ESL_HYPEREXP *h);
+extern double esl_hxp_cdf (double x, ESL_HYPEREXP *h);
+extern double esl_hxp_logcdf (double x, ESL_HYPEREXP *h);
+extern double esl_hxp_surv (double x, ESL_HYPEREXP *h);
+extern double esl_hxp_logsurv(double x, ESL_HYPEREXP *h);
+extern double esl_hxp_invcdf (double p, ESL_HYPEREXP *h);
+
+extern double esl_hxp_generic_pdf (double x, void *params);
+extern double esl_hxp_generic_cdf (double x, void *params);
+extern double esl_hxp_generic_surv (double x, void *params);
+extern double esl_hxp_generic_invcdf(double x, void *params);
+
+extern int esl_hxp_Plot(FILE *fp, ESL_HYPEREXP *h,
+ double (*func)(double x, ESL_HYPEREXP *h),
+ double xmin, double xmax, double xstep);
+
+#ifdef eslAUGMENT_RANDOM
+extern double esl_hxp_Sample(ESL_RANDOMNESS *r, ESL_HYPEREXP *h);
+#endif
+#ifdef eslAUGMENT_MINIMIZER
+extern int esl_hxp_FitGuess (double *x, int n, ESL_HYPEREXP *h);
+extern int esl_hxp_FitComplete(double *x, int n, ESL_HYPEREXP *h);
+#ifdef eslAUGMENT_HISTOGRAM
+extern int esl_hxp_FitGuessBinned (ESL_HISTOGRAM *g, ESL_HYPEREXP *h);
+extern int esl_hxp_FitCompleteBinned(ESL_HISTOGRAM *g, ESL_HYPEREXP *h);
+#endif
+#endif
+
+#endif /*eslHYPEREXP_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_hyperexp.tex b/esl_hyperexp.tex
new file mode 100644
index 0000000..9cbd753
--- /dev/null
+++ b/esl_hyperexp.tex
@@ -0,0 +1,37 @@
+
+The hyperexponential (mixture exponential) distribution may be useful
+for fitting fat-tailed empirical distributions.
+
+\subsection{Hyperexponential densities}
+
+The hyperexponential distribution is a mixture of $K$ independent
+exponentials with a common location $\mu$ and different decay
+constants $\lambda_k$.
+
+The probability density function (PDF) is:
+
+\begin{equation}
+P(X=x) = \sum_k^{K} q_k \lambda_k e^{- \lambda_k (x - \mu)}
+\label{eqn:hyperexp_pdf}
+\end{equation}
+
+The cumulative distribution function (CDF) is:
+
+\begin{equation}
+P(X \leq x) = \sum_k^{K} q_k (1 - e^{- \lambda_k (x - \mu)})
+\label{eqn:hyperexp_cdf}
+\end{equation}
+
+Variate $x$ ranges $\mu \leq x < \infty$.
+
+Mixture coefficients $q_k$ specify the prior probability of each
+component $k$; $0 \leq q_k \leq 1$ and $\sum_k q_k = 1$.
+
+The single location parameter $\mu$ is unconstrained, $-\infty < \mu <
+\infty$. (Exponential distributions are usually represented without an
+explicit location parameter, implicitly assuming $\mu = 0$.)
+
+The scale parameters $\lambda_k$ for each component are nonnegative,
+$\lambda_k > 0$.
+
+
diff --git a/esl_keyhash.c b/esl_keyhash.c
new file mode 100644
index 0000000..97cd625
--- /dev/null
+++ b/esl_keyhash.c
@@ -0,0 +1,853 @@
+/* Partial emulation of Perl hashes (associative arrays),
+ * mapping keys (ASCII char strings) to array indices.
+ *
+ * Contents:
+ * 1. The <ESL_KEYHASH> object.
+ * 2. Storing and retrieving keys.
+ * 3. Internal functions.
+ * 4. Benchmark drivers.
+ * 5. Unit tests.
+ * 6. Test driver.
+ * 7. Example.
+ * 8. Copyright and license information.
+ *
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "easel.h"
+#include "esl_mem.h"
+#include "esl_keyhash.h"
+
+static ESL_KEYHASH *keyhash_create(uint32_t hashsize, int init_key_alloc, int init_string_alloc);
+static uint32_t jenkins_hash(const char *key, esl_pos_t n, uint32_t hashsize);
+static int key_upsize(ESL_KEYHASH *kh);
+
+
+/*****************************************************************
+ *# 1. The <ESL_KEYHASH> object
+ *****************************************************************/
+
+/* Function: esl_keyhash_Create()
+ * Synopsis: Allocates a new keyhash.
+ *
+ * Purpose: Create a new hash table for key indexing, and returns
+ * a pointer to it.
+ *
+ * Throws: <NULL> on allocation failure.
+ *
+ * Note: 128*sizeof(int)*3 + 2048*sizeof(char) + sizeof(ESL_KEYHASH):
+ * about 2400 bytes for an initial KEYHASH.
+ */
+ESL_KEYHASH *
+esl_keyhash_Create(void)
+{
+ return keyhash_create(128, /* initial hash table size (power of 2) */
+ 128, /* initial alloc for up to 128 keys */
+ 2048); /* initial alloc for keys totalling up to 2048 chars */
+}
+
+
+/* Function: esl_keyhash_CreateCustom()
+ * Synopsis: Allocate a new keyhash with customized initial allocations.
+ *
+ * Purpose: Create a new hash table, initially allocating for
+ * a hash table of size <hashsize> entries, <kalloc>
+ * keys, and a total key string length of <salloc>.
+ * <hashsize> must be a power of 2, and all allocations
+ * must be $\geq 0$.
+ *
+ * The object will still expand as needed, so the reason to
+ * use a customized allocation is when you're trying to
+ * minimize memory footprint and you expect your keyhash to
+ * be smaller than the default (of up to 128 keys, of total
+ * length up to 2048).
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_KEYHASH *
+esl_keyhash_CreateCustom(uint32_t hashsize, int kalloc, int salloc)
+{
+ ESL_DASSERT1((hashsize && ((hashsize & (hashsize-1)) == 0))); /* hashsize is a power of 2 (bitshifting trickery) */
+ return keyhash_create(hashsize, kalloc, salloc);
+}
+
+/* Function: esl_keyhash_Clone()
+ * Synopsis: Duplicates a keyhash.
+ *
+ * Purpose: Allocates and duplicates a keyhash <kh>. Returns a
+ * pointer to the duplicate.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_KEYHASH *
+esl_keyhash_Clone(const ESL_KEYHASH *kh)
+{
+ ESL_KEYHASH *nw;
+ int h;
+
+ if ((nw = keyhash_create(kh->hashsize, kh->kalloc, kh->salloc)) == NULL) goto ERROR;
+
+ for (h = 0; h < kh->hashsize; h++)
+ nw->hashtable[h] = kh->hashtable[h];
+
+ for (h = 0; h < kh->nkeys; h++)
+ {
+ nw->nxt[h] = kh->nxt[h];
+ nw->key_offset[h] = kh->key_offset[h];
+ }
+ nw->nkeys = kh->nkeys;
+
+ memcpy(nw->smem, kh->smem, sizeof(char) * kh->sn);
+ nw->sn = kh->sn;
+ return nw;
+
+ ERROR:
+ esl_keyhash_Destroy(nw);
+ return NULL;
+}
+
+
+/* Function: esl_keyhash_Get()
+ * Synopsis: Returns a key name, given its index.
+ *
+ * Purpose: Returns a pointer to the key name associated
+ * with index <idx>. The key name is a <NUL>-terminated
+ * string whose memory is managed internally in
+ * the keyhash <kh>.
+ */
+char *
+esl_keyhash_Get(const ESL_KEYHASH *kh, int idx)
+{
+ return kh->smem + kh->key_offset[idx];
+}
+
+/* Function: esl_keyhash_GetNumber()
+ * Synopsis: Returns the total number of keys stored.
+ *
+ * Purpose: Returns the total number of keys currently stored in the
+ * keyhash <kh>.
+ */
+int
+esl_keyhash_GetNumber(const ESL_KEYHASH *kh)
+{
+ return kh->nkeys;
+}
+
+/* Function: esl_keyhash_Sizeof()
+ * Synopsis: Returns the size of a keyhash object, in bytes.
+ */
+size_t
+esl_keyhash_Sizeof(const ESL_KEYHASH *kh)
+{
+ size_t n = 0;
+
+ n += sizeof(ESL_KEYHASH);
+ n += sizeof(int) * kh->hashsize;
+ n += sizeof(int) * kh->kalloc * 2;
+ n += sizeof(char) * kh->salloc;
+ return n;
+}
+
+/* Function: esl_keyhash_Reuse()
+ * Synopsis: Recycle a keyhash.
+ *
+ * Purpose: Empties keyhash <kh> so it can be reused without
+ * creating a new one.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_keyhash_Reuse(ESL_KEYHASH *kh)
+{
+ int i;
+
+ for (i = 0; i < kh->hashsize; i++) kh->hashtable[i] = -1;
+ kh->nkeys = 0;
+ kh->sn = 0;
+ return eslOK;
+}
+
+
+
+/* Function: esl_keyhash_Destroy()
+ * Synopsis: Frees a keyhash.
+ *
+ * Purpose: Destroys <kh>.
+ *
+ * Returns: (void)
+ */
+void
+esl_keyhash_Destroy(ESL_KEYHASH *kh)
+{
+ if (kh == NULL) return;
+ if (kh->hashtable != NULL) free(kh->hashtable);
+ if (kh->key_offset != NULL) free(kh->key_offset);
+ if (kh->nxt != NULL) free(kh->nxt);
+ if (kh->smem != NULL) free(kh->smem);
+ free(kh);
+}
+
+/* Function: esl_keyhash_Dump()
+ * Synopsis: Dumps debugging information about a keyhash.
+ *
+ * Purpose: Mainly for debugging purposes. Dump
+ * some information about the hash table <kh>
+ * to the stream <fp>, which might be stderr
+ * or stdout.
+ */
+void
+esl_keyhash_Dump(FILE *fp, const ESL_KEYHASH *kh)
+{
+ int idx;
+ int h;
+ int nkeys;
+ int nempty = 0;
+ int maxkeys = -1;
+ int minkeys = INT_MAX;
+
+ for (h = 0; h < kh->hashsize; h++)
+ {
+ for (nkeys = 0, idx = kh->hashtable[h]; idx != -1; idx = kh->nxt[idx]) nkeys++;
+
+ if (nkeys == 0) nempty++;
+ if (nkeys > maxkeys) maxkeys = nkeys;
+ if (nkeys < minkeys) minkeys = nkeys;
+ }
+
+ fprintf(fp, "Total keys: %d\n", kh->nkeys);
+ fprintf(fp, "Hash table size: %d\n", kh->hashsize);
+ fprintf(fp, "Average occupancy: %.2f\n", (float) kh->nkeys /(float) kh->hashsize);
+ fprintf(fp, "Unoccupied slots: %d\n", nempty);
+ fprintf(fp, "Most in one slot: %d\n", maxkeys);
+ fprintf(fp, "Least in one slot: %d\n", minkeys);
+ fprintf(fp, "Keys allocated for: %d\n", kh->kalloc);
+ fprintf(fp, "Key string space alloc: %d\n", kh->salloc);
+ fprintf(fp, "Key string space used: %d\n", kh->sn);
+ fprintf(fp, "Total obj size, bytes: %d\n", (int) esl_keyhash_Sizeof(kh));
+}
+/*--------------- end, <ESL_KEYHASH> object ---------------------*/
+
+
+
+
+/*****************************************************************
+ *# 2. Storing and retrieving keys
+ *****************************************************************/
+
+/* Function: esl_keyhash_Store()
+ * Synopsis: Store a key and get a key index for it.
+ *
+ * Purpose: Store a string <key> of length <n> in the key index hash table <kh>.
+ * Associate it with a unique key index, counting from
+ * 0. It's this index that lets us map the hashed keys to
+ * integer-indexed C arrays, clumsily emulating Perl's
+ * hashes. Optionally returns the index through <opt_index>.
+ *
+ * <key>, <n> follow the standard idiom for strings and
+ * unterminated buffers.
+ *
+ * Returns: <eslOK> on success; stores <key> in <kh>; <opt_index> is
+ * returned, set to the next higher index value.
+ * Returns <eslEDUP> if <key> was already stored in the table;
+ * <opt_index> is set to the existing index for <key>.
+ *
+ * Throws: <eslEMEM> on allocation failure, and sets <opt_index> to -1.
+ */
+int
+esl_keyhash_Store(ESL_KEYHASH *kh, const char *key, esl_pos_t n, int *opt_index)
+{
+ uint32_t val = jenkins_hash(key, n, kh->hashsize);
+ int idx;
+ int status;
+
+ if (n == -1) n = strlen(key);
+
+ /* Was this key already stored? */
+ for (idx = kh->hashtable[val]; idx != -1; idx = kh->nxt[idx])
+ if (esl_memstrcmp(key, n, kh->smem + kh->key_offset[idx]))
+ {
+ if (opt_index != NULL) *opt_index = idx;
+ return eslEDUP;
+ }
+
+ /* Reallocate key ptr/index memory if needed */
+ if (kh->nkeys == kh->kalloc)
+ {
+ ESL_REALLOC(kh->key_offset, sizeof(int)*kh->kalloc*2);
+ ESL_REALLOC(kh->nxt, sizeof(int)*kh->kalloc*2);
+ kh->kalloc *= 2;
+ }
+
+ /* Reallocate key string memory if needed */
+ while (kh->sn + n + 1 > kh->salloc)
+ {
+ ESL_REALLOC(kh->smem, sizeof(char) * kh->salloc * 2);
+ kh->salloc *= 2;
+ }
+
+ /* Copy the key, assign its index */
+ idx = kh->nkeys;
+ kh->key_offset[idx] = kh->sn;
+ kh->sn += n+1;
+ esl_memstrcpy(key, n, kh->smem + kh->key_offset[idx]);
+ kh->nkeys++;
+
+ /* Insert new element at head of the approp linked list in hashtable */
+ kh->nxt[idx] = kh->hashtable[val];
+ kh->hashtable[val] = idx;
+
+ /* Time to upsize? If we're 3x saturated, expand the hash table */
+ if (kh->nkeys > 3*kh->hashsize)
+ if ((status = key_upsize(kh)) != eslOK) goto ERROR;
+
+ if (opt_index != NULL) *opt_index = idx;
+ return eslOK;
+
+ ERROR:
+ if (opt_index != NULL) *opt_index = -1;
+ return status;
+}
+
+/* Function: esl_keyhash_Lookup()
+ * Synopsis: Look up a key's array index.
+ *
+ * Purpose: Look up a <key> in the hash table <kh>.
+ * If <key> is found, return <eslOK>, and optionally set <*opt_index>
+ * to its array index (0..nkeys-1).
+ * If <key> is not found, return <eslENOTFOUND>, and
+ * optionally set <*opt_index> to -1.
+ */
+int
+esl_keyhash_Lookup(const ESL_KEYHASH *kh, const char *key, esl_pos_t n, int *opt_index)
+{
+ uint32_t val = jenkins_hash(key, n, kh->hashsize);
+ int idx;
+
+ for (idx = kh->hashtable[val]; idx != -1; idx = kh->nxt[idx])
+ if (strcmp(key, kh->smem + kh->key_offset[idx]) == 0)
+ {
+ if (opt_index != NULL) *opt_index = idx;
+ return eslOK;
+ }
+
+ if (opt_index != NULL) *opt_index = -1;
+ return eslENOTFOUND;
+}
+
+
+/*---------- end, API for storing/retrieving keys ---------------*/
+
+
+
+
+/*****************************************************************
+ * 3. Internal functions
+ *****************************************************************/
+
+/* keyhash_create()
+ *
+ * The real creation function, which takes arguments for memory sizes.
+ * This is abstracted to a static function because it's used by both
+ * Create() and Clone() but slightly differently.
+ *
+ * Args: hashsize - size of hash table; this must be a power of two.
+ * init_key_alloc - initial allocation for # of keys.
+ * init_string_alloc - initial allocation for total size of key strings.
+ *
+ * Returns: An allocated hash table structure; or NULL on failure.
+ */
+ESL_KEYHASH *
+keyhash_create(uint32_t hashsize, int init_key_alloc, int init_string_alloc)
+{
+ ESL_KEYHASH *kh = NULL;
+ int i;
+ int status;
+
+ ESL_ALLOC(kh, sizeof(ESL_KEYHASH));
+ kh->hashtable = NULL;
+ kh->key_offset = NULL;
+ kh->nxt = NULL;
+ kh->smem = NULL;
+
+ kh->hashsize = hashsize;
+ kh->kalloc = init_key_alloc;
+ kh->salloc = init_string_alloc;
+
+ ESL_ALLOC(kh->hashtable, sizeof(int) * kh->hashsize);
+ for (i = 0; i < kh->hashsize; i++) kh->hashtable[i] = -1;
+
+ ESL_ALLOC(kh->key_offset, sizeof(int) * kh->kalloc);
+ ESL_ALLOC(kh->nxt, sizeof(int) * kh->kalloc);
+ for (i = 0; i < kh->kalloc; i++) kh->nxt[i] = -1;
+
+ ESL_ALLOC(kh->smem, sizeof(char) * kh->salloc);
+ kh->nkeys = 0;
+ kh->sn = 0;
+ return kh;
+
+ ERROR:
+ esl_keyhash_Destroy(kh);
+ return NULL;
+}
+
+
+/* jenkins_hash()
+ *
+ * The hash function.
+ * This is Bob Jenkins' "one at a time" hash.
+ * <key> is a NUL-terminated string of any length.
+ * <hashsize> must be a power of 2.
+ *
+ * References:
+ * [1] http://en.wikipedia.org/wiki/Hash_table
+ * [2] http://www.burtleburtle.net/bob/hash/doobs.html
+ */
+static uint32_t
+jenkins_hash(const char *key, esl_pos_t n, uint32_t hashsize)
+{
+ esl_pos_t pos;
+ uint32_t val = 0;
+
+ if (n == -1)
+ { /* string version */
+ for (; *key != '\0'; key++)
+ {
+ val += *key;
+ val += (val << 10);
+ val ^= (val >> 6);
+ }
+ }
+ else
+ { /* buffer version */
+ for (pos = 0; pos < n; pos++)
+ {
+ val += key[pos];
+ val += (val << 10);
+ val ^= (val >> 6);
+ }
+ }
+ val += (val << 3);
+ val ^= (val >> 11);
+ val += (val << 15);
+
+ return (val & (hashsize - 1));
+}
+
+/* key_upsize()
+ *
+ * Grow the hash table to the next available size.
+ *
+ * Args: old - the KEY hash table to reallocate.
+ *
+ * Returns: <eslOK> on success. 'Success' includes the case
+ * where the hash table is already at its maximum size,
+ * and cannot be upsized any more.
+ *
+ * Throws: <eslEMEM> on allocation failure, and
+ * the hash table is left in its initial state.
+ */
+static int
+key_upsize(ESL_KEYHASH *kh)
+{
+ void *p;
+ int i;
+ uint32_t val;
+ int status;
+
+ /* 28 below because we're going to upsize in steps of 8x (2^3); need to be < 2^{31-3} */
+ if (kh->hashsize >= (1<<28)) return eslOK; /* quasi-success (can't grow any more) */
+
+ /* The catch here is that when you upsize the table, all the hash functions
+ * change; so you have to go through all the keys, recompute their hash functions,
+ * and store them again in the new table.
+ */
+ /* Allocate a new, larger hash table. (Don't change <kh> until this succeeds) */
+ ESL_RALLOC(kh->hashtable, p, sizeof(int) * (kh->hashsize << 3));
+ kh->hashsize = kh->hashsize << 3; /* 8x */
+ for (i = 0; i < kh->hashsize; i++) kh->hashtable[i] = -1;
+
+ /* Store all the keys again. */
+ for (i = 0; i < kh->nkeys; i++)
+ {
+ val = jenkins_hash(kh->smem + kh->key_offset[i], -1, kh->hashsize);
+ kh->nxt[i] = kh->hashtable[val];
+ kh->hashtable[val] = i;
+ }
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+/*--------------- end, internal functions -----------------*/
+
+
+/*****************************************************************
+ * 4. Benchmark driver
+ *****************************************************************/
+#ifdef eslKEYHASH_BENCHMARK
+/*
+ gcc -g -O2 -o keyhash_benchmark -I. -L. -DeslKEYHASH_BENCHMARK esl_keyhash.c -leasel -lm
+ time ./keyhash_benchmark /usr/share/dict/words /usr/share/dict/words
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_keyhash.h"
+#include "esl_stopwatch.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <keyfile1> <keyfile2>";
+static char banner[] = "benchmarking speed of keyhash module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 2, argc, argv, banner, usage);
+ ESL_KEYHASH *kh = esl_keyhash_Create();
+ ESL_STOPWATCH *w = esl_stopwatch_Create();
+ char *file1 = esl_opt_GetArg(go, 1);
+ char *file2 = esl_opt_GetArg(go, 2);
+ FILE *fp;
+ char buf[256];
+ char *s, *tok;
+ int idx;
+ int nstored, nsearched, nshared;
+
+ /* Read/store keys from file 1.
+ */
+ esl_stopwatch_Start(w);
+ if ((fp = fopen(file1, "r")) == NULL)
+ { fprintf(stderr, "couldn't open %s\n", argv[1]); exit(1); }
+ nstored = 0;
+ while (fgets(buf, 256, fp) != NULL)
+ {
+ s = buf;
+ esl_strtok(&s, " \t\r\n", &tok);
+ esl_keyhash_Store(kh, tok, -1, &idx);
+ nstored++;
+ }
+ fclose(fp);
+ printf("Stored %d keys.\n", nstored);
+
+ /* Look up keys from file 2.
+ */
+ if ((fp = fopen(file2, "r")) == NULL)
+ { fprintf(stderr, "couldn't open %s\n", argv[2]); exit(1); }
+ nsearched = nshared = 0;
+ while (fgets(buf, 256, fp) != NULL)
+ {
+ s = buf;
+ esl_strtok(&s, " \t\r\n", &tok);
+
+ if (esl_keyhash_Lookup(kh, tok, -1, &idx) == eslOK) nshared++;
+ nsearched++;
+ }
+ fclose(fp);
+ esl_stopwatch_Stop(w);
+ printf("Looked up %d keys.\n", nsearched);
+ printf("In common: %d keys.\n", nshared);
+ esl_stopwatch_Display(stdout, w, "# CPU Time: ");
+
+ esl_stopwatch_Destroy(w);
+ esl_keyhash_Destroy(kh);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslKEYHASH_BENCHMARK*/
+
+
+
+#ifdef eslKEYHASH_BENCHMARK2
+
+/* Benchmark #2 is a benchmark just of the hash function.
+ * First we read in a bunch of keys from any file, one key per line.
+ * Then we start timing, and compute a hash for each key.
+ */
+
+/* gcc -O2 -o keyhash_benchmark2 -I. -L. -DeslKEYHASH_BENCHMARK2 esl_keyhash.c -leasel -lm
+ * ./keyhash_benchmark2 <keyfile>
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_keyhash.h"
+#include "esl_stats.h"
+#include "esl_stopwatch.h"
+#include "esl_vectorops.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-s", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show statistical test for hash uniformity", 0 },
+ { "-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "be verbose: print hash values for keys", 0 },
+ { "-x", eslARG_INT, "32768", NULL, NULL, NULL, NULL, NULL, "set hash table size to <n>", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <keyfile>";
+static char banner[] = "benchmarking speed of hash function in keyhash module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ ESL_FILEPARSER *efp = NULL;
+ ESL_STOPWATCH *w = esl_stopwatch_Create();
+ ESL_KEYHASH *kh = esl_keyhash_Create();
+ char *keyfile = esl_opt_GetArg(go, 1);
+ uint32_t hashsize = esl_opt_GetInteger(go, "-x");
+ char *key;
+ int keylen;
+ char **karr = NULL;
+ int kalloc;
+ int *ct = NULL;
+ int nkeys;
+ int i;
+ int status;
+ uint32_t (*hashfunc)(const char*,uint32_t) = jenkins_hash;
+
+ /* 1. Store the keys from the file, before starting the benchmark timer. */
+ kalloc = 256;
+ ESL_ALLOC(karr, sizeof(char *) * kalloc);
+
+ if (esl_fileparser_Open(keyfile, NULL, &efp) != eslOK) esl_fatal("Failed to open key file %s\n", keyfile);
+
+ nkeys = 0;
+ while (esl_fileparser_NextLine(efp) == eslOK)
+ {
+ if (esl_fileparser_GetTokenOnLine(efp, &key, &keylen) != eslOK) esl_fatal("Failure in parsing key file\n");
+
+ if (nkeys == kalloc) {
+ void *tmp;
+ ESL_RALLOC(karr, tmp, sizeof(char *) * kalloc * 2);
+ kalloc *= 2;
+ }
+
+ esl_strdup(key, keylen, &(karr[nkeys]));
+ nkeys++;
+ }
+ esl_fileparser_Close(efp);
+ /* and karr[0..nkeys-1] are now the keys. */
+
+
+ /* 2. benchmark hashing the keys. */
+ esl_stopwatch_Start(w);
+ for (i = 0; i < nkeys; i++) (*hashfunc)(karr[i], hashsize);
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "# CPU Time: ");
+
+ /* If user wanted to see the hashes, do that
+ * separately, outside the timing loop.
+ */
+ if (esl_opt_GetBoolean(go, "-v"))
+ {
+ for (i = 0; i < nkeys; i++)
+ printf("%-20s %9d\n", karr[i], (*hashfunc)(karr[i], hashsize));
+ }
+
+ /* Likewise, if user wanted to see statistical uniformity test...
+ */
+ if (esl_opt_GetBoolean(go, "-s"))
+ {
+ double mean, var, X2, pval;
+
+ ESL_ALLOC(ct, sizeof(int) * hashsize);
+ esl_vec_ISet(ct, hashsize, 0);
+ for (i = 0; i < nkeys; i++) ct[(*hashfunc)(karr[i], hashsize)]++;
+
+ esl_stats_IMean(ct, hashsize, &mean, &var);
+ for (X2 = 0.0, i = 0; i < hashsize; i++)
+ X2 += (((double) ct[i] - mean) * ((double) ct[i] - mean)) / mean;
+
+ esl_stats_ChiSquaredTest(hashsize-1, X2, &pval);
+
+ printf("Number of keys: %d\n", nkeys);
+ printf("Hash table size: %d\n", hashsize);
+ printf("Mean hash occupancy: %.2f\n", mean);
+ printf("Minimum: %d\n", esl_vec_IMin(ct, hashsize));
+ printf("Maximum: %d\n", esl_vec_IMax(ct, hashsize));
+ printf("Variance: %.2f\n", var);
+ printf("Chi-squared: %.2f\n", X2);
+ printf("Chi-squared p-value: %.4f\n", pval);
+ }
+
+
+ /* 3. cleanup, exit. */
+ for (i = 0; i < nkeys; i++) free(karr[i]);
+ free(karr);
+ esl_stopwatch_Destroy(w);
+ esl_getopts_Destroy(go);
+ return 0;
+
+ ERROR:
+ return status;
+}
+#endif /*eslKEYHASH_BENCHMARK2*/
+
+
+/*------------------- end, benchmark drivers --------------------*/
+
+
+/*****************************************************************
+ * 5. Unit tests
+ *****************************************************************/
+
+
+/*---------------------- end, unit tests ------------------------*/
+
+/*****************************************************************
+ * 6. Test driver
+ *****************************************************************/
+#ifdef eslKEYHASH_TESTDRIVE
+/* gcc -g -Wall -o test -I. -DeslKEYHASH_TESTDRIVE keyhash.c easel.c
+ * ./test
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include "easel.h"
+#include "esl_keyhash.h"
+
+#define NSTORE 1200
+#define NLOOKUP 1200
+#define KEYLEN 2
+
+int
+main(int argc, char **argv)
+{
+ ESL_KEYHASH *h;
+ char keys[NSTORE+NLOOKUP][KEYLEN+1];
+ int i,j,nk,k42;
+ int nmissed;
+ int status;
+
+ /* Generate 2400 random k=2 keys. 26^2 = 676 possible.
+ * We'll store the first 1200 and search on the remaining
+ * 1200. We're ~1.775x saturated; expect Poisson P(0) = 17% miss
+ * rate on the searches, so we ought to exercise hits and
+ * misses on the lookups.
+ */
+ srand(31);
+ for (i = 0; i < NSTORE+NLOOKUP; i++)
+ {
+ for (j = 0; j < KEYLEN; j++)
+ keys[i][j] = 'a' + (rand() % 26); /* yeah, low-order bits; so sue me */
+ keys[i][j] = '\0';
+ }
+ /* spike a known one in (XX.. at key 42).
+ */
+ for (j = 0; j < KEYLEN; j++)
+ keys[42][j] = 'X';
+
+ h = esl_keyhash_Create();
+ nk = 0;
+ for (i = 0; i < NSTORE; i++)
+ {
+ status = esl_keyhash_Store(h, keys[i], -1, &j);
+ if (status == eslOK) { assert(j==nk); nk++; }
+ else if (status == eslEDUP) { assert(j<nk); }
+ else esl_fatal("store failed.");
+
+ if (i == 42) { k42 = j;} /* remember where key 42 went */
+ }
+ nmissed = 0;
+ for (i = NSTORE; i < NSTORE+NLOOKUP; i++)
+ {
+ if (esl_keyhash_Lookup(h, keys[i], -1, &j) != eslOK) nmissed++;
+ }
+ esl_keyhash_Lookup(h, keys[42], -1, &j);
+ assert(j==k42);
+
+ /*
+ printf("missed %d/%d (%.1f%%)\n", nmissed, NLOOKUP,
+ 100. * (float) nmissed / (float) NLOOKUP);
+ esl_keyhash_Dump(stdout, h);
+ */
+
+ esl_keyhash_Destroy(h);
+ exit (0);
+}
+#endif /*eslKEYHASH_TESTDRIVE*/
+
+/*--------------------- end, test driver ------------------------*/
+
+
+
+/*****************************************************************
+ * 7. Example
+ *****************************************************************/
+#ifdef eslKEYHASH_EXAMPLE
+/*::cexcerpt::keyhash_example::begin::*/
+/* gcc -g -Wall -o keyhash_example -I. -DeslKEYHASH_EXAMPLE esl_keyhash.c easel.c
+ * ./example /usr/share/dict/words /usr/share/dict/words
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_keyhash.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_KEYHASH *h = esl_keyhash_Create();
+ FILE *fp;
+ char buf[256];
+ char *s, *tok;
+ int idx;
+ int nstored, nsearched, nshared;
+
+ /* Read/store keys from file 1. */
+ if ((fp = fopen(argv[1], "r")) == NULL) esl_fatal("couldn't open %s\n", argv[1]);
+ nstored = 0;
+ while (fgets(buf, 256, fp) != NULL)
+ {
+ s = buf;
+ esl_strtok(&s, " \t\r\n", &tok);
+ esl_keyhash_Store(h, tok, -1, &idx);
+ nstored++;
+ }
+ fclose(fp);
+ printf("Stored %d keys.\n", nstored);
+
+ /* Look up keys from file 2. */
+ if ((fp = fopen(argv[2], "r")) == NULL) esl_fatal("couldn't open %s\n", argv[1]);
+ nsearched = nshared = 0;
+ while (fgets(buf, 256, fp) != NULL)
+ {
+ s = buf;
+ esl_strtok(&s, " \t\r\n", &tok);
+ if (esl_keyhash_Lookup(h, tok, -1, &idx) == eslOK) nshared++;
+ nsearched++;
+ }
+ fclose(fp);
+ printf("Looked up %d keys.\n", nsearched);
+ printf("In common: %d keys.\n", nshared);
+ esl_keyhash_Destroy(h);
+ return 0;
+}
+/*::cexcerpt::keyhash_example::end::*/
+#endif /*eslKEYHASH_EXAMPLE*/
+/*----------------------- end, example --------------------------*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_keyhash.h b/esl_keyhash.h
new file mode 100644
index 0000000..afa4508
--- /dev/null
+++ b/esl_keyhash.h
@@ -0,0 +1,64 @@
+/* Storing keys in hash tables, similar to Perl's associative arrays.
+ *
+ */
+#ifndef eslKEYHASH_INCLUDED
+#define eslKEYHASH_INCLUDED
+
+#include <stdio.h> /* for FILE */
+
+/* ESL_KEYHASH:
+ * a dynamically resized hash structure;
+ * contains a hash table and associated data
+ *
+ * Each key string is associated with an index i = (0..nkeys-1).
+ * Key strings are stored in one array, in smem.
+ * Each key has an offset in this array, key_offset[i].
+ * Thus key number <i> is at: smem + key_offset[i].
+ *
+ * The keys are hashed, and stored in linked lists in
+ * a hashtable by their index i = (0..nkeys-1), with -1
+ * as a sentinel for end-of-list.
+ *
+ * hashtable[0..hashsize-1] = head of linked list;
+ * index of first elem in list (0..nkeys-1),
+ * or -1 if empty.
+ * nxt[0..nkeys-1] = next elem in list (0..nkeys-1), or -1 if none.
+ *
+ * Thus a typical loop, looking for a <key>:
+ * uint32_t val = jenkins_hash(key, kh->hashsize);
+ * for (i = kh->hashtable[val]; i != -1; i = kh->nxt[i])
+ * if (strcmp(key, kh->smem + kh->key_offset[i]) == 0) found_it;
+ *
+ */
+typedef struct {
+ int *hashtable; /* hashtable[0..hashsize-1] = index of first elem, or -1 */
+ uint32_t hashsize; /* size of the hash table */
+
+ int *key_offset; /* key [idx=0..nkeys-1] starts at smem + key_offset[idx] */
+ int *nxt; /* nxt [idx=0..nkeys-1], next "pointers" in hash table */
+ int nkeys; /* number of keys stored */
+ int kalloc; /* number of keys allocated for */
+
+ char *smem; /* Array of memory for storing key strings (w/ \0's) */
+ int salloc; /* current allocated size of <key_mem> */
+ int sn; /* current used size of key strings, inclusive \0's */
+} ESL_KEYHASH;
+
+extern ESL_KEYHASH *esl_keyhash_Create(void);
+extern ESL_KEYHASH *esl_keyhash_CreateCustom(uint32_t hashsize, int kalloc, int salloc);
+extern ESL_KEYHASH *esl_keyhash_Clone(const ESL_KEYHASH *kh);
+extern char * esl_keyhash_Get(const ESL_KEYHASH *kh, int idx);
+extern int esl_keyhash_GetNumber(const ESL_KEYHASH *kh);
+extern size_t esl_keyhash_Sizeof(const ESL_KEYHASH *kh);
+extern int esl_keyhash_Reuse(ESL_KEYHASH *kh);
+extern void esl_keyhash_Destroy(ESL_KEYHASH *kh);
+extern void esl_keyhash_Dump(FILE *fp, const ESL_KEYHASH *kh);
+
+extern int esl_keyhash_Store ( ESL_KEYHASH *kh, const char *key, esl_pos_t n, int *ret_index);
+extern int esl_keyhash_Lookup(const ESL_KEYHASH *kh, const char *key, esl_pos_t n, int *ret_index);
+
+
+#endif /* eslKEYHASH_INCLUDED */
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_keyhash.tex b/esl_keyhash.tex
new file mode 100644
index 0000000..8fc9560
--- /dev/null
+++ b/esl_keyhash.tex
@@ -0,0 +1,89 @@
+
+The \eslmod{keyhash} module provides a semblance of associative arrays
+(for example, Perl hashes), by associating keywords with an integer
+array index, and storing the association in an internal hash table for
+rapid access.
+
+Table~\ref{tbl:keyhash_api} lists the functions in the
+\eslmod{keyhash} API. The module implements one object: the
+\ccode{ESL\_KEYHASH}.
+
+% Table generated by autodoc -t esl_keyhash.c (so don't edit here, edit esl_keyhash.c:)
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\apisubhead{The \ccode{ESL\_KEYHASH} object}\\
+\hyperlink{func:esl_keyhash_Create()}{\ccode{esl\_keyhash\_Create()}} & Allocates a new keyhash.\\
+\hyperlink{func:esl_keyhash_Clone()}{\ccode{esl\_keyhash\_Clone()}} & Duplicates a keyhash.\\
+\hyperlink{func:esl_keyhash_Get()}{\ccode{esl\_keyhash\_Get()}} & Returns a key name, given its index.\\
+\hyperlink{func:esl_keyhash_GetNumber()}{\ccode{esl\_keyhash\_GetNumber()}} & Returns the total number of keys stored.\\
+\hyperlink{func:esl_keyhash_Reuse()}{\ccode{esl\_keyhash\_Reuse()}} & Reuse a keyhash.\\
+\hyperlink{func:esl_keyhash_Destroy()}{\ccode{esl\_keyhash\_Destroy()}} & Frees a keyhash.\\
+\hyperlink{func:esl_keyhash_Dump()}{\ccode{esl\_keyhash\_Dump()}} & Dumps debugging information about a keyhash.\\
+\apisubhead{Storing and retrieving keys }\\
+\hyperlink{func:esl_keyhash_Store()}{\ccode{esl\_key\_Store()}} & Store a key and get a key index for it.\\
+\hyperlink{func:esl_keyhash_Lookup()}{\ccode{esl\_key\_Lookup()}} & Look up a key's array index.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{keyhash} API.}
+\label{tbl:keyhash_api}
+\end{table}
+
+\subsection{Example of using the keyhash API}
+
+The idea behind using the keyhash module is shown in this fragment of
+pseudocode:
+
+\begin{cchunk}
+ #include "easel.h"
+ #include "esl_keyhash.h"
+
+ ESL_KEYHASH *kh = esl_keyhash_Create();
+ int idx;
+ char *key;
+ esl_pos_t keylen;
+
+ /* To store keys: */
+ (foreach key) {
+ esl_keyhash_Store(hash, key, keylen, &idx);
+ (reallocate foo, bar as needed)
+ foo[idx] = whatever;
+ bar[idx] = whatever;
+ }
+ /* To look up keys: */
+ (foreach key) {
+ if (esl_keyhash_Lookup(hash, key, keylen, &idx) != eslOK) { no_such_key; }
+ (do something with) foo[idx];
+ (do something with) bar[idx];
+ }
+ esl_keyhash_Destroy();
+\end{cchunk}
+
+That is, the application maintains data in normal C-style arrays that
+are indexed by an integer index value, and it uses the keyhash to
+associate a specific key with that integer index. To store info, you
+first store the keyword and obtain a new index value (this simply
+starts at 0 and counts up, as you store successive keys), then you
+store the info your arrays at that index. To look up info, you look up
+the keyword to obtain the index, then you access the info by indexing
+into your arrays.
+
+This is the moral equivalent of Perl's associative arrays, as in
+\ccode{\$foo\{\$key\} = whatever; \$bar\{\$key\} = whatever}.
+
+For example, Figure~\ref{fig:keyhash_example} is a contrived example
+of storing the keywords obtained from a list in one file, then looking
+up keywords listed in a second file. It doesn't demonstrate the idea
+of using the index to store and retrieve additional info associated
+with the keyword, but it demonstrates the essentials of the
+\eslmod{keyhash} API.
+
+\begin{figure}
+\input{cexcerpts/keyhash_example}
+\caption{Example of using the \eslmod{keyhash} API.}
+\label{fig:keyhash_example}
+\end{figure}
+
diff --git a/esl_mem.c b/esl_mem.c
new file mode 100644
index 0000000..931abe9
--- /dev/null
+++ b/esl_mem.c
@@ -0,0 +1,825 @@
+/* str*()-like functions for raw memory "lines" (non-NUL terminated strings).
+ *
+ * Especially when we're parsing input in an ESL_BUFFER, we need to be
+ * able to parse non-writable raw memory buffers. Because an
+ * ESL_BUFFER may have memory mapped a file, we cannot assume that the
+ * input is NUL-terminated, and we can't even assume it's writable (so
+ * we can't NUL-terminate it ourselves). These functions provide
+ * a set of utilities for parsing raw memory (in terms of a char * pointer
+ * and a length in bytes; <char *p>, <esl_pos_t n> by convention).
+ *
+ * Contents:
+ * 1. The esl_mem*() API.
+ * 2. Unit tests.
+ * 3. Test driver.
+ * 4. Copyright and license.
+ */
+
+#include "esl_config.h"
+
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+
+/*****************************************************************
+ *# 1. The esl_mem*() API.
+ *****************************************************************/
+
+/* Function: esl_mem_strtoi32()
+ * Synopsis: Convert a chunk of text memory to an int32_t.
+ *
+ * Purpose: Convert the text starting at <p> to an <int32_t>, converting
+ * no more than <n> characters (the valid length of non-<NUL>
+ * terminated memory buffer <p>). Interpret the text as
+ * base <base> (2 or 10, for example). <base> must be 2..36,
+ * or 0. 0 is treated specially as base 8, 10, or 16, autodetected
+ * according to the leading characters of the number format.
+ *
+ * Any leading whitespace is skipped. The next letter may
+ * be a '-' for a negative number. If <base> is 0 or 16,
+ * the next two characters may be "0x", in which case hex base
+ * 16 is assumed. Else if <base> is 0 and the next
+ * character is '0', octal base 8 is assumed. All subsequent
+ * characters are converted to a number, until an invalid
+ * character is reached. Upper or lower case letters are
+ * accepted, starting at A or a, for bases over 10. For
+ * example, In base 16, characters A-F or a-f are accepted.
+ * The base of the representation is limited to 36 because
+ * 'Z' or 'z' represents 35.
+ *
+ * The converted value is optionally returned in <*opt_val>.
+ * The number of characters parsed (up to the first invalid
+ * character, or <n>, whichever comes first) is optionally
+ * returned in <*opt_nc>. The caller can reposition a parser
+ * to <p + *opt_nc> to exactly skip past the parsed number.
+ *
+ * If no valid digit is found (including pathological cases
+ * of leader-only, such as "0x" or "-"), then return <eslEINVAL>,
+ * and <*opt_nc> and <*opt_val> are both 0.
+ *
+ * This syntax is essentially identical to <strtol()>,
+ * except that we can operate on a non-NUL-terminated
+ * memory buffer of maximum length <n>, rather than on a
+ * NUL-terminated string.
+ *
+ * Args: p - pointer to text buffer to convert to int32_t
+ * n - maximum number of chars to parse in <p>: p[0..n-1] are valid.
+ * base - integer base. Often 10, 2, 8, or 16. Must be
+ * <2..36>, or 0. 0 means base 8, 10, or 16 depending on
+ * autodetected format.
+ * *opt_nc - optRETURN: number of valid chars parsed from p.
+ * First invalid char is p[*opt_nc].
+ * *opt_val - optRETURN: parsed value.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEFORMAT> if no valid integer digits are found. Now
+ * <*opt_val> and <*opt_nc> are 0.
+ *
+ * <eslERANGE> on an overflow error. In this case
+ * <*opt_val> is <INT32_MAX> or <INT32_MIN> for an
+ * overflow or underflow, respectively. <*opt_nc> is
+ * set to the number of characters parsed INCLUDING
+ * the digit that caused the overflow.
+ *
+ * Throws: <eslEINVAL> if <base> isn't in range <0..36>. Now
+ * <*opt_nc> and <*opt_val> are 0.
+ *
+ * Note: An example of why you need this instead of
+ * strtol(): suppose you've mmap()'ed a file to memory,
+ * and it ends in ... "12345". You can't strtol the
+ * end of the mmap'ed memory buffer because it is not
+ * a NUL-terminated string. (Same goes anywhere in the file,
+ * though elsewhere in the file you could overwrite
+ * a NUL where you need it. At EOF of an mmap'ed() buffer,
+ * you can't even do that.)
+ *
+ * sscanf() doesn't work either - I don't see a way to
+ * limit it to a buffer of at most <n> chars.
+ *
+ * I could copy <p> to a temporary allocated string that I
+ * NUL-terminate, then use strtol() or suchlike, but that's
+ * just as awful as what I've done here (rewriting
+ * strtol()). Plus, here I get complete control of the integer
+ * type (<int32_t>) whereas strtol() gives me the less satisfying
+ * <long>.
+ */
+int
+esl_mem_strtoi32(char *p, esl_pos_t n, int base, int *opt_nc, int32_t *opt_val)
+{
+ esl_pos_t i = 0;
+ int32_t sign = 1;
+ int32_t currval = 0;
+ int32_t digit = 0;
+ int ndigits = 0;
+
+ if (base < 0 || base == 1 || base > 36) ESL_EXCEPTION(eslEINVAL, "base must be 2..36 or 0");
+ while (i < n && isspace(p[i])) i++; /* skip leading whitespace */
+ if (i < n && p[i] == '-') { sign = -1; i++; }
+
+ if ((base == 0 || base == 16) && i < n-1 && p[i] == '0' && p[i+1] == 'x')
+ { i += 2; base = 16; }
+ else if (base == 0 && i < n && p[i] == '0')
+ { i += 1; base = 8; }
+ else if (base == 0)
+ { base = 10; }
+
+ for (ndigits = 0; i < n; i++, ndigits++)
+ {
+ if (isdigit(p[i])) digit = p[i] - '0';
+ else if (isupper(p[i])) digit = 10 + (p[i] - 'A');
+ else if (islower(p[i])) digit = 10 + (p[i] - 'a');
+ else break;
+ if (digit >= base) break;
+
+ if (sign == 1)
+ {
+ if (currval > (INT32_MAX - digit) / base)
+ {
+ if (opt_val) *opt_val = INT32_MAX;
+ if (opt_nc) *opt_nc = i+1;
+ return eslERANGE;
+ }
+ currval = currval * base + digit;
+ }
+ else
+ {
+ if (currval < (INT32_MIN + digit) / base)
+ {
+ if (opt_val) *opt_val = INT32_MIN;
+ if (opt_nc) *opt_nc = i+1;
+ return eslERANGE;
+ }
+ currval = currval * base - digit;
+ }
+ }
+ if (opt_nc) { *opt_nc = (ndigits ? i : 0); }
+ if (opt_val) { *opt_val = currval; }
+ return (ndigits ? eslOK : eslEFORMAT);
+}
+
+/* Function: esl_memnewline()
+ * Synopsis: Find next newline in memory.
+ *
+ * Purpose: Given a memory buffer <*m> of <n> bytes, delimit a
+ * next line by finding the next newline character(s).
+ * Store the number of bytes in the line (exclusive of
+ * the newline character(s)) in <*ret_nline>. Store
+ * the number of bytes in the newline in <*ret_nterm>.
+ *
+ * If no newline is found, <nline=n> and <nterm=0>, and the
+ * return status is <eslEOD>.
+ *
+ * Currently we assume newlines are either UNIX-style \verb+\n+
+ * or Windows-style \verb+\r\n+, in this implementation.
+ *
+ * Caller should not rely on this, though. Caller may only
+ * assume that a newline is an arbitrary one- or two-byte
+ * code.
+ *
+ * For example, if <*m> = \verb+"line one\r\nline two"+, <nline>
+ * is 8 and <nterm> is 2. If <*m> = \verb+"try two\ntry three"+,
+ * <nline> is 7 and <nterm> is 1. If <*m> = "attempt
+ * four", <nline> is 12 and <nterm> is 0.
+ *
+ * In cases where the caller may have an incompletely read
+ * buffer, it should be careful of cases where one possible
+ * newline may be a prefix of another; for example, suppose
+ * a file has \verb+"line one\r\nline two"+, but we only input the
+ * buffer \verb+"line one\r"+ at first. The \verb+"\r"+ looks like an old
+ * MacOS newline. Now we read more input, and we think the
+ * buffer is \verb+"\nline two"+. Now we think the \verb+"\n"+ is a UNIX
+ * newline. The result is that we read two newlines where
+ * there's only one. Instead, caller should check for the
+ * case of nterm==1 at the end of its buffer, and try to
+ * extend the buffer. See <esl_buffer_GetLine()> for an
+ * example.
+ *
+ * Args: m - ptr to memory buffer
+ * n - length of p in bytes
+ * *ret_nline - length of line found starting at p[0], exclusive of newline; up to n
+ * *ret_nterm - # of bytes in newline code: 1 or 2, or 0 if no newline found
+ *
+ * Returns: <eslOK> on success. Now <*ret_nline> is the number of
+ * bytes in the next line (exclusive of newline) and
+ * <*ret_nterm> is the number of bytes in the newline code
+ * (1 or 2). Thus the next line is <m[0..nline-1]>, and
+ * the line after this starts at <m[nline+nterm]>.
+ *
+ * <eslEOD> if no newline is found. Now <*ret_nline> is <n>,
+ * and <*ret_nterm> is 0.
+ *
+ * Xref: http://en.wikipedia.org/wiki/Newline
+ */
+int
+esl_memnewline(const char *m, esl_pos_t n, esl_pos_t *ret_nline, int *ret_nterm)
+{
+ char *ptr = memchr(m, '\n', n);
+ if (ptr == NULL) { *ret_nline = n; *ret_nterm = 0; }
+ else if (ptr > m && *(ptr-1) == '\r') { *ret_nline = ptr-m-1; *ret_nterm = 2; }
+ else { *ret_nline = ptr-m; *ret_nterm = 1; }
+ return eslOK;
+}
+
+/* Function: esl_memtok()
+ * Synopsis: Get next delimited token from a line.
+ *
+ * Purpose: Given references to a line and its length, <*p> and <*n>,
+ * find the next token delimited by any of the characters
+ * in the string <delim>. Set <*ret_tok> to point at the
+ * start of the token, and <*ret_toklen> to its length.
+ * Increment <*p> to point to the next non-delim character
+ * that follows, and decrement <*n> by the same,
+ * so that <*p> and <*n> are ready for another
+ * call to <esl_memtok()>.
+ *
+ * Three differences between <esl_strtok()> and <esl_memtok()>:
+ * first, <esl_strtok()> expects a NUL-terminated string,
+ * whereas <esl_memtok()>'s line does not need to be
+ * NUL-terminated; second, <esl_memtok()> does not modify
+ * the string, whereas <esl_strtok()> writes NUL bytes
+ * to delimit tokens; third, <esl_memtok()> skips trailing
+ * <delim> characters as well as leading ones.
+ *
+ * Args: *p - pointer to line;
+ * will be incremented to next byte after token.
+ * *n - pointer to line length, in bytes;
+ * will be decremented
+ * delim - delimiter chars (example: " \t\r\n")
+ * *ret_tok - RETURN: ptr to token found in <*p>
+ * *ret_toklen - RETURN: length of token
+ *
+ * Returns: <eslOK> if a delimited token is found.
+ * <eslEOL> if not; now <*ret_tok> is <NULL> and <*ret_toklen> is <0>.
+ *
+ */
+int
+esl_memtok(char **p, esl_pos_t *n, const char *delim, char **ret_tok, esl_pos_t *ret_toklen)
+{
+ char *s = *p;
+ esl_pos_t so, xo, eo;
+
+ for (so = 0; so < *n; so++) if (strchr(delim, s[so]) == NULL) break;
+ for (xo = so; xo < *n; xo++) if (strchr(delim, s[xo]) != NULL) break;
+ for (eo = xo; eo < *n; eo++) if (strchr(delim, s[eo]) == NULL) break;
+
+ if (so == *n) { *ret_tok = NULL; *ret_toklen = 0; return eslEOL; }
+ else { *p += eo; *n -= eo; *ret_tok = s + so; *ret_toklen = xo - so; return eslOK; }
+}
+
+
+/* Function: esl_memspn()
+ * Synopsis: Finds length of prefix consisting only of given chars
+ *
+ * Purpose: For line <p> of length <n>, return the length of
+ * a prefix that consists only of characters in the
+ * string <allow>.
+ *
+ * A commonly used idiom for "buffer is all whitespace"
+ * is <esl_memspn(p, n, " \t\r\n") == n>.
+ */
+esl_pos_t
+esl_memspn(char *p, esl_pos_t n, const char *allow)
+{
+ esl_pos_t so;
+ for (so = 0; so < n; so++) if (strchr(allow, p[so]) == NULL) break;
+ return so;
+}
+
+/* Function: esl_memcspn()
+ * Synopsis: Finds length of prefix consisting of anything other than given chars
+ *
+ * Purpose: For line <p> of length <n>, return the length of
+ * a prefix that consists only of characters NOT in the
+ * string <disallow>.
+ */
+esl_pos_t
+esl_memcspn(char *p, esl_pos_t n, const char *disallow)
+{
+ esl_pos_t so;
+ for (so = 0; so < n; so++) if (strchr(disallow, p[so]) != NULL) break;
+ return so;
+}
+
+/* Function: esl_memstrcmp()
+ * Synopsis: Compare a memory line and string for equality.
+ *
+ * Purpose: Compare line <p> of length <n> to a NUL-terminated
+ * string <s>, and return TRUE if they are exactly
+ * equal: <strlen(s) == n> and <p[0..n-1] == s[0..n-1]>.
+ * Else, return FALSE.
+ */
+int
+esl_memstrcmp(const char *p, esl_pos_t n, const char *s)
+{
+ esl_pos_t pos;
+
+ if (p == NULL && n == 0 && (s == NULL || s[0] == '\0')) return TRUE;
+ if (!p || !s) return FALSE;
+
+ for (pos = 0; pos < n && s[pos] != '\0'; pos++)
+ if (p[pos] != s[pos]) return FALSE;
+ if (pos != n) return FALSE;
+ if (s[pos] != '\0') return FALSE;
+ return TRUE;
+}
+
+
+/* Function: esl_memstrpfx()
+ * Synopsis: Return TRUE if memory line starts with string.
+ *
+ * Purpose: Compare line <p> of length <n> to a NUL-terminated
+ * string <s>. Return TRUE if the prefix of <p> exactly
+ * matches <s> up to its NUL sentinel byte. Else,
+ * return FALSE.
+ */
+int
+esl_memstrpfx(const char *p, esl_pos_t n, const char *s)
+{
+ esl_pos_t pos;
+
+ if (!p || !s) return FALSE;
+
+ for (pos = 0; pos < n && s[pos] != '\0'; pos++)
+ if (p[pos] != s[pos]) return FALSE;
+ if (s[pos] != '\0') return FALSE;
+ return TRUE;
+}
+
+
+/* Function: esl_memstrcontains()
+ * Synopsis: Return TRUE if memory line matches a string.
+ *
+ * Purpose: Compare line <p> of length <n> to NUL-terminated
+ * string <s>. Return <TRUE> if <p> contains an exact
+ * match to <s> at any position.
+ */
+int
+esl_memstrcontains(const char *p, esl_pos_t n, const char *s)
+{
+ esl_pos_t s0, pos;
+
+ if (! p || ! s) return FALSE;
+ for (s0 = 0; s0 < n; s0++)
+ {
+ for (pos = 0; s0+pos < n && s[pos] != '\0'; pos++)
+ if (p[s0+pos] != s[pos]) break;
+ if (s[pos] == '\0') return TRUE;
+ }
+ return FALSE;
+}
+
+/* Function: esl_memstrdup()
+ * Synopsis: Duplicate a memory line as a NUL-terminated string.
+ *
+ * Purpose: Given memory line <p> of length <n>, duplicate it
+ * as a NUL-terminated string; return the new string
+ * in <*ret_s>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure; now <*ret_s> is <NULL>.
+ */
+int
+esl_memstrdup(const char *p, esl_pos_t n, char **ret_s)
+{
+ char *s = NULL;
+ int status;
+
+ if (! p) { *ret_s = NULL; return eslOK; }
+
+ ESL_ALLOC(s, sizeof(char) * (n+1));
+ memcpy(s, p, n);
+ s[n] = '\0';
+ *ret_s = s;
+ return eslOK;
+
+ ERROR:
+ *ret_s = NULL;
+ return status;
+}
+
+/* Function: esl_memstrcpy()
+ * Synopsis: Copy a memory line as a string.
+ *
+ * Purpose: Given memory line <p> of length <n>, copy
+ * it to <dest> and NUL-terminate it. Caller must
+ * be sure that <dest> is already allocated for
+ * at least <n+1> bytes.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_memstrcpy(const char *p, esl_pos_t n, char *dest)
+{
+ memcpy(dest, p, n);
+ dest[n] = '\0';
+ return eslOK;
+}
+
+
+
+/* Function: esl_memtod()
+ * Synopsis: esl_mem equivalent to strtod().
+ *
+ * Purpose: Given a buffer <p> of length <n>, convert it to a
+ * double-precision floating point value, just as
+ * <strtod()> would do for a NUL-terminated string.
+ *
+ * Returns: <eslOK> on success, and <*ret_val> contains the
+ * converted value.
+ *
+ * Throws: <eslEMEM> on allocation error, and <*ret_val> is 0.
+ */
+int
+esl_memtod(const char *p, esl_pos_t n, double *ret_val)
+{
+ char fixedbuf[128];
+ char *bigbuf = NULL;
+ int status;
+
+ if (n < 128)
+ {
+ memcpy(fixedbuf, p, sizeof(char) * n);
+ fixedbuf[n] = '\0';
+ *ret_val = strtod(fixedbuf, NULL);
+ return eslOK;
+ }
+ else
+ {
+ ESL_ALLOC(bigbuf, sizeof(char) * (n+1));
+ memcpy(bigbuf, p, sizeof(char) * n);
+ bigbuf[n] = '\0';
+ *ret_val = strtod(bigbuf, NULL);
+ free(bigbuf);
+ return eslOK;
+ }
+
+ ERROR:
+ *ret_val = 0.;
+ return status;
+}
+
+/* Function: esl_memtof()
+ * Synopsis: esl_mem equivalent to strtod(), for a float
+ *
+ * Purpose: Given a buffer <p> of length <n>, convert it to a
+ * single-precision floating point value, just as
+ * <strtod()> would do for a NUL-terminated string.
+ *
+ * Returns: <eslOK> on success, and <*ret_val> contains the
+ * converted value.
+ *
+ * Throws: <eslEMEM> on allocation error, and <*ret_val> is 0.
+ */
+int
+esl_memtof(const char *p, esl_pos_t n, float *ret_val)
+{
+ char fixedbuf[128];
+ char *bigbuf = NULL;
+ int status;
+
+ if (n < 128)
+ {
+ memcpy(fixedbuf, p, sizeof(char) * n);
+ fixedbuf[n] = '\0';
+ *ret_val = (float) strtod(fixedbuf, NULL);
+ return eslOK;
+ }
+ else
+ {
+ ESL_ALLOC(bigbuf, sizeof(char) * (n+1));
+ memcpy(bigbuf, p, sizeof(char) * n);
+ bigbuf[n] = '\0';
+ *ret_val = (float) strtod(bigbuf, NULL);
+ free(bigbuf);
+ return eslOK;
+ }
+
+ ERROR:
+ *ret_val = 0.;
+ return status;
+}
+
+
+/* Function: esl_mem_IsReal()
+ * Synopsis: Return TRUE if <p> is a real number; else FALSE.
+ *
+ * Purpose: If the memory <p> of <n> bytes is convertible
+ * to a floating point real number by the rules of
+ * atof(), return TRUE; else return FALSE.
+ *
+ * Xref: easel.c::esl_str_IsReal() for string version.
+ */
+int
+esl_mem_IsReal(const char *p, esl_pos_t n)
+{
+ int gotdecimal = 0;
+ int gotexp = 0;
+ int gotreal = 0;
+
+ if (!p || !n) return FALSE;
+
+ while (n && isspace((int) *p)) { p++; n--; } /* skip leading whitespace */
+ if (n && (*p == '-' || *p == '+')) { p++; n--; } /* skip leading sign */
+
+ /* Examine remainder for garbage. Allowed one '.' and
+ * one 'e' or 'E'; if both '.' and e/E occur, '.'
+ * must be first.
+ */
+ while (n)
+ {
+ if (isdigit((int) (*p))) gotreal++;
+ else if (*p == '.')
+ {
+ if (gotdecimal) return FALSE; /* can't have two */
+ if (gotexp) return FALSE; /* e/E preceded . */
+ else gotdecimal++;
+ }
+ else if (*p == 'e' || *p == 'E')
+ {
+ if (gotexp) return FALSE; /* can't have two */
+ else gotexp++;
+ }
+ else if (isspace((int) (*p))) break;
+ p++;
+ n--;
+ }
+ while (n && isspace((int) *p)) { p++; n--; } /* skip trailing whitespace */
+
+ return ( (n == 0 && gotreal) ? TRUE : FALSE);
+}
+
+/*----------------- end, esl_mem*() API ------------------------*/
+
+
+/*****************************************************************
+ * 2. Benchmark driver.
+ *****************************************************************/
+#ifdef eslMEM_BENCHMARK
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_buffer.h"
+#include "esl_getopts.h"
+#include "esl_stopwatch.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options] <infile>";
+static char banner[] = "benchmark driver for mem module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ ESL_STOPWATCH *w = esl_stopwatch_Create();
+ char *infile = esl_opt_GetArg(go, 1);
+ ESL_BUFFER *bf = NULL;
+ int64_t nlines = 0;
+ int64_t ntokens = 0;
+ int64_t nchar = 0;
+ char *p, *tok;
+ esl_pos_t n, toklen;
+ int status;
+
+ esl_stopwatch_Start(w);
+
+ if ( esl_buffer_Open(infile, NULL, &bf) != eslOK) esl_fatal("open failed");
+ while ( (status = esl_buffer_GetLine(bf, &p, &n)) == eslOK)
+ {
+ nlines++;
+ while ( (status = esl_memtok(&p, &n, " \t", &tok, &toklen)) == eslOK)
+ {
+ ntokens++;
+ nchar += toklen;
+ }
+ if (status != eslEOL) esl_fatal("memtok failure");
+ }
+ if (status != eslEOF) esl_fatal("GetLine failure");
+
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, NULL);
+ printf("lines = %" PRId64 "\n", nlines);
+ printf("tokens = %" PRId64 "\n", ntokens);
+ printf("chars = %" PRId64 "\n", nchar);
+
+ esl_buffer_Close(bf);
+ esl_stopwatch_Destroy(w);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslMEM_BENCHMARK*/
+/*---------------- end, benchmark driver ------------------------*/
+
+/*****************************************************************
+ * 2. Unit tests
+ *****************************************************************/
+#ifdef eslMEM_TESTDRIVE
+
+static void
+utest_mem_strtoi32(void)
+{
+ char msg[] = "esl_mem_strtoi32() unit test failed";
+ int nc;
+ int32_t val;
+ int status;
+
+ if ( (status = esl_mem_strtoi32("-1234", 5, 10, &nc, &val)) != eslOK || nc != 5 || val != -1234) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32("\t -1234", 8, 10, &nc, &val)) != eslOK || nc != 8 || val != -1234) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32("1234", 4, 0, &nc, &val)) != eslOK || nc != 4 || val != 1234) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32("12345", 4, 0, &nc, &val)) != eslOK || nc != 4 || val != 1234) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32(" 0xff", 5, 0, &nc, &val)) != eslOK || nc != 5 || val != 255) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32(" 0777", 4, 0, &nc, &val)) != eslOK || nc != 4 || val != 63) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32("FFGG", 4, 16, &nc, &val)) != eslOK || nc != 2 || val != 255) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32("0xffff", 6, 0, &nc, &val)) != eslOK || nc != 6 || val != 65535) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32("0xffffff", 8, 0, &nc, &val)) != eslOK || nc != 8 || val != 16777215) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32(" 2147483647", 11, 0, &nc, &val)) != eslOK || nc != 11 || val != INT32_MAX) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32("-2147483648", 11, 0, &nc, &val)) != eslOK || nc != 11 || val != INT32_MIN) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32(" 2147483648", 11, 0, &nc, &val)) != eslERANGE || nc != 11 || val != INT32_MAX) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32("-2147483649", 11, 0, &nc, &val)) != eslERANGE || nc != 11 || val != INT32_MIN) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32(" 214748364800", 13, 0, &nc, &val)) != eslERANGE || nc != 11 || val != INT32_MAX) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32("-214748364900", 13, 0, &nc, &val)) != eslERANGE || nc != 11 || val != INT32_MIN) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32(" 0x1234", 3, 16, &nc, &val)) != eslEFORMAT || nc != 0 || val != 0) esl_fatal(msg);
+ if ( (status = esl_mem_strtoi32("09999999", 7, 0, &nc, &val)) != eslEFORMAT || nc != 0 || val != 0) esl_fatal(msg);
+ return;
+}
+
+
+static void
+utest_memtok(void)
+{
+ char msg[] = "esl_memtok() unit test failed";
+ char *teststring;
+ esl_pos_t n;
+ char *s;
+ char *tok;
+ esl_pos_t toklen;
+
+ if (esl_strdup("This is\t a sentence.", -1, &teststring) != eslOK) esl_fatal(msg);
+
+ s = teststring;
+ n = strlen(teststring);
+ if (esl_memtok(&s, &n, " ", &tok, &toklen) != eslOK) esl_fatal(msg);
+ if (toklen != 4) esl_fatal(msg);
+ if (memcmp(tok, "This", toklen) != 0) esl_fatal(msg);
+ if (*s != 'i') esl_fatal(msg);
+
+ if (esl_memtok(&s, &n, " \t", &tok, &toklen) != eslOK) esl_fatal(msg);
+ if (toklen != 2) esl_fatal(msg);
+ if (memcmp(tok, "is", toklen) != 0) esl_fatal(msg);
+ if (*s != 'a') esl_fatal(msg);
+
+ if (esl_memtok(&s, &n, "\n", &tok, &toklen) != eslOK) esl_fatal(msg);
+ if (toklen != 11) esl_fatal(msg);
+ if (memcmp(tok, "a sentence.", toklen) != 0) esl_fatal(msg);
+ if (*s != '\0') esl_fatal(msg);
+ if (n != 0) esl_fatal(msg);
+
+ if (esl_memtok(&s, &n, "\n", &tok, &toklen) != eslEOL) esl_fatal(msg);
+ if (toklen != 0) esl_fatal(msg);
+ if (tok != NULL) esl_fatal(msg);
+
+ free(teststring);
+ return;
+}
+
+
+/* memspn, memcspn() */
+static void
+utest_memspn_memcspn(void)
+{
+ char msg[] = "memspn/memcspn unit test failed";
+ char test1[] = " this is a test";
+ char *p;
+ esl_pos_t n;
+
+ p = test1;
+ n = 13; /* so the memory is " this is a t" */
+ if (esl_memspn (p, n, " \t\n\r") != 2) esl_fatal(msg);
+ if (esl_memcspn(p, n, " \t\n\r") != 0) esl_fatal(msg);
+
+ p = test1+2;
+ n = 11; /* "this is a t" */
+ if (esl_memspn (p, n, " \t\n\r") != 0) esl_fatal(msg);
+ if (esl_memcspn(p, n, " \t\n\r") != 4) esl_fatal(msg);
+
+ p = test1;
+ n = 2;
+ if (esl_memspn (p, n, " \t\n\r") != 2) esl_fatal(msg);
+ if (esl_memcspn(p, n, " \t\n\r") != 0) esl_fatal(msg);
+
+ p = test1+2;
+ n = 4;
+ if (esl_memspn (p, n, " \t\n\r") != 0) esl_fatal(msg);
+ if (esl_memcspn(p, n, " \t\n\r") != 4) esl_fatal(msg);
+}
+
+/* memstrcmp/memstrpfx */
+static void
+utest_memstrcmp_memstrpfx(void)
+{
+ char msg[] = "memstrcmp/memstrpfx unit test failed";
+ char test[] = "this is a test";
+ char *p;
+ esl_pos_t n;
+
+ p = test;
+ n = strlen(p);
+ if (! esl_memstrcmp(p, n, test)) esl_fatal(msg);
+ if ( esl_memstrcmp(p, n, "this")) esl_fatal(msg);
+ if (! esl_memstrpfx(p, n, "this")) esl_fatal(msg);
+ if ( esl_memstrpfx(p, n, "that")) esl_fatal(msg);
+
+ p = test;
+ n = 2; /* now p is just "th" */
+ if (! esl_memstrcmp(p, n, "th")) esl_fatal(msg);
+ if ( esl_memstrcmp(p, n, test)) esl_fatal(msg);
+ if (! esl_memstrpfx(p, n, "th")) esl_fatal(msg);
+ if ( esl_memstrpfx(p, n, "this")) esl_fatal(msg);
+
+ /* special cases involving NULLs */
+ p = test;
+ n = strlen(p);
+ if (! esl_memstrcmp(NULL, 0, NULL)) esl_fatal(msg);
+ if ( esl_memstrcmp(NULL, 0, test)) esl_fatal(msg);
+ if ( esl_memstrcmp(p, n, NULL)) esl_fatal(msg);
+ if ( esl_memstrpfx(NULL, 0, NULL)) esl_fatal(msg);
+ if ( esl_memstrpfx(NULL, 0, "this")) esl_fatal(msg);
+ if ( esl_memstrpfx(p, n, NULL)) esl_fatal(msg);
+}
+
+static void
+utest_memstrcontains(void)
+{
+ char msg[] = "memstrcontains unit test failed";
+ char test[] = "CLUSTAL W (1.83) multiple sequence alignment";
+ char *p;
+ esl_pos_t n;
+
+ p = test;
+ n = strlen(p);
+ if (! esl_memstrcontains(p, n, "multiple sequence alignment")) esl_fatal(msg);
+ if (! esl_memstrcontains(p, n, "CLUSTAL")) esl_fatal(msg);
+ if ( esl_memstrcontains(p, n, "alignmentx")) esl_fatal(msg);
+}
+
+#endif /*eslMEM_TESTDRIVE*/
+/*------------------ end, unit tests ----------------------------*/
+
+
+
+
+/*****************************************************************
+ * 3. Test driver
+ *****************************************************************/
+#ifdef eslMEM_TESTDRIVE
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_mem.h"
+#include "esl_getopts.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for mem module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+
+ utest_mem_strtoi32();
+ utest_memtok();
+ utest_memspn_memcspn();
+ utest_memstrcmp_memstrpfx();
+ utest_memstrcontains();
+
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /* eslMEM_TESTDRIVE */
+
+
+/*------------------ end, test driver ---------------------------*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
+
diff --git a/esl_mem.h b/esl_mem.h
new file mode 100644
index 0000000..783baea
--- /dev/null
+++ b/esl_mem.h
@@ -0,0 +1,27 @@
+/* str*()-like functions for raw memory "lines" (non-NUL terminated strings)
+ */
+#ifndef eslMEM_INCLUDED
+#define eslMEM_INCLUDED
+
+#include "easel.h"
+
+extern int esl_mem_strtoi32(char *p, esl_pos_t n, int base, int *opt_nc, int32_t *opt_val);
+extern int esl_memnewline(const char *p, esl_pos_t n, esl_pos_t *ret_nline, int *ret_nterm);
+extern int esl_memtok(char **p, esl_pos_t *n, const char *delim, char **ret_tok, esl_pos_t *ret_toklen);
+extern esl_pos_t esl_memspn (char *p, esl_pos_t n, const char *allow);
+extern esl_pos_t esl_memcspn(char *p, esl_pos_t n, const char *disallow);
+extern int esl_memstrcmp (const char *p, esl_pos_t n, const char *s);
+extern int esl_memstrpfx (const char *p, esl_pos_t n, const char *s);
+extern int esl_memstrcontains(const char *p, esl_pos_t n, const char *s);
+extern int esl_memstrdup(const char *p, esl_pos_t n, char **ret_s);
+extern int esl_memstrcpy(const char *p, esl_pos_t n, char *dest);
+extern int esl_memtof(const char *p, esl_pos_t n, float *ret_val);
+extern int esl_memtod(const char *p, esl_pos_t n, double *ret_val);
+extern int esl_mem_IsReal(const char *p, esl_pos_t n);
+
+#endif /*eslMEM_INCLUDED*/
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
diff --git a/esl_minimizer.c b/esl_minimizer.c
new file mode 100644
index 0000000..8b35a3c
--- /dev/null
+++ b/esl_minimizer.c
@@ -0,0 +1,654 @@
+/* Multidimensional optimization using conjugate gradient descent.
+ *
+ * Can be used even without derivative information; falls back to
+ * a numeric gradient if analytic gradient is unavailable.
+ */
+#include "esl_config.h"
+
+#include <math.h>
+#include <float.h>
+
+#include "easel.h"
+#include "esl_vectorops.h"
+#include "esl_minimizer.h"
+
+/* Return the negative gradient at a point, determined
+ * numerically.
+ */
+static void
+numeric_derivative(double *x, double *u, int n,
+ double (*func)(double *, int, void*),
+ void *prm, double relstep,
+ double *dx)
+{
+ int i;
+ double delta;
+ double f1, f2;
+ double tmp;
+
+ for (i = 0; i < n; i++)
+ {
+ delta = fabs(u[i] * relstep);
+
+ tmp = x[i];
+ x[i] = tmp + delta;
+ f1 = (*func)(x, n, prm);
+ x[i] = tmp - delta;
+ f2 = (*func)(x, n, prm);
+ x[i] = tmp;
+
+ dx[i] = (-0.5 * (f1-f2)) / delta;
+
+ ESL_DASSERT1((! isnan(dx[i])));
+ }
+}
+
+/* bracket():
+ * SRE, Wed Jul 27 11:43:32 2005 [St. Louis]
+ *
+ * Purpose: Bracket a minimum.
+ *
+ * The minimization is quasi-one-dimensional,
+ * starting from an initial <n>-dimension vector <ori>
+ * in the <n>-dimensional direction <d>.
+ *
+ * Caller passes a ptr to the objective function <*func()>,
+ * and a void pointer to any necessary conditional
+ * parameters <prm>. The objective function will
+ * be evaluated at a point <x> by calling
+ * <(*func)(x, n, prm)>. The caller's function
+ * is responsible to casting <prm> to whatever it's
+ * supposed to be, which might be a ptr to a structure,
+ * for example; typically, for a parameter optimization
+ * problem, this holds the observed data.
+ *
+ * The routine works in scalar multipliers relative
+ * to origin <ori> and direction <d>; that is, a new <n>-dimensional
+ * point <b> is defined as <ori> + <bx><d>, for a scalar <bx>.
+ *
+ * The routine identifies a triplet <ax>, <bx>, <cx> such
+ * that $a < b < c$ and such that a minimum is known to
+ * exist in the $(a,b)$ interval because $f(b) < f(a),
+ * f(c)$. Also, the <a..b> and <b...c> intervals are in
+ * a golden ratio; the <b..c> interval is 1.618 times larger
+ * than <a..b>.
+ *
+ * Since <d> is usually in the direction of the gradient,
+ * the points <ax>,<bx>,<cx> might be expected to be $\geq 0$;
+ * however, when <ori> is already close to the minimum,
+ * it is often faster to bracket the minimum using
+ * a negative <ax>. The caller might then try to be "clever"
+ * and assume that the minimum is in the <bx..cx> interval
+ * when <ax> is negative, rather than the full <ax..cx>
+ * interval. That cleverness can fail, though, if <ori>
+ * is already in fact the minimum, because the line minimizer
+ * in brent() assumes a non-inclusive interval. Use
+ * <ax..cx> as the bracket.
+ *
+ * Args: ori - n-dimensional starting vector
+ * d - n-dimensional direction to minimize along
+ * n - # of dimensions
+ * firststep - bx is initialized to this scalar multiplier
+ * *func() - objective function to minimize
+ * prm - void * to any constant data that *func() needs
+ * wrk - workspace: 1 allocated n-dimensional vector
+ * ret_ax - RETURN: ax < bx < cx scalar bracketing triplet
+ * ret_bx - RETURN: ...ax may be negative
+ * ret_cx - RETURN:
+ * ret_fa - RETURN: function evaluated at a,b,c
+ * ret_fb - RETURN: ... f(b) < f(a),f(c)
+ * ret_fc - RETURN:
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslENOHALT> if it fails to converge.
+ *
+ * Xref: STL9/130.
+ */
+static int
+bracket(double *ori, double *d, int n, double firststep,
+ double (*func)(double *, int, void *), void *prm,
+ double *wrk,
+ double *ret_ax, double *ret_bx, double *ret_cx,
+ double *ret_fa, double *ret_fb, double *ret_fc)
+{
+ double ax,bx,cx; /* scalar multipliers */
+ double fa,fb,fc; /* f() evaluations at those points */
+ double swapper;
+ int niter;
+
+ /* Set and evaluate our first two points f(a) and f(b), which
+ * are initially at 0.0 and <firststep>.
+ */
+ ax = 0.; /* always start w/ ax at the origin, ax=0 */
+ fa = (*func)(ori, n, prm);
+
+ bx = firststep;
+ esl_vec_DCopy(ori, n, wrk);
+ esl_vec_DAddScaled(wrk, d, bx, n);
+ fb = (*func)(wrk, n, prm);
+
+ /* In principle, we usually know that the minimum m lies to the
+ * right of a, m>=a, because d is likely to be a gradient. You
+ * might think we want 0 = a < b < c. In practice, there's problems
+ * with that. It's far easier to identify bad points (f(x) > f(a))
+ * than to identify good points (f(x) < f(a)), because letting f(x)
+ * blow up to infinity is fine as far as bracketing is concerned.
+ * It can be almost as hard to identify a point b that f(b) < f(a)
+ * as it is to find the minimum in the first place!
+ * Counterintuitively, in cases where f(b)>f(a), it's better
+ * to just swap the a,b labels and look for c on the wrong side
+ * of a! This often works immediately, if f(a) was reasonably
+ * close to the minimum and f(b) and f(c) are both terrible.
+ */
+ if (fb > fa)
+ {
+ swapper = ax; ax = bx; bx = swapper;
+ swapper = fa; fa = fb; fb = swapper;
+ }
+
+ /* Make our first guess at c.
+ * Remember, we don't know that b>a any more, and c might go negative.
+ * We'll either have: a..b...c with a=0;
+ * or: c...b..a with b=0.
+ * In many cases, we'll immediately be done.
+ */
+ cx = bx + (bx-ax)*1.618;
+ esl_vec_DCopy(ori, n, wrk);
+ esl_vec_DAddScaled(wrk, d, cx, n);
+ fc = (*func)(wrk, n, prm);
+
+ /* We're not satisfied until fb < fa, fc;
+ * throughout the routine, we guarantee that fb < fa;
+ * so we just check fc.
+ */
+ niter = 0;
+ while (fc <= fb)
+ {
+ /* Slide over, discarding the a point; choose
+ * new c point even further away.
+ */
+ ax = bx; bx = cx;
+ fa = fb; fb = fc;
+ cx = bx+(bx-ax)*1.618;
+ esl_vec_DCopy(ori, n, wrk);
+ esl_vec_DAddScaled(wrk, d, cx, n);
+ fc = (*func)(wrk, n, prm);
+
+ /* This is a rare instance. We've reach the minimum
+ * by trying to bracket it. Also check that not all
+ * three points are the same.
+ */
+ if (ax != bx && bx != cx && fa == fb && fb == fc) break;
+
+ niter++;
+ if (niter > 100)
+ ESL_EXCEPTION(eslENORESULT, "Failed to bracket a minimum.");
+ }
+
+ /* We're about to return. Assure the caller that the points
+ * are in order a < b < c, not the other way.
+ */
+ if (ax > cx)
+ {
+ swapper = ax; ax = cx; cx = swapper;
+ swapper = fa; fa = fc; fc = swapper;
+ }
+
+ /* Return.
+ */
+ ESL_DPRINTF2(("\nbracket(): %d iterations\n", niter));
+ ESL_DPRINTF2(("bracket(): triplet is %g %g %g along current direction\n",
+ ax, bx, cx));
+ ESL_DPRINTF2(("bracket(): f()'s there are: %g %g %g\n\n",
+ fa, fb, fc));
+
+ *ret_ax = ax; *ret_bx = bx; *ret_cx = cx;
+ *ret_fa = fa; *ret_fb = fb; *ret_fc = fc;
+ return eslOK;
+}
+
+/* brent():
+ * SRE, Sun Jul 10 19:07:05 2005 [St. Louis]
+ *
+ * Purpose: Quasi-one-dimensional minimization of a function <*func()>
+ * in <n>-dimensions, along vector <dir> starting from a
+ * point <ori>. Identifies a scalar $x$ that approximates
+ * the position of the minimum along this direction, in a
+ * given bracketing interval (<a,b>). The minimum must
+ * have been bracketed by the caller in the <(a,b)>
+ * interval. <a> is often 0, because we often start at the
+ * <ori>.
+ *
+ * A quasi-1D scalar coordinate $x$ (such as <a> or <b>) is
+ * transformed to a point $\mathbf{p}$ in n-space as:
+ * $\mathbf{p} = \mathbf{\mbox{ori}} + x
+ * \mathbf{\mbox{dir}}$.
+ *
+ * Any extra (fixed) data needed to calculate <func> can be
+ * passed through the void <prm> pointer.
+ *
+ * <eps> and <t> define the relative convergence tolerance,
+ * $\mbox{tol} = \mbox{eps} |x| + t$. <eps> should not be
+ * less than the square root of the machine precision. The
+ * <DBL_EPSILON> is 2.2e-16 on many machines with 64-bit
+ * doubles, so <eps> is on the order of 1e-8 or more. <t>
+ * is a yet smaller number, used to avoid nonconvergence in
+ * the pathological case $x=0$.
+ *
+ * Upon convergence (which is guaranteed), returns <xvec>,
+ * the n-dimensional minimum. Optionally, will also return
+ * <ret_x>, the scalar <x> that resulted in that
+ * n-dimensional minimum, and <ret_fx>, the objective
+ * function <*func(x)> at the minimum.
+ *
+ * This is an implementation of the R.P. Brent (1973)
+ * algorithm for one-dimensional minimization without
+ * derivatives (modified from Brent's ALGOL60 code). Uses a
+ * combination of bisection search and parabolic
+ * interpolation; should exhibit superlinear convergence in
+ * most functions.
+ *
+ *
+ * Args: ori - n-vector at origin
+ * dir - direction vector (gradient) we're following from ori
+ * n - dimensionality of ori, dir, and xvec
+ * (*func) - ptr to caller's objective function
+ * prm - ptr to any additional data (*func)() needs
+ * a,b - minimum is bracketed on interval [a,b]
+ * eps - tol = eps |x| + t; eps >= 2 * relative machine precision
+ * t - additional factor for tol to avoid x=0 case.
+ * xvec - RETURN: minimum, as an n-vector (caller allocated)
+ * ret_x - optRETURN: scalar multiplier that gave xvec
+ * ret_fx - optRETURN: f(x)
+ *
+ * Returns: (void)
+ *
+ * Reference: See [Brent73], Chapter 5. My version is derived directly
+ * from Brent's description and his ALGOL60 code. I've
+ * preserved his variable names as much as possible, to
+ * make the routine follow his published description
+ * closely. The Brent algorithm is also discussed in
+ * Numerical Recipes [Press88].
+ */
+static void
+brent(double *ori, double *dir, int n,
+ double (*func)(double *, int, void *), void *prm,
+ double a, double b, double eps, double t,
+ double *xvec, double *ret_x, double *ret_fx)
+{
+ double w,x,v,u; /* with [a,b]: Brent's six points */
+ double m; /* midpoint of current [a,b] interval */
+ double tol; /* tolerance = eps|x| + t */
+ double fu,fv,fw,fx; /* function evaluations */
+ double p,q; /* numerator, denominator of parabolic interpolation */
+ double r;
+ double d,e; /* last, next-to-last values of p/q */
+ double c = 1. - (1./eslCONST_GOLD); /* Brent's c; 0.381966; golden ratio */
+ int niter; /* number of iterations */
+
+ x=v=w= a + c*(b-a); /* initial guess of x by golden section */
+ esl_vec_DCopy(ori, n, xvec); /* build xvec from ori, dir, x */
+ esl_vec_DAddScaled(xvec, dir, x, n);
+ fx=fv=fw = (*func)(xvec, n, prm); /* initial function evaluation */
+
+ d = e = 0.;
+ niter = 0;
+ while (1) /* algorithm is guaranteed to converge. */
+ {
+ m = 0.5 * (a+b);
+ tol = eps*fabs(x) + t;
+ if (fabs(x-m) <= 2*tol - 0.5*(b-a)) break; /* convergence test. */
+ niter++;
+
+ p = q = r = 0.;
+ if (fabs(e) > tol)
+ { /* Compute parabolic interpolation, u = x + p/q */
+ r = (x-w)*(fx-fv);
+ q = (x-v)*(fx-fw);
+ p = (x-v)*q - (x-w)*r;
+ q = 2*(q-r);
+ if (q > 0) { p = -p; } else {q = -q;}
+ r = e;
+ e=d; /* e is now the next-to-last p/q */
+ }
+
+ if (fabs(p) < fabs(0.5*q*r) || p < q*(a-x) || p < q*(b-x))
+ { /* Seems well-behaved? Use parabolic interpolation to compute new point u */
+ d = p/q; /* d remembers last p/q */
+ u = x+d; /* trial point, for now... */
+
+ if (2.0*(u-a) < tol || 2.0*(b-u) < tol) /* don't evaluate func too close to a,b */
+ d = (x < m)? tol : -tol;
+ }
+ else /* Badly behaved? Use golden section search to compute u. */
+ {
+ e = (x<m)? b-x : a-x; /* e = largest interval */
+ d = c*e;
+ }
+
+ /* Evaluate f(), but not too close to x. */
+ if (fabs(d) >= tol) u = x+d;
+ else if (d > 0) u = x+tol;
+ else u = x-tol;
+ esl_vec_DCopy(ori, n, xvec); /* build xvec from ori, dir, u */
+ esl_vec_DAddScaled(xvec, dir, u, n);
+ fu = (*func)(xvec, n, prm); /* f(u) */
+
+ /* Bookkeeping. */
+ if (fu <= fx)
+ {
+ if (u < x) b = x; else a = x;
+ v = w; fv = fw; w = x; fw = fx; x = u; fx = fu;
+ }
+ else
+ {
+ if (u < x) a = u; else b = u;
+ if (fu <= fw || w == x)
+ { v = w; fv = fw; w = u; fw = fu; }
+ else if (fu <= fv || v==x || v ==w)
+ { v = u; fv = fu; }
+ }
+ }
+
+ /* Return.
+ */
+ esl_vec_DCopy(ori, n, xvec); /* build final xvec from ori, dir, x */
+ esl_vec_DAddScaled(xvec, dir, x, n);
+ if (ret_x != NULL) *ret_x = x;
+ if (ret_fx != NULL) *ret_fx = fx;
+ ESL_DPRINTF2(("\nbrent(): %d iterations\n", niter));
+ ESL_DPRINTF2(("xx=%10.8f fx=%10.1f\n", x, fx));
+}
+
+
+/* Function: esl_min_ConjugateGradientDescent()
+ * Incept: SRE, Wed Jun 22 08:49:42 2005 [St. Louis]
+ *
+ * Purpose: n-dimensional minimization by conjugate gradient descent.
+ *
+ * An initial point is provided by <x>, a vector of <n>
+ * components. The caller also provides a function <*func()> that
+ * compute the objective function f(x) when called as
+ * <(*func)(x, n, prm)>, and a function <*dfunc()> that can
+ * compute the gradient <dx> at <x> when called as
+ * <(*dfunc)(x, n, prm, dx)>, given an allocated vector <dx>
+ * to put the derivative in. Any additional data or fixed
+ * parameters that these functions require are passed by
+ * the void pointer <prm>.
+ *
+ * The first step of each iteration is to try to bracket
+ * the minimum along the current direction. The initial step
+ * size is controlled by <u[]>; the first step will not exceed
+ * <u[i]> for any dimension <i>. (You can think of <u> as
+ * being the natural "units" to use along a graph axis, if
+ * you were plotting the objective function.)
+ *
+ * The caller also provides an allocated workspace sufficient to
+ * hold four allocated n-vectors. (4 * sizeof(double) * n).
+ *
+ * Iterations continue until the objective function has changed
+ * by less than a fraction <tol>. This should not be set to less than
+ * sqrt(<DBL_EPSILON>).
+ *
+ * Upon return, <x> is the minimum, and <ret_fx> is f(x),
+ * the function value at <x>.
+ *
+ * Args: x - an initial guess n-vector; RETURN: x at the minimum
+ * u - "units": maximum initial step size along gradient when bracketing.
+ * n - dimensionality of all vectors
+ * *func() - function for computing objective function f(x)
+ * *dfunc() - function for computing a gradient at x
+ * prm - void ptr to any data/params func,dfunc need
+ * tol - convergence criterion applied to f(x)
+ * wrk - allocated 4xn-vector for workspace
+ * ret_fx - optRETURN: f(x) at the minimum
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslENOHALT> if it fails to converge in MAXITERATIONS.
+ * <eslERANGE> if the minimum is not finite, which may
+ * indicate a problem in the implementation or choice of <*func()>.
+ *
+ * Xref: STL9/101.
+ */
+int
+esl_min_ConjugateGradientDescent(double *x, double *u, int n,
+ double (*func)(double *, int, void *),
+ void (*dfunc)(double *, int, void *, double *),
+ void *prm, double tol, double *wrk, double *ret_fx)
+{
+ double oldfx;
+ double coeff;
+ int i, i1;
+ double *dx, *cg, *w1, *w2;
+ double cvg;
+ double fa,fb,fc;
+ double ax,bx,cx;
+ double fx;
+
+ dx = wrk;
+ cg = wrk + n;
+ w1 = wrk + 2*n;
+ w2 = wrk + 3*n;
+
+ oldfx = (*func)(x, n, prm); /* init the objective function */
+
+ /* Bail out if the function is +/-inf or nan: this can happen if the caller
+ * has screwed something up, or has chosen a bad start point.
+ */
+ if (! isfinite(oldfx)) ESL_EXCEPTION(eslERANGE, "minimum not finite");
+
+ if (dfunc != NULL)
+ {
+ (*dfunc)(x, n, prm, dx); /* find the current negative gradient, - df(x)/dxi */
+ esl_vec_DScale(dx, n, -1.0);
+ }
+ else numeric_derivative(x, u, n, func, prm, 1e-4, dx); /* resort to brute force */
+
+ esl_vec_DCopy(dx, n, cg); /* and make that the first conjugate direction, cg */
+
+
+
+ /* (failsafe) convergence test: a zero direction can happen,
+ * and it either means we're stuck or we're finished (most likely stuck)
+ */
+ for (i1 = 0; i1 < n; i1++)
+ if (cg[i1] != 0.) break;
+ if (i1 == n) {
+ if (ret_fx != NULL) *ret_fx = oldfx;
+ return eslOK;
+ }
+
+ for (i = 0; i < MAXITERATIONS; i++)
+ {
+
+ /* Figure out the initial step size.
+ */
+ bx = fabs(u[0] / cg[0]);
+ for (i1 = 1; i1 < n; i1++)
+ {
+ cx = fabs(u[i1] / cg[i1]);
+ if (cx < bx) bx = cx;
+ }
+
+ /* Bracket the minimum.
+ */
+ bracket(x, cg, n, bx, func, prm, w1,
+ &ax, &bx, &cx,
+ &fa, &fb, &fc);
+
+ /* Minimize along the line given by the conjugate gradient <cg> */
+ brent(x, cg, n, func, prm, ax, cx, 1e-3, 1e-8, w2, NULL, &fx);
+ esl_vec_DCopy(w2, n, x);
+
+ /* Bail out if the function is now +/-inf: this can happen if the caller
+ * has screwed something up.
+ */
+ if (fx == eslINFINITY || fx == -eslINFINITY)
+ ESL_EXCEPTION(eslERANGE, "minimum not finite");
+
+
+ /* Find the negative gradient at that point (temporarily in w1) */
+ if (dfunc != NULL)
+ {
+ (*dfunc)(x, n, prm, w1);
+ esl_vec_DScale(w1, n, -1.0);
+ }
+ else numeric_derivative(x, u, n, func, prm, 1e-4, w1); /* resort to brute force */
+
+ /* Calculate the Polak-Ribiere coefficient */
+ for (coeff = 0., i1 = 0; i1 < n; i1++)
+ coeff += (w1[i1] - dx[i1]) * w1[i1];
+ coeff /= esl_vec_DDot(dx, dx, n);
+
+ /* Calculate the next conjugate gradient direction in w2 */
+ esl_vec_DCopy(w1, n, w2);
+ esl_vec_DAddScaled(w2, cg, coeff, n);
+
+ /* Finishing set up for next iteration: */
+ esl_vec_DCopy(w1, n, dx);
+ esl_vec_DCopy(w2, n, cg);
+
+ /* Now: x is the current point;
+ * fx is the function value at that point;
+ * dx is the current gradient at x;
+ * cg is the current conjugate gradient direction.
+ */
+
+ /* Main convergence test. 1e-9 factor is fudging the case where our
+ * minimum is at exactly f()=0.
+ */
+ cvg = 2.0 * fabs((oldfx-fx)) / (1e-10 + fabs(oldfx) + fabs(fx));
+
+// fprintf(stderr, "(%d): Old f() = %.9f New f() = %.9f Convergence = %.9f\n", i, oldfx, fx, cvg);
+// fprintf(stdout, "(%d): Old f() = %.9f New f() = %.9f Convergence = %.9f\n", i, oldfx, fx, cvg);
+
+#if eslDEBUGLEVEL >= 2
+ printf("\nesl_min_ConjugateGradientDescent():\n");
+ printf("new point: ");
+ for (i1 = 0; i1 < n; i1++)
+ printf("%g ", x[i1]);
+
+ printf("\nnew gradient: ");
+ for (i1 = 0; i1 < n; i1++)
+ printf("%g ", dx[i1]);
+
+ numeric_derivative(x, u, n, func, prm, 1e-4, w1);
+ printf("\n(numeric grad): ");
+ for (i1 = 0; i1 < n; i1++)
+ printf("%g ", w1[i1]);
+
+ printf("\nnew direction: ");
+ for (i1 = 0; i1 < n; i1++)
+ printf("%g ", cg[i1]);
+
+ printf("\nOld f() = %g New f() = %g Convergence = %g\n\n", oldfx, fx, cvg);
+#endif
+
+ if (cvg <= tol) break;
+
+ /* Second (failsafe) convergence test: a zero direction can happen,
+ * and it either means we're stuck or we're finished (most likely stuck)
+ */
+ for (i1 = 0; i1 < n; i1++)
+ if (cg[i1] != 0.) break;
+ if (i1 == n) break;
+
+ oldfx = fx;
+ }
+
+
+ if (ret_fx != NULL) *ret_fx = fx;
+
+ if (i == MAXITERATIONS)
+ ESL_FAIL(eslENOHALT, NULL, " ");
+// ESL_EXCEPTION(eslENOHALT, "Failed to converge in ConjugateGradientDescent()");
+
+
+
+ return eslOK;
+}
+
+
+
+
+
+
+/*****************************************************************
+ * Example main()
+ *****************************************************************/
+#ifdef eslMINIMIZER_EXAMPLE
+/*::cexcerpt::minimizer_example::begin::*/
+/* compile: gcc -g -Wall -I. -o example -DeslMINIMIZER_EXAMPLE esl_minimizer.c esl_vectorops.c easel.c -lm
+ * run: ./example
+ */
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_vectorops.h"
+#include "esl_minimizer.h"
+
+/* a simple multidimensional quadratic w/ a minimum at 0:
+ * $f(x) = a_1 x_1^2 + ... a_n x_n^2$
+ */
+static double
+example_func(double *x, int n, void *prm)
+{
+ double *a;
+ double fx;
+ int i;
+
+ a = (double *) prm; /* cast the data vector */
+ for (fx = 0., i = 0; i < n; i++)
+ fx += a[i] * x[i] * x[i];
+ return fx;
+}
+/* gradient of the f(x): d/dx_i = 2 a_i x_i
+ */
+static void
+example_dfunc(double *x, int n, void *prm, double *dx)
+{
+ double *a;
+ int i;
+
+ a = (double *) prm; /* cast the data vector */
+ for (i = 0; i < n; i++)
+ dx[i] = 2.0 * a[i] * x[i];
+}
+int
+main(int argc, char **argv)
+{
+ int n = 6;
+ double a[6] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 };
+ double x[6] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 };
+ double u[6] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };
+ double wrk[24];
+ double fx;
+ int i;
+
+ esl_min_ConjugateGradientDescent(x, u, n,
+ &example_func, &example_dfunc, (void *) a,
+ 0.0001, wrk, &fx);
+
+ printf("At minimum: f(x) = %g\n", fx);
+ printf("vector x = ");
+ for (i = 0; i < 6; i++) printf("%g ", x[i]);
+ printf("\n");
+
+ return 0;
+}
+/*::cexcerpt::minimizer_example::end::*/
+#endif /*eslMINIMIZER_EXAMPLE*/
+
+
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_minimizer.h b/esl_minimizer.h
new file mode 100644
index 0000000..2b71a23
--- /dev/null
+++ b/esl_minimizer.h
@@ -0,0 +1,29 @@
+/* Multidimensional optimization by conjugate gradient descent.
+ *
+ * SRE, Wed Jun 22 09:53:05 2005
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslMINIMIZER_INCLUDED
+#define eslMINIMIZER_INCLUDED
+
+#define MAXITERATIONS 100
+
+extern int esl_min_Bracket(double *a, double *d, double *u, int n,
+ double (*func)(double *, int, void *), void *prm,
+ double *ret_fa,
+ double *b, double *ret_bx, double *ret_fb,
+ double *c, double *ret_cx, double *ret_fc);
+extern int esl_min_LineSearch(double *ori, double *d, double *u, int n,
+ double (*func)(double *, int, void *), void *prm,
+ double tol, double *b,
+ double *x, double *ret_xx, double *ret_fx);
+extern int esl_min_ConjugateGradientDescent(double *x, double *u, int n,
+ double (*func)(double *, int, void *),
+ void (*dfunc)(double *, int, void *, double *),
+ void *prm, double tol, double *wrk, double *ret_fx);
+
+#endif /*eslMINIMIZER_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_minimizer.tex b/esl_minimizer.tex
new file mode 100644
index 0000000..22ba5b1
--- /dev/null
+++ b/esl_minimizer.tex
@@ -0,0 +1,13 @@
+
+
+
+\subsection{The minimizer API}
+
+The \eslmod{minimizer} API has just one function:
+\ccode{esl\_min\_ConjugateGradientDescent()}.
+
+\subsection{Example of using the minimizer API}
+
+The code sample below
+
+\input{cexcerpts/minimizer_example}
diff --git a/esl_mixgev.c b/esl_mixgev.c
new file mode 100644
index 0000000..b194d5d
--- /dev/null
+++ b/esl_mixgev.c
@@ -0,0 +1,834 @@
+/* Statistical routines for mixtures of generalized extreme value distributions.
+ *
+ * Contents:
+ * 1. The ESL_MIXGEV object
+ * 2. Evaluating densities and distributions
+ * 3. Generic API routines: for general interface w/ histogram module
+ * 4. Dumping plots to xmgrace XY format
+ * 5. Sampling (augmentation: random)
+ * 6. ML fitting to complete data (augmentation: minimizer)
+ * 7. Example
+ * 8. Copyright and license information
+ *
+ * Xrefs:
+ * SRE:STL9/139 original implementation
+ *
+ * To-do:
+ * - Fit*() functions should return eslEINVAL on n=0, eslENORESULT
+ * on failure due to small n. Compare esl_gumbel. xref J12/93.
+ * SRE, Wed Nov 27 11:02:14 2013
+ *
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+
+#include "easel.h"
+#include "esl_vectorops.h"
+#include "esl_stats.h"
+#include "esl_gev.h"
+#include "esl_mixgev.h"
+
+#ifdef eslAUGMENT_RANDOM
+#include "esl_dirichlet.h" /* for uniform sampling of a probability vector */
+#include "esl_random.h"
+#endif
+
+#ifdef eslAUGMENT_MINIMIZER
+#include "esl_minimizer.h"
+#endif
+
+
+/****************************************************************************
+ * 1. The ESL_MIXGEV object
+ ****************************************************************************/
+
+/* Function: esl_mixgev_Create()
+ *
+ * Purpose: Creates an object to hold parameters for a <K>-component
+ * mixture of generalized extreme value distributions.
+ *
+ * Parameters in the object are initialized ($q_k =
+ * \frac{1}{K}$, $\mu_k = 0$, $\lambda_k = 1$, $\alpha_k =
+ * 0$), but the caller will want to set these according to
+ * its own purposes.
+ *
+ * After an object is created, the caller can constrain any
+ * of the components to be a Gumbel (that is, constrain
+ * $\alpha_k = 0$ by calling <esl_mixgev_ForceGumbel(obj,
+ * k)>.
+ *
+ * Args: K - number of components in the mixture
+ *
+ * Returns: ptr to newly allocated/initialized <ESL_MIXGEV> object.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_MIXGEV *
+esl_mixgev_Create(int K)
+{
+ ESL_MIXGEV *mg = NULL;
+ int k;
+ int status;
+
+ ESL_ALLOC(mg, sizeof(ESL_MIXGEV));
+ mg->q = mg->mu = mg->lambda = mg->alpha = mg->wrk = NULL;
+ mg->isgumbel = NULL;
+ mg->K = K;
+
+ ESL_ALLOC(mg->q, sizeof(double) * K);
+ ESL_ALLOC(mg->mu, sizeof(double) * K);
+ ESL_ALLOC(mg->lambda, sizeof(double) * K);
+ ESL_ALLOC(mg->alpha, sizeof(double) * K);
+ ESL_ALLOC(mg->wrk, sizeof(double) * K);
+ ESL_ALLOC(mg->isgumbel, sizeof(int) * K);
+
+ for (k = 0; k < K; k++)
+ {
+ mg->q[k] = 1. / (double) K;
+ mg->mu[k] = 0.;
+ mg->lambda[k] = 1.;
+ mg->alpha[k] = 0.;
+ mg->isgumbel[k] = FALSE;
+ }
+ return mg;
+
+ ERROR:
+ esl_mixgev_Destroy(mg);
+ return NULL;
+}
+
+/* Function: esl_mixgev_Destroy()
+ *
+ * Purpose: Deallocates the mixture GEV parameter object <mg>.
+ *
+ * Args: mg - ptr to the object to be deallocated.
+ *
+ * Returns: (void)
+ */
+void
+esl_mixgev_Destroy(ESL_MIXGEV *mg)
+{
+ if (mg == NULL) return;
+
+ if (mg->q != NULL) free(mg->q);
+ if (mg->mu != NULL) free(mg->mu);
+ if (mg->lambda != NULL) free(mg->lambda);
+ if (mg->alpha != NULL) free(mg->alpha);
+ if (mg->wrk != NULL) free(mg->wrk);
+ if (mg->isgumbel != NULL) free(mg->isgumbel);
+
+ free(mg);
+}
+
+/* Function: esl_mixgev_Copy()
+ *
+ * Purpose: Makes a copy of the mixture GEV parameter object <src>
+ * in <dest>. Caller must have already allocated <dest> to have
+ * (at least) the same number of components as <src>.
+ *
+ * Args: src - object to be copied
+ * dest - allocated object to copy <src> into
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINCOMPAT> if <dest> isn't allocated with enough
+ * components to hold a copy of <src>.
+ */
+int
+esl_mixgev_Copy(ESL_MIXGEV *src, ESL_MIXGEV *dest)
+{
+ int k;
+
+ if (dest->K < src->K)
+ ESL_EXCEPTION(eslEINCOMPAT, "mixture GEV too small to copy into");
+
+ for (k = 0; k < src->K; k++)
+ {
+ dest->q[k] = src->q[k];
+ dest->mu[k] = src->mu[k];
+ dest->lambda[k] = src->lambda[k];
+ dest->alpha[k] = src->alpha[k];
+ dest->isgumbel[k] = src->isgumbel[k];
+ }
+ dest->K = src->K;
+ return eslOK;
+}
+
+/* Function: esl_mixgev_ForceGumbel()
+ *
+ * Purpose: Constrain component <which> of the mixture GEV <mg>
+ * to be a Gumbel (that is, constrain $\alpha=0$ for
+ * that component. This constraint will be obeyed by
+ * any subsequent calls to parameter fitting routines.
+ *
+ * Normally would be called just after creating the <mg>
+ * object, as part of its configuration before trying to
+ * fit some observed data to a mixture GEV.
+ *
+ * Args: mg - mixture GEV object being configured
+ * which - which component to constrain to a Gumbel
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_mixgev_ForceGumbel(ESL_MIXGEV *mg, int which)
+{
+ mg->isgumbel[which] = TRUE;
+ return eslOK;
+}
+/*----------------- end ESL_MIXGEV object maintenance ----------------------*/
+
+
+
+
+/****************************************************************************
+ * 2. Evaluating densities and distributions
+ ****************************************************************************/
+
+/* Function: esl_mixgev_pdf()
+ *
+ * Purpose: Returns the probability density function $P(X=x)$ for
+ * quantile <x>, given mixture GEV parameters <mg>.
+ */
+double
+esl_mixgev_pdf(double x, ESL_MIXGEV *mg)
+{
+ double pdf = 0.;
+ int k;
+
+ for (k = 0; k < mg->K; k++)
+ pdf += mg->q[k] * esl_gev_pdf(x, mg->mu[k], mg->lambda[k], mg->alpha[k]);
+ return pdf;
+}
+
+/* Function: esl_mixgev_logpdf()
+ *
+ * Purpose: Returns the log of the PDF ($\log P(X=x)$) for quantile <x>,
+ * given mixture GEV parameters <mg>.
+ */
+double
+esl_mixgev_logpdf(double x, ESL_MIXGEV *mg)
+{
+ int k;
+ for (k = 0; k < mg->K; k++)
+ if (mg->q[k] == 0.0)
+ mg->wrk[k] = -eslINFINITY;
+ else
+ mg->wrk[k] = log(mg->q[k]) +
+ esl_gev_logpdf(x, mg->mu[k], mg->lambda[k], mg->alpha[k]);
+
+ return esl_vec_DLogSum(mg->wrk, mg->K);
+}
+
+/* Function: esl_mixgev_cdf()
+ *
+ * Purpose: Returns the cumulative distribution function $P(X \leq x)$
+ * for quantile <x>, given mixture GEV parameters <mg>.
+ */
+double
+esl_mixgev_cdf(double x, ESL_MIXGEV *mg)
+{
+ double cdf = 0.;
+ int k;
+
+ for (k = 0; k < mg->K; k++)
+ cdf += mg->q[k] * esl_gev_cdf(x, mg->mu[k], mg->lambda[k], mg->alpha[k]);
+ return cdf;
+}
+
+/* Function: esl_mixgev_logcdf()
+ *
+ * Purpose: Returns the log of the CDF $\log P(X \leq x)$
+ * for quantile <x>, given mixture GEV parameters <mg>.
+ */
+double
+esl_mixgev_logcdf(double x, ESL_MIXGEV *mg)
+{
+ int k;
+
+ for (k = 0; k < mg->K; k++)
+ if (mg->q[k] == 0.0)
+ mg->wrk[k] = -eslINFINITY;
+ else
+ mg->wrk[k] = log(mg->q[k]) +
+ esl_gev_logcdf(x, mg->mu[k], mg->lambda[k], mg->alpha[k]);
+
+ return esl_vec_DLogSum(mg->wrk, mg->K);
+}
+
+/* Function: esl_mixgev_surv()
+ *
+ * Purpose: Returns the survivor function $P(X > x)$ (1-CDF)
+ * for quantile <x>, given mixture GEV parameters <mg>.
+ */
+double
+esl_mixgev_surv(double x, ESL_MIXGEV *mg)
+{
+ double srv = 0.;
+ int k;
+
+ for (k = 0; k < mg->K; k++)
+ srv += mg->q[k] * esl_gev_surv(x, mg->mu[k], mg->lambda[k], mg->alpha[k]);
+ return srv;
+}
+
+/* Function: esl_mixgev_logsurv()
+ *
+ * Purpose: Returns the log survivor function $\log P(X > x)$ (log(1-CDF))
+ * for quantile <x>, given mixture GEV parameters <mg>.
+ */
+double
+esl_mixgev_logsurv(double x, ESL_MIXGEV *mg)
+{
+ int k;
+ for (k = 0; k < mg->K; k++)
+ {
+ mg->wrk[k] = log(mg->q[k]);
+ mg->wrk[k] += esl_gev_logsurv(x, mg->mu[k], mg->lambda[k], mg->alpha[k]);
+ }
+ return esl_vec_DLogSum(mg->wrk, mg->K);
+}
+
+/* Function: esl_mixgev_invcdf()
+ *
+ * Purpose: Calculates the inverse CDF for a mixture GEV <mg>,
+ * returning the quantile <x> at which the CDF is <p>,
+ * where $0 < p < 1$.
+ *
+ * The inverse CDF of a mixture model has no analytical
+ * expression as far as I'm aware. The calculation here is
+ * a brute force bisection search in <x> using the CDF
+ * function. It will suffice for a small number of calls
+ * (for plotting applications, for example), but beware, it is not
+ * efficient.
+ */
+double
+esl_mixgev_invcdf(double p, ESL_MIXGEV *mg)
+{
+ double x1, x2, xm; /* low, high guesses at x */
+ double f1, f2, fm;
+ double tol = 1e-6;
+
+ x2 = esl_vec_DMin(mg->mu, mg->K);
+ x1 = x2 - 1.;
+ do { /* bracket, left side */
+ x1 = x1 + 2.*(x2-x1);
+ f1 = esl_mixgev_cdf(x1, mg);
+ } while (f1 > p);
+ do { /* bracket, right side */
+ x2 = x2 + 2.*(x2-x1);
+ f2 = esl_mixgev_cdf(x2, mg);
+ } while (f2 < p);
+
+ do { /* bisection */
+ xm = (x1+x2) / 2.;
+ fm = esl_mixgev_cdf(xm, mg);
+
+ if (fm > p) x2 = xm;
+ else if (fm < p) x1 = xm;
+ else return xm; /* unlikely case of fm==p */
+ } while ( (x2-x1)/(x1+x2+1e-9) > tol);
+
+ xm = (x1+x2) / 2.;
+ return xm;
+}
+/*-------------------- end densities & distributions ------------------------*/
+
+
+
+
+/****************************************************************************
+ * 3. Generic API routines: for general interface w/ histogram module
+ ****************************************************************************/
+
+/* Function: esl_mixgev_generic_pdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_mixgev_pdf()>, taking
+ * a void ptr to a <ESL_MIXGEV> parameter structure.
+ */
+double
+esl_mixgev_generic_pdf(double x, void *params)
+{
+ ESL_MIXGEV *mg = (ESL_MIXGEV *) params;
+ return esl_mixgev_pdf(x, mg);
+}
+
+/* Function: esl_mixgev_generic_cdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_mixgev_cdf()>, taking
+ * a void ptr to a <ESL_MIXGEV> parameter structure.
+ */
+double
+esl_mixgev_generic_cdf(double x, void *params)
+{
+ ESL_MIXGEV *mg = (ESL_MIXGEV *) params;
+ return esl_mixgev_cdf(x, mg);
+}
+
+/* Function: esl_mixgev_generic_surv()
+ *
+ * Purpose: Generic-API wrapper around <esl_mixgev_surv()>, taking
+ * a void ptr to a <ESL_MIXGEV> parameter structure.
+ */
+double
+esl_mixgev_generic_surv(double x, void *params)
+{
+ ESL_MIXGEV *mg = (ESL_MIXGEV *) params;
+ return esl_mixgev_surv(x, mg);
+}
+
+/* Function: esl_mixgev_generic_invcdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_mixgev_invcdf()>, taking
+ * a void ptr to a <ESL_MIXGEV> parameter structure.
+ */
+double
+esl_mixgev_generic_invcdf(double p, void *params)
+{
+ ESL_MIXGEV *mg = (ESL_MIXGEV *) params;
+ return esl_mixgev_invcdf(p, mg);
+}
+/*------------------------ end generic API ---------------------------------*/
+
+
+
+
+/****************************************************************************
+ * 4. Dumping plots to xmgrace XY format
+ ****************************************************************************/
+
+/* Function: esl_mixgev_Plot()
+ *
+ * Purpose: Plot some function <func> (for instance, <esl_mixgev_pdf()>)
+ * for mixture GEV parameters <mg>, for a range of
+ * quantiles x from <xmin> to <xmax> in steps of <xstep>;
+ * output to an open stream <fp> in xmgrace XY input format.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error.
+ */
+int
+esl_mixgev_Plot(FILE *fp, ESL_MIXGEV *mg,
+ double (*func)(double x, ESL_MIXGEV *mg),
+ double xmin, double xmax, double xstep)
+{
+ double x;
+ for (x = xmin; x <= xmax; x += xstep)
+ if (fprintf(fp, "%f\t%g\n", x, (*func)(x, mg)) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "mixgev plot write failed");
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "mixgev plot write failed");
+ return eslOK;
+}
+/*-------------------- end plot dumping routines ---------------------------*/
+
+
+
+
+
+/****************************************************************************
+ * 5. Sampling (requires augmentation w/ random module)
+ ****************************************************************************/
+#ifdef eslAUGMENT_RANDOM
+
+/* Function: esl_mixgev_Sample()
+ *
+ * Purpose: Sample a random variate x from a mixture GEV <mg>,
+ * given random number source <r>.
+ */
+double
+esl_mixgev_Sample(ESL_RANDOMNESS *r, ESL_MIXGEV *mg)
+{
+ int k;
+ k = esl_rnd_DChoose(r, mg->q, mg->K);
+ return esl_gev_Sample(r, mg->mu[k], mg->lambda[k], mg->alpha[k]);
+}
+
+#endif /*eslAUGMENT_RANDOM*/
+/*--------------------------- end sampling ---------------------------------*/
+
+
+
+
+
+
+/****************************************************************************
+ * 6. ML fitting to complete data (augmentation: minimizer)
+ ****************************************************************************/
+#ifdef eslAUGMENT_MINIMIZER
+
+struct mixgev_data {
+ double *x;
+ int n;
+ double *wrk; /* workspace vector [0..K-1]*/
+ ESL_MIXGEV *mg;
+};
+
+/* Given mixture GEV parameters in <mg>;
+ * do appropriate c.o.v.'s to unconstrained real parameters
+ * and fill in the packed parameter vector <p>.
+ *
+ * First K-1 are Q_1..Q_K-1 mixture coefficient parameters; Q_0 implicitly 0;
+ * cov is q_k = e^{Q_k} / \sum_j e^{Q_j},
+ * so Q_k = log(q_k) - log(q_0).
+ * Then K components: mu, lambda, optional alpha;
+ * mu, alpha are already unconstrained real;
+ * lambda cov is lambda = e^w, w = log(lambda).
+ */
+static void
+mixgev_pack_paramvector(double *p, int np, ESL_MIXGEV *mg)
+{
+ int i; /* counter in parameter vector p */
+ int k; /* counter in mixture components */
+ double z; /* tmp variable */
+
+ /* mixture coefficients */
+ z = log(mg->q[0]);
+ i = 0;
+ for (k = 1; k < mg->K; k++)
+ p[i++] = log(mg->q[k]) - z;
+
+ /* gev parameters */
+ for (k = 0; k < mg->K; k++)
+ {
+ p[i++] = mg->mu[k];
+ p[i++] = log(mg->lambda[k]);
+ if (! mg->isgumbel[k]) p[i++] = mg->alpha[k];
+ }
+ /* assert(i==np) in debugging, if you want */
+}
+
+/* Same as above but in reverse: given parameter vector <p>,
+ * do appropriate c.o.v. back to desired parameter space, and
+ * fill in the mixture GEV structure <mg>.
+ */
+static void
+mixgev_unpack_paramvector(double *p, int np, ESL_MIXGEV *mg)
+{
+ int i; /* counter in parameter vector p */
+ int k; /* counter in mixture components */
+ double z; /* tmp variable */
+
+ /* Fetch the params in their c.o.v. space first
+ */
+ i = 0;
+ mg->q[0] = 0; /* implicitly */
+ for (k = 1; k < mg->K; k++)
+ mg->q[k] = p[i++];
+ for (k = 0; k < mg->K; k++)
+ {
+ mg->mu[k] = p[i++];
+ mg->lambda[k] = p[i++];
+ if (!mg->isgumbel[k]) mg->alpha[k] = p[i++];
+ else mg->alpha[k] = 0.;
+ }
+ assert(i==np);
+
+ /* Convert mix coefficients back to probabilities;
+ * their c.o.v. is q_k = e^{Q_k} / \sum_k e^{Q_k}
+ * which rearranges to exp(Q_k - log[\sum_k e^Q_k]),
+ * and we have the DLogSum() function to compute the log sum.
+ */
+ z = esl_vec_DLogSum(mg->q, mg->K);
+ for (k = 0; k < mg->K; k++)
+ mg->q[k] = exp(mg->q[k] - z);
+
+ /* lambda c.o.v. is \lambda = e^w
+ */
+ for (k = 0; k < mg->K; k++)
+ mg->lambda[k] = exp(mg->lambda[k]);
+}
+
+static double
+mixgev_complete_func(double *p, int np, void *dptr)
+{
+ struct mixgev_data *data = (struct mixgev_data *) dptr;
+ ESL_MIXGEV *mg = data->mg;
+ int i;
+ double logL;
+
+ /* Use the current parameter vector (in its unconstrained
+ * real c.o.v. space) to deduce what the current mixture GEV
+ * parameters are:
+ */
+ mixgev_unpack_paramvector(p, np, mg);
+
+ /* Calculate the log likelihood:
+ */
+ logL = 0;
+ for (i = 0; i < data->n; i++)
+ logL += esl_mixgev_logpdf(data->x[i], mg);
+
+ /* return the NLL
+ */
+ return -logL;
+}
+
+
+/* Function: esl_mixgev_FitGuess()
+ *
+ * Purpose: Make initial randomized guesses at the parameters
+ * of mixture GEV <mg>, using random number generator
+ * <r> and observed data consisting of <n> values
+ * <x[0..n-1]>. This guess is a suitable starting
+ * point for a parameter optimization routine, such
+ * as <esl_mixgev_FitComplete()>.
+ *
+ * Specifically, we estimate one 'central' guess
+ * for a single Gumbel fit to the data, using the
+ * method of moments. Then we add $\pm 10\%$ to that 'central'
+ * $\mu$ and $\lambda$ to get each component
+ * $\mu_i$ and $\lambda_i$. The $\alpha_i$ parameters
+ * are generated by sampling uniformly from $-0.1..0.1$.
+ * Mixture coefficients $q_i$ are sampled uniformly.
+ *
+ * Args: r - randomness source
+ * x - vector of observed data values to fit, 0..n-1
+ * n - number of values in <x>
+ * mg - mixture GEV to put guessed params into
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_mixgev_FitGuess(ESL_RANDOMNESS *r, double *x, int n, ESL_MIXGEV *mg)
+{
+ double mean, variance;
+ double mu, lambda;
+ int k;
+
+ esl_stats_DMean(x, n, &mean, &variance);
+ lambda = eslCONST_PI / sqrt(6.*variance);
+ mu = mean - 0.57722/lambda;
+
+ esl_dirichlet_DSampleUniform(r, mg->K, mg->q);
+ for (k = 0; k < mg->K; k++)
+ {
+ mg->mu[k] = mu + 0.2 * mu * (esl_random(r) - 0.5);
+ mg->lambda[k] = lambda + 0.2 * lambda * (esl_random(r) - 0.5);
+ if (mg->isgumbel[k]) mg->alpha[k] = 0.;
+ else mg->alpha[k] = 0.2 * (esl_random(r) - 0.5);
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_mixgev_FitComplete()
+ *
+ * Purpose: Given <n> observed data values <x[0..n-1]>, and
+ * an initial guess at a mixture GEV fit to those data
+ * <mg>, use conjugate gradient descent to perform
+ * a locally optimal maximum likelihood mixture
+ * GEV parameter fit to the data.
+ *
+ * To obtain a reasonable initial guess for <mg>,
+ * see <esl_mixgev_FitGuess()>.
+ *
+ * Args: x - observed data, <x[0..n-1]>.
+ * n - number of samples in <x>
+ * mg - mixture GEV to estimate, w/ params set to
+ * an initial guess.
+ *
+ * Returns: <eslOK> on success, and <mg> contains local
+ * ML estimate for mixture GEV parameters.
+ *
+ * Throws: <eslEMEM> on allocation error, and <mg> is unchanged
+ * from its initial state.
+ */
+int
+esl_mixgev_FitComplete(double *x, int n, ESL_MIXGEV *mg)
+{
+ struct mixgev_data data;
+ int status;
+ double *p = NULL;
+ double *u = NULL;
+ double *wrk = NULL;
+ double tol;
+ int np;
+ double fx;
+ int k;
+ int i;
+
+ tol = 1e-6;
+
+ /* Determine number of free parameters and allocate
+ */
+ np = mg->K-1; /* K-1 mix coefficients free */
+ for (k = 0; k < mg->K; k++)
+ np += (mg->isgumbel[k])? 2 : 3;
+ ESL_ALLOC(p, sizeof(double) * np);
+ ESL_ALLOC(u, sizeof(double) * np);
+ ESL_ALLOC(wrk, sizeof(double) * np * 4);
+
+ /* Copy shared info into the "data" structure
+ */
+ data.x = x;
+ data.n = n;
+ data.wrk = wrk;
+ data.mg = mg;
+
+ /* From mg, create the parameter vector.
+ */
+ mixgev_pack_paramvector(p, np, mg);
+
+ /* Define the step size vector u.
+ */
+ i = 0;
+ for (k = 1; k < mg->K; k++) u[i++] = 1.0;
+ for (k = 0; k < mg->K; k++)
+ {
+ u[i++] = 1.0;
+ u[i++] = 1.0;
+ if (! mg->isgumbel[k]) u[i++] = 0.02;
+ }
+ ESL_DASSERT1( (np == i) );
+
+ /* Feed it all to the mighty optimizer.
+ */
+
+ status = esl_min_ConjugateGradientDescent(p, u, np, &mixgev_complete_func, NULL,
+ (void *) (&data), tol, wrk, &fx);
+ if (status != eslOK) goto ERROR;
+
+ /* Convert the final parameter vector back to a mixture GEV
+ */
+ mixgev_unpack_paramvector(p, np, mg);
+
+ free(p);
+ free(u);
+ free(wrk);
+ return eslOK;
+
+ ERROR:
+ if (p != NULL) free(p);
+ if (u != NULL) free(u);
+ if (wrk != NULL) free(wrk);
+ return status;
+}
+#endif /*eslAUGMENT_MINIMIZER*/
+/*--------------------------- end fitting ----------------------------------*/
+
+
+
+
+/****************************************************************************
+ * Example main()
+ ****************************************************************************/
+
+#ifdef eslMIXGEV_EXAMPLE
+/*::cexcerpt::mixgev_example::begin::*/
+/* compile:
+ gcc -g -Wall -I. -L. -o example -DeslMIXGEV_EXAMPLE esl_mixgev.c -leasel -lm
+ * run: ./example
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include "easel.h"
+#include "esl_mixgev.h"
+#include "esl_random.h"
+
+int
+main(int argc, char **argv)
+{
+ FILE *fp;
+ ESL_RANDOMNESS *r; /* source of random numbers */
+ ESL_MIXGEV *mg; /* mixture GEV to sample from */
+ ESL_MIXGEV *emg; /* estimated mixture GEV */
+ double *x; /* sampled dataset */
+ int n = 100000; /* number of samples */
+ int i;
+ int k;
+ double nll;
+ double min, max;
+
+ r = esl_randomness_Create(42);
+ mg = esl_mixgev_Create(2);
+ mg->q[0] = 0.85; mg->q[1] = 0.15;
+ mg->mu[0] = -2.72; mg->mu[1] = -2.0;
+ mg->lambda[0] = 2.5; mg->lambda[1] = 1.0;
+ mg->alpha[0] = 0.; mg->alpha[1] = 0.09;
+
+ nll = 0.;
+ min = 99999;
+ max = -99999;
+
+ x = malloc(sizeof(double) * n);
+ for (i = 0; i < n; i++)
+ {
+ x[i] = esl_mixgev_Sample(r, mg);
+ nll -= esl_mixgev_logpdf(x[i], mg);
+ if (x[i] > max) max = x[i];
+ if (x[i] < min) min = x[i];
+ }
+ printf("NLL of known mixGEV: %g\n", nll);
+
+ /* Dump the raw data samples to an R file.
+ */
+ fp = fopen("data.out", "w");
+ fprintf(fp, " val\n");
+ for (i = 0; i < n; i++)
+ fprintf(fp, "%d %f\n", i+1, x[i]);
+ fclose(fp);
+
+ emg = esl_mixgev_Create(2);
+ esl_mixgev_FitGuess(r, x, n, emg);
+ /* esl_mixgev_Copy(mg, emg); */
+ esl_mixgev_ForceGumbel(emg, 0);
+ esl_mixgev_FitComplete(x, n, emg);
+
+ printf("Component q mu lambda alpha\n");
+ for (k=0; k < 2; k++)
+ printf("%d\t%7.4f\t%7.2f\t%7.4f\t%7.4f\n",
+ k, emg->q[k], emg->mu[k], emg->lambda[k], emg->alpha[k]);
+
+ nll = 0.;
+ for (i = 0; i < n; i++)
+ nll -= esl_mixgev_logpdf(x[i], emg);
+ printf("NLL of fitted mixGEV: %g\n", nll);
+
+ /* Dump some R commands for showing these distributions
+ */
+ printf("library(ismev)\n");
+ printf("library(evd)\n");
+
+ printf("d <- read.table(\"data.out\")$val\n");
+ printf("plot(density(d,bw=0.2), log=\"y\")\n");
+ printf("min <- %f\n", min);
+ printf("max <- %f\n", max);
+ printf("xax <- seq(min-2, max+5, by=0.1)\n");
+ printf("cc <- xax - xax\n");
+ printf("zc <- xax - xax\n");
+ for (k = 0; k < mg->K; k++)
+ {
+ printf("c%d <- %f * dgev(xax, %f, %f, %f)\n",
+ k, mg->q[k], mg->mu[k], 1./mg->lambda[k], mg->alpha[k]);
+ printf("cc <- cc + c%d\n", k);
+ printf("lines(xax, c%d, col=\"blue\")\n", k);
+ }
+ for (k = 0; k < emg->K; k++)
+ {
+ printf("z%d <- %f * dgev(xax, %f, %f, %f)\n",
+ k, emg->q[k], emg->mu[k], 1./emg->lambda[k], emg->alpha[k]);
+ printf("zc <- zc + z%d\n", k);
+ printf("lines(xax, z%d, col=\"blue\")\n", k);
+ }
+ printf("lines(xax, cc, col=\"green\")\n");
+ printf("lines(xax, zc, col=\"red\")\n");
+
+ esl_mixgev_Destroy(mg);
+ esl_mixgev_Destroy(emg);
+ esl_randomness_Destroy(r);
+ free(x);
+ return 0;
+}
+/*::cexcerpt::mixgev_example::end::*/
+#endif /*eslMIXGEV_EXAMPLE*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_mixgev.h b/esl_mixgev.h
new file mode 100644
index 0000000..94326e0
--- /dev/null
+++ b/esl_mixgev.h
@@ -0,0 +1,63 @@
+/* Mixture generalized extreme value distributions.
+ *
+ * SRE, Mon Aug 15 08:33:57 2005 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslMIXGEV_INCLUDED
+#define eslMIXGEV_INCLUDED
+
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+
+typedef struct {
+ double *q; /* mixture coefficients [0..K-1]*/
+ double *mu; /* location parameters [0..K-1]*/
+ double *lambda; /* scale parameters [0..K-1]*/
+ double *alpha; /* shape parameters [0..K-1]*/
+ double *wrk; /* tmp vector needed for logpdf calc */
+ int *isgumbel; /* flag:TRUE to constrain k to Gumbel*/
+ int K; /* # of components */
+} ESL_MIXGEV;
+
+
+
+extern ESL_MIXGEV *esl_mixgev_Create(int K);
+extern void esl_mixgev_Destroy(ESL_MIXGEV *mg);
+extern int esl_mixgev_Copy(ESL_MIXGEV *dest, ESL_MIXGEV *src);
+extern int esl_mixgev_ForceGumbel(ESL_MIXGEV *mg, int which);
+
+extern double esl_mixgev_pdf (double x, ESL_MIXGEV *mg);
+extern double esl_mixgev_logpdf (double x, ESL_MIXGEV *mg);
+extern double esl_mixgev_cdf (double x, ESL_MIXGEV *mg);
+extern double esl_mixgev_logcdf (double x, ESL_MIXGEV *mg);
+extern double esl_mixgev_surv (double x, ESL_MIXGEV *mg);
+extern double esl_mixgev_logsurv(double x, ESL_MIXGEV *mg);
+extern double esl_mixgev_invcdf (double p, ESL_MIXGEV *mg);
+
+extern double esl_mixgev_generic_pdf (double x, void *params);
+extern double esl_mixgev_generic_cdf (double x, void *params);
+extern double esl_mixgev_generic_surv (double x, void *params);
+extern double esl_mixgev_generic_invcdf(double p, void *params);
+
+extern int esl_mixgev_Plot(FILE *fp, ESL_MIXGEV *mg,
+ double (*func)(double x, ESL_MIXGEV *mg),
+ double xmin, double xmax, double xstep);
+
+#ifdef eslAUGMENT_RANDOM
+extern double esl_mixgev_Sample(ESL_RANDOMNESS *r, ESL_MIXGEV *mg);
+extern int esl_mixgev_FitGuess(ESL_RANDOMNESS *r, double *x, int n,
+ ESL_MIXGEV *mg);
+#endif /*eslAUGMENT_RANDOM*/
+
+
+#ifdef eslAUGMENT_MINIMIZER
+extern int esl_mixgev_FitComplete(double *x, int n, ESL_MIXGEV *mg);
+#endif /*eslAUGMENT_MINIMIZER*/
+
+
+#endif /*eslMIXGEV_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_mpi.c b/esl_mpi.c
new file mode 100644
index 0000000..ddf6ed5
--- /dev/null
+++ b/esl_mpi.c
@@ -0,0 +1,1238 @@
+/* Support for MPI parallelization.
+ *
+ * Only available when the entire Easel library is in use (HAVE_MPI
+ * and eslLIBRARY are defined).
+ *
+ * Contents:
+ * 1. Communicating optional arrays.
+ * 2. Communicating ESL_SQ (single biosequences)
+ * 3. Communicating ESL_MSA (multiple sequence alignments).
+ * 4. Communicating ESL_STOPWATCH (process timing).
+ * 5. Unit tests.
+ * 6. Test driver.
+ * 7. Example.
+ * 8. Copyright and license information.
+ */
+#include "esl_config.h"
+#if defined(HAVE_MPI) && defined(eslLIBRARY)
+#include <string.h>
+#include "mpi.h"
+
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_sq.h"
+#include "esl_stopwatch.h"
+#include "esl_mpi.h"
+
+
+
+/*****************************************************************
+ *# 1. Communicating optional arrays.
+ *****************************************************************/
+
+/* Function: esl_mpi_PackOpt()
+ * Synopsis: Pack an optional, variable-sized array (or string).
+ * Incept: SRE, Sat Jun 2 08:40:39 2007 [Janelia]
+ *
+ * Purpose: Pack data array <inbuf> of <incount> elements of type <type> into
+ * an MPI packed buffer <pack_buf> of total size <pack_buf_size> destined
+ * for MPI communicator <comm> that is currently filled to position <*position>.
+ *
+ * <inbuf> may be <NULL>, in which case <incount> is
+ * assumed to be 0, and a `null array' is packed that
+ * <esl_mpi_UnpackOpt()> knows how to decode as a <NULL>
+ * pointer.
+ *
+ * As a special case for strings, if <type> is <MPI_CHAR>,
+ * <incount> may be passed as <-1> to indicate `unknown';
+ * the routine will use <strlen(inbuf)+1> to determine the
+ * size of the string including its <NUL> terminator.
+ *
+ * Returns: <eslOK> on success, the array is packed into <pack_buf>,
+ * and the <*position> counter is updated to point to the next byte
+ * in <pack_buf> after the packed array.
+ *
+ * Throws: <eslESYS> if an MPI call fails.
+ */
+int
+esl_mpi_PackOpt(void *inbuf, int incount, MPI_Datatype type, void *pack_buf, int pack_buf_size, int *position, MPI_Comm comm)
+{
+ if (inbuf == NULL) {
+ incount = 0;
+ if (MPI_Pack(&incount, 1, MPI_INT, pack_buf, pack_buf_size, position, comm) != 0) ESL_EXCEPTION(eslESYS, "MPI pack failed");
+ } else {
+ if (incount == -1 && type == MPI_CHAR) incount = strlen(inbuf) + 1;
+ if (MPI_Pack(&incount, 1, MPI_INT, pack_buf, pack_buf_size, position, comm) != 0) ESL_EXCEPTION(eslESYS, "MPI pack failed");
+ if (MPI_Pack(inbuf, incount, type, pack_buf, pack_buf_size, position, comm) != 0) ESL_EXCEPTION(eslESYS, "MPI pack failed");
+ }
+ return eslOK;
+}
+
+/* Function: esl_mpi_PackOptSize()
+ * Synopsis: Determine the size of a packed optional, variable-sized array.
+ * Incept: SRE, Sat Jun 2 10:09:16 2007 [Janelia]
+ *
+ * Purpose: Determine an upper bound on the size (in bytes) required
+ * to pack an array <inbuf> of <incount> elements of type
+ * <type> destined for MPI communicator <comm> using
+ * <esl_mpi_PackOpt()>, and return it in <*ret_n>.
+ *
+ * If <inbuf> is non-<NULL>, the packed message consists
+ * of 1 integer (the length, <incount>) followed by the array.
+ * If <inbuf> is <NULL>, the packed message consists of one
+ * integer (0).
+ *
+ * As a special case for strings, if <type> is <MPI_CHAR>,
+ * <incount> may be passed as <-1> to indicate `unknown';
+ * in this case, the routine uses <strlen(inbuf)+1> to determine the
+ * size of the string including its <NUL> terminator.
+ *
+ * Returns: <eslOK> on success, and <*ret_n> contains the upper limit size in
+ * bytes.
+ *
+ * Throws: <eslESYS> if an MPI call fails, and <*ret_n> is 0.
+ */
+int
+esl_mpi_PackOptSize(void *inbuf, int incount, MPI_Datatype type, MPI_Comm comm, int *ret_n)
+{
+ int status;
+ int sz;
+
+ *ret_n = 0;
+ if (inbuf == NULL) {
+ status = MPI_Pack_size(1, MPI_INT, MPI_COMM_WORLD, &sz); *ret_n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi pack size failed");
+ } else {
+ if (incount == -1 && type == MPI_CHAR) incount = strlen(inbuf) + 1;
+ status = MPI_Pack_size(1, MPI_INT, MPI_COMM_WORLD, &sz); *ret_n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi pack size failed");
+ status = MPI_Pack_size(incount, type, MPI_COMM_WORLD, &sz); *ret_n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi pack size failed");
+ }
+ return eslOK;
+
+ ERROR:
+ *ret_n = 0;
+ return status;
+}
+
+
+
+/* Function: esl_mpi_UnpackOpt()
+ * Synopsis: Unpack an optional, variable-sized array (or string).
+ * Incept: SRE, Sat Jun 2 08:39:39 2007 [Janelia]
+ *
+ * Purpose: Unpack a packed MPI message in buffer <pack_buf>, of total size
+ * <pack_buf_size>, at current position <*pos> in <pack_buf>,
+ * for MPI communicator <comm>, where the next packed element is an optional
+ * array of type <type>, consisting of a <(n,data)> pair, with <n=0>
+ * indicating no data.
+ *
+ * If array data is present (<n>0>), allocate <*outbuf>,
+ * put the array in it, and optionally return <n> in
+ * <*opt_n>. The caller is responsible for free'ing this
+ * <*outbuf>.
+ *
+ * If data are not present (<n=0>), no allocation is done,
+ * <*outbuf> is set to <NULL>, and the optional <*opt_n> is
+ * 0.
+ *
+ * <*pos> is updated to point at the next element in <pack_buf>
+ * that needs to be unpacked.
+ *
+ * This routine is designed for an optional-array idiom in
+ * which <array==NULL> means the array isn't available, and
+ * otherwise the array contains valid data. For instance,
+ * this is used for optional annotation on multiple
+ * alignments.
+ *
+ * Returns: <eslOK> on success; <*pos> is updated; <*outbuf> is either a newly allocated
+ * array (that caller is responsible for freeing) and optional <*opt_n>
+ * is its length, or <*outbuf> is <NULL> and optional <*opt_n> is 0.
+ *
+ * Throws: <eslESYS> on an MPI call failure; <eslEINVAL> if something's wrong
+ * with the arguments; <eslEMEM> on allocation failure.
+ * In either case, <*outbuf> is <NULL> and optional <*opt_n> is 0.
+ */
+int
+esl_mpi_UnpackOpt(void *pack_buf, int pack_buf_size, int *pos, void **outbuf, int *opt_n, MPI_Datatype type, MPI_Comm comm)
+{
+ int sz;
+ int status;
+
+ if (MPI_Unpack(pack_buf, pack_buf_size, pos, &sz, 1, MPI_INT, comm) != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+
+ if (sz == 0) {
+ *outbuf = NULL;
+ } else {
+ if (type == MPI_CHAR) ESL_ALLOC(*outbuf, sizeof(char) * sz);
+ else if (type == MPI_SHORT) ESL_ALLOC(*outbuf, sizeof(short) * sz);
+ else if (type == MPI_INT) ESL_ALLOC(*outbuf, sizeof(int) * sz);
+ else if (type == MPI_LONG) ESL_ALLOC(*outbuf, sizeof(long) * sz);
+ else if (type == MPI_UNSIGNED_CHAR) ESL_ALLOC(*outbuf, sizeof(unsigned char) * sz);
+ else if (type == MPI_UNSIGNED_SHORT) ESL_ALLOC(*outbuf, sizeof(unsigned short) * sz);
+ else if (type == MPI_UNSIGNED) ESL_ALLOC(*outbuf, sizeof(unsigned int) * sz);
+ else if (type == MPI_UNSIGNED_LONG) ESL_ALLOC(*outbuf, sizeof(unsigned long) * sz);
+ else if (type == MPI_FLOAT) ESL_ALLOC(*outbuf, sizeof(float) * sz);
+ else if (type == MPI_DOUBLE) ESL_ALLOC(*outbuf, sizeof(double) * sz);
+ else if (type == MPI_LONG_DOUBLE) ESL_ALLOC(*outbuf, sizeof(long double) * sz);
+ else if (type == MPI_BYTE) ESL_ALLOC(*outbuf, sz);
+ else if (type == MPI_PACKED) ESL_ALLOC(*outbuf, sz);
+ else ESL_XEXCEPTION(eslEINVAL, "no such MPI datatype");
+
+ if (MPI_Unpack(pack_buf, pack_buf_size, pos, *outbuf, sz, type, comm) != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ }
+ if (opt_n != NULL) *opt_n = sz;
+ return eslOK;
+
+ ERROR:
+ if (*outbuf != NULL) free(*outbuf);
+ *outbuf = NULL;
+ if (opt_n != NULL) *opt_n = 0;
+ return status;
+}
+/*--------------------- end, optional arrays -------------------*/
+
+
+
+/*****************************************************************
+ *# 2. Communicating ESL_SQ (single biosequences)
+ *****************************************************************/
+
+/* Function: esl_sq_MPISend()
+ * Synopsis: Send an ESL_SQ as an MPI work unit.
+ * Incept: ER, Thu Jun 19 10:39:49 EDT 2008 [Janelia]
+ *
+ * Purpose: Sends an <ESL_SQ> <esl_sq> as a work unit to MPI process
+ * <dest> (where <dest> ranges from 0..<nproc-1>), tagged
+ * with MPI tag <tag>, for MPI communicator <comm>, as
+ * the sole workunit or result.
+ *
+ * Work units are prefixed by a status code. If <esl_sq> is
+ * <non-NULL>, the work unit is an <eslOK> code followed by
+ * the packed <ESL_SQ>. If <esl_sq> is NULL, the work unit is an
+ * <eslEOD> code, which <esl_sq_MPIRecv()> knows how to
+ * interpret; this is typically used for an end-of-data
+ * signal to cleanly shut down worker processes.
+ *
+ * In order to minimize alloc/free cycles in this routine,
+ * caller passes a pointer to a working buffer <*buf> of
+ * size <*nalloc> characters. If necessary (i.e. if <esl_sq> is
+ * too big to fit), <*buf> will be reallocated and <*nalloc>
+ * increased to the new size. As a special case, if <*buf>
+ * is <NULL> and <*nalloc> is 0, the buffer will be
+ * allocated appropriately, but the caller is still
+ * responsible for free'ing it.
+ *
+ * Returns: <eslOK> on success; <*buf> may have been reallocated and
+ * <*nalloc> may have been increased.
+ *
+ * Throws: <eslESYS> if an MPI call fails; <eslEMEM> if a malloc/realloc
+ * fails. In either case, <*buf> and <*nalloc> remain valid and useful
+ * memory (though the contents of <*buf> are undefined).
+ *
+ */
+int
+esl_sq_MPISend(ESL_SQ *sq, int dest, int tag, MPI_Comm comm, char **buf, int *nalloc)
+{
+ int status;
+ int code;
+ int sz, n, pos;
+
+ /* Figure out size */
+ if (MPI_Pack_size(1, MPI_INT, comm, &n) != 0) ESL_XEXCEPTION(eslESYS, "mpi pack size failed");
+ if (sq != NULL) {
+ if ((status = esl_sq_MPIPackSize(sq, comm, &sz)) != eslOK) return status;
+ n += sz;
+ }
+ ESL_DPRINTF2(("esl_sq_MPISend(): sq has size %d\n", n));
+
+ /* Make sure the buffer is allocated appropriately */
+ if (*buf == NULL || n > *nalloc) {
+ void *tmp;
+ ESL_RALLOC(*buf, tmp, sizeof(char) * n);
+ *nalloc = n;
+ }
+ ESL_DPRINTF2(("esl_sq_MPISend(): buffer is ready\n"));
+
+ /* Pack the status code and ESL_SQ into the buffer */
+ pos = 0;
+ code = (sq == NULL) ? eslEOD : eslOK;
+ if (MPI_Pack(&code, 1, MPI_INT, *buf, n, &pos, comm) != 0) ESL_EXCEPTION(eslESYS, "mpi pack failed");
+ if (sq != NULL) {
+ if ((status = esl_sq_MPIPack(sq, *buf, n, &pos, comm)) != eslOK) return status;
+ }
+ ESL_DPRINTF2(("esl_sq_MPISend(): sq is packed into %d bytes\n", pos));
+
+ /* Send the packed ESL_SQ to the destination. */
+ if (MPI_Send(*buf, n, MPI_PACKED, dest, tag, comm) != 0) ESL_EXCEPTION(eslESYS, "mpi send failed");
+ ESL_DPRINTF2(("esl_sq_MPISend(): sq is sent.\n"));
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_sq_MPIPackSize()
+ * Synopsis: Calculates size needed to pack an ESL_SQ.
+ * Incept: ER, Thu Jun 19 10:48:25 EDT 2008 [Janelia]
+ *
+ * Purpose: Calculate an upper bound on the number of bytes
+ * that <esl_sq_MPIPack()> will need to pack an <ESL_SQ>
+ * <sq> in a packed MPI message for MPI communicator
+ * <comm>; return that number of bytes in <*ret_n>.
+ *
+ * Returns: <eslOK> on success, and <*ret_n> contains the answer.
+ *
+ * Throws: <eslESYS> if an MPI call fails, and <*ret_n> is 0.
+ */
+int
+esl_sq_MPIPackSize(ESL_SQ *sq, MPI_Comm comm, int *ret_n)
+{
+ int status;
+ int n = 0;
+ int x; /* index for optional extra residue markups */
+ int sz;
+
+ status = MPI_Pack_size ( 1, MPI_INT, comm, &sz); n += 5*sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ status = MPI_Pack_size ( 1, MPI_UNSIGNED_LONG, comm, &sz); n += 7*sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ status = MPI_Pack_size ( sq->nalloc, MPI_CHAR, comm, &sz); n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ status = MPI_Pack_size ( sq->aalloc, MPI_CHAR, comm, &sz); n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ status = MPI_Pack_size ( sq->dalloc, MPI_CHAR, comm, &sz); n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ status = MPI_Pack_size ( sq->srcalloc, MPI_CHAR, comm, &sz); n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+
+ /* sequence, digital or text; the ss and extra residue markups are optional */
+ if (sq->dsq != NULL) {
+ status = MPI_Pack_size ( sq->n+2, MPI_UNSIGNED_CHAR, comm, &sz); n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ status = esl_mpi_PackOptSize(sq->ss, sq->n+2, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ for (x = 0; x < sq->nxr; x ++) {
+ status = esl_mpi_PackOptSize(sq->xr_tag[x], sq->nalloc, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = esl_mpi_PackOptSize(sq->xr[x], sq->n+2, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ }
+
+ }
+ else {
+ status = MPI_Pack_size ( sq->n+1, MPI_CHAR, comm, &sz); n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ status = esl_mpi_PackOptSize(sq->ss, sq->n+1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ for (x = 0; x < sq->nxr; x ++) {
+ status = esl_mpi_PackOptSize(sq->xr_tag[x], sq->nalloc, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = esl_mpi_PackOptSize(sq->xr[x], sq->n+1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ }
+
+ }
+
+ *ret_n = n;
+ return eslOK;
+
+ ERROR:
+ *ret_n = 0;
+ return status;
+}
+
+/* Function: esl_sq_MPIPack()
+ * Synopsis: Packs an <ESL_SQ> into MPI buffer.
+ * Incept: ER, Thu Jun 19 10:49:10 EDT 2008 [Janelia]
+ *
+ * Purpose: Packs <ESL_SQ> <esl_sq> into an MPI packed message buffer <buf>
+ * of length <n> bytes, starting at byte position <*position>,
+ * for MPI communicator <comm>.
+ *
+ * The caller must know that <buf>'s allocation of <n>
+ * bytes is large enough to append the packed <ESL_SQ> at
+ * position <*pos>. This typically requires a call to
+ * <esl_sq_MPIPackSize()> first, and reallocation if
+ * needed.
+ *
+ * Returns: <eslOK> on success; <buf> now contains the
+ * packed <esl_sq>, and <*position> is set to the byte
+ * immediately following the last byte of the <ESL_SQ>
+ * in <buf>.
+ *
+ * Throws: <eslESYS> if an MPI call fails; or <eslEMEM> if the
+ * buffer's length <n> was overflowed in trying to pack
+ * <sq> into <buf>. In either case, the state of
+ * <buf> and <*position> is undefined, and both should
+ * be considered to be corrupted.
+ */
+int
+esl_sq_MPIPack(ESL_SQ *sq, char *buf, int n, int *pos, MPI_Comm comm)
+{
+ unsigned long int sq_n;
+ unsigned long int start;
+ unsigned long int end;
+ unsigned long int C;
+ unsigned long int W;
+ unsigned long int L;
+ unsigned long int salloc;
+ int x; /* index for optional extra residue markups */
+ int status;
+
+ sq_n = (unsigned long int)sq->n;
+ start = (unsigned long int)sq->start;
+ end = (unsigned long int)sq->end;
+ C = (unsigned long int)sq->C;
+ W = (unsigned long int)sq->W;
+ L = (unsigned long int)sq->L;
+ salloc = (unsigned long int)sq->salloc;
+
+ /* pack allocation values */
+ status = MPI_Pack (( int *) &(sq->nalloc), 1, MPI_INT, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack (( int *) &(sq->aalloc), 1, MPI_INT, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack (( int *) &(sq->dalloc), 1, MPI_INT, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack (( int *) &(sq->srcalloc), 1, MPI_INT, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack (( int *) &(sq->nxr), 1, MPI_INT, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack ((unsigned long int *) &( salloc), 1, MPI_UNSIGNED_LONG, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+
+ /* pack coordenate info */
+ status = MPI_Pack ((unsigned long int *) &(sq_n), 1, MPI_UNSIGNED_LONG, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack ((unsigned long int *) &(start), 1, MPI_UNSIGNED_LONG, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack ((unsigned long int *) &(end), 1, MPI_UNSIGNED_LONG, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack ((unsigned long int *) &(C), 1, MPI_UNSIGNED_LONG, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack ((unsigned long int *) &(W), 1, MPI_UNSIGNED_LONG, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack ((unsigned long int *) &(L), 1, MPI_UNSIGNED_LONG, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+
+ /* pack strings */
+ status = MPI_Pack (sq->name, sq->nalloc, MPI_CHAR, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack (sq->acc, sq->aalloc, MPI_CHAR, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack (sq->desc, sq->dalloc, MPI_CHAR, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack (sq->source, sq->srcalloc, MPI_CHAR, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+
+ /* sequences, digital or text; the ss and extra residue markups are optional */
+ if (sq->dsq != NULL) {
+ status = MPI_Pack (sq->dsq, sq->n+2, MPI_UNSIGNED_CHAR, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = esl_mpi_PackOpt(sq->ss, sq->n+2, MPI_CHAR, buf, n, pos, comm); if (status != eslOK) return status;
+ for (x = 0; x < sq->nxr; x ++) {
+ status = esl_mpi_PackOpt(sq->xr_tag[x], sq->nalloc, MPI_CHAR, buf, n, pos, comm); if (status != eslOK) return status;
+ status = esl_mpi_PackOpt(sq->xr[x], sq->n+2, MPI_CHAR, buf, n, pos, comm); if (status != eslOK) return status;
+ }
+ }
+ else {
+ status = MPI_Pack (sq->seq, sq->n+1, MPI_CHAR, buf, n, pos, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = esl_mpi_PackOpt(sq->ss, sq->n+1, MPI_CHAR, buf, n, pos, comm); if (status != eslOK) return status;
+ for (x = 0; x < sq->nxr; x ++) {
+ status = esl_mpi_PackOpt(sq->xr_tag[x], sq->nalloc, MPI_CHAR, buf, n, pos, comm); if (status != eslOK) return status;
+ status = esl_mpi_PackOpt(sq->xr[x], sq->n+1, MPI_CHAR, buf, n, pos, comm); if (status != eslOK) return status;
+ }
+ }
+
+ if (*pos > n) ESL_EXCEPTION(eslEMEM, "buffer overflow");
+ return eslOK;
+}
+
+/* Function: esl_sq_MPIUnpack()
+ * Synopsis: Unpacks an <ESL_SQ> from an MPI buffer.
+ * Incept: SRE, Thu Jun 7 11:04:46 2007 [Janelia]
+ *
+ * Purpose: Unpack a newly allocated <ESL_SQ> from MPI packed buffer
+ * <buf>, starting from position <*pos>, where the total length
+ * of the buffer in bytes is <n>.
+ *
+ * Caller may or may not already know what alphabet the <ESL_SQ>
+ * is expected to be in.
+ *
+ * Returns: <eslOK> on success. <*pos> is updated to the position of
+ * the next element in <buf> to unpack (if any). <*ret_hmm>
+ * contains a newly allocated <ESL_SQ>, which the caller is
+ * responsible for free'ing.
+ *
+ *
+ * Throws: <eslESYS> on an MPI call failure. <eslEMEM> on allocation failure.
+ * In either case, <*ret_esl_sq> is <NULL>, and the state of <buf>
+ * and <*pos> is undefined and should be considered to be corrupted.
+ */
+int
+esl_sq_MPIUnpack(const ESL_ALPHABET *abc, char *buf, int n, int *pos, MPI_Comm comm, ESL_SQ **ret_sq)
+{
+ ESL_SQ *sq = NULL;
+ unsigned long int sq_n;
+ unsigned long int start;
+ unsigned long int end;
+ unsigned long int C;
+ unsigned long int W;
+ unsigned long int L;
+ unsigned long int salloc;
+ int x; /* index for optional extra residue markups */
+ int do_digital = FALSE;
+ int status;
+
+ if (abc != NULL) do_digital = TRUE;
+
+ /* allocate sq */
+ ESL_ALLOC(sq, sizeof(ESL_SQ));
+
+ /* unpack allocation values */
+ status = MPI_Unpack(buf, n, pos, &(sq->nalloc), 1, MPI_INT, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack(buf, n, pos, &(sq->aalloc), 1, MPI_INT, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack(buf, n, pos, &(sq->dalloc), 1, MPI_INT, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack(buf, n, pos, &(sq->srcalloc), 1, MPI_INT, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack(buf, n, pos, &(sq->nxr), 1, MPI_INT, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack(buf, n, pos, &(salloc), 1, MPI_UNSIGNED_LONG, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+
+ /* unpack coordenate info */
+ status = MPI_Unpack(buf, n, pos, &(sq_n), 1, MPI_UNSIGNED_LONG, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack(buf, n, pos, &(start), 1, MPI_UNSIGNED_LONG, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack(buf, n, pos, &(end), 1, MPI_UNSIGNED_LONG, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack(buf, n, pos, &(C), 1, MPI_UNSIGNED_LONG, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack(buf, n, pos, &(W), 1, MPI_UNSIGNED_LONG, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack(buf, n, pos, &(L), 1, MPI_UNSIGNED_LONG, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+
+ sq->salloc = (int64_t) salloc;
+ sq->n = (int64_t) sq_n;
+ sq->start = (int64_t) start;
+ sq->end = (int64_t) end;
+ sq->C = (int64_t) C;
+ sq->W = (int64_t) W;
+ sq->L = (int64_t) L;
+
+ /* allocate strings */
+ sq->name = NULL; ESL_ALLOC(sq->name, sizeof(char) * sq->nalloc);
+ sq->acc = NULL; ESL_ALLOC(sq->acc, sizeof(char) * sq->aalloc);
+ sq->desc = NULL; ESL_ALLOC(sq->desc, sizeof(char) * sq->dalloc);
+ sq->source = NULL; ESL_ALLOC(sq->source, sizeof(char) * sq->srcalloc);
+ sq->seq = NULL; if (!do_digital) ESL_ALLOC(sq->seq, sizeof(char) * sq->salloc);
+ sq->dsq = NULL; if ( do_digital) ESL_ALLOC(sq->dsq, sizeof(ESL_DSQ) * sq->salloc);
+ sq->ss = NULL; /* ss and extra residue markups are optional - they will only be allocated if needed */
+ sq->xr_tag = NULL;
+ sq->xr = NULL;
+
+ /* unpack strings */
+ status = MPI_Unpack (buf, n, pos, sq->name, sq->nalloc, MPI_CHAR, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack (buf, n, pos, sq->acc, sq->aalloc, MPI_CHAR, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack (buf, n, pos, sq->desc, sq->dalloc, MPI_CHAR, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack (buf, n, pos, sq->source, sq->srcalloc, MPI_CHAR, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+
+ if (do_digital) {
+ status = MPI_Unpack (buf, n, pos, sq->dsq, sq->n+2, MPI_UNSIGNED_CHAR, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ }
+ else {
+ status = MPI_Unpack (buf, n, pos, sq->seq, sq->n+1, MPI_CHAR, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ }
+
+ /* unpack the optional ss */
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(sq->ss), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+
+ /* unpack the optional extra residue markups */
+ if (sq->nxr > 0) {
+ ESL_ALLOC(sq->xr, sizeof(char *) * sq->nxr);
+ ESL_ALLOC(sq->xr_tag, sizeof(char *) * sq->nxr);
+ for (x = 0; x < sq->nxr; x ++) {
+ sq->xr[x] = NULL;
+ sq->xr_tag[x] = NULL;
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(sq->xr_tag[x]), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(sq->xr[x]), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ }
+ }
+
+ /* set disk offset bookkeeping */
+ sq->doff = -1;
+ sq->roff = -1;
+ sq->eoff = -1;
+
+ /* pointer to alphabet */
+ if (do_digital) sq->abc = abc;
+
+ *ret_sq = sq;
+ return eslOK;
+
+ ERROR:
+ if (sq != NULL) esl_sq_Destroy(sq);
+ *ret_sq = NULL;
+ return status;
+}
+
+
+/* Function: esl_sq_MPIRecv()
+ * Synopsis: Receives an <ESL_SQ> as a work unit from an MPI sender.
+ * Incept: ER, Thu Jun 19 10:53:40 EDT 2008 [Janelia]
+ *
+ * Purpose: Receive a work unit that consists of a single <ESL_SQ>
+ * sent by MPI <source> (<0..nproc-1>, or
+ * <MPI_ANY_SOURCE>) tagged as <tag> for MPI communicator <comm>.
+ *
+ * Work units are prefixed by a status code. If the unit's
+ * code is <eslOK> and no errors are encountered, this
+ * routine will return <eslOK> and a non-<NULL> <*ret_esl_sq>.
+ * If the unit's code is <eslEOD> (a shutdown signal),
+ * this routine returns <eslEOD> and <*ret_esl_sq> is <NULL>.
+ *
+ * Caller provides a working buffer <*buf> of size
+ * <*nalloc> characters. These are passed by reference, so
+ * that <*buf> can be reallocated and <*nalloc> increased
+ * if necessary. As a special case, if <*buf> is <NULL> and
+ * <*nalloc> is 0, the buffer will be allocated
+ * appropriately, but the caller is still responsible for
+ * free'ing it.
+ *
+ * Returns: <eslOK> on success. <*ret_esl_sq> contains the received <ESL_SQ>;
+ * it is allocated here, and the caller is responsible for
+ * free'ing it. <*buf> may have been reallocated to a
+ * larger size, and <*nalloc> may have been increased.
+ *
+ * Throws: <eslEMEM> on allocation error, in which case <*ret_esl_sq> is
+ * <NULL>.
+ */
+int
+esl_sq_MPIRecv(int source, int tag, MPI_Comm comm, const ESL_ALPHABET *abc, char **buf, int *nalloc, ESL_SQ **ret_sq)
+{
+ int status;
+ int code;
+ int n;
+ int pos;
+ MPI_Status mpistatus;
+
+ /* Probe first, because we need to know if our buffer is big enough. */
+ MPI_Probe(source, tag, comm, &mpistatus);
+ MPI_Get_count(&mpistatus, MPI_PACKED, &n);
+
+ /* Make sure the buffer is allocated appropriately */
+ if (*buf == NULL || n > *nalloc) {
+ void *tmp;
+ ESL_RALLOC(*buf, tmp, sizeof(char) * n);
+ *nalloc = n;
+ }
+
+ /* Receive the packed work unit */
+ MPI_Recv(*buf, n, MPI_PACKED, source, tag, comm, &mpistatus);
+
+ /* Unpack it, looking at the status code prefix for EOD/EOK */
+ pos = 0;
+ if (MPI_Unpack(*buf, n, &pos, &code, 1, MPI_INT, comm) != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ if (code == eslEOD) { *ret_sq = NULL; return eslEOD; }
+
+ return esl_sq_MPIUnpack(abc, *buf, *nalloc, &pos, comm, ret_sq);
+
+ ERROR:
+ return status;
+}
+/*----------------- end, ESL_SQ communication -------------------*/
+
+
+/*****************************************************************
+ *# 3. Communicating ESL_MSA (multiple sequence alignments).
+ *****************************************************************/
+
+/* Function: esl_msa_MPISend()
+ * Synopsis: Send essential msa info as an MPI work unit.
+ *
+ * Purpose: Sends the essential elements of a multiple alignment <msa>
+ * as a work unit to MPI process <dest> (<dest> ranges from <0..nproc-1>),
+ * tagging the message with MPI tag <tag> for MPI communicator
+ * <comm>. The receiver uses <esl_msa_MPIRecv()> to receive the MSA.
+ *
+ * Work units are prefixed by a status code. If <msa> is
+ * <non-NULL>, the work unit is an <eslOK> code followed by
+ * the packed MSA. If <msa> is NULL, the work unit is an
+ * <eslEOD> code, which <esl_msa_hmm_MPIRecv()> knows how
+ * to interpret; this is typically used for an end-of-data
+ * signal to cleanly shut down worker processes.
+ *
+ * Only an essential subset of the elements in <msa> are
+ * transmitted, sufficient to do computationally intensive
+ * work on the <msa>. Most msa annotation is not
+ * transmitted, for example. Specifically, <name>, <nseq>,
+ * <alen>, <flags>, <wgt>, <ax> or <aseq>, <desc>, <acc>,
+ * <au>, <ss_cons>, <sa_cons>, <rf>, <cutoff>, and <cutset>
+ * are transmitted.
+ *
+ * In order to minimize alloc/free cycles, caller passes a
+ * pointer to a working buffer <*buf> of size <*nalloc>
+ * characters. If necessary (i.e. if <msa> is too big to
+ * fit), <*buf> will be reallocated and <*nalloc> increased
+ * to the new size. As a special case, if <*buf> is <NULL>
+ * and <*nalloc> is 0, the buffer will be allocated
+ * appropriately, but the caller is still responsible for
+ * free'ing it.
+ *
+ * Args: msa - msa to send
+ * dest - MPI destination (0..nproc-1)
+ * tag - MPI tag
+ * buf - pointer to a working buffer
+ * nalloc - current allocated size of <*buf>, in characters
+ *
+ * Returns: <eslOK> on success; <*buf> may have been reallocated and
+ * <*nalloc> may have been increased.
+ *
+ * Throws: <eslESYS> if an MPI call fails; <eslEMEM> if a malloc/realloc
+ * fails. In either case, <*buf> and <*nalloc> remain valid and useful
+ * memory (though the contents of <*buf> are undefined).
+ *
+ * Xref: J1/72.
+ */
+int
+esl_msa_MPISend(const ESL_MSA *msa, int dest, int tag, MPI_Comm comm, char **buf, int *nalloc)
+{
+ int status;
+ int code;
+ int sz, n, position;
+
+ /* First, figure out the size of the MSA */
+ if (MPI_Pack_size(1, MPI_INT, comm, &n) != 0) ESL_EXCEPTION(eslESYS, "mpi pack size failed");
+ if (msa != NULL) {
+ if ((status = esl_msa_MPIPackSize(msa, comm, &sz)) != eslOK) return status;
+ n += sz;
+ }
+ ESL_DPRINTF2(("esl_msa_MPISend(): msa has size %d\n", n));
+
+ /* Make sure the buffer is allocated appropriately */
+ if (*buf == NULL || n > *nalloc) {
+ void *tmp;
+ ESL_RALLOC(*buf, tmp, sizeof(char) * n);
+ *nalloc = n;
+ }
+ ESL_DPRINTF2(("esl_msa_MPISend(): buffer is ready\n"));
+
+ /* Pack the status code and MSA into the buffer */
+ position = 0;
+ code = (msa == NULL) ? eslEOD : eslOK;
+ if (MPI_Pack(&code, 1, MPI_INT, *buf, n, &position, comm) != 0) ESL_EXCEPTION(eslESYS, "mpi pack failed");
+ if (msa != NULL) {
+ if ((status = esl_msa_MPIPack(msa, *buf, n, &position, comm)) != eslOK) return status;
+ }
+ ESL_DPRINTF2(("esl_msa_MPISend(): msa is packed into %d bytes\n", position));
+
+ /* Send the packed profile to destination */
+ if (MPI_Send(*buf, n, MPI_PACKED, dest, tag, comm) != 0) ESL_EXCEPTION(eslESYS, "mpi send failed");
+ ESL_DPRINTF2(("esl_msa_MPISend(): msa is sent.\n"));
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+
+/* Function: esl_msa_MPIPackSize()
+ * Synopsis: Calculates number of bytes needed to pack an MSA.
+ * Incept: SRE, Wed Jun 6 11:36:22 2007 [Janelia]
+ *
+ * Purpose: Calculate an upper bound on the number of bytes
+ * that <esl_msa_MPIPack()> will need to pack an
+ * essential subset of the data in MSA <msa>
+ * in a packed MPI message in communicator <comm>;
+ * return that number of bytes in <*ret_n>.
+ *
+ * Caller will generally use this result to determine how
+ * to allocate a buffer before starting to pack into it.
+ *
+ * If <msa> is <NULL> (which can happen, if <msa> is
+ * optional in the caller), size <*ret_n> is set to 0.
+ *
+ * Returns: <eslOK> on success, and <*ret_n> contains the answer.
+ *
+ * Throws: <eslESYS> if an MPI call fails, and <*ret_n> is set to 0.
+ *
+ * Xref: J1/78-79.
+ *
+ * Note: The sizing calls here need to stay matched up with
+ * the calls in <esl_msa_MPIPack()>.
+ */
+int
+esl_msa_MPIPackSize(const ESL_MSA *msa, MPI_Comm comm, int *ret_n)
+{
+ int status;
+ int sz;
+ int n = 0;
+ int i;
+
+ if (msa == NULL) { *ret_n = 0; return eslOK; }
+
+ status = MPI_Pack_size ( 1, MPI_INT, comm, &sz); n += 3*sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ status = MPI_Pack_size ( msa->nseq, MPI_DOUBLE, comm, &sz); n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ status = esl_mpi_PackOptSize(msa->name, -1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = esl_mpi_PackOptSize(msa->desc, -1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = esl_mpi_PackOptSize(msa->acc, -1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = esl_mpi_PackOptSize(msa->au, -1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = esl_mpi_PackOptSize(msa->ss_cons, msa->alen+1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = esl_mpi_PackOptSize(msa->sa_cons, msa->alen+1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = esl_mpi_PackOptSize(msa->pp_cons, msa->alen+1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = esl_mpi_PackOptSize(msa->rf, msa->alen+1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = esl_mpi_PackOptSize(msa->mm, msa->alen+1, MPI_CHAR, comm, &sz); n += sz; if (status != eslOK) goto ERROR;
+ status = MPI_Pack_size ( eslMSA_NCUTS, MPI_FLOAT, comm, &sz); n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ status = MPI_Pack_size ( eslMSA_NCUTS, MPI_INT, comm, &sz); n += sz; if (status != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+
+ /* alignment, digital or text: */
+ if (msa->ax != NULL) {
+ if ((status = MPI_Pack_size ( msa->alen+2, MPI_UNSIGNED_CHAR, comm, &sz)) != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ n += sz*msa->nseq;
+ } else {
+ if ((status = MPI_Pack_size ( msa->alen+1, MPI_CHAR, comm, &sz)) != 0) ESL_XEXCEPTION(eslESYS, "pack size failed");
+ n += sz*msa->nseq;
+ }
+
+ /* seqnames: */
+ for (i = 0; i < msa->nseq; i++) {
+ if ((status = esl_mpi_PackOptSize(msa->sqname[i], -1, MPI_CHAR, comm, &sz)) != eslOK) goto ERROR;
+ n += sz;
+ }
+
+ *ret_n = n;
+ return eslOK;
+
+ ERROR:
+ *ret_n = 0;
+ return status;
+}
+
+/* Function: esl_msa_MPIPack()
+ * Synopsis: Packs an MSA into MPI buffer.
+ * Incept: SRE, Wed Jun 6 13:17:45 2007 [Janelia]
+ *
+ * Purpose: Packs essential subset of data in MSA <msa> into an MPI
+ * packed message buffer <buf> of length <n> bytes,
+ * starting at byte position <*position>, for MPI
+ * communicator <comm>.
+ *
+ * If <msa> is <NULL> (which can happen, if <msa> is being
+ * treated as optional in the caller), does nothing, and
+ * just return <eslOK>.
+ *
+ * Returns: <eslOK> on success; <buf> now contains the
+ * packed <msa>, and <*position> is set to the byte
+ * immediately following the last byte of the MSA
+ * in <buf>.
+ *
+ * Throws: <eslESYS> if an MPI call fails; or <eslEMEM> if the
+ * buffer's length <n> is overflowed by trying to pack
+ * <msa> into <buf>. In either case, the state of
+ * <buf> and <*position> is undefined, and both should
+ * be considered to be corrupted.
+ *
+ * Xref: J1/78-79.
+ */
+int
+esl_msa_MPIPack(const ESL_MSA *msa, char *buf, int n, int *position, MPI_Comm comm)
+{
+ int status;
+ int i;
+
+ ESL_DPRINTF2(("esl_msa_MPIPack(): ready.\n"));
+
+ if (msa == NULL) return eslOK;
+
+ status = MPI_Pack ((void *) &(msa->nseq), 1, MPI_INT, buf, n, position, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack ((void *) &(msa->alen), 1, MPI_INT, buf, n, position, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack ((void *) &(msa->flags), 1, MPI_INT, buf, n, position, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack (msa->wgt, msa->nseq, MPI_DOUBLE, buf, n, position, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = esl_mpi_PackOpt(msa->name, -1, MPI_CHAR, buf, n, position, comm); if (status != eslOK) return status;
+ status = esl_mpi_PackOpt(msa->desc, -1, MPI_CHAR, buf, n, position, comm); if (status != eslOK) return status;
+ status = esl_mpi_PackOpt(msa->acc, -1, MPI_CHAR, buf, n, position, comm); if (status != eslOK) return status;
+ status = esl_mpi_PackOpt(msa->au, -1, MPI_CHAR, buf, n, position, comm); if (status != eslOK) return status;
+ status = esl_mpi_PackOpt(msa->ss_cons, msa->alen+1, MPI_CHAR, buf, n, position, comm); if (status != eslOK) return status;
+ status = esl_mpi_PackOpt(msa->sa_cons, msa->alen+1, MPI_CHAR, buf, n, position, comm); if (status != eslOK) return status;
+ status = esl_mpi_PackOpt(msa->pp_cons, msa->alen+1, MPI_CHAR, buf, n, position, comm); if (status != eslOK) return status;
+ status = esl_mpi_PackOpt(msa->rf, msa->alen+1, MPI_CHAR, buf, n, position, comm); if (status != eslOK) return status;
+ status = esl_mpi_PackOpt(msa->mm, msa->alen+1, MPI_CHAR, buf, n, position, comm); if (status != eslOK) return status;
+ status = MPI_Pack ((void *) msa->cutoff, eslMSA_NCUTS, MPI_FLOAT, buf, n, position, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ status = MPI_Pack ((void *) msa->cutset, eslMSA_NCUTS, MPI_INT, buf, n, position, comm); if (status != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+
+ for (i = 0; i < msa->nseq; i++) {
+ status = esl_mpi_PackOpt(msa->sqname[i], -1, MPI_CHAR, buf, n, position, comm); if (status != eslOK) return status;
+ if (msa->flags & eslMSA_DIGITAL) {
+ if ((status = MPI_Pack (msa->ax[i], msa->alen+2, MPI_UNSIGNED_CHAR, buf, n, position, comm)) != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ } else {
+ if ((status = MPI_Pack (msa->aseq[i], msa->alen+1, MPI_CHAR, buf, n, position, comm)) != 0) ESL_EXCEPTION(eslESYS, "pack failed");
+ }
+ }
+ ESL_DPRINTF2(("esl_msa_MPIPack(): done. Packed %d bytes into buffer of size %d\n", *position, n));
+
+ if (*position > n) ESL_EXCEPTION(eslEMEM, "buffer overflow");
+ return eslOK;
+}
+
+/* Function: esl_msa_MPIUnpack()
+ * Synopsis: Unpacks an MSA from an MPI buffer.
+ * Incept: SRE, Wed Jun 6 15:49:11 2007 [Janelia]
+ *
+ * Purpose: Unpack a newly allocated MSA from MPI packed buffer
+ * <buf>, starting from position <*pos>, where the total length
+ * of the buffer in bytes is <n>.
+ *
+ * MSAs are usually transmitted in digital mode. In digital
+ * mode, caller must provide the alphabet <abc> for this
+ * MSA. (Thus the caller already know it before the MSA
+ * arrives, by an appropriate initialization.) If MSAs are
+ * being transmitted in text mode, <abc> is ignored; caller
+ * may pass <NULL> for it.
+ *
+ * Returns: <eslOK> on success. <*pos> is updated to the position of
+ * the next element in <buf> to unpack (if any). <*ret_msa>
+ * contains a newly allocated MSA, which the caller is
+ * responsible for free'ing.
+ *
+ * Throws: <eslESYS> on an MPI call failure. <eslEMEM> on allocation failure.
+ * In either case, <*ret_msa> is <NULL>, and the state of <buf>
+ * and <*pos> is undefined and should be considered to be corrupted.
+ *
+ * Xref: J1/78-79
+ */
+int
+esl_msa_MPIUnpack(const ESL_ALPHABET *abc, char *buf, int n, int *pos, MPI_Comm comm, ESL_MSA **ret_msa)
+{
+ int status;
+ ESL_MSA *msa = NULL;
+ int nseq, alen, flags;
+ int i;
+
+ status = MPI_Unpack (buf, n, pos, &nseq, 1, MPI_INT, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack (buf, n, pos, &alen, 1, MPI_INT, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack (buf, n, pos, &flags, 1, MPI_INT, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+
+ if (flags & eslMSA_DIGITAL) {
+ if ((msa = esl_msa_CreateDigital(abc, nseq, alen)) == NULL) { status = eslEMEM; goto ERROR; }
+ } else {
+ if ((msa = esl_msa_Create(nseq, alen)) == NULL) { status = eslEMEM; goto ERROR; }
+ }
+ msa->flags = flags;
+
+ status = MPI_Unpack (buf, n, pos, msa->wgt, nseq, MPI_DOUBLE, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(msa->name), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(msa->desc), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(msa->acc), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(msa->au), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(msa->ss_cons), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(msa->sa_cons), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(msa->pp_cons), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(msa->rf) , NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(msa->mm) , NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ status = MPI_Unpack (buf, n, pos, msa->cutoff, eslMSA_NCUTS, MPI_FLOAT, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ status = MPI_Unpack (buf, n, pos, msa->cutset, eslMSA_NCUTS, MPI_INT, comm); if (status != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+
+ for (i = 0; i < msa->nseq; i++) {
+ status = esl_mpi_UnpackOpt(buf, n, pos, (void **) &(msa->sqname[i]), NULL, MPI_CHAR, comm); if (status != eslOK) goto ERROR;
+ if (msa->flags & eslMSA_DIGITAL) {
+ if ((status = MPI_Unpack (buf, n, pos, msa->ax[i], msa->alen+2, MPI_UNSIGNED_CHAR, comm)) != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ } else {
+ if ((status = MPI_Unpack (buf, n, pos, msa->aseq[i], msa->alen+1, MPI_CHAR, comm)) != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ }
+ }
+ *ret_msa = msa;
+ return eslOK;
+
+ ERROR:
+ if (msa != NULL) esl_msa_Destroy(msa);
+ *ret_msa = NULL;
+ return status;
+}
+
+
+
+/* Function: esl_msa_MPIRecv()
+ * Synopsis: Receive essential MSA info as a work unit from MPI sender.
+ * Incept: SRE, Fri Jun 1 11:01:04 2007 [Janelia]
+ *
+ * Purpose: Receives a work unit that consists of a single MSA from <source> (<0..nproc-1>, or
+ * <MPI_ANY_SOURCE>) tagged as <tag> from communicator <comm>.
+ *
+ * Work units are prefixed by a status code. If the unit's
+ * code is <eslOK> and no errors are encountered, this
+ * routine will return <eslOK> and a non-<NULL> <*ret_msa>.
+ * If the unit's code is <eslEOD> (a shutdown signal),
+ * this routine returns <eslEOD> and <*ret_msa> is <NULL>.
+ *
+ * MSAs are transmitted in digital mode. Caller must know and
+ * provide the alphabet <abc> for this MSA.
+ *
+ * To minimize alloc/free cycles in this routine, caller
+ * passes a pointer to a buffer <*buf> of size <*nalloc>
+ * characters. These are passed by reference, because when
+ * necessary, <*buf> will be reallocated and <*nalloc>
+ * increased to the new size. As a special case, if <*buf>
+ * is <NULL> and <*nalloc> is 0, the buffer will be
+ * allocated appropriately, but the caller is still
+ * responsible for free'ing it.
+ *
+ * If the packed MSA is an end-of-data signal, return
+ * <eslEOD>, and <*ret_msa> is <NULL>.
+ *
+ * Returns: <eslOK> on success. <*ret_msa> contains the new MSA; it
+ * is allocated here, and the caller is responsible for
+ * free'ing it. <*buf> may have been reallocated to a
+ * larger size, and <*nalloc> may have been increased.
+ *
+ *
+ * Throws: <eslESYS> if an MPI call fails; <eslEMEM> if an allocation fails.
+ * In either case, <*ret_msa> is NULL, and the <buf> and its size
+ * <*nalloc> remain valid.
+ * Xref: J1/72.
+ */
+int
+esl_msa_MPIRecv(int source, int tag, MPI_Comm comm, const ESL_ALPHABET *abc, char **buf, int *nalloc, ESL_MSA **ret_msa)
+{
+ int status, code;
+ ESL_MSA *msa = NULL;
+ int n;
+ int pos;
+ MPI_Status mpistatus;
+
+ /* Probe first, because we need to know if our buffer is big enough. */
+ if (MPI_Probe(source, tag, comm, &mpistatus) != 0) ESL_XEXCEPTION(eslESYS, "mpi probe failed");
+ if (MPI_Get_count(&mpistatus, MPI_PACKED, &n) != 0) ESL_XEXCEPTION(eslESYS, "mpi get count failed");
+
+ /* Make sure the buffer is allocated appropriately */
+ if (*buf == NULL || n > *nalloc) {
+ void *tmp;
+ ESL_RALLOC(*buf, tmp, sizeof(char) * n);
+ *nalloc = n;
+ }
+
+ /* Receive the packed work unit */
+ if (MPI_Recv(*buf, n, MPI_PACKED, source, tag, comm, &mpistatus) != 0) ESL_XEXCEPTION(eslESYS, "mpi recv failed");
+
+ /* Unpack it - where the first integer is a status code, OK or EOD */
+ pos = 0;
+ if (MPI_Unpack (*buf, n, &pos, &code, 1, MPI_INT, comm) != 0) ESL_XEXCEPTION(eslESYS, "mpi unpack failed");
+ if (code == eslEOD) { status = eslEOD; goto ERROR; }
+
+ return esl_msa_MPIUnpack(abc, *buf, *nalloc, &pos, comm, ret_msa);
+
+ ERROR:
+ if (msa != NULL) esl_msa_Destroy(msa);
+ *ret_msa = NULL;
+ return status;
+}
+/*-------------------------- end, ESL_MSA -----------------------*/
+
+
+/*****************************************************************
+ *# 4. Communicating ESL_STOPWATCH (process timing)
+ *****************************************************************/
+
+/* Function: esl_stopwatch_MPIReduce()
+ * Synopsis: Collect total parallel process time into master watch.
+ * Incept: SRE, Thu Jun 14 13:27:20 2007 [Janelia]
+ *
+ * Purpose: Collect all user/sys times from stopped stopwatch <w> from
+ * all MPI processes, and sum them into the watch on the
+ * master process of rank <root>, for MPI communicator
+ * <comm>. A subsequent <esl_stopwatch_Display()> will
+ * then show total user/sys times, not just the master's
+ * usage.
+ *
+ * This routine needs to be called synchronously on all
+ * processes; it does a collective communication using
+ * <MPI_Reduce()>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> on MPI call failure.
+ */
+int
+esl_stopwatch_MPIReduce(ESL_STOPWATCH *w, int root, MPI_Comm comm)
+{
+ double user_total;
+ double sys_total;
+
+ if (MPI_Reduce(&(w->user), &user_total, 1, MPI_DOUBLE, MPI_SUM, root, comm) != 0) ESL_EXCEPTION(eslESYS, "mpi reduce failed");
+ if (MPI_Reduce(&(w->sys), &sys_total, 1, MPI_DOUBLE, MPI_SUM, root, comm) != 0) ESL_EXCEPTION(eslESYS, "mpi reduce failed");
+
+ w->user = user_total;
+ w->sys = sys_total;
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 5. Unit tests.
+ *****************************************************************/
+#ifdef eslMPI_TESTDRIVE
+
+/* Each MPI unit test for communications routines follows a similar
+ * pattern:
+ * - workers and master generate identical objects, possibly using
+ * the same RNG
+ * - each worker sends object to master
+ * - master receives object, compares it to known object, and fails
+ * if they aren't the same.
+ *
+ * This way, master is doing the failing and error output.
+ */
+static void
+utest_MSASendRecv(ESL_ALPHABET *abc, ESL_MSA *msa, int my_rank, int nproc)
+{
+ ESL_MSA *xmsa = NULL;
+ char *wbuf = NULL;
+ int wn = 0;
+ int i;
+
+ if (my_rank == 0)
+ {
+ for (i = 1; i < nproc; i++)
+ {
+ ESL_DPRINTF1(("Master: receiving test msa\n"));
+ esl_msa_MPIRecv(MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, abc, &wbuf, &wn, &xmsa);
+ ESL_DPRINTF1(("Master: test msa received\n"));
+
+ if ((esl_msa_CompareMandatory(msa, xmsa) != eslOK) ||
+ (esl_CCompare(msa->name, xmsa->name) != eslOK) ||
+ (esl_CCompare(msa->desc, xmsa->desc) != eslOK) ||
+ (esl_CCompare(msa->acc, xmsa->acc) != eslOK) ||
+ (esl_CCompare(msa->au, xmsa->au) != eslOK) ||
+ (esl_CCompare(msa->ss_cons, xmsa->ss_cons) != eslOK) ||
+ (esl_CCompare(msa->sa_cons, xmsa->sa_cons) != eslOK) ||
+ (esl_CCompare(msa->pp_cons, xmsa->pp_cons) != eslOK) ||
+ (esl_CCompare(msa->rf, xmsa->rf) != eslOK) ||
+ (esl_CCompare(msa->mm, xmsa->mm) != eslOK))
+ esl_fatal("Received MSA is not identical to what was sent.");
+
+ esl_msa_Destroy(xmsa);
+ }
+ }
+ else
+ {
+ ESL_DPRINTF1(("Worker %d: sending test msa\n", my_rank));
+ esl_msa_MPISend(msa, 0, 0, MPI_COMM_WORLD, &wbuf, &wn);
+ ESL_DPRINTF1(("Worker %d: test msa sent\n", my_rank));
+ }
+
+ free(wbuf);
+ return;
+}
+
+static void
+utest_MSAPackUnpack(ESL_ALPHABET *abc, ESL_MSA *msa, int my_rank, int nproc)
+{
+ ESL_MSA *xmsa = NULL;
+ char *wbuf = NULL;
+ int wn = 0;
+ int pin, pout;
+
+ if (my_rank != 0) return; /* only execute this utest on the master. */
+
+ esl_msa_MPIPackSize(msa, MPI_COMM_WORLD, &wn);
+ wbuf = malloc(sizeof(char) * wn);
+
+ pin = 0;
+ esl_msa_MPIPack(msa, wbuf, wn, &pin, MPI_COMM_WORLD);
+
+ pout = 0;
+ esl_msa_MPIUnpack(abc, wbuf, wn, &pout, MPI_COMM_WORLD, &xmsa);
+
+ if (pin != pout) esl_fatal("unit test failed: packed and unpacked sizes differ");
+ if ((esl_msa_CompareMandatory(msa, xmsa) != eslOK) ||
+ (esl_CCompare(msa->name, xmsa->name) != eslOK) ||
+ (esl_CCompare(msa->desc, xmsa->desc) != eslOK) ||
+ (esl_CCompare(msa->acc, xmsa->acc) != eslOK) ||
+ (esl_CCompare(msa->au, xmsa->au) != eslOK) ||
+ (esl_CCompare(msa->ss_cons, xmsa->ss_cons) != eslOK) ||
+ (esl_CCompare(msa->sa_cons, xmsa->sa_cons) != eslOK) ||
+ (esl_CCompare(msa->pp_cons, xmsa->pp_cons) != eslOK) ||
+ (esl_CCompare(msa->rf, xmsa->rf) != eslOK) ||
+ (esl_CCompare(msa->mm, xmsa->mm) != eslOK))
+ esl_fatal("Unpacked MSA is not identical to what was packed.");
+
+ esl_msa_Destroy(xmsa);
+ free(wbuf);
+ return;
+}
+
+
+
+#endif /*eslMPI_TESTDRIVE*/
+/*----------------------- end, unit tests -----------------------*/
+
+
+/*****************************************************************
+ * 6. Test driver.
+ *****************************************************************/
+#ifdef eslMPI_TESTDRIVE
+/* mpicc -o mpi_utest -g -Wall -I. -L. -DeslMPI_TESTDRIVE esl_mpi.c -leasel -lm
+ * In an MPI environment:
+ * mpirun C ./mpi_utest
+ */
+#include "esl_getopts.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-m", eslARG_INFILE, FALSE, NULL, NULL, NULL, NULL, NULL, "read test MSA from file <f>", 0 },
+ { "-x", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "test digital mode MSA communication", 0 },
+ { "--stall", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "arrest after start: for debugging MPI under gdb", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for the Easel mpi module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int do_stall = FALSE;
+ int my_rank;
+ int nproc;
+
+ /* For debugging: stall until GDB can be attached */
+ if (esl_opt_GetBoolean(go, "--stall")) do_stall = TRUE;
+ while (do_stall);
+
+ /* Get a test MSA and alphabet. */
+ if (esl_opt_GetString(go, "-m") != NULL)
+ {
+ if (esl_msafile_Open(&abc, esl_opt_GetString(go, "-m"), eslMSAFILE_UNKNOWN, NULL, &afp) != eslOK) esl_fatal("msa file open failed");
+ if (esl_msafile_Read(afp, &msa) != eslOK) esl_fatal("msa read failed");
+ esl_msafile_Close(afp);
+ }
+ else
+ {
+ abc = esl_alphabet_Create(eslAMINO);
+ if ( (esl_msafile_OpenMem(&abc,
+ "# STOCKHOLM 1.0\n\nNIFE_CLOPA GYVGS\nNIFD_AZOVI GFDGF\nNIFD_BRAJA GYDGF\nNIFK_ANASP GYQGG\n//\n",
+ -1, eslMSAFILE_STOCKHOLM, NULL, &afp)) != eslOK)
+ esl_fatal("msa creation failed");
+ if (esl_msafile_Read(afp, &msa) != eslOK) esl_fatal("msa read failed");
+ esl_msafile_Close(afp);
+ }
+
+
+ MPI_Init(&argc, &argv);
+ MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
+ MPI_Comm_size(MPI_COMM_WORLD, &nproc);
+
+ utest_MSAPackUnpack(abc, msa, my_rank, nproc);
+ utest_MSASendRecv (abc, msa, my_rank, nproc);
+
+ MPI_Finalize();
+
+ esl_alphabet_Destroy(abc);
+ esl_msa_Destroy(msa);
+ return eslOK;
+}
+
+#endif /*eslMPI_TESTDRIVE*/
+/*---------------------- end, test driver -----------------------*/
+
+
+
+
+/*****************************************************************
+ * 7. Example.
+ *****************************************************************/
+
+
+
+
+
+/*------------------------ end, example -------------------------*/
+
+
+
+
+
+#else /*!(HAVE_MPI && eslLIBRARY)*/
+
+/* If we don't have MPI compiled in, provide some nothingness to:
+ * a. prevent Mac OS/X ranlib from bitching about .o file that "has no symbols"
+ * b. prevent compiler from bitching about "empty compilation unit"
+ * c. automatically pass the automated tests.
+ */
+#include "easel.h"
+
+void esl_mpi_DoAbsolutelyNothing(void) { return; }
+#if defined eslMPI_TESTDRIVE || eslMPI_EXAMPLE || eslMPI_BENCHMARK
+int main(void) { return 0; }
+#endif
+
+#endif /*HAVE_MPI && eslLIBRARY*/
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_mpi.h b/esl_mpi.h
new file mode 100644
index 0000000..5bef281
--- /dev/null
+++ b/esl_mpi.h
@@ -0,0 +1,74 @@
+/* Support for MPI parallelization.
+ *
+ */
+#if defined(HAVE_MPI) && defined(eslLIBRARY)
+#ifndef eslMPI_INCLUDED
+#define eslMPI_INCLUDED
+#include <mpi.h>
+
+#include "esl_alphabet.h"
+#include "esl_msa.h"
+#include "esl_sq.h"
+#include "esl_stopwatch.h"
+
+/* Many MPI implementations are not MPI2.2 compliant, and do not
+ * support new MPI2.2 datatypes; work around that absence. [J10/152]
+ * This configuration is better here than esl_config.h.in, because
+ * we need to #include <mpi.h> first to see if the system MPI does
+ * the right thing, and esl_config.h.in is intended to be included
+ * BEFORE any system includes.
+ */
+#if MPI_VERSION < 2 || MPI_SUBVERSION < 2
+#ifndef MPI_INT64_T
+#define MPI_INT64_T MPI_LONG_LONG_INT
+#endif
+#ifndef MPI_UINT64_T
+#define MPI_UINT64_T MPI_UNSIGNED_LONG_LONG
+#endif
+#ifndef MPI_UINT32_T
+#define MPI_UINT32_T MPI_UNSIGNED
+#endif
+#ifndef MPI_INT16_T
+#define MPI_INT16_T MPI_SHORT
+#endif
+#ifndef MPI_UINT8_T
+#define MPI_UINT8_T MPI_UNSIGNED_CHAR
+#endif
+#endif /*MPI_VERSION,MPI_SUBVERSION*/
+
+/* 1. Communicating optional arrays */
+extern int esl_mpi_PackOpt(void *inbuf, int incount, MPI_Datatype type, void *pack_buf,
+ int pack_buf_size, int *position, MPI_Comm comm);
+extern int esl_mpi_PackOptSize(void *inbuf, int incount, MPI_Datatype type, MPI_Comm comm, int *ret_n);
+extern int esl_mpi_UnpackOpt(void *pack_buf, int pack_buf_size, int *pos, void **outbuf,
+ int *opt_n, MPI_Datatype type, MPI_Comm comm);
+
+/* 2. Communicating ESL_SQ (single sequences) */
+extern int esl_sq_MPISend(ESL_SQ *sq, int dest, int tag, MPI_Comm comm, char **buf, int *nalloc);
+extern int esl_sq_MPIPackSize(ESL_SQ *sq, MPI_Comm comm, int *ret_n);
+extern int esl_sq_MPIPack(ESL_SQ *sq, char *buf, int n, int *pos, MPI_Comm comm);
+extern int esl_sq_MPIUnpack(const ESL_ALPHABET *abc, char *buf, int n, int *pos, MPI_Comm comm, ESL_SQ **ret_sq);
+extern int esl_sq_MPIRecv(int source, int tag, MPI_Comm comm, const ESL_ALPHABET *abc,
+ char **buf, int *nalloc, ESL_SQ **ret_sq);
+
+/* 3. Communicating ESL_MSA (multiple sequence alignments) */
+extern int esl_msa_MPISend(const ESL_MSA *msa, int dest, int tag, MPI_Comm comm, char **buf, int *nalloc);
+extern int esl_msa_MPIPackSize(const ESL_MSA *msa, MPI_Comm comm, int *ret_n);
+extern int esl_msa_MPIPack(const ESL_MSA *msa, char *buf, int n, int *position, MPI_Comm comm);
+extern int esl_msa_MPIUnpack(const ESL_ALPHABET *abc, char *buf, int n, int *pos, MPI_Comm comm, ESL_MSA **ret_msa);
+extern int esl_msa_MPIRecv(int source, int tag, MPI_Comm comm, const ESL_ALPHABET *abc, char **buf, int *nalloc, ESL_MSA **ret_msa);
+
+/* 4. Communicating ESL_STOPWATCH (process timing) */
+extern int esl_stopwatch_MPIReduce(ESL_STOPWATCH *w, int root, MPI_Comm comm);
+
+
+#endif /*eslMPI_INCLUDED*/
+#endif /*HAVE_MPI && eslLIBRARY*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SRE, Sat Jun 2 09:07:25 2007 [Janelia]
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_mpi.tex b/esl_mpi.tex
new file mode 100644
index 0000000..8378229
--- /dev/null
+++ b/esl_mpi.tex
@@ -0,0 +1,24 @@
+The \eslmod{mpi} module contains a small number of utilities useful
+for using an MPI (Message Passing Interface) library for
+parallelization. Table~\ref{tbl:mpi_api} lists the routines in the
+\eslmod{mpi} API.
+
+
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\hyperlink{func:esl_mpi_PackOpt()}{\ccode{esl\_mpi\_PackOpt()}} & Pack an optional, variable-sized array (or string).\\
+\hyperlink{func:esl_mpi_PackOptSize()}{\ccode{esl\_mpi\_PackOptSize()}}& Determine the size of a packed optional, variable-sized array.\\
+\hyperlink{func:esl_mpi_UnpackOpt()}{\ccode{esl\_mpi\_UnpackOpt()}} & Unpack an optional, variable-sized array (or string).\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{mpi} API.}
+\label{tbl:mpi_api}
+\end{table}
+
+
+
+
diff --git a/esl_msa.c b/esl_msa.c
new file mode 100644
index 0000000..7d4de11
--- /dev/null
+++ b/esl_msa.c
@@ -0,0 +1,3740 @@
+/* Multiple sequence alignment file i/o.
+ *
+ * Contents:
+ * 1. The <ESL_MSA> object
+ * 2. Digital mode MSA's (augmentation: alphabet)
+ * 3. Setting, checking data fields in an <ESL_MSA>
+ * 4. Miscellaneous functions for manipulating MSAs
+ * 5. Debugging, testing, development
+ * 6. Unit tests
+ * 7. Test driver
+ * 8. Copyright and license information
+ *
+ * Augmentations:
+ * alphabet: adds support for digital MSAs
+ * keyhash: speeds up Stockholm file input
+ * ssi: enables indexed random access in a file of many MSAs
+ */
+
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h> /* POSIX strcasecmp() */
+#endif
+
+#include "easel.h"
+#include "esl_mem.h"
+#ifdef eslAUGMENT_KEYHASH
+#include "esl_keyhash.h"
+#endif
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#ifdef eslAUGMENT_SSI
+#include "esl_ssi.h"
+#endif
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_vectorops.h"
+#include "esl_wuss.h"
+
+
+
+/******************************************************************************
+ *# 1. The <ESL_MSA> object
+ *****************************************************************************/
+
+static ESL_MSA *msa_create_mostly(int nseq, int64_t alen);
+
+
+/* Function: esl_msa_Create()
+ * Synopsis: Creates an <ESL_MSA> object.
+ *
+ * Purpose: Creates and initializes an <ESL_MSA> object, and returns a
+ * pointer to it.
+ *
+ * If caller already knows the dimensions of the alignment,
+ * both <nseq> and <alen>, then <msa = esl_msa_Create(nseq,
+ * alen)> allocates the whole thing at once. The MSA's
+ * <nseq> and <alen> fields are set accordingly, and the
+ * caller doesn't have to worry about setting them; it can
+ * just fill in <aseq>.
+ *
+ * If caller doesn't know the dimensions of the alignment
+ * (for example, when parsing an alignment file), then
+ * <nseq> is taken to be an initial allocation size, and
+ * <alen> must be -1. <alen=-1> is used as a flag for a
+ * "growable" MSA. For example, the call <msa =
+ * esl_msa_Create(16, -1)>. allocates internally for an
+ * initial block of 16 sequences, but without allocating
+ * any space for individual sequences. This allocation can
+ * be expanded (by doubling) by calling <esl_msa_Expand()>.
+ * A created <msa> can only be <_Expand()>'ed if <alen> is
+ * -1.
+ *
+ * In a growable alignment, caller becomes responsible for
+ * memory allocation of each individual <aseq[i]>. Caller
+ * is also responsible for setting <nseq> and <alen> when
+ * it is done parsing and creating the new MSA. In
+ * particular, the <esl_msa_Destroy()> function relies on
+ * <nseq> to know how many individual sequences are
+ * allocated.
+ *
+ * Args: <nseq> - number of sequences, or nseq allocation blocksize
+ * <alen> - length of alignment in columns, or -1
+ *
+ * Returns: pointer to new MSA object, w/ all values initialized.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_MSA *
+esl_msa_Create(int nseq, int64_t alen)
+{
+ int status;
+ ESL_MSA *msa;
+ int i;
+
+ ESL_DASSERT1(( nseq > 0 ));
+ ESL_DASSERT1(( alen >= -1));
+
+ msa = msa_create_mostly(nseq, alen); /* aseq is null upon successful return */
+ if (msa == NULL) return NULL; /* already threw error in msa_create_mostly, so percolate */
+
+ ESL_ALLOC(msa->aseq, sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++)
+ msa->aseq[i] = NULL;
+
+ if (alen != -1) {
+ for (i = 0; i < nseq; i++)
+ {
+ ESL_ALLOC(msa->aseq[i], sizeof(char) * (alen+1));
+ msa->aseq[i][alen] = '\0'; /* caller might forget to null terminate; help the poor */
+ }
+ msa->nseq = nseq;
+ }
+ return msa;
+
+ ERROR:
+ esl_msa_Destroy(msa);
+ return NULL;
+}
+
+
+/* Function: esl_msa_Expand()
+ * Synopsis: Reallocate for more sequences.
+ *
+ * Purpose: Double the current sequence allocation in <msa>.
+ * Typically used when we're reading an alignment sequentially
+ * from a file, so we don't know nseq 'til we're done.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on reallocation failure; <msa> is undamaged,
+ * and the caller may attempt to recover from the error.
+ *
+ * Throws <eslEINVAL> if <msa> is not growable: its <alen>
+ * field must be -1 to be growable.
+ *
+ * Xref: squid's MSAExpand(), 1999.
+ */
+int
+esl_msa_Expand(ESL_MSA *msa)
+{
+ int status;
+ int old, new; /* old & new allocation sizes (max # seqs) */
+ int i,j;
+
+ if (msa->alen != -1)
+ ESL_EXCEPTION(eslEINVAL, "that MSA is not growable");
+
+ old = msa->sqalloc;
+ new = 2*old;
+
+ /* Normally either aseq (ascii) or ax (digitized) would be active, not both.
+ * We could make sure that that's true, but that's checked elsewhere.
+ */
+ if (msa->aseq) ESL_REALLOC(msa->aseq, sizeof(char *) * new);
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->ax) ESL_REALLOC(msa->ax, sizeof(ESL_DSQ *) * new);
+#endif /*eslAUGMENT_ALPHABET*/
+
+ ESL_REALLOC(msa->sqname, sizeof(char *) * new);
+ ESL_REALLOC(msa->wgt, sizeof(double) * new);
+ ESL_REALLOC(msa->sqlen, sizeof(int64_t)* new);
+
+ if (msa->ss)
+ {
+ ESL_REALLOC(msa->ss, sizeof(char *) * new);
+ ESL_REALLOC(msa->sslen, sizeof(int64_t) * new);
+ }
+
+ if (msa->sa)
+ {
+ ESL_REALLOC(msa->sa, sizeof(char *) * new);
+ ESL_REALLOC(msa->salen, sizeof(int64_t) * new);
+ }
+
+ if (msa->pp)
+ {
+ ESL_REALLOC(msa->pp, sizeof(char *) * new);
+ ESL_REALLOC(msa->pplen, sizeof(int64_t) * new);
+ }
+
+ if (msa->sqacc) ESL_REALLOC(msa->sqacc, sizeof(char *) * new);
+ if (msa->sqdesc) ESL_REALLOC(msa->sqdesc, sizeof(char *) * new);
+
+ for (i = old; i < new; i++)
+ {
+ if (msa->aseq) msa->aseq[i] = NULL;
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->ax) msa->ax[i] = NULL;
+#endif /*eslAUGMENT_ALPHABET*/
+ msa->sqname[i] = NULL;
+ msa->wgt[i] = -1.0; /* -1.0 means "unset so far" */
+ msa->sqlen[i] = 0;
+
+ if (msa->ss) { msa->ss[i] = NULL; msa->sslen[i] = 0; }
+ if (msa->sa) { msa->sa[i] = NULL; msa->salen[i] = 0; }
+ if (msa->pp) { msa->pp[i] = NULL; msa->pplen[i] = 0; }
+
+ if (msa->sqacc) msa->sqacc[i] = NULL;
+ if (msa->sqdesc) msa->sqdesc[i] = NULL;
+ }
+
+ /* Reallocate and re-init for unparsed #=GS tags, if we have some.
+ * gs is [0..ngs-1][0..nseq-1][], so we're reallocing the middle
+ * set of pointers.
+ */
+ if (msa->gs)
+ for (i = 0; i < msa->ngs; i++)
+ {
+ if (msa->gs[i])
+ {
+ ESL_REALLOC(msa->gs[i], sizeof(char *) * new);
+ for (j = old; j < new; j++)
+ msa->gs[i][j] = NULL;
+ }
+ }
+ /* Reallocate and re-init for unparsed #=GR tags, if we have some.
+ * gr is [0..ngs-1][0..nseq-1][], so we're reallocing the middle
+ * set of pointers.
+ */
+ if (msa->gr)
+ for (i = 0; i < msa->ngr; i++)
+ {
+ if (msa->gr[i])
+ {
+ ESL_REALLOC(msa->gr[i], sizeof(char *) * new);
+ for (j = old; j < new; j++)
+ msa->gr[i][j] = NULL;
+ }
+ }
+
+ msa->sqalloc = new;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_msa_Copy()
+ * Synopsis: Copies an MSA.
+ *
+ * Purpose: Makes a copy of <msa> in <new>. Caller has
+ * already allocated <new> to hold an MSA of
+ * at least <msa->nseq> sequences and <msa->alen>
+ * columns.
+ *
+ * Note: Because MSA's are not reusable, this function does a
+ * lot of internal allocation for optional fields, without
+ * checking <new> to see if space was already allocated. To
+ * reuse an MSA <new> and copy new data into it, we'll
+ * eventually need a <esl_msa_Reuse()> function, and/or
+ * recode this to reuse or free any already-allocated
+ * optional memory it encounters in <new>. Until then,
+ * it's unlikely that <esl_msa_Copy()> is useful on its own;
+ * the caller would be expected to call <esl_msa_Clone()>
+ * instead.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure. In this case, <new>
+ * was only partially constructed, and should be treated
+ * as corrupt.
+ */
+int
+esl_msa_Copy(const ESL_MSA *msa, ESL_MSA *new)
+{
+ int i, x, j;
+ int status;
+
+ /* aseq[0..nseq-1][0..alen-1] strings,
+ * or ax[0..nseq-1][(0) 1..alen (alen+1)] digital seqs
+ * <new> must have one of them allocated already.
+ */
+ if (! (msa->flags & eslMSA_DIGITAL))
+ for (i = 0; i < msa->nseq; i++)
+ strcpy(new->aseq[i], msa->aseq[i]);
+#ifdef eslAUGMENT_ALPHABET
+ else
+ {
+ for (i = 0; i < msa->nseq; i++)
+ memcpy(new->ax[i], msa->ax[i], (msa->alen+2) * sizeof(ESL_DSQ));
+ new->abc = msa->abc;
+ }
+#endif
+
+ for (i = 0; i < msa->nseq; i++) {
+ esl_strdup(msa->sqname[i], -1, &(new->sqname[i]));
+ new->wgt[i] = msa->wgt[i];
+ }
+ /* alen, nseq were already set by Create() */
+ new->flags = msa->flags;
+
+ esl_strdup(msa->name, -1, &(new->name));
+ esl_strdup(msa->desc, -1, &(new->desc));
+ esl_strdup(msa->acc, -1, &(new->acc));
+ esl_strdup(msa->au, -1, &(new->au));
+ esl_strdup(msa->ss_cons, -1, &(new->ss_cons));
+ esl_strdup(msa->sa_cons, -1, &(new->sa_cons));
+ esl_strdup(msa->pp_cons, -1, &(new->pp_cons));
+ esl_strdup(msa->rf, -1, &(new->rf));
+ esl_strdup(msa->mm, -1, &(new->mm));
+
+ if (msa->sqacc != NULL) {
+ ESL_ALLOC(new->sqacc, sizeof(char *) * new->sqalloc);
+ for (i = 0; i < msa->nseq; i++) esl_strdup(msa->sqacc[i], -1, &(new->sqacc[i]));
+ for ( ; i < new->sqalloc; i++) new->sqacc[i] = NULL;
+ }
+ if (msa->sqdesc != NULL) {
+ ESL_ALLOC(new->sqdesc, sizeof(char *) * new->sqalloc);
+ for (i = 0; i < msa->nseq; i++) esl_strdup(msa->sqdesc[i], -1, &(new->sqdesc[i]));
+ for ( ; i < new->sqalloc; i++) new->sqdesc[i] = NULL;
+ }
+ if (msa->ss != NULL) {
+ ESL_ALLOC(new->ss, sizeof(char *) * new->sqalloc);
+ for (i = 0; i < msa->nseq; i++) esl_strdup(msa->ss[i], -1, &(new->ss[i]));
+ for ( ; i < new->sqalloc; i++) new->ss[i] = NULL;
+ }
+ if (msa->sa != NULL) {
+ ESL_ALLOC(new->sa, sizeof(char *) * msa->nseq);
+ for (i = 0; i < msa->nseq; i++) esl_strdup(msa->sa[i], -1, &(new->sa[i]));
+ for ( ; i < new->sqalloc; i++) new->sa[i] = NULL;
+ }
+ if (msa->pp != NULL) {
+ ESL_ALLOC(new->pp, sizeof(char *) * msa->nseq);
+ for (i = 0; i < msa->nseq; i++) esl_strdup(msa->pp[i], -1, &(new->pp[i]));
+ for ( ; i < new->sqalloc; i++) new->pp[i] = NULL;
+ }
+
+ for (x = 0; x < eslMSA_NCUTS; x++) {
+ new->cutoff[x] = msa->cutoff[x];
+ new->cutset[x] = msa->cutset[x];
+ }
+
+ if (msa->ncomment > 0) {
+ ESL_ALLOC(new->comment, sizeof(char *) * msa->ncomment);
+ new->ncomment = msa->ncomment;
+ new->alloc_ncomment = msa->ncomment;
+ for (i = 0; i < msa->ncomment; i++)
+ esl_strdup(msa->comment[i], -1, &(new->comment[i]));
+ }
+
+ if (msa->ngf > 0) {
+ ESL_ALLOC(new->gf_tag, sizeof(char *) * msa->ngf);
+ ESL_ALLOC(new->gf, sizeof(char *) * msa->ngf);
+ new->ngf = msa->ngf;
+ new->alloc_ngf = msa->ngf;
+ for (i = 0; i < msa->ngf; i++) {
+ esl_strdup(msa->gf_tag[i], -1, &(new->gf_tag[i]));
+ esl_strdup(msa->gf[i], -1, &(new->gf[i]));
+ }
+ }
+
+ if (msa->ngs > 0) {
+ ESL_ALLOC(new->gs_tag, sizeof(char *) * msa->ngs);
+ ESL_ALLOC(new->gs, sizeof(char **) * msa->ngs);
+ new->ngs = msa->ngs;
+ for (i = 0; i < msa->ngs; i++) {
+ ESL_ALLOC(new->gs[i], sizeof(char *) * msa->nseq);
+ esl_strdup(msa->gs_tag[i], -1, &(new->gs_tag[i]));
+ for (j = 0; j < msa->nseq; j++)
+ esl_strdup(msa->gs[i][j], -1, &(new->gs[i][j]));
+ }
+ }
+
+ if (msa->ngc > 0) {
+ ESL_ALLOC(new->gc_tag, sizeof(char *) * msa->ngc);
+ ESL_ALLOC(new->gc, sizeof(char *) * msa->ngc);
+ new->ngc = msa->ngc;
+ for (i = 0; i < msa->ngc; i++) {
+ esl_strdup(msa->gc_tag[i], -1, &(new->gc_tag[i]));
+ esl_strdup(msa->gc[i], -1, &(new->gc[i]));
+ }
+ }
+
+ if (msa->ngr > 0) {
+ ESL_ALLOC(new->gr_tag, sizeof(char *) * msa->ngr);
+ ESL_ALLOC(new->gr, sizeof(char **) * msa->ngr);
+ new->ngr = msa->ngr;
+ for (i = 0; i < msa->ngr; i++) {
+ ESL_ALLOC(new->gr[i], sizeof(char *) * msa->nseq);
+ esl_strdup(msa->gr_tag[i], -1, &(new->gr_tag[i]));
+ for (j = 0; j < msa->nseq; j++)
+ esl_strdup(msa->gr[i][j], -1, &(new->gr[i][j]));
+ }
+ }
+
+#ifdef eslAUGMENT_KEYHASH
+ esl_keyhash_Destroy(new->index); new->index = NULL;
+ esl_keyhash_Destroy(new->gs_idx); new->gs_idx = NULL;
+ esl_keyhash_Destroy(new->gc_idx); new->gc_idx = NULL;
+ esl_keyhash_Destroy(new->gr_idx); new->gr_idx = NULL;
+
+ if (msa->index != NULL) new->index = esl_keyhash_Clone(msa->index);
+ if (msa->gs_idx != NULL) new->gs_idx = esl_keyhash_Clone(msa->gs_idx);
+ if (msa->gc_idx != NULL) new->gc_idx = esl_keyhash_Clone(msa->gc_idx);
+ if (msa->gr_idx != NULL) new->gr_idx = esl_keyhash_Clone(msa->gr_idx);
+#endif
+
+#ifdef eslAUGMENT_SSI
+ new->offset = msa->offset;
+#endif
+
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_msa_Clone()
+ * Synopsis: Duplicates an MSA.
+ *
+ * Purpose: Make a duplicate of <msa>, in newly
+ * allocated space.
+ *
+ * Returns: a pointer to the newly allocated clone.
+ * Caller is responsible for free'ing it.
+ *
+ * Throws: <NULL> on allocation error.
+ */
+ESL_MSA *
+esl_msa_Clone(const ESL_MSA *msa)
+{
+ ESL_MSA *nw = NULL;
+ int status;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->flags & eslMSA_DIGITAL) {
+ if ((nw = esl_msa_CreateDigital(msa->abc, msa->nseq, msa->alen)) == NULL) return NULL;
+ } else
+#endif
+ if ((nw = esl_msa_Create(msa->nseq, msa->alen)) == NULL) return NULL;
+
+ if ((status = esl_msa_Copy(msa, nw) ) != eslOK) goto ERROR;
+ return nw;
+
+ ERROR:
+ esl_msa_Destroy(nw);
+ return NULL;
+}
+
+
+/* Function: esl_msa_Destroy()
+ * Synopsis: Frees an <ESL_MSA>.
+ *
+ * Purpose: Destroys <msa>.
+ *
+ * Xref: squid's MSADestroy().
+ */
+void
+esl_msa_Destroy(ESL_MSA *msa)
+{
+ if (msa == NULL) return;
+
+ if (msa->aseq != NULL)
+ esl_Free2D((void **) msa->aseq, msa->nseq);
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->ax != NULL)
+ esl_Free2D((void **) msa->ax, msa->nseq);
+#endif /*eslAUGMENT_ALPHABET*/
+
+ esl_Free2D((void **) msa->sqname, msa->nseq);
+ esl_Free2D((void **) msa->sqacc, msa->nseq);
+ esl_Free2D((void **) msa->sqdesc, msa->nseq);
+ esl_Free2D((void **) msa->ss, msa->nseq);
+ esl_Free2D((void **) msa->sa, msa->nseq);
+ esl_Free2D((void **) msa->pp, msa->nseq);
+
+ if (msa->sqlen != NULL) free(msa->sqlen);
+ if (msa->wgt != NULL) free(msa->wgt);
+
+ if (msa->name != NULL) free(msa->name);
+ if (msa->desc != NULL) free(msa->desc);
+ if (msa->acc != NULL) free(msa->acc);
+ if (msa->au != NULL) free(msa->au);
+ if (msa->ss_cons != NULL) free(msa->ss_cons);
+ if (msa->sa_cons != NULL) free(msa->sa_cons);
+ if (msa->pp_cons != NULL) free(msa->pp_cons);
+ if (msa->rf != NULL) free(msa->rf);
+ if (msa->mm != NULL) free(msa->mm);
+ if (msa->sslen != NULL) free(msa->sslen);
+ if (msa->salen != NULL) free(msa->salen);
+ if (msa->pplen != NULL) free(msa->pplen);
+
+ esl_Free2D((void **) msa->comment, msa->ncomment);
+ esl_Free2D((void **) msa->gf_tag, msa->ngf);
+ esl_Free2D((void **) msa->gf, msa->ngf);
+
+ esl_Free2D((void **) msa->gs_tag, msa->ngs);
+ esl_Free3D((void ***)msa->gs, msa->ngs, msa->nseq);
+ esl_Free2D((void **) msa->gc_tag, msa->ngc);
+ esl_Free2D((void **) msa->gc, msa->ngc);
+ esl_Free2D((void **) msa->gr_tag, msa->ngr);
+ esl_Free3D((void ***)msa->gr, msa->ngr, msa->nseq);
+
+#ifdef eslAUGMENT_KEYHASH
+ esl_keyhash_Destroy(msa->index);
+ esl_keyhash_Destroy(msa->gs_idx);
+ esl_keyhash_Destroy(msa->gc_idx);
+ esl_keyhash_Destroy(msa->gr_idx);
+#endif /* keyhash augmentation */
+
+ free(msa);
+ return;
+}
+
+
+/* msa_create_mostly()
+ *
+ * This is the routine called by esl_msa_Create() and esl_msa_CreateDigital()
+ * that does all allocation except the aseq/ax alignment data.
+ *
+ * <nseq> may be the exact known # of seqs in an alignment; or <nseq>
+ * may be an allocation block size (to be expanded by doubling, in
+ * esl_msa_Expand(), as in:
+ * <if (msa->nseq == msa->sqalloc) esl_msa_Expand(msa);>
+ * <nseq> should not be 0.
+ *
+ * <alen> may be the exact length of an alignment, in columns; or it
+ * may be -1, which states that your parser will take responsibility
+ * for expanding as needed as new input is read into a growing new
+ * alignment.
+ *
+ * A created <msa> can only be <_Expand()>'ed if <alen> is -1.
+ *
+ * Args: <nseq> - number of sequences, or nseq allocation blocksize
+ * <alen> - length of alignment in columns, or -1
+ *
+ * Returns: pointer to new MSA object, w/ all values initialized.
+ * Note that msa->nseq is initialized to 0 here, even though space
+ * is allocated.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+static ESL_MSA *
+msa_create_mostly(int nseq, int64_t alen)
+{
+ int status;
+ ESL_MSA *msa = NULL;
+ int i;
+
+ ESL_ALLOC(msa, sizeof(ESL_MSA));
+ msa->aseq = NULL;
+ msa->sqname = NULL;
+ msa->wgt = NULL;
+ msa->alen = alen; /* if -1, then we're growable. */
+ msa->nseq = 0; /* our caller (text or digital allocation) sets this. */
+ msa->flags = 0;
+
+#ifdef eslAUGMENT_ALPHABET
+ msa->abc = NULL;
+ msa->ax = NULL;
+#endif /*eslAUGMENT_ALPHABET*/
+
+ msa->name = NULL;
+ msa->desc = NULL;
+ msa->acc = NULL;
+ msa->au = NULL;
+ msa->ss_cons = NULL;
+ msa->sa_cons = NULL;
+ msa->pp_cons = NULL;
+ msa->rf = NULL;
+ msa->mm = NULL;
+ msa->sqacc = NULL;
+ msa->sqdesc = NULL;
+ msa->ss = NULL;
+ msa->sa = NULL;
+ msa->pp = NULL;
+ for (i = 0; i < eslMSA_NCUTS; i++) {
+ msa->cutoff[i] = 0.;
+ msa->cutset[i] = FALSE;
+ }
+ msa->sqalloc = nseq;
+ msa->sqlen = NULL;
+ msa->sslen = NULL;
+ msa->salen = NULL;
+ msa->pplen = NULL;
+ msa->lastidx = 0;
+
+ /* Unparsed markup, including comments and Stockholm tags.
+ * GS, GC, and GR Stockholm tags require keyhash augmentation
+ */
+ msa->comment = NULL;
+ msa->ncomment = 0;
+ msa->alloc_ncomment = 0;
+
+ msa->gf_tag = NULL;
+ msa->gf = NULL;
+ msa->ngf = 0;
+ msa->alloc_ngf = 0;
+
+ msa->gs_tag = NULL;
+ msa->gs = NULL;
+ msa->ngs = 0;
+
+ msa->gc_tag = NULL;
+ msa->gc = NULL;
+ msa->ngc = 0;
+
+ msa->gr_tag = NULL;
+ msa->gr = NULL;
+ msa->ngr = 0;
+
+#ifdef eslAUGMENT_KEYHASH
+ msa->index = esl_keyhash_Create();
+ msa->gs_idx = NULL;
+ msa->gc_idx = NULL;
+ msa->gr_idx = NULL;
+#endif /*eslAUGMENT_KEYHASH*/
+
+#ifdef eslAUGMENT_SSI
+ msa->offset = 0;
+#endif
+
+ /* Allocation, round 2.
+ */
+ if(nseq > 0) {
+ ESL_ALLOC(msa->sqname, sizeof(char *) * nseq);
+ ESL_ALLOC(msa->wgt, sizeof(double) * nseq);
+ ESL_ALLOC(msa->sqlen, sizeof(int64_t)* nseq);
+ }
+ /* Initialize at the second level.
+ */
+ for (i = 0; i < nseq; i++)
+ {
+ msa->sqname[i] = NULL;
+ msa->sqlen[i] = 0;
+ msa->wgt[i] = -1.0; /* "unset so far" */
+ }
+
+ return msa;
+
+ ERROR:
+ esl_msa_Destroy(msa);
+ return NULL;
+}
+/*------------------- end, ESL_MSA object -----------------------*/
+
+
+
+/*****************************************************************
+ *# 2. Digital mode MSA's (augmentation: alphabet)
+ *****************************************************************/
+#ifdef eslAUGMENT_ALPHABET
+
+/* Function: esl_msa_GuessAlphabet()
+ * Synopsis: Guess alphabet of MSA.
+ *
+ * Purpose: Guess whether the sequences in the <msa> are
+ * <eslDNA>, <eslRNA>, or <eslAMINO>, and return
+ * that guess in <*ret_type>.
+ *
+ * The determination is made based on the classifications
+ * of the individual sequences in the alignment. At least
+ * one sequence must contain ten residues or more to be
+ * classified. If one or more sequences is called
+ * <eslAMINO> and one or more is called <eslDNA>/<eslRNA>,
+ * the alignment's alphabet is considered to be
+ * indeterminate (<eslUNKNOWN>). If some sequences are
+ * <eslDNA> and some are <eslRNA>, the alignment is called
+ * <eslDNA>; this should cause no problems, because Easel
+ * reads U as a synonym for T in DNA sequence anyway.
+ *
+ * Tested on Pfam 21.0 and Rfam 7.0, this routine correctly
+ * classified all 8957 Pfam alignments as protein, and 503
+ * Rfam alignments as RNA (both seed and full alignments).
+ *
+ * Returns: <eslOK> on success, and <*ret_type> is set
+ * to <eslDNA>, <eslRNA>, or <eslAMINO>.
+ *
+ * Returns <eslENOALPHABET> and sets <*ret_type> to
+ * <eslUNKNOWN> if the alphabet cannot be reliably guessed.
+ *
+ * Xref: J1/62
+ */
+int
+esl_msa_GuessAlphabet(const ESL_MSA *msa, int *ret_type)
+{
+ int64_t namino = 0,
+ ndna = 0,
+ nrna = 0,
+ nunknown = 0;
+ int type;
+ int i,x;
+ int64_t j,n;
+ int64_t ct[26];
+
+ if (msa->flags & eslMSA_DIGITAL) { *ret_type = msa->abc->type; return eslOK; }
+
+ *ret_type = eslUNKNOWN;
+
+ /* On wide alignments, we're better off looking at individual sequence
+ * classifications. We don't want to end up calling the whole alignment
+ * indeterminate just because a few sequences have degenerate residue
+ * codes.
+ */
+ for (i = 0; i < msa->nseq; i++)
+ {
+ for (x = 0; x < 26; x++) ct[x] = 0;
+ for (n = 0, j = 0; j < msa->alen; j++) {
+ x = toupper(msa->aseq[i][j]) - 'A';
+ if (x < 0 || x > 25) continue;
+ ct[x]++;
+ n++;
+ if (n > 10000) break; /* ought to know by now */
+ }
+ esl_abc_GuessAlphabet(ct, &type);
+
+ switch (type) {
+ case eslAMINO: namino++; break;
+ case eslDNA: ndna++; break;
+ case eslRNA: nrna++; break;
+ default: nunknown++;
+ }
+ }
+ if (namino > 0 && (ndna+nrna) == 0) *ret_type = eslAMINO;
+ else if (ndna > 0 && (nrna+namino) == 0) *ret_type = eslDNA;
+ else if (nrna > 0 && (ndna+namino) == 0) *ret_type = eslRNA;
+ else if (ndna+nrna > 0 && namino == 0) *ret_type = eslDNA;
+
+ /* On narrow alignments, no single sequence may be long enough to
+ * be classified, but we can determine alphabet from composition
+ * of the complete alignment. Of course, degenerate residue codes in
+ * a DNA alignment will still screw us.
+ */
+ if (*ret_type == eslUNKNOWN)
+ {
+
+ n = 0;
+ for (x = 0; x < 26; x++) ct[x] = 0;
+ for (i = 0; i < msa->nseq; i++) {
+ for (j = 0; j < msa->alen; j++) {
+ x = toupper(msa->aseq[i][j]) - 'A';
+ if (x < 0 || x > 26) continue;
+ ct[x]++;
+ n++;
+ if (n > 10000) break; /* ought to know by now */
+ }
+ if (n > 10000) break;
+ }
+ esl_abc_GuessAlphabet(ct, ret_type);
+ }
+
+ if (*ret_type == eslUNKNOWN) return eslENOALPHABET;
+ else return eslOK;
+}
+
+
+/* Function: esl_msa_CreateDigital()
+ * Synopsis: Create a digital <ESL_MSA>.
+ *
+ * Purpose: Same as <esl_msa_Create()>, except the returned MSA is configured
+ * for a digital alignment using internal alphabet <abc>, instead of
+ * a text alignment.
+ *
+ * Internally, this means the <ax> field is allocated instead of
+ * the <aseq> field, and the <eslMSA_DIGITAL> flag is raised.
+ *
+ * Args: <nseq> - number of sequences, or nseq allocation blocksize
+ * <alen> - length of alignment in columns, or -1
+ *
+ * Returns: pointer to new MSA object, w/ all values initialized.
+ * Note that <msa->nseq> is initialized to 0, even though space
+ * is allocated.
+ *
+ * Throws: NULL on allocation failure.
+ *
+ * Xref: squid's MSAAlloc()
+ */
+ESL_MSA *
+esl_msa_CreateDigital(const ESL_ALPHABET *abc, int nseq, int64_t alen)
+{
+ int status;
+ ESL_MSA *msa;
+ int i;
+
+ msa = msa_create_mostly(nseq, alen); /* aseq is null upon successful return */
+ if (msa == NULL) return NULL; /* already threw error in mostly_create, so percolate */
+
+ ESL_ALLOC(msa->ax, sizeof(ESL_DSQ *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++)
+ msa->ax[i] = NULL;
+
+ if (alen != -1)
+ {
+ for (i = 0; i < nseq; i++) {
+ ESL_ALLOC(msa->ax[i], sizeof(ESL_DSQ) * (alen+2));
+ msa->ax[i][0] = msa->ax[i][alen+1] = eslDSQ_SENTINEL; /* help the poor */
+ }
+ msa->nseq = nseq;
+ }
+
+ msa->abc = (ESL_ALPHABET *) abc; /* this cast away from const-ness is deliberate & safe. */
+ msa->flags |= eslMSA_DIGITAL;
+ return msa;
+
+ ERROR:
+ esl_msa_Destroy(msa);
+ return NULL;
+}
+
+/* Function: esl_msa_Digitize()
+ * Synopsis: Digitizes an msa, converting it from text mode.
+ *
+ * Purpose: Given an alignment <msa> in text mode, convert it to
+ * digital mode, using alphabet <abc>.
+ *
+ * Internally, the <ax> digital alignment field is filled,
+ * the <aseq> text alignment field is destroyed and free'd,
+ * a copy of the alphabet pointer is kept in the msa's
+ * <abc> reference, and the <eslMSA_DIGITAL> flag is raised
+ * in <flags>.
+ *
+ * Because <esl_msa_Digitize()> may be called on
+ * unvalidated user data, <errbuf> may be passed, for
+ * capturing an informative error message. For example, in
+ * reading alignments from files, invalid characters in the
+ * alignment are caught at the digitization step.
+ *
+ * Args: abc - digital alphabet
+ * msa - multiple alignment to digitize
+ * errbuf - optional: error message buffer, or <NULL>
+ *
+ * Returns: <eslOK> on success;
+ * <eslEINVAL> if one or more sequences contain invalid characters
+ * that can't be digitized. If this happens, the <msa> is returned
+ * unaltered - left in text mode, with <aseq> as it was. (This is
+ * a normal error, because <msa->aseq> may be user input that we
+ * haven't validated yet.)
+ *
+ * Throws: <eslEMEM> on allocation failure; in this case, state of <msa> may be
+ * wedged, and it should only be destroyed, not used.
+ */
+int
+esl_msa_Digitize(const ESL_ALPHABET *abc, ESL_MSA *msa, char *errbuf)
+{
+ char errbuf2[eslERRBUFSIZE];
+ int i;
+ int status;
+
+ /* Contract checks */
+ if (msa->aseq == NULL) ESL_EXCEPTION(eslEINVAL, "msa has no text alignment");
+ if (msa->ax != NULL) ESL_EXCEPTION(eslEINVAL, "msa already has digital alignment");
+ if (msa->flags & eslMSA_DIGITAL) ESL_EXCEPTION(eslEINVAL, "msa is flagged as digital");
+
+ /* Validate before we convert. Then we can leave the <aseq> untouched if
+ * any of the sequences contain invalid characters.
+ */
+ for (i = 0; i < msa->nseq; i++)
+ if (esl_abc_ValidateSeq(abc, msa->aseq[i], msa->alen, errbuf2) != eslOK)
+ ESL_FAIL(eslEINVAL, errbuf, "%s: %s", msa->sqname[i], errbuf2);
+
+ /* Convert, sequence-by-sequence, free'ing aseq as we go. */
+ ESL_ALLOC(msa->ax, msa->sqalloc * sizeof(ESL_DSQ *));
+ for (i = 0; i < msa->nseq; i++)
+ {
+ ESL_ALLOC(msa->ax[i], (msa->alen+2) * sizeof(ESL_DSQ));
+ status = esl_abc_Digitize(abc, msa->aseq[i], msa->ax[i]);
+ if (status != eslOK) goto ERROR;
+ free(msa->aseq[i]);
+ }
+ for (; i < msa->sqalloc; i++)
+ msa->ax[i] = NULL;
+ free(msa->aseq);
+ msa->aseq = NULL;
+
+ msa->abc = (ESL_ALPHABET *) abc; /* convince compiler that removing const-ness is safe */
+ msa->flags |= eslMSA_DIGITAL;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_msa_Textize()
+ * Synopsis: Convert a digital msa to text mode.
+ *
+ * Purpose: Given an alignment <msa> in digital mode, convert it
+ * to text mode.
+ *
+ * Internally, the <aseq> text alignment field is filled, the
+ * <ax> digital alignment field is destroyed and free'd, the
+ * msa's <abc> digital alphabet reference is nullified, and
+ * the <eslMSA_DIGITAL> flag is dropped in <flags>.
+ *
+ * Args: msa - multiple alignment to convert to text
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslECORRUPT> if one or more of the digitized alignment strings
+ * contain invalid characters.
+ */
+int
+esl_msa_Textize(ESL_MSA *msa)
+{
+ int status;
+ int i;
+
+ /* Contract checks
+ */
+ if (msa->ax == NULL) ESL_EXCEPTION(eslEINVAL, "msa has no digital alignment");
+ if (msa->aseq != NULL) ESL_EXCEPTION(eslEINVAL, "msa already has text alignment");
+ if (! (msa->flags & eslMSA_DIGITAL)) ESL_EXCEPTION(eslEINVAL, "msa is not flagged as digital");
+ if (msa->abc == NULL) ESL_EXCEPTION(eslEINVAL, "msa has no digital alphabet");
+
+ /* Convert, sequence-by-sequence, free'ing ax as we go.
+ */
+ ESL_ALLOC(msa->aseq, msa->sqalloc * sizeof(char *));
+ for (i = 0; i < msa->nseq; i++)
+ {
+ ESL_ALLOC(msa->aseq[i], (msa->alen+1) * sizeof(char));
+ status = esl_abc_Textize(msa->abc, msa->ax[i], msa->alen, msa->aseq[i]);
+ if (status != eslOK) goto ERROR;
+ free(msa->ax[i]);
+ }
+ for (; i < msa->sqalloc; i++)
+ msa->aseq[i] = NULL;
+ free(msa->ax);
+ msa->ax = NULL;
+
+ msa->abc = NULL; /* nullify reference (caller still owns real abc) */
+ msa->flags &= ~eslMSA_DIGITAL; /* drop the flag */
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_msa_ConvertDegen2X()
+ * Synopsis: Convert all degenerate residues to X/N
+ *
+ * Purpose: Convert all the degenerate residue codes in digital
+ * MSA <msa> to the code for "unknown residue" (maximum
+ * degeneracy); for example, X for protein, N for
+ * nucleic acid.
+ *
+ * This is handy when you need to be compatible with
+ * software that can't deal with unusual residue codes.
+ * For example, WU-BLAST can't deal with O (pyrrolysine)
+ * codes.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <msa> isn't in digital mode.
+ * (We only know how to interpret the alphabet in digital
+ * mode. In text mode, letters are just letters.)
+ */
+int
+esl_msa_ConvertDegen2X(ESL_MSA *msa)
+{
+ int i;
+ int status;
+
+ if (! (msa->flags & eslMSA_DIGITAL)) ESL_EXCEPTION(eslEINVAL, "esl_msa_ConvertDegen2X only works on digital sequences");
+
+ for (i = 0; i < msa->nseq; i++)
+ if ((status = esl_abc_ConvertDegen2X(msa->abc, msa->ax[i])) != eslOK) return status;
+
+ return eslOK;
+}
+
+
+#endif /* eslAUGMENT_ALPHABET */
+/*---------------------- end of digital MSA functions -----------------------*/
+
+
+
+/*****************************************************************
+ *# 3. Setting, checking data fields in an ESL_MSA
+ *****************************************************************/
+
+/* These get used by parsers, which might be using an ESL_BUFFER.
+ * They need to handle either NUL-terminated strings or memory lines.
+ */
+
+/* Function: esl_msa_SetName()
+ * Synopsis: Set name of an MSA.
+ *
+ * Purpose: Sets the name of the msa <msa> to string <s>,
+ * of length <n>.
+ *
+ * If <s> is a NUL-terminated string, <n> is optional; if
+ * the length is unknown, pass <n=-1>. <s> may also be a
+ * memory line, non-NUL terminated, in which case <n> is
+ * required.
+ *
+ * <s> can also be <NULL> because the MSA name is an
+ * optional field. (In this case, <n> is irrelevant and
+ * ignored.)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_msa_SetName(ESL_MSA *msa, const char *s, esl_pos_t n)
+{
+ if (msa->name) free(msa->name);
+ if (n > 0) return esl_memstrdup(s, n, &(msa->name));
+ else return esl_strdup( s, -1, &(msa->name));
+}
+
+
+/* Function: esl_msa_SetDesc()
+ * Synopsis: Set the description line of an MSA.
+ *
+ * Purpose: Sets the optional description line of the msa <msa> to
+ * string <s> of length <n>.
+ *
+ * If <s> is a NUL-terminated string, <n> is optional; if
+ * the length is unknown, pass <n=-1>. <s> may also be a
+ * memory line, non-NUL terminated, in which case <n> is
+ * required.
+ *
+ * <s> can also be <NULL> because the MSA description is an
+ * optional field. (In this case, <n> is irrelevant and
+ * ignored.)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_msa_SetDesc(ESL_MSA *msa, const char *s, esl_pos_t n)
+{
+ if (msa->desc) free(msa->desc);
+ if (n > 0) return esl_memstrdup(s, n, &(msa->desc));
+ else return esl_strdup( s, -1, &(msa->desc));
+}
+
+/* Function: esl_msa_SetAccession()
+ * Synopsis: Set the accession field of an MSA.
+ *
+ * Purpose: Sets accession field of the msa <msa> to string <s> of
+ * length <n>.
+ *
+ * If <s> is a NUL-terminated string, <n> is optional; if
+ * the length is unknown, pass <n=-1>. <s> may also be a
+ * memory line, non-NUL terminated, in which case <n> is
+ * required.
+ *
+ * <s> can also be <NULL> because the MSA accession is an
+ * optional field. (In this case, <n> is irrelevant and
+ * ignored.)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_msa_SetAccession(ESL_MSA *msa, const char *s, esl_pos_t n)
+{
+ if (msa->acc) free(msa->acc);
+ if (n > 0) return esl_memstrdup(s, n, &(msa->acc));
+ else return esl_strdup( s, -1, &(msa->acc));
+}
+
+
+/* Function: esl_msa_SetAuthor()
+ * Synopsis: Set the author string in an MSA.
+ *
+ * Purpose: Sets the author string in <msa> to string <s> of
+ * length <n>.
+ *
+ * If <s> is a NUL-terminated string, <n> is optional; if
+ * the length is unknown, pass <n=-1>. <s> may also be a
+ * memory line, non-NUL terminated, in which case <n> is
+ * required.
+ *
+ * <s> can also be <NULL> because the MSA author is an
+ * optional field. (In this case, <n> is irrelevant and
+ * ignored.)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_msa_SetAuthor(ESL_MSA *msa, const char *s, esl_pos_t n)
+{
+ if (msa->au) free(msa->au);
+ if (n > 0) return esl_memstrdup(s, n, &(msa->au));
+ else return esl_strdup( s, -1, &(msa->au));
+}
+
+
+/* Function: esl_msa_SetSeqName()
+ * Synopsis: Set an individual sequence name in an MSA.
+ *
+ * Purpose: Set the name of sequence number <idx> in <msa>
+ * to string <s> of length <n>.
+ *
+ * If <s> is a NUL-terminated string, <n> is optional; if
+ * the length is unknown, pass <n=-1>. <s> may also be a
+ * memory line, non-NUL terminated, in which case <n> is
+ * required.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEINCONCEIVABLE> on coding errors.
+ *
+ * Note: msa->sqname[] is not optional, so we may
+ * rely on it already being allocated for
+ * i=0..sqalloc-1.
+ */
+int
+esl_msa_SetSeqName(ESL_MSA *msa, int idx, const char *s, esl_pos_t n)
+{
+ if (idx >= msa->sqalloc) ESL_EXCEPTION(eslEINCONCEIVABLE, "no such sequence %d (only %d allocated)", idx, msa->sqalloc);
+ if (s == NULL) ESL_EXCEPTION(eslEINCONCEIVABLE, "seq names are mandatory; NULL is not a valid name");
+
+ if (msa->sqname[idx]) free(msa->sqname[idx]);
+ if (n > 0) return esl_memstrdup(s, n, &(msa->sqname[idx]));
+ else return esl_strdup( s, -1, &(msa->sqname[idx]));
+}
+
+/* Function: esl_msa_SetSeqAccession()
+ * Synopsis: Sets individual sequence accession in an MSA.
+ *
+ * Purpose: Set the accession of sequence number <idx> in <msa> to
+ * string <s> of length <n>.
+ *
+ * If <s> is a NUL-terminated string, <n> is optional; if
+ * the length is unknown, pass <n=-1>. <s> may also be a
+ * memory line, non-NUL terminated, in which case <n> is
+ * required.
+ *
+ * <s> can also be <NULL> because a seq accession is an
+ * optional field. (In this case, <n> is irrelevant and
+ * ignored.)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEINCONCEIVABLE> on coding errors.
+ */
+int
+esl_msa_SetSeqAccession(ESL_MSA *msa, int idx, const char *s, esl_pos_t n)
+{
+ int i;
+ int status;
+
+ if (idx >= msa->sqalloc) ESL_EXCEPTION(eslEINCONCEIVABLE, "no such sequence %d (only %d allocated)", idx, msa->sqalloc);
+
+ if (msa->sqacc && msa->sqacc[idx]) { free(msa->sqacc[idx]); msa->sqacc[idx] = NULL; }
+
+ /* erasure case */
+ if (! s && msa->sqacc) {
+ for (i = 0; i < msa->sqalloc; i++) if (msa->sqacc[i]) break;
+ if (i == msa->sqalloc) { free(msa->sqacc); msa->sqacc = NULL; }
+ return eslOK;
+ }
+
+ /* Allocate/initialize the optional sqacc array, if it's not already done: */
+ if (! msa->sqacc) {
+ ESL_ALLOC(msa->sqacc, sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++) msa->sqacc[i] = NULL;
+ }
+
+ if (n > 0) status = esl_memstrdup(s, n, &(msa->sqacc[idx]));
+ else status = esl_strdup( s, -1, &(msa->sqacc[idx]));
+
+ return status;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_msa_SetSeqDescription()
+ * Synopsis: Sets individual sequence description in an MSA.
+ *
+ * Purpose: Set the description of sequence number <idx> in <msa> to
+ * string <s> of length <n>.
+ *
+ * If <s> is a NUL-terminated string, <n> is optional; if
+ * the length is unknown, pass <n=-1>. <s> may also be a
+ * memory line, non-NUL terminated, in which case <n> is
+ * required.
+ *
+ * <s> can also be <NULL> because a seq accession is an
+ * optional field. (In this case, <n> is irrelevant and
+ * ignored.)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEINCONCEIVABLE> on coding error
+ */
+int
+esl_msa_SetSeqDescription(ESL_MSA *msa, int idx, const char *s, esl_pos_t n)
+{
+ int i;
+ int status;
+
+ if (idx >= msa->sqalloc) ESL_EXCEPTION(eslEINCONCEIVABLE, "no such sequence %d (only %d allocated)", idx, msa->sqalloc);
+
+ if (msa->sqdesc && msa->sqdesc[idx]) { free(msa->sqdesc[idx]); msa->sqdesc[idx] = NULL; }
+
+ /* erasure case. If we just freed the only description, free the entire optional <sqdesc> array */
+ if (! s && msa->sqdesc) {
+ for (i = 0; i < msa->sqalloc; i++) if (msa->sqdesc[i]) break;
+ if (i == msa->sqalloc) { free(msa->sqdesc); msa->sqdesc = NULL; }
+ return eslOK;
+ }
+
+ /* Allocate/initialize the optional sqdesc array, if it's not already done: */
+ if (msa->sqdesc == NULL) {
+ ESL_ALLOC(msa->sqdesc, sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++) msa->sqdesc[i] = NULL;
+ }
+
+ if (n > 0) status = esl_memstrdup(s, n, &(msa->sqdesc[idx]));
+ else status = esl_strdup( s, -1, &(msa->sqdesc[idx]));
+
+ ERROR:
+ return status;
+}
+
+
+
+/* Function: esl_msa_SetDefaultWeights()
+ * Synopsis: Set all sequence weights to default 1.0.
+ *
+ * Purpose: Set all the sequence weights in <msa> to default,
+ * 1.0. Drop the <eslMSA_HASWGTS> flag in <msa->flags>.
+ *
+ * The <ESL_MSA> data structure has its <wgt> values
+ * initialized to -1.0, by create and expand functions, as
+ * a special value for "unset yet". File format parsers use
+ * this to tell when a weight is mistakenly set twice, or
+ * not at all. However, when an <msa> is used, you're
+ * allowed to assume that <wgt> is valid even if the
+ * <eslMSA_HASWGTS> flag is down. So all creators of new
+ * MSAs (file format parsers, for example) must assure that
+ * <msa->wgt> is set correctly, even if the file format
+ * doesn't include weights. This function gives parsers
+ * (and other MSA creators) a quick way to do this.
+ */
+int
+esl_msa_SetDefaultWeights(ESL_MSA *msa)
+{
+ int idx;
+
+ for (idx = 0; idx < msa->nseq; idx++)
+ msa->wgt[idx] = 1.0;
+ msa->flags &= ~eslMSA_HASWGTS;
+ return eslOK;
+}
+
+
+/* Function: esl_msa_FormatName()
+ * Synopsis: Format name of an MSA, printf()-style.
+ *
+ * Purpose: Sets the name of the msa <msa> using <name>, where
+ * <name> is a <printf()>-style format with
+ * arguments; for example, <esl_msa_FormatName(msa, "random%d", i)>.
+ *
+ * <name> can be <NULL>, because the MSA name is an
+ * optional field; in which case any existing name in
+ * the <msa> is erased.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslESYS> if a <*printf()> library call fails.
+ */
+int
+esl_msa_FormatName(ESL_MSA *msa, const char *name, ...)
+{
+ va_list ap;
+ int status;
+
+ if (msa->name != NULL) free(msa->name);
+ if (name == NULL) { msa->name = NULL; return eslOK; }
+
+ va_start(ap, name);
+ status = esl_vsprintf(&(msa->name), name, &ap);
+ va_end(ap);
+ return status;
+}
+
+
+/* Function: esl_msa_FormatDesc()
+ * Synopsis: Format the description line of an MSA, printf()-style.
+ *
+ * Purpose: Format the description line of the msa <msa> using <desc>.
+ * where <desc> is a <printf()>-style format with
+ * arguments.
+ * For example, <esl_msa_FormatDesc(msa, "sample %d", i)>.
+ *
+ * As a special case, <desc> may be <NULL>, to facilitate
+ * handling of optional annotation.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslESYS> if a <*printf()> library call fails.
+ */
+int
+esl_msa_FormatDesc(ESL_MSA *msa, const char *desc, ...)
+{
+ va_list ap;
+ int status;
+
+ if (msa->desc != NULL) free(msa->desc);
+ va_start(ap, desc);
+ status = esl_vsprintf(&(msa->desc), desc, &ap);
+ va_end(ap);
+ return status;
+
+}
+
+/* Function: esl_msa_FormatAccession()
+ * Synopsis: Format the accession number of an MSA, printf()-style.
+ *
+ * Purpose: Sets accession number of the msa <msa> using <acc>,
+ * where <acc> is a <printf()>-style format with arguments.
+ * For example, <esl_msa_FormatAccession(msa, "PF%06d", i)>.
+ *
+ * As a special case, <acc> may be <NULL>, to facilitate
+ * handling of optional annotation.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslESYS> if a <*printf()> library call fails.
+ */
+int
+esl_msa_FormatAccession(ESL_MSA *msa, const char *acc, ...)
+{
+ va_list ap;
+ int status;
+
+ if (msa->acc != NULL) free(msa->acc);
+ va_start(ap, acc);
+ status = esl_vsprintf(&(msa->acc), acc, &ap);
+ va_end(ap);
+ return status;
+}
+
+
+/* Function: esl_msa_FormatAuthor()
+ * Synopsis: Format the author string in an MSA, printf()-style.
+ *
+ * Purpose: Sets the author string in <msa>, using an <author> string
+ * and arguments in same format as <printf()> would take.
+ *
+ * As a special case, <author> may be <NULL>, to facilitate
+ * handling of optional annotation.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslESYS> if a <*printf()> library call fails.
+ */
+int
+esl_msa_FormatAuthor(ESL_MSA *msa, const char *author, ...)
+{
+ va_list ap;
+ int status;
+
+ if (msa->au != NULL) free(msa->au);
+ va_start(ap, author);
+ status = esl_vsprintf(&(msa->au), author, &ap);
+ va_end(ap);
+ return status;
+}
+
+
+/* Function: esl_msa_FormatSeqName()
+ * Synopsis: Formats an individual sequence name in an MSA, printf()-style.
+ *
+ * Purpose: Set the name of sequence number <idx> in <msa>
+ * to <name>, where <name> is a <printf()>
+ * style format and arguments.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <name> is <NULL>;
+ * <eslEMEM> on allocation error;
+ * <eslESYS> if a <*printf()> library call fails.
+ *
+ * Note: msa->sqname[] is not optional, so we may
+ * rely on it already being allocated for
+ * i=0..sqalloc-1.
+ */
+int
+esl_msa_FormatSeqName(ESL_MSA *msa, int idx, const char *name, ...)
+{
+ va_list ap;
+ int status;
+
+ if (idx >= msa->sqalloc) ESL_EXCEPTION(eslEINVAL, "no such sequence %d (only %d allocated)", idx, msa->sqalloc);
+ if (name == NULL) ESL_EXCEPTION(eslEINVAL, "seq names are mandatory; NULL is not a valid name");
+
+ if (msa->sqname[idx] != NULL) free(msa->sqname[idx]);
+
+ va_start(ap, name);
+ status = esl_vsprintf(&(msa->sqname[idx]), name, &ap);
+ va_end(ap);
+ return status;
+}
+
+/* Function: esl_msa_FormatSeqAccession()
+ * Synopsis: Format individual sequence accession in an MSA, printf()-style.
+ *
+ * Purpose: Set the accession of sequence number <idx> in <msa> to
+ * <acc>, where <acc> is a <printf()> style format and
+ * arguments.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslESYS> if a <*printf()> library call fails.
+ */
+int
+esl_msa_FormatSeqAccession(ESL_MSA *msa, int idx, const char *acc, ...)
+{
+ va_list ap;
+ int i;
+ int status;
+
+ if (idx >= msa->sqalloc) ESL_EXCEPTION(eslEINVAL, "no such sequence %d (only %d allocated)", idx, msa->sqalloc);
+ if (acc == NULL) {
+ if (msa->sqacc != NULL) { free(msa->sqacc[idx]); msa->sqacc[idx] = NULL; }
+ return eslOK;
+ }
+
+ /* Allocate/initialize the optional sqacc array, if it's not already done: */
+ if (msa->sqacc == NULL) {
+ ESL_ALLOC(msa->sqacc, sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++) msa->sqacc[i] = NULL;
+ }
+ if (msa->sqacc[idx] != NULL) free(msa->sqacc[idx]);
+
+ va_start(ap, acc);
+ status = esl_vsprintf(&(msa->sqacc[idx]), acc, &ap);
+ va_end(ap);
+ return status;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_msa_FormatSeqDescription()
+ * Synopsis: Formats individual sequence description in an MSA, printf()-style.
+ *
+ * Purpose: Set the description of sequence number <idx> in <msa> to
+ * <desc>, where <desc> may be a <printf()> style format and
+ * arguments.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslESYS> if a <*printf()> library call fails.
+ */
+int
+esl_msa_FormatSeqDescription(ESL_MSA *msa, int idx, const char *desc, ...)
+{
+ va_list ap;
+ int i;
+ int status;
+
+ if (idx >= msa->sqalloc) ESL_EXCEPTION(eslEINVAL, "no such sequence %d (only %d allocated)", idx, msa->sqalloc);
+ if (desc == NULL) {
+ if (msa->sqdesc != NULL) { free(msa->sqdesc[idx]); msa->sqdesc[idx] = NULL; }
+ return eslOK;
+ }
+
+ /* Allocate/initialize the optional sqdesc array, if it's not already done: */
+ if (msa->sqdesc == NULL) {
+ ESL_ALLOC(msa->sqdesc, sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++) msa->sqdesc[i] = NULL;
+ }
+ if (msa->sqdesc[idx] != NULL) free(msa->sqdesc[idx]);
+
+ va_start(ap, desc);
+ status = esl_vsprintf(&(msa->sqdesc[idx]), desc, &ap);
+ va_end(ap);
+ return status;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_msa_AddComment()
+ * Synopsis: Add an unparsed command to an <ESL_MSA>
+ *
+ * Purpose: Add an (unparsed) comment line to the MSA structure,
+ * allocating as necessary.
+ *
+ * Args: msa - a multiple alignment
+ * p - comment line to add
+ * n - length of <p>, or -1 if <p> is a NUL-terminated string and length is unknown.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_msa_AddComment(ESL_MSA *msa, char *p, esl_pos_t n)
+{
+ int status;
+
+ if (n == -1) n = strlen(p);
+
+ /* If this is our first recorded comment, we need to allocate;
+ * and if we've filled available space, we need to reallocate.
+ */
+ if (msa->comment == NULL) {
+ ESL_ALLOC(msa->comment, sizeof(char *) * 16);
+ msa->alloc_ncomment = 16;
+ }
+ if (msa->ncomment == msa->alloc_ncomment) {
+ ESL_REALLOC(msa->comment, sizeof(char *) * msa->alloc_ncomment * 2);
+ msa->alloc_ncomment *= 2;
+ }
+ if ((status = esl_memstrdup(p, n, &(msa->comment[msa->ncomment]))) != eslOK) goto ERROR;
+ msa->ncomment++;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_msa_AddGF()
+ * Synopsis: Add an unparsed #=GF markup line to an <ESL_MSA>
+ *
+ * Purpose: Add an unparsed \verb+#=GF+ markup line to the MSA,
+ * allocating as necessary. <tag> is the GF markup
+ * tag; <value> is the text associated w/ that tag.
+ *
+ * Args: msa - a multiple alignment
+ * tag - markup tag
+ * taglen - length of <tag>; or -1 if <tag> is a string of unknown length
+ * value - markup text
+ * vlen - length of <value>; or -1 if <value> is a string of unknown length
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_msa_AddGF(ESL_MSA *msa, char *tag, esl_pos_t taglen, char *value, esl_pos_t vlen)
+{
+ int n;
+ int status;
+
+ if (taglen == -1) taglen = strlen(tag);
+ if (vlen == -1) vlen = strlen(value);
+
+ /* Initialize or grow the allocation? */
+ if (msa->ngf == msa->alloc_ngf) {
+ n = (msa->alloc_ngf == 0 ? 16 : msa->alloc_ngf * 2);
+ ESL_REALLOC(msa->gf_tag, sizeof(char *) * n);
+ ESL_REALLOC(msa->gf, sizeof(char *) * n);
+ msa->alloc_ngf = n;
+ }
+
+ if ((status = esl_memstrdup(tag, taglen, &(msa->gf_tag[msa->ngf]))) != eslOK) goto ERROR;
+ if ((status = esl_memstrdup(value, vlen, &(msa->gf[msa->ngf]))) != eslOK) goto ERROR;
+ msa->ngf++;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_msa_AddGS()
+ * Synopsis: Add an unparsed #=GS markup line to an <ESL_MSA>
+ *
+ * Purpose: Add an unparsed \verb+#=GS+ markup line to the MSA,
+ * allocating as necessary. It's possible that we
+ * could get more than one of the same type of GS
+ * tag per sequence; for example, "DR PDB;" structure
+ * links in Pfam. Hack: handle these by appending to
+ * the string, in a \verb+\n+ separated fashion.
+ *
+ * Args: msa - multiple alignment structure
+ * tag - markup tag (e.g. "AC")
+ * taglen - length of <tag>; or -1 if <tag> is a string of unknown length
+ * sqidx - index of sequence to assoc markup with (0..nseq-1)
+ * value - markup (e.g. "P00666")
+ * vlen - length of <value>; or -1 if <value> is string of unknown length
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_msa_AddGS(ESL_MSA *msa, char *tag, esl_pos_t taglen, int sqidx, char *value, esl_pos_t vlen)
+{
+ int tagidx;
+ int i;
+ int status;
+
+ if (taglen == -1) taglen = strlen(tag);
+ if (vlen == -1) vlen = strlen(value);
+
+ /* first GS tag? init&allocate */
+ if (msa->gs_tag == NULL)
+ {
+#ifdef eslAUGMENT_KEYHASH
+ msa->gs_idx = esl_keyhash_Create();
+ status = esl_keyhash_Store(msa->gs_idx, tag, taglen, &tagidx);
+ if (status != eslOK && status != eslEDUP) return status;
+ ESL_DASSERT1((tagidx == 0));
+#else
+ tagidx = 0;
+#endif
+ ESL_ALLOC(msa->gs_tag, sizeof(char *)); /* one at a time. */
+ ESL_ALLOC(msa->gs, sizeof(char **));
+ ESL_ALLOC(msa->gs[0], sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++)
+ msa->gs[0][i] = NULL;
+ }
+ else
+ {
+ /* Get a tagidx for this GS tag.
+ * tagidx < ngs; we already saw this tag;
+ * tagidx == ngs; this is a new one.
+ */
+#ifdef eslAUGMENT_KEYHASH
+ status = esl_keyhash_Store(msa->gs_idx, tag, taglen, &tagidx);
+ if (status != eslOK && status != eslEDUP) return status;
+#else
+ for (tagidx = 0; tagidx < msa->ngs; tagidx++)
+ if (esl_memstrcmp(tag, taglen, msa->gs_tag[tagidx])) break;
+#endif
+ /* Reallocation (in blocks of 1) */
+ if (tagidx == msa->ngs )
+ {
+ ESL_REALLOC(msa->gs_tag, (msa->ngs+1) * sizeof(char *));
+ ESL_REALLOC(msa->gs, (msa->ngs+1) * sizeof(char **));
+ msa->gs[tagidx] = NULL;
+ ESL_ALLOC(msa->gs[tagidx], sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++)
+ msa->gs[tagidx][i] = NULL;
+ }
+ }
+
+ /* Store the tag, if it's new.
+ */
+ if (tagidx == msa->ngs)
+ {
+ if ((status = esl_memstrdup(tag, taglen, &(msa->gs_tag[tagidx]))) != eslOK) goto ERROR;
+ msa->ngs++;
+ }
+
+ /* Store the annotation on the sequence.
+ * If seq is unannotated, dup the value; if
+ * seq already has a GS annotation, cat a \n, then cat the value.
+ */
+ if (msa->gs[tagidx][sqidx] == NULL)
+ {
+ if ((status = esl_memstrdup(value, vlen, &(msa->gs[tagidx][sqidx]))) != eslOK) goto ERROR;
+ }
+ else
+ {
+ esl_pos_t n1,n2;
+ n1 = strlen(msa->gs[tagidx][sqidx]);
+ n2 = (vlen == -1 ? strlen(value) : vlen);
+ ESL_REALLOC(msa->gs[tagidx][sqidx], sizeof(char) * (n1+n2+2)); /* +2 for \n, \0 */
+ msa->gs[tagidx][sqidx][n1] = '\n';
+ memcpy(msa->gs[tagidx][sqidx]+n1+1, value, n2);
+ msa->gs[tagidx][sqidx][n1+n2+1] = '\0';
+ }
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_msa_AppendGC()
+ * Synopsis: Add an unparsed #=GC markup line to an <ESL_MSA>
+ *
+ * Purpose: Add an unparsed \verb+#=GC+ markup line to the MSA
+ * structure, allocating as necessary. When called
+ * multiple times for the same tag, appends value
+ * strings together -- used when parsing multiblock
+ * alignment files, for example.
+ *
+ * Args: msa - multiple alignment structure
+ * tag - markup tag (e.g. "CS")
+ * value - markup, one char per aligned column
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_msa_AppendGC(ESL_MSA *msa, char *tag, char *value)
+{
+ int tagidx;
+ int status;
+ void *p;
+
+ /* Is this an unparsed tag name that we recognize?
+ * If not, handle adding it to index, and reallocating
+ * as needed.
+ */
+ if (msa->gc_tag == NULL) /* first tag? init&allocate */
+ {
+#ifdef eslAUGMENT_KEYHASH
+ msa->gc_idx = esl_keyhash_Create();
+ status = esl_keyhash_Store(msa->gc_idx, tag, -1, &tagidx);
+ if (status != eslOK && status != eslEDUP) return status;
+ ESL_DASSERT1((tagidx == 0));
+#else
+ tagidx = 0;
+#endif
+ ESL_ALLOC(msa->gc_tag, sizeof(char *));
+ ESL_ALLOC(msa->gc, sizeof(char *));
+ msa->gc[0] = NULL;
+ }
+ else
+ { /* new tag? */
+ /* get tagidx for this GC tag. existing tag: <ngc; new: == ngc. */
+#ifdef eslAUGMENT_KEYHASH
+ status = esl_keyhash_Store(msa->gc_idx, tag, -1, &tagidx);
+ if (status != eslOK && status != eslEDUP) goto ERROR;
+#else
+ for (tagidx = 0; tagidx < msa->ngc; tagidx++)
+ if (strcmp(msa->gc_tag[tagidx], tag) == 0) break;
+#endif
+ /* Reallocate, in block of one tag at a time
+ */
+ if (tagidx == msa->ngc)
+ {
+ ESL_RALLOC(msa->gc_tag, p, (msa->ngc+1) * sizeof(char **));
+ ESL_RALLOC(msa->gc, p, (msa->ngc+1) * sizeof(char **));
+ msa->gc[tagidx] = NULL;
+ }
+ }
+ /* new tag? store it.
+ */
+ if (tagidx == msa->ngc)
+ {
+ if ((status = esl_strdup(tag, -1, &(msa->gc_tag[tagidx]))) != eslOK) goto ERROR;
+ msa->ngc++;
+ }
+ return (esl_strcat(&(msa->gc[tagidx]), -1, value, -1));
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_msa_AppendGR()
+ * Synopsis: Add an unparsed #=GR markup line to an <ESL_MSA>
+ *
+ * Purpose: Add an unparsed \verb+#=GR+ markup line to the MSA structure,
+ * allocating as necessary.
+ *
+ * When called multiple times for the same tag, appends
+ * value strings together -- used when parsing multiblock
+ * alignment files, for example.
+ *
+ * Args: msa - multiple alignment structure
+ * tag - markup tag (e.g. "SS")
+ * sqidx - index of seq to assoc markup with (0..nseq-1)
+ * value - markup, one char per aligned column
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_msa_AppendGR(ESL_MSA *msa, char *tag, int sqidx, char *value)
+{
+ void *p;
+ int tagidx;
+ int i;
+ int status;
+
+ if (msa->gr_tag == NULL) /* first tag? init&allocate */
+ {
+#ifdef eslAUGMENT_KEYHASH
+ msa->gr_idx = esl_keyhash_Create();
+ status = esl_keyhash_Store(msa->gr_idx, tag, -1, &tagidx);
+ if (status != eslOK && status != eslEDUP) return status;
+ ESL_DASSERT1((tagidx == 0));
+#else
+ tagidx = 0;
+#endif
+ ESL_ALLOC(msa->gr_tag, sizeof(char *));
+ ESL_ALLOC(msa->gr, sizeof(char **));
+ ESL_ALLOC(msa->gr[0], sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++)
+ msa->gr[0][i] = NULL;
+ }
+ else
+ {
+ /* get tagidx for this GR tag. existing<ngr; new=ngr.
+ */
+#ifdef eslAUGMENT_KEYHASH
+ status = esl_keyhash_Store(msa->gr_idx, tag, -1, &tagidx);
+ if (status != eslOK && status != eslEDUP) return status;
+#else
+ for (tagidx = 0; tagidx < msa->ngr; tagidx++)
+ if (strcmp(msa->gr_tag[tagidx], tag) == 0) break;
+#endif
+ /* if a new tag, realloc for it */
+ if (tagidx == msa->ngr)
+ {
+ ESL_RALLOC(msa->gr_tag, p, (msa->ngr+1) * sizeof(char *));
+ ESL_RALLOC(msa->gr, p, (msa->ngr+1) * sizeof(char **));
+ ESL_ALLOC(msa->gr[msa->ngr], sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++)
+ msa->gr[msa->ngr][i] = NULL;
+ }
+ }
+
+ if (tagidx == msa->ngr)
+ {
+ if ((status = esl_strdup(tag, -1, &(msa->gr_tag[tagidx]))) != eslOK) goto ERROR;
+ msa->ngr++;
+ }
+ return (esl_strcat(&(msa->gr[tagidx][sqidx]), -1, value, -1));
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_msa_CheckUniqueNames()
+ * Synopsis: Check if all seq names are unique.
+ *
+ * Purpose: Check whether all the sequence names in <msa>
+ * are unique; if so, return <eslOK>, and if not,
+ * return <eslFAIL>.
+ *
+ * Stockholm files require names to be unique. This
+ * function lets us check whether we need to munge seqnames
+ * before writing a Stockholm file.
+ *
+ * The check uses a keyhash, so it's efficient.
+ *
+ * Args: msa - alignment
+ *
+ * Returns: <eslOK> if names are unique.
+ * <eslFAIL> if not.
+ *
+ * Throws: <eslMEM> on allocation failure.
+ */
+int
+esl_msa_CheckUniqueNames(const ESL_MSA *msa)
+{
+ ESL_KEYHASH *kh = NULL;
+ int idx;
+ int status = TRUE;
+
+ if ((kh = esl_keyhash_Create()) == NULL) { status = eslEMEM; goto ERROR; }
+ for (idx = 0; idx < msa->nseq; idx++)
+ {
+ status = esl_keyhash_Store(kh, msa->sqname[idx], -1, NULL);
+ if (status == eslEDUP) { status = eslFAIL; break; }
+ else if (status != eslOK) goto ERROR;
+ }
+ esl_keyhash_Destroy(kh);
+ return status;
+
+ ERROR:
+ if (kh) esl_keyhash_Destroy(kh);
+ return status;
+
+}
+
+/* msa_set_seq_ss()
+ *
+ * Set the secondary structure annotation for sequence number
+ * <seqidx> in an alignment <msa> by copying the string <ss>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+static int
+msa_set_seq_ss(ESL_MSA *msa, int seqidx, const char *ss)
+{
+ int status;
+ int i;
+
+ if (msa->ss == NULL)
+ {
+ ESL_ALLOC(msa->ss, sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++) msa->ss[i] = NULL;
+ }
+ if (msa->ss[seqidx] != NULL) free(msa->ss[seqidx]);
+ return (esl_strdup(ss, -1, &(msa->ss[seqidx])));
+
+ ERROR:
+ return status;
+}
+
+/* msa_set_seq_sa()
+ *
+ * Set the surface accessibility annotation for sequence number
+ * <seqidx> in an alignment <msa> by copying the string <sa>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+static int
+msa_set_seq_sa(ESL_MSA *msa, int seqidx, const char *sa)
+{
+ int status;
+ int i;
+
+ if (msa->sa == NULL)
+ {
+ ESL_ALLOC(msa->sa, sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++) msa->sa[i] = NULL;
+ }
+ if (msa->sa[seqidx] != NULL) free(msa->sa[seqidx]);
+ return (esl_strdup(sa, -1, &(msa->sa[seqidx])));
+
+ ERROR:
+ return status;
+}
+
+/* msa_set_seq_pp()
+ *
+ * Set the posterior probability annotation for sequence number
+ * <seqidx> in an alignment <msa> by copying the string <pp>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+static int
+msa_set_seq_pp(ESL_MSA *msa, int seqidx, const char *pp)
+{
+ int status;
+ int i;
+
+ if (msa->pp == NULL)
+ {
+ ESL_ALLOC(msa->pp, sizeof(char *) * msa->sqalloc);
+ for (i = 0; i < msa->sqalloc; i++) msa->pp[i] = NULL;
+ }
+ if (msa->pp[seqidx] != NULL) free(msa->pp[seqidx]);
+ return (esl_strdup(pp, -1, &(msa->pp[seqidx])));
+
+ ERROR:
+ return status;
+}
+/*---------- end of ESL_MSA field setting/checking --------------*/
+
+
+
+/*****************************************************************
+ *# 4. Miscellaneous functions for manipulating MSAs
+ *****************************************************************/
+
+static int64_t msa_get_rlen(const ESL_MSA *msa, int seqidx);
+
+
+/* Function: esl_msa_ReasonableRF()
+ * Synopsis: Determine a reasonable #=RF line marking "consensus" columns.
+ *
+ * Purpose: Define an <rfline> for the multiple alignment <msa> that
+ * marks consensus columns with an 'x' (or the consensus
+ * letter if useconsseq is TRUE), and non-consensus columns
+ * with a '.'.
+ *
+ * Consensus columns are defined as columns with fractional
+ * occupancy of $\geq$ <symfrac> in residues. For example,
+ * if <symfrac> is 0.7, columns containing $\geq$ 70\%
+ * residues are assigned as 'x' (or consensus letter) in the
+ * <rfline>, roughly speaking. "Roughly speaking", because the
+ * fractional occupancy is in fact calculated as a weighted
+ * frequency using sequence weights in <msa->wgt>, and because
+ * missing data symbols are ignored in order to be able to
+ * deal with sequence fragments.
+ *
+ * The greater <symfrac> is, the more stringent the
+ * definition, and the fewer columns will be defined as
+ * consensus. <symfrac=0> will define all columns as
+ * consensus. <symfrac=1> will only define a column as
+ * consensus if it contains no gap characters at all.
+ *
+ * If the caller wants to designate any sequences as
+ * fragments, it must convert all leading and trailing gaps
+ * to the missing data symbol '~'.
+ *
+ * For text mode alignments, any alphanumeric character is
+ * considered to be a residue, and any non-alphanumeric
+ * character is considered to be a gap.
+ *
+ * The <rfline> is a NUL-terminated string, indexed
+ * <0..alen-1>.
+ *
+ * The <rfline> result can be <msa->rf>, if the caller
+ * wants to set the <msa's> own RF line; or it can be any
+ * alternative storage provided by the caller. In either
+ * case, the caller must provide allocated space for at
+ * least <msa->alen+1> chars.
+ *
+ * Args: msa - MSA to define a consensus RF line for
+ * symfrac - threshold for defining consensus columns
+ * useconsseq - if FALSE, use x for a consensus position; else use the consensus letter
+ * rfline - RESULT: string containing a letter for consensus position, . for not
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Xref: HMMER p7_Fastmodelmaker() uses an essentially identical
+ * calculation to define model architecture, and could be
+ * rewritten now to use this function.
+ *
+ * A2M format alignment output uses this to define
+ * consensus columns when #=RF annotation isn't available.
+ */
+int
+esl_msa_ReasonableRF(ESL_MSA *msa, double symfrac, int useconsseq, char *rfline)
+{
+ int apos;
+ int idx;
+ double r;
+ double totwgt;
+ float *counts = NULL;
+ int status;
+
+ if (useconsseq)
+ ESL_ALLOC(counts, msa->abc->K * sizeof(float));
+
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->flags & eslMSA_DIGITAL)
+ {
+
+ for (apos = 1; apos <= msa->alen; apos++)
+ {
+ r = totwgt = 0.;
+ esl_vec_FSet(counts, msa->abc->K, 0.0);
+ for (idx = 0; idx < msa->nseq; idx++)
+ {
+ if (esl_abc_XIsResidue(msa->abc, msa->ax[idx][apos]))
+ {
+ r += msa->wgt[idx]; totwgt += msa->wgt[idx];
+ if (useconsseq) esl_abc_FCount(msa->abc, counts, msa->ax[idx][apos], msa->wgt[idx]);
+ }
+ else if (esl_abc_XIsGap(msa->abc, msa->ax[idx][apos])) totwgt += msa->wgt[idx];
+ else if (esl_abc_XIsMissing(msa->abc, msa->ax[idx][apos])) continue;
+ }
+ if (r > 0. && r / totwgt >= symfrac) {
+ if (useconsseq) rfline[apos-1] = msa->abc->sym[esl_vec_FArgMax(counts, msa->abc->K)];
+ else rfline[apos-1] = 'x';
+ }
+ else rfline[apos-1] = '.';
+
+ }
+ }
+#endif
+ if (! (msa->flags & eslMSA_DIGITAL))
+ {
+ for (apos = 0; apos < msa->alen; apos++)
+ {
+ r = totwgt = 0.;
+ for (idx = 0; idx < msa->nseq; idx++)
+ {
+ if (isalpha(msa->aseq[idx][apos]))
+ {
+ r += msa->wgt[idx]; totwgt += msa->wgt[idx];
+ if (useconsseq) esl_abc_FCount(msa->abc, counts, msa->abc->inmap[ (int) msa->aseq[idx][apos] ], msa->wgt[idx]);
+ }
+ else totwgt += msa->wgt[idx];
+ }
+ if (r > 0. && r / totwgt >= symfrac) {
+ if (useconsseq) rfline[apos-1] = msa->abc->sym[esl_vec_FArgMax(counts, msa->abc->K)];
+ else rfline[apos] = 'x';
+ }
+ else rfline[apos] = '.';
+ }
+ }
+
+ rfline[msa->alen] = '\0';
+ if (counts) free(counts);
+ return eslOK;
+
+ERROR:
+ if (counts) free(counts);
+ return status;
+}
+
+
+/* Function: esl_msa_MarkFragments()
+ * Synopsis: Heuristically define seq fragments in an alignment.
+ *
+ * Purpose: Use a heuristic to define sequence fragments (as opposed
+ * to "full length" sequences) in alignment <msa>.
+ *
+ * The rule is that if the sequence has a raw (unaligned)
+ * length not greater than <fragthresh> times the alignment
+ * length in columns, the sequence is defined as a fragment.
+ *
+ * For each fragment, all leading and trailing gap symbols
+ * (all gaps before the first residue and after the last
+ * residue) are converted to missing data symbols
+ * (typically '~', but nonstandard digital alphabets may
+ * have defined another character).
+ *
+ * If <fragthresh> is 0.0, no nonempty sequence is defined
+ * as a fragment.
+ *
+ * If <fragthresh> is 1.0, all sequences are defined as
+ * fragments.
+ *
+ * Args: msa - alignment in which to define and mark seq fragments
+ * fragthresh - define frags if rlen <= fragthresh * alen.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_msa_MarkFragments(ESL_MSA *msa, double fragthresh)
+{
+ int i;
+ int pos;
+
+ for (i = 0; i < msa->nseq; i++)
+ if (msa_get_rlen(msa, i) <= fragthresh * msa->alen)
+ {
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->flags & eslMSA_DIGITAL) {
+ for (pos = 1; pos <= msa->alen; pos++) {
+ if (esl_abc_XIsResidue(msa->abc, msa->ax[i][pos])) break;
+ msa->ax[i][pos] = esl_abc_XGetMissing(msa->abc);
+ }
+ for (pos = msa->alen; pos >= 1; pos--) {
+ if (esl_abc_XIsResidue(msa->abc, msa->ax[i][pos])) break;
+ msa->ax[i][pos] = esl_abc_XGetMissing(msa->abc);
+ }
+ }
+#endif
+ if (! (msa->flags & eslMSA_DIGITAL))
+ {
+ for (pos = 0; pos < msa->alen; pos++) {
+ if (isalnum(msa->aseq[i][pos])) break;
+ msa->aseq[i][pos] = '~';
+ }
+ for (pos = msa->alen-1; pos >= 0; pos--) {
+ if (isalnum(msa->aseq[i][pos])) break;
+ msa->aseq[i][pos] = '~';
+ }
+ }
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_msa_SequenceSubset()
+ * Synopsis: Select subset of sequences into a smaller MSA.
+ *
+ * Purpose: Given an array <useme> (0..nseq-1) of TRUE/FALSE flags for each
+ * sequence in an alignment <msa>; create a new alignment containing
+ * only those seqs which are flagged <useme=TRUE>. Return a pointer
+ * to this newly allocated alignment through <ret_new>. Caller is
+ * responsible for freeing it.
+ *
+ * The smaller alignment might now contain columns
+ * consisting entirely of gaps or missing data, depending
+ * on what sequence subset was extracted. The caller may
+ * want to immediately call <esl_msa_MinimGaps()> on the
+ * new alignment to clean this up.
+ *
+ * Unparsed GS and GR Stockholm annotation that is presumably still
+ * valid is transferred to the new alignment. Unparsed GC, GF, and
+ * comments that are potentially invalidated by taking the subset
+ * of sequences are not transferred to the new MSA.
+ *
+ * Weights are transferred exactly. If they need to be
+ * renormalized to some new total weight (such as the new,
+ * smaller total sequence number), the caller must do that.
+ *
+ * <msa> may be in text mode or digital mode. The new MSA
+ * in <ret_new> will have the same mode.
+ *
+ * Returns: <eslOK> on success, and <ret_new> is set to point at a new
+ * (smaller) alignment.
+ *
+ * Throws: <eslEINVAL> if the subset has no sequences in it;
+ * <eslEMEM> on allocation error.
+ *
+ * Xref: squid's MSASmallerAlignment(), 1999.
+ */
+int
+esl_msa_SequenceSubset(const ESL_MSA *msa, const int *useme, ESL_MSA **ret_new)
+{
+ ESL_MSA *new = NULL;
+ int nnew; /* number of seqs in the new MSA */
+ int oidx, nidx; /* old, new indices */
+ int i;
+ int status;
+
+ ESL_DASSERT1(( msa->nseq > 0 ));
+ ESL_DASSERT1(( msa->alen >= 0 )); // This silences static checkers that think msa->alen might be -1.
+ *ret_new = NULL;
+
+ nnew = 0;
+ for (oidx = 0; oidx < msa->nseq; oidx++)
+ if (useme[oidx]) nnew++;
+ if (nnew == 0) ESL_EXCEPTION(eslEINVAL, "No sequences selected");
+
+ /* Note that the Create() calls allocate exact space for the sequences,
+ * so we will strcpy()/memcpy() into them below.
+ */
+#ifdef eslAUGMENT_ALPHABET
+ if ((msa->flags & eslMSA_DIGITAL) &&
+ (new = esl_msa_CreateDigital(msa->abc, nnew, msa->alen)) == NULL)
+ {status = eslEMEM; goto ERROR; }
+#endif
+ if (! (msa->flags & eslMSA_DIGITAL) &&
+ (new = esl_msa_Create(nnew, msa->alen)) == NULL)
+ {status = eslEMEM; goto ERROR; }
+ if (new == NULL)
+ {status = eslEMEM; goto ERROR; }
+
+
+ /* Copy the old to the new */
+ for (nidx = 0, oidx = 0; oidx < msa->nseq; oidx++)
+ if (useme[oidx])
+ {
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->flags & eslMSA_DIGITAL)
+ memcpy(new->ax[nidx], msa->ax[oidx], sizeof(ESL_DSQ) * (msa->alen+2));
+#endif
+ if (! (msa->flags & eslMSA_DIGITAL))
+ strcpy(new->aseq[nidx], msa->aseq[oidx]);
+
+ if ((status = esl_strdup(msa->sqname[oidx], -1, &(new->sqname[nidx]))) != eslOK) goto ERROR;
+
+ new->wgt[nidx] = msa->wgt[oidx];
+
+ if (msa->sqacc && msa->sqacc[oidx] && (status = esl_msa_SetSeqAccession (new, nidx, msa->sqacc[oidx], -1)) != eslOK) goto ERROR;
+ if (msa->sqdesc && msa->sqdesc[oidx] && (status = esl_msa_SetSeqDescription(new, nidx, msa->sqdesc[oidx], -1)) != eslOK) goto ERROR;
+ if (msa->ss && msa->ss[oidx] && (status = msa_set_seq_ss (new, nidx, msa->ss[oidx])) != eslOK) goto ERROR;
+ if (msa->sa && msa->sa[oidx] && (status = msa_set_seq_sa (new, nidx, msa->sa[oidx])) != eslOK) goto ERROR;
+ if (msa->pp && msa->pp[oidx] && (status = msa_set_seq_pp (new, nidx, msa->pp[oidx])) != eslOK) goto ERROR;
+
+ /* unparsed annotation */
+ for(i = 0; i < msa->ngs; i++) { if (msa->gs[i] && msa->gs[i][oidx] && (status = esl_msa_AddGS (new, msa->gs_tag[i], -1, nidx, msa->gs[i][oidx], -1)) != eslOK) goto ERROR; }
+ for(i = 0; i < msa->ngr; i++) { if (msa->gr[i] && msa->gr[i][oidx] && (status = esl_msa_AppendGR(new, msa->gr_tag[i], nidx, msa->gr[i][oidx])) != eslOK) goto ERROR; }
+
+ nidx++;
+ }
+
+ new->flags = msa->flags;
+
+ if ((status = esl_strdup(msa->name, -1, &(new->name))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(msa->desc, -1, &(new->desc))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(msa->acc, -1, &(new->acc))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(msa->au, -1, &(new->au))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(msa->ss_cons, msa->alen, &(new->ss_cons))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(msa->sa_cons, msa->alen, &(new->sa_cons))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(msa->pp_cons, msa->alen, &(new->pp_cons))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(msa->rf, msa->alen, &(new->rf))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(msa->mm, msa->alen, &(new->mm))) != eslOK) goto ERROR;
+
+ for (i = 0; i < eslMSA_NCUTS; i++) {
+ new->cutoff[i] = msa->cutoff[i];
+ new->cutset[i] = msa->cutset[i];
+ }
+
+ new->nseq = nnew;
+ new->sqalloc = nnew;
+
+ /* Since we have a fully constructed MSA, we don't need the
+ * aux info used by parsers.
+ */
+ if (new->sqlen != NULL) { free(new->sqlen); new->sqlen = NULL; }
+ if (new->sslen != NULL) { free(new->sslen); new->sslen = NULL; }
+ if (new->salen != NULL) { free(new->salen); new->salen = NULL; }
+ if (new->pplen != NULL) { free(new->pplen); new->pplen = NULL; }
+ new->lastidx = -1;
+
+ *ret_new = new;
+ return eslOK;
+
+ ERROR:
+ if (new != NULL) esl_msa_Destroy(new);
+ *ret_new = NULL;
+ return status;
+}
+
+
+/* Function: esl_msa_ColumnSubset()
+ * Synopsis: Remove a selected subset of columns from the MSA
+ *
+ * Purpose: Given an array <useme> (0..alen-1) of TRUE/FALSE flags,
+ * where TRUE means "keep this column in the new alignment";
+ * remove all columns annotated as FALSE in the <useme>
+ * array. This is done in-place on the MSA, so the MSA is
+ * modified: <msa->alen> is reduced, <msa->aseq> is shrunk
+ * (or <msa->ax>, in the case of a digital mode alignment),
+ * and all associated per-residue or per-column annotation
+ * is shrunk.
+ *
+ * Returns: <eslOK> on success.
+ * Possibilities from <esl_msa_RemoveBrokenBasepairs()> call:
+ * <eslESYNTAX> if WUSS string for <SS_cons> or <msa->ss>
+ * following <esl_wuss_nopseudo()> is inconsistent.
+ * <eslEINVAL> if a derived ct array implies a pknotted SS.
+ */
+int
+esl_msa_ColumnSubset(ESL_MSA *msa, char *errbuf, const int *useme)
+{
+ int status;
+ int64_t opos; /* position in original alignment */
+ int64_t npos; /* position in new alignment */
+ int idx; /* sequence index */
+ int i; /* markup index */
+
+ /* For RNA/DNA digital alignments only:
+ * Remove any basepairs from SS_cons and individual sequence SS
+ * for aln columns i,j for which useme[i-1] or useme[j-1] are FALSE
+ */
+ if ( msa->abc && (msa->abc->type == eslRNA || msa->abc->type == eslDNA) &&
+ (status = esl_msa_RemoveBrokenBasepairs(msa, errbuf, useme)) != eslOK) return status;
+
+ /* Since we're minimizing, we can overwrite in place, within the msa
+ * we've already got.
+ * opos runs all the way to msa->alen to include (and move) the \0
+ * string terminators (or sentinel bytes, in the case of digital mode)
+ */
+ for (opos = 0, npos = 0; opos <= msa->alen; opos++)
+ {
+ if (opos < msa->alen && useme[opos] == FALSE) continue;
+
+ if (npos != opos) /* small optimization */
+ {
+ /* The alignment, and per-residue annotations */
+ for (idx = 0; idx < msa->nseq; idx++)
+ {
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->flags & eslMSA_DIGITAL) /* watch off-by-one in dsq indexing */
+ msa->ax[idx][npos+1] = msa->ax[idx][opos+1];
+ else
+ msa->aseq[idx][npos] = msa->aseq[idx][opos];
+#else
+ msa->aseq[idx][npos] = msa->aseq[idx][opos];
+#endif /*eslAUGMENT_ALPHABET*/
+ if (msa->ss != NULL && msa->ss[idx] != NULL) msa->ss[idx][npos] = msa->ss[idx][opos];
+ if (msa->sa != NULL && msa->sa[idx] != NULL) msa->sa[idx][npos] = msa->sa[idx][opos];
+ if (msa->pp != NULL && msa->pp[idx] != NULL) msa->pp[idx][npos] = msa->pp[idx][opos];
+ for (i = 0; i < msa->ngr; i++)
+ if (msa->gr[i][idx] != NULL)
+ msa->gr[i][idx][npos] = msa->gr[i][idx][opos];
+ }
+ /* The per-column annotations */
+ if (msa->ss_cons != NULL) msa->ss_cons[npos] = msa->ss_cons[opos];
+ if (msa->sa_cons != NULL) msa->sa_cons[npos] = msa->sa_cons[opos];
+ if (msa->pp_cons != NULL) msa->pp_cons[npos] = msa->pp_cons[opos];
+ if (msa->rf != NULL) msa->rf[npos] = msa->rf[opos];
+ if (msa->mm != NULL) msa->mm[npos] = msa->mm[opos];
+ for (i = 0; i < msa->ngc; i++)
+ msa->gc[i][npos] = msa->gc[i][opos];
+ }
+ npos++;
+ }
+ msa->alen = npos-1; /* -1 because npos includes NUL terminators */
+ return eslOK;
+}
+
+/* Function: esl_msa_MinimGaps()
+ * Synopsis: Remove columns containing all gap symbols.
+ *
+ * Purpose: Remove all columns in the multiple alignment <msa>
+ * that consist entirely of gaps or missing data.
+ *
+ * For a text mode alignment, <gaps> is a string defining
+ * the gap characters, such as <"-_.~">. For a digital mode
+ * alignment, <gaps> may be passed as <NULL>, because the
+ * internal alphabet already knows what the gap and missing
+ * data characters are.
+ *
+ * <msa> is changed in-place to a narrower alignment
+ * containing fewer columns. All per-residue and per-column
+ * annotation is altered appropriately for the columns that
+ * remain in the new alignment.
+ *
+ * If <consider_rf> is TRUE, only columns that are gaps
+ * in all sequences of <msa> and a gap in the RF annotation
+ * of the alignment (<msa->rf>) will be removed. It is
+ * okay if <consider_rf> is TRUE and <msa->rf> is NULL
+ * (no error is thrown), the function will behave as if
+ * <consider_rf> is FALSE.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * Possibilities from <esl_msa_ColumnSubset()> call:
+ * <eslESYNTAX> if WUSS string for <SS_cons> or <msa->ss>
+ * following <esl_wuss_nopseudo()> is inconsistent.
+ * <eslEINVAL> if a derived ct array implies a pknotted SS.
+ *
+ * Xref: squid's MSAMingap().
+ */
+int
+esl_msa_MinimGaps(ESL_MSA *msa, char *errbuf, const char *gaps, int consider_rf)
+{
+ int *useme = NULL; /* array of TRUE/FALSE flags for which cols to keep */
+ int64_t apos; /* column index */
+ int idx; /* sequence index */
+ int status;
+ int rf_is_nongap; /* TRUE if current position is not a gap in msa->rf OR msa->rf is NULL */
+
+#ifdef eslAUGMENT_ALPHABET /* digital mode case */
+ if (msa->flags & eslMSA_DIGITAL) /* be careful of off-by-one: useme is 0..L-1 indexed */
+ {
+ ESL_ALLOC(useme, sizeof(int) * (msa->alen+1)); /* +1 is just to deal w/ alen=0 special case */
+
+ for (apos = 1; apos <= msa->alen; apos++)
+ {
+ rf_is_nongap = ((msa->rf != NULL) &&
+ (! esl_abc_CIsGap (msa->abc, msa->rf[apos-1])) &&
+ (! esl_abc_CIsMissing(msa->abc, msa->rf[apos-1]))) ?
+ TRUE : FALSE;
+ if(rf_is_nongap && consider_rf) { /* RF is not a gap and consider_rf is TRUE, keep this column */
+ useme[apos-1] = TRUE;
+ }
+ else { /* check all seqs to see if this column is all gaps */
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (! esl_abc_XIsGap (msa->abc, msa->ax[idx][apos]) &&
+ ! esl_abc_XIsMissing(msa->abc, msa->ax[idx][apos]))
+ break;
+ if (idx == msa->nseq) useme[apos-1] = FALSE; else useme[apos-1] = TRUE;
+ }
+ }
+ if ((status = esl_msa_ColumnSubset(msa, errbuf, useme)) != eslOK) goto ERROR;
+ }
+#endif
+ if (! (msa->flags & eslMSA_DIGITAL)) /* text mode case */
+ {
+ if ( (status = esl_msa_MinimGapsText(msa, errbuf, gaps, consider_rf, FALSE)) != eslOK) goto ERROR;
+ }
+
+ if (useme) free(useme);
+ return eslOK;
+
+ ERROR:
+ if (useme) free(useme);
+ return status;
+}
+
+/* Function: esl_msa_MinimGapsText()
+ * Synopsis: Remove columns containing all gap symbols, from text mode msa
+ *
+ * Purpose: Same as esl\_msa\_MinimGaps(), but specialized for a text mode
+ * alignment where we don't know the alphabet. The issue is what
+ * to do about RNA secondary structure annotation (SS, SS\_cons)
+ * when we remove columns, which can remove one side of a bp and
+ * invalidate the annotation string. For digital alignments,
+ * <esl_msa_MinimGaps()> knows the alphabet and will fix base pairs
+ * for RNA/DNA alignments. For text mode, though, we have to
+ * get told to do it, because the default behavior for text mode
+ * alis is to assume that the alphabet is totally arbitrary, and we're
+ * not allowed to make assumptions about its symbols' meaning.
+ * Hence, the <fix_bps> flag here.
+ *
+ * Ditto for the <gaps> string: we don't know what symbols
+ * are supposed to be gaps unless we're told something like
+ * <"-_.~">.
+ *
+ * Args: msa - alignment to remove all-gap cols from
+ * errbuf - if non-<NULL>, space for an informative error message on failure
+ * gaps - string of gap characters
+ * consider_rf - if TRUE, also consider gap/nongap cols in RF annotation line
+ * fix_bps - if TRUE, fix any broken bps in SS/SS\_cons annotation lines.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * Possibilities from <esl_msa_ColumnSubset()> call:
+ * <eslESYNTAX> if WUSS string for <SS_cons> or <msa->ss>
+ * following <esl_wuss_nopseudo()> is inconsistent.
+ * <eslEINVAL> if a derived ct array implies a pknotted SS.
+ */
+int
+esl_msa_MinimGapsText(ESL_MSA *msa, char *errbuf, const char *gaps, int consider_rf, int fix_bps)
+{
+ int *useme = NULL; /* array of TRUE/FALSE flags for which cols to keep */
+ int64_t apos; /* column index */
+ int idx; /* sequence index */
+ int status;
+ int rf_is_nongap; /* TRUE if current position is not a gap in msa->rf OR msa->rf is NULL */
+
+ ESL_ALLOC(useme, sizeof(int) * (msa->alen+1)); /* +1 is just to deal w/ alen=0 special case */
+
+ for (apos = 0; apos < msa->alen; apos++)
+ {
+ rf_is_nongap = ((msa->rf != NULL) && (strchr(gaps, msa->rf[apos]) == NULL)) ? TRUE : FALSE;
+ if (rf_is_nongap && consider_rf) useme[apos] = TRUE; /* RF is not a gap and consider_rf is TRUE, keep this column */
+ else
+ { /* check all seqs to see if this column is all gaps */
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (strchr(gaps, msa->aseq[idx][apos]) == NULL) break;
+ useme[apos] = (idx == msa->nseq ? FALSE : TRUE);
+ }
+ }
+
+ if (fix_bps && (status = esl_msa_RemoveBrokenBasepairs(msa, errbuf, useme)) != eslOK) goto ERROR;
+ if ( (status = esl_msa_ColumnSubset (msa, errbuf, useme)) != eslOK) goto ERROR;
+
+ free(useme);
+ return eslOK;
+
+ ERROR:
+ if (useme) free(useme);
+ return status;
+}
+
+
+/* Function: esl_msa_NoGaps()
+ * Synopsis: Remove columns containing any gap symbol.
+ *
+ * Purpose: Remove all columns in the multiple alignment <msa> that
+ * contain any gaps or missing data, such that the modified
+ * MSA consists only of ungapped columns (a solid block of
+ * residues).
+ *
+ * This is useful for filtering alignments prior to
+ * phylogenetic analysis using programs that can't deal
+ * with gaps.
+ *
+ * For a text mode alignment, <gaps> is a string defining
+ * the gap characters, such as <"-_.~">. For a digital mode
+ * alignment, <gaps> may be passed as <NULL>, because the
+ * internal alphabet already knows what the gap and
+ * missing data characters are.
+ *
+ * <msa> is changed in-place to a narrower alignment
+ * containing fewer columns. All per-residue and per-column
+ * annotation is altered appropriately for the columns that
+ * remain in the new alignment.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * Possibilities from <esl_msa_ColumnSubset()> call:
+ * <eslESYNTAX> if WUSS string for <SS_cons> or <msa->ss>
+ * following <esl_wuss_nopseudo()> is inconsistent.
+ * <eslEINVAL> if a derived ct array implies a pknotted SS.
+ *
+ * Xref: squid's MSANogap().
+ */
+int
+esl_msa_NoGaps(ESL_MSA *msa, char *errbuf, const char *gaps)
+{
+ int *useme = NULL; /* array of TRUE/FALSE flags for which cols to keep */
+ int64_t apos; /* column index */
+ int idx; /* sequence index */
+ int status;
+
+#ifdef eslAUGMENT_ALPHABET /* digital mode case */
+ if (msa->flags & eslMSA_DIGITAL) /* be careful of off-by-one: useme is 0..L-1 indexed */
+ {
+ ESL_ALLOC(useme, sizeof(int) * (msa->alen+1)); /* +1 is only to deal with alen=0 special case */
+
+ for (apos = 1; apos <= msa->alen; apos++)
+ {
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (esl_abc_XIsGap (msa->abc, msa->ax[idx][apos]) ||
+ esl_abc_XIsMissing(msa->abc, msa->ax[idx][apos]))
+ break;
+ if (idx == msa->nseq) useme[apos-1] = TRUE; else useme[apos-1] = FALSE;
+ }
+
+ if ((status = esl_msa_ColumnSubset(msa, errbuf, useme)) != eslOK) goto ERROR;
+ }
+#endif
+ if (! (msa->flags & eslMSA_DIGITAL)) /* text mode case */
+ {
+ if ((status = esl_msa_NoGapsText(msa, errbuf, gaps, FALSE)) != eslOK) goto ERROR;
+ }
+ if (useme) free(useme);
+ return eslOK;
+
+ ERROR:
+ if (useme) free(useme);
+ return status;
+}
+
+
+/* Function: esl_msa_NoGapsText()
+ * Synopsis: Remove columns containing any gap symbol at all, for text mode msa.
+ *
+ * Purpose: Like <esl_msa_NoGaps()> but specialized for textmode <msa> where
+ * we don't know the alphabet, yet might need to fix alphabet-dependent
+ * problems.
+ *
+ * Like <esl_msa_MinimGapsText()>, the alphabet-dependent issue we might
+ * want to fix is RNA secondary structure annotation (SS, SS\_cons);
+ * removing a column might remove one side of a base pair annotation, and
+ * invalidate a secondary structure string. <fix_bps> tells the function
+ * that SS and SS\_cons are RNA WUSS format strings, and the function is
+ * allowed to edit (and fix) them. Normally, in text mode msa's, we
+ * are not allowed to interpret any meaning of symbols.
+ *
+ * Args: msa - alignment to remove any-gap cols from
+ * errbuf - if non-<NULL>, space for an informative error message on failure
+ * gaps - string of gap characters
+ * fix_bps - if TRUE, fix any broken bps in SS/SS\_cons annotation lines
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * Possibilities from <esl_msa_ColumnSubset()> call:
+ * <eslESYNTAX> if WUSS string for <SS_cons> or <msa->ss>
+ * following <esl_wuss_nopseudo()> is inconsistent.
+ * <eslEINVAL> if a derived ct array implies a pknotted SS.
+ */
+int
+esl_msa_NoGapsText(ESL_MSA *msa, char *errbuf, const char *gaps, int fix_bps)
+{
+ int *useme = NULL; /* array of TRUE/FALSE flags for which cols to keep */
+ int64_t apos; /* column index */
+ int idx; /* sequence index */
+ int status;
+
+ ESL_ALLOC(useme, sizeof(int) * (msa->alen+1)); /* +1 is only to deal with alen=0 special case */
+
+ for (apos = 0; apos < msa->alen; apos++)
+ {
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (strchr(gaps, msa->aseq[idx][apos]) != NULL) break;
+ useme[apos] = (idx == msa->nseq ? TRUE : FALSE);
+ }
+
+ if (fix_bps && (status = esl_msa_RemoveBrokenBasepairs(msa, errbuf, useme)) != eslOK) goto ERROR;
+ if ( (status = esl_msa_ColumnSubset (msa, errbuf, useme)) != eslOK) goto ERROR;
+
+ free(useme);
+ return eslOK;
+
+ ERROR:
+ if (useme) free(useme);
+ return status;
+}
+
+
+/* Function: esl_msa_SymConvert()
+ * Synopsis: Global search/replace of symbols in an MSA.
+ *
+ * Purpose: In the aligned sequences in a text-mode <msa>, convert any
+ * residue in the string <oldsyms> to its counterpart (at the same
+ * position) in string <newsyms>.
+ *
+ * To convert DNA to RNA, <oldsyms> could be "Tt" and
+ * <newsyms> could be "Uu". To convert IUPAC symbols to
+ * N's, <oldsyms> could be "RYMKSWHBVDrymkswhbvd" and
+ * <newsyms> could be "NNNNNNNNNNnnnnnnnnnn".
+ *
+ * As a special case, if <newsyms> consists of a single
+ * character, then any character in the <oldsyms> is
+ * converted to this character.
+ *
+ * Thus, <newsyms> must either be of the same length as
+ * <oldsyms>, or of length 1. Anything else will cause
+ * undefined behavior (and probably segfault).
+ *
+ * The conversion is done in-place, so the <msa> is
+ * modified.
+ *
+ * This is a poor man's hack for processing text mode MSAs
+ * into a more consistent text alphabet. It is unnecessary
+ * for digital mode MSAs, which are already in a standard
+ * internal alphabet. Calling <esl_msa_SymConvert()> on a
+ * digital mode alignment throws an <eslEINVAL> error.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <msa> is in digital mode, or if the <oldsyms>
+ * and <newsyms> strings aren't valid together.
+ */
+int
+esl_msa_SymConvert(ESL_MSA *msa, const char *oldsyms, const char *newsyms)
+{
+ int64_t apos; /* column index */
+ int idx; /* sequence index */
+ char *sptr;
+ int special;
+
+ if (msa->flags & eslMSA_DIGITAL)
+ ESL_EXCEPTION(eslEINVAL, "can't SymConvert on digital mode alignment");
+ if ((strlen(oldsyms) != strlen(newsyms)) && strlen(newsyms) != 1)
+ ESL_EXCEPTION(eslEINVAL, "invalid newsyms/oldsyms pair");
+
+ special = (strlen(newsyms) == 1 ? TRUE : FALSE);
+
+ for (apos = 0; apos < msa->alen; apos++)
+ for (idx = 0; idx < msa->nseq; idx++)
+ if ((sptr = strchr(oldsyms, msa->aseq[idx][apos])) != NULL)
+ msa->aseq[idx][apos] = (special ? *newsyms : newsyms[sptr-oldsyms]);
+ return eslOK;
+}
+
+
+/* Function: esl_msa_Checksum()
+ * Synopsis: Calculate a checksum for an MSA.
+ * Incept: SRE, Tue Sep 16 13:23:34 2008 [Janelia]
+ *
+ * Purpose: Calculates a 32-bit checksum for <msa>.
+ *
+ * Only the alignment data are considered, not the sequence
+ * names or other annotation. For text mode alignments, the
+ * checksum is case sensitive.
+ *
+ * This is used as a quick way to try to verify that a
+ * given alignment is identical to an expected one; for
+ * example, when HMMER is mapping new sequence alignments
+ * onto exactly the same seed alignment an HMM was built
+ * from.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Xref: The checksum is a modified version of Jenkin's hash;
+ * see <esl_keyhash> for the original and citations.
+ */
+int
+esl_msa_Checksum(const ESL_MSA *msa, uint32_t *ret_checksum)
+{
+ uint32_t val = 0;
+ int i,pos;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->flags & eslMSA_DIGITAL)
+ {
+ for (i = 0; i < msa->nseq; i++)
+ for (pos = 1; pos <= msa->alen; pos++)
+ {
+ val += msa->ax[i][pos];
+ val += (val << 10);
+ val ^= (val >> 6);
+ }
+ }
+#endif
+ if (! (msa->flags & eslMSA_DIGITAL))
+ {
+ for (i = 0; i < msa->nseq; i++)
+ for (pos = 0; pos < msa->alen; pos++)
+ {
+ val += msa->aseq[i][pos];
+ val += (val << 10);
+ val ^= (val >> 6);
+ }
+ }
+ val += (val << 3);
+ val ^= (val >> 11);
+ val += (val << 15);
+
+ *ret_checksum = val;
+ return eslOK;
+}
+
+
+/* Function: esl_msa_RemoveBrokenBasepairsFromSS()
+ * Synopsis: Remove basepairs about to be broken by a column downselect.
+ *
+ * Purpose: Given an array <useme> (0..alen-1) of TRUE/FALSE flags,
+ * remove any basepair from an SS string that is between
+ * alignment columns (i,j) for which either <useme[i-1]> or
+ * <useme[j-1]> is FALSE. Called by
+ * <esl_msa_RemoveBrokenBasepairs()>.
+ *
+ * The input SS string will be overwritten. If it was not
+ * in full WUSS format when passed in, it will be upon
+ * exit. Note that that means if there's residues in the
+ * input ss that correspond to gaps in an aligned sequence
+ * or RF annotation, they will not be treated as gaps in
+ * the returned SS. For example, a gap may become a '-'
+ * character, a '<_>' character, or a ':' character. I'm not
+ * sure how to deal with this in a better way. We could
+ * demand an aligned sequence to use to de-gap the SS
+ * string, but that would require disallowing any gap to be
+ * involved in a basepair, which I'm not sure is something
+ * we want to forbid.
+ *
+ * If the original SS is inconsistent it's left untouched
+ * and non-<eslOK> is returned as listed below.
+ *
+ * Returns: <eslOK> on success.
+ * <eslESYNTAX> if SS string
+ * <eslEINVAL> if a derived ct array implies a pknotted
+ * SS, this should be impossible.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_msa_RemoveBrokenBasepairsFromSS(char *ss, char *errbuf, int len, const int *useme)
+{
+ int64_t apos; /* alignment position */
+ int *ct = NULL; /* 0..alen-1 base pair partners array for current sequence */
+ int status;
+
+ ESL_ALLOC(ct, sizeof(int) * (len+1));
+
+ if ((status = esl_wuss2ct(ss, len, ct)) != eslOK)
+ ESL_FAIL(status, errbuf, "Consensus structure string is inconsistent.");
+ for (apos = 1; apos <= len; apos++) {
+ if (!(useme[apos-1])) {
+ if (ct[apos] != 0) ct[ct[apos]] = 0;
+ ct[apos] = 0;
+ }
+ }
+ /* All broken bps removed from ct, convert to WUSS SS string and overwrite SS */
+ if ((status = esl_ct2wuss(ct, len, ss)) != eslOK)
+ ESL_FAIL(status, errbuf, "Error converting de-knotted bp ct array to WUSS notation.");
+
+ free(ct);
+ return eslOK;
+
+ ERROR:
+ if (ct != NULL) free(ct);
+ return status;
+}
+
+/* Function: esl_msa_RemoveBrokenBasepairs()
+ * Synopsis: Remove all annotated bps about to be broken by column downselect.
+ *
+ * Purpose: Given an array <useme> (0..alen-1) of TRUE/FALSE flags,
+ * remove any basepair from <SS_cons> and individual SS
+ * annotation in alignment columns (i,j) for which either
+ * <useme[i-1]> or <useme[j-1]> is FALSE. Called
+ * automatically from <esl_msa_ColumnSubset()> with same
+ * <useme>.
+ *
+ * If the original structure data is inconsistent it's left
+ * untouched.
+ *
+ * Returns: <eslOK> on success.
+ * <eslESYNTAX> if WUSS string for <SS_cons> or <msa->ss>
+ * following <esl_wuss_nopseudo()> is inconsistent.
+ * <eslEINVAL> if a derived ct array implies a pknotted
+ * SS, this should be impossible
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_msa_RemoveBrokenBasepairs(ESL_MSA *msa, char *errbuf, const int *useme)
+{
+ int status;
+ int i;
+
+ if (msa->ss_cons) {
+ if((status = esl_msa_RemoveBrokenBasepairsFromSS(msa->ss_cons, errbuf, msa->alen, useme)) != eslOK) return status;
+ }
+ /* per-seq SS annotation */
+ if (msa->ss) {
+ for(i = 0; i < msa->nseq; i++) {
+ if (msa->ss[i]) {
+ if ((status = esl_msa_RemoveBrokenBasepairsFromSS(msa->ss[i], errbuf, msa->alen, useme)) != eslOK) return status;
+ }
+ }
+ }
+ return eslOK;
+}
+
+/* msa_get_rlen()
+ *
+ * Returns the raw (unaligned) length of sequence number <seqidx>
+ * in <msa>.
+ */
+static int64_t
+msa_get_rlen(const ESL_MSA *msa, int seqidx)
+{
+ int64_t rlen = 0;
+ int pos;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->flags & eslMSA_DIGITAL) rlen = esl_abc_dsqrlen(msa->abc, msa->ax[seqidx]);
+#endif
+ if (! (msa->flags & eslMSA_DIGITAL))
+ {
+ for (pos = 0; pos < msa->alen; pos++)
+ if (isalnum(msa->aseq[seqidx][pos])) rlen++;
+ }
+ return rlen;
+}
+
+
+
+/* Function: esl_msa_ReverseComplement()
+ * Synopsis: Reverse complement a multiple alignment
+ * Incept: SRE, Wed Feb 10 12:52:13 2016 [JB251 BOS-MCO]
+ *
+ * Purpose: Reverse complement the multiple alignment <msa>, in place.
+ *
+ * <msa> must be in digital mode, and it must be in an alphabet
+ * that permits reverse complementation (<eslDNA>, <eslRNA>).
+ *
+ * In addition to reverse complementing the sequence data,
+ * per-column and per-residue annotation also gets reversed
+ * or reverse complemented. Secondary structure annotations
+ * (the consensus structure <ss_cons>, and any individual
+ * structures <ss[i]>) are assumed to be in WUSS format,
+ * and are "reverse complemented" using
+ * <esl_wuss_reverse()>. Other annotations are assumed to
+ * be textual, and are simply reversed. Beware, because
+ * this can go awry if an optional <gc> or <gr> annotation
+ * has semantics that would require complementation (an RNA
+ * structure annotation, for example).
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINCOMPAT> if <msa> isn't digital, or isn't in an alphabet
+ * that allows reverse complementation.
+ */
+int
+esl_msa_ReverseComplement(ESL_MSA *msa)
+{
+ int i;
+ int m;
+ int status;
+
+ if (! (msa->flags & eslMSA_DIGITAL)) ESL_EXCEPTION(eslEINCOMPAT, "msa isn't digital");
+ if ( msa->abc->complement == NULL) ESL_EXCEPTION(eslEINCOMPAT, "msa alphabet can't be reverse complemented");
+
+ if (msa->ss_cons) esl_wuss_reverse(msa->ss_cons, msa->ss_cons);
+ if (msa->sa_cons) esl_vec_CReverse(msa->sa_cons, msa->sa_cons, msa->alen);
+ if (msa->pp_cons) esl_vec_CReverse(msa->pp_cons, msa->pp_cons, msa->alen);
+ if (msa->rf) esl_vec_CReverse(msa->rf, msa->rf, msa->alen);
+ if (msa->mm) esl_vec_CReverse(msa->mm, msa->mm, msa->alen);
+
+ for (m = 0; m < msa->ngc; m++)
+ if (msa->gc && msa->gc[m]) esl_vec_CReverse(msa->gc[m], msa->gc[m], msa->alen);
+
+ for (i = 0; i < msa->nseq; i++)
+ {
+ if ((status = esl_abc_revcomp(msa->abc, msa->ax[i], msa->alen)) != eslOK) goto ERROR;
+ if (msa->ss && msa->ss[i]) esl_wuss_reverse(msa->ss[i], msa->ss[i]);
+ if (msa->sa && msa->sa[i]) esl_vec_CReverse(msa->sa[i], msa->sa[i], msa->alen);
+ if (msa->pp && msa->pp[i]) esl_vec_CReverse(msa->pp[i], msa->pp[i], msa->alen);
+ }
+
+ for (m = 0; m < msa->ngr; m++)
+ for (i = 0; i < msa->nseq; i++)
+ if (msa->gr && msa->gr[m] && msa->gr[m][i])
+ esl_vec_CReverse(msa->gr[m][i], msa->gr[m][i], msa->alen);
+
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+
+
+#ifdef eslAUGMENT_KEYHASH
+/* Function: esl_msa_Hash()
+ * Synopsis: Hash sequence names, internally, for faster access/lookup.
+ *
+ * Purpose: Caller wants to map sequence names to integer index in the
+ * <ESL_MSA> structure, using the internal <msa->index> keyhash.
+ * Create (or recreate) that index.
+ *
+ * Each sequence name must be unique. If not, returns
+ * <eslEDUP>, and <msa->index> is <NULL> (if it already
+ * existed, it is destroyed).
+ *
+ * Returns: <eslOK> on success, and <msa->index> is available for
+ * keyhash lookups.
+ *
+ * <eslEDUP> if any sequence names are duplicated, and
+ * <msa->index> is <NULL>.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_msa_Hash(ESL_MSA *msa)
+{
+ int idx;
+ int status;
+
+ if (msa->index) esl_keyhash_Reuse(msa->index);
+ else msa->index = esl_keyhash_Create();
+ if (! msa->index) { status = eslEMEM; goto ERROR; }
+
+ for (idx = 0; idx < msa->nseq; idx++)
+ if ((status = esl_keyhash_Store(msa->index, msa->sqname[idx], -1, NULL)) != eslOK) goto ERROR;
+
+ return eslOK;
+
+ ERROR:
+ if (msa->index) { esl_keyhash_Destroy(msa->index); msa->index = NULL; }
+ return status;
+}
+#endif /*eslAUGMENT_KEYHASH*/
+
+/*----------------- end of misc MSA functions -------------------*/
+
+
+/*****************************************************************
+ * 5. Debugging, testing, development
+ *****************************************************************/
+
+/* Function: esl_msa_Validate()
+ * Synopsis: Validate an ESL_MSA structure.
+ *
+ * Purpose: Validates the fields of the <ESL_MSA> structure
+ * <msa>. Makes sure required information is present,
+ * consistent. If so, return <eslOK>.
+ *
+ * If a problem is detected, return <eslFAIL>. Caller may
+ * also provide an optional <errmsg> pointer to a buffer of
+ * at least <eslERRBUFSIZE>; if this message buffer is
+ * provided, an informative error message is put there.
+ *
+ * Args: msa - MSA structure to validate
+ * errmsg - OPTIONAL: error message buffer, at least <eslERRBUFSIZE>; or <NULL>
+ *
+ * Returns: <eslOK> on success, and <errmsg> (if provided) is set
+ * to an empty string.
+ *
+ * <eslFAIL> on failure and <errmsg> (if provided) contains
+ * the reason for the failure.
+ */
+int
+esl_msa_Validate(const ESL_MSA *msa, char *errmsg)
+{
+ int idx;
+
+ if (msa->nseq == 0) ESL_FAIL(eslFAIL, errmsg, "no alignment data found");
+
+ for (idx = 0; idx < msa->nseq; idx++)
+ {
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->flags & eslMSA_DIGITAL)
+ {
+ if (! msa->ax || ! msa->ax[idx]) ESL_FAIL(eslFAIL, errmsg, "seq %d: no sequence", idx);
+ if (esl_abc_dsqlen(msa->ax[idx]) != msa->alen) ESL_FAIL(eslFAIL, errmsg, "seq %d: wrong length", idx);
+ }
+#endif
+ if (! (msa->flags & eslMSA_DIGITAL))
+ {
+ if (! msa->aseq || ! msa->aseq[idx]) ESL_FAIL(eslFAIL, errmsg, "seq %d: no sequence", idx);
+ if (strlen(msa->aseq[idx]) != msa->alen) ESL_FAIL(eslFAIL, errmsg, "seq %d: wrong length", idx);
+ }
+
+ /* either all weights must be set, or none of them */
+ if ( msa->flags & eslMSA_HASWGTS) { if (msa->wgt[idx] == -1.0) ESL_FAIL(eslFAIL, errmsg, "seq %d: no weight set", idx);}
+ else { if (msa->wgt[idx] != 1.0) ESL_FAIL(eslFAIL, errmsg, "seq %d: HASWGTS flag down, wgt must be default", idx); }
+
+ if (msa->ss && msa->ss[idx] && strlen(msa->ss[idx]) != msa->alen) ESL_FAIL(eslFAIL, errmsg, "seq %d: SS wrong length", idx);
+ if (msa->sa && msa->sa[idx] && strlen(msa->sa[idx]) != msa->alen) ESL_FAIL(eslFAIL, errmsg, "seq %d: SA wrong length", idx);
+ if (msa->pp && msa->pp[idx] && strlen(msa->pp[idx]) != msa->alen) ESL_FAIL(eslFAIL, errmsg, "seq %d: PP wrong length", idx);
+ }
+
+ /* if cons SS is present, must have length right */
+ if (msa->ss_cons && strlen(msa->ss_cons) != msa->alen) ESL_FAIL(eslFAIL, errmsg, "SS_cons wrong length");
+ if (msa->sa_cons && strlen(msa->sa_cons) != msa->alen) ESL_FAIL(eslFAIL, errmsg, "SA_cons wrong length");
+ if (msa->pp_cons && strlen(msa->pp_cons) != msa->alen) ESL_FAIL(eslFAIL, errmsg, "PP_cons wrong length");
+ if (msa->rf && strlen(msa->rf) != msa->alen) ESL_FAIL(eslFAIL, errmsg, "RF wrong length");
+ if (msa->mm && strlen(msa->mm ) != msa->alen) ESL_FAIL(eslFAIL, errmsg, "MM wrong length");
+
+ return eslOK;
+}
+
+
+/* Function: esl_msa_CreateFromString()
+ * Synopsis: Creates a small <ESL_MSA> from a test case string.
+ *
+ * Purpose: A convenience for making small test cases in the test
+ * suites: given the contents of a complete multiple
+ * sequence alignment file as a single string <s> in
+ * alignment format <fmt>, convert it to an <ESL_MSA>.
+ *
+ * For example,
+ * {\small\begin{verbatim}
+ * esl_msa_CreateFromString("# STOCKHOLM 1.0\n\nseq1 AAAAA\nseq2 AAAAA\n//\n",
+ * eslMSAFILE_STOCKHOLM)
+ * \end{verbatim}}
+ * creates an ungapped alignment of two AAAAA sequences.
+ *
+ * Returns: a pointer to the new <ESL_MSA> on success.
+ *
+ * Throws: <NULL> if it fails to obtain, open, or read the temporary file
+ * that it puts the string <s> in.
+ */
+ESL_MSA *
+esl_msa_CreateFromString(const char *s, int fmt)
+{
+ ESL_MSAFILE *mfp = NULL;
+ ESL_MSA *msa = NULL;
+
+ if (esl_msafile_OpenMem(NULL, s, -1, fmt, NULL, &mfp) != eslOK) goto ERROR;
+ if (esl_msafile_Read(mfp, &msa) != eslOK) goto ERROR;
+ esl_msafile_Close(mfp);
+ return msa;
+
+ ERROR:
+ if (mfp) esl_msafile_Close(mfp);
+ if (msa) esl_msa_Destroy(msa);
+ return NULL;
+}
+
+
+/* Function: esl_msa_Compare()
+ * Synopsis: Compare two MSAs for equality.
+ *
+ * Purpose: Returns <eslOK> if the mandatory and optional contents
+ * of MSAs <a1> and <a2> are identical; otherwise return
+ * <eslFAIL>.
+ *
+ * Only mandatory and parsed optional information is
+ * compared. Unparsed Stockholm markup is not compared.
+ */
+int
+esl_msa_Compare(ESL_MSA *a1, ESL_MSA *a2)
+{
+ if (esl_msa_CompareMandatory(a1, a2) != eslOK) return eslFAIL;
+ if (esl_msa_CompareOptional(a1, a2) != eslOK) return eslFAIL;
+ return eslOK;
+}
+
+/* Function: esl_msa_CompareMandatory()
+ * Synopsis: Compare mandatory subset of MSA contents.
+ * Incept: SRE, Wed Jun 13 09:42:56 2007 [Janelia]
+ *
+ * Purpose: Compare mandatory contents of two MSAs, <a1> and <a2>.
+ * This comprises <aseq> (or <ax>, for a digital alignment);
+ * <sqname>, <wgt>, <alen>, <nseq>, and <flags>.
+ *
+ * Returns: <eslOK> if the MSAs are identical;
+ * <eslFAIL> if they are not.
+ */
+int
+esl_msa_CompareMandatory(ESL_MSA *a1, ESL_MSA *a2)
+{
+ int i;
+
+ if (a1->nseq != a2->nseq) return eslFAIL;
+ if (a1->alen != a2->alen) return eslFAIL;
+ if (a1->flags != a2->flags) return eslFAIL;
+
+ for (i = 0; i < a1->nseq; i++)
+ {
+ if (strcmp(a1->sqname[i], a2->sqname[i]) != 0) return eslFAIL;
+ if (esl_DCompare(a1->wgt[i], a2->wgt[i], 0.001) != eslOK) return eslFAIL;
+#ifdef eslAUGMENT_ALPHABET
+ if ((a1->flags & eslMSA_DIGITAL) &&
+ memcmp(a1->ax[i], a2->ax[i], sizeof(ESL_DSQ) * (a1->alen+2)) != 0)
+ return eslFAIL;
+#endif
+ if (! (a1->flags & eslMSA_DIGITAL) && strcmp(a1->aseq[i], a2->aseq[i]) != 0) return eslFAIL;
+ }
+ return eslOK;
+}
+
+/* Function: esl_msa_CompareOptional()
+ * Synopsis: Compare optional subset of MSA contents.
+ * Incept: SRE, Wed Jun 13 09:52:48 2007 [Janelia]
+ *
+ * Purpose: Compare optional contents of two MSAs, <a1> and <a2>.
+ *
+ * Returns: <eslOK> if the MSAs are identical;
+ * <eslFAIL> if they are not.
+ */
+int
+esl_msa_CompareOptional(ESL_MSA *a1, ESL_MSA *a2)
+{
+ int i;
+
+ if (esl_CCompare(a1->name, a2->name) != eslOK) return eslFAIL;
+ if (esl_CCompare(a1->desc, a2->desc) != eslOK) return eslFAIL;
+ if (esl_CCompare(a1->acc, a2->acc) != eslOK) return eslFAIL;
+ if (esl_CCompare(a1->au, a2->au) != eslOK) return eslFAIL;
+ if (esl_CCompare(a1->ss_cons, a2->ss_cons) != eslOK) return eslFAIL;
+ if (esl_CCompare(a1->sa_cons, a2->sa_cons) != eslOK) return eslFAIL;
+ if (esl_CCompare(a1->pp_cons, a2->pp_cons) != eslOK) return eslFAIL;
+ if (esl_CCompare(a1->rf, a2->rf) != eslOK) return eslFAIL;
+ if (esl_CCompare(a1->mm, a2->mm) != eslOK) return eslFAIL;
+
+ if (a1->sqacc != NULL && a2->sqacc != NULL) {
+ for (i = 0; i < a1->nseq; i++) if (esl_CCompare(a1->sqacc[i], a2->sqacc[i]) != eslOK) return eslFAIL;
+ } else if (a1->sqacc != NULL || a2->sqacc != NULL) return eslFAIL;
+
+ if (a1->sqdesc != NULL && a2->sqdesc != NULL) {
+ for (i = 0; i < a1->nseq; i++) if (esl_CCompare(a1->sqdesc[i], a2->sqdesc[i]) != eslOK) return eslFAIL;
+ } else if (a1->sqdesc != NULL || a2->sqdesc != NULL) return eslFAIL;
+
+ if (a1->ss != NULL && a2->ss != NULL) {
+ for (i = 0; i < a1->nseq; i++) if (esl_CCompare(a1->ss[i], a2->ss[i]) != eslOK) return eslFAIL;
+ } else if (a1->ss != NULL || a2->ss != NULL) return eslFAIL;
+
+ if (a1->sa != NULL && a2->sa != NULL) {
+ for (i = 0; i < a1->nseq; i++) if (esl_CCompare(a1->sa[i], a2->sa[i]) != eslOK) return eslFAIL;
+ } else if (a1->sa != NULL || a2->sa != NULL) return eslFAIL;
+
+ if (a1->pp != NULL && a2->pp != NULL) {
+ for (i = 0; i < a1->nseq; i++) if (esl_CCompare(a1->pp[i], a2->pp[i]) != eslOK) return eslFAIL;
+ } else if (a1->pp != NULL || a2->pp != NULL) return eslFAIL;
+
+ for (i = 0; i < eslMSA_NCUTS; i++)
+ {
+ if (a1->cutset[i] && a2->cutset[i]) {
+ if (esl_FCompare(a1->cutoff[i], a2->cutoff[i], 0.01) != eslOK) return eslFAIL;
+ } else if (a1->cutset[i] || a2->cutset[i]) return eslFAIL;
+ }
+ return eslOK;
+}
+/*---------------- end of debugging/development routines -------------------*/
+
+
+/******************************************************************************
+ * 15. Unit tests
+ *****************************************************************************/
+#ifdef eslMSA_TESTDRIVE
+
+/* write_known_msa()
+ * Write a known MSA to a tmpfile in Stockholm format.
+ */
+static void
+write_known_msa(FILE *ofp)
+{
+ fprintf(ofp, "# STOCKHOLM 1.0\n");
+ fprintf(ofp, "seq1 --ACDEFGHIK~LMNPQRS-TVWY\n");
+ fprintf(ofp, "seq2 aaACDEFGHIK~LMNPQRS-TVWY\n");
+ fprintf(ofp, "seq3 aaACDEFGHIK~LMNPQRS-TVWY\n");
+ fprintf(ofp, "\n");
+ fprintf(ofp, "seq1 ACDEFGHIKLMNPQRSTVWY~~~\n");
+ fprintf(ofp, "seq2 ACDEFGHIKLMNPQRSTVWYyyy\n");
+ fprintf(ofp, "seq3 ACDEFGHIKLMNPQRSTVWYyyy\n");
+ fprintf(ofp, "//\n");
+ return;
+}
+
+
+/* compare_to_known()
+ * SRE, Thu Sep 7 09:52:07 2006 [Janelia]
+ * Spotcheck an ESL_MSA to make sure it matches the test known alignment.
+ */
+static void
+compare_to_known(ESL_MSA *msa)
+{
+ if (msa->alen != 47) esl_fatal("bad alen");
+ if (msa->nseq != 3) esl_fatal("bad nseq");
+ if (strcmp(msa->sqname[1], "seq2") != 0) esl_fatal("bad sqname");
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->flags & eslMSA_DIGITAL)
+ {
+ if (! esl_abc_XIsGap(msa->abc, msa->ax[0][2])) esl_fatal("no gap where expected");
+ if (! esl_abc_XIsMissing(msa->abc, msa->ax[0][47])) esl_fatal("no missing-data symbol where expected");
+ if (msa->ax[1][1] != 0) esl_fatal("spotcheck on ax failed"); /* 0=A */
+ if (msa->ax[1][47] != 19) esl_fatal("spotcheck on ax failed"); /*19=Y */
+ }
+#endif
+ if (! (msa->flags & eslMSA_DIGITAL))
+ {
+ if (strcasecmp(msa->aseq[0], "--ACDEFGHIK~LMNPQRS-TVWYACDEFGHIKLMNPQRSTVWY~~~") != 0) esl_fatal("aseq 0 is bad");
+ if (strcasecmp(msa->aseq[1], "aaACDEFGHIK~LMNPQRS-TVWYACDEFGHIKLMNPQRSTVWYyyy") != 0) esl_fatal("aseq 1 is bad");
+ if (strcasecmp(msa->aseq[2], "aaACDEFGHIK~LMNPQRS-TVWYACDEFGHIKLMNPQRSTVWYyyy") != 0) esl_fatal("aseq 2 is bad");
+ }
+ return;
+}
+
+/* Unit tests for every function in the exposed API
+ */
+static void
+utest_Create(void)
+{
+ ESL_MSA *msa = NULL;
+
+ msa = esl_msa_Create(16, -1); /* nseq blocksize 16, growable */
+ esl_msa_Destroy(msa);
+ msa = esl_msa_Create(16, 100); /* nseq=16, alen=100, not growable */
+ esl_msa_Destroy(msa);
+
+ return;
+}
+
+static void
+utest_Destroy(void)
+{
+ ESL_MSA *msa = NULL;
+#ifdef eslAUGMENT_ALPHABET
+ ESL_ALPHABET *abc;
+#endif
+
+ msa = esl_msa_Create(16, -1);
+ esl_msa_Destroy(msa); /* normal usage */
+
+#ifdef eslAUGMENT_ALPHABET
+ abc = esl_alphabet_Create(eslRNA);
+ msa = esl_msa_CreateDigital(abc, 16, 100);
+ esl_msa_Destroy(msa); /* normal usage, digital mode */
+ esl_alphabet_Destroy(abc);
+#endif
+
+ esl_msa_Destroy(NULL); /* should tolerate NULL argument */
+ return;
+}
+
+static void
+utest_Expand(void)
+{
+ ESL_MSA *msa = NULL;
+#ifdef eslAUGMENT_ALPHABET
+ ESL_ALPHABET *abc;
+#endif
+
+ msa = esl_msa_Create(16, -1); /* growable */
+ if (esl_msa_Expand(msa) != eslOK) esl_fatal("Expand failed"); /* expand by 2x in nseq */
+ esl_msa_Destroy(msa);
+
+ msa = esl_msa_Create(16, 100); /* not growable */
+#ifdef eslTEST_THROWING
+ if (esl_msa_Expand(msa) != eslEINVAL) esl_fatal("Expand should have failed but didn't"); /* should fail w/ EINVAL*/
+#endif
+ esl_msa_Destroy(msa);
+
+#ifdef eslAUGMENT_ALPHABET
+ abc = esl_alphabet_Create(eslDNA);
+ msa = esl_msa_CreateDigital(abc, 16, -1); /* growable */
+ if (esl_msa_Expand(msa) != eslOK) esl_fatal("Expand failed"); /* expand by 2x in nseq */
+ esl_msa_Destroy(msa);
+
+ msa = esl_msa_CreateDigital(abc, 16, 100); /* not growable */
+#ifdef eslTEST_THROWING
+ if (esl_msa_Expand(msa) != eslEINVAL) esl_fatal("Expand should have failed but didn't"); /* should fail w/ EINVAL*/
+#endif /* eslTEST_THROWING*/
+ esl_msa_Destroy(msa);
+ esl_alphabet_Destroy(abc);
+#endif
+ return;
+}
+
+
+#ifdef eslAUGMENT_ALPHABET
+static void
+utest_CreateDigital(ESL_ALPHABET *abc)
+{
+ char *msg = "CreateDigital() unit test failure";
+ ESL_MSA *msa = NULL;
+
+ msa = esl_msa_CreateDigital(abc, 16, -1); /* nseq blocksize 16, growable */
+ if (! (msa->flags & eslMSA_DIGITAL)) esl_fatal(msg);
+ if (msa->ax == NULL) esl_fatal(msg);
+ if (msa->aseq != NULL) esl_fatal(msg);
+ if (esl_msa_Expand(msa) != eslOK) esl_fatal(msg);
+ esl_msa_Destroy(msa);
+
+ msa = esl_msa_CreateDigital(abc, 16, 100); /* nseq=16, alen=100, not growable */
+#ifdef eslTEST_THROWING
+ if (esl_msa_Expand(msa) != eslEINVAL) esl_fatal(msg); /* shouldn't grow */
+#endif
+ esl_msa_Destroy(msa);
+
+ return;
+}
+#endif /*eslAUGMENT_ALPHABET*/
+
+#ifdef eslAUGMENT_ALPHABET
+static void
+utest_Digitize(ESL_ALPHABET *abc, char *filename)
+{
+ char *msg = "Digitize() unit test failure";
+ ESL_MSAFILE *mfp = NULL;
+ ESL_MSA *msa = NULL;
+ int c, i, pos;
+
+ /* Get ourselves a copy of the known alignment that we can muck with */
+ if (esl_msafile_Open(NULL, filename, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(mfp, &msa) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(mfp);
+
+ /* Deliberately corrupt it with inval character in the middle */
+ i = msa->nseq / 2;
+ pos = msa->alen / 2;
+ c = msa->aseq[i][pos];
+ msa->aseq[i][pos] = '%';
+ if (esl_msa_Digitize(abc, msa, NULL) != eslEINVAL) esl_fatal(msg); /* should detect corruption as normal error */
+ msa->aseq[i][pos] = c; /* restore original */
+ compare_to_known(msa);
+ if (esl_msa_Digitize(abc, msa, NULL) != eslOK) esl_fatal(msg); /* should be fine now */
+ compare_to_known(msa);
+
+ esl_msa_Destroy(msa);
+ return;
+}
+#endif /*eslAUGMENT_ALPHABET*/
+
+
+#ifdef eslAUGMENT_ALPHABET
+static void
+utest_Textize(ESL_ALPHABET *abc, char *filename)
+{
+ char *msg = "Textize() unit test failure";
+ ESL_MSAFILE *mfp = NULL;
+ ESL_MSA *msa = NULL;
+
+ if (esl_msafile_Open(&abc, filename, NULL, eslMSAFILE_UNKNOWN, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(mfp, &msa) != eslOK) esl_fatal(msg);
+ if (esl_msa_Textize(msa) != eslOK) esl_fatal(msg);
+ compare_to_known(msa);
+
+ esl_msafile_Close(mfp);
+ esl_msa_Destroy(msa);
+ return;
+}
+#endif /*eslAUGMENT_ALPHABET*/
+
+static void
+utest_SequenceSubset(ESL_MSA *m1)
+{
+ char *msg = "SequenceSubset() unit test failure";
+ ESL_MSA *m2 = NULL;
+ int *useme = NULL;
+ int i,j;
+ int n2;
+
+ /* Make every other sequence (1,3..) get excluded from the subset */
+ useme = malloc(m1->nseq * sizeof(int));
+ for (i = 0, n2 = 0; i < m1->nseq; i++)
+ if (i%2 == 0) { useme[i] = TRUE; n2++; }
+ else useme[i] = FALSE;
+
+ if (esl_msa_SequenceSubset(m1, useme, &m2) != eslOK) esl_fatal(msg);
+ if (m2->nseq != n2) esl_fatal(msg);
+
+ for (i = 0, j = 0; i < m1->nseq; i++)
+ {
+ if (useme[i])
+ {
+ if (strcmp(m1->sqname[i], m2->sqname[j]) != 0) esl_fatal(msg);
+ if (! (m1->flags & eslMSA_DIGITAL) && (strcmp(m1->aseq[i], m2->aseq[j]) != 0)) esl_fatal(msg);
+#ifdef eslAUGMENT_ALPHABET
+ if ( (m1->flags & eslMSA_DIGITAL) && memcmp(m1->ax[i], m2->ax[j], sizeof(ESL_DSQ) * (m1->alen+2)) != 0) esl_fatal(msg);
+#endif
+ j++;
+ }
+ }
+ esl_msa_Destroy(m2);
+ free(useme);
+ return;
+}
+
+static void
+utest_MinimGaps(char *tmpfile)
+{
+ char *msg = "MinimGaps() unit test failure";
+ ESL_MSAFILE *mfp = NULL;
+ ESL_MSA *msa = NULL;
+#ifdef eslAUGMENT_ALPHABET
+ ESL_ALPHABET *abc = NULL;
+#endif
+
+ if (esl_msafile_Open(NULL, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(mfp, &msa) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(mfp);
+ if (esl_msa_MinimGaps(msa, NULL, "-~", FALSE) != eslOK) esl_fatal(msg);
+ if (msa->alen != 45) esl_fatal(msg); /* orig =47, with one all - column and one all ~ column */
+ if (msa->aseq[0][11] != 'L') esl_fatal(msg); /* L shifted from column 13->12 */
+ if (msa->aseq[0][18] != 'T') esl_fatal(msg); /* T shifted from column 21->19 */
+ esl_msa_Destroy(msa);
+
+#ifdef eslAUGMENT_ALPHABET
+ if ((abc = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal(msg);
+ if (esl_msafile_Open(&abc, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(mfp, &msa) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(mfp);
+ if (esl_msa_MinimGaps(msa, NULL, NULL, FALSE) != eslOK) esl_fatal(msg);
+ if (msa->alen != 45) esl_fatal(msg); /* orig =47, with one all - column and one all ~ column */
+ if (esl_msa_Textize(msa) != eslOK) esl_fatal(msg);
+ if (msa->aseq[0][11] != 'L') esl_fatal(msg); /* L shifted from column 13->12 */
+ if (msa->aseq[0][18] != 'T') esl_fatal(msg); /* T shifted from column 21->19 */
+ esl_msa_Destroy(msa);
+ esl_alphabet_Destroy(abc);
+#endif
+ return;
+}
+
+static void
+utest_NoGaps(char *tmpfile)
+{
+ char *msg = "NoGaps() unit test failure";
+ ESL_MSAFILE *mfp = NULL;
+ ESL_MSA *msa = NULL;
+#ifdef eslAUGMENT_ALPHABET
+ ESL_ALPHABET *abc = NULL;
+#endif
+
+ if (esl_msafile_Open(NULL, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(mfp, &msa) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(mfp);
+ if (esl_msa_NoGaps(msa, NULL, "-~") != eslOK) esl_fatal(msg);
+ if (msa->alen != 40) esl_fatal(msg); /* orig =47, w/ 7 columns with gaps */
+ if (msa->aseq[0][9] != 'L') esl_fatal(msg); /* L shifted from column 13->10 */
+ if (msa->aseq[0][16] != 'T') esl_fatal(msg); /* T shifted from column 21->17 */
+ if (msa->aseq[0][39] != 'Y') esl_fatal(msg); /* Y shifted from column 47->40 */
+ esl_msa_Destroy(msa);
+
+#ifdef eslAUGMENT_ALPHABET
+ if ((abc = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal(msg);
+ if (esl_msafile_Open(&abc, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(mfp, &msa) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(mfp);
+ if (esl_msa_NoGaps(msa, NULL, NULL) != eslOK) esl_fatal(msg);
+ if (msa->alen != 40) esl_fatal(msg); /* orig =47, with one all - column and one all ~ column */
+ if (esl_msa_Textize(msa) != eslOK) esl_fatal(msg);
+ if (msa->aseq[0][9] != 'L') esl_fatal(msg); /* L shifted from column 13->10 */
+ if (msa->aseq[0][16] != 'T') esl_fatal(msg); /* T shifted from column 21->17 */
+ if (msa->aseq[0][39] != 'Y') esl_fatal(msg); /* Y shifted from column 47->40 */
+ esl_msa_Destroy(msa);
+ esl_alphabet_Destroy(abc);
+#endif
+ return;
+}
+
+static void
+utest_SymConvert(char *tmpfile)
+{
+ char *msg = "SymConvert() unit test failure";
+ ESL_MSAFILE *mfp = NULL;
+ ESL_MSA *msa = NULL;
+#ifdef eslAUGMENT_ALPHABET
+ ESL_ALPHABET *abc = NULL;
+#endif
+
+ if (esl_msafile_Open(NULL, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(mfp, &msa) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(mfp);
+
+ /* many->one version */
+ if (esl_msa_SymConvert(msa, "VWY", "-") != eslOK) esl_fatal(msg); /* 6 columns convert to all-gap: now 8/47 */
+ if (esl_msa_MinimGaps(msa, NULL, "-~", FALSE) != eslOK) esl_fatal(msg); /* now we're 39 columns long */
+ if (msa->alen != 39) esl_fatal(msg);
+
+ /* many->many version */
+ if (esl_msa_SymConvert(msa, "DEF", "VWY") != eslOK) esl_fatal(msg);
+ if (msa->aseq[0][4] != 'V') esl_fatal(msg);
+ if (msa->aseq[0][5] != 'W') esl_fatal(msg);
+ if (msa->aseq[0][23] != 'Y') esl_fatal(msg); /* F in orig col 29; -5; converted to Y */
+
+ /* bad calls */
+#ifdef eslTEST_THROWING
+ if (esl_msa_SymConvert(msa, "XXX", "XX") != eslEINVAL) esl_fatal(msg); /* check for clean fail on mismatched args */
+#endif
+ esl_msa_Destroy(msa);
+
+#ifdef eslAUGMENT_ALPHABET
+ if ((abc = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal(msg);
+ if (esl_msafile_Open(&abc, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(mfp, &msa) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(mfp);
+#ifdef eslTEST_THROWING
+ if (esl_msa_SymConvert(msa, "Tt", "Uu") != eslEINVAL) esl_fatal(msg); /* must cleanly fail on digital mode msa */
+#endif
+ esl_msa_Destroy(msa);
+ esl_alphabet_Destroy(abc);
+#endif
+ return;
+}
+
+/* Exercise a boundary case: zero length MSA (alen=0) */
+/* Given an input *digital* MSA as a starting point, we clone it,
+ * column subset it to zero length, then make sure that
+ * various MSA functions operate correctly on it;
+ * then we textize it and test it in text mode; then we
+ * digitize it again, and throw it away.
+ * (The input <msa> is unchanged.)
+ */
+static void
+utest_ZeroLengthMSA(const char *tmpfile)
+{
+ char *msg = "zero length msa unit test failed";
+ ESL_MSAFILE *mfp = NULL;
+ ESL_MSA *z1 = NULL;
+ ESL_MSA *z2 = NULL;
+ ESL_MSA *z3 = NULL;
+ int *useme = NULL;
+ int nuseme = 0;
+ int i;
+ char errbuf[eslERRBUFSIZE];
+
+ /* Read a text mode alignment from the tmpfile */
+ if (esl_msafile_Open(NULL, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(mfp, &z1) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(mfp);
+
+ /* make an alen=0 text alignment by column subsetting */
+ nuseme = ESL_MAX(z1->alen, z1->nseq);
+ if ((useme = malloc(sizeof(int) * nuseme)) == NULL) esl_fatal(msg);
+ for (i = 0; i < z1->alen; i++) useme[i] = 0;
+ if (esl_msa_ColumnSubset(z1, errbuf, useme) != eslOK) esl_fatal(msg);
+
+ /* These should all no-op if alen=0*/
+ if (esl_msa_MinimGaps(z1, NULL, "-", FALSE) != eslOK) esl_fatal(msg);
+ if (esl_msa_NoGaps(z1, NULL, "-") != eslOK) esl_fatal(msg);
+ if (esl_msa_SymConvert(z1,"RY","NN") != eslOK) esl_fatal(msg);
+
+ /* test sequence subsetting by removing the first sequence */
+ for (i = 1; i < z1->nseq; i++) useme[i] = 1;
+ if (esl_msa_SequenceSubset(z1, useme, &z2) != eslOK) esl_fatal(msg);
+ esl_msa_Destroy(z1);
+ z1 = NULL; // we may reuse z1 below.
+ /* keep z2; we'll compare it to z3 in the end */
+
+#ifdef eslAUGMENT_ALPHABET
+ ESL_ALPHABET *abc;
+
+ /* Now read the same alignment, in digital mode */
+ if ((abc = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal(msg);
+ if (esl_msafile_Open(&abc, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(mfp, &z1) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(mfp);
+
+ /* Now make an alen=0 alignment in digital mode */
+ for (i = 0; i < z1->alen; i++) useme[i] = 0;
+ if (esl_msa_ColumnSubset(z1, errbuf, useme) != eslOK) esl_fatal(msg);
+
+ /* again these should all no-op if alen=0*/
+ if (esl_msa_MinimGaps(z1, NULL, NULL, FALSE) != eslOK) esl_fatal(msg);
+ if (esl_msa_NoGaps(z1, NULL, NULL) != eslOK) esl_fatal(msg);
+ /* SymConvert throws EINVAL on a digital mode alignment */
+
+ /* test sequence subsetting by removing the first sequence */
+ for (i = 1; i < z1->nseq; i++) useme[i] = 1;
+ if (esl_msa_SequenceSubset(z1, useme, &z3) != eslOK) esl_fatal(msg);
+ esl_msa_Destroy(z1);
+
+ if ((z1 = esl_msa_Clone(z3)) == NULL) esl_fatal(msg); /* z1 is now alen=0, digital */
+ if (esl_msa_Textize(z3) != eslOK) esl_fatal(msg); /* convert z3 back to text mode */
+ if (esl_msa_Compare(z2, z3) != eslOK) esl_fatal(msg); /* compare in text mode */
+ if (esl_msa_Digitize(abc, z2, NULL) != eslOK) esl_fatal(msg); /* now z2 is digital */
+ if (esl_msa_Compare(z1, z2) != eslOK) esl_fatal(msg); /* compare digital mode z1,z2 */
+
+ esl_alphabet_Destroy(abc);
+ esl_msa_Destroy(z1);
+ esl_msa_Destroy(z3);
+#endif /*eslAUGMENT_ALPHABET*/
+
+ esl_msa_Destroy(z2);
+ free(useme);
+}
+
+#endif /*eslMSA_TESTDRIVE*/
+/*------------------------ end of unit tests --------------------------------*/
+
+
+/*****************************************************************************
+ * 7. Test driver
+ *****************************************************************************/
+#ifdef eslMSA_TESTDRIVE
+/*
+ * gcc -g -Wall -o esl_msa_utest -I. -DeslMSA_TESTDRIVE -DAUGMENT_KEYHASH esl_msa.c esl_keyhash.c easel.c -lm
+ * gcc -g -Wall -o esl_msa_utest -I. -DeslMSA_TESTDRIVE -DAUGMENT_ALPHABET esl_msa.c esl_alphabet.c easel.c -lm
+ * gcc -g -Wall -o esl_msa_utest -I. -DeslMSA_TESTDRIVE -DAUGMENT_SSI esl_msa.c esl_ssi.c easel.c -lm
+ * gcc -g -Wall -o esl_msa_utest -L. -I. -DeslMSA_TESTDRIVE esl_msa.c -leasel -lm
+ * gcc -g -Wall -o esl_msa_utest -L. -I. -DeslTEST_THROWING -DeslMSA_TESTDRIVE esl_msa.c -leasel -lm
+ * ./msa_utest
+ */
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#ifdef eslAUGMENT_KEYHASH
+#include "esl_keyhash.h"
+#endif
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#ifdef eslAUGMENT_SSI
+#include "esl_ssi.h"
+#endif
+#include "esl_msa.h"
+
+
+int
+main(int argc, char **argv)
+{
+ ESL_MSAFILE *mfp = NULL;
+ ESL_MSA *msa = NULL;
+ FILE *fp = NULL;
+ char tmpfile[16] = "esltmpXXXXXX"; /* tmpfile template */
+#ifdef eslAUGMENT_ALPHABET
+ ESL_ALPHABET *abc = NULL;
+#endif
+
+#ifdef eslTEST_THROWING
+ esl_exception_SetHandler(&esl_nonfatal_handler);
+#endif
+
+ /* Create a known Stockholm test alignment in a tempfile.
+ */
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal("failed to create tmpfile");
+ write_known_msa(fp);
+ fclose(fp);
+
+ /* Read it back in for use in tests.
+ */
+ if (esl_msafile_Open(NULL, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal("Failed to open MSA tmp file");
+ if (esl_msafile_Read(mfp, &msa) != eslOK) esl_fatal("Failed to read MSA tmp file");
+ esl_msafile_Close(mfp);
+
+ /* Unit tests
+ */
+ utest_Create();
+ utest_Destroy();
+ utest_Expand();
+ utest_SequenceSubset(msa);
+ utest_MinimGaps(tmpfile);
+ utest_NoGaps(tmpfile);
+ utest_SymConvert(tmpfile);
+ utest_ZeroLengthMSA(tmpfile); /* this tests in digital mode too if eslAUGMENT_ALPHABET */
+ esl_msa_Destroy(msa);
+
+#ifdef eslAUGMENT_ALPHABET
+ if ((abc = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal("alphabet creation failed");
+ if (esl_msafile_Open(&abc, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &mfp) != eslOK) esl_fatal("MSA digital open failed");
+ if (esl_msafile_Read(mfp, &msa) != eslOK) esl_fatal("MSA digital read failed");
+ esl_msafile_Close(mfp);
+
+ utest_CreateDigital(abc);
+ utest_Digitize(abc, tmpfile);
+ utest_Textize(abc, tmpfile);
+
+ esl_alphabet_Destroy(abc);
+ esl_msa_Destroy(msa);
+#endif
+
+ remove(tmpfile);
+ exit(0); /* success */
+}
+#endif /*eslMSA_TESTDRIVE*/
+/*-------------------- end of test driver ---------------------*/
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msa.h b/esl_msa.h
new file mode 100644
index 0000000..cde88a8
--- /dev/null
+++ b/esl_msa.h
@@ -0,0 +1,211 @@
+/* Multiple sequence alignments
+ */
+#ifndef eslMSA_INCLUDED
+#define eslMSA_INCLUDED
+
+#include <stdio.h>
+
+#include "esl_alphabet.h" /* digital alphabets */
+#include "esl_keyhash.h" /* string hashes, for mapping uniq seq names */
+#include "esl_ssi.h" /* indexes of large flatfiles on disk */
+
+/* The following constants define the Pfam/Rfam cutoff set we propagate
+ * from Stockholm format msa's into HMMER and Infernal models.
+ */
+/*::cexcerpt::msa_cutoffs::begin::*/
+#define eslMSA_TC1 0
+#define eslMSA_TC2 1
+#define eslMSA_GA1 2
+#define eslMSA_GA2 3
+#define eslMSA_NC1 4
+#define eslMSA_NC2 5
+#define eslMSA_NCUTS 6
+/*::cexcerpt::msa_cutoffs::end::*/
+
+/* Object: ESL_MSA
+ *
+ * A multiple sequence alignment.
+ */
+typedef struct {
+ /* Mandatory information associated with the alignment.
+ * (The important stuff.)
+ */
+ /*::cexcerpt::msa_mandatory::begin::*/
+ char **aseq; /* alignment itself, [0..nseq-1][0..alen-1], \0-terminated */
+ char **sqname; /* sequence names [0..nseq-1][], \0-terminated */
+ double *wgt; /* sequence weights [0..nseq-1], default 1.0 */
+ int64_t alen; /* length of alignment (columns); or (if growable) -1 */
+ int nseq; /* number of seqs in alignment; or (if growable) blocksize */
+ int flags; /* flags for what info has been set */
+ /*::cexcerpt::msa_mandatory::end::*/
+
+#ifdef eslAUGMENT_ALPHABET
+ /* When augmented w/ digital alphabets, we can store pre-digitized data in
+ * ax[][], instead of the text info in aseq[][].
+ */
+ ESL_ALPHABET *abc; /* reference ptr to alphabet */
+ ESL_DSQ **ax; /* digitized aseqs [0..nseq-1][1..alen] */
+#endif
+
+ /* Optional information that we understand, and that we might have.
+ * (The occasionally useful stuff.)
+ */
+ /*::cexcerpt::msa_optional::begin::*/
+ char *name; /* name of alignment, or NULL */
+ char *desc; /* description of alignment, or NULL */
+ char *acc; /* accession of alignment, or NULL */
+ char *au; /* "author" information, or NULL */
+ char *ss_cons; /* consensus sec structure, or NULL; [0..alen-1], even in digital mode */
+ char *sa_cons; /* consensus surface access, or NULL; [0..alen-1], even in digital mode */
+ char *pp_cons; /* consensus posterior prob, or NULL; [0..alen-1], even in digital mode */
+ char *rf; /* reference coord system, or NULL; [0..alen-1], even in digital mode */
+ char *mm; /* model mask, or NULL; [0..alen-1], even in digital mode */
+ char **sqacc; /* accession numbers for sequences i */
+ char **sqdesc; /* description lines for sequences i */
+ char **ss; /* per-seq secondary structures, or NULL */
+ char **sa; /* per-seq surface accessibilities, or NULL */
+ char **pp; /* posterior prob per residue, or NULL */
+ float cutoff[eslMSA_NCUTS]; /* NC/TC/GA cutoffs propagated to Pfam/Rfam */
+ int cutset[eslMSA_NCUTS]; /* TRUE if a cutoff is set; else FALSE */
+ /*::cexcerpt::msa_optional::end::*/
+
+ /* Info needed for maintenance of the data structure
+ * (internal stuff.)
+ */
+ int sqalloc; /* # seqs currently allocated for */
+ int64_t *sqlen; /* individual seq lengths during parsing */
+ int64_t *sslen; /* individual ss lengths during parsing */
+ int64_t *salen; /* individual sa lengths during parsing */
+ int64_t *pplen; /* individual pp lengths during parsing */
+ int lastidx; /* last index we saw; use for guessing next */
+
+ /* Optional information, especially Stockholm markup.
+ * (The stuff we don't understand, but we can regurgitate.)
+ *
+ * That is, we know what type of information it is, but it's
+ * either (interpreted as) free-text comment, or it's Stockholm
+ * markup with unfamiliar tags.
+ */
+ char **comment; /* free text comments, or NULL */
+ int ncomment; /* number of comment lines */
+ int alloc_ncomment; /* number of comment lines alloc'ed */
+
+ char **gf_tag; /* markup tags for unparsed #=GF lines */
+ char **gf; /* annotations for unparsed #=GF lines */
+ int ngf; /* number of unparsed #=GF lines */
+ int alloc_ngf; /* number of gf lines alloc'ed */
+
+ char **gs_tag; /* markup tags for unparsed #=GS lines */
+ char ***gs; /* [0..ngs-1][0..nseq-1][free text] markup */
+ int ngs; /* number of #=GS tag types */
+
+ char **gc_tag; /* markup tags for unparsed #=GC lines */
+ char **gc; /* [0..ngc-1][0..alen-1] markup */
+ int ngc; /* number of #=GC tag types */
+
+ char **gr_tag; /* markup tags for unparsed #=GR lines */
+ char ***gr; /* [0..ngr-1][0..nseq-1][0..alen-1] markup */
+ int ngr; /* number of #=GR tag types */
+
+ /* Optional augmentation w/ keyhashes.
+ * This can significantly speed up parsing of large alignments
+ * with many (>1,000) sequences.
+ */
+#ifdef eslAUGMENT_KEYHASH
+ ESL_KEYHASH *index; /* name ->seqidx hash table */
+ ESL_KEYHASH *gs_idx; /* hash of #=GS tag types */
+ ESL_KEYHASH *gc_idx; /* hash of #=GC tag types */
+ ESL_KEYHASH *gr_idx; /* hash of #=GR tag types */
+#endif /*eslAUGMENT_KEYHASH*/
+
+#ifdef eslAUGMENT_SSI
+ off_t offset; /* disk offset to start of 1st line of this MSA's record */
+#endif
+} ESL_MSA;
+
+
+
+/* Flags for msa->flags */
+#define eslMSA_HASWGTS (1 << 0) /* 1 if wgts were set, 0 if default 1.0's */
+#define eslMSA_DIGITAL (1 << 1) /* if ax[][] is used instead of aseq[][] */
+
+
+/* Declarations of the API */
+
+/* 1. The ESL_MSA object */
+extern ESL_MSA *esl_msa_Create(int nseq, int64_t alen);
+extern int esl_msa_Expand(ESL_MSA *msa);
+extern int esl_msa_Copy (const ESL_MSA *msa, ESL_MSA *new);
+extern ESL_MSA *esl_msa_Clone(const ESL_MSA *msa);
+extern void esl_msa_Destroy(ESL_MSA *msa);
+
+/* 2. Digital mode MSA's (augmentation: alphabet) */
+#ifdef eslAUGMENT_ALPHABET
+extern int esl_msa_GuessAlphabet(const ESL_MSA *msa, int *ret_type);
+extern ESL_MSA *esl_msa_CreateDigital(const ESL_ALPHABET *abc, int nseq, int64_t alen);
+extern int esl_msa_Digitize(const ESL_ALPHABET *abc, ESL_MSA *msa, char *errmsg);
+extern int esl_msa_Textize(ESL_MSA *msa);
+extern int esl_msa_ConvertDegen2X(ESL_MSA *msa);
+#endif /*eslAUGMENT_ALPHABET*/
+
+/* 3. Setting or checking data fields in an ESL_MSA */
+extern int esl_msa_SetName (ESL_MSA *msa, const char *s, esl_pos_t n);
+extern int esl_msa_SetDesc (ESL_MSA *msa, const char *s, esl_pos_t n);
+extern int esl_msa_SetAccession (ESL_MSA *msa, const char *s, esl_pos_t n);
+extern int esl_msa_SetAuthor (ESL_MSA *msa, const char *s, esl_pos_t n);
+extern int esl_msa_SetSeqName (ESL_MSA *msa, int idx, const char *s, esl_pos_t n);
+extern int esl_msa_SetSeqAccession (ESL_MSA *msa, int idx, const char *s, esl_pos_t n);
+extern int esl_msa_SetSeqDescription(ESL_MSA *msa, int idx, const char *s, esl_pos_t n);
+extern int esl_msa_SetDefaultWeights(ESL_MSA *msa);
+
+extern int esl_msa_FormatName (ESL_MSA *msa, const char *name, ...);
+extern int esl_msa_FormatDesc (ESL_MSA *msa, const char *desc, ...);
+extern int esl_msa_FormatAccession (ESL_MSA *msa, const char *acc, ...);
+extern int esl_msa_FormatAuthor (ESL_MSA *msa, const char *author, ...);
+extern int esl_msa_FormatSeqName (ESL_MSA *msa, int idx, const char *name, ...);
+extern int esl_msa_FormatSeqAccession (ESL_MSA *msa, int idx, const char *acc, ...);
+extern int esl_msa_FormatSeqDescription(ESL_MSA *msa, int idx, const char *desc, ...);
+
+extern int esl_msa_AddComment(ESL_MSA *msa, char *p, esl_pos_t n);
+extern int esl_msa_AddGF (ESL_MSA *msa, char *tag, esl_pos_t taglen, char *value, esl_pos_t vlen);
+extern int esl_msa_AddGS (ESL_MSA *msa, char *tag, esl_pos_t taglen, int sqidx, char *value, esl_pos_t vlen);
+extern int esl_msa_AppendGC (ESL_MSA *msa, char *tag, char *value);
+extern int esl_msa_AppendGR (ESL_MSA *msa, char *tag, int sqidx, char *value);
+
+extern int esl_msa_CheckUniqueNames(const ESL_MSA *msa);
+
+/* 4. Miscellaneous functions for manipulating MSAs */
+extern int esl_msa_ReasonableRF(ESL_MSA *msa, double symfrac, int useconsseq, char *rfline);
+extern int esl_msa_MarkFragments(ESL_MSA *msa, double fragthresh);
+extern int esl_msa_SequenceSubset(const ESL_MSA *msa, const int *useme, ESL_MSA **ret_new);
+extern int esl_msa_ColumnSubset (ESL_MSA *msa, char *errbuf, const int *useme);
+extern int esl_msa_MinimGaps (ESL_MSA *msa, char *errbuf, const char *gaps, int consider_rf);
+extern int esl_msa_MinimGapsText(ESL_MSA *msa, char *errbuf, const char *gaps, int consider_rf, int fix_bps);
+extern int esl_msa_NoGaps (ESL_MSA *msa, char *errbuf, const char *gaps);
+extern int esl_msa_NoGapsText (ESL_MSA *msa, char *errbuf, const char *gaps, int fix_bps);
+extern int esl_msa_SymConvert(ESL_MSA *msa, const char *oldsyms, const char *newsyms);
+extern int esl_msa_Checksum(const ESL_MSA *msa, uint32_t *ret_checksum);
+
+extern int esl_msa_RemoveBrokenBasepairsFromSS(char *ss, char *errbuf, int len, const int *useme);
+extern int esl_msa_RemoveBrokenBasepairs(ESL_MSA *msa, char *errbuf, const int *useme);
+
+extern int esl_msa_ReverseComplement(ESL_MSA *msa);
+#ifdef eslAUGMENT_KEYHASH
+extern int esl_msa_Hash(ESL_MSA *msa);
+#endif
+
+/* 5. Debugging, testing, development */
+extern int esl_msa_Validate(const ESL_MSA *msa, char *errmsg);
+extern ESL_MSA *esl_msa_CreateFromString(const char *s, int fmt);
+extern int esl_msa_Compare (ESL_MSA *a1, ESL_MSA *a2);
+extern int esl_msa_CompareMandatory(ESL_MSA *a1, ESL_MSA *a2);
+extern int esl_msa_CompareOptional (ESL_MSA *a1, ESL_MSA *a2);
+#endif /*eslMSA_INCLUDED*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $URL$
+ * SVN $Id$
+ *****************************************************************/
diff --git a/esl_msa.tex b/esl_msa.tex
new file mode 100644
index 0000000..aee50f0
--- /dev/null
+++ b/esl_msa.tex
@@ -0,0 +1,282 @@
+The \eslmod{msa} module reads and writes multiple sequence alignment
+files. The API is summarized in Table~\ref{tbl:msa_api}.
+
+The module uses two objects. An \ccode{ESL\_MSA} holds a multiple
+sequence alignment. A \ccode{ESL\_MSAFILE} is an alignment file,
+opened for input. No object is needed for output of an alignment file;
+a normal C \ccode{FILE} stream is used for output.
+
+Augmentation with the \eslmod{alphabet} module allows MSAs to be input
+as digital Easel sequence data (\ccode{ESL\_DSQ}), or converted to and
+from digital data. Normally aligned sequences are stored in an
+\ccode{ESL\_MSA} just as text strings, exactly as they appeared in the
+input file.
+
+Augmentation with the \eslmod{ssi} module allows rapid random access
+of SSI-indexed large MSA database files like Pfam or Rfam. When
+augmented, the \ccode{esl\_msafile\_Open()} and
+\ccode{esl\_msafile\_OpenDigital()} functions automatically open an
+accompanying SSI index, if it is present.
+
+Augmentation with the \eslmod{keyhash} module allows much better
+performance on parsing large Stockholm alignment files, by
+accelerating indexing of some internal data structures.
+
+
+% Table generated by autodoc -t esl_msa.c (so don't edit here, edit esl_msa.c:)
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\apisubhead{The ESL\_MSA object }\\
+\hyperlink{func:esl_msa_Create()}{\ccode{esl\_msa\_Create()}} & Creates an \ccode{ESL\_MSA} object.\\
+\hyperlink{func:esl_msa_CreateFromString()}{\ccode{esl\_msa\_CreateFromString()}} & Creates a small \ccode{ESL\_MSA} from a test case string.\\
+\hyperlink{func:esl_msa_Expand()}{\ccode{esl\_msa\_Expand()}} & Reallocate for more sequences.\\
+\hyperlink{func:esl_msa_Destroy()}{\ccode{esl\_msa\_Destroy()}} & Frees an \ccode{ESL\_MSA}.\\
+\apisubhead{The ESL\_MSAFILE object }\\
+\hyperlink{func:esl_msafile_Open()}{\ccode{eslx\_msafile\_Open()}} & Open an MSA file for input.\\
+\hyperlink{func:esl_msafile_Close()}{\ccode{eslx\_msafile\_Close()}} & Closes an open MSA file.\\
+\apisubhead{Digital mode MSA's (augmentation: alphabet)}\\
+\hyperlink{func:esl_msa_GuessAlphabet()}{\ccode{esl\_msa\_GuessAlphabet()}} & Guess alphabet of MSA.\\
+\hyperlink{func:esl_msa_CreateDigital()}{\ccode{esl\_msa\_CreateDigital()}} & Create a digital \ccode{ESL\_MSA}.\\
+\hyperlink{func:esl_msa_Digitize()}{\ccode{esl\_msa\_Digitize()}} & Digitizes an msa, converting it from text mode.\\
+\hyperlink{func:esl_msa_Textize()}{\ccode{esl\_msa\_Textize()}} & Convert a digital msa to text mode.\\
+\hyperlink{func:esl_msafile_GuessAlphabet()}{\ccode{eslx\_msafile\_GuessAlphabet()}} & Guess what kind of sequences the alignment file contains.\\
+\hyperlink{func:esl_msafile_OpenDigital()}{\ccode{eslx\_msafile\_OpenDigital()}} & Open an msa file for digital input.\\
+\hyperlink{func:esl_msafile_SetDigital()}{\ccode{eslx\_msafile\_SetDigital()}} & Set an open \ccode{ESL\_MSAFILE} to read in digital mode.\\
+\apisubhead{Random MSA database access (augmentation: ssi)}\\
+\hyperlink{func:esl_msafile_PositionByKey()}{\ccode{eslx\_msafile\_PositionByKey()}} & Use SSI to reposition file to start of named MSA.\\
+
+\apisubhead{General i/o API, all alignment formats }\\
+%\hyperlink{func:esl_msa_Read()}{\ccode{esl\_msa\_Read()}} & Read next MSA from a file.\\
+%\hyperlink{func:esl_msa_Write()}{\ccode{esl\_msa\_Write()}} & Write an MSA to a file.\\
+%\hyperlink{func:esl_msa_GuessFileFormat()}{\ccode{esl\_msa\_GuessFileFormat()}} & Determine the format of an open MSA file.\\
+\apisubhead{Miscellaneous functions for manipulating MSAs}\\
+\hyperlink{func:esl_msa_SequenceSubset()}{\ccode{esl\_msa\_SequenceSubset()}} & Select subset of sequences into a smaller MSA.\\
+\hyperlink{func:esl_msa_ColumnSubset()}{\ccode{esl\_msa\_ColumnSubset()}} & Remove a selected subset of columns from the MSA
+\\
+\hyperlink{func:esl_msa_MinimGaps()}{\ccode{esl\_msa\_MinimGaps()}} & Remove columns containing all gym symbols.\\
+\hyperlink{func:esl_msa_NoGaps()}{\ccode{esl\_msa\_NoGaps()}} & Remove columns containing any gap symbol.\\
+\hyperlink{func:esl_msa_SymConvert()}{\ccode{esl\_msa\_SymConvert()}} & Global search/replace of symbols in an MSA.\\
+\hyperlink{func:esl_msa_AddComment()}{\ccode{esl\_msa\_AddComment()}} & Description.\\
+\hyperlink{func:esl_msa_AddGF()}{\ccode{esl\_msa\_AddGF()}} & Description.\\
+\hyperlink{func:esl_msa_AddGS()}{\ccode{esl\_msa\_AddGS()}} & Description.\\
+\hyperlink{func:esl_msa_AppendGC()}{\ccode{esl\_msa\_AppendGC()}} & Description.\\
+\hyperlink{func:esl_msa_AppendGR()}{\ccode{esl\_msa\_AppendGR()}} & Description.\\
+\hyperlink{func:esl_msa_Compare()}{\ccode{esl\_msa\_Compare()}} & Compare two MSAs for equality.\\
+\hyperlink{func:esl_msa_CompareMandatory()}{\ccode{esl\_msa\_CompareMandatory()}} & Compare mandatory subset of MSA contents.\\
+\hyperlink{func:esl_msa_CompareOptional()}{\ccode{esl\_msa\_CompareOptional()}} & Compare optional subset of MSA contents.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{msa} API.}
+\label{tbl:msa_api}
+\end{table}
+
+
+
+
+\subsection{Example of using msa}
+
+Here's an example of opening an MSA file and reading one or more
+alignments from it:
+
+%%\input{cexcerpts/msa_example}
+
+Some things about the use of the API in the example are worth noting:
+
+\begin{enumerate}
+\item The format of the alignment file can either be automatically
+ detected, or set by the caller when the file is opened.
+ Autodetection is invoked when the caller passes a format code
+ (here, \ccode{fmt}) of
+ \ccode{eslMSAFILE\_UNKNOWN}. Autodetection is a ``best effort''
+ guess, but it is not 100\% reliable - especially if the input
+ file isn't an alignment file at all. So autodetection is a
+ convenient default, but the caller will probably want to provide
+ a way for the user to specify the input file format and override
+ autodetection, just in case.
+
+\item Errors can occur either in opening or reading the file that you
+ must check for. This error checking could be as simple as making
+ sure that \ccode{esl\_msafile\_Open()} and
+ \ccode{esl\_msa\_Read()} returned \ccode{eslOK}, but the example
+ shows how to catch all the normal errors returned by these
+ calls, and how to format some reasonably informative error
+ messages for the user. For example, when parsing the file fails
+ and \ccode{esl\_msa\_Read()} returns an \ccode{eslEFORMAT}
+ error, information about the problem is stored in \ccode{afp}:
+ the caller can use \ccode{afp->linenumber}, \ccode{afp->buf},
+ and \ccode{afp->errbuf} to get the line number in the file that
+ the error occurred, the text that was on that line, and a short
+ error message about what was wrong with it, respectively.
+
+\item To output (write) an alignment, open a normal C \ccode{FILE}
+ stream, write the alignment(s) with \ccode{esl\_msa\_Write()},
+ and close the stream with C's \ccode{fclose()}. Here, the
+ example is regurgitating the alignments it reads to
+ \ccode{stdout}.
+
+\item Note the example of how to compile with \eslmod{keyhash}
+ augmentation, just by defining \ccode{-DeslAUGMENT\_KEYHASH} and
+ adding the \ccode{esl\_keyhash.c} file when you compile. The
+ effects of \eslmod{keyhash} augmentation are all internal the
+ \eslmod{msa} module, rather than providing any new functions.
+\end{enumerate}
+
+\subsection{Accessing alignment data}
+
+The information in the \ccode{ESL\_MSA} object is meant to be accessed
+directly, so you need to know what it contains. This object is defined
+and documented in \ccode{esl\_msa.h}. It contains various information,
+as follows:
+
+\subsubsection{Important/mandatory information}
+
+The following information is always available in an MSA (except
+digital-mode alignments, which replace \ccode{aseq[][]} with
+\ccode{ax[][]}, as described later):
+
+\input{cexcerpts/msa_mandatory}
+
+The alignment contains \ccode{nseq} sequences, each of which contains
+\ccode{alen} characters.
+
+\ccode{aseq[i]} is the i'th aligned sequence, numbered
+\ccode{0..nseq-1}.
+
+\ccode{aseq[i][j]} is the j'th character in aligned sequence i,
+numbered \ccode{0..alen-1}.
+
+\ccode{sqname[i]} is the name of the i'th sequence.
+
+\ccode{wgt[i]} is a non-negative real-valued weight for sequence
+i. This defaults to 1.0 if the alignment file did not provide weight
+data. You can determine whether weight data was parsed by checking
+\ccode{(flags \& eslMSA\_HASWGTS)}.
+
+
+
+\subsubsection{Optional information}
+
+The following information is optional. It is usually only provided by
+annotated Stockholm alignments (for instance, Pfam and Rfam database
+alignments):
+
+\input{cexcerpts/msa_optional}
+
+These should be self-explanatory; but for more information, see the
+Stockholm format documentation. Each of these fields corresponds to
+Stockholm markup.
+
+These pointers will be NULL for any optional annotation that was not
+present in the alignment file. This is true at any level; for
+instance, \ccode{ss} will be NULL if no secondary structures are
+available for any sequence, and \ccode{ss[i]} will be NULL if some
+secondary structures are available, but not for sequence i.
+
+The \ccode{cutoff} array contains Pfam/Rfam curated trusted, gathering
+and noise score cutoffs. They are indexed as follows:
+
+\input{cexcerpts/msa_cutoffs}
+
+
+
+\subsubsection{Unparsed information}
+
+The MSA object also stores additional ``unparsed'' information from
+Stockholm files; that is, tags that are present but not recognized by
+the MSA module. This information is stored so that it may be
+regurgitated if the application needs to faithfully output the entire
+alignment file, even the bits that it didn't understand. If you need
+to access unparsed Stockholm tags, see the comments in
+\ccode{esl\_msa.h}.
+
+
+
+\subsubsection{Off-by-one issues in indexing alignment columns}
+
+With one exception, all arrays over alignment columns are normal C
+string arrays, indexed \ccode{0..alen-1}. This includes optional
+information such as \ccode{msa->rf[]} (the reference annotation line)
+and \ccode{msa->cs[]} (the consensus structure annotation line).
+
+The exception is a digitized sequence alignment, \ccode{msa->ax[][]}
+(see below), where columns are indexed 1..alen and sentinel bytes at
+positions 0 and alen+1, following Easel's convention for digitized
+sequences.
+
+Thus, when your code is manipulating a digitized alignment and using
+optional information like the reference annotation line or the
+consensus structure line, you must be careful of the off-by-one
+difference in how the two types of data are indexed.
+
+\subsection{Accepted formats}
+
+Currently, the MSA module only parses Stockholm format.
+
+Stockholm format and other alignment formats are documented in a later
+chapter.
+
+\subsection{Digital versus text representation}
+
+The multiple alignment is normally stored as ASCII text symbols in a
+2D array \ccode{char ** aseq[0..nseq-1][0..alen-1]}. These strings are
+stored exactly as they appeared in the original file; they aren't
+converted to upper or lower case, for example.
+
+Optionally, when augmented with the \eslmod{alphabet} module, the
+multiple alignment may alternatively be stored as digital data in an
+Easel internal alphabet. This enables more consistent, robust, and
+speedy handling of the sequence data.
+
+An \ccode{ESL\_MSA} may therefore be in either \esldef{text mode} or
+\esldef{digital mode}. Text mode is the default behavior. An
+\ccode{ESL\_MSA} is in digital mode if its \ccode{eslMSA\_DIGITAL} flag
+is up (\ccode{msa->flags \& eslMSA\_DIGITAL} is \ccode{TRUE}). When the
+alignment data are in digital mode, they are stored internally as a 2D
+digital sequence array \ccode{ESL\_DSQ ** ax[0..nseq-1][1..alen]}, and
+the \ccode{aseq} field is \ccode{NULL}.
+
+To use a digital internal representation, it is most efficient to read
+directly as digital data, using a \ccode{esl\_msafile\_OpenDigital()}
+call in place of \ccode{esl\_msafile\_Open()}. You can also change the
+mode of an MSA from text to digital using
+\ccode{esl\_msa\_Digitize()}, and digital to text using
+\ccode{esl\_msa\_Textize()}.
+
+Suppose you want to open an alignment file and read its alignments in
+digital mode, but you don't know whether the file contains DNA or
+protein alignments. You can't use \ccode{esl\_msafile\_OpenDigital()}
+unless you have an alphabet; but you can't see the alphabet until
+you've read an alignment. \Easel provides
+\ccode{esl\_msafile\_GuessAlphabet()} to peek at the first alignment
+and guess its alphabet\footnote{Because the stream that alignments are
+being read from may be non-rewindable, the implementation of
+\ccode{esl\_msafile\_GuessAlphabet()} reads and caches the first
+alignment.}, and \ccode{esl\_msafile\_SetDigital()} to set an
+already-open \ccode{ESL\_MSAFILE} so that all subsequent alignments
+are read in digital mode. For example:
+
+%%\input{cexcerpts/msa_example2}
+
+
+\subsection{Reading from stdin or gzip-compressed files}
+
+The module can read compressed alignment files. If the
+\ccode{filename} passed to \ccode{esl\_msafile\_Open()} ends in
+\ccode{.gz}, the file is assumed to be compressed with gzip. Instead
+of opening it normally, \ccode{esl\_msafile\_Open()} opens it as a pipe
+through \ccode{gzip -dc}. Obviously this only works on a POSIX
+system -- pipes have to work, specifically the \ccode{popen()} system
+call -- and \ccode{gzip} must be installed and in the PATH.
+
+The module can also read from a standard input pipe. If the
+\ccode{filename} passed to \ccode{esl\_msafile\_Open()} is \ccode{-},
+the alignment is read from \ccode{STDIN} rather than from a file.
+
+Because of the way format autodetection works, you cannot use it when
+reading from a pipe or compressed file. The application must know the
+appropriate format and pass that code it calls
+\ccode{esl\_msafile\_Open()}.
diff --git a/esl_msa_testfiles/a2m/a2m.good.1 b/esl_msa_testfiles/a2m/a2m.good.1
new file mode 100644
index 0000000..a766c74
--- /dev/null
+++ b/esl_msa_testfiles/a2m/a2m.good.1
@@ -0,0 +1,16 @@
+>MYG_PHYCA
+VLSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRFKHLKTEAEMKASED
+LKKHGVTVLTALGAILKKKGHHEAELKPLAQSHATKHKIPIKYLEFISEAIIHVLHSRHP
+GDFGADAQGAMNKALELFRKDIAAKYKELGYQG
+>GLB5_PETMA
+pivdtgsvApLSAAEKTKIRSAWAPVYSTYETSGVDILVKFFTSTPAAQEFFPKFKGLTT
+ADQLKKSADVRWHAERIINAVNDAVASMDDtekMSMKLRDLSGKHAKSFQVDPQYFKVLA
+AVI---------ADTVAAGDAGFEKLMSMICILLRSAY-------
+>HBB_HUMAN
+VhLTPEEKSAVTALWGKV--NVDEVGGEALGRLLVVYPWTQRFFESFGDLSTPDAVMGNP
+KVKAHGKKVLGAFSDGLAHLDNLKGTFATLSELHCDKLHVDPENFRLLGNVLVCVLAHHF
+GKEFTPPVQAAYQKVVAGVANALAHKYH------
+>HBA_HUMAN
+VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHF------DLSHGSAQ
+VKGHGKKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLP
+AEFTPAVHASLDKFLASVSTVLTSKYR------
diff --git a/esl_msa_testfiles/a2m/a2m.good.2 b/esl_msa_testfiles/a2m/a2m.good.2
new file mode 100644
index 0000000..828797d
--- /dev/null
+++ b/esl_msa_testfiles/a2m/a2m.good.2
@@ -0,0 +1,15 @@
+>tRNA2
+UCCGAUAUAGUGUAACGGCUAUCACAUCACGCUUUCACCGUGGAGACCGGGGUUCGACUC
+CCCGUAUCGGAG
+>tRNA3
+UCCGUGAUAGUUUAAUGGUCAGAAUGG-GCGCUUGUCGCGUGCcAGAUCGGGGUUCAAUU
+CCCCGUCGCGGAG
+>tRNA5
+GGGCACAUGGCGCAGUUGGUAGCGCGCUUCCCUUGCAAGGAAGaGGUCAUCGGUUCGAUU
+CCGGUUGCGUCCA
+>tRNA1
+GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGaGGUCCUGUGUUCGAUC
+CACAGAAUUCGCA
+>tRNA4
+GCUCGUAUGGCGCAGUGG-UAGCGCAGCAGAUUGCAAAUCUGUuGGUCCUUAGUUCGAUC
+CUGAGUGCGAGCU
diff --git a/esl_msa_testfiles/afa/afa.good.1 b/esl_msa_testfiles/afa/afa.good.1
new file mode 100644
index 0000000..7f94e20
--- /dev/null
+++ b/esl_msa_testfiles/afa/afa.good.1
@@ -0,0 +1,16 @@
+>MYG_PHYCA
+--------V-LSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRFKHLKT
+EAEMKASEDLKKHGVTVLTALGAILKKKGH---HEAELKPLAQSHATKHKIPIKYLEFIS
+EAIIHVLHSRHPGDFGADAQGAMNKALELFRKDIAAKYKELGYQG
+>GLB5_PETMA
+PIVDTGSVAPLSAAEKTKIRSAWAPVYSTYETSGVDILVKFFTSTPAAQEFFPKFKGLTT
+ADQLKKSADVRWHAERIINAVNDAVASMDDTEKMSMKLRDLSGKHAKSFQVDPQYFKVLA
+AVI---------ADTVAAGDAGFEKLMSMICILLRSAY-------
+>HBB_HUMAN
+--------VHLTPEEKSAVTALWGKV--NVDEVGGEALGRLLVVYPWTQRFFESFGDLST
+PDAVMGNPKVKAHGKKVLGAFSDGLAHLDN---LKGTFATLSELHCDKLHVDPENFRLLG
+NVLVCVLAHHFGKEFTPPVQAAYQKVVAGVANALAHKYH------
+>HBA_HUMAN
+--------V-LSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHF-----
+-DLSHGSAQVKGHGKKVADALTNAVAHVDD---MPNALSALSDLHAHKLRVDPVNFKLLS
+HCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR------
diff --git a/esl_msa_testfiles/afa/afa.good.2 b/esl_msa_testfiles/afa/afa.good.2
new file mode 100644
index 0000000..4c49d13
--- /dev/null
+++ b/esl_msa_testfiles/afa/afa.good.2
@@ -0,0 +1,15 @@
+>tRNA2
+UCCGAUAUAGUGUAACGGCUAUCACAUCACGCUUUCACCGUGG-AGACCGGGGUUCGACU
+CCCCGUAUCGGAG
+>tRNA3
+UCCGUGAUAGUUUAAUGGUCAGAAUGG-GCGCUUGUCGCGUGCCAGAUCGGGGUUCAAUU
+CCCCGUCGCGGAG
+>tRNA5
+GGGCACAUGGCGCAGUUGGUAGCGCGCUUCCCUUGCAAGGAAGAGGUCAUCGGUUCGAUU
+CCGGUUGCGUCCA
+>tRNA1
+GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUC
+CACAGAAUUCGCA
+>tRNA4
+GCUCGUAUGGCGCAGUGG-UAGCGCAGCAGAUUGCAAAUCUGUUGGUCCUUAGUUCGAUC
+CUGAGUGCGAGCU
diff --git a/esl_msa_testfiles/afa/afa.good.3 b/esl_msa_testfiles/afa/afa.good.3
new file mode 100644
index 0000000..07df173
--- /dev/null
+++ b/esl_msa_testfiles/afa/afa.good.3
@@ -0,0 +1,24 @@
+>7295730___KOG0003
+mqifvktltgktitlevepsdtienvkakiqdkegippdqqrlifagkql
+edgrtlsdyniqkestlhlvlrlrggiiepslrilaqkyncdkmicrkcy
+arlhpratncrkkkcghtnnlrpkkklk
+>Hs4507761___KOG0003
+mqifvktltgktitlevepsdtienvkakiqdkegippdqqrlifagkql
+edgrtlsdyniqkestlhlvlrlrggiiepslrqlaqkyncdkmicrkcy
+arlhpravncrkkkcghtnnlrpkkkvk
+>At3g52590___KOG0003
+mqifvktltgktitlevessdtidnvkakiqdkegippdqqrlifagkql
+edgrtladyniqkestlhlvlrlrggiiepslmmlarkynqdkmicrkcy
+arlhpravncrkkkcghsnqlrpkkkik
+>CE15495___KOG0003
+mqifvktltgktitleveasdtienvkakiqdkegippdqqrlifagkql
+edgrtlsdyniqkestlhlvlrlrggiiepslrqlaqkyncdkqicrkcy
+arlpprasncrkkkcghsselrikkklk
+>SPAC1805.12c___KOG0003
+mqifvktltgktitlevessdtidnvkskiqdkegippdqqrlifagkql
+edgrtlsdyniqkestlhlvlrlrggiiepslkalaskyncekqicrkcy
+arlppratncrkkkcghtnqlrpkkklk
+>YIL148w___KOG0003
+mqifvktltgktitlevessdtidnvkskiqdkegippdqqrlifagkql
+edgrtlsdyniqkestlhlvlrlrggiiepslkalaskyncdksvcrkcy
+arlppratncrkrkcghtnqlrpkkklk
diff --git a/esl_msa_testfiles/clustal/clustal.good.1 b/esl_msa_testfiles/clustal/clustal.good.1
new file mode 100644
index 0000000..900f12f
--- /dev/null
+++ b/esl_msa_testfiles/clustal/clustal.good.1
@@ -0,0 +1,20 @@
+MUSCLE (3.7) multiple sequence alignment
+
+
+MYG_PHYCA --------V-LSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRFKHLKT
+GLB5_PETMA PIVDTGSVAPLSAAEKTKIRSAWAPVYSTYETSGVDILVKFFTSTPAAQEFFPKFKGLTT
+HBB_HUMAN --------VHLTPEEKSAVTALWGKV--NVDEVGGEALGRLLVVYPWTQRFFESFGDLST
+HBA_HUMAN --------V-LSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHF-----
+ . *: :. : *. * * : * .:: * : * *
+
+MYG_PHYCA EAEMKASEDLKKHGVTVLTALGAILKKKGH---HEAELKPLAQSHATKHKIPIKYLEFIS
+GLB5_PETMA ADQLKKSADVRWHAERIINAVNDAVASMDDTEKMSMKLRDLSGKHAKSFQVDPQYFKVLA
+HBB_HUMAN PDAVMGNPKVKAHGKKVLGAFSDGLAHLDN---LKGTFATLSELHCDKLHVDPENFRLLG
+HBA_HUMAN -DLSHGSAQVKGHGKKVADALTNAVAHVDD---MPNALSALSDLHAHKLRVDPVNFKLLS
+ . .:. *. : *. : . : *: *. . .: : .:.
+
+MYG_PHYCA EAIIHVLHSRHPGDFGADAQGAMNKALELFRKDIAAKYKELGYQG
+GLB5_PETMA AVI---------ADTVAAGDAGFEKLMSMICILLRSAY-------
+HBB_HUMAN NVLVCVLAHHFGKEFTPPVQAAYQKVVAGVANALAHKYH------
+HBA_HUMAN HCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR------
+ : : . .. :* : . : *
diff --git a/esl_msa_testfiles/clustal/clustal.good.2 b/esl_msa_testfiles/clustal/clustal.good.2
new file mode 100644
index 0000000..32e11ad
--- /dev/null
+++ b/esl_msa_testfiles/clustal/clustal.good.2
@@ -0,0 +1,15 @@
+CLUSTAL W (1.81) multiple sequence alignment
+
+tRNA2 UCCGAUAUAGUGUAACGGCUAUCACAUCACGCUUUCACCGUGG-AGACCGGGGUUCGACU
+tRNA3 UCCGUGAUAGUUUAAUGGUCAGAAUGG-GCGCUUGUCGCGUGCCAGAUCGGGGUUCAAUU
+tRNA5 GGGCACAUGGCGCAGUUGGUAGCGCGCUUCCCUUGCAAGGAAGAGGUCAUCGGUUCGAUU
+tRNA1 GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUC
+tRNA4 GCUCGUAUGGCGCAGUGG-UAGCGCAGCAGAUUGCAAAUCUGUUGGUCCUUAGUUCGAUC
+ * * * * * * * **** *
+
+tRNA2 CCCCGUAUCGGAG
+tRNA3 CCCCGUCGCGGAG
+tRNA5 CCGGUUGCGUCCA
+tRNA1 CACAGAAUUCGCA
+tRNA4 CUGAGUGCGAGCU
+ *
diff --git a/esl_msa_testfiles/phylip/phylip.ambig.1 b/esl_msa_testfiles/phylip/phylip.ambig.1
new file mode 100644
index 0000000..64e584e
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.ambig.1
@@ -0,0 +1,9 @@
+ 2 49
+seq1 AAAAAAAAAA CCCCCCCCCC
+YYYYYYYYY DDDDDDDDDD EEEEEEEEEE
+YYYYYYYYY FFFFFFFFFF GGGGGGGGGG
+HHHHHHHHH IIIIIIIIII KKKKKKKKKK
+
+
+
+
diff --git a/esl_msa_testfiles/phylip/phylip.bad.1 b/esl_msa_testfiles/phylip/phylip.bad.1
new file mode 100644
index 0000000..9ecbaf7
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.1
@@ -0,0 +1,3 @@
+ 2 20
+Turkey xAAGCTNGGGC ATTTCAGGGT
+Salmo gairxAAGCCTTGGC AGTGCAGGGT
diff --git a/esl_msa_testfiles/phylip/phylip.bad.10 b/esl_msa_testfiles/phylip/phylip.bad.10
new file mode 100644
index 0000000..65eeb17
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.10
@@ -0,0 +1,6 @@
+ 3 40
+seq1_name ACDEFGHIKLMNPQRSTVWY
+seq2_name ACDEFGHIKLMNPQRSTVWY
+
+ACDEFGHIKLMNPQRSTVWY
+ACDEFGHIKLMNPQRSTVWY
diff --git a/esl_msa_testfiles/phylip/phylip.bad.11 b/esl_msa_testfiles/phylip/phylip.bad.11
new file mode 100644
index 0000000..d2e395c
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.11
@@ -0,0 +1,7 @@
+ 2 30
+seq1_name ACDEFGHIKLMNPQRSTVWY
+seq2_name ACDEFGHIKLMNPQRSTVWY
+
+ ACDEFGHIKLMNPQRSTVWY
+ ACDEFGHIKLMNPQRSTVWY
+
diff --git a/esl_msa_testfiles/phylip/phylip.bad.2 b/esl_msa_testfiles/phylip/phylip.bad.2
new file mode 100644
index 0000000..e51b510
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.2
@@ -0,0 +1,3 @@
+ x 2 20
+Turkey AAGCTNGGGC ATTTCAGGGT
+Salmo gairAAGCCTTGGC AGTGCAGGGT
diff --git a/esl_msa_testfiles/phylip/phylip.bad.3 b/esl_msa_testfiles/phylip/phylip.bad.3
new file mode 100644
index 0000000..c7f6530
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.3
@@ -0,0 +1,3 @@
+ 2 x
+Turkey AAGCTNGGGC ATTTCAGGGT
+Salmo gairAAGCCTTGGC AGTGCAGGGT
diff --git a/esl_msa_testfiles/phylip/phylip.bad.4 b/esl_msa_testfiles/phylip/phylip.bad.4
new file mode 100644
index 0000000..8694905
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.4
@@ -0,0 +1,3 @@
+ 2
+Turkey AAGCTNGGGC ATTTCAGGGT
+Salmo gairAAGCCTTGGC AGTGCAGGGT
diff --git a/esl_msa_testfiles/phylip/phylip.bad.5 b/esl_msa_testfiles/phylip/phylip.bad.5
new file mode 100644
index 0000000..0c95f98
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.5
@@ -0,0 +1,2 @@
+ 2 20
+
diff --git a/esl_msa_testfiles/phylip/phylip.bad.6 b/esl_msa_testfiles/phylip/phylip.bad.6
new file mode 100644
index 0000000..d988143
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.6
@@ -0,0 +1,3 @@
+ 2 20
+seq1
+seq2 ACDEFGHIKLMNPQRSTVWY
diff --git a/esl_msa_testfiles/phylip/phylip.bad.7 b/esl_msa_testfiles/phylip/phylip.bad.7
new file mode 100644
index 0000000..56d6f1a
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.7
@@ -0,0 +1,3 @@
+ 2 20
+ seq1_name ACDEFGHIKLMNPQRSTVWY
+seq2_name ACDEFGHIKLMNPQRSTVWY
diff --git a/esl_msa_testfiles/phylip/phylip.bad.8 b/esl_msa_testfiles/phylip/phylip.bad.8
new file mode 100644
index 0000000..fa9c9a1
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.8
@@ -0,0 +1,3 @@
+ 2 20
+seq1_name ACDEFGHIKLMNPQRSTVWY
+seq2_name ACDEFGHI~LMNPQRSTVWY
diff --git a/esl_msa_testfiles/phylip/phylip.bad.9 b/esl_msa_testfiles/phylip/phylip.bad.9
new file mode 100644
index 0000000..965cef4
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.bad.9
@@ -0,0 +1,3 @@
+ 2 20
+seq1_name ACDEFGHIKLMNPQRSTVWY
+seq2_name ACDEFGHIKLMNPQRSTVW
diff --git a/esl_msa_testfiles/phylip/phylip.good.1 b/esl_msa_testfiles/phylip/phylip.good.1
new file mode 100644
index 0000000..1bc5dad
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.good.1
@@ -0,0 +1,12 @@
+ 5 42
+Turkey AAGCTNGGGC ATTTCAGGGT
+Salmo gairAAGCCTTGGC AGTGCAGGGT
+H. SapiensACCGGTTGGC CGTTCAGGGT
+Chimp AAACCCTTGC CGTTACGCTT
+Gorilla AAACCCTTGC CGGTACGCTT
+
+GAGCCCGGGC AATACAGGGT AT
+GAGCCGTGGC CGGGCACGGT AT
+ACAGGTTGGC CGTTCAGGGT AA
+AAACCGAGGC CGGGACACTC AT
+AAACCATTGC CGGTACGCTT AA
diff --git a/esl_msa_testfiles/phylip/phylip.good.2 b/esl_msa_testfiles/phylip/phylip.good.2
new file mode 100644
index 0000000..b4015a4
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.good.2
@@ -0,0 +1,8 @@
+7 50
+thermotogaATGGCGAAGGAAAAATTTGTGAGAACAAAACCGCATGTTAACGTTGGAAC
+TthermophiATGGCGAAGGGCGAGTTTGTTCGGACGAAGCCTCACGTGAACGTGGGGAC
+TaquaticusATGGCGAAGGGCGAGTTTATCCGGACGAAGCCCCACGTGAACGTGGGGAC
+deinonema-ATGGCTAAGGGAACGTTTGAACGCACCAAACCCCACGTGAACGTGGGCAC
+ChlamydiaBATGTCAAAAGAAACTTTTCAACGTAATAAGCCTCATATCAACATAGGGGC
+flexistipsATGTCCAAGCAAAAGTACGAAAGGAAGAAACCTCACGTAAACGTAGGCAC
+borrelia-bATGGCAAAAGAAGTTTTTCAAAGAACAAAGCCGCACATGAATGTTGGAAC
diff --git a/esl_msa_testfiles/phylip/phylip.good.3 b/esl_msa_testfiles/phylip/phylip.good.3
new file mode 100644
index 0000000..b3d56ea
--- /dev/null
+++ b/esl_msa_testfiles/phylip/phylip.good.3
@@ -0,0 +1,28 @@
+ 3 384
+CYS1_DICDI -----MKVIL LFVLAVFTVF VSS------- --------RG IPPEEQ---- --------SQ
+ALEU_HORVU MAHARVLLLA LAVLATAAVA VASSSSFADS NPIRPVTDRA ASTLESAVLG ALGRTRHALR
+CATH_HUMAN ------MWAT LPLLCAGAWL LGV------- -PVCGAAELS VNSLEK---- --------FH
+
+ FLEFQDKFNK KY-SHEEYLE RFEIFKSNLG KIEELNLIAI NHKADTKFGV NKFADLSSDE
+ FARFAVRYGK SYESAAEVRR RFRIFSESLE EVRSTN---- RKGLPYRLGI NRFSDMSWEE
+ FKSWMSKHRK TY-STEEYHH RLQTFASNWR KINAHN---- NGNHTFKMAL NQFSDMSFAE
+
+ FKNYYLNNKE AIFTDDLPVA DYLDDEFINS IPTAFDWRTR G-AVTPVKNQ GQCGSCWSFS
+ FQATRL-GAA QTCSATLAGN HLMRDA--AA LPETKDWRED G-IVSPVKNQ AHCGSCWTFS
+ IKHKYLWSEP QNCSAT--KS NYLRGT--GP YPPSVDWRKK GNFVSPVKNQ GACGSCWTFS
+
+ TTGNVEGQHF ISQNKLVSLS EQNLVDCDHE CMEYEGEEAC DEGCNGGLQP NAYNYIIKNG
+ TTGALEAAYT QATGKNISLS EQQLVDCAGG FNNF------ --GCNGGLPS QAFEYIKYNG
+ TTGALESAIA IATGKMLSLA EQQLVDCAQD FNNY------ --GCQGGLPS QAFEYILYNK
+
+ GIQTESSYPY TAETGTQCNF NSANIGAKIS NFTMIP-KNE TVMAGYIVST GPLAIAADAV
+ GIDTEESYPY KGVNGV-CHY KAENAAVQVL DSVNITLNAE DELKNAVGLV RPVSVAFQVI
+ GIMGEDTYPY QGKDGY-CKF QPGKAIGFVK DVANITIYDE EAMVEAVALY NPVSFAFEVT
+
+ E-WQFYIGGV F-DIPCN--P NSLDHGILIV GYSAKNTIFR KNMPYWIVKN SWGADWGEQG
+ DGFRQYKSGV YTSDHCGTTP DDVNHAVLAV GYGVENGV-- ---PYWLIKN SWGADWGDNG
+ QDFMMYRTGI YSSTSCHKTP DKVNHAVLAV GYGEKNGI-- ---PYWIVKN SWGPQWGMNG
+
+ YIYLRRGKNT CGVSNFVSTS II--
+ YFKMEMGKNM CAIATCASYP VVAA
+ YFLIERGKNM CGLAACASYP IPLV
diff --git a/esl_msa_testfiles/phylips/phylips.good.1 b/esl_msa_testfiles/phylips/phylips.good.1
new file mode 100644
index 0000000..3c033d0
--- /dev/null
+++ b/esl_msa_testfiles/phylips/phylips.good.1
@@ -0,0 +1,11 @@
+ 5 42
+Turkey AAGCTNGGGC ATTTCAGGGT
+GAGCCCGGGC AATACAGGGT AT
+Salmo gairAAGCCTTGGC AGTGCAGGGT
+GAGCCGTGGC CGGGCACGGT AT
+H. SapiensACCGGTTGGC CGTTCAGGGT
+ACAGGTTGGC CGTTCAGGGT AA
+Chimp AAACCCTTGC CGTTACGCTT
+AAACCGAGGC CGGGACACTC AT
+Gorilla AAACCCTTGC CGGTACGCTT
+AAACCATTGC CGGTACGCTT AA
diff --git a/esl_msa_testfiles/phylips/phylips.good.2 b/esl_msa_testfiles/phylips/phylips.good.2
new file mode 100644
index 0000000..a7a7ea4
--- /dev/null
+++ b/esl_msa_testfiles/phylips/phylips.good.2
@@ -0,0 +1,17 @@
+ 3 384
+CYS1_DICDI-----MKVILLFVLAVFTVFVSS---------------RGIPPEEQ------------SQFLEFQDKFNKKY-SHEEY
+LERFEIFKSNLGKIEELNLIAINHKADTKFGVNKFADLSSDEFKNYYLNNKEAIFTDDLPVADYLDDEFINSIPTAFDWRTRG-AVTP
+VKNQGQCGSCWSFSTTGNVEGQHFISQNKLVSLSEQNLVDCDHECMEYEGEEACDEGCNGGLQPNAYNYIIKNGGIQTESSYPYTAET
+GTQCNFNSANIGAKISNFTMIP-KNETVMAGYIVSTGPLAIAADAVE-WQFYIGGVF-DIPCN--PNSLDHGILIVGYSAKNTIFRKN
+MPYWIVKNSWGADWGEQGYIYLRRGKNTCGVSNFVSTSII--
+ALEU_HORVUMAHARVLLLALAVLATAAVAVASSSSFADSNPIRPVTDRAASTLESAVLGALGRTRHALRFARFAVRYGKSYESAAEVR
+RRFRIFSESLEEVRSTN----RKGLPYRLGINRFSDMSWEEFQATRL-GAAQTCSATLAGNHLMRDA--AALPETKDWREDG-IVSPVK
+NQAHCGSCWTFSTTGALEAAYTQATGKNISLSEQQLVDCAGGFNNF--------GCNGGLPSQAFEYIKYNGGIDTEESYPYKGVNGV-
+CHYKAENAAVQVLDSVNITLNAEDELKNAVGLVRPVSVAFQVIDGFRQYKSGVYTSDHCGTTPDDVNHAVLAVGYGVENGV-----PYW
+LIKNSWGADWGDNGYFKMEMGKNMCAIATCASYPVVAA
+CATH_HUMAN------MWATLPLLCAGAWLLGV--------PVCGAAELSVNSLEK------------FHFKSWMSKHRKTY-STEEYH
+HRLQTFASNWRKINAHN----NGNHTFKMALNQFSDMSFAEIKHKYLWSEPQNCSAT--KSNYLRGT--GPYPPSVDWRKKGNFVSPVK
+NQGACGSCWTFSTTGALESAIAIATGKMLSLAEQQLVDCAQDFNNY--------GCQGGLPSQAFEYILYNKGIMGEDTYPYQGKDGY-
+CKFQPGKAIGFVKDVANITIYDEEAMVEAVALYNPVSFAFEVTQDFMMYRTGIYSSTSCHKTPDKVNHAVLAVGYGEKNGI-----PYW
+IVKNSWGPQWGMNGYFLIERGKNMCGLAACASYPIPLV
+
diff --git a/esl_msa_testfiles/psiblast/psiblast.good.1 b/esl_msa_testfiles/psiblast/psiblast.good.1
new file mode 100644
index 0000000..9ba424b
--- /dev/null
+++ b/esl_msa_testfiles/psiblast/psiblast.good.1
@@ -0,0 +1,14 @@
+MYG_PHYCA --------V-LSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRFKHLKT
+GLB5_PETMA pivdtgsvApLSAAEKTKIRSAWAPVYSTYETSGVDILVKFFTSTPAAQEFFPKFKGLTT
+HBB_HUMAN --------VhLTPEEKSAVTALWGKV--NVDEVGGEALGRLLVVYPWTQRFFESFGDLST
+HBA_HUMAN --------V-LSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHF-----
+
+MYG_PHYCA EAEMKASEDLKKHGVTVLTALGAILKKKGH---HEAELKPLAQSHATKHKIPIKYLEFIS
+GLB5_PETMA ADQLKKSADVRWHAERIINAVNDAVASMDDtekMSMKLRDLSGKHAKSFQVDPQYFKVLA
+HBB_HUMAN PDAVMGNPKVKAHGKKVLGAFSDGLAHLDN---LKGTFATLSELHCDKLHVDPENFRLLG
+HBA_HUMAN -DLSHGSAQVKGHGKKVADALTNAVAHVDD---MPNALSALSDLHAHKLRVDPVNFKLLS
+
+MYG_PHYCA EAIIHVLHSRHPGDFGADAQGAMNKALELFRKDIAAKYKELGYQG
+GLB5_PETMA AVI---------ADTVAAGDAGFEKLMSMICILLRSAY-------
+HBB_HUMAN NVLVCVLAHHFGKEFTPPVQAAYQKVVAGVANALAHKYH------
+HBA_HUMAN HCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR------
diff --git a/esl_msa_testfiles/psiblast/psiblast.good.2 b/esl_msa_testfiles/psiblast/psiblast.good.2
new file mode 100644
index 0000000..6b36b92
--- /dev/null
+++ b/esl_msa_testfiles/psiblast/psiblast.good.2
@@ -0,0 +1,11 @@
+tRNA2 UCCGAUAUAGUGUAACGGCUAUCACAUCACGCUUUCACCGUGG-AGACCGGGGUUCGACU
+tRNA3 UCCGUGAUAGUUUAAUGGUCAGAAUGG-GCGCUUGUCGCGUGCcAGAUCGGGGUUCAAUU
+tRNA5 GGGCACAUGGCGCAGUUGGUAGCGCGCUUCCCUUGCAAGGAAGaGGUCAUCGGUUCGAUU
+tRNA1 GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGaGGUCCUGUGUUCGAUC
+tRNA4 GCUCGUAUGGCGCAGUGG-UAGCGCAGCAGAUUGCAAAUCUGUuGGUCCUUAGUUCGAUC
+
+tRNA2 CCCCGUAUCGGAG
+tRNA3 CCCCGUCGCGGAG
+tRNA5 CCGGUUGCGUCCA
+tRNA1 CACAGAAUUCGCA
+tRNA4 CUGAGUGCGAGCU
diff --git a/esl_msa_testfiles/selex/00MANIFEST b/esl_msa_testfiles/selex/00MANIFEST
new file mode 100644
index 0000000..7269736
--- /dev/null
+++ b/esl_msa_testfiles/selex/00MANIFEST
@@ -0,0 +1,24 @@
+# in whole file in last alignment
+# ---------------- -----------------
+# nali nseq nres nseq nres
+# ---- ---- ---- ---- ----
+selex.good.1 eslOK amino 1 5 20 5 20
+selex.good.2 eslOK amino 1 5 40 5 40
+selex.good.3 eslOK amino 1 7 40 7 40
+#
+selex.bad.1 eslEOF /no alignment data found/
+selex.bad.2 eslEFORMAT /\(line 11\): expected \d+ lines/
+selex.bad.3 eslEFORMAT /\(line 1\): #=SS must follow/
+selex.bad.4 eslEFORMAT /\(line 4\): #=SA must follow/
+selex.bad.5 eslEFORMAT /\(line 7\): too many #=RF lines/
+selex.bad.6 eslEFORMAT /\(line 7\): too many #=CS lines/
+selex.bad.7 eslEFORMAT /\(line 7\): too many #=SS lines/
+selex.bad.8 eslEFORMAT /\(line 5\): too many #=SA lines/
+selex.bad.9 eslEFORMAT /\(line 8\): #=RF line isn't in expected order/
+selex.bad.10 eslEFORMAT /\(line 9\): #=CS line isn't in expected order/
+selex.bad.11 eslEFORMAT /\(line 9\): #=SS line isn't in expected order/
+selex.bad.12 eslEFORMAT /\(line 8\): #=SA line isn't in expected order/
+selex.bad.13 eslEFORMAT /\(line 11\): seq line isn't in expected order/
+selex.bad.14 eslEFORMAT /\(line 10\): expected seq \S+, saw/
+
+
diff --git a/esl_msa_testfiles/selex/selex.bad.1 b/esl_msa_testfiles/selex/selex.bad.1
new file mode 100644
index 0000000..b2d2ef5
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.1
@@ -0,0 +1,4 @@
+
+# No alignment data.
+# Should return EOF.
+
diff --git a/esl_msa_testfiles/selex/selex.bad.10 b/esl_msa_testfiles/selex/selex.bad.10
new file mode 100644
index 0000000..d1feae1
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.10
@@ -0,0 +1,16 @@
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+#=CS xxxxxxxxxxxxxxxxxxxx
+
+
+#=CS xxxxxxxxxxxxxxxxxxxx
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
+
diff --git a/esl_msa_testfiles/selex/selex.bad.11 b/esl_msa_testfiles/selex/selex.bad.11
new file mode 100644
index 0000000..fa41f71
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.11
@@ -0,0 +1,15 @@
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
+
diff --git a/esl_msa_testfiles/selex/selex.bad.12 b/esl_msa_testfiles/selex/selex.bad.12
new file mode 100644
index 0000000..3379697
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.12
@@ -0,0 +1,15 @@
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+#=SA xxxxxxxxxxxxxxxxxxxx
+
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
+
diff --git a/esl_msa_testfiles/selex/selex.bad.13 b/esl_msa_testfiles/selex/selex.bad.13
new file mode 100644
index 0000000..5e4ffee
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.13
@@ -0,0 +1,15 @@
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+seq5 ACDEFGHIKLMNPQRSTVWY
+
+
diff --git a/esl_msa_testfiles/selex/selex.bad.14 b/esl_msa_testfiles/selex/selex.bad.14
new file mode 100644
index 0000000..7caa449
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.14
@@ -0,0 +1,14 @@
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seqX ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
+
+
diff --git a/esl_msa_testfiles/selex/selex.bad.2 b/esl_msa_testfiles/selex/selex.bad.2
new file mode 100644
index 0000000..24a2e7c
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.2
@@ -0,0 +1,10 @@
+# Number of lines in each block must be the same.
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
diff --git a/esl_msa_testfiles/selex/selex.bad.3 b/esl_msa_testfiles/selex/selex.bad.3
new file mode 100644
index 0000000..ec6f25e
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.3
@@ -0,0 +1,7 @@
+#=SS xxxxxxxxxxxxxxxxxxxx
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
diff --git a/esl_msa_testfiles/selex/selex.bad.4 b/esl_msa_testfiles/selex/selex.bad.4
new file mode 100644
index 0000000..4123f4f
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.4
@@ -0,0 +1,10 @@
+#
+#
+
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
diff --git a/esl_msa_testfiles/selex/selex.bad.5 b/esl_msa_testfiles/selex/selex.bad.5
new file mode 100644
index 0000000..9f3064f
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.5
@@ -0,0 +1,11 @@
+#
+#
+
+#=RF xxxxxxxxxxxxxxxxxxxx
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+#=RF xxxxxxxxxxxxxxxxxxxx
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
diff --git a/esl_msa_testfiles/selex/selex.bad.6 b/esl_msa_testfiles/selex/selex.bad.6
new file mode 100644
index 0000000..74bff83
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.6
@@ -0,0 +1,8 @@
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+#=CS xxxxxxxxxxxxxxxxxxxx
+#=CS xxxxxxxxxxxxxxxxxxxx
+
diff --git a/esl_msa_testfiles/selex/selex.bad.7 b/esl_msa_testfiles/selex/selex.bad.7
new file mode 100644
index 0000000..71d2906
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.7
@@ -0,0 +1,12 @@
+seq1 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+seq2 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+seq3 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SS xxxxxxxxxxxxxxxxxxxx
+seq4 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+seq5 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+
diff --git a/esl_msa_testfiles/selex/selex.bad.8 b/esl_msa_testfiles/selex/selex.bad.8
new file mode 100644
index 0000000..dd7dad0
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.8
@@ -0,0 +1,8 @@
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+#=SA xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
diff --git a/esl_msa_testfiles/selex/selex.bad.9 b/esl_msa_testfiles/selex/selex.bad.9
new file mode 100644
index 0000000..2417eb0
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.bad.9
@@ -0,0 +1,14 @@
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+#=RF xxxxxxxxxxxxxxxxxxxx
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
+#=RF xxxxxxxxxxxxxxxxxxxx
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+
diff --git a/esl_msa_testfiles/selex/selex.good.1 b/esl_msa_testfiles/selex/selex.good.1
new file mode 100644
index 0000000..6e970ee
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.good.1
@@ -0,0 +1,5 @@
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
diff --git a/esl_msa_testfiles/selex/selex.good.2 b/esl_msa_testfiles/selex/selex.good.2
new file mode 100644
index 0000000..db72a72
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.good.2
@@ -0,0 +1,37 @@
+# DOS format (\r\n), and doesn't end in a newline.
+#
+#=RF xxxxxxxxxxxxxxxxxxxx
+#=CS xxxxxxxxxxxxxxxxxxxx
+seq1 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq2 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq3 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq4 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq5 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
+
+#=RF xxxxxxxxxxxxxxxxxxxx
+#=CS xxxxxxxxxxxxxxxxxxxx
+seq1 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq2 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq3 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq4 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
+seq5 ACDEFGHIKLMNPQRSTVWY
+#=SS xxxxxxxxxxxxxxxxxxxx
+#=SA xxxxxxxxxxxxxxxxxxxx
\ No newline at end of file
diff --git a/esl_msa_testfiles/selex/selex.good.3 b/esl_msa_testfiles/selex/selex.good.3
new file mode 100644
index 0000000..0facbd5
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.good.3
@@ -0,0 +1,27 @@
+
+#=CS
+#=RF
+seq1 ACDEFGHIKLMNPQRSTVWY
+long_name GHIKLMNPQRSTVWY
+blank_seq_all_gaps
+seq2 ACDEF---KLMNPQRSTVWY
+seq3 ACDEF...KLMNPQRSTVWY
+# embedded comments ok
+seq4 ACDEFGHIKLMNPQRSTVWY
+ seq5 CDEFGHIKLMNPQRSTVWY
+#=SS
+#=SA
+
+
+
+#=CS
+#=RF
+seq1 ACDEFGHIKLMNPQRSTVWY
+long_name GHIKLMNPQRSTVWY
+blank_seq_all_gaps
+seq2 ACDEFGHIKLMNPQRSTVWY
+seq3 ACDEFGHIKLMNPQRSTVWY
+seq4 ACDEFGHIKLMNPQRSTVWY
+seq5 ACDEFGHIKLMNPQRSTVWY
+#=SS
+#=SA
\ No newline at end of file
diff --git a/esl_msa_testfiles/selex/selex.good.4 b/esl_msa_testfiles/selex/selex.good.4
new file mode 100644
index 0000000..199b6f0
--- /dev/null
+++ b/esl_msa_testfiles/selex/selex.good.4
@@ -0,0 +1,19 @@
+# A complicated SELEX example
+# SRE, Tue Dec 1 19:17:48 1998
+
+
+#=RF xxxxxxx xxxx xxxxxx
+#=CS >>>>+>> ^^^^ <<<<<<
+28 gGAGUAAGAUAGC AUCA GCAUCUUGUUCC
+#=SS +++++>>>>>+>> ^^^^ <<<<<<<+++++
+longname GUUCACC AUCA GGGGAc
+#=SS >>>>+>> ^^^^ <<<<<<
+2 AUGGAUGCGCACC AUCA GGGCGUaucuau
+3 GAUCACC AUCA GGGauc
+4 GGUCACC AUCA GGGauc
+5 GGACACC AUCA GGGucu
+6 CACC AUCA GGG
+7 GAUCACC AUCA GGGauc
+8 CUCACC AUCA GGGGG
+9 AUGCACC AUCA GGGCAU
+10 CUCACC AUCA GGGGG
diff --git a/esl_msa_testfiles/stockholm/stockholm.bad.1 b/esl_msa_testfiles/stockholm/stockholm.bad.1
new file mode 100644
index 0000000..ea254db
--- /dev/null
+++ b/esl_msa_testfiles/stockholm/stockholm.bad.1
@@ -0,0 +1 @@
+missing Stockholm header
diff --git a/esl_msa_testfiles/stockholm/stockholm.bad.2 b/esl_msa_testfiles/stockholm/stockholm.bad.2
new file mode 100644
index 0000000..73d9112
--- /dev/null
+++ b/esl_msa_testfiles/stockholm/stockholm.bad.2
@@ -0,0 +1,7 @@
+# STOCKHOLM 1.0
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+//
diff --git a/esl_msa_testfiles/stockholm/stockholm.bad.3 b/esl_msa_testfiles/stockholm/stockholm.bad.3
new file mode 100644
index 0000000..af46199
--- /dev/null
+++ b/esl_msa_testfiles/stockholm/stockholm.bad.3
@@ -0,0 +1,7 @@
+# STOCKHOLM 1.0
+
+#=GS seq1 FOO baz
+#=GS seq2 FOO boz
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+//
diff --git a/esl_msa_testfiles/stockholm/stockholm.bad.4 b/esl_msa_testfiles/stockholm/stockholm.bad.4
new file mode 100644
index 0000000..28a3913
--- /dev/null
+++ b/esl_msa_testfiles/stockholm/stockholm.bad.4
@@ -0,0 +1,4 @@
+# STOCKHOLM 1.0
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
diff --git a/esl_msa_testfiles/stockholm/stockholm.bad.5 b/esl_msa_testfiles/stockholm/stockholm.bad.5
new file mode 100644
index 0000000..752b318
--- /dev/null
+++ b/esl_msa_testfiles/stockholm/stockholm.bad.5
@@ -0,0 +1,4 @@
+# STOCKHOLM 1.0
+
+# No data
+//
diff --git a/esl_msa_testfiles/stockholm/stockholm.bad.6 b/esl_msa_testfiles/stockholm/stockholm.bad.6
new file mode 100644
index 0000000..bf8e3d5
--- /dev/null
+++ b/esl_msa_testfiles/stockholm/stockholm.bad.6
@@ -0,0 +1,7 @@
+# STOCKHOLM 1.0
+
+#=GF
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+//
diff --git a/esl_msa_testfiles/stockholm/stockholm.bad.7 b/esl_msa_testfiles/stockholm/stockholm.bad.7
new file mode 100644
index 0000000..a54e227
--- /dev/null
+++ b/esl_msa_testfiles/stockholm/stockholm.bad.7
@@ -0,0 +1,7 @@
+# STOCKHOLM 1.0
+
+#=GFX tag
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+seq2 ACDEFGHIKLMNPQRSTVWY
+//
diff --git a/esl_msa_testfiles/stockholm/stockholm.bad.8 b/esl_msa_testfiles/stockholm/stockholm.bad.8
new file mode 100644
index 0000000..e5c0636
--- /dev/null
+++ b/esl_msa_testfiles/stockholm/stockholm.bad.8
@@ -0,0 +1,5 @@
+# STOCKHOLM 1.0
+#=GF ID
+
+seq1 ACDEFGHIKLMNPQRSTVWY
+//
diff --git a/esl_msa_testfiles/stockholm/stockholm.good.1 b/esl_msa_testfiles/stockholm/stockholm.good.1
new file mode 100644
index 0000000..557e59c
--- /dev/null
+++ b/esl_msa_testfiles/stockholm/stockholm.good.1
@@ -0,0 +1,96 @@
+# STOCKHOLM 1.0
+#
+# This is an example of a Stockholm multiple sequence alignment
+# file. It is deliberately designed to be weird, to exercise many of the
+# features of Stockholm format, in order to test a parser.
+#
+#=GF ID 14-3-3
+#=GF AC PF00244
+#=GF DE 14-3-3 proteins
+#=GF AU Finn RD
+#=GF AL Clustalw
+#=GF SE Prosite
+#=GF GA 25 25
+#=GF TC 35.40 35.40
+#=GF NC 8.80 8.80
+#=GF BM hmmbuild -f HMM SEED
+#=GF BM hmmcalibrate --seed 0 HMM
+#=GF RN [1]
+#=GF RM 95327195
+#=GF RT Structure of a 14-3-3 protein and implications for
+#=GF RT coordination of multiple signalling pathways.
+#=GF RA Xiao B, Smerdon SJ, Jones DH, Dodson GG, Soneji Y, Aitken
+#=GF RA A, Gamblin SJ;
+#=GF RL Nature 1995;376:188-191.
+#=GF RN [2]
+#=GF RM 95327196
+#=GF RT Crystal structure of the zeta isoform of the 14-3-3
+#=GF RT protein.
+#=GF RA Liu D, Bienkowska J, Petosa C, Collier RJ, Fu H, Liddington
+#=GF RA R;
+#=GF RL Nature 1995;376:191-194.
+#=GF DR PROSITE; PDOC00633;
+#=GF DR SMART; 14_3_3;
+#=GF DR PRINTS; PR00305;
+#=GF SQ 119
+
+#=GS 1431_ENTHI/4-239 WT 0.42
+#=GS seq1 WT 0.40
+#=GS seq2 WT 0.41
+#=GS seq3 WT 0.43
+#=GS seq4 WT 0.44
+#=GS seq5 WT 0.45
+#=GS seq6 WT 0.46
+
+#=GS seq4 AC PF00001
+#=GS seq4 DE A description of seq4.
+
+#=GS seq1 NEWTAG foo
+#=GS seq2 NEWTAG bar
+#=GS seq3 NEWTAG baz
+
+#=GS seq3 TAG2 foo2
+#=GS seq4 TAG2 foo3
+#=GS seq5 TAG2 foo4
+
+#=GC SS_cons xxxxxxxxxxxxxxxxxxx
+#=GC SA_cons xxxxxxxxxxxxxxxxxxx
+#=GC New_long_tag_thingie xxxxxxxxxxxxxxxxxxx
+1431_ENTHI/4-239 ACDEFGHKLMNPQRSTVWY
+#=GR seq1 SS ...................
+#=GR seq1 SA 0000000000000000000
+seq1 ACDEFGHKLMNPQRSTVWY
+seq2 ACDEFGHKLMNPQRSTVWY
+seq3 ACDEFGHKLMNPQRSTVWY
+seq4 ACDEFGHKLMNPQRSTVWY
+seq5 ACDEFGHKLMNPQRSTVWY
+seq6 ACDEFGHKLMNPQRSTVWY
+#=GR seq6 SS ...................
+#=GR seq6 SA 9999999999999999999
+#=GR seq6 Invented_tag *******************
+#=GR seq6 Another_tag -------------------
+
+
+#=GC SS_cons xxxxxxxxxxxxxxxxxxx
+#=GC SA_cons xxxxxxxxxxxxxxxxxxx
+#=GC New_long_tag_thingie xxxxxxxxxxxxxxxxxxx
+1431_ENTHI/4-239 ACDEFGHKLMNPQRSTVWY
+#=GR seq1 SS ...................
+#=GR seq1 SA 0000000000000000000
+seq1 ACDEFGHKLMNPQRSTVWY
+seq2 ACDEFGHKLMNPQRSTVWY
+seq3 ACDEFGHKLMNPQRSTVWY
+seq4 ACDEFGHKLMNPQRSTVWY
+seq5 ACDEFGHKLMNPQRSTVWY
+seq6 ACDEFGHKLMNPQRSTVWY
+#=GR seq6 SS ...................
+#=GR seq6 SA 9999999999999999999
+#=GR seq6 Invented_tag *******************
+#=GR seq6 Another_tag -------------------
+
+#
+# And here's some trailing comments, just to
+# try to confuse a parser.
+#
+
+//
\ No newline at end of file
diff --git a/esl_msacluster.c b/esl_msacluster.c
new file mode 100644
index 0000000..e9e9aca
--- /dev/null
+++ b/esl_msacluster.c
@@ -0,0 +1,430 @@
+/* Clustering sequences in an MSA by % identity.
+ *
+ * Table of contents:
+ * 1. Single linkage clustering an MSA by %id
+ * 2. Internal functions, interface to the clustering API
+ * 3. Some internal functions needed for regression tests
+ * 4. Unit tests
+ * 5. Test driver
+ * 6. Example
+ * 7. Copyright and license.
+ *
+ * Augmentations:
+ * eslAUGMENT_ALPHABET: adds support for digital MSAs
+ *
+ * (Wondering why isn't this just part of the cluster or MSA modules?
+ * esl_cluster itself is a core module, dependent only on easel. MSA
+ * clustering involves at least the distance, cluster, and msa
+ * modules. We're better off separating its functionality away into a
+ * more highly derived module.)
+ */
+#include "esl_config.h"
+
+#include "easel.h"
+#include "esl_cluster.h"
+#include "esl_distance.h"
+#include "esl_msa.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#include "esl_msacluster.h"
+
+/* These functions are going to get defined in an internal regression
+ * testing section further below:
+ */
+#if defined(eslMSACLUSTER_REGRESSION) || defined(eslMSAWEIGHT_REGRESSION)
+#include <ctype.h>
+static double squid_distance(char *s1, char *s2);
+#ifdef eslAUGMENT_ALPHABET
+static double squid_xdistance(ESL_ALPHABET *a, ESL_DSQ *x1, ESL_DSQ *x2);
+#endif
+#endif
+
+/* These functions will define linkage between a pair of text or
+ * digital aseq's:
+ */
+static int msacluster_clinkage(const void *v1, const void *v2, const void *p, int *ret_link);
+#ifdef eslAUGMENT_ALPHABET
+static int msacluster_xlinkage(const void *v1, const void *v2, const void *p, int *ret_link);
+#endif
+
+/* In digital mode, we'll need to pass the clustering routine two parameters -
+ * %id threshold and alphabet ptr - so make a structure that bundles them.
+ */
+#ifdef eslAUGMENT_ALPHABET
+struct msa_param_s {
+ double maxid;
+ ESL_ALPHABET *abc;
+};
+#endif
+
+
+/*****************************************************************
+ * 1. Single linkage clustering an MSA by %id
+ *****************************************************************/
+
+/* Function: esl_msacluster_SingleLinkage()
+ * Synopsis: Single linkage clustering by percent identity.
+ * Incept: SRE, Sun Nov 5 10:11:45 2006 [Janelia]
+ *
+ * Purpose: Perform single link clustering of the sequences in
+ * multiple alignment <msa>. Any pair of sequences with
+ * percent identity $\geq$ <maxid> are linked (using
+ * the definition from the \eslmod{distance} module).
+ *
+ * The resulting clustering is optionally returned in one
+ * or more of <opt_c>, <opt_nin>, and <opt_nc>. The
+ * <opt_c[0..nseq-1]> array assigns a cluster index
+ * <(0..nc-1)> to each sequence. For example, <c[4] = 1>
+ * means that sequence 4 is assigned to cluster 1. The
+ * <opt_nin[0..nc-1]> array is the number of sequences
+ * in each cluster. <opt_nc> is the number of clusters.
+ *
+ * Importantly, this algorithm runs in $O(N)$ memory, and
+ * produces one discrete clustering. Compare to
+ * <esl_tree_SingleLinkage()>, which requires an $O(N^2)$
+ * adjacency matrix, and produces a hierarchical clustering
+ * tree.
+ *
+ * The algorithm is worst case $O(LN^2)$ time, for $N$
+ * sequences of length $L$. However, the worst case is no
+ * links at all, and this is unusual. More typically, time
+ * scales as about $LN \log N$. The best case scales as
+ * $LN$, when there is just one cluster in a completely
+ * connected graph.
+ *
+ * Args: msa - multiple alignment to cluster
+ * maxid - pairwise identity threshold: cluster if $\geq$ <maxid>
+ * opt_c - optRETURN: cluster assignments for each sequence, [0..nseq-1]
+ * opt_nin - optRETURN: number of seqs in each cluster, [0..nc-1]
+ * opt_nc - optRETURN: number of clusters
+ *
+ * Returns: <eslOK> on success; the <opt_c[0..nseq-1]> array contains
+ * cluster indices <0..nc-1> assigned to each sequence; the
+ * <opt_nin[0..nc-1]> array contains the number of seqs in
+ * each cluster; and <opt_nc> contains the number of
+ * clusters. The <opt_c> array and <opt_nin> arrays will be
+ * allocated here, if non-<NULL>, and must be free'd by the
+ * caller. The input <msa> is unmodified.
+ *
+ * The caller may pass <NULL> for either <opt_c> or
+ * <opt_nc> if it is only interested in one of the two
+ * results.
+ *
+ * Throws: <eslEMEM> on allocation failure, and <eslEINVAL> if a pairwise
+ * comparison is invalid (which means the MSA is corrupted, so it
+ * shouldn't happen). In either case, <opt_c> and <opt_nin> are set to <NULL>
+ * and <opt_nc> is set to 0, and the <msa> is unmodified.
+ */
+int
+esl_msacluster_SingleLinkage(const ESL_MSA *msa, double maxid,
+ int **opt_c, int **opt_nin, int *opt_nc)
+
+{
+ int status;
+ int *workspace = NULL;
+ int *assignment = NULL;
+ int *nin = NULL;
+ int nc;
+ int i;
+#ifdef eslAUGMENT_ALPHABET
+ struct msa_param_s param;
+#endif
+
+ /* Allocations */
+ ESL_ALLOC(workspace, sizeof(int) * msa->nseq * 2);
+ ESL_ALLOC(assignment, sizeof(int) * msa->nseq);
+
+ /* call to SLC API: */
+ if (! (msa->flags & eslMSA_DIGITAL))
+ status = esl_cluster_SingleLinkage((void *) msa->aseq, (size_t) msa->nseq, sizeof(char *),
+ msacluster_clinkage, (void *) &maxid,
+ workspace, assignment, &nc);
+#ifdef eslAUGMENT_ALPHABET
+ else {
+ param.maxid = maxid;
+ param.abc = msa->abc;
+ status = esl_cluster_SingleLinkage((void *) msa->ax, (size_t) msa->nseq, sizeof(ESL_DSQ *),
+ msacluster_xlinkage, (void *) ¶m,
+ workspace, assignment, &nc);
+ }
+#endif
+ if (status != eslOK) goto ERROR;
+
+
+ if (opt_nin != NULL)
+ {
+ ESL_ALLOC(nin, sizeof(int) * nc);
+ for (i = 0; i < nc; i++) nin[i] = 0;
+ for (i = 0; i < msa->nseq; i++)
+ nin[assignment[i]]++;
+ *opt_nin = nin;
+ }
+
+ /* cleanup and return */
+ free(workspace);
+ if (opt_c != NULL) *opt_c = assignment; else free(assignment);
+ if (opt_nc != NULL) *opt_nc = nc;
+ return eslOK;
+
+ ERROR:
+ if (workspace != NULL) free(workspace);
+ if (assignment != NULL) free(assignment);
+ if (nin != NULL) free(nin);
+ if (opt_c != NULL) *opt_c = NULL;
+ if (opt_nc != NULL) *opt_nc = 0;
+ return status;
+}
+
+
+
+
+
+/*****************************************************************
+ * 2. Internal functions, interface to the clustering API
+ *****************************************************************/
+
+/* Definition of %id linkage in text-mode aligned seqs (>= maxid): */
+static int
+msacluster_clinkage(const void *v1, const void *v2, const void *p, int *ret_link)
+{
+ char *as1 = *(char **) v1;
+ char *as2 = *(char **) v2;
+ double maxid = *(double *) p;
+ double pid;
+ int status = eslOK;
+
+#if defined(eslMSACLUSTER_REGRESSION) || defined(eslMSAWEIGHT_REGRESSION)
+ pid = 1. - squid_distance(as1, as2);
+#else
+ if ((status = esl_dst_CPairId(as1, as2, &pid, NULL, NULL)) != eslOK) return status;
+#endif
+
+ *ret_link = (pid >= maxid ? TRUE : FALSE);
+ return status;
+}
+
+/* Definition of % id linkage in digital aligned seqs (>= maxid) */
+#ifdef eslAUGMENT_ALPHABET
+static int
+msacluster_xlinkage(const void *v1, const void *v2, const void *p, int *ret_link)
+{
+ ESL_DSQ *ax1 = *(ESL_DSQ **) v1;
+ ESL_DSQ *ax2 = *(ESL_DSQ **) v2;
+ struct msa_param_s *param = (struct msa_param_s *) p;
+ double pid;
+ int status = eslOK;
+
+#if defined(eslMSACLUSTER_REGRESSION) || defined(eslMSAWEIGHT_REGRESSION)
+ pid = 1. - squid_xdistance(param->abc, ax1, ax2);
+#else
+ if ( (status = esl_dst_XPairId(param->abc, ax1, ax2, &pid, NULL, NULL)) != eslOK) return status;
+#endif
+
+ *ret_link = (pid >= param->maxid ? TRUE : FALSE);
+ return status;
+}
+#endif
+
+
+
+
+/*****************************************************************
+ * 3. Some internal functions needed for regression tests
+ *****************************************************************/
+
+/* When regression testing against squid, we have to replace
+ * Easel's distance calculations with a simpler, (even) less robust
+ * calculation that squid did.
+ */
+#if defined(eslMSACLUSTER_REGRESSION) || defined(eslMSAWEIGHT_REGRESSION)
+static double
+squid_distance(char *s1, char *s2)
+{
+ int diff = 0;
+ int valid = 0;
+
+ for (; *s1 != '\0'; s1++, s2++)
+ {
+ if (!isalpha(*s1) || !isalpha(*s2)) continue;
+ if (*s1 != *s2) diff++;
+ valid++;
+ }
+ return (valid > 0 ? ((double) diff / (double) valid) : 0.0);
+}
+#ifdef eslAUGMENT_ALPHABET
+static double
+squid_xdistance(ESL_ALPHABET *a, ESL_DSQ *x1, ESL_DSQ *x2)
+{
+ int diff = 0;
+ int valid = 0;
+
+ for (; *x1 != eslDSQ_SENTINEL; x1++, x2++)
+ {
+ if (esl_abc_XIsGap(a, *x1) || esl_abc_XIsGap(a, *x2)) continue;
+ if (*x1 != *x2) diff++;
+ valid++;
+ }
+ return (valid > 0 ? ((double) diff / (double) valid) : 0.0);
+}
+#endif
+#endif /* eslMSACLUSTER_REGRESSION || eslMSAWEIGHT_REGRESSION */
+
+
+/*****************************************************************
+ * 4. Unit tests
+ *****************************************************************/
+#ifdef eslMSACLUSTER_TESTDRIVE
+#include "esl_getopts.h"
+
+static void
+utest_SingleLinkage(ESL_GETOPTS *go, const ESL_MSA *msa, double maxid, int expected_nc, int last_assignment)
+{
+ char *msg = "utest_SingleLinkage() failed";
+ int *assignment = NULL;
+ int *nin = NULL;
+ int nc;
+
+ if (esl_msacluster_SingleLinkage(msa, maxid, &assignment, &nin, &nc) != eslOK) esl_fatal(msg);
+ if (nc != expected_nc) esl_fatal(msg);
+ if (assignment[msa->nseq-1] != last_assignment) esl_fatal(msg);
+ free(assignment);
+ free(nin);
+}
+#endif /*eslMSACLUSTER_TESTDRIVE*/
+
+/*****************************************************************
+ * 5. Test driver
+ *****************************************************************/
+#ifdef eslMSACLUSTER_TESTDRIVE
+/* gcc -g -Wall -o msacluster_utest -I. -L. -DeslMSACLUSTER_TESTDRIVE esl_msacluster.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msacluster.h"
+#include "esl_msafile.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for msacluster module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslAMINO);
+ ESL_MSA *msa = esl_msa_CreateFromString("\
+# STOCKHOLM 1.0\n\
+\n\
+seq0 AAAAAAAAAA\n\
+seq1 AAAAAAAAAA\n\
+seq2 AAAAAAAAAC\n\
+seq3 AAAAAAAADD\n\
+seq4 AAAAAAAEEE\n\
+seq5 AAAAAAFFFF\n\
+seq6 AAAAAGGGGG\n\
+seq7 AAAAHHHHHH\n\
+seq8 AAAIIIIIII\n\
+seq9 AAKKKKKKKK\n\
+seq10 ALLLLLLLLL\n\
+seq11 MMMMMMMMMM\n\
+//", eslMSAFILE_STOCKHOLM);
+
+
+ utest_SingleLinkage(go, msa, 1.0, 11, 10); /* at 100% id, only seq0/seq1 cluster */
+ utest_SingleLinkage(go, msa, 0.5, 6, 5); /* at 50% id, seq0-seq6 cluster */
+ utest_SingleLinkage(go, msa, 0.0, 1, 0); /* at 0% id, everything clusters */
+
+ /* Do the same tests, but now with a digital MSA */
+ esl_msa_Digitize(abc, msa, NULL);
+ utest_SingleLinkage(go, msa, 1.0, 11, 10); /* at 100% id, only seq0/seq1 cluster */
+ utest_SingleLinkage(go, msa, 0.5, 6, 5); /* at 50% id, seq0-seq6 cluster */
+ utest_SingleLinkage(go, msa, 0.0, 1, 0); /* at 0% id, everything clusters */
+
+ esl_msa_Destroy(msa);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /* eslMSACLUSTER_TESTDRIVE*/
+
+
+
+
+/*****************************************************************
+ * 6. Example
+ *****************************************************************/
+
+#ifdef eslMSACLUSTER_EXAMPLE
+/*::cexcerpt::msacluster_example::begin::*/
+/*
+ gcc -g -Wall -o msacluster_example -I. -L. -DeslMSACLUSTER_EXAMPLE esl_msacluster.c -leasel -lm
+ ./msacluster_example <MSA file>
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msacluster.h"
+#include "esl_msafile.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int fmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ double maxid = 0.62; /* cluster at 62% identity: the BLOSUM62 rule */
+ int *assignment = NULL;
+ int *nin = NULL;
+ int nclusters;
+ int c, i;
+ int status;
+
+ /* Open; guess alphabet; set to digital mode */
+ if ((status = esl_msafile_Open(&abc, filename, NULL, fmt, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+ /* read one alignment */
+ if ((status = esl_msafile_Read(afp, &msa)) != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+
+ /* do the clustering */
+ esl_msacluster_SingleLinkage(msa, maxid, &assignment, &nin, &nclusters);
+
+ printf("%d clusters at threshold of %f fractional identity\n", nclusters, maxid);
+ for (c = 0; c < nclusters; c++) {
+ printf("cluster %d:\n", c);
+ for (i = 0; i < msa->nseq; i++) if (assignment[i] == c) printf(" %s\n", msa->sqname[i]);
+ printf("(%d sequences)\n\n", nin[c]);
+ }
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ free(assignment);
+ free(nin);
+ return 0;
+}
+/*::cexcerpt::msacluster_example::end::*/
+#endif /*eslMSACLUSTER_EXAMPLE*/
+/*------------------------ end of example -----------------------*/
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
diff --git a/esl_msacluster.h b/esl_msacluster.h
new file mode 100644
index 0000000..6121dd0
--- /dev/null
+++ b/esl_msacluster.h
@@ -0,0 +1,18 @@
+/* Clustering sequences in an MSA by % identity.
+ *
+ */
+#ifndef eslMSACLUSTER_INCLUDED
+#define eslMSACLUSTER_INCLUDED
+
+#include "esl_msa.h"
+
+extern int esl_msacluster_SingleLinkage(const ESL_MSA *msa, double maxid,
+ int **opt_c, int **opt_nin, int *opt_nc);
+
+#endif /*eslMSACLUSTER_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_msacluster.tex b/esl_msacluster.tex
new file mode 100644
index 0000000..2035b58
--- /dev/null
+++ b/esl_msacluster.tex
@@ -0,0 +1,33 @@
+The \eslmod{msacluster} module implements single linkage clustering by
+sequence identity for the sequences in a multiple sequence
+alignment. The API is summarized in Table~\ref{tbl:msacluster_api}.
+
+Clustering is done using the generalized single linkage clustering
+algorithm in the \eslmod{cluster} module.
+
+\eslmod{msacluster} requires the \eslmod{cluster}, \eslmod{distance},
+and \eslmod{msa} and \eslmod{distance} modules. It can be augmented
+with the \eslmod{alphabet} module, which adds the ability to deal with
+digitized MSAs.
+
+% Table generated by autodoc -t esl_msacluster.c (so don't edit here, edit esl_msacluster.c:)
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\hyperlink{func:esl_msacluster_SingleLinkage()}{\ccode{esl\_msacluster\_SingleLinkage()}} & Single linkage clustering by percent identity.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{msacluster} API.}
+\label{tbl:msacluster_api}
+\end{table}
+
+\subsection{Example of using the msacluster API}
+
+An example of reading an MSA from a file and doing
+single-linkage-clustering on the aligned sequences at $\geq$ 62\%
+sequence identity:
+
+\input{cexcerpts/msacluster_example}
diff --git a/esl_msafile.c b/esl_msafile.c
new file mode 100644
index 0000000..b567697
--- /dev/null
+++ b/esl_msafile.c
@@ -0,0 +1,1492 @@
+/* Multiple sequence alignment file i/o
+ *
+ * Table of contents:
+ * 1. Opening/closing an ESL_MSAFILE.
+ * 2. ESL_MSAFILE_FMTDATA: optional added constraints on formats.
+ * 3. Guessing file formats.
+ * 4. Guessing alphabets.
+ * 5. Random MSA flatfile access. [augmentation: ssi]
+ * 6. Reading an MSA from an ESL_MSAFILE.
+ * 7. Writing an MSA to a stream.
+ * 8. Utilities used by specific format parsers.
+ * 9. Unit tests.
+ * 10. Test driver.
+ * 11. Examples.
+ * 12. Copyright and license.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_mem.h"
+#include "esl_msafile.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+
+
+
+
+/*****************************************************************
+ *# 1. Opening/closing an ESL_MSAFILE
+ *****************************************************************/
+
+static int msafile_Create (ESL_MSAFILE **ret_afp);
+static int msafile_OpenBuffer(ESL_ALPHABET **byp_abc, ESL_BUFFER *bf, int format, ESL_MSAFILE_FMTDATA *fmtd, ESL_MSAFILE *afp);
+
+/* Function: esl_msafile_Open()
+ * Synopsis: Open a multiple sequence alignment file for input.
+ *
+ * Purpose: Open a multiple sequence alignment file <msafile> for input.
+ * Return an open <ESL_MSAFILE> handle in <*ret_afp>.
+ *
+ * <msafile> is usually the name of a file. Alignments may
+ * also be read from standard input, or from
+ * gzip-compressed files. If <msafile> is ``-'', alignment
+ * input is taken from the standard input stream. If
+ * <msafile> ends in ``.gz'', alignment input is read
+ * through a pipe from <gzip -dc>.
+ *
+ * <byp_abc>, <env>, <format>, and <fmtd> support a variety
+ * of optional/advanced operations, as described
+ * below. Minimally, a caller can set <byp_abc> to <NULL>,
+ * <format> to <eslMSAFILE_UNKNOWN>, and <fmtd> to <NULL>,
+ * and <msafile> will be opened in text mode; in the
+ * current working directory; and its format will be
+ * autodetected.
+ *
+ * The <byp_abc> argument controls whether data are to be
+ * read in text or digital mode. In digital mode, alignment
+ * data are immediately digitized into an Easel internal
+ * alphabet (which among other things, allows various
+ * things to operate on sequence data more efficiently) and
+ * because an expected alphabet is known, parsers are able
+ * to detect invalid characters. The caller may either
+ * provide an alphabet (thus asserting what it's expected
+ * to be), or have <esl_msafile_Open()> look at the file
+ * and guess what alphabet it appears to be (DNA or amino
+ * acid code, usually). In text mode, alignment data are
+ * read verbatim. It might be advantageous for an
+ * application to read in text mode -- for example, if a
+ * variant alignment format is using characters in some
+ * special way, and you need to deal with them specially.
+ * All this goes through the setting of the passed-by-reference
+ * alphabet pointer <byp_abc>. If caller passes NULL for
+ * the <byp_abc> argument, input is in text mode. If caller
+ * provides a valid non-NULL <byp_abc> pointer but
+ * <*byp_abc> is NULL (that is, caller has declared
+ * <ESL_ALPHABET *abc = NULL> and passed <&abc> as an
+ * argument), then we attempt to guess the digital alphabet
+ * using <esl_msafile_GuessAlphabet()>, based on the first
+ * alignment in the input. In this case, the new alphabet
+ * is allocated here and returned to the caller. If caller
+ * provides a digital alphabet (that is, <ESL_ALPHABET *abc
+ * = esl_alphabet_Create...()> and passed <&abc>), that's
+ * the alphabet we use.
+ *
+ * The <env> argument controls where we search for the
+ * <msafile>. If <env> is <NULL>, only the current working
+ * directory is checked. Optionally, caller can provide in
+ * <env> the name of an environment variable ("PFAMDB",
+ * perhaps), in which the routine can find a
+ * colon-delimited list of directories. Then, if <msafile>
+ * is not found in the current working directory, we look
+ * for it in these directories, in the order they're
+ * listed.
+ *
+ * The <format> argument allows the caller to either allow
+ * <esl_msafile_Open()> to autodetect the file format of
+ * <msafile>, or to assert that it knows the file is in a
+ * particular format. If <format> is <eslMSAFILE_UNKNOWN>,
+ * format autodetection is performed. Other valid codes include:
+ * | <eslMSAFILE_STOCKHOLM> | Stockholm format |
+ * | <eslMSAFILE_AFA> | Aligned FASTA format |
+ * | <eslMSAFILE_CLUSTAL> | Clustal format (strict) |
+ * | <eslMSAFILE_CLUSTALLIKE> | Clustal-like (MUSCLE, PROBCONS...) |
+ * | <eslMSAFILE_PHYLIP> | PHYLIP interleaved format |
+ * | <eslMSAFILE_PHYLIPS> | PHYLIP sequential format |
+ * | <eslMSAFILE_A2M> | UCSC SAM A2M (dotless or dotful) |
+ * | <eslMSAFILE_PSIBLAST> | NCBI PSI-BLAST |
+ * | <eslMSAFILE_SELEX> | a general alignment block format |
+ *
+ * The <fmtd> argument is an optional pointer to a
+ * <ESL_MSAFILE_FMTDATA> structure that the caller may
+ * initialize and provide, in order to assert any
+ * additional unusual constraints on the input format --
+ * for example, to dictate that a PHYLIP format file must
+ * have some nonstandard name field width. Generally,
+ * though, <fmtd> will be <NULL>, and such things would
+ * either be autodetected as part of the autodetected
+ * format, or the strict version of the parser will be
+ * used. (That is, if you open a PHYLIP file with
+ * <format=eslMSAFILE_UNKNOWN> and a <NULL fmtd>, the
+ * format autodetector is used, and it will automagically
+ * detect nonstandard PHYLIP namewidths != 10. But if you
+ * open a PHYLIP file with <format=eslMSAFILE_PHYLIP> and a
+ * <NULL fmtd>, then you get the strict interleaved PHYLIP
+ * parser, which requires a name width of exactly 10.)
+ *
+ * Args: byp_abc - digital alphabet to use, or NULL for text mode
+ * if <*byp_abc> is NULL, guess the digital alphabet,
+ * create it, and return it in <*byp_abc>.
+ * If <*byp_abc> is a digital alphabet, use it.
+ * msafile - name of alignment input to open;
+ * if "-", read standard input;
+ * if "*.gz", read through a <gzip -dc> pipe.
+ * env - <NULL>, or the name of an environment variable
+ * containing colon-delimited list of directories
+ * in which to search for <msafile> (e.g. "PFAMDB").
+ * format - format code, such as <eslMSAFILE_STOCKHOLM>;
+ * or <eslMSAFILE_UNKNOWN> to autodetect format.
+ * fmtd - <NULL>, or a pointer to an initialized
+ * <ESL_MSAFILE_FMTDATA> structure, containing
+ * any additional unusual constraints to apply
+ * to the input format.
+ * *ret_afp - RETURN: open MSA input stream.
+ *
+ * Returns: <eslOK> on success, and <*ret_afp> is the newly opened msa file.
+ *
+ * <eslENOTFOUND> if <msafile> doesn't exist or can't be
+ * opened for reading; or (in the case of a <.gz> file) if
+ * a <gzip> executable doesn't exist in user's <PATH> or
+ * can't be executed. <afp->errmsg> is something like
+ * "couldn't open %s for reading", with <%s> being the
+ * name of the msafile.
+ *
+ * <eslENOFORMAT> if we tried to autodetect the file format
+ * (caller provided <format=eslMSAFILE_UNKNOWN>), and
+ * failed. <afp->errmsg> is an informative user-directed
+ * message, minimally something like "couldn't determine alignment
+ * input format", possibly more detailed.
+ *
+ * <eslENOALPHABET> if we tried to autodetect the alphabet
+ * (caller provided <&abc>, <abc=NULL> to request digital
+ * mode w/ alphabet autodetection) but the alphabet could
+ * not be reliably guessed.
+ *
+ * <eslFAIL> in the case of a <.gz> file and the <gzip -dc>
+ * command fails on it.
+ *
+ * On any of these normal errors, <*ret_afp> is returned in
+ * an error state, containing a user-directed error message
+ * in <afp->errmsg> and (if relevant) the full path to
+ * <msafile> that we attempted to open in
+ * <afp->bf->filename>. See <esl_msafile_OpenFailure()> for
+ * a function that gives a standard way of reporting these
+ * diagnostics to <stderr>.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslESYS> on a system call failure, such as <fread()>.
+ * <eslEINVAL> if we tried to use <stdin> but the <stdin> stream was
+ * invalid (in an error state, <NULL>, or at <EOF>).
+ * On thrown exceptions, <*ret_afp> is <NULL>.
+ */
+int
+esl_msafile_Open(ESL_ALPHABET **byp_abc, const char *msafile, const char *env, int format, ESL_MSAFILE_FMTDATA *fmtd, ESL_MSAFILE **ret_afp)
+{
+ ESL_MSAFILE *afp = NULL;
+ int status;
+
+ if ( (status = msafile_Create(&afp)) != eslOK) goto ERROR;
+
+ if ((status = esl_buffer_Open(msafile, env, &(afp->bf))) != eslOK)
+ ESL_XFAIL(status, afp->errmsg, "%s", afp->bf->errmsg); /* ENOTFOUND; FAIL are normal here */
+
+ if ( (status = msafile_OpenBuffer(byp_abc, afp->bf, format, fmtd, afp)) != eslOK) goto ERROR;
+
+ *ret_afp = afp;
+ return eslOK;
+
+ ERROR: /* on normal errors, afp is returned in an error state */
+ if (status == eslENOTFOUND || status == eslFAIL || status == eslENOFORMAT || status == eslENODATA || status == eslENOALPHABET)
+ { afp->abc = NULL; *ret_afp = afp;}
+ else
+ { if (afp) esl_msafile_Close(afp); *ret_afp = NULL; }
+ return status;
+}
+
+
+/* Function: esl_msafile_OpenMem()
+ * Synopsis: Open a string or buffer for parsing as an MSA.
+ *
+ * Purpose: Essentially the same as <esl_msafile_Open()>, except
+ * we ``open'' the string or buffer <p>, <n> as the
+ * input source.
+ *
+ * If <p> is a NUL-terminated string, providing its length
+ * <n> is optional; <n> may be passed as -1. If <p> is an
+ * unterminated buffer, providing the length <n> is
+ * mandatory.
+ */
+int
+esl_msafile_OpenMem(ESL_ALPHABET **byp_abc, const char *p, esl_pos_t n, int format, ESL_MSAFILE_FMTDATA *fmtd, ESL_MSAFILE **ret_afp)
+{
+ ESL_MSAFILE *afp = NULL;
+ int status;
+
+ if ( (status = msafile_Create(&afp)) != eslOK) goto ERROR;
+ if ( (status = esl_buffer_OpenMem(p, n, &(afp->bf))) != eslOK) goto ERROR;
+
+ if ( (status = msafile_OpenBuffer(byp_abc, afp->bf, format, fmtd, afp)) != eslOK) goto ERROR;
+ *ret_afp = afp;
+ return eslOK;
+
+ ERROR:
+ if (status == eslENOTFOUND || status == eslFAIL || status == eslEFORMAT || status == eslENODATA || status == eslENOALPHABET)
+ { afp->abc = NULL; *ret_afp = afp;}
+ else
+ { if (afp) esl_msafile_Close(afp); *ret_afp = NULL; }
+ return status;
+}
+
+
+/* Function: esl_msafile_OpenBuffer()
+ * Synopsis: Open an input buffer for parsing as an MSA.
+ *
+ * Purpose: Essentially the same as <esl_msafile_Open()>, except
+ * we ``open'' an <ESL_BUFFER> <bf> that's already been
+ * opened by the caller for some input source.
+ */
+int
+esl_msafile_OpenBuffer(ESL_ALPHABET **byp_abc, ESL_BUFFER *bf, int format, ESL_MSAFILE_FMTDATA *fmtd, ESL_MSAFILE **ret_afp)
+{
+ ESL_MSAFILE *afp = NULL;
+ int status;
+
+ if ( (status = msafile_Create(&afp)) != eslOK) goto ERROR;
+
+ afp->bf = bf;
+ if ((status = msafile_OpenBuffer(byp_abc, afp->bf, format, fmtd, afp)) != eslOK) goto ERROR;
+ *ret_afp = afp;
+ return eslOK;
+
+ ERROR:
+ if (status == eslENOTFOUND || status == eslFAIL || status == eslEFORMAT || status == eslENODATA || status == eslENOALPHABET)
+ { afp->abc = NULL; *ret_afp = afp;}
+ else
+ { if (afp) esl_msafile_Close(afp); *ret_afp = NULL; }
+ return status;
+}
+
+/* Function: esl_msafile_OpenFailure()
+ * Synopsis: Report diagnostics of normal error in opening MSA file, and exit.
+ *
+ * Purpose: Report user-directed diagnostics of a normal error in opening
+ * an MSA input. Print a message to <stderr>, then exit.
+ */
+void
+esl_msafile_OpenFailure(ESL_MSAFILE *afp, int status)
+{
+ int show_source = FALSE;
+ int show_fmt = FALSE;
+
+ fprintf(stderr, "Alignment input open failed.\n");
+
+ if (status == eslENOTFOUND) { fprintf(stderr, " %s\n", afp->errmsg); }
+ else if (status == eslFAIL) { fprintf(stderr, " %s\n", afp->errmsg); }
+ else if (status == eslENOFORMAT) { fprintf(stderr, " %s\n", afp->errmsg); show_source = TRUE; }
+ else if (status == eslENOALPHABET) { fprintf(stderr, " %s\n", afp->errmsg); show_source = TRUE; show_fmt = TRUE; }
+ else if (status == eslEMEM) { fprintf(stderr, " Memory allocation failure\n"); }
+ else if (status == eslESYS) { fprintf(stderr, " System call failed, possibly fread()\n"); }
+ else { fprintf(stderr, " Unexpected error code %d\n", status); }
+
+ if (show_source) {
+ switch (afp->bf->mode_is) {
+ case eslBUFFER_STREAM: fprintf(stderr, " while reading from an input stream (not a file)\n"); break;
+ case eslBUFFER_CMDPIPE: fprintf(stderr, " while reading through a pipe (not a file)\n"); break;
+ case eslBUFFER_FILE:
+ case eslBUFFER_ALLFILE:
+ case eslBUFFER_MMAP: fprintf(stderr, " while reading file %s\n", afp->bf->filename); break;
+ case eslBUFFER_STRING: fprintf(stderr, " while reading from a provided string (not a file)\n"); break;
+ default: break;
+ }
+ }
+
+ if (show_fmt) {
+ fprintf(stderr, " while parsing for %s format\n", esl_msafile_DecodeFormat(afp->format));
+ }
+
+ esl_msafile_Close(afp);
+ exit(status);
+}
+
+/* Function: esl_msafile_SetDigital()
+ * Synopsis: Convert an open text-mode ESL_MSAFILE to digital mode.
+ *
+ * Purpose: Convert the open <afp> from text mode to digital mode,
+ * using alphabet <abc>.
+ *
+ * Note: This function is only here for legacy support: it's
+ * called by esl_sqio, which still uses an outdated
+ * open / guess alphabet / set digital pattern. When
+ * sqio is upgraded next, this function should be removed.
+ */
+int
+esl_msafile_SetDigital(ESL_MSAFILE *afp, const ESL_ALPHABET *abc)
+{
+ int status;
+
+ afp->abc = abc;
+
+ switch (afp->format) {
+ case eslMSAFILE_A2M: status = esl_msafile_a2m_SetInmap( afp); break;
+ case eslMSAFILE_AFA: status = esl_msafile_afa_SetInmap( afp); break;
+ case eslMSAFILE_CLUSTAL: status = esl_msafile_clustal_SetInmap( afp); break;
+ case eslMSAFILE_CLUSTALLIKE: status = esl_msafile_clustal_SetInmap( afp); break;
+ case eslMSAFILE_PFAM: status = esl_msafile_stockholm_SetInmap(afp); break;
+ case eslMSAFILE_PHYLIP: status = esl_msafile_phylip_SetInmap( afp); break;
+ case eslMSAFILE_PHYLIPS: status = esl_msafile_phylip_SetInmap( afp); break;
+ case eslMSAFILE_PSIBLAST: status = esl_msafile_psiblast_SetInmap( afp); break;
+ case eslMSAFILE_SELEX: status = esl_msafile_selex_SetInmap( afp); break;
+ case eslMSAFILE_STOCKHOLM: status = esl_msafile_stockholm_SetInmap(afp); break;
+ default: ESL_EXCEPTION(eslEINCONCEIVABLE, "no such alignment file format");
+ }
+ return status;
+}
+
+/* Function: esl_msafile_Close()
+ * Synopsis: Close an open <ESL_MSAFILE>.
+ */
+void
+esl_msafile_Close(ESL_MSAFILE *afp)
+{
+ if (afp) {
+ if (afp->bf) esl_buffer_Close(afp->bf);
+ if (afp->ssi) esl_ssi_Close(afp->ssi);
+ free(afp);
+ }
+}
+
+static int
+msafile_Create(ESL_MSAFILE **ret_afp)
+{
+ ESL_MSAFILE *afp = NULL;
+ int status;
+
+ ESL_ALLOC(afp, sizeof(ESL_MSAFILE));
+ afp->bf = NULL;
+ afp->line = NULL;
+ afp->n = 0;
+ afp->linenumber = 0;
+ afp->lineoffset = 0;
+ afp->format = eslMSAFILE_UNKNOWN;
+ afp->abc = NULL;
+ afp->ssi = NULL;
+ afp->errmsg[0] = '\0';
+
+ esl_msafile_fmtdata_Init(&(afp->fmtd));
+
+ *ret_afp = afp;
+ return eslOK;
+
+ ERROR:
+ *ret_afp = NULL;
+ return status;
+}
+
+
+
+/* All input sources funnel through here.
+ * Here, <afp> is already allocated and initialized, and the input
+ * <bf> is opened successfully.
+ */
+static int
+msafile_OpenBuffer(ESL_ALPHABET **byp_abc, ESL_BUFFER *bf, int format, ESL_MSAFILE_FMTDATA *fmtd, ESL_MSAFILE *afp)
+{
+ ESL_ALPHABET *abc = NULL;
+ int alphatype = eslUNKNOWN;
+ int status;
+
+ /* if caller provided <fmtd>, copy it into afp->fmtd */
+ if (fmtd) esl_msafile_fmtdata_Copy(fmtd, &(afp->fmtd));
+
+ /* Determine the format */
+ if (format == eslMSAFILE_UNKNOWN &&
+ (status = esl_msafile_GuessFileFormat(afp->bf, &format, &(afp->fmtd), afp->errmsg)) != eslOK)
+ goto ERROR;
+ afp->format = format;
+
+ /* Determine the alphabet; set <abc>. (<abc> == NULL means text mode.) */
+ /* Note that GuessAlphabet() functions aren't allowed to use the inmap, because it isn't set yet */
+#ifdef eslAUGMENT_ALPHABET
+ if (byp_abc && *byp_abc) /* Digital mode, and caller provided the alphabet */
+ {
+ abc = *byp_abc;
+ alphatype = abc->type;
+ }
+ else if (byp_abc) /* Digital mode, and caller wants us to guess and create an alphabet */
+ {
+ status = esl_msafile_GuessAlphabet(afp, &alphatype);
+ if (status == eslENOALPHABET) ESL_XFAIL(eslENOALPHABET, afp->errmsg, "couldn't guess alphabet (maybe try --dna/--rna/--amino if available)");
+ else if (status != eslOK) goto ERROR;
+ if ( (abc = esl_alphabet_Create(alphatype)) == NULL) { status = eslEMEM; goto ERROR; }
+ }
+#endif
+ if (abc && ! byp_abc) ESL_EXCEPTION(eslEINCONCEIVABLE, "Your version of Easel does not include digital alphabet code.");
+ /* ^^^^^^^^^^^^^^^^^ this test interacts tricksily with the #ifdef above */
+ afp->abc = abc; /* with afp->abc set, the inmap config functions know whether to do digital/text */
+
+ /* Configure the format-specific, digital or text mode character
+ * input map in afp->inmap.
+ * All of these must:
+ *
+ * set inmap[0] to an appropriate 'unknown' character, to replace
+ * invalid input with.
+ * set ' ' to eslDSQ_IGNORE (if we're supposed to accept and skip
+ * it), or map it to a gap, or set it as eslDSQ_ILLEGAL.
+ * in digital mode, copy the abc->inmap
+ * in text mode, decide if we should accept most any
+ * non-whitespace character (isgraph()), or if the format is
+ * inherently restrictive and we should go with isalpha() +
+ * some other valid characters "_-.~*" instead.
+ */
+ switch (afp->format) {
+ case eslMSAFILE_A2M: if ((status = esl_msafile_a2m_SetInmap( afp)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_AFA: if ((status = esl_msafile_afa_SetInmap( afp)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_CLUSTAL: if ((status = esl_msafile_clustal_SetInmap( afp)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_CLUSTALLIKE: if ((status = esl_msafile_clustal_SetInmap( afp)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_PFAM: if ((status = esl_msafile_stockholm_SetInmap(afp)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_PHYLIP: if ((status = esl_msafile_phylip_SetInmap( afp)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_PHYLIPS: if ((status = esl_msafile_phylip_SetInmap( afp)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_PSIBLAST: if ((status = esl_msafile_psiblast_SetInmap( afp)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_SELEX: if ((status = esl_msafile_selex_SetInmap( afp)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_STOCKHOLM: if ((status = esl_msafile_stockholm_SetInmap(afp)) != eslOK) goto ERROR; break;
+ default: ESL_XEXCEPTION(eslENOFORMAT, "no such alignment file format");
+ }
+
+ if (esl_byp_IsReturned(byp_abc)) *byp_abc = abc;
+ return eslOK;
+
+ ERROR: /* on normal errors, afp is returned in an error state */
+ if (abc && ! esl_byp_IsProvided(byp_abc)) { esl_alphabet_Destroy(abc); }
+ if (esl_byp_IsReturned(byp_abc)) *byp_abc = NULL;
+ afp->abc = NULL;
+ return status;
+}
+/*------------- end, open/close an ESL_MSAFILE -----------------*/
+
+
+
+/*****************************************************************
+ *# 2. ESL_MSAFILE_FMTDATA: optional extra constraints on formats.
+ *****************************************************************/
+
+/* Function: esl_msafile_fmtdata_Init()
+ * Synopsis: Initialize a <ESL_MSAFILE_FMTDATA> structure.
+ */
+int
+esl_msafile_fmtdata_Init(ESL_MSAFILE_FMTDATA *fmtd)
+{
+ fmtd->namewidth = 0;
+ fmtd->rpl = 0;
+ return eslOK;
+}
+
+/* Function: esl_msafile_fmtdata_Copy()
+ * Synopsis: Copy one <ESL_MSAFILE_FMTDATA> structure to another.
+ */
+int
+esl_msafile_fmtdata_Copy(ESL_MSAFILE_FMTDATA *src, ESL_MSAFILE_FMTDATA *dst)
+{
+ dst->namewidth = src->namewidth;
+ dst->rpl = src->rpl;
+ return eslOK;
+}
+
+/*--------------- ESL_MSAFILE_FMTDATA --------------------------*/
+
+
+/*****************************************************************
+ *# 3. Guessing file format.
+ *****************************************************************/
+
+static int msafile_check_selex (ESL_BUFFER *bf);
+
+/* Function: esl_msafile_GuessFileFormat()
+ * Synopsis: Guess the MSA file format of an open buffer.
+ *
+ * Purpose: Peek into an open buffer, and try to determine what
+ * alignment file format (if any) its input is in. If a
+ * format can be determined, return <eslOK> and set
+ * <*ret_fmtcode> to the format code. If not, return
+ * <eslENOFORMAT> and set <*ret_fmtcode> to
+ * <eslMSAFILE_UNKNOWN>. In either case, the buffer <bf> is
+ * restored to its original position upon return.
+ *
+ * Some formats may have variants that require special
+ * handling. Caller may pass a pointer <*opt_fmtd> to a
+ * <ESL_MSAFILE_FMTDATA> structure to capture this
+ * information from format autodetection, or <NULL>. If the
+ * structure is provided, it is reinitialized, and any
+ * fields that can be determined by the appropriate
+ * format-guessing function are filled in. If <*opt_fmtd>
+ * is <NULL>, the range of variation that can be captured
+ * by some formats may be limited. Currently this only
+ * affects PHYLIP format, where <opt_fmtd->namewidth>
+ * allows files with nonstandard name field widths to be
+ * autodetected and parsed.
+ *
+ * Args: bf - the open buffer to read input from
+ * ret_fmtcode - RETURN: format code that's determined
+ * opt_fmtd - optRETURN: ptr to an <ESL_MSAFILE_FMTDATA> structure to
+ * be filled in with additional format-specific data, or <NULL>
+ * errbuf - optRETURN: space for an informative error message if
+ * format autodetection fails; caller allocates for <eslERRBUFSIZE> bytes.
+ *
+ * Returns: <eslOK> on success, and <*ret_fmtcode> contains the format code.
+ *
+ * <eslENOFORMAT> if format can't be guessed; now <*ret_fmtcode> contains
+ * <eslMSAFILE_UNKNOWN>, and optional <errbuf> contains an explanation.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_msafile_GuessFileFormat(ESL_BUFFER *bf, int *ret_fmtcode, ESL_MSAFILE_FMTDATA *opt_fmtd, char *errbuf)
+{
+ esl_pos_t initial_offset;
+ char *p;
+ esl_pos_t n;
+ int fmt_bysuffix = eslMSAFILE_UNKNOWN;
+ int fmt_byfirstline = eslMSAFILE_UNKNOWN;
+ int status;
+
+ /* Initialize the optional data, if provided (move this initialization to a function someday) */
+ if (opt_fmtd) esl_msafile_fmtdata_Init(opt_fmtd);
+ if (errbuf) errbuf[0] = '\0';
+
+ /* As we start, save parser status:
+ * remember the offset where we started (usually 0, but not necessarily)
+ * set an anchor to be sure that this offset stays in the buffer's memory
+ */
+ initial_offset = esl_buffer_GetOffset(bf);
+ esl_buffer_SetAnchor(bf, initial_offset);
+
+ /* We may use a filename suffix as a clue, especially when
+ * distinguishing formats that may not be distinguishable.
+ * (if there's a filename, and if it has a suffix, anyway.)
+ */
+ if (bf->filename)
+ {
+ esl_file_Extension(bf->filename, 0, &p, &n);
+ if (esl_memstrcmp(p, n, ".gz")) esl_file_Extension(bf->filename, 3, &p, &n);
+ if (p)
+ {
+ if (esl_memstrcmp(p, n, ".sto")) fmt_bysuffix = eslMSAFILE_STOCKHOLM;
+ else if (esl_memstrcmp(p, n, ".sth")) fmt_bysuffix = eslMSAFILE_STOCKHOLM;
+ else if (esl_memstrcmp(p, n, ".stk")) fmt_bysuffix = eslMSAFILE_STOCKHOLM;
+ else if (esl_memstrcmp(p, n, ".afa")) fmt_bysuffix = eslMSAFILE_AFA;
+ else if (esl_memstrcmp(p, n, ".afasta")) fmt_bysuffix = eslMSAFILE_AFA;
+ else if (esl_memstrcmp(p, n, ".pfam")) fmt_bysuffix = eslMSAFILE_PFAM;
+ else if (esl_memstrcmp(p, n, ".a2m")) fmt_bysuffix = eslMSAFILE_A2M;
+ else if (esl_memstrcmp(p, n, ".slx")) fmt_bysuffix = eslMSAFILE_SELEX;
+ else if (esl_memstrcmp(p, n, ".selex")) fmt_bysuffix = eslMSAFILE_SELEX;
+ else if (esl_memstrcmp(p, n, ".pb")) fmt_bysuffix = eslMSAFILE_PSIBLAST;
+ else if (esl_memstrcmp(p, n, ".ph")) fmt_bysuffix = eslMSAFILE_PHYLIP;
+ else if (esl_memstrcmp(p, n, ".phy")) fmt_bysuffix = eslMSAFILE_PHYLIP;
+ else if (esl_memstrcmp(p, n, ".phyi")) fmt_bysuffix = eslMSAFILE_PHYLIP;
+ else if (esl_memstrcmp(p, n, ".phys")) fmt_bysuffix = eslMSAFILE_PHYLIPS;
+ }
+ }
+
+ /* We peek at the first non-blank line of the file.
+ * Multiple sequence alignment files are often identifiable by a token on this line.
+ */
+ /* Skip blank lines, get first non-blank one */
+ do {
+ status = esl_buffer_GetLine(bf, &p, &n);
+ } while (status == eslOK && esl_memspn(p, n, " \t") == n);
+ if (status == eslEOF) ESL_XFAIL(eslENOFORMAT, errbuf, "can't guess alignment input format: empty file/no data");
+
+ if (esl_memstrpfx(p, n, "# STOCKHOLM")) fmt_byfirstline = eslMSAFILE_STOCKHOLM;
+ else if (esl_memstrpfx(p, n, ">")) fmt_byfirstline = eslMSAFILE_AFA;
+ else if (esl_memstrpfx(p, n, "CLUSTAL")) fmt_byfirstline = eslMSAFILE_CLUSTAL;
+ else if (esl_memstrcontains(p, n, "multiple sequence alignment")) fmt_byfirstline = eslMSAFILE_CLUSTALLIKE;
+ else {
+ char *tok;
+ esl_pos_t toklen;
+ /* look for <nseq> <alen>, characteristic of PHYLIP files */
+ if (esl_memtok(&p, &n, " \t", &tok, &toklen) == eslOK && esl_memspn(tok, toklen, "0123456789") == toklen &&
+ esl_memtok(&p, &n, " \t", &tok, &toklen) == eslOK && esl_memspn(tok, toklen, "0123456789") == toklen)
+ fmt_byfirstline = eslMSAFILE_PHYLIP; /* interleaved for now; we'll look more closely soon */
+ }
+
+ /* Restore parser status, rewind to start */
+ esl_buffer_SetOffset (bf, initial_offset);
+ esl_buffer_RaiseAnchor(bf, initial_offset);
+
+ /* Rules to determine formats.
+ * If we have to call a routine that looks deeper into the buffer
+ * than the first line, that routine must restore buffer status.
+ */
+ if (fmt_byfirstline == eslMSAFILE_STOCKHOLM)
+ {
+ if (fmt_bysuffix == eslMSAFILE_STOCKHOLM) *ret_fmtcode = eslMSAFILE_STOCKHOLM;
+ else if (fmt_bysuffix == eslMSAFILE_PFAM) *ret_fmtcode = eslMSAFILE_PFAM;
+ else *ret_fmtcode = eslMSAFILE_STOCKHOLM;
+ }
+ else if (fmt_byfirstline == eslMSAFILE_CLUSTAL)
+ {
+ *ret_fmtcode = eslMSAFILE_CLUSTAL;
+ }
+ else if (fmt_byfirstline == eslMSAFILE_CLUSTALLIKE)
+ {
+ *ret_fmtcode = eslMSAFILE_CLUSTALLIKE;
+ }
+ else if (fmt_byfirstline == eslMSAFILE_AFA)
+ {
+ if (fmt_bysuffix == eslMSAFILE_A2M) *ret_fmtcode = eslMSAFILE_A2M; // A2M requires affirmative identification by caller,
+ else *ret_fmtcode = eslMSAFILE_AFA; // because of ambiguity w/ AFA.
+ }
+ else if (fmt_byfirstline == eslMSAFILE_PHYLIP)
+ {
+ if (fmt_bysuffix == eslMSAFILE_PHYLIP) *ret_fmtcode = eslMSAFILE_PHYLIP;
+ else if (fmt_bysuffix == eslMSAFILE_PHYLIPS) *ret_fmtcode = eslMSAFILE_PHYLIPS;
+ else
+ {
+ int namewidth;
+ status = esl_msafile_phylip_CheckFileFormat(bf, ret_fmtcode, &namewidth);
+ if (status == eslEAMBIGUOUS) ESL_XFAIL(eslENOFORMAT, errbuf, "can't guess format: it's consistent w/ both phylip, phylips.");
+ else if (status == eslFAIL) ESL_XFAIL(eslENOFORMAT, errbuf, "format unrecognized, though it looks phylip-like");
+
+ if (opt_fmtd) opt_fmtd->namewidth = namewidth;
+ else if (namewidth != 10) ESL_XFAIL(eslENOFORMAT, errbuf, "can't parse nonstandard PHYLIP name width (expected 10)"); /* if we can't store the nonstandard width, we can't allow the caller to think it can parse this */
+ }
+ }
+ else // if we haven't guessed so far, try selex.
+ { /* selex parser can handle psiblast too */
+ if (fmt_bysuffix == eslMSAFILE_SELEX) *ret_fmtcode = eslMSAFILE_SELEX;
+ else if (msafile_check_selex(bf) == eslOK) *ret_fmtcode = eslMSAFILE_SELEX;
+ else ESL_XFAIL(eslENOFORMAT, errbuf, "couldn't guess alignment input format - doesn't even look like selex");
+ }
+
+ return eslOK;
+
+ ERROR:
+ *ret_fmtcode = eslMSAFILE_UNKNOWN;
+ return status;
+}
+
+
+/* Function: esl_msafile_IsMultiRecord()
+ * Synopsis: Test if a format supports multiple MSAs per file.
+ *
+ * Purpose: Return <TRUE> if MSA file format <fmt> supports
+ * more than one MSA record per file. Return <FALSE>
+ * otherwise (including the cases of <fmt> being
+ * invalid or <eslMSAFILE_UNKNOWN>).
+ */
+int
+esl_msafile_IsMultiRecord(int fmt)
+{
+ switch (fmt) {
+ case eslMSAFILE_UNKNOWN: return FALSE;
+ case eslMSAFILE_STOCKHOLM: return TRUE;
+ case eslMSAFILE_PFAM: return TRUE;
+ case eslMSAFILE_A2M: return FALSE;
+ case eslMSAFILE_PSIBLAST: return FALSE;
+ case eslMSAFILE_SELEX: return FALSE;
+ case eslMSAFILE_AFA: return FALSE;
+ case eslMSAFILE_CLUSTAL: return FALSE;
+ case eslMSAFILE_CLUSTALLIKE: return FALSE;
+ case eslMSAFILE_PHYLIP: return TRUE; /* because seqboot. undocumented in phylip, phylip format can come out multi-msa */
+ case eslMSAFILE_PHYLIPS: return TRUE; /* ditto */
+ default: return FALSE;
+ }
+ return FALSE; /* keep compilers happy */
+}
+
+
+/* Function: esl_msafile_EncodeFormat()
+ * Synopsis: Convert text string to an MSA file format code.
+ *
+ * Purpose: Given a text string, match it case-insensitively
+ * against a list of possible formats, and return the
+ * appropriate MSA file format code. For example,
+ * <esl_msafile_EncodeFormat("Stockholm")> returns
+ * <eslMSAFILE_STOCKHOLM>.
+ *
+ * If the format is unrecognized, return
+ * <eslMSAFILE_UNKNOWN>.
+ *
+ * Note: Keep in sync with <esl_sqio_EncodeFormat()>,
+ * which decodes all possible sequence file formats,
+ * both unaligned and aligned.
+ */
+int
+esl_msafile_EncodeFormat(char *fmtstring)
+{
+ if (strcasecmp(fmtstring, "stockholm") == 0) return eslMSAFILE_STOCKHOLM;
+ if (strcasecmp(fmtstring, "pfam") == 0) return eslMSAFILE_PFAM;
+ if (strcasecmp(fmtstring, "a2m") == 0) return eslMSAFILE_A2M;
+ if (strcasecmp(fmtstring, "phylip") == 0) return eslMSAFILE_PHYLIP;
+ if (strcasecmp(fmtstring, "phylips") == 0) return eslMSAFILE_PHYLIPS;
+ if (strcasecmp(fmtstring, "psiblast") == 0) return eslMSAFILE_PSIBLAST;
+ if (strcasecmp(fmtstring, "selex") == 0) return eslMSAFILE_SELEX;
+ if (strcasecmp(fmtstring, "afa") == 0) return eslMSAFILE_AFA;
+ if (strcasecmp(fmtstring, "clustal") == 0) return eslMSAFILE_CLUSTAL;
+ if (strcasecmp(fmtstring, "clustallike") == 0) return eslMSAFILE_CLUSTALLIKE;
+ return eslMSAFILE_UNKNOWN;
+}
+
+
+/* Function: esl_msafile_DecodeFormat()
+ * Synopsis: Convert internal file format code to text string.
+ *
+ * Purpose: Given an internal file format code <fmt>
+ * (<eslMSAFILE_STOCKHOLM>, for example), returns
+ * a string suitable for printing ("Stockholm",
+ * for example).
+ *
+ * Returns: a pointer to a static description string.
+ *
+ * Throws: If code isn't valid, throws an <eslEINCONCEIVABLE> exception
+ * internally, and returns <NULL>.
+ *
+ * Note: Keep in sync with <esl_sqio_DecodeFormat()>.
+ */
+char *
+esl_msafile_DecodeFormat(int fmt)
+{
+ switch (fmt) {
+ case eslMSAFILE_UNKNOWN: return "unknown";
+ case eslMSAFILE_STOCKHOLM: return "Stockholm";
+ case eslMSAFILE_PFAM: return "Pfam";
+ case eslMSAFILE_A2M: return "UCSC A2M";
+ case eslMSAFILE_PSIBLAST: return "PSI-BLAST";
+ case eslMSAFILE_SELEX: return "SELEX";
+ case eslMSAFILE_AFA: return "aligned FASTA";
+ case eslMSAFILE_CLUSTAL: return "Clustal";
+ case eslMSAFILE_CLUSTALLIKE: return "Clustal-like";
+ case eslMSAFILE_PHYLIP: return "PHYLIP (interleaved)";
+ case eslMSAFILE_PHYLIPS: return "PHYLIP (sequential)";
+ default: break;
+ }
+ esl_exception(eslEINVAL, FALSE, __FILE__, __LINE__, "no such msa format code %d\n", fmt);
+ return NULL;
+}
+
+
+
+/* msafile_check_selex()
+ * Checks whether an input source appears to be in SELEX format.
+ *
+ * Check whether the input source <bf> appears to be a
+ * SELEX-format alignment file, starting from the current point,
+ * to the end of the input. Return <eslOK> if so, <eslFAIL>
+ * if not.
+ *
+ * The checker is more rigorous than the parser. To be autodetected,
+ * the SELEX file can't use whitespace for gaps. The parser, though,
+ * allows whitespace. A caller would have to specific SELEX format
+ * explicitly in that case.
+ */
+static int
+msafile_check_selex(ESL_BUFFER *bf)
+{
+ esl_pos_t start_offset = -1;
+ int block_nseq = 0; /* Number of seqs in each block is checked */
+ int nseq = 0;
+ esl_pos_t block_nres = 0; /* Number of residues in each line is checked */
+ char *firstname = NULL; /* First seq name of every block is checked */
+ esl_pos_t namelen = 0;
+ int blockidx = 0;
+ int in_block = FALSE;
+ char *p, *tok;
+ esl_pos_t n, toklen;
+ int status;
+
+ /* Anchor at the start of the input, so we can rewind */
+ start_offset = esl_buffer_GetOffset(bf);
+ if ( (status = esl_buffer_SetAnchor(bf, start_offset)) != eslOK) goto ERROR;
+
+ while ( (status = esl_buffer_GetLine(bf, &p, &n)) == eslOK)
+ {
+ /* Some automatic giveaways of SELEX format */
+ if (esl_memstrpfx(p, n, "#=RF")) { status = eslOK; goto DONE; }
+ if (esl_memstrpfx(p, n, "#=CS")) { status = eslOK; goto DONE; }
+ if (esl_memstrpfx(p, n, "#=SS")) { status = eslOK; goto DONE; }
+ if (esl_memstrpfx(p, n, "#=SA")) { status = eslOK; goto DONE; }
+
+ /* skip comments */
+ if (esl_memstrpfx(p, n, "#")) continue;
+
+ /* blank lines: end block, reset block counters */
+ if (esl_memspn(p, n, " \t") == n)
+ {
+ if (block_nseq && block_nseq != nseq) { status = eslFAIL; goto DONE;} /* each block has same # of seqs */
+ if (in_block) blockidx++;
+ if (blockidx >= 3) { status = eslOK; goto DONE; } /* stop after three blocks; we're pretty sure by now */
+ in_block = FALSE;
+ block_nres = 0;
+ block_nseq = nseq;
+ nseq = 0;
+ continue;
+ }
+
+ /* else we're a "sequence" line. test for two and only two non-whitespace
+ * fields; test that second field has same length; test that each block
+ * starts with the same seq name..
+ */
+ in_block = TRUE;
+ if ( (status = esl_memtok(&p, &n, " \t", &tok, &toklen)) != eslOK) goto ERROR; /* there's at least one token - we already checked for blank lines */
+ if (nseq == 0) /* check first seq name in each block */
+ {
+ if (blockidx == 0) { firstname = tok; namelen = toklen; } /* First block: set the name we check against. */
+ else if (toklen != namelen || memcmp(tok, firstname, toklen) != 0) { status = eslFAIL; goto DONE; } /* Subsequent blocks */
+ }
+ if (esl_memtok(&p, &n, " \t", &tok, &toklen) != eslOK) { status = eslFAIL; goto DONE; }
+ if (block_nres && toklen != block_nres) { status = eslFAIL; goto DONE; }
+ block_nres = toklen;
+ if (esl_memtok(&p, &n, " \t", &tok, &toklen) == eslOK) { status = eslFAIL; goto DONE; }
+ nseq++;
+ }
+ if (status != eslEOF) goto ERROR; /* EOF is expected and good; anything else is bad */
+
+ if (in_block) blockidx++;
+ status = (blockidx ? eslOK : eslFAIL); /* watch out for the case of no input */
+ /* deliberate readthru */
+ DONE:
+ if (start_offset != -1) {
+ if (esl_buffer_SetOffset(bf, start_offset) != eslOK) goto ERROR;
+ if (esl_buffer_RaiseAnchor(bf, start_offset) != eslOK) goto ERROR;
+ }
+ return status;
+
+ ERROR:
+ if (start_offset != -1) {
+ esl_buffer_SetOffset(bf, start_offset);
+ esl_buffer_RaiseAnchor(bf, start_offset);
+ }
+ return status;
+}
+/*---------------- end, file format utilities -------------------*/
+
+
+/*****************************************************************
+ *# 4. Guessing alphabet
+ *****************************************************************/
+#ifdef eslAUGMENT_ALPHABET
+
+/* Function: esl_msafile_GuessAlphabet()
+ * Synopsis: Guess what kind of sequences the MSA file contains.
+ *
+ * Purpose: Guess the alphabet of the sequences in the open
+ * <ESL_MSAFILE> <afp> -- <eslDNA>, <eslRNA>, or <eslAMINO> --
+ * based on the residue composition of the input.
+ *
+ * Returns: Returns <eslOK> on success, and <*ret_type> is set
+ * to <eslDNA>, <eslRNA>, or <eslAMINO>.
+ *
+ * Returns <eslENOALPHABET> and sets <*ret_type> to
+ * <eslUNKNOWN> if the alphabet cannot be reliably
+ * guessed.
+ *
+ * Either way, the <afp>'s buffer is restored to its original
+ * state, no matter how much data we had to read while trying
+ * to guess.
+ *
+ * Throws: <eslEMEM> - an allocation error.
+ * <eslESYS> - a system call such as <fread()> failed.
+ * <eslEINCONCEIVABLE> - "impossible" corruption, internal bug
+ */
+int
+esl_msafile_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type)
+{
+ int status = eslENOALPHABET;
+ switch (afp->format) {
+ case eslMSAFILE_STOCKHOLM: status = esl_msafile_stockholm_GuessAlphabet(afp, ret_type); break;
+ case eslMSAFILE_PFAM: status = esl_msafile_stockholm_GuessAlphabet(afp, ret_type); break;
+ case eslMSAFILE_A2M: status = esl_msafile_a2m_GuessAlphabet (afp, ret_type); break;
+ case eslMSAFILE_PSIBLAST: status = esl_msafile_psiblast_GuessAlphabet (afp, ret_type); break;
+ case eslMSAFILE_SELEX: status = esl_msafile_selex_GuessAlphabet (afp, ret_type); break;
+ case eslMSAFILE_AFA: status = esl_msafile_afa_GuessAlphabet (afp, ret_type); break;
+ case eslMSAFILE_CLUSTAL: status = esl_msafile_clustal_GuessAlphabet (afp, ret_type); break;
+ case eslMSAFILE_CLUSTALLIKE: status = esl_msafile_clustal_GuessAlphabet (afp, ret_type); break;
+ case eslMSAFILE_PHYLIP: status = esl_msafile_phylip_GuessAlphabet (afp, ret_type); break;
+ case eslMSAFILE_PHYLIPS: status = esl_msafile_phylip_GuessAlphabet (afp, ret_type); break;
+ }
+ return status;
+}
+#endif /*eslAUGMENT_ALPHABET*/
+/*----------- end, utilities for alphabets ----------------------*/
+
+
+/*****************************************************************
+ *# 5. Random msa flatfile database access (with SSI)
+ *****************************************************************/
+#ifdef eslAUGMENT_SSI
+
+/* Function: esl_msafile_PositionByKey()
+ * Synopsis: Use SSI to reposition file to start of named MSA.
+ *
+ * Purpose: Reposition <afp> so that the next MSA we read
+ * will be the one named (or accessioned) <key>.
+ *
+ * Returns: <eslOK> on success, and the file <afp> is repositioned
+ * such that the next <esl_msafile_Read()> call will read the
+ * alignment named <key>.
+ *
+ * Returns <eslENOTFOUND> if <key> isn't found in the index
+ * for <afp>.
+ *
+ * Returns <eslEFORMAT> if something goes wrong trying to
+ * read the index, indicating some sort of file format
+ * problem in the SSI file.
+ *
+ * Throws: <eslENODATA> if there's no open SSI index;
+ * <eslEINVAL> if the <offset> is invalid, either requiring rewind
+ * of a nonrewindable stream, or off the end of the data;
+ * <eslESYS> if a system call such as <fread()> fails;
+ * <eslEMEM> on allocation failure.
+ * In all these cases, the state of the <afp> is uncertain
+ * and may be corrupt; the application should not continue
+ * to use it.
+ */
+int
+esl_msafile_PositionByKey(ESL_MSAFILE *afp, const char *key)
+{
+ uint16_t fh;
+ off_t offset;
+ int status;
+
+ if (afp->ssi == NULL) ESL_EXCEPTION(eslENODATA, "Need an open SSI index to call esl_msafile_PositionByKey()");
+ if ((status = esl_ssi_FindName(afp->ssi, key, &fh, &offset, NULL, NULL)) != eslOK) return status; /* eslENOTFOUND|eslEFORMAT [eslEMEM] */
+ if ((status = esl_buffer_SetOffset(afp->bf, offset)) != eslOK) return status; /* [eslEINVAL|eslESYS|eslEMEM] */
+
+ /* The linenumber gets messed up after a file positioning. Best we can do
+ * is to turn it off (set it to -1). FIX THIS next time SSI format is
+ * changed: add linenumber to a primary key record.
+ */
+ afp->linenumber = -1;
+ return eslOK;
+}
+#endif /*eslAUGMENT_SSI*/
+/*------------- end of functions added by SSI augmentation -------------------*/
+
+
+/*****************************************************************
+ *# 6. Reading MSAs from input
+ *****************************************************************/
+
+/* Function: esl_msafile_Read()
+ * Synopsis: Read next MSA from input.
+ *
+ * Purpose: Reads the next MSA from open MSA input <afp>, and return it in
+ * <*ret_msa>.
+ *
+ * Args: afp - open alignment input stream
+ 8 *ret_msa - RETURN: alignment
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEFORMAT> on a parse error, and <afp->errmsg> is set
+ * to a user-directed error message; <*ret_msa> is <NULL>.
+ *
+ * If no alignment is found at all, returns <eslEOF>,
+ * and <afp->errmsg> is blank; <*ret_msa> is <NULL>.
+ *
+ * On normal error, <afp> and the return status code may be
+ * passed to <esl_msafile_ReadFailure()> to print diagnostics
+ * to <stderr> (including input source information and line
+ * number) and exit.
+ *
+ * Throws: <eslEMEM> - an allocation failed.
+ * <eslESYS> - a system call such as fread() failed
+ * <eslEINCONCEIVABLE> - "impossible" corruption
+ */
+int
+esl_msafile_Read(ESL_MSAFILE *afp, ESL_MSA **ret_msa)
+{
+ ESL_MSA *msa = NULL;
+ int status = eslOK;
+#ifdef eslAUGMENT_SSI
+ esl_pos_t offset = esl_buffer_GetOffset(afp->bf);
+#endif
+
+ switch (afp->format) {
+ case eslMSAFILE_A2M: if ((status = esl_msafile_a2m_Read (afp, &msa)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_AFA: if ((status = esl_msafile_afa_Read (afp, &msa)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_CLUSTAL: if ((status = esl_msafile_clustal_Read (afp, &msa)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_CLUSTALLIKE: if ((status = esl_msafile_clustal_Read (afp, &msa)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_PFAM: if ((status = esl_msafile_stockholm_Read(afp, &msa)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_PHYLIP: if ((status = esl_msafile_phylip_Read (afp, &msa)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_PHYLIPS: if ((status = esl_msafile_phylip_Read (afp, &msa)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_PSIBLAST: if ((status = esl_msafile_psiblast_Read (afp, &msa)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_SELEX: if ((status = esl_msafile_selex_Read (afp, &msa)) != eslOK) goto ERROR; break;
+ case eslMSAFILE_STOCKHOLM: if ((status = esl_msafile_stockholm_Read(afp, &msa)) != eslOK) goto ERROR; break;
+ default: ESL_EXCEPTION(eslEINCONCEIVABLE, "no such msa file format");
+ }
+
+#ifdef eslAUGMENT_SSI
+ msa->offset = offset;
+#endif
+ *ret_msa = msa;
+ return eslOK;
+
+ ERROR:
+ if (msa) esl_msa_Destroy(msa);
+ *ret_msa = NULL;
+ return status;
+}
+
+/* Function: esl_msafile_ReadFailure()
+ * Synopsis: Report diagnostics of a normal error in parsing MSA file, and exit.
+ *
+ * Purpose: Report user-directed diagnostics of a normal error from
+ * parsing an MSA file. Output the error message to
+ * <stderr>, along with information about what we were
+ * parsing (filename, if it was a file) and where we were
+ * in the input (linenumber, if we know it). This
+ * information is all available in <afp>. Then close <afp>
+ * and exit with the <status> provided by the caller.
+ *
+ * Args: afp - open ESL_MSAFILE, containing information about
+ * the error and the input source.
+ * status - exit status; generally eslEFORMAT.
+ *
+ * Returns: no return. Exits here with <status>.
+ */
+void
+esl_msafile_ReadFailure(ESL_MSAFILE *afp, int status)
+{
+ switch (status) {
+ case eslEFORMAT: fprintf(stderr, "Alignment input parse error:\n %s\n", afp->errmsg); break;
+ case eslEOF: fprintf(stderr, "Alignment input appears empty?\n"); break;
+ default: fprintf(stderr, "Alignment input read error; unexpected code %d\n", status); break;
+ }
+
+ switch (afp->bf->mode_is) {
+ case eslBUFFER_STREAM: fprintf(stderr, " while reading %s from an input stream (not a file)\n", esl_msafile_DecodeFormat(afp->format)); break;
+ case eslBUFFER_CMDPIPE: fprintf(stderr, " while reading %s through a pipe (not a file)\n", esl_msafile_DecodeFormat(afp->format)); break;
+ case eslBUFFER_FILE:
+ case eslBUFFER_ALLFILE:
+ case eslBUFFER_MMAP: fprintf(stderr, " while reading %s file %s\n", esl_msafile_DecodeFormat(afp->format), afp->bf->filename); break;
+ case eslBUFFER_STRING: fprintf(stderr, " while reading %s from a provided string (not a file)\n", esl_msafile_DecodeFormat(afp->format)); break;
+ default: break;
+ }
+
+ if (afp->linenumber > 0) fprintf(stderr, " at or near line %" PRIu64 "\n", afp->linenumber);
+ else fprintf(stderr, " at or near byte %" PRIu64 "\n", esl_buffer_GetOffset(afp->bf));
+
+ esl_msafile_Close(afp);
+ exit(status);
+}
+/*------------ end, reading MSA from ESL_MSAFILE ---------------*/
+
+
+
+
+/*****************************************************************
+ *# 7. Writing an MSA to a stream.
+ *****************************************************************/
+
+/* Function: esl_msafile_Write()
+ * Synopsis: Write an MSA to a stream.
+ *
+ * Purpose: Writes alignment <msa> to open stream <fp> in format <fmt>.
+ *
+ * In general, the <msa> is unchanged, but there are some
+ * exceptions. For example, writing an alignment in A2M format
+ * will alter alignment data (marking missing data
+ * symbols on heuristically defined sequence fragments) and
+ * create an <\#=RF> annotation line, if an <msa->rf>
+ * annotation line isn't already present in the <msa>.
+ *
+ * Args: fp - open stream (such as <stdout>)
+ * msa - alignment to write
+ * fmt - format code (such as <eslMSAFILE_STOCKHOLM>)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEWRITE> on any system write error, such as a filled disk.
+ */
+int
+esl_msafile_Write(FILE *fp, ESL_MSA *msa, int fmt)
+{
+ int status;
+
+ switch (fmt) {
+ case eslMSAFILE_STOCKHOLM: status = esl_msafile_stockholm_Write(fp, msa, eslMSAFILE_STOCKHOLM); break;
+ case eslMSAFILE_PFAM: status = esl_msafile_stockholm_Write(fp, msa, eslMSAFILE_PFAM); break;
+ case eslMSAFILE_A2M: status = esl_msafile_a2m_Write (fp, msa); break;
+ case eslMSAFILE_PSIBLAST: status = esl_msafile_psiblast_Write (fp, msa); break;
+ case eslMSAFILE_SELEX: status = esl_msafile_selex_Write (fp, msa); break;
+ case eslMSAFILE_AFA: status = esl_msafile_afa_Write (fp, msa); break;
+ case eslMSAFILE_CLUSTAL: status = esl_msafile_clustal_Write (fp, msa, eslMSAFILE_CLUSTAL); break;
+ case eslMSAFILE_CLUSTALLIKE: status = esl_msafile_clustal_Write (fp, msa, eslMSAFILE_CLUSTALLIKE); break;
+ case eslMSAFILE_PHYLIP: status = esl_msafile_phylip_Write (fp, msa, eslMSAFILE_PHYLIP, NULL); break;
+ case eslMSAFILE_PHYLIPS: status = esl_msafile_phylip_Write (fp, msa, eslMSAFILE_PHYLIPS, NULL); break;
+ default: ESL_EXCEPTION(eslEINCONCEIVABLE, "no such msa file format");
+ }
+ return status;
+}
+
+/*-------------- end, writing MSA to stream ---------------------*/
+
+
+/*****************************************************************
+ *# 8. Utilities used by specific format parsers.
+ *****************************************************************/
+
+/* Function: esl_msafile_GetLine()
+ * Synopsis: Read next line of input alignment file.
+ *
+ * Purpose: Read next line of input <afp>, into its internal
+ * data fields: <afp->line> points to the start of the
+ * line in <afp->bf>, <afp->n> is its length in
+ * bytes, <afp->lineoffset> is the offset in the input
+ * to the start of the line, and <afp->linenumber> is
+ * the linenumber from <1..N> for <N> total lines in the
+ * input.
+ *
+ * Optionally, caller can request <*opt_p>, <*opt_n>,
+ * which are set to <afp->line>,<afp->n>. This gives the
+ * caller a modifiable line pointer that it can step
+ * through, while <afp->line> is preserved for possible
+ * diagnostics if anything goes awry.
+ *
+ * Args: <afp> : an open alignment file input
+ * <*opt_p> : optRETURN: modifiable copy of <afp->line> pointer
+ * <*opt_n> : optRETURN: modifiable copy of <afp->n>
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEOF> at EOF. Now <afp->line> is <NULL>, <afp->n>
+ * is <0>, and <afp->lineoffset> is <0>. <afp->linenumber>
+ * is the total number of lines in the input.
+ *
+ * Throws: <eslEMEM> if an allocation fails.
+ * <eslESYS> if a system call fails, such as fread().
+ * <eslEINCONCEIVABLE> on internal code errors.
+ */
+int
+esl_msafile_GetLine(ESL_MSAFILE *afp, char **opt_p, esl_pos_t *opt_n)
+{
+ int status;
+
+ afp->lineoffset = esl_buffer_GetOffset(afp->bf);
+ if ((status = esl_buffer_GetLine(afp->bf, &(afp->line), &(afp->n))) != eslOK) goto ERROR;
+ if (afp->linenumber != -1) afp->linenumber++;
+
+ if (opt_p) *opt_p = afp->line;
+ if (opt_n) *opt_n = afp->n;
+ return eslOK;
+
+ ERROR:
+ afp->line = NULL;
+ afp->n = 0;
+ afp->lineoffset = -1;
+ /* leave linenumber alone. on EOF, it is the number of lines in the file, and that might be useful. */
+ if (opt_p) *opt_p = NULL;
+ if (opt_n) *opt_n = 0;
+ return status;
+}
+
+
+/* Function: esl_msafile_PutLine()
+ * Synopsis: Put the line we just read back in the input stream
+ *
+ * Purpose: Put the line we just read back in the input stream
+ * and unset <afp->line> and its associated information
+ * internally. The next <esl_msafile_GetLine()> call
+ * will read exactly the same line again.
+ *
+ * This gets used in parsing files that contain multiple
+ * MSAs. If the way we determine that an MSA record has
+ * ended is by reading the first line of the next MSA
+ * record, then we may want to stuff it back in the input
+ * buffer, so it gets parsed properly as part of the next
+ * record. In Pfam/Stockholm parsing we don't have to
+ * do this, because the first line is just a format code,
+ * with no record-specific data. But in PHYLIP multiple MSA
+ * format, for example, the first line is nseq,alen.
+ *
+ * Args: afp - the open input stream
+ *
+ * Returns: <eslOK> on succes
+ *
+ * Throws: <eslEMEM>, <eslESYS>, <eslEINCONCEIVABLE> if the
+ * <esl_buffer_Set()> call fails.
+ */
+int
+esl_msafile_PutLine(ESL_MSAFILE *afp)
+{
+ int status;
+ if ((status = esl_buffer_Set(afp->bf, afp->line, 0)) != eslOK) return status;
+ afp->line = NULL;
+ afp->n = 0;
+ if (afp->linenumber != -1) afp->linenumber--;
+ afp->lineoffset = -1;
+ return eslOK;
+}
+
+/*--------------- end, parser utilities -------------------------*/
+
+
+
+/*****************************************************************
+ * 9. Unit tests
+ *****************************************************************/
+#ifdef eslMSAFILE_TESTDRIVE
+
+
+static void
+utest_format2format(int fmt1, int fmt2)
+{
+ char msg[] = "esl_msafile: format2format unit test failed";
+ char tmpfile1[32] = "esltmpXXXXXX";
+ char tmpfile2[32] = "esltmpXXXXXX";
+ char tmpfile3[32] = "esltmpXXXXXX";
+ FILE *ofp = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ ESL_MSAFILE *afp;
+ int alphatype = eslAMINO;
+ ESL_ALPHABET *abc = esl_alphabet_Create(alphatype);
+ ESL_ALPHABET *abc2 = NULL;
+
+ char *testmsa = "\
+# STOCKHOLM 1.0\n\
+seq1 ACDEFGHIKLMNPQRSTVWYacdefghiklmnpq------ACDEFGHIKLMNPQRSTVWYacde......mnpqrstvwyACDEFGHI______RSTVWYacdefghiklmnpqrstvwy\n\
+seq2 ACDEFGHIKLMNPQRSTVWYacdefghiklmnpqrstvwyACDEFGHIKLMNPQRSTVWYacdefghiklmnpqrstvwyACDEFGHIKLMNPQRSTVWYacdefghiklmnpqrstvwy\n\
+//\n";
+
+ /* Create the test msa, msa1, digital mode, no autodetections */
+ if ( esl_msafile_OpenMem(&abc, testmsa, strlen(testmsa), eslMSAFILE_STOCKHOLM, NULL, &afp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Read(afp, &msa1) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(afp);
+
+ /* Write it to tmpfile1 in fmt1. (This exercises writing of digital MSAs, in all <fmt1> formats) */
+ if ( esl_tmpfile_named(tmpfile1, &ofp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Write(ofp, msa1, fmt1) != eslOK) esl_fatal(msg);
+ fclose(ofp);
+
+ /* Read it back from <fmt1> in TEXT mode (verbatim), with format autodetection (except A2M) */
+ if (fmt1 != eslMSAFILE_A2M)
+ {
+ if ( esl_msafile_Open(NULL, tmpfile1, NULL, eslMSAFILE_UNKNOWN, NULL, &afp) != eslOK) esl_fatal(msg);
+ if (fmt1 == eslMSAFILE_PFAM && afp->format == eslMSAFILE_STOCKHOLM) afp->format = eslMSAFILE_PFAM;
+ if (fmt1 == eslMSAFILE_PSIBLAST && afp->format == eslMSAFILE_SELEX) afp->format = eslMSAFILE_PSIBLAST;
+ if ( esl_msafile_Read(afp, &msa2) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(afp);
+ }
+ else // without autodetection:
+ {
+ if ( esl_msafile_Open(NULL, tmpfile1, NULL, fmt1, NULL, &afp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Read(afp, &msa2) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(afp);
+ }
+
+ /* Write it to tmpfile2 in fmt2. (This exercises writing of text-mode MSAs, in all <fmt2> formats) */
+ if ( esl_tmpfile_named(tmpfile2, &ofp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Write(ofp, msa2, fmt2) != eslOK) esl_fatal(msg);
+ fclose(ofp);
+
+ /* Read it back in TEXT mode, with format autodetection (except A2M) */
+ if (fmt2 != eslMSAFILE_A2M)
+ {
+ if ( esl_msafile_Open(NULL, tmpfile2, NULL, eslMSAFILE_UNKNOWN, NULL, &afp) != eslOK) esl_fatal(msg);
+ if (fmt2 == eslMSAFILE_PFAM && afp->format == eslMSAFILE_STOCKHOLM) afp->format = eslMSAFILE_PFAM;
+ if (fmt2 == eslMSAFILE_PSIBLAST && afp->format == eslMSAFILE_SELEX) afp->format = eslMSAFILE_PSIBLAST;
+ if ( esl_msafile_Read(afp, &msa3) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(afp);
+ }
+ else // without autodetection:
+ {
+ if ( esl_msafile_Open(NULL, tmpfile2, NULL, fmt2, NULL, &afp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Read(afp, &msa3) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(afp);
+ }
+
+ /* Write it to tmpfile4 in fmt2. (This exercises writing of digital-mode MSAs, in all <fmt2> formats */
+ if ( esl_tmpfile_named(tmpfile3, &ofp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Write(ofp, msa3, fmt2) != eslOK) esl_fatal(msg);
+ fclose(ofp);
+
+ /* Read it back in DIGITAL mode, with alphabet autodetection but not format */
+ if ( esl_msafile_Open(&abc2, tmpfile3, NULL, fmt2, NULL, &afp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Read(afp, &msa4) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(afp);
+
+ /* Now:
+ * msa1 = digital mode test alignment, created from Stockholm string
+ * msa2 = TEXT mode, read from <fmt1> tmpfile1
+ * msa3 = TEXT mode, read from <fmt2> tmpfile2
+ * msa4 = digital mode, read from <fmt2> tmpfile3
+ * So we expect:
+ * msa2==msa3
+ * msa1==msa4
+ */
+
+ /* some normalization before comparing alignments. */
+ esl_msa_SymConvert(msa2, "abcdefghijklmnopqrstuvwxyz.", "ABCDEFGHIJKLMNOPQRSTUVWXYZ-");
+ esl_msa_SymConvert(msa3, "abcdefghijklmnopqrstuvwxyz.", "ABCDEFGHIJKLMNOPQRSTUVWXYZ-");
+
+ if (msa2->rf) { free (msa2->rf); msa2->rf = NULL; }
+ if (msa3->rf) { free (msa3->rf); msa3->rf = NULL; }
+ if (msa4->rf) { free (msa4->rf); msa4->rf = NULL; }
+
+ if (esl_msa_Compare(msa2, msa3) != eslOK) esl_fatal(msg);
+ if (esl_msa_Compare(msa1, msa4) != eslOK) esl_fatal(msg);
+
+ remove(tmpfile1);
+ remove(tmpfile2);
+ remove(tmpfile3);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+ esl_alphabet_Destroy(abc);
+ esl_alphabet_Destroy(abc2);
+}
+#endif /*eslMSAFILE_TESTDRIVE*/
+/*----------------- end, unit tests -----------------------------*/
+
+
+/*****************************************************************
+ * 10. Test driver
+ *****************************************************************/
+#ifdef eslMSAFILE_TESTDRIVE
+
+/* compile: gcc -g -Wall -I. -L. -o esl_msafile_utest -DeslMSAFILE_TESTDRIVE esl_msafile.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_msafile_utest -DeslMSAFILE_TESTDRIVE esl_msafile.c -leasel -lm
+ * run: ./esl_msafile_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_msafile.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for MSA input/output format module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ int fmt1, fmt2;
+
+ for (fmt1 = eslMSAFILE_STOCKHOLM; fmt1 <= eslMSAFILE_PHYLIPS; fmt1++)
+ for (fmt2 = eslMSAFILE_STOCKHOLM; fmt2 <= eslMSAFILE_PHYLIPS; fmt2++)
+ utest_format2format(fmt1, fmt2);
+
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+
+#endif /*eslMSAFILE_TESTDRIVE*/
+/*----------------- end, test driver ----------------------------*/
+
+
+
+/*****************************************************************
+ * 11. Examples.
+ *****************************************************************/
+
+#ifdef eslMSAFILE_EXAMPLE
+/*::cexcerpt::msafile_example::begin::*/
+#include <stdio.h>
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-i", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show info, instead of converting format", 0 },
+ { "--informat", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "specify the input MSA file is in format <s>", 0 },
+ { "--outformat", eslARG_STRING, "Clustal", NULL, NULL, NULL, NULL, NULL, "write the output MSA in format <s>", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use DNA alphabet", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use RNA alphabet", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use protein alphabet", 0 },
+ { "--text", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use text mode: no digital alphabet", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msafile>";
+static char banner[] = "example of multiple alignment input and output using the msafile module(s)";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *msafile = esl_opt_GetArg(go, 1);
+ int infmt = eslMSAFILE_UNKNOWN;
+ int outfmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int textmode = esl_opt_GetBoolean(go, "--text");
+ int showinfo = esl_opt_GetBoolean(go, "-i");
+ int nali = 0;
+ int status;
+
+ /* If you know the alphabet you want, create it - you'll pass it to esl_msafile_Open() */
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+
+ /* If you know the MSA file format, set it (<infmt>, here). */
+ if (esl_opt_IsOn(go, "--informat") &&
+ (infmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--informat"))) == eslMSAFILE_UNKNOWN)
+ esl_fatal("%s is not a valid MSA file format for --informat", esl_opt_GetString(go, "--informat"));
+
+ /* Open in text or digital mode.
+ * To let the Open() function autoguess the format, you pass <infmt=eslMSAFILE_UNKNOWN>.
+ * To let it autoguess the alphabet, you set <abc=NULL> and pass <&abc>.
+ * To open in text mode instead of digital, you pass <NULL> for the alphabet argument.
+ * esl_msafile_OpenFailure() is a convenience, printing various diagnostics of any
+ * open failure to <stderr>. You can of course handle your own diagnostics instead.
+ */
+ if (textmode) status = esl_msafile_Open(NULL, msafile, NULL, infmt, NULL, &afp);
+ else status = esl_msafile_Open(&abc, msafile, NULL, infmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+
+ if (showinfo) {
+ printf("# Format: %s\n", esl_msafile_DecodeFormat(afp->format));
+ printf("# Alphabet: %s\n", (afp->abc ? esl_abc_DecodeType(afp->abc->type) : "text mode"));
+ }
+
+ /* Choose the output file format */
+ if ( (outfmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--outformat"))) == eslMSAFILE_UNKNOWN)
+ esl_fatal("%s is not a valid MSA file format for --outformat", esl_opt_GetString(go, "--outformat"));
+
+ while ((status = esl_msafile_Read(afp, &msa)) == eslOK)
+ {
+ /* if digital MSA: msa->ax[idx=0..nseq-1][acol=1..alen] is the alignment data;
+ * if text MSA: msa->aseq[idx=0..nseq-1][acol=0..alen-1] */
+ nali++;
+
+ if (showinfo) printf("# alignment %5d: %15s: %6d seqs, %5d columns\n\n", nali, msa->name, (int) msa->nseq, (int) msa->alen);
+ else esl_msafile_Write(stdout, msa, outfmt);
+
+ esl_msa_Destroy(msa);
+ }
+ if (nali == 0 || status != eslEOF) esl_msafile_ReadFailure(afp, status); /* a convenience, like esl_msafile_OpenFailure() */
+
+ esl_alphabet_Destroy(abc);
+ esl_msafile_Close(afp);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+/*::cexcerpt::msafile_example::end::*/
+#endif /*eslMSAFILE_EXAMPLE*/
+/*------------------------ end of examples -----------------------*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
diff --git a/esl_msafile.h b/esl_msafile.h
new file mode 100644
index 0000000..3f0b890
--- /dev/null
+++ b/esl_msafile.h
@@ -0,0 +1,145 @@
+/* Multiple sequence alignment file i/o
+ *
+ * See also: esl_msafile2.[ch], which contains a legacy ESL_MSAFILE2 interface
+ * that includes support for --small option in various tools.
+ */
+#ifndef eslMSAFILE_INCLUDED
+#define eslMSAFILE_INCLUDED
+
+#include <stdio.h>
+
+#include "esl_alphabet.h" /* digital alphabets */
+#include "esl_buffer.h" /* string hashes, for mapping uniq seq names */
+#include "esl_msa.h" /* ESL_MSA structure */
+#include "esl_ssi.h" /* indexes of large flatfiles on disk */
+
+/* Object: ESL_MSAFILE_FMTDATA
+ *
+ * Additional (often optional) information about variants of some file
+ * formats. Not much in here right now - but figured this might need
+ * to expand in the future, best to have the mechanism in place.
+ *
+ * Used in three ways:
+ * 1. When opening an MSA file in a known format (as opposed to
+ * guessing an unknown format), caller may provide an <ESL_MSAFILE_FMTDATA>
+ * structure containing any additional constraints on the format.
+ * The new <afp> will copy this information into <afp->fmtd>.
+ * 2. When opening an MSA file in an unknown format (calling GuessFileFormat()),
+ * format-specific autodetectors fill in <afp->fmtd> with any additional
+ * constraints.
+ * 3. When writing an MSA file, caller may provide additional constraints on
+ * the format; notably <fmtd->rpl>, the number of residues per line,
+ * used for many formats.
+ *
+ * TODO: If this fills up with more information, we should eventually
+ * consolidate the format code too; create ESL_MSAFORMAT structure
+ * to hold both integer code and optional information; implement
+ * it in esl_msaformat.[ch]; put format guessing routines there;
+ * rename eslMSAFILE_* -> eslMSAFORMAT_*. For now, not worth the
+ * time, because it's really only a placeholder dealing with a small
+ * PHYLIP-specific format issue. <format>, <fmtd> are generally
+ * an ordered pair, to facilitate eventual replacement w/ single
+ * <fmt>. [SRE, 19 Jul 11]
+ */
+typedef struct {
+ int namewidth; /* PHYLIP only: width of the name field (usually 10, but can vary) unset=0 */
+ int rpl; /* several formats: residues per line unset=0 */
+} ESL_MSAFILE_FMTDATA;
+
+
+
+/* Object: ESL_MSAFILE
+ *
+ * An alignment file open for parsing.
+ */
+typedef struct {
+ ESL_BUFFER *bf; /* input file/data being parsed */
+
+ int32_t format; /* format of alignment file we're reading */
+ ESL_MSAFILE_FMTDATA fmtd; /* additional (often optional) format-specific details. */
+
+ char *line; /* line read from <bf> by <esl_msafile_GetLine()> */
+ esl_pos_t n; /* length of line in bytes (line is not NUL-terminated) */
+ int64_t linenumber; /* input linenumber for diagnostics; -1 if we lose track */
+ esl_pos_t lineoffset; /* offset of start of <line> in <bf>; -1 if line unset */
+
+ ESL_DSQ inmap[128]; /* input map, 0..127 */
+ const ESL_ALPHABET *abc; /* non-NULL if augmented and in digital mode */
+ ESL_SSI *ssi; /* open SSI index; or NULL, if none or not augmented */
+ char errmsg[eslERRBUFSIZE]; /* user-directed message for normal errors */
+} ESL_MSAFILE;
+
+
+/* Alignment file format codes.
+ * Must coexist with sqio unaligned file format codes.
+ * Rules:
+ * - 0 is an unknown/unassigned format
+ * - <=100 reserved for unaligned formats
+ * - >100 reserved for aligned formats
+ */
+#define eslMSAFILE_UNKNOWN 0 /* unknown format */
+#define eslMSAFILE_STOCKHOLM 101 /* Stockholm format, interleaved */
+#define eslMSAFILE_PFAM 102 /* Pfam/Rfam one-line-per-seq Stockholm format */
+#define eslMSAFILE_A2M 103 /* UCSC SAM's fasta-like a2m format */
+#define eslMSAFILE_PSIBLAST 104 /* NCBI PSI-BLAST alignment format */
+#define eslMSAFILE_SELEX 105 /* old SELEX format (largely obsolete) */
+#define eslMSAFILE_AFA 106 /* aligned FASTA format */
+#define eslMSAFILE_CLUSTAL 107 /* CLUSTAL format */
+#define eslMSAFILE_CLUSTALLIKE 108 /* CLUSTAL-like formats (MUSCLE, PROBCONS) */
+#define eslMSAFILE_PHYLIP 109 /* interleaved PHYLIP format */
+#define eslMSAFILE_PHYLIPS 110 /* sequential PHYLIP format */
+
+
+/* 1. Opening/closing an ESL_MSAFILE */
+extern int esl_msafile_Open (ESL_ALPHABET **byp_abc, const char *msafile, const char *env, int format, ESL_MSAFILE_FMTDATA *fmtd, ESL_MSAFILE **ret_afp);
+extern int esl_msafile_OpenMem (ESL_ALPHABET **byp_abc, const char *p, esl_pos_t n, int format, ESL_MSAFILE_FMTDATA *fmtd, ESL_MSAFILE **ret_afp);
+extern int esl_msafile_OpenBuffer(ESL_ALPHABET **byp_abc, ESL_BUFFER *bf, int format, ESL_MSAFILE_FMTDATA *fmtd, ESL_MSAFILE **ret_afp);
+extern void esl_msafile_OpenFailure(ESL_MSAFILE *afp, int status);
+extern int esl_msafile_SetDigital (ESL_MSAFILE *afp, const ESL_ALPHABET *abc);
+extern void esl_msafile_Close(ESL_MSAFILE *afp);
+
+/* 2. ESL_MSAFILE_FMTDATA: optional extra constraints on formats */
+extern int esl_msafile_fmtdata_Init(ESL_MSAFILE_FMTDATA *fmtd);
+extern int esl_msafile_fmtdata_Copy(ESL_MSAFILE_FMTDATA *src, ESL_MSAFILE_FMTDATA *dst);
+
+/* 3. Utilities for different file formats */
+extern int esl_msafile_GuessFileFormat(ESL_BUFFER *bf, int *ret_fmtcode, ESL_MSAFILE_FMTDATA *fmtd, char *errbuf);
+extern int esl_msafile_IsMultiRecord(int fmt);
+extern int esl_msafile_EncodeFormat(char *fmtstring);
+extern char *esl_msafile_DecodeFormat(int fmt);
+
+/* 4. Utilities for different alphabets */
+#ifdef eslAUGMENT_ALPHABET
+extern int esl_msafile_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type);
+#endif
+
+/* 5. Random access in a MSA flatfile database */
+#ifdef eslAUGMENT_SSI
+extern int esl_msafile_PositionByKey(ESL_MSAFILE *afp, const char *key);
+#endif
+
+/* 6. Reading an MSA from an ESL_MSAFILE */
+extern int esl_msafile_Read(ESL_MSAFILE *afp, ESL_MSA **ret_msa);
+extern void esl_msafile_ReadFailure(ESL_MSAFILE *afp, int status);
+
+/* 7. Writing an MSA to a stream */
+extern int esl_msafile_Write(FILE *fp, ESL_MSA *msa, int fmt);
+
+/* 8. Utilities for specific parsers */
+extern int esl_msafile_GetLine(ESL_MSAFILE *afp, char **opt_p, esl_pos_t *opt_n);
+extern int esl_msafile_PutLine(ESL_MSAFILE *afp);
+
+#include "esl_msafile_a2m.h"
+#include "esl_msafile_afa.h"
+#include "esl_msafile_clustal.h"
+#include "esl_msafile_phylip.h"
+#include "esl_msafile_psiblast.h"
+#include "esl_msafile_selex.h"
+#include "esl_msafile_stockholm.h"
+#endif /*eslMSAFILE_INCLUDED*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile.md b/esl_msafile.md
new file mode 100644
index 0000000..4545993
--- /dev/null
+++ b/esl_msafile.md
@@ -0,0 +1,181 @@
+
+### Multiple sequence alignment file formats
+
+Easel programs can input and output ten different multiple sequence
+alignment formats. There are five main formats:
+
+| format | i.e. | suffix |
+|---------------|--------------------|------------------|
+| `stockholm` | Stockholm | .sto, .sth, .stk |
+| `afa` | aligned FASTA | .afa, .afasta |
+| `clustal` | CLUSTAL | |
+| `phylip` | interleaved PHYLIP | .ph, .phy, .phyi |
+| `selex` | SELEX | .slx, .selex |
+
+and five variants:
+
+| format | i.e. | is like: | but: | suffix |
+|---------------|-------------------|-------------|------------------------------------------------------|-----------|
+| `pfam` | Pfam | `stockholm` | is restricted to one block | .pfam |
+| `a2m` | UCSC A2M, dotless | `afa` | has additional semantics for consensus columns | .a2m |
+| `clustallike` | Clustal-like | `clustal` | has another program name on first line (e.g. MUSCLE) | |
+| `phylips` | sequential Phylip | `phylip` | "sequential", rather than "interleaved" | .phys |
+| `psiblast` | NCBI PSI-BLAST | `selex` | is just an alignment, has no selex annotation lines | .pb |
+
+
+The _format_ code is what you type to select a format in a command
+line option, as in `--informat selex` or `--outformat afa`. These
+codes are treated case-insensitively, so `--informat SELEX` or
+`--outformat AFA` are also fine.
+
+### How alignment file formats are guessed
+
+Normally when you open an alignment file, an Easel-based program tries
+to guess its format. This saves typing and synapses when you're
+working at the command line.
+
+The guesser will never misidentify the format in a way that would
+corrupt the input alignment or change the annotation. There are
+formats that are problematic to distinguish based on content alone:
+`afa` versus `a2m`, and `phylip` versus `phylips`.
+
+For PHYLIP files, if no hint is available from a file suffix, the
+guesser will nonetheless almost always be able tell the difference and
+call `phylip` versus `phylips`. Pathological edge cases do exist,
+though, where the guesser will return an error about not being able to
+distinguish interleaved from sequential.
+
+However, `afa` and `a2m` files are so easily confusable that the
+guesser will not try to distinguish them based on content alone. The
+only way to get the guesser to call `a2m` is on a file with an
+explicit .a2m suffix.
+
+If you are doing scripted high throughput analysis on files in one of
+these formats, consider specifying your input file format and
+disabling the format guesser. The commandline option for this is
+usually something like `--informat <fmtcode>`. Alternatively, use file
+suffixes: `.afa` versus `.a2m`, or `.ph`/`.phy`/`.phyi` versus `.phys`
+to tip off the guesser.
+
+The guesser works with the following information:
+ * an initial guess based on peeking at the first line of the input
+ * if the input is a file with a file name, it uses the suffix as a clue (to distinguish .a2m versus .afa,
+ or .phyi from .phys, for example)
+ * in more difficult cases, the guesser looks more deeply into the input
+
+More specifically:
+
+#### `stockholm`, `pfam` formats
+
+If the first line starts with `# STOCKHOLM`: guess `stockholm`, unless
+the file suffix is `.pfam`, then guess `pfam`.
+
+Pfam format is just Stockholm, but restricted to a single alignment
+block. There is no difference in the alignment or annotation, so it is
+harmless to read a Pfam file as Stockholm.
+
+#### `afa`, `a2m` formats
+
+If the first line starts with `>`: if the file suffix is `.a2m`, guess
+`a2m`. Otherwise, call `afa`.
+
+The guesser does not autodetect a2m format unless we have a `.a2m`
+suffix on the file, even though it is usually possible to distinguish
+afa from a2m. In afa, the number of aligned characters is always the
+same but the number of upper case + dash characters can vary, whereas
+the opposite is true for a2m. However, it is common to have an afa
+format alignment that consists of all upper case and dashes:
+
+```bash
+>seq1
+GGG-CCC-TT
+>seq2
+GG-GCC-TT-
+```
+
+which is also valid as a2m. Although the alignment would be the same
+in either format, in a2m we would infer reference consensus
+annotation, and in afa we wouldn't. The guesser is not allowed to risk
+altering either alignment or annotation. Therefore a2m input requires
+something affirmative like the `.a2m` file suffix or a `--informat
+a2m` option.
+
+It's also worth noting that other ambiguous cases exist that imply
+different alignments in the two formats, as in this singularly
+terrifying example:
+
+```bash
+this input: means in AFA: means in A2M:
+>seq1 seq1 AAAcAA seq1 A.AAcAA
+AAAcAA seq2 AcAAAA seq2 AcAA.AA
+>seq2
+AcAAAA
+```
+
+
+#### `clustal`, `clustallike` formats
+
+If the first line of the input starts with `CLUSTAL`, guess `clustal`.
+If the first line contains the phrase `multiple sequence alignment`,
+guess `clustallike`. The file suffix doesn't matter.
+
+Clustal and Clustal-like formats are parsed identically. The only
+difference is the name of the program on the first line.
+
+#### `phylip`, `phylips` formats
+
+If the first line of the input starts with two integers, assume that
+they are _nseq_ and _alen_, the number of sequences and number of
+alignment columns for a Phylip-format alignment that follows. If we
+have a suffix and it is `.ph`, `.phy`, or `.phyi`, guess `phylip`; if
+it is `.phys`, guess `phylips`. In both cases, the name width is
+assumed to be the Phylip standard 10.
+
+Otherwise the guesser then looks deeper into the input to distinguish
+interleaved from sequential variants of the format, and to check
+whether the input is using the standard 10-character Phylip name width
+or a noncanonical width:
+
+ * If the file is consistent with interleaved format, it is called
+ `phylip` format. The standard 10 character namewidth is tried first,
+ and if that doesn't work, a nonstandard namewidth is determined.
+
+ * else, if the file is consistent with sequential format, it is
+ called `phylips` format. The standard 10 character namewidth is
+ tried first; if that fails, a nonstandard namewidth is determined.
+
+It is possible to construct pathological files that are consistent
+with both interleaved and sequential formats. If you're working with
+sequential Phylip files and you need to guarantee accuracy, use a
+command line option like `--informat phylips`.
+
+
+#### `selex`, `psiblast` formats
+
+If the first line of the input doesn't conform to any of the formats
+above, and we have a suffix `.slx`, guess `selex`; if we have a suffix `.pb`, guess
+`psiblast`.
+
+Otherwise the guesser looks deeper, and tests for whether the input
+consistent with SELEX format; if it is, guess `selex`.
+
+Because PSI-BLAST is a strict subset, any file consistent with SELEX
+format will be guessed to be _selex_; reading a _psiblast_ file as
+_selex_ is harmless. If you have a legitimate _psiblast_ file and you
+want to enforce stricter parsing, use a `.pb` file suffix on it, or
+use a commandline option like `--informat psiblast` to bypass the
+guesser.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/esl_msafile2.c b/esl_msafile2.c
new file mode 100644
index 0000000..dcae0e1
--- /dev/null
+++ b/esl_msafile2.c
@@ -0,0 +1,1481 @@
+/* Memory-efficient multiple sequence alignment i/o from Pfam format
+ *
+ * Legacy interface, now that ESL_MSAFILE is rewritten. Just enough
+ * of the old interface is retained to support --small option in
+ * various tools, for reading Pfam format in memory-efficient ways.
+ *
+ * Table of contents:
+ * 1. The ESL_MSAFILE2 object
+ * 2. Memory efficient read/write in Pfam format
+ * 3. Legacy Stockholm parsing tools
+ * 4. Unit tests
+ * 5. Test driver
+ * 6. Copyright and license information.
+ *
+ * to-do:
+ * :: add memory-efficient interface in ESL_MSAFILE
+ * :: add memory-efficient ESL_MSA w/ API
+ * :: add space-efficient MSA file format
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "esl_msa.h" /* ESL_MSA structure */
+#include "esl_msafile.h" /* preferred msafile interface, inc. fmt codes shared w/ ESL_MSAFILE2 */
+#include "esl_msafile2.h" /* legacy ESL_MSAFILE2 interface */
+#include "esl_vectorops.h"
+#include "esl_wuss.h"
+
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h" /* digital alphabet */
+#endif
+#ifdef eslAUGMENT_KEYHASH
+#include "esl_keyhash.h" /* string hashes, for mapping unique seq names */
+#endif
+#ifdef eslAUGMENT_SSI
+#include "esl_ssi.h" /* indexing large flatfiles on disk */
+#endif
+
+static int msafile2_getline(ESL_MSAFILE2 *afp);
+static int is_blankline(char *s);
+static int parse_gf(ESL_MSA *msa, char *buf);
+static int parse_gc(ESL_MSA *msa, char *buf);
+static int parse_comment(ESL_MSA *msa, char *buf);
+
+/*****************************************************************
+ *# 1. The ESL_MSAFILE2 object
+ *****************************************************************/
+
+static int msafile2_open(const char *filename, const char *env, ESL_MSAFILE2 **ret_afp);
+
+/* Function: esl_msafile2_Open()
+ * Synopsis: Open an MSA file for small-memory input.
+ *
+ * Purpose: Open an alignment database file <filename>, which must be
+ * in Pfam format (<eslMSAFILE_PFAM>), and prepare for
+ * reading information through the legacy small-memory
+ * interface. Return the opened file pointer in <ret_msafp>.
+ *
+ * There are one or two special cases for <filename>. If
+ * <filename> is "-", then the alignment is read from
+ * <stdin>. If <filename> ends in ".gz", then the file is
+ * assumed to be compressed by gzip, and it is opened as a
+ * pipe from <gzip -dc>. (Auto-decompression of gzipp'ed files
+ * is only available on POSIX-compliant systems w/ popen(), when
+ * <HAVE_POPEN> is defined at compile-time.)
+ *
+ * If <env> is non-NULL, then we look for <filename> in
+ * one or more directories in a colon-delimited list
+ * that is the value of the environment variable <env>.
+ * For example, if we had
+ * <setenv HMMERDB /nfs/db/Pfam:/nfs/db/Rfam>
+ * in the environment, a profile HMM application
+ * might pass "HMMERDB" as <env>.
+ *
+ * Returns: <eslOK> on success, and <ret_msafp> is set to point at
+ * an open <ESL_MSAFILE2>. Caller frees this file pointer with
+ * <esl_msafile2_Close()>.
+ *
+ * Returns <eslENOTFOUND> if <filename> cannot be opened.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ * Note: Implemented as a wrapper around msafile2_open(), because
+ * esl_msafile2_OpenDigital() shares almost all the same code.
+ */
+int
+esl_msafile2_Open(const char *filename, const char *env, ESL_MSAFILE2 **ret_afp)
+{
+ return msafile2_open(filename, env, ret_afp);
+}
+
+/* Function: esl_msafile2_Close()
+ * Synopsis: Closes an open MSA file.
+ *
+ * Purpose: Close an open <ESL_MSAFILE2>.
+ */
+void
+esl_msafile2_Close(ESL_MSAFILE2 *afp)
+{
+ if (afp == NULL) return;
+
+#ifdef HAVE_POPEN /* gzip functionality */
+ if (afp->do_gzip && afp->f != NULL) pclose(afp->f);
+#endif
+ if (!afp->do_gzip && ! afp->do_stdin && afp->f != NULL) fclose(afp->f);
+ if (afp->fname != NULL) free(afp->fname);
+ if (afp->buf != NULL) free(afp->buf);
+#ifdef eslAUGMENT_SSI
+ if (afp->ssi != NULL) esl_ssi_Close(afp->ssi);
+#endif /* eslAUGMENT_SSI*/
+ if (afp->msa_cache != NULL) esl_msa_Destroy(afp->msa_cache);
+ free(afp);
+}
+
+
+
+
+#ifdef eslAUGMENT_ALPHABET
+/* Function: esl_msafile2_OpenDigital()
+ * Synopsis: Open an msa file for digital input.
+ *
+ * Purpose: Same as <esl_msafile2_Open()>, except the alignment file
+ * will be read into a digitized internal representation,
+ * using internal alphabet <abc>, rather than the default
+ * internal ASCII text representation.
+ *
+ * The file must be in Pfam format (<eslMSAFILE_PFAM>).
+ *
+ * Args: abc - pointer to internal alphabet
+ * filename - name of alignment data file to open;
+ * if "*.gz", attempt to read through <gzip -dc> using <popen()>;
+ * or "-" for stdin
+ * env - NULL, or the name of an environment variable from which
+ * to retrieve a colon-delimited directory list to search
+ * for <filename> in. (e.g. "HMMERDB")
+ * ret_msafp - RETURN: open <ESL_MSAFILE2>.
+ *
+ * Returns: <eslOK> on success, and <ret_msafp> is set to point at
+ * an open <ESL_MSAFILE2>. Caller frees this file pointer with
+ * <esl_msafile2_Close()>.
+ *
+ * <eslENOTFOUND> if <filename> cannot be opened;
+ * <eslEFORMAT> if <filename> doesn't seem to be in Pfam format.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEINVAL> if format autodetection is attempted on
+ * stdin or a gzip -dc pipe.
+ */
+int
+esl_msafile2_OpenDigital(const ESL_ALPHABET *abc, const char *filename,
+ const char *env, ESL_MSAFILE2 **ret_msafp)
+{
+ ESL_MSAFILE2 *msafp;
+ int status;
+
+ if ((status = msafile2_open(filename, env, &msafp)) != eslOK) return status;
+
+ msafp->abc = abc;
+ msafp->do_digital = TRUE;
+
+ *ret_msafp = msafp;
+ return eslOK;
+}
+#endif /*eslAUGMENT_ALPHABET*/
+
+/* msafile2_open():
+ * this is the routine that actually opens an ESL_MSAFILE2;
+ * esl_msafile2_Open() and esl_msafile2_OpenDigital() are wrappers around it.
+ */
+static int
+msafile2_open(const char *filename, const char *env, ESL_MSAFILE2 **ret_afp)
+{
+ ESL_MSAFILE2 *afp = NULL;
+ char *ssifile = NULL;
+ char *envfile = NULL;
+ char *cmd = NULL;
+ int n = strlen(filename);
+ int status;
+
+ ESL_ALLOC(afp, sizeof(ESL_MSAFILE2));
+ afp->f = NULL;
+ afp->fname = NULL;
+ afp->linenumber = 0;
+ afp->errbuf[0] = '\0';
+ afp->buf = NULL;
+ afp->buflen = 0;
+ afp->do_gzip = FALSE;
+ afp->do_stdin = FALSE;
+ afp->format = eslMSAFILE_PFAM; /* legacy interface is stripped down to support ONLY --small, Pfam */
+ afp->do_digital = FALSE;
+ afp->abc = NULL;
+ afp->ssi = NULL;
+ afp->msa_cache = NULL;
+
+ if (strcmp(filename, "-") == 0)
+ {
+ afp->f = stdin;
+ afp->do_stdin = TRUE;
+ if ((status = esl_strdup("[STDIN]", -1, &(afp->fname))) != eslOK) goto ERROR;
+ }
+#ifdef HAVE_POPEN
+ /* popen(), pclose() aren't portable to non-POSIX systems;
+ * disable this section in strict ANSI C mode.
+ */
+ /* tricky: if n= length of a string s, then
+ * s+n-i repositions pointer s at the last i chars
+ * of the string.
+ */
+ else if (n > 3 && strcmp(filename+n-3, ".gz") == 0)
+ {
+ /* Note that popen() will return "successfully"
+ * if file doesn't exist, because gzip works fine
+ * and prints an error! So we have to check for
+ * existence of file ourself.
+ */
+ if (! esl_FileExists(filename)) { status = eslENOTFOUND; goto ERROR; }
+ ESL_ALLOC(cmd, sizeof(char) * (n+1+strlen("gzip -dc ")));
+ sprintf(cmd, "gzip -dc %s", filename);
+ if ((afp->f = popen(cmd, "r")) == NULL) { status = eslENOTFOUND; goto ERROR; }
+ if ((status = esl_strdup(filename, n, &(afp->fname))) != eslOK) goto ERROR;
+ afp->do_gzip = TRUE;
+ }
+#endif /*HAVE_POPEN*/
+ else /* Normal file open or env file open: set ssifile */
+ {
+ /* When we open a file, it may be either in the current
+ * directory, or in the directory indicated by the env
+ * argument - and we construct an SSI filename accordingly.
+ * (Whether or not we're SSI augmented, in fact, for simplicity.)
+ */
+ if ((afp->f = fopen(filename, "r")) != NULL)
+ {
+ if ((status = esl_strdup(filename, n, &ssifile)) != eslOK) goto ERROR;
+ if ((status = esl_strcat(&ssifile, n, ".ssi", 4)) != eslOK) goto ERROR;
+ if ((status = esl_strdup(filename, n, &(afp->fname))) != eslOK) goto ERROR;
+ }
+ else if (esl_FileEnvOpen(filename, env, &(afp->f), &envfile) == eslOK)
+ {
+ if ((status = esl_strdup(envfile, n, &ssifile)) != eslOK) goto ERROR;
+ if ((status = esl_strcat(&ssifile, n, ".ssi", 4)) != eslOK) goto ERROR;
+ if ((status = esl_strdup(envfile, n, &(afp->fname))) != eslOK) goto ERROR;
+ }
+ else
+ { status = eslENOTFOUND; goto ERROR;}
+ }
+
+#ifdef eslAUGMENT_SSI
+ /* If augmented by SSI indexing:
+ * Open the SSI index file. If it doesn't exist, or
+ * it's corrupt, or some error happens, afp->ssi stays NULL.
+ * We should warn, probably, or provide some way for caller to
+ * to know that we've opened the index successfully or not.
+ */
+ esl_ssi_Open(ssifile, &(afp->ssi));
+#endif
+
+ if (envfile != NULL) free(envfile);
+ if (ssifile != NULL) free(ssifile);
+ if (cmd != NULL) free(cmd);
+ *ret_afp = afp;
+ return eslOK;
+
+ ERROR:
+ if (envfile != NULL) free(envfile);
+ if (ssifile != NULL) free(ssifile);
+ if (cmd != NULL) free(cmd);
+ if (afp != NULL) esl_msafile2_Close(afp);
+ *ret_afp = NULL;
+ return status;
+}
+/*--------------- end, ESL_MSAFILE2 object ----------------------*/
+
+/*------------------ end, digital mode -------------------------*/
+
+
+/******************************************************************************
+ * 2. Memory efficient routines for PFAM format
+ *****************************************************************************/
+
+static int get_pp_idx(ESL_ALPHABET *abc, char ppchar);
+static int gapize_string(char *src_str, int64_t src_len, int64_t dst_len, int *ngapA, char gapchar, char **ret_dst_str);
+static void shrink_string(char *str, const int *useme, int len);
+static int determine_spacelen(char *s);
+
+/* Function: esl_msafile2_ReadInfoPfam()
+ * Synopsis: Read Pfam formatted MSA information but not sequence data.
+ *
+ * Purpose: Read the next alignment from an open Stockholm Pfam
+ * (non-interleaved, one line per seq) format alignment file
+ * <afp> and store all non-sequence information (comments,
+ * GF annotation and GC annotation) in a new msa object.
+ *
+ * This function is not as rigorous about validating the
+ * input msa as the other read functions that store the full
+ * alignment. Here, we only verify that there is only one
+ * line for the first sequence read. Verifying that all
+ * sequences are only one line would require storing and
+ * looking up all sequence names.
+ *
+ * Many optional return values (<opt_*>) allow this function
+ * to serve the diverse needs of the miniapps that can run
+ * in a memory-efficient mode (esl-alimerge, esl-alimask,
+ * esl-alistat, esl-ssdraw). For any that are unwanted, pass
+ * <NULL>.
+ *
+ * Args: afp - open alignment file pointer
+ * listfp - if non-NULL, dump each sequence name we read
+ * to listfp, separated by newlines
+ * abc - alphabet to use, only nec and used if one
+ * of the opt_*_ct arrays is non-NULL
+ * known_alen - known length of the alignment, -1 if unknown
+ * must not be -1, if known_rf != NULL or
+ * known_ss_cons != NULL.
+ * known_rf - known RF annot. (msa->rf) for this alignment,
+ * might be known from prev call of this func,
+ * for example. NULL if unknown.
+ * known_ss_cons - the known SS_cons annotation (msa->ss_cons)
+ * for this alignment, NULL if unknown.
+ * ret_msa - RETURN: msa with comments, GC, GF
+ * annotation but no sequence info (nor GS, GR),
+ * pass NULL if not wanted.
+ * opt_nseq - optRETURN: number of sequences in msa
+ * opt_alen - optRETURN: length of first aligned sequence
+ * opt_ngs - optRETURN: number of GS lines in alignment
+ * opt_maxname - optRETURN: maximum seqname length
+ * opt_maxgf - optRETURN: maximum GF tag length
+ * opt_maxgc - optRETURN: maximum GC tag length
+ * opt_maxgr - optRETURN: maximum GR tag length
+ * opt_abc_ct - optRETURN: [0..apos..alen-1][0..abc->K]
+ * per position count of each symbol in abc over all seqs
+ * opt_pp_ct - optRETURN: [0..apos..alen-1][0..11],
+ * per position count of PPs over all seqs,
+ * [11] is gaps, [10] is '*', [0-9] are '0'-'9'
+ * opt_bp_ct - optRETURN: [0..apos..alen-1][0..abc->K-1][0..abc->K-1]
+ * per position count of each possible basepair
+ * in alignment, for pair apos:apos2, where
+ * apos < apos2 and apos:apos2 form a basepair
+ * in <known_ss_cons>. If non-NULL, <known_ss_cons>
+ * must be non-NULL.
+ * opt_spos_ct - optRETURN: [0..apos..alen-1] per position count
+ * of first nongap residue in each sequence,
+ * ex: opt_spos_ct[100] = x means x seqs have their
+ * first nongap residue at position 100
+ * opt_epos_ct - optRETURN: [0..apos..alen-1] same as opt_spos_ct,
+ * except for final position instead of first
+ *
+ * Returns: <eslOK> on success. Returns <eslEOF> if there are no more
+ * alignments in <afp>, and <ret_msa> is set to NULL and
+ * <opt_*> are set to 0.
+ * <eslEFORMAT> if parse fails because of a file format
+ * problem, in which case <afp->errbuf> is set to contain a
+ * formatted message that indicates the cause of the
+ * problem, <ret_msa> is set to <NULL> and <opt_*> are set
+ * to 0.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ *
+ * Xref: ~nawrockie/notebook/9_1206_esl_msa_mem_efficient/
+ */
+int
+esl_msafile2_ReadInfoPfam(ESL_MSAFILE2 *afp, FILE *listfp, ESL_ALPHABET *abc, int64_t known_alen, char *known_rf, char *known_ss_cons, ESL_MSA **ret_msa,
+ int *opt_nseq, int64_t *opt_alen, int *opt_ngs, int *opt_maxname, int *opt_maxgf, int *opt_maxgc, int *opt_maxgr,
+ double ***opt_abc_ct, double ***opt_pp_ct, double ****opt_bp_ct, int **opt_spos_ct, int **opt_epos_ct)
+{
+ char *s; /* pointer to current character in afp */
+ int status; /* easel status code */
+ int status2; /* another easel status code */
+ ESL_MSA *msa = NULL; /* the msa we're creating */
+ int nseq = 0; /* number of sequences read */
+ int64_t alen = -1; /* length of the alignment */
+ int ngs = 0; /* number of GS lines read */
+ int maxname = 0; /* max length seq name */
+ int maxgf = 0; /* max length GF tag */
+ int maxgc = 0; /* max length GC tag */
+ int maxgr = 0; /* max length GR tag */
+ char *seqname; /* ptr to a sequence name */
+ int namelen; /* length of a sequence name */
+ char *first_seqname = NULL; /* name of first sequence read */
+ char *gf, *gc, *gr; /* for storing '#=GF', '#=GC', '#=GR', temporarily */
+ char *tag; /* a GC or GR tag */
+ int taglen; /* length of a tag */
+ char *text; /* text string */
+ int textlen; /* length of text string */
+ int i, x; /* counters */
+ int j; /* position for a right half of a bp */
+ int apos; /* counter over alignment positions */
+ double **abc_ct = NULL; /* [0..alen-1][0..abc->K] per position count of each residue in abc and gaps over all seqs */
+ double ***bp_ct = NULL; /* [0..alen-1][0..abc->Kp][0..abc->Kp], count of each possible base pair at each position, over all sequences, missing and nonresidues are *not counted*
+ base pairs are indexed by 'i' for a base pair between positions i and j, where i < j. */
+ int nppvals = 12; /* '0'-'9' = 0-9, '*' = 10, gap = '11' */
+ double **pp_ct = NULL; /* [0..alen-1][0..nppvals-1] per position count of each possible PP char over all seqs */
+ int ppidx; /* index for 2nd dim of pp_ct array */
+ int *spos_ct = NULL; /* [0..alen-1] number of seqs that start (have first nongap residue) at each position */
+ int *epos_ct = NULL; /* [0..alen-1] number of seqs that end (have final nongap residue) at each position */
+ ESL_DSQ *tmp_dsq = NULL; /* temporary digitized sequence, only used if opt_abc_ct != NULL */
+ int *a2rf_map = NULL; /* [0..apos..known_alen-1] = rfpos, nongap RF position apos maps to,
+ * -1 if apos is not a nongap RF position */
+ int *ct = NULL; /* 0..known_alen-1 base pair partners array for known_ss_cons */
+ char *ss_nopseudo = NULL; /* no-pseudoknot version of known_ss_cons */
+
+ if(afp->format != eslMSAFILE_PFAM) ESL_EXCEPTION(eslEINCONCEIVABLE, "only non-interleaved (1 line /seq, Pfam) Stockholm formatted files can be read in small memory mode");
+ if(opt_abc_ct != NULL && abc == NULL) ESL_FAIL(eslEINVAL, afp->errbuf, "contract violation, abc == NULL, opt_abc_ct != NULL");
+ if(opt_pp_ct != NULL && abc == NULL) ESL_FAIL(eslEINVAL, afp->errbuf, "contract violation, abc == NULL, opt_pp_ct != NULL");
+ if(opt_bp_ct != NULL && abc == NULL) ESL_FAIL(eslEINVAL, afp->errbuf, "contract violation, abc == NULL, opt_bp_ct != NULL");
+ if(opt_spos_ct != NULL && abc == NULL) ESL_FAIL(eslEINVAL, afp->errbuf, "contract violation, abc == NULL, opt_spos_ct != NULL");
+ if(opt_epos_ct != NULL && abc == NULL) ESL_FAIL(eslEINVAL, afp->errbuf, "contract violation, abc == NULL, opt_epos_ct != NULL");
+ if(opt_spos_ct != NULL && known_alen == -1) ESL_FAIL(eslEINVAL, afp->errbuf, "contract violation, opt_spos_ct != NULL, known_alen == -1");
+ if(opt_epos_ct != NULL && known_alen == -1) ESL_FAIL(eslEINVAL, afp->errbuf, "contract violation, opt_epos_ct != NULL, known_alen == -1");
+ if(opt_bp_ct != NULL && known_ss_cons == NULL) ESL_FAIL(eslEINVAL, afp->errbuf, "contract violation, known_ss_cons == NULL, opt_bp_ct != NULL");
+ if(known_rf != NULL && known_alen == -1) ESL_FAIL(eslEINVAL, afp->errbuf, "contract violation, known_rf != NULL, known_alen == -1");
+ if(known_ss_cons != NULL && known_alen == -1) ESL_FAIL(eslEINVAL, afp->errbuf, "contract violation, known_ss_cons != NULL, known_alen == -1");
+
+ if (feof(afp->f)) { status = eslEOF; goto ERROR; }
+ afp->errbuf[0] = '\0';
+
+ /* Preliminaries */
+ /* allocate and initialize spos_ct and epos_ct, if we'll return them */
+ if(opt_spos_ct != NULL || opt_epos_ct != NULL) {
+ ESL_ALLOC(spos_ct, sizeof(int) * known_alen);
+ ESL_ALLOC(epos_ct, sizeof(int) * known_alen);
+ esl_vec_ISet(spos_ct, known_alen, 0);
+ esl_vec_ISet(epos_ct, known_alen, 0);
+ }
+
+ /* if bp_ct != NULL, determine the ct array from the known_ss_cons, and allocate the bp_ct */
+ if(opt_bp_ct != NULL) { /* contract enforces that if this is true, known_ss_cons != NULL and known_alen != -1 */
+ /* get ct array which defines the consensus base pairs */
+ ESL_ALLOC(ct, sizeof(int) * (known_alen+1));
+ ESL_ALLOC(ss_nopseudo, sizeof(char) * (known_alen+1));
+ esl_wuss_nopseudo(known_ss_cons, ss_nopseudo);
+ if ((status = esl_wuss2ct(ss_nopseudo, known_alen, ct)) != eslOK) ESL_FAIL(status, afp->errbuf, "consensus structure string is inconsistent.");
+ ESL_ALLOC(bp_ct, sizeof(double **) * known_alen);
+ for(apos = 0; apos < known_alen; apos++) {
+ /* careful ct is indexed 1..alen, not 0..alen-1 */
+ if(ct[(apos+1)] > (apos+1)) { /* apos+1 is an 'i' in an i:j pair, where i < j */
+ ESL_ALLOC(bp_ct[apos], sizeof(double *) * (abc->Kp));
+ for(x = 0; x < abc->Kp; x++) {
+ ESL_ALLOC(bp_ct[apos][x], sizeof(double) * (abc->Kp));
+ esl_vec_DSet(bp_ct[apos][x], abc->Kp, 0.);
+ }
+ }
+ else { /* apos+1 is not an 'i' in an i:j pair, where i < j, set to NULL */
+ bp_ct[apos] = NULL;
+ }
+ }
+ }
+ /* end of preliminaries */
+
+ /* Initialize allocation of the MSA:
+ * We won't store any sequence information, so initial blocksize is
+ * 0 seqs of 0 length.
+ */
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->do_digital == TRUE && (msa = esl_msa_CreateDigital(afp->abc, 16, -1)) == NULL)
+ { status = eslEMEM; goto ERROR; }
+#endif
+ if (afp->do_digital == FALSE && (msa = esl_msa_Create(16, -1)) == NULL)
+ { status = eslEMEM; goto ERROR; }
+ if (msa == NULL)
+ { status = eslEMEM; goto ERROR; }
+
+ /* Check the magic Stockholm header line.
+ * We have to skip blank lines here, else we perceive
+ * trailing blank lines in a file as a format error when
+ * reading in multi-record mode.
+ */
+ do {
+ if ((status = msafile2_getline(afp)) != eslOK) goto ERROR; /* includes EOF */
+ } while (is_blankline(afp->buf));
+
+ if (strncmp(afp->buf, "# STOCKHOLM 1.", 14) != 0)
+ ESL_XFAIL(eslEFORMAT, afp->errbuf, "parse failed (line %d): missing \"# STOCKHOLM\" header", afp->linenumber);
+
+ /* Read the alignment file one line at a time.
+ */
+ while ((status2 = msafile2_getline(afp)) == eslOK)
+ {
+ s = afp->buf;
+ while (*s == ' ' || *s == '\t') s++; /* skip leading whitespace */
+
+ if (*s == '#') {
+ if(strncmp(s, "#=GF", 4) == 0)
+ {
+ if (ret_msa != NULL) {
+ if ((status = parse_gf(msa, s)) != eslOK)
+ ESL_XFAIL(status, afp->errbuf, "parse failed (line %d): bad #=GF line", afp->linenumber);
+ }
+ else if (opt_maxgf != NULL) { /* we need to parse out GF tag len to see if it is > maxgf */
+ s = afp->buf;
+ if (esl_strtok (&s, " \t\n\r", &gf) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GF line", afp->linenumber);
+ if (esl_strtok_adv(&s, " \t\n\r", &tag, &taglen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GF line", afp->linenumber);
+ maxgf = ESL_MAX(maxgf, taglen);
+ }
+ }
+
+ else if (strncmp(s, "#=GC", 4) == 0)
+ {
+ if (ret_msa != NULL) {
+ if ((status = parse_gc(msa, s)) != eslOK)
+ ESL_XFAIL(status, afp->errbuf, "parse failed (line %d): bad #=GC line", afp->linenumber);
+ }
+ else if (opt_maxgc != NULL) { /* we need to parse out GC tag len to see if it is > maxgc */
+ s = afp->buf;
+ if (esl_strtok (&s, " \t\n\r", &gc) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GC line", afp->linenumber);
+ if (esl_strtok_adv(&s, " \t\n\r", &tag, &taglen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GC line", afp->linenumber);
+ maxgc = ESL_MAX(maxgc, taglen);
+ }
+ }
+ else if (strncmp(s, "#=GS", 4) == 0)
+ {
+ ngs++;
+ }
+ else if (strncmp(s, "#=GR", 4) == 0)
+ {
+ if(opt_maxgr != NULL || opt_pp_ct != NULL) {
+ s = afp->buf;
+ if (esl_strtok (&s, " \t\n\r", &gr) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR line", afp->linenumber);
+ if (esl_strtok_adv(&s, " \t\n\r", &seqname, &namelen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR line", afp->linenumber);
+ if (esl_strtok_adv(&s, " \t\n\r", &tag, &taglen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR line", afp->linenumber);
+ maxgr = ESL_MAX(maxgr, taglen);
+ if(opt_pp_ct != NULL) {
+ if (strncmp(tag, "PP", 2) == 0) {
+ if (esl_strtok_adv(&s, " \t\n\r", &text, &textlen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR PP line", afp->linenumber);
+ /* verify, or set alignment length */
+ if(alen == -1) { /* first aligned text line, need to allocate pp_ct, and possibly abc_ct, spos_ct, epos_ct */
+ alen = textlen;
+ if(known_alen != -1 && known_alen != textlen) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): known alen (%" PRId64 " passed in) != actual alen (%d)", afp->linenumber, known_alen, textlen);
+ ESL_ALLOC(pp_ct, sizeof(double *) * alen);
+ for(apos = 0; apos < alen; apos++) {
+ ESL_ALLOC(pp_ct[apos], sizeof(double) * nppvals);
+ esl_vec_DSet(pp_ct[apos], nppvals, 0.);
+ }
+ if(opt_abc_ct != NULL || opt_bp_ct != NULL) {
+ ESL_ALLOC(tmp_dsq, (alen+2) * sizeof(ESL_DSQ));
+ }
+ if(opt_abc_ct != NULL) {
+ ESL_ALLOC(abc_ct, sizeof(double *) * alen);
+ for(apos = 0; apos < alen; apos++) {
+ ESL_ALLOC(abc_ct[apos], sizeof(double) * (abc->K+1));
+ esl_vec_DSet(abc_ct[apos], (abc->K+1), 0.);
+ }
+ }
+ }
+ else if(alen != textlen) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR PP line, len %d, expected %" PRId64, afp->linenumber, textlen, alen);
+ for(apos = 0; apos < alen; apos++) { /* update appropriate PP count */
+ if((ppidx = get_pp_idx(abc, text[apos])) == -1) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR PP char: %c", afp->linenumber, text[apos]);
+ pp_ct[apos][ppidx] += 1.;
+ }
+ }
+ }
+ }
+ }
+ else if (ret_msa != NULL && ((status = parse_comment(msa, s)) != eslOK)) {
+ ESL_XFAIL(status, afp->errbuf, "parse failed (line %d): bad comment line", afp->linenumber);
+ }
+ } /* end of 'if (*s == '#')' */
+ else if (strncmp(s, "//", 2) == 0) break; /* normal way out */
+ else if (*s == '\n' || *s == '\r') continue;
+ else { /* sequence line */
+ if(listfp != NULL || opt_maxname != NULL || opt_alen != NULL || opt_abc_ct != NULL || opt_spos_ct != NULL || opt_epos_ct != NULL) { /* we need to parse out the seqname */
+ s = afp->buf;
+ if (esl_strtok_adv(&s, " \t\n\r", &seqname, &namelen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad sequence line", afp->linenumber);
+ if (listfp != NULL) fprintf(listfp, "%s\n", seqname);
+ maxname = ESL_MAX(maxname, namelen);
+ if (opt_alen != NULL || opt_abc_ct != NULL || opt_spos_ct != NULL || opt_epos_ct != NULL) { /* we need to parse out the seq */
+ if (esl_strtok_adv(&s, " \t\n\r", &text, &textlen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad sequence line", afp->linenumber);
+ /* if first aligned seq read, store it's name, else see if it is an additional line of first aseq */
+ if(nseq == 0) {
+ if ((status = esl_strdup(seqname, -1, &(first_seqname))) != eslOK) goto ERROR;
+ }
+ else if(strcmp(first_seqname, seqname) == 0) { ESL_XFAIL(eslEFORMAT, afp->errbuf, "parse failed (line %d): two seqs with same name. Alignment may be in interleaved Stockholm. Reformat to Pfam with esl-reformat.", afp->linenumber); }
+ if(alen == -1) { /* first aligned text line, need to allocate pp_ct, and possibly abc_ct, spos_ct, epos_ct */
+ alen = textlen;
+ if(known_alen != -1 && known_alen != textlen) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): known alen (%" PRId64 " passed in) != actual alen (%d)", afp->linenumber, known_alen, textlen);
+ if(opt_abc_ct != NULL || opt_bp_ct != NULL) {
+ ESL_ALLOC(tmp_dsq, (alen+2) * sizeof(ESL_DSQ));
+ }
+ if(opt_abc_ct != NULL) {
+ ESL_ALLOC(abc_ct, sizeof(double *) * alen);
+ for(apos = 0; apos < alen; apos++) {
+ ESL_ALLOC(abc_ct[apos], sizeof(double) * (abc->K+1));
+ esl_vec_DSet(abc_ct[apos], (abc->K+1), 0.);
+ }
+ }
+ if(opt_pp_ct != NULL) {
+ ESL_ALLOC(pp_ct, sizeof(double *) * alen);
+ for(apos = 0; apos < alen; apos++) {
+ ESL_ALLOC(pp_ct[apos], sizeof(double) * nppvals);
+ esl_vec_DSet(pp_ct[apos], nppvals, 0.);
+ }
+ }
+ }
+ else if(alen != textlen) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad aligned seq line, len %d, expected %" PRId64, afp->linenumber, textlen, alen);
+ if(opt_abc_ct != NULL || opt_bp_ct != NULL) {
+ /* update appropriate abc and/or bp count. first, digitize the text */
+ if((status = esl_abc_Digitize(abc, text, tmp_dsq)) != eslOK) ESL_XFAIL(status, afp->errbuf, "small mem parse failed (line %d): problem digitizing sequence", afp->linenumber);
+ }
+ if(opt_abc_ct != NULL) {
+ for(apos = 0; apos < alen; apos++) { /* update appropriate abc count, careful, tmp_dsq ranges from 1..alen (not 0..alen-1) */
+ if((status = esl_abc_DCount(abc, abc_ct[apos], tmp_dsq[apos+1], 1.0)) != eslOK) ESL_XFAIL(status, afp->errbuf, "small mem parse failed (line %d): problem counting residue %d", afp->linenumber, apos+1);
+ }
+ }
+ if(opt_bp_ct != NULL) {
+ for(apos = 0; apos < alen; apos++) { /* update appropriate abc count, careful, tmp_dsq ranges from 1..alen (not 0..alen-1) */
+ if(bp_ct[apos] != NULL) { /* our flag for whether position (apos+1) is an 'i' in an i:j pair where i < j */
+ j = ct[apos+1] - 1; /* ct is indexed 1..alen */
+ bp_ct[apos][tmp_dsq[(apos+1)]][tmp_dsq[(j+1)]]++;
+ }
+ }
+ }
+ if(opt_spos_ct != NULL) {
+ for(apos = 0; apos < alen; apos++) { /* find first non-gap position */
+ if(! esl_abc_XIsGap(abc, tmp_dsq[apos+1])) {
+ spos_ct[apos]++;
+ break;
+ }
+ }
+ }
+ if(opt_epos_ct != NULL) { /* find final non-gap position */
+ for(apos = alen-1; apos >= 0; apos--) {
+ if(! esl_abc_XIsGap(abc, tmp_dsq[apos+1])) {
+ epos_ct[apos]++;
+ break;
+ }
+ }
+ }
+ }
+ }
+ nseq++;
+ }
+ }
+
+ /* If we saw a normal // end, we would've successfully read a line,
+ * so when we get here, status (from the line read) should be eslOK.
+ */
+ if (status2 != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "parse failed (line %d): didn't find // at end of alignment", afp->linenumber);
+
+ /* if we're returning maxgc and an msa, determine maxgc, which we didn't do above b/c we parsed GC lines with parse_gc()
+ * If msa != NULL, we already know maxgc */
+ if(ret_msa != NULL && opt_maxgc != NULL) {
+ for(i = 0; i < msa->ngc; i++) maxgc = ESL_MAX(maxgc, strlen(msa->gc_tag[i]));
+ if (msa->rf != NULL) maxgc = ESL_MAX(maxgc, 2); /* 2 == strlen("RF") */
+ if (msa->mm != NULL) maxgc = ESL_MAX(maxgc, 2); /* 2 == strlen("MM") */
+ if (msa->ss_cons != NULL) maxgc = ESL_MAX(maxgc, 7); /* 7 == strlen("SS_cons") */
+ if (msa->sa_cons != NULL) maxgc = ESL_MAX(maxgc, 7); /* 7 == strlen("SA_cons") */
+ if (msa->pp_cons != NULL) maxgc = ESL_MAX(maxgc, 7); /* 7 == strlen("PP_cons") */
+ }
+ /* same as for maxgc, but now for maxgf */
+ if(ret_msa != NULL && opt_maxgf != NULL) {
+ for(i = 0; i < msa->ngf; i++) maxgf = ESL_MAX(maxgf, strlen(msa->gf_tag[i]));
+ if (msa->name != NULL) maxgf = ESL_MAX(maxgf, 2); /* 2 == strlen("ID") */
+ if (msa->desc != NULL) maxgf = ESL_MAX(maxgf, 2); /* 2 == strlen("DE") */
+ if (msa->acc != NULL) maxgf = ESL_MAX(maxgf, 2); /* 2 == strlen("AC") */
+ if (msa->au != NULL) maxgf = ESL_MAX(maxgf, 2); /* 2 == strlen("AU") */
+ }
+
+ if (first_seqname) free(first_seqname);
+ if (tmp_dsq) free(tmp_dsq);
+ if (ct) free(ct);
+ if (ss_nopseudo) free(ss_nopseudo);
+ if (a2rf_map) free(a2rf_map);
+
+ if (ret_msa) *ret_msa = msa; else if (msa) esl_msa_Destroy(msa);
+ if (opt_nseq) *opt_nseq = nseq;
+ if (opt_alen) *opt_alen = alen;
+ if (opt_ngs) *opt_ngs = ngs;
+ if (opt_maxname) *opt_maxname = maxname;
+ if (opt_maxgf) *opt_maxgf = maxgf;
+ if (opt_maxgc) *opt_maxgc = maxgc;
+ if (opt_maxgr) *opt_maxgr = maxgr;
+ if (opt_abc_ct) *opt_abc_ct = abc_ct; else if (abc_ct) esl_Free2D((void **) abc_ct, alen);
+ if (opt_pp_ct) *opt_pp_ct = pp_ct; else if (pp_ct) esl_Free2D((void **) pp_ct, alen);
+ if (opt_bp_ct) *opt_bp_ct = bp_ct; else if (bp_ct) esl_Free3D((void ***) bp_ct, known_alen, abc->Kp);
+ if (opt_spos_ct) *opt_spos_ct = spos_ct; else if (spos_ct) free(spos_ct);
+ if (opt_epos_ct) *opt_epos_ct = epos_ct; else if (epos_ct) free(epos_ct);
+ return eslOK;
+
+ ERROR:
+ if (first_seqname) free(first_seqname);
+ if (tmp_dsq) free(tmp_dsq);
+ if (ct) free(ct);
+ if (ss_nopseudo) free(ss_nopseudo);
+ if (a2rf_map) free(a2rf_map);
+
+ if (msa) esl_msa_Destroy(msa);
+ if (pp_ct) esl_Free2D((void **) pp_ct, alen);
+ if (abc_ct) esl_Free2D((void **) abc_ct, alen);
+ if (bp_ct) esl_Free3D((void ***) bp_ct, known_alen, abc->Kp);
+ if (spos_ct) free(spos_ct);
+ if (epos_ct) free(epos_ct);
+
+ if (ret_msa) *ret_msa = NULL;
+ if (opt_nseq) *opt_nseq = 0;
+ if (opt_alen) *opt_alen = 0;
+ if (opt_ngs) *opt_ngs = 0;
+ if (opt_maxname) *opt_maxname = 0;
+ if (opt_maxgf) *opt_maxgf = 0;
+ if (opt_maxgc) *opt_maxgc = 0;
+ if (opt_maxgr) *opt_maxgr = 0;
+ if (opt_pp_ct) *opt_pp_ct = NULL;
+ if (opt_abc_ct) *opt_abc_ct = NULL;
+ if (opt_bp_ct) *opt_bp_ct = NULL;
+ if (opt_spos_ct) *opt_spos_ct = NULL;
+ if (opt_epos_ct) *opt_epos_ct = NULL;
+ return status;
+}
+
+#ifdef eslAUGMENT_KEYHASH
+/* Function: esl_msafile2_RegurgitatePfam()
+ * Synopsis: Read and write next Pfam formatted MSA without storing it.
+ *
+ * Purpose: Read and immediately write each line of a MSA after
+ * optionally modifying aligned data by either adding all
+ * gap columns or removing some columns. Do this without
+ * creating an msa object, so memory usage is minimized.
+ *
+ * The alignment file <afp> must be in Pfam format (1
+ * line/seq non-interleaved Stockholm). The <do_*> arguments
+ * specify which parts of the alignment to write. <useme>
+ * specifies which positions to keep in aligned strings, if
+ * NULL then all are kept. <add2me> specifies how many gap
+ * characters to add after each aligned position, if NULL
+ * then none are added. Only one of <useme> and <add2me>
+ * can be non-NULL.
+ *
+ * If one of the <seqs2regurg> or <seqs2skip> keyhashes are
+ * non-NULL, they specify names of sequences (and affiliated
+ * annotation) to output (<seqs2regurg>) or not output
+ * (<seqs2skip>). Only one of these may be non-NULL.
+ *
+ * <maxname>, <maxgf>, <maxgc> and <maxgr> specify the max
+ * length sequence name, GF tag, GC tag, and GR tag, and can
+ * be provided by a caller that knows their values, e.g. as
+ * revealed by a previous call to <esl_msafile2_ReadInfoPfam()>.
+ * If any are -1, the caller didn't know the value, and the
+ * spacing in the alignment file we read in will be
+ * preserved. An example of useful non -1 values is if we're
+ * merging multiple alignments into a single alignment, and
+ * the spacing of any given alignment should change when all
+ * alignments are considered (like what the esl-alimerge
+ * miniapp does).
+ *
+ * This function is not as rigorous about validating the
+ * input as the other read functions that store the full
+ * alignment. Here, we verify that there is only one line
+ * for the first sequence read (verifying that all sequences
+ * are only one line would require storing and looking up
+ * all sequence names), that each aligned data line (<aseq>,
+ * GC, GR) are all the same length. The aligned length must
+ * equal <exp_alen> if it is not passed in as -1 (indicating
+ * caller doesn't know alignment length). If <useme> or
+ * <add2me> is non-NULL, <exp_alen> must not be -1.
+ *
+ * Aligned sequence residues are not checked to make sure
+ * they are consistent with an alphabet, they are simply
+ * rewritten as they are read from the input file.
+ *
+ * Args: afp - open alignment file pointer
+ * ofp - output file pointer
+ * maxname - maximum length of a sequence name (-1 if unknown)
+ * maxgf - maximum length of a GF tag (-1 if unknown)
+ * maxgc - maximum length of a GC tag (-1 if unknown)
+ * maxgr - maximum length of a GR tag (-1 if unknown)
+ * do_header - TRUE to write magic Stockholm header at top to ofp
+ * do_trailer - TRUE to write '//' at end to ofp
+ * do_blanks - TRUE to regurgitate blank lines, FALSE not to
+ * do_comments - TRUE to write comments to ofp
+ * do_gf - TRUE to write GF annotation to ofp
+ * do_gs - TRUE to write GS annotation to ofp
+ * do_gc - TRUE to write GC annotation to ofp
+ * do_gr - TRUE to write GR annotation to ofp
+ * do_aseq - TRUE to write aligned sequences to ofp
+ * seqs2regurg - keyhash of names of the sequences to write, all others
+ * will not be written. Associated annotation (GS, GR)
+ * will be written for these sequences only. Must be NULL
+ * if seqs2skip is non-NULL (enforced by contract).
+ * If both are NULL all seqs are written.
+ * seqs2skip - keyhash of names of the sequences to skip (not write),
+ * all others will be written. Associated annotation (GS, GR)
+ * will not be written for these sequences. Must be NULL
+ * if seqs2regurg is NULL (enforced by contract).
+ * If both are NULL all seqs are written.
+ * useme - [0..apos..exp_alen-1] TRUE to include position apos in output of
+ * aligned data (GC,GR,aseq), FALSE to remove it, can be NULL
+ * add2me - [0..apos..exp_alen-1] number of all gaps to add after each
+ * position of aligned data (GC,GR,aseq), can be NULL
+ * exp_alen - expected alignment length, -1 if unknown, which
+ * is okay as long as useme == add2me == NULL
+ * gapchar2add - gap character, only relevant if add2me != NULL
+ * opt_nseq_read - RETURN: optional, number of aligned sequences read
+ * opt_nseq_regurged - RETURN: optional, number of aligned sequences regurgitated,
+ * same as opt_nseq_read unless seqs2regurg != NULL or
+ * seqs2skip != NULL.
+ *
+ * Returns: <eslOK> on success.
+ * Returns <eslEOF> if there are no more alignments in <afp>.
+ * <eslEFORMAT> if parse fails because of a file format problem,
+ * in which case <afp->errbuf> is set to contain a formatted message
+ * that indicates the cause of the problem.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ *
+ * Xref: ~nawrockie/notebook/9_1206_esl_msa_mem_efficient/
+ */
+int
+esl_msafile2_RegurgitatePfam(ESL_MSAFILE2 *afp, FILE *ofp, int maxname, int maxgf, int maxgc, int maxgr,
+ int do_header, int do_trailer, int do_blanks, int do_comments, int do_gf,
+ int do_gs, int do_gc, int do_gr, int do_aseq, ESL_KEYHASH *seqs2regurg,
+ ESL_KEYHASH *seqs2skip, int *useme, int *add2me, int exp_alen, char gapchar2add,
+ int *opt_nseq_read, int *opt_nseq_regurged)
+{
+ char *s = NULL;
+ int status;
+ int status2;
+ char *seqname = NULL;
+ char *first_seqname = NULL;
+ char *text = NULL;
+ char *gapped_text = NULL;
+ char *tag = NULL;
+ char *gf = NULL;
+ char *gc = NULL;
+ char *gs = NULL;
+ char *gr = NULL;
+ int curmargin, curmargin2, namelen, spacelen, spacelen2, textlen, taglen;
+ int gaps2addlen;
+ int margin; /* width of left hand side margin */
+ int flushpoint = 10000; /* number of lines read at which to flush ofp */
+ int nseq_read = 0;
+ int nseq_regurged = 0;
+
+ /* contract check */
+ if ( ofp == NULL) ESL_EXCEPTION(eslEINCONCEIVABLE, "ofp is NULL");
+ if ( afp->format != eslMSAFILE_PFAM) ESL_EXCEPTION(eslEINCONCEIVABLE, "only Pfam (1 line /seq) Stockholm formatted files allowed in small mem mode");
+ if(add2me != NULL && useme != NULL) ESL_EXCEPTION(eslEINCONCEIVABLE, "add2me and useme both non-NULL");
+ if((add2me != NULL || useme != NULL) && exp_alen == -1) ESL_EXCEPTION(eslEINCONCEIVABLE, "exp_alen == -1, but add2me or useme non-NULL");
+ if(seqs2regurg != NULL && seqs2skip != NULL) ESL_EXCEPTION(eslEINVAL, "seqs2regurg and seqs2skip both non-NULL, only one may be");
+
+ gaps2addlen = (add2me == NULL) ? 0 : esl_vec_ISum(add2me, (exp_alen+1));
+
+ margin = -1;
+ if (maxgf != -1 && maxgf < 2) maxgf = 2;
+ if (maxname != -1) margin = maxname+1;
+ if (maxgc > 0 && maxgc+6 > margin) margin = maxgc+6;
+ if (maxgr > 0 && maxname+maxgr+7 > margin) margin = maxname+maxgr+7;
+ /* if margin is still -1, we'll use the same spacing we read in from the file */
+
+ if (feof(afp->f)) { status = eslEOF; goto ERROR; }
+ afp->errbuf[0] = '\0';
+
+ /* Check the magic Stockholm header line.
+ * We have to skip blank lines here, else we perceive
+ * trailing blank lines in a file as a format error when
+ * reading in multi-record mode.
+ */
+ do {
+ if ((status = msafile2_getline(afp)) != eslOK) goto ERROR; /* includes EOF */
+ } while (is_blankline(afp->buf));
+
+ if (strncmp(afp->buf, "# STOCKHOLM 1.", 14) != 0)
+ ESL_XFAIL(eslEFORMAT, afp->errbuf, "parse failed (line %d): missing \"# STOCKHOLM\" header", afp->linenumber);
+ if(do_header) fprintf(ofp, "%s", afp->buf);
+
+ /* Read the alignment file one line at a time.
+ */
+ while ((status2 = msafile2_getline(afp)) == eslOK)
+ {
+ if(afp->linenumber % flushpoint == 0) fflush(ofp);
+ s = afp->buf;
+ while (*s == ' ' || *s == '\t') s++; /* skip leading whitespace */
+
+ if (*s == '#') {
+
+ if (strncmp(s, "#=GF", 4) == 0)
+ {
+ if (do_gf) {
+ if(maxgf == -1) { /* just print line as is */
+ fprintf(ofp, "%s", afp->buf);
+ }
+ else { /* parse line into temporary strings, then print it out with correct formatting */
+ s = afp->buf;
+ if (esl_strtok(&s, " \t\n\r", &gf) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GF line", afp->linenumber);
+ if (esl_strtok(&s, " \t\n\r", &tag) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GF line", afp->linenumber);
+ if (esl_strtok(&s, "\n\r", &text) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GF line", afp->linenumber);
+ fprintf(ofp, "#=GF %-*s %s\n", maxgf, tag, text);
+ }
+ }
+ }
+ else if (strncmp(s, "#=GC", 4) == 0)
+ {
+ if(do_gc) {
+ /* parse line into temporary strings */
+ s = afp->buf;
+ if (esl_strtok (&s, " \t\n\r", &gc) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GC line", afp->linenumber);
+ if (esl_strtok_adv(&s, " \t\n\r", &tag, &taglen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GC line", afp->linenumber);
+ spacelen = determine_spacelen(s);
+ if (esl_strtok_adv(&s, " \t\n\r", &text, &textlen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GC line", afp->linenumber);
+
+ /* verify alignment length */
+ if(exp_alen == -1) exp_alen = textlen;
+ else if(exp_alen != textlen) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GC line, len %d, expected %d", afp->linenumber, textlen, exp_alen);
+
+ /* determine margin length of sequence name field for output formatting */
+ curmargin = (margin == -1) ? taglen + spacelen : margin - 6;
+
+ /* output, after optionally removing some characters (if useme != NULL) or adding gaps (if add2me != NULL) (contract enforces only one can be non-null) */
+ if(useme != NULL) {
+ /* if this is a GC SS_cons line, remove broken basepairs first - only if it's in WUSS RNA format (NOT for a protein SS!) */
+ if (strncmp(tag, "SS_cons", 7) == 0 && afp->abc && (afp->abc->type == eslRNA || afp->abc->type == eslDNA)) {
+ if((status = esl_msa_RemoveBrokenBasepairsFromSS(text, afp->errbuf, textlen, useme)) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GC SS_cons line", afp->linenumber);
+ }
+ shrink_string(text, useme, exp_alen); /* this is done in place on text */
+ }
+ if(add2me != NULL) {
+ if((status = gapize_string(text, textlen, textlen + gaps2addlen, add2me, gapchar2add, &gapped_text)) != eslOK) goto ERROR;
+ fprintf(ofp, "#=GC %-*s %s\n", curmargin, tag, gapped_text);
+ free(gapped_text);
+ }
+ else {
+ fprintf(ofp, "#=GC %-*s %s\n", curmargin, tag, text);
+ }
+ }
+ }
+ else if (strncmp(s, "#=GS", 4) == 0)
+ {
+ /* we don't validate the sequence exists, this would require storing all seqnames */
+ if (do_gs) {
+ if(maxname == -1 && seqs2regurg == NULL) { /* just print line as is */
+ fprintf(ofp, "%s", afp->buf);
+ }
+ else { /* parse line into temporary strings, then print it out with correct formatting */
+ if((seqs2regurg == NULL && seqs2skip == NULL) ||
+ (seqs2regurg != NULL && (status = esl_keyhash_Lookup(seqs2regurg, seqname, -1, NULL)) == eslOK) ||
+ (seqs2skip != NULL && (status = esl_keyhash_Lookup(seqs2skip, seqname, -1, NULL)) == eslENOTFOUND))
+ { /* this if() will evaluate as TRUE if seqs2regurg and seqs2skip are both NULL, or the seqname exists in seqs2regurg or does not exist in seqs2skip, else it will return FALSE */
+ s = afp->buf;
+ if (esl_strtok(&s, " \t\n\r", &gs) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GS line", afp->linenumber);
+ if (esl_strtok(&s, " \t\n\r", &seqname) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GS line", afp->linenumber);
+ if (esl_strtok(&s, " \t\n\r", &tag) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GS line", afp->linenumber);
+ if (esl_strtok(&s, "\n\r", &text) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GS line", afp->linenumber);
+ fprintf(ofp, "#=GS %-*s %s %s\n", maxname, seqname, tag, text);
+ }
+ }
+ }
+ }
+ else if (strncmp(s, "#=GR", 4) == 0)
+ {
+ if(do_gr) {
+ /* parse line into temporary strings */
+ s = afp->buf;
+ if (esl_strtok (&s, " \t\n\r", &gr) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR line", afp->linenumber);
+ if (esl_strtok_adv(&s, " \t\n\r", &seqname, &namelen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR line", afp->linenumber);
+ spacelen = determine_spacelen(s);
+ if (esl_strtok_adv(&s, " \t\n\r", &tag, &taglen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR line", afp->linenumber);
+ spacelen2 = determine_spacelen(s);
+ if (esl_strtok_adv(&s, " \t\n\r", &text, &textlen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR line", afp->linenumber);
+
+ /* verify alignment length */
+ if(exp_alen == -1) exp_alen = textlen;
+ else if(exp_alen != textlen) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR line, len %d, expected %d", afp->linenumber, textlen, exp_alen);
+
+ /* determine length of fields for output formatting */
+ curmargin = (maxname == -1) ? namelen + spacelen : maxname;
+ curmargin2 = (maxname == -1) ? taglen + spacelen2 : margin - maxname - 7;
+
+ /* determine if we should regurgitate GR for this sequence or not */
+ if((seqs2regurg == NULL && seqs2skip == NULL) ||
+ (seqs2regurg != NULL && (status = esl_keyhash_Lookup(seqs2regurg, seqname, -1, NULL)) == eslOK) ||
+ (seqs2skip != NULL && (status = esl_keyhash_Lookup(seqs2skip, seqname, -1, NULL)) == eslENOTFOUND))
+ { /* this if() will evaluate as TRUE if seqs2regurg and seqs2skip are both NULL, or the seqname exists in seqs2regurg or does not exist in seqs2skip, else it will return FALSE */
+ /* output GR, after optionally removing some characters (if useme != NULL) or adding gaps (if add2me != NULL) (contract enforces only one can be non-null) */
+ if(useme != NULL) {
+ /* if this is a GR SS line, remove broken basepairs first */
+ if( strncmp(tag, "SS", 2) == 0 && afp->abc && (afp->abc->type == eslRNA || afp->abc->type == eslDNA)) {
+ if((status = esl_msa_RemoveBrokenBasepairsFromSS(text, afp->errbuf, textlen, useme)) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad #=GR SS line", afp->linenumber);
+ }
+ shrink_string(text, useme, exp_alen); /* this is done in place on text */
+ }
+ if(add2me != NULL) {
+ if((status = gapize_string(text, textlen, textlen + gaps2addlen, add2me, gapchar2add, &gapped_text)) != eslOK) goto ERROR;
+ fprintf(ofp, "#=GR %-*s %-*s %s\n", curmargin, seqname, curmargin2, tag, gapped_text);
+ free(gapped_text);
+ }
+ else {
+ fprintf(ofp, "#=GR %-*s %-*s %s\n", curmargin, seqname, curmargin2, tag, text);
+ }
+ }
+ }
+ }
+ else if (do_comments) fprintf(ofp, "%s", afp->buf); /* print comment line, if desired */
+ } /* end of 'if (*s == '#')' */
+ else if (strncmp(s, "//", 2) == 0) { if(do_trailer) fprintf(ofp, "%s", afp->buf); break; /* normal way out */ }
+ else if (*s == '\n' || *s == '\r') { if(do_blanks) { fprintf(ofp, "%s", afp->buf); } continue; }
+ else { /* sequence line */
+ if(do_aseq) {
+ /* parse line into temporary strings */
+ s = afp->buf;
+ if (esl_strtok_adv(&s, " \t\n\r", &seqname, &namelen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad sequence line", afp->linenumber);
+ spacelen = determine_spacelen(s);
+ if (esl_strtok_adv(&s, " \t\n\r", &text, &textlen, NULL) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad sequence line", afp->linenumber);
+
+ /* verify alignment length */
+ if((exp_alen != -1) && (exp_alen != textlen)) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): bad seq line, len %d, expected %d", afp->linenumber, textlen, exp_alen);
+
+ /* determine length of sequence name field for output formatting */
+ curmargin = (margin == -1) ? namelen + spacelen : margin-1;
+
+ /* make sure we haven't just read a second line of the first sequence in file (we must be in Pfam 1 line/seq file) */
+ if(nseq_read == 0) { if ((status = esl_strdup(seqname, -1, &(first_seqname))) != eslOK) goto ERROR; }
+ else if(strcmp(first_seqname, seqname) == 0) { ESL_XFAIL(eslEFORMAT, afp->errbuf, "parse failed (line %d): two seqs named %s. Alignment appears to be in Stockholm format. Reformat to Pfam with esl-reformat.", afp->linenumber, seqname); }
+ nseq_read++;
+
+ /* determine if we should regurgitate this sequence or not */
+ if((seqs2regurg == NULL && seqs2skip == NULL) ||
+ (seqs2regurg != NULL && (status = esl_keyhash_Lookup(seqs2regurg, seqname, -1, NULL)) == eslOK) ||
+ (seqs2skip != NULL && (status = esl_keyhash_Lookup(seqs2skip, seqname, -1, NULL)) == eslENOTFOUND))
+ { /* this if() will evaluate as TRUE if seqs2regurg and seqs2skip are both NULL, or the seqname exists in seqs2regurg or does not exist in seqs2skip, else it will return FALSE */
+ /* output sequence, after optionally removing some characters (if useme != NULL) or adding gaps (if add2me != NULL) (contract enforces only one can be non-null) */
+ nseq_regurged++;
+ if(useme != NULL) shrink_string(text, useme, exp_alen); /* this is done in place on text */
+ if(add2me != NULL) {
+ if((status = gapize_string(text, textlen, textlen + gaps2addlen, add2me, gapchar2add, &gapped_text)) != eslOK) goto ERROR;
+ fprintf(ofp, "%-*s %s\n", curmargin, seqname, gapped_text);
+ free(gapped_text);
+ }
+ else {
+ fprintf(ofp, "%-*s %s\n", curmargin, seqname, text);
+ }
+ }
+ }
+ }
+ }
+
+ /* If we saw a normal // end, we would've successfully read a line,
+ * so when we get here, status (from the line read) should be eslOK.
+ */
+ if (status2 != eslOK) ESL_XFAIL(eslEFORMAT, afp->errbuf, "small mem parse failed (line %d): didn't find // at end of alignment", afp->linenumber);
+ if (first_seqname != NULL) free(first_seqname);
+ if (opt_nseq_read != NULL) *opt_nseq_read = nseq_read;
+ if (opt_nseq_regurged != NULL) *opt_nseq_regurged = nseq_regurged;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+#endif
+
+/* get_pp_idx
+ *
+ * Given a GR PP or GC PP_cons character, return the appropriate index
+ * in a pp_ct[] vector.
+ * '0' return 0;
+ * '1' return 1;
+ * '2' return 2;
+ * '3' return 3;
+ * '4' return 4;
+ * '5' return 5;
+ * '6' return 6;
+ * '7' return 7;
+ * '8' return 8;
+ * '9' return 9;
+ * '*' return 10;
+ * gap return 11;
+ *
+ * Anything else (including missing or nonresidue) return -1;
+ *
+ * This mapping of PP chars to return values should probably be
+ * stored in some internal map structure somewhere, instead of
+ * only existing in this function as used by esl_msafile2_ReadInfoPfam().
+ */
+static int
+get_pp_idx(ESL_ALPHABET *abc, char ppchar)
+{
+ if(esl_abc_CIsGap(abc, ppchar)) return 11;
+ if(ppchar == '*') return 10;
+ if(ppchar == '9') return 9;
+ if(ppchar == '8') return 8;
+ if(ppchar == '7') return 7;
+ if(ppchar == '6') return 6;
+ if(ppchar == '5') return 5;
+ if(ppchar == '4') return 4;
+ if(ppchar == '3') return 3;
+ if(ppchar == '2') return 2;
+ if(ppchar == '1') return 1;
+ if(ppchar == '0') return 0;
+ return -1;
+}
+
+/* gapize_string
+ *
+ * Given a string, create a new one that is a copy of it,
+ * but with gaps added before each position (apos) as specified
+ * by ngapA[0..apos..len]. <gapchar> specifies the gap character
+ * to add.
+ *
+ * ngapA[0] - number of gaps to add before first posn
+ * ngapA[apos] - number of gaps to add before posn apos
+ * ngapA[len] - number of gaps to add after final posn
+ *
+ * ret_str is allocated here.
+ *
+ * Returns eslOK on success.
+ * eslEMEM on memory error.
+ */
+static int
+gapize_string(char *src_str, int64_t src_len, int64_t dst_len, int *ngapA, char gapchar, char **ret_dst_str)
+{
+ int status;
+ int src_apos = 0;
+ int dst_apos = 0;
+ int i;
+ char *dst_str;
+
+ ESL_ALLOC(dst_str, sizeof(char) * (dst_len+1));
+ dst_str[dst_len] = '\0';
+
+ /* add gaps before first position */
+ for(i = 0; i < ngapA[0]; i++) dst_str[dst_apos++] = gapchar;
+
+ /* add gaps after every position */
+ for(src_apos = 0; src_apos < src_len; src_apos++) {
+ dst_str[dst_apos++] = src_str[src_apos];
+ for(i = 0; i < ngapA[(src_apos+1)]; i++) dst_str[dst_apos++] = gapchar;
+ }
+
+ *ret_dst_str = dst_str;
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+/* shrink_string
+ *
+ * Remove some characters of a string in place.
+ * If useme[0..pos..len-1] == FALSE, remove position pos.
+ *
+ */
+static void
+shrink_string(char *str, const int *useme, int len)
+{
+ int opos, npos;
+
+ for (opos = 0, npos = 0; opos < len; opos++) {
+ if (useme[opos] == FALSE) continue;
+ str[npos++] = str[opos];
+ }
+ str[npos] = '\0';
+ return;
+}
+
+
+/* determine_spacelen
+ *
+ * Determine number of consecutive ' ' characters
+ * in the string pointed to by s.
+ */
+static int
+determine_spacelen(char *s)
+{
+ int spacelen = 0;
+ while (*s == ' ') { spacelen++; s++; }
+ return spacelen;
+}
+/*------------- end, memory efficient Pfam i/o -----------------*/
+
+
+
+/*****************************************************************
+ * 3. Legacy Stockholm parsing tools
+ *****************************************************************/
+
+/* msafile_getline():
+ * load the next line of <afp> into <afp->buf>.
+ * Returns eslOK on success, eslEOF on normal eof.
+ * Throws eslEMEM on alloc failure.
+ */
+static int
+msafile2_getline(ESL_MSAFILE2 *afp)
+{
+ int status;
+ status = esl_fgets(&(afp->buf), &(afp->buflen), afp->f);
+ afp->linenumber++;
+ return status;
+}
+
+
+static int
+is_blankline(char *s)
+{
+ for (; *s != '\0'; s++)
+ if (! isspace((int) *s)) return FALSE;
+ return TRUE;
+}
+
+/* Format of a GF line:
+ * #=GF <tag> <text>
+ * Returns eslOK on success; eslEFORMAT on parse failure.
+ * Throws eslEMEM on allocation failure.
+ */
+static int
+parse_gf(ESL_MSA *msa, char *buf)
+{
+ char *gf;
+ char *tag;
+ char *text;
+ char *tok;
+ char *s;
+ int n;
+ int status;
+
+ s = buf;
+ if (esl_strtok(&s, " \t\n\r", &gf) != eslOK) return eslEFORMAT;
+ if (esl_strtok(&s, " \t\n\r", &tag) != eslOK) return eslEFORMAT;
+
+ /* special case: accept a blank #=GF CC line. Otherwise, <s> is required. */
+ while (isspace(*s)) s++;
+ status = esl_strtok_adv(&s, "\n\r", &text, &n, NULL);
+ if (status == eslEOL) { if (strcmp(tag, "CC") != 0) return eslEFORMAT; }
+ else if (status != eslOK) { return eslEFORMAT; }
+
+ if (strcmp(tag, "ID") == 0) status = esl_strdup(text, n, &(msa->name));
+ else if (strcmp(tag, "AC") == 0) status = esl_strdup(text, n, &(msa->acc));
+ else if (strcmp(tag, "DE") == 0) status = esl_strdup(text, n, &(msa->desc));
+ else if (strcmp(tag, "AU") == 0) status = esl_strdup(text, n, &(msa->au));
+ else if (strcmp(tag, "GA") == 0)
+ { /* Pfam has GA1, GA2. Rfam just has GA1. */
+ s = text;
+ if ((esl_strtok(&s, " \t\n\r", &tok)) != eslOK)
+ return eslEFORMAT;
+ msa->cutoff[eslMSA_GA1] = atof(tok);
+ msa->cutset[eslMSA_GA1] = TRUE;
+ if ((esl_strtok(&s, " \t\n\r", &tok)) == eslOK)
+ {
+ msa->cutoff[eslMSA_GA2] = atof(tok);
+ msa->cutset[eslMSA_GA2] = TRUE;
+ }
+ status = eslOK;
+ }
+ else if (strcmp(tag, "NC") == 0)
+ {
+ s = text;
+ if ((esl_strtok(&s, " \t\n\r", &tok)) != eslOK)
+ return eslEFORMAT;
+ msa->cutoff[eslMSA_NC1] = atof(tok);
+ msa->cutset[eslMSA_NC1] = TRUE;
+ if ((esl_strtok(&s, " \t\n\r", &tok)) == eslOK)
+ {
+ msa->cutoff[eslMSA_NC2] = atof(tok);
+ msa->cutset[eslMSA_NC2] = TRUE;
+ }
+ status = eslOK;
+ }
+ else if (strcmp(tag, "TC") == 0)
+ {
+ s = text;
+ if ((esl_strtok(&s, " \t\n\r", &tok)) != eslOK)
+ return eslEFORMAT;
+ msa->cutoff[eslMSA_TC1] = atof(tok);
+ msa->cutset[eslMSA_TC1] = TRUE;
+ if ((esl_strtok(&s, "\t\n\r", &tok)) == eslOK)
+ {
+ msa->cutoff[eslMSA_TC2] = atof(tok);
+ msa->cutset[eslMSA_TC2] = TRUE;
+ }
+ status = eslOK;
+ }
+ else if (strcmp(tag, "CC") == 0 && text == NULL)
+ status = esl_msa_AddGF (msa, tag, -1, "", -1);
+ else
+ status = esl_msa_AddGF(msa, tag, -1, text, -1);
+
+ return status;
+}
+
+/* parse_gc():
+ * Format of a GC line:
+ * #=GC <tag> <aligned text>
+ */
+static int
+parse_gc(ESL_MSA *msa, char *buf)
+{
+ char *gc;
+ char *tag;
+ char *text;
+ char *s;
+ int len;
+ int status;
+
+ s = buf;
+ if (esl_strtok (&s, " \t\n\r", &gc) != eslOK) return eslEFORMAT;
+ if (esl_strtok (&s, " \t\n\r", &tag) != eslOK) return eslEFORMAT;
+ if (esl_strtok_adv(&s, " \t\n\r", &text, &len, NULL) != eslOK) return eslEFORMAT;
+
+ if (strcmp(tag, "SS_cons") == 0) status = esl_strcat(&(msa->ss_cons), -1, text, len);
+ else if (strcmp(tag, "SA_cons") == 0) status = esl_strcat(&(msa->sa_cons), -1, text, len);
+ else if (strcmp(tag, "PP_cons") == 0) status = esl_strcat(&(msa->pp_cons), -1, text, len);
+ else if (strcmp(tag, "RF") == 0) status = esl_strcat(&(msa->rf), -1, text, len);
+ else if (strcmp(tag, "MM") == 0) status = esl_strcat(&(msa->mm), -1, text, len);
+ else status = esl_msa_AppendGC(msa, tag, text);
+
+ return status;
+}
+
+
+/* parse_comment():
+ * comments are simply stored verbatim, not parsed
+ */
+static int
+parse_comment(ESL_MSA *msa, char *buf)
+{
+ char *s;
+ char *comment;
+
+ s = buf + 1; /* skip leading '#' */
+ if (*s == '\n' || *s == '\r') { *s = '\0'; comment = s; } /* deal with blank comment */
+ else if (esl_strtok(&s, "\n\r", &comment)!= eslOK) return eslEFORMAT;
+ return (esl_msa_AddComment(msa, comment, -1));
+}
+/*-------------- end, legacy stockholm parser -------------------*/
+
+/*****************************************************************
+ * 4. Unit tests
+ *****************************************************************/
+#ifdef eslMSAFILE2_TESTDRIVE
+
+/* write_known_pfam_msa()
+ * Write a known MSA to a tmpfile in Pfam Stockholm format.
+ */
+static void
+write_known_pfam_msa(FILE *ofp)
+{
+ fprintf(ofp, "# STOCKHOLM 1.0\n");
+ fprintf(ofp, "#=GF ID pfam-test\n");
+ fprintf(ofp, "#=GS seq2 DE seq2 is interesting\n");
+ fprintf(ofp, "seq1 --ACDEFGHIK~LMNPQRS-TVWYACDEFGHIKLMNPQRSTVWY~~~\n");
+ fprintf(ofp, "seq2 aaACDEFGHIK~LMNPQRS-TVWYACDEFGHIKLMNPQRSTVWYyyy\n");
+ fprintf(ofp, "seq3 aaACDEFGHIK~LMNPQRS-TVWYACDEFGHIKLMNPQRSTVWYyyy\n");
+ fprintf(ofp, "#=GC RF ..xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...\n");
+ fprintf(ofp, "//\n");
+ return;
+}
+
+
+static void
+utest_ReadInfoPfam(char *filename)
+{
+ char *msg = "ReadInfo() unit test failure";
+ ESL_MSAFILE2 *mfp = NULL;
+ ESL_MSA *msa = NULL;
+ int nseq = 0;
+ int64_t alen = 0;
+ int ngs = 0;
+ int maxname = 0;
+ int maxgf = 0;
+ int maxgc = 0;
+ int maxgr = 0;
+
+ if (esl_msafile2_Open(filename, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_msafile2_ReadInfoPfam(mfp, NULL, NULL, -1, NULL, NULL, &msa, &nseq, &alen, &ngs, &maxname, &maxgf, &maxgc, &maxgr, NULL, NULL, NULL, NULL, NULL) != eslOK) esl_fatal(msg);
+
+ if (msa->nseq != 0) esl_fatal("bad msa->nseq");
+ if (msa->alen != -1) esl_fatal("bad msa->alen");
+ if (nseq != 3) esl_fatal("bad nseq");
+ if (alen != 47) esl_fatal("bad alen");
+ if (ngs != 1) esl_fatal("bad ngs");
+ if (maxname != 4) esl_fatal("bad maxname");
+ if (maxgf != 2) esl_fatal("bad maxgf");
+ if (maxgc != 2) esl_fatal("bad maxgc");
+ if (maxgr != 0) esl_fatal("bad maxgr");
+ esl_msa_Destroy(msa);
+
+ if (esl_msafile2_ReadInfoPfam(mfp, NULL, NULL, -1, NULL, NULL, &msa, &nseq, &alen, &ngs, &maxname, &maxgf, &maxgc, &maxgr, NULL, NULL, NULL, NULL, NULL) != eslEOF) esl_fatal(msg);
+ if (msa != NULL) esl_fatal(msg);
+ if (nseq != 0 || alen != 0 || ngs != 0 || maxname != 0 || maxgf != 0 || maxgc != 0 || maxgr != 0) esl_fatal("bad nseq");
+
+ esl_msafile2_Close(mfp);
+}
+
+static void
+utest_RegurgitatePfam(char *filename)
+{
+ char *msg = "RegurgitatePfam() unit test failure";
+ ESL_MSAFILE2 *mfp = NULL;
+ ESL_MSAFILE *afp = NULL;
+ char tmpfile[16] = "esltmpXXXXXX";
+ FILE *fp = NULL;
+ ESL_MSA *msa1 = NULL;
+ ESL_MSA *msa2 = NULL;
+
+ /* regurgitate msa in filename to tmpfile (an msa structure will not be created) */
+ if (esl_msafile2_Open(filename, NULL, &mfp) != eslOK) esl_fatal(msg);
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal(msg);
+ if (esl_msafile2_RegurgitatePfam(mfp, fp,
+ -1, -1, -1, -1, /* maxname, maxgf, maxgc, maxgr unknown: output msa formatting will match input msa formatting */
+ TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, /* do_header, do_trailer, do_blanks, do_comments, do_gf, do_gs, do_gc, do_gr, do_aseq: print all components */
+ NULL, /* seqs2regurg: if non-NULL specifies which sequences to keep in output */
+ NULL, /* seqs2skip: if non-NULL specifies which sequences to skip in output */
+ NULL, /* useme: if non-NULL specifies which columns to keep in output */
+ NULL, /* add2me: if non-NULL specifies how many gap columns to add in output */
+ -1, /* expected alignment length, unknown (must not be if useme != NULL or add2me != NULL */
+ '.', /* gapchar2add, irrelevant since add2me is NULL */
+ NULL, /* don't return num seqs read */
+ NULL) /* don't return num seqs read */
+ != eslOK) esl_fatal(msg);
+ fclose(fp);
+ esl_msafile2_Close(mfp);
+
+ /* Using normal interface, read in msa from filename as msa1 */
+ if (esl_msafile_Open(NULL, filename, NULL, eslMSAFILE_PFAM, NULL, &afp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(afp, &msa1) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(afp);
+
+ /* Using normal interface, read in msa from tmpfile as msa2 */
+ if (esl_msafile_Open(NULL, tmpfile, NULL, eslMSAFILE_PFAM, NULL, &afp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_Read(afp, &msa2) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(afp);
+
+ if (esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ remove(tmpfile);
+}
+#endif /* eslMSAFILE2_TESTDRIVE */
+/*------------------ end, unit tests ----------------------------*/
+
+
+/*****************************************************************
+ * 5. Test driver
+ *****************************************************************/
+#ifdef eslMSAFILE2_TESTDRIVE
+
+/* compile: gcc -g -Wall -I. -L. -o esl_msafile2_utest -DeslMSAFILE2_TESTDRIVE esl_msafile2.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_msafile2_utest -DeslMSAFILE2_TESTDRIVE esl_msafile2.c -leasel -lm
+ * run: ./esl_msafile2_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_msafile2.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for legacy memory-efficient Pfam format input/output";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ FILE *fp = NULL;
+ char tmpfile[16] = "esltmpXXXXXX";
+
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal("failed to create tmpfile");
+ write_known_pfam_msa(fp);
+ fclose(fp);
+
+ utest_ReadInfoPfam(tmpfile);
+ utest_RegurgitatePfam(tmpfile);
+
+ remove(tmpfile);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+#endif /*eslMSAFILE2_TESTDRIVE*/
+/*----------------- end, test driver ----------------------------*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile2.h b/esl_msafile2.h
new file mode 100644
index 0000000..68ab4b6
--- /dev/null
+++ b/esl_msafile2.h
@@ -0,0 +1,86 @@
+/* Memory-efficient multiple sequence alignment i/o from Pfam format
+ *
+ * Legacy interface, now that ESL_MSAFILE is rewritten. Still need
+ * to support --small option in various tools, so the necessary parts
+ * of the old interface were moved here.
+ *
+ * To-do:
+ * :: add memory-efficient interface in ESL_MSAFILE
+ * :: add memory-efficient ESL_MSA w/ API
+ * :: add space-efficient MSA file format
+ */
+#ifndef eslMSAFILE2_INCLUDED
+#define eslMSAFILE2_INCLUDED
+
+#include "esl_msa.h" /* ESL_MSA structure */
+#include "esl_msafile.h" /* preferred msafile interface, inc. fmt codes shared w/ ESL_MSAFILE2 */
+
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h" /* digital alphabet */
+#endif
+#ifdef eslAUGMENT_KEYHASH
+#include "esl_keyhash.h" /* string hashes, for mapping unique seq names */
+#endif
+#ifdef eslAUGMENT_SSI
+#include "esl_ssi.h" /* indexing large flatfiles on disk */
+#endif
+
+/* Object: ESL_MSAFILE2
+ *
+ * Defines an alignment file that we open for reading,
+ * in our legacy version. See ESL_MSAFILE (esl_msafile.c) for the
+ * preferred version.
+ */
+typedef struct {
+ FILE *f; /* open file pointer */
+ char *fname; /* name of file. used for diagnostic output */
+ int linenumber; /* what line are we on in the file */
+ char errbuf[eslERRBUFSIZE]; /* buffer for holding parse error info */
+
+ char *buf; /* buffer for line input w/ sre_fgets() */
+ int buflen; /* current allocated length for buf */
+
+ int do_gzip; /* TRUE if f is "gzip -dc |" (will pclose(f))*/
+ int do_stdin; /* TRUE if f is stdin (won't close f) */
+ int format; /* format of alignment file we're reading */
+
+ int do_digital; /* TRUE to digitize seqs directly into ax */
+#if defined(eslAUGMENT_ALPHABET)
+ const ESL_ALPHABET *abc; /* AUGMENTATION (alphabet): digitized input */
+#else
+ void *abc;
+#endif
+
+#if defined(eslAUGMENT_SSI) /* AUGMENTATION: SSI indexing of an MSA db */
+ ESL_SSI *ssi; /* open SSI index file; or NULL, if none. */
+#else
+ void *ssi;
+#endif
+
+ ESL_MSA *msa_cache; /* occasional lookahead at next MSA; GuessAlphabet() */
+} ESL_MSAFILE2;
+
+
+
+/* 1. The ESL_MSAFILE2 object */
+extern int esl_msafile2_Open(const char *filename, const char *env, ESL_MSAFILE2 **ret_afp);
+#ifdef eslAUGMENT_ALPHABET
+extern int esl_msafile2_OpenDigital(const ESL_ALPHABET *abc, const char *filename, const char *env, ESL_MSAFILE2 **ret_afp);
+#endif
+extern void esl_msafile2_Close(ESL_MSAFILE2 *afp);
+
+/* 2. Memory efficient reading/writing in Pfam format (augmentation: keyhash, for regurgitating some but not all seqs) */
+extern int esl_msafile2_ReadInfoPfam(ESL_MSAFILE2 *afp, FILE *listfp, ESL_ALPHABET *abc, int64_t known_alen, char *known_rf, char *known_ss_cons, ESL_MSA **ret_msa,
+ int *opt_nseq, int64_t *opt_alen, int *opt_ngs, int *opt_maxname, int *opt_maxgf, int *opt_maxgc, int *opt_maxgr,
+ double ***opt_abc_ct, double ***opt_pp_ct, double ****opt_bp_ct, int **opt_spos_ct, int **opt_epos_ct);
+#ifdef eslAUGMENT_KEYHASH
+extern int esl_msafile2_RegurgitatePfam(ESL_MSAFILE2 *afp, FILE *ofp, int maxname, int maxgf, int maxgc, int maxgr,
+ int do_header, int do_trailer, int do_blanks, int do_comments, int do_gf,
+ int do_gs, int do_gc, int do_gr, int do_aseq, ESL_KEYHASH *seqs2regurg, ESL_KEYHASH *seqs2skip,
+ int *useme, int *add2me, int exp_alen, char gapchar2add, int *opt_nseq_read, int *opt_nseq_written);
+#endif
+
+#endif //eslMSAFILE2_INCLUDED
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_a2m.c b/esl_msafile_a2m.c
new file mode 100644
index 0000000..42dee28
--- /dev/null
+++ b/esl_msafile_a2m.c
@@ -0,0 +1,1049 @@
+/* I/O of multiple sequence alignments in A2M format (UCSC SAM)
+ *
+ * Contents:
+ * 1. API for reading/writing A2M format
+ * 2. Internal functions used by the A2M parser
+ * 3. Unit tests.
+ * 4. Test driver.
+ * 5. Examples.
+ * 6. License and copyright.
+ *
+ * Reference:
+ * http://compbio.soe.ucsc.edu/a2m-desc.html
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#include "esl_mem.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_a2m.h"
+
+#ifdef eslAUGMENT_ALPHABET
+static int a2m_padding_digital(ESL_MSA *msa, char **csflag, int *nins, int ncons);
+#endif
+static int a2m_padding_text (ESL_MSA *msa, char **csflag, int *nins, int ncons);
+
+/*****************************************************************
+ *# 1. API for reading/writing A2M format
+ *****************************************************************/
+
+
+/* Function: esl_msafile_a2m_SetInmap()
+ * Synopsis: Set input map specific for A2M format
+ *
+ * Purpose: Set the <afp->inmap> for A2M format.
+ *
+ * A2M ignores whitespace and periods (and ignoring
+ * periods makes us agnostic whether the input is
+ * "dotless" format or not). Make ' ', '\t', and
+ * '.' ignored.
+ *
+ * A2M format only allows - for a gap, so make
+ * all other Easel gap characters illegal on input.
+ *
+ * A2M format handles an 'O' specially: this indicates
+ * a FIM (free insertion module) to the SAM software.
+ * We ignore it.
+
+ * A2M allows ACDEFGHIKLMNPQRSTVWY for aa, plus XBZ.
+ * Unknown letters (including other ambig codes) are mapped
+ * to X. A2M allows ACGTU for nucleic, plus YRN. Unknown
+ * letters (including other ambig codes) are mapped to N.
+ * However, Easel enforces its normal input restrictions on
+ * residues: digital bioalphabets allow only valid residue
+ * symbols, and text mode allows any isalpha() character
+ * verbatim.
+ */
+int
+esl_msafile_a2m_SetInmap(ESL_MSAFILE *afp)
+{
+ int sym;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc)
+ {
+ for (sym = 0; sym < 128; sym++)
+ afp->inmap[sym] = afp->abc->inmap[sym];
+ afp->inmap[0] = esl_abc_XGetUnknown(afp->abc);
+ afp->inmap['_'] = eslDSQ_ILLEGAL;
+ afp->inmap['*'] = eslDSQ_ILLEGAL;
+ afp->inmap['~'] = eslDSQ_ILLEGAL;
+ }
+#endif
+ if (! afp->abc)
+ {
+ for (sym = 1; sym < 128; sym++)
+ afp->inmap[sym] = (isalpha(sym) ? sym : eslDSQ_ILLEGAL);
+ afp->inmap[0] = '?';
+ afp->inmap['-'] = '-';
+ }
+
+ afp->inmap[' '] = eslDSQ_IGNORED;
+ afp->inmap['\t'] = eslDSQ_IGNORED;
+ afp->inmap['.'] = eslDSQ_IGNORED;
+ afp->inmap['O'] = eslDSQ_IGNORED;
+ afp->inmap['o'] = eslDSQ_IGNORED;
+ return eslOK;
+}
+
+/* Function: esl_msafile_a2m_GuessAlphabet()
+ * Synopsis: Guess the alphabet of an open A2M MSA file.
+ *
+ * Purpose: Guess the alpbabet of the sequences in open
+ * A2M format MSA file <afp>.
+ *
+ * On a normal return, <*ret_type> is set to <eslDNA>,
+ * <eslRNA>, or <eslAMINO>, and <afp> is reset to its
+ * original position.
+ *
+ * Args: afp - open A2M format MSA file
+ * ret_type - RETURN: <eslDNA>, <eslRNA>, or <eslAMINO>
+ *
+ * Returns: <eslOK> on success.
+ * <eslENOALPHABET> if alphabet type can't be determined.
+ * In either case, <afp> is rewound to the position it
+ * started at.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslESYS> on failures of fread() or other system calls
+ */
+int
+esl_msafile_a2m_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type)
+{
+ int alphatype = eslUNKNOWN;
+ esl_pos_t anchor = -1;
+ int threshold[3] = { 500, 5000, 50000 }; /* we check after 500, 5000, 50000 residues; else we go to EOF */
+ int nsteps = 3;
+ int step = 0;
+ int nres = 0;
+ int x;
+ int64_t ct[26];
+ char *p;
+ esl_pos_t n, pos;
+ int status;
+
+ for (x = 0; x < 26; x++) ct[x] = 0;
+
+ anchor = esl_buffer_GetOffset(afp->bf);
+ if ((status = esl_buffer_SetAnchor(afp->bf, anchor)) != eslOK) { status = eslEINCONCEIVABLE; goto ERROR; } /* [eslINVAL] can't happen here */
+
+ while ( (status = esl_buffer_GetLine(afp->bf, &p, &n)) == eslOK)
+ {
+ while (n && isspace(*p)) { p++; n--; }
+ if (!n || *p == '>') continue;
+
+ for (pos = 0; pos < n; pos++)
+ if (isalpha(p[pos])) {
+ x = toupper(p[pos]) - 'A';
+ ct[x]++;
+ nres++;
+ }
+
+ /* try to stop early, checking after 500, 5000, and 50000 residues: */
+ if (step < nsteps && nres > threshold[step]) {
+ if ((status = esl_abc_GuessAlphabet(ct, &alphatype)) == eslOK) goto DONE; /* (eslENOALPHABET) */
+ step++;
+ }
+ }
+ if (status != eslEOF) goto ERROR; /* [eslEMEM,eslESYS,eslEINCONCEIVABLE] */
+ status = esl_abc_GuessAlphabet(ct, &alphatype); /* (eslENOALPHABET) */
+
+ /* deliberate flowthrough...*/
+ DONE:
+ esl_buffer_SetOffset(afp->bf, anchor); /* Rewind to where we were. */
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ *ret_type = alphatype;
+ return status;
+
+ ERROR:
+ if (anchor != -1) {
+ esl_buffer_SetOffset(afp->bf, anchor);
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ }
+ *ret_type = eslUNKNOWN;
+ return status;
+}
+
+
+/* Function: esl_msafile_a2m_Read()
+ * Synopsis: Read a UCSC A2M format alignment.
+ *
+ * Purpose: Read an MSA from an open <ESL_MSAFILE> <afp>, parsing
+ * for UCSC A2M (SAM) format. Create a new MSA,
+ * and return a ptr to it in <*ret_msa>. Caller is responsible
+ * for freeing this <ESL_MSA>.
+ *
+ * The <msa> has a reference line (<msa->rf[]>) that
+ * corresponds to the uppercase/lowercase columns in the
+ * alignment: consensus (uppercase) columns are marked 'X',
+ * and insert (lowercase) columns are marked '.' in the RF
+ * annotation line.
+ *
+ * This input parser can deal both with "dotless" A2M, and
+ * full A2M format with dots.
+ *
+ * Args: afp - open <ESL_MSAFILE>
+ * ret_msa - RETURN: newly parsed <ESL_MSA>
+ *
+ * Returns: <eslOK> on success. <*ret_msa> is set to the newly
+ * allocated MSA, and <afp> is at EOF.
+ *
+ * <eslEOF> if no (more) alignment data are found in
+ * <afp>, and <afp> is returned at EOF.
+ *
+ * <eslEFORMAT> on a parse error. <*ret_msa> is set to
+ * <NULL>. <afp> contains information sufficient for
+ * constructing useful diagnostic output:
+ * | <afp->errmsg> | user-directed error message |
+ * | <afp->linenumber> | line # where error was detected |
+ * | <afp->line> | offending line (not NUL-term) |
+ * | <afp->n> | length of offending line |
+ * | <afp->bf->filename> | name of the file |
+ * and <afp> is poised at the start of the following line,
+ * so (in principle) the caller could try to resume
+ * parsing.
+ *
+ * Throws: <eslEMEM> - an allocation failed.
+ * <eslESYS> - a system call such as fread() failed
+ * <eslEINCONCEIVABLE> - "impossible" corruption
+ * On these, <*ret_msa> is returned <NULL>, and the state of
+ * <afp> is undefined.
+ */
+int
+esl_msafile_a2m_Read(ESL_MSAFILE *afp, ESL_MSA **ret_msa)
+{
+ ESL_MSA *msa = NULL;
+ char **csflag = NULL; /* csflag[i][pos] is TRUE if aseq[i][pos] was uppercase consensus */
+ int *nins = NULL; /* # of inserted residues before each consensus col [0..ncons-1] */
+ int *this_nins = NULL; /* # of inserted residues before each consensus residue in this seq */
+ int nseq = 0;
+ int ncons = 0;
+ int idx;
+ int64_t thislen;
+ int64_t spos;
+ int this_ncons;
+ int cpos, bpos;
+ char *p, *tok;
+ esl_pos_t n, toklen;
+ int status;
+
+ ESL_DASSERT1( (afp->format == eslMSAFILE_A2M) );
+
+ afp->errmsg[0] = '\0';
+
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc && (msa = esl_msa_CreateDigital(afp->abc, 16, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+#endif
+ if (! afp->abc && (msa = esl_msa_Create( 16, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+ ESL_ALLOC(csflag, sizeof(char *) * msa->sqalloc);
+ for (idx = 0; idx < msa->sqalloc; idx++) csflag[idx] = NULL;
+
+ /* skip leading blank lines in file */
+ while ( (status = esl_msafile_GetLine(afp, &p, &n)) == eslOK && esl_memspn(afp->line, afp->n, " \t") == afp->n) ;
+ if (status != eslOK) goto ERROR; /* includes normal EOF */
+
+ /* tolerate sloppy space at start of name/desc line */
+ while (n && isspace(*p)) { p++; n--; }
+ if (*p != '>') ESL_XFAIL(eslEFORMAT, afp->errmsg, "expected A2M name/desc line starting with >");
+
+ do { /* for each record starting in '>': */
+ p++; n--; /* advance past > */
+
+ if ( (status = esl_memtok(&p, &n, " \t", &tok, &toklen)) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "no name found for A2M record");
+ if (nseq >= msa->sqalloc) {
+ int old_sqalloc = msa->sqalloc;
+ if ( (status = esl_msa_Expand(msa)) != eslOK) goto ERROR;
+ ESL_REALLOC(csflag, sizeof(char *) * msa->sqalloc);
+ for (idx = old_sqalloc; idx < msa->sqalloc; idx++) csflag[idx] = NULL;
+ }
+
+ if ( (status = esl_msa_SetSeqName (msa, nseq, tok, toklen)) != eslOK) goto ERROR;
+ if (n && (status = esl_msa_SetSeqDescription(msa, nseq, p, n)) != eslOK) goto ERROR;
+
+ /* now for each sequence line... */
+ thislen = 0; /* count of lowercase, uppercase, and '-': w/o dots, on first pass */
+ this_ncons = 0; /* count of uppercase + '-': number of consensus columns in alignment: must match for all seqs */
+ if (nseq) {
+ for (cpos = 0; cpos <= ncons; cpos++) // A little tricksy. <this_nins> is allocated on first seq, when nseq=0.
+ this_nins[cpos] = 0; // cppcheck gets confused and erroneously calls "possible null pointer deference"; ignore it.
+ }
+
+ while ( (status = esl_msafile_GetLine(afp, &p, &n)) == eslOK)
+ {
+ while (n && isspace(*p)) { p++; n--; } /* tolerate and skip leading whitespace on line */
+ if (n == 0) continue; /* tolerate and skip blank lines */
+ if (*p == '>') break;
+
+ ESL_REALLOC(csflag[nseq], sizeof(char) * (thislen + n + 1)); /* might be an overalloc by a bit, depending on whitespace on line */
+ if (nseq == 0) {
+ ESL_REALLOC(this_nins, sizeof(int) * (this_ncons + n + 1));
+ for (cpos = this_ncons; cpos <= this_ncons+n; cpos++)
+ this_nins[cpos] = 0;
+ }
+
+ for (spos = thislen, bpos = 0; bpos < n; bpos++)
+ {
+ if (p[bpos] == 'O') continue;
+ else if (isupper(p[bpos])) { csflag[nseq][spos++] = TRUE; this_ncons++; }
+ else if (islower(p[bpos])) { csflag[nseq][spos++] = FALSE; this_nins[this_ncons]++; }
+ else if (p[bpos] == '-') { csflag[nseq][spos++] = TRUE; this_ncons++; }
+ if (ncons && this_ncons > ncons) ESL_XFAIL(eslEFORMAT, afp->errmsg, "unexpected # of consensus residues, didn't match previous seq(s)");
+ }
+ csflag[nseq][spos] = TRUE; /* need a sentinel, because of the way the padding functions work */
+
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) { status = esl_abc_dsqcat(afp->inmap, &(msa->ax[nseq]), &thislen, p, n); }
+#endif
+ if (! msa->abc) { status = esl_strmapcat (afp->inmap, &(msa->aseq[nseq]), &thislen, p, n); }
+ if (status == eslEINVAL) ESL_XFAIL(eslEFORMAT, afp->errmsg, "one or more invalid sequence characters");
+ else if (status != eslOK) goto ERROR;
+ ESL_DASSERT1( (spos == thislen) );
+ }
+ if (status != eslOK && status != eslEOF) goto ERROR; /* exception thrown by esl_msafile_GetLine() */
+ /* status == OK: then *p == '>'. status == eslEOF: we're eof. status == anything else: error */
+ /* Finished reading a sequence record. */
+
+ if (nseq == 0)
+ {
+ ncons = this_ncons;
+ ESL_ALLOC(nins, sizeof(int) * (ncons+1));
+ for (cpos = 0; cpos <= ncons; cpos++)
+ nins[cpos] = this_nins[cpos];
+ }
+ else
+ {
+ if (this_ncons != ncons) ESL_XFAIL(eslEFORMAT, afp->errmsg, "unexpected # of consensus residues, didn't match previous seq(s)");
+ for (cpos = 0; cpos <= ncons; cpos++)
+ nins[cpos] = ESL_MAX(nins[cpos], this_nins[cpos]);
+ }
+ nseq++;
+ } while (status == eslOK);
+
+ /* Now we have nseq *unaligned* sequences in ax/aseq[0..nseq-1]; call the length slen, though we don't explicitly store it
+ * csflag[idx][spos] tells us whether each unaligned residue is an insertion or consensus, for spos==0..slen-1.
+ * nins[0..ncons] tells us the max number of inserted residues before each consensus column
+ * This is sufficient information to reconstruct each aligned sequence.
+ */
+ msa->nseq = nseq;
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) { if ((status = a2m_padding_digital(msa, csflag, nins, ncons)) != eslOK) goto ERROR; }
+#endif
+ if (!msa->abc) { if ((status = a2m_padding_text (msa, csflag, nins, ncons)) != eslOK) goto ERROR; }
+
+ if (( status = esl_msa_SetDefaultWeights(msa)) != eslOK) goto ERROR;
+
+ *ret_msa = msa;
+ free(nins);
+ free(this_nins);
+ for (idx = 0; idx < msa->nseq; idx++) free(csflag[idx]);
+ free(csflag);
+ return eslOK;
+
+ ERROR:
+ if (nins) free(nins);
+ if (this_nins) free(this_nins);
+ if (csflag) {
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (csflag[idx]) free(csflag[idx]);
+ free(csflag);
+ }
+ if (msa) esl_msa_Destroy(msa);
+ return status;
+}
+
+
+/* Function: esl_msafile_a2m_Write()
+ * Synopsis: Write an A2M (UCSC SAM) dotless format alignment to a stream.
+ *
+ * Purpose: Write alignment <msa> in dotless UCSC A2M format to a
+ * stream <fp>.
+ *
+ * The <msa> should have a valid reference line <msa->rf>,
+ * with alphanumeric characters marking consensus (match)
+ * columns, and non-alphanumeric characters marking
+ * nonconsensus (insert) columns. If it does not,
+ * then as a fallback, the first sequence in the alignment is
+ * considered to be the consensus.
+ *
+ * In "dotless" A2M format, gap characters (.) in insert
+ * columns are omitted; therefore sequences can be of
+ * different lengths, but each sequence has the same number
+ * of consensus columns (residue or -).
+ *
+ * A2M format cannot represent missing data symbols
+ * (Easel's ~). Any missing data symbols are converted to
+ * gaps.
+ *
+ * A2M format cannot represent pyrrolysine residues in
+ * amino acid sequences, because it treats 'O' symbols
+ * specially, as indicating a position at which a
+ * free-insertion module (FIM) should be created. Any 'O'
+ * in the <msa> is written instead as an unknown
+ * residue ('X', in protein sequences).
+ *
+ * Args: fp - open output stream
+ * msa - MSA to write
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEWRITE> on any system write error, such as filled disk.
+ */
+int
+esl_msafile_a2m_Write(FILE *fp, const ESL_MSA *msa)
+{
+ char *buf = NULL;
+ int cpl = 60;
+ int bpos;
+ int pos;
+ int is_consensus;
+ int is_residue;
+ int do_dotless = TRUE; /* just changing this to FALSE makes it write dots too */
+ int i;
+ int sym;
+ int status;
+
+ ESL_ALLOC(buf, sizeof(char) * (cpl+1));
+
+ for (i = 0; i < msa->nseq; i++)
+ {
+ /* Construct the name/description line */
+ if (fprintf(fp, ">%s", msa->sqname[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "a2m msa file write failed");
+ if (msa->sqacc != NULL && msa->sqacc[i] != NULL) { if (fprintf(fp, " %s", msa->sqacc[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "a2m msa file write failed"); }
+ if (msa->sqdesc != NULL && msa->sqdesc[i] != NULL) { if (fprintf(fp, " %s", msa->sqdesc[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "a2m msa file write failed"); }
+ if (fputc('\n', fp) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "a2m msa file write failed");
+
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc)
+ {
+ pos = 0;
+ while (pos < msa->alen)
+ {
+ for (bpos = 0; pos < msa->alen && bpos < cpl; pos++)
+ {
+ sym = msa->abc->sym[msa->ax[i][pos+1]]; /* note off-by-one in digitized aseq: 1..alen */
+ is_residue = esl_abc_XIsResidue(msa->abc, msa->ax[i][pos+1]);
+ if (msa->rf) is_consensus = (isalnum(msa->rf[pos]) ? TRUE : FALSE);
+ else is_consensus = (esl_abc_XIsResidue(msa->abc, msa->ax[0][pos+1]) ? TRUE : FALSE);
+
+ if (sym == 'O') sym = esl_abc_XGetUnknown(msa->abc); /* watch out: O means "insert a FIM" in a2m format, not pyrrolysine */
+
+ if (is_consensus) { buf[bpos++] = (is_residue ? toupper(sym) : '-'); }
+ else if (is_residue) { buf[bpos++] = tolower(sym); }
+ else if (! do_dotless) { buf[bpos++] = '.'; }
+ }
+ buf[bpos] = '\0';
+ if (bpos) { if (fprintf(fp, "%s\n", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "a2m msa file write failed");}
+ }
+ }
+#endif
+ if (! msa->abc)
+ {
+ pos = 0;
+ while (pos < msa->alen)
+ {
+ for (bpos = 0; pos < msa->alen && bpos < cpl; pos++)
+ {
+ sym = msa->aseq[i][pos];
+ is_residue = isalpha(msa->aseq[i][pos]);
+ if (msa->rf) is_consensus = (isalnum(msa->rf[pos]) ? TRUE : FALSE);
+ else is_consensus = (isalnum(msa->aseq[0][pos]) ? TRUE : FALSE);
+
+ if (sym == 'O') sym = 'X';
+
+ if (is_consensus) { buf[bpos++] = ( is_residue ? toupper(sym) : '-'); }
+ else if (is_residue) { buf[bpos++] = tolower(sym); }
+ else if (! do_dotless) { buf[bpos++] = '.'; }
+
+ }
+ buf[bpos] = '\0';
+ if (bpos) { if (fprintf(fp, "%s\n", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "a2m msa file write failed"); }
+ }
+ }
+ } /* end, loop over sequences in the MSA */
+
+ free(buf);
+ return eslOK;
+
+ ERROR:
+ if (buf) free(buf);
+ return status;
+}
+/*------------- end, API for i/o of a2m format ------------------*/
+
+
+/*****************************************************************
+ * 2. Internal functions used by the A2M parser
+ *****************************************************************/
+
+/* A2M parser has an input phase, followed by an alignment padding phase.
+ * The a2m_padding_{digital,text} functions do the padding phase.
+ *
+ * Upon call:
+ * msa->nseq is set;
+ * msa->ax[0..nseq-1][1..slen] are unaligned seqs (consensus cols +
+ * inserted residues); or msa->aseq[0..nseq-1][0..slen-1], for text mode
+ * csflag[0..nseq-1][0..slen-1] is TRUE/FALSE for whether each pos
+ * in msa->ax[][1..slen]/msa->aseq[][0..slen-1] is consensus or insert
+ * nins[0..ncons] is the number of insert columns preceding each consensus column
+ *
+ * watch out, ax[] is a digital sequence, 1..alen not 0..alen-1: hence
+ * the [apos+1], [spos+1] indexing
+ *
+ * these functions may not fail with any normal (eslEFORMAT) error, because
+ * we wouldn't be able to tell the line/linenumber of the error
+ *
+ * Upon successful return:
+ * msa->alen is set
+ * all msa->ax[]/msa->aseq are now aligned digital sequences
+ * msa->rf is set
+ */
+#ifdef eslAUGMENT_ALPHABET
+static int
+a2m_padding_digital(ESL_MSA *msa, char **csflag, int *nins, int ncons)
+{
+ ESL_DSQ *ax = NULL; /* new aligned sequence - will be swapped into msa->ax[] */
+ ESL_DSQ gapsym = esl_abc_XGetGap(msa->abc);
+ int apos, cpos, spos; /* position counters for alignment 0..alen, consensus cols 0..cpos-1, sequence position 0..slen-1 */
+ int alen;
+ int icount;
+ int idx;
+ int status;
+
+ alen = ncons;
+ for (cpos = 0; cpos <= ncons; cpos++)
+ alen += nins[cpos];
+
+ ESL_ALLOC(msa->rf, sizeof(char) * (alen+1));
+ for (apos = 0, cpos = 0; cpos <= ncons; cpos++)
+ {
+ for (icount = 0; icount < nins[cpos]; icount++) msa->rf[apos++] = '.';
+ if (cpos < ncons) msa->rf[apos++] = 'x';
+ }
+ msa->rf[apos] = '\0';
+
+ for (idx = 0; idx < msa->nseq; idx++)
+ {
+ ESL_ALLOC(ax, sizeof(ESL_DSQ) * (alen + 2));
+ ax[0] = eslDSQ_SENTINEL;
+ apos = spos = 0;
+ for (cpos = 0; cpos <= ncons; cpos++)
+ {
+ icount = 0;
+ while (csflag[idx][spos] == FALSE) { ax[apos+1] = msa->ax[idx][spos+1]; apos++; spos++; icount++; }
+ while (icount < nins[cpos]) { ax[apos+1] = gapsym; apos++; icount++; }
+ if (cpos < ncons) { ax[apos+1] = msa->ax[idx][spos+1]; apos++; spos++; }
+ }
+ ESL_DASSERT1( (msa->ax[idx][spos+1] == eslDSQ_SENTINEL) );
+ ESL_DASSERT1( (apos == alen) );
+ ax[alen+1] = eslDSQ_SENTINEL;
+ free(msa->ax[idx]);
+ msa->ax[idx] = ax;
+ ax = NULL;
+ }
+ msa->alen = alen;
+
+
+
+ return eslOK;
+
+ ERROR:
+ if (ax) free(ax);
+ return status;
+}
+#endif /*eslAUGMENT_ALPHABET*/
+
+static int
+a2m_padding_text(ESL_MSA *msa, char **csflag, int *nins, int ncons)
+{
+ char *aseq = NULL; /* new aligned sequence - will be swapped into msa->aseq[] */
+ int apos, cpos, spos; /* position counters for alignment 0..alen, consensus cols 0..cpos-1, sequence position 0..slen-1 */
+ int alen;
+ int icount;
+ int idx;
+ int status;
+
+ alen = ncons;
+ for (cpos = 0; cpos <= ncons; cpos++)
+ alen += nins[cpos];
+
+ ESL_ALLOC(msa->rf, sizeof(char) * (alen+1));
+ for (apos = 0, cpos = 0; cpos <= ncons; cpos++)
+ {
+ for (icount = 0; icount < nins[cpos]; icount++) msa->rf[apos++] = '.';
+ if (cpos < ncons) msa->rf[apos++] = 'x';
+ }
+ msa->rf[apos] = '\0';
+
+ for (idx = 0; idx < msa->nseq; idx++)
+ {
+ ESL_ALLOC(aseq, sizeof(char) * (alen + 1));
+ apos = spos = 0;
+ for (cpos = 0; cpos <= ncons; cpos++)
+ {
+ icount = 0;
+ while (csflag[idx][spos] == FALSE) { aseq[apos] = msa->aseq[idx][spos]; apos++; spos++; icount++; }
+ while (icount < nins[cpos]) { aseq[apos] = '.'; apos++; icount++; }
+ if (cpos < ncons) { aseq[apos] = msa->aseq[idx][spos]; apos++; spos++; }
+ }
+ ESL_DASSERT1( (msa->aseq[idx][spos] == '\0') );
+ ESL_DASSERT1( (apos == alen) );
+ aseq[alen] = '\0';
+ free(msa->aseq[idx]);
+ msa->aseq[idx] = aseq;
+ aseq = NULL;
+ }
+ msa->alen = alen;
+ return eslOK;
+
+ ERROR:
+ if (aseq) free(aseq);
+ return status;
+}
+/*---------- end, internal functions for the parser -------------*/
+
+
+/*****************************************************************
+ * 3. Unit tests.
+ *****************************************************************/
+#ifdef eslMSAFILE_A2M_TESTDRIVE
+
+static void
+utest_write_good1(FILE *ofp, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs(">MYG_PHYCA\n", ofp);
+ fputs("VLSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRFKHLKTEAEMKASED\n", ofp);
+ fputs("LKKHGVTVLTALGAILKKKGHHEAELKPLAQSHATKHKIPIKYLEFISEAIIHVLHSRHP\n", ofp);
+ fputs("GDFGADAQGAMNKALELFRKDIAAKYKELGYQG\n", ofp);
+ fputs(">GLB5_PETMA\n", ofp);
+ fputs("pivdtgsvApLSAAEKTKIRSAWAPVYSTYETSGVDILVKFFTSTPAAQEFFPKFKGLTT\n", ofp);
+ fputs("ADQLKKSADVRWHAERIINAVNDAVASMDDtekMSMKLRDLSGKHAKSFQVDPQYFKVLA\n", ofp);
+ fputs("AVI---------ADTVAAGDAGFEKLMSMICILLRSAY-------\n", ofp);
+ fputs(">HBB_HUMAN\n", ofp);
+ fputs("VhLTPEEKSAVTALWGKV--NVDEVGGEALGRLLVVYPWTQRFFESFGDLSTPDAVMGNP\n", ofp);
+ fputs("KVKAHGKKVLGAFSDGLAHLDNLKGTFATLSELHCDKLHVDPENFRLLGNVLVCVLAHHF\n", ofp);
+ fputs("GKEFTPPVQAAYQKVVAGVANALAHKYH------\n", ofp);
+ fputs(">HBA_HUMAN\n", ofp);
+ fputs("VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHF------DLSHGSAQ\n", ofp);
+ fputs("VKGHGKKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLP\n", ofp);
+ fputs("AEFTPAVHASLDKFLASVSTVLTSKYR------\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 4;
+ *ret_alen = 165;
+}
+
+static void
+utest_write_good2(FILE *ofp, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs(">tRNA2\n", ofp);
+ fputs("UCCGAUAUAGUGUAACGGCUAUCACAUCACGCUUUCACCGUGGAGACCGGGGUUCGACUC\n", ofp);
+ fputs("CCCGUAUCGGAG\n", ofp);
+ fputs(">tRNA3\n", ofp);
+ fputs("UCCGUGAUAGUUUAAUGGUCAGAAUGG-GCGCUUGUCGCGUGCcAGAUCGGGGUUCAAUU\n", ofp);
+ fputs("CCCCGUCGCGGAG\n", ofp);
+ fputs(">tRNA5\n", ofp);
+ fputs("GGGCACAUGGCGCAGUUGGUAGCGCGCUUCCCUUGCAAGGAAGaGGUCAUCGGUUCGAUU\n", ofp);
+ fputs("CCGGUUGCGUCCA\n", ofp);
+ fputs(">tRNA1\n", ofp);
+ fputs("GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGaGGUCCUGUGUUCGAUC\n", ofp);
+ fputs("CACAGAAUUCGCA\n", ofp);
+ fputs(">tRNA4\n", ofp);
+ fputs("GCUCGUAUGGCGCAGUGG-UAGCGCAGCAGAUUGCAAAUCUGUuGGUCCUUAGUUCGAUC\n", ofp);
+ fputs("CUGAGUGCGAGCU\n", ofp);
+
+ *ret_alphatype = eslRNA;
+ *ret_nseq = 5;
+ *ret_alen = 73;
+}
+
+static void
+utest_goodfile(char *filename, int testnumber, int expected_alphatype, int expected_nseq, int expected_alen)
+{
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa1 = NULL;
+ ESL_MSA *msa2 = NULL;
+ char tmpfile1[32] = "esltmpXXXXXX";
+ char tmpfile2[32] = "esltmpXXXXXX";
+ FILE *ofp = NULL;
+ int status;
+
+ /* A2M must be specified (no format guessing, unless we use .a2m suffix) but guessing the alphabet should work: this is a digital open */
+ if ( (status = esl_msafile_Open(&abc, filename, NULL, eslMSAFILE_A2M, NULL, &afp)) != eslOK) esl_fatal("a2m good file test %d failed: digital open", testnumber);
+ if (afp->format != eslMSAFILE_A2M) esl_fatal("a2m good file test %d failed: bad format", testnumber);
+ if (abc->type != expected_alphatype) esl_fatal("a2m good file test %d failed: alphabet autodetection", testnumber);
+
+ /* This is a digital read, using <abc>. */
+ if ( (status = esl_msafile_a2m_Read(afp, &msa1)) != eslOK) esl_fatal("a2m good file test %d failed: msa read, digital", testnumber);
+ if (msa1->nseq != expected_nseq || msa1->alen != expected_alen) esl_fatal("a2m good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa1, NULL) != eslOK) esl_fatal("a2m good file test %d failed: msa invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (digital write) */
+ if ( (status = esl_tmpfile_named(tmpfile1, &ofp)) != eslOK) esl_fatal("a2m good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_a2m_Write(ofp, msa1)) != eslOK) esl_fatal("a2m good file test %d failed: msa write, digital", testnumber);
+ fclose(ofp);
+
+ /* now open and read it as text mode, in known format. */
+ if ( (status = esl_msafile_Open(NULL, tmpfile1, NULL, eslMSAFILE_A2M, NULL, &afp)) != eslOK) esl_fatal("a2m good file test %d failed: text mode open", testnumber);
+ if ( (status = esl_msafile_a2m_Read(afp, &msa2)) != eslOK) esl_fatal("a2m good file test %d failed: msa read, text", testnumber);
+ if (msa2->nseq != expected_nseq || msa2->alen != expected_alen) esl_fatal("a2m good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("a2m good file test %d failed: msa invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (text write) */
+ if ( (status = esl_tmpfile_named(tmpfile2, &ofp)) != eslOK) esl_fatal("a2m good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_a2m_Write(ofp, msa2)) != eslOK) esl_fatal("a2m good file test %d failed: msa write, text", testnumber);
+ fclose(ofp);
+ esl_msa_Destroy(msa2);
+
+ /* open and read it in digital mode */
+ if ( (status = esl_msafile_Open(&abc, tmpfile1, NULL, eslMSAFILE_A2M, NULL, &afp)) != eslOK) esl_fatal("a2m good file test %d failed: 2nd digital mode open", testnumber);
+ if ( (status = esl_msafile_a2m_Read(afp, &msa2)) != eslOK) esl_fatal("a2m good file test %d failed: 2nd digital msa read", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("a2m good file test %d failed: msa invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* this msa <msa2> should be identical to <msa1> */
+ if (esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal("a2m good file test %d failed: msa compare", testnumber);
+
+ remove(tmpfile1);
+ remove(tmpfile2);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_alphabet_Destroy(abc);
+}
+
+
+static void
+write_test_msas(FILE *ofp1, FILE *ofp2)
+{
+ fprintf(ofp1, ">seq1 description line for seq1\n");
+ fprintf(ofp1, "ACDEFGHIKLMNPQRSTVWY\n");
+ fprintf(ofp1, "ACDEFGHIKLMNPQRSTVWY\n");
+ fprintf(ofp1, ">seq2 description line for seq2\n");
+ fprintf(ofp1, "ACDEFGHIKLMNPQRSTV--\n");
+ fprintf(ofp1, "ACDEFGHIKLMNPQRSTVWY\n");
+ fprintf(ofp1, "yy\n");
+ fprintf(ofp1, ">seq3\n");
+ fprintf(ofp1, "aaACDEFGHIKLMNPQRSTV\n");
+ fprintf(ofp1, "--ACDEFGHIKLMNPQRSTVWY\n");
+ fprintf(ofp1, ">seq4 \n");
+ fprintf(ofp1, "ACDEFGHIKLMNPQR\n");
+ fprintf(ofp1, "STVWYACDEFGHIKL\n");
+ fprintf(ofp1, "MNPQRSTVWY\n");
+
+ fprintf(ofp2, "# STOCKHOLM 1.0\n");
+ fprintf(ofp2, "\n");
+ fprintf(ofp2, "#=GS seq1 DE description line for seq1\n");
+ fprintf(ofp2, "#=GS seq2 DE description line for seq2\n");
+ fprintf(ofp2, "\n");
+ fprintf(ofp2, "#=GC RF ..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..\n");
+ fprintf(ofp2, "seq1 ..ACDEFGHIKLMNPQRSTVWYACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "seq2 ..ACDEFGHIKLMNPQRSTV--ACDEFGHIKLMNPQRSTVWYyy\n");
+ fprintf(ofp2, "seq3 aaACDEFGHIKLMNPQRSTV--ACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "seq4 ..ACDEFGHIKLMNPQRSTVWYACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "//\n");
+}
+
+static void
+read_test_msas_digital(char *a2mfile, char *stkfile)
+{
+ char msg[] = "A2M msa digital read unit test failed";
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ FILE *a2mfp, *stkfp;
+ char a2mfile2[32] = "esltmpa2m2XXXXXX";
+ char stkfile2[32] = "esltmpstk2XXXXXX";
+
+ if ( esl_msafile_Open(&abc, a2mfile, NULL, eslMSAFILE_A2M, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( !abc || abc->type != eslAMINO) esl_fatal(msg);
+ if ( esl_msafile_Open(&abc, stkfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_a2m_Read (afp1, &msa1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+
+ if ( esl_msafile_a2m_Read (afp1, &msa3) != eslEOF) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa3) != eslEOF) esl_fatal(msg);
+
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ /* Now write stk to a2m file, and vice versa; then retest */
+ if ( esl_tmpfile_named(a2mfile2, &a2mfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile2, &stkfp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_a2m_Write (a2mfp, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Write(stkfp, msa1, eslMSAFILE_PFAM) != eslOK) esl_fatal(msg);
+ fclose(a2mfp);
+ fclose(stkfp);
+ if ( esl_msafile_Open(&abc, a2mfile2, NULL, eslMSAFILE_A2M, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(&abc, stkfile2, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_a2m_Read (afp1, &msa3) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa4) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa3, msa4) != eslOK) esl_fatal(msg);
+
+ remove(a2mfile2);
+ remove(stkfile2);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+ esl_alphabet_Destroy(abc);
+}
+
+static void
+read_test_msas_text(char *a2mfile, char *stkfile)
+{
+ char msg[] = "A2M msa text-mode read unit test failed";
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ FILE *a2mfp, *stkfp;
+ char a2mfile2[32] = "esltmpa2m2XXXXXX";
+ char stkfile2[32] = "esltmpstk2XXXXXX";
+
+ /* vvvv-- everything's the same as the digital utest except these NULLs */
+ if ( esl_msafile_Open(NULL, a2mfile, NULL, eslMSAFILE_A2M, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(NULL, stkfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_a2m_Read (afp1, &msa1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_a2m_Read (afp1, &msa3) != eslEOF) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa3) != eslEOF) esl_fatal(msg);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ if ( esl_tmpfile_named(a2mfile2, &a2mfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile2, &stkfp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_a2m_Write (a2mfp, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Write(stkfp, msa1, eslMSAFILE_PFAM) != eslOK) esl_fatal(msg);
+ fclose(a2mfp);
+ fclose(stkfp);
+ if ( esl_msafile_Open(NULL, a2mfile2, NULL, eslMSAFILE_A2M, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(NULL, stkfile2, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_a2m_Read (afp1, &msa3) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa4) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa3, msa4) != eslOK) esl_fatal(msg);
+
+ remove(a2mfile2);
+ remove(stkfile2);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+}
+
+#endif /*eslMSAFILE_A2M_TESTDRIVE*/
+/*---------------------- end, unit tests ------------------------*/
+
+
+
+/*****************************************************************
+ * 4. Test driver.
+ *****************************************************************/
+#ifdef eslMSAFILE_A2M_TESTDRIVE
+/* compile: gcc -g -Wall -I. -L. -o esl_msafile_a2m_utest -DeslMSAFILE_A2M_TESTDRIVE esl_msafile_a2m.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_msafile_a2m_utest -DeslMSAFILE_A2M_TESTDRIVE esl_msafile_a2m.c -leasel -lm
+ * run: ./esl_msafile_a2m_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_msafile.h"
+#include "esl_msafile_a2m.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for A2M MSA format module";
+
+int
+main(int argc, char **argv)
+{
+ char msg[] = "a2m MSA i/o module test driver failed";
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ char a2mfile[32] = "esltmpa2mXXXXXX";
+ char stkfile[32] = "esltmpstkXXXXXX";
+ FILE *a2mfp, *stkfp;
+ int testnumber;
+ int ngoodtests = 2;
+ char tmpfile[32];
+ FILE *ofp;
+ int expected_alphatype;
+ int expected_nseq;
+ int expected_alen;
+
+ if ( esl_tmpfile_named(a2mfile, &a2mfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile, &stkfp) != eslOK) esl_fatal(msg);
+ write_test_msas(a2mfp, stkfp);
+ fclose(a2mfp);
+ fclose(stkfp);
+
+ read_test_msas_digital(a2mfile, stkfile);
+ read_test_msas_text (a2mfile, stkfile);
+
+ /* Various "good" files that should be parsed correctly */
+ for (testnumber = 1; testnumber <= ngoodtests; testnumber++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+ switch (testnumber) {
+ case 1: utest_write_good1 (ofp, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 2: utest_write_good2 (ofp, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ }
+ fclose(ofp);
+ utest_goodfile(tmpfile, testnumber, expected_alphatype, expected_nseq, expected_alen);
+ remove(tmpfile);
+ }
+
+ remove(a2mfile);
+ remove(stkfile);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslMSAFILE_A2M_TESTDRIVE*/
+/*--------------------- end, test driver ------------------------*/
+
+
+
+/*****************************************************************
+ * 5. Examples.
+ *****************************************************************/
+
+#ifdef eslMSAFILE_A2M_EXAMPLE
+/* A full-featured example of reading/writing an MSA in A2M format.
+ gcc -g -Wall -o esl_msafile_a2m_example -I. -L. -DeslMSAFILE_A2M_EXAMPLE esl_msafile_a2m.c -leasel -lm
+ ./esl_msafile_a2m_example <msafile>
+ */
+/*::cexcerpt::msafile_a2m_example::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_a2m.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-1", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "override autodetection; force A2M format", 0 },
+ { "-q", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "quieter: don't write msa back, just summary", 0 },
+ { "-t", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use text mode: no digital alphabet", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is DNA", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is RNA", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is protein", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msafile>";
+static char banner[] = "example of guessing, reading, writing A2M format";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *filename = esl_opt_GetArg(go, 1);
+ int infmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if (esl_opt_GetBoolean(go, "-1")) infmt = eslMSAFILE_A2M; /* override format autodetection */
+
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+
+ /* Text mode: pass NULL for alphabet.
+ * Digital mode: pass ptr to expected ESL_ALPHABET; and if abc=NULL, alphabet is guessed
+ */
+ if (esl_opt_GetBoolean(go, "-t")) status = esl_msafile_Open(NULL, filename, NULL, infmt, NULL, &afp);
+ else status = esl_msafile_Open(&abc, filename, NULL, infmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+
+ if ((status = esl_msafile_a2m_Read(afp, &msa)) != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+
+ printf("alphabet: %s\n", (abc ? esl_abc_DecodeType(abc->type) : "none (text mode)"));
+ printf("# of seqs: %d\n", msa->nseq);
+ printf("# of cols: %d\n", (int) msa->alen);
+ printf("\n");
+
+ if (! esl_opt_GetBoolean(go, "-q"))
+ esl_msafile_a2m_Write(stdout, msa);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ if (abc) esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+/*::cexcerpt::msafile_a2m_example::end::*/
+#endif /*eslMSAFILE_A2M_EXAMPLE*/
+
+
+#ifdef eslMSAFILE_A2M_EXAMPLE2
+/* A minimal example. Read A2M MSA, in text mode
+ gcc -g -Wall -o esl_msafile_a2m_example2 -I. -L. -DeslMSAFILE_A2M_EXAMPLE2 esl_msafile_a2m.c -leasel -lm
+ ./esl_msafile_a2m_example <msafile>
+ */
+/*::cexcerpt::msafile_a2m_example2::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_a2m.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int fmt = eslMSAFILE_A2M;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if ( (status = esl_msafile_Open(NULL, filename, NULL, fmt, NULL, &afp)) != eslOK) esl_msafile_OpenFailure(afp, status);
+ if ( (status = esl_msafile_a2m_Read(afp, &msa)) != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ printf("%6d seqs, %5d columns\n", msa->nseq, (int) msa->alen);
+
+ esl_msafile_a2m_Write(stdout, msa);
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ exit(0);
+}
+/*::cexcerpt::msafile_a2m_example2::end::*/
+#endif /*eslMSAFILE_A2M_EXAMPLE2*/
+/*--------------------- end of examples -------------------------*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_a2m.h b/esl_msafile_a2m.h
new file mode 100644
index 0000000..b05643e
--- /dev/null
+++ b/esl_msafile_a2m.h
@@ -0,0 +1,18 @@
+/* i/o of multiple sequence alignment files in dotless UCSC A2M format
+ */
+#ifndef eslMSAFILE_A2M_INCLUDED
+#define eslMSAFILE_A2M_INCLUDED
+
+#include "esl_msa.h"
+#include "esl_msafile.h"
+
+extern int esl_msafile_a2m_SetInmap (ESL_MSAFILE *afp);
+extern int esl_msafile_a2m_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type);
+extern int esl_msafile_a2m_Read (ESL_MSAFILE *afp, ESL_MSA **ret_msa);
+extern int esl_msafile_a2m_Write (FILE *fp, const ESL_MSA *msa);
+
+#endif /* eslMSAFILE_A2M_INCLUDED */
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_afa.c b/esl_msafile_afa.c
new file mode 100644
index 0000000..7bd8808
--- /dev/null
+++ b/esl_msafile_afa.c
@@ -0,0 +1,732 @@
+/* i/o of multiple sequence alignment files in "aligned FASTA" format
+ *
+ * Contents:
+ * 1. API for reading/writing AFA format
+ * 2. Unit tests.
+ * 3. Test driver.
+ * 4. Examples.
+ * 5. License and copyright.
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#include "esl_mem.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_afa.h"
+
+/*****************************************************************
+ *# 1. API for reading/writing AFA format
+ *****************************************************************/
+
+/* Function: esl_msafile_afa_SetInmap()
+ * Synopsis: Set input map for aligned FASTA format.
+ *
+ * Purpose: Set the <afp->inmap> for aligned FASTA format.
+ *
+ * Text mode accepts any <isgraph()> character.
+ * Digital mode enforces the usual Easel alphabets.
+ *
+ * We skip spaces in input lines of aligned FASTA format;
+ * map ' ' to <eslDSQ_IGNORED>.
+ */
+int
+esl_msafile_afa_SetInmap(ESL_MSAFILE *afp)
+{
+ int sym;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc)
+ {
+ for (sym = 0; sym < 128; sym++)
+ afp->inmap[sym] = afp->abc->inmap[sym];
+ afp->inmap[0] = esl_abc_XGetUnknown(afp->abc);
+ }
+#endif
+ if (! afp->abc)
+ {
+ for (sym = 1; sym < 128; sym++)
+ afp->inmap[sym] = (isgraph(sym) ? sym : eslDSQ_ILLEGAL);
+ afp->inmap[0] = '?';
+ }
+
+ afp->inmap[' '] = eslDSQ_IGNORED;
+ return eslOK;
+}
+
+
+/* Function: esl_msafile_afa_GuessAlphabet()
+ * Synopsis: Guess the alphabet of an open AFA MSA file.
+ *
+ * Purpose: Guess the alpbabet of the sequences in open
+ * AFA format MSA file <afp>.
+ *
+ * On a normal return, <*ret_type> is set to <eslDNA>,
+ * <eslRNA>, or <eslAMINO>, and <afp> is reset to its
+ * original position.
+ *
+ * Args: afp - open AFA format MSA file
+ * ret_type - RETURN: <eslDNA>, <eslRNA>, or <eslAMINO>
+ *
+ * Returns: <eslOK> on success.
+ * <eslENOALPHABET> if alphabet type can't be determined.
+ * In either case, <afp> is rewound to the position it
+ * started at.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslESYS> on failures of fread() or other system calls
+ *
+ * Note: Essentially identical to <esl_msafile_a2m_GuessAlphabet()>,
+ * but we provide both versions because design calls for
+ * modularity/separability of parsers.
+ */
+int
+esl_msafile_afa_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type)
+{
+ int alphatype = eslUNKNOWN;
+ esl_pos_t anchor = -1;
+ int threshold[3] = { 500, 5000, 50000 }; /* we check after 500, 5000, 50000 residues; else we go to EOF */
+ int nsteps = 3;
+ int step = 0;
+ int nres = 0;
+ int x;
+ int64_t ct[26];
+ char *p;
+ esl_pos_t n, pos;
+ int status;
+
+ for (x = 0; x < 26; x++) ct[x] = 0;
+
+ anchor = esl_buffer_GetOffset(afp->bf);
+ if ((status = esl_buffer_SetAnchor(afp->bf, anchor)) != eslOK) { status = eslEINCONCEIVABLE; goto ERROR; } /* [eslINVAL] can't happen here */
+
+ while ( (status = esl_buffer_GetLine(afp->bf, &p, &n)) == eslOK)
+ {
+ while (n && isspace(*p)) { p++; n--; }
+ if (!n || *p == '>') continue;
+
+ for (pos = 0; pos < n; pos++)
+ if (isalpha(p[pos])) {
+ x = toupper(p[pos]) - 'A';
+ ct[x]++;
+ nres++;
+ }
+
+ /* try to stop early, checking after 500, 5000, and 50000 residues: */
+ if (step < nsteps && nres > threshold[step]) {
+ if ((status = esl_abc_GuessAlphabet(ct, &alphatype)) == eslOK) goto DONE; /* (eslENOALPHABET) */
+ step++;
+ }
+ }
+ if (status != eslEOF) goto ERROR; /* [eslEMEM,eslESYS,eslEINCONCEIVABLE] */
+ status = esl_abc_GuessAlphabet(ct, &alphatype); /* (eslENOALPHABET) */
+
+ /* deliberate flowthrough...*/
+ DONE:
+ esl_buffer_SetOffset(afp->bf, anchor); /* Rewind to where we were. */
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ *ret_type = alphatype;
+ return status;
+
+ ERROR:
+ if (anchor != -1) {
+ esl_buffer_SetOffset(afp->bf, anchor);
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ }
+ *ret_type = eslUNKNOWN;
+ return status;
+}
+
+/* Function: esl_msafile_afa_Read()
+ * Synopsis: Read in an aligned FASTA format alignment.
+ *
+ * Purpose: Read an MSA from an open <ESL_MSAFILE> <afp>,
+ * parsing for aligned FASTA format. Create
+ * a new MSA, and return a ptr to that alignment
+ * in <*ret_msa>. Caller is responsible for free'ing
+ * this <ESL_MSA>.
+ *
+ * Args: afp - open <ESL_MSAFILE>
+ * ret_msa - RETURN: newly parsed <ESL_MSA>
+ *
+ * Returns: <eslOK> on success. <*ret_msa> is set to the newly
+ * allocated MSA, and <afp> is at EOF.
+ *
+ * <eslEOF> if no (more) alignment data are found in
+ * <afp>;, and <afp> is returned at EOF.
+ *
+ * <eslEFORMAT> on a parse error. <*ret_msa> is set to
+ * <NULL>. <afp> contains information sufficient for
+ * constructing useful diagnostic output:
+ * | <afp->errmsg> | user-directed error message |
+ * | <afp->linenumber> | line # where error was detected |
+ * | <afp->line> | offending line (not NUL-term) |
+ * | <afp->n> | length of offending line |
+ * | <afp->bf->filename> | name of the file |
+ * and <afp> is poised at the start of the following line,
+ * so (in principle) the caller could try to resume
+ * parsing.
+ *
+ * Throws: <eslEMEM> - an allocation failed.
+ * <eslESYS> - a system call such as fread() failed
+ * <eslEINCONCEIVABLE> - "impossible" corruption
+ * On these, <*ret_msa> is returned <NULL>, and the state of
+ * <afp> is undefined.
+ */
+int
+esl_msafile_afa_Read(ESL_MSAFILE *afp, ESL_MSA **ret_msa)
+{
+ ESL_MSA *msa = NULL;
+ int idx = 0;
+ int64_t alen = 0;
+ int64_t this_alen = 0;
+ char *p, *tok;
+ esl_pos_t n, ntok;
+ int status;
+
+ ESL_DASSERT1( (afp->format == eslMSAFILE_AFA) );
+
+ afp->errmsg[0] = '\0'; /* Blank the error message. */
+
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc && (msa = esl_msa_CreateDigital(afp->abc, 16, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+#endif
+ if (! afp->abc && (msa = esl_msa_Create( 16, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ /* skip leading blank lines in file */
+ while ( (status = esl_msafile_GetLine(afp, &p, &n)) == eslOK && esl_memspn(afp->line, afp->n, " \t") == afp->n) ;
+ if (status != eslOK) goto ERROR; /* includes normal EOF */
+
+ /* tolerate sloppy space at start of line */
+ while (n && isspace(*p)) { p++; n--; }
+ if (*p != '>') ESL_XFAIL(eslEFORMAT, afp->errmsg, "expected aligned FASTA name/desc line starting with >");
+
+ do {
+ if (n <= 1 || *p != '>' ) ESL_XFAIL(eslEFORMAT, afp->errmsg, "expected aligned FASTA name/desc line starting with >");
+ p++; n--; /* advance past > */
+
+ if ( (status = esl_memtok(&p, &n, " \t", &tok, &ntok)) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "no name found for aligned FASTA record");
+ if (idx >= msa->sqalloc && (status = esl_msa_Expand(msa)) != eslOK) goto ERROR;
+
+ if ( (status = esl_msa_SetSeqName (msa, idx, tok, ntok)) != eslOK) goto ERROR;
+ if (n && (status = esl_msa_SetSeqDescription(msa, idx, p, n)) != eslOK) goto ERROR;
+
+ /* The code below will do a realloc on every line. Possible optimization: once you know
+ * alen (from first sequence), allocate subsequent seqs once, use noalloc versions of
+ * esl_strmapcat/esl_abc_dsqcat(). Requires implementing protection against overrun, if
+ * input is bad and a sequence is too long. Could gain ~25% or so that way (quickie
+ * test on PF00005 Full)
+ */
+ this_alen = 0;
+ while ((status = esl_msafile_GetLine(afp, &p, &n)) == eslOK)
+ {
+ while (n && isspace(*p)) { p++; n--; } /* tolerate and skip leading whitespace on line */
+ if (n == 0) continue; /* tolerate and skip blank lines */
+ if (*p == '>') break;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) { status = esl_abc_dsqcat(afp->inmap, &(msa->ax[idx]), &this_alen, p, n); }
+#endif
+ if (! msa->abc) { status = esl_strmapcat (afp->inmap, &(msa->aseq[idx]), &this_alen, p, n); }
+ if (status == eslEINVAL) ESL_XFAIL(eslEFORMAT, afp->errmsg, "one or more invalid sequence characters");
+ else if (status != eslOK) goto ERROR;
+ }
+ if (this_alen == 0) ESL_XFAIL(eslEFORMAT, afp->errmsg, "sequence %s has alen %" PRId64 , msa->sqname[idx], this_alen);
+ if (alen && alen != this_alen) ESL_XFAIL(eslEFORMAT, afp->errmsg, "sequence %s has alen %" PRId64 "; expected %" PRId64, msa->sqname[idx], this_alen, alen);
+
+ alen = this_alen;
+ idx++;
+ } while (status == eslOK); /* normally ends on eslEOF. */
+
+ msa->nseq = idx;
+ msa->alen = alen;
+ if (( status = esl_msa_SetDefaultWeights(msa)) != eslOK) goto ERROR;
+
+ *ret_msa = msa;
+ return eslOK;
+
+ ERROR:
+ if (msa) esl_msa_Destroy(msa);
+ *ret_msa = NULL;
+ return status;
+
+}
+
+/* Function: esl_msafile_afa_Write()
+ * Synopsis: Write an aligned FASTA format alignment file to a stream.
+ *
+ * Purpose: Write alignment <msa> in aligned FASTA format to a stream
+ * <fp>.
+ *
+ * If <msa> is in text mode, residues and gaps are written
+ * exactly as they appear in the data structure. If <msa>
+ * is digital, residues are in uppercase and all gaps are
+ * dots (.). Dots are preferred to dashes because it
+ * minimizes confusion with A2M format.
+ *
+ * Args: fp - open stream to write to
+ * msa - MSA to write
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write failure, such as filled disk.
+ */
+int
+esl_msafile_afa_Write(FILE *fp, const ESL_MSA *msa)
+{
+ int i;
+ int64_t pos;
+ char buf[61];
+ int acpl; /* actual number of characters per line */
+
+ for (i = 0; i < msa->nseq; i++)
+ {
+ if (fprintf(fp, ">%s", msa->sqname[i]) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "afa msa file write failed");
+ if (msa->sqacc != NULL && msa->sqacc[i] != NULL) { if (fprintf(fp, " %s", msa->sqacc[i]) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "afa msa file write failed"); }
+ if (msa->sqdesc != NULL && msa->sqdesc[i] != NULL) { if (fprintf(fp, " %s", msa->sqdesc[i]) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "afa msa file write failed"); }
+ if (fputc('\n', fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "afa msa file write failed");
+
+ pos = 0;
+ while (pos < msa->alen)
+ {
+ acpl = (msa->alen - pos > 60)? 60 : msa->alen - pos;
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) esl_abc_TextizeN(msa->abc, msa->ax[i] + pos + 1, acpl, buf);
+#endif
+ if (! msa->abc) strncpy(buf, msa->aseq[i] + pos, acpl);
+
+ buf[acpl] = '\0';
+ if (fprintf(fp, "%s\n", buf) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "afa msa file write failed");
+ pos += 60;
+ }
+ }
+ return eslOK;
+}
+
+/*****************************************************************
+ * 2. Unit tests.
+ *****************************************************************/
+#ifdef eslMSAFILE_AFA_TESTDRIVE
+/* a standard globin example, dusted with evil:
+ * 1. \r\n DOS line terminators;
+ * 2. extra blank lines and whitespace
+ * 3. unusual but legal residues
+ */
+static void
+utest_write_good1(FILE *ofp, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs(" \r\n", ofp);
+ fputs("> MYG_PHYCA description \r\n", ofp);
+ fputs("--------V-LSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRFKHLKT\r\n", ofp);
+ fputs("EAEMKASEDLKKHGVTVLTALGAILKKKGH---HEABJZOUX*SHATKHKIPIKYLEFIS \r\n", ofp);
+ fputs("EAIIHVLHSRHPGDFGADAQGAMNKALELFRKDIAAKYKELGYQG\r\n", ofp);
+ fputs(" \r\n", ofp);
+ fputs(">GLB5_PETMA\r\n", ofp);
+ fputs("PIVDTGSVAPLSAAEKTKIRSAWAPVYSTYETSGVDILVKFFTSTPAAQEFFPKFKGLTT\r\n", ofp);
+ fputs("ADQLKKSADVRWHAERIINAVNDAVASMDDTEKMSMKLRDLSGKHAKSFQVDPQYFKVLA\r\n", ofp);
+ fputs("AVI---------ADTVAAGDAGFEKLMSMICILLRSAY-------\r\n", ofp);
+ fputs(">HBB_HUMAN\r\n", ofp);
+ fputs("--------VHLTPEEKSAVTALWGKV--NVDEVGGEALGRLLVVYPWTQRFFESFGDLST\r\n", ofp);
+ fputs("PDAVMGNPKVKAHGKKVLGAFSDGLAHLDN---LKGTFATLSELHCDKLHVDPENFRLLG\r\n", ofp);
+ fputs("NVLVCVLAHHFGKEFTPPVQAAYQKVVAGVANALAHKYH------\r\n", ofp);
+ fputs(">HBA_HUMAN\r\n", ofp);
+ fputs("--------V-LSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHF-----\r\n", ofp);
+ fputs("-DLSHGSAQVKGHGKKVADALTNAVAHVDD---MPNALSALSDLHAHKLRVDPVNFKLLS\r\n", ofp);
+ fputs("HCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR------\r\n", ofp);
+ fputs(" \r\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 4;
+ *ret_alen = 165;
+}
+
+
+static void
+utest_goodfile(char *filename, int testnumber, int expected_alphatype, int expected_nseq, int expected_alen)
+{
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa1 = NULL;
+ ESL_MSA *msa2 = NULL;
+ char tmpfile1[32] = "esltmpXXXXXX";
+ char tmpfile2[32] = "esltmpXXXXXX";
+ FILE *ofp = NULL;
+ int status;
+
+ /* guessing both the format and the alphabet should work: this is a digital open */
+ if ( (status = esl_msafile_Open(&abc, filename, NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK) esl_fatal("afa good file test %d failed: digital open", testnumber);
+ if (afp->format != eslMSAFILE_AFA) esl_fatal("afa good file test %d failed: format autodetection", testnumber);
+ if (abc->type != expected_alphatype) esl_fatal("afa good file test %d failed: alphabet autodetection", testnumber);
+
+ /* This is a digital read, using <abc>. */
+ if ( (status = esl_msafile_afa_Read(afp, &msa1)) != eslOK) esl_fatal("afa good file test %d failed: msa read, digital", testnumber);
+ if (msa1->nseq != expected_nseq || msa1->alen != expected_alen) esl_fatal("afa good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa1, NULL) != eslOK) esl_fatal("afa good file test %d failed: msa invalid", testnumber);
+
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (digital write) */
+ if ( (status = esl_tmpfile_named(tmpfile1, &ofp)) != eslOK) esl_fatal("afa good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_afa_Write(ofp, msa1)) != eslOK) esl_fatal("afa good file test %d failed: msa write, digital", testnumber);
+ fclose(ofp);
+
+ /* now open and read it as text mode, in known format. (We have to pass fmtd now, to deal with the possibility of a nonstandard name width) */
+ if ( (status = esl_msafile_Open(NULL, tmpfile1, NULL, eslMSAFILE_AFA, NULL, &afp)) != eslOK) esl_fatal("afa good file test %d failed: text mode open", testnumber);
+ if ( (status = esl_msafile_afa_Read(afp, &msa2)) != eslOK) esl_fatal("afa good file test %d failed: msa read, text", testnumber);
+ if (msa2->nseq != expected_nseq || msa2->alen != expected_alen) esl_fatal("afa good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("afa good file test %d failed: msa invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (text write) */
+ if ( (status = esl_tmpfile_named(tmpfile2, &ofp)) != eslOK) esl_fatal("afa good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_afa_Write(ofp, msa2)) != eslOK) esl_fatal("afa good file test %d failed: msa write, text", testnumber);
+ fclose(ofp);
+ esl_msa_Destroy(msa2);
+
+ /* open and read it in digital mode */
+ if ( (status = esl_msafile_Open(&abc, tmpfile1, NULL, eslMSAFILE_AFA, NULL, &afp)) != eslOK) esl_fatal("afa good file test %d failed: 2nd digital mode open", testnumber);
+ if ( (status = esl_msafile_afa_Read(afp, &msa2)) != eslOK) esl_fatal("afa good file test %d failed: 2nd digital msa read", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("afa good file test %d failed: msa invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* this msa <msa2> should be identical to <msa1> */
+ if (esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal("afa good file test %d failed: msa compare", testnumber);
+
+ remove(tmpfile1);
+ remove(tmpfile2);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_alphabet_Destroy(abc);
+}
+
+
+static void
+write_test_msas(FILE *ofp1, FILE *ofp2)
+{
+ fprintf(ofp1, "\n");
+ fprintf(ofp1, ">seq1 description line for seq1\n");
+ fprintf(ofp1, "..acdefghiklmnpqrstvwy\n");
+ fprintf(ofp1, "ACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp1, "\n");
+ fprintf(ofp1, ">seq2 description line for seq2\n");
+ fprintf(ofp1, "..acdefghiklmnpqrstv--\n");
+ fprintf(ofp1, "ACDEFGHIKLMNPQRSTVWYyy\n");
+ fprintf(ofp1, " >seq3\n");
+ fprintf(ofp1, "aaacdefghiklmnpqrstv--ACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp1, ">seq4\n");
+ fprintf(ofp1, "..acdefghiklm\n");
+ fprintf(ofp1, "npqrstvwyACDE\n");
+ fprintf(ofp1, "FGHIKLMNPQRSTVWY..\n");
+
+ fprintf(ofp2, "# STOCKHOLM 1.0\n");
+ fprintf(ofp2, "\n");
+ fprintf(ofp2, "#=GS seq1 DE description line for seq1\n");
+ fprintf(ofp2, "#=GS seq2 DE description line for seq2\n");
+ fprintf(ofp2, "\n");
+ fprintf(ofp2, "seq1 ..acdefghiklmnpqrstvwyACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "seq2 ..acdefghiklmnpqrstv--ACDEFGHIKLMNPQRSTVWYyy\n");
+ fprintf(ofp2, "seq3 aaacdefghiklmnpqrstv--ACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "seq4 ..acdefghiklmnpqrstvwyACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "//\n");
+}
+
+static void
+read_test_msas_digital(char *afafile, char *stkfile)
+{
+ char msg[] = "aligned FASTA msa digital read unit test failed";
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ FILE *afafp, *stkfp;
+ char afafile2[32] = "esltmpafa2XXXXXX";
+ char stkfile2[32] = "esltmpstk2XXXXXX";
+
+ if ( esl_msafile_Open(&abc, afafile, NULL, eslMSAFILE_AFA, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( !abc || abc->type != eslAMINO) esl_fatal(msg);
+ if ( esl_msafile_Open(&abc, stkfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_afa_Read (afp1, &msa1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+
+ if ( esl_msafile_afa_Read (afp1, &msa3) != eslEOF) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa3) != eslEOF) esl_fatal(msg);
+
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ /* Now write stk to afa file, and vice versa; then retest */
+ if ( esl_tmpfile_named(afafile2, &afafp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile2, &stkfp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_afa_Write (afafp, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Write(stkfp, msa1, eslMSAFILE_STOCKHOLM) != eslOK) esl_fatal(msg);
+ fclose(afafp);
+ fclose(stkfp);
+ if ( esl_msafile_Open(&abc, afafile2, NULL, eslMSAFILE_AFA, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(&abc, stkfile2, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_afa_Read (afp1, &msa3) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa4) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa3, msa4) != eslOK) esl_fatal(msg);
+
+ remove(afafile2);
+ remove(stkfile2);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+ esl_alphabet_Destroy(abc);
+}
+
+static void
+read_test_msas_text(char *afafile, char *stkfile)
+{
+ char msg[] = "aligned FASTA msa text-mode read unit test failed";
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ FILE *afafp, *stkfp;
+ char afafile2[32] = "esltmpafa2XXXXXX";
+ char stkfile2[32] = "esltmpstk2XXXXXX";
+
+ /* vvvv-- everything's the same as the digital utest except these NULLs */
+ if ( esl_msafile_Open(NULL, afafile, NULL, eslMSAFILE_AFA, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(NULL, stkfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_afa_Read (afp1, &msa1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_afa_Read (afp1, &msa3) != eslEOF) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa3) != eslEOF) esl_fatal(msg);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ if ( esl_tmpfile_named(afafile2, &afafp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile2, &stkfp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_afa_Write (afafp, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Write(stkfp, msa1, eslMSAFILE_STOCKHOLM) != eslOK) esl_fatal(msg);
+ fclose(afafp);
+ fclose(stkfp);
+ if ( esl_msafile_Open(NULL, afafile2, NULL, eslMSAFILE_AFA, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(NULL, stkfile2, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_afa_Read (afp1, &msa3) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa4) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa3, msa4) != eslOK) esl_fatal(msg);
+
+ remove(afafile2);
+ remove(stkfile2);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+}
+#endif /*eslMSAFILE_AFA_TESTDRIVE*/
+/*---------------------- end, unit tests ------------------------*/
+
+
+/*****************************************************************
+ * 3. Test driver.
+ *****************************************************************/
+#ifdef eslMSAFILE_AFA_TESTDRIVE
+/* compile: gcc -g -Wall -I. -L. -o esl_msafile_afa_utest -DeslMSAFILE_AFA_TESTDRIVE esl_msafile_afa.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_msafile_afa_utest -DeslMSAFILE_AFA_TESTDRIVE esl_msafile_afa.c -leasel -lm
+ * run: ./esl_msafile_afa_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_msafile.h"
+#include "esl_msafile_afa.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for AFA MSA format module";
+
+int
+main(int argc, char **argv)
+{
+ char msg[] = "aligned FASTA MSA i/o module test driver failed";
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ char afafile[32] = "esltmpafaXXXXXX";
+ char stkfile[32] = "esltmpstkXXXXXX";
+ FILE *afafp, *stkfp;
+ int testnumber;
+ int ngoodtests = 1;
+ char tmpfile[32];
+ FILE *ofp;
+ int expected_alphatype;
+ int expected_nseq;
+ int expected_alen;
+
+
+ if ( esl_tmpfile_named(afafile, &afafp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile, &stkfp) != eslOK) esl_fatal(msg);
+ write_test_msas(afafp, stkfp);
+ fclose(afafp);
+ fclose(stkfp);
+
+ read_test_msas_digital(afafile, stkfile);
+ read_test_msas_text (afafile, stkfile);
+
+ /* Various "good" files that should be parsed correctly */
+ for (testnumber = 1; testnumber <= ngoodtests; testnumber++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+ switch (testnumber) {
+ case 1: utest_write_good1 (ofp, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ }
+ fclose(ofp);
+ utest_goodfile(tmpfile, testnumber, expected_alphatype, expected_nseq, expected_alen);
+ remove(tmpfile);
+ }
+
+ remove(afafile);
+ remove(stkfile);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslMSAFILE_AFA_TESTDRIVE*/
+/*--------------------- end, test driver ------------------------*/
+
+
+
+/*****************************************************************
+ * 4. Examples.
+ *****************************************************************/
+
+#ifdef eslMSAFILE_AFA_EXAMPLE
+/* A full-featured example of reading/writing an MSA in aligned FASTA (AFA) format.
+ gcc -g -Wall -o esl_msafile_afa_example -I. -L. -DeslMSAFILE_afa_EXAMPLE esl_msafile_afa.c -leasel -lm
+ ./esl_msafile_afa_example <msafile>
+ */
+/*::cexcerpt::msafile_afa_example::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_afa.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-1", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "override autodetection; force AFA format", 0 },
+ { "-q", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "quieter: don't write msa back, just summary", 0 },
+ { "-t", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use text mode: no digital alphabet", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is DNA", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is RNA", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is protein", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msafile>";
+static char banner[] = "example of guessing, reading, writing AFA format";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *filename = esl_opt_GetArg(go, 1);
+ int infmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if (esl_opt_GetBoolean(go, "-1")) infmt = eslMSAFILE_AFA; /* override format autodetection */
+
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+
+ /* Text mode: pass NULL for alphabet.
+ * Digital mode: pass ptr to expected ESL_ALPHABET; and if abc=NULL, alphabet is guessed
+ */
+ if (esl_opt_GetBoolean(go, "-t")) status = esl_msafile_Open(NULL, filename, NULL, infmt, NULL, &afp);
+ else status = esl_msafile_Open(&abc, filename, NULL, infmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+
+ if ((status = esl_msafile_afa_Read(afp, &msa)) != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+
+ printf("alphabet: %s\n", (abc ? esl_abc_DecodeType(abc->type) : "none (text mode)"));
+ printf("# of seqs: %d\n", msa->nseq);
+ printf("# of cols: %d\n", (int) msa->alen);
+ printf("\n");
+
+ if (! esl_opt_GetBoolean(go, "-q"))
+ esl_msafile_afa_Write(stdout, msa);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ if (abc) esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+/*::cexcerpt::msafile_afa_example::end::*/
+#endif /*eslMSAFILE_AFA_EXAMPLE*/
+
+#ifdef eslMSAFILE_AFA_EXAMPLE2
+/* A minimal example. Read AFA format MSA, in text mode.
+ gcc -g -Wall -o esl_msafile_afa_example2 -I. -L. -DeslMSAFILE_AFA_EXAMPLE2 esl_msafile_afa.c -leasel -lm
+ ./esl_msafile_afa_example2 <msafile>
+*/
+/*::cexcerpt::msafile_afa_example2::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_afa.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int fmt = eslMSAFILE_AFA;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if ( (status = esl_msafile_Open(NULL, filename, NULL, fmt, NULL, &afp)) != eslOK) esl_msafile_OpenFailure(afp, status);
+ if ( (status = esl_msafile_afa_Read(afp, &msa)) != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ printf("%6d seqs, %5d columns\n", msa->nseq, (int) msa->alen);
+
+ esl_msafile_afa_Write(stdout, msa);
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ exit(0);
+}
+/*::cexcerpt::msafile_afa_example2::end::*/
+#endif /*eslMSAFILE_AFA_EXAMPLE2*/
+/*--------------------- end of examples -------------------------*/
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_afa.h b/esl_msafile_afa.h
new file mode 100644
index 0000000..a8da0f6
--- /dev/null
+++ b/esl_msafile_afa.h
@@ -0,0 +1,18 @@
+/* i/o of multiple sequence alignment files in aligned FASTA format
+ */
+#ifndef eslMSAFILE_AFA_INCLUDED
+#define eslMSAFILE_AFA_INCLUDED
+
+#include "esl_msa.h"
+#include "esl_msafile.h"
+
+extern int esl_msafile_afa_SetInmap (ESL_MSAFILE *afp);
+extern int esl_msafile_afa_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type);
+extern int esl_msafile_afa_Read (ESL_MSAFILE *afp, ESL_MSA **ret_msa);
+extern int esl_msafile_afa_Write (FILE *fp, const ESL_MSA *msa);
+
+#endif /* eslMSAFILE_AFA_INCLUDED */
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_clustal.c b/esl_msafile_clustal.c
new file mode 100644
index 0000000..bc7ebeb
--- /dev/null
+++ b/esl_msafile_clustal.c
@@ -0,0 +1,1075 @@
+/* i/o of multiple sequence alignment files in Clustal-like formats
+ *
+ * Contents:
+ * 1. API for reading/writing Clustal and Clustal-like formats
+ * 2. Internal routines for Clustal formats.
+ * 3. Unit tests.
+ * 4. Test driver.
+ * 5. Example.
+ * 6. Copyright and license information.
+ *
+ * This module is responsible for i/o of both eslMSAFILE_CLUSTAL and
+ * eslMSAFILE_CLUSTALLIKE alignment formats.
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#include "esl_mem.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_clustal.h"
+
+static int make_text_consensus_line(const ESL_MSA *msa, char **ret_consline);
+#ifdef eslAUGMENT_ALPHABET
+static int make_digital_consensus_line(const ESL_MSA *msa, char **ret_consline);
+#endif
+
+/*****************************************************************
+ *# 1. API for reading/writing Clustal and Clustal-like formats
+ *****************************************************************/
+
+/* Function: esl_msafile_clustal_SetInmap()
+ * Synopsis: Configure input map for CLUSTAL, CLUSTALLIKE formats.
+ *
+ * Purpose: Set the <afp->inmap> for Clustal-like formats.
+ *
+ * Text mode accepts any <isgraph()> character.
+ * Digital mode enforces the usual Easel alphabets.
+ */
+int
+esl_msafile_clustal_SetInmap(ESL_MSAFILE *afp)
+{
+ int sym;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc)
+ {
+ for (sym = 0; sym < 128; sym++)
+ afp->inmap[sym] = afp->abc->inmap[sym];
+ afp->inmap[0] = esl_abc_XGetUnknown(afp->abc);
+ }
+#endif
+ if (! afp->abc)
+ {
+ for (sym = 1; sym < 128; sym++)
+ afp->inmap[sym] = (isgraph(sym) ? sym : eslDSQ_ILLEGAL);
+ afp->inmap[0] = '?';
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_msafile_clustal_GuessAlphabet()
+ * Synopsis: Guess the alphabet of an open Clustal MSA input.
+ *
+ * Purpose: Guess the alpbabet of the sequences in open
+ * Clustal format MSA file <afp>.
+ *
+ * On a normal return, <*ret_type> is set to <eslDNA>,
+ * <eslRNA>, or <eslAMINO>, and <afp> is reset to its
+ * original position.
+ *
+ * Args: afp - open Clustal format MSA file
+ * ret_type - RETURN: <eslDNA>, <eslRNA>, or <eslAMINO>
+ *
+ * Returns: <eslOK> on success.
+ * <eslENOALPHABET> if alphabet type can't be determined.
+ * In either case, <afp> is rewound to the position it
+ * started at.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslESYS> on failures of fread() or other system calls
+ */
+int
+esl_msafile_clustal_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type)
+{
+ int alphatype = eslUNKNOWN;
+ esl_pos_t anchor = -1;
+ int threshold[3] = { 500, 5000, 50000 }; /* we check after 500, 5000, 50000 residues; else we go to EOF */
+ int nsteps = 3;
+ int step = 0;
+ int nres = 0;
+ int x;
+ int64_t ct[26];
+ char *p, *tok;
+ esl_pos_t n, toklen, pos;
+ int status;
+
+ for (x = 0; x < 26; x++) ct[x] = 0;
+
+ anchor = esl_buffer_GetOffset(afp->bf);
+ if ((status = esl_buffer_SetAnchor(afp->bf, anchor)) != eslOK) { status = eslEINCONCEIVABLE; goto ERROR; } /* [eslINVAL] can't happen here */
+
+ /* Ignore the first nonblank line, which says "CLUSTAL W (1.83) multiple sequence alignment" or some such */
+ while ( (status = esl_buffer_GetLine(afp->bf, &p, &n)) == eslOK && esl_memspn(p, n, " \t") == n) ;
+ if (status == eslEOF) ESL_XFAIL(eslENOALPHABET, afp->errmsg, "can't determine alphabet: no alignment data found");
+ else if (status != eslOK) goto ERROR;
+
+ while ( (status = esl_buffer_GetLine(afp->bf, &p, &n)) == eslOK)
+ {
+ if ((status = esl_memtok(&p, &n, " \t", &tok, &toklen)) != eslOK) continue; /* ignore blank lines */
+ /* p now points to the rest of the sequence line, after a name */
+
+ /* count characters into ct[] array */
+ for (pos = 0; pos < n; pos++)
+ if (isalpha(p[pos])) {
+ x = toupper(p[pos]) - 'A';
+ ct[x]++;
+ nres++;
+ }
+ /* note that GuessAlphabet() is robust against the optional coord lines
+ * and the annotation lines -- it only counts ascii characters.
+ */
+
+ /* try to stop early, checking after 500, 5000, and 50000 residues: */
+ if (step < nsteps && nres > threshold[step]) {
+ if ((status = esl_abc_GuessAlphabet(ct, &alphatype)) == eslOK) goto DONE; /* (eslENOALPHABET) */
+ step++;
+ }
+ }
+ if (status != eslEOF) goto ERROR; /* [eslEMEM,eslESYS,eslEINCONCEIVABLE] */
+ status = esl_abc_GuessAlphabet(ct, &alphatype); /* (eslENOALPHABET) */
+
+ DONE:
+ esl_buffer_SetOffset(afp->bf, anchor); /* Rewind to where we were. */
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ *ret_type = alphatype;
+ return status;
+
+ ERROR:
+ if (anchor != -1) {
+ esl_buffer_SetOffset(afp->bf, anchor);
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ }
+ *ret_type = eslUNKNOWN;
+ return status;
+}
+
+
+/* Function: esl_msafile_clustal_Read()
+ * Synopsis: Read in a CLUSTAL or CLUSTALLIKE alignment.
+ *
+ * Purpose: Read an MSA from an open <ESL_MSAFILE> <afp>, parsing
+ * for Clustal or Clustal-like format, starting from the
+ * current point. (<afp->format> is expected to be
+ * <eslMSAFILE_CLUSTAL> or <eslMSAFILE_CLUSTALLIKE>.) Create a
+ * new multiple alignment, and return a ptr to that
+ * alignment in <*ret_msa>. Caller is responsible for
+ * free'ing this <ESL_MSA>.
+ *
+ * Args: afp - open <ESL_MSAFILE>
+ * ret_msa - RETURN: newly parsed <ESL_MSA>
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEOF> if no (more) alignment data are found in
+ * <afp>, and <afp> is returned at EOF.
+ *
+ * <eslEFORMAT> on a parse error. <*ret_msa> is set to
+ * <NULL>. <afp> contains information sufficient for
+ * constructing useful diagnostic output:
+ * | <afp->errmsg> | user-directed error message |
+ * | <afp->linenumber> | line # where error was detected |
+ * | <afp->line> | offending line (not NUL-term) |
+ * | <afp->n> | length of offending line |
+ * | <afp->bf->filename> | name of the file |
+ * and <afp> is poised at the start of the following line,
+ * so (in principle) the caller could try to resume
+ * parsing.
+ *
+ * Throws: <eslEMEM> - an allocation failed.
+ * <eslESYS> - a system call such as fread() failed
+ * <eslEINCONCEIVABLE> - "impossible" corruption
+ */
+int
+esl_msafile_clustal_Read(ESL_MSAFILE *afp, ESL_MSA **ret_msa)
+{
+ ESL_MSA *msa = NULL;
+ char *p = NULL;
+ esl_pos_t n = 0;
+ char *tok = NULL;
+ esl_pos_t ntok = 0;
+ int nblocks = 0;
+ int idx = 0;
+ int nseq = 0;
+ int64_t alen = 0;
+ int64_t cur_alen;
+ esl_pos_t pos;
+ esl_pos_t name_start, name_len;
+ esl_pos_t seq_start, seq_len;
+ esl_pos_t block_seq_start, block_seq_len;
+ int status;
+
+ ESL_DASSERT1( (afp->format == eslMSAFILE_CLUSTAL || afp->format == eslMSAFILE_CLUSTALLIKE) );
+
+ afp->errmsg[0] = '\0';
+
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc && (msa = esl_msa_CreateDigital(afp->abc, 16, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+#endif
+ if (! afp->abc && (msa = esl_msa_Create( 16, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ /* skip leading blank lines in file */
+ while ( (status = esl_msafile_GetLine(afp, &p, &n)) == eslOK && esl_memspn(afp->line, afp->n, " \t") == afp->n) ;
+ if (status != eslOK) goto ERROR; /* includes normal EOF */
+
+ /* That first line says something like: "CLUSTAL W (1.83) multiple sequence alignment" */
+ if (esl_memtok(&p, &n, " \t", &tok, &ntok) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "missing CLUSTAL header");
+ if (afp->format == eslMSAFILE_CLUSTAL && ! esl_memstrpfx(tok, ntok, "CLUSTAL")) ESL_XFAIL(eslEFORMAT, afp->errmsg, "missing CLUSTAL header");
+ if (! esl_memstrcontains(p, n, "multiple sequence alignment")) ESL_XFAIL(eslEFORMAT, afp->errmsg, "missing CLUSTAL header");
+
+ /* skip blank lines again */
+ do {
+ status = esl_msafile_GetLine(afp, &p, &n);
+ if (status == eslEOF) ESL_XFAIL(eslEFORMAT, afp->errmsg, "no alignment data following header");
+ else if (status != eslOK) goto ERROR;
+ } while (esl_memspn(afp->line, afp->n, " \t") == afp->n); /* idiom for "blank line" */
+
+ /* Read the file a line at a time. */
+ do { /* afp->line, afp->n is now the first line of a block... */
+ idx = 0;
+ do {
+ for (pos = 0; pos < n; pos++) if (! isspace(p[pos])) break; name_start = pos;
+ for (pos = pos+1; pos < n; pos++) if ( isspace(p[pos])) break; name_len = pos - name_start;
+ for (pos = pos+1; pos < n; pos++) if (! isspace(p[pos])) break; seq_start = pos;
+ if (pos >= n) ESL_XFAIL(eslEFORMAT, afp->errmsg, "invalid alignment line");
+ for (pos = pos+1; pos < n; pos++) if ( isspace(p[pos])) break; seq_len = pos - seq_start; /* expect one block; ignore trailing stuff, inc. optional coords */
+
+ if (idx == 0) {
+ block_seq_start = seq_start;
+ block_seq_len = seq_len;
+ } else {
+ if (seq_start != block_seq_start) ESL_XFAIL(eslEFORMAT, afp->errmsg, "sequence start is misaligned");
+ if (seq_len != block_seq_len) ESL_XFAIL(eslEFORMAT, afp->errmsg, "sequence end is misaligned");
+ }
+
+ /* Store the sequence name. */
+ if (nblocks == 0) {
+ /* make sure we have room for another sequence */
+ if (idx >= msa->sqalloc && (status = esl_msa_Expand(msa)) != eslOK) goto ERROR;
+ if ( (status = esl_msa_SetSeqName(msa, idx, p+name_start, name_len)) != eslOK) goto ERROR;
+ nseq++;
+ } else {
+ if (! esl_memstrcmp(p+name_start, name_len, msa->sqname[idx]))
+ ESL_XFAIL(eslEFORMAT, afp->errmsg, "expected sequence %s on this line, but saw %.*s", msa->sqname[idx], (int) name_len, p+name_start);
+ }
+
+ /* Append the sequence. */
+ cur_alen = alen;
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) { status = esl_abc_dsqcat(afp->inmap, &(msa->ax[idx]), &(cur_alen), p+seq_start, seq_len); }
+#endif
+ if (! msa->abc) { status = esl_strmapcat (afp->inmap, &(msa->aseq[idx]), &(cur_alen), p+seq_start, seq_len); }
+ if (status == eslEINVAL) ESL_XFAIL(eslEFORMAT, afp->errmsg, "one or more invalid sequence characters");
+ else if (status != eslOK) goto ERROR;
+ if (cur_alen - alen != seq_len) ESL_XFAIL(eslEFORMAT, afp->errmsg, "unexpected number of seq characters");
+
+ /* get next line. if it's a consensus line, we're done with the block */
+ status = esl_msafile_GetLine(afp, &p, &n);
+ if (status == eslEOF) ESL_XFAIL(eslEFORMAT, afp->errmsg, "alignment block did not end with consensus line");
+ else if (status != eslOK) goto ERROR;
+
+ idx++;
+ } while (esl_memspn(afp->line, afp->n, " .:*") < afp->n); /* end loop over a block */
+
+ if (idx != nseq) ESL_XFAIL(eslEFORMAT, afp->errmsg, "last block didn't contain same # of seqs as earlier blocks");
+
+ /* skip blank lines until we find start of next block, or EOF */
+ do {
+ status = esl_msafile_GetLine(afp, &p, &n);
+ if (status == eslEOF) break;
+ else if (status != eslOK) goto ERROR;
+ } while (esl_memspn(p, n, " \t") == n);
+
+ alen += block_seq_len;
+ nblocks++;
+ } while (status == eslOK); /* normal end has status == EOF after last block. */
+
+ msa->nseq = nseq;
+ msa->alen = alen;
+ if (( status = esl_msa_SetDefaultWeights(msa)) != eslOK) goto ERROR;
+ *ret_msa = msa;
+ return eslOK;
+
+ ERROR:
+ if (msa) esl_msa_Destroy(msa);
+ *ret_msa = NULL;
+ return status;
+}
+
+
+/* Function: esl_msafile_clustal_Write()
+ * Synopsis: Write a CLUSTAL format alignment file to a stream.
+ *
+ * Purpose: Write alignment <msa> to output stream <fp>, in
+ * format <fmt>. If <fmt> is <eslMSAFILE_CLUSTAL>,
+ * write strict CLUSTAL 2.1 format. If <fmt>
+ * is <eslMSAFILE_CLUSTALLIKE>, put "EASEL (VERSION)"
+ * in the header.
+ *
+ * The alignment is written in blocks of 60 aligned
+ * residues at a time.
+ *
+ * Constructing the CLUSTAL consensus line properly
+ * requires knowing the alphabet. If the <msa> is in text
+ * mode, we don't know the alphabet, so then we use a
+ * simplified consensus line, with '*' marking completely
+ * conserved columns, ' ' on everything else. If the <msa>
+ * is in digital mode and of type <eslAMINO>, then we also
+ * use Clustal's "strong" and "weak" residue group
+ * annotations, ':' and '.'. Strong groups are STA, NEQK,
+ * NHQK, NDEQ, QHRK, MILV, MILF, HY, and FYW. Weak groups
+ * are CSA, ATV, SAG, STNK, STPA, SGND, SNDEQK, NDEQHK,
+ * NEQHRK, FVLIM, and HFY.
+ *
+ * Args: fp - open output stream, writable
+ * msa - alignment to write
+ * fmt - eslMSAFILE_CLUSTAL or eslMSAFILE_CLUSTALLIKE
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEWRITE> on any system write error, such as filled disk.
+ */
+int
+esl_msafile_clustal_Write(FILE *fp, const ESL_MSA *msa, int fmt)
+{
+ int cpl = 60;
+ int maxnamelen = 0;
+ int namelen;
+ char *consline = NULL;
+ char *buf = NULL;
+ int64_t apos;
+ int i;
+ int status;
+
+ ESL_ALLOC(buf, sizeof(char) * (cpl+1));
+ buf[cpl] = '\0';
+ for (i = 0; i < msa->nseq; i++)
+ {
+ namelen = strlen(msa->sqname[i]);
+ maxnamelen = ESL_MAX(namelen, maxnamelen);
+ }
+
+ /* Make a CLUSTAL-like consensus line */
+#ifdef eslAUGMENT_ALPHABET
+ // if (msa->abc && (status = make_digital_consensus_line(msa, &consline)) != eslOK) goto ERROR;
+ if (msa->abc && (status = make_digital_consensus_line(msa, &consline)) != eslOK) goto ERROR;
+#endif
+ if (! msa->abc && (status = make_text_consensus_line(msa, &consline)) != eslOK) goto ERROR;
+
+ /* The magic header */
+ if (fmt == eslMSAFILE_CLUSTAL) { if (fprintf(fp, "CLUSTAL 2.1 multiple sequence alignment\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "clustal msa write failed"); }
+ else if (fmt == eslMSAFILE_CLUSTALLIKE) { if (fprintf(fp, "EASEL (%s) multiple sequence alignment\n", EASEL_VERSION) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "clustal msa write failed"); }
+
+ /* The alignment */
+ for (apos = 0; apos < msa->alen; apos += cpl)
+ {
+ if (fprintf(fp, "\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "clustal msa write failed");
+ for (i = 0; i < msa->nseq; i++)
+ {
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) esl_abc_TextizeN(msa->abc, msa->ax[i]+apos+1, cpl, buf);
+#endif
+ if (! msa->abc) strncpy(buf, msa->aseq[i]+apos, cpl);
+ if (fprintf(fp, "%-*s %s\n", maxnamelen, msa->sqname[i], buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "clustal msa write failed");
+ }
+ strncpy(buf, consline+apos, cpl);
+ if (fprintf(fp, "%-*s %s\n", maxnamelen, "", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "clustal msa write failed");
+ }
+
+ free(buf);
+ free(consline);
+ return eslOK;
+
+ ERROR:
+ if (buf) free(buf);
+ if (consline) free(consline);
+ return status;
+}
+/*---------------- end, Clustal API -----------------------------*/
+
+
+
+/*****************************************************************
+ * 2. Internal routines for Clustal formats
+ *****************************************************************/
+
+/* Clustal consensus lines.
+ * '*' : 100% conserved positions
+ * ':' : all residues in column belong to a "strong group"
+ * '.' : all residues in column belong to a "weak group"
+ * ' ' : otherwise
+ *
+ * Gap characters count, and ambiguity codes are interpreted verbatim,
+ * so even a single gap or ambiguity code makes the column a ' '.
+ *
+ * From examining the source code for ClustalW (as it writes its
+ * "self explanatory format", ahem!):
+ * strong groups = STA, NEQK, NHQK, NDEQ, QHRK, MILV, MILF,
+ * HY, FYW
+ * weak groups = CSA, ATV, SAG, STNK, STPA, SGND, SNDEQK,
+ * NDEQHK, NEQHRK, FVLIM, HFY
+ *
+ * These groups only apply to protein data, and therefore only to
+ * digital alignments using an <eslAMINO> alphabet.
+
+ * Calculating the consensus line can be compute-intensive, for large
+ * alignments. A naive implementation (for each column, collect
+ * residue counts, compare to each conservation group) was judged too
+ * slow: 16.2s to write the Pkinase full alignment, compared to 1.5s
+ * to write Stockholm format [SRE:J8/22]. Here we use a slightly less
+ * naive implementation, which collects a bit vector (one bit per
+ * residue) for each column, and traverses the alignment in stride
+ * (sequences, then columns). Writing Clustal format Pkinase now takes
+ * 2.3s, and most of the difference w.r.t. Stockholm is now assignable
+ * to the smaller width (thus greater number of blocks) written for
+ * Clustal (60 cpl vs 200) rather than to consensus construction.
+ *
+ * An oversophisticated approach could use a finite
+ * automaton to store all groups in one machine, then to use the FA to
+ * process each residue seen in a column; for most columns, we would
+ * quickly reach a rejection state (most columns don't belong to
+ * a conservation group, especially in large alignments). For a sketch
+ * of how to construct and use such an automaton, xref SRE:J8/22.
+ * I decided this was probably overkill, and didn't implement it.
+ */
+
+
+/* make_text_consensus_line()
+ *
+ * Given a text mode <msa>, allocate and create a CLUSTAL-style
+ * consensus line; return it in <*ret_consline>. Caller is responsible
+ * for free'ing this string.
+ *
+ * In text mode, we don't know the alphabet; in particular, we can't
+ * know if the data are amino acids, so we don't know if it's
+ * appropriate to use the amino acid group codes. So we don't;
+ * in text mode, only '*' and ' ' appear in consensus lines.
+ *
+ * The consensus line is numbered 0..alen-1, and is NUL-terminated.
+ *
+ * Returns <eslOK> on success.
+ * No normal failure codes.
+ * Throws <eslEMEM> on allocation error.
+ */
+static int
+make_text_consensus_line(const ESL_MSA *msa, char **ret_consline)
+{
+ char *consline = NULL;
+ uint32_t *v = NULL;
+ uint32_t tmpv, maxv;
+ int n;
+ int idx, apos, x;
+ int status;
+
+ ESL_ALLOC(consline, sizeof(char) * (msa->alen+1));
+ ESL_ALLOC(v, sizeof(uint32_t) * (msa->alen));
+ for (apos = 0; apos < msa->alen; apos++)
+ v[apos] = 0;
+
+ for (idx = 0; idx < msa->nseq; idx++)
+ for (apos = 0; apos < msa->alen; apos++)
+ {
+ x = toupper(msa->aseq[idx][apos]) - 'A';
+ if (x >= 0 && x < 26) v[apos] |= (1 << x);
+ else v[apos] |= (1 << 26);
+ }
+ maxv = (1 << 26) - 1;
+
+ for (apos = 0; apos < msa->alen; apos++)
+ {
+ for (n = 0, tmpv = v[apos]; tmpv; n++) tmpv &= tmpv-1; /* Kernighan magic: count # of bits set in tmpv */
+ consline[apos] = ((n == 1 && v[apos] < maxv) ? '*' : ' ');
+ }
+ consline[msa->alen] = '\0';
+
+ *ret_consline = consline;
+ free(v);
+ return eslOK;
+
+ ERROR:
+ if (v) free(v);
+ if (consline) free(consline);
+ *ret_consline = NULL;
+ return status;
+}
+
+
+/* make_digital_consensus_line()
+ *
+ * Exactly the same as make_text_consensus_line(), except for
+ * digital mode <msa>.
+ */
+#ifdef eslAUGMENT_ALPHABET
+static int
+matches_group_digital(ESL_ALPHABET *abc, uint32_t v, char *group)
+{
+ uint32_t gv = 0;
+ ESL_DSQ sym;
+ char *c;
+
+ for (c = group; *c; c++) {
+ sym = esl_abc_DigitizeSymbol(abc, *c);
+ gv |= (1 << sym);
+ }
+ return ( ((v & gv) == v) ? TRUE : FALSE);
+}
+
+static int
+make_digital_consensus_line(const ESL_MSA *msa, char **ret_consline)
+{
+ char *consline = NULL;
+ uint32_t *v = NULL;
+ uint32_t tmpv, maxv;
+ int n;
+ int idx, apos;
+ int status;
+
+ /* if this ever becomes a problem, easy enough to make v a uint64_t to get up to Kp<=64 */
+ if (msa->abc->Kp > 32) ESL_EXCEPTION(eslEINVAL, "Clustal format writer cannot handle digital alphabets of Kp>32 residues");
+
+ ESL_ALLOC(v, sizeof(uint32_t) * (msa->alen+1));
+ ESL_ALLOC(consline, sizeof(char) * (msa->alen+1));
+ for (apos = 0; apos <= msa->alen; apos++)
+ v[apos] = 0;
+
+ for (idx = 0; idx < msa->nseq; idx++)
+ for (apos = 1; apos <= msa->alen; apos++)
+ v[apos] |= (1 << msa->ax[idx][apos]);
+
+ maxv = (1 << msa->abc->K) - 1; /* maxv: has all canonical residue bits set */
+
+ for (apos = 1; apos <= msa->alen; apos++)
+ {
+ consline[apos-1] = ' ';
+
+ for (n = 0, tmpv = v[apos]; tmpv; n++) tmpv &= tmpv-1; /* Kernighan magic: count # of bits set in tmpv */
+
+ if (n == 0 || n > 6) continue; /* n==0 shouldn't happen; n > 6 means too many different residues seen */
+ else if (v[apos] > maxv) continue; /* gap or ambiguity chars seen; column must be left unannotated */
+ else if (n == 1) consline[apos-1] = '*'; /* complete conservation of a canonical residue */
+ else if (msa->abc->type == eslAMINO)
+ {
+ if (matches_group_digital(msa->abc, v[apos], "STA")) consline[apos-1] = ':';
+ else if (matches_group_digital(msa->abc, v[apos], "NEQK")) consline[apos-1] = ':';
+ else if (matches_group_digital(msa->abc, v[apos], "NHQK")) consline[apos-1] = ':';
+ else if (matches_group_digital(msa->abc, v[apos], "NDEQ")) consline[apos-1] = ':';
+ else if (matches_group_digital(msa->abc, v[apos], "QHRK")) consline[apos-1] = ':';
+ else if (matches_group_digital(msa->abc, v[apos], "MILV")) consline[apos-1] = ':';
+ else if (matches_group_digital(msa->abc, v[apos], "MILF")) consline[apos-1] = ':';
+ else if (matches_group_digital(msa->abc, v[apos], "HY")) consline[apos-1] = ':';
+ else if (matches_group_digital(msa->abc, v[apos], "FYW")) consline[apos-1] = ':';
+
+ else if (matches_group_digital(msa->abc, v[apos], "CSA")) consline[apos-1] = '.';
+ else if (matches_group_digital(msa->abc, v[apos], "ATV")) consline[apos-1] = '.';
+ else if (matches_group_digital(msa->abc, v[apos], "SAG")) consline[apos-1] = '.';
+ else if (matches_group_digital(msa->abc, v[apos], "STNK")) consline[apos-1] = '.';
+ else if (matches_group_digital(msa->abc, v[apos], "STPA")) consline[apos-1] = '.';
+ else if (matches_group_digital(msa->abc, v[apos], "SGND")) consline[apos-1] = '.';
+ else if (matches_group_digital(msa->abc, v[apos], "SNDEQK")) consline[apos-1] = '.';
+ else if (matches_group_digital(msa->abc, v[apos], "NDEQHK")) consline[apos-1] = '.';
+ else if (matches_group_digital(msa->abc, v[apos], "NEQHRK")) consline[apos-1] = '.';
+ else if (matches_group_digital(msa->abc, v[apos], "FVLIM")) consline[apos-1] = '.';
+ else if (matches_group_digital(msa->abc, v[apos], "HFY")) consline[apos-1] = '.';
+ }
+ }
+ consline[apos-1] = '\0';
+
+ *ret_consline = consline;
+ free(v);
+ return eslOK;
+
+ ERROR:
+ if (v) free(v);
+ if (consline) free(consline);
+ *ret_consline = NULL;
+ return eslOK;
+}
+
+
+#endif /*eslAUGMENT_ALPHABET*/
+/*-------------- end, internal clustal routines -----------------*/
+
+
+/*****************************************************************
+ * 3. Unit tests.
+ *****************************************************************/
+#ifdef eslMSAFILE_CLUSTAL_TESTDRIVE
+
+static void
+utest_write_good1(FILE *ofp, int *ret_format, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("MUSCLE (3.7) multiple sequence alignment\n", ofp);
+ fputs("\n", ofp);
+ fputs("\n", ofp);
+ fputs("MYG_PHYCA --------V-LSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRFKHLKT\n", ofp);
+ fputs("GLB5_PETMA PIVDTGSVAPLSAAEKTKIRSAWAPVYSTYETSGVDILVKFFTSTPAAQEFFPKFKGLTT\n", ofp);
+ fputs("HBB_HUMAN --------VHLTPEEKSAVTALWGKV--NVDEVGGEALGRLLVVYPWTQRFFESFGDLST\n", ofp);
+ fputs("HBA_HUMAN --------V-LSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHF-----\n", ofp);
+ fputs(" . *: :. : *. * * : * .:: * : * * \n", ofp);
+ fputs("\n", ofp);
+ fputs("MYG_PHYCA EAEMKASEDLKKHGVTVLTALGAILKKKGH---HEAELKPLAQSHATKHKIPIKYLEFIS\n", ofp);
+ fputs("GLB5_PETMA ADQLKKSADVRWHAERIINAVNDAVASMDDTEKMSMKLRDLSGKHAKSFQVDPQYFKVLA\n", ofp);
+ fputs("HBB_HUMAN PDAVMGNPKVKAHGKKVLGAFSDGLAHLDN---LKGTFATLSELHCDKLHVDPENFRLLG\n", ofp);
+ fputs("HBA_HUMAN -DLSHGSAQVKGHGKKVADALTNAVAHVDD---MPNALSALSDLHAHKLRVDPVNFKLLS\n", ofp);
+ fputs(" \n", ofp); /* deliberately made blank */
+ fputs("\n", ofp);
+ fputs("MYG_PHYCA EAIIHVLHSRHPGDFGADAQGAMNKALELFRKDIAAKYKELGYQG\n", ofp);
+ fputs("GLB5_PETMA AVI---------ADTVAAGDAGFEKLMSMICILLRSAY-------\n", ofp);
+ fputs("HBB_HUMAN NVLVCVLAHHFGKEFTPPVQAAYQKVVAGVANALAHKYH------\n", ofp);
+ fputs("HBA_HUMAN HCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR------\n", ofp);
+ fputs(" : : . .. :* : . : * \n", ofp);
+ fputs("\n", ofp);
+
+ *ret_format = eslMSAFILE_CLUSTALLIKE;
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 4;
+ *ret_alen = 165;
+}
+
+static void
+utest_write_good2(FILE *ofp, int *ret_format, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("CLUSTAL W (1.81) multiple sequence alignment\n", ofp);
+ fputs("\n", ofp);
+ fputs("tRNA2 UCCGAUAUAGUGUAACGGCUAUCACAUCACGCUUUCACCGUGG-AGACCGGGGUUCGACU\n", ofp);
+ fputs("tRNA3 UCCGUGAUAGUUUAAUGGUCAGAAUGG-GCGCUUGUCGCGUGCCAGAUCGGGGUUCAAUU\n", ofp);
+ fputs("tRNA5 GGGCACAUGGCGCAGUUGGUAGCGCGCUUCCCUUGCAAGGAAGAGGUCAUCGGUUCGAUU\n", ofp);
+ fputs("tRNA1 GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUC\n", ofp);
+ fputs("tRNA4 GCUCGUAUGGCGCAGUGG-UAGCGCAGCAGAUUGCAAAUCUGUUGGUCCUUAGUUCGAUC\n", ofp);
+ fputs(" * * * * * * * **** * \n", ofp);
+ fputs("\n", ofp);
+ fputs("tRNA2 CCCCGUAUCGGAG\n", ofp);
+ fputs("tRNA3 CCCCGUCGCGGAG\n", ofp);
+ fputs("tRNA5 CCGGUUGCGUCCA\n", ofp);
+ fputs("tRNA1 CACAGAAUUCGCA\n", ofp);
+ fputs("tRNA4 CUGAGUGCGAGCU\n", ofp);
+ fputs(" * \n", ofp);
+
+ *ret_format = eslMSAFILE_CLUSTAL;
+ *ret_alphatype = eslRNA;
+ *ret_nseq = 5;
+ *ret_alen = 73;
+}
+
+/* An example of clustal format with optional sequence coords;
+ * a quickly-taken subset of a larger alignment reported as a bug.
+ */
+static void
+utest_write_good3(FILE *ofp, int *ret_format, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("CLUSTAL 2.1 multiple sequence alignment\n", ofp);
+ fputs("\n", ofp);
+ fputs("gi|85091828|ref|XP_959093.1| MSDFTSKVKVLRDGQKPEFPSN----ANTLEYAQSLDAQDELRHFRNEFI 46\n", ofp);
+ fputs("gi|70993990|ref|XP_751842.1| ----MSTNGTLS---KPEFPAN----AASKEYAASLDAADPFAGFREKFI 39\n", ofp);
+ fputs("gi|71001376|ref|XP_755369.1| ---MGSRLHVQVIHGGPPLPYKDDIRAFGKEYAEQLDAQDPLRRFRDEFI 47\n", ofp);
+ fputs("gi|71744026|ref|XP_803513.1| -----------------------------------MDRNDPLQVHRDAFN 15\n", ofp);
+ fputs(" : : \n", ofp);
+ fputs("\n", ofp);
+ fputs("gi|85091828|ref|XP_959093.1| IPTRASLKKKALDGI--------------IPGTQANGTTTSTDADTPCIY 82\n", ofp);
+ fputs("gi|70993990|ref|XP_751842.1| IPSKANIASTKLA----------------KPGLSSE----------PCIY 63\n", ofp);
+ fputs("gi|71001376|ref|XP_755369.1| IPSKKDLKRKTLFPNDGMYSCGHPICFANTSCACVHAAETEETSDEKCIY 97\n", ofp);
+ fputs("gi|71744026|ref|XP_803513.1| IPKRRDGS--------------------------------------DHVY 27\n", ofp);
+ fputs(" *\n", ofp);
+
+ *ret_format = eslMSAFILE_CLUSTAL;
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 4;
+ *ret_alen = 100;
+}
+
+
+static void
+utest_goodfile(char *filename, int testnumber, int expected_format, int expected_alphatype, int expected_nseq, int expected_alen)
+{
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa1 = NULL;
+ ESL_MSA *msa2 = NULL;
+ char tmpfile1[32] = "esltmpXXXXXX";
+ char tmpfile2[32] = "esltmpXXXXXX";
+ FILE *ofp = NULL;
+ int status;
+
+ /* guessing both the format and the alphabet should work: this is a digital open */
+ if ( (status = esl_msafile_Open(&abc, filename, NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK) esl_fatal("clustal good file test %d failed: digital open", testnumber);
+ if (afp->format != expected_format) esl_fatal("clustal good file test %d failed: format autodetection", testnumber);
+ if (abc->type != expected_alphatype) esl_fatal("clustal good file test %d failed: alphabet autodetection", testnumber);
+
+ /* This is a digital read, using <abc>. */
+ if ( (status = esl_msafile_clustal_Read(afp, &msa1)) != eslOK) esl_fatal("clustal good file test %d failed: msa read, digital", testnumber);
+ if (msa1->nseq != expected_nseq || msa1->alen != expected_alen) esl_fatal("clustal good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa1, NULL) != eslOK) esl_fatal("clustal good file test %d failed: msa1 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (digital write) */
+ if ( (status = esl_tmpfile_named(tmpfile1, &ofp)) != eslOK) esl_fatal("clustal good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_clustal_Write(ofp, msa1, expected_format)) != eslOK) esl_fatal("clustal good file test %d failed: msa write, digital", testnumber);
+ fclose(ofp);
+
+ /* now open and read it as text mode, in known format. (We have to pass fmtd now, to deal with the possibility of a nonstandard name width) */
+ if ( (status = esl_msafile_Open(NULL, tmpfile1, NULL, expected_format, NULL, &afp)) != eslOK) esl_fatal("clustal good file test %d failed: text mode open", testnumber);
+ if ( (status = esl_msafile_clustal_Read(afp, &msa2)) != eslOK) esl_fatal("clustal good file test %d failed: msa read, text", testnumber);
+ if (msa2->nseq != expected_nseq || msa2->alen != expected_alen) esl_fatal("clustal good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("clustal good file test %d failed: msa2 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (text write) */
+ if ( (status = esl_tmpfile_named(tmpfile2, &ofp)) != eslOK) esl_fatal("clustal good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_clustal_Write(ofp, msa2, expected_format)) != eslOK) esl_fatal("clustal good file test %d failed: msa write, text", testnumber);
+ fclose(ofp);
+ esl_msa_Destroy(msa2);
+
+ /* open and read it in digital mode */
+ if ( (status = esl_msafile_Open(&abc, tmpfile1, NULL, expected_format, NULL, &afp)) != eslOK) esl_fatal("clustal good file test %d failed: 2nd digital mode open", testnumber);
+ if ( (status = esl_msafile_clustal_Read(afp, &msa2)) != eslOK) esl_fatal("clustal good file test %d failed: 2nd digital msa read", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("clustal good file test %d failed: msa2 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* this msa <msa2> should be identical to <msa1> */
+ if (esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal("clustal good file test %d failed: msa compare", testnumber);
+
+ remove(tmpfile1);
+ remove(tmpfile2);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_alphabet_Destroy(abc);
+}
+
+static void
+write_test_msas(FILE *ofp1, FILE *ofp2)
+{
+ fprintf(ofp1, "EASEL (X.x) multiple sequence alignment\n");
+ fprintf(ofp1, "\n");
+ fprintf(ofp1, "seq1 ..acdefghiklmnpqrstvwy\n");
+ fprintf(ofp1, "seq2 ..acdefghiklmnpqrstv--\n");
+ fprintf(ofp1, "seq3 aaacdefghiklmnpqrstv--\n");
+ fprintf(ofp1, "seq4 ..acdefghiklmnpqrstvwy\n");
+ fprintf(ofp1, " ****************** \n");
+ fprintf(ofp1, "\n");
+ fprintf(ofp1, "seq1 ACDEFGHIKLMNPQRSTVWY\n");
+ fprintf(ofp1, "seq2 ACDEFGHIKLMNPQRSTVWY\n");
+ fprintf(ofp1, "seq3 ACDEFGHIKLMNPQRSTVWY\n");
+ fprintf(ofp1, "seq4 ACDEFGHIKLMNPQRSTVWY\n");
+ fprintf(ofp1, " ********************\n");
+ fprintf(ofp1, "\n");
+ fprintf(ofp1, "seq1 ..\n");
+ fprintf(ofp1, "seq2 YY\n");
+ fprintf(ofp1, "seq3 ..\n");
+ fprintf(ofp1, "seq4 ..\n");
+ fprintf(ofp1, "\n");
+
+ fprintf(ofp2, "# STOCKHOLM 1.0\n");
+ fprintf(ofp2, "\n");
+ fprintf(ofp2, "seq1 ..acdefghiklmnpqrstvwyACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "seq2 ..acdefghiklmnpqrstv--ACDEFGHIKLMNPQRSTVWYYY\n");
+ fprintf(ofp2, "seq3 aaacdefghiklmnpqrstv--ACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "seq4 ..acdefghiklmnpqrstvwyACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "//\n");
+}
+
+static void
+read_test_msas_digital(char *alnfile, char *stkfile)
+{
+ char msg[] = "CLUSTAL msa digital read unit test failed";
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ FILE *alnfp, *stkfp;
+ char alnfile2[32] = "esltmpaln2XXXXXX";
+ char stkfile2[32] = "esltmpstk2XXXXXX";
+
+ if ( esl_msafile_Open(&abc, alnfile, NULL, eslMSAFILE_CLUSTALLIKE, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( !abc || abc->type != eslAMINO) esl_fatal(msg);
+ if ( esl_msafile_Open(&abc, stkfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_clustal_Read (afp1, &msa1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+
+ if ( esl_msafile_clustal_Read (afp1, &msa3) != eslEOF) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa3) != eslEOF) esl_fatal(msg);
+
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ /* Now write stk to clustal file, and vice versa; then retest */
+ if ( esl_tmpfile_named(alnfile2, &alnfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile2, &stkfp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_clustal_Write (alnfp, msa2, eslMSAFILE_CLUSTAL) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Write(stkfp, msa1, eslMSAFILE_STOCKHOLM) != eslOK) esl_fatal(msg);
+ fclose(alnfp);
+ fclose(stkfp);
+ if ( esl_msafile_Open(&abc, alnfile2, NULL, eslMSAFILE_CLUSTAL, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(&abc, stkfile2, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_clustal_Read (afp1, &msa3) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa4) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa3, msa4) != eslOK) esl_fatal(msg);
+
+ remove(alnfile2);
+ remove(stkfile2);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+ esl_alphabet_Destroy(abc);
+}
+
+static void
+read_test_msas_text(char *alnfile, char *stkfile)
+{
+ char msg[] = "CLUSTAL msa text-mode read unit test failed";
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ FILE *alnfp, *stkfp;
+ char alnfile2[32] = "esltmpaln2XXXXXX";
+ char stkfile2[32] = "esltmpstk2XXXXXX";
+
+ /* vvvv-- everything's the same as the digital utest except these NULLs */
+ if ( esl_msafile_Open(NULL, alnfile, NULL, eslMSAFILE_CLUSTALLIKE, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(NULL, stkfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_clustal_Read (afp1, &msa1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_clustal_Read (afp1, &msa3) != eslEOF) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa3) != eslEOF) esl_fatal(msg);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ if ( esl_tmpfile_named(alnfile2, &alnfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile2, &stkfp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_clustal_Write (alnfp, msa2, eslMSAFILE_CLUSTAL) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Write(stkfp, msa1, eslMSAFILE_STOCKHOLM) != eslOK) esl_fatal(msg);
+ fclose(alnfp);
+ fclose(stkfp);
+ if ( esl_msafile_Open(NULL, alnfile2, NULL, eslMSAFILE_CLUSTAL, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(NULL, stkfile2, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_clustal_Read (afp1, &msa3) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa4) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa3, msa4) != eslOK) esl_fatal(msg);
+
+ remove(alnfile2);
+ remove(stkfile2);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+}
+#endif /*eslMSAFILE_CLUSTAL_TESTDRIVE*/
+/*---------------------- end, unit tests ------------------------*/
+
+
+/*****************************************************************
+ * 4. Test driver.
+ *****************************************************************/
+#ifdef eslMSAFILE_CLUSTAL_TESTDRIVE
+/* compile: gcc -g -Wall -I. -L. -o esl_msafile_clustal_utest -DeslMSAFILE_CLUSTAL_TESTDRIVE esl_msafile_clustal.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_msafile_clustal_utest -DeslMSAFILE_CLUSTAL_TESTDRIVE esl_msafile_clustal.c -leasel -lm
+ * run: ./esl_msafile_clustal_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_msafile.h"
+#include "esl_msafile_clustal.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for CLUSTAL MSA format module";
+
+int
+main(int argc, char **argv)
+{
+ char msg[] = "CLUSTAL MSA i/o module test driver failed";
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ char alnfile[32] = "esltmpalnXXXXXX";
+ char stkfile[32] = "esltmpstkXXXXXX";
+ FILE *alnfp, *stkfp;
+ int testnumber;
+ int ngoodtests = 3;
+ char tmpfile[32];
+ FILE *ofp;
+ int expected_format;
+ int expected_alphatype;
+ int expected_nseq;
+ int expected_alen;
+
+ if ( esl_tmpfile_named(alnfile, &alnfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile, &stkfp) != eslOK) esl_fatal(msg);
+ write_test_msas(alnfp, stkfp);
+ fclose(alnfp);
+ fclose(stkfp);
+
+ read_test_msas_digital(alnfile, stkfile);
+ read_test_msas_text (alnfile, stkfile);
+
+ /* Various "good" files that should be parsed correctly */
+ for (testnumber = 1; testnumber <= ngoodtests; testnumber++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+ switch (testnumber) {
+ case 1: utest_write_good1 (ofp, &expected_format, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 2: utest_write_good2 (ofp, &expected_format, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 3: utest_write_good3 (ofp, &expected_format, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ }
+ fclose(ofp);
+ utest_goodfile(tmpfile, testnumber, expected_format, expected_alphatype, expected_nseq, expected_alen);
+ remove(tmpfile);
+ }
+
+ remove(alnfile);
+ remove(stkfile);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslMSAFILE_CLUSTAL_TESTDRIVE*/
+/*--------------------- end, test driver ------------------------*/
+
+
+/*****************************************************************
+ * 5. Examples.
+ *****************************************************************/
+
+
+#ifdef eslMSAFILE_CLUSTAL_EXAMPLE
+/* A full-featured example of reading/writing an MSA in Clustal format(s).
+ gcc -g -Wall -o esl_msafile_clustal_example -I. -L. -DeslMSAFILE_CLUSTAL_EXAMPLE esl_msafile_clustal.c -leasel -lm
+ ./esl_msafile_clustal_example <msafile>
+ */
+/*::cexcerpt::msafile_clustal_example::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_clustal.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-1", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "no autodetection; use CLUSTAL format", 0 },
+ { "-2", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "no autodetection; use CLUSTALLIKE format", 0 },
+ { "-q", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "quieter: don't write msa back, just summary", 0 },
+ { "-t", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use text mode: no digital alphabet", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is DNA", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is RNA", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is protein", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msafile>";
+static char banner[] = "example of guessing, reading, writing Clustal formats";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *filename = esl_opt_GetArg(go, 1);
+ int infmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if (esl_opt_GetBoolean(go, "-1")) infmt = eslMSAFILE_CLUSTAL;
+ else if (esl_opt_GetBoolean(go, "-2")) infmt = eslMSAFILE_CLUSTALLIKE;
+
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+
+ /* Text mode: pass NULL for alphabet.
+ * Digital mode: pass ptr to expected ESL_ALPHABET; and if abc=NULL, alphabet is guessed
+ */
+ if (esl_opt_GetBoolean(go, "-t")) status = esl_msafile_Open(NULL, filename, NULL, infmt, NULL, &afp);
+ else status = esl_msafile_Open(&abc, filename, NULL, infmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+
+ if ( (status = esl_msafile_clustal_Read(afp, &msa)) != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+
+ printf("format variant: %s\n", esl_msafile_DecodeFormat(afp->format));
+ printf("alphabet: %s\n", (abc ? esl_abc_DecodeType(abc->type) : "none (text mode)"));
+ printf("# of seqs: %d\n", msa->nseq);
+ printf("# of cols: %d\n", (int) msa->alen);
+ printf("\n");
+
+ if (! esl_opt_GetBoolean(go, "-q"))
+ esl_msafile_clustal_Write(stdout, msa, eslMSAFILE_CLUSTAL);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ if (abc) esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+/*::cexcerpt::msafile_clustal_example::end::*/
+#endif /*eslMSAFILE_CLUSTAL_EXAMPLE*/
+
+#ifdef eslMSAFILE_CLUSTAL_EXAMPLE2
+/* A minimal example. Read Clustal MSA, in text mode.
+ gcc -g -Wall -o esl_msafile_clustal_example2 -I. -L. -DeslMSAFILE_CLUSTAL_EXAMPLE2 esl_msafile_clustal.c -leasel -lm
+ ./esl_msafile_clustal_example2 <msafile>
+ */
+
+/*::cexcerpt::msafile_clustal_example2::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_clustal.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int fmt = eslMSAFILE_CLUSTAL; /* or eslMSAFILE_CLUSTALLIKE */
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if ( (status = esl_msafile_Open(NULL, filename, NULL, fmt, NULL, &afp)) != eslOK) esl_msafile_OpenFailure(afp, status);
+ if ( (status = esl_msafile_clustal_Read(afp, &msa)) != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ printf("%6d seqs, %5d columns\n", msa->nseq, (int) msa->alen);
+
+ esl_msafile_clustal_Write(stdout, msa, eslMSAFILE_CLUSTAL);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ exit(0);
+}
+/*::cexcerpt::msafile_clustal_example2::end::*/
+#endif /*eslMSAFILE_CLUSTAL_EXAMPLE2*/
+/*--------------------- end of example --------------------------*/
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_clustal.h b/esl_msafile_clustal.h
new file mode 100644
index 0000000..6dc5c99
--- /dev/null
+++ b/esl_msafile_clustal.h
@@ -0,0 +1,18 @@
+/* i/o of multiple sequence alignment files in Clustal-like formats
+ */
+#ifndef eslMSAFILE_CLUSTAL_INCLUDED
+#define eslMSAFILE_CLUSTAL_INCLUDED
+
+#include "esl_msa.h"
+#include "esl_msafile.h"
+
+extern int esl_msafile_clustal_SetInmap (ESL_MSAFILE *afp);
+extern int esl_msafile_clustal_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type);
+extern int esl_msafile_clustal_Read (ESL_MSAFILE *afp, ESL_MSA **ret_msa);
+extern int esl_msafile_clustal_Write (FILE *fp, const ESL_MSA *msa, int fmt);
+
+#endif /* eslMSAFILE_CLUSTAL_INCLUDED */
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_phylip.c b/esl_msafile_phylip.c
new file mode 100644
index 0000000..fe16d62
--- /dev/null
+++ b/esl_msafile_phylip.c
@@ -0,0 +1,1914 @@
+/* I/O of multiple sequence alignment files in PHYLIP format(s)
+ *
+ * Contents:
+ * 1. API for reading/writing PHYLIP format alignment files
+ * 2. I/O of the interleaved variant of the format
+ * 3. I/O of the sequential variant of the format
+ * 4. Autodetection of format and its variants
+ * 5. Rectifying valid input/output symbols in names, seqs
+ * 6. Unit tests
+ * 7. Test driver
+ * 8. Example
+ * 9. Copyright and license information.
+ *
+ * See: http://evolution.genetics.washington.edu/phylip/doc/sequence.html
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#include "esl_mem.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_phylip.h"
+
+#define eslMSAFILE_PHYLIP_LEGALSYMS "-ABCDEFGHIJKLMNOPQRSTUVWZYX*?."
+
+static int phylip_interleaved_Read(ESL_MSAFILE *afp, ESL_MSA *msa, int nseq, int32_t alen_stated);
+static int phylip_interleaved_Write(FILE *fp, const ESL_MSA *msa, ESL_MSAFILE_FMTDATA *opt_fmtd);
+
+static int phylip_sequential_Read(ESL_MSAFILE *afp, ESL_MSA *msa, int nseq, int32_t alen_stated);
+static int phylip_sequential_Write(FILE *fp, const ESL_MSA *msa, ESL_MSAFILE_FMTDATA *opt_fmtd);
+
+static int phylip_check_interleaved (ESL_BUFFER *bf, int *ret_nblocks, int *ret_namewidth);
+static int phylip_check_sequential_known (ESL_BUFFER *bf, int namewidth);
+static int phylip_check_sequential_unknown(ESL_BUFFER *bf, int *ret_namewidth);
+static int phylip_parse_header(ESL_BUFFER *bf, int32_t *ret_nseq, int32_t *ret_alen, char **ret_p, esl_pos_t *ret_n);
+static int phylip_collate_colcodes(char *p, esl_pos_t n, char *colcodes, int ncols);
+static int phylip_deduce_namewidth(char *colcodes0, int ncols0, int alen, int nres2, int *ret_namewidth);
+
+static int phylip_rectify_input_name(char *namebuf, char *p, int n);
+static int phylip_rectify_output_seq_digital(char *buf);
+static int phylip_rectify_output_seq_text(char *buf);
+
+/*****************************************************************
+ * 1. API for reading/writing PHYLIP format alignment files
+ *****************************************************************/
+
+/* Function: esl_msafile_phylip_SetInmap()
+ * Synopsis: Configure input map for PHYLIP formats.
+ *
+ * Purpose: Set the <afp->inmap> for PHYLIP formats.
+ *
+ * Phylip documentation states that DNA programs accept
+ * 'ABCDGHKMNORSTUVWXY?-', that 'a period was previously
+ * allowed' and that O means a deletion. Protein programs
+ * accept 'ABCDEFGHIJKLMNOPQRSTUVWXYZ*?-', and while JOU
+ * are accepted, they are unused.
+ *
+ * So: in text mode, we accept any alphabetic character
+ * plus '-*?.', verbatim. '~_', which Easel would normally
+ * accept, are illegal. Whitespace and numbers are ignored.
+ *
+ * In digital mode, we modify the digital alphabet by
+ * demapping '~_' and making them illegal; '?' is mapped to
+ * missing data; whitespace and numbers are ignored;
+ * and ONLY in <eslDNA> or <eslRNA> alphabets, 'O' is
+ * mapped to a gap.
+ *
+ * The inconsistent mapping of 'O' poses potential
+ * problems. In text mode (where we don't know the
+ * alphabet, and thus don't know what to do with O), we
+ * input the O verbatim. In digital mode, in a DNA or RNA
+ * alphabet, we map O to a gap; in other digital alphabets,
+ * we use the default digital alphabet mapping of O.
+ *
+ * Xref: http://evolution.genetics.washington.edu/phylip/doc/sequence.html
+ */
+int
+esl_msafile_phylip_SetInmap(ESL_MSAFILE *afp)
+{
+ int sym;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc)
+ {
+ for (sym = 1; sym < 128; sym++) afp->inmap[sym] = afp->abc->inmap[sym];
+ for (sym = '0'; sym < '9'; sym++) afp->inmap[sym] = eslDSQ_IGNORED;
+ afp->inmap['?'] = esl_abc_XGetMissing(afp->abc);
+ afp->inmap['~'] = eslDSQ_ILLEGAL;
+ afp->inmap['_'] = eslDSQ_ILLEGAL;
+ afp->inmap[' '] = eslDSQ_IGNORED;
+ afp->inmap['\t'] = eslDSQ_IGNORED;
+ afp->inmap[0] = esl_abc_XGetUnknown(afp->abc);
+
+ if (afp->abc->type == eslDNA || afp->abc->type == eslRNA)
+ afp->inmap['O'] = esl_abc_XGetGap(afp->abc);
+ }
+#endif
+ if (! afp->abc)
+ {
+ for (sym = 1; sym < 128; sym++) afp->inmap[sym] = eslDSQ_ILLEGAL;
+ for (sym = 'a'; sym <= 'z'; sym++) afp->inmap[sym] = sym;
+ for (sym = 'A'; sym <= 'Z'; sym++) afp->inmap[sym] = sym;
+ for (sym = '0'; sym <= '9'; sym++) afp->inmap[sym] = eslDSQ_IGNORED;
+ afp->inmap['-'] = '-';
+ afp->inmap['*'] = '*';
+ afp->inmap['?'] = '?';
+ afp->inmap['.'] = '.';
+ afp->inmap[' '] = eslDSQ_IGNORED;
+ afp->inmap['\t'] = eslDSQ_IGNORED;
+ afp->inmap[0] = '?';
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_msafile_phylip_GuessAlphabet()
+ * Synopsis: Guess the alphabet of an open PHYLIP MSA input.
+ *
+ * Purpose: Guess the alphabet of the sequences in open
+ * PHYLIP format MSA file <afp>.
+ *
+ * On normal return, <*ret_type> is set to <eslDNA>,
+ * <eslRNA>, or <eslAMINO>, and <afp> is reset to its
+ * original point.
+ *
+ * Args: afp - open PHYLIP format MSA file
+ * *ret_type - RETURN: <eslDNA>, <eslRNA>, <eslAMINO>; or <eslUNKNOWN>.
+ *
+ * Returns: <eslOK> on success.
+ * <eslENOALPHABET> if autodetection fails.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslESYS> on failures of fread() or other system calls
+ */
+int
+esl_msafile_phylip_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type)
+{
+ int namewidth = (afp->fmtd.namewidth ? afp->fmtd.namewidth : 10); /* default: strict PHYLIP, namewidth 10 */
+ int alphatype = eslUNKNOWN;
+ int threshold[3] = { 500, 5000, 50000 }; /* we check after 500, 5000, 50000 residues; else we go to EOF */
+ int nsteps = 3; /* ...there's 3 threshold[]'s we check */
+ int step = 0; /* ...starting on threshold[0] */
+ int64_t nres = 0;
+ char *p;
+ esl_pos_t n, pos;
+ int x;
+ esl_pos_t anchor;
+ int64_t ct[26];
+ int status;
+
+ for (x = 0; x < 26; x++) ct[x] = 0;
+
+ anchor = esl_buffer_GetOffset(afp->bf);
+ if ((status = esl_buffer_SetAnchor(afp->bf, anchor)) != eslOK) { status = eslEINCONCEIVABLE; goto ERROR; } /* [eslINVAL] can't happen here */
+
+ /* Find the first nonblank line, which says " <nseq> <alen>" and may also have options. we ignore this header */
+ while ( (status = esl_buffer_GetLine(afp->bf, &p, &n)) == eslOK && esl_memspn(p, n, " \t") == n) ;
+ if (status == eslEOF) ESL_XFAIL(eslENOALPHABET, afp->errmsg, "can't determine alphabet: no alignment data found");
+ else if (status != eslOK) goto ERROR;
+
+ /* Read line by line, just looking for residues, not worrying about nseq/alen or sequential/interleaved
+ * Always skip the name field, even in continuation lines/blocks
+ * This may miss some residues, but it means we work on both sequential and interleaved formats
+ */
+ while ( (status = esl_buffer_GetLine(afp->bf, &p, &n)) == eslOK)
+ {
+ if (esl_memspn(p, n, " \t") == n) continue;
+ if (n < namewidth) continue;
+
+ p += namewidth;
+ n -= namewidth;
+
+ /* count characters into ct[] array */
+ for (pos = 0; pos < n; pos++)
+ if (isalpha(p[pos])) {
+ x = toupper(p[pos]) - 'A';
+ ct[x]++;
+ nres++;
+ }
+
+ /* try to stop early, checking after 500, 5000, and 50000 residues: */
+ if (step < nsteps && nres > threshold[step]) {
+ if ((status = esl_abc_GuessAlphabet(ct, &alphatype)) == eslOK) goto DONE; /* (eslENOALPHABET) */
+ step++;
+ }
+ }
+ if (status != eslEOF) goto ERROR; /* [eslEMEM,eslESYS,eslEINCONCEIVABLE] */
+ status = esl_abc_GuessAlphabet(ct, &alphatype); /* (eslENOALPHABET) */
+
+ DONE:
+ esl_buffer_SetOffset(afp->bf, anchor); /* Rewind to where we were. */
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ *ret_type = alphatype;
+ return status;
+
+ ERROR:
+ if (anchor != -1) {
+ esl_buffer_SetOffset(afp->bf, anchor);
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ }
+ *ret_type = eslUNKNOWN;
+ return status;
+}
+
+/* Function: esl_msafile_phylip_Read()
+ * Synopsis: Read in a PHYLIP format alignment.
+ *
+ * Purpose: Read an MSA from an open <ESL_MSAFILE> <afp>, parsing for
+ * Phylip format, starting from the current point. The
+ * format may be either the interleaved or sequential
+ * variant, according to the format set in <afp->format>:
+ * <eslMSAFILE_PHYLIP> means interleaved, and
+ * <eslMSAFILE_PHYLIPS> means sequential. Create a new
+ * multiple alignment, and return a ptr to that alignment
+ * in <*ret_msa>. Caller is responsible for free'ing this
+ * <ESL_MSA>.
+ *
+ * Args: afp - open <ESL_MSAFILE>
+ * ret_msa - RETURN: newly parsed <ESL_MSA>
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEOF> if no (more) alignment data were found in
+ * <afp>, and <afp> is returned at EOF.
+ *
+ * <eslEFORMAT> on a parse error. <*ret_msa> is set to
+ * <NULL>. <afp> contains information sufficient for
+ * constructing useful diagnostic output:
+ * | <afp->errmsg> | user-directed error message |
+ * | <afp->linenumber> | line # where error was detected |
+ * | <afp->line> | offending line (not NUL-term) |
+ * | <afp->n> | length of offending line |
+ * | <afp->bf->filename> | name of the file |
+ * and <afp> is poised at the start of the following line,
+ * so (in principle) the caller could try to resume
+ * parsing.
+ *
+ * Throws: <eslEMEM> - an allocation failed.
+ * <eslESYS> - a system call such as fread() failed
+ * <eslEINCONCEIVABLE> - "impossible" corruption
+ */
+int
+esl_msafile_phylip_Read(ESL_MSAFILE *afp, ESL_MSA **ret_msa)
+{
+ ESL_MSA *msa = NULL;
+ int32_t alen_stated; /* int32_t because we're using strtoi32() to parse it from the file */
+ int nseq;
+ char *p, *tok;
+ esl_pos_t n, toklen;
+ int status;
+
+ ESL_DASSERT1( (afp->format == eslMSAFILE_PHYLIP || afp->format == eslMSAFILE_PHYLIPS) );
+
+ afp->errmsg[0] = '\0';
+
+ /* skip leading blank lines (though there shouldn't be any) */
+ while ( (status = esl_msafile_GetLine(afp, &p, &n)) == eslOK && esl_memspn(p, n, " \t") == n) ;
+ if (status != eslOK) goto ERROR; /* includes normal EOF */
+
+ /* the first line: <nseq> <alen> */
+ esl_memtok(&p, &n, " \t", &tok, &toklen);
+ if (esl_mem_strtoi32(tok, toklen, 0, NULL, &nseq) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "first PHYLIP line should be <nseq> <alen>: first field isn't an integer");
+ if (esl_memtok(&p, &n, " \t", &tok, &toklen) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "first PHYLIP line should be <nseq> <alen>: only one field found");
+ if (esl_mem_strtoi32(tok, toklen, 0, NULL, &alen_stated) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "first PHYLIP line should be <nseq> <alen>: second field isn't an integer");
+
+ /* believe <nseq> and allocate accordingly */
+ /* don't believe <alen_stated>; use it for validation, after we've parsed everything. */
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc && (msa = esl_msa_CreateDigital(afp->abc, nseq, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+#endif
+ if (! afp->abc && (msa = esl_msa_Create( nseq, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ /* load next line, skipping any blank ones (though there shouldn't be any) */
+ do {
+ status = esl_msafile_GetLine(afp, &p, &n);
+ if (status == eslEOF) ESL_XFAIL(eslEFORMAT, afp->errmsg, "no alignment data following PHYLIP header");
+ else if (status != eslOK) goto ERROR;
+ } while (esl_memspn(p, n, " \t") == n); /* idiom for "blank line" */
+
+ /* hand off to interleaved vs. sequential parser for the rest */
+ if (afp->format == eslMSAFILE_PHYLIP) status = phylip_interleaved_Read(afp, msa, nseq, alen_stated);
+ else if (afp->format == eslMSAFILE_PHYLIPS) status = phylip_sequential_Read (afp, msa, nseq, alen_stated);
+ if (status != eslOK) goto ERROR;
+
+ if (( status = esl_msa_SetDefaultWeights(msa)) != eslOK) goto ERROR;
+ *ret_msa = msa;
+ return eslOK;
+
+ ERROR:
+ if (msa) esl_msa_Destroy(msa);
+ *ret_msa = NULL;
+ return status;
+}
+
+
+/* Function: esl_msafile_phylip_Write()
+ * Synopsis: Write an MSA to a stream in PHYLIP format.
+ *
+ * Purpose: Write alignment <msa> in PHYLIP format to stream <fp>.
+ * If <format> is <eslMSAFILE_PHYLIP>, write interleaved format;
+ * if <format> is <eslMSAFILE_PHYLIPS>, write sequential format.
+ *
+ * Optionally, caller may pass additional formatting
+ * information by passing a ptr to a valid <opt_fmtd>
+ * structure. <opt_fmtd->namewidth> sets the width of the
+ * name field. For strict PHYLIP format, this must be 10.
+ * <opt_fmtd->rpl> sets the number of residues per line.
+ * The default is 60. For either value, if it is unset or
+ * if <opt_fmtd> is <NULL>, the default is used.
+ *
+ * Args: fp - open output stream
+ * msa - alignment to write
+ * format - <eslMSAFILE_PHYLIP> for interleaved; <eslMSAFILE_PHYLIPS> for sequential.
+ * fmtd - optional: <NULL>, or additional format information
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <format> isn't <eslMSAFILE_PHYLIP> or <eslMSAFILE_PHYLIPS>.
+ * <eslEMEM> on allocation failure.
+ * <eslEWRITE> on any system write error, such as a filled disk.
+ */
+int
+esl_msafile_phylip_Write(FILE *fp, const ESL_MSA *msa, int format, ESL_MSAFILE_FMTDATA *opt_fmtd)
+{
+ if (format == eslMSAFILE_PHYLIP) return phylip_interleaved_Write(fp, msa, opt_fmtd);
+ else if (format == eslMSAFILE_PHYLIPS) return phylip_sequential_Write (fp, msa, opt_fmtd);
+ else ESL_EXCEPTION(eslEINVAL, "format %s is not a PHYLIP format", esl_msafile_DecodeFormat(format));
+}
+
+/* Function: esl_msafile_phylip_CheckFileFormat()
+ * Synopsis: Check whether an input seems to be in PHYLIP format.
+ *
+ * Purpose: Check whether input buffer <bf> appears to be
+ * in a PHYLIP format, starting from the current point.
+ * Return <eslOK> if it is, and <eslFAIL> if it isn't.
+ *
+ * There are two main variants of the format, interleaved
+ * and sequential. Upon successful return, <*ret_format> is
+ * set to <eslMSAFILE_PHYLIP> for interleaved, or
+ * <eslMSAFILE_PHYLIPS> for sequential.
+ *
+ * Strict PHYLIP format has a name/identifier field width
+ * of exactly 10 characters, but variants of the format are
+ * in common use with different name widths. The
+ * name width is determined and returned in <*ret_namewidth>.
+ *
+ * If the input doesn't appear to be in PHYLIP format,
+ * return <eslFAIL>, with <*ret_format> as
+ * <eslMSAFILE_UNKNOWN> and <*ret_namewidth> as 0.
+ *
+ * The PHYLIP format definition is ambiguous; it is
+ * possible to construct pathological inputs that could be
+ * validly parsed to yield different data when read as
+ * interleaved versus sequential. (This requires names that
+ * use a character set that looks like sequence, among
+ * other unusual edge conditions.) If the format variant
+ * cannot be unambiguously determined, we do not attempt to
+ * make a guess that might result in corrupted input;
+ * rather, return <eslEAMBIGUOUS>.
+ *
+ * Args: bf - input buffer
+ * *ret_format - RETURN: format variant, <eslMSAFILE_PHYLIP>, <_PHYLIPS>, <_UNKNOWN>
+ * *ret_namewidth - RETURN: width of name field, in characters
+ *
+ * Returns: <eslOK> if input is in PHYLIP format; <*ret_format> is set to
+ * <eslMSAFILE_PHYLIP> or <eslMSAFILE_PHYLIPS>; <*ret_namewidth>
+ * is the name width, either the usual 10, or something nonstandard.
+ *
+ * <eslEAMBIGUOUS> if the input appears to be in a PHYLIP format but
+ * we can't tell which one. <*ret_format> is <eslMSAFILE_UNKNOWN>,
+ * <*ret_namewidth> is 0.
+ *
+ * <eslFAIL> if the input is not in either PHYLIP format;
+ * <*ret_format> is <eslMSAFILE_UNKNOWN>, <*ret_namewidth> is 0.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_msafile_phylip_CheckFileFormat(ESL_BUFFER *bf, int *ret_format, int *ret_namewidth)
+{
+ int maybe_interleaved = FALSE; // Must worry about pathological files consistent with both formats.
+ int maybe_sequential = FALSE;
+ int nblocks; // number of interleaved blocks. if only 1, interleaved == sequential
+ int w1, w2; // name widths if interleaved, sequential
+
+ if ( phylip_check_interleaved(bf, &nblocks, &w1) == eslOK) { maybe_interleaved = TRUE; }
+
+ if (maybe_interleaved && nblocks == 1) { *ret_namewidth = w1; *ret_format = eslMSAFILE_PHYLIP; return eslOK; }
+
+ if ( phylip_check_sequential_known (bf, 10) == eslOK) { maybe_sequential = TRUE; w2 = 10; }
+ else if ( phylip_check_sequential_unknown(bf, &w2) == eslOK) { maybe_sequential = TRUE; }
+
+ if (maybe_interleaved && maybe_sequential) { *ret_namewidth = 0; *ret_format = eslMSAFILE_UNKNOWN; return eslEAMBIGUOUS; }
+ else if (maybe_interleaved) { *ret_namewidth = w1; *ret_format = eslMSAFILE_PHYLIP; return eslOK; }
+ else if (maybe_sequential) { *ret_namewidth = w2; *ret_format = eslMSAFILE_PHYLIPS; return eslOK; }
+ else { *ret_namewidth = 0; *ret_format = eslMSAFILE_UNKNOWN; return eslFAIL; }
+}
+/*-------------- end, API for PHYLIP format i/o -----------------*/
+
+
+/*****************************************************************
+ * 2. i/o of the interleaved variant of the format
+ *****************************************************************/
+
+/* Read the interleaved variant.
+ * header told us to expect <nseq>, <alen_stated>.
+ * <msa> is already allocated <nseq>, <-1>.
+ * In <afp>, we've loaded the first line of the alignment data.
+ */
+static int
+phylip_interleaved_Read(ESL_MSAFILE *afp, ESL_MSA *msa, int nseq, int32_t alen_stated)
+{
+ int namewidth = (afp->fmtd.namewidth ? afp->fmtd.namewidth : 10); /* default: strict PHYLIP, namewidth 10 */
+ char *namebuf = NULL;
+ int nblocks = 0;
+ int64_t alen = 0; /* alignment length observed so far */
+ char *p = afp->line;
+ esl_pos_t n = afp->n;
+ int64_t block_alen; /* # of residues being added by current block */
+ int64_t cur_alen;
+ int idx;
+ int status;
+
+ ESL_ALLOC(namebuf, sizeof(char) * (namewidth+1));
+
+ /* p, n is now the first line of a block */
+ /* read the alignment data */
+ do {
+ idx = 0;
+ do { /* First block? store the sequence names */
+ if (nblocks == 0)
+ {
+ if (n < namewidth) ESL_XFAIL(eslEFORMAT, afp->errmsg, "PHYLIP line too short to find sequence name");
+ if (phylip_rectify_input_name(namebuf, p, namewidth) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "invalid character(s) in sequence name");
+ if ( (status = esl_msa_SetSeqName(msa, idx, namebuf, -1)) != eslOK) goto ERROR;
+ p += namewidth;
+ n -= namewidth;
+ }
+
+ /* Append the sequence. */
+ cur_alen = alen;
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) { status = esl_abc_dsqcat(afp->inmap, &(msa->ax[idx]), &(cur_alen), p, n); }
+#endif
+ if (! msa->abc) { status = esl_strmapcat (afp->inmap, &(msa->aseq[idx]), &(cur_alen), p, n); }
+ if (status == eslEINVAL) ESL_XFAIL(eslEFORMAT, afp->errmsg, "one or more invalid sequence characters");
+ else if (status != eslOK) goto ERROR;
+
+ /* validate # of residues added */
+ if (idx == 0) block_alen = cur_alen - alen;
+ else if (cur_alen - alen != block_alen) ESL_XFAIL(eslEFORMAT, afp->errmsg, "number of residues on line differs from previous seqs in alignment block");
+
+ /* get next line. */
+ idx++;
+ status = esl_msafile_GetLine(afp, &p, &n);
+ } while (status == eslOK && idx < nseq && esl_memspn(p, n, " \t") < n); /* stop block on: read error, EOF; idx == nseq; or blank line */
+
+ if (idx != nseq) ESL_XFAIL(eslEFORMAT, afp->errmsg, "unexpected number of sequences in block (saw %d, expected %d)", idx, nseq);
+ nblocks += 1;
+ alen += block_alen;
+
+ /* tolerate blank lines only at the end of a block */
+ while (status == eslOK && esl_memspn(p, n, " \t") == n)
+ status = esl_msafile_GetLine(afp, &p, &n); /* [eslEMEM,eslESYS] */
+ /* now status can be: read error, EOF, or OK. */
+ } while (status == eslOK && alen < alen_stated);
+
+ /* End of all blocks. We swallowed blank lines following last block,
+ * so we should be EOF; unless we're in a seqboot file, in which
+ * case we just read the first line of the next MSA.
+ */
+ if (status == eslOK) esl_msafile_PutLine(afp); /* put <nseq> <alen> line back in the stream, so we will read it properly w/ next msa read */
+ else if (status != eslEOF) goto ERROR;
+ else if (alen != alen_stated) ESL_XFAIL(eslEFORMAT, afp->errmsg, "alignment length disagrees with header: header said %d, parsed %" PRId64, alen_stated, alen);
+
+ msa->nseq = nseq;
+ msa->alen = alen;
+ free(namebuf);
+ return eslOK;
+
+ ERROR:
+ msa->nseq = nseq; /* we're allocated and initialized for <nseq>: this makes sure we free everything we need to in <msa> */
+ if (namebuf) free(namebuf);
+ return status;
+}
+
+/* Write an interleaved PHYLIP file.
+ * Returns <eslOK> on success.
+ * Throws <eslEWRITE> on any system write error.
+ */
+static int
+phylip_interleaved_Write(FILE *fp, const ESL_MSA *msa, ESL_MSAFILE_FMTDATA *opt_fmtd)
+{
+ int rpl = ( (opt_fmtd && opt_fmtd->rpl) ? opt_fmtd->rpl : 60);
+ int namewidth = ( (opt_fmtd && opt_fmtd->namewidth) ? opt_fmtd->namewidth : 10);
+ char *buf = NULL;
+ int idx;
+ int64_t apos;
+ int status;
+
+ ESL_ALLOC(buf, sizeof(char) * (rpl+1));
+ buf[rpl] = '\0';
+
+ if (fprintf(fp, " %d %" PRId64, msa->nseq, msa->alen) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "interleaved phylip write failed");
+
+ for (apos = 0; apos < msa->alen; apos += rpl)
+ {
+ if (fprintf(fp, "\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "interleaved phylip write failed");
+ for (idx = 0; idx < msa->nseq; idx++)
+ {
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc)
+ {
+ esl_abc_TextizeN(msa->abc, msa->ax[idx]+apos+1, rpl, buf);
+ phylip_rectify_output_seq_digital(buf);
+ }
+#endif
+ if (! msa->abc)
+ {
+ strncpy(buf, msa->aseq[idx]+apos, rpl);
+ phylip_rectify_output_seq_text(buf);
+ }
+
+ if (apos == 0) { if (fprintf(fp, "%-*.*s %s\n", namewidth, namewidth, msa->sqname[idx], buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "interleaved phylip write failed"); }
+ else { if (fprintf(fp, "%s\n", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "interleaved phylip write failed"); }
+ }
+ }
+ free(buf);
+ return eslOK;
+
+ ERROR:
+ if (buf) free(buf);
+ return status;
+}
+/*----------------- end, interleaved variant -------------------*/
+
+
+/*****************************************************************
+ * 3. i/o of sequential variant of the format
+ *****************************************************************/
+
+/* Read the sequential variant.
+ * header told us to expect <nseq>, <alen_stated>.
+ * <msa> is already allocated <nseq>, <-1>.
+ * In <afp>, we've loaded the first line of the alignment data.
+ */
+static int
+phylip_sequential_Read(ESL_MSAFILE *afp, ESL_MSA *msa, int nseq, int32_t alen_stated)
+{
+ int namewidth = (afp->fmtd.namewidth ? afp->fmtd.namewidth : 10); /* default: strict PHYLIP, namewidth 10 */
+ char *namebuf = NULL;
+ char *p = afp->line;
+ esl_pos_t n = afp->n;
+ int idx;
+ int64_t alen = 0;
+ int status = eslOK;
+
+ ESL_ALLOC(namebuf, sizeof(char) * (namewidth+1));
+
+ for (idx = 0; idx < nseq; idx++)
+ {
+ alen = 0;
+ status = eslOK;
+ while (status == eslOK && alen < alen_stated)
+ {
+ if (alen == 0) /* First line? Store the sequence name */
+ {
+ if (n < namewidth) ESL_XFAIL(eslEFORMAT, afp->errmsg, "PHYLIP line too short to find sequence name");
+ if (phylip_rectify_input_name(namebuf, p, namewidth) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "invalid character(s) in sequence name");
+ if ( (status = esl_msa_SetSeqName(msa, idx, namebuf, -1)) != eslOK) goto ERROR;
+ p += namewidth;
+ n -= namewidth;
+ }
+
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) { status = esl_abc_dsqcat(afp->inmap, &(msa->ax[idx]), &alen, p, n); }
+#endif
+ if (! msa->abc) { status = esl_strmapcat (afp->inmap, &(msa->aseq[idx]), &alen, p, n); }
+ if (status == eslEINVAL) ESL_XFAIL(eslEFORMAT, afp->errmsg, "one or more invalid sequence characters");
+ else if (status != eslOK) goto ERROR;
+
+ /* get next line */
+ status = esl_msafile_GetLine(afp, &p, &n);
+ } /* end looping over a seq */
+
+ /* tolerate blank lines after sequences. */
+ while (status == eslOK && esl_memspn(p, n, " \t") == n)
+ status = esl_msafile_GetLine(afp, &p, &n);
+
+ if (status == eslEOF) { if (idx < nseq-1) ESL_XFAIL(eslEFORMAT, afp->errmsg, "premature end of file: header said to expect %d sequences", nseq); }
+ else if (status != eslOK) goto ERROR;
+ else if (alen != alen_stated) ESL_XFAIL(eslEFORMAT, afp->errmsg, "aligned length of sequence disagrees with header: header says %d, parsed %" PRId64, alen_stated, alen);
+ } /* end looping over all seqs */
+
+ /* we should be EOF; we've swallowed all trailing blank lines.
+ * Exception: if we're in a seqboot file, we just read the <nseq> <alen> line of the next msa record; push it back on stream
+ */
+ if (status == eslOK) esl_msafile_PutLine(afp);
+
+ msa->nseq = nseq;
+ msa->alen = alen;
+ free(namebuf);
+ return eslOK;
+
+ ERROR:
+ msa->nseq = nseq; /* we're allocated and initialized for <nseq>: this makes sure we free everything we need to in <msa> */
+ if (namebuf) free(namebuf);
+ return status;
+}
+
+static int
+phylip_sequential_Write(FILE *fp, const ESL_MSA *msa, ESL_MSAFILE_FMTDATA *opt_fmtd)
+{
+ int rpl = ( (opt_fmtd && opt_fmtd->rpl) ? opt_fmtd->rpl : 60);
+ int namewidth = ( (opt_fmtd && opt_fmtd->namewidth) ? opt_fmtd->namewidth : 10);
+ char *buf = NULL;
+ int idx;
+ int64_t apos;
+ int status;
+
+ ESL_ALLOC(buf, sizeof(char) * (rpl+1));
+ buf[rpl] = '\0';
+
+ fprintf(fp, " %d %" PRId64 "\n", msa->nseq, msa->alen);
+
+ for (idx = 0; idx < msa->nseq; idx++)
+ {
+ for (apos = 0; apos < msa->alen; apos += rpl)
+ {
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc)
+ {
+ esl_abc_TextizeN(msa->abc, msa->ax[idx]+apos+1, rpl, buf);
+ phylip_rectify_output_seq_digital(buf);
+ }
+#endif
+ if (! msa->abc)
+ {
+ strncpy(buf, msa->aseq[idx]+apos, rpl);
+ phylip_rectify_output_seq_text(buf);
+ }
+
+ if (apos == 0) fprintf(fp, "%-*.*s %s\n", namewidth, namewidth, msa->sqname[idx], buf);
+ else fprintf(fp, "%s\n", buf);
+ }
+ }
+ free(buf);
+ return eslOK;
+
+ ERROR:
+ if (buf) free(buf);
+ return status;
+}
+/*------------------ end, sequential variant --------------------*/
+
+
+/*****************************************************************
+ * 4. Autodetection of the format and its variants
+ *****************************************************************/
+
+/* return <eslOK> if input is consistent with interleaved format;
+ * set <*ret_namewidth> to the apparent name width;
+ * set <*ret_nblocks> to the number of interleaved blocks seen.
+ *
+ * If <nblocks=1>, it doesn't matter whether we read the file as
+ * interleaved or sequential; it will also appear to be consistent
+ * with sequential format, but we will parse it as interleaved.
+ *
+ * <namewidth> can be uniquely determined because we know <nseq> and
+ * <alen> (from the Phylip header), so we know how many characters
+ * should be accounted for by the alignment; the rest have to be
+ * the names.
+ *
+ * If the input is not consistent with interleaved Phylip format,
+ * return <eslFAIL>, and <*ret_namewidth> and <*ret_nblocks> are 0.
+ *
+ * upon return, restore the <bf> to its original position.
+ */
+static int
+phylip_check_interleaved(ESL_BUFFER *bf, int *ret_nblocks, int *ret_namewidth)
+{
+ esl_pos_t anchor = -1;
+ char *p;
+ esl_pos_t n;
+ int32_t nseq, alen;
+ char *colcodes = NULL;
+ char *colcodes0 = NULL;
+ int ncols, ncols0;
+ int c, idx;
+ int nblocks = 0;
+ int nres2 = 0;
+ int nres1;
+ int status;
+
+ anchor = esl_buffer_GetOffset(bf);
+ if (esl_buffer_SetAnchor(bf, anchor) != eslOK) { status = eslFAIL; goto ERROR; }
+ if ((status = phylip_parse_header(bf, &nseq, &alen, &p, &n)) != eslOK) goto ERROR;
+
+ /* read the whole file, one block at a time */
+ while (status == eslOK)
+ {
+ ncols = n;
+ ESL_REALLOC(colcodes, sizeof(char) * ncols);
+ for (c = 0; c < ncols; c++) colcodes[c] = '?';
+
+ /* read a block: for each line, update the colcodes[] array. */
+ for (idx = 0; idx < nseq; idx++)
+ {
+ if (status == eslEOF) goto ERROR;
+ if ((status = phylip_collate_colcodes(p, n, colcodes, ncols)) != eslOK) goto ERROR;
+ status = esl_buffer_GetLine(bf, &p, &n);
+ if (status != eslOK && status != eslEOF) goto ERROR; /* EOF is ok on last seq of single-block data */
+ }
+
+ /* finished a block. status may be EOF or OK.
+ * save the first block's colcodes[] to defer its analysis
+ * for all other blocks: count x columns, reject n columns, ignore . and o
+ */
+ if (nblocks == 0)
+ {
+ colcodes0 = colcodes; ncols0 = ncols;
+ colcodes = NULL;
+ /* let's speculate that it's strictly conforming PHYLIP with a namewidth of 10
+ * in that case, we'll be able to stop parsing blocks when we reach the full
+ * alignment length
+ */
+ for (nres1 = 0, c = 10; c < ncols0; c++)
+ if (colcodes0[c] != '.') nres1++; /* for this test, consider even invalid symbols to be "residues". */
+ }
+ else
+ {
+ for (c = 0; c < ncols; c++)
+ {
+ if (colcodes[c] == 'x') nres2++;
+ if (colcodes[c] == 'n') { status = eslFAIL; goto ERROR; } /* subsequent blocks can't contain name-like columns */
+ }
+ }
+ nblocks++;
+
+ /* if it's strictly conforming w/ namewidth=10, we know when we're done,
+ * and in that case we can tolerate trailing data (tree, whatever) in the
+ * input. status will be eslOK if we break this way.
+ */
+ if (nres1+nres2 == alen) break;
+
+ /* skip blank lines until we load start of next block in <p>, <n> */
+ while (status == eslOK && esl_memspn(p, n, "\t") == n)
+ status = esl_buffer_GetLine(bf, &p, &n);
+ }
+
+ if (nres1+nres2 == alen) *ret_namewidth = 10;
+ else if ((status = phylip_deduce_namewidth(colcodes0, ncols0, alen, nres2, ret_namewidth)) != eslOK) goto ERROR;
+
+ free(colcodes);
+ free(colcodes0);
+ esl_buffer_SetOffset(bf, anchor);
+ esl_buffer_RaiseAnchor(bf, anchor);
+ *ret_nblocks = nblocks;
+ return eslOK;
+
+ ERROR:
+ if (anchor != -1) {
+ esl_buffer_SetOffset(bf, anchor);
+ esl_buffer_RaiseAnchor(bf, anchor);
+ }
+ if (colcodes) free(colcodes);
+ if (colcodes0) free(colcodes0);
+ *ret_namewidth = 0;
+ *ret_nblocks = 0;
+ return status;
+}
+
+
+/* check for a sequential format file, given a known namewidth (10, for strict PHYLIP) */
+static int
+phylip_check_sequential_known(ESL_BUFFER *bf, int namewidth)
+{
+ esl_pos_t anchor = -1;
+ char *p;
+ esl_pos_t n;
+ int32_t nseq, alen;
+ int idx, nres, line, c;
+ int status;
+
+ anchor = esl_buffer_GetOffset(bf);
+ if (esl_buffer_SetAnchor(bf, anchor) != eslOK) { status = eslFAIL; goto ERROR; }
+ if ((status = phylip_parse_header(bf, &nseq, &alen, &p, &n)) != eslOK) goto ERROR;
+
+ for (idx = 0; idx < nseq; idx++)
+ {
+ nres = 0;
+ line = 0;
+ while (nres < alen)
+ {
+ if (status == eslEOF) goto ERROR;
+
+ c = (line == 0 ? namewidth : 0);
+ for ( ; c < n; c++)
+ if (strchr(eslMSAFILE_PHYLIP_LEGALSYMS, p[c]) != NULL)
+ nres++;
+
+ status = esl_buffer_GetLine(bf, &p, &n);
+ if (status != eslOK && status != eslEOF) goto ERROR;
+ }
+ if (nres != alen) { status = eslFAIL; goto ERROR; }
+
+ /* tolerate blank spaces after individual sequences */
+ while (status == eslOK && esl_memspn(p, n, "\t") == n)
+ status = esl_buffer_GetLine(bf, &p, &n);
+ if (status != eslOK && status != eslEOF) goto ERROR;
+ }
+
+ esl_buffer_SetOffset(bf, anchor);
+ esl_buffer_RaiseAnchor(bf, anchor);
+ return eslOK;
+
+ ERROR:
+ if (anchor != -1) {
+ esl_buffer_SetOffset(bf, anchor);
+ esl_buffer_RaiseAnchor(bf, anchor);
+ }
+ return status;
+}
+
+
+/* phylip_check_sequential_unknown()
+ * Check for sequential format when namewidth may deviate from standard 10.
+ *
+ * Returns: <eslOK> if file is consistent with sequential Phylip format,
+ * and <*ret_namewidth> is the name width.
+ *
+ * <eslFAIL> if file is inconsistent with sequential format.
+ *
+ * Throws: <eslEMEM> on allocation failure
+ */
+static int
+phylip_check_sequential_unknown(ESL_BUFFER *bf, int *ret_namewidth)
+{
+ esl_pos_t anchor = -1;
+ int nlines = 0;
+ int nblocks = 0;
+ int32_t nseq, alen;
+ int *rth = NULL; // rth[i=0..L1-1] = # of legal chars, inclusive, in i..L1-1, or 0
+ int r; // total # of legal seq chars on line 1 of a seq
+ int L1; // total length of line 1, including all chars & whitespace
+ int b; // # of legal seq chars on remainder of lines of a seq
+ int a; // # of seq chars we need on line 1: alen - b
+ char *p; // pointer to current line in input buffer
+ esl_pos_t n; // length of current line in input buffer
+ int i, j, k;
+ int w; // name width we determine
+ int len2; // alen of subsequent seqs in file
+ int status;
+
+ /* Set an anchor where we are in the input, so we can rewind */
+ anchor = esl_buffer_GetOffset(bf);
+ if ( esl_buffer_SetStableAnchor(bf, anchor) != eslOK) { status = eslFAIL; goto ERROR; }
+
+ /* Pass 1: number of data lines in file / nseq = integral # of lines per sequence */
+ while ( (status = esl_buffer_GetLine(bf, &p, &n)) == eslOK)
+ if (esl_memspn(p, n, " \t") != n) nlines++;
+ if (status != eslEOF) { status = eslFAIL; goto ERROR; }
+ nlines--; /* not counting the <nseq> <alen> header */
+ esl_buffer_SetOffset(bf, anchor); /* rewind */
+
+ /* pass 2: first, parse the <nseq> <alen> line */
+ if ((status = phylip_parse_header(bf, &nseq, &alen, &p, &n)) != eslOK) { status = eslFAIL; goto ERROR; }
+ if (nlines % nseq != 0) { status = eslFAIL; goto ERROR; }
+ nblocks = nlines / nseq;
+
+ /* ... evaluate the first line, already at point in p,n */
+ ESL_ALLOC(rth, sizeof(int) * n);
+ for (i = n-1, r = 0; i >= 0; i--)
+ rth[i] = ( strchr(eslMSAFILE_PHYLIP_LEGALSYMS, p[i]) != NULL ? ++r : 0 );
+ L1 = n;
+
+ /* rth[i] = 0 if line1[i] is not a legal seq char
+ * else # of legal chars in line1[i..L1-1]
+ * r = total # of legal chars on line 1
+ * L1 = total length of line 1, all chars (including whitespace)
+ * Once we know how many seq residues we need to get on the first line,
+ * we can use rth[] to find the position of the first one.
+ */
+
+ /* Now count b: # of legal chars on subsequent lines for 1st seq */
+ for (k = 1, b = 0; k < nblocks; k++)
+ {
+ while ( (status = esl_buffer_GetLine(bf, &p, &n)) == eslOK && esl_memspn(p, n, " \t") == n) ;
+ if (status != eslOK) { status = eslFAIL; goto ERROR; }
+ for (i = 0; i < n; i++)
+ if (strchr(eslMSAFILE_PHYLIP_LEGALSYMS, p[i]) != NULL) b++;
+ }
+
+ /* We need to find (alen - b) = a residues on the first line. */
+ a = alen - b;
+ if (a > r) { status = eslFAIL; goto ERROR; }
+ for (w = 0; w < L1; w++) // find the leftmost seq residue
+ if (rth[w] == a) break;
+ if (w == L1) { status = eslFAIL; goto ERROR; }
+ for (i = 0; i < w; i++) // make sure there's a name of some sort
+ if (! isspace(p[i])) break;
+ if ( i == w) { status = eslFAIL; goto ERROR; }
+ /* Now we "know" the name width is w. */
+
+ /* Check that the rest of the sequences (up to 100 of them) are consistent w/ that. */
+ for (j = 1; j < nseq && j < 100; j++)
+ {
+ while ( (status = esl_buffer_GetLine(bf, &p, &n)) == eslOK && esl_memspn(p, n, " \t") == n) ;
+ if (status != eslOK) { status = eslFAIL; goto ERROR; }
+ if ( strchr(eslMSAFILE_PHYLIP_LEGALSYMS, p[w]) == NULL) { status = eslFAIL; goto ERROR; }
+ for (i = 0; i < w; i++)
+ if (! isspace(p[i])) break;
+ if ( i == w) { status = eslFAIL; goto ERROR; }
+
+ for (i = w, len2 = 0; i < n; i++)
+ if ( strchr(eslMSAFILE_PHYLIP_LEGALSYMS, p[i]) != NULL) len2++;
+
+ for (k = 1; k < nblocks; k++)
+ {
+ while ( (status = esl_buffer_GetLine(bf, &p, &n)) == eslOK && esl_memspn(p, n, " \t") == n) ;
+ if (status != eslOK) { status = eslFAIL; goto ERROR; }
+ for (i = 0; i < n; i++)
+ if ( strchr(eslMSAFILE_PHYLIP_LEGALSYMS, p[i]) != NULL) len2++;
+ }
+ if (len2 != alen) { status = eslFAIL; goto ERROR; }
+ }
+
+ esl_buffer_SetOffset(bf, anchor);
+ esl_buffer_RaiseAnchor(bf, anchor);
+ free(rth);
+ *ret_namewidth = w;
+ return eslOK;
+
+ ERROR:
+ if (anchor != -1) {
+ esl_buffer_SetOffset(bf, anchor);
+ esl_buffer_RaiseAnchor(bf, anchor);
+ }
+ free(rth);
+ *ret_namewidth = 0;
+ return status;
+}
+
+
+/* parse the header from a buffer (note, NOT an open MSAFILE).
+ * used by the format checkers (before an MSAFILE is open)
+ * return <eslOK> on success, <eslFAIL> on parse failure.
+ *
+ * Upon return <p>, <n> contains the first alignment data line,
+ * and the <bf>'s point is on the line following that.
+ *
+ */
+static int
+phylip_parse_header(ESL_BUFFER *bf, int32_t *ret_nseq, int32_t *ret_alen, char **ret_p, esl_pos_t *ret_n)
+{
+ char *p, *tok;
+ esl_pos_t n, toklen;
+ int32_t nseq, alen;
+ int status;
+
+ /* Find the first nonblank line, which says " <nseq> <alen>" and may also have options (which we'll ignore) */
+ while ( (status = esl_buffer_GetLine(bf, &p, &n)) == eslOK && esl_memspn(p, n, " \t") == n) ;
+ if (status == eslEOF) status = eslFAIL;
+ if (status != eslOK) goto ERROR;
+
+ esl_memtok(&p, &n, " \t", &tok, &toklen);
+ if (esl_mem_strtoi32(tok, toklen, 0, NULL, &nseq) != eslOK) { status = eslFAIL; goto ERROR; }
+ if (esl_memtok(&p, &n, " \t", &tok, &toklen) != eslOK) { status = eslFAIL; goto ERROR; }
+ if (esl_mem_strtoi32(tok, toklen, 0, NULL, &alen) != eslOK) { status = eslFAIL; goto ERROR; }
+
+ /* skip any blank lines, load p,n as first line of putative block */
+ while ( (status = esl_buffer_GetLine(bf, &p, &n)) == eslOK && esl_memspn(p, n, " \t") == n) ;
+ if (status == eslEOF) status = eslFAIL;
+ if (status != eslOK) goto ERROR;
+
+ *ret_nseq = nseq;
+ *ret_alen = alen;
+ *ret_p = p;
+ *ret_n = n;
+ return eslOK;
+
+ ERROR:
+ *ret_nseq = 0;
+ *ret_alen = 0;
+ *ret_p = NULL;
+ *ret_n = 0;
+ return status;
+}
+
+
+/*
+ * '?' : unset
+ * 'x' : column consists only of valid data symbols
+ * '.' : column consists only of spaces
+ * 'o' : column consists only of spaces or other (invalid) symbols such as numbers
+ * 'n' : column mixes x and (. or o): must be a name column
+ *
+ * A name can contain spaces, valid symbols, other symbols ('x', 'n', '.', 'o')
+ * Any whitespace between name, data must contain only '.'
+ * Spacer columns elsewhere can contain spaces or other symbols (such as numbers): 'o'
+ * Alignment columns must contain only valid data symbols: 'x'.
+ */
+static int
+phylip_collate_colcodes(char *p, esl_pos_t n, char *colcodes, int ncols)
+{
+ int c;
+
+ for (c = 0; c < ncols && c < n; c++)
+ {
+ if (strchr(eslMSAFILE_PHYLIP_LEGALSYMS, p[c]) != NULL)
+ {
+ switch (colcodes[c]) {
+ case '?': colcodes[c] = 'x'; break;
+ case '.': colcodes[c] = 'n'; break;
+ }
+ }
+ else if (p[c] == ' ')
+ {
+ switch (colcodes[c]) {
+ case '?': colcodes[c] = '.'; break;
+ case 'x': colcodes[c] = 'n'; break;
+ }
+ }
+ else if (isgraph(p[c]))
+ {
+ switch (colcodes[c]) {
+ case '?': colcodes[c] = 'o'; break;
+ case 'x': colcodes[c] = 'n'; break;
+ case '.': colcodes[c] = 'o'; break;
+ }
+ }
+ else return eslFAIL;
+ }
+ for ( ; c < n; c++)
+ if (strchr(eslMSAFILE_PHYLIP_LEGALSYMS, p[c]) != NULL) return eslFAIL;
+
+ return eslOK;
+}
+
+static int
+phylip_deduce_namewidth(char *colcodes0, int ncols0, int alen, int nres2, int *ret_namewidth)
+{
+ int nres1;
+ int c;
+ int nwA, nwB, namewidth;
+
+ /* nres1 = alen - nres2 : # of columns that must be provided in first block */
+ nres1 = alen - nres2;
+ if (nres1 <= 0) return eslFAIL;
+
+ /* search leftward in first block until we've accounted for enough cols */
+ /* c becomes the position of the rightmost col before ali data, and hence = maximal namewidth-1 */
+ for (c = ncols0-1; nres1 && c >= 0; c--)
+ if (colcodes0[c] == 'x') nres1--;
+ if (nres1 > 0) return eslFAIL;
+ nwB = c+1;
+
+ /* search leftward past whitespace columns that might be trailing the name */
+ /* c becomes the position of the rightmost non-whitespace column, and hence = minimal namewidth-1 */
+ for ( ; c >= 0; c--)
+ if (colcodes0[c] != '.') break;
+ nwA = c+1;
+
+ /* if nwA <= 10 <= nwB, the namewidth is consistent with strict PHYLIP namewidth of 10 */
+ if (nwA <= 10 && nwB >= 10) namewidth = 10;
+ else namewidth = nwA;
+
+ *ret_namewidth = namewidth;
+ return eslOK;
+}
+/*-------------- end, format autodetection ----------------------*/
+
+
+/*****************************************************************
+ * 5. Rectifying valid input/output symbols in names and seqs
+ *****************************************************************/
+
+/* We allow any isprint() char in a name, except tabs.
+ * Phylip allows spaces in names, but Easel doesn't.
+ * Internal spaces are converted to underscore _
+ * Leading and trailing spaces are ignored
+ * namebuf must be allocated at least n+1 chars
+ * returns eslEINVAL if it sees an invalid character
+ */
+static int
+phylip_rectify_input_name(char *namebuf, char *p, int n)
+{
+ int pos, endpos;
+ int npos = 0;
+
+ for (endpos = n-1; endpos > 0; endpos--) if (p[endpos] != ' ') break;
+ for (pos = 0; pos <= endpos; pos++) if (p[pos] != ' ') break;
+ for ( ; pos <= endpos; pos++)
+ {
+ if (! isgraph(p[pos]) && p[pos] != ' ') return eslEINVAL;
+ namebuf[npos++] = (p[pos] == ' ' ? '_' : p[pos]);
+ }
+ namebuf[npos] = '\0';
+ return eslOK;
+}
+
+/* Easel's internal alphabet (and output syms) are compatible with PHYLIP
+ * (upper case, '-' for gaps, '*' for stop codon; except that PHYLIP uses
+ * '?' for missing data
+ */
+static int
+phylip_rectify_output_seq_digital(char *buf)
+{
+ int i;
+ for (i = 0; buf[i]; i++)
+ {
+ if (buf[i] == '~') buf[i] = '?';
+ }
+ return eslOK;
+}
+
+static int
+phylip_rectify_output_seq_text(char *buf)
+{
+ int i;
+ for (i = 0; buf[i]; i++)
+ {
+ if (islower(buf[i])) buf[i] = toupper(buf[i]);
+ if (strchr("._ ", buf[i]) != NULL) buf[i] = '-';
+ if (buf[i] == '~') buf[i] = '?';
+ }
+ return eslOK;
+}
+/*---------- end, rectification of name, seq symbols ------------*/
+
+
+
+
+/*****************************************************************
+ * 6. Unit tests
+ *****************************************************************/
+#ifdef eslMSAFILE_PHYLIP_TESTDRIVE
+static void
+utest_write_good1(FILE *ofp, int *ret_format, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs(" 5 42\n", ofp);
+ fputs("Turkey AAGCTNGGGC ATTTCAGGGT\n", ofp);
+ fputs("Salmo gairAAGCCTTGGC AGTGCAGGGT\n", ofp);
+ fputs("H. SapiensACCGGTTGGC CGTTCAGGGT\n", ofp);
+ fputs("Chimp AAACCCTTGC CGTTACGCTT\n", ofp);
+ fputs("Gorilla AAACCCTTGC CGGTACGCTT\n", ofp);
+ fputs("\n", ofp);
+ fputs("GAGCCCGGGC AATACAGGGT AT\n", ofp);
+ fputs("GAGCCGTGGC CGGGCACGGT AT\n", ofp);
+ fputs("ACAGGTTGGC CGTTCAGGGT AA\n", ofp);
+ fputs("AAACCGAGGC CGGGACACTC AT\n", ofp);
+ fputs("AAACCATTGC CGGTACGCTT AA\n", ofp);
+
+ *ret_format = eslMSAFILE_PHYLIP;
+ *ret_alphatype = eslDNA;
+ *ret_nseq = 5;
+ *ret_alen = 42;
+}
+
+static void
+utest_write_good2(FILE *ofp, int *ret_format, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("7 50 \n", ofp);
+ fputs("thermotogaATGGCGAAGGAAAAATTTGTGAGAACAAAACCGCATGTTAACGTTGGAAC\n", ofp);
+ fputs("TthermophiATGGCGAAGGGCGAGTTTGTTCGGACGAAGCCTCACGTGAACGTGGGGAC \n", ofp);
+ fputs("TaquaticusATGGCGAAGGGCGAGTTTATCCGGACGAAGCCCCACGTGAACGTGGGGAC \n", ofp);
+ fputs("deinonema-ATGGCTAAGGGAACGTTTGAACGCACCAAACCCCACGTGAACGTGGGCAC \n", ofp);
+ fputs("ChlamydiaBATGTCAAAAGAAACTTTTCAACGTAATAAGCCTCATATCAACATAGGGGC \n", ofp);
+ fputs("flexistipsATGTCCAAGCAAAAGTACGAAAGGAAGAAACCTCACGTAAACGTAGGCAC \n", ofp);
+ fputs("borrelia-bATGGCAAAAGAAGTTTTTCAAAGAACAAAGCCGCACATGAATGTTGGAAC \n", ofp);
+
+ *ret_format = eslMSAFILE_PHYLIP;
+ *ret_alphatype = eslDNA;
+ *ret_nseq = 7;
+ *ret_alen = 50;
+}
+
+static void
+utest_write_good3(FILE *ofp, int *ret_format, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs(" 3 384\n", ofp);
+ fputs("CYS1_DICDI -----MKVIL LFVLAVFTVF VSS------- --------RG IPPEEQ---- --------SQ \n", ofp);
+ fputs("ALEU_HORVU MAHARVLLLA LAVLATAAVA VASSSSFADS NPIRPVTDRA ASTLESAVLG ALGRTRHALR \n", ofp);
+ fputs("CATH_HUMAN ------MWAT LPLLCAGAWL LGV------- -PVCGAAELS VNSLEK---- --------FH \n", ofp);
+ fputs("\n", ofp);
+ fputs(" FLEFQDKFNK KY-SHEEYLE RFEIFKSNLG KIEELNLIAI NHKADTKFGV NKFADLSSDE \n", ofp);
+ fputs(" FARFAVRYGK SYESAAEVRR RFRIFSESLE EVRSTN---- RKGLPYRLGI NRFSDMSWEE \n", ofp);
+ fputs(" FKSWMSKHRK TY-STEEYHH RLQTFASNWR KINAHN---- NGNHTFKMAL NQFSDMSFAE \n", ofp);
+ fputs("\n", ofp);
+ fputs(" FKNYYLNNKE AIFTDDLPVA DYLDDEFINS IPTAFDWRTR G-AVTPVKNQ GQCGSCWSFS \n", ofp);
+ fputs(" FQATRL-GAA QTCSATLAGN HLMRDA--AA LPETKDWRED G-IVSPVKNQ AHCGSCWTFS \n", ofp);
+ fputs(" IKHKYLWSEP QNCSAT--KS NYLRGT--GP YPPSVDWRKK GNFVSPVKNQ GACGSCWTFS \n", ofp);
+ fputs("\n", ofp);
+ fputs(" TTGNVEGQHF ISQNKLVSLS EQNLVDCDHE CMEYEGEEAC DEGCNGGLQP NAYNYIIKNG \n", ofp);
+ fputs(" TTGALEAAYT QATGKNISLS EQQLVDCAGG FNNF------ --GCNGGLPS QAFEYIKYNG \n", ofp);
+ fputs(" TTGALESAIA IATGKMLSLA EQQLVDCAQD FNNY------ --GCQGGLPS QAFEYILYNK \n", ofp);
+ fputs("\n", ofp);
+ fputs(" GIQTESSYPY TAETGTQCNF NSANIGAKIS NFTMIP-KNE TVMAGYIVST GPLAIAADAV \n", ofp);
+ fputs(" GIDTEESYPY KGVNGV-CHY KAENAAVQVL DSVNITLNAE DELKNAVGLV RPVSVAFQVI \n", ofp);
+ fputs(" GIMGEDTYPY QGKDGY-CKF QPGKAIGFVK DVANITIYDE EAMVEAVALY NPVSFAFEVT \n", ofp);
+ fputs("\n", ofp);
+ fputs(" E-WQFYIGGV F-DIPCN--P NSLDHGILIV GYSAKNTIFR KNMPYWIVKN SWGADWGEQG \n", ofp);
+ fputs(" DGFRQYKSGV YTSDHCGTTP DDVNHAVLAV GYGVENGV-- ---PYWLIKN SWGADWGDNG \n", ofp);
+ fputs(" QDFMMYRTGI YSSTSCHKTP DKVNHAVLAV GYGEKNGI-- ---PYWIVKN SWGPQWGMNG \n", ofp);
+ fputs("\n", ofp);
+ fputs(" YIYLRRGKNT CGVSNFVSTS II-- \n", ofp);
+ fputs(" YFKMEMGKNM CAIATCASYP VVAA \n", ofp);
+ fputs(" YFLIERGKNM CGLAACASYP IPLV\n", ofp);
+
+ *ret_format = eslMSAFILE_PHYLIP;
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 3;
+ *ret_alen = 384;
+}
+
+static void
+utest_write_good4(FILE *ofp, int *ret_format, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs(" 5 42\n", ofp);
+ fputs("Turkey AAGCTNGGGC ATTTCAGGGT\n", ofp);
+ fputs("GAGCCCGGGC AATACAGGGT AT\n", ofp);
+ fputs("Salmo gairAAGCCTTGGC AGTGCAGGGT\n", ofp);
+ fputs("GAGCCGTGGC CGGGCACGGT AT\n", ofp);
+ fputs("H. SapiensACCGGTTGGC CGTTCAGGGT\n", ofp);
+ fputs("ACAGGTTGGC CGTTCAGGGT AA\n", ofp);
+ fputs("Chimp AAACCCTTGC CGTTACGCTT\n", ofp);
+ fputs("AAACCGAGGC CGGGACACTC AT\n", ofp);
+ fputs("Gorilla AAACCCTTGC CGGTACGCTT\n", ofp);
+ fputs("AAACCATTGC CGGTACGCTT AA\n", ofp);
+
+ *ret_format = eslMSAFILE_PHYLIPS;
+ *ret_alphatype = eslDNA;
+ *ret_nseq = 5;
+ *ret_alen = 42;
+}
+
+static void
+utest_write_good5(FILE *ofp, int *ret_format, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs(" 3 384\n", ofp);
+ fputs("CYS1_DICDI-----MKVILLFVLAVFTVFVSS---------------RGIPPEEQ------------SQFLEFQDKFNKKY-SHEEY\n", ofp);
+ fputs("LERFEIFKSNLGKIEELNLIAINHKADTKFGVNKFADLSSDEFKNYYLNNKEAIFTDDLPVADYLDDEFINSIPTAFDWRTRG-AVTP\n", ofp);
+ fputs("VKNQGQCGSCWSFSTTGNVEGQHFISQNKLVSLSEQNLVDCDHECMEYEGEEACDEGCNGGLQPNAYNYIIKNGGIQTESSYPYTAET\n", ofp);
+ fputs("GTQCNFNSANIGAKISNFTMIP-KNETVMAGYIVSTGPLAIAADAVE-WQFYIGGVF-DIPCN--PNSLDHGILIVGYSAKNTIFRKN\n", ofp);
+ fputs("MPYWIVKNSWGADWGEQGYIYLRRGKNTCGVSNFVSTSII--\n", ofp);
+ fputs("\n", ofp);
+ fputs("ALEU_HORVUMAHARVLLLALAVLATAAVAVASSSSFADSNPIRPVTDRAASTLESAVLGALGRTRHALRFARFAVRYGKSYESAAEVR\n", ofp);
+ fputs("RRFRIFSESLEEVRSTN----RKGLPYRLGINRFSDMSWEEFQATRL-GAAQTCSATLAGNHLMRDA--AALPETKDWREDG-IVSPVK\n", ofp);
+ fputs("NQAHCGSCWTFSTTGALEAAYTQATGKNISLSEQQLVDCAGGFNNF--------GCNGGLPSQAFEYIKYNGGIDTEESYPYKGVNGV-\n", ofp);
+ fputs("CHYKAENAAVQVLDSVNITLNAEDELKNAVGLVRPVSVAFQVIDGFRQYKSGVYTSDHCGTTPDDVNHAVLAVGYGVENGV-----PYW\n", ofp);
+ fputs("LIKNSWGADWGDNGYFKMEMGKNMCAIATCASYPVVAA\n", ofp);
+ fputs("\n", ofp);
+ fputs("CATH_HUMAN------MWATLPLLCAGAWLLGV--------PVCGAAELSVNSLEK------------FHFKSWMSKHRKTY-STEEYH\n", ofp);
+ fputs("HRLQTFASNWRKINAHN----NGNHTFKMALNQFSDMSFAEIKHKYLWSEPQNCSAT--KSNYLRGT--GPYPPSVDWRKKGNFVSPVK\n", ofp);
+ fputs("NQGACGSCWTFSTTGALESAIAIATGKMLSLAEQQLVDCAQDFNNY--------GCQGGLPSQAFEYILYNKGIMGEDTYPYQGKDGY-\n", ofp);
+ fputs("CKFQPGKAIGFVKDVANITIYDEEAMVEAVALYNPVSFAFEVTQDFMMYRTGIYSSTSCHKTPDKVNHAVLAVGYGEKNGI-----PYW\n", ofp);
+ fputs("IVKNSWGPQWGMNGYFLIERGKNMCGLAACASYPIPLV\n", ofp);
+ fputs("\n", ofp);
+
+ *ret_format = eslMSAFILE_PHYLIPS;
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 3;
+ *ret_alen = 384;
+}
+
+/* a tricky one, with a nonstandard name width of 12 (all names end in xx) */
+static void
+utest_write_good6(FILE *ofp, int *ret_format, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs(" 5 42\n", ofp);
+ fputs("Turkey xxAAGCTNGGGC ATTTCAGGGT\n", ofp);
+ fputs("Salmo gairxxAAGCCTTGGC AGTGCAGGGT\n", ofp);
+ fputs("H. SapiensxxACCGGTTGGC CGTTCAGGGT\n", ofp);
+ fputs("Chimp xxAAACCCTTGC CGTTACGCTT\n", ofp);
+ fputs("Gorilla xxAAACCCTTGC CGGTACGCTT\n", ofp);
+ fputs("\n", ofp);
+ fputs("GAGCCCGGGC AATACAGGGT AT\n", ofp);
+ fputs("GAGCCGTGGC CGGGCACGGT AT\n", ofp);
+ fputs("ACAGGTTGGC CGTTCAGGGT AA\n", ofp);
+ fputs("AAACCGAGGC CGGGACACTC AT\n", ofp);
+ fputs("AAACCATTGC CGGTACGCTT AA\n", ofp);
+
+ *ret_format = eslMSAFILE_PHYLIP;
+ *ret_alphatype = eslDNA;
+ *ret_nseq = 5;
+ *ret_alen = 42;
+}
+
+/* nonstandard name field width in a sequential file. */
+static void
+utest_write_good7(FILE *ofp, int *ret_format, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs(" 5 42\n", ofp);
+ fputs("Turkey xxAAGCTNGGGC ATTTCAGGGT\n", ofp);
+ fputs("GAGCCCGGGC AATACAGGGT AT\n", ofp);
+ fputs("\n", ofp);
+ fputs("Salmo gairxxAAGCCTTGGC AGTGCAGGGT\n", ofp);
+ fputs("GAGCCGTGGC CGGGCACGGT AT\n", ofp);
+ fputs("\n", ofp);
+ fputs("H. SapiensxxACCGGTTGGC CGTTCAGGGT\n", ofp);
+ fputs("ACAGGTTGGC CGTTCAGGGT AA\n", ofp);
+ fputs("\n", ofp);
+ fputs("Chimp xxAAACCCTTGC CGTTACGCTT\n", ofp);
+ fputs("AAACCGAGGC CGGGACACTC AT\n", ofp);
+ fputs("\n", ofp);
+ fputs("Gorilla xxAAACCCTTGC CGGTACGCTT\n", ofp);
+ fputs("AAACCATTGC CGGTACGCTT AA\n", ofp);
+
+ *ret_format = eslMSAFILE_PHYLIPS;
+ *ret_alphatype = eslDNA;
+ *ret_nseq = 5;
+ *ret_alen = 42;
+}
+
+/* if using strict PHYLIP, 10 char namewidth results in reading a M=21 alignment,
+ * which disagrees with alen=20
+ */
+static void
+utest_write_bad1(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" 2 20\n", ofp);
+ fputs("Turkey xAAGCTNGGGC ATTTCAGGGT\n", ofp);
+ fputs("Salmo gairxAAGCCTTGGC AGTGCAGGGT\n", ofp);
+
+ *ret_alphatype = eslDNA;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 3;
+ strcpy(errmsg, "alignment length disagrees");
+}
+
+static void
+utest_write_bad2(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" x 2 20\n", ofp);
+ fputs("Turkey AAGCTNGGGC ATTTCAGGGT\n", ofp);
+ fputs("Salmo gairAAGCCTTGGC AGTGCAGGGT\n", ofp);
+
+ *ret_alphatype = eslDNA;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 1;
+ strcpy(errmsg, "first field isn't an integer");
+}
+
+static void
+utest_write_bad3(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" 2 x\n", ofp);
+ fputs("Turkey AAGCTNGGGC ATTTCAGGGT\n", ofp);
+ fputs("Salmo gairAAGCCTTGGC AGTGCAGGGT\n", ofp);
+
+ *ret_alphatype = eslDNA;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 1;
+ strcpy(errmsg, "second field isn't an integer");
+}
+
+static void
+utest_write_bad4(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" 2\n", ofp);
+ fputs("Turkey AAGCTNGGGC ATTTCAGGGT\n", ofp);
+ fputs("Salmo gairAAGCCTTGGC AGTGCAGGGT\n", ofp);
+
+ *ret_alphatype = eslDNA;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 1;
+ strcpy(errmsg, "only one field found");
+}
+
+static void
+utest_write_bad5(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" 2 20\n", ofp);
+ fputs("\n", ofp);
+
+ *ret_alphatype = eslDNA;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 2;
+ strcpy(errmsg, "no alignment data");
+}
+
+static void
+utest_write_bad6(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" 2 20\n", ofp);
+ fputs("seq1 \n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 2;
+ strcpy(errmsg, "line too short");
+}
+
+static void
+utest_write_bad7(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" 2 20\n", ofp);
+ fputs("\tseq1_name ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2_name ACDEFGHIKLMNPQRSTVWY\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 2;
+ strcpy(errmsg, "invalid character(s) in sequence name");
+}
+
+static void
+utest_write_bad8(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" 2 20\n", ofp);
+ fputs("seq1_name ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2_name ACDEFGHI~LMNPQRSTVWY\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 3;
+ strcpy(errmsg, "one or more invalid sequence characters");
+}
+
+static void
+utest_write_bad9(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" 2 20\n", ofp);
+ fputs("seq1_name ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2_name ACDEFGHIKLMNPQRSTVW\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 3;
+ strcpy(errmsg, "number of residues on line differs from previous seqs");
+}
+
+static void
+utest_write_bad10(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" 3 40\n", ofp);
+ fputs("seq1_name ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2_name ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("\n", ofp);
+ fputs("ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("ACDEFGHIKLMNPQRSTVWY\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 4;
+ strcpy(errmsg, "unexpected number of sequences in block");
+}
+
+static void
+utest_write_bad11(FILE *ofp, int *ret_alphatype, int *ret_errstatus, int *ret_linenumber, char *errmsg)
+{
+ fputs(" 2 30\n", ofp);
+ fputs("seq1_name ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2_name ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("\n", ofp);
+ fputs(" ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs(" ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_errstatus = eslEFORMAT;
+ *ret_linenumber = 7;
+ strcpy(errmsg, "alignment length disagrees with header");
+}
+
+/* example of a pathological file where interleaved, sequential
+ * can't be distinguished. If we read this as interleaved:
+ * seq1 AAAAAAAAAA CCCCCCCCCC YYYYYYYYY FFFFFFFFFF GGGGGGGGGG
+ * YYYYYYYYY DDDDDDDDDD EEEEEEEEEE HHHHHHHHH IIIIIIIIII KKKKKKKKKK
+ * whereas if we read it as sequential:
+ * seq1 AAAAAAAAAA CCCCCCCCCC YYYYYYYYY DDDDDDDDDD EEEEEEEEEE
+ * YYYYYYYYY FFFFFFFFFF GGGGGGGGGG HHHHHHHHH IIIIIIIIII KKKKKKKKKK
+ *
+ * To fall into this, sequence names have to look like a chunk of
+ * aligned sequence, with exactly the right length to give a correct
+ * <alen> whichever way we read the file.
+ */
+static void
+utest_write_ambig1(FILE *ofp)
+{
+ fputs(" 2 49\n", ofp);
+ fputs("seq1 AAAAAAAAAA CCCCCCCCCC\n", ofp);
+ fputs("YYYYYYYYY DDDDDDDDDD EEEEEEEEEE\n", ofp);
+ fputs("YYYYYYYYY FFFFFFFFFF GGGGGGGGGG\n", ofp);
+ fputs("HHHHHHHHH IIIIIIIIII KKKKKKKKKK\n", ofp);
+};
+
+
+
+
+
+static void
+utest_goodfile(char *filename, int testnumber, int expected_format, int expected_alphatype, int expected_nseq, int expected_alen)
+{
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSAFILE_FMTDATA fmtd; /* for writing formats with nonstandard name field widths */
+ ESL_MSA *msa1 = NULL;
+ ESL_MSA *msa2 = NULL;
+ char tmpfile1[32] = "esltmpXXXXXX";
+ char tmpfile2[32] = "esltmpXXXXXX";
+ FILE *ofp = NULL;
+ int status;
+
+ esl_msafile_fmtdata_Init(&fmtd);
+
+ /* guessing both the format and the alphabet should work: this is a digital open */
+ if ( (status = esl_msafile_Open(&abc, filename, NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK) esl_fatal("phylip good file unit test %d failed: digital open", testnumber);
+ if (afp->format != expected_format) esl_fatal("phylip good file unit test %d failed: format autodetection", testnumber);
+ if (abc->type != expected_alphatype) esl_fatal("phylip good file unit test %d failed: alphabet autodetection", testnumber);
+
+ /* This is a digital read, using <abc>. */
+ if ( (status = esl_msafile_phylip_Read(afp, &msa1)) != eslOK) esl_fatal("phylip good file unit test %d failed: msa read, digital", testnumber);
+ if (msa1->nseq != expected_nseq || msa1->alen != expected_alen) esl_fatal("phylip good file unit test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa1, NULL) != eslOK) esl_fatal("phylip good file test %d failed: msa1 invalid", testnumber);
+ fmtd.namewidth = afp->fmtd.namewidth;
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (digital write) */
+ if ( (status = esl_tmpfile_named(tmpfile1, &ofp)) != eslOK) esl_fatal("phylip good file unit test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_phylip_Write(ofp, msa1, expected_format, &fmtd)) != eslOK) esl_fatal("phylip good file unit test %d failed: msa write, digital", testnumber);
+ fclose(ofp);
+
+ /* now open and read it as text mode, in known format. (We have to pass fmtd now, to deal with the possibility of a nonstandard name width) */
+ if ( (status = esl_msafile_Open(NULL, tmpfile1, NULL, expected_format, &fmtd, &afp)) != eslOK) esl_fatal("phylip good file unit test %d failed: text mode open", testnumber);
+ if ( (status = esl_msafile_phylip_Read(afp, &msa2)) != eslOK) esl_fatal("phylip good file unit test %d failed: msa read, text", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("phylip good file test %d failed: msa2 invalid", testnumber);
+ if (msa2->nseq != expected_nseq || msa2->alen != expected_alen) esl_fatal("phylip good file unit test %d failed: nseq/alen", testnumber);
+ fmtd.namewidth = afp->fmtd.namewidth;
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (text write) */
+ if ( (status = esl_tmpfile_named(tmpfile2, &ofp)) != eslOK) esl_fatal("phylip good file unit test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_phylip_Write(ofp, msa2, expected_format, &fmtd)) != eslOK) esl_fatal("phylip good file unit test %d failed: msa write, text", testnumber);
+ fclose(ofp);
+ esl_msa_Destroy(msa2);
+
+ /* open and read it in digital mode */
+ if ( (status = esl_msafile_Open(&abc, tmpfile1, NULL, expected_format, &fmtd, &afp)) != eslOK) esl_fatal("phylip good file unit test %d failed: 2nd digital mode open", testnumber);
+ if ( (status = esl_msafile_phylip_Read(afp, &msa2)) != eslOK) esl_fatal("phylip good file unit test %d failed: 2nd digital msa read", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("phylip good file test %d failed: msa2 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* this msa <msa2> should be identical to <msa1> */
+ if (esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal("phylip good file unit test %d failed: msa compare", testnumber);
+
+ remove(tmpfile1);
+ remove(tmpfile2);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_alphabet_Destroy(abc);
+}
+
+/* utest_badfile:
+ * Test the strict PHYLIP parser's ability to detect bad input;
+ * regression test its user-directed error messages.
+ *
+ * note: this test uses strict phylip, with 10 char name width.
+ * it's not using the format guesser, which could determine a nonstandard name width
+ * some "bad" utests can be parsed differently by esl_msafile_phylip_example,
+ * which does use the format guesser
+ *
+ * TODO: we should also have "bad" tests for sequential PHYLIP, and for
+ * nonstandard name widths.
+ *
+ */
+static void
+utest_badfile(char *filename, int testnumber, int expected_alphatype, int expected_status, int expected_linenumber, char *expected_errmsg)
+{
+ ESL_ALPHABET *abc = esl_alphabet_Create(expected_alphatype);
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if ( (status = esl_msafile_Open(&abc, filename, NULL, eslMSAFILE_PHYLIP, NULL, &afp)) != eslOK) esl_fatal("phylip bad file unit test %d failed: unexpected open failure", testnumber);
+ if ( (status = esl_msafile_phylip_Read(afp, &msa)) != expected_status) esl_fatal("phylip bad file unit test %d failed: unexpected error code", testnumber);
+ if (strstr(afp->errmsg, expected_errmsg) == NULL) esl_fatal("phylip bad file unit test %d failed: unexpected errmsg", testnumber);
+ if (afp->linenumber != expected_linenumber) esl_fatal("phylip bad file unit test %d failed: unexpected linenumber", testnumber);
+ esl_msafile_Close(afp);
+ esl_alphabet_Destroy(abc);
+ esl_msa_Destroy(msa);
+}
+
+static void
+utest_ambigfile(char *filename, int testnumber)
+{
+ ESL_BUFFER *bf = NULL;
+ int fmt;
+ int namewidth;
+
+ if ( esl_buffer_Open(filename, NULL, &bf) != eslOK) esl_fatal("phylip ambig file unit test %d failed: buffer open", testnumber);
+ if ( esl_msafile_phylip_CheckFileFormat(bf, &fmt, &namewidth) != eslEAMBIGUOUS) esl_fatal("phylip ambig file unit test %d failed: ambiguity detection", testnumber);
+ if ( fmt != eslMSAFILE_UNKNOWN ) esl_fatal("phylip ambig file unit test %d failed: format code", testnumber);
+ if ( namewidth != 0 ) esl_fatal("phylip ambig file unit test %d failed: namewidth not 0", testnumber);
+ esl_buffer_Close(bf);
+}
+
+
+/* PHYLIP's seqboot program can output many MSAs to the same phylip file.
+ * For this reason (only), we allow PHYLIP format to have multiple MSAs per file.
+ * PHYLIP format 'officially' does not document this!
+ */
+static void
+utest_seqboot(void)
+{
+ char msg[] = "seqboot unit test failed";
+ char tmpfile[32];
+ FILE *ofp;
+ int expected_fmt;
+ int expected_alphatype;
+ int expected_nseq;
+ int expected_alen;
+ int expected_nali;
+ int i;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+
+ /* Write a tmp testfile with good1 concatenated 3 times. */
+ expected_nali = 3;
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+ for (i = 0; i < expected_nali; i++)
+ utest_write_good1(ofp, &expected_fmt, &expected_alphatype, &expected_nseq, &expected_alen);
+ fclose(ofp);
+
+ /* open it and loop over it, reading MSAs. there should be 3, of the expected size. */
+ if (esl_msafile_Open(&abc, tmpfile, /*env=*/NULL, eslMSAFILE_UNKNOWN, /*fmtd=*/NULL, &afp) != eslOK) esl_fatal(msg);
+ if (abc->type != expected_alphatype) esl_fatal(msg);
+ if (afp->format != expected_fmt) esl_fatal(msg);
+ i = 0;
+ while ( esl_msafile_Read(afp, &msa) == eslOK)
+ {
+ i++;
+ if (msa->nseq != expected_nseq) esl_fatal(msg);
+ if (msa->alen != expected_alen) esl_fatal(msg);
+ esl_msa_Destroy(msa);
+ }
+ if (i != expected_nali) esl_fatal(msg);
+
+ remove(tmpfile);
+ esl_msafile_Close(afp);
+ esl_alphabet_Destroy(abc);
+}
+
+#endif /*eslMSAFILE_PHYLIP_TESTDRIVE*/
+/*---------------------- end, unit tests ------------------------*/
+
+
+
+/*****************************************************************
+ * 7. Test driver
+ *****************************************************************/
+
+#ifdef eslMSAFILE_PHYLIP_TESTDRIVE
+/* compile: gcc -g -Wall -I. -L. -o esl_msafile_phylip_utest -DeslMSAFILE_PHYLIP_TESTDRIVE esl_msafile_phylip.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_msafile_phylip_utest -DeslMSAFILE_PHYLIP_TESTDRIVE esl_msafile_phylip.c -leasel -lm
+ * run: ./esl_msafile_phylip_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_msafile.h"
+#include "esl_msafile_phylip.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for PHYLIP MSA format module";
+
+int
+main(int argc, char **argv)
+{
+ char msg[] = "PHYLIP MSA i/o module test driver failed";
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ FILE *ofp = NULL;
+ int ngoodtests = 7;
+ int nbadtests = 11;
+ int nambigtests = 1;
+ int testnumber = 0;
+ char tmpfile[32];
+ int expected_format;
+ int expected_alphatype;
+ int expected_errstatus;
+ int expected_linenumber;
+ int expected_nseq;
+ int expected_alen;
+ char expected_errmsg[eslERRBUFSIZE];
+
+ /* Test various correct versions of the format */
+ for (testnumber = 1; testnumber <= ngoodtests; testnumber++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+ switch (testnumber) {
+ case 1: utest_write_good1 (ofp, &expected_format, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 2: utest_write_good2 (ofp, &expected_format, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 3: utest_write_good3 (ofp, &expected_format, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 4: utest_write_good4 (ofp, &expected_format, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 5: utest_write_good5 (ofp, &expected_format, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 6: utest_write_good6 (ofp, &expected_format, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 7: utest_write_good7 (ofp, &expected_format, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ }
+ fclose(ofp);
+ utest_goodfile(tmpfile, testnumber, expected_format, expected_alphatype, expected_nseq, expected_alen);
+ remove(tmpfile);
+ }
+
+ /* Test for all the possible EFORMAT errors (using strict Phylip interleaved parser) */
+ for (testnumber = 1; testnumber <= nbadtests; testnumber++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+
+ switch (testnumber) {
+ case 1: utest_write_bad1 (ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ case 2: utest_write_bad2 (ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ case 3: utest_write_bad3 (ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ case 4: utest_write_bad4 (ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ case 5: utest_write_bad5 (ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ case 6: utest_write_bad6 (ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ case 7: utest_write_bad7 (ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ case 8: utest_write_bad8 (ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ case 9: utest_write_bad9 (ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ case 10: utest_write_bad10(ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ case 11: utest_write_bad11(ofp, &expected_alphatype, &expected_errstatus, &expected_linenumber, expected_errmsg); break;
+ }
+ fclose(ofp);
+
+ utest_badfile(tmpfile, testnumber, expected_alphatype, expected_errstatus, expected_linenumber, expected_errmsg);
+ remove(tmpfile);
+ }
+
+ /* Test that we correctly detect pathological files that look both interleaved and sequential */
+ for (testnumber = 1; testnumber <= nambigtests; testnumber++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+
+ switch (testnumber) {
+ case 1: utest_write_ambig1 (ofp);
+ }
+ fclose(ofp);
+
+ utest_ambigfile(tmpfile, testnumber);
+ remove(tmpfile);
+ }
+
+
+ /* Other tests */
+ utest_seqboot();
+
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslMSAFILE_PHYLIP_TESTDRIVE*/
+/*--------------------- end, test driver ------------------------*/
+
+
+
+/*****************************************************************
+ * 8. Example.
+ *****************************************************************/
+
+#ifdef eslMSAFILE_PHYLIP_EXAMPLE
+/* A full-featured example of reading/writing an MSA in Phylip format(s).
+ gcc -g -Wall -o esl_msafile_phylip_example -I. -L. -DeslMSAFILE_PHYLIP_EXAMPLE esl_msafile_phylip.c -leasel -lm
+ ./esl_msafile_phylip_example <msafile>
+ */
+/*::cexcerpt::msafile_phylip_example::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_phylip.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-1", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-1", "no autodetection; use interleaved PHYLIP", 0 },
+ { "-2", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-2", "no autodetection; use sequential PHYLIPS", 0 },
+ { "-q", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "quieter: don't write msa back, just summary", 0 },
+ { "-t", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use text mode: no digital alphabet", 0 },
+ { "-w", eslARG_INT, "10", NULL, NULL, NULL, NULL, NULL, "specify that format's name width is <n>", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is DNA", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is RNA", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is protein", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msafile>";
+static char banner[] = "example of guessing, reading, writing PHYLIP formats";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *filename = esl_opt_GetArg(go, 1);
+ int infmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ ESL_MSAFILE_FMTDATA fmtd;
+ int status;
+
+ if (esl_opt_GetBoolean(go, "-1")) infmt = eslMSAFILE_PHYLIP; /* interleaved format */
+ else if (esl_opt_GetBoolean(go, "-2")) infmt = eslMSAFILE_PHYLIPS; /* sequential format */
+
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+
+ /* Variant PHYLIP formats allow nonstandard name field width.
+ * Usually we can successfully guess this, when guessing format.
+ * But if PHYLIP or PHYLIPS format is set (no guessing), caller may also
+ * want to allow a nonstandard name field width to be set.
+ */
+ esl_msafile_fmtdata_Init(&fmtd);
+ fmtd.namewidth = esl_opt_GetInteger(go, "-w");
+
+ /* Text mode: pass NULL for alphabet.
+ * Digital mode: pass ptr to expected ESL_ALPHABET; and if abc=NULL, alphabet is guessed
+ */
+ if (esl_opt_GetBoolean(go, "-t")) status = esl_msafile_Open(NULL, filename, NULL, infmt, &fmtd, &afp);
+ else status = esl_msafile_Open(&abc, filename, NULL, infmt, &fmtd, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+
+ if ( (status = esl_msafile_phylip_Read(afp, &msa)) != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+
+ printf("format variant: %s\n", esl_msafile_DecodeFormat(afp->format));
+ printf("name width: %d\n", afp->fmtd.namewidth);
+ printf("alphabet: %s\n", (abc ? esl_abc_DecodeType(abc->type) : "none (text mode)"));
+ printf("# of seqs: %d\n", msa->nseq);
+ printf("# of cols: %d\n", (int) msa->alen);
+ printf("\n");
+
+ if (afp->fmtd.namewidth != 10) fmtd.namewidth = afp->fmtd.namewidth;
+
+ if (! esl_opt_GetBoolean(go, "-q"))
+ esl_msafile_phylip_Write(stdout, msa, eslMSAFILE_PHYLIP, &fmtd);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ if (abc) esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+/*::cexcerpt::msafile_phylip_example::end::*/
+#endif /*eslMSAFILE_PHYLIP_EXAMPLE*/
+
+
+
+#ifdef eslMSAFILE_PHYLIP_EXAMPLE2
+/* A minimal example. Reading a strict interleaved PHYLIP MSA in text mode.
+ gcc -g -Wall -o esl_msafile_phylip_example2 -I. -L. -DeslMSAFILE_PHYLIP_EXAMPLE2 esl_msafile_phylip.c -leasel -lm
+ ./esl_msafile_phylip_example2 <msafile>
+ */
+/*::cexcerpt::msafile_phylip_example2::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_phylip.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int infmt = eslMSAFILE_PHYLIP; /* or eslMSAFILE_PHYLIPS, for sequential format */
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if ( (status = esl_msafile_Open(NULL, filename, NULL, infmt, NULL, &afp)) != eslOK) esl_msafile_OpenFailure(afp, status);
+ if ( (status = esl_msafile_phylip_Read(afp, &msa)) != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ printf("# of seqs: %d\n", msa->nseq);
+ printf("# of cols: %d\n", (int) msa->alen);
+ printf("\n");
+
+ esl_msafile_phylip_Write(stdout, msa, eslMSAFILE_PHYLIP, NULL);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ exit(0);
+}
+/*::cexcerpt::msafile_phylip_example::end::*/
+#endif /*eslMSAFILE_PHYLIP_EXAMPLE*/
+/*--------------------- end of examples -------------------------*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_phylip.h b/esl_msafile_phylip.h
new file mode 100644
index 0000000..4157c91
--- /dev/null
+++ b/esl_msafile_phylip.h
@@ -0,0 +1,19 @@
+/* I/O of multiple sequence alignments in PHYLIP format
+ */
+#ifndef eslMSAFILE_PHYLIP_INCLUDED
+#define eslMSAFILE_PHYLIP_INCLUDED
+
+#include "esl_msa.h"
+#include "esl_msafile.h"
+
+extern int esl_msafile_phylip_SetInmap (ESL_MSAFILE *afp);
+extern int esl_msafile_phylip_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type);
+extern int esl_msafile_phylip_Read (ESL_MSAFILE *afp, ESL_MSA **ret_msa);
+extern int esl_msafile_phylip_Write (FILE *fp, const ESL_MSA *msa, int format, ESL_MSAFILE_FMTDATA *opt_fmtd);
+
+extern int esl_msafile_phylip_CheckFileFormat(ESL_BUFFER *bf, int *ret_format, int *ret_namewidth);
+
+#endif /* eslMSAFILE_PHYLIP_INCLUDED */
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_psiblast.c b/esl_msafile_psiblast.c
new file mode 100644
index 0000000..b83f005
--- /dev/null
+++ b/esl_msafile_psiblast.c
@@ -0,0 +1,819 @@
+/* I/O of multiple sequence alignments in PSI-BLAST format
+ *
+ * Contents:
+ * 1. API for reading/writing PSI-BLAST format
+ * 2. Unit tests.
+ * 3. Test driver.
+ * 4. Examples.
+ * 5. Copyright and license information.
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#include "esl_mem.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_psiblast.h"
+
+/*****************************************************************
+ *# 1. API for reading/writing PSI-BLAST format
+ *****************************************************************/
+
+/* Function: esl_msafile_psiblast_SetInmap()
+ * Synopsis: Set input map specific for PSI-BLAST input.
+ *
+ * Purpose: Set the <afp->inmap> for PSI-BLAST format.
+ *
+ * PSI-BLAST only allows - for a gap. It also disallows O residues.
+ *
+ * Text mode accepts any <isalpha()> character plus '-' but not 'O' or 'o'.
+ * Digital mode enforces the usual Easel alphabets, but disallows "._*~".
+ */
+int
+esl_msafile_psiblast_SetInmap(ESL_MSAFILE *afp)
+{
+ int sym;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc)
+ {
+ for (sym = 0; sym < 128; sym++)
+ afp->inmap[sym] = afp->abc->inmap[sym];
+ afp->inmap[0] = esl_abc_XGetUnknown(afp->abc);
+ afp->inmap['.'] = eslDSQ_ILLEGAL;
+ afp->inmap['_'] = eslDSQ_ILLEGAL;
+ afp->inmap['*'] = eslDSQ_ILLEGAL;
+ afp->inmap['~'] = eslDSQ_ILLEGAL;
+ }
+#endif
+ if (! afp->abc)
+ {
+ for (sym = 1; sym < 128; sym++)
+ afp->inmap[sym] = (isalpha(sym) ? sym : eslDSQ_ILLEGAL);
+ afp->inmap[0] = '?';
+ afp->inmap['-'] = '-';
+ }
+
+ afp->inmap['O'] = eslDSQ_ILLEGAL;
+ afp->inmap['o'] = eslDSQ_ILLEGAL;
+ return eslOK;
+}
+
+/* Function: esl_msafile_psiblast_GuessAlphabet()
+ * Synopsis: Guess the alphabet of an open PSI-BLAST MSA file.
+ *
+ * Purpose: Guess the alpbabet of the sequences in open
+ * PSI-BLAST format MSA file <afp>.
+ *
+ * On a normal return, <*ret_type> is set to <eslDNA>,
+ * <eslRNA>, or <eslAMINO>, and <afp> is reset to its
+ * original position.
+ *
+ * Args: afp - open PSI-BLAST format MSA file
+ * ret_type - RETURN: <eslDNA>, <eslRNA>, or <eslAMINO>
+ *
+ * Returns: <eslOK> on success.
+ * <eslENOALPHABET> if alphabet type can't be determined.
+ * In either case, <afp> is rewound to the position it
+ * started at.
+ */
+int
+esl_msafile_psiblast_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type)
+{
+ int alphatype = eslUNKNOWN;
+ esl_pos_t anchor = -1;
+ int threshold[3] = { 500, 5000, 50000 }; /* we check after 500, 5000, 50000 residues; else we go to EOF */
+ int nsteps = 3;
+ int step = 0;
+ int nres = 0;
+ int x;
+ int64_t ct[26];
+ char *p, *tok;
+ esl_pos_t n, toklen, pos;
+ int status;
+
+ for (x = 0; x < 26; x++) ct[x] = 0;
+
+ anchor = esl_buffer_GetOffset(afp->bf);
+ if ((status = esl_buffer_SetAnchor(afp->bf, anchor)) != eslOK) { status = eslEINCONCEIVABLE; goto ERROR; } /* [eslINVAL] can't happen here */
+
+ while ( (status = esl_buffer_GetLine(afp->bf, &p, &n)) == eslOK)
+ {
+ if ((status = esl_memtok(&p, &n, " \t", &tok, &toklen)) != eslOK) continue; /* blank lines */
+ /* p now points to the rest of the sequence line, after a name */
+
+ /* count characters into ct[] array */
+ for (pos = 0; pos < n; pos++)
+ if (isalpha(p[pos])) {
+ x = toupper(p[pos]) - 'A';
+ ct[x]++;
+ nres++;
+ }
+
+ /* try to stop early, checking after 500, 5000, and 50000 residues: */
+ if (step < nsteps && nres > threshold[step]) {
+ if ((status = esl_abc_GuessAlphabet(ct, &alphatype)) == eslOK) goto DONE; /* (eslENOALPHABET) */
+ step++;
+ }
+ }
+ if (status != eslEOF) goto ERROR; /* [eslEMEM,eslESYS,eslEINCONCEIVABLE] */
+ status = esl_abc_GuessAlphabet(ct, &alphatype); /* (eslENOALPHABET) */
+
+ DONE:
+ esl_buffer_SetOffset(afp->bf, anchor); /* Rewind to where we were. */
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ *ret_type = alphatype;
+ return status;
+
+ ERROR:
+ if (anchor != -1) {
+ esl_buffer_SetOffset(afp->bf, anchor);
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ }
+ *ret_type = eslUNKNOWN;
+ return status;
+}
+
+/* Function: esl_msafile_psiblast_Read()
+ * Synopsis: Read an alignment in PSI-BLAST's input format.
+ *
+ * Purpose: Read an MSA from an open <ESL_MSAFILE> <afp>, parsing for
+ * PSI-BLAST input format, starting from the current point.
+ * Create a new multiple alignment, and return a ptr to
+ * that alignment via <*ret_msa>. Caller is responsible for
+ * free'ing this <ESL_MSA>.
+ *
+ * The <msa> has a reference line (<msa->rf[]>) that
+ * corresponds to the uppercase/lowercase columns in the
+ * alignment: consensus (uppercase) columns are marked 'x',
+ * and insert (lowercase) columns are marked '.' in this RF
+ * line.
+ *
+ * Args: afp - open <ESL_MSAFILE>
+ * ret_msa - RETURN: newly parsed <ESL_MSA>
+ *
+ * Returns: <eslOK> on success. <*ret_msa> contains the newly
+ * allocated MSA. <afp> is at EOF.
+ *
+ * <eslEOF> if no (more) alignment data are found in
+ * <afp>, and <afp> is returned at EOF.
+ *
+ * <eslEFORMAT> on a parse error. <*ret_msa> is set to
+ * <NULL>. <afp> contains information sufficient for
+ * constructing useful diagnostic output:
+ * | <afp->errmsg> | user-directed error message |
+ * | <afp->linenumber> | line # where error was detected |
+ * | <afp->line> | offending line (not NUL-term) |
+ * | <afp->n> | length of offending line |
+ * | <afp->bf->filename> | name of the file |
+ * and <afp> is poised at the start of the following line,
+ * so (in principle) the caller could try to resume
+ * parsing.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslESYS> if a system call fails, such as fread().
+ * <eslEINCONCEIVABLE> - "impossible" corruption
+ * On these, <*ret_msa> is returned <NULL>, and the state of
+ * <afp> is undefined.
+ */
+int
+esl_msafile_psiblast_Read(ESL_MSAFILE *afp, ESL_MSA **ret_msa)
+{
+ ESL_MSA *msa = NULL;
+ int idx = 0; /* counter over sequences in a block */
+ int nblocks = 0; /* counter over blocks */
+ int64_t alen = 0;
+ int nseq = 0;
+ int64_t cur_alen;
+ esl_pos_t pos; /* position on a line */
+ esl_pos_t name_start, name_len;
+ esl_pos_t seq_start, seq_len;
+ esl_pos_t block_seq_start, block_seq_len;
+ int status;
+
+ ESL_DASSERT1( (afp->format == eslMSAFILE_PSIBLAST) );
+
+ afp->errmsg[0] = '\0';
+
+ /* allocate a growable MSA. We set msa->{nseq,alen} only when we're done. */
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc && (msa = esl_msa_CreateDigital(afp->abc, 16, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+#endif
+ if (! afp->abc && (msa = esl_msa_Create( 16, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ /* skip leading blank lines in file */
+ while ( (status = esl_msafile_GetLine(afp, NULL, NULL)) == eslOK && esl_memspn(afp->line, afp->n, " \t") == afp->n) ;
+ if (status != eslOK) goto ERROR; /* includes normal EOF */
+
+ /* Read the file a line at a time; if a parsing error occurs, detect immediately, with afp->linenumber set correctly */
+ do { /* while in the file... */
+ idx = 0;
+ do { /* while in a block... */
+ for (pos = 0; pos < afp->n; pos++) if (! isspace(afp->line[pos])) break; name_start = pos;
+ for (pos = pos+1; pos < afp->n; pos++) if ( isspace(afp->line[pos])) break; name_len = pos - name_start;
+ for (pos = pos+1; pos < afp->n; pos++) if (! isspace(afp->line[pos])) break; seq_start = pos;
+ if (pos >= afp->n) ESL_XFAIL(eslEFORMAT, afp->errmsg, "invalid alignment line");
+ for (pos = afp->n-1; pos > 0; pos--) if (! isspace(afp->line[pos])) break; seq_len = pos - seq_start + 1;
+
+ if (idx == 0) {
+ block_seq_start = seq_start;
+ block_seq_len = seq_len;
+ } else {
+ if (seq_start != block_seq_start) ESL_XFAIL(eslEFORMAT, afp->errmsg, "sequence start is misaligned");
+ if (seq_len != block_seq_len) ESL_XFAIL(eslEFORMAT, afp->errmsg, "sequence end is misaligned");
+ }
+
+ /* Process the consensus #=RF line. */
+ if (idx == 0) {
+ ESL_REALLOC(msa->rf, sizeof(char) * (alen + seq_len + 1));
+ for (pos = 0; pos < seq_len; pos++) msa->rf[alen+pos] = '-'; /* anything neutral other than . or x will do. */
+ msa->rf[alen+pos] = '\0';
+ }
+ for (pos = 0; pos < seq_len; pos++)
+ {
+ if (afp->line[seq_start+pos] == '-') continue;
+ if (isupper(afp->line[seq_start+pos])) {
+ if (msa->rf[alen+pos] == '.') ESL_XFAIL(eslEFORMAT, afp->errmsg, "unexpected upper case residue (#%d on line)", (int) pos+1);
+ msa->rf[alen+pos] = 'x';
+ }
+ if (islower(afp->line[seq_start+pos])) {
+ if (msa->rf[alen+pos] == 'x') ESL_XFAIL(eslEFORMAT, afp->errmsg, "unexpected lower case residue (#%d on line)", (int) pos+1);
+ msa->rf[alen+pos] = '.';
+ }
+ }
+
+ /* Store the sequence name. */
+ if (nblocks == 0) {
+ /* make sure we have room for another sequence */
+ if (idx >= msa->sqalloc && (status = esl_msa_Expand(msa)) != eslOK) goto ERROR;
+ if ( (status = esl_msa_SetSeqName(msa, idx, afp->line+name_start, name_len)) != eslOK) goto ERROR;
+ } else {
+ if (! esl_memstrcmp(afp->line+name_start, name_len, msa->sqname[idx]))
+ ESL_XFAIL(eslEFORMAT, afp->errmsg, "expected sequence %s on this line, but saw %.*s", msa->sqname[idx], (int) name_len, afp->line+name_start);
+ }
+
+ /* Append the sequence. */
+ cur_alen = alen;
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) { status = esl_abc_dsqcat(afp->inmap, &(msa->ax[idx]), &(cur_alen), afp->line+seq_start, seq_len); }
+#endif
+ if (! msa->abc) { status = esl_strmapcat (afp->inmap, &(msa->aseq[idx]), &(cur_alen), afp->line+seq_start, seq_len); }
+ if (status == eslEINVAL) ESL_XFAIL(eslEFORMAT, afp->errmsg, "one or more invalid sequence characters");
+ else if (status != eslOK) goto ERROR;
+ if (cur_alen - alen != seq_len) ESL_XFAIL(eslEFORMAT, afp->errmsg, "unexpected number of seq characters");
+
+ /* get next line. if it's blank, or if we're EOF, we're done with the block */
+ idx++;
+ status = esl_msafile_GetLine(afp, NULL, NULL);
+ } while (status == eslOK && esl_memspn(afp->line, afp->n, " \t") < afp->n); /* blank line ends a block. */
+ if (status != eslOK && status != eslEOF) goto ERROR;
+ /* End of one block */
+
+ if (nblocks == 0) nseq = idx;
+ else if (idx != nseq) ESL_XFAIL(eslEFORMAT, afp->errmsg, "last block didn't contain same # of seqs as earlier blocks");
+ alen += block_seq_len;
+ nblocks++;
+
+ /* skip blank lines to start of next block, if any */
+ while ( (status = esl_msafile_GetLine(afp, NULL, NULL)) == eslOK && esl_memspn(afp->line, afp->n, " \t") == afp->n) ;
+ } while (status == eslOK);
+ if (status != eslEOF) goto ERROR;
+
+ msa->nseq = nseq;
+ msa->alen = alen;
+ if (( status = esl_msa_SetDefaultWeights(msa)) != eslOK) goto ERROR;
+ *ret_msa = msa;
+ return eslOK;
+
+ ERROR:
+ if (msa) esl_msa_Destroy(msa);
+ *ret_msa = NULL;
+ return status;
+}
+
+
+/* Function: esl_msafile_psiblast_Write()
+ * Synopsis: Write an MSA to a stream in PSI-BLAST format
+ *
+ * Purpose: Write alignment <msa> in NCBI PSI-BLAST format to
+ * stream <fp>.
+ *
+ * The <msa> should have a valid reference line <msa->rf>,
+ * with alphanumeric characters marking consensus (match)
+ * columns, and non-alphanumeric characters marking
+ * nonconsensus (insert) columns. If it does not have RF
+ * annotation, then the first sequence in the <msa>
+ * defines the "consensus".
+ *
+ * PSI-BLAST format allows only one symbol ('-') for gaps,
+ * and cannot represent missing data symbols (Easel's
+ * '~'). Any missing data symbols are converted to gaps.
+ *
+ * Args: fp - open output stream
+ * msa - MSA to write
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEWRITE> on any system write failure, such as filled disk.
+ */
+int
+esl_msafile_psiblast_Write(FILE *fp, const ESL_MSA *msa)
+{
+ char *buf = NULL;
+ int cpl = 60;
+ int acpl;
+ int i;
+ int sym;
+ int64_t pos, bpos;
+ int maxnamewidth = esl_str_GetMaxWidth(msa->sqname, msa->nseq);
+ int is_consensus;
+ int is_residue;
+ int status;
+
+ ESL_ALLOC(buf, sizeof(char) * (cpl+1));
+
+ for (pos = 0; pos < msa->alen; pos += cpl)
+ {
+ for (i = 0; i < msa->nseq; i++)
+ {
+ acpl = (msa->alen - pos > cpl)? cpl : msa->alen - pos;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc)
+ {
+ for (bpos = 0; bpos < acpl; bpos++)
+ {
+ sym = msa->abc->sym[msa->ax[i][pos + bpos + 1]];
+ is_residue = esl_abc_XIsResidue(msa->abc, msa->ax[i][pos+bpos+1]);
+ if (msa->rf) is_consensus = (isalnum(msa->rf[pos + bpos]) ? TRUE : FALSE);
+ else is_consensus = (esl_abc_XIsResidue(msa->abc, msa->ax[0][pos+bpos+1]) ? TRUE : FALSE);
+
+ if (is_consensus) { buf[bpos] = (is_residue ? toupper(sym) : '-'); }
+ else { buf[bpos] = (is_residue ? tolower(sym) : '-'); }
+ }
+ }
+#endif
+ if (! msa->abc)
+ {
+ for (bpos = 0; bpos < acpl; bpos++)
+ {
+ sym = msa->aseq[i][pos + bpos];
+ is_residue = isalnum(sym);
+ if (msa->rf) is_consensus = (isalnum(msa->rf[pos + bpos]) ? TRUE : FALSE);
+ else is_consensus = (isalnum(msa->aseq[0][pos+bpos]) ? TRUE : FALSE);
+
+ if (is_consensus) { buf[bpos] = (is_residue ? toupper(sym) : '-'); }
+ else { buf[bpos] = (is_residue ? tolower(sym) : '-'); }
+ }
+ }
+ buf[acpl] = '\0';
+ if (fprintf(fp, "%-*s %s\n", maxnamewidth, msa->sqname[i], buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "psiblast msa write failed");
+ } /* end loop over sequences */
+
+ if (pos + cpl < msa->alen)
+ { if (fputc('\n', fp) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "psiblast msa write failed"); }
+ }
+ free(buf);
+ return eslOK;
+
+ ERROR:
+ if (buf) free(buf);
+ return status;
+}
+/*----------- end, API for i/o of psi-blast format --------------*/
+
+
+
+/*****************************************************************
+ * 2. Unit tests.
+ *****************************************************************/
+#ifdef eslMSAFILE_PSIBLAST_TESTDRIVE
+static void
+utest_write_good1(FILE *ofp, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("MYG_PHYCA --------V-LSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRFKHLKT\n", ofp);
+ fputs("GLB5_PETMA pivdtgsvApLSAAEKTKIRSAWAPVYSTYETSGVDILVKFFTSTPAAQEFFPKFKGLTT\n", ofp);
+ fputs("HBB_HUMAN --------VhLTPEEKSAVTALWGKV--NVDEVGGEALGRLLVVYPWTQRFFESFGDLST\n", ofp);
+ fputs("HBA_HUMAN --------V-LSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHF-----\n", ofp);
+ fputs("\n", ofp);
+ fputs("MYG_PHYCA EAEMKASEDLKKHGVTVLTALGAILKKKGH---HEAELKPLAQSHATKHKIPIKYLEFIS\n", ofp);
+ fputs("GLB5_PETMA ADQLKKSADVRWHAERIINAVNDAVASMDDtekMSMKLRDLSGKHAKSFQVDPQYFKVLA\n", ofp);
+ fputs("HBB_HUMAN PDAVMGNPKVKAHGKKVLGAFSDGLAHLDN---LKGTFATLSELHCDKLHVDPENFRLLG\n", ofp);
+ fputs("HBA_HUMAN -DLSHGSAQVKGHGKKVADALTNAVAHVDD---MPNALSALSDLHAHKLRVDPVNFKLLS\n", ofp);
+ fputs("\n", ofp);
+ fputs("MYG_PHYCA EAIIHVLHSRHPGDFGADAQGAMNKALELFRKDIAAKYKELGYQG\n", ofp);
+ fputs("GLB5_PETMA AVI---------ADTVAAGDAGFEKLMSMICILLRSAY-------\n", ofp);
+ fputs("HBB_HUMAN NVLVCVLAHHFGKEFTPPVQAAYQKVVAGVANALAHKYH------\n", ofp);
+ fputs("HBA_HUMAN HCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR------\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 4;
+ *ret_alen = 165;
+}
+
+static void
+utest_write_good2(FILE *ofp, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("tRNA2 UCCGAUAUAGUGUAACGGCUAUCACAUCACGCUUUCACCGUGG-AGACCGGGGUUCGACU\n", ofp);
+ fputs("tRNA3 UCCGUGAUAGUUUAAUGGUCAGAAUGG-GCGCUUGUCGCGUGCcAGAUCGGGGUUCAAUU\n", ofp);
+ fputs("tRNA5 GGGCACAUGGCGCAGUUGGUAGCGCGCUUCCCUUGCAAGGAAGaGGUCAUCGGUUCGAUU\n", ofp);
+ fputs("tRNA1 GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGaGGUCCUGUGUUCGAUC\n", ofp);
+ fputs("tRNA4 GCUCGUAUGGCGCAGUGG-UAGCGCAGCAGAUUGCAAAUCUGUuGGUCCUUAGUUCGAUC\n", ofp);
+ fputs("\n", ofp);
+ fputs("tRNA2 CCCCGUAUCGGAG\n", ofp);
+ fputs("tRNA3 CCCCGUCGCGGAG\n", ofp);
+ fputs("tRNA5 CCGGUUGCGUCCA\n", ofp);
+ fputs("tRNA1 CACAGAAUUCGCA\n", ofp);
+ fputs("tRNA4 CUGAGUGCGAGCU\n", ofp);
+ *ret_alphatype = eslRNA;
+ *ret_nseq = 5;
+ *ret_alen = 73;
+}
+
+static void
+utest_goodfile(char *filename, int testnumber, int expected_alphatype, int expected_nseq, int expected_alen)
+{
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa1 = NULL;
+ ESL_MSA *msa2 = NULL;
+ char tmpfile1[32] = "esltmpXXXXXX";
+ char tmpfile2[32] = "esltmpXXXXXX";
+ FILE *ofp = NULL;
+ int status;
+
+ /* guessing both the format and the alphabet should work: this is a digital open */
+ /* PSIBLAST format is autodetected as SELEX, which is fine - selex parser is more general */
+ if ( (status = esl_msafile_Open(&abc, filename, NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK) esl_fatal("psiblast good file test %d failed: digital open", testnumber);
+ if (afp->format != eslMSAFILE_SELEX) esl_fatal("psiblast good file test %d failed: format autodetection", testnumber);
+ if (abc->type != expected_alphatype) esl_fatal("psiblast good file test %d failed: alphabet autodetection", testnumber);
+ afp->format = eslMSAFILE_PSIBLAST;
+
+ /* This is a digital read, using <abc>. */
+ if ( (status = esl_msafile_psiblast_Read(afp, &msa1)) != eslOK) esl_fatal("psiblast good file test %d failed: msa read, digital", testnumber);
+ if (msa1->nseq != expected_nseq || msa1->alen != expected_alen) esl_fatal("psiblast good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa1, NULL) != eslOK) esl_fatal("psiblast good file test %d failed: msa1 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (digital write) */
+ if ( (status = esl_tmpfile_named(tmpfile1, &ofp)) != eslOK) esl_fatal("psiblast good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_psiblast_Write(ofp, msa1)) != eslOK) esl_fatal("psiblast good file test %d failed: msa write, digital", testnumber);
+ fclose(ofp);
+
+ /* now open and read it as text mode, in known format. (We have to pass fmtd now, to deal with the possibility of a nonstandard name width) */
+ if ( (status = esl_msafile_Open(NULL, tmpfile1, NULL, eslMSAFILE_PSIBLAST, NULL, &afp)) != eslOK) esl_fatal("psiblast good file test %d failed: text mode open", testnumber);
+ if ( (status = esl_msafile_psiblast_Read(afp, &msa2)) != eslOK) esl_fatal("psiblast good file test %d failed: msa read, text", testnumber);
+ if (msa2->nseq != expected_nseq || msa2->alen != expected_alen) esl_fatal("psiblast good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("psiblast good file test %d failed: msa2 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (text write) */
+ if ( (status = esl_tmpfile_named(tmpfile2, &ofp)) != eslOK) esl_fatal("psiblast good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_psiblast_Write(ofp, msa2)) != eslOK) esl_fatal("psiblast good file test %d failed: msa write, text", testnumber);
+ fclose(ofp);
+ esl_msa_Destroy(msa2);
+
+ /* open and read it in digital mode */
+ if ( (status = esl_msafile_Open(&abc, tmpfile1, NULL, eslMSAFILE_PSIBLAST, NULL, &afp)) != eslOK) esl_fatal("psiblast good file test %d failed: 2nd digital mode open", testnumber);
+ if ( (status = esl_msafile_psiblast_Read(afp, &msa2)) != eslOK) esl_fatal("psiblast good file test %d failed: 2nd digital msa read", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("psiblast good file test %d failed: msa2 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* this msa <msa2> should be identical to <msa1> */
+ if (esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal("psiblast good file test %d failed: msa compare", testnumber);
+
+ remove(tmpfile1);
+ remove(tmpfile2);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_alphabet_Destroy(abc);
+}
+
+static void
+write_test_msas(FILE *ofp1, FILE *ofp2)
+{
+ fprintf(ofp1, "\n");
+ fprintf(ofp1, "seq1 --ACDEFGHIKLMNPQRSTVWY\n");
+ fprintf(ofp1, "seq2 --ACDEFGHIKLMNPQRSTV-- \n");
+ fprintf(ofp1, "seq3 aaACDEFGHIKLMNPQRSTV-- \n");
+ fprintf(ofp1, "seq4 --ACDEFGHIKLMNPQRSTVWY \n");
+ fprintf(ofp1, "\n");
+ fprintf(ofp1, "seq1 ACDEFGHIKLMNPQRSTVWY--\n");
+ fprintf(ofp1, "seq2 ACDEFGHIKLMNPQRSTVWYyy\n");
+ fprintf(ofp1, "seq3 ACDEFGHIKLMNPQRSTVWY--\n");
+ fprintf(ofp1, "seq4 ACDEFGHIKLMNPQRSTVWY--\n");
+ fprintf(ofp1, "\n");
+
+ fprintf(ofp2, "# STOCKHOLM 1.0\n");
+ fprintf(ofp2, "\n");
+ fprintf(ofp2, "#=GC RF ..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..\n");
+ fprintf(ofp2, "seq1 --ACDEFGHIKLMNPQRSTVWYACDEFGHIKLMNPQRSTVWY--\n");
+ fprintf(ofp2, "seq2 --ACDEFGHIKLMNPQRSTV--ACDEFGHIKLMNPQRSTVWYyy\n");
+ fprintf(ofp2, "seq3 aaACDEFGHIKLMNPQRSTV--ACDEFGHIKLMNPQRSTVWY--\n");
+ fprintf(ofp2, "seq4 --ACDEFGHIKLMNPQRSTVWYACDEFGHIKLMNPQRSTVWY--\n");
+ fprintf(ofp2, "//\n");
+}
+
+static void
+read_test_msas_digital(char *pbfile, char *stkfile)
+{
+ char msg[] = "PSIBLAST msa digital read unit test failed";
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ FILE *pbfp, *stkfp;
+ char pbfile2[32] = "esltmppb2XXXXXX";
+ char stkfile2[32] = "esltmpstk2XXXXXX";
+
+ if ( esl_msafile_Open(&abc, pbfile, NULL, eslMSAFILE_PSIBLAST, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( !abc || abc->type != eslAMINO) esl_fatal(msg);
+ if ( esl_msafile_Open(&abc, stkfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_psiblast_Read (afp1, &msa1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+
+ if ( esl_msafile_psiblast_Read (afp1, &msa3) != eslEOF) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa3) != eslEOF) esl_fatal(msg);
+
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ /* Now write stk to psiblast file, and vice versa; then retest */
+ if ( esl_tmpfile_named(pbfile2, &pbfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile2, &stkfp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_psiblast_Write (pbfp, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Write(stkfp, msa1, eslMSAFILE_STOCKHOLM) != eslOK) esl_fatal(msg);
+ fclose(pbfp);
+ fclose(stkfp);
+ if ( esl_msafile_Open(&abc, pbfile2, NULL, eslMSAFILE_PSIBLAST, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(&abc, stkfile2, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_psiblast_Read (afp1, &msa3) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa4) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa3, msa4) != eslOK) esl_fatal(msg);
+
+ remove(pbfile2);
+ remove(stkfile2);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+ esl_alphabet_Destroy(abc);
+}
+
+static void
+read_test_msas_text(char *pbfile, char *stkfile)
+{
+ char msg[] = "PSIBLAST msa text-mode read unit test failed";
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ FILE *pbfp, *stkfp;
+ char pbfile2[32] = "esltmppb2XXXXXX";
+ char stkfile2[32] = "esltmpstk2XXXXXX";
+
+ /* vvvv-- everything's the same as the digital utest except these NULLs */
+ if ( esl_msafile_Open(NULL, pbfile, NULL, eslMSAFILE_PSIBLAST, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(NULL, stkfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_psiblast_Read (afp1, &msa1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_psiblast_Read (afp1, &msa3) != eslEOF) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa3) != eslEOF) esl_fatal(msg);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ if ( esl_tmpfile_named(pbfile2, &pbfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile2, &stkfp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_psiblast_Write (pbfp, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Write(stkfp, msa1, eslMSAFILE_STOCKHOLM) != eslOK) esl_fatal(msg);
+ fclose(pbfp);
+ fclose(stkfp);
+ if ( esl_msafile_Open(NULL, pbfile2, NULL, eslMSAFILE_PSIBLAST, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(NULL, stkfile2, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_psiblast_Read (afp1, &msa3) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa4) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa3, msa4) != eslOK) esl_fatal(msg);
+
+ remove(pbfile2);
+ remove(stkfile2);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+}
+#endif /*eslMSAFILE_PSIBLAST_TESTDRIVE*/
+/*---------------------- end, unit tests ------------------------*/
+
+
+/*****************************************************************
+ * 3. Test driver.
+ *****************************************************************/
+#ifdef eslMSAFILE_PSIBLAST_TESTDRIVE
+/* compile: gcc -g -Wall -I. -L. -o esl_msafile_psiblast_utest -DeslMSAFILE_PSIBLAST_TESTDRIVE esl_msafile_psiblast.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_msafile_psiblast_utest -DeslMSAFILE_PSIBLAST_TESTDRIVE esl_msafile_psiblast.c -leasel -lm
+ * run: ./esl_msafile_psiblast_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_msafile.h"
+#include "esl_msafile_psiblast.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for PSIBLAST MSA format module";
+
+int
+main(int argc, char **argv)
+{
+ char msg[] = "PSI-BLAST MSA i/o module test driver failed";
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ char pbfile[32] = "esltmppbXXXXXX";
+ char stkfile[32] = "esltmpstkXXXXXX";
+ FILE *pbfp, *stkfp;
+ int testnumber;
+ int ngoodtests = 2;
+ char tmpfile[32];
+ FILE *ofp;
+ int expected_alphatype;
+ int expected_nseq;
+ int expected_alen;
+
+ if ( esl_tmpfile_named(pbfile, &pbfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile, &stkfp) != eslOK) esl_fatal(msg);
+ write_test_msas(pbfp, stkfp);
+ fclose(pbfp);
+ fclose(stkfp);
+
+ read_test_msas_digital(pbfile, stkfile);
+ read_test_msas_text (pbfile, stkfile);
+
+ /* Various "good" files that should be parsed correctly */
+ for (testnumber = 1; testnumber <= ngoodtests; testnumber++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+ switch (testnumber) {
+ case 1: utest_write_good1 (ofp, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 2: utest_write_good2 (ofp, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ }
+ fclose(ofp);
+ utest_goodfile(tmpfile, testnumber, expected_alphatype, expected_nseq, expected_alen);
+ remove(tmpfile);
+ }
+
+ remove(pbfile);
+ remove(stkfile);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslMSAFILE_PSIBLAST_TESTDRIVE*/
+/*--------------------- end, test driver ------------------------*/
+
+
+
+
+/*****************************************************************
+ * 4. Examples.
+ *****************************************************************/
+
+#ifdef eslMSAFILE_PSIBLAST_EXAMPLE
+/* A full-featured example of reading/writing an MSA in PSIBLAST format.
+ gcc -g -Wall -o esl_msafile_psiblast_example -I. -L. -DeslMSAFILE_PSIBLAST_EXAMPLE esl_msafile_psiblast.c -leasel -lm
+ ./esl_msafile_psiblast_example <msafile>
+ */
+/*::cexcerpt::msafile_psiblast_example::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_psiblast.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-1", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "override autodetection; force PSIBLAST format", 0 },
+ { "-q", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "quieter: don't write msa back, just summary", 0 },
+ { "-t", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use text mode: no digital alphabet", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is DNA", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is RNA", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is protein", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msafile>";
+static char banner[] = "example of guessing, reading, writing PSIBLAST format";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *filename = esl_opt_GetArg(go, 1);
+ int infmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if (esl_opt_GetBoolean(go, "-1")) infmt = eslMSAFILE_PSIBLAST; /* override format autodetection */
+
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+
+ /* Text mode: pass NULL for alphabet.
+ * Digital mode: pass ptr to expected ESL_ALPHABET; and if abc=NULL, alphabet is guessed
+ */
+ if (esl_opt_GetBoolean(go, "-t")) status = esl_msafile_Open(NULL, filename, NULL, infmt, NULL, &afp);
+ else status = esl_msafile_Open(&abc, filename, NULL, infmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+
+ if ((status = esl_msafile_psiblast_Read(afp, &msa)) != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+
+ printf("alphabet: %s\n", (abc ? esl_abc_DecodeType(abc->type) : "none (text mode)"));
+ printf("# of seqs: %d\n", msa->nseq);
+ printf("# of cols: %d\n", (int) msa->alen);
+ printf("\n");
+
+ if (! esl_opt_GetBoolean(go, "-q"))
+ esl_msafile_psiblast_Write(stdout, msa);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ if (abc) esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+/*::cexcerpt::msafile_psiblast_example::end::*/
+#endif /*eslMSAFILE_PSIBLAST_EXAMPLE*/
+
+
+#ifdef eslMSAFILE_PSIBLAST_EXAMPLE2
+/* A minimal example. Read PSIBLAST format MSA, in text mode.
+ gcc -g -Wall -o esl_msafile_psiblast_example2 -I. -L. -DeslMSAFILE_PSIBLAST_EXAMPLE2 esl_msafile_psiblast.c -leasel -lm
+ ./esl_msafile_psiblast_example2 <msafile>
+ */
+
+/*::cexcerpt::msafile_psiblast_example2::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_psiblast.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int fmt = eslMSAFILE_PSIBLAST;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if ( (status = esl_msafile_Open(NULL, filename, NULL, fmt, NULL, &afp)) != eslOK) esl_msafile_OpenFailure(afp, status);
+ if ( (status = esl_msafile_psiblast_Read(afp, &msa)) != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ printf("%6d seqs, %5d columns\n", msa->nseq, (int) msa->alen);
+
+ esl_msafile_psiblast_Write(stdout, msa);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ exit(0);
+}
+/*::cexcerpt::msafile_psiblast_example2::end::*/
+#endif /*eslMSAFILE_PSIBLAST_EXAMPLE2*/
+/*--------------------- end of examples -------------------------*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_psiblast.h b/esl_msafile_psiblast.h
new file mode 100644
index 0000000..d7ed17a
--- /dev/null
+++ b/esl_msafile_psiblast.h
@@ -0,0 +1,17 @@
+/* I/O of multiple sequence alignments in PSI-BLAST format
+ */
+#ifndef eslMSAFILE_PSIBLAST_INCLUDED
+#define eslMSAFILE_PSIBLAST_INCLUDED
+
+#include "esl_msa.h"
+#include "esl_msafile.h"
+
+extern int esl_msafile_psiblast_SetInmap (ESL_MSAFILE *afp);
+extern int esl_msafile_psiblast_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type);
+extern int esl_msafile_psiblast_Read (ESL_MSAFILE *afp, ESL_MSA **ret_msa);
+extern int esl_msafile_psiblast_Write (FILE *fp, const ESL_MSA *msa);
+
+#endif /* eslMSAFILE_PSIBLAST_INCLUDED */
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_selex.c b/esl_msafile_selex.c
new file mode 100644
index 0000000..1df354d
--- /dev/null
+++ b/esl_msafile_selex.c
@@ -0,0 +1,1254 @@
+/* I/O of multiple sequence alignment files in SELEX format
+ *
+ * Contents:
+ * 1. API for reading/writing SELEX input.
+ * 2. Internal functions for a block of input lines.
+ * 3. Internal functions for parsing SELEX input.
+ * 4. Unit tests.
+ * 5. Test driver.
+ * 6. Examples.
+ * 7. License and copyright.
+ *
+ * Notes:
+ * In SELEX, a tricky and unusual issue is that spaces are allowed
+ * as gaps, and can even overlap names. Alignments like this are
+ * legitimate:
+ * seq1_longname ACCCGGT
+ * seq2 AAAAACCCGGTT
+ *
+ * You can't determine the aligned length of any sequence in the
+ * block without seeing the whole block. We define an internal
+ * object (an ESL_SELEX_BLOCK) and some local functions to handle
+ * reading a block of input lines from an input buffer.
+ *
+ * Even though spaces are allowed as gaps in input files, Easel
+ * disallows them internally, even in text-mode alignments. Any
+ * spaces are mapped to '.'.
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#include "esl_mem.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_selex.h"
+
+#define eslSELEX_LINE_SQ 1
+#define eslSELEX_LINE_RF 2
+#define eslSELEX_LINE_CS 3
+#define eslSELEX_LINE_SS 4
+#define eslSELEX_LINE_SA 5
+#define eslSELEX_LINE_MM 6
+
+typedef struct {
+ char **line; /* line[0..nlines-1][0..llen-1]: memory lines in input buffer */
+ esl_pos_t *llen; /* length of line[] in bytes */
+ esl_pos_t *offsets; /* offset of start of each line in input buffer */
+ int64_t *linenum; /* line number of each line[] in input */
+ int *ltype; /* code for line type: eslSELEX_LINE_SQ, etc. */
+ esl_pos_t *lpos; /* leftmost position of seq data on line[], 0..llen-1 [or -1] */
+ esl_pos_t *rpos; /* rightmost pos of seq data on line[], 0..llen-1 [or -1] */
+ int nlines; /* number of lines in this block */
+ int nalloc; /* number of lines allocated for (>=nlines) */
+ esl_pos_t anchor; /* input buffer anchor set at the start of the block */
+} ESL_SELEX_BLOCK;
+
+static ESL_SELEX_BLOCK *selex_block_Create(int nalloc);
+static int selex_block_Grow(ESL_SELEX_BLOCK *b);
+static void selex_block_Destroy(ESL_SELEX_BLOCK *b);
+
+static int selex_ErrorInBlock(ESL_MSAFILE *afp, ESL_SELEX_BLOCK *b, int idx);
+static int selex_read_block (ESL_MSAFILE *afp, ESL_SELEX_BLOCK **block_p);
+static int selex_first_block (ESL_MSAFILE *afp, ESL_SELEX_BLOCK *b, ESL_MSA **ret_msa);
+static int selex_other_block (ESL_MSAFILE *afp, ESL_SELEX_BLOCK *b, ESL_MSA *msa);
+static int selex_append_block(ESL_MSAFILE *afp, ESL_SELEX_BLOCK *b, ESL_MSA *msa);
+
+
+/*****************************************************************
+ * 1. API for reading/writing SELEX input
+ *****************************************************************/
+
+/* Function: esl_msafile_selex_SetInmap()
+ * Synopsis: Set the input map for SELEX format
+ *
+ * Purpose: Set <afp->inmap> for selex input.
+ *
+ * In text mode, accept any <isgraph()> character, plus space.
+ * In digital mode, accept standard Easel alphabets, plus map
+ * space to gap.
+ *
+ * SELEX not only tolerates spaces in input, it
+ * allows a space as a gap character. (Which significantly
+ * complicates parsing.)
+ *
+ * The inmap may not contain any <eslDSQ_IGNORED> mappings.
+ * Annotation lines are parsed literally: every character
+ * is copied. If some characters of the aligned sequence
+ * were ignored, we'd be misaligned with the annotation.
+ * In general, because of this, it seems unlikely that any
+ * alignment format would use <eslDSQ_IGNORED> mappings.
+ */
+int
+esl_msafile_selex_SetInmap(ESL_MSAFILE *afp)
+{
+ int sym;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc)
+ {
+ for (sym = 0; sym < 128; sym++)
+ afp->inmap[sym] = afp->abc->inmap[sym];
+ afp->inmap[0] = esl_abc_XGetUnknown(afp->abc);
+ afp->inmap[' '] = esl_abc_XGetGap(afp->abc);
+ }
+#endif
+ if (! afp->abc)
+ {
+ for (sym = 1; sym < 128; sym++)
+ afp->inmap[sym] = (isgraph(sym) ? sym : eslDSQ_ILLEGAL);
+ afp->inmap[0] = '?';
+ afp->inmap[' '] = '.'; /* Easel does not allow spaces as gap characters. */
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_msafile_selex_GuessAlphabet()
+ * Synopsis: Guess the alphabet of an open PSI-BLAST MSA file.
+ *
+ * Purpose: Guess the alpbabet of the sequences in open
+ * SELEX format MSA file <afp>.
+ *
+ * On a normal return, <*ret_type> is set to <eslDNA>,
+ * <eslRNA>, or <eslAMINO>, and <afp> is reset to its
+ * original position.
+ *
+ * Args: afp - open SELEX format MSA file
+ * ret_type - RETURN: <eslDNA>, <eslRNA>, or <eslAMINO>
+ *
+ * Returns: <eslOK> on success.
+ * <eslENOALPHABET> if alphabet type can't be determined.
+ * In either case, <afp> is rewound to the position it
+ * started at.
+ */
+int
+esl_msafile_selex_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type)
+{
+ int alphatype = eslUNKNOWN;
+ esl_pos_t anchor = -1;
+ int threshold[3] = { 500, 5000, 50000 }; /* we check after 500, 5000, 50000 residues; else we go to EOF */
+ int nsteps = 3;
+ int step = 0;
+ int nres = 0;
+ int x;
+ int64_t ct[26];
+ char *p, *tok;
+ esl_pos_t n, toklen, pos;
+ int status;
+
+ for (x = 0; x < 26; x++) ct[x] = 0;
+
+ anchor = esl_buffer_GetOffset(afp->bf);
+ if ((status = esl_buffer_SetAnchor(afp->bf, anchor)) != eslOK) { status = eslEINCONCEIVABLE; goto ERROR; } /* [eslINVAL] can't happen here */
+
+ while ( (status = esl_buffer_GetLine(afp->bf, &p, &n)) == eslOK)
+ {
+ if ((status = esl_memtok(&p, &n, " \t", &tok, &toklen)) != eslOK) continue; /* blank lines */
+ if (*tok == '#') continue; /* comments and annotation */
+ /* p now points to the rest of the sequence line, after a name */
+
+ /* count characters into ct[] array */
+ for (pos = 0; pos < n; pos++)
+ if (isalpha(p[pos])) {
+ x = toupper(p[pos]) - 'A';
+ ct[x]++;
+ nres++;
+ }
+
+ /* try to stop early, checking after 500, 5000, and 50000 residues: */
+ if (step < nsteps && nres > threshold[step]) {
+ if ((status = esl_abc_GuessAlphabet(ct, &alphatype)) == eslOK) goto DONE; /* (eslENOALPHABET) */
+ step++;
+ }
+ }
+ if (status != eslEOF) goto ERROR; /* [eslEMEM,eslESYS,eslEINCONCEIVABLE] */
+ status = esl_abc_GuessAlphabet(ct, &alphatype); /* (eslENOALPHABET) */
+
+ DONE:
+ esl_buffer_SetOffset(afp->bf, anchor); /* Rewind to where we were. */
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ *ret_type = alphatype;
+ return status;
+
+ ERROR:
+ if (anchor != -1) {
+ esl_buffer_SetOffset(afp->bf, anchor);
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ }
+ *ret_type = eslUNKNOWN;
+ return status;
+}
+
+
+/* Function: esl_msafile_selex_Read()
+ * Synopsis: Read in a SELEX format alignment.
+ *
+ * Purpose: Read an MSA from an open <ESL_MSAFILE> <afp>,
+ * parsing for SELEX format, starting from the
+ * current point. (<afp->format> is expected to
+ * be <eslMSAFILE_SELEX>.) Create a new multiple
+ * alignment and return it via <*ret_msa>.
+ * Caller is responsible for free'ing this
+ * <ESL_MSA>.
+ *
+ * Args: afp - open <ESL_MSAFILE>
+ * ret_msa - RETURN: newly parsed <ESL_MSA>
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEOF> if no (more) alignment data are found in
+ * <afp>, and <afp> is returned at EOF.
+ *
+ * <eslEFORMAT> on a parse error. <*ret_msa> is set to
+ * <NULL>. <afp> contains information sufficient for
+ * constructing useful diagnostic output:
+ * | <afp->errmsg> | user-directed error message |
+ * | <afp->linenumber> | line # where error was detected |
+ * | <afp->line> | offending line (not NUL-term) |
+ * | <afp->n> | length of offending line |
+ * | <afp->bf->filename> | name of the file |
+ * and <afp> is poised at the start of the following line,
+ * so (in principle) the caller could try to resume
+ * parsing.
+ *
+ * Throws: <eslEMEM> - an allocation failed.
+ * <eslESYS> - a system call such as fread() failed
+ * <eslEINCONCEIVABLE> - "impossible" corruption
+ */
+int
+esl_msafile_selex_Read(ESL_MSAFILE *afp, ESL_MSA **ret_msa)
+{
+ ESL_MSA *msa = NULL;
+ ESL_SELEX_BLOCK *b = NULL;
+ int32_t nblocks = 0;
+ int status;
+
+ ESL_DASSERT1( (afp->format == eslMSAFILE_SELEX) );
+
+ afp->errmsg[0] = '\0';
+
+ while ( (status = selex_read_block(afp, &b)) == eslOK)
+ {
+ if (! nblocks && (status = selex_first_block(afp, b, &msa)) != eslOK) goto ERROR;
+ else if ( nblocks && (status = selex_other_block(afp, b, msa)) != eslOK) goto ERROR;
+
+ if ((status = selex_append_block(afp, b, msa)) != eslOK) goto ERROR;
+
+ esl_buffer_RaiseAnchor(afp->bf, b->anchor);
+ b->anchor = -1;
+
+ nblocks++;
+ }
+ /* selex_read_block took care of destroying the block! */
+ if (status != eslEOF || nblocks == 0) goto ERROR;
+
+ msa->offset = 0;
+ if (( status = esl_msa_SetDefaultWeights(msa)) != eslOK) goto ERROR;
+ *ret_msa = msa;
+ return eslOK;
+
+ ERROR:
+ if (b) {
+ if (b->anchor != -1) esl_buffer_RaiseAnchor(afp->bf, b->anchor);
+ selex_block_Destroy(b);
+ }
+ *ret_msa = NULL;
+ return status;
+}
+
+/* Function: esl_msafile_selex_Write()
+ * Synopsis: Write a SELEX format alignment to a stream
+ *
+ * Purpose: Write alignment <msa> to output stream <fp>,
+ * in SELEX format. The alignment is written
+ * in blocks of 60 aligned residues at a time.
+ *
+ * Args: fp - open output stream, writable
+ * msa - alignment to write
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEWRITE> on any system write error, such
+ * as a filled disk.
+ */
+int
+esl_msafile_selex_Write(FILE *fp, const ESL_MSA *msa)
+{
+ int cpl = 60;
+ int maxnamelen = 4; /* init to 4 because minimum name field is #=CS, etc. */
+ int namelen;
+ char *buf = NULL;
+ int i;
+ int64_t apos;
+ int status;
+
+ ESL_ALLOC(buf, sizeof(char) * (cpl+1));
+ buf[cpl] = '\0';
+ for (i = 0; i < msa->nseq; i++) {
+ namelen = strlen(msa->sqname[i]);
+ maxnamelen = ESL_MAX(namelen, maxnamelen);
+ }
+
+ for (apos = 0; apos < msa->alen; apos += cpl)
+ {
+ if (apos && fprintf(fp, "\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "selex msa write failed");
+ if (msa->ss_cons && fprintf(fp, "%-*s %.*s\n", maxnamelen, "#=CS", cpl, msa->ss_cons+apos) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "selex msa write failed");
+ if (msa->rf && fprintf(fp, "%-*s %.*s\n", maxnamelen, "#=RF", cpl, msa->rf+apos) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "selex msa write failed");
+ if (msa->mm && fprintf(fp, "%-*s %.*s\n", maxnamelen, "#=MM", cpl, msa->mm+apos) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "selex msa write failed");
+
+ for (i = 0; i < msa->nseq; i++)
+ {
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) esl_abc_TextizeN(msa->abc, msa->ax[i]+apos+1, cpl, buf);
+#endif
+ if (! msa->abc) strncpy(buf, msa->aseq[i]+apos, cpl);
+ if (fprintf(fp, "%-*s %s\n", maxnamelen, msa->sqname[i], buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "selex msa write failed");
+
+ if (msa->ss && msa->ss[i]) { if (fprintf(fp, "%-*s %.*s\n", maxnamelen, "#=SS", cpl, msa->ss[i]+apos) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "selex msa write failed"); }
+ if (msa->sa && msa->sa[i]) { if (fprintf(fp, "%-*s %.*s\n", maxnamelen, "#=SA", cpl, msa->sa[i]+apos) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "selex msa write failed"); }
+ }
+ }
+
+ free(buf);
+ return eslOK;
+
+ ERROR:
+ if (buf) free(buf);
+ return status;
+}
+/*--------------------- end, SELEX i/o API ----------------------*/
+
+
+
+/*****************************************************************
+ * 2. Internal functions handling a block of input lines.
+ *****************************************************************/
+
+static ESL_SELEX_BLOCK *
+selex_block_Create(int nalloc)
+{
+ ESL_SELEX_BLOCK *b = NULL;
+ int idx;
+ int status;
+
+ ESL_ALLOC(b, sizeof(ESL_SELEX_BLOCK));
+ b->line = NULL;
+ b->llen = NULL;
+ b->offsets = NULL;
+ b->linenum = NULL;
+ b->ltype = NULL;
+ b->lpos = NULL;
+ b->rpos = NULL;
+ b->nlines = 0;
+ b->anchor = -1; /* -1 is a flag for "unused" */
+
+ ESL_ALLOC(b->line, sizeof(char *) * nalloc);
+ ESL_ALLOC(b->llen, sizeof(esl_pos_t) * nalloc);
+ ESL_ALLOC(b->offsets, sizeof(esl_pos_t) * nalloc);
+ ESL_ALLOC(b->linenum, sizeof(int64_t) * nalloc);
+ ESL_ALLOC(b->ltype, sizeof(int) * nalloc);
+ ESL_ALLOC(b->lpos, sizeof(esl_pos_t) * nalloc);
+ ESL_ALLOC(b->rpos, sizeof(esl_pos_t) * nalloc);
+ for (idx = 0; idx < nalloc; idx++)
+ {
+ b->line[idx] = NULL;
+ b->llen[idx] = 0;
+ b->offsets[idx] = 0;
+ b->linenum[idx] = 0;
+ b->ltype[idx] = 0;
+ b->lpos[idx] = 0;
+ b->rpos[idx] = 0;
+ }
+ b->nalloc = nalloc;
+ return b;
+
+ ERROR:
+ if (b) selex_block_Destroy(b);
+ return NULL;
+}
+
+static int
+selex_block_Grow(ESL_SELEX_BLOCK *b)
+{
+ int idx;
+ int status;
+
+ ESL_REALLOC(b->line, sizeof(char *) * b->nalloc * 2);
+ ESL_REALLOC(b->llen, sizeof(esl_pos_t) * b->nalloc * 2);
+ ESL_REALLOC(b->offsets, sizeof(esl_pos_t) * b->nalloc * 2);
+ ESL_REALLOC(b->linenum, sizeof(int64_t) * b->nalloc * 2);
+ ESL_REALLOC(b->ltype, sizeof(int) * b->nalloc * 2);
+ ESL_REALLOC(b->lpos, sizeof(esl_pos_t) * b->nalloc * 2);
+ ESL_REALLOC(b->rpos, sizeof(esl_pos_t) * b->nalloc * 2);
+ for (idx = b->nalloc; idx < b->nalloc*2; idx++)
+ {
+ b->line[idx] = NULL;
+ b->llen[idx] = 0;
+ b->offsets[idx] = 0;
+ b->linenum[idx] = 0;
+ b->ltype[idx] = 0;
+ b->lpos[idx] = 0;
+ b->rpos[idx] = 0;
+ }
+ b->nalloc *= 2;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+static void
+selex_block_Destroy(ESL_SELEX_BLOCK *b)
+{
+ if (!b) return;
+ if (b->line) free(b->line);
+ if (b->llen) free(b->llen);
+ if (b->offsets) free(b->offsets);
+ if (b->linenum) free(b->linenum);
+ if (b->ltype) free(b->ltype);
+ if (b->lpos) free(b->lpos);
+ if (b->rpos) free(b->rpos);
+ free(b);
+ return;
+}
+/*------- end, internal functions for input line blocks ---------*/
+
+
+
+
+/*****************************************************************
+ * 3. Internal functions for parsing SELEX input.
+ *****************************************************************/
+
+/* Before we return a parse error,
+ * reset the <afp> so its current line is the one at fault.
+ */
+static int
+selex_ErrorInBlock(ESL_MSAFILE *afp, ESL_SELEX_BLOCK *b, int which)
+{
+ afp->line = b->line[which];
+ afp->n = b->llen[which];
+ afp->lineoffset = b->offsets[which];
+ afp->linenumber = b->linenum[which];
+ return esl_buffer_SetOffset(afp->bf, b->offsets[which] + b->llen[which]);
+}
+
+/* selex_read_block: read one block of alignment data.
+ *
+ * Note that line numbers aren't necessarily consecutive,
+ * because we're stripping out comment lines here. On a parse error
+ * on a specific line, we're going to reset the buffer to that line,
+ * and we'll need the linenumber to do that reset.
+ *
+ * The <afp> detected the end of the block by reading a blank line, or EOF.
+ * Thus its point is at the next line after that blank, or at EOF.
+ *
+ * The <afp> has a stable anchor set at (*block_p)->anchor.
+ * Caller must raise this anchor when it's done parsing the block.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * <eslEOF> if no more blocks are found in the input.
+ * <eslEFORMAT> on failure, if a subsequent block has a
+ * different number of data lines than the first block.
+ * On normal errors, all the references are returned set to NULL.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+static int
+selex_read_block(ESL_MSAFILE *afp, ESL_SELEX_BLOCK **block_p)
+{
+ ESL_SELEX_BLOCK *b = *block_p; /* now b==NULL if first block; or on subsequent blocks, reuse prev block storage. */
+ int idx = 0;
+ int status;
+
+ /* Advance past blank lines until we have the first line of next
+ * block. We may hit a normal EOF here, in which case we return
+ * EOF, we're done.
+ */
+ do {
+ if ( ( status = esl_msafile_GetLine(afp, NULL, NULL)) != eslOK) goto ERROR; /* EOF here is a normal EOF */
+ } while (esl_memspn(afp->line, afp->n, " \t") == afp->n || /* idiomatic for "blank line" */
+ (esl_memstrpfx(afp->line, afp->n, "#") && ! esl_memstrpfx(afp->line, afp->n, "#="))); /* a SELEX comment line */
+
+ /* if this is first block, allocate block; subsequent blocks reuse it */
+ if (!b && (b = selex_block_Create(16)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ /* Anchor stably at this point. */
+ b->anchor = afp->lineoffset;
+ if ((status = esl_buffer_SetStableAnchor(afp->bf, b->anchor)) != eslOK) goto ERROR;
+
+ /* Parse for a block of lines. */
+ do {
+ if (b->nalloc && idx == b->nalloc && (status = selex_block_Grow(b)) != eslOK) goto ERROR;
+
+ b->line[idx] = afp->line;
+ b->llen[idx] = afp->n;
+ b->offsets[idx] = afp->lineoffset;
+ b->linenum[idx] = afp->linenumber; /* ltype, lpos, rpos aren't set yet */
+ idx++;
+
+ /* Get next non-comment line; this can be next line of block, blank (end of block), or EOF. */
+ do {
+ status = esl_msafile_GetLine(afp, NULL, NULL);
+ } while ( status == eslOK && (esl_memstrpfx(afp->line, afp->n, "#") && ! esl_memstrpfx(afp->line, afp->n, "#=")));
+
+ } while (status == eslOK && esl_memspn(afp->line, afp->n, " \t") < afp->n); /* end of block on EOF or blank line */
+
+ if (*block_p && b->nlines != idx)
+ ESL_XFAIL(eslEFORMAT, afp->errmsg, "expected %d lines in block, saw %d", b->nlines, idx);
+
+ b->nlines = idx;
+ *block_p = b;
+ return eslOK; /* EOF status gets turned into OK: we've read a block successfully and hit EOF. Next call will generate the EOF */
+
+ ERROR:
+ if (b && b->anchor != -1) esl_buffer_RaiseAnchor(afp->bf, b->anchor);
+ if (b) selex_block_Destroy(b);
+ *block_p = NULL;
+ return status;
+}
+
+
+/* selex_first_block()
+ *
+ * 1. Determine and store line types, in b->ltype[0..b->nlines-1].
+ * 2. From the number of eslSELEX_LINE_SQ lines, we know nseq.
+ * 3. From nseq, we can allocate a new MSA.
+ * 4. Parse each line for sequence names, and store them.
+ * 5. Determine lpos[] for each line.
+ */
+static int
+selex_first_block(ESL_MSAFILE *afp, ESL_SELEX_BLOCK *b, ESL_MSA **ret_msa)
+{
+ ESL_MSA *msa = NULL;
+ int nrf, nmm, ncs, nss, nsa, nseq;
+ int has_ss, has_sa;
+ char *p, *tok;
+ esl_pos_t n, ntok;
+ int idx, seqi;
+ int status;
+
+ afp->errmsg[0] = '\0';
+
+ nrf = nmm = ncs = nss = nsa = nseq = 0;
+ has_ss = has_sa = FALSE;
+ for (idx = 0; idx < b->nlines; idx++)
+ {
+ if (esl_memstrpfx(b->line[idx], b->llen[idx], "#=RF")) { b->ltype[idx] = eslSELEX_LINE_RF; nrf++; }
+ else if (esl_memstrpfx(b->line[idx], b->llen[idx], "#=MM")) { b->ltype[idx] = eslSELEX_LINE_MM; nmm++; }
+ else if (esl_memstrpfx(b->line[idx], b->llen[idx], "#=CS")) { b->ltype[idx] = eslSELEX_LINE_CS; ncs++; }
+ else if (esl_memstrpfx(b->line[idx], b->llen[idx], "#=SS")) { b->ltype[idx] = eslSELEX_LINE_SS; nss++; has_ss = TRUE; }
+ else if (esl_memstrpfx(b->line[idx], b->llen[idx], "#=SA")) { b->ltype[idx] = eslSELEX_LINE_SA; nsa++; has_sa = TRUE; }
+ else { b->ltype[idx] = eslSELEX_LINE_SQ; nseq++; nss = nsa = 0; }
+
+ if (nss && !nseq) { selex_ErrorInBlock(afp, b, idx); ESL_XFAIL(eslEFORMAT, afp->errmsg, "#=SS must follow a sequence"); }
+ if (nsa && !nseq) { selex_ErrorInBlock(afp, b, idx); ESL_XFAIL(eslEFORMAT, afp->errmsg, "#=SA must follow a sequence"); }
+ if (nrf > 1) { selex_ErrorInBlock(afp, b, idx); ESL_XFAIL(eslEFORMAT, afp->errmsg, "Too many #=RF lines for block"); }
+ if (ncs > 1) { selex_ErrorInBlock(afp, b, idx); ESL_XFAIL(eslEFORMAT, afp->errmsg, "Too many #=CS lines for block"); }
+ if (nss > 1) { selex_ErrorInBlock(afp, b, idx); ESL_XFAIL(eslEFORMAT, afp->errmsg, "Too many #=SS lines for seq"); }
+ if (nsa > 1) { selex_ErrorInBlock(afp, b, idx); ESL_XFAIL(eslEFORMAT, afp->errmsg, "Too many #=SA lines for seq"); }
+ }
+
+#ifdef eslAUGMENT_ALPHABET
+ if ( afp->abc && (msa = esl_msa_CreateDigital(afp->abc, nseq, -1)) == NULL) { status = eslEMEM; goto ERROR; } /* a growable MSA */
+#endif
+ if (!afp->abc && (msa = esl_msa_Create( nseq, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+ if (has_ss) {
+ ESL_ALLOC(msa->ss, sizeof(char *) * nseq);
+ for (seqi = 0; seqi < nseq; seqi++) msa->ss[seqi] = NULL;
+ }
+ if (has_sa) {
+ ESL_ALLOC(msa->sa, sizeof(char *) * nseq);
+ for (seqi = 0; seqi < nseq; seqi++) msa->sa[seqi] = NULL;
+ }
+ msa->nseq = nseq;
+ msa->alen = 0;
+
+ for (seqi = 0, idx = 0; idx < b->nlines; idx++)
+ {
+ p = b->line[idx];
+ n = b->llen[idx];
+ if ( esl_memtok(&p, &n, " \t", &tok, &ntok) != eslOK) ESL_XEXCEPTION(eslEINCONCEIVABLE, "can't happen"); /* because a block by definition consists of non-blank lines */
+ if (b->ltype[idx] == eslSELEX_LINE_SQ) /* otherwise, first token is #=XX marking annotation of some sort */
+ {
+ if ((status = esl_msa_SetSeqName(msa, seqi, tok, ntok)) != eslOK) goto ERROR;
+ seqi++;
+ }
+ b->lpos[idx] = (n ? p-b->line[idx] : -1); /* set lpos[] to position of first seq or annotation residue */
+ }
+
+ *ret_msa = msa;
+ return eslOK;
+
+ ERROR:
+ if (msa) esl_msa_Destroy(msa);
+ *ret_msa = NULL;
+ return status;
+}
+
+
+/* selex_other_block()
+ * We've already parsed the first block.
+ * So we know the order of line types, nseq, and sequence names.
+ * Validate that a subsequent block has the same.
+ */
+static int
+selex_other_block(ESL_MSAFILE *afp, ESL_SELEX_BLOCK *b, ESL_MSA *msa)
+{
+ char *p, *tok;
+ esl_pos_t n, ntok;
+ int idx, seqi;
+
+ /* Validate line types */
+ for (idx = 0; idx < b->nlines; idx++)
+ {
+ if (esl_memstrpfx(b->line[idx], b->llen[idx], "#=RF")) { if (b->ltype[idx] != eslSELEX_LINE_RF) { selex_ErrorInBlock(afp, b, idx); ESL_FAIL(eslEFORMAT, afp->errmsg, "#=RF line isn't in expected order in block"); } }
+ else if (esl_memstrpfx(b->line[idx], b->llen[idx], "#=MM")) { if (b->ltype[idx] != eslSELEX_LINE_MM) { selex_ErrorInBlock(afp, b, idx); ESL_FAIL(eslEFORMAT, afp->errmsg, "#=MM line isn't in expected order in block"); } }
+ else if (esl_memstrpfx(b->line[idx], b->llen[idx], "#=CS")) { if (b->ltype[idx] != eslSELEX_LINE_CS) { selex_ErrorInBlock(afp, b, idx); ESL_FAIL(eslEFORMAT, afp->errmsg, "#=CS line isn't in expected order in block"); } }
+ else if (esl_memstrpfx(b->line[idx], b->llen[idx], "#=SS")) { if (b->ltype[idx] != eslSELEX_LINE_SS) { selex_ErrorInBlock(afp, b, idx); ESL_FAIL(eslEFORMAT, afp->errmsg, "#=SS line isn't in expected order in block"); } }
+ else if (esl_memstrpfx(b->line[idx], b->llen[idx], "#=SA")) { if (b->ltype[idx] != eslSELEX_LINE_SA) { selex_ErrorInBlock(afp, b, idx); ESL_FAIL(eslEFORMAT, afp->errmsg, "#=SA line isn't in expected order in block"); } }
+ else { if (b->ltype[idx] != eslSELEX_LINE_SQ) { selex_ErrorInBlock(afp, b, idx); ESL_FAIL(eslEFORMAT, afp->errmsg, "sequence line isn't in expected order in block"); } }
+ }
+
+ /* Validate seq names, and set lpos */
+ for (seqi = 0, idx = 0; idx < b->nlines; idx++)
+ {
+ p = b->line[idx];
+ n = b->llen[idx];
+ if ( esl_memtok(&p, &n, " \t", &tok, &ntok) != eslOK) ESL_EXCEPTION(eslEINCONCEIVABLE, "can't happen"); /* because a block by definition consists of non-blank lines */
+ if (b->ltype[idx] == eslSELEX_LINE_SQ)
+ {
+ if (! esl_memstrcmp(tok, ntok, msa->sqname[seqi])) { selex_ErrorInBlock(afp, b, idx); ESL_FAIL(eslEFORMAT, afp->errmsg, "expected sequence %s at this line of block", msa->sqname[seqi]); }
+ seqi++;
+ }
+ b->lpos[idx] = (n ? p-b->line[idx] : -1); /* set lpos[] to position of first seq or annotation residue */
+ }
+ return eslOK;
+}
+
+static int
+selex_append_block(ESL_MSAFILE *afp, ESL_SELEX_BLOCK *b, ESL_MSA *msa)
+{
+ char *p;
+ esl_pos_t pos;
+ int idx, seqi;
+ esl_pos_t leftmost, rightmost;
+ int64_t nadd; /* width of this sequence block, in aligned columns added to msa */
+ esl_pos_t nleft, ntext;
+ int64_t alen;
+ int status;
+
+ /* Determine rpos for each line. */
+ for (idx = 0; idx < b->nlines; idx++)
+ {
+ p = b->line[idx];
+ pos = b->llen[idx] - 1;
+ while (pos>=0 && isspace(p[pos])) pos--;
+ b->rpos[idx] = ( (pos < b->lpos[idx]) ? -1 : pos); /* -1: a completely blank seq line is valid */
+ }
+
+ /* Determine leftmost and rightmost positions for entire block */
+ leftmost = b->lpos[0];
+ rightmost = b->rpos[0];
+ for (idx = 1; idx < b->nlines; idx++) {
+ leftmost = (b->lpos[idx] == -1) ? leftmost : ESL_MIN(leftmost, b->lpos[idx]);
+ rightmost = (b->rpos[idx] == -1) ? rightmost : ESL_MAX(rightmost, b->rpos[idx]);
+ }
+ if (rightmost == -1) return eslOK; /* super special case: no sequence or annotation data in this block at all! */
+ nadd = rightmost - leftmost + 1;
+
+ /* Appends */
+ for (seqi = 0, idx = 0; idx < b->nlines; idx++)
+ {
+ nleft = ((b->lpos[idx] != -1) ? b->lpos[idx] - leftmost : nadd); /* watch special case of all whitespace on data line, lpos>rpos */
+ ntext = ((b->lpos[idx] != -1) ? b->rpos[idx] - b->lpos[idx] + 1 : 0);
+ //nright = ((b->lpos[idx] != -1) ? rightmost - b->rpos[idx] : 0); // someday you might want to know nright, but for now the code doesn't use it
+
+ if (b->ltype[idx] == eslSELEX_LINE_SQ)
+ {
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc)
+ { /* digital sequence append - mapped, preallocated */
+ ESL_REALLOC(msa->ax[seqi], sizeof(ESL_DSQ) * (msa->alen + nadd + 2));
+ if (msa->alen == 0) msa->ax[seqi][0] = eslDSQ_SENTINEL;
+ for (alen = msa->alen; alen < msa->alen+nleft; alen++) msa->ax[seqi][alen+1] = esl_abc_XGetGap(msa->abc);
+
+ status = esl_abc_dsqcat_noalloc(afp->inmap, msa->ax[seqi], &alen, b->line[idx] + b->lpos[idx], ntext);
+ if (status == eslEINVAL) { selex_ErrorInBlock(afp, b, idx); ESL_FAIL(eslEFORMAT, afp->errmsg, "illegal residue(s) in sequence line"); }
+ else if (status != eslOK) { selex_ErrorInBlock(afp, b, idx); goto ERROR; }
+ if (alen != msa->alen + nleft + ntext) { selex_ErrorInBlock(afp, b, idx); ESL_EXCEPTION(eslEINCONCEIVABLE, afp->errmsg, "unexpected inconsistency appending a sequence"); };
+
+ for (; alen < msa->alen+nadd; alen++) msa->ax[seqi][alen+1] = esl_abc_XGetGap(msa->abc);
+ msa->ax[seqi][alen+1] = eslDSQ_SENTINEL;
+ }
+#endif
+ if (! msa->abc)
+ { /* text mode sequence append - mapped, preallocated */
+ ESL_REALLOC(msa->aseq[seqi], sizeof(char) * (msa->alen + nadd + 1));
+ for (alen = msa->alen; alen < msa->alen+nleft; alen++) msa->aseq[seqi][alen] = '.';
+
+ status = esl_strmapcat_noalloc(afp->inmap, msa->aseq[seqi], &alen, b->line[idx] + b->lpos[idx], ntext);
+ if (status == eslEINVAL) { selex_ErrorInBlock(afp, b, idx); ESL_FAIL(eslEFORMAT, afp->errmsg, "illegal residue(s) in input line"); }
+ else if (status != eslOK) { selex_ErrorInBlock(afp, b, idx); goto ERROR; }
+ if (alen != msa->alen + nleft + ntext) { selex_ErrorInBlock(afp, b, idx); ESL_EXCEPTION(eslEINCONCEIVABLE, afp->errmsg, "unexpected inconsistency appending a sequence"); };
+
+ for (; alen < msa->alen+nadd; alen++) msa->aseq[seqi][alen] = '.';
+ msa->aseq[seqi][alen] = '\0';
+ }
+ seqi++;
+ }
+ else
+ { /* annotation append: not mapped, characters are copied exactly as they are */
+ if (b->ltype[idx] == eslSELEX_LINE_RF) { ESL_REALLOC(msa->rf, sizeof(char) * (msa->alen + nadd + 1)); p = msa->rf; }
+ if (b->ltype[idx] == eslSELEX_LINE_MM) { ESL_REALLOC(msa->mm, sizeof(char) * (msa->alen + nadd + 1)); p = msa->mm; }
+ else if (b->ltype[idx] == eslSELEX_LINE_CS) { ESL_REALLOC(msa->ss_cons, sizeof(char) * (msa->alen + nadd + 1)); p = msa->ss_cons; }
+ else if (b->ltype[idx] == eslSELEX_LINE_SS) { ESL_REALLOC(msa->ss[seqi-1], sizeof(char) * (msa->alen + nadd + 1)); p = msa->ss[seqi-1]; }
+ else if (b->ltype[idx] == eslSELEX_LINE_SA) { ESL_REALLOC(msa->sa[seqi-1], sizeof(char) * (msa->alen + nadd + 1)); p = msa->sa[seqi-1]; }
+
+ for (alen = msa->alen; alen < msa->alen+nleft; alen++) p[alen] = '.';
+ if (ntext) memcpy(p+msa->alen+nleft, b->line[idx]+b->lpos[idx], sizeof(char)*ntext);
+ for (alen = msa->alen+nleft+ntext; alen < msa->alen+nadd; alen++) p[alen] = '.';
+ p[alen] = '\0';
+ }
+ }
+ msa->alen += nadd;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/*****************************************************************
+ * 4. Unit tests.
+ *****************************************************************/
+#ifdef eslMSAFILE_SELEX_TESTDRIVE
+
+static void
+utest_write_good1(FILE *ofp, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq3 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq4 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq5 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 5;
+ *ret_alen = 20;
+}
+
+static void
+utest_write_good2(FILE *ofp, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("# DOS format (\\r\\n), and doesn't end in a newline.\r\n", ofp);
+ fputs("# \r\n", ofp);
+ fputs("#=RF xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=CS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\r\n", ofp);
+ fputs("#=SS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=SA xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\r\n", ofp);
+ fputs("#=SS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=SA xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("seq3 ACDEFGHIKLMNPQRSTVWY\r\n", ofp);
+ fputs("#=SS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=SA xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("seq4 ACDEFGHIKLMNPQRSTVWY\r\n", ofp);
+ fputs("#=SS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=SA xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("seq5 ACDEFGHIKLMNPQRSTVWY\r\n", ofp);
+ fputs("#=SS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=SA xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("\r\n", ofp);
+ fputs("#=RF xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=CS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\r\n", ofp);
+ fputs("#=SS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=SA xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\r\n", ofp);
+ fputs("#=SS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=SA xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("seq3 ACDEFGHIKLMNPQRSTVWY\r\n", ofp);
+ fputs("#=SS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=SA xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("seq4 ACDEFGHIKLMNPQRSTVWY\r\n", ofp);
+ fputs("#=SS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=SA xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("seq5 ACDEFGHIKLMNPQRSTVWY\r\n", ofp);
+ fputs("#=SS xxxxxxxxxxxxxxxxxxxx\r\n", ofp);
+ fputs("#=SA xxxxxxxxxxxxxxxxxxxx", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 5;
+ *ret_alen = 40;
+}
+
+static void
+utest_write_good3(FILE *ofp, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("\n", ofp);
+ fputs("#=CS\n", ofp);
+ fputs("#=RF\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("long_name GHIKLMNPQRSTVWY\n", ofp);
+ fputs("blank_seq_all_gaps \n", ofp);
+ fputs("seq2 ACDEF---KLMNPQRSTVWY\n", ofp);
+ fputs("seq3 ACDEF...KLMNPQRSTVWY\n", ofp);
+ fputs("# embedded comments ok\n", ofp);
+ fputs("seq4 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs(" seq5 CDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=SS \n", ofp);
+ fputs("#=SA\n", ofp);
+ fputs("\n", ofp);
+ fputs("\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=CS\n", ofp);
+ fputs("#=RF\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("long_name GHIKLMNPQRSTVWY\n", ofp);
+ fputs("blank_seq_all_gaps \n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq3 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq4 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq5 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=SS \n", ofp);
+ fputs("#=SA\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 7;
+ *ret_alen = 52;
+}
+
+static void
+utest_write_good4(FILE *ofp, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("# A complicated SELEX example\n", ofp);
+ fputs("\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=RF xxxxxxx xxxx xxxxxx\n", ofp);
+ fputs("#=CS >>>>+>> ^^^^ <<<<<<\n", ofp);
+ fputs("28 gGAGUAAGAUAGC AUCA GCAUCUUGUUCC\n", ofp);
+ fputs("#=SS +++++>>>>>+>> ^^^^ <<<<<<<+++++\n", ofp);
+ fputs("longname GUUCACC AUCA GGGGAc\n", ofp);
+ fputs("#=SS >>>>+>> ^^^^ <<<<<<\n", ofp);
+ fputs("2 AUGGAUGCGCACC AUCA GGGCGUaucuau\n", ofp);
+ fputs("3 GAUCACC AUCA GGGauc\n", ofp);
+ fputs("4 GGUCACC AUCA GGGauc\n", ofp);
+ fputs("5 GGACACC AUCA GGGucu\n", ofp);
+ fputs("6 CACC AUCA GGG\n", ofp);
+ fputs("7 GAUCACC AUCA GGGauc\n", ofp);
+ fputs("8 CUCACC AUCA GGGGG\n", ofp);
+ fputs("9 AUGCACC AUCA GGGCAU\n", ofp);
+ fputs("10 CUCACC AUCA GGGGG\n", ofp);
+
+ *ret_alphatype = eslRNA;
+ *ret_nseq = 11;
+ *ret_alen = 31;
+}
+
+static void
+utest_goodfile(char *filename, int testnumber, int expected_alphatype, int expected_nseq, int expected_alen)
+{
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa1 = NULL;
+ ESL_MSA *msa2 = NULL;
+ char tmpfile1[32] = "esltmpXXXXXX";
+ char tmpfile2[32] = "esltmpXXXXXX";
+ FILE *ofp = NULL;
+ int status;
+
+ /* guessing both the format and the alphabet should work: this is a digital open */
+ if ( (status = esl_msafile_Open(&abc, filename, NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK) esl_fatal("selex good file test %d failed: digital open", testnumber);
+ if (afp->format != eslMSAFILE_SELEX) esl_fatal("selex good file test %d failed: format autodetection", testnumber);
+ if (abc->type != expected_alphatype) esl_fatal("selex good file test %d failed: alphabet autodetection", testnumber);
+
+ /* This is a digital read, using <abc>. */
+ if ( (status = esl_msafile_selex_Read(afp, &msa1)) != eslOK) esl_fatal("selex good file test %d failed: msa read, digital", testnumber);
+ if (msa1->nseq != expected_nseq || msa1->alen != expected_alen) esl_fatal("selex good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa1, NULL) != eslOK) esl_fatal("selex good file test %d failed: msa1 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (digital write) */
+ if ( (status = esl_tmpfile_named(tmpfile1, &ofp)) != eslOK) esl_fatal("selex good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_selex_Write(ofp, msa1)) != eslOK) esl_fatal("selex good file test %d failed: msa write, digital", testnumber);
+ fclose(ofp);
+
+ /* now open and read it as text mode, in known format. (We have to pass fmtd now, to deal with the possibility of a nonstandard name width) */
+ if ( (status = esl_msafile_Open(NULL, tmpfile1, NULL, eslMSAFILE_SELEX, NULL, &afp)) != eslOK) esl_fatal("selex good file test %d failed: text mode open", testnumber);
+ if ( (status = esl_msafile_selex_Read(afp, &msa2)) != eslOK) esl_fatal("selex good file test %d failed: msa read, text", testnumber);
+ if (msa2->nseq != expected_nseq || msa2->alen != expected_alen) esl_fatal("selex good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("selex good file test %d failed: msa2 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (text write) */
+ if ( (status = esl_tmpfile_named(tmpfile2, &ofp)) != eslOK) esl_fatal("selex good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_selex_Write(ofp, msa2)) != eslOK) esl_fatal("selex good file test %d failed: msa write, text", testnumber);
+ fclose(ofp);
+ esl_msa_Destroy(msa2);
+
+ /* open and read it in digital mode */
+ if ( (status = esl_msafile_Open(&abc, tmpfile1, NULL, eslMSAFILE_SELEX, NULL, &afp)) != eslOK) esl_fatal("selex good file test %d failed: 2nd digital mode open", testnumber);
+ if ( (status = esl_msafile_selex_Read(afp, &msa2)) != eslOK) esl_fatal("selex good file test %d failed: 2nd digital msa read", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("selex good file test %d failed: msa2 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* this msa <msa2> should be identical to <msa1> */
+ if (esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal("selex good file test %d failed: msa compare", testnumber);
+
+ remove(tmpfile1);
+ remove(tmpfile2);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_alphabet_Destroy(abc);
+}
+
+
+static void
+write_test_msas(FILE *ofp1, FILE *ofp2)
+{
+ fprintf(ofp1, "# selex comments ignored \n");
+ fprintf(ofp1, "#=RF ..xxxxxxxxxxxxxxxxxxxx\n");
+ fprintf(ofp1, "seq1 ..acdefghiklmnpqrstvwy\n");
+ fprintf(ofp1, "seq2 ..acdefghiklmnpqrstv--\n");
+ fprintf(ofp1, "seq3 aaacdefghiklmnpqrstv--\n");
+ fprintf(ofp1, "# selex comments ignored \n");
+ fprintf(ofp1, "seq4 ..acdefghiklmnpqrstvwy\n");
+ fprintf(ofp1, "\n");
+ fprintf(ofp1, "#=RF xxxxxxxxxxxxxxxxxxxx..\n");
+ fprintf(ofp1, "seq1 ACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp1, "seq2 ACDEFGHIKLMNPQRSTVWYYY\n");
+ fprintf(ofp1, "seq3 ACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp1, "seq4 ACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp1, "\n");
+
+ fprintf(ofp2, "# STOCKHOLM 1.0\n");
+ fprintf(ofp2, "\n");
+ fprintf(ofp2, "#=GC RF ..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..\n");
+ fprintf(ofp2, "seq1 ..acdefghiklmnpqrstvwyACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "seq2 ..acdefghiklmnpqrstv--ACDEFGHIKLMNPQRSTVWYYY\n");
+ fprintf(ofp2, "seq3 aaacdefghiklmnpqrstv--ACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "seq4 ..acdefghiklmnpqrstvwyACDEFGHIKLMNPQRSTVWY..\n");
+ fprintf(ofp2, "//\n");
+}
+
+static void
+read_test_msas_digital(char *slxfile, char *stkfile)
+{
+ char msg[] = "SELEX msa digital read unit test failed";
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ FILE *slxfp, *stkfp;
+ char slxfile2[32] = "esltmpslx2XXXXXX";
+ char stkfile2[32] = "esltmpstk2XXXXXX";
+
+ if ( esl_msafile_Open(&abc, slxfile, NULL, eslMSAFILE_SELEX, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( !abc || abc->type != eslAMINO) esl_fatal(msg);
+ if ( esl_msafile_Open(&abc, stkfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_selex_Read (afp1, &msa1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+
+ if ( esl_msafile_selex_Read (afp1, &msa3) != eslEOF) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa3) != eslEOF) esl_fatal(msg);
+
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ /* Now write stk to selex file, and vice versa; then retest */
+ if ( esl_tmpfile_named(slxfile2, &slxfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile2, &stkfp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_selex_Write (slxfp, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Write(stkfp, msa1, eslMSAFILE_STOCKHOLM) != eslOK) esl_fatal(msg);
+ fclose(slxfp);
+ fclose(stkfp);
+ if ( esl_msafile_Open(&abc, slxfile2, NULL, eslMSAFILE_SELEX, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(&abc, stkfile2, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_selex_Read (afp1, &msa3) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa4) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa3, msa4) != eslOK) esl_fatal(msg);
+
+ remove(slxfile2);
+ remove(stkfile2);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+ esl_alphabet_Destroy(abc);
+}
+
+static void
+read_test_msas_text(char *slxfile, char *stkfile)
+{
+ char msg[] = "SELEX msa text-mode read unit test failed";
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1, *msa2, *msa3, *msa4;
+ FILE *slxfp, *stkfp;
+ char slxfile2[32] = "esltmpslx2XXXXXX";
+ char stkfile2[32] = "esltmpstk2XXXXXX";
+
+ /* vvvv-- everything's the same as the digital utest except these NULLs */
+ if ( esl_msafile_Open(NULL, slxfile, NULL, eslMSAFILE_SELEX, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(NULL, stkfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_selex_Read (afp1, &msa1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_selex_Read (afp1, &msa3) != eslEOF) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa3) != eslEOF) esl_fatal(msg);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ if ( esl_tmpfile_named(slxfile2, &slxfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile2, &stkfp) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_selex_Write (slxfp, msa2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Write(stkfp, msa1, eslMSAFILE_STOCKHOLM) != eslOK) esl_fatal(msg);
+ fclose(slxfp);
+ fclose(stkfp);
+ if ( esl_msafile_Open(NULL, slxfile2, NULL, eslMSAFILE_SELEX, NULL, &afp1) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_Open(NULL, stkfile2, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_selex_Read (afp1, &msa3) != eslOK) esl_fatal(msg);
+ if ( esl_msafile_stockholm_Read(afp2, &msa4) != eslOK) esl_fatal(msg);
+ if ( esl_msa_Compare(msa3, msa4) != eslOK) esl_fatal(msg);
+
+ remove(slxfile2);
+ remove(stkfile2);
+ esl_msafile_Close(afp2);
+ esl_msafile_Close(afp1);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+}
+#endif /*eslMSAFILE_SELEX_TESTDRIVE*/
+/*---------------------- end, unit tests ------------------------*/
+
+
+/*****************************************************************
+ * 5. Test driver.
+ *****************************************************************/
+#ifdef eslMSAFILE_SELEX_TESTDRIVE
+/* compile: gcc -g -Wall -I. -L. -o esl_msafile_selex_utest -DeslMSAFILE_SELEX_TESTDRIVE esl_msafile_selex.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_msafile_selex_utest -DeslMSAFILE_SELEX_TESTDRIVE esl_msafile_selex.c -leasel -lm
+ * run: ./esl_msafile_selex_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_msafile.h"
+#include "esl_msafile_selex.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for SELEX MSA format module";
+
+int
+main(int argc, char **argv)
+{
+ char msg[] = "PSI-BLAST MSA i/o module test driver failed";
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ char slxfile[32] = "esltmpslxXXXXXX";
+ char stkfile[32] = "esltmpstkXXXXXX";
+ FILE *slxfp, *stkfp;
+ int testnumber;
+ int ngoodtests = 4;
+ char tmpfile[32];
+ FILE *ofp;
+ int expected_alphatype;
+ int expected_nseq;
+ int expected_alen;
+
+ if ( esl_tmpfile_named(slxfile, &slxfp) != eslOK) esl_fatal(msg);
+ if ( esl_tmpfile_named(stkfile, &stkfp) != eslOK) esl_fatal(msg);
+ write_test_msas(slxfp, stkfp);
+ fclose(slxfp);
+ fclose(stkfp);
+
+ read_test_msas_digital(slxfile, stkfile);
+ read_test_msas_text (slxfile, stkfile);
+
+ /* Various "good" files that should be parsed correctly */
+ for (testnumber = 1; testnumber <= ngoodtests; testnumber++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+ switch (testnumber) {
+ case 1: utest_write_good1 (ofp, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 2: utest_write_good2 (ofp, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 3: utest_write_good3 (ofp, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ case 4: utest_write_good4 (ofp, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ }
+ fclose(ofp);
+ utest_goodfile(tmpfile, testnumber, expected_alphatype, expected_nseq, expected_alen);
+ remove(tmpfile);
+ }
+
+
+ remove(slxfile);
+ remove(stkfile);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslMSAFILE_SELEX_TESTDRIVE*/
+/*--------------------- end, test driver ------------------------*/
+
+
+
+
+/*****************************************************************
+ * 6. Examples.
+ *****************************************************************/
+
+#ifdef eslMSAFILE_SELEX_EXAMPLE
+/* A full-featured example of reading/writing an MSA in SELEX format(s).
+ gcc -g -Wall -o esl_msafile_selex_example -I. -L. -DeslMSAFILE_SELEX_EXAMPLE esl_msafile_selex.c -leasel -lm
+ ./esl_msafile_selex_example <msafile>
+ */
+/*::cexcerpt::msafile_selex_example::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_selex.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-1", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "no autodetection; force SELEX format", 0 },
+ { "-q", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "quieter: don't write msa back, just summary", 0 },
+ { "-t", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use text mode: no digital alphabet", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is DNA", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is RNA", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is protein", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msafile>";
+static char banner[] = "example of guessing, reading, writing SELEX format";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *filename = esl_opt_GetArg(go, 1);
+ int infmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if (esl_opt_GetBoolean(go, "-1")) infmt = eslMSAFILE_SELEX;
+
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+
+ /* Text mode: pass NULL for alphabet.
+ * Digital mode: pass ptr to expected ESL_ALPHABET; and if abc=NULL, alphabet is guessed
+ */
+ if (esl_opt_GetBoolean(go, "-t")) status = esl_msafile_Open(NULL, filename, NULL, infmt, NULL, &afp);
+ else status = esl_msafile_Open(&abc, filename, NULL, infmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+
+ if ( (status = esl_msafile_selex_Read(afp, &msa)) != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+
+ printf("alphabet: %s\n", (abc ? esl_abc_DecodeType(abc->type) : "none (text mode)"));
+ printf("# of seqs: %d\n", msa->nseq);
+ printf("# of cols: %d\n", (int) msa->alen);
+ printf("\n");
+
+ if (! esl_opt_GetBoolean(go, "-q"))
+ esl_msafile_selex_Write(stdout, msa);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ if (abc) esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+/*::cexcerpt::msafile_selex_example::end::*/
+#endif /*eslMSAFILE_SELEX_EXAMPLE*/
+
+#ifdef eslMSAFILE_SELEX_EXAMPLE2
+/* A minimal example. Read SELEX MSA, in text mode.
+ gcc -g -Wall -o esl_msafile_selex_example2 -I. -L. -DeslMSAFILE_SELEX_EXAMPLE2 esl_msafile_selex.c -leasel -lm
+ ./esl_msafile_selex_example2 <msafile>
+ */
+
+/*::cexcerpt::msafile_selex_example2::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_selex.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int fmt = eslMSAFILE_SELEX;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if ( (status = esl_msafile_Open(NULL, filename, NULL, fmt, NULL, &afp)) != eslOK) esl_msafile_OpenFailure(afp, status);
+ if ( (status = esl_msafile_selex_Read(afp, &msa)) != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ printf("%6d seqs, %5d columns\n", msa->nseq, (int) msa->alen);
+
+ esl_msafile_selex_Write(stdout, msa);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+ exit(0);
+}
+/*::cexcerpt::msafile_selex_example2::end::*/
+#endif /*eslMSAFILE_SELEX_EXAMPLE2*/
+/*--------------------- end of example --------------------------*/
+
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_selex.h b/esl_msafile_selex.h
new file mode 100644
index 0000000..419fe49
--- /dev/null
+++ b/esl_msafile_selex.h
@@ -0,0 +1,18 @@
+/* i/o of multiple sequence alignment files in SELEX format
+ */
+#ifndef eslMSAFILE_SELEX_INCLUDED
+#define eslMSAFILE_SELEX_INCLUDED
+
+#include "esl_msa.h"
+#include "esl_msafile.h"
+
+extern int esl_msafile_selex_SetInmap (ESL_MSAFILE *afp);
+extern int esl_msafile_selex_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type);
+extern int esl_msafile_selex_Read (ESL_MSAFILE *afp, ESL_MSA **ret_msa);
+extern int esl_msafile_selex_Write (FILE *fp, const ESL_MSA *msa);
+
+#endif /* eslMSAFILE_SELEX_INCLUDED */
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_stockholm.c b/esl_msafile_stockholm.c
new file mode 100644
index 0000000..1bbeb2f
--- /dev/null
+++ b/esl_msafile_stockholm.c
@@ -0,0 +1,2749 @@
+/* I/O of multiple sequence alignment files in Stockholm/Pfam format
+ * (Pfam format = always single block; Stockholm = multiblock allowed)
+ *
+ * Contents:
+ * 1. API for reading/writing Stockholm/Pfam input.
+ * 2. Internal: ESL_STOCKHOLM_PARSEDATA auxiliary structure.
+ * 3. Internal: parsing Stockholm line types.
+ * 4. Internal: looking up seq, tag indices.
+ * 5. Internal: writing Stockholm/Pfam formats
+ * 6. Unit tests.
+ * 7. Test driver.
+ * 8. Example.
+ * 9. License and copyright.
+ */
+#include "esl_config.h"
+
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#include "esl_mem.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_stockholm.h"
+
+/* Valid line types in an alignment block */
+#define eslSTOCKHOLM_LINE_SQ 1
+#define eslSTOCKHOLM_LINE_GC_SSCONS 2
+#define eslSTOCKHOLM_LINE_GC_SACONS 3
+#define eslSTOCKHOLM_LINE_GC_PPCONS 4
+#define eslSTOCKHOLM_LINE_GC_RF 5
+#define eslSTOCKHOLM_LINE_GC_OTHER 6
+#define eslSTOCKHOLM_LINE_GR_SS 7
+#define eslSTOCKHOLM_LINE_GR_SA 8
+#define eslSTOCKHOLM_LINE_GR_PP 9
+#define eslSTOCKHOLM_LINE_GR_OTHER 10
+#define eslSTOCKHOLM_LINE_GC_MM 11
+
+typedef struct {
+ /* information about the size of the growing alignment parse */
+ int nseq; /* # of sqnames currently stored, sqname[0..nseq-1]. Copy of msa->nseq */
+ int64_t alen; /* alignment length not including current block being parsed. Becomes msa->alen when done */
+
+ /* Having to do with the expected order of lines in each Stockholm block: */
+ int in_block; /* TRUE if we're in a block (GC, GR, or sequence lines) */
+ char *blinetype; /* blinetype[bi=0..npb-1] = code for linetype on parsed block line [bi]: GC, GR, or seq */
+ int *bidx; /* bidx[bi=0.npb-1] = seq index si=0..nseq-1 of seq or GR on parsed block line [bi]; or -1 for GC lines */
+ int npb; /* number of lines per block. Set by bi in 1st block; checked against bi thereafter */
+ int bi; /* index of current line in a block, 0..npb-1 */
+ int si; /* current (next expected) sequence index, 0..nseq */
+ int balloc; /* number of lines per block currently allocated for. */
+
+ /* Other information kept per block */
+ int nblock; /* current block number (starting at 0 while in first block) */
+ int nseq_b; /* number of sequences seen in this block so far */
+ int64_t alen_b; /* residues added by each seq field in curr block */
+
+ /* Having to do with the growing lengths (and numbers) of sequences and annotations in <msa>: */
+ /* yes, needed: used to catch dup lines in a block, such as seq1 xxx, seq1 xxx. */
+ int64_t ssconslen; /* current length of #=GC SS_cons annotation */
+ int64_t saconslen; /* current length of #=GC SA_cons annotation */
+ int64_t ppconslen; /* current length of #=GC PP_cons annotation */
+ int64_t rflen; /* current length of #=GC RF annotation */
+ int64_t mmasklen; /* current length of #=GC MM annotation */
+ int64_t *sqlen; /* current lengths of ax[0..nseq-1] or aseq[0..nseq-1] */
+ int64_t *sslen; /* current lengths of ss[0..nseq-1] */
+ int64_t *salen; /* current lengths of sa[0..nseq-1] */
+ int64_t *pplen; /* current lengths of pp[0..nseq-1] */
+ int64_t *ogc_len; /* current lengths of unparsed gc[0..ngc-1] */
+ int64_t **ogr_len; /* current lengths of unparsed gr[0..ngr-1][0..nseq-1] */
+ int salloc; /* # of sqnames currently allocated for (synced to msa->sqalloc) */
+} ESL_STOCKHOLM_PARSEDATA;
+
+static ESL_STOCKHOLM_PARSEDATA *stockholm_parsedata_Create(ESL_MSA *msa);
+static int stockholm_parsedata_ExpandSeq (ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa);
+static int stockholm_parsedata_ExpandBlock(ESL_STOCKHOLM_PARSEDATA *pd);
+static void stockholm_parsedata_Destroy (ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa);
+
+static int stockholm_parse_gf(ESL_MSAFILE *afp, ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa, char *p, esl_pos_t n);
+static int stockholm_parse_gs(ESL_MSAFILE *afp, ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa, char *p, esl_pos_t n);
+static int stockholm_parse_gc(ESL_MSAFILE *afp, ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa, char *p, esl_pos_t n);
+static int stockholm_parse_gr(ESL_MSAFILE *afp, ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa, char *p, esl_pos_t n);
+static int stockholm_parse_sq(ESL_MSAFILE *afp, ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa, char *p, esl_pos_t n);
+static int stockholm_parse_comment(ESL_MSA *msa, char *p, esl_pos_t n);
+
+static int stockholm_get_seqidx (ESL_MSA *msa, ESL_STOCKHOLM_PARSEDATA *pd, char *name, esl_pos_t n, int *ret_idx);
+static int stockholm_get_gr_tagidx(ESL_MSA *msa, ESL_STOCKHOLM_PARSEDATA *pd, char *tag, esl_pos_t taglen, int *ret_tagidx);
+static int stockholm_get_gc_tagidx(ESL_MSA *msa, ESL_STOCKHOLM_PARSEDATA *pd, char *tag, esl_pos_t taglen, int *ret_tagidx);
+
+static int stockholm_write(FILE *fp, const ESL_MSA *msa, int64_t cpl);
+
+
+/*****************************************************************
+ *# 1. API for reading/writing Stockholm input.
+ *****************************************************************/
+
+/* Function: esl_msafile_stockholm_SetInmap()
+ * Synopsis: Configure the input map for Stockholm format.
+ *
+ * Purpose: Configure <afp->inmap> for Stockholm format.
+ *
+ * Text mode accepts any <isgraph()> character.
+ * Digital mode enforces the usual Easel alphabets.
+ *
+ * No characters may be ignored in the input. We cannot
+ * skip whitespace in the inmap, because we'd misalign
+ * relative to the text-mode annotation lines (GR, GC),
+ * where we don't do mapped input.)
+ */
+int
+esl_msafile_stockholm_SetInmap(ESL_MSAFILE *afp)
+{
+ int sym;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc)
+ {
+ for (sym = 0; sym < 128; sym++)
+ afp->inmap[sym] = afp->abc->inmap[sym];
+ afp->inmap[0] = esl_abc_XGetUnknown(afp->abc);
+ }
+#endif
+ if (! afp->abc)
+ {
+ for (sym = 1; sym < 128; sym++)
+ afp->inmap[sym] = (isgraph(sym) ? sym : eslDSQ_ILLEGAL);
+ afp->inmap[0] = '?';
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_msafile_stockholm_GuessAlphabet()
+ * Synopsis: Guess the alphabet of an open Stockholm MSA file.
+ *
+ * Purpose: Guess the alphabet of the sequences in open
+ * Stockholm-format MSA file <afp>.
+ *
+ * On a normal return, <*ret_type> is set to <eslDNA>,
+ * <eslRNA>, or <eslAMINO>, and <afp> is reset to its
+ * original position.
+ *
+ * Args: afp - open Stockholm-format MSA file
+ * ret_type - RETURN: <eslDNA>, <eslRNA>, or <eslAMINO>
+ *
+ * Returns: <eslOK> on success.
+ * <eslENOALPHABET> if alphabet type can't be determined.
+ * In either case, <afp> is rewound to the position it
+ * started at.
+ */
+int
+esl_msafile_stockholm_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type)
+{
+ int alphatype = eslUNKNOWN;
+ esl_pos_t anchor = -1;
+ int threshold[3] = { 500, 5000, 50000 }; /* we check after 500, 5000, 50000 residues; else we go to EOF */
+ int nsteps = 3;
+ int step = 0;
+ int nres = 0;
+ int x;
+ int64_t ct[26];
+ char *p, *tok;
+ esl_pos_t n, toklen, pos;
+ int status;
+
+ for (x = 0; x < 26; x++) ct[x] = 0;
+
+ anchor = esl_buffer_GetOffset(afp->bf);
+ if ((status = esl_buffer_SetAnchor(afp->bf, anchor)) != eslOK) { status = eslEINCONCEIVABLE; goto ERROR; } /* [eslINVAL] can't happen here */
+
+ while ( (status = esl_buffer_GetLine(afp->bf, &p, &n)) == eslOK)
+ {
+ if ((status = esl_memtok(&p, &n, " \t", &tok, &toklen)) != eslOK || *tok == '#') continue; /* blank lines, annotation, comments */
+ /* p now points to the rest of the sequence line */
+
+ /* count characters into ct[] array */
+ for (pos = 0; pos < n; pos++)
+ if (isalpha(p[pos])) {
+ x = toupper(p[pos]) - 'A';
+ ct[x]++;
+ nres++;
+ }
+
+ /* try to stop early, checking after 500, 5000, and 50000 residues: */
+ if (step < nsteps && nres > threshold[step]) {
+ if ((status = esl_abc_GuessAlphabet(ct, &alphatype)) == eslOK) goto DONE; /* (eslENOALPHABET) */
+ step++;
+ }
+ }
+ if (status != eslEOF) goto ERROR; /* [eslEMEM,eslESYS,eslEINCONCEIVABLE] */
+ status = esl_abc_GuessAlphabet(ct, &alphatype); /* (eslENOALPHABET) */
+
+ DONE:
+ esl_buffer_SetOffset(afp->bf, anchor); /* Rewind to where we were. */
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ *ret_type = alphatype;
+ return status;
+
+ ERROR:
+ if (anchor != -1) {
+ esl_buffer_SetOffset(afp->bf, anchor);
+ esl_buffer_RaiseAnchor(afp->bf, anchor);
+ }
+ *ret_type = eslUNKNOWN;
+ return status;
+}
+
+
+/* Function: esl_msafile_stockholm_Read()
+ * Synopsis: Read an alignment in Stockholm format.
+ *
+ * Purpose: Read an MSA from open <ESL_MSAFILE> <afp>,
+ * parsing for Stockholm format. Create a new
+ * MSA, and return it by reference through
+ * <*ret_msa>. Caller is responsible for freeing
+ * this <ESL_MSA>.
+ *
+ * Args: <afp> - open <ESL_MSAFILE> to read from
+ * <ret_msa> - RETURN: newly parsed, created <ESL_MSA>
+ *
+ * Returns: <eslOK> on success. <*ret_msa> contains the newly
+ * allocated MSA. <afp> is poised at start of next
+ * alignment record, or is at EOF.
+ *
+ * <eslEOF> if no (more) alignment data are found in
+ * <afp>, and <afp> is returned at EOF.
+ *
+ * <eslEFORMAT> on a parse error. <*ret_msa> is set to
+ * <NULL>. <afp> contains information sufficient for
+ * constructing useful diagnostic output:
+ * | <afp->errmsg> | user-directed error message |
+ * | <afp->linenumber> | line # where error was detected |
+ * | <afp->line> | offending line (not NUL-term) |
+ * | <afp->n> | length of offending line |
+ * | <afp->bf->filename> | name of the file |
+ * and <afp> is poised at the start of the following line,
+ * so (in principle) the caller could try to resume
+ * parsing.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslESYS> if a system call fails, such as fread().
+ * <*ret_msa> is returned <NULL>.
+ */
+int
+esl_msafile_stockholm_Read(ESL_MSAFILE *afp, ESL_MSA **ret_msa)
+{
+ ESL_MSA *msa = NULL;
+ ESL_STOCKHOLM_PARSEDATA *pd = NULL;
+ char *p;
+ esl_pos_t n;
+ int idx;
+ int status;
+
+ ESL_DASSERT1( (afp->format == eslMSAFILE_PFAM || afp->format == eslMSAFILE_STOCKHOLM) );
+
+ afp->errmsg[0] = '\0';
+
+ /* Allocate a growable MSA, and auxiliary parse data coupled to the MSA allocation */
+#ifdef eslAUGMENT_ALPHABET
+ if (afp->abc && (msa = esl_msa_CreateDigital(afp->abc, 16, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+#endif
+ if (! afp->abc && (msa = esl_msa_Create( 16, -1)) == NULL) { status = eslEMEM; goto ERROR; }
+ if ( (pd = stockholm_parsedata_Create(msa)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ /* Skip leading blank lines in file. EOF here is a normal EOF return. */
+ do {
+ if ( ( status = esl_msafile_GetLine(afp, &p, &n)) != eslOK) goto ERROR; /* eslEOF is OK here - end of input (eslEOF) [eslEMEM|eslESYS] */
+ } while (esl_memspn(afp->line, afp->n, " \t") == afp->n || /* skip blank lines */
+ (esl_memstrpfx(afp->line, afp->n, "#") /* and skip comment lines */
+ && ! esl_memstrpfx(afp->line, afp->n, "# STOCKHOLM"))); /* but stop on Stockholm header */
+
+ /* Check for the magic Stockholm header */
+ if (! esl_memstrpfx(afp->line, afp->n, "# STOCKHOLM 1.")) ESL_XFAIL(eslEFORMAT, afp->errmsg, "missing Stockholm header");
+
+ while ( (status = esl_msafile_GetLine(afp, &p, &n)) == eslOK) /* (eslEOF) [eslEMEM|eslESYS] */
+ {
+ while (n && ( *p == ' ' || *p == '\t')) { p++; n--; } /* skip leading whitespace */
+
+ if (!n || esl_memstrpfx(p, n, "//"))
+ { /* blank lines and the Stockholm end-of-record // trigger end-of-block logic */
+ if (pd->in_block) {
+ if (pd->nblock) { if (pd->nseq_b != pd->nseq) ESL_XFAIL(eslEFORMAT, afp->errmsg, "number of seqs in block did not match number in earlier block(s)"); }
+ else { if (pd->nseq_b < pd->nseq) ESL_XFAIL(eslEFORMAT, afp->errmsg, "number of seqs in block did not match number annotated by #=GS lines"); };
+ if (pd->nblock) { if (pd->bi != pd->npb) ESL_XFAIL(eslEFORMAT, afp->errmsg, "unexpected number of lines in alignment block"); }
+
+ pd->nseq = msa->nseq = pd->nseq_b;
+ pd->alen += pd->alen_b;
+ pd->in_block = FALSE;
+ pd->npb = pd->bi;
+ pd->bi = 0;
+ pd->si = 0;
+ pd->nblock += 1;
+ pd->nseq_b = 0;
+ pd->alen_b = 0;
+ }
+ if (esl_memstrpfx(p, n, "//")) break; /* Stockholm end-of-record marker */
+ else continue; /* else, on to next block */
+ }
+
+ if (*p == '#')
+ {
+ if (esl_memstrpfx(p, n, "#=GF")) { if ((status = stockholm_parse_gf (afp, pd, msa, p, n)) != eslOK) goto ERROR; }
+ else if (esl_memstrpfx(p, n, "#=GS")) { if ((status = stockholm_parse_gs (afp, pd, msa, p, n)) != eslOK) goto ERROR; }
+ else if (esl_memstrpfx(p, n, "#=GC")) { if ((status = stockholm_parse_gc (afp, pd, msa, p, n)) != eslOK) goto ERROR; }
+ else if (esl_memstrpfx(p, n, "#=GR")) { if ((status = stockholm_parse_gr (afp, pd, msa, p, n)) != eslOK) goto ERROR; }
+ else if (esl_memstrcmp(p, n, "# STOCKHOLM 1.0")) ESL_XFAIL(eslEFORMAT, afp->errmsg, "two # STOCKHOLM 1.0 headers in a row?");
+ else { if ((status = stockholm_parse_comment( msa, p, n)) != eslOK) goto ERROR; }
+ }
+ else if ( (status = stockholm_parse_sq (afp, pd, msa, p, n)) != eslOK) goto ERROR;
+ }
+ if (status == eslEOF) ESL_XFAIL(eslEFORMAT, afp->errmsg, "missing // terminator after MSA");
+ else if (status != eslOK) goto ERROR;
+ if (pd->nblock == 0) ESL_XFAIL(eslEFORMAT, afp->errmsg, "no alignment data followed Stockholm header");
+
+ msa->alen = pd->alen;
+
+ /* Stockholm file can set weights. If eslMSA_HASWGTS flag is up, at least one was set: then all must be. */
+ if (msa->flags & eslMSA_HASWGTS)
+ {
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (msa->wgt[idx] == -1.0) ESL_XFAIL(eslEFORMAT, afp->errmsg, "stockholm record ended without a weight for %s", msa->sqname[idx]);
+ }
+ else if (( status = esl_msa_SetDefaultWeights(msa)) != eslOK) goto ERROR;
+
+ stockholm_parsedata_Destroy(pd, msa);
+ *ret_msa = msa;
+ return eslOK;
+
+ ERROR:
+ if (pd) stockholm_parsedata_Destroy(pd, msa);
+ if (msa) esl_msa_Destroy(msa);
+ *ret_msa = NULL;
+ return status;
+}
+
+
+/* Function: esl_msafile_stockholm_Write()
+ * Synopsis: Write a Stockholm format alignment to a stream.
+ *
+ * Purpose: Write alignment <msa> to output stream <fp>, in Stockholm
+ * format. <fmt> may either be <eslMSAFILE_STOCKHOLM> or
+ * <eslMSAFILE_PFAM>. <eslMSAFILE_PFAM> puts the alignment
+ * into a single block, one alignment line per sequence.
+ * <eslMSAFILE_STOCKHOLM> is a multiple block format, with
+ * a width of 200 aligned residues per line.
+ *
+ * Args: fp - open output stream, writable
+ * msa - alignment to write
+ * fmt - eslMSAFILE_STOCKHOLM | eslMSAFILE_PFAM
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEWRITE> on any system write error, such as filled disk.
+ */
+int
+esl_msafile_stockholm_Write(FILE *fp, const ESL_MSA *msa, int fmt)
+{
+ switch (fmt) {
+ case eslMSAFILE_PFAM: return stockholm_write(fp, msa, msa->alen);
+ case eslMSAFILE_STOCKHOLM: return stockholm_write(fp, msa, 200);
+ }
+ return eslEINCONCEIVABLE;
+}
+/*--------------- end, api for stockholm i/o --------------------*/
+
+
+/*****************************************************************
+ * 2. Internal: ESL_STOCKHOLM_PARSEDATA auxiliary structure
+ *****************************************************************/
+
+/* The auxiliary parse data is sufficient to validate each line as we
+ * see it. Our design requires that we immediately report any errors
+ * and the line number they occur on. We do not want to detect errors
+ * in some later validation step, after we've lost track of original
+ * line numbers of the input.
+ */
+
+static ESL_STOCKHOLM_PARSEDATA *
+stockholm_parsedata_Create(ESL_MSA *msa)
+{
+ ESL_STOCKHOLM_PARSEDATA *pd = NULL;
+ int z;
+ int status;
+
+ ESL_ALLOC(pd, sizeof(ESL_STOCKHOLM_PARSEDATA));
+ pd->nseq = 0;
+ pd->alen = 0;
+
+ pd->in_block = FALSE;
+ pd->blinetype = NULL;
+ pd->bidx = NULL;
+ pd->npb = 0;
+ pd->bi = 0;
+ pd->si = 0;
+ pd->balloc = 0;
+
+ pd->nblock = 0;
+ pd->nseq_b = 0;
+ pd->alen_b = 0;
+
+ pd->ssconslen = 0;
+ pd->saconslen = 0;
+ pd->ppconslen = 0;
+ pd->rflen = 0;
+ pd->mmasklen = 0;
+ pd->sqlen = NULL;
+ pd->sslen = NULL;
+ pd->salen = NULL;
+ pd->pplen = NULL;
+ pd->ogc_len = NULL;
+ pd->ogr_len = NULL;
+ pd->salloc = 0;
+
+ ESL_ALLOC(pd->blinetype, sizeof(char) * 16);
+ ESL_ALLOC(pd->bidx, sizeof(int) * 16);
+ pd->balloc = 16;
+
+ ESL_ALLOC(pd->sqlen, sizeof(int64_t) * msa->sqalloc);
+ for (z = 0; z < msa->sqalloc; z++)
+ pd->sqlen[z] = 0;
+ pd->salloc = msa->sqalloc;
+ return pd;
+
+ ERROR:
+ stockholm_parsedata_Destroy(pd, msa);
+ return NULL;
+}
+
+static int
+stockholm_parsedata_ExpandSeq(ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa)
+{
+ int tagidx;
+ int z;
+ int status;
+
+ ESL_REALLOC(pd->sqlen, sizeof(int64_t) * msa->sqalloc);
+ for (z = pd->salloc; z < msa->sqalloc; z++) pd->sqlen[z] = 0;
+
+ if (pd->sslen) {
+ ESL_REALLOC(pd->sslen, sizeof(int64_t) * msa->sqalloc);
+ for (z = pd->salloc; z < msa->sqalloc; z++) pd->sslen[z] = 0;
+ }
+
+ if (pd->salen) {
+ ESL_REALLOC(pd->salen, sizeof(int64_t) * msa->sqalloc);
+ for (z = pd->salloc; z < msa->sqalloc; z++) pd->salen[z] = 0;
+ }
+
+ if (pd->pplen) {
+ ESL_REALLOC(pd->pplen, sizeof(int64_t) * msa->sqalloc);
+ for (z = pd->salloc; z < msa->sqalloc; z++) pd->pplen[z] = 0;
+ }
+
+ /* don't need to reallocate ogc_len here: it's [0..ngc-1], not by seq */
+
+ if (pd->ogr_len) {
+ for (tagidx = 0; tagidx < msa->ngr; tagidx++)
+ if (pd->ogr_len[tagidx]) {
+ ESL_REALLOC(pd->ogr_len[tagidx], sizeof(int64_t) * msa->sqalloc);
+ for (z = pd->salloc; z < msa->sqalloc; z++) pd->ogr_len[tagidx][z] = 0;
+ }
+ }
+
+ pd->salloc = msa->sqalloc;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+static int
+stockholm_parsedata_ExpandBlock(ESL_STOCKHOLM_PARSEDATA *pd)
+{
+ int status;
+
+ ESL_REALLOC(pd->blinetype, sizeof(char) * (pd->balloc * 2));
+ ESL_REALLOC(pd->bidx, sizeof(int) * (pd->balloc * 2));
+ pd->balloc *= 2;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+static void
+stockholm_parsedata_Destroy(ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa)
+{
+ int i;
+ if (! pd) return;
+
+ if (pd->blinetype) free(pd->blinetype);
+ if (pd->bidx) free(pd->bidx);
+
+ if (pd->sqlen) free(pd->sqlen);
+ if (pd->sslen) free(pd->sslen);
+ if (pd->salen) free(pd->salen);
+ if (pd->pplen) free(pd->pplen);
+ if (pd->ogc_len) free(pd->ogc_len);
+ if (pd->ogr_len) {
+ for (i = 0; i < msa->ngr; i++)
+ if (pd->ogr_len[i]) free(pd->ogr_len[i]);
+ free(pd->ogr_len);
+ }
+ free(pd);
+ return;
+}
+/*------------------ end, ESL_STOCKHOLM_PARSEDATA auxiliary structure -------------*/
+
+
+
+
+/*****************************************************************
+ * 3. Internal: parsing Stockholm line types
+ *****************************************************************/
+
+/* stockholm_parse_gf()
+ * Line format is:
+ * #=GF <tag> <text>
+ * recognized featurenames: { ID | AC | DE | AU | GA | NC | TC }
+ */
+static int
+stockholm_parse_gf(ESL_MSAFILE *afp, ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa, char *p, esl_pos_t n)
+{
+ char *gf, *tag, *tok;
+ esl_pos_t gflen, taglen, toklen;
+ int status;
+
+ if ( (status = esl_memtok(&p, &n, " \t", &gf, &gflen)) != eslOK) ESL_EXCEPTION(eslEINCONCEIVABLE, "EOL can't happen here.");
+ if ( (status = esl_memtok(&p, &n, " \t", &tag, &taglen)) != eslOK) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GF line is missing <tag>, annotation");
+ if (! esl_memstrcmp(gf, gflen, "#=GF")) ESL_FAIL(eslEFORMAT, afp->errmsg, "faux #=GF line?");
+
+ if (esl_memstrcmp(tag, taglen, "ID"))
+ {
+ if ((status = esl_memtok(&p, &n, " \t", &tok, &toklen)) != eslOK) ESL_FAIL(eslEFORMAT, afp->errmsg, "No name found on #=GF ID line");
+ if (n) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GF ID line should have only one name (no whitespace allowed)");
+ if ( (status = esl_msa_SetName (msa, tok, toklen)) != eslOK) return status; /* [eslEMEM] */
+ }
+ else if (esl_memstrcmp(tag, taglen, "AC"))
+ {
+ if ((status = esl_memtok(&p, &n, " \t", &tok, &toklen)) != eslOK) ESL_FAIL(eslEFORMAT, afp->errmsg, "No accession found on #=GF AC line");
+ if (n) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GF AC line should have only one accession (no whitespace allowed)");
+ if ((status = esl_msa_SetAccession(msa, tok, toklen)) != eslOK) return status; /* [eslEMEM] */
+ }
+ else if (esl_memstrcmp(tag, taglen, "DE"))
+ {
+ if ((status = esl_msa_SetDesc (msa, p, n)) != eslOK) return status; /* [eslEMEM] */
+ }
+ else if (esl_memstrcmp(tag, taglen, "AU"))
+ {
+ if ((status = esl_msa_SetAuthor (msa, p, n)) != eslOK) return status; /* [eslEMEM] */
+ }
+ else if (esl_memstrcmp(tag, taglen, "GA"))
+ {
+ if ( (status = esl_memtok(&p, &n, " \t", &tok, &toklen)) == eslOK) {
+ if (! esl_mem_IsReal(tok, toklen)) ESL_FAIL(eslEFORMAT, afp->errmsg, "Expected a real number for GA1 value on #=GF GA line");
+ if ( esl_memtof(tok, toklen, &(msa->cutoff[eslMSA_GA1])) != eslOK) return status; /* [eslEMEM] */
+ msa->cutset[eslMSA_GA1] = TRUE;
+ } else ESL_FAIL(eslEFORMAT, afp->errmsg, "No GA threshold value found on #=GF GA line");
+ if ( (status = esl_memtok(&p, &n, " \t", &tok, &toklen)) == eslOK) {
+ if (! esl_mem_IsReal(tok, toklen)) ESL_FAIL(eslEFORMAT, afp->errmsg, "Expected a real number for GA2 value on #=GF GA line");
+ if ( esl_memtof(tok, toklen, &(msa->cutoff[eslMSA_GA2])) != eslOK) return status; /* [eslEMEM] */
+ msa->cutset[eslMSA_GA2] = TRUE;
+ }
+ }
+ else if (esl_memstrcmp(tag, taglen, "NC"))
+ {
+ if ( (status = esl_memtok(&p, &n, " \t", &tok, &toklen)) == eslOK) {
+ if ( ! esl_memstrcmp(tok, toklen, "undefined")) /* workaround for a problem in Rfam10. ignore NC's that are set to "undefined". */
+ {
+ if (! esl_mem_IsReal(tok, toklen)) ESL_FAIL(eslEFORMAT, afp->errmsg, "Expected a real number for NC1 value on #=GF NC line");
+ if ( esl_memtof(tok, toklen, &(msa->cutoff[eslMSA_NC1])) != eslOK) return status; /* [eslEMEM] */
+ msa->cutset[eslMSA_NC1] = TRUE;
+ }
+ } else ESL_FAIL(eslEFORMAT, afp->errmsg, "No NC threshold value found on #=GF NC line");
+ if ( (status = esl_memtok(&p, &n, " \t", &tok, &toklen)) == eslOK) {
+ if (! esl_mem_IsReal(tok, toklen)) ESL_FAIL(eslEFORMAT, afp->errmsg, "Expected a real number for NC2 value on #=GF NC line");
+ if ( esl_memtof(tok, toklen, &(msa->cutoff[eslMSA_NC2])) != eslOK) return status; /* [eslEMEM] */
+ msa->cutset[eslMSA_NC2] = TRUE;
+ }
+ }
+ else if (esl_memstrcmp(tag, taglen, "TC"))
+ {
+ if ( (status = esl_memtok(&p, &n, " \t", &tok, &toklen)) == eslOK) {
+ if (! esl_mem_IsReal(tok, toklen)) ESL_FAIL(eslEFORMAT, afp->errmsg, "Expected a real number for TC1 value on #=GF TC line");
+ if ( esl_memtof(tok, toklen, &(msa->cutoff[eslMSA_TC1])) != eslOK) return status; /* [eslEMEM] */
+ msa->cutset[eslMSA_TC1] = TRUE;
+ } else ESL_FAIL(eslEFORMAT, afp->errmsg, "No TC threshold value found on #=GF TC line");
+ if ( (status = esl_memtok(&p, &n, " \t", &tok, &toklen)) == eslOK) {
+ if (! esl_mem_IsReal(tok, toklen)) ESL_FAIL(eslEFORMAT, afp->errmsg, "Expected a real number for TC2 value on #=GF TC line");
+ if ( esl_memtof(tok, toklen, &(msa->cutoff[eslMSA_TC2])) != eslOK) return status; /* [eslEMEM] */
+ msa->cutset[eslMSA_TC2] = TRUE;
+ }
+ }
+ else
+ {
+ if ((status = esl_msa_AddGF(msa, tag, taglen, p, n)) != eslOK) return status;
+ }
+
+ return eslOK;
+}
+
+
+/* stockholm_parse_gs()
+ * Format:
+ * #=GS <seqname> <tag> <text>
+ * recognized featurenames: { WT | AC | DE }
+ */
+static int
+stockholm_parse_gs(ESL_MSAFILE *afp, ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa, char *p, esl_pos_t n)
+{
+ char *gs, *seqname, *tag, *tok;
+ esl_pos_t gslen, seqnamelen, taglen, toklen;
+ int seqidx;
+ int status;
+
+ if (esl_memtok(&p, &n, " \t", &gs, &gslen) != eslOK) ESL_EXCEPTION(eslEINCONCEIVABLE, "EOL can't happen here.");
+ if (esl_memtok(&p, &n, " \t", &seqname, &seqnamelen) != eslOK) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GS line missing <seqname>, <tag>, annotation");
+ if (esl_memtok(&p, &n, " \t", &tag, &taglen) != eslOK) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GS line missing <tag>, annotation");
+ if (! esl_memstrcmp(gs, gslen, "#=GS")) ESL_FAIL(eslEFORMAT, afp->errmsg, "faux #=GS line?");
+
+ seqidx = pd->si;
+ if (seqidx == pd->nseq || ! esl_memstrcmp(seqname, seqnamelen, msa->sqname[seqidx])) {
+ stockholm_get_seqidx(msa, pd, seqname, seqnamelen, &seqidx);
+ }
+
+ if (esl_memstrcmp(tag, taglen, "WT"))
+ {
+ if (esl_memtok(&p, &n, " \t", &tok, &toklen) != eslOK) ESL_FAIL(eslEFORMAT, afp->errmsg, "no weight value found on #=GS <seqname> WT line");
+ if (msa->wgt[seqidx] != -1.0) ESL_FAIL(eslEFORMAT, afp->errmsg, "sequence has more than one #=GS <seqname> WT line");
+ if (n) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GS <seqname> WT line should have only one field, the weight");
+ if (! esl_mem_IsReal(tok, toklen)) ESL_FAIL(eslEFORMAT, afp->errmsg, "value on #=GS <seqname> WT line isn't a real number");
+ if ((status = esl_memtod(tok, toklen, &(msa->wgt[seqidx]))) != eslOK) return status; /* eslEMEM */
+ msa->flags |= eslMSA_HASWGTS;
+ }
+ else if (esl_memstrcmp(tag, taglen, "AC"))
+ {
+ if (esl_memtok(&p, &n, " \t", &tok, &toklen) != eslOK) ESL_FAIL(eslEFORMAT, afp->errmsg, "no accession found on #=GS <seqname> AC line");
+ if (msa->sqacc && msa->sqacc[seqidx]) ESL_FAIL(eslEFORMAT, afp->errmsg, "sequence has more than one #=GS <seqname> AC accession line");
+ if (n) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GS <seqname> AC line should have only one field, the accession");
+ if ((status = esl_msa_SetSeqAccession(msa, seqidx, tok, toklen)) != eslOK) return status; /* eslEMEM */
+ }
+ else if (esl_memstrcmp(tag, taglen, "DE"))
+ {
+ if (msa->sqdesc && msa->sqdesc[seqidx]) ESL_FAIL(eslEFORMAT, afp->errmsg, "sequence has more than one #=GS <seqname> DE accession line");
+ if ((status = esl_msa_SetSeqDescription(msa, seqidx, p, n)) != eslOK) return status; /* eslEMEM */
+ }
+ else
+ {
+ if ((status = esl_msa_AddGS(msa, tag, taglen, seqidx, p, n)) != eslOK) return status;
+ }
+
+ pd->si = seqidx+1; /* set guess for next sequence index */
+ return eslOK;
+}
+
+/* stockholm_parse_gc()
+ * Format of line is:
+ * #=GC <tag> <aligned text>
+ * recognized featurenames: { SS_cons | SA_cons | PP_cons | RF }
+ */
+static int
+stockholm_parse_gc(ESL_MSAFILE *afp, ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa, char *p, esl_pos_t n)
+{
+ char *gc, *tag;
+ esl_pos_t gclen, taglen;
+ int tagidx;
+ int status;
+
+ if (esl_memtok(&p, &n, " \t", &gc, &gclen) != eslOK) ESL_EXCEPTION(eslEINCONCEIVABLE, "EOL can't happen here.");
+ if (esl_memtok(&p, &n, " \t", &tag, &taglen) != eslOK) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GC line missing <tag>, annotation");
+ while (n && strchr(" \t", p[n-1])) n--; /* skip backwards from eol, to delimit aligned text without going through it */
+
+ if (! esl_memstrcmp(gc, gclen, "#=GC")) ESL_FAIL(eslEFORMAT, afp->errmsg, "faux #=GC line?");
+ if (! n) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GC line missing annotation?");
+
+ if (pd->nblock) /* Subsequent blocks */
+ {
+ if (esl_memstrcmp(tag, taglen, "SS_cons")) { if (pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_GC_SSCONS) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected #=GC SS_cons; earlier block(s) in different order?"); }
+ else if (esl_memstrcmp(tag, taglen, "SA_cons")) { if (pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_GC_SACONS) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected #=GC SA_cons; earlier block(s) in different order?"); }
+ else if (esl_memstrcmp(tag, taglen, "PP_cons")) { if (pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_GC_PPCONS) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected #=GC PP_cons; earlier block(s) in different order?"); }
+ else if (esl_memstrcmp(tag, taglen, "RF")) { if (pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_GC_RF) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected #=GC RF; earlier block(s) in different order?"); }
+ else if (esl_memstrcmp(tag, taglen, "MM")) { if (pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_GC_MM) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected #=GC MM; earlier block(s) in different order?"); }
+ else if ( pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_GC_OTHER) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected #=GC line; earlier block(s) in different order?");
+ }
+ else /* First block */
+ {
+ if (pd->bi == pd->balloc && (status = stockholm_parsedata_ExpandBlock(pd)) != eslOK) return status;
+
+ if (esl_memstrcmp(tag, taglen, "SS_cons")) pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_GC_SSCONS;
+ else if (esl_memstrcmp(tag, taglen, "SA_cons")) pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_GC_SACONS;
+ else if (esl_memstrcmp(tag, taglen, "PP_cons")) pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_GC_PPCONS;
+ else if (esl_memstrcmp(tag, taglen, "RF")) pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_GC_RF;
+ else if (esl_memstrcmp(tag, taglen, "MM")) pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_GC_MM;
+ else pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_GC_OTHER;
+ pd->bidx[pd->bi] = -1;
+ }
+
+ if (pd->blinetype[pd->bi] == eslSTOCKHOLM_LINE_GC_SSCONS)
+ {
+ if (pd->ssconslen != pd->alen) ESL_FAIL(eslEFORMAT, afp->errmsg, "more than one #=GC SS_cons line in block");
+ if ( (status = esl_strcat(&(msa->ss_cons), pd->ssconslen, p, n)) != eslOK) return status; /* [eslEMEM] */
+ pd->ssconslen += n;
+ }
+ else if (pd->blinetype[pd->bi] == eslSTOCKHOLM_LINE_GC_SACONS)
+ {
+ if (pd->saconslen != pd->alen) ESL_FAIL(eslEFORMAT, afp->errmsg, "more than one #=GC SA_cons line in block");
+ if ((status = esl_strcat(&(msa->sa_cons), pd->saconslen, p, n)) != eslOK) return status; /* [eslEMEM] */
+ pd->saconslen += n;
+ }
+ else if (pd->blinetype[pd->bi] == eslSTOCKHOLM_LINE_GC_PPCONS)
+ {
+ if (pd->ppconslen != pd->alen) ESL_FAIL(eslEFORMAT, afp->errmsg, "more than one #=GC PP_cons line in block");
+ if ((status = esl_strcat(&(msa->pp_cons), pd->ppconslen, p, n)) != eslOK) return status; /* [eslEMEM] */
+ pd->ppconslen += n;
+ }
+ else if (pd->blinetype[pd->bi] == eslSTOCKHOLM_LINE_GC_RF)
+ {
+ if (pd->rflen != pd->alen) ESL_FAIL(eslEFORMAT, afp->errmsg, "more than one #=GC RF line in block");
+ if ((status = esl_strcat(&(msa->rf), pd->rflen, p, n)) != eslOK) return status; /* [eslEMEM] */
+ pd->rflen += n;
+ }
+ else if (pd->blinetype[pd->bi] == eslSTOCKHOLM_LINE_GC_MM)
+ {
+ if (pd->mmasklen != pd->alen) ESL_FAIL(eslEFORMAT, afp->errmsg, "more than one #=GC MM line in block");
+ if ((status = esl_strcat(&(msa->mm), pd->mmasklen, p, n)) != eslOK) return status; /* [eslEMEM] */
+ pd->mmasklen += n;
+ }
+ else
+ {
+ if ((status = stockholm_get_gc_tagidx(msa, pd, tag, taglen, &tagidx)) != eslOK) return status;
+
+ if (pd->ogc_len[tagidx] != pd->alen) ESL_FAIL(eslEFORMAT, afp->errmsg, "more than one #=GC %.*s line in block", (int) taglen, tag);
+ if ((status = esl_strcat(&(msa->gc[tagidx]), pd->ogc_len[tagidx], p, n)) != eslOK) return status; /* [eslEMEM] */
+ pd->ogc_len[tagidx] += n;
+ }
+
+ if (pd->bi && n != pd->alen_b) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected # of aligned annotation in #=GC %.*s line", (int) taglen, tag);
+ pd->alen_b = n;
+ pd->in_block = TRUE;
+ pd->bi++;
+ return eslOK;
+}
+
+/* A GR line is
+ * #=GR <seqname> <featurename> <text>
+ * recognized featurenames: { SS | SA | PP }
+ *
+ */
+static int
+stockholm_parse_gr(ESL_MSAFILE *afp, ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa, char *p, esl_pos_t n)
+{
+ char *gr, *name, *tag;
+ esl_pos_t grlen, namelen, taglen;
+ int seqidx, tagidx;
+ int z;
+ int status;
+
+ if (esl_memtok(&p, &n, " \t", &gr, &grlen) != eslOK) ESL_EXCEPTION(eslEINCONCEIVABLE, "EOL can't happen here.");
+ if (esl_memtok(&p, &n, " \t", &name, &namelen) != eslOK) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GR line missing <seqname>, <tag>, annotation");
+ if (esl_memtok(&p, &n, " \t", &tag, &taglen) != eslOK) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GR line missing <tag>, annotation");
+ while (n && strchr(" \t", p[n-1])) n--; /* skip backwards from eol, to delimit aligned text without going through it */
+
+ if (! esl_memstrcmp(gr, grlen, "#=GR")) ESL_FAIL(eslEFORMAT, afp->errmsg, "faux #=GR line?");
+ if (! n) ESL_FAIL(eslEFORMAT, afp->errmsg, "#=GR line missing annotation?");
+
+ /* Which seqidx is this? likely to be either pd->si-1 (#=GR following a seq) or
+ * pd->si (#=GR preceding a seq)
+ */
+ if (! pd->nblock) /* First block: we're setting bidx[], blinetype[] as we see them */
+ {
+ if (pd->si >= 1 && esl_memstrcmp(name, namelen, msa->sqname[pd->si-1])) seqidx = pd->si-1;
+ else if (pd->si < pd->nseq && esl_memstrcmp(name, namelen, msa->sqname[pd->si])) seqidx = pd->si;
+ else if ((status = stockholm_get_seqidx(msa, pd, name, namelen, &seqidx)) != eslOK) goto ERROR;
+
+ if (pd->bi == pd->balloc && (status = stockholm_parsedata_ExpandBlock(pd)) != eslOK) return status;
+
+ if (esl_memstrcmp(tag, taglen, "SS")) pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_GR_SS;
+ else if (esl_memstrcmp(tag, taglen, "SA")) pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_GR_SA;
+ else if (esl_memstrcmp(tag, taglen, "PP")) pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_GR_PP;
+ else pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_GR_OTHER;
+ pd->bidx[pd->bi] = seqidx;
+ }
+ else
+ { /* subsequent block(s) */
+ if (pd->bi >= pd->npb) ESL_FAIL(eslEFORMAT, afp->errmsg, "more lines than expected in this alignment block; earlier blocks had fewer");
+
+ if (esl_memstrcmp(tag, taglen, "SS")) { if (pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_GR_SS) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected #=GR <seqname> SS; earlier block(s) in different order?"); }
+ else if (esl_memstrcmp(tag, taglen, "SA")) { if (pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_GR_SA) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected #=GR <seqname> SA; earlier block(s) in different order?"); }
+ else if (esl_memstrcmp(tag, taglen, "PP")) { if (pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_GR_PP) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected #=GR <seqname> PP; earlier block(s) in different order?"); }
+ else if ( pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_GR_OTHER) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected #=GR line; earlier block(s) in different order?");
+
+ seqidx = pd->bidx[pd->bi];
+ if (! esl_memstrcmp(name, namelen, msa->sqname[seqidx])) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected seqname %.*s; expected %s from prev blocks", (int) namelen, name, msa->sqname[seqidx]);
+ }
+
+ /* Append the annotation where it belongs */
+ if (pd->blinetype[pd->bi] == eslSTOCKHOLM_LINE_GR_SS)
+ {
+ if (! msa->ss) {
+ ESL_ALLOC(msa->ss, sizeof(char *) * msa->sqalloc);
+ ESL_ALLOC(pd->sslen, sizeof(int64_t) * msa->sqalloc);
+ for (z = 0; z < msa->sqalloc; z++) { msa->ss[z] = NULL; pd->sslen[z] = 0; }
+ }
+ if (pd->sslen[seqidx] != pd->alen) ESL_FAIL(eslEFORMAT, afp->errmsg, "more than one #=GR %.*s SS line in block", (int) namelen, name);
+ if (( status = esl_strcat(&(msa->ss[seqidx]), pd->sslen[seqidx], p, n)) != eslOK) return status; /* [eslEMEM] */
+ pd->sslen[seqidx] += n;
+ }
+ else if (pd->blinetype[pd->bi] == eslSTOCKHOLM_LINE_GR_PP)
+ {
+ if (! msa->pp) {
+ ESL_ALLOC(msa->pp, sizeof(char *) * msa->sqalloc);
+ ESL_ALLOC(pd->pplen, sizeof(int64_t) * msa->sqalloc);
+ for (z = 0; z < msa->sqalloc; z++) { msa->pp[z] = NULL; pd->pplen[z] = 0; }
+ }
+ if (pd->pplen[seqidx] != pd->alen) ESL_FAIL(eslEFORMAT, afp->errmsg, "more than one #=GR %.*s PP line in block", (int) namelen, name);
+ if ((status = esl_strcat(&(msa->pp[seqidx]), pd->pplen[seqidx], p, n)) != eslOK) return status; /* [eslEMEM] */
+ pd->pplen[seqidx] += n;
+ }
+ else if (pd->blinetype[pd->bi] == eslSTOCKHOLM_LINE_GR_SA)
+ {
+ if (! msa->sa) {
+ ESL_ALLOC(msa->sa, sizeof(char *) * msa->sqalloc);
+ ESL_ALLOC(pd->salen, sizeof(int64_t) * msa->sqalloc);
+ for (z = 0; z < msa->sqalloc; z++) { msa->sa[z] = NULL; pd->salen[z] = 0; }
+ }
+ if (pd->salen[seqidx] != pd->alen) ESL_FAIL(eslEFORMAT, afp->errmsg, "more than one #=GR %.*s SA line in block", (int) namelen, name);
+ if ((status = esl_strcat(&(msa->sa[seqidx]), pd->salen[seqidx], p, n)) != eslOK) return status;
+ pd->salen[seqidx] += n;
+ }
+ else
+ {
+ if ((status = stockholm_get_gr_tagidx(msa, pd, tag, taglen, &tagidx)) != eslOK) return status; /* [eslEMEM] */
+
+ if (pd->ogr_len[tagidx][seqidx] != pd->alen) ESL_FAIL(eslEFORMAT, afp->errmsg, "more than one #=GR %.*s %.*s line in block", (int) namelen, name, (int) taglen, tag);
+ if ((status = esl_strcat(&(msa->gr[tagidx][seqidx]), pd->ogr_len[tagidx][seqidx], p, n)) != eslOK) return status;
+ pd->ogr_len[tagidx][seqidx] += n;
+ }
+
+ if (pd->bi && n != pd->alen_b) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected # of aligned annotation in #=GR %.*s %.*s line", (int) namelen, name, (int) taglen, tag);
+ pd->alen_b = n;
+ pd->in_block = TRUE;
+ pd->bi++;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* stockholm_parse_sq():
+ * Format of line is:
+ * <seqname> <aligned text>
+ */
+static int
+stockholm_parse_sq(ESL_MSAFILE *afp, ESL_STOCKHOLM_PARSEDATA *pd, ESL_MSA *msa, char *p, esl_pos_t n)
+{
+ char *seqname;
+ esl_pos_t seqnamelen;
+ int seqidx = pd->si;
+ int status;
+
+ if (esl_memtok(&p, &n, " \t", &seqname, &seqnamelen) != eslOK) ESL_EXCEPTION(eslEINCONCEIVABLE, "EOL can't happen here.");
+ while (n && strchr(" \t", p[n-1])) n--; /* skip backwards from eol, to delimit aligned text without going through it */
+
+ if (! n) ESL_FAIL(eslEFORMAT, afp->errmsg, "sequence line with no sequence?");
+
+ /* Which seqidx is this?
+ * In first block:
+ * 1. If #=GS lines set sqname[] completely, then it's pd->si.
+ * 2. If #=GS lines set sqname[] partially or out of order, then name may be in the keyhash.
+ * 3. If we haven't seen name before, then we'll add it: seqidx = pd->nseq, add name to keyhash, possibly reallocate.
+ * In subsequent blocks, use recorded indices and linetypes:
+ * 4. seqidx = saved bidx[]; should be expecting a SQ line; name should match expected name.
+ */
+ if (! pd->nblock) /* First block: we're setting npb, bidx[], and blinetype[] as we see them */
+ {
+ if (pd->si < pd->nseq && esl_memstrcmp(seqname, seqnamelen, msa->sqname[seqidx])) seqidx = pd->si;
+ else if ((status = stockholm_get_seqidx(msa, pd, seqname, seqnamelen, &seqidx)) != eslOK) return status; /* [eslEMEM] */
+
+ if (pd->bi == pd->balloc && (status = stockholm_parsedata_ExpandBlock(pd)) != eslOK) return status;
+
+ pd->blinetype[pd->bi] = eslSTOCKHOLM_LINE_SQ;
+ pd->bidx[pd->bi] = seqidx;
+ }
+ else
+ { /* subsequent block(s) */
+ if (pd->bi >= pd->npb) ESL_FAIL(eslEFORMAT, afp->errmsg, "more lines than expected; earlier blocks had fewer");
+ if ( pd->blinetype[pd->bi] != eslSTOCKHOLM_LINE_SQ) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected seq line; earlier block(s) in different order?");
+ seqidx = pd->bidx[pd->bi];
+
+ if (! esl_memstrcmp(seqname, seqnamelen, msa->sqname[seqidx])) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected seq name %.*s; expected %s from prev block order", (int) seqnamelen, seqname, msa->sqname[seqidx]);
+ }
+
+ if ( pd->bi > 0 && pd->sqlen[seqidx] == pd->alen + pd->alen_b) ESL_FAIL(eslEFORMAT, afp->errmsg, "duplicate seq name %.*s", (int) seqnamelen, seqname);
+
+#ifdef eslAUGMENT_ALPHABET
+ if ( afp->abc ) {
+ status = esl_abc_dsqcat(afp->inmap, &(msa->ax[seqidx]), &(pd->sqlen[seqidx]), p, n);
+ if (status == eslEINVAL) ESL_FAIL(eslEFORMAT, afp->errmsg, "invalid sequence character(s) on line");
+ else if (status != eslOK) return status;
+ }
+#endif
+ if (! afp->abc) {
+ status = esl_strmapcat (afp->inmap, &(msa->aseq[seqidx]), &(pd->sqlen[seqidx]), p, n);
+ if (status == eslEINVAL) ESL_FAIL(eslEFORMAT, afp->errmsg, "invalid sequence character(s) on line");
+ else if (status != eslOK) return status;
+ }
+
+ if (pd->bi && n != pd->alen_b) ESL_FAIL(eslEFORMAT, afp->errmsg, "unexpected number of aligned residues parsed on line");
+ if (pd->sqlen[seqidx] - pd->alen != n) ESL_EXCEPTION(eslEINCONCEIVABLE, "implementation assumes that no symbols are ignored in inmap; else GR, GC text annotations are messed up");
+ pd->alen_b = n;
+ pd->in_block = TRUE;
+ pd->nseq_b++;
+ pd->bi++;
+ pd->si = seqidx+1;
+ return eslOK;
+}
+
+
+
+static int
+stockholm_parse_comment(ESL_MSA *msa, char *p, esl_pos_t n)
+{
+ if (n && *p == '#') { p++; n--; }
+ while (n && isspace(*p)) { p++; n--; }
+
+ return esl_msa_AddComment(msa, p, n);
+}
+/*------------- end, parsing Stockholm line types ---------------*/
+
+
+
+/*****************************************************************
+ * 4. Internal: looking up seq, tag indices
+ *****************************************************************/
+
+
+/* stockholm_get_seqidx()
+ *
+ * Find the index of a given sequence <name>,<n> in a growing <msa>
+ * with associated parse data <pdat>. If caller has a good guess (for
+ * instance, the sequences are coming in a previously seen order in a
+ * block of seqs or annotation), the caller can pass this information
+ * in <guess>, or -1 if it has no guess.
+ *
+ * If the name does not already exist in the MSA, then it
+ * is assumed to be a new sequence name that we need to store.
+ * seqidx is set to pdat->nseq, the MSA is Expand()'ed if necessary
+ * to make room, the name is stored in msa->sqname[pdat->nseq],
+ * (and in the hash table, if we're keyhash augmented)
+ * and pdat->nseq is incremented.
+ *
+ * Returns: <eslOK> on success, and the seqidx is
+ * passed back via <ret_idx>. If <name> is new
+ * in the <msa>, the <name> is stored and the <msa>
+ * may be internally reallocated if needed.
+ *
+ * Throws: <eslEMEM> on allocation failure
+ * <eslEINVAL> if we try to add a name to a non-growable MSA.
+ * <eslEINCONCEIVABLE> on internal coding errors
+ */
+static int
+stockholm_get_seqidx(ESL_MSA *msa, ESL_STOCKHOLM_PARSEDATA *pd, char *name, esl_pos_t n, int *ret_idx)
+{
+ int seqidx;
+ int status;
+
+ /* if we're keyhash-augmented, try to find it in the hash.
+ * if we're not, try to find it the hard way.
+ */
+#ifdef eslAUGMENT_KEYHASH
+ status = esl_keyhash_Store(msa->index, name, n, &seqidx);
+ if (status == eslEDUP) { *ret_idx = seqidx; return eslOK; }
+ if (status != eslOK) goto ERROR;
+#else
+ for (seqidx = 0; seqidx < pd->nseq; seqidx++)
+ if (esl_memstrcmp(name, n, msa->sqname[seqidx]))
+ { *ret_idx = seqidx; return eslOK; }
+#endif
+
+ /* if we get here, this is a new name we're adding */
+ if (seqidx >= msa->sqalloc) {
+ if ( (status = esl_msa_Expand(msa)) != eslOK) goto ERROR;
+ if ( (status = stockholm_parsedata_ExpandSeq(pd, msa)) != eslOK) goto ERROR;
+ }
+
+ if ( (status = esl_msa_SetSeqName(msa, seqidx, name, n)) != eslOK) goto ERROR;
+ pd->nseq++;
+ msa->nseq = pd->nseq; /* pd->nseq and msa->nseq must stay in lockstep */
+
+ *ret_idx = seqidx;
+ return eslOK;
+
+ ERROR:
+ *ret_idx = -1;
+ return status;
+}
+
+static int
+stockholm_get_gr_tagidx(ESL_MSA *msa, ESL_STOCKHOLM_PARSEDATA *pd, char *tag, esl_pos_t taglen, int *ret_tagidx)
+{
+ int tagidx;
+ int z;
+ int status;
+
+ /* Find the tag, if we have it; else, add it, at tagidx = msa->ngr */
+#ifdef eslAUGMENT_KEYHASH
+ if (!msa->gr_idx && (msa->gr_idx = esl_keyhash_CreateCustom(8,8,128)) == NULL) { status = eslEMEM; goto ERROR; }
+ status = esl_keyhash_Store(msa->gr_idx, tag, taglen, &tagidx);
+ if (status == eslEDUP) { *ret_tagidx = tagidx; return eslOK; }
+ else if (status != eslOK) goto ERROR;
+#else
+ for (tagidx = 0; tagidx < msa->ngr; tagidx++)
+ if (esl_memstrcmp(tag, taglen, msa->gr_tag[tagidx]))
+ { *ret_tagidx = tagidx; return eslOK; }
+#endif
+
+ /* if we get here, this is a new tag we're adding. */
+ ESL_REALLOC(msa->gr_tag, sizeof(char *) * (msa->ngr+1)); /* +1, we're allocated one new tag at a time, as needed */
+ ESL_REALLOC(msa->gr, sizeof(char **) * (msa->ngr+1));
+ ESL_REALLOC(pd->ogr_len, sizeof(int64_t *) * (msa->ngr+1));
+ msa->gr_tag[tagidx] = NULL;
+ msa->gr[tagidx] = NULL;
+ pd->ogr_len[tagidx] = NULL;
+ ESL_ALLOC(msa->gr[tagidx], sizeof(char *) * msa->sqalloc);
+ ESL_ALLOC(pd->ogr_len[tagidx], sizeof(int64_t) * msa->sqalloc);
+ for (z = 0; z < msa->sqalloc; z++) {
+ msa->gr[tagidx][z] = NULL;
+ pd->ogr_len[tagidx][z] = 0;
+ }
+
+ if ( (status = esl_memstrdup(tag, taglen, &(msa->gr_tag[tagidx]))) != eslOK) goto ERROR; /* eslEMEM */
+ msa->ngr++;
+ *ret_tagidx = tagidx;
+ return eslOK;
+
+ ERROR:
+ *ret_tagidx = -1;
+ return status;
+}
+
+static int
+stockholm_get_gc_tagidx(ESL_MSA *msa, ESL_STOCKHOLM_PARSEDATA *pd, char *tag, esl_pos_t taglen, int *ret_tagidx)
+{
+ int tagidx;
+ int status;
+
+ /* Find the tag, if we have it; else, add it, at tagidx = msa->ngc */
+#ifdef eslAUGMENT_KEYHASH
+ if (!msa->gc_idx && (msa->gc_idx = esl_keyhash_CreateCustom(8,8,128)) == NULL) { status = eslEMEM; goto ERROR; }
+ status = esl_keyhash_Store(msa->gc_idx, tag, taglen, &tagidx);
+ if (status == eslEDUP) { *ret_tagidx = tagidx; return eslOK; }
+ else if (status != eslOK) goto ERROR; /* eslEMEM */
+#else
+ for (tagidx = 0; tagidx < msa->ngc; tagidx++)
+ if (esl_memstrcmp(tag, taglen, msa->gc_tag[tagidx]))
+ { *ret_tagidx = tagidx; return eslOK; }
+#endif
+
+ /* if we get here, this is a new tag we're adding. */
+ ESL_REALLOC(msa->gc_tag, sizeof(char *) * (msa->ngc+1)); /* +1, we're allocated one new tag at a time, as needed */
+ ESL_REALLOC(msa->gc, sizeof(char *) * (msa->ngc+1));
+ ESL_REALLOC(pd->ogc_len, sizeof(int64_t) * (msa->ngc+1));
+ msa->gc_tag[tagidx] = NULL;
+ msa->gc[tagidx] = NULL;
+ pd->ogc_len[tagidx] = 0;
+
+ if ( (status = esl_memstrdup(tag, taglen, &(msa->gc_tag[tagidx]))) != eslOK) return status; /* eslEMEM */
+ msa->ngc++;
+ *ret_tagidx = tagidx;
+ return eslOK;
+
+ ERROR:
+ *ret_tagidx = -1;
+ return status;
+}
+/*------------ end, looking up seq, tag indices -----------------*/
+
+
+/*****************************************************************
+ * 5. Internal: writing Stockholm/Pfam format
+ *****************************************************************/
+
+/* stockholm_write()
+ * Returns: <eslOK> on success.
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEWRITE> on any system write error.
+ */
+static int
+stockholm_write(FILE *fp, const ESL_MSA *msa, int64_t cpl)
+{
+ int i, j;
+ int maxname; /* maximum name length */
+ int maxgf; /* max #=GF tag length */
+ int maxgc; /* max #=GC tag length */
+ int maxgr; /* max #=GR tag length */
+ int margin; /* total left margin width */
+ int gslen; /* length of a #=GS tag */
+ char *buf = NULL;
+ int currpos;
+ char *s, *tok;
+ int acpl; /* actual number of character per line */
+ int make_uniquenames = FALSE; /* TRUE if we force names to be unique */
+ int uniqwidth = 0;
+ int tmpnseq;
+ int status;
+
+ /* Stockholm files require unique seqnames. Don't allow the writer
+ * to create an invalid file.
+ */
+ status = esl_msa_CheckUniqueNames(msa);
+ if (status == eslFAIL) {
+ make_uniquenames = TRUE;
+ for (tmpnseq = msa->nseq; tmpnseq; tmpnseq /= 10) uniqwidth++; /* how wide the uniqizing numbers need to be */
+ uniqwidth++; /* uniqwidth includes the '|' */
+ } else if (status != eslOK) goto ERROR;
+
+ /* Figure out how much space we need for name + markup
+ * to keep the alignment in register.
+ *
+ * The left margin of an alignment block can be composed of:
+ *
+ * <seqname> max length: uniqwidth + maxname + 1
+ * #=GC <gc_tag> max length: 4 + 1 + maxgc + 1
+ * #=GR <seqname> <gr_tag> max length: 4 + 1 + uniqwidth + maxname + 1 + maxgr + 1
+ *
+ * <margin> is the max of these. It is the total length of the
+ * left margin that we need to leave, inclusive of the last space.
+ *
+ * Then when we output, we do:
+ * name: <leftmargin-uniqwidth-1>
+ * gc: #=GC <leftmargin-6>
+ * gr: #=GR <uniqwidth><maxname> <leftmargin-maxname-uniqwidth-7>
+ *
+ * because uniqwidth includes the |, field widths for uniqizing must be uniqwidth-1
+ *
+ * xref STL9/p17
+ */
+ maxname = esl_str_GetMaxWidth(msa->sqname, msa->nseq);
+
+ maxgf = esl_str_GetMaxWidth(msa->gf_tag, msa->ngf);
+ if (maxgf < 2) maxgf = 2;
+
+ maxgc = esl_str_GetMaxWidth(msa->gc_tag, msa->ngc);
+ if (msa->rf && maxgc < 2) maxgc = 2;
+ if (msa->mm && maxgc < 2) maxgc = 2;
+ if (msa->ss_cons && maxgc < 7) maxgc = 7;
+ if (msa->sa_cons && maxgc < 7) maxgc = 7;
+ if (msa->pp_cons && maxgc < 7) maxgc = 7;
+
+ maxgr = esl_str_GetMaxWidth(msa->gr_tag, msa->ngr);
+ if (msa->ss && maxgr < 2) maxgr = 2;
+ if (msa->sa && maxgr < 2) maxgr = 2;
+ if (msa->pp && maxgr < 2) maxgr = 2;
+
+ margin = uniqwidth + maxname + 1;
+ if (maxgc > 0 && maxgc+6 > margin) margin = maxgc+6;
+ if (maxgr > 0 && uniqwidth+maxname+maxgr+7 > margin) margin = uniqwidth+maxname+maxgr+7;
+
+ /* Allocate a tmp buffer to hold sequence chunks in */
+ ESL_ALLOC(buf, sizeof(char) * (cpl+1));
+
+ /* Magic Stockholm header */
+ if (fprintf(fp, "# STOCKHOLM 1.0\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+
+ /* Warning about uniqization */
+ if (make_uniquenames && fprintf(fp, "# WARNING: seq names have been made unique by adding a prefix of \"<seq#>|\"\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+
+ /* Free text comment section */
+ for (i = 0; i < msa->ncomment; i++)
+ if (fprintf(fp, "#%s\n", msa->comment[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ if (msa->ncomment > 0 && fprintf(fp, "\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+
+ /* GF section: per-file annotation */
+ if (msa->name && fprintf(fp, "#=GF %-*s %s\n", maxgf, "ID", msa->name) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ if (msa->acc && fprintf(fp, "#=GF %-*s %s\n", maxgf, "AC", msa->acc) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ if (msa->desc && fprintf(fp, "#=GF %-*s %s\n", maxgf, "DE", msa->desc) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ if (msa->au && fprintf(fp, "#=GF %-*s %s\n", maxgf, "AU", msa->au) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+
+ /* Thresholds are hacky. Pfam has two. Rfam has one. */
+ if (msa->cutset[eslMSA_GA1] && msa->cutset[eslMSA_GA2]) { if (fprintf(fp, "#=GF %-*s %.1f %.1f\n", maxgf, "GA", msa->cutoff[eslMSA_GA1], msa->cutoff[eslMSA_GA2]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else if (msa->cutset[eslMSA_GA1]) { if (fprintf(fp, "#=GF %-*s %.1f\n", maxgf, "GA", msa->cutoff[eslMSA_GA1]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+
+ if (msa->cutset[eslMSA_NC1] && msa->cutset[eslMSA_NC2]) { if (fprintf(fp, "#=GF %-*s %.1f %.1f\n", maxgf, "NC", msa->cutoff[eslMSA_NC1], msa->cutoff[eslMSA_NC2]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else if (msa->cutset[eslMSA_NC1]) { if (fprintf(fp, "#=GF %-*s %.1f\n", maxgf, "NC", msa->cutoff[eslMSA_NC1]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+
+ if (msa->cutset[eslMSA_TC1] && msa->cutset[eslMSA_TC2]) { if (fprintf(fp, "#=GF %-*s %.1f %.1f\n", maxgf, "TC", msa->cutoff[eslMSA_TC1], msa->cutoff[eslMSA_TC2]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else if (msa->cutset[eslMSA_TC1]) { if (fprintf(fp, "#=GF %-*s %.1f\n", maxgf, "TC", msa->cutoff[eslMSA_TC1]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+
+ for (i = 0; i < msa->ngf; i++)
+ if (fprintf(fp, "#=GF %-*s %s\n", maxgf, msa->gf_tag[i], msa->gf[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ if (fprintf(fp, "\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+
+
+ /* GS section: per-sequence annotation */
+ if (msa->flags & eslMSA_HASWGTS) {
+ for (i = 0; i < msa->nseq; i++)
+ if (make_uniquenames) { if (fprintf(fp, "#=GS %0*d|%-*s WT %.2f\n", uniqwidth-1, i, maxname, msa->sqname[i], msa->wgt[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else { if (fprintf(fp, "#=GS %-*s WT %.2f\n", maxname, msa->sqname[i], msa->wgt[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ if (fprintf(fp, "\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ }
+
+ if (msa->sqacc) {
+ for (i = 0; i < msa->nseq; i++)
+ if (msa->sqacc[i]) {
+ if (make_uniquenames) { if (fprintf(fp, "#=GS %0*d|%-*s AC %s\n", uniqwidth-1, i, maxname, msa->sqname[i], msa->sqacc[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else { if (fprintf(fp, "#=GS %-*s AC %s\n", maxname, msa->sqname[i], msa->sqacc[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ }
+ if (fprintf(fp, "\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ }
+
+ if (msa->sqdesc) {
+ for (i = 0; i < msa->nseq; i++)
+ if (msa->sqdesc[i]) {
+ if (make_uniquenames) { if (fprintf(fp, "#=GS %0*d|%-*s DE %s\n", uniqwidth-1, i, maxname, msa->sqname[i], msa->sqdesc[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else { if (fprintf(fp, "#=GS %-*s DE %s\n", maxname, msa->sqname[i], msa->sqdesc[i]) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ }
+ if (fprintf(fp, "\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ }
+
+ /* Multiannotated GS tags are possible; for example,
+ * #=GS foo DR PDB; 1xxx;
+ * #=GS foo DR PDB; 2yyy;
+ * These are stored, for example, as:
+ * msa->gs[0][0] = "PDB; 1xxx;\nPDB; 2yyy;"
+ * and must be decomposed.
+ */
+ for (i = 0; i < msa->ngs; i++)
+ {
+ gslen = strlen(msa->gs_tag[i]);
+ for (j = 0; j < msa->nseq; j++)
+ if (msa->gs[i][j]) {
+ s = msa->gs[i][j];
+ while (esl_strtok(&s, "\n", &tok) == eslOK)
+ if (make_uniquenames) { if (fprintf(fp, "#=GS %0*d|%-*s %-*s %s\n", uniqwidth-1, i, maxname, msa->sqname[j], gslen, msa->gs_tag[i], tok) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else { if (fprintf(fp, "#=GS %-*s %-*s %s\n", maxname, msa->sqname[j], gslen, msa->gs_tag[i], tok) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ }
+ if (fprintf(fp, "\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ }
+
+ /* Alignment section:
+ * contains aligned sequence, #=GR annotation, and #=GC annotation
+ */
+ for (currpos = 0; currpos < msa->alen; currpos += cpl)
+ {
+ acpl = (msa->alen - currpos > cpl)? cpl : msa->alen - currpos;
+ buf[acpl] = '\0'; /* this suffices to terminate for all uses of buf[] in this block */
+ if (currpos > 0 && fprintf(fp, "\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+
+ for (i = 0; i < msa->nseq; i++)
+ {
+#ifdef eslAUGMENT_ALPHABET
+ if (msa->abc) esl_abc_TextizeN(msa->abc, msa->ax[i] + currpos + 1, acpl, buf);
+#endif
+ if (! msa->abc) strncpy(buf, msa->aseq[i] + currpos, acpl);
+ if (make_uniquenames) { if (fprintf(fp, "%0*d|%-*s %s\n", uniqwidth-1, i, margin-uniqwidth-1, msa->sqname[i], buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else { if (fprintf(fp, "%-*s %s\n", margin-1, msa->sqname[i], buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+
+ if (msa->ss && msa->ss[i]) {
+ strncpy(buf, msa->ss[i] + currpos, acpl);
+ if (make_uniquenames) { if (fprintf(fp, "#=GR %0*d|%-*s %-*s %s\n", uniqwidth-1, i, maxname, msa->sqname[i], margin-maxname-uniqwidth-7, "SS", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else { if (fprintf(fp, "#=GR %-*s %-*s %s\n", maxname, msa->sqname[i], margin-maxname-7, "SS", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ }
+ if (msa->sa && msa->sa[i]) {
+ strncpy(buf, msa->sa[i] + currpos, acpl);
+ if (make_uniquenames) { if (fprintf(fp, "#=GR %0*d|%-*s %-*s %s\n", uniqwidth-1, i, maxname, msa->sqname[i], margin-maxname-uniqwidth-7, "SA", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else { if (fprintf(fp, "#=GR %-*s %-*s %s\n", maxname, msa->sqname[i], margin-maxname-7, "SA", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ }
+ if (msa->pp && msa->pp[i]) {
+ strncpy(buf, msa->pp[i] + currpos, acpl);
+ if (make_uniquenames) { if (fprintf(fp, "#=GR %0*d|%-*s %-*s %s\n", uniqwidth-1, i, maxname, msa->sqname[i], margin-maxname-uniqwidth-7, "PP", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else { if (fprintf(fp, "#=GR %-*s %-*s %s\n", maxname, msa->sqname[i], margin-maxname-7, "PP", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ }
+ for (j = 0; j < msa->ngr; j++)
+ if (msa->gr[j][i]) {
+ strncpy(buf, msa->gr[j][i] + currpos, acpl);
+ if (make_uniquenames) { if (fprintf(fp, "#=GR %0*d|%-*s %-*s %s\n", uniqwidth-1, i, maxname, msa->sqname[i], margin-maxname-uniqwidth-7, msa->gr_tag[j], buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ else { if (fprintf(fp, "#=GR %-*s %-*s %s\n", maxname, msa->sqname[i], margin-maxname-7, msa->gr_tag[j], buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed"); }
+ }
+ }
+
+ if (msa->ss_cons) {
+ strncpy(buf, msa->ss_cons + currpos, acpl);
+ if (fprintf(fp, "#=GC %-*s %s\n", margin-6, "SS_cons", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ }
+ if (msa->sa_cons) {
+ strncpy(buf, msa->sa_cons + currpos, acpl);
+ if (fprintf(fp, "#=GC %-*s %s\n", margin-6, "SA_cons", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ }
+ if (msa->pp_cons) {
+ strncpy(buf, msa->pp_cons + currpos, acpl);
+ if (fprintf(fp, "#=GC %-*s %s\n", margin-6, "PP_cons", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ }
+ if (msa->rf) {
+ strncpy(buf, msa->rf + currpos, acpl);
+ if (fprintf(fp, "#=GC %-*s %s\n", margin-6, "RF", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ }
+ if (msa->mm) {
+ strncpy(buf, msa->mm + currpos, acpl);
+ if (fprintf(fp, "#=GC %-*s %s\n", margin-6, "MM", buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ }
+ for (j = 0; j < msa->ngc; j++) {
+ strncpy(buf, msa->gc[j] + currpos, acpl);
+ if (fprintf(fp, "#=GC %-*s %s\n", margin-6, msa->gc_tag[j], buf) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ }
+ }
+ if (fprintf(fp, "//\n") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "stockholm msa write failed");
+ free(buf);
+ return eslOK;
+
+ ERROR:
+ if (buf != NULL) free(buf);
+ return status;
+}
+/*----------------- end, writing Stockholm/Pfam -----------------*/
+
+
+
+/*****************************************************************
+ * 6. Unit tests
+ *****************************************************************/
+#ifdef eslMSAFILE_STOCKHOLM_TESTDRIVE
+
+static void
+utest_write_good1(FILE *ofp, int *ret_alphatype, int *ret_nseq, int *ret_alen)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#\n", ofp);
+ fputs("# This is an example of a Stockholm multiple sequence alignment\n", ofp);
+ fputs("# file. It is deliberately designed to be weird, to exercise many of the\n", ofp);
+ fputs("# features of Stockholm format, in order to test a parser.\n", ofp);
+ fputs("#\n", ofp);
+ fputs("#=GF ID 14-3-3\n", ofp);
+ fputs("#=GF AC PF00244\n", ofp);
+ fputs("#=GF DE 14-3-3 proteins\n", ofp);
+ fputs("#=GF AU Finn RD\n", ofp);
+ fputs("#=GF AL Clustalw\n", ofp);
+ fputs("#=GF SE Prosite\n", ofp);
+ fputs("#=GF GA 25 25\n", ofp);
+ fputs("#=GF TC 35.40 35.40\n", ofp);
+ fputs("#=GF NC 8.80 8.80\n", ofp);
+ fputs("#=GF BM hmmbuild -f HMM SEED\n", ofp);
+ fputs("#=GF BM hmmcalibrate --seed 0 HMM\n", ofp);
+ fputs("#=GF RN [1]\n", ofp);
+ fputs("#=GF RM 95327195\n", ofp);
+ fputs("#=GF RT Structure of a 14-3-3 protein and implications for\n", ofp);
+ fputs("#=GF RT coordination of multiple signalling pathways. \n", ofp);
+ fputs("#=GF RA Xiao B, Smerdon SJ, Jones DH, Dodson GG, Soneji Y, Aitken\n", ofp);
+ fputs("#=GF RA A, Gamblin SJ; \n", ofp);
+ fputs("#=GF RL Nature 1995;376:188-191.\n", ofp);
+ fputs("#=GF RN [2]\n", ofp);
+ fputs("#=GF RM 95327196\n", ofp);
+ fputs("#=GF RT Crystal structure of the zeta isoform of the 14-3-3\n", ofp);
+ fputs("#=GF RT protein. \n", ofp);
+ fputs("#=GF RA Liu D, Bienkowska J, Petosa C, Collier RJ, Fu H, Liddington\n", ofp);
+ fputs("#=GF RA R; \n", ofp);
+ fputs("#=GF RL Nature 1995;376:191-194.\n", ofp);
+ fputs("#=GF DR PROSITE; PDOC00633;\n", ofp);
+ fputs("#=GF DR SMART; 14_3_3;\n", ofp);
+ fputs("#=GF DR PRINTS; PR00305;\n", ofp);
+ fputs("#=GF SQ 119\n", ofp);
+ fputs(" \n", ofp);
+ fputs("#=GS 1431_ENTHI/4-239 WT 0.42\n", ofp);
+ fputs("#=GS seq1 WT 0.40\n", ofp);
+ fputs("#=GS seq2 WT 0.41\n", ofp);
+ fputs("#=GS seq3 WT 0.43\n", ofp);
+ fputs("#=GS seq4 WT 0.44\n", ofp);
+ fputs("#=GS seq5 WT 0.45\n", ofp);
+ fputs("#=GS seq6 WT 0.46\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GS seq4 AC PF00001\n", ofp);
+ fputs("#=GS seq4 DE A description of seq4.\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GS seq1 NEWTAG foo\n", ofp);
+ fputs("#=GS seq2 NEWTAG bar\n", ofp);
+ fputs("#=GS seq3 NEWTAG baz \n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GS seq3 TAG2 foo2\n", ofp);
+ fputs("#=GS seq4 TAG2 foo3\n", ofp);
+ fputs("#=GS seq5 TAG2 foo4\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GC SS_cons xxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("#=GC SA_cons xxxxxxxxxxxxxxxxxxx \n", ofp);
+ fputs("#=GC New_long_tag_thingie xxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("1431_ENTHI/4-239 ACDEFGHKLMNPQRSTVWY \n", ofp);
+ fputs("#=GR seq1 SS ................... \n", ofp);
+ fputs("#=GR seq1 SA 0000000000000000000\n", ofp);
+ fputs("seq1 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq3 PP 0000000000000000000 \n", ofp);
+ fputs("seq3 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("seq4 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("seq5 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("seq6 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq6 SS ...................\n", ofp);
+ fputs("#=GR seq6 SA 9999999999999999999\n", ofp);
+ fputs("#=GR seq6 Invented_tag *******************\n", ofp);
+ fputs("#=GR seq6 Another_tag -------------------\n", ofp);
+ fputs("#=GC PP_cons ******************* \n", ofp);
+ fputs(" \n", ofp);
+ fputs(" \n", ofp);
+ fputs("#=GC SS_cons xxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("#=GC SA_cons xxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("#=GC New_long_tag_thingie xxxxxxxxxxxxxxxxxxx \n", ofp);
+ fputs("1431_ENTHI/4-239 ACDEFGHKLMNPQRSTVWY \n", ofp);
+ fputs("#=GR seq1 SS ...................\n", ofp);
+ fputs("#=GR seq1 SA 0000000000000000000\n", ofp);
+ fputs("seq1 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHKLMNPQRSTVWY \n", ofp);
+ fputs("#=GR seq3 PP 0000000000000000000 \n", ofp);
+ fputs("seq3 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("seq4 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("seq5 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("seq6 ACDEFGHKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq6 SS ...................\n", ofp);
+ fputs("#=GR seq6 SA 9999999999999999999\n", ofp);
+ fputs("#=GR seq6 Invented_tag ******************* \n", ofp);
+ fputs("#=GR seq6 Another_tag -------------------\n", ofp);
+ fputs("#=GC PP_cons ******************* \n", ofp);
+ fputs("\n", ofp);
+ fputs("#\n", ofp);
+ fputs("# And here's some trailing comments, just to\n", ofp);
+ fputs("# try to confuse a parser.\n", ofp);
+ fputs("#\n", ofp);
+ fputs("\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_alphatype = eslAMINO;
+ *ret_nseq = 7;
+ *ret_alen = 38;
+}
+
+static void
+utest_write_badformat1(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("missing Stockholm header\n", ofp);
+
+ *ret_linenumber = 1;
+ strcpy(errmsg, "missing Stockholm header");
+}
+
+static void
+utest_write_badformat2(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 7;
+ strcpy(errmsg, "number of seqs in block did not match number in earlier block(s)");
+}
+
+static void
+utest_write_badformat3(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GS seq1 FOO baz\n", ofp);
+ fputs("#=GS seq2 FOO boz\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 7;
+ strcpy(errmsg, "number of seqs in block did not match number annotated by #=GS lines");
+}
+
+static void
+utest_write_badformat4(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+
+ *ret_linenumber = 4;
+ strcpy(errmsg, "missing // terminator after MSA");
+}
+
+static void
+utest_write_badformat5(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("\n", ofp);
+ fputs("# No data\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 4;
+ strcpy(errmsg, "no alignment data followed Stockholm header");
+}
+
+static void
+utest_write_badformat6(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GF \n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 3;
+ strcpy(errmsg, "#=GF line is missing <tag>, annotation");
+}
+
+static void
+utest_write_badformat7(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GFX tag\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "faux #=GF line");
+}
+
+static void
+utest_write_badformat8(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF ID\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "No name found on #=GF ID line");
+}
+
+static void
+utest_write_badformat9(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF ID name with cruft\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "#=GF ID line should have only one name (no whitespace allowed)");
+}
+
+static void
+utest_write_badformat10(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF AC \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "No accession found on #=GF AC line");
+}
+
+static void
+utest_write_badformat11(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF AC accession with cruft \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "#=GF AC line should have only one accession (no whitespace allowed)");
+}
+
+static void
+utest_write_badformat12(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF GA not_a_number \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "Expected a real number for GA1 value on #=GF GA line");
+}
+
+static void
+utest_write_badformat13(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF GA 10.0 not_a_number \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "Expected a real number for GA2 value on #=GF GA line");
+}
+
+static void
+utest_write_badformat14(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF GA \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "No GA threshold value found on #=GF GA line");
+}
+
+static void
+utest_write_badformat15(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF NC not_a_number \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "Expected a real number for NC1 value on #=GF NC line");
+}
+
+static void
+utest_write_badformat16(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF NC 10.0 not_a_number \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "Expected a real number for NC2 value on #=GF NC line");
+}
+
+static void
+utest_write_badformat17(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF NC \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "No NC threshold value found on #=GF NC line");
+}
+
+static void
+utest_write_badformat18(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF TC not_a_number \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "Expected a real number for TC1 value on #=GF TC line");
+}
+
+static void
+utest_write_badformat19(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF TC 10.0 not_a_number \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "Expected a real number for TC2 value on #=GF TC line");
+}
+
+static void
+utest_write_badformat20(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GF TC \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "No TC threshold value found on #=GF TC line");
+}
+
+static void
+utest_write_badformat21(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GS \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "#=GS line missing <seqname>, <tag>, annotation");
+}
+
+static void
+utest_write_badformat22(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GS seq1 \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "#=GS line missing <tag>, annotation");
+}
+
+static void
+utest_write_badformat23(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GSX seq1 foo \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "faux #=GS line");
+}
+
+static void
+utest_write_badformat24(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GS seq1 WT \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "no weight value found on #=GS <seqname> WT line");
+}
+
+static void
+utest_write_badformat25(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GS seq1 WT 2.0 \n", ofp);
+ fputs("#=GS seq1 WT 2.0 \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 3;
+ strcpy(errmsg, "sequence has more than one #=GS <seqname> WT line");
+}
+
+static void
+utest_write_badformat26(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GS seq1 WT 2.0 cruft \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "#=GS <seqname> WT line should have only one field, the weight");
+}
+
+static void
+utest_write_badformat27(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GS seq1 WT cruft \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "value on #=GS <seqname> WT line isn't a real number");
+}
+
+static void
+utest_write_badformat28(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GS seq1 AC \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "no accession found on #=GS <seqname> AC line");
+}
+
+static void
+utest_write_badformat29(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GS seq1 AC xxxxxx \n", ofp);
+ fputs("#=GS seq1 AC yyyyyy \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 3;
+ strcpy(errmsg, "sequence has more than one #=GS <seqname> AC accession line");
+}
+
+static void
+utest_write_badformat30(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GS seq1 AC xxxxxx cruft \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "#=GS <seqname> AC line should have only one field, the accession");
+}
+
+static void
+utest_write_badformat31(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GS seq1 DE a one line description \n", ofp);
+ fputs("#=GS seq1 DE oops, a second line \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 3;
+ strcpy(errmsg, "sequence has more than one #=GS <seqname> DE accession line");
+}
+
+static void
+utest_write_badformat32(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GC \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "#=GC line missing <tag>, annotation");
+}
+
+static void
+utest_write_badformat33(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GCX FOO xxxxxxxxxxxxxxxxxxxx \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "faux #=GC line");
+}
+
+static void
+utest_write_badformat34(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GC FOO \n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "#=GC line missing annotation");
+}
+
+static void
+utest_write_badformat35(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC SS_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GC SS_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 6;
+ strcpy(errmsg, "unexpected #=GC SS_cons");
+}
+
+static void
+utest_write_badformat36(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC SA_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GC SA_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 6;
+ strcpy(errmsg, "unexpected #=GC SA_cons");
+}
+
+static void
+utest_write_badformat37(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC PP_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GC PP_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 6;
+ strcpy(errmsg, "unexpected #=GC PP_cons");
+}
+
+static void
+utest_write_badformat38(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC RF xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GC RF xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 6;
+ strcpy(errmsg, "unexpected #=GC RF");
+}
+
+static void
+utest_write_badformat39(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("\n", ofp);
+ fputs("#=GC XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 6;
+ strcpy(errmsg, "unexpected #=GC line");
+}
+
+static void
+utest_write_badformat40(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GC SS_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC SS_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 5;
+ strcpy(errmsg, "more than one #=GC SS_cons line in block");
+}
+
+static void
+utest_write_badformat41(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GC SA_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC SA_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 5;
+ strcpy(errmsg, "more than one #=GC SA_cons line in block");
+}
+
+static void
+utest_write_badformat42(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GC PP_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC PP_cons xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 5;
+ strcpy(errmsg, "more than one #=GC PP_cons line in block");
+}
+
+static void
+utest_write_badformat43(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GC RF xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC RF xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 5;
+ strcpy(errmsg, "more than one #=GC RF line in block");
+}
+
+static void
+utest_write_badformat44(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GC XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 5;
+ strcpy(errmsg, "more than one #=GC XX line in block");
+}
+
+static void
+utest_write_badformat45(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GC XX xxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 4;
+ strcpy(errmsg, "unexpected # of aligned annotation in #=GC XX line");
+}
+
+static void
+utest_write_badformat46(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR \n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 3;
+ strcpy(errmsg, "#=GR line missing <seqname>, <tag>, annotation");
+}
+
+static void
+utest_write_badformat47(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq1 \n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 3;
+ strcpy(errmsg, "#=GR line missing <tag>, annotation");
+}
+
+static void
+utest_write_badformat48(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GRX seq1 XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 3;
+ strcpy(errmsg, "faux #=GR line");
+}
+
+static void
+utest_write_badformat49(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq1 XX \n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 3;
+ strcpy(errmsg, "#=GR line missing annotation");
+}
+
+static void
+utest_write_badformat50(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 SS xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 SS xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 7;
+ strcpy(errmsg, "unexpected #=GR <seqname> SS");
+}
+
+static void
+utest_write_badformat51(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 SA xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 SA xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 7;
+ strcpy(errmsg, "unexpected #=GR <seqname> SA");
+}
+
+static void
+utest_write_badformat52(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 PP xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 PP xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 7;
+ strcpy(errmsg, "unexpected #=GR <seqname> PP");
+}
+
+static void
+utest_write_badformat53(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 7;
+ strcpy(errmsg, "unexpected #=GR line");
+}
+
+static void
+utest_write_badformat54(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq1 XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 7;
+ strcpy(errmsg, "unexpected seqname seq2; expected seq1 from prev blocks");
+}
+
+static void
+utest_write_badformat55(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GR seq1 SS xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq1 SS xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 4;
+ strcpy(errmsg, "more than one #=GR seq1 SS line in block");
+}
+
+static void
+utest_write_badformat56(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GR seq1 PP xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq1 PP xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 4;
+ strcpy(errmsg, "more than one #=GR seq1 PP line in block");
+}
+
+static void
+utest_write_badformat57(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GR seq1 SA xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq1 SA xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 4;
+ strcpy(errmsg, "more than one #=GR seq1 SA line in block");
+}
+
+static void
+utest_write_badformat58(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("#=GR seq1 XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq1 XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 4;
+ strcpy(errmsg, "more than one #=GR seq1 XX line in block");
+}
+
+static void
+utest_write_badformat59(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 XX xxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 4;
+ strcpy(errmsg, "unexpected # of aligned annotation in #=GR seq2 XX line");
+}
+
+static void
+utest_write_badformat60(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 \n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 3;
+ strcpy(errmsg, "sequence line with no sequence");
+}
+
+static void
+utest_write_badformat61(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 7;
+ strcpy(errmsg, "more lines than expected; earlier blocks had fewer");
+}
+
+static void
+utest_write_badformat62(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("#=GR seq2 XX xxxxxxxxxxxxxxxxxxxx\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 7;
+ strcpy(errmsg, "unexpected seq line; earlier block(s) in different order");
+}
+
+static void
+utest_write_badformat63(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq3 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq3 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 7;
+ strcpy(errmsg, "unexpected seq name seq3; expected seq2 from prev block order");
+}
+
+static void
+utest_write_badformat64(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKL^NPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 2;
+ strcpy(errmsg, "invalid sequence character(s) on line");
+}
+
+static void
+utest_write_badformat65(FILE *ofp, int *ret_linenumber, char *errmsg)
+{
+ fputs("# STOCKHOLM 1.0\n", ofp);
+ fputs("seq1 ACDEFGHIKLMNPQRSTVWY\n", ofp);
+ fputs("seq2 ACDEFGHIKLMNPQRSTVWYZ\n", ofp);
+ fputs("//\n", ofp);
+
+ *ret_linenumber = 3;
+ strcpy(errmsg, "unexpected number of aligned residues parsed on line");
+}
+
+
+static void
+utest_goodfile(char *filename, int testnumber, int expected_alphatype, int expected_nseq, int expected_alen)
+{
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa1 = NULL;
+ ESL_MSA *msa2 = NULL;
+ char tmpfile1[32] = "esltmpXXXXXX";
+ char tmpfile2[32] = "esltmpXXXXXX";
+ FILE *ofp = NULL;
+ int status;
+
+ /* guessing both the format and the alphabet should work: this is a digital open */
+ if ( (status = esl_msafile_Open(&abc, filename, NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK) esl_fatal("stockholm good file test %d failed: digital open", testnumber);
+ if (abc->type != expected_alphatype) esl_fatal("stockholm good file test %d failed: alphabet autodetection", testnumber);
+ if (afp->format != eslMSAFILE_STOCKHOLM) esl_fatal("stockholm good file test %d failed: format autodetection", testnumber); /* eslMSAFILE_PFAM is autodetected as STOCKHOLM, and that's fine */
+
+ /* This is a digital read, using <abc>. */
+ if ( (status = esl_msafile_stockholm_Read(afp, &msa1)) != eslOK) esl_fatal("stockholm good file test %d failed: msa read, digital", testnumber);
+ if (msa1->nseq != expected_nseq || msa1->alen != expected_alen) esl_fatal("stockholm good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa1, NULL) != eslOK) esl_fatal("stockholm good file test %d failed: msa1 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (digital write) */
+ if ( (status = esl_tmpfile_named(tmpfile1, &ofp)) != eslOK) esl_fatal("stockholm good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_stockholm_Write(ofp, msa1, eslMSAFILE_STOCKHOLM)) != eslOK) esl_fatal("stockholm good file test %d failed: msa write, digital", testnumber);
+ fclose(ofp);
+
+ /* now open and read it as text mode, in known format. (We have to pass fmtd now, to deal with the possibility of a nonstandard name width) */
+ if ( (status = esl_msafile_Open(NULL, tmpfile1, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp)) != eslOK) esl_fatal("stockholm good file test %d failed: text mode open", testnumber);
+ if ( (status = esl_msafile_stockholm_Read(afp, &msa2)) != eslOK) esl_fatal("stockholm good file test %d failed: msa read, text", testnumber);
+ if (msa2->nseq != expected_nseq || msa2->alen != expected_alen) esl_fatal("stockholm good file test %d failed: nseq/alen", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("stockholm good file test %d failed: msa2 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* write it back out to a new tmpfile (text write) */
+ if ( (status = esl_tmpfile_named(tmpfile2, &ofp)) != eslOK) esl_fatal("stockholm good file test %d failed: tmpfile creation", testnumber);
+ if ( (status = esl_msafile_stockholm_Write(ofp, msa2, eslMSAFILE_PFAM)) != eslOK) esl_fatal("stockholm good file test %d failed: msa write, text", testnumber);
+ fclose(ofp);
+ esl_msa_Destroy(msa2);
+
+ /* open and read it in digital mode */
+ if ( (status = esl_msafile_Open(&abc, tmpfile1, NULL, eslMSAFILE_PFAM, NULL, &afp)) != eslOK) esl_fatal("stockholm good file test %d failed: 2nd digital mode open", testnumber);
+ if ( (status = esl_msafile_stockholm_Read(afp, &msa2)) != eslOK) esl_fatal("stockholm good file test %d failed: 2nd digital msa read", testnumber);
+ if (esl_msa_Validate(msa2, NULL) != eslOK) esl_fatal("stockholm good file test %d failed: msa2 invalid", testnumber);
+ esl_msafile_Close(afp);
+
+ /* this msa <msa2> should be identical to <msa1> */
+ if (esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal("stockholm good file test %d failed: msa compare", testnumber);
+
+ remove(tmpfile1);
+ remove(tmpfile2);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_alphabet_Destroy(abc);
+}
+
+static void
+utest_bad_format(char *filename, int testnumber, int expected_linenumber, char *expected_errmsg)
+{
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslAMINO);
+ ESL_MSAFILE *afp = NULL;
+ int fmt = eslMSAFILE_STOCKHOLM;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if ( (status = esl_msafile_Open(&abc, filename, NULL, fmt, NULL, &afp)) != eslOK) esl_fatal("stockholm bad format test %d failed: unexpected open failure", testnumber);
+ if ( (status = esl_msafile_stockholm_Read(afp, &msa)) != eslEFORMAT) esl_fatal("stockholm bad format test %d failed: unexpected error code", testnumber);
+ if (strstr(afp->errmsg, expected_errmsg) == NULL) esl_fatal("stockholm bad format test %d failed: unexpected errmsg", testnumber);
+ if (afp->linenumber != expected_linenumber) esl_fatal("stockholm bad format test %d failed: unexpected linenumber", testnumber);
+ esl_msafile_Close(afp);
+ esl_alphabet_Destroy(abc);
+ esl_msa_Destroy(msa);
+}
+
+
+static void
+utest_good_format(ESL_ALPHABET **byp_abc, int fmt, int expected_nseq, int64_t expected_alen, char *buf)
+{
+ char msg[] = "good format test failed";
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+
+ if (esl_msafile_OpenMem(byp_abc, buf, strlen(buf), fmt, NULL, &afp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_stockholm_Read(afp, &msa) != eslOK) esl_fatal(msg);
+ if (msa->nseq != expected_nseq) esl_fatal(msg);
+ if (msa->alen != expected_alen) esl_fatal(msg);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+}
+
+static void
+utest_identical_io(ESL_ALPHABET **byp_abc, int fmt, char *buf)
+{
+ char msg[] = "identical io test failed";
+ char tmpfile1[32] = "esltmpXXXXXX";
+ char tmpfile2[32] = "esltmpXXXXXX";
+ FILE *fp = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa1 = NULL;
+ ESL_MSA *msa2 = NULL;
+
+ if (esl_tmpfile_named(tmpfile1, &fp) != eslOK) esl_fatal(msg);
+ fputs(buf, fp);
+ fclose(fp);
+
+ if (esl_msafile_Open(byp_abc, tmpfile1, NULL, fmt, NULL, &afp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_stockholm_Read(afp, &msa1) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(afp);
+
+ if (esl_tmpfile_named(tmpfile2, &fp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_stockholm_Write(fp, msa1, eslMSAFILE_STOCKHOLM) != eslOK) esl_fatal(msg);
+ fclose(fp);
+
+ if (esl_msafile_Open(byp_abc, tmpfile2, NULL, fmt, NULL, &afp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_stockholm_Read(afp, &msa2) != eslOK) esl_fatal(msg);
+ esl_msafile_Close(afp);
+
+ if (esl_msa_Compare(msa1, msa2) != eslOK) esl_fatal(msg);
+
+ remove(tmpfile1);
+ remove(tmpfile2);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+}
+
+static void
+utest_bad_open(ESL_ALPHABET **byp_abc, int fmt, int expected_status, char *buf)
+{
+ char msg[] = "bad open test failed";
+ ESL_MSAFILE *afp = NULL;
+
+ if (esl_msafile_OpenMem(byp_abc, buf, strlen(buf), fmt, NULL, &afp) != expected_status) esl_fatal(msg);
+ esl_msafile_Close(afp);
+}
+
+static void
+utest_bad_read(ESL_ALPHABET **byp_abc, int fmt, char *expected_errmsg, int expected_line, char *buf)
+{
+ char msg[] = "bad format test failed";
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+
+ if (esl_msafile_OpenMem(byp_abc, buf, strlen(buf), fmt, NULL, &afp) != eslOK) esl_fatal(msg);
+ if (esl_msafile_stockholm_Read(afp, &msa) != eslEFORMAT) esl_fatal(msg);
+ if (strstr(afp->errmsg, expected_errmsg) == NULL) esl_fatal(msg);
+ if (afp->linenumber != expected_line) esl_fatal(msg);
+
+ esl_msa_Destroy(msa);
+ esl_msafile_Close(afp);
+}
+#endif /*eslMSAFILE_STOCKHOLM_TESTDRIVE*/
+/*----------------- end, unit tests -----------------------------*/
+
+
+
+/*****************************************************************
+ * 7. Test driver.
+ *****************************************************************/
+#ifdef eslMSAFILE_STOCKHOLM_TESTDRIVE
+/* compile: gcc -g -Wall -I. -L. -o esl_msafile_stockholm_utest -DeslMSAFILE_STOCKHOLM_TESTDRIVE esl_msafile_stockholm.c -leasel -lm
+ * (gcov): gcc -g -Wall -fprofile-arcs -ftest-coverage -I. -L. -o esl_msafile_stockholm_utest -DeslMSAFILE_STOCKHOLM_TESTDRIVE esl_msafile_stockholm.c -leasel -lm
+ * run: ./esl_msafile_stockholm_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_msafile.h"
+#include "esl_msafile_stockholm.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for Stockholm/Xfam MSA format module";
+
+int
+main(int argc, char **argv)
+{
+ char msg[] = "Stockholm MSA i/o module test driver failed";
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ int ngoodtests = 1;
+ int nbadtests = 65;
+ char tmpfile[32];
+ FILE *ofp;
+ int testnumber;
+ int expected_alphatype;
+ int expected_nseq;
+ int expected_alen;
+ int expected_linenumber;
+ char expected_errmsg[eslERRBUFSIZE];
+
+ utest_bad_open(NULL, eslMSAFILE_UNKNOWN, eslENOFORMAT, "");
+
+ utest_bad_read(NULL, eslMSAFILE_UNKNOWN, "missing // terminator", 1, "# STOCKHOLM 1.0\n");
+ utest_bad_read(NULL, eslMSAFILE_UNKNOWN, "no alignment data", 2, "# STOCKHOLM 1.0\n//\n");
+
+ utest_good_format(NULL, eslMSAFILE_UNKNOWN, 2, 10, "\n# STOCKHOLM 1.0\n\nseq1 ACDEFGHIKL\nseq2 ACDEFGHIKL\n\n//\n\n");
+
+ utest_identical_io(NULL, eslMSAFILE_UNKNOWN, "# STOCKHOLM 1.0\n\nseq1 ACDEFGHIKL\nseq2 ACDEFGHIKL\n//\n");
+
+ /* Various "good" files, that should be parsed correctly. */
+ for (testnumber = 1; testnumber <= ngoodtests; testnumber++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+ switch (testnumber) {
+ case 1: utest_write_good1 (ofp, &expected_alphatype, &expected_nseq, &expected_alen); break;
+ }
+ fclose(ofp);
+ utest_goodfile(tmpfile, testnumber, expected_alphatype, expected_nseq, expected_alen);
+ remove(tmpfile);
+ }
+
+ /* Tests for all possible EFORMAT errors */
+ for (testnumber = 1; testnumber <= nbadtests; testnumber++)
+ {
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+
+ switch (testnumber) {
+ case 1: utest_write_badformat1 (ofp, &expected_linenumber, expected_errmsg); break;
+ case 2: utest_write_badformat2 (ofp, &expected_linenumber, expected_errmsg); break;
+ case 3: utest_write_badformat3 (ofp, &expected_linenumber, expected_errmsg); break;
+ case 4: utest_write_badformat4 (ofp, &expected_linenumber, expected_errmsg); break;
+ case 5: utest_write_badformat5 (ofp, &expected_linenumber, expected_errmsg); break;
+ case 6: utest_write_badformat6 (ofp, &expected_linenumber, expected_errmsg); break;
+ case 7: utest_write_badformat7 (ofp, &expected_linenumber, expected_errmsg); break;
+ case 8: utest_write_badformat8 (ofp, &expected_linenumber, expected_errmsg); break;
+ case 9: utest_write_badformat9 (ofp, &expected_linenumber, expected_errmsg); break;
+ case 10: utest_write_badformat10(ofp, &expected_linenumber, expected_errmsg); break;
+ case 11: utest_write_badformat11(ofp, &expected_linenumber, expected_errmsg); break;
+ case 12: utest_write_badformat12(ofp, &expected_linenumber, expected_errmsg); break;
+ case 13: utest_write_badformat13(ofp, &expected_linenumber, expected_errmsg); break;
+ case 14: utest_write_badformat14(ofp, &expected_linenumber, expected_errmsg); break;
+ case 15: utest_write_badformat15(ofp, &expected_linenumber, expected_errmsg); break;
+ case 16: utest_write_badformat16(ofp, &expected_linenumber, expected_errmsg); break;
+ case 17: utest_write_badformat17(ofp, &expected_linenumber, expected_errmsg); break;
+ case 18: utest_write_badformat18(ofp, &expected_linenumber, expected_errmsg); break;
+ case 19: utest_write_badformat19(ofp, &expected_linenumber, expected_errmsg); break;
+ case 20: utest_write_badformat20(ofp, &expected_linenumber, expected_errmsg); break;
+ case 21: utest_write_badformat21(ofp, &expected_linenumber, expected_errmsg); break;
+ case 22: utest_write_badformat22(ofp, &expected_linenumber, expected_errmsg); break;
+ case 23: utest_write_badformat23(ofp, &expected_linenumber, expected_errmsg); break;
+ case 24: utest_write_badformat24(ofp, &expected_linenumber, expected_errmsg); break;
+ case 25: utest_write_badformat25(ofp, &expected_linenumber, expected_errmsg); break;
+ case 26: utest_write_badformat26(ofp, &expected_linenumber, expected_errmsg); break;
+ case 27: utest_write_badformat27(ofp, &expected_linenumber, expected_errmsg); break;
+ case 28: utest_write_badformat28(ofp, &expected_linenumber, expected_errmsg); break;
+ case 29: utest_write_badformat29(ofp, &expected_linenumber, expected_errmsg); break;
+ case 30: utest_write_badformat30(ofp, &expected_linenumber, expected_errmsg); break;
+ case 31: utest_write_badformat31(ofp, &expected_linenumber, expected_errmsg); break;
+ case 32: utest_write_badformat32(ofp, &expected_linenumber, expected_errmsg); break;
+ case 33: utest_write_badformat33(ofp, &expected_linenumber, expected_errmsg); break;
+ case 34: utest_write_badformat34(ofp, &expected_linenumber, expected_errmsg); break;
+ case 35: utest_write_badformat35(ofp, &expected_linenumber, expected_errmsg); break;
+ case 36: utest_write_badformat36(ofp, &expected_linenumber, expected_errmsg); break;
+ case 37: utest_write_badformat37(ofp, &expected_linenumber, expected_errmsg); break;
+ case 38: utest_write_badformat38(ofp, &expected_linenumber, expected_errmsg); break;
+ case 39: utest_write_badformat39(ofp, &expected_linenumber, expected_errmsg); break;
+ case 40: utest_write_badformat40(ofp, &expected_linenumber, expected_errmsg); break;
+ case 41: utest_write_badformat41(ofp, &expected_linenumber, expected_errmsg); break;
+ case 42: utest_write_badformat42(ofp, &expected_linenumber, expected_errmsg); break;
+ case 43: utest_write_badformat43(ofp, &expected_linenumber, expected_errmsg); break;
+ case 44: utest_write_badformat44(ofp, &expected_linenumber, expected_errmsg); break;
+ case 45: utest_write_badformat45(ofp, &expected_linenumber, expected_errmsg); break;
+ case 46: utest_write_badformat46(ofp, &expected_linenumber, expected_errmsg); break;
+ case 47: utest_write_badformat47(ofp, &expected_linenumber, expected_errmsg); break;
+ case 48: utest_write_badformat48(ofp, &expected_linenumber, expected_errmsg); break;
+ case 49: utest_write_badformat49(ofp, &expected_linenumber, expected_errmsg); break;
+ case 50: utest_write_badformat50(ofp, &expected_linenumber, expected_errmsg); break;
+ case 51: utest_write_badformat51(ofp, &expected_linenumber, expected_errmsg); break;
+ case 52: utest_write_badformat52(ofp, &expected_linenumber, expected_errmsg); break;
+ case 53: utest_write_badformat53(ofp, &expected_linenumber, expected_errmsg); break;
+ case 54: utest_write_badformat54(ofp, &expected_linenumber, expected_errmsg); break;
+ case 55: utest_write_badformat55(ofp, &expected_linenumber, expected_errmsg); break;
+ case 56: utest_write_badformat56(ofp, &expected_linenumber, expected_errmsg); break;
+ case 57: utest_write_badformat57(ofp, &expected_linenumber, expected_errmsg); break;
+ case 58: utest_write_badformat58(ofp, &expected_linenumber, expected_errmsg); break;
+ case 59: utest_write_badformat59(ofp, &expected_linenumber, expected_errmsg); break;
+ case 60: utest_write_badformat60(ofp, &expected_linenumber, expected_errmsg); break;
+ case 61: utest_write_badformat61(ofp, &expected_linenumber, expected_errmsg); break;
+ case 62: utest_write_badformat62(ofp, &expected_linenumber, expected_errmsg); break;
+ case 63: utest_write_badformat63(ofp, &expected_linenumber, expected_errmsg); break;
+ case 64: utest_write_badformat64(ofp, &expected_linenumber, expected_errmsg); break;
+ case 65: utest_write_badformat65(ofp, &expected_linenumber, expected_errmsg); break;
+ }
+ fclose(ofp);
+
+ utest_bad_format(tmpfile, testnumber, expected_linenumber, expected_errmsg);
+ remove(tmpfile);
+ }
+
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslMSAFILE_STOCKHOLM_TESTDRIVE*/
+/*---------------- end, test driver -----------------------------*/
+
+
+/*****************************************************************
+ * 8. Examples.
+ *****************************************************************/
+
+#ifdef eslMSAFILE_STOCKHOLM_EXAMPLE
+/* A full-featured example of reading/writing MSA(s) in Stockholm format.
+ gcc -g -Wall -o esl_msafile_stockholm_example -I. -L. -DeslMSAFILE_STOCKHOLM_EXAMPLE esl_msafile_stockholm.c -leasel -lm
+ ./esl_msafile_stockholm_example <msafile>
+ */
+/*::cexcerpt::msafile_stockholm_example::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_stockholm.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-1", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "override autodetection; force Stockholm format", 0 },
+ { "-q", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "quieter: don't write msa back, just summary", 0 },
+ { "-t", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use text mode: no digital alphabet", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is DNA", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is RNA", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t", "specify that alphabet is protein", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msafile>";
+static char banner[] = "example of guessing, reading, writing Stockholm format";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *filename = esl_opt_GetArg(go, 1);
+ int infmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if (esl_opt_GetBoolean(go, "-1")) infmt = eslMSAFILE_STOCKHOLM; /* override format autodetection */
+
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+
+ /* Text mode: pass NULL for alphabet.
+ * Digital mode: pass ptr to expected ESL_ALPHABET; and if abc=NULL, alphabet is guessed
+ */
+ if (esl_opt_GetBoolean(go, "-t")) status = esl_msafile_Open(NULL, filename, NULL, infmt, NULL, &afp);
+ else status = esl_msafile_Open(&abc, filename, NULL, infmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+
+ while ( (status = esl_msafile_stockholm_Read(afp, &msa)) == eslOK)
+ {
+ printf("alphabet: %s\n", (abc ? esl_abc_DecodeType(abc->type) : "none (text mode)"));
+ printf("# of seqs: %d\n", msa->nseq);
+ printf("# of cols: %d\n", (int) msa->alen);
+ printf("\n");
+
+ if (! esl_opt_GetBoolean(go, "-q"))
+ esl_msafile_stockholm_Write(stdout, msa, eslMSAFILE_STOCKHOLM);
+
+ esl_msa_Destroy(msa);
+ }
+ if (status != eslEOF) esl_msafile_ReadFailure(afp, status);
+
+ esl_msafile_Close(afp);
+ if (abc) esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+/*::cexcerpt::msafile_stockholm_example::end::*/
+#endif /*eslMSAFILE_STOCKHOLM_EXAMPLE*/
+
+
+
+#ifdef eslMSAFILE_STOCKHOLM_EXAMPLE2
+/* A minimal example. Read Stockholm MSAs, in text mode.
+ gcc -g -Wall -o esl_msafile_stockholm_example2 -I. -L. -DeslMSAFILE_STOCKHOLM_EXAMPLE2 esl_msafile_stockholm.c -leasel -lm
+ ./esl_msafile_stockholm_example2 <msafile>
+ */
+
+/*::cexcerpt::msafile_stockholm_example::begin::*/
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_stockholm.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ int infmt = eslMSAFILE_STOCKHOLM;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+
+ if ( (status = esl_msafile_Open(NULL, filename, NULL, infmt, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+ while ( (status = esl_msafile_stockholm_Read(afp, &msa)) == eslOK)
+ {
+ printf("%15s: %6d seqs, %5d columns\n\n", msa->name, msa->nseq, (int) msa->alen);
+ esl_msafile_stockholm_Write(stdout, msa, eslMSAFILE_STOCKHOLM);
+ esl_msa_Destroy(msa);
+ }
+ if (status != eslEOF) esl_msafile_ReadFailure(afp, status);
+
+ esl_msafile_Close(afp);
+ exit(0);
+}
+/*::cexcerpt::msafile_stockholm_example2::end::*/
+#endif /*eslMSAFILE_STOCKHOLM_EXAMPLE2*/
+/*--------------------- end of example --------------------------*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msafile_stockholm.h b/esl_msafile_stockholm.h
new file mode 100644
index 0000000..8705b9d
--- /dev/null
+++ b/esl_msafile_stockholm.h
@@ -0,0 +1,15 @@
+/* I/O of multiple alignment files in Stockholm/Pfam format
+ */
+#ifndef eslMSAFILE_STOCKHOLM_INCLUDED
+#define eslMSAFILE_STOCKHOLM_INCLUDED
+
+extern int esl_msafile_stockholm_SetInmap (ESL_MSAFILE *afp);
+extern int esl_msafile_stockholm_GuessAlphabet(ESL_MSAFILE *afp, int *ret_type);
+extern int esl_msafile_stockholm_Read (ESL_MSAFILE *afp, ESL_MSA **ret_msa);
+extern int esl_msafile_stockholm_Write (FILE *fp, const ESL_MSA *msa, int fmt);
+
+#endif /*eslMSAFILE_STOCKHOLM_INCLUDED*/
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msashuffle.c b/esl_msashuffle.c
new file mode 100644
index 0000000..3a0e250
--- /dev/null
+++ b/esl_msashuffle.c
@@ -0,0 +1,514 @@
+/* Shuffling, bootstrapping, permuting alignments, by column or row.
+ *
+ * Table of contents:
+ * 1. Randomizing MSAs by column.
+ * 2. Permuting sequence order (i.e. by row)
+ * 3. Shuffling pairwise (QRNA) alignments.
+ */
+#include "esl_config.h"
+
+#include <string.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#include "esl_msa.h"
+#include "esl_msashuffle.h"
+#include "esl_random.h"
+
+
+/*****************************************************************
+ * 1. Randomizing MSAs by column.
+ *****************************************************************/
+
+/* Function: esl_msashuffle_Shuffle()
+ * Synopsis: Shuffle an alignment's columns.
+ *
+ * Purpose: Returns a column-shuffled version of <msa> in <shuf>,
+ * using random generator <r>. Shuffling by columns
+ * preserves the \% identity of the original
+ * alignment. <msa> and <shuf> can be identical, to shuffle
+ * in place.
+ *
+ * The caller sets up the rest of the data (everything but
+ * the alignment itself) in <shuf> the way it wants,
+ * including sequence names, MSA name, and other
+ * annotation. The easy thing to do is to make <shuf>
+ * a copy of <msa>: the caller might create <shuf> by
+ * a call to <esl_msa_Clone()>.
+ *
+ * The alignments <msa> and <shuf> can both be in digital
+ * mode, or can both be in text mode; you cannot mix
+ * digital and text modes.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <msa>,<shuf> aren't in the same mode (digital vs. text).
+ */
+int
+esl_msashuffle_Shuffle(ESL_RANDOMNESS *r, ESL_MSA *msa, ESL_MSA *shuf)
+{
+ int i, pos, alen;
+
+ if (! (msa->flags & eslMSA_DIGITAL))
+ {
+ char c;
+ if (shuf->flags & eslMSA_DIGITAL) ESL_EXCEPTION(eslEINVAL, "<shuf> must be in text mode if <msa> is");
+ if (msa != shuf) {
+ for (i = 0; i < msa->nseq; i++)
+ strcpy(shuf->aseq[i], msa->aseq[i]);
+ }
+
+ for (i = 0; i < msa->nseq; i++)
+ shuf->aseq[i][msa->alen] = '\0';
+
+ for (alen = msa->alen; alen > 1; alen--)
+ {
+ pos = esl_rnd_Roll(r, alen);
+ for (i = 0; i < msa->nseq; i++)
+ {
+ c = msa->aseq[i][pos];
+ shuf->aseq[i][pos] = shuf->aseq[i][alen-1];
+ shuf->aseq[i][alen-1] = c;
+ }
+ }
+ }
+#ifdef eslAUGMENT_ALPHABET
+ else
+ {
+ ESL_DSQ x;
+ if (! (shuf->flags & eslMSA_DIGITAL)) ESL_EXCEPTION(eslEINVAL, "<shuf> must be in digital mode if <msa> is");
+
+ if (msa != shuf) {
+ for (i = 0; i < msa->nseq; i++)
+ memcpy(shuf->ax[i], msa->ax[i], (msa->alen + 2) * sizeof(ESL_DSQ));
+ }
+
+ for (i = 0; i < msa->nseq; i++)
+ shuf->ax[i][msa->alen+1] = eslDSQ_SENTINEL;
+
+ for (alen = msa->alen; alen > 1; alen--)
+ {
+ pos = esl_rnd_Roll(r, alen) + 1;
+ for (i = 0; i < msa->nseq; i++)
+ {
+ x = msa->ax[i][pos];
+ shuf->ax[i][pos] = shuf->ax[i][alen];
+ shuf->ax[i][alen] = x;
+ }
+ }
+ }
+#endif /*eslAUGMENT_ALPHABET*/
+
+ return eslOK;
+}
+
+/* Function: esl_msashuffle_Bootstrap()
+ * Synopsis: Bootstrap sample an MSA.
+ * Incept: SRE, Tue Jan 22 11:05:07 2008 [Janelia]
+ *
+ * Purpose: Takes a bootstrap sample of <msa> (sample <alen> columns,
+ * with replacement) and puts it in <bootsample>, using
+ * random generator <r>.
+ *
+ * The caller provides allocated space for <bootsample>.
+ * It must be different space than <msa>; you cannot take
+ * a bootstrap sample "in place". The caller sets up the
+ * rest of the data in <bootsample> (everything but the
+ * alignment itself) the way it wants, including sequence
+ * names, MSA name, and other annotation. The easy thing to
+ * do is to initialize <bootsample> by cloning <msa>.
+ *
+ * The alignments <msa> and <bootsample> can both be in digital
+ * mode, or can both be in text mode; you cannot mix
+ * digital and text modes.
+ *
+ * Returns: <eslOK> on success, and the alignment in <bootsample> is
+ * set to be a bootstrap resample of the alignment in <msa>.
+ *
+ * Throws: <eslEINVAL> if <msa>,<bootsample> aren't in the same mode
+ * (digital vs. text).
+ */
+int
+esl_msashuffle_Bootstrap(ESL_RANDOMNESS *r, ESL_MSA *msa, ESL_MSA *bootsample)
+{
+ int i, pos, col;
+
+ /* contract checks */
+ if ( (msa->flags & eslMSA_DIGITAL) && ! (bootsample->flags & eslMSA_DIGITAL))
+ ESL_EXCEPTION(eslEINVAL, "<msa> and <bootsample> must both be in digital or text mode");
+ if (! (msa->flags & eslMSA_DIGITAL) && (bootsample->flags & eslMSA_DIGITAL))
+ ESL_EXCEPTION(eslEINVAL, "<msa> and <bootsample> must both be in digital or text mode");
+
+ if (! (msa->flags & eslMSA_DIGITAL))
+ {
+ for (pos = 0; pos < msa->alen; pos++)
+ {
+ col = esl_rnd_Roll(r, msa->alen);
+ for (i = 0; i < msa->nseq; i++)
+ bootsample->aseq[i][pos] = msa->aseq[i][col];
+ }
+
+ for (i = 0; i < msa->nseq; i++)
+ bootsample->aseq[i][msa->alen] = '\0';
+ }
+#ifdef eslAUGMENT_ALPHABET
+ else
+ {
+ for (i = 0; i < msa->nseq; i++)
+ bootsample->ax[i][0] = eslDSQ_SENTINEL;
+
+ for (pos = 1; pos <= msa->alen; pos++)
+ {
+ col = esl_rnd_Roll(r, msa->alen) + 1;
+ for (i = 0; i < msa->nseq; i++)
+ bootsample->ax[i][pos] = msa->ax[i][col];
+ }
+
+ for (i = 0; i < msa->nseq; i++)
+ bootsample->ax[i][msa->alen+1] = eslDSQ_SENTINEL;
+ }
+#endif /*eslAUGMENT_ALPHABET*/
+
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 2. Permuting the sequence order
+ *****************************************************************/
+
+/* Function: esl_msashuffle_PermuteSequenceOrder()
+ * Synopsis: Permutes the order of the sequences.
+ *
+ * Purpose: Randomly permute the order of the sequences in <msa>,
+ * and any associated sequence annotation, in place.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_msashuffle_PermuteSequenceOrder(ESL_RANDOMNESS *r, ESL_MSA *msa)
+{
+ void *tmp;
+ double tmpwgt;
+ int64_t tmplen;
+ int N, i, tag;
+
+ for (N = msa->nseq; N > 1; N--)
+ {
+ i = esl_rnd_Roll(r, N); /* idx = 0..N-1 */
+
+ if ( ! (msa->flags & eslMSA_DIGITAL)) { tmp = msa->aseq[i]; msa->aseq[i] = msa->aseq[N-1]; msa->aseq[N-1] = tmp; }
+#ifdef eslAUGMENT_ALPHABET
+ else { tmp = msa->ax[i]; msa->ax[i] = msa->ax[N-1]; msa->ax[N-1] = tmp; }
+#endif
+ tmp = msa->sqname[i]; msa->sqname[i] = msa->sqname[N-1]; msa->sqname[N-1] = tmp;
+ tmpwgt = msa->wgt[i]; msa->wgt[i] = msa->wgt[N-1]; msa->wgt[N-1] = tmpwgt;
+
+ if (msa->sqacc) { tmp = msa->sqacc[i]; msa->sqacc[i] = msa->sqacc[N-1]; msa->sqacc[N-1] = tmp; }
+ if (msa->sqdesc) { tmp = msa->sqdesc[i]; msa->sqdesc[i] = msa->sqdesc[N-1]; msa->sqdesc[N-1] = tmp; }
+ if (msa->ss) { tmp = msa->ss[i]; msa->ss[i] = msa->ss[N-1]; msa->ss[N-1] = tmp; }
+ if (msa->sa) { tmp = msa->sa[i]; msa->sa[i] = msa->sa[N-1]; msa->sa[N-1] = tmp; }
+ if (msa->pp) { tmp = msa->pp[i]; msa->pp[i] = msa->pp[N-1]; msa->pp[N-1] = tmp; }
+ if (msa->sqlen) { tmplen = msa->sqlen[i]; msa->sqlen[i] = msa->sqlen[N-1]; msa->sqlen[N-1] = tmplen; }
+ if (msa->sslen) { tmplen = msa->sslen[i]; msa->sslen[i] = msa->sslen[N-1]; msa->sslen[N-1] = tmplen; }
+ if (msa->salen) { tmplen = msa->salen[i]; msa->salen[i] = msa->salen[N-1]; msa->salen[N-1] = tmplen; }
+ if (msa->pplen) { tmplen = msa->pplen[i]; msa->pplen[i] = msa->pplen[N-1]; msa->pplen[N-1] = tmplen; }
+
+ for (tag = 0; tag < msa->ngs; tag++) if (msa->gs[tag]) { tmp = msa->gs[tag][i]; msa->gs[tag][i] = msa->gs[tag][N-1]; msa->gs[tag][N-1] = tmp; }
+ for (tag = 0; tag < msa->ngr; tag++) if (msa->gr[tag]) { tmp = msa->gr[tag][i]; msa->gr[tag][i] = msa->gr[tag][N-1]; msa->gr[tag][N-1] = tmp; }
+ }
+
+ /* if <msa> has a keyhash that maps seqname => seqidx, we'll need to rebuild it. */
+ if (msa->index)
+ {
+ esl_keyhash_Reuse(msa->index);
+ for (i = 0; i < msa->nseq; i++)
+ esl_keyhash_Store(msa->index, msa->sqname[i], -1, NULL);
+ }
+
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 3. Shuffling pairwise (QRNA) alignments
+ *****************************************************************/
+#ifdef eslAUGMENT_ALPHABET
+/* Function: esl_msashuffle_XQRNA()
+ * Synopsis: Gap-preserving column shuffle of a digital pairwise alignment.
+ * Incept: SRE, Tue Jan 22 09:09:52 2008 [Market Street Cafe, Leesburg]
+ *
+ * Purpose: Shuffle a digital pairwise alignment <x>,<y> while
+ * preserving the position of gaps, where both sequences are
+ * in digital alphabet <abc>, using the random number
+ * generator <r>. Return the shuffled alignment in <xs>,
+ * <ys>. Caller provides allocated space for <xs> and <ys>
+ * for at least the same length of <x>,<y>.
+ *
+ * Works by doing three separate
+ * shuffles, of (1) columns with residues in both
+ * <x> and <y>, (2) columns with residue in <x> and gap in <y>,
+ * and (3) columns with gap in <x> and residue in <y>.
+ *
+ * <xs>,<x> and <ys>,<y> may be identical: that is, to shuffle
+ * an alignment "in place", destroying the original
+ * alignment, just call <esl_msashuffle_XQRNA(r, abc, x,y,x,y)>.
+ *
+ * Returns: <eslOK> on success, and the shuffled alignment is
+ * returned in <xs>, <ys>.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_msashuffle_XQRNA(ESL_RANDOMNESS *r, ESL_ALPHABET *abc, ESL_DSQ *x, ESL_DSQ *y, ESL_DSQ *xs, ESL_DSQ *ys)
+{
+ int L;
+ int *xycol = NULL;
+ int *xcol = NULL;
+ int *ycol = NULL;
+ int nxy, nx, ny;
+ int i;
+ int pos, c;
+ char xsym, ysym;
+ int status;
+
+ L = esl_abc_dsqlen(x);
+ if (esl_abc_dsqlen(y) != L) ESL_XEXCEPTION(eslEINVAL, "sequences of different lengths in qrna shuffle");
+
+ if (xs != x) esl_abc_dsqcpy(x, L, xs);
+ if (ys != y) esl_abc_dsqcpy(y, L, ys);
+
+ /* First, construct three arrays containing lists of the column positions
+ * of the three types of columns. (If a column contains gaps in both x and y,
+ * we've already simply copied it to the shuffled sequence.)
+ */
+ ESL_ALLOC(xycol, sizeof(int) * L);
+ ESL_ALLOC(xcol, sizeof(int) * L);
+ ESL_ALLOC(ycol, sizeof(int) * L);
+ nxy = nx = ny = 0;
+
+ for (i = 1; i <= L; i++)
+ {
+ if ( esl_abc_XIsGap(abc, x[i]) && esl_abc_XIsGap(abc, y[i])) { continue; }
+ else if (! esl_abc_XIsGap(abc, x[i]) && ! esl_abc_XIsGap(abc, y[i])) { xycol[nxy] = i; nxy++; }
+ else if ( esl_abc_XIsGap(abc, x[i])) { ycol[ny] = i; ny++; }
+ else if ( esl_abc_XIsGap(abc, y[i])) { xcol[nx] = i; nx++; }
+ }
+
+ /* Second, shuffle the sequences indirectly, via shuffling these arrays.
+ * Yow, careful with those indices, and with order of the statements...
+ */
+ for (; nxy > 1; nxy--) {
+ pos = esl_rnd_Roll(r, nxy);
+ xsym = xs[xycol[pos]]; ysym = ys[xycol[pos]]; c = xycol[pos];
+ xs[xycol[pos]] = xs[xycol[nxy-1]]; ys[xycol[pos]] = ys[xycol[nxy-1]]; xycol[pos] = xycol[nxy-1];
+ xs[xycol[nxy-1]] = xsym; ys[xycol[nxy-1]] = ysym; xycol[pos] = c;
+ }
+ for (; nx > 1; nx--) {
+ pos = esl_rnd_Roll(r, nx);
+ xsym = xs[xcol[pos]]; ysym = ys[xcol[pos]]; c = xcol[pos];
+ xs[xcol[pos]] = xs[xcol[nx-1]]; ys[xcol[pos]] = ys[xcol[nx-1]]; xcol[pos] = xcol[nx-1];
+ xs[xcol[nx-1]] = xsym; ys[xcol[nx-1]] = ysym; xcol[nx-1] = c;
+ }
+ for (; ny > 1; ny--) {
+ pos = esl_rnd_Roll(r, ny);
+ xsym = xs[ycol[pos]]; ysym = ys[ycol[pos]]; c = ycol[pos];
+ xs[ycol[pos]] = xs[ycol[ny-1]]; ys[ycol[pos]] = ys[ycol[ny-1]]; ycol[pos] = ycol[ny-1];
+ xs[ycol[ny-1]] = xsym; ys[ycol[ny-1]] = ysym; ycol[ny-1] = c;
+ }
+
+ free(xycol); free(xcol); free(ycol);
+ return eslOK;
+
+ ERROR:
+ if (xycol != NULL) free(xycol);
+ if (xcol != NULL) free(xcol);
+ if (ycol != NULL) free(ycol);
+ return status;
+}
+
+/* Function: esl_msashuffle_CQRNA()
+ * Synopsis: Gap-preserving column shuffle of a pairwise alignment.
+ * Incept: SRE, Tue Jan 22 08:45:34 2008 [Market Street Cafe, Leesburg]
+ *
+ * Purpose: Shuffle a pairwise alignment <x>,<y> while preserving the
+ * position of gaps, using the random number generator <r>.
+ * Return the shuffled alignment in <xs>,
+ * <ys>. Caller provides allocated space for <xs> and <ys>.
+ *
+ * An alphabet <abc> must also be provided, solely for the
+ * definition of gap characters. Because Easel's default
+ * alphabets (DNA, RNA, and protein) all use the same
+ * definition of gap characters <-_.>, you can actually
+ * provide any alphabet here, and get the same results.
+ * (This may save having to determine the alphabet of input
+ * sequences.)
+ *
+ * Works by doing three separate
+ * shuffles, of (1) columns with residues in both
+ * <x> and <y>, (2) columns with residue in <x> and gap in <y>,
+ * and (3) columns with gap in <x> and residue in <y>.
+ *
+ * <xs>,<x> and <ys>,<y> may be identical: that is, to shuffle
+ * an alignment "in place", destroying the original
+ * alignment, just call <esl_msashuffle_CQRNA(r, abc, x,y,x,y)>.
+ *
+ * Returns: <eslOK> on success, and the shuffled alignment is
+ * returned in <xs>, <ys>.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_msashuffle_CQRNA(ESL_RANDOMNESS *r, ESL_ALPHABET *abc, char *x, char *y, char *xs, char *ys)
+{
+ int L;
+ int *xycol = NULL;
+ int *xcol = NULL;
+ int *ycol = NULL;
+ int nxy, nx, ny;
+ int i;
+ int pos, c;
+ char xsym, ysym;
+ int status;
+
+ if (xs != x) strcpy(xs, x);
+ if (ys != y) strcpy(ys, y);
+
+ /* First, construct three arrays containing lists of the column positions
+ * of the three types of columns. (If a column contains gaps in both x and y,
+ * we've already simply copied it to the shuffled sequence.)
+ */
+ L = strlen(x);
+ if (strlen(y) != L) ESL_XEXCEPTION(eslEINVAL, "sequences of different lengths in qrna shuffle");
+ ESL_ALLOC(xycol, sizeof(int) * L);
+ ESL_ALLOC(xcol, sizeof(int) * L);
+ ESL_ALLOC(ycol, sizeof(int) * L);
+ nxy = nx = ny = 0;
+
+ for (i = 0; i < L; i++)
+ {
+ if ( esl_abc_CIsGap(abc, x[i]) && esl_abc_CIsGap(abc, y[i])) { continue; }
+ else if (! esl_abc_CIsGap(abc, x[i]) && ! esl_abc_CIsGap(abc, y[i])) { xycol[nxy] = i; nxy++; }
+ else if ( esl_abc_CIsGap(abc, x[i])) { ycol[ny] = i; ny++; }
+ else if ( esl_abc_CIsGap(abc, y[i])) { xcol[nx] = i; nx++; }
+ }
+
+ /* Second, shuffle the sequences indirectly, via shuffling these arrays.
+ * Yow, careful with those indices, and with order of the statements...
+ */
+ for (; nxy > 1; nxy--) {
+ pos = esl_rnd_Roll(r, nxy);
+ xsym = xs[xycol[pos]]; ysym = ys[xycol[pos]]; c = xycol[pos];
+ xs[xycol[pos]] = xs[xycol[nxy-1]]; ys[xycol[pos]] = ys[xycol[nxy-1]]; xycol[pos] = xycol[nxy-1];
+ xs[xycol[nxy-1]] = xsym; ys[xycol[nxy-1]] = ysym; xycol[pos] = c;
+ }
+ for (; nx > 1; nx--) {
+ pos = esl_rnd_Roll(r, nx);
+ xsym = xs[xcol[pos]]; ysym = ys[xcol[pos]]; c = xcol[pos];
+ xs[xcol[pos]] = xs[xcol[nx-1]]; ys[xcol[pos]] = ys[xcol[nx-1]]; xcol[pos] = xcol[nx-1];
+ xs[xcol[nx-1]] = xsym; ys[xcol[nx-1]] = ysym; xcol[nx-1] = c;
+ }
+ for (; ny > 1; ny--) {
+ pos = esl_rnd_Roll(r, ny);
+ xsym = xs[ycol[pos]]; ysym = ys[ycol[pos]]; c = ycol[pos];
+ xs[ycol[pos]] = xs[ycol[ny-1]]; ys[ycol[pos]] = ys[ycol[ny-1]]; ycol[pos] = ycol[ny-1];
+ xs[ycol[ny-1]] = xsym; ys[ycol[ny-1]] = ysym; ycol[ny-1] = c;
+ }
+
+ free(xycol); free(xcol); free(ycol);
+ return eslOK;
+
+ ERROR:
+ if (xycol != NULL) free(xycol);
+ if (xcol != NULL) free(xcol);
+ if (ycol != NULL) free(ycol);
+ return status;
+}
+#endif /*eslAUGMENT_ALPHABET*/
+
+
+/*****************************************************************
+ * 4. Example.
+ *****************************************************************/
+#ifdef eslMSASHUFFLE_EXAMPLE
+#include <stdio.h>
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_random.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use DNA alphabet", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use RNA alphabet", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use protein alphabet", 0 },
+ { "--text", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use text mode: no digital alphabet", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msafile>";
+static char banner[] = "example of multiple alignment shuffling/permuting";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ ESL_RANDOMNESS *rng = esl_randomness_Create(0);
+ char *msafile = esl_opt_GetArg(go, 1);
+ int fmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int textmode = esl_opt_GetBoolean(go, "--text");
+ int nali = 0;
+ int status;
+
+ /* If you know the alphabet you want, create it - you'll pass it to esl_msafile_Open() */
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+
+ /* Open in text or digital mode.
+ * To let the Open() function autoguess the format, you pass <infmt=eslMSAFILE_UNKNOWN>.
+ * To let it autoguess the alphabet, you set <abc=NULL> and pass <&abc>.
+ * To open in text mode instead of digital, you pass <NULL> for the alphabet argument.
+ * esl_msafile_OpenFailure() is a convenience, printing various diagnostics of any
+ * open failure to <stderr>. You can of course handle your own diagnostics instead.
+ */
+ if (textmode) status = esl_msafile_Open(NULL, msafile, NULL, fmt, NULL, &afp);
+ else status = esl_msafile_Open(&abc, msafile, NULL, fmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+
+ fmt = afp->format;
+
+ while ((status = esl_msafile_Read(afp, &msa)) == eslOK)
+ {
+ /* if digital MSA: msa->ax[idx=0..nseq-1][acol=1..alen] is the alignment data;
+ * if text MSA: msa->aseq[idx=0..nseq-1][acol=0..alen-1] */
+ nali++;
+
+ /* permute it */
+ esl_msashuffle_PermuteSequenceOrder(rng, msa);
+
+ esl_msafile_Write(stdout, msa, fmt);
+ esl_msa_Destroy(msa);
+ }
+ if (nali == 0 || status != eslEOF) esl_msafile_ReadFailure(afp, status); /* a convenience, like esl_msafile_OpenFailure() */
+
+ esl_alphabet_Destroy(abc);
+ esl_msafile_Close(afp);
+ esl_randomness_Destroy(rng);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+#endif
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msashuffle.h b/esl_msashuffle.h
new file mode 100644
index 0000000..37e5c62
--- /dev/null
+++ b/esl_msashuffle.h
@@ -0,0 +1,31 @@
+/* Shuffling or bootstrapping multiple sequence alignments.
+ *
+ * SRE, Tue Jan 22 09:18:09 2008 [Market Street Cafe, Leesburg]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslMSASHUFFLE_INCLUDED
+#define eslMSASHUFFLE_INCLUDED
+
+#include "esl_random.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+
+/* 1. Randomizing MSAs by column. */
+extern int esl_msashuffle_Shuffle (ESL_RANDOMNESS *r, ESL_MSA *msa, ESL_MSA *shuf);
+extern int esl_msashuffle_Bootstrap(ESL_RANDOMNESS *r, ESL_MSA *msa, ESL_MSA *bootsample);
+
+/* 2. Permuting the sequence order */
+extern int esl_msashuffle_PermuteSequenceOrder(ESL_RANDOMNESS *r, ESL_MSA *msa);
+
+/* 3. Shuffling pairwise (QRNA) alignments */
+#ifdef eslAUGMENT_ALPHABET
+extern int esl_msashuffle_CQRNA(ESL_RANDOMNESS *r, ESL_ALPHABET *abc, char *x, char *y, char *xs, char *ys);
+extern int esl_msashuffle_XQRNA(ESL_RANDOMNESS *r, ESL_ALPHABET *abc, ESL_DSQ *x, ESL_DSQ *y, ESL_DSQ *xs, ESL_DSQ *ys);
+#endif /*eslAUGMENT_ALPHABET*/
+
+#endif /*eslMSASHUFFLE_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msaweight.c b/esl_msaweight.c
new file mode 100644
index 0000000..c4fd305
--- /dev/null
+++ b/esl_msaweight.c
@@ -0,0 +1,1120 @@
+/* Sequence weighting algorithms.
+ *
+ * Implementations of ad hoc sequence weighting algorithms for multiple
+ * sequence alignments:
+ * GSC weights: Gerstein et al., JMB 236:1067-1078, 1994.
+ * PB weights: Henikoff and Henikoff, JMB 243:574-578, 1994.
+ * BLOSUM weights: Henikoff and Henikoff, PNAS 89:10915-10919, 1992.
+ *
+ * Contents:
+ * 1. Implementations of weighting algorithms.
+ * 2. Unit tests.
+ * 3. Test driver.
+ * 4. Regression tests against SQUID.
+ * 5. Benchmark.
+ * 6. Stats driver.
+ * 7. Examples.
+ * 8. Copyright notice and license.
+ */
+#include "esl_config.h"
+
+#include <math.h>
+#include <string.h>
+#include <ctype.h>
+
+/* Dependencies on Easel core: */
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_msa.h"
+#include "esl_dmatrix.h"
+#include "esl_vectorops.h"
+
+/* Dependencies on phylogeny modules: */
+#include "esl_distance.h"
+#include "esl_tree.h"
+#include "esl_msacluster.h"
+#include "esl_msaweight.h"
+
+
+/*****************************************************************
+ * 1. Implementations of weighting algorithms
+ *****************************************************************/
+
+/* Function: esl_msaweight_GSC()
+ * Synopsis: GSC weights.
+ * Incept: SRE, Fri Nov 3 13:31:14 2006 [Janelia]
+ *
+ * Purpose: Given a multiple sequence alignment <msa>, calculate
+ * sequence weights according to the
+ * Gerstein/Sonnhammer/Chothia algorithm. These weights
+ * are stored internally in the <msa> object, replacing
+ * any weights that may have already been there. Weights
+ * are $\geq 0$ and they sum to <msa->nseq>.
+ *
+ * The <msa> may be in either digitized or text mode.
+ * Digital mode is preferred, so that distance calculations
+ * used by the GSC algorithm are robust against degenerate
+ * residue symbols.
+ *
+ * This is an implementation of Gerstein et al., "A method to
+ * weight protein sequences to correct for unequal
+ * representation", JMB 236:1067-1078, 1994.
+ *
+ * The algorithm is $O(N^2)$ memory (it requires a pairwise
+ * distance matrix) and $O(N^3 + LN^2)$ time ($N^3$ for a UPGMA
+ * tree building step, $LN^2$ for distance matrix construction)
+ * for an alignment of N sequences and L columns.
+ *
+ * In the current implementation, the actual memory
+ * requirement is dominated by two full NxN distance
+ * matrices (one tmp copy in UPGMA, and one here): for
+ * 8-byte doubles, that's $16N^2$ bytes. To keep the
+ * calculation under memory limits, don't process large
+ * alignments: max 1400 sequences for 32 MB, max 4000
+ * sequences for 256 MB, max 8000 seqs for 1 GB. Watch
+ * out, because Pfam alignments can easily blow this up.
+ *
+ * Note: Memory usage could be improved. UPGMA consumes a distance
+ * matrix, but that can be D itself, not a copy, if the
+ * caller doesn't mind the destruction of D. Also, D is
+ * symmetrical, so we could use upper or lower triangular
+ * matrices if we rewrote dmatrix to allow them.
+ *
+ * I also think UPGMA can be reduced to O(N^2) time, by
+ * being more tricky about rapidly identifying the minimum
+ * element: could keep min of each row, and update that,
+ * I think.
+ *
+ * Returns: <eslOK> on success, and the weights inside <msa> have been
+ * modified.
+ *
+ * Throws: <eslEINVAL> if the alignment data are somehow invalid and
+ * distance matrices can't be calculated. <eslEMEM> on an
+ * allocation error. In either case, the original <msa> is
+ * left unmodified.
+ *
+ * Xref: [Gerstein94]; squid::weight.c::GSCWeights(); STL11/81.
+ */
+int
+esl_msaweight_GSC(ESL_MSA *msa)
+{
+ ESL_DMATRIX *D = NULL; /* distance matrix */
+ ESL_TREE *T = NULL; /* UPGMA tree */
+ double *x = NULL; /* storage per node, 0..N-2 */
+ double lw, rw; /* total branchlen on left, right subtrees */
+ double lx, rx; /* distribution of weight to left, right side */
+ int i; /* counter over nodes */
+ int status;
+
+ /* Contract checks
+ */
+ ESL_DASSERT1( (msa != NULL) );
+ ESL_DASSERT1( (msa->nseq >= 1) );
+ ESL_DASSERT1( (msa->alen >= 1) );
+ ESL_DASSERT1( (msa->wgt != NULL) );
+ if (msa->nseq == 1) { msa->wgt[0] = 1.0; return eslOK; }
+
+ /* GSC weights use a rooted tree with "branch lengths" calculated by
+ * UPGMA on a fractional difference matrix - pretty crude.
+ */
+ if (! (msa->flags & eslMSA_DIGITAL)) {
+ if ((status = esl_dst_CDiffMx(msa->aseq, msa->nseq, &D)) != eslOK) goto ERROR;
+ }
+#ifdef eslAUGMENT_ALPHABET
+ else {
+ if ((status = esl_dst_XDiffMx(msa->abc, msa->ax, msa->nseq, &D)) != eslOK) goto ERROR;
+ }
+#endif
+
+ /* oi, look out here. UPGMA is correct, but old squid library uses
+ * single linkage, so for regression tests ONLY, we use single link.
+ */
+#ifdef eslMSAWEIGHT_REGRESSION
+ if ((status = esl_tree_SingleLinkage(D, &T)) != eslOK) goto ERROR;
+#else
+ if ((status = esl_tree_UPGMA(D, &T)) != eslOK) goto ERROR;
+#endif
+ esl_tree_SetCladesizes(T);
+
+ ESL_ALLOC(x, sizeof(double) * (T->N-1));
+
+ /* Postorder traverse (leaves to root) to calculate the total branch
+ * length under each internal node; store this in x[]. Remember the
+ * total branch length (x[0]) for a future sanity check.
+ */
+ for (i = T->N-2; i >= 0; i--)
+ {
+ x[i] = T->ld[i] + T->rd[i];
+ if (T->left[i] > 0) x[i] += x[T->left[i]];
+ if (T->right[i] > 0) x[i] += x[T->right[i]];
+ }
+
+ /* Preorder traverse (root to leaves) to calculate the weights. Now
+ * we use x[] to mean, the total weight *above* this node that we will
+ * apportion to the node's left and right children. The two
+ * meanings of x[] never cross: every x[] beneath x[i] is still a
+ * total branch length.
+ *
+ * Because the API guarantees that msa is returned unmodified in case
+ * of an exception, and we're touching msa->wgt here, no exceptions
+ * may be thrown from now on in this function.
+ */
+ x[0] = 0; /* initialize: no branch to the root. */
+ for (i = 0; i <= T->N-2; i++)
+ {
+ lw = T->ld[i]; if (T->left[i] > 0) lw += x[T->left[i]];
+ rw = T->rd[i]; if (T->right[i] > 0) rw += x[T->right[i]];
+
+ if (lw+rw == 0.)
+ {
+ /* A special case arises in GSC weights when all branch lengths in a subtree are 0.
+ * In this case, all seqs in this clade should get equal weights, sharing x[i] equally.
+ * So, split x[i] in proportion to cladesize, not to branch weight.
+ */
+ if (T->left[i] > 0) lx = x[i] * ((double) T->cladesize[T->left[i]] / (double) T->cladesize[i]);
+ else lx = x[i] / (double) T->cladesize[i];
+
+ if (T->right[i] > 0) rx = x[i] * ((double) T->cladesize[T->right[i]] / (double) T->cladesize[i]);
+ else rx = x[i] / (double) T->cladesize[i];
+ }
+ else /* normal case: x[i] split in proportion to branch weight. */
+ {
+ lx = x[i] * lw/(lw+rw);
+ rx = x[i] * rw/(lw+rw);
+ }
+
+ if (T->left[i] <= 0) msa->wgt[-(T->left[i])] = lx + T->ld[i];
+ else x[T->left[i]] = lx + T->ld[i];
+
+ if (T->right[i] <= 0) msa->wgt[-(T->right[i])] = rx + T->rd[i];
+ else x[T->right[i]] = rx + T->rd[i];
+ }
+
+ /* Renormalize weights to sum to N.
+ */
+ esl_vec_DNorm(msa->wgt, msa->nseq);
+ esl_vec_DScale(msa->wgt, msa->nseq, (double) msa->nseq);
+ msa->flags |= eslMSA_HASWGTS;
+
+ free(x);
+ esl_tree_Destroy(T);
+ esl_dmatrix_Destroy(D);
+ return eslOK;
+
+ ERROR:
+ if (x != NULL) free(x);
+ if (T != NULL) esl_tree_Destroy(T);
+ if (D != NULL) esl_dmatrix_Destroy(D);
+ return status;
+}
+
+
+/* Function: esl_msaweight_PB()
+ * Synopsis: PB (position-based) weights.
+ * Incept: SRE, Sun Nov 5 08:59:28 2006 [Janelia]
+ *
+ * Purpose: Given a multiple alignment <msa>, calculate sequence
+ * weights according to the position-based weighting
+ * algorithm (Henikoff and Henikoff, JMB 243:574-578,
+ * 1994). These weights are stored internally in the <msa>
+ * object, replacing any weights that may have already been
+ * there. Weights are $\geq 0$ and they sum to <msa->nseq>.
+ *
+ * The <msa> may be in either digitized or text mode.
+ * Digital mode is preferred, so that the algorithm
+ * deals with degenerate residue symbols properly.
+ *
+ * The Henikoffs' algorithm does not give rules for dealing
+ * with gaps or degenerate residue symbols. The rule here
+ * is to ignore them. This means that longer sequences
+ * initially get more weight; hence a "double
+ * normalization" in which the weights are first divided by
+ * sequence length in canonical residues (to compensate for
+ * that effect), then normalized to sum to nseq.
+ *
+ * An advantage of the PB method is efficiency.
+ * It is $O(1)$ in memory and $O(NL)$ time, for an alignment of
+ * N sequences and L columns. This makes it a good method
+ * for ad hoc weighting of very deep alignments.
+ *
+ * When the alignment is in simple text mode, IUPAC
+ * degenerate symbols are not dealt with correctly; instead,
+ * the algorithm simply uses the 26 letters as "residues"
+ * (case-insensitively), and treats all other residues as
+ * gaps.
+ *
+ * Returns: <eslOK> on success, and the weights inside <msa> have been
+ * modified.
+ *
+ * Throws: <eslEMEM> on allocation error, in which case <msa> is
+ * returned unmodified.
+ *
+ * Xref: [Henikoff94b]; squid::weight.c::PositionBasedWeights().
+ */
+int
+esl_msaweight_PB(ESL_MSA *msa)
+{
+ int *nres = NULL; /* counts of each residue observed in a column */
+ int ntotal; /* number of different symbols observed in a column */
+ int rlen; /* number of residues in a sequence */
+ int idx, pos, i;
+ int K; /* alphabet size */
+ int status;
+
+ /* Contract checks
+ */
+ ESL_DASSERT1( (msa->nseq >= 1) );
+ ESL_DASSERT1( (msa->alen >= 1) );
+ if (msa->nseq == 1) { msa->wgt[0] = 1.0; return eslOK; }
+
+ /* Initialize
+ */
+ if (! (msa->flags & eslMSA_DIGITAL))
+ { ESL_ALLOC(nres, sizeof(int) * 26); K = 26; }
+#ifdef eslAUGMENT_ALPHABET
+ else
+ { ESL_ALLOC(nres, sizeof(int) * msa->abc->K); K = msa->abc->K; }
+#endif
+
+ esl_vec_DSet(msa->wgt, msa->nseq, 0.);
+
+ /* This section handles text alignments */
+ if (! (msa->flags & eslMSA_DIGITAL))
+ {
+ for (pos = 0; pos < msa->alen; pos++)
+ {
+ /* Collect # of letters A..Z in this column, and total */
+ esl_vec_ISet(nres, K, 0.);
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (isalpha((int) msa->aseq[idx][pos]))
+ nres[toupper((int) msa->aseq[idx][pos]) - 'A'] ++;
+ for (ntotal = 0, i = 0; i < K; i++) if (nres[i] > 0) ntotal++;
+
+ /* Bump weight on each seq by PB rule */
+ if (ntotal > 0) {
+ for (idx = 0; idx < msa->nseq; idx++) {
+ if (isalpha((int) msa->aseq[idx][pos]))
+ msa->wgt[idx] += 1. /
+ (double) (ntotal * nres[toupper((int) msa->aseq[idx][pos]) - 'A'] );
+ }
+ }
+ }
+
+ /* first normalization by # of residues counted in each seq */
+ for (idx = 0; idx < msa->nseq; idx++) {
+ for (rlen = 0, pos = 0; pos < msa->alen; pos++)
+ if (isalpha((int) msa->aseq[idx][pos])) rlen++;
+ if (ntotal > 0) msa->wgt[idx] /= (double) rlen;
+ /* if rlen == 0 for this seq, its weight is still 0.0, as initialized. */
+ }
+ }
+
+ /* This section handles digital alignments. */
+#ifdef eslAUGMENT_ALPHABET
+ else
+ {
+ for (pos = 1; pos <= msa->alen; pos++)
+ {
+ /* Collect # of residues 0..K-1 in this column, and total # */
+ esl_vec_ISet(nres, K, 0.);
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (esl_abc_XIsCanonical(msa->abc, msa->ax[idx][pos]))
+ nres[(int) msa->ax[idx][pos]] ++;
+ for (ntotal = 0, i = 0; i < K; i++) if (nres[i] > 0) ntotal++;
+
+ /* Bump weight on each sequence by PB rule */
+ if (ntotal > 0) {
+ for (idx = 0; idx < msa->nseq; idx++) {
+ if (esl_abc_XIsCanonical(msa->abc, msa->ax[idx][pos]))
+ msa->wgt[idx] += 1. / (double) (ntotal * nres[msa->ax[idx][pos]]);
+ }
+ }
+ }
+
+ /* first normalization by # of residues counted in each seq */
+ for (idx = 0; idx < msa->nseq; idx++)
+ {
+ for (rlen = 0, pos = 1; pos <= msa->alen; pos++)
+ if (esl_abc_XIsCanonical(msa->abc, msa->ax[idx][pos])) rlen++;
+ if (rlen > 0) msa->wgt[idx] /= (double) rlen;
+ /* if rlen == 0 for this seq, its weight is still 0.0, as initialized. */
+ }
+ }
+#endif
+
+ /* Make weights normalize up to nseq, and return. In pathological
+ * case where all wgts were 0 (no seqs contain any unambiguous
+ * residues), weights become 1.0.
+ */
+ esl_vec_DNorm(msa->wgt, msa->nseq);
+ esl_vec_DScale(msa->wgt, msa->nseq, (double) msa->nseq);
+ msa->flags |= eslMSA_HASWGTS;
+
+ free(nres);
+ return eslOK;
+
+ ERROR:
+ if (nres != NULL) free(nres);
+ return status;
+}
+
+
+/* Function: esl_msaweight_BLOSUM()
+ * Synopsis: BLOSUM weights.
+ * Incept: SRE, Sun Nov 5 09:52:41 2006 [Janelia]
+ *
+ * Purpose: Given a multiple sequence alignment <msa> and an identity
+ * threshold <maxid>, calculate sequence weights using the
+ * BLOSUM algorithm (Henikoff and Henikoff, PNAS
+ * 89:10915-10919, 1992). These weights are stored
+ * internally in the <msa> object, replacing any weights
+ * that may have already been there. Weights are $\geq 0$
+ * and they sum to <msa->nseq>.
+ *
+ * The algorithm does a single linkage clustering by
+ * fractional id, defines clusters such that no two clusters
+ * have a pairwise link $\geq$ <maxid>), and assigns
+ * weights of $\frac{1}{M_i}$ to each of the $M_i$
+ * sequences in each cluster $i$. The <maxid> threshold
+ * is a fractional pairwise identity, in the range
+ * $0..1$.
+ *
+ * The <msa> may be in either digitized or text mode.
+ * Digital mode is preferred, so that the pairwise identity
+ * calculations deal with degenerate residue symbols
+ * properly.
+ *
+ * Returns: <eslOK> on success, and the weights inside <msa> have been
+ * modified.
+ *
+ * Throws: <eslEMEM> on allocation error. <eslEINVAL> if a pairwise
+ * identity calculation fails because of corrupted sequence
+ * data. In either case, the <msa> is unmodified.
+ *
+ * Xref: [Henikoff92]; squid::weight.c::BlosumWeights().
+ */
+int
+esl_msaweight_BLOSUM(ESL_MSA *msa, double maxid)
+{
+ int *c = NULL; /* cluster assignments for each sequence */
+ int *nmem = NULL; /* number of seqs in each cluster */
+ int nc; /* number of clusters */
+ int i; /* loop counter */
+ int status;
+
+ /* Contract checks
+ */
+ ESL_DASSERT1( (maxid >= 0. && maxid <= 1.) );
+ ESL_DASSERT1( (msa->nseq >= 1) );
+ ESL_DASSERT1( (msa->alen >= 1) );
+ if (msa->nseq == 1) { msa->wgt[0] = 1.0; return eslOK; }
+
+ if ((status = esl_msacluster_SingleLinkage(msa, maxid, &c, NULL, &nc)) != eslOK) goto ERROR;
+ ESL_ALLOC(nmem, sizeof(int) * nc);
+ esl_vec_ISet(nmem, nc, 0);
+ for (i = 0; i < msa->nseq; i++) nmem[c[i]]++;
+ for (i = 0; i < msa->nseq; i++) msa->wgt[i] = 1. / (double) nmem[c[i]];
+
+ /* Make weights normalize up to nseq, and return.
+ */
+ esl_vec_DNorm(msa->wgt, msa->nseq);
+ esl_vec_DScale(msa->wgt, msa->nseq, (double) msa->nseq);
+ msa->flags |= eslMSA_HASWGTS;
+
+ free(nmem);
+ free(c);
+ return eslOK;
+
+ ERROR:
+ if (c != NULL) free(c);
+ if (nmem != NULL) free(nmem);
+ return status;
+}
+
+/* Function: esl_msaweight_IDFilter()
+ * Synopsis: Filter by %ID.
+ * Incept: ER, Wed Oct 29 10:06:43 2008 [Janelia]
+ *
+ * Purpose: Constructs a new alignment by removing near-identical
+ * sequences from a given alignment (where identity is
+ * calculated *based on the alignment*).
+ * Does not affect the given alignment.
+ * Keeps earlier sequence, discards later one.
+ *
+ * Usually called as an ad hoc sequence "weighting" mechanism.
+ *
+ * Limitations:
+ * Unparsed Stockholm markup is not propagated into the
+ * new alignment.
+ *
+ * Return: <eslOK> on success, and the <newmsa>.
+ *
+ * Throws: <eslEMEM> on allocation error. <eslEINVAL> if a pairwise
+ * identity calculation fails because of corrupted sequence
+ * data. In either case, the <msa> is unmodified.
+ *
+ * Xref: squid::weight.c::FilterAlignment().
+ */
+int
+esl_msaweight_IDFilter(const ESL_MSA *msa, double maxid, ESL_MSA **ret_newmsa)
+{
+ int *list = NULL; /* array of seqs in new msa */
+ int *useme = NULL; /* TRUE if seq is kept in new msa */
+ int nnew; /* number of seqs in new alignment */
+ double ident; /* pairwise percentage id */
+ int i,j; /* seqs counters*/
+ int remove; /* TRUE if sq is to be removed */
+ int status;
+
+ /* Contract checks
+ */
+ ESL_DASSERT1( (msa != NULL) );
+ ESL_DASSERT1( (msa->nseq >= 1) );
+ ESL_DASSERT1( (msa->alen >= 1) );
+
+ /* allocate */
+ ESL_ALLOC(list, sizeof(int) * msa->nseq);
+ ESL_ALLOC(useme, sizeof(int) * msa->nseq);
+ esl_vec_ISet(useme, msa->nseq, 0); /* initialize array */
+
+ /* find which seqs to keep (list) */
+ nnew = 0;
+ for (i = 0; i < msa->nseq; i++)
+ {
+ remove = FALSE;
+ for (j = 0; j < nnew; j++)
+ {
+ if (! (msa->flags & eslMSA_DIGITAL)) {
+ if ((status = esl_dst_CPairId(msa->aseq[i], msa->aseq[list[j]], &ident, NULL, NULL)) != eslOK) goto ERROR;
+ }
+#ifdef eslAUGMENT_ALPHABET
+ else {
+ if ((status = esl_dst_XPairId(msa->abc, msa->ax[i], msa->ax[list[j]], &ident, NULL, NULL)) != eslOK) goto ERROR;
+ }
+#endif
+
+ if (ident >= maxid)
+ {
+ remove = TRUE;
+ break;
+ }
+ }
+ if (remove == FALSE) {
+ list[nnew++] = i;
+ useme[i] = TRUE;
+ }
+ }
+ if ((status = esl_msa_SequenceSubset(msa, useme, ret_newmsa)) != eslOK) goto ERROR;
+
+ free(list);
+ free(useme);
+ return eslOK;
+
+ ERROR:
+ if (list != NULL) free(list);
+ if (useme != NULL) free(useme);
+ return status;
+}
+/*---------------- end, weighting implementations ----------------*/
+
+
+
+
+/*****************************************************************
+ * 2. Unit tests
+ *****************************************************************/
+#ifdef eslMSAWEIGHT_TESTDRIVE
+
+static int
+utest_GSC(ESL_ALPHABET *abc, ESL_MSA *msa, double *expect)
+{
+ char *msg = "GSC weights unit test failure";
+
+ if (esl_msaweight_GSC(msa) != eslOK) esl_fatal(msg);
+ if (esl_vec_DCompare(msa->wgt, expect, msa->nseq, 0.001) != eslOK) esl_fatal(msg);
+
+ if (abc != NULL)
+ {
+ if (esl_msa_Digitize(abc, msa, NULL) != eslOK) esl_fatal(msg);
+ if (esl_msaweight_GSC(msa) != eslOK) esl_fatal(msg);
+ if (esl_vec_DCompare(msa->wgt, expect, msa->nseq, 0.001) != eslOK) esl_fatal(msg);
+ if (esl_msa_Textize(msa) != eslOK) esl_fatal(msg);
+ }
+ return eslOK;
+}
+
+static int
+utest_PB(ESL_ALPHABET *abc, ESL_MSA *msa, double *expect)
+{
+ char *msg = "PB weights unit test failure";
+
+ if (esl_msaweight_PB(msa) != eslOK) esl_fatal(msg);
+ if (esl_vec_DCompare(msa->wgt, expect, msa->nseq, 0.001) != eslOK) esl_fatal(msg);
+
+ if (abc != NULL)
+ {
+ if (esl_msa_Digitize(abc, msa, NULL) != eslOK) esl_fatal(msg);
+ if (esl_msaweight_PB(msa) != eslOK) esl_fatal(msg);
+ if (esl_vec_DCompare(msa->wgt, expect, msa->nseq, 0.001) != eslOK) esl_fatal(msg);
+ if (esl_msa_Textize(msa) != eslOK) esl_fatal(msg);
+ }
+ return eslOK;
+}
+
+static int
+utest_BLOSUM(ESL_ALPHABET *abc, ESL_MSA *msa, double maxid, double *expect)
+{
+ char *msg = "BLOSUM weights unit test failure";
+
+ if (esl_msaweight_BLOSUM(msa, maxid) != eslOK) esl_fatal(msg);
+ if (esl_vec_DCompare(msa->wgt, expect, msa->nseq, 0.001) != eslOK) esl_fatal(msg);
+
+ if (abc != NULL)
+ {
+ if (esl_msa_Digitize(abc, msa, NULL) != eslOK) esl_fatal(msg);
+ if (esl_msaweight_BLOSUM(msa, maxid) != eslOK) esl_fatal(msg);
+ if (esl_vec_DCompare(msa->wgt, expect, msa->nseq, 0.001) != eslOK) esl_fatal(msg);
+ if (esl_msa_Textize(msa) != eslOK) esl_fatal(msg);
+ }
+ return eslOK;
+}
+#endif /*eslMSAWEIGHT_TESTDRIVE*/
+/*-------------------- end, unit tests -------------------------*/
+
+
+
+
+
+/*****************************************************************
+ * 3. Test driver
+ *****************************************************************/
+#ifdef eslMSAWEIGHT_TESTDRIVE
+/* gcc -g -Wall -o test -L. -I. -DeslMSAWEIGHT_TESTDRIVE esl_msaweight.c -leasel -lm
+ * ./test
+ */
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msaweight.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_ALPHABET *aa_abc = NULL,
+ *nt_abc = NULL;
+ ESL_MSA *msa1 = NULL,
+ *msa2 = NULL,
+ *msa3 = NULL,
+ *msa4 = NULL,
+ *msa5 = NULL;
+ double uniform[5] = { 1.0, 1.0, 1.0, 1.0, 1.0 };
+ double wgt2[5] = { 0.833333, 0.833333, 0.833333, 0.833333, 1.66667 }; /* GSC, PB give same answer */
+ double gsc3[4] = { 1.125000, 0.875000, 0.875000, 1.125000 };
+ double pb3[4] = { 1.066667, 1.066667, 0.800000, 1.066667 };
+ double blosum3[4] = { 1.333333, 0.666667, 0.666667, 1.333333 };
+ double gsc4[4] = { 0.760870, 0.760870, 1.086957, 1.391304 };
+ double pb4[4] = { 0.800000, 0.800000, 1.000000, 1.400000 };
+ double blosum4[4] = { 0.666667, 0.666667, 1.333333, 1.333333 };
+
+ if ((aa_abc = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal("failed to create amino alphabet");
+ if ((nt_abc = esl_alphabet_Create(eslDNA)) == NULL) esl_fatal("failed to create DNA alphabet");
+
+ /* msa1: all sequences identical. Any weighting method should assign uniform weights.
+ * msa2: "contrived" example of [Henikoff94b]. "Correct" solution is 1==2, 3==4, and 5==2x other weights.
+ * msa3: the "nitrogenase segments" example of [Henikoff94b].
+ * msa4: alignment that makes the same distances as Figure 4 from [Gerstein94]
+ * msa5: gap pathology. no information here, so weighting methods should resort to uniform weights.
+ */
+ if ((msa1 = esl_msa_CreateFromString("# STOCKHOLM 1.0\n\nseq1 AAAAA\nseq2 AAAAA\nseq3 AAAAA\nseq4 AAAAA\nseq5 AAAAA\n//\n",
+ eslMSAFILE_STOCKHOLM)) == NULL) esl_fatal("msa 1 creation failed");
+ if ((msa2 = esl_msa_CreateFromString("# STOCKHOLM 1.0\n\nseq1 AAAAA\nseq2 AAAAA\nseq3 CCCCC\nseq4 CCCCC\nseq5 TTTTT\n//\n",
+ eslMSAFILE_STOCKHOLM)) == NULL) esl_fatal("msa 2 creation failed");
+ if ((msa3 = esl_msa_CreateFromString("# STOCKHOLM 1.0\n\nNIFE_CLOPA GYVGS\nNIFD_AZOVI GFDGF\nNIFD_BRAJA GYDGF\nNIFK_ANASP GYQGG\n//\n",
+ eslMSAFILE_STOCKHOLM)) == NULL) esl_fatal("msa 3 creation failed");
+ if ((msa4 = esl_msa_CreateFromString("# STOCKHOLM 1.0\n\nA AAAAAAAAAA\nB TTAAAAAAAA\nC ATAAAACCCC\nD GGGAAGGGGG\n//\n",
+ eslMSAFILE_STOCKHOLM)) == NULL) esl_fatal("msa 4 creation failed");
+ if ((msa5 = esl_msa_CreateFromString("# STOCKHOLM 1.0\n\nA A----\nB -C---\nC --G--\nD ---T-\nE ----T\n//\n",
+ eslMSAFILE_STOCKHOLM)) == NULL) esl_fatal("msa 5 creation failed");
+
+ utest_GSC(aa_abc, msa1, uniform);
+ utest_GSC(nt_abc, msa1, uniform);
+ utest_GSC(aa_abc, msa2, wgt2);
+ utest_GSC(nt_abc, msa2, wgt2);
+ utest_GSC(aa_abc, msa3, gsc3);
+ /* no nt test on msa3: it's protein-only */
+ utest_GSC(aa_abc, msa4, gsc4);
+ utest_GSC(nt_abc, msa4, gsc4);
+ utest_GSC(aa_abc, msa5, uniform);
+ utest_GSC(aa_abc, msa5, uniform);
+
+ utest_PB(aa_abc, msa1, uniform);
+ utest_PB(nt_abc, msa1, uniform);
+ utest_PB(aa_abc, msa2, wgt2);
+ utest_PB(nt_abc, msa2, wgt2);
+ utest_PB(aa_abc, msa3, pb3);
+ /* no nt test on msa3: it's protein-only */
+ utest_PB(aa_abc, msa4, pb4);
+ utest_PB(nt_abc, msa4, pb4);
+ utest_PB(aa_abc, msa5, uniform);
+ utest_PB(nt_abc, msa5, uniform);
+
+ utest_BLOSUM(aa_abc, msa1, 0.62, uniform);
+ utest_BLOSUM(nt_abc, msa1, 0.62, uniform);
+ utest_BLOSUM(aa_abc, msa2, 0.62, wgt2);
+ utest_BLOSUM(nt_abc, msa2, 0.62, wgt2);
+ utest_BLOSUM(aa_abc, msa3, 0.62, blosum3);
+ /* no nt test on msa3: it's protein-only */
+ utest_BLOSUM(aa_abc, msa4, 0.62, blosum4);
+ utest_BLOSUM(nt_abc, msa4, 0.62, blosum4);
+ utest_BLOSUM(aa_abc, msa5, 0.62, uniform);
+ utest_BLOSUM(nt_abc, msa5, 0.62, uniform);
+
+ /* BLOSUM weights have the peculiar property of going flat at maxid=0.0 (everyone
+ * clusters) or maxid=1.0 (nobody clusters).
+ */
+ utest_BLOSUM(aa_abc, msa4, 0.0, uniform);
+ utest_BLOSUM(aa_abc, msa4, 1.0, uniform);
+
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_msa_Destroy(msa3);
+ esl_msa_Destroy(msa4);
+ esl_msa_Destroy(msa5);
+ esl_alphabet_Destroy(aa_abc);
+ esl_alphabet_Destroy(nt_abc);
+ exit(0);
+}
+#endif /*eslMSAWEIGHT_TESTDRIVE*/
+/*-------------------- end, test driver -------------------------*/
+
+
+
+
+
+/*****************************************************************
+ * 4. Regression tests against squid
+ *****************************************************************/
+#ifdef eslMSAWEIGHT_REGRESSION
+/* Verify same results as SQUID.
+ * To compile:
+ gcc -g -Wall -o msaweight_regression -I. -L. -L ~/src/squid -I ~/src/squid -DeslMSAWEIGHT_REGRESSION \
+ esl_msaweight.c esl_msacluster.c -leasel -lsquid -lm
+ * To run:
+ * ./regression <MSA file>
+ *
+ * It's essential to recompile esl_msacluster under the eslMSAWEIGHT_REGRESSION flag
+ * too, because some squid compatibility code needs to get compiled in.
+ *
+ * Script for regression testing on Pfam:
+ * ./regression -q --maxN 4000 /misc/data0/databases/Pfam/Pfam-A.full
+ * ./regression --blosum -q /misc/data0/databases/Pfam/Pfam-A.full
+ * ./regression --pb -q /misc/data0/databases/Pfam/Pfam-A.full
+ */
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msaweight.h"
+#include "esl_vectorops.h"
+
+#include "squidconf.h"
+#include "squid.h"
+
+#define WGROUP "--blosum,--gsc,--pb"
+
+static ESL_OPTIONS options[] = {
+ /* name type deflt env rng togs req incmpt help docgrp */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0 },
+ { "-q", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "run quiet, only report problems", 0 },
+ { "--blosum", eslARG_NONE, FALSE, NULL, NULL, WGROUP, NULL, NULL, "use BLOSUM weights", 0 },
+ { "--gsc", eslARG_NONE,"default",NULL,NULL, WGROUP, NULL, NULL, "use GSC weights", 0 },
+ { "--pb", eslARG_NONE, FALSE, NULL, NULL, WGROUP, NULL, NULL, "use position-based weights", 0 },
+ { "--id", eslARG_REAL, "0.62",NULL,"0<=x<=1",NULL,"--blosum", NULL, "id threshold for --blosum", 0 },
+ { "--tol", eslARG_REAL, "0.01",NULL,"0<=x<=1",NULL, NULL, NULL, "fractional tolerance for wgt match", 0 },
+ { "--maxN", eslARG_INT, "0", NULL,"n>=0", NULL, NULL, NULL, "skip alignments w/ > <n> seqs", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+
+static char usage[] = "Usage: ./regression [-options] <msa_file>";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go;
+ char *msafile;
+ ESL_MSAFILE *afp;
+ ESL_MSA *msa;
+ float *sqd;
+ int status;
+ int nbad;
+ int nali = 0;
+ int nbadali = 0;
+ int nwgt = 0;
+ int nbadwgt = 0;
+ int i;
+ int be_quiet;
+ int do_gsc;
+ int do_pb;
+ int do_blosum;
+ double maxid;
+ double tol;
+ int maxN;
+
+ /* Process command line
+ */
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) esl_fatal("failed to parse cmd line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) esl_fatal("failed to parse cmd line: %s\n", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") == TRUE) {
+ puts(usage);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80); /* 0=all docgroups; 2=indentation; 80=width */
+ return 0;
+ }
+ be_quiet = esl_opt_GetBoolean(go, "-q");
+ do_blosum = esl_opt_GetBoolean(go, "--blosum");
+ do_gsc = esl_opt_GetBoolean(go, "--gsc");
+ do_pb = esl_opt_GetBoolean(go, "--pb");
+ maxid = esl_opt_GetReal (go, "--id");
+ tol = esl_opt_GetReal (go, "--tol");
+ maxN = esl_opt_GetInteger(go, "--maxN");
+ if (esl_opt_ArgNumber(go) != 1) {
+ puts("Incorrect number of command line arguments.");
+ puts(usage);
+ return 1;
+ }
+ msafile = esl_opt_GetArg(go, 1);
+ esl_getopts_Destroy(go);
+
+ /* Weight one or more alignments from input file
+ */
+ if ((status = esl_msafile_Open(NULL, msafile, NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+ while ( (status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ if (maxN > 0 && msa->nseq > maxN) { esl_msa_Destroy(msa); continue; }
+
+ nali++;
+ nwgt += msa->nseq;
+ ESL_ALLOC(sqd, sizeof(float) * msa->nseq);
+
+ if (do_gsc) {
+ esl_msaweight_GSC(msa);
+ GSCWeights(msa->aseq, msa->nseq, msa->alen, sqd);
+ } else if (do_pb) {
+ esl_msaweight_PB(msa);
+ PositionBasedWeights(msa->aseq, msa->nseq, msa->alen, sqd);
+ } else if (do_blosum) {
+ esl_msaweight_BLOSUM(msa, maxid);
+ BlosumWeights(msa->aseq, msa->nseq, msa->alen, maxid, sqd);
+ /* workaround SQUID bug: BLOSUM weights weren't renormalized to sum to nseq. */
+ esl_vec_FNorm (sqd, msa->nseq);
+ esl_vec_FScale(sqd, msa->nseq, (float) msa->nseq);
+ }
+
+ if (! be_quiet) {
+ for (i = 0; i < msa->nseq; i++)
+ fprintf(stdout, "%-20s %.3f %.3f\n",
+ msa->sqname[i], msa->wgt[i], sqd[i]);
+ }
+
+ nbad = 0;
+ for (i = 0; i < msa->nseq; i++)
+ if (esl_DCompare((double) sqd[i], msa->wgt[i], tol) != eslOK)
+ nbad++;
+ if (nbad > 0) nbadali++;
+ nbadwgt += nbad;
+
+ if (nbad > 0) printf("%-20s :: alignment shows %d weights that differ (out of %d) \n",
+ msa->name, nbad, msa->nseq);
+
+ esl_msa_Destroy(msa);
+ free(sqd);
+ }
+ esl_msafile_Close(afp);
+
+ if (nbadali == 0)
+ printf("OK: all weights identical between squid and Easel in %d alignment(s)\n", nali);
+ else {
+ printf("%d of %d weights mismatched at (> %f fractional difference)\n",
+ nbadwgt, nwgt, tol);
+ printf("involving %d of %d total alignments\n", nbadali, nali);
+ }
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+#endif /* eslMSAWEIGHT_REGRESSION */
+/*------------------ end, regression tests ----------------------*/
+
+
+
+/*****************************************************************
+ * 5. Benchmark.
+ *****************************************************************/
+#ifdef eslMSAWEIGHT_BENCHMARK
+/* gcc -g -Wall -o benchmark -I. -L. -DeslMSAWEIGHT_BENCHMARK esl_msaweight.c -leasel -lm
+ * ./benchmark <MSA file>
+ *
+ * Script for benchmarks on Pfam:
+ * ./benchmark --gsc --maxN 4000 /misc/data0/databases/Pfam/Pfam-A.full
+ * ./benchmark --blosum /misc/data0/databases/Pfam/Pfam-A.full
+ * ./benchmark --pb /misc/data0/databases/Pfam/Pfam-A.full
+ */
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msaweight.h"
+#include "esl_vectorops.h"
+#include "esl_stopwatch.h"
+
+#define WGROUP "--blosum,--gsc,--pb"
+
+static ESL_OPTIONS options[] = {
+ /* name type deflt env rng togs req incmpt help docgrp */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0 },
+ { "--blosum", eslARG_NONE, FALSE, NULL, NULL, WGROUP, NULL, NULL, "use BLOSUM weights", 0 },
+ { "--gsc", eslARG_NONE,"default",NULL,NULL, WGROUP, NULL, NULL, "use GSC weights", 0 },
+ { "--pb", eslARG_NONE, FALSE, NULL, NULL, WGROUP, NULL, NULL, "use position-based weights", 0 },
+ { "--id", eslARG_REAL, "0.62", NULL,"0<=x<=1",NULL,"--blosum",NULL, "id threshold for --blosum", 0 },
+ { "--maxN", eslARG_INT, "0", NULL,"n>=0", NULL, NULL, NULL, "skip alignments w/ > <n> seqs", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+
+static char usage[] = "Usage: ./benchmark [-options] <msa_file>";
+
+int
+main(int argc, char **argv)
+{
+ ESL_STOPWATCH *w;
+ ESL_GETOPTS *go;
+ char *msafile;
+ ESL_MSAFILE *afp;
+ ESL_MSA *msa;
+ int do_gsc;
+ int do_pb;
+ int do_blosum;
+ int maxN;
+ double maxid;
+ double cpu;
+ int status;
+
+ /* Process command line
+ */
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) esl_fatal("failed to parse cmd line: %s", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) esl_fatal("failed to parse cmd line: %s", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") == TRUE) {
+ puts(usage);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80); /* 0=all docgroups; 2=indentation; 80=width */
+ return 0;
+ }
+ do_blosum = esl_opt_GetBoolean(go, "--blosum");
+ do_gsc = esl_opt_GetBoolean(go, "--gsc");
+ do_pb = esl_opt_GetBoolean(go, "--pb");
+ maxid = esl_opt_GetReal (go, "--id");
+ maxN = esl_opt_GetInteger(go, "--maxN");
+ if (esl_opt_ArgNumber(go) != 1) {
+ puts("Incorrect number of command line arguments.");
+ puts(usage);
+ return 1;
+ }
+ if ((msafile = esl_opt_GetArg(go, 1)) == NULL) esl_fatal("failed to parse cmd line: %s", go->errbuf);
+ esl_getopts_Destroy(go);
+
+ w = esl_stopwatch_Create();
+
+ /* Weight one or more alignments from input file
+ */
+ if ((status = esl_msafile_Open(NULL, msafile, NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+ while ( (status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+ if (maxN > 0 && msa->nseq > maxN) { esl_msa_Destroy(msa); continue; }
+
+ esl_stopwatch_Start(w);
+
+ if (do_gsc) esl_msaweight_GSC(msa);
+ else if (do_pb) esl_msaweight_PB(msa);
+ else if (do_blosum) esl_msaweight_BLOSUM(msa, maxid);
+
+ esl_stopwatch_Stop(w);
+ cpu = w->user;
+ printf("%-20s %6d %6d %.3f\n", msa->name, msa->alen, msa->nseq, cpu);
+ esl_msa_Destroy(msa);
+ }
+ esl_msafile_Close(afp);
+
+ esl_stopwatch_Destroy(w);
+ return eslOK;
+}
+#endif /* eslMSAWEIGHT_BENCHMARK */
+/*-------------------- end, benchmark --------------------------*/
+
+
+
+
+/*****************************************************************
+ * 6. Statistics driver.
+ *****************************************************************/
+#ifdef eslMSAWEIGHT_STATS
+/* gcc -g -Wall -o stats -I. -L. -DeslMSAWEIGHT_STATS esl_msaweight.c -leasel -lm
+ * ./stats <MSA file>
+ *
+ * Script for weight statistics on Pfam:
+ * ./stats --gsc --maxN 4000 /misc/data0/databases/Pfam/Pfam-A.full
+ * ./stats --blosum /misc/data0/databases/Pfam/Pfam-A.full
+ * ./stats --pb /misc/data0/databases/Pfam/Pfam-A.full
+ */
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msaweight.h"
+#include "esl_vectorops.h"
+
+#define WGROUP "--blosum,--gsc,--pb"
+
+static ESL_OPTIONS options[] = {
+ /* name type deflt env rng togs req incmpt help docgrp */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0 },
+ { "--blosum", eslARG_NONE, FALSE, NULL, NULL, WGROUP, NULL, NULL, "use BLOSUM weights", 0 },
+ { "--gsc", eslARG_NONE,"default",NULL,NULL, WGROUP, NULL, NULL, "use GSC weights", 0 },
+ { "--pb", eslARG_NONE, FALSE, NULL, NULL, WGROUP, NULL, NULL, "use position-based weights", 0 },
+ { "--id", eslARG_REAL, "0.62", NULL,"0<=x<=1",NULL,"--blosum",NULL, "id threshold for --blosum", 0 },
+ { "--maxN", eslARG_INT, "0", NULL,"n>=0", NULL, NULL, NULL, "skip alignments w/ > <n> seqs", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+
+static char usage[] = "Usage: ./stats [-options] <msa_file>";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go;
+ char *msafile;
+ ESL_MSAFILE *afp;
+ ESL_MSA *msa;
+ int do_gsc;
+ int do_pb;
+ int do_blosum;
+ int maxN;
+ double maxid;
+ int nsmall, nbig;
+ int i;
+ int status;
+
+ /* Process command line */
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) esl_fatal("%s", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) esl_fatal("%s", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") == TRUE){
+ puts(usage);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80); /* 0=all docgroups; 2=indentation; 80=width */
+ return 0;
+ }
+ do_blosum = esl_opt_GetBoolean(go, "--blosum");
+ do_gsc = esl_opt_GetBoolean(go, "--gsc");
+ do_pb = esl_opt_GetBoolean(go, "--pb");
+ maxid = esl_opt_GetReal (go, "--id");
+ maxN = esl_opt_GetInteger(go, "--maxN");
+ if (esl_opt_ArgNumber(go) != 1) {
+ puts("Incorrect number of command line arguments.");
+ puts(usage);
+ return 1;
+ }
+ if ((msafile = esl_opt_GetArg(go, 1)) == NULL) esl_fatal("%s", go->errbuf);
+ esl_getopts_Destroy(go);
+
+ /* Weight one or more alignments from input file
+ */
+ if ((status = esl_msafile_Open(NULL, msafile, NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+ while ( (status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+ if (maxN > 0 && msa->nseq > maxN) { esl_msa_Destroy(msa); continue; }
+
+ if (do_gsc) esl_msaweight_GSC(msa);
+ else if (do_pb) esl_msaweight_PB(msa);
+ else if (do_blosum) esl_msaweight_BLOSUM(msa, maxid);
+
+ for (nsmall = 0, nbig = 0, i = 0; i < msa->nseq; i++) {
+ if (msa->wgt[i] < 0.2) nsmall++;
+ if (msa->wgt[i] > 5.0) nbig++;
+ }
+
+ printf("%-20s %5d %5d %8.4f %8.4f %5d %5d\n",
+ msa->name,
+ msa->nseq,
+ msa->alen,
+ esl_vec_DMin(msa->wgt, msa->nseq),
+ esl_vec_DMax(msa->wgt, msa->nseq),
+ nsmall,
+ nbig);
+ esl_msa_Destroy(msa);
+ }
+ esl_msafile_Close(afp);
+ return eslOK;
+}
+#endif /* eslMSAWEIGHT_STATS */
+/*---------------- end, statistics driver ----------------------*/
+
+
+
+
+
+
+/*****************************************************************
+ * 7. Examples.
+ *****************************************************************/
+/* Example: Calculate GSC weights for an input MSA.
+ */
+#ifdef eslMSAWEIGHT_EXAMPLE
+/*::cexcerpt::msaweight_example::begin::*/
+/* To compile: gcc -g -Wall -o example -I. -L. -DeslMSAWEIGHT_EXAMPLE esl_msaweight.c -leasel -lm
+ * To run: ./example <MSA file>
+ */
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msaweight.h"
+
+int main(int argc, char **argv)
+{
+ ESL_MSAFILE *afp;
+ ESL_MSA *msa;
+ int i;
+ int status;
+
+ if ( (status = esl_msafile_Open(NULL, argv[1], NULL, eslMSAFILE_UNKNOWN, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+ if ( (status = esl_msafile_Read(afp, &msa)) != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+ esl_msafile_Close(afp);
+
+ esl_msaweight_GSC(msa);
+
+ for (i = 0; i < msa->nseq; i++)
+ printf("%20s %f\n", msa->sqname[i], msa->wgt[i]);
+
+ return 0;
+}
+/*::cexcerpt::msaweight_example::end::*/
+#endif /*eslMSAWEIGHT_EXAMPLE*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msaweight.h b/esl_msaweight.h
new file mode 100644
index 0000000..6a62fbe
--- /dev/null
+++ b/esl_msaweight.h
@@ -0,0 +1,21 @@
+/* Sequence weighting algorithms.
+ *
+ * SRE, Sun Nov 5 09:11:13 2006 [Janelia]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslMSAWEIGHT_INCLUDED
+#define eslMSAWEIGHT_INCLUDED
+
+#include "esl_msa.h"
+
+extern int esl_msaweight_GSC(ESL_MSA *msa);
+extern int esl_msaweight_PB(ESL_MSA *msa);
+extern int esl_msaweight_BLOSUM(ESL_MSA *msa, double maxid);
+extern int esl_msaweight_IDFilter(const ESL_MSA *msa, double maxid, ESL_MSA **ret_newmsa);
+
+
+#endif /*eslMSAWEIGHT_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_msaweight.tex b/esl_msaweight.tex
new file mode 100644
index 0000000..0e5c4df
--- /dev/null
+++ b/esl_msaweight.tex
@@ -0,0 +1,53 @@
+The \eslmod{msaweight} module implements different \emph{ad hoc}
+sequence weighting algorithms, for compensating for overrepresentation
+in multiple sequence alignments.
+
+A multiple alignment often includes similar, even identical copies of
+sequences; the same sequence is often deposited in the databases more
+than once, and sequences from several closely related species are
+usually available. Thus relying on raw residue frequencies observed in
+multiple alignments is a flawed strategy, just as Wittgenstein
+wouldn't trust a consensus of two copies of his morning paper.
+
+The functions in the \eslmod{msaweight} API are summarized in
+Table~\ref{tbl:msa_api}.
+
+% TODO: Should implement more algorithms.
+
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\hyperlink{func:esl_msaweight_GSC()}{\ccode{esl\_msaweight\_GSC()}} & GSC weights.\\
+\hyperlink{func:esl_msaweight_PB()}{\ccode{esl\_msaweight\_PB()}} & PB (position-based) weights.\\
+\hyperlink{func:esl_msaweight_BLOSUM()}{\ccode{esl\_msaweight\_BLOSUM()}} & BLOSUM weights.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{Functions in the \eslmod{msaweight} API. Requires the Easel core
+and phylogeny modules.}
+\label{tbl:msaweight_api}
+\end{table}
+
+\subsection{Example of using the msaweight API}
+
+An example of reading in a multiple alignment and calculating weights
+for its sequences using the GSC algorithm:
+
+\input{cexcerpts/msaweight_example}
+
+The new weights are stored internally in the \ccode{ESL\_MSA} object,
+and (as the example shows) can be accessed in its array
+\ccode{msa->wgt[0..nseq-1]}.
+
+\subsection{Pros and cons of different algorithms}
+
+% TODO: Computational complexity
+
+% TODO: Figures showing time, memory for varying N, L.
+
+% TODO: Eventually, benchmarks on HMMER: are these methods actually
+% different?
+
+
diff --git a/esl_normal.c b/esl_normal.c
new file mode 100644
index 0000000..f091a90
--- /dev/null
+++ b/esl_normal.c
@@ -0,0 +1,348 @@
+/* Statistical routines for normal (Gaussian) distributions.
+ *
+ * Contents:
+ * 1. Densities and distributions
+ * 2. Generic API, interface to histogram module
+ * 3. Unit tests
+ * 4. Test driver
+ * 5. Example
+ *
+ * To-do:
+ * - incomplete API, by the standards of other Easel stats modules.
+ * Compare esl_gumbel, for example.
+ *
+ *****************************************************************
+ * Crib notes.
+ *
+ * The error function is defined as: erf(x) = 2/sqrt(pi) \int_0^x e^{-t^2} dt
+ * The complementary error function is: erfc(x) = 1 - erf(x)
+ * The normal CDF in terms of erf: CDF(z) = 1/2 + 1/2 erf(z/sqrt(2))
+ * erf(x) is an "odd function": erf(x) = -erf(-x)
+ *
+ * lim_{x -> -inf} erf(x) = -1; erf(0) = 0; lim_{x -> +inf} erf(x) = 1
+ * lim_{x -> -inf} erfc(x) = 2 erfc(0) = 1; lim_{x -> +inf} erfc(x) = 0;
+ *
+ * erf(), erfc() in double precision are in the C99 standard. Some
+ * systems (cough, Microsoft, cough) are not necessarily C99 compliant
+ * and may not provide erf(), erfc(). But Easel will compile in an
+ * alternative, esl_stats_erfc(), if needed.
+ */
+#include "esl_config.h"
+
+#include <math.h>
+
+#include "easel.h"
+#include "esl_normal.h"
+#include "esl_stats.h"
+
+
+/*****************************************************************
+ * 1. Densities and distributions.
+ *****************************************************************/
+
+/* Function: esl_normal_pdf()
+ * Incept: SRE, Tue Nov 21 14:15:43 2006 [Janelia]
+ *
+ * Purpose: Calculates the normal (Gaussian) probability density
+ * function $P(X=x)$ for a normal distribution, given
+ * value <x>, mean <mu>, and standard deviation <sigma>.
+ *
+ * Xref: STL11/94.
+ */
+double
+esl_normal_pdf(double x, double mu, double sigma)
+{
+ double z;
+
+ z = (x - mu) / sigma;
+ return exp(-z*z*0.5) / (sigma * sqrt(2. * eslCONST_PI));
+}
+
+/* Function: esl_normal_logpdf()
+ * Incept: SRE, Tue Jan 9 20:43:52 2007 [Casa de Gatos]
+ *
+ * Purpose: Calculates the log of the probabiility density function
+ * for the normal (Gaussian), $\log P(X=x)$, given value
+ * <x>, mean <mu>, and standard deviation <sigma>.
+ *
+ * Xref: STL11/94.
+ */
+double
+esl_normal_logpdf(double x, double mu, double sigma)
+{
+ double z;
+
+ z = (x - mu) / sigma;
+ return (-z*z*0.5) - log(sigma) - log(sqrt(2.*eslCONST_PI));
+}
+
+/* Function: esl_normal_cdf()
+ * Incept: SRE, Tue Jan 9 20:59:04 2007 [Casa de Gatos]
+ *
+ * Purpose: Calculates the cumulative distribution function for the
+ * normal, $P(X \leq x)$, given value <x>, mean <mu>,
+ * and standard deviation <sigma>.
+ *
+ * Xref: STL11/94.
+ */
+double
+esl_normal_cdf(double x, double mu, double sigma)
+{
+ double z;
+
+ /* for z -> -inf, CDF->0, so we rearrange in order to avoid 1 - 1
+ * cancellation error that arises in 0.5 * (1 + erf(z)) version.
+ * This way, esl_normal_cdf() returns full double-precision dynamic
+ * range.
+ */
+ z = (x - mu) / sigma;
+ return 0.5 * erfc(-1. * z / sqrt(2.));
+}
+
+/* Function: esl_normal_surv()
+ * Incept: SRE, Thu Jan 11 20:16:23 2007 [Casa de Gatos]
+ *
+ * Purpose: Calculates the survivor function, $P(X>x)$ (that is,
+ * 1-CDF, the right tail probability mass) for a normal
+ * distribution, given value <x>, mean <mu>, and standard
+ * deviation <sigma>.
+ *
+ * Xref: STL11/94
+ */
+double
+esl_normal_surv(double x, double mu, double sigma)
+{
+ double z = (x - mu) / sigma;
+
+ /* As above, we avoid the use of 1-CDF or the more
+ * common 1/2 (1 - erf(z)) version because we need to
+ * avoid 1-1 cancellation error.
+ */
+ return 0.5 * erfc( z / sqrt(2.));
+}
+
+
+/*****************************************************************
+ * 2. Generic API, interface to histogram module
+ *****************************************************************/
+
+double
+esl_normal_generic_pdf(double x, void *params)
+{
+ double *v = (double *) params;
+ return esl_normal_pdf(x, v[0], v[1]);
+}
+
+double
+esl_normal_generic_cdf(double x, void *params)
+{
+ double *v = (double *) params;
+ return esl_normal_cdf(x, v[0], v[1]);
+}
+
+double
+esl_normal_generic_surv(double x, void *params)
+{
+ double *v = (double *) params;
+ return esl_normal_surv(x, v[0], v[1]);
+}
+
+
+/*****************************************************************
+ * 3. Unit tests.
+ *****************************************************************/
+#ifdef eslNORMAL_TESTDRIVE
+static int
+utest_pdf(void)
+{
+ char msg[] = "gaussian PDF unit test failed";
+ double mu = 0.;
+ double sigma = 1.;
+ double delta = 0.01;
+ double x;
+ double newpdf, lastpdf;
+ double cdf;
+
+ /* One way to test the PDF is to integrate the CDF by quadrature, which should give us ~ 1. */
+ for (cdf = 0., x = -40.; x < 40.; x += delta)
+ cdf += esl_normal_pdf(x, mu, sigma) * delta;
+ if (esl_DCompare(cdf, 1.0, 1e-9) != eslOK) esl_fatal(msg);
+
+ /* We also verify that we're using double-precision range */
+ x = 0.;
+ newpdf = esl_normal_pdf(x, mu, sigma);
+ do {
+ x += 1.;
+ lastpdf = newpdf;
+ newpdf = esl_normal_pdf(x, mu, sigma);
+ } while (newpdf > 0.);
+ /* If denormals flush to zero, we reach x=38; lastpdf = 2.12001e-298.
+ * With denormals, we reach one more step, x=39; lastpdf = 1.09722e-314.
+ * icc enables flush-to-zero at all -O levels, and gcc does not.
+ */
+ if (lastpdf > 1e-297 || x < 38.) esl_fatal(msg);
+ return eslOK;
+}
+
+static int
+utest_logpdf(void)
+{
+ char msg[] = "gaussian log PDF unit test failed";
+ double mu = 0.;
+ double sigma = 1.;
+ double delta = 0.01;
+ double x;
+ double old, new;
+ double cdf;
+
+ /* One way to test the log PDF is to integrate the CDF by quadrature, which should give us ~ 1. */
+ for (cdf = 0., x = -40.; x < 40.; x += delta)
+ cdf += exp(esl_normal_logpdf(x, mu, sigma)) * delta;
+ if (esl_DCompare(cdf, 1.0, 1e-9) != eslOK) esl_fatal(msg);
+
+ /* Another way is to compare exp(logpdf) to the PDF */
+ for (x = -20.; x < 20.; x += delta)
+ {
+ old = esl_normal_pdf (x, mu, sigma);
+ new = exp(esl_normal_logpdf(x, mu, sigma));
+ if (esl_DCompare(old, new, 1e-9) != eslOK) esl_fatal(msg);
+ }
+
+ return eslOK;
+}
+
+static int
+utest_cdf(void)
+{
+ char msg[] = "gaussian CDF unit test failed";
+ double mu = 0.;
+ double sigma = 1.;
+ double x;
+
+ x = esl_normal_cdf(mu, mu, sigma);
+ if (esl_DCompare(x, 0.5, 1e-9) != eslOK) esl_fatal(msg);
+
+ x = esl_normal_cdf(99., mu, sigma);
+ if (esl_DCompare(x, 1.0, 1e-9) != eslOK) esl_fatal(msg);
+
+ x = esl_normal_cdf(-99., mu, sigma);
+ if (esl_DCompare(x, 0.0, 1e-9) != eslOK) esl_fatal(msg);
+
+ x = esl_normal_cdf(-30., mu, sigma);
+ if (x > 1e-100 || x == 0.) esl_fatal(msg);
+
+ return eslOK;
+}
+
+
+static int
+utest_surv(void)
+{
+ char msg[] = "gaussian survival unit test failed";
+ double mu = 0.;
+ double sigma = 1.;
+ double x;
+
+ x = esl_normal_surv(mu, mu, sigma);
+ if (esl_DCompare(x, 0.5, 1e-9) != eslOK) esl_fatal(msg);
+
+ x = esl_normal_surv(-99., mu, sigma);
+ if (esl_DCompare(x, 1.0, 1e-9) != eslOK) esl_fatal(msg);
+
+ x = esl_normal_surv(99., mu, sigma);
+ if (esl_DCompare(x, 0.0, 1e-9) != eslOK) esl_fatal(msg);
+
+ x = esl_normal_surv(30., mu, sigma);
+ if (x > 1e-100 || x == 0.) esl_fatal(msg);
+
+ return eslOK;
+}
+#endif /*eslNORMAL_TESTDRIVE*/
+
+
+
+
+/*****************************************************************
+ * 4. Test driver.
+ *****************************************************************/
+#ifdef eslNORMAL_TESTDRIVE
+/* Compile:
+ gcc -g -Wall -I. -L. -o esl_normal_utest -DeslNORMAL_TESTDRIVE esl_normal.c -leasel -lm
+*/
+#include <stdio.h>
+#include <math.h>
+#include "easel.h"
+#include "esl_normal.h"
+
+int
+main(int argc, char **argv)
+{
+ utest_pdf();
+ utest_logpdf();
+ utest_cdf();
+ utest_surv();
+
+ return eslOK;
+}
+#endif /*eslNORMAL_TESTDRIVE*/
+
+/*****************************************************************
+ * 5. Example.
+ *****************************************************************/
+
+#ifdef eslNORMAL_EXAMPLE
+/* Print Gaussian distribution(s) in xmgrace XY set format
+ gcc -g -Wall -I. -L. -o esl_normal_example -DeslNORMAL_EXAMPLE esl_normal.c -leasel -lm
+ */
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_normal.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "--mean", eslARG_REAL, "0.0", NULL, NULL, NULL, NULL, NULL, "mean of normal distribution", 0 },
+ { "--sd", eslARG_REAL, "1.0", NULL, NULL, NULL, NULL, NULL, "s.d. of normal distribution", 0 },
+ { "--min", eslARG_REAL, "-10.0", NULL, NULL, NULL, NULL, NULL, "minimum for xaxis", 0 },
+ { "--max", eslARG_REAL, "10.0", NULL, NULL, NULL, NULL, NULL, "maximum for xaxis", 0 },
+ { "--step", eslARG_REAL, "1.0", NULL, NULL, NULL, NULL, NULL, "step size for xaxis", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "output a Gaussian histogram";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ double minx = esl_opt_GetReal(go, "--min");
+ double maxx = esl_opt_GetReal(go, "--max");
+ double xstep = esl_opt_GetReal(go, "--step");
+ double mean = esl_opt_GetReal(go, "--mean");
+ double sd = esl_opt_GetReal(go, "--sd");
+ double x;
+ double val;
+
+ for (x = minx; x < maxx; x += xstep)
+ {
+ val = esl_normal_logpdf(x, mean, sd) * xstep; /* replace w/ whatever you want to test drive */
+ printf("%f %g\n", x, val);
+ }
+ printf("&\n");
+
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslNORMAL_EXAMPLE*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_normal.h b/esl_normal.h
new file mode 100644
index 0000000..1e35814
--- /dev/null
+++ b/esl_normal.h
@@ -0,0 +1,22 @@
+/* Statistical routines for normal distributions
+ *
+ * SRE, Tue Nov 21 14:29:02 2006 [Janelia]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslNORMAL_INCLUDED
+#define eslNORMAL_INCLUDED
+
+extern double esl_normal_pdf (double x, double mu, double sigma);
+extern double esl_normal_logpdf(double x, double mu, double sigma);
+extern double esl_normal_cdf (double x, double mu, double sigma);
+extern double esl_normal_surv (double x, double mu, double sigma);
+
+extern double esl_normal_generic_pdf (double x, void *params);
+extern double esl_normal_generic_cdf (double x, void *params);
+extern double esl_normal_generic_surv(double x, void *params);
+
+#endif /*eslNORMAL_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_normal.tex b/esl_normal.tex
new file mode 100644
index 0000000..d4bc1fd
--- /dev/null
+++ b/esl_normal.tex
@@ -0,0 +1,24 @@
+
+\begin{tabular}{lcll}\hline
+Variate & $x$ & \ccode{double} & $ -\infty < x < \infty$ \\
+Location & $\mu$ & \ccode{double} & $-\infty < \mu < \infty$\\
+Scale & $\sigma$ & \ccode{double} & $\sigma > 0$ \\
+\hline
+\end{tabular}
+
+The probability density function (PDF) is:
+
+\begin{equation}
+PDF = P(X=x) = \frac{1}{\sigma \sqrt{2\pi}} e^{\frac{-(x-\mu)^2}{2\sigma^2}}.
+\end{equation}
+
+The cumulative distribution function (CDF) does not have a convenient
+closed-form expression. It is derived numerically in terms of the
+error function, $\mbox{erf}()$:
+
+\begin{equation}
+CDF = P(X<x) = \frac{1}{2} + \frac{1}{2} erf(\frac{x - \mu}{\sigma \sqrt{2}}).
+\end{equation}
+
+
+
diff --git a/esl_paml.c b/esl_paml.c
new file mode 100644
index 0000000..a672c9d
--- /dev/null
+++ b/esl_paml.c
@@ -0,0 +1,184 @@
+/* PAML interface.
+ *
+ * "Phylogenetic Analysis by Maximum Likelihood"
+ * Ziheng Yang
+ * http://abacus.gene.ucl.ac.uk/software/paml.html
+ * [Yang97]
+ *
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_vectorops.h"
+#include "esl_dmatrix.h"
+#include "esl_fileparser.h"
+#include "esl_paml.h"
+
+/* Function: esl_paml_ReadE()
+ * Incept: SRE, Fri Jul 9 09:27:24 2004 [St. Louis]
+ *
+ * Purpose: Read an amino acid rate matrix in PAML format from stream
+ * <fp>. Return it in two pieces: the symmetric E
+ * exchangeability matrix in <E>, and the stationary
+ * probability vector $\pi$ in <pi>.
+ * Caller provides the memory for both <E> and <pi>. <E>
+ * is a $20 \times 20$ matrix allocated as
+ * <esl_dmatrix_Create(20, 20)>. <pi> is an array with
+ * space for at least 20 doubles.
+ *
+ * The <E> matrix is symmetric for off-diagonal elements:
+ * $E_{ij} = E_{ij}$ for $i \neq j$. The on-diagonal
+ * elements $E_{ii}$ are not valid and should not be
+ * accessed. (They are set to zero.)
+
+ * The rate matrix will later be obtained from <E>
+ * and <pi> as
+ * $Q_{ij} = E_{ij} \pi_j$ for $i \neq j$
+ * and
+ * $Q_{ii} = -\sum_{j \neq i} Q_{ij}$
+ * then scaled to units of one
+ * substitution/site; see <esl_ratemx_E2Q()> and
+ * <esl_ratemx_ScaleTo()>.
+ *
+ * Data file format: First 190 numbers are a
+ * lower-triangular matrix E of amino acid
+ * exchangeabilities $E_{ij}$. Next 20 numbers are the
+ * amino acid frequencies $\pi_i$. Remainder of the
+ * datafile is ignored.
+ *
+ * The alphabet order in the matrix and the frequency
+ * vector is assumed to be "ARNDCQEGHILKMFPSTWYV"
+ * (alphabetical by three-letter code), which appears to be
+ * PAML's default order. This is transformed to Easel's
+ * "ACDEFGHIKLMNPQRSTVWY" (alphabetical by one-letter code)
+ * in the $E_{ij}$ and $\pi_i$ that are returned.
+ *
+ * Args: fp - open datafile for reading.
+ * E - RETURN: E matrix of amino acid exchangeabilities e_ij,
+ * symmetric (E_ij = E_ji),
+ * in Easel amino acid alphabet order A..Y.
+ * Caller provides appropriately allocated space.
+ * pi - RETURN: \pi_i vector of amino acid frequencies,
+ * in Easel amino acid alphabet order A..Y.
+ * Caller provides appropriately allocated space.
+ *
+ * Returns: <eslOK> on success.
+ * Returns <eslEOF> on premature end of file (parse failed), in which
+ * case the contents of <E> and <pi> are undefined.
+ *
+ * Throws: <eslEMEM> on internal allocation failure,
+ * and the contents of <E> and <pi> are undefined.
+ *
+ * Xref: STL8/p.56.
+ */
+int
+esl_paml_ReadE(FILE *fp, ESL_DMATRIX *E, double *pi)
+{
+ int status;
+ ESL_FILEPARSER *efp = NULL;
+ char *tok;
+ int i,j;
+ char *pamlorder = "ARNDCQEGHILKMFPSTWYV";
+ char *eslorder = "ACDEFGHIKLMNPQRSTVWY";
+ int perm[20];
+
+ if ((status = esl_dmatrix_SetZero(E)) != eslOK) goto ERROR;
+ esl_vec_DSet(pi, 20, 0.);
+
+ if ((efp = esl_fileparser_Create(fp)) == NULL) goto ERROR;
+ if ((status = esl_fileparser_SetCommentChar(efp, '#')) != eslOK) goto ERROR;
+
+ /* Construct the alphabet permutation we need.
+ * perm[i] -> original row/column i goes to row/column perm[i]
+ */
+ for (i = 0; i < 20; i++)
+ perm[i] = (int) (strchr(eslorder, pamlorder[i]) - eslorder);
+
+ /* Read the s_ij matrix data in, permuting as we go. */
+
+ for (i = 1; i < 20; i++)
+ for (j = 0; j < i; j++)
+ {
+ if ((status = esl_fileparser_GetToken(efp, &tok, NULL)) != eslOK) goto ERROR;
+ E->mx[perm[i]][perm[j]] = atof(tok);
+ E->mx[perm[j]][perm[i]] = E->mx[perm[i]][perm[j]];
+ }
+
+ /* Read the pi_i vector in, permuting as we read. */
+ for (i = 0; i < 20; i++)
+ {
+ if ((status = esl_fileparser_GetToken(efp, &tok, NULL)) != eslOK) goto ERROR;
+ pi[perm[i]] = atof(tok);
+ }
+
+ esl_fileparser_Destroy(efp);
+ return eslOK;
+
+ ERROR:
+ if (efp != NULL) esl_fileparser_Destroy(efp);
+ return status;
+}
+
+
+/*****************************************************************
+ * Utility: reformat a PAML file to a static vector
+ *****************************************************************/
+#ifdef eslPAML_UTILITY1
+
+/* gcc -g -Wall -o utility -I. -L. -DeslPAML_UTILITY1 esl_paml.c -leasel -lm
+ */
+#include "easel.h"
+#include "esl_dmatrix.h"
+#include "esl_paml.h"
+
+int
+main(int argc, char **argv)
+{
+ char *filename = argv[1];
+ FILE *fp = NULL;
+ ESL_DMATRIX *E = NULL;
+ double *pi = NULL;
+ int i,j,n;
+
+ E = esl_dmatrix_Create(20, 20);
+ pi = malloc(20 * sizeof(double));
+ if ((fp = fopen(filename, "r")) == NULL) esl_fatal("open failed");
+ if (esl_paml_ReadE(fp, E, pi) != eslOK) esl_fatal("parse failed");
+
+ n = 1;
+ for (i = 1; i < 20; i++)
+ for (j = 0; j < i; j++)
+ {
+ printf("%8.6f, ", E->mx[i][j]);
+ if (n++ == 10) { puts(""); n=1; }
+ }
+
+ puts("");
+
+ n = 1;
+ for (i = 0; i < 20; i++)
+ {
+ printf("%8.6f, ", pi[i]);
+ if (n++ == 10) { puts(""); n=1; }
+ }
+
+ fclose(fp);
+ free(pi);
+ esl_dmatrix_Destroy(E);
+ return 0;
+}
+
+#endif /*eslPAML_UTILITY1*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
diff --git a/esl_paml.h b/esl_paml.h
new file mode 100644
index 0000000..2e143c3
--- /dev/null
+++ b/esl_paml.h
@@ -0,0 +1,25 @@
+/* PAML interface
+ *
+ * "Phylogenetic Analysis by Maximum Likelihood"
+ * Ziheng Yang
+ * http://abacus.gene.ucl.ac.uk/software/paml.html
+ * [Yang97]
+ *
+ * incept: SRE, Tue Jul 13 13:20:08 2004 [St. Louis]
+ * upgrade to Easel: SRE, Thu Mar 8 13:26:20 2007 [Janelia]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslPAML_INCLUDED
+#define eslPAML_INCLUDED
+
+#include <stdio.h>
+#include <esl_dmatrix.h>
+
+extern int esl_paml_ReadE(FILE *fp, ESL_DMATRIX *E, double *pi);
+
+
+#endif /*eslPAML_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_paml.tex b/esl_paml.tex
new file mode 100644
index 0000000..88346de
--- /dev/null
+++ b/esl_paml.tex
@@ -0,0 +1,4 @@
+The \eslmod{paml} module implements support for reading certain data
+files from Ziheng Yang's PAML software suite \citep{Yang97}.
+
+
diff --git a/esl_random.c b/esl_random.c
new file mode 100644
index 0000000..d3022e2
--- /dev/null
+++ b/esl_random.c
@@ -0,0 +1,1279 @@
+/* Portable, threadsafe random number generators.
+ * Provides both a fast generator and a strong generator.
+ *
+ * 1. The ESL_RANDOMNESS object.
+ * 2. The generators, esl_random().
+ * 3. Debugging/development tools.
+ * 4. Other fundamental sampling (including Gaussian, gamma).
+ * 5. Multinomial sampling from discrete probability n-vectors.
+ * 6. Benchmark driver
+ * 7. Unit tests.
+ * 8. Test driver.
+ * 9. Example.
+ * 10. Copyright and license information.
+ *
+ * See http://csrc.nist.gov/rng/ for the NIST random number
+ * generation test suite.
+ *
+ * It'd be nice if we had a debugging/unit testing mode in which
+ * esl_random() deliberately generated extreme values, such as 0 for
+ * example. Routines that use esl_random() can be sensitive to whether
+ * the interval 0,1 is open or closed. We should be able to test for
+ * problems with interval endpoints without taking enormous numbers of
+ * samples.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#include <time.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "easel.h"
+#include "esl_random.h"
+
+static uint32_t choose_arbitrary_seed(void);
+static uint32_t jenkins_mix3(uint32_t a, uint32_t b, uint32_t c);
+static uint32_t knuth (ESL_RANDOMNESS *r);
+static uint32_t mersenne_twister (ESL_RANDOMNESS *r);
+static void mersenne_seed_table(ESL_RANDOMNESS *r, uint32_t seed);
+static void mersenne_fill_table(ESL_RANDOMNESS *r);
+
+/*****************************************************************
+ *# 1. The <ESL_RANDOMNESS> object.
+ *****************************************************************/
+
+/* Function: esl_randomness_Create()
+ * Synopsis: Create the default strong random number generator.
+ *
+ * Purpose: Create a random number generator using
+ * a given random seed. The <seed> must be $\geq 0$.
+ *
+ * The default random number generator uses the Mersenne
+ * Twister MT19937 algorithm \citep{Matsumoto98}. It has a
+ * period of $2^{19937}-1$, and equidistribution over
+ * $2^{32}$ values.
+ *
+ * If <seed> is $>0$, the random number generator is
+ * reproducibly initialized with that seed. Two RNGs
+ * created with the same nonzero seed will give exactly the
+ * same stream of pseudorandom numbers. This allows you to
+ * make reproducible stochastic simulations, for example.
+ *
+ * If <seed> is 0, an arbitrary seed is chosen.
+ * Internally, the arbitrary seed is produced by a
+ * combination of the current <time()> and the process id
+ * (if available; POSIX only). Two RNGs created with
+ * <seed>=0 will very probably (but not assuredly) give
+ * different streams of pseudorandom numbers. The true seed
+ * can be retrieved from the <ESL_RANDOMNESS> object using
+ * <esl_randomness_GetSeed()>. The strategy used for
+ * choosing the arbitrary seed is predictable, so it is
+ * not secure in any sense, especially in the cryptographic
+ * sense.
+ *
+ * Args: seed $>= 0$.
+ *
+ * Returns: an initialized <ESL_RANDOMNESS *> on success.
+ * Caller free's with <esl_randomness_Destroy()>.
+ *
+ * Throws: <NULL> on failure.
+ *
+ * Xref: SRE:STL8/p57.
+ * SRE:J5/21: Mersenne Twister.
+ */
+ESL_RANDOMNESS *
+esl_randomness_Create(uint32_t seed)
+{
+ ESL_RANDOMNESS *r = NULL;
+ int status;
+
+ ESL_ALLOC(r, sizeof(ESL_RANDOMNESS));
+ r->type = eslRND_MERSENNE;
+ r->mti = 0;
+ r->x = 0;
+ r->seed = 0;
+ esl_randomness_Init(r, seed);
+ return r;
+
+ ERROR:
+ return NULL;
+}
+
+/* Function: esl_randomness_CreateFast()
+ * Synopsis: Create the alternative fast generator.
+ *
+ * Purpose: Same as <esl_randomness_Create()>, except that a simple
+ * linear congruential generator (LCG) will be used.
+ *
+ * This is a low quality generator. Successive samples from
+ * an LCG are correlated, and it has a relatively short
+ * period. IT SHOULD NOT BE USED FOR SERIOUS
+ * SIMULATIONS. Rather, it's a quick and dirty RNG where
+ * you're sure that speed is more important than the
+ * quality of your random numbers. For a high quality RNG,
+ * use <esl_randomness_Create()> instead.
+ *
+ * This is a $(a=69069, c=1)$ LCG, with a period of
+ * $2^{32}$.
+ *
+ * It is about 20x faster to initialize the generator, and
+ * about 25\% faster to sample each number, compared to the
+ * default Mersenne Twister. (In most cases, this speed
+ * differential is not worth the degradation in
+ * quality. Since we made MT our default generator, the
+ * speed advantage of the LCG essentially disappeared, so
+ * in some sense this is legacy code.)
+ *
+ * Here's an example of how serial correlation arises in an
+ * LCG, and how it can lead to serious (and difficult to
+ * diagnose) failure in a Monte Carlo simulation. Recall
+ * that an LCG calculates $x_{i+1} = ax_i + c$. Suppose
+ * $x_i$ is small: in the range 0..6000, say, as a specific
+ * example. Now $x_{i+1}$ cannot be larger than 4.1e8, for
+ * an LCG with $a=69069$,$c=1$. So if you take a sample and
+ * test whether it is $< 1e-6$ (say), the next sample will
+ * be in a range of about 0..0.1, rather than being uniform
+ * on 0..1.
+ *
+ * Args: seed $>= 0$.
+ *
+ * Returns: an initialized <ESL_RANDOMNESS *> on success.
+ * Caller free's with <esl_randomness_Destroy()>.
+ *
+ * Throws: <NULL> on failure.
+ *
+ * Xref: SRE:J5/44: for accidental proof that the period is
+ * indeed 2^32.
+ */
+ESL_RANDOMNESS *
+esl_randomness_CreateFast(uint32_t seed)
+{
+ ESL_RANDOMNESS *r = NULL;
+ int status;
+
+ ESL_ALLOC(r, sizeof(ESL_RANDOMNESS));
+ r->type = eslRND_FAST;
+ r->mti = 0;
+ r->x = 0;
+ r->seed = 0;
+ esl_randomness_Init(r, seed);
+ return r;
+
+ ERROR:
+ return NULL;
+}
+
+
+/* Function: esl_randomness_CreateTimeseeded()
+ * Synopsis: Create an RNG with a quasirandom seed.
+ *
+ * Purpose: Like <esl_randomness_Create()>, but it initializes the
+ * the random number generator using a POSIX <time()> call
+ * (number of seconds since the POSIX epoch).
+ *
+ * This function is deprecated. Use
+ * <esl_randomness_Create(0)> instead.
+ *
+ * Returns: an initialized <ESL_RANDOMNESS *> on success.
+ * Caller free's with <esl_randomness_Destroy()>.
+ *
+ * Throws: <NULL> on failure.
+ *
+ * Xref: SRE:STL8/p57.
+ */
+ESL_RANDOMNESS *
+esl_randomness_CreateTimeseeded(void)
+{
+ return esl_randomness_Create(0);
+}
+
+
+/* Function: esl_randomness_Init()
+ * Synopsis: Reinitialize a RNG.
+ *
+ * Purpose: Reset and reinitialize an existing <ESL_RANDOMNESS>
+ * object with a new seed.
+ *
+ * Not generally recommended. This does not make a
+ * sequence of numbers more random, and may make it less
+ * so. Sometimes, though, it's useful to reseed an RNG
+ * to guarantee a particular reproducible series of
+ * pseudorandom numbers at an arbitrary point in a program;
+ * HMMER does this, for example, to guarantee the same
+ * results from the same HMM/sequence comparison regardless
+ * of where in a search the HMM or sequence occurs.
+ *
+ * Args: r - randomness object
+ * seed - new seed to use; >0.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if seed is $<= 0$.
+ *
+ * Xref: SRE:STL8/p57.
+ */
+int
+esl_randomness_Init(ESL_RANDOMNESS *r, uint32_t seed)
+{
+ if (seed == 0) seed = choose_arbitrary_seed();
+ if (r->type == eslRND_MERSENNE)
+ {
+ mersenne_seed_table(r, seed);
+ mersenne_fill_table(r);
+ }
+ else
+ {
+ r->seed = seed;
+ r->x = jenkins_mix3(seed, 87654321, 12345678); /* arbitrary dispersion of the seed */
+ if (r->x == 0) r->x = 42; /* make sure we don't have a zero */
+ }
+ return eslOK;
+}
+
+/* Function: esl_randomness_GetSeed()
+ * Synopsis: Returns the value of RNG's seed.
+ *
+ * Purpose: Return the value of the seed.
+ */
+uint32_t
+esl_randomness_GetSeed(const ESL_RANDOMNESS *r)
+{
+ return r->seed;
+}
+
+
+/* Function: esl_randomness_Destroy()
+ * Synopsis: Free an RNG.
+ *
+ * Purpose: Frees an <ESL_RANDOMNESS> object.
+ */
+void
+esl_randomness_Destroy(ESL_RANDOMNESS *r)
+{
+ free(r);
+ return;
+}
+
+/*----------- end of ESL_RANDOMNESS object functions --------------*/
+
+
+
+/*****************************************************************
+ *# 2. The generators and <esl_random()>
+ *****************************************************************/
+
+/* Function: esl_random()
+ * Synopsis: Generate a uniform random deviate on [0,1)
+ *
+ * Purpose: Returns a uniform deviate x, $0.0 \leq x < 1.0$, given
+ * RNG <r>.
+ *
+ * If you cast the return value to float, the [0,1) interval
+ * guarantee is lost because values close to 1 will round to
+ * 1.0.
+ *
+ * Returns: a uniformly distribute random deviate on interval
+ * $0.0 \leq x < 1.0$.
+ */
+double
+esl_random(ESL_RANDOMNESS *r)
+{
+ uint32_t x = (r->type == eslRND_MERSENNE) ? mersenne_twister(r) : knuth(r);
+ return ((double) x / 4294967296.0); /* 2^32: normalizes to [0,1) */
+}
+
+
+/* Function: esl_random_uint32()
+ * Synopsis: Generate a uniform random deviate on 0..2^32-1
+ * Incept: SRE, Wed Jan 13 10:59:26 2016
+ *
+ * Purpose: Returns a uniform deviate x, a 32-bit unsigned
+ * integer $0 \leq x < 2^{32}$, given RNG <r>.
+ */
+uint32_t
+esl_random_uint32(ESL_RANDOMNESS *r)
+{
+ return (r->type == eslRND_MERSENNE) ? mersenne_twister(r) : knuth(r);
+}
+
+
+static uint32_t
+knuth(ESL_RANDOMNESS *r)
+{
+ r->x *= 69069;
+ r->x += 1;
+ return r->x;
+}
+
+/* mersenne_twister() and other mersenne_*() functions below:
+ * A simple serial implementation of the original Mersenne Twister
+ * algorithm [Matsumoto98].
+ *
+ * There are more sophisticated and faster implementations of MT, using
+ * vector instructions and/or directly generating IEEE754 doubles
+ * bitwise rather than doing an expensive normalization. We can
+ * improve the implementation later if necessary, but even the basic
+ * MT offers ~10x speed improvement over Easel's previous RNG.
+ * [SRE, 30 May 09, Stockholm]
+ */
+static uint32_t
+mersenne_twister(ESL_RANDOMNESS *r)
+{
+ uint32_t x;
+ if (r->mti >= 624) mersenne_fill_table(r);
+
+ x = r->mt[r->mti++];
+ x ^= (x>>11);
+ x ^= (x<< 7) & 0x9d2c5680;
+ x ^= (x<<15) & 0xefc60000;
+ x ^= (x>>18);
+ return x;
+}
+
+/* mersenne_seed_table()
+ * Initialize the state of the RNG from a seed.
+ * Uses the knuth linear congruential generator.
+ */
+static void
+mersenne_seed_table(ESL_RANDOMNESS *r, uint32_t seed)
+{
+ int z;
+
+ r->seed = seed;
+ r->mt[0] = seed;
+ for (z = 1; z < 624; z++)
+ r->mt[z] = 69069 * r->mt[z-1];
+ return;
+}
+
+/* mersenne_fill_table()
+ * Refill the table with 624 new random numbers.
+ * We do this whenever we've reseeded, or when we
+ * run out of numbers.
+ */
+static void
+mersenne_fill_table(ESL_RANDOMNESS *r)
+{
+ uint32_t y;
+ int z;
+ static uint32_t mag01[2] = { 0x0, 0x9908b0df };
+
+ for (z = 0; z < 227; z++) /* 227 = N-M = 624-397 */
+ {
+ y = (r->mt[z] & 0x80000000) | (r->mt[z+1] & 0x7fffffff);
+ r->mt[z] = r->mt[z+397] ^ (y>>1) ^ mag01[(int)(y & 0x1)]; /* yes, the (int) cast is necessary; xref bug #e7; some compilers may try to cast y to signed int otherwise, to use it in an array index */
+ }
+ for (; z < 623; z++)
+ {
+ y = (r->mt[z] & 0x80000000) | (r->mt[z+1] & 0x7fffffff);
+ r->mt[z] = r->mt[z-227] ^ (y>>1) ^ mag01[(int)(y & 0x1)];
+ }
+ y = (r->mt[623] & 0x80000000) | (r->mt[0] & 0x7fffffff);
+ r->mt[623] = r->mt[396] ^ (y>>1) ^ mag01[(int)(y & 0x1)];
+ r->mti = 0;
+
+ return;
+}
+
+
+/* choose_arbitrary_seed()
+ * Return a 'quasirandom' seed > 0.
+ * This should be ok, but could be better.
+ * See RFC1750 for a discussion of securely seeding RNGs.
+ */
+static uint32_t
+choose_arbitrary_seed(void)
+{
+ uint32_t a = (uint32_t) time ((time_t *) NULL);
+ uint32_t b = 87654321; // we'll use getpid() below, if we can
+ uint32_t c = (uint32_t) clock(); // clock() gives time since process invocation, in msec at least, if not usec
+ uint32_t seed;
+#ifdef HAVE_GETPID
+ b = (uint32_t) getpid(); // preferable b choice, if we have POSIX getpid()
+#endif
+ seed = jenkins_mix3(a,b,c); // try to decorrelate closely spaced choices of pid/times
+ return (seed == 0) ? 42 : seed; /* 42 is entirely arbitrary, just to avoid seed==0. */
+}
+
+/* jenkins_mix3()
+ *
+ * from Bob Jenkins: given a,b,c, generate a number that's distributed
+ * reasonably uniformly on the interval 0..2^32-1 even for closely
+ * spaced choices of a,b,c.
+ */
+static uint32_t
+jenkins_mix3(uint32_t a, uint32_t b, uint32_t c)
+{
+ a -= b; a -= c; a ^= (c>>13);
+ b -= c; b -= a; b ^= (a<<8);
+ c -= a; c -= b; c ^= (b>>13);
+ a -= b; a -= c; a ^= (c>>12);
+ b -= c; b -= a; b ^= (a<<16);
+ c -= a; c -= b; c ^= (b>>5);
+ a -= b; a -= c; a ^= (c>>3);
+ b -= c; b -= a; b ^= (a<<10);
+ c -= a; c -= b; c ^= (b>>15);
+ return c;
+}
+/*----------- end of esl_random() --------------*/
+
+
+
+/*****************************************************************
+ *# 3. Debugging and development tools
+ *****************************************************************/
+
+/* Function: esl_randomness_Dump()
+ * Synopsis: Dump ESL_RANDOMNESS object to stream, for debugging/examination.
+ */
+int
+esl_randomness_Dump(FILE *fp, ESL_RANDOMNESS *r)
+{
+ if (r->type == eslRND_FAST)
+ {
+ fputs ("type = knuth\n", fp );
+ fprintf(fp, "state = %" PRIu32 "\n", r->x);
+ fprintf(fp, "seed = %" PRIu32 "\n", r->seed);
+ }
+ else if (r->type == eslRND_MERSENNE)
+ {
+ int i,j;
+
+ fputs ("type = mersenne twister\n", fp );
+ fprintf(fp, "mti = %d (0..623)\n", r->mti);
+ fprintf(fp, "mt[mti] = %" PRIu32 "\n", r->mt[r->mti]);
+
+ fprintf(fp, "%6d: ", 0);
+ for (i = 0, j=0; i < 624; i++)
+ {
+ fprintf(fp, "%11" PRIu32 " ", r->mt[i]);
+ if (++j == 20) { fprintf(fp, "\n%6d: ", i+1); j=0; }
+ }
+ fputs("\n", fp);
+ }
+ return eslOK;
+}
+/*----------- end, debugging/development tools ------------------*/
+
+
+/*****************************************************************
+ *# 4. Other fundamental sampling (including Gaussian, gamma)
+ *****************************************************************/
+
+/* Function: esl_rnd_UniformPositive()
+ * Synopsis: Generate a uniform positive random deviate on interval (0,1).
+ *
+ * Purpose: Same as <esl_random()>, but assure $0 < x < 1$;
+ * (positive uniform deviate).
+ */
+double
+esl_rnd_UniformPositive(ESL_RANDOMNESS *r)
+{
+ double x;
+ do { x = esl_random(r); } while (x == 0.0);
+ return x;
+}
+
+
+/* Function: esl_rnd_Gaussian()
+ * Synopsis: Generate a Gaussian-distributed sample.
+ *
+ * Purpose: Pick a Gaussian-distributed random variable
+ * with a given <mean> and standard deviation <stddev>, and
+ * return it.
+ *
+ * Implementation is derived from the public domain
+ * RANLIB.c <gennor()> function, written by Barry W. Brown
+ * and James Lovato (M.D. Anderson Cancer Center, Texas
+ * USA) using the method described in
+ * \citep{AhrensDieter73}.
+ *
+ * Original algorithm said to use uniform deviates on [0,1)
+ * interval (i.e. <esl_random()>), but this appears to be
+ * wrong. Use uniform deviates on (0,1) interval instead
+ * (i.e., <esl_rnd_UniformPositive()>). RANLIB, GNU Octave
+ * have made this alteration, possibly inadvertently.
+ * [xref cryptogenomicon post, 13 Oct 2014].
+ *
+ * Method: Impenetrability of the code is to be blamed on
+ * FORTRAN/f2c lineage.
+ *
+ * Args: r - ESL_RANDOMNESS object
+ * mean - mean of the Gaussian we're sampling from
+ * stddev - standard deviation of the Gaussian
+ */
+double
+esl_rnd_Gaussian(ESL_RANDOMNESS *r, double mean, double stddev)
+{
+ long i;
+ double snorm,u,s,ustar,aa,w,y,tt;
+
+ /* These static's are threadsafe: they are magic constants
+ * we will not touch.
+ */
+ static double a[32] = {
+ 0.0,3.917609E-2,7.841241E-2,0.11777,0.1573107,0.1970991,0.2372021,0.2776904,
+ 0.3186394,0.36013,0.4022501,0.4450965,0.4887764,0.5334097,0.5791322,
+ 0.626099,0.6744898,0.7245144,0.7764218,0.8305109,0.8871466,0.9467818,
+ 1.00999,1.077516,1.150349,1.229859,1.318011,1.417797,1.534121,1.67594,
+ 1.862732,2.153875
+ };
+ static double d[31] = {
+ 0.0,0.0,0.0,0.0,0.0,0.2636843,0.2425085,0.2255674,0.2116342,0.1999243,
+ 0.1899108,0.1812252,0.1736014,0.1668419,0.1607967,0.1553497,0.1504094,
+ 0.1459026,0.14177,0.1379632,0.1344418,0.1311722,0.128126,0.1252791,
+ 0.1226109,0.1201036,0.1177417,0.1155119,0.1134023,0.1114027,0.1095039
+ };
+ static double t[31] = {
+ 7.673828E-4,2.30687E-3,3.860618E-3,5.438454E-3,7.0507E-3,8.708396E-3,
+ 1.042357E-2,1.220953E-2,1.408125E-2,1.605579E-2,1.81529E-2,2.039573E-2,
+ 2.281177E-2,2.543407E-2,2.830296E-2,3.146822E-2,3.499233E-2,3.895483E-2,
+ 4.345878E-2,4.864035E-2,5.468334E-2,6.184222E-2,7.047983E-2,8.113195E-2,
+ 9.462444E-2,0.1123001,0.136498,0.1716886,0.2276241,0.330498,0.5847031
+ };
+ static double h[31] = {
+ 3.920617E-2,3.932705E-2,3.951E-2,3.975703E-2,4.007093E-2,4.045533E-2,
+ 4.091481E-2,4.145507E-2,4.208311E-2,4.280748E-2,4.363863E-2,4.458932E-2,
+ 4.567523E-2,4.691571E-2,4.833487E-2,4.996298E-2,5.183859E-2,5.401138E-2,
+ 5.654656E-2,5.95313E-2,6.308489E-2,6.737503E-2,7.264544E-2,7.926471E-2,
+ 8.781922E-2,9.930398E-2,0.11556,0.1404344,0.1836142,0.2790016,0.7010474
+ };
+
+ u = esl_rnd_UniformPositive(r);
+ s = 0.0;
+ if(u > 0.5) s = 1.0;
+ u += (u-s);
+ u = 32.0*u;
+ i = (long) (u);
+ if(i == 32) i = 31;
+ if(i == 0) goto S100;
+ /*
+ * START CENTER
+ */
+ ustar = u-(double)i;
+ aa = a[i-1];
+S40:
+ if (ustar <= t[i-1]) goto S60;
+ w = (ustar - t[i-1]) * h[i-1];
+S50:
+ /*
+ * EXIT (BOTH CASES)
+ */
+ y = aa+w;
+ snorm = y;
+ if(s == 1.0) snorm = -y;
+ return (stddev*snorm + mean);
+S60:
+ /*
+ * CENTER CONTINUED
+ */
+ u = esl_rnd_UniformPositive(r);
+ w = u*(a[i]-aa);
+ tt = (0.5*w+aa)*w;
+ goto S80;
+S70:
+ tt = u;
+ ustar = esl_rnd_UniformPositive(r);
+S80:
+ if(ustar > tt) goto S50;
+ u = esl_rnd_UniformPositive(r);
+ if(ustar >= u) goto S70;
+ ustar = esl_rnd_UniformPositive(r);
+ goto S40;
+S100:
+ /*
+ * START TAIL
+ */
+ i = 6;
+ aa = a[31];
+ goto S120;
+S110:
+ aa += d[i-1];
+ i += 1;
+ ESL_DASSERT1(( i <= 31 ));
+S120:
+ u += u;
+ if(u < 1.0) goto S110;
+ u -= 1.0;
+S140:
+ w = u*d[i-1];
+ tt = (0.5*w+aa)*w;
+ goto S160;
+S150:
+ tt = u;
+S160:
+ ustar = esl_rnd_UniformPositive(r);
+ if(ustar > tt) goto S50;
+ u = esl_rnd_UniformPositive(r);
+ if(ustar >= u) goto S150;
+ u = esl_rnd_UniformPositive(r);
+ goto S140;
+}
+
+
+
+/* subfunctions that esl_rnd_Gamma() is going to call:
+ */
+static double
+gamma_ahrens(ESL_RANDOMNESS *r, double a) /* for a >= 3 */
+{
+ double V; /* uniform deviates */
+ double X,Y;
+ double test;
+
+ do {
+ do { /* generate candidate X */
+ Y = tan(eslCONST_PI * esl_random(r));
+ X = Y * sqrt(2.*a -1.) + a - 1.;
+ } while (X <= 0.);
+ /* accept/reject X */
+ V = esl_random(r);
+ test = (1+Y*Y) * exp( (a-1.)* log(X/(a-1.)) - Y*sqrt(2.*a-1.));
+ } while (V > test);
+ return X;
+}
+static double
+gamma_integer(ESL_RANDOMNESS *r, unsigned int a) /* for small integer a, a < 12 */
+{
+ int i;
+ double U,X;
+
+ U = 1.;
+ for (i = 0; i < a; i++)
+ U *= esl_rnd_UniformPositive(r);
+ X = -log(U);
+
+ return X;
+}
+static double
+gamma_fraction(ESL_RANDOMNESS *r, double a) /* for fractional a, 0 < a < 1 */
+{ /* Knuth 3.4.1, exercise 16, pp. 586-587 */
+ double p, U, V, X, q;
+
+ p = eslCONST_E / (a + eslCONST_E);
+ do {
+ U = esl_random(r);
+ V = esl_rnd_UniformPositive(r);
+ if (U < p) {
+ X = pow(V, 1./a);
+ q = exp(-X);
+ } else {
+ X = 1. - log(V);
+ q = pow(X, a-1.);
+ }
+ U = esl_random(r);
+ } while (U >= q);
+ return X;
+}
+
+
+/* Function: esl_rnd_Gamma()
+ * Synopsis: Returns a random deviate from a Gamma(a, 1) distribution.
+ *
+ * Purpose: Return a random deviate distributed as Gamma(a, 1.)
+ * \citep[pp. 133--134]{Knu-81a}.
+ *
+ * The implementation follows not only Knuth \citep{Knu-81a},
+ * but also relied on examination of the implementation in
+ * the GNU Scientific Library (libgsl) \citep{Galassi06}.
+ *
+ * Args: r - random number generation seed
+ * a - order of the gamma function; a > 0
+ */
+double
+esl_rnd_Gamma(ESL_RANDOMNESS *r, double a)
+{
+ double aint;
+
+ ESL_DASSERT1(( a > 0. ));
+
+ aint = floor(a);
+ if (a == aint && a < 12.)
+ return gamma_integer(r, (unsigned int) a);
+ else if (a > 3.)
+ return gamma_ahrens(r, a);
+ else if (a < 1.)
+ return gamma_fraction(r, a);
+ else
+ return gamma_integer(r, aint) + gamma_fraction(r, a-aint);
+}
+
+
+/* Function: esl_rnd_Dirichlet()
+ * Synopsis: Sample a Dirichlet-distributed random probability vector
+ * Incept: SRE, Wed Feb 17 12:20:53 2016 [H1/76]
+ *
+ * Purpose: Using generator <rng>, sample a Dirichlet-distributed
+ * probabilty vector <p> of <K> elements, using Dirichlet
+ * parameters <alpha> (also of <K> elements).
+ *
+ * Caller provides the allocated space for <p>.
+ *
+ * <alpha> is optional. If it isn't provided (i.e. is
+ * <NULL>), sample <p> uniformly. (That is, use <alpha[i] =
+ * 1.> for all i=0..K-1.)
+ *
+ * This routine is redundant with <esl_dirichlet_DSample()>
+ * and <esl_dirichlet_DSampleUniform()> in the dirichlet
+ * module. Provided here because there's cases where we
+ * just want to sample a probability vector without
+ * introducing a dependency on all the stats/dirichlet code
+ * in Easel.
+ *
+ * Args: rng : random number generator
+ * alpha : OPTIONAL: Dirichlet parameters 0..K-1, or NULL to use alpha[i]=1 for all i
+ * K : number of elements in alpha, p
+ * p : RESULT: sampled probability vector
+ *
+ * Returns: (void)
+ */
+void
+esl_rnd_Dirichlet(ESL_RANDOMNESS *rng, const double *alpha, int K, double *p)
+{
+ int x;
+ double norm = 0.;
+
+ for (x = 0; x < K; x++)
+ {
+ p[x] = esl_rnd_Gamma(rng, (alpha ? alpha[x] : 1.0));
+ norm += p[x];
+ }
+ for (x = 0; x < K; x++)
+ p[x] /= norm;
+}
+
+
+/* Function: esl_rnd_mem()
+ * Synopsis: Overwrite a buffer with random garbage.
+ * Incept: SRE, Fri Feb 19 08:53:07 2016
+ *
+ * Purpose: Write <n> bytes of random garbage into buffer
+ * <buf>, by uniform sampling of values 0..255,
+ * using generator <rng>.
+ *
+ * Used in unit tests that are reusing memory, and that
+ * want to make sure that there's no favorable side effects
+ * from that reuse.
+ */
+void
+esl_rnd_mem(ESL_RANDOMNESS *rng, void *buf, int n)
+{
+ unsigned char *p = (unsigned char *) buf;
+ int i;
+
+ for (i = 0; i < n; i++)
+ p[i] = (unsigned char) esl_rnd_Roll(rng, 256);
+}
+
+
+/*****************************************************************
+ *# 5. Multinomial sampling from discrete probability n-vectors
+ *****************************************************************/
+
+/* Function: esl_rnd_DChoose()
+ * Synopsis: Return random choice from discrete multinomial distribution.
+ *
+ * Purpose: Make a random choice from a normalized discrete
+ * distribution <p> of <N> elements, where <p>
+ * is double-precision. Returns the index of the
+ * selected element, $0..N-1$.
+ *
+ * <p> must be a normalized probability distribution
+ * (i.e. must sum to one). Sampling distribution is
+ * undefined otherwise: that is, a choice will always
+ * be returned, but it might be an arbitrary one.
+ *
+ * All $p_i$ must be $>$ <DBL_EPSILON> in order to
+ * have a non-zero probability of being sampled.
+ *
+ * <esl_rnd_FChoose()> is the same, but for floats in <p>,
+ * and all $p_i$ must be $>$ <FLT_EPSILON>.
+ */
+int
+esl_rnd_DChoose(ESL_RANDOMNESS *r, const double *p, int N)
+{
+ double norm = 0.0; /* ~ 1.0 */
+ double sum = 0.0; /* integrated prob */
+ double roll = esl_random(r); /* random fraction */
+ int i; /* counter over the probs */
+
+ /* we need to deal with finite roundoff error in p's sum */
+ for (i = 0; i < N; i++) norm += p[i];
+ ESL_DASSERT1((norm > 0.999 && norm < 1.001));
+
+ for (i = 0; i < N; i++)
+ {
+ sum += p[i];
+ if (roll < (sum / norm) ) return i;
+ }
+ esl_fatal("unreached code was reached. universe collapses.");
+ return 0; /*notreached*/
+}
+int
+esl_rnd_FChoose(ESL_RANDOMNESS *r, const float *p, int N)
+{
+ /* Computing in double precision is important:
+ * casting <roll> to (float) gives a [0,1] number instead of [0,1).
+ */
+ double norm = 0.0; /* ~ 1.0 */
+ double sum = 0.0; /* integrated prob */
+ double roll = esl_random(r); /* random fraction */
+ int i; /* counter over the probs */
+
+ for (i = 0; i < N; i++) norm += p[i];
+ ESL_DASSERT1((norm > 0.99 && norm < 1.01));
+
+ for (i = 0; i < N; i++)
+ {
+ sum += (double) p[i];
+ if (roll < (sum / norm) ) return i;
+ }
+ esl_fatal("unreached code was reached. universe collapses.");
+ return 0; /*notreached*/
+}
+
+
+/* Function: esl_rnd_DChooseCDF()
+ * Synopsis: Return random choice from cumulative multinomial distribution.
+ *
+ * Purpose: Given a random number generator <r> and a cumulative
+ * multinomial distribution <cdf[0..N-1]>, sample an element
+ * <0..N-1> from that distribution. Return the index <0..N-1>.
+ *
+ * Caller should be sure that <cdf[0..N-1]> is indeed a
+ * cumulative multinomial distribution -- in particular, that
+ * <cdf[N-1]> is tolerably close to 1.0 (within roundoff error).
+ *
+ * When sampling many times from the same multinomial
+ * distribution <p>, it will generally be faster to
+ * calculate the CDF once using <esl_vec_DCDF(p, N, cdf)>,
+ * then sampling many times from the CDF with
+ * <esl_rnd_DChooseCDF(r, cdf, N)>, as opposed to calling
+ * <esl_rnd_DChoose(r, p, N)> many times, because
+ * <esl_rnd_DChoose()> has to calculated the CDF before
+ * sampling. This also gives you a bit more control over
+ * error detection: you can make sure that the CDF is ok (p
+ * does sum to ~1.0) before doing a lot of sampling from
+ * it.
+ *
+ * <esl_rnd_FChooseCDF()> is the same, but for
+ * a single-precision float <cdf>.
+ *
+ * Args: r - random number generator
+ * cdf - cumulative multinomial distribution, cdf[0..N-1]
+ * N - number of elements in <cdf>
+ *
+ * Returns: index 0..N-1 of the randomly sampled choice from <cdf>.
+ *
+ * Note: For large N, it might be advantageous to bisection search the
+ * cdf. For typical N in Easel (up to 20, for amino acid
+ * prob vectors, for example), the naive code below is
+ * faster. We could revisit this if we start sampling
+ * larger vectors.
+ */
+int
+esl_rnd_DChooseCDF(ESL_RANDOMNESS *r, const double *cdf, int N)
+{
+ double roll = esl_random(r); /* uniform 0.0 <= x < 1.0 */
+ int i;
+
+ ESL_DASSERT1((cdf[0] >= 0.0));
+ ESL_DASSERT1((cdf[N-1] > 0.999 && cdf[N-1] < 1.001));
+
+ for (i = 0; i < N; i++)
+ if (roll < cdf[i] / cdf[N-1]) return i;
+ esl_fatal("unreached code is reached. universe goes foom");
+ return 0; /*notreached*/
+}
+int
+esl_rnd_FChooseCDF(ESL_RANDOMNESS *r, const float *cdf, int N)
+{
+ double roll = esl_random(r); /* uniform 0.0 <= x < 1.0. must be double, not float, to guarantee x <1 */
+ int i;
+
+ ESL_DASSERT1((cdf[0] >= 0.0));
+ ESL_DASSERT1((cdf[N-1] > 0.99 && cdf[N-1] < 1.01));
+
+ for (i = 0; i < N; i++)
+ if (roll < (double) cdf[i] / (double) cdf[N-1]) return i; // yes, the casts are NECESSARY. Without them, you get a heisenbug on icc/linux.
+ esl_fatal("unreached code is reached. universe goes foom");
+ return 0; /*notreached*/
+}
+
+
+/*****************************************************************
+ * 6. Benchmark driver
+ *****************************************************************/
+#ifdef eslRANDOM_BENCHMARK
+/*
+ gcc -O3 -malign-double -o esl_random_benchmark -I. -L. -DeslRANDOM_BENCHMARK esl_random.c -leasel -lm
+ ./esl_random_benchmark -N 1000000000
+ ./esl_random_benchmark -f -N 1000000000
+ ./esl_random_benchmark -r -N1000000
+ ./esl_random_benchmark -fr -N 1000000000
+ esl_random() esl_randomness_Init()
+ iter cpu time per call iter cpu time per call
+ ---- -------- -------- ---- ---------- ---------
+ 27 Dec 08 on wanderoo: 1e7 0.78s 78 nsec 1e6 2.08s 2.1 usec ran2() from NR
+ 30 May 09 on wanderoo: 1e9 8.39s 8 nsec 1e6 5.98s 6.0 usec Mersenne Twister
+ 1e9 5.73s 6 nsec 1e8 2.51s 0.03 usec Knuth
+
+ */
+#include "easel.h"
+#include "esl_composition.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_stopwatch.h"
+#include "esl_vectorops.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-c", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "benchmark DChooseCDF()", 0 },
+ { "-d", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "benchmark DChoose()", 0 },
+ { "-f", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "run fast version instead of MT19937", 0 },
+ { "-r", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "benchmark _Init(), not just random()", 0 },
+ { "-N", eslARG_INT, "10000000",NULL, NULL, NULL, NULL, NULL, "number of trials", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "benchmarking speed of random number generator";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = (esl_opt_GetBoolean(go, "-f") == TRUE ? esl_randomness_CreateFast(42) : esl_randomness_Create(42));
+ ESL_STOPWATCH *w = esl_stopwatch_Create();
+ int N = esl_opt_GetInteger(go, "-N");
+ double p[20];
+ double cdf[20];
+
+ esl_composition_BL62(p);
+ esl_vec_DCDF(p, 20, cdf);
+
+ esl_stopwatch_Start(w);
+ if (esl_opt_GetBoolean(go, "-c")) { while (N--) esl_rnd_DChoose(r, p, 20); }
+ else if (esl_opt_GetBoolean(go, "-d")) { while (N--) esl_rnd_DChooseCDF(r, cdf, 20); }
+ else if (esl_opt_GetBoolean(go, "-r")) { while (N--) esl_randomness_Init(r, 42); }
+ else { while (N--) esl_random(r); }
+
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "# CPU Time: ");
+
+ esl_stopwatch_Destroy(w);
+ esl_randomness_Destroy(r);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslRANDOM_BENCHMARK*/
+/*----------------- end, benchmark driver -----------------------*/
+
+
+
+
+/*****************************************************************
+ * 7. Unit tests.
+ *****************************************************************/
+
+#ifdef eslRANDOM_TESTDRIVE
+#include "esl_vectorops.h"
+#include "esl_stats.h"
+#include "esl_dirichlet.h"
+
+
+/* The esl_random() unit test:
+ * a binned frequency test.
+ */
+static void
+utest_random(ESL_RANDOMNESS *r, int n, int nbins, int be_verbose)
+{
+ char msg[] = "esl_random() unit test failed";
+ int *counts = NULL;
+ double X2p = 0.;
+ int i;
+ int sample;
+ double X2, exp, diff;
+
+ if ((counts = malloc(sizeof(int) * nbins)) == NULL) esl_fatal(msg);
+ esl_vec_ISet(counts, nbins, 0);
+
+ for (i = 0; i < n; i++)
+ {
+ sample = esl_rnd_Roll(r, nbins);
+ if (sample < 0 || sample >= nbins) esl_fatal(msg);
+ counts[sample]++;
+ }
+
+ /* X^2 value: \sum (o_i - e_i)^2 / e_i */
+ for (X2 = 0., i = 0; i < nbins; i++) {
+ exp = (double) n / (double) nbins;
+ diff = (double) counts[i] - exp;
+ X2 += diff*diff/exp;
+ }
+ if (esl_stats_ChiSquaredTest(nbins, X2, &X2p) != eslOK) esl_fatal(msg);
+ if (be_verbose) printf("random(): \t%g\n", X2p);
+ if (X2p < 0.01) esl_fatal(msg);
+
+ free(counts);
+ return;
+}
+
+/* The DChoose() and FChoose() unit tests.
+ */
+static void
+utest_choose(ESL_RANDOMNESS *r, int n, int nbins, int be_verbose)
+{
+ double *pd = NULL; /* probability vector, double */
+ double *pdc = NULL; /* CDF, double */
+ float *pf = NULL; /* probability vector, float */
+ float *pfc = NULL; /* CDF, float */
+ int *ct = NULL;
+ int i;
+ double X2, diff, exp, X2p;
+
+ if ((pd = malloc(sizeof(double) * nbins)) == NULL) esl_fatal("malloc failed");
+ if ((pdc = malloc(sizeof(double) * nbins)) == NULL) esl_fatal("malloc failed");
+ if ((pf = malloc(sizeof(float) * nbins)) == NULL) esl_fatal("malloc failed");
+ if ((pfc = malloc(sizeof(float) * nbins)) == NULL) esl_fatal("malloc failed");
+ if ((ct = malloc(sizeof(int) * nbins)) == NULL) esl_fatal("malloc failed");
+
+ /* Sample a random multinomial probability vector. */
+ if (esl_dirichlet_DSampleUniform(r, nbins, pd) != eslOK) esl_fatal("dirichlet sample failed");
+ esl_vec_D2F(pd, nbins, pf);
+
+ /* Test esl_rnd_DChoose():
+ * sample observed counts, chi-squared test against expected
+ */
+ esl_vec_ISet(ct, nbins, 0);
+ for (i = 0; i < n; i++)
+ ct[esl_rnd_DChoose(r, pd, nbins)]++;
+ for (X2 = 0., i=0; i < nbins; i++) {
+ exp = (double) n * pd[i];
+ diff = (double) ct[i] - exp;
+ X2 += diff*diff/exp;
+ }
+ if (esl_stats_ChiSquaredTest(nbins, X2, &X2p) != eslOK) esl_fatal("chi square eval failed");
+ if (be_verbose) printf("DChoose(): \t%g\n", X2p);
+ if (X2p < 0.01) esl_fatal("chi squared test failed");
+
+ /* Repeat above for FChoose(). */
+ esl_vec_ISet(ct, nbins, 0);
+ for (i = 0; i < n; i++)
+ ct[esl_rnd_FChoose(r, pf, nbins)]++;
+ for (X2 = 0., i=0; i < nbins; i++) {
+ exp = (double) n * pd[i];
+ diff = (double) ct[i] - exp;
+ X2 += diff*diff/exp;
+ }
+ if (esl_stats_ChiSquaredTest(nbins, X2, &X2p) != eslOK) esl_fatal("chi square eval failed");
+ if (be_verbose) printf("FChoose(): \t%g\n", X2p);
+ if (X2p < 0.01) esl_fatal("chi squared test failed");
+
+ /* esl_rnd_DChooseCDF(). */
+ esl_vec_ISet(ct, nbins, 0);
+ esl_vec_DCDF(pd, nbins, pdc);
+ for (i = 0; i < n; i++)
+ ct[esl_rnd_DChooseCDF(r, pdc, nbins)]++;
+ for (X2 = 0., i=0; i < nbins; i++) {
+ exp = (double) n * pd[i];
+ diff = (double) ct[i] - exp;
+ X2 += diff*diff/exp;
+ }
+ if (esl_stats_ChiSquaredTest(nbins, X2, &X2p) != eslOK) esl_fatal("chi square eval failed");
+ if (be_verbose) printf("DChoose(): \t%g\n", X2p);
+ if (X2p < 0.01) esl_fatal("chi squared test failed");
+
+ /* esl_rnd_FChooseCDF() */
+ esl_vec_ISet(ct, nbins, 0);
+ esl_vec_FCDF(pf, nbins, pfc);
+ for (i = 0; i < n; i++)
+ ct[esl_rnd_FChooseCDF(r, pfc, nbins)]++;
+ for (X2 = 0., i=0; i < nbins; i++) {
+ exp = (double) n * pf[i];
+ diff = (double) ct[i] - exp;
+ X2 += diff*diff/exp;
+ }
+ if (esl_stats_ChiSquaredTest(nbins, X2, &X2p) != eslOK) esl_fatal("chi square eval failed");
+ if (be_verbose) printf("DChoose(): \t%g\n", X2p);
+ if (X2p < 0.01) esl_fatal("chi squared test failed");
+
+ free(pd);
+ free(pdc);
+ free(pf);
+ free(pfc);
+ free(ct);
+ return;
+}
+#endif /*eslRANDOM_TESTDRIVE*/
+/*-------------------- end, unit tests --------------------------*/
+
+
+/*****************************************************************
+ * 8. Test driver.
+ *****************************************************************/
+#ifdef eslRANDOM_TESTDRIVE
+/* gcc -g -Wall -o esl_random_utest -L. -I. -DeslRANDOM_TESTDRIVE esl_random.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_dirichlet.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_randomseq.h"
+#include "esl_vectorops.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ {"-b", eslARG_INT, "20", NULL, "n>0",NULL, NULL, NULL, "number of test bins", 0},
+ {"-n", eslARG_INT, "1000000", NULL, "n>0",NULL, NULL, NULL, "number of samples", 0},
+ {"-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0},
+ {"-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show verbose output", 0},
+ {"--mtbits",eslARG_STRING,NULL,NULL, NULL, NULL, NULL, NULL, "save MT bit file for NIST benchmark",0},
+ {"--kbits", eslARG_STRING,NULL,NULL, NULL, NULL, NULL, NULL, "save Knuth bit file for NIST benchmark",0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for random module";
+
+static int save_bitfile(char *bitfile, ESL_RANDOMNESS *r, int n);
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r1 = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ ESL_RANDOMNESS *r2 = esl_randomness_CreateFast(esl_opt_GetInteger(go, "-s"));
+ char *mtbitfile = esl_opt_GetString (go, "--mtbits");
+ char *kbitfile = esl_opt_GetString (go, "--kbits");
+ int nbins = esl_opt_GetInteger(go, "-b");
+ int n = esl_opt_GetInteger(go, "-n");
+ int be_verbose = esl_opt_GetBoolean(go, "-v");
+
+ fprintf(stderr, "## %s\n", argv[0]);
+ fprintf(stderr, "# rng seed 1 (slow) = %" PRIu32 "\n", esl_randomness_GetSeed(r1));
+ fprintf(stderr, "# rng seed 2 (fast) = %" PRIu32 "\n", esl_randomness_GetSeed(r2));
+
+ utest_random(r1, n, nbins, be_verbose);
+ utest_choose(r1, n, nbins, be_verbose);
+ utest_random(r2, n, nbins, be_verbose);
+ utest_choose(r2, n, nbins, be_verbose);
+
+ if (mtbitfile) save_bitfile(mtbitfile, r1, n);
+ if (kbitfile) save_bitfile(kbitfile, r2, n);
+
+ fprintf(stderr, "# status = ok\n");
+
+ esl_randomness_Destroy(r1);
+ esl_randomness_Destroy(r2);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+static int
+save_bitfile(char *bitfile, ESL_RANDOMNESS *r, int n)
+{
+ FILE *fp = NULL;
+ int b,i;
+ long x;
+
+ /* Open the file.
+ */
+ if ((fp = fopen(bitfile, "w")) == NULL)
+ esl_fatal("failed to open %s for writing", bitfile);
+
+ /* Sample <n> random numbers, output 32n random bits to the file.
+ */
+ for (i = 0; i < n; i++)
+ {
+ x = (r->type == eslRND_FAST ? knuth(r) : mersenne_twister(r)); /* generate a 32 bit random variate by MT19937 */
+ for (b = 0; b < 32; b++)
+ {
+ if (x & 01) fprintf(fp, "1");
+ else fprintf(fp, "0");
+ x >>= 1;
+ }
+ fprintf(fp, "\n");
+ }
+ fclose(fp);
+ return eslOK;
+}
+#endif /*eslRANDOM_TESTDRIVE*/
+
+
+
+/*****************************************************************
+ * 9. Example.
+ *****************************************************************/
+#ifdef eslRANDOM_EXAMPLE
+/*::cexcerpt::random_example::begin::*/
+/* compile: cc -I. -o esl_random_example -DeslRANDOM_EXAMPLE esl_random.c esl_getopts.c easel.c -lm
+ * run: ./random_example 42
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+
+/* In Easel and HMMER, the option for setting the seed is typically -s, sometimes --seed.
+ * Default is usually 0 because we want a "random" seed. Less commonly, "42" for a fixed seed;
+ * rarely, a different fixed seed.
+ *
+ * Generally you want to use esl_randomness_Create(), to get a Mersenne Twister. The "fast"
+ * RNG you get from esl_randomness_CreateFast() isn't all that much faster (~25% per sample)
+ * but has much worse quality in its randomness.
+ */
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-i", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "sample uint32's instead of doubles", 0 },
+ { "-n", eslARG_INT, "20", NULL, NULL, NULL, NULL, NULL, "number of random samples to show", 0 },
+ { "-s", eslARG_INT, "0", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "example of using random module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *rng = esl_randomness_Create( esl_opt_GetInteger(go, "-s") );
+ int do_uint32 = esl_opt_GetBoolean(go, "-i");
+ int n = esl_opt_GetInteger(go, "-n");
+
+ printf("RNG seed: %" PRIu32 "\n", esl_randomness_GetSeed(rng));
+ printf("\nA sequence of %d pseudorandom numbers:\n", n);
+ if (do_uint32) while (n--) printf("%" PRIu32 "\n", esl_random_uint32(rng));
+ else while (n--) printf("%f\n", esl_random(rng));
+
+ printf("\nInternal dump of RNG state:\n");
+ esl_randomness_Dump(stdout, rng);
+
+ esl_randomness_Destroy(rng);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+/*::cexcerpt::random_example::end::*/
+#endif /*eslRANDOM_EXAMPLE*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
+
diff --git a/esl_random.h b/esl_random.h
new file mode 100644
index 0000000..08e7172
--- /dev/null
+++ b/esl_random.h
@@ -0,0 +1,61 @@
+/* Easel's portable, threadsafe random number generator.
+ */
+#ifndef eslRANDOM_INCLUDED
+#define eslRANDOM_INCLUDED
+
+#include <stdint.h>
+
+#define eslRND_FAST 0
+#define eslRND_MERSENNE 1
+
+typedef struct {
+ int type; /* eslRND_FAST | eslRND_MERSENNE */
+ int mti; /* current position in mt[] table */
+ uint32_t mt[624]; /* state of the Mersenne Twister */
+ uint32_t x; /* state of the Knuth generator */
+ uint32_t seed; /* seed used to init the RNG */
+} ESL_RANDOMNESS;
+
+/* esl_rnd_Roll(a) chooses a uniformly distributed integer
+ * in the range 0..a-1, given an initialized ESL_RANDOMNESS r.
+ */
+#define esl_rnd_Roll(r, a) ((int) (esl_random(r) * (a)))
+
+/* 1. The ESL_RANDOMNESS object.
+ */
+extern ESL_RANDOMNESS *esl_randomness_Create (uint32_t seed);
+extern ESL_RANDOMNESS *esl_randomness_CreateFast(uint32_t seed);
+extern ESL_RANDOMNESS *esl_randomness_CreateTimeseeded(void); /* DEPRECATED */
+extern void esl_randomness_Destroy(ESL_RANDOMNESS *r);
+extern int esl_randomness_Init(ESL_RANDOMNESS *r, uint32_t seed);
+extern uint32_t esl_randomness_GetSeed(const ESL_RANDOMNESS *r);
+
+/* 2. The generator, esl_random().
+ */
+extern double esl_random (ESL_RANDOMNESS *r);
+extern uint32_t esl_random_uint32(ESL_RANDOMNESS *r);
+
+/* 3. Debugging/development tools.
+ */
+extern int esl_randomness_Dump(FILE *fp, ESL_RANDOMNESS *r);
+
+/* 4. Other fundamental sampling (including Gaussian, gamma).
+ */
+extern double esl_rnd_UniformPositive(ESL_RANDOMNESS *r);
+extern double esl_rnd_Gaussian (ESL_RANDOMNESS *rng, double mean, double stddev);
+extern double esl_rnd_Gamma (ESL_RANDOMNESS *rng, double a);
+extern void esl_rnd_Dirichlet(ESL_RANDOMNESS *rng, const double *alpha, int K, double *p);
+extern void esl_rnd_mem (ESL_RANDOMNESS *rng, void *buf, int n);
+
+/* 5. Multinomial sampling from discrete probability n-vectors.
+ */
+extern int esl_rnd_DChoose (ESL_RANDOMNESS *r, const double *p, int N);
+extern int esl_rnd_FChoose (ESL_RANDOMNESS *r, const float *p, int N);
+extern int esl_rnd_DChooseCDF(ESL_RANDOMNESS *r, const double *cdf, int N);
+extern int esl_rnd_FChooseCDF(ESL_RANDOMNESS *r, const float *cdf, int N);
+
+
+#endif /*eslRANDOM_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_random.tex b/esl_random.tex
new file mode 100644
index 0000000..f73c78c
--- /dev/null
+++ b/esl_random.tex
@@ -0,0 +1,127 @@
+The \eslmod{random} module contains routines for generating uniformly
+distributed pseudorandom numbers and sampling random deviates from
+distributions. The heart of the module is the \ccode{esl\_random()}
+pseudorandom number generator.
+
+The \ccode{esl\_random()} random number generator is portable,
+reentrant, and threadsafe. It gives reproducible results on all
+platforms.
+
+The default \ccode{esl\_random()} generator implements the Mersenne
+Twister algorithm MT19937 \citep{Matsumoto98}. MT19937 has strong
+properties, including a period of $2^{19937}-1$ and equidistribution
+over $2^{32}$ values. The default Mersenne Twister should be suitable
+for all but a few speed-critical applications.
+
+Alternatively, a simple and classic linear congruential generator
+(LCG) can be chosen \citep{Knu-81a}. The LCG is much faster to
+initialize (about 20x) and somewhat faster to generate samples (about
+25\%), while still generating pseudorandom numbers suitable for most
+applications. Because of its initialization speed, the LCG is
+advantageous when a small number of reasonably random samples is
+needed in a speed-critical application. However, it has a relatively
+short period ($2^32$), making it unsuitable for large simulations.
+
+A new generator can either be seeded with a number that you provide,
+or using an arbitrary (quasirandom) seed. If you seed it yourself, you
+can guarantee reproducibility: two generators seeded with the same
+seed will give exactly the same sequence, even on different hardware
+platforms and operating systems. If you let it seed itself
+arbitrarily, you will get different sequences. Multiple instances of
+running the same program will get quite different arbitrary seeds even
+if you start them at the same time.
+
+Bit streams from \ccode{esl\_random()}'s two generators were tested
+against a National Institute of Standards and Technology statistical
+benchmark for random number generators \citep{NIST08}. The default
+Mersenne Twister passes the benchmark suite as expected
+\citep{Matsumoto98}. The fast LCG passes most but not all of the NIST
+tests.
+
+\ccode{esl\_random()} returns a double-precision floating point sample
+on the interval $0.0 \leq x < 1$.
+
+Table~\ref{tbl:random_api} lists the functions in the \eslmod{random}
+API. The module implements one object, \ccode{ESL\_RANDOMNESS}, which
+contains state information for the random number generator. This
+makes random number generation reentrant and threadsafe. You can have
+more than one active generator and they will not interfere with each
+other. The object is meant to be opaque; you should not need to use
+its contents.
+
+
+
+
+% Table generated by autodoc -t esl_random.c (so don't edit here, edit esl_random.c:)
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\apisubhead{The \ccode{ESL\_RANDOMNESS} object.}\\
+\hyperlink{func:esl_randomness_Create()}{\ccode{esl\_randomness\_Create()}} & Create an RNG with a given seed.\\
+\hyperlink{func:esl_randomness_CreateFast()}{\ccode{esl\_randomness\_CreateFast()}}& Create a fast RNG with a given seed.\\
+\hyperlink{func:esl_randomness_Destroy()}{\ccode{esl\_randomness\_Destroy()}} & Free an RNG. \\
+\hyperlink{func:esl_randomness_Init()}{\ccode{esl\_randomness\_Init()}} & Reinitialize an RNG. \\
+\hyperlink{func:esl_randomness_GetSeed()}{\ccode{esl\_randomness\_GetSeed()}} & Returns the value of RNG's seed.\\
+\apisubhead{The generator, \ccode{esl\_random()}}\\
+\hyperlink{func:esl_random()}{\ccode{esl\_random()}} & Generate a uniform random deviate $0.0 <= x < 1.0$.
+\\
+\apisubhead{Other fundamental sampling (including Gaussian, gamma)}\\
+\hyperlink{func:esl_rnd_UniformPositive()}{\ccode{esl\_rnd\_UniformPositive()}} & Generate a uniform positive random deviate $0 < x < 1$.\\
+\hyperlink{func:esl_rnd_Gaussian()}{\ccode{esl\_rnd\_Gaussian()}} & Generate a Gaussian-distributed sample.\\
+\hyperlink{func:esl_rnd_Gamma()}{\ccode{esl\_rnd\_Gamma()}} & Returns a random deviate from a Gamma(a, 1) distribution.\\
+\apisubhead{Multinomial sampling from discrete probability n-vectors}\\
+\hyperlink{func:esl_rnd_DChoose()}{\ccode{esl\_rnd\_DChoose()}} & Return random choice from discrete multinomial distribution.
+\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{random} API.}
+\label{tbl:random_api}
+\end{table}
+
+\subsection{Example of using random}
+
+Figure~\ref{fig:random_example} shows a program that initializes the
+random number generator with a seed you provide on the command line,
+then samples 10 random numbers using \ccode{esl\_random()}.
+
+\begin{figure}
+\input{cexcerpts/random_example}
+\caption{An example of using the random number generator.}
+\label{fig:random_example}
+\end{figure}
+
+When a \ccode{ESL\_RANDOMNESS} object is created with
+\ccode{esl\_randomness\_Create()}, it needs to be given a \emph{seed},
+an integer $\geq 0$, which specifies the initial state of the
+generator. After a generator is seeded, it is typically never seeded
+again. A series of \ccode{esl\_random()} calls generates a
+pseudorandom number sequence from that starting point. If you create
+two \ccode{ESL\_RANDOMNESS} objects seeded identically, they are
+guaranteed to generate the same random number sequence on all
+platforms. This makes it possible to reproduce stochastic simulations.
+Thus, if you run the example multiple times, you get the same ten
+numbers, because the generator is always seeded with 42.
+
+Often one wants different runs to generate different random number
+sequences, which creates a chicken and the egg problem: how can we
+select a pseudorandom seed for the pseudorandom number generator?
+Calling \ccode{esl\_randomness\_Create(0)} (i.e., a seed argument of
+0) causes Easel to select an arbitrary seed. The arbitrary seed is
+constructed by a combination of the current wall clock time (in
+seconds), the elapsed cpu time since starting the program (in
+milliseconds or microseconds), and (if available) the process
+id.\footnote{Specifically, by a bitwise mixing function that combines
+ input from \ccode{time()}, \ccode{clock()}, and \ccode{getpid()}. On
+ some platforms, \ccode{getpid()} is not available, and an arbitrary
+ constant is used instead; on those platforms, arbitrary seeds are a
+ little less arbitrary, but are still quite randomly distributed. It
+ is improbable to get two generators with the same arbitrary seed; to
+ try, you would have to start two generators in the same process at
+ the same time.} Two different \ccode{ESL\_RANDOMNESS} objects
+created this way are expected to always produce different pseudorandom
+number sequences.
+
+
diff --git a/esl_randomseq.c b/esl_randomseq.c
new file mode 100644
index 0000000..7149284
--- /dev/null
+++ b/esl_randomseq.c
@@ -0,0 +1,2118 @@
+/* Generating, shuffling, and randomizing sequences.
+ *
+ * Contents:
+ * 1. Generating simple random character strings.
+ * 2. Generating iid sequences.
+ * 3. Shuffling sequences.
+ * 4. Randomizing sequences.
+ * 5. Generating iid sequences (digital mode).
+ * 6. Shuffling sequences (digital mode).
+ * 7. Randomizing sequences (digital mode).
+ * 8. Statistics drivers.
+ * 9. Unit tests.
+ * 10. Test driver.
+ * 11. Example.
+ * 12. Copyright and license information
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#include <time.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_random.h"
+#include "esl_randomseq.h"
+
+
+/*****************************************************************
+ * 1. Generating simple random character strings.
+ *****************************************************************/
+
+/* Function: esl_rsq_Sample()
+ * Synopsis: Generate a random character string.
+ *
+ * Purpose: Sample a random character string of length <L>,
+ * consisting of characters in the set defined by
+ * an integer flag <allowed_chars>, using
+ * random number generator <rng>.
+ *
+ * Return the new NUL-terminated string in <*ret_s>. This
+ * may either be a new allocation, or in pre-allocated
+ * storage provided by the caller. If caller passes
+ * <*ret_s> as <NULL>, new space is allocated, and the
+ * caller is responsible for freeing it. That is:
+ * \begin{cchunk}
+ * char *s = NULL;
+ * esl_rsq_Sample(..., &s);
+ * free(s);
+ * \end{cchunk}
+ *
+ * If caller passes a non-<NULL> <*ret_s>, it is assumed to
+ * be a preallocated space of at least <L+1> characters,
+ * and caller is (of course) responsible for freeing
+ * it. That is:
+ * \begin{cchunk}
+ * char *s = malloc(L+1);
+ * esl_rsq_Sample(...,L, &s);
+ * free(s);
+ * \end{cchunk}
+ *
+ * Allowed values of the flag <allowed_char_flag> mirror
+ * the standard C99 character set functions in <ctype.h>:
+ *
+ * | <eslRSQ_SAMPLE_ALNUM> | isalnum() | isalpha() or isdigit() |
+ * | <eslRSQ_SAMPLE_ALPHA> | isalpha() | islower() or isupper() |
+ * | <eslRSQ_SAMPLE_LOWER> | islower() | [a-z] |
+ * | <eslRSQ_SAMPLE_UPPER> | isupper() | [A-Z] |
+ * | <eslRSQ_SAMPLE_DIGIT> | isdigit() | [0-9] |
+ * | <eslRSQ_SAMPLE_XDIGIT> | isxdigit() | [0-9] or [a-f] or [A-F] |
+ * | <eslRSQ_SAMPLE_CNTRL> | iscntrl() | ASCII control characters |
+ * | <eslRSQ_SAMPLE_GRAPH> | isgraph() | any printing char except space |
+ * | <eslRSQ_SAMPLE_SPACE> | isspace() | space, and other whitespace such as tab, newline |
+ * | <eslRSQ_SAMPLE_BLANK> | isblank() | space or tab |
+ * | <eslRSQ_SAMPLE_PRINT> | isprint() | any printing char including space |
+ * | <eslRSQ_SAMPLE_PUNCT> | ispunct() | punctuation |
+ *
+ * Note that with <eslRSQ_SAMPLE_CNTRL>, your string
+ * may sample NUL control characters (<0>), in addition to
+ * the string-terminating one at <(*ret_s)[L]>, so <strlen(*ret_s)>
+ * may not equal <L> in this case.
+ *
+ * These values are exclusive: you use one and only one of
+ * them as <allowed_chars>, you can't logically OR or NOT
+ * them together.
+ *
+ * Args: rng - ESL_RANDOMNESS object, the random number generator
+ * allowed_chars - allowed character set flag: eslRSQ_SAMPLE_*
+ * L - length of string to sample
+ * ret_s - RETURN: the NUL-terminated string
+ *
+ * Returns: <eslOK> on success; <*ret_s> is the sampled string, which was
+ * newly allocated here, and caller becomes responsible for free'ing.
+ *
+ * Throws: <eslEMEM> on allocation error; <eslEINVAL> if caller
+ * passes an invalid value of <allowed_chars>. Now <*ret_s>
+ * is <NULL>.
+ */
+int
+esl_rsq_Sample(ESL_RANDOMNESS *rng, int allowed_chars, int L, char **ret_s)
+{
+ char *s = *ret_s; // if s == NULL, we will allocate here. Else, we're using caller-provided allocation
+ int n = 0;
+ char c[127];
+ int x,i;
+ int status;
+
+ /* We can't portably make assumptions about char codes (EBCDIC,
+ * ASCII...); and we don't want to write a bunch of fiddly overhead
+ * initializing static tables. So, quickly and portably build an
+ * array c[0..n-1] of characters we will sample uniformly from.
+ * RNG sampling is fairly compute-intensive anyway, so this time
+ * should disappear in the noise of that.
+ */
+ switch (allowed_chars) {
+ case eslRSQ_SAMPLE_ALNUM: for (x = 0; x < 128; x++) if (isalnum(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_ALPHA: for (x = 0; x < 128; x++) if (isalpha(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_LOWER: for (x = 0; x < 128; x++) if (islower(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_UPPER: for (x = 0; x < 128; x++) if (isupper(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_DIGIT: for (x = 0; x < 128; x++) if (isdigit(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_XDIGIT: for (x = 0; x < 128; x++) if (isxdigit(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_CNTRL: for (x = 0; x < 128; x++) if (iscntrl(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_GRAPH: for (x = 0; x < 128; x++) if (isgraph(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_SPACE: for (x = 0; x < 128; x++) if (isspace(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_BLANK: for (x = 0; x < 128; x++) if (isblank(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_PRINT: for (x = 0; x < 128; x++) if (isprint(x)) c[n++] = x; break;
+ case eslRSQ_SAMPLE_PUNCT: for (x = 0; x < 128; x++) if (ispunct(x)) c[n++] = x; break;
+ default: ESL_XEXCEPTION(eslEINVAL, "bad flag; wanted something like eslRSQ_SAMPLE_ALPHA");
+ }
+
+ if (!s) ESL_ALLOC(s, sizeof(char) * (L+1)); /* +\0 */
+
+ for (i = 0; i < L; i++)
+ s[i] = c[ esl_rnd_Roll(rng, n) ];
+ s[L] = '\0';
+
+ *ret_s = s; // if using caller-provided space, this is a no-op, passing back the same *ret_s we got.
+ return eslOK;
+
+ ERROR:
+ if (! *ret_s && s) free(s); // if we allocated s here, clean up.
+ return status;
+}
+
+
+/*****************************************************************
+ *# 1. Generating iid sequences.
+ *****************************************************************/
+
+/* Function: esl_rsq_IID()
+ * Synopsis: Generate an iid random text sequence.
+ * Incept: SRE, Thu Aug 5 09:03:03 2004 [St. Louis]
+ *
+ * Purpose: Generate a <NUL>-terminated i.i.d. symbol string of length <L>,
+ * $0..L-1$, and leave it in <s>. The symbol alphabet is given
+ * as a string <alphabet> of <K> total symbols, and the iid
+ * probability of each residue is given in <p>. The caller
+ * must provide an <s> that is allocated for at least
+ * <(L+1)*sizeof(char)>, room for <L> residues and the <NUL> terminator.
+ *
+ * <esl_rsq_fIID()> does the same, but for a floating point
+ * probability vector <p>, rather than a double precision
+ * vector.
+ *
+ * Args: r - ESL_RANDOMNESS object
+ * alphabet - e.g. "ACGT"
+ * p - probability distribution [0..n-1]
+ * K - number of symbols in alphabet
+ * L - length of generated sequence
+ * s - the generated sequence.
+ * Caller allocated, >= (L+1) * sizeof(char).
+ *
+ * Return: <eslOK> on success.
+ */
+int
+esl_rsq_IID(ESL_RANDOMNESS *r, const char *alphabet, const double *p, int K, int L, char *s)
+{
+ int x;
+
+ for (x = 0; x < L; x++)
+ s[x] = alphabet[esl_rnd_DChoose(r,p,K)];
+ s[x] = '\0';
+ return eslOK;
+}
+int
+esl_rsq_fIID(ESL_RANDOMNESS *r, const char *alphabet, const float *p, int K, int L, char *s)
+{
+ int x;
+
+ for (x = 0; x < L; x++)
+ s[x] = alphabet[esl_rnd_FChoose(r,p,K)];
+ s[x] = '\0';
+ return eslOK;
+}
+/*------------ end, generating iid sequences --------------------*/
+
+
+/*****************************************************************
+ *# 2. Shuffling sequences.
+ *****************************************************************/
+
+/* Function: esl_rsq_CShuffle()
+ * Synopsis: Shuffle a text sequence.
+ * Incept: SRE, Fri Feb 23 08:17:50 2007 [Casa de Gatos]
+ *
+ * Purpose: Returns a shuffled version of <s> in <shuffled>, given
+ * a source of randomness <r>.
+ *
+ * Caller provides allocated storage for <shuffled>, for at
+ * least the same length as <s>.
+ *
+ * <shuffled> may also point to the same storage as <s>,
+ * in which case <s> is shuffled in place.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_rsq_CShuffle(ESL_RANDOMNESS *r, const char *s, char *shuffled)
+{
+ int L, i;
+ char c;
+
+ L = strlen(s);
+ if (shuffled != s) strcpy(shuffled, s);
+ while (L > 1) {
+ i = esl_rnd_Roll(r, L);
+ c = shuffled[i];
+ shuffled[i] = shuffled[L-1];
+ shuffled[L-1] = c;
+ L--;
+ }
+ return eslOK;
+}
+
+/* Function: esl_rsq_CShuffleDP()
+ * Synopsis: Shuffle a text sequence, preserving diresidue composition.
+ * Incept: SRE, Fri Feb 23 08:56:03 2007 [Casa de Gatos]
+ *
+ * Purpose: Given string <s>, and a source of randomness <r>,
+ * returns shuffled version in <shuffled>. The shuffle
+ * is a "doublet-preserving" (DP) shuffle which
+ * shuffles a sequence while exactly preserving both mono-
+ * and di-symbol composition.
+ *
+ * <s> may only consist of alphabetic characters [a-zA-Z].
+ * The shuffle is done case-insensitively. The shuffled
+ * string result is all upper case.
+ *
+ * Caller provides storage in <shuffled> of at least the
+ * same length as <s>.
+ *
+ * <shuffled> may also point to the same storage as <s>,
+ * in which case <s> is shuffled in place.
+ *
+ * The algorithm does an internal allocation of a
+ * substantial amount of temporary storage, on the order of
+ * <26 * strlen(s)>, so an allocation failure is possible
+ * if <s> is long enough.
+ *
+ * The algorithm is a search for a random Eulerian walk on
+ * a directed multigraph \citep{AltschulErickson85}.
+ *
+ * If <s> is of length 2 or less, this is a no-op, and
+ * <shuffled> is a copy of <s>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <s> contains nonalphabetic characters.
+ * <eslEMEM> on allocation failure.
+ */
+int
+esl_rsq_CShuffleDP(ESL_RANDOMNESS *r, const char *s, char *shuffled)
+{
+ int status; /* Easel return status code */
+ int len; /* length of s */
+ int pos; /* a position in s or shuffled */
+ int x,y; /* indices of two characters */
+ char **E = NULL; /* edge lists: E[0] is the edge list from vertex A */
+ int *nE = NULL; /* lengths of edge lists */
+ int *iE = NULL; /* positions in edge lists */
+ int n; /* tmp: remaining length of an edge list to be shuffled */
+ char sf; /* last character in shuffled */
+ char Z[26]; /* connectivity in last edge graph Z */
+ int keep_connecting; /* flag used in Z connectivity algorithm */
+ int is_eulerian; /* flag used for when we've got a good Z */
+
+ /* First, verify that the string is entirely alphabetic. */
+ len = strlen(s);
+ for (pos = 0; pos < len; pos++)
+ if (! isalpha((int) s[pos]))
+ ESL_EXCEPTION(eslEINVAL, "String contains nonalphabetic characters");
+
+ /* The edge case of len <= 2 */
+ if (len <= 2)
+ {
+ if (s != shuffled) strcpy(shuffled, s);
+ return eslOK;
+ }
+
+ /* Allocations. */
+ ESL_ALLOC(E, sizeof(char *) * 26); for (x = 0; x < 26; x++) E[x] = NULL;
+ ESL_ALLOC(nE, sizeof(int) * 26); for (x = 0; x < 26; x++) nE[x] = 0;
+ ESL_ALLOC(iE, sizeof(int) * 26); for (x = 0; x < 26; x++) iE[x] = 0;
+ for (x = 0; x < 26; x++)
+ ESL_ALLOC(E[x], sizeof(char) * (len-1));
+
+ /* "(1) Construct the doublet graph G and edge ordering E
+ * corresponding to S."
+ *
+ * Note that these also imply the graph G; and note,
+ * for any list x with nE[x] = 0, vertex x is not part
+ * of G.
+ */
+ x = toupper((int) s[0]) - 'A';
+ for (pos = 1; pos < len; pos++)
+ {
+ y = toupper((int) s[pos]) - 'A';
+ E[x][nE[x]] = y;
+ nE[x]++;
+ x = y;
+ }
+
+ /* Now we have to find a random Eulerian edge ordering. */
+ sf = toupper((int) s[len-1]) - 'A';
+ is_eulerian = 0;
+ while (! is_eulerian)
+ {
+ /* "(2) For each vertex s in G except s_f, randomly select
+ * one edge from the s edge list of E(S) to be the
+ * last edge of the s list in a new edge ordering."
+ *
+ * select random edges and move them to the end of each
+ * edge list.
+ */
+ for (x = 0; x < 26; x++)
+ {
+ if (nE[x] == 0 || x == sf) continue;
+ pos = esl_rnd_Roll(r, nE[x]);
+ ESL_SWAP(E[x][pos], E[x][nE[x]-1], char);
+ }
+
+ /* "(3) From this last set of edges, construct the last-edge
+ * graph Z and determine whether or not all of its
+ * vertices are connected to s_f."
+ *
+ * a probably stupid algorithm for looking at the
+ * connectivity in Z: iteratively sweep through the
+ * edges in Z, and build up an array (confusing called Z[x])
+ * whose elements are 1 if x is connected to sf, else 0.
+ */
+ for (x = 0; x < 26; x++) Z[x] = 0;
+ Z[(int) sf] = keep_connecting = 1;
+
+ while (keep_connecting) {
+ keep_connecting = 0;
+ for (x = 0; x < 26; x++) {
+ if (nE[x] == 0) continue;
+ y = E[x][nE[x]-1]; /* xy is an edge in Z */
+ if (Z[x] == 0 && Z[y] == 1) { /* x is connected to sf in Z */
+ Z[x] = 1;
+ keep_connecting = 1;
+ }
+ }
+ }
+
+ /* if any vertex in Z is tagged with a 0, it's
+ * not connected to sf, and we won't have a Eulerian
+ * walk.
+ */
+ is_eulerian = 1;
+ for (x = 0; x < 26; x++) {
+ if (nE[x] == 0 || x == sf) continue;
+ if (Z[x] == 0) {
+ is_eulerian = 0;
+ break;
+ }
+ }
+
+ /* "(4) If any vertex is not connected in Z to s_f, the
+ * new edge ordering will not be Eulerian, so return to
+ * (2). If all vertices are connected in Z to s_f,
+ * the new edge ordering will be Eulerian, so
+ * continue to (5)."
+ *
+ * e.g. note infinite loop while is_eulerian is FALSE.
+ */
+ }
+
+ /* "(5) For each vertex s in G, randomly permute the remaining
+ * edges of the s edge list of E(S) to generate the s
+ * edge list of the new edge ordering E(S')."
+ *
+ * Essentially a StrShuffle() on the remaining nE[x]-1 elements
+ * of each edge list; unfortunately our edge lists are arrays,
+ * not strings, so we can't just call out to StrShuffle().
+ */
+ for (x = 0; x < 26; x++)
+ for (n = nE[x] - 1; n > 1; n--)
+ {
+ pos = esl_rnd_Roll(r, n);
+ ESL_SWAP(E[x][pos], E[x][n-1], char);
+ }
+
+ /* "(6) Construct sequence S', a random DP permutation of
+ * S, from E(S') as follows. Start at the s_1 edge list.
+ * At each s_i edge list, add s_i to S', delete the
+ * first edge s_i,s_j of the edge list, and move to
+ * the s_j edge list. Continue this process until
+ * all edge lists are exhausted."
+ */
+ pos = 0;
+ x = toupper((int) s[0]) - 'A';
+ while (1)
+ {
+ shuffled[pos++] = 'A'+ x; /* add s_i to S' */
+
+ y = E[x][iE[x]];
+ iE[x]++; /* "delete" s_i,s_j from edge list */
+
+ x = y; /* move to s_j edge list. */
+
+ if (iE[x] == nE[x])
+ break; /* the edge list is exhausted. */
+ }
+ shuffled[pos++] = 'A' + sf;
+ shuffled[pos] = '\0';
+
+ /* Reality checks.
+ */
+ if (x != sf) ESL_XEXCEPTION(eslEINCONCEIVABLE, "hey, you didn't end on s_f.");
+ if (pos != len) ESL_XEXCEPTION(eslEINCONCEIVABLE, "hey, pos (%d) != len (%d).", pos, len);
+
+ /* Free and return.
+ */
+ esl_Free2D((void **) E, 26);
+ free(nE);
+ free(iE);
+ return eslOK;
+
+ ERROR:
+ esl_Free2D((void **) E, 26);
+ if (nE != NULL) free(nE);
+ if (iE != NULL) free(iE);
+ return status;
+}
+
+
+/* Function: esl_rsq_CShuffleKmers()
+ * Synopsis: Shuffle k-mers in a text sequence.
+ * Incept: SRE, Tue Nov 17 16:55:57 2009 [NHGRI retreat, Gettysburg]
+ *
+ * Purpose: Consider a text sequence <s> as a string of nonoverlapping
+ * k-mers of length <K>. Shuffle the k-mers, given a random
+ * number generator <r>. Put the shuffled sequence in
+ * <shuffled>.
+ *
+ * If the length of <s> is not evenly divisible by <K>, the
+ * remaining residues are left (unshuffled) as a prefix to
+ * the shuffled k-mers.
+ *
+ * For example, shuffling ABCDEFGHIJK as k=3-mers might
+ * result in ABFIJKFGHCDE.
+ *
+ * Caller provides allocated storage for <shuffled>,
+ * for at least the same length as <s>.
+ *
+ * <shuffled> may also point to the same storage as <s>,
+ * in which case <s> is shuffled in place.
+ *
+ * There is almost no formally justifiable reason why you'd
+ * use this shuffle -- it's not like it preserves any
+ * particularly well-defined statistical properties of the
+ * sequence -- but it's a quick and dirty way to sort of
+ * maybe possibly preserve some higher-than-monomer
+ * statistics.
+ *
+ * Args: r - an <ESL_RANDOMNESS> random generator
+ * s - sequence to shuffle
+ * K - size of k-mers to break <s> into
+ * shuffled - RESULT: the shuffled sequence
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_rsq_CShuffleKmers(ESL_RANDOMNESS *r, const char *s, int K, char *shuffled)
+{
+ int L = strlen(s);
+ int W = L / K; /* number of kmers "words" excluding leftover prefix */
+ int P = L % K; /* leftover residues in prefix */
+ int i;
+ char *swap = NULL;
+ int status;
+
+ if (shuffled != s) strcpy(shuffled, s);
+ ESL_ALLOC(swap, sizeof(char) * K);
+ while (W > 1)
+ { /* use memmove, not strncpy or memcpy, because i==W-1 creates an overlap case */
+ i = esl_rnd_Roll(r, W); /* pick a word */
+ memmove(swap, shuffled + P + i*K, K * sizeof(char)); /* copy it to tmp space */
+ memmove(shuffled + P + i*K, shuffled + P + (W-1)*K, K * sizeof(char)); /* move word W-1 to i */
+ memmove(shuffled + P + (W-1)*K, swap, K * sizeof(char)); /* move word i to W-1 */
+ W--;
+ }
+ free(swap);
+ return eslOK;
+
+ ERROR:
+ free(swap);
+ return status;
+}
+
+
+/* Function: esl_rsq_CReverse()
+ * Synopsis: Reverse a string.
+ * Incept: SRE, Sat Feb 24 10:06:34 2007 [Casa de Gatos]
+ *
+ * Purpose: Returns a reversed version of <s> in <rev>.
+ *
+ * There are no restrictions on the symbols that <s>
+ * might contain.
+ *
+ * Caller provides storage in <rev> for at least
+ * <(strlen(s)+1)*sizeof(char)>.
+ *
+ * <s> and <rev> can point to the same storage, in which
+ * case <s> is reversed in place.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_rsq_CReverse(const char *s, char *rev)
+{
+ int L, i;
+ char c;
+
+ L = strlen(s);
+ for (i = 0; i < L/2; i++)
+ { /* swap ends */
+ c = s[L-i-1];
+ rev[L-i-1] = s[i];
+ rev[i] = c;
+ }
+ if (L%2) { rev[i] = s[i]; } /* don't forget middle residue in odd-length s */
+ rev[L] = '\0';
+ return eslOK;
+}
+
+/* Function: esl_rsq_CShuffleWindows()
+ * Synopsis: Shuffle local windows of a text string.
+ * Incept: SRE, Sat Feb 24 10:17:59 2007 [Casa de Gatos]
+ *
+ * Purpose: Given string <s>, shuffle residues in nonoverlapping
+ * windows of width <w>, and put the result in <shuffled>.
+ * See [Pearson88].
+ *
+ * <s> and <shuffled> can be identical to shuffle in place.
+ *
+ * Caller provides storage in <shuffled> for at least
+ * <(strlen(s)+1)*sizeof(char)>.
+ *
+ * Args: s - string to shuffle in windows
+ * w - window size (typically 10 or 20)
+ * shuffled - allocated space for window-shuffled result.
+ *
+ * Return: <eslOK> on success.
+ */
+int
+esl_rsq_CShuffleWindows(ESL_RANDOMNESS *r, const char *s, int w, char *shuffled)
+{
+ int L;
+ char c;
+ int i, j, k;
+
+ L = strlen(s);
+ if (shuffled != s) strcpy(shuffled, s);
+ for (i = 0; i < L; i += w)
+ for (j = ESL_MIN(L-1, i+w-1); j > i; j--)
+ {
+ k = i + esl_rnd_Roll(r, j-i);
+ c = shuffled[k]; /* semantics of a j,k swap, because we might be shuffling in-place */
+ shuffled[k] = shuffled[j];
+ shuffled[j] = c;
+ }
+ return eslOK;
+}
+/*------------------ end, shuffling sequences -------------------*/
+
+
+
+/*****************************************************************
+ *# 3. Randomizing sequences
+ *****************************************************************/
+
+/* Function: esl_rsq_CMarkov0()
+ * Synopsis: Generate new text string of same 0th order Markov properties.
+ * Incept: SRE, Sat Feb 24 08:47:43 2007 [Casa de Gatos]
+ *
+ * Purpose: Makes a random string <markoved> with the same length and
+ * 0-th order Markov properties as <s>, given randomness
+ * source <r>.
+ *
+ * <s> and <markoved> can be point to the same storage, in which
+ * case <s> is randomized in place, destroying the original
+ * string.
+ *
+ * <s> must consist only of alphabetic characters [a-zA-Z].
+ * Statistics are collected case-insensitively over 26 possible
+ * residues. The random string is generated all upper case.
+ *
+ * Args: s - input string
+ * markoved - randomly generated string
+ * (storage allocated by caller, at least strlen(s)+1)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <s> contains nonalphabetic characters.
+ */
+int
+esl_rsq_CMarkov0(ESL_RANDOMNESS *r, const char *s, char *markoved)
+{
+ int L;
+ int i;
+ double p[26]; /* initially counts, then probabilities */
+ int x;
+
+ /* First, verify that the string is entirely alphabetic. */
+ L = strlen(s);
+ for (i = 0; i < L; i++)
+ if (! isalpha((int) s[i]))
+ ESL_EXCEPTION(eslEINVAL, "String contains nonalphabetic characters");
+
+ /* Collect zeroth order counts and convert to frequencies.
+ */
+ for (x = 0; x < 26; x++) p[x] = 0.;
+ for (i = 0; i < L; i++)
+ p[(int)(toupper((int) s[i]) - 'A')] += 1.0;
+ if (L > 0)
+ for (x = 0; x < 26; x++) p[x] /= (double) L;
+
+ /* Generate a random string using those p's. */
+ for (i = 0; i < L; i++)
+ markoved[i] = esl_rnd_DChoose(r, p, 26) + 'A';
+ markoved[i] = '\0';
+
+ return eslOK;
+}
+
+/* Function: esl_rsq_CMarkov1()
+ * Synopsis: Generate new text string of same 1st order Markov properties.
+ * Incept: SRE, Sat Feb 24 09:21:46 2007 [Casa de Gatos]
+ *
+ * Purpose: Makes a random string <markoved> with the same length and
+ * 1st order (di-residue) Markov properties as <s>, given
+ * randomness source <r>.
+ *
+ * <s> and <markoved> can be point to the same storage, in which
+ * case <s> is randomized in place, destroying the original
+ * string.
+ *
+ * <s> must consist only of alphabetic characters [a-zA-Z].
+ * Statistics are collected case-insensitively over 26 possible
+ * residues. The random string is generated all upper case.
+ *
+ * If <s> is of length 2 or less, this is a no-op, and
+ * <markoved> is a copy of <s>.
+ *
+ * Args: s - input string
+ * markoved - new randomly generated string
+ * (storage allocated by caller, at least strlen(s)+1)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <s> contains nonalphabetic characters.
+ */
+int
+esl_rsq_CMarkov1(ESL_RANDOMNESS *r, const char *s, char *markoved)
+{
+ int L;
+ int i;
+ int x,y;
+ int i0; /* initial symbol */
+ double p[26][26]; /* conditional probabilities p[x][y] = P(y | x) */
+ double p0[26]; /* marginal probabilities P(x), just for initial residue. */
+
+ /* First, verify that the string is entirely alphabetic. */
+ L = strlen(s);
+ for (i = 0; i < L; i++)
+ if (! isalpha((int) s[i]))
+ ESL_EXCEPTION(eslEINVAL, "String contains nonalphabetic characters");
+
+ /* The edge case of len <= 2 */
+ if (L <= 2)
+ {
+ if (s != markoved) strcpy(markoved, s);
+ return eslOK;
+ }
+
+ /* Collect first order counts and convert to frequencies. */
+ for (x = 0; x < 26; x++)
+ for (y = 0; y < 26; y++)
+ p[x][y] = 0.;
+
+ i0 = x = toupper((int) s[0]) - 'A';
+ for (i = 1; i < L; i++)
+ {
+ y = toupper((int) s[i]) - 'A';
+ p[x][y] += 1.0;
+ x = y;
+ }
+ p[x][i0] += 1.0; /* "circularized": avoids a bug; see markov1_bug utest */
+
+ for (x = 0; x < 26; x++)
+ {
+ p0[x] = 0.;
+ for (y = 0; y < 26; y++)
+ p0[x] += p[x][y]; /* now p0[x] = marginal counts of x, inclusive of 1st residue */
+
+ for (y = 0; y < 26; y++)
+ p[x][y] = (p0[x] > 0. ? p[x][y] / p0[x] : 0.); /* now p[x][y] = P(y | x) */
+
+ p0[x] /= (double) L; /* now p0[x] = marginal P(x) */
+ }
+
+ /* Generate a random string using those p's. */
+ x = esl_rnd_DChoose(r, p0, 26);
+ markoved[0] = x + 'A';
+ for (i = 1; i < L; i++)
+ {
+ y = esl_rnd_DChoose(r, p[x], 26);
+ markoved[i] = y + 'A';
+ x = y;
+ }
+ markoved[L] = '\0';
+
+ return eslOK;
+}
+/*----------------- end, randomizing sequences ------------------*/
+
+
+
+/*****************************************************************
+ *# 4. Generating iid sequences (digital mode).
+ *****************************************************************/
+
+/* Function: esl_rsq_xIID()
+ * Synopsis: Generate an iid random digital sequence.
+ * Incept: SRE, Sat Feb 17 16:39:01 2007 [Casa de Gatos]
+ *
+ * Purpose: Generate an i.i.d. digital sequence of length <L> (1..L) and
+ * leave it in <dsq>. The i.i.d. probability of each residue is
+ * given in the probability vector <p>, and the number of
+ * possible residues (the alphabet size) is given by <K>.
+ * (Only the alphabet size <K> is needed here, as opposed to
+ * a digital <ESL_ALPHABET>, but the caller presumably
+ * has a digital alphabet.) The caller must provide a <dsq>
+ * allocated for at least <L+2> residues of type <ESL_DSQ>,
+ * room for <L> residues and leading/trailing digital sentinel bytes.
+ *
+ * <esl_rsq_xfIID()> does the same, but for a
+ * single-precision float vector <p> rather than a
+ * double-precision vector <p>.
+ *
+ * Args: r - ESL_RANDOMNESS object
+ * p - probability distribution [0..n-1]
+ * K - number of symbols in alphabet
+ * L - length of generated sequence
+ * ret_s - RETURN: the generated sequence.
+ * (Caller-allocated, >= (L+2)*ESL_DSQ)
+ *
+ * Return: <eslOK> on success.
+ */
+int
+esl_rsq_xIID(ESL_RANDOMNESS *r, const double *p, int K, int L, ESL_DSQ *dsq)
+{
+ int x;
+
+ dsq[0] = dsq[L+1] = eslDSQ_SENTINEL;
+ for (x = 1; x <= L; x++)
+ dsq[x] = esl_rnd_DChoose(r,p,K);
+ return eslOK;
+}
+int
+esl_rsq_xfIID(ESL_RANDOMNESS *r, const float *p, int K, int L, ESL_DSQ *dsq)
+{
+ int x;
+
+ dsq[0] = dsq[L+1] = eslDSQ_SENTINEL;
+ for (x = 1; x <= L; x++)
+ dsq[x] = esl_rnd_FChoose(r,p,K);
+ return eslOK;
+}
+
+
+/* Function: esl_rsq_SampleDirty()
+ * Synopsis: Sample a digital sequence, including noncanonicals.
+ * Incept: SRE, Wed Feb 17 10:57:28 2016 [H1/76]
+ *
+ * Purpose: Using random number generator <rng>, use probability
+ * vector <p> to sample an iid digital sequence in alphabet
+ * <abc> of length <L>. Store it in <dsq>.
+ *
+ * The <dsq> space, allocated by the caller, has room for
+ * at least <L+2> residues, counting the digital
+ * sentinels.
+ *
+ * Probability vector <p> has <Kp> terms, and sums to 1.0
+ * over them. The probabilities in <p> for residues <K>,
+ * <Kp-2>, and <Kp-1> (gap, nonresidue, missing) are
+ * typically zero, to generate a standard unaligned digital
+ * sequence with degenerate residues. To sample a random
+ * "alignment", <p[K]> is nonzero.
+ *
+ * If <p> is <NULL>, then we sample a probability vector
+ * according to the following rules.
+ * 1. Sample pc, the probability of canonical
+ * vs. noncanonical residues, uniformly on [0,1).
+ * 2. Sample a p[] uniformly for canonical residues
+ * <0..K-1>, and renormalize by multiplying by pc.
+ * Sample a different p[] uniformly for noncanonical
+ * residues <K+1..Kp-3>, and renormalize by (1-pc).
+ * 3. p[] = 0 for gap residue K, nonresidue Kp-2,
+ * missing residue Kp-1.
+ * This usage is mainly intended to make it easy to
+ * sample dirty edge cases for automated tests.
+ *
+ * Args: rng : random number generator
+ * abc : digital alphabet
+ * p : OPTIONAL: p[0..Kp-1] probability vector, or NULL
+ * L : length of digital sequence to sample
+ * dsq : resulting digital seq sample, caller-provided space
+ *
+ * Returns: <eslOK> on success
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_rsq_SampleDirty(ESL_RANDOMNESS *rng, ESL_ALPHABET *abc, double **byp_p, int L, ESL_DSQ *dsq)
+{
+ double *p = NULL;
+ int i;
+ int status;
+
+ /* If p isn't provided, sample one. */
+ if ( esl_byp_IsProvided(byp_p))
+ p = *byp_p;
+ else
+ {
+ double pc = esl_random(rng); /* [0,1) */
+ int x;
+
+ ESL_ALLOC(p, sizeof(double) * abc->Kp);
+
+ esl_rnd_Dirichlet(rng, NULL /* i.e. uniform */, abc->K, p);
+ esl_rnd_Dirichlet(rng, NULL, (abc->Kp - abc->K - 3), (p + abc->K +1)); /* K+1..Kp-3 range of alphabet */
+ for (x = 0; x < abc->K; x++) p[x] = p[x] * pc;
+ for (x = abc->K+1; x <= abc->Kp-3; x++) p[x] = p[x] * (1.-pc);
+ p[abc->K] = 0.;
+ p[abc->Kp-2] = 0.;
+ p[abc->Kp-1] = 0.;
+ }
+
+ dsq[0] = eslDSQ_SENTINEL;
+ for (i = 1; i <= L; i++)
+ dsq[i] = esl_rnd_DChoose(rng, p, abc->Kp);
+ dsq[L+1] = eslDSQ_SENTINEL;
+
+ if (esl_byp_IsReturned(byp_p)) *byp_p = p;
+ else if (esl_byp_IsInternal(byp_p)) free(p);
+ return eslOK;
+
+ ERROR:
+ if (! esl_byp_IsProvided(byp_p) && p) free(p);
+ if ( esl_byp_IsReturned(byp_p)) *byp_p = NULL;
+ return status;
+}
+/*--------------------- end, digital generation ---------------- */
+
+
+
+/*****************************************************************
+ *# 5. Shuffling sequences (digital mode)
+ *****************************************************************/
+
+/* Function: esl_rsq_XShuffle()
+ * Synopsis: Shuffle a digital sequence.
+ * Incept: SRE, Fri Feb 23 08:24:20 2007 [Casa de Gatos]
+ *
+ * Purpose: Given a digital sequence <dsq> of length <L> residues,
+ * shuffle it, and leave the shuffled version in <shuffled>.
+ *
+ * Caller provides allocated storage for <shuffled> for at
+ * least the same length as <dsq>.
+ *
+ * <shuffled> may also point to the same storage as <dsq>,
+ * in which case <dsq> is shuffled in place.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_rsq_XShuffle(ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, ESL_DSQ *shuffled)
+{
+ int i;
+ ESL_DSQ x;
+
+ if (dsq != shuffled) esl_abc_dsqcpy(dsq, L, shuffled);
+ while (L > 1) {
+ i = 1 + esl_rnd_Roll(r, L);
+ x = shuffled[i];
+ shuffled[i] = shuffled[L];
+ shuffled[L] = x;
+ L--;
+ }
+ return eslOK;
+}
+
+/* Function: esl_rsq_XShuffleDP()
+ * Synopsis: Shuffle a digital sequence, preserving diresidue composition.
+ * Incept: SRE, Fri Feb 23 09:23:47 2007 [Casa de Gatos]
+ *
+ * Purpose: Same as <esl_rsq_CShuffleDP()>, except for a digital
+ * sequence <dsq> of length <L>, encoded in a digital alphabet
+ * of <K> residues.
+ *
+ * <dsq> may only consist of residue codes <0..K-1>; if it
+ * contains gaps, degeneracies, or missing data, pass the alphabet's
+ * <Kp> size, not its canonical <K>.
+ *
+ * If <L> $\leq 2$, this is a no-op; <shuffled> is a copy of <dsq>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <s> contains digital residue codes
+ * outside the range <0..K-1>.
+ * <eslEMEM> on allocation failure.
+ */
+int
+esl_rsq_XShuffleDP(ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, int K, ESL_DSQ *shuffled)
+{
+ int status; /* Easel return status code */
+ int i; /* a position in dsq or shuffled */
+ ESL_DSQ x,y; /* indices of two characters */
+ ESL_DSQ **E = NULL; /* edge lists: E[0] is the edge list from vertex A */
+ int *nE = NULL; /* lengths of edge lists */
+ int *iE = NULL; /* positions in edge lists */
+ ESL_DSQ *Z = NULL; /* connectivity in last edge graph Z */
+ int n; /* tmp: remaining length of an edge list to be shuffled */
+ ESL_DSQ sf; /* last character in shuffled */
+
+ int keep_connecting; /* flag used in Z connectivity algorithm */
+ int is_eulerian; /* flag used for when we've got a good Z */
+
+ /* First, verify that we can deal with all the residues in dsq. */
+ for (i = 1; i <= L; i++)
+ if (dsq[i] >= K)
+ ESL_EXCEPTION(eslEINVAL, "dsq contains unexpected residue codes");
+
+ /* The edge case of L <= 2 */
+ if (L <= 2)
+ {
+ if (dsq != shuffled) memcpy(shuffled, dsq, sizeof(ESL_DSQ) * (L+2));
+ return eslOK;
+ }
+
+ /* Allocations. */
+ ESL_ALLOC(nE, sizeof(int) * K); for (x = 0; x < K; x++) nE[x] = 0;
+ ESL_ALLOC(E, sizeof(ESL_DSQ *) * K); for (x = 0; x < K; x++) E[x] = NULL;
+ ESL_ALLOC(iE, sizeof(int) * K); for (x = 0; x < K; x++) iE[x] = 0;
+ ESL_ALLOC(Z, sizeof(ESL_DSQ) * K);
+ for (x = 0; x < K; x++)
+ ESL_ALLOC(E[x], sizeof(ESL_DSQ) * (L-1));
+
+ /* "(1) Construct the doublet graph G and edge ordering E... */
+ x = dsq[1];
+ for (i = 2; i <= L; i++) {
+ E[x][nE[x]] = dsq[i];
+ nE[x]++;
+ x = dsq[i];
+ }
+
+ /* Now we have to find a random Eulerian edge ordering. */
+ sf = dsq[L];
+ is_eulerian = 0;
+ while (! is_eulerian)
+ {
+ for (x = 0; x < K; x++) {
+ if (nE[x] == 0 || x == sf) continue;
+ i = esl_rnd_Roll(r, nE[x]);
+ ESL_SWAP(E[x][i], E[x][nE[x]-1], ESL_DSQ);
+ }
+
+ for (x = 0; x < K; x++) Z[x] = 0;
+ Z[(int) sf] = keep_connecting = 1;
+ while (keep_connecting) {
+ keep_connecting = 0;
+ for (x = 0; x < K; x++) {
+ if (nE[x] == 0) continue;
+ y = E[x][nE[x]-1]; /* xy is an edge in Z */
+ if (Z[x] == 0 && Z[y] == 1) { /* x is connected to sf in Z */
+ Z[x] = 1;
+ keep_connecting = 1;
+ }
+ }
+ }
+
+ is_eulerian = 1;
+ for (x = 0; x < K; x++) {
+ if (nE[x] == 0 || x == sf) continue;
+ if (Z[x] == 0) {
+ is_eulerian = 0;
+ break;
+ }
+ }
+ }
+
+ /* "(5) For each vertex s in G, randomly permute... */
+ for (x = 0; x < K; x++)
+ for (n = nE[x] - 1; n > 1; n--)
+ {
+ i = esl_rnd_Roll(r, n);
+ ESL_SWAP(E[x][i], E[x][n-1], ESL_DSQ);
+ }
+
+ /* "(6) Construct sequence S'... */
+ i = 1;
+ x = dsq[1];
+ while (1) {
+ shuffled[i++] = x;
+ y = E[x][iE[x]++];
+ x = y;
+ if (iE[x] == nE[x]) break;
+ }
+ shuffled[i++] = sf;
+ shuffled[i] = eslDSQ_SENTINEL;
+ shuffled[0] = eslDSQ_SENTINEL;
+
+ /* Reality checks. */
+ if (x != sf) ESL_XEXCEPTION(eslEINCONCEIVABLE, "hey, you didn't end on s_f.");
+ if (i != L+1) ESL_XEXCEPTION(eslEINCONCEIVABLE, "hey, i (%d) overran L+1 (%d).", i, L+1);
+
+ esl_Free2D((void **) E, K);
+ free(nE);
+ free(iE);
+ free(Z);
+ return eslOK;
+
+ ERROR:
+ esl_Free2D((void **) E, K);
+ if (nE != NULL) free(nE);
+ if (iE != NULL) free(iE);
+ if (Z != NULL) free(Z);
+ return status;
+}
+
+
+/* Function: esl_rsq_XShuffleKmers()
+ * Synopsis: Shuffle k-mers in a digital sequence.
+ *
+ * Purpose: Same as <esl_rsq_CShuffleKmers()>, but shuffle digital
+ * sequence <dsq> of length <L> into digital result <shuffled>.
+ *
+ * Args: r - an <ESL_RANDOMNESS> random generator
+ * dsq - sequence to shuffle
+ * K - size of k-mers to break <s> into
+ * shuffled - RESULT: the shuffled sequence
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_rsq_XShuffleKmers(ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, int K, ESL_DSQ *shuffled)
+{
+ int W = L / K; /* number of kmers "words" excluding leftover prefix */
+ int P = L % K; /* leftover residues in prefix */
+ int i;
+ char *swap = NULL;
+ int status;
+
+ if (shuffled != dsq) esl_abc_dsqcpy(dsq, L, shuffled);
+ ESL_ALLOC(swap, sizeof(char) * K);
+ while (W > 1)
+ { /* use memmove, not memcpy, because i==W-1 is an overlap case */
+ i = esl_rnd_Roll(r, W); /* pick a word */
+ memmove(swap, shuffled + P + i*K, K * sizeof(char)); /* copy it to tmp space */
+ memmove(shuffled + P + i*K, shuffled + P + (W-1)*K, K * sizeof(char)); /* move word W-1 to i */
+ memmove(shuffled + P + (W-1)*K, swap, K * sizeof(char)); /* move word i to W-1 */
+ W--;
+ }
+ free(swap);
+ return eslOK;
+
+ ERROR:
+ free(swap);
+ return status;
+}
+
+
+/* Function: esl_rsq_XReverse()
+ * Synopsis: Reverse a digital sequence.
+ * Incept: SRE, Sat Feb 24 10:13:30 2007 [Casa de Gatos]
+ *
+ * Purpose: Given a digital sequence <dsq> of length <L>, return
+ * reversed version of it in <rev>.
+ *
+ * Caller provides storage in <rev> for at least
+ * <(L+2)*sizeof(ESL_DSQ)>.
+ *
+ * <s> and <rev> can point to the same storage, in which
+ * case <s> is reversed in place.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_rsq_XReverse(const ESL_DSQ *dsq, int L, ESL_DSQ *rev)
+{
+ int i;
+ ESL_DSQ x;
+
+ for (i = 1; i <= L/2; i++)
+ { /* swap ends */
+ x = dsq[L-i+1];
+ rev[L-i+1] = dsq[i];
+ rev[i] = x;
+ }
+ if (L%2) { rev[i] = dsq[i]; } /* don't forget middle residue in odd-length dsq */
+ rev[0] = eslDSQ_SENTINEL;
+ rev[L+1] = eslDSQ_SENTINEL;
+ return eslOK;
+}
+
+
+/* Function: esl_rsq_XShuffleWindows()
+ * Synopsis: Shuffle local windows of a digital sequence.
+ * Incept: SRE, Sat Feb 24 10:51:31 2007 [Casa de Gatos]
+ *
+ * Purpose: Given a digital sequence <dsq> of length <L>, shuffle
+ * residues in nonoverlapping windows of width <w>, and put
+ * the result in <shuffled>. See [Pearson88].
+ *
+ * Caller provides storage in <shuffled> for at least
+ * <(L+2)*sizeof(ESL_DSQ)>.
+ *
+ * <dsq> and <shuffled> can be identical to shuffle in place.
+ *
+ * Args: dsq - digital sequence to shuffle in windows
+ * L - length of <dsq>
+ * w - window size (typically 10 or 20)
+ * shuffled - allocated space for window-shuffled result.
+ *
+ * Return: <eslOK> on success.
+ */
+int
+esl_rsq_XShuffleWindows(ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, int w, ESL_DSQ *shuffled)
+{
+ ESL_DSQ x;
+ int i, j, k;
+
+ if (dsq != shuffled) esl_abc_dsqcpy(dsq, L, shuffled);
+ for (i = 1; i <= L; i += w)
+ for (j = ESL_MIN(L, i+w-1); j > i; j--)
+ {
+ k = i + esl_rnd_Roll(r, j-i+1);
+ x = shuffled[k]; /* semantics of a j,k swap, because we might be shuffling in-place */
+ shuffled[k] = shuffled[j];
+ shuffled[j] = x;
+ }
+ return eslOK;
+}
+
+/*------------------- end, digital shuffling -------------------*/
+
+
+
+/*****************************************************************
+ *# 6. Randomizing sequences (digital mode)
+ *****************************************************************/
+
+/* Function: esl_rsq_XMarkov0()
+ * Synopsis: Generate new digital sequence of same 0th order Markov properties.
+ * Incept: SRE, Sat Feb 24 09:12:32 2007 [Casa de Gatos]
+ *
+ * Purpose: Same as <esl_rsq_CMarkov0()>, except for a digital
+ * sequence <dsq> of length <L>, encoded in a digital
+ * alphabet of <K> residues; caller provides storage
+ * for the randomized sequence <markoved> for at least
+ * <L+2> <ESL_DSQ> residues, including the two flanking
+ * sentinel bytes.
+ *
+ * <dsq> therefore may only consist of residue codes
+ * in the range <0..K-1>. If it contains gaps,
+ * degeneracies, or missing data, pass the alphabet's
+ * <Kp> size, not its canonical <K>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <s> contains digital residue codes outside
+ * the range <0..K-1>.
+ * <eslEMEM> on allocation failure.
+ */
+int
+esl_rsq_XMarkov0(ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, int K, ESL_DSQ *markoved)
+{
+ int status;
+ int i;
+ double *p = NULL; /* initially counts, then probabilities */
+ int x;
+
+ /* First, verify that the string is entirely alphabetic. */
+ for (i = 1; i <= L; i++)
+ if (dsq[i] >= K)
+ ESL_XEXCEPTION(eslEINVAL, "String contains unexpected residue codes");
+
+ ESL_ALLOC(p, sizeof(double) * K);
+ for (x = 0; x < K; x++) p[x] = 0.;
+
+ for (i = 1; i <= L; i++)
+ p[(int) dsq[i]] += 1.0;
+ if (L > 0)
+ for (x = 0; x < K; x++) p[x] /= (double) L;
+
+ for (i = 1; i <= L; i++)
+ markoved[i] = esl_rnd_DChoose(r, p, K);
+ markoved[0] = eslDSQ_SENTINEL;
+ markoved[L+1] = eslDSQ_SENTINEL;
+
+ free(p);
+ return eslOK;
+
+ ERROR:
+ if (p != NULL) free(p);
+ return status;
+}
+
+
+
+/* Function: esl_rsq_XMarkov1()
+ * Synopsis: Generate new digital sequence of same 1st order Markov properties.
+ * Incept: SRE, Sat Feb 24 09:46:09 2007 [Casa de Gatos]
+ *
+ * Purpose: Same as <esl_rsq_CMarkov1()>, except for a digital
+ * sequence <dsq> of length <L>, encoded in a digital
+ * alphabet of <K> residues. Caller provides storage
+ * for the randomized sequence <markoved> for at least
+ * <L+2> <ESL_DSQ> residues, including the two flanking
+ * sentinel bytes.
+ *
+ * <dsq> and <markoved> can be point to the same storage, in which
+ * case <dsq> is randomized in place, destroying the original
+ * string.
+ *
+ * <dsq> therefore may only consist of residue codes
+ * in the range <0..K-1>. If it contains gaps,
+ * degeneracies, or missing data, pass the alphabet's
+ * <Kp> size, not its canonical <K>.
+ *
+ * If <L> $\leq 2$, this is a no-op; <markoved> is a copy of <dsq>.
+ *
+ * Args: dsq - input digital sequence 1..L
+ * L - length of dsq
+ * K - residue codes in dsq are in range 0..K-1
+ * markoved - new randomly generated digital sequence;
+ * storage allocated by caller, at least (L+2)*ESL_DSQ;
+ * may be same as dsq to randomize in place.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <s> contains digital residue codes outside
+ * the range <0..K-1>.
+ * <eslEMEM> on allocation failure.
+ */
+int
+esl_rsq_XMarkov1(ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, int K, ESL_DSQ *markoved)
+{
+ double **p = NULL; /* conditional probabilities p[x][y] = P(y | x) */
+ double *p0 = NULL; /* marginal probabilities P(x), just for initial residue. */
+ int i;
+ ESL_DSQ x,y;
+ ESL_DSQ i0; /* initial symbol */
+ int status;
+
+ /* validate the input string */
+ for (i = 1; i <= L; i++)
+ if (dsq[i] >= K)
+ ESL_XEXCEPTION(eslEINVAL, "String contains unexpected residue codes");
+
+ /* The edge case of L <= 2 */
+ if (L <= 2)
+ {
+ if (dsq != markoved) memcpy(markoved, dsq, sizeof(ESL_DSQ) * (L+2));
+ return eslOK;
+ }
+
+ /* allocations */
+ ESL_ALLOC(p0, sizeof(double) * K); for (x = 0; x < K; x++) p0[x] = 0.;
+ ESL_ALLOC(p, sizeof(double *) * K); for (x = 0; x < K; x++) p[x] = NULL;
+ for (x = 0; x < K; x++)
+ { ESL_ALLOC(p[x], sizeof(double) * K); for (y = 0; y < K; y++) p[x][y] = 0.; }
+
+ /* Collect first order counts and convert to frequencies. */
+ i0 = x = dsq[1];
+ for (i = 2; i <= L; i++)
+ {
+ y = dsq[i];
+ p[x][y] += 1.0;
+ x = y;
+ }
+ p[x][i0] += 1.0; /* "circularized": avoids a bug; see markov1_bug utest */
+
+ for (x = 0; x < K; x++)
+ {
+ p0[x] = 0.;
+ for (y = 0; y < K; y++)
+ p0[x] += p[x][y]; /* now p0[x] = marginal counts of x, inclusive of 1st residue */
+
+ for (y = 0; y < K; y++)
+ p[x][y] = (p0[x] > 0. ? p[x][y] / p0[x] : 0.); /* now p[x][y] = P(y | x) */
+
+ p0[x] /= (double) L; /* now p0[x] = marginal P(x) inclusive of 1st residue */
+ }
+
+ /* Generate a random string using those p's. */
+ markoved[1] = esl_rnd_DChoose(r, p0, K);
+ for (i = 2; i <= L; i++)
+ markoved[i] = esl_rnd_DChoose(r, p[markoved[i-1]], K);
+
+ markoved[0] = eslDSQ_SENTINEL;
+ markoved[L+1] = eslDSQ_SENTINEL;
+
+ esl_Free2D((void**)p, K);
+ free(p0);
+ return eslOK;
+
+ ERROR:
+ esl_Free2D((void**)p, K);
+ if (p0 != NULL) free(p0);
+ return status;
+}
+
+/*------------------ end, digital randomizing -------------------*/
+
+/*****************************************************************
+ * 7. Statistics driver.
+ *****************************************************************/
+
+/* This driver tests (and confirms) the intuition that using
+ * a DP shuffle on short sequences may be a bad idea; short sequences
+ * don't shuffle effectively.
+ * xref J3/20.
+ */
+#ifdef eslRANDOMSEQ_STATS
+/* gcc -g -Wall -o randomseq_stats -L. -I. -DeslRANDOMSEQ_STATS esl_randomseq.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_distance.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_randomseq.h"
+#include "esl_stats.h"
+#include "esl_vectorops.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-d", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "diresidue shuffle", 0 },
+ { "-R", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "reverse the sequence", 0 },
+ { "-2", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "resample an independent sequence", 0 },
+ { "-N", eslARG_INT, "10000", NULL, NULL, NULL, NULL, NULL, "number of sampled sequences per length", 0 },
+ { "-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { "--minL", eslARG_INT, "5", NULL, NULL, NULL, NULL, NULL, "xaxis minimum L", 0 },
+ { "--maxL", eslARG_INT, "200", NULL, NULL, NULL, NULL, NULL, "xaxis maximum L", 0 },
+ { "--stepL", eslARG_INT, "5", NULL, NULL, NULL, NULL, NULL, "xaxis step size", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "stats driver for randomseq module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslAMINO);
+ int N = esl_opt_GetInteger(go, "-N");
+ int minL = esl_opt_GetInteger(go, "--minL");
+ int maxL = esl_opt_GetInteger(go, "--maxL");
+ int stepL = esl_opt_GetInteger(go, "--stepL");
+ ESL_DSQ *dsq1 = malloc(sizeof(ESL_DSQ) * (maxL+2));
+ ESL_DSQ *dsq2 = malloc(sizeof(ESL_DSQ) * (maxL+2));
+ double *fq = malloc(sizeof(double) * abc->K);
+ double *pid = malloc(sizeof(double) * N);
+ double mean, var;
+ int L;
+ int i;
+
+ esl_vec_DSet(fq, abc->K, 1.0 / (double) abc->K );
+
+ for (L = minL; L <= maxL; L += stepL)
+ {
+ for (i = 0; i < N; i++)
+ {
+ esl_rsq_xIID(r, fq, abc->K, L, dsq1);
+
+ if (esl_opt_GetBoolean(go, "-d")) esl_rsq_XShuffleDP(r, dsq1, L, abc->K, dsq2);
+ else if (esl_opt_GetBoolean(go, "-R")) esl_rsq_XReverse(dsq1, L, dsq2);
+ else if (esl_opt_GetBoolean(go, "-2")) esl_rsq_xIID(r, fq, abc->K, L, dsq2);
+ else esl_rsq_XShuffle(r, dsq1, L, dsq2);
+
+ esl_dst_XPairId(abc, dsq1, dsq2, &(pid[i]), NULL, NULL);
+ }
+
+ esl_stats_DMean(pid, N, &mean, &var);
+ printf("%-6d %.4f %.4f\n", L, mean, sqrt(var));
+ }
+ printf("&\n");
+
+ free(pid);
+ free(fq);
+ free(dsq2);
+ free(dsq1);
+ esl_alphabet_Destroy(abc);
+ esl_randomness_Destroy(r);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslRANDOMSEQ_STATS*/
+/*-------------- end, statistics driver -------------------------*/
+
+
+
+
+
+/*****************************************************************
+ * 8. Unit tests.
+ *****************************************************************/
+#ifdef eslRANDOMSEQ_TESTDRIVE
+#include "esl_dirichlet.h"
+#include "esl_vectorops.h"
+
+/* count c(x) monoresidue and c(xy) diresidue composition
+ * used for sequence shuffling unit tests
+ * mono, di allocated by caller for 26 and 26x26, respectively.
+ */
+static int
+composition(char *s, int L, int *mono, int **di)
+{
+ int i, x, y;
+
+ for (x = 0; x < 26; x++) {
+ mono[x] = 0;
+ for (y = 0; y < 26; y++)
+ di[x][y] = 0;
+ }
+
+ for (i = 0; s[i] != '\0'; i++) {
+ if (!isalpha(s[i])) esl_fatal("bad residue %d", i);
+ y = toupper(s[i]) - 'A';
+ mono[y]++;
+ if (i > 0) {
+ x = toupper(s[i-1] - 'A');
+ di[x][y]++;
+ }
+ }
+ if (i != L) esl_fatal("sequence length didn't match expected %d", L);
+ return eslOK;
+}
+
+/* same, but for digital seq., with alphabet size K */
+static int
+xcomposition(ESL_DSQ *dsq, int L, int K, int *mono, int **di)
+{
+ int i, x, y;
+
+ for (x = 0; x < K; x++) {
+ mono[x] = 0;
+ for (y = 0; y < K; y++)
+ di[x][y] = 0;
+ }
+
+ for (i = 1; dsq[i] != eslDSQ_SENTINEL; i++) {
+ if (dsq[i] > K) esl_fatal("bad residue %d", i);
+ if (i > 1) di[(int) dsq[i-1]][(int) dsq[i]]++;
+ mono[(int) dsq[i]]++;
+ }
+ if (i != L+1) esl_fatal("sequence length didn't match expected %d", L);
+ return eslOK;
+}
+
+static int
+composition_allocate(int K, int **ret_mono, int ***ret_di)
+{
+ int status;
+ int *mono = NULL;
+ int **di = NULL;
+ int x;
+
+ ESL_ALLOC(mono, sizeof(int) * K);
+ ESL_ALLOC(di, sizeof(int *) * K); for (x = 0; x < K; x++) di[x] = NULL;
+ for (x = 0; x < K; x++)
+ ESL_ALLOC(di[x], sizeof(int) * K);
+ *ret_mono = mono;
+ *ret_di = di;
+ return eslOK;
+
+ ERROR:
+ esl_Free2D((void **) di, K);
+ if (mono != NULL) free(mono);
+ *ret_mono = NULL;
+ *ret_di = NULL;
+ return status;
+}
+
+/* compare compositions before/after.
+ * either mono (m1,m2) or di (d1,d2) may be NULL, to compare only the other one */
+static int
+composition_compare(int *m1, int **di1, int *m2, int **di2, int K)
+{
+ int x,y;
+
+ for (x = 0; x < K; x++) {
+ if (m1 != NULL && m1[x] != m2[x]) return eslFAIL;
+ if (di1 != NULL)
+ for (y = 0; y < K; y++)
+ if (di1[x][y] != di2[x][y]) return eslFAIL;
+ }
+ return eslOK;
+}
+
+/* Unit tests for:
+ * esl_rsq_CShuffle()
+ * esl_rsq_CShuffleDP()
+ * esl_rsq_CShuffleWindows()
+ * esl_rsq_CReverse()
+ *
+ * All of these exactly preserve residue composition, which is
+ * the basis of the unit tests.
+ */
+static void
+utest_CShufflers(ESL_RANDOMNESS *r, int L, char *alphabet, int K)
+{
+ char *logmsg = "Failure in one of the CShuffle* unit tests";
+ int status;
+ char *s = NULL;
+ char *s2 = NULL;
+ int *m1 = NULL,
+ *m2 = NULL; /* mono, before and after */
+ int **di1 = NULL,
+ **di2 = NULL; /* di, before and after */
+ double *p;
+ int w = 12; /* window width for CShuffleWindows() */
+
+ /* allocations */
+ ESL_ALLOC(s, sizeof(char) * (L+1));
+ ESL_ALLOC(s2, sizeof(char) * (L+1));
+ ESL_ALLOC(p, sizeof(double) * K);
+ if (composition_allocate(26, &m1, &di1) != eslOK) esl_fatal(logmsg);
+ if (composition_allocate(26, &m2, &di2) != eslOK) esl_fatal(logmsg);
+
+ /* generate the string we'll start shuffling */
+ if (esl_dirichlet_DSampleUniform(r, K, p) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_IID(r, alphabet, p, K, L, s) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_CShuffle: mono composition should stay exactly the same, di may change */
+ memset(s2, 0, (L+1)*sizeof(char));
+ if (composition(s, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CShuffle(r, s, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, 26) != eslOK) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CShuffle, in place */
+ strcpy(s, s2);
+ if (composition(s2, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CShuffle(r, s2, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, 26) != eslOK) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CShuffleDP: mono and di compositions stay exactly the same */
+ memset(s2, 0, (L+1)*sizeof(char));
+ if (composition(s, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CShuffleDP(r, s, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, di1, m2, di2, 26) != eslOK) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CShuffleDP, in place */
+ strcpy(s, s2);
+ if (composition(s2, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CShuffleDP(r, s2, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, di1, m2, di2, 26) != eslOK) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CShuffleKmers: mono composition stays the same */
+ memset(s2, 0, (L+1)*sizeof(char));
+ if (composition(s, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CShuffleKmers(r, s, 3, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, 26) != eslOK) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CShuffleKmers, in place */
+ strcpy(s, s2);
+ if (composition(s2, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CShuffleKmers(r, s2, 3, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, 26) != eslOK) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CShuffleWindows(): mono composition stays the same */
+ memset(s2, 0, (L+1)*sizeof(char));
+ if (composition(s, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CShuffleWindows(r, s, w, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, 26) != eslOK) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CShuffleWindows(), in place */
+ strcpy(s, s2);
+ if (composition(s2, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CShuffleWindows(r, s2, w, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, 26) != eslOK) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CReverse(): two reverses (one in place) give the same seq back */
+ memset(s2, 0, (L+1)*sizeof(char));
+ if (composition(s, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CReverse(s, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, 26) != eslOK) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+ if (esl_rsq_CReverse(s2, s2) != eslOK) esl_fatal(logmsg);
+ if (strcmp(s2, s) != 0) esl_fatal(logmsg);
+
+ free(s);
+ free(s2);
+ free(p);
+ free(m1);
+ free(m2);
+ esl_Free2D((void **) di1, 26);
+ esl_Free2D((void **) di2, 26);
+ return;
+
+ ERROR:
+ esl_fatal(logmsg);
+}
+
+/* Unit tests for:
+ * esl_rsq_CMarkov0()
+ * esl_rsq_CMarkov1()
+ *
+ * Testing these is less robust than the shufflers, because it's hard
+ * to concoct deterministic tests. Instead the test is a weak one,
+ * that zero probability events get zero counts.
+ */
+static void
+utest_CMarkovs(ESL_RANDOMNESS *r, int L, char *alphabet)
+{
+ char *logmsg = "Failure in a CMarkov*() unit test";
+ int status;
+ char *s = NULL;
+ char *s2 = NULL;
+ float *p = NULL;
+ int K;
+ int pzero; /* which 0..K-1 residue will have zero prob */
+ int zeroidx; /* index of pzero residue in 0..25 ASCII */
+ int *m1 = NULL,
+ *m2 = NULL; /* mono, before and after */
+ int **di1 = NULL,
+ **di2 = NULL; /* di, before and after */
+ int i,x;
+
+ K = strlen(alphabet);
+ ESL_ALLOC(p, sizeof(float) * K);
+ ESL_ALLOC(s, sizeof(char) * (L+1));
+ ESL_ALLOC(s2, sizeof(char) * (L+1));
+ if (composition_allocate(26, &m1, &di1) != eslOK) esl_fatal(logmsg);
+ if (composition_allocate(26, &m2, &di2) != eslOK) esl_fatal(logmsg);
+
+ /* generate string with a random letter prob set to 0 */
+ pzero = esl_rnd_Roll(r, K);
+ zeroidx = toupper(alphabet[pzero]) - 'A';
+ if (esl_dirichlet_FSampleUniform(r, K, p) != eslOK) esl_fatal(logmsg);
+ p[pzero] = 0;
+ esl_vec_FNorm(p, K);
+ if (esl_rsq_fIID(r, alphabet, p, K, L, s) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_CMarkov0() */
+ memset(s2, 0, (L+1)*sizeof(char));
+ if (composition(s, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CMarkov0(r, s, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (m1[zeroidx] != 0) esl_fatal(logmsg);
+ if (m2[zeroidx] != 0) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CMarkov0(), in place */
+ strcpy(s, s2);
+ if (esl_rsq_CMarkov0(r, s2, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (m2[zeroidx] != 0) esl_fatal(logmsg);
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* generate string with all homodiresidues set to 0 */
+ if (esl_dirichlet_FSampleUniform(r, K, p) != eslOK) esl_fatal(logmsg);
+ do {
+ if (esl_rsq_fIID(r, alphabet, p, K, L, s) != eslOK) esl_fatal(logmsg);
+ for (i = 1; i < L; i++)
+ if (s[i] == s[i-1]) /* this incantation will rotate letter forward in alphabet: */
+ s[i] = alphabet[(1+strchr(alphabet,s[i])-alphabet)%K];
+ } while (s[0] == s[L-1]); /* lazy: reject strings where circularization would count a homodimer */
+
+ /* esl_rsq_CMarkov1() */
+ memset(s2, 0, (L+1)*sizeof(char));
+ if (composition(s, L, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_CMarkov1(r, s, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ for (x = 0; x < K; x++) {
+ if (di1[x][x] != 0) esl_fatal(logmsg);
+ if (di2[x][x] != 0) esl_fatal(logmsg);
+ }
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CMarkov1(), in place */
+ strcpy(s, s2);
+ if (esl_rsq_CMarkov1(r, s2, s2) != eslOK) esl_fatal(logmsg);
+ if (composition(s2, L, m2, di2) != eslOK) esl_fatal(logmsg);
+ for (x = 0; x < K; x++) {
+ if (di1[x][x] != 0) esl_fatal(logmsg);
+ if (di2[x][x] != 0) esl_fatal(logmsg);
+ }
+ if (strcmp(s2, s) == 0) esl_fatal(logmsg);
+
+ free(s);
+ free(s2);
+ free(p);
+ free(m1);
+ free(m2);
+ esl_Free2D((void **) di1, 26);
+ esl_Free2D((void **) di2, 26);
+ return;
+
+ ERROR:
+ esl_fatal(logmsg);
+}
+
+
+/* Unit tests for:
+ * esl_rsq_XShuffle()
+ * esl_rsq_XShuffleDP()
+ * esl_rsq_XShuffleWindows()
+ * esl_rsq_XReverse()
+ * Same ideas as testing the C* versions, adapted for digital sequences.
+ */
+static void
+utest_XShufflers(ESL_RANDOMNESS *r, int L, int K)
+{
+ char *logmsg = "Failure in one of the XShuffle* unit tests";
+ int status;
+ ESL_DSQ *dsq = NULL;
+ ESL_DSQ *ds2 = NULL;
+ int *m1 = NULL,
+ *m2 = NULL; /* mono, before and after */
+ int **di1 = NULL,
+ **di2 = NULL; /* di, before and after */
+ float *p = NULL;
+ int w = 12; /* window width for XShuffleWindows() */
+
+ /* allocations */
+ ESL_ALLOC(dsq, sizeof(ESL_DSQ) * (L+2));
+ ESL_ALLOC(ds2, sizeof(ESL_DSQ) * (L+2));
+ ESL_ALLOC(p, sizeof(float) * K);
+ if (composition_allocate(K, &m1, &di1) != eslOK) esl_fatal(logmsg);
+ if (composition_allocate(K, &m2, &di2) != eslOK) esl_fatal(logmsg);
+
+ /* generate the string we'll test shuffling on, keep its composition stats */
+ if (esl_dirichlet_FSampleUniform(r, K, p) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_xfIID(r, p, K, L, dsq) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_XShuffle: mono composition should stay exactly the same, di may change */
+ memset(ds2, eslDSQ_SENTINEL, (L+2));
+ if (xcomposition(dsq, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XShuffle(r, dsq, L, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, K) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_XShuffle, in place */
+ if (esl_abc_dsqcpy(ds2, L, dsq) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XShuffle(r, ds2, L, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, K) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_XShuffleDP: mono and di compositions stay exactly the same */
+ memset(ds2, eslDSQ_SENTINEL, (L+2));
+ if (xcomposition(dsq, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XShuffleDP(r, dsq, L, K, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, di1, m2, di2, K) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_XShuffleDP, in place */
+ if (esl_abc_dsqcpy(ds2, L, dsq) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XShuffleDP(r, ds2, L, K, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, di1, m2, di2, K) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_XShuffleKmers: mono compositions stay exactly the same */
+ memset(ds2, eslDSQ_SENTINEL, (L+2));
+ if (xcomposition(dsq, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XShuffleKmers(r, dsq, L, 3, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, K) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_XShuffleKmers, in place */
+ if (esl_abc_dsqcpy(ds2, L, dsq) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XShuffleKmers(r, ds2, L, 3, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, K) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_XShuffleWindows(): mono composition stays the same */
+ memset(ds2, eslDSQ_SENTINEL, (L+2));
+ if (xcomposition(dsq, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XShuffleWindows(r, dsq, L, w, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, K) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_XShuffleWindows(), in place */
+ if (esl_abc_dsqcpy(ds2, L, dsq) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XShuffleWindows(r, ds2, L, w, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, K) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_XReverse(): two reverses (one in place) give the same seq back */
+ memset(ds2, eslDSQ_SENTINEL, (L+2));
+ if (xcomposition(dsq, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XReverse(dsq, L, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (composition_compare(m1, NULL, m2, NULL, K) != eslOK) esl_fatal(logmsg);
+ if (memcmp((void *) ds2, (void *) dsq, sizeof(ESL_DSQ)*(L+2)) == 0) esl_fatal(logmsg);
+ if (esl_rsq_XReverse(ds2, L, ds2) != eslOK) esl_fatal(logmsg);
+ if (memcmp((void *) ds2, (void *) dsq, sizeof(ESL_DSQ)*(L+2)) != 0) esl_fatal(logmsg);
+
+ free(dsq);
+ free(ds2);
+ free(p);
+ free(m1);
+ free(m2);
+ esl_Free2D((void **) di1, K);
+ esl_Free2D((void **) di2, K);
+ return;
+
+ ERROR:
+ esl_fatal(logmsg);
+}
+
+/* Unit tests for:
+ * esl_rsq_XMarkov0()
+ * esl_rsq_XMarkov1()
+ * Same ideas as in the C* versions, but for digital sequences.
+ */
+static void
+utest_XMarkovs(ESL_RANDOMNESS *r, int L, int K)
+{
+ char *logmsg = "Failure in an XMarkov*() unit test";
+ int status;
+ ESL_DSQ *dsq = NULL;
+ ESL_DSQ *ds2 = NULL;
+ int *m1 = NULL,
+ *m2 = NULL; /* mono, before and after */
+ int **di1 = NULL,
+ **di2 = NULL; /* di, before and after */
+ float *p = NULL;
+ int pzero;
+ int i,x;
+
+ /* allocations */
+ ESL_ALLOC(dsq, sizeof(ESL_DSQ) * (L+2));
+ ESL_ALLOC(ds2, sizeof(ESL_DSQ) * (L+2));
+ ESL_ALLOC(p, sizeof(float) * K);
+ if (composition_allocate(K, &m1, &di1) != eslOK) esl_fatal(logmsg);
+ if (composition_allocate(K, &m2, &di2) != eslOK) esl_fatal(logmsg);
+
+ /* generate sequence with a random letter prob set to 0 */
+ pzero = esl_rnd_Roll(r, K);
+ if (esl_dirichlet_FSampleUniform(r, K, p) != eslOK) esl_fatal(logmsg);
+ p[pzero] = 0.;
+ esl_vec_FNorm(p, K);
+ if (esl_rsq_xfIID(r, p, K, L, dsq) != eslOK) esl_fatal(logmsg);
+
+ /* esl_rsq_XMarkov0() */
+ memset(ds2, eslDSQ_SENTINEL, (L+2)*sizeof(ESL_DSQ));
+ if (xcomposition(dsq, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XMarkov0(r, dsq, L, K, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (m1[pzero] != 0) esl_fatal(logmsg);
+ if (m2[pzero] != 0) esl_fatal(logmsg);
+ if (memcmp(ds2, dsq, sizeof(ESL_DSQ)*(L+2)) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_CMarkov0(), in place */
+ if (esl_abc_dsqcpy(ds2, L, dsq) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XMarkov0(r, ds2, L, K, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ if (m2[pzero] != 0) esl_fatal(logmsg);
+ if (memcmp(ds2, dsq, sizeof(ESL_DSQ)*(L+2)) == 0) esl_fatal(logmsg);
+
+ /* generate string with all homodiresidues set to 0 */
+ if (esl_dirichlet_FSampleUniform(r, K, p) != eslOK) esl_fatal(logmsg);
+ do {
+ if (esl_rsq_xfIID(r, p, K, L, dsq) != eslOK) esl_fatal(logmsg);
+ for (i = 2; i <= L; i++)
+ if (dsq[i] == dsq[i-1]) /* this incantation will rotate letter forward in alphabet: */
+ dsq[i] = (dsq[i]+1)%K;
+ } while (dsq[1] == dsq[L]); /* lazy. reject strings where circularization would count a homodimer */
+
+ /* esl_rsq_XMarkov1() */
+ memset(ds2, eslDSQ_SENTINEL, (L+2)*sizeof(ESL_DSQ));
+ if (xcomposition(dsq, L, K, m1, di1) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XMarkov1(r, dsq, L, K, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ for (x = 0; x < K; x++) {
+ if (di1[x][x] != 0) esl_fatal(logmsg);
+ if (di2[x][x] != 0) esl_fatal(logmsg);
+ }
+ if (memcmp(ds2, dsq, sizeof(ESL_DSQ)*(L+2)) == 0) esl_fatal(logmsg);
+
+ /* esl_rsq_XMarkov1(), in place */
+ if (esl_abc_dsqcpy(ds2, L, dsq) != eslOK) esl_fatal(logmsg);
+ if (esl_rsq_XMarkov1(r, ds2, L, K, ds2) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(ds2, L, K, m2, di2) != eslOK) esl_fatal(logmsg);
+ for (x = 0; x < K; x++) {
+ if (di1[x][x] != 0) esl_fatal(logmsg);
+ if (di2[x][x] != 0) esl_fatal(logmsg);
+ }
+ if (memcmp(ds2, dsq, sizeof(ESL_DSQ)*(L+2)) == 0) esl_fatal(logmsg);
+
+ free(dsq);
+ free(ds2);
+ free(p);
+ free(m1);
+ free(m2);
+ esl_Free2D((void **) di1, K);
+ esl_Free2D((void **) di2, K);
+ return;
+
+ ERROR:
+ esl_fatal(logmsg);
+}
+
+/* utest_markov1_bug()
+ *
+ * Given a sequence like AAAAAAAAAT, where a residue only occurs once
+ * and at the end of the sequence, a bug can appear: a Markov chain
+ * can transit to T, but can't leave. Easel handles this by
+ * counting Markov statistics as if the input sequence were circular.
+ */
+static void
+utest_markov1_bug(ESL_RANDOMNESS *r)
+{
+ char logmsg[] = "Failure in markov1_bug test (zero/absorbing transition)";
+ char testseq[] = "AAAAAAAAAT";
+ char *seq = NULL;
+ ESL_DSQ testdsq[] = { eslDSQ_SENTINEL,0,0,0,0,0,0,0,0,0,3,eslDSQ_SENTINEL};
+ ESL_DSQ *dsq = NULL;
+ int L = strlen(testseq);
+ int *mono = NULL;
+ int **di = NULL;
+ int N = 100;
+ int i;
+
+ if ((seq = malloc(sizeof(char) * (L+1))) == NULL) esl_fatal(logmsg);
+ if ((dsq = malloc(sizeof(ESL_DSQ) * (L+2))) == NULL) esl_fatal(logmsg);
+
+ if (composition_allocate(4, &mono, &di) != eslOK) esl_fatal(logmsg);
+ for (i = 0; i < N; i++) {
+ if (esl_rsq_XMarkov1(r, testdsq, L, 4, dsq) != eslOK) esl_fatal(logmsg);
+ if (xcomposition(testdsq, L, 4, mono, di) != eslOK) esl_fatal(logmsg);
+ if (mono[0] + mono[3] != L) esl_fatal(logmsg);
+ }
+ esl_Free2D((void **) di, 4);
+ free(mono);
+
+ if (composition_allocate(26, &mono, &di) != eslOK) esl_fatal(logmsg);
+ for (i = 0; i < N; i++) {
+ if (esl_rsq_CMarkov1(r, testseq, seq) != eslOK) esl_fatal(logmsg);
+ if (composition(seq, L, mono, di) != eslOK) esl_fatal(logmsg);
+ if (mono[0] + mono['T'-'A'] != L) esl_fatal(logmsg);
+ }
+ esl_Free2D((void **) di, 26);
+ free(mono);
+ free(seq);
+ free(dsq);
+}
+
+#endif /*eslRANDOMSEQ_TESTDRIVE*/
+/*------------------ end, unit tests ----------------------------*/
+
+/*****************************************************************
+ * 9. Test driver.
+ *****************************************************************/
+#ifdef eslRANDOMSEQ_TESTDRIVE
+/* gcc -g -Wall -o randomseq_utest -L. -I. -DeslRANDOMSEQ_TESTDRIVE esl_randomseq.c -leasel -lm
+ */
+
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_randomseq.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-L", eslARG_INT, "1000", NULL, NULL, NULL, NULL, NULL, "length of random sequences", 0 },
+ { "-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for randomseq module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ char *alphabet = "ACGT";
+ int K = strlen(alphabet);
+ int L = esl_opt_GetInteger(go, "-L");
+
+ utest_CShufflers(r, L, alphabet, K);
+ utest_CMarkovs (r, L, alphabet);
+ utest_XShufflers(r, L, K);
+ utest_XMarkovs (r, L, K);
+
+ utest_markov1_bug(r);
+
+ esl_randomness_Destroy(r);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+#endif /*eslRANDOMSEQ_TESTDRIVE*/
+/*----------------- end, test driver ----------------------------*/
+
+
+/*****************************************************************
+ * 10. Example.
+ *****************************************************************/
+#ifdef eslRANDOMSEQ_EXAMPLE
+/*::cexcerpt::randomseq_example::begin::*/
+/* compile: gcc -g -Wall -I. -o example -DeslRANDOMSEQ_EXAMPLE esl_randomseq.c\
+ esl_random.c esl_sqio.c esl_sq.c easel.c -lm
+ * run: ./example <FASTA file>
+ */
+#include "easel.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_random.h"
+#include "esl_randomseq.h"
+
+int
+main(int argc, char **argv)
+{
+ char *seqfile = argv[1];
+ int format = eslSQFILE_UNKNOWN;
+ ESL_SQFILE *sqfp = NULL;
+ ESL_SQ *sq = esl_sq_Create();
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ int status;
+
+ if (esl_sqfile_Open(seqfile, format, NULL, &sqfp) != eslOK)
+ esl_fatal("Failed to open %s\n", seqfile);
+
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ printf("[Original sequence:]\n");
+ esl_sqio_Write(stdout, sq, eslSQFILE_FASTA);
+
+ printf("[After shuffling:]\n");
+ esl_rsq_CShuffle(r, sq->seq, sq->seq); /* shuffle in place */
+ esl_sqio_Write(stdout, sq, eslSQFILE_FASTA);
+
+ esl_sq_Reuse(sq);
+ }
+ if (status != eslEOF) esl_fatal("Parse failed");
+ esl_sqfile_Close(sqfp);
+
+ esl_sq_Destroy(sq);
+ esl_randomness_Destroy(r);
+ return 0;
+}
+/*::cexcerpt::randomseq_example::end::*/
+#endif /*eslRANDOMSEQ_EXAMPLE*/
+/*--------------------- end, example ----------------------------*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_randomseq.h b/esl_randomseq.h
new file mode 100644
index 0000000..fb517e6
--- /dev/null
+++ b/esl_randomseq.h
@@ -0,0 +1,65 @@
+/* Generating, shuffling, and randomizing sequences.
+ */
+#ifndef eslRANDOMSEQ_INCLUDED
+#define eslRANDOMSEQ_INCLUDED
+
+#include "esl_alphabet.h"
+#include "esl_random.h"
+
+/* Control flag passed to esl_rsq_Sample(): */
+#define eslRSQ_SAMPLE_ALNUM 1 /* isalpha | isdigit */
+#define eslRSQ_SAMPLE_ALPHA 2 /* islower | isupper */
+#define eslRSQ_SAMPLE_LOWER 3 /* ASCII: a-z */
+#define eslRSQ_SAMPLE_UPPER 4 /* ASCII: A-Z */
+#define eslRSQ_SAMPLE_DIGIT 5 /* 0-9 */
+#define eslRSQ_SAMPLE_XDIGIT 6 /* 0-9, a-f, A-F */
+#define eslRSQ_SAMPLE_CNTRL 7 /* ASCII: 0..0x1F, plus 0x7F (DEL) */
+#define eslRSQ_SAMPLE_GRAPH 8 /* isprint && ! ' ' (space) */
+#define eslRSQ_SAMPLE_SPACE 9 /* ' ', '\f', '\n', '\r', '\t', '\v' */
+#define eslRSQ_SAMPLE_BLANK 10 /* ' ', '\t' */
+#define eslRSQ_SAMPLE_PRINT 11 /* ASCII: 0x20 ' ' through 0x7E '~' */
+#define eslRSQ_SAMPLE_PUNCT 12 /* isprint && !(isspace || isalnum) */
+
+
+/* 1. Generating simple random character strings. */
+extern int esl_rsq_Sample(ESL_RANDOMNESS *rng, int allowed_chars_flag, int L, char **ret_s);
+
+/* 2. Generating iid sequences. */
+extern int esl_rsq_IID (ESL_RANDOMNESS *r, const char *alphabet, const double *p, int K, int L, char *s);
+extern int esl_rsq_fIID (ESL_RANDOMNESS *r, const char *alphabet, const float *p, int K, int L, char *s);
+
+/* 3. Shuffling sequences. */
+extern int esl_rsq_CShuffle (ESL_RANDOMNESS *r, const char *s, char *shuffled);
+extern int esl_rsq_CShuffleDP (ESL_RANDOMNESS *r, const char *s, char *shuffled);
+extern int esl_rsq_CShuffleKmers (ESL_RANDOMNESS *r, const char *s, int K, char *shuffled);
+extern int esl_rsq_CReverse (const char *s, char *rev);
+extern int esl_rsq_CShuffleWindows(ESL_RANDOMNESS *r, const char *s, int w, char *shuffled);
+
+/* 4. Randomizing sequences */
+extern int esl_rsq_CMarkov0 (ESL_RANDOMNESS *r, const char *s, char *markoved);
+extern int esl_rsq_CMarkov1 (ESL_RANDOMNESS *r, const char *s, char *markoved);
+
+/* 5. Generating iid sequences (digital mode). */
+extern int esl_rsq_xIID (ESL_RANDOMNESS *r, const double *p, int K, int L, ESL_DSQ *dsq);
+extern int esl_rsq_xfIID (ESL_RANDOMNESS *r, const float *p, int K, int L, ESL_DSQ *dsq);
+extern int esl_rsq_SampleDirty(ESL_RANDOMNESS *rng, ESL_ALPHABET *abc, double **byp_p, int L, ESL_DSQ *dsq);
+
+/* 6. Shuffling sequences (digital mode). */
+extern int esl_rsq_XShuffle (ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, ESL_DSQ *shuffled);
+extern int esl_rsq_XShuffleDP (ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, int K, ESL_DSQ *shuffled);
+extern int esl_rsq_XShuffleKmers (ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, int K, ESL_DSQ *shuffled);
+extern int esl_rsq_XReverse(const ESL_DSQ *dsq, int L, ESL_DSQ *rev);
+extern int esl_rsq_XShuffleWindows(ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, int w, ESL_DSQ *shuffled);
+
+/* 7. Randomizing sequences (digital mode) */
+extern int esl_rsq_XMarkov0 (ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, int K, ESL_DSQ *markoved);
+extern int esl_rsq_XMarkov1 (ESL_RANDOMNESS *r, const ESL_DSQ *dsq, int L, int K, ESL_DSQ *markoved);
+
+#endif /*eslRANDOMSEQ_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
diff --git a/esl_randomseq.tex b/esl_randomseq.tex
new file mode 100644
index 0000000..08f913e
--- /dev/null
+++ b/esl_randomseq.tex
@@ -0,0 +1,79 @@
+The \eslmod{randomseq} module contains routines for generating,
+shuffling, and randomizing sequences.
+
+``Generating'' means sampling a sequence from a given statistical
+distribution. ``Shuffling'' means taking a given sequence and
+randomizing it in some way that preserves at least the exact residue
+composition of that sequence, and possibly other higher-order
+statistics. ``Randomizing'' means sampling a sequence from a
+statistical distribution estimated from a given sequence.
+
+Routines like this are useful in testing sequence analysis algorithms;
+for example, calculating expected score statistics under simple null
+models.
+
+% ``essentially'' qualifier below, because our RNG is limited to 2^31 states,
+% and that limits the number of distinct permutations we can sample.
+
+When shuffling sequences, it is desirable to sample uniformly among
+possible permutations. Many shuffling algorithms (even some published
+ones \citep{Fitch83}) are not correct in this sense. Easel's
+monoresidue sequence shuffling implements the so-called Fisher/Yates
+algorithm (Knuth's ``Algorithm P'') \citep{Durstenfeld64,Knu-81a}. A
+nontrivial additional power of the module is the ability to shuffle
+sequences while preserving exact diresidue composition; the
+\ccode{esl\_rsq\_CShuffleDP()} and \ccode{esl\_rsq\_XShuffleDP()}
+routines implement the Altschul/Erickson method
+\citep{AltschulErickson86}. \footnote{A more efficient method than
+Altschul/Erickson is known \citep{KandelWinkler96,Coward99} but it has
+not yet been implemented for Easel.}
+
+The routines in the module are listed in
+Table~\ref{tbl:randomseq_api}.
+
+The base routines work on any alphabetic text string. Augmentation
+with the \eslmod{alphabet} module adds routines for shuffling
+digitized sequences.
+
+
+% Table generated by autodoc -t esl_randomseq.c (so don't edit here, edit esl_randomseq.c:)
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\apisubhead{Generating iid sequences.}\\
+\hyperlink{func:esl_rsq_IID()}{\ccode{esl\_rsq\_IID()}} & Generate an iid random text sequence.\\
+\apisubhead{Shuffling sequences.}\\
+\hyperlink{func:esl_rsq_CShuffle()}{\ccode{esl\_rsq\_CShuffle()}} & Shuffle a text sequence.\\
+\hyperlink{func:esl_rsq_CShuffleDP()}{\ccode{esl\_rsq\_CShuffleDP()}} & Shuffle a text sequence, preserving diresidue composition.\\
+\hyperlink{func:esl_rsq_CReverse()}{\ccode{esl\_rsq\_CReverse()}} & Reverse a string.\\
+\hyperlink{func:esl_rsq_CShuffleWindows()}{\ccode{esl\_rsq\_CShuffleWindows()}} & Shuffle local windows of a text string.\\
+\apisubhead{Randomizing sequences}\\
+\hyperlink{func:esl_rsq_CMarkov0()}{\ccode{esl\_rsq\_CMarkov0()}} & Generate new text string of same 0th order Markov properties.\\
+\hyperlink{func:esl_rsq_CMarkov1()}{\ccode{esl\_rsq\_CMarkov1()}} & Generate new text string of same 1st order Markov properties.\\
+\hyperlink{func:esl_rsq_xIID()}{\ccode{esl\_rsq\_xIID()}} & Generate an iid random digital sequence.\\
+\apisubhead{Shuffling sequences (digital mode)}\\
+\hyperlink{func:esl_rsq_XShuffle()}{\ccode{esl\_rsq\_XShuffle()}} & Shuffle a digital sequence.\\
+\hyperlink{func:esl_rsq_XShuffleDP()}{\ccode{esl\_rsq\_XShuffleDP()}} & Shuffle a digital sequence, preserving diresidue composition.\\
+\hyperlink{func:esl_rsq_XReverse()}{\ccode{esl\_rsq\_XReverse()}} & Reverse a digital sequence.\\
+\hyperlink{func:esl_rsq_XShuffleWindows()}{\ccode{esl\_rsq\_XShuffleWindows()}} & Shuffle local windows of a digital sequence.\\
+\apisubhead{Randomizing sequences (digital mode)}\\
+\hyperlink{func:esl_rsq_XMarkov0()}{\ccode{esl\_rsq\_XMarkov0()}} & Generate new digital sequence of same 0th order Markov properties.\\
+\hyperlink{func:esl_rsq_XMarkov1()}{\ccode{esl\_rsq\_XMarkov1()}} & Generate new digital sequence of same 1st order Markov properties.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{randomseq} API.}
+\label{tbl:randomseq_api}
+\end{table}
+
+
+\subsection{Example of using randomseq}
+
+Here's an example:
+
+\input{cexcerpts/randomseq_example}
+
+
+
diff --git a/esl_ratematrix.c b/esl_ratematrix.c
new file mode 100644
index 0000000..8c47651
--- /dev/null
+++ b/esl_ratematrix.c
@@ -0,0 +1,822 @@
+/* Routines for manipulating evolutionary rate matrices.
+ *
+ * There is no specific object for this module. Rate matrix
+ * operations use square nxn ESL_DMATRIX data objects. (The rmx
+ * module essentially subclasses the dmx module.)
+ *
+ * An instantaneous rate matrix is usually denoted by Q. A
+ * conditional probability matrix (for a specific t) is usually
+ * denoted by P. An exchangeability matrix is denoted by E.
+ * A stationary residue probability vector is denoted by pi.
+ *
+ * Two important relations among these:
+ *
+ * Q in terms of E and pi:
+ * $Q_{ij} = E_{ij} \pi_j$ for $i \neq j$;
+ * $Q_{ii} = -\sum_{j \neq i} Q_{ij}$
+ *
+ * P in terms of Q and t:
+ * $P = e^{tQ}$
+ *
+ * Contents:
+ * 1. Setting standard rate matrix models.
+ * 2. Debugging routines for validating or dumping rate matrices.
+ * 3. Other routines in the exposed ratematrix API.
+ * 4. Benchmark driver.
+ * 5. Regression test driver.
+ * 6. Unit tests.
+ * 7. Test driver.
+ * 8. Example.
+ * 9. Copyright/license information.
+ *
+ *
+ *
+ * See also:
+ * paml - i/o of rate matrices from/to data files in PAML format
+ *
+ */
+#include "esl_config.h"
+
+#include <math.h>
+
+#include "easel.h"
+#include "esl_composition.h"
+#include "esl_dmatrix.h"
+#include "esl_vectorops.h"
+#include "esl_ratematrix.h"
+
+
+/*****************************************************************
+ * 1. Setting standard rate matrix models.
+ *****************************************************************/
+
+/* Function: esl_rmx_SetWAG()
+ * Incept: SRE, Thu Mar 8 18:00:00 2007 [Janelia]
+ *
+ * Purpose: Sets a $20 \times 20$ rate matrix <Q> to WAG parameters.
+ * The caller allocated <Q>.
+ *
+ * If <pi> is non-<NULL>, it provides a vector of 20 amino
+ * acid stationary probabilities in Easel alphabetic order,
+ * A..Y, and the WAG stationary probabilities are set to
+ * these desired $\pi_i$. If <pi> is <NULL>, the default
+ * WAG stationary probabilities are used.
+ *
+ * The WAG parameters are a maximum likelihood
+ * parameterization obtained by Whelan and Goldman
+ * \citep{WhelanGoldman01}.
+ *
+ * Note: The data table was reformatted from wag.dat by the UTILITY1
+ * executable in the paml module. The wag.dat file was obtained from
+ * \url{http://www.ebi.ac.uk/goldman/WAG/wag.dat}. A copy
+ * is in formats/wag.dat.
+ *
+ * Args: Q - a 20x20 rate matrix to set, allocated by caller.
+ * pi - desired stationary probabilities A..Y, or
+ * NULL to use WAG defaults.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <Q> isn't a 20x20 general matrix; and
+ * the state of <Q> is undefined.
+ */
+int
+esl_rmx_SetWAG(ESL_DMATRIX *Q, double *pi)
+{
+ static double wagE[190] = {
+ 1.027040, 0.738998, 0.030295, 1.582850, 0.021352, 6.174160, 0.210494, 0.398020, 0.046730, 0.081134,
+ 1.416720, 0.306674, 0.865584, 0.567717, 0.049931, 0.316954, 0.248972, 0.930676, 0.570025, 0.679371,
+ 0.249410, 0.193335, 0.170135, 0.039437, 0.127395, 1.059470, 0.030450, 0.138190, 0.906265, 0.074034,
+ 0.479855, 2.584430, 0.088836, 0.373558, 0.890432, 0.323832, 0.397915, 0.384287, 0.084805, 0.154263,
+ 2.115170, 0.061304, 0.499462, 3.170970, 0.257555, 0.893496, 0.390482, 0.103754, 0.315124, 1.190630,
+ 0.174100, 0.404141, 4.257460, 0.934276, 4.854020, 0.509848, 0.265256, 5.429420, 0.947198, 0.096162,
+ 1.125560, 3.956290, 0.554236, 3.012010, 0.131528, 0.198221, 1.438550, 0.109404, 0.423984, 0.682355,
+ 0.161444, 0.243570, 0.696198, 0.099929, 0.556896, 0.415844, 0.171329, 0.195081, 0.908598, 0.098818,
+ 0.616783, 5.469470, 0.099921, 0.330052, 4.294110, 0.113917, 3.894900, 0.869489, 1.545260, 1.543640,
+ 0.933372, 0.551571, 0.528191, 0.147304, 0.439157, 0.102711, 0.584665, 2.137150, 0.186979, 5.351420,
+ 0.497671, 0.683162, 0.635346, 0.679489, 3.035500, 3.370790, 1.407660, 1.071760, 0.704939, 0.545931,
+ 1.341820, 0.740169, 0.319440, 0.967130, 0.344739, 0.493905, 3.974230, 1.613280, 1.028870, 1.224190,
+ 2.121110, 0.512984, 0.374866, 0.822765, 0.171903, 0.225833, 0.473307, 1.458160, 1.386980, 0.326622,
+ 1.516120, 2.030060, 0.795384, 0.857928, 0.554413, 4.378020, 2.006010, 1.002140, 0.152335, 0.588731,
+ 0.649892, 0.187247, 0.118358, 7.821300, 0.305434, 1.800340, 2.058450, 0.196246, 0.314887, 0.301281,
+ 0.251849, 0.232739, 1.388230, 0.113133, 0.717070, 0.129767, 0.156557, 1.529640, 0.336983, 0.262569,
+ 0.212483, 0.137505, 0.665309, 0.515706, 0.071917, 0.139405, 0.215737, 1.163920, 0.523742, 0.110864,
+ 0.365369, 0.240735, 0.543833, 0.325711, 0.196303, 6.454280, 0.103604, 3.873440, 0.420170, 0.133264,
+ 0.398618, 0.428437, 1.086000, 0.216046, 0.227710, 0.381533, 0.786993, 0.291148, 0.314730, 2.485390};
+ static double wagpi[20];
+ int i,j,z;
+
+ if (Q->m != 20 || Q->n != 20 || Q->type != eslGENERAL)
+ ESL_EXCEPTION(eslEINVAL, "Q must be a 20x20 general matrix");
+ esl_composition_WAG(wagpi);
+
+ /* 1. Transfer the wag E lower triagonal matrix directly into Q. */
+ z = 0;
+ for (i = 0; i < 20; i++)
+ {
+ Q->mx[i][i] = 0.; /* code below depends on this zero initialization */
+ for (j = 0; j < i; j++) {
+ Q->mx[i][j] = wagE[z++];
+ Q->mx[j][i] = Q->mx[i][j];
+ }
+ }
+
+ /* 2. Set offdiagonals Q_ij = E_ij * pi_j */
+ for (i = 0; i < 20; i++)
+ for (j = 0; j < 20; j++)
+ if (pi != NULL) Q->mx[i][j] *= pi[j];
+ else Q->mx[i][j] *= wagpi[j];
+
+ /* 3. Set diagonal Q_ii to -\sum_{i \neq j} Q_ij */
+ for (i = 0; i < 20; i++)
+ Q->mx[i][i] = -1. * esl_vec_DSum(Q->mx[i], 20);
+
+ /* 4. Renormalize matrix to units of 1 substitution/site. */
+ if (pi != NULL) esl_rmx_ScaleTo(Q, pi, 1.0);
+ else esl_rmx_ScaleTo(Q, wagpi, 1.0);
+
+ return eslOK;
+}
+
+
+/* Function: esl_rmx_SetJukesCantor()
+ * Incept: SRE, Thu Mar 15 13:04:56 2007 [Janelia]
+ *
+ * Purpose: Sets a 4x4 rate matrix to a Jukes-Cantor model,
+ * scaled to units of 1t = 1.0 substitutions/site.
+ *
+ * Note: eigenvalues of Q are 0, -4\alpha, -4\alpha, -4\alpha
+ */
+int
+esl_rmx_SetJukesCantor(ESL_DMATRIX *Q)
+{
+ int i,j;
+ double pi[4] = { 0.25, 0.25, 0.25, 0.25 };
+
+ if (Q->m != 4 || Q->n != 4 || Q->type != eslGENERAL)
+ ESL_EXCEPTION(eslEINVAL, "Q must be a 4x4 general matrix");
+
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 4; j++)
+ {
+ if (i != j) Q->mx[i][j] = 1.0;
+ else Q->mx[i][j] = 0.0;
+ }
+ Q->mx[i][i] = -1. * esl_vec_DSum(Q->mx[i], 4);
+ }
+ esl_rmx_ScaleTo(Q, pi, 1.0);
+ return eslOK;
+}
+
+
+/* Function: esl_rmx_SetKimura()
+ * Incept: SRE, Thu Mar 15 13:08:08 2007 [Janelia]
+ *
+ * Purpose: Sets a 4x4 rate matrix to a Kimura 2-parameter
+ * model, given transition and transversion
+ * relative rates <alpha> and <beta>, respectively,
+ * scaled to units of 1t = 1.0 substitutions/site.
+ *
+ * Note: eigenvalues of Q are 0, -4\alpha, -2(\alpha+\beta), -2(\alpha+\beta)
+ */
+int
+esl_rmx_SetKimura(ESL_DMATRIX *Q, double alpha, double beta)
+{
+ int i,j;
+ double pi[4] = { 0.25, 0.25, 0.25, 0.25 };
+
+ if (Q->m != 4 || Q->n != 4 || Q->type != eslGENERAL)
+ ESL_EXCEPTION(eslEINVAL, "Q must be a 4x4 general matrix");
+
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 4; j++)
+ {
+ if (i != j) Q->mx[i][j] = ((i+j)%2)? beta : alpha; /* even=0=transition;odd=1=transversion */
+ else Q->mx[i][j] = 0.0;
+ }
+ Q->mx[i][i] = -1. * esl_vec_DSum(Q->mx[i], 4);
+ }
+ esl_rmx_ScaleTo(Q, pi, 1.0);
+ return eslOK;
+}
+
+
+
+/* Function: esl_rmx_SetF81()
+ * Incept: SRE, Thu Mar 15 13:33:30 2007 [Janelia]
+ *
+ * Purpose: Sets a 4x4 rate matrix to the F81 model (aka
+ * equal-input model) given stationary base
+ * compositions <pi>,
+ * scaled to units of 1t = 1.0 substitutions/site.
+ */
+int
+esl_rmx_SetF81(ESL_DMATRIX *Q, double *pi)
+{
+ int i,j;
+
+ if (Q->m != 4 || Q->n != 4 || Q->type != eslGENERAL)
+ ESL_EXCEPTION(eslEINVAL, "Q must be a 4x4 general matrix");
+
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 4; j++)
+ {
+ if (i != j) Q->mx[i][j] = pi[j];
+ else Q->mx[i][j] = 0.0;
+ }
+ Q->mx[i][i] = -1. * esl_vec_DSum(Q->mx[i], 4);
+ }
+ esl_rmx_ScaleTo(Q, pi, 1.0);
+ return eslOK;
+}
+
+
+/* Function: esl_rmx_SetHKY()
+ * Incept: SRE, Thu Aug 12 08:26:39 2004 [St. Louis]
+ *
+ * Purpose: Given stationary base composition <pi> for ACGT, and
+ * transition and transversion relative rates <alpha> and
+ * <beta> respectively, sets the matrix <Q> to be the
+ * corresponding HKY (Hasegawa/Kishino/Yano) DNA rate
+ * matrix, scaled in units of 1t= 1.0 substitutions/site
+ * \citep{Hasegawa85}.
+ *
+ * Args: pi - stationary base composition A..T
+ * alpha - relative transition rate
+ * beta - relative transversion rate
+ *
+ *
+ * Returns: <eslOK>
+ *
+ * Xref:
+ */
+int
+esl_rmx_SetHKY( ESL_DMATRIX *Q, double *pi, double alpha, double beta)
+{
+ int i,j;
+
+ if (Q->m != 4 || Q->n != 4 || Q->type != eslGENERAL)
+ ESL_EXCEPTION(eslEINVAL, "Q must be a 4x4 general matrix");
+
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 4; j++)
+ {
+ if (i != j) Q->mx[i][j] = ((i+j)%2)? pi[j]*beta : pi[j]*alpha; /* even=0=transition;odd=1=transversion */
+ else Q->mx[i][j] = 0.;
+ }
+ Q->mx[i][i] = -1. * esl_vec_DSum(Q->mx[i], 4);
+ }
+ esl_rmx_ScaleTo(Q, pi, 1.0);
+ return eslOK;
+}
+
+/*****************************************************************
+ * 2. Debugging routines for validating or dumping rate matrices.
+ *****************************************************************/
+
+/* Function: esl_rmx_ValidateP()
+ * Incept: SRE, Sun Mar 11 10:30:50 2007 [Janelia]
+ *
+ * Purpose: Validates a conditional probability matrix <P>, whose
+ * elements $P_{ij}$ represent conditional probabilities
+ * $P(j \mid i)$; for example in a first-order Markov
+ * chain, or a continuous-time Markov transition process
+ * where <P> is for a particular $t$.
+ *
+ * Rows must sum to one, and each element $P_{ij}$ is a
+ * probability $0 \leq P_{ij} \leq 1$.
+ *
+ * <tol> specifies the floating-point tolerance to which
+ * the row sums must equal one: <fabs(sum-1.0) <= tol>.
+ *
+ * <errbuf> is an optional error message buffer. The caller
+ * may pass <NULL> or a pointer to a buffer of at least
+ * <eslERRBUFSIZE> characters.
+ *
+ * Args: P - matrix to validate
+ * tol - floating-point tolerance (0.00001, for example)
+ * errbuf - OPTIONAL: ptr to an error buffer of at least
+ * <eslERRBUFSIZE> characters.
+ *
+ * Returns: <eslOK> on successful validation.
+ * <eslFAIL> on failure, and if a non-<NULL> <errbuf> was
+ * provided by the caller, a message describing
+ * the reason for the failure is put there.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_rmx_ValidateP(ESL_DMATRIX *P, double tol, char *errbuf)
+{
+ int i,j;
+ double sum;
+
+ if (P->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "P must be type eslGENERAL to be validated");
+
+ for (i = 0; i < P->n; i++)
+ {
+ sum = esl_vec_DSum(P->mx[i], P->m);
+ if (fabs(sum-1.0) > tol) ESL_FAIL(eslFAIL, errbuf, "row %d does not sum to 1.0", i);
+
+ for (j = 0; j < P->m; j++)
+ if (P->mx[i][j] < 0.0 || P->mx[i][j] > 1.0)
+ ESL_FAIL(eslFAIL, errbuf, "element %d,%d is not a probability (%f)", i,j,P->mx[i][j]);
+ }
+ return eslOK;
+}
+
+/* Function: esl_rmx_ValidateQ()
+ * Incept: SRE, Sun Mar 11 10:30:50 2007 [Janelia]
+ *
+ * Purpose: Validates an instantaneous rate matrix <Q> for a
+ * continuous-time Markov process, whose elements $q_{ij}$
+ * represent instantaneous transition rates $i \rightarrow
+ * j$.
+ *
+ * Rows satisfy the condition that
+ * $q_{ii} = -\sum_{i \neq j} q_{ij}$, and also
+ * that $q_{ij} \geq 0$ for all $j \neq i$.
+ *
+ * <tol> specifies the floating-point tolerance to which
+ * that condition must hold: <fabs(sum-q_ii) <= tol>.
+ *
+ * <errbuf> is an optional error message buffer. The caller
+ * may pass <NULL> or a pointer to a buffer of at least
+ * <eslERRBUFSIZE> characters.
+ *
+ * Args: Q - rate matrix to validate
+ * tol - floating-point tolerance (0.00001, for example)
+ * errbuf - OPTIONAL: ptr to an error buffer of at least
+ * <eslERRBUFSIZE> characters.
+ *
+ * Returns: <eslOK> on successful validation.
+ * <eslFAIL> on failure, and if a non-<NULL> <errbuf> was
+ * provided by the caller, a message describing
+ * the reason for the failure is put there.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_rmx_ValidateQ(ESL_DMATRIX *Q, double tol, char *errbuf)
+{
+ int i,j;
+ double qi;
+
+ if (Q->type != eslGENERAL) ESL_EXCEPTION(eslEINVAL, "Q must be type eslGENERAL to be validated");
+ if (Q->n != Q->m) ESL_EXCEPTION(eslEINVAL, "a rate matrix Q must be square");
+
+ for (i = 0; i < Q->n; i++)
+ {
+ qi = 0.;
+ for (j = 0; j < Q->m; j++)
+ {
+ if (i != j) {
+ if (Q->mx[i][j] < 0.) ESL_FAIL(eslFAIL, errbuf, "offdiag elem %d,%d < 0",i,j);
+ qi += Q->mx[i][j];
+ } else {
+ if (Q->mx[i][j] > 0.) ESL_FAIL(eslFAIL, errbuf, "diag elem %d,%d < 0", i,j);
+ }
+ }
+ if (fabs(qi + Q->mx[i][i]) > tol) ESL_FAIL(eslFAIL, errbuf, "row %d does not sum to 0.0", i);
+ }
+ return eslOK;
+}
+
+
+
+/*****************************************************************
+ * 3. Other routines in the exposed ratematrix API.
+ *****************************************************************/
+
+/* Function: esl_rmx_ScaleTo()
+ * Incept: SRE, Tue Jul 13 16:05:16 2004 [St. Louis]
+ *
+ * Purpose: Rescales rate matrix <Q> so that expected substitution
+ * rate per dt is <unit>.
+ *
+ * Expected substitution rate is:
+ * $\sum_i \sum_j pi_i Q_ij \forall i \neq j$
+ *
+ * <unit> typically taken to be 1.0, so time units are substitutions/site.
+ * An exception is PAM, where <unit> = 0.01 for 1 PAM unit.
+ *
+ * Args: Q - rate matrix to normalize
+ * pi - stationary residue frequencies
+ * unit - expected subsitution rate per dt
+ * (1.0 = substitutions/site; 0.01 = PAMs)
+ *
+ * Returns: <eslOK> on success, and matrix Q is rescaled.
+ *
+ * Xref: STL8/p56.
+ */
+int
+esl_rmx_ScaleTo(ESL_DMATRIX *Q, double *pi, double unit)
+{
+ int i,j;
+ double sum = 0.;
+
+ if (Q->m != Q->n || Q->type != eslGENERAL)
+ ESL_EXCEPTION(eslEINVAL, "Q must be a square general matrix");
+
+ for (i = 0; i < Q->m; i++)
+ for (j = 0; j < Q->n; j++)
+ if (i != j) sum += pi[i] * Q->mx[i][j];
+
+ for (i = 0; i < Q->m; i++)
+ for (j = 0; j < Q->n; j++)
+ Q->mx[i][j] *= (unit / sum);
+
+ return eslOK;
+}
+
+
+
+/* Function: esl_rmx_E2Q()
+ * Incept: SRE, Tue Jul 13 15:52:41 2004 [St. Louis]
+ *
+ * Purpose: Given a lower triangular matrix ($j<i$) of
+ * residue exchangeabilities <E>, and a stationary residue
+ * frequency vector <pi>; assuming $E_{ij} = E_{ji}$;
+ * calculates a rate matrix <Q> as
+ *
+ * $Q_{ij} = E_{ij} * \pi_j$
+ *
+ * The resulting <Q> is not normalized to any particular
+ * number of substitutions/site/time unit. See
+ * <esl_rmx_ScaleTo()> for that.
+ *
+ * Args: E - symmetric residue "exchangeabilities";
+ * only lower triangular entries are used.
+ * pi - residue frequencies at stationarity.
+ * Q - RETURN: rate matrix, square (NxN).
+ * Caller allocates the memory for this.
+ *
+ * Returns: <eslOK> on success; Q is calculated and filled in.
+ *
+ * Xref: STL8/p56.
+ */
+int
+esl_rmx_E2Q(ESL_DMATRIX *E, double *pi, ESL_DMATRIX *Q)
+{
+ int i,j;
+
+ if (E->n != Q->n) ESL_EXCEPTION(eslEINVAL, "E and Q sizes differ");
+
+ /* Scale all off-diagonals to pi[j] * E[i][j].
+ */
+ for (i = 0; i < E->n; i++)
+ for (j = 0; j < i; j++) /* only look at lower triangle of E. */
+ {
+ Q->mx[i][j] = pi[j] * E->mx[i][j];
+ Q->mx[j][i] = pi[i] * E->mx[i][j];
+ }
+
+ /* Set diagonal to -\sum of all j != i.
+ */
+ for (i = 0; i < Q->n; i++)
+ {
+ Q->mx[i][i] = 0.; /* makes the vector sum work for j != i */
+ Q->mx[i][i] = -1. * esl_vec_DSum(Q->mx[i], Q->n);
+ }
+ return eslOK;
+}
+
+
+/* Function: esl_rmx_RelativeEntropy()
+ * Incept: SRE, Fri Mar 23 09:18:26 2007 [Janelia]
+ *
+ * Purpose: Given a conditional substitution probability matrix <P>,
+ * with stationary probabilities <pi>, calculate its
+ * relative entropy $H$:
+ *
+ * $H_t = \sum_{ij} P(j \mid i,t) \pi_i \log_2 \frac{P(j \mid i,t)} {\pi_j}$
+ *
+ * This assumes that the stationary probabilities are the
+ * same as the background (null model) probabilities.
+ *
+ * Returns: the relative entropy, $H$, in bits
+ */
+double
+esl_rmx_RelativeEntropy(ESL_DMATRIX *P, double *pi)
+{
+ double H = 0.;
+ int i,j;
+
+ for (i = 0; i < P->m; i++)
+ for (j = 0; j < P->n; j++)
+ H += P->mx[i][j] * pi[i] * log(P->mx[i][j] / pi[j]);
+ return H / eslCONST_LOG2;
+}
+
+/* Function: esl_rmx_ExpectedScore()
+ * Incept: SRE, Fri Mar 23 09:32:05 2007 [Janelia]
+ *
+ * Purpose: Given a conditional substitution probability matrix <P>
+ * with stationary probabilities <pi>, calculate its
+ * expected score:
+ *
+ * $ = \sum_{ij} \pi_j \pi_i \log_2 \frac{P(j \mid i,t)} {\pi_j}$
+ *
+ * This assumes that the stationary probabilities are the
+ * same as the background (null model) probabilities.
+ *
+ * Returns: the expected score, in bits
+ */
+double
+esl_rmx_ExpectedScore(ESL_DMATRIX *P, double *pi)
+{
+ double S = 0.;
+ int i,j;
+
+ for (i = 0; i < P->m; i++)
+ for (j = 0; j < P->n; j++)
+ S += pi[j] * pi[i] * log(P->mx[i][j] / pi[j]);
+ return S / eslCONST_LOG2;
+}
+
+
+
+
+/*****************************************************************
+ * 4. Benchmark driver
+ *****************************************************************/
+
+#ifdef eslRATEMATRIX_BENCHMARK
+
+/*
+ without GSL:
+ gcc -O2 -I. -L. -o benchmark -DeslRATEMATRIX_BENCHMARK esl_ratematrix.c -leasel -lm
+
+ with GSL:
+ gcc -g -Wall -I. -L. -o benchmark -DeslRATEMATRIX_BENCHMARK -DHAVE_LIBGSL esl_dmatrix.c esl_ratematrix.c -leasel -lgsl -lgslcblas -lm
+ */
+
+#include <esl_config.h>
+
+#ifdef HAVE_LIBGSL
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_linalg.h>
+#endif
+
+#include "easel.h"
+#include "esl_stopwatch.h"
+#include "esl_dmatrix.h"
+#include "esl_ratematrix.h"
+
+int
+main(void)
+{
+ ESL_STOPWATCH *w = NULL;
+ ESL_DMATRIX *Q = NULL;
+ ESL_DMATRIX *P = NULL;
+ double t = 5.0;
+ int esl_iterations = 100;
+ int i;
+#ifdef HAVE_LIBGSL
+ gsl_matrix *Qg = NULL;
+ gsl_matrix *Pg = NULL;
+ int gsl_iterations = 100;
+#endif
+
+ w = esl_stopwatch_Create();
+ Q = esl_dmatrix_Create(20, 20);
+ P = esl_dmatrix_Create(20, 20);
+ esl_rmx_SetWAG(Q, NULL);
+
+ esl_stopwatch_Start(w);
+ for (i = 0; i < esl_iterations; i++)
+ esl_dmx_Exp(Q, t, P);
+ esl_stopwatch_Stop(w);
+ printf("Easel takes: %g sec\n", w->user / (double) esl_iterations);
+
+#ifdef HAVE_LIBGSL
+ if (esl_dmx_MorphGSL(Q, &Qg) != eslOK) esl_fatal("morph to gsl_matrix failed");
+ if ((Pg = gsl_matrix_alloc(20, 20)) == NULL) esl_fatal("gsl alloc failed");
+ gsl_matrix_scale(Qg, t);
+
+ esl_stopwatch_Start(w);
+ for (i = 0; i < gsl_iterations; i++)
+ gsl_linalg_exponential_ss(Qg, Pg, GSL_PREC_DOUBLE);
+ esl_stopwatch_Stop(w);
+ printf(" GSL takes: %g sec\n", w->user / (double) gsl_iterations);
+
+ gsl_matrix_free(Qg);
+ gsl_matrix_free(Pg);
+#endif /*HAVE_LIBGSL*/
+
+ esl_dmatrix_Destroy(Q);
+ esl_dmatrix_Destroy(P);
+ esl_stopwatch_Destroy(w);
+ return 0;
+}
+
+#endif /*eslRATEMATRIX_BENCHMARK*/
+
+
+/*****************************************************************
+ * 5. Regression test driver
+ *****************************************************************/
+#ifdef eslRATEMATRIX_REGRESSION
+#ifdef HAVE_LIBGSL
+
+/* This tests rate matrix exponentiation against the GSL's
+ * undocumented implementation of a matrix exponential.
+ */
+/*
+ gcc -g -Wall -I. -L. -o ratematrix_regression -DeslRATEMATRIX_REGRESSION -DHAVE_LIBGSL esl_dmatrix.c esl_ratematrix.c -leasel -lgsl -lgslcblas -lm
+ */
+
+#include "esl_config.h"
+
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_linalg.h>
+
+#include "easel.h"
+#include "esl_dmatrix.h"
+#include "esl_ratematrix.h"
+
+int
+main(void)
+{
+ char errbuf[eslERRBUFSIZE];
+ char *alphabet = "ACDEFGHIKLMNPQRSTVWY";
+ ESL_DMATRIX *Q = NULL;
+ ESL_DMATRIX *P = NULL;
+ gsl_matrix *Qg = NULL;
+ gsl_matrix *Pg = NULL;
+ ESL_DMATRIX *Pge = NULL;
+ double t = 15.0;
+
+ if ((Q = esl_dmatrix_Create(20, 20)) == NULL) esl_fatal("malloc failed");
+ if ((P = esl_dmatrix_Create(20, 20)) == NULL) esl_fatal("malloc failed");
+
+ if (esl_rmx_SetWAG(Q, NULL) != eslOK) esl_fatal("_SetWAG() failed");
+ if (esl_rmx_ValidateQ(Q, 0.0001, errbuf) != eslOK) esl_fatal("Q validation failed: %s", errbuf);
+
+ if (esl_dmx_Exp(Q, t, P) != eslOK) esl_fatal("matrix exponentiation failed");
+ if (esl_rmx_ValidateP(P, 0.0001, errbuf) != eslOK) esl_fatal("P validation failed: %s", errbuf);
+
+ if (esl_dmx_MorphGSL(Q, &Qg) != eslOK) esl_fatal("morph to gsl_matrix failed");
+ if ((Pg = gsl_matrix_alloc(20, 20)) == NULL) esl_fatal("gsl alloc failed");
+ gsl_matrix_scale(Qg, t);
+ if (gsl_linalg_exponential_ss(Qg, Pg, GSL_PREC_DOUBLE) != 0) esl_fatal("gsl's exponentiation failed");
+ if (esl_dmx_UnmorphGSL(Pg, &Pge) != eslOK) esl_fatal("morph from gsl_matrix failed");
+
+ esl_dmatrix_Dump(stdout, P, alphabet, alphabet);
+
+ if (esl_dmatrix_Compare(Pge, P, 0.00001) != eslOK) esl_fatal("whoops, different answers.");
+
+ esl_dmatrix_Destroy(Q);
+ esl_dmatrix_Destroy(P);
+ esl_dmatrix_Destroy(Pge);
+ gsl_matrix_free(Qg);
+ gsl_matrix_free(Pg);
+ return 0;
+}
+#else
+ /* if we don't have GSL, then compile in a dummy main(), solely
+ * to quiet any tests that are verifying that all drivers compile
+ * and run. */
+int main(void) { return 0; }
+#endif /*HAVE_LIBGSL*/
+
+#endif /*eslRATEMATRIX_REGRESSION*/
+
+
+/*****************************************************************
+ * 6. Unit tests.
+ *****************************************************************/
+#ifdef eslRATEMATRIX_TESTDRIVE
+
+static void
+utest_SetWAG(void)
+{
+ char errbuf[eslERRBUFSIZE];
+ ESL_DMATRIX *Q = NULL;
+ ESL_DMATRIX *P = NULL;
+ double t = 50.0; /* sufficiently large to drive e^tQ to stationarity */
+ double pi[20];
+ int i;
+
+ if ((Q = esl_dmatrix_Create(20, 20)) == NULL) esl_fatal("malloc failed");
+ if ((P = esl_dmatrix_Create(20, 20)) == NULL) esl_fatal("malloc failed");
+
+ /* This tests that exponentiating WAG gives a stable conditional
+ * probability matrix solution. (It doesn't particularly test that
+ * WAG was set correctly, but how could we have screwed that up?)
+ */
+ if (esl_rmx_SetWAG(Q, NULL) != eslOK) esl_fatal("_SetWAG() failed");
+ if (esl_dmx_Exp(Q, t, P) != eslOK) esl_fatal("matrix exponentiation failed");
+ if (esl_rmx_ValidateP(P, 1e-7, errbuf) != eslOK) esl_fatal("P validation failed: %s", errbuf);
+ if (esl_rmx_ValidateQ(Q, 1e-7, errbuf) != eslOK) esl_fatal("Q validation failed: %s", errbuf);
+
+ /* This tests setting WAG to different stationary pi's than default,
+ * then tests that exponentiating to large t reaches those stationaries.
+ */
+ esl_vec_DSet(pi, 20, 0.05);
+ if (esl_rmx_SetWAG(Q, pi) != eslOK) esl_fatal("_SetWAG() failed");
+ if (esl_dmx_Exp(Q, t, P) != eslOK) esl_fatal("matrix exponentiation failed");
+ if (esl_rmx_ValidateP(P, 1e-7, errbuf) != eslOK) esl_fatal("P validation failed: %s", errbuf);
+ if (esl_rmx_ValidateQ(Q, 1e-7, errbuf) != eslOK) esl_fatal("Q validation failed: %s", errbuf);
+ for (i = 0; i < 20; i++)
+ if (esl_vec_DCompare(P->mx[i], pi, 20, 1e-7) != eslOK) esl_fatal("P didn't converge to right pi's");
+
+ esl_dmatrix_Destroy(Q);
+ esl_dmatrix_Destroy(P);
+ return;
+}
+
+#ifdef HAVE_LIBLAPACK
+static void
+utest_Diagonalization(void)
+{
+ ESL_DMATRIX *P = NULL;
+ ESL_DMATRIX *P2 = NULL;
+ ESL_DMATRIX *C = NULL;
+ ESL_DMATRIX *D = NULL;
+ double *lambda = NULL; /* eigenvalues */
+ ESL_DMATRIX *U = NULL; /* left eigenvectors */
+ ESL_DMATRIX *Ui = NULL; /* inverse of U */
+ int i,j;
+
+ /* Create a J/C probability matrix for t=1:
+ * 1/4 + 3/4 e^{-4/3 at}
+ * 1/4 - 1/4 e^{-4/3 at}
+ */
+ if ((P = esl_dmatrix_Create(4, 4)) == NULL) esl_fatal("malloc failed");
+ if ((C = esl_dmatrix_Create(4, 4)) == NULL) esl_fatal("malloc failed");
+ if ((Ui = esl_dmatrix_Create(4, 4)) == NULL) esl_fatal("malloc failed");
+ if ((D = esl_dmatrix_Create(4, 4)) == NULL) esl_fatal("malloc failed");
+ if ((P2 = esl_dmatrix_Create(4, 4)) == NULL) esl_fatal("malloc failed");
+ for (i = 0; i < 4; i++)
+ for (j = 0; j < 4; j++)
+ if (i == j) P->mx[i][j] = 0.25 + 0.75 * exp(-4./3.);
+ else P->mx[i][j] = 0.25 - 0.25 * exp(-4./3.);
+
+ /* Diagonalize it
+ */
+ if (esl_dmx_Diagonalize(P, &lambda, NULL, &U, NULL) != eslOK) esl_fatal("diagonalization failed");
+
+ /* Calculate P^k by U [diag(lambda_i)]^k U^{-1}
+ */
+ esl_dmatrix_SetZero(D);
+ for (i = 0; i < P->n; i++) D->mx[i][i] = lambda[i];
+ esl_dmx_Invert(U, Ui);
+ esl_dmx_Multiply(U, D, C);
+ esl_dmx_Multiply(C, Ui, P2);
+
+ if (esl_dmatrix_Compare(P, P2, 1e-7) != eslOK) esl_fatal("diagonalization unit test failed");
+
+ free(lambda);
+ esl_dmatrix_Destroy(P2);
+ esl_dmatrix_Destroy(Ui);
+ esl_dmatrix_Destroy(U);
+ esl_dmatrix_Destroy(D);
+ esl_dmatrix_Destroy(C);
+ esl_dmatrix_Destroy(P);
+ return;
+}
+#endif /*HAVE_LIBLAPACK*/
+
+#endif /*eslRATEMATRIX_TESTDRIVE*/
+
+/*****************************************************************
+ * 7. Test driver
+ *****************************************************************/
+
+#ifdef eslRATEMATRIX_TESTDRIVE
+/* gcc -g -Wall -o test -I. -L. -DeslRATEMATRIX_TESTDRIVE esl_ratematrix.c -leasel -lm
+ * ./test
+ *
+ * gcc -g -Wall -o test -I. -L. -DHAVE_LIBLAPACK -DeslRATEMATRIX_TESTDRIVE esl_ratematrix.c esl_dmatrix.c -leasel -llapack -lm
+ */
+#include "esl_config.h"
+
+#include "easel.h"
+#include "esl_ratematrix.h"
+
+int
+main(void)
+{
+ utest_SetWAG();
+#ifdef HAVE_LIBLAPACK
+ utest_Diagonalization();
+#endif
+
+ return 0;
+
+}
+#endif /*eslRATEMATRIX_TESTDRIVE*/
+
+/*****************************************************************
+ * 8. Example driver
+ *****************************************************************/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_ratematrix.h b/esl_ratematrix.h
new file mode 100644
index 0000000..4fbb604
--- /dev/null
+++ b/esl_ratematrix.h
@@ -0,0 +1,31 @@
+/* Routines for manipulating evolutionary rate matrices.
+ *
+ * SRE, Tue Jul 13 16:09:05 2004 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslRATEMATRIX_INCLUDED
+#define eslRATEMATRIX_INCLUDED
+
+/* 1. Setting standard rate matrix models. */
+extern int esl_rmx_SetWAG(ESL_DMATRIX *Q, double *pi);
+extern int esl_rmx_SetJukesCantor(ESL_DMATRIX *Q);
+extern int esl_rmx_SetKimura(ESL_DMATRIX *Q, double alpha, double beta);
+extern int esl_rmx_SetF81(ESL_DMATRIX *Q, double *pi);
+extern int esl_rmx_SetHKY(ESL_DMATRIX *Q, double *pi, double alpha, double beta);
+
+/* 2. Debugging routines for validating or dumping rate matrices. */
+extern int esl_rmx_ValidateP(ESL_DMATRIX *P, double tol, char *errbuf);
+extern int esl_rmx_ValidateQ(ESL_DMATRIX *Q, double tol, char *errbuf);
+
+/* 3. Other routines in the exposed ratematrix API. */
+extern int esl_rmx_ScaleTo(ESL_DMATRIX *Q, double *pi, double unit);
+extern int esl_rmx_E2Q(ESL_DMATRIX *E, double *pi, ESL_DMATRIX *Q);
+extern double esl_rmx_RelativeEntropy(ESL_DMATRIX *P, double *pi);
+extern double esl_rmx_ExpectedScore (ESL_DMATRIX *P, double *pi);
+
+
+#endif /*eslRATEMATRIX_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_ratematrix.tex b/esl_ratematrix.tex
new file mode 100644
index 0000000..a603a6f
--- /dev/null
+++ b/esl_ratematrix.tex
@@ -0,0 +1,3 @@
+The \eslmod{ratematrix} module implements continuous-time Markov
+evolutionary models of residue subsitution.
+
diff --git a/esl_recorder.c b/esl_recorder.c
new file mode 100644
index 0000000..7a28fb9
--- /dev/null
+++ b/esl_recorder.c
@@ -0,0 +1,1141 @@
+/* Saving history in a line-based input stream
+ *
+ * Contents:
+ * 1. The <ESL_RECORDER> object
+ * 2. Using the <ESL_RECORDER>
+ * 3. Internal (static) functions
+ * 4. Benchmark driver
+ * 5. Unit tests
+ * 6. Test driver
+ * 7. Examples
+ * 8. Copyright and license
+ *
+ */
+#include "esl_config.h"
+
+#include <string.h>
+
+#include "easel.h"
+#include "esl_recorder.h"
+
+static void linearray_reverse(ESL_RECORDER *rc, int pos, int n);
+static int recorder_new_baseline(ESL_RECORDER *rc, int newbase);
+
+/*****************************************************************
+ * 1. The <ESL_RECORDER> object
+ *****************************************************************/
+
+/* Function: esl_recorder_Create()
+ * Synopsis: Create an <ESL_RECORDER>.
+ * Incept: SRE, Fri Dec 25 16:27:40 2009 [Casa de Gatos]
+ *
+ * Purpose: Allocate a new <ESL_RECORDER> that will read
+ * line-by-line from input stream <fp>, saving
+ * a history of up to <maxlines> lines.
+ *
+ * Returns: pointer to the new <ESL_RECORDER> on success.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_RECORDER *
+esl_recorder_Create(FILE *fp, int maxlines)
+{
+ ESL_RECORDER *rc = NULL;
+ int i;
+ int status;
+
+ ESL_ALLOC(rc, sizeof(ESL_RECORDER));
+ rc->fp = fp;
+ rc->line = NULL;
+ rc->nalloc = maxlines;
+ rc->lalloc = NULL;
+ rc->offset = NULL;
+ rc->nread = 0;
+ rc->ncurr = 0;
+ rc->baseline = 0;
+ rc->markline = -1;
+
+ ESL_ALLOC(rc->line, sizeof(char *) * rc->nalloc);
+ for (i = 0; i < rc->nalloc; i++) rc->line[i] = NULL;
+
+ ESL_ALLOC(rc->lalloc, sizeof(int) * rc->nalloc);
+ for (i = 0; i < rc->nalloc; i++) rc->lalloc[i] = 0;
+
+ ESL_ALLOC(rc->offset, sizeof(off_t) * rc->nalloc);
+ for (i = 0; i < rc->nalloc; i++) rc->offset[i] = 0;
+
+ return rc;
+
+ ERROR:
+ esl_recorder_Destroy(rc);
+ return NULL;
+}
+
+/* Function: esl_recorder_ResizeTo()
+ * Synopsis: Reallocate an <ESL_RECORDER> for a new <maxlines>
+ * Incept: SRE, Fri Dec 25 17:02:46 2009 [Casa de Gatos]
+ *
+ * Purpose: Reallocate the <ESL_RECORDER> <rc> to have a new
+ * window size <maxlines>.
+ *
+ * The new <maxlines> may be more or less than the previous
+ * window size for <rc>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> if (re-)allocation fails.
+ *
+ * <eslEINVAL> if the recorder has a marked line (for start
+ * of a block) and you try to shrink it so much that that
+ * marked line would be lost.
+ *
+ * <eslEINCONCEIVABLE> on any baseline resetting problem;
+ * this would have to be an internal error in the module.
+ *
+ * Note: We may have to repermute the line array, and reset its
+ * baseline, as follows.
+ *
+ * In the growth case: if the line array is out of order
+ * (circularly permuted) we must straighten it out, which
+ * means resetting the baseline.
+ * i.e. to grow 3 1 2 to nalloc=6, we need 1 2 3 x x x;
+ * simple reallocation to 3 1 2 x x x doesn't work,
+ * next read would make 3 4 2 x x x.
+ *
+ * In the shrinkage case: if the line array is in use beyond the
+ * new array size, we set a new baseline to keep as much of the
+ * old array as possible.
+ *
+ * i.e. for 6->3
+ * 1 2 3 x x x -> 1 2 3
+ * 1 2 3 4 x x -> 2 3 4 with new baseline=2.
+ * 4 5 0 1 2 3 -> 3 4 5 with new baseline=3
+ */
+int
+esl_recorder_ResizeTo(ESL_RECORDER *rc, int new_maxlines)
+{
+ int idx;
+ int newbase;
+ void *tmp;
+ int minlines;
+ int status;
+
+ if (new_maxlines == rc->nalloc) return eslOK;
+
+ if (new_maxlines > rc->nalloc) /* growth case */
+ {
+ if ((rc->nread - rc->baseline) / rc->nalloc != 0) /* array is permuted; reorder it */
+ {
+ newbase = ESL_MAX(rc->baseline, rc->nread - rc->nalloc);
+ status = recorder_new_baseline(rc, newbase);
+ if (status) ESL_EXCEPTION(eslEINCONCEIVABLE, "baseline reset failed unexpectedly");
+ }
+ }
+ else /* shrinkage case */
+ {
+ /* check that the marked line (if any) will stay in window */
+ if (rc->markline >= 0)
+ {
+ minlines = rc->nread - rc->markline;
+ if (new_maxlines < minlines)
+ ESL_EXCEPTION(eslEINVAL, "can't shrink that far without losing marked line");
+ }
+ /* check that current line will stay in window */
+ minlines = rc->nread - rc->ncurr + 1;
+ if (new_maxlines < minlines)
+ ESL_EXCEPTION(eslEINVAL, "can't shrink that far without losing current line");
+
+ if (rc->nread - rc->baseline > new_maxlines) /* baseline needs to move up */
+ {
+ newbase = rc->nread - new_maxlines;
+ status = recorder_new_baseline(rc, newbase);
+ if (status) ESL_EXCEPTION(eslEINCONCEIVABLE, "baseline reset failed unexpectedly");
+ }
+
+ for (idx = new_maxlines; idx < rc->nalloc; idx++)
+ if (rc->line[idx]) free(rc->line[idx]);
+ }
+
+ ESL_RALLOC(rc->line, tmp, sizeof(char *) * new_maxlines);
+ ESL_RALLOC(rc->lalloc, tmp, sizeof(int) * new_maxlines);
+ ESL_RALLOC(rc->offset, tmp, sizeof(off_t) * new_maxlines);
+ for (idx = rc->nalloc; idx < new_maxlines; idx++) /* no-op in shrinkage case */
+ {
+ rc->line[idx] = NULL;
+ rc->lalloc[idx] = 0;
+ rc->offset[idx] = 0;
+ }
+ rc->nalloc = new_maxlines;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_recorder_GetFirst()
+ * Synopsis: Returns the earliest linenumber stored.
+ * Incept: SRE, Sat Jan 2 13:18:38 2010 [Zaragoza]
+ *
+ * Purpose: Returns the earliest line number that is
+ * stored in the recorder <rc>.
+ */
+int
+esl_recorder_GetFirst(ESL_RECORDER *rc)
+{
+ return (ESL_MAX(rc->baseline, rc->nread-rc->nalloc));
+}
+
+/* Function: esl_recorder_GetLast()
+ * Synopsis: Returns the furthest linenumber stored.
+ * Incept: SRE, Sat Jan 2 13:19:45 2010 [Zaragoza]
+ *
+ * Purpose: Returns the furthest line number that is
+ * stored in the recorder <rc> -- the furthest
+ * we have read into the input stream so far.
+ * (This is not necessarily the current
+ * position in the stream, if we have repositioned.)
+ */
+int
+esl_recorder_GetLast(ESL_RECORDER *rc)
+{
+ return (rc->nread-1);
+}
+
+/* Function: esl_recorder_GetCurrent()
+ * Synopsis: Returns the current line number.
+ * Incept: SRE, Sat Jan 2 13:21:13 2010 [Zaragoza]
+ *
+ * Purpose: Returns the current line number -- the
+ * line number most recently returned by
+ * a call to <esl_recorder_Read()).
+ */
+int
+esl_recorder_GetCurrent(ESL_RECORDER *rc)
+{
+ return (rc->ncurr-1);
+}
+
+/* Function: esl_recorder_GetNext()
+ * Synopsis: Returns the next line number.
+ * Incept: SRE, Sat Jan 2 13:21:13 2010 [Zaragoza]
+ *
+ * Purpose: Returns the next line number that would
+ * be read by a call to <esl_recorder_Read()).
+ */
+int
+esl_recorder_GetNext(ESL_RECORDER *rc)
+{
+ return (rc->ncurr);
+}
+
+
+
+
+/* Function: esl_recorder_Destroy()
+ * Synopsis: Frees an <ESL_RECORDER>.
+ * Incept: SRE, Fri Dec 25 16:30:14 2009 [Casa de Gatos]
+ *
+ * Purpose: Frees the <ESL_RECORDER> <rc>.
+ *
+ * Returns: (void).
+ */
+void
+esl_recorder_Destroy(ESL_RECORDER *rc)
+{
+ int i;
+
+ if (rc == NULL) return;
+
+ if (rc->offset) free(rc->offset);
+ if (rc->lalloc) free(rc->lalloc);
+ if (rc->line) {
+ for (i = 0; i < rc->nalloc; i++)
+ if (rc->line[i]) free(rc->line[i]);
+ free(rc->line);
+ }
+ free(rc);
+ return;
+}
+/*--------------- end, <ESL_RECORDER> object --------------------*/
+
+
+
+
+/*****************************************************************
+ * 2. Using the <ESL_RECORDER>
+ *****************************************************************/
+
+/* Function: esl_recorder_Read()
+ * Synopsis: Read next line of a stream through an <ESL_RECORDER>.
+ * Incept: SRE, Fri Dec 25 16:31:00 2009 [Casa de Gatos]
+ *
+ * Purpose: Read the next line of the input stream that the
+ * <ESL_RECORDER> <rc> is recording. Return a ptr to
+ * it in <*opt_line>. Note that the <ESL_RECORDER>
+ * deals with allocation and freeing of this line;
+ * if caller wants to keep it for something, it must
+ * make a copy immediately, because subsequent calls
+ * to <esl_recorder_*> functions may overwrite these
+ * internal memory buffers.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEOF> if no more lines exist in the stream.
+ *
+ * Throws: <eslEMEM> on an allocation failure.
+ */
+int
+esl_recorder_Read(ESL_RECORDER *rc, char **opt_line)
+{
+ int idx = (rc->ncurr - rc->baseline) % rc->nalloc; /* index of line to read, in wrapped coords */
+ int status;
+
+ /* if currline <= lastline, we already have the line recorded;
+ * else we need to read a new one from <fp> */
+ if (rc->ncurr >= rc->nread)
+ {
+ /* if reading a new line would overwrite our marked start, grow */
+ if ( rc->markline >= 0 &&
+ ((rc->ncurr - rc->baseline) % rc->nalloc == ((rc->markline - rc->baseline) % rc->nalloc)))
+ {
+ int xtra = ESL_MAX(3, (rc->nalloc / 3));
+ status = esl_recorder_ResizeTo(rc, rc->nalloc + xtra);
+ if (status) goto ERROR;
+ idx = (rc->ncurr - rc->baseline) % rc->nalloc;
+ }
+
+ rc->offset[idx] = ftello(rc->fp);
+ status = esl_fgets(&(rc->line[idx]), &(rc->lalloc[idx]), rc->fp);
+ if (status) goto ERROR;
+ rc->nread++;
+ }
+
+ rc->ncurr++;
+ if (opt_line) *opt_line = rc->line[idx];
+ return eslOK;
+
+ ERROR:
+ if (opt_line) *opt_line = NULL;
+ return status;
+}
+
+
+/* Function: esl_recorder_Position()
+ * Synopsis: Reset the recorder to a new starting line position.
+ * Incept: SRE, Mon Dec 28 10:25:22 2009 [Casa de Gatos]
+ *
+ * Purpose: Reset the recorder <rc> to a new line position <linenumber>,
+ * starting from 0. The next call to <esl_recorder_Read()>
+ * will read this line.
+ *
+ * The <linenumber> can be ahead of the furthest line read
+ * by the recorder so far, in which case it calls
+ * <esl_recorder_Read()> until it reaches the proper
+ * position. This can result in a return code of <eslEOF>,
+ * if no such line exists in the stream.
+ *
+ * If the <linenumber> falls before (outside) the
+ * recorder's history window, an <eslEINVAL> exception is
+ * thrown.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEOF> if <linenumber> is larger than current position
+ * in file, and the stream ends before line <linenumber> is
+ * reached.
+ *
+ * Throws: <eslEMEM> on allocation failure; this can only happen
+ * if <linenumber> is larger than current position in
+ * file, forcing <esl_recorder_Read()> calls to reach that
+ * line.
+ */
+int
+esl_recorder_Position(ESL_RECORDER *rc, int linenumber)
+{
+ /* The recorder stores lines MAX(baseline,<nread-nalloc>)..<nread>-1 */
+ int line0 = ESL_MAX(rc->baseline, rc->nread - rc->nalloc);
+ int status;
+
+ if (linenumber < line0)
+ ESL_EXCEPTION(eslEINVAL, "recorder's window is past that line");
+
+ if (linenumber >= rc->nread) {
+ while (rc->nread < linenumber)
+ if ((status = esl_recorder_Read(rc, NULL)) != eslOK) return status;
+ }
+
+ rc->ncurr = linenumber;
+ return eslOK;
+}
+
+/* Function: esl_recorder_MarkBlock()
+ * Synopsis: Mark first line to be saved in a block.
+ * Incept: SRE, Fri Jan 1 11:13:53 2010 [Magallon]
+ *
+ * Purpose: Mark line number <markline> (0..N-1) in a file being read
+ * through the <ESL_RECORDER> <rc> as the first line in a
+ * block of lines to be parsed later, when the end of
+ * the block is found.
+ *
+ * This mark makes sure that the <ESL_RECORDER> will keep
+ * the entire block of lines in memory, starting at or
+ * before the mark. When a mark is active,
+ * <esl_recorder_Read()> will reallocate and grow the
+ * recorder as necessary, rather than overwriting the mark.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if the <markline> has already passed out
+ * of the recorder's memory.
+ */
+int
+esl_recorder_MarkBlock(ESL_RECORDER *rc, int markline)
+{
+ int line0 = ESL_MAX(rc->baseline, rc->nread - rc->nalloc);
+
+ if (markline < line0) ESL_EXCEPTION(eslEINVAL, "recorder window already passed marked line");
+ rc->markline = markline;
+ return eslOK;
+}
+
+
+/* Function: esl_recorder_UnmarkBlock()
+ * Synopsis: Remove a marked start of a block.
+ * Incept: SRE, Fri Jan 1 12:47:32 2010 [Magallon]
+ *
+ * Purpose: Release the mark in the <ESL_RECORDER> <rc>, if any.
+ *
+ * The recorder will no longer reallocate and grow to keep
+ * the marked line in memory.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_recorder_UnmarkBlock(ESL_RECORDER *rc)
+{
+ rc->markline = -1;
+ return eslOK;
+}
+
+
+/* Function: esl_recorder_GetBlock()
+ * Synopsis: Get a block of lines from a recorder, starting at the mark.
+ * Incept: SRE, Fri Jan 1 12:50:33 2010 [Magallon]
+ *
+ * Purpose: Get pointers into the internal memory arrays of the
+ * recorder <rc>, starting at the marked start of a block
+ * and ending at the most recently read line <rc->ncurr-1>,
+ * so you can parse a block of lines.
+ *
+ * Because these pointers are internally managed by the
+ * recorder <rc>, they should not be freed or reallocated
+ * or things like that. You should also avoid calling any
+ * <esl_recorder_*()> functions until you're done accessing
+ * these data, in case a function call alters the internal
+ * state of the object.
+ *
+ * If you do something that changes the contents of the
+ * lines (like strtok()'ing them), those changes will be
+ * preserved -- if you want to leave the original recorder
+ * data untouched and you need a temporary working copy of
+ * the data, you should make that copy yourself.
+ *
+ * Args: opt_lines : ptr to array of lines, indexed [0..*opt_nlines-1];
+ * starting with line <rc->markline> and ending with
+ * <rc->ncurr-1>, in order.
+ * opt_lalloc : array of memory allocations for each line
+ * opt_offset : array of offsets into input stream for start of each line
+ * opt_nlines : number of lines (minimally) valid in these arrays,
+ * starting from the mark and ending at the most recent
+ * line read.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_recorder_GetBlock(ESL_RECORDER *rc, char ***opt_lines, int **opt_lalloc, off_t **opt_offset, int *opt_nlines)
+{
+ int idx0, idx1;
+ int status;
+
+ /* Everything from the markline to ncurr-1 must be in order and not
+ * permuted. If it isn't in proper order, then reorder the recorder
+ * to have ncurr-1 in last array position.
+ */
+ idx0 = (rc->markline - rc->baseline) % rc->nalloc;
+ idx1 = (rc->ncurr-1 - rc->baseline) % rc->nalloc;
+ if (idx0 > idx1)
+ {
+ if ((status = recorder_new_baseline(rc, rc->ncurr-rc->nalloc)) != eslOK) goto ERROR;
+ idx0 = (rc->markline - rc->baseline) % rc->nalloc;
+ }
+
+ if (opt_lines) *opt_lines = rc->line + idx0;
+ if (opt_lalloc) *opt_lalloc = rc->lalloc + idx0;
+ if (opt_offset) *opt_offset = rc->offset + idx0;
+ if (opt_nlines) *opt_nlines = rc->ncurr - rc->markline;
+ return eslOK;
+
+ ERROR:
+ if (opt_lines) *opt_lines = NULL;
+ if (opt_lalloc) *opt_lalloc = NULL;
+ if (opt_offset) *opt_offset = NULL;
+ if (opt_nlines) *opt_nlines = 0;
+ return status;
+}
+/*----------------- end, using ESL_RECORDER ---------------------*/
+
+
+
+
+/*****************************************************************
+ * 3. Internal (static) functions
+ *****************************************************************/
+
+/* linearray_reverse()
+ * In-place O(N) reversal of a subsection of the line array data,
+ * starting at i=pos, for n positions.
+ */
+static void
+linearray_reverse(ESL_RECORDER *rc, int pos, int n)
+{
+ int i;
+ char *tmps;
+ int tmpi;
+ off_t tmpo;
+
+ /* the line array itself */
+ for (i = 0; i < n/2; i++)
+ {
+ tmps = rc->line[pos+n-i-1];
+ rc->line[pos+n-i-1] = rc->line[pos+i];
+ rc->line[pos+i] = tmps;
+ }
+
+ /* the line allocation array */
+ for (i = 0; i < n/2; i++)
+ {
+ tmpi = rc->lalloc[pos+n-i-1];
+ rc->lalloc[pos+n-i-1] = rc->lalloc[pos+i];
+ rc->lalloc[pos+i] = tmpi;
+ }
+
+ /* the offset array */
+ for (i = 0; i < n/2; i++)
+ {
+ tmpo = rc->offset[pos+n-i-1];
+ rc->offset[pos+n-i-1] = rc->offset[pos+i];
+ rc->offset[pos+i] = tmpo;
+ }
+}
+
+/* recorder_new_baseline()
+ * SRE, Fri Jan 1 09:00:55 2010 [Zaragoza]
+ *
+ * Set a ESL_RECORDER <rc> to a new baseline <newbase>, [0..N-1],
+ * greater than the previous baseline in the recorder.
+ *
+ * In general, must succeed, returning <eslOK>. If new baseline
+ * is <= old one, throws <eslEINVAL>, but you shouldn't do that.
+ *
+ * This is done in place in O(1) memory (no addiional or temporary
+ * allocation) and O(nalloc) time, using a trick: we can redo any
+ * circular permutation by no more than four in-place substring
+ * reversals:
+ *
+ * 456|123 -> 654|321 -> 65|4321 -> 56|1234
+ * (reversals) (new brkpt) (reversals)
+ *
+ * Some possible cases (all examples nalloc=7)
+ * 0 1 2 3 4 x x nread=5 [still filling the circle]
+ * 0 1 2 3 4 5 6 nread=7 [full, no wrapping yet]
+ * 7 8 2 3 4 5 6 nread=9 [wrapped]
+ * 7 8 9 10 11 12 13 nread=14 [back in order]
+ * 2 3 4 x x x x nread=5 baseline=2
+ * 2 3 4 5 6 7 8 nread=9 baseline=2
+ * 9 10 4 5 6 7 8 nread=11 baseline=2
+ * 9 10 11 12 13 14 15 nread=16 baseline=2
+ *
+ * By reversing the two substrings (lengths n1 and n2), we now have a
+ * complete string in reverse order. Our examples now look like:
+ * n1 n2
+ * 5 0 4 3 2 1 0 x x
+ * 7 0 6 5 4 3 2 1 0
+ * 2 5 8 7 6 5 4 3 2
+ * 7 0 13 12 11 10 9 8 7
+ * 3 0 4 3 2 x x x x
+ * 7 0 8 7 6 5 4 3 2
+ * 2 5 10 9 8 7 6 5 4
+ * 7 0 15 14 13 12 11 10 9
+ *
+ * After reversing two substrings calculated under the new
+ * baseline, our work is done. For example, if newbase=1,
+ * our first set of examples would look like:
+ * n1 n2
+ * 4 0 1 2 3 4 [0 x x]
+ * 6 0 1 2 3 4 5 6 [0]
+ * 1 6 8 2 3 4 5 6 7
+ * 6 1 8 9 10 11 12 13 7
+ * and for newbase=3, the second set look like:
+ * 2 0 3 4 [2 x x x x]
+ * 6 0 3 4 5 6 7 8 [2]
+ * 1 6 10 4 5 6 7 8 9
+ * 6 1 10 11 12 13 14 15 9
+ */
+static int
+recorder_new_baseline(ESL_RECORDER *rc, int newbase)
+{
+ int n1, n2;
+
+ if (newbase < rc->baseline) ESL_EXCEPTION(eslEINVAL, "new baseline must be > old one");
+ if (newbase == rc->baseline) return eslOK;
+
+ n1 = (rc->nread - rc->baseline) % rc->nalloc;
+ n2 = ESL_MIN(rc->nread-rc->baseline, rc->nalloc) - n1;
+
+ if (n1>1) linearray_reverse(rc, 0, n1);
+ if (n2>1) linearray_reverse(rc, n1, n2);
+
+ n1 = (rc->nread - newbase) % rc->nalloc;
+ n2 = ESL_MIN(rc->nread - newbase, rc->nalloc) - n1;
+
+ if (n1>1) linearray_reverse(rc, 0, n1);
+ if (n2>1) linearray_reverse(rc, n1, n2);
+
+ rc->baseline = newbase;
+ return eslOK;
+}
+/*----------------- end, internal functions ---------------------*/
+
+
+
+
+
+/*****************************************************************
+ * 4. Benchmark driver
+ *****************************************************************/
+#ifdef eslRECORDER_BENCHMARK
+/* gcc -O2 -std=gnu99 -DeslRECORDER_BENCHMARK -o esl_recorder_benchmark -I. esl_recorder.c esl_stopwatch.c esl_getopts.c easel.c
+ */
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_recorder.h"
+#include "esl_stopwatch.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-N", eslARG_INT, "1000", NULL, "n>0", NULL, NULL, NULL, "set recorder window size in lines", 0 },
+ { 0,0,0,0,0,0,0,0 },
+};
+static char usage[] = "[-options] <filename>";
+static char banner[] = "benchmarking speed of ESL_RECORDER reading";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ ESL_STOPWATCH *w = esl_stopwatch_Create();
+ ESL_RECORDER *rc = NULL;
+ char *filename = esl_opt_GetArg(go, 1);
+ int N = esl_opt_GetInteger(go, "-N");
+ FILE *fp = NULL;
+ char *buf = NULL;
+ int balloc = 0;
+ int status;
+
+ if ((fp = fopen(filename, "r")) == NULL) esl_fatal("no such file %s\n", filename);
+ rc = esl_recorder_Create(fp, N);
+ esl_stopwatch_Start(w);
+ while ((status = esl_recorder_Read(rc, &buf)) == eslOK);
+ esl_recorder_Destroy(rc);
+ fclose(fp);
+
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "recorder time: ");
+
+ if ((fp = fopen(filename, "r")) == NULL) esl_fatal("no such file %s\n", filename);
+ esl_stopwatch_Start(w);
+ while ((status = esl_fgets(&buf, &balloc, fp)) == eslOK);
+ free(buf);
+ fclose(fp);
+
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "esl_fgets() time: ");
+
+ esl_stopwatch_Destroy(w);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslRECORDER_BENCHMARK*/
+/*---------------- end, benchmark driver ------------------------*/
+
+
+
+/*****************************************************************
+ * 5. Unit tests
+ *****************************************************************/
+#ifdef eslRECORDER_TESTDRIVE
+#include "esl_random.h"
+
+static void
+generate_testfile(ESL_RANDOMNESS *rng, char *tmpfile, int *is_data, int nlines)
+{
+ char *msg = "esl_recorder:: test file generator failed";
+ FILE *fp = NULL;
+ int in_block = esl_rnd_Roll(rng, 2); /* TRUE | FALSE */
+ int nblock = 1 + esl_rnd_Roll(rng, 10); /* 1..10 */
+ int i;
+
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal(msg);
+ for (i = 0; i < nlines; i++)
+ {
+ is_data[i] = in_block ? TRUE : FALSE;
+ fprintf(fp, "%c%d\n", (in_block ? '#' : ' '), i);
+ if (--nblock == 0) {
+ in_block = ! in_block;
+ nblock = 1 + esl_rnd_Roll(rng, 10); /* 1..10 */
+ }
+ }
+ fclose(fp);
+}
+
+static void
+utest_basic(char *tmpfile, int N)
+{
+ char *msg = "esl_recorder:: basic unit test failed";
+ ESL_RECORDER *rc = NULL;
+ FILE *fp = NULL;
+ int i;
+ char *buf;
+
+ if ((fp = fopen(tmpfile, "r")) == NULL) esl_fatal(msg);
+ if ((rc = esl_recorder_Create(fp, N)) == NULL) esl_fatal(msg);
+ for (i = 0; i < N; i++)
+ {
+ if (esl_recorder_Read(rc, &buf) != eslOK) esl_fatal(msg);
+ if (atoi(buf+1) != i) esl_fatal(msg);
+ }
+ if (esl_recorder_Read(rc, &buf) != eslEOF) esl_fatal(msg);
+
+ if (buf != NULL) esl_fatal(msg);
+
+ if (esl_recorder_Position(rc, 0) != eslOK) esl_fatal(msg);
+ for (i = 0; i < N; i++)
+ {
+ if (esl_recorder_Read(rc, &buf) != eslOK) esl_fatal(msg);
+ if (atoi(buf+1) != i) esl_fatal(msg);
+ }
+ if (esl_recorder_Read(rc, &buf) != eslEOF) esl_fatal(msg);
+
+ fclose(fp);
+ esl_recorder_Destroy(rc);
+}
+
+
+static void
+utest_grow(char *tmpfile, int N)
+{
+ char *msg = "esl_recorder:: grow unit test failed";
+ ESL_RECORDER *rc = NULL;
+ FILE *fp = NULL;
+ int i;
+ char *buf;
+
+ if ((fp = fopen(tmpfile, "r")) == NULL) esl_fatal(msg);
+ if ((rc = esl_recorder_Create(fp, 3)) == NULL) esl_fatal(msg);
+ for (i = 0; i < 4; i++)
+ {
+ if (esl_recorder_Read(rc, &buf) != eslOK) esl_fatal(msg);
+ if (atoi(buf+1) != i) esl_fatal(msg);
+ }
+ /* recorder has now wrapped: contains lines 3 1 2 */
+
+ if (esl_recorder_Position(rc, 0) != eslEINVAL) esl_fatal(msg);
+ if (esl_recorder_Position(rc, 1) != eslOK) esl_fatal(msg);
+ if (esl_recorder_ResizeTo(rc, 6) != eslOK) esl_fatal(msg);
+ /* now 1 2 3 x x x */
+
+ for (i = 1; i < N; i++)
+ {
+ if (esl_recorder_Read(rc, &buf) != eslOK) esl_fatal(msg);
+ if (atoi(buf+1) != i) esl_fatal(msg);
+ }
+ if (esl_recorder_Read(rc, &buf) != eslEOF) esl_fatal(msg);
+
+ fclose(fp);
+ esl_recorder_Destroy(rc);
+}
+
+static void
+utest_grow2(char *tmpfile, int N)
+{
+ char *msg = "esl_recorder:: grow2 unit test failed";
+ ESL_RECORDER *rc = NULL;
+ FILE *fp = NULL;
+ int i;
+ char *buf;
+
+ if (N < 5) esl_fatal(msg); /* need at least this for this test */
+
+ if ((fp = fopen(tmpfile, "r")) == NULL) esl_fatal(msg);
+ if ((rc = esl_recorder_Create(fp, 3)) == NULL) esl_fatal(msg);
+ for (i = 0; i < 4; i++)
+ {
+ if (esl_recorder_Read(rc, &buf) != eslOK) esl_fatal(msg);
+ if (atoi(buf+1) != i) esl_fatal(msg);
+ }
+ /* recorder has now wrapped: contains lines 3 1 2 */
+
+ if (esl_recorder_ResizeTo(rc, 6) != eslOK) esl_fatal(msg);
+ /* recorder should now have reset baseline: 1 2 3 x x x */
+
+ if (esl_recorder_Read(rc, &buf) != eslOK) esl_fatal(msg);
+ if (atoi(buf+1) != 4) esl_fatal(msg);
+ /* now it should have 1 2 3 4 x x (and not 3 4 2 x x x, or x 1 2 3 4 x, for example) */
+
+ if (esl_recorder_Position(rc, 0) != eslEINVAL) esl_fatal(msg);
+ if (esl_recorder_Position(rc, 1) != eslOK) esl_fatal(msg);
+ for (i = 1; i < N; i++)
+ {
+ if (esl_recorder_Read(rc, &buf) != eslOK) esl_fatal(msg);
+ if (atoi(buf+1) != i) esl_fatal(msg);
+ }
+ if (esl_recorder_Read(rc, &buf) != eslEOF) esl_fatal(msg);
+
+ fclose(fp);
+ esl_recorder_Destroy(rc);
+}
+
+static void
+utest_shrink(char *tmpfile, int N)
+{
+ char *msg = "esl_recorder:: shrink unit test failed";
+ ESL_RECORDER *rc = NULL;
+ FILE *fp = NULL;
+ int i;
+ char *buf;
+
+ if ((fp = fopen(tmpfile, "r")) == NULL) esl_fatal(msg);
+ if ((rc = esl_recorder_Create(fp, 6)) == NULL) esl_fatal(msg);
+ for (i = 0; i < 7; i++)
+ {
+ if (esl_recorder_Read(rc, &buf) != eslOK) esl_fatal(msg);
+ if (atoi(buf+1) != i) esl_fatal(msg);
+ }
+ /* recorder has now wrapped: contains lines 6 1 2 3 4 5 */
+
+ if (esl_recorder_ResizeTo(rc, 3) != eslOK) esl_fatal(msg);
+ /* now it's 6 4 5 */
+ if (esl_recorder_Position(rc, 4) != eslOK) esl_fatal(msg);
+
+ for (i = 4; i < N; i++)
+ {
+ if (esl_recorder_Read(rc, &buf) != eslOK) esl_fatal(msg);
+ if (atoi(buf+1) != i) esl_fatal(msg);
+ }
+ if (esl_recorder_Read(rc, &buf) != eslEOF) esl_fatal(msg);
+
+ fclose(fp);
+ esl_recorder_Destroy(rc);
+}
+
+static void
+utest_block(ESL_RANDOMNESS *rng, char *tmpfile, int *is_data, int N)
+{
+ char *msg = "esl_recorder:: block unit test failed";
+ ESL_RECORDER *rc = NULL;
+ FILE *fp = NULL;
+ int linenumber = 0; /* where we should be in the file */
+ int max_reposition = 2;
+ int max_realloc = 2;
+ int *nseen1 = NULL; /* # of times we Read() each line */
+ int *nseen2 = NULL; /* # of times we see each line in a block */
+ int minalloc;
+ int roll;
+ char *buf;
+ char **block;
+ int from;
+ int n,i;
+ int status = eslOK;
+
+ if ((fp = fopen(tmpfile, "r")) == NULL) esl_fatal(msg);
+ roll = 1+esl_rnd_Roll(rng, N+1); /* 1..N+1 */
+ if ((rc = esl_recorder_Create(fp, roll)) == NULL) esl_fatal(msg);
+
+ if ((nseen1 = malloc(sizeof(int) * N)) == NULL) esl_fatal(msg);
+ if ((nseen2 = malloc(sizeof(int) * N)) == NULL) esl_fatal(msg);
+ for (i = 0; i < N; i++) nseen1[i] = 0;
+ for (i = 0; i < N; i++) nseen2[i] = 0;
+
+ while (status == eslOK)
+ {
+ /* skip nondata lines (no # prefix) */
+ do {
+ if (esl_recorder_Read(rc, &buf) == eslEOF) goto DONE;
+ if (atoi(buf+1) != linenumber) esl_fatal(msg);
+ if (esl_recorder_GetCurrent(rc) != linenumber) esl_fatal(msg);
+ nseen1[linenumber]++;
+ linenumber++;
+ } while (*buf != '#');
+
+ /* read block */
+ from = esl_recorder_GetCurrent(rc);
+ esl_recorder_MarkBlock(rc, from);
+ do {
+ if ((status = esl_recorder_Read(rc, &buf)) == eslEOF) break;
+ if (atoi(buf+1) != linenumber) esl_fatal(msg);
+ if (esl_recorder_GetCurrent(rc) != linenumber) esl_fatal(msg);
+ nseen1[linenumber]++;
+ linenumber++;
+ } while (*buf == '#');
+
+ /* get the block */
+ esl_recorder_GetBlock(rc, &block, NULL, NULL, &n);
+ if (status == eslOK) n--;
+
+ /* check the block */
+ for (i = 0; i < n; i++)
+ {
+ if (atoi(block[i]+1) != from+i) esl_fatal(msg);
+ nseen2[from+i]++;
+ }
+
+ /* unmark it */
+ esl_recorder_UnmarkBlock(rc);
+
+ /* some fraction of the time, reposition randomly */
+ if (status == eslOK && max_reposition && (roll = esl_rnd_Roll(rng, 5)) == 0)
+ {
+ linenumber = esl_recorder_GetFirst(rc) +
+ esl_rnd_Roll(rng, esl_recorder_GetLast(rc) - esl_recorder_GetFirst(rc) + 1);
+ if (esl_recorder_Position(rc, linenumber) != eslOK) esl_fatal(msg);
+ max_reposition--;
+ }
+
+ /* some fraction of the time, shrink the allocation */
+ if (status == eslOK && max_realloc && (roll = esl_rnd_Roll(rng, 5)) == 0)
+ {
+ /* must keep at least nread-ncurr+1 lines, to keep curr line in window */
+ minalloc = rc->nread-rc->ncurr+1;
+ roll = minalloc + esl_rnd_Roll(rng, rc->nalloc-minalloc+1);
+ if (esl_recorder_ResizeTo(rc, roll) != eslOK) esl_fatal(msg);
+ max_realloc--;
+ }
+ }
+
+ DONE:
+ /* we're EOF. We should be sitting on the last line. */
+ if (esl_recorder_GetCurrent(rc) != N-1) esl_fatal(msg);
+
+ /* We should have Read() every line at least once. */
+ for (i = 0; i < N; i++)
+ if (! nseen1[i]) esl_fatal(msg);
+
+ /* In reading blocks, we should have seen each "data" line at least
+ * once; non-data lines, not at all.
+ */
+ for (i = 0; i < N; i++) {
+ if ( is_data[i] && ! nseen2[i]) esl_fatal(msg);
+ if (! is_data[i] && nseen2[i]) esl_fatal(msg);
+ }
+
+ fclose(fp);
+ esl_recorder_Destroy(rc);
+ free(nseen1);
+ free(nseen2);
+}
+
+#endif /*eslRECORDER_TESTDRIVE*/
+/*------------------- end, unit tests ---------------------------*/
+
+
+/*****************************************************************
+ * 6. Test driver
+ *****************************************************************/
+#ifdef eslRECORDER_TESTDRIVE
+/* gcc -O2 -std=gnu99 -DeslRECORDER_TESTDRIVE -o esl_recorder_utest -I. esl_recorder.c esl_stopwatch.c esl_getopts.c esl_random.c easel.c -lm
+ */
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_recorder.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { "-v", eslARG_NONE, NULL, NULL, NULL, NULL, NULL, NULL, "more verbose output", 0 },
+ { "-N", eslARG_INT, "200", NULL, NULL, NULL, NULL, NULL, "number of lines per test file", 0 },
+ { "-F", eslARG_INT, "100", NULL, NULL, NULL, NULL, NULL, "number of test files", 0 },
+
+ { 0,0,0,0,0,0,0,0 },
+};
+static char usage[] = "[-options] <filename>";
+static char banner[] = "test driver for ESL_RECORDER";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *rng = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ char template[13]= "esltmpXXXXXX";
+ char tmpfile[13];
+ int N = esl_opt_GetInteger(go, "-N");
+ int nfiles = esl_opt_GetInteger(go, "-F");
+ int *is_data = malloc(sizeof(int) * N);
+
+ esl_exception_SetHandler(&esl_nonfatal_handler);
+
+ if (esl_opt_GetBoolean(go, "-v")) {
+ printf("random number seed: %" PRIu32 "\n", esl_randomness_GetSeed(rng));
+ }
+
+ while (nfiles--)
+ {
+ strcpy(tmpfile, template);
+ generate_testfile(rng, tmpfile, is_data, N);
+
+ utest_basic (tmpfile, N);
+ utest_grow (tmpfile, N);
+ utest_grow2 (tmpfile, N);
+ utest_shrink(tmpfile, N);
+ utest_block (rng, tmpfile, is_data, N);
+
+ remove(tmpfile);
+ }
+
+ free(is_data);
+ esl_getopts_Destroy(go);
+ esl_randomness_Destroy(rng);
+
+ printf("ok\n");
+ return 0;
+}
+#endif /*eslRECORDER_TESTDRIVE*/
+/*------------------- end, test driver --------------------------*/
+
+
+
+/*****************************************************************
+ * 7. Examples
+ *****************************************************************/
+#ifdef eslRECORDER_EXAMPLE
+/* gcc -g -Wall -std=gnu99 -DeslRECORDER_EXAMPLE -o esl_recorder_example -I. esl_recorder.c easel.c
+ */
+
+#include "easel.h"
+#include "esl_recorder.h"
+
+int
+main(int argc, char **argv)
+{
+ FILE *fp = stdin;
+ ESL_RECORDER *rc = esl_recorder_Create(fp, 10);
+ char *line;
+ int i;
+ int status;
+
+ printf("\nFirst time:\n");
+ for (i = 0; i < 10; i++)
+ {
+ if ((status = esl_recorder_Read(rc, &line)) != eslOK) break; /* watch for EOF */
+ fputs(line, stdout);
+ }
+
+ esl_recorder_Position(rc, 0); /* rewind to start */
+
+ printf("\nOne more time:\n");
+ for (i = 0; i < 10; i++)
+ {
+ if ((status = esl_recorder_Read(rc, &line)) != eslOK) break;
+ fputs(line, stdout);
+ }
+
+ esl_recorder_Destroy(rc);
+ return 0;
+}
+#endif /*eslRECORDER_EXAMPLE*/
+
+
+#ifdef eslRECORDER_EXAMPLE2
+/* gcc -g -Wall -std=gnu99 -DeslRECORDER_EXAMPLE2 -o esl_recorder_example2 -I. esl_recorder.c easel.c
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+
+#include "easel.h"
+#include "esl_recorder.h"
+
+static int
+is_data(char *s)
+{
+ if (*s == '#') return TRUE;
+ // for (; *s; s++) if (! isspace(*s)) return TRUE;
+ return FALSE;
+}
+
+int
+main(int argc, char **argv)
+{
+ FILE *fp = fopen(argv[1], "r");
+ ESL_RECORDER *rc = esl_recorder_Create(fp, 10);
+ char *line;
+ char **block;
+ int n;
+ int nblocks=0;
+ int i;
+ int status = eslOK;
+
+ while (status == eslOK)
+ {
+ /* skip lines without # */
+ do {
+ if (esl_recorder_Read(rc, &line) == eslEOF) goto DONE;
+ } while (! is_data(line));
+
+ /* read block */
+ esl_recorder_MarkBlock(rc, esl_recorder_GetCurrent(rc));
+ do {
+ status = esl_recorder_Read(rc, &line);
+ } while (status == eslOK && is_data(line));
+
+ /* get the block */
+ esl_recorder_GetBlock(rc, &block, NULL, NULL, &n);
+ nblocks++;
+
+ /* if we EOF'ed, n lines of block ended with the EOF;
+ * else, last line was a blank line
+ */
+ if (status == eslOK) n--;
+
+ /* show it (exclusive of the trailing blank line */
+ printf("BLOCK %d\n", nblocks);
+ for (i = 0; i < n; i++)
+ printf("line %4d: %s", i+1, block[i]);
+ printf("\n\n");
+
+ /* unmark it */
+ esl_recorder_UnmarkBlock(rc);
+ }
+
+ DONE:
+ esl_recorder_Destroy(rc);
+ fclose(fp);
+ return 0;
+}
+#endif /*eslRECORDER_EXAMPLE2*/
+/*------------------ end, example main() ------------------------*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_recorder.h b/esl_recorder.h
new file mode 100644
index 0000000..4854143
--- /dev/null
+++ b/esl_recorder.h
@@ -0,0 +1,88 @@
+/* Saving history in a line-based input stream.
+ *
+ * SRE, Mon Dec 28 09:51:51 2009 [Zaragoza]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslRECORDER_INCLUDED
+#define eslRECORDER_INCLUDED
+
+#include "esl_config.h"
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include <stdio.h>
+
+/* Object: ESL_RECORDER
+ *
+ * A history of a line-based input stream.
+ * Allows (limited) rewinding in nonrewindable input streams;
+ * also allows block-based parsing (as opposed to line-based).
+ *
+ * The history is kept in a rolling array of string ptrs. The
+ * bookkeeping involved in indexing this array can be confusing.
+ *
+ * Lines in the file are numbered 0..N-1.
+ * (N isn't known; we'll be reading sequentially.)
+ * Lines in the recorder are 0..nalloc-1.
+ *
+ * The recorder keeps track of how many lines it has read so far, in
+ * <nread>.
+ *
+ * The recorder can be backed up to any previous line. It sets <ncurr>
+ * to be the number of lines it *appears* to have read so far;
+ * that is, the next line it will return to the caller, upon a call
+ * to esl_recorder_Read(), is line <ncurr>.
+ *
+ * A window of MIN(nread, nalloc) lines is stored;
+ * consisting of line numbers MAX(baseline, nread-nalloc) .. nread-1).
+ *
+ * A line n in the file (0..n..N-1) corresponds to
+ * an index i in the recorder by these transforms:
+ * i = (n-baseline) % nalloc
+ * n = i + MAX(baseline, nread-nalloc)
+ *
+ * Normally the baseline for the modulo calculation is just 0.
+ *
+ * The line array is circularly permuted (out of order) when
+ * (nread-baseline) / nalloc != 0.
+ */
+typedef struct {
+ FILE *fp; /* stream that we're reading line by line */
+
+ char **line; /* lines from input, line[0..nalloc-1] */
+ int nalloc; /* max number of lines remembered */
+ int *lalloc; /* alloc for each line[0..nalloc-1][0..lalloc[i]-1] */
+ off_t *offset; /* disk offsets to starts of each line */
+
+ int nread; /* max # of lines read from file in any pass [1..] */
+ int ncurr; /* # of lines into file in current pass [1..] */
+
+ int baseline; /* line origin for n<->i transform [0..] */
+ int markline; /* line origin for start of current block [-1;0..] */
+} ESL_RECORDER;
+
+
+extern ESL_RECORDER *esl_recorder_Create (FILE *fp, int maxlines);
+extern int esl_recorder_ResizeTo (ESL_RECORDER *rc, int new_maxlines);
+extern int esl_recorder_GetFirst (ESL_RECORDER *rc);
+extern int esl_recorder_GetLast (ESL_RECORDER *rc);
+extern int esl_recorder_GetCurrent(ESL_RECORDER *rc);
+extern int esl_recorder_GetNext (ESL_RECORDER *rc);
+extern void esl_recorder_Destroy (ESL_RECORDER *rc);
+
+extern int esl_recorder_Read(ESL_RECORDER *rc, char **opt_line);
+extern int esl_recorder_Position(ESL_RECORDER *rc, int linenumber);
+extern int esl_recorder_MarkBlock(ESL_RECORDER *rc, int markline);
+extern int esl_recorder_UnmarkBlock(ESL_RECORDER *rc);
+extern int esl_recorder_GetBlock(ESL_RECORDER *rc, char ***opt_lines, int **opt_lalloc, off_t **opt_offset, int *opt_nlines);
+
+
+#endif /*eslRECORDER_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
+
diff --git a/esl_regexp.c b/esl_regexp.c
new file mode 100644
index 0000000..a63d463
--- /dev/null
+++ b/esl_regexp.c
@@ -0,0 +1,1912 @@
+/* regexp.c
+ * Regular expression matching on strings.
+ *
+ *****************************************************************
+ * This is a wrapper around a modified version of Henry Spencer's
+ * regex library. Spencer's copyright notice appears below, after my
+ * wrappers, prefacing the section that includes his code. I believe
+ * you can obtain the original code from:
+ * ftp://ftp.zoo.toronto.edu/pub/bookregex.tar.Z
+ * Thanks, Henry!
+ *
+ * My modifications are generally limited to converting error handling
+ * to Easel conventions, internalizing Spencer's code as all
+ * static to this module, and some cosmetic changes to names
+ * for namespace protection reasons. I am responsible for any
+ * errors that I've introduced into Spencer's code.
+ *
+ *****************************************************************
+ * nomenclature note:
+ * A "machine" is a persistent ESL_REGEXP object, which contains
+ * an NDFA for a pattern, but the NDFA may change throughout
+ * the life of the machine.
+ *
+ * An "NDFA" (nondeterministic finite automaton) refers to
+ * an internal esl__regexp structure, which is Spencer's
+ * compiled pattern-program. We try to compile an NDFA once per
+ * pattern.
+ *
+ * A "pattern" refers to actual regular expression we're trying
+ * to match, represented as an ASCII string.
+ *
+ *****************************************************************
+ * error handling note: (xref STL9/p2)
+ * We expect that the input pattern may be provided by the user,
+ * and so a very common error will be an invalid regular expression
+ * syntax. There are 9 types of syntax errors caught by the
+ * regcomp() code and its friends. All of them generate an
+ * eslESYNTAX error, with a terse message. Under the default
+ * error handler this message will be printed and the code will halt.
+ * If you do not want invalid input regex syntax to halt your application,
+ * you can install a custom error handler that can handle
+ * the eslESYNTAX errors as you wish.
+ *****************************************************************
+ * TODO:
+ * - would be great to have an esl_regexp_Sample(), which sampled
+ * strings from a regexp. We could use this in unit tests that
+ * need to stress edge cases (generating strings with unusual
+ * but legal characters, for example). We would probably want
+ * to implement some artificial limits on repeat operators,
+ * to keep length of sampled seq reasonable.
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#include "esl_regexp.h"
+
+/* Forward declarations of Spencer's API as static, internalized in my module.
+ */
+static esl__regexp *regcomp(const char *exp);
+static int regexec(register esl__regexp *prog, const char *str);
+/* his regsub() is present but unused, ifdef'd out to silence compilers; uncomment to reactivate */
+/* static int regsub(const esl__regexp *rp, const char *source, char *dest); */
+#ifdef DEBUG
+static void regdump(esl__regexp *r);
+#endif
+
+
+
+
+/*****************************************************************
+ * Easel's regexp API
+ *****************************************************************/
+
+/* Function: esl_regexp_Create()
+ * Incept: SRE, Fri Jan 7 10:55:48 2005 [St. Louis]
+ *
+ * Purpose: Creates a new <ESL_REGEXP> machine.
+ *
+ * Throws: NULL on allocation failure.
+ *
+ * Xref: STL9/p1
+ */
+ESL_REGEXP *
+esl_regexp_Create(void)
+{
+ int status;
+ ESL_REGEXP *machine = NULL;
+
+ ESL_ALLOC(machine, sizeof(ESL_REGEXP));
+ machine->ndfa = NULL;
+ return machine;
+
+ ERROR:
+ return NULL;
+}
+
+
+/* Function: esl_regexp_Destroy()
+ * Incept: SRE, Fri Jan 7 11:12:20 2005 [St. Louis]
+ *
+ * Purpose: Destroy a machine created by <esl_regexp_Create()>.
+ *
+ * Returns: void.
+ */
+void
+esl_regexp_Destroy(ESL_REGEXP *machine)
+{
+ /* Spencer's clever alloc for the NDFA allows us to free it w/ free() */
+ if (machine->ndfa != NULL) free(machine->ndfa);
+ free(machine);
+ return;
+}
+
+
+
+
+/* Function: esl_regexp_Match()
+ * Incept: SRE, Fri Jan 7 11:24:02 2005 [St. Louis]
+ *
+ * Purpose: Determine if string <s> matches the regular expression <pattern>,
+ * using a <machine>.
+ *
+ * Returns: <eslOK> if <pattern> matches <s>; <eslEOD> if it doesn't.
+ *
+ * Throws: <eslEINVAL> if the <pattern> couldn't be compiled for any reason.
+ * Throws <eslEINCONCEIVABLE> or <eslECORRUPT> if something
+ * went wrong in the search phase.
+ * (At the failure point, an error was generated with an appropriate
+ * code and message; an <ESL_SYNTAX> code, for example, may have
+ * been generated to indicate that the <pattern> is an invalid syntax.)
+ */
+int
+esl_regexp_Match(ESL_REGEXP *machine, const char *pattern, const char *s)
+{
+ if (machine->ndfa != NULL) { free(machine->ndfa); machine->ndfa = NULL; }
+ if ((machine->ndfa = regcomp(pattern)) == NULL) return eslEINVAL;
+ return regexec(machine->ndfa, s);
+}
+
+
+/* Function: esl_regexp_Compile()
+ * Incept: SRE, Sat Jan 8 09:56:21 2005 [St. Louis]
+ *
+ * Purpose: Precompile an NDFA for <pattern> and store it in
+ * a <machine>, in preparation for using the same
+ * pattern for multiple searches (see
+ * <esl_regexp_MultipleMatches()>).
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if compilation fails.
+ */
+int
+esl_regexp_Compile(ESL_REGEXP *machine, const char *pattern)
+{
+ if (machine->ndfa != NULL) { free(machine->ndfa); machine->ndfa = NULL; }
+ if ((machine->ndfa = regcomp(pattern)) == NULL) return eslEINVAL;
+ return eslOK;
+}
+
+
+/* Function: esl_regexp_MultipleMatches()
+ * Incept: SRE, Sat Jan 8 10:01:27 2005 [St. Louis]
+ *
+ * Purpose: Given a <machine> that contains a precompiled NDFA (see
+ * <esl_regexp_Compile()>, search it against a <string>.
+ * pointed to by <sptr>. When a match is found, returns
+ * <eslOK>, and resets <sptr> to point at the next character
+ * after the matched substring. (This may be
+ * trailing NUL byte if the matched substring is at the
+ * very end of the string.) If no match is found in the
+ * string, returns <eslEOD>.
+ *
+ * Because <sptr> is changed, the caller should
+ * initialize and use a temporary pointer into the string
+ * to be searched, not the caller's own pointer to the
+ * target string.
+ *
+ * Example:
+ * s = string;
+ * while (esl_regexp_MultipleMatches(m, &s) == eslOK)
+ * // process one match at a time//;
+ *
+ * Throws: <eslEINCONCEIVABLE> or <eslECORRUPT> if something goes awry internally
+ * during the search.
+ */
+int
+esl_regexp_MultipleMatches(ESL_REGEXP *machine, char **sptr)
+{
+ int status;
+
+ status = regexec(machine->ndfa, *sptr);
+ if (status == eslOK)
+ *sptr = machine->ndfa->endp[0]; /* endp points exactly where we want. */
+ else
+ *sptr = NULL;
+ return status;
+}
+
+
+
+/* Function: esl_regexp_SubmatchDup()
+ * Incept: SRE, Sat Jan 8 11:12:29 2005 [St. Louis]
+ *
+ * Purpose: Given a <machine> that has just got done matching
+ * some pattern against a target string,
+ * retrieve a substring that matched the pattern
+ * or one of the ()'d parts of it. <elem> indicates
+ * which submatch to retrieve. <elem> 0 is the complete
+ * match; 1..15 (assuming the default <ESL_REGEXP_NSUB>=16)
+ * are up to 15 ()'d submatches in the pattern.
+ *
+ * Returns: ptr to an allocated, NUL-terminated string containing
+ * the matched part of the string. Caller is responsible
+ * for free'ing this string.
+ *
+ * Throws: NULL on any internal failure.
+ */
+char *
+esl_regexp_SubmatchDup(ESL_REGEXP *machine, int elem)
+{
+ char *s;
+ int len;
+ int status;
+
+ if (elem >= ESL_REGEXP_NSUB || elem < 0)
+ ESL_XEXCEPTION(eslEINVAL, "bad elem arg");
+ if (machine->ndfa->startp[elem] == NULL || machine->ndfa->endp[elem] == NULL)
+ ESL_XEXCEPTION(eslEINVAL, "no such submatch recorded");
+
+ len = machine->ndfa->endp[elem] - machine->ndfa->startp[elem];
+ ESL_ALLOC(s, sizeof(char) * (len+1));
+ strncpy(s, machine->ndfa->startp[elem], len);
+ s[len] = '\0';
+ return s;
+
+ ERROR:
+ return NULL;
+}
+
+/* Function: esl_regexp_SubmatchCopy()
+ * Incept: SRE, Sat Jan 8 11:12:29 2005 [St. Louis]
+ *
+ * Purpose: Given a <machine> that has just got done matching some
+ * pattern against a target string, copy a substring that
+ * matched the pattern or one of the ()'d parts of it into
+ * a provided <buffer> with <nc> chars of space allocated.
+ * <elem> indicates which submatch to retrieve. <elem> 0 is
+ * the complete match; 1..15 (assuming the default
+ * <ESL_REGEXP_NSUB>=16) are up to 15 ()'d submatches in
+ * the pattern.
+ *
+ * Returns: <eslOK> on success, and buffer contains the NUL-terminated
+ * substring.
+ *
+ * Throws: <eslEINVAL> on any of several possible internal failures,
+ * including the <buffer> being too small to contain the
+ * substring.
+ */
+int
+esl_regexp_SubmatchCopy(ESL_REGEXP *machine, int elem, char *buffer, int nc)
+{
+ int len;
+ int status;
+
+ if (elem >= ESL_REGEXP_NSUB || elem < 0)
+ ESL_XEXCEPTION(eslEINVAL, "bad elem arg");
+ if (machine->ndfa->startp[elem] == NULL || machine->ndfa->endp[elem] == NULL)
+ ESL_XEXCEPTION(eslEINVAL, "no such submatch recorded");
+
+ len = machine->ndfa->endp[elem] - machine->ndfa->startp[elem];
+ if (len >= nc)
+ ESL_XEXCEPTION(eslEINVAL, "buffer too small to hold submatch");
+
+ strncpy(buffer, machine->ndfa->startp[elem], len);
+ buffer[len] = '\0';
+ return eslOK;
+
+ ERROR:
+ buffer[0] = '\0';
+ return status;
+}
+
+
+
+/* Function: esl_regexp_SubmatchCoords()
+ * Incept: SRE, Sat Jan 8 11:46:11 2005 [St. Louis]
+ *
+ * Purpose: Given a <machine> that has just got done matching some
+ * pattern against a target string, find the start/end
+ * coordinates of the substring that matched the
+ * pattern or one of the ()'d parts of it, relative to
+ * a pointer <origin> on the target string. Return the result
+ * through the ptrs <ret_start> and <ret_end>. <elem>
+ * indicates which submatch to retrieve. <elem> 0 is the
+ * complete match; 1..15 (assuming the default
+ * <ESL_REGEXP_NSUB> = 16) are up to 15 ()'d submatches in
+ * the pattern.
+ *
+ * The coordinates given in zero-offset convention relative
+ * to an <origin>. <origin> will usually be a pointer to
+ * the complete target string, in which case the coords
+ * would be [0..L-1]. However, one can extract coords
+ * relative to any other <origin> in the target string,
+ * even including an <origin> downstream of the match, so
+ * relative coords can be negative, ranging from -(L-1) to
+ * (L-1).
+ *
+ * Coords will be correct even if the match was
+ * found by a <esl_regexp_MultipleMatches()> call against
+ * a temp pointer into the target string.
+ *
+ * Returns: <eslOK> on success, and <ret_start> and <ret_end>
+ * are set to the start/end coordinates of the submatch.
+ *
+ * Throws: <eslEINVAL> on internal failures.
+ * The function is incapable of detecting a case in
+ * where <origin> is not in the same string that the
+ * <machine> matched like it should be. If a caller does
+ * this, the function may appear to succeed, but start and end
+ * coords will be garbage.
+ */
+int
+esl_regexp_SubmatchCoords(ESL_REGEXP *machine, char *origin, int elem,
+ int *ret_start, int *ret_end)
+{
+ int status;
+
+ if (elem >= ESL_REGEXP_NSUB || elem < 0)
+ ESL_XEXCEPTION(eslEINVAL, "bad elem arg");
+ if (machine->ndfa->startp[elem] == NULL || machine->ndfa->endp[elem] == NULL)
+ ESL_XEXCEPTION(eslEINVAL, "no such submatch recorded");
+
+ *ret_start = machine->ndfa->startp[elem] - origin;
+ *ret_end = machine->ndfa->endp[elem] - origin - 1;
+ return eslOK;
+
+ ERROR:
+ *ret_start = 0;
+ *ret_end = 0;
+ return status;
+}
+
+
+
+/* Function: esl_regexp_ParseCoordString()
+ *
+ * Purpose: Given a string <cstring> of the format required for a
+ * range (<from>..<to>, e.g. 10..23 or 39-91) parse out
+ * the start and end, and return them within the variables
+ * <ret_start> and <ret_end>.
+ *
+ * Returns: <eslOK> on success, and <ret_start> and <ret_end>
+ * are set to the start/end coordinates of the parse.
+ *
+ * Throws: <eslESYNTAX> if a regexp match is not made, and
+ * <eslFAIL> if the start or end values are not parsed.
+ */
+int
+esl_regexp_ParseCoordString(const char *cstring, uint32_t *ret_start, uint32_t *ret_end)
+{
+ ESL_REGEXP *re = esl_regexp_Create();
+ char tok1[32];
+ char tok2[32];
+ int status;
+
+ if (esl_regexp_Match(re, "^(\\d+)\\D+(\\d*)$", cstring) != eslOK) { status = eslESYNTAX; goto ERROR; }
+ if (esl_regexp_SubmatchCopy(re, 1, tok1, 32) != eslOK) { status = eslFAIL; goto ERROR; }
+ if (esl_regexp_SubmatchCopy(re, 2, tok2, 32) != eslOK) { status = eslFAIL; goto ERROR; }
+
+ *ret_start = atol(tok1);
+ *ret_end = (tok2[0] == '\0') ? 0 : atol(tok2);
+
+ esl_regexp_Destroy(re);
+ return eslOK;
+
+ ERROR:
+ esl_regexp_Destroy(re);
+ return status;
+}
+
+
+/*=================== end of the exposed API ==========================================*/
+
+
+
+
+/**************************************************************************************
+ * This next big chunk of code is:
+ * Copyright (c) 1986, 1993, 1995 by University of Toronto.
+ * Written by Henry Spencer. Not derived from licensed software.
+ *
+ * Permission is granted to anyone to use this software for any
+ * purpose on any computer system, and to redistribute it in any way,
+ * subject to the following restrictions:
+ *
+ * 1. The author is not responsible for the consequences of use of
+ * this software, no matter how awful, even if they arise
+ * from defects in it.
+ *
+ * 2. The origin of this software must not be misrepresented, either
+ * by explicit claim or by omission.
+ *
+ * 3. Altered versions must be plainly marked as such, and must not
+ * be misrepresented (by explicit claim or omission) as being
+ * the original software.
+ *
+ * 4. This notice must not be removed or altered.
+ */
+
+/*
+ * regcomp and regexec -- regsub and regerror are elsewhere
+ */
+
+/*
+ * The first byte of the regexp internal "program" is actually this magic
+ * number; the start node begins in the second byte.
+ */
+#define REGMAGIC 0234
+
+/*
+ * The "internal use only" fields in regexp.h are present to pass info from
+ * compile to execute that permits the execute phase to run lots faster on
+ * simple cases. They are:
+ *
+ * regstart char that must begin a match; '\0' if none obvious
+ * reganch is the match anchored (at beginning-of-line only)?
+ * regmust string (pointer into program) that match must include, or NULL
+ * regmlen length of regmust string
+ *
+ * Regstart and reganch permit very fast decisions on suitable starting points
+ * for a match, cutting down the work a lot. Regmust permits fast rejection
+ * of lines that cannot possibly match. The regmust tests are costly enough
+ * that regcomp() supplies a regmust only if the r.e. contains something
+ * potentially expensive (at present, the only such thing detected is * or +
+ * at the start of the r.e., which can involve a lot of backup). Regmlen is
+ * supplied because the test in regexec() needs it and regcomp() is computing
+ * it anyway.
+ */
+
+/*
+ * Structure for regexp "program". This is essentially a linear encoding
+ * of a nondeterministic finite-state machine (aka syntax charts or
+ * "railroad normal form" in parsing technology). Each node is an opcode
+ * plus a "next" pointer, possibly plus an operand. "Next" pointers of
+ * all nodes except BRANCH implement concatenation; a "next" pointer with
+ * a BRANCH on both ends of it is connecting two alternatives. (Here we
+ * have one of the subtle syntax dependencies: an individual BRANCH (as
+ * opposed to a collection of them) is never concatenated with anything
+ * because of operator precedence.) The operand of some types of node is
+ * a literal string; for others, it is a node leading into a sub-FSM. In
+ * particular, the operand of a BRANCH node is the first node of the branch.
+ * (NB this is *not* a tree structure: the tail of the branch connects
+ * to the thing following the set of BRANCHes.) The opcodes are:
+ */
+
+/* definition number opnd? meaning */
+#define END 0 /* no End of program. */
+#define BOL 1 /* no Match beginning of line. */
+#define EOL 2 /* no Match end of line. */
+#define ANY 3 /* no Match any character. */
+#define ANYOF 4 /* str Match any of these. */
+#define ANYBUT 5 /* str Match any but one of these. */
+#define BRANCH 6 /* node Match this, or the next..\&. */
+#define BACK 7 /* no "next" ptr points backward. */
+#define EXACTLY 8 /* str Match this string. */
+#define NOTHING 9 /* no Match empty string. */
+#define STAR 10 /* node Match this 0 or more times. */
+#define PLUS 11 /* node Match this 1 or more times. */
+#define OPEN 20 /* no Sub-RE starts here. */
+ /* OPEN+1 is number 1, etc. */
+#define CLOSE 30 /* no Analogous to OPEN. */
+
+/*
+ * Opcode notes:
+ *
+ * BRANCH The set of branches constituting a single choice are hooked
+ * together with their "next" pointers, since precedence prevents
+ * anything being concatenated to any individual branch. The
+ * "next" pointer of the last BRANCH in a choice points to the
+ * thing following the whole choice. This is also where the
+ * final "next" pointer of each individual branch points; each
+ * branch starts with the operand node of a BRANCH node.
+ *
+ * BACK Normal "next" pointers all implicitly point forward; BACK
+ * exists to make loop structures possible.
+ *
+ * STAR,PLUS '?', and complex '*' and '+', are implemented as circular
+ * BRANCH structures using BACK. Simple cases (one character
+ * per match) are implemented with STAR and PLUS for speed
+ * and to minimize recursive plunges.
+ *
+ * OPEN,CLOSE ...are numbered at compile time.
+ */
+
+/*
+ * A node is one char of opcode followed by two chars of "next" pointer.
+ * "Next" pointers are stored as two 8-bit pieces, high order first. The
+ * value is a positive offset from the opcode of the node containing it.
+ * An operand, if any, simply follows the node. (Note that much of the
+ * code generation knows about this implicit relationship.)
+ *
+ * Using two bytes for the "next" pointer is vast overkill for most things,
+ * but allows patterns to get big without disasters.
+ */
+#define OP(p) (*(p))
+#define NEXT(p) (((*((p)+1)&0177)<<8) + (*((p)+2)&0377))
+#define OPERAND(p) ((p) + 3)
+
+/*
+ * Utility definitions.
+ */
+#define ISREPN(c) ((c) == '*' || (c) == '+' || (c) == '?')
+#define META "^$.[()|?+*\\"
+
+/*
+ * Flags to be passed up and down.
+ */
+#define HASWIDTH 01 /* Known never to match null string. */
+#define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */
+#define SPSTART 04 /* Starts with * or +. */
+#define WORST 0 /* Worst case. */
+
+/*
+ * Work-variable struct for regcomp().
+ */
+struct comp {
+ char *regparse; /* Input-scan pointer. */
+ int regnpar; /* () count. */
+ char *regcode; /* Code-emit pointer; ®dummy = don't. */
+ char regdummy[3]; /* NOTHING, 0 next ptr */
+ long regsize; /* Code size. */
+};
+#define EMITTING(cp) ((cp)->regcode != (cp)->regdummy)
+
+/*
+ * Forward declarations for regcomp()'s friends.
+ */
+static char *reg(struct comp *cp, int paren, int *flagp);
+static char *regbranch(struct comp *cp, int *flagp);
+static char *regpiece(struct comp *cp, int *flagp);
+static char *regatom(struct comp *cp, int *flagp);
+static char *regnode(register struct comp *cp, char op);
+static char *regnext(char *node);
+static void regc(struct comp *cp, char c);
+static void reginsert(struct comp *cp, char op, char *opnd);
+static void regtail(struct comp *cp, char *p, char *val);
+static void regoptail(struct comp *cp, char *p, char *val);
+static char *regescape(struct comp *cp, char c);
+
+/*
+ - regcomp - compile a regular expression into internal code
+ *
+ * We can't allocate space until we know how big the compiled form will be,
+ * but we can't compile it (and thus know how big it is) until we've got a
+ * place to put the code. So we cheat: we compile it twice, once with code
+ * generation turned off and size counting turned on, and once "for real".
+ * This also means that we don't allocate space until we are sure that the
+ * thing really will compile successfully, and we never have to move the
+ * code and thus invalidate pointers into it. (Note that it has to be in
+ * one piece because free() must be able to free it all.)
+ *
+ * Beware that the optimization-preparation code in here knows about some
+ * of the structure of the compiled regexp.
+ *
+ * Returns valid ptr on success.
+ * Throws NULL on internal errors, or if <exp> is invalid.
+ *
+ * Regular expressions with invalid syntax will fail to compile somewhere,
+ * generating an eslESYNTAX error with a terse but useful message.
+ *
+ */
+static esl__regexp *
+regcomp(const char *exp)
+{
+ int status;
+ register esl__regexp *r = NULL;
+ register char *scan;
+ int flags;
+ struct comp co;
+
+ if (exp == NULL) ESL_XEXCEPTION(eslEINVAL, "NULL argument to regcomp");
+
+ /* First pass: determine size, legality. */
+ co.regparse = (char *)exp;
+ co.regnpar = 1;
+ co.regsize = 0L;
+ co.regdummy[0] = NOTHING;
+ co.regdummy[1] = co.regdummy[2] = 0;
+ co.regcode = co.regdummy;
+ regc(&co, REGMAGIC);
+ if (reg(&co, 0, &flags) == NULL) goto ERROR;
+
+ /* Small enough for pointer-storage convention? */
+ if (co.regsize >= 0x7fffL) /* Probably could be 0xffffL. */
+ ESL_XEXCEPTION(eslEMEM, "regexp too big");
+
+ /* Allocate space. */
+ ESL_ALLOC(r, sizeof(esl__regexp) + (size_t)co.regsize);
+
+ /* Second pass: emit code. */
+ co.regparse = (char *)exp;
+ co.regnpar = 1;
+ co.regcode = r->program;
+ regc(&co, REGMAGIC);
+ if (reg(&co, 0, &flags) == NULL) goto ERROR;
+
+ /* Dig out information for optimizations. */
+ r->regstart = '\0'; /* Worst-case defaults. */
+ r->reganch = 0;
+ r->regmust = NULL;
+ r->regmlen = 0;
+ scan = r->program+1; /* First BRANCH. */
+ if (OP(regnext(scan)) == END) { /* Only one top-level choice. */
+ scan = OPERAND(scan);
+
+ /* Starting-point info. */
+ if (OP(scan) == EXACTLY)
+ r->regstart = *OPERAND(scan);
+ else if (OP(scan) == BOL)
+ r->reganch = 1;
+
+ /*
+ * If there's something expensive in the r.e., find the
+ * longest literal string that must appear and make it the
+ * regmust. Resolve ties in favor of later strings, since
+ * the regstart check works with the beginning of the r.e.
+ * and avoiding duplication strengthens checking. Not a
+ * strong reason, but sufficient in the absence of others.
+ */
+ if (flags&SPSTART) {
+ register char *longest = NULL;
+ register size_t len = 0;
+
+ for (; scan != NULL; scan = regnext(scan))
+ if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
+ longest = OPERAND(scan);
+ len = strlen(OPERAND(scan));
+ }
+ r->regmust = longest;
+ r->regmlen = (int)len;
+ }
+ }
+
+ return(r);
+
+ ERROR:
+ if (r != NULL) free(r);
+ return NULL;
+}
+
+/*
+ - reg - regular expression, i.e. main body or parenthesized thing
+ *
+ * Caller must absorb opening parenthesis.
+ *
+ * Combining parenthesis handling with the base level of regular expression
+ * is a trifle forced, but the need to tie the tails of the branches to what
+ * follows makes it hard to avoid.
+ */
+static char *
+reg(register struct comp *cp, int paren, int *flagp)
+{
+ register char *ret = NULL; /* SRE: NULL init added to silence gcc */
+ register char *br;
+ register char *ender;
+ register int parno = 0; /* SRE: init added to silence gcc */
+ int flags;
+ int status;
+
+ *flagp = HASWIDTH; /* Tentatively. */
+
+ if (paren) {
+ /* Make an OPEN node. */
+ if (cp->regnpar >= ESL_REGEXP_NSUB)
+ ESL_XEXCEPTION(eslESYNTAX, "too many ()");
+ parno = cp->regnpar;
+ cp->regnpar++;
+ ret = regnode(cp, OPEN+parno);
+ }
+
+ /* Pick up the branches, linking them together. */
+ br = regbranch(cp, &flags);
+ if (br == NULL)
+ return(NULL);
+ if (paren)
+ regtail(cp, ret, br); /* OPEN -> first. */
+ else
+ ret = br;
+ *flagp &= ~(~flags&HASWIDTH); /* Clear bit if bit 0. */
+ *flagp |= flags&SPSTART;
+ while (*cp->regparse == '|') {
+ cp->regparse++;
+ br = regbranch(cp, &flags);
+ if (br == NULL)
+ return(NULL);
+ regtail(cp, ret, br); /* BRANCH -> BRANCH. */
+ *flagp &= ~(~flags&HASWIDTH);
+ *flagp |= flags&SPSTART;
+ }
+
+ /* Make a closing node, and hook it on the end. */
+ ender = regnode(cp, (paren) ? CLOSE+parno : END);
+ regtail(cp, ret, ender);
+
+ /* Hook the tails of the branches to the closing node. */
+ for (br = ret; br != NULL; br = regnext(br))
+ regoptail(cp, br, ender);
+
+ /* Check for proper termination. */
+ if (paren && *cp->regparse++ != ')') {
+ ESL_XEXCEPTION(eslESYNTAX, "unterminated ()");
+ } else if (!paren && *cp->regparse != '\0') {
+ if (*cp->regparse == ')') {
+ ESL_XEXCEPTION(eslESYNTAX, "unmatched ()");
+ } else
+ ESL_XEXCEPTION(eslECORRUPT, "internal error: junk on end");
+ /* NOTREACHED */
+ }
+ return(ret);
+
+ ERROR:
+ return (status == eslOK ? ret : NULL); // fake out: status always non-OK here, this is solely to use <status> and silence compiler warning
+}
+
+/*
+ - regbranch - one alternative of an | operator
+ *
+ * Implements the concatenation operator.
+ */
+static char *
+regbranch(register struct comp *cp, int *flagp)
+{
+ register char *ret;
+ register char *chain;
+ register char *latest;
+ int flags;
+ register int c;
+
+ *flagp = WORST; /* Tentatively. */
+
+ ret = regnode(cp, BRANCH);
+ chain = NULL;
+ while ((c = *cp->regparse) != '\0' && c != '|' && c != ')') {
+ latest = regpiece(cp, &flags);
+ if (latest == NULL)
+ return(NULL);
+ *flagp |= flags&HASWIDTH;
+ if (chain == NULL) /* First piece. */
+ *flagp |= flags&SPSTART;
+ else
+ regtail(cp, chain, latest);
+ chain = latest;
+ }
+ if (chain == NULL) /* Loop ran zero times. */
+ (void) regnode(cp, NOTHING);
+
+ return(ret);
+}
+
+/*
+ - regpiece - something followed by possible [*+?]
+ *
+ * Note that the branching code sequences used for ? and the general cases
+ * of * and + are somewhat optimized: they use the same NOTHING node as
+ * both the endmarker for their branch list and the body of the last branch.
+ * It might seem that this node could be dispensed with entirely, but the
+ * endmarker role is not redundant.
+ *
+ * Returns valid ptr on success.
+ * Throws NULL on errors.
+ */
+static char *
+regpiece(register struct comp *cp, int *flagp)
+{
+ register char *ret;
+ register char op;
+ register char *next;
+ int flags;
+ int status;
+
+ ret = regatom(cp, &flags);
+ if (ret == NULL)
+ return(NULL);
+
+ op = *cp->regparse;
+ if (!ISREPN(op)) {
+ *flagp = flags;
+ return(ret);
+ }
+
+ if (!(flags&HASWIDTH) && op != '?')
+ ESL_XEXCEPTION(eslESYNTAX, "*+ operand could be empty");
+ switch (op) {
+ case '*': *flagp = WORST|SPSTART; break;
+ case '+': *flagp = WORST|SPSTART|HASWIDTH; break;
+ case '?': *flagp = WORST; break;
+ }
+
+ if (op == '*' && (flags&SIMPLE))
+ reginsert(cp, STAR, ret);
+ else if (op == '*') {
+ /* Emit x* as (x&|), where & means "self". */
+ reginsert(cp, BRANCH, ret); /* Either x */
+ regoptail(cp, ret, regnode(cp, BACK)); /* and loop */
+ regoptail(cp, ret, ret); /* back */
+ regtail(cp, ret, regnode(cp, BRANCH)); /* or */
+ regtail(cp, ret, regnode(cp, NOTHING)); /* null. */
+ } else if (op == '+' && (flags&SIMPLE))
+ reginsert(cp, PLUS, ret);
+ else if (op == '+') {
+ /* Emit x+ as x(&|), where & means "self". */
+ next = regnode(cp, BRANCH); /* Either */
+ regtail(cp, ret, next);
+ regtail(cp, regnode(cp, BACK), ret); /* loop back */
+ regtail(cp, next, regnode(cp, BRANCH)); /* or */
+ regtail(cp, ret, regnode(cp, NOTHING)); /* null. */
+ } else if (op == '?') {
+ /* Emit x? as (x|) */
+ reginsert(cp, BRANCH, ret); /* Either x */
+ regtail(cp, ret, regnode(cp, BRANCH)); /* or */
+ next = regnode(cp, NOTHING); /* null. */
+ regtail(cp, ret, next);
+ regoptail(cp, ret, next);
+ }
+ cp->regparse++;
+ if (ISREPN(*cp->regparse))
+ ESL_XEXCEPTION(eslESYNTAX, "nested *?+");
+
+ return(ret);
+
+ ERROR:
+ return (status == eslOK ? ret : NULL); // status is not OK; this construction serves solely to silence compiler warning about unused <status>
+}
+
+/*
+ - regatom - the lowest level
+ *
+ * Optimization: gobbles an entire sequence of ordinary characters so that
+ * it can turn them into a single node, which is smaller to store and
+ * faster to run. Backslashed characters are exceptions, each becoming a
+ * separate node; the code is simpler that way and it's not worth fixing.
+ *
+ * Returns valid ptr on success.
+ * Throws NULL on an error.
+ */
+static char *
+regatom(register struct comp *cp, int *flagp)
+{
+ register char *ret = NULL;
+ int flags;
+ int status;
+
+ *flagp = WORST; /* Tentatively. */
+
+ switch (*cp->regparse++) {
+ case '^':
+ ret = regnode(cp, BOL);
+ break;
+ case '$':
+ ret = regnode(cp, EOL);
+ break;
+ case '.':
+ ret = regnode(cp, ANY);
+ *flagp |= HASWIDTH|SIMPLE;
+ break;
+ case '[': {
+ register int range;
+ register int rangeend;
+ register int c;
+
+ if (*cp->regparse == '^') { /* Complement of range. */
+ ret = regnode(cp, ANYBUT);
+ cp->regparse++;
+ } else
+ ret = regnode(cp, ANYOF);
+ if ((c = *cp->regparse) == ']' || c == '-') {
+ regc(cp, c);
+ cp->regparse++;
+ }
+ while ((c = *cp->regparse++) != '\0' && c != ']') {
+ /* SRE: inserted code for \t, \n, \r, \f here:
+ * c is the \, and cp->regparse is an alphanumeric.
+ */
+ if (c == '\\') {
+ c = *cp->regparse++;
+ switch (c) {
+ case 'f': regc(cp, '\f'); break;
+ case 'n': regc(cp, '\n'); break;
+ case 'r': regc(cp, '\r'); break;
+ case 't': regc(cp, '\t'); break;
+ case '\\': regc(cp, '\\'); break;
+ default:
+ ESL_XEXCEPTION(eslESYNTAX, "Invalid \\ escape inside range operator");
+ break;
+ }
+ }/*end SRE*/
+ else if (c != '-')
+ regc(cp, c);
+ else if ((c = *cp->regparse) == ']' || c == '\0')
+ regc(cp, '-');
+ else {
+ range = (unsigned char)*(cp->regparse-2);
+ rangeend = (unsigned char)c;
+ if (range > rangeend)
+ ESL_XEXCEPTION(eslESYNTAX, "invalid [] range");
+ for (range++; range <= rangeend; range++)
+ regc(cp, range);
+ cp->regparse++;
+ }
+ }
+ regc(cp, '\0');
+ if (c != ']')
+ ESL_XEXCEPTION(eslESYNTAX, "unmatched []");
+ *flagp |= HASWIDTH|SIMPLE;
+ break;
+ }
+ case '(':
+ ret = reg(cp, 1, &flags);
+ if (ret == NULL)
+ return NULL;
+ *flagp |= flags&(HASWIDTH|SPSTART);
+ break;
+
+ case '\0':
+ case '|':
+ case ')':
+ /* supposed to be caught earlier */
+ ESL_XEXCEPTION(eslECORRUPT, "internal error: \\0|) unexpected");
+ /*NOTREACHED*/
+ break;
+
+ case '?':
+ case '+':
+ case '*':
+ ESL_XEXCEPTION(eslESYNTAX, "?+* follows nothing");
+ /*NOTREACHED*/
+ break;
+
+ case '\\':
+ if (*cp->regparse == '\0')
+ ESL_XEXCEPTION(eslESYNTAX, "trailing \\");
+
+ if (! isalnum(*cp->regparse)) {
+ ret = regnode(cp, EXACTLY); /* SRE: original Spencer code */
+ regc(cp, *cp->regparse++);
+ regc(cp, '\0');
+ } else { /* SRE: my dropped in escape-code handling */
+ ret = regescape(cp, *cp->regparse);
+ }
+ *flagp |= HASWIDTH|SIMPLE;
+ break;
+
+ default: {
+ register size_t len;
+ register char ender;
+
+ cp->regparse--;
+ len = strcspn(cp->regparse, META);
+ if (len == 0)
+ ESL_XEXCEPTION(eslECORRUPT, "strcspn 0");
+ ender = *(cp->regparse+len);
+ if (len > 1 && ISREPN(ender))
+ len--; /* Back off clear of ?+* operand. */
+ *flagp |= HASWIDTH;
+ if (len == 1)
+ *flagp |= SIMPLE;
+ ret = regnode(cp, EXACTLY);
+ for (; len > 0; len--)
+ regc(cp, *cp->regparse++);
+ regc(cp, '\0');
+ break;
+ }
+ }
+ return(ret);
+
+ ERROR:
+ return (status == eslOK ? ret : NULL); // status is not OK. Construction serves to silence compiler warning about unused <status>.
+}
+
+/*
+ - regnode - emit a node
+ */
+static char * /* Location. */
+regnode(register struct comp *cp, char op)
+{
+ register char *const ret = cp->regcode;
+ register char *ptr;
+
+ if (!EMITTING(cp)) {
+ cp->regsize += 3;
+ return(ret);
+ }
+
+ ptr = ret;
+ *ptr++ = op;
+ *ptr++ = '\0'; /* Null next pointer. */
+ *ptr++ = '\0';
+ cp->regcode = ptr;
+
+ return(ret);
+}
+
+/*
+ - regc - emit (if appropriate) a byte of code
+ */
+static void
+regc(register struct comp *cp, char b)
+{
+ if (EMITTING(cp))
+ *cp->regcode++ = b;
+ else
+ cp->regsize++;
+}
+
+/*
+ - reginsert - insert an operator in front of already-emitted operand
+ *
+ * Means relocating the operand.
+ */
+static void
+reginsert(register struct comp *cp, char op, char *opnd)
+{
+ register char *place;
+
+ if (!EMITTING(cp)) {
+ cp->regsize += 3;
+ return;
+ }
+
+ (void) memmove(opnd+3, opnd, (size_t)(cp->regcode - opnd));
+ cp->regcode += 3;
+
+ place = opnd; /* Op node, where operand used to be. */
+ *place++ = op;
+ *place++ = '\0';
+ *place++ = '\0';
+ return;
+}
+
+/*
+ - regtail - set the next-pointer at the end of a node chain
+ */
+static void
+regtail(register struct comp *cp, char *p, char *val)
+{
+ register char *scan;
+ register char *temp;
+ register int offset;
+
+ if (!EMITTING(cp))
+ return;
+
+ /* Find last node. */
+ for (scan = p; (temp = regnext(scan)) != NULL; scan = temp)
+ continue;
+
+ offset = (OP(scan) == BACK) ? scan - val : val - scan;
+ *(scan+1) = (offset>>8)&0177;
+ *(scan+2) = offset&0377;
+ return;
+}
+
+/*
+ - regoptail - regtail on operand of first argument; nop if operandless
+ */
+static void
+regoptail(register struct comp *cp, char *p, char *val)
+{
+ /* "Operandless" and "op != BRANCH" are synonymous in practice. */
+ if (!EMITTING(cp) || OP(p) != BRANCH)
+ return;
+ regtail(cp, OPERAND(p), val);
+ return;
+}
+
+/*
+ * regexec and friends
+ */
+
+/*
+ * Work-variable struct for regexec().
+ */
+struct exec {
+ char *reginput; /* String-input pointer. */
+ char *regbol; /* Beginning of input, for ^ check. */
+ char **regstartp; /* Pointer to startp array. */
+ char **regendp; /* Ditto for endp. */
+};
+
+/*
+ * Forwards.
+ */
+static int regtry(struct exec *ep, esl__regexp *rp, char *string);
+static int regmatch(struct exec *ep, char *prog);
+static int regrepeat(struct exec *ep, char *node, size_t *ret_count);
+#ifdef DEBUG
+static int regnarrate = 0;
+static char *regprop(char *op);
+#endif
+
+/*
+ - regexec - match a regexp against a string
+ *
+ * Returns <eslOK> on match; <eslEOD> for no match.
+ * Throws <eslEINCONCEIVABLE>,<eslECORRUPT> on internal errors.
+ */
+static int
+regexec(register esl__regexp *prog, const char *str)
+{
+ register char *string = (char *)str; /* avert const poisoning */
+ register char *s;
+ struct exec ex;
+ int code;
+
+ /* Be paranoid. */
+ if (prog == NULL || string == NULL)
+ ESL_EXCEPTION(eslEINCONCEIVABLE, "NULL argument to regexec");
+
+ /* Check validity of program. */
+ if ((unsigned char)*prog->program != REGMAGIC)
+ ESL_EXCEPTION(eslECORRUPT, "corrupted regexp");
+
+ /* If there is a "must appear" string, look for it. */
+ if (prog->regmust != NULL && strstr(string, prog->regmust) == NULL)
+ return eslEOD;
+
+ /* Mark beginning of line for ^ . */
+ ex.regbol = string;
+ ex.regstartp = prog->startp;
+ ex.regendp = prog->endp;
+
+ /* Simplest case: anchored match need be tried only once. */
+ if (prog->reganch)
+ return(regtry(&ex, prog, string));
+
+ /* Messy cases: unanchored match. */
+ if (prog->regstart != '\0') {
+ /* We know what char it must start with. */
+ for (s = string; s != NULL; s = strchr(s+1, prog->regstart))
+ if ((code = regtry(&ex, prog, s)) != eslEOD)
+ return code; /* match, or throwing an error up */
+ return eslEOD; /* no match in string */
+ } else {
+ /* We don't -- general case. */
+ for (s = string; *s != '\0'; s++)
+ if ((code = regtry(&ex, prog, s)) != eslEOD)
+ return code; /* match, or throw an error up */
+ return eslEOD; /* reached end of string, no match */
+ }
+ /* NOTREACHED */
+}
+
+/*
+ - regtry - try match at specific point
+ *
+ * Returns <eslOK> on success, <eslEOD> failure.
+ * Throws <ESL_CORRUPT>,<eslEINCONCEIVABLE> on internal errors.
+ */
+static int
+regtry(register struct exec *ep, esl__regexp *prog, char *string)
+{
+ register int i;
+ register char **stp;
+ register char **enp;
+ int code;
+
+ ep->reginput = string;
+
+ stp = prog->startp;
+ enp = prog->endp;
+ for (i = ESL_REGEXP_NSUB; i > 0; i--) {
+ *stp++ = NULL;
+ *enp++ = NULL;
+ }
+ if ((code = regmatch(ep, prog->program + 1)) == eslOK) {
+ prog->startp[0] = string;
+ prog->endp[0] = ep->reginput;
+ return eslOK;
+ } else
+ return code; /* eslEOD for normal non-match; or other thrown codes */
+}
+
+/*
+ - regmatch - main matching routine
+ *
+ * Conceptually the strategy is simple: check to see whether the current
+ * node matches, call self recursively to see whether the rest matches,
+ * and then act accordingly. In practice we make some effort to avoid
+ * recursion, in particular by going through "ordinary" nodes (that don't
+ * need to know whether the rest of the match failed) by a loop instead of
+ * by recursion.
+ *
+ * Returns <eslOK> on success, <eslEOD> on failure.
+ * Throws <eslECORRUPT>,<eslEINCONCEIVABLE> on internal errors.
+ */
+static int
+regmatch(register struct exec *ep, char *prog)
+{
+ register char *scan; /* Current node. */
+ char *next; /* Next node. */
+ int code; /* error code */
+
+#ifdef DEBUG
+ if (prog != NULL && regnarrate)
+ fprintf(stderr, "%s(\n", regprop(prog));
+#endif
+ for (scan = prog; scan != NULL; scan = next) {
+#ifdef DEBUG
+ if (regnarrate)
+ fprintf(stderr, "%s...\n", regprop(scan));
+#endif
+ next = regnext(scan);
+
+ switch (OP(scan)) {
+ case BOL:
+ if (ep->reginput != ep->regbol)
+ return eslEOD;
+ break;
+ case EOL:
+ if (*ep->reginput != '\0')
+ return eslEOD;
+ break;
+ case ANY:
+ if (*ep->reginput == '\0')
+ return eslEOD;
+ ep->reginput++;
+ break;
+ case EXACTLY: {
+ register size_t len;
+ register char *const opnd = OPERAND(scan);
+
+ /* Inline the first character, for speed. */
+ if (*opnd != *ep->reginput)
+ return eslEOD;
+ len = strlen(opnd);
+ if (len > 1 && strncmp(opnd, ep->reginput, len) != 0)
+ return eslEOD;
+ ep->reginput += len;
+ break;
+ }
+ case ANYOF:
+ if (*ep->reginput == '\0' ||
+ strchr(OPERAND(scan), *ep->reginput) == NULL)
+ return eslEOD;
+ ep->reginput++;
+ break;
+ case ANYBUT:
+ if (*ep->reginput == '\0' ||
+ strchr(OPERAND(scan), *ep->reginput) != NULL)
+ return eslEOD;
+ ep->reginput++;
+ break;
+ case NOTHING:
+ break;
+ case BACK:
+ break;
+ case OPEN+1: case OPEN+2: case OPEN+3:
+ case OPEN+4: case OPEN+5: case OPEN+6:
+ case OPEN+7: case OPEN+8: case OPEN+9: {
+ register const int no = OP(scan) - OPEN;
+ register char *const input = ep->reginput;
+
+ if ((code = regmatch(ep, next)) == eslOK) {
+ /*
+ * Don't set startp if some later
+ * invocation of the same parentheses
+ * already has.
+ */
+ if (ep->regstartp[no] == NULL)
+ ep->regstartp[no] = input;
+ return eslOK;
+ } else
+ return code; /* usually eslEOD, except on error */
+ /*NOTREACHED*/
+ break;
+ }
+ case CLOSE+1: case CLOSE+2: case CLOSE+3:
+ case CLOSE+4: case CLOSE+5: case CLOSE+6:
+ case CLOSE+7: case CLOSE+8: case CLOSE+9: {
+ register const int no = OP(scan) - CLOSE;
+ register char *const input = ep->reginput;
+
+ if ((code = regmatch(ep, next)) == eslOK) {
+ /*
+ * Don't set endp if some later
+ * invocation of the same parentheses
+ * already has.
+ */
+ if (ep->regendp[no] == NULL)
+ ep->regendp[no] = input;
+ return eslOK;
+ } else
+ return code; /* usually eslEOD, except on error */
+ /*NOTREACHED*/
+ break;
+ }
+ case BRANCH: {
+ register char *const save = ep->reginput;
+
+ if (OP(next) != BRANCH) /* No choice. */
+ next = OPERAND(scan); /* Avoid recursion. */
+ else {
+ while (OP(scan) == BRANCH) {
+ if ((code = regmatch(ep, OPERAND(scan))) != eslEOD)
+ return code; /* usually eslOK, but also a thrown error*/
+ ep->reginput = save;
+ scan = regnext(scan);
+ }
+ return eslEOD;
+ /*NOTREACHED*/
+ }
+ break;
+ }
+ case STAR: case PLUS: {
+ register const char nextch =
+ (OP(next) == EXACTLY) ? *OPERAND(next) : '\0';
+ register char *const save = ep->reginput;
+ register const size_t min = (OP(scan) == STAR) ? 0 : 1;
+ size_t no;
+
+ if (regrepeat(ep, OPERAND(scan), &no) != eslOK) return eslEINCONCEIVABLE;
+ for (++no; no > min; no--) {
+ ep->reginput = save + no - 1;
+ /* If it could work, try it. */
+ if (nextch == '\0' || *ep->reginput == nextch)
+ if (regmatch(ep, next) == eslOK)
+ return eslOK;
+ }
+ return eslEOD;
+ /*NOTREACHED*/
+ break;
+ }
+ case END:
+ return eslOK; /* Success! */
+ break;
+ default:
+ ESL_EXCEPTION(eslECORRUPT, "regexp corruption");
+ /*NOTREACHED*/
+ break;
+ }
+ }
+
+ /*
+ * We get here only if there's trouble -- normally "case END" is
+ * the terminating point.
+ */
+ ESL_EXCEPTION(eslECORRUPT, "corrupted pointers");
+}
+
+/*
+ - regrepeat - report how many times something simple would match,
+ * via <ret_result>
+ * Returns <eslOK> on success.
+ * Throws <eslEINCONCEIVABLE> - if node isn't a repeating one.
+ */
+static int
+regrepeat(register struct exec *ep, char *node, size_t *ret_count)
+{
+ register size_t count;
+ register char *scan;
+ register char ch;
+
+ switch (OP(node)) {
+ case ANY:
+ *ret_count = strlen(ep->reginput);
+ return eslOK;
+ case EXACTLY:
+ ch = *OPERAND(node);
+ count = 0;
+ for (scan = ep->reginput; *scan == ch; scan++)
+ count++;
+ *ret_count = count;
+ return eslOK;
+ /*NOTREACHED*/
+ break;
+ case ANYOF:
+ *ret_count = strspn(ep->reginput, OPERAND(node));
+ return eslOK;
+ /*NOTREACHED*/
+ break;
+ case ANYBUT:
+ *ret_count = strcspn(ep->reginput, OPERAND(node));
+ return eslOK;
+ /*NOTREACHED*/
+ break;
+ default: /* Oh dear. Called inappropriately. */
+ ESL_EXCEPTION(eslEINCONCEIVABLE, "bad call of regrepeat");
+ /*NOTREACHED*/
+ break;
+ }
+ /* NOTREACHED */
+ return eslEINCONCEIVABLE;
+}
+
+/*
+ - regnext - dig the "next" pointer out of a node
+ */
+static char *
+regnext(register char *p)
+{
+ register const int offset = NEXT(p);
+
+ if (offset == 0)
+ return(NULL);
+
+ return((OP(p) == BACK) ? p-offset : p+offset);
+}
+
+#ifdef DEBUG
+/*
+ - regdump - dump a regexp onto stdout in vaguely comprehensible form
+ */
+static void
+regdump(esl__regexp *r)
+{
+ register char *s;
+ register char op = EXACTLY; /* Arbitrary non-END op. */
+ register char *next;
+
+
+ s = r->program + 1;
+ while (op != END) { /* While that wasn't END last time... */
+ op = OP(s);
+ printf("%2d%s", s-r->program, regprop(s)); /* Where, what. */
+ next = regnext(s);
+ if (next == NULL) /* Next ptr. */
+ printf("(0)");
+ else
+ printf("(%d)", (s-r->program)+(next-s));
+ s += 3;
+ if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
+ /* Literal string, where present. */
+ while (*s != '\0') {
+ putchar(*s);
+ s++;
+ }
+ s++;
+ }
+ putchar('\n');
+ }
+
+ /* Header fields of interest. */
+ if (r->regstart != '\0')
+ printf("start `%c' ", r->regstart);
+ if (r->reganch)
+ printf("anchored ");
+ if (r->regmust != NULL)
+ printf("must have \"%s\"", r->regmust);
+ printf("\n");
+}
+
+/*
+ - regprop - printable representation of opcode
+ */
+static char *
+regprop(char *op)
+{
+ register char *p;
+ static char buf[50];
+
+ (void) strcpy(buf, ":");
+
+ switch (OP(op)) {
+ case BOL:
+ p = "BOL";
+ break;
+ case EOL:
+ p = "EOL";
+ break;
+ case ANY:
+ p = "ANY";
+ break;
+ case ANYOF:
+ p = "ANYOF";
+ break;
+ case ANYBUT:
+ p = "ANYBUT";
+ break;
+ case BRANCH:
+ p = "BRANCH";
+ break;
+ case EXACTLY:
+ p = "EXACTLY";
+ break;
+ case NOTHING:
+ p = "NOTHING";
+ break;
+ case BACK:
+ p = "BACK";
+ break;
+ case END:
+ p = "END";
+ break;
+ case OPEN+1:
+ case OPEN+2:
+ case OPEN+3:
+ case OPEN+4:
+ case OPEN+5:
+ case OPEN+6:
+ case OPEN+7:
+ case OPEN+8:
+ case OPEN+9:
+ sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN);
+ p = NULL;
+ break;
+ case CLOSE+1:
+ case CLOSE+2:
+ case CLOSE+3:
+ case CLOSE+4:
+ case CLOSE+5:
+ case CLOSE+6:
+ case CLOSE+7:
+ case CLOSE+8:
+ case CLOSE+9:
+ sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE);
+ p = NULL;
+ break;
+ case STAR:
+ p = "STAR";
+ break;
+ case PLUS:
+ p = "PLUS";
+ break;
+ default:
+ p = "[corrupted!]";
+ break;
+ }
+ if (p != NULL)
+ (void) strcat(buf, p);
+ return(buf);
+}
+#endif /*DEBUG*/
+
+
+ /* SRE: regsub() currently disabled; it is useful, but currently
+ * unused. ifdef'ing it out silences zealous compiler warnings */
+#if 0
+/*
+ - regsub - perform substitutions after a regexp match
+ *
+ * Returns <eslOK> on success.
+ * Throws <eslEINCONCEIVABLE>, <eslECORRUPT> on internal errors.
+ */
+static int
+regsub(const esl__regexp *rp, const char *source, char *dest)
+{
+ register esl__regexp * const prog = (esl__regexp *)rp;
+ register char *src = (char *)source;
+ register char *dst = dest;
+ register char c;
+ register int no;
+ register size_t len;
+
+ if (prog == NULL || source == NULL || dest == NULL)
+ ESL_EXCEPTION(eslEINCONCEIVABLE, "NULL parameter to regsub");
+
+ if ((unsigned char)*(prog->program) != REGMAGIC)
+ ESL_EXCEPTION(eslECORRUPT, "damaged regexp");
+
+ while ((c = *src++) != '\0') {
+ if (c == '&')
+ no = 0;
+ else if (c == '\\' && isdigit((int) (*src)))
+ no = *src++ - '0';
+ else
+ no = -1;
+
+ if (no < 0) { /* Ordinary character. */
+ if (c == '\\' && (*src == '\\' || *src == '&'))
+ c = *src++;
+ *dst++ = c;
+ } else if (prog->startp[no] != NULL && prog->endp[no] != NULL &&
+ prog->endp[no] > prog->startp[no]) {
+ len = prog->endp[no] - prog->startp[no];
+ (void) strncpy(dst, prog->startp[no], len);
+ dst += len;
+ if (*(dst-1) == '\0') /* strncpy hit NUL. */
+ ESL_EXCEPTION(eslECORRUPT, "damaged match string");
+ }
+ }
+ *dst++ = '\0';
+ return eslOK;
+}
+#endif /* regsub() currently disabled */
+/*============= end of Spencer's copyrighted regexp code =============================*/
+
+/* Spencer's code originally handled a backslashed alphanum
+ * like \t as t: in regatom(), the logic was:
+ * ret = regnode(cp, EXACTLY);
+ * regc(cp, *cp->regparse++);
+ * regc(cp, '\0');
+ * Here we provide a drop-in replacement for these lines.
+ * We create an EXACTLY node for escapes, and a ANYBUT
+ * or ANYOF node for character classes. Then
+ * instead of pushing the char *cp->regparse onto the machine
+ * and incrementing cp->regparse, we interpret an alphanumeric
+ * character as an escape code, push one or more appropriate
+ * chars onto the machine, and advance regparse,
+ * before returning control to Spencer.
+ *
+ * that is: cp->regparse points to c when we come in,
+ * and it's an alphanumeric following a \. On return,
+ * we've advanced cp->regparse by one.
+ */
+static char *
+regescape(struct comp *cp, char c)
+{
+ char *ret = NULL;
+ char x;
+ int status;
+
+ switch (c) {
+ /* escapes: */
+ case 'f': ret = regnode(cp, EXACTLY); regc(cp, '\f'); break;
+ case 'n': ret = regnode(cp, EXACTLY); regc(cp, '\n'); break;
+ case 'r': ret = regnode(cp, EXACTLY); regc(cp, '\r'); break;
+ case 't': ret = regnode(cp, EXACTLY); regc(cp, '\t'); break;
+
+ /* character classes: */
+ case 'd':
+ ret = regnode(cp, ANYOF);
+ for (x = '0'; x <= '9'; x++)
+ regc(cp, x);
+ break;
+
+ case 'D':
+ ret = regnode(cp, ANYBUT);
+ for (x = '0'; x <= '9'; x++) regc(cp, x);
+ break;
+
+ case 'w':
+ ret = regnode(cp, ANYOF);
+ for (x = '0'; x <= '9'; x++) regc(cp, x);
+ for (x = 'a'; x <= 'z'; x++) regc(cp, x);
+ for (x = 'A'; x <= 'Z'; x++) regc(cp, x);
+ regc(cp, '_');
+ break;
+
+ case 'W':
+ ret = regnode(cp, ANYBUT);
+ for (x = '0'; x <= '9'; x++) regc(cp, x);
+ for (x = 'a'; x <= 'z'; x++) regc(cp, x);
+ for (x = 'A'; x <= 'Z'; x++) regc(cp, x);
+ regc(cp, '_');
+ break;
+
+ case 's':
+ ret = regnode(cp, ANYOF);
+ regc(cp, ' ');
+ regc(cp, '\t');
+ regc(cp, '\n');
+ regc(cp, '\r');
+ regc(cp, '\f');
+ break;
+
+ case 'S':
+ ret = regnode(cp, ANYBUT);
+ regc(cp, ' ');
+ regc(cp, '\t');
+ regc(cp, '\n');
+ regc(cp, '\r');
+ regc(cp, '\f');
+ break;
+
+ default:
+ ESL_XEXCEPTION(eslESYNTAX, "invalid \\ escape code");
+ /*NOTREACHED*/
+ break;
+ }
+
+ regc(cp, '\0');
+ cp->regparse++;
+ return ret;
+
+ ERROR:
+ return (status == eslOK ? ret : NULL); // status is not OK; construction serves to silence compiler warning about unused <status>
+}
+
+
+/*****************************************************************
+ * 3 code examples, and the test driver
+ *****************************************************************/
+
+#ifdef eslREGEXP_EXAMPLE
+/* Single match example.
+ * Find first match of <pattern> in <string>;
+ * print coords of complete match.
+ *
+ * gcc -g -Wall -o example1 -I. -DeslREGEXP_EXAMPLE1 regexp.c easel.c
+ * ./example1 <pattern> <string>
+ */
+
+#include <stdio.h> /* for printf() */
+#include "easel.h"
+#include "esl_regexp.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_REGEXP *m;
+ char *pattern;
+ char *string;
+ int status;
+ int i,j;
+
+ pattern = argv[1];
+ string = argv[2];
+
+ m = esl_regexp_Create();
+
+ status = esl_regexp_Match(m, pattern, string);
+
+ if (status == eslOK)
+ {
+ esl_regexp_SubmatchCoords(m, string, 0, &i, &j);
+ printf("Pattern matches string at positions %d..%d\n", i+1, j+1);
+ }
+ else if (status == eslEOD)
+ {
+ printf("Pattern does not match in string.\n");
+ }
+
+ esl_regexp_Destroy(m);
+ exit(0);
+}
+#endif /* eslREGEXP_EXAMPLE*/
+
+
+#ifdef eslREGEXP_EXAMPLE2
+/* Multiple match example.
+ * Matches <pattern> against <string> multiple times, until
+ * no more matches are found.
+ *
+ * gcc -g -Wall -o example2 -I. -DeslREGEXP_EXAMPLE2 regexp.c easel.c
+ * ./example2 <pattern> <string>
+ */
+
+#include <stdio.h> /* for printf() */
+#include "easel.h"
+#include "esl_regexp.h"
+
+int
+main(int argc, char **argv)
+{
+ char *pattern;
+ char *string;
+ ESL_REGEXP *m;
+ int status;
+ int i,j;
+ char *s;
+ char buf[256];
+ int n = 0;
+
+ pattern = argv[1];
+ string = argv[2];
+
+ m = esl_regexp_Create();
+
+ esl_regexp_Compile(m, pattern);
+ s = string;
+ while ((status = esl_regexp_MultipleMatches(m, &s)) == eslOK)
+ {
+ n++;
+ esl_regexp_SubmatchCoords(m, string, 0, &i, &j);
+ esl_regexp_SubmatchCopy(m, 0, buf, 256);
+
+ printf("Match #%d: positions %d..%d sequence: %s\n", n, i+1, j+1, buf);
+ }
+
+ esl_regexp_Destroy(m);
+ exit(0);
+}
+#endif /* eslREGEXP_EXAMPLE2 */
+
+
+#ifdef eslREGEXP_EXAMPLE3
+
+/* Token parsing example.
+ * Match a <pattern> that contains <ntok> ()-tokens
+ * against <string>; parse out the submatches to each () token.
+ *
+ * gcc -g -Wall -o example3 -I. -DeslREGEXP_EXAMPLE3 regexp.c easel.c
+ * ./example3 <pattern> <string> <ntok>
+ */
+#include <stdlib.h> /* for atoi() */
+#include <stdio.h> /* for printf() */
+#include "easel.h"
+#include "esl_regexp.h"
+
+int
+main(int argc, char **argv)
+{
+ char *pattern;
+ char *string;
+ int ntok;
+ ESL_REGEXP *m;
+ int status;
+ int i,j;
+ char *token;
+ int n;
+
+ pattern = argv[1];
+ string = argv[2];
+ ntok = atoi(argv[3]);
+
+ m = esl_regexp_Create();
+
+ status = esl_regexp_Match(m, pattern, string);
+ if (status == eslOK)
+ {
+ for (n = 1; n <= ntok; n++)
+ {
+ esl_regexp_SubmatchCoords(m, string, n, &i, &j);
+ token = esl_regexp_SubmatchDup(m, n);
+ printf("token #%d: %d..%d, %s\n", n, i+1, j+1, token);
+ free(token);
+ }
+ }
+ esl_regexp_Destroy(m);
+ exit(0);
+}
+#endif /*eslREGEXP_EXAMPLE3*/
+
+#ifdef eslREGEXP_TESTDRIVE
+/* A test driver exercises every function in the
+ * external API at least once, and tries to uncover
+ * obvious problems.
+ *
+ * gcc -g -Wall -o test -I. -DeslREGEXP_TESTDRIVE regexp.c easel.c
+ * ./test
+ */
+int
+main(void)
+{
+ ESL_REGEXP *m;
+ char *pattern;
+ char *string;
+ char *s;
+ char buf[64];
+ int status;
+ int i,j;
+ int n;
+
+ m = esl_regexp_Create();
+ string = "aaafoobarfoooobazfo..aaa";
+
+ /* simple matching test.
+ */
+ pattern = "foo";
+ if (esl_regexp_Match(m, pattern, string) != eslOK) abort();
+ esl_regexp_SubmatchCoords(m, string, 0, &i, &j);
+ if (i != 3 || j != 5) abort();
+ s = esl_regexp_SubmatchDup(m, 0);
+ if (strcmp(s, "foo") != 0) abort();
+ free(s);
+ esl_regexp_SubmatchCopy(m, 0, buf, 64);
+ if (strcmp(buf, "foo") != 0) abort();
+
+ /* test all the metacharacters in one pattern;
+ * and token 2 extraction grabs "oobaz" 13..17
+ */
+ pattern = "^aaaa*(foo|bar|baz)+([aboz]+).o\\.[^a-z]aaa?$";
+ if (esl_regexp_Match(m, pattern, string) != eslOK) abort();
+ esl_regexp_SubmatchCoords(m, string, 2, &i, &j);
+ if (i != 12 || j != 16) abort();
+ s = esl_regexp_SubmatchDup(m, 2);
+ if (strcmp(s, "oobaz") != 0) abort();
+ free(s);
+
+ /* test multiple matching:
+ * this pattern hits five times in the sequence, w/
+ * variations on foo.
+ */
+ pattern = "bar|foo*|baz";
+ esl_regexp_Compile(m, pattern);
+ s = string;
+ n = 0;
+ while ((status = esl_regexp_MultipleMatches(m, &s)) == eslOK)
+ {
+ n++;
+ esl_regexp_SubmatchCopy(m, 0, buf, 64);
+ if ((n == 1 && strcmp(buf, "foo") != 0) ||
+ (n == 2 && strcmp(buf, "bar") != 0) ||
+ (n == 3 && strcmp(buf, "foooo") != 0) ||
+ (n == 4 && strcmp(buf, "baz") != 0) ||
+ (n == 5 && strcmp(buf, "fo") != 0))
+ abort();
+ }
+ if (n != 5) abort();
+ esl_regexp_Destroy(m);
+ exit(0);
+}
+#endif /* test driver */
+/*============= end of test driver and example code =============================*/
+
+
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_regexp.h b/esl_regexp.h
new file mode 100644
index 0000000..7ba114b
--- /dev/null
+++ b/esl_regexp.h
@@ -0,0 +1,73 @@
+/* Regular expression matching on strings.
+ *
+ * SRE, Sun Jan 2 10:52:34 2005 [Zaragoza]
+ * SVN $Id$
+ * SVN $URL$
+ ******************************************************************
+ * The regexp module is a wrapper around a modified version of Henry
+ * Spencer's regex library. Spencer's copyright notice appears below,
+ * after my wrappers, prefacing the section that includes his code. I
+ * believe you can obtain the original code from:
+ * ftp://ftp.zoo.toronto.edu/pub/bookregex.tar.Z
+ * Thanks, Henry!
+ *****************************************************************
+ */
+#ifndef eslREGEXP_INCLUDED
+#define eslREGEXP_INCLUDED
+
+/* ESL_REGEXP_NSUB specifies the maximum number of () expressions
+ * in a regexp. The whole regexp counts as one, so 16 allows for
+ * parsing out up to 15 tokens from the match.
+ */
+#define ESL_REGEXP_NSUB 16
+
+/* The esl__regexp structure is from the original Spencer code.
+ * It's wrapped by the ESL_REGEXP structure, below.
+ */
+typedef struct {
+ char *startp[ESL_REGEXP_NSUB]; /* ptrs to starts of submatches on target string */
+ char *endp[ESL_REGEXP_NSUB]; /* ptrs to 1 char after ends of submatches */
+ char regstart; /* Internal use only. */
+ char reganch; /* Internal use only. */
+ char *regmust; /* Internal use only. */
+ int regmlen; /* Internal use only. */
+ char program[1]; /* Unwarranted chumminess with compiler. */
+} esl__regexp;
+
+
+/* This looks sort of stupid, wrapping a single ptr in a structure, but we
+ * want the machine to be persistent even if different NDFAs are
+ * compiled and used. Without this persistency, we would have to
+ * create/destroy every time we used a different pattern, instead of
+ * one create/destroy per block of code that uses regex matching
+ * functionaility.
+ *
+ * Plus, if we ever need to keep other persistent info
+ * beyond Spencer's compiled NDFA (which we'd rather not mess
+ * with), we have a place to put it.
+ */
+typedef struct {
+ esl__regexp *ndfa; /* a compiled regexp */
+} ESL_REGEXP;
+
+
+/* Declaration of functions in the API
+ */
+
+extern ESL_REGEXP *esl_regexp_Create(void);
+extern void esl_regexp_Destroy(ESL_REGEXP *machine);
+
+extern int esl_regexp_Match(ESL_REGEXP *machine, const char *pattern, const char *s);
+extern int esl_regexp_Compile(ESL_REGEXP *machine, const char *pattern);
+extern int esl_regexp_MultipleMatches(ESL_REGEXP *machine, char **sptr);
+
+extern char *esl_regexp_SubmatchDup(ESL_REGEXP *machine, int elem);
+extern int esl_regexp_SubmatchCopy(ESL_REGEXP *machine, int elem, char *buffer, int nc);
+extern int esl_regexp_SubmatchCoords(ESL_REGEXP *machine, char *origin, int elem,
+ int *ret_start, int *ret_end);
+extern int esl_regexp_ParseCoordString(const char *cstring, uint32_t *ret_start, uint32_t *ret_end);
+
+#endif /*eslREGEXP_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_regexp.tex b/esl_regexp.tex
new file mode 100644
index 0000000..1f03a8b
--- /dev/null
+++ b/esl_regexp.tex
@@ -0,0 +1,386 @@
+
+The regexp module contains portable functions for using regular
+expressions to match and parse strings.
+
+There are many different regular expression syntaxes. Easel
+implements a small regular expression machine with a limited syntax,
+allowing the most familiar and important regular expression
+operators. It takes advantage of a compact, public domain regular
+expression engine written by Henry Spencer at the University of
+Toronto. Easel's regular expressions are not as powerful as the
+regular expression syntax in the Perl language, for example, but are
+sufficient for many useful parsing needs in a C application.
+
+\subsection{The regexp API}
+
+The module implements one object: a regular expression matching
+``machine'', \ccode{ESL\_REGEXP}.
+
+The API defines ten functions:
+
+\begin{tabular}{ll}
+ \multicolumn{2}{c}{\textbf{creating/destroying a regexp machine}}\\
+\ccode{esl\_regexp\_Create()} & Creates a new \ccode{ESL\_REGEXP}. \\
+\ccode{esl\_regexp\_Destroy()} & Destroys a created \ccode{ESL\_REGEXP}.\\
+\ccode{esl\_regexp\_Inflate()} & Inflates an allocated \ccode{ESL\_REGEXP} shell. \\
+\ccode{esl\_regexp\_Deflate()} & Deflates an inflated \ccode{ESL\_REGEXP} shell. \\
+ \multicolumn{2}{c}{\textbf{matching a pattern against a string}}\\
+\ccode{esl\_regexp\_Match()} & Finds first match of a pattern in a string.\\
+\ccode{esl\_regexp\_Compile()} & Precompile a pattern, for \ccode{\_MultipleMatches()}.\\
+\ccode{esl\_regexp\_MultipleMatches()} & Finds next match of a compiled pattern in a string.\\
+ \multicolumn{2}{c}{\textbf{retrieving (sub)match information}}\\
+\ccode{esl\_regexp\_SubmatchDup()} & Retrieves text of a (sub)match as a new string.\\
+\ccode{esl\_regexp\_SubmatchCopy()} & Copies text of a (sub)match into a buffer.\\
+\ccode{esl\_regexp\_SubmatchCoords()} & Retrieves start/end coord of a (sub)match.\\
+\end{tabular}
+
+\subsection{Examples of using the regexp API}
+
+To use the \ccode{regexp} module, you first create a machine, which
+you'll destroy when you're done. The same machine can be used for any
+number of different patterns, so you would usually create just one
+machine per function or code unit that needs regular expression
+functionality.
+
+An example of code that matches a \ccode{pattern} against a
+\ccode{string} is:
+
+\begin{cchunk}
+#include <stdio.h> /* for printf() */
+#include <easel/easel.h>
+#include <easel/regexp.h>
+
+int
+main(int argc, char **argv)
+{
+ ESL_REGEXP *m;
+ char *pattern;
+ char *string;
+ int status;
+ int i,j;
+
+ pattern = argv[1];
+ string = argv[2];
+
+ m = esl_regexp_Create();
+
+ status = esl_regexp_Match(m, pattern, string);
+
+ if (status == ESL_OK)
+ {
+ esl_regexp_SubmatchCoords(m, string, 0, &i, &j);
+ printf("Pattern matches string at positions %d..%d\n", i+1, j+1);
+ }
+ else if (status == ESL_EOD)
+ {
+ printf("Pattern does not match in string.\n");
+ }
+
+ esl_regexp_Destroy(m);
+ exit(0);
+}
+#endif /* ESL_REGEXP_EXAMPLE1*/
+\end{cchunk}
+
+
+The \ccode{esl\_regexp\_Match()} function does the parsing. It returns
+\ccode{ESL\_OK} if a match is found, or \ccode{ESL\_EOD} if not.
+
+If a match is found, information about where the match is located in
+the string is kept in the machine. This information can be retrieved
+by any of three functions: the start and end points of the match (or
+any () token defining a submatch within the pattern) can be retrieved
+by \ccode{esl\_regexp\_SubmatchCoords()}; a matching substring can be
+retrieved as a new string by \ccode{esl\_regexp\_SubmatchDup()}, or
+matching substring can be copied into an existing buffer by
+\ccode{esl\_regexp\_SubmatchCopy()}. This information is volatile. It
+will only be available for retrieval until the next time this machine
+runs one of the two matching functions (\ccode{esl\_regexp\_Match()} or
+\ccode{esl\_regexp\_MultipleMatches()}).
+
+\ccode{esl\_regexp\_SubmatchCoords()} was called here with an argument
+of \ccode{elem}$=$ 0, where 0 means the complete match, as opposed to
+any tokens within the pattern. We'll see an example of retrieving
+tokens in a bit.
+
+The \ccode{i,j} start/end coordinates retrieved by the call to
+\ccode{esl\_regexp\_SubmatchCoords()} are 0-offset relative to the
+origin we provided, the \ccode{string} itself; so the first position
+in \ccode{string} is $i=0$. We added $+1$ to \ccode{i,j} in the
+example to print coords as $1..L$ in the string instead of $0..L-1$.
+
+An example of running this code:
+
+\begin{cchunk}
+ % ./example1 "ba(na)+" "grape banana apple"
+ Pattern matches string at positions 7..12
+\end{cchunk}
+
+Note that it matched ``banana'' from 7..12, not ``bana'' from
+7..10. The Easel regexp machine is ``greedy''. It matches as much of
+the string as the pattern allows. There isn't currently a way to
+circumvent this to get minimal matching instead of maximal matching
+(as, for instance, Perl regular expressions allow with an additional
+'?' modifier on its greedy quantifiers.)
+
+\subsubsection{Example of finding multiple matches in a string}
+
+The example above only found one (the first) match in the target
+string. What if you want to find every match in the string, analogous
+to the Perl \ccode{m//g} operator? The combination of
+\ccode{esl\_regexp\_Compile()} and
+\ccode{esl\_regexp\_MultipleMatches()} provides a useful idiom for
+this task, as seen in this example:
+
+\begin{cchunk}
+#include <stdio.h> /* for printf() */
+#include <easel/easel.h>
+#include <easel/regexp.h>
+
+int
+main(int argc, char **argv)
+{
+ char *pattern;
+ char *string;
+ ESL_REGEXP *m;
+ int status;
+ int i,j;
+ char *s;
+ char buf[256];
+ int n = 0;
+
+ pattern = argv[1];
+ string = argv[2];
+
+ m = esl_regexp_Create();
+
+ esl_regexp_Compile(m, pattern);
+ s = string;
+ while ((status = esl_regexp_MultipleMatches(m, &s)) == ESL_OK)
+ {
+ n++;
+ esl_regexp_SubmatchCoords(m, string, 0, &i, &j);
+ esl_regexp_SubmatchCopy(m, 0, buf, 256);
+
+ printf("Match #%d: positions %d..%d sequence: %s\n", n, i+1, j+1, buf);
+ }
+
+ esl_regexp_Destroy(m);
+ exit(0);
+}
+\end{cchunk}
+
+For example, something like this could parse a command line for one or
+more arguments:
+
+\begin{cchunk}
+ % ./example2 "-[^ ]+" "foo -a --arg -O myfile"
+ Match #1: positions 5..6 sequence: -a
+ Match #2: positions 8..12 sequence: --arg
+ Match #3: positions 14..15 sequence: -O
+\end{cchunk}
+
+Like \ccode{esl\_regexp\_Match()},
+\ccode{esl\_regexp\_MultipleMatches()} finds the first match in a
+string. Additionally, upon returning after finding a match,
+\ccode{esl\_regexp\_MultipleMatches()} supplies a pointer to the next
+position in the string following the match (through the \ccode{\&s}
+argument). That facilitates writing an idiomatic \ccode{while ()} loop
+that steps a temporary pointer \ccode{s} through the string until no
+more matches are found, starting with \ccode{s = string}.
+
+Using a regular expression pattern requires compiling it into machine
+code (a non-deterministic finite automaton, NDFA). When you use
+\ccode{esl\_regexp\_Match()}, your pattern is compiled, and the
+resulting NDFA is run on your string to find a match. In the
+multiple-matching case, it's a waste to recompile the pattern for
+every match. Therefore, we use \ccode{esl\_regexp\_Compile()} to
+compile the NDFA once and hold it in the machine, and
+\ccode{esl\_regexp\_MultipleMatches()} takes a machine (containing a
+precompiled NDFA) as an argument instead of a pattern.
+
+Remember that the regexp machine is greedy, and that the pointer is set
+to follow each match. Therefore, multiple matches are guaranteed to be
+nonoverlapping, with each match matching as much of the string as it
+can before a subsequent match occurs -- even if this is not what you
+want.
+
+Otherwise, \ccode{esl\_regexp\_MultipleMatches()} and
+\ccode{esl\_regexp\_Match()} behave the same, in that they find the
+first match in the string pointer they're provided, and in terms of
+the information they leave in the machine for subsequent retrieval.
+
+You can also see an example of \ccode{esl\_regexp\_SubmatchCopy()} in
+action here, copying the complete match (``sub''match \#0), to a
+provided fixed-length buffer.
+
+\subsubsection{Example of parsing tokens out of a string}
+
+Text parsing is laborious in C, a language which does not inherently
+provide anywhere near the text-parsing power of Perl, for example.
+Using a regular expression to match a line of text and extract one or
+more tokens, demarcated by () in the expression, is a common operation
+in Perl. The Easel regexp machine provides much of the same power. An
+example of using token extraction:
+
+\begin{cchunk}
+#include <stdlib.h> /* for atoi() */
+#include <stdio.h> /* for printf() */
+#include <easel/easel.h>
+#include <easel/regexp.h>
+
+int
+main(int argc, char **argv)
+{
+ char *pattern;
+ char *string;
+ int ntok;
+ ESL_REGEXP *m;
+ int status;
+ int i,j;
+ char *token;
+ int n;
+
+ pattern = argv[1];
+ string = argv[2];
+ ntok = atoi(argv[3]);
+
+ m = esl_regexp_Create();
+
+ status = esl_regexp_Match(m, pattern, string);
+ if (status == ESL_OK)
+ {
+ for (n = 1; n <= ntok; n++)
+ {
+ esl_regexp_SubmatchCoords(m, string, n, &i, &j);
+ token = esl_regexp_SubmatchDup(m, n);
+ printf("token #%d: %d..%d, %s\n", n, i+1, j+1, token);
+ free(token);
+ }
+ }
+ esl_regexp_Destroy(m);
+ exit(0);
+}
+\end{cchunk}
+
+In previous examples, we only retrieved information about ``submatch''
+number 0, which always refers to the entire regular expression. The
+machine also retains the same information about all the ()-demarcated
+tokens in the expression, up to 15 of them.\footnote{The limit of one
+complete expression plus 15 tokens is defined by a compile-time
+constant \ccode{ESL\_REGEXP\_NSUB} in \ccode{regexp.h}, which is set to
+16 by default.} Now, we tell the retrieval functions (here,
+\ccode{esl\_regexp\_SubmatchCoords()} and
+\ccode{esl\_regexp\_SubmatchDup()}) to retrieve info for token
+\ccode{n} instead of 0.
+
+For example, parsing a bibliographic reference like ``Gene
+102:189-196(1991)'' might go something like:
+
+\begin{cchunk}
+ % ./example3 "(\S+) (\d+):(\d+)-(\d+)\((\d+)\)" "Gene 102:189-196(1991)" 5
+ token #1: 1..4, Gene
+ token #2: 6..8, 102
+ token #3: 10..12, 189
+ token #4: 14..16, 196
+ token #5: 18..21, 1991
+\end{cchunk}
+
+The tokens are numbered in the order that their open-parenthesis
+occurred in the expression, from left to right.
+
+\subsection{Syntax of regular expressions}
+
+Regular expression syntax is fairly universal and documented in many
+places, but because different engines implement more or less rich sets
+of regular expression operations, a specific description of Easel's
+operators follows.
+
+There are 11 metacharacters \verb'|?*+[().^$\' that encode regular
+expression operations.
+
+\ccode{.} is the ANY operator. It matches any single character.
+
+\ccode{?}, \ccode{*}, and \ccode{+} are repetition operators that
+follow some atom of the pattern. \ccode{?} means 0 or 1 occurrences of
+the atom; \ccode{*} means 0 or more; \ccode{+} means 1 or more. For
+example, \ccode{foo?} matches fo and foo; \ccode{foo*} matches fo,
+foo, fooo, foooo and so on; \ccode{foo+} matches foo, fooo, foooo, and
+so on.
+
+\verb'^' is the beginning-of-string anchor, and \ccode{\$} is the
+end-of-string anchor.
+
+\ccode{|} is the concatenation operator, specifying alternative ways
+to match. For example, \ccode{foo|bar|baz} matches baz, bar, or foo;
+\ccode{(foo|bar|baz)+} matches barfoobaz, foofoofoo, etc.
+
+\ccode{()} are for grouping and tokenizing. Anything inside \ccode{()}
+is grouped and treated as a single atom for purposes of a subsequent
+\ccode{?*+} operator, as in the \ccode{(foo|bar|baz)+} example above.
+Anything inside \ccode{()} becomes a token, extractable by
+\ccode{\_Submatch*} functions.
+
+The backslash \verb+\+, when followed by any metacharacter (or in
+fact, any non-alphanumeric character), specifies that that character
+should be treated as an ordinary character. For example, the pattern
+\verb+\\c:+ matches the string \verb+\c:+, since backslash is itself a
+metacharacter.
+
+A backslash followed by an alphanumeric character is either an
+\emph{escape character} or a \emph{character set}. Four escape
+characters are recognized: \verb+\f+ (form feed), \verb+\n+ (newline),
+\verb+\r+ (carriage return), and \verb+\t+ (TAB). Six character set
+codes are recognized, with the same meanings they have in Perl regular
+expressions:
+
+\begin{center}
+\begin{tabular}{lll}
+\textbf{code} & \textbf{meaning} & \textbf{equivalent to} \\
+ \verb+\d+ & digit & \verb+[0-9]+ \\
+ \verb+\D+ & not a digit & \verb+[^0-9]+ \\
+ \verb+\w+ & word character & \verb+[0-9a-z_a-Z]+ \\
+ \verb+\W+ & non-word character & \verb+[^0-9a-z_a-Z]+ \\
+ \verb+\s+ & whitespace & \verb+[ \t\n\r\f]+ \\
+ \verb+\S+ & non-whitespace & \verb+[^ \t\n\r\f]+ \\
+\end{tabular}
+\end{center}
+
+A backslash that is followed by an alphanumeric character that is neither
+an escape code or a character set code is an error.
+
+\ccode{[} is the set (or range) operator. \footnote{An unmatched
+\ccode{]} is not a metacharacter, but a \ccode{[} metacharacter always
+implies a range and always must have a closing \ccode{]}.} The set of
+characters inside brackets \ccode{[]} are read as a single ANYOF
+atom. A set may be specified as a range of ASCII characters;
+\ccode{[a-z]}, for example, means any lower-case character from a to
+z, \ccode{[a-zA-Z]} means any alphabetic character, and \ccode{[0-9]}
+means any digit. For example, \ccode{fo[ox]} matches foo or
+fox. Additionally, \verb+[^+ implies the opposite, an ANYBUT atom: any
+character \emph{except} the set of characters named is a match. For
+example, \verb'foo[^ ]+' matches ``football'' in the string ``football
+game''.
+
+Metacharacters are handled differently inside the \verb+[]+ range
+operator. The only special characters are \verb+]+, \verb+-+, and
+\verb+\+. A \verb+]+ character indicates the end of the range operator
+unless it immediately follows the \verb+[+, in which case it is
+treated as a normal character (thus, weirdly, \verb+[][{}()]+ will
+match any open/close brace/parenthesis character). The \verb+-+
+character indicates the middle of a three-character \verb+x-y+ ASCII
+range, unless it comes at the beginning or end of the range (thus
+\verb+[]-]+ recognizes either \verb+]+ or \verb+-+ as literals). The
+\verb+\+ character indicates an escaped character. Only five such
+escape characters are recognized inside a range operator: \verb+\f+
+(form feed), \verb+\n+ (newline), \verb+\r+ (carriage return),
+\verb+\t+ (TAB), and \verb+\\+ (backslash itself). Character set codes
+like \verb+\s+ are not allowed within range operators.
+
+
+
+
+
+
+
+
diff --git a/esl_rootfinder.c b/esl_rootfinder.c
new file mode 100644
index 0000000..76d0768
--- /dev/null
+++ b/esl_rootfinder.c
@@ -0,0 +1,542 @@
+/* Finding roots.
+ *
+ * Contents:
+ * 1. The ESL_ROOTFINDER object.
+ * 2. One-dimensional root finding.
+ * 3. Unit tests.
+ * 4. Test driver.
+ * 5. Examples.
+ * 6. Copyright and license information.
+ *
+ */
+#include "esl_config.h"
+
+#include <math.h>
+
+#include "easel.h"
+#include "esl_rootfinder.h"
+
+/*****************************************************************
+ * 1. The ESL_ROOTFINDER object.
+ *****************************************************************/
+
+/* Function: esl_rootfinder_Create()
+ * Synopsis: Creates ESL_ROOTFINDER for an $f(x)$
+ * Incept: SRE, Tue Apr 10 19:54:09 2007 [Janelia]
+ *
+ * Purpose: Create a rootfinder to find a root of a function $f(x) = 0$.
+ * <(*func)()> is a pointer to an implementation of the
+ * function $f(x)$. <params> is a generic pointer to any
+ * parameters or storage needed in <(*func)()> other than
+ * the value of $x$.
+ *
+ * Caller implements a <func()> that takes three arguments.
+ * The first two are the value <x>, and a void pointer to
+ * any additional parameters that $f(x)$ depends on. The
+ * result, $f(x)$, is returned via the third argument. This
+ * function must return <eslOK> to indicate success. Upon
+ * error, it may throw any error code it wishes.
+ *
+ *
+ * Args: (*func)() - ptr to function that evaluates f(x)
+ * params - ptr to parameters to be passed to (*func)()
+ *
+ * Returns: pointer to a new <ESL_ROOTFINDER> structure.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_ROOTFINDER *
+esl_rootfinder_Create(int (*func)(double, void*, double*), void *params)
+{
+ int status;
+ ESL_ROOTFINDER *R = NULL;
+
+ ESL_ALLOC(R, sizeof(ESL_ROOTFINDER));
+ R->func = func;
+ R->fdf = NULL; /* unused */
+ R->params = params;
+ R->xl = -eslINFINITY; /* not set yet */
+ R->fl = 0.; /* not set yet */
+ R->xr = eslINFINITY; /* not set yet */
+ R->fr = 0.; /* not set yet */
+ R->x0 = 0.; /* not set yet */
+ R->f0 = 0.; /* not set yet */
+ R->x = 0.; /* not set yet */
+ R->fx = 0.; /* not set yet */
+ R->dfx = 0.; /* unused */
+ R->iter = 0;
+ R->abs_tolerance = 1e-12;
+ R->rel_tolerance = 1e-12;
+ R->residual_tol = 0.;
+ R->max_iter = 100;
+ return R;
+
+ ERROR:
+ esl_rootfinder_Destroy(R);
+ return NULL;
+}
+
+
+/* Function: esl_rootfinder_CreateFDF()
+ * Synopsis: Creates ESL_ROOTFINDER that uses both $f(x)$, $f'(x)$
+ * Incept: SRE, Tue Apr 10 20:47:42 2007 [Janelia]
+ *
+ * Purpose: Create a rootfinder that will find
+ * a root of a function $f(x) = 0$ using first derivative
+ * information $f'(x)$.
+ *
+ * Caller provides a pointer <*fdf()> to a function that
+ * takes four arguments. The first two are the current <x>
+ * value, and a void pointer to any additional parameters
+ * that $f(x)$ depends on. <*fdf()> calculates the function
+ * $f(x)$ and the derivative $f'(x)$ and returns them
+ * through the remaining two arguments.
+ *
+ * Args: (*fdf)() - ptr to function that returns f(x) and f'(x)
+ * params - ptr to parameters to be passed to (*fdf)()
+ *
+ * Returns: pointer to a new <ESL_ROOTFINDER> structure.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_ROOTFINDER *
+esl_rootfinder_CreateFDF(int (*fdf)(double, void*, double*, double*), void *params)
+{
+ int status;
+ ESL_ROOTFINDER *R = NULL;
+
+ ESL_ALLOC(R, sizeof(ESL_ROOTFINDER));
+ R->func = NULL;
+ R->fdf = fdf;
+ R->params = params;
+ R->xl = -eslINFINITY;
+ R->fl = 0.; /* unused */
+ R->xr = eslINFINITY;
+ R->fr = 0.; /* unused */
+ R->x0 = 0.;
+ R->f0 = 0.;
+ R->x = 0.; /* not set yet */
+ R->fx = 0.; /* not set yet */
+ R->dfx = 0.; /* not set yet */
+ R->iter = 0;
+ R->abs_tolerance = 1e-15;
+ R->rel_tolerance = 1e-15;
+ R->residual_tol = 0.;
+ R->max_iter = 100;
+ return R;
+
+ ERROR:
+ esl_rootfinder_Destroy(R);
+ return NULL;
+}
+
+/* Function: esl_rootfinder_SetBrackets()
+ * Incept: SRE, Wed Apr 11 08:35:10 2007 [Janelia]
+ *
+ * Purpose: Declare that a root is in the open interval
+ * <(xl..xr)>.
+ *
+ * The function will be evaluated at both points.
+ *
+ * Args: R - rootfinder structure
+ * xl,xr - root lies in open interval (xl..xr)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <xl,xr> cannot bracket a root,
+ * because $f(x_l)$ and $f(x_r)$ do not have opposite
+ * signs.
+ *
+ * Additionally, if either evaluation fails in the
+ * caller-provided function, the error code from that
+ * failure will be thrown.
+ */
+int
+esl_rootfinder_SetBrackets(ESL_ROOTFINDER *R, double xl, double xr)
+{
+ int status;
+ double dfx;
+
+ R->xl = xl;
+ R->xr = xr;
+ if (R->func != NULL) {
+ if ((status = (*R->func)(R->xl, R->params, &(R->fl))) != eslOK) return status;
+ if ((status = (*R->func)(R->xr, R->params, &(R->fr))) != eslOK) return status;
+ } else {
+ if ((status = (*R->fdf) (R->xl, R->params, &(R->fl), &dfx)) != eslOK) return status;
+ if ((status = (*R->fdf) (R->xr, R->params, &(R->fr), &dfx)) != eslOK) return status;
+ }
+ if (R->fl * R->fr >= 0) ESL_EXCEPTION(eslEINVAL, "xl,xr do not bracket a root");
+ return eslOK;
+}
+
+int
+esl_rootfinder_SetAbsoluteTolerance(ESL_ROOTFINDER *R, double tol)
+{
+ R->abs_tolerance = tol;
+ return eslOK;
+}
+
+int
+esl_rootfinder_SetRelativeTolerance(ESL_ROOTFINDER *R, double tol)
+{
+ R->rel_tolerance = tol;
+ return eslOK;
+}
+
+int
+esl_rootfinder_SetResidualTolerance(ESL_ROOTFINDER *R, double tol)
+{
+ R->residual_tol = tol;
+ return eslOK;
+}
+
+int
+esl_rootfinder_SetMaxIterations(ESL_ROOTFINDER *R, int maxiter)
+{
+ R->max_iter = maxiter;
+ return eslOK;
+}
+
+
+void
+esl_rootfinder_Destroy(ESL_ROOTFINDER *R)
+{
+ if (R == NULL) return;
+ free(R);
+}
+
+
+/*****************************************************************
+ * 2. One-dimensional root finding.
+ *****************************************************************/
+
+/* Function: esl_root_Bisection()
+ * Synopsis: Find a root of $f(x)$ by bisection method.
+ * Incept: SRE, Wed Apr 11 08:40:11 2007 [Janelia]
+ *
+ * Purpose: Find a root in the open interval <xl..xr> by the bisection method,
+ * and return it in <ret_x>.
+ *
+ * The bisection method is guaranteed to succeed, provided
+ * that <xl>,<xr> do indeed bracket a root, though it may
+ * be slow.
+ *
+ * The rootfinder <R> can be created either by
+ * <esl_rootfinder_Create()> or
+ * <esl_rootfinder_CreateFDF()>; if the latter (if the
+ * function in the rootfinder <R> includes derivative
+ * information), the bisection method will just ignore
+ * the derivative.
+ *
+ * Args: R - a rootfinder object for the function
+ * xl,xr - bounds of an open interval in which a root lies
+ * ret_x - RETURN: a root that satisfies $f(x) = 0$.
+ *
+ * Returns: <eslOK> on success, and <ret_x> points to a root.
+ *
+ * Throws: <eslEINVAL> if <xl,xr> do not bracket a root.
+ * <eslENOHALT> if the method exceeds the maximum number of
+ * iterations set in <R>.
+ *
+ * Additionally, any failure code that the caller-provided
+ * function $f(x)$ throws.
+ */
+int
+esl_root_Bisection(ESL_ROOTFINDER *R, double xl, double xr, double *ret_x)
+{
+ int status;
+ double xmag;
+
+ if ((status = esl_rootfinder_SetBrackets(R, xl, xr)) != eslOK) goto ERROR;
+
+ while (1) {
+ R->iter++;
+ if (R->iter > R->max_iter) ESL_XEXCEPTION(eslENOHALT, "failed to converge in Bisection");
+
+ /* Bisect and evaluate the function */
+ R->x = (R->xl+R->xr)/2.;
+ if (R->func != NULL) {
+ if ((status = (*R->func)(R->x, R->params, &(R->fx))) != eslOK) ESL_XEXCEPTION(status, "user-provided function failed");
+ } else {
+ if ((status = (*R->fdf) (R->x, R->params, &(R->fx), &(R->dfx))) != eslOK) ESL_XEXCEPTION(status, "user-provided function failed");
+ }
+
+ /* Test for convergence */
+ xmag = (R->xl < 0. && R->xr > 0.) ? 0. : R->x;
+ if (R->fx == 0.) break; /* an exact root, lucky */
+ if (((R->xr-R->xl) < R->abs_tolerance + R->rel_tolerance*xmag) || fabs(R->fx) < R->residual_tol) break;
+
+ /* Narrow the bracket; pay attention to directionality */
+ if (R->fl > 0.) {
+ if (R->fx > 0.) { R->xl = R->x; R->fl = R->fx; }
+ else { R->xr = R->x; R->fr = R->fx; }
+ } else {
+ if (R->fx < 0.) { R->xl = R->x; R->fl = R->fx; }
+ else { R->xr = R->x; R->fr = R->fx; }
+ }
+ }
+
+ *ret_x = R->x;
+ return eslOK;
+
+ ERROR:
+ *ret_x = 0.0;
+ return status;
+}
+
+
+/* Function: esl_root_NewtonRaphson()
+ * Synopsis: Find a root of $f(x)$ by Newton/Raphson method.
+ * Incept: SRE, Wed Apr 11 08:56:28 2007 [Janelia]
+ *
+ * Purpose: Find a root by the Newton/Raphson method, starting from
+ * an initial guess <guess>. Return the root in <ret_x>.
+ *
+ * The Newton/Raphson method is not guaranteed to succeed,
+ * but when it does, it is much faster than bisection.
+ *
+ * Newton/Raphson uses first derivative information, so the
+ * rootfinder <R> must be created with
+ * <esl_rootfinder_CreateFDF()> for a function that evaluates
+ * both $f(x)$ and $f'(x)$.
+ *
+ * Args: R - a rootfinder object for $f(x)$ and $f'(x)$
+ * guess - an initial guess for the root
+ * ret_x - RETURN: a root that satisfies $f(x) = 0$.
+ *
+ * Returns: <eslOK> on success, and <ret_x> points to a root.
+ *
+ * Throws: <eslENOHALT> if the method exceeds the maximum number of
+ * iterations set in <R>.
+ *
+ * Additionally, any failure code that the caller-provided
+ * function $f(x)$ throws.
+ */
+int
+esl_root_NewtonRaphson(ESL_ROOTFINDER *R, double guess, double *ret_x)
+{
+ int status;
+
+ R->x = guess;
+ if ((status = (*R->fdf)(R->x, R->params, &(R->fx), &(R->dfx))) != eslOK) return status;
+
+ while (1) {
+ R->iter++;
+ if (R->iter > R->max_iter) ESL_EXCEPTION(eslENOHALT, "failed to converge in Newton");
+
+ /* printf("current: x=%20g f(x) = %20g f'(x) = %20g\n", R->x, R->fx, R->dfx); */
+
+ /* Take a Newton/Raphson step. */
+ R->x0 = R->x;
+ R->f0 = R->fx;
+ R->x = R->x - R->fx / R->dfx;
+ (*R->fdf)(R->x, R->params, &(R->fx), &(R->dfx));
+
+ /* Test for convergence. */
+ if (R->fx == 0) break; /* an exact root, lucky */
+ if ( (fabs(R->x - R->x0) < R->abs_tolerance + R->rel_tolerance*R->x) || fabs(R->fx) < R->residual_tol) break;
+ }
+
+ *ret_x = R->x;
+ return eslOK;
+}
+
+
+
+
+/*****************************************************************
+ * 3. Unit tests.
+ *****************************************************************/
+#ifdef eslROOTFINDER_TESTDRIVE
+/* For the unit tests, we'll use a quadratic function
+ * f(x) = ax^2 + bx + c = 0
+ * f'(x) = 2ax + b
+ * where it's easy to set up known roots.
+ */
+struct polyparams { double a,b,c; };
+
+static int quadratic_f(double x, void *params, double *ret_fx)
+{
+ struct polyparams *p = (struct polyparams *) params;
+ *ret_fx = (p->a * x * x + p->b * x + p->c);
+ return eslOK;
+}
+
+static int quadratic_fdf(double x, void *params, double *ret_fx, double *ret_dfx)
+{
+ struct polyparams *p = (struct polyparams *) params;
+
+ *ret_fx = (p->a * x * x + p->b * x + p->c);
+ *ret_dfx = (2 * p->a) * x + p->b;
+ return eslOK;
+}
+
+static void
+utest_Bisection(void)
+{
+ char msg[] = "esl_rootfinder:: bisection unit test failed";
+ ESL_ROOTFINDER *R = NULL;
+ struct polyparams p;
+ double x;
+
+ /* (5x-1)(x+2) = 5x^2 + 9x - 2 with roots 0.2, -2 */
+ p.a = 5.;
+ p.b = 9.;
+ p.c = -2.;
+
+ /* find the positive root, 0.2 */
+ if (( R = esl_rootfinder_Create(quadratic_f, &p) ) == NULL) esl_fatal(msg);
+ if ( esl_root_Bisection(R, 0., 100., &x) != eslOK) esl_fatal(msg);
+ if ( fabs(x-0.2) > R->abs_tolerance) esl_fatal(msg);
+ esl_rootfinder_Destroy(R);
+
+ /* find the negative root, -2.0 */
+ if (( R = esl_rootfinder_CreateFDF(quadratic_fdf, &p) ) == NULL) esl_fatal(msg);
+ if ( esl_root_Bisection(R, -100., 0., &x) != eslOK) esl_fatal(msg);
+ if ( fabs(x+2.) > R->abs_tolerance) esl_fatal(msg);
+ esl_rootfinder_Destroy(R);
+}
+
+
+static void
+utest_Newton(void)
+{
+ ESL_ROOTFINDER *R = NULL;
+ struct polyparams p;
+ double x;
+
+ /* (5x-1)(x+2) = 5x^2 + 9x - 2 with roots 0.2, -2 */
+ p.a = 5.;
+ p.b = 9.;
+ p.c = -2.;
+
+ R = esl_rootfinder_CreateFDF(quadratic_fdf, &p);
+ esl_root_NewtonRaphson(R, 1., &x); /* find the positive root, 0.2 */
+ if (fabs(x-0.2) > R->abs_tolerance) esl_fatal("didn't find root 0.2");
+ esl_rootfinder_Destroy(R);
+
+ R = esl_rootfinder_CreateFDF(quadratic_fdf, &p);
+ esl_root_NewtonRaphson(R, -3., &x); /* find the negative root, -2.0 */
+ if (fabs(x+2.) > R->abs_tolerance) esl_fatal("didn't find root -2");
+ esl_rootfinder_Destroy(R);
+}
+
+#endif /*eslROOTFINDER_TESTDRIVE*/
+
+
+/*****************************************************************
+ * 4. Test driver.
+ *****************************************************************/
+/*
+ gcc -g -Wall -I. -L. -DeslROOTFINDER_TESTDRIVE -o test esl_rootfinder.c -leasel -lm
+ ./test
+ */
+#ifdef eslROOTFINDER_TESTDRIVE
+
+int
+main(int argc, char **argv)
+{
+ utest_Bisection();
+ utest_Newton();
+
+ return eslOK;
+}
+
+#endif /*eslROOTFINDER_TESTDRIVE*/
+
+/*****************************************************************
+ * 5. Examples.
+ *****************************************************************/
+
+/* An example of bisection.
+ * gcc -g -Wall -o example -I. -DeslROOTFINDER_EXAMPLE esl_rootfinder.c easel.c -lm
+ */
+#ifdef eslROOTFINDER_EXAMPLE
+/*::cexcerpt::rootfinder_example::begin::*/
+#include "easel.h"
+#include "esl_rootfinder.h"
+
+struct polyparams { double a,b,c; };
+
+int quadratic_f(double x, void *params, double *ret_fx)
+{
+ struct polyparams *p = (struct polyparams *) params;
+ *ret_fx = (p->a * x * x + p->b * x + p->c);
+ return eslOK;
+}
+
+int main(void)
+{
+ ESL_ROOTFINDER *R = NULL;
+ struct polyparams p;
+ double x, fx;
+
+ p.a = 5.;
+ p.b = 2.;
+ p.c = -1.;
+
+ R = esl_rootfinder_Create(quadratic_f, &p);
+ esl_root_Bisection(R, 0., 100., &x);
+
+ quadratic_f(x, &p, &fx);
+ printf("Find an x such that f(x) = %.0fx^2 + %.0fx + %.0f = 0 ...\n", p.a, p.b, p.c);
+ printf("x = %f (f(x) = %f)\n", x, fx);
+
+ esl_rootfinder_Destroy(R);
+ return 0;
+}
+/*::cexcerpt::rootfinder_example::end::*/
+#endif /*eslROOTFINDER_EXAMPLE*/
+
+
+/* An example of Newton/Raphson.
+ * gcc -g -Wall -o example -I. -DeslROOTFINDER_EXAMPLE2 esl_rootfinder.c easel.c -lm
+ */
+#ifdef eslROOTFINDER_EXAMPLE2
+/*::cexcerpt::rootfinder_example2::begin::*/
+#include "easel.h"
+#include "esl_rootfinder.h"
+
+struct polyparams { double a,b,c; };
+
+int quadratic_fdf(double x, void *params, double *ret_fx, double *ret_dfx)
+{
+ struct polyparams *p = (struct polyparams *) params;
+
+ *ret_fx = (p->a * x * x + p->b * x + p->c);
+ *ret_dfx = (2 * p->a) * x + p->b;
+ return eslOK;
+}
+
+int main(void)
+{
+ ESL_ROOTFINDER *R = NULL;
+ struct polyparams p;
+ double x;
+
+ p.a = 5.;
+ p.b = 2.;
+ p.c = -1.;
+
+ R = esl_rootfinder_CreateFDF(quadratic_fdf, &p);
+ esl_root_NewtonRaphson(R, -1., &x);
+
+ printf("Find an x such that f(x) = %.0fx^2 + %.0fx + %.0f = 0 ...\n", p.a, p.b, p.c);
+ printf("x = %f\n", x);
+
+ esl_rootfinder_Destroy(R);
+ return 0;
+}
+/*::cexcerpt::rootfinder_example2::end::*/
+#endif /*eslROOTFINDER_EXAMPLE2*/
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_rootfinder.h b/esl_rootfinder.h
new file mode 100644
index 0000000..6a31880
--- /dev/null
+++ b/esl_rootfinder.h
@@ -0,0 +1,54 @@
+/* Finding roots of functions.
+ *
+ * SRE, Fri Apr 6 10:01:43 2007 [Janelia]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef ESL_ROOTFINDER_INCLUDED
+#define ESL_ROOTFINDER_INCLUDED
+
+#include "esl_config.h"
+
+typedef struct {
+ int (*func)(double, void*, double*);
+ int (*fdf) (double, void*, double*, double*);
+ void *params;
+
+ double xl;
+ double fl;
+ double xr;
+ double fr;
+
+ double x0;
+ double f0;
+
+ double x;
+ double fx;
+ double dfx;
+ int iter;
+
+ double abs_tolerance;
+ double rel_tolerance;
+ double residual_tol;
+ int max_iter;
+} ESL_ROOTFINDER;
+
+
+extern ESL_ROOTFINDER *esl_rootfinder_Create (int (*func)(double, void*, double*), void *params);
+extern ESL_ROOTFINDER *esl_rootfinder_CreateFDF(int (*fdf) (double, void*, double*, double*), void *params);
+
+extern int esl_rootfinder_SetBrackets(ESL_ROOTFINDER *R, double xl, double xr);
+extern int esl_rootfinder_SetAbsoluteTolerance(ESL_ROOTFINDER *R, double tol);
+extern int esl_rootfinder_SetRelativeTolerance(ESL_ROOTFINDER *R, double tol);
+extern int esl_rootfinder_SetResidualTolerance(ESL_ROOTFINDER *R, double tol);
+extern int esl_rootfinder_SetMaxIterations(ESL_ROOTFINDER *R, int maxiter);
+extern void esl_rootfinder_Destroy(ESL_ROOTFINDER *R);
+
+extern int esl_root_Bisection(ESL_ROOTFINDER *R, double xl, double xr, double *ret_x);
+extern int esl_root_NewtonRaphson(ESL_ROOTFINDER *R, double guess, double *ret_x);
+
+
+#endif /*eslROOTFINDER_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_rootfinder.tex b/esl_rootfinder.tex
new file mode 100644
index 0000000..28b0aec
--- /dev/null
+++ b/esl_rootfinder.tex
@@ -0,0 +1,43 @@
+
+
+
+\subsection{Example of using the rootfinder API}
+
+To use the bisection method, you provide a function that computes
+$f(x)$, and you provide an initial bracket $(x_L..x_R)$ in which the
+root is known to lie. An example of using the bisection method to
+compute a root of the quadratic function $ax^2 + bx + c = 0$ for
+$a=5$, $b=2$ and $c=-1$ (note that this function has two roots, one
+$<0$ and one $>0$; the bracket $0..100$ makes the example find only
+the positive root):
+
+\input{cexcerpts/rootfinder_example}
+
+
+To use the Newton/Raphson method, you provide a function that computes
+$f(x)$ and its first derivative $df(x)/dx$, and you provide an initial
+guess for the root $x$. An example of using the Newton/Raphson method
+to compute the root of the same function above (which has a derivative
+$df(x)/dx = 2ax + b$) is:
+
+\input{cexcerpts/rootfinder_example2}
+
+In this example, because the initial guess was negative, the other
+root gets found.
+
+Currently, just these two rootfinding algorithms are implemented. The
+bisection method does not require derivative information, and it
+requires the caller to provide an interval $(x_L..x_R)$ in which the
+root lies ($f(x_L)$ and $f(x_R)$ have opposite signs). Newton/Raphson
+uses derivative information, and it only needs an initial guess for
+$x$, not an interval. Thus there are two different \ccode{\_Create*()}
+routines, \ccode{esl\_rootfinder\_CreateBracketer()} for initializing
+a bisection method, and \ccode{esl\_rootfinder\_CreatePolisher()} for
+initializing a Newton/Raphson method. The reason for the more general
+names (\ccode{CreateBracketer()} and \ccode{CreatePolisher()} is that
+I expect other rootfinding algorithms (if we ever implement any) will
+group similarly: bracketing methods without derivative information,
+and ``polishing'' methods that use derivative information. But this
+may be misguided, and may change in the future.
+
+
diff --git a/esl_scorematrix.c b/esl_scorematrix.c
new file mode 100644
index 0000000..f833444
--- /dev/null
+++ b/esl_scorematrix.c
@@ -0,0 +1,2299 @@
+/* Routines for manipulating sequence alignment score matrices,
+ * such as the BLOSUM and PAM matrices.
+ *
+ * Contents:
+ * 1. The ESL_SCOREMATRIX object.
+ * 2. Some classic score matrices.
+ * 3. Deriving a score matrix probabilistically.
+ * 4. Reading/writing matrices from/to files.
+ * 5. Implicit probabilistic basis, I: given bg.
+ * 6. Implicit probabilistic basis, II: bg unknown. [Yu/Altschul03,05]
+ * 7. Experiment driver.
+ * 8 Utility programs.
+ * 9. Unit tests.
+ * 10. Test driver.
+ * 11. Example program.
+ * 12. License and copyright.
+ */
+#include "esl_config.h"
+
+#include <string.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_composition.h"
+#include "esl_dmatrix.h"
+#include "esl_fileparser.h"
+#include "esl_rootfinder.h"
+#include "esl_ratematrix.h"
+#include "esl_scorematrix.h"
+#include "esl_vectorops.h"
+
+
+/*****************************************************************
+ *# 1. The ESL_SCOREMATRIX object
+ *****************************************************************/
+
+/* Function: esl_scorematrix_Create()
+ * Synopsis: Allocate and initialize an <ESL_SCOREMATRIX> object.
+ *
+ * Purpose: Allocates a score matrix for alphabet <abc>, initializes
+ * all scores to zero.
+ *
+ * Args: abc - pointer to digital alphabet
+ *
+ * Returns: a pointer to the new object.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_SCOREMATRIX *
+esl_scorematrix_Create(const ESL_ALPHABET *abc)
+{
+ ESL_SCOREMATRIX *S = NULL;
+ int status;
+ int i;
+
+ ESL_ALLOC(S, sizeof(ESL_SCOREMATRIX));
+ S->s = NULL;
+ S->K = abc->K;
+ S->Kp = abc->Kp;
+ S->isval = NULL;
+ S->abc_r = abc;
+ S->nc = 0;
+ S->outorder = NULL;
+ S->name = NULL;
+ S->path = NULL;
+
+ ESL_ALLOC(S->s, sizeof(int *) * abc->Kp);
+ S->s[0] = NULL;
+ ESL_ALLOC(S->isval, sizeof(char) * abc->Kp);
+ for (i = 0; i < abc->Kp; i++) S->isval[i] = FALSE;
+ ESL_ALLOC(S->outorder, sizeof(char) * (abc->Kp+1));
+ S->outorder[0] = '\0'; /* init to empty string. */
+
+ ESL_ALLOC(S->s[0], sizeof(int) * abc->Kp * abc->Kp);
+ for (i = 1; i < abc->Kp; i++) S->s[i] = S->s[0] + abc->Kp * i;
+
+ for (i = 0; i < abc->Kp*abc->Kp; i++) S->s[0][i] = 0;
+ return S;
+
+ ERROR:
+ esl_scorematrix_Destroy(S);
+ return NULL;
+}
+
+
+
+/* Function: esl_scorematrix_Copy()
+ * Synopsis: Copy <src> matrix to <dest>.
+ *
+ * Purpose: Copy <src> score matrix into <dest>. Caller
+ * has allocated <dest> for the same alphabet as
+ * <src>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINCOMPAT> if <dest> isn't allocated for
+ * the same alphabet as <src>.
+ * <eslEMEM> on allocation error.
+ */
+int
+esl_scorematrix_Copy(const ESL_SCOREMATRIX *src, ESL_SCOREMATRIX *dest)
+{
+ int i,j;
+ int status;
+
+ if (src->abc_r->type != dest->abc_r->type || src->K != dest->K || src->Kp != dest->Kp)
+ ESL_EXCEPTION(eslEINCOMPAT, "source and dest score matrix types don't match");
+
+ for (i = 0; i < src->Kp; i++)
+ for (j = 0; j < src->Kp; j++)
+ dest->s[i][j] = src->s[i][j];
+ for (i = 0; i < src->Kp; i++)
+ dest->isval[i] = src->isval[i];
+ dest->nc = src->nc;
+ for (i = 0; i < src->nc; i++)
+ dest->outorder[i] = src->outorder[i];
+ dest->outorder[dest->nc] = '\0';
+
+ if ((status = esl_strdup(src->name, -1, &(dest->name))) != eslOK) return status;
+ if ((status = esl_strdup(src->path, -1, &(dest->path))) != eslOK) return status;
+ return eslOK;
+}
+
+/* Function: esl_scorematrix_Clone()
+ * Synopsis: Allocate a duplicate of a matrix.
+ *
+ * Purpose: Allocates a new matrix and makes it a duplicate
+ * of <S>. Return a pointer to the new matrix.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_SCOREMATRIX *
+esl_scorematrix_Clone(const ESL_SCOREMATRIX *S)
+{
+ ESL_SCOREMATRIX *dup = NULL;
+
+ if ((dup = esl_scorematrix_Create(S->abc_r)) == NULL) return NULL;
+ if (esl_scorematrix_Copy(S, dup) != eslOK) { esl_scorematrix_Destroy(dup); return NULL; }
+ return dup;
+}
+
+
+/* Function: esl_scorematrix_Compare()
+ * Synopsis: Compare two matrices for equality.
+ *
+ * Purpose: Compares two score matrices. Returns <eslOK> if they
+ * are identical, <eslFAIL> if they differ. Every aspect
+ * of the two matrices is compared.
+ *
+ * The annotation (name, filename path) are not
+ * compared; we may want to compare an internally
+ * generated scorematrix to one read from a file.
+ */
+int
+esl_scorematrix_Compare(const ESL_SCOREMATRIX *S1, const ESL_SCOREMATRIX *S2)
+{
+ int a,b;
+
+ if (strcmp(S1->outorder, S2->outorder) != 0) return eslFAIL;
+ if (S1->nc != S2->nc) return eslFAIL;
+
+ for (a = 0; a < S1->nc; a++)
+ if (S1->isval[a] != S2->isval[a]) return eslFAIL;
+
+ for (a = 0; a < S1->Kp; a++)
+ for (b = 0; b < S1->Kp; b++)
+ if (S1->s[a][b] != S2->s[a][b]) return eslFAIL;
+
+ return eslOK;
+}
+
+/* Function: esl_scorematrix_CompareCanon()
+ * Synopsis: Compares scores of canonical residues for equality.
+ *
+ * Purpose: Compares the scores of canonical residues in
+ * two score matrices <S1> and <S2> for equality.
+ * Returns <eslOK> if they are identical, <eslFAIL>
+ * if they differ. Peripheral aspects of the scoring matrices
+ * having to do with noncanonical residues, output
+ * order, and suchlike are ignored.
+ */
+int
+esl_scorematrix_CompareCanon(const ESL_SCOREMATRIX *S1, const ESL_SCOREMATRIX *S2)
+{
+ int a,b;
+
+ for (a = 0; a < S1->K; a++)
+ for (b = 0; b < S1->K; b++)
+ if (S1->s[a][b] != S2->s[a][b]) return eslFAIL;
+ return eslOK;
+}
+
+
+
+/* Function: esl_scorematrix_Max()
+ * Synopsis: Returns maximum value in score matrix.
+ *
+ * Purpose: Returns the maximum value in score matrix <S>.
+ */
+int
+esl_scorematrix_Max(const ESL_SCOREMATRIX *S)
+{
+ int i,j;
+ int max = S->s[0][0];
+
+ for (i = 0; i < S->K; i++)
+ for (j = 0; j < S->K; j++)
+ if (S->s[i][j] > max) max = S->s[i][j];
+ return max;
+}
+
+/* Function: esl_scorematrix_Min()
+ * Synopsis: Returns minimum value in score matrix.
+ *
+ * Purpose: Returns the minimum value in score matrix <S>.
+ */
+int
+esl_scorematrix_Min(const ESL_SCOREMATRIX *S)
+{
+ int i,j;
+ int min = S->s[0][0];
+
+ for (i = 0; i < S->K; i++)
+ for (j = 0; j < S->K; j++)
+ if (S->s[i][j] < min) min = S->s[i][j];
+ return min;
+}
+
+
+/* Function: esl_scorematrix_IsSymmetric()
+ * Synopsis: Returns <TRUE> for symmetric matrix.
+ *
+ * Purpose: Returns <TRUE> if matrix <S> is symmetric,
+ * or <FALSE> if it's not.
+ */
+int
+esl_scorematrix_IsSymmetric(const ESL_SCOREMATRIX *S)
+{
+ int i,j;
+
+ for (i = 0; i < S->K; i++)
+ for (j = i; j < S->K; j++)
+ if (S->s[i][j] != S->s[j][i]) return FALSE;
+ return TRUE;
+}
+
+/* Function: esl_scorematrix_ExpectedScore()
+ * Synopsis: Calculates the expected score of a matrix.
+ *
+ * Purpose: Calculates the expected score of a matrix <S>,
+ * given background frequencies <fi> and <fj>;
+ * return it in <*ret_E>.
+ *
+ * The expected score is defined as
+ * $\sum_{ab} f_a f_b \sigma_{ab}$.
+ *
+ * The expected score is in whatever units the score matrix
+ * <S> is in. If you know $\lambda$, you can convert it to
+ * units of bits ($\log 2$) by multiplying it by $\lambda /
+ * \log 2$.
+ *
+ * Args: S - score matrix
+ * fi - background frequencies $f_i$ (0..K-1)
+ * fj - background frequencies $f_j$ (0..K-1)
+ * ret_E - RETURN: expected score
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_scorematrix_ExpectedScore(ESL_SCOREMATRIX *S, double *fi, double *fj, double *ret_E)
+{
+ double E = 0.;
+ int a,b;
+
+ for (a = 0; a < S->K; a++)
+ for (b = 0; b < S->K; b++)
+ E += fi[a] * fj[b] * (double) S->s[a][b];
+
+ *ret_E = E;
+ return eslOK;
+}
+
+
+/* Function: esl_scorematrix_RelEntropy()
+ * Synopsis: Calculates relative entropy of a matrix.
+ *
+ * Purpose: Calculates the relative entropy of score matrix <S> in
+ * bits, given its background distributions <fi> and <fj> and
+ * its scale <lambda>.
+ *
+ * The relative entropy is defined as $\sum_{ab} p_{ab}
+ * \log_2 \frac{p_{ab}} {f_a f_b}$, the average score (in
+ * bits) of homologous aligned sequences. In general it is
+ * $\geq 0$ (and certainly so in the case when background
+ * frequencies $f_a$ and $f_b$ are the marginals of the
+ * $p_{ab}$ joint ptobabilities).
+ *
+ * Args: S - score matrix
+ * fi - background freqs for sequence i
+ * fj - background freqs for sequence j
+ * lambda - scale factor $\lambda$ for <S>
+ * ret_D - RETURN: relative entropy.
+ *
+ * Returns: <eslOK> on success, and <ret_D> contains the relative
+ * entropy.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEINVAL> if the implied $p_{ij}$'s don't sum to one,
+ * probably indicating that <lambda> was not the correct
+ * <lambda> for <S>, <fi>, and <fj>.
+ * In either exception, <ret_D> is returned as 0.0.
+ */
+int
+esl_scorematrix_RelEntropy(const ESL_SCOREMATRIX *S, const double *fi, const double *fj, double lambda, double *ret_D)
+{
+ int status;
+ double pij;
+ double sum = 0.;
+ int i,j;
+ double D = 0;
+
+ for (i = 0; i < S->K; i++)
+ for (j = 0; j < S->K; j++)
+ {
+ pij = fi[i] * fj[j] * exp(lambda * (double) S->s[i][j]);
+ sum += pij;
+ if (pij > 0.) D += pij * log(pij / (fi[i] * fj[j]));
+
+ }
+ if (esl_DCompare(sum, 1.0, 1e-3) != eslOK)
+ ESL_XEXCEPTION(eslEINVAL, "pij's don't sum to one (%.4f): bad lambda or bad bg?", sum);
+
+ D /= eslCONST_LOG2;
+ *ret_D = D;
+ return eslOK;
+
+ ERROR:
+ *ret_D = 0.;
+ return status;
+}
+
+
+/* Function: esl_scorematrix_JointToConditionalOnQuery()
+ * Synopsis: Convert a joint probability matrix to conditional probs P(b|a)
+ *
+ * Purpose: Given a joint probability matrix <P> that has been calculated
+ * by <esl_scorematrix_ProbifyGivenBG()> or <esl_scorematrix_Probify()>
+ * (or one that obeys the same conditions; see below),
+ * convert the joint probabilities <P(a,b)> to conditional
+ * probabilities <P(b | a)>, where <b> is a residue in the target,
+ * and <a> is a residue in the query.
+ *
+ * $P(b \mid a) = P(ab) / P(a)$, where $P(a) = \sum_b P(ab)$.
+ *
+ * The value stored in <P->mx[a][b]> is $P(b \mid a)$.
+ *
+ * All values in <P> involving the codes for gap,
+ * nonresidue, and missing data (codes <K>,<Kp-2>, and
+ * <Kp-1>) are 0.0, not probabilities. Only rows/columns
+ * <i=0..K,K+1..Kp-3> are valid probability vectors.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ *
+ * Xref: J9/87.
+ */
+int
+esl_scorematrix_JointToConditionalOnQuery(const ESL_ALPHABET *abc, ESL_DMATRIX *P)
+{
+ int a,b;
+
+ /* P(b|a) = P(ab) / P(a)
+ * and P(a) = P(a,X), the value at [a][Kp-3]
+ */
+ for (a = 0; a < abc->Kp-2; a++)
+ for (b = 0; b < abc->Kp-2; b++)
+ P->mx[a][b] = (P->mx[a][abc->Kp-3] == 0.0 ? 0.0 : P->mx[a][b] / P->mx[a][abc->Kp-3]);
+ return eslOK;
+}
+
+
+
+/* Function: esl_scorematrix_Destroy()
+ * Synopsis: Frees a matrix.
+ *
+ * Purpose: Frees a score matrix.
+ */
+void
+esl_scorematrix_Destroy(ESL_SCOREMATRIX *S)
+{
+ if (S == NULL) return;
+ if (S->s != NULL) {
+ if (S->s[0] != NULL) free(S->s[0]);
+ free(S->s);
+ }
+ if (S->isval != NULL) free(S->isval);
+ if (S->outorder != NULL) free(S->outorder);
+ if (S->name != NULL) free(S->name);
+ if (S->path != NULL) free(S->path);
+ free(S);
+ return;
+}
+
+
+/*------------------- end, scorematrix object -------------------*/
+
+
+
+
+/*****************************************************************
+ *# 2. Some classic score matrices.
+ *****************************************************************/
+/* PAM30, PAM70, PAM120, PAM240, BLOSUM45, BLOSUM50, BLOSUM62, BLOSUM80, BLOSUM90 */
+/* Standard matrices are reformatted to Easel static data by the UTILITY1 program; see below */
+
+/* TODO: Instead of storing the classical low-precision versions of
+ * these, we should recalculate each one from its original
+ * probabilistic basis, and store it at higher integer precision,
+ * allowing the Yu/Altschul procedure to work. If we do that, we might also store
+ * lambda and background probabilities.
+ */
+
+#define eslAADIM 29
+
+struct esl_scorematrix_aa_preload_s {
+ char *name;
+ int matrix[eslAADIM][eslAADIM];
+};
+
+static const struct esl_scorematrix_aa_preload_s ESL_SCOREMATRIX_AA_PRELOADS[] = {
+ { "PAM30", {
+ /* A C D E F G H I K L M N P Q R S T V W Y - B J Z O U X * ~ */
+ { 6, -6, -3, -2, -8, -2, -7, -5, -7, -6, -5, -4, -2, -4, -7, 0, -1, -2, -13, -8, 0, -3, 0, -3, 0, 0, -3, -17, 0, }, /* A */
+ { -6, 10, -14, -14, -13, -9, -7, -6, -14, -15, -13, -11, -8, -14, -8, -3, -8, -6, -15, -4, 0, -12, 0, -14, 0, 0, -9, -17, 0, }, /* C */
+ { -3, -14, 8, 2, -15, -3, -4, -7, -4, -12, -11, 2, -8, -2, -10, -4, -5, -8, -15, -11, 0, 6, 0, 1, 0, 0, -5, -17, 0, }, /* D */
+ { -2, -14, 2, 8, -14, -4, -5, -5, -4, -9, -7, -2, -5, 1, -9, -4, -6, -6, -17, -8, 0, 1, 0, 6, 0, 0, -5, -17, 0, }, /* E */
+ { -8, -13, -15, -14, 9, -9, -6, -2, -14, -3, -4, -9, -10, -13, -9, -6, -9, -8, -4, 2, 0, -10, 0, -13, 0, 0, -8, -17, 0, }, /* F */
+ { -2, -9, -3, -4, -9, 6, -9, -11, -7, -10, -8, -3, -6, -7, -9, -2, -6, -5, -15, -14, 0, -3, 0, -5, 0, 0, -5, -17, 0, }, /* G */
+ { -7, -7, -4, -5, -6, -9, 9, -9, -6, -6, -10, 0, -4, 1, -2, -6, -7, -6, -7, -3, 0, -1, 0, -1, 0, 0, -5, -17, 0, }, /* H */
+ { -5, -6, -7, -5, -2, -11, -9, 8, -6, -1, -1, -5, -8, -8, -5, -7, -2, 2, -14, -6, 0, -6, 0, -6, 0, 0, -5, -17, 0, }, /* I */
+ { -7, -14, -4, -4, -14, -7, -6, -6, 7, -8, -2, -1, -6, -3, 0, -4, -3, -9, -12, -9, 0, -2, 0, -4, 0, 0, -5, -17, 0, }, /* K */
+ { -6, -15, -12, -9, -3, -10, -6, -1, -8, 7, 1, -7, -7, -5, -8, -8, -7, -2, -6, -7, 0, -9, 0, -7, 0, 0, -6, -17, 0, }, /* L */
+ { -5, -13, -11, -7, -4, -8, -10, -1, -2, 1, 11, -9, -8, -4, -4, -5, -4, -1, -13, -11, 0, -10, 0, -5, 0, 0, -5, -17, 0, }, /* M */
+ { -4, -11, 2, -2, -9, -3, 0, -5, -1, -7, -9, 8, -6, -3, -6, 0, -2, -8, -8, -4, 0, 6, 0, -3, 0, 0, -3, -17, 0, }, /* N */
+ { -2, -8, -8, -5, -10, -6, -4, -8, -6, -7, -8, -6, 8, -3, -4, -2, -4, -6, -14, -13, 0, -7, 0, -4, 0, 0, -5, -17, 0, }, /* P */
+ { -4, -14, -2, 1, -13, -7, 1, -8, -3, -5, -4, -3, -3, 8, -2, -5, -5, -7, -13, -12, 0, -3, 0, 6, 0, 0, -5, -17, 0, }, /* Q */
+ { -7, -8, -10, -9, -9, -9, -2, -5, 0, -8, -4, -6, -4, -2, 8, -3, -6, -8, -2, -10, 0, -7, 0, -4, 0, 0, -6, -17, 0, }, /* R */
+ { 0, -3, -4, -4, -6, -2, -6, -7, -4, -8, -5, 0, -2, -5, -3, 6, 0, -6, -5, -7, 0, -1, 0, -5, 0, 0, -3, -17, 0, }, /* S */
+ { -1, -8, -5, -6, -9, -6, -7, -2, -3, -7, -4, -2, -4, -5, -6, 0, 7, -3, -13, -6, 0, -3, 0, -6, 0, 0, -4, -17, 0, }, /* T */
+ { -2, -6, -8, -6, -8, -5, -6, 2, -9, -2, -1, -8, -6, -7, -8, -6, -3, 7, -15, -7, 0, -8, 0, -6, 0, 0, -5, -17, 0, }, /* V */
+ { -13, -15, -15, -17, -4, -15, -7, -14, -12, -6, -13, -8, -14, -13, -2, -5, -13, -15, 13, -5, 0, -10, 0, -14, 0, 0, -11, -17, 0, }, /* W */
+ { -8, -4, -11, -8, 2, -14, -3, -6, -9, -7, -11, -4, -13, -12, -10, -7, -6, -7, -5, 10, 0, -6, 0, -9, 0, 0, -7, -17, 0, }, /* Y */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* - */
+ { -3, -12, 6, 1, -10, -3, -1, -6, -2, -9, -10, 6, -7, -3, -7, -1, -3, -8, -10, -6, 0, 6, 0, 0, 0, 0, -5, -17, 0, }, /* B */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* J */
+ { -3, -14, 1, 6, -13, -5, -1, -6, -4, -7, -5, -3, -4, 6, -4, -5, -6, -6, -14, -9, 0, 0, 0, 6, 0, 0, -5, -17, 0, }, /* Z */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* O */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* U */
+ { -3, -9, -5, -5, -8, -5, -5, -5, -5, -6, -5, -3, -5, -5, -6, -3, -4, -5, -11, -7, 0, -5, 0, -5, 0, 0, -5, -17, 0, }, /* X */
+ { -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, 0, -17, 0, -17, 0, 0, -17, 1, 0, }, /* * */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* ~ */
+ }},
+
+ { "PAM70", {
+ /* A C D E F G H I K L M N P Q R S T V W Y - B J Z O U X * ~ */
+ { 5, -4, -1, -1, -6, 0, -4, -2, -4, -4, -3, -2, 0, -2, -4, 1, 1, -1, -9, -5, 0, -1, 0, -1, 0, 0, -2, -11, 0, }, /* A */
+ { -4, 9, -9, -9, -8, -6, -5, -4, -9, -10, -9, -7, -5, -9, -5, -1, -5, -4, -11, -2, 0, -8, 0, -9, 0, 0, -6, -11, 0, }, /* C */
+ { -1, -9, 6, 3, -10, -1, -1, -5, -2, -8, -7, 3, -4, 0, -6, -1, -2, -5, -10, -7, 0, 5, 0, 2, 0, 0, -3, -11, 0, }, /* D */
+ { -1, -9, 3, 6, -9, -2, -2, -4, -2, -6, -4, 0, -3, 2, -5, -2, -3, -4, -11, -6, 0, 2, 0, 5, 0, 0, -3, -11, 0, }, /* E */
+ { -6, -8, -10, -9, 8, -7, -4, 0, -9, -1, -2, -6, -7, -9, -7, -4, -6, -5, -2, 4, 0, -7, 0, -9, 0, 0, -5, -11, 0, }, /* F */
+ { 0, -6, -1, -2, -7, 6, -6, -6, -5, -7, -6, -1, -3, -4, -6, 0, -3, -3, -10, -9, 0, -1, 0, -3, 0, 0, -3, -11, 0, }, /* G */
+ { -4, -5, -1, -2, -4, -6, 8, -6, -3, -4, -6, 1, -2, 2, 0, -3, -4, -4, -5, -1, 0, 0, 0, 1, 0, 0, -3, -11, 0, }, /* H */
+ { -2, -4, -5, -4, 0, -6, -6, 7, -4, 1, 1, -3, -5, -5, -3, -4, -1, 3, -9, -4, 0, -4, 0, -4, 0, 0, -3, -11, 0, }, /* I */
+ { -4, -9, -2, -2, -9, -5, -3, -4, 6, -5, 0, 0, -4, -1, 2, -2, -1, -6, -7, -7, 0, -1, 0, -2, 0, 0, -3, -11, 0, }, /* K */
+ { -4, -10, -8, -6, -1, -7, -4, 1, -5, 6, 2, -5, -5, -3, -6, -6, -4, 0, -4, -4, 0, -6, 0, -4, 0, 0, -4, -11, 0, }, /* L */
+ { -3, -9, -7, -4, -2, -6, -6, 1, 0, 2, 10, -5, -5, -2, -2, -3, -2, 0, -8, -7, 0, -6, 0, -3, 0, 0, -3, -11, 0, }, /* M */
+ { -2, -7, 3, 0, -6, -1, 1, -3, 0, -5, -5, 6, -3, -1, -3, 1, 0, -5, -6, -3, 0, 5, 0, -1, 0, 0, -2, -11, 0, }, /* N */
+ { 0, -5, -4, -3, -7, -3, -2, -5, -4, -5, -5, -3, 7, -1, -2, 0, -2, -3, -9, -9, 0, -4, 0, -2, 0, 0, -3, -11, 0, }, /* P */
+ { -2, -9, 0, 2, -9, -4, 2, -5, -1, -3, -2, -1, -1, 7, 0, -3, -3, -4, -8, -8, 0, -1, 0, 5, 0, 0, -2, -11, 0, }, /* Q */
+ { -4, -5, -6, -5, -7, -6, 0, -3, 2, -6, -2, -3, -2, 0, 8, -1, -4, -5, 0, -7, 0, -4, 0, -2, 0, 0, -3, -11, 0, }, /* R */
+ { 1, -1, -1, -2, -4, 0, -3, -4, -2, -6, -3, 1, 0, -3, -1, 5, 2, -3, -3, -5, 0, 0, 0, -2, 0, 0, -1, -11, 0, }, /* S */
+ { 1, -5, -2, -3, -6, -3, -4, -1, -1, -4, -2, 0, -2, -3, -4, 2, 6, -1, -8, -4, 0, -1, 0, -3, 0, 0, -2, -11, 0, }, /* T */
+ { -1, -4, -5, -4, -5, -3, -4, 3, -6, 0, 0, -5, -3, -4, -5, -3, -1, 6, -10, -5, 0, -5, 0, -4, 0, 0, -2, -11, 0, }, /* V */
+ { -9, -11, -10, -11, -2, -10, -5, -9, -7, -4, -8, -6, -9, -8, 0, -3, -8, -10, 13, -3, 0, -7, 0, -10, 0, 0, -7, -11, 0, }, /* W */
+ { -5, -2, -7, -6, 4, -9, -1, -4, -7, -4, -7, -3, -9, -8, -7, -5, -4, -5, -3, 9, 0, -4, 0, -7, 0, 0, -5, -11, 0, }, /* Y */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* - */
+ { -1, -8, 5, 2, -7, -1, 0, -4, -1, -6, -6, 5, -4, -1, -4, 0, -1, -5, -7, -4, 0, 5, 0, 1, 0, 0, -2, -11, 0, }, /* B */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* J */
+ { -1, -9, 2, 5, -9, -3, 1, -4, -2, -4, -3, -1, -2, 5, -2, -2, -3, -4, -10, -7, 0, 1, 0, 5, 0, 0, -3, -11, 0, }, /* Z */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* O */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* U */
+ { -2, -6, -3, -3, -5, -3, -3, -3, -3, -4, -3, -2, -3, -2, -3, -1, -2, -2, -7, -5, 0, -2, 0, -3, 0, 0, -3, -11, 0, }, /* X */
+ { -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, 0, -11, 0, -11, 0, 0, -11, 1, 0, }, /* * */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* ~ */
+ }},
+
+ { "PAM120", {
+ /* A C D E F G H I K L M N P Q R S T V W Y - B J Z O U X * ~ */
+ { 3, -3, 0, 0, -4, 1, -3, -1, -2, -3, -2, -1, 1, -1, -3, 1, 1, 0, -7, -4, 0, 0, 0, -1, 0, 0, -1, -8, 0, }, /* A */
+ { -3, 9, -7, -7, -6, -4, -4, -3, -7, -7, -6, -5, -4, -7, -4, 0, -3, -3, -8, -1, 0, -6, 0, -7, 0, 0, -4, -8, 0, }, /* C */
+ { 0, -7, 5, 3, -7, 0, 0, -3, -1, -5, -4, 2, -3, 1, -3, 0, -1, -3, -8, -5, 0, 4, 0, 3, 0, 0, -2, -8, 0, }, /* D */
+ { 0, -7, 3, 5, -7, -1, -1, -3, -1, -4, -3, 1, -2, 2, -3, -1, -2, -3, -8, -5, 0, 3, 0, 4, 0, 0, -1, -8, 0, }, /* E */
+ { -4, -6, -7, -7, 8, -5, -3, 0, -7, 0, -1, -4, -5, -6, -5, -3, -4, -3, -1, 4, 0, -5, 0, -6, 0, 0, -3, -8, 0, }, /* F */
+ { 1, -4, 0, -1, -5, 5, -4, -4, -3, -5, -4, 0, -2, -3, -4, 1, -1, -2, -8, -6, 0, 0, 0, -2, 0, 0, -2, -8, 0, }, /* G */
+ { -3, -4, 0, -1, -3, -4, 7, -4, -2, -3, -4, 2, -1, 3, 1, -2, -3, -3, -3, -1, 0, 1, 0, 1, 0, 0, -2, -8, 0, }, /* H */
+ { -1, -3, -3, -3, 0, -4, -4, 6, -3, 1, 1, -2, -3, -3, -2, -2, 0, 3, -6, -2, 0, -3, 0, -3, 0, 0, -1, -8, 0, }, /* I */
+ { -2, -7, -1, -1, -7, -3, -2, -3, 5, -4, 0, 1, -2, 0, 2, -1, -1, -4, -5, -5, 0, 0, 0, -1, 0, 0, -2, -8, 0, }, /* K */
+ { -3, -7, -5, -4, 0, -5, -3, 1, -4, 5, 3, -4, -3, -2, -4, -4, -3, 1, -3, -2, 0, -4, 0, -3, 0, 0, -2, -8, 0, }, /* L */
+ { -2, -6, -4, -3, -1, -4, -4, 1, 0, 3, 8, -3, -3, -1, -1, -2, -1, 1, -6, -4, 0, -4, 0, -2, 0, 0, -2, -8, 0, }, /* M */
+ { -1, -5, 2, 1, -4, 0, 2, -2, 1, -4, -3, 4, -2, 0, -1, 1, 0, -3, -4, -2, 0, 3, 0, 0, 0, 0, -1, -8, 0, }, /* N */
+ { 1, -4, -3, -2, -5, -2, -1, -3, -2, -3, -3, -2, 6, 0, -1, 1, -1, -2, -7, -6, 0, -2, 0, -1, 0, 0, -2, -8, 0, }, /* P */
+ { -1, -7, 1, 2, -6, -3, 3, -3, 0, -2, -1, 0, 0, 6, 1, -2, -2, -3, -6, -5, 0, 0, 0, 4, 0, 0, -1, -8, 0, }, /* Q */
+ { -3, -4, -3, -3, -5, -4, 1, -2, 2, -4, -1, -1, -1, 1, 6, -1, -2, -3, 1, -5, 0, -2, 0, -1, 0, 0, -2, -8, 0, }, /* R */
+ { 1, 0, 0, -1, -3, 1, -2, -2, -1, -4, -2, 1, 1, -2, -1, 3, 2, -2, -2, -3, 0, 0, 0, -1, 0, 0, -1, -8, 0, }, /* S */
+ { 1, -3, -1, -2, -4, -1, -3, 0, -1, -3, -1, 0, -1, -2, -2, 2, 4, 0, -6, -3, 0, 0, 0, -2, 0, 0, -1, -8, 0, }, /* T */
+ { 0, -3, -3, -3, -3, -2, -3, 3, -4, 1, 1, -3, -2, -3, -3, -2, 0, 5, -8, -3, 0, -3, 0, -3, 0, 0, -1, -8, 0, }, /* V */
+ { -7, -8, -8, -8, -1, -8, -3, -6, -5, -3, -6, -4, -7, -6, 1, -2, -6, -8, 12, -2, 0, -6, 0, -7, 0, 0, -5, -8, 0, }, /* W */
+ { -4, -1, -5, -5, 4, -6, -1, -2, -5, -2, -4, -2, -6, -5, -5, -3, -3, -3, -2, 8, 0, -3, 0, -5, 0, 0, -3, -8, 0, }, /* Y */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* - */
+ { 0, -6, 4, 3, -5, 0, 1, -3, 0, -4, -4, 3, -2, 0, -2, 0, 0, -3, -6, -3, 0, 4, 0, 2, 0, 0, -1, -8, 0, }, /* B */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* J */
+ { -1, -7, 3, 4, -6, -2, 1, -3, -1, -3, -2, 0, -1, 4, -1, -1, -2, -3, -7, -5, 0, 2, 0, 4, 0, 0, -1, -8, 0, }, /* Z */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* O */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* U */
+ { -1, -4, -2, -1, -3, -2, -2, -1, -2, -2, -2, -1, -2, -1, -2, -1, -1, -1, -5, -3, 0, -1, 0, -1, 0, 0, -2, -8, 0, }, /* X */
+ { -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, 0, -8, 0, -8, 0, 0, -8, 1, 0, }, /* * */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* ~ */
+ }},
+
+ { "PAM240", {
+ /* A C D E F G H I K L M N P Q R S T V W Y - B J Z O U X * ~ */
+ { 2, -2, 0, 0, -4, 1, -1, -1, -1, -2, -1, 0, 1, 0, -2, 1, 1, 0, -6, -4, 0, 0, 0, 0, 0, 0, 0, -8, 0, }, /* A */
+ { -2, 12, -5, -6, -5, -4, -4, -2, -6, -6, -5, -4, -3, -6, -4, 0, -2, -2, -8, 0, 0, -5, 0, -6, 0, 0, -3, -8, 0, }, /* C */
+ { 0, -5, 4, 4, -6, 1, 1, -2, 0, -4, -3, 2, -1, 2, -1, 0, 0, -2, -7, -4, 0, 3, 0, 3, 0, 0, -1, -8, 0, }, /* D */
+ { 0, -6, 4, 4, -6, 0, 1, -2, 0, -3, -2, 1, -1, 3, -1, 0, 0, -2, -7, -4, 0, 3, 0, 3, 0, 0, -1, -8, 0, }, /* E */
+ { -4, -5, -6, -6, 9, -5, -2, 1, -5, 2, 0, -4, -5, -5, -5, -3, -3, -1, 0, 7, 0, -5, 0, -5, 0, 0, -2, -8, 0, }, /* F */
+ { 1, -4, 1, 0, -5, 5, -2, -3, -2, -4, -3, 0, -1, -1, -3, 1, 0, -1, -7, -5, 0, 0, 0, 0, 0, 0, -1, -8, 0, }, /* G */
+ { -1, -4, 1, 1, -2, -2, 7, -3, 0, -2, -2, 2, 0, 3, 2, -1, -1, -2, -3, 0, 0, 1, 0, 2, 0, 0, -1, -8, 0, }, /* H */
+ { -1, -2, -2, -2, 1, -3, -3, 5, -2, 2, 2, -2, -2, -2, -2, -1, 0, 4, -5, -1, 0, -2, 0, -2, 0, 0, -1, -8, 0, }, /* I */
+ { -1, -6, 0, 0, -5, -2, 0, -2, 5, -3, 0, 1, -1, 1, 3, 0, 0, -3, -4, -5, 0, 1, 0, 0, 0, 0, -1, -8, 0, }, /* K */
+ { -2, -6, -4, -3, 2, -4, -2, 2, -3, 6, 4, -3, -3, -2, -3, -3, -2, 2, -2, -1, 0, -4, 0, -3, 0, 0, -1, -8, 0, }, /* L */
+ { -1, -5, -3, -2, 0, -3, -2, 2, 0, 4, 7, -2, -2, -1, 0, -2, -1, 2, -4, -3, 0, -2, 0, -2, 0, 0, -1, -8, 0, }, /* M */
+ { 0, -4, 2, 1, -4, 0, 2, -2, 1, -3, -2, 2, -1, 1, 0, 1, 0, -2, -4, -2, 0, 2, 0, 1, 0, 0, 0, -8, 0, }, /* N */
+ { 1, -3, -1, -1, -5, -1, 0, -2, -1, -3, -2, -1, 6, 0, 0, 1, 0, -1, -6, -5, 0, -1, 0, 0, 0, 0, -1, -8, 0, }, /* P */
+ { 0, -6, 2, 3, -5, -1, 3, -2, 1, -2, -1, 1, 0, 4, 1, -1, -1, -2, -5, -4, 0, 1, 0, 3, 0, 0, -1, -8, 0, }, /* Q */
+ { -2, -4, -1, -1, -5, -3, 2, -2, 3, -3, 0, 0, 0, 1, 6, 0, -1, -3, 2, -4, 0, -1, 0, 0, 0, 0, -1, -8, 0, }, /* R */
+ { 1, 0, 0, 0, -3, 1, -1, -1, 0, -3, -2, 1, 1, -1, 0, 2, 1, -1, -3, -3, 0, 0, 0, 0, 0, 0, 0, -8, 0, }, /* S */
+ { 1, -2, 0, 0, -3, 0, -1, 0, 0, -2, -1, 0, 0, -1, -1, 1, 3, 0, -5, -3, 0, 0, 0, -1, 0, 0, 0, -8, 0, }, /* T */
+ { 0, -2, -2, -2, -1, -1, -2, 4, -3, 2, 2, -2, -1, -2, -3, -1, 0, 4, -6, -3, 0, -2, 0, -2, 0, 0, -1, -8, 0, }, /* V */
+ { -6, -8, -7, -7, 0, -7, -3, -5, -4, -2, -4, -4, -6, -5, 2, -3, -5, -6, 17, 0, 0, -5, 0, -6, 0, 0, -4, -8, 0, }, /* W */
+ { -4, 0, -4, -4, 7, -5, 0, -1, -5, -1, -3, -2, -5, -4, -4, -3, -3, -3, 0, 10, 0, -3, 0, -4, 0, 0, -2, -8, 0, }, /* Y */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* - */
+ { 0, -5, 3, 3, -5, 0, 1, -2, 1, -4, -2, 2, -1, 1, -1, 0, 0, -2, -5, -3, 0, 3, 0, 2, 0, 0, -1, -8, 0, }, /* B */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* J */
+ { 0, -6, 3, 3, -5, 0, 2, -2, 0, -3, -2, 1, 0, 3, 0, 0, -1, -2, -6, -4, 0, 2, 0, 3, 0, 0, -1, -8, 0, }, /* Z */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* O */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* U */
+ { 0, -3, -1, -1, -2, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, 0, 0, -1, -4, -2, 0, -1, 0, -1, 0, 0, -1, -8, 0, }, /* X */
+ { -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, 0, -8, 0, -8, 0, 0, -8, 1, 0, }, /* * */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* ~ */
+ }},
+
+ { "BLOSUM45", {
+ /* A C D E F G H I K L M N P Q R S T V W Y - B J Z O U X * ~ */
+ { 5, -1, -2, -1, -2, 0, -2, -1, -1, -1, -1, -1, -1, -1, -2, 1, 0, 0, -2, -2, 0, -1, 0, -1, 0, 0, 0, -5, 0, }, /* A */
+ { -1, 12, -3, -3, -2, -3, -3, -3, -3, -2, -2, -2, -4, -3, -3, -1, -1, -1, -5, -3, 0, -2, 0, -3, 0, 0, -2, -5, 0, }, /* C */
+ { -2, -3, 7, 2, -4, -1, 0, -4, 0, -3, -3, 2, -1, 0, -1, 0, -1, -3, -4, -2, 0, 5, 0, 1, 0, 0, -1, -5, 0, }, /* D */
+ { -1, -3, 2, 6, -3, -2, 0, -3, 1, -2, -2, 0, 0, 2, 0, 0, -1, -3, -3, -2, 0, 1, 0, 4, 0, 0, -1, -5, 0, }, /* E */
+ { -2, -2, -4, -3, 8, -3, -2, 0, -3, 1, 0, -2, -3, -4, -2, -2, -1, 0, 1, 3, 0, -3, 0, -3, 0, 0, -1, -5, 0, }, /* F */
+ { 0, -3, -1, -2, -3, 7, -2, -4, -2, -3, -2, 0, -2, -2, -2, 0, -2, -3, -2, -3, 0, -1, 0, -2, 0, 0, -1, -5, 0, }, /* G */
+ { -2, -3, 0, 0, -2, -2, 10, -3, -1, -2, 0, 1, -2, 1, 0, -1, -2, -3, -3, 2, 0, 0, 0, 0, 0, 0, -1, -5, 0, }, /* H */
+ { -1, -3, -4, -3, 0, -4, -3, 5, -3, 2, 2, -2, -2, -2, -3, -2, -1, 3, -2, 0, 0, -3, 0, -3, 0, 0, -1, -5, 0, }, /* I */
+ { -1, -3, 0, 1, -3, -2, -1, -3, 5, -3, -1, 0, -1, 1, 3, -1, -1, -2, -2, -1, 0, 0, 0, 1, 0, 0, -1, -5, 0, }, /* K */
+ { -1, -2, -3, -2, 1, -3, -2, 2, -3, 5, 2, -3, -3, -2, -2, -3, -1, 1, -2, 0, 0, -3, 0, -2, 0, 0, -1, -5, 0, }, /* L */
+ { -1, -2, -3, -2, 0, -2, 0, 2, -1, 2, 6, -2, -2, 0, -1, -2, -1, 1, -2, 0, 0, -2, 0, -1, 0, 0, -1, -5, 0, }, /* M */
+ { -1, -2, 2, 0, -2, 0, 1, -2, 0, -3, -2, 6, -2, 0, 0, 1, 0, -3, -4, -2, 0, 4, 0, 0, 0, 0, -1, -5, 0, }, /* N */
+ { -1, -4, -1, 0, -3, -2, -2, -2, -1, -3, -2, -2, 9, -1, -2, -1, -1, -3, -3, -3, 0, -2, 0, -1, 0, 0, -1, -5, 0, }, /* P */
+ { -1, -3, 0, 2, -4, -2, 1, -2, 1, -2, 0, 0, -1, 6, 1, 0, -1, -3, -2, -1, 0, 0, 0, 4, 0, 0, -1, -5, 0, }, /* Q */
+ { -2, -3, -1, 0, -2, -2, 0, -3, 3, -2, -1, 0, -2, 1, 7, -1, -1, -2, -2, -1, 0, -1, 0, 0, 0, 0, -1, -5, 0, }, /* R */
+ { 1, -1, 0, 0, -2, 0, -1, -2, -1, -3, -2, 1, -1, 0, -1, 4, 2, -1, -4, -2, 0, 0, 0, 0, 0, 0, 0, -5, 0, }, /* S */
+ { 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, 0, -1, -1, -1, 2, 5, 0, -3, -1, 0, 0, 0, -1, 0, 0, 0, -5, 0, }, /* T */
+ { 0, -1, -3, -3, 0, -3, -3, 3, -2, 1, 1, -3, -3, -3, -2, -1, 0, 5, -3, -1, 0, -3, 0, -3, 0, 0, -1, -5, 0, }, /* V */
+ { -2, -5, -4, -3, 1, -2, -3, -2, -2, -2, -2, -4, -3, -2, -2, -4, -3, -3, 15, 3, 0, -4, 0, -2, 0, 0, -2, -5, 0, }, /* W */
+ { -2, -3, -2, -2, 3, -3, 2, 0, -1, 0, 0, -2, -3, -1, -1, -2, -1, -1, 3, 8, 0, -2, 0, -2, 0, 0, -1, -5, 0, }, /* Y */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* - */
+ { -1, -2, 5, 1, -3, -1, 0, -3, 0, -3, -2, 4, -2, 0, -1, 0, 0, -3, -4, -2, 0, 4, 0, 2, 0, 0, -1, -5, 0, }, /* B */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* J */
+ { -1, -3, 1, 4, -3, -2, 0, -3, 1, -2, -1, 0, -1, 4, 0, 0, -1, -3, -2, -2, 0, 2, 0, 4, 0, 0, -1, -5, 0, }, /* Z */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* O */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* U */
+ { 0, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -2, -1, 0, -1, 0, -1, 0, 0, -1, -5, 0, }, /* X */
+ { -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, 0, -5, 0, -5, 0, 0, -5, 1, 0, }, /* * */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* ~ */
+ }},
+
+ { "BLOSUM50", {
+ /* A C D E F G H I K L M N P Q R S T V W Y - B J Z O U X * ~ */
+ { 5, -1, -2, -1, -3, 0, -2, -1, -1, -2, -1, -1, -1, -1, -2, 1, 0, 0, -3, -2, 0, -2, 0, -1, 0, 0, -1, -5, 0, }, /* A */
+ { -1, 13, -4, -3, -2, -3, -3, -2, -3, -2, -2, -2, -4, -3, -4, -1, -1, -1, -5, -3, 0, -3, 0, -3, 0, 0, -2, -5, 0, }, /* C */
+ { -2, -4, 8, 2, -5, -1, -1, -4, -1, -4, -4, 2, -1, 0, -2, 0, -1, -4, -5, -3, 0, 5, 0, 1, 0, 0, -1, -5, 0, }, /* D */
+ { -1, -3, 2, 6, -3, -3, 0, -4, 1, -3, -2, 0, -1, 2, 0, -1, -1, -3, -3, -2, 0, 1, 0, 5, 0, 0, -1, -5, 0, }, /* E */
+ { -3, -2, -5, -3, 8, -4, -1, 0, -4, 1, 0, -4, -4, -4, -3, -3, -2, -1, 1, 4, 0, -4, 0, -4, 0, 0, -2, -5, 0, }, /* F */
+ { 0, -3, -1, -3, -4, 8, -2, -4, -2, -4, -3, 0, -2, -2, -3, 0, -2, -4, -3, -3, 0, -1, 0, -2, 0, 0, -2, -5, 0, }, /* G */
+ { -2, -3, -1, 0, -1, -2, 10, -4, 0, -3, -1, 1, -2, 1, 0, -1, -2, -4, -3, 2, 0, 0, 0, 0, 0, 0, -1, -5, 0, }, /* H */
+ { -1, -2, -4, -4, 0, -4, -4, 5, -3, 2, 2, -3, -3, -3, -4, -3, -1, 4, -3, -1, 0, -4, 0, -3, 0, 0, -1, -5, 0, }, /* I */
+ { -1, -3, -1, 1, -4, -2, 0, -3, 6, -3, -2, 0, -1, 2, 3, 0, -1, -3, -3, -2, 0, 0, 0, 1, 0, 0, -1, -5, 0, }, /* K */
+ { -2, -2, -4, -3, 1, -4, -3, 2, -3, 5, 3, -4, -4, -2, -3, -3, -1, 1, -2, -1, 0, -4, 0, -3, 0, 0, -1, -5, 0, }, /* L */
+ { -1, -2, -4, -2, 0, -3, -1, 2, -2, 3, 7, -2, -3, 0, -2, -2, -1, 1, -1, 0, 0, -3, 0, -1, 0, 0, -1, -5, 0, }, /* M */
+ { -1, -2, 2, 0, -4, 0, 1, -3, 0, -4, -2, 7, -2, 0, -1, 1, 0, -3, -4, -2, 0, 4, 0, 0, 0, 0, -1, -5, 0, }, /* N */
+ { -1, -4, -1, -1, -4, -2, -2, -3, -1, -4, -3, -2, 10, -1, -3, -1, -1, -3, -4, -3, 0, -2, 0, -1, 0, 0, -2, -5, 0, }, /* P */
+ { -1, -3, 0, 2, -4, -2, 1, -3, 2, -2, 0, 0, -1, 7, 1, 0, -1, -3, -1, -1, 0, 0, 0, 4, 0, 0, -1, -5, 0, }, /* Q */
+ { -2, -4, -2, 0, -3, -3, 0, -4, 3, -3, -2, -1, -3, 1, 7, -1, -1, -3, -3, -1, 0, -1, 0, 0, 0, 0, -1, -5, 0, }, /* R */
+ { 1, -1, 0, -1, -3, 0, -1, -3, 0, -3, -2, 1, -1, 0, -1, 5, 2, -2, -4, -2, 0, 0, 0, 0, 0, 0, -1, -5, 0, }, /* S */
+ { 0, -1, -1, -1, -2, -2, -2, -1, -1, -1, -1, 0, -1, -1, -1, 2, 5, 0, -3, -2, 0, 0, 0, -1, 0, 0, 0, -5, 0, }, /* T */
+ { 0, -1, -4, -3, -1, -4, -4, 4, -3, 1, 1, -3, -3, -3, -3, -2, 0, 5, -3, -1, 0, -4, 0, -3, 0, 0, -1, -5, 0, }, /* V */
+ { -3, -5, -5, -3, 1, -3, -3, -3, -3, -2, -1, -4, -4, -1, -3, -4, -3, -3, 15, 2, 0, -5, 0, -2, 0, 0, -3, -5, 0, }, /* W */
+ { -2, -3, -3, -2, 4, -3, 2, -1, -2, -1, 0, -2, -3, -1, -1, -2, -2, -1, 2, 8, 0, -3, 0, -2, 0, 0, -1, -5, 0, }, /* Y */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* - */
+ { -2, -3, 5, 1, -4, -1, 0, -4, 0, -4, -3, 4, -2, 0, -1, 0, 0, -4, -5, -3, 0, 5, 0, 2, 0, 0, -1, -5, 0, }, /* B */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* J */
+ { -1, -3, 1, 5, -4, -2, 0, -3, 1, -3, -1, 0, -1, 4, 0, 0, -1, -3, -2, -2, 0, 2, 0, 5, 0, 0, -1, -5, 0, }, /* Z */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* O */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* U */
+ { -1, -2, -1, -1, -2, -2, -1, -1, -1, -1, -1, -1, -2, -1, -1, -1, 0, -1, -3, -1, 0, -1, 0, -1, 0, 0, -1, -5, 0, }, /* X */
+ { -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, 0, -5, 0, -5, 0, 0, -5, 1, 0, }, /* * */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* ~ */
+ }},
+
+ { "BLOSUM62", {
+ /* A C D E F G H I K L M N P Q R S T V W Y - B J Z O U X * ~ */
+ { 4, 0, -2, -1, -2, 0, -2, -1, -1, -1, -1, -2, -1, -1, -1, 1, 0, 0, -3, -2, 0, -2, 0, -1, 0, 0, 0, -4, 0, }, /* A */
+ { 0, 9, -3, -4, -2, -3, -3, -1, -3, -1, -1, -3, -3, -3, -3, -1, -1, -1, -2, -2, 0, -3, 0, -3, 0, 0, -2, -4, 0, }, /* C */
+ { -2, -3, 6, 2, -3, -1, -1, -3, -1, -4, -3, 1, -1, 0, -2, 0, -1, -3, -4, -3, 0, 4, 0, 1, 0, 0, -1, -4, 0, }, /* D */
+ { -1, -4, 2, 5, -3, -2, 0, -3, 1, -3, -2, 0, -1, 2, 0, 0, -1, -2, -3, -2, 0, 1, 0, 4, 0, 0, -1, -4, 0, }, /* E */
+ { -2, -2, -3, -3, 6, -3, -1, 0, -3, 0, 0, -3, -4, -3, -3, -2, -2, -1, 1, 3, 0, -3, 0, -3, 0, 0, -1, -4, 0, }, /* F */
+ { 0, -3, -1, -2, -3, 6, -2, -4, -2, -4, -3, 0, -2, -2, -2, 0, -2, -3, -2, -3, 0, -1, 0, -2, 0, 0, -1, -4, 0, }, /* G */
+ { -2, -3, -1, 0, -1, -2, 8, -3, -1, -3, -2, 1, -2, 0, 0, -1, -2, -3, -2, 2, 0, 0, 0, 0, 0, 0, -1, -4, 0, }, /* H */
+ { -1, -1, -3, -3, 0, -4, -3, 4, -3, 2, 1, -3, -3, -3, -3, -2, -1, 3, -3, -1, 0, -3, 0, -3, 0, 0, -1, -4, 0, }, /* I */
+ { -1, -3, -1, 1, -3, -2, -1, -3, 5, -2, -1, 0, -1, 1, 2, 0, -1, -2, -3, -2, 0, 0, 0, 1, 0, 0, -1, -4, 0, }, /* K */
+ { -1, -1, -4, -3, 0, -4, -3, 2, -2, 4, 2, -3, -3, -2, -2, -2, -1, 1, -2, -1, 0, -4, 0, -3, 0, 0, -1, -4, 0, }, /* L */
+ { -1, -1, -3, -2, 0, -3, -2, 1, -1, 2, 5, -2, -2, 0, -1, -1, -1, 1, -1, -1, 0, -3, 0, -1, 0, 0, -1, -4, 0, }, /* M */
+ { -2, -3, 1, 0, -3, 0, 1, -3, 0, -3, -2, 6, -2, 0, 0, 1, 0, -3, -4, -2, 0, 3, 0, 0, 0, 0, -1, -4, 0, }, /* N */
+ { -1, -3, -1, -1, -4, -2, -2, -3, -1, -3, -2, -2, 7, -1, -2, -1, -1, -2, -4, -3, 0, -2, 0, -1, 0, 0, -2, -4, 0, }, /* P */
+ { -1, -3, 0, 2, -3, -2, 0, -3, 1, -2, 0, 0, -1, 5, 1, 0, -1, -2, -2, -1, 0, 0, 0, 3, 0, 0, -1, -4, 0, }, /* Q */
+ { -1, -3, -2, 0, -3, -2, 0, -3, 2, -2, -1, 0, -2, 1, 5, -1, -1, -3, -3, -2, 0, -1, 0, 0, 0, 0, -1, -4, 0, }, /* R */
+ { 1, -1, 0, 0, -2, 0, -1, -2, 0, -2, -1, 1, -1, 0, -1, 4, 1, -2, -3, -2, 0, 0, 0, 0, 0, 0, 0, -4, 0, }, /* S */
+ { 0, -1, -1, -1, -2, -2, -2, -1, -1, -1, -1, 0, -1, -1, -1, 1, 5, 0, -2, -2, 0, -1, 0, -1, 0, 0, 0, -4, 0, }, /* T */
+ { 0, -1, -3, -2, -1, -3, -3, 3, -2, 1, 1, -3, -2, -2, -3, -2, 0, 4, -3, -1, 0, -3, 0, -2, 0, 0, -1, -4, 0, }, /* V */
+ { -3, -2, -4, -3, 1, -2, -2, -3, -3, -2, -1, -4, -4, -2, -3, -3, -2, -3, 11, 2, 0, -4, 0, -3, 0, 0, -2, -4, 0, }, /* W */
+ { -2, -2, -3, -2, 3, -3, 2, -1, -2, -1, -1, -2, -3, -1, -2, -2, -2, -1, 2, 7, 0, -3, 0, -2, 0, 0, -1, -4, 0, }, /* Y */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* - */
+ { -2, -3, 4, 1, -3, -1, 0, -3, 0, -4, -3, 3, -2, 0, -1, 0, -1, -3, -4, -3, 0, 4, 0, 1, 0, 0, -1, -4, 0, }, /* B */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* J */
+ { -1, -3, 1, 4, -3, -2, 0, -3, 1, -3, -1, 0, -1, 3, 0, 0, -1, -2, -3, -2, 0, 1, 0, 4, 0, 0, -1, -4, 0, }, /* Z */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* O */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* U */
+ { 0, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, 0, 0, -1, -2, -1, 0, -1, 0, -1, 0, 0, -1, -4, 0, }, /* X */
+ { -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 0, -4, 0, -4, 0, 0, -4, 1, 0, }, /* * */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* ~ */
+ }},
+
+ { "BLOSUM80", {
+ /* A C D E F G H I K L M N P Q R S T V W Y - B J Z O U X * ~ */
+ { 7, -1, -3, -2, -4, 0, -3, -3, -1, -3, -2, -3, -1, -2, -3, 2, 0, -1, -5, -4, 0, -3, 0, -2, 0, 0, -1, -8, 0, }, /* A */
+ { -1, 13, -7, -7, -4, -6, -7, -2, -6, -3, -3, -5, -6, -5, -6, -2, -2, -2, -5, -5, 0, -6, 0, -7, 0, 0, -4, -8, 0, }, /* C */
+ { -3, -7, 10, 2, -6, -3, -2, -7, -2, -7, -6, 2, -3, -1, -3, -1, -2, -6, -8, -6, 0, 6, 0, 1, 0, 0, -3, -8, 0, }, /* D */
+ { -2, -7, 2, 8, -6, -4, 0, -6, 1, -6, -4, -1, -2, 3, -1, -1, -2, -4, -6, -5, 0, 1, 0, 6, 0, 0, -2, -8, 0, }, /* E */
+ { -4, -4, -6, -6, 10, -6, -2, -1, -5, 0, 0, -6, -6, -5, -5, -4, -4, -2, 0, 4, 0, -6, 0, -6, 0, 0, -3, -8, 0, }, /* F */
+ { 0, -6, -3, -4, -6, 9, -4, -7, -3, -7, -5, -1, -5, -4, -4, -1, -3, -6, -6, -6, 0, -2, 0, -4, 0, 0, -3, -8, 0, }, /* G */
+ { -3, -7, -2, 0, -2, -4, 12, -6, -1, -5, -4, 1, -4, 1, 0, -2, -3, -5, -4, 3, 0, -1, 0, 0, 0, 0, -2, -8, 0, }, /* H */
+ { -3, -2, -7, -6, -1, -7, -6, 7, -5, 2, 2, -6, -5, -5, -5, -4, -2, 4, -5, -3, 0, -6, 0, -6, 0, 0, -2, -8, 0, }, /* I */
+ { -1, -6, -2, 1, -5, -3, -1, -5, 8, -4, -3, 0, -2, 2, 3, -1, -1, -4, -6, -4, 0, -1, 0, 1, 0, 0, -2, -8, 0, }, /* K */
+ { -3, -3, -7, -6, 0, -7, -5, 2, -4, 6, 3, -6, -5, -4, -4, -4, -3, 1, -4, -2, 0, -7, 0, -5, 0, 0, -2, -8, 0, }, /* L */
+ { -2, -3, -6, -4, 0, -5, -4, 2, -3, 3, 9, -4, -4, -1, -3, -3, -1, 1, -3, -3, 0, -5, 0, -3, 0, 0, -2, -8, 0, }, /* M */
+ { -3, -5, 2, -1, -6, -1, 1, -6, 0, -6, -4, 9, -4, 0, -1, 1, 0, -5, -7, -4, 0, 5, 0, -1, 0, 0, -2, -8, 0, }, /* N */
+ { -1, -6, -3, -2, -6, -5, -4, -5, -2, -5, -4, -4, 12, -3, -3, -2, -3, -4, -7, -6, 0, -4, 0, -2, 0, 0, -3, -8, 0, }, /* P */
+ { -2, -5, -1, 3, -5, -4, 1, -5, 2, -4, -1, 0, -3, 9, 1, -1, -1, -4, -4, -3, 0, -1, 0, 5, 0, 0, -2, -8, 0, }, /* Q */
+ { -3, -6, -3, -1, -5, -4, 0, -5, 3, -4, -3, -1, -3, 1, 9, -2, -2, -4, -5, -4, 0, -2, 0, 0, 0, 0, -2, -8, 0, }, /* R */
+ { 2, -2, -1, -1, -4, -1, -2, -4, -1, -4, -3, 1, -2, -1, -2, 7, 2, -3, -6, -3, 0, 0, 0, -1, 0, 0, -1, -8, 0, }, /* S */
+ { 0, -2, -2, -2, -4, -3, -3, -2, -1, -3, -1, 0, -3, -1, -2, 2, 8, 0, -5, -3, 0, -1, 0, -2, 0, 0, -1, -8, 0, }, /* T */
+ { -1, -2, -6, -4, -2, -6, -5, 4, -4, 1, 1, -5, -4, -4, -4, -3, 0, 7, -5, -3, 0, -6, 0, -4, 0, 0, -2, -8, 0, }, /* V */
+ { -5, -5, -8, -6, 0, -6, -4, -5, -6, -4, -3, -7, -7, -4, -5, -6, -5, -5, 16, 3, 0, -8, 0, -5, 0, 0, -5, -8, 0, }, /* W */
+ { -4, -5, -6, -5, 4, -6, 3, -3, -4, -2, -3, -4, -6, -3, -4, -3, -3, -3, 3, 11, 0, -5, 0, -4, 0, 0, -3, -8, 0, }, /* Y */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* - */
+ { -3, -6, 6, 1, -6, -2, -1, -6, -1, -7, -5, 5, -4, -1, -2, 0, -1, -6, -8, -5, 0, 6, 0, 0, 0, 0, -3, -8, 0, }, /* B */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* J */
+ { -2, -7, 1, 6, -6, -4, 0, -6, 1, -5, -3, -1, -2, 5, 0, -1, -2, -4, -5, -4, 0, 0, 0, 6, 0, 0, -1, -8, 0, }, /* Z */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* O */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* U */
+ { -1, -4, -3, -2, -3, -3, -2, -2, -2, -2, -2, -2, -3, -2, -2, -1, -1, -2, -5, -3, 0, -3, 0, -1, 0, 0, -2, -8, 0, }, /* X */
+ { -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, 0, -8, 0, -8, 0, 0, -8, 1, 0, }, /* * */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* ~ */
+ }},
+
+ { "BLOSUM90", {
+ /* A C D E F G H I K L M N P Q R S T V W Y - B J Z O U X * ~ */
+ { 5, -1, -3, -1, -3, 0, -2, -2, -1, -2, -2, -2, -1, -1, -2, 1, 0, -1, -4, -3, 0, -2, 0, -1, 0, 0, -1, -6, 0, }, /* A */
+ { -1, 9, -5, -6, -3, -4, -5, -2, -4, -2, -2, -4, -4, -4, -5, -2, -2, -2, -4, -4, 0, -4, 0, -5, 0, 0, -3, -6, 0, }, /* C */
+ { -3, -5, 7, 1, -5, -2, -2, -5, -1, -5, -4, 1, -3, -1, -3, -1, -2, -5, -6, -4, 0, 4, 0, 0, 0, 0, -2, -6, 0, }, /* D */
+ { -1, -6, 1, 6, -5, -3, -1, -4, 0, -4, -3, -1, -2, 2, -1, -1, -1, -3, -5, -4, 0, 0, 0, 4, 0, 0, -2, -6, 0, }, /* E */
+ { -3, -3, -5, -5, 7, -5, -2, -1, -4, 0, -1, -4, -4, -4, -4, -3, -3, -2, 0, 3, 0, -4, 0, -4, 0, 0, -2, -6, 0, }, /* F */
+ { 0, -4, -2, -3, -5, 6, -3, -5, -2, -5, -4, -1, -3, -3, -3, -1, -3, -5, -4, -5, 0, -2, 0, -3, 0, 0, -2, -6, 0, }, /* G */
+ { -2, -5, -2, -1, -2, -3, 8, -4, -1, -4, -3, 0, -3, 1, 0, -2, -2, -4, -3, 1, 0, -1, 0, 0, 0, 0, -2, -6, 0, }, /* H */
+ { -2, -2, -5, -4, -1, -5, -4, 5, -4, 1, 1, -4, -4, -4, -4, -3, -1, 3, -4, -2, 0, -5, 0, -4, 0, 0, -2, -6, 0, }, /* I */
+ { -1, -4, -1, 0, -4, -2, -1, -4, 6, -3, -2, 0, -2, 1, 2, -1, -1, -3, -5, -3, 0, -1, 0, 1, 0, 0, -1, -6, 0, }, /* K */
+ { -2, -2, -5, -4, 0, -5, -4, 1, -3, 5, 2, -4, -4, -3, -3, -3, -2, 0, -3, -2, 0, -5, 0, -4, 0, 0, -2, -6, 0, }, /* L */
+ { -2, -2, -4, -3, -1, -4, -3, 1, -2, 2, 7, -3, -3, 0, -2, -2, -1, 0, -2, -2, 0, -4, 0, -2, 0, 0, -1, -6, 0, }, /* M */
+ { -2, -4, 1, -1, -4, -1, 0, -4, 0, -4, -3, 7, -3, 0, -1, 0, 0, -4, -5, -3, 0, 4, 0, -1, 0, 0, -2, -6, 0, }, /* N */
+ { -1, -4, -3, -2, -4, -3, -3, -4, -2, -4, -3, -3, 8, -2, -3, -2, -2, -3, -5, -4, 0, -3, 0, -2, 0, 0, -2, -6, 0, }, /* P */
+ { -1, -4, -1, 2, -4, -3, 1, -4, 1, -3, 0, 0, -2, 7, 1, -1, -1, -3, -3, -3, 0, -1, 0, 4, 0, 0, -1, -6, 0, }, /* Q */
+ { -2, -5, -3, -1, -4, -3, 0, -4, 2, -3, -2, -1, -3, 1, 6, -1, -2, -3, -4, -3, 0, -2, 0, 0, 0, 0, -2, -6, 0, }, /* R */
+ { 1, -2, -1, -1, -3, -1, -2, -3, -1, -3, -2, 0, -2, -1, -1, 5, 1, -2, -4, -3, 0, 0, 0, -1, 0, 0, -1, -6, 0, }, /* S */
+ { 0, -2, -2, -1, -3, -3, -2, -1, -1, -2, -1, 0, -2, -1, -2, 1, 6, -1, -4, -2, 0, -1, 0, -1, 0, 0, -1, -6, 0, }, /* T */
+ { -1, -2, -5, -3, -2, -5, -4, 3, -3, 0, 0, -4, -3, -3, -3, -2, -1, 5, -3, -3, 0, -4, 0, -3, 0, 0, -2, -6, 0, }, /* V */
+ { -4, -4, -6, -5, 0, -4, -3, -4, -5, -3, -2, -5, -5, -3, -4, -4, -4, -3, 11, 2, 0, -6, 0, -4, 0, 0, -3, -6, 0, }, /* W */
+ { -3, -4, -4, -4, 3, -5, 1, -2, -3, -2, -2, -3, -4, -3, -3, -3, -2, -3, 2, 8, 0, -4, 0, -3, 0, 0, -2, -6, 0, }, /* Y */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* - */
+ { -2, -4, 4, 0, -4, -2, -1, -5, -1, -5, -4, 4, -3, -1, -2, 0, -1, -4, -6, -4, 0, 4, 0, 0, 0, 0, -2, -6, 0, }, /* B */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* J */
+ { -1, -5, 0, 4, -4, -3, 0, -4, 1, -4, -2, -1, -2, 4, 0, -1, -1, -3, -4, -3, 0, 0, 0, 4, 0, 0, -1, -6, 0, }, /* Z */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* O */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* U */
+ { -1, -3, -2, -2, -2, -2, -2, -2, -1, -2, -1, -2, -2, -1, -2, -1, -1, -2, -3, -2, 0, -2, 0, -1, 0, 0, -2, -6, 0, }, /* X */
+ { -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, 0, -6, 0, -6, 0, 0, -6, 1, 0, }, /* * */
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* ~ */
+ }},
+};
+
+
+#define eslNTDIM 18
+
+struct esl_scorematrix_nt_preload_s {
+ char *name;
+ int matrix[eslNTDIM][eslNTDIM];
+};
+
+static const struct esl_scorematrix_nt_preload_s ESL_SCOREMATRIX_NT_PRELOADS[] = {
+ { "DNA1", {
+ /* A C G T - R Y M K S W H B V D N * ~ */
+ { 41, -32, -26, -26, 0, 18, -29, 17, -26, -29, 18, 6, -28, 6, 7, 0, -38, 0, }, /*A*/
+ { -32, 39, -38, -17, 0, -35, 18, 15, -26, 14, -24, 6, 6, 3, -28, -1, -38, 0, }, /*C*/
+ { -26, -38, 46, -31, 0, 22, -34, -32, 21, 20, -29, -32, 8, 9, 10, 1, -38, 0, }, /*G*/
+ { -26, -17, -31, 39, 0, -28, 18, -21, 15, -23, 16, 7, 7, -24, 5, 0, -38, 0, }, /*T*/
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /*-*/
+ { 18, -35, 22, -28, 0, 20, -32, -2, 3, 1, 0, -9, -7, 7, 8, 1, -38, 0, }, /*R*/
+ { -29, 18, -34, 18, 0, -32, 18, 0, -1, -1, 0, 7, 6, -9, -9, -1, -38, 0, }, /*Y*/
+ { 17, 15, -32, -21, 0, -2, 0, 16, -26, -3, 1, 6, -8, 4, -7, -1, -38, 0, }, /*M*/
+ { -26, -26, 21, 15, 0, 3, -1, -26, 18, 3, -1, -8, 7, -5, 7, 1, -38, 0, }, /*K*/
+ { -29, 14, 20, -23, 0, 1, -1, -3, 3, 17, -26, -9, 7, 6, -6, 0, -38, 0, }, /*S*/
+ { 18, -24, -29, 16, 0, 0, 0, 1, -1, -26, 17, 7, -8, -7, 6, 0, -38, 0, }, /*W*/
+ { 6, 6, -32, 7, 0, -9, 7, 6, -8, -9, 7, 7, -3, -3, -3, 0, -38, 0, }, /*H*/
+ { -28, 6, 8, 7, 0, -7, 6, -8, 7, 7, -8, -3, 7, -2, -2, 0, -38, 0, }, /*B*/
+ { 6, 3, 9, -24, 0, 7, -9, 4, -5, 6, -7, -3, -2, 6, -1, 0, -38, 0, }, /*V*/
+ { 7, -28, 10, 5, 0, 8, -9, -7, 7, -6, 6, -3, -2, -1, 7, 0, -38, 0, }, /*D*/
+ { 0, -1, 1, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /*N*/
+ { -38, -38, -38, -38, 0, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, 0, -38, 0, }, /***/
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /*~*/
+ }},
+
+};
+
+
+
+
+
+
+/* Function: esl_scorematrix_Set()
+ * Synopsis: Set one of several standard matrices.
+ *
+ * Purpose: Set the allocated score matrix <S> to standard score
+ * matrix <name>, where <name> is the name of one of
+ * several matrices built-in to Easel. For example,
+ * <esl_scorematrix_Set("BLOSUM62", S)>.
+ *
+ * The alphabet for <S> (<S->abc_r>) must be set already.
+ *
+ * Built-in amino acid score matrices in Easel include
+ * BLOSUM45, BLOSUM50, BLOSUM62, BLOSUM80, BLOSUM90, PAM30,
+ * PAM70, PAM120, and PAM240.
+ *
+ * Returns: <eslOK> on success, and the scores in <S> are set.
+ *
+ * <eslENOTFOUND> if <name> is not available as a built-in matrix
+ * for the alphabet that's set in <S>.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_scorematrix_Set(const char *name, ESL_SCOREMATRIX *S)
+{
+ int which;
+ int x, y;
+
+ if (S->abc_r->type == eslAMINO)
+ {
+ int nmat = sizeof(ESL_SCOREMATRIX_AA_PRELOADS) / sizeof(struct esl_scorematrix_aa_preload_s);
+ for (which = 0; which < nmat; which++)
+ if (strcmp(ESL_SCOREMATRIX_AA_PRELOADS[which].name, name) == 0) break;
+ if (which >= nmat) return eslENOTFOUND;
+
+ ESL_DASSERT1(( S->Kp >= 24 )); // strcpy below is safe. The assertion tries to convince static analyzer of that.
+ strcpy(S->outorder, "ARNDCQEGHILKMFPSTWYVBZX*");
+ /* All standard PAM, BLOSUM matrices have same list of valid
+ * residues. If that ever changes, make <outorder> a data elem in the
+ * structures above.
+ */
+
+ /* Transfer scores from static built-in storage */
+ for (x = 0; x < S->Kp; x++)
+ for (y = 0; y < S->Kp; y++)
+ S->s[x][y] = ESL_SCOREMATRIX_AA_PRELOADS[which].matrix[x][y];
+
+ }
+ else if (S->abc_r->type == eslDNA || S->abc_r->type == eslRNA)
+ {
+ int nmat = sizeof(ESL_SCOREMATRIX_NT_PRELOADS) / sizeof(struct esl_scorematrix_nt_preload_s);
+ for (which = 0; which < nmat; which++)
+ if (strcmp(ESL_SCOREMATRIX_NT_PRELOADS[which].name, name) == 0) break;
+ if (which >= nmat) return eslENOTFOUND;
+
+ ESL_DASSERT1(( S->Kp >= 15 )); // strcpy below is safe. The assertion tries to convince static analyzer of that.
+ strcpy(S->outorder, "ACGTRYMKSWHBVDN");
+
+ /* Transfer scores from static built-in storage */
+ for (x = 0; x < S->Kp; x++)
+ for (y = 0; y < S->Kp; y++)
+ S->s[x][y] = ESL_SCOREMATRIX_NT_PRELOADS[which].matrix[x][y];
+
+ }
+ else return eslENOTFOUND; /* no DNA matrices are built in yet! */
+
+
+ /* Use <outorder> list to set <isval[x]> */
+ S->nc = strlen(S->outorder);
+ for (y = 0; y < S->nc; y++) {
+ x = esl_abc_DigitizeSymbol(S->abc_r, S->outorder[y]);
+ S->isval[x] = TRUE;
+ }
+
+ /* Copy the name */
+ if (esl_strdup(name, -1, &(S->name)) != eslOK) return eslEMEM;
+ return eslOK;
+}
+
+
+/* Function: esl_scorematrix_SetIdentity()
+ * Synopsis: Set matrix to +1 match, 0 mismatch.
+ *
+ * Purpose: Sets score matrix <S> to be +1 for a match,
+ * 0 for a mismatch. <S> may be for any alphabet.
+ *
+ * Rarely useful in real use, but may be useful to create
+ * simple examples (including debugging).
+ *
+ * Returns: <eslOK> on success, and the scores in <S> are set.
+ */
+int
+esl_scorematrix_SetIdentity(ESL_SCOREMATRIX *S)
+{
+ int a;
+ int x;
+
+ for (a = 0; a < S->abc_r->Kp*S->abc_r->Kp; a++) S->s[0][a] = 0;
+ for (a = 0; a < S->K; a++) S->s[a][a] = 1;
+
+ for (x = 0; x < S->K; x++) S->isval[x] = TRUE;
+ for (x = S->abc_r->K; x < S->Kp; x++) S->isval[x] = FALSE;
+
+ strncpy(S->outorder, S->abc_r->sym, S->K);
+ S->outorder[S->K] = '\0';
+ S->nc = S->K;
+ return eslOK;
+}
+/*---------------- end, some classic score matrices --------*/
+
+
+/*****************************************************************
+ *# 3. Deriving a score matrix probabilistically.
+ *****************************************************************/
+
+/* Function: esl_scorematrix_SetFromProbs()
+ * Synopsis: Set matrix from target and background probabilities.
+ *
+ * Purpose: Sets the scores in a new score matrix <S> from target joint
+ * probabilities in <P>, query background probabilities <fi>, and
+ * target background probabilities <fj>, with scale factor <lambda>:
+ * $s_{ij} = \frac{1}{\lambda} \frac{p_{ij}}{f_i f_j}$.
+ *
+ * Size of everything must match the canonical alphabet
+ * size in <S>. That is, <S->abc->K> is the canonical
+ * alphabet size of <S>; <P> must contain $K times K$
+ * probabilities $P_{ij}$, and <fi>,<fj> must be vectors of
+ * K probabilities. All probabilities must be nonzero.
+ *
+ * Args: S - score matrix to set scores in
+ * lambda - scale factor
+ * P - matrix of joint probabilities P_ij (KxK)
+ * fi - query background probabilities (0..K-1)
+ * fj - target background probabilities
+ *
+ * Returns: <eslOK> on success, and <S> contains the calculated score matrix.
+ */
+int
+esl_scorematrix_SetFromProbs(ESL_SCOREMATRIX *S, double lambda, const ESL_DMATRIX *P, const double *fi, const double *fj)
+{
+ int i,j;
+ double sc;
+
+ for (i = 0; i < S->abc_r->K; i++)
+ for (j = 0; j < S->abc_r->K; j++)
+ {
+ sc = log(P->mx[i][j] / (fi[i] * fj[j])) / lambda;
+ S->s[i][j] = (int) (sc + (sc>0 ? 0.5 : -0.5)); /* that's rounding to the nearest integer */
+ }
+
+ for (i = 0; i < S->abc_r->K; i++)
+ S->isval[i] = TRUE;
+ S->nc = S->abc_r->K;
+
+ strncpy(S->outorder, S->abc_r->sym, S->abc_r->K);
+ S->outorder[S->nc] = '\0';
+ return eslOK;
+}
+
+
+/* Function: esl_scorematrix_SetWAG()
+ * Synopsis: Set matrix using the WAG evolutionary model.
+ *
+ * Purpose: Parameterize an amino acid score matrix <S> using the WAG
+ * rate matrix \citep{WhelanGoldman01} as the underlying
+ * evolutionary model, at a distance of <t>
+ * substitutions/site, with scale factor <lambda>.
+ *
+ * Args: S - score matrix to set parameters in. Must be created for
+ * an amino acid alphabet.
+ * lambda - scale factor for scores
+ * t - distance to exponentiate WAG to, in substitutions/site
+ *
+ * Returns: <eslOK> on success, and the 20x20 residue scores in <S> are set.
+ *
+ * Throws: <eslEINVAL> if <S> isn't an allocated amino acid score matrix.
+ * <eslEMEM> on allocation failure.
+ */
+int
+esl_scorematrix_SetWAG(ESL_SCOREMATRIX *S, double lambda, double t)
+{
+ ESL_DMATRIX *Q = NULL;
+ ESL_DMATRIX *P = NULL;
+ static double wagpi[20];
+ int i,j;
+ int status;
+
+ if (S->K != 20) ESL_EXCEPTION(eslEINVAL, "Must be using an amino acid alphabet (K=20) to make WAG-based matrices");
+
+ if (( Q = esl_dmatrix_Create(20, 20)) == NULL) { status = eslEMEM; goto ERROR; }
+ if (( P = esl_dmatrix_Create(20, 20)) == NULL) { status = eslEMEM; goto ERROR; }
+ if ((status = esl_composition_WAG(wagpi)) != eslOK) goto ERROR;
+ if ((status = esl_rmx_SetWAG(Q, wagpi)) != eslOK) goto ERROR;
+ if ((status = esl_dmx_Exp(Q, t, P)) != eslOK) goto ERROR;
+
+ for (i = 0; i < 20; i++)
+ for (j = 0; j < 20; j++)
+ P->mx[i][j] *= wagpi[i]; /* P_ij = P(j|i) pi_i */
+
+ esl_scorematrix_SetFromProbs(S, lambda, P, wagpi, wagpi);
+
+ if ((status = esl_strdup("WAG", -1, &(S->name))) != eslOK) goto ERROR;
+
+ esl_dmatrix_Destroy(Q);
+ esl_dmatrix_Destroy(P);
+ return eslOK;
+
+ ERROR:
+ if (Q != NULL) esl_dmatrix_Destroy(Q);
+ if (Q != NULL) esl_dmatrix_Destroy(P);
+ return status;
+}
+/*--------------- end, deriving score matrices ------------------*/
+
+
+
+/*****************************************************************
+ *# 4. Reading/writing matrices from/to files
+ *****************************************************************/
+
+/* Function: esl_scorematrix_Read()
+ * Synopsis: Read a standard matrix input file.
+ *
+ * Purpose: Given a pointer <efp> to an open file parser for a file
+ * containing a score matrix (such as a PAM or BLOSUM
+ * matrix), parse the file and create a new score matrix
+ * object. The scores are expected to be for the alphabet
+ * <abc>.
+ *
+ * The score matrix file is in the format that BLAST or
+ * FASTA use. The first line is a header contains N
+ * single-letter codes for the residues. Each of N
+ * subsequent rows optionally contains a residue row label
+ * (in the same order as the columns), followed by N
+ * residue scores. (Older matrix files do not contain the
+ * leading row label; newer ones do.) The residues may
+ * appear in any order. They must minimally include the
+ * canonical K residues (K=4 for DNA, K=20 for protein),
+ * and may also contain none, some, or all degeneracy
+ * codes. Any other residue code that is not in the Easel
+ * digital alphabet (including, in particular, the '*' code
+ * for a stop codon) is ignored by the parser.
+ *
+ * Returns: <eslOK> on success, and <ret_S> points to a newly allocated
+ * score matrix.
+ *
+ * Returns <eslEFORMAT> on parsing error; in which case, <ret_S> is
+ * returned <NULL>, and <efp->errbuf> contains an informative
+ * error message.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_scorematrix_Read(ESL_FILEPARSER *efp, const ESL_ALPHABET *abc, ESL_SCOREMATRIX **ret_S)
+{
+ int status;
+ ESL_SCOREMATRIX *S = NULL;
+ int *map = NULL; /* maps col/row index to digital alphabet x */
+ char *tok;
+ int toklen;
+ int c, x;
+ int row,col;
+
+ /* Allocate the matrix
+ */
+ if ((S = esl_scorematrix_Create(abc)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ /* Make sure we've got the comment character set properly in the fileparser.
+ * Score matrices use #.
+ */
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ /* Look for the first non-blank, non-comment line in the file. That line
+ * gives us the single-letter codes in the order that the file's using.
+ */
+ if ((status = esl_fileparser_NextLine(efp)) != eslOK) ESL_XFAIL(eslEFORMAT, efp->errbuf, "file appears to be empty");
+
+ /* Read the characters: count them and store them in order in label[0..nc-1].
+ * nc cannot exceed Kp+1 in our expected alphabet (+1, for the stop character *)
+ */
+ S->nc = 0;
+ while ((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) == eslOK)
+ {
+ if (S->nc >= abc->Kp) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Header contains more residues than expected for alphabet");
+ if (toklen != 1) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Header can only contain single-char labels; %s is invalid", tok);
+ S->outorder[S->nc++] = *tok;
+ }
+ if (status != eslEOL) ESL_XFAIL(status, efp->errbuf, "Unexpected failure of esl_fileparser_GetTokenOnLine()");
+ S->outorder[S->nc] = '\0'; /* NUL terminate */
+
+ /* Verify that these labels for the score matrix seem plausible, given our alphabet.
+ * This sets S->isval array: which residues we have scores for.
+ * It also sets the map[] array, which maps coord in label[] to x in alphabet.
+ */
+ ESL_ALLOC(map, sizeof(int) * S->nc);
+ for (c = 0; c < S->nc; c++)
+ {
+ if (esl_abc_CIsValid(abc, S->outorder[c]))
+ {
+ x = esl_abc_DigitizeSymbol(abc, S->outorder[c]);
+ map[c] = x;
+ S->isval[x] = TRUE;
+ }
+ else
+ ESL_XFAIL(eslEFORMAT, efp->errbuf, "Don't know how to deal with residue %c in matrix file", S->outorder[c]);
+ }
+ for (x = 0; x < abc->K; x++)
+ if (! S->isval[x]) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Expected to see a column for residue %c", abc->sym[x]);
+
+
+ /* Read nc rows, one at a time;
+ * on each row, read nc+1 or nc tokens, of which nc are scores (may lead with a label or not)
+ */
+ for (row = 0; row < S->nc; row++)
+ {
+ if ((status = esl_fileparser_NextLine(efp)) != eslOK) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Unexpectedly ran out of lines in file");
+ for (col = 0; col < S->nc; col++)
+ {
+ if ((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Unexpectedly ran out of fields on line");
+ if (col == 0 && *tok == S->outorder[row]) { col--; continue; } /* skip leading label */
+
+ S->s[map[row]][map[col]] = atoi(tok);
+ }
+ if ((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslEOL) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Too many fields on line");
+ }
+ if ((status = esl_fileparser_NextLine(efp)) != eslEOF) ESL_XFAIL(eslEFORMAT, efp->errbuf, "Too many lines in file");
+
+
+ /* Annotate the score matrix */
+ if ((status = esl_strdup (efp->filename, -1, &(S->path))) != eslOK) goto ERROR;
+ if ((status = esl_FileTail(efp->filename, FALSE, &(S->name))) != eslOK) goto ERROR;
+
+ free(map);
+ *ret_S = S;
+ return eslOK;
+
+ ERROR:
+ esl_scorematrix_Destroy(S);
+ if (map != NULL) free(map);
+ *ret_S = NULL;
+ return status;
+}
+
+/* Function: esl_scorematrix_Write()
+ * Synopsis: Write a BLAST-compatible score matrix file.
+ *
+ * Purpose: Writes a score matrix <S> to an open stream <fp>, in
+ * format compatible with BLAST, FASTA, and other common
+ * sequence alignment software.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error, such as filled disk.
+ */
+int
+esl_scorematrix_Write(FILE *fp, const ESL_SCOREMATRIX *S)
+{
+ int a,b;
+ int x,y;
+ int nc = S->nc;
+
+ /* The header line, with column labels for residues */
+ if (fprintf(fp, " ") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "score matrix write failed");
+ for (a = 0; a < nc; a++)
+ { if (fprintf(fp, " %c ", S->outorder[a]) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "score matrix write failed"); }
+ if (fprintf(fp, "\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "score matrix write failed");
+
+ /* The data */
+ for (a = 0; a < nc; a++)
+ {
+ if (fprintf(fp, "%c ", S->outorder[a]) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "score matrix write failed");
+ for (b = 0; b < nc; b++)
+ {
+ x = esl_abc_DigitizeSymbol(S->abc_r, S->outorder[a]);
+ y = esl_abc_DigitizeSymbol(S->abc_r, S->outorder[b]);
+ if (fprintf(fp, "%3d ", S->s[x][y]) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "score matrix write failed");
+ }
+ if (fprintf(fp, "\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "score matrix write failed");
+ }
+ return eslOK;
+}
+/*-------------- end, reading/writing matrices ------------------*/
+
+
+
+/*****************************************************************
+ *# 5. Implicit probabilistic basis, I: given bg.
+ *****************************************************************/
+
+static int set_degenerate_probs(const ESL_ALPHABET *abc, ESL_DMATRIX *P, double *fi, double *fj);
+
+struct lambda_params {
+ const double *fi;
+ const double *fj;
+ const ESL_SCOREMATRIX *S;
+};
+
+static int
+lambda_fdf(double lambda, void *params, double *ret_fx, double *ret_dfx)
+{
+ struct lambda_params *p = (struct lambda_params *) params;
+ int i,j;
+ double tmp;
+
+ *ret_fx = 0.;
+ *ret_dfx = 0.;
+ for (i = 0; i < p->S->K; i++)
+ for (j = 0; j < p->S->K; j++)
+ {
+ tmp = p->fi[i] * p->fj[j] * exp(lambda * (double) p->S->s[i][j]);
+ *ret_fx += tmp;
+ *ret_dfx += tmp * (double) p->S->s[i][j];
+ }
+ *ret_fx -= 1.0;
+ return eslOK;
+}
+
+/* Function: esl_scorematrix_ProbifyGivenBG()
+ * Synopsis: Obtain $P_{ij}$ for matrix with known $\lambda$ and background.
+ *
+ * Purpose: Given a score matrix <S> and known query and target
+ * background frequencies <fi> and <fj> respectively, calculate scale
+ * <lambda> and implicit target probabilities \citep{Altschul01}.
+ * Optionally returns either (or both) in <opt_lambda> and <opt_P>.
+ *
+ * The implicit target probabilities are returned in a
+ * newly allocated $Kp \times Kp$ <ESL_DMATRIX>, over both
+ * the canonical (typically K=4 or K=20) residues in the
+ * residue alphabet, and the degenerate residue codes.
+ * Values involving degenerate residue codes are marginal
+ * probabilities (i.e. summed over the degeneracy).
+ * Only actual residue degeneracy can have nonzero values
+ * for <p_ij>; by convention, all values involving the
+ * special codes for gap, nonresidue, and missing data
+ * (<K>, <Kp-2>, <Kp-1>) are 0.
+ *
+ * If the caller wishes to convert this joint probability
+ * matrix to conditionals, it can take advantage of the
+ * fact that the degenerate probability <P(X,j)> is our
+ * marginalized <pj>, and <P(i,X)> is <pi>.
+ * i.e., <P(j|i) = P(i,j) / P(i) = P(i,j) / P(X,j)>.
+ * Those X values are <P->mx[i][esl_abc_GetUnknown(abc)]>,
+ * <P->mx[esl_abc_GetUnknown(abc)][j]>; equivalently, just use
+ * code <Kp-3> for X.
+ *
+ * By convention, i is always the query sequence, and j is
+ * always the target. We do not assume symmetry in the
+ * scoring system, though that is usually the case.
+ *
+ * Args: S - score matrix
+ * fi - background frequencies for query sequence i
+ * fj - background frequencies for target sequence j
+ * opt_lambda - optRETURN: calculated $\lambda$ parameter
+ * opt_P - optRETURN: implicit target probabilities $p_{ij}$; a KxK DMATRIX.
+ *
+ * Returns: <eslOK> on success, <*ret_lambda> contains the
+ * calculated $\lambda$ parameter, and <*ret_P> points to
+ * the target probability matrix (which is allocated here,
+ * and must be free'd by caller with <esl_dmatrix_Destroy(*ret_P)>.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslEINVAL> if matrix is invalid and has no solution for $\lambda$;
+ * <eslENOHALT> if the solver fails to find $\lambda$.
+ * In these cases, <*ret_lambda> is 0.0, and <*ret_P> is <NULL>.
+ */
+int
+esl_scorematrix_ProbifyGivenBG(const ESL_SCOREMATRIX *S, const double *fi, const double *fj,
+ double *opt_lambda, ESL_DMATRIX **opt_P)
+{
+ ESL_ROOTFINDER *R = NULL;
+ ESL_DMATRIX *P = NULL;
+ struct lambda_params p;
+ double lambda_guess;
+ double lambda;
+ int i,j;
+ double fx, dfx;
+ int status;
+
+ /* First, solve for lambda by rootfinding. */
+ /* Set up the data passed to the lambda_fdf function. */
+ p.fi = fi;
+ p.fj = fj;
+ p.S = S;
+
+ /* Bracket the root.
+ * It's important that we come at the root from the far side, where
+ * f(lambda) is positive; else we may identify the root we don't want
+ * at lambda=0.
+ */
+ fx = -1.0;
+ lambda_guess = 1. / (double) esl_scorematrix_Max(S);
+ for (; lambda_guess < 50.; lambda_guess *= 2.0) {
+ lambda_fdf(lambda_guess, &p, &fx, &dfx);
+ if (fx > 0) break;
+ }
+ if (fx <= 0) ESL_XEXCEPTION(eslEINVAL, "Failed to bracket root for solving lambda");
+
+ /* Create a solver and find lambda by Newton/Raphson */
+ if (( R = esl_rootfinder_CreateFDF(lambda_fdf, &p) ) == NULL) { status = eslEMEM; goto ERROR; }
+ if (( status = esl_root_NewtonRaphson(R, lambda_guess, &lambda)) != eslOK) goto ERROR;
+
+ /* Now, given solution for lambda, calculate P */
+ if (opt_P != NULL)
+ {
+ if ((P = esl_dmatrix_Create(S->Kp, S->Kp)) == NULL) { status = eslEMEM; goto ERROR; }
+ for (i = 0; i < S->K; i++)
+ for (j = 0; j < S->K; j++)
+ P->mx[i][j] = fi[i] * fj[j] * exp(lambda * (double) S->s[i][j]);
+ set_degenerate_probs(S->abc_r, P, NULL, NULL);
+ }
+
+ esl_rootfinder_Destroy(R);
+ if (opt_lambda) *opt_lambda = lambda;
+ if (opt_P) *opt_P = P;
+ return eslOK;
+
+ ERROR:
+ if (R) esl_rootfinder_Destroy(R);
+ if (opt_lambda) *opt_lambda = 0.;
+ if (opt_P) *opt_P = NULL;
+ return status;
+}
+
+
+/* set_degenerate_probs()
+ *
+ * Used by both esl_scorematrix_Probify() and
+ * esl_scorematrix_ProbifyGivenBG() to set degenerate residue
+ * probabilities once probs for canonical residues are known.
+ *
+ * Input: P->mx[i][j] are joint probabilities p_ij for the canonical
+ * alphabet 0..abc->K-1, but P matrix is allocated for Kp X Kp.
+ *
+ * Calculate marginal sums for all i,j pairs involving degeneracy
+ * codes. Fill in [i][j'=K..Kp-1], [i'=K..Kp-1][j], and
+ * [i'=K..Kp-1][j'=K..Kp-1] for degeneracies i',j'. Any p_ij involving
+ * a gap (K), nonresidue (Kp-2), or missing data (Kp-1) character is
+ * set to 0.0 by convention.
+ *
+ * Don't assume symmetry.
+ *
+ * If <fi> or <fj> background probability vectors are non-<NULL>, set
+ * them too. (Corresponding to the assumption of background =
+ * marginal probs, rather than background being given.) This takes
+ * advantage of the fact that P(X,i) is already the marginalized p_i,
+ * and P(j,X) is p_j.
+ */
+static int
+set_degenerate_probs(const ESL_ALPHABET *abc, ESL_DMATRIX *P, double *fi, double *fj)
+{
+ int i,j; /* indices into canonical codes */
+ int ip,jp; /* indices into degenerate codes */
+
+ /* sum to get [i=0..K] canonicals to [jp=K+1..Kp-3] degeneracies;
+ * and [jp=K,Kp-2,Kp-1] set to 0.0
+ */
+ for (i = 0; i < abc->K; i++)
+ {
+ P->mx[i][abc->K] = 0.0;
+ for (jp = abc->K+1; jp < abc->Kp-2; jp++)
+ {
+ P->mx[i][jp] = 0.0;
+ for (j = 0; j < abc->K; j++)
+ if (abc->degen[jp][j]) P->mx[i][jp] += P->mx[i][j];
+ }
+ P->mx[i][abc->Kp-2] = 0.0;
+ P->mx[i][abc->Kp-1] = 0.0;
+ }
+
+ esl_vec_DSet(P->mx[abc->K], abc->Kp, 0.0); /* gap row: all 0.0 by convention */
+
+ /* [ip][all] */
+ for (ip = abc->K+1; ip < abc->Kp-2; ip++)
+ {
+ /* [ip][j]: degenerate i, canonical j */
+ for (j = 0; j < abc->K; j++)
+ {
+ P->mx[ip][j] = 0.0;
+ for (i = 0; i < abc->K; i++)
+ if (abc->degen[ip][i]) P->mx[ip][j] += P->mx[i][j];
+ }
+ P->mx[ip][abc->K] = 0.0;
+
+ /* [ip][jp]: both positions degenerate */
+ for (jp = abc->K+1; jp < abc->Kp-2; jp++)
+ {
+ P->mx[ip][jp] = 0.0;
+ for (j = 0; j < abc->K; j++)
+ if (abc->degen[jp][j]) P->mx[ip][jp] += P->mx[ip][j];
+ }
+ P->mx[ip][abc->Kp-2] = 0.0;
+ P->mx[ip][abc->Kp-1] = 0.0;
+ }
+
+ esl_vec_DSet(P->mx[abc->Kp-2], abc->Kp, 0.0); /* nonresidue data * row, all 0.0 */
+ esl_vec_DSet(P->mx[abc->Kp-1], abc->Kp, 0.0); /* missing data ~ row, all 0.0 */
+
+ if (fi != NULL) { /* fi[i'] = p(i',X) */
+ fi[abc->K] = 0.0;
+ for (ip = abc->K+1; ip < abc->Kp-2; ip++) fi[ip] = P->mx[ip][abc->Kp-3];
+ fi[abc->Kp-2] = 0.0;
+ fi[abc->Kp-1] = 0.0;
+ }
+
+ if (fj != NULL) { /* fj[j'] = p(X,j')*/
+ fj[abc->K] = 0.0;
+ for (jp = abc->K+1; jp < abc->Kp-2; jp++) fj[jp] = P->mx[abc->Kp-3][jp];
+ fj[abc->Kp-2] = 0.0;
+ fj[abc->Kp-1] = 0.0;
+ }
+
+ return eslOK;
+}
+/*------------- end, implicit prob basis, bg known --------------*/
+
+
+/*****************************************************************
+ *# 6. Implicit probabilistic basis, II: bg unknown
+ *****************************************************************/
+
+/* This section implements one of the key ideas in Yu and Altschul,
+ * PNAS 100:15688, 2003 [YuAltschul03], and Yu and Altschul,
+ * Bioinformatics 21:902-911, 2005 [YuAltschul05]:
+ *
+ * Given a valid score matrix, calculate its probabilistic
+ * basis (P_ij, f_i, f_j, and lambda), on the assumption that
+ * the background probabilities are the marginals of P_ij.
+ *
+ * However, this procedure appears to be unreliable.
+ * There are often numerous invalid solutions with negative
+ * probabilities, and the Yu/Altschul Y function (that we've solving
+ * for its root) is often discontinuous. Although Yu and Altschul say
+ * they can just keep searching for solutions until a valid one is
+ * found, and "this procedure presents no difficulties in practice", I
+ * don't see how.
+ *
+ * For example, run the procedure on PAM190 and PAM200. For PAM190
+ * you will obtain a valid solution with lambda = 0.2301. For PAM200
+ * you will obtain an *invalid* solution with lambda = 0.2321, and
+ * negative probabilities f_{ENT} (and all p_ij involving ENT and
+ * the other 17 aa). There is a discontinuity in the function, but
+ * it's not near these lambdas, it's at about lambda=0.040, so it's
+ * not that we fell into a discontinuity: the bisection procedure on
+ * lambda is working smoothly. And if you calculate a score matrix again
+ * from the invalid PAM200 solution, you get PAM200 back, so it's not
+ * that there's an obvious bug -- we do obtain a "solution" to PAM200,
+ * just not one with positive probabilities. It's not obvious how
+ * we could find a different solution to PAM200 than the invalid one!
+ *
+ * What we're going to do [xref J7/126, Apr 2011] is to deprecate
+ * the Yu/Altschul procedure altogether.
+ */
+struct yualtschul_params {
+ ESL_DMATRIX *S; /* pointer to the KxK score matrix w/ values cast to doubles */
+ ESL_DMATRIX *M; /* not a param per se: alloc'ed storage for M matrix provided to the objective function */
+ ESL_DMATRIX *Y; /* likewise, alloc'ed storage for Y (M^-1) matrix provided to obj function */
+};
+
+/* yualtschul_scorematrix_validate
+ * See start of section 3, p. 903, YuAltschul05
+ * (Implementation could be more efficient here; don't really have
+ * to sweep the entire matrix twice to do this.)
+ */
+static int
+yualtschul_scorematrix_validate(const ESL_SCOREMATRIX *S)
+{
+ int i, j;
+ int has_neg, has_pos;
+
+ /* each row must have at least one positive and one negative score */
+ for (i = 0; i < S->K; i++)
+ {
+ has_neg = has_pos = FALSE;
+ for (j = 0; j < S->K; j++)
+ {
+ if (S->s[i][j] > 0) has_pos = TRUE;
+ if (S->s[i][j] < 0) has_neg = TRUE;
+ }
+ if (! has_pos || ! has_neg) return eslFAIL;
+ }
+
+ /* ditto for columns */
+ for (j = 0; j < S->K; j++)
+ {
+ has_neg = has_pos = FALSE;
+ for (i = 0; i < S->K; i++)
+ {
+ if (S->s[i][j] > 0) has_pos = TRUE;
+ if (S->s[i][j] < 0) has_neg = TRUE;
+ }
+ if (! has_pos || ! has_neg) return eslFAIL;
+ }
+
+ return eslOK;
+}
+
+/* upper bound bracketing lambda solution: eqn (12) in [YuAltschul05] */
+static double
+yualtschul_upper_bound(const ESL_DMATRIX *Sd)
+{
+ int i;
+ double minimax;
+ double maxlambda;
+
+ /* minimax = c in YuAltschul05 p.903 = smallest of the max scores in each row/col */
+ minimax = esl_vec_DMax(Sd->mx[0], Sd->n);
+ for (i = 1; i < Sd->n; i++)
+ minimax = ESL_MIN(minimax, esl_vec_DMax(Sd->mx[i], Sd->n));
+
+ maxlambda = log((double) Sd->n) / minimax; /* eqn (12), YuAltschul05 */
+ return maxlambda;
+}
+
+static int
+yualtschul_solution_validate(const ESL_DMATRIX *P, const double *fi, const double *fj)
+{
+
+ if ( esl_dmx_Min(P) < 0.0) return eslFAIL;
+ if ( esl_vec_DMin(fi, P->n) < 0.0) return eslFAIL;
+ if ( esl_vec_DMin(fj, P->n) < 0.0) return eslFAIL;
+
+ return eslOK;
+}
+
+/* yualtschul_func()
+ *
+ * This is the objective function we try to find a root of.
+ * Its prototype is dictated by the esl_rootfinder API.
+ */
+static int
+yualtschul_func(double lambda, void *params, double *ret_fx)
+{
+ int status;
+ struct yualtschul_params *p = (struct yualtschul_params *) params;
+ ESL_DMATRIX *S = p->S;
+ ESL_DMATRIX *M = p->M;
+ ESL_DMATRIX *Y = p->Y;
+ int i,j;
+
+ /* the M matrix has entries M_ij = e^{lambda * s_ij} */
+ for (i = 0; i < S->n; i++)
+ for (j = 0; j < S->n; j++)
+ M->mx[i][j] = exp(lambda * S->mx[i][j]);
+
+ /* the Y matrix is the inverse of M */
+ if ((status = esl_dmx_Invert(M, Y)) != eslOK) goto ERROR;
+
+ /* We're trying to find the root of \sum_ij Y_ij - 1 = 0 */
+ *ret_fx = esl_dmx_Sum(Y) - 1.;
+ return eslOK;
+
+ ERROR:
+ *ret_fx = 0.;
+ return status;
+}
+
+/* yualtschul_engine()
+ *
+ * This function backcalculates the probabilistic basis for a score
+ * matrix S, when S is a double-precision matrix. Providing this
+ * as a separate "engine" and writing esl_scorematrix_Probify()
+ * as a wrapper around it allows us to separately test inaccuracy
+ * due to numerical performance of our linear algebra, versus
+ * inaccuracy due to integer roundoff in integer scoring matrices.
+ *
+ * It is not uncommon for this to fail when S is derived from
+ * integer scores. Because the scores may have been provided by the
+ * user, and this may be our first chance to detect the "user error"
+ * of an invalid matrix, this engine returns <eslEINVAL> as a normal error
+ * if it can't reach a valid solution.
+ */
+static int
+yualtschul_engine(ESL_DMATRIX *S, ESL_DMATRIX *P, double *fi, double *fj, double *ret_lambda)
+{
+ int status;
+ ESL_ROOTFINDER *R = NULL;
+ struct yualtschul_params p;
+ double lambda;
+ double xl, xr;
+ double fx = -1.0;
+ int i,j;
+
+ /* Set up a bisection method to find lambda */
+ p.S = S;
+ p.M = p.Y = NULL;
+ if ((p.M = esl_dmatrix_Create(S->n, S->n)) == NULL) { status = eslEMEM; goto ERROR; }
+ if ((p.Y = esl_dmatrix_Create(S->n, S->n)) == NULL) { status = eslEMEM; goto ERROR; }
+ if ((R = esl_rootfinder_Create(yualtschul_func, &p)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ /* Identify suitable brackets on lambda. */
+ xr = yualtschul_upper_bound(S);
+
+ for (xl = xr; xl > 1e-10; xl /= 1.6) {
+ if ((status = yualtschul_func(xl, &p, &fx)) != eslOK) goto ERROR;
+ if (fx > 0.) break;
+ }
+ if (fx <= 0.) { status = eslEINVAL; goto ERROR; }
+
+ for (; xr < 100.; xr *= 1.6) {
+ if ((status = yualtschul_func(xr, &p, &fx)) != eslOK) goto ERROR;
+ if (fx < 0.) break;
+ }
+ if (fx >= 0.) { status = eslEINVAL; goto ERROR; }
+
+ /* Find lambda by bisection */
+ if (( status = esl_root_Bisection(R, xl, xr, &lambda)) != eslOK) goto ERROR;
+
+ /* Find fi, fj from Y: fi are column sums, fj are row sums */
+ for (i = 0; i < S->n; i++) {
+ fi[i] = 0.;
+ for (j = 0; j < S->n; j++) fi[i] += p.Y->mx[j][i];
+ }
+ for (j = 0; j < S->n; j++) {
+ fj[j] = 0.;
+ for (i = 0; i < S->n; i++) fj[j] += p.Y->mx[j][i];
+ }
+
+ /* Find p_ij */
+ for (i = 0; i < S->n; i++)
+ for (j = 0; j < S->n; j++)
+ P->mx[i][j] = fi[i] * fj[j] * p.M->mx[i][j];
+
+ *ret_lambda = lambda;
+ esl_dmatrix_Destroy(p.M);
+ esl_dmatrix_Destroy(p.Y);
+ esl_rootfinder_Destroy(R);
+ return eslOK;
+
+ ERROR:
+ if (p.M) esl_dmatrix_Destroy(p.M);
+ if (p.Y) esl_dmatrix_Destroy(p.Y);
+ if (R) esl_rootfinder_Destroy(R);
+ return status;
+}
+
+
+/* Function: esl_scorematrix_Probify()
+ * Synopsis: Calculate the probabilistic basis of a score matrix.
+ *
+ * Purpose: Reverse engineering of a score matrix: given a "valid"
+ * substitution matrix <S>, obtain implied joint
+ * probabilities $p_{ij}$, query composition $f_i$, target
+ * composition $f_j$, and scale $\lambda$, by assuming that
+ * $f_i$ and $f_j$ are the appropriate marginals of $p_{ij}$.
+ * Optionally return any or all of these solutions in
+ * <*opt_P>, <*opt_fi>, <*opt_fj>, and <*opt_lambda>.
+ *
+ * The calculation is run only on canonical residue scores
+ * $0..K-1$ in S, to calculate joint probabilities for all
+ * canonical residues. Joint and background probabilities
+ * involving degenerate residues are then calculated by
+ * appropriate marginalizations. See notes on
+ * <esl_scorematrix_ProbifyGivenBG()> about how probabilities
+ * involving degeneracy codes are calculated.
+ *
+ * This implements an algorithm described in
+ * \citep{YuAltschul03} and \citep{YuAltschul05}.
+ *
+ * Although this procedure may succeed in many cases,
+ * it is unreliable and should be used with great caution.
+ * Yu and Altschul note that it can find invalid solutions
+ * (negative probabilities), and although they say that one
+ * can keep searching until a valid solution is found,
+ * one can produce examples where this does not seem to be
+ * the case. The caller MUST check return status, and
+ * MUST expect <eslENORESULT>.
+ *
+ * Args: S - score matrix
+ * opt_P - optRETURN: Kp X Kp matrix of implied target probs $p_{ij}$
+ * opt_fi - optRETURN: vector of Kp $f_i$ background probs, 0..Kp-1
+ * opt_fj - optRETURN: vector of Kp $f_j$ background probs, 0..Kp-1
+ * opt_lambda - optRETURN: calculated $\lambda$ parameter
+ *
+ * Returns: <eslOK> on success, and <opt_P>, <opt_fi>, <opt_fj>, and <opt_lambda>
+ * point to the results (for any of these that were passed non-<NULL>).
+ *
+ * <opt_P>, <opt_fi>, and <opt_fj>, if requested, are new
+ * allocations, and must be freed by the caller.
+ *
+ * Returns <eslENORESULT> if the algorithm fails to determine a valid solution,
+ * but the solution is still returned (and caller needs to free).
+ *
+ * Returns <eslEINVAL> if input score matrix isn't valid (sensu YuAltschul05);
+ * now <opt_P>, <opt_fi>, <opt_fj> are returned NULL and <opt_lambda> is returned
+ * as 0.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ * Xref: SRE:J1/35; SRE:J7/126.
+ */
+int
+esl_scorematrix_Probify(const ESL_SCOREMATRIX *S, ESL_DMATRIX **opt_P, double **opt_fi, double **opt_fj, double *opt_lambda)
+{
+ int status;
+ ESL_DMATRIX *Sd = NULL;
+ ESL_DMATRIX *P = NULL;
+ double *fi = NULL;
+ double *fj = NULL;
+ double lambda;
+ int i,j;
+
+ /* Check the input matrix for validity */
+ if ( yualtschul_scorematrix_validate(S) != eslOK) { status = eslEINVAL; goto ERROR; }
+
+ if (( Sd = esl_dmatrix_Create(S->K, S->K)) == NULL) {status = eslEMEM; goto ERROR; }
+ if (( P = esl_dmatrix_Create(S->Kp, S->Kp)) == NULL) {status = eslEMEM; goto ERROR; }
+ ESL_ALLOC(fi, sizeof(double) * S->Kp);
+ ESL_ALLOC(fj, sizeof(double) * S->Kp);
+
+ /* Construct a double-precision dmatrix from S.
+ * I've tried integrating over the rounding uncertainty by
+ * averaging over trials with values jittered by +/- 0.5,
+ * but it doesn't appear to help.
+ */
+ for (i = 0; i < S->K; i++)
+ for (j = 0; j < S->K; j++)
+ Sd->mx[i][j] = (double) S->s[i][j];
+
+ /* Reverse engineer the doubles */
+ if ((status = yualtschul_engine(Sd, P, fi, fj, &lambda)) != eslOK) goto ERROR;
+ set_degenerate_probs(S->abc_r, P, fi, fj);
+
+ /* Done. */
+ if (yualtschul_solution_validate(P, fi, fj) != eslOK) status = eslENORESULT;
+ else status = eslOK;
+
+ esl_dmatrix_Destroy(Sd);
+ if (opt_P != NULL) *opt_P = P; else esl_dmatrix_Destroy(P);
+ if (opt_fi != NULL) *opt_fi = fi; else free(fi);
+ if (opt_fj != NULL) *opt_fj = fj; else free(fj);
+ if (opt_lambda != NULL) *opt_lambda = lambda;
+ return status;
+
+ ERROR:
+ if (Sd != NULL) esl_dmatrix_Destroy(Sd);
+ if (P != NULL) esl_dmatrix_Destroy(P);
+ if (fi != NULL) free(fi);
+ if (fj != NULL) free(fj);
+ if (opt_P != NULL) *opt_P = NULL;
+ if (opt_fi != NULL) *opt_fi = NULL;
+ if (opt_fj != NULL) *opt_fj = NULL;
+ if (opt_lambda != NULL) *opt_lambda = 0.;
+ return status;
+}
+/*---------- end, implicit prob basis, bg unknown ---------------*/
+
+
+
+
+/*****************************************************************
+ * 7. Experiment driver
+ *****************************************************************/
+
+#ifdef eslSCOREMATRIX_EXPERIMENT
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_dmatrix.h"
+#include "esl_getopts.h"
+#include "esl_scorematrix.h"
+#include "esl_vectorops.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ {"-l", eslARG_REAL, "0.3466", NULL, NULL, NULL, NULL, NULL, "set base lambda (units of score mx) to <x>", 0},
+ {"-s", eslARG_REAL, "1.0", NULL, NULL, NULL, NULL, NULL, "additional scale factor applied to lambda", 0},
+ {"-t", eslARG_REAL, "1.37", NULL, NULL, NULL, NULL, NULL, "set WAG time (branch length) to <x>", 0},
+ {"--yfile", eslARG_OUTFILE, NULL, NULL, NULL, NULL, NULL, NULL, "save xy file of Yu/Altschul root eqn to <f>", 0},
+ {"--mfile", eslARG_OUTFILE, NULL, NULL, NULL, NULL, NULL, NULL, "save WAG score matrix to <f>", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "Yu/Altschul experiment driver for scorematrix module";
+
+/* yualtschul_graph_dump()
+ * Dump an XY plot of (\sum Y -1) vs. lambda for a score matrix.
+ * X-axis of graph starts at <lambda0>, ends at <lambda1>, stepping by <stepsize>.
+ */
+static int
+yualtschul_graph_dump(FILE *ofp, ESL_SCOREMATRIX *S, double scale, double lambda0, double lambda1, double stepsize)
+{
+ struct yualtschul_params p;
+ int a,b;
+ double fx;
+ double lambda;
+
+ /* Set up a bisection method to find lambda */
+ p.S = esl_dmatrix_Create(S->K, S->K);
+ p.M = esl_dmatrix_Create(S->K, S->K);
+ p.Y = esl_dmatrix_Create(S->K, S->K);
+
+ for (a = 0; a < S->K; a++)
+ for (b = 0; b < S->K; b++)
+ p.S->mx[a][b] = (double) S->s[a][b];
+
+ for (lambda = lambda0; lambda <= lambda1; lambda += stepsize)
+ {
+ yualtschul_func(lambda/scale, &p, &fx);
+ fprintf(ofp, "%f %f\n", lambda, fx);
+ }
+ fprintf(ofp, "&\n");
+ fprintf(ofp, "%f 0.0\n", lambda0);
+ fprintf(ofp, "%f 0.0\n", lambda1);
+ fprintf(ofp, "&\n");
+
+ esl_dmatrix_Destroy(p.S);
+ esl_dmatrix_Destroy(p.M);
+ esl_dmatrix_Destroy(p.Y);
+ return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslAMINO); /* protein matrices 20x20 */
+ ESL_DMATRIX *Q = esl_dmatrix_Create(abc->K, abc->K); /* WAG rate matrix */
+ ESL_DMATRIX *P0 = esl_dmatrix_Create(abc->K, abc->K); /* p_ij joint probabilities calculated from WAG */
+ double *wagpi = malloc(sizeof(double) * abc->K);
+ ESL_SCOREMATRIX *S0 = esl_scorematrix_Create(abc); /* score matrix calculated from WAG p_ij's */
+ double lambda0 = esl_opt_GetReal(go, "-l");
+ double t = esl_opt_GetReal(go, "-t");
+ double scale = esl_opt_GetReal(go, "-s");
+ char *yfile = esl_opt_GetString(go, "--yfile");
+ char *mfile = esl_opt_GetString(go, "--mfile");
+ ESL_DMATRIX *P = NULL; /* p_ij's from Yu/Altschul reverse eng of S0 */
+ double *fi = NULL;
+ double *fj = NULL;
+ double lambda;
+ double D;
+ int status;
+
+ /* Calculate an integer score matrix from a probabilistic rate matrix (WAG) */
+ esl_scorematrix_SetWAG(S0, lambda0/scale, t);
+ esl_composition_WAG(wagpi);
+ printf("WAG matrix calculated at t=%.3f, lambda=%.4f (/%.1f)\n", t, lambda0, scale);
+
+ /* Save the matrix, if asked */
+ if (mfile)
+ {
+ FILE *ofp = NULL;
+ if ( (ofp = fopen(mfile, "w")) == NULL) esl_fatal("failed to open %s for writing scorematrix", mfile);
+ ESL_DASSERT1(( S0->Kp >= 20 )); // the strcpy below is fine. The assertion tries to convince static analyzers of that.
+ strcpy(S0->outorder, "ARNDCQEGHILKMFPSTWYV");
+ esl_scorematrix_Write(ofp, S0);
+ fclose(ofp);
+ }
+
+ /* Because of integer roundoff, the actual probability basis is a little different */
+ esl_scorematrix_ProbifyGivenBG(S0, wagpi, wagpi, &lambda, NULL);
+ printf("Integer roundoff shifts implicit lambda (given wagpi's) to %.4f (/%.1f)\n", lambda*scale, scale);
+ printf("Scores in matrix range from %d to %d\n", esl_scorematrix_Min(S0), esl_scorematrix_Max(S0));
+
+ esl_scorematrix_RelEntropy(S0, wagpi, wagpi, lambda, &D);
+ printf("Relative entropy: %.3f bits\n", D);
+
+ if (yfile)
+ {
+ FILE *ofp = NULL;
+ if ( (ofp = fopen(yfile, "w")) == NULL) esl_fatal("failed to open XY file %s for writing\n", yfile);
+ yualtschul_graph_dump(ofp, S0, scale, 0.01, 1.0, 0.0001);
+ fclose(ofp);
+ printf("XY plot of Yu/Altschul rootfinding saved to : %s\n", yfile);
+ }
+
+ status = esl_scorematrix_Probify(S0, &P, &fi, &fj, &lambda);
+ printf("Yu/Altschul reverse engineering gives lambda = %.4f (/%.1f)\n", lambda*scale, scale);
+
+ //printf("fi's are: \n"); esl_vec_DDump(stdout, fi, S0->K, abc->sym);
+
+ if (status != eslOK) printf("however, the solution is INVALID!\n");
+ else printf("and the joint and marginals are a valid probabilistic basis.\n");
+
+ free(fj);
+ free(fi);
+ esl_scorematrix_Destroy(S0);
+ esl_dmatrix_Destroy(P);
+ esl_dmatrix_Destroy(P0);
+ esl_dmatrix_Destroy(Q);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /* eslSCOREMATRIX_EXPERIMENT */
+/*------------------ end, experiment driver ---------------------*/
+
+
+
+/*****************************************************************
+ * 8. Utility programs
+ *****************************************************************/
+
+/* Reformat a score matrix file into Easel internal digital alphabet order, suitable for making
+ * one of the static data structures in our section of preloaded matrices.
+ */
+#ifdef eslSCOREMATRIX_UTILITY1
+/*
+ gcc -g -Wall -o utility -I. -L. -DeslSCOREMATRIX_UTILITY1 esl_scorematrix.c -leasel -lm
+ ./utility BLOSUM62
+*/
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_scorematrix.h"
+#include "esl_fileparser.h"
+
+int
+main(int argc, char **argv)
+{
+ char *infile = argv[1];
+ ESL_ALPHABET *abc;
+ ESL_FILEPARSER *efp;
+ ESL_SCOREMATRIX *S;
+ int x,y;
+
+ abc = esl_alphabet_Create(eslAMINO);
+
+ if (esl_fileparser_Open(infile, NULL, &efp) != eslOK) esl_fatal("Failed to open %s\n", infile);
+ if (esl_scorematrix_Read(efp, abc, &S) != eslOK) esl_fatal("parse failed: %s", efp->errbuf);
+
+ printf(" /*");
+ for (y = 0; y < abc->Kp; y++)
+ printf(" %c ", abc->sym[y]);
+ printf(" */\n");
+
+ for (x = 0; x < abc->Kp; x++) {
+ printf(" { ");
+ for (y = 0; y < abc->Kp; y++)
+ printf("%3d, ", S->s[x][y]);
+ printf(" }, /* %c */\n", abc->sym[x]);
+ }
+
+ esl_scorematrix_Destroy(S);
+ esl_fileparser_Close(efp);
+ esl_alphabet_Destroy(abc);
+ return eslOK;
+}
+#endif /*eslSCOREMATRIX_UTILITY1*/
+
+
+
+
+/* Utility 2: joint or conditional probabilities from BLOSUM62 (depending on how compiled)
+ */
+#ifdef eslSCOREMATRIX_UTILITY2
+/*
+ gcc -g -Wall -o utility2 -I. -L. -DeslSCOREMATRIX_UTILITY2 esl_scorematrix.c -leasel -lm
+ ./utility2
+*/
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_dmatrix.h"
+#include "esl_scorematrix.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslAMINO);
+ ESL_SCOREMATRIX *S = esl_scorematrix_Create(abc);
+ ESL_DMATRIX *Q = NULL;
+ double *fa = NULL;
+ double *fb = NULL;
+ double slambda;
+ int a,b;
+
+ esl_scorematrix_Set("BLOSUM62", S);
+ esl_scorematrix_Probify(S, &Q, &fa, &fb, &slambda);
+#if 0
+ esl_scorematrix_JointToConditionalOnQuery(abc, Q); /* Q->mx[a][b] is now P(b | a) */
+#endif
+ esl_dmatrix_Dump(stdout, Q, abc->sym, abc->sym);
+
+ esl_dmatrix_Destroy(Q);
+ esl_scorematrix_Destroy(S);
+ esl_alphabet_Destroy(abc);
+ return eslOK;
+}
+#endif /*eslSCOREMATRIX_UTILITY2*/
+
+
+
+
+
+
+/*****************************************************************
+ * 9. Unit tests.
+ *****************************************************************/
+
+#ifdef eslSCOREMATRIX_TESTDRIVE
+#include <esl_dirichlet.h>
+
+static void
+utest_ReadWrite(ESL_ALPHABET *abc, ESL_SCOREMATRIX *S)
+{
+ char tmpfile[16] = "esltmpXXXXXX";
+ FILE *fp = NULL;
+ ESL_SCOREMATRIX *S2 = NULL;
+ ESL_FILEPARSER *efp = NULL;
+
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal("failed to open tmp file");
+ if (esl_scorematrix_Write(fp, S) != eslOK) esl_fatal("failed to write test matrix");
+ fclose(fp);
+
+ if (esl_fileparser_Open(tmpfile, NULL, &efp) != eslOK) esl_fatal("failed to open tmpfile containing BLOSUM62 matrix");
+ if (esl_scorematrix_Read(efp, abc, &S2) != eslOK) esl_fatal("failed to read tmpfile containing BLOSUM62 matrix");
+ if (esl_scorematrix_Compare(S, S2) != eslOK) esl_fatal("the two test matrices aren't identical");
+
+ remove(tmpfile);
+ esl_fileparser_Close(efp);
+ esl_scorematrix_Destroy(S2);
+ return;
+}
+
+
+static void
+utest_ProbifyGivenBG(ESL_SCOREMATRIX *S0, ESL_DMATRIX *P0, double *wagpi, double lambda0)
+{
+ char *msg = "ProbifyGivenBG() unit test failed";
+ ESL_DMATRIX *P = NULL;
+ double sum = 0.0;
+ double lambda;
+ int a,b;
+
+ if (esl_scorematrix_ProbifyGivenBG(S0, wagpi, wagpi, &lambda, &P) != eslOK) esl_fatal(msg);
+
+ if (esl_DCompare(lambda0, lambda, 1e-3) != eslOK) esl_fatal("lambda is wrong");
+
+ for (a = 0; a < 20; a++) /* you can't just call esl_dmx_Sum(P), because P includes */
+ for (b = 0; b < 20; b++) /* marginalized degeneracies */
+ sum += P->mx[a][b];
+
+ if (esl_DCompare(sum, 1.0, 1e-9) != eslOK) esl_fatal("P doesn't sum to 1");
+
+ for (a = 0; a < 20; a++) /* for the same reason, you can't dmatrix_Compare P and P0 */
+ for (b = 0; b < 20; b++)
+ if (esl_DCompare(P0->mx[a][b], P->mx[a][b], 1e-2) != eslOK) esl_fatal("P is wrong");
+
+ esl_dmatrix_Destroy(P);
+ return;
+}
+
+
+/* The scores->pij reverse engineering engine works with scores in doubles,
+ * so we can separate effects of rounding to integers in standard
+ * score matrices.
+ */
+static void
+utest_yualtschul(ESL_DMATRIX *P0, double *wagpi)
+{
+ char *msg = "reverse engineering engine test failed";
+ ESL_DMATRIX *S = NULL; /* original score matrix, in double form, not rounded to ints (calculated from P, fi, fj) */
+ ESL_DMATRIX *P = NULL; /* backcalculated P_ij joint probabilities */
+ double *fi = NULL; /* backcalculated f_i query composition */
+ double *fj = NULL; /* backcalculated f'_j target composition */
+ double lambda0; /* true lambda */
+ double lambda; /* backcalculated lambda */
+ double sum = 0.0;
+ int i,j;
+
+ /* Allocations */
+ if (( S = esl_dmatrix_Create(20, 20)) == NULL) esl_fatal(msg);
+ if (( P = esl_dmatrix_Create(20, 20)) == NULL) esl_fatal(msg);
+ if ((fi = malloc(sizeof(double) * 20)) == NULL) esl_fatal(msg);
+ if ((fj = malloc(sizeof(double) * 20)) == NULL) esl_fatal(msg);
+
+ /* Make a WAG-based score matrix in double-precision, without rounding to integers */
+ lambda0 = 0.3;
+ for (i = 0; i < 20; i++)
+ for (j = 0; j < 20; j++)
+ S->mx[i][j] = log(P0->mx[i][j] / (wagpi[i] * wagpi[j])) / lambda0;
+
+ /* Reverse engineer it in double precision */
+ if ( yualtschul_engine(S, P, fi, fj, &lambda) != eslOK) esl_fatal("reverse engineering engine failed");
+
+ /* Validate the solution (expect more accuracy from this than from integer scores) */
+ if (esl_DCompare(lambda0, lambda, 1e-4) != eslOK) esl_fatal("failed to get right lambda");
+
+ for (i = 0; i < 20; i++) /* you can't just call esl_dmx_Sum(P), because P includes */
+ for (j = 0; j < 20; j++) /* marginalized degeneracies */
+ sum += P->mx[i][j];
+ if (esl_DCompare(sum, 1.0, 1e-6) != eslOK) esl_fatal("reconstructed P doesn't sum to 1");
+
+ for (i = 0; i < 20; i++) /* for the same reason, you can't dmatrix_Compare P and P0 */
+ for (j = 0; j < 20; j++)
+ if (esl_DCompare(P0->mx[i][j], P->mx[i][j], 1e-2) != eslOK) esl_fatal("failed to recover correct P_ij");
+ for (i = 0; i < 20; i++)
+ {
+ if (esl_DCompare(fi[i], fj[i], 1e-6) != eslOK) esl_fatal("background fi, fj not the same");
+ if (esl_DCompare(wagpi[i], fi[i], 1e-3) != eslOK) esl_fatal("failed to reconstruct WAG backgrounds");
+ }
+
+ free(fj);
+ free(fi);
+ esl_dmatrix_Destroy(S);
+ esl_dmatrix_Destroy(P);
+ return;
+}
+
+
+/* utest_Probify()
+ * This tests Probify on a matrix that was calculated from probabilities in the first
+ * place. It verifies that the reconstructed Pij matrix matches the original Pij's
+ * that the score matrix was built from.
+ */
+static void
+utest_Probify(ESL_SCOREMATRIX *S0, ESL_DMATRIX *P0, double *wagpi, double lambda0)
+{
+ ESL_DMATRIX *P = NULL;
+ double *fi = NULL;
+ double *fj = NULL;
+ double lambda; /* reconstructed lambda */
+ double sum = 0.0;
+ int i,j;
+
+ if (esl_scorematrix_Probify(S0, &P, &fi, &fj, &lambda) != eslOK) esl_fatal("reverse engineering failed");
+
+ /* Validate the solution, gingerly (we expect significant error due to integer roundoff) */
+ if (esl_DCompare(lambda0, lambda, 0.01) != eslOK) esl_fatal("failed to get right lambda");
+ for (i = 0; i < 20; i++) /* you can't just call esl_dmx_Sum(P), because P includes */
+ for (j = 0; j < 20; j++) /* marginalized degeneracies */
+ sum += P->mx[i][j];
+ if (esl_DCompare(sum, 1.0, 1e-6) != eslOK) esl_fatal("reconstructed P doesn't sum to 1");
+
+ for (i = 0; i < 20; i++) /* for the same reason, you can't dmatrix_Compare P and P0 */
+ for (j = 0; j < 20; j++)
+ if (esl_DCompare(P0->mx[i][j], P->mx[i][j], 0.1) != eslOK) esl_fatal("failed to recover correct P_ij");
+ free(fj);
+ free(fi);
+ esl_dmatrix_Destroy(P);
+ return;
+}
+
+/* utest_ProbifyBLOSUM()
+ * This tests Probify on a score matrix where the original Pij's are treated as
+ * unknown. It verifies that if you create a new score matrix from the reconstructed
+ * Pij's, you get the original score matrix back. BLOSUM62 makes a good example,
+ * hence the name.
+ */
+static void
+utest_ProbifyBLOSUM(ESL_SCOREMATRIX *BL62)
+{
+ char *msg = "failure in ProbifyBLOSUM() unit test";
+ ESL_DMATRIX *P = NULL;
+ double *fi = NULL;
+ double *fj = NULL;
+ double lambda;
+ ESL_SCOREMATRIX *S2 = NULL;
+
+ if (( S2 = esl_scorematrix_Clone(BL62)) == NULL) esl_fatal(msg);
+ if (esl_scorematrix_Probify(BL62, &P, &fi, &fj, &lambda) != eslOK) esl_fatal(msg);
+ if (esl_scorematrix_SetFromProbs(S2, lambda, P, fi, fj) != eslOK) esl_fatal(msg);
+ if (esl_scorematrix_CompareCanon(BL62, S2) != eslOK) esl_fatal(msg);
+
+ free(fj);
+ free(fi);
+ esl_scorematrix_Destroy(S2);
+ esl_dmatrix_Destroy(P);
+ return;
+}
+
+#endif /*eslSCOREMATRIX_TESTDRIVE*/
+
+
+/*****************************************************************
+ * 10. Test driver.
+ *****************************************************************/
+/*
+ gcc -g -Wall -I. -L. -o test -DeslSCOREMATRIX_TESTDRIVE esl_scorematrix.c -leasel -lm
+ ./test
+*/
+#ifdef eslSCOREMATRIX_TESTDRIVE
+#include "easel.h"
+#include "esl_scorematrix.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_ALPHABET *abc = NULL; /* amino acid alphabet */
+ ESL_SCOREMATRIX *BL62= NULL; /* BLOSUM62 matrix */
+ ESL_SCOREMATRIX *S0 = NULL; /* original score matrix (calculated from P, fi, fj) */
+ ESL_DMATRIX *P0 = NULL; /* original P_ij joint probabilities */
+ ESL_DMATRIX *Q = NULL; /* WAG rate matrix */
+ double lambda0; /* true lambda used to construct S */
+ double t;
+ int i,j;
+ static double wagpi[20];
+
+ /* Allocations */
+ if ((abc = esl_alphabet_Create(eslAMINO)) == NULL) esl_fatal("allocation of alphabet failed");
+ if ((BL62= esl_scorematrix_Create(abc)) == NULL) esl_fatal("allocation of BLOSUM62 failed");
+ if ((S0 = esl_scorematrix_Create(abc)) == NULL) esl_fatal("allocation of scorematrix failed");
+ if ((P0 = esl_dmatrix_Create(abc->K, abc->K)) == NULL) esl_fatal("P allocation failed");
+ if ((Q = esl_dmatrix_Create(abc->K, abc->K)) == NULL) esl_fatal("Q allocation failed");
+
+ /* Make a BLOSUM matrix */
+ if ( esl_scorematrix_Set("BLOSUM62", BL62) != eslOK) esl_fatal("failed to set a BLOSUM matrix");
+
+ /* Make a WAG-based score matrix with small lambda. */
+ lambda0 = 0.00635;
+ t = 2.0;
+ esl_scorematrix_SetWAG(S0, lambda0, t);
+ esl_composition_WAG(wagpi);
+
+ /* Redo some calculations to get the known probabilistic basis of that S */
+ if ( esl_rmx_SetWAG(Q, wagpi) != eslOK) esl_fatal("failed to set WAG");
+ if ( esl_dmx_Exp(Q, t, P0) != eslOK) esl_fatal("failed to exponentiate WAG");
+ for (i = 0; i < 20; i++)
+ for (j = 0; j < 20; j++)
+ P0->mx[i][j] *= wagpi[i]; /* P_ij = P(j|i) pi_i */
+
+ /* The unit test battery
+ */
+ utest_ReadWrite(abc, BL62);
+ utest_ReadWrite(abc, S0);
+ utest_ProbifyGivenBG(S0, P0, wagpi, lambda0);
+ utest_yualtschul(P0, wagpi);
+ utest_Probify(S0, P0, wagpi, lambda0);
+ utest_ProbifyBLOSUM(BL62);
+
+ esl_dmatrix_Destroy(Q);
+ esl_dmatrix_Destroy(P0);
+ esl_scorematrix_Destroy(BL62);
+ esl_scorematrix_Destroy(S0);
+ esl_alphabet_Destroy(abc);
+
+ return 0;
+}
+#endif /*eslSCOREMATRIX_TESTDRIVE*/
+
+/*****************************************************************
+ * 11. Example program
+ *****************************************************************/
+
+#ifdef eslSCOREMATRIX_EXAMPLE
+/*::cexcerpt::scorematrix_example::begin::*/
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_fileparser.h"
+#include "esl_dmatrix.h"
+#include "esl_vectorops.h"
+#include "esl_scorematrix.h"
+
+int main(int argc, char **argv)
+{
+ char *scorefile = argv[1];
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslAMINO);
+ ESL_FILEPARSER *efp = NULL;
+ ESL_SCOREMATRIX *S = NULL;
+ ESL_DMATRIX *P1 = NULL; /* implicit probability basis, bg unknown */
+ ESL_DMATRIX *P2 = NULL; /* implicit probability basis, bg known */
+ double *fi = NULL;
+ double *fj = NULL;
+ double lambda, D, E;
+ int vstatus;
+
+ /* Input an amino acid score matrix from a file. */
+ if ( esl_fileparser_Open(scorefile, NULL, &efp) != eslOK) esl_fatal("failed to open score file %s", scorefile);
+ if ( esl_scorematrix_Read(efp, abc, &S) != eslOK) esl_fatal("failed to read matrix from %s", scorefile);
+ esl_fileparser_Close(efp);
+
+ /* Try to reverse engineer it to get implicit probabilistic model. This may fail! */
+ vstatus = esl_scorematrix_Probify(S, &P1, &fi, &fj, &lambda);
+
+ if (vstatus == eslOK)
+ { /* Print some info, and the joint probabilities. */
+
+ esl_scorematrix_RelEntropy (S, fi, fj, lambda, &D);
+ esl_scorematrix_ExpectedScore(S, fi, fj, &E);
+
+ printf("By Yu/Altschul (2003,2005) procedure:\n");
+ printf("Lambda = %.4f\n", lambda);
+ printf("Relative entropy = %.4f bits\n", D);
+ printf("Expected score = %.4f bits\n", E * lambda * eslCONST_LOG2R);
+
+ printf("p_ij's are:\n"); esl_dmatrix_Dump(stdout, P1, abc->sym, abc->sym);
+ printf("fi's are:\n"); esl_vec_DDump(stdout, fi, S->K, abc->sym);
+ printf("fj's are:\n"); esl_vec_DDump(stdout, fj, S->K, abc->sym);
+ printf("============================================================\n\n");
+ }
+ else
+ {
+ printf("Yu/Altschul procedure FAILS to find a valid implicit probability basis!\n");
+ printf("Lambda = %.4f\n", lambda);
+ printf("p_ij's are:\n"); esl_dmatrix_Dump(stdout, P1, abc->sym, abc->sym);
+ printf("fi's are:\n"); esl_vec_DDump(stdout, fi, S->K, abc->sym);
+ printf("fj's are:\n"); esl_vec_DDump(stdout, fj, S->K, abc->sym);
+ printf("============================================================\n\n");
+
+ esl_composition_BL62(fi); esl_composition_BL62(fj);
+ }
+
+ /* Now reverse engineer it again, this time using "known" background probs */
+ esl_scorematrix_ProbifyGivenBG(S, fi, fj, &lambda, &P2);
+ esl_scorematrix_RelEntropy (S, fi, fj, lambda, &D);
+ esl_scorematrix_ExpectedScore(S, fi, fj, &E);
+
+ printf("By solving for lambda from given background frequencies:\n");
+ printf("Lambda = %.4f\n", lambda);
+ printf("Relative entropy = %.4f bits\n", D);
+ printf("Expected score = %.4f bits\n", E * lambda * eslCONST_LOG2R);
+
+ printf("p_ij's are:\n"); esl_dmatrix_Dump(stdout, P2, abc->sym, abc->sym);
+ printf("fi's are:\n"); esl_vec_DDump(stdout, fi, S->K, abc->sym);
+ printf("fj's are:\n"); esl_vec_DDump(stdout, fj, S->K, abc->sym);
+ printf("============================================================\n\n");
+
+
+ /* Now recalculate a score matrix from the probabilistic basis */
+ printf("Before:\n");
+ esl_scorematrix_Write(stdout, S);
+ printf("After:\n");
+ esl_scorematrix_SetFromProbs(S, lambda, P2, fi, fj);
+ esl_scorematrix_Write(stdout, S);
+
+ free(fi); free(fj);
+ esl_dmatrix_Destroy(P1); esl_dmatrix_Destroy(P2);
+ esl_scorematrix_Destroy(S);
+ esl_alphabet_Destroy(abc);
+ return 0;
+}
+/*::cexcerpt::scorematrix_example::end::*/
+#endif /*eslSCOREMATRIX_EXAMPLE*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_scorematrix.h b/esl_scorematrix.h
new file mode 100644
index 0000000..a395200
--- /dev/null
+++ b/esl_scorematrix.h
@@ -0,0 +1,77 @@
+/* Routines for manipulating sequence alignment score matrices.
+ */
+#ifndef eslSCOREMATRIX_INCLUDED
+#define eslSCOREMATRIX_INCLUDED
+
+#include "esl_alphabet.h"
+#include "esl_fileparser.h"
+#include "esl_dmatrix.h"
+
+/* ESL_SCOREMATRIX:
+ * allocation is in one array in s[0].
+ *
+ * i,j can range from 0..Kp-1, including all characters valid in the alphabet.
+ * Only values for 0..K-1 (canonical alphabet) are mandatory.
+ */
+typedef struct {
+ int **s; /* s[i][j] is the score of aligning residue i,j; i,j range 0..Kp-1 */
+ int K; /* size of base alphabet (duplicate of S->abc_r->K) */
+ int Kp; /* full size of s[][], including degeneracies (duplicate of S->abc_r->Kp) */
+
+ /* bookkeeping for degenerate residues */
+ char *isval; /* array 0..Kp-1: which residues of alphabet have valid scores in S. */
+ const ESL_ALPHABET *abc_r; /* reference to the alphabet: includes K, Kp, and sym order */
+
+ /* bookkeeping that lets us output exactly the residue order we read in a matrix file */
+ int nc; /* number of residues with scores (inclusive of *, if present) */
+ char *outorder; /* NUL-terminated string 0..nc-1 giving order of residues in col/row labels */
+
+ char *name; /* optional: name of score matrix; or NULL */
+ char *path; /* optional: full path to file that score matrix was read from; or NULL */
+} ESL_SCOREMATRIX;
+
+
+
+/* 1. The ESL_SCOREMATRIX object. */
+extern ESL_SCOREMATRIX *esl_scorematrix_Create(const ESL_ALPHABET *abc);
+extern int esl_scorematrix_Copy(const ESL_SCOREMATRIX *src, ESL_SCOREMATRIX *dest);
+extern ESL_SCOREMATRIX *esl_scorematrix_Clone(const ESL_SCOREMATRIX *S);
+extern int esl_scorematrix_Compare(const ESL_SCOREMATRIX *S1, const ESL_SCOREMATRIX *S2);
+extern int esl_scorematrix_CompareCanon(const ESL_SCOREMATRIX *S1, const ESL_SCOREMATRIX *S2);
+extern int esl_scorematrix_Max(const ESL_SCOREMATRIX *S);
+extern int esl_scorematrix_Min(const ESL_SCOREMATRIX *S);
+extern int esl_scorematrix_IsSymmetric(const ESL_SCOREMATRIX *S);
+extern int esl_scorematrix_ExpectedScore(ESL_SCOREMATRIX *S, double *fi, double *fj, double *ret_E);
+extern int esl_scorematrix_RelEntropy(const ESL_SCOREMATRIX *S, const double *fi, const double *fj,
+ double lambda, double *ret_D);
+extern int esl_scorematrix_JointToConditionalOnQuery(const ESL_ALPHABET *abc, ESL_DMATRIX *P);
+extern void esl_scorematrix_Destroy(ESL_SCOREMATRIX *S);
+
+/* 2. Some classic score matrices */
+extern int esl_scorematrix_Set(const char *name, ESL_SCOREMATRIX *S);
+extern int esl_scorematrix_SetIdentity(ESL_SCOREMATRIX *S);
+
+/* 3. Deriving a score matrix probabilistically */
+extern int esl_scorematrix_SetFromProbs(ESL_SCOREMATRIX *S, double lambda, const ESL_DMATRIX *P,
+ const double *fi, const double *fj);
+extern int esl_scorematrix_SetWAG(ESL_SCOREMATRIX *S, double lambda, double t);
+
+/* 4. Reading/writing score matrices. */
+extern int esl_scorematrix_Read(ESL_FILEPARSER *efp, const ESL_ALPHABET *abc, ESL_SCOREMATRIX **ret_S);
+extern int esl_scorematrix_Write(FILE *fp, const ESL_SCOREMATRIX *S);
+
+/* 5. Implicit probabilistic basis, I: given bg. */
+extern int esl_scorematrix_ProbifyGivenBG(const ESL_SCOREMATRIX *S, const double *fi, const double *fj,
+ double *opt_lambda, ESL_DMATRIX **opt_P);
+
+/* 6. Implicit probabilistic basis, II: bg unknown. */
+extern int esl_scorematrix_Probify(const ESL_SCOREMATRIX *S, ESL_DMATRIX **opt_P,
+ double **opt_fi, double **opt_fj, double *opt_lambda);
+
+#endif /*eslSCOREMATRIX_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
+
+
diff --git a/esl_scorematrix.tex b/esl_scorematrix.tex
new file mode 100644
index 0000000..a05fdf5
--- /dev/null
+++ b/esl_scorematrix.tex
@@ -0,0 +1,51 @@
+The \eslmod{scorematrix} module implements standard residue pairwise
+alignment scoring systems (such as BLOSUM matrices), and their
+probabilistic interpretation \citep{Altschul91,YuAltschul03}.
+
+Table~\ref{tbl:scorematrix_api} lists the functions in the
+\eslmod{scorematrix} API. The module implements one object,
+\ccode{ESL\_SCOREMATRIX}, which holds a score matrix with integer
+scores.
+
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\apisubhead{The \ccode{ESL\_SCOREMATRIX} object.}\\
+\hyperlink{func:esl_scorematrix_Create()}{\ccode{esl\_scorematrix\_Create()}} & Create an \ccode{ESL\_SCOREMATRIX}.\\
+\hyperlink{func:esl_scorematrix_SetWAG()}{\ccode{esl\_scorematrix\_SetWAG()}} & Parameterize matrix from the WAG evolutionary model. \\
+\hyperlink{func:esl_scorematrix_SetFromProbs()}{\ccode{esl\_scorematrix\_SetFromProbs()}} & Set matrix scores from target and background probabilities.\\
+\hyperlink{func:esl_scorematrix_Compare()}{\ccode{esl\_scorematrix\_Compare()}} & Compare two matrices for equality.\\
+\hyperlink{func:esl_scorematrix_Max()}{\ccode{esl\_scorematrix\_Max()}} & Returns maximum value in score matrix.\\
+\hyperlink{func:esl_scorematrix_Min()}{\ccode{esl\_scorematrix\_Min()}} & Returns minimum value in score matrix.\\
+%\hyperlink{func:esl_scorematrix_RelativeEntropy()}{\ccode{esl\_scorematrix\_RelativeEntropy()}} & Returns relative entropy of a matrix.\\
+\hyperlink{func:esl_scorematrix_IsSymmetric()}{\ccode{esl\_scorematrix\_IsSymmetric()}} & Returns \ccode{TRUE} for symmetric matrix.\\
+\hyperlink{func:esl_scorematrix_Destroy()}{\ccode{esl\_scorematrix\_Destroy()}} & Frees a matrix.\\
+\apisubhead{Reading/writing score matrices.}\\
+\hyperlink{func:esl_scorematrix_Read()}{\ccode{esl\_scorematrix\_Read()}} & Read a standard matrix input file.\\
+\hyperlink{func:esl_scorematrix_Write()}{\ccode{esl\_scorematrix\_Write()}} & Write a BLAST-compatible score matrix file.\\
+%\apisubhead{Interpreting matrices probabilistically.}\\
+%\hyperlink{func:esl_scorematrix_ObtainPij()}{\ccode{esl\_scorematrix\_ObtainPij()}} & Obtain $P_{ij}$ from score matrix with known $\lambda$ and background $f$'s.\\
+%\hyperlink{func:esl_scorematrix_SolveLambda()}{\ccode{esl\_scorematrix\_SolveLambda()}} & Find $\lambda$ for score matrix, given background.\\
+%\hyperlink{func:esl_scorematrix_ReverseEngineer()}{\ccode{esl\_scorematrix\_ReverseEngineer()}} & Calculate the probabilistic basis of a score matrix.\\
+
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{scorematrix} API.}
+\label{tbl:scorematrix_api}
+\end{table}
+
+\subsection{An example of using the scorematrix API}
+
+Figure~\ref{fig:scorematrix_example} shows an example of reading a
+matrix file from disk, reverse engineering it \citep{YuAltschul03} to
+obtain its target probabilities, background frequencies, and lambda,
+then printing information about it:
+
+\begin{figure}
+\input{cexcerpts/scorematrix_example}
+\caption{An example of using the \eslmod{scorematrix} module.}
+\label{fig:scorematrix_example}
+\end{figure}
diff --git a/esl_sq.c b/esl_sq.c
new file mode 100644
index 0000000..95cc54f
--- /dev/null
+++ b/esl_sq.c
@@ -0,0 +1,2815 @@
+/* esl_sq : a single biological sequence.
+ *
+ * Contents:
+ * 1. Text version of the ESL_SQ object.
+ * 2. Digitized version of the ESL_SQ object. [with <alphabet>]
+ * 3. Other functions that operate on sequences.
+ * 4. Getting single sequences from MSAs. [with <msa>]
+ * 5. Debugging, development tools [with <random>, <randomseq>]
+ * 6. Internal functions.
+ * 7. Unit tests.
+ * 8. Test driver.
+ * 9. Examples.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#include "esl_sq.h"
+#include "esl_vectorops.h"
+
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h" /* alphabet adds digital sequences */
+#endif
+#ifdef eslAUGMENT_MSA
+#include "esl_msa.h" /* msa adds ability to extract sq from an MSA */
+#endif
+#if defined eslAUGMENT_RANDOM && defined eslAUGMENT_RANDOMSEQ
+#include "esl_random.h" /* random, randomseq add ability to sample random sq objects for unit tests */
+#include "esl_randomseq.h"
+#endif
+
+
+/* Shared parts of text/digital creation functions (defined in "internal functions" section) */
+static ESL_SQ *sq_create(int do_digital);
+static ESL_SQ *sq_create_from(const char *name, const char *desc, const char *acc);
+
+static ESL_SQ_BLOCK *sq_createblock(int count, int do_digital);
+
+static int sq_init(ESL_SQ *sq, int do_digital);
+static void sq_free(ESL_SQ *sq);
+
+/*****************************************************************
+ *# 1. Text version of the <ESL_SQ> object.
+ *****************************************************************/
+
+/* Function: esl_sq_Create()
+ * Synopsis: Create a new, empty <ESL_SQ>.
+ * Incept: SRE, Thu Dec 23 11:57:00 2004 [Zaragoza]
+ *
+ * Purpose: Creates an empty <ESL_SQ> sequence object, in text mode, with
+ * internal fields allocated to reasonable initial sizes.
+ *
+ * Args: (void)
+ *
+ * Returns: a pointer to the new <ESL_SQ>. Caller frees this with
+ * <esl_sq_Destroy()>.
+ *
+ * Throws: <NULL> if allocation fails.
+ */
+ESL_SQ *
+esl_sq_Create(void)
+{
+ return sq_create(FALSE);
+}
+
+/* Function: esl_sq_CreateFrom()
+ * Synopsis: Create a new <ESL_SQ> from text information.
+ * Incept: SRE, Wed Mar 22 09:17:04 2006 [St. Louis]
+ *
+ * Purpose: Create a new <ESL_SQ> object in text mode from elemental data.
+ * This provides an interface between non-Easel code
+ * and Easel's object.
+ *
+ * Makes copies of all data. Caller is still
+ * responsible for memory of name, seq, etc.
+ *
+ * <desc>, <acc>, and <ss> are optional. They can be passed
+ * as <NULL> to leave them blank.
+ *
+ * <ss> is an optional alphabetic secondary structure
+ * annotation string. If it is provided, its length must
+ * match the length of <seq>.
+ *
+ * Args: name - name of the sequence (NUL-terminated)
+ * seq - the sequence (alphabetic; NUL-terminated)
+ * desc - optional: description line (or NULL)
+ * acc - optional: accession (or NULL)
+ * ss - optional: secondary structure annotation (or NULL)
+ *
+ * Returns: a pointer to the new object. Free with
+ * <esl_sq_Destroy()>.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_SQ *
+esl_sq_CreateFrom(const char *name, const char *seq, const char *desc, const char *acc, const char *ss)
+{
+ ESL_SQ *sq = NULL;
+ int64_t n = strlen(seq);
+ int status;
+
+ if ((sq = sq_create_from(name, desc, acc)) == NULL) goto ERROR;
+ if ((status = esl_strdup(seq, n, &(sq->seq))) != eslOK) goto ERROR;
+
+ if (ss != NULL)
+ {
+ if (strlen(ss) != n) ESL_XEXCEPTION(eslEINVAL, "ss, seq lengths mismatch");
+ if ((status = esl_strdup(ss, n, &(sq->ss))) != eslOK) goto ERROR;
+ }
+ else sq->ss = NULL;
+
+ sq->n = n;
+ sq->salloc = n+1;
+
+ /* We assume we've created a complete sequence; set the coord bookkeeping accordingly. */
+ sq->start = 1;
+ sq->end = n;
+ sq->C = 0;
+ sq->W = n;
+ sq->L = n;
+
+ /* optional for extra residue markups */
+ sq->nxr = 0;
+ sq->xr_tag = NULL;
+ sq->xr = NULL;
+
+ return sq;
+
+ ERROR:
+ esl_sq_Destroy(sq);
+ return NULL;
+}
+
+/* Function: esl_sq_Grow()
+ * Synopsis: Assure that a <ESL_SQ> has space to add more residues.
+ * Incept: SRE, Wed Jan 10 08:26:23 2007 [Janelia]
+ *
+ * Purpose: Assure that the sequence <sq> can hold at least
+ * one more residue, whether in digital or text mode.
+ * Reallocate if necessary. Optionally returns the number
+ * of residues that can be added before the next call
+ * to <esl_sq_Grow()> in <opt_nsafe>.
+ *
+ * The terminal <NUL> or sentinel count as a residue for
+ * allocation purposes: that is, you may need to call
+ * <esl_sq_Grow()> before terminating a new sequence.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on reallocation failure. In this case, the
+ * original <sq> is untouched, and <*opt_nsafe> is returned
+ * as 0.
+ *
+ * Xref: STL11/125.
+ */
+int
+esl_sq_Grow(ESL_SQ *sq, int64_t *opt_nsafe)
+{
+ void *tmp;
+ int64_t new;
+ int64_t nsafe;
+ int x; /* index for optional extra residue markups */
+ int status;
+
+ if (sq->seq != NULL) nsafe = sq->salloc - sq->n; /* text */
+ else nsafe = (sq->salloc-1) - sq->n; /* digital: -1 because 0 is a sentinel */
+
+ if (nsafe < 1)
+ { /* reallocate by doubling (shouldn't need more, but if we do, keep doubling) */
+ new = sq->salloc;
+ do { nsafe += new; new*=2; } while (nsafe < 1);
+
+ if (sq->seq != NULL) ESL_RALLOC(sq->seq, tmp, new * sizeof(char)); /* text */
+ else ESL_RALLOC(sq->dsq, tmp, new * sizeof(ESL_DSQ)); /* digital */
+ if (sq->ss != NULL) ESL_RALLOC(sq->ss, tmp, new * sizeof(char));
+
+ for (x = 0; x < sq->nxr; x++)
+ if (sq->xr[x] != NULL) ESL_RALLOC(sq->xr[x], tmp, new * sizeof(char));
+
+ sq->salloc = new;
+ }
+ if (opt_nsafe != NULL) *opt_nsafe = nsafe;
+ return eslOK;
+
+ ERROR:
+ if (opt_nsafe != NULL) *opt_nsafe = 0;
+ return status;
+}
+
+/* Function: esl_sq_GrowTo()
+ * Synopsis: Grows an <ESL_SQ> to hold a seq of at least <n> residues.
+ * Incept: SRE, Fri Jan 18 11:06:50 2008 [UA5233 Westchester-Dulles]
+ *
+ * Purpose: Assure that the appropriate (text or digital) sequence
+ * field in <sq> can hold up to a total of <n> residues,
+ * reallocating as needed.
+ *
+ * If reallocated, the allocation will be $\geq (n+1)$ for
+ * text mode (the +1 is for the terminal NUL byte), $\geq
+ * (n+2)$ for digital mode (+2 for sentinel bytes at each
+ * end). That is, you don't need to take these extra bytes into
+ * account in your <n>; <n> is the number of residues, not
+ * bytes.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ * Note that n=0 is fine here, because we'll allocate either n+1 or n+2.
+ */
+int
+esl_sq_GrowTo(ESL_SQ *sq, int64_t n)
+{
+ int x; /* index for optional extra residue markups */
+ int status;
+
+ if (sq->seq != NULL) /* text mode */
+ {
+ if (n+1 > sq->salloc) {
+ ESL_REALLOC(sq->seq, (n+1) * sizeof(char));
+ if (sq->ss != NULL) ESL_REALLOC(sq->ss, (n+1) * sizeof(char));
+ for (x = 0; x < sq->nxr; x++) /* optional extra residue markups */
+ if (sq->xr[x] != NULL) ESL_REALLOC(sq->xr[x], (n+1) * sizeof(char));
+ sq->salloc = n+1;
+ }
+ }
+ else /* digital mode */
+ {
+ if (n+2 > sq->salloc) {
+ ESL_REALLOC(sq->dsq, (n+2) * sizeof(ESL_DSQ));
+ if (sq->ss != NULL) ESL_REALLOC(sq->ss, (n+2) * sizeof(char));
+ for (x = 0; x < sq->nxr; x++) /* optional extra residue markups */
+ if (sq->xr[x] != NULL) ESL_REALLOC(sq->xr[x], (n+2) * sizeof(char));
+
+ sq->salloc = n+2;
+ }
+ }
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_sq_Copy()
+ * Synopsis: Make a copy of an <ESL_SQ>.
+ * Incept: SRE, Sun Feb 24 17:59:24 2008 [UA5315 to St. Louis]
+ *
+ * Purpose: Copies a source sequence object <src> into
+ * destination sequence object <dst>.
+ *
+ * The two objects don't have to be matched as far as
+ * text/digital mode go; if mismatched, appropriate
+ * text/digital conversion will be done.
+ *
+ * The destination sequence <dst> is reallocated internally
+ * as necessary to hold a copy of <src>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ * Note: Note the shenanigans involved in copying ss; you have
+ * to pay attention to the ss being a 0..n-1 string in text
+ * mode versus a 1..n string in digital mode.
+ */
+int
+esl_sq_Copy(const ESL_SQ *src, ESL_SQ *dst)
+{
+ int x; /* index for optional extra residue markups */
+ int status;
+
+ /* If <src> has structure annotation and <dst> does not, initialize an allocation in <dst> */
+ if (src->ss != NULL && dst->ss == NULL) ESL_ALLOC(dst->ss, sizeof(char) * dst->salloc);
+
+ /* similarly for optional extra residue markups */
+ if (src->nxr > 0) {
+ if (dst->nxr > 0) {
+ for (x = 0; x < dst->nxr; x++) {
+ if (dst->xr[x] != NULL) { free(dst->xr[x]); dst->xr[x] = NULL; }
+ if (dst->xr_tag[x] != NULL) { free(dst->xr_tag[x]); dst->xr_tag[x] = NULL; }
+ }
+ if (dst->xr != NULL) { free(dst->xr); dst->xr = NULL; }
+ if (dst->xr_tag != NULL) { free(dst->xr_tag); dst->xr_tag = NULL; }
+ }
+
+ dst->nxr = src->nxr;
+ ESL_ALLOC(dst->xr_tag, sizeof(char *) * dst->nxr);
+ ESL_ALLOC(dst->xr, sizeof(char *) * dst->nxr);
+
+ for (x = 0; x < dst->nxr; x++) {
+ ESL_ALLOC(dst->xr_tag[x], sizeof(char) * src->nalloc);
+ ESL_ALLOC(dst->xr[x], sizeof(char) * src->salloc);
+ }
+ }
+
+ if ((status = esl_sq_SetName (dst, src->name)) != eslOK) goto ERROR;
+ if ((status = esl_sq_SetSource (dst, src->source)) != eslOK) goto ERROR;
+ if ((status = esl_sq_SetAccession(dst, src->acc)) != eslOK) goto ERROR;
+ if ((status = esl_sq_SetDesc (dst, src->desc)) != eslOK) goto ERROR;
+ if ((status = esl_sq_GrowTo (dst, src->n)) != eslOK) goto ERROR;
+
+ if (src->seq != NULL && dst->seq != NULL) /* text to text */
+ {
+ strcpy(dst->seq, src->seq);
+ if (src->ss != NULL) strcpy(dst->ss, src->ss);
+ for (x = 0; x < src->nxr; x++)
+ if (src->xr[x] != NULL) strcpy(dst->xr[x], src->xr[x]);
+ }
+#ifdef eslAUGMENT_ALPHABET
+ else if (src->seq != NULL && dst->dsq != NULL) /* text to digital */
+ {
+ if ((status = esl_abc_Digitize(dst->abc, src->seq, dst->dsq)) != eslOK) goto ERROR;
+ if (src->ss != NULL) {
+ strcpy(dst->ss+1, src->ss);
+ dst->ss[0] = '\0';
+ for (x = 0; x < src->nxr; x++)
+ if (src->xr[x] != NULL) { strcpy(dst->xr[x]+1, src->xr[x]); dst->xr[x][0] = '\0'; }
+ }
+ }
+ else if (src->dsq != NULL && dst->seq != NULL) /* digital to text */
+ {
+ if ((status = esl_abc_Textize(src->abc, src->dsq, src->n, dst->seq)) != eslOK) goto ERROR;
+ if (src->ss != NULL) strcpy(dst->ss, src->ss+1);
+ for (x = 0; x < src->nxr; x++)
+ if (src->xr[x] != NULL) strcpy(dst->xr[x], src->xr[x]+1);
+ }
+ else /* digital to digital */
+ {
+ if (src->abc->type != dst->abc->type)
+ ESL_XEXCEPTION(eslEINCOMPAT, "seq objects involved in Copy differ in digital alphabet");
+ if ((status = esl_abc_dsqcpy(src->dsq, src->n, dst->dsq)) != eslOK) goto ERROR;
+ if (src->ss != NULL) {
+ strcpy(dst->ss+1, src->ss+1);
+ dst->ss[0] = '\0';
+ }
+ for (x = 0; x < src->nxr; x++)
+ if (src->xr[x] != NULL) { strcpy(dst->xr[x]+1, src->xr[x]+1); dst->xr[x][0] = '\0'; }
+ }
+#endif
+
+ for (x = 0; x < src->nxr; x++)
+ if (src->xr_tag[x] != NULL) strcpy(dst->xr_tag[x], src->xr_tag[x]);
+
+ dst->n = src->n;
+ dst->start = src->start;
+ dst->end = src->end;
+ dst->C = src->C;
+ dst->W = src->W;
+ dst->L = src->L;
+ /* don't copy allocations (nalloc, etc); dst knows its own memory */
+ dst->roff = src->roff;
+ dst->doff = src->doff;
+ dst->hoff = src->hoff;
+ dst->eoff = src->eoff;
+ return eslOK;
+
+ ERROR:
+ esl_sq_Reuse(dst);
+ return status;
+}
+
+/* Function: esl_sq_Compare()
+ * Synopsis: Compare two sequence objects for equality.
+ * Incept: SRE, Tue May 13 09:00:41 2008 [Janelia]
+ *
+ * Purpose: Compare the contents of two sequence objects <sq1>
+ * and <sq2> for equality.
+ *
+ * Disk offsets are only compared if they are set in both
+ * <sq1> and <sq2>. Allocation sizes are not compared at
+ * all.
+ *
+ * Returns: <eslOK> if identical, <eslFAIL> if not.
+ */
+int
+esl_sq_Compare(ESL_SQ *sq1, ESL_SQ *sq2)
+{
+ int x; /* index for optional extra residue markups */
+
+ /* Annotation comparison */
+ if (strcmp(sq1->name, sq2->name) != 0) return eslFAIL;
+ if (strcmp(sq1->acc, sq2->acc) != 0) return eslFAIL;
+ if (strcmp(sq1->desc, sq2->desc) != 0) return eslFAIL;
+ if (strcmp(sq1->source, sq2->source) != 0) return eslFAIL;
+ if (sq1->ss != NULL && sq2->ss != NULL) {
+ if (strcmp(sq1->ss, sq2->ss) != 0) return eslFAIL;
+ } else
+ if (sq1->ss != NULL || sq2->ss != NULL) return eslFAIL;
+ if (sq1->n != sq2->n) return eslFAIL;
+
+ /* Sequence comparison */
+ if (sq1->seq != NULL && sq2->seq != NULL) {
+ if (strcmp(sq1->seq, sq2->seq) != 0) return eslFAIL;
+ }
+#ifdef eslAUGMENT_ALPHABET
+ else if (sq1->dsq != NULL && sq2->dsq != NULL) {
+ if (memcmp(sq1->dsq, sq2->dsq, sizeof(ESL_DSQ) * (sq1->n+2)) != 0) return eslFAIL;
+ }
+#endif
+ else return eslFAIL;
+
+ /* Coordinate comparison */
+ if (sq1->start != sq2->start) return eslFAIL;
+ if (sq1->end != sq2->end) return eslFAIL;
+ if (sq1->C != sq2->C) return eslFAIL;
+ if (sq1->W != sq2->W) return eslFAIL;
+ if (sq1->L != sq2->L) return eslFAIL;
+
+ /* Disk offset comparison */
+ if (sq1->roff != -1 && sq2->roff != -1 && sq1->roff != sq2->roff) return eslFAIL;
+ if (sq1->doff != -1 && sq2->doff != -1 && sq1->doff != sq2->doff) return eslFAIL;
+ if (sq1->hoff != -1 && sq2->hoff != -1 && sq1->hoff != sq2->hoff) return eslFAIL;
+ if (sq1->eoff != -1 && sq2->eoff != -1 && sq1->eoff != sq2->eoff) return eslFAIL;
+
+ /* optional extra residue markup comparison */
+ if (sq1->nxr != sq2->nxr) return eslFAIL;
+ for (x = 0; x < sq1->nxr; x++) {
+ if (sq1->xr_tag[x] != NULL && sq2->xr_tag[x] != NULL) {
+ if (strcmp(sq1->xr_tag[x], sq2->xr_tag[x]) != 0) return eslFAIL;
+ } else
+ if (sq1->xr_tag[x] != NULL || sq2->xr_tag[x] != NULL) return eslFAIL;
+
+ if (sq1->xr[x] != NULL && sq2->xr[x] != NULL) {
+ if (strcmp(sq1->xr[x], sq2->xr[x]) != 0) return eslFAIL;
+ } else
+ if (sq1->xr[x] != NULL || sq2->xr[x] != NULL) return eslFAIL;
+ }
+
+ /* alphabet comparison */
+#ifdef eslAUGMENT_ALPHABET
+ if (sq1->abc != NULL && (sq1->abc->type != sq2->abc->type)) return eslFAIL;
+#endif
+ return eslOK;
+}
+
+
+
+/* Function: esl_sq_Reuse()
+ * Synopsis: Reinitialize an <ESL_SQ> for re-use.
+ * Incept: SRE, Thu Dec 23 12:23:51 2004 [Zaragoza]
+ *
+ * Purpose: Given a sequence object <sq> already in use;
+ * reinitialize all its data, so a new seq
+ * may be read into it. This allows sequential sequence
+ * input without a lot of wasted allocation/free cycling.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_sq_Reuse(ESL_SQ *sq)
+{
+ int x; /* index for optional extra residue markups */
+
+ sq->name[0] = '\0';
+ sq->acc[0] = '\0';
+ sq->desc[0] = '\0';
+ sq->tax_id = -1;
+ sq->source[0] = '\0';
+ if (sq->seq != NULL) sq->seq[0] = '\0';
+ if (sq->dsq != NULL) sq->dsq[0] = sq->dsq[1] = eslDSQ_SENTINEL;
+ if (sq->ss != NULL) {
+ if (sq->seq != NULL) sq->ss[0] = '\0';
+ else sq->ss[0] = sq->ss[1] = '\0'; /* in digital mode, ss string is 1..n; 0 is a dummy \0 byte*/
+ }
+
+ /* optional extra residue markup */
+ if (sq->nxr > 0) {
+ for (x = 0; x < sq->nxr; x++) {
+ if (sq->xr[x] != NULL) { free(sq->xr[x]); sq->xr[x] = NULL; }
+ if (sq->xr_tag[x] != NULL) { free(sq->xr_tag[x]); sq->xr_tag[x] = NULL; }
+ }
+ if (sq->xr != NULL) { free(sq->xr); sq->xr = NULL; }
+ if (sq->xr_tag != NULL) { free(sq->xr_tag); sq->xr_tag = NULL; }
+ sq->nxr = 0;
+ }
+
+ sq->n = 0;
+ sq->start = 0;
+ sq->end = 0;
+ sq->C = 0;
+ sq->W = 0;
+ sq->L = -1;
+ sq->idx = -1;
+ sq->doff = -1;
+ sq->hoff = -1;
+ sq->roff = -1;
+ sq->eoff = -1;
+ return eslOK;
+}
+
+/* Function: esl_sq_IsDigital()
+ * Synopsis: Return <TRUE> if <sq> is digital.
+ * Incept: SRE, Mon Mar 2 18:05:34 2009 [Casa de Gatos]
+ *
+ * Purpose: Return <TRUE> if <sq> is in digital mode,
+ * and <FALSE> if not.
+ */
+int
+esl_sq_IsDigital(const ESL_SQ *sq)
+{
+ return ((sq->dsq != NULL) ? TRUE : FALSE);
+}
+
+
+/* Function: esl_sq_IsText()
+ * Synopsis: Return <TRUE> if <sq> is text mode.
+ * Incept: SRE, Mon Mar 2 18:06:22 2009 [Casa de Gatos]
+ *
+ * Purpose: Return <TRUE> if <sq> is in text mode,
+ * and <FALSE> if not.
+ */
+int
+esl_sq_IsText(const ESL_SQ *sq)
+{
+ return ((sq->seq != NULL) ? TRUE : FALSE);
+}
+
+
+/* Function: esl_sq_Destroy()
+ * Synopsis: Frees an <ESL_SQ>.
+ * Incept: SRE, Thu Dec 23 12:28:07 2004 [Zaragoza]
+ *
+ * Purpose: Free a Create()'d <sq>.
+ */
+void
+esl_sq_Destroy(ESL_SQ *sq)
+{
+ int x; /* index for optional extra residue markups */
+ if (sq == NULL) return;
+
+ if (sq->name != NULL) free(sq->name);
+ if (sq->acc != NULL) free(sq->acc);
+ if (sq->desc != NULL) free(sq->desc);
+ if (sq->seq != NULL) free(sq->seq);
+ if (sq->dsq != NULL) free(sq->dsq);
+ if (sq->ss != NULL) free(sq->ss);
+ if (sq->source != NULL) free(sq->source);
+ if (sq->nxr > 0) {
+ for (x = 0; x < sq->nxr; x++) {
+ if (sq->xr[x] != NULL) free(sq->xr[x]);
+ if (sq->xr_tag[x] != NULL) free(sq->xr_tag[x]);
+ }
+ if (sq->xr != NULL) free(sq->xr);
+ if (sq->xr_tag != NULL) free(sq->xr_tag);
+ }
+ free(sq);
+ return;
+}
+
+/* Function: esl_sq_CreateBlock()
+ * Synopsis: Create a new block of empty <ESL_SQ>.
+ * Incept:
+ *
+ * Purpose: Creates a block of empty <ESL_SQ> sequence objects.
+ *
+ * Returns: a pointer to the new <ESL_SQ_BLOCK>. Caller frees this
+ * with <esl_sq_DestroyBlock()>.
+ *
+ * Throws: <NULL> if allocation fails.
+ */
+ESL_SQ_BLOCK *
+esl_sq_CreateBlock(int count)
+{
+ return sq_createblock(count, FALSE);
+}
+
+/* Function: esl_sq_DestroyBlock()
+ * Synopsis: Frees an <ESL_SQ_BLOCK>.
+ * Incept:
+ *
+ * Purpose: Free a Create()'d block of <sq>.
+ */
+void
+esl_sq_DestroyBlock(ESL_SQ_BLOCK *block)
+{
+ int i;
+
+ if (block == NULL) return;
+
+ for (i = 0; i < block->listSize; ++i)
+ {
+ sq_free(block->list + i);
+ }
+
+ free(block->list);
+ free(block);
+ return;
+}
+
+/* Function: esl_sq_BlockGrowTo()
+ * Synopsis: Grows a sequence block to hold at least <n> <ESL_SQ>.
+ * Incept:
+ *
+ * Purpose: Assure that the list of sequences
+ * can hold up to a total of <n> sequences,
+ * reallocating as needed.
+ *
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ */
+int
+esl_sq_BlockGrowTo(ESL_SQ_BLOCK *sqblock, int newsize, int do_digital, const ESL_ALPHABET *abc)
+{
+ int status = eslOK;
+ int i;
+ if(sqblock->listSize < newsize)
+ {
+ ESL_REALLOC(sqblock->list, sizeof(ESL_SQ) * newsize);
+ sqblock->listSize = newsize;
+
+ for (i = sqblock->count; i < sqblock->listSize; ++i)
+ {
+ sqblock->list[i].abc = abc;
+ if ((status = sq_init(sqblock->list + i, do_digital)) != eslOK)
+ goto ERROR;
+ }
+ }
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+#ifdef eslAUGMENT_ALPHABET
+
+/* Function: esl_sq_CreateDigitalBlock()
+ * Synopsis: Create a new block of empty <ESL_SQ> in digital mode.
+ * Incept:
+ *
+ * Purpose: Same as <esl_sq_CreateBlock()>, except the returned <sq>
+ * is configured for a digital sequence using internal
+ * alphabet <abc>, rather than a text sequence. Creates an
+ * empty digital <ESL_SQ> sequence object, with internal
+ * fields allocated to reasonable initial sizes.
+ *
+ * Returns: a pointer to the new <ESL_SQ_BLOCK>. Caller frees this with
+ * <esl_sq_DestroyBlock()>.
+ *
+ * Throws: <NULL> if an allocation fails.
+ *
+ * Xref:
+ */
+ESL_SQ_BLOCK *
+esl_sq_CreateDigitalBlock(int count, const ESL_ALPHABET *abc)
+{
+ int i;
+ ESL_SQ_BLOCK *block;
+ if ((block = sq_createblock(count, TRUE)) == NULL) return NULL;
+
+ for (i = 0; i < count; ++i)
+ {
+ block->list[i].abc = abc;
+ }
+
+ return block;
+}
+
+#endif /* eslAUGMENT_ALPHABET */
+
+/*--------------- end of ESL_SQ object functions ----------------*/
+
+
+
+
+/*****************************************************************
+ *# 2. Digitized version of the <ESL_SQ> object. (Requires <alphabet>)
+ *****************************************************************/
+#ifdef eslAUGMENT_ALPHABET
+
+/* Function: esl_sq_CreateDigital()
+ * Synopsis: Create a new, empty <ESL_SQ> in digital mode.
+ * Incept: SRE, Tue Jan 9 16:42:35 2007 [Janelia]
+ *
+ * Purpose: Same as <esl_sq_Create()>, except the returned <sq> is
+ * configured for a digital sequence using internal
+ * alphabet <abc>, rather than a text sequence. Creates an
+ * empty digital <ESL_SQ> sequence object, with internal
+ * fields allocated to reasonable initial sizes.
+ *
+ * Args: abc - pointer to internal alphabet
+ *
+ * Returns: a pointer to the new <ESL_SQ>. Caller frees this with
+ * <esl_sq_Destroy()>.
+ *
+ * Throws: <NULL> if an allocation fails.
+ *
+ * Xref: STL11/124
+ */
+ESL_SQ *
+esl_sq_CreateDigital(const ESL_ALPHABET *abc)
+{
+ ESL_SQ *s;
+ if ((s = sq_create(TRUE)) == NULL) return NULL;
+ s->abc = abc;
+ return s;
+}
+
+/* Function: esl_sq_CreateDigitalFrom()
+ * Synopsis: Create a new digital <ESL_SQ> from text info.
+ * Incept: EPN, Fri Aug 24 13:38:56 2007
+ *
+ * Purpose: Create a new <ESL_SQ> object from elemental data.
+ * Same as <esl_sq_CreateFrom> except takes a digital <ESL_DSQ *dsq>
+ * instead of a text <char *seq> as the sequence to copy.
+ *
+ * Makes copies of all data. Caller is still
+ * responsible for memory of name, seq, etc.
+ *
+ * <ss> is an optional alphabetic secondary structure
+ * annotation string, <0..n-1>. If provided, its length
+ * must match the length of <seq>. (Note that although the
+ * argument <ss> is provided as a standard <0..n-1> C
+ * string, <ss> is stored internally as a <1..n> string in
+ * a digital sequence object, so that both the digital
+ * sequence and its alphabetic secondary structure
+ * annotation are indexed the same.)
+ *
+ * The object is growable; you can use <esl_sq_Reuse()>
+ * on it.
+ *
+ * Args: abc - the digital alphabet
+ * name - name of the sequence
+ * dsq - digital sequence <1..L>
+ * n - length of digitized sequence in residues (or -1 if unknown)
+ * desc - optional: description line (or NULL)
+ * acc - optional: accession (or NULL)
+ * ss - optional: secondary structure annotation (or NULL)
+ *
+ * Returns: a pointer to the new object. Free with
+ * <esl_sq_Destroy()>.
+ *
+ * Throws: <NULL> on allocation failure.
+ */
+ESL_SQ *
+esl_sq_CreateDigitalFrom(const ESL_ALPHABET *abc, const char *name, const ESL_DSQ *dsq, int64_t n,
+ const char *desc, const char *acc, const char *ss)
+{
+ ESL_SQ *sq = NULL;
+ int status;
+
+ if((sq = sq_create_from(name, desc, acc)) == NULL) goto ERROR;
+ sq->n = (n == -1) ? esl_abc_dsqlen(dsq) : n;
+ if ((status = esl_abc_dsqdup(dsq, sq->n, &(sq->dsq))) != eslOK) goto ERROR;
+
+ if (ss != NULL)
+ {
+ if (strlen(ss) != sq->n) ESL_XEXCEPTION(eslEINVAL, "ss, seq lengths mismatch");
+ ESL_ALLOC(sq->ss, sizeof(char) * (sq->n+2));
+ sq->ss[0] = '\0';
+ strcpy(sq->ss+1, ss);
+ }
+
+ /* We assume we've created a complete sequence; set the coord bookkeeping accordingly. */
+ sq->start = 1;
+ sq->end = n;
+ sq->C = 0;
+ sq->W = n;
+ sq->L = n;
+
+ sq->salloc = sq->n+2;
+ sq->abc = abc;
+ return sq;
+
+ ERROR:
+ esl_sq_Destroy(sq);
+ return NULL;
+}
+
+
+/* Function: esl_sq_Digitize()
+ * Synopsis: Convert an <ESL_SQ> to digital mode.
+ * Incept: EPN, Mon Feb 12 11:09:06 2007
+ *
+ * Purpose: Given a sequence <sq> in text mode, convert it to
+ * digital mode, using alphabet <abc>.
+ *
+ * Internally, the <dsq> digital sequence field is filled,
+ * the <seq> text alignment field is destroyed and free'd,
+ * a copy of the alphabet pointer is kept in the sq's
+ * <abc> reference.
+ *
+ * Args: abc - digital alphabet
+ * sq - sequence to digitize
+ *
+ * Returns: <eslOK> on success.
+ * Returns <eslEINVAL> if the sequence contains invalid characters
+ * that can't be digitized. If this happens, the <sq> is returned
+ * unaltered - left in text mode, with <seq> as it was. (This is
+ * a normal error, because <sq->seq> may be user input that we
+ * haven't validated yet.)
+ *
+ * Throws: <eslEMEM> on allocation failure; in this case, state of <sq> may be
+ * wedged, and it should only be destroyed, not used.
+ */
+int
+esl_sq_Digitize(const ESL_ALPHABET *abc, ESL_SQ *sq)
+{
+ int x; /* index for optional extra residue markups */
+ int status;
+
+ /* Contract checks */
+ if (sq->dsq != NULL) return eslOK;
+ if (sq->seq == NULL) ESL_EXCEPTION(eslEINVAL, "sq has no text sequence");
+
+ /* Validate before we convert, so we leave <seq> untouched if it's bad. */
+ if (esl_abc_ValidateSeq(abc, sq->seq, sq->n, NULL) != eslOK) return eslEINVAL;
+
+ /* Allocate dsq, ss properly; these are our last failure points. */
+ /* You can't just call Grow() here, because it would grow for old text mode, not new digital */
+ if (sq->salloc < sq->n+2) { /* it's possible (though unlikely) for salloc to be 1 residue too small */
+ sq->salloc = sq->n+2;
+ if (sq->ss != NULL) {
+ void *tmp;
+ ESL_RALLOC(sq->ss, tmp, sizeof(char) * sq->salloc);
+ }
+ /* optional extra residue markups follow same convenctions as ss */
+ for (x = 0; x < sq->nxr; x++)
+ if (sq->xr[x] != NULL) {
+ void *tmp;
+ ESL_RALLOC(sq->xr[x], tmp, sizeof(char) * sq->salloc);
+ }
+ }
+ ESL_ALLOC(sq->dsq, (sq->salloc) * sizeof(ESL_DSQ));
+
+ /* Now convert. */
+ if ((status = esl_abc_Digitize(abc, sq->seq, sq->dsq)) != eslOK) goto ERROR;
+ if (sq->ss != NULL) {
+ memmove(sq->ss+1, sq->ss, sq->n+1);
+ sq->ss[0] = '\0';
+ }
+ for (x = 0; x < sq->nxr; x++)
+ if (sq->xr[x] != NULL) {
+ memmove(sq->xr[x]+1, sq->xr[x], sq->n+1);
+ sq->xr[x][0] = '\0';
+ }
+
+ free(sq->seq);
+ sq->seq = NULL;
+ sq->abc = abc;
+ return eslOK;
+
+ ERROR:
+ if (sq->dsq != NULL) free(sq->dsq);
+ return status;
+}
+
+/* Function: esl_sq_Textize()
+ * Synopsis: Convert an <ESL_SQ> to text mode.
+ * Incept: EPN, Mon Feb 12 11:15:06 2007
+ *
+ * Purpose: Given a sequence <sq> in digital mode, convert it
+ * to text mode.
+ *
+ * Internally, the <seq> text alignment field is filled, the
+ * <dsq> digital alignment field is destroyed and free'd, the
+ * sq's <abc> digital alphabet reference is nullified.
+ *
+ * Args: sq - sequence object to convert to text
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * Throws <eslECORRUPT> if the digital sequence contains
+ * invalid codes.
+ */
+int
+esl_sq_Textize(ESL_SQ *sq)
+{
+ int x; /* index for optional extra residue markups */
+ int status;
+
+ /* Contract checks */
+ if (sq->seq != NULL) return eslOK;
+ if (sq->dsq == NULL) ESL_EXCEPTION(eslEINVAL, "sq has no digital sequence");
+ if (sq->abc == NULL) ESL_EXCEPTION(eslEINVAL, "sq has no digital alphabet");
+
+ /* Allocate. salloc is guaranteed big enough, if it was big enough for digital. */
+ ESL_ALLOC(sq->seq, sq->salloc * sizeof(char));
+
+ /* Convert. */
+ if ((status = esl_abc_Textize(sq->abc, sq->dsq, sq->n, sq->seq)) != eslOK) goto ERROR;
+ if (sq->ss != NULL)
+ memmove(sq->ss, sq->ss+1, sq->n+1); /* slide back to 0..n-1; +1 includes terminal \0 */
+ for (x = 0; x < sq->nxr; x++)
+ if (sq->xr[x] != NULL)
+ memmove(sq->xr[x], sq->xr[x]+1, sq->n+1); /* slide back to 0..n-1; +1 includes terminal \0 */
+
+ free(sq->dsq);
+ sq->dsq = NULL;
+ sq->abc = NULL; /* nullify reference (caller still owns real abc) */
+ return eslOK;
+
+ ERROR:
+ if (sq->seq != NULL) free(sq->seq);
+ return status;
+}
+
+/* Function: esl_sq_GuessAlphabet()
+ * Synopsis: Guess alphabet type of a single sequence.
+ *
+ * Purpose: Guess the alphabet type of biosequence <sq>, and store the
+ * guess in <*ret_type>.
+ *
+ * All 26 letters are valid in the amino alphabet (even <O>
+ * and <J> now), so the DNA alphabet is necessarily a subset.
+ * Therefore most protein sequences can be identified
+ * unambiguously (because they use letters that only occur
+ * in amino acid sequence), but DNA sequences cannot be.
+ *
+ * The sequence must contain more than 10 residues, or it
+ * is called <eslUNKNOWN>.
+ *
+ * For details on the rules used to classify a residue
+ * composition, see <esl_abc_GuessAlphabet()>. The rules
+ * are good but not perfect. We err on the conservative
+ * side, calling <eslUNKNOWN> rather than making
+ * classification errors. However, errors are possible; an
+ * example is a protein sequence <ACGTACGTACGT...>
+ * ("ala-cys-gly-thr..."), which will be called <eslDNA>,
+ * because it contains all and only DNA residues.
+ *
+ * The routine is tested on large sequence databases to
+ * make sure there are zero false positive classifications
+ * on known sequences. See <esl_abc_GuessAlphabet()> for
+ * details of these tests, and crossreferences.
+ *
+ * Returns: <eslOK> on success, and <*ret_type> is set to
+ * <eslAMINO>, <eslRNA>, or <eslDNA>.
+ *
+ * Returns <eslENOALPHABET> if unable to determine the
+ * alphabet type; in this case, <*ret_type> is set to
+ * <eslUNKNOWN>.
+ *
+ * Xref: See notes on esl_alphabet.c::esl_abc_GuessAlphabet()
+ */
+int
+esl_sq_GuessAlphabet(ESL_SQ *sq, int *ret_type)
+{
+ int64_t ct[26];
+ int x;
+ int64_t i;
+ int64_t n = 0;
+
+ for (x = 0; x < 26; x++) ct[x] = 0;
+ for (i = 0; i < sq->n; i++) {
+ x = toupper(sq->seq[i]) - 'A';
+ if (x < 0 || x > 26) continue;
+ ct[x]++;
+ n++;
+ if (n > 10000) break; /* we oughta know by now! */
+ }
+ return esl_abc_GuessAlphabet(ct, ret_type);
+}
+
+
+/* Function: esl_sq_ConvertDegen2X()
+ * Synopsis: Convert all degenerate residues to X/N
+ * Incept: SRE, Tue Apr 20 08:52:54 2010 [Janelia]
+ *
+ * Purpose: Convert all the degenerate residue codes in digital
+ * sequence <sq> to the code for "unknown residue" (maximum
+ * degeneracy); for example, X for protein, N for nucleic
+ * acid.
+ *
+ * This is handy when you need to be compatible with
+ * software that can't deal with unusual residue codes.
+ * For example, WU-BLAST can't deal with O (pyrrolysine)
+ * codes.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <sq> isn't in digital mode.
+ * (We only know how to interpret the alphabet
+ * in digital mode. In text mode, letters are
+ * just letters.)
+ */
+int
+esl_sq_ConvertDegen2X(ESL_SQ *sq)
+{
+ if (! esl_sq_IsDigital(sq)) ESL_EXCEPTION(eslEINVAL, "esl_sq_ConvertDegen2X() only works on digital sequences");
+ return esl_abc_ConvertDegen2X(sq->abc, sq->dsq);
+}
+
+
+#endif /*eslAUGMENT_ALPHABET*/
+/*---------- end of digitized ESL_SQ object functions -----------*/
+
+
+
+/*****************************************************************
+ *# 3. Other functions that operate on sequences.
+ *****************************************************************/
+
+/* Function: esl_sq_SetName()
+ * Synopsis: Set the name of a sequence.
+ * Incept: SRE, Thu Jan 11 08:42:53 2007 [Janelia]
+ *
+ * Purpose: Set the name of the sequence <sq> to <name>, reallocating
+ * as needed. For example, <esl_sq_SetName(sq, "random")>.
+ *
+ * A copy of <name> is made, so if caller had <name> allocated,
+ * it is still responsible for freeing it.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ *
+ * Xref: STL11/125
+ */
+int
+esl_sq_SetName(ESL_SQ *sq, const char *name)
+{
+ int n;
+ void *tmp;
+ int status;
+
+ if (name == NULL) { sq->name[0] = '\0'; return eslOK; }
+
+ n = strlen(name);
+ if (n >= sq->nalloc)
+ {
+ ESL_RALLOC(sq->name, tmp, sizeof(char) * (n+1));
+ sq->nalloc = n+1;
+ }
+ strcpy(sq->name, name);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_sq_SetAccession()
+ * Synopsis: Set the accession field in a sequence.
+ * Incept: SRE, Fri Jan 18 09:48:54 2008 [Westchester airport]
+ *
+ * Purpose: Set the accession of the sequence <sq> to <acc>, reallocating
+ * as needed. For example, <esl_sq_SetAccession(sq, "ACC12356")>.
+ *
+ * A copy of <acc> is made, so if caller had <acc> allocated,
+ * it is still responsible for freeing it.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ *
+ * Xref: STL11/125
+ */
+int
+esl_sq_SetAccession(ESL_SQ *sq, const char *acc)
+{
+ int n;
+ void *tmp;
+ int status;
+
+ if (acc == NULL) { sq->acc[0] = '\0'; return eslOK; }
+
+ n = strlen(acc);
+ if (n >= sq->aalloc)
+ {
+ ESL_RALLOC(sq->acc, tmp, sizeof(char) * (n+1));
+ sq->aalloc = n+1;
+ }
+ strcpy(sq->acc, acc);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_sq_SetDesc()
+ * Synopsis: Set the description field in a sequence.
+ * Incept: SRE, Fri Jan 18 09:46:14 2008 [Westchester airport]
+ *
+ * Purpose: Set the description of the sequence <sq> to <desc>, reallocating
+ * as needed.
+ * For example, <esl_sq_SetDesc(sq, "this is a random sequence")>.
+ *
+ * A copy of <desc> is made, so if caller had <desc> allocated,
+ * it is still responsible for freeing it.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ *
+ * Xref: STL11/125
+ */
+int
+esl_sq_SetDesc(ESL_SQ *sq, const char *desc)
+{
+ int n;
+ void *tmp;
+ int status;
+
+ if (desc == NULL) { sq->desc[0] = '\0'; return eslOK; }
+
+ n = strlen(desc);
+ if (n >= sq->dalloc)
+ {
+ ESL_RALLOC(sq->desc, tmp, sizeof(char) * (n+1));
+ sq->dalloc = n+1;
+ }
+ strcpy(sq->desc, desc);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_sq_SetSource()
+ * Synopsis: Set the source name field in a sequence.
+ * Incept: SRE, Wed May 7 16:17:56 2008 [Janelia]
+ *
+ * Purpose: Set the source of the sequence <sq> to <source>, reallocating
+ * as needed. For example, <esl_sq_SetSource(sq, "X123456")>.
+ *
+ * A copy of <source> is made, so if caller had <source> allocated,
+ * it is still responsible for freeing it.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ *
+ * Xref: STL11/125
+ */
+int
+esl_sq_SetSource(ESL_SQ *sq, const char *source)
+{
+ int n;
+ void *tmp;
+ int status;
+
+ if (source == NULL) { sq->source[0] = '\0'; return eslOK; }
+
+ n = strlen(source);
+ if (n >= sq->srcalloc)
+ {
+ ESL_RALLOC(sq->source, tmp, sizeof(char) * (n+1));
+ sq->srcalloc = n+1;
+ }
+ strcpy(sq->source, source);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_sq_FormatName()
+ * Synopsis: Format a name of a sequence, printf()-style.
+ * Incept: SRE, Fri Sep 11 10:59:01 2009 [Janelia]
+ *
+ * Purpose: Format the name of the sequence <sq> using
+ * <printf()>-style format string <name> and corresponding
+ * <printf()>-style arguments, reallocating as
+ * needed.
+ * For example, <esl_sq_FormatName(sq, "random%d", i)>.
+ *
+ * A copy of <name> is made, so if caller had <name> allocated,
+ * it is still responsible for freeing it.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_sq_FormatName(ESL_SQ *sq, const char *name, ...)
+{
+ va_list argp;
+ va_list argp2;
+ int n;
+ void *tmp;
+ int status;
+
+ if (name == NULL) { sq->name[0] = '\0'; return eslOK; }
+
+ va_start(argp, name);
+ va_copy(argp2, argp);
+ if ((n = vsnprintf(sq->name, sq->nalloc, name, argp)) >= sq->nalloc)
+ {
+ ESL_RALLOC(sq->name, tmp, sizeof(char) * (n+1));
+ sq->nalloc = n+1;
+ vsnprintf(sq->name, sq->nalloc, name, argp2);
+ }
+ va_end(argp);
+ va_end(argp2);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_sq_FormatAccession()
+ * Synopsis: Format the accession field in a sequence, printf()-style.
+ * Incept: SRE, Fri Sep 11 11:00:37 2009 [Janelia]
+ *
+ * Purpose: Format the accession of the sequence <sq> using <printf()>-style
+ * format string <acc> and corresponding <printf()>-style arguments,
+ * reallocating as needed.
+ * For example, <esl_sq_FormatAccession(sq, "ACC%06d", i)>.
+ *
+ * A copy of <acc> is made, so if caller had <acc> allocated,
+ * it is still responsible for freeing it.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_sq_FormatAccession(ESL_SQ *sq, const char *acc, ...)
+{
+ va_list argp, argp2;
+ int n;
+ void *tmp;
+ int status;
+
+ if (acc == NULL) { sq->acc[0] = '\0'; return eslOK; }
+
+ va_start(argp, acc);
+ va_copy(argp2, argp);
+ if ((n = vsnprintf(sq->acc, sq->aalloc, acc, argp)) >= sq->aalloc)
+ {
+ ESL_RALLOC(sq->acc, tmp, sizeof(char) * (n+1));
+ sq->aalloc = n+1;
+ vsnprintf(sq->acc, sq->aalloc, acc, argp2);
+ }
+ va_end(argp);
+ va_end(argp2);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_sq_FormatDesc()
+ * Synopsis: Format the description field in a sequence, printf()-style.
+ * Incept: SRE, Fri Sep 11 11:02:11 2009 [Janelia]
+ *
+ * Purpose: Format the description of the sequence <sq> using <printf()>-style
+ * format string <desc> and corresponding <printf()>-style arguments,
+ * reallocating as needed.
+ * For example, <esl_sq_FormatDesc(sq, "random sequence %d", i)>.
+ *
+ * A copy of <desc> is made, so if caller had <desc> allocated,
+ * it is still responsible for freeing it.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_sq_FormatDesc(ESL_SQ *sq, const char *desc, ...)
+{
+ va_list argp, argp2;
+ int n;
+ void *tmp;
+ int status;
+
+ if (desc == NULL) { sq->desc[0] = '\0'; return eslOK; }
+
+ va_start(argp, desc);
+ va_copy(argp2, argp);
+ if ((n = vsnprintf(sq->desc, sq->dalloc, desc, argp)) >= sq->dalloc)
+ {
+ ESL_RALLOC(sq->desc, tmp, sizeof(char) * (n+1));
+ sq->dalloc = n+1;
+ vsnprintf(sq->desc, sq->dalloc, desc, argp2);
+ }
+ va_end(argp);
+ va_end(argp2);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_sq_FormatSource()
+ * Synopsis: Format the source name field in a sequence, printf()-style.
+ * Incept: SRE, Fri Sep 11 10:55:10 2009 [Janelia]
+ *
+ * Purpose: Format the source of the sequence <sq> using <printf()>-style
+ * format string <source> and corresponding <printf()>-style arguments,
+ * reallocating as needed.
+ * For example, <esl_sq_FormatSource(sq, "source %d", i)>.
+ *
+ * A copy of <source> is made, so if caller had <source> allocated,
+ * it is still responsible for freeing it.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_sq_FormatSource(ESL_SQ *sq, const char *source, ...)
+{
+ va_list argp, argp2;
+ int n;
+ void *tmp;
+ int status;
+
+ if (source == NULL) { sq->source[0] = '\0'; return eslOK; }
+
+ va_start(argp, source);
+ va_copy(argp2, argp);
+ if ((n = vsnprintf(sq->source, sq->srcalloc, source, argp)) >= sq->srcalloc)
+ {
+ ESL_RALLOC(sq->source, tmp, sizeof(char) * (n+1));
+ sq->srcalloc = n+1;
+ vsnprintf(sq->source, sq->srcalloc, source, argp2);
+ }
+ va_end(argp);
+ va_end(argp2);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_sq_AppendDesc()
+ * Synopsis: Append a new line to a growing multiline description.
+ * Incept: SRE, Thu May 22 15:33:43 2008 [Janelia]
+ *
+ * Purpose: Append line <desc> to the description annotation line
+ * in <sq>.
+ *
+ * The annotation line <sq->desc> is a single line; it may
+ * not contain \verb+\n+ newlines. Caller is responsible
+ * for making sure <desc> does not terminate in \verb+\n+.
+ * If <sq->desc> already contains a description
+ * line (presumably because we're reading from a file format
+ * that's split the description across multiple lines),
+ * append a space before adding this next line <desc>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_sq_AppendDesc(ESL_SQ *sq, const char *desc)
+{
+ int dlen = (sq->desc == NULL ? 0 : strlen(sq->desc));
+ int newlen = (desc == NULL ? 0 : strlen(desc));
+ int status;
+
+ if (desc == NULL) return eslOK;
+
+ // sq->desc == NULL check below is logically unnecessary but it silences zealous static analyzers
+ if (sq->desc == NULL || dlen + newlen + 1 >= sq->dalloc) { // +1 for appended space.
+ ESL_REALLOC(sq->desc, sizeof(char) * (newlen+dlen+eslSQ_DESCCHUNK));
+ sq->dalloc = newlen+dlen+eslSQ_DESCCHUNK;
+ }
+
+ if (dlen > 0) { sq->desc[dlen] = ' '; dlen++; }
+ strcpy(sq->desc + dlen, desc);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+
+/* Function: esl_sq_SetCoordComplete()
+ * Synopsis: Sets coords in a complete sequence.
+ * Incept: SRE, Tue May 13 09:25:33 2008 [Janelia]
+ *
+ * Purpose: Declare that <sq> contains a complete sequence of length
+ * <L>; set the coordinate and length information in <sq>
+ * accordingly. This is used in building new sequence
+ * objects.
+ *
+ * <sq->seq> or <sq->dsq> must contain a sequence of length
+ * <L>.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_sq_SetCoordComplete(ESL_SQ *sq, int64_t L)
+{
+ sq->start = 1;
+ sq->end = L;
+ sq->C = 0;
+ sq->W = L;
+ sq->L = L;
+ sq->n = L;
+ return eslOK;
+}
+
+
+
+/* Function: esl_sq_CAddResidue()
+ * Synopsis: Add one residue (or terminal NUL) to a text seq.
+ * Incept: SRE, Wed Jan 10 07:58:20 2007 [Janelia]
+ *
+ * Purpose: Add one residue <c> onto a growing text mode sequence <sq>,
+ * and deal with any necessary reallocation.
+ *
+ * The sequence in <sq> is not <NUL>-terminated. To
+ * finish and NUL-terminate <sq>, call
+ * <esl_sq_CAddResidue(sq, 0)>.
+ *
+ * Note: Not the most efficient routine, but convenient in some
+ * routines. Parsers (where speed is at a premium) typically
+ * use an addseq() kind of function instead.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on re-allocation failure.
+ *
+ * Xref: STL11/125.
+ */
+int
+esl_sq_CAddResidue(ESL_SQ *sq, char c)
+{
+ if (esl_sq_Grow(sq, NULL) != eslOK) return eslEMEM;
+ sq->seq[sq->n] = c;
+ if (c != '\0') sq->n++;
+ return eslOK;
+}
+
+#ifdef eslAUGMENT_ALPHABET
+/* Function: esl_sq_XAddResidue()
+ * Synopsis: Add one residue (or terminal sentinel) to digital seq.
+ * Incept: SRE, Wed Jan 10 08:23:23 2007 [Janelia]
+ *
+ * Purpose: Like <esl_sq_CAddResidue()>, but for digital mode
+ * sequence: add a digital residue <x> onto a growing
+ * digital sequence <sq>.
+ *
+ * The digital sequence in <sq> must be explicitly
+ * terminated when you're done adding to it; call
+ * <esl_sq_XAddResidue(sq, eslDSQ_SENTINEL)>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on re-allocation failure.
+ *
+ * Xref: STL11/125.
+ */
+int
+esl_sq_XAddResidue(ESL_SQ *sq, ESL_DSQ x)
+{
+ if (esl_sq_Grow(sq, NULL) != eslOK) return eslEMEM;
+ sq->dsq[sq->n+1] = x;
+ if (x != eslDSQ_SENTINEL) sq->n++;
+ return eslOK;
+}
+#endif /* eslAUGMENT_ALPHABET */
+
+
+/* Function: esl_sq_ReverseComplement()
+ * Synopsis: Reverse complement a sequence.
+ * Incept: SRE, Thu May 15 20:52:13 2008 [Casa de Gatos]
+ *
+ * Purpose: Reverse complement the sequence <sq>, in place.
+ *
+ * If <sq> is in text mode, upper/lower case is preserved,
+ * and the DNA alphabet is used (<Aa> is complemented to
+ * <Tt>, not <Uu>). If a non-nucleic character is seen, it
+ * is reverse complemented to an N, and the return status
+ * is <eslEINVAL> (but the whole sequence is still reverse
+ * complemented).
+ *
+ * If <sq> is in digital mode, the appropriate alphabet
+ * (DNA vs. RNA) is used. If the alphabet has no defined
+ * complement (such as amino acids), an <eslEINCOMPAT>
+ * error is thrown, and the sequence isn't changed at all.
+ *
+ * Gap, nonresidues, and missing data characters, if any,
+ * are preserved (in text mode, <._-> are treated as gaps,
+ * <*> are nonresidues, and <~> as missing
+ * data). Degenerate nucleic acid IUPAC characters are
+ * complemented appropriately.
+ *
+ * The <start/end> coords in <sq> are swapped. (Note that
+ * in the unusual case of sequences of length 1,
+ * <start=end> and we can't unambiguously tell if a seq is
+ * in the reverse complement direction or not; this is a
+ * minor flaw in Easel's current coordinate handling.)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Returns <eslEINVAL> if the <sq> is in text mode, and we
+ * see a character that doesn't belong to the IUPAC DNA/RNA
+ * alphabet; in this case, the <sq> is still reverse
+ * complemented using the DNA alphabet, with <N> for any
+ * non-nucleic residues.
+ *
+ * Throws: <eslEINCOMPAT> if the <sq> is in digital mode, but the
+ * digital alphabet has no defined complement.
+ */
+int
+esl_sq_ReverseComplement(ESL_SQ *sq)
+{
+ int64_t i;
+ int x; /* index for optional extra residue markups */
+ int status = eslOK;
+
+ if (sq->seq != NULL)
+ {
+ /* first, complement the sequence */
+ for (i = 0; i < sq->n; i++)
+ switch (sq->seq[i]) {
+ case 'A': sq->seq[i] = 'T'; break;
+ case 'C': sq->seq[i] = 'G'; break;
+ case 'G': sq->seq[i] = 'C'; break;
+ case 'T': sq->seq[i] = 'A'; break;
+ case 'U': sq->seq[i] = 'A'; break;
+ case 'R': sq->seq[i] = 'Y'; break;
+ case 'Y': sq->seq[i] = 'R'; break;
+ case 'M': sq->seq[i] = 'K'; break;
+ case 'K': sq->seq[i] = 'M'; break;
+ case 'S': sq->seq[i] = 'S'; break;
+ case 'W': sq->seq[i] = 'W'; break;
+ case 'H': sq->seq[i] = 'D'; break;
+ case 'B': sq->seq[i] = 'V'; break;
+ case 'V': sq->seq[i] = 'B'; break;
+ case 'D': sq->seq[i] = 'H'; break;
+ case 'N': sq->seq[i] = 'N'; break;
+ case 'X': sq->seq[i] = 'X'; break;
+ case 'a': sq->seq[i] = 't'; break;
+ case 'c': sq->seq[i] = 'g'; break;
+ case 'g': sq->seq[i] = 'c'; break;
+ case 't': sq->seq[i] = 'a'; break;
+ case 'u': sq->seq[i] = 'a'; break;
+ case 'r': sq->seq[i] = 'y'; break;
+ case 'y': sq->seq[i] = 'r'; break;
+ case 'm': sq->seq[i] = 'k'; break;
+ case 'k': sq->seq[i] = 'm'; break;
+ case 's': sq->seq[i] = 's'; break;
+ case 'w': sq->seq[i] = 'w'; break;
+ case 'h': sq->seq[i] = 'd'; break;
+ case 'b': sq->seq[i] = 'v'; break;
+ case 'v': sq->seq[i] = 'b'; break;
+ case 'd': sq->seq[i] = 'h'; break;
+ case 'n': sq->seq[i] = 'n'; break;
+ case 'x': sq->seq[i] = 'x'; break;
+ case '.': sq->seq[i] = '.'; break;
+ case '_': sq->seq[i] = '_'; break;
+ case '-': sq->seq[i] = '-'; break;
+ case '~': sq->seq[i] = '~'; break;
+ case '*': sq->seq[i] = '*'; break;
+ default: sq->seq[i] = 'N'; status = eslEINVAL; break;
+ }
+
+ /* then, reverse it in place */
+ for (i = 0; i < sq->n / 2; i++)
+ ESL_SWAP(sq->seq[i], sq->seq[sq->n-i-1], char);
+ }
+#ifdef eslAUGMENT_ALPHABET
+ else
+ {
+ if ((status = esl_abc_revcomp(sq->abc, sq->dsq, sq->n)) != eslOK) goto ERROR;
+ }
+#endif /*eslAUGMENT_ALPHABET*/
+
+ ESL_SWAP(sq->start, sq->end, int64_t);
+ /* revcomp invalidates any secondary structure annotation */
+ if (sq->ss != NULL) { free(sq->ss); sq->ss = NULL; }
+ /* revcomp invalidates any extra residue markup */
+ if (sq->nxr > 0) {
+ for (x = 0; x < sq->nxr; x++)
+ if (sq->xr[x] != NULL) { free(sq->xr_tag[x]); free(sq->xr[x]); sq->xr_tag[x] = NULL; sq->xr[x] = NULL; }
+ free(sq->xr_tag); sq->xr_tag = NULL;
+ free(sq->xr); sq->xr = NULL;
+ }
+
+ return status;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_sq_Checksum()
+ * Synopsis: Calculate a 32-bit checksum for a sequence.
+ * Incept: SRE, Tue Aug 25 14:32:17 2009 [Janelia]
+ *
+ * Purpose: Calculate a 32-bit checksum for <sq>.
+ *
+ * Only the sequence data are considered, not name or other
+ * annotation. For text mode sequences, the checksum is
+ * case sensitive. The checksum is also sensitive to
+ * whether the sequence is text or digital mode; the same
+ * sequence in will yield different checksums in digital
+ * vs. text mode.
+ *
+ * Returns: <eslOK> on success; the checksum is in <*ret_checksum>.
+ */
+int
+esl_sq_Checksum(const ESL_SQ *sq, uint32_t *ret_checksum)
+{
+ uint32_t val = 0;
+ uint64_t pos;
+
+ if (sq->seq != NULL)
+ {
+ for (pos = 0; pos < sq->n; pos++)
+ {
+ val += sq->seq[pos];
+ val += (val << 10);
+ val ^= (val >> 6);
+ }
+ }
+#ifdef eslAUGMENT_ALPHABET
+ else
+ {
+ for (pos = 1; pos <= sq->n; pos++)
+ {
+ val += sq->dsq[pos];
+ val += (val << 10);
+ val ^= (val >> 6);
+ }
+ }
+#endif
+
+ val += (val << 3);
+ val ^= (val >> 11);
+ val += (val << 15);
+
+ *ret_checksum = val;
+ return eslOK;
+}
+
+
+
+/* Function: esl_sq_CountResidues()
+ * Synopsis: compute character counts
+ *
+ * Purpose: Given an ESL\_SQ <sq>, compute counts of all observed
+ * residues in the range between <start> and <start>+<L>-1. Note
+ * that a text-mode sequence starts at 0, while a digital-mode
+ * sequence starts at 1. Will count degeneracies as partial
+ * observations of the K canonical residues. Gaps, missing data,
+ * and not-a-residue characters will be ignored (so $\sum_x f[x]$ is
+ * not necessarily == L!). The array <*f> needs to be allocated for
+ * sq->abc->K values.
+ *
+ * The vector is not zeroed out, allowing counts to be gathered from
+ * a collection of ESL\_SQs.
+ *
+ * Returns: <eslOK> on success, <eslERANGE> when start or L are
+ * outside the range of the sequence.
+ */
+int
+esl_sq_CountResidues(const ESL_SQ *sq, int start, int L, float *f)
+{
+ int i;
+
+ if (sq->seq != NULL) { /* text */
+ if (start<0 || start+L>sq->n)
+ return eslERANGE; //range out of sequence bounds
+
+ for (i=start ; i < start+L; i++) {
+ if(! esl_abc_CIsGap(sq->abc, sq->seq[i])) // ignore gap characters
+ esl_abc_FCount(sq->abc, f, sq->abc->inmap[(int) sq->seq[i]], 1.);
+ }
+#ifdef eslAUGMENT_ALPHABET
+ } else { /* digital sequence; 0 is a sentinel */
+ if (start<1 || start+L>sq->n+1)
+ return eslERANGE; //range out of sequence bounds
+
+ for (i=start ; i < start+L; i++) {
+ if(! esl_abc_XIsGap(sq->abc, sq->dsq[i])) // ignore gap characters
+ esl_abc_FCount(sq->abc, f, sq->dsq[i], 1.);
+ }
+#endif
+ }
+
+ return eslOK;
+}
+
+
+
+/*---------------------- end, other functions -------------------*/
+
+
+
+/*****************************************************************
+ *# 4. Getting single sequences from MSAs (requires <msa>)
+ *****************************************************************/
+#ifdef eslAUGMENT_MSA
+
+/* Function: esl_sq_GetFromMSA()
+ * Synopsis: Get a single sequence from an MSA.
+ * Incept: SRE, Tue Apr 1 11:13:28 2008 [Janelia]
+ *
+ * Purpose: Retrieve sequence number <which> (<0..msa->nseq-1>) from
+ * <msa> and store it in the <sq> that the caller allocated
+ * and provided. This version (as opposed to
+ * <esl_sq_FetchFromMSA()>, below) allows caller to reuse
+ * the same <sq> container for retrieving sequences one at
+ * a time from an MSA.
+ *
+ * The retrieved sequence <sq> must be in the same mode as
+ * the source <msa>, text versus digital.
+ *
+ * The retrieved sequence is dealigned. For a text mode
+ * sequence, gap characters to be removed are assumed to be
+ * <-_.>. For a digital mode sequence, gap characters are
+ * defined by the digital alphabet.
+ *
+ * The <sq->source> field is set to the name of the MSA, if
+ * an MSA name is present.
+ *
+ * Returns: <eslOK> on success, and the retrieved sequence is in <sq>.
+ * Some of the internals of <sq> may have been reallocated if
+ * necessary.
+ *
+ * Returns <eslEOD> if there is no sequence number <which>.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslEINVAL> if <sq> is in a different text/digital mode than
+ * <msa>.
+ */
+int
+esl_sq_GetFromMSA(const ESL_MSA *msa, int which, ESL_SQ *sq)
+{
+ char *gapchars = "-_.~"; /* hardcoded for now */
+ char *acc = NULL;
+ char *desc = NULL;
+ char *ss = NULL;
+ char **xr_tag = NULL; /* extra residue markup tags */
+ char **xr = NULL; /* extra residue markup */
+ int x; /* index for optional extra residue markups */
+ int status;
+
+ if (which >= msa->nseq || which < 0) return eslEOD;
+ if ( (msa->flags & eslMSA_DIGITAL) && sq->dsq == NULL) ESL_XEXCEPTION(eslEINVAL, "msa is digital, sq is not");
+ if (!(msa->flags & eslMSA_DIGITAL) && sq->seq == NULL) ESL_XEXCEPTION(eslEINVAL, "msa is text, sq is not");
+
+ /* watch out for completely missing optional msa annotations;
+ * msa->sqacc[which] could segfault if msa->sqacc itself is NULL
+ */
+ if (msa->sqacc != NULL) acc = msa->sqacc[which];
+ if (msa->sqdesc != NULL) desc = msa->sqdesc[which];
+ if (msa->ss != NULL) ss = msa->ss[which];
+
+ /* a markup for unparsed #=GR lines is converted to a sequence extra residue markup */
+ if (msa->ngr)
+ {
+ ESL_ALLOC(xr_tag, sizeof(char *) * msa->ngr); for (x = 0; x < msa->ngr; x++) xr_tag[x] = NULL;
+ ESL_ALLOC(xr, sizeof(char *) * msa->ngr); for (x = 0; x < msa->ngr; x++) xr[x] = NULL;
+ }
+
+ sq->nxr = 0;
+ for (x = 0; x < msa->ngr; x ++) {
+ if (msa->gr[x][which] != NULL) {
+ xr[sq->nxr] = msa->gr[x][which];
+ if (msa->gr_tag[x] != NULL) xr_tag[sq->nxr] = msa->gr_tag[x]; else { status = eslEINVAL; goto ERROR; }
+ sq->nxr ++;
+ }
+ }
+ if (sq->nxr > 0) {
+ ESL_ALLOC(sq->xr_tag, sizeof(char *) * sq->nxr); for (x = 0; x < sq->nxr; x ++) sq->xr_tag[x] = NULL;
+ ESL_ALLOC(sq->xr, sizeof(char *) * sq->nxr); for (x = 0; x < sq->nxr; x ++) sq->xr[x] = NULL;
+ }
+
+ if ((status = esl_sq_SetName (sq, msa->sqname[which])) != eslOK) goto ERROR;
+ if ((status = esl_sq_SetAccession(sq, acc)) != eslOK) goto ERROR;
+ if ((status = esl_sq_SetDesc (sq, desc)) != eslOK) goto ERROR;
+ if ((status = esl_sq_SetSource (sq, msa->name)) != eslOK) goto ERROR;
+ if ((status = esl_sq_GrowTo (sq, msa->alen)) != eslOK) goto ERROR; /* can't be more than alen residues */
+
+ if (! (msa->flags & eslMSA_DIGITAL)) /* text mode to text mode */
+ {
+ strcpy(sq->seq, msa->aseq[which]);
+ if (ss != NULL) {
+ if (sq->ss == NULL) esl_strdup(ss, -1, &(sq->ss));
+ else strcpy(sq->ss, ss);
+ esl_strdealign(sq->ss, sq->seq, gapchars, NULL);
+ }
+ for (x = 0; x < sq->nxr; x++) {
+ esl_strdup(xr[x], -1, &(sq->xr[x]));
+ esl_strdup(xr_tag[x], -1, &(sq->xr_tag[x]));
+ esl_strdealign(sq->xr[x], sq->seq, gapchars, NULL);
+ }
+ esl_strdealign(sq->seq, sq->seq, gapchars, &(sq->n)); /* sq->n gets set as side effect */
+ }
+#ifdef eslAUGMENT_ALPHABET
+ else
+ {
+ esl_abc_dsqcpy(msa->ax[which], msa->alen, sq->dsq);
+ if (ss != NULL) {
+ if (sq->ss == NULL) { /* even in digital mode, msa->ss is [0.alen-1] */
+ ESL_ALLOC(sq->ss, sizeof(char) * (strlen(ss)+2));
+ sq->ss[0] = '\0';
+ strcpy(sq->ss+1, ss);
+ }
+ else { strcpy(sq->ss+1, ss); sq->ss[0] = '\0'; }
+ esl_abc_CDealign(sq->abc, sq->ss+1, sq->dsq, NULL);
+ }
+ for (x = 0; x < sq->nxr; x ++) { /* even in digital mode, msa->gr are [0.alen-1] */
+ ESL_ALLOC(sq->xr[x], sizeof(char) * (strlen(xr[x])+2));
+ sq->xr[x][0] = '\0';
+ strcpy(sq->xr[x]+1, xr[x]);
+ esl_abc_CDealign(sq->abc, sq->xr[x]+1, sq->dsq, NULL);
+ esl_strdup(xr_tag[x], -1, &(sq->xr_tag[x]));
+ }
+ esl_abc_XDealign(sq->abc, sq->dsq, sq->dsq, &(sq->n)); /* sq->n gets set as side effect */
+ }
+#endif /*eslAUGMENT_ALPHABET*/
+
+ /* This is a complete sequence; set bookkeeping accordingly */
+ sq->start = 1;
+ sq->end = sq->n;
+ sq->C = 0;
+ sq->W = sq->n;
+ sq->L = sq->n;
+
+ sq->roff = -1;
+ sq->doff = -1;
+ sq->hoff = -1;
+ sq->eoff = -1;
+
+ if (xr_tag) free(xr_tag);
+ if (xr) free(xr);
+ return eslOK;
+
+ ERROR:
+ if (xr_tag) free(xr_tag);
+ if (xr) free(xr);
+ return status;
+}
+
+
+/* Function: esl_sq_FetchFromMSA()
+ * Synopsis: Fetch a single sequence from an MSA.
+ * Incept: SRE, Sun Mar 30 13:39:06 2008 [Janelia]
+ *
+ * Purpose: Retrieve sequence number <which> (<0..msa->nseq-1>) from <msa>, in a newly
+ * allocated sequence object; return a pointer to this object
+ * in <ret_sq>.
+ *
+ * The retrieved sequence is in the same mode as the source
+ * <msa>, text versus digital.
+ *
+ * The retrieved sequence is dealigned. For a text mode
+ * sequence, gap characters to be removed are assumed to be
+ * <-_.~>. For a digital mode sequence, gap characters are
+ * defined by the digital alphabet.
+ *
+ * Returns: <eslOK> on success, and a pointer to the newly fetched
+ * sequence is in <*ret_sq>, which caller is responsible for freeing.
+ *
+ * Returns <eslEOD> if there is no sequence number <which>.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_sq_FetchFromMSA(const ESL_MSA *msa, int which, ESL_SQ **ret_sq)
+{
+ ESL_SQ *sq = NULL;
+ char *acc = NULL;
+ char *desc = NULL;
+ char *ss = NULL;
+ char *gapchars = "-_.~"; /* hardcoded for now; only affects text mode, not digital */
+ char **xr_tag = NULL; /* extra residue markup tags */
+ char **xr = NULL; /* extra residue markup */
+ int nxr = 0; /* number of extra residue markups */
+ int x; /* index for optional extra residue markups */
+ int status;
+
+ if (which >= msa->nseq || which < 0) return eslEOD;
+
+ /* watch out for optional msa annotations being totally NULL */
+ if (msa->sqacc != NULL) acc = msa->sqacc[which];
+ if (msa->sqdesc != NULL) desc = msa->sqdesc[which];
+ if (msa->ss != NULL) ss = msa->ss[which];
+
+ /* a markup for unparsed #=GR lines is converted to a sequence extra residue markup */
+ if (msa->ngr > 0) {
+ ESL_ALLOC(xr_tag, sizeof(char *) * msa->ngr);
+ ESL_ALLOC(xr, sizeof(char *) * msa->ngr);
+ for (x = 0; x < msa->ngr; x ++) {
+ xr_tag[x] = NULL;
+ xr[x] = NULL;
+ if (msa->gr[x][which] != NULL) {
+ xr[nxr] = msa->gr[x][which];
+ if (msa->gr_tag[x] != NULL) xr_tag[nxr] = msa->gr_tag[x]; else goto ERROR;
+ nxr ++;
+ }
+ }
+ }
+
+ if (! (msa->flags & eslMSA_DIGITAL)) /* text mode MSA to text mode sequence */
+ {
+ if ((sq = esl_sq_CreateFrom(msa->sqname[which], msa->aseq[which], desc, acc, ss)) == NULL) goto ERROR;
+ if (sq->ss != NULL) esl_strdealign(sq->ss, sq->seq, gapchars, NULL);
+
+ if (nxr > 0) {
+ sq->nxr = nxr;
+ ESL_ALLOC(sq->xr_tag, sizeof(char *) * sq->nxr); for (x = 0; x < sq->nxr; x ++) sq->xr_tag[x] = NULL;
+ ESL_ALLOC(sq->xr, sizeof(char *) * sq->nxr); for (x = 0; x < sq->nxr; x ++) sq->xr[x] = NULL;
+ for (x = 0; x < sq->nxr; x ++) {
+ if (xr[x] != NULL) {
+ if (sq->xr[x] == NULL) esl_strdup(xr[x], sq->n, &(sq->xr[x]));
+ else strcpy(sq->xr[x], xr[x]);
+ esl_strdealign(sq->xr[x], sq->seq, gapchars, NULL);
+ }
+ if (xr_tag[x] != NULL) {
+ if (sq->xr_tag[x] == NULL) esl_strdup(xr_tag[x], -1, &(sq->xr_tag[x]));
+ else strcpy(sq->xr_tag[x], xr_tag[x]);
+ }
+ }
+ }
+ esl_strdealign(sq->seq, sq->seq, gapchars, &(sq->n));
+ }
+#ifdef eslAUGMENT_ALPHABET
+ else /* digital mode MSA to digital mode sequence */
+ {
+ if ((sq = esl_sq_CreateDigitalFrom(msa->abc, msa->sqname[which], msa->ax[which], msa->alen, desc, acc, ss)) == NULL) goto ERROR;
+ if (sq->ss != NULL) esl_abc_CDealign(sq->abc, sq->ss+1, sq->dsq, NULL);
+ if (nxr > 0) {
+ sq->nxr = nxr;
+ ESL_ALLOC(sq->xr_tag, sizeof(char *) * sq->nxr); for (x = 0; x < sq->nxr; x ++) sq->xr_tag[x] = NULL;
+ ESL_ALLOC(sq->xr, sizeof(char *) * sq->nxr); for (x = 0; x < sq->nxr; x ++) sq->xr[x] = NULL;
+ for (x = 0; x < sq->nxr; x ++) {
+ if (xr[x] != NULL) {
+ if (sq->xr[x] == NULL) {
+ ESL_ALLOC(sq->xr[x], sizeof(char) * (sq->n+2));
+ sq->xr[x][0] = '\0';
+ strcpy(sq->xr[x]+1, xr[x]);
+ }
+ else strcpy(sq->xr[x]+1, xr[x]); sq->xr[x][0] = '\0';
+ esl_abc_CDealign(sq->abc, sq->xr[x]+1, sq->dsq, NULL);
+ }
+ if (xr_tag[x] != NULL) {
+ if (sq->xr_tag[x] == NULL) esl_strdup(xr_tag[x], -1, &(sq->xr_tag[x]));
+ else strcpy(sq->xr_tag[x], xr_tag[x]);
+ }
+ }
+ }
+ esl_abc_XDealign(sq->abc, sq->dsq, sq->dsq, &(sq->n));
+ }
+#endif
+
+ if ((status = esl_sq_SetSource(sq, msa->name)) != eslOK) goto ERROR;
+
+ sq->start = 1;
+ sq->end = sq->n;
+ sq->L = sq->n;
+ sq->C = 0;
+ sq->W = sq->n;
+ *ret_sq = sq;
+
+ if (msa->ngr > 0) {
+ free(xr_tag); free(xr);
+ }
+ return eslOK;
+
+ ERROR:
+ if (msa->ngr > 0) {
+ if (xr_tag != NULL) free(xr_tag); if (xr != NULL) free(xr);
+ }
+ esl_sq_Destroy(sq);
+ *ret_sq = NULL;
+ return eslEMEM;
+}
+#endif /*eslAUGMENT_MSA*/
+/*---------------- end, sequences from MSAs --------------------*/
+
+
+
+/*****************************************************************
+ *# 5. Debugging/development tools [with <random> and <randomseq>]
+ *****************************************************************/
+#if defined eslAUGMENT_RANDOM && defined eslAUGMENT_RANDOMSEQ
+
+/* Function: esl_sq_Sample()
+ * Synopsis: Sample a random, ugly <ESL_SQ> for test purposes.
+ * Incept: SRE, Tue Feb 23 08:32:54 2016 [H1/83]
+ *
+ * Purpose: Sample a random sequence with random annotation, with a
+ * sequence length of <0..maxL> (note 0 is included!),
+ * using the random number generator <rng>. Return the
+ * newly allocated sequence in <*ret_sq>. Caller is
+ * responsible for free'ing it with <esl_sq_Destroy()>.
+ *
+ * If <abc> is <NULL>, a text mode sequence is sampled. If
+ * a digital alphabet <abc> is provided, a digital mode
+ * sequence is sampled.
+ *
+ * This routine is intended for producing test cases. The
+ * sequence object contains randomized contents. If you
+ * want to synthesize random sequences (as opposed to
+ * sampling an entirely synthetic <ESL_SQ> object), see
+ * the <randomseq> module.
+ *
+ * Args: rng : random number generator
+ * abc : digital alphabet; or <NULL> for text mode
+ * maxL : sequence length sampled is 0..maxL
+ * ret_sq : RESULT: new <ESL_SQ>
+ *
+ * Returns: <eslOK> on success
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_sq_Sample(ESL_RANDOMNESS *rng, ESL_ALPHABET *abc, int maxL, ESL_SQ **ret_sq)
+{
+ ESL_SQ *sq = *ret_sq; // caller may or may not provide an existing <sq>
+ int maxn = eslSQ_NAMECHUNK *2; // by being bigger than the initial alloc size, we will exercise realloc
+ int maxa = eslSQ_ACCCHUNK *2;
+ int maxd = eslSQ_DESCCHUNK *2;
+ char *buf = NULL;
+ int n;
+ int status;
+
+ n = ESL_MAX(maxn, ESL_MAX(maxa, maxd));
+ ESL_ALLOC(buf, sizeof(char) * (n+1));
+
+ if (! sq)
+ {
+ if (abc == NULL) { if (( sq = esl_sq_Create()) == NULL) { status = eslEMEM; goto ERROR; } }
+#ifdef eslAUGMENT_ALPHABET
+ else { if (( sq = esl_sq_CreateDigital(abc)) == NULL) { status = eslEMEM; goto ERROR; } }
+#endif /*eslAUGMENT_ALPHABET*/
+ }
+
+ /* Name */
+ do {
+ n = 1 + esl_rnd_Roll(rng, maxn); // 1..maxn
+ esl_rsq_Sample(rng, eslRSQ_SAMPLE_GRAPH, n, &buf); // one word: no space
+ } while (ispunct(buf[0])); // #, // are bad things for names to start with in Stockholm
+ esl_sq_SetName(sq, buf);
+
+ /* Optional accession */
+ if (esl_rnd_Roll(rng, 2)) // 50% chance of an accession
+ {
+ n = 1 + esl_rnd_Roll(rng, maxa); // 1..maxa
+ esl_rsq_Sample(rng, eslRSQ_SAMPLE_GRAPH, n, &buf); // one word: no space
+ esl_sq_SetAccession(sq, buf);
+ }
+
+ /* Optional description */
+ if (esl_rnd_Roll(rng, 2)) // 50% chance of a description
+ {
+ do {
+ n = 1 + esl_rnd_Roll(rng, maxd); // 1..maxa
+ esl_rsq_Sample(rng, eslRSQ_SAMPLE_PRINT, n, &buf); // include spaces in descriptions...
+ } while (isspace(buf[0])); // ... just not as the first char.
+ esl_sq_SetDesc(sq, buf);
+ }
+
+ /* Optional taxid. */
+ if (esl_rnd_Roll(rng, 2)) // 50% chance of taxid
+ {
+ sq->tax_id = 1 + esl_rnd_Roll(rng, 2147483647); // 1..2^31-1
+ }
+
+ /* Sequence, in text or digital mode */
+ n = esl_rnd_Roll(rng, maxL+1); //0..maxL; 0 len seqs happen
+ esl_sq_GrowTo(sq, n);
+ if (abc == NULL) esl_rsq_Sample(rng, eslRSQ_SAMPLE_ALPHA, n, &(sq->seq));
+#ifdef eslAUGMENT_ALPHABET
+ else esl_rsq_SampleDirty(rng, abc, NULL, n, sq->dsq); // "dirty" = with ambig residues
+#endif /*eslAUGMENT_ALPHABET*/
+ esl_sq_SetCoordComplete(sq, n);
+
+ free(buf);
+ *ret_sq = sq;
+ return eslOK;
+
+ ERROR:
+ if (buf) free(buf);
+ if (!(*ret_sq) && sq) esl_sq_Destroy(sq);
+ return status;
+}
+#endif /*eslAUGMENT_RANDOM && eslAUGMENT_RANDOMSEQ */
+
+
+
+/*****************************************************************
+ * 6. Internal functions
+ *****************************************************************/
+
+/* Create and CreateDigital() are almost identical, so
+ * their shared guts are here:
+ */
+static ESL_SQ *
+sq_create(int do_digital)
+{
+ ESL_SQ *sq = NULL;
+ int status;
+
+ ESL_ALLOC(sq, sizeof(ESL_SQ));
+
+ if (sq_init(sq, do_digital) != eslOK) goto ERROR;
+
+ return sq;
+
+ ERROR:
+ esl_sq_Destroy(sq);
+ return NULL;
+}
+
+/* Create an <ESL_SQ_BLOCK> object and its list of <ESL_SQ> objects */
+static ESL_SQ_BLOCK *
+sq_createblock(int count, int do_digital)
+{
+ int i = 0;
+
+ ESL_SQ_BLOCK *block = NULL;
+ int status = eslOK;
+
+ ESL_ALLOC(block, sizeof(ESL_SQ_BLOCK));
+
+ block->count = 0;
+ block->first_seqidx = -1;
+ block->list = NULL;
+ block->complete = TRUE;
+
+ ESL_ALLOC(block->list, sizeof(ESL_SQ) * count);
+ block->listSize = count;
+
+ for (i = 0; i < count; ++i)
+ {
+ if (sq_init(block->list + i, do_digital) != eslOK) goto ERROR;
+ }
+
+ return block;
+
+ ERROR:
+ esl_sq_DestroyBlock(block);
+ return NULL;
+}
+
+/* Initialize <ESL_SQ> object */
+static int
+sq_init(ESL_SQ *sq, int do_digital)
+{
+ int status;
+
+ sq->name = NULL;
+ sq->acc = NULL;
+ sq->desc = NULL;
+ sq->source = NULL;
+ sq->tax_id = -1;
+ sq->seq = NULL;
+ sq->dsq = NULL;
+ sq->ss = NULL; /* Note that ss is optional - it will only be allocated if needed */
+ /* n, coord bookkeeping, and strings are all set below by a call to Reuse() */
+
+ sq->nalloc = eslSQ_NAMECHUNK;
+ sq->aalloc = eslSQ_ACCCHUNK;
+ sq->dalloc = eslSQ_DESCCHUNK;
+ sq->salloc = eslSQ_SEQCHUNK;
+ sq->srcalloc = eslSQ_NAMECHUNK;
+
+ ESL_DASSERT1(( sq->salloc >= 4 )); // dsqdata makes this assumption when it packs in place.
+
+ /* optional for extra residue markups */
+ sq->nxr = 0;
+ sq->xr_tag = NULL;
+ sq->xr = NULL;
+
+ ESL_ALLOC(sq->name, sizeof(char) * sq->nalloc);
+ ESL_ALLOC(sq->acc, sizeof(char) * sq->aalloc);
+ ESL_ALLOC(sq->desc, sizeof(char) * sq->dalloc);
+ ESL_ALLOC(sq->source, sizeof(char) * sq->srcalloc);
+ if (do_digital) ESL_ALLOC(sq->dsq, sizeof(ESL_DSQ) * sq->salloc);
+ else ESL_ALLOC(sq->seq, sizeof(char) * sq->salloc);
+
+ esl_sq_Reuse(sq); /* initialization of sq->n, offsets, and strings */
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+/* CreateFrom and CreateDigitalFrom() are almost identical, so
+ * their shared guts are here:
+ */
+static ESL_SQ *
+sq_create_from(const char *name, const char *desc, const char *acc)
+{
+ ESL_SQ *sq = NULL;
+ int64_t n;
+ int status;
+
+ ESL_ALLOC(sq, sizeof(ESL_SQ));
+ sq->name = NULL;
+ sq->acc = NULL;
+ sq->desc = NULL;
+ sq->seq = NULL;
+ sq->dsq = NULL;
+ sq->ss = NULL;
+ sq->source = NULL;
+
+ /* optional for extra residue markups */
+ sq->nxr = 0;
+ sq->xr_tag = NULL;
+ sq->xr = NULL;
+
+ /* coord bookkeeping has to be set by the parent caller,
+ * because that's where we know the seq length <n>. We don't
+ * know it here.
+ */
+ sq->doff = -1;
+ sq->hoff = -1;
+ sq->roff = -1;
+ sq->eoff = -1;
+
+ if (name != NULL)
+ {
+ n = strlen(name)+1;
+ ESL_ALLOC(sq->name, sizeof(char) * n);
+ strcpy(sq->name, name);
+ sq->nalloc = n;
+ }
+ else
+ {
+ sq->nalloc = eslSQ_NAMECHUNK;
+ ESL_ALLOC(sq->name, sizeof(char) * sq->nalloc);
+ sq->name[0] = '\0';
+ }
+
+ if (desc != NULL)
+ {
+ n = strlen(desc)+1;
+ ESL_ALLOC(sq->desc, sizeof(char) * n);
+ strcpy(sq->desc, desc);
+ sq->dalloc = n;
+ }
+ else
+ {
+ sq->dalloc = eslSQ_DESCCHUNK;
+ ESL_ALLOC(sq->desc, sizeof(char) * sq->dalloc);
+ sq->desc[0] = '\0';
+ }
+
+ if (acc != NULL)
+ {
+ n = strlen(acc)+1;
+ ESL_ALLOC(sq->acc, sizeof(char) * n);
+ strcpy(sq->acc, acc);
+ sq->aalloc = n;
+ }
+ else
+ {
+ sq->aalloc = eslSQ_ACCCHUNK;
+ ESL_ALLOC(sq->acc, sizeof(char) * sq->aalloc);
+ sq->acc[0] = '\0';
+ }
+
+ /* no source name */
+ sq->srcalloc = eslSQ_NAMECHUNK;
+ ESL_ALLOC(sq->source, sizeof(char) * sq->srcalloc);
+ sq->source[0] = '\0';
+
+
+ return sq;
+
+ ERROR:
+ esl_sq_Destroy(sq);
+ return NULL;
+}
+
+/* Free <ESL_SQ> object */
+static void
+sq_free(ESL_SQ *sq)
+{
+ int x; /* index for optional extra residue markups */
+ if (sq->name != NULL) free(sq->name);
+ if (sq->acc != NULL) free(sq->acc);
+ if (sq->desc != NULL) free(sq->desc);
+ if (sq->source != NULL) free(sq->source);
+ if (sq->seq != NULL) free(sq->seq);
+ if (sq->dsq != NULL) free(sq->dsq);
+ if (sq->ss != NULL) free(sq->ss);
+ if (sq->nxr > 0) {
+ for (x = 0; x < sq->nxr; x++) {
+ if (sq->xr[x] != NULL) free(sq->xr[x]);
+ if (sq->xr_tag[x] != NULL) free(sq->xr_tag[x]);
+ }
+ if (sq->xr != NULL) free(sq->xr);
+ if (sq->xr_tag != NULL) free(sq->xr_tag);
+ }
+}
+
+/*----------------- end, internal functions ---------------------*/
+
+
+/*****************************************************************
+ * 7. Unit tests.
+ *****************************************************************/
+#ifdef eslSQ_TESTDRIVE
+#include "esl_random.h"
+
+static void
+utest_Create()
+{
+ char *msg = "failure in utest_Create()";
+ char *name = "seqname";
+ char *acc = "XX00001";
+ char *desc = "test sequence description";
+ char *seq = "ACDEFGHIKLMNPQRSTVWY";
+ char *ss = "xxxx....xxxx....xxxx";
+ int64_t n = strlen(seq);
+ ESL_SQ *sq1 = esl_sq_CreateFrom(name, seq, desc, acc, ss);
+ ESL_SQ *sq2 = esl_sq_Create();
+
+ if (sq1 == NULL || sq2 == NULL) esl_fatal(msg);
+
+ if (esl_sq_GrowTo(sq2, n) != eslOK) esl_fatal(msg);
+ if (esl_sq_FormatName (sq2, "%s%s", "seq", "name") != eslOK) esl_fatal(msg);
+ if (esl_sq_FormatAccession(sq2, "%s%05d", "XX", 1) != eslOK) esl_fatal(msg);
+ if (esl_sq_FormatDesc (sq2, "%s %s %s", "test","sequence","description") != eslOK) esl_fatal(msg);
+ if (esl_sq_FormatSource (sq2, "%s", "source-unknown") != eslOK) esl_fatal(msg);
+ if (esl_strdup(ss, -1, &(sq2->ss)) != eslOK) esl_fatal(msg);
+ strcpy(sq2->seq, seq);
+ sq2->n = n;
+
+ if (strcmp(sq1->name, sq2->name) != 0) esl_fatal(msg);
+ if (strcmp(sq1->acc, sq2->acc) != 0) esl_fatal(msg);
+ if (strcmp(sq1->desc, sq2->desc) != 0) esl_fatal(msg);
+ if (strcmp(sq1->seq, sq2->seq) != 0) esl_fatal(msg);
+ if (strcmp(sq1->ss, sq2->ss) != 0) esl_fatal(msg);
+ if (sq1->n != sq2->n) esl_fatal(msg);
+
+ esl_sq_Destroy(sq1);
+ esl_sq_Destroy(sq2);
+}
+
+/* This tests the Set() functions. */
+static void
+utest_Set(ESL_RANDOMNESS *r)
+{
+ char *msg = "sqio Set unit test failure";
+ ESL_SQ *sq = esl_sq_Create();
+ int ntrials = 8;
+ int maxn = eslSQ_NAMECHUNK*2;
+ int maxa = eslSQ_ACCCHUNK*2;
+ int maxd = eslSQ_DESCCHUNK*2;
+ int n = ESL_MAX( maxn, ESL_MAX(maxa, maxd));
+ char *buf = malloc(sizeof(char) * (n+1));
+ int64_t L;
+ int i;
+
+ for (i = 0; i < ntrials; i++)
+ {
+ L = esl_rnd_Roll(r, maxn) + 1;
+ memset(buf, 'x', L);
+ buf[L] = '\0';
+ if (esl_sq_SetName(sq, buf) != eslOK) esl_fatal(msg);
+ }
+ for (i = 0; i < ntrials; i++)
+ {
+ L = esl_rnd_Roll(r, maxa) + 1;
+ memset(buf, 'x', L);
+ buf[L] = '\0';
+ if (esl_sq_SetAccession(sq, buf) != eslOK) esl_fatal(msg);
+ }
+ for (i = 0; i < ntrials; i++)
+ {
+ L = esl_rnd_Roll(r, maxd) + 1;
+ memset(buf, 'x', L);
+ buf[L] = '\0';
+ if (esl_sq_SetDesc(sq, buf) != eslOK) esl_fatal(msg);
+ }
+ free(buf);
+ esl_sq_Destroy(sq);
+}
+
+
+/* This tests the Format() functions -
+ * in particular, the way they use vsnprintf().
+ */
+static void
+utest_Format(ESL_RANDOMNESS *r)
+{
+ char *msg = "esl_sq_Format*() unit test failure";
+ ESL_SQ *sq = esl_sq_Create();
+ int ntrials = 128;
+ int maxn = eslSQ_NAMECHUNK*2;
+ int maxa = eslSQ_ACCCHUNK*2;
+ int maxd = eslSQ_DESCCHUNK*2;
+ int n = ESL_MAX( maxn, ESL_MAX(maxa, maxd));
+ char *buf = malloc(sizeof(char) * (n+1));
+ int64_t L;
+ int i;
+
+ for (i = 0; i < ntrials; i++)
+ {
+ L = esl_rnd_Roll(r, maxn) + 1;
+ memset(buf, 'x', L);
+ buf[L] = '\0';
+ if (esl_sq_FormatName(sq, "%s%d", buf, i) != eslOK) esl_fatal(msg);
+ }
+ for (i = 0; i < ntrials; i++)
+ {
+ L = esl_rnd_Roll(r, maxa) + 1;
+ memset(buf, 'x', L);
+ buf[L] = '\0';
+ if (esl_sq_FormatAccession(sq, "%s%d", buf, i) != eslOK) esl_fatal(msg);
+ }
+ for (i = 0; i < ntrials; i++)
+ {
+ L = esl_rnd_Roll(r, maxd) + 1;
+ memset(buf, 'x', L);
+ buf[L] = '\0';
+ if (esl_sq_FormatDesc(sq, "%s%d", buf, i) != eslOK) esl_fatal(msg);
+ }
+ free(buf);
+ esl_sq_Destroy(sq);
+}
+
+
+#ifdef eslAUGMENT_ALPHABET
+static void
+utest_CreateDigital()
+{
+ char *msg = "failure in utest_CreateDigital()";
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslRNA);
+ char *name = "seqname";
+ char *acc = "XX00001";
+ char *desc = "test sequence description";
+ char *seq = "GGGAAATTTCCC";
+ char *ss = "<<<......>>>";
+ ESL_DSQ *dsq = NULL;
+ int64_t n = strlen(seq);
+ ESL_SQ *sq1 = NULL;
+ ESL_SQ *sq2 = NULL;
+ ESL_SQ *sq3 = NULL;
+
+ if (esl_abc_CreateDsq(abc, seq, &dsq) != eslOK) esl_fatal(msg);
+ if ((sq1 = esl_sq_CreateDigitalFrom(abc, name, dsq, n, desc, acc, ss)) == NULL) esl_fatal(msg);
+
+ if ((sq2 = esl_sq_CreateDigital(abc)) == NULL) esl_fatal(msg);
+ if (esl_sq_GrowTo(sq2, n) != eslOK) esl_fatal(msg);
+ if (esl_sq_FormatName (sq2, "%s%s", "seq", "name") != eslOK) esl_fatal(msg);
+ if (esl_sq_FormatAccession(sq2, "%s%05d", "XX", 1) != eslOK) esl_fatal(msg);
+ if (esl_sq_FormatDesc (sq2, "%s %s %s", "test","sequence","description") != eslOK) esl_fatal(msg);
+ if (esl_sq_FormatSource (sq2, "%s", "source-unknown") != eslOK) esl_fatal(msg);
+ if ((sq2->ss = malloc(sizeof(char) * (n+2))) == NULL) esl_fatal(msg);
+ strcpy(sq2->ss+1, ss); sq2->ss[0] = '\0';
+ if (esl_abc_Digitize(abc, seq, sq2->dsq) != eslOK) esl_fatal(msg);
+ sq2->n = n;
+
+ if ((sq3 = esl_sq_Create()) == NULL) esl_fatal(msg);
+ if (esl_sq_Copy(sq1, sq3) != eslOK) esl_fatal(msg); /* sq3 is now text mode */
+ if (esl_sq_Textize(sq2) != eslOK) esl_fatal(msg); /* sq2 is now text mode */
+
+ if (strcmp(sq3->name, sq2->name) != 0) esl_fatal(msg); /* sq2,sq3 should be identical text mode */
+ if (strcmp(sq3->acc, sq2->acc) != 0) esl_fatal(msg);
+ if (strcmp(sq3->desc, sq2->desc) != 0) esl_fatal(msg);
+ if (strcmp(sq3->seq, sq2->seq) != 0) esl_fatal(msg);
+ if (strcmp(sq3->ss, sq2->ss) != 0) esl_fatal(msg);
+ if (sq3->n != sq2->n) esl_fatal(msg);
+
+ /* sq3 back to digital; should = sq1 again */
+ if (esl_sq_Digitize(abc, sq3) != eslOK) esl_fatal(msg);
+ if (memcmp(sq3->dsq, sq1->dsq, sizeof(ESL_DSQ) * (sq3->n)) != 0) esl_fatal(msg);
+ if (sq3->n != sq1->n) esl_fatal(msg);
+
+ free(dsq);
+ esl_alphabet_Destroy(abc);
+ esl_sq_Destroy(sq1);
+ esl_sq_Destroy(sq2);
+ esl_sq_Destroy(sq3);
+}
+#endif /*eslAUGMENT_ALPHABET*/
+
+/* write_msa_with_seqmarkups()
+ * Write a good MSA with sequence markups to a tmpfile in Stockholm format.
+ */
+static void
+write_msa_with_seqmarkups(FILE *ofp)
+{
+ fprintf(ofp, "# STOCKHOLM 1.0\n");
+ fprintf(ofp, "seq1 ACDE.FGHKLMNPQRSTVWY\n");
+ fprintf(ofp, "#=GR seq1 tWS ..<..<........>...>.\n");
+ fprintf(ofp, "seq2 ACDEGFGHKLMNPQRSTVWY\n");
+ fprintf(ofp, "seq3 ACDEGFGHKLMNPQRSTVWY\n");
+ fprintf(ofp, "#=GR seq3 SS ...<<..>>...........\n");
+ fprintf(ofp, "seq4 ACDE.FGHKLMNPQRSTVWY\n");
+ fprintf(ofp, "seq5 ACDEGFGHKLMNPQRSTVWY\n");
+ fprintf(ofp, "seq6 ACDE.FGHKLMNPQRSTVWY\n");
+ fprintf(ofp, "#=GR seq6 SS ........<<<..>>>....\n");
+ fprintf(ofp, "#=GR seq6 tWH .<...A...>....a.....\n");
+ fprintf(ofp, "#=GR seq6 csS .<.................>\n");
+ fprintf(ofp, "//\n");
+ return;
+}
+
+/* test optional extra residue markups in a sq */
+#include "esl_msafile.h"
+#include "esl_msafile_stockholm.h"
+static void
+utest_ExtraResMarkups()
+{
+ char msg[] = "sq extra residue markups test driver failed";
+ char tmpfile[32];
+ FILE *ofp = NULL;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp1 = NULL;
+ ESL_MSAFILE *afp2 = NULL;
+ ESL_MSA *msa1 = NULL;
+ ESL_MSA *msa2 = NULL;
+ ESL_SQ *sq = NULL;
+ ESL_SQ *sq1 = NULL;
+ ESL_SQ *sq2 = NULL;
+
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &ofp) != eslOK) esl_fatal(msg);
+ write_msa_with_seqmarkups(ofp);
+ fclose(ofp);
+
+ /* Digital msa to digital sq */
+ esl_msafile_Open(&abc, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp1);
+ esl_msafile_stockholm_Read(afp1, &msa1);
+
+ sq = esl_sq_CreateDigital(abc);
+ if (esl_sq_GetFromMSA(msa1, 0, sq) != eslOK) esl_fatal(msg); esl_sq_Reuse(sq);
+ if (esl_sq_GetFromMSA(msa1, 1, sq) != eslOK) esl_fatal(msg); esl_sq_Reuse(sq);
+ if (esl_sq_GetFromMSA(msa1, 2, sq) != eslOK) esl_fatal(msg); esl_sq_Reuse(sq);
+ if (esl_sq_GetFromMSA(msa1, 5, sq) != eslOK) esl_fatal(msg);
+
+ /* test of sq_Copy */
+ sq1 = esl_sq_Create();
+ sq2 = esl_sq_CreateDigital(abc);
+ esl_sq_Copy(sq, sq1);
+ esl_sq_Copy(sq, sq2);
+ esl_sq_Destroy(sq1);
+ esl_sq_Destroy(sq2);
+ esl_sq_Destroy(sq);
+
+ if (esl_sq_FetchFromMSA(msa1, 0, &sq) != eslOK) esl_fatal(msg); esl_sq_Destroy(sq);
+ if (esl_sq_FetchFromMSA(msa1, 1, &sq) != eslOK) esl_fatal(msg); esl_sq_Destroy(sq);
+ if (esl_sq_FetchFromMSA(msa1, 2, &sq) != eslOK) esl_fatal(msg); esl_sq_Destroy(sq);
+ if (esl_sq_FetchFromMSA(msa1, 5, &sq) != eslOK) esl_fatal(msg); esl_sq_Destroy(sq);
+
+
+ /* Text msa to text sq */
+ esl_msafile_Open(NULL, tmpfile, NULL, eslMSAFILE_STOCKHOLM, NULL, &afp2);
+ esl_msafile_stockholm_Read(afp2, &msa2);
+
+ sq = esl_sq_Create();
+ if (esl_sq_GetFromMSA(msa2, 0, sq) != eslOK) esl_fatal(msg); esl_sq_Reuse(sq);
+ if (esl_sq_GetFromMSA(msa2, 1, sq) != eslOK) esl_fatal(msg); esl_sq_Reuse(sq);
+ if (esl_sq_GetFromMSA(msa2, 2, sq) != eslOK) esl_fatal(msg); esl_sq_Reuse(sq);
+ if (esl_sq_GetFromMSA(msa2, 5, sq) != eslOK) esl_fatal(msg); esl_sq_Destroy(sq);
+
+ if (esl_sq_FetchFromMSA(msa2, 0, &sq) != eslOK) esl_fatal(msg); esl_sq_Destroy(sq);
+ if (esl_sq_FetchFromMSA(msa2, 1, &sq) != eslOK) esl_fatal(msg); esl_sq_Destroy(sq);
+ if (esl_sq_FetchFromMSA(msa2, 2, &sq) != eslOK) esl_fatal(msg); esl_sq_Destroy(sq);
+ if (esl_sq_FetchFromMSA(msa2, 5, &sq) != eslOK) esl_fatal(msg);
+ /* test of sq_Copy */
+ sq1 = esl_sq_Create();
+ sq2 = esl_sq_CreateDigital(abc);
+ esl_sq_Copy(sq, sq1);
+ esl_sq_Copy(sq, sq2);
+ esl_sq_Destroy(sq1);
+ esl_sq_Destroy(sq2);
+ esl_sq_Destroy(sq);
+
+ /* clean up */
+ remove(tmpfile);
+ esl_msafile_Close(afp1);
+ esl_msafile_Close(afp2);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ esl_alphabet_Destroy(abc);
+}
+
+/* test counting residues in a sq */
+static void
+utest_CountResidues()
+{
+ char *msg = "failure in utest_CountResidues()";
+ char *name = "seqname";
+ char *acc = "XX00001";
+ char *desc = "test sequence description";
+ char *seq = "GGGAATTCCC";
+ char *ss = "xxxx...xxx";
+ ESL_SQ *sq = NULL;
+ float *cnts = NULL;
+ int status;
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslDNA);
+
+ ESL_ALLOC(cnts, abc->Kp * sizeof(float));
+
+
+ if ((sq = esl_sq_CreateFrom(name, seq, desc, acc, ss)) == NULL) esl_fatal(msg);
+ sq->abc = abc;
+ esl_vec_FSet (cnts, abc->K, 0);
+ esl_sq_CountResidues(sq, 0, sq->n, cnts);
+ if (cnts[0] != 2) esl_fatal(msg);
+ if (cnts[1] != 3) esl_fatal(msg);
+ if (cnts[2] != 3) esl_fatal(msg);
+ if (cnts[3] != 2) esl_fatal(msg);
+
+
+#ifdef eslAUGMENT_ALPHABET
+ esl_sq_Digitize(abc, sq);
+ esl_vec_FSet (cnts, abc->K, 0);
+ esl_sq_CountResidues(sq, 1, sq->n, cnts);
+ if (cnts[0] != 2) esl_fatal(msg);
+ if (cnts[1] != 3) esl_fatal(msg);
+ if (cnts[2] != 3) esl_fatal(msg);
+ if (cnts[3] != 2) esl_fatal(msg);
+#endif
+
+ free(cnts);
+ esl_sq_Destroy(sq);
+ esl_alphabet_Destroy(abc);
+ return;
+
+
+ERROR:
+ if (cnts != NULL) free(cnts);
+ if (sq != NULL) esl_sq_Destroy(sq);
+ if (abc != NULL) esl_alphabet_Destroy(abc);
+
+ esl_fatal(msg);
+ return;
+}
+
+
+#endif /* eslSQ_TESTDRIVE*/
+/*--------------------- end, unit tests -------------------------*/
+
+/*****************************************************************
+ * 8. Test driver.
+ *****************************************************************/
+#ifdef eslSQ_TESTDRIVE
+/* gcc -g -Wall -o esl_sq_utest -I. -L. -DeslSQ_TESTDRIVE esl_sq.c -leasel -lm
+ * ./esl_sq_utest
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile_stockholm.h"
+#include "esl_random.h"
+#include "esl_sq.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-s", eslARG_INT, "0", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for sq module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+
+ utest_Create();
+ utest_Set(r);
+ utest_Format(r);
+ utest_CountResidues();
+
+#ifdef eslAUGMENT_ALPHABET
+ utest_CreateDigital();
+#endif
+
+ utest_ExtraResMarkups();
+
+ esl_randomness_Destroy(r);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /* eslSQ_TESTDRIVE*/
+/*-------------------- end, test driver -------------------------*/
+
+
+
+
+
+/*****************************************************************
+ * 9. Examples.
+ *****************************************************************/
+
+#ifdef eslSQ_EXAMPLE
+/*::cexcerpt::sq_example::begin::*/
+/* compile: gcc -g -Wall -I. -o example -DeslSQ_EXAMPLE esl_sq.c easel.c
+ * run: ./example
+ */
+#include <stdio.h>
+#include <string.h>
+#include "easel.h"
+#include "esl_sq.h"
+
+int main(void)
+{
+ ESL_SQ *sq1, *sq2;
+ char *name = "seq1";
+ char *acc = "XX00001";
+ char *desc = "This is a test.";
+ char *testseq = "GGGAAATTTCCC";
+ char *ss = "<<<......>>>";
+ int n = strlen(testseq);
+
+ /* Creating an ESL_SQ from text info: */
+ sq1 = esl_sq_CreateFrom(name, testseq, desc, acc, ss); /* desc, acc, or ss may be NULL */
+
+ /* Building up a ESL_SQ yourself: */
+ sq2 = esl_sq_Create();
+ esl_sq_FormatName (sq2, "seq%d", 1);
+ esl_sq_FormatAccession(sq2, "XX%05d", 1);
+ esl_sq_FormatDesc (sq2, "This %s a test", "is");
+ esl_sq_GrowTo (sq2, n);
+ strcpy(sq2->seq, testseq);
+ esl_strdup(ss, -1, &(sq2->ss));
+ sq2->n = n;
+
+ /* Accessing the information */
+ printf("Name: %s\n", sq2->name);
+ printf("Accession: %s\n", sq2->acc);
+ printf("Description: %s\n", sq2->desc);
+ printf("Sequence: %s\n", sq2->seq);
+ printf("Structure: %s\n", sq2->ss);
+ printf("Residue 3: %c\n", sq2->seq[2]); /* note 0..n-1 coords */
+ printf("Structure 3: %c\n", sq2->ss[2]); /* same for ss */
+
+ /* Freeing the structures */
+ esl_sq_Destroy(sq1);
+ esl_sq_Destroy(sq2);
+ return 0;
+}
+/*::cexcerpt::sq_example::end::*/
+#endif /*eslSQ_EXAMPLE*/
+
+
+#ifdef eslSQ_EXAMPLE2
+/*::cexcerpt::sq_example2::begin::*/
+/* compile: gcc -g -Wall -I. -o example -DeslSQ_EXAMPLE2\
+ -DeslAUGMENT_ALPHABET esl_sq.c esl_alphabet.c easel.c
+ * run: ./example
+ */
+#include <stdio.h>
+#include <string.h>
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_sq.h"
+
+int main(void)
+{
+ ESL_ALPHABET *abc;
+ ESL_SQ *sq1, *sq2;
+ char *name = "seq1";
+ char *acc = "XX00001";
+ char *desc = "This is a test.";
+ char *testseq = "GGGAAATTTCCC";
+ ESL_DSQ *dsq = NULL;
+ char *ss = "<<<......>>>";
+ int n = strlen(testseq);
+ int i;
+
+ /* Creating a digital alphabet: */
+ abc = esl_alphabet_Create(eslRNA);
+
+ /* Creating a digital ESL_SQ from text info: */
+ esl_abc_CreateDsq(abc, testseq, &dsq);
+ sq1 = esl_sq_CreateDigitalFrom(abc, name, dsq, n, desc, acc, ss);
+ free(dsq);
+
+ /* Building up a digital ESL_SQ yourself: */
+ sq2 = esl_sq_CreateDigital(abc);
+ esl_sq_FormatName (sq2, "seq%d", 1);
+ esl_sq_FormatAccession(sq2, "XX%05d", 1);
+ esl_sq_FormatDesc (sq2, "This %s a test", "is");
+ esl_sq_GrowTo (sq2, n);
+ esl_abc_Digitize(abc, testseq, sq2->dsq);
+ sq2->n = n;
+
+ /* a "digital" ss isn't so pretty, but just so you know: */
+ sq2->ss = malloc(sizeof(char) * (n+2));
+ sq2->ss[0] = '\0';
+ strcpy(sq2->ss+1, ss);
+
+ /* Accessing the information */
+ printf("Name: %s\n", sq2->name);
+ printf("Accession: %s\n", sq2->acc);
+ printf("Description: %s\n", sq2->desc);
+ printf("Sequence: ");
+ for (i = 1; i <= n; i++)
+ putchar(abc->sym[sq2->dsq[i]]);
+ putchar('\n');
+ printf("Structure: %s\n", sq2->ss+1); /* +1, ss is 1..n like dsq */
+ printf("Residue 3: %c\n", abc->sym[sq2->dsq[3]]);
+ printf("Structure 3: %c\n", sq2->ss[3]); /* note 1..n coord system */
+
+ /* Freeing the structures */
+ esl_sq_Destroy(sq1);
+ esl_sq_Destroy(sq2);
+ return 0;
+}
+/*::cexcerpt::sq_example2::end::*/
+#endif /*eslSQ_EXAMPLE2*/
+/*------------------ end, example drivers ------------------------*/
+
diff --git a/esl_sq.h b/esl_sq.h
new file mode 100644
index 0000000..618dad1
--- /dev/null
+++ b/esl_sq.h
@@ -0,0 +1,211 @@
+/* esl_sq : a single biological sequence
+ */
+#ifndef eslSQ_INCLUDED
+#define eslSQ_INCLUDED
+
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#ifdef eslAUGMENT_MSA
+#include "esl_msa.h"
+#endif
+#if defined eslAUGMENT_RANDOM && defined eslAUGMENT_RANDOMSEQ
+#include "esl_random.h" /* random, randomseq add ability to sample random sq objects for unit tests */
+#include "esl_randomseq.h" /* random, randomseq add ability to sample random sq objects for unit tests */
+#endif
+
+/* ESL_SQ - a biosequence
+ *
+ * Can be either in text mode <seq>, or digital mode <dsq>.
+ * One of them has to be NULL, and the other contains the data.
+ *
+ * When in text mode, <ss> and <seq> can hold up to <n=salloc-1>
+ * residues and a terminal '\0', and both are indexed <0..n-1>.
+ *
+ * When in digital mode, <ss> and <dsq> can hold up to <n=salloc-2>
+ * residues; both are indexed <1..n>, and positions 0 and n+1 are
+ * sentinel bytes. The digital sequence <dsq> uses <eslDSQ_SENTINEL>
+ * as its sentinels; as a hack, <ss> uses '\0' as sentinels. This
+ * means that <sq->ss+1> is a valid NUL-terminated C string, but
+ * <sq->ss> itself would be a string of length 0 because of the
+ * leading NUL sentinel. Watch out for this.
+ *
+ * To save on allocation calls, the structure is designed to be reused
+ * for subsequent sequences, rather than free'd and reallocated -
+ * thus, we keep track of the allocated sizes of all the strings.
+ *
+ * Notes on when we need to reallocate:
+ * - In a text mode sequence (seq 0..n-1), byte salloc-1 is
+ * reserved for the NUL, so the sequence is full when
+ * n == salloc-1.
+ *
+ * - In a digital mode sequence (dsq 1..n), bytes 0 and salloc-1
+ * are reserved for sentinel bytes, so the reallocation condition
+ * is when n == salloc-2.
+ *
+ * At least for now, the only way to set the <ss> structure annotation
+ * field is by a CreateFrom(), by extraction from an MSA, or manually
+ * (by directly allocating a sequence's <ss> field).
+ *
+ * A sequence object will usually be holding a complete (full length)
+ * sequence. Three other cases arise less frequently:
+ *
+ * 1. We're a subsequence extracted from a source sequence.
+ * <sourcename> is the name of the source.
+ * <L> is the length of the source (and coords are 1..L).
+ * The subsequence is from <start>..<end> on the source.
+ * The length of the subsequence <n> is abs(<end>-<start>)+1.
+ * <start> can be greater than <end> for a nucleic acid sequence;
+ * in this case, the subsequence is reverse complemented.
+ *
+ * 2. We're a window on a source sequence.
+ * This is similar to being a subsequence, with the added
+ * wrinkle that we're scanning over a long source sequence
+ * in overlapping segments, defined by a "previous context"
+ * <C> and a "new window" <W> (the whole sequence is n=C+W
+ * residues long):
+ * s C W e
+ * current window: |------||------------|
+ * next window read: |------||------------|
+ * s C W e
+ * Here, dsq[1..n] is source[s..e]; each newly read
+ * window starts at dsq[C+1], and is preceded by C
+ * residues of context.
+ *
+ * 3. We're just after information about the sequence, not the
+ * sequence itself; everything except the per-residue information
+ * (such as <dsq/seq> and <ss>). We do this when SSI indexing,
+ * for example, so we don't have to read entire huge seqs into
+ * memory just to calculate their lengths for the index.
+ *
+ * Note/TODO: use of "\0" empty string to indicate lack of optional
+ * acc, desc info is now deprecated. Cannot distinguish empty string
+ * from lack of annotation. Should use NULL ptr instead. Fix this in
+ * future. (21 Nov 09 xref J5/114)
+ *
+ */
+typedef struct {
+ /*::cexcerpt::sq_sq::begin::*/
+ char *name; /* name; one word, no whitespace ("\0" if no name) */
+ char *acc; /* optional accession (1 word) ("\0" if none) */
+ char *desc; /* description line ("\0" if no description) */
+ int32_t tax_id; /* NCBI taxonomy id (-1 if none) */
+ char *seq; /* sequence [0..n-1], or NULL if digital */
+ ESL_DSQ *dsq; /* digitized sequence [1..n], or NULL if text */
+ char *ss; /* optional sec structure [0..n-1], [1..n], or NULL */
+ int64_t n; /* length of seq (or dsq) and ss */
+ /*::cexcerpt::sq_sq::end::*/
+
+ /* Coordinate info for: seq subseq window info */
+ /* ---- ------ ------ ----- */
+ int64_t start; /* coord of seq[0],dsq[1] on source [1..L] 1 1<=i<=L 1<=i<=L 0 */
+ int64_t end; /* coord of seq[n-1],dsq[n] on source[1..L] L 1<=j<=L 1<=j<=L 0 */
+ int64_t C; /* # of context residues for a window 0 0 n-W 0 */
+ int64_t W; /* window width L n n-C 0 */
+ int64_t L; /* source sequence length in residues L L (or -1) L (or -1) L */
+ /* and n: length of seq (or dsq) and ss actually stored: L abs(j-i)+1 C+W 0 */
+ /* In all the above bookkeeping, a -1 means "unknown" */
+ char *source; /* name of the source of a subseq/window; or MSA name; or ""*/
+
+ /* Memory allocation bookkeeping: (all inclusive of \0; >= strlen()+1) */
+ int nalloc; /* allocated length of name */
+ int aalloc; /* allocated length of accession */
+ int dalloc; /* allocated length of description */
+ int64_t salloc; /* alloc for seq or dsq, and ss if present */
+ int srcalloc; /* allocated length for source name */
+
+ /* Disk offset bookkeeping: */
+ int64_t idx; /* ctr for which # seq this is; -1 if not counting */
+ off_t roff; /* record offset (start of record); -1 if none */
+ off_t hoff; /* offset to last byte of header; -1 if unknown */
+ off_t doff; /* data offset (start of sequence data); -1 if none */
+ off_t eoff; /* offset to last byte of record; -1 if unknown */
+
+ /* Optional information for extra residue markups.
+ * The number of them, and their tags are arbitrary
+ */
+ char **xr_tag; /* markup tags for extra residue markups [0..ntr-1][free-text], [0..ntr-1][free-text], or NULL */
+ char **xr; /* annotations for extra residue markups [0..ntr-1][0..n-1], [0..ntr-1][1..n], or NULL */
+ int nxr; /* number of extra residue markups */
+
+ /* Copy of a pointer to the alphabet, if digital mode */
+#if defined(eslAUGMENT_ALPHABET)
+ const ESL_ALPHABET *abc; /* reference to the alphabet for <dsq> */
+#else
+ const void *abc; /* void reference, if we're not even augmented */
+#endif
+} ESL_SQ;
+
+typedef struct {
+ int count; /* number of <ESL_SQ> objects in the block */
+ int listSize; /* maximum number elements in the list */
+ int complete; /*TRUE if the the final ESL_SQ element on the block is complete, FALSE if it's only a partial winow of the full sequence*/
+ int64_t first_seqidx;/*unique identifier of the first ESL_SQ object on list; the seqidx of the i'th entry on list is first_seqidx+i */
+ ESL_SQ *list; /* array of <ESL_SQ> objects */
+} ESL_SQ_BLOCK;
+
+/* These control default initial allocation sizes in an ESL_SQ. */
+#define eslSQ_NAMECHUNK 32 // allocation unit for name, source
+#define eslSQ_ACCCHUNK 32 // allocation unit for accession
+#define eslSQ_DESCCHUNK 128 // allocation unit for description
+#define eslSQ_SEQCHUNK 256 // allocation unit for seqs
+ // .. dsqdata assumes _SEQCHUNK >= 4
+
+extern ESL_SQ *esl_sq_Create(void);
+extern ESL_SQ *esl_sq_CreateFrom(const char *name, const char *seq,
+ const char *desc, const char *acc, const char *ss);
+extern int esl_sq_Grow (ESL_SQ *sq, int64_t *ret_nsafe);
+extern int esl_sq_GrowTo(ESL_SQ *sq, int64_t n);
+extern int esl_sq_Copy(const ESL_SQ *src, ESL_SQ *dst);
+extern int esl_sq_Compare (ESL_SQ *sq1, ESL_SQ *sq2);
+extern int esl_sq_Reuse (ESL_SQ *sq);
+extern int esl_sq_IsDigital(const ESL_SQ *sq);
+extern int esl_sq_IsText (const ESL_SQ *sq);
+extern void esl_sq_Destroy (ESL_SQ *sq);
+
+extern int esl_sq_SetName (ESL_SQ *sq, const char *name);
+extern int esl_sq_SetAccession (ESL_SQ *sq, const char *acc);
+extern int esl_sq_SetDesc (ESL_SQ *sq, const char *desc);
+extern int esl_sq_SetSource (ESL_SQ *sq, const char *source);
+extern int esl_sq_FormatName (ESL_SQ *sq, const char *name, ...);
+extern int esl_sq_FormatAccession(ESL_SQ *sq, const char *acc, ...);
+extern int esl_sq_FormatDesc (ESL_SQ *sq, const char *desc, ...);
+extern int esl_sq_FormatSource (ESL_SQ *sq, const char *source, ...);
+extern int esl_sq_AppendDesc (ESL_SQ *sq, const char *desc);
+extern int esl_sq_SetCoordComplete(ESL_SQ *sq, int64_t L);
+extern int esl_sq_CAddResidue (ESL_SQ *sq, char c);
+extern int esl_sq_ReverseComplement(ESL_SQ *sq);
+extern int esl_sq_Checksum(const ESL_SQ *sq, uint32_t *ret_checksum);
+extern int esl_sq_CountResidues(const ESL_SQ *sq, int start, int L, float *f);
+
+#ifdef eslAUGMENT_ALPHABET
+extern ESL_SQ *esl_sq_CreateDigital(const ESL_ALPHABET *abc);
+extern ESL_SQ *esl_sq_CreateDigitalFrom(const ESL_ALPHABET *abc, const char *name, const ESL_DSQ *dsq,
+ int64_t L, const char *desc, const char *acc, const char *ss);
+extern int esl_sq_Digitize(const ESL_ALPHABET *abc, ESL_SQ *sq);
+extern int esl_sq_Textize(ESL_SQ *sq);
+extern int esl_sq_GuessAlphabet(ESL_SQ *sq, int *ret_type);
+extern int esl_sq_XAddResidue(ESL_SQ *sq, ESL_DSQ x);
+extern int esl_sq_ConvertDegen2X(ESL_SQ *sq);
+#endif
+
+#ifdef eslAUGMENT_MSA
+extern int esl_sq_GetFromMSA (const ESL_MSA *msa, int which, ESL_SQ *sq);
+extern int esl_sq_FetchFromMSA(const ESL_MSA *msa, int which, ESL_SQ **ret_sq);
+#endif
+
+extern ESL_SQ_BLOCK *esl_sq_CreateBlock(int count);
+extern int esl_sq_BlockGrowTo(ESL_SQ_BLOCK *sqblock, int newsize, int do_digital, const ESL_ALPHABET *abc);
+#ifdef eslAUGMENT_ALPHABET
+extern ESL_SQ_BLOCK *esl_sq_CreateDigitalBlock(int count, const ESL_ALPHABET *abc);
+#endif
+extern void esl_sq_DestroyBlock(ESL_SQ_BLOCK *sqBlock);
+
+#if defined eslAUGMENT_RANDOM && defined eslAUGMENT_RANDOMSEQ
+extern int esl_sq_Sample(ESL_RANDOMNESS *rng, ESL_ALPHABET *abc, int maxL, ESL_SQ **ret_sq);
+#endif /* eslAUGMENT_RANDOM && eslAUGMENT_RANDOMSEQ */
+
+#endif /*eslSQ_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_sq.tex b/esl_sq.tex
new file mode 100644
index 0000000..67b42ff
--- /dev/null
+++ b/esl_sq.tex
@@ -0,0 +1,304 @@
+The \eslmod{sq} module provides \Easel's object for single biological
+sequences: an \ccode{ESL\_SQ}.
+
+Sequence objects invariably become complicated, even though their
+designer intends them to be simple. There's many things we want to do
+with a sequence, and useful features naturally accrete over time. If a
+library isn't careful to balance creeping featuritis against having an
+easy way to start using the object in simple applications, then the
+sequence object - possibly the most fundamental object of a
+biosequence library - can become a barrier to anyone else actually
+using the library. All those useful features won't matter much if you
+can't figure out how to turn your sequence data into an object, or get
+it back out. \Easel\ expects you to have your own preferred way of
+dealing with sequence data that's not necessarily \Easel's way, so it
+provides simple ways to create sequence objects from elemental (C
+string) data, and simple ways to get elemental C strings back out.
+This lets you minimize your exposure to \Easel's more complicated
+capabilities if you like.
+
+The most basic use of an \ccode{ESL\_SQ} object is to hold one
+complete sequence, simply as a plain C string. A sequence may also
+have a name, an accession, and a description line. This is called a
+\esldef{text mode} sequence. In text mode, \Easel\ doesn't know
+whether the sequence is DNA, RNA, protein, or something else; it's
+just an ASCII character string. This limits some of \Easel's more
+powerful abilities, such as the ability to check the sequence for
+errors, or to automatically deal with degenerate residue codes; but
+it's a simple mode that's easy to start using.
+
+Alternatively, a sequence may be in \esldef{digital mode}. In digital
+mode, sequences are predigested and encoded into \Easel's internal
+format, which makes many sequence routines more robust, efficient, and
+powerful. Digital mode requires \eslmod{alphabet} augmentation.
+
+In addition to storing a complete sequence, an \ccode{ESL\_SQ} is
+designed to be used in three other situations:
+
+\begin{itemize}
+\item to hold a \esldef{subsequence} of a larger source sequence. The
+ object maintains source and coordinate information necessary for
+ crossreferencing the subsequence's coordinate system to the original
+ source coordinate system.
+
+\item to hold a \esldef{window} of a larger source sequence. This is
+ like a subsequence, but is more specifically intended for reading a
+ sequence from a file in overlapping windows. This avoids having to
+ suck an entire chromosome (for example) into memory at any one
+ time. The stored subsequence is composed of two segments, a
+ \esldef{previous context} that gets saved from the previous window,
+ and a \esldef{new window} of fresh residues. The size of both the
+ context and the window are configurable at the time each new window
+ is read.
+
+\item to hold only \esldef{information} about a sequence, such as its
+ name, its length, and its position in a file, excluding the sequence
+ (and optional secondary structure annotation) itself. This is handy
+ for example when indexing a sequence file, when we'd rather not read
+ any (possibly prohibitively large) sequence into memory until after
+ we've mapped out how big it is.
+\end{itemize}
+
+To keep all this straight, the object contains a bunch of internal
+bookkeeping data.
+
+Sequence objects are growable and reusable, for efficiency in memory
+allocation. If you're going to go through many different sequences
+sequentially, you would typically just allocate a single
+\ccode{ESL\_SQ} object and \ccode{esl\_sq\_Reuse()} it for each new
+sequence, rather than creating and destroying a lot of objects.
+
+A sequence object can also store an optional secondary structure
+annotation line for the sequence, one character per residue.
+
+When augmented with \eslmod{msa}, an interface to the \ccode{ESL\_MSA}
+multiple alignment object provides the ability to extract single
+unaligned sequences from a multiple alignment.
+
+You would often use the \eslmod{sq} module in conjunction with
+\eslmod{sqio}, which provides the ability to read and write
+\ccode{ESL\_SQ} objects from and to files.
+
+Table~\ref{tbl:sq_api} lists the functions in the \eslmod{sq} API.
+
+
+
+% Table generated by autodoc -t esl_sq.c (so don't edit here, edit esl_sq.c:)
+\input{apitables/esl_sq_api}
+
+
+
+
+\subsection{Example of getting data in and out of an \ccodeincmd{ESL\_SQ}}
+
+The easiest way to create a new \ccode{ESL\_SQ} object is with the
+\ccode{esl\_sq\_CreateFrom()} function, which just takes character
+strings for a sequence and its name (and also, optionally, an
+accession, description, and/or secondary structure annotation string).
+
+You can also build up (and/or change and manipulate) the contents of
+an \ccode{ESL\_SQ} object by accessing the name, accession,
+description, sequence, and structure annotation line more directly.
+
+This code shows examples of both approaches:
+
+\input{cexcerpts/sq_example}
+
+A few things to notice about that code:
+
+\begin{itemize}
+\item Every sequence has a name and a sequence. If we didn't want to
+ add the optional accession, description, or structure annotation
+ line, we'd pass \ccode{NULL} for those arguments to
+ \ccode{esl\_sq\_CreateFrom()}.
+
+\item An RNA secondary structure annotation line is shown here as part
+ of the example, but it's really sort of a more advanced
+ feature. It's good to know it's there (see the \eslmod{wuss} module
+ for more information about how \Easel\ annotates RNA structure) but
+ you can ignore it if you're getting started.
+
+\item The \ccode{esl\_sq\_Set*} functions use the same syntax as C's
+ \ccode{*printf()} family, which gives you a flexible way to create
+ new sequence names, accessions, and descriptions automatically.
+
+\item The sequence in \ccode{sq->seq} is just a C string. (Here it's a
+ copy of the \ccode{testseq} string.) That has a couple of
+ implications. One is that it's a verbatim copy of what you provided;
+ \Easel\ doesn't know (or care) whether it's DNA or protein sequence,
+ upper case or lower case, or if it contains illegal non-sequence
+ characters. With a text mode sequence, that's \emph{your} problem!
+ For more robustness and defined biosequence alphabets, read on below
+ about digital mode sequences. The second implication is that, as a C
+ string, the \ccode{n} residues are indexed \ccode{0..sq->n-1}, not
+ \ccode{1..sq->n}.
+
+\item If you're going to directly copy a sequence of length \ccode{n}
+ into a \ccode{sq->seq} field, note the \ccode{esl\_sq\_GrowTo()}
+ call, which makes sure the sequence object is allocated with enough
+ space for \ccode{n} residues; and don't forget to set \ccode{sq->n}.
+
+\item The structure annotation \ccode{sq->ss} is also a C string,
+ indexed identically to \ccode{sq->seq}, but it's optional, and isn't
+ allocated by default; \ccode{esl\_sq\_GrowTo()} calls will only
+ reallocate for the structure annotation string after it's been
+ allocated at least once. Hence the \ccode{esl\_strdup} call in the
+ example, which duplicates (allocates and copies) the annotation into
+ \ccode{sq->ss}.
+\end{itemize}
+
+
+
+To get simple character strings back out of an \ccode{ESL\_SQ} object,
+you're encouraged to peek inside the object. (Yeah, I know, object
+oriented design says that there should be methods for this,
+independent of the object's implementation; but I balance that against
+simplicity, and here, simplicity wins.) The object is defined and
+documented in \ccode{esl\_sq.h}. It contains various information; the
+stuff you need to know is:
+
+\input{cexcerpts/sq_sq}
+
+Ignore the \ccode{dsq} field for now; we're about to get to it, when
+we talk about digital mode sequences.
+
+The \ccode{ESL\_SQ} object itself doesn't particularly care about the
+contents of the annotation text fields, so long as they're C strings, and so
+long as \ccode{n} is the length of the \ccode{seq} (and optional
+\ccode{ss}, if it's non-\ccode{NULL}) strings. However, sequence file
+formats do impose some expectations on the annotation strings, and it
+would be a Good Idea to adhere to them:
+
+\begin{sreitems} {\emcode{desc}}
+\item [\emcode{name}] A sequence name is almost always expected to be
+ a single ``word'' (no whitespace), like \ccode{SNRPA\_HUMAN}.
+
+\item [\emcode{acc}] An accession is also usually expected to be a
+ single ``word'' with no whitespace, like \ccode{P09012}. Database
+ accessions only make sense if you know what database they're for, so
+ when sequences might be from different databases, you'll sometimes
+ see accessions prefixed with a code indicating the source database,
+ as in something like \ccode{UniProt:P09012}. Again, \Easel\ itself
+ isn't enforcing the format of this string, so your application is
+ free to create its own accession/version/database format as needed.
+
+\item [\emcode{desc}] A description line is something like \ccode{U1
+small nuclear ribonucleoprotein A (U1 snRNP protein A) (U1A protein)
+(U1-A).}; a one-line summary of what the sequence is. You can expect
+the description line to show up in the tabular output of sequence
+analysis applications, so ideally you want it to be short and sweet
+(so it fits on one line with a name, accession, score, coords, and
+other information from an analysis app). You also don't want the
+description line to end in a newline (\verb+\n+) character, or the
+description line will introduce unexpected line breaks in these
+tabular output files.
+\end{sreitems}
+
+You can reach into a \ccode{ESL\_SQ} and copy or modify any of these
+strings, but don't try to overwrite them with a larger string unless
+You Know What You're Doing. Their memory allocations are managed by
+the \ccode{ESL\_SQ} object. Instead, use the appropriate
+\ccode{esl\_sq\_Set*} function to overwrite an annotation field.
+
+The \eslmod{sq} module isn't much use by itself; it's a building block
+for several other modules. For example, one of the main things you'll
+want to do with sequences is to read them from a file. For examples
+and documentation of sequence input, see the \eslmod{sqio} module.
+
+
+\subsection{Example of using a digital \ccodeincmd{ESL\_SQ}}
+
+What follows might make more sense if you've read about the
+\eslmod{alphabet} module first. \eslmod{alphabet}'s documentation
+explains how \Easel uses an internal digital biosequence ``alphabet'',
+where residues are encoded as small integers, suitable for direct use
+as array indices. But here's an example anyway, of creating and
+accessing a digital mode sequence:
+
+\input{cexcerpts/sq_example2}
+
+Things to notice about this code:
+
+\begin{itemize}
+\item An \ccode{ESL\_SQ} object has a \ccode{sq->seq} if it's in text
+mode, and \ccode{sq->dsq} if its in digital mode. These two fields are
+mutually exclusive; one of them is \ccode{NULL}.
+
+\item If you looked at the contents of \ccode{sq->dsq} in either of
+ the objects, you'd see that each residue is encoded as a value
+ \ccode{0..3}, representing (for an RNA alphabet) the residues
+ \ccode{ACGU}.
+
+\item That representation is defined by the digital RNA alphabet
+ \ccode{abc}, which was the first thing we created.
+
+\item In digital mode, both the sequence residues and the optional
+ secondary structure characters are indexed \ccode{1..n}.
+
+\item To make the digital sequence in the first sequence object, we
+ created a digital sequence \ccode{dsq} by encoding the
+ \ccode{testseq} using \ccode{esl\_abc\_CreateDsq()}; this
+ function allocated new memory for \ccode{dsq}, so we have to
+ free it. An \ccode{ESL\_DSQ *} is just a special character array;
+ it's not a full-fledged \Easel\ object, and so there's no
+ conventional \ccode{Create()},\ccode{Destroy()} function pair.
+
+\item In the second sequence object, we used
+ \ccode{esl\_abc\_Digitize()} to encode the \ccode{testseq} directly
+ into space that the \ccode{sq2} object already had allocated, saving
+ us the temporary allocation of another \ccode{dsq}, because we
+ created it in digital mode (\ccode{esl\_sq\_CreateDigital()}) and
+ made it big enough to hold \ccode{n} digital residues with
+ \ccode{esl\_sq\_GrowTo()}. Notice that \ccode{esl\_sq\_GrowTo()} is
+ smart enough to know whether to grow the digital or the text mode
+ sequence field.
+
+\item By convention, when using digital sequences, we usually keep
+ track of (and pass as arguments) both a digital sequence \ccode{dsq}
+ and its length \ccode{n}, and we also need to have the digital
+ alphabet itself \ccode{abc} available to know what the \ccode{dsq}
+ means; with text mode sequences, we usually just pass the string
+ pointer. Thus the \ccode{esl\_sq\_CreateDigitalFrom()} function
+ takes \ccode{abc}, \ccode{dsq}, and \ccode{n} as arguments, whereas
+ the counterpart text mode \ccode{esl\_sq\_CreateDigitalFrom()} only
+ took a C string \ccode{seq}. This is solely a convention - digital
+ sequences begin and end with a special sentinel character, so we
+ could always count the length of a \ccode{dsq} if we had to (using
+ \ccode{esl\_abc\_dsqlen()}, for example), much as we can use ANSI
+ C's \ccode{strlen()} to count the number of chars in a C string up
+ to the sentinel \verb+\0+ \ccode{NUL} character at the end.
+
+\item To get the structure annotation to be indexed \ccode{1..n} for
+ consistency with the \ccode{dsq}, even though the annotation string
+ is still just an ASCII string, it's offset by one, and the leading
+ character is set by convention to a \verb+\0+. Therefore to access
+ the whole structure string (for printing, for instance), you want to
+ access \ccode{sq->ss+1}. This is a hack, but it's a simple one, so
+ long as you don't forget about the convention.
+
+\item Because the original sequence has been encoded, you may not get
+ the original sequence back out when you decode the digital values as
+ alphabet symbols. \ccode{abc->sym[sq2->dsq[3]]}, for example, takes
+ the third digital residue and looks it up in the alphabet's symbol
+ table, returning the canonical character it's
+ representing. Upper/lower case distinctions are lost, for example;
+ digital alphabet symbol tables are uniformly upper case. And this
+ example shows another example, where the input \ccode{testseq}
+ contains T's, but since the digital alphabet was declared as RNA,
+ the symbol table represents those residues as U's when you access
+ them.
+
+\item In that respect, a more careful example should have checked the
+ return status of the \ccode{esl\_abc\_CreateDsq()} and
+ \ccode{esl\_abc\_Digitize()} calls. These have a normal failure
+ mode, when the input text sequence contains one or more ASCII
+ characters that are unrecognized and therefore invalid in the
+ digital alphabet. If this had happened, these functions would have
+ returned \ccode{eslEINVAL} instead of \ccode{eslOK}. We can get away
+ without checking, however, because the functions just replace any
+ invalid character with an ``any'' character (representing \ccode{N}
+ for DNA or RNA, \ccode{X} for protein).
+\end{itemize}
+
+For more information about how digital sequence alphabets work, see
+the \eslmod{alphabet} module.
diff --git a/esl_sqio.c b/esl_sqio.c
new file mode 100644
index 0000000..6c2dae7
--- /dev/null
+++ b/esl_sqio.c
@@ -0,0 +1,2438 @@
+/* Unaligned sequence file i/o.
+ *
+ * Contents:
+ * 1. An <ESL_SQFILE> object, text mode.
+ * 2. An <ESL_SQFILE> object, digital mode. [with <alphabet>]
+ * 3. Sequence reading.
+ * 4. Sequence writing.
+ * 5. Miscellaneous routines.
+ * 6. Sequence/subsequence fetching, random access [with <ssi>]
+ * 7. Sequence database caching.
+ * 8. Internal functions.
+ * 9. Benchmark driver.
+ * 10. Unit tests.
+ * 11. Test driver.
+ * 12. Examples.
+ * 13. Copyright and license.
+ *
+ * This module shares remote evolutionary homology with Don Gilbert's
+ * seminal, public domain ReadSeq package, though the last common
+ * ancestor was circa 1991 and no recognizable vestiges are likely to
+ * remain. Thanks Don!
+ *
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h> /* POSIX strcasecmp() */
+#endif
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h" /* alphabet aug adds digital sequences */
+#endif
+#include "esl_sqio.h"
+#include "esl_sqio_ascii.h"
+#ifdef eslAUGMENT_NCBI
+#include "esl_sqio_ncbi.h"
+#endif
+#include "esl_sq.h"
+
+/* Optional MSA<->sqio interoperability */
+#ifdef eslAUGMENT_MSA
+#include "esl_msa.h"
+#include "esl_msafile.h"
+static int convert_sq_to_msa(ESL_SQ *sq, ESL_MSA **ret_msa);
+#endif
+
+
+/*****************************************************************
+ *# 1. An <ESL_SQFILE> object, in text mode.
+ *****************************************************************/
+
+static int sqfile_open(const char *filename, int format, const char *env, ESL_SQFILE **ret_sqfp);
+
+/* Function: esl_sqfile_Open()
+ * Synopsis: Open a sequence file <filename> for reading.
+ *
+ * Purpose: Open a sequence file <filename> for reading.
+ * The opened <ESL_SQFILE> is returned through <ret_sqfp>.
+ *
+ * The format of the file is asserted to be <format> (for
+ * example, <eslSQFILE_FASTA>). If <format> is
+ * <eslSQFILE_UNKNOWN> then the routine attempts to
+ * autodetect the file format.
+ *
+ * If <env> is non-NULL, it is the name of an environment
+ * variable that contains a colon-delimited list of
+ * directories in which we may find this <filename>.
+ * For example, if we had
+ * <setenv BLASTDB /nfs/db/blast-db:/nfs/db/genomes/>
+ * in the environment, a database search application
+ * could pass "BLASTDB" as <env>.
+ *
+ * Returns: <eslOK> on success, and <*ret_sqfp> points to a new
+ * open <ESL_SQFILE>. Caller deallocates this object with
+ * <esl_sqfile_Close()>.
+ *
+ * Returns <eslENOTFOUND> if <filename> can't be opened.
+ *
+ * Returns <eslEFORMAT> if the file is empty, or
+ * if autodetection is attempted and the format can't be
+ * determined.
+ *
+ * On any error condition, <*ret_sqfp> is returned NULL.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_sqfile_Open(const char *filename, int format, const char *env, ESL_SQFILE **ret_sqfp)
+{
+ return sqfile_open(filename, format, env, ret_sqfp);
+}
+
+
+/* Function: esl_sqfile_Close()
+ * Synopsis: Close a sequence file.
+ *
+ * Purpose: Closes an open <sqfp>.
+ *
+ * Returns: (void).
+ */
+void
+esl_sqfile_Close(ESL_SQFILE *sqfp)
+{
+ if (sqfp == NULL) return;
+
+ if (sqfp->close != NULL) sqfp->close(sqfp);
+ if (sqfp->filename != NULL) free(sqfp->filename);
+ free(sqfp);
+
+ return;
+}
+
+
+/* sqfile_open():
+ * This is the routine that actually opens an ESL_SQFILE.
+ * esl_sqfile_Open() and esl_sqfile_OpenDigital() are
+ * small wrappers around it.
+ */
+static int
+sqfile_open(const char *filename, int format, const char *env, ESL_SQFILE **ret_sqfp)
+{
+ ESL_SQFILE *sqfp = NULL;
+ int status; /* return status from an ESL call */
+ int n;
+
+ char *s1;
+ char *s2;
+ char *list = NULL;
+ char *path = NULL;
+
+ ESL_ALLOC(sqfp, sizeof(ESL_SQFILE));
+ *ret_sqfp = NULL;
+
+ sqfp->filename = NULL;
+
+ sqfp->do_digital = FALSE;
+ sqfp->abc = NULL;
+
+ sqfp->format = format;
+
+ /* initialize the function pointers to NULL */
+ sqfp->position = NULL;
+ sqfp->close = NULL;
+
+ sqfp->set_digital = NULL;
+ sqfp->guess_alphabet = NULL;
+
+ sqfp->is_rewindable = NULL;
+
+ sqfp->read = NULL;
+ sqfp->read_info = NULL;
+ sqfp->read_seq = NULL;
+ sqfp->read_window = NULL;
+ sqfp->echo = NULL;
+
+ sqfp->read_block = NULL;
+
+#ifdef eslAUGMENT_SSI
+ sqfp->open_ssi = NULL;
+ sqfp->pos_by_key = NULL;
+ sqfp->pos_by_number = NULL;
+
+ sqfp->fetch = NULL;
+ sqfp->fetch_info = NULL;
+ sqfp->fetch_subseq = NULL;
+#endif
+
+ sqfp->get_error = NULL;
+
+ /* save the user supplied file name */
+ ESL_ALLOC(sqfp->filename, sizeof(char) * (strlen(filename) + 1));
+ strcpy(sqfp->filename, filename);
+
+ /* we need to process the list of directories starting with the local
+ * directory followed by the list in env one directory at a time
+ * passing the path to the different sequence parsers until we get a hit.
+ */
+ if (strcmp(filename, "-") == 0) { /* stdin special case */
+ if ((status = esl_strdup(filename, -1, &path)) != eslOK) goto ERROR;
+ if ((status = esl_sqascii_Open(path, sqfp->format, sqfp)) != eslOK) goto ERROR;
+ } else {
+
+ /* check the local directory first */
+ status = eslENOTFOUND;
+#ifdef eslAUGMENT_NCBI
+ if (format == eslSQFILE_NCBI && status == eslENOTFOUND)
+ status = esl_sqncbi_Open(sqfp->filename, sqfp->format, sqfp);
+#endif
+ if (status == eslENOTFOUND)
+ status = esl_sqascii_Open(sqfp->filename, sqfp->format, sqfp);
+
+ /* if it's not there, then check in directory list provided by <env>. */
+ if (status == eslENOTFOUND && env != NULL) {
+ if ((s1 = getenv(env)) == NULL) { status = eslENOTFOUND; goto ERROR; }
+ ESL_ALLOC(list, sizeof(char) * (strlen(s1) + 1));
+ strcpy(list + 2, s1);
+
+ ESL_ALLOC(path, sizeof(char) * (strlen(filename) + strlen(list) + 3));
+
+ s1 = list;
+ while (s1 != NULL && status == eslENOTFOUND) {
+ if ((s2 = strchr(s1, ':')) != NULL) { *s2 = '\0'; s2++;}
+ n = strlen(s1);
+ strcpy(path, s1);
+ path[n] = eslDIRSLASH;
+ strcpy(path+n+1, filename);
+ s1 = s2;
+
+#ifdef eslAUGMENT_NCBI
+ if (format == eslSQFILE_NCBI && status == eslENOTFOUND)
+ status = esl_sqncbi_Open(path, sqfp->format, sqfp);
+#endif
+ if (status == eslENOTFOUND)
+ status = esl_sqascii_Open(path, sqfp->format, sqfp);
+ }
+ }
+ }
+
+ if (status != eslOK) goto ERROR;
+
+ if (list != NULL) free(list);
+ if (path != NULL) free(path);
+
+ *ret_sqfp = sqfp;
+ return eslOK;
+
+ ERROR:
+ esl_sqfile_Close(sqfp);
+ if (list != NULL) free(list);
+ if (path != NULL) free(path);
+ *ret_sqfp = NULL;
+ return status;
+}
+/*------------------- ESL_SQFILE open/close -----------------------*/
+
+
+
+/*****************************************************************
+ *# 2. An <ESL_SQFILE> object, in digital mode [with <alphabet>]
+ *****************************************************************/
+#ifdef eslAUGMENT_ALPHABET
+
+/* Function: esl_sqfile_OpenDigital()
+ * Synopsis: Open an <ESL_SQFILE> for digital input.
+ *
+ * Purpose: Same as <esl_sqfile_Open()>, but we will expect all
+ * sequence input to conform to the digital alphabet <abc>.
+ *
+ * Normally, after opening the sequence file in digital
+ * mode, you'd read sequence into a digital <ESL_SQ>.
+ * However, you don't actually have to. The state of the
+ * <ESL_SQ> controls how the input is stored; the state of
+ * the <ESL_SQFILE> controls how the input is validated.
+ *
+ * Returns: <eslOK> on success, and <*ret_sqfp> points to a new
+ * open <ESL_SQFILE>.
+ *
+ * Returns <eslENOTFOUND> if <filename> can't be opened.
+ * Returns <eslEFORMAT> if the file is empty, or if
+ * autodetection is attempted and the format can't be
+ * determined. On any error conditions, <*ret_sqfp> is
+ * returned NULL.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_sqfile_OpenDigital(const ESL_ALPHABET *abc, const char *filename, int format, const char *env, ESL_SQFILE **ret_sqfp)
+{
+ int status;
+
+ if ((status = sqfile_open(filename, format, env, ret_sqfp)) != eslOK) return status;
+ return esl_sqfile_SetDigital(*ret_sqfp, abc);
+}
+
+/* Function: esl_sqfile_SetDigital()
+ * Synopsis: Set an open <ESL_SQFILE> to read in digital mode.
+ *
+ * Purpose: Given an <ESL_SQFILE> that's already been opened,
+ * configure it to expect subsequent input to conform
+ * to the digital alphabet <abc>.
+ *
+ * Calling <esl_sqfile_Open(); esl_sqfile_SetDigital()> is
+ * equivalent to <esl_sqfile_OpenDigital()>. The two-step
+ * version is useful when you need a
+ * <esl_sqfile_GuessAlphabet()> call in between, guessing
+ * the file's alphabet in text mode before you set it to
+ * digital mode.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_sqfile_SetDigital(ESL_SQFILE *sqfp, const ESL_ALPHABET *abc)
+{
+ sqfp->set_digital(sqfp, abc);
+
+ sqfp->do_digital = TRUE;
+ sqfp->abc = abc;
+ return eslOK;
+}
+
+
+/* Function: esl_sqfile_GuessAlphabet()
+ * Synopsis: Guess the alphabet of an open <ESL_SQFILE>.
+ *
+ * Purpose: After opening <sqfp>, attempt to guess what alphabet
+ * its sequences are in, by inspecting the first sequence
+ * in the file, and return this alphabet type in <*ret_type>.
+ *
+ * Returns: <eslOK> on success, and <*ret_type> is set to <eslDNA>,
+ * <eslRNA>, or <eslAMINO>.
+ *
+ * Returns <eslENOALPHABET> if the alphabet can't be
+ * reliably guessed.
+ *
+ * Returns <eslEFORMAT> if a parse error is encountered.
+ * Call <esl_sqfile_GetErrorBuf()> to get a ptr to a
+ * user-directed error message describing the problem,
+ * including the line number on which it was found.
+ *
+ * Returns <eslENODATA> if the file appears to be empty.
+ *
+ * On any error, <*ret_type> is <eslSQFILE_UNKNOWN>.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslEINCONCEIVABLE> on unimaginable internal errors.
+ */
+int
+esl_sqfile_GuessAlphabet(ESL_SQFILE *sqfp, int *ret_type)
+{
+ return sqfp->guess_alphabet(sqfp, ret_type);
+}
+
+#endif /*eslAUGMENT_ALPHABET*/
+/*-------------- end, digital mode ESL_SQFILE -------------------*/
+
+
+
+/*****************************************************************
+ *# 3. Sequence reading (sequential)
+ *****************************************************************/
+
+/* Function: esl_sqio_Read()
+ * Synopsis: Read the next sequence from a file.
+ *
+ * Purpose: Reads the next sequence from open sequence file <sqfp> into
+ * <sq>. Caller provides an allocated and initialized <sq>, which
+ * will be internally reallocated if its space is insufficient.
+ *
+ * Returns: <eslOK> on success; the new sequence is stored in <sq>.
+ *
+ * Returns <eslEOF> when there is no sequence left in the
+ * file (including first attempt to read an empty file).
+ *
+ * Returns <eslEFORMAT> if a parse error is encountered.
+ * Call <esl_sqfile_GetErrorBuf()> to get a ptr to a
+ * user-directed error message describing the problem,
+ * including the line number on which it was found.
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ * <eslEINCONCEIVABLE> on internal error.
+ */
+int
+esl_sqio_Read(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ return sqfp->read(sqfp, sq);
+}
+
+
+/* Function: esl_sqio_ReadInfo()
+ * Synopsis: Read sequence info, but not the sequence itself.
+ *
+ * Purpose: Read the next sequence from open sequence file <sqfp>,
+ * but don't store the sequence (or secondary structure).
+ * Upon successful return, <s> holds all the available
+ * information about the sequence -- its name, accession,
+ * description, and overall length <sq->L>.
+ *
+ * This is useful for indexing sequence files, where
+ * individual sequences might be ginormous, and we'd rather
+ * avoid reading complete seqs into memory.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_sqio_ReadInfo(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ return sqfp->read_info(sqfp, sq);
+}
+
+
+/* Function: esl_sqio_ReadSequence()
+ * Synopsis: Read sequence, but not the header itself.
+ *
+ * Purpose: Read the next sequence from open sequence file <sqfp>,
+ * skipping over the header data. Upon successful return,
+ * <s> holds just the sequece data. File offsets will be
+ * filled in.
+ *
+ * This is useful fast reads of binary formats where the
+ * header information and sequences are stored in different
+ * files.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_sqio_ReadSequence(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ return sqfp->read_seq(sqfp, sq);
+}
+
+
+/* Function: esl_sqio_ReadWindow()
+ * Synopsis: Read next window of sequence.
+ *
+ * Purpose: Read a next window of <W> residues from open file <sqfp>,
+ * keeping <C> residues from the previous window as
+ * context, and keeping previous annotation in the <sq>
+ * as before.
+ *
+ * If this is the first window of a new sequence record,
+ * <C> is ignored (there's no previous context yet), and
+ * the annotation fields of the <sq> (name, accession, and
+ * description) are initialized by reading the sequence
+ * record's header. This is the only time the annotation
+ * fields are initialized.
+ *
+ * On return, <sq->dsq[]> contains the window and its
+ * context; residues <1..sq->C> are the previous context,
+ * and residues <sq->C+1..sq->n> are the new window. The
+ * start and end coordinates of the whole <dsq[1..n]>
+ * (including context) in the original source sequence are
+ * <sq->start..sq->end>. (Or, for text mode sequences,
+ * <sq->seq[0..sq->C-1,sq->C..sq->n-1]>, while <start> and
+ * <end> coords are still <1..L>.)
+ *
+ * When a sequence record is completed and no more data
+ * remain, <eslEOD> is returned, with an ``info'' <sq>
+ * structure (containing the annotation and the total
+ * sequence length <L>, but no sequence). (The total
+ * sequence length <L> is unknown in <sq> until this
+ * <eslEOD> return.)
+ *
+ * The caller may then do one of two things before calling
+ * <esl_sq_ReadWindow()> again; it can reset the sequence
+ * with <esl_sq_Reuse()> to continue reading the next
+ * sequence in the file, or it can set a negative <W> as a
+ * signal to read windows from the reverse complement
+ * (Crick) strand. Reverse complement reading only works
+ * for nucleic acid sequence.
+ *
+ * If you read the reverse complement strand, you must read
+ * the whole thing, calling <esl_sqio_ReadWindow()> with
+ * negative <W> windows until <eslEOD> is returned again
+ * with an empty (info-only) <sq> structure. When that
+ * <EOD> is reached, the <sqfp> is repositioned at the
+ * start of the next sequence record; the caller should now
+ * <Reuse()> the <sq>, and the next <esl_sqio_ReadWindow()>
+ * call must have a positive <W>, corresponding to starting
+ * to read the Watson strand of the next sequence.
+ *
+ * Note that the <ReadWindow()> interface is designed for
+ * an idiom of sequential reading of complete sequences in
+ * overlapping windows, possibly on both strands; if you
+ * want more freedom to move around in the sequence
+ * grabbing windows in another order, you can use the
+ * <FetchSubseq()> interface.
+ *
+ * Reading the reverse complement strand requires file
+ * repositioning, so it will not work on non-repositionable
+ * streams like gzipped files or a stdin pipe. Moreover,
+ * for reverse complement input to be efficient, the
+ * sequence file should have consistent line lengths,
+ * suitable for SSI's fast subsequence indexing.
+ *
+ * Returns: <eslOK> on success; <sq> now contains next window of
+ * sequence, with at least 1 new residue. The number
+ * of new residues is <sq->W>; <sq->C> residues are
+ * saved from the previous window. Caller may now
+ * process residues <sq->dsq[sq->C+1]..sq->dsq[sq->n]>.
+ *
+ * <eslEOD> if no new residues were read for this sequence
+ * and strand, and <sq> now contains an empty info-only
+ * structure (annotation and <L> are valid). Before calling
+ * <esl_sqio_ReadWindow()> again, caller will either want
+ * to make <W> negative (to start reading the Crick strand
+ * of the current sequence), or it will want to reset the
+ * <sq> (with <esl_sq_Reuse()>) to go on the next sequence.
+ *
+ * <eslEOF> if we've already returned <eslEOD> before to
+ * signal the end of the previous seq record, and moreover,
+ * there's no more sequence records in the file.
+ *
+ * <eslEINVAL> if an invalid residue is found in the
+ * sequence, or if you attempt to take the reverse
+ * complement of a sequence that can't be reverse
+ * complemented.
+ *
+ * Throws: <eslESYNTAX> if you try to read a reverse window before
+ * you've read forward strand.
+ *
+ * <eslECORRUPT> if something goes awry internally in the
+ * coordinate system.
+ *
+ * <eslEMEM> on allocation error.
+ */
+int
+esl_sqio_ReadWindow(ESL_SQFILE *sqfp, int C, int W, ESL_SQ *sq)
+{
+ return sqfp->read_window(sqfp, C, W, sq);
+}
+
+/* Function: esl_sqio_ReadBlock()
+ * Synopsis: Read the next block of sequences from a file.
+ *
+ * Purpose: Reads a block of sequences from open sequence file <sqfp> into
+ * <sqBlock>.
+ *
+ * Returns: <eslOK> on success; the new sequence is stored in <sqBlock>.
+ *
+ * Returns <eslEOF> when there is no sequence left in the
+ * file (including first attempt to read an empty file).
+ *
+ * Returns <eslEFORMAT> if a parse error is encountered.
+ * Call <esl_sqfile_GetErrorBuf()> to get a ptr to a
+ * user-directed error message describing the problem,
+ * including the line number on which it was found.
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ * <eslEINCONCEIVABLE> on internal error.
+ */
+int
+esl_sqio_ReadBlock(ESL_SQFILE *sqfp, ESL_SQ_BLOCK *sqBlock, int max_residues, int max_sequences, int long_target)
+{
+ return sqfp->read_block(sqfp, sqBlock, max_residues, max_sequences, long_target);
+}
+
+/* Function: esl_sqio_Parse()
+ * Synopsis: Parse a sequence already read into a buffer.
+ *
+ * Purpose: Parse the buffer <buf> for a sequence <s> of type
+ * <format>. The buffer must contain the entire sequence.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEFORMAT> on parsing error.
+ * <eslEINVAL> on unsupported format.
+ */
+int
+esl_sqio_Parse(char *buf, int size, ESL_SQ *s, int format)
+{
+ int status;
+
+ switch (format) {
+ case eslSQFILE_EMBL:
+ case eslSQFILE_UNIPROT:
+ case eslSQFILE_GENBANK:
+ case eslSQFILE_DDBJ:
+ case eslSQFILE_FASTA:
+ case eslSQFILE_DAEMON:
+ status = esl_sqascii_Parse(buf, size, s, format);
+
+ break;
+ default:
+ ESL_EXCEPTION(eslEINVAL, "can't parse that format");
+ }
+ return status;
+}
+/*------------------ end, sequential sequence input -------------*/
+
+
+
+/*****************************************************************
+ *# 4. Writing sequences.
+ *****************************************************************/
+
+/* Function: esl_sqio_Write()
+ * Synopsis: Write a sequence to a file.
+ *
+ * Purpose: Write sequence <s> to an open FILE <fp> in file format
+ * <format>.
+ *
+ * If <update> is <TRUE>, set the offsets for sequence <s>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEWRITE> on system write error, such as filled disk.
+ */
+int
+esl_sqio_Write(FILE *fp, ESL_SQ *s, int format, int update)
+{
+ int status;
+
+#ifdef eslAUGMENT_MSA
+ ESL_MSA *msa;
+ if (esl_sqio_IsAlignment(format))
+ {
+ if ((status = convert_sq_to_msa(s, &msa)) != eslOK) return status;
+ status = esl_msafile_Write(fp, msa, format);
+ esl_msa_Destroy(msa);
+ return status;
+ }
+#endif
+
+ switch (format) {
+ case eslSQFILE_FASTA:
+ case eslSQFILE_HMMPGMD:
+ status = esl_sqascii_WriteFasta(fp, s, update);
+ break;
+ default:
+ ESL_EXCEPTION(eslEINCONCEIVABLE, "can't write that format");
+ }
+ return status;
+}
+
+/* Function: esl_sqio_Echo()
+ * Synopsis: Echo a sequence's record onto output stream.
+ *
+ * Purpose: Given a complete <sq> that we have read by some means
+ * from an open <sqfp>; echo that sequence's record
+ * onto the output stream <ofp>.
+ *
+ * This allows records to be regurgitated exactly as they
+ * appear, rather than writing the subset of information
+ * stored in an <ESL_SQ>. <esl-sfetch> in the miniapps uses
+ * this, for example.
+ *
+ * Because this relies on repositioning the <sqfp>, it
+ * cannot be called on non-positionable streams (stdin or
+ * gzipped files). Because it relies on the sequence lying
+ * in a contiguous sequence of bytes in the file, it cannot
+ * be called on a sequence in a multiple alignment file.
+ * Trying to do so throws an <eslEINVAL> exception.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <sqfp> isn't a repositionable sequence file.
+ * <eslECORRUPT> if we run out of data, probably from bad offsets
+ * <eslEMEM> on allocation failure.
+ * <eslESYS> on system call failures.
+ *
+ *
+ */
+int
+esl_sqio_Echo(ESL_SQFILE *sqfp, const ESL_SQ *sq, FILE *ofp)
+{
+ return sqfp->echo(sqfp, sq, ofp);
+}
+/*----------------- end, writing sequences ---------------------*/
+
+
+
+/*****************************************************************
+ *# 5. Miscellaneous routines
+ *****************************************************************/
+
+/* Function: esl_sqfile_GetErrorBuf()
+ * Synopsis: Return the error buffer
+ *
+ * Purpose: Returns the pointer to the error buffer.
+ * Each parser is responsible for formatting
+ * a zero terminated string describing the
+ * error condition.
+ *
+ * Returns: A pointer the error message.
+ */
+const char *
+esl_sqfile_GetErrorBuf(const ESL_SQFILE *sqfp)
+{
+ return sqfp->get_error(sqfp);
+}
+
+
+/* Function: esl_sqfile_IsRewindable()
+ * Synopsis: Return <TRUE> if <sqfp> can be rewound.
+ *
+ * Purpose: Returns <TRUE> if <sqfp> can be rewound (positioned
+ * to an offset of zero), in order to read it a second
+ * time.
+ */
+int
+esl_sqfile_IsRewindable(const ESL_SQFILE *sqfp)
+{
+ return sqfp->is_rewindable(sqfp);
+}
+
+/* Function: esl_sqio_IsAlignment()
+ * Synopsis: Return TRUE for alignment file format codes.
+ *
+ * Purpose: Returns TRUE if <fmt> is an alignment file
+ * format code; else returns FALSE.
+ *
+ * This function only checks the convention
+ * that <fmt> codes $<$100 are unaligned formats,
+ * and $\geq$100 are aligned formats. It does
+ * not check that <fmt> is a recognized format
+ * code.
+ */
+int
+esl_sqio_IsAlignment(int fmt)
+{
+ return (fmt >= 100 ? TRUE : FALSE);
+}
+
+
+/* Function: esl_sqio_EncodeFormat()
+ * Synopsis: Convert a string to an internal format code.
+ *
+ * Purpose: Given <fmtstring>, return format code. For example, if
+ * <fmtstring> is "fasta", returns <eslSQFILE_FASTA>. Returns
+ * <eslSQFILE_UNKNOWN> if <fmtstring> doesn't exactly match a
+ * known format.
+ *
+ * Matching is case insensitive; fasta, FASTA, and FastA
+ * all return <eslSQFILE_FASTA>, for example.
+ *
+ * When augmented by msa, then alignment file formats
+ * are recognized in addition to unaligned file formats.
+ */
+int
+esl_sqio_EncodeFormat(char *fmtstring)
+{
+ if (strcasecmp(fmtstring, "fasta") == 0) return eslSQFILE_FASTA;
+ if (strcasecmp(fmtstring, "embl") == 0) return eslSQFILE_EMBL;
+ if (strcasecmp(fmtstring, "genbank") == 0) return eslSQFILE_GENBANK;
+ if (strcasecmp(fmtstring, "ddbj") == 0) return eslSQFILE_DDBJ;
+ if (strcasecmp(fmtstring, "uniprot") == 0) return eslSQFILE_UNIPROT;
+ if (strcasecmp(fmtstring, "daemon") == 0) return eslSQFILE_DAEMON;
+ if (strcasecmp(fmtstring, "hmmpgmd") == 0) return eslSQFILE_HMMPGMD;
+ if (strcasecmp(fmtstring, "fmindex") == 0) return eslSQFILE_FMINDEX;
+
+
+#ifdef eslAUGMENT_NCBI
+ if (strcasecmp(fmtstring, "ncbi") == 0) return eslSQFILE_NCBI;
+#endif
+#ifdef eslAUGMENT_MSA
+ return esl_msafile_EncodeFormat(fmtstring);
+#endif
+ return eslSQFILE_UNKNOWN;
+}
+
+/* Function: esl_sqio_DecodeFormat()
+ * Synopsis: Returns descriptive string for file format code.
+ *
+ * Purpose: Given a format code <fmt>, returns a string label for
+ * that format. For example, if <fmt> is <eslSQFILE_FASTA>,
+ * returns "FASTA".
+ *
+ * When augmented by msa, then alignment file format codes
+ * are recognized in addition to unaligned file format codes.
+ */
+char *
+esl_sqio_DecodeFormat(int fmt)
+{
+#ifdef eslAUGMENT_MSA
+ if (esl_sqio_IsAlignment(fmt)) return esl_msafile_DecodeFormat(fmt);
+#endif
+
+ switch (fmt) {
+ case eslSQFILE_UNKNOWN: return "unknown";
+ case eslSQFILE_FASTA: return "FASTA";
+ case eslSQFILE_EMBL: return "EMBL";
+ case eslSQFILE_GENBANK: return "GenBank";
+ case eslSQFILE_DDBJ: return "DDBJ";
+ case eslSQFILE_UNIPROT: return "UniProt";
+ case eslSQFILE_DAEMON: return "daemon";
+ case eslSQFILE_HMMPGMD: return "hmmpgmd";
+#ifdef eslAUGMENT_NCBI
+ case eslSQFILE_NCBI: return "NCBI";
+#endif
+ default: break;
+ }
+ esl_exception(eslEINVAL, FALSE, __FILE__, __LINE__, "no such sqio format code %d", fmt);
+ return NULL;
+}
+
+
+/* Function: esl_sqfile_Position()
+ * Synopsis: Reposition an open sequence file to an offset.
+ *
+ * Purpose: Reposition an open <sqfp> to offset <offset>.
+ * <offset> would usually be the first byte of a
+ * desired sequence record.
+ *
+ * Only normal sequence files can be positioned to a
+ * nonzero offset. If <sqfp> corresponds to a standard
+ * input stream or gzip -dc stream, it may not be
+ * repositioned. If <sqfp> corresponds to a multiple
+ * sequence alignment file, the only legal <offset>
+ * is 0, to rewind the file to the beginning and
+ * be able to read the entire thing again.
+ *
+ * After <esl_sqfile_Position()> is called on a nonzero
+ * <offset>, and other bookkeeping information is unknown.
+ * If caller knows it, it should set it explicitly.
+ *
+ * See the SSI module for manipulating offsets and indices.
+ *
+ * Returns: <eslOK> on success;
+ * <eslEOF> if no data can be read from this position.
+ *
+ * Throws: <eslESYS> if the fseeko() or fread() call fails.
+ * <eslEMEM> on (re-)allocation failure.
+ * <eslEINVAL> if the <sqfp> is not positionable.
+ * <eslENOTFOUND> if in trying to rewind an alignment file
+ * by closing and reopening it, the open fails.
+ * On errors, the state of <sqfp> is indeterminate, and
+ * it should not be used again.
+ */
+int
+esl_sqfile_Position(ESL_SQFILE *sqfp, off_t offset)
+{
+ return sqfp->position(sqfp, offset);
+}
+
+/* Function: esl_sqio_Ignore()
+ * Synopsis: Sets the input map to ignore one or more input characters.
+ *
+ * Purpose: Set the input map of the open <sqfp> to allow
+ * the characters in the string <ignoredchars> to appear
+ * in input sequences. These characters will be ignored.
+ *
+ * For example, an application might want to ignore '*'
+ * characters in its sequence input, because some translated
+ * peptide files use '*' to indicate stop codons.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_sqio_Ignore(ESL_SQFILE *sqfp, const char *ignoredchars)
+{
+ int i;
+ for (i = 0; ignoredchars[i] != '\0'; i++)
+ sqfp->inmap[(int) ignoredchars[i]] = eslDSQ_IGNORED;
+ return eslOK;
+}
+
+/* Function: esl_sqio_AcceptAs()
+ * Synopsis: Map a list of additional characters.
+ *
+ * Purpose: Set the input map of the open <sqfp> to allow the
+ * characters in the string <xchars> to appear in
+ * input sequences. These characters will all be
+ * mapped to the character <readas> (or, for digital
+ * sequence input, to the digitized representation
+ * of the text character <readas> in the <sqfp>'s
+ * digital alphabet).
+ *
+ * For example, an application might want to read
+ * '*' as 'X' when reading translated peptide files
+ * that use '*' to indicate a stop codon.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_sqio_AcceptAs(ESL_SQFILE *sqfp, char *xchars, char readas)
+{
+ int i;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (sqfp->do_digital)
+ {
+ for (i = 0; xchars[i] != '\0'; i++)
+ sqfp->inmap[(int) xchars[i]] = esl_abc_DigitizeSymbol(sqfp->abc, readas);
+ }
+#endif
+ if (! sqfp->do_digital)
+ {
+ for (i = 0; xchars[i] != '\0'; i++)
+ sqfp->inmap[(int) xchars[i]] = readas;
+ }
+ return eslOK;
+
+}
+/*--------------- end, miscellaneous routines -------------------*/
+
+
+
+/*****************************************************************
+ *# 6. Sequence/subsequence fetching, random access [with <ssi>]
+ *****************************************************************/
+
+#ifdef eslAUGMENT_SSI
+/* Function: esl_sqfile_OpenSSI()
+ * Synopsis: Opens an SSI index associated with a sequence file.
+ *
+ * Purpose: Opens an SSI index file associated with the already open
+ * sequence file <sqfp>. If successful, the necessary
+ * information about the open SSI file is stored internally
+ * in <sqfp>.
+ *
+ * The SSI index file name is determined in one of two
+ * ways, depending on whether a non-<NULL> <ssifile_hint>
+ * is provided.
+ *
+ * If <ssifile_hint> is <NULL>, the default for
+ * constructing the SSI filename from the sequence
+ * filename, by using exactly the same path (if any) for
+ * the sequence filename, and appending the suffix <.ssi>.
+ * For example, the SSI index for <foo> is <foo.ssi>, for
+ * <./foo.fa> is <./foo.fa.ssi>, and for
+ * </my/path/to/foo.1.fa> is </my/path/to/foo.1.fa.ssi>.
+ *
+ * If <ssifile_hint> is <non-NULL>, this exact fully
+ * qualified path is used as the SSI file name.
+ *
+ * Returns: <eslOK> on success, and <sqfp->ssi> is now internally
+ * valid.
+ *
+ * <eslENOTFOUND> if no SSI index file is found;
+ * <eslEFORMAT> if it's found, but appears to be in incorrect format;
+ * <eslERANGE> if the SSI file uses 64-bit offsets but we're on
+ * a system that doesn't support 64-bit file offsets.
+ *
+ * Throws: <eslEINVAL> if the open sequence file <sqfp> doesn't
+ * correspond to a normal sequence flatfile -- we can't
+ * random access in .gz compressed files, standard input,
+ * or multiple alignment files that we're reading
+ * sequentially.
+ *
+ * Throws <eslEMEM> on allocation error.
+ */
+int
+esl_sqfile_OpenSSI(ESL_SQFILE *sqfp, const char *ssifile_hint)
+{
+ return sqfp->open_ssi(sqfp, ssifile_hint);
+}
+
+
+
+/* Function: esl_sqfile_PositionByKey()
+ * Synopsis: Use SSI to reposition seq file to a particular sequence.
+ *
+ * Purpose: Reposition <sqfp> so that the next sequence we read will
+ * be the one named (or accessioned) <key>.
+ *
+ * <sqfp->linenumber> is reset to be relative to the start
+ * of the record named <key>, rather than the start of the
+ * file.
+ *
+ * Returns: <eslOK> on success, and the file <sqfp> is repositioned
+ * so that the next <esl_sqio_Read()> call will read the
+ * sequence named <key>.
+ *
+ * Returns <eslENOTFOUND> if <key> isn't found in the
+ * index; in this case, the position of <sqfp> in the file
+ * is unchanged.
+ *
+ * Returns <eslEFORMAT> if something goes wrong trying to
+ * read the index, almost certainly indicating a format
+ * problem in the SSI file.
+ *
+ * Returns <eslEOF> if, after repositioning, we fail to
+ * load the next line or buffer from the sequence file;
+ * this probably also indicates a format problem in the SSI
+ * file.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslEINVAL> if there's no open SSI index in <sqfp>;
+ * <eslESYS> if the <fseek()> fails.
+ *
+ * In all these cases, the state of <sqfp> becomes
+ * undefined, and the caller should not use it again.
+ */
+int
+esl_sqfile_PositionByKey(ESL_SQFILE *sqfp, const char *key)
+{
+ return sqfp->pos_by_key(sqfp, key);
+}
+
+
+/* Function: esl_sqfile_PositionByNumber()
+ * Synopsis: Use SSI to reposition by sequence number
+ *
+ * Purpose: Reposition <sqfp> so that the next sequence we
+ * read will be the <which>'th sequence, where <which>
+ * is <0..sqfp->ssi->nprimary-1>.
+ *
+ * <sqfp->linenumber> is reset to be relative to the start
+ * of the record named <key>, rather than the start of the
+ * file.
+ *
+ * Returns: <eslOK> on success, and the file <sqfp> is repositioned.
+ *
+ * Returns <eslENOTFOUND> if there is no sequence number
+ * <which> in the index; in this case, the position of
+ * <sqfp> in the file is unchanged.
+ *
+ * Returns <eslEFORMAT> if something goes wrong trying to
+ * read the index, almost certainly indicating a format
+ * problem in the SSI file.
+ *
+ * Returns <eslEOF> if, after repositioning, we fail to
+ * load the next line or buffer from the sequence file;
+ * this probably also indicates a format problem in the SSI
+ * file.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslEINVAL> if there's no open SSI index in <sqfp>;
+ * <eslESYS> if the <fseek()> fails.
+ *
+ * In all these cases, the state of <sqfp> becomes
+ * undefined, and the caller should not use it again.
+ */
+int
+esl_sqfile_PositionByNumber(ESL_SQFILE *sqfp, int which)
+{
+ return sqfp->pos_by_number(sqfp, which);
+}
+
+
+/* Function: esl_sqio_Fetch()
+ * Synopsis: Fetch a complete sequence, using SSI indexing.
+ *
+ * Purpose: Fetch a sequence named (or accessioned) <key> from
+ * the repositionable, open sequence file <sqfp>.
+ * The open <sqfp> must have an open SSI index.
+ * The sequence is returned in <sq>.
+ *
+ * Returns: <eslOK> on soccess.
+ * <eslEINVAL> if no SSI index is present, or if <sqfp> can't
+ * be repositioned.
+ * <eslENOTFOUND> if <source> isn't found in the file.
+ * <eslEFORMAT> if either the index file or the sequence file
+ * can't be parsed, because of unexpected format issues.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_sqio_Fetch(ESL_SQFILE *sqfp, const char *key, ESL_SQ *sq)
+{
+ return sqfp->fetch(sqfp, key, sq);
+}
+
+/* Function: esl_sqio_FetchInfo()
+ * Synopsis: Fetch a sequence's info, using SSI indexing.
+ *
+ * Purpose: Fetch a sequence named (or accessioned) <key> from
+ * the repositionable, open sequence file <sqfp>, reading
+ * all info except the sequence (and secondary structure).
+ * The open <sqfp> must have an open SSI index.
+ * The sequence info is returned in <sq>.
+ *
+ * Returns: <eslOK> on soccess.
+ * <eslEINVAL> if no SSI index is present, or if <sqfp> can't
+ * be repositioned.
+ * <eslENOTFOUND> if <source> isn't found in the file.
+ * <eslEFORMAT> if either the index file or the sequence file
+ * can't be parsed, because of unexpected format issues.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_sqio_FetchInfo(ESL_SQFILE *sqfp, const char *key, ESL_SQ *sq)
+{
+ return sqfp->fetch_info(sqfp, key, sq);
+}
+
+
+/* Function: esl_sqio_FetchSubseq()
+ * Synopsis: Fetch a subsequence, using SSI indexing.
+ *
+ * Purpose: Fetch subsequence <start..end> from a sequence named (or
+ * accessioned) <source>, in the repositionable, open sequence file <sqfp>.
+ * The open <sqfp> must have an SSI index. Put the
+ * subsequence in <sq>.
+ *
+ * As a special case, if <end> is 0, the subsequence is
+ * fetched all the way to the end, so you don't need to
+ * look up the sequence length <L> to fetch a suffix.
+ *
+ * The caller may want to rename/reaccession/reannotate the
+ * subsequence. Upon successful return, <sq->name> is set
+ * to <source/start-end>, and <sq->source> is set to
+ * <source> The accession and description <sq->acc> and
+ * <sq->desc> are set to the accession and description of
+ * the source sequence.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEINVAL> if no SSI index is present, or if <sqfp> can't
+ * be repositioned.
+ * <eslENOTFOUND> if <source> isn't found in the file.
+ * <eslEFORMAT> if either the index file or the sequence file
+ * can't be parsed, because of unexpected format issues.
+ * <eslERANGE> if the <start..end> coords don't lie entirely
+ * within the <source> sequence.
+ *
+ * Throws: <eslEMEM> on allocation errors.
+ */
+int
+esl_sqio_FetchSubseq(ESL_SQFILE *sqfp, const char *source, int64_t start, int64_t end, ESL_SQ *sq)
+{
+ return sqfp->fetch_subseq(sqfp, source, start, end, sq);
+}
+#endif /*eslAUGMENT_SSI*/
+/*------------- end, random sequence access with SSI -------------------*/
+
+
+/*****************************************************************
+ *# 7. Sequence database caching.
+ *****************************************************************/
+
+/* Function: esl_sqfile_Cache()
+ * Synopsis: Read a database into memory.
+ *
+ * Purpose: Read an entire database into memory building a cached
+ * structure <ESL_SQCACHE>. The cache structure has basic
+ * information about the database, ie number of sequences
+ * number of residues, etc.
+ *
+ * All sequences <ESL_SQ> are in a memory array <sq_list>.
+ * The number of elements in the list is <seq_count>. The
+ * header pointers, ie name, acc and desc are pointers into
+ * the <header_mem> buffer. All digitized sequences are pointers
+ * into the <residue_mem> buffer.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Returns <eslEFORMAT> if a parse error is encountered in
+ * trying to read the sequence file.
+ *
+ * Returns <eslENODATA> if the file appears to be empty.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ */
+int
+esl_sqfile_Cache(const ESL_ALPHABET *abc, const char *seqfile, int fmt, const char *env, ESL_SQCACHE **ret_sqcache)
+{
+ int status;
+
+ int n;
+
+ uint32_t len;
+ uint32_t max;
+ uint32_t count;
+
+ uint64_t res_size = 1;
+ uint64_t hdr_size = 1;
+
+ ESL_SQFILE *sqfp = NULL;
+
+ ESL_SQ *c = NULL;
+ ESL_SQ *sq = NULL;
+ ESL_SQCACHE *cache = NULL;
+
+ ESL_DSQ *res_ptr = NULL;
+ char *hdr_ptr = NULL;
+
+ /* open the database */
+ status = esl_sqfile_OpenDigital(abc, seqfile, fmt, env, &sqfp);
+ if (status != eslOK) return status;
+
+ /* if we can't rewind the database, stop now. */
+ if (!esl_sqfile_IsRewindable(sqfp)) return eslFAIL;
+
+ /* loop through the database reading all the sequnces */
+ max = 0;
+ count = 0;
+ sq = esl_sq_CreateDigital(abc);
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK) {
+ ++count;
+
+ res_size += sq->n + 1;
+ if (sq->n > max) max = sq->n;
+
+ len = strlen(sq->name);
+ if (len > 0) ++len;
+ hdr_size += len;
+
+ len = strlen(sq->acc);
+ if (len > 0) ++len;
+ hdr_size += len;
+
+ len = strlen(sq->desc);
+ if (len > 0) ++len;
+ hdr_size += len;
+
+ esl_sq_Reuse(sq);
+ }
+ if (status != eslEOF) goto ERROR;
+
+ /* now that the database information is know, allocate the memory to
+ * hold the data. different memory blocks will be used to hold the
+ * redisues and header info. the idea is that since the header info,
+ * ie, name, acc, etc is used infrenquently (only when there is a hit)
+ * if some pages need to be swapped out, hopefully it will be the
+ * header pages first leaving the sequences in memory.
+ */
+ ESL_ALLOC(cache, sizeof(ESL_SQCACHE));
+
+ cache->filename = NULL;
+ cache->sq_list = NULL;
+ cache->residue_mem = NULL;
+ cache->header_mem = NULL;
+
+ cache->abc = abc;
+ cache->format = fmt;
+ cache->seq_count = count;
+ cache->res_count = res_size;
+ cache->max_seq = max;
+
+ cache->res_size = res_size + 2;
+ cache->hdr_size = hdr_size;
+
+ ESL_ALLOC(cache->filename, strlen(seqfile) + 1);
+ strcpy(cache->filename, seqfile);
+
+ ESL_ALLOC(cache->sq_list, sizeof(ESL_SQ) * (count + 1));
+
+ /* different memory blocks will be used to hold the residues and header
+ * info. the idea is that since the header info, ie, name, acc, etc.
+ * is used infrenquently (only when there is a hit) if some pages need
+ * to be swapped out, hopefully it will be the header pages first
+ * leaving the sequences in memory.
+ */
+ ESL_ALLOC(cache->residue_mem, res_size + 2);
+ ESL_ALLOC(cache->header_mem, hdr_size);
+
+ hdr_ptr = cache->header_mem;
+ *hdr_ptr = 0;
+
+ res_ptr = cache->residue_mem;
+ *res_ptr = eslDSQ_SENTINEL;
+
+ /* loop through the database filling in the cache */
+ n = 0;
+ esl_sqfile_Position(sqfp, 0);
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK) {
+ c = cache->sq_list + n;
+
+ /* if header fields have been defined, copy them to the cache */
+ c->name = hdr_ptr;
+ if (sq->name[0] != 0) {
+ c->name = hdr_ptr + 1;
+ strcpy(c->name, sq->name);
+ hdr_ptr += strlen(sq->name) + 1;
+ }
+
+ c->acc = hdr_ptr;
+ if (sq->acc[0] != 0) {
+ c->acc = hdr_ptr + 1;
+ strcpy(c->acc, sq->acc);
+ hdr_ptr += strlen(sq->acc) + 1;
+ }
+
+ c->desc = hdr_ptr;
+ if (sq->desc[0] != 0) {
+ c->desc = hdr_ptr + 1;
+ strcpy(c->desc, sq->desc);
+ hdr_ptr += strlen(sq->desc) + 1;
+ }
+
+ c->tax_id = sq->tax_id;
+ c->seq = NULL;
+ c->ss = NULL;
+ c->nxr = 0;
+ c->xr_tag = NULL;
+ c->xr = NULL;
+
+ /* copy the digitized sequence */
+ memcpy(res_ptr + 1, sq->dsq + 1, sq->n + 1);
+ c->dsq = res_ptr;
+ c->n = sq->n;
+ res_ptr += sq->n + 1;
+
+ /* Coordinate info */
+ c->start = sq->start;
+ c->end = sq->end;
+ c->C = sq->C;
+ c->W = sq->W;
+ c->L = sq->L;
+
+ c->source = NULL;
+
+ /* allocated lengths */
+ c->nalloc = -1;
+ c->aalloc = -1;
+ c->dalloc = -1;
+ c->salloc = -1;
+ c->srcalloc = -1;
+
+ /* Disk offset bookkeeping */
+ c->idx = n;
+ c->roff = sq->roff;
+ c->hoff = sq->hoff;
+ c->doff = sq->doff;
+ c->eoff = sq->eoff;
+
+ c->abc = abc;
+
+ esl_sq_Reuse(sq);
+ ++n;
+ }
+ if (status != eslEOF) goto ERROR;
+
+ /* add on last empty sequence */
+ c = cache->sq_list + count;
+ *(res_ptr + 1) = eslDSQ_SENTINEL;
+
+ c->name = hdr_ptr;
+ c->acc = hdr_ptr;
+ c->desc = hdr_ptr;
+
+ c->tax_id = -1;
+ c->seq = NULL;
+ c->ss = NULL;
+ c->nxr = 0;
+ c->xr_tag = NULL;
+ c->xr = NULL;
+
+ c->dsq = res_ptr;
+ c->n = 0;
+
+ c->start = 0;
+ c->end = 0;
+ c->C = 0;
+ c->W = 0;
+ c->L = -1;
+
+ c->source = NULL;
+
+ c->nalloc = -1;
+ c->aalloc = -1;
+ c->dalloc = -1;
+ c->salloc = -1;
+ c->srcalloc = -1;
+
+ c->idx = count;
+ c->roff = -1;
+ c->hoff = -1;
+ c->doff = -1;
+ c->eoff = -1;
+
+ c->abc = NULL;
+
+ if (sq != NULL) esl_sq_Destroy(sq);
+ esl_sqfile_Close(sqfp);
+
+ *ret_sqcache = cache;
+
+ return eslOK;
+
+ERROR:
+ if (sq != NULL) esl_sq_Destroy(sq);
+ esl_sqfile_Close(sqfp);
+
+ esl_sqfile_Free(cache);
+
+ return status;
+}
+
+/* Function: esl_sqfile_Free()
+ * Synopsis: Free a cached database <ESL_SQCACHE>.
+ *
+ * Purpose: Frees all the memory used to cache the sequence database.
+ *
+ * Returns: none.
+ */
+void
+esl_sqfile_Free(ESL_SQCACHE *sqcache)
+{
+ if (sqcache == NULL) return;
+
+ if (sqcache->filename != NULL) free(sqcache->filename);
+ if (sqcache->sq_list != NULL) free(sqcache->sq_list);
+ if (sqcache->residue_mem != NULL) free(sqcache->residue_mem);
+ if (sqcache->header_mem != NULL) free(sqcache->header_mem);
+
+ sqcache->abc = NULL;
+ sqcache->filename = NULL;
+ sqcache->sq_list = NULL;
+ sqcache->residue_mem = NULL;
+ sqcache->header_mem = NULL;
+
+ free(sqcache);
+}
+/*---------------- end, sequence database caching ---------------*/
+
+
+
+
+
+/*****************************************************************
+ * 8. Functions specific to sqio <-> msa interoperation [with <msa>]
+ *****************************************************************/
+
+#ifdef eslAUGMENT_MSA
+/* convert_sq_to_msa()
+ *
+ * Given a <sq>, create and return an "MSA" through <ret_msa>, which
+ * contains only the single unaligned sequence. <sq> is
+ * not affected in any way. This is only to convert from the SQ
+ * object to an MSA object for the purpose of writing SQ in an MSA format
+ * file format.
+ *
+ * Returns <eslOK> on success, and <*ret_msa> points to
+ * a new "alignment".
+ *
+ * Throws <eslEMEM> on allocation error, and <*ret_msa> is NULL.
+ */
+static int
+convert_sq_to_msa(ESL_SQ *sq, ESL_MSA **ret_msa)
+{
+ ESL_MSA *msa;
+ int x; /* counter for extra-residue markups */
+ int status;
+
+#ifdef eslAUGMENT_ALPHABET
+ if (sq->dsq != NULL) {
+ if ((msa = esl_msa_CreateDigital(sq->abc, 1, sq->n)) == NULL) { status = eslEMEM; goto ERROR; }
+ } else
+#endif
+ if ((msa = esl_msa_Create(1, sq->n)) == NULL) { status = eslEMEM; goto ERROR; }
+
+ if ((status = esl_strdup(sq->name, -1, &(msa->sqname[0]))) != eslOK) goto ERROR;
+
+ if (*sq->acc != '\0')
+ {
+ ESL_ALLOC(msa->sqacc, sizeof(char *) * 1);
+ if ((status = esl_strdup(sq->acc, -1, &(msa->sqacc[0]))) != eslOK) goto ERROR;
+ }
+ if (*sq->desc != '\0')
+ {
+ ESL_ALLOC(msa->sqdesc, sizeof(char *) * 1);
+ if ((status = esl_strdup(sq->desc, -1, &(msa->sqdesc[0]))) != eslOK) goto ERROR;
+ }
+
+#ifdef eslAUGMENT_ALPHABET
+ if (sq->dsq != NULL) esl_abc_dsqcpy(sq->dsq, sq->n, msa->ax[0]);
+ else
+#endif
+ strcpy(msa->aseq[0], sq->seq);
+
+ if (sq->ss != NULL)
+ {
+ ESL_ALLOC(msa->ss, sizeof(char *) * 1);
+
+#ifdef eslAUGMENT_ALPHABET
+ if (sq->dsq != NULL) { /* sq->ss is 1..L in digital mode; but msa->ss is always 0..L-1 */
+ if ((status = esl_strdup(sq->ss+1, -1, &(msa->ss[0]))) != eslOK) goto ERROR;
+ } else
+#endif
+ if ((status = esl_strdup(sq->ss, -1, &(msa->ss[0]))) != eslOK) goto ERROR;
+
+ }
+
+ if (sq->nxr > 0) {
+ msa->ngr = sq->nxr;
+ ESL_ALLOC(msa->gr, sizeof(char **) * msa->ngr);
+ ESL_ALLOC(msa->gr_tag, sizeof(char *) * msa->ngr);
+
+ for (x = 0; x < msa->ngr; x ++) {
+ ESL_ALLOC(msa->gr[x], sizeof(char *));
+ ESL_ALLOC(msa->gr_tag[x], sizeof(char));
+
+#ifdef eslAUGMENT_ALPHABET
+ if (sq->dsq != NULL) { /* sq->xr is 1..L in digital mode; but msa->gr is always 0..L-1 */
+ if ((status = esl_strdup(sq->xr[x]+1, -1, &(msa->gr[x][0]))) != eslOK) goto ERROR;
+ } else
+#endif
+ if ((status = esl_strdup(sq->xr[x], -1, &(msa->gr[x][0]))) != eslOK) goto ERROR;
+
+ if ((status = esl_strdup(sq->xr_tag[x], -1, &(msa->gr_tag[x]))) != eslOK) goto ERROR;
+ }
+ }
+
+ msa->alen = sq->n;
+ msa->nseq = 1;
+ *ret_msa = msa;
+ return eslOK;
+
+ ERROR:
+ esl_msa_Destroy(msa);
+ *ret_msa = NULL;
+ return status;
+}
+
+#endif /*eslAUGMENT_MSA*/
+/*---------- end of msa <-> sqio module interop -----------------*/
+
+
+
+/*****************************************************************
+ *# 9. Benchmark driver
+ *****************************************************************/
+/* Some current results:
+ *
+ * ./benchmark /misc/data0/genomes/c.elegans/genome/allWS120
+ * CPU Time: 0.90u 0.06s 00:00:00.96 Elapsed: 00:00:01
+ *
+ * /benchmark -i /misc/data0/genomes/c.elegans/genome/allWS120
+ * CPU Time: 0.41u 0.04s 00:00:00.44 Elapsed: 00:00:00
+ *
+ * ./benchmark -w /misc/data0/genomes/c.elegans/genome/allWS120
+ * CPU Time: 0.83u 0.05s 00:00:00.88 Elapsed: 00:00:01
+ *
+ * ./benchmark -2w /misc/data0/genomes/c.elegans/genome/allWS120
+ * CPU Time: 3.55u 0.26s 00:00:03.80 Elapsed: 00:00:04
+ *
+ * Digital times are comparable (maybe a titch faster), except
+ * for -d2w, which runs much faster, because rev complementation is
+ * more efficient:
+ *
+ * ./benchmark -d2w /misc/data0/genomes/c.elegans/genome/allWS120
+ * CPU Time: 2.16u 0.31s 00:00:02.47 Elapsed: 00:00:03
+ */
+/* gcc -std=gnu99 -O3 -fomit-frame-pointer -malign-double -fstrict-aliasing -msse2 -pthread -I. -L. -o esl_sqio_benchmark -DeslSQIO_BENCHMARK esl_sqio.c -leasel -lm
+ * icc -O3 -ansi_alias -xW -static -I. -L. -o esl_sqio_benchmark -DeslSQIO_BENCHMARK esl_sqio.c -leasel -lm
+ * ./esl_sqio_benchmark <seqfile>
+ */
+#ifdef eslSQIO_BENCHMARK
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_stopwatch.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-d", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use digital sequence input mode", 0 },
+ { "-i", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "benchmark ReadInfo() input", 0 },
+ { "-s", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "benchmark ReadSequence() input", 0 },
+ { "-w", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "benchmark ReadWindow() input", 0 },
+ { "-B", eslARG_INT, "4096", NULL, NULL, NULL, NULL, NULL, "buffer size for read, fread tests", 0 },
+ { "-C", eslARG_INT, "100", NULL, NULL, NULL, NULL, NULL, "context size for ReadWindow()", 0 },
+ { "-W", eslARG_INT, "1000", NULL, NULL, NULL, NULL, NULL, "window size for ReadWindow()", 0 },
+ { "-2", eslARG_NONE, FALSE, NULL, NULL, NULL, "-w", NULL, "with ReadWindow(), do both strands", 0 },
+ { "--format", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "assert <seqfile> is in format <s>", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use protein alphabet, not DNA", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <DNA FASTA file>";
+static char banner[] = "benchmark driver for sqio module";
+
+static int benchmark_read (char *filename, int bufsize, int64_t *ret_magic);
+static int benchmark_fread(char *filename, int bufsize, int64_t *ret_magic);
+static int benchmark_fgets(char *filename, int bufsize, int64_t *ret_magic);
+/*static int benchmark_mmap (char *filename, int bufsize, int64_t *ret_magic);*/
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ ESL_STOPWATCH *w = esl_stopwatch_Create();
+ ESL_ALPHABET *abc = NULL;
+ ESL_SQ *sq = NULL;
+ ESL_SQFILE *sqfp = NULL;
+ char *filename = esl_opt_GetArg(go, 1);
+ int format = eslSQFILE_UNKNOWN;
+ int bufsize = esl_opt_GetInteger(go, "-B");
+ int C = esl_opt_GetInteger(go, "-C");
+ int W = esl_opt_GetInteger(go, "-W");
+ int do_crick = esl_opt_GetBoolean(go, "-2");
+ int n = 0;
+ int64_t magic = 0;
+ int64_t nr = 0;
+
+ if (esl_opt_IsOn(go, "--format")) {
+ format = esl_sqio_EncodeFormat(esl_opt_GetString(go, "--format"));
+ if (format == eslSQFILE_UNKNOWN) esl_fatal("unrecognized database format %s\n", esl_opt_GetString(go, "--format"));
+ }
+
+ if (esl_opt_GetBoolean(go, "-d"))
+ {
+ if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+ else abc = esl_alphabet_Create(eslDNA);
+ sq = esl_sq_CreateDigital(abc);
+ if (esl_sqfile_OpenDigital(abc, filename, format, NULL, &sqfp) != eslOK) esl_fatal("failed to open %s", filename);
+ }
+ else
+ {
+ sq = esl_sq_Create();
+ if (esl_sqfile_Open(filename, format, NULL, &sqfp) != eslOK) esl_fatal("failed to open %s", filename);
+ }
+
+
+ /* It's useful to have some baselines of just reading the file without parsing;
+ * POSIX read(); C fread(); C fgets(); and POSIX mmap().
+ * Counting a's (<na>) is just to keep the optimizer from optimizing the
+ * benchmark away.
+ */
+ esl_stopwatch_Start(w); benchmark_read (filename, bufsize, &magic); esl_stopwatch_Stop(w); printf("magic=%" PRId64 "; ", magic); esl_stopwatch_Display(stdout, w, "read(): ");
+ esl_stopwatch_Start(w); benchmark_fread(filename, bufsize, &magic); esl_stopwatch_Stop(w); printf("magic=%" PRId64 "; ", magic); esl_stopwatch_Display(stdout, w, "fread(): ");
+ esl_stopwatch_Start(w); benchmark_fgets(filename, bufsize, &magic); esl_stopwatch_Stop(w); printf("magic=%" PRId64 "; ", magic); esl_stopwatch_Display(stdout, w, "fgets(): ");
+ /* esl_stopwatch_Start(w); benchmark_mmap (filename, bufsize, &magic); esl_stopwatch_Stop(w); printf("magic=%" PRId64 "; ", magic); esl_stopwatch_Display(stdout, w, "mmap(): "); */
+
+ esl_stopwatch_Start(w);
+ if (esl_opt_GetBoolean(go, "-i"))
+ {
+ while (esl_sqio_ReadInfo(sqfp, sq) == eslOK) { n++; nr += sq->L; esl_sq_Reuse(sq); }
+ }
+ else if (esl_opt_GetBoolean(go, "-s"))
+ {
+ while (esl_sqio_ReadSequence(sqfp, sq) == eslOK) { n++; nr += sq->L; esl_sq_Reuse(sq); }
+ }
+ else if (esl_opt_GetBoolean(go, "-w"))
+ {
+ int wstatus;
+ while ((wstatus = esl_sqio_ReadWindow(sqfp, C, W, sq)) != eslEOF)
+ {
+ if (wstatus == eslEOD) {
+ if (!do_crick || W < 0) { n++; esl_sq_Reuse(sq); }
+ if (do_crick) { W = -W; }
+ continue;
+ } else if (wstatus != eslOK) esl_fatal("Error: %s", esl_sqfile_GetErrorBuf(sqfp));
+ nr += sq->W;
+ }
+ }
+ else
+ {
+ while (esl_sqio_Read(sqfp, sq) == eslOK) { n++; nr += sq->L; esl_sq_Reuse(sq); }
+ }
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "sqio: ");
+ printf("Read %d sequences; %lld residues.\n", n, (long long int) nr);
+
+#ifdef eslAUGMENT_NCBI
+ if (sqfp->format == eslSQFILE_NCBI)
+ printf(" DB %d sequences; %lld residues.\n", sqfp->data.ncbi.num_seq, (long long int) sqfp->data.ncbi.total_res);
+#endif
+
+ esl_sqfile_Close(sqfp);
+ esl_sq_Destroy(sq);
+ esl_stopwatch_Destroy(w);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+static int
+benchmark_read(char *filename, int bufsize, int64_t *ret_magic)
+{
+ char *buf = malloc(sizeof(char) * bufsize);
+ int fd = open(filename, O_RDONLY);
+ int n;
+ int64_t magic = 0;
+ int pos;
+
+ if (fd != -1)
+ {
+ while ( (n = read(fd, buf, bufsize)) > 0)
+ {
+ for (pos = 0; pos < n; pos++) magic += buf[pos];
+ }
+ close(fd);
+ }
+
+ free(buf);
+ *ret_magic = magic;
+ return eslOK;
+}
+
+static int
+benchmark_fread(char *filename, int bufsize, int64_t *ret_magic)
+{
+ FILE *fp = fopen(filename, "r");
+ char *buf = malloc(sizeof(char) * bufsize);
+ int64_t magic = 0;
+ int pos;
+ int n;
+
+ if (fp != NULL)
+ {
+ while ( (n = fread(buf, sizeof(char), bufsize, fp)) > 0)
+ {
+ for (pos = 0; pos < n; pos++) magic += buf[pos];
+ }
+ fclose(fp);
+ }
+
+ free(buf);
+ *ret_magic = magic;
+ return eslOK;
+}
+
+
+static int
+benchmark_fgets(char *filename, int bufsize, int64_t *ret_magic)
+{
+ FILE *fp = fopen(filename, "r");
+ char *buf = malloc(sizeof(char) * bufsize);
+ int64_t magic = 0;
+ char *s;
+
+ if (fp != NULL)
+ {
+ while ( fgets(buf, bufsize, fp) != NULL)
+ {
+ for (s = buf; *s; s++) magic += *s;
+ }
+ fclose(fp);
+ }
+
+ free(buf);
+ *ret_magic = magic;
+ return eslOK;
+}
+
+
+#if 0
+/* we can't use mmap anyway; we have to be able to read from streams
+ * and pipes.
+ */
+static int
+benchmark_mmap(char *filename, int bufsize, int64_t *ret_magic)
+{
+ int fd = open(filename, O_RDONLY);
+ struct stat statbuf;
+ char *p;
+ uint64_t pos;
+ uint64_t magic = 0;
+
+ fstat(fd, &statbuf);
+ p = mmap(0, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
+ for (pos = 0; pos < statbuf.st_size; pos++)
+ magic += p[pos];
+
+ close(fd);
+ *ret_magic = magic;
+ return eslOK;
+}
+#endif
+
+
+#endif /*eslSQIO_BENCHMARK*/
+/*------------------ end of benchmark ---------------------------*/
+
+
+
+/*****************************************************************
+ *# 10. Unit tests
+ *****************************************************************/
+#ifdef eslSQIO_TESTDRIVE
+#include "esl_random.h"
+#include "esl_randomseq.h"
+#include "esl_vectorops.h"
+
+static void
+synthesize_testseqs(ESL_RANDOMNESS *r, ESL_ALPHABET *abc, int maxL, int N, ESL_SQ ***ret_sqarr)
+{
+ ESL_SQ **sqarr = malloc(sizeof(ESL_SQ *) * N);
+ float *fq = malloc(sizeof(float) * abc->Kp);
+ char *buf = NULL;
+ int maxn = eslSQ_NAMECHUNK*2;
+ int maxa = eslSQ_ACCCHUNK*2;
+ int maxd = eslSQ_DESCCHUNK*2;
+ char ascii[128];
+ float af[128];
+ int i, pos;
+ int n;
+ int x;
+
+ n = ESL_MAX( maxn, ESL_MAX(maxa, maxd));
+ buf = malloc(sizeof(char) * (n+1));
+
+ /* Set a residue frequency vector that's going to sample degenerate residues too */
+ esl_vec_FSet(fq, abc->Kp, 0.0);
+ esl_vec_FSet(fq, abc->K, 0.9 / (float) abc->K);
+ esl_vec_FSet(fq + abc->K + 1, abc->Kp - abc->K - 2, 0.1 / (float) (abc->Kp - abc->K - 2));
+
+ /* Set an ASCII frequency vector that'll sample all nonspace chars */
+ for (x = 0; x < 128; x++) {
+ ascii[x] = (char) x;
+ if (isalpha(x)) af[x] = 3.0;
+ else if (isdigit(x)) af[x] = 2.0;
+ else if (ispunct(x) && x != '%') af[x] = 1.0; /* disallow %; it'll screw up printf()-like Set calls */
+ else af[x] = 0.0;
+ }
+ esl_vec_FNorm(af, 128);
+
+ for (i = 0; i < N; i++)
+ {
+ if ((sqarr[i] = esl_sq_CreateDigital(abc)) == NULL) esl_fatal("failed to allocate seq %d", i);
+
+ do {
+ n = esl_rnd_Roll(r, maxn) + 1; /* 1..maxn */
+ esl_rsq_fIID(r, ascii, af, 128, n, buf);
+ buf[n] = '\0';
+ } while (ispunct(buf[0])); /* #, // are bad things for names to start with, in Stockholm format */
+ esl_sq_SetName(sqarr[i], buf);
+
+ if (esl_rnd_Roll(r, 2) == 0) { /* 50% chance of an accession */
+ n = esl_rnd_Roll(r, maxa) + 1;
+ esl_rsq_fIID(r, ascii, af, 128, n, buf);
+ buf[n] = '\0';
+ esl_sq_SetAccession(sqarr[i], buf);
+ }
+
+ if (esl_rnd_Roll(r, 2) == 0) { /* 50% chance of a description */
+ n = esl_rnd_Roll(r, maxd) + 1;
+ esl_rsq_fIID(r, ascii, af, 128, n, buf);
+ buf[n] = '\0';
+ for (pos = 1; pos < n-1; pos++) { /* avoid first, last char, and... */
+ if (esl_rnd_Roll(r, 10) == 0) buf[pos] = ' '; /* ...sprinkle with spaces... */
+ if (esl_rnd_Roll(r, 100) == 0) buf[pos] = '\t'; /* ...and tabs. */
+ }
+ esl_sq_SetDesc(sqarr[i], buf);
+ }
+
+ n = esl_rnd_Roll(r, (maxL+1)); /* choose seqlen = 0..maxL; 0 length seqs occur in real dbs */
+ esl_sq_GrowTo(sqarr[i], n);
+ esl_rsq_xfIID(r, fq, abc->Kp, n, sqarr[i]->dsq);
+
+ esl_sq_SetCoordComplete(sqarr[i], n);
+ }
+
+ *ret_sqarr = sqarr;
+ free(buf);
+ free(fq);
+ return;
+}
+
+/* Write an uglified FASTA file to a stream.
+ * Also, remember where the start of the descline and first
+ * seq line are, in sq->{roff,doff}. We'll compare against
+ * what the input function thinks these locations are.
+ */
+static void
+write_ugly_fasta(ESL_RANDOMNESS *r, FILE *fp, ESL_SQ *sq)
+{
+ char buf[61];
+ int pos;
+
+ sq->roff = ftello(fp);
+ fputc('>', fp);
+ while (esl_rnd_Roll(r, 10) == 0) fputc(' ', fp);
+ fprintf(fp, "%s", sq->name);
+ while (esl_rnd_Roll(r, 10) == 0) fputc(' ', fp);
+ if (sq->desc[0] != 0) fprintf(fp, " %s", sq->desc);
+ fputc('\n', fp);
+
+ sq->doff = ftello(fp);
+ buf[60] = '\0';
+ for (pos = 1; pos <= sq->n; pos+=60)
+ {
+ while (esl_rnd_Roll(r, 10) == 0) fputc(' ', fp);
+ esl_abc_TextizeN(sq->abc, sq->dsq+pos, 60, buf);
+ fputs(buf, fp);
+ fputc('\n', fp);
+ }
+ while (esl_rnd_Roll(r, 10) == 0) fputc('\n', fp);
+ sq->eoff = ftello(fp) - 1;
+}
+
+static void
+write_spaced_fasta(FILE *fp, ESL_SQ *sq)
+{
+ char buf[64];
+ int pos;
+
+ sq->roff = ftello(fp);
+ fprintf(fp, ">%s", sq->name);
+ if (sq->desc[0] != 0) fprintf(fp, " %s", sq->desc);
+ fputc('\n', fp);
+
+ sq->doff = ftello(fp);
+ buf[10] = '\0';
+ for (pos = 1; pos <= sq->n; pos += 10)
+ {
+ esl_abc_TextizeN(sq->abc, sq->dsq+pos, 10, buf);
+ fputs(buf, fp);
+ if (pos+9 >= sq->n || (pos+9) % 60 == 0) fputc('\n', fp);
+ else fputc(' ', fp);
+ }
+ sq->eoff = ftello(fp) - 1;
+}
+
+
+static void
+make_ssi_index(ESL_ALPHABET *abc, const char *tmpfile, int format, char *ssifile, int mode)
+{
+ char *msg = "sqio unit testing: failed to make SSI index";
+ ESL_NEWSSI *ns = NULL;
+ ESL_SQFILE *sqfp = NULL;
+ ESL_SQ *sq = esl_sq_CreateDigital(abc);
+ uint16_t fh = 0;
+ int nseq = 0;
+ int status;
+
+ int bpl, rpl;
+
+ sprintf(ssifile, "%s.ssi", tmpfile);
+ if (esl_newssi_Open(ssifile, TRUE, &ns) != eslOK) esl_fatal(msg);
+ if (esl_newssi_AddFile(ns, tmpfile, format, &fh) != eslOK) esl_fatal(msg);
+ if (esl_sqfile_OpenDigital(abc, tmpfile, format, NULL, &sqfp) != eslOK) esl_fatal(msg);
+ while ((status = esl_sqio_ReadInfo(sqfp, sq)) == eslOK)
+ {
+ nseq++;
+ if (esl_newssi_AddKey(ns, sq->name, fh, sq->roff, sq->doff, sq->L) != eslOK) esl_fatal(msg);
+ if (sq->acc[0] != '\0' && esl_newssi_AddAlias(ns, sq->acc, sq->name) != eslOK) esl_fatal(msg);
+ esl_sq_Reuse(sq);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+
+ bpl = sqfp->data.ascii.bpl;
+ rpl = sqfp->data.ascii.rpl;
+ if (bpl > 0 && rpl > 0)
+ if ((status = esl_newssi_SetSubseq(ns, fh, bpl, rpl)) != eslOK) esl_fatal(msg);
+
+ if (esl_newssi_Write(ns) != eslOK) esl_fatal(msg);
+
+ bpl = sqfp->data.ascii.bpl;
+ rpl = sqfp->data.ascii.rpl;
+
+ switch (mode) {
+ case 0: if (bpl != 0) esl_fatal(msg); break; /* uglified: bpl should be invalid (rpl might not be) */
+ case 1: if (rpl != 60 || bpl == 0) esl_fatal(msg); break; /* spaced: bpl, rpl should be valid */
+ case 2: if (rpl != 60 || bpl != 61) esl_fatal(msg); break; /* normal: bpl, rpl should be valid, w/ bpl=rpl+1 */
+ }
+
+ esl_sqfile_Close(sqfp);
+ esl_newssi_Close(ns);
+ esl_sq_Destroy(sq);
+}
+
+static void
+utest_read(ESL_ALPHABET *abc, ESL_SQ **sqarr, int N, char *seqfile, int format, int mode)
+{
+ char *msg = "sqio complete read unit test failed";
+ ESL_SQ *sq = esl_sq_CreateDigital(abc);
+ ESL_SQFILE *sqfp = NULL;
+ int nseq = 0;
+ int status;
+
+ int bpl, rpl;
+
+ if (esl_sqfile_OpenDigital(abc, seqfile, format, NULL, &sqfp) != eslOK) esl_fatal(msg);
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ /* FASTA doesn't preserve accessions. Copy it, as a hack, so Compare test succeeds*/
+ if (sq->acc[0] == '\0' && esl_sq_SetAccession(sq, sqarr[nseq]->acc) != eslOK) esl_fatal(msg);
+ if (esl_sq_Compare(sq, sqarr[nseq]) != eslOK) esl_fatal(msg);
+ nseq++;
+ esl_sq_Reuse(sq);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+ if (nseq != N) esl_fatal(msg);
+
+ bpl = sqfp->data.ascii.bpl;
+ rpl = sqfp->data.ascii.rpl;
+
+ switch (mode) {
+ case 0: if (bpl != 0) esl_fatal(msg); break; /* uglified: bpl should be invalid (rpl might not be) */
+ case 1: if (rpl != 60 || bpl == 0) esl_fatal(msg); break; /* spaced: bpl, rpl should be valid */
+ case 2: if (rpl != 60 || bpl != 61) esl_fatal(msg); break; /* normal: bpl, rpl should be valid, w/ bpl=rpl+1 */
+ }
+
+ esl_sqfile_Close(sqfp);
+ esl_sq_Destroy(sq);
+}
+
+static void
+utest_read_info(ESL_ALPHABET *abc, ESL_SQ **sqarr, int N, char *seqfile, int format, int mode)
+{
+ char *msg = "sqio info read unit test failed";
+ ESL_SQ *sq = esl_sq_CreateDigital(abc);
+ ESL_SQFILE *sqfp = NULL;
+ int nseq = 0;
+ int status;
+
+ int bpl, rpl;
+
+ if (esl_sqfile_OpenDigital(abc, seqfile, format, NULL, &sqfp) != eslOK) esl_fatal(msg);
+ while ((status = esl_sqio_ReadInfo(sqfp, sq)) == eslOK)
+ {
+ if (strcmp(sq->name, sqarr[nseq]->name) != 0) esl_fatal(msg);
+ if (format != eslSQFILE_FASTA &&
+ strcmp(sq->acc, sqarr[nseq]->acc) != 0) esl_fatal(msg);
+ if (strcmp(sq->desc, sqarr[nseq]->desc) != 0) esl_fatal(msg);
+ if (strcmp(sq->source, sqarr[nseq]->source) != 0) esl_fatal(msg);
+ if (sq->n != 0) esl_fatal(msg);
+ if (sq->start != 0) esl_fatal(msg);
+ if (sq->end != 0) esl_fatal(msg);
+ if (sq->C != 0) esl_fatal(msg);
+ if (sq->W != 0) esl_fatal(msg);
+ if (sq->L != sqarr[nseq]->L) esl_fatal(msg);
+ if (sq->roff != -1 && sqarr[nseq]->roff != -1 && sq->roff != sqarr[nseq]->roff) esl_fatal(msg);
+ if (sq->doff != -1 && sqarr[nseq]->doff != -1 && sq->doff != sqarr[nseq]->doff) esl_fatal(msg);
+
+ nseq++;
+ esl_sq_Reuse(sq);
+ }
+ if (status != eslEOF) esl_fatal(msg);
+ if (nseq != N) esl_fatal(msg);
+
+ bpl = sqfp->data.ascii.bpl;
+ rpl = sqfp->data.ascii.rpl;
+
+ switch (mode) {
+ case 0: if (bpl != 0) esl_fatal(msg); break; /* uglified: bpl should be invalid (rpl might not be) */
+ case 1: if (rpl != 60 || bpl == 0) esl_fatal(msg); break; /* spaced: bpl, rpl should be valid */
+ case 2: if (rpl != 60 || bpl != 61) esl_fatal(msg); break; /* normal: bpl, rpl should be valid, w/ bpl=rpl+1 */
+ }
+
+ esl_sqfile_Close(sqfp);
+ esl_sq_Destroy(sq);
+}
+
+static void
+utest_read_window(ESL_ALPHABET *abc, ESL_SQ **sqarr, int N, char *seqfile, int format, int mode)
+{
+ char *msg = "sqio window read unit test failed";
+ ESL_SQ *sq = esl_sq_CreateDigital(abc);
+ ESL_SQ *rev = esl_sq_CreateDigital(abc);
+ ESL_SQFILE *sqfp = NULL;
+ int nseq = 0;
+ int C = 10;
+ int W = 50;
+ int nres = 0;
+ int wstatus;
+
+ int bpl, rpl, L;
+
+ if (esl_sqfile_OpenDigital(abc, seqfile, format, NULL, &sqfp) != eslOK) esl_fatal(msg);
+ while ((wstatus = esl_sqio_ReadWindow(sqfp, C, W, sq)) == eslOK || wstatus == eslEOD)
+ {
+ if (wstatus == eslEOD) {
+ if (W < 0) {
+ nseq++;
+ nres = 0;
+ W = -W;
+ esl_sq_Reuse(sq);
+ esl_sq_Reuse(rev);
+ } else {
+ /* reverse complement */
+ nres = 0;
+ W = -W;
+ esl_sq_Copy(sqarr[nseq], rev);
+ esl_sq_ReverseComplement(rev);
+ }
+ continue;
+ }
+
+ nres += sq->W;
+ if (strcmp(sq->name, sqarr[nseq]->name) != 0) esl_fatal(msg);
+ if (format != eslSQFILE_FASTA &&
+ strcmp(sq->acc, sqarr[nseq]->acc) != 0) esl_fatal(msg);
+ if (strcmp(sq->desc, sqarr[nseq]->desc) != 0) esl_fatal(msg);
+
+ L = sqfp->data.ascii.L;
+
+ if (W > 0) {
+ /* Forward strand coord checks */
+ if (L != nres) esl_fatal(msg);
+ if (sq->start != nres - sq->n + 1) esl_fatal(msg);
+ if (sq->end != nres) esl_fatal(msg);
+ if (sq->C != 0 && sq->C != C) esl_fatal(msg);
+ if (sq->n != sq->C+sq->W) esl_fatal(msg);
+ if (sq->start+sq->n-1 > sqarr[nseq]->L) esl_fatal(msg);
+ if (wstatus == eslEOD && sq->L != L) esl_fatal(msg);
+ if (memcmp(sq->dsq + 1, sqarr[nseq]->dsq + sq->start, sq->C+sq->W) != 0) esl_fatal(msg);
+ } else {
+ /* Reverse strand coord checks */
+ if (L != -1) esl_fatal(msg);
+ if (sq->start != sq->L - nres + sq->W + sq->C) esl_fatal(msg);
+ if (sq->end != sq->L - nres + 1) esl_fatal(msg);
+ if (sq->C != 0 && sq->C != C) esl_fatal(msg);
+ if (sq->start-sq->n+1 < 1) esl_fatal(msg);
+ if (wstatus == eslEOD && sq->end != 1) esl_fatal(msg);
+ if (memcmp(sq->dsq + 1, rev->dsq + (sq->L - sq->start + 1), sq->C+sq->W) != 0) esl_fatal(msg);
+ }
+ }
+
+ bpl = sqfp->data.ascii.bpl;
+ rpl = sqfp->data.ascii.rpl;
+
+ switch (mode) {
+ case 0: if (bpl != 0) esl_fatal(msg); break; /* uglified: bpl should be invalid (rpl might not be) */
+ case 1: if (rpl != 60 || bpl == 0) esl_fatal(msg); break; /* spaced: bpl, rpl should be valid */
+ case 2: if (rpl != 60 || bpl != 61) esl_fatal(msg); break; /* normal: bpl, rpl should be valid, w/ bpl=rpl+1 */
+ }
+
+ if (wstatus != eslEOF) esl_fatal(msg);
+ if (nseq != N) esl_fatal(msg);
+ esl_sqfile_Close(sqfp);
+ esl_sq_Destroy(rev);
+ esl_sq_Destroy(sq);
+}
+
+static void
+utest_fetch_subseq(ESL_RANDOMNESS *r, ESL_ALPHABET *abc, ESL_SQ **sqarr, int N, char *seqfile, char *ssifile, int format)
+{
+ char *msg = "sqio subseq read unit test failure";
+ ESL_SQ *sq = esl_sq_CreateDigital(abc);
+ ESL_SQFILE *sqfp = NULL;
+ int i;
+ int ntest = 32;
+ char *source;
+ int start;
+ int end;
+
+ if (esl_sqfile_OpenDigital(abc, seqfile, format, NULL, &sqfp) != eslOK) esl_fatal(msg);
+ if (esl_sqfile_OpenSSI(sqfp, ssifile) != eslOK) esl_fatal(msg);
+ while (ntest--)
+ {
+ i = esl_rnd_Roll(r, N);
+ source = sqarr[i]->name;
+
+ do {
+ start = esl_rnd_Roll(r, sqarr[i]->n) + 1;
+ end = esl_rnd_Roll(r, sqarr[i]->n) + 1;
+ } while (start > end);
+
+ if (esl_sqio_FetchSubseq(sqfp, source, start, end, sq) != eslOK) esl_fatal(msg);
+ if (memcmp(&(sqarr[i]->dsq[start]), &sq->dsq[1], end-start+1) != 0) esl_fatal(msg);
+
+ esl_sq_Reuse(sq);
+ }
+
+ esl_sqfile_Close(sqfp);
+ esl_sq_Destroy(sq);
+}
+
+
+/* Write the sequences out to a tmpfile in chosen <format>;
+ * read them back and make sure they're the same.
+ * reposition to beginning, read and check again.
+ *
+ * The sequences in <sqarr> are in digital mode.
+ */
+static void
+utest_write(ESL_ALPHABET *abc, ESL_SQ **sqarr, int N, int format)
+{
+ char *msg = "sqio write unit test failure";
+ char tmpfile[32] = "esltmpXXXXXX";
+ ESL_SQFILE *sqfp = NULL;
+ ESL_SQ *sq = esl_sq_CreateDigital(abc);
+ FILE *fp = NULL;
+ int iterations = 2; /* 2: reposition and read again */
+ int i;
+
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal(msg);
+ for (i = 0; i < N; i++)
+ esl_sqio_Write(fp, sqarr[i], format, FALSE);
+ fclose(fp);
+
+ if (esl_sqfile_OpenDigital(abc, tmpfile, format, NULL, &sqfp) != eslOK) esl_fatal(msg);
+ while (iterations--)
+ {
+ for (i = 0; i < N; i++)
+ {
+ if (esl_sqio_Read(sqfp, sq) != eslOK) esl_fatal(msg);
+ if (strcmp(sqarr[i]->name, sq->name) != 0) esl_fatal(msg);
+ if (sqarr[i]->L != sq->L) esl_fatal(msg);
+ if (memcmp(sqarr[i]->dsq, sq->dsq, sizeof(ESL_DSQ) * (sq->L+2)) != 0) esl_fatal(msg);
+ esl_sq_Reuse(sq);
+ }
+ esl_sqfile_Position(sqfp, 0); /* rewind and make sure we get same reads again */
+ }
+ esl_sqfile_Close(sqfp);
+ esl_sq_Destroy(sq);
+ remove(tmpfile);
+}
+#endif /*eslSQIO_TESTDRIVE*/
+/*------------------ end, unit tests ----------------------------*/
+
+
+
+/*****************************************************************
+ *# 11. Test driver.
+ *****************************************************************/
+
+/* gcc -g -Wall -I. -L. -o sqio_utest -DeslSQIO_TESTDRIVE esl_sqio.c -leasel -lm
+ * ./sqio_utest
+ */
+#ifdef eslSQIO_TESTDRIVE
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_randomseq.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-L", eslARG_INT, "1000", NULL, NULL, NULL, NULL, NULL, "max length of test sequences", 0 },
+ { "-N", eslARG_INT, "100", NULL, NULL, NULL, NULL, NULL, "number of test sequences", 0 },
+ { "-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for sqio module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslDNA); /* DNA because some chars aren't legal in IUPAC DNA */
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ ESL_SQ **sqarr = NULL;
+ int maxL = esl_opt_GetInteger(go, "-L");
+ int N = esl_opt_GetInteger(go, "-N");
+ int i;
+ int mode;
+ char tmpfile[32];
+ char ssifile[32];
+ FILE *fp = NULL;
+ char c;
+
+ /* Create an array of sequences we'll use for all the tests */
+ synthesize_testseqs(r, abc, maxL, N, &sqarr);
+
+ for (mode = 0; mode < 3; mode++) /* 0=ugly 1=spaced 2=normal*/
+ {
+ /* Write FASTA file to disk, and SSI index it */
+ strcpy(tmpfile, "esltmpXXXXXX");
+ if (esl_tmpfile_named(tmpfile, &fp) != eslOK) esl_fatal("failed to make tmpfile");
+ switch (mode) {
+ case 0: for (i = 0; i < N; i++) write_ugly_fasta(r, fp, sqarr[i]); break;
+ case 1: for (i = 0; i < N; i++) write_spaced_fasta(fp, sqarr[i]); break;
+ case 2:
+ for (i = 0; i < N; i++) {
+ c = sqarr[i]->acc[0]; /* hack: hide the accession, so digital writer doesn't write it. */
+ sqarr[i]->acc[0] = '\0';
+ esl_sqio_Write(fp, sqarr[i], eslSQFILE_FASTA, TRUE);
+ sqarr[i]->acc[0] = c;
+ }
+ break;
+ }
+ fclose(fp);
+ make_ssi_index(abc, tmpfile, eslSQFILE_FASTA, ssifile, mode);
+
+ utest_read (abc, sqarr, N, tmpfile, eslSQFILE_FASTA, mode);
+ utest_read_info (abc, sqarr, N, tmpfile, eslSQFILE_FASTA, mode);
+ utest_read_window (abc, sqarr, N, tmpfile, eslSQFILE_FASTA, mode);
+ utest_fetch_subseq(r, abc, sqarr, N, tmpfile, ssifile, eslSQFILE_FASTA);
+
+ remove(tmpfile);
+ remove(ssifile);
+ }
+
+ utest_write(abc, sqarr, N, eslMSAFILE_STOCKHOLM);
+
+ for (i = 0; i < N; i++) esl_sq_Destroy(sqarr[i]);
+ free(sqarr);
+ esl_randomness_Destroy(r);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslSQIO_TESTDRIVE*/
+/*------------------ end, test driver ---------------------------*/
+
+
+
+/*****************************************************************
+ *# 12. Examples
+ *****************************************************************/
+/* The last example in a file is always the most useful example;
+ * so you can M-> to it immediately.
+ * example3 = using esl_sqio_Parse()
+ * example2 = simplest, text mode
+ * example = standard idiom for digital seqfile reading
+ */
+
+
+#ifdef eslSQIO_EXAMPLE3
+/*::cexcerpt::sqio_example_parse::begin::*/
+/* Example of using esl_sqio_Parse() to parse a buffer
+ * cc -g -Wall -I. -L. -o esl_sqio_example3 -DeslSQIO_EXAMPLE3 esl_sqio.c -leasel -lm
+ * ./esl_sqio_example3
+ */
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+int
+main(void)
+{
+ ESL_ALPHABET *abc = NULL;
+ ESL_SQ *sq = NULL;
+ int format = eslSQFILE_FASTA;
+ int alphatype = eslAMINO;
+ int status;
+
+ char *test = ">12345 TEST Test fasta buffer\n"
+ "ARVAPVALPSACAPAGTQCLISGWGNTLSNGVNNPDLLQCVDAPVLSQADCEAAYPGEIT\n"
+ "SSMICVGFLEGGKDSCQGDSGGPVVCNGQLQGIVSWGYGCALPDNPGVYTKVCNFVGWIQ\n"
+ "DTIAAN";
+
+ abc = esl_alphabet_Create(alphatype);
+ sq = esl_sq_CreateDigital(abc);
+
+ status = esl_sqio_Parse(test, strlen(test), sq, format);
+ if (status == eslEFORMAT) esl_fatal("Parse failed, invalid format");
+ else if (status != eslOK) esl_fatal("Unexpected error %d", status);
+
+ esl_sq_Destroy(sq);
+ esl_alphabet_Destroy(abc);
+ return 0;
+}
+/*::cexcerpt::sqio_example_parse::end::*/
+#endif /*eslSQIO_EXAMPLE3*/
+
+
+#ifdef eslSQIO_EXAMPLE2
+/*::cexcerpt::sqio_example_text::begin::*/
+/* cc -g -Wall -I. -L. -o esl_sqio_example2 -DeslSQIO_EXAMPLE2 esl_sqio.c -leasel -lm
+ * ./esl_sqio_example2 <FASTA file>
+ */
+#include "easel.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_SQ *sq = esl_sq_Create();
+ ESL_SQFILE *sqfp;
+ int format = eslSQFILE_FASTA;
+ char *seqfile = argv[1];
+ int status;
+
+ status = esl_sqfile_Open(seqfile, format, NULL, &sqfp);
+ if (status == eslENOTFOUND) esl_fatal("No such file.");
+ else if (status == eslEFORMAT) esl_fatal("Format unrecognized.");
+ else if (status != eslOK) esl_fatal("Open failed, code %d.", status);
+
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ { /* use each sequence for whatever you want */
+ printf("%-40s length: %8ld desclen: %lu\n", sq->name, (long) sq->L, strlen(sq->desc));
+ esl_sq_Reuse(sq);
+ }
+ if (status == eslEFORMAT) esl_fatal("Parse failed\n %s", esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected read error %d", status);
+
+ esl_sq_Destroy(sq);
+ esl_sqfile_Close(sqfp);
+ return 0;
+}
+/*::cexcerpt::sqio_example_text::end::*/
+#endif /*eslSQIO_EXAMPLE2*/
+
+
+
+
+#ifdef eslSQIO_EXAMPLE
+/*::cexcerpt::sqio_example_digital::begin::*/
+/* Example showing standard idiom for opening sequence file, digital mode.
+ * cc -g -Wall -I. -L. -o esl_sqio_example -DeslSQIO_EXAMPLE esl_sqio.c -leasel -lm
+ * ./esl_sqio_example <sequence file>
+ */
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use DNA alphabet", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use RNA alphabet", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use amino alphabet", 0 },
+ { "--informat", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "set input format", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <seqfile>";
+static char banner[] = "example of reading in standard sqio idiom, digital mode";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *seqfile = esl_opt_GetArg(go, 1);
+ ESL_ALPHABET *abc = NULL;
+ ESL_SQ *sq = NULL;
+ ESL_SQFILE *sqfp = NULL;
+ int infmt = eslSQFILE_UNKNOWN;
+ int alphatype = eslUNKNOWN;
+ int status;
+
+ if (esl_opt_IsOn(go, "--informat")) {
+ if ((infmt = esl_sqio_EncodeFormat(esl_opt_GetString(go, "--informat")))==eslSQFILE_UNKNOWN)
+ esl_fatal("%s is not a valid input sequence file format for --informat");
+ }
+
+ status = esl_sqfile_Open(seqfile, infmt, NULL, &sqfp);
+ if (status == eslENOTFOUND) esl_fatal("No such file.");
+ else if (status == eslEFORMAT) esl_fatal("Format couldn't be determined.");
+ else if (status != eslOK) esl_fatal("Open failed, code %d.", status);
+
+ if (esl_opt_GetBoolean(go, "--rna")) alphatype = eslRNA;
+ else if (esl_opt_GetBoolean(go, "--dna")) alphatype = eslDNA;
+ else if (esl_opt_GetBoolean(go, "--amino")) alphatype = eslAMINO;
+ else {
+ status = esl_sqfile_GuessAlphabet(sqfp, &alphatype);
+ if (status == eslENOALPHABET) esl_fatal("Couldn't guess alphabet");
+ else if (status == eslEFORMAT) esl_fatal("Parse failed\n %s",
+ esl_sqfile_GetErrorBuf(sqfp));
+ else if (status == eslENODATA) esl_fatal("Sequence file empty?");
+ else if (status != eslOK) esl_fatal("Unexpected error guessing alphabet");
+ }
+ abc = esl_alphabet_Create(alphatype);
+ sq = esl_sq_CreateDigital(abc);
+ esl_sqfile_SetDigital(sqfp, abc);
+
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ esl_sqio_Write(stdout, sq, eslSQFILE_FASTA, /*update=*/FALSE);
+ esl_sq_Reuse(sq);
+ }
+ if (status == eslEFORMAT) esl_fatal("Parse failed\n %s", esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected error %d in reading", status);
+
+ esl_sqfile_Close(sqfp);
+ esl_sq_Destroy(sq);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+/*::cexcerpt::sqio_example_digital::end::*/
+#endif /*eslSQIO_EXAMPLE*/
+
+
diff --git a/esl_sqio.h b/esl_sqio.h
new file mode 100644
index 0000000..899da98
--- /dev/null
+++ b/esl_sqio.h
@@ -0,0 +1,189 @@
+/* sqio: unaligned sequence file i/o.
+ *
+ * To do:
+ * :: esl_sqio_* vs. esl_sqfile_* prefixing is inconsistent,
+ * for historical reasons. Fix.
+ *
+ * :: Write tests for bad format detection, making sure that
+ * linenumber report is correct.
+ */
+#ifndef eslSQIO_INCLUDED
+#define eslSQIO_INCLUDED
+
+#include <stdio.h>
+
+#include "esl_sqio_ascii.h"
+#ifdef eslAUGMENT_NCBI
+#include "esl_sqio_ncbi.h"
+#endif
+#include "esl_sq.h"
+
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"
+#endif
+#ifdef eslAUGMENT_MSA
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#endif
+
+/*::cexcerpt::sq_sqio_data::begin::*/
+/* ESL_SQDATA:
+ * Data for different sequence formats.
+ */
+typedef union {
+ ESL_SQASCII_DATA ascii;
+#ifdef eslAUGMENT_NCBI
+ ESL_SQNCBI_DATA ncbi;
+#endif
+} ESL_SQDATA;
+/*::cexcerpt::sq_sqio_data::end::*/
+
+/* ESL_SQFILE:
+ * An open sequence file for reading.
+ */
+typedef struct esl_sqio_s {
+ char *filename; /* Name of file (for diagnostics) */
+
+ /* In digital mode, we have an alphabet ptr */
+ int do_digital; /* TRUE if we're reading in digital mode */
+#if defined(eslAUGMENT_ALPHABET)
+ const ESL_ALPHABET *abc;
+#else
+ void *abc;
+#endif
+
+ /* Format-specific configuration */
+ int format; /* Format code of this file */
+ ESL_DSQ inmap[128]; /* an input map, 0..127 */
+
+ /* function pointers to format specific routines */
+ int (*position) (struct esl_sqio_s *sqfp, off_t offset);
+ void (*close) (struct esl_sqio_s *sqfp);
+
+ int (*set_digital) (struct esl_sqio_s *sqfp, const ESL_ALPHABET *abc);
+ int (*guess_alphabet) (struct esl_sqio_s *sqfp, int *ret_type);
+
+ int (*read) (struct esl_sqio_s *sqfp, ESL_SQ *sq);
+ int (*read_info) (struct esl_sqio_s *sqfp, ESL_SQ *sq);
+ int (*read_seq) (struct esl_sqio_s *sqfp, ESL_SQ *sq);
+ int (*read_window) (struct esl_sqio_s *sqfp, int C, int W, ESL_SQ *sq);
+ int (*echo) (struct esl_sqio_s *sqfp, const ESL_SQ *sq, FILE *ofp);
+
+ int (*read_block) (struct esl_sqio_s *sqfp, ESL_SQ_BLOCK *sqBlock, int max_residues, int max_sequences, int long_target);
+
+#ifdef eslAUGMENT_SSI
+ int (*open_ssi) (struct esl_sqio_s *sqfp, const char *ssifile_hint);
+ int (*pos_by_key) (struct esl_sqio_s *sqfp, const char *key);
+ int (*pos_by_number) (struct esl_sqio_s *sqfp, int which);
+
+ int (*fetch) (struct esl_sqio_s *sqfp, const char *key, ESL_SQ *sq);
+ int (*fetch_info) (struct esl_sqio_s *sqfp, const char *key, ESL_SQ *sq);
+ int (*fetch_subseq) (struct esl_sqio_s *sqfp, const char *source, int64_t start, int64_t end, ESL_SQ *sq);
+#endif
+
+ int (*is_rewindable) (const struct esl_sqio_s *sqfp);
+ const char *(*get_error) (const struct esl_sqio_s *sqfp);
+
+ ESL_SQDATA data; /* format specific data */
+} ESL_SQFILE;
+
+#if defined(eslAUGMENT_ALPHABET)
+/* ESL_SQCACHE:
+ * A entire database cached into memory.
+ */
+typedef struct esl_sqcache_s {
+ char *filename; /* Name of file (for diagnostics) */
+ int format; /* Format code of this file */
+
+ const ESL_ALPHABET *abc; /* alphabet for database */
+
+ uint32_t seq_count; /* number of sequences */
+ uint64_t res_count; /* number of residues */
+ uint32_t max_seq; /* longest sequence */
+
+ ESL_SQ *sq_list; /* list of cached sequences [0 .. seq_count-1] */
+
+ void *residue_mem; /* memory holding the residues */
+ void *header_mem; /* memory holding the header strings */
+
+ uint64_t res_size; /* size of residue memory allocation */
+ uint64_t hdr_size; /* size of header memory allocation */
+} ESL_SQCACHE;
+#endif
+
+/*::cexcerpt::sq_sqio_format::begin::*/
+/* Unaligned file format codes
+ * These codes are coordinated with the msa module.
+ * - 0 is an unknown/unassigned format (eslSQFILE_UNKNOWN, eslMSAFILE_UNKNOWN)
+ * - <=100 is reserved for sqio, for unaligned formats
+ * - >100 is reserved for msa, for aligned formats
+ */
+#define eslSQFILE_UNKNOWN 0
+#define eslSQFILE_FASTA 1 // FASTA format
+#define eslSQFILE_EMBL 2 // EMBL DNA sequence
+#define eslSQFILE_GENBANK 3 // Genbank DNA sequence
+#define eslSQFILE_DDBJ 4 // DDBJ (currently identical to GenBank parser)
+#define eslSQFILE_UNIPROT 5 // UniProt (currently identical to EMBL parser)
+#define eslSQFILE_NCBI 6 // NCBI blast db, v4, single file
+#define eslSQFILE_DAEMON 7 // Farrar format, hmmpgmd queries: fasta + // terminator
+#define eslSQFILE_HMMPGMD 8 // Farrar hmmpgmd database format: fasta + # header
+#define eslSQFILE_FMINDEX 9 // Pressed FM-index format used in HMMER
+/*::cexcerpt::sq_sqio_format::end::*/
+
+
+/* eslREADBUFSIZE is the fixed size of a block to bring in at one time,
+ * in character-based (fread()) parsers (like the FASTA parser).
+ */
+#define eslREADBUFSIZE 4096
+
+extern int esl_sqfile_Open(const char *seqfile, int fmt, const char *env, ESL_SQFILE **ret_sqfp);
+extern void esl_sqfile_Close(ESL_SQFILE *sqfp);
+
+#ifdef eslAUGMENT_ALPHABET
+extern int esl_sqfile_OpenDigital(const ESL_ALPHABET *abc, const char *filename, int format, const char *env, ESL_SQFILE **ret_sqfp);
+extern int esl_sqfile_SetDigital(ESL_SQFILE *sqfp, const ESL_ALPHABET *abc);
+extern int esl_sqfile_GuessAlphabet(ESL_SQFILE *sqfp, int *ret_type);
+#endif
+
+extern int esl_sqio_Read (ESL_SQFILE *sqfp, ESL_SQ *sq);
+extern int esl_sqio_ReadInfo (ESL_SQFILE *sqfp, ESL_SQ *sq);
+extern int esl_sqio_ReadWindow (ESL_SQFILE *sqfp, int C, int W, ESL_SQ *sq);
+extern int esl_sqio_ReadSequence(ESL_SQFILE *sqfp, ESL_SQ *sq);
+extern int esl_sqio_ReadBlock (ESL_SQFILE *sqfp, ESL_SQ_BLOCK *sqBlock, int max_residues, int max_sequences, int long_target);
+extern int esl_sqio_Parse (char *buffer, int size, ESL_SQ *s, int format);
+
+extern int esl_sqio_Write (FILE *fp, ESL_SQ *s, int format, int update);
+extern int esl_sqio_Echo (ESL_SQFILE *sqfp, const ESL_SQ *sq, FILE *ofp);
+
+const char *esl_sqfile_GetErrorBuf(const ESL_SQFILE *sqfp);
+extern int esl_sqfile_IsRewindable(const ESL_SQFILE *sqfp);
+extern int esl_sqio_IsAlignment(int fmt);
+extern int esl_sqio_EncodeFormat(char *fmtstring);
+extern char *esl_sqio_DecodeFormat(int fmt);
+extern int esl_sqfile_Position(ESL_SQFILE *sqfp, off_t offset);
+extern int esl_sqio_Ignore(ESL_SQFILE *sqfp, const char *ignoredchars);
+extern int esl_sqio_AcceptAs(ESL_SQFILE *sqfp, char *xchars, char readas);
+
+#ifdef eslAUGMENT_SSI
+extern int esl_sqfile_OpenSSI (ESL_SQFILE *sqfp, const char *ssifile_hint);
+extern int esl_sqfile_PositionByKey (ESL_SQFILE *sqfp, const char *key);
+extern int esl_sqfile_PositionByNumber(ESL_SQFILE *sqfp, int which);
+
+extern int esl_sqio_Fetch (ESL_SQFILE *sqfp, const char *key, ESL_SQ *sq);
+extern int esl_sqio_FetchInfo (ESL_SQFILE *sqfp, const char *key, ESL_SQ *sq);
+extern int esl_sqio_FetchSubseq(ESL_SQFILE *sqfp, const char *source, int64_t start, int64_t end, ESL_SQ *sq);
+#endif
+
+extern int esl_sqfile_Cache(const ESL_ALPHABET *abc, const char *seqfile, int fmt, const char *env, ESL_SQCACHE **ret_sqcache);
+extern void esl_sqfile_Free(ESL_SQCACHE *sqcache);
+
+
+
+
+
+
+
+#endif /*eslSQIO_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_sqio.tex b/esl_sqio.tex
new file mode 100644
index 0000000..d3fb3d3
--- /dev/null
+++ b/esl_sqio.tex
@@ -0,0 +1,281 @@
+The \eslmod{sqio} module handles input from unaligned sequence data
+files, such as FASTA files.
+
+\eslmod{sqio} can automatically recognize and parse several different
+file formats, including FASTA, UniProt, Genbank, DDBJ, and EMBL.
+Additionally, it can read individual unaligned sequences from multiple
+alignment files in several different formats, including Stockholm,
+Clustal, aligned FASTA, PSI-BLAST, and Phylip.\footnote{Sequential
+ input from MSA files requires either the full Easel library or
+ augmentation with \eslmod{msafile}.}
+
+Sequences can be read from normal files, directly from the
+\ccode{stdin} pipe, or from \ccode{gzip}-compressed files.
+
+Sequence files can be automatically looked for in a list of one or
+more database directories, specified by an environment variable (such
+as \ccode{HMMERDB}).
+
+Table~\ref{tbl:sqio_api} lists the functions in the \eslmod{sqio} API.
+The module uses an \ccode{ESL\_SQFILE} object which works much like an
+ANSI C \ccode{FILE}, maintaining information for an open sequence file
+while it's being read.
+
+% API table is auto generated by the Makefile,
+% using autodoc -t esl_sqio.c
+%
+\input{apitables/esl_sqio_api}
+
+
+
+\subsection{Example: reading sequences from a file}
+
+Figure~\ref{fig:sqio_example_text} shows a program that opens a file, reads
+sequences from it one at a time, then closes the file.
+
+\begin{figure}
+\input{cexcerpts/sqio_example_text}
+\caption{Example of reading sequences from a file.}
+\label{fig:sqio_example_text}
+\end{figure}
+
+A FASTA file named \ccode{seqfile} is opened for reading by calling
+\ccode{esl\_sqfile\_Open(filename, format, env, \&sqfp)}, which
+creates a new \ccode{ESL\_SQFILE} and returns it through the
+\ccode{sqfp} pointer. If the \ccode{format} is passed as
+\ccode{eslSQFILE\_UNKNOWN}, then the format of the file is
+autodetected. Here, we bypass autodetection by asserting that the file
+is in FASTA format by passing a \ccode{eslSQFILE\_FASTA} code. (See
+below for a list of valid codes and formats.) The optional \ccode{env}
+argument is described below too; here, we're passing \ccode{NULL} and
+not using it.
+
+Several things can go wrong in trying to open a sequence file that are
+beyond the control of Easel or your application, so it's important
+that you check the return code. \ccode{esl\_sqfile\_Open()} returns
+\ccode{eslENOTFOUND} if the file can't be opened, and
+\ccode{eslEFORMAT} if the file is empty, or if autodetection can't
+determine its format.\footnote{Additionally, internal errors might be
+ thrown, which you should check for if you installed a nonfatal error
+ handler.}
+
+The file is then read one sequence at a time by calling
+\ccode{esl\_sq\_Read(sqfp, sq)}. This function returns \ccode{eslOK}
+if it read a new sequence, and leaves that sequence in the \ccode{sq}
+object that the caller provided. When there is no more data in the
+file, \ccode{esl\_sq\_Read()} returns \ccode{eslEOF}.
+
+If at any point the file does not appear to be in the proper format,
+\ccode{esl\_sq\_Read()} returns \ccode{eslEFORMAT}. The application
+must check for this. The API can provide a little information about
+what went wrong and where. \ccode{sqfp->filename} is the name of the
+file that we were parsing (not necessarily the same as
+\ccode{seqfile}; \ccode{sqfp->filename} can be a full pathname if we
+used an \ccode{env} argument to look for \ccode{seqfile} in installed
+database directories). The function \ccode{esl\_sqfile\_GetErrorBuf()}
+should be called to get a pointer to the generated error message. The
+buffer is a brief explanatory message that gets filled in when a
+\ccode{eslEFORMAT} error occurs.
+ \footnote{Unlike in the MSA module, you don't get access to the
+ current line text; some of sqio's parsers use fast block-based
+ (\ccode{fread()}) input instead of line-based input.}
+
+We can reuse the same \ccode{ESL\_SQ} object for subsequent sequences
+by calling \ccode{esl\_sq\_Reuse()} on it when we're done with the
+previous sequence. If we wanted to load a set of sequences, we'd
+\ccode{\_Create()} an array of \ccode{ESL\_SQ} objects.
+
+Finally, to clean up properly, a \ccode{ESL\_SQ} that was created is
+destroyed with \ccode{esl\_sq\_Destroy(sq)}, and a \ccode{ESL\_SQFILE}
+is closed with \ccode{esl\_sqfile\_Close()}.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Digital sequence input mode}
+
+Most Easel-based programs manipulate sequences in Easel's digital
+sequence format, using \eslmod{alphabet}, as opposed to manipulating
+them as plaintext. The \eslmod{sqio} reader can be used either in text
+mode or digital mode. In text mode, you get the \ccode{sq->seq} field
+of the \ccode{ESL\_SQ}; in digital mode, you get \ccode{sq->dsq}.
+
+To use digital mode, both the \ccode{ESL\_SQFILE} reader and the
+\ccode{ESL\_SQ} sequence object must be set to digital mode. The
+reader, because it has an input map that maps plaintext input
+characters to internal residue codes (plaintext or digital), or
+errors. The sequence object, because it needs to have either its
+\ccode{seq} or \ccode{dsq} field allocated. Both also carry a copy of
+the pointer to the alphabet.
+
+Figure~\ref{fig:sqio_example_digital} shows an example of the standard
+idiom for opening files in digital mode, autoguessing their format and
+alphabet by default, and allowing format and alphabet to be specified
+on the command line.
+
+\begin{figure}
+\input{cexcerpts/sqio_example_digital}
+\caption{Standard idiom for reading sequences in digital mode.}
+\label{fig:sqio_example_digital}
+\end{figure}
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Accepted formats}
+
+Accepted unaligned sequence file formats (and their Easel format
+codes) include:
+
+\begin{tabular}{lll}
+\textbf{name} & \textbf{code} & \textbf{description} \\
+fasta & \ccode{eslSQFILE\_FASTA} & FASTA format \\
+embl & \ccode{eslSQFILE\_EMBL} & EMBL DNA database format \\
+genbank & \ccode{eslSQFILE\_GENBANK} & GenBank DNA database format \\
+ddbj & \ccode{eslSQFILE\_DDBJ} & DDBJ DNA database format \\
+uniprot & \ccode{eslSQFILE\_UNIPROT} & UniProt protein database format \\
+\end{tabular}
+
+The above names, case-insensitive, are what a user uses to specify a
+format on a command line: i.e.\ \ccode{--informat fasta} or
+\ccode{--informat FASTA}.
+
+The codes are what you use as a developer to specify a format to an
+Easel function call.
+
+Additionally, there is a code \ccode{eslSQFILE\_UNKNOWN}. It
+tells \ccode{esl\_sqfile\_Open()} to perform format
+autodetection.\footnote{There are some other formats as well, which we
+ don't advertise because they're less well supported.}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Reading from stdin and compressed files}
+
+There are two special cases for input files.
+
+The module can read sequence input from a stdin pipe. If the
+\ccode{seqfile} argument is ``-'', \ccode{esl\_sqfile\_Open()} ``opens''
+standard input (really, it just associates \ccode{stdin}, which is
+always open, with the \ccode{ESL\_SQFILE}).
+
+The module can read compressed sequence files. If the \ccode{seqfile}
+argument to \ccode{esl\_sqfile\_Open()} ends in \ccode{.gz}, the file
+is assumed to be compressed with \ccode{gzip}; instead of opening it
+normally, \ccode{esl\_sqfile\_Open()} opens it as a pipe from
+\ccode{gzip -dc}. Your system must support pipes to use
+this.\footnote{Specifically, it must support the \ccode{popen()}
+ system call (POSIX.2 compliant operating systems do). The
+ \ccode{configure} script automatically checks this at compile-time
+ and defines \ccode{HAVE\_POPEN} appropriately.} Obviously, the user
+must also have \ccode{gzip} installed and in his PATH.
+
+For both special cases, the catch is that you can't use format
+autodetection; you must provide a valid known format code when you
+read from stdin or from a compressed file. Pipes are not rewindable,
+and format autodetection currently relies on a two-pass algorithm: it
+reads partway into the file to determine the format, then rewinds to
+start parsing for real.\footnote{The \eslmod{msafile} module is more
+ advanced. Its parsers are based on the newer \eslmod{buffer} module
+ which provides rewindable input buffers even for stdin and pipes.}
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% SRE: commented NCBI section out.
+%% I don't believe that it works, or that it's up to date.
+%% Needs testing.
+
+%% \subsection{NCBI BLAST database support}
+
+%% If sqio is augmented with the ncbi module, then the sqio API gains the
+%% ability to read NCBI BLAST database formats in addition to ASCII file
+%% formats. The sqio API remains exactly the same (the caller doesn't
+%% have to use any msa module functions).
+
+%% To open a BLAST database, the format must be supplied. If a format
+%% of \ccode{eslSQFILE\_UNKNOWN} is specified, only ASCII based format,
+%% i.e. FASTA, GENBANK, etc. will be opened.
+
+%% When opening a BLAST database, the file name should not include any
+%% extensions. If the \ccode{ESL\_ALPHABET} is not specified, Easel
+%% will first try to open a protein database, followed by a DNA database
+%% and finally a multi-volume database. The handling of a multi-volume
+%% database is done through the alias file. The only directive in
+%% the alias file is the DBLIST line, listing all the database volumes.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Adding a sequence parser}
+
+New parsers for new formats can be plugged into \eslmod{sqio} without
+any API changes. Existing Easel-based programs don't need code changes
+to use the new parser.
+
+A new parser will need a format type, a structure for parser specific
+data, API functions and a hook into the \ccode{sqfile\_open} function.
+
+The list of formats are defined in \ccode{esl\_sqio.h}. A new
+\ccode{\#define} will be added to the existing formats:
+
+\input{cexcerpts/sq_sqio_format}
+
+A data structure for parser specific data will need to be added
+to \ccode{ESL\_SQDATA}. This structure is a union of the
+different parser specific data structures. If possible the
+addition of the parser structure should be augmented so its
+inclusion can be controlled.
+
+\input{cexcerpts/sq_sqio_data}
+
+Finally, a set of parser specific function pointers need to be
+defined. The functions in \ccode{esl\_sqio.c} in turn call these
+function pointers. The \ccode{esl\_sqfile\_Open} function initializes
+the function pointers to NULL, so if they are not set, an exception
+will occur when the function is called. At a minimum, the function
+should be defined to return an \ccode{eslEUNIMPLEMENTED}. Below is a
+map the the function pointers to their respective function.
+
+\begin{tabular}{ll} \\
+Function pointer & \eslmod{sqio} function \\ \hline
+position & esl\_sqfile\_Position \\
+close & esl\_sqfile\_Close \\
+set\_digital & esl\_sqfile\_SetDigital \\
+guess\_alphabet & esl\_sqfile\_GuessAlphabet \\
+read & esl\_sqio\_Read \\
+read\_info & esl\_sqio\_ReadInfo \\
+read\_seq & esl\_sqio\_ReadSequence \\
+read\_window & esl\_sqio\_ReadWindow \\
+echo & esl\_sqio\_Echo \\
+read\_block & esl\_sqio\_ReadBlock \\
+open\_ssi & esl\_sqfile\_OpenSSI \\
+pos\_by\_key & esl\_sqfile\_PositionByKey \\
+pos\_by\_number & esl\_sqfile\_PositionByNumber \\
+fetch & esl\_sqio\_Fetch \\
+fetch\_info & esl\_sqio\_FetchInfo \\
+fetch\_subseq & esl\_sqio\_FetchSubseq \\
+is\_rewindable & esl\_sqfile\_IsRewindable \\
+get\_error & esl\_sqfile\_GetErrorBuf \\
+\end{tabular}
+
+\bigskip
+A hook needs to be added to the function \ccode{sqfile\_open}.
+This hook will try to open the specified file. If successful,
+the \ccode{ESL\_SQFILE} structure should be filled in with function
+pointers and the parser specific data and the open hook
+return \ccode{eslOK}. If the sequence files were not found for
+the specific parser, an \ccode{eslENOTFOUND} is returned and
+the next parser tries to open the file. Below is an example
+of code that tries to open an NCBI BLAST database if not
+successful, then the ASCII sequence parsers try to open the
+file.
+
+\begin{cchunk}
+#ifdef eslAUGMENT\_NCBI
+ if (format == eslSQFILE\_NCBI && status == eslENOTFOUND)
+ status = esl\_sqncbi\_Open(sqfp->filename, sqfp->format, sqfp);
+#endif
+ if (status == eslENOTFOUND)
+ status = esl\_sqascii\_Open(sqfp->filename, sqfp->format, sqfp);
+\end{cchunk}
diff --git a/esl_sqio_ascii.c b/esl_sqio_ascii.c
new file mode 100644
index 0000000..15b70ac
--- /dev/null
+++ b/esl_sqio_ascii.c
@@ -0,0 +1,3411 @@
+/* Unaligned ascii sequence file i/o.
+ *
+ * Contents:
+ * 1. An <ESL_SQFILE> object, in text mode.
+ * 2. An <ESL_SQFILE> object, in digital mode. [with <alphabet>]
+ * 3. Miscellaneous routines.
+ * 4. Sequence reading (sequential).
+ * 5. Sequence/subsequence fetching, random access [with <ssi>]
+ * 6. Internal routines shared by parsers.
+ * 7. Internal routines for EMBL format (including UniProt, TrEMBL)
+ * 8. Internal routines for GenBank format
+ * 9. Internal routines for FASTA format
+ * 10. Internal routines for DAEMON format
+ * 11. Internal routines for HMMPGMD format
+ * 12. Copyright and license.
+ *
+ * This module shares remote evolutionary homology with Don Gilbert's
+ * seminal, public domain ReadSeq package, though the last common
+ * ancestor was circa 1991 and no recognizable vestiges are likely to
+ * remain. Thanks Don!
+ *
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h"/* alphabet aug adds digital sequences */
+#endif
+#ifdef eslAUGMENT_MSA
+#include "esl_msa.h"/* msa aug adds ability to read MSAs as unaligned seqs */
+#include "esl_msafile.h"
+#endif
+#ifdef eslAUGMENT_SSI
+#include "esl_ssi.h"/* ssi aug adds ability to randomly access sequences/subsequences */
+#endif
+#include "esl_sqio.h"
+#include "esl_sq.h"
+
+/* format specific routines */
+static int sqascii_GuessFileFormat(ESL_SQFILE *sqfp, int *ret_fmt);
+static int sqascii_Position (ESL_SQFILE *sqfp, off_t offset);
+static void sqascii_Close (ESL_SQFILE *sqfp);
+static int sqascii_SetDigital (ESL_SQFILE *sqfp, const ESL_ALPHABET *abc);
+static int sqascii_GuessAlphabet (ESL_SQFILE *sqfp, int *ret_type);
+static int sqascii_Read (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int sqascii_ReadInfo (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int sqascii_ReadSequence (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int sqascii_ReadWindow (ESL_SQFILE *sqfp, int C, int W, ESL_SQ *sq);
+static int sqascii_ReadBlock (ESL_SQFILE *sqfp, ESL_SQ_BLOCK *sqBlock, int max_residues, int max_sequences, int long_target);
+static int sqascii_Echo (ESL_SQFILE *sqfp, const ESL_SQ *sq, FILE *ofp);
+
+static int sqascii_IsRewindable (const ESL_SQFILE *sqfp);
+static const char *sqascii_GetError (const ESL_SQFILE *sqfp);
+
+#ifdef eslAUGMENT_SSI
+static int sqascii_OpenSSI (ESL_SQFILE *sqfp, const char *ssifile_hint);
+static int sqascii_PositionByKey (ESL_SQFILE *sqfp, const char *key);
+static int sqascii_PositionByNumber(ESL_SQFILE *sqfp, int which);
+static int sqascii_Fetch (ESL_SQFILE *sqfp, const char *key, ESL_SQ *sq);
+static int sqascii_FetchInfo (ESL_SQFILE *sqfp, const char *key, ESL_SQ *sq);
+static int sqascii_FetchSubseq (ESL_SQFILE *sqfp, const char *source, int64_t start, int64_t end, ESL_SQ *sq);
+#endif /*eslAUGMENT_SSI*/
+
+/* Internal routines shared by parsers. */
+static int loadmem (ESL_SQFILE *sqfp);
+static int loadbuf (ESL_SQFILE *sqfp);
+static int nextchar (ESL_SQFILE *sqfp, char *ret_c);
+static int seebuf (ESL_SQFILE *sqfp, int64_t maxn, int64_t *opt_nres, int64_t *opt_endpos);
+static void addbuf (ESL_SQFILE *sqfp, ESL_SQ *sq, int64_t nres);
+static void skipbuf (ESL_SQFILE *sqfp, int64_t nskip);
+static int read_nres(ESL_SQFILE *sqfp, ESL_SQ *sq, int64_t nskip, int64_t nres, int64_t *opt_actual_nres);
+static int skip_whitespace(ESL_SQFILE *sqfp);
+
+/* EMBL format; also UniProt, TrEMBL */
+static void config_embl(ESL_SQFILE *sqfp);
+static void inmap_embl (ESL_SQFILE *sqfp, const ESL_DSQ *abc_inmap);
+static int header_embl(ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int skip_embl (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int end_embl (ESL_SQFILE *sqfp, ESL_SQ *sq);
+
+/* GenBank format; also DDBJ */
+static void config_genbank(ESL_SQFILE *sqfp);
+static void inmap_genbank (ESL_SQFILE *sqfp, const ESL_DSQ *abc_inmap);
+static int header_genbank(ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int skip_genbank (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int end_genbank (ESL_SQFILE *sqfp, ESL_SQ *sq);
+
+/* FASTA format */
+static void config_fasta(ESL_SQFILE *sqfp);
+static void inmap_fasta (ESL_SQFILE *sqfp, const ESL_DSQ *abc_inmap);
+static int header_fasta(ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int skip_fasta (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int end_fasta (ESL_SQFILE *sqfp, ESL_SQ *sq);
+
+/* DAEMON format */
+static void config_daemon(ESL_SQFILE *sqfp);
+static void inmap_daemon (ESL_SQFILE *sqfp, const ESL_DSQ *abc_inmap);
+static int end_daemon (ESL_SQFILE *sqfp, ESL_SQ *sq);
+
+/* HMMPGMD format */
+static int fileheader_hmmpgmd(ESL_SQFILE *sqfp);
+
+
+/*****************************************************************
+ *# 1. An <ESL_SQFILE> object, in text mode.
+ *****************************************************************/
+
+/* Function: esl_sqascii_Open()
+ * Synopsis: Open a sequence file for reading.
+ *
+ * Purpose: Open a sequence file <filename> for reading.
+ * The opened <ESL_SQFILE> is returned through <ret_sqfp>.
+ *
+ * The format of the file is asserted to be <format> (for
+ * example, <eslSQFILE_FASTA>). If <format> is
+ * <eslSQFILE_UNKNOWN> then the routine attempts to
+ * autodetect the file format.
+ *
+ * There are two special cases for <filename>. If
+ * <filename> is "-", the sequence data are read from a
+ * <STDIN> pipe. If <filename> ends in ".gz", the file is
+ * assumed to be compressed with <gzip>, and it is opened
+ * by a pipe from <gzip -dc>. Reading gzip files only works
+ * on POSIX-compliant systems that have pipes
+ * (specifically, the POSIX.2 popen() call).
+ *
+ * Returns: <eslOK> on success, and <*ret_sqfp> points to a new
+ * open <ESL_SQFILE>. Caller deallocates this object with
+ * <esl_sqfile_Close()>.
+ *
+ * Returns <eslENOTFOUND> if <filename> can't be found or
+ * opened. Returns <eslEFORMAT> if the file is empty, or
+ * if autodetection is attempted and the format can't be
+ * determined. On any error condition, <*ret_sqfp> is
+ * returned NULL.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_sqascii_Open(char *filename, int format, ESL_SQFILE *sqfp)
+{
+ int status;/* return status from an ESL call */
+ int n;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ /* before we go any further, make sure we can handle the format */
+ if (format == eslSQFILE_NCBI) return eslENOTFOUND;
+
+ /* Default initializations */
+ ascii->fp = NULL;
+ ascii->do_gzip = FALSE;
+ ascii->do_stdin = FALSE;
+ ascii->do_buffer = FALSE;
+
+ ascii->mem = NULL;
+ ascii->allocm = 0;
+ ascii->mn = 0;
+ ascii->mpos = 0;
+ ascii->moff = -1;
+ ascii->is_recording = FALSE;
+
+ ascii->buf = NULL;
+ ascii->boff = 0;
+ ascii->balloc = 0;
+ ascii->nc = 0;
+ ascii->bpos = 0;
+ ascii->L = 0;
+ ascii->linenumber = 1;
+
+ ascii->bookmark_offset = 0;
+ ascii->bookmark_linenum = 0;
+
+ ascii->is_linebased = FALSE;
+ ascii->eof_is_ok = FALSE;
+ ascii->parse_header = NULL;
+ ascii->skip_header = NULL;
+ ascii->parse_end = NULL;
+
+ ascii->afp = NULL;
+ ascii->msa = NULL;
+ ascii->idx = -1;
+
+ ascii->ssifile = NULL;
+ ascii->rpl = -1; /* -1 = not set yet */
+ ascii->bpl = -1; /* (ditto) */
+ ascii->prvrpl = -1; /* (ditto) */
+ ascii->prvbpl = -1; /* (ditto) */
+ ascii->currpl = -1;
+ ascii->curbpl = -1;
+ ascii->ssi = NULL;
+
+ /* MSA formats are handled entirely by msafile module -
+ * let it handle stdin, .gz, etc
+ */
+ if (! esl_sqio_IsAlignment(format))
+ {
+ if (strcmp(filename, "-") == 0) /* stdin special case */
+ {
+ ascii->fp = stdin;
+ ascii->do_stdin = TRUE;
+ }
+ else
+ { /* Check the current working directory first. */
+ if ((ascii->fp = fopen(filename, "r")) == NULL) {
+ status = eslENOTFOUND;
+ goto ERROR;
+ }
+ }
+
+ /* Deal with the .gz special case: to popen(), "success" only means
+ * it found and executed gzip -dc. If gzip -dc doesn't find our
+ * file, popen() still blithely returns success, so we have to be
+ * sure the file exists. That's why we fopen()'ed it above, only to
+ * close it and popen() it here.
+ */
+#ifdef HAVE_POPEN
+ n = strlen(filename);
+ if (n > 3 && strcmp(filename+n-3, ".gz") == 0)
+ {
+ char *cmd;
+ fclose(ascii->fp);
+ ESL_ALLOC(cmd, sizeof(char) * (n+1+strlen("gzip -dc ")));
+ sprintf(cmd, "gzip -dc %s", filename);
+ ascii->fp = popen(cmd, "r");
+ if (ascii->fp == NULL) { status = eslENOTFOUND; goto ERROR; }
+ ascii->do_gzip = TRUE;
+ free(cmd);
+ }
+#endif /*HAVE_POPEN*/
+
+ /* If we don't know the format yet, try to autodetect it now. */
+ if (format == eslSQFILE_UNKNOWN)
+ {
+ status = sqascii_GuessFileFormat(sqfp, &format);
+ if (status == eslOK) sqfp->format = format;
+ else if (status != eslEFORMAT) goto ERROR; /* <format> might still be eslSQFILE_UNKNOWN, for MSA files */
+ }
+
+ /* If the format is still unknown, it may be an MSA file. The
+ * msafile module is capable of autodetecting format even in a .gz
+ * or stdin pipe, but the stuff above has already read from these
+ * nonrewindable sources, trying to guess an unaligned format. We
+ * could open a second .gz pipe, but that's ugly; and in any case,
+ * we can't rewind stdin. Eventually, this will get resolved, by
+ * having sqio open an ESL_BUFFER, then doing an
+ * esl_msafile_OpenBuffer() if we need to hand control to the
+ * msafile module. For now, sqio is already documented to be
+ * unable to autodetect MSA file formats in stdin or .gz pipes,
+ * so leave it that way.
+ */
+ if (format == eslSQFILE_UNKNOWN && (ascii->do_gzip || ascii->do_stdin))
+ { status = eslEFORMAT; goto ERROR; }
+ }
+
+ /* If format is definitely an MSA, open it through the msafile interface.
+ * Or, if format is still unknown, try to open the file as an MSA file,
+ * using msafile autodetection.
+ */
+#ifdef eslAUGMENT_MSA
+ if (format == eslSQFILE_UNKNOWN || esl_sqio_IsAlignment(format))
+ {
+ status = esl_msafile_Open(NULL, filename, NULL, format, NULL, &(ascii->afp));
+ if (status != eslOK) { status = eslEFORMAT; goto ERROR; } /* This was our last attempt. Failure to open == failure to detect format */
+ sqfp->format = format = ascii->afp->format;
+ }
+#endif
+ if (format == eslSQFILE_UNKNOWN) { status = eslEFORMAT; goto ERROR; }
+
+
+ /* Configure the <sqfp>'s parser and inmaps for this format. */
+ if (!esl_sqio_IsAlignment(format))
+ {
+ switch (format) {
+ case eslSQFILE_EMBL: config_embl(sqfp); inmap_embl(sqfp, NULL); break;
+ case eslSQFILE_UNIPROT: config_embl(sqfp); inmap_embl(sqfp, NULL); break;
+ case eslSQFILE_GENBANK: config_genbank(sqfp); inmap_genbank(sqfp, NULL); break;
+ case eslSQFILE_DDBJ: config_genbank(sqfp); inmap_genbank(sqfp, NULL); break;
+ case eslSQFILE_FASTA: config_fasta(sqfp); inmap_fasta(sqfp, NULL); break;
+ case eslSQFILE_DAEMON: config_daemon(sqfp); inmap_daemon(sqfp, NULL); break;
+ case eslSQFILE_HMMPGMD: config_fasta(sqfp); inmap_fasta(sqfp, NULL); break;
+ default:status = eslEFORMAT; goto ERROR;
+ }
+
+ /* Preload the first line or chunk of file. */
+ status = loadbuf(sqfp);
+ if (status == eslEOF) { status = eslEFORMAT; goto ERROR; }
+ else if (status != eslOK) { goto ERROR; }
+
+ /* hmmpgmd is a special case: we need to skip first line before parsing it.
+ * generalize that a little: this could be a section for parsing a file header,
+ * and leaving the buf positioned at the first char of the first record
+ * (just as expected if there's no file header)
+ */
+ switch (format) {
+ case eslSQFILE_HMMPGMD: status = fileheader_hmmpgmd(sqfp); break;
+ default: status = eslOK; break;
+ }
+ if (status != eslOK) goto ERROR;
+ }
+ else
+ {
+ ascii->is_linebased = TRUE;
+ ascii->eof_is_ok = FALSE; /* no-op for msa's */
+ ascii->parse_header = NULL; /* no-op for msa's */
+ ascii->skip_header = NULL; /* no-op for msa's */
+ ascii->parse_end = NULL; /* no-op for msa's */
+ }
+
+ /* initialize the function pointers for the ascii routines */
+ sqfp->position = &sqascii_Position;
+ sqfp->close = &sqascii_Close;
+
+ sqfp->set_digital = &sqascii_SetDigital;
+ sqfp->guess_alphabet = &sqascii_GuessAlphabet;
+
+ sqfp->is_rewindable = &sqascii_IsRewindable;
+
+ sqfp->read = &sqascii_Read;
+ sqfp->read_info = &sqascii_ReadInfo;
+ sqfp->read_seq = &sqascii_ReadSequence;
+ sqfp->read_window = &sqascii_ReadWindow;
+ sqfp->echo = &sqascii_Echo;
+
+ sqfp->read_block = &sqascii_ReadBlock;
+
+#ifdef eslAUGMENT_SSI
+ sqfp->open_ssi = &sqascii_OpenSSI;
+ sqfp->pos_by_key = &sqascii_PositionByKey;
+ sqfp->pos_by_number = &sqascii_PositionByNumber;
+
+ sqfp->fetch = &sqascii_Fetch;
+ sqfp->fetch_info = &sqascii_FetchInfo;
+ sqfp->fetch_subseq = &sqascii_FetchSubseq;
+#endif
+
+ sqfp->get_error = &sqascii_GetError;
+
+ return eslOK;
+
+ ERROR:
+ sqascii_Close(sqfp);
+ return status;
+}
+
+
+/* Function: sqascii_GuessFileFormat()
+ * Synopsis: Guess the format of an open <ESL_SQFILE>.
+ *
+ * Purpose: Try to guess the sequence file format of <sqfp>, and
+ * return the format code in <*ret_fmt>.
+ *
+ * First we attempt to guess based on the <filename>'s
+ * suffix. <*.fa> is assumed to be in FASTA format; <*.gb>
+ * is assumed to be in GenBank format.
+ *
+ * If that fails, we attempt to guess based on peeking at
+ * the first nonblank line of <filename>. If the line
+ * starts with $>$, we assume FASTA format; if the line
+ * starts with <ID>, we assume EMBL format; if the line
+ * starts with <LOCUS> or it contains the string <Genetic
+ * Sequence Data Bank> we assume GenBank format.
+ *
+ * If that fails too, return an <eslEFORMAT> error, and
+ * <*ret_fmt> is set to <eslSQFILE_UNKNOWN>.
+ *
+ * Returns: <eslOK> on success, and <*ret_fmt> contains
+ * a valid sequence file format code, such as
+ * <eslSQFILE_FASTA>.
+ *
+ * Returns <eslEFORMAT> if we opened <filename> but it
+ * contains no nonblank lines, or if we peeked at the first
+ * nonblank line and still couldn't guess the format;
+ * <*ret_fmt> is then <eslSQFILE_UNKNOWN>.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+static int
+sqascii_GuessFileFormat(ESL_SQFILE *sqfp, int *ret_fmt)
+{
+ int n = strlen(sqfp->filename);
+ const char *sfx = NULL;
+ int is_gzip = FALSE;
+ int nsfx;
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ /* On any premature exit, *ret_fmt is eslSQFILE_UNKNOWN */
+ *ret_fmt = eslSQFILE_UNKNOWN;
+
+ /* Is <filename> gzip'ed? Look at suffix. */
+ if (n > 3 && strcmp(sqfp->filename+n-3, ".gz") == 0) is_gzip = TRUE;
+
+ /* Locate the suffix that might indicate format (ignore .gz) */
+ for (nsfx = 1, sfx = sqfp->filename + n - 1 - (is_gzip ? 3 : 0);
+ sfx != sqfp->filename && *sfx != '.';
+ sfx--)
+ nsfx++;
+
+ /* now sfx points either to filename (we didn't find a suffix) or to the . of the suffix,
+ * and nsfx is the suffix length inclusive of the .
+ */
+
+ /* Attempt to guess file format based on file name suffix. */
+ if (strncmp(sfx, ".fa", 3) == 0) { *ret_fmt = eslSQFILE_FASTA; return eslOK; }
+ else if (strncmp(sfx, ".gb", 3) == 0) { *ret_fmt = eslSQFILE_GENBANK; return eslOK; }
+
+ /* If that didn't work, we'll have a peek at the stream;
+ * turn recording on, and set for line based input.
+ */
+ if (ascii->is_recording == -1) ESL_EXCEPTION(eslEINVAL, "sq file already too advanced");
+ ascii->is_recording = TRUE;
+ ascii->is_linebased = TRUE;
+ loadbuf(sqfp);/* now ascii->buf is a line of the file */
+
+ /* get first nonblank line */
+ while (esl_str_IsBlank(ascii->buf)) {
+ status = loadbuf(sqfp);
+ if (status == eslEOF) ESL_XFAIL(eslEFORMAT, ascii->errbuf, "No data found in file");
+ else if (status != eslOK) goto ERROR;
+ }
+
+ /* formats that can be determined from the first line: */
+ if (*(ascii->buf) == '>') *ret_fmt = eslSQFILE_FASTA;
+ else if (strncmp(ascii->buf, "ID ", 5) == 0) *ret_fmt = eslSQFILE_EMBL;
+ else if (strncmp(ascii->buf, "LOCUS ", 8) == 0) *ret_fmt = eslSQFILE_GENBANK;
+ else if (strstr(ascii->buf, "Genetic Sequence Data Bank") != NULL) *ret_fmt = eslSQFILE_GENBANK;
+
+ /* reset the sqfp */
+ ascii->mpos = 0;
+ ascii->is_recording = FALSE;
+ ascii->is_linebased = FALSE;
+ free(ascii->buf);
+ ascii->buf = NULL;
+ ascii->balloc = 0;
+ return (*ret_fmt == eslSQFILE_UNKNOWN) ? eslEFORMAT : eslOK;
+
+ ERROR:
+ ascii->mpos = 0;
+ ascii->is_recording = FALSE;
+ ascii->is_linebased = FALSE;
+ if (ascii->buf != NULL) { free(ascii->buf); ascii->balloc = 0; }
+ return status;
+}
+
+/* Function: sqascii_Position()
+ * Synopsis: Reposition an open sequence file to an offset.
+ *
+ * Purpose: Reposition an open <sqfp> to offset <offset>.
+ * <offset> would usually be the first byte of a
+ * desired sequence record.
+ *
+ * Only normal sequence files can be positioned to a
+ * nonzero offset. If <sqfp> corresponds to a standard
+ * input stream or gzip -dc stream, it may not be
+ * repositioned. If <sqfp> corresponds to a multiple
+ * sequence alignment file, the only legal <offset>
+ * is 0, to rewind the file to the beginning and
+ * be able to read the entire thing again.
+ *
+ * After <esl_sqfile_Position()> is called on a nonzero
+ * <offset>, <sqfp->linenumber> and other bookkeeping
+ * information is unknown. If caller knows it, it should
+ * set it explicitly.
+ *
+ * See the SSI module for manipulating offsets and indices.
+ *
+ * Returns: <eslOK> on success;
+ * <eslEOF> if no data can be read from this position.
+ *
+ * Throws: <eslESYS> if the fseeko() or fread() call fails.
+ * <eslEMEM> on (re-)allocation failure.
+ * <eslEINVAL> if the <sqfp> is not positionable.
+ * <eslENOTFOUND> if in trying to rewind an alignment file
+ * by closing and reopening it, the open fails.
+ * On errors, the state of <sqfp> is indeterminate, and
+ * it should not be used again.
+ */
+static int
+sqascii_Position(ESL_SQFILE *sqfp, off_t offset)
+{
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->do_stdin) ESL_EXCEPTION(eslEINVAL, "can't Position() in standard input");
+ if (ascii->do_gzip) ESL_EXCEPTION(eslEINVAL, "can't Position() in a gzipped file");
+ if (offset < 0) ESL_EXCEPTION(eslEINVAL, "bad offset");
+ if (offset > 0 && ascii->afp != NULL) ESL_EXCEPTION(eslEINVAL, "can't use esl_sqfile_Position() w/ nonzero offset on MSA file");
+
+ if (esl_sqio_IsAlignment(sqfp->format))
+ {/* msa file: close and reopen. maybe sometime we'll have esl_msafile_Rewind() */
+ /* we have already verified that offset==0 for MSA file */
+ esl_msafile_Close(ascii->afp);
+ if (ascii->msa != NULL) esl_msa_Destroy(ascii->msa);
+ ascii->afp = NULL;
+ ascii->msa = NULL;
+ ascii->idx = 0;
+
+ /* we know we successfully opened it the first time, so a
+ failure to reopen is an exception, not a user-reportable
+ normal error. ENOTFOUND is the only normal error;
+ EFORMAT error can't occur because we know the format and
+ don't use autodetection.
+ */
+ status = esl_msafile_Open(NULL, sqfp->filename, NULL, sqfp->format, NULL, &(ascii->afp));
+ if (status == eslENOTFOUND) ESL_EXCEPTION(eslENOTFOUND, "failed to reopen alignment file");
+ else if (status != eslOK) return status;
+ }
+ else/* normal case: unaligned sequence file */
+ {
+ if (fseeko(ascii->fp, offset, SEEK_SET) != 0) ESL_EXCEPTION(eslESYS, "fseeko() failed");
+
+ ascii->currpl = -1;
+ ascii->curbpl = -1;
+ ascii->prvrpl = -1;
+ ascii->prvbpl = -1;
+ ascii->linenumber = (offset == 0) ? 1 : -1; /* -1 is "unknown" */
+ ascii->L = -1;
+ ascii->mpos = ascii->mn;/* this forces loadbuf to load new data */
+ if ((status = loadbuf(sqfp)) != eslOK) return status;
+ }
+ return eslOK;
+}
+
+
+
+/* Function: sqascii_Close()
+ * Synopsis: Close a sequence file.
+ *
+ * Purpose: Closes an open <sqfp>.
+ *
+ * Returns: (void).
+ */
+static void
+sqascii_Close(ESL_SQFILE *sqfp)
+{
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+#ifdef HAVE_POPEN
+ if (ascii->do_gzip) pclose(ascii->fp);
+ else
+#endif
+ if (! ascii->do_stdin && ascii->fp != NULL) fclose(ascii->fp);
+
+ if (ascii->ssifile != NULL) free(ascii->ssifile);
+ if (ascii->mem != NULL) free(ascii->mem);
+ if (ascii->balloc > 0) free(ascii->buf);
+#ifdef eslAUGMENT_SSI
+ if (ascii->ssi != NULL) esl_ssi_Close(ascii->ssi);
+#endif
+
+#ifdef eslAUGMENT_MSA
+ if (ascii->afp != NULL) esl_msafile_Close(ascii->afp);
+ if (ascii->msa != NULL) esl_msa_Destroy(ascii->msa);
+#endif /*eslAUGMENT_MSA*/
+
+ ascii->do_gzip = FALSE;
+ ascii->do_stdin = FALSE;
+
+ ascii->fp = NULL;
+
+ ascii->ssifile = NULL;
+ ascii->mem = NULL;
+
+ ascii->balloc = 0;
+ ascii->buf = NULL;
+
+ ascii->ssi = NULL;
+
+ ascii->afp = NULL;
+ ascii->msa = NULL;
+
+ return;
+}
+/*------------------- ESL_SQFILE open/close -----------------------*/
+
+
+/*****************************************************************
+ *# 2. An <ESL_SQFILE> object, in digital mode [with <alphabet>]
+ *****************************************************************/
+#ifdef eslAUGMENT_ALPHABET
+
+/* Function: sqascii_SetDigital()
+ * Synopsis: Set an open <ESL_SQFILE> to read in digital mode.
+ *
+ * Purpose: Given an <ESL_SQFILE> that's already been opened,
+ * configure it to expect subsequent input to conform
+ * to the digital alphabet <abc>.
+ *
+ * Calling <esl_sqfile_Open(); esl_sqfile_SetDigital()> is
+ * equivalent to <esl_sqfile_OpenDigital()>. The two-step
+ * version is useful when you need a
+ * <esl_sqfile_GuessAlphabet()> call in between, guessing
+ * the file's alphabet in text mode before you set it to
+ * digital mode.
+ *
+ * Returns: <eslOK> on success.
+ */
+static int
+sqascii_SetDigital(ESL_SQFILE *sqfp, const ESL_ALPHABET *abc)
+{
+ int status = eslOK;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (!esl_sqio_IsAlignment(sqfp->format))
+ {
+ switch (sqfp->format) {
+ case eslSQFILE_EMBL: inmap_embl(sqfp, abc->inmap); break;
+ case eslSQFILE_UNIPROT: inmap_embl(sqfp, abc->inmap); break;
+ case eslSQFILE_GENBANK: inmap_genbank(sqfp, abc->inmap); break;
+ case eslSQFILE_DDBJ: inmap_genbank(sqfp, abc->inmap); break;
+ case eslSQFILE_FASTA: inmap_fasta(sqfp, abc->inmap); break;
+ case eslSQFILE_DAEMON: inmap_daemon(sqfp, abc->inmap); break;
+
+ default: status = eslEFORMAT; break;
+ }
+ }
+ else
+ {
+#ifdef eslAUGMENT_MSA
+ esl_msafile_SetDigital(ascii->afp, abc);
+#else
+ status = eslEFORMAT;
+#endif
+ }
+
+ return status;
+}
+
+/* Function: sqascii_GuessAlphabet()
+ * Synopsis: Guess the alphabet of an open <ESL_SQFILE>.
+ *
+ * Purpose: After opening <sqfp>, attempt to guess what alphabet
+ * its sequences are in, by inspecting the first sequence
+ * in the file, and return this alphabet type in <*ret_type>.
+ *
+ * Returns: <eslOK> on success, and <*ret_type> is set to <eslDNA>,
+ * <eslRNA>, or <eslAMINO>.
+ *
+ * Returns <eslENOALPHABET> and sets <*ret_type> to
+ * <eslUNKNOWN> if the first sequence (or alignment)
+ * in the file contains no more than ten residues total,
+ * or if its alphabet cannot be guessed (i.e. it contains
+ * IUPAC degeneracy codes, but no amino acid specific
+ * residues).
+ *
+ * Returns <eslEFORMAT> if a parse error is encountered in
+ * trying to read the sequence file. <ascii->errbuf> is set
+ * to a useful error message if this occurs,
+ * <sqfp->linenumber> is the line on which the error
+ * occurred, and <*ret_type> is set to <eslUNKNOWN>.
+ *
+ * Returns <eslENODATA> and sets <*ret_type> to <eslUNKNOWN>
+ * if the file appears to be empty.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslEINCONCEIVABLE> on unimaginable internal errors.
+ */
+static int
+sqascii_GuessAlphabet(ESL_SQFILE *sqfp, int *ret_type)
+{
+ ESL_SQ *sq = NULL;
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ /* Special case: for MSA files, hand this off to msafile_GuessAlphabet. */
+#ifdef eslAUGMENT_MSA
+ if (esl_sqio_IsAlignment(sqfp->format)) return esl_msafile_GuessAlphabet(ascii->afp, ret_type);
+#endif
+
+ /* set the sqfp to record; we'll rewind afterwards and use the recording */
+ ascii->is_recording = TRUE;
+
+ if ((sq = esl_sq_Create()) == NULL) { status = eslEMEM; goto ERROR; }
+
+ status = sqascii_ReadWindow(sqfp, 0, 4000, sq);
+ if (status == eslEOF) { status = eslENODATA; goto ERROR; }
+ else if (status != eslOK) goto ERROR;
+
+ if ((status = esl_sq_GuessAlphabet(sq, ret_type)) != eslOK) goto ERROR;
+
+ /* reset the sqfp, so it uses the recording next */
+ ascii->mpos = 0;
+ ascii->linenumber = 1;
+ ascii->is_recording = FALSE;
+ if ((status = loadbuf(sqfp)) != eslOK) ESL_EXCEPTION(status, "buffer load failed, but shouldn't have");
+ esl_sq_Destroy(sq);
+ return eslOK;
+
+ ERROR:
+ esl_sq_Destroy(sq);
+ *ret_type = eslUNKNOWN;
+ return status;
+}
+#endif /*eslAUGMENT_ALPHABET*/
+/*-------------- end, digital mode ESL_SQFILE -------------------*/
+
+
+
+
+/*****************************************************************
+ *# 3. Miscellaneous routines
+ *****************************************************************/
+
+/* Function: sqascii_IsRewindable()
+ * Synopsis: Return <TRUE> if <sqfp> can be rewound.
+ *
+ * Purpose: Returns <TRUE> if <sqfp> can be rewound (positioned
+ * to an offset of zero), in order to read it a second
+ * time.
+ */
+static int
+sqascii_IsRewindable(const ESL_SQFILE *sqfp)
+{
+ if (sqfp->data.ascii.do_gzip == TRUE) return FALSE;
+ if (sqfp->data.ascii.do_stdin == TRUE) return FALSE;
+ return TRUE;
+}
+
+/* Function: sqascii_GetError()
+ * Synopsis: Return <TRUE> if <sqfp> can be rewound.
+ *
+ * Purpose: Returns <TRUE> if <sqfp> can be rewound (positioned
+ * to an offset of zero), in order to read it a second
+ * time.
+ */
+static const char *
+sqascii_GetError(const ESL_SQFILE *sqfp)
+{
+ return sqfp->data.ascii.errbuf;
+}
+
+
+/*****************************************************************
+ *# 4. Sequence reading (sequential)
+ *****************************************************************/
+
+/* Function: sqascii_Read()
+ * Synopsis: Read the next sequence from a file.
+ *
+ * Purpose: Reads the next sequence from open sequence file <sqfp> into
+ * <sq>. Caller provides an allocated and initialized <s>, which
+ * will be internally reallocated if its space is insufficient.
+ *
+ * Returns: <eslOK> on success; the new sequence is stored in <s>.
+ *
+ * Returns <eslEOF> when there is no sequence left in the
+ * file (including first attempt to read an empty file).
+ *
+ * Returns <eslEFORMAT> if there's a problem with the format,
+ * such as an illegal character; the line number that the parse
+ * error occurs on is in <sqfp->linenumber>, and an informative
+ * error message is placed in <ascii->errbuf>.
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ * <eslEINCONCEIVABLE> on internal error.
+ */
+static int
+sqascii_Read(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int status;
+ int64_t epos;
+ int64_t n;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+#ifdef eslAUGMENT_MSA
+ if (esl_sqio_IsAlignment(sqfp->format))
+ {
+ ESL_SQ *tmpsq = NULL;
+ if (ascii->msa == NULL || ascii->idx >= ascii->msa->nseq)
+ { /* we need to load a new alignment? */
+ esl_msa_Destroy(ascii->msa);
+ status = esl_msafile_Read(ascii->afp, &(ascii->msa));
+ if (status == eslEFORMAT)
+ { /* oops, a parse error; upload the error info from afp to sqfp */
+ ascii->linenumber = ascii->afp->linenumber;
+ strcpy(ascii->errbuf, ascii->afp->errmsg); /* errbufs same size! */
+ return eslEFORMAT;
+ }
+ if (status != eslOK) return status;
+ ascii->idx = 0;
+ }
+
+ /* grab next seq from alignment */
+ /* this is inefficient; it goes via a temporarily allocated copy of the sequence */
+ if ((status = esl_sq_FetchFromMSA(ascii->msa, ascii->idx, &tmpsq)) != eslOK) return status;
+ esl_sq_GrowTo(sq, tmpsq->n);
+ esl_sq_Copy(tmpsq, sq);
+ esl_sq_Destroy(tmpsq);
+ ascii->idx++;
+
+ sq->start = 1;
+ sq->end = sq->n;
+ sq->C = 0;
+ sq->W = sq->n;
+ sq->L = sq->n;
+ return eslOK;
+ }
+#endif
+
+ /* Main case: read next seq from sqfp's stream */
+ if (ascii->nc == 0) return eslEOF;
+ if ((status = ascii->parse_header(sqfp, sq)) != eslOK) return status; /* EMEM, EOF, EFORMAT */
+
+ do {
+ if ((status = seebuf(sqfp, -1, &n, &epos)) == eslEFORMAT) return status;
+ if (esl_sq_GrowTo(sq, sq->n + n) != eslOK) return eslEMEM;
+ addbuf(sqfp, sq, n);
+ ascii->L += n;
+ sq->eoff = ascii->boff + epos - 1;
+ if (status == eslEOD) break;
+ } while ((status = loadbuf(sqfp)) == eslOK);
+
+ if (status == eslEOF)
+ {
+ if (! ascii->eof_is_ok) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Unexpected EOF; file truncated?");
+ if ((status = ascii->parse_end(sqfp, sq)) != eslOK) return status;
+ }
+ else if (status == eslEOD)
+ {
+ ascii->bpos = epos;
+ if ((status = ascii->parse_end(sqfp, sq)) != eslOK) return status;
+ }
+ else if (status != eslOK) return status;
+
+ if (sq->dsq != NULL) sq->dsq[sq->n+1] = eslDSQ_SENTINEL;
+ else sq->seq[sq->n] = '\0';
+ sq->start = 1;
+ sq->end = sq->n;
+ sq->C = 0;
+ sq->W = sq->n;
+ sq->L = sq->n;
+ return eslOK;
+}
+
+
+/* Function: sqascii_ReadInfo()
+ * Synopsis: Read sequence info, but not the sequence itself.
+ *
+ * Purpose: Read the next sequence from open sequence file <sqfp>,
+ * but don't store the sequence (or secondary structure).
+ * Upon successful return, <s> holds all the available
+ * information about the sequence -- its name, accession,
+ * description, and overall length <sq->L>.
+ *
+ * This is useful for indexing sequence files, where
+ * individual sequences might be ginormous, and we'd rather
+ * avoid reading complete seqs into memory.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+static int
+sqascii_ReadInfo(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int status;
+ int64_t epos;
+ int64_t n;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+#ifdef eslAUGMENT_MSA
+ if (esl_sqio_IsAlignment(sqfp->format))
+ {
+ ESL_SQ *tmpsq = NULL;
+ if (ascii->msa == NULL || ascii->idx >= ascii->msa->nseq)
+ { /* we need to load a new alignment? */
+ esl_msa_Destroy(ascii->msa);
+ status = esl_msafile_Read(ascii->afp, &(ascii->msa));
+ if (status == eslEFORMAT)
+ { /* oops, a parse error; upload the error info from afp to sqfp */
+ ascii->linenumber = ascii->afp->linenumber;
+ strcpy(ascii->errbuf, ascii->afp->errmsg); /* errbufs same size! */
+ return eslEFORMAT;
+ }
+ if (status != eslOK) return status;
+ ascii->idx = 0;
+ }
+
+ /* grab next seq from alignment */
+ /* this is inefficient; it goes via a temporarily allocated copy of the sequence */
+ if ((status = esl_sq_FetchFromMSA(ascii->msa, ascii->idx, &tmpsq)) != eslOK) return status;
+ if (tmpsq->dsq != NULL) tmpsq->dsq[1] = eslDSQ_SENTINEL;
+ else tmpsq->seq[0] = '\0';
+ esl_sq_Copy(tmpsq, sq);
+ esl_sq_Destroy(tmpsq);
+ ascii->idx++;
+
+ if (sq->dsq != NULL) sq->dsq[1] = eslDSQ_SENTINEL;
+ else sq->seq[0] = '\0';
+ if (sq->ss != NULL) { free(sq->ss); sq->ss = NULL; }
+
+ sq->n = 0;
+ sq->start = 0;
+ sq->end = 0;
+ sq->C = 0;
+ sq->W = 0;
+ return eslOK;
+ }
+#endif
+
+ if (ascii->nc == 0) return eslEOF;
+ if ((status = ascii->parse_header(sqfp, sq)) != eslOK) return status; /* EOF, EFORMAT */
+
+ ascii->L = 0;
+ do {
+ status = seebuf(sqfp, -1, &n, &epos);
+ ascii->L += n;
+ sq->eoff = ascii->boff + epos - 1;
+ if (status == eslEFORMAT) return status;
+ if (status == eslEOD) break;
+ } while ((status = loadbuf(sqfp)) == eslOK);
+
+ if (status == eslEOF)
+ {
+ if (! ascii->eof_is_ok) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Unexpected EOF; file truncated?");
+ }
+ else if (status == eslEOD)
+ {
+ ascii->bpos = epos;
+ if ((status = ascii->parse_end(sqfp, sq)) != eslOK) return status;
+ }
+ else if (status != eslOK) return status;
+ sq->L = ascii->L;
+
+ /* Set coord system for an info-only ESL_SQ */
+ if (sq->dsq != NULL) sq->dsq[1] = eslDSQ_SENTINEL;
+ else sq->seq[0] = '\0';
+ if (sq->ss != NULL) { free(sq->ss); sq->ss = NULL; }
+ sq->n = 0;
+ sq->start = 0;
+ sq->end = 0;
+ sq->C = 0;
+ sq->W = 0;
+ return eslOK;
+}
+
+
+/* Function: sqascii_ReadSequence()
+ * Synopsis: Read the next sequence from a file.
+ *
+ * Purpose: Reads the next sequence from open sequence file <sqfp> into
+ * <sq>. Caller provides an allocated and initialized <s>, which
+ * will be internally reallocated if its space is insufficient.
+ *
+ * Returns: <eslOK> on success; the new sequence is stored in <s>.
+ *
+ * Returns <eslEOF> when there is no sequence left in the
+ * file (including first attempt to read an empty file).
+ *
+ * Returns <eslEFORMAT> if there's a problem with the format,
+ * such as an illegal character; the line number that the parse
+ * error occurs on is in <sqfp->linenumber>, and an informative
+ * error message is placed in <ascii->errbuf>.
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ * <eslEINCONCEIVABLE> on internal error.
+ */
+static int
+sqascii_ReadSequence(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+ int64_t epos;
+ int64_t n;
+ int status;
+
+#ifdef eslAUGMENT_MSA
+ if (esl_sqio_IsAlignment(sqfp->format))
+ {
+ ESL_SQ *tmpsq = NULL;
+ if (ascii->msa == NULL || ascii->idx >= ascii->msa->nseq)
+ { /* we need to load a new alignment? */
+ esl_msa_Destroy(ascii->msa);
+ status = esl_msafile_Read(ascii->afp, &(ascii->msa));
+ if (status == eslEFORMAT)
+ { /* oops, a parse error; upload the error info from afp to sqfp */
+ ascii->linenumber = ascii->afp->linenumber;
+ strcpy(ascii->errbuf, ascii->afp->errmsg); /* errbufs same size! */
+ return eslEFORMAT;
+ }
+ if (status != eslOK) return status;
+ ascii->idx = 0;
+ }
+
+ /* grab next seq from alignment */
+ /* this is inefficient; it goes via a temporarily allocated copy of the sequence */
+ status = esl_sq_FetchFromMSA(ascii->msa, ascii->idx, &tmpsq); // eslEMEM | eslEOD
+ if (status != eslOK) return status;
+
+ esl_sq_GrowTo(sq, tmpsq->n);
+ esl_sq_Copy(tmpsq, sq);
+ esl_sq_Destroy(tmpsq);
+ ascii->idx++;
+
+ sq->start = 1;
+ sq->end = sq->n;
+ sq->C = 0;
+ sq->W = sq->n;
+ sq->L = sq->n;
+ return eslOK;
+ }
+#endif
+
+ /* Main case: read next seq from sqfp's stream */
+ if (ascii->nc == 0) return eslEOF;
+ if ((status = ascii->skip_header(sqfp, sq)) != eslOK) return status; /* EOF, EFORMAT */
+
+ do {
+ if ((status = seebuf(sqfp, -1, &n, &epos)) == eslEFORMAT) return status;
+ if (esl_sq_GrowTo(sq, sq->n + n) != eslOK) return eslEMEM;
+ addbuf(sqfp, sq, n);
+ ascii->L += n;
+ sq->eoff = ascii->boff + epos - 1;
+ if (status == eslEOD) break;
+ } while ((status = loadbuf(sqfp)) == eslOK);
+
+ if (status == eslEOF)
+ {
+ if (! ascii->eof_is_ok) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Unexpected EOF; file truncated?");
+ if ((status = ascii->parse_end(sqfp, sq)) != eslOK) return status;
+ }
+ else if (status == eslEOD)
+ {
+ ascii->bpos = epos;
+ if ((status = ascii->parse_end(sqfp, sq)) != eslOK) return status;
+ }
+ else if (status != eslOK) return status;
+
+ if (sq->dsq != NULL) sq->dsq[sq->n+1] = eslDSQ_SENTINEL;
+ else sq->seq[sq->n] = '\0';
+ sq->start = 1;
+ sq->end = sq->n;
+ sq->C = 0;
+ sq->W = sq->n;
+ sq->L = sq->n;
+ return eslOK;
+}
+
+
+/* Function: sqascii_ReadWindow()
+ * Synopsis: Read next window of sequence.
+ *
+ * Purpose: Read a next window of <W> residues from open file <sqfp>,
+ * keeping <C> residues from the previous window as
+ * context, and keeping previous annotation in the <sq>
+ * as before.
+ *
+ * If this is the first window of a new sequence record,
+ * <C> is ignored (there's no previous context yet), and
+ * the annotation fields of the <sq> (name, accession, and
+ * description) are initialized by reading the sequence
+ * record's header. This is the only time the annotation
+ * fields are initialized.
+ *
+ * On return, <sq->dsq[]> contains the window and its
+ * context; residues <1..sq->C> are the previous context,
+ * and residues <sq->C+1..sq->n> are the new window. The
+ * start and end coordinates of the whole <dsq[1..n]>
+ * (including context) in the original source sequence are
+ * <sq->start..sq->end>. (Or, for text mode sequences,
+ * <sq->seq[0..sq->C-1,sq->C..sq->n-1]>, while <start> and
+ * <end> coords are still <1..L>.)
+ *
+ * When a sequence record is completed and no more data
+ * remain, <eslEOD> is returned, with an ``info'' <sq>
+ * structure (containing the annotation and the total
+ * sequence length <L>, but no sequence). (The total
+ * sequence length <L> is unknown in <sq> until this
+ * <eslEOD> return.)
+ *
+ * The caller may then do one of two things before calling
+ * <esl_sq_ReadWindow()> again; it can reset the sequence
+ * with <esl_sq_Reuse()> to continue reading the next
+ * sequence in the file, or it can set a negative <W> as a
+ * signal to read windows from the reverse complement
+ * (Crick) strand. Reverse complement reading only works
+ * for nucleic acid sequence.
+ *
+ * If you read the reverse complement strand, you must read
+ * the whole thing, calling <esl_sqio_ReadWindow()> with
+ * negative <W> windows until <eslEOD> is returned again
+ * with an empty (info-only) <sq> structure. When that
+ * <EOD> is reached, the <sqfp> is repositioned at the
+ * start of the next sequence record; the caller should now
+ * <Reuse()> the <sq>, and the next <esl_sqio_ReadWindow()>
+ * call must have a positive <W>, corresponding to starting
+ * to read the Watson strand of the next sequence.
+ *
+ * Note that the <ReadWindow()> interface is designed for
+ * an idiom of sequential reading of complete sequences in
+ * overlapping windows, possibly on both strands; if you
+ * want more freedom to move around in the sequence
+ * grabbing windows in another order, you can use the
+ * <FetchSubseq()> interface.
+ *
+ * Reading the reverse complement strand requires file
+ * repositioning, so it will not work on non-repositionable
+ * streams like gzipped files or a stdin pipe. Moreover,
+ * for reverse complement input to be efficient, the
+ * sequence file should have consistent line lengths,
+ * suitable for SSI's fast subsequence indexing.
+ *
+ * Returns: <eslOK> on success; <sq> now contains next window of
+ * sequence, with at least 1 new residue. The number
+ * of new residues is <sq->W>; <sq->C> residues are
+ * saved from the previous window. Caller may now
+ * process residues <sq->dsq[sq->C+1]..sq->dsq[sq->n]>.
+ *
+ * <eslEOD> if no new residues were read for this sequence
+ * and strand, and <sq> now contains an empty info-only
+ * structure (annotation and <L> are valid). Before calling
+ * <esl_sqio_ReadWindow()> again, caller will either want
+ * to make <W> negative (to start reading the Crick strand
+ * of the current sequence), or it will want to reset the
+ * <sq> (with <esl_sq_Reuse()>) to go on the next sequence.
+ *
+ * <eslEOF> if we've already returned <eslEOD> before to
+ * signal the end of the previous seq record, and moreover,
+ * there's no more sequence records in the file.
+ *
+ * <eslEINVAL> if an invalid residue is found in the
+ * sequence, or if you attempt to take the reverse
+ * complement of a sequence that can't be reverse
+ * complemented.
+ *
+ * Throws: <eslESYNTAX> if you try to read a reverse window before
+ * you've read forward strand.
+ *
+ * <eslECORRUPT> if something goes awry internally in the
+ * coordinate system.
+ *
+ * <eslEMEM> on allocation error.
+ */
+static int
+sqascii_ReadWindow(ESL_SQFILE *sqfp, int C, int W, ESL_SQ *sq)
+{
+ int actual_start;
+ int64_t nres;
+ int64_t line;
+ off_t offset;
+ int status;
+ ESL_SQ *tmpsq = NULL;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+#ifdef eslAUGMENT_MSA
+ if (esl_sqio_IsAlignment(sqfp->format))
+ {
+ /* special: if we're initializing a revcomp window read, back ascii->idx up one */
+ if (W < 0 && sq->start == 0) ascii->idx--;
+
+ if (ascii->msa == NULL || ascii->idx >= ascii->msa->nseq)
+ { /* need new alignment? */
+ esl_msa_Destroy(ascii->msa);
+ status = esl_msafile_Read(ascii->afp, &(ascii->msa));
+ if (status == eslEFORMAT)
+ { /* oops, a parse error; upload the error info from afp to sqfp */
+ ascii->linenumber = ascii->afp->linenumber;
+ strcpy(ascii->errbuf, ascii->afp->errmsg); /* errbufs same size! */
+ return eslEFORMAT;
+ }
+ else if (status != eslOK) goto ERROR;
+ ascii->idx = 0;
+ }
+
+ /* grab appropriate seq from alignment into tmpsq */
+ if ((status = esl_sq_FetchFromMSA(ascii->msa, ascii->idx, &tmpsq)) != eslOK) goto ERROR;
+
+ /*by default, tmpsq is an ascii sequence, convert it to digital if that's what sq is*/
+ if (sq->seq == NULL &&
+ (( status = esl_sq_Digitize(sq->abc, tmpsq)) != eslOK))
+ goto ERROR;
+
+ /* Figure out tmpsq coords we'll put in sq */
+ if (W > 0)
+ {/* forward strand */
+ sq->C = ESL_MIN(sq->n, C);
+ sq->start = sq->end - sq->C + 1;
+ sq->end = ESL_MIN(tmpsq->L, sq->end + W);
+ sq->n = sq->end - sq->start + 1;
+ sq->W = sq->n - sq->C;
+ }
+ else
+ {/* reverse strand */
+ if (sq->L == -1) ESL_XEXCEPTION(eslESYNTAX, "Can't read reverse complement until you've read forward strand");
+
+ sq->C = ESL_MIN(sq->n, sq->end + C - 1);
+ sq->end = (sq->start == 0 ? sq->L : sq->end + sq->C - 1);
+ sq->start = ESL_MAX(1, sq->end + W - sq->C - 1);
+ sq->n = sq->end - sq->start + 1;
+ sq->W = sq->n - sq->C;
+ }
+
+ if (sq->W == 0)/* no new sequence? that's the EOD case */
+ {
+ sq->start = 0;
+ sq->end = 0;
+ sq->C = 0;
+ sq->W = 0;
+ sq->n = 0;
+ sq->L = tmpsq->L;
+ if (sq->dsq) sq->dsq[1] = eslDSQ_SENTINEL;
+ else if (sq->seq) sq->seq[0] = '\0';
+
+ ascii->idx++;
+ esl_sq_Destroy(tmpsq);
+ return eslEOD;
+ }
+
+ /* Copy the sequence frag. */
+ if (tmpsq->ss != NULL && sq->ss == NULL) ESL_ALLOC(sq->ss, sizeof(char) * (sq->salloc)); /* this *must* be for salloc */
+ esl_sq_GrowTo(sq, sq->n);
+ if (tmpsq->seq != NULL)
+ {/* text mode */
+ memcpy(sq->seq, tmpsq->seq + sq->start - 1, sizeof(char) * sq->n);
+ sq->seq[sq->n] = '\0';
+ if (tmpsq->ss != NULL) {
+ memcpy(sq->ss, tmpsq->ss + sq->start - 1, sizeof(char) * sq->n);
+ sq->ss[sq->n] = '\0';
+ }
+ }
+ else
+ {
+ memcpy(sq->dsq + 1, tmpsq->dsq + sq->start, sizeof(ESL_DSQ) * sq->n);
+ sq->dsq[sq->n+1] = eslDSQ_SENTINEL;
+ if (tmpsq->ss != NULL) {
+ memcpy(sq->ss + 1, tmpsq->ss + sq->start, sizeof(char) * sq->n);
+ sq->ss[sq->n+1] = '\0';
+ }
+ }
+ if (W < 0 && (status = esl_sq_ReverseComplement(sq)) != eslOK)
+ ESL_XFAIL(eslEINVAL, ascii->errbuf, "Can't reverse complement that sequence window");
+
+ /* Copy annotation */
+ if ((status = esl_sq_SetName (sq, tmpsq->name)) != eslOK) goto ERROR;
+ if ((status = esl_sq_SetSource (sq, tmpsq->name)) != eslOK) goto ERROR;
+ if ((status = esl_sq_SetAccession(sq, tmpsq->acc)) != eslOK) goto ERROR;
+ if ((status = esl_sq_SetDesc (sq, tmpsq->desc)) != eslOK) goto ERROR;
+ sq->roff = -1;
+ sq->doff = -1;
+ sq->eoff = -1;
+ sq->hoff = -1;
+
+ esl_sq_Destroy(tmpsq);
+ return eslOK;
+ }
+#endif /* we've completely handled the alignment file case above. */
+
+ /* Now for the normal case: we're reading a normal unaligned seq file, not an alignment. */
+
+ /* Negative W indicates reverse complement direction */
+ if (W < 0)
+ {
+ if (sq->L == -1) ESL_EXCEPTION(eslESYNTAX, "Can't read reverse complement until you've read forward strand");
+
+ if (sq->end == 1)
+ { /* last end == 1 means last window was the final one on reverse strand,
+ * so we're EOD; jump back to last forward position.
+ */
+ if (ascii->bookmark_offset > 0) {
+ if (esl_sqfile_Position(sqfp, ascii->bookmark_offset) != eslOK)
+ ESL_EXCEPTION(eslECORRUPT, "Failed to reposition seq file at last forward bookmark");
+ ascii->linenumber = ascii->bookmark_linenum;
+ } else {
+ ascii->nc = 0;/* signals EOF */
+ }
+ ascii->bookmark_offset = 0;
+ ascii->bookmark_linenum = 0;
+
+ sq->start = 0;
+ sq->end = 0;
+ sq->C = 0;
+ sq->W = 0;
+ sq->n = 0;
+ /* sq->L stays as it is */
+ if (sq->dsq != NULL) sq->dsq[1] = eslDSQ_SENTINEL;
+ else sq->seq[0] = '\0';
+ return eslEOD;
+ }
+
+ /* If s == 0, we haven't read any reverse windows yet;
+ * init reading from sq->L
+ */
+ W = -W;
+ if (sq->start == 0)
+ {
+ sq->start = ESL_MAX(1, (sq->L - W + 1));
+ sq->end = sq->L;
+ sq->C = 0;
+ sq->W = sq->end - sq->start + 1;
+ ascii->curbpl = -1;
+ ascii->currpl = -1;
+ ascii->prvbpl = -1;
+ ascii->prvrpl = -1;
+ ascii->linenumber = -1;
+ ascii->L = -1;
+ }
+ else
+ { /* Else, we're continuing to next window; prv was <end>..<start> */
+ sq->C = ESL_MIN(C, sq->L - sq->end + 1); /* based on prev window's end */
+ sq->end = sq->end + sq->C - 1; /* also based on prev end */
+ sq->start = ESL_MAX(1, (sq->end - W - sq->C + 1));
+ sq->W = sq->end - sq->start + 1 - sq->C;
+ }
+
+ /* Now position for a subseq fetch of <start..end> on fwd strand, using SSI offset calc */
+ if (sq->doff == 0) ESL_EXCEPTION(eslECORRUPT, "can't happen: sq didn't store data offset");
+
+ if (ascii->bpl == 0 || ascii->rpl == 0) /* no help; brute force resolution. */
+ {
+ offset = sq->doff;
+ actual_start = 1;
+ }
+ else if (ascii->bpl == ascii->rpl+1) /* residue resolution */
+ {
+ line = (sq->start-1) / ascii->rpl; /* data line #0.. that <end> is on */
+ offset = sq->doff + line * ascii->bpl + (sq->start-1)%ascii->rpl;
+ actual_start = sq->start;
+ }
+ else/* line resolution */
+ {
+ line = (sq->start-1) / ascii->rpl; /* data line #0.. that <end> is on */
+ offset = sq->doff + line * ascii->bpl;
+ actual_start = 1 + line * ascii->rpl;
+ }
+ if (esl_sqfile_Position(sqfp, offset) != eslOK)
+ ESL_EXCEPTION(eslECORRUPT, "Failed to reposition seq file for reverse window read");
+
+ /* grab the subseq and rev comp it */
+ if ((status = esl_sq_GrowTo(sq, sq->C+sq->W)) != eslOK) return status;
+ sq->n = 0;
+ status = read_nres(sqfp, sq, (sq->start - actual_start), (sq->end - sq->start + 1), &nres);
+
+ if (status != eslOK || nres < (sq->end - sq->start + 1))
+ ESL_EXCEPTION(eslECORRUPT, "Failed to extract %d..%d", sq->start, sq->end);
+
+ status = esl_sq_ReverseComplement(sq);
+ if (status == eslEINVAL) ESL_FAIL(eslEINVAL, ascii->errbuf, "can't reverse complement that seq - it's not DNA/RNA");
+ else if (status != eslOK) return status;
+
+ return eslOK;
+ }
+
+ /* Else, we're reading the forward strand */
+ else
+ { /* sq->start == 0 means we haven't read any windows on this sequence yet...
+ * it's a new record, and we need to initialize with the header and
+ * the first window. This is the only case that we're allowed to return
+ * EOF from.
+ */
+ if (sq->start == 0)
+ {
+ if (ascii->nc == 0) return eslEOF;
+ if ((status = ascii->parse_header(sqfp, sq)) != eslOK) return status; /* EOF, EFORMAT */
+ sq->start = 1;
+ sq->C = 0;/* no context in first window */
+ sq->L = -1;/* won't be known 'til EOD. */
+ ascii->L = 0;/* init to 0, so we can count residues as we go */
+ esl_sq_SetSource(sq, sq->name);
+ /* the <ascii->buf> is now positioned at the start of seq data */
+ /* ascii->linenumber is ok where it is */
+ /* the header_*() routines initialized rpl,bpl bookkeeping at start of seq line,
+ * and also sq->doff,roff.
+ */
+ }
+ else
+ { /* else we're reading a window other than first; slide context over. */
+ sq->C = ESL_MIN(C, sq->n);
+
+ /* if the case where the window is smaller than the context and the
+ * context is not full, it is not necessary to move the context part
+ * of the sequence that has been read in.
+ */
+ if (sq->C >= C) {
+ /* now handle the case where the context is full */
+ if (sq->seq != NULL) memmove(sq->seq, sq->seq + sq->n - sq->C, sq->C);
+ else memmove(sq->dsq+1, sq->dsq + sq->n - sq->C + 1, sq->C);
+ sq->start = ascii->L - sq->C + 1;
+ sq->n = C;
+ }
+ }
+
+ if ((status = esl_sq_GrowTo(sq, C+W)) != eslOK) return status; /* EMEM */
+ status = read_nres(sqfp, sq, 0, W, &nres);
+ ascii->L += nres;
+
+ if (status == eslEOD)
+ { /* Forward strand is done. 0 residues were read. Return eslEOD and an empty (info) <sq>. */
+ if ((status = ascii->parse_end(sqfp, sq)) != eslOK) return status;
+
+ sq->start = 0;
+ sq->end = 0;
+ sq->C = 0;
+ sq->W = 0;
+ sq->L = ascii->L;
+ sq->n = 0;
+
+ if (ascii->nc > 0) {
+ ascii->bookmark_offset = ascii->boff+ascii->bpos; /* remember where the next seq starts. */
+ //ascii->bookmark_linenum = ascii->bookmark_linenum;
+ } else {
+ ascii->bookmark_offset = 0; /* signals for EOF, no more seqs */
+ ascii->bookmark_linenum = 0;
+ }
+
+ if (sq->dsq != NULL) sq->dsq[1] = eslDSQ_SENTINEL; /* erase the saved context */
+ else sq->seq[0] = '\0';
+ return eslEOD;
+ }
+ else if (status == eslOK)
+ { /* Forward strand is still in progress. <= W residues were read. Return eslOK. */
+ sq->end = sq->start + sq->C + nres - 1;
+ sq->W = nres;
+ return eslOK;
+ }
+ else return status;/* EFORMAT,EMEM */
+ }
+ /*NOTREACHED*/
+ return eslOK;
+
+ ERROR:
+ if (tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status;
+}
+
+/* Function: sqascii_ReadBlock()
+ * Synopsis: Read the next block of sequences from a file.
+ *
+ * Purpose: Reads a block of sequences from open sequence file <sqfp> into
+ * <sqBlock>.
+ *
+ * In the case that <long_target> is false, the sequences are
+ * expected to be protein - individual sequences won't be long
+ * so read them in one-whole-sequence at a time. If <max_sequences> is set
+ * to a number > 0 read <max_sequences> sequences, up to at most
+ * MAX_RESIDUE_COUNT residues.
+ *
+ * If <long_target> is true, the sequences are expected to be DNA.
+ * Because sequences in a DNA database can exceed MAX_RESIDUE_COUNT,
+ * this function uses ReadWindow to read chunks of sequence no
+ * larger than <max_residues>, and must allow for the possibility that a
+ * request will be made to continue reading a partly-read
+ * sequence. This case also respects the <max_sequences> limit.
+ *
+ * Returns: <eslOK> on success; the new sequence is stored in <sqBlock>.
+ *
+ * Returns <eslEOF> when there is no sequence left in the
+ * file (including first attempt to read an empty file).
+ *
+ * Returns <eslEFORMAT> if there's a problem with the format,
+ * such as an illegal character; the line number that the parse
+ * error occurs on is in <sqfp->linenumber>, and an informative
+ * error message is placed in <ascii->errbuf>.
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ * <eslEINCONCEIVABLE> on internal error.
+ */
+static int
+sqascii_ReadBlock(ESL_SQFILE *sqfp, ESL_SQ_BLOCK *sqBlock, int max_residues, int max_sequences, int long_target)
+{
+ int i = 0;
+ int size = 0;
+ int status = eslOK;
+ ESL_SQ *tmpsq = NULL;
+
+ sqBlock->count = 0;
+ if (max_sequences < 1 || max_sequences > sqBlock->listSize)
+ max_sequences = sqBlock->listSize;
+
+
+ if ( !long_target )
+ { /* in these cases, an individual sequence won't ever be really long,
+ so just read in a sequence at a time */
+
+ for (i = 0; i < max_sequences && size < MAX_RESIDUE_COUNT; ++i)
+ {
+ status = sqascii_Read(sqfp, sqBlock->list + i);
+
+ if (status != eslOK) break;
+ size += sqBlock->list[i].n;
+ ++sqBlock->count;
+ }
+ }
+ else
+ { /* DNA, not an alignment. Might be really long sequences */
+
+ if (max_residues < 1)
+ max_residues = MAX_RESIDUE_COUNT;
+
+ tmpsq = esl_sq_Create();
+
+ //if complete flag is set to FALSE, then the prior block must have ended with a window that was a possibly
+ //incomplete part of it's full sequence. Read another overlapping window.
+ if (! sqBlock->complete )
+ {
+ //overloading C as indicator of how big C should be for this window reading action
+ status = sqascii_ReadWindow(sqfp, sqBlock->list->C, max_residues, sqBlock->list);
+ if (status == eslOK)
+ {
+ sqBlock->count = i = 1;
+ size = sqBlock->list->n - sqBlock->list->C;
+ sqBlock->list->L = sqfp->data.ascii.L;
+ if (size == max_residues)
+ { // Filled the block with a single very long window.
+
+ sqBlock->complete = FALSE; // default value, unless overridden below
+ status = skip_whitespace(sqfp);
+ if ( status != eslOK ) { // either EOD or end of buffer (EOF) was reached before the next character was seen
+ sqBlock->complete = TRUE;
+ status = eslOK;
+ }
+
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status;
+ }
+ else
+ {
+ // Burn off EOD (see notes for similar entry ~25 lines below), then go fetch the next sequence
+ esl_sq_Reuse(tmpsq);
+ tmpsq->start = sqBlock->list->start ;
+ tmpsq->C = 0;
+ status = sqascii_ReadWindow(sqfp, 0, max_residues, tmpsq);
+ if (status != eslEOD) {
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status; //surprising
+ }
+ //sqBlock->list->L = tmpsq->L;
+ }
+ }
+ else if (status == eslEOD)
+ { // turns out there isn't any more of the sequence to read, after all
+ }
+ else
+ {
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status;
+ }
+ } // otherwise, just start at the beginning
+
+
+ for ( ; i < max_sequences && size < max_residues; ++i) {
+ /* restricted request_size is used to ensure that all blocks are pretty close to the
+ * same size. Without it, we may either naively keep asking for max_residue windows,
+ * which can result in a window with ~2*max_residues ... or we can end up with absurdly
+ * short fragments at the end of blocks
+ */
+ int request_size = ESL_MAX(max_residues-size, max_residues * .05);
+
+ esl_sq_Reuse(tmpsq);
+ esl_sq_Reuse(sqBlock->list + i);
+
+ status = sqascii_ReadWindow(sqfp, 0, request_size , sqBlock->list + i);
+ if (status != eslOK && status != eslEOD) break; /* end of sequences (eslEOF), or we read an empty seq (eslEOD) or error (other) */
+ size += sqBlock->list[i].n - sqBlock->list[i].C;
+ sqBlock->list[i].L = sqfp->data.ascii.L;
+ ++(sqBlock->count);
+
+ if (size >= max_residues) {
+ // a full window worth of sequence has been read; did we reach the end of the final sequence in the block?
+ sqBlock->complete = FALSE; // default value, unless overridden below
+
+ status = skip_whitespace(sqfp);
+ if ( status != eslOK ) { // either EOD or end of buffer (EOF) was reached before the next character was seen
+ sqBlock->complete = TRUE;
+ status = eslOK;
+ }
+
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status;
+ } else if(status == eslEOD) {
+ /* We've read an empty sequence of length 0, rare, but
+ * possible, and we need to be able to handle it
+ * gracefully. Ensure L is 0, set status to eslOK and move
+ * on, we've already incremented sqBlock->count by 1
+ * above. This means our block may contain zero-length
+ * sequences when we return (that is, we still add these
+ * seqs onto the block instead of skipping them altogether).
+ */
+ sqBlock->list[i].L = 0; /* actually, this should already be 0... */
+ status = eslOK;
+ } else {
+ /* Sequence finished, but haven't yet reached max_residues. Need to burn off the EOD value
+ that will be returned by the next ReadWindow call. Can just use a tmp sq, after setting
+ a couple values ReadWindow needs to see for correct processing.
+ */
+ esl_sq_Reuse(tmpsq);
+ tmpsq->start = sqBlock->list[i].start ;
+ tmpsq->C = 0;
+ status = sqascii_ReadWindow(sqfp, 0, max_residues, tmpsq);
+
+ if (status != eslEOD) {
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status; //surprising
+ }
+ //sqBlock->list[i].L = tmpsq->L;
+ status = eslOK;
+ }
+ }
+ }
+
+ /* EOF will be returned only in the case were no sequences were read */
+ if (status == eslEOF && i > 0) status = eslOK;
+
+ sqBlock->complete = TRUE;
+
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+
+ return status;
+}
+
+/* Function: sqascii_Echo()
+ * Synopsis: Echo a sequence's record onto output stream.
+ *
+ * Purpose: Given a complete <sq> that we have read by some means
+ * from an open <sqfp>; echo that sequence's record
+ * onto the output stream <ofp>.
+ *
+ * This allows records to be regurgitated exactly as they
+ * appear, rather than writing the subset of information
+ * stored in an <ESL_SQ>. <esl-sfetch> in the miniapps uses
+ * this, for example.
+ *
+ * Because this relies on repositioning the <sqfp>, it
+ * cannot be called on non-positionable streams (stdin or
+ * gzipped files). Because it relies on the sequence lying
+ * in a contiguous sequence of bytes in the file, it cannot
+ * be called on a sequence in a multiple alignment file.
+ * Trying to do so throws an <eslEINVAL> exception.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if <sqfp> isn't a repositionable sequence file.
+ * <eslECORRUPT> if we run out of data, probably from bad offsets
+ * <eslEMEM> on allocation failure.
+ * <eslESYS> on system call failures.
+ *
+ *
+ */
+static int
+sqascii_Echo(ESL_SQFILE *sqfp, const ESL_SQ *sq, FILE *ofp)
+{
+ int status;
+ int64_t save_linenumber;
+ int save_currpl;
+ int save_curbpl;
+ int save_prvrpl;
+ int save_prvbpl;
+ int64_t save_L;
+ int n;
+ int nwritten;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->do_stdin) ESL_EXCEPTION(eslEINVAL, "can't Echo() a sequence from standard input");
+ if (ascii->do_gzip) ESL_EXCEPTION(eslEINVAL, "can't Echo() a sequence from a gzipped file");
+ if (esl_sqio_IsAlignment(sqfp->format)) ESL_EXCEPTION(eslEINVAL, "can't Echo() a sequence from an alignment file");
+ if (sq->roff == -1 || sq->eoff == -1) ESL_EXCEPTION(eslEINVAL, "can't Echo() a sequence without disk offset info");
+
+ save_linenumber = ascii->linenumber;
+ save_currpl = ascii->currpl;
+ save_curbpl = ascii->curbpl;
+ save_prvrpl = ascii->prvrpl;
+ save_prvbpl = ascii->prvbpl;
+ save_L = ascii->L;
+
+ status = esl_sqfile_Position(sqfp, sq->roff);
+ if (status == eslEOF) ESL_EXCEPTION(eslECORRUPT, "repositioning failed; bad offset?");
+ else if (status != eslOK) return status;
+
+ while (ascii->boff + ascii->nc <= sq->eoff)
+ {
+ if (fwrite(ascii->buf, sizeof(char), ascii->nc, ofp) != ascii->nc) ESL_EXCEPTION(eslESYS, "fwrite() failed");
+ if (loadbuf(sqfp) != eslOK) ESL_EXCEPTION(eslECORRUPT, "repositioning failed; bad offset?");
+ }
+ n = sq->eoff - ascii->boff + 1;
+ nwritten = fwrite(ascii->buf, sizeof(char), n, ofp);
+ if (nwritten != n) ESL_EXCEPTION(eslESYS, "fwrite() failed");
+
+ status = esl_sqfile_Position(sqfp, sq->roff);
+ if (status == eslEOF) ESL_EXCEPTION(eslECORRUPT, "repositioning failed; bad offset?");
+ else if (status != eslOK) return status;
+
+ ascii->linenumber = save_linenumber;
+ ascii->currpl = save_currpl;
+ ascii->curbpl = save_curbpl;
+ ascii->prvrpl = save_prvrpl;
+ ascii->prvbpl = save_prvbpl;
+ ascii->L = save_L;
+ return eslOK;
+}
+/*------------------ end, sequential sequence input -------------*/
+
+
+/*****************************************************************
+ *# 5. Sequence/subsequence fetching, random access [with <ssi>]
+ *****************************************************************/
+#ifdef eslAUGMENT_SSI
+
+/* Function: sqascii_OpenSSI()
+ * Synopsis: Opens an SSI index associated with a sequence file.
+ *
+ * Purpose: Opens an SSI index file associated with the already open
+ * sequence file <sqfp>. If successful, the necessary
+ * information about the open SSI file is stored internally
+ * in <sqfp>.
+ *
+ * The SSI index file name is determined in one of two
+ * ways, depending on whether a non-<NULL> <ssifile_hint>
+ * is provided.
+ *
+ * If <ssifile_hint> is <NULL>, the default for
+ * constructing the SSI filename from the sequence
+ * filename, by using exactly the same path (if any) for
+ * the sequence filename, and appending the suffix <.ssi>.
+ * For example, the SSI index for <foo> is <foo.ssi>, for
+ * <./foo.fa> is <./foo.fa.ssi>, and for
+ * </my/path/to/foo.1.fa> is </my/path/to/foo.1.fa.ssi>.
+ *
+ * If <ssifile_hint> is <non-NULL>, this exact fully
+ * qualified path is used as the SSI file name.
+ *
+ * Returns: <eslOK> on success, and <sqfp->ssi> is now internally
+ * valid.
+ *
+ * <eslENOTFOUND> if no SSI index file is found;
+ * <eslEFORMAT> if it's found, but appears to be in incorrect format;
+ * <eslERANGE> if the SSI file uses 64-bit offsets but we're on
+ * a system that doesn't support 64-bit file offsets.
+ *
+ * Throws: <eslEINVAL> if the open sequence file <sqfp> doesn't
+ * correspond to a normal sequence flatfile -- we can't
+ * random access in .gz compressed files, standard input,
+ * or multiple alignment files that we're reading
+ * sequentially.
+ *
+ * Throws <eslEMEM> on allocation error.
+ */
+static int
+sqascii_OpenSSI(ESL_SQFILE *sqfp, const char *ssifile_hint)
+{
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->do_gzip) ESL_EXCEPTION(eslEINVAL, "can't open an SSI index for a .gz compressed seq file");
+ if (ascii->do_stdin) ESL_EXCEPTION(eslEINVAL, "can't open an SSI index for standard input");
+ if (ascii->afp != NULL) ESL_EXCEPTION(eslEINVAL, "can't open an SSI index for sequential input from an MSA");
+
+ if (ssifile_hint == NULL) {
+ if ((status = esl_strdup(sqfp->filename, -1, &(ascii->ssifile))) != eslOK) return status;
+ if ((status = esl_strcat(&(ascii->ssifile), -1, ".ssi", 4)) != eslOK) return status;
+ } else {
+ if ((status = esl_strdup(ssifile_hint, -1, &(ascii->ssifile))) != eslOK) return status;
+ }
+
+ return esl_ssi_Open(ascii->ssifile, &(ascii->ssi));
+}
+
+
+
+/* Function: sqascii_PositionByKey()
+ * Synopsis: Use SSI to reposition seq file to a particular sequence.
+ *
+ * Purpose: Reposition <sqfp> so that the next sequence we read will
+ * be the one named (or accessioned) <key>.
+ *
+ * <sqfp->linenumber> is reset to be relative to the start
+ * of the record named <key>, rather than the start of the
+ * file.
+ *
+ * Returns: <eslOK> on success, and the file <sqfp> is repositioned
+ * so that the next <esl_sqio_Read()> call will read the
+ * sequence named <key>.
+ *
+ * Returns <eslENOTFOUND> if <key> isn't found in the
+ * index; in this case, the position of <sqfp> in the file
+ * is unchanged.
+ *
+ * Returns <eslEFORMAT> if something goes wrong trying to
+ * read the index, almost certainly indicating a format
+ * problem in the SSI file.
+ *
+ * Returns <eslEOF> if, after repositioning, we fail to
+ * load the next line or buffer from the sequence file;
+ * this probably also indicates a format problem in the SSI
+ * file.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslEINVAL> if there's no open SSI index in <sqfp>;
+ * <eslESYS> if the <fseek()> fails.
+ *
+ * In all these cases, the state of <sqfp> becomes
+ * undefined, and the caller should not use it again.
+ */
+static int
+sqascii_PositionByKey(ESL_SQFILE *sqfp, const char *key)
+{
+ uint16_t fh;
+ off_t offset;
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->ssi == NULL) ESL_EXCEPTION(eslEINVAL,"Need an open SSI index to call esl_sqfile_PositionByKey()");
+ if ((status = esl_ssi_FindName(ascii->ssi, key, &fh, &offset, NULL, NULL)) != eslOK) return status;
+ return esl_sqfile_Position(sqfp, offset);
+}
+
+
+/* Function: sqascii_PositionByNumber()
+ * Synopsis: Use SSI to reposition by sequence number
+ *
+ * Purpose: Reposition <sqfp> so that the next sequence we
+ * read will be the <which>'th sequence, where <which>
+ * is <0..sqfp->ssi->nprimary-1>.
+ *
+ * <sqfp->linenumber> is reset to be relative to the start
+ * of the record named <key>, rather than the start of the
+ * file.
+ *
+ * Returns: <eslOK> on success, and the file <sqfp> is repositioned.
+ *
+ * Returns <eslENOTFOUND> if there is no sequence number
+ * <which> in the index; in this case, the position of
+ * <sqfp> in the file is unchanged.
+ *
+ * Returns <eslEFORMAT> if something goes wrong trying to
+ * read the index, almost certainly indicating a format
+ * problem in the SSI file.
+ *
+ * Returns <eslEOF> if, after repositioning, we fail to
+ * load the next line or buffer from the sequence file;
+ * this probably also indicates a format problem in the SSI
+ * file.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslEINVAL> if there's no open SSI index in <sqfp>;
+ * <eslESYS> if the <fseek()> fails.
+ *
+ * In all these cases, the state of <sqfp> becomes
+ * undefined, and the caller should not use it again.
+ */
+static int
+sqascii_PositionByNumber(ESL_SQFILE *sqfp, int which)
+{
+ uint16_t fh;
+ off_t offset;
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->ssi == NULL) ESL_EXCEPTION(eslEINVAL,"Need open SSI index to call esl_sqfile_PositionByNumber()");
+ if ((status = esl_ssi_FindNumber(ascii->ssi, which, &fh, &offset, NULL, NULL, NULL)) != eslOK) return status;
+ return esl_sqfile_Position(sqfp, offset);
+}
+
+
+/* Function: sqascii_Fetch()
+ * Synopsis: Fetch a complete sequence, using SSI indexing.
+ *
+ * Purpose: Fetch a sequence named (or accessioned) <key> from
+ * the repositionable, open sequence file <sqfp>.
+ * The open <sqfp> must have an open SSI index.
+ * The sequence is returned in <sq>.
+ *
+ * Returns: <eslOK> on soccess.
+ * <eslEINVAL> if no SSI index is present, or if <sqfp> can't
+ * be repositioned.
+ * <eslENOTFOUND> if <source> isn't found in the file.
+ * <eslEFORMAT> if either the index file or the sequence file
+ * can't be parsed, because of unexpected format issues.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+static int
+sqascii_Fetch(ESL_SQFILE *sqfp, const char *key, ESL_SQ *sq)
+{
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->ssi == NULL) ESL_FAIL(eslEINVAL, ascii->errbuf, "No SSI index for %s; can't fetch subsequences", sqfp->filename);
+ if ((status = sqascii_PositionByKey(sqfp, key)) != eslOK) return status;
+ if ((status = sqascii_Read(sqfp, sq)) != eslOK) return status;
+ return eslOK;
+}
+
+/* Function: sqascii_FetchInfo()
+ * Synopsis: Fetch a sequence's info, using SSI indexing.
+ *
+ * Purpose: Fetch a sequence named (or accessioned) <key> from
+ * the repositionable, open sequence file <sqfp>, reading
+ * all info except the sequence (and secondary structure).
+ * The open <sqfp> must have an open SSI index.
+ * The sequence info is returned in <sq>.
+ *
+ * Returns: <eslOK> on soccess.
+ * <eslEINVAL> if no SSI index is present, or if <sqfp> can't
+ * be repositioned.
+ * <eslENOTFOUND> if <source> isn't found in the file.
+ * <eslEFORMAT> if either the index file or the sequence file
+ * can't be parsed, because of unexpected format issues.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+static int
+sqascii_FetchInfo(ESL_SQFILE *sqfp, const char *key, ESL_SQ *sq)
+{
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->ssi == NULL) ESL_FAIL(eslEINVAL, ascii->errbuf, "No SSI index for %s; can't fetch subsequences", sqfp->filename);
+ if ((status = sqascii_PositionByKey(sqfp, key)) != eslOK) return status;
+ if ((status = sqascii_ReadInfo(sqfp, sq)) != eslOK) return status;
+ return eslOK;
+}
+
+
+/* Function: sqascii_FetchSubseq()
+ * Synopsis: Fetch a subsequence, using SSI indexing.
+ *
+ * Purpose: Fetch subsequence <start..end> from a sequence named (or
+ * accessioned) <source>, in the repositionable, open sequence file <sqfp>.
+ * The open <sqfp> must have an SSI index. Put the
+ * subsequence in <sq>.
+ *
+ * As a special case, if <end> is 0, the subsequence is
+ * fetched all the way to the end, so you don't need to
+ * look up the sequence length <L> to fetch a suffix.
+ *
+ * The caller may want to rename/reaccession/reannotate the
+ * subsequence. Upon successful return, <sq->name> is set
+ * to <source/start-end>, and <sq->source> is set to
+ * <source> The accession and description <sq->acc> and
+ * <sq->desc> are set to the accession and description of
+ * the source sequence.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEINVAL> if no SSI index is present, or if <sqfp> can't
+ * be repositioned.
+ * <eslENOTFOUND> if <source> isn't found in the file.
+ * <eslEFORMAT> if either the index file or the sequence file
+ * can't be parsed, because of unexpected format issues.
+ * <eslERANGE> if the <start..end> coords don't lie entirely
+ * within the <source> sequence.
+ *
+ * Throws: <eslEMEM> on allocation errors.
+ */
+static int
+sqascii_FetchSubseq(ESL_SQFILE *sqfp, const char *source, int64_t start, int64_t end, ESL_SQ *sq)
+{
+ uint16_t fh;/* SSI file handle */
+ off_t r_off, d_off;
+ int64_t L;
+ int64_t actual_start;
+ int64_t nskip;
+ int64_t nres;
+ int64_t n;
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->ssi == NULL) ESL_FAIL(eslEINVAL, ascii->errbuf, "No SSI index for %s; can't fetch subsequences", sqfp->filename);
+
+ /* Find sequence info in the index */
+ status = esl_ssi_FindSubseq(ascii->ssi, source, start, &fh, &r_off, &d_off, &L, &actual_start);
+ if (status == eslENOTFOUND) ESL_FAIL(status, ascii->errbuf, "Didn't find sequence %s in the index", source);
+ else if (status == eslEFORMAT) ESL_FAIL(status, ascii->errbuf, "Failure reading SSI index; corrupt or bad format");
+ else if (status == eslERANGE) ESL_FAIL(status, ascii->errbuf, "Requested start %" PRIi64 " isn't in the sequence %s", start, source);
+ else if (status != eslOK) ESL_FAIL(status, ascii->errbuf, "Unexpected failure in finding subseq offset");
+
+ /* The special case of end=0, asking for suffix fetch */
+ if (end == 0) end = L;
+
+ /* Validate coords if we can */
+ if (start > end) ESL_FAIL(eslERANGE, ascii->errbuf, "Subsequence start %" PRIi64 " is greater than end %" PRIi64 "\n", start, end);
+ if (L > 0 && end > L) ESL_FAIL(eslERANGE, ascii->errbuf, "Subsequence end %" PRIi64 " is greater than length %" PRIi64 "\n", end, L);
+
+ /* Position the file at the record header; read the header info */
+ status = esl_sqfile_Position(sqfp, r_off);
+ if (status == eslEOF) ESL_FAIL(status, ascii->errbuf, "Position appears to be off the end of the file");
+ else if (status == eslEINVAL) ESL_FAIL(status, ascii->errbuf, "Sequence file is not repositionable");
+ else if (status != eslOK) ESL_FAIL(status, ascii->errbuf, "Failure in positioning sequence file");
+ if ((status = ascii->parse_header(sqfp, sq)) != eslOK) return status;
+
+ /* Position the file close to the subseq: either at the start of the line
+ * where the subseq starts, or exactly at the residue.
+ */
+ if (d_off != 0)
+ {
+ status = esl_sqfile_Position(sqfp, d_off);
+ if (status == eslEOF) ESL_FAIL(eslERANGE, ascii->errbuf, "Position appears to be off the end of the file");
+ else if (status == eslEINVAL) ESL_FAIL(status, ascii->errbuf, "Sequence file is not repositionable");
+ else if (status != eslOK) ESL_FAIL(status, ascii->errbuf, "Failure in positioning sequence file");
+ }
+ /* even if we didn't have a data offset, we're positioned at the
+ * start of the sequence anyway, because we parsed the full header
+ */
+ nskip = start - actual_start; /* how many residues do we still need to skip to reach start */
+ nres = end - start + 1; /* how many residues do we need to read as subseq */
+
+ if ((status = esl_sq_GrowTo(sq, nres)) != eslOK) return status;
+ status = read_nres(sqfp, sq, nskip, nres, &n);
+ if (status != eslOK || n < nres) ESL_EXCEPTION(eslEINCONCEIVABLE, "Failed to fetch subsequence residues -- corrupt coords?");
+
+ /* Set the coords */
+ sq->start = start;
+ sq->end = end;
+ sq->C = 0;
+ sq->W = sq->n;
+ sq->L = (L > 0 ? L : -1);
+ esl_sq_FormatName(sq, "%s/%d-%d", source, start, end);
+ esl_sq_SetSource (sq, source);
+ return eslOK;
+}
+#endif /*eslAUGMENT_SSI*/
+/*------------- end, random sequence access with SSI -------------------*/
+
+
+/*****************************************************************
+ * 6. Internal routines shared by parsers
+ *****************************************************************/
+
+
+/* loadmem()
+ *
+ * Load the next block of data from stream into mem buffer,
+ * either concatenating to previous buffer (if we're recording) or
+ * overwriting (if not).
+ *
+ * This block is loaded at sqfp->mem + sqfp->mpos.
+ *
+ * Upon return:
+ * sqfp->mem now contains up to eslREADBUFSIZE more chars
+ * sqfp->mpos is position of first byte in newly read block
+ * sqfp->allocm may have increased by eslREADBUFSIZE, if we concatenated
+ * sqfp->mn is # of chars in <mem>; <mn-1> is pos of last byte in new block
+ *
+ * Returns <eslEOF> (and mpos == mn) if no new data can be read;
+ * Returns <eslOK> (and mpos < mn) if new data is read.
+ * Throws <eslEMEM> on allocation error.
+ */
+static int
+loadmem(ESL_SQFILE *sqfp)
+{
+ void *tmp;
+ int n = 0;
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->do_buffer)
+ {
+ ascii->mpos = 0;
+ ascii->mn = 0;
+ }
+ else if (ascii->is_recording == TRUE)
+ {
+ if (ascii->mem == NULL) ascii->moff = ftello(ascii->fp); /* first time init of the offset */
+ ESL_RALLOC(ascii->mem, tmp, sizeof(char) * (ascii->allocm + eslREADBUFSIZE));
+ ascii->allocm += eslREADBUFSIZE;
+ n = fread(ascii->mem + ascii->mpos, sizeof(char), eslREADBUFSIZE, ascii->fp);
+ ascii->mn += n;
+ }
+ else
+ {
+ if (ascii->mem == NULL) {
+ ESL_ALLOC(ascii->mem, sizeof(char) * eslREADBUFSIZE);
+ ascii->allocm = eslREADBUFSIZE;
+ }
+ ascii->is_recording = -1;/* no more recording is possible now */
+ ascii->mpos = 0;
+ ascii->moff = ftello(ascii->fp);
+ n = fread(ascii->mem, sizeof(char), eslREADBUFSIZE, ascii->fp); /* see note [1] below */
+ ascii->mn = n;
+ }
+ return (n == 0 ? eslEOF : eslOK);
+
+ ERROR:
+ return status;
+}
+
+/* [1] Be alert for a possible problem above in that fread().
+ * Farrar had inserted an alternative case as follows:
+ * "If we are reading from stdin, buffered read cannot be used
+ * because if will block until EOF or the buffer is full, ie
+ * eslREADBUFSIZE characters have been read. Usually this would
+ * not be a problem, unless stdin is from a pipe. In that case
+ * if the sequence is less than eslREADBUFSIZE we would block.
+ *
+ * NOTE: any changes to the IO stream ascii->fp, such as fseek,
+ * might not have any affect on the file descriptor for the stream.
+ *
+ * if (ascii->do_stdin) {
+ * n = read(fileno(ascii->fp), ascii->mem, eslREADBUFSIZE);
+ * } else {
+ * ...
+ *
+ * but that's a bug, because you can't mix read and fread;
+ * the i17-stdin.pl test fails, in particular.
+ */
+
+
+
+
+/* loadbuf()
+ * Set sqfp->buf to contain next line of data, or point to next block.
+ * This might just mean working with previously buffered memory in <sqfp->mem>
+ * or might require reading new data from <sqfp->fp>.
+ *
+ * Reset sqfp->boff to be the position of the start of the block/line.
+ * Reset sqfp->bpos to 0.
+ * Reset sqfp->nc to the number of chars (bytes) in the new block/line.
+ * Returns eslOK on success; eslEOF if there's no more data in the file.
+ * (sqfp->nc == 0 is the same as eslEOF: no data in the new buffer.)
+ * Can throw an <eslEMEM> error.
+ */
+static int
+loadbuf(ESL_SQFILE *sqfp)
+{
+ void *tmp;
+ char *nlp;
+ int n;
+ int status = eslOK;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (! ascii->is_linebased)
+ {
+ if (ascii->mpos >= ascii->mn) {
+ if ((status = loadmem(sqfp)) == eslEMEM) return status;
+ }
+ ascii->buf = ascii->mem + ascii->mpos;
+ ascii->boff = ascii->moff + ascii->mpos;
+ ascii->balloc = 0;
+ ascii->bpos = 0;
+ ascii->nc = ascii->mn - ascii->mpos;
+ ascii->mpos += ascii->mn;
+ }
+ else
+ { /* Copy next line from <mem> into <buf>. Might require new load(s) into <mem>. */
+ if (ascii->mpos >= ascii->mn) {
+ if ((status = loadmem(sqfp)) == eslEMEM) return status;
+ }
+ ascii->boff = ascii->moff + ascii->mpos;
+ ascii->nc = 0;
+ nlp = memchr(ascii->mem + ascii->mpos, '\n', ascii->mn - ascii->mpos);
+ while (nlp == NULL)
+ {
+ n = ascii->mn - ascii->mpos;
+ while (ascii->nc + n + 1 > ascii->balloc) { /* +1: it'll hold the terminal \0 */
+ ESL_RALLOC(ascii->buf, tmp, sizeof(char) * (ascii->balloc + eslREADBUFSIZE));
+ ascii->balloc += eslREADBUFSIZE;
+ }
+ memcpy(ascii->buf + ascii->nc, ascii->mem + ascii->mpos, n);
+ ascii->mpos += n;
+ ascii->nc += n;
+ status = loadmem(sqfp);
+ if (status == eslEOF) { break; }
+ else if (status != eslOK) return status;
+ nlp = memchr(ascii->mem + ascii->mpos, '\n', ascii->mn - ascii->mpos);
+ }
+ if (status != eslEOF) {
+ n = nlp - (ascii->mem + ascii->mpos) + 1; /* inclusive of \n */
+ if (ascii->nc + n + 1 > ascii->balloc) {
+ ESL_RALLOC(ascii->buf, tmp, sizeof(char) * (ascii->balloc + eslREADBUFSIZE));
+ ascii->balloc += eslREADBUFSIZE;
+ }
+ memcpy(ascii->buf + ascii->nc, ascii->mem + ascii->mpos, n);
+ ascii->mpos += n;
+ ascii->nc += n;
+ }
+ ascii->bpos = 0;
+ ascii->buf[ascii->nc] = '\0';
+ }
+ return (ascii->nc == 0 ? eslEOF : eslOK);
+
+ERROR:
+ return status;
+}
+
+/* nextchar()
+ *
+ * Load next char from sqfp->buf into <*ret_c> and sets sqfp->bpos to
+ * its position; usually this is c = sqfp->buf[++sqfp->bpos], but
+ * we will refill the buffer w/ fresh fread() when needed, in which
+ * case c = sqfp->buf[0] and sqfp->bpos = 0.
+ *
+ * Returns <eslOK> on success.
+ * Return <eslEOF> if we ran out of data in <sqfp>.
+ * May throw an <eslEMEM> error.
+ */
+static int
+nextchar(ESL_SQFILE *sqfp, char *ret_c)
+{
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ ascii->bpos++;
+ if (ascii->nc == ascii->bpos && (status = loadbuf(sqfp)) != eslOK) return status;
+ *ret_c = ascii->buf[ascii->bpos];
+ return eslOK;
+}
+
+/* seebuf()
+ *
+ * Examine and validate the current buffer <sqfp->buf> from its
+ * current position <sqfp->bpos> until either the buffer ends (we run
+ * out of characters) or the sequence data ends (we see whatever
+ * character indicates EOD in this format) or we've seen <maxn>
+ * residues. If <maxn> is passed as -1, parse the entire buffer,
+ * without a residue limit.
+ *
+ * There are three possible outcomes:
+ * <eslOK>: The buffer is all residues that belong to the current
+ * seq we're parsing (or chars we can ignore), at least
+ * up to the <maxn> residue limit (if present).
+ * <eslEOD>: Part of the buffer may be residues, but the current sequence
+ * ends in this buffer (before <maxn> was reached).
+ * <eslEFORMAT>: Somewhere before we reached the end of the buffer or
+ * the sequence record, we saw an illegal character.
+ *
+ * On <eslOK>:
+ * *opt_nres is the number of residues in the buffer (up to <maxn>)
+ * *opt_endpos is sqfp->nc (off the end of the buffer by one)
+ * The caller will want to deal with the buffer, then load the next one.
+ *
+ * On <eslEOD>: same as OK, except:
+ * *opt_endpos is where sqfp->bpos *would* be at when we saw the EOD
+ * signal (the next '>', in FASTA files) had we been parsing residues
+ * Therefore on EOD, the caller will want to deal with the <*opt_nres>
+ * residues in this buffer, then reposition the buffer by
+ * <sqfp->bpos = *opt_epos> (without reloading the buffer), so
+ * the next read will pick up there.
+ *
+ * On <eslEFORMAT>:
+ * ascii->errbuf contains informative message about the format error.
+ *
+ * seebuf() also handles linenumber and SSI bookkeeping in
+ * <sqfp>. Every newline character seen increments <linenumber> (thus,
+ * on EFORMAT return, linenumber is set to the line on which the bad
+ * char occurred). <curbpl>,<currpl>,<prvbpl>,<prvrpl> keep track of # of bytes,
+ * residues on the current,prev line; they keep state across calls to seebuf().
+ * <bpl>,<rpl> are tracking whether there's a constant number of
+ * bytes/residues per line; these are either -1 for "not set yet", 0
+ * for "no, not constant", or a number > 0. Because of this bookkeeping, it's important
+ * to make sure that <seebuf()> never counts the same byte twice (hence
+ * the need for the <maxn> limit, which ReadWindow() uses.)
+ */
+static int
+seebuf(ESL_SQFILE *sqfp, int64_t maxn, int64_t *opt_nres, int64_t *opt_endpos)
+{
+ int bpos;
+ int64_t nres = 0;
+ int64_t nres2 = 0;/* an optimization for determining lastrpl from nres, without incrementing lastrpl on every char */
+ int sym;
+ ESL_DSQ x;
+ int lasteol;
+ int status = eslOK;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ lasteol = ascii->bpos - 1;
+ if (maxn == -1) maxn = ascii->nc; /* makes for a more efficient test. nc is a guaranteed upper bound on nres */
+
+ for (bpos = ascii->bpos; nres < maxn && bpos < ascii->nc; bpos++)
+ {
+ sym = ascii->buf[bpos];
+ //printf ("nres: %d, bpos: %d (%d)\n", nres, bpos, sym);
+ if (!isascii(sym)) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": non-ASCII character %c in sequence", ascii->linenumber, sym);
+ x = sqfp->inmap[sym];
+
+ if (x <= 127) nres++;
+ else if (x == eslDSQ_EOL)
+ {
+ if (ascii->curbpl != -1) ascii->curbpl += bpos - lasteol;
+ if (ascii->currpl != -1) ascii->currpl += nres - nres2;
+ nres2 += nres - nres2;
+
+ if (ascii->rpl != 0 && ascii->prvrpl != -1) { /* need to ignore counts on last line in record, hence cur/prv */
+ if (ascii->rpl == -1) ascii->rpl = ascii->prvrpl; /* init */
+ else if (ascii->prvrpl != ascii->rpl) ascii->rpl = 0; /* inval*/
+ }
+ if (ascii->bpl != 0 && ascii->prvbpl != -1) {
+ if (ascii->bpl == -1) ascii->bpl = ascii->prvbpl; /* init */
+ else if (ascii->prvbpl != ascii->bpl) ascii->bpl = 0; /* inval */
+ }
+
+ ascii->prvbpl = ascii->curbpl;
+ ascii->prvrpl = ascii->currpl;
+ ascii->curbpl = 0;
+ ascii->currpl = 0;
+ lasteol = bpos;
+ if (ascii->linenumber != -1) ascii->linenumber++;
+ }
+ else if (x == eslDSQ_ILLEGAL) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": illegal character %c", ascii->linenumber, sym);
+ else if (x == eslDSQ_EOD) { status = eslEOD; break; }
+ else if (x != eslDSQ_IGNORED) ESL_FAIL(eslEFORMAT, ascii->errbuf, "inmap corruption?");
+ }
+
+ if (ascii->curbpl != -1) ascii->curbpl += bpos - lasteol - 1;
+ if (ascii->currpl != -1) ascii->currpl += nres - nres2;
+ if (opt_nres != NULL) *opt_nres = nres;
+ if (opt_endpos != NULL) *opt_endpos = bpos;
+ return status;
+}
+
+/* addbuf()
+ * Add <nres> residues from the current buffer <sqfp->buf> to <sq>.
+ * This is designed to work when we're constructing a complete
+ * sequence (add the whole buffer); when we're adding a suffix
+ * of the buffer (<sqfp->bpos> is skipped ahead already);
+ * or when we're adding a prefix of the buffer (terminating a subseq
+ * or window load).
+ *
+ * The caller must know that there are at least <nres> residues in
+ * this buffer, and that all the characters are valid in the
+ * format and alphabet, via a previous call to <seebuf()>.
+ *
+ * The caller also must have already allocated <sq> to hold at least
+ * <nres> more residues.
+ *
+ * On input:
+ * sqfp->buf[] contains an fread() buffer
+ * sqfp->bpos is set to where we're going to start parsing residues
+ * sqfp->nc is the length of <buf>
+ *
+ * On return:
+ * sqfp->buf[] still contains the same buffer (no new freads here)
+ * sqfp->bpos is set after the last residue we parsed
+ * sq->seq/dsq now holds <nres> new residues
+ * sq->n is incremented by <nres>
+ */
+static void
+addbuf(ESL_SQFILE *sqfp, ESL_SQ *sq, int64_t nres)
+{
+ ESL_DSQ x;
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (sq->dsq != NULL)
+ {
+ while (nres) {
+ x = sq->abc->inmap[(int) ascii->buf[ascii->bpos++]];
+ if (x <= 127) { nres--; sq->dsq[++sq->n] = x; }
+ } /* we skipped IGNORED, EOL. EOD, ILLEGAL don't occur; seebuf() already checked */
+ }
+ else
+ {
+ while (nres) {
+ x = sqfp->inmap[(int) ascii->buf[ascii->bpos++]];
+ if (x <= 127) { nres--; sq->seq[sq->n++] = x; }
+ }
+ }
+}
+
+/* skipbuf()
+ * Like addbuf(), but we skip <nskip> residues instead of
+ * reading them.
+ */
+static void
+skipbuf(ESL_SQFILE *sqfp, int64_t nskip)
+{
+ ESL_DSQ x;
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ while (nskip) {
+ x = sqfp->inmap[(int) ascii->buf[ascii->bpos++]];
+ if (x <= 127) nskip--;/* skip IGNORED, EOL. */
+ }
+}
+
+
+/* skip_whitespace()
+ * Like skipbuf(), but instead of skipping a fixed number of
+ * residues, skip forward until one of three conditions is met:
+ *
+ * (1) end of the sequence record (a character indicating
+ * the beginning of a new sequence); set ascii->bpos
+ * to the beginning of the new record, and return eslEOD;
+ * (2) a non-whitespace character in the current sequence is
+ * reached that does not indicate the end of a sequence
+ * record; set ascii->bpos to that character's position,
+ * and return eslOK;
+ * (3) end of file; return eslEOF.
+ *
+ */
+static int
+skip_whitespace(ESL_SQFILE *sqfp)
+{
+ int status;
+ int c;
+ ESL_DSQ x;
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->nc == 0)
+ return eslEOF;
+
+ c = (int) ascii->buf[ascii->bpos];
+ x = sqfp->inmap[c];
+
+ while ( isspace(c) ) {
+
+ ascii->bpos++;
+
+ if (ascii->bpos == ascii->nc)
+ if ((status = loadbuf(sqfp)) == eslEOF)
+ return eslEOF;
+
+ c = (int) ascii->buf[ascii->bpos];
+ x = sqfp->inmap[c];
+ }
+ if (x == eslDSQ_EOD)
+ return eslEOD;
+
+ return eslOK;
+}
+
+
+
+/* read_nres()
+ * Read the next <nres> residues from <sqfp> after skipping <nskip> residues, then stop.
+ *
+ * Returns <eslOK> and <0 < *ret_actual_nres <= nres> if it succeeded, and
+ * there's more residues in the current seq record.
+ * Returns <eslEOD> and <*ret_actual_nres == 0> if no more residues are
+ * seen in the sequence record.
+ *
+ * Even on <eslEOD>, the <dsq/seq> is appropriately terminated here,
+ * and <sq->n> is left the way it was (no new residues added - but there
+ * may have been saved context C from a previous window).
+ *
+ * Returns <eslEFORMAT> on any parsing problem, and <ascii->errbuf> is set.
+ *
+ * On <eslOK>, sqfp->bpos is positioned on the next character past the last residue we store;
+ * on <eslEOD>, sqfp->bpos is positioned for reading the next sequence.
+ *
+ * FetchSubseq() uses this with <nskip>, <nres>, and expects an
+ * <eslOK> with <*opt_actual_nres = nres>. On <EOD>, or if fewer than
+ * <nres> residues are obtained, the coords must've been screwed up,
+ * because we didn't read the whole subseq we asked for.
+ *
+ * ReadWindow() on forward strand uses this with <nskip=0>, <nres=W>.
+ * The last window might normally return <eslEOD> with
+ * <*ret_actual_nres == 0>, and now <sqfp->bpos> is positioned at the
+ * start of the next sequence on <EOD>, and at the next residue on
+ * <OK>.
+ *
+ * ReadWindow() in reverse complement acts like a subseq fetch.
+ *
+ */
+static int
+read_nres(ESL_SQFILE *sqfp, ESL_SQ *sq, int64_t nskip, int64_t nres, int64_t *opt_actual_nres)
+{
+ int64_t n;
+ int64_t epos;
+ int64_t actual_nres = 0;
+ int status = eslOK;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+ status = seebuf(sqfp, nskip+nres, &n, &epos);
+ while (status == eslOK && nskip - n > 0) {
+ nskip -= n;
+ if ((status = loadbuf(sqfp)) == eslEOF) break;
+ status = seebuf(sqfp, nskip+nres, &n, &epos);
+ }
+
+ if (status == eslEOF) {
+ if (! ascii->eof_is_ok) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Premature EOF before end of seq record");
+ if (nskip > 0) ESL_EXCEPTION(eslECORRUPT, "premature EOD while trying to skip residues");
+ n = 0;
+ } else if (status == eslEOD) {
+ if (n < nskip) ESL_EXCEPTION(eslECORRUPT, "premature EOD while trying to skip residues");
+ } else if (status != eslOK)
+ return status;
+
+ skipbuf(sqfp, nskip);
+ n -= nskip;
+
+ while (status == eslOK && nres - n > 0)
+ {
+ addbuf(sqfp, sq, n);
+ actual_nres += n;
+ nres -= n;
+ if ((status = loadbuf(sqfp)) == eslEOF) break;
+ status = seebuf(sqfp, nres, &n, &epos);
+ }
+
+
+ if (status == eslEOF) {
+ if (! ascii->eof_is_ok) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Premature EOF before end of seq record");
+ n = 0;
+ } else if (status == eslEFORMAT) {
+ return status;
+ }
+
+ n = ESL_MIN(nres, n);
+ addbuf(sqfp, sq, n); /* bpos now at last residue + 1 if OK/EOD, 0 if EOF */
+ actual_nres += n;
+
+ if (sq->dsq != NULL) sq->dsq[sq->n+1] = eslDSQ_SENTINEL;
+ else sq->seq[sq->n] = '\0';
+
+ if (status == eslEOD) {
+ ascii->bpos = epos;
+ }
+
+ if (opt_actual_nres != NULL) *opt_actual_nres = actual_nres;
+ return (actual_nres == 0 ? eslEOD : eslOK);
+}
+/*--------------- end, buffer-based parsers --------------------*/
+
+
+/*****************************************************************
+ *# 7. Internal routines for EMBL format (including UniProt, TrEMBL)
+ *****************************************************************/
+/* EMBL and UniProt protein sequence database format.
+ * See: http://us.expasy.org/sprot/userman.html
+ * and: http://www.ebi.ac.uk/embl/Documentation/User_manual/usrman.html#3
+ * We use the same parser for both formats, so we have to be
+ * careful to only parse the conserved intersection of these two
+ * very similar formats.
+ */
+static void
+config_embl(ESL_SQFILE *sqfp)
+{
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ ascii->is_linebased = TRUE;
+ ascii->eof_is_ok = FALSE;/* records end with // */
+ ascii->parse_header = &header_embl;
+ ascii->skip_header = &skip_embl;
+ ascii->parse_end = &end_embl;
+}
+
+static void
+inmap_embl(ESL_SQFILE *sqfp, const ESL_DSQ *abc_inmap)
+{
+ int x;
+
+ if (abc_inmap != NULL) {
+ for (x = 0; x < 128; x++) sqfp->inmap[x] = abc_inmap[x];
+ } else {
+ for (x = 0; x < 128; x++) sqfp->inmap[x] = eslDSQ_ILLEGAL;
+ for (x = 'A'; x <= 'Z'; x++) sqfp->inmap[x] = x;
+ for (x = 'a'; x <= 'z'; x++) sqfp->inmap[x] = x;
+ }
+ for (x = '0'; x <= '9'; x++)
+ sqfp->inmap[x] = eslDSQ_IGNORED; /* EMBL DNA sequence format puts coordinates after each line */
+ sqfp->inmap['*'] = '*'; /* accept * as a nonresidue/stop codon character */
+ sqfp->inmap[' '] = eslDSQ_IGNORED;
+ sqfp->inmap['\t'] = eslDSQ_IGNORED;
+ sqfp->inmap['\n'] = eslDSQ_IGNORED;
+ sqfp->inmap['\r'] = eslDSQ_IGNORED;/* DOS eol compatibility */
+ sqfp->inmap['/'] = eslDSQ_EOD;
+}
+
+/* header_embl()
+ *
+ * See: http://us.expasy.org/sprot/userman.html
+ * And: http://www.ebi.ac.uk/embl/Documentation/User_manual/usrman.html#3
+ * Our parser must work on the highest common denominator of EMBL DNA
+ * and UniProt protein sequence files.
+ *
+ * sqfp->buf is the first (ID) line of the entry, or a blank line before
+ * it (in which case we'll scan forwards skipping blank lines to find
+ * the ID line).
+ *
+ * On success, returns <eslOK> and:
+ * sq->name contains sequence name (and may have been reallocated, changing sq->nalloc)
+ * sq->acc contains seq accession (and may have been reallocated, changing sq->aalloc)
+ * sq->desc contains description line (and may have been reallocated, changing sq->dalloc)
+ * sq->roff has been set to the record offset
+ * sq->doff has been set to the data offset (start of sequence line)
+ * sqfp->buf is the first seq line.
+ *
+ * If no more seqs are found in the file, returns <eslEOF>.
+ * On parse failure, returns <eslEFORMAT>, leaves as mesg in ascii->errbuf.
+ *
+ * May also throw <eslEMEM> on allocation errors.
+ */
+static int
+header_embl(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ char *s;
+ char *tok;
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ /* Find first line:
+ * "Each entry must begin with an identification line (ID)..."
+ * "The two-character line-type code that begins each line is always
+ * followed by three blanks..."
+ */
+ if (ascii->nc == 0) return eslEOF;
+ while (esl_str_IsBlank(ascii->buf)) {
+ if ((status = loadbuf(sqfp)) == eslEOF) return eslEOF; /* normal */
+ else if (status != eslOK) return status; /* abnormal */
+ }
+
+ /* ID line is defined as:
+ * ID ENTRY_NAME DATA_CLASS; MOLECULE_TYPE; SEQUENCE_LENGTH.
+ * We're only after the ENTRY_NAME.
+ * Examples:
+ * ID SNRPA_DROME STANDARD; PRT; 216 AA.
+ * ID SNRPA_DROME Reviewed; 216 AA.
+ * ID X06347; SV 1; linear; mRNA; STD; HUM; 1209 BP.
+ */
+ if (strncmp(ascii->buf, "ID ", 5) != 0) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": failed to find ID line", ascii->linenumber);
+
+ s = ascii->buf+5;
+ if ((status = esl_strtok(&s, " ;", &tok)) != eslOK)
+ ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": failed to parse name on ID line", ascii->linenumber);
+ if ((status = esl_sq_SetName(sq, tok)) != eslOK) return status;
+ sq->roff = ascii->boff;/* record the offset of the ID line */
+
+ /* Look for SQ line; parsing optional info as we go.
+ */
+ do {
+ if ((status = loadbuf(sqfp)) != eslOK) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": failed to find SQ line", ascii->linenumber);
+
+ /* "The format of the AC line is:
+ * AC AC_number_1;[ AC_number_2;]...[ AC_number_N;]
+ * Researchers who wish to cite entries in their publications
+ * should always cite the first accession number. This is
+ * commonly referred to as the 'primary accession
+ * number'."
+ *
+ * Examples:
+ * AC P43332; Q9W4D7;
+ * AC X06347;
+ *
+ * Note that Easel only stores primary accessions.
+ * Because there can be more than one accession line, we check to
+ * see if the accession is already set before storing a line.
+ */
+ if (strncmp(ascii->buf, "AC ", 5) == 0 && sq->acc[0] == '\0')
+ {
+ s = ascii->buf+5;
+ if ((status = esl_strtok(&s, ";", &tok)) != eslOK)
+ ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": failed to parse accession on AC line", ascii->linenumber);
+ if ((status = esl_sq_SetAccession(sq, tok)) != eslOK) return status;
+ }
+
+ /* "The format of the DE line is:
+ * DE Description.
+ * ...In cases where more than one DE line is required, the text is
+ * only divided between words and only the last DE line is
+ * terminated by a period."
+ *
+ * Examples:
+ * DE U1 small nuclear ribonucleoprotein A (U1 snRNP protein A) (U1-A) (Sex
+ * DE determination protein snf).
+ *
+ * DE Human mRNA for U1 small nuclear RNP-specific A protein
+ *
+ * DE RecName: Full=U1 small nuclear ribonucleoprotein A;
+ * DE Short=U1 snRNP protein A;
+ * DE Short=U1-A;
+ * DE AltName: Full=Sex determination protein snf;
+ *
+ * We'll make no attempt to parse the structured UniProt description header,
+ * for the moment.
+ */
+ if (strncmp(ascii->buf, "DE ", 5) == 0)
+ {
+ s = ascii->buf+5;
+ esl_strchop(s, ascii->nc-5);
+ if ((status = esl_sq_AppendDesc(sq, s)) != eslOK)
+ ESL_FAIL(status, ascii->errbuf, "Line %" PRId64 ": failed to parse description on DE line", ascii->linenumber);
+ }
+
+ /* UniProt: "The format of the SQ line is:
+ * SQ SEQUENCE XXXX AA; XXXXX MW; XXXXXXXXXXXXXXXX CRC64;"
+ * EMBL: "The SQ (SeQuence header) line marks the beginning of
+ * the sequence data and Gives a summary of its content.
+ * An example is:
+ * SQ Sequence 1859 BP; 609 A; 314 C; 355 G; 581 T; 0 other;"
+ *
+ * We don't parse this line; we just look for it as the last line
+ * before the sequence starts.
+ */
+ } while (strncmp(ascii->buf, "SQ ", 5) != 0);
+
+ if (loadbuf(sqfp) != eslOK) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Failed to find any sequence");
+ sq->hoff = ascii->boff - 1;
+ sq->doff = ascii->boff;
+ return eslOK;
+}
+
+/* skip_embl()
+ *
+ * Skip past the EMBL header and position to start of the sequence line.
+ *
+ * On success, returns <eslOK> and:
+ * sq->roff has been set to the record offset
+ * sq->doff has been set to the data offset (start of sequence line)
+ * sqfp->buf is the first seq line.
+ *
+ * If no more seqs are found in the file, returns <eslEOF>.
+ * On parse failure, returns <eslEFORMAT>, leaves as mesg in ascii->errbuf.
+ *
+ * May also throw <eslEMEM> on allocation errors.
+ */
+static int
+skip_embl(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ /* Find first line:
+ * "Each entry must begin with an identification line (ID)..."
+ * "The two-character line-type code that begins each line is always
+ * followed by three blanks..."
+ */
+ if (ascii->nc == 0) return eslEOF;
+ while (esl_str_IsBlank(ascii->buf)) {
+ if ((status = loadbuf(sqfp)) == eslEOF) return eslEOF; /* normal */
+ else if (status != eslOK) return status; /* abnormal */
+ }
+
+ /* ID line */
+ if (strncmp(ascii->buf, "ID ", 5) != 0) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": failed to find ID line", ascii->linenumber);
+
+ sq->roff = ascii->boff;/* record the offset of the ID line */
+
+ /* zero out the name, accession and description */
+ sq->name[0] = '\0';
+ sq->acc[0] = '\0';
+ sq->desc[0] = '\0';
+
+ /* Look for SQ line; parsing optional info as we go. */
+ do {
+ if ((status = loadbuf(sqfp)) != eslOK) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": failed to find SQ line", ascii->linenumber);
+ } while (strncmp(ascii->buf, "SQ ", 5) != 0);
+
+ if (loadbuf(sqfp) != eslOK) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Failed to find any sequence");
+ sq->hoff = ascii->boff - 1;
+ sq->doff = ascii->boff;
+ return eslOK;
+}
+
+static int
+end_embl(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (strncmp(ascii->buf, "//", 2) != 0) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": did not find // terminator at end of seq record", ascii->linenumber);
+ sq->eoff = ascii->boff + ascii->nc - 1;
+ status = loadbuf(sqfp);
+ if (status == eslEOF) return eslOK; /* ok, actually. */
+ else if (status == eslOK) return eslOK;
+ else return status;
+}
+
+/*---------------------- EMBL format ---------------------------------*/
+
+
+
+/*****************************************************************
+ *# 8. Internal routines for GenBank format
+ *****************************************************************/
+/* NCBI GenBank sequence database format.
+ * See GenBank release notes; for example,
+ * ftp://ftp.ncbi.nih.gov/genbank/gbrel.txt
+ */
+
+static void
+config_genbank(ESL_SQFILE *sqfp)
+{
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ ascii->is_linebased = TRUE;
+ ascii->eof_is_ok = FALSE;/* records end with // */
+ ascii->parse_header = &header_genbank;
+ ascii->skip_header = &skip_genbank;
+ ascii->parse_end = &end_genbank;
+}
+
+static void
+inmap_genbank(ESL_SQFILE *sqfp, const ESL_DSQ *abc_inmap)
+{
+ int x;
+
+ if (abc_inmap != NULL) {
+ for (x = 0; x < 128; x++) sqfp->inmap[x] = abc_inmap[x];
+ } else {
+ for (x = 0; x < 128; x++) sqfp->inmap[x] = eslDSQ_ILLEGAL;
+ for (x = 'A'; x <= 'Z'; x++) sqfp->inmap[x] = x;
+ for (x = 'a'; x <= 'z'; x++) sqfp->inmap[x] = x;
+ }
+ for (x = '0'; x <= '9'; x++)
+ sqfp->inmap[x] = eslDSQ_IGNORED;
+ sqfp->inmap['*'] = '*'; /* accept * as a nonresidue/stop codon character */
+ sqfp->inmap[' '] = eslDSQ_IGNORED;
+ sqfp->inmap['\t'] = eslDSQ_IGNORED;
+ sqfp->inmap['\n'] = eslDSQ_IGNORED;
+ sqfp->inmap['\r'] = eslDSQ_IGNORED;/* DOS eol compatibility */
+ sqfp->inmap['/'] = eslDSQ_EOD;
+}
+
+/* header_genbank()
+ *
+ * sqfp->buf is the first (LOCUS) line of the entry, or a line before
+ * it (in which case we'll scan forwards to find the LOCUS line - even
+ * skipping non-blank lines, because there are sometimes headers at
+ * the start of GenBank files).
+ *
+ * On success, returns <eslOK> and:
+ * sq->name contains sequence name (and may have been reallocated, changing sq->nalloc)
+ * sq->acc contains seq accession (and may have been reallocated, changing sq->aalloc)
+ * sq->desc contains description line (and may have been reallocated, changing sq->dalloc)
+ * sq->roff has been set to the record offset
+ * sq->doff has been set to the data offset (start of sequence line)
+ * sqfp->buf is the first seq line.
+ *
+ * If no more seqs are found in the file, returns <eslEOF>.
+ * On parse failure, returns <eslEFORMAT>, leaves as mesg in ascii->errbuf.
+ *
+ * May also throw <eslEMEM> on allocation errors.
+ */
+static int
+header_genbank(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ char *s;
+ char *tok;
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ /* Find LOCUS line, allowing for ignoration of a file header. */
+ if (ascii->nc == 0) return eslEOF;
+ while (strncmp(ascii->buf, "LOCUS ", 8) != 0) {
+ if ((status = loadbuf(sqfp)) == eslEOF) return eslEOF; /* normal */
+ else if (status != eslOK) return status; /* abnormal */
+ }
+
+ s = ascii->buf+12;
+ if ((status = esl_strtok(&s, " ", &tok)) != eslOK)
+ ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": failed to parse name on LOCUS line", ascii->linenumber);
+ if ((status = esl_sq_SetName(sq, tok)) != eslOK) return status;
+ sq->roff = ascii->boff;/* record the disk offset to the LOCUS line */
+
+ /* Look for ORIGIN line, parsing optional info as we go. */
+ do {
+ if ((status = loadbuf(sqfp)) != eslOK) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Failed to find ORIGIN line");
+
+ /* Optional VERSION line is parsed as "accession". */
+ if (strncmp(ascii->buf, "VERSION ", 10) == 0)
+ {
+ s = ascii->buf+12;
+ if ((status = esl_strtok(&s, " ", &tok)) != eslOK)
+ ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": failed to parse VERSION line", ascii->linenumber);
+ if ((status = esl_sq_SetAccession(sq, tok)) != eslOK) return status;
+ }
+
+ /* Optional DEFINITION Line is parsed as "description". */
+ if (strncmp(ascii->buf, "DEFINITION ", 11) == 0)
+ {
+ s = ascii->buf+12;
+ esl_strchop(s, ascii->nc-12);
+ if ((status = esl_sq_AppendDesc(sq, s)) != eslOK)
+ ESL_FAIL(status, ascii->errbuf, "Line %" PRId64 ": failed to parse desc on DEFINITION line", ascii->linenumber);
+ }
+ } while (strncmp(ascii->buf, "ORIGIN", 6) != 0);
+
+ if (loadbuf(sqfp) != eslOK) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Failed to find any sequence");
+ sq->hoff = ascii->boff - 1;
+ sq->doff = ascii->boff;
+ return eslOK;
+}
+
+/* skip_genbank()
+ *
+ * Skip past the GenBank header and position to start of the sequence line.
+ *
+ * On success, returns <eslOK> and:
+ * sq->roff has been set to the record offset
+ * sq->doff has been set to the data offset (start of sequence line)
+ * sqfp->buf is the first seq line.
+ *
+ * If no more seqs are found in the file, returns <eslEOF>.
+ * On parse failure, returns <eslEFORMAT>, leaves as mesg in ascii->errbuf.
+ *
+ * May also throw <eslEMEM> on allocation errors.
+ */
+static int
+skip_genbank(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ /* Find LOCUS line, allowing for ignoration of a file header. */
+ if (ascii->nc == 0) return eslEOF;
+ while (strncmp(ascii->buf, "LOCUS ", 8) != 0) {
+ if ((status = loadbuf(sqfp)) == eslEOF) return eslEOF; /* normal */
+ else if (status != eslOK) return status; /* abnormal */
+ }
+
+ sq->roff = ascii->boff;/* record the disk offset to the LOCUS line */
+
+ /* zero out the name, accession and description */
+ sq->name[0] = '\0';
+ sq->acc[0] = '\0';
+ sq->desc[0] = '\0';
+
+ /* Look for ORIGIN line, parsing optional info as we go. */
+ do {
+ if ((status = loadbuf(sqfp)) != eslOK) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Failed to find ORIGIN line");
+ } while (strncmp(ascii->buf, "ORIGIN", 6) != 0);
+
+ if (loadbuf(sqfp) != eslOK) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Failed to find any sequence");
+ sq->hoff = ascii->boff - 1;
+ sq->doff = ascii->boff;
+ return eslOK;
+}
+
+static int
+end_genbank(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int status;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (strncmp(ascii->buf, "//", 2) != 0) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": did not find // terminator at end of seq record", ascii->linenumber);
+ sq->eoff = ascii->boff + ascii->nc - 1;
+ status = loadbuf(sqfp);
+ if (status == eslEOF) return eslOK; /* ok, actually; we'll detect EOF on next sq read */
+ else if (status == eslOK) return eslOK;
+ else return status;
+}
+/*----------------- end GenBank format -------------------------------*/
+
+
+
+/*****************************************************************
+ *# 9. Internal routines for FASTA format
+ *****************************************************************/
+
+static void
+config_fasta(ESL_SQFILE *sqfp)
+{
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ ascii->is_linebased = FALSE;
+ ascii->eof_is_ok = TRUE;
+ ascii->parse_header = &header_fasta;
+ ascii->skip_header = &skip_fasta;
+ ascii->parse_end = &end_fasta;
+}
+
+static void
+inmap_fasta(ESL_SQFILE *sqfp, const ESL_DSQ *abc_inmap)
+{
+ int x;
+
+ if (abc_inmap != NULL) {
+ for (x = 0; x < 128; x++) sqfp->inmap[x] = abc_inmap[x];
+ } else {
+ for (x = 0; x < 128; x++) sqfp->inmap[x] = eslDSQ_ILLEGAL;
+ for (x = 'A'; x <= 'Z'; x++) sqfp->inmap[x] = x;
+ for (x = 'a'; x <= 'z'; x++) sqfp->inmap[x] = x;
+ }
+ sqfp->inmap['*'] = '*'; /* accept * as a nonresidue/stop codon character */
+ sqfp->inmap[' '] = eslDSQ_IGNORED;
+ sqfp->inmap['\t'] = eslDSQ_IGNORED;
+ sqfp->inmap['\r'] = eslDSQ_IGNORED;/* DOS eol compatibility */
+ sqfp->inmap['\n'] = eslDSQ_EOL;
+ sqfp->inmap['>'] = eslDSQ_EOD;
+ /* \n is special - fasta reader detects it as an eol */
+}
+
+
+/* header_fasta()
+ *
+ * sqfp->buf[sqfp->bpos] is sitting at the start of a FASTA record, or
+ * at a space before it (in which case we'll advance, skipping whitespace,
+ * until a > is reached).
+ * Parse the header line, storing name and description in <sq>.
+ *
+ * On success, returns <eslOK> and:
+ * sq->name contains sequence name (and may have been reallocated, changing sq->nalloc)
+ * sq->desc contains description line (and may have been reallocated, changing sq->dalloc)
+ * sq->roff has been set to the record offset
+ * sq->doff has been set to the data offset (start of sequence line)
+ * sqfp->buf[sqfp->bpos] is sitting at the start of the seq line.
+ * sqfp->currpl,curbpl set to 0, to start bookkeeping data line lengths
+ *
+ * If no more seqs are found in the file, returns <eslEOF>.
+ * On parse failure, return <eslEFORMAT>, leaves as mesg in ascii->errbuf.
+ *
+ * May also throw <eslEMEM> on allocation errors.
+ */
+static int
+header_fasta(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ char c;
+ int status = eslOK;
+ void *tmp;
+ int pos;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ /* make sure there are characters in the buffer */
+ if (ascii->nc == ascii->bpos && (status = loadbuf(sqfp)) != eslOK) return status;
+
+ c = ascii->buf[ascii->bpos];
+ while (status == eslOK && isspace(c)) status = nextchar(sqfp, &c); /* skip space (including \n) */
+
+ if (status == eslEOF) return eslEOF;
+
+ if (status == eslOK && c == '>') { /* accept the > */
+ sq->roff = ascii->boff + ascii->bpos; /* store SSI record offset */
+ status = nextchar(sqfp, &c);
+ } else if (c != '>') ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": unexpected char %c; expected FASTA to start with >", ascii->linenumber, c);
+
+ while (status == eslOK && (c == '\t' || c == ' ')) status = nextchar(sqfp, &c); /* skip space */
+
+ /* Store the name (space delimited) */
+ pos = 0;
+ while (status == eslOK && ! isspace(c))
+ {
+ sq->name[pos++] = c;
+ if (pos == sq->nalloc-1) { ESL_RALLOC(sq->name, tmp, sq->nalloc*2); sq->nalloc*=2; }
+ status = nextchar(sqfp, &c);
+ }
+ if (pos == 0) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": no FASTA name found", ascii->linenumber);
+ sq->name[pos] = '\0';
+
+ while (status == eslOK && (c == '\t' || c == ' ')) status = nextchar(sqfp, &c); /* skip space */
+
+ /* Store the description (end-of-line delimited) */
+ /* Patched to deal with NCBI NR desclines: delimit by ctrl-A (0x01) too. [SRE:H1/82] */
+ pos = 0;
+ while (status == eslOK && c != '\n' && c != '\r' && c != 1)
+ {
+ sq->desc[pos++] = c;
+ if (pos == sq->dalloc-1) { ESL_RALLOC(sq->desc, tmp, sq->dalloc*2); sq->dalloc*= 2; }
+ status = nextchar(sqfp, &c);
+ }
+ sq->desc[pos] = '\0';
+
+ /* Because of the NCBI NR patch, c might be0x01 ctrl-A now; skip to eol.
+ * (TODO: I'm worried about the efficiency of this nextchar() stuff. Revisit.)
+ */
+ while (status == eslOK && c != '\n' && c != '\r')
+ status = nextchar(sqfp, &c);
+ sq->hoff = ascii->boff + ascii->bpos;
+
+ while (status == eslOK && (c == '\n' || c == '\r')) status = nextchar(sqfp, &c); /* skip past eol (DOS \r\n, MAC \r, UNIX \n */
+ if (status != eslOK && status != eslEOF) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Unexpected failure in parsing FASTA name/description line");
+ /* Edge case: if the last sequence in the file is L=0, no residues, we are EOF now, not OK; but we'll return OK because we parsed the header line */
+
+ sq->doff = ascii->boff + ascii->bpos;
+ ascii->prvrpl = ascii->prvbpl = -1;
+ ascii->currpl = ascii->curbpl = 0;
+ ascii->linenumber++;
+ return eslOK;
+
+ ERROR:
+ return status;/* eslEMEM, from failed realloc */
+}
+
+/* skip_fasta()
+ *
+ * Skip past the fasta header and position to start of the sequence line.
+ *
+ * On success, returns <eslOK> and:
+ * sq->roff has been set to the record offset
+ * sq->doff has been set to the data offset (start of sequence line)
+ * sqfp->buf[sqfp->bpos] is sitting at the start of the seq line.
+ * sqfp->currpl,curbpl set to 0, to start bookkeeping data line lengths
+ *
+ * If no more seqs are found in the file, returns <eslEOF>.
+ * On parse failure, return <eslEFORMAT>, leaves as mesg in ascii->errbuf.
+ *
+ * May also throw <eslEMEM> on allocation errors.
+ */
+static int
+skip_fasta(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ char c;
+ int status = eslOK;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ c = ascii->buf[ascii->bpos];
+ while (status == eslOK && isspace(c)) status = nextchar(sqfp, &c); /* skip space (including \n) */
+
+ if (status == eslEOF) return eslEOF;
+ if (status != eslOK) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Unexpected parsing error %d", status);
+ if (c != '>') ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": unexpected char %c; expecting '>'", ascii->linenumber, c);
+
+ sq->roff = ascii->boff + ascii->bpos; /* store SSI record offset */
+
+ /* zero out the name, accession and description */
+ sq->name[0] = '\0';
+ sq->acc[0] = '\0';
+ sq->desc[0] = '\0';
+
+ status = nextchar(sqfp, &c);
+
+ /* skip to end of line */
+ while (status == eslOK && c != '\n' && c != '\r') status = nextchar(sqfp, &c);
+ sq->doff = ascii->boff + ascii->bpos;
+
+ /* skip past end of line */
+ while (status == eslOK && (c == '\n' || c == '\r')) status = nextchar(sqfp, &c);
+
+ if (status != eslOK) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Premature EOF in parsing FASTA name/description line");
+ sq->doff = ascii->boff + ascii->bpos;
+
+ ascii->linenumber++;
+ return eslOK;
+}
+
+
+static int
+end_fasta(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->bpos < ascii->nc) {
+ if (ascii->buf[ascii->bpos] != '>') ESL_FAIL(eslEFORMAT, ascii->errbuf, "Whoops, FASTA reader is corrupted");
+ sq->eoff = ascii->boff + ascii->bpos - 1; /* this puts eoff at the last \n */
+ } /* else, EOF, and we don't have to do anything. */
+ return eslOK;
+}
+
+
+/* Function: esl_sqascii_WriteFasta()
+ * Synopsis: Write a sequence in FASTA foramt
+ *
+ * Purpose: Write sequence <sq> in FASTA format to the open stream <fp>.
+ *
+ * If <save_offsets> is TRUE, then store record, data, and end
+ * offsets in <sq>; this ability is used by unit tests.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEWRITE> on system write error.
+ */
+int
+esl_sqascii_WriteFasta(FILE *fp, ESL_SQ *sq, int save_offsets)
+{
+ char buf[61];
+ int64_t pos;
+
+ if (save_offsets) sq->roff = ftello(fp);
+ if (fprintf(fp, ">%s", sq->name) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "fasta seq write failed");
+ if (sq->acc[0] != 0 && fprintf(fp, " %s", sq->acc) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "fasta seq write failed");
+ if (sq->desc[0] != 0 && fprintf(fp, " %s", sq->desc) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "fasta seq write failed");
+ if (save_offsets) sq->hoff = ftello(fp);
+ if (fputc('\n', fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "fasta seq write failed");
+
+ buf[60] = '\0';
+ if (save_offsets) sq->doff = ftello(fp);
+ for (pos = 0; pos < sq->n; pos += 60)
+ {
+ if (sq->dsq != NULL) esl_abc_TextizeN(sq->abc, sq->dsq+pos+1, 60, buf);
+ else strncpy(buf, sq->seq+pos, 60);
+ if (fprintf(fp, "%s\n", buf) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "fasta seq write failed");
+ }
+ if (save_offsets) sq->eoff = ftello(fp) - 1;
+ return eslOK;
+}
+/*------------------- end of FASTA i/o ---------------------------*/
+
+/*****************************************************************
+ *# 10. Internal routines for DAEMON format
+ *****************************************************************/
+
+/* Special case FASTA format where each sequence is terminated with "//".
+ *
+ * The use case is where the sequences are being read from a pipe and a
+ * way is needed to signal the end of the sequence so it can be processed.
+ * The next sequence might not be in the pipe, so the usual '>' is not
+ * present to signal the end of the sequence. Also, an EOF is not
+ * an option, since the daemon might run continuously.
+ */
+
+static void
+config_daemon(ESL_SQFILE *sqfp)
+{
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ ascii->is_linebased = FALSE;
+ ascii->eof_is_ok = FALSE;
+ ascii->parse_header = &header_fasta;
+ ascii->skip_header = &skip_fasta;
+ ascii->parse_end = &end_daemon;
+}
+
+static void
+inmap_daemon(ESL_SQFILE *sqfp, const ESL_DSQ *abc_inmap)
+{
+ int x;
+
+ if (abc_inmap != NULL) {
+ for (x = 0; x < 128; x++) sqfp->inmap[x] = abc_inmap[x];
+ } else {
+ for (x = 0; x < 128; x++) sqfp->inmap[x] = eslDSQ_ILLEGAL;
+ for (x = 'A'; x <= 'Z'; x++) sqfp->inmap[x] = x;
+ for (x = 'a'; x <= 'z'; x++) sqfp->inmap[x] = x;
+ }
+ sqfp->inmap['*'] = '*'; /* accept * as a nonresidue/stop codon character */
+ sqfp->inmap[' '] = eslDSQ_IGNORED;
+ sqfp->inmap['\t'] = eslDSQ_IGNORED;
+ sqfp->inmap['\r'] = eslDSQ_IGNORED;/* DOS eol compatibility */
+ sqfp->inmap['\n'] = eslDSQ_EOL;
+ sqfp->inmap['/'] = eslDSQ_EOD;
+ /* \n is special - fasta reader detects it as an eol */
+}
+
+
+/* end_daemon()
+ *
+ * Special case FASTA format where each sequence is terminated with "//".
+ *
+ * The use case is were the sequences are being read from a pipe and a
+ * way is needed to signal the end of the sequence so it can be processed.
+ */
+static int
+end_daemon(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ char c;
+
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ if (ascii->nc < 3) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Whoops, DAEMON input stream is corrupted");
+
+ c = ascii->buf[ascii->bpos++];
+ if (c != '/') ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": did not find // terminator at end of seq record", ascii->linenumber);
+
+ c = ascii->buf[ascii->bpos++];
+ if (c != '/') ESL_FAIL(eslEFORMAT, ascii->errbuf, "Line %" PRId64 ": did not find // terminator at end of seq record", ascii->linenumber);
+
+ /* skip to end of line */
+ while (c != '\n' && c != '\r' && ascii->bpos < ascii->nc) c = ascii->buf[ascii->bpos++];
+
+ /* skip past end of line */
+ while ((c == '\n' || c == '\r') && ascii->bpos < ascii->nc) c = ascii->buf[ascii->bpos++];
+
+ return eslOK;
+}
+
+
+/* esl_sqascii_Parse()
+ *
+ * Parse a sequence already read into a buffer.
+ */
+int
+esl_sqascii_Parse(char *buf, int size, ESL_SQ *sq, int format)
+{
+ int status;
+ int64_t epos;
+ int64_t n;
+
+ ESL_SQFILE sqfp;
+ ESL_SQASCII_DATA *ascii = &sqfp.data.ascii;
+
+ /* fill in a dummy esl_sqfile structure used to parse buf */
+ ascii->fp = NULL;
+ ascii->do_gzip = FALSE;
+ ascii->do_stdin = FALSE;
+ ascii->do_buffer = TRUE;
+
+ ascii->mem = buf;
+ ascii->allocm = 0;
+ ascii->mn = size;
+ ascii->mpos = 0;
+ ascii->moff = -1;
+ ascii->is_recording = FALSE;
+
+ ascii->buf = NULL;
+ ascii->boff = 0;
+ ascii->balloc = 0;
+ ascii->nc = 0;
+ ascii->bpos = 0;
+ ascii->L = 0;
+ ascii->linenumber = 1;
+
+ ascii->afp = NULL;
+ ascii->msa = NULL;
+ ascii->idx = -1;
+
+ ascii->ssifile = NULL;
+ ascii->rpl = -1;/* -1 = not set yet */
+ ascii->bpl = -1;/* (ditto) */
+ ascii->prvrpl = -1;/* (ditto) */
+ ascii->prvbpl = -1;/* (ditto) */
+ ascii->currpl = -1;
+ ascii->curbpl = -1;
+ ascii->ssi = NULL;
+
+ /* Configure the <sqfp>'s parser and inmaps for this format. */
+ switch (format) {
+ case eslSQFILE_EMBL:
+ case eslSQFILE_UNIPROT:
+ config_embl(&sqfp);
+ inmap_embl(&sqfp, NULL);
+ break;
+ case eslSQFILE_GENBANK:
+ case eslSQFILE_DDBJ:
+ config_genbank(&sqfp);
+ inmap_genbank(&sqfp, NULL);
+ break;
+ case eslSQFILE_FASTA:
+ config_fasta(&sqfp);
+ inmap_fasta(&sqfp, NULL);
+ break;
+ case eslSQFILE_DAEMON:
+ config_daemon(&sqfp);
+ inmap_daemon(&sqfp, NULL);
+ break;
+ default:
+ return eslEFORMAT;
+ }
+
+ /* Main case: read next seq from sqfp's stream */
+ if ((status = ascii->parse_header(&sqfp, sq)) != eslOK) return status; /* EOF, EFORMAT */
+
+ do {
+ if ((status = seebuf(&sqfp, -1, &n, &epos)) == eslEFORMAT) return status;
+ if (esl_sq_GrowTo(sq, sq->n + n) != eslOK) return eslEMEM;
+ addbuf(&sqfp, sq, n);
+ ascii->L += n;
+ sq->eoff = ascii->boff + epos - 1;
+ if (status == eslEOD) break;
+ } while ((status = loadbuf(&sqfp)) == eslOK);
+
+ if (status == eslEOF)
+ {
+ if (! ascii->eof_is_ok) ESL_FAIL(eslEFORMAT, ascii->errbuf, "Unexpected EOF; file truncated?");
+ if ((status = ascii->parse_end(&sqfp, sq)) != eslOK) return status;
+ }
+ else if (status == eslEOD)
+ {
+ ascii->bpos = epos;
+ if ((status = ascii->parse_end(&sqfp, sq)) != eslOK) return status;
+ }
+ else if (status != eslOK) return status;
+
+ if (sq->dsq != NULL) sq->dsq[sq->n+1] = eslDSQ_SENTINEL;
+ else sq->seq[sq->n] = '\0';
+ sq->start = 1;
+ sq->end = sq->n;
+ sq->C = 0;
+ sq->W = sq->n;
+ sq->L = sq->n;
+
+ if (ascii->balloc > 0) free(ascii->buf);
+
+ return eslOK;
+}
+/*-------------------- end of DAEMON ----------------------------*/
+
+/*****************************************************************
+ *# 11. Internal routines for HMMPGMD format
+ *****************************************************************/
+
+static int
+fileheader_hmmpgmd(ESL_SQFILE *sqfp)
+{
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+ char c;
+ int status = eslOK;
+
+ /* We've just loaded first buffer, after an Open. First char should be the # of the hmmpgmd file,
+ * but let's tolerate leading whitespace anyway
+ */
+ c = ascii->buf[ascii->bpos];
+ while (status == eslOK && isspace(c)) status = nextchar(sqfp, &c); /* skip space (including \n, \r) */
+ if (status == eslEOF) return eslEOF;
+
+ if (c != '#') ESL_FAIL(eslEFORMAT, ascii->errbuf, "hmmpgmd file expected to start with #");
+
+ /* skip first line; remainder of file is FASTA format */
+ while (status == eslOK && (c != '\n' && c != '\r')) status = nextchar(sqfp, &c);
+ if (status == eslEOF) return eslEOF;
+
+ /* next character read should be the '>' of the first FASTA record. We're properly positioned at "start of file". */
+ return eslOK;
+}
+/*-------------------- end of HMMPGMD ---------------------------*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
+
diff --git a/esl_sqio_ascii.h b/esl_sqio_ascii.h
new file mode 100644
index 0000000..3b8e47b
--- /dev/null
+++ b/esl_sqio_ascii.h
@@ -0,0 +1,102 @@
+/* Unaligned ascii sequence file i/o.
+ *
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslSQIO_ASCII_INCLUDED
+#define eslSQIO_ASCII_INCLUDED
+
+#include <stdio.h>
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef eslAUGMENT_MSA
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#endif
+
+/* set the max residue count to 1 meg when reading a block */
+#define MAX_RESIDUE_COUNT (1024 * 1024)
+
+/* forward declaration */
+struct esl_sqio_s;
+
+/* ESL_SQASCII:
+ * An open sequence file for reading.
+ */
+typedef struct esl_sqascii_s {
+
+ FILE *fp; /* Open file ptr */
+ char errbuf[eslERRBUFSIZE];/* parse error mesg. Size must match msa.h */
+
+ int do_gzip; /* TRUE if we're reading from gzip -dc pipe */
+ int do_stdin; /* TRUE if we're reading from stdin */
+ int do_buffer; /* TRUE if we're reading from a buffer */
+
+ /* all input first gets buffered in memory; this gives us enough
+ * recall to use Guess*() functions even in nonrewindable streams
+ */
+ char *mem; /* buffered input */
+ int allocm; /* <mem> size, multiples of eslREADBUFSIZE */
+ int mn; /* number of chars in <mem> (up to allocm) */
+ int mpos; /* pos of next <buf> to load from <mem> */
+ off_t moff; /* disk offset to start of <mem> */
+ int is_recording; /* TRUE if we need to keep buffering more */
+
+ /* input is either character-based [fread()] or line-based (esl_fgets())*/
+ char *buf; /* buffer for fread() or fgets() input */
+ off_t boff; /* disk offset to start of buffer */
+ int balloc; /* allocated size of buf */
+ int nc; /* #chars in buf (usually full, less at EOF)*/
+ int bpos; /* current position in the buffer (0..nc-1) */
+ int64_t L; /* #residues seen so far in current seq */
+ int64_t linenumber; /* What line of the file (1..N; -1=unknown)*/
+ off_t bookmark_offset; /* bookmark fwd position before reversing...*/
+ int64_t bookmark_linenum; /* in both linenumber and disk offset */
+
+ /* Format-specific configuration */
+ int is_linebased; /* TRUE for fgets() parsers; FALSE for fread() */
+ int eof_is_ok; /* TRUE if record can end on EOF */
+ int (*parse_header)(struct esl_sqio_s *, ESL_SQ *sq);
+ int (*skip_header) (struct esl_sqio_s *, ESL_SQ *sq);
+ int (*parse_end) (struct esl_sqio_s *, ESL_SQ *sq);
+
+ /* MSA augmentation confers reading MSA files as sequential seq files. */
+#if defined(eslAUGMENT_MSA)
+ ESL_MSAFILE *afp; /* open ESL_MSAFILE for reading */
+ ESL_MSA *msa; /* preloaded alignment to draw seqs from */
+ int idx; /* index of next seq to return, 0..nseq-1 */
+#else
+ void *afp; /* NULL */
+ void *msa; /* NULL */
+ int idx; /* 0 */
+#endif /*eslAUGMENT_MSA*/
+
+ /* SSI augmentation confers random access of records in a seq file */
+ char *ssifile; /* path to expected SSI index file */
+ int rpl; /* residues per line in file; -1=unset 0=inval*/
+ int bpl; /* bytes per line in file; -1=unset, 0=inval */
+ int currpl; /* residues on current line (-1=unknown) */
+ int curbpl; /* bytes on current line (-1=unknown) */
+ int prvrpl; /* residues on previous line */
+ int prvbpl; /* bytes on previous line */
+#if defined(eslAUGMENT_SSI)
+ ESL_SSI *ssi; /* open ESL_SSI index, or NULL if none */
+#else
+ void *ssi; /* NULL */
+#endif /*eslAUGMENT_SSI*/
+} ESL_SQASCII_DATA;
+
+
+extern int esl_sqascii_Open(char *seqfile, int format, struct esl_sqio_s *sqfp);
+extern int esl_sqascii_WriteFasta(FILE *fp, ESL_SQ *s, int update);
+extern int esl_sqascii_Parse(char *buf, int size, ESL_SQ *s, int format);
+
+
+#endif /*eslSQIO_ASCII_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_sqio_ncbi.c b/esl_sqio_ncbi.c
new file mode 100644
index 0000000..fb33826
--- /dev/null
+++ b/esl_sqio_ncbi.c
@@ -0,0 +1,3295 @@
+/* Unaligned ncbi sequence file i/o.
+ *
+ * Contents:
+ * 1. An <ESL_SQFILE> object, in text mode.
+ * 2. An <ESL_SQFILE> object, in digital mode. [with <alphabet>]
+ * 3. Miscellaneous routines.
+ * 4. Sequence reading (sequential).
+ * 5. Parsing routines
+ * 6. Copyright and license.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_ENDIAN_H
+#include <endian.h>
+#endif
+
+#include "easel.h"
+#ifdef eslAUGMENT_ALPHABET
+#include "esl_alphabet.h" /* alphabet aug adds digital sequences */
+#endif
+#include "esl_sqio.h"
+#include "esl_sq.h"
+
+#ifndef htobe32
+#ifdef WORDS_BIGENDIAN
+#define htobe32(x) (x)
+#else
+#define htobe32(x) \
+ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
+ (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
+#endif
+#endif
+
+/* format specific routines */
+static int sqncbi_Position (ESL_SQFILE *sqfp, off_t offset);
+static void sqncbi_Close (ESL_SQFILE *sqfp);
+static int sqncbi_SetDigital (ESL_SQFILE *sqfp, const ESL_ALPHABET *abc);
+static int sqncbi_GuessAlphabet (ESL_SQFILE *sqfp, int *ret_type);
+static int sqncbi_Read (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int sqncbi_ReadInfo (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int sqncbi_ReadSequence (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int sqncbi_ReadWindow (ESL_SQFILE *sqfp, int C, int W, ESL_SQ *sq);
+static int sqncbi_ReadBlock (ESL_SQFILE *sqfp, ESL_SQ_BLOCK *sqBlock, int max_residues, int max_sequences, int long_target);
+static int sqncbi_Echo (ESL_SQFILE *sqfp, const ESL_SQ *sq, FILE *ofp);
+
+static int sqncbi_IsRewindable (const ESL_SQFILE *sqfp);
+static const char *sqncbi_GetError (const ESL_SQFILE *sqfp);
+
+/* common routines for processing ncbi database */
+static int sqncbi_Open (ESL_SQNCBI_DATA *ncbi, char *filename);
+
+static void reset_db (ESL_SQNCBI_DATA *ncbi);
+static int pos_sequence (ESL_SQNCBI_DATA *ncbi, int inx);
+static int volume_open (ESL_SQNCBI_DATA *ncbi, int volume);
+static void reset_header_values (ESL_SQNCBI_DATA *ncbi);
+
+static int read_amino (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int read_dna (ESL_SQFILE *sqfp, ESL_SQ *sq);
+static int read_nres_amino (ESL_SQFILE *sqfp, ESL_SQ *sq, int len, uint64_t *nres);
+static int read_nres_dna (ESL_SQFILE *sqfp, ESL_SQ *sq, int len, uint64_t *nres);
+
+static int inmap_ncbi (ESL_SQFILE *sqfp);
+static int inmap_ncbi_amino (ESL_SQFILE *sqfp);
+static int inmap_ncbi_dna (ESL_SQFILE *sqfp);
+
+/* parsing routines */
+static int parse_header (ESL_SQNCBI_DATA *ncbi, ESL_SQ *sq);
+static int parse_def_line (ESL_SQNCBI_DATA *ncbi, ESL_SQ *sq);
+static int parse_seq_id (ESL_SQNCBI_DATA *ncbi);
+static int parse_textseq_id (ESL_SQNCBI_DATA *ncbi);
+static int parse_object_id (ESL_SQNCBI_DATA *ncbi);
+static int parse_dbtag (ESL_SQNCBI_DATA *ncbi);
+static int parse_patent_seq_id (ESL_SQNCBI_DATA *ncbi);
+static int parse_giimport_id (ESL_SQNCBI_DATA *ncbi);
+static int parse_id_pat (ESL_SQNCBI_DATA *ncbi);
+static int parse_pdb_seq_id (ESL_SQNCBI_DATA *ncbi);
+static int parse_date_std (ESL_SQNCBI_DATA *ncbi);
+static int parse_string (ESL_SQNCBI_DATA *ncbi, char **str, int *len);
+static int parse_integer (ESL_SQNCBI_DATA *ncbi, int *value);
+static int ignore_sequence_of_integer(ESL_SQNCBI_DATA *ncbi);
+
+#define INDEX_TABLE_SIZE 1024
+#define INIT_HDR_BUFFER_SIZE 2048
+
+#define NCBI_VERSION_4 4
+#define NCBI_DNA_DB 0
+#define NCBI_AMINO_DB 1
+
+/*****************************************************************
+ *# 1. An <ESL_SQFILE> object, in text mode.
+ *****************************************************************/
+
+/* Function: esl_sqncbi_Open()
+ * Synopsis: Open a sequence file for reading.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Open a sequence file <filename> for reading.
+ * The opened <ESL_SQFILE> is returned through <ret_sqfp>.
+ *
+ * The .pin, .phr and .psq files are required for the
+ * open function to succeed. Only ncbi version 4
+ * databases are currently supported.
+ *
+ * Returns: <eslOK> on success, and <*ret_sqfp> points to a new
+ * open <ESL_SQFILE>. Caller deallocates this object with
+ * <esl_sqfile_Close()>.
+ *
+ * Returns <eslENOTFOUND> if <filename> can't be found or
+ * opened. Returns <eslEFORMAT> if the file is empty, or
+ * if autodetection is attempted and the format can't be
+ * determined. On any error condition, <*ret_sqfp> is
+ * returned NULL.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_sqncbi_Open(char *filename, int format, ESL_SQFILE *sqfp)
+{
+ int i;
+ int status = eslOK; /* return status from an ESL call */
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ /* before we go any further, make sure we can handle the format */
+ if (format != eslSQFILE_NCBI && format != eslSQFILE_UNKNOWN) return eslENOTFOUND;
+
+ ncbi->fppin = NULL;
+ ncbi->fpphr = NULL;
+ ncbi->fppsq = NULL;
+
+ ncbi->title = NULL;
+ ncbi->timestamp = NULL;
+
+ ncbi->index = -1;
+
+ ncbi->hdr_off = -1;
+ ncbi->seq_off = -1;
+ ncbi->amb_off = -1;
+
+ ncbi->index_start = -1;
+ ncbi->index_end = -1;
+ ncbi->hdr_indexes = NULL;
+ ncbi->seq_indexes = NULL;
+ ncbi->amb_indexes = NULL;
+
+ ncbi->hdr_buf = NULL;
+ reset_header_values(ncbi);
+
+ ncbi->amb_off = 0;
+
+ ncbi->alphatype = eslUNKNOWN;
+ ncbi->alphasym = NULL;
+
+ ncbi->vol_index = -1;
+ ncbi->volumes = 0;
+
+ for (i = 0; i < MAX_DB_VOLUMES; ++i) {
+ ncbi->vols[i].name = NULL;
+ ncbi->vols[i].start_seq = -1;
+ ncbi->vols[i].end_seq = -1;
+ }
+
+ if ((status = sqncbi_Open(ncbi, filename)) != eslOK) goto ERROR;
+
+ sqfp->format = eslSQFILE_NCBI;
+ if ((status = inmap_ncbi(sqfp)) != eslOK) goto ERROR;
+
+ /* initialize the function pointers for the ncbi routines */
+ sqfp->position = &sqncbi_Position;
+ sqfp->close = &sqncbi_Close;
+
+ sqfp->set_digital = &sqncbi_SetDigital;
+ sqfp->guess_alphabet = &sqncbi_GuessAlphabet;
+
+ sqfp->is_rewindable = &sqncbi_IsRewindable;
+
+ sqfp->read = &sqncbi_Read;
+ sqfp->read_info = &sqncbi_ReadInfo;
+ sqfp->read_seq = &sqncbi_ReadSequence;
+ sqfp->read_window = &sqncbi_ReadWindow;
+ sqfp->echo = &sqncbi_Echo;
+
+ sqfp->read_block = &sqncbi_ReadBlock;
+
+ sqfp->get_error = &sqncbi_GetError;
+
+ return eslOK;
+
+ ERROR:
+ sqncbi_Close(sqfp);
+ return status;
+}
+
+/* sqncbi_ParseIndexFile()
+ *
+ * Parse an open index file verifying database type and version
+ * if handled. Read in the entries, i.e. name, number of sequences,
+ * etc. Keep track of the offsets where the header and sequence
+ * tables begin.
+ */
+static int
+sqncbi_ParseIndexFile(ESL_SQNCBI_DATA *ncbi, int dbtype)
+{
+ int len;
+ uint32_t info[4];
+ int status = eslOK; /* return status from an ESL call */
+
+ if (fread(&info[0], sizeof(uint32_t), 3, ncbi->fppin) != 3) status = eslFAIL;
+ if (htobe32(info[0]) != NCBI_VERSION_4) status = eslEFORMAT;
+ if (htobe32(info[1]) != dbtype) status = eslEUNIMPLEMENTED;
+
+ if (status != eslOK) goto ERROR;
+ ncbi->version = htobe32(info[0]);
+ ncbi->alphatype = (dbtype == NCBI_DNA_DB) ? eslDNA : eslAMINO;
+ ncbi->index = -1;
+
+ /* read the database title */
+ len = htobe32(info[2]);
+ ESL_ALLOC(ncbi->title, sizeof(char) * (len + 1));
+ if (fread(ncbi->title, sizeof(char), len, ncbi->fppin) != len) { status = eslFAIL; goto ERROR; }
+ ncbi->title[len] = 0;
+
+ /* read the database time stamp */
+ if (fread(&info[0], sizeof(uint32_t), 1, ncbi->fppin) != 1) { status = eslFAIL; goto ERROR; }
+ len = htobe32(info[0]);
+ ESL_ALLOC(ncbi->timestamp, sizeof(char) * (len + 1));
+ if (fread(ncbi->timestamp, sizeof(char), len, ncbi->fppin) != len) { status = eslFAIL; goto ERROR; }
+ ncbi->timestamp[len] = 0;
+
+ /* read in database stats */
+ if (fread(&info[0], sizeof(uint32_t), 4, ncbi->fppin) != 4) { status = eslFAIL; goto ERROR; }
+ ncbi->num_seq = htobe32(info[0]);
+ memcpy(&ncbi->total_res, info+1, sizeof(uint64_t));
+ ncbi->max_seq = htobe32(info[3]);
+
+ /* save the offsets to the index tables */
+ ncbi->hdr_off = ftell(ncbi->fppin);
+ ncbi->seq_off = ncbi->hdr_off + sizeof(uint32_t) * (ncbi->num_seq + 1);
+
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* sqncbi_DbOpen()
+ *
+ * Try to open the database files. On successful opening of
+ * the files, index, header and sequence, the index file is
+ * parsed for validity.
+ */
+static int
+sqncbi_DbOpen(ESL_SQNCBI_DATA *ncbi, char *filename, int dbtype)
+{
+ int status = eslOK; /* return status from an ESL call */
+ int len;
+
+ char *name = NULL;
+
+ len = strlen(filename);
+ ESL_ALLOC(name, sizeof(char) * (len+5));
+ strcpy(name, filename);
+
+ /* Check for basic database first */
+ strcpy(name+len, ".Xin");
+ name[len+1] = (dbtype == NCBI_DNA_DB) ? 'n' : 'p';
+ if ((ncbi->fppin = fopen(name, "rb")) == NULL) {
+ status = eslENOTFOUND;
+ goto ERROR;
+ }
+ strcpy(name+len, ".Xhr");
+ name[len+1] = (dbtype == NCBI_DNA_DB) ? 'n' : 'p';
+ if ((ncbi->fpphr = fopen(name, "rb")) == NULL) {
+ status = eslENOTFOUND;
+ goto ERROR;
+ }
+ strcpy(name+len, ".Xsq");
+ name[len+1] = (dbtype == NCBI_DNA_DB) ? 'n' : 'p';
+ if ((ncbi->fppsq = fopen(name, "rb")) == NULL) {
+ status = eslENOTFOUND;
+ goto ERROR;
+ }
+
+ /* parse the header make sure we are looking at a version 4 db. */
+ if ((status = sqncbi_ParseIndexFile(ncbi, dbtype)) != eslOK) goto ERROR;
+
+ if (name != NULL) free(name);
+
+ return eslOK;
+
+ ERROR:
+
+ reset_db(ncbi);
+
+ if (name != NULL) free(name);
+ return status;
+}
+
+
+/* sqncbi_AliasOpen()
+ *
+ * Opens an alias file parsing the DBLIST directive building
+ * a list of all the volumes makeing up this database. As each
+ * volume is successfully parsed, the name of the volume, number
+ * of sequences and offsets are kept for quick reference.
+ */
+static int
+sqncbi_AliasOpen(ESL_SQNCBI_DATA *ncbi, char *filename, int dbtype)
+{
+ int status = eslOK; /* return status from an ESL call */
+ int newline = 1;
+ int seqcnt = 0;
+ int rescnt = 0;
+ int done = 0;
+ int vol;
+ int len;
+
+ char *ptr = NULL;
+ char *name = NULL;
+ char buffer[80];
+
+ char *dbptr = NULL;
+ char *dbname = NULL;
+ int dbsize = 512;
+ int dblen = 0;
+
+ FILE *fp = NULL;
+
+ len = strlen(filename);
+ ESL_ALLOC(name, sizeof(char) * (len+5));
+ strcpy(name, filename);
+
+ /* Check for alias file */
+ strcpy(name+len, ".Xal");
+ name[len+1] = (dbtype == NCBI_DNA_DB) ? 'n' : 'p';
+ if ((fp = fopen(name, "r")) == NULL) {
+ status = eslENOTFOUND;
+ goto ERROR;
+ }
+
+ /* copy the filename */
+ dbsize = (dbsize > len) ? dbsize : len * 2;
+ ESL_ALLOC(dbname, sizeof(char) * dbsize);
+ strcpy(dbname, filename);
+
+ /* remove the filename keeping the path */
+ while (len > 0 && dbname[len-1] != eslDIRSLASH) {
+ dbname[len-1] = '\0';
+ --len;
+ }
+
+ /* find the DBLIST directive */
+ while (!done) {
+ ptr = buffer;
+ if (fgets(buffer, sizeof(buffer), fp) == NULL) {
+ status = eslEFORMAT;
+ goto ERROR;
+ }
+
+ if (newline) {
+ if (strncmp(buffer, "DBLIST", 6) == 0 && isspace(buffer[6])) {
+ done = 1;
+ ptr = buffer + 6;
+ }
+ }
+
+ /* skip to the end of the line */
+ if (!done) {
+ newline = 0;
+ while (*ptr != '\0') {
+ if (*ptr == '\n') newline = 1;
+ ++ptr;
+ }
+ }
+ }
+
+ /* parse the DBLIST line */
+ done = 0;
+ dblen = len;
+ while (!done) {
+
+ /* check if we hit the end of the buffer */
+ if (*ptr == '\0') {
+ ptr = buffer;
+ if (fgets(buffer, sizeof(buffer), fp) == NULL) {
+ status = eslEFORMAT;
+ goto ERROR;
+ }
+ }
+
+ /* skip spaces */
+ if (isspace(*ptr)) {
+ if (dblen > len) {
+ dbname[dblen++] = '\0';
+
+ /* if the name in the DBLIST directive was ablsolute, do not
+ * use the working directory as a prefix.
+ */
+ if (dbname[len] == eslDIRSLASH) {
+ dbptr = dbname + len;
+ } else {
+ dbptr = dbname;
+ }
+
+ status = sqncbi_DbOpen(ncbi, dbptr, dbtype);
+ if (status != eslOK) goto ERROR;
+
+ /* close any open files and free up allocations */
+ reset_db(ncbi);
+
+ /* if successful, copy the db information */
+ vol = ncbi->volumes++;
+
+ /* allocate the name of the string big enought so the buffer can
+ * handle an extension, i.e. ".pin" or ".nsq" tacked on to the end
+ * of it without reallocating.
+ */
+ ncbi->vols[vol].name = NULL;
+ ESL_ALLOC(ncbi->vols[vol].name, sizeof(char) * strlen(dbptr) + 5);
+ strcpy(ncbi->vols[vol].name, dbptr);
+
+ ncbi->vols[vol].start_seq = seqcnt;
+ ncbi->vols[vol].end_seq = seqcnt + ncbi->num_seq - 1;
+
+ ncbi->vols[vol].hdr_off = ncbi->hdr_off;
+ ncbi->vols[vol].seq_off = ncbi->seq_off;
+ ncbi->vols[vol].amb_off = ncbi->amb_off;
+
+ seqcnt += ncbi->num_seq;
+ rescnt += ncbi->total_res;
+
+ dblen = len;
+ }
+
+ done = *ptr == '\n' || *ptr == '\r';
+
+ ptr++;
+ } else {
+ dbname[dblen++] = *ptr++;
+ if (dblen >= dbsize - 1) {
+ char *t;
+ dbsize += dbsize;
+ ESL_RALLOC(dbname, t, dbsize);
+ }
+ }
+ }
+
+ /* reopen the first volume for processing */
+ if ((status = volume_open(ncbi, 0)) != eslOK) goto ERROR;
+
+ ncbi->num_seq = seqcnt;
+ ncbi->total_res = rescnt;
+
+ if (name != NULL) free(name);
+ if (dbname != NULL) free(dbname);
+
+ if (fp != NULL) fclose(fp);
+
+ return eslOK;
+
+ ERROR:
+
+ reset_db(ncbi);
+
+ if (fp != NULL) fclose(fp);
+
+ if (dbname != NULL) free(dbname);
+ if (name != NULL) free(name);
+
+ return status;
+}
+
+
+/* Function: sqncbi_Open()
+ * Synopsis: Open an ncbi database.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Open an ncbi database making sure all the necessry
+ * files are present. Parse the index file for database
+ * information filling in the ncbi data structure.
+ *
+ * Returns: <eslOK> on success, and the ncbi data structre is filled
+ * in with the database information.
+ *
+ * Returns <eslENOTFOUND> if <filename> can't be found or
+ * opened. Returns <eslEFORMAT> if the index file is an
+ * upsupported version.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+static int
+sqncbi_Open(ESL_SQNCBI_DATA *ncbi, char *filename)
+{
+ int status = eslOK; /* return status from an ESL call */
+ char *name = NULL;
+
+ /* first try to open a single protein database */
+ status = sqncbi_DbOpen(ncbi, filename, NCBI_AMINO_DB);
+
+ /* if the database was not found, look for protein volume */
+ if (status == eslENOTFOUND) {
+ status = sqncbi_AliasOpen(ncbi, filename, NCBI_AMINO_DB);
+ }
+
+ /* if nothing so far, try a dna database */
+ if (status == eslENOTFOUND) {
+ status = sqncbi_DbOpen(ncbi, filename, NCBI_DNA_DB);
+ }
+
+ /* still nothing, look for dna volume */
+ if (status == eslENOTFOUND) {
+ status = sqncbi_AliasOpen(ncbi, filename, NCBI_DNA_DB);
+ }
+
+ if (status != eslOK) goto ERROR;
+
+ /* allocate buffers used in parsing the database files */
+ ESL_ALLOC(ncbi->hdr_indexes, sizeof(uint32_t) * INDEX_TABLE_SIZE);
+ ESL_ALLOC(ncbi->seq_indexes, sizeof(uint32_t) * INDEX_TABLE_SIZE);
+
+ /* if this is a dna database we need to allocate space for the
+ * ambiguity offsets.
+ */
+ if (ncbi->alphatype == eslDNA) {
+ ncbi->amb_off = ncbi->seq_off + sizeof(uint32_t) * (ncbi->num_seq + 1);
+ ESL_ALLOC(ncbi->amb_indexes, sizeof(uint32_t) * INDEX_TABLE_SIZE);
+ }
+
+ ncbi->hdr_alloced = INIT_HDR_BUFFER_SIZE;
+ ESL_ALLOC(ncbi->hdr_buf, sizeof(unsigned char) * INIT_HDR_BUFFER_SIZE);
+
+ /* skip the first sentinal byte in the .psq file */
+ fgetc(ncbi->fppsq);
+
+ if (name != NULL) free(name);
+ return eslOK;
+
+ ERROR:
+ if (name != NULL) free(name);
+ return status;
+}
+
+
+/* Function: sqncbi_Position()
+ * Synopsis: Reposition an open sequence file to an offset.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Reposition an open <sqfp> to offset <offset>.
+ * <offset> for the ncbi db format specified the sequence
+ * index, not file offset. Both the sequence and header
+ * files are repositioned.
+ *
+ * Returns: <eslOK> on success;
+ *
+ * Throws: <eslESYS> if the fseeko() or fread() call fails.
+ * On errors, the state of <sqfp> is indeterminate, and
+ * it should not be used again.
+ */
+static int
+sqncbi_Position(ESL_SQFILE *sqfp, off_t offset)
+{
+ int status;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ status = pos_sequence(ncbi, offset);
+ return status;
+}
+
+/* Function: sqncbi_Close()
+ * Synopsis: Close a sequence file.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Closes an open <sqfp>.
+ *
+ * Returns: (void).
+ */
+static void
+sqncbi_Close(ESL_SQFILE *sqfp)
+{
+ int i;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ if (ncbi->title != NULL) free(ncbi->title);
+ if (ncbi->timestamp != NULL) free(ncbi->timestamp);
+
+ if (ncbi->hdr_buf != NULL) free(ncbi->hdr_buf);
+
+ if (ncbi->hdr_indexes != NULL) free(ncbi->hdr_indexes);
+ if (ncbi->seq_indexes != NULL) free(ncbi->seq_indexes);
+ if (ncbi->amb_indexes != NULL) free(ncbi->amb_indexes);
+
+ if (ncbi->alphasym != NULL) free(ncbi->alphasym);
+
+ if (ncbi->fppin != NULL) fclose(ncbi->fppin);
+ if (ncbi->fpphr != NULL) fclose(ncbi->fpphr);
+ if (ncbi->fppsq != NULL) fclose(ncbi->fppsq);
+
+ ncbi->vol_index = -1;
+ ncbi->volumes = 0;
+
+ for (i = 0; i < MAX_DB_VOLUMES; ++i) {
+ if (ncbi->vols[i].name != NULL) free(ncbi->vols[i].name);
+
+ ncbi->vols[i].name = NULL;
+ ncbi->vols[i].start_seq = -1;
+ ncbi->vols[i].end_seq = -1;
+ }
+
+ ncbi->fppin = NULL;
+ ncbi->fpphr = NULL;
+ ncbi->fppsq = NULL;
+
+ ncbi->title = NULL;
+ ncbi->timestamp = NULL;
+
+ ncbi->index = -1;
+
+ ncbi->hdr_off = -1;
+ ncbi->seq_off = -1;
+ ncbi->amb_off = -1;
+
+ ncbi->index_start = -1;
+ ncbi->index_end = -1;
+ ncbi->hdr_indexes = NULL;
+ ncbi->seq_indexes = NULL;
+ ncbi->amb_indexes = NULL;
+
+ ncbi->hdr_buf = NULL;
+
+ ncbi->alphatype = eslUNKNOWN;
+ ncbi->alphasym = NULL;
+
+ return;
+}
+/*------------------- SQNCBI open/close -----------------------*/
+
+
+/*****************************************************************
+ *# 2. An <ESL_SQFILE> object, in digital mode [with <alphabet>]
+ *****************************************************************/
+#ifdef eslAUGMENT_ALPHABET
+
+/* Function: sqncbi_SetDigital()
+ * Synopsis: Set an open <ESL_SQFILE> to read in digital mode.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Given an <ESL_SQFILE> that's already been opened,
+ * configure it to expect subsequent input to conform
+ * to the digital alphabet <abc>.
+ *
+ * Calling <esl_sqfile_Open(); esl_sqfile_SetDigital()> is
+ * equivalent to <esl_sqfile_OpenDigital()>. The two-step
+ * version is useful when you need a
+ * <esl_sqfile_GuessAlphabet()> call in between, guessing
+ * the file's alphabet in text mode before you set it to
+ * digital mode.
+ *
+ * Returns: <eslOK> on success.
+ */
+static int
+sqncbi_SetDigital(ESL_SQFILE *sqfp, const ESL_ALPHABET *abc)
+{
+ return eslOK;
+}
+
+/* Function: sqncbi_GuessAlphabet()
+ * Synopsis: Guess the alphabet of an open <ESL_SQFILE>.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: The only ncbi db format supported is protein.
+ *
+ * Returns: <eslOK> on success, and <*ret_type> is set to <eslAMINO>.
+ */
+static int
+sqncbi_GuessAlphabet(ESL_SQFILE *sqfp, int *ret_type)
+{
+ *ret_type = sqfp->data.ncbi.alphatype;
+ return eslOK;
+}
+#endif /*eslAUGMENT_ALPHABET*/
+/*-------------- end, digital mode SQNCBI -------------------*/
+
+
+
+
+/*****************************************************************
+ *# 3. Miscellaneous routines
+ *****************************************************************/
+
+/* Function: sqncbi_IsRewindable()
+ * Synopsis: Return <TRUE> if <sqfp> can be rewound.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Returns <TRUE> if <sqfp> can be rewound (positioned
+ * to an offset of zero), in order to read it a second
+ * time.
+ */
+static int
+sqncbi_IsRewindable(const ESL_SQFILE *sqfp)
+{
+ return TRUE;
+}
+
+/* Function: sqncbi_GetError()
+ * Synopsis: Returns error buffer
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Return a pointer to the error buffer.
+ */
+static const char *
+sqncbi_GetError(const ESL_SQFILE *sqfp)
+{
+ return sqfp->data.ncbi.errbuf;
+}
+
+
+/*****************************************************************
+ *# 4. Sequence reading (sequential)
+ *****************************************************************/
+
+/* Function: sqncbi_Read()
+ * Synopsis: Read the next sequence from a file.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Reads the next sequence from open sequence file <sqfp> into
+ * <sq>. Caller provides an allocated and initialized <s>, which
+ * will be internally reallocated if its space is insufficient.
+ *
+ * Returns: <eslOK> on success; the new sequence is stored in <s>.
+ *
+ * Returns <eslEOF> when there is no sequence left in the
+ * file (including first attempt to read an empty file).
+ *
+ * Returns <eslEFORMAT> if there's a problem with the format,
+ * such as an illegal character; the line number that the parse
+ * error occurs on is in <sqfp->linenumber>, and an informative
+ * error message is placed in <sqfp->errbuf>.
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ * <eslEINCONCEIVABLE> on internal error.
+ */
+static int
+sqncbi_Read(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int index;
+ int status;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ index = ncbi->index + 1;
+ if (index >= ncbi->num_seq) return eslEOF;
+
+ if ((status = pos_sequence(ncbi, index)) != eslOK) return status;
+
+ /* Disk offset bookkeeping */
+ sq->idx = ncbi->index;
+ sq->roff = ncbi->roff;
+ sq->doff = ncbi->doff;
+ sq->hoff = ncbi->hoff;
+ sq->eoff = ncbi->eoff;
+
+ if (ncbi->alphatype == eslAMINO)
+ status = read_amino(sqfp, sq);
+ else
+ status = read_dna(sqfp, sq);
+ if (status != eslOK) return status;
+
+ /* read and parse the ncbi header */
+ if ((status = parse_header(ncbi, sq)) != eslOK) return status;
+
+ return eslOK;
+}
+
+
+/* Function: sqncbi_ReadInfo()
+ * Synopsis: Read sequence info, but not the sequence itself.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Read the next sequence from open sequence file <sqfp>,
+ * but don't store the sequence (or secondary structure).
+ * Upon successful return, <s> holds all the available
+ * information about the sequence -- its name, accession,
+ * description, and overall length <sq->L>.
+ *
+ * This is useful for indexing sequence files, where
+ * individual sequences might be ginormous, and we'd rather
+ * avoid reading complete seqs into memory.
+ *
+ * Returns: <eslOK> on success.
+ */
+static int
+sqncbi_ReadInfo(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int index;
+ int status;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ index = ncbi->index + 1;
+ if (index >= ncbi->num_seq) return eslEOF;
+
+ if ((status = pos_sequence(ncbi, index)) != eslOK) return status;
+
+ /* Disk offset bookkeeping */
+ sq->idx = ncbi->index;
+ sq->roff = ncbi->roff;
+ sq->doff = ncbi->doff;
+ sq->hoff = ncbi->hoff;
+ sq->eoff = ncbi->eoff;
+
+ /* figure out the sequence length */
+ sq->L = -1;
+
+ /* read and parse the ncbi header */
+ if ((status = parse_header(ncbi, sq)) != eslOK) return status;
+
+ return eslOK;
+}
+
+
+/* Function: sqncbi_ReadSequence()
+ * Synopsis: Read the sequence, not the sequence header.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Read the next sequence from open sequence file <sqfp>,
+ * but not the header information. Upon successful return,
+ * <s> holds all the sequence.
+ *
+ * This is useful reading binary formats and delaying the
+ * over heads of reading the sequence name until needed by
+ * the report generator.
+ *
+ * Returns: <eslOK> on success; the new sequence is stored in <s>.
+ *
+ * Returns <eslEOF> when there is no sequence left in the
+ * file (including first attempt to read an empty file).
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ */
+static int
+sqncbi_ReadSequence(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int index;
+ int status;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ index = ncbi->index + 1;
+ if (index >= ncbi->num_seq) return eslEOF;
+
+ if ((status = pos_sequence(ncbi, index)) != eslOK) return status;
+
+ /* Disk offset bookkeeping */
+ sq->idx = ncbi->index;
+ sq->roff = ncbi->roff;
+ sq->doff = ncbi->doff;
+ sq->hoff = ncbi->hoff;
+ sq->eoff = ncbi->eoff;
+
+ reset_header_values(ncbi);
+
+ if (ncbi->alphatype == eslAMINO)
+ status = read_amino(sqfp, sq);
+ else
+ status = read_dna(sqfp, sq);
+ if (status != eslOK) return status;
+
+ return eslOK;
+}
+
+
+/* Function: sqncbi_ReadWindow()
+ * Synopsis: Read next window of sequence.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Read a next window of <W> residues from open file <sqfp>,
+ * keeping <C> residues from the previous window as
+ * context, and keeping previous annotation in the <sq>
+ * as before.
+ *
+ * If this is the first window of a new sequence record,
+ * <C> is ignored (there's no previous context yet), and
+ * the annotation fields of the <sq> (name, accession, and
+ * description) are initialized by reading the sequence
+ * record's header. This is the only time the annotation
+ * fields are initialized.
+ *
+ * On return, <sq->dsq[]> contains the window and its
+ * context; residues <1..sq->C> are the previous context,
+ * and residues <sq->C+1..sq->n> are the new window. The
+ * start and end coordinates of the whole <dsq[1..n]>
+ * (including context) in the original source sequence are
+ * <sq->start..sq->end>. (Or, for text mode sequences,
+ * <sq->seq[0..sq->C-1,sq->C..sq->n-1]>, while <start> and
+ * <end> coords are still <1..L>.)
+ *
+ * When a sequence record is completed and no more data
+ * remain, <eslEOD> is returned, with an ``info'' <sq>
+ * structure (containing the annotation and the total
+ * sequence length <L>, but no sequence). (The total
+ * sequence length <L> is unknown in <sq> until this
+ * <eslEOD> return.)
+ *
+ * The caller may then do one of two things before calling
+ * <esl_sq_ReadWindow()> again; it can reset the sequence
+ * with <esl_sq_Reuse()> to continue reading the next
+ * sequence in the file, or it can set a negative <W> as a
+ * signal to read windows from the reverse complement
+ * (Crick) strand. Reverse complement reading only works
+ * for nucleic acid sequence.
+ *
+ * If you read the reverse complement strand, you must read
+ * the whole thing, calling <esl_sqio_ReadWindow()> with
+ * negative <W> windows until <eslEOD> is returned again
+ * with an empty (info-only) <sq> structure. When that
+ * <EOD> is reached, the <sqfp> is repositioned at the
+ * start of the next sequence record; the caller should now
+ * <Reuse()> the <sq>, and the next <esl_sqio_ReadWindow()>
+ * call must have a positive <W>, corresponding to starting
+ * to read the Watson strand of the next sequence.
+ *
+ * Note that the <ReadWindow()> interface is designed for
+ * an idiom of sequential reading of complete sequences in
+ * overlapping windows, possibly on both strands; if you
+ * want more freedom to move around in the sequence
+ * grabbing windows in another order, you can use the
+ * <FetchSubseq()> interface.
+ *
+ * Reading the reverse complement strand requires file
+ * repositioning, so it will not work on non-repositionable
+ * streams like gzipped files or a stdin pipe. Moreover,
+ * for reverse complement input to be efficient, the
+ * sequence file should have consistent line lengths,
+ * suitable for SSI's fast subsequence indexing.
+ *
+ * Returns: <eslOK> on success; <sq> now contains next window of
+ * sequence, with at least 1 new residue. The number
+ * of new residues is <sq->W>; <sq->C> residues are
+ * saved from the previous window. Caller may now
+ * process residues <sq->dsq[sq->C+1]..sq->dsq[sq->n]>.
+ *
+ * <eslEOD> if no new residues were read for this sequence
+ * and strand, and <sq> now contains an empty info-only
+ * structure (annotation and <L> are valid). Before calling
+ * <esl_sqio_ReadWindow()> again, caller will either want
+ * to make <W> negative (to start reading the Crick strand
+ * of the current sequence), or it will want to reset the
+ * <sq> (with <esl_sq_Reuse()>) to go on the next sequence.
+ *
+ * <eslEOF> if we've already returned <eslEOD> before to
+ * signal the end of the previous seq record, and moreover,
+ * there's no more sequence records in the file.
+ *
+ * <eslEINVAL> if an invalid residue is found in the
+ * sequence, or if you attempt to take the reverse
+ * complement of a sequence that can't be reverse
+ * complemented.
+ *
+ * Throws: <eslESYNTAX> if you try to read a reverse window before
+ * you've read forward strand.
+ *
+ * <eslECORRUPT> if something goes awry internally in the
+ * coordinate system.
+ *
+ * <eslEMEM> on allocation error.
+ */
+static int
+sqncbi_ReadWindow(ESL_SQFILE *sqfp, int C, int W, ESL_SQ *sq)
+{
+ uint64_t nres;
+
+ int index;
+ int status;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ /* Negative W indicates reverse complement direction */
+ if (W < 0)
+ {
+ if (sq->L == -1) ESL_EXCEPTION(eslESYNTAX, "Can't read reverse complement until you've read forward strand");
+
+ /* update the sequence index */
+ if ((status = sqncbi_Position(sqfp, sq->idx)) != eslOK)
+ ESL_FAIL(eslEINVAL, ncbi->errbuf, "Unexpected error positioning database to sequence %" PRId64, sq->idx);
+
+ if (sq->end == 1)
+ { /* last end == 1 means last window was the final one on reverse strand,
+ * so we're EOD; jump back to last forward position.
+ */
+ sq->start = 0;
+ sq->end = 0;
+ sq->C = 0;
+ sq->W = 0;
+ sq->n = 0;
+ /* sq->L stays as it is */
+ if (sq->dsq != NULL) sq->dsq[1] = eslDSQ_SENTINEL;
+ else sq->seq[0] = '\0';
+
+ return eslEOD;
+ }
+
+ /* If s == 0, we haven't read any reverse windows yet;
+ * init reading from sq->L
+ */
+ W = -W;
+ if (sq->start == 0)
+ {
+ sq->start = ESL_MAX(1, (sq->L - W + 1));
+ sq->end = sq->start;
+ sq->C = 0;
+ }
+ else
+ { /* Else, we're continuing to next window; prv was <end>..<start> */
+ sq->C = ESL_MIN(C, sq->L - sq->end + 1); /* based on prev window's end */
+ sq->start = ESL_MAX(1, (sq->end - W));
+ W = sq->end - sq->start + sq->C;
+ sq->end = sq->start;
+ }
+
+ /* grab the subseq and rev comp it */
+ if ((status = esl_sq_GrowTo(sq, W)) != eslOK) return status;
+ sq->n = 0;
+ if (ncbi->alphatype == eslAMINO) status = read_nres_amino(sqfp, sq, W, &nres);
+ else status = read_nres_dna(sqfp, sq, W, &nres);
+
+ if (status != eslOK || nres != W) {
+ ESL_EXCEPTION(eslECORRUPT, "Failed to extract %d..%d", sq->start, sq->end);
+ } else {
+ sq->end = sq->start + nres - 1;
+ sq->W = nres - sq->C;
+ }
+
+ status = esl_sq_ReverseComplement(sq);
+ if (status == eslEINVAL) ESL_FAIL(eslEINVAL, ncbi->errbuf, "can't reverse complement that seq - it's not DNA/RNA");
+ else if (status != eslOK) return status;
+
+ return eslOK;
+ }
+
+ /* Else, we're reading the forward strand */
+ else
+ { /* sq->start == 0 means we haven't read any windows on this sequence yet...
+ * it's a new record, and we need to initialize with the header and
+ * the first window. This is the only case that we're allowed to return
+ * EOF from.
+ */
+ if (sq->start == 0)
+ {
+ index = ncbi->index + 1;
+ if (index >= ncbi->num_seq) return eslEOF;
+
+ /* get the sequence and header offsets */
+ if ((status = pos_sequence(ncbi, index)) != eslOK) return status;
+
+ /* Disk offset bookkeeping */
+ sq->idx = ncbi->index;
+ sq->roff = ncbi->roff;
+ sq->doff = ncbi->doff;
+ sq->hoff = ncbi->hoff;
+ sq->eoff = ncbi->eoff;
+
+ ncbi->seq_cpos = -1;
+ ncbi->seq_L = -1;
+
+ /* read and parse the ncbi header */
+ if ((status = parse_header(ncbi, sq)) != eslOK) return status;
+
+ sq->start = 1;
+ sq->C = 0; /* no context in first window */
+ sq->L = -1; /* won't be known 'til EOD. */
+ ncbi->seq_L = -1; /* init to 0, so we can count residues as we go */
+ esl_sq_SetSource(sq, sq->name);
+ }
+ else
+ { /* else we're reading a window other than first; slide context over. */
+ sq->C = ESL_MIN(C, sq->n);
+
+ /* if the case where the window is smaller than the context and the
+ * context is not full, it is not necessary to move the context part
+ * of the sequence that has been read in.
+ */
+ if (sq->C >= C) {
+ if (sq->seq != NULL) memmove(sq->seq, sq->seq + sq->n - sq->C, sq->C);
+ else memmove(sq->dsq+1, sq->dsq + sq->n - sq->C + 1, sq->C);
+ sq->start = sq->end - sq->C + 1;
+ sq->n = C;
+ }
+ }
+
+ if ((status = esl_sq_GrowTo(sq, C+W)) != eslOK) return status; /* EMEM */
+ if (ncbi->alphatype == eslAMINO) status = read_nres_amino(sqfp, sq, W, &nres);
+ else status = read_nres_dna(sqfp, sq, W, &nres);
+
+ if (status == eslEOD)
+ {
+ sq->start = 0;
+ sq->end = 0;
+ sq->C = 0;
+ sq->W = 0;
+ sq->n = 0;
+
+ if (sq->dsq != NULL) sq->dsq[1] = eslDSQ_SENTINEL; /* erase the saved context */
+ else sq->seq[0] = '\0';
+
+ return eslEOD;
+ }
+ else if (status == eslOK)
+ { /* Forward strand is still in progress. <= W residues were read. Return eslOK. */
+ sq->end = sq->start + sq->C + nres - 1;
+ sq->W = nres;
+ return eslOK;
+ }
+ else return status; /* EFORMAT,EMEM */
+ }
+ /*NOTREACHED*/
+ return eslOK;
+}
+
+/* Function: sqncbi_ReadBlock()
+ * Synopsis: Read the next block of sequences from a file.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Reads a block of sequences from open sequence file <sqfp> into
+ * <sqBlock>.
+ *
+ * In the case that <long_target> is false, the sequences are
+ * expected to be protein - individual sequences won't be long
+ * so read them in one-whole-sequence at a time. If <max_sequences>
+ * is set to a number > 0 read <max_sequences> sequences.
+ *
+ * If <long_target> is true, the sequences are expected to be DNA.
+ * Because sequences in a DNA database can exceed MAX_RESIDUE_COUNT,
+ * this function uses ReadWindow to read chunks of sequence no
+ * larger than <max_residues>, and must allow for the possibility that
+ * a request will be made to continue reading a partly-read
+ * sequence.
+ *
+ * Returns: <eslOK> on success; the new sequence is stored in <sqBlock>.
+ *
+ * Returns <eslEOF> when there is no sequence left in the
+ * file (including first attempt to read an empty file).
+ *
+ * Returns <eslEFORMAT> if there's a problem with the format,
+ * such as an illegal character;
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ * <eslEINCONCEIVABLE> on internal error.
+ */
+static int
+sqncbi_ReadBlock(ESL_SQFILE *sqfp, ESL_SQ_BLOCK *sqBlock, int max_residues, int max_sequences, int long_target)
+{
+ int i = 0;
+ int size = 0;
+ int status = eslOK;
+ ESL_SQ *tmpsq = NULL;
+
+ sqBlock->count = 0;
+
+ if ( !long_target )
+ { /* in these cases, an individual sequence won't ever be really long,
+ so just read in a sequence at a time */
+
+ if (max_sequences < 1 || max_sequences > sqBlock->listSize)
+ max_sequences = sqBlock->listSize;
+
+ for (i = 0; i < max_sequences && size < MAX_RESIDUE_COUNT; ++i)
+ {
+ status = sqncbi_Read(sqfp, sqBlock->list + i);
+ if (status != eslOK) break;
+ size += sqBlock->list[i].n;
+ ++sqBlock->count;
+ }
+ }
+ else
+ { /* DNA, not an alignment. Might be really long sequences */
+
+ /*this variable is used instead of the MAX_RESIDUE_COUNT macro because impl_dummy may require shorter sequences to fit in memory*/
+ if (max_residues < 0)
+ max_residues = MAX_RESIDUE_COUNT;
+
+ tmpsq = esl_sq_Create();
+
+ //if complete flag set to FALSE, then the prior block must have ended with a window that was a possibly
+ //incomplete part of it's full sequence. Read another overlaping window.
+ if (! sqBlock->complete )
+ {
+ //overloading C as indicator of how big C should be for this window reading action
+ status = sqncbi_ReadWindow(sqfp, sqBlock->list->C, max_residues, sqBlock->list);
+ if (status == eslOK)
+ {
+ sqBlock->count = i = 1;
+ size = sqBlock->list->n;
+ sqBlock->list[i].L = sqfp->data.ncbi.seq_L;
+ if (sqBlock->list->n >= max_residues)
+ { // Filled the block with a single very long window.
+
+ if ( sqBlock->list->n == sqfp->data.ncbi.seq_L) {
+ sqBlock->complete = TRUE;
+ esl_sq_Reuse(tmpsq);
+ tmpsq->start = sqBlock->list->start ;
+ tmpsq->C = 0;
+ status = sqncbi_ReadWindow(sqfp, 0, max_residues, tmpsq); // burn off the EOD
+ if (status == eslEOD) // otherwise, the unexpected status will be returned
+ status = eslOK;
+
+ } else {
+ sqBlock->complete = FALSE;
+ }
+
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status;
+
+ }
+ else
+ {
+ // Burn off EOD (see notes for similar entry ~25 lines below), then go fetch the next sequence
+ esl_sq_Reuse(tmpsq);
+ tmpsq->start = sqBlock->list->start ;
+ tmpsq->C = 0;
+ status = sqncbi_ReadWindow(sqfp, 0, max_residues, tmpsq);
+ if (status != eslEOD) {
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status; //surprising
+ }
+ sqBlock->list->L = tmpsq->L;
+ }
+ }
+ else if (status == eslEOD)
+ { // turns out there isn't any more of the sequence to read, after all
+
+ }
+ else
+ {
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status;
+ }
+ } // otherwise, just start at the beginning
+
+
+ for ( ; i < sqBlock->listSize && size < max_residues; ++i)
+ {
+ /* restricted request_size is used to ensure that all blocks are pretty close to the
+ * same size. Without it, we may either naively keep asking for max_residue windows,
+ * which can result in a window with ~2*max_residues ... or we can end up with absurdly
+ * short fragments at the end of blocks
+ */
+ int request_size = ESL_MAX(max_residues-size, max_residues * .05);
+
+ esl_sq_Reuse(tmpsq);
+ esl_sq_Reuse(sqBlock->list + i);
+ status = sqncbi_ReadWindow(sqfp, 0, request_size, tmpsq);
+ if (status != eslOK) break; // end of sequences
+
+ size += sqBlock->list[i].n - sqBlock->list[i].C;
+ sqBlock->list[i].L = sqfp->data.ncbi.seq_L;
+ ++(sqBlock->count);
+ if (size >= max_residues)
+ { // a full window worth of sequence was read
+
+ if ( sqBlock->list[i].n == sqfp->data.ncbi.seq_L) {
+ sqBlock->complete = TRUE;
+ esl_sq_Reuse(tmpsq);
+ tmpsq->start = sqBlock->list->start ;
+ tmpsq->C = 0;
+ status = sqncbi_ReadWindow(sqfp, 0, max_residues, tmpsq); // burn off the EOD
+ if (status == eslEOD) // otherwise, the unexpected status will be returned
+ status = eslOK;
+
+ } else {
+ sqBlock->complete = FALSE;
+ }
+
+
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status;
+
+ }
+ else
+ {
+ /* Sequence was finished before filling a full window. Need to burn off the EOD value that will be
+ returned by the next ReadWindow call. Can just use a tmp sq, after setting a couple
+ values ReadWindow needs to see for correct processing.
+ */
+ esl_sq_Reuse(tmpsq);
+ tmpsq->start = sqBlock->list[i].start ;
+ tmpsq->C = 0;
+ status = sqncbi_ReadWindow(sqfp, 0, max_residues, tmpsq);
+ if (status != eslEOD) {
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+ return status; //surprising
+ }
+ //sqBlock->list[i].L = tmpsq->L;
+ status = eslOK;
+ }
+ }
+ }
+
+ /* EOF will be returned only in the case were no sequences were read */
+ if (status == eslEOF && i > 0) status = eslOK;
+
+ sqBlock->complete = TRUE;
+
+ if(tmpsq != NULL) esl_sq_Destroy(tmpsq);
+
+ return status;
+}
+
+/* Function: sqncbi_Echo()
+ * Synopsis: Echo a sequence's record onto output stream.
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Returns: <eslEUNIMPLEMENTED>.
+ */
+static int
+sqncbi_Echo(ESL_SQFILE *sqfp, const ESL_SQ *sq, FILE *ofp)
+{
+ ESL_EXCEPTION(eslEINVAL, "can't Echo() a sequence from NCBI database");
+ return eslEUNIMPLEMENTED;
+}
+/*------------------ end, sequential sequence input -------------*/
+
+
+
+/* Function: reset_db()
+ * Synopsis: Resets a sequence file.
+ * Incept: MSF, Wed Mar 17, 2010 [Janelia]
+ *
+ * Purpose: Closes just the currently opened db and frees
+ * up the memory associated with that db. This is
+ * used primarily with multi-volume databases where
+ * the current db is closed so the next one can be
+ * opened.
+ *
+ * Returns: void.
+ */
+static void
+reset_db(ESL_SQNCBI_DATA *ncbi)
+{
+ if (ncbi->title != NULL) free(ncbi->title);
+ if (ncbi->timestamp != NULL) free(ncbi->timestamp);
+
+ if (ncbi->fppin != NULL) fclose(ncbi->fppin);
+ if (ncbi->fpphr != NULL) fclose(ncbi->fpphr);
+ if (ncbi->fppsq != NULL) fclose(ncbi->fppsq);
+
+ ncbi->fppin = NULL;
+ ncbi->fpphr = NULL;
+ ncbi->fppsq = NULL;
+
+ ncbi->title = NULL;
+ ncbi->timestamp = NULL;
+
+ return;
+}
+
+
+/* reset_header_values()
+ *
+ * Clear the header values so it is clear which values
+ * have been set by the current header.
+ */
+static void
+reset_header_values(ESL_SQNCBI_DATA *ncbi)
+{
+ ncbi->name_ptr = NULL;
+ ncbi->name_size = 0;
+ ncbi->acc_ptr = NULL;
+ ncbi->acc_size = 0;
+ ncbi->int_id = -1;
+ ncbi->str_id_ptr = NULL;
+ ncbi->str_id_size = 0;
+}
+
+/* volume_open()
+ *
+ * Open up the index, head and sequence files for a particular
+ * volume. Parse the first three fields in the index file,
+ * one more time, just to make sure nothing funny is going on.
+ */
+static int
+volume_open(ESL_SQNCBI_DATA *ncbi, int volume)
+{
+ int len;
+ uint32_t info[4];
+ int dbtype;
+ int status = eslOK; /* return status from an ESL call */
+
+ char *name;
+
+ if (volume < 0 || volume > ncbi->volumes) return eslEINVAL;
+
+ /* if the db has no volumes return */
+ if (ncbi->volumes == 0) return eslOK;
+
+ if (ncbi->fppin != NULL) fclose(ncbi->fppin);
+ if (ncbi->fpphr != NULL) fclose(ncbi->fpphr);
+ if (ncbi->fppsq != NULL) fclose(ncbi->fppsq);
+
+ name = ncbi->vols[volume].name;
+ len = strlen(name);
+
+ dbtype = (ncbi->alphatype == eslDNA) ? NCBI_DNA_DB : NCBI_AMINO_DB;
+
+ /* Check for basic database first */
+ strcpy(name+len, ".Xin");
+ name[len+1] = (dbtype == NCBI_DNA_DB) ? 'n' : 'p';
+ if ((ncbi->fppin = fopen(name, "rb")) == NULL) {
+ status = eslFAIL;
+ goto ERROR;
+ }
+ strcpy(name+len, ".Xhr");
+ name[len+1] = (dbtype == NCBI_DNA_DB) ? 'n' : 'p';
+ if ((ncbi->fpphr = fopen(name, "rb")) == NULL) {
+ status = eslFAIL;
+ goto ERROR;
+ }
+ strcpy(name+len, ".Xsq");
+ name[len+1] = (dbtype == NCBI_DNA_DB) ? 'n' : 'p';
+ if ((ncbi->fppsq = fopen(name, "rb")) == NULL) {
+ status = eslFAIL;
+ goto ERROR;
+ }
+
+ /* quickly parse the header make sure we are sane. */
+ if (fread(&info[0], sizeof(uint32_t), 3, ncbi->fppin) != 3) status = eslFAIL;
+ if (htobe32(info[0]) != NCBI_VERSION_4) status = eslEFORMAT;
+ if (htobe32(info[1]) != dbtype) status = eslEFORMAT;
+
+ if (status != eslOK) goto ERROR;
+
+ /* save the offsets to the index tables */
+ ncbi->hdr_off = ncbi->vols[volume].hdr_off;
+ ncbi->seq_off = ncbi->vols[volume].seq_off;
+ if (dbtype == NCBI_DNA_DB) {
+ ncbi->amb_off = ncbi->vols[volume].amb_off;
+ }
+
+ ncbi->vol_index = volume;
+ ncbi->index_start = -1;
+ ncbi->index_end = -1;
+
+ /* skip the first sentinal byte in the .psq file */
+ fgetc(ncbi->fppsq);
+
+ /* zero terminate the name other functions can just
+ * tack on any extension without a lot of testing.
+ */
+ name[len] = '\0';
+
+ return eslOK;
+
+ ERROR:
+
+ reset_db(ncbi);
+
+ return status;
+}
+
+
+/* pos_sequence_offsets()
+ *
+ * Position the sequence and header files for reading at
+ * the start of the indexed sequence <inx>. This routine
+ * buffers <INDEX_TABLE_SIZE> offsets from the header and
+ * sequence files. If the index <inx> is not in the
+ * currently buffered table, read the the indexes. If the
+ * index is not in the current volume find which volume
+ * the indexed sequence is in and open up that database.
+ */
+static int
+pos_sequence(ESL_SQNCBI_DATA *ncbi, int inx)
+{
+ int cnt;
+ int status;
+
+ uint32_t offset;
+ uint32_t start;
+ uint32_t end;
+
+ ESL_SQNCBI_VOLUME *volume;
+
+ if (inx < 0 || inx > ncbi->num_seq) return eslEINVAL;
+
+ start = ncbi->index_start;
+ end = ncbi->index_end;
+
+ /* get the offsets for the header, sequence and ambiguity table */
+ if (ncbi->index_start == -1 || inx < start || inx > end) {
+
+ /* if the db is broken up into volumes, lets find the correct one to use */
+ if (ncbi->volumes > 0) {
+ volume = ncbi->vols + ncbi->vol_index;
+ if (inx < volume->start_seq || inx > volume->end_seq) {
+ volume = ncbi->vols;
+ for (cnt = 0; cnt < ncbi->volumes; ++cnt) {
+ if (inx < volume->end_seq) break;
+ ++volume;
+ }
+
+ /* check just to make sure we found the volume */
+ if (cnt >= ncbi->volumes) return eslFAIL;
+
+ if ((status = volume_open(ncbi, cnt)) != eslOK) return status;
+ }
+ }
+
+ /* adjust where we start reading from if we are reading forwards or backwards */
+ if (ncbi->index_start == -1 || inx > end) {
+ start = inx;
+ } else {
+ start = inx + 2;
+ start = (start > INDEX_TABLE_SIZE) ? start - INDEX_TABLE_SIZE : 0;
+ }
+ ncbi->index_start = start;
+
+ /* when calculating the count be sure to take into account the fact that the
+ * index tables contain one index more that the number of sequences and this
+ * last index is used to point to the end of the last header and sequences.
+ */
+ if (ncbi->volumes > 0) {
+ cnt = volume->end_seq - inx + 2; // cppcheck thinks end_seq can be uninitialized here. I think it's wrong.
+ start = start - volume->start_seq; // .. and ditto for start_seq.
+ } else {
+ cnt = ncbi->num_seq - inx + 1;
+ }
+ cnt = (cnt > INDEX_TABLE_SIZE) ? INDEX_TABLE_SIZE : cnt;
+ ncbi->index_end = ncbi->index_start + cnt - 2;
+
+ offset = ncbi->hdr_off + (sizeof(uint32_t) * start);
+ if (fseek(ncbi->fppin, offset, SEEK_SET) != 0) {
+ ESL_FAIL(eslEFORMAT, ncbi->errbuf, "Error seeking header index %d\n", offset);
+ }
+ if (fread(ncbi->hdr_indexes, sizeof(uint32_t), cnt, ncbi->fppin) != cnt) {
+ ESL_FAIL(eslEFORMAT, ncbi->errbuf, "Error reading header index %d at %d(%d)\n", start, offset, cnt);
+ }
+
+ offset = ncbi->seq_off + (sizeof(uint32_t) * start);
+ if (fseek(ncbi->fppin, offset, SEEK_SET) != 0) {
+ ESL_FAIL(eslEFORMAT, ncbi->errbuf, "Error seeking sequence index %d\n", offset);
+ }
+ if (fread(ncbi->seq_indexes, sizeof(uint32_t), cnt, ncbi->fppin) != cnt) {
+ ESL_FAIL(eslEFORMAT, ncbi->errbuf, "Error reading sequence index %d at %d(%d)\n", start, offset, cnt);
+ }
+
+ if (ncbi->alphatype == eslDNA) {
+ offset = ncbi->amb_off + (sizeof(uint32_t) * start);
+ if (fseek(ncbi->fppin, offset, SEEK_SET) != 0) {
+ ESL_FAIL(eslEFORMAT, ncbi->errbuf, "Error seeking ambiguity index %d\n", offset);
+ }
+ if (fread(ncbi->amb_indexes, sizeof(uint32_t), cnt, ncbi->fppin) != cnt) {
+ ESL_FAIL(eslEFORMAT, ncbi->errbuf, "Error reading ambiguity index %d at %d(%d)\n", start, offset, cnt);
+ }
+ }
+ }
+
+ ncbi->index = inx;
+
+ inx -= ncbi->index_start;
+ ncbi->roff = htobe32(ncbi->hdr_indexes[inx]);
+ ncbi->doff = htobe32(ncbi->seq_indexes[inx]);
+ ncbi->hoff = htobe32(ncbi->hdr_indexes[inx+1]);
+ ncbi->eoff = htobe32(ncbi->seq_indexes[inx+1]);
+
+ if (ncbi->alphatype == eslDNA) {
+ ncbi->seq_apos = htobe32(ncbi->amb_indexes[inx]);
+ ncbi->seq_alen = ncbi->seq_apos + htobe32(ncbi->amb_indexes[inx+1]) + 1;
+ } else {
+ ncbi->seq_apos = 0;
+ ncbi->seq_alen = 0;
+ }
+
+ if (fseek(ncbi->fpphr, ncbi->roff, SEEK_SET) != 0) return eslESYS;
+ if (fseek(ncbi->fppsq, ncbi->doff, SEEK_SET) != 0) return eslESYS;
+
+ return eslOK;
+}
+
+/* Function: read_amino()
+ * Synopsis: Read in the amino sequence
+ * Incept: MSF, Wed Jan 27, 2010 [Janelia]
+ *
+ * Purpose: Read and translate the amino acid sequence.
+ */
+static int
+read_amino(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int inx;
+ int size;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ if (ncbi->index >= ncbi->num_seq) return eslEOF;
+
+ size = sq->eoff - sq->doff;
+
+ /* figure out the sequence length */
+ if (esl_sq_GrowTo(sq, size) != eslOK) return eslEMEM;
+
+ /* figure out if the sequence is in digital mode or not */
+ if (sq->dsq != NULL) {
+ ESL_DSQ *ptr = sq->dsq + 1;
+ if (fread(ptr, sizeof(char), size, ncbi->fppsq) != size) return eslEFORMAT;
+ for (inx = 0; inx < size - 1; ++inx) {
+ *ptr = sqfp->inmap[(int) *ptr];
+ ++ptr;
+ }
+ *ptr = eslDSQ_SENTINEL;
+ } else {
+ char *ptr = sq->seq;
+ if (fread(ptr, sizeof(char), size, ncbi->fppsq) != size) return eslEFORMAT;
+ for (inx = 0; inx < size - 1; ++inx) {
+ *ptr = sqfp->inmap[(int) *ptr];
+ *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ }
+ *ptr = '\0';
+ }
+
+ sq->start = 1;
+ sq->end = size - 1;
+ sq->C = 0;
+ sq->W = size - 1;
+ sq->L = size - 1;
+ sq->n = size - 1;
+
+ return eslOK;
+}
+
+
+/* Function: read_dna()
+ * Synopsis: Read in the dna sequence
+ * Incept: MSF, Wed Jan 27, 2010 [Janelia]
+ *
+ * Purpose: Read and translate the dna sequence.
+ */
+static int
+read_dna(ESL_SQFILE *sqfp, ESL_SQ *sq)
+{
+ int64_t inx;
+ int64_t cnt;
+ int64_t off;
+ int size;
+ int text;
+ int status;
+ int amb32;
+
+ int remainder;
+ int length;
+ int ssize;
+ int n;
+
+ char *ptr;
+ void *t;
+
+ unsigned char c;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ if (ncbi->index >= ncbi->num_seq) return eslEOF;
+
+ /* calculate the max size of the sequence. It is most likely
+ * a bit smaller, but we need to read the sequence in first
+ * before the real size can be figured out.
+ */
+ size = sq->eoff - sq->doff;
+ if (ncbi->hdr_alloced < size) {
+ while (ncbi->hdr_alloced < size) ncbi->hdr_alloced += ncbi->hdr_alloced;
+ ESL_RALLOC(ncbi->hdr_buf, t, sizeof(char) * ncbi->hdr_alloced);
+ }
+ if (fread(ncbi->hdr_buf, sizeof(char), size, ncbi->fppsq) != size) return eslEFORMAT;
+
+ ssize = ncbi->seq_apos - sq->doff - 1;
+ remainder = *(ncbi->hdr_buf + ssize) & 0x03;
+ length = ssize * 4 + remainder;
+
+ /* figure out the sequence length */
+ if (esl_sq_GrowTo(sq, length) != eslOK) return eslEMEM;
+
+ /* figure out if the sequence is in digital mode or not */
+ if (sq->dsq != NULL) {
+ text = FALSE;
+ ptr = (char *)sq->dsq + 1;
+ } else {
+ text = TRUE;
+ ptr = sq->seq;
+ }
+
+ for (inx = 0; inx < ssize; ++inx) {
+ c = ncbi->hdr_buf[inx];
+ n = 1 << ((c >> 6) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ n = 1 << ((c >> 4) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ n = 1 << ((c >> 2) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ n = 1 << ((c >> 0) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ }
+
+ /* handle the remainder */
+ c = ncbi->hdr_buf[inx];
+ for (inx = 0; inx < remainder; ++inx) {
+ n = 1 << ((c >> (6 - inx * 2)) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ }
+
+ *ptr = (text) ? '\0' : eslDSQ_SENTINEL;
+
+ /* we need to look that the first by the the ambiguity table
+ * to see if the entries are 32 or 64 bit entries.
+ */
+ amb32 = 0;
+ if (ncbi->seq_apos - sq->doff < size) {
+ amb32 = ((ncbi->hdr_buf[ncbi->seq_apos - sq->doff] & 0x80) == 0);
+ }
+
+ /* skip past the count and start processing the abmiguity table */
+ ssize = ncbi->seq_apos - sq->doff + 4;
+ ptr = (text) ? sq->seq : (char *)sq->dsq + 1;
+
+ while (ssize < size) {
+ /* get the ambiguity character */
+ n = ((ncbi->hdr_buf[ssize] >> 4) & 0x0f);
+ c = sqfp->inmap[n];
+ if (text) c = ncbi->alphasym[(int) c];
+
+ if (amb32) {
+ /* get the repeat count 4 bits */
+ cnt = (ncbi->hdr_buf[ssize] & 0x0f);
+ cnt += 1;
+
+ /* get the offset 24 bits */
+ off = ncbi->hdr_buf[ssize+1];
+ off = (off << 8) | ncbi->hdr_buf[ssize+2];
+ off = (off << 8) | ncbi->hdr_buf[ssize+3];
+
+ for (inx = 0; inx < cnt; ++inx) ptr[off+inx] = c;
+
+ ssize += 4;
+ } else {
+ /* get the repeat count 12 bits */
+ cnt = (ncbi->hdr_buf[ssize] & 0x0f);
+ cnt = (cnt << 8) | ncbi->hdr_buf[ssize+1];
+ cnt += 1;
+
+ /* get the offset 48 bits*/
+ off = ncbi->hdr_buf[ssize+2];
+ off = (off << 8) | ncbi->hdr_buf[ssize+3];
+ off = (off << 8) | ncbi->hdr_buf[ssize+4];
+ off = (off << 8) | ncbi->hdr_buf[ssize+5];
+ off = (off << 8) | ncbi->hdr_buf[ssize+6];
+ off = (off << 8) | ncbi->hdr_buf[ssize+7];
+
+ for (inx = 0; inx < cnt; ++inx) ptr[off+inx] = c;
+
+ ssize += 8;
+ }
+ }
+
+ sq->start = 1;
+ sq->end = length;
+ sq->C = 0;
+ sq->W = length;
+ sq->L = length;
+ sq->n = length;
+
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+
+/* Function: read_nres_amino()
+ * Synopsis: Read in the amino sequence
+ * Incept: MSF, Wed Jan 27, 2010 [Janelia]
+ *
+ * Purpose: Read and translate the dna sequence.
+ */
+static int
+read_nres_amino(ESL_SQFILE *sqfp, ESL_SQ *sq, int len, uint64_t *nres)
+{
+ int inx;
+ int off;
+ int size;
+
+ char *ptr;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ if (ncbi->index >= ncbi->num_seq) return eslEOF;
+
+ /* if we don't know the sequence length, figure it out */
+ if (ncbi->seq_L == -1) ncbi->seq_L = sq->eoff - sq->doff - 1;
+
+ /* check if we are at the end */
+ if (sq->start + sq->n > ncbi->seq_L) {
+ if (nres != NULL) *nres = 0;
+ sq->L = ncbi->seq_L;
+ return eslEOD;
+ }
+
+ /* figure out if the sequence is in digital mode or not */
+ ptr = (sq->dsq != NULL) ? (char *)sq->dsq + 1 : sq->seq;
+ ptr += sq->n;
+
+ /* calculate where to start reading from */
+ off = sq->doff + sq->start + sq->n - 1;
+
+ /* calculate the size to read */
+ size = ncbi->seq_L - (sq->start + sq->n - 1);
+ size = (size > len) ? len : size;
+
+ /* seek to the windows location and read into the buffer */
+ if (fseek(ncbi->fppsq, off, SEEK_SET) != 0) return eslESYS;
+ if (fread(ptr, sizeof(char), size, ncbi->fppsq) != size) return eslEFORMAT;
+
+ /* figure out if the sequence is in digital mode or not */
+ for (inx = 0; inx < size; ++inx) {
+ *ptr = sqfp->inmap[(int) *ptr];
+ if (sq->dsq == NULL) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ }
+
+ *ptr = (sq->dsq == NULL) ? '\0' : eslDSQ_SENTINEL;
+
+ sq->n = sq->n + size;
+
+ if (nres != NULL) *nres = size;
+
+ return eslOK;
+}
+
+/* Function: correct_ambiguity()
+ * Synopsis: Read in the dna sequence
+ * Incept: MSF, Thu Feb 4, 2010 [Janelia]
+ *
+ * Purpose: Correct any ambiguity characters.
+ */
+static int
+correct_ambiguity(ESL_SQFILE *sqfp, ESL_SQ *sq, int len)
+{
+ int64_t alen; /* ambiguity length */
+ int64_t soff; /* starting offset */
+ int64_t eoff; /* ending offset */
+ int64_t ainx; /* ambiguity index */
+ int64_t size; /* size of table read in */
+ int64_t cnt; /* repeat count */
+ int64_t off;
+ int64_t n;
+
+ int amb32; /* flag for 32 or 64 bits */
+ char *ptr;
+
+ unsigned char c;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ if (ncbi->seq_alen == 0) return eslOK;
+
+ /* go to the start of the ambiguity table and see if the table
+ * is in 32 or 64 bit entries.
+ */
+ if (fseek(ncbi->fppsq, ncbi->seq_apos, SEEK_SET) != 0) return eslESYS;
+ if (fread(ncbi->hdr_buf, sizeof(char), 4, ncbi->fppsq) != 4) return eslEFORMAT;
+ amb32 = ((ncbi->hdr_buf[0] & 0x80) == 0);
+
+ ptr = (sq->dsq != NULL) ? (char *)sq->dsq + 1 : sq->seq;
+ ptr += sq->n;
+
+ /* calculate the starting and ending offsets */
+ soff = sq->start + sq->n - 1;
+ eoff = soff + len;
+
+ off = 0;
+ ainx = 0;
+ size = 0;
+ alen = ncbi->seq_alen - 4;
+ while (off < eoff) {
+ /* check if we need to read in more of the abmiguity table */
+ if (ainx == size) {
+ size = alen;
+ size = (size > INIT_HDR_BUFFER_SIZE) ? INIT_HDR_BUFFER_SIZE : size;
+ if (fread(ncbi->hdr_buf, sizeof(char), size, ncbi->fppsq) != size) return eslEFORMAT;
+ alen -= size;
+ ainx = 0;
+ }
+
+ /* get the ambiguity character */
+ n = ((ncbi->hdr_buf[ainx] >> 4) & 0x0f);
+ c = sqfp->inmap[n];
+ if (sq->dsq == NULL) c = ncbi->alphasym[(int) c];
+
+ if (amb32) {
+ /* get the repeat count 4 bits */
+ cnt = (ncbi->hdr_buf[ainx] & 0x0f);
+ cnt += 1;
+
+ /* get the offset 24 bits */
+ off = ncbi->hdr_buf[ainx+1];
+ off = (off << 8) | ncbi->hdr_buf[ainx+2];
+ off = (off << 8) | ncbi->hdr_buf[ainx+3];
+
+ ainx += 4;
+ } else {
+ /* get the repeat count 12 bits */
+ cnt = (ncbi->hdr_buf[ainx] & 0x0f);
+ cnt = (cnt << 8) | ncbi->hdr_buf[ainx+1];
+ cnt += 1;
+
+ /* get the offset 48 bits*/
+ off = ncbi->hdr_buf[ainx+2];
+ off = (off << 8) | ncbi->hdr_buf[ainx+3];
+ off = (off << 8) | ncbi->hdr_buf[ainx+4];
+ off = (off << 8) | ncbi->hdr_buf[ainx+5];
+ off = (off << 8) | ncbi->hdr_buf[ainx+6];
+ off = (off << 8) | ncbi->hdr_buf[ainx+7];
+
+ ainx += 8;
+ }
+
+ if (off + cnt >= soff && off < eoff) {
+ int inx;
+ int start = (off > soff) ? off - soff : 0;
+ int end = (off + cnt > eoff) ? eoff : off - soff + cnt;
+ for (inx = start; inx < end; ++inx) ptr[inx] = c;
+ }
+
+ off += cnt;
+ }
+
+ return eslOK;
+}
+
+/* Function: read_nres_dna()
+ * Synopsis: Read in the dna sequence
+ * Incept: MSF, Wed Jan 27, 2010 [Janelia]
+ *
+ * Purpose: Read and translate the dna sequence.
+ */
+static int
+read_nres_dna(ESL_SQFILE *sqfp, ESL_SQ *sq, int len, uint64_t *nres)
+{
+ int inx;
+ int off;
+ int cnt;
+ int ncnt;
+ int start;
+ int skip;
+ int text;
+ int status;
+
+ int remainder;
+ int length;
+ int ssize;
+ int n;
+
+ char *ptr;
+ void *t;
+
+ unsigned char c;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ if (ncbi->index >= ncbi->num_seq) return eslEOF;
+
+ /* if we don't know the sequence length, figure it out */
+ if (ncbi->seq_L == -1) {
+ if (fseek(ncbi->fppsq, ncbi->seq_apos - 1, SEEK_SET) != 0) return eslESYS;
+ if (fread(&c, sizeof(char), 1, ncbi->fppsq) != 1) return eslEFORMAT;
+
+ ssize = ncbi->seq_apos - sq->doff - 1;
+ remainder = c & 0x03;
+ length = ssize * 4 + remainder;
+
+ ncbi->seq_L = length;
+ }
+
+ /* check if we are at the end */
+ if (sq->start + sq->n > ncbi->seq_L) {
+ if (nres != NULL) *nres = 0;
+ sq->L = ncbi->seq_L;
+ return eslEOD;
+ }
+
+ /* calculate where to start reading from */
+ start = sq->start + sq->n - 1;
+ off = sq->doff + start / 4;
+
+ /* calculate bits to skip at the beginning and end */
+ cnt = ncbi->seq_L - (sq->start + sq->n - 1);
+ cnt = (cnt > len) ? len : cnt;
+
+ skip = start & 0x03;
+ remainder = skip + cnt;
+ remainder = (remainder & 0x03) ? (remainder & 0x03) : 4;
+
+ /* calculate bytes need to read in the window */
+ ssize = (cnt + skip + 3) / 4;
+
+ /* seek to the windows location and read into the buffer */
+ if (fseek(ncbi->fppsq, off, SEEK_SET) != 0) return eslESYS;
+ if (ncbi->hdr_alloced < ssize) {
+ while (ncbi->hdr_alloced < ssize) ncbi->hdr_alloced += ncbi->hdr_alloced;
+ ESL_RALLOC(ncbi->hdr_buf, t, sizeof(char) * ncbi->hdr_alloced);
+ }
+ if (fread(ncbi->hdr_buf, sizeof(char), ssize, ncbi->fppsq) != ssize) return eslEFORMAT;
+
+ /* figure out if the sequence is in digital mode or not */
+ if (sq->dsq != NULL) {
+ text = FALSE;
+ ptr = (char *)sq->dsq + 1;
+ } else {
+ text = TRUE;
+ ptr = sq->seq;
+ }
+ ptr += sq->n;
+
+ inx = 0;
+ c = ncbi->hdr_buf[inx];
+ for (inx = skip; inx < 4; ++inx) {
+ n = 1 << ((c >> (6 - inx * 2)) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ }
+
+ for (inx = 1; inx < ssize - 1; ++inx) {
+ c = ncbi->hdr_buf[inx];
+ n = 1 << ((c >> 6) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ n = 1 << ((c >> 4) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ n = 1 << ((c >> 2) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ n = 1 << ((c >> 0) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ }
+
+ /* handle the remainder */
+ c = ncbi->hdr_buf[inx];
+ for (inx = 0; inx < remainder; ++inx) {
+ n = 1 << ((c >> (6 - inx * 2)) & 0x03);
+ *ptr = sqfp->inmap[n];
+ if (text) *ptr = ncbi->alphasym[(int) *ptr];
+ ++ptr;
+ }
+
+ *ptr = (text) ? '\0' : eslDSQ_SENTINEL;
+
+ /* calculate the number of residues processed */
+ ncnt = (ssize - 1) * 4 + remainder - skip;
+
+ /* start processing the abmiguity table if there is one */
+ if (ncbi->seq_alen > 0) {
+ correct_ambiguity(sqfp, sq, ncnt);
+ }
+
+ sq->n = sq->n + ncnt;
+
+ if (nres != NULL) *nres = ncnt;
+
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+
+/* Function: inmap_ncbi()
+ * Synopsis: Set up a translation map
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Initialize the translation map used to translate a ncbi
+ * sequences to the internal representation used in hmmer.
+ *
+ * Returns: <eslOK> on success;
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ */
+static int
+inmap_ncbi(ESL_SQFILE *sqfp)
+{
+ int status = eslOK;
+
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ switch(ncbi->alphatype) {
+ case eslDNA:
+ status = inmap_ncbi_dna(sqfp);
+ break;
+ case eslAMINO:
+ status = inmap_ncbi_amino(sqfp);
+ break;
+ default:
+ ESL_EXCEPTION(eslEINVAL, "bad alphabet type: unrecognized");
+ }
+
+ return status;
+}
+
+/* Function: inmap_ncbi_dna()
+ * Synopsis: Set up a translation map
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Initialize the translation map used to translate a ncbi
+ * protein sequence to the internal representation used in
+ * hmmer.
+ *
+ * Returns: <eslOK> on success;
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ */
+static int
+inmap_ncbi_dna(ESL_SQFILE *sqfp)
+{
+ int x, y;
+ const char *ncbisym = "-ACMGRSVTWYHKDBN";
+
+ ESL_ALPHABET *abc = NULL;
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ if ((abc = esl_alphabet_Create(eslDNA)) == NULL) return eslEMEM;
+
+ for (x = 0; x < 128; x++) sqfp->inmap[x] = eslDSQ_ILLEGAL;
+
+ /* for each letter in the ncbi alphabet, find that letter in the
+ * hmmer alphabet and map the translation.
+ */
+ for (x = 0; x < strlen(ncbisym); ++x) {
+ for (y = 0; y < strlen(abc->sym); ++y) {
+ if (ncbisym[x] == abc->sym[y]) {
+ sqfp->inmap[x] = y;
+ break;
+ }
+ }
+
+ /* there is a problem if a translation does not exist */
+ if (y >= strlen(abc->sym)) return eslEFORMAT;
+ }
+
+ if (ncbi->alphasym == NULL) esl_strdup(abc->sym, -1, &ncbi->alphasym);
+
+ esl_alphabet_Destroy(abc);
+
+ return eslOK;
+}
+
+
+/* Function: inmap_ncbi_amino()
+ * Synopsis: Set up a translation map
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Initialize the translation map used to translate a ncbi
+ * protein sequence to the internal representation used in
+ * hmmer.
+ *
+ * Returns: <eslOK> on success;
+ *
+ * Throws: <eslEMEM> on allocation failure;
+ */
+static int
+inmap_ncbi_amino(ESL_SQFILE *sqfp)
+{
+ int x, y;
+ const char *ncbisym = "-ABCDEFGHIKLMNPQRSTVWXYZU*OJ";
+
+ ESL_ALPHABET *abc = NULL;
+ ESL_SQNCBI_DATA *ncbi = &sqfp->data.ncbi;
+
+ if ((abc = esl_alphabet_Create(eslAMINO)) == NULL) return eslEMEM;
+
+ for (x = 0; x < 128; x++) sqfp->inmap[x] = eslDSQ_ILLEGAL;
+
+ /* for each letter in the ncbi alphabet, find that letter in the
+ * hmmer alphabet and map the translation.
+ */
+ for (x = 0; x < strlen(ncbisym); ++x) {
+ for (y = 0; y < strlen(abc->sym); ++y) {
+ if (ncbisym[x] == abc->sym[y]) {
+ sqfp->inmap[x] = y;
+ break;
+ }
+ }
+
+ /* there is a problem if a translation does not exist */
+ if (y >= strlen(abc->sym)) return eslEFORMAT;
+ }
+
+ if (ncbi->alphasym == NULL) esl_strdup(abc->sym, -1, &ncbi->alphasym);
+
+ esl_alphabet_Destroy(abc);
+
+ return eslOK;
+}
+
+
+
+/*****************************************************************
+ *# 5. Parsing routines
+ *****************************************************************/
+
+/* Function: parse_expect()
+ * Synopsis: Expect the next bytes to parse match
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Match if the next <len> bytes to parse match the bytes
+ * in <str>. If the bytes do not match, throw <eslEFORMAT>
+ * error. Advance the parsers pointer.
+ *
+ * Returns: <eslOK> on success
+ *
+ * Throws: <eslEFORMAT> if there are insufficient bytes remaining
+ * in the header or if the data to parse does not match
+ * what is expected.
+ */
+static int
+parse_expect(ESL_SQNCBI_DATA *ncbi, void *str, int len)
+{
+ int size;
+ unsigned char *c;
+ unsigned char *limit;
+
+ size = ncbi->hoff - ncbi->roff;
+ limit = ncbi->hdr_buf + size;
+
+ /* verify the buffer has atleast len bytes remaining */
+ if (ncbi->hdr_ptr + len > limit) {
+ ESL_FAIL(eslEFORMAT, ncbi->errbuf, "Expecting %d bytes at %d : 0x%X(%d)\n",
+ len, (uint32_t) (ncbi->hdr_ptr - ncbi->hdr_buf), ncbi->roff, size);
+ }
+
+ /* check the buffer matches the token string */
+ c = (unsigned char *) str;
+ while (len--) {
+ if (*ncbi->hdr_ptr != *c) {
+ ESL_FAIL(eslEFORMAT, ncbi->errbuf, "Expecting 0x%X found 0x%X at %d : 0x%X(%d)\n",
+ *ncbi->hdr_ptr, *c, (uint32_t) (ncbi->hdr_ptr - ncbi->hdr_buf), ncbi->roff, size);
+ }
+ ncbi->hdr_ptr++;
+ c++;
+ }
+
+ return eslOK;
+}
+
+/* Function: parse_accept()
+ * Synopsis: Check if the next bytes to parse match
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Check if the next <len> bytes to parse match the bytes
+ * in <str>. If the bytes match, they are consumed and the
+ * parsers pointer is advanced.
+ *
+ * Returns: <eslOK> on success
+ * <eslEFORMAT> if the bytes to not match.
+ */
+static int
+parse_accept(ESL_SQNCBI_DATA *ncbi, void *str, int len)
+{
+ int i;
+ int size;
+ unsigned char *c;
+ unsigned char *limit;
+
+ size = ncbi->hoff - ncbi->roff;
+ limit = ncbi->hdr_buf + size;
+
+ /* check the buffer matches the token string */
+ if (ncbi->hdr_ptr + len > limit) return eslEFORMAT;
+
+ /* verify the buffer matches the token string without advancing
+ * the buffer pointers until we have a complete match.
+ */
+ c = (unsigned char *) str;
+ for (i = 0; i < len; ++i) {
+ if (ncbi->hdr_ptr[i] != c[i]) return eslEFORMAT;
+ }
+ ncbi->hdr_ptr += len;
+
+ return eslOK;
+}
+
+/* Function: parse_peek()
+ * Synopsis: Peek at the next byte to parse
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Return the next characer to be parsed without advancing the
+ * parsers pointer.
+ *
+ * Returns: <eslOK> on success
+ * <eslEFORMAT> if there are insufficient bytes remaining
+ * in the header.
+ */
+static int
+parse_peek(ESL_SQNCBI_DATA *ncbi, unsigned char *c)
+{
+ int size;
+ unsigned char *limit;
+
+ size = ncbi->hoff - ncbi->roff;
+ limit = ncbi->hdr_buf + size;
+
+ /* verify the buffer has atleast len bytes remaining */
+ if (ncbi->hdr_ptr + 1 > limit) return eslEFORMAT;
+
+ *c = *ncbi->hdr_ptr;
+
+ return eslOK;
+}
+
+/* Function: parse_consume()
+ * Synopsis: Copies bytes from the header
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Copies <len> bytes from the header to the buffer supplied by
+ * <str> if non-null. Adcance the parser pointer.
+ *
+ * Returns: <eslOK> on success
+ *
+ * Throws: <eslEFORMAT> if there are insufficient bytes remaining
+ * in the header.
+ */
+static int
+parse_consume(ESL_SQNCBI_DATA *ncbi, void *str, int len)
+{
+ int i;
+ int size;
+ unsigned char *c;
+ unsigned char *limit;
+
+ size = ncbi->hoff - ncbi->roff;
+ limit = ncbi->hdr_buf + size;
+
+ /* verify the buffer has atleast len bytes remaining */
+ if (ncbi->hdr_ptr + len > limit) {
+ ESL_FAIL(eslEFORMAT, ncbi->errbuf, "Expecting %d bytes at %d : 0x%X(%d)\n",
+ len, (uint32_t) (ncbi->hdr_ptr - ncbi->hdr_buf), ncbi->roff, size);
+ }
+
+ /* copy the characters in the buffer to <str> */
+ c = (unsigned char *) str;
+ for (i = 0; i < len; ++i) {
+ if (c != NULL) *c++ = *ncbi->hdr_ptr++;
+ }
+
+ return eslOK;
+}
+
+/* Function: parse_advance()
+ * Synopsis: Advance the parser pointer
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Advance the parser pointer <len> bytes.
+ *
+ * Returns: <eslOK> on success
+ *
+ * Throws: <eslEFORMAT> if there are insufficient bytes remaining
+ * in the header.
+ */
+static int
+parse_advance(ESL_SQNCBI_DATA *ncbi, int len)
+{
+ int size;
+ unsigned char *limit;
+
+ size = ncbi->hoff - ncbi->roff;
+ limit = ncbi->hdr_buf + size;
+
+ /* verify the buffer has atleast len bytes remaining */
+ if (ncbi->hdr_ptr + len > limit) {
+ ESL_FAIL(eslEFORMAT, ncbi->errbuf, "Expecting %d bytes at %d : 0x%X(%d)\n",
+ len, (uint32_t) (ncbi->hdr_ptr - ncbi->hdr_buf), ncbi->roff, size);
+ }
+
+ ncbi->hdr_ptr += len;
+
+ return eslOK;
+}
+
+/* Function: parse_header()
+ * Synopsis: Parse the ncbi db header
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Parse a ncbi database header. This routine implements
+ * a recursive descent parser for the ASN.1 definition of
+ * a blast database header filling in <sq>.
+ *
+ * The blast db header can have multiple definitions defined
+ * within it. Only the information from the first usable
+ * defition will be used.
+ *
+ * Returns: <eslOK> on success; the new sequence is stored in <s>.
+ *
+ * Returns <eslEFORMAT> if there's a problem with the format,
+ * such as an illegal character.
+ */
+static int
+parse_header(ESL_SQNCBI_DATA *ncbi, ESL_SQ *sq)
+{
+ int size;
+ int status;
+ void *tmp;
+
+ unsigned char c;
+
+ reset_header_values(ncbi);
+ size = ncbi->hoff - ncbi->roff;
+
+ /* read in the header data */
+ if (ncbi->hdr_alloced < size) {
+ while (ncbi->hdr_alloced < size) ncbi->hdr_alloced += ncbi->hdr_alloced;
+ ESL_RALLOC(ncbi->hdr_buf, tmp, sizeof(char) * ncbi->hdr_alloced);
+ }
+ if (fread(ncbi->hdr_buf, sizeof(char), size, ncbi->fpphr) != size) return eslEFORMAT;
+ ncbi->hdr_ptr = ncbi->hdr_buf;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ if (parse_peek(ncbi, &c) != eslOK) return eslEFORMAT;
+
+ /* parse the different seq id structures */
+ while (c != 0x00) {
+ if ((status = parse_def_line(ncbi, sq)) != eslOK) return status;
+
+ if (parse_peek(ncbi, &c) != eslOK) return eslEFORMAT;
+ }
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ return eslOK;
+ ERROR:
+ return eslEMEM;
+}
+
+/* Function: parse_def_line()
+ * Synopsis: Parse the Blast-def-line definition
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Blast-def-line ::= SEQUENCE {
+ * title VisibleString OPTIONAL, -- simple title
+ * seqid SEQUENCE OF Seq-id, -- Regular NCBI Seq-Id
+ * taxid INTEGER OPTIONAL, -- taxonomy id
+ * memberships SEQUENCE OF INTEGER OPTIONAL, -- bit arrays
+ * links SEQUENCE OF INTEGER OPTIONAL, -- bit arrays
+ * other-info SEQUENCE OF INTEGER OPTIONAL -- for future use (probably genomic sequences)
+ * }
+ */
+static int
+parse_def_line(ESL_SQNCBI_DATA *ncbi, ESL_SQ *sq)
+{
+ int status;
+
+ int i;
+ int len = 0;
+ int taxid = -1;
+ char *title = NULL;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ /* look for an optional title */
+ sq->desc[0] = 0;
+ if (parse_accept(ncbi, "\xa0\x80", 2) == eslOK) {
+ if ((status = parse_string(ncbi, &title, &len)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for sequence id structure */
+ if (parse_expect(ncbi, "\xa1\x80", 2) != eslOK) return eslEFORMAT;
+ if ((status = parse_seq_id(ncbi)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ /* look for an optional taxonomy id */
+ sq->tax_id = -1;
+ if (parse_accept(ncbi, "\xa2\x80", 2) == eslOK) {
+ if ((status = parse_integer(ncbi, &taxid)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional memberships */
+ if (parse_accept(ncbi, "\xa3\x80", 2) == eslOK) {
+ if ((status = ignore_sequence_of_integer(ncbi)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional links */
+ if (parse_accept(ncbi, "\xa4\x80", 2) == eslOK) {
+ if ((status = ignore_sequence_of_integer(ncbi)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional other info */
+ if (parse_accept(ncbi, "\xa5\x80", 2) == eslOK) {
+ if ((status = ignore_sequence_of_integer(ncbi)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ /* zero terminate any saved string */
+ if (ncbi->name_ptr != NULL) ncbi->name_ptr[ncbi->name_size] = '\0';
+ if (ncbi->acc_ptr != NULL) ncbi->acc_ptr[ncbi->acc_size] = '\0';
+ if (ncbi->str_id_ptr != NULL) ncbi->str_id_ptr[ncbi->str_id_size] = '\0';
+
+ if (title != NULL) title[len] = '\0';
+
+ if (ncbi->name_ptr != NULL || ncbi->acc_ptr != NULL) {
+ /* if we have both a name and accession, set both fields.
+ * if we have only one, set the name to that one field.
+ */
+ if (ncbi->name_ptr != NULL) {
+ esl_sq_SetName(sq, ncbi->name_ptr);
+ if (ncbi->acc_ptr != NULL) {
+ esl_sq_SetAccession(sq, ncbi->acc_ptr);
+ }
+ } else {
+ esl_sq_SetName(sq, ncbi->acc_ptr);
+ }
+ if (title != NULL) esl_sq_SetDesc(sq, title);
+ } else if (ncbi->str_id_ptr != NULL || ncbi->int_id != -1) {
+ /* since we don't have a name or accession, use the id
+ * as the name.
+ */
+ if (ncbi->str_id_ptr != NULL) {
+ esl_sq_SetName(sq, ncbi->str_id_ptr);
+ } else {
+ char id[32];
+ sprintf(id, "%d", ncbi->int_id);
+ esl_sq_SetName(sq, id);
+ }
+ if (title != NULL) esl_sq_SetDesc(sq, title);
+ } else if (title != NULL) {
+ /* lastly we don't have anything, so lets just use the
+ * title. take the first word of the title and use that
+ * for the name. the remaining portion of the title will
+ * be used for the description.
+ */
+ for (i = 0; i < len; ++i) {
+ if (isspace(title[i])) {
+ title[i] = '\0';
+ break;
+ }
+ }
+ esl_sq_SetName(sq, title);
+ ++i;
+
+ /* skip over multiple spaces till the next word */
+ for ( ; i < len; ++i) {
+ if (!isspace(title[i])) break;
+ }
+ if (i < len) esl_sq_SetDesc(sq, title + i);
+ }
+
+ if (taxid != -1) sq->tax_id = taxid;
+
+ return eslOK;
+}
+
+
+/* Function: parse_seq_id()
+ * Synopsis: Parse the Blast-def-line definition
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Seq-id ::= CHOICE {
+ * local Object-id , -- local use
+ * gibbsq INTEGER , -- Geninfo backbone seqid
+ * gibbmt INTEGER , -- Geninfo backbone moltype
+ * giim Giimport-id , -- Geninfo import id
+ * genbank Textseq-id ,
+ * embl Textseq-id ,
+ * pir Textseq-id ,
+ * swissprot Textseq-id ,
+ * patent Patent-seq-id ,
+ * other Textseq-id , -- for historical reasons, 'other' = 'refseq'
+ * general Dbtag , -- for other databases
+ * gi INTEGER , -- GenInfo Integrated Database
+ * ddbj Textseq-id , -- DDBJ
+ * prf Textseq-id , -- PRF SEQDB
+ * pdb PDB-seq-id , -- PDB sequence
+ * tpg Textseq-id , -- Third Party Annot/Seq GenBank
+ * tpe Textseq-id , -- Third Party Annot/Seq EMBL
+ * tpd Textseq-id , -- Third Party Annot/Seq DDBJ
+ * gpipe Textseq-id , -- Internal NCBI genome pipeline processing ID
+ * named-annot-track Textseq-id -- Internal named annotation tracking ID
+ * }
+ */
+static int
+parse_seq_id(ESL_SQNCBI_DATA *ncbi)
+{
+ int status;
+ int *id_ptr;
+
+ unsigned char c;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ if (parse_consume(ncbi, &c, 1) != eslOK) return eslEFORMAT;
+
+ /* parse the different seq id structures */
+ while (c != 0x00) {
+ if (parse_expect(ncbi, "\x80", 1) != eslOK) return eslEFORMAT;
+ switch (c) {
+ case 0xa0: /* LOCAL */
+ status = parse_object_id(ncbi);
+ break;
+ case 0xa1: /* GIBBSQ */
+ id_ptr = (ncbi->int_id != -1) ? NULL : &ncbi->int_id;
+ status = parse_integer(ncbi, id_ptr);
+ break;
+ case 0xa2: /* GIBBMT */
+ status = parse_integer(ncbi, NULL);
+ break;
+ case 0xa3: /* GIIM */
+ status = parse_giimport_id(ncbi);
+ break;
+ case 0xa4: /* GENBANK */
+ case 0xa5: /* EMBL */
+ case 0xa6: /* PIR */
+ case 0xa7: /* SWISSPROT */
+ status = parse_textseq_id(ncbi);
+ break;
+ case 0xa8: /* PATENT */
+ status = parse_patent_seq_id(ncbi);
+ break;
+ case 0xa9: /* OTHER */
+ status = parse_textseq_id(ncbi);
+ break;
+ case 0xaa: /* GENERAL */
+ status = parse_dbtag(ncbi);
+ break;
+ case 0xab: /* GI */
+ status = parse_integer(ncbi, NULL);
+ break;
+ case 0xac: /* DDBJ */
+ case 0xad: /* PRF */
+ status = parse_textseq_id(ncbi);
+ break;
+ case 0xae: /* PDB */
+ status = parse_pdb_seq_id(ncbi);
+ break;
+ case 0xaf: /* TPG */
+ case 0xb0: /* TPE */
+ case 0xb1: /* TPD */
+ case 0xb2: /* GPIPE */
+ case 0xb3: /* NAMED ANNOT TRACK */
+ status = parse_textseq_id(ncbi);
+ break;
+ default:
+ status = eslEFORMAT;
+ }
+
+ if (status != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ if (parse_consume(ncbi, &c, 1) != eslOK) return eslEFORMAT;
+ }
+
+ /* verify we are at the end of the structure */
+ if (c != 0x00 || parse_expect(ncbi, "\x00", 1) != eslOK) return eslEFORMAT;
+
+ return eslOK;
+}
+
+
+/* Function: parse_textseq_id()
+ * Synopsis: Parse the general text header
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Textseq-id ::= SEQUENCE {
+ * name VisibleString OPTIONAL ,
+ * accession VisibleString OPTIONAL ,
+ * release VisibleString OPTIONAL ,
+ * version INTEGER OPTIONAL
+ * }
+ */
+static int
+parse_textseq_id(ESL_SQNCBI_DATA *ncbi)
+{
+ char *acc = NULL;
+ int alen = 0;
+ char *name = NULL;
+ int nlen = 0;
+
+ int status;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ /* look for an optional name */
+ if (parse_accept(ncbi, "\xa0\x80", 2) == eslOK) {
+ if ((status = parse_string(ncbi, &name, &nlen)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional accession */
+ if (parse_accept(ncbi, "\xa1\x80", 2) == eslOK) {
+ if ((status = parse_string(ncbi, &acc, &alen)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional release */
+ if (parse_accept(ncbi, "\xa2\x80", 2) == eslOK) {
+ if ((status = parse_string(ncbi, NULL, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional version */
+ if (parse_accept(ncbi, "\xa3\x80", 2) == eslOK) {
+ if ((status = parse_integer(ncbi, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ /* if we found both the accession and name and so far
+ * we have only come across incomplete headers, save
+ * this one off.
+ */
+ if (acc != NULL && name != NULL) {
+ if (ncbi->name_ptr == NULL || ncbi->acc_ptr == NULL) {
+ ncbi->name_ptr = name;
+ ncbi->name_size = nlen;
+ ncbi->acc_ptr = acc;
+ ncbi->acc_size = alen;
+ }
+
+ } else if (ncbi->name_ptr == NULL && ncbi->acc_ptr == NULL) {
+ /* if neither the accession or name have been set, and the
+ * header supplied one, save it off.
+ */
+ if (acc != NULL) {
+ ncbi->acc_ptr = acc;
+ ncbi->acc_size = alen;
+ }
+ if (name != NULL) {
+ ncbi->name_ptr = name;
+ ncbi->name_size = nlen;
+ }
+ }
+
+ return eslOK;
+}
+
+
+/* Function: parse_dbtag()
+ * Synopsis: Parse the a general db tag
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Dbtag ::= SEQUENCE {
+ * db VisibleString , -- name of database or system
+ * tag Object-id -- appropriate tag
+ * }
+ */
+static int
+parse_dbtag(ESL_SQNCBI_DATA *ncbi)
+{
+ int status;
+ int temp_id;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ /* look for an db name */
+ if (parse_expect(ncbi, "\xa0\x80", 2) != eslOK) return eslEFORMAT;
+ if ((status = parse_string(ncbi, 0, NULL)) != eslOK) return status;
+
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ /* it looks like the dbtag is used when formatdb is run
+ * without parsing sequence ids (ie -o F). if that is
+ * the case, the id is equal to the sequence number in
+ * the database. so for dbtag headers, nothing will be
+ * saved. to do this lets create a bogus id value and
+ * restore it after dbtag is parsed.
+ */
+ temp_id = ncbi->int_id;
+ ncbi->int_id = 1;
+
+ /* look for a tag object */
+ if (parse_expect(ncbi, "\xa1\x80", 2) != eslOK) return eslEFORMAT;
+ if ((status = parse_object_id(ncbi)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ /* restore the id value */
+ ncbi->int_id = temp_id;
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ return eslOK;
+}
+
+
+/* Function: parse_giimport_id()
+ * Synopsis: Parse the a giimport id
+ * Incept: MSF, Thu Mar 25, 2010 [Janelia]
+ *
+ * Giimport-id ::= SEQUENCE {
+ * id INTEGER, -- the id to use here
+ * db VisibleString OPTIONAL, -- dbase used in
+ * release VisibleString OPTIONAL } -- the release
+ * }
+ */
+static int
+parse_giimport_id(ESL_SQNCBI_DATA *ncbi)
+{
+ int status;
+ int id;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ /* look for an id */
+ if (parse_expect(ncbi, "\xa0\x80", 2) != eslOK) return eslEFORMAT;
+ if ((status = parse_integer(ncbi, &id)) != eslOK) return status;
+
+ /* look for an optional database */
+ if (parse_accept(ncbi, "\xa1\x80", 2) == eslOK) {
+ if ((status = parse_string(ncbi, NULL, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional release */
+ if (parse_accept(ncbi, "\xa2\x80", 2) == eslOK) {
+ if ((status = parse_string(ncbi, NULL, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ /* if there is not already a saved seq id, save it */
+ if (ncbi->int_id == -1 && ncbi->str_id_ptr == NULL) {
+ ncbi->int_id = id;
+ }
+
+ return eslOK;
+}
+
+
+/* Function: parse_patent_seq_id()
+ * Synopsis: Parse the patent header
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Patent-seq-id ::= SEQUENCE {
+ * seqid INTEGER , -- number of sequence in patent
+ * cit Id-pat -- patent citation
+ * }
+ */
+static int
+parse_patent_seq_id(ESL_SQNCBI_DATA *ncbi)
+{
+ int status;
+ int id;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ /* look for a seqid */
+ if (parse_expect(ncbi, "\xa0\x80", 2) != eslOK) return eslEFORMAT;
+ if ((status = parse_integer(ncbi, &id)) != eslOK) return status;
+
+ /* look for a patent citation object */
+ if (parse_expect(ncbi, "\xa1\x80", 2) != eslOK) return eslEFORMAT;
+ if ((status = parse_id_pat(ncbi)) != eslOK) return status;
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ /* if there is not already a saved seq id, save it */
+ if (ncbi->int_id == -1 && ncbi->str_id_ptr == NULL) {
+ ncbi->int_id = id;
+ }
+
+ return eslOK;
+}
+
+
+/* Function: parse_id_pat()
+ * Synopsis: Parse the patent citation
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Id-pat ::= SEQUENCE { -- just to identify a patent
+ * country VisibleString , -- Patent Document Country
+ * id CHOICE {
+ * number VisibleString , -- Patent Document Number
+ * app-number VisibleString -- Patent Doc Appl Number
+ * } ,
+ * doc-type VisibleString OPTIONAL -- Patent Doc Type
+ * }
+ */
+static int
+parse_id_pat(ESL_SQNCBI_DATA *ncbi)
+{
+ int status;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ /* look for a country */
+ if (parse_expect(ncbi, "\xa0\x80", 2) != eslOK) return eslEFORMAT;
+ if ((status = parse_string(ncbi, NULL, NULL)) != eslOK) return status;
+
+ /* look for an id */
+ if (parse_expect(ncbi, "\xa1\x80", 2) != eslOK) return eslEFORMAT;
+
+ /* the id is a choice of two strings */
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ /* look for an optional taxonomy id */
+ if (parse_accept(ncbi, "\xa0\x80", 2) == eslOK) {
+ status = parse_string(ncbi, NULL, NULL);
+ } else if (parse_accept(ncbi, "\xa1\x80", 2) == eslOK) {
+ status = parse_string(ncbi, NULL, NULL);
+ } else {
+ status = eslEFORMAT;
+ }
+ if (status != eslOK) return status;
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ /* look for a doc type */
+ if (parse_accept(ncbi, "\xa3\x80", 2) == eslOK) {
+ if ((status = parse_string(ncbi, NULL, NULL)) != eslOK) return eslEFORMAT;
+ }
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ return eslOK;
+}
+
+
+/* Function: parse_object_id()
+ * Synopsis: Parse a generic sequence id
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Object-id ::= CHOICE {
+ * id INTEGER ,
+ * str VisibleString
+ * }
+ */
+static int
+parse_object_id(ESL_SQNCBI_DATA *ncbi)
+{
+ int status;
+
+ char *id_str = NULL;
+ int id_len = 0;
+ int id = -1;
+
+ /* look for an optional taxonomy id */
+ if (parse_accept(ncbi, "\xa0\x80", 2) == eslOK) {
+ status = parse_integer(ncbi, &id);
+ } else if (parse_accept(ncbi, "\xa1\x80", 2) == eslOK) {
+ status = parse_string(ncbi, &id_str, &id_len);
+ } else {
+ status = eslEFORMAT;
+ }
+
+ /* verify we are at the end of the structure */
+ if (status == eslOK) {
+ status = parse_expect(ncbi, "\x00\x00", 2);
+
+ /* if there is not already a saved seq id, save it */
+ if (ncbi->int_id == -1 && ncbi->str_id_ptr == NULL) {
+ if (id_str != NULL) {
+ ncbi->str_id_ptr = id_str;
+ ncbi->str_id_size = id_len;
+ } else if (id != -1) {
+ ncbi->int_id = id;
+ }
+ }
+ }
+
+ return status;
+}
+
+
+/* Function: parse_pdb_seq_id()
+ * Synopsis: Parse a PDB sequence
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * PDB-seq-id ::= SEQUENCE {
+ * mol PDB-mol-id , -- the molecule name
+ * chain INTEGER , -- a single ASCII character, chain id
+ * rel Date OPTIONAL } -- release date, month and year
+ *
+ * Date ::= CHOICE {
+ * str VisibleString , -- for those unparsed dates
+ * std Date-std -- use this if you can
+ * }
+ */
+static int
+parse_pdb_seq_id(ESL_SQNCBI_DATA *ncbi)
+{
+ int status;
+
+ char *id;
+ int len;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ /* look for an pdb mol id */
+ if (parse_expect(ncbi, "\xa0\x80", 2) != eslOK) return eslEFORMAT;
+ if ((status = parse_string(ncbi, &id, &len)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ /* look for chain */
+ if (parse_accept(ncbi, "\xa1\x80", 2) == eslOK) {
+ if ((status = parse_integer(ncbi, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional date */
+ if (parse_accept(ncbi, "\xa2\x80", 2) == eslOK) {
+ if (parse_accept(ncbi, "\xa0\x80", 2) == eslOK) {
+ status = parse_string(ncbi, NULL, NULL);
+ } else if (parse_accept(ncbi, "\xa1\x80", 2) == eslOK) {
+ status = parse_date_std(ncbi);
+ } else {
+ status = eslEFORMAT;
+ }
+ if (status != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* if there is not already a saved seq id, save it */
+ if (ncbi->int_id == -1 && ncbi->str_id_ptr == NULL) {
+ ncbi->str_id_ptr = id;
+ ncbi->str_id_size = len;
+ }
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ return eslOK;
+}
+
+
+/* Function: parse_date_std()
+ * Synopsis: Parse the data structure
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Date-std ::= SEQUENCE { -- NOTE: this is NOT a unix tm struct
+ * year INTEGER , -- full year (including 1900)
+ * month INTEGER OPTIONAL , -- month (1-12)
+ * day INTEGER OPTIONAL , -- day of month (1-31)
+ * season VisibleString OPTIONAL , -- for "spring", "may-june", etc
+ * hour INTEGER OPTIONAL , -- hour of day (0-23)
+ * minute INTEGER OPTIONAL , -- minute of hour (0-59)
+ * second INTEGER OPTIONAL -- second of minute (0-59)
+ * }
+ */
+static int
+parse_date_std(ESL_SQNCBI_DATA *ncbi)
+{
+ int status;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ /* look for a year */
+ if (parse_expect(ncbi, "\xa0\x80", 2) != eslOK) return eslEFORMAT;
+ if ((status = parse_integer(ncbi, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ /* look for an optional month */
+ if (parse_accept(ncbi, "\xa1\x80", 2) == eslOK) {
+ if ((status = parse_integer(ncbi, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional day */
+ if (parse_accept(ncbi, "\xa2\x80", 2) == eslOK) {
+ if ((status = parse_integer(ncbi, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional season */
+ if (parse_accept(ncbi, "\xa3\x80", 2) == eslOK) {
+ if ((status = parse_string(ncbi, NULL, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional hour */
+ if (parse_accept(ncbi, "\xa4\x80", 2) == eslOK) {
+ if ((status = parse_integer(ncbi, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional minute */
+ if (parse_accept(ncbi, "\xa5\x80", 2) == eslOK) {
+ if ((status = parse_integer(ncbi, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* look for an optional second */
+ if (parse_accept(ncbi, "\xa6\x80", 2) == eslOK) {
+ if ((status = parse_integer(ncbi, NULL)) != eslOK) return status;
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+ }
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ return eslOK;
+}
+
+
+/* Function: parse_string()
+ * Synopsis: Parse a visible string
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Parses a string from the header stream.
+ *
+ * If <str> is non null, the location of the string in
+ * the header will be saved. If <len> is non null, the
+ * length of the string will be filled in. If <str> is
+ * non null, then <len> must be non null since the strings
+ * are not zero terminated.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEFORMAT> if there's a problem with the format.
+ * <eslEINCOMPAT> if <str> is non null and <len> is null.
+ *
+ */
+static int
+parse_string(ESL_SQNCBI_DATA *ncbi, char **str, int *len)
+{
+ int n;
+
+ unsigned char x;
+ unsigned char c;
+ unsigned char *ptr;
+
+ if (parse_expect(ncbi, "\x1a", 1) != eslOK) return eslEFORMAT;
+
+ /* the next byte is the length of the string. if the length is
+ * less than 128, then this is the true length; otherwise this
+ * length describes the number of bytes necessary to hold the
+ * true length of the string in the lower 7 bits.
+ */
+ if (parse_consume(ncbi, &c, 1) != eslOK) return eslEFORMAT;
+ if (c < 128) {
+ n = c;
+ } else {
+ c = c & 0x7f;
+ if (c > sizeof(n)) return eslEFORMAT;
+
+ n = 0;
+ while (c > 0) {
+ if (parse_consume(ncbi, &x, 1) != eslOK) return eslEFORMAT;
+ n = (n << 8) + (unsigned int) x;
+ --c;
+ }
+ }
+
+ /* validate the length of the string */
+ ptr = ncbi->hdr_ptr;
+ if (parse_advance(ncbi, n) != eslOK) return eslEFORMAT;
+
+ /* fill in the values */
+ if (str != NULL && len == NULL) return eslEINCOMPAT;
+ if (len != NULL) *len = n;
+ if (str != NULL) *str = (char *)ptr;
+
+ return eslOK;
+}
+
+
+/* Function: parse_integer()
+ * Synopsis: Parse an integer
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Reads an integer from the header stream. If the integer is
+ * more bytes than the native int format, the most significant
+ * bytes will be lost.
+ *
+ * If <value> is non null, the parsed integer will be placed
+ * in the pointer.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEFORMAT> if there's a problem with the format.
+ *
+ */
+static int
+parse_integer(ESL_SQNCBI_DATA *ncbi, int *value)
+{
+ int n;
+
+ unsigned char c;
+ unsigned char *ptr;
+
+ if (parse_expect(ncbi, "\x02", 1) != eslOK) return eslEFORMAT;
+
+ /* get the length of the integer */
+ if (parse_peek(ncbi, &c) != eslOK) return eslEFORMAT;
+ ptr = ncbi->hdr_ptr + 1;
+
+ /* advance past the integer to make sure the buffer holds all
+ * of the integer. the pointer <ptr> points the the start of
+ * the integer.
+ */
+ if (parse_advance(ncbi, c + 1) != eslOK) return eslEFORMAT;
+
+ n = 0;
+ while (c > 0) {
+ n = (n << 8) + (unsigned int) *ptr++;
+ --c;
+ }
+
+ if (value != NULL) *value = n;
+
+ return eslOK;
+}
+
+
+/* Function: ignore_sequence_of_integer()
+ * Synopsis: Skip over the sequence of integers
+ * Incept: MSF, Mon Dec 10, 2009 [Janelia]
+ *
+ * Purpose: Skip over a sequence of integers.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEFORMAT> if there's a problem with the format.
+ *
+ */
+static int
+ignore_sequence_of_integer(ESL_SQNCBI_DATA *ncbi)
+{
+ int status;
+ unsigned char c;
+
+ /* verify we are at the beginning of a structure */
+ if (parse_expect(ncbi, "\x30\x80", 2) != eslOK) return eslEFORMAT;
+
+ if (parse_peek(ncbi, &c) != eslOK) return eslEFORMAT;
+ while (c == 0x02) {
+ if ((status = parse_integer(ncbi, NULL)) != eslOK) return status;
+ if (parse_peek(ncbi, &c) != eslOK) return eslEFORMAT;
+ }
+
+ /* verify we are at the end of the structure */
+ if (parse_expect(ncbi, "\x00\x00", 2) != eslOK) return eslEFORMAT;
+
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_sqio_ncbi.h b/esl_sqio_ncbi.h
new file mode 100644
index 0000000..8297d6d
--- /dev/null
+++ b/esl_sqio_ncbi.h
@@ -0,0 +1,110 @@
+/* Unaligned ncbi sequence file i/o.
+ *
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslSQIO_NCBI_INCLUDED
+#define eslSQIO_NCBI_INCLUDED
+
+#include <stdio.h>
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+
+/* forward declaration */
+struct esl_sqio_s;
+
+/* set the max residue count to 1 meg when reading a block */
+#define MAX_RESIDUE_COUNT (1024 * 1024)
+
+#define MAX_DB_VOLUMES 100
+
+/* ESL_SQNCBI_VOLUME:
+ * Information for the volume
+ */
+typedef struct esl_sqncbi_vol_s {
+ char *name; /* name of the volume */
+
+ uint32_t start_seq; /* starting sequence number */
+ uint32_t end_seq; /* ending sequence number */
+
+ uint32_t hdr_off; /* disk offset in .pin to header index */
+ uint32_t seq_off; /* disk offset to .pin to sequence index */
+ uint32_t amb_off; /* disk offset to .pin to ambiguous index */
+} ESL_SQNCBI_VOLUME;
+
+/* ESL_SQNCBI:
+ * An open sequence file for reading.
+ */
+typedef struct esl_sqncbi_s {
+ FILE *fppin; /* Open .pin file ptr */
+ FILE *fpphr; /* Open .phr file ptr */
+ FILE *fppsq; /* Open .psq file ptr */
+ char errbuf[eslERRBUFSIZE];/* parse error mesg. Size must match msa.h */
+
+ char *title; /* database title */
+ int version; /* database version */
+ char *timestamp; /* time stamp of database creation */
+
+ uint32_t num_seq; /* number of sequences in the database */
+ uint64_t total_res; /* total number of residues */
+ uint32_t max_seq; /* longest sequence in the database */
+
+ uint32_t hdr_off; /* disk offset in .pin to header index */
+ uint32_t seq_off; /* disk offset to .pin to sequence index */
+ uint32_t amb_off; /* disk offset to .pin to ambiguous index */
+
+ int index; /* current sequence index in the database */
+ uint32_t vol_index; /* current volume index (-1 if no volumes) */
+ uint32_t roff; /* record offset (start of header) */
+ uint32_t hoff; /* offset to last byte of header */
+ uint32_t doff; /* data offset (start of sequence data) */
+ uint32_t eoff; /* offset to last byte of sequence */
+
+ uint32_t index_start; /* start of indexes currently loaded */
+ uint32_t index_end; /* end of indexes currently loaded */
+ uint32_t *hdr_indexes; /* block of header indexes from .pin */
+ uint32_t *seq_indexes; /* block of header indexes from .pin */
+ uint32_t *amb_indexes; /* block of header indexes from .pin */
+
+ /* volume information */
+ uint32_t volumes; /* number of volumes */
+ ESL_SQNCBI_VOLUME vols[MAX_DB_VOLUMES];
+
+ /* information for the current header */
+ unsigned char *hdr_buf; /* buffer for holding unparsed header */
+ unsigned char *hdr_ptr; /* current parser position */
+ int hdr_alloced; /* size of the allocated buffer */
+
+ char *name_ptr; /* pointer to name NOT NULL TERMINATED */
+ int32_t name_size; /* length of the name */
+ char *acc_ptr; /* pointer to accession NOT NULL TERMINATED */
+ int32_t acc_size; /* length of the accession */
+ int32_t int_id; /* integer sequence id */
+ char *str_id_ptr; /* pointer to id NOT NULL TERMINATED */
+ int32_t str_id_size; /* length of the id */
+
+ /* information on the current sequence */
+ uint32_t seq_apos; /* position of ambiguity table */
+ uint32_t seq_alen; /* size of ambiguity table */
+ uint32_t seq_cpos; /* current position in ambiguity table */
+ int32_t seq_L; /* true sequence length */
+
+ /* alphabet used to convert ncbi to hmmer to ascii */
+ int alphatype; /* amino or dna */
+ char *alphasym; /* string of residues */
+
+} ESL_SQNCBI_DATA;
+
+
+extern int esl_sqncbi_Open(char *seqfile, int format, struct esl_sqio_s *sqfp);
+
+
+#endif /*eslSQIO_NCBI_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_sse.c b/esl_sse.c
new file mode 100644
index 0000000..8f83519
--- /dev/null
+++ b/esl_sse.c
@@ -0,0 +1,623 @@
+/* Vectorized routines for Intel/AMD, using Streaming SIMD Extensions (SSE).
+ *
+ * Table of contents
+ * 1. SIMD logf(), expf()
+ * 2. Utilities for ps vectors (4 floats in a __m128)
+ * 3. Utilities for epu8 vectors (16 uchars in a __m128i)
+ * 3. Benchmark
+ * 4. Unit tests
+ * 5. Test driver
+ * 6. Example
+ * 7. Copyright and license
+ *
+ *****************************************************************
+ * Credits:
+ *
+ * The logf() and expf() routines are derivatives of routines by
+ * Julien Pommier [http://gruntthepeon.free.fr/ssemath/]. Those
+ * routines were in turn based on serial implementations in the Cephes
+ * math library by Stephen Moshier [Moshier89;
+ * http://www.moshier.net/#Cephes]. Thanks and credit to both Moshier
+ * and Pommier for their clear code. Additional copyright and license
+ * information is appended at the end of the file.
+ */
+#include "esl_config.h"
+#ifdef HAVE_SSE2
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <xmmintrin.h> /* SSE */
+#include <emmintrin.h> /* SSE2 */
+
+#include "easel.h"
+#include "esl_sse.h"
+
+
+/*****************************************************************
+ * 1. SSE SIMD logf(), expf()
+ *****************************************************************/
+
+/* As of Dec 2007, I am unaware of any plans for Intel/AMD to release
+ * SSE intrinsics for logf(), expf(), or other special functions.
+ *
+ * I need them, and the code below should suffice. If you know of
+ * better ways to compute these functions, please let me know.
+ */
+
+/* Function: esl_sse_logf()
+ * Synopsis: <r[z] = log x[z]>
+ * Incept: SRE, Fri Dec 14 11:32:54 2007 [Janelia]
+ *
+ * Purpose: Given a vector <x> containing four floats, returns a
+ * vector <r> in which each element <r[z] = logf(x[z])>.
+ *
+ * Valid in the domain $x_z > 0$ for normalized IEEE754
+ * $x_z$.
+ *
+ * For <x> $< 0$, including -0, returns <NaN>. For <x> $==
+ * 0$ or subnormal <x>, returns <-inf>. For <x = inf>,
+ * returns <inf>. For <x = NaN>, returns <NaN>. For
+ * subnormal <x>, returns <-inf>.
+ *
+ * Xref: J2/71.
+ *
+ * Note: Derived from an SSE1 implementation by Julian
+ * Pommier. Converted to SSE2 and added handling
+ * of IEEE754 specials.
+ */
+__m128
+esl_sse_logf(__m128 x)
+{
+ static float cephes_p[9] = { 7.0376836292E-2f, -1.1514610310E-1f, 1.1676998740E-1f,
+ -1.2420140846E-1f, 1.4249322787E-1f, -1.6668057665E-1f,
+ 2.0000714765E-1f, -2.4999993993E-1f, 3.3333331174E-1f };
+ __m128 onev = _mm_set1_ps(1.0f); /* all elem = 1.0 */
+ __m128 v0p5 = _mm_set1_ps(0.5f); /* all elem = 0.5 */
+ __m128i vneg = _mm_set1_epi32(0x80000000); /* all elem have IEEE sign bit up */
+ __m128i vexp = _mm_set1_epi32(0x7f800000); /* all elem have IEEE exponent bits up */
+ __m128i ei;
+ __m128 e;
+ __m128 invalid_mask, zero_mask, inf_mask; /* masks used to handle special IEEE754 inputs */
+ __m128 mask;
+ __m128 origx;
+ __m128 tmp;
+ __m128 y;
+ __m128 z;
+
+ /* first, split x apart: x = frexpf(x, &e); */
+ ei = _mm_srli_epi32( _mm_castps_si128(x), 23); /* shift right 23: IEEE754 floats: ei = biased exponents */
+ invalid_mask = _mm_castsi128_ps ( _mm_cmpeq_epi32( _mm_and_si128(_mm_castps_si128(x), vneg), vneg)); /* mask any elem that's negative; these become NaN */
+ zero_mask = _mm_castsi128_ps ( _mm_cmpeq_epi32(ei, _mm_setzero_si128())); /* mask any elem zero or subnormal; these become -inf */
+ inf_mask = _mm_castsi128_ps ( _mm_cmpeq_epi32( _mm_and_si128(_mm_castps_si128(x), vexp), vexp)); /* mask any elem inf or NaN; log(inf)=inf, log(NaN)=NaN */
+ origx = x; /* store original x, used for log(inf) = inf, log(NaN) = NaN */
+
+ x = _mm_and_ps(x, _mm_castsi128_ps(_mm_set1_epi32(~0x7f800000))); /* x now the stored 23 bits of the 24-bit significand */
+ x = _mm_or_ps (x, v0p5); /* sets hidden bit b[0] */
+
+ ei = _mm_sub_epi32(ei, _mm_set1_epi32(126)); /* -127 (ei now signed base-2 exponent); then +1 */
+ e = _mm_cvtepi32_ps(ei);
+
+ /* now, calculate the log */
+ mask = _mm_cmplt_ps(x, _mm_set1_ps(0.707106781186547524f)); /* avoid conditional branches. */
+ tmp = _mm_and_ps(x, mask); /* tmp contains x values < 0.707, else 0 */
+ x = _mm_sub_ps(x, onev);
+ e = _mm_sub_ps(e, _mm_and_ps(onev, mask));
+ x = _mm_add_ps(x, tmp);
+ z = _mm_mul_ps(x,x);
+
+ y = _mm_set1_ps(cephes_p[0]); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[1])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[2])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[3])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[4])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[5])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[6])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[7])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[8])); y = _mm_mul_ps(y, x);
+ y = _mm_mul_ps(y, z);
+
+ tmp = _mm_mul_ps(e, _mm_set1_ps(-2.12194440e-4f));
+ y = _mm_add_ps(y, tmp);
+
+ tmp = _mm_mul_ps(z, v0p5);
+ y = _mm_sub_ps(y, tmp);
+
+ tmp = _mm_mul_ps(e, _mm_set1_ps(0.693359375f));
+ x = _mm_add_ps(x, y);
+ x = _mm_add_ps(x, tmp);
+
+ /* IEEE754 cleanup: */
+ x = esl_sse_select_ps(x, origx, inf_mask); /* log(inf)=inf; log(NaN) = NaN */
+ x = _mm_or_ps(x, invalid_mask); /* log(x<0, including -0,-inf) = NaN */
+ x = esl_sse_select_ps(x, _mm_set1_ps(-eslINFINITY), zero_mask); /* x zero or subnormal = -inf */
+ return x;
+}
+
+/* Function: esl_sse_expf()
+ * Synopsis: <r[z] = exp x[z]>
+ * Incept: SRE, Fri Dec 14 14:46:27 2007 [Janelia]
+ *
+ * Purpose: Given a vector <x> containing four floats, returns a
+ * vector <r> in which each element <r[z] = expf(x[z])>.
+ *
+ * Valid for all IEEE754 floats $x_z$.
+ *
+ * Xref: J2/71
+ * J10/62: bugfix, minlogf/maxlogf range was too wide;
+ * (k+127) must be >=0 and <=255, so (k+127)<<23
+ * is a valid IEEE754 float, without touching
+ * the sign bit. Pommier had this right in the
+ * first place, and I didn't understand.
+ *
+ * Note: Derived from an SSE1 implementation by Julian
+ * Pommier. Converted to SSE2.
+ *
+ * Note on maxlogf/minlogf, which are close to but not
+ * exactly 127.5/log2 [J10/63]. We need -127<=k<=128, so
+ * k+127 is 0..255, a valid IEEE754 8-bit exponent
+ * (0..255), so the bit pattern (k+127)<<23 is IEEE754
+ * single-precision for 2^k. If k=-127, we get IEEE754 0.
+ * If k=128, we get IEEE754 +inf. If k<-127, k+127 is
+ * negative and we get screwed up. If k>128, k+127
+ * overflows the 8-bit exponent and sets the sign bit. So
+ * for x' (base 2) < -127.5 we must definitely return e^x ~
+ * 0; for x' < 126.5 we're going to calculate 0 anyway
+ * (because k=floor(-126.5-epsilon+0.5) = -127). So any
+ * minlogf between -126.5 log2 ... -127.5 log2 will suffice
+ * as the cutoff. Ditto for 126.5 log2 .. 127.5log2.
+ * That's 87.68312 .. 88.3762655. I think Pommier's
+ * thinking is, you don't want to get to close to the
+ * edges, lest fp roundoff error screw you (he may have
+ * consider 1 ulp carefully, I can't tell), but otherwise
+ * you may as well put your bounds close to the outer edge;
+ * so
+ * maxlogf = 127.5 log(2) - epsilon
+ * minlogf = -127.5 log(2) + epsilon
+ * for an epsilon that happen to be ~ 3e-6.
+ */
+__m128
+esl_sse_expf(__m128 x)
+{
+ static float cephes_p[6] = { 1.9875691500E-4f, 1.3981999507E-3f, 8.3334519073E-3f,
+ 4.1665795894E-2f, 1.6666665459E-1f, 5.0000001201E-1f };
+ static float cephes_c[2] = { 0.693359375f, -2.12194440e-4f };
+ static float maxlogf = 88.3762626647949f; /* 127.5 log(2) - epsilon. above this, 0.5+x/log2 gives k>128 and breaks 2^k "float" construction, because (k+127)<<23 must be a valid IEEE754 exponent 0..255 */
+ static float minlogf = -88.3762626647949f; /*-127.5 log(2) + epsilon. below this, 0.5+x/log2 gives k<-127 and breaks 2^k, see above */
+ __m128i k;
+ __m128 mask, tmp, fx, z, y, minmask, maxmask;
+
+ /* handle out-of-range and special conditions */
+ maxmask = _mm_cmpgt_ps(x, _mm_set1_ps(maxlogf));
+ minmask = _mm_cmple_ps(x, _mm_set1_ps(minlogf));
+
+ /* range reduction: exp(x) = 2^k e^f = exp(f + k log 2); k = floorf(0.5 + x / log2): */
+ fx = _mm_mul_ps(x, _mm_set1_ps(eslCONST_LOG2R));
+ fx = _mm_add_ps(fx, _mm_set1_ps(0.5f));
+
+ /* floorf() with SSE: */
+ k = _mm_cvttps_epi32(fx); /* cast to int with truncation */
+ tmp = _mm_cvtepi32_ps(k); /* cast back to float */
+ mask = _mm_cmpgt_ps(tmp, fx); /* if it increased (i.e. if it was negative...) */
+ mask = _mm_and_ps(mask, _mm_set1_ps(1.0f)); /* ...without a conditional branch... */
+ fx = _mm_sub_ps(tmp, mask); /* then subtract one. */
+ k = _mm_cvttps_epi32(fx); /* k is now ready for the 2^k part. */
+
+ /* polynomial approx for e^f for f in range [-0.5, 0.5] */
+ tmp = _mm_mul_ps(fx, _mm_set1_ps(cephes_c[0]));
+ z = _mm_mul_ps(fx, _mm_set1_ps(cephes_c[1]));
+ x = _mm_sub_ps(x, tmp);
+ x = _mm_sub_ps(x, z);
+ z = _mm_mul_ps(x, x);
+
+ y = _mm_set1_ps(cephes_p[0]); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[1])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[2])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[3])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[4])); y = _mm_mul_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(cephes_p[5])); y = _mm_mul_ps(y, z);
+ y = _mm_add_ps(y, x);
+ y = _mm_add_ps(y, _mm_set1_ps(1.0f));
+
+ /* build 2^k by hand, by creating a IEEE754 float */
+ k = _mm_add_epi32(k, _mm_set1_epi32(127));
+ k = _mm_slli_epi32(k, 23);
+ fx = _mm_castsi128_ps(k);
+
+ /* put 2^k e^f together (fx = 2^k, y = e^f) and we're done */
+ y = _mm_mul_ps(y, fx);
+
+ /* special/range cleanup */
+ y = esl_sse_select_ps(y, _mm_set1_ps(eslINFINITY), maxmask); /* exp(x) = inf for x > log(2^128) */
+ y = esl_sse_select_ps(y, _mm_set1_ps(0.0f), minmask); /* exp(x) = 0 for x < log(2^-149) */
+ return y;
+}
+
+
+/*****************************************************************
+ * 2. Utilities for ps vectors (4 floats in a __m128)
+ *****************************************************************/
+
+void
+esl_sse_dump_ps(FILE *fp, __m128 v)
+{
+ float *p = (float *)&v;
+ fprintf(fp, "[%13.8g, %13.8g, %13.8g, %13.8g]", p[0], p[1], p[2], p[3]);
+}
+
+
+
+
+/*****************************************************************
+ * 3. Benchmark
+ *****************************************************************/
+#ifdef eslSSE_BENCHMARK
+
+/* gcc -msse2 -O3 -o benchmark-sse -I ~/src/hmmer/easel -L ~/src/hmmer/easel -DeslSSE_BENCHMARK -DHAVE_SSE2 esl_sse.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_stopwatch.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-N", eslARG_INT,"10000000", NULL, NULL, NULL, NULL, NULL, "number of trials", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "benchmark driver for sse module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_STOPWATCH *w = esl_stopwatch_Create();
+ int N = esl_opt_GetInteger(go, "-N");
+ float origx = 2.0;
+ float x = origx;
+ __m128 xv = _mm_set1_ps(x);
+ int i;
+
+ /* First, serial time. */
+ esl_stopwatch_Start(w);
+ for (i = 0; i < N; i++) { x = logf(x); x = expf(x); }
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "# serial CPU time: ");
+
+ /* Vector time */
+ esl_stopwatch_Start(w);
+ for (i = 0; i < N; i++) { xv = esl_sse_logf(xv); xv = esl_sse_expf(xv); }
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "# vector CPU time: ");
+
+ /* If you don't do something with x and xv, the compiler may optimize them away */
+ printf("%g => many scalar logf,expf cycles => %g\n", origx, x);
+ printf("%g => many vector logf,expf cycles => ", origx);
+ esl_sse_dump_ps(stdout, xv); printf("\n");
+
+ esl_stopwatch_Destroy(w);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+#endif /*eslSSE_BENCHMARK*/
+
+
+/*****************************************************************
+ * 4. Unit tests
+ *****************************************************************/
+#ifdef eslSSE_TESTDRIVE
+
+#include "esl_getopts.h"
+#include "esl_random.h"
+
+/* utest_logf(): Test range/domain of logf */
+static void
+utest_logf(ESL_GETOPTS *go)
+{
+ __m128 x; /* test input */
+ union { __m128 v; float x[4]; } r; /* test output */
+
+ /* Test IEEE754 specials:
+ * log(-inf) = NaN log(x<0) = NaN log(-0) = NaN
+ * log(0) = -inf log(inf) = inf log(NaN) = NaN
+ */
+ x = _mm_set_ps(0.0, -0.0, -1.0, -eslINFINITY); /* set_ps() is in order 3 2 1 0 */
+ r.v = esl_sse_logf(x);
+ if (esl_opt_GetBoolean(go, "-v")) {
+ printf("logf");
+ esl_sse_dump_ps(stdout, x); printf(" ==> ");
+ esl_sse_dump_ps(stdout, r.v); printf("\n");
+ }
+ if (! isnan(r.x[0])) esl_fatal("logf(-inf) should be NaN");
+ if (! isnan(r.x[1])) esl_fatal("logf(-1) should be NaN");
+ if (! isnan(r.x[2])) esl_fatal("logf(-0) should be NaN");
+ if (! (r.x[3] < 0 && isinf(r.x[3]))) esl_fatal("logf(0) should be -inf");
+
+ x = _mm_set_ps(FLT_MAX, FLT_MIN, eslNaN, eslINFINITY);
+ r.v = esl_sse_logf(x);
+ if (esl_opt_GetBoolean(go, "-v")) {
+ printf("logf");
+ esl_sse_dump_ps(stdout, x); printf(" ==> ");
+ esl_sse_dump_ps(stdout, r.v); printf("\n");
+ }
+ if (! isinf(r.x[0])) esl_fatal("logf(inf) should be inf");
+ if (! isnan(r.x[1])) esl_fatal("logf(NaN) should be NaN");
+
+}
+
+/* utest_expf(): Test range/domain of expf */
+static void
+utest_expf(ESL_GETOPTS *go)
+{
+ __m128 x; /* test input */
+ union { __m128 v; float x[4]; } r; /* test output */
+
+ /* exp(-inf) = 0 exp(-0) = 1 exp(0) = 1 exp(inf) = inf exp(NaN) = NaN */
+ x = _mm_set_ps(eslINFINITY, 0.0, -0.0, -eslINFINITY); /* set_ps() is in order 3 2 1 0 */
+ r.v = esl_sse_expf(x);
+ if (esl_opt_GetBoolean(go, "-v")) {
+ printf("expf");
+ esl_sse_dump_ps(stdout, x); printf(" ==> ");
+ esl_sse_dump_ps(stdout, r.v); printf("\n");
+ }
+ if (r.x[0] != 0.0f) esl_fatal("expf(-inf) should be 0");
+ if (r.x[1] != 1.0f) esl_fatal("expf(-0) should be 1");
+ if (r.x[2] != 1.0f) esl_fatal("expf(0) should be 1");
+ if (! isinf(r.x[3])) esl_fatal("expf(inf) should be inf");
+
+ /* exp(NaN) = NaN exp(large) = inf exp(-large) = 0 exp(1) = exp(1) */
+ x = _mm_set_ps(1.0f, -666.0f, 666.0f, eslNaN); /* set_ps() is in order 3 2 1 0 */
+ r.v = esl_sse_expf(x);
+ if (esl_opt_GetBoolean(go, "-v")) {
+ printf("expf");
+ esl_sse_dump_ps(stdout, x); printf(" ==> ");
+ esl_sse_dump_ps(stdout, r.v); printf("\n");
+ }
+ if (! isnan(r.x[0])) esl_fatal("expf(NaN) should be NaN");
+ if (! isinf(r.x[1])) esl_fatal("expf(large x) should be inf");
+ if (r.x[2] != 0.0f) esl_fatal("expf(-large x) should be 0");
+
+ /* Make sure we are correct around the problematic ~minlogf boundary:
+ * (1) e^x for x < -127.5 log2 + epsilon is 0, because that's our minlogf barrier.
+ * (2) e^x for -127.5 log2 < x < -126.5 log2 is 0 too, but is actually calculated
+ * (3) e^x for -126.5 log2 < x should be finite (and close to FLT_MIN)
+ *
+ * minlogf = -127.5 log(2) + epsilon = -88.3762626647949;
+ * and -126.5 log(2) = -87.68311834
+ * so for
+ * (1): expf(-88.3763) => 0
+ * (2): expf(-88.3762) => 0
+ * (3): expf(-87.6832) => 0
+ * (4): expf(-87.6831) => <FLT_MIN (subnormal) : ~8.31e-39 (may become 0 in flush-to-zero mode for subnormals)
+ */
+ x = _mm_set_ps(-88.3763, -88.3762, -87.6832, -87.6831);
+ r.v = esl_sse_expf(x);
+ if (esl_opt_GetBoolean(go, "-v")) {
+ printf("expf");
+ esl_sse_dump_ps(stdout, x); printf(" ==> ");
+ esl_sse_dump_ps(stdout, r.v); printf("\n");
+ }
+ if ( r.x[0] >= FLT_MIN) esl_fatal("expf( -126.5 log2 + eps) should be around FLT_MIN");
+ if ( r.x[1] != 0.0f) esl_fatal("expf( -126.5 log2 - eps) should be 0.0 (by calculation)");
+ if ( r.x[2] != 0.0f) esl_fatal("expf( -127.5 log2 + eps) should be 0.0 (by calculation)");
+ if ( r.x[3] != 0.0f) esl_fatal("expf( -127.5 log2 - eps) should be 0.0 (by min bound): %g", r.x[0]);
+}
+
+/* utest_odds(): test accuracy of logf, expf on odds ratios,
+ * our main intended use.
+ */
+static void
+utest_odds(ESL_GETOPTS *go, ESL_RANDOMNESS *r)
+{
+ int N = esl_opt_GetInteger(go, "-N");
+ int verbose = esl_opt_GetBoolean(go, "-v");
+ int very_verbose = esl_opt_GetBoolean(go, "--vv");
+ int i;
+ float p1, p2, odds;
+ union { __m128 v; float x[4]; } r1;
+ union { __m128 v; float x[4]; } r2;
+ float scalar_r1, scalar_r2;
+ double err1, maxerr1 = 0.0, avgerr1 = 0.0; /* errors on logf() */
+ double err2, maxerr2 = 0.0, avgerr2 = 0.0; /* errors on expf() */
+
+ for (i = 0; i < N; i++)
+ {
+ p1 = esl_rnd_UniformPositive(r);
+ p2 = esl_rnd_UniformPositive(r);
+ odds = p1 / p2;
+
+ if (odds == 0.0) esl_fatal("whoa, odds ratio can't be 0!\n");
+
+ r1.v = esl_sse_logf(_mm_set1_ps(odds)); /* r1.x[z] = log(p1/p2) */
+ scalar_r1 = log(odds);
+
+ err1 = (r1.x[0] == 0. && scalar_r1 == 0.) ? 0.0 : 2 * fabs(r1.x[0] - scalar_r1) / fabs(r1.x[0] + scalar_r1);
+ if (err1 > maxerr1) maxerr1 = err1;
+ avgerr1 += err1 / (float) N;
+ if (isnan(avgerr1)) esl_fatal("whoa, what?\n");
+
+ r2.v = esl_sse_expf(r1.v); /* and back to odds */
+ scalar_r2 = exp(r1.x[0]);
+
+ err2 = (r2.x[0] == 0. && scalar_r2 == 0.) ? 0.0 : 2 * fabs(r2.x[0] - scalar_r2) / fabs(r2.x[0] + scalar_r2);
+ if (err2 > maxerr2) maxerr2 = err2;
+ avgerr2 += err2 / (float) N;
+
+ if (very_verbose)
+ printf("%13.7g %13.7g %13.7g %13.7g %13.7g %13.7g %13.7g\n", odds, scalar_r1, r1.x[0], scalar_r2, r2.x[0], err1, err2);
+ }
+
+ if (verbose) {
+ printf("Average [max] logf() relative error in %d odds trials: %13.8g [%13.8g]\n", N, avgerr1, maxerr1);
+ printf("Average [max] expf() relative error in %d odds trials: %13.8g [%13.8g]\n", N, avgerr2, maxerr2);
+ printf("(random seed : %" PRIu32 ")\n", esl_randomness_GetSeed(r));
+ }
+
+ if (avgerr1 > 1e-8) esl_fatal("average error on logf() is intolerable\n");
+ if (maxerr1 > 1e-6) esl_fatal("maximum error on logf() is intolerable\n");
+ if (avgerr2 > 1e-8) esl_fatal("average error on expf() is intolerable\n");
+ if (maxerr2 > 1e-6) esl_fatal("maximum error on expf() is intolerable\n");
+}
+#endif /*eslSSE_TESTDRIVE*/
+
+
+
+
+/*****************************************************************
+ * 5. Test driver
+ *****************************************************************/
+
+#ifdef eslSSE_TESTDRIVE
+/* gcc -msse2 -g -Wall -o test -I. -L. -DeslSSE_TESTDRIVE esl_sse.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_sse.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-N", eslARG_INT, "10000", NULL, NULL, NULL, NULL, NULL, "number of random test points", 0 },
+ { "-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { "-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "be verbose: show test report", 0 },
+ { "--vv", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "be very verbose: show individual test samples", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for sse module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));;
+
+ utest_logf(go);
+ utest_expf(go);
+ utest_odds(go, r);
+
+ esl_randomness_Destroy(r);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /* eslSSE_TESTDRIVE*/
+
+
+
+
+/*****************************************************************
+ * 6. Example
+ *****************************************************************/
+
+#ifdef eslSSE_EXAMPLE
+/*::cexcerpt::sse_example::begin::*/
+/* gcc -msse2 -g -Wall -o example -I. -L. -DeslSSE_EXAMPLE esl_sse.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_sse.h"
+
+int
+main(int argc, char **argv)
+{
+ float x; /* scalar input */
+ __m128 xv; /* input vector */
+ union { __m128 v; float x[4]; } rv; /* result vector*/
+
+ x = 2.0;
+ xv = _mm_set1_ps(x);
+ rv.v = esl_sse_logf(xv);
+ printf("logf(%f) = %f\n", x, rv.x[0]);
+
+ rv.v = esl_sse_expf(xv);
+ printf("expf(%f) = %f\n", x, rv.x[0]);
+
+ return 0;
+}
+/*::cexcerpt::sse_example::end::*/
+#endif /*eslSSE_EXAMPLE*/
+
+
+#else /* ! HAVE_SSE2*/
+
+/* If we don't have SSE2 compiled in, provide some nothingness to:
+ * a. prevent Mac OS/X ranlib from bitching about .o file that "has no symbols"
+ * b. prevent compiler from bitching about "empty compilation unit"
+ * c. automatically pass the automated tests.
+ */
+#include "easel.h"
+
+void esl_sse_DoAbsolutelyNothing(void) { return; }
+#if defined eslSSE_TESTDRIVE || eslSSE_EXAMPLE || eslSSE_BENCHMARK
+int main(void) { return 0; }
+#endif
+
+#endif /* HAVE_SSE2 or not*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
+/* Additionally, esl_sse_logf() and esl_sse_expf() are
+ * Copyright (C) 2007 Julien Pommier
+ * Copyright (C) 1992 Stephen Moshier
+ *
+ * These functions derived from zlib-licensed routines by
+ * Julien Pommier, http://gruntthepeon.free.fr/ssemath/. The
+ * zlib license:
+ */
+
+/* Copyright (C) 2007 Julien Pommier
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* In turn, Pommier had derived the logf() and expf() functions from
+ * serial versions in the Cephes math library. According to its
+ * readme, Cephes is "copyrighted by the author" and "may be used
+ * freely but it comes with no support or guarantee." Cephes is
+ * available in NETLIB [http://www.netlib.org/cephes/]. NETLIB is
+ * widely considered to be a free scientific code repository, though
+ * the copyright and license status of many parts, including Cephes,
+ * is ill-defined. We have attached Moshier's copyright,
+ * to credit his original contribution. Thanks to both Pommier and
+ * Moshier for their clear code.
+ */
+
diff --git a/esl_sse.h b/esl_sse.h
new file mode 100644
index 0000000..dbea100
--- /dev/null
+++ b/esl_sse.h
@@ -0,0 +1,241 @@
+
+/* Vectorized routines for Intel/AMD, using Streaming SIMD Extensions (SSE).
+ *
+ * This header file, unusually, provides many complete function
+ * implementations; this is so that they can be inlined by the
+ * compiler, for maximum efficiency.
+ *
+ * Contents:
+ * 1. Function declarations (from esl_sse.c)
+ * 2. Inlined utilities for ps vectors (4 floats in __m128)
+ * 3. Inlined utilities for epu8 vectors (16 uchars in __m128i)
+ */
+#ifdef HAVE_SSE2
+#ifndef eslSSE_INCLUDED
+#define eslSSE_INCLUDED
+
+#include "easel.h"
+
+#include <stdio.h>
+#include <xmmintrin.h> /* SSE */
+#include <emmintrin.h> /* SSE2 */
+
+/* Some compilers (gcc 3.4) did not implement SSE2 cast functions
+ * on the theory that they're unnecessary no-ops -- but then
+ * code that has proper SSE cast calls doesn't compile. Provide
+ * the no-ops.
+ */
+#ifndef HAVE_SSE2_CAST
+#define _mm_castps_si128(x) (__m128i)(x)
+#define _mm_castsi128_ps(x) (__m128)(x)
+#endif
+
+
+
+/*****************************************************************
+ * 1. Function declarations (from esl_sse.c)
+ *****************************************************************/
+extern __m128 esl_sse_logf(__m128 x);
+extern __m128 esl_sse_expf(__m128 x);
+extern void esl_sse_dump_ps(FILE *fp, __m128 v);
+
+
+/*****************************************************************
+ * 2. Inline utilities for ps vectors (4 floats in __m128)
+ *****************************************************************/
+
+/* Function: esl_sse_select_ps()
+ * Synopsis: SSE equivalent of <vec_sel()>
+ *
+ * Purpose: Vector select. Returns a vector <r[z] = a[z]> where <mask[z]>
+ * is all 0's; <r[z] = b[z]> where <mask[z]> is all 1's.
+ *
+ * Useful for avoiding conditional branches. For example,
+ * to implement \ccode{if (a > 0) a += a;}:
+ *
+ * \begin{cchunk}
+ * mask = _mm_cmpgt_ps(a, _mm_setzero_ps());
+ * twoa = _mm_add_ps(a, a);
+ * a = esl_sse_select_ps(a, twoa, mask);
+ * \end{cchunk}
+ *
+ * Notes: As recommended by the Altivec/SSE Migration Guide,
+ * Apple Computer, Inc.
+ */
+static inline __m128
+esl_sse_select_ps(__m128 a, __m128 b, __m128 mask)
+{
+ b = _mm_and_ps(b, mask);
+ a = _mm_andnot_ps(mask, a);
+ return _mm_or_ps(a,b);
+}
+
+/* Function: esl_sse_any_gt_ps()
+ * Synopsis: Returns TRUE if any a[z] > b[z]
+ *
+ * Purpose: Returns TRUE if any a[z] > b[z] in two
+ * <ps> vectors of floats.
+ *
+ * Xref: From Apple Altivec/SSE migration guide.
+ */
+static inline int
+esl_sse_any_gt_ps(__m128 a, __m128 b)
+{
+ __m128 mask = _mm_cmpgt_ps(a,b);
+ int maskbits = _mm_movemask_ps( mask );
+ return maskbits != 0;
+}
+
+
+/* Function: esl_sse_hmax_ps()
+ * Synopsis: Find the maximum of elements in a vector.
+ *
+ * Purpose: Find the maximum valued element in the four float elements
+ * in <a>, and return that maximum value in <*ret_max>.
+ *
+ * Xref: J3/90 for benchmarking of some alternative implementations.
+ */
+static inline void
+esl_sse_hmax_ps(__m128 a, float *ret_max)
+{
+ a = _mm_max_ps(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1)));
+ a = _mm_max_ps(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2)));
+ _mm_store_ss(ret_max, a);
+}
+
+
+/* Function: esl_sse_hmin_ps()
+ * Synopsis: Find the minimum of elements in a vector.
+ *
+ * Purpose: Find the minimum valued element in the four float elements
+ * in <a> and return that minimum value in <*ret_min>.
+ */
+static inline void
+esl_sse_hmin_ps(__m128 a, float *ret_min)
+{
+ a = _mm_min_ps(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1)));
+ a = _mm_min_ps(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2)));
+ _mm_store_ss(ret_min, a);
+}
+
+/* Function: esl_sse_hsum_ps()
+ * Synopsis: Takes the horizontal sum of elements in a vector.
+ *
+ * Purpose: Add the four float elements in vector <a>; return
+ * that sum in <*ret_sum>.
+ */
+static inline void
+esl_sse_hsum_ps(__m128 a, float *ret_sum)
+{
+ a = _mm_add_ps(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1)));
+ a = _mm_add_ps(a, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2)));
+ _mm_store_ss(ret_sum, a);
+}
+
+
+/* Function: esl_sse_rightshift_ps()
+ * Synopsis: Shift vector elements to the right.
+ *
+ * Purpose: Returns a vector containing
+ * <{ b[0] a[0] a[1] a[2] }>:
+ * i.e. shift the values in <a> to the
+ * right, and load the first value of
+ * <b> into the first slot.
+ */
+static inline __m128
+esl_sse_rightshift_ps(__m128 a, __m128 b)
+{
+ return _mm_move_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 0)), b);
+}
+
+/* Function: esl_sse_leftshift_ps()
+ * Synopsis: Shift vector elements to the left.
+ *
+ * Purpose: Returns a vector containing
+ * <{ a[1] a[2] a[3] b[0]}>:
+ * i.e. shift the values in <a> to the
+ * left and load the first value of
+ * <b> into the first slot.
+ */
+static inline __m128
+esl_sse_leftshift_ps(__m128 a, __m128 b)
+{
+ register __m128 v = _mm_move_ss(a, b); /* now b[0] a[1] a[2] a[3] */
+ return _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 3, 2, 1)); /* now a[1] a[2] a[3] b[0] */
+}
+
+
+
+/*****************************************************************
+ * 3. Inlined utilities for epu8 vectors (16 uchars in __m128i)
+ *****************************************************************/
+
+/* Function: esl_sse_any_gt_epu8()
+ * Synopsis: Returns TRUE if any a[z] > b[z].
+ *
+ * Purpose: Return TRUE if any <a[z] > b[z]> for <z=0..15>
+ * in two <epu8> vectors of unsigned chars.
+ *
+ * We need this incantation because SSE provides
+ * no <cmpgt_epu8> instruction.
+ *
+ * For equality tests, note that <cmpeq_epi8> works fine
+ * for unsigned ints though there is no <cmpeq_epu8>
+ * instruction either).
+ *
+ * See vec_any_gt
+ */
+static inline int
+esl_sse_any_gt_epu8(__m128i a, __m128i b)
+{
+ __m128i mask = _mm_cmpeq_epi8(_mm_max_epu8(a,b), b); /* anywhere a>b, mask[z] = 0x0; elsewhere 0xff */
+ int maskbits = _mm_movemask_epi8(_mm_xor_si128(mask, _mm_cmpeq_epi8(mask, mask))); /* the xor incantation is a bitwise inversion */
+ return maskbits != 0;
+}
+static inline int
+esl_sse_any_gt_epi16(__m128i a, __m128i b)
+{
+ return (_mm_movemask_epi8(_mm_cmpgt_epi16(a,b)) != 0);
+}
+
+
+/* Function: esl_sse_hmax_epu8()
+ * Synopsis: Return the max of the 16 elements in epu8 vector.
+ *
+ * Purpose: Returns the maximum value of the 16 elements in
+ * an <epu8> vector.
+ */
+static inline uint8_t
+esl_sse_hmax_epu8(__m128i a)
+{
+ a = _mm_max_epu8(a, _mm_srli_si128(a, 8));
+ a = _mm_max_epu8(a, _mm_srli_si128(a, 4));
+ a = _mm_max_epu8(a, _mm_srli_si128(a, 2));
+ a = _mm_max_epu8(a, _mm_srli_si128(a, 1));
+ return (uint8_t) _mm_extract_epi16(a, 0); /* only low-order 8 bits set; so _epi16 or _epi8 equiv; _epi8 is SSE4.1 */
+}
+
+/* Function: esl_sse_hmax_epi16()
+ * Synopsis: Return the max of the 8 elements in epi16 vector.
+ *
+ * Purpose: Returns the maximum value of the 16 elements in
+ * an <epu8> vector.
+ */
+static inline int16_t
+esl_sse_hmax_epi16(__m128i a)
+{
+ a = _mm_max_epi16(a, _mm_srli_si128(a, 8));
+ a = _mm_max_epi16(a, _mm_srli_si128(a, 4));
+ a = _mm_max_epi16(a, _mm_srli_si128(a, 2));
+ return (int16_t) _mm_extract_epi16(a, 0); /* only low-order 8 bits set; so _epi16 or _epi8 equiv; _epi8 is SSE4.1 */
+}
+
+
+#endif /*eslSSE_INCLUDED*/
+#endif /*HAVE_SSE2*/
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_sse.tex b/esl_sse.tex
new file mode 100644
index 0000000..de01d07
--- /dev/null
+++ b/esl_sse.tex
@@ -0,0 +1,39 @@
+
+The \eslmod{sse} module provides a few vectorized functions that use
+the Intel/AMD SSE (Streaming SIMD Extensions) Intrinsics: most
+importantly, vectorized \ccode{logf()} and \ccode{expf()} routines.
+
+The \eslmod{sse} module is only available on platforms that support
+SSE2 instructions. This includes all modern Intel and AMD processors,
+but nor PowerPC processors. By default, the Easel configure script
+enables SSE if it is available on the compilation machine.
+
+
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\hyperlink{func:esl_sse_logf()}{\ccode{esl\_sse\_logf()}} & \ccode{r[z] = log x[z]}\\
+\hyperlink{func:esl_sse_expf()}{\ccode{esl\_sse\_expf()}} & \ccode{r[z] = exp x[z]}\\
+%\hyperlink{func:esl_sse_select_ps()}{\ccode{esl\_sse\_select\_ps()}} & SSE equivalent of \ccode{vec\_sel()}\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{sse} API.}
+\label{tbl:sse_api}
+\end{table}
+
+\subsection{An example of using the sse API}
+
+Figure~\ref{fig:sse_example} shows an example of calculating
+\ccode{logf()} and \ccode{expf()} on an SSE \ccode{\_\_m128} vector
+containing four floats. It also shows a useful \ccode{union} idiom for
+accessing four floats either as an SSE vector or as individual floats.
+
+\begin{figure}[ht]
+\input{cexcerpts/sse_example}
+\caption{An example of using the \eslmod{sse} module.}
+\label{fig:sse_example}
+\end{figure}
+
diff --git a/esl_ssi.c b/esl_ssi.c
new file mode 100644
index 0000000..44f161a
--- /dev/null
+++ b/esl_ssi.c
@@ -0,0 +1,2050 @@
+/* sequence/subsequence indices: fast lookup in large sequence files by keyword.
+ *
+ * 1. Using (reading) an SSI index.
+ * 2. Creating (writing) new SSI files.
+ * 3. Portable binary i/o.
+ * 4. Test driver.
+ * 5. Example code.
+ * 6. License and copyright information.
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_ssi.h"
+
+static uint32_t v30magic = 0xd3d3c9b3; /* SSI 3.0: "ssi3" + 0x80808080 */
+static uint32_t v30swap = 0xb3c9d3d3; /* byteswapped */
+
+
+/*****************************************************************
+ *# 1. Using (reading) an SSI index.
+ *****************************************************************/
+
+static int binary_search(ESL_SSI *ssi, const char *key, uint32_t klen, off_t base,
+ uint32_t recsize, uint64_t maxidx);
+
+/* Function: esl_ssi_Open()
+ * Synopsis: Open an SSI index as an <ESL_SSI>.
+ *
+ * Purpose: Open the SSI index file <filename>, and returns a pointer
+ * to the new <ESL_SSI> object in <ret_ssi>.
+ *
+ * Caller is responsible for closing the SSI file with
+ * <esl_ssi_Close()>.
+ *
+ * Args: <filename> - name of SSI index file to open.
+ * <ret_ssi> - RETURN: the new <ESL_SSI>.
+ *
+ * Returns: <eslOK> on success;
+ * <eslENOTFOUND> if <filename> cannot be opened for reading;
+ * <eslEFORMAT> if it's not in correct SSI file format;
+ * <eslERANGE> if it uses 64-bit file offsets, and we're on a system
+ * that doesn't support 64-bit file offsets.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_ssi_Open(const char *filename, ESL_SSI **ret_ssi)
+{
+ ESL_SSI *ssi = NULL;
+ int status;
+ uint32_t magic; /* magic number that starts the SSI file */
+ uint16_t i; /* counter over files */
+
+ /* Initialize the SSI structure, null'ing so we can autocleanup.
+ */
+ ESL_ALLOC(ssi, sizeof(ESL_SSI));
+ ssi->fp = NULL;
+ ssi->filename = NULL;
+ ssi->fileformat = NULL;
+ ssi->fileflags = NULL;
+ ssi->bpl = NULL;
+ ssi->rpl = NULL;
+ ssi->nfiles = 0;
+
+ /* Open the file.
+ */
+ status = eslENOTFOUND;
+ if ((ssi->fp = fopen(filename, "rb")) == NULL) goto ERROR;
+
+ /* Read the magic number: make sure it's an SSI file, and determine
+ * whether it's byteswapped.
+ */
+ status = eslEFORMAT;
+ if (esl_fread_u32(ssi->fp, &magic) != eslOK) goto ERROR;
+ if (magic != v30magic && magic != v30swap) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->flags)) != eslOK) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->offsz)) != eslOK) goto ERROR;
+
+ status = eslERANGE;
+ if (ssi->offsz != 4 && ssi->offsz != 8) goto ERROR;
+ if (ssi->offsz > sizeof(off_t)) goto ERROR;
+
+ /* The header data. */
+ status = eslEFORMAT;
+ if (esl_fread_u16(ssi->fp, &(ssi->nfiles)) != eslOK) goto ERROR;
+ if (esl_fread_u64(ssi->fp, &(ssi->nprimary)) != eslOK) goto ERROR;
+ if (esl_fread_u64(ssi->fp, &(ssi->nsecondary)) != eslOK) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->flen)) != eslOK) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->plen)) != eslOK) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->slen)) != eslOK) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->frecsize)) != eslOK) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->precsize)) != eslOK) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->srecsize)) != eslOK) goto ERROR;
+
+ if (esl_fread_offset(ssi->fp, ssi->offsz, &(ssi->foffset)) != eslOK) goto ERROR;
+ if (esl_fread_offset(ssi->fp, ssi->offsz, &(ssi->poffset)) != eslOK) goto ERROR;
+ if (esl_fread_offset(ssi->fp, ssi->offsz, &(ssi->soffset)) != eslOK) goto ERROR;
+
+ /* The file information.
+ * We expect the number of files to be small, so reading it once
+ * should be advantageous overall. If SSI ever had to deal with
+ * large numbers of files, you'd probably want to read file
+ * information on demand.
+ */
+ status = eslEFORMAT;
+ if (ssi->nfiles == 0) goto ERROR;
+
+ ESL_ALLOC(ssi->filename, sizeof(char *) * ssi->nfiles);
+ for (i = 0; i < ssi->nfiles; i++) ssi->filename[i] = NULL;
+ ESL_ALLOC(ssi->fileformat, sizeof(uint32_t) * ssi->nfiles);
+ ESL_ALLOC(ssi->fileflags, sizeof(uint32_t) * ssi->nfiles);
+ ESL_ALLOC(ssi->bpl, sizeof(uint32_t) * ssi->nfiles);
+ ESL_ALLOC(ssi->rpl, sizeof(uint32_t) * ssi->nfiles);
+
+ /* (most) allocations done, now we read. */
+ for (i = 0; i < ssi->nfiles; i++)
+ {
+ ESL_ALLOC(ssi->filename[i], sizeof(char)* ssi->flen);
+ /* We do have to explicitly position, because header and file
+ * records may expand in the future; frecsize and foffset
+ * give us forwards compatibility.
+ */
+ status = eslEFORMAT;
+ if (fseeko(ssi->fp, ssi->foffset + (i * ssi->frecsize), SEEK_SET) != 0) goto ERROR;
+ if (fread(ssi->filename[i],sizeof(char),ssi->flen, ssi->fp)!=ssi->flen) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->fileformat[i]))) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->fileflags[i]))) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->bpl[i]))) goto ERROR;
+ if (esl_fread_u32(ssi->fp, &(ssi->rpl[i]))) goto ERROR;
+ }
+ *ret_ssi = ssi;
+ return eslOK;
+
+ ERROR:
+ if (ssi != NULL) esl_ssi_Close(ssi);
+ *ret_ssi = NULL;
+ return status;
+}
+
+
+/* Function: esl_ssi_FindName()
+ * Synopsis: Look up a primary or secondary key.
+ *
+ * Purpose: Looks up the string <key> in index <ssi>.
+ * <key> can be either a primary or secondary key. If <key>
+ * is found, <ret_fh> contains a unique handle on
+ * the file that contains <key> (suitable for an <esl_ssi_FileInfo()>
+ * call, or for comparison to the handle of the last file
+ * that was opened for retrieval), and <ret_offset> contains
+ * the offset of the sequence record in that file.
+ *
+ * Args: <ssi> - open index file
+ * <key> - name to search for
+ * <ret_fh> - RETURN: handle on file that key is in
+ * <ret_roff> - RETURN: offset of the start of that key's record
+ * <opt_doff> - optRETURN: data offset (may be 0 if unset)
+ * <opt_L> - optRETURN: length of data record (may be 0 if unset)
+ *
+ * Returns: <eslOK> on success;
+ * <eslENOTFOUND> if no such key is in the index;
+ * <eslEFORMAT> if an fread() or fseeko() fails, which almost
+ * certainly reflects some kind of misformatting of
+ * the index.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_ssi_FindName(ESL_SSI *ssi, const char *key, uint16_t *ret_fh, off_t *ret_roff, off_t *opt_doff, int64_t *opt_L)
+{
+ int status;
+ off_t doff;
+ int64_t L;
+ char *pkey = NULL;
+
+ /* Look in the primary keys.
+ */
+ status = binary_search(ssi, key, ssi->plen, ssi->poffset, ssi->precsize,
+ ssi->nprimary);
+
+ if (status == eslOK)
+ { /* We found it as a primary key; get our data & return. */
+ status = eslEFORMAT;
+ if (esl_fread_u16(ssi->fp, ret_fh) != eslOK) goto ERROR;
+ if (esl_fread_offset(ssi->fp, ssi->offsz, ret_roff) != eslOK) goto ERROR;
+ if (esl_fread_offset(ssi->fp, ssi->offsz, &doff) != eslOK) goto ERROR;
+ if (esl_fread_i64 (ssi->fp, &L) != eslOK) goto ERROR;
+ }
+ else if (status == eslENOTFOUND)
+ { /* Not in the primary keys? OK, try the secondary keys. */
+ if (ssi->nsecondary > 0) {
+ if ((status = binary_search(ssi, key, ssi->slen, ssi->soffset, ssi->srecsize, ssi->nsecondary)) != eslOK) goto ERROR;
+
+ /* We have the secondary key; flip to its primary key, then look that up. */
+ ESL_ALLOC(pkey, sizeof(char) * ssi->plen);
+ status = eslEFORMAT;
+ if (fread(pkey, sizeof(char), ssi->plen, ssi->fp) != ssi->plen) goto ERROR;
+ if ((status = esl_ssi_FindName(ssi, pkey, ret_fh, ret_roff, &doff, &L)) != eslOK) goto ERROR;
+ } else goto ERROR; /* no secondary keys? pass along the ENOTFOUND error. */
+ } else goto ERROR; /* status from binary search was an error code. */
+
+ if (pkey != NULL) free(pkey);
+ if (opt_doff != NULL) *opt_doff = doff;
+ if (opt_L != NULL) *opt_L = L;
+ return eslOK;
+
+ ERROR:
+ if (pkey != NULL) free(pkey);
+ *ret_fh = 0;
+ *ret_roff = 0;
+ if (opt_doff != NULL) *opt_doff = 0;
+ if (opt_L != NULL) *opt_L = 0;
+ return status;
+}
+
+
+
+/* Function: esl_ssi_FindNumber()
+ * Synopsis: Look up the n'th primary key.
+ *
+ * Purpose: Looks up primary key number <nkey> in the open index
+ * <ssi>. <nkey> ranges from <0..ssi->nprimary-1>. When
+ * key <nkey> is found, any/all of several optional
+ * arguments point to results. <*opt_fh> contains a unique
+ * handle on the file that contains that key (suitable for
+ * an <esl_ssi_FileInfo()> call, or for comparison to the
+ * handle of the last file that was opened for retrieval).
+ * <*opt_roff> contains the record offset; <*opt_doff>
+ * contains the data offset; <*opt_L> contains the record
+ * length; and <*opt_pkey> points to the primary key name
+ * (a string, allocated here, that the caller becomes
+ * responsible for free'ing).
+ *
+ * Args: <ssi> - open index file
+ * <nkey> - primary key number to retrieve (0..nprimary-1)
+ * <opt_fh> - optRETURN: handle on file that key is in
+ * <opt_roff> - optRETURN: offset of the start of that key's record
+ * <opt_doff> - optRETURN: data offset (may be 0 if unset)
+ * <opt_L> - optRETURN: length of data record (may be 0 if unset)
+ * <opt_pkey> - optRETURN: primary key name (allocated here; caller must free)
+ *
+ * Returns: <eslOK> on success;
+ * <eslENOTFOUND> if there is no sequence record <nkey>;
+ * <eslEFORMAT> if a read or a seek fails, probably indicating
+ * some kind of file misformatting.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_ssi_FindNumber(ESL_SSI *ssi, int64_t nkey, uint16_t *opt_fh, off_t *opt_roff, off_t *opt_doff, int64_t *opt_L, char **opt_pkey)
+{
+ int status;
+ uint16_t fh;
+ off_t doff, roff;
+ uint64_t L;
+ char *pkey = NULL;
+
+ if (nkey >= ssi->nprimary) { status = eslENOTFOUND; goto ERROR; }
+ ESL_ALLOC(pkey, sizeof(char) * ssi->plen);
+
+ status = eslEFORMAT;
+ if (fseeko(ssi->fp, ssi->poffset+ssi->precsize*nkey, SEEK_SET)!= 0) goto ERROR;
+ if (fread(pkey, sizeof(char), ssi->plen, ssi->fp) != ssi->plen) goto ERROR;
+ if (esl_fread_u16(ssi->fp, &fh) != eslOK) goto ERROR;
+ if (esl_fread_offset(ssi->fp, ssi->offsz, &roff) != eslOK) goto ERROR;
+ if (esl_fread_offset(ssi->fp, ssi->offsz, &doff) != eslOK) goto ERROR;
+ if (esl_fread_u64 (ssi->fp, &L) != eslOK) goto ERROR;
+
+ if (opt_fh != NULL) *opt_fh = fh;
+ if (opt_roff != NULL) *opt_roff = roff;
+ if (opt_doff != NULL) *opt_doff = doff;
+ if (opt_L != NULL) *opt_L = L;
+ if (opt_pkey != NULL) *opt_pkey = pkey; else free(pkey);
+ return eslOK;
+
+ ERROR:
+ if (pkey != NULL) free(pkey);
+ if (opt_fh != NULL) *opt_fh = 0;
+ if (opt_roff != NULL) *opt_roff = 0;
+ if (opt_doff != NULL) *opt_doff = 0;
+ if (opt_L != NULL) *opt_L = 0;
+ if (opt_pkey != NULL) *opt_pkey = NULL;
+ return status;
+}
+
+
+/* Function: esl_ssi_FindSubseq()
+ * Synopsis: Look up a specific subsequence's start.
+ * Date: SRE, Mon Jan 1 19:49:31 2001 [St. Louis]
+ *
+ * Purpose: Fast subsequence retrieval: look up a primary or secondary
+ * <key> in the open index <ssi>, and ask for the nearest data
+ * offset to a subsequence starting at residue
+ * <requested_start> in the sequence (numbering the sequence
+ * <1..L>). If <key> is found, on return, <ret_fh> contains
+ * a unique handle on the file that contains <key>;
+ * <ret_roff> contains the disk offset to the start of the
+ * sequence record; <ret_doff> contains the disk offset
+ * (see below); and <ret_actual_start) contains the coordinate
+ * (1..L) of the first valid residue at or after
+ * <data_offset>. <ret_actual_start> is $\leq$
+ * <requested_start>.
+ *
+ * Depending on the file's characteristics, there are four
+ * possible outcomes.
+ *
+ * If the file has the <eslSSI_FASTSUBSEQ> flag set, a data
+ * offset was indexed for this key, and the data can be
+ * indexed at single residue resolution (because the file's
+ * lines contain only residues, no spaces), then <ret_doff>
+ * is exactly the position of residue <requested_start> on
+ * disk, and <ret_actual_start> is <requested_start>.
+ *
+ * If the file has the <eslSSI_FASTSUBSEQ> flag set, a data
+ * offset was indexed for this key, but the data can only be
+ * indexed at line resolution (because at least some of the
+ * file's lines contain spaces), then <ret_doff> is the
+ * position of the start of the line that <requested_start>
+ * is on, and <ret_actual_start> is the coord <1..L> of the
+ * first residue on that line.
+ *
+ * If the file does not have the <eslSSI_FASTSUBSEQ> flag
+ * set (because lines contain a variable number of residues
+ * and/or bytes), but a data offset was indexed for this
+ * key, then we can still at least return that data offset,
+ * but the caller is going to have to start from the
+ * beginning of the data and read residues until it reaches
+ * the desired <requested_start>. Now <ret_doff> is the
+ * offset to the start of the first line of the sequence
+ * data, and <ret_actual_start> is 1.
+ *
+ * If the key does not have a data offset indexed at all,
+ * then regardless of the file's <eslSSI_FASTSUBSEQ>
+ * setting, we can't calculate even the position of the
+ * first line. In this case, <ret_doff> is 0 (for
+ * unset/unknown), and <ret_actual_start> is <1>.
+ *
+ * A caller that's going to position the disk and read a
+ * subseq must check for all four possible outcomes (pardon
+ * redundancy with the above, but just to be clear, from the
+ * caller's perspective now):
+ *
+ * If <ret_doff> is 0, no data offset information can be
+ * calculated; the caller can still use <ret_roff> to
+ * position the disk to the start of <key>'s record, but it
+ * will need to parse the header to find the start of the
+ * sequence data; then it will need to parse the sequence
+ * data, skipping to residue <requested start>.
+ *
+ * If <ret_doff> is valid ($>0$), and <ret_actual_start> is
+ * 1, then caller may use <ret_doff> to position the disk to
+ * the start of the first sequence data line, but will still
+ * need to parse all the sequence data, counting and
+ * skipping to residue <requested start>. This is equivalent
+ * to (and in practice, not much more efficient than)
+ * positioning to the record start and parsing the header to
+ * locate the sequence data start.
+ *
+ * If <ret_doff> is valid ($>0$), and <ret_actual_start> is
+ * $>1$ but $<$ <requested_start>, then <ret_doff> is the
+ * offset to the first byte of a line on which the
+ * subsequence begins. The caller can position the disk
+ * there, then start parsing, skipping <requested_start -
+ * *ret_actual_start> residues to reach the
+ * <requested_start>. (In the case where the subsequence
+ * begins on the first line, then <ret_actual_start> will be
+ * 1, and the caller will have to handle this as the case
+ * above.)
+ *
+ * If <<ret_doff> is valid ($>0$), and <ret_actual_start> is
+ * $=$ <requested_start>, then <ret_doff> is the offset to a
+ * byte in the file, such that the requested subsequence
+ * starts at the next valid residue at or after that
+ * position. (The <ret_doff> would usually be exactly the
+ * first residue of the subsequence, because we used single
+ * residue resolution arithmetic to find it, but there's a
+ * case where <requested_start> happens to be the first
+ * residue of a line and we calculated <ret_doff> using
+ * line-resolution arithmetic; in this latter case,
+ * <ret_doff> could be pointing at a space before the first
+ * subseq residue.) The caller may position the disk there
+ * and start parsing immediately; the first valid residue
+ * will be the start of the subsequence.
+ *
+ * Args: <ssi> - open index file
+ * <key> - primary or secondary key to find
+ * <requested_start> - residue we'd like to start at (1..L)
+ * <ret_fh> - RETURN: handle for file the key is in
+ * <ret_roff> - RETURN: offset to start of sequence record
+ * <ret_doff> - RETURN: offset to closest start of subseq data, or 0.
+ * <ret_L> - RETURN: length of <key> in residues (may be 0 if unset)
+ * <ret_actual_start>- RETURN: coord (1..L) of residue at <ret_doff>
+ *
+ * Returns: <eslOK> on any of the four successful outcomes.
+ * <eslENOTFOUND> if no such key is found in the index;
+ * <eslEFORMAT> on a read or seek failure, presumably meaning that
+ * the file is misformatted somehow;
+ * <eslERANGE> if <requested_start> isn't somewhere in the range
+ * <1..len> for the target sequence.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_ssi_FindSubseq(ESL_SSI *ssi, const char *key, int64_t requested_start,
+ uint16_t *ret_fh, off_t *ret_roff, off_t *ret_doff, int64_t *ret_L, int64_t *ret_actual_start)
+{
+ int status;
+ uint64_t r, b, i, l; /* tmp variables for "clarity", to match docs */
+
+ /* Look up the key by name.
+ */
+ if ((status = esl_ssi_FindName(ssi, key, ret_fh, ret_roff, ret_doff, ret_L)) != eslOK) goto ERROR;
+ if (requested_start < 0 || requested_start > *ret_L) { status = eslERANGE; goto ERROR; }
+
+ /* Do we have a data offset for this key? If not, we're case 4. */
+ /* Can we do fast subseq lookup on this file? If no, we're case 3. */
+ if (*ret_doff == 0 || ! (ssi->fileflags[*ret_fh] & eslSSI_FASTSUBSEQ))
+ {
+ *ret_actual_start = 1;
+ return eslOK;
+ }
+
+ /* Set up tmp variables for clarity of equations below,
+ * and to make them match tex documentation
+ */
+ r = ssi->rpl[*ret_fh]; /* residues per line */
+ b = ssi->bpl[*ret_fh]; /* bytes per line */
+ i = requested_start; /* start position 1..L */
+ l = (i-1)/r; /* data line # (0..) that the residue is on */
+ if (r == 0 || b == 0) { status = eslEINVAL; goto ERROR; }
+
+ /* When b = r+1, there's nothing but sequence on each data line (and the \0).
+ * In this case, we know we can find each residue precisely: outcome #1.
+ */
+ if (b == r+1)
+ {
+ *ret_doff += l*b + (i-1)%r;
+ *ret_actual_start = requested_start;
+ }
+ /* else, there's other stuff on seq lines - probably spaces - so the best
+ * we can do (without figuring out the spacing pattern and checking that
+ * it's consistent everywhere) is to position at start of relevant line.
+ */
+ else
+ {
+ *ret_doff += l*b;
+ *ret_actual_start = 1 + l*r;
+ }
+ return eslOK;
+
+ ERROR:
+ *ret_fh = 0;
+ *ret_roff = 0;
+ *ret_doff = 0;
+ *ret_L = 0;
+ *ret_actual_start = 0;
+ return status;
+}
+
+
+/* Function: esl_ssi_FileInfo()
+ * Synopsis: Retrieve a file name and format code.
+ * Date: SRE, Tue Jan 2 10:31:01 2001 [St. Louis]
+ *
+ * Purpose: Given a file number <fh> in an open index file
+ * <ssi>, retrieve file name <ret_filename> and
+ * the file format <ret_format>.
+ *
+ * <ret_filename> is a pointer to a string maintained
+ * internally by <ssi>. It should not be free'd;
+ * <esl_ssi_Close(ssi)> will take care of it.
+ *
+ * Args: <ssi> - open index file
+ * <fh> - handle on file to look up
+ * <ret_filename> - RETURN: name of file n
+ * <ret_format> - RETURN: format code for file n
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> if there is no such file number <fh>.
+ */
+int
+esl_ssi_FileInfo(ESL_SSI *ssi, uint16_t fh, char **ret_filename, int *ret_format)
+{
+ int status;
+
+ if (fh >= ssi->nfiles) ESL_XEXCEPTION(eslEINVAL, "no such file number");
+ *ret_filename = ssi->filename[fh];
+ *ret_format = ssi->fileformat[fh];
+ return eslOK;
+
+ ERROR:
+ *ret_filename = NULL;
+ *ret_format = 0;
+ return status;
+}
+
+
+/* Function: esl_ssi_Close()
+ * Synopsis: Close an SSI index.
+ *
+ * Purpose: Close an open SSI index <ssi>.
+ *
+ * Args: <ssi> - an open SSI index file.
+ */
+void
+esl_ssi_Close(ESL_SSI *ssi)
+{
+ int i;
+
+ if (ssi == NULL) return;
+
+ if (ssi->fp != NULL) fclose(ssi->fp);
+ if (ssi->filename != NULL) {
+ for (i = 0; i < ssi->nfiles; i++)
+ if (ssi->filename[i] != NULL) free(ssi->filename[i]);
+ free(ssi->filename);
+ }
+ if (ssi->fileformat != NULL) free(ssi->fileformat);
+ if (ssi->fileflags != NULL) free(ssi->fileflags);
+ if (ssi->bpl != NULL) free(ssi->bpl);
+ if (ssi->rpl != NULL) free(ssi->rpl);
+ free(ssi);
+}
+
+
+/* binary_search()
+ * Date: SRE, Sun Dec 31 16:05:03 2000 [St. Louis]
+ *
+ * Purpose: Find <key> in an SSI index, by a binary search
+ * in an alphabetically sorted list of keys. If successful,
+ * return <eslOK>, and the index file is positioned to read
+ * the rest of the data for that key. If unsuccessful,
+ * return <eslFAIL>, and the positioning of the index file
+ * is left in an undefined state.
+ *
+ * Args: <ssi> - an open ESL_SSI
+ * <key> - key to find
+ * <klen> - key length to allocate (plen or slen from ssi)
+ * <base> - base offset (poffset or soffset)
+ * <recsize> - size of each key record in bytes (precsize or srecsize)
+ * <maxidx> - # of keys (nprimary or nsecondary)
+ *
+ * Returns: <eslOK> on success, and leaves file positioned for reading remaining
+ * data for the key.
+ *
+ * <eslENOTFOUND> if <key> is not found.
+ * <eslEFORMAT> if an fread() or fseeko() fails, probably indicating
+ * some kind of misformatting of the index file.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ */
+static int
+binary_search(ESL_SSI *ssi, const char *key, uint32_t klen, off_t base,
+ uint32_t recsize, uint64_t maxidx)
+{
+ char *name;
+ uint64_t left, right, mid;
+ int cmp;
+ int status;
+
+ if (maxidx == 0) return eslENOTFOUND; /* special case: empty index */
+
+ ESL_ALLOC(name, (sizeof(char)*klen));
+
+ left = 0;
+ right = maxidx-1;
+ while (1) { /* A binary search: */
+ mid = (left+right) / 2; /* careful here. left+right potentially overflows if
+ we didn't limit unsigned vars to signed ranges. */
+ status = eslEFORMAT;
+ if (fseeko(ssi->fp, base + recsize*mid, SEEK_SET) != 0) goto ERROR;
+ if (fread(name, sizeof(char), klen, ssi->fp) != klen) goto ERROR;
+
+ status = eslENOTFOUND;
+ cmp = strcmp(name, key);
+ if (cmp == 0) break; /* found it! */
+ else if (left >= right) goto ERROR; /* no such key */
+ else if (cmp < 0) left = mid+1; /* it's still right of mid */
+ else if (cmp > 0) {
+ if (mid == 0) goto ERROR; /* beware left edge case */
+ else right = mid-1; /* it's left of mid */
+ }
+ }
+
+ if (name != NULL) free(name);
+ return eslOK; /* and ssi->fp is positioned to read the record. */
+
+ ERROR:
+ if (name != NULL) free(name);
+ return status;
+}
+
+
+/*****************************************************************
+ *# 2. Creating (writing) new SSI files.
+ *****************************************************************/
+static int current_newssi_size(const ESL_NEWSSI *ns);
+static int activate_external_sort(ESL_NEWSSI *ns);
+static int parse_pkey(char *buf, ESL_PKEY *pkey);
+static int parse_skey(char *buf, ESL_SKEY *skey);
+static int pkeysort(const void *k1, const void *k2);
+static int skeysort(const void *k1, const void *k2);
+
+/* Function: esl_newssi_Open()
+ * Synopsis: Create a new <ESL_NEWSSI>.
+ *
+ * Purpose: Creates and returns a <ESL_NEWSSI>, in order to create a
+ * new SSI index file.
+ *
+ * Returns: <eslOK> on success, and <*ret_newssi> is a pointer to a
+ * new <ESL_NEWSSI> structure.
+ *
+ * Returns <eslENOTFOUND> if <ssifile> can't be opened.
+ *
+ * Returns <eslEOVERWRITE> if <allow_overwrite> is <FALSE>
+ * and <ssifile> (or any necessary tmp files) already
+ * exist, to block overwriting of an existing SSI file.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ */
+int
+esl_newssi_Open(const char *ssifile, int allow_overwrite, ESL_NEWSSI **ret_newssi)
+{
+ ESL_NEWSSI *ns = NULL;
+ int i;
+ int status;
+
+ ESL_ALLOC(ns, sizeof(ESL_NEWSSI));
+ ns->ssifile = NULL;
+ ns->ssifp = NULL;
+ ns->external = FALSE; /* we'll switch to external sort if... */
+ ns->max_ram = eslSSI_MAXRAM; /* ... if we exceed this memory limit in MB. */
+ ns->filenames = NULL;
+ ns->fileformat = NULL;
+ ns->bpl = NULL;
+ ns->rpl = NULL;
+ ns->flen = 0;
+ ns->nfiles = 0;
+ ns->pkeys = NULL;
+ ns->plen = 0;
+ ns->nprimary = 0;
+ ns->ptmpfile = NULL;
+ ns->ptmp = NULL;
+ ns->skeys = NULL;
+ ns->slen = 0;
+ ns->nsecondary = 0;
+ ns->stmpfile = NULL;
+ ns->stmp = NULL;
+ ns->errbuf[0] = '\0';
+
+ if ((status = esl_strdup(ssifile, -1, &(ns->ssifile))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(ssifile, -1, &(ns->ptmpfile))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(ssifile, -1, &(ns->stmpfile))) != eslOK) goto ERROR;
+ if ((status = esl_strcat(&ns->ptmpfile, -1, ".1", 2)) != eslOK) goto ERROR;
+ if ((status = esl_strcat(&ns->stmpfile, -1, ".2", 2)) != eslOK) goto ERROR;
+
+ if (! allow_overwrite)
+ {
+ if (esl_FileExists(ssifile) ||
+ esl_FileExists(ns->ptmpfile) ||
+ esl_FileExists(ns->stmpfile))
+ { status = eslEOVERWRITE; goto ERROR; }
+ }
+
+ if ((ns->ssifp = fopen(ssifile, "w")) == NULL) { status = eslENOTFOUND; goto ERROR; }
+
+ ESL_ALLOC(ns->filenames, sizeof(char *) * eslSSI_FCHUNK);
+ for (i = 0; i < eslSSI_FCHUNK; i++)
+ ns->filenames[i] = NULL;
+ ESL_ALLOC(ns->fileformat, sizeof(uint32_t) * eslSSI_FCHUNK);
+ ESL_ALLOC(ns->bpl, sizeof(uint32_t) * eslSSI_FCHUNK);
+ ESL_ALLOC(ns->rpl, sizeof(uint32_t) * eslSSI_FCHUNK);
+ ESL_ALLOC(ns->pkeys, sizeof(ESL_PKEY) * eslSSI_KCHUNK);
+ for (i = 0; i < eslSSI_KCHUNK; i++)
+ ns->pkeys[i].key = NULL;
+ ESL_ALLOC(ns->skeys, sizeof(ESL_SKEY) * eslSSI_KCHUNK);
+ for (i = 0; i < eslSSI_KCHUNK; i++) {
+ ns->skeys[i].key = NULL;
+ ns->skeys[i].pkey = NULL;
+ }
+ *ret_newssi = ns;
+ return eslOK;
+
+ ERROR:
+ esl_newssi_Close(ns); /* free the damaged structure */
+ return status;
+}
+
+
+/* Function: esl_newssi_AddFile()
+ * Synopsis: Add a filename to a growing index.
+ *
+ * Purpose: Registers the file <filename> into the new index <ns>,
+ * along with its format code <fmt>. The index assigns it
+ * a unique handle, which it returns in <ret_fh>. This
+ * handle is needed when registering primary keys.
+ *
+ * Caller should make sure that the same file isn't registered
+ * twice; this function doesn't check.
+ *
+ * Args: <ns> - new ssi index under construction.
+ * <filename> - filename to add to the index.
+ * <fmt> - format code to associate with <filename> (or 0)
+ * <ret_fh> - RETURN: filehandle associated with <filename>
+ *
+ * Returns: <eslOK> on success;
+ * <eslERANGE> if registering this file would exceed the
+ * maximum number of indexed files.
+ *
+ * Throws: <eslEMEM> on allocation or reallocation error.
+ */
+int
+esl_newssi_AddFile(ESL_NEWSSI *ns, const char *filename, int fmt, uint16_t *ret_fh)
+{
+ int status;
+ uint16_t fh;
+ int i;
+ int n;
+
+ if (ns->nfiles >= eslSSI_MAXFILES) ESL_XFAIL(eslERANGE, ns->errbuf, "exceeded the maximum number of files an SSI index can store");
+
+ n = strlen(filename);
+ if ((n+1) > ns->flen) ns->flen = n+1;
+
+ if ((status = esl_FileTail(filename, FALSE, &(ns->filenames[ns->nfiles]))) != eslOK) goto ERROR;
+
+ ns->fileformat[ns->nfiles] = fmt;
+ ns->bpl[ns->nfiles] = 0;
+ ns->rpl[ns->nfiles] = 0;
+ fh = ns->nfiles; /* handle is simply = file number */
+ ns->nfiles++;
+
+ if (ns->nfiles % eslSSI_FCHUNK == 0) {
+ ESL_REALLOC(ns->filenames, sizeof(char *) * (ns->nfiles+eslSSI_FCHUNK));
+ for (i = ns->nfiles; i < ns->nfiles+eslSSI_FCHUNK; i++) ns->filenames[i] = NULL;
+ ESL_REALLOC(ns->fileformat, sizeof(uint32_t) * (ns->nfiles+eslSSI_FCHUNK));
+ ESL_REALLOC(ns->bpl, sizeof(uint32_t) * (ns->nfiles+eslSSI_FCHUNK));
+ ESL_REALLOC(ns->rpl, sizeof(uint32_t) * (ns->nfiles+eslSSI_FCHUNK));
+ }
+ *ret_fh = fh;
+ return eslOK;
+
+ ERROR:
+ *ret_fh = 0;
+ return status;
+}
+
+
+
+/* Function: esl_newssi_SetSubseq()
+ * Synopsis: Declare that file is suitable for fast subseq lookup.
+ *
+ * Purpose: Declare that the file associated with handle <fh> is
+ * suitable for fast subsequence lookup, because it has
+ * a constant number of residues and bytes per (nonterminal)
+ * data line, <rpl> and <bpl>, respectively.
+ *
+ * Caller is responsible for this being true: <rpl> and
+ * <bpl> must be constant for every nonterminal line of
+ * every sequence in this file.
+ *
+ * Args: <ns> - ssi index under construction
+ * <fh> - handle on file to set fast subseq lookup on
+ * <bpl> - constant bytes per nonterminal line in <fh>
+ * <rpl> - constant residues per nonterminal line in <fh>
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEINVAL> on invalid argument(s).
+ */
+int
+esl_newssi_SetSubseq(ESL_NEWSSI *ns, uint16_t fh, uint32_t bpl, uint32_t rpl)
+{
+ int status;
+
+ if (fh >= ns->nfiles) ESL_XEXCEPTION(eslEINVAL, "invalid file number");
+ if (bpl <= 0 || rpl <= 0) ESL_XEXCEPTION(eslEINVAL, "invalid bpl or rpl");
+ ns->bpl[fh] = bpl;
+ ns->rpl[fh] = rpl;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_newssi_AddKey()
+ * Synopsis: Add a primary key to a growing index.
+ * Date: SRE, Tue Jan 2 11:50:54 2001 [St. Louis]
+ *
+ * Purpose: Register primary key <key> in new index <ns>, while telling
+ * the index that this primary key is in the file associated
+ * with filehandle <fh> (the handle returned by a previous call
+ * to <esl_newssi_AddFile()>); that its record starts at
+ * offset <r_off> in the file; that its data (usually
+ * sequence data) starts at offset <d_off> in the file (i.e.
+ * after any record header); and that the record's data is
+ * of length <L> (usually, the record is a sequence, and <L>
+ * is its length in residues).
+ *
+ * The data length <L> is technically optional as far as SSI
+ * is concerned; <L> may be passed as 0 to leave it
+ * unset. However, functions in the <sqio> module that use
+ * SSI indices will assume that <L> is available.
+ *
+ * <d_off> is also optional; it may be passed as <0> to
+ * leave it unset. If provided, <d_off> gives an offset to
+ * the data portion of the record. The interpretation of
+ * this data offset may be implementation-defined and may
+ * depend on the format of the datafile; for example, in how
+ * <sqio> uses SSI indices, <d_off> is the offset to the
+ * start of the first sequence line.
+ *
+ * Both <d_off> and <L> must be provided, and additionally
+ * <eslSSI_FASTSUBSEQ> must be set for this file, for fast
+ * subsequence lookup to work.
+ *
+ * Args: <ns> - active index
+ * <key> - primary key to add
+ * <fh> - handle on file that this key's in
+ * <r_off> - offset to start of record
+ * <d_off> - offset to start of sequence data, or 0
+ * <L> - length of sequence, or 0
+ *
+ * Returns: <eslOK> on success;
+ * <eslERANGE> if registering this key would exceed the maximum
+ * number of primary keys;
+ * <eslENOTFOUND> if we needed to open external tmp files, but
+ * the attempt to open them failed.
+ *
+ * Throws: <eslEINVAL> on an invalid argument;
+ * <eslEMEM> on allocation failure;
+ * <eslEWRITE> on any system error writing to tmp file, such
+ * as filling the filesystem.
+ */
+int
+esl_newssi_AddKey(ESL_NEWSSI *ns, const char *key, uint16_t fh,
+ off_t r_off, off_t d_off, int64_t L)
+{
+ int status;
+ int i;
+ int n; /* a string length */
+
+ if (fh >= eslSSI_MAXFILES) ESL_XEXCEPTION(eslEINVAL, "invalid fh");
+ if (ns->nprimary >= eslSSI_MAXKEYS) ESL_XFAIL(eslERANGE, ns->errbuf, "exceeded maximum number of primary keys allowed");
+
+ /* Before adding the key: check how big our index is.
+ * If it's getting too large, switch to external mode.
+ */
+ if (!ns->external && current_newssi_size(ns) >= ns->max_ram)
+ if ((status = activate_external_sort(ns)) != eslOK) goto ERROR;
+
+ /* Update maximum pkey length, if needed. (Inclusive of '\0').
+ */
+ n = strlen(key)+1;
+ if (n > ns->plen) ns->plen = n;
+
+ /* External mode? Simply append to disk...
+ */
+ if (ns->external)
+ {
+ if (sizeof(off_t) == 4) {
+ if (fprintf(ns->ptmp, "%s\t%d\t%" PRIu32 "\t%" PRIu32 "\t%" PRIi64 "\n",
+ key, fh, (uint32_t) r_off, (uint32_t) d_off, L) <= 0)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi key tmp file write failed");
+ } else {
+ if (fprintf(ns->ptmp, "%s\t%d\t%" PRIu64 "\t%" PRIu64 "\t%" PRIi64 "\n",
+ key, fh, (uint64_t) r_off, (uint64_t) d_off, L) <= 0)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi key tmp file write failed");
+ }
+ ns->nprimary++;
+ }
+ else
+ {
+ /* Else: internal mode, keep keys in memory...
+ */
+ if ((status = esl_strdup(key, n, &(ns->pkeys[ns->nprimary].key))) != eslOK) goto ERROR;
+ ns->pkeys[ns->nprimary].fnum = fh;
+ ns->pkeys[ns->nprimary].r_off = r_off;
+ ns->pkeys[ns->nprimary].d_off = d_off;
+ ns->pkeys[ns->nprimary].len = L;
+ ns->nprimary++;
+
+ /* Reallocate as needed. */
+ if (ns->nprimary % eslSSI_KCHUNK == 0) {
+ ESL_REALLOC(ns->pkeys, sizeof(ESL_PKEY) * (ns->nprimary+eslSSI_KCHUNK));
+ for (i = ns->nprimary; i < ns->nprimary + eslSSI_KCHUNK; i++)
+ ns->pkeys[i].key = NULL;
+ }
+ }
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_newssi_AddAlias()
+ * Synopsis: Add a secondary key (alias) to a growing index.
+ *
+ * Purpose: Registers secondary key <alias> in index <ns>, and
+ * map it to the primary key <key>. <key> must already
+ * have been registered. That is, when someone looks up <alias>,
+ * we'll retrieve record <key>.
+ *
+ * Args: <ns> - ssi index being constructed
+ * <alias> - secondary key to register
+ * <key> - primary key to associate with <skey>.
+ *
+ * Returns: <eslOK> on success;
+ * <eslERANGE> if registering this key would exceed the maximum
+ * number of secondary keys that can be stored;
+ * <eslENOTFOUND> if we needed to open external tmp files, but
+ * the attempt to open them failed.
+ *
+ * Throws: <eslEWRITE> on any system error writing to tmp file, such
+ * as running out of space on the device.
+ */
+int
+esl_newssi_AddAlias(ESL_NEWSSI *ns, const char *alias, const char *key)
+{
+ int status;
+ int i;
+ int n; /* a string length */
+
+ if (ns->nsecondary >= eslSSI_MAXKEYS) ESL_XFAIL(eslERANGE, ns->errbuf, "exceeded maximum number of secondary keys allowed");
+
+ /* Before adding the key: check how big our index is.
+ * If it's getting too large, switch to external mode.
+ */
+ if (!ns->external && current_newssi_size(ns) >= ns->max_ram)
+ if ((status = activate_external_sort(ns)) != eslOK) goto ERROR;
+
+ /* Update maximum secondary key length, if necessary. */
+ n = strlen(alias)+1;
+ if (n > ns->slen) ns->slen = n;
+
+ /* if external mode: write info to disk. */
+ if (ns->external)
+ {
+ if (fprintf(ns->stmp, "%s\t%s\n", alias, key) <= 0) ESL_XEXCEPTION_SYS(eslEWRITE, "ssi alias tmp file write failed");
+ ns->nsecondary++;
+ }
+ else
+ { /* else, internal mode... store info in memory. */
+ if ((status = esl_strdup(alias, n, &(ns->skeys[ns->nsecondary].key))) != eslOK) goto ERROR;
+ if ((status = esl_strdup(key, -1, &(ns->skeys[ns->nsecondary].pkey))) != eslOK) goto ERROR;
+ ns->nsecondary++;
+
+ if (ns->nsecondary % eslSSI_KCHUNK == 0) {
+ ESL_REALLOC(ns->skeys, sizeof(ESL_SKEY) * (ns->nsecondary+eslSSI_KCHUNK));
+ for (i = ns->nsecondary; i < ns->nsecondary+eslSSI_KCHUNK; i++) {
+ ns->skeys[i].key = NULL;
+ ns->skeys[i].pkey = NULL;
+ }
+ }
+ }
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: esl_newssi_Write()
+ * Synopsis: Save a new index to an SSI file.
+ *
+ * Purpose: Writes the complete index <ns> in SSI format to its file.
+ *
+ * Handles all necessary overhead of sorting the primary and
+ * secondary keys, including any externally sorted tmpfiles that
+ * may have been needed for large indices.
+ *
+ * Args: <ns> - new SSI index to write
+ *
+ * Returns: <eslOK> on success;
+ * <eslERANGE> if index size exceeds system's maximum file size;
+ * <eslESYS> if any of the steps of an external sort fail.
+ *
+ * Throws: <eslEINVAL> on invalid argument, including too-long tmpfile names;
+ * <eslEMEM> on buffer allocation failure;
+ * <eslEWRITE> on any system write failure, including filled disk.
+ */
+int
+esl_newssi_Write(ESL_NEWSSI *ns)
+{
+ int status, /* convention */
+ i; /* counter over files, keys */
+ uint32_t header_flags, /* bitflags in the header */
+ file_flags, /* bitflags for a file record */
+ frecsize, /* size of a file record (bytes) */
+ precsize, /* size of a primary key record (bytes) */
+ srecsize; /* size of a secondary key record (bytes) */
+ off_t foffset, /* offset to file section */
+ poffset, /* offset to primary key section */
+ soffset; /* offset to secondary key section */
+ char *fk = NULL, /* fixed-width (flen) file name */
+ *pk = NULL, /* fixed-width (plen) primary key string */
+ *sk = NULL, /* fixed-width (slen) secondary key string */
+ *buf = NULL; /* esl_fgets() growable buffer */
+ int n = 0; /* esl_fgets() buffer size */
+ ESL_PKEY pkey; /* primary key info from external tmpfile */
+ ESL_SKEY skey; /* secondary key info from external tmpfile */
+
+ if (ns->nsecondary > 0 && ns->slen == 0)
+ ESL_EXCEPTION(eslEINVAL, "zero secondary key length: shouldn't happen");
+
+ /* We need fixed-width buffers to get our keys fwrite()'ten in their
+ * full binary lengths; pkey->key (for instance) is not guaranteed
+ * to be allocated for the final maximum plen. We use strncpy(), not
+ * strcpy(), to fill these buffers, because strncpy() pads unused
+ * bytes as NUL's, and valgrind will flag you if you attempt to
+ * write uninitialized bytes from these buffers.
+ */
+ ESL_ALLOC(fk, sizeof(char) * ns->flen);
+ ESL_ALLOC(pk, sizeof(char) * ns->plen);
+ if (ns->nsecondary > 0) ESL_ALLOC(sk, sizeof(char) * ns->slen);
+
+ /* How big is the index? If it's going to be > 2GB, we better have
+ * 64-bit offsets. (2047 (instead of 2048) gives us
+ * some slop room.) If not, abort here.
+ *
+ * aborting here is pretty brutal - we've processed hundreds of
+ * millions of keys for nothing. Ah well.
+ */
+ if (current_newssi_size(ns) >= 2047 && sizeof(off_t) != 8)
+ ESL_XFAIL(eslERANGE, ns->errbuf, "SSI index file file would be > 2G; your filesystem isn't capable of handling it");
+
+ /* Magic-looking numbers come from adding up sizes
+ * of things in bytes: they match current_newssi_size().
+ */
+ frecsize = 4*sizeof(uint32_t) + ns->flen;
+ precsize = 2*sizeof(off_t) + sizeof(uint16_t) + sizeof(uint64_t) + ns->plen;
+ srecsize = ns->slen + ns->plen;
+ header_flags = 0;
+
+ /* Magic-looking numbers again come from adding up sizes
+ * of things in bytes: matches current_newssi_size()
+ */
+ foffset = 9*sizeof(uint32_t)+2*sizeof(uint64_t)+sizeof(uint16_t)+3*sizeof(off_t);
+ poffset = foffset + frecsize*ns->nfiles;
+ soffset = poffset + precsize*ns->nprimary;
+
+ /* Sort the keys.
+ * If external mode, make system calls to UNIX/POSIX "sort" in place, then
+ * open new sorted files for reading thru ptmp and stmp handles.
+ * If internal mode, call qsort.
+ *
+ * Note that you'd better force a POSIX locale for the sort; else,
+ * some silly distro (e.g. Mandrake Linux >=8.1) may have specified
+ * LC_COLLATE=en_US, and this'll give a sort "bug" in which it doesn't
+ * sort by byte order.
+ */
+ if (ns->external)
+ {
+ char cmd[1024];
+
+ /* A last minute security check: make sure we won't overflow
+ * sprintf() with the tmpfile names. They're hardcoded now, so
+ * we know they don't overflow, but they might be configurable
+ * in the future, and we wouldn't want a security hole to open
+ * up.
+ */
+ if (strlen(ns->ptmpfile) > 256 || strlen(ns->ptmpfile) > 256)
+ ESL_XEXCEPTION(eslEINVAL, "tmpfile name too long");
+
+ fclose(ns->ptmp);
+ ns->ptmp = NULL;
+ sprintf(cmd, "env LC_ALL=POSIX sort -o %s %s\n", ns->ptmpfile, ns->ptmpfile);
+ if (system(cmd) != 0) ESL_XFAIL(eslESYS, ns->errbuf, "external sort of primary keys failed");
+ if ((ns->ptmp = fopen(ns->ptmpfile, "r")) == NULL) ESL_XFAIL(eslESYS, ns->errbuf, "failed to reopen primary key tmp file after sort");
+
+ fclose(ns->stmp);
+ ns->stmp = NULL;
+ sprintf(cmd, "env LC_ALL=POSIX sort -o %s %s\n", ns->stmpfile, ns->stmpfile);
+ if (system(cmd) != 0) ESL_XFAIL(eslESYS, ns->errbuf, "external sort of secondary keys failed");
+ if ((ns->stmp = fopen(ns->stmpfile, "r")) == NULL) ESL_XFAIL(eslESYS, ns->errbuf, "failed to reopen secondary key tmp file after sort");
+ }
+ else
+ {
+ qsort((void *) ns->pkeys, ns->nprimary, sizeof(ESL_PKEY), pkeysort);
+ qsort((void *) ns->skeys, ns->nsecondary, sizeof(ESL_SKEY), skeysort);
+ }
+
+ /* Write the header
+ */
+ if (esl_fwrite_u32(ns->ssifp, v30magic) != eslOK ||
+ esl_fwrite_u32(ns->ssifp, header_flags) != eslOK ||
+ esl_fwrite_u32(ns->ssifp, sizeof(off_t)) != eslOK ||
+ esl_fwrite_u16(ns->ssifp, ns->nfiles) != eslOK ||
+ esl_fwrite_u64(ns->ssifp, ns->nprimary) != eslOK ||
+ esl_fwrite_u64(ns->ssifp, ns->nsecondary)!= eslOK ||
+ esl_fwrite_u32(ns->ssifp, ns->flen) != eslOK ||
+ esl_fwrite_u32(ns->ssifp, ns->plen) != eslOK ||
+ esl_fwrite_u32(ns->ssifp, ns->slen) != eslOK ||
+ esl_fwrite_u32(ns->ssifp, frecsize) != eslOK ||
+ esl_fwrite_u32(ns->ssifp, precsize) != eslOK ||
+ esl_fwrite_u32(ns->ssifp, srecsize) != eslOK ||
+ esl_fwrite_offset(ns->ssifp, foffset) != eslOK ||
+ esl_fwrite_offset(ns->ssifp, poffset) != eslOK ||
+ esl_fwrite_offset(ns->ssifp, soffset) != eslOK)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi write failed");
+
+ /* Write the file section
+ */
+ for (i = 0; i < ns->nfiles; i++)
+ {
+ file_flags = 0;
+ if (ns->bpl[i] > 0 && ns->rpl[i] > 0) file_flags |= eslSSI_FASTSUBSEQ;
+ strncpy(fk, ns->filenames[i], ns->flen);
+
+ if (fwrite(fk, sizeof(char), ns->flen, ns->ssifp) != ns->flen ||
+ esl_fwrite_u32(ns->ssifp, ns->fileformat[i]) != eslOK ||
+ esl_fwrite_u32(ns->ssifp, file_flags) != eslOK ||
+ esl_fwrite_u32(ns->ssifp, ns->bpl[i]) != eslOK ||
+ esl_fwrite_u32(ns->ssifp, ns->rpl[i]) != eslOK)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi write failed");
+ }
+
+ /* Write the primary key section
+ */
+ if (ns->external)
+ {
+ for (i = 0; i < ns->nprimary; i++)
+ {
+ if (esl_fgets(&buf, &n, ns->ptmp) != eslOK) ESL_XFAIL(eslESYS, ns->errbuf, "read from sorted primary key tmpfile failed");
+ if (parse_pkey(buf, &pkey) != eslOK) ESL_XFAIL(eslESYS, ns->errbuf, "parse failed for a line of sorted primary key tmpfile failed");
+ strncpy(pk, pkey.key, ns->plen); /* note: strncpy pads w/ nulls */
+
+ if (fwrite(pk,sizeof(char),ns->plen,ns->ssifp) != ns->plen ||
+ esl_fwrite_u16( ns->ssifp, pkey.fnum) != eslOK ||
+ esl_fwrite_offset(ns->ssifp, pkey.r_off) != eslOK ||
+ esl_fwrite_offset(ns->ssifp, pkey.d_off) != eslOK ||
+ esl_fwrite_i64( ns->ssifp, pkey.len) != eslOK)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi write failed");
+ }
+ }
+ else
+ {
+ for (i = 0; i < ns->nprimary; i++)
+ {
+ strncpy(pk, ns->pkeys[i].key, ns->plen);
+
+ if (fwrite(pk,sizeof(char),ns->plen,ns->ssifp) != ns->plen ||
+ esl_fwrite_u16( ns->ssifp, ns->pkeys[i].fnum) != eslOK ||
+ esl_fwrite_offset(ns->ssifp, ns->pkeys[i].r_off) != eslOK ||
+ esl_fwrite_offset(ns->ssifp, ns->pkeys[i].d_off) != eslOK ||
+ esl_fwrite_i64( ns->ssifp, ns->pkeys[i].len) != eslOK)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi write failed");
+ }
+ }
+
+
+ /* Write the secondary key section
+ */
+ if (ns->external)
+ {
+ for (i = 0; i < ns->nsecondary; i++)
+ {
+ if (esl_fgets(&buf, &n, ns->stmp) != eslOK) ESL_XFAIL(eslESYS, ns->errbuf, "read from sorted secondary key tmpfile failed");
+ if (parse_skey(buf, &skey) != eslOK) ESL_XFAIL(eslESYS, ns->errbuf, "parse failed for a line of sorted secondary key tmpfile failed");
+ strncpy(sk, skey.key, ns->slen); // slen > 0 if there are any secondary keys.
+ strncpy(pk, skey.pkey, ns->plen);
+
+ if (fwrite(sk, sizeof(char), ns->slen, ns->ssifp) != ns->slen ||
+ fwrite(pk, sizeof(char), ns->plen, ns->ssifp) != ns->plen)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi write failed");
+ }
+ }
+ else
+ {
+ /* if ns->nsecondary=0, ns->slen=0 and sk=NULL */
+ for (i = 0; i < ns->nsecondary; i++)
+ {
+ strncpy(sk, ns->skeys[i].key, ns->slen);
+ strncpy(pk, ns->skeys[i].pkey, ns->plen);
+
+ if (fwrite(sk, sizeof(char), ns->slen, ns->ssifp) != ns->slen ||
+ fwrite(pk, sizeof(char), ns->plen, ns->ssifp) != ns->plen)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi write failed");
+ }
+ }
+
+ if (fk != NULL) free(fk);
+ if (pk != NULL) free(pk);
+ if (sk != NULL) free(sk);
+ if (buf != NULL) free(buf);
+ if (ns->ptmp != NULL) { fclose(ns->ptmp); ns->ptmp = NULL; }
+ if (ns->stmp != NULL) { fclose(ns->stmp); ns->stmp = NULL; }
+ return eslOK;
+
+ ERROR:
+ if (fk != NULL) free(fk);
+ if (pk != NULL) free(pk);
+ if (sk != NULL) free(sk);
+ if (buf != NULL) free(buf);
+ if (ns->ptmp != NULL) { fclose(ns->ptmp); ns->ptmp = NULL; }
+ if (ns->stmp != NULL) { fclose(ns->stmp); ns->stmp = NULL; }
+ return status;
+}
+
+/* Function: esl_newssi_Close()
+ * Synopsis: Free an <ESL_NEWSSI>.
+ *
+ * Purpose: Frees a <ESL_NEWSSI>.
+ */
+void
+esl_newssi_Close(ESL_NEWSSI *ns)
+{
+ int i;
+ if (ns == NULL) return;
+
+ if (ns->external == FALSE)
+ {
+ if (ns->pkeys != NULL)
+ {
+ for (i = 0; i < ns->nprimary; i++)
+ if (ns->pkeys[i].key != NULL) free(ns->pkeys[i].key);
+ free(ns->pkeys);
+ }
+ if (ns->skeys != NULL)
+ {
+ for (i = 0; i < ns->nsecondary; i++)
+ {
+ if (ns->skeys[i].key != NULL) free(ns->skeys[i].key);
+ if (ns->skeys[i].pkey != NULL) free(ns->skeys[i].pkey);
+ }
+ free(ns->skeys);
+ }
+ }
+ else
+ {
+ remove(ns->ptmpfile);
+ remove(ns->stmpfile);
+ }
+
+ if (ns->filenames != NULL)
+ {
+ for (i = 0; i < ns->nfiles; i++)
+ if (ns->filenames[i] != NULL) free(ns->filenames[i]);
+ free(ns->filenames);
+ }
+
+ if (ns->stmp != NULL) fclose(ns->stmp);
+ if (ns->stmpfile != NULL) free(ns->stmpfile);
+ if (ns->ptmp != NULL) fclose(ns->ptmp);
+ if (ns->ptmpfile != NULL) free(ns->ptmpfile);
+ if (ns->fileformat != NULL) free(ns->fileformat);
+ if (ns->bpl != NULL) free(ns->bpl);
+ if (ns->rpl != NULL) free(ns->rpl);
+ if (ns->ssifile != NULL) free(ns->ssifile);
+ if (ns->ssifp != NULL) fclose(ns->ssifp);
+ free(ns);
+}
+
+
+
+
+/* current_newssi_size()
+ *
+ * Calculates the size of the current index, in megabytes, in
+ * its disk version (which is essentially the same as the
+ * RAM it takes, modulo some small overhead for the structures
+ * and ptrs).
+ *
+ * The header costs 10 uint32, 1 uint16, and 3 off_t's: 42 + (12 | 24).
+ * Each file record costs 4 uint32 and flen chars;
+ * each primary key costs us 2 off_t, 1 uint16, 1 uint32, and plen chars;
+ * each sec key costs us plen+slen chars.
+ */
+static int
+current_newssi_size(const ESL_NEWSSI *ns)
+{
+ uint64_t frecsize, precsize, srecsize;
+ uint64_t total;
+
+ /* Magic-looking numbers come from adding up sizes
+ * of things in bytes
+ */
+ frecsize = 4*sizeof(uint32_t) + ns->flen;
+ precsize = 2*sizeof(off_t) + sizeof(uint16_t) + sizeof(uint64_t) + ns->plen;
+ srecsize = ns->slen + ns->plen;
+ total = (9*sizeof(uint32_t)+2*sizeof(uint64_t)+sizeof(uint16_t)+3*sizeof(off_t)+
+ frecsize * ns->nfiles + /* file section size */
+ precsize * ns->nprimary + /* primary key section size */
+ srecsize * ns->nsecondary) / /* secondary key section size */
+ 1048576L;
+ return (int) total;
+}
+
+/* activate_external_sort()
+ *
+ * Switch to external sort mode.
+ * Open file handles for external index files (ptmp, stmp).
+ * Flush current index information to these files.
+ * Free current memory, turn over control to the tmpfiles.
+ *
+ * Return <eslOK> on success;
+ * <eslENOTFOUND> if we can't open a tmpfile for writing.
+ *
+ * Throw <eslEWRITE> if a write fails.
+ */
+static int
+activate_external_sort(ESL_NEWSSI *ns)
+{
+ int status;
+ int i;
+
+ if (ns->external) return eslOK; /* we already are external, fool */
+
+ if ((ns->ptmp = fopen(ns->ptmpfile, "w")) == NULL) ESL_XFAIL(eslENOTFOUND, ns->errbuf, "Failed to open primary key tmpfile for external sort");
+ if ((ns->stmp = fopen(ns->stmpfile, "w")) == NULL) ESL_XFAIL(eslENOTFOUND, ns->errbuf, "Failed to open secondary key tmpfile for external sort");
+
+ /* Flush the current indices.
+ */
+ ESL_DPRINTF1(("Switching to external sort - flushing new ssi to disk...\n"));
+ for (i = 0; i < ns->nprimary; i++) {
+ if (sizeof(off_t) == 4) {
+ if (fprintf(ns->ptmp, "%s\t%u\t%lu\t%lu\t%lu\n",
+ ns->pkeys[i].key,
+ (unsigned int) ns->pkeys[i].fnum,
+ (unsigned long) ns->pkeys[i].r_off,
+ (unsigned long) ns->pkeys[i].d_off,
+ (unsigned long) ns->pkeys[i].len) <= 0)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi key tmp file write failed");
+ } else {
+ if (fprintf(ns->ptmp, "%s\t%u\t%llu\t%llu\t%lu\n",
+ ns->pkeys[i].key,
+ (unsigned int) ns->pkeys[i].fnum,
+ (unsigned long long) ns->pkeys[i].r_off,
+ (unsigned long long) ns->pkeys[i].d_off,
+ (unsigned long) ns->pkeys[i].len) <= 0)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi key tmp file write failed");
+ }
+ }
+ for (i = 0; i < ns->nsecondary; i++)
+ if (fprintf(ns->stmp, "%s\t%s\n", ns->skeys[i].key, ns->skeys[i].pkey) <= 0)
+ ESL_XEXCEPTION_SYS(eslEWRITE, "ssi alias tmp file write failed");
+
+ /* Free the memory now that we've flushed our lists to disk
+ */
+ for (i = 0; i < ns->nprimary; i++) free(ns->pkeys[i].key);
+ for (i = 0; i < ns->nsecondary; i++) free(ns->skeys[i].key);
+ for (i = 0; i < ns->nsecondary; i++) free(ns->skeys[i].pkey);
+ if (ns->pkeys != NULL) free(ns->pkeys);
+ if (ns->skeys != NULL) free(ns->skeys);
+ ns->pkeys = NULL;
+ ns->skeys = NULL;
+ ns->external = TRUE;
+ return eslOK;
+
+ ERROR:
+ if (ns->ptmp != NULL) { fclose(ns->ptmp); ns->ptmp = NULL; }
+ if (ns->stmp != NULL) { fclose(ns->stmp); ns->stmp = NULL; }
+ return status;
+}
+
+/* parse_pkey(), parse_skey()
+ *
+ * Given a <buf> containing a line read from the external
+ * primary-key or secondary-key tmpfile; parse it, and fill in the fields of
+ * <pkey> or <skey>
+ *
+ * <?key> is a ptr to a structure on the stack. It is assumed
+ * to be in use only transiently.
+ * <?key>'s strings become ptrs into <buf>'s space, so we don't have to
+ * allocate new space for them. This means that the transient <?key> structure
+ * is only usable until <buf> is modified or free'd.
+ *
+ * Returns <eslOK> on success.
+ *
+ * Throws <eslEFORMAT> on parse error (shouldn't happen; we created it!)
+ * <eslEINCONCEIVABLE> if we can't deal with off_t's size.
+ */
+static int
+parse_pkey(char *buf, ESL_PKEY *pkey)
+{
+ int status;
+ char *s, *tok;
+
+ s = buf;
+ if (esl_strtok(&s, "\t\n", &(pkey->key)) != eslOK) ESL_XEXCEPTION(eslEFORMAT, "parse failed");
+ if (esl_strtok(&s, "\t\n", &tok) != eslOK) ESL_XEXCEPTION(eslEFORMAT, "parse failed");
+
+ pkey->fnum = (uint16_t) atoi(tok);
+ if (esl_strtok(&s, "\t\n", &tok) != eslOK) ESL_XEXCEPTION(eslEFORMAT, "parse failed");
+ if (sizeof(off_t) == 4) pkey->r_off = (off_t) strtoul (tok, NULL, 10);
+ else if (sizeof(off_t) == 8) pkey->r_off = (off_t) strtoull(tok, NULL, 10);
+ else ESL_XEXCEPTION(eslEINCONCEIVABLE, "whoa - weird off_t");
+
+ if (esl_strtok(&s, "\t\n", &tok) != eslOK) ESL_XEXCEPTION(eslEFORMAT, "parse failed");
+ if (sizeof(off_t) == 4) pkey->d_off = (off_t) strtoul (tok, NULL, 10);
+ else if (sizeof(off_t) == 8) pkey->d_off = (off_t) strtoull(tok, NULL, 10);
+ else ESL_XEXCEPTION(eslEINCONCEIVABLE, "whoa - weird off_t");
+
+ if (esl_strtok(&s, "\t\n", &tok) != eslOK) ESL_XEXCEPTION(eslEFORMAT, "parse failed");
+ pkey->len = (uint64_t) strtoull(tok, NULL, 10);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+static int
+parse_skey(char *buf, ESL_SKEY *skey)
+{
+ int status;
+ char *s;
+
+ s = buf;
+ if (esl_strtok(&s, "\t\n", &(skey->key)) != eslOK) ESL_XEXCEPTION(eslEFORMAT, "parse failed");
+ if (esl_strtok(&s, "\t\n", &(skey->pkey)) != eslOK) ESL_XEXCEPTION(eslEFORMAT, "parse failed");
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* ordering functions needed for qsort() */
+static int
+pkeysort(const void *k1, const void *k2)
+{
+ ESL_PKEY *key1;
+ ESL_PKEY *key2;
+ key1 = (ESL_PKEY *) k1;
+ key2 = (ESL_PKEY *) k2;
+ return strcmp(key1->key, key2->key);
+}
+static int
+skeysort(const void *k1, const void *k2)
+{
+ ESL_SKEY *key1;
+ ESL_SKEY *key2;
+ key1 = (ESL_SKEY *) k1;
+ key2 = (ESL_SKEY *) k2;
+ return strcmp(key1->key, key2->key);
+}
+
+
+/*****************************************************************
+ *# 3. Portable binary i/o
+ *****************************************************************/
+
+/* Function: esl_byteswap()
+ * Synopsis: Swap between big-endian and little-endian, in place.
+ *
+ * Purpose: Swap between big-endian and little-endian, in place.
+ */
+void
+esl_byteswap(char *swap, int nbytes)
+{
+ int x;
+ char byte;
+
+ for (x = 0; x < nbytes / 2; x++)
+ {
+ byte = swap[nbytes - x - 1];
+ swap[nbytes - x - 1] = swap[x];
+ swap[x] = byte;
+ }
+}
+
+/* Function: esl_ntoh16()
+ * Synopsis: Convert 2-byte integer from network-order to host-order.
+ *
+ * Purpose: Convert a 2-byte integer from network-order to host-order,
+ * and return it.
+ *
+ * <esl_ntoh32()> and <esl_ntoh64()> do the same, but for 4-byte
+ * and 8-byte integers, respectively.
+ */
+uint16_t
+esl_ntoh16(uint16_t netshort)
+{
+#ifdef WORDS_BIGENDIAN
+ return netshort;
+#else
+ esl_byteswap((char *) &netshort, 2);
+ return netshort;
+#endif
+}
+uint32_t
+esl_ntoh32(uint32_t netlong)
+{
+#ifdef WORDS_BIGENDIAN
+ return netlong;
+#else
+ esl_byteswap((char *) &netlong, 4);
+ return netlong;
+#endif
+}
+uint64_t
+esl_ntoh64(uint64_t net_int64)
+{
+#ifdef WORDS_BIGENDIAN
+ return net_int64;
+#else
+ esl_byteswap((char *) &net_int64, 8);
+ return net_int64;
+#endif
+}
+
+/* Function: esl_hton16()
+ * Synopsis: Convert 2-byte integer from host-order to network-order.
+ *
+ * Purpose: Convert a 2-byte integer from host-order to network-order, and
+ * return it.
+ *
+ * <esl_hton32()> and <esl_hton64()> do the same, but for 4-byte
+ * and 8-byte integers, respectively.
+ */
+uint16_t
+esl_hton16(uint16_t hostshort)
+{
+#ifdef WORDS_BIGENDIAN
+ return hostshort;
+#else
+ esl_byteswap((char *) &hostshort, 2);
+ return hostshort;
+#endif
+}
+uint32_t
+esl_hton32(uint32_t hostlong)
+{
+#ifdef WORDS_BIGENDIAN
+ return hostlong;
+#else
+ esl_byteswap((char *) &hostlong, 4);
+ return hostlong;
+#endif
+}
+uint64_t
+esl_hton64(uint64_t host_int64)
+{
+#ifdef WORDS_BIGENDIAN
+ return host_int64;
+#else
+ esl_byteswap((char *) &host_int64, 8);
+ return host_int64;
+#endif
+}
+
+
+/* Function: esl_fread_u16()
+ * Synopsis: Read network-order integer from a stream.
+ *
+ * Purpose: Read a 2-byte network-order integer from <fp>, convert to
+ * host order, leave it in <ret_result>.
+ *
+ * <esl_fread_u32()> and <esl_fread_u64()> do the same, but
+ * for 4-byte and 8-byte integers, respectively.
+ *
+ * Returns: <eslOK> on success, and <eslFAIL> on <fread()> failure.
+ */
+int
+esl_fread_u16(FILE *fp, uint16_t *ret_result)
+{
+ uint16_t result;
+ if (fread(&result, sizeof(uint16_t), 1, fp) != 1) return eslFAIL;
+ *ret_result = esl_ntoh16(result);
+ return eslOK;
+}
+int
+esl_fread_u32(FILE *fp, uint32_t *ret_result)
+{
+ uint32_t result;
+ if (fread(&result, sizeof(uint32_t), 1, fp) != 1) return eslFAIL;
+ *ret_result = esl_ntoh32(result);
+ return eslOK;
+}
+int
+esl_fread_u64(FILE *fp, uint64_t *ret_result)
+{
+ uint64_t result;
+ if (fread(&result, sizeof(uint64_t), 1, fp) != 1) return eslFAIL;
+ *ret_result = esl_ntoh64(result);
+ return eslOK;
+}
+int
+esl_fread_i16(FILE *fp, int16_t *ret_result)
+{
+ int16_t result;
+ if (fread(&result, sizeof(int16_t), 1, fp) != 1) return eslFAIL;
+ *ret_result = (int16_t) esl_ntoh16((uint16_t) result);
+ return eslOK;
+}
+int
+esl_fread_i32(FILE *fp, int32_t *ret_result)
+{
+ int32_t result;
+ if (fread(&result, sizeof(int32_t), 1, fp) != 1) return eslFAIL;
+ *ret_result = (int32_t) esl_ntoh32((uint32_t) result);
+ return eslOK;
+}
+int
+esl_fread_i64(FILE *fp, int64_t *ret_result)
+{
+ int64_t result;
+ if (fread(&result, sizeof(int64_t), 1, fp) != 1) return eslFAIL;
+ *ret_result = (int64_t) esl_ntoh64((uint64_t) result);
+ return eslOK;
+}
+
+
+/* Function: esl_fwrite_u16()
+ * Synopsis: Write an integer to a stream in network-order.
+ *
+ * Purpose: Write a 2-byte host-order integer <n> to stream <fp>
+ * in network order.
+ *
+ * <esl_fwrite_u32()> and <esl_fwrite_u64()> do the same, but
+ * for 4-byte and 8-byte integers, respectively.
+ *
+ * Returns: <eslOK> on success, and <eslFAIL> on <fwrite()> failure.
+ */
+int
+esl_fwrite_u16(FILE *fp, uint16_t n)
+{
+ n = esl_hton16(n);
+ if (fwrite(&n, sizeof(uint16_t), 1, fp) != 1) return eslFAIL;
+ return eslOK;
+}
+int
+esl_fwrite_u32(FILE *fp, uint32_t n)
+{
+ n = esl_hton32(n);
+ if (fwrite(&n, sizeof(uint32_t), 1, fp) != 1) return eslFAIL;
+ return eslOK;
+}
+int
+esl_fwrite_u64(FILE *fp, uint64_t n)
+{
+ n = esl_hton64(n);
+ if (fwrite(&n, sizeof(uint64_t), 1, fp) != 1) return eslFAIL;
+ return eslOK;
+}
+int
+esl_fwrite_i16(FILE *fp, int16_t n)
+{
+ n = (int16_t) esl_hton16((uint16_t) n);
+ if (fwrite(&n, sizeof(int16_t), 1, fp) != 1) return eslFAIL;
+ return eslOK;
+}
+int
+esl_fwrite_i32(FILE *fp, int32_t n)
+{
+ n = (int32_t) esl_hton32((uint32_t) n);
+ if (fwrite(&n, sizeof(int32_t), 1, fp) != 1) return eslFAIL;
+ return eslOK;
+}
+int
+esl_fwrite_i64(FILE *fp, int64_t n)
+{
+ n = (int64_t) esl_hton64((uint64_t) n);
+ if (fwrite(&n, sizeof(int64_t), 1, fp) != 1) return eslFAIL;
+ return eslOK;
+}
+
+
+/* Function: esl_fread_offset()
+ * Synopsis: Read an offset portably.
+ *
+ * Purpose: Read a file offset from the stream <fp> (which would usually
+ * be a save file), and store it in <ret_offset>.
+ *
+ * Offsets may have been saved by a different machine
+ * than the machine that reads them. The writer and the reader
+ * may differ in byte order and in width (<sizeof(off_t)>).
+ *
+ * Byte order is dealt with by saving offsets in
+ * network byte order, and converting them to host byte order
+ * when they are read (if necessary).
+ *
+ * Width is dealt with by the <sz> argument, which must be
+ * either 4 or 8, specifying that the saved offset is a
+ * 32-bit versus 64-bit <off_t>. If the reading host
+ * <off_t> width matches the <sz> of the writer, no
+ * problem. If <sz> is 4 but the reading host has 64-bit
+ * <off_t>'s, this is also no problem; the conversion
+ * always works. If <sz> is 64 but the reading host has
+ * only 32-bit <off_t>, we cannot guarantee that we have
+ * sufficient dynamic range to represent the offset; if
+ * the stored offset is too large to represent in a 32-bit
+ * offset, we throw a fatal <eslEINCOMPAT> error.
+ *
+ * Returns: <eslOK> on success; <eslFAIL> on a read failure.
+ *
+ * Throws: <eslEINVAL> if <sz> is something other than 4 or 8;
+ * <eslEINCOMPAT> if the stored offset is too large for
+ * the reader to represent (the machine that wrote the
+ * SSI file used 64 bit offsets, the reader uses 32
+ * bit offsets, and this offset is too large to represent
+ * in a 32 bit offset).
+ */
+int
+esl_fread_offset(FILE *fp, int sz, off_t *ret_offset)
+{
+ int status;
+ uint32_t x32;
+ uint64_t x64;
+
+ if (sz == 8)
+ {
+ if (esl_fread_u64(fp, &x64) != eslOK) { status = eslFAIL; goto ERROR; }
+ if (sizeof(off_t) == 4 && x64 > INT32_MAX)
+ ESL_XEXCEPTION(eslEINCOMPAT, "can't read 64-bit off_t on this 32-bit host");
+ *ret_offset = (off_t) x64;
+ }
+ else if (sz == 4)
+ {
+ if (esl_fread_u32(fp, &x32) != eslOK) { status = eslFAIL; goto ERROR; }
+ *ret_offset = (off_t) x32;
+ }
+ else ESL_XEXCEPTION(eslEINVAL, "offsets must be 32 or 64 bits");
+ return eslOK;
+
+ ERROR:
+ *ret_offset = 0;
+ return status;
+}
+
+/* Function: esl_fwrite_offset()
+ * Synopsis: Write an offset portably.
+ *
+ * Purpose: Portably write (save) <offset> to the stream <fp>, in network
+ * byte order.
+ *
+ * Returns: <eslOK> on success; <eslFAIL> on write failure.
+ *
+ * Throws: <eslEINVAL> if <off_t> is something other than a 32-bit or
+ * 64-bit integer on this machine, in which case we don't know
+ * how to deal with it portably.
+ */
+int
+esl_fwrite_offset(FILE *fp, off_t offset)
+{
+ if (sizeof(off_t) == 4) return esl_fwrite_u32(fp, offset);
+ else if (sizeof(off_t) == 8) return esl_fwrite_u64(fp, offset);
+ else ESL_EXCEPTION(eslEINVAL, "off_t is neither 32-bit nor 64-bit");
+ /*UNREACHED*/
+ return eslEINCONCEIVABLE;
+}
+
+
+
+
+/*****************************************************************
+ * 4. Test driver
+ *****************************************************************/
+
+/* gcc -g -Wall -o ssi_utest -L. -I. -DeslSSI_TESTDRIVE esl_ssi.c -leasel -lm
+ * ./ssi_utest
+ */
+#ifdef eslSSI_TESTDRIVE
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_ssi.h"
+#include "esl_random.h"
+#include "esl_randomseq.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-F", eslARG_INT, "3", NULL, NULL, NULL, NULL, NULL, "number of test files", 0 },
+ { "-L", eslARG_INT, "1000", NULL, NULL, NULL, NULL, NULL, "max length of test sequences", 0 },
+ { "-N", eslARG_INT, "10", NULL, NULL, NULL, NULL, NULL, "number of test sequences per file", 0 },
+ { "-Q", eslARG_INT, "10", NULL, NULL, NULL, NULL, NULL, "number of random queries to retrieve", 0 },
+ { "-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { "-v", eslARG_NONE, NULL, NULL, NULL, NULL, NULL, NULL, "be verbose", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for ssi module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ ESL_NEWSSI *ns = NULL;
+ ESL_SSI *ssi = NULL;
+ ESL_SQ *sq = NULL;
+ ESL_SQFILE *sqfp = NULL;
+ char *ssifile = NULL;
+ FILE *fp = NULL;
+ int nfiles = esl_opt_GetInteger(go, "-F");
+ int maxL = esl_opt_GetInteger(go, "-L");
+ int nseq = esl_opt_GetInteger(go, "-N");
+ int nq = esl_opt_GetInteger(go, "-Q");
+ int be_verbose = esl_opt_GetBoolean(go, "-v");
+ uint16_t fh;
+ int i,j;
+ char **sqfile = NULL;
+ char **seqname = NULL;
+ char **seq = NULL;
+ int *seqlen = NULL;
+ char query[32];
+ char *qfile;
+ int qfmt;
+ off_t roff;
+ double p[4] = { 0.25, 0.25, 0.25, 0.25 };
+ int status;
+
+ /* Create <nfiles> sequence file names. */
+ ESL_DASSERT1(( nfiles > 0 ));
+ ESL_ALLOC(sqfile, sizeof(char *) * nfiles);
+ for (j = 0; j < nfiles; j++)
+ {
+ ESL_ALLOC(sqfile[j], sizeof(char) * 32);
+ sprintf(sqfile[j], "esltmpXXXXXX");
+ }
+
+ /* Create <nfiles*nseq> sequences with random
+ * lengths up to 1000.
+ */
+ ESL_ALLOC(seq, sizeof(char *) * nseq * nfiles);
+ ESL_ALLOC(seqname,sizeof(char *) * nseq * nfiles);
+ ESL_ALLOC(seqlen, sizeof(int) * nseq * nfiles);
+ for (i = 0; i < nseq*nfiles; i++)
+ {
+ seqlen[i] = 1 + esl_rnd_Roll(r, maxL); /* 1..maxL */
+ ESL_ALLOC(seq[i], sizeof(char) * (seqlen[i]+1));
+ ESL_ALLOC(seqname[i],sizeof(char) * 64);
+
+ esl_rsq_IID(r, "ACGT", p, 4, seqlen[i], seq[i]);
+ sprintf(seqname[i], "seq%d-file%d", i, i/nseq);
+ }
+
+ /* Save them to FASTA files.
+ */
+ for (j = 0; j < nfiles; j++)
+ {
+ if (esl_tmpfile_named(sqfile[j], &fp) != eslOK) esl_fatal("failed to open %s", sqfile[j]);
+ for (i = j*nseq; i < (j+1)*nseq; i++)
+ {
+ sq = esl_sq_CreateFrom(seqname[i], seq[i], NULL, NULL, NULL);
+ esl_sqio_Write(fp, sq, eslSQFILE_FASTA, FALSE);
+ esl_sq_Destroy(sq);
+ }
+ fclose(fp);
+ }
+
+ /* Create an ssi index of all the FASTA files. */
+ if (esl_strdup(sqfile[0], -1, &ssifile) != eslOK) esl_fatal("esl_strdup() failed");
+ if (esl_strcat(&ssifile, -1, ".ssi", 4) != eslOK) esl_fatal("esl_strcat() failed");
+ if (esl_newssi_Open(ssifile, TRUE, &ns) != eslOK) esl_fatal("new SSI index open failed");
+ if ((sq = esl_sq_Create()) == NULL) esl_fatal("esl_sq_Create() failed");
+
+ for (j = 0; j < nfiles; j++)
+ {
+ if (esl_sqfile_Open(sqfile[j], eslSQFILE_UNKNOWN, NULL, &sqfp) != eslOK) esl_fatal("failed to open fasta file %s", sqfile[j]);
+ if (esl_newssi_AddFile(ns, sqfile[j], sqfp->format, &fh) != eslOK) esl_fatal("esl_newssi_AddFile() failed");
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ if (be_verbose) printf("%16s %ld %ld %" PRIi64 "\n", sq->name, (long) sq->roff, (long) sq->doff, sq->L);
+ if (esl_newssi_AddKey(ns, sq->name, fh, sq->roff, sq->doff, sq->L) != eslOK) esl_fatal("esl_newssi_AddKey() failed");
+ esl_sq_Reuse(sq);
+ }
+ if (status != eslEOF) esl_fatal("sequence read failure");
+ esl_sqfile_Close(sqfp);
+ }
+ esl_sq_Destroy(sq);
+
+ /* Save the SSI index to a file.
+ */
+ esl_newssi_Write(ns);
+ esl_newssi_Close(ns);
+
+ /* Open the SSI index - now we'll use it to retrieve
+ * <nq> random sequences.
+ */
+ if (esl_ssi_Open(ssifile, &ssi) != eslOK) esl_fatal("failed to open ssi index");
+ sq = esl_sq_Create();
+ while (nq--)
+ {
+ /* Choose a seq and file */
+ i = esl_rnd_Roll(r, nseq*nfiles);
+ j = i/nseq;
+ sprintf(query, "seq%d-file%d", i, j);
+
+ /* Retrieve it */
+ status = esl_ssi_FindName(ssi, query, &fh, &roff, NULL, NULL);
+ if (status != eslOK) esl_fatal("didn't find %s in index", query);
+
+ status = esl_ssi_FileInfo(ssi, fh, &qfile, &qfmt);
+ if (status != eslOK) esl_fatal("didn't locate file info for %s", query);
+
+ if (esl_sqfile_Open(qfile, qfmt, NULL, &sqfp) != eslOK)
+ esl_fatal("failed to open fasta file %s", qfile);
+ esl_sqfile_Position(sqfp, roff);
+ if (esl_sqio_Read(sqfp, sq) != eslOK) esl_fatal("failed to read seq %s", query);
+
+ /* Check that it's the right one */
+ if (strcmp(sq->name, query) != 0) esl_fatal("sought %s, retrieved %s", query, sq->name);
+ if (sq->n != seqlen[i]) esl_fatal("wrong sequence length retrieved");
+ if (strcmp(sq->seq, seq[i]) != 0) esl_fatal("unexpected sequence retrieved");
+ if (strcmp(qfile, sqfile[j]) != 0) esl_fatal("file names %s and %s differ", qfile, sqfile[j]);
+
+ esl_sq_Reuse(sq);
+ esl_sqfile_Close(sqfp);
+ }
+
+ for (j = 0; j < nfiles; j++) remove(sqfile[j]);
+ remove(ssifile);
+ status = eslOK;
+
+ /* flowthrough is safe: garbage collection only below. */
+ ERROR:
+ free(ssifile);
+ esl_sq_Destroy(sq);
+ esl_ssi_Close(ssi);
+ esl_randomness_Destroy(r);
+ if (seqlen) free(seqlen);
+ esl_Free2D((void **) seqname, nseq*nfiles);
+ esl_Free2D((void **) seq, nseq*nfiles);
+ esl_Free2D((void **) sqfile, nfiles);
+ esl_getopts_Destroy(go);
+ return status;
+}
+#endif /*eslSSI_TESTDRIVE*/
+
+
+
+/*****************************************************************
+ * 5. Example code.
+ ****************************************************************/
+#ifdef eslSSI_EXAMPLE
+/* gcc -o example -g -Wall -DeslSSI_EXAMPLE esl_ssi.c easel.c
+ * esl-shuffle -o foo.fa -N 1000 -G --amino -L 400
+ * ./example foo.fa
+ */
+/*::cexcerpt::ssi_example::begin::*/
+#include <stdio.h>
+#include "easel.h"
+#include "esl_ssi.h"
+
+int main(int argc, char **argv)
+{
+ ESL_NEWSSI *ns;
+ char *fafile; /* name of FASTA file */
+ FILE *fp; /* opened FASTA file for reading */
+ char *ssifile; /* name of SSI file */
+ uint16_t fh; /* file handle SSI associates w/ fafile */
+ char *buf = NULL; /* growable buffer for esl_fgets() */
+ int n = 0; /* length of buf */
+ char *s, *seqname;
+ off_t seq_offset;
+ int status;
+
+ /* Open a new SSI index named <fafile>.ssi */
+ fafile = argv[1];
+ esl_strdup(fafile, -1, &ssifile);
+ esl_strcat(&ssifile, -1, ".ssi", 4);
+ status = esl_newssi_Open(ssifile, FALSE, &ns);
+ if (status == eslENOTFOUND) esl_fatal("failed to open SSI index %s", ssifile);
+ else if (status == eslEOVERWRITE) esl_fatal("SSI index %s already exists; delete or rename it", ssifile);
+ else if (status != eslOK) esl_fatal("failed to create a new SSI index");
+
+ /* Collect the sequence names from a FASTA file into an index */
+ if ((fp = fopen(fafile, "r")) == NULL) esl_fatal("failed to open %s", fafile);
+ if (esl_newssi_AddFile(ns, fafile, 1, &fh) != eslOK) esl_fatal("failed to add %s to index: %s", fafile, ns->errbuf);
+ seq_offset = ftello(fp);
+ while (esl_fgets(&buf, &n, fp) == eslOK)
+ {
+ if (*buf == '>') {
+ s = buf+1; /* skip past > */
+ esl_strtok(&s, " \t\n", &seqname); /* name = 1st token on > line */
+ if (esl_newssi_AddKey(ns, seqname, fh, seq_offset, 0, 0) != eslOK)
+ esl_fatal("failed to add key %s to index: %s", seqname, ns->errbuf);
+ }
+ seq_offset = ftello(fp);
+ }
+ free(buf);
+ fclose(fp);
+
+ /* Save the index to disk */
+ status = esl_newssi_Write(ns);
+ if (status == eslERANGE) esl_fatal("SSI index file size exceeds maximum allowed by your filesystem");
+ else if (status == eslESYS) esl_fatal("SSI index sort failed: %s", ns->errbuf);
+ else if (status != eslOK) esl_fatal("SSI index save failed: %s", ns->errbuf);
+ esl_newssi_Close(ns);
+ free(ssifile);
+ return 0;
+}
+/*::cexcerpt::ssi_example::end::*/
+#endif /*eslSSI_EXAMPLE*/
+
+
+#ifdef eslSSI_EXAMPLE2
+/* gcc -o example2 -g -Wall -DeslSSI_EXAMPLE2 esl_ssi.c easel.c
+ * ./example2 random77 foo.fa.ssi
+ */
+/*::cexcerpt::ssi_example2::begin::*/
+#include <stdio.h>
+#include "easel.h"
+#include "esl_ssi.h"
+
+int main(int argc, char **argv)
+{
+ ESL_SSI *ssi;
+ char *seqname; /* name of sequence to retrieve */
+ char *ssifile; /* name of SSI file */
+ uint16_t fh; /* file handle SSI associates w/ fafile */
+ char *fafile; /* name of FASTA file */
+ int fmt; /* format code (1, in this example) */
+ off_t offset; /* disk offset of seqname in fafile */
+ FILE *fp; /* opened FASTA file for reading */
+ char *buf = NULL; /* growable buffer for esl_fgets() */
+ int n = 0; /* size of buffer */
+
+ seqname = argv[1];
+ ssifile = argv[2];
+
+ if (esl_ssi_Open(ssifile, &ssi) != eslOK) esl_fatal("open failed");
+ if (esl_ssi_FindName(ssi, seqname, &fh, &offset, NULL, NULL) != eslOK) esl_fatal("find failed");
+ if (esl_ssi_FileInfo(ssi, fh, &fafile, &fmt) != eslOK) esl_fatal("info failed");
+ /* you can't close the ssi file yet - fafile is pointing into it! */
+
+ if ((fp = fopen(fafile, "r")) == NULL) esl_fatal("failed to open %s", fafile);
+ if (fseeko(fp, offset, SEEK_SET) != 0) esl_fatal("failed to position %s", fafile);
+ if (esl_fgets(&buf, &n, fp) != eslOK) esl_fatal("failed to get name/desc line");
+ do {
+ printf("%s", buf);
+ } while (esl_fgets(&buf, &n, fp) == eslOK && *buf != '>');
+
+ esl_ssi_Close(ssi);
+ fclose(fp);
+ free(buf);
+ return 0;
+}
+/*::cexcerpt::ssi_example2::end::*/
+#endif /*eslSSI_EXAMPLE2*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_ssi.h b/esl_ssi.h
new file mode 100644
index 0000000..12219da
--- /dev/null
+++ b/esl_ssi.h
@@ -0,0 +1,163 @@
+/* Simple sequence indices:
+ * Fast sequence record lookup in large files by keywords, such
+ * as names or accessions.
+ */
+#ifndef eslSSI_INCLUDED
+#define eslSSI_INCLUDED
+#ifdef eslAUGMENT_SSI
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#define eslSSI_MAXFILES 32767 /* 2^15-1 */
+#define eslSSI_MAXKEYS 2147483647L /* 2^31-1 */
+#define eslSSI_MAXRAM 256 /* >256MB indices trigger external sort */
+
+#ifndef HAVE_FSEEKO
+#define fseeko fseek
+#define ftello ftell
+#endif
+
+/* ESL_SSI
+ * Using an existing SSI index file.
+ */
+typedef struct {
+ FILE *fp; /* open SSI index file */
+ uint32_t flags; /* optional behavior flags */
+ uint32_t offsz; /* sizeof(off_t)'s in the SSI file */
+ uint16_t nfiles; /* number of files = 16 bit int */
+ uint64_t nprimary; /* number of primary keys */
+ uint64_t nsecondary; /* number of secondary keys */
+ uint32_t flen; /* length of filenames (inc '\0') */
+ uint32_t plen; /* length of primary keys (inc '\0') */
+ uint32_t slen; /* length of secondary keys (inc '\0') */
+ uint32_t frecsize; /* # bytes in a file record */
+ uint32_t precsize; /* # bytes in a primary key record */
+ uint32_t srecsize; /* # bytes in a secondary key record */
+ off_t foffset; /* disk offset, start of file records */
+ off_t poffset; /* disk offset, start of pri key recs */
+ off_t soffset; /* disk offset, start of sec key recs */
+
+
+ /* File information: */
+ char **filename; /* list of file names [0..nfiles-1] */
+ uint32_t *fileformat; /* file formats */
+ uint32_t *fileflags; /* optional per-file behavior flags */
+ uint32_t *bpl; /* bytes per line in file */
+ uint32_t *rpl; /* residues per line in file */
+} ESL_SSI;
+
+/* Flags for the <ssi->fileflags> bit vectors. */
+#define eslSSI_FASTSUBSEQ (1<<0) /* we can do fast subseq lookup calculations on this file */
+
+
+/* ESL_NEWSSI
+ * Used to create a new SSI index.
+ */
+typedef struct { /* Primary key data: */
+ char *key; /* key name */
+ uint16_t fnum; /* file number */
+ off_t r_off; /* record offset */
+ off_t d_off; /* data offset */
+ int64_t len; /* sequence length */
+} ESL_PKEY;
+
+typedef struct { /* Secondary key data: */
+ char *key; /* secondary key name */
+ char *pkey; /* primary key name */
+} ESL_SKEY;
+
+typedef struct {
+ char *ssifile; /* name of the SSI file we're creating */
+ FILE *ssifp; /* open SSI file being created */
+ int external; /* TRUE if pkeys and skeys are on disk */
+ int max_ram; /* threshold in MB to trigger extern sort */
+
+ char **filenames;
+ uint32_t *fileformat;
+ uint32_t *bpl;
+ uint32_t *rpl;
+ uint32_t flen; /* length of longest filename, inc '\0' */
+ uint16_t nfiles; /* can store up to 2^15-1 (32767) files */
+
+ ESL_PKEY *pkeys;
+ uint32_t plen; /* length of longest pkey, including '\0' */
+ uint64_t nprimary; /* can store up to 2^63-1 = 9.2e18 keys */
+ char *ptmpfile; /* primary key tmpfile name, for extern sort */
+ FILE *ptmp; /* handle on open ptmpfile */
+
+ ESL_SKEY *skeys;
+ uint32_t slen; /* length of longest skey, including '\0' */
+ uint64_t nsecondary;
+ char *stmpfile; /* secondary key tmpfile name, for extern sort */
+ FILE *stmp; /* handle on open ptmpfile */
+
+ char errbuf[eslERRBUFSIZE];
+} ESL_NEWSSI;
+
+
+#define eslSSI_FCHUNK 16 /* chunk size for file name reallocation */
+#define eslSSI_KCHUNK 128 /* and for key reallocation */
+
+
+/* 1. Using (reading) SSI indices */
+extern int esl_ssi_Open(const char *filename, ESL_SSI **ret_ssi);
+extern void esl_ssi_Close(ESL_SSI *ssi);
+extern int esl_ssi_FindName(ESL_SSI *ssi, const char *key,
+ uint16_t *ret_fh, off_t *ret_roff, off_t *opt_doff, int64_t *opt_L);
+extern int esl_ssi_FindNumber(ESL_SSI *ssi, int64_t nkey,
+ uint16_t *opt_fh, off_t *opt_roff, off_t *opt_doff, int64_t *opt_L, char **opt_pkey);
+extern int esl_ssi_FindSubseq(ESL_SSI *ssi, const char *key, int64_t requested_start,
+ uint16_t *ret_fh, off_t *ret_roff, off_t *ret_doff, int64_t *ret_L, int64_t *ret_actual_start);
+extern int esl_ssi_FileInfo(ESL_SSI *ssi, uint16_t fh, char **ret_filename, int *ret_format);
+
+
+
+/* 2. Creating (writing) SSI indices. */
+extern int esl_newssi_Open(const char *ssifile, int allow_overwrite, ESL_NEWSSI **ret_newssi);
+extern int esl_newssi_AddFile (ESL_NEWSSI *ns, const char *filename, int fmt, uint16_t *ret_fh);
+extern int esl_newssi_SetSubseq(ESL_NEWSSI *ns, uint16_t fh, uint32_t bpl, uint32_t rpl);
+extern int esl_newssi_AddKey (ESL_NEWSSI *ns, const char *key, uint16_t fh, off_t r_off, off_t d_off, int64_t L);
+extern int esl_newssi_AddAlias (ESL_NEWSSI *ns, const char *alias, const char *key);
+extern int esl_newssi_Write (ESL_NEWSSI *ns);
+extern void esl_newssi_Close (ESL_NEWSSI *ns);
+
+
+/* 3. Portable binary i/o. */
+extern void esl_byteswap(char *swap, int nbytes);
+extern uint16_t esl_ntoh16(uint16_t netshort);
+extern uint32_t esl_ntoh32(uint32_t netlong);
+extern uint64_t esl_ntoh64(uint64_t net_int64);
+extern uint16_t esl_hton16(uint16_t hostshort);
+extern uint32_t esl_hton32(uint32_t hostlong);
+extern uint64_t esl_hton64(uint64_t host_int64);
+extern int esl_fread_u16(FILE *fp, uint16_t *ret_result);
+extern int esl_fread_u32(FILE *fp, uint32_t *ret_result);
+extern int esl_fread_u64(FILE *fp, uint64_t *ret_result);
+extern int esl_fread_i16(FILE *fp, int16_t *ret_result);
+extern int esl_fread_i32(FILE *fp, int32_t *ret_result);
+extern int esl_fread_i64(FILE *fp, int64_t *ret_result);
+extern int esl_fwrite_u16(FILE *fp, uint16_t n);
+extern int esl_fwrite_u32(FILE *fp, uint32_t n);
+extern int esl_fwrite_u64(FILE *fp, uint64_t n);
+extern int esl_fwrite_i16(FILE *fp, int16_t n);
+extern int esl_fwrite_i32(FILE *fp, int32_t n);
+extern int esl_fwrite_i64(FILE *fp, int64_t n);
+extern int esl_fread_offset(FILE *fp, int mode, off_t *ret_offset);
+extern int esl_fwrite_offset(FILE *fp, off_t offset);
+#endif /* eslAUGMENT_SSI*/
+#ifndef eslAUGMENT_SSI
+typedef void ESL_SSI;
+typedef void ESL_NEWSSI;
+#endif
+#endif /* eslSSI_INCLUDED */
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_ssi.tex b/esl_ssi.tex
new file mode 100644
index 0000000..a719fc7
--- /dev/null
+++ b/esl_ssi.tex
@@ -0,0 +1,451 @@
+The \eslmod{ssi} module is for creating and using ``SSI''
+(sequence/subsequence index) files. SSI indexes flatfile databases by
+names and/or accessions, enabling fast sequence record retrieval.
+
+An SSI index is a binary file that stores sequence names or accessions
+as \emph{keys}, associating them with information about the sequence
+record, including its location (file name and disk offset), so that it
+can be looked up rapidly. It differentiates between \emph{primary
+keys} and \emph{secondary keys} (aliases). There is one and only one
+primary key per record. There can be more than one secondary key
+(alias) per sequence. Both primary and secondary keys must be unique
+identifiers (no two records have the same key). For example, a program
+for sequence retrieval might create an SSI index with accessions as
+primary keys and names as secondary keys (or the other way around).
+
+Records can also be retrieved by number from the list of primary keys.
+This may be useful for distributed data-parallel applications, which
+can use SSI to rapidly position individual processes at different
+record ranges in a flatfile database.
+
+A single SSI file can index a sequence database that consists of more
+than one individual sequence file. For example, the GenBank database
+is distributed as a large number of flatfiles; one SSI file can index
+them all.
+
+When records are consistently formatted, SSI indices can allow a
+specific subsequence in a sequence record to be identified
+rapidly. This is useful when the sequence records are very large, such
+as whole assembled genomes or chromosomes.
+
+Although SSI indices are designed with sequence databases in mind, SSI
+can also be used to index records in other types of flatfile
+databases. For example, HMMER uses SSI to index HMM databases, and the
+\eslmod{msa} module can use SSI to index Stockholm format multiple
+alignment databases like Pfam and Rfam.
+
+SSI can handle large amounts of data. It is capable of indexing tens
+of thousands of files and hundreds of trillions of sequence records.
+The lengths of primary keys, secondary keys, or filenames are
+effectively unlimited, and individual sequence records may be many
+trillions of residues long, orders of magnitude larger than the
+largest complete chromosomes. SSI indexing is effectively limited only
+by the size of the SSI index file itself (up to 8 exabytes, on 64-bit
+filesystems).
+
+Binary SSI indices are portable between different
+machines.\footnote{The sole exception is that SSI indices built for
+64-bit filesystems might not be readable on a fully 32-bit
+filesystem.}
+
+Table~\ref{tbl:ssi_api} lists the functions in the \eslmod{ssi} API.
+A \eslmod{ESL\_SSI} object is used for reading an index, and a
+\eslmod{ESL\_NEWSSI} object is used for creating one. There is also a
+set of functions for portable binary file i/o.
+
+
+% Table generated by autodoc -t esl_ssi.c (so don't edit here, edit esl_ssi.c:)
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\apisubhead{Using (reading) an SSI index.}\\
+\hyperlink{func:esl_ssi_Open()}{\ccode{esl\_ssi\_Open()}} & Open an SSI index as an \ccode{ESL\_SSI}.\\
+\hyperlink{func:esl_ssi_FindName()}{\ccode{esl\_ssi\_FindName()}} & Look up a primary or secondary key.\\
+\hyperlink{func:esl_ssi_FindNumber()}{\ccode{esl\_ssi\_FindNumber()}} & Look up the n'th primary key.\\
+\hyperlink{func:esl_ssi_FindSubseq()}{\ccode{esl\_ssi\_FindSubseq()}} & Look up a specific subsequence's start.\\
+\hyperlink{func:esl_ssi_FileInfo()}{\ccode{esl\_ssi\_FileInfo()}} & Retrieve a file name and format code.\\
+\hyperlink{func:esl_ssi_Close()}{\ccode{esl\_ssi\_Close()}} & Close an SSI index.\\
+\apisubhead{Creating (writing) new SSI files.}\\
+\hyperlink{func:esl_newssi_Open()}{\ccode{esl\_newssi\_Open()}} & Open a new \ccode{ESL\_NEWSSI}.\\
+\hyperlink{func:esl_newssi_AddFile()}{\ccode{esl\_newssi\_AddFile()}} & Add a filename to a growing index.\\
+\hyperlink{func:esl_newssi_SetSubseq()}{\ccode{esl\_newssi\_SetSubseq()}} & Declare that file is suitable for fast subseq lookup.\\
+\hyperlink{func:esl_newssi_AddKey()}{\ccode{esl\_newssi\_AddKey()}} & Add a primary key to a growing index.\\
+\hyperlink{func:esl_newssi_AddAlias()}{\ccode{esl\_newssi\_AddAlias()}} & Add a secondary key (alias) to a growing index.\\
+\hyperlink{func:esl_newssi_Write()}{\ccode{esl\_newssi\_Write()}} & Save a new index to an SSI file.\\
+\hyperlink{func:esl_newssi_Close()}{\ccode{esl\_newssi\_Destroy()}} & Close an \ccode{ESL\_NEWSSI}.\\
+\apisubhead{Portable binary i/o}\\
+\hyperlink{func:esl_byteswap()}{\ccode{esl\_byteswap()}} & Description.\\
+\hyperlink{func:esl_ntoh16()}{\ccode{esl\_ntoh16()}} & Description.\\
+\hyperlink{func:esl_hton16()}{\ccode{esl\_hton16()}} & Description.\\
+%\hyperlink{func:esl_fread_i16()}{\ccode{esl\_fread\_i16()}} & Description.\\
+%\hyperlink{func:esl_fwrite_i16()}{\ccode{esl\_fwrite\_i16()}} & Description.\\
+\ccode{esl\_fread\_i16()} & Description.\\
+\ccode{esl\_fwrite\_i16()} & Description.\\
+\hyperlink{func:esl_fread_offset()}{\ccode{esl\_fread\_offset()}} & Description.\\
+\hyperlink{func:esl_fwrite_offset()}{\ccode{esl\_fwrite\_offset()}} & Description.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{ssi} API.}
+\label{tbl:ssi_api}
+\end{table}
+
+\subsection{Example: creating an SSI index}
+
+Figure~\ref{fig:ssi_example} shows a program that creates an SSI index
+for a FASTA sequence file, in which sequence records start with a line
+like:
+\begin{cchunk}
+ >SEQ_NAME Rest of the line is a free-text description.
+\end{cchunk}
+
+\begin{figure}
+\input{cexcerpts/ssi_example}
+\caption{An example of indexing the sequence records in a FASTA file.}
+\label{fig:ssi_example}
+\end{figure}
+
+\begin{itemize}
+\item A new index is created (\ccode{esl\_newssi\_Open()}). You can
+ name an SSI index anything you want, but for an index of a
+ single file, \Easel\ generally defaults to assuming an
+ \ccode{.ssi} suffix is appended to the filename. That's what
+ the example does here.
+
+\item Each file to be indexed is added to the index by a call to
+ \ccode{esl\_newssi\_AddFile()}. This returns a \emph{file handle}
+ (\ccode{fh}) that you will need when you add primary keys. In
+ this example, there is only one file and only one file handle.
+
+\item You need to determine the disk offset at the exact beginning of
+ each sequence record. You retrieve your current position in the
+ file using an \ccode{ftello()} call.
+
+\item You add each primary key to the index with a
+ \ccode{esl\_newssi\_AddKey()} call. You provide the handle of the
+ file that key is in, and the offset to the start of this key's
+ sequence record.
+
+\item The \ccode{esl\_fgets()} function (part of the \eslmod{easel}
+ foundation module) is a way of reading text files line by line,
+ no matter how long each line might be: \ccode{esl\_fgets()}
+ reallocates its buffer as needed.
+
+\item \ccode{esl\_newssi\_Write()} saves the index to an open file.
+
+\item Finally, the index structure is freed by
+ \ccode{esl\_newssi\_Close()}.
+\end{itemize}
+
+To compile and run the program, given a FASTA file \ccode{foo.fa} that
+you provide:
+
+\begin{cchunk}
+ % cc -o example -DeslSSI_EXAMPLE esl_ssi.c -leasel -lm
+ % ./example foo.fa
+\end{cchunk}
+
+This will create a new SSI file called \ccode{foo.fa.ssi}.
+
+\subsection{An example of using an SSI index}
+
+Figure~\ref{fig:ssi_example2} shows a program that retrieves a FASTA
+sequence record by its name, using an SSI index.
+
+\begin{figure}
+\input{cexcerpts/ssi_example2}
+\caption{Example of using an SSI index to retrieve a sequence by name from a FASTA
+ file.}
+\label{fig:ssi_example2}
+\end{figure}
+
+\begin{itemize}
+\item \ccode{esl\_ssi\_Open()} opens the SSI index file.
+
+\item \ccode{esl\_ssi\_FindName()} looks up the record by its name.
+ Primary keys are checked first, then secondary keys. If it is
+ found, \ccode{fh} contains a file handle (what file it's in),
+ and \ccode{offset} contains the position of the desired record
+ in that file.
+
+\item The file handle \ccode{fh} is looked up in the file index with
+ \ccode{esl\_ssi\_FileInfo()}, and the name of the file and a
+ format code are returned. The format code is useful if you need
+ to hand the filename off to different kinds of file parsers,
+ depending on what file type it is. (SSI can index files in
+ heterogenous formats.)
+
+\item After that, you use the retrieved information however you need,
+ independent of the SSI index. The example emphasizes this, by
+ freeing the SSI index immediately with \ccode{esl\_ssi\_Destroy()}
+ after it knows \ccode{fafile} and \ccode{offset}. The example
+ opens the file, positions the disk with \ccode{fseeko()}, and
+ reads a sequence record out of it one line at a time, until it
+ reaches EOF or the start of the next sequence record.
+\end{itemize}
+
+
+
+
+
+\subsection{SSI file format}
+
+There are four sections to the SSI file:
+\begin{sreitems}{\textbf{Secondary keys}}
+\item[\textbf{Header}]
+Contains a magic number indicating SSI version number, followed by
+information about the number and sizes of items in the index.
+
+\item[\textbf{Files}]
+Contains one or more \emph{file records}, one per sequence file that's
+indexed. These contain information about the individual files.
+
+\item[\textbf{Primary keys}]
+Contains one or more \emph{primary key records}, one per primary key.
+
+\item[\textbf{Secondary keys}]
+Contains one or more \emph{secondary key records}, one per secondary key.
+\end{sreitems}
+
+All numeric quantities are stored as fixed-width unsigned integers in
+network (bigendian) order, for crossplatform portability of the index
+files, using types \ccode{uint16\_t}, \ccode{uint32\_t}, and
+\ccode{uint64\_t}.\footnote{These types are available on C99-compliant
+systems. On other systems, \Easel\ automatically defines appropriate
+substitutes at configuration time.} Values may need to be cast to
+signed quantities elsewhere in \Easel, so only half of their dynamic
+range is valid (e.g. 0..32,767 for values of type \ccode{uint16\_t};
+0..2,146,483,647 (2 billion) for \ccode{uint32\_t}; and 0..9.22e18 (9
+million trillion) for \ccode{uint64\_t}).
+
+File offsets (type \ccode{off\_t}) are assumed to be either 32-bit or
+64-bit signed integers. Easel uses 64-bit offsets if at all possible
+on your system. The size of \ccode{off\_t} for the system that created
+the SSI file is stored in the SSI header, for portability to other
+systems that try to read the SSI file.
+
+\subsubsection{Header section}
+
+The header section contains:
+
+\vspace{1em}
+\begin{tabular}{llrr}
+Variable & Description & Bytes & Type \\\hline
+\ccode{magic} & SSI version magic number. & 4 & \ccode{uint32\_t}\\
+\ccode{flags} & Optional behavior flags (see below) & 4 & \ccode{uint32\_t}\\
+\ccode{offsz} & \ccode{off\_t} size on system that made index & 4 & \ccode{uint32\_t}\\
+\ccode{nfiles} & Number of files in file section. & 2 & \ccode{uint16\_t}\\
+\ccode{nprimary} & Number of primary keys indexed. & 8 & \ccode{uint64\_t}\\
+\ccode{nsecondary} & Number of secondary keys indexed. & 8 & \ccode{uint64\_t}\\
+\ccode{flen} & Length of filenames (incl. '\verb+\0+') & 4 & \ccode{uint32\_t}\\
+\ccode{plen} & Length of primary key names (incl. '\verb+\0+') & 4 & \ccode{uint32\_t}\\
+\ccode{slen} & Length of sec. key names (incl. '\verb+\0+') & 4 & \ccode{uint32\_t}\\
+\ccode{frecsize} & \# of bytes in a file record & 4 & \ccode{uint32\_t}\\
+\ccode{precsize} & \# of bytes in a primary key record & 4 & \ccode{uint32\_t}\\
+\ccode{srecsize} & \# of bytes in a sec. key record & 4 & \ccode{uint32\_t}\\
+\ccode{foffset} & disk offset, start of file records & \dag & \ccode{off\_t}\\
+\ccode{poffset} & disk offset, start of primary key recs & \dag & \ccode{off\_t}\\
+\ccode{soffset} & disk offset, start of sec. key records & \dag & \ccode{off\_t}\\
+\end{tabular}
+\vspace{1em}
+
+The \ccode{flags} field is currently unused. It is stored for possible
+future use, for any optional behaviors that may need to be
+implemented.
+
+The reason to explicitly record various record sizes
+(\ccode{frecsize}, \ccode{precsize}, \ccode{srecsize}) and index file
+positions (\ccode{foffset}, \ccode{poffset}, \ccode{soffset}) is to
+allow for future extensions. Using explicit offsets means we can add
+more fields in future versions of SSI without breaking older SSI
+parsers. The format is meant to be both forwards- and
+backwards-compatible.
+
+\subsubsection{File section}
+
+The file section consists of \ccode{nfiles} file records. Each record
+is \ccode{frecsize} bytes long, and contains:
+
+\vspace{1em}
+\begin{tabular}{llrr}
+Variable & Description & Bytes & Type \\\hline
+\ccode{filename} & Name of file (possibly including full path) & \ccode{flen} & \ccode{char *}\\
+\ccode{format} & Format code for file & 4 & \ccode{uint32\_t} \\
+\ccode{flags} & Optional behavior flags & 4 & \ccode{uint32\_t} \\
+\ccode{bpl} & Bytes per sequence data line & 4 & \ccode{uint32\_t} \\
+\ccode{rpl} & Residues per sequence data line & 4 & \ccode{uint32\_t} \\\hline
+\end{tabular}
+\vspace{1em}
+
+When a SSI file is written, \ccode{frecsize} is equal to the sum of
+the sizes above. When a SSI file is read by a parser, it is possible
+that \ccode{frecsize} is larger than the parser expects, if the parser
+is expecting an older version of the SSI format, because additional
+fields might be present. The parser will only try to parse data up to
+the \ccode{frecsize} it expected to see, but still knows the (possibly
+larger) \ccode{frecsize} that is operative in this SSI file, for
+purposes of skipping around in the index file.
+
+An SSI index might reside in the same directory as the data file(s) it
+indexes, so \ccode{filename} might be relative to the location of the
+SSI index. Alternatively, \ccode{filename} might be a full path. These
+semantics are not enforced by the \eslmod{ssi} module. Rather, this is
+an issue for an SSI-enabled application to define for
+itself. SSI-enabled applications would typically include program(s)
+for creating indices and program(s) for using them. Different
+applications might employ different conventions for where the indices
+are expected to be, relative to the sequence files, so long as that
+convention is consistently applied by both index creator and index
+user.
+
+Similarly, the \eslmod{ssi} module does not specify the meaning of the
+\ccode{format} code. An SSI-enabled application may use this field to
+associate any useful format code (or indeed, any other number) with
+each indexed file. A typical use, though, would be sequence file
+format codes like \ccode{eslSQFILE\_FASTA} or
+\ccode{eslMSAFILE\_STOCKHOLM} from the \eslmod{sqio} or \eslmod{msa}
+modules.
+
+Only one possible optional behavior flag is currently defined:
+
+\vspace{1em}
+\begin{tabular}{lll}
+Flag & Value& Note\\ \hline
+\ccode{eslSSI\_FASTSUBSEQ} & $1 \ll 0$ & Fast subseq retrieval is possible for this file.\\\hline
+\end{tabular}
+\vspace{1em}
+
+When \ccode{eslSSI\_FASTSUBSEQ} is set, \ccode{bpl} and \ccode{rpl}
+are nonzero. These can then be used to calculate the offset of
+subsequence positions in the data file. This optional behavior is
+described in detail a bit later.
+
+\subsubsection{Primary key section}
+
+The primary key section consists of \ccode{nprimary} records. Each
+record is \ccode{precsize} bytes long, and contains:
+
+\vspace{1em}
+\begin{tabular}{llrr}
+Variable & Description & Bytes & Type \\\hline
+\ccode{key} & Key name (seq name, identifier, accession) & \ccode{plen}& \ccode{char *}\\
+\ccode{fnum} & File number (0..nfiles-1) & 2 & \ccode{uint16\_t}\\
+\ccode{r\_off} & Offset to start of record & \ddag & \ccode{off\_t}\\
+\ccode{d\_off} & Offset to start of sequence data & \ddag & \ccode{off\_t}\\
+\ccode{len} & Length of data (e.g. seq length, residues) & 8 & \ccode{uint64\_t} \\\hline
+\end{tabular}
+\vspace{1em}
+
+The two offsets are sequence file offsets that may be either 8 or 4
+bytes (indicated by \ddag above). They are usually 64-bit (8 byte)
+signed integers. If an SSI index is created on an older system that
+only allows 32-bit offsets (and hence cannot have files $>$2 GB), they
+are 32-bit (4-byte) signed integers.
+
+\ccode{r\_off} (the \emph{record offset}) indicates the position of
+the first byte of the record.
+
+\ccode{d\_off} (the \emph{data offset}) is optional. It indicated the
+position of the first byte of the data in the record (the sequence
+itself, for example), after any header information. If
+\ccode{eslSSI\_FASTSUBSEQ} is set on this key's file, \ccode{d\_off}
+can be used to calculate a disk position close to (and possibly
+exactly at) the start of any subsequence.
+
+\ccode{len} is the length of the data record. It is optional, because
+some kinds of records that SSI might be used to index may not have a
+meaningful length. The units of length are application-defined (i.e.\
+defined by whatever creates the SSI index for a particular file); but
+for sequences, \ccode{len} is almost certainly in residues. In
+subsequence retrieval, a \ccode{len} in residues is necessary for
+bounds checking.
+
+\subsubsection{Secondary key section}
+
+The secondary key section consists of \ccode{nsecondary} records. Each
+record is \ccode{srecsize} bytes long, and contains:
+
+\vspace{1em}
+\begin{tabular}{llrr}
+Variable & Description & Bytes & Type \\\hline
+\ccode{key} & Key name (seq name, identifier, accession) & \ccode{slen}& \ccode{char *}\\
+\ccode{pkey} & Primary key &
+\ccode{plen}& \ccode{char *}\\\hline
+\end{tabular}
+\vspace{1em}
+
+That is, secondary keys are simply associated with primary keys as
+\emph{aliases}. There can be many secondary keys for a given record.
+However, all keys (primary and secondary) must be unique: no key can
+occur more than once in the index.
+
+\subsection{Fast subsequence retrieval}
+
+In some files (notably whole chromosomal DNA sequences) the size of
+each sequence is large. It may be slow (even prohibitively slow) to
+extract a desired subsequence, even if an SSI index says how to find
+the sequence record quickly, if you had to read the entire sequence
+into memory just to extract the right part of it.
+
+SSI uses a simple but effective technique to find subsequences.
+Provided that he sequence data file is consistently formatted so that
+each line in each record (except the last one) is of the same length,
+in both bytes and residues, we can determine a disk offset of the
+start of any subsequence by arithmetic. \Easel\ refers to such a file
+as ``well-formatted''. For example, a simple well-formatted FASTA file
+with 50 residues per line might have 51 bytes on every sequence line
+(counting the '\verb+\0+') but for the last line in each record
+(\ccode{bpl}=51, \ccode{rpl}=50). Position $i$ in a sequence $1..L$
+will be on line $l = (i-1)/\mbox{\ccode{rpl}}$, and line $l$ starts at
+disk offset $l * \mbox{\ccode{bpl}}$ relative to the start of the
+sequence data.
+
+If there are no nonsequence characters in the data line except the
+terminal '\verb+\0+' (which is true iff \ccode{bpl} = \ccode{rpl}+1
+and 1 residue = 1 byte), we can precisely identify the disk position
+of any residue $i$ (\emph{single residue resolution}):
+
+\[
+\mbox{relative offset of residue $i$} =
+\left((i-1)/\mbox{\ccode{rpl}}\right)*\mbox{\ccode{bpl}} + (i-1) \% \mbox{ \ccode{rpl}}
+\]
+
+Even for sequence data lines with extra characters (e.g. spaces,
+coordinates, whatever), we can still identify the start of the text
+line that residue $i$ is on (\emph{line resolution}). A parser can be
+positioned at the beginning of the appropriate line $l$, which starts
+at residue $(l*\mbox{\ccode{rpl}}) + 1$, and it can start reading from
+there (e.g. the line that $i$ is on) rather than the beginning of the
+whole sequence record.
+
+When creating an index, your application is responsible for
+determining if \ccode{bpl} and \ccode{rpl} are consistent throughout a
+file. If so, you may call \ccode{esl\_newssi\_SetSubseq()} on that
+file's handle to set \ccode{bpl}, \ccode{rpl}, and the
+\ccode{eslSSI\_FASTSUBSEQ} flag. Then, when using that index, you can
+use the \ccode{esl\_ssi\_FindSubseq()} call to retrieve not only the
+filehandle \ccode{fh} and record offset \ccode{r\_off} for a key; you
+also provide a desired start position \ccode{requested\_start} for the
+subsequence you want to retrieve, and the routine gives you back a
+data offset \ccode{d\_off}, which corresponds to a actual starting
+position \ccode{actual\_start} that is also returned. For single
+residue resolution, \ccode{actual\_start} is \ccode{requested\_start},
+and the data offset \ccode{d\_off} will position you right at the
+residue you want; you position the file with \ccode{fseeko()} and
+start reading your subsequence immediately. When we can only achieve
+line resolution, \ccode{actual\_start} is $\leq$
+\ccode{requested\_start}; you position the disk to the start of the
+appropriate line with \ccode{fseeko()}, start reading, and skip zero
+or more residues to reach your \ccode{requested\_start}. Your
+application should be prepared to deal with line resolution; it should
+not assume that \ccode{requested\_start} and \ccode{actual\_start} are
+identical.
+
+Data is always read ``left to right''. To read a reverse complemented
+strand in DNA files, you must read your subsequence in forward
+orientation first, and reverse complement it later.
+
+
+
diff --git a/esl_stack.c b/esl_stack.c
new file mode 100644
index 0000000..912c770
--- /dev/null
+++ b/esl_stack.c
@@ -0,0 +1,1170 @@
+/* Pushdown stacks for integers, pointers, and characters.
+ *
+ * Contents:
+ * 1. The <ESL_STACK> object.
+ * 2. The main API, including pushing/popping.
+ * 3. Shuffling stacks. [eslAUGMENT_RANDOM]
+ * 4. Using stacks for thread communication [HAVE_PTHREAD]
+ * 5. Unit tests.
+ * 6. Test driver.
+ * 7. Example.
+ * 8. Copyright and license.
+ *
+ * Augmentations:
+ * eslAUGMENT_RANDOM : adds function for shuffling a stack.
+ *
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+#endif
+
+#include "easel.h"
+#include "esl_stack.h"
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* usleep() in unit tests */
+#endif
+
+/*****************************************************************
+ *# 1. The <ESL_STACK> object.
+ *****************************************************************/
+
+/* Function: esl_stack_ICreate()
+ * Synopsis: Create an integer stack.
+ * Incept: SRE, Sun Dec 26 09:11:50 2004 [Zaragoza]
+ *
+ * Purpose: Creates an integer stack.
+ *
+ * Returns: a pointer to the new stack.
+ *
+ * Throws: <NULL> on an allocation failure.
+ */
+ESL_STACK *
+esl_stack_ICreate(void)
+{
+ ESL_STACK *ns = NULL;
+ int status;
+
+ ESL_ALLOC(ns, sizeof(ESL_STACK));
+ ns->nalloc = ESL_STACK_INITALLOC;
+ ns->pdata = NULL;
+ ns->cdata = NULL;
+ ns->idata = NULL;
+ ns->n = 0;
+#ifdef HAVE_PTHREAD
+ ns->do_mutex = FALSE;
+ ns->do_cond = FALSE;
+ ns->mutex = NULL;
+ ns->cond = NULL;
+#endif
+
+ ESL_ALLOC(ns->idata, sizeof(int) * ns->nalloc);
+ return ns;
+
+ ERROR:
+ esl_stack_Destroy(ns);
+ return NULL;
+}
+
+/* Function: esl_stack_CCreate()
+ * Synopsis: Create a character stack.
+ * Incept: SRE, Sun Dec 26 09:15:35 2004 [Zaragoza]
+ *
+ * Purpose: Creates a character stack.
+ *
+ * Returns: a pointer to the new stack.
+ *
+ * Throws: <NULL> on an allocation failure.
+ */
+ESL_STACK *
+esl_stack_CCreate(void)
+{
+ ESL_STACK *cs = NULL;
+ int status;
+
+ ESL_ALLOC(cs, sizeof(ESL_STACK));
+ cs->nalloc = ESL_STACK_INITALLOC;
+ cs->idata = NULL;
+ cs->pdata = NULL;
+ cs->cdata = NULL;
+ cs->n = 0;
+#ifdef HAVE_PTHREAD
+ cs->do_mutex = FALSE;
+ cs->do_cond = FALSE;
+ cs->mutex = NULL;
+ cs->cond = NULL;
+#endif
+
+ ESL_ALLOC(cs->cdata, sizeof(char) * cs->nalloc);
+ return cs;
+
+ ERROR:
+ esl_stack_Destroy(cs);
+ return NULL;
+}
+
+/* Function: esl_stack_PCreate()
+ * Synopsis: Create a pointer stack.
+ * Incept: SRE, Sun Dec 26 09:16:07 2004 [Zaragoza]
+ *
+ * Purpose: Creates a pointer stack.
+ *
+ * Returns: a pointer to the new stack.
+ *
+ * Throws: <NULL> on an allocation failure.
+ */
+ESL_STACK *
+esl_stack_PCreate(void)
+{
+ ESL_STACK *ps = NULL;
+ int status;
+
+ ESL_ALLOC(ps, sizeof(ESL_STACK));
+ ps->nalloc = ESL_STACK_INITALLOC;
+ ps->idata = NULL;
+ ps->cdata = NULL;
+ ps->pdata = NULL;
+ ps->n = 0;
+#ifdef HAVE_PTHREAD
+ ps->do_mutex = FALSE;
+ ps->do_cond = FALSE;
+ ps->mutex = NULL;
+ ps->cond = NULL;
+#endif
+
+ ESL_ALLOC(ps->pdata, sizeof(void *) * ps->nalloc);
+ return ps;
+
+ ERROR:
+ esl_stack_Destroy(ps);
+ return NULL;
+}
+
+/* Function: esl_stack_Reuse()
+ * Synopsis: Reuse a stack.
+ * Incept: SRE, Tue Dec 28 04:21:36 2004 [Zaragoza]
+ *
+ * Purpose: Empties stack <s> so it can be reused without
+ * creating a new one. The stack <s>
+ * can be of any data type; it retains its original
+ * type.
+ *
+ * Returns: <eslOK>
+ */
+int
+esl_stack_Reuse(ESL_STACK *s)
+{
+ s->n = 0; /* it's that simple in this implementation */
+ return eslOK;
+}
+
+/* Function: esl_stack_Destroy()
+ * Synopsis: Free a stack.
+ * Incept: SRE, Sun Dec 26 09:16:24 2004 [Zaragoza]
+ *
+ * Purpose: Destroys a created stack <s>, of any data type.
+ */
+void
+esl_stack_Destroy(ESL_STACK *s)
+{
+ if (s)
+ {
+ if (s->idata) free(s->idata);
+ if (s->cdata) free(s->cdata);
+ if (s->pdata) free(s->pdata);
+#ifdef HAVE_PTHREAD
+ if (s->mutex) { pthread_mutex_destroy(s->mutex); free(s->mutex); }
+ if (s->cond) { pthread_cond_destroy(s->cond); free(s->cond); }
+#endif
+ free(s);
+ }
+}
+/*------------------ end, ESL_STACK object ----------------------*/
+
+
+
+/*****************************************************************
+ *# 2. The main API, including pushing/popping.
+ *****************************************************************/
+
+/* Function: esl_stack_IPush()
+ * Synopsis: Push an integer onto a stack.
+ * Incept: SRE, Sun Dec 26 09:17:17 2004 [Zaragoza]
+ *
+ * Purpose: Push an integer <x> onto an integer stack <ns>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on reallocation failure.
+ * <eslESYS> if a pthread call fails. In this case, the
+ * state of a pthread mutex and/or cond may be wedged.
+ */
+int
+esl_stack_IPush(ESL_STACK *ns, int x)
+{
+ int *ptr = NULL;
+ int status;
+
+#ifdef HAVE_PTHREAD
+ if (ns->do_mutex) if (pthread_mutex_lock(ns->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_lock() failure");
+#endif
+
+ if (ns->n == ns->nalloc) {
+ ESL_RALLOC(ns->idata, ptr, sizeof(int) * ns->nalloc * 2);
+ ns->nalloc += ns->nalloc; /* reallocate by doubling */
+ }
+ ns->idata[ns->n] = x;
+ ns->n++;
+
+#ifdef HAVE_PTHREAD
+ if (ns->do_cond) if (pthread_cond_signal(ns->cond) != 0) ESL_EXCEPTION(eslESYS, "pthread_cond_signal() failure");
+ if (ns->do_mutex) if (pthread_mutex_unlock(ns->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return eslOK;
+
+ ERROR:
+#ifdef HAVE_PTHREAD
+ if (ns->do_mutex) if (pthread_mutex_unlock(ns->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return status;
+}
+
+/* Function: esl_stack_CPush()
+ * Synopsis: Push a char onto a stack.
+ * Incept: SRE, Sun Dec 26 09:18:24 2004 [Zaragoza]
+ *
+ * Purpose: Push a character <c> onto a character stack <cs>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on reallocation failure.
+ * <eslESYS> if a pthread call fails. In this case, the
+ * state of a pthread mutex and/or cond may be wedged.
+ */
+int
+esl_stack_CPush(ESL_STACK *cs, char c)
+{
+ char *ptr = NULL;
+ int status;
+
+#ifdef HAVE_PTHREAD
+ if (cs->do_mutex) if (pthread_mutex_lock(cs->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_lock() failure");
+#endif
+
+ if (cs->n == cs->nalloc) {
+ ESL_RALLOC(cs->cdata, ptr, sizeof(char) * cs->nalloc * 2);
+ cs->nalloc += cs->nalloc; /* reallocate by doubling */
+ }
+ cs->cdata[cs->n] = c;
+ cs->n++;
+
+#ifdef HAVE_PTHREAD
+ if (cs->do_cond) if (pthread_cond_signal(cs->cond) != 0) ESL_EXCEPTION(eslESYS, "pthread_cond_signal() failure");
+ if (cs->do_mutex) if (pthread_mutex_unlock(cs->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return eslOK;
+
+ ERROR:
+#ifdef HAVE_PTHREAD
+ if (cs->do_mutex) if (pthread_mutex_unlock(cs->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return status;
+}
+
+/* Function: esl_stack_PPush()
+ * Synopsis: Push a pointer onto a stack.
+ * Incept: SRE, Sun Dec 26 09:18:49 2004 [Zaragoza]
+ *
+ * Purpose: Push a pointer <p> onto a pointer stack <ps>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on reallocation failure.
+ * <eslESYS> if a pthread call fails. In this case, the
+ * state of a pthread mutex and/or cond may be wedged.
+ */
+int
+esl_stack_PPush(ESL_STACK *ps, void *p)
+{
+ void *ptr = NULL;
+ int status;
+
+#ifdef HAVE_PTHREAD
+ if (ps->do_mutex) if (pthread_mutex_lock(ps->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_lock() failure");
+#endif
+
+ if (ps->n == ps->nalloc) {
+ ESL_RALLOC(ps->pdata, ptr, sizeof(void *) * ps->nalloc * 2);
+ ps->nalloc += ps->nalloc; /* reallocate by doubling */
+ }
+ ps->pdata[ps->n] = p;
+ ps->n++;
+
+#ifdef HAVE_PTHREAD
+ if (ps->do_cond) if (pthread_cond_signal(ps->cond) != 0) ESL_EXCEPTION(eslESYS, "pthread_cond_signal() failure");
+ if (ps->do_mutex) if (pthread_mutex_unlock(ps->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return eslOK;
+
+ ERROR:
+#ifdef HAVE_PTHREAD
+ if (ps->do_mutex) if (pthread_mutex_unlock(ps->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return status;
+}
+
+/* Function: esl_stack_IPop()
+ * Synopsis: Pop an integer off a stack.
+ * Incept: SRE, Sun Dec 26 09:19:12 2004 [Zaragoza]
+ *
+ * Purpose: Pops an integer off the integer stack <ns>, and returns
+ * it through <ret_x>.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEOD> if stack is empty.
+ *
+ * Throws: <eslESYS> if a pthread mutex lock/unlock or conditional wait fails.
+ */
+int
+esl_stack_IPop(ESL_STACK *ns, int *ret_x)
+{
+ int status;
+#ifdef HAVE_PTHREAD
+ if (ns->do_mutex && pthread_mutex_lock(ns->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_lock() failure");
+ if (ns->do_cond && ! ns->n && pthread_cond_wait(ns->cond, ns->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_cond_wait() failure");
+#endif
+
+ if (ns->n == 0)
+ {
+ *ret_x = 0;
+ status = eslEOD;
+ }
+ else
+ {
+ ns->n--;
+ *ret_x = ns->idata[ns->n];
+ status = eslOK;
+ }
+
+#ifdef HAVE_PTHREAD
+ if (ns->do_mutex && pthread_mutex_unlock(ns->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return status;
+}
+
+/* Function: esl_stack_CPop()
+ * Synopsis: Pop a char off a stack.
+ * Incept: SRE, Sun Dec 26 09:21:27 2004 [Zaragoza]
+ *
+ * Purpose: Pops a character off the character stack <cs>, and returns
+ * it through <ret_c>.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEOD> if stack is empty.
+ *
+ * Throws: <eslESYS> if a pthread mutex lock/unlock or conditional wait fails.
+ */
+int
+esl_stack_CPop(ESL_STACK *cs, char *ret_c)
+{
+ int status;
+#ifdef HAVE_PTHREAD
+ if (cs->do_mutex && pthread_mutex_lock(cs->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_lock() failure");
+ if (cs->do_cond && ! cs->n && pthread_cond_wait(cs->cond, cs->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_cond_wait() failure");
+#endif
+
+ if (cs->n == 0)
+ {
+ *ret_c = 0;
+ status = eslEOD;
+ }
+ else
+ {
+ cs->n--;
+ *ret_c = cs->cdata[cs->n];
+ status = eslOK;
+ }
+
+#ifdef HAVE_PTHREAD
+ if (cs->do_mutex && pthread_mutex_unlock(cs->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return status;
+}
+
+/* Function: esl_stack_PPop()
+ * Synopsis: Pop a pointer off a stack.
+ * Incept: SRE, Sun Dec 26 09:21:56 2004 [Zaragoza]
+ *
+ * Purpose: Pops a pointer off the pointer stack <ps>, and returns
+ * it through <ret_p>.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEOD> if stack is empty.
+ *
+ * Throws: <eslESYS> if a pthread mutex lock/unlock or conditional wait fails.
+ */
+int
+esl_stack_PPop(ESL_STACK *ps, void **ret_p)
+{
+ int status;
+#ifdef HAVE_PTHREAD
+ if (ps->do_mutex && pthread_mutex_lock(ps->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_lock() failure");
+ if (ps->do_cond && ! ps->n && pthread_cond_wait(ps->cond, ps->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_cond_wait() failure");
+#endif
+
+ if (ps->n == 0)
+ {
+ *ret_p = NULL;
+ status = eslEOD;
+ }
+ else
+ {
+ ps->n--;
+ *ret_p = ps->pdata[ps->n];
+ status = eslOK;
+ }
+
+#ifdef HAVE_PTHREAD
+ if (ps->do_mutex && pthread_mutex_unlock(ps->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return status;
+}
+
+/* Function: esl_stack_ObjectCount()
+ * Synopsis: Return the number of objects in a stack.
+ * Incept: SRE, Sun Dec 26 09:22:41 2004 [Zaragoza]
+ *
+ * Purpose: Returns the number of data objects stored in the
+ * stack <s>. The stack may be of any datatype.
+ */
+int
+esl_stack_ObjectCount(ESL_STACK *s)
+{
+ return s->n;
+}
+
+/* Function: esl_stack_Convert2String()
+ * Synopsis: Convert a char stack to a string.
+ * Incept: SRE, Sun Dec 26 09:23:36 2004 [Zaragoza]
+ *
+ * Purpose: Converts a character stack <cs> to a NUL-terminated
+ * string, and returns a pointer to the string. The
+ * characters in the string are in the same order they
+ * were pushed onto the stack. The stack is destroyed by
+ * this operation, as if <esl_stack_Destroy()> had been
+ * called on it. The caller becomes responsible for
+ * free'ing the returned string.
+ *
+ * Because the stack is destroyed by this call, use care in
+ * a multithreaded context. You don't want to have another
+ * thread waiting to do something to this stack as another
+ * thread is destroying it. Treat this call like
+ * you'd treat <esl_stack_Destroy()>. Its internals are
+ * not mutex-protected (unlike push/pop functions).
+ *
+ * Returns: Pointer to the string; caller must <free()> this.
+ *
+ * Throws: NULL if a reallocation fails.
+ */
+char *
+esl_stack_Convert2String(ESL_STACK *cs)
+{
+ char *s = NULL;
+ void *tmp = NULL;
+ int status;
+
+ /* Take stack away; it's already a string, just not nul-terminated */
+ s = cs->cdata;
+ cs->cdata = NULL; /* esl_stack_Destroy() will now ignore the NULL cdata field */
+
+ /* NUL-terminate; which might require a +1 realloc if we're unlucky */
+ if (cs->n == cs->nalloc)
+ ESL_RALLOC(s, tmp, sizeof(char) * (cs->nalloc +1));
+ s[cs->n] = '\0';
+
+ /* Destroy the stack; return the string. */
+ esl_stack_Destroy(cs);
+ return s;
+
+ ERROR:
+ esl_stack_Destroy(cs);
+ return NULL;
+}
+
+/* Function: esl_stack_DiscardTopN()
+ * Synopsis: Discard the top elements on a stack.
+ * Incept: SRE, Tue Dec 28 04:33:06 2004 [St. Louis]
+ *
+ * Purpose: Throw away the top <n> elements on stack <s>.
+ * Equivalent to <n> calls to a <Pop()> function.
+ * If <n> equals or exceeds the number of elements
+ * currently in the stack, the stack is emptied
+ * as if <esl_stack_Reuse()> had been called.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> if mutex lock/unlock fails, if pthreaded.
+ */
+int
+esl_stack_DiscardTopN(ESL_STACK *s, int n)
+{
+#ifdef HAVE_PTHREAD
+ if (s->do_mutex && pthread_mutex_lock(s->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_lock() failure");
+#endif
+
+ if (n <= s->n) s->n -= n;
+ else s->n = 0;
+
+#ifdef HAVE_PTHREAD
+ if (s->do_mutex && pthread_mutex_unlock(s->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return eslOK;
+}
+
+/* Function: esl_stack_DiscardSelected()
+ * Synopsis: Remove arbitrary elements from a stack.
+ * Incept: SRE, Tue Jan 18 09:57:47 2011 [Janelia]
+ *
+ * Purpose: For each element in the stack, call \verb+(*discard_func)(&element, param)+.
+ * If <TRUE>, discard the element.
+ *
+ * Passing a pointer to an arbitrary <(*discard_func)>
+ * allows arbitrary rules. The <(*discard_func)> gets two
+ * arguments: a pointer (which is either a pointer to an
+ * element for int and char stacks, or an actual pointer
+ * element from a pointer stack), and <param>, a <void *>
+ * to whatever arguments the caller needs the selection
+ * function to have.
+ *
+ * When discarding elements from a pointer stack, the
+ * <*discard_func()> will generally assume responsibility
+ * for the memory allocated to those elements. It may want
+ * to free() or Destroy() them, for example, if they're
+ * truly being discarded.
+ *
+ * Args: s - stack to discard from
+ * discard_func - ptr to function that returns TRUE if elem is to be discarded
+ * param - ptr to any parameters that (*discard_func)() needs.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> if a pthread mutex lock/unlock fails.
+ */
+int
+esl_stack_DiscardSelected(ESL_STACK *s, int (*discard_func)(void *, void *), void *param)
+{
+ int opos;
+ int npos = 0;
+
+#ifdef HAVE_PTHREAD
+ if (s->do_mutex && pthread_mutex_lock(s->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_lock() failure");
+#endif
+
+ if (s->idata)
+ {
+ for (opos = 0, npos = 0 ; opos < s->n; opos++)
+ if (! (*discard_func)(s->idata+opos, param))
+ s->idata[npos++] = s->idata[opos];
+ }
+ else if (s->pdata)
+ {
+ for (opos = 0, npos = 0 ; opos < s->n; opos++)
+ if (! (*discard_func)(s->pdata[opos], param))
+ s->pdata[npos++] = s->pdata[opos];
+ }
+ else if (s->cdata)
+ {
+ for (opos = 0, npos = 0 ; opos < s->n; opos++)
+ if (! (*discard_func)(s->cdata+opos, param))
+ s->cdata[npos++] = s->cdata[opos];
+ }
+ s->n = npos;
+
+#ifdef HAVE_PTHREAD
+ if (s->do_mutex && pthread_mutex_unlock(s->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return eslOK;
+}
+/*------------- end, main API, pushing/popping ------------------*/
+
+
+
+/*****************************************************************
+ *# 3. Shuffling stacks [with <eslAUGMENT_RANDOM>]
+ *****************************************************************/
+#ifdef eslAUGMENT_RANDOM
+
+/* Function: esl_stack_Shuffle()
+ * Synopsis: Randomly shuffle the elements in a stack.
+ * Incept: SRE, Mon Mar 31 11:01:06 2008 [Janelia]
+ *
+ * Purpose: Randomly shuffle the elements in stack <s>, using
+ * random numbers from generator <r>.
+ *
+ * Returns: <eslOK> on success, and the stack is randomly
+ * shuffled.
+ */
+int
+esl_stack_Shuffle(ESL_RANDOMNESS *r, ESL_STACK *s)
+{
+ int n = s->n;
+ int w;
+
+#ifdef HAVE_PTHREAD
+ if (s->do_mutex && pthread_mutex_lock(s->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_lock() failure");
+#endif
+
+ while (n > 1) {
+ w = esl_rnd_Roll(r, n); /* shuffling algorithm: swap last elem with w, decrement n. */
+ if (s->idata != NULL) ESL_SWAP(s->idata[w], s->idata[n-1], int);
+ else if (s->cdata != NULL) ESL_SWAP(s->cdata[w], s->cdata[n-1], char);
+ else if (s->pdata != NULL) ESL_SWAP(s->pdata[w], s->pdata[n-1], void *);
+ n--;
+ }
+
+#ifdef HAVE_PTHREAD
+ if (s->do_mutex && pthread_mutex_unlock(s->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+#endif
+ return eslOK;
+}
+#endif /*eslAUGMENT_RANDOM*/
+
+
+/*****************************************************************
+ *# 4. Using stacks for thread communication.
+ *****************************************************************/
+
+#if defined HAVE_PTHREAD
+/* Function: esl_stack_UseMutex()
+ * Synopsis: Protect this stack in a threaded program.
+ * Incept: SRE, Mon Jan 17 14:18:43 2011 [Janelia]
+ *
+ * Purpose: Declare that this stack is going to be operated on by more
+ * than one thread in a multithreaded program, and that all
+ * operations that change its internal state (such as
+ * pushing and popping) need to be protected by a mutex.
+ *
+ * Args: s - the stack to protect
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslESYS> if <pthread_mutex_init()> fails.
+ */
+int
+esl_stack_UseMutex(ESL_STACK *s)
+{
+ int pstatus;
+ int status;
+
+ ESL_ALLOC(s->mutex, sizeof(pthread_mutex_t));
+ if ((pstatus = pthread_mutex_init(s->mutex, NULL)) != 0) ESL_XEXCEPTION(eslESYS, "pthread_mutex_init failed with code %d\n", pstatus);
+ s->do_mutex = TRUE;
+ return eslOK;
+
+ ERROR:
+ if (s->mutex) free(s->mutex);
+ s->mutex = NULL;
+ s->do_mutex = FALSE;
+ return status;
+}
+
+/* Function: esl_stack_UseCond()
+ * Synopsis: Declare that this stack is used for interthread communication.
+ * Incept: SRE, Mon Jan 17 14:22:06 2011 [Janelia]
+ *
+ * Purpose: Declare that this stack is to be used for communication
+ * between threads. If a thread tries to pop from the stack
+ * and the stack is empty, the Pop will do a <pthread_cond_wait()>
+ * to wait until another thread has done a <Push()>. If a thread
+ * pushes onto the stack, it will do a <pthread_cond_signal()>
+ * to wake up a waiting <Pop()>'er.
+ *
+ * The stack must also have an active mutex. The caller
+ * must call <esl_stack_UseMutex()> before calling
+ * <esl_stack_UseCond().>
+ *
+ * Args: s - the stack to use for push/pop interthread communication
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEINVAL> if this stack lacks an active mutex.
+ * <eslESYS> if <pthread_cond_init()> fails.
+ */
+int
+esl_stack_UseCond(ESL_STACK *s)
+{
+ int pstatus;
+ int status;
+
+ if (! s->do_mutex || ! s->mutex) ESL_EXCEPTION(eslEINVAL, "stack has no active mutex; can't call esl_stack_UseCond() on it");
+
+ ESL_ALLOC(s->cond, sizeof(pthread_cond_t));
+ if ((pstatus = pthread_cond_init(s->cond, NULL)) != 0) ESL_XEXCEPTION(eslESYS, "pthread_cond_init failed with code %d\n", pstatus);
+ s->do_cond = TRUE;
+ return eslOK;
+
+ ERROR:
+ if (s->cond) free(s->cond);
+ s->cond = NULL;
+ s->do_cond = FALSE;
+ return status;
+}
+
+/* Function: esl_stack_ReleaseCond()
+ * Synopsis: Declare that anyone waiting on this stack may complete.
+ * Incept: SRE, Tue Jan 18 15:57:32 2011 [Janelia]
+ *
+ * Purpose: Release the conditional wait state on stack <s>. In our
+ * idiom for using a stack to coordinate between one or
+ * more client thread adding jobs to a stack, and one or
+ * more worker threads popping them off, we call
+ * <esl_stack_ReleaseCond()> when we know the client(s) are
+ * done. Then the worker(s) seeing an empty job stack may
+ * complete (Pop functions will return eslEOD), rather than
+ * doing a conditional wait waiting for more work to appear
+ * on the stack.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> on pthread call failures.
+ */
+int
+esl_stack_ReleaseCond(ESL_STACK *s)
+{
+ if (! s->do_mutex) ESL_EXCEPTION(eslESYS, "no mutex; esl_stack_ReleaseCond() call invalid");
+ if (! s->do_cond) ESL_EXCEPTION(eslESYS, "no conditional wait state is set");
+
+ if (pthread_mutex_lock(s->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_lock() failure");
+ if (pthread_cond_broadcast(s->cond) != 0) ESL_EXCEPTION(eslESYS, "pthread_cond_broadcast() failure");
+
+ /* You can't free s->cond yet; you can only set the flag.
+ * Reason: you may have workers that are ALREADY in a wait state, in pthread_cond_wait(),
+ * and that function depends on s->cond.
+ */
+ s->do_cond = FALSE;
+
+ if (pthread_mutex_unlock(s->mutex) != 0) ESL_EXCEPTION(eslESYS, "pthread_mutex_unlock() failure");
+ return eslOK;
+}
+#endif /*HAVE_PTHREAD*/
+/*-------- end, using stacks for thread communication -----------*/
+
+
+
+/*****************************************************************
+ * 5. Unit tests
+ *****************************************************************/
+#ifdef eslSTACK_TESTDRIVE
+
+#include "esl_random.h"
+
+static void
+utest_integer(void)
+{
+ char *msg = "integer stack basic unit test failed";
+ ESL_STACK *s = NULL;
+ int n1 = ESL_STACK_INITALLOC*2+1; /* force two reallocations */
+ int n2 = 0;
+ int i;
+ int val;
+
+ if ((s = esl_stack_ICreate()) == NULL) esl_fatal(msg);
+ for (i = 0; i < n1; i++) if (esl_stack_IPush(s, i) != eslOK) esl_fatal(msg);
+ while (esl_stack_IPop(s, &val) != eslEOD) n2++;
+ if (n1 != n2) esl_fatal(msg);
+ esl_stack_Reuse(s);
+
+ /* same again, with ObjectCount instead of EOD for popping */
+ for (i = 0; i < n1; i++) if (esl_stack_IPush(s, i) != eslOK) esl_fatal(msg);
+ n2 = 0;
+ while (esl_stack_ObjectCount(s)) {
+ if (esl_stack_IPop(s, &val) != eslOK) esl_fatal(msg);
+ n2++;
+ }
+ if (n1 != n2) esl_fatal(msg);
+ esl_stack_Destroy(s);
+}
+
+static void
+utest_char(void)
+{
+ char *msg = "char stack basic unit test failed";
+ ESL_STACK *s = NULL;
+ int n1 = ESL_STACK_INITALLOC*2+1; /* force two reallocations */
+ int n2 = 0;
+ int i;
+ char c;
+
+ if ((s = esl_stack_CCreate()) == NULL) esl_fatal(msg);
+ for (i = 0; i < n1; i++) if (esl_stack_CPush(s, 'X') != eslOK) esl_fatal(msg);
+ while (esl_stack_CPop(s, &c) != eslEOD) {
+ if (c != 'X') esl_fatal(msg);
+ n2++;
+ }
+ if (n1 != n2) esl_fatal(msg);
+ esl_stack_Reuse(s);
+
+ /* same again, with ObjectCount instead of EOD for popping */
+ for (i = 0; i < n1; i++) if (esl_stack_CPush(s, 'X') != eslOK) esl_fatal(msg);
+ n2 = 0;
+ while (esl_stack_ObjectCount(s)) {
+ if (esl_stack_CPop(s, &c) != eslOK) esl_fatal(msg);
+ n2++;
+ }
+ if (n1 != n2) esl_fatal(msg);
+ esl_stack_Destroy(s);
+}
+
+static void
+utest_pointer(void)
+{
+ char *msg = "pointer stack basic unit test failed";
+ ESL_STACK *s = NULL;
+ int n1 = ESL_STACK_INITALLOC*2+1; /* force two reallocations */
+ int n2 = 0;
+ int i;
+ void *p;
+
+ if ((s = esl_stack_PCreate()) == NULL) esl_fatal(msg);
+ for (i = 0; i < n1; i++) {
+ p = malloc(sizeof(int) * 64);
+ if (esl_stack_PPush(s, p) != eslOK) esl_fatal(msg);
+ }
+ while (esl_stack_PPop(s, &p) != eslEOD) { free(p); n2++; }
+ if (n1 != n2) esl_fatal(msg);
+ esl_stack_Reuse(s);
+
+ /* same again, with ObjectCount instead of EOD for popping */
+ for (i = 0; i < n1; i++) {
+ p = malloc(sizeof(int) * 64);
+ if (esl_stack_PPush(s, p) != eslOK) esl_fatal(msg);
+ }
+ n2 = 0;
+ while (esl_stack_ObjectCount(s)) {
+ if (esl_stack_PPop(s, &p) != eslOK) esl_fatal(msg);
+ free(p);
+ n2++;
+ }
+ if (n1 != n2) esl_fatal(msg);
+ esl_stack_Destroy(s);
+}
+
+static void
+utest_convert2string(void)
+{
+ char *msg = "stack::convert2string unit test failed";
+ char *str = "ABCDEF";
+ ESL_STACK *s = NULL;
+ int n = strlen(str);
+ int i;
+ char *result = NULL;
+
+ if ((s = esl_stack_CCreate()) == NULL) esl_fatal(msg);
+ for (i = 0; i < n; i++) if (esl_stack_CPush(s, str[i]) != eslOK) esl_fatal(msg);
+ result = esl_stack_Convert2String(s);
+ if (strcmp(result, str) != 0) esl_fatal(msg);
+ free(result); /* after Convert2String, only the string itself remains to be free'd */
+}
+
+static void
+utest_shuffle(ESL_RANDOMNESS *r)
+{
+ char *msg = "stack shuffle unit test failed";
+ ESL_STACK *s = esl_stack_ICreate();
+ int n = ESL_STACK_INITALLOC*2+1; /* exercises reallocation */
+ int *seen = malloc(sizeof(int) * n);
+ int i;
+ int val;
+
+ for (i = 0; i < n; i++) esl_stack_IPush(s, i);
+ esl_stack_Shuffle(r, s);
+
+ for (i = 0; i < n; i++) seen[i] = 0;
+ i = n-1;
+ while (esl_stack_IPop(s, &val) != eslEOD) {
+ seen[val]++;
+ }
+ for (i = 0; i < n; i++) if (seen[i] != 1) esl_fatal(msg);
+
+ free(seen);
+ esl_stack_Destroy(s);
+}
+
+/* discard all elems in the stack > thresh */
+static int
+discard_function(void *elemp, void *paramp)
+{
+ int elem = * (int *) elemp;
+ int thresh = * (int *) paramp;
+ return (elem > thresh) ? TRUE : FALSE;
+}
+
+static void
+utest_discard_selected(ESL_RANDOMNESS *r)
+{
+ char *msg = "stack: DiscardSelected() unit test failed";
+ ESL_STACK *ns = esl_stack_ICreate();
+ int n = 1000;
+ int thresh = 42;
+ int npass = 0;
+ int val;
+ int i;
+
+ for (i = 0; i < n; i++)
+ {
+ val = esl_rnd_Roll(r, 100) + 1;
+ if (val <= thresh) npass++;
+ esl_stack_IPush(ns, val);
+ }
+
+ if (esl_stack_DiscardSelected(ns, discard_function, &thresh) != eslOK) esl_fatal(msg);
+
+ if (esl_stack_ObjectCount(ns) != npass) esl_fatal(msg);
+ while (esl_stack_IPop(ns, &val) == eslOK)
+ {
+ if (val > thresh) esl_fatal(msg);
+ npass--;
+ }
+ if (npass != 0) esl_fatal(msg);
+ esl_stack_Destroy(ns);
+}
+
+
+#ifdef HAVE_PTHREAD
+/* Unit test for using a stack as part of an idiom
+ * for a command stack, with one or more threads
+ * adding jobs to the stack, and one or more other threads
+ * pulling jobs off. This idiom is used in the HMMER
+ * hmmpgmd daemon. In this framework, <tt->input>
+ * is a list of jobs to do; <tt->working> is a stack
+ * of jobs waiting to be done; <tt->output> is a
+ * list of jobs done.
+ * pusher_thread() simulates a client, taking
+ * jobs from <tt->input> and adding them to
+ * the <tt->working> stack.
+ * popper_thread() simulates a worker, taking
+ * jobs from <tt->working> and putting them
+ * on the <tt->output> list.
+ *
+ * <tt->working>, therefore, is the read/write stack;
+ * <tt->input> is read-only (it only gets written in
+ * nonthreaded code in main())
+ * <tt->output> is write-only (only gets read in
+ * nonthreaded code in main()).
+ */
+struct threadtest_s {
+ ESL_STACK *input; /* faux "work unit" queue that the pusher_thread() processes*/
+ ESL_STACK *working; /* interthread communication: pusher puts work on this stack, popper pulls it off */
+ ESL_STACK *output; /* popper_thread() puts "finished" units on this stack */
+};
+
+static void *
+pusher_thread(void *arg)
+{
+ ESL_RANDOMNESS *r = esl_randomness_CreateFast(0);
+ struct threadtest_s *tt = (struct threadtest_s *) arg;
+ int value;
+
+ while ( esl_stack_IPop(tt->input, &value) == eslOK)
+ {
+ usleep(esl_rnd_Roll(r, 100)+1); /* 1..100 usec delay */
+ esl_stack_IPush(tt->working, value);
+ }
+ esl_randomness_Destroy(r);
+ pthread_exit(NULL);
+}
+
+static void *
+popper_thread(void *arg)
+{
+ ESL_RANDOMNESS *r = esl_randomness_CreateFast(0);
+ struct threadtest_s *tt = (struct threadtest_s *) arg;
+ int value;
+
+ while (esl_stack_IPop(tt->working, &value) == eslOK)
+ {
+ usleep(esl_rnd_Roll(r, 100)+1); /* 1..100 usec delay */
+ esl_stack_IPush(tt->output, value);
+ }
+ esl_randomness_Destroy(r);
+ pthread_exit(NULL);
+}
+
+static void
+utest_interthread_comm(void)
+{
+ char *msg = "stack::interthread_comm unit test failed";
+ struct threadtest_s *tt = NULL;
+ int njobs = 1000;
+ int *ndone = NULL;
+ pthread_t tid[4];
+ int i;
+ int value;
+
+ ndone = malloc(sizeof(int) * njobs);
+ for (i = 0; i < njobs; i++) ndone[i] = 0;
+
+ tt = malloc(sizeof(struct threadtest_s));
+ tt->input = esl_stack_ICreate();
+ tt->working = esl_stack_ICreate();
+ tt->output = esl_stack_ICreate();
+
+ esl_stack_UseMutex(tt->input);
+ esl_stack_UseMutex(tt->working);
+ esl_stack_UseMutex(tt->output);
+ esl_stack_UseCond(tt->working);
+
+ for (i = 0; i < njobs; i++)
+ esl_stack_IPush(tt->input, i);
+
+ pthread_create(&(tid[0]), NULL, pusher_thread, tt);
+ pthread_create(&(tid[1]), NULL, pusher_thread, tt);
+ pthread_create(&(tid[2]), NULL, popper_thread, tt);
+ pthread_create(&(tid[3]), NULL, popper_thread, tt);
+
+ pthread_join(tid[0], NULL);
+ pthread_join(tid[1], NULL);
+
+ esl_stack_ReleaseCond(tt->working);
+ pthread_join(tid[2], NULL);
+ pthread_join(tid[3], NULL);
+
+ while (esl_stack_IPop(tt->output, &value) == eslOK)
+ {
+ if (value < 0 || value >= njobs) esl_fatal(msg);
+ ndone[value]++;
+ }
+ for (i = 0; i < njobs; i++)
+ if (ndone[i] != 1) esl_fatal(msg);
+
+ free(ndone);
+ esl_stack_Destroy(tt->output);
+ esl_stack_Destroy(tt->working);
+ esl_stack_Destroy(tt->input);
+ free(tt);
+ return;
+}
+#endif /* HAVE_PTHREAD -- pthread-specific utests */
+#endif /*eslSTACK_TESTDRIVE*/
+/*---------------- end of unit tests ----------------------------*/
+
+
+
+
+/*****************************************************************
+ * 6. Test driver.
+ *****************************************************************/
+#ifdef eslSTACK_TESTDRIVE
+/*
+ * Test driver and API example for the pushdown stack module.
+ * To compile:
+ * gcc -g -Wall -I. -L. -DeslSTACK_TESTDRIVE -o testdrive esl_stack.c -leasel -lm
+ * To run:
+ * ./testdrive
+ * Returns 0 (success), or returns nonzero and says why.
+ */
+/* why Pop() into a void *obj_p, instead of directly into int *obj, in
+ * the test of the pointer stack? On PowerPC/Linux, using gcc -O3,
+ * trying to Pop() into *obj causes a "dereferencing type-punned
+ * pointer will break strict-aliasing rules" warning, and the test
+ * driver crashes with a double free/corruption error in glibc. Lower
+ * optimization levels don't cause the problem; adding
+ * -fno-strict-aliasing to the CFLAGS also avoids the problem. I'm
+ * suspicious that it's a gcc optimizer bug. Pop()'ing into a void *
+ * avoids the issue altogether. (SRE, Feb 22 2008 J2/119)
+ */
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_stack.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-s", eslARG_INT, "0", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "unit test driver for esl_stack module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *rng = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+
+ fprintf(stderr, "## %s\n", argv[0]);
+ fprintf(stderr, "# rng seed = %" PRIu32 "\n", esl_randomness_GetSeed(rng));
+
+ utest_integer();
+ utest_char();
+ utest_pointer();
+ utest_convert2string();
+ utest_shuffle(rng);
+ utest_discard_selected(rng);
+
+#ifdef HAVE_PTHREAD
+ utest_interthread_comm();
+#endif
+
+ esl_randomness_Destroy(rng);
+ esl_getopts_Destroy(go);
+
+
+ fprintf(stderr, "# status = ok\n");
+ return eslOK;
+}
+#endif /*eslSTACK_TESTDRIVE*/
+/*-------------------- end of test driver -----------------------*/
+
+
+
+
+/*****************************************************************
+ * 7. Example.
+ *****************************************************************/
+#ifdef eslSTACK_EXAMPLE
+/*::cexcerpt::stack_example::begin::*/
+/* compile: gcc -g -Wall -I. -o example -DeslSTACK_EXAMPLE esl_stack.c easel.c -lm
+ * run: ./example
+ */
+#include "easel.h"
+#include "esl_stack.h"
+
+int
+main(void)
+{
+ ESL_STACK *ns;
+ int x;
+
+ ns = esl_stack_ICreate();
+ esl_stack_IPush(ns, 42);
+ esl_stack_IPush(ns, 7);
+ esl_stack_IPush(ns, 3);
+ while (esl_stack_IPop(ns, &x) != eslEOD)
+ printf("%d\n", x);
+ esl_stack_Destroy(ns);
+ return 0;
+}
+/*::cexcerpt::stack_example::end::*/
+#endif /*eslSTACK_EXAMPLE*/
+/*------------------------ end of example -----------------------*/
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_stack.h b/esl_stack.h
new file mode 100644
index 0000000..5e3c32d
--- /dev/null
+++ b/esl_stack.h
@@ -0,0 +1,74 @@
+/* Pushdown stacks for integers, pointers, and characters.
+ *
+ * nstack - SRE 1 March 2000. [Seattle]
+ * mstack - SRE, Fri Oct 10 10:18:16 2003 [St. Louis]
+ * cstack - SRE, Mon Oct 13 12:57:56 2003 [St. Louis]
+ * Incorp into easel - SRE, Sun Dec 26 07:39:02 2004 [Zaragoza]
+ *
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslSTACK_INCLUDED
+#define eslSTACK_INCLUDED
+#include "esl_config.h"
+
+#define ESL_STACK_INITALLOC 128 /* initial allocation; realloc by doubling */
+
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+#endif
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif /*eslAUGMENT_RANDOM*/
+
+
+typedef struct esl_stack_s {
+ int *idata; /* integer data stack */
+ void **pdata; /* pointer data stack */
+ char *cdata; /* character data stack */
+
+ int n; /* current (topmost) elem in data */
+ int nalloc; /* # of elems allocated right now */
+
+#ifdef HAVE_PTHREAD
+ int do_mutex; /* TRUE if we need to mutex-protect this stack */
+ int do_cond; /* TRUE if pushers want to notify poppers */
+ pthread_mutex_t *mutex; /* protect while operating on stacks */
+ pthread_cond_t *cond; /* for pushers to notify poppers */
+#endif
+} ESL_STACK;
+
+extern ESL_STACK *esl_stack_ICreate(void);
+extern ESL_STACK *esl_stack_CCreate(void);
+extern ESL_STACK *esl_stack_PCreate(void);
+
+extern int esl_stack_Reuse(ESL_STACK *s);
+extern void esl_stack_Destroy(ESL_STACK *s);
+
+extern int esl_stack_IPush(ESL_STACK *ns, int x);
+extern int esl_stack_CPush(ESL_STACK *cs, char c);
+extern int esl_stack_PPush(ESL_STACK *ps, void *p);
+
+extern int esl_stack_IPop(ESL_STACK *ns, int *ret_x);
+extern int esl_stack_CPop(ESL_STACK *cs, char *ret_c);
+extern int esl_stack_PPop(ESL_STACK *ps, void **ret_p);
+
+extern int esl_stack_ObjectCount(ESL_STACK *s);
+
+extern char *esl_stack_Convert2String(ESL_STACK *cs);
+extern int esl_stack_DiscardTopN(ESL_STACK *s, int n);
+extern int esl_stack_DiscardSelected(ESL_STACK *s, int (*discard_func)(void *, void *), void *param);
+
+#ifdef eslAUGMENT_RANDOM
+extern int esl_stack_Shuffle(ESL_RANDOMNESS *r, ESL_STACK *s);
+#endif /*eslAUGMENT_RANDOM*/
+
+#ifdef HAVE_PTHREAD
+extern int esl_stack_UseMutex (ESL_STACK *s);
+extern int esl_stack_UseCond (ESL_STACK *s);
+extern int esl_stack_ReleaseCond(ESL_STACK *s);
+#endif
+#endif /*eslSTACK_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_stack.tex b/esl_stack.tex
new file mode 100644
index 0000000..5664950
--- /dev/null
+++ b/esl_stack.tex
@@ -0,0 +1,89 @@
+The stack module implements pushdown stacks for storing integers,
+characters, or arbitrary pointers (objects).
+
+The module uses a convention of prepending \ccode{I}, \ccode{C},
+\ccode{P} to \ccode{Create()}, \ccode{Push()}, and \ccode{Pop()}
+function names, to indicate the stack's datatype as integer,
+character, or pointer, respectively. For example,
+\ccode{esl\_stack\_PCreate()} creates a stack for pointer
+storage. (This is also the naming convention in the \ccode{vectorops}
+module.) Stacks can be thought of as typed objects, with the type
+defined by the \ccode{Create()} call. Types may not be mixed for any
+particular created stack.
+
+
+% Table generated by autodoc -t esl_stack.c (so don't edit here, edit esl_stack.c:)
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\apisubhead{The \ccode{ESL\_STACK} object.}\\
+\hyperlink{func:esl_stack_ICreate()}{\ccode{esl\_stack\_ICreate()}} & Create an integer stack.\\
+\hyperlink{func:esl_stack_CCreate()}{\ccode{esl\_stack\_CCreate()}} & Create a character stack.\\
+\hyperlink{func:esl_stack_PCreate()}{\ccode{esl\_stack\_PCreate()}} & Create a pointer stack.\\
+\hyperlink{func:esl_stack_Reuse()}{\ccode{esl\_stack\_Reuse()}} & Reuse a stack.\\
+\hyperlink{func:esl_stack_Destroy()}{\ccode{esl\_stack\_Destroy()}} & Free a stack.\\
+\apisubhead{Other functions in the API.}\\
+\hyperlink{func:esl_stack_IPush()}{\ccode{esl\_stack\_IPush()}} & Push an integer onto a stack.\\
+\hyperlink{func:esl_stack_CPush()}{\ccode{esl\_stack\_CPush()}} & Push a char onto a stack.\\
+\hyperlink{func:esl_stack_PPush()}{\ccode{esl\_stack\_PPush()}} & Push a pointer onto a stack.\\
+\hyperlink{func:esl_stack_IPop()}{\ccode{esl\_stack\_IPop()}} & Pop an integer off a stack.\\
+\hyperlink{func:esl_stack_CPop()}{\ccode{esl\_stack\_CPop()}} & Pop a char off a stack.\\
+\hyperlink{func:esl_stack_PPop()}{\ccode{esl\_stack\_PPop()}} & Pop a pointer off a stack.\\
+\hyperlink{func:esl_stack_ObjectCount()}{\ccode{esl\_stack\_ObjectCount()}} & Return the number of objects in a stack.\\
+\hyperlink{func:esl_stack_Convert2String()}{\ccode{esl\_stack\_Convert2String()}} & Convert a char stack to a string.\\
+\hyperlink{func:esl_stack_DiscardTopN()}{\ccode{esl\_stack\_DiscardTopN()}} & Discard the top elements on a stack.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{stack} API.}
+\label{tbl:stack_api}
+\end{table}
+
+\subsection{Example of using the stack API}
+
+Figure~\ref{fig:stack_example} shows an example of using the integer
+stack, pushing 42, 7, and 3 on, then popping them off.
+
+\begin{figure}
+\input{cexcerpts/stack_example}
+\caption{An example of pushing and popping data onto a stack.}
+\label{fig:stack_example}
+\end{figure}
+
+The \ccode{Create()} functions create a stack for a particular
+purpose. \ccode{esl\_stack\_ICreate()} creates a stack for integers,
+\ccode{esl\_stack\_CCreate()} creates a stack for characters, and
+\ccode{esl\_stack\_PCreate()} creates a stack for pointers. They
+throw NULL if an allocation fails. All three stack types are free'd
+by a call to \ccode{esl\_stack\_Destroy()}. All three types can also
+be reused without reallocation or recreation by
+\ccode{esl\_stack\_Reuse()}. A \ccode{Reuse()}'d stack retains its
+original datatype.
+
+The \ccode{Push()} functions push one datum onto the stack, of the
+appropriate type. They throw \ccode{eslEMEM} if the stack needs to
+reallocate internally but fails.
+
+The \ccode{Pop()} functions pop one datum off the stack, returning it
+through a passed pointer. They return \ccode{eslOK} on success, and
+\ccode{eslEOD} if the stack is empty.
+
+\ccode{esl\_stack\_ObjectCount()} returns the number of objects stored
+in the stack.
+
+A special function, \ccode{esl\_stack\_Convert2String()}, operates
+only on character stacks. It converts the stack structure to a
+NUL-terminated string, with characters in the same order they were
+pushed. The stack is destroyed by this operation, leaving a
+\ccode{char *} behind.
+
+\subsection{Allocation strategy}
+
+Stacks are initially allocated for a certain number of objects,
+defined by a compile-time constant \ccode{ESL\_STACK\_INITALLOC} in
+\ccode{esl\_stack.h}. The default is 128. Whenever a stack needs to grow,
+it reallocates by doubling its current allocation.
+
+
diff --git a/esl_stats.c b/esl_stats.c
new file mode 100644
index 0000000..6ac41ad
--- /dev/null
+++ b/esl_stats.c
@@ -0,0 +1,1171 @@
+/* Foundation and miscellenea for the statistics modules.
+ *
+ * Contents:
+ * 1. Summary statistics (means, variances)
+ * 2. Special functions
+ * 3. Standard statistical tests
+ * 4. Data fitting.
+ * 5. Unit tests.
+ * 6. Test driver.
+ * 7. Examples.
+ * - driver for linear regression
+ * - driver for G-test
+ * 8. License and copyright information.
+ *
+ */
+#include "esl_config.h"
+
+#include <math.h>
+
+#include "easel.h"
+#include "esl_stats.h"
+
+
+/*****************************************************************
+ * 1. Summary statistics calculations (means, variances)
+ *****************************************************************/
+
+/* Function: esl_stats_DMean()
+ * Synopsis: Calculates mean and $\sigma^2$ for samples $x_i$.
+ *
+ * Purpose: Calculates the sample mean and $s^2$, the unbiased
+ * estimator of the population variance, for a
+ * sample of <n> numbers <x[0]..x[n-1]>, and optionally
+ * returns either or both through <ret_mean> and
+ * <ret_var>.
+ *
+ * <esl_stats_FMean()> and <esl_stats_IMean()> do the same,
+ * for float and integer vectors.
+ *
+ * Args: x - samples x[0]..x[n-1]
+ * n - number of samples
+ * opt_mean - optRETURN: mean
+ * opt_var - optRETURN: estimate of population variance
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_stats_DMean(const double *x, int n, double *opt_mean, double *opt_var)
+{
+ double sum = 0.;
+ double sqsum = 0.;
+ int i;
+
+ for (i = 0; i < n; i++)
+ {
+ sum += x[i];
+ sqsum += x[i]*x[i];
+ }
+ if (opt_mean != NULL) *opt_mean = sum / (double) n;
+ if (opt_var != NULL) *opt_var = (sqsum - sum*sum/(double)n) / ((double)n-1);
+ return eslOK;
+}
+int
+esl_stats_FMean(const float *x, int n, double *opt_mean, double *opt_var)
+{
+ double sum = 0.;
+ double sqsum = 0.;
+ int i;
+
+ for (i = 0; i < n; i++)
+ {
+ sum += x[i];
+ sqsum += x[i]*x[i];
+ }
+ if (opt_mean != NULL) *opt_mean = sum / (double) n;
+ if (opt_var != NULL) *opt_var = (sqsum - sum*sum/(double)n) / ((double)n-1);
+ return eslOK;
+}
+int
+esl_stats_IMean(const int *x, int n, double *opt_mean, double *opt_var)
+{
+ double sum = 0.;
+ double sqsum = 0.;
+ int i;
+
+ for (i = 0; i < n; i++)
+ {
+ sum += x[i];
+ sqsum += x[i]*x[i];
+ }
+ if (opt_mean != NULL) *opt_mean = sum / (double) n;
+ if (opt_var != NULL) *opt_var = (sqsum - sum*sum/(double)n) / ((double)n-1);
+ return eslOK;
+}
+/*--------------- end, summary statistics -----------------------*/
+
+
+
+/*****************************************************************
+ * 2. Special functions.
+ *****************************************************************/
+
+/* Function: esl_stats_LogGamma()
+ * Synopsis: Calculates $\log \Gamma(x)$.
+ *
+ * Purpose: Returns natural log of $\Gamma(x)$, for $x > 0$.
+ *
+ * Credit: Adapted from a public domain implementation in the
+ * NCBI core math library. Thanks to John Spouge and
+ * the NCBI. (According to NCBI, that's Dr. John
+ * "Gammas Galore" Spouge to you, pal.)
+ *
+ * Args: x : argument, x > 0.0
+ * ret_answer : RETURN: the answer
+ *
+ * Returns: Put the answer in <ret_answer>; returns <eslOK>.
+ *
+ * Throws: <eslERANGE> if $x <= 0$.
+ */
+int
+esl_stats_LogGamma(double x, double *ret_answer)
+{
+ int i;
+ double xx, tx;
+ double tmp, value;
+ static double cof[11] = {
+ 4.694580336184385e+04,
+ -1.560605207784446e+05,
+ 2.065049568014106e+05,
+ -1.388934775095388e+05,
+ 5.031796415085709e+04,
+ -9.601592329182778e+03,
+ 8.785855930895250e+02,
+ -3.155153906098611e+01,
+ 2.908143421162229e-01,
+ -2.319827630494973e-04,
+ 1.251639670050933e-10
+ };
+
+ /* Protect against invalid x<=0 */
+ if (x <= 0.0) ESL_EXCEPTION(eslERANGE, "invalid x <= 0 in esl_stats_LogGamma()");
+
+ xx = x - 1.0;
+ tx = tmp = xx + 11.0;
+ value = 1.0;
+ for (i = 10; i >= 0; i--) /* sum least significant terms first */
+ {
+ value += cof[i] / tmp;
+ tmp -= 1.0;
+ }
+ value = log(value);
+ tx += 0.5;
+ value += 0.918938533 + (xx+0.5)*log(tx) - tx;
+ *ret_answer = value;
+ return eslOK;
+}
+
+
+/* Function: esl_stats_Psi()
+ * Synopsis: Calculates $\Psi(x)$ (the digamma function).
+ *
+ * Purpose: Computes $\Psi(x)$ (the "digamma" function), which is
+ * the derivative of log of the Gamma function:
+ * $d/dx \log \Gamma(x) = \frac{\Gamma'(x)}{\Gamma(x)} = \Psi(x)$.
+ * Argument $x$ is $> 0$.
+ *
+ * This is J.M. Bernardo's "Algorithm AS103",
+ * Appl. Stat. 25:315-317 (1976).
+ */
+int
+esl_stats_Psi(double x, double *ret_answer)
+{
+ double answer = 0.;
+ double x2;
+
+ if (x <= 0.0) ESL_EXCEPTION(eslERANGE, "invalid x <= 0 in esl_stats_Psi()");
+
+ /* For small x, Psi(x) ~= -0.5772 - 1/x + O(x), we're done.
+ */
+ if (x <= 1e-5) {
+ *ret_answer = -eslCONST_EULER - 1./x;
+ return eslOK;
+ }
+
+ /* For medium x, use Psi(1+x) = \Psi(x) + 1/x to c.o.v. x,
+ * big enough for Stirling approximation to work...
+ */
+ while (x < 8.5) {
+ answer = answer - 1./x;
+ x += 1.;
+ }
+
+ /* For large X, use Stirling approximation
+ */
+ x2 = 1./x;
+ answer += log(x) - 0.5 * x2;
+ x2 = x2*x2;
+ answer -= (1./12.)*x2;
+ answer += (1./120.)*x2*x2;
+ answer -= (1./252.)*x2*x2*x2;
+
+ *ret_answer = answer;
+ return eslOK;
+}
+
+
+
+/* Function: esl_stats_IncompleteGamma()
+ * Synopsis: Calculates the incomplete Gamma function.
+ *
+ * Purpose: Returns $P(a,x)$ and $Q(a,x)$ where:
+ *
+ * \begin{eqnarray*}
+ * P(a,x) & = & \frac{1}{\Gamma(a)} \int_{0}^{x} t^{a-1} e^{-t} dt \\
+ * & = & \frac{\gamma(a,x)}{\Gamma(a)} \\
+ * Q(a,x) & = & \frac{1}{\Gamma(a)} \int_{x}^{\infty} t^{a-1} e^{-t} dt\\
+ * & = & 1 - P(a,x) \\
+ * \end{eqnarray*}
+ *
+ * $P(a,x)$ is the CDF of a gamma density with $\lambda = 1$,
+ * and $Q(a,x)$ is the survival function.
+ *
+ * For $x \simeq 0$, $P(a,x) \simeq 0$ and $Q(a,x) \simeq 1$; and
+ * $P(a,x)$ is less prone to roundoff error.
+ *
+ * The opposite is the case for large $x >> a$, where
+ * $P(a,x) \simeq 1$ and $Q(a,x) \simeq 0$; there, $Q(a,x)$ is
+ * less prone to roundoff error.
+ *
+ * Method: Based on ideas from Numerical Recipes in C, Press et al.,
+ * Cambridge University Press, 1988.
+ *
+ * Args: a - for instance, degrees of freedom / 2 [a > 0]
+ * x - for instance, chi-squared statistic / 2 [x >= 0]
+ * ret_pax - RETURN: P(a,x)
+ * ret_qax - RETURN: Q(a,x)
+ *
+ * Return: <eslOK> on success.
+ *
+ * Throws: <eslERANGE> if <a> or <x> is out of accepted range.
+ * <eslENOHALT> if approximation fails to converge.
+ */
+int
+esl_stats_IncompleteGamma(double a, double x, double *ret_pax, double *ret_qax)
+{
+ int iter; /* iteration counter */
+ double pax; /* P(a,x) */
+ double qax; /* Q(a,x) */
+ int status;
+
+ if (a <= 0.) ESL_EXCEPTION(eslERANGE, "esl_stats_IncompleteGamma(): a must be > 0");
+ if (x < 0.) ESL_EXCEPTION(eslERANGE, "esl_stats_IncompleteGamma(): x must be >= 0");
+
+ /* For x > a + 1 the following gives rapid convergence;
+ * calculate Q(a,x) = \frac{\Gamma(a,x)}{\Gamma(a)},
+ * using a continued fraction development for \Gamma(a,x).
+ */
+ if (x > a+1)
+ {
+ double oldp; /* previous value of p */
+ double nu0, nu1; /* numerators for continued fraction calc */
+ double de0, de1; /* denominators for continued fraction calc */
+
+ nu0 = 0.; /* A_0 = 0 */
+ de0 = 1.; /* B_0 = 1 */
+ nu1 = 1.; /* A_1 = 1 */
+ de1 = x; /* B_1 = x */
+
+ oldp = nu1;
+ for (iter = 1; iter < 100; iter++)
+ {
+ /* Continued fraction development:
+ * set A_j = b_j A_j-1 + a_j A_j-2
+ * B_j = b_j B_j-1 + a_j B_j-2
+ * We start with A_2, B_2.
+ */
+ /* j = even: a_j = iter-a, b_j = 1 */
+ /* A,B_j-2 are in nu0, de0; A,B_j-1 are in nu1,de1 */
+ nu0 = nu1 + ((double)iter - a) * nu0;
+ de0 = de1 + ((double)iter - a) * de0;
+ /* j = odd: a_j = iter, b_j = x */
+ /* A,B_j-2 are in nu1, de1; A,B_j-1 in nu0,de0 */
+ nu1 = x * nu0 + (double) iter * nu1;
+ de1 = x * de0 + (double) iter * de1;
+ /* rescale */
+ if (de1 != 0.)
+ {
+ nu0 /= de1;
+ de0 /= de1;
+ nu1 /= de1;
+ de1 = 1.;
+ }
+ /* check for convergence */
+ if (fabs((nu1-oldp)/nu1) < 1.e-7)
+ {
+ if ((status = esl_stats_LogGamma(a, &qax)) != eslOK) return status;
+ qax = nu1 * exp(a * log(x) - x - qax);
+
+ if (ret_pax != NULL) *ret_pax = 1 - qax;
+ if (ret_qax != NULL) *ret_qax = qax;
+ return eslOK;
+ }
+
+ oldp = nu1;
+ }
+ ESL_EXCEPTION(eslENOHALT,
+ "esl_stats_IncompleteGamma(): fraction failed to converge");
+ }
+ else /* x <= a+1 */
+ {
+ double p; /* current sum */
+ double val; /* current value used in sum */
+
+ /* For x <= a+1 we use a convergent series instead:
+ * P(a,x) = \frac{\gamma(a,x)}{\Gamma(a)},
+ * where
+ * \gamma(a,x) = e^{-x}x^a \sum_{n=0}{\infty} \frac{\Gamma{a}}{\Gamma{a+1+n}} x^n
+ * which looks appalling but the sum is in fact rearrangeable to
+ * a simple series without the \Gamma functions:
+ * = \frac{1}{a} + \frac{x}{a(a+1)} + \frac{x^2}{a(a+1)(a+2)} ...
+ * and it's obvious that this should converge nicely for x <= a+1.
+ */
+ p = val = 1. / a;
+ for (iter = 1; iter < 10000; iter++)
+ {
+ val *= x / (a+(double)iter);
+ p += val;
+
+ if (fabs(val/p) < 1.e-7)
+ {
+ if ((status = esl_stats_LogGamma(a, &pax)) != eslOK) return status;
+ pax = p * exp(a * log(x) - x - pax);
+
+ if (ret_pax != NULL) *ret_pax = pax;
+ if (ret_qax != NULL) *ret_qax = 1. - pax;
+ return eslOK;
+ }
+ }
+ ESL_EXCEPTION(eslENOHALT,
+ "esl_stats_IncompleteGamma(): series failed to converge");
+ }
+ /*NOTREACHED*/
+ return eslOK;
+}
+
+
+/* Function: esl_stats_erfc()
+ * Synopsis: Complementary error function.
+ *
+ * Purpose: Calculate and return the complementary error function,
+ * erfc(x).
+ *
+ * erfc(x) is mandated by the ANSI C99 standard but that
+ * doesn't mean it's available on supposedly modern systems
+ * (looking at you here, Microsoft).
+ *
+ * Used for cumulative distribution function calculations
+ * for the normal (Gaussian) distribution. See <esl_normal>
+ * module.
+ *
+ * erfc(-inf) = 2.0
+ * erfc(0) = 1.0
+ * erfc(inf) = 0.0
+ * erfc(NaN) = NaN
+ *
+ * Args: x : any real-numbered value -inf..inf
+ *
+ * Returns: erfc(x)
+ *
+ * Throws: (no abnormal error conditions)
+ *
+ * Source:
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this software is
+ * freely granted, provided that this notice is preserved.
+ * [as posted by eggcrook at stackexchange.com, 21 Dec 2012]
+ *
+ * Removed arcane incantations for runtime detection of endianness,
+ * and for treating IEEE754 doubles as two adjacent uint32_t;
+ * replaced with ANSI-compliant macros and compile-time detection
+ * of endianness. [Apr 2015]
+ */
+double
+esl_stats_erfc(double x)
+{
+ static const double tiny = 1e-300;
+ static const double half = 5.00000000000000000000e-01; /* 0x3FE00000, 0x00000000 */
+ static const double one = 1.00000000000000000000e+00; /* 0x3FF00000, 0x00000000 */
+ static const double two = 2.00000000000000000000e+00; /* 0x40000000, 0x00000000 */
+ static const double erx = 8.45062911510467529297e-01; /* 0x3FEB0AC1, 0x60000000 */
+ /*
+ * Coefficients for approximation to erf on [0,0.84375]
+ */
+ static const double pp0 = 1.28379167095512558561e-01; /* 0x3FC06EBA, 0x8214DB68 */
+ static const double pp1 = -3.25042107247001499370e-01; /* 0xBFD4CD7D, 0x691CB913 */
+ static const double pp2 = -2.84817495755985104766e-02; /* 0xBF9D2A51, 0xDBD7194F */
+ static const double pp3 = -5.77027029648944159157e-03; /* 0xBF77A291, 0x236668E4 */
+ static const double pp4 = -2.37630166566501626084e-05; /* 0xBEF8EAD6, 0x120016AC */
+ static const double qq1 = 3.97917223959155352819e-01; /* 0x3FD97779, 0xCDDADC09 */
+ static const double qq2 = 6.50222499887672944485e-02; /* 0x3FB0A54C, 0x5536CEBA */
+ static const double qq3 = 5.08130628187576562776e-03; /* 0x3F74D022, 0xC4D36B0F */
+ static const double qq4 = 1.32494738004321644526e-04; /* 0x3F215DC9, 0x221C1A10 */
+ static const double qq5 = -3.96022827877536812320e-06; /* 0xBED09C43, 0x42A26120 */
+ /*
+ * Coefficients for approximation to erf in [0.84375,1.25]
+ */
+ static const double pa0 = -2.36211856075265944077e-03; /* 0xBF6359B8, 0xBEF77538 */
+ static const double pa1 = 4.14856118683748331666e-01; /* 0x3FDA8D00, 0xAD92B34D */
+ static const double pa2 = -3.72207876035701323847e-01; /* 0xBFD7D240, 0xFBB8C3F1 */
+ static const double pa3 = 3.18346619901161753674e-01; /* 0x3FD45FCA, 0x805120E4 */
+ static const double pa4 = -1.10894694282396677476e-01; /* 0xBFBC6398, 0x3D3E28EC */
+ static const double pa5 = 3.54783043256182359371e-02; /* 0x3FA22A36, 0x599795EB */
+ static const double pa6 = -2.16637559486879084300e-03; /* 0xBF61BF38, 0x0A96073F */
+ static const double qa1 = 1.06420880400844228286e-01; /* 0x3FBB3E66, 0x18EEE323 */
+ static const double qa2 = 5.40397917702171048937e-01; /* 0x3FE14AF0, 0x92EB6F33 */
+ static const double qa3 = 7.18286544141962662868e-02; /* 0x3FB2635C, 0xD99FE9A7 */
+ static const double qa4 = 1.26171219808761642112e-01; /* 0x3FC02660, 0xE763351F */
+ static const double qa5 = 1.36370839120290507362e-02; /* 0x3F8BEDC2, 0x6B51DD1C */
+ static const double qa6 = 1.19844998467991074170e-02; /* 0x3F888B54, 0x5735151D */
+ /*
+ * Coefficients for approximation to erfc in [1.25,1/0.35]
+ */
+ static const double ra0 = -9.86494403484714822705e-03; /* 0xBF843412, 0x600D6435 */
+ static const double ra1 = -6.93858572707181764372e-01; /* 0xBFE63416, 0xE4BA7360 */
+ static const double ra2 = -1.05586262253232909814e+01; /* 0xC0251E04, 0x41B0E726 */
+ static const double ra3 = -6.23753324503260060396e+01; /* 0xC04F300A, 0xE4CBA38D */
+ static const double ra4 = -1.62396669462573470355e+02; /* 0xC0644CB1, 0x84282266 */
+ static const double ra5 = -1.84605092906711035994e+02; /* 0xC067135C, 0xEBCCABB2 */
+ static const double ra6 = -8.12874355063065934246e+01; /* 0xC0545265, 0x57E4D2F2 */
+ static const double ra7 = -9.81432934416914548592e+00; /* 0xC023A0EF, 0xC69AC25C */
+ static const double sa1 = 1.96512716674392571292e+01; /* 0x4033A6B9, 0xBD707687 */
+ static const double sa2 = 1.37657754143519042600e+02; /* 0x4061350C, 0x526AE721 */
+ static const double sa3 = 4.34565877475229228821e+02; /* 0x407B290D, 0xD58A1A71 */
+ static const double sa4 = 6.45387271733267880336e+02; /* 0x40842B19, 0x21EC2868 */
+ static const double sa5 = 4.29008140027567833386e+02; /* 0x407AD021, 0x57700314 */
+ static const double sa6 = 1.08635005541779435134e+02; /* 0x405B28A3, 0xEE48AE2C */
+ static const double sa7 = 6.57024977031928170135e+00; /* 0x401A47EF, 0x8E484A93 */
+ static const double sa8 = -6.04244152148580987438e-02; /* 0xBFAEEFF2, 0xEE749A62 */
+ /*
+ * Coefficients for approximation to erfc in [1/.35,28]
+ */
+ static const double rb0 = -9.86494292470009928597e-03; /* 0xBF843412, 0x39E86F4A */
+ static const double rb1 = -7.99283237680523006574e-01; /* 0xBFE993BA, 0x70C285DE */
+ static const double rb2 = -1.77579549177547519889e+01; /* 0xC031C209, 0x555F995A */
+ static const double rb3 = -1.60636384855821916062e+02; /* 0xC064145D, 0x43C5ED98 */
+ static const double rb4 = -6.37566443368389627722e+02; /* 0xC083EC88, 0x1375F228 */
+ static const double rb5 = -1.02509513161107724954e+03; /* 0xC0900461, 0x6A2E5992 */
+ static const double rb6 = -4.83519191608651397019e+02; /* 0xC07E384E, 0x9BDC383F */
+ static const double sb1 = 3.03380607434824582924e+01; /* 0x403E568B, 0x261D5190 */
+ static const double sb2 = 3.25792512996573918826e+02; /* 0x40745CAE, 0x221B9F0A */
+ static const double sb3 = 1.53672958608443695994e+03; /* 0x409802EB, 0x189D5118 */
+ static const double sb4 = 3.19985821950859553908e+03; /* 0x40A8FFB7, 0x688C246A */
+ static const double sb5 = 2.55305040643316442583e+03; /* 0x40A3F219, 0xCEDF3BE6 */
+ static const double sb6 = 4.74528541206955367215e+02; /* 0x407DA874, 0xE79FE763 */
+ static const double sb7 = -2.24409524465858183362e+01; /* 0xC03670E2, 0x42712D62 */
+
+ int hx,ix;
+ double R,S,P,Q,s,y,z,r;
+
+ ESL_GET_HIGHWORD(hx, x); // SRE: replaced original Sun incantation here.
+ ix = hx & 0x7fffffff;
+ if (ix>=0x7ff00000) /* erfc(nan)=nan; erfc(+-inf)=0,2 */
+ return (double)(((unsigned)hx>>31)<<1)+one/x;
+
+ if (ix < 0x3feb0000) /* |x|<0.84375 */
+ {
+ if (ix < 0x3c700000) return one-x; /* |x|<2**-56 */
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+ s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+ y = r/s;
+ if (hx < 0x3fd00000) /* x<1/4 */
+ {
+ return one-(x+x*y);
+ }
+ else
+ {
+ r = x*y;
+ r += (x-half);
+ return half - r ;
+ }
+ }
+
+ if (ix < 0x3ff40000) /* 0.84375 <= |x| < 1.25 */
+ {
+ s = fabs(x)-one;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+ Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+ if (hx>=0)
+ {
+ z = one-erx;
+ return z - P/Q;
+ }
+ else
+ {
+ z = erx+P/Q;
+ return one+z;
+ }
+ }
+
+ if (ix < 0x403c0000) /* |x|<28 */
+ {
+ x = fabs(x);
+ s = one/(x*x);
+ if (ix< 0x4006DB6D) /* |x| < 1/.35 ~ 2.857143*/
+ {
+ R = ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*ra7))))));
+ S = one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+s*sa8)))))));
+ }
+ else /* |x| >= 1/.35 ~ 2.857143 */
+ {
+ if (hx < 0 && ix >= 0x40180000) return two-tiny; /* x < -6 */
+ R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*rb6)))));
+ S = one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
+ }
+ z = x;
+ ESL_SET_LOWWORD(z, 0); // SRE: replaced original Sun incantation here.
+ r = exp(-z*z-0.5625) * exp((z-x)*(z+x)+R/S);
+
+ if (hx>0) return r/x;
+ else return two-r/x;
+ }
+ else
+ {
+ if (hx>0) return tiny*tiny;
+ else return two-tiny;
+ }
+}
+/*----------------- end, special functions ----------------------*/
+
+
+/*****************************************************************
+ * 3. Standard statistical tests.
+ *****************************************************************/
+
+/* Function: esl_stats_GTest()
+ * Synopsis: Calculates a G-test on 2 vs. 1 binomials.
+ *
+ * Purpose: In experiment a, we've drawn <ca> successes in <na> total
+ * trials; in experiment b, we've drawn <cb> successes in
+ * <nb> total trials. Are the counts different enough to
+ * conclude that the two experiments are different? The
+ * null hypothesis is that the successes in both experiments
+ * were drawn from the same binomial distribution with
+ * per-trial probability $p$. The tested hypothesis is that
+ * experiments a,b have different binomial probabilities
+ * $p_a,p_b$. The G-test is a log-likelihood-ratio statistic,
+ * assuming maximum likelihood values for $p,p_a,p_b$.
+ * $2G$ is distributed approximately as $X^2(1)$,
+ * %"X" is "Chi"
+ * which we use to calculate a P-value for the G statistic.
+ *
+ * Args: ca - number of positives in experiment a
+ * na - total number in experiment a
+ * cb - number of positives in experiment b
+ * nb - total number in experiment b
+ * ret_G - RETURN: G statistic, a log likelihood ratio, in nats
+ * ret_P - RETURN: P-value for the G-statistic
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ *
+ * Xref: Archive1999/0906-sagescore/sagescore.c
+ */
+int
+esl_stats_GTest(int ca, int na, int cb, int nb, double *ret_G, double *ret_P)
+{
+ double a,b,c,d,n;
+ double G = 0.;
+
+ a = (double) ca;
+ b = (double) (na - ca);
+ c = (double) cb;
+ d = (double) (nb - cb);
+ n = (double) na+nb;
+
+ /* Yes, the calculation here is correct; algebraic
+ * rearrangement of the log-likelihood-ratio with
+ * p_a = ca/na, p_b = cb/nb, and p = (ca+cb)/(na+nb).
+ * Guard against 0 probabilities; assume 0 log 0 => 0.
+ */
+ if (a > 0.) G = a * log(a);
+ if (b > 0.) G += b * log(b);
+ if (c > 0.) G += c * log(c);
+ if (d > 0.) G += d * log(d);
+ if (n > 0.) G += n * log(n);
+ if (a+b > 0.) G -= (a+b) * log(a+b);
+ if (c+d > 0.) G -= (c+d) * log(c+d);
+ if (a+c > 0.) G -= (a+c) * log(a+c);
+ if (b+d > 0.) G -= (b+d) * log(b+d);
+
+ *ret_G = G;
+ return esl_stats_IncompleteGamma( 0.5, G, NULL, ret_P);
+}
+
+
+/* Function: esl_stats_ChiSquaredTest()
+ * Synopsis: Calculates a $\chi^2$ P-value.
+ * Incept: SRE, Tue Jul 19 11:39:32 2005 [St. Louis]
+ *
+ * Purpose: Calculate the probability that a chi-squared statistic
+ * with <v> degrees of freedom would exceed the observed
+ * chi-squared value <x>; return it in <ret_answer>. If
+ * this probability is less than some small threshold (say,
+ * 0.05 or 0.01), then we may reject the hypothesis we're
+ * testing.
+ *
+ * Args: v - degrees of freedom
+ * x - observed chi-squared value
+ * ret_answer - RETURN: P(\chi^2 > x)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslERANGE> if <v> or <x> are out of valid range.
+ * <eslENOHALT> if iterative calculation fails.
+ */
+int
+esl_stats_ChiSquaredTest(int v, double x, double *ret_answer)
+{
+ return esl_stats_IncompleteGamma((double)v/2., x/2., NULL, ret_answer);
+}
+/*----------------- end, statistical tests ---------------------*/
+
+
+
+/*****************************************************************
+ * 4. Data fitting.
+ *****************************************************************/
+
+/* Function: esl_stats_LinearRegression()
+ * Synopsis: Fit data to a straight line.
+ * Incept: SRE, Sat May 26 11:33:46 2007 [Janelia]
+ *
+ * Purpose: Fit <n> points <x[i]>, <y[i]> to a straight line
+ * $y = a + bx$ by linear regression.
+ *
+ * The $x_i$ are taken to be known, and the $y_i$ are taken
+ * to be observed quantities associated with a sampling
+ * error $\sigma_i$. If known, the standard deviations
+ * $\sigma_i$ for $y_i$ are provided in the <sigma> array.
+ * If they are unknown, pass <sigma = NULL>, and the
+ * routine will proceed with the assumption that $\sigma_i
+ * = 1$ for all $i$.
+ *
+ * The maximum likelihood estimates for $a$ and $b$ are
+ * optionally returned in <opt_a> and <opt_b>.
+ *
+ * The estimated standard deviations of $a$ and $b$ and
+ * their estimated covariance are optionally returned in
+ * <opt_sigma_a>, <opt_sigma_b>, and <opt_cov_ab>.
+ *
+ * The Pearson correlation coefficient is optionally
+ * returned in <opt_cc>.
+ *
+ * The $\chi^2$ P-value for the regression fit is
+ * optionally returned in <opt_Q>. This P-value may only be
+ * obtained when the $\sigma_i$ are known. If <sigma> is
+ * passed as <NULL> and <opt_Q> is requested, <*opt_Q> is
+ * set to 1.0.
+ *
+ * This routine follows the description and algorithm in
+ * \citep[pp.661-666]{Press93}.
+ *
+ * <n> must be greater than 2; at least two x[i] must
+ * differ; and if <sigma> is provided, all <sigma[i]> must
+ * be $>0$. If any of these conditions isn't met, the
+ * routine throws <eslEINVAL>.
+ *
+ * Args: x - x[0..n-1]
+ * y - y[0..n-1]
+ * sigma - sample error in observed y_i
+ * n - number of data points
+ * opt_a - optRETURN: intercept estimate
+ * opt_b - optRETURN: slope estimate
+ * opt_sigma_a - optRETURN: error in estimate of a
+ * opt_sigma_b - optRETURN: error in estimate of b
+ * opt_cov_ab - optRETURN: covariance of a,b estimates
+ * opt_cc - optRETURN: Pearson correlation coefficient for x,y
+ * opt_Q - optRETURN: X^2 P-value for linear fit
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error;
+ * <eslEINVAL> if a contract condition isn't met;
+ * <eslENORESULT> if the chi-squared test fails.
+ * In these cases, all optional return values are set to 0.
+ */
+int
+esl_stats_LinearRegression(const double *x, const double *y, const double *sigma, int n,
+ double *opt_a, double *opt_b,
+ double *opt_sigma_a, double *opt_sigma_b, double *opt_cov_ab,
+ double *opt_cc, double *opt_Q)
+{
+ int status;
+ double *t = NULL;
+ double S, Sx, Sy, Stt;
+ double Sxy, Sxx, Syy;
+ double a, b, sigma_a, sigma_b, cov_ab, cc, X2, Q;
+ double xdev, ydev;
+ double tmp;
+ int i;
+
+ /* Contract checks. */
+ if (n <= 2) ESL_XEXCEPTION(eslEINVAL, "n must be > 2 for linear regression fitting");
+ if (sigma != NULL)
+ for (i = 0; i < n; i++) if (sigma[i] <= 0.) ESL_XEXCEPTION(eslEINVAL, "sigma[%d] <= 0", i);
+ status = eslEINVAL;
+ for (i = 0; i < n; i++) if (x[i] != 0.) { status = eslOK; break; }
+ if (status != eslOK) ESL_XEXCEPTION(eslEINVAL, "all x[i] are 0.");
+
+ /* Allocations */
+ ESL_ALLOC(t, sizeof(double) * n);
+
+ /* S = \sum_{i=1}{n} \frac{1}{\sigma_i^2}. (S > 0.) */
+ if (sigma != NULL) { for (S = 0., i = 0; i < n; i++) S += 1./ (sigma[i] * sigma[i]); }
+ else S = (double) n;
+
+ /* S_x = \sum_{i=1}{n} \frac{x[i]}{ \sigma_i^2} (Sx real.) */
+ for (Sx = 0., i = 0; i < n; i++) {
+ if (sigma == NULL) Sx += x[i];
+ else Sx += x[i] / (sigma[i] * sigma[i]);
+ }
+
+ /* S_y = \sum_{i=1}{n} \frac{y[i]}{\sigma_i^2} (Sy real.) */
+ for (Sy = 0., i = 0; i < n; i++) {
+ if (sigma == NULL) Sy += y[i];
+ else Sy += y[i] / (sigma[i] * sigma[i]);
+ }
+
+ /* t_i = \frac{1}{\sigma_i} \left( x_i - \frac{S_x}{S} \right) (t_i real) */
+ for (i = 0; i < n; i++) {
+ t[i] = x[i] - Sx/S;
+ if (sigma != NULL) t[i] /= sigma[i];
+ }
+
+ /* S_{tt} = \sum_{i=1}^n t_i^2 (if at least one x is != 0, Stt > 0) */
+ for (Stt = 0., i = 0; i < n; i++) { Stt += t[i] * t[i]; }
+
+ /* b = \frac{1}{S_{tt}} \sum_{i=1}^{N} \frac{t_i y_i}{\sigma_i} */
+ for (b = 0., i = 0; i < n; i++) {
+ if (sigma != NULL) { b += t[i]*y[i] / sigma[i]; }
+ else { b += t[i]*y[i]; }
+ }
+ b /= Stt;
+
+ /* a = \frac{ S_y - S_x b } {S} */
+ a = (Sy - Sx * b) / S;
+
+ /* \sigma_a^2 = \frac{1}{S} \left( 1 + \frac{ S_x^2 }{S S_{tt}} \right) */
+ sigma_a = sqrt ((1. + (Sx*Sx) / (S*Stt)) / S);
+
+ /* \sigma_b = \frac{1}{S_{tt}} */
+ sigma_b = sqrt (1. / Stt);
+
+ /* Cov(a,b) = - \frac{S_x}{S S_{tt}} */
+ cov_ab = -Sx / (S * Stt);
+
+ /* Pearson correlation coefficient */
+ Sxy = Sxx = Syy = 0.;
+ for (i = 0; i < n; i++) {
+ if (sigma != NULL) {
+ xdev = (x[i] / (sigma[i] * sigma[i])) - (Sx / n);
+ ydev = (y[i] / (sigma[i] * sigma[i])) - (Sy / n);
+ } else {
+ xdev = x[i] - (Sx / n);
+ ydev = y[i] - (Sy / n);
+ }
+ Sxy += xdev * ydev;
+ Sxx += xdev * xdev;
+ Syy += ydev * ydev;
+ }
+ cc = Sxy / (sqrt(Sxx) * sqrt(Syy));
+
+ /* \chi^2 */
+ for (X2 = 0., i = 0; i < n; i++) {
+ tmp = y[i] - a - b*x[i];
+ if (sigma != NULL) tmp /= sigma[i];
+ X2 += tmp*tmp;
+ }
+
+ /* We can calculate a goodness of fit if we know the \sigma_i */
+ if (sigma != NULL) {
+ if (esl_stats_ChiSquaredTest(n-2, X2, &Q) != eslOK) { status = eslENORESULT; goto ERROR; }
+ } else Q = 1.0;
+
+ /* If we didn't use \sigma_i, adjust the sigmas for a,b */
+ if (sigma == NULL) {
+ tmp = sqrt(X2 / (double)(n-2));
+ sigma_a *= tmp;
+ sigma_b *= tmp;
+ }
+
+ /* Done. Set up for normal return.
+ */
+ free(t);
+ if (opt_a != NULL) *opt_a = a;
+ if (opt_b != NULL) *opt_b = b;
+ if (opt_sigma_a != NULL) *opt_sigma_a = sigma_a;
+ if (opt_sigma_b != NULL) *opt_sigma_b = sigma_b;
+ if (opt_cov_ab != NULL) *opt_cov_ab = cov_ab;
+ if (opt_cc != NULL) *opt_cc = cc;
+ if (opt_Q != NULL) *opt_Q = Q;
+ return eslOK;
+
+ ERROR:
+ if (t != NULL) free(t);
+ if (opt_a != NULL) *opt_a = 0.;
+ if (opt_b != NULL) *opt_b = 0.;
+ if (opt_sigma_a != NULL) *opt_sigma_a = 0.;
+ if (opt_sigma_b != NULL) *opt_sigma_b = 0.;
+ if (opt_cov_ab != NULL) *opt_cov_ab = 0.;
+ if (opt_cc != NULL) *opt_cc = 0.;
+ if (opt_Q != NULL) *opt_Q = 0.;
+ return status;
+}
+/*------------------- end, data fitting -------------------------*/
+
+
+
+/*****************************************************************
+ * 5. Unit tests.
+ *****************************************************************/
+#ifdef eslSTATS_TESTDRIVE
+#include "esl_random.h"
+#include "esl_stopwatch.h"
+#ifdef HAVE_LIBGSL
+#include <gsl/gsl_sf_gamma.h>
+#endif
+
+
+/* Macros for treating IEEE754 double as two uint32_t halves, with
+ * compile-time handling of endianness; see esl_stats.h.
+ */
+static void
+utest_doublesplitting(ESL_RANDOMNESS *rng)
+{
+ char msg[] = "esl_stats:: doublesplitting unit test failed";
+ uint32_t ix0, ix1;
+ double x;
+ double x2;
+ int iteration; // iteration 0 uses x = 2; iteration 1 uses random x = [0,1).
+
+ for (iteration = 0; iteration < 2; iteration++)
+ {
+ x = (iteration == 0 ? 2.0 : esl_random(rng));
+ ESL_GET_WORDS(ix0, ix1, x);
+ ESL_SET_WORDS(x2, ix0, ix1);
+ if (x2 != x) esl_fatal(msg);
+
+ ESL_GET_HIGHWORD(ix0, x);
+ ESL_SET_HIGHWORD(x2, ix0);
+ if (x2 != x) esl_fatal(msg);
+
+ ESL_GET_LOWWORD(ix0, x);
+ ESL_SET_LOWWORD(x2, ix0);
+ if (iteration == 0 && ix0 != 0) esl_fatal(msg);
+ if (x2 != x) esl_fatal(msg);
+ }
+}
+
+/* The LogGamma() function is rate-limiting in hmmbuild, because it is
+ * used so heavily in mixture Dirichlet calculations.
+ * ./configure --with-gsl; [compile test driver]
+ * ./stats_utest -v
+ * runs a comparison of time/precision against GSL.
+ * SRE, Sat May 23 10:04:41 2009, on home Mac:
+ * LogGamma = 1.29u / N=1e8 = 13 nsec/call
+ * gsl_sf_lngamma = 1.43u / N=1e8 = 14 nsec/call
+ */
+static void
+utest_LogGamma(ESL_RANDOMNESS *r, int N, int be_verbose)
+{
+ char *msg = "esl_stats_LogGamma() unit test failed";
+ ESL_STOPWATCH *w = esl_stopwatch_Create();
+ double *x = malloc(sizeof(double) * N);
+ double *lg = malloc(sizeof(double) * N);
+ double *lg2 = malloc(sizeof(double) * N);
+ int i;
+
+ for (i = 0; i < N; i++)
+ x[i] = esl_random(r) * 100.;
+
+ esl_stopwatch_Start(w);
+ for (i = 0; i < N; i++)
+ if (esl_stats_LogGamma(x[i], &(lg[i])) != eslOK) esl_fatal(msg);
+ esl_stopwatch_Stop(w);
+
+ if (be_verbose) esl_stopwatch_Display(stdout, w, "esl_stats_LogGamma() timing: ");
+
+#ifdef HAVE_LIBGSL
+ esl_stopwatch_Start(w);
+ for (i = 0; i < N; i++) lg2[i] = gsl_sf_lngamma(x[i]);
+ esl_stopwatch_Stop(w);
+
+ if (be_verbose) esl_stopwatch_Display(stdout, w, "gsl_sf_lngamma() timing: ");
+
+ for (i = 0; i < N; i++)
+ if (esl_DCompare(lg[i], lg2[i], 1e-2) != eslOK) esl_fatal(msg);
+#endif
+
+ free(lg2);
+ free(lg);
+ free(x);
+ esl_stopwatch_Destroy(w);
+}
+
+
+/* The test of esl_stats_LinearRegression() is a statistical test,
+ * so we can't be too aggressive about testing results.
+ *
+ * Args:
+ * r - a source of randomness
+ * use_sigma - TRUE to pass sigma to the regression fit.
+ * be_verbose - TRUE to print results (manual, not automated test mode)
+ */
+static void
+utest_LinearRegression(ESL_RANDOMNESS *r, int use_sigma, int be_verbose)
+{
+ char msg[] = "linear regression unit test failed";
+ double a = -3.;
+ double b = 1.;
+ int n = 100;
+ double xori = -20.;
+ double xstep = 1.0;
+ double setsigma = 1.0; /* sigma on all points */
+ int i;
+ double *x = NULL;
+ double *y = NULL;
+ double *sigma = NULL;
+ double ae, be, siga, sigb, cov_ab, cc, Q;
+
+ if ((x = malloc(sizeof(double) * n)) == NULL) esl_fatal(msg);
+ if ((y = malloc(sizeof(double) * n)) == NULL) esl_fatal(msg);
+ if ((sigma = malloc(sizeof(double) * n)) == NULL) esl_fatal(msg);
+
+ /* Simulate some linear data */
+ for (i = 0; i < n; i++)
+ {
+ sigma[i] = setsigma;
+ x[i] = xori + i*xstep;
+ y[i] = esl_rnd_Gaussian(r, a + b*x[i], sigma[i]);
+ }
+
+ if (use_sigma) {
+ if (esl_stats_LinearRegression(x, y, sigma, n, &ae, &be, &siga, &sigb, &cov_ab, &cc, &Q) != eslOK) esl_fatal(msg);
+ } else {
+ if (esl_stats_LinearRegression(x, y, NULL, n, &ae, &be, &siga, &sigb, &cov_ab, &cc, &Q) != eslOK) esl_fatal(msg);
+ }
+
+ if (be_verbose) {
+ printf("Linear regression test:\n");
+ printf("estimated intercept a = %8.4f [true = %8.4f]\n", ae, a);
+ printf("estimated slope b = %8.4f [true = %8.4f]\n", be, b);
+ printf("estimated sigma on a = %8.4f\n", siga);
+ printf("estimated sigma on b = %8.4f\n", sigb);
+ printf("estimated cov(a,b) = %8.4f\n", cov_ab);
+ printf("correlation coeff = %8.4f\n", cc);
+ printf("P-value = %8.4f\n", Q);
+ }
+
+ /* The following tests are statistical.
+ */
+ if ( fabs(ae-a) > 2*siga ) esl_fatal(msg);
+ if ( fabs(be-b) > 2*sigb ) esl_fatal(msg);
+ if ( cc < 0.95) esl_fatal(msg);
+ if (use_sigma) {
+ if (Q < 0.001) esl_fatal(msg);
+ } else {
+ if (Q != 1.0) esl_fatal(msg);
+ }
+
+ free(x);
+ free(y);
+ free(sigma);
+}
+
+static void
+utest_erfc(ESL_RANDOMNESS *rng, int be_verbose)
+{
+ char msg[] = "esl_stats:: erfc unit test failed";
+ double x;
+ double result;
+ int i;
+
+ if (be_verbose) {
+ printf("#--------------------------\n");
+ printf("# erfc unit testing...\n");
+ }
+
+ result = esl_stats_erfc( eslNaN);
+ if (! isnan(result)) esl_fatal(msg);
+ if (esl_stats_erfc(-eslINFINITY) != 2.0) esl_fatal(msg);
+ if (esl_stats_erfc( 0.0) != 1.0) esl_fatal(msg);
+ if (esl_stats_erfc( eslINFINITY) != 0.0) esl_fatal(msg);
+
+ for (i = 0; i < 42; i++)
+ {
+ x = esl_random(rng) * 10. - 5.;
+ result = esl_stats_erfc(x);
+ if (!isfinite(result)) esl_fatal(msg);
+#ifdef HAVE_ERFC
+ if (esl_DCompare(result, erfc(x), 1e-6) != eslOK) esl_fatal(msg);
+ if (be_verbose)
+ printf("%15f %15f %15f\n", x, result, erfc(x));
+#endif
+ }
+
+ if (be_verbose)
+ printf("#--------------------------\n");
+ return;
+}
+
+#endif /*eslSTATS_TESTDRIVE*/
+/*-------------------- end of unit tests ------------------------*/
+
+
+
+
+/*****************************************************************
+ * 6. Test driver.
+ *****************************************************************/
+#ifdef eslSTATS_TESTDRIVE
+/* gcc -g -Wall -o stats_utest -L. -I. -DeslSTATS_TESTDRIVE esl_stats.c -leasel -lm
+ * gcc -DHAVE_LIBGSL -O2 -o stats_utest -L. -I. -DeslSTATS_TESTDRIVE esl_stats.c -leasel -lgsl -lm
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_stats.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ {"-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0},
+ {"-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "verbose: show verbose output", 0},
+ {"-N", eslARG_INT,"10000000", NULL, NULL, NULL, NULL, NULL, "number of trials in LogGamma test", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for stats special functions";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ int be_verbose = esl_opt_GetBoolean(go, "-v");
+ int N = esl_opt_GetInteger(go, "-N");
+
+ if (be_verbose) printf("seed = %" PRIu32 "\n", esl_randomness_GetSeed(r));
+
+ utest_doublesplitting(r);
+ utest_erfc(r, be_verbose);
+ utest_LogGamma(r, N, be_verbose);
+ utest_LinearRegression(r, TRUE, be_verbose);
+ utest_LinearRegression(r, FALSE, be_verbose);
+
+ esl_getopts_Destroy(go);
+ esl_randomness_Destroy(r);
+ exit(0);
+}
+#endif /*eslSTATS_TESTDRIVE*/
+/*------------------- end of test driver ------------------------*/
+
+
+
+
+/*****************************************************************
+ * 7. Examples.
+ *****************************************************************/
+
+/* Compile: gcc -g -Wall -o example -I. -DeslSTATS_EXAMPLE esl_stats.c esl_random.c easel.c -lm
+ * or gcc -g -Wall -o example -I. -L. -DeslSTATS_EXAMPLE esl_stats.c -leasel -lm
+ */
+#ifdef eslSTATS_EXAMPLE
+/*::cexcerpt::stats_example::begin::*/
+/* gcc -g -Wall -o example -I. -DeslSTATS_EXAMPLE esl_stats.c esl_random.c easel.c -lm */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_stats.h"
+
+int main(void)
+{
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ double a = -3.;
+ double b = 1.;
+ double xori = -20.;
+ double xstep = 1.0;
+ double setsigma = 1.0; /* sigma on all points */
+ int n = 100;
+ double *x = malloc(sizeof(double) * n);
+ double *y = malloc(sizeof(double) * n);
+ double *sigma = malloc(sizeof(double) * n);
+ int i;
+ double ae, be, siga, sigb, cov_ab, cc, Q;
+
+ /* Simulate some linear data, with Gaussian noise added to y_i */
+ for (i = 0; i < n; i++) {
+ sigma[i] = setsigma;
+ x[i] = xori + i*xstep;
+ y[i] = esl_rnd_Gaussian(r, a + b*x[i], sigma[i]);
+ }
+
+ if (esl_stats_LinearRegression(x, y, sigma, n, &ae, &be, &siga, &sigb, &cov_ab, &cc, &Q) != eslOK)
+ esl_fatal("linear regression failed");
+
+ printf("estimated intercept a = %8.4f [true = %8.4f]\n", ae, a);
+ printf("estimated slope b = %8.4f [true = %8.4f]\n", be, b);
+ printf("estimated sigma on a = %8.4f\n", siga);
+ printf("estimated sigma on b = %8.4f\n", sigb);
+ printf("estimated cov(a,b) = %8.4f\n", cov_ab);
+ printf("correlation coeff = %8.4f\n", cc);
+ printf("P-value = %8.4f\n", Q);
+
+ free(x); free(y); free(sigma);
+ esl_randomness_Destroy(r);
+ exit(0);
+}
+/*::cexcerpt::stats_example::end::*/
+#endif /* eslSTATS_EXAMPLE */
+
+
+#ifdef eslSTATS_EXAMPLE2
+
+#include <stdlib.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_stats.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <ca> <na> <cb> <nb>";
+static char banner[] = "example from the stats module: using a G-test";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 4, argc, argv, banner, usage);
+ int ca = strtol(esl_opt_GetArg(go, 1), NULL, 10);
+ int na = strtol(esl_opt_GetArg(go, 2), NULL, 10);
+ int cb = strtol(esl_opt_GetArg(go, 3), NULL, 10);
+ int nb = strtol(esl_opt_GetArg(go, 4), NULL, 10);
+ double G, P;
+ int status;
+
+ if (ca > na || cb > nb) esl_fatal("argument order wrong? expect ca, na, cb, nb for ca/na, cb/nb");
+
+ if ( (status = esl_stats_GTest(ca, na, cb, nb, &G, &P)) != eslOK) esl_fatal("G-test failed?");
+ printf("%-10.3g %12.2f\n", P, G);
+ exit(0);
+}
+#endif /* eslSTATS_EXAMPLE2 */
+/*--------------------- end of examples -------------------------*/
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_stats.h b/esl_stats.h
new file mode 100644
index 0000000..5f41e04
--- /dev/null
+++ b/esl_stats.h
@@ -0,0 +1,142 @@
+/* Foundation, miscellanea for the statistics modules.
+ */
+#ifndef eslSTATS_INCLUDED
+#define eslSTATS_INCLUDED
+
+#include "easel.h"
+
+/*****************************************************************
+ * Splitting IEEE754 double-precision float into two uint32_t
+ *****************************************************************
+ *
+ * Currently we only need these macros for one function,
+ * esl_stats_erfc(). The Sun Microsystems erfc() code that we've
+ * borrowed splits an IEEE754 double into two unsigned 32-bit
+ * integers. It uses arcane trickery to deal with endianness at
+ * runtime, using incantations like these:
+ * n0 = ((*(int*)&one)>>29)^1 0|1 = bigendian | littleendian
+ * hx = *(n0+(int*)&x); get high word
+ * (1-n0+(int*)&z) = 0; set low word
+ *
+ * Not only is this arcane and dubious, static code checking (using
+ * the clang/llvm checker) doesn't like it. I found an improvement
+ * in a library called zenilib, at:
+ * http://www-personal.umich.edu/~bazald/l/api/math__private_8h_source.html
+ *
+ * Here we do the same thing in an ANSI-respecting way using unions,
+ * with endianness detected at compile time.
+ *
+ * The zenilib code also appears to derive from (C) Sun Microsystems
+ * code.
+ *
+ * SRE TODO: insert license/copyright info here
+ */
+
+#ifdef WORDS_BIGENDIAN
+typedef union
+{
+ double val;
+ struct {
+ uint32_t msw;
+ uint32_t lsw;
+ } parts;
+} esl_double_split_t;
+#else /* else we're littleendian, such as Intel */
+typedef union
+{
+ double val;
+ struct {
+ uint32_t lsw;
+ uint32_t msw;
+ } parts;
+} esl_double_split_t;
+#endif /*WORDS_BIGENDIAN*/
+
+#define ESL_GET_WORDS(ix0, ix1, d) \
+ do { \
+ esl_double_split_t esltmp_ds; \
+ esltmp_ds.val = (d); \
+ (ix0) = esltmp_ds.parts.msw; \
+ (ix1) = esltmp_ds.parts.lsw; \
+ } while (0)
+
+#define ESL_GET_HIGHWORD(ix0, d) \
+ do { \
+ esl_double_split_t esltmp_ds; \
+ esltmp_ds.val = (d); \
+ (ix0) = esltmp_ds.parts.msw; \
+ } while (0)
+
+#define ESL_GET_LOWWORD(ix0, d) \
+ do { \
+ esl_double_split_t esltmp_ds; \
+ esltmp_ds.val = (d); \
+ (ix0) = esltmp_ds.parts.lsw; \
+ } while (0)
+
+#define ESL_SET_WORDS(d, ix0, ix1) \
+ do { \
+ esl_double_split_t esltmp_ds; \
+ esltmp_ds.parts.msw = (ix0); \
+ esltmp_ds.parts.lsw = (ix1); \
+ (d) = esltmp_ds.val; \
+ } while (0)
+
+#define ESL_SET_HIGHWORD(d, ix0) \
+ do { \
+ esl_double_split_t esltmp_ds; \
+ esltmp_ds.val = (d); \
+ esltmp_ds.parts.msw = (ix0); \
+ (d) = esltmp_ds.val; \
+ } while (0)
+
+#define ESL_SET_LOWWORD(d, ix1) \
+ do { \
+ esl_double_split_t esltmp_ds; \
+ esltmp_ds.val = (d); \
+ esltmp_ds.parts.lsw = (ix1); \
+ (d) = esltmp_ds.val; \
+ } while (0)
+
+
+/*****************************************************************
+ * Function declarations
+ *****************************************************************/
+
+/* 1. Summary statistics calculations */
+extern int esl_stats_DMean(const double *x, int n, double *opt_mean, double *opt_var);
+extern int esl_stats_FMean(const float *x, int n, double *opt_mean, double *opt_var);
+extern int esl_stats_IMean(const int *x, int n, double *opt_mean, double *opt_var);
+
+/* 2. Special functions */
+extern int esl_stats_LogGamma(double x, double *ret_answer);
+extern int esl_stats_Psi(double x, double *ret_answer);
+extern int esl_stats_IncompleteGamma(double a, double x, double *ret_pax, double *ret_qax);
+extern double esl_stats_erfc(double x);
+
+/* 3. Standard statistical tests */
+extern int esl_stats_GTest(int ca, int na, int cb, int nb, double *ret_G, double *ret_P);
+extern int esl_stats_ChiSquaredTest(int v, double x, double *ret_answer);
+
+/* 4. Data fitting */
+extern int esl_stats_LinearRegression(const double *x, const double *y, const double *sigma, int n,
+ double *opt_a, double *opt_b,
+ double *opt_sigma_a, double *opt_sigma_b, double *opt_cov_ab,
+ double *opt_cc, double *opt_Q);
+
+
+/*****************************************************************
+ * Portability
+ *****************************************************************/
+
+#ifndef HAVE_ERFC
+#define erfc(x) esl_stats_erfc(x)
+#endif
+
+#endif /*eslSTATS_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_stats.tex b/esl_stats.tex
new file mode 100644
index 0000000..b027d99
--- /dev/null
+++ b/esl_stats.tex
@@ -0,0 +1,43 @@
+
+The \eslmod{stats} module is the foundation of a set of statistics
+modules. It contains special functions like $\Gamma(x)$ and $\Psi(x)$,
+and elementary statistics routines such as linear regression fitting
+and $\chi^2$ testing. Table~\ref{tbl:stats_api} lists the functions in
+the \eslmod{stats} API.
+
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\hyperlink{func:esl_stats_DMean()}{\ccode{esl\_stats\_\{D,F,I\}Mean()}} & Calculates mean and $\sigma^2$ for samples $x_i$.\\
+\hyperlink{func:esl_stats_LogGamma()}{\ccode{esl\_stats\_LogGamma()}} & Calculates $\log \Gamma(x)$.\\
+\hyperlink{func:esl_stats_Psi()}{\ccode{esl\_stats\_Psi()}} & Calculates $\Psi(x)$ (the digamma function).\\
+\hyperlink{func:esl_stats_IncompleteGamma()}{\ccode{esl\_stats\_IncompleteGamma()}} & Calculates the incomplete Gamma function.
+\\
+\hyperlink{func:esl_stats_ChiSquaredTest()}{\ccode{esl\_stats\_ChiSquaredTest()}} & Calculates a $\chi^2$ P-value.\\
+\hyperlink{func:esl_stats_LinearRegression()}{\ccode{esl\_stats\_LinearRegression()}} & Fit data to a straight line.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{stats} API.}
+\label{tbl:stats_api}
+\end{table}
+
+\subsection{An example of using the stats API}
+
+
+Figure~\ref{fig:stats_example} shows an example of using one of the
+routines in the \eslmod{stats} module, linear regression fitting. It
+generates a set of $n$ points dispersed around a line, $y_i = a + bx +
+N(\sigma)$ with Gaussian noise $N(\sigma)$, then fits the data to a
+line to obtain estimates $\hat{a}$ and $\hat{b}$.
+
+\begin{figure}
+\input{cexcerpts/stats_example}
+\caption{An example of using the \eslmod{stats} module.}
+\label{fig:stats_example}
+\end{figure}
+
+
+
diff --git a/esl_stopwatch.c b/esl_stopwatch.c
new file mode 100644
index 0000000..b62c0e6
--- /dev/null
+++ b/esl_stopwatch.c
@@ -0,0 +1,420 @@
+/* Tracking cpu/system/elapsed time used by a process.
+ *
+ * Credits:
+ * - Thanks to Warren Gish for assistance.
+ * - Includes portable high-resolution timer code
+ * (C) 2012 David Robert Nadeau, http://NadeauSoftware.com/
+ * Creative Commons Attribution 3.0 Unported License
+ * http://creativecommons.org/licenses/by/3.0/deed.en_US
+ */
+#include "esl_config.h"
+
+#include "easel.h"
+#include "esl_stopwatch.h"
+
+static double stopwatch_getRealTime(void);
+
+/*****************************************************************
+ * ESL_STOPWATCH object maintenance
+ *****************************************************************/
+
+/* Function: esl_stopwatch_Create()
+ *
+ * Purpose: Creates a new stopwatch.
+ *
+ * Returns: ptr to a new <ESL_STOPWATCH> object; caller is
+ * responsible for free'ing it with
+ * <esl_stopwatch_Destroy()>.
+ *
+ * Throws: NULL on allocation failure.
+ */
+ESL_STOPWATCH *
+esl_stopwatch_Create(void)
+{
+ ESL_STOPWATCH *w = NULL;
+ int status;
+
+ ESL_ALLOC(w, sizeof(ESL_STOPWATCH));
+ w->elapsed = 0.;
+ w->user = 0.;
+ w->sys = 0.;
+ return w;
+
+ ERROR:
+ esl_stopwatch_Destroy(w);
+ return NULL;
+}
+
+/* Function: esl_stopwatch_Destroy()
+ *
+ * Purpose: Frees an <ESL_STOPWATCH>.
+ */
+void
+esl_stopwatch_Destroy(ESL_STOPWATCH *w)
+{
+ if (w)
+ free(w);
+}
+
+
+
+/* Function: esl_stopwatch_Start()
+ *
+ * Purpose: Start a stopwatch. This sets the base
+ * for elapsed, cpu, and system time difference
+ * calculations by subsequent calls to
+ * <esl_stopwatch_Stop()>.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_stopwatch_Start(ESL_STOPWATCH *w)
+{
+#if defined HAVE_TIMES && defined eslSTOPWATCH_HIGHRES /* System-dependent highest resolution */
+ times(&(w->cpu0));
+ w->t0 = stopwatch_getRealTime();
+#elif HAVE_TIMES /* ... else fall back to POSIX... */
+ w->t0 = times(&(w->cpu0));
+#else /* ... else fallback to ANSI C */
+ w->t0 = time(NULL);
+ w->cpu0 = clock();
+#endif
+
+ w->elapsed = 0.;
+ w->user = 0.;
+ w->sys = 0.;
+ return eslOK;
+}
+
+/* Function: esl_stopwatch_Stop()
+ *
+ * Purpose: Stop a stopwatch. Record and store elapsed,
+ * cpu, and system time difference relative to the
+ * last call to <esl_stopwatch_Start()>.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_stopwatch_Stop(ESL_STOPWATCH *w)
+{
+#if defined eslSTOPWATCH_HIGHRES && defined HAVE_TIMES
+ double t1;
+ struct tms cpu1;
+ double clk_tck;
+#elif defined HAVE_TIMES
+ clock_t t1;
+ struct tms cpu1;
+ double clk_tck;
+#else
+ time_t t1;
+ clock_t cpu1;
+#endif
+
+
+#if defined eslSTOPWATCH_HIGHRES && defined HAVE_TIMES
+ t1 = stopwatch_getRealTime();
+ w->elapsed = t1 - w->t0;
+ clk_tck = (double) sysconf(_SC_CLK_TCK);
+ times(&cpu1);
+ w->user = (double) (cpu1.tms_utime + cpu1.tms_cutime -
+ w->cpu0.tms_utime - w->cpu0.tms_cutime) / clk_tck;
+ w->sys = (double) (cpu1.tms_stime + cpu1.tms_cstime -
+ w->cpu0.tms_stime - w->cpu0.tms_cstime) / clk_tck;
+#elif defined HAVE_TIMES /* POSIX */
+ t1 = times(&cpu1);
+ clk_tck = (double) sysconf(_SC_CLK_TCK);
+ w->elapsed = (double) (t1 - w->t0) / clk_tck;
+ w->user = (double) (cpu1.tms_utime + cpu1.tms_cutime -
+ w->cpu0.tms_utime - w->cpu0.tms_cutime) / clk_tck;
+ w->sys = (double) (cpu1.tms_stime + cpu1.tms_cstime -
+ w->cpu0.tms_stime - w->cpu0.tms_cstime) / clk_tck;
+#else /* fallback to ANSI C */
+ t1 = time(NULL);
+ cpu1 = clock();
+ w->elapsed = difftime(t1, w->t0);
+ w->user = (double) (cpu1- w->cpu0) / (double) CLOCKS_PER_SEC;
+ w->sys = 0.; /* no way to portably get system time in ANSI C */
+#endif
+
+ return eslOK;
+}
+
+/* format_time_string()
+ * Date: SRE, Fri Nov 26 15:06:28 1999 [St. Louis]
+ *
+ * Purpose: Given a number of seconds, format into
+ * hh:mm:ss.xx in a provided buffer.
+ *
+ * Args: buf - allocated space (128 is plenty!)
+ * sec - number of seconds
+ * do_frac - TRUE (1) to include hundredths of a sec
+ */
+static void
+format_time_string(char *buf, double sec, int do_frac)
+{
+ int h, m, s, hs;
+
+ h = (int) (sec / 3600.);
+ m = (int) (sec / 60.) - h * 60;
+ s = (int) (sec) - h * 3600 - m * 60;
+ if (do_frac) {
+ hs = (int) (sec * 100.) - h * 360000 - m * 6000 - s * 100;
+ sprintf(buf, "%02d:%02d:%02d.%02d", h,m,s,hs);
+ } else {
+ sprintf(buf, "%02d:%02d:%02d", h,m,s);
+ }
+}
+
+/* Function: esl_stopwatch_Display()
+ *
+ * Purpose: Output a usage summary line from a stopped
+ * stopwatch, showing elapsed, cpu, and system time
+ * between the last calls to
+ * <esl_stopwatch_Start()> and <esl_stopwatch_Stop()>.
+ *
+ * The string <prefix> will be prepended to the output
+ * line. Use <""> to prepend nothing. If <prefix> is NULL,
+ * a default <"CPU Time: "> prefix is used.
+ *
+ * For <prefix> = <"CPU Time: "> an example output line is:\\
+ * <CPU Time: 142.55u 7.17s 00:02:29.72 Elapsed: 00:02:35>
+ *
+ * Args: fp - output stream
+ * w - stopped stopwatch
+ * prefix - output line prefix ("" for nothing)
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error, such as filled disk.
+ */
+int
+esl_stopwatch_Display(FILE *fp, ESL_STOPWATCH *w, char *prefix)
+{
+ char buf[128]; /* (safely holds up to 10^14 years; I'll be dead by then) */
+
+ if (prefix == NULL) { if (fputs("CPU Time: ", fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "stopwatch display write failed"); }
+ else { if (fputs(prefix, fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "stopwatch display write failed"); }
+
+ format_time_string(buf, w->user+w->sys, TRUE);
+#ifdef HAVE_TIMES
+ if (fprintf(fp, "%.2fu %.2fs %s ", w->user, w->sys, buf) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "stopwatch display write failed");
+#else
+ if (fprintf(fp, "%.2fu %s ", w->user, buf) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "stopwatch display write failed");
+#endif
+ format_time_string(buf, w->elapsed, TRUE);
+ if (fprintf(fp, "Elapsed: %s\n", buf) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "stopwatch display write failed");
+ return eslOK;
+}
+
+
+
+/* Function: esl_stopwatch_GetElapsed()
+ * Synopsis: Return the elapsed time in seconds
+ * Incept: SRE, Fri Jan 8 10:10:37 2016
+ *
+ * Purpose: After watch <w> is Stop()'ed, calling
+ * <esl_stopwatch_GetElapsed(w)> returns the elapsed time
+ * in seconds.
+ *
+ * The resolution is system-dependent.
+ */
+double
+esl_stopwatch_GetElapsed(ESL_STOPWATCH *w)
+{
+ return w->elapsed;
+}
+
+
+/* Function: esl_stopwatch_Include()
+ *
+ * Purpose: Merge the cpu and system times from a slave into
+ * a master stopwatch. Both watches must be
+ * stopped, and should not be stopped again unless
+ * You Know What You're Doing.
+ *
+ * Elapsed time is not merged. Master is assumed
+ * to be keeping track of the wall clock (real) time,
+ * and the slave/worker watch is ignored.
+ *
+ * Useful in at least two cases. One is in
+ * PVM, where we merge in the stopwatch(es) from separate
+ * process(es) in a cluster. A second is in
+ * threads, for broken pthreads/times() implementations
+ * that lose track of cpu times used by spawned
+ * threads.
+ *
+ * Args: master - stopwatch that's aggregating times
+ * w - watch to add to the master.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_stopwatch_Include(ESL_STOPWATCH *master, ESL_STOPWATCH *w)
+{
+ master->user += w->user;
+ master->sys += w->sys;
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * Portable high resolution timing
+ *****************************************************************/
+
+/* The following code is
+ * (C) 2012 David Robert Nadeau, http://NadeauSoftware.com
+ * Creative Commons Attribution 3.0 Unported License
+ * http://creativecommons.org/licenses/by/3.0/deed.en_US
+ *
+ * Reference: http://nadeausoftware.com/articles/2012/04/c_c_tip_how_measure_elapsed_real_time_benchmarking
+ *
+ * On resolution:
+ * I believe that on Mac OS/X, the high performance timer has a resolution in units
+ * of nanoseconds (at least on some platforms, including my laptop). However, calling
+ * the esl_stopwatch_* functions themselves have overhead. The example driver is
+ * a reasonable test of the minimal resolution, including call overhead; that gives
+ * me about 0.1 microseconds (12 Jan 2016).
+ */
+#if defined(_WIN32)
+#include <Windows.h>
+
+#elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
+#include <unistd.h> /* POSIX flags */
+#include <time.h> /* clock_gettime(), time() */
+#include <sys/time.h> /* gethrtime(), gettimeofday() */
+
+#if defined(__MACH__) && defined(__APPLE__)
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+#endif
+
+#else
+#error "Unable to define getRealTime( ) for an unknown OS."
+#endif
+
+/**
+ * Returns the real time, in seconds, or -1.0 if an error occurred.
+ *
+ * Time is measured since an arbitrary and OS-dependent start time.
+ * The returned real time is only useful for computing an elapsed time
+ * between two calls to this function.
+ */
+static double
+stopwatch_getRealTime(void)
+{
+#if defined(_WIN32)
+ FILETIME tm;
+ ULONGLONG t;
+#if defined(NTDDI_WIN8) && NTDDI_VERSION >= NTDDI_WIN8
+ /* Windows 8, Windows Server 2012 and later. ---------------- */
+ GetSystemTimePreciseAsFileTime( &tm );
+#else
+ /* Windows 2000 and later. ---------------------------------- */
+ GetSystemTimeAsFileTime( &tm );
+#endif
+ t = ((ULONGLONG)tm.dwHighDateTime << 32) | (ULONGLONG)tm.dwLowDateTime;
+ return (double)t / 10000000.0;
+
+#elif (defined(__hpux) || defined(hpux)) || ((defined(__sun__) || defined(__sun) || defined(sun)) && (defined(__SVR4) || defined(__svr4__)))
+ /* HP-UX, Solaris. ------------------------------------------ */
+ return (double)gethrtime( ) / 1000000000.0;
+
+#elif defined(__MACH__) && defined(__APPLE__)
+ /* OSX. ----------------------------------------------------- */
+ static double timeConvert = 0.0;
+ if ( timeConvert == 0.0 )
+ {
+ mach_timebase_info_data_t timeBase;
+ (void)mach_timebase_info( &timeBase );
+ timeConvert = (double)timeBase.numer /
+ (double)timeBase.denom /
+ 1000000000.0;
+ }
+ return (double)mach_absolute_time( ) * timeConvert;
+
+#elif defined(_POSIX_VERSION)
+ /* POSIX. --------------------------------------------------- */
+#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0)
+ {
+ struct timespec ts;
+#if defined(CLOCK_MONOTONIC_PRECISE)
+ /* BSD. --------------------------------------------- */
+ const clockid_t id = CLOCK_MONOTONIC_PRECISE;
+#elif defined(CLOCK_MONOTONIC_RAW)
+ /* Linux. ------------------------------------------- */
+ const clockid_t id = CLOCK_MONOTONIC_RAW;
+#elif defined(CLOCK_HIGHRES)
+ /* Solaris. ----------------------------------------- */
+ const clockid_t id = CLOCK_HIGHRES;
+#elif defined(CLOCK_MONOTONIC)
+ /* AIX, BSD, Linux, POSIX, Solaris. ----------------- */
+ const clockid_t id = CLOCK_MONOTONIC;
+#elif defined(CLOCK_REALTIME)
+ /* AIX, BSD, HP-UX, Linux, POSIX. ------------------- */
+ const clockid_t id = CLOCK_REALTIME;
+#else
+ const clockid_t id = (clockid_t)-1; /* Unknown. */
+#endif /* CLOCK_* */
+ if ( id != (clockid_t)-1 && clock_gettime( id, &ts ) != -1 )
+ return (double)ts.tv_sec +
+ (double)ts.tv_nsec / 1000000000.0;
+ /* Fall thru. */
+ }
+#endif /* _POSIX_TIMERS */
+
+ /* AIX, BSD, Cygwin, HP-UX, Linux, OSX, POSIX, Solaris. ----- */
+ struct timeval tm;
+ gettimeofday( &tm, NULL );
+ return (double)tm.tv_sec + (double)tm.tv_usec / 1000000.0;
+#else
+ return -1.0; /* Failed. */
+#endif
+}
+
+
+/*****************************************************************
+ * Example of using the stopwatch module
+ *****************************************************************/
+#ifdef eslSTOPWATCH_EXAMPLE
+/*::cexcerpt::stopwatch_example::begin::*/
+/* compile: gcc -g -Wall -I. -o example -DeslSTOPWATCH_EXAMPLE esl_stopwatch.c easel.c -lm
+ * run: ./example
+ */
+#include "easel.h"
+#include "esl_stopwatch.h"
+
+int
+main(void)
+{
+ ESL_STOPWATCH *w;
+ double t = 0.;
+
+ w = esl_stopwatch_Create();
+
+ /* This tests the minimum *practical* resolution of the clock,
+ * inclusive of overhead of calling the stopwatch functions.
+ * It gives me ~0.1 usec (12 Jan 2016).
+ */
+ esl_stopwatch_Start(w);
+ while (t == 0.)
+ {
+ esl_stopwatch_Stop(w);
+ t = esl_stopwatch_GetElapsed(w);
+ }
+
+ printf("Elapsed time clock has practical resolution of around: %g sec\n", t);
+
+ esl_stopwatch_Display(stdout, w, "CPU Time: ");
+ esl_stopwatch_Destroy(w);
+ return 0;
+}
+/*::cexcerpt::stopwatch_example::end::*/
+#endif /*ESL_STOPWATCH_EXAMPLE*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
diff --git a/esl_stopwatch.h b/esl_stopwatch.h
new file mode 100644
index 0000000..06851a0
--- /dev/null
+++ b/esl_stopwatch.h
@@ -0,0 +1,61 @@
+/* Tracking cpu/system/elapsed time used by a process.
+ *
+ * SRE, Wed Feb 22 19:30:36 2006 [St. Louis] [moved to Easel]
+ * SRE, Thu Aug 3 08:00:35 2000 [St. Louis] [moved to SQUID]
+ * SRE, Fri Nov 26 14:54:21 1999 [St. Louis] [HMMER]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslSTOPWATCH_INCLUDED
+#define eslSTOPWATCH_INCLUDED
+
+#include <time.h>
+#ifdef HAVE_TIMES
+#include <sys/times.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* need for sysconf() */
+#endif
+
+typedef struct {
+#ifdef eslSTOPWATCH_HIGHRES
+ double t0; /* baseline wall time from Nadeau routine */
+#elif HAVE_TIMES
+ clock_t t0; /* baseline wall time, POSIX times() */
+#else
+ time_t t0; /* baseline wall time from ANSI time() */
+#endif
+
+#ifdef HAVE_TIMES
+ struct tms cpu0; /* baseline CPU/system time, POSIX times() */
+#else
+ clock_t cpu0; /* baseline CPU time, fallback to ANSI clock() */
+#endif
+
+ /* elapsed/user/sys are t-t0 results for the last time the
+ * watch was Stop()'ed.
+ */
+ double elapsed; /* elapsed wall time, seconds */
+ double user; /* CPU time, seconds */
+ double sys; /* system time, seconds */
+} ESL_STOPWATCH;
+
+
+extern ESL_STOPWATCH *esl_stopwatch_Create(void);
+extern void esl_stopwatch_Destroy(ESL_STOPWATCH *w);
+
+extern int esl_stopwatch_Start(ESL_STOPWATCH *w);
+extern int esl_stopwatch_Stop(ESL_STOPWATCH *w);
+extern int esl_stopwatch_Display(FILE *fp, ESL_STOPWATCH *w, char *prefix);
+
+extern double esl_stopwatch_GetElapsed(ESL_STOPWATCH *w);
+
+extern int esl_stopwatch_Include(ESL_STOPWATCH *master, ESL_STOPWATCH *w);
+
+
+#endif /*eslSTOPWATCH_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
+
diff --git a/esl_stopwatch.tex b/esl_stopwatch.tex
new file mode 100644
index 0000000..a823750
--- /dev/null
+++ b/esl_stopwatch.tex
@@ -0,0 +1,117 @@
+
+The stopwatch module measures the elapsed (wall clock) time, CPU time,
+and system time consumed by any part of a program.
+
+The simple way to measure the CPU time consumption in an ANSI C
+program is:
+
+\begin{cchunk}
+ clock_t t0, t1;
+ t0 = clock();
+ /* do_stuff */
+ t1 = clock();
+ printf("cpu time: %.2f\n", (double) (t1-t0)/(double) CLOCKS_PER_SEC);
+\end{cchunk}
+
+The stopwatch module is just an elaboration of this. It tracks
+elapsed and system time, in addition to cpu time; it hides the details
+of converting a time difference in hardware clock ticks to a
+human-interpretable time in seconds; and it provides a standard output
+function for formatting times, similar to the output of the standard
+UNIX \ccode{time} command line utility for timing processes.
+
+\begin{table}[hb]
+\begin{tabular}{ll}\hline
+\ccode{esl\_stopwatch\_Create()} & Creates new stopwatch.\\
+\ccode{esl\_stopwatch\_Destroy()} & Frees a stopwatch.\\
+\ccode{esl\_stopwatch\_Start()} & Starts a stopwatch.\\
+\ccode{esl\_stopwatch\_Stop()} & Stops a stopwatch.\\
+\ccode{esl\_stopwatch\_Display()} & Displays elapsed, cpu, and system time.\\
+\ccode{esl\_stopwatch\_Include()} & Merges a stopwatch's time into a master.\\
+\hline
+\end{tabular}
+\caption{The \eslmod{stopwatch} API.}
+\label{tbl:stopwatch_api}
+\end{table}
+
+Table~\ref{tbl:stopwatch_api} lists the functions in the API.
+
+Starting a stopwatch with \ccode{esl\_stopwatch\_Start()} initializes
+a base time, t0. Stopping a stopwatch with
+\ccode{esl\_stopwatch\_Stop()} takes the current time t1, and
+internally computes and stores elapsed, cpu, and system time
+differences (t1-t0). These stored times can be displayed at any time
+using \ccode{esl\_stopwatch\_Display()}, until the next time the watch
+is stopped. A stopwatch can be stopped any number of times, measuring
+increasing time from the same base. A stopwatch can also be started
+any number of times, resetting the base each time it is set.
+
+Figure~\ref{fig:stopwatch_example} shows a small example that measures
+a boring \ccode{sleep(5)} call, which will of course show an elapsed
+wall time of 5 seconds. Change the \ccode{sleep(5)} call to something
+cpu- or system-intensive to see a non-zero measurement of cpu or
+system time.
+
+\begin{figure}
+\input{cexcerpts/stopwatch_example}
+\caption{An example of using the \eslmod{stopwatch} module.}
+\label{fig:stopwatch_example}
+\end{figure}
+
+\subsection{Displaying and retrieving times}
+
+The \ccode{esl\_stopwatch\_Display()} function prints a line
+containing the cpu time, system time, aggregated cpu+system time, and
+the elapsed (wall clock) time. For example:
+
+\begin{cchunk}
+CPU Time: 142.55u 7.17s 00:02:29.72 Elapsed: 00:02:35
+\end{cchunk}
+
+If you want to access the times in seconds for your own purposes, the
+relevant fields in a stopped \ccode{ESL\_STOPWATCH} object are:
+
+\begin{cchunk}
+ double elapsed; /* elapsed time, seconds */
+ double user; /* CPU time, seconds */
+ double sys; /* system time, seconds */
+\end{cchunk}
+
+
+
+\subsection{Stopwatch precision and system dependency}
+
+Elapsed wall time is typically measured at low resolution, in units of
+seconds (depending on the ANSI C \ccode{time\_t} definition on your
+system). It is displayed with a precision of 1 sec.
+
+CPU time is typically measured in high resolution, in units of
+microseconds (depending on the value of POSIX \ccode{\_SC\_CLK\_TCK} or
+ANSI C \ccode{CLOCKS\_PER\_SEC} on your system). It is displayed with a
+precision of 0.01 sec.
+
+System time is only determined on systems that provide a POSIX
+\ccode{times()} function. Like CPU time, it is typically measured at
+high resolution, in units of microseconds (depending on the POSIX
+\ccode{\_SC\_CLK\_TCK} value on your system). It is displayed with a
+precision of 0.01 sec. On systems that do not provide a
+POSIX-compliant \ccode{times()} function, system time is always
+reported as 0.
+
+\subsection{Aggregate times in parallelized code}
+
+In parallelized code, you may want to aggregate results from multiple
+stopwatches into a single overall time measurement. Examples include
+aggregating times from worker processes in PVM or MPI applications, or
+aggregating times from multiple execution threads on systems where the
+\ccode{times()} function does not correctly aggregate threads for you.
+
+The \ccode{esl\_stopwatch\_Include()} function adds the cpu and system
+times in a ``client'' stopwatch to a ``master'' stopwatch. Both the
+client and the master stopwatch must be stopped. The elapsed time in
+the master stopwatch is not affected; it is assumed to be keeping
+track of the real (wall clock) time.
+
+
+
+
diff --git a/esl_stretchexp.c b/esl_stretchexp.c
new file mode 100644
index 0000000..e7f7d69
--- /dev/null
+++ b/esl_stretchexp.c
@@ -0,0 +1,693 @@
+/* Statistical routines for stretched exponential distributions.
+ *
+ * Contents:
+ * 1. Evaluating densities and distributions
+ * 2. Generic API routines: for general interface w/ histogram module
+ * 3. Dumping plots for files
+ * 4. Sampling (augmentation: random)
+ * 5. ML fitting to complete data (augmentation: minimizer)
+ * 6. ML fitting to binned data (augmentation: histogram, minimizer)
+ * 7. Test driver
+ * 8. Example
+ * 9. Copyright and license information
+ *
+ * Xrefs:
+ * STL9/146 : original implementation
+ *
+ * To-do:
+ * - Fit*() functions should return eslEINVAL on n=0, eslENORESULT
+ * on failure due to small n. Compare esl_gumbel. xref J12/93.
+ * SRE, Wed Nov 27 11:07:44 2013
+ */
+#include <esl_config.h>
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_stats.h"
+#include "esl_vectorops.h"
+#include "esl_stretchexp.h"
+
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#ifdef eslAUGMENT_HISTOGRAM
+#include "esl_histogram.h"
+#endif
+#ifdef eslAUGMENT_MINIMIZER
+#include "esl_minimizer.h"
+#endif
+
+/****************************************************************************
+ * 1. Evaluating densities and distributions
+ ****************************************************************************/
+/* mu <= x < infinity
+ * [x=mu is no problem, but watch out for evaluating log(0) when it is]
+ * lambda > 0
+ * tau > 0 [fat tailed when tau < 1; thin when tau > 1; exponential when tau = 1]
+ */
+
+/* Function: esl_sxp_pdf()
+ *
+ * Purpose: Calculates the probability density function for the
+ * stretched exponential pdf, $P(X=x)$, given
+ * quantile <x>, offset <mu>, and parameters <lambda> and <tau>.
+ */
+double
+esl_sxp_pdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x-mu);
+ double val;
+ double gt;
+
+ if (x < mu) return 0.;
+ esl_stats_LogGamma(1/tau, >);
+
+ if (x == mu) val = (lambda * tau / exp(gt));
+ else val = (lambda * tau / exp(gt)) * exp(- exp(tau * log(y)));
+
+ return val;
+}
+
+/* Function: esl_sxp_logpdf()
+ *
+ * Purpose: Calculates the log probability density function for the
+ * stretched exponential pdf, $\log P(X=x)$, given
+ * quantile <x>, offset <mu>, and parameters <lambda> and <tau>.
+ */
+double
+esl_sxp_logpdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x-mu);
+ double gt;
+ double val;
+
+ if (x < mu) return -eslINFINITY;
+ esl_stats_LogGamma(1/tau, >);
+
+ if (x == mu) val = log(lambda) + log(tau) - gt;
+ else val = log(lambda) + log(tau) - gt - exp(tau*log(y));
+ return val;
+}
+
+/* Function: esl_sxp_cdf()
+ *
+ * Purpose: Calculates the cumulative distribution function for the
+ * stretched exponential pdf, $P(X \leq x)$, given
+ * quantile <x>, offset <mu>, and parameters <lambda> and <tau>.
+ */
+double
+esl_sxp_cdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x-mu);
+ double val;
+
+ if (x <= mu) return 0.;
+ esl_stats_IncompleteGamma(1/tau, exp(tau * log(y)), &val, NULL);
+
+ ESL_DASSERT1 (( !isnan(val)));
+ return val;
+}
+
+/* Function: esl_sxp_logcdf()
+ *
+ * Purpose: Calculates the log of the cumulative distribution function for the
+ * stretched exponential pdf, $\log P(X \leq x)$, given
+ * quantile <x>, offset <mu>, and parameters <lambda> and <tau>.
+ */
+double
+esl_sxp_logcdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x-mu);
+ double val;
+
+ if (x <= mu) return -eslINFINITY;
+ esl_stats_IncompleteGamma(1./tau, exp(tau * log(y)), &val, NULL);
+ return log(val);
+}
+
+/* Function: esl_sxp_surv()
+ *
+ * Purpose: Calculates the survival function for the
+ * stretched exponential pdf, $P(X > x)$, given
+ * quantile <x>, offset <mu>, and parameters <lambda> and <tau>.
+ */
+double
+esl_sxp_surv(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x-mu);
+ double val;
+
+ if (x <= mu) return 1.0;
+
+ esl_stats_IncompleteGamma(1./tau, exp(tau * log(y)), NULL, &val);
+ return val;
+}
+
+/* Function: esl_sxp_logsurv()
+ *
+ * Purpose: Calculates the log survival function for the
+ * stretched exponential pdf, $\log P(X > x)$, given
+ * quantile <x>, offset <mu>, and parameters <lambda> and <tau>.
+ */
+double
+esl_sxp_logsurv(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x-mu);
+ double val;
+
+ if (x <= mu) return 0.0;
+
+ esl_stats_IncompleteGamma(1./tau, exp(tau * log(y)), NULL, &val);
+ return log(val);
+}
+
+/* Function: esl_sxp_invcdf()
+ *
+ * Purpose: Calculates the inverse CDF for a stretched exponential
+ * with parameters <mu>, <lambda>, and <tau>, returning
+ * the quantile <x> at which the CDF is <p>.
+ *
+ * The inverse CDF of the stretched exponential has no
+ * analytical expression as far as I'm aware. The calculation
+ * here is a computationally expensive, brute force bisection
+ * search in <x> using the CDF function. It will suffice for
+ * a small number of calls (for plotting applications, for example),
+ * but it is not sufficient for a large number of calls.
+ */
+double
+esl_sxp_invcdf(double p, double mu, double lambda, double tau)
+{
+ double x1, x2, xm; /* low, high guesses at x */
+ double f2, fm;
+ double tol = 1e-6;
+
+ x1 = mu;
+ x2 = mu + 1.;
+ do { /* bracket */
+ x2 = x2 + 2.*(x2-x1);
+ f2 = esl_sxp_cdf(x2, mu, lambda, tau);
+ } while (f2 < p);
+
+ do { /* bisection */
+ xm = (x1+x2) / 2.;
+ fm = esl_sxp_cdf(xm, mu, lambda, tau);
+
+ if (fm > p) x2 = xm;
+ else if (fm < p) x1 = xm;
+ else return xm; /* unlikely case of fm==cdf */
+ } while ( (x2-x1)/(x1+x2-2*mu) > tol);
+
+ xm = (x1+x2) / 2.;
+ return xm;
+}
+/*-------------------- end densities & distributions ------------------------*/
+
+
+
+
+/****************************************************************************
+ * 2. Generic API routines: for general interface w/ histogram module
+ ****************************************************************************/
+
+/* Function: esl_sxp_generic_pdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_sxp_pdf()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_sxp_generic_pdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_sxp_pdf(x, p[0], p[1], p[2]);
+}
+
+/* Function: esl_sxp_generic_cdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_sxp_cdf()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_sxp_generic_cdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_sxp_cdf(x, p[0], p[1], p[2]);
+}
+
+/* Function: esl_sxp_generic_surv()
+ *
+ * Purpose: Generic-API wrapper around <esl_sxp_surv()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_sxp_generic_surv(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_sxp_surv(x, p[0], p[1], p[2]);
+}
+
+/* Function: esl_sxp_generic_invcdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_sxp_invcdf()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_sxp_generic_invcdf(double p, void *params)
+{
+ double *v = (double *) params;
+ return esl_sxp_invcdf(p, v[0], v[1], v[2]);
+}
+/*------------------------ end generic API ---------------------------------*/
+
+
+
+/****************************************************************************
+ * 3. Dumping plots for files
+ ****************************************************************************/
+
+/* Function: esl_sxp_Plot()
+ *
+ * Purpose: Plot some stretched exponential function <func> (for instance,
+ * <esl_sxp_pdf()>) for parameters <mu>, <lambda>, and <tau>, for
+ * a range of quantiles x from <xmin> to <xmax> in steps of <xstep>;
+ * output to an open stream <fp> in xmgrace XY input format.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error, such as filled disk.
+ */
+int
+esl_sxp_Plot(FILE *fp, double mu, double lambda, double tau,
+ double (*func)(double x, double mu, double lambda, double tau),
+ double xmin, double xmax, double xstep)
+{
+ double x;
+ for (x = xmin; x <= xmax; x += xstep)
+ if (fprintf(fp, "%f\t%g\n", x, (*func)(x, mu, lambda, tau)) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "stretchexp plot write failed");
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "stretchexp plot write failed");
+ return eslOK;
+}
+/*-------------------- end plot dumping routines ---------------------------*/
+
+
+
+
+/****************************************************************************
+ * 4. Sampling (augmentation: random)
+ ****************************************************************************/
+#ifdef eslAUGMENT_RANDOM
+/* Function: esl_sxp_Sample()
+ *
+ * Purpose: Sample a stretched exponential random variate,
+ * by a change of variable from a Gamma sample.
+ */
+double
+esl_sxp_Sample(ESL_RANDOMNESS *r, double mu, double lambda, double tau)
+{
+ double t,x;
+
+ t = esl_rnd_Gamma(r, 1./tau);
+ x = mu + 1./lambda * exp(1./tau * log(t));
+ return x;
+}
+#endif /*eslAUGMENT_RANDOM*/
+/*--------------------------- end sampling ---------------------------------*/
+
+
+
+/****************************************************************************
+ * 5. ML fitting to complete data (augmentation: minimizer)
+ ****************************************************************************/
+#ifdef eslAUGMENT_MINIMIZER
+/* This structure is used to sneak the data into minimizer's generic
+ * (void *) API for all aux data
+ */
+struct sxp_data {
+ double *x;
+ int n;
+ double mu;
+};
+
+static double
+sxp_complete_func(double *p, int np, void *dptr)
+{
+ struct sxp_data *data = (struct sxp_data *) dptr;
+ double lambda, tau;
+ double logL = 0.;
+ int i;
+
+ lambda = exp(p[0]);
+ tau = exp(p[1]);
+
+ for (i = 0; i < data->n; i++)
+ logL += esl_sxp_logpdf(data->x[i], data->mu, lambda, tau);
+ return -logL;
+}
+
+/* Function: esl_sxp_FitComplete()
+ *
+ * Purpose: Given a vector of <n> observed data samples <x[]>,
+ * find maximum likelihood parameters by conjugate gradient
+ * descent optimization.
+ */
+int
+esl_sxp_FitComplete(double *x, int n,
+ double *ret_mu, double *ret_lambda, double *ret_tau)
+
+{
+ struct sxp_data data;
+ double p[2], u[2], wrk[8];
+ double mu, tau, lambda;
+ double mean;
+ double tol = 1e-6;
+ double fx;
+ int status;
+
+ /* initial guesses; mu is definitely = minimum x,
+ * and just use arbitrary #'s to init lambda, tau
+ */
+ mu = esl_vec_DMin(x, n);
+ esl_stats_DMean(x, n, &mean, NULL);
+ lambda = 1 / (mean - mu);
+ tau = 0.9;
+
+
+ /* load data structure, param vector, and step vector */
+ data.x = x;
+ data.n = n;
+ data.mu = mu;
+ p[0] = log(lambda);
+ p[1] = log(tau);
+ u[0] = 1.0;
+ u[1] = 1.0;
+
+ /* hand it off */
+ status = esl_min_ConjugateGradientDescent(p, u, 2,
+ &sxp_complete_func,
+ NULL,
+ (void *) (&data), tol, wrk, &fx);
+ *ret_mu = mu;
+ *ret_lambda = exp(p[0]);
+ *ret_tau = exp(p[1]);
+ return status;
+}
+#endif /*eslAUGMENT_MINIMIZER*/
+
+
+/****************************************************************************
+ * 6. ML fitting to binned data (augmentation: histogram, minimizer)
+ ****************************************************************************/
+#ifdef eslAUGMENT_HISTOGRAM
+#ifdef eslAUGMENT_MINIMIZER
+struct sxp_binned_data {
+ ESL_HISTOGRAM *g; /* contains the binned data */
+ double mu; /* mu is not a learnable param */
+};
+
+static double
+sxp_complete_binned_func(double *p, int np, void *dptr)
+{
+ struct sxp_binned_data *data = (struct sxp_binned_data *) dptr;
+ ESL_HISTOGRAM *g = data->g;
+ double logL = 0.;
+ double ai, bi; /* lower, upper bounds on bin */
+ double lambda, tau;
+ int i;
+ double tmp;
+
+ lambda = exp(p[0]);
+ tau = exp(p[1]);
+
+ ESL_DASSERT1(( ! isnan(lambda) ));
+ ESL_DASSERT1(( ! isnan(tau) ));
+
+ for (i = g->cmin; i <= g->imax; i++) /* for each occupied bin */
+ {
+ if (g->obs[i] == 0) continue;
+
+ ai = esl_histogram_Bin2LBound(g, i);
+ bi = esl_histogram_Bin2UBound(g, i);
+ if (ai < data->mu) ai = data->mu; /* careful at leftmost bound */
+
+ tmp = esl_sxp_cdf(bi, data->mu, lambda, tau) -
+ esl_sxp_cdf(ai, data->mu, lambda, tau);
+ if (tmp == 0.) return eslINFINITY;
+ logL += g->obs[i] * log(tmp);
+ }
+ return -logL; /* minimizing NLL */
+}
+
+/* Function: esl_sxp_FitCompleteBinned()
+ *
+ * Purpose: Given a histogram <g> with binned observations, where each
+ * bin i holds some number of observed samples x with values from
+ * lower bound l to upper bound u (that is, $l < x \leq u$);
+ * find maximum likelihood parameters mu, lambda, tau by conjugate
+ * gradient descent optimization.
+ */
+int
+esl_sxp_FitCompleteBinned(ESL_HISTOGRAM *g,
+ double *ret_mu, double *ret_lambda, double *ret_tau)
+
+{
+ struct sxp_binned_data data;
+ double p[2], u[2], wrk[8];
+ double mu, tau, lambda;
+ double tol = 1e-6;
+ double fx;
+ int status;
+ double ai, mean;
+ int i;
+
+ /* Set the fixed mu.
+ * Make a good initial guess of lambda, based on exponential fit.
+ * Choose an arbitrary tau.
+ */
+ if (g->is_tailfit) mu = g->phi; /* all x > mu in this case */
+ else if (g->is_rounded) mu = esl_histogram_Bin2LBound(g, g->imin);
+ else mu = g->xmin;
+
+ mean = 0.;
+ for (i = g->cmin; i <= g->imax; i++)
+ {
+ ai = esl_histogram_Bin2LBound(g, i);
+ ai += 0.5*g->w; /* midpoint in bin */
+ mean += (double)g->obs[i] * ai;
+ }
+ mean /= g->No;
+ lambda = 1 / (mean - mu);
+
+ tau = 0.9;
+
+ /* load data structure, param vector, and step vector */
+ data.g = g;
+ data.mu = mu;
+ p[0] = log(lambda);
+ p[1] = log(tau);
+ u[0] = 1.0;
+ u[1] = 1.0;
+
+ /* hand it off */
+ status = esl_min_ConjugateGradientDescent(p, u, 2,
+ &sxp_complete_binned_func,
+ NULL,
+ (void *) (&data), tol, wrk, &fx);
+ *ret_mu = mu;
+ *ret_lambda = exp(p[0]);
+ *ret_tau = exp(p[1]);
+ return status;
+}
+#endif /*eslAUGMENT_HISTOGRAM*/
+#endif /*eslAUGMENT_MINIMIZER*/
+
+
+
+
+/****************************************************************************
+ * 7. Test driver
+ ****************************************************************************/
+#ifdef eslSTRETCHEXP_TESTDRIVE
+/* gcc -g -Wall -I. -L . -o stretchexp_utest -DeslSTRETCHEXP_TESTDRIVE esl_stretchexp.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_stretchexp.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgrp */
+ {"-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show help and usage", 0},
+ {"-l", eslARG_REAL, "1.0", NULL,"x>0", NULL, NULL, NULL, "set lambda param to <x>", 0},
+ {"-m", eslARG_REAL, "10.0", NULL, NULL, NULL, NULL, NULL, "set mu param to <x>", 0},
+ {"-n", eslARG_INT, "10000", NULL,"n>0", NULL, NULL, NULL, "set number of samples to <n>", 0},
+ {"-o", eslARG_OUTFILE, NULL, NULL, NULL, NULL, NULL, NULL, "save plots to file <f>", 0},
+ {"-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0},
+ {"-t", eslARG_REAL, "0.7", NULL,"x>0", NULL, NULL, NULL, "set tau param to <x>", 0},
+ {"-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show verbose output", 0},
+ {"-w", eslARG_REAL, "0.1", NULL,"x>0", NULL, NULL, NULL, "set width of histogram bins to <x>",0},
+ {"--C", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "plot CDF", 0},
+ {"--LC",eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "plot log CDF", 0},
+ {"--P", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "plot PDF", 0},
+ {"--LP",eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "plot log PDF", 0},
+ {"--S", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "plot survival", 0},
+ {"--LS",eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "plot log survival", 0},
+ {"--XL",eslARG_NONE, NULL, NULL, NULL, NULL, NULL, NULL, "set xmin for plot axis", 0},
+ {"--XH",eslARG_NONE, NULL, NULL, NULL, NULL, NULL, NULL, "set xmax for plot axis", 0},
+ {"--XS",eslARG_NONE, NULL, NULL, NULL, NULL, NULL, NULL, "set xstep for plot axis", 0},
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for random module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ double mu = esl_opt_GetReal(go, "-m");
+ double lambda = esl_opt_GetReal(go, "-l");
+ double tau = esl_opt_GetReal(go, "-t");
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ ESL_HISTOGRAM *h = esl_histogram_CreateFull(mu, 100., esl_opt_GetReal(go, "-w"));;
+ int n = esl_opt_GetInteger(go, "-n");
+ int be_verbose = esl_opt_GetBoolean(go, "-v");
+ char *plotfile = esl_opt_GetString(go, "-o");
+ FILE *pfp = stdout;
+ int plot_pdf = esl_opt_GetBoolean(go, "--P");
+ int plot_logpdf = esl_opt_GetBoolean(go, "--LP");
+ int plot_cdf = esl_opt_GetBoolean(go, "--C");
+ int plot_logcdf = esl_opt_GetBoolean(go, "--LC");
+ int plot_surv = esl_opt_GetBoolean(go, "--S");
+ int plot_logsurv = esl_opt_GetBoolean(go, "--LS");
+ double xmin = esl_opt_IsOn(go, "--XL") ? esl_opt_GetReal(go, "--XL") : mu;
+ double xmax = esl_opt_IsOn(go, "--XH") ? esl_opt_GetReal(go, "--XH") : mu+40*(1./lambda);
+ double xstep = esl_opt_IsOn(go, "--XS") ? esl_opt_GetReal(go, "--XS") : 0.1;
+ double emu, elambda, etau;
+ int i;
+ double x;
+ double *data;
+ int ndata;
+
+ if (be_verbose)
+ printf("Parametric: mu = %f lambda = %f tau = %f\n", mu, lambda, tau);
+
+ if (plotfile != NULL) {
+ if ((pfp = fopen(plotfile, "w")) == NULL)
+ esl_fatal("Failed to open plotfile");
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ x = esl_sxp_Sample(r, mu, lambda, tau);
+ esl_histogram_Add(h, x);
+ }
+ esl_histogram_GetData(h, &data, &ndata);
+
+ esl_sxp_FitComplete(data, ndata, &emu, &elambda, &etau);
+ if (be_verbose)
+ printf("Complete data fit: mu = %f lambda = %f tau = %f\n",
+ emu, elambda, etau);
+ if (fabs( (emu-mu)/mu ) > 0.01) esl_fatal("Error in (complete) fitted mu > 1%\n");
+ if (fabs( (elambda-lambda)/lambda ) > 0.10) esl_fatal("Error in (complete) fitted lambda > 10%\n");
+ if (fabs( (etau-tau)/tau ) > 0.10) esl_fatal("Error in (complete) fitted tau > 10%\n");
+
+ esl_sxp_FitCompleteBinned(h, &emu, &elambda, &etau);
+ if (be_verbose)
+ printf("Binned data fit: mu = %f lambda = %f tau = %f\n",
+ emu, elambda, etau);
+ if (fabs( (emu-mu)/mu ) > 0.01) esl_fatal("Error in (binned) fitted mu > 1%\n");
+ if (fabs( (elambda-lambda)/lambda ) > 0.10) esl_fatal("Error in (binned) fitted lambda > 10%\n");
+ if (fabs( (etau-tau)/tau ) > 0.10) esl_fatal("Error in (binned) fitted tau > 10%\n");
+
+ if (plot_pdf) esl_sxp_Plot(pfp, mu, lambda, tau, &esl_sxp_pdf, xmin, xmax, xstep);
+ if (plot_logpdf) esl_sxp_Plot(pfp, mu, lambda, tau, &esl_sxp_logpdf, xmin, xmax, xstep);
+ if (plot_cdf) esl_sxp_Plot(pfp, mu, lambda, tau, &esl_sxp_cdf, xmin, xmax, xstep);
+ if (plot_logcdf) esl_sxp_Plot(pfp, mu, lambda, tau, &esl_sxp_logcdf, xmin, xmax, xstep);
+ if (plot_surv) esl_sxp_Plot(pfp, mu, lambda, tau, &esl_sxp_surv, xmin, xmax, xstep);
+ if (plot_logsurv) esl_sxp_Plot(pfp, mu, lambda, tau, &esl_sxp_logsurv, xmin, xmax, xstep);
+
+ if (plotfile != NULL) fclose(pfp);
+ esl_histogram_Destroy(h);
+ esl_randomness_Destroy(r);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /*eslSTRETCHEXP_TESTDRIVE*/
+
+/****************************************************************************
+ * Example main()
+ ****************************************************************************/
+#ifdef eslSTRETCHEXP_EXAMPLE
+/*::cexcerpt::sxp_example::begin::*/
+/* compile:
+ gcc -g -Wall -I. -o example -DeslSTRETCHEXP_EXAMPLE\
+ -DeslAUGMENT_HISTOGRAM -DeslAUGMENT_RANDOM -DeslAUGMENT_MINIMIZER\
+ esl_stretchexp.c esl_histogram.c esl_random.c esl_minimizer.c esl_stats.c esl_vectorops.c easel.c -lm
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_stretchexp.h"
+
+int
+main(int argc, char **argv)
+{
+ double mu = -50.0;
+ double lambda = 2.5;
+ double tau = 0.7;
+ ESL_HISTOGRAM *h = esl_histogram_CreateFull(mu, 100., 0.1);
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ int n = 10000;
+ double *data;
+ int ndata;
+ double emu, elam, etau;
+ int i;
+ double x;
+
+ for (i = 0; i < n; i++)
+ {
+ x = esl_sxp_Sample(r, mu, lambda, tau);
+ esl_histogram_Add(h, x);
+ }
+ esl_histogram_GetData(h, &data, &ndata);
+
+ /* Plot the empirical (sampled) and expected survivals */
+ esl_histogram_PlotSurvival(stdout, h);
+ esl_sxp_Plot(stdout, mu, lambda, tau,
+ &esl_sxp_surv, h->xmin, h->xmax, 0.1);
+
+ /* ML fit to complete data, and plot fitted survival curve */
+ esl_sxp_FitComplete(data, ndata, &emu, &elam, &etau);
+ esl_sxp_Plot(stdout, emu, elam, etau,
+ &esl_sxp_surv, h->xmin, h->xmax, 0.1);
+
+ /* ML fit to binned data, plot fitted survival curve */
+ esl_sxp_FitCompleteBinned(h, &emu, &elam, &etau);
+ esl_sxp_Plot(stdout, emu, elam, etau,
+ &esl_sxp_surv, h->xmin, h->xmax, 0.1);
+
+ esl_randomness_Destroy(r);
+ esl_histogram_Destroy(h);
+ return 0;
+}
+/*::cexcerpt::sxp_example::end::*/
+#endif /*eslSTRETCHEXP_EXAMPLE*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_stretchexp.h b/esl_stretchexp.h
new file mode 100644
index 0000000..2caeed1
--- /dev/null
+++ b/esl_stretchexp.h
@@ -0,0 +1,52 @@
+/* Stretched exponential distributions.
+ *
+ * SRE, Fri Aug 19 13:51:14 2005 [St. Louis] [xref STL9/146]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslSTRETCHEXP_INCLUDED
+#define eslSTRETCHEXP_INCLUDED
+
+#ifdef eslAUGMENT_RANDOM
+#include <esl_random.h>
+#endif
+#ifdef eslAUGMENT_HISTOGRAM
+#include <esl_histogram.h>
+#endif
+
+extern double esl_sxp_pdf (double x, double mu, double lambda, double tau);
+extern double esl_sxp_logpdf (double x, double mu, double lambda, double tau);
+extern double esl_sxp_cdf (double x, double mu, double lambda, double tau);
+extern double esl_sxp_logcdf (double x, double mu, double lambda, double tau);
+extern double esl_sxp_surv (double x, double mu, double lambda, double tau);
+extern double esl_sxp_logsurv(double x, double mu, double lambda, double tau);
+extern double esl_sxp_invcdf (double p, double mu, double lambda, double tau);
+
+extern double esl_sxp_generic_pdf (double x, void *params);
+extern double esl_sxp_generic_cdf (double x, void *params);
+extern double esl_sxp_generic_surv (double x, void *params);
+extern double esl_sxp_generic_invcdf(double p, void *params);
+
+extern int esl_sxp_Plot(FILE *fp, double mu, double lambda, double tau,
+ double (*func)(double x, double mu, double lambda, double tau),
+ double xmin, double xmax, double xstep);
+
+
+#ifdef eslAUGMENT_RANDOM
+extern double esl_sxp_Sample(ESL_RANDOMNESS *r, double mu, double lambda, double tau);
+#endif
+
+#ifdef eslAUGMENT_MINIMIZER
+extern int esl_sxp_FitComplete(double *x, int n,
+ double *ret_mu, double *ret_lambda, double *ret_tau);
+#ifdef eslAUGMENT_HISTOGRAM
+extern int esl_sxp_FitCompleteBinned(ESL_HISTOGRAM *g,
+ double *ret_mu, double *ret_lambda, double *ret_tau);
+#endif /*eslAUGMENT_HISTOGRAM*/
+#endif /*eslAUGMENT_MINIMIZER*/
+
+
+#endif /*eslSTRETCHEXP_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_stretchexp.tex b/esl_stretchexp.tex
new file mode 100644
index 0000000..b577b0e
--- /dev/null
+++ b/esl_stretchexp.tex
@@ -0,0 +1,41 @@
+
+The stretched exponential distribution may be useful for fitting
+fat-tailed empirical distributions.
+
+The stretched exponential has a similar functional form as the Weibull
+distribution, and the Weibull is confusingly sometimes referred to as
+a ``stretched exponential distribution'' in the literature, but they
+are not the same. (See the \eslmod{weibull} module.)
+
+\begin{tabular}{lcll}\hline
+Variate & $x$ & \ccode{double} & $\mu \leq x < \infty$ \\
+Location & $\mu$ & \ccode{double} & $-\infty < \mu < \infty$\\
+Scale & $\lambda$ & \ccode{double} & $\lambda > 0$ \\
+Shape & $\tau$ & \ccode{double} & $\tau > 0$ \\ \hline
+\end{tabular}
+
+The probability density function (PDF) is:
+
+\begin{equation}
+P(X=x) = \frac{\lambda \tau}{\Gamma(\frac{1}{\tau})} e^{- [\lambda(x-\mu)]^{\tau}}
+\label{eqn:stretchexp_pdf}
+\end{equation}
+
+The cumulative distribution function (CDF) does not have an analytical
+expression. It is obtained from the integral:
+
+\begin{eqnarray*}
+P(X \leq x) & = & \int_{\mu}^{x} P(X=z) dz\\
+ & = & \frac{\lambda \tau}{\Gamma(\frac{1}{\tau})} \int_\mu^{x} e^{- [\lambda(z-\mu)]^{\tau}} dz\\
+\label{eqn:stretchexp_cdf1}
+\end{eqnarray*}
+
+By change-of-variables $t = [\lambda(z-\mu)]^{\tau}$,
+$t^{\frac{1}{\tau}} = \lambda(z-\mu)$, $dz = \frac{1}{\lambda \tau}
+t^{\frac{1}{\tau}-1} dt$, this can be rewritten as:
+
+\[
+P(X \leq x) = \frac{1}{\Gamma(\frac{1}{\tau})}
+\int_0^{[\lambda(x-\mu)]^{\tau}} e^{-t} t^{\frac{1}{\tau}-1} dt
+\]
+
diff --git a/esl_swat.c b/esl_swat.c
new file mode 100644
index 0000000..4270c92
--- /dev/null
+++ b/esl_swat.c
@@ -0,0 +1,225 @@
+/* This module is unfinished; don't try to use it for anything! */
+
+
+/* Standard Smith/Waterman sequence alignment
+ *
+ * Contents:
+ *
+ *
+ */
+#include "esl_config.h"
+
+#include "easel.h"
+#include "esl_composition.h"
+#include "esl_scorematrix.h"
+
+#define eslSWAT_PROHIBIT -999999999
+
+/* Function: esl_swat_Score()
+ * Incept: SRE, Fri Apr 13 16:40:15 2007 [Janelia]
+ *
+ * Purpose: Implements Smith/Waterman local sequence alignment, recovering
+ * only a score, not an alignment. Query sequence <x> of length <L>
+ * is aligned to subject sequence <y> of length <M>, using
+ * a scoring system composed of residue alignment scores in matrix
+ * <S>, a gap-open score <gop>, and a gap-extend score <gex>.
+ *
+ * A gap of $k$ residues is scored as <gop> $\times (k-1)$
+ * <gex>. That is, the gap-open score is applied to the
+ * first residue in the gap, and the gap-extend penalty is
+ * applied to each remaining residue. Additionally, both
+ * <gop> and <gex> should be negative numbers.
+ *
+ * Returns: <eslOK> on success, and the raw alignment score is returned in
+ * <ret_sc>.
+ *
+ * Throws: (no abnormal error conditions)
+ */
+int
+esl_swat_Score(ESL_DSQ *x, int L, ESL_DSQ *y, int M, ESL_SCOREMATRIX *S, int gop, int gex, int *ret_sc)
+{
+ int status;
+ int i,j;
+ int **rowmem = NULL;
+ int *mc, *mp, *ixc, *ixp, *iyc, *iyp;
+ int maxsc;
+
+ /* DP lattice is organized in rows (0) 1..i..M with target running vertically;
+ * columns (0) 1..j..L with query running horizontally.
+ */
+
+ /* Allocation;
+ * we need two rows of length (L+1) for each of three matrices, M, IX, IY.
+ * in the future, optimize by providing this from the caller.
+ */
+ ESL_ALLOC(rowmem, sizeof(int *) * 6);
+ rowmem[0] = NULL;
+ ESL_ALLOC(rowmem[0], sizeof(int) * 6 * (L+1));
+ for (i = 1; i < 6; i++) rowmem[i] = rowmem[0] + i*(L+1);
+
+ /* Initializations.
+ */
+ rowmem[1][0] = 0;
+ rowmem[3][0] = eslSWAT_PROHIBIT;
+ rowmem[5][0] = eslSWAT_PROHIBIT;
+ for (j = 0; j <= L; j++) {
+ rowmem[0][j] = 0;
+ rowmem[2][j] = eslSWAT_PROHIBIT;
+ rowmem[4][j] = eslSWAT_PROHIBIT;
+ }
+
+ maxsc = 0;
+ for (i = 1; i <= M; i++) /* for each position in target... */
+ {
+ if (i%2) { mp = rowmem[0]; mc = rowmem[1]; ixp = rowmem[2]; ixc = rowmem[3]; iyp = rowmem[4]; iyc = rowmem[5]; }
+ else { mc = rowmem[0]; mp = rowmem[1]; ixc = rowmem[2]; ixp = rowmem[3]; iyc = rowmem[4]; iyp = rowmem[5]; }
+
+ for (j = 1; j <= L; j++) /* for each position in query... */
+ {
+ /* Match score at mc[j] aligns xj,yi. We can reach here from M (mp[j-1]), IX (ixp[j-1]), or IY (iyp[j-1]) */
+ mc[j] = 0;
+ if (mp[j-1] > mc[j]) mc[j] = mp[j-1];
+ if (ixp[j-1] > mc[j]) mc[j] = ixp[j-1];
+ if (iyp[j-1] > mc[j]) mc[j] = iyp[j-1];
+ mc[j] += S->s[x[j]][y[i]];
+
+ if (mc[j] > maxsc) maxsc = mc[j];
+
+ /* IX score at ixc[j] aligns xj to gap (horizontal move).
+ * We reach here from mc[j-1] (gap-open) or ixc[j-1] (gap-extend).
+ */
+ ixc[j] = mc[j-1] + gop;
+ if (ixc[j-1] + gex > ixc[j]) ixc[j] = ixc[j-1] + gex;
+
+ /* analogously for vertical move to iyc. */
+ iyc[j] = mp[j] + gop;
+ if (iyp[j] + gex > iyc[j]) iyc[j] = iyp[j] + gex;
+ }
+ }
+
+ *ret_sc = maxsc;
+ free(rowmem[0]);
+ free(rowmem);
+ return eslOK;
+
+ ERROR:
+ *ret_sc = 0;
+ if (rowmem != NULL) {
+ if (rowmem[0] != NULL) free(rowmem[0]);
+ free(rowmem);
+ }
+ return status;
+}
+
+
+/*****************************************************************
+ * Stats driver.
+ *****************************************************************/
+
+/*
+ gcc -I. -L. -g -Wall -DeslSWAT_STATS -o stats esl_swat.c -leasel -lm
+ ./stats
+*/
+#ifdef eslSWAT_STATS
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_fileparser.h"
+#include "esl_scorematrix.h"
+#include "esl_random.h"
+#include "esl_randomseq.h"
+#include "esl_histogram.h"
+
+int
+main(int argc, char **argv)
+{
+ int status;
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ ESL_ALPHABET *abc = esl_alphabet_Create(eslAMINO);
+ ESL_SCOREMATRIX *S = NULL;
+ ESL_DSQ *x = NULL; /* iid query */
+ ESL_DSQ *y = NULL; /* iid target */
+ double lambda;
+ double bg[20]; /* iid background probabilities */
+ int L; /* query length */
+ int M; /* target length */
+ int nseq; /* number of target seqs to simulate */
+ int i;
+ int gop;
+ int gex;
+ char *mxfile = "PMX";
+ int raw_sc;
+
+ /* Configuration
+ */
+ L = 400; /* query length */
+ M = 400; /* target length */
+ nseq = 50000;
+ gop = -11;
+ gex = -1;
+ lambda = 0.3207;
+
+ ESL_ALLOC(x, sizeof(ESL_DSQ) * (L+2));
+ ESL_ALLOC(y, sizeof(ESL_DSQ) * (M+2));
+
+ /* Input an amino acid score matrix from a file. */
+ if (mxfile != NULL) {
+ ESL_FILEPARSER *efp = NULL;
+ if ( esl_fileparser_Open(mxfile, NULL, &efp) != eslOK) esl_fatal("failed to open score file %s", mxfile);
+ if ( esl_scorematrix_Read(efp, abc, &S) != eslOK) esl_fatal("failed to read matrix from %s", mxfile);
+ esl_fileparser_Close(efp);
+ } else { /* default = BLOSUM62 */
+ S = esl_scorematrix_Create(abc);
+ esl_scorematrix_Set("BLOSUM62", S);
+ }
+ esl_composition_BL62(bg);
+
+ esl_rsq_xIID(r, bg, 20, L, x);
+
+ for (i = 0; i < nseq; i++)
+ {
+ esl_rsq_xIID(r, bg, 20, M, y);
+ esl_swat_Score(x, L, y, M, S, gop, gex, &raw_sc);
+ printf("%d\n", raw_sc);
+ }
+
+ free(x);
+ free(y);
+ esl_scorematrix_Destroy(S);
+ esl_alphabet_Destroy(abc);
+ esl_randomness_Destroy(r);
+ exit(0);
+
+ ERROR:
+ exit(status);
+}
+
+
+
+
+
+
+#endif /*eslSWAT_STATS*/
+
+
+/*****************************************************************
+ * Unit tests
+ *****************************************************************/
+
+void
+utest_Score(char *s1, char *s2, ESL_SCOREMATRIX *S, int gop, int gex, int expect_score)
+{
+
+}
+
+
+
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_swat.tex b/esl_swat.tex
new file mode 100644
index 0000000..9042b44
--- /dev/null
+++ b/esl_swat.tex
@@ -0,0 +1 @@
+The \eslmod{swat} module implements Smith/Waterman local sequence alignment.
diff --git a/esl_threads.c b/esl_threads.c
new file mode 100644
index 0000000..5627c35
--- /dev/null
+++ b/esl_threads.c
@@ -0,0 +1,434 @@
+/* Simple master/worker data parallelization using POSIX threads.
+ *
+ * Contents:
+ * 1. The <ESL_THREADS> object: a gang of workers.
+ * 2. Determining thread number to use.
+ * 3. Examples.
+ * 4. Copyright and license.
+ */
+#include "esl_config.h"
+
+#ifdef HAVE_PTHREAD
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_PARAM_H /* On OpenBSD, sys/sysctl.h requires sys/param.h */
+#include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include "easel.h"
+#include "esl_threads.h"
+
+
+/*****************************************************************
+ *# 1. The <ESL_THREADS> object: a gang of workers.
+ *****************************************************************/
+
+/* Function: esl_threads_Create()
+ * Synopsis: Create a threads object.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Creates an <ESL_THREADS> object, for organizing
+ 8 a bunch of worker threads that will all run
+ * the worker function <fnptr>. This object is a shell
+ * for now; the worker threads themselves are
+ * created individually with <esl_threads_AddThread()>.
+ *
+ * Returns: ptr to the new <ESL_THREADS> object.
+ *
+ * Throws: <NULL> on allocation or initialization failure.
+ */
+ESL_THREADS *
+esl_threads_Create(void (*fnptr)(void *))
+{
+ ESL_THREADS *obj = NULL;
+ int status;
+
+ ESL_ALLOC(obj, sizeof(ESL_THREADS));
+
+ obj->threadCount = 0;
+ obj->threadId = NULL;
+ obj->data = NULL;
+ obj->startThread = 0;
+ obj->func = fnptr;
+
+ if (pthread_mutex_init(&obj->startMutex, NULL) != 0) ESL_XEXCEPTION(eslESYS, "mutex init failed");
+ if (pthread_cond_init (&obj->startCond, NULL) != 0) ESL_XEXCEPTION(eslESYS, "cond init failed");
+ return obj;
+
+ ERROR:
+ return NULL;
+}
+
+/* Function: esl_threads_Destroy()
+ * Synopsis: Destroys an <ESL_THREADS> object.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Frees an <ESL_THREADS> object.
+ *
+ * The caller routine must first free the
+ * contents of each <obj->data[]>.
+ *
+ * Returns: void
+ */
+void
+esl_threads_Destroy(ESL_THREADS *obj)
+{
+ if (obj == NULL) return;
+
+ if (obj->threadId != NULL) free(obj->threadId);
+ if (obj->data != NULL) free(obj->data);
+ pthread_mutex_destroy(&obj->startMutex);
+ pthread_cond_destroy (&obj->startCond);
+ free(obj);
+ return;
+}
+
+/* Function: esl_threads_AddThread()
+ * Synopsis: Add a worker thread to the <ESL_THREADS> object.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Create a new worker thread for the <ESL_THREADS> object,
+ * assigning it the work unit pointed to by <data>.
+ *
+ * The caller remains responsible for any memory allocated
+ * to <data>; the <ESL_THREADS> object will only manage
+ * a copy of a pointer to <data>.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslESYS> if thread creation fails.
+ * <eslEINVAL> if something's wrong with the <obj>.
+ */
+int
+esl_threads_AddThread(ESL_THREADS *obj, void *data)
+{
+ int status;
+ void *p;
+
+ if (obj == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid thread object");
+
+ /* allocate inside the ESL_THREADS object to hold another worker */
+ ESL_RALLOC(obj->threadId, p, sizeof(pthread_t) * (obj->threadCount+1));
+ ESL_RALLOC(obj->data, p, sizeof(void *) * (obj->threadCount+1));
+
+ obj->data[obj->threadCount] = data;
+ if (pthread_create(&(obj->threadId[obj->threadCount]), NULL, (void *(*)(void *)) obj->func, obj) != 0) ESL_EXCEPTION(eslESYS, "thread creation failed");
+ obj->threadCount++;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_threads_GetWorkerCount()
+ * Synopsis: Return the total number of worker threads.
+ * Incept: SRE, Fri Aug 21 13:22:52 2009 [Janelia]
+ *
+ * Purpose: Returns the total number of worker threads.
+ */
+int
+esl_threads_GetWorkerCount(ESL_THREADS *obj)
+{
+ return obj->threadCount;
+}
+
+
+/* Function: esl_threads_WaitForStart()
+ * Synopsis: Blocks master until all workers have started.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Make the master thread wait until all the worker threads have
+ * started. When all the worker threads have started and
+ * are blocking at the start mutex, release them.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> if thread synchronization fails somewhere.
+ * <eslEINVAL> if something is awry with <obj>.
+ */
+int
+esl_threads_WaitForStart(ESL_THREADS *obj)
+{
+ if (obj == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid thread object");
+
+ if (pthread_mutex_lock (&obj->startMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex lock failed");
+
+ /* wait for all worker threads to start */
+ while (obj->startThread < obj->threadCount) {
+ if (pthread_cond_wait(&obj->startCond, &obj->startMutex) != 0) ESL_EXCEPTION(eslESYS, "wait cond failed");
+ }
+
+ /* release all the worker threads */
+ obj->startThread = 0;
+ if (pthread_cond_broadcast(&obj->startCond) != 0) ESL_EXCEPTION(eslESYS, "cond broadcast failed");
+ if (pthread_mutex_unlock (&obj->startMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex unlock failed");
+ return eslOK;
+}
+
+/* Function: esl_threads_WaitForFinish()
+ * Synopsis: Blocks master until all workers have completed.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Block the master thread until all the worker threads have
+ * completed. As each worker completes, remove it from the
+ * <obj>.
+ *
+ * Upon exit, the <obj> is returned to the same (empty)
+ * state it was in after it was created. It may be reused
+ * for a new problem by adding new workers.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> if thread synchronization fails somewhere.
+ * <eslEINVAL> if something is awry with <obj>.
+ */
+int
+esl_threads_WaitForFinish(ESL_THREADS *obj)
+{
+ int w;
+
+ if (obj == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid thread object");
+
+ /* wait for all worker threads to complete */
+ for (w = obj->threadCount-1; w >= 0; w--)
+ {
+ if (pthread_join(obj->threadId[w], NULL) != 0) ESL_EXCEPTION(eslESYS, "pthread join failed");
+ obj->threadCount--;
+ }
+
+ return eslOK;
+}
+
+/* Function: esl_threads_Started()
+ * Synopsis: Blocks worker until master gives the start signal.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Block a worker thread until master sees that all workers
+ * have started and gives the start signal. Assign the worker
+ * a unique number (0..nworkers-1), and return it in
+ * <*ret_workeridx>. The worker uses this index to
+ * retrieve its work units.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> if thread synchronization fails somewhere.
+ * <eslEINVAL> if something is awry with <obj>.
+ */
+int
+esl_threads_Started(ESL_THREADS *obj, int *ret_workeridx)
+{
+ int w;
+ pthread_t threadId;
+ int status;
+
+ if (obj == NULL) ESL_XEXCEPTION(eslEINVAL, "Invalid thread object");
+ if (pthread_mutex_lock (&obj->startMutex) != 0) ESL_XEXCEPTION(eslESYS, "mutex lock failed");
+
+ /* signal that we're started */
+ obj->startThread++;
+ if (pthread_cond_broadcast (&obj->startCond) != 0) ESL_XEXCEPTION(eslESYS, "cond broadcast failed");
+
+ /* wait for the master's signal to start the calculations */
+ while (obj->startThread) {
+ if (pthread_cond_wait(&obj->startCond, &obj->startMutex) != 0) ESL_XEXCEPTION(eslESYS, "cond wait failed");
+ }
+
+ if (pthread_mutex_unlock (&obj->startMutex) != 0) ESL_XEXCEPTION(eslESYS, "mutex unlock failed");
+
+ /* Figure out the worker's index */
+ threadId = pthread_self();
+ for (w = 0; w < obj->threadCount; w++)
+ if (pthread_equal(threadId, obj->threadId[w])) break;
+ if (w == obj->threadCount) ESL_XEXCEPTION(eslESYS, "thread not registered");
+
+ *ret_workeridx = w;
+ return eslOK;
+
+ ERROR:
+ *ret_workeridx = 0;
+ return status;
+}
+
+
+/* Function: esl_threads_GetData()
+ * Synopsis: Return the data associated with this thread.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Return the data pointer associated with the worker thread
+ * <workeridx>. The data pointer was set by the
+ * <esl_threads_AddThread()> function.
+ *
+ * Returns: void *
+ */
+void *
+esl_threads_GetData(ESL_THREADS *obj, int workeridx)
+{
+ return obj->data[workeridx];
+}
+
+
+/* Function: esl_threads_Finished()
+ * Synopsis: Terminate the thread.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Terminate a worker thread.
+ * This is currently a no-op, serving as
+ * a placeholder in case we eventually need
+ * any cleanup.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_threads_Finished(ESL_THREADS *obj, int workeridx)
+{
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 2. Determining thread number to use
+ *****************************************************************/
+
+/* Function: esl_threads_CPUCount()
+ * Synopsis: Figure out how many cpus the machine has.
+ * Incept: SRE, Wed Aug 19 11:31:24 2009 [Janelia]
+ *
+ * Purpose: Determine the number of logical processors on this
+ * machine; return that number in <*ret_ncpu>.
+ *
+ * The number of available processors is found by
+ * <sysconf(_SC_NPROCESSORS_ONLN)>,
+ * <sysconf(_SC_NPROC_ONLN)>, or a <sysctl()> call,
+ * depending on the host system. This determined number of
+ * available processors will be the number of logical
+ * processors, not physical processors. On systems with
+ * hyperthreading, the number of logical processors is more
+ * than the number of physical cpus. It may or may not be a
+ * good thing to spawn more threads than physical
+ * processors.
+ *
+ * Args: ret_ncpu - RETURN: number of logical CPUs
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: (no abnormal error conditions)
+ *
+ * Xref: J5/68
+ */
+int
+esl_threads_CPUCount(int *ret_ncpu)
+{
+ int ncpu = 1;
+
+#if defined (HAVE_SYSCONF) && defined (_SC_NPROCESSORS_ONLN) /* Many systems (including Linux) */
+ ncpu = sysconf(_SC_NPROCESSORS_ONLN);
+#elif defined (HAVE_SYSCONF) && defined (_SC_NPROC_ONLN) /* Silicon Graphics IRIX */
+ ncpu = sysconf(_SC_NPROC_ONLN);
+#elif defined (HAVE_SYSCTL) /* BSD systems including OS/X */
+ int mib[2] = {CTL_HW, HW_NCPU};
+ size_t len = sizeof(int);
+ int status;
+
+ status = sysctl(mib, 2, &ncpu, &len, NULL, (size_t) NULL);
+ if (status < 0 || len != sizeof(int)) ncpu = 1;
+#endif
+
+ if (ncpu < 1) ncpu = 1;
+
+ *ret_ncpu = ncpu;
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * 3. Example
+ *****************************************************************/
+
+#ifdef eslTHREADS_EXAMPLE
+#include "easel.h"
+#include "esl_threads.h"
+
+/* gcc --std=gnu99 -g -Wall -pthread -o esl_threads_example -I. -DeslTHREADS_EXAMPLE esl_threads.c easel.c */
+static void
+worker_thread(void *data)
+{
+ ESL_THREADS *thr = (ESL_THREADS *) data;
+ char *s = NULL;
+ int w;
+
+ esl_threads_Started(thr, &w);
+
+ s = (char *) esl_threads_GetData(thr, w);
+ printf("worker thread %d receives: %s\n", w, s);
+
+ esl_threads_Finished(thr, w);
+ return;
+}
+
+int
+main(void)
+{
+ ESL_THREADS *thr = NULL;
+ int ncpu = 8;
+ int i;
+ char **work = NULL;
+
+ work = malloc(sizeof(char *) * ncpu);
+ for (i = 0; i < ncpu; i++)
+ esl_sprintf(&(work[i]), "work packet %d", i);
+
+ thr = esl_threads_Create(&worker_thread);
+
+ for (i = 0; i < ncpu; i++)
+ esl_threads_AddThread(thr, (void *) work[i]);
+
+ esl_threads_WaitForStart (thr);
+ /* The worker threads now run their work. */
+ esl_threads_WaitForFinish(thr);
+ esl_threads_Destroy(thr);
+ for (i = 0; i < ncpu; i++) free(work[i]);
+ free(work);
+ return eslOK;
+}
+#endif /*eslTHREADS_EXAMPLE*/
+
+
+#ifdef eslTHREADS_EXAMPLE2
+#include "easel.h"
+#include "esl_threads.h"
+
+/* gcc --std=gnu99 -g -Wall -pthread -o esl_threads_example2 -I. -DeslTHREADS_EXAMPLE2 esl_threads.c easel.c */
+int
+main(void)
+{
+ int ncpu;
+
+ esl_threads_CPUCount(&ncpu);
+ printf("Processors: %d\n", ncpu);
+
+ return eslOK;
+}
+#endif /*eslTHREADS_EXAMPLE2*/
+#endif /*HAVE_PTHREAD*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
diff --git a/esl_threads.h b/esl_threads.h
new file mode 100644
index 0000000..2dab76c
--- /dev/null
+++ b/esl_threads.h
@@ -0,0 +1,41 @@
+/* Simple master/worker data parallelization using POSIX threads.
+ *
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslTHREADS_INCLUDED
+#define eslTHREADS_INCLUDED
+
+#include <pthread.h>
+
+typedef struct {
+ int threadCount; /* number of active worker threads */
+ pthread_t *threadId; /* threadId for each worker thread; [0..threadCount-1] */
+ void **data; /* data pointer for each worker thread; [0..threadCount-1] */
+
+ int startThread; /* number of worker threads currently blocked at start mutex */
+ pthread_mutex_t startMutex; /* the starting gate */
+ pthread_cond_t startCond; /* the signal that workers are synchronized and may start */
+
+ void (*func)(void *); /* each worker thread runs this function; arg is to data[] */
+} ESL_THREADS;
+
+
+extern ESL_THREADS *esl_threads_Create(void (*func)(void *));
+extern void esl_threads_Destroy(ESL_THREADS *obj);
+
+extern int esl_threads_AddThread (ESL_THREADS *obj, void *data);
+extern int esl_threads_GetWorkerCount(ESL_THREADS *obj);
+extern int esl_threads_WaitForStart (ESL_THREADS *obj);
+extern int esl_threads_WaitForFinish (ESL_THREADS *obj);
+
+extern int esl_threads_Started (ESL_THREADS *obj, int *ret_workeridx);
+extern void *esl_threads_GetData (ESL_THREADS *obj, int workeridx);
+extern int esl_threads_Finished(ESL_THREADS *obj, int workeridx);
+
+extern int esl_threads_CPUCount(int *ret_ncpu);
+
+#endif /*eslTHREADS_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_tree.c b/esl_tree.c
new file mode 100644
index 0000000..6418fb4
--- /dev/null
+++ b/esl_tree.c
@@ -0,0 +1,2191 @@
+/* Phylogenetic trees.
+ *
+ * Contents:
+ * 1. The ESL_TREE object.
+ * 2. Newick format i/o
+ * 3. Tree comparison algorithms.
+ * 4. Clustering algorithms for distance-based tree construction.
+ * 5. Generating simulated trees.
+ * 6. Unit tests.
+ * 7. Test driver.
+ * 8. Examples.
+ * 9. Copyright notice and license.
+ */
+#include "esl_config.h"
+
+#include <math.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "easel.h"
+#include "esl_tree.h"
+#include "esl_dmatrix.h"
+#include "esl_stack.h"
+#include "esl_vectorops.h"
+#include "esl_random.h"
+
+/*****************************************************************
+ *# 1. The ESL_TREE object.
+ *****************************************************************/
+
+/* Function: esl_tree_Create()
+ *
+ * Purpose: Allocate an empty tree structure for <ntaxa> taxa
+ * and return a pointer to it. <ntaxa> must be $\geq 2$.
+ *
+ * Args: <ntaxa> - number of taxa
+ *
+ * Returns: pointer to the new <ESL_TREE> object; caller frees
+ * this with <esl_tree_Destroy()>.
+ *
+ * Throws: <NULL> if allocation fails.
+ */
+ESL_TREE *
+esl_tree_Create(int ntaxa)
+{
+ ESL_TREE *T = NULL;
+ int i;
+ int status;
+
+ /* Contract verification */
+ ESL_DASSERT1((ntaxa >= 2));
+
+ /* 1st allocation round */
+ ESL_ALLOC(T, sizeof(ESL_TREE));
+ T->parent = NULL;
+ T->left = NULL;
+ T->right = NULL;
+ T->ld = NULL;
+ T->rd = NULL;
+
+ /* Optional info starts NULL
+ */
+ T->taxaparent = NULL;
+ T->cladesize = NULL;
+ T->taxonlabel = NULL;
+ T->nodelabel = NULL;
+
+ /* Additive trees are assumed by default, as opposed to linkage trees */
+ T->is_linkage_tree = FALSE;
+
+ /* Tree output options default to PHYLIP style
+ */
+ T->show_unrooted = FALSE;
+ T->show_node_labels = TRUE;
+ T->show_root_branchlength = FALSE;
+ T->show_branchlengths = TRUE;
+ T->show_quoted_labels = FALSE;
+ T->show_numeric_taxonlabels = TRUE;
+
+ /* 2nd allocation round */
+ T->N = ntaxa;
+ ESL_ALLOC(T->parent, sizeof(int) * (ntaxa-1));
+ ESL_ALLOC(T->left, sizeof(int) * (ntaxa-1));
+ ESL_ALLOC(T->right, sizeof(int) * (ntaxa-1));
+ ESL_ALLOC(T->ld, sizeof(double) * (ntaxa-1));
+ ESL_ALLOC(T->rd, sizeof(double) * (ntaxa-1));
+
+ for (i = 0; i < ntaxa-1; i++)
+ {
+ T->parent[i] = 0;
+ T->left[i ] = 0;
+ T->right[i] = 0;
+ T->ld[i] = 0.;
+ T->rd[i] = 0.;
+ }
+ T->nalloc = ntaxa;
+ return T;
+
+ ERROR:
+ esl_tree_Destroy(T);
+ return NULL;
+}
+
+/* Function: esl_tree_CreateGrowable()
+ *
+ * Purpose: Allocate a growable tree structure for an initial
+ * allocation of <nalloc> taxa, and return a pointer to it.
+ * <nalloc> must be $\geq 2$.
+ *
+ * Args: <nalloc> - initial allocation size for number of taxa
+ *
+ * Returns: pointer to a new growable <ESL_TREE> object; caller frees
+ * this with <esl_tree_Destroy()>.
+ *
+ * Throws: <NULL> if allocation fails.
+ */
+ESL_TREE *
+esl_tree_CreateGrowable(int nalloc)
+{
+ ESL_TREE *T = esl_tree_Create(nalloc);
+ if (T == NULL) return NULL;
+
+ T->N = 0;
+ return T;
+}
+
+
+/* Function: esl_tree_CreateFromString()
+ *
+ * Purpose: A convenience for making small test cases in the test
+ * suites: given the contents of a Newick file as a
+ * single string <s>, convert it to an <ESL_TREE>.
+ *
+ * Returns: a pointer to the new <ESL_TREE> on success.
+ *
+ * Throws: <NULL> if it fails to obtain, open, or read the
+ * temporary file that it puts the string <s> in.
+ */
+ESL_TREE *
+esl_tree_CreateFromString(char *s)
+{
+ char tmpfile[16] = "esltmpXXXXXX";
+ FILE *fp = NULL;
+ ESL_TREE *T = NULL;
+
+ if (esl_tmpfile(tmpfile, &fp) != eslOK) goto ERROR;
+ fputs(s, fp);
+ rewind(fp);
+ if (esl_tree_ReadNewick(fp, NULL, &T) != eslOK) goto ERROR;
+ fclose(fp);
+ return T;
+
+ ERROR:
+ if (fp != NULL) fclose(fp);
+ if (T != NULL) esl_tree_Destroy(T);
+ return NULL;
+}
+
+
+
+/* Function: esl_tree_Grow()
+ *
+ * Purpose: Given a tree <T>, make sure it can hold one more taxon;
+ * reallocate internally if necessary by doubling the
+ * number of taxa it is currently allocated to hold.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure. In this case,
+ * the data in the tree are unaffected.
+ */
+int
+esl_tree_Grow(ESL_TREE *T)
+{
+ void *tmp;
+ int nnew;
+ int status;
+ int i;
+
+ if (T->N < T->nalloc) return eslOK; /* do we have room for next taxon? */
+
+ nnew = T->nalloc * 2;
+
+ /* There are N-1 interior nodes, so arrays of info for
+ * interior nodes are allocated for (nnew-1), whereas
+ * arrays of info for the N taxa are allocated (nnew).
+ */
+ ESL_RALLOC(T->parent, tmp, sizeof(int) * (nnew-1));
+ ESL_RALLOC(T->left, tmp, sizeof(int) * (nnew-1));
+ ESL_RALLOC(T->right, tmp, sizeof(int) * (nnew-1));
+ ESL_RALLOC(T->ld, tmp, sizeof(double) * (nnew-1));
+ ESL_RALLOC(T->rd, tmp, sizeof(double) * (nnew-1));
+
+ /* 0..N-2 were already initialized or used.
+ * Initialize newly alloced space N-1..nnew-2.
+ */
+ for (i = T->nalloc-1; i < nnew-1; i++)
+ {
+ T->parent[i] = 0;
+ T->left[i ] = 0;
+ T->right[i] = 0;
+ T->ld[i] = 0.;
+ T->rd[i] = 0.;
+ }
+
+ if (T->taxaparent != NULL)
+ {
+ ESL_RALLOC(T->taxaparent, tmp, sizeof(int) * nnew);
+ for (i = T->nalloc; i < nnew; i++) T->taxaparent[i] = 0;
+ }
+
+ if (T->cladesize != NULL)
+ {
+ ESL_RALLOC(T->cladesize, tmp, sizeof(int) * nnew);
+ for (i = T->nalloc; i < nnew; i++) T->cladesize[i] = 0;
+ }
+
+ if (T->taxonlabel != NULL)
+ {
+ ESL_RALLOC(T->taxonlabel, tmp, sizeof(char *) * nnew);
+ for (i = T->nalloc; i < nnew; i++) T->taxonlabel[i] = NULL;
+ }
+
+ if (T->nodelabel != NULL)
+ {
+ ESL_RALLOC(T->nodelabel, tmp, sizeof(char *) * (nnew-1));
+ for (i = T->nalloc-1; i < nnew-1; i++) T->nodelabel[i] = NULL;
+ }
+
+ T->nalloc = nnew;
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+
+/* Function: esl_tree_SetTaxaParents()
+ *
+ * Purpose: Constructs the <T->taxaparent[]> array in the tree
+ * structure <T>, by an O(N) traversal of the tree.
+ * Upon return, <T->taxaparent[i]> is the index
+ * of the internal node that taxon <i> is a child of.
+ *
+ * Args: T - the tree structure to map
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on internal allocation error. In this case, the tree is
+ * returned unchanged.
+ *
+ * Xref: STL11/63
+ */
+int
+esl_tree_SetTaxaParents(ESL_TREE *T)
+{
+ int i;
+ int status;
+
+ if (T->taxaparent != NULL) return eslOK; // map already exists.
+ ESL_ALLOC(T->taxaparent, sizeof(int) * T->N);
+ for (i = 0; i < T->N; i++) T->taxaparent[i] = 0; // solely to calm static analyzers.
+
+ for (i = 0; i < T->N-1; i++) /* traversal order doesn't matter */
+ {
+ if (T->left[i] <= 0) T->taxaparent[-(T->left[i])] = i;
+ if (T->right[i] <= 0) T->taxaparent[-(T->right[i])] = i;
+ }
+ return eslOK;
+
+ ERROR:
+ if (T->taxaparent != NULL) { free(T->taxaparent); T->taxaparent = NULL; }
+ return status;
+}
+
+
+/* Function: esl_tree_SetCladesizes()
+ *
+ * Purpose: Constructs the <T->cladesize[]> array in tree structure
+ * <T>. Upon successful return, <T->cladesize[i]> is the
+ * number of taxa contained by the clade rooted at node <i>
+ * in the tree. For example, <T->cladesize[0]> is $N$ by
+ * definition, because 0 is the root of the tree.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error; in this case, the
+ * original <T> is unmodified.
+ */
+int
+esl_tree_SetCladesizes(ESL_TREE *T)
+{
+ int i;
+ int status;
+
+ if (T->cladesize != NULL) return eslOK; /* already set. */
+ ESL_ALLOC(T->cladesize, sizeof(int) * (T->N-1));
+ esl_vec_ISet(T->cladesize, T->N-1, 0);
+
+ for (i = T->N-2; i >= 0; i--)
+ { /* taxon: ...else... internal node: */
+ if (T->left[i] <= 0) T->cladesize[i]++; else T->cladesize[i] += T->cladesize[T->left[i]];
+ if (T->right[i] <= 0) T->cladesize[i]++; else T->cladesize[i] += T->cladesize[T->right[i]];
+ }
+ return eslOK;
+
+ ERROR:
+ if (T->cladesize != NULL) { free(T->cladesize); T->cladesize = NULL; }
+ return status;
+}
+
+
+/* Function: esl_tree_SetTaxonlabels()
+ *
+ * Purpose: Given an array of taxon names <names[0..N-1]> with the
+ * same order and number as the taxa in tree <T>, make a
+ * copy of those names in <T>. For example, <names> might
+ * be the sequence names in a multiple alignment,
+ * <msa->sqname>.
+ *
+ * If the tree already had taxon names assigned to it, they
+ * are replaced.
+ *
+ * As a special case, if the <names> argument is passed as
+ * <NULL>, then the taxon labels are set to a string
+ * corresponding to their internal index; that is, taxon 0
+ * is labeled "0".
+ *
+ * Returns: <eslOK> on success, and internal state of <T>
+ * (specifically, <T->taxonlabel[]>) now contains a copy
+ * of the taxa names.
+ *
+ * Throws: <eslEMEM> on allocation failure. <T->taxonlabel[]> will be
+ * <NULL> (even if it was already set).
+ */
+int
+esl_tree_SetTaxonlabels(ESL_TREE *T, char **names)
+{
+ int i;
+ int status;
+
+ if (T->taxonlabel != NULL) esl_Free2D((void **) T->taxonlabel, T->N);
+ ESL_ALLOC(T->taxonlabel, sizeof(char *) * T->nalloc);
+ for (i = 0; i < T->nalloc; i++) T->taxonlabel[i] = NULL;
+
+ if (names != NULL)
+ {
+ for (i = 0; i < T->N; i++)
+ if ((status = esl_strdup(names[i], -1, &(T->taxonlabel[i]))) != eslOK) goto ERROR;
+ }
+ else
+ {
+ for (i = 0; i < T->N; i++)
+ {
+ ESL_ALLOC(T->taxonlabel[i], sizeof(char) * 32); /* enough width for any conceivable int */
+ snprintf(T->taxonlabel[i], 32, "%d", i);
+ }
+ }
+ return eslOK;
+
+ ERROR:
+ if (T->taxonlabel != NULL) esl_Free2D((void **) T->taxonlabel, T->nalloc);
+ return status;
+}
+
+/* Function: esl_tree_RenumberNodes()
+ * Synopsis: Assure nodes are numbered in preorder.
+ *
+ * Purpose: Given a tree <T> whose internal nodes might be numbered in
+ * any order, with the sole requirement that node 0 is the
+ * root; renumber the internal nodes (if necessary) to be in Easel's
+ * convention of preorder traversal. No other aspect of <T> is
+ * altered (including its allocation size).
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ *
+ * Xref: STL11/77
+ */
+int
+esl_tree_RenumberNodes(ESL_TREE *T)
+{
+ ESL_TREE *T2 = NULL;
+ ESL_STACK *vs = NULL;
+ int *map = NULL;
+ int v,new;
+ int status;
+ int needs_rearranging = FALSE;
+
+ /* Pass 1. Preorder traverse of T by its children links;
+ * construct map[old] -> new.
+ */
+ ESL_ALLOC(map, sizeof(int) * (T->N-1));
+ if (( vs = esl_stack_ICreate()) == NULL) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, 0) != eslOK) { status = eslEMEM; goto ERROR; };
+ new = 0;
+ while (esl_stack_IPop(vs, &v) == eslOK)
+ {
+ if (v != new) needs_rearranging = TRUE;
+ map[v] = new++;
+ if (T->right[v] > 0 && esl_stack_IPush(vs, T->right[v]) != eslOK) { status = eslEMEM; goto ERROR; };
+ if (T->left[v] > 0 && esl_stack_IPush(vs, T->left[v]) != eslOK) { status = eslEMEM; goto ERROR; };
+ }
+ if (! needs_rearranging) { status = eslOK; goto ERROR; } /* not an error; just cleaning up & returning eslOK. */
+
+ /* Pass 2. Construct the guts of correctly numbered new T2.
+ * (traversal order doesn't matter here)
+ */
+ if (( T2 = esl_tree_Create(T->nalloc)) == NULL) { status = eslEMEM; goto ERROR; };
+ if (T->nodelabel != NULL) {
+ ESL_ALLOC(T2->nodelabel, sizeof(char *) * (T2->nalloc-1));
+ for (v = 0; v < T2->nalloc-1; v++) T2->nodelabel[v] = NULL;
+ }
+ if (T->taxaparent != NULL) {
+ ESL_ALLOC(T2->taxaparent, sizeof(int) * (T2->nalloc));
+ for (v = 0; v < T2->nalloc; v++) T2->taxaparent[v] = 0;
+ }
+
+ for (v = 0; v < T->N-1; v++)
+ {
+ T2->parent[map[v]] = map[T->parent[v]];
+ if (T->left[v] > 0) T2->left[map[v]] = map[T->left[v]]; /* internal nodes renumbered... */
+ else T2->left[map[v]] = T->left[v]; /* ...taxon indices unchanged */
+ if (T->right[v] > 0) T2->right[map[v]] = map[T->right[v]];
+ else T2->right[map[v]] = T->right[v];
+ T2->ld[map[v]] = T->ld[v];
+ T2->rd[map[v]] = T->rd[v];
+
+ if (T->taxaparent != NULL) {
+ if (T->left[v] <= 0) T2->taxaparent[-(T->left[v])] = map[v];
+ if (T->right[v] <= 0) T2->taxaparent[-(T->right[v])] = map[v];
+ }
+
+ if (T->nodelabel != NULL)
+ esl_strdup(T->nodelabel[v], -1, &(T2->nodelabel[map[v]]));
+ }
+
+ /* Finally, swap the new guts of T2 with the old guts of T;
+ * destroy T2 and return. T is now renumbered.
+ */
+ ESL_SWAP(T->parent, T2->parent, int *);
+ ESL_SWAP(T->left, T2->left, int *);
+ ESL_SWAP(T->right, T2->right, int *);
+ ESL_SWAP(T->ld, T2->ld, double *);
+ ESL_SWAP(T->rd, T2->rd, double *);
+ ESL_SWAP(T->taxaparent, T2->taxaparent, int *);
+ ESL_SWAP(T->nodelabel, T2->nodelabel, char **);
+
+ free(map);
+ esl_stack_Destroy(vs);
+ esl_tree_Destroy(T2);
+ return eslOK;
+
+ ERROR:
+ if (map != NULL) free(map);
+ if (vs != NULL) esl_stack_Destroy(vs);
+ if (T2 != NULL) esl_tree_Destroy(T2);
+ return status;
+
+}
+
+/* Function: esl_tree_VerifyUltrametric()
+ *
+ * Purpose: Verify that tree <T> is ultrametric.
+ *
+ * Returns: <eslOK> if so; <eslFAIL> if not.
+ *
+ * Throws: <eslEMEM> on an allocation failure.
+ */
+int
+esl_tree_VerifyUltrametric(ESL_TREE *T)
+{
+ double *d = NULL; /* Distance from root for each OTU */
+ int status;
+ int i, child, parent;
+
+ /* First, calculate distance from root to each taxon.
+ * (This chunk of code might be useful to put on its own someday.)
+ */
+ ESL_ALLOC(d, sizeof(double) * T->N);
+ if ((status = esl_tree_SetTaxaParents(T)) != eslOK) goto ERROR;
+ for (i = 0; i < T->N; i++)
+ {
+ d[i] = 0.0;
+ parent = T->taxaparent[i];
+ if (T->left[parent] == -i) d[i] += T->ld[parent];
+ else if (T->right[parent] == -i) d[i] += T->rd[parent];
+ else ESL_XEXCEPTION(eslEINCONCEIVABLE, "oops");
+
+ while (parent != 0) /* upwards to the root */
+ {
+ child = parent;
+ parent = T->parent[child];
+ if (T->left[parent] == child) d[i] += T->ld[parent];
+ else if (T->right[parent] == child) d[i] += T->rd[parent];
+ else ESL_XEXCEPTION(eslEINCONCEIVABLE, "oops");
+ }
+ }
+
+ /* In an ultrametric tree, all those distances must be equal.
+ */
+ for (i = 1; i < T->N; i++)
+ if ((status = esl_DCompare(d[0], d[i], 0.0001)) != eslOK) break;
+
+ free(d);
+ return status;
+
+ ERROR:
+ if (d != NULL) free(d);
+ return status;
+}
+
+
+/* Function: esl_tree_Validate()
+ *
+ * Purpose: Validates the integrity of the data structure in <T>.
+ * Returns <eslOK> if the internal data in <T> are
+ * consistent and valid. Returns <eslFAIL> if not,
+ * and if a non-<NULL> message buffer <errbuf> has been
+ * provided by the caller, an informative message is
+ * left in <errbuf> describing the reason for the
+ * failure.
+ *
+ * Args: T - tree structure to validate
+ * errbuf - NULL, or a buffer of at least p7_ERRBUFSIZE
+ * chars to contain an error message upon
+ * any validation failure.
+ */
+int
+esl_tree_Validate(ESL_TREE *T, char *errbuf)
+{
+ int N;
+ int i, c;
+ int shouldbe;
+ int status;
+
+ if (errbuf != NULL) *errbuf = 0;
+
+ N = T->N; /* just to save writing T->N so many times below */
+ if (N < 2) ESL_XFAIL(eslFAIL, errbuf, "number of taxa is less than 2");
+ if (T->parent[0] != 0) ESL_XFAIL(eslFAIL, errbuf, "parent of root 0 should be set to 0");
+ if (T->nalloc < N) ESL_XFAIL(eslFAIL, errbuf, "number of taxa N is less than allocation");
+
+ /* Verify preorder tree numbering.
+ */
+ for (i = 0; i < N-1; i++)
+ {
+ if (T->left[i] > 0 && T->left[i] < i)
+ ESL_XFAIL(eslFAIL, errbuf, "l child of node %d not in preorder", i);
+ if (T->right[i] > 0 && T->right[i] < i)
+ ESL_XFAIL(eslFAIL, errbuf, "r child of node %d not in preorder", i);
+ }
+
+ /* Range checks on values. */
+ for (i = 0; i < N-1; i++)
+ {
+ if (T->parent[i] < 0 || T->parent[i] > N-2)
+ ESL_XFAIL(eslFAIL, errbuf, "parent idx of node %d invalid", i);
+ if (T->left[i] < -(N-1) || T->left[i] > N-2)
+ ESL_XFAIL(eslFAIL, errbuf, "left child idx of node %d invalid", i);
+ if (T->right[i] < -(N-1) || T->right[i] > N-2)
+ ESL_XFAIL(eslFAIL, errbuf, "right child idx of node %d invalid", i);
+ if (T->ld[i] < 0.)
+ ESL_XFAIL(eslFAIL, errbuf, "negative l branch length at node %d", i);
+ if (T->rd[i] < 0.)
+ ESL_XFAIL(eslFAIL, errbuf, "negative r branch length at node %d", i);
+ if (T->cladesize != NULL && (T->cladesize[i] < 0 || T->cladesize[i] > N))
+ ESL_XFAIL(eslFAIL, errbuf, "invalid cladesize at node %d", i);
+ }
+ for (c = 0; c < N; c++)
+ if (T->taxaparent != NULL && (T->taxaparent[c] < 0 || T->taxaparent[c] > N-2))
+ ESL_XFAIL(eslFAIL, errbuf, "invalid taxaparent at node %d", c);
+
+ /* more sophisticated integrity checks on parent-child relations in
+ nodes ...*/
+ for (i = 1; i < T->N-1; i++)
+ if (T->left[T->parent[i]] != i && T->right[T->parent[i]] != i)
+ ESL_XFAIL(eslFAIL, errbuf, "parent/child link discrepancy at internal node %d\n", i);
+
+ /* ...and between terminal nodes and taxa.
+ */
+ if (T->taxaparent != NULL)
+ for (c = 0; c < T->N; c++)
+ if (T->left[T->taxaparent[c]] != -c && T->right[T->taxaparent[c]] != -c)
+ ESL_XFAIL(eslFAIL, errbuf, "parent/child link discrepancy at taxon %d\n", c);
+
+ /* check on cladesizes */
+ if (T->cladesize != NULL)
+ for (i = 0; i < T->N-1; i++)
+ {
+ shouldbe = 0;
+ if (T->left[i] > 0) shouldbe += T->cladesize[T->left[i]]; else shouldbe++;
+ if (T->right[i] > 0) shouldbe += T->cladesize[T->right[i]]; else shouldbe++;
+ if (shouldbe != T->cladesize[i])
+ ESL_XFAIL(eslFAIL, errbuf, "incorrect cladesize at node %d", i);
+ }
+
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+
+/* Function: esl_tree_Destroy()
+ *
+ * Purpose: Frees an <ESL_TREE> object.
+ */
+void
+esl_tree_Destroy(ESL_TREE *T)
+{
+ if (T == NULL) return;
+
+ if (T->parent != NULL) free(T->parent);
+ if (T->left != NULL) free(T->left);
+ if (T->right != NULL) free(T->right);
+ if (T->ld != NULL) free(T->ld);
+ if (T->rd != NULL) free(T->rd);
+ if (T->taxaparent != NULL) free(T->taxaparent);
+ if (T->cladesize != NULL) free(T->cladesize);
+ if (T->taxonlabel != NULL) esl_Free2D((void **) T->taxonlabel, T->nalloc);
+ if (T->nodelabel != NULL) esl_Free2D((void **) T->nodelabel, T->nalloc-1);
+ free(T);
+ return;
+}
+
+
+
+/*----------------- end, ESL_TREE object -----------------------*/
+
+
+/*****************************************************************
+ *# 2. Newick format i/o
+ *****************************************************************/
+
+/* newick_validate_unquoted():
+ * Returns <eslOK> if we can represent <label> as an unquoted label
+ * in Newick format. (Spaces are ok, but will be converted to
+ * _ on output.)
+ */
+static int
+newick_validate_unquoted(char *label)
+{
+ char *sptr;
+
+ for (sptr = label; *sptr != '\0'; sptr++)
+ {
+ if (! isprint(*sptr)) return eslFAIL;
+ if (strchr("()[]':;,", *sptr) != NULL) return eslFAIL;
+ }
+ return eslOK;
+}
+
+/* newick_validate_quoted():
+ * Returns <eslOK> if we can represent <label> as a
+ * quoted label in Newick format. (Single quotes will
+ * be converted to '' on output.)
+ */
+static int
+newick_validate_quoted(char *label)
+{
+ char *sptr;
+ for (sptr = label; *sptr != '\0'; sptr++)
+ {
+ if (! isprint(*sptr)) return eslFAIL;
+ }
+ return eslOK;
+}
+
+/* newick_write_unquoted():
+ * Prints <label> to <fp> as an unquoted Newick label.
+ */
+static int
+newick_write_unquoted(FILE *fp, char *label)
+{
+ char *sptr;
+
+ for (sptr = label; *sptr != '\0'; sptr++)
+ {
+ if (*sptr == ' ') { if (fputc('_', fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "newick tree write failed"); }
+ else { if (fputc(*sptr, fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "newick tree write failed"); }
+ }
+ return eslOK;
+}
+
+/* newick_write_quoted():
+ * Prints <label> to <fp> as a quoted Newick label.
+ */
+static int
+newick_write_quoted(FILE *fp, char *label)
+{
+ char *sptr;
+
+ if (fputc('\'', fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+ for (sptr = label; *sptr != '\0'; sptr++)
+ {
+ if (*sptr == '\'') { if (fprintf(fp, "''") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "newick tree write failed"); }
+ else { if (fputc(*sptr, fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "newick tree write failed"); }
+ }
+ if (fputc('\'', fp) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+ return eslOK;
+}
+
+/* newick_write_taxonlabel():
+ * Print the label for taxon <v> to stream <fp>.
+ * Tries to print label as an unquoted label, then
+ * as a quoted label, (then fails).
+ * If label isn't available, does nothing.
+ * If label contains invalid characters, throws <eslECORRUPT>.
+ */
+static int
+newick_write_taxonlabel(FILE *fp, ESL_TREE *T, int v)
+{
+ int status;
+
+ if (T->taxonlabel == NULL || T->taxonlabel[v] == NULL)
+ {
+ if (T->show_numeric_taxonlabels && fprintf(fp, "%d", v) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+ return eslOK;
+ }
+
+ if (! T->show_quoted_labels && newick_validate_unquoted(T->taxonlabel[v]) == eslOK)
+ status = newick_write_unquoted(fp, T->taxonlabel[v]);
+ else if (newick_validate_quoted(T->taxonlabel[v]) == eslOK)
+ status = newick_write_quoted(fp, T->taxonlabel[v]);
+ else
+ ESL_EXCEPTION(eslECORRUPT, "bad taxon label");
+
+ return status;
+}
+
+/* newick_write_nodelabel():
+ * Print the label for internal node <v> to stream <fp>.
+ * Tries to print label as an unquoted label, then
+ * as a quoted label.
+ * If label isn't available, does nothing.
+ * If tree's options say not to print node labels, does nothing.
+ * If label contains invalid characters, throws <eslECORRUPT>.
+ */
+static int
+newick_write_nodelabel(FILE *fp, ESL_TREE *T, int v)
+{
+ int status;
+
+ if (T->nodelabel == NULL) return eslOK;
+ if (T->nodelabel[v] == NULL) return eslOK;
+ if (T->show_node_labels != TRUE) return eslOK;
+
+ if (! T->show_quoted_labels && newick_validate_unquoted(T->nodelabel[v]) == eslOK)
+ status = newick_write_unquoted(fp, T->nodelabel[v]);
+ else if (newick_validate_quoted(T->nodelabel[v]) == eslOK)
+ status = newick_write_quoted(fp, T->nodelabel[v]);
+ else
+ ESL_EXCEPTION(eslECORRUPT, "bad node label\n");
+
+ return status;
+}
+
+/* newick_write_branchlength()
+ * Writes the branch length *to* <v>.
+ * If <v> is negative, it's a leaf; if <v> is positive, it's an internal node.
+ * You can't pass the root node 0 to this. 0 always means taxon 0.
+ * There is no branch to the root node.
+ */
+static int
+newick_write_branchlength(FILE *fp, ESL_TREE *T, int v)
+{
+ double branchlength;
+
+ if (! T->show_branchlengths) return eslOK;
+ if (T->taxaparent == NULL) ESL_EXCEPTION(eslEINVAL, "T must have taxaparent");
+
+ if (v <= 0) /* leaf */
+ {
+ if (T->left [T->taxaparent[-v]] == v) branchlength = T->ld[T->taxaparent[-v]];
+ else if (T->right[T->taxaparent[-v]] == v) branchlength = T->rd[T->taxaparent[-v]];
+ else ESL_EXCEPTION(eslECORRUPT, "Can't find branch length");
+ }
+ else /* internal node */
+ {
+ if (T->left [T->parent[v]] == v) branchlength = T->ld[T->parent[v]];
+ else if (T->right[T->parent[v]] == v) branchlength = T->rd[T->parent[v]];
+ else ESL_EXCEPTION(eslECORRUPT, "Can't find branch length");
+ }
+
+ if (fprintf(fp, ":%f", branchlength) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+ return eslOK;
+}
+
+/* Function: esl_tree_WriteNewick()
+ *
+ * Purpose: Writes tree <T> to stream <fp> in Newick format.
+ *
+ * Certain options are set in <T> to control output style,
+ * as follows.
+ *
+ * If <T->show_unrooted> is <TRUE>, <T> is printed as an
+ * unrooted tree starting with a trifurcation, a la PHYLIP
+ * format (default=<FALSE>).
+ *
+ * If <T->show_node_labels> is <TRUE>, then labels are
+ * shown for internal nodes, if any are available
+ * (default=<TRUE>).
+ *
+ * If <T->show_branchlengths> is <TRUE>, then branch
+ * lengths are shown, as opposed to just printing a labeled
+ * topology (default=<TRUE>).
+ *
+ * If <T->show_root_branchlength> is also <TRUE>, then a
+ * 0.0 branchlength is shown to the root node, a la Hein's
+ * TreeAlign Newick format (default=<FALSE>).
+ *
+ * If <T->show_quoted_labels> is <TRUE>, then all labels
+ * are shown in Newick's quoted format, as opposed to only
+ * using quoted labels where necessary (default=<FALSE>).
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation error.
+ * <eslEWRITE> on any system write error.
+ * <eslEINCONCEIVABLE> on internal error.
+ *
+ * Xref: SRE:STL11/74
+ */
+int
+esl_tree_WriteNewick(FILE *fp, ESL_TREE *T)
+{
+ ESL_STACK *vs = NULL;
+ ESL_STACK *cs = NULL;
+ int v;
+ char c;
+ int status;
+
+ if ((vs = esl_stack_ICreate()) == NULL) { status = eslEMEM; goto ERROR; }
+ if ((cs = esl_stack_CCreate()) == NULL) { status = eslEMEM; goto ERROR; }
+
+ if ((status = esl_tree_SetTaxaParents(T)) != eslOK) goto ERROR;
+
+ /* Initialization.
+ * Push a trifurcation (swallowing the right internal node) if unrooted;
+ * else push the first bifurcation.
+ *
+ * When we push a trifurcation, the branch lengths will come out fine
+ * on output, if the tree followed the correct convention of having
+ * a T->rd[0] = 0.0.
+ */
+ if (fputc('(', fp) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+ if (T->show_unrooted && T->right[0] > 0)
+ {
+ v = T->right[0];
+ if ((status = esl_stack_CPush(cs, 'x')) != eslOK) goto ERROR;
+ if ((status = esl_stack_IPush(vs, T->right[v])) != eslOK) goto ERROR;
+ if ((status = esl_stack_CPush(cs, ',')) != eslOK) goto ERROR;
+ if ((status = esl_stack_CPush(cs, 'x')) != eslOK) goto ERROR;
+ if ((status = esl_stack_IPush(vs, T->left[v])) != eslOK) goto ERROR;
+ }
+ else
+ {
+ if ((status = esl_stack_CPush(cs, 'x')) != eslOK) goto ERROR;
+ if ((status = esl_stack_IPush(vs, T->right[0])) != eslOK) goto ERROR;
+ }
+ if ((status = esl_stack_CPush(cs, ',')) != eslOK) goto ERROR;
+ if ((status = esl_stack_CPush(cs, 'x')) != eslOK) goto ERROR;
+ if ((status = esl_stack_IPush(vs, T->left[0])) != eslOK) goto ERROR;
+
+
+ /* Main iteration. Pop off stacks 'til they're empty.
+ */
+ while ((status = esl_stack_CPop(cs, &c)) == eslOK)
+ {
+ if (c == ',') { /* comma doesn't have a v stacked with it */
+ if (fputc(',', fp) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+ continue;
+ }
+
+ if ((status = esl_stack_IPop(vs, &v)) != eslOK) goto ERROR;
+
+ switch (c) {
+ case 'x': /* a subtree, which could be a node or a taxon: */
+ if (v > 0) /* internal node 1..N-2*/
+ {
+ if (fputc('(', fp) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+ if ((status = esl_stack_CPush(cs, ')')) != eslOK) goto ERROR;
+ if ((status = esl_stack_IPush(vs, v)) != eslOK) goto ERROR;
+ if ((status = esl_stack_CPush(cs, 'x')) != eslOK) goto ERROR;
+ if ((status = esl_stack_IPush(vs, T->right[v])) != eslOK) goto ERROR;
+ if ((status = esl_stack_CPush(cs, ',')) != eslOK) goto ERROR;
+ if ((status = esl_stack_CPush(cs, 'x')) != eslOK) goto ERROR;
+ if ((status = esl_stack_IPush(vs, T->left[v])) != eslOK) goto ERROR;
+ }
+ else /* taxon -(N-1)..0 */
+ { /* -v below to convert taxon code to 0..N-1 */
+ if ((status = newick_write_taxonlabel (fp, T, -v)) != eslOK) goto ERROR;
+ if ((status = newick_write_branchlength(fp, T, v)) != eslOK) goto ERROR;
+ }
+ break;
+
+ case ')': /* closing an internal node. v > 0 is a node code. */
+ if (fputc(')', fp) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+ if ((status = newick_write_nodelabel (fp, T, v)) != eslOK) goto ERROR;
+ if ((status = newick_write_branchlength(fp, T, v)) != eslOK) goto ERROR;
+ break;
+
+ default:
+ ESL_XEXCEPTION(eslEINCONCEIVABLE, "bad state code");
+ break;
+ }
+ }
+
+ /* Termination
+ */
+ if (fputc(')', fp) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+ if ((status = newick_write_nodelabel(fp, T, 0)) != eslOK) goto ERROR;
+ if (T->show_branchlengths && T->show_root_branchlength)
+ { if (fprintf(fp, ":0.0") < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "newick tree write failed"); }
+ if (fputc(';', fp) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+ if (fputc('\n', fp) < 0) ESL_XEXCEPTION_SYS(eslEWRITE, "newick tree write failed");
+
+ esl_stack_Destroy(vs);
+ esl_stack_Destroy(cs);
+ return eslOK;
+
+ ERROR:
+ if (vs != NULL) esl_stack_Destroy(vs);
+ if (cs != NULL) esl_stack_Destroy(cs);
+ return status;
+
+}
+
+
+/* newick_advance_buffer()
+ *
+ * Advance the read buffer by one character; reload it
+ * if we reach the end. <eslOK> on success, and <eslEOF>
+ * if the read fails.
+ */
+static int
+newick_advance_buffer(FILE *fp, char *buf, int *pos, int *nc)
+{
+ (*pos)++;
+ if (*pos == *nc)
+ {
+ *nc = fread(buf, sizeof(char), 4096, fp);
+ if (*nc == 0) return eslEOF;
+ *pos = 0;
+ }
+ return eslOK;
+}
+
+/* newick_skip_whitespace()
+ *
+ * Given the 4k input buffer <buf>, which currently contains
+ * <*nc> total characters and is positioned at position <*pos>,
+ * move <*pos> to be at the first nonwhitespace character,
+ * skipping any Newick comments ([...]) encountered. Read
+ * new data from the stream <fp> into <buf> as needed.
+ *
+ * Return <eslOK> on success. <*pos> is reset to point at a
+ * non-whitespace input character. <*nc> may be reset and the contents
+ * of <buf> altered if a new block was read from <fp> into <buf>.
+ *
+ * Returns <eslEOF> if end-of-file is reached in <fp> before a data
+ * character is found, or if a read error occurs.
+ */
+static int
+newick_skip_whitespace(FILE *fp, char *buf, int *pos, int *nc)
+{
+ int commentlevel = 0;
+
+ while (commentlevel > 0 || isspace(buf[*pos]) || buf[*pos] == '[')
+ {
+ if (buf[*pos] == '[') commentlevel++;
+ if (buf[*pos] == ']') commentlevel--;
+ if (newick_advance_buffer(fp, buf, pos, nc) == eslEOF) return eslEOF;
+ }
+ return eslOK;
+}
+
+
+/* newick_parse_quoted_label()
+ *
+ * On entry, buf[pos] == '\'': the opening single quote.
+ * On exit, buf[pos] is positioned at the next data character following the closing
+ * single quote; possibly the ':' for a branch length;
+ * and <ret_label> points to a newly allocated, NUL-terminated string
+ * containing the label that was read (possibly the empty string).
+ * Returns eslOK on success.
+ *
+ * Returns eslEFORMAT on parse error, eslEOF if it runs out of data.
+ */
+static int
+newick_parse_quoted_label(FILE *fp, char *buf, int *pos, int *nc, char **ret_label)
+{
+ char *label = NULL;
+ void *tmp;
+ int n = 0;
+ int nalloc = 0;
+ int status;
+
+ nalloc = 32;
+ ESL_ALLOC(label, sizeof(char) * nalloc);
+
+ /* advance past the opening ' */
+ if (buf[*pos] != '\'') { status = eslEFORMAT; goto ERROR; }
+ if ((status = newick_advance_buffer(fp, buf, pos, nc)) != eslOK) goto ERROR;
+
+ /* skip leading whitespace (\n and comments forbidden in quoted label) */
+ while (buf[*pos] == '\t' || buf[*pos] == ' ')
+ if ((status = newick_advance_buffer(fp, buf, pos, nc)) != eslOK) goto ERROR;
+
+ /* Read the label */
+ while (1) {
+ if (buf[*pos] == '\'') { /* watch out for escaped single quotes, '' */
+ if ((status = newick_advance_buffer(fp, buf, pos, nc)) != eslOK) goto ERROR;
+ if (buf[*pos] != '\'') break; /* we've just moved past the last ' */
+ }
+ label[n++] = buf[*pos];
+ if ((status = newick_advance_buffer(fp, buf, pos, nc)) != eslOK) goto ERROR;
+ if (n == (nalloc-1)) { /* reallocate label if it fills, leave room for NUL */
+ ESL_RALLOC(label, tmp, sizeof(char) * (nalloc * 2));
+ nalloc *= 2;
+ }
+ }
+
+ /* backtrack over any trailing whitespace and nul-terminate. */
+ while (n>0 && isspace(label[n-1])) n--;
+ label[n] = '\0';
+ *ret_label = label;
+ return eslOK;
+
+ ERROR:
+ if (label != NULL) { free(label); *ret_label = NULL; }
+ return status;
+
+}
+
+/* newick_parse_unquoted_label
+ *
+ * On entry, buf[pos] == first character in the label.
+ * On exit, buf[pos] is positioned at the next data character following the end
+ * of the label -- one of "),\t\n;[:" --
+ * and <ret_label> points to a newly allocated, NUL-terminated string
+ * containing the label that was read (possibly the empty string).
+ * Returns eslOK on success.
+ *
+ * Returns eslEFORMAT on parse error, eslEOF if it runs out of data.
+ */
+static int
+newick_parse_unquoted_label(FILE *fp, char *buf, int *pos, int *nc, char **ret_label)
+{
+ char *label = NULL;
+ char *tmp = NULL;
+ int n = 0;
+ int nalloc = 0;
+ int status;
+
+ nalloc = 32;
+ ESL_ALLOC(label, sizeof(char) * nalloc);
+
+ while (1) {
+ if (strchr("(]", buf[*pos]) != NULL) { status = eslEFORMAT; goto ERROR; }
+ if (strchr(" \t\n)[':;,", buf[*pos]) != NULL) { break; }
+ label[n++] = buf[*pos];
+ if (newick_advance_buffer(fp, buf, pos, nc) == eslEOF) { status = eslEOF; goto ERROR; }
+
+ if (n == (nalloc-1)) { /* reallocate label if it fills, leave room for NUL */
+ ESL_RALLOC(label, tmp, sizeof(char) * (nalloc * 2));
+ nalloc *= 2;
+ }
+ }
+ label[n] = '\0';
+ *ret_label = label;
+ return eslOK;
+
+ ERROR:
+ if (label != NULL) { free(label); *ret_label = NULL; }
+ return status;
+}
+
+/* newick_parse_branchlength
+ *
+ * On entry, buf[pos] == ':'
+ * On exit, buf[pos] is positioned at the next data character following the end
+ * of the branchlength -- one of "),\t\n;[:"
+ * and <ret_d> is the branch length that was read.
+ *
+ * Returns eslOK on success;
+ *
+ * Returns eslEFORMAT on parse error (including nonexistent branch lengths),
+ * eslEOF if it runs out of data in the file.
+ */
+static int
+newick_parse_branchlength(FILE *fp, char *buf, int *pos, int *nc, double *ret_d)
+{
+ char *branch = NULL;
+ char *tmp = NULL;
+ int n = 0;
+ int nalloc = 0;
+ int status;
+
+ nalloc = 32;
+ ESL_ALLOC(branch, sizeof(char) * nalloc);
+
+ if (buf[*pos] != ':') { status = eslEFORMAT; goto ERROR; }
+ if (( status = newick_advance_buffer(fp, buf, pos, nc)) != eslOK) goto ERROR;
+
+ while (1) {
+ if (strchr("(]", buf[*pos]) != NULL) { status = eslEFORMAT; goto ERROR; }
+ if (strchr(" \t\n)[':;,", buf[*pos]) != NULL) break;
+ branch[n++] = buf[*pos];
+ if ((status = newick_advance_buffer(fp, buf, pos, nc)) != eslOK) goto ERROR;
+
+ if (n == (nalloc-1)) { /* reallocate label if it fills, leave room for NUL */
+ ESL_RALLOC(branch, tmp, sizeof(char) * (nalloc * 2));
+ nalloc *= 2;
+ }
+ }
+
+ branch[n] = '\0';
+ *ret_d = strtod(branch, &tmp);
+ if (n == 0 || tmp != branch+n) { status = eslEFORMAT; goto ERROR; }
+ free(branch);
+ return eslOK;
+
+ ERROR:
+ if (branch != NULL) free(branch);
+ *ret_d = 0.;
+ return status;
+}
+
+
+
+
+/* Function: esl_tree_ReadNewick()
+ * Synopsis: Input a Newick format tree.
+ *
+ * Purpose: Read a Newick format tree from an open input stream <fp>.
+ * Return the new tree in <ret_T>.
+ *
+ * The new tree <T> will have the optional <T->taxonlabel> and
+ * <T->nodelabel> arrays allocated, containing names of all the
+ * taxa and nodes. Whenever no label appeared in the Newick file
+ * for a node or taxon, the label is set to the empty string.
+ *
+ * Caller may optionally provide an <errbuf> of at least
+ * <eslERRBUFSIZE> chars, to retrieve diagnostic information
+ * in case of a parsing problem; or <errbuf> may be passed as
+ * <NULL>.
+ *
+ * Args: fp - open input stream
+ * errbuf - NULL, or allocated space for >= eslERRBUFSIZE chars
+ * ret_T - RETURN: the new tree.
+ *
+ * Returns: Returns <eslOK> on success, and <ret_T> points
+ * to the new tree.
+ *
+ * Returns <eslEFORMAT> on parse errors, such as premature EOF
+ * or bad syntax in the Newick file. In this case, <ret_T> is
+ * returned NULL, and the <errbuf> (if provided> contains an
+ * informative error message.
+ *
+ * Throws: <eslEMEM> on memory allocation errors.
+ * <eslEINCONCEIVABLE> may also arise in case of internal bugs.
+ *
+ * Xref: STL11/75
+ */
+int
+esl_tree_ReadNewick(FILE *fp, char *errbuf, ESL_TREE **ret_T)
+{
+ ESL_TREE *T = NULL; /* the new, growing tree */
+ ESL_STACK *cs = NULL; /* state stack: possible states are LRX);, */
+ ESL_STACK *vs = NULL; /* node index stack: LRX) states are associated with node #'s */
+ int status;
+ char buf[4096]; /* 4K input buffer */
+ int pos,nc; /* position in buf, and number of chars in buf */
+ char c; /* current state */
+ int v; /* current node idx */
+ int currnode;
+ int currtaxon;
+ char *label; /* a parsed label */
+ double d; /* a parsed branch length */
+
+ if (errbuf != NULL) *errbuf = '\0';
+ if ((vs = esl_stack_ICreate()) == NULL) { status = eslEMEM; goto ERROR; };
+ if ((cs = esl_stack_CCreate()) == NULL) { status = eslEMEM; goto ERROR; };
+
+ /* Create the tree, initially allocated for 32 taxa.
+ * Allocate for taxon and node labels, too.
+ */
+ if ((T = esl_tree_CreateGrowable(32)) == NULL) { status = eslEMEM; goto ERROR; };
+ ESL_ALLOC(T->taxonlabel, sizeof(char *) * 32);
+ ESL_ALLOC(T->nodelabel, sizeof(char *) * 31);
+ for (currtaxon = 0; currtaxon < 32; currtaxon++) T->taxonlabel[currtaxon] = NULL;
+ for (currnode = 0; currnode < 31; currnode++) T->nodelabel[currnode] = NULL;
+
+ /* Load the input buffer
+ */
+ if ((nc = fread(buf, sizeof(char), 4096, fp)) == 0)
+ ESL_XFAIL(eslEFORMAT, errbuf, "file is empty.");
+ pos = 0;
+
+ /* Initialization:
+ * create the root node in the tree;
+ * push L,R...); onto the stacks;
+ * swallow the first ( in the file.
+ *
+ * A note on memory management in the growing tree:
+ * we are going to keep T->N set to the number of taxa
+ * that the tree *will* contain, given the number of nodes
+ * it currently *does* contain. Before we try to add
+ * any new node, we call the Grow() routine, which will
+ * check T->N against T->nalloc. This strategy works
+ * because nodes always get added before their children
+ * taxa, so the # of taxa is always <= nodes-1: that is,
+ * our need for reallocation is driven by new nodes,
+ * never by new taxa; that is, if we have enough room
+ * for nodes, we automatically have enough room for the
+ * taxa.
+ */
+ T->parent[0] = 0;
+ currnode = 1;
+ currtaxon = 0;
+ T->N = 2; /* c.f. note above: T->N is the # of taxa we *would* hold, given currnode=1*/
+ if (esl_stack_CPush(cs, ';') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, ')') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, 0) != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, 'X') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, 0) != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, 'R') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, 0) != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, ',') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, 'L') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, 0) != eslOK) { status = eslEMEM; goto ERROR; };
+
+ if (newick_skip_whitespace(fp, buf, &pos, &nc) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "file ended prematurely.");
+ if (buf[pos] != '(')
+ ESL_XFAIL(eslEFORMAT, errbuf, "file is not in Newick format.");
+ if (newick_advance_buffer(fp, buf, &pos, &nc) == eslEOF)
+ ESL_XFAIL(eslEFORMAT, errbuf, "file ended prematurely.");
+
+ /* Iteration.
+ */
+ while ((status = esl_stack_CPop(cs, &c)) == eslOK)
+ {
+
+ if (newick_skip_whitespace(fp, buf, &pos, &nc) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "file ended prematurely.");
+
+ if (c == ',')
+ {
+ if (buf[pos] != ',')
+ ESL_XFAIL(eslEFORMAT, errbuf, "expected a comma, saw %c.", buf[pos]);
+ if (newick_advance_buffer(fp, buf, &pos, &nc) == eslEOF)
+ ESL_XFAIL(eslEFORMAT, errbuf, "file ended prematurely.");
+ continue;
+ }
+
+ else if (c == ';')
+ {
+ if (buf[pos] != ';')
+ ESL_XFAIL(eslEFORMAT, errbuf, "expected a semicolon, saw %c.", buf[pos]);
+ break; /* end of the Newick file */
+ }
+
+ else if (c == 'L' || c == 'R') /* c says, we expect to add a subtree next */
+ {
+ if (esl_stack_IPop(vs, &v) != eslOK) { status = eslEINCONCEIVABLE; goto ERROR; } /* v = parent of currnode */
+
+ if (buf[pos] == '(') /* a new interior node attaches to v */
+ {
+ if (esl_tree_Grow(T) != eslOK) { status = eslEMEM; goto ERROR; }; /* c.f. memory management note: check that we can add new node */
+
+ T->parent[currnode] = v;
+ if (c == 'L') T->left[v] = currnode;
+ else T->right[v] = currnode;
+
+ if (esl_stack_CPush(cs, ')') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, currnode) != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, 'X') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, currnode) != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, 'R') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, currnode) != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, ',') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, 'L') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, currnode) != eslOK) { status = eslEMEM; goto ERROR; };
+
+ if (newick_advance_buffer(fp, buf, &pos, &nc) == eslEOF)
+ ESL_XFAIL(eslEFORMAT, errbuf, "file ended prematurely.");
+ currnode++; /* T->N == # of internal nodes/idx of next internal node */
+ }
+ else /* a taxon attaches to v */
+ {
+ if (buf[pos] == '\'') { /* a quoted label, for a new taxon attached to v*/
+ if ((status = newick_parse_quoted_label(fp, buf, &pos, &nc, &label)) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "failed to parse a quoted taxon label");
+ } else { /* an unquoted label, for a new taxon attached to v */
+ if ((status = newick_parse_unquoted_label(fp, buf, &pos, &nc, &label)) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "failed to parse an unquoted taxon label");
+ }
+
+ if (newick_skip_whitespace(fp, buf, &pos, &nc) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "file ended prematurely");
+
+ d = 0.;
+ if (buf[pos] == ':') {
+ if ((status = newick_parse_branchlength(fp, buf, &pos, &nc, &d)) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "failed to parse a branch length");
+ }
+
+ if (c == 'L') { T->left[v] = -currtaxon; T->ld[v] = d; }
+ else { T->right[v] = -currtaxon; T->rd[v] = d; }
+
+ T->taxonlabel[currtaxon] = label;
+ currtaxon++;
+ }
+ }
+
+ else if (c == ')') /* c says, expect to close an interior node next */
+ {
+ /* get v = the interior node we're closing, naming, and setting a branch length to */
+ if (( status = esl_stack_IPop(vs, &v)) != eslOK) goto ERROR;
+ if (buf[pos] != ')') ESL_XFAIL(eslEFORMAT, errbuf, "Parse error: expected ) to close node #%d\n", v);
+
+ if (newick_advance_buffer(fp, buf, &pos, &nc) == eslEOF)
+ ESL_XFAIL(eslEFORMAT, errbuf, "file ended prematurely.");
+
+ if (newick_skip_whitespace(fp, buf, &pos, &nc) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "file ended prematurely.");
+
+ if (buf[pos] == '\'') {
+ if ((status = newick_parse_quoted_label(fp, buf, &pos, &nc, &label)) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "failed to parse a quoted node label");
+ } else { /* an unquoted label, for a new taxon attached to v */
+ if ((status = newick_parse_unquoted_label(fp, buf, &pos, &nc, &label)) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "failed to parse an unquoted node label");
+ }
+
+ if (newick_skip_whitespace(fp, buf, &pos, &nc) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "file ended prematurely.");
+
+ d = 0.;
+ if (buf[pos] == ':') {
+ if ((status = newick_parse_branchlength(fp, buf, &pos, &nc, &d)) != eslOK)
+ ESL_XFAIL(eslEFORMAT, errbuf, "failed to parse a branch length");
+ }
+
+ if (v > 0) { /* branch length to root node is meaningless, ignore it */
+ if (T->left [T->parent[v]] == v) T->ld[T->parent[v]] = d;
+ else if (T->right[T->parent[v]] == v) T->rd[T->parent[v]] = d;
+ }
+
+ T->nodelabel[v] = label;
+ }
+
+ else if (c == 'X') /* optionally, multifurcations: if we see a comma, we have another node to deal with */
+ {
+ if ((status = esl_stack_IPop(vs, &v)) != eslOK) goto ERROR;
+ if (buf[pos] != ',') continue;
+ if (esl_tree_Grow(T) != eslOK) { status = eslEMEM; goto ERROR; }; /* c.f. memory management note: check that we can add new node */
+
+ /* v = the interior node that is multifurcated.
+ * What we're going to do is to create a new node y; move the existing right child of v
+ * to the left child of y; and connect y as the new right child of v with a branch
+ * length of zero. The right child of y is now open. Then, we push a X->,RX production, so the next subtree will
+ * be parsed as the right child of y. We can do this ad infinitum, resulting in
+ * a representation of a multifurcation as, for example, a (A,(B,(C,(D,E)))) binary
+ * subtree with zero length interior branches for a five-way multifurcation.
+ *
+ * This swapping destroys the order of the nodes: they will not be in preorder traversal.
+ * This is temporarily ok. We renumber later.
+ */
+ T->left[currnode] = T->right[v];
+ T->ld[currnode] = T->rd[v];
+ T->parent[currnode] = v;
+ if (T->right[v] > 0)
+ T->parent[T->right[v]] = currnode;
+ T->right[v] = currnode;
+ T->rd[v] = 0.;
+
+ if (esl_stack_CPush(cs, 'X') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, currnode) != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, 'R') != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_IPush(vs, currnode) != eslOK) { status = eslEMEM; goto ERROR; };
+ if (esl_stack_CPush(cs, ',') != eslOK) { status = eslEMEM; goto ERROR; };
+ currnode++;
+ }
+
+ T->N = currnode + 1; /* c.f. memory management note: keep T->N = # of taxa the tree *would* hold, given currnode */
+ }
+
+ esl_tree_RenumberNodes(T);
+
+ esl_stack_Destroy(cs);
+ esl_stack_Destroy(vs);
+ *ret_T = T;
+ return eslOK;
+
+ ERROR:
+ if (T != NULL) esl_tree_Destroy(T);
+ if (cs != NULL) esl_stack_Destroy(cs);
+ if (vs != NULL) esl_stack_Destroy(vs);
+ *ret_T = NULL;
+ return status;
+}
+
+
+
+/*-------------------- end, Newick i/o --------------------------*/
+
+
+/*****************************************************************
+ * 3. Tree comparison algorithms
+ *****************************************************************/
+
+/* Function: esl_tree_Compare()
+ *
+ * Purpose: Given two trees <T1> and <T2> for the same
+ * set of <N> taxa, compare the topologies of the
+ * two trees.
+ *
+ * The routine must be able to determine which taxa are
+ * equivalent in <T1> and <T2>. If <T1> and <T2> both have
+ * taxon labels set, then the routine compares labels.
+ * This is the usual case. (Therefore, the <N> labels must
+ * all be different, or the routine will be unable to do
+ * this mapping uniquely.) As a special case, if neither
+ * <T1> nor <T2> has taxon labels, then the indexing of
+ * taxa <0..N-1> is assumed to be exactly the same in the
+ * two trees. (And if one tree has labels and the other
+ * does not, an <eslEINVAL> exception is thrown.)
+ *
+ * For comparing unrooted topologies, be sure that <T1> and
+ * <T2> both obey the unrooted tree convention that the
+ * "root" is placed on the branch to taxon 0. (That is,
+ * <T->left[0] = 0>.)
+ *
+ * Returns: <eslOK> if tree topologies are identical. <eslFAIL>
+ * if they aren't.
+ *
+ * Throws: <eslEMEM> on allocation error. <eslEINVAL> if the taxa in
+ * the trees can't be mapped uniquely and completely to
+ * each other (because one tree doesn't have labels and
+ * one does, or because the labels aren't unique, or the
+ * two trees have different taxa).
+ */
+int
+esl_tree_Compare(ESL_TREE *T1, ESL_TREE *T2)
+{
+ int *Mg = NULL; /* the M(g) tree-mapping function for internal nodes [0..N-2] */
+ int *Mgt = NULL; /* the M(g) tree-mapping function for leaves (taxa), [0..N-1] */
+ int g, child; /* node indices for parent, children */
+ int a,b;
+ int status;
+
+ if (T1->N != T2->N) ESL_EXCEPTION(eslEINVAL, "trees don't have the same # of taxa");
+
+ /* We need taxon parent map in tree 2, but not tree 1.
+ */
+ if ((status = esl_tree_SetTaxaParents(T2)) != eslOK) goto ERROR;
+
+ /* We're going to use the tree mapping function M(g) [Goodman79].
+ * In the implementation here, we split it into two, Mg[] for internal
+ * nodes 0..N-2 and Mgt[] for taxa 0..N-1.
+ *
+ * Mg[g] for node g in T1 is the index of the lowest node in T2
+ * that contains the same children taxa as the subtree
+ * under g in T1.
+ *
+ * For the taxa, Mgt[g] for taxon g in T1 is the index of the
+ * corresponding taxon in T2. If neither tree has taxon labels
+ * Mgt[g] = g for all g. Otherwise we have to compare labels. Right
+ * now, we do this by brute force, which is O(N^2); if this ever
+ * becomes rate limiting, replace it with a keyhash to make it O(N)
+ * (and in fact, the keyhash of taxon names could even become part
+ * of the ESL_TREE).
+ */
+ ESL_ALLOC(Mg, sizeof(int) * (T1->N-1));
+ ESL_ALLOC(Mgt, sizeof(int) * (T1->N));
+ if (T1->taxonlabel != NULL && T2->taxonlabel != NULL)
+ {
+ esl_vec_ISet(Mgt, T1->N, -1); /* flags for "unset" */
+ for (a = 0; a < T1->N; a++)
+ {
+ for (b = 0; b < T1->N; b++)
+ if (strcmp(T1->taxonlabel[a], T2->taxonlabel[b]) == 0)
+ { Mgt[a] = b; break; }
+ }
+ for (a = 0; a < T1->N; a++)
+ if (Mgt[a] == -1) ESL_XEXCEPTION(eslEINVAL, "couldn't map taxa");
+ }
+ else if (T1->taxonlabel == NULL && T2->taxonlabel == NULL)
+ {
+ for (a = 0; a < T1->N; a++)
+ Mgt[a] = a;
+ }
+ else
+ ESL_XEXCEPTION(eslEINVAL, "either both trees must have taxon labels, or neither");
+
+ /* Finally, we use the SDI algorithm [ZmasekEddy01] to construct
+ * M(g) for internal nodes, by postorder traversal of T1.
+ */
+ for (g = T1->N-2; g >= 0; g--)
+ {
+ child = T1->left[g];
+ if (child <= 0) a = T2->taxaparent[Mgt[-child]];
+ else a = T2->parent[Mg[child]];
+
+ child = T1->right[g];
+ if (child <= 0) b = T2->taxaparent[Mgt[-child]];
+ else b = T2->parent[Mg[child]];
+
+ /* a shortcut in SDI: special case for exact tree comparison: */
+ if (a != b) { free(Mg); free(Mgt); return eslFAIL; }
+ Mg[g] = a;
+ }
+
+ free(Mg);
+ free(Mgt);
+ return eslOK;
+
+ ERROR:
+ if (Mg != NULL) free(Mg);
+ if (Mgt != NULL) free(Mgt);
+ return status;
+}
+
+/*----------------- end, tree comparison -----------------------*/
+
+
+
+
+
+
+/*****************************************************************
+ * 4. Clustering algorithms for tree construction.
+ *****************************************************************/
+
+/* cluster_engine()
+ *
+ * Implements four clustering algorithms for tree construction:
+ * UPGMA, WPGMA, single-linkage, and maximum-linkage. These differ
+ * only by the rule used to construct new distances after joining
+ * two clusters i,j.
+ *
+ * Input <D_original> is a symmetric distance matrix, for <D->n> taxa.
+ * The diagonal is all 0's, and off-diagonals are $\geq 0$. <D->n>
+ * must be at least two.
+ *
+ * <mode> is one of <eslUPGMA>, <eslWPGMA>, <eslSINGLE_LINKAGE>, or
+ * <eslCOMPLETE_LINKAGE>: a flag specifying which algorithm to use.
+ *
+ * The output is a tree structure, returned in <ret_T>.
+ *
+ * Returns <eslOK> on success.
+ *
+ * Throws <eslEMEM> on allocation failure.
+ *
+ * Complexity: O(N^2) in memory, O(N^3) in time.
+ *
+ * This function can be optimized. Memory usage is at least
+ * 4x more than necessary. First, we don't need to make a copy of D
+ * if the caller doesn't mind it being consumed. Second, D only
+ * needs to be lower- or upper-triangular, because it's symmetric,
+ * but that requires changing dmatrix module. In time,
+ * O(N^2 log N) if not O(N^2) should be possible, by being more
+ * sophisticated about identifying the minimum element;
+ * see Gronau and Moran (2006).
+ *
+ */
+static int
+cluster_engine(ESL_DMATRIX *D_original, int mode, ESL_TREE **ret_T)
+{
+ ESL_DMATRIX *D = NULL;
+ ESL_TREE *T = NULL;
+ double *height = NULL; /* height of internal nodes [0..N-2] */
+ int *idx = NULL; /* taxa or node index of row/col in D [0..N-1] */
+ int *nin = NULL; /* # of taxa in clade in row/col in D [0..N-1] */
+ int N;
+ int i = 0, j = 0;
+ int row,col;
+ double minD;
+ int status;
+
+ /* Contract checks.
+ */
+ ESL_DASSERT1((D_original != NULL)); /* matrix exists */
+ ESL_DASSERT1((D_original->n == D_original->m)); /* D is NxN square */
+ ESL_DASSERT1((D_original->n >= 2)); /* >= 2 taxa */
+#if (eslDEBUGLEVEL >=1)
+ for (i = 0; i < D_original->n; i++) {
+ assert(D_original->mx[i][i] == 0.); /* self-self d = 0 */
+ for (j = i+1; j < D_original->n; j++) /* D symmetric */
+ assert(D_original->mx[i][j] == D_original->mx[j][i]);
+ }
+#endif
+
+ /* Allocations.
+ * NxN copy of the distance matrix, which we'll iteratively whittle down to 2x2;
+ * tree for N taxa;
+ */
+ if ((D = esl_dmatrix_Clone(D_original)) == NULL) return eslEMEM;
+ if ((T = esl_tree_Create(D->n)) == NULL) return eslEMEM;
+ ESL_ALLOC(idx, sizeof(int) * D->n);
+ ESL_ALLOC(nin, sizeof(int) * D->n);
+ ESL_ALLOC(height, sizeof(double) * (D->n-1));
+ for (i = 0; i < D->n; i++) idx[i] = -i; /* assign taxa indices to row/col coords */
+ for (i = 0; i < D->n; i++) nin[i ] = 1; /* each cluster starts as 1 */
+ for (i = 0; i < D->n-1; i++) height[i] = 0.;
+
+ /* If we're doing either single linkage or complete linkage clustering,
+ * we will construct a "linkage tree", where ld[v], rd[v] "branch lengths"
+ * below node v are the linkage value for clustering node v; thus
+ * ld[v] == rd[v] in a linkage tree.
+ * For UPGMA or WPGMA, we're building an additive tree, where ld[v] and
+ * rd[v] are branch lengths.
+ */
+ if (mode == eslSINGLE_LINKAGE || mode == eslCOMPLETE_LINKAGE)
+ T->is_linkage_tree = TRUE;
+
+ for (N = D->n; N >= 2; N--)
+ {
+ /* Find minimum in our current N x N matrix.
+ * (Don't init minD to -infinity; linkage trees use sparse distance matrices
+ * with -infinity representing unlinked.)
+ */
+ minD = D->mx[0][1]; i = 0; j = 1; /* init with: if nothing else, try to link 0-1 */
+ for (row = 0; row < N; row++)
+ for (col = row+1; col < N; col++)
+ if (D->mx[row][col] < minD)
+ {
+ minD = D->mx[row][col];
+ i = row;
+ j = col;
+ }
+
+ /* We're joining node at row/col i with node at row/col j.
+ * Add node (index = N-2) to the tree at height minD/2.
+ */
+ T->left[N-2] = idx[i];
+ T->right[N-2] = idx[j];
+ if (T->is_linkage_tree) height[N-2] = minD;
+ else height[N-2] = minD / 2.;
+
+ /* Set the branch lengths (additive trees) or heights (linkage trees)
+ */
+ T->ld[N-2] = T->rd[N-2] = height[N-2];
+ if (! T->is_linkage_tree) {
+ if (idx[i] > 0) T->ld[N-2] = ESL_MAX(0., T->ld[N-2] - height[idx[i]]); // max to 0, to avoid fp roundoff giving us negative length
+ if (idx[j] > 0) T->rd[N-2] = ESL_MAX(0., T->rd[N-2] - height[idx[j]]);
+ }
+
+ /* If either node was an internal node, record parent in it.
+ */
+ if (idx[i] > 0) T->parent[idx[i]] = N-2;
+ if (idx[j] > 0) T->parent[idx[j]] = N-2;
+
+ /* Now, build a new matrix by merging row i+j and col i+j.
+ * 1. move j to N-1 (unless it's already there)
+ * 2. move i to N-2 (unless it's already there)
+ */
+ if (j != N-1)
+ {
+ for (row = 0; row < N; row++)
+ ESL_SWAP(D->mx[row][N-1], D->mx[row][j], double);
+ for (col = 0; col < N; col++)
+ ESL_SWAP(D->mx[N-1][col], D->mx[j][col], double);
+ ESL_SWAP(idx[j], idx[N-1], int);
+ ESL_SWAP(nin[j], nin[N-1], int);
+ }
+ if (i != N-2)
+ {
+ for (row = 0; row < N; row++)
+ ESL_SWAP(D->mx[row][N-2], D->mx[row][i], double);
+ for (col = 0; col < N; col++)
+ ESL_SWAP(D->mx[N-2][col], D->mx[i][col], double);
+ ESL_SWAP(idx[i], idx[N-2], int);
+ ESL_SWAP(nin[i], nin[N-2], int);
+ }
+ i = N-2;
+ j = N-1;
+
+ /* 3. merge i (now at N-2) with j (now at N-1)
+ * according to the desired clustering rule.
+ */
+ for (col = 0; col < N; col++)
+ {
+ switch (mode) {
+ case eslUPGMA:
+ D->mx[i][col] = (nin[i] * D->mx[i][col] + nin[j] * D->mx[j][col]) / (double) (nin[i] + nin[j]);
+ break;
+ case eslWPGMA: D->mx[i][col] = (D->mx[i][col] + D->mx[j][col]) / 2.; break;
+ case eslSINGLE_LINKAGE: D->mx[i][col] = ESL_MIN(D->mx[i][col], D->mx[j][col]); break;
+ case eslCOMPLETE_LINKAGE: D->mx[i][col] = ESL_MAX(D->mx[i][col], D->mx[j][col]); break;
+ default: ESL_XEXCEPTION(eslEINCONCEIVABLE, "no such strategy");
+ }
+ D->mx[col][i] = D->mx[i][col];
+ }
+
+ /* row/col i is now the new cluster, and it corresponds to node N-2
+ * in the tree (remember, N is decrementing at each iteration).
+ * row/col j (N-1) falls away when we go back to the start of the loop
+ * and decrement N.
+ */
+ nin[i] += nin[j];
+ idx[i] = N-2;
+ }
+
+ esl_dmatrix_Destroy(D);
+ free(height);
+ free(idx);
+ free(nin);
+ if (ret_T != NULL) *ret_T = T;
+ return eslOK;
+
+ ERROR:
+ if (D != NULL) esl_dmatrix_Destroy(D);
+ if (T != NULL) esl_tree_Destroy(T);
+ if (height != NULL) free(height);
+ if (idx != NULL) free(idx);
+ if (nin != NULL) free(nin);
+ if (ret_T != NULL) *ret_T = NULL;
+ return status;
+}
+
+
+/* Function: esl_tree_UPGMA()
+ *
+ * Purpose: Given distance matrix <D>, use the UPGMA algorithm
+ * to construct a tree <T>.
+ *
+ * Returns: <eslOK> on success; the tree is returned in <ret_T>,
+ * and must be freed by the caller with <esl_tree_Destroy()>.
+ *
+ * Throws: <eslEMEM> on allocation problem, and <ret_T> is set <NULL>.
+ */
+int
+esl_tree_UPGMA(ESL_DMATRIX *D, ESL_TREE **ret_T)
+{
+ return cluster_engine(D, eslUPGMA, ret_T);
+}
+
+/* Function: esl_tree_WPGMA()
+ *
+ * Purpose: Given distance matrix <D>, use the WPGMA algorithm
+ * to construct a tree <T>.
+ *
+ * Returns: <eslOK> on success; the tree is returned in <ret_T>,
+ * and must be freed by the caller with <esl_tree_Destroy()>.
+ *
+ * Throws: <eslEMEM> on allocation problem, and <ret_T> is set <NULL>.
+ */
+int
+esl_tree_WPGMA(ESL_DMATRIX *D, ESL_TREE **ret_T)
+{
+ return cluster_engine(D, eslWPGMA, ret_T);
+}
+
+/* Function: esl_tree_SingleLinkage()
+ *
+ * Purpose: Given distance matrix <D>, construct a single-linkage
+ * (minimum distances) clustering tree <T>.
+ *
+ * Returns: <eslOK> on success; the tree is returned in <ret_T>,
+ * and must be freed by the caller with <esl_tree_Destroy()>.
+ *
+ * Throws: <eslEMEM> on allocation problem, and <ret_T> is set <NULL>.
+ */
+int
+esl_tree_SingleLinkage(ESL_DMATRIX *D, ESL_TREE **ret_T)
+{
+ return cluster_engine(D, eslSINGLE_LINKAGE, ret_T);
+}
+
+/* Function: esl_tree_CompleteLinkage()
+ *
+ * Purpose: Given distance matrix <D>, construct a complete-linkage
+ * (maximum distances) clustering tree <T>.
+ *
+ * Returns: <eslOK> on success; the tree is returned in <ret_T>,
+ * and must be freed by the caller with <esl_tree_Destroy()>.
+ *
+ * Throws: <eslEMEM> on allocation problem, and <ret_T> is set <NULL>.
+ */
+int
+esl_tree_CompleteLinkage(ESL_DMATRIX *D, ESL_TREE **ret_T)
+{
+ return cluster_engine(D, eslCOMPLETE_LINKAGE, ret_T);
+}
+/*----------------- end, clustering algorithms ----------------*/
+
+
+
+/*****************************************************************
+ * 5. Generating simulated trees
+ *****************************************************************/
+
+/* Function: esl_tree_Simulate()
+ * Synopsis: Generate a random rooted ultrametric tree.
+ *
+ * Purpose: Generate a random rooted ultrametric tree of <N> taxa,
+ * using the algorithm of Kuhner and Felsenstein (1994).
+ *
+ * The branch lengths are generated by choosing <N-1>
+ * exponentially distributed split times, with decreasing
+ * expectations of $\frac{1}{2},\frac{1}{3}..\frac{1}{N}$
+ * as the simulation proceeds from the root. Thus the
+ * total expected branch length on the tree is
+ * $\sum_{k=2}^{N} \frac{1}{k}$.
+ *
+ * Args: r - random number source
+ * N - number of taxa (>= 2)
+ * ret_T - RETURN: sampled tree
+ *
+ * Returns: <eslOK> on success, and the new tree is allocated
+ * here and returned via <ret_tree>; caller is
+ * responsible for free'ing it.
+ *
+ * Throws: <eslEMEM> on allocation failure, in which case
+ * the <ret_T> is returned <NULL>.
+ *
+ * Xref: STL11/65.
+ */
+int
+esl_tree_Simulate(ESL_RANDOMNESS *r, int N, ESL_TREE **ret_T)
+{
+ ESL_TREE *T = NULL;
+ int *branchpapa = NULL;
+ int *branchside = NULL;
+ int nactive;
+ double d;
+ int node;
+ int bidx; /* index of an active branch */
+ int status;
+
+ ESL_DASSERT1( (r != NULL) );
+ ESL_DASSERT1( (N >= 2) );
+
+ /* Kuhner/Felsenstein uses a list of active branches,
+ * which we implement by tracking the index of the parent
+ * node (in <branchpapa>) and a 0/1 flag (in <branchside>)
+ * for the branch to the left vs. right child.
+ */
+ if ((T = esl_tree_Create(N)) == NULL) { status = eslEMEM; goto ERROR; }
+ ESL_ALLOC(branchpapa, sizeof(int) * N);
+ ESL_ALLOC(branchside, sizeof(int) * N);
+
+ /* Initialize: add two branches from the root
+ * onto the active list, and set internal node
+ * counter to start at 1.
+ */
+ branchpapa[0] = 0; branchside[0] = 0;
+ branchpapa[1] = 0; branchside[1] = 1;
+ nactive = 2;
+ node = 1;
+
+ /* Algorithm proceeds by iterating:
+ * 1. choose random time <d> from exponential(1/nactive)
+ * 2. choose random active branch, <bidx>
+ * 3. add new <node> to active branch at length d
+ * 4. add d to all other active branches
+ * 5. delete the old parent branch from the active list,
+ * add the two new child branches to the active list
+ */
+ while (nactive < N)
+ {
+ d = (double) nactive * -log(esl_rnd_UniformPositive(r));
+ bidx = esl_rnd_Roll(r, nactive);
+ T->parent[node] = branchpapa[bidx];
+
+ if (branchside[bidx] == 0) {
+ T->left[branchpapa[bidx]] = node;
+ T->ld [branchpapa[bidx]] += d;
+ } else {
+ T->right[branchpapa[bidx]] = node;
+ T->rd [branchpapa[bidx]] += d;
+ }
+
+ ESL_SWAP(branchpapa[bidx], branchpapa[nactive-1], int);
+ ESL_SWAP(branchside[bidx], branchside[nactive-1], int);
+ for (bidx = 0; bidx < nactive-1; bidx++) {
+ if (branchside[bidx] == 0) T->ld[branchpapa[bidx]] += d;
+ else T->rd[branchpapa[bidx]] += d;
+ }
+
+ /* delete the branch at nactive-1 that we just added to;
+ * replace it with two new branches
+ */
+ branchpapa[nactive-1] = node; branchside[nactive-1] = 0;
+ branchpapa[nactive] = node; branchside[nactive] = 1;
+ node++;
+ nactive++;
+ }
+
+ /* Terminate by adding the N taxa to the N active branches.
+ */
+ d = (double) N * -log(esl_rnd_UniformPositive(r));
+ for (bidx = 0; bidx < N; bidx++)
+ {
+ if (branchside[bidx] == 0) {
+ T->left[branchpapa[bidx]] = -bidx; /* taxa indices stored as neg #'s */
+ T->ld [branchpapa[bidx]] += d;
+ } else {
+ T->right[branchpapa[bidx]] = -bidx;
+ T->rd [branchpapa[bidx]] += d;
+ }
+ }
+
+ *ret_T = T;
+ free(branchpapa);
+ free(branchside);
+ return eslOK;
+
+ ERROR:
+ if (T != NULL) esl_tree_Destroy(T);
+ if (branchpapa != NULL) free(branchpapa);
+ if (branchside != NULL) free(branchside);
+ *ret_T = NULL;
+ return status;
+}
+
+
+/* Function: esl_tree_ToDistanceMatrix()
+ * Synopsis: Obtain a pairwise distance matrix from a tree.
+ *
+ * Purpose: Given tree <T>, calculate a pairwise distance matrix
+ * and return it in <ret_D>.
+ *
+ * Note: Algorithm here is O(N^3). It can probably be improved.
+ * There ought to be a more efficient recursion that
+ * saves recalculating node-node distances inside the tree.
+ * All we do here is a brute force, upwards O(N) LCA
+ * search for each of the N^2 taxon pairs.
+ *
+ * Args: T - input tree
+ * ret_D - RETURN: the new distance matrix
+ *
+ * Returns: <eslOK> on success, and <ret_D> points to the distance
+ * matrix, which caller is responsible for free'ing with
+ * <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <eslEMEM> on allocation failure, in which case
+ * <ret_D> is returned <NULL>.
+ *
+ * Xref: STL11/66.
+ */
+int
+esl_tree_ToDistanceMatrix(ESL_TREE *T, ESL_DMATRIX **ret_D)
+{
+ ESL_DMATRIX *D = NULL;
+ int i,j; /* a pair of taxa {0..N-1} */
+ int a,b; /* a pair of internal nodes {0..N-2} */
+ int p; /* a tmp parent index */
+ double d; /* ij distance */
+ int status;
+
+ D = esl_dmatrix_Create(T->N, T->N); /* creates a NxN square symmetric matrix; really only need triangular */
+ if (D == NULL) { status = eslEMEM; goto ERROR; }
+
+ if ((status = esl_tree_SetTaxaParents(T)) != eslOK) goto ERROR;
+
+ for (i = 0; i < T->N; i++)
+ {
+ D->mx[i][i] = 0.; /* by definition */
+ for (j = i+1; j < T->N; j++)
+ {
+ a = T->taxaparent[i];
+ b = T->taxaparent[j];
+ d = (T->left[a] == -i) ? T->ld[a] : T->rd[a];
+ d += (T->left[b] == -j) ? T->ld[b] : T->rd[b];
+ while (a != b) /* a brute force LCA algorithm */
+ {
+ if (a < b) ESL_SWAP(a, b, int);
+ p = T->parent[a];
+ d += (T->left[p] == a) ? T->ld[p] : T->rd[p];
+ a = p;
+ }
+
+ D->mx[i][j] = D->mx[j][i] = d;
+ }
+ }
+
+ *ret_D = D;
+ return eslOK;
+
+ ERROR:
+ if (D != NULL) esl_dmatrix_Destroy(D);
+ *ret_D = NULL;
+ return status;
+}
+
+
+
+/*****************************************************************
+ * 6. Unit tests
+ *****************************************************************/
+#ifdef eslTREE_TESTDRIVE
+
+static void
+utest_OptionalInformation(ESL_RANDOMNESS *r, int ntaxa)
+{
+ char *msg = "optional information fields unit test failed";
+ ESL_TREE *T;
+
+ if (esl_tree_Simulate(r, ntaxa, &T) != eslOK) esl_fatal(msg);
+ if (esl_tree_SetTaxaParents(T) != eslOK) esl_fatal(msg);
+ if (esl_tree_SetCladesizes(T) != eslOK) esl_fatal(msg);
+ if (esl_tree_Validate(T, NULL) != eslOK) esl_fatal(msg);
+
+ esl_tree_Destroy(T);
+ return;
+}
+
+
+static void
+utest_WriteNewick(ESL_RANDOMNESS *r, int ntaxa)
+{
+ char *msg = "esl_tree_WriteNewick unit test failed";
+ char tmpfile[32] = "esltmpXXXXXX";
+ FILE *fp = NULL;
+ ESL_TREE *T1 = NULL;
+ ESL_TREE *T2 = NULL;
+ char errbuf[eslERRBUFSIZE];
+
+ if (esl_tmpfile(tmpfile, &fp) != eslOK) esl_fatal(msg);
+ if (esl_tree_Simulate(r, ntaxa, &T1) != eslOK) esl_fatal(msg);
+ if (esl_tree_SetTaxonlabels(T1, NULL) != eslOK) esl_fatal(msg);
+ if (esl_tree_Validate(T1, NULL) != eslOK) esl_fatal(msg);
+ if (esl_tree_WriteNewick(fp, T1) != eslOK) esl_fatal(msg);
+ rewind(fp);
+ if (esl_tree_ReadNewick(fp, errbuf, &T2) != eslOK) esl_fatal(msg);
+ if (esl_tree_Validate(T2, NULL) != eslOK) esl_fatal(msg);
+ if (esl_tree_Compare(T1, T2) != eslOK) esl_fatal(msg);
+ fclose(fp);
+
+ esl_tree_Destroy(T1);
+ esl_tree_Destroy(T2);
+ return;
+}
+
+
+static void
+utest_UPGMA(ESL_RANDOMNESS *r, int ntaxa)
+{
+ char *msg = "esl_tree_UPGMA unit test failed";
+ ESL_TREE *T1 = NULL;
+ ESL_TREE *T2 = NULL;
+ ESL_DMATRIX *D1 = NULL;
+ ESL_DMATRIX *D2 = NULL;
+
+ if (esl_tree_Simulate(r, ntaxa, &T1) != eslOK) esl_fatal(msg);
+ if (esl_tree_ToDistanceMatrix(T1, &D1) != eslOK) esl_fatal(msg);
+ if (esl_tree_UPGMA(D1, &T2) != eslOK) esl_fatal(msg);
+
+ if (esl_tree_Validate(T1, NULL) != eslOK) esl_fatal(msg);
+ if (esl_tree_Validate(T2, NULL) != eslOK) esl_fatal(msg);
+ if (esl_tree_VerifyUltrametric(T1) != eslOK) esl_fatal(msg);
+ if (esl_tree_VerifyUltrametric(T2) != eslOK) esl_fatal(msg);
+ if (esl_tree_Compare(T1, T2) != eslOK) esl_fatal(msg);
+
+ if (esl_tree_ToDistanceMatrix(T1, &D2) != eslOK) esl_fatal(msg);
+ if (esl_dmatrix_Compare(D1, D2, 0.001) != eslOK) esl_fatal(msg);
+
+ esl_tree_Destroy(T1);
+ esl_tree_Destroy(T2);
+ esl_dmatrix_Destroy(D1);
+ esl_dmatrix_Destroy(D2);
+ return;
+}
+
+#endif /*eslTREE_TESTDRIVE*/
+/*-------------------- end, unit tests -------------------------*/
+
+
+/*****************************************************************
+ * 7. Test driver
+ *****************************************************************/
+#ifdef eslTREE_TESTDRIVE
+
+/*
+ * gcc -g -Wall -o test -L. -I. -DeslTREE_TESTDRIVE esl_tree.c -leasel -lm
+ * gcc -g -Wall -o test -L. -I. -DeslTEST_THROWING -DeslTREE_TESTDRIVE esl_msa.c -leasel -lm
+ * ./test
+ */
+#include "easel.h"
+#include "esl_tree.h"
+#include "esl_random.h"
+
+int
+main(int argc, char **argv)
+{
+ ESL_RANDOMNESS *r = NULL;
+ int ntaxa;
+
+ r = esl_randomness_Create(0);
+ ntaxa = 20;
+
+ utest_OptionalInformation(r, ntaxa); /* SetTaxaparents(), SetCladesizes() */
+ utest_WriteNewick(r, ntaxa);
+ utest_UPGMA(r, ntaxa);
+
+ esl_randomness_Destroy(r);
+ return eslOK;
+}
+
+#endif /*eslTREE_TESTDRIVE*/
+/*-------------------- end, test driver -------------------------*/
+
+
+
+
+/*****************************************************************
+ * 8. Examples.
+ *****************************************************************/
+
+/* The first example is an example of inferring a tree by the
+ * UPGMA algorithm, starting from a multiple sequence alignment.
+ */
+#ifdef eslTREE_EXAMPLE
+/*::cexcerpt::tree_example::begin::*/
+/* To compile: gcc -g -Wall -o example -I. -DeslTREE_EXAMPLE esl_tree.c esl_dmatrix.c esl_msa.c easel.c -lm
+ * or: gcc -g -Wall -o example -I. -L. -DeslTREE_EXAMPLE esl_tree.c -leasel -lm
+ * To run: ./example <MSA file>
+ */
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_distance.h"
+#include "esl_tree.h"
+
+int main(int argc, char **argv)
+{
+ ESL_TREE *tree = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ ESL_DMATRIX *D = NULL;
+
+ esl_msafile_Open(NULL, argv[1], NULL, eslMSAFILE_UNKNOWN, NULL, &afp);
+ esl_msafile_Read(afp, &msa);
+ esl_msafile_Close(afp);
+
+ esl_dst_CDiffMx(msa->aseq, msa->nseq, &D);
+ esl_tree_UPGMA(D, &tree);
+
+ esl_tree_Destroy(tree);
+ esl_msa_Destroy(msa);
+ esl_dmatrix_Destroy(D);
+ return eslOK;
+}
+/*::cexcerpt::tree_example::end::*/
+#endif /*eslTREE_EXAMPLE*/
+
+
+/* The second example is an example of reading in a Newick format tree.
+ */
+#ifdef eslTREE_EXAMPLE2
+/*::cexcerpt::tree_example2::begin::*/
+/* To compile: gcc -g -Wall -o example -I. -DeslTREE_EXAMPLE2 esl_tree.c esl_dmatrix.c esl_msa.c easel.c -lm
+ * or: gcc -g -Wall -o example -I. -L. -DeslTREE_EXAMPLE2 esl_tree.c -leasel -lm
+ * To run: ./example <Newick file>
+ */
+#include "easel.h"
+#include "esl_msa.h"
+#include "esl_distance.h"
+#include "esl_tree.h"
+
+int main(int argc, char **argv)
+{
+ ESL_TREE *T;
+ char errbuf[eslERRBUFSIZE];
+ FILE *fp;
+
+ if ((fp = fopen(argv[1], "r")) == NULL) esl_fatal("Failed to open %s", argv[1]);
+ if (esl_tree_ReadNewick(fp, errbuf, &T) != eslOK) esl_fatal("Failed to read tree: %s", errbuf);
+ esl_tree_WriteNewick(stdout, T);
+
+ esl_tree_Destroy(T);
+ fclose(fp);
+ return eslOK;
+}
+/*::cexcerpt::tree_example2::end::*/
+#endif /*eslTREE_EXAMPLE*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_tree.h b/esl_tree.h
new file mode 100644
index 0000000..1d59c10
--- /dev/null
+++ b/esl_tree.h
@@ -0,0 +1,123 @@
+/* Phylogenetic trees.
+ *
+ * SRE, Tue May 2 13:54:30 2006 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslTREE_INCLUDED
+#define eslTREE_INCLUDED
+
+#include <esl_dmatrix.h>
+#include <esl_random.h>
+
+/* Object: ESL_TREE
+ *
+ * All trees are represented as rooted trees, starting from
+ * node 0. For N taxa, there are N-1 internal nodes, numbered
+ * 0..N-2. Taxa on leaves are numbered 0..N-1, and represented
+ * in <left> and <right> as negative numbers.
+ *
+ */
+typedef struct {
+ int N; /* number of taxa */
+
+ /* (Mandatory) information for the internal nodes of a rooted tree.
+ * There are N-1 nodes, numbered 0..N-2, with the root at 0,
+ * so each array below is indexed [0..N-2].
+ * When an internal node has a left or right branch to a taxon,
+ * <left>/<right> are <= 0, negative <taxon #>; if they're to
+ * be used as array indices, flip their sign.
+ * There is no ambiguity between taxon 0/root node 0, because
+ * a taxon can't be a parent, and the root node can't be a child.
+ * For an unrooted tree, by convention, taxon 0 is the outgroup: T->left[0] = 0,
+ * and T->rd[0] = 0.0.
+ */
+ int *parent; /* index of parent of node: values are 0..N-2; parent of root 0 = 0 */
+ int *left; /* index of left child: values are -(N-1)..0=taxa; 1..N-2=nodes */
+ int *right; /* index of right child: values are -(N-1)..0=taxa; 1..N-2=nodes */
+ double *ld; /* left branch length under node: values are >= 0 */
+ double *rd; /* right branch length under node: values are >= 0 */
+ /* in linkage trees, ld[x]=rd[x]= "height" (linkage value) of node, not branch lengths */
+
+ /* Derived (optional) information, that we can reconstruct if
+ * we need to from the mandatory info above.
+ */
+ int *taxaparent; /* for taxa [0..N-1]: index of its parent node, 0..N-2. [esl_tree_SetTaxaParents()] */
+ int *cladesize; /* for nodes [0..N-2]: # taxa in this clade, 1..N [esl_tree_SetCladesizes()] */
+
+ /* Optional information */
+ char **taxonlabel; /* labels for taxa: [0..N-1] array of char strings */
+ char **nodelabel; /* labels for nodes: [0..N-2] array of char strings */
+
+ /* Tree mode options. */
+ int is_linkage_tree; /* TRUE if this is a linkage tree; if FALSE, it's an additive tree */
+
+
+ /* Tree output options. */
+ int show_unrooted; /* TRUE to output 'root' as a trifurcation (a la PHYLIP) */
+ int show_node_labels; /* TRUE to output labels for interior nodes */
+ int show_root_branchlength; /* TRUE to show 0.0 branch length to root node (a la TreeAlign) */
+ int show_branchlengths; /* TRUE to output branch lengths */
+ int show_quoted_labels; /* TRUE to output ALL labels as quoted labels */
+ int show_numeric_taxonlabels;/* TRUE to output taxa labels as their 0..N-1 indices if no other taxonlabel is present */
+
+ /* Memory allocation information, when growing a tree (on input, for example)
+ */
+ int nalloc; /* current allocated # of taxa */
+
+} ESL_TREE;
+
+/* UPGMA, average-link, minimum-link, and maximum-link clustering are
+ * all implemented by one algorithm, cluster_engine(), in esl_tree.c.
+ * We define some flags (within the scope of the tree module) to
+ * control the behavior, as we call the algorithm engine from four
+ * different API functions.
+ */
+#define eslUPGMA 0
+#define eslWPGMA 1
+#define eslSINGLE_LINKAGE 2
+#define eslCOMPLETE_LINKAGE 3
+
+
+
+/* 1. The ESL_TREE object.
+ */
+extern ESL_TREE *esl_tree_Create(int ntaxa);
+extern ESL_TREE *esl_tree_CreateGrowable(int nalloc);
+extern ESL_TREE *esl_tree_CreateFromString(char *s);
+extern int esl_tree_Grow(ESL_TREE *T);
+extern int esl_tree_SetTaxaParents(ESL_TREE *T);
+extern int esl_tree_SetCladesizes(ESL_TREE *T);
+extern int esl_tree_SetTaxonlabels(ESL_TREE *T, char **names);
+extern int esl_tree_RenumberNodes(ESL_TREE *T);
+extern int esl_tree_VerifyUltrametric(ESL_TREE *T);
+extern int esl_tree_Validate(ESL_TREE *T, char *errbuf);
+extern void esl_tree_Destroy(ESL_TREE *T);
+
+/* 2. Newick format i/o
+ */
+extern int esl_tree_WriteNewick(FILE *fp, ESL_TREE *T);
+extern int esl_tree_ReadNewick(FILE *fp, char *errbuf, ESL_TREE **ret_T);
+
+/* 3. Tree comparison algorithms.
+ */
+extern int esl_tree_Compare(ESL_TREE *T1, ESL_TREE *T2);
+
+/* 4. Clustering algorithms for distance-based tree construction.
+ */
+extern int esl_tree_UPGMA(ESL_DMATRIX *D, ESL_TREE **ret_T);
+extern int esl_tree_WPGMA(ESL_DMATRIX *D, ESL_TREE **ret_T);
+extern int esl_tree_SingleLinkage(ESL_DMATRIX *D, ESL_TREE **ret_T);
+extern int esl_tree_CompleteLinkage(ESL_DMATRIX *D, ESL_TREE **ret_T);
+
+/* 5. Generating simulated trees.
+ */
+extern int esl_tree_Simulate(ESL_RANDOMNESS *r, int N, ESL_TREE **ret_T);
+extern int esl_tree_ToDistanceMatrix(ESL_TREE *T, ESL_DMATRIX **ret_D);
+
+
+#endif /*eslTREE_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
diff --git a/esl_tree.tex b/esl_tree.tex
new file mode 100644
index 0000000..2623ff3
--- /dev/null
+++ b/esl_tree.tex
@@ -0,0 +1,31 @@
+
+The \eslmod{tree} module implements an object for representing
+phylogenetic trees (\ccode{ESL\_TREE}). It also implements four of the
+most basic distance-based methods for tree inference and clustering
+algorithms (UPGMA, WPGMA, single linkage clustering, and complete
+linkage clustering).
+
+\begin{table}[hbp]
+\begin{center}
+{\small
+\begin{tabular}{|ll|}\hline
+\apisubhead{the \ccode{ESL\_TREE} object}\\
+\hyperlink{func:esl_tree_Create()}{\ccode{esl\_tree\_Create()}} & Constructor.\\
+\hyperlink{func:esl_tree_Destroy()}{\ccode{esl\_tree\_Destroy()}} & Destructor.\\
+\apisubhead{simple tree inference/clustering algorithms}\\
+\hyperlink{func:esl_tree_UPGMA()}{\ccode{esl\_tree\_UPGMA()}} & Infer a tree by UPGMA.\\
+\hyperlink{func:esl_tree_WPGMA()}{\ccode{esl\_tree\_WPGMA()}} & Infer a tree by WPGMA.\\
+\hyperlink{func:esl_tree_SingleLinkage()}{\ccode{esl\_tree\_SingleLinkage()}} & Infer a tree by single-linkage clustering.\\
+\hyperlink{func:esl_tree_CompleteLinkage()}{\ccode{esl\_tree\_CompleteLinkage()}} & Infer a tree by complete-linkage clustering.\\
+\hline
+\end{tabular}
+}
+\end{center}
+\caption{The \eslmod{tree} API. Requires \eslmod{easel}, \eslmod{dmatrix}.}
+\label{tbl:tree_api}
+\end{table}
+
+
+\subsection{Example of using the tree API}
+
+\input{cexcerpts/tree_example}
diff --git a/esl_vectorops.c b/esl_vectorops.c
new file mode 100644
index 0000000..278b888
--- /dev/null
+++ b/esl_vectorops.c
@@ -0,0 +1,1460 @@
+/* Operations on vectors of floats or doubles.
+ *
+ * Can operate on vectors of doubles, floats, or integers - appropriate
+ * routine is prefixed with D, F, or I. For example, esl_vec_DSet() is
+ * the Set routine for a vector of doubles; esl_vec_ISet() is for integers.
+ *
+ * Contents:
+ * 1. The vectorops API.
+ * 2. Unit tests.
+ * 3. Test driver.
+ * 4. Examples.
+ * 5. Copyright and license information.
+ *
+ */
+#include "esl_config.h"
+
+#include <math.h>
+#include <float.h>
+
+#include "easel.h"
+#include "esl_vectorops.h"
+
+/* Function: esl_vec_DSet()
+ * Synopsis: Set all items in vector to scalar value.
+ *
+ * Purpose: Sets all <n> items in <vec> to <value>.
+ *
+ * <esl_vec_FSet()> and <esl_vec_ISet()> do the same,
+ * for float and integer vectors.
+ */
+void
+esl_vec_DSet(double *vec, int n, double value)
+{
+ int x;
+ for (x = 0; x < n; x++) vec[x] = value;
+}
+void
+esl_vec_FSet(float *vec, int n, float value)
+{
+ int x;
+ for (x = 0; x < n; x++) vec[x] = value;
+}
+void
+esl_vec_ISet(int *vec, int n, int value)
+{
+ int x;
+ for (x = 0; x < n; x++) vec[x] = value;
+}
+
+
+/* Function: esl_vec_DScale()
+ * Synopsis: Multiply all items in vector by scalar value.
+ *
+ * Purpose: Multiplies all <n> items in <vec> by <scale>.
+ *
+ * <esl_vec_FScale()> and <esl_vec_IScale()> do the same,
+ * for float and integer vectors.
+ *
+ * Essentially the same as BLAS1's xSCAL().
+ */
+void
+esl_vec_DScale(double *vec, int n, double scale)
+{
+ int x;
+ for (x = 0; x < n; x++) vec[x] *= scale;
+}
+void
+esl_vec_FScale(float *vec, int n, float scale)
+{
+ int x;
+ for (x = 0; x < n; x++) vec[x] *= scale;
+}
+void
+esl_vec_IScale(int *vec, int n, int scale)
+{
+ int x;
+ for (x = 0; x < n; x++) vec[x] *= scale;
+}
+
+
+/* Function: esl_vec_DIncrement()
+ * Synopsis: Add a scalar to all items in a vector.
+ * Incept: SRE, Mon Mar 21 11:56:57 2005 [St. Louis]
+ *
+ * Purpose: Adds scalar <x> to all items in the <n>-vector <v>.
+ *
+ * <esl_vec_FIncrement()> and <esl_vec_IIncrement()> do the
+ * same, for float and integer vectors.
+ */
+void
+esl_vec_DIncrement(double *v, int n, double x)
+{
+ int i;
+ for (i = 0; i < n; i++) v[i] += x;
+}
+void
+esl_vec_FIncrement(float *v, int n, float x)
+{
+ int i;
+ for (i = 0; i < n; i++) v[i] += x;
+}
+void
+esl_vec_IIncrement(int *v, int n, int x)
+{
+ int i;
+ for (i = 0; i < n; i++) v[i] += x;
+}
+
+
+
+/* Function: esl_vec_DSum()
+ * Synopsis: Returns $\sum_i x_i$.
+ *
+ * Purpose: Returns the scalar sum of the <n> items in <vec>.
+ *
+ * <esl_vec_FSum()> and <esl_vec_ISum()> do the same,
+ * but for float and integer vectors.
+ *
+ * The floating point summations use Kahan compensated
+ * summation, in order to minimize roundoff error
+ * accumulation. Additionally, I believe they are most
+ * accurate if vec[] is sorted in increasing order, from
+ * small to large, so you may consider sorting <vec> before
+ * summing it.
+ */
+double
+esl_vec_DSum(double *vec, int n)
+{
+ double sum = 0.;
+ double y,t,c;
+ int x;
+
+ c = 0.0;
+ for (x = 0; x < n; x++) {
+ y = vec[x] - c; t = sum + y; c = (t-sum)-y; sum = t;
+ }
+ return sum;
+}
+float
+esl_vec_FSum(float *vec, int n)
+{
+ float sum = 0.;
+ float y,t,c;
+ int x;
+
+ c = 0.0;
+ for (x = 0; x < n; x++) {
+ y = vec[x] - c; t = sum + y; c = (t-sum)-y; sum = t;
+ }
+ return sum;
+}
+int
+esl_vec_ISum(int *vec, int n)
+{
+ int sum = 0;
+ int x;
+ for (x = 0; x < n; x++) sum += vec[x];
+ return sum;
+}
+
+
+/* Function: esl_vec_DAdd()
+ * Synopsis: Vector addition of two vectors.
+ *
+ * Purpose: Vector addition. Adds <vec2> to <vec1>, leaving
+ * result in <vec1>. (<vec2> is unchanged.).
+ * Both vectors are of size <n>.
+ *
+ * <esl_vec_FAdd()> and <esl_vec_IAdd()> do the same,
+ * for float and integer vectors.
+ */
+void
+esl_vec_DAdd(double *vec1, const double *vec2, int n)
+{
+ int x;
+ for (x = 0; x < n; x++) vec1[x] += vec2[x];
+}
+void
+esl_vec_FAdd(float *vec1, const float *vec2, int n)
+{
+ int x;
+ for (x = 0; x < n; x++) vec1[x] += vec2[x];
+}
+void
+esl_vec_IAdd(int *vec1, const int *vec2, int n)
+{
+ int x;
+ for (x = 0; x < n; x++) vec1[x] += vec2[x];
+}
+
+
+/* Function: esl_vec_DAddScaled()
+ * Synopsis: Scale <vec2> and add it to <vec1>.
+ *
+ * Purpose: Scales <vec2> by scalar <a>, and adds that
+ * to <vec1>. Both vectors are of size <n>.
+ *
+ * <esl_vec_FAddScaled()> and <esl_vec_IAddScaled()> do the same,
+ * for float and integer vectors.
+ *
+ * Essentially the same as BLAS1 xAXPY().
+ */
+void
+esl_vec_DAddScaled(double *vec1, double *vec2, double a, int n)
+{
+ int x;
+ for (x = 0; x < n; x++) vec1[x] += vec2[x] * a;
+}
+void
+esl_vec_FAddScaled(float *vec1, float *vec2, float a, int n)
+{
+ int x;
+ for (x = 0; x < n; x++) vec1[x] += vec2[x] * a;
+}
+void
+esl_vec_IAddScaled(int *vec1, int *vec2, int a, int n)
+{
+ int x;
+ for (x = 0; x < n; x++) vec1[x] += vec2[x] * a;
+}
+
+
+
+/* Function: esl_vec_DCopy()
+ * Synopsis: Set <dest> vector to same values as <src>.
+ *
+ * Purpose: Copies <src> to <dest>. <src> is
+ * unchanged. Both vectors are of size <n>.
+ *
+ * <esl_vec_FCopy()> and <esl_vec_ICopy()> do the same,
+ * for float and integer vectors.
+ *
+ * Essentially the same as BLAS1 xCOPY().
+ */
+void
+esl_vec_DCopy(const double *src, const int n, double *dest)
+{
+ int x;
+ for (x = 0; x < n; x++) dest[x] = src[x];
+}
+void
+esl_vec_FCopy(const float *src, const int n, float *dest)
+{
+ int x;
+ for (x = 0; x < n; x++) dest[x] = src[x];
+}
+void
+esl_vec_ICopy(const int *src, const int n, int *dest)
+{
+ int x;
+ for (x = 0; x < n; x++) dest[x] = src[x];
+}
+
+
+/* Function: esl_vec_DCompare()
+ * Synopsis: Return <eslOK> if two vectors are equal.
+ * Incept: SRE, Mon Nov 6 10:20:28 2006 [Janelia]
+ *
+ * Purpose: Compare <vec1> to <vec2> for equality, by
+ * comparing each cognate element pair. Both vectors
+ * are of size <n>. Equality of elements is
+ * defined by being $\leq$ fractional tolerance <tol>
+ * for floating point comparisons, and strict equality
+ * for integer comparisons. Return <eslOK>
+ * if the vectors are equal, and <eslFAIL> if not.
+ *
+ * If <n=0>, the test always succeeds. In this case, either
+ * <vec1> and <vec2> (or both) may be <NULL>. This
+ * accommodates an occasional convention of leaving empty
+ * vectors <NULL>.
+ *
+ * <esl_vec_FCompare()> and <esl_vec_ICompare()> do the same,
+ * for float and integer vectors.
+ */
+int
+esl_vec_DCompare(const double *vec1, const double *vec2, int n, double tol)
+{
+ int i;
+ for (i = 0; i < n; i++) if (esl_DCompare(vec1[i], vec2[i], tol) == eslFAIL) return eslFAIL;
+ return eslOK;
+}
+int
+esl_vec_FCompare(const float *vec1, const float *vec2, int n, float tol)
+{
+ int i;
+ for (i = 0; i < n; i++) if (esl_DCompare(vec1[i], vec2[i], tol) == eslFAIL) return eslFAIL;
+ return eslOK;
+}
+int
+esl_vec_ICompare(const int *vec1, const int *vec2, int n)
+{
+ int i;
+ for (i = 0; i < n; i++) if (vec1[i] != vec2[i]) return eslFAIL;
+ return eslOK;
+}
+
+
+
+/* Function: esl_vec_DSwap()
+ * Synopsis: Swap two vectors.
+ *
+ * Purpose: Swaps <vec2> and <vec1>.
+ * Both vectors are of size <n>.
+ *
+ * <esl_vec_FSwap()> and <esl_vec_ISwap()> do the same,
+ * for float and integer vectors.
+ *
+ * Essentially the same as BLAS1 xSWAP().
+ *
+ * You will be better off swapping the pointers to
+ * the vectors, if that's feasible.
+ */
+void
+esl_vec_DSwap(double *vec1, double *vec2, int n)
+{
+ int x;
+ double tmp;
+
+ for (x = 0; x < n; x++)
+ { tmp = vec1[x]; vec1[x] = vec2[x]; vec2[x] = tmp; }
+}
+void
+esl_vec_FSwap(float *vec1, float *vec2, int n)
+{
+ int x;
+ float tmp;
+
+ for (x = 0; x < n; x++)
+ { tmp = vec1[x]; vec1[x] = vec2[x]; vec2[x] = tmp; }
+}
+void
+esl_vec_ISwap(int *vec1, int *vec2, int n)
+{
+ int x;
+ int tmp;
+
+ for (x = 0; x < n; x++)
+ { tmp = vec1[x]; vec1[x] = vec2[x]; vec2[x] = tmp; }
+}
+
+
+/* Function: esl_vec_DReverse()
+ * Synopsis: Reverse a vector (possibly in place).
+ *
+ * Purpose: Put the <n> values from vector <vec> in reversed order in
+ * <rev>. Caller provides storage in <rev> for at least <n>
+ * values.
+ *
+ * <vec> and <rev> can be the same, in which case <vec> is
+ * reversed in place.
+ *
+ * <esl_vec_FReverse()>, <esl_vec_IReverse()>, and
+ * <esl_vec_CReverse()> do the same, for float, integer,
+ * and char arrays.
+ *
+ * <esl_vec_CReverse()> needs to be used carefully if
+ * <vec> is a NUL-terminated string, instead of an array.
+ * If you reverse a string <s> in place (i.e.
+ * <esl_vec_CReverse(s, s, n)>), the trailing NUL will
+ * still be there, and you're fine. If you reverse string
+ * <s> into new storage <s2>, you'll need to NUL-terminate
+ * <s2> yourself.
+ */
+void
+esl_vec_DReverse(double *vec, double *rev, int n)
+{
+ int i;
+ double x;
+
+ for (i = 0; i < n/2; i++)
+ {
+ x = vec[n-i-1];
+ rev[n-i-1] = vec[i];
+ rev[i] = x;
+ }
+ if (n%2) rev[i] = vec[i];
+}
+void
+esl_vec_FReverse(float *vec, float *rev, int n)
+{
+ int i;
+ float x;
+
+ for (i = 0; i < n/2; i++)
+ {
+ x = vec[n-i-1];
+ rev[n-i-1] = vec[i];
+ rev[i] = x;
+ }
+ if (n%2) rev[i] = vec[i];
+}
+void
+esl_vec_IReverse(int *vec, int *rev, int n)
+{
+ int i;
+ int x;
+
+ for (i = 0; i < n/2; i++)
+ {
+ x = vec[n-i-1];
+ rev[n-i-1] = vec[i];
+ rev[i] = x;
+ }
+ if (n%2) rev[i] = vec[i];
+}
+void
+esl_vec_CReverse(char *vec, char *rev, int n)
+{
+ int i;
+ char x;
+
+ for (i = 0; i < n/2; i++)
+ {
+ x = vec[n-i-1];
+ rev[n-i-1] = vec[i];
+ rev[i] = x;
+ }
+ if (n%2) rev[i] = vec[i];
+}
+
+
+
+/* Function: esl_vec_DDot()
+ * Synopsis: Return the dot product of two vectors.
+ *
+ * Purpose: Returns the scalar dot product <vec1> $\cdot$ <vec2>.
+ * Both vectors are of size <n>.
+ *
+ * <esl_vec_FDot()> and <esl_vec_IDot()> do the same,
+ * for float and integer vectors.
+ */
+double
+esl_vec_DDot(double *vec1, double *vec2, int n)
+{
+ double result = 0.;
+ int x;
+ for (x = 0; x < n; x++) result += vec1[x] * vec2[x];
+ return result;
+}
+float
+esl_vec_FDot(float *vec1, float *vec2, int n)
+{
+ float result = 0.;
+ int x;
+ for (x = 0; x < n; x++) result += vec1[x] * vec2[x];
+ return result;
+}
+int
+esl_vec_IDot(int *vec1, int *vec2, int n)
+{
+ int result = 0;
+ int x;
+ for (x = 0; x < n; x++) result += vec1[x] * vec2[x];
+ return result;
+}
+
+
+
+/* Function: esl_vec_DMax()
+ * Synopsis: Return value of the maximum element in a vector.
+ *
+ * Purpose: Returns the maximum value of the <n> values
+ * in <vec>.
+ *
+ * <esl_vec_FMax()> and <esl_vec_IMax()> do the same,
+ * for float and integer vectors.
+ */
+double
+esl_vec_DMax(const double *vec, int n)
+{
+ int i;
+ double best;
+
+ best = vec[0];
+ for (i = 1; i < n; i++)
+ if (vec[i] > best) best = vec[i];
+ return best;
+}
+float
+esl_vec_FMax(const float *vec, int n)
+{
+ int i;
+ float best;
+
+ best = vec[0];
+ for (i = 1; i < n; i++)
+ if (vec[i] > best) best = vec[i];
+ return best;
+}
+int
+esl_vec_IMax(const int *vec, int n)
+{
+ int i;
+ int best;
+
+ best = vec[0];
+ for (i = 1; i < n; i++)
+ if (vec[i] > best) best = vec[i];
+ return best;
+}
+
+
+/* Function: esl_vec_DMin()
+ * Synopsis: Return value of the minimum element in a vector.
+ *
+ * Purpose: Returns the minimum value of the <n> values
+ * in <vec>.
+ *
+ * <esl_vec_FMin()> and <esl_vec_IMin()> do the same,
+ * for float and integer vectors.
+ */
+double
+esl_vec_DMin(const double *vec, int n)
+{
+ int i;
+ double best;
+
+ best = vec[0];
+ for (i = 1; i < n; i++)
+ if (vec[i] < best) best = vec[i];
+ return best;
+}
+float
+esl_vec_FMin(const float *vec, int n)
+{
+ int i;
+ float best;
+
+ best = vec[0];
+ for (i = 1; i < n; i++)
+ if (vec[i] < best) best = vec[i];
+ return best;
+}
+int
+esl_vec_IMin(const int *vec, int n)
+{
+ int i;
+ int best;
+
+ best = vec[0];
+ for (i = 1; i < n; i++)
+ if (vec[i] < best) best = vec[i];
+ return best;
+}
+
+
+/* Function: esl_vec_DArgMax()
+ * Synopsis: Return index of maximum element in a vector.
+ *
+ * Purpose: Returns the index of the maximum value in the <n> values
+ * in <vec>. In case of ties, the element with the smallest index
+ * is returned.
+ *
+ * <n> can be 0 and <vec> can be <NULL>, in which case the
+ * function returns 0.
+ *
+ * <esl_vec_FArgMax()> and <esl_vec_IArgMax()> do the same,
+ * for float and integer vectors.
+ *
+ * Note: Do not change the behavior that the smallest index is
+ * returned in case of ties. Some functions rely on this
+ * behavior: optimal accuracy tracebacks in HMMER for example.
+ */
+int
+esl_vec_DArgMax(const double *vec, int n)
+{
+ int i;
+ int best = 0;
+
+ for (i = 1; i < n; i++)
+ if (vec[i] > vec[best]) best = i;
+ return best;
+}
+int
+esl_vec_FArgMax(const float *vec, int n)
+{
+ int i;
+ int best = 0;
+
+ for (i = 1; i < n; i++)
+ if (vec[i] > vec[best]) best = i;
+ return best;
+}
+int
+esl_vec_IArgMax(const int *vec, int n)
+{
+ int i;
+ int best = 0;
+
+ for (i = 1; i < n; i++)
+ if (vec[i] > vec[best]) best = i;
+ return best;
+}
+
+
+/* Function: esl_vec_DArgMin()
+ * Synopsis: Return index of minimum element in a vector.
+ *
+ * Purpose: Returns the index of the minimum value in the <n> values
+ * in <vec>.
+ *
+ * <esl_vec_FArgMin()> and <esl_vec_IArgMin()> do the same,
+ * for float and integer vectors.
+ */
+int
+esl_vec_DArgMin(const double *vec, int n)
+{
+ int i;
+ int best = 0;
+ for (i = 1; i < n; i++)
+ if (vec[i] < vec[best]) best = i;
+ return best;
+}
+int
+esl_vec_FArgMin(const float *vec, int n)
+{
+ int i;
+ int best = 0;
+
+ for (i = 1; i < n; i++)
+ if (vec[i] < vec[best]) best = i;
+ return best;
+}
+int
+esl_vec_IArgMin(const int *vec, int n)
+{
+ int i;
+ int best = 0;
+
+ for (i = 1; i < n; i++)
+ if (vec[i] < vec[best]) best = i;
+ return best;
+}
+
+
+/* some static functions to pass to qsort() that the
+ * upcoming Sort() functions will call
+ */
+static int
+qsort_DIncreasing(const void *xp1, const void *xp2)
+{
+ double x1 = * (double *) xp1;
+ double x2 = * (double *) xp2;
+ if (x1 < x2) return -1;
+ if (x1 > x2) return 1;
+ return 0;
+}
+static int
+qsort_FIncreasing(const void *xp1, const void *xp2)
+{
+ float x1 = * (float *) xp1;
+ float x2 = * (float *) xp2;
+ if (x1 < x2) return -1;
+ if (x1 > x2) return 1;
+ return 0;
+}
+static int
+qsort_IIncreasing(const void *xp1, const void *xp2)
+{
+ int x1 = * (int *) xp1;
+ int x2 = * (int *) xp2;
+ if (x1 < x2) return -1;
+ if (x1 > x2) return 1;
+ return 0;
+}
+static int
+qsort_DDecreasing(const void *xp1, const void *xp2)
+{
+ double x1 = * (double *) xp1;
+ double x2 = * (double *) xp2;
+ if (x1 > x2) return -1;
+ if (x1 < x2) return 1;
+ return 0;
+}
+static int
+qsort_FDecreasing(const void *xp1, const void *xp2)
+{
+ float x1 = * (float *) xp1;
+ float x2 = * (float *) xp2;
+ if (x1 > x2) return -1;
+ if (x1 < x2) return 1;
+ return 0;
+}
+static int
+qsort_IDecreasing(const void *xp1, const void *xp2)
+{
+ int x1 = * (int *) xp1;
+ int x2 = * (int *) xp2;
+ if (x1 > x2) return -1;
+ if (x1 < x2) return 1;
+ return 0;
+}
+
+/* Function: esl_vec_DSortIncreasing()
+ * Synopsis: Sort vector from smallest to largest.
+ * Incept: SRE, Wed Aug 17 10:44:31 2005 [St. Louis]
+ *
+ * Purpose: Sorts <vec> in place, from smallest to largest value.
+ * (That is, <vec[0]> is the minimum and <vec[n-1]> is
+ * the maximum.)
+ *
+ * <esl_vec_FSortIncreasing()> and <esl_vec_ISortIncreasing()>
+ * do the same, for float and integer vectors.
+ */
+void
+esl_vec_DSortIncreasing(double *vec, int n)
+{
+ qsort((void *) vec, n, sizeof(double), qsort_DIncreasing);
+}
+void
+esl_vec_FSortIncreasing(float *vec, int n)
+{
+ qsort((void *) vec, n, sizeof(float), qsort_FIncreasing);
+}
+void
+esl_vec_ISortIncreasing(int *vec, int n)
+{
+ qsort((void *) vec, n, sizeof(int), qsort_IIncreasing);
+}
+
+/* Function: esl_vec_DSortDecreasing()
+ * Synopsis: Sort vector from largest to smallest.
+ * Incept: SRE, Wed Aug 17 10:44:31 2005 [St. Louis]
+ *
+ * Purpose: Sorts <vec> in place, from largest to smallest value.
+ * (That is, <vec[0]> is the maximum and <vec[n-1]> is
+ * the minimum.)
+ *
+ * <esl_vec_FSortDecreasing()> and <esl_vec_ISortDecreasing()>
+ * do the same, for float and integer vectors.
+ */
+void
+esl_vec_DSortDecreasing(double *vec, int n)
+{
+ qsort((void *) vec, n, sizeof(double), qsort_DDecreasing);
+}
+void
+esl_vec_FSortDecreasing(float *vec, int n)
+{
+ qsort((void *) vec, n, sizeof(float), qsort_FDecreasing);
+}
+void
+esl_vec_ISortDecreasing(int *vec, int n)
+{
+ qsort((void *) vec, n, sizeof(int), qsort_IDecreasing);
+}
+
+
+/* Function: esl_vec_DDump()
+ * Synopsis: Output vector to a stream as text.
+ * Incept: ER, Thu Jul 21 12:54:56 CDT 2005 [St. Louis]
+ *
+ * Purpose: Given a vector, dump it to stream <ofp>.
+ *
+ * If <label> is non-NULL, they represent
+ * single-character labels to put on the vector.
+ * (For example, these might be a sequence alphabet).
+ * Numbers 1..n is used if <label> is NULL.
+ *
+ * Args: ofp - output file pointer; stdout, for example.
+ * v - vector to dump.
+ * label - optional: NULL, or character labels
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_vec_DDump(FILE *ofp, double *v, int n, char *label)
+{
+ int a;
+
+ fprintf(ofp, " ");
+ if (label != NULL)
+ for (a = 0; a < n; a++) fprintf(ofp, " %c ", label[a]);
+ else
+ for (a = 0; a < n; a++) fprintf(ofp, "%10d ", a+1);
+ fprintf(ofp, "\n");
+
+ fprintf(ofp, " ");
+ for (a = 0; a < n; a++) fprintf(ofp, "%10.6f ", v[a]);
+ fprintf(ofp, "\n");
+
+ return eslOK;
+}
+int
+esl_vec_FDump(FILE *ofp, float *v, int n, char *label)
+{
+ int a;
+
+ fprintf(ofp, " ");
+ if (label != NULL)
+ for (a = 0; a < n; a++) fprintf(ofp, " %c ", label[a]);
+ else
+ for (a = 0; a < n; a++) fprintf(ofp, "%10d ", a+1);
+ fprintf(ofp, "\n");
+
+ fprintf(ofp, " ");
+ for (a = 0; a < n; a++) fprintf(ofp, "%10.6f ", v[a]);
+ fprintf(ofp, "\n");
+
+ return eslOK;
+}
+int
+esl_vec_IDump(FILE *ofp, int *v, int n, char *label)
+{
+ int a;
+
+ fprintf(ofp, " ");
+ if (label != NULL)
+ for (a = 0; a < n; a++) fprintf(ofp, " %c ", label[a]);
+ else
+ for (a = 0; a < n; a++) fprintf(ofp, "%8d ", a+1);
+ fprintf(ofp, "\n");
+
+ fprintf(ofp, " ");
+ for (a = 0; a < n; a++) fprintf(ofp, "%8d ", v[a]);
+ fprintf(ofp, "\n");
+
+ return eslOK;
+}
+
+/* Function: esl_vec_D2F()
+ * Synopsis: Convert between single-precision and double-precision vectors.
+ * Incept: SRE, Thu Mar 30 09:04:17 2006 [St. Louis]
+ *
+ * Purpose: Copy a double vector <src> to a float vector <dst>. Caller
+ * provides space in the float vector that is at
+ * least <n>.
+ *
+ * Similarly, <esl_vec_F2D()> converts float to double;
+ * <esl_vec_I2D()> converts integer to double;
+ * <esl_vec_I2F()> converts integer to float.
+ */
+void
+esl_vec_D2F(double *src, int n, float *dst)
+{
+ int i;
+ for (i = 0; i < n; i++) dst[i] = src[i];
+}
+void
+esl_vec_F2D(float *src, int n, double *dst)
+{
+ int i;
+ for (i = 0; i < n; i++) dst[i] = src[i];
+}
+void
+esl_vec_I2F(int *src, int n, float *dst)
+{
+ int i;
+ for (i = 0; i < n; i++) dst[i] = src[i];
+}
+void
+esl_vec_I2D(int *src, int n, double *dst)
+{
+ int i;
+ for (i = 0; i < n; i++) dst[i] = src[i];
+}
+
+
+
+
+/* Function: esl_vec_DNorm()
+ * Synopsis: Normalize probability vector.
+ *
+ * Purpose: Normalizes a probability vector <vec>,
+ * such that $\sum_{i=1}{n} \mathrm{vec}_i = 1.0$.
+ *
+ * <esl_vec_FNorm()> does the same, for a probability vector
+ * of floats.
+ */
+void
+esl_vec_DNorm(double *vec, int n)
+{
+ int x;
+ double sum;
+
+ sum = esl_vec_DSum(vec, n);
+ if (sum != 0.0) for (x = 0; x < n; x++) vec[x] /= sum;
+ else for (x = 0; x < n; x++) vec[x] = 1. / (double) n;
+}
+void
+esl_vec_FNorm(float *vec, int n)
+{
+ int x;
+ float sum;
+
+ sum = esl_vec_FSum(vec, n);
+ if (sum != 0.0) for (x = 0; x < n; x++) vec[x] /= sum;
+ else for (x = 0; x < n; x++) vec[x] = 1. / (float) n;
+}
+
+
+/* Function: esl_vec_DLog()
+ * Synopsis: Convert probability vector elements to log probabilities.
+ *
+ * Purpose: Converts a probability vector <vec> to a log
+ * probability vector: takes the log of each of the <n>
+ * values in the vector.
+ *
+ * <esl_vec_FLog()> does the same, for a probability vector
+ * of floats.
+ */
+void
+esl_vec_DLog(double *vec, int n)
+{
+ int x;
+ for (x = 0; x < n; x++)
+ if (vec[x] > 0.) vec[x] = log(vec[x]);
+ else vec[x] = -DBL_MAX;
+}
+void
+esl_vec_FLog(float *vec, int n)
+{
+ int x;
+ for (x = 0; x < n; x++)
+ if (vec[x] > 0.) vec[x] = logf(vec[x]);
+ else vec[x] = -FLT_MAX;
+}
+
+
+/* Function: esl_vec_DEntropy()
+ * Synopsis: Return Shannon entropy of p-vector, in bits.
+ *
+ * Purpose: Returns the Shannon entropy of a probability vector <p>,
+ * in bits ($\log_2$), defined as \citep{CoverThomas}:
+ *
+ * \[
+ * H = - \sum_x p_x \log_2 p_x.
+ * \]
+ *
+ * <esl_vec_FEntropy()> does the same, for a probability vector
+ * of floats.
+ */
+double
+esl_vec_DEntropy(const double *p, int n)
+{
+ int i;
+ double entropy;
+
+ entropy = 0.;
+ for(i = 0; i < n; i++)
+ if (p[i] > 0.) entropy += p[i] * log(p[i]);
+ return(-1.44269504 * entropy); /* converts to bits */
+}
+float
+esl_vec_FEntropy(const float *p, int n)
+{
+ int i;
+ float entropy;
+
+ entropy = 0.;
+ for(i = 0; i < n; i++)
+ if (p[i] > 0.) entropy += p[i] * logf(p[i]);
+ return(-1.44269504 * entropy); /* converts to bits */
+}
+
+/* Function: esl_vec_DRelEntropy()
+ * Synopsis: Return relative entropy $D(p \parallel q)$ in bits.
+ * Incept: SRE, Fri May 11 09:03:07 2007 [Janelia]
+ *
+ * Purpose: Returns Shannon relative entropy of probability
+ * vectors <p> and <q> in bits, also known as the
+ * Kullback Leibler "distance" \citep[p.18]{CoverThomas}:
+ *
+ * \[
+ * D(p \parallel f) = \sum_x p_x \log_2 \frac{p_x}{q_x}.
+ * \]
+ *
+ * If for any $x$ $q_x = 0$ and $p_x > 0$, the relative
+ * entropy is $\infty$.
+ *
+ * <esl_vec_FRelEntropy()> does the same, for probability
+ * vectors of floats.
+ */
+double
+esl_vec_DRelEntropy(const double *p, const double *q, int n)
+{
+ int i;
+ double kl;
+
+ kl = 0.;
+ for(i = 0; i < n; i++)
+ if (p[i] > 0.) {
+ if (q[i] == 0.) return eslINFINITY;
+ else kl += p[i] * log(p[i]/q[i]);
+ }
+ return(1.44269504 * kl); /* converts to bits */
+}
+float
+esl_vec_FRelEntropy(const float *p, const float *q, int n)
+{
+ int i;
+ float kl;
+
+ kl = 0.;
+ for(i = 0; i < n; i++)
+ if (p[i] > 0.) {
+ if (q[i] == 0.) return eslINFINITY;
+ else kl += p[i] * log(p[i]/q[i]);
+ }
+ return(1.44269504 * kl); /* converts to bits */
+}
+
+
+/* Function: esl_vec_DExp()
+ * Synopsis: Converts log probability vector elements to probabilities.
+ *
+ * Purpose: Converts a log probability vector <vec> back to a
+ * probability vector: exponentiates each of the <n>
+ * values in the vector.
+ *
+ * This routine only calls <exp()> on the elements of
+ * vector, which are presumed to be log probabilities;
+ * whether the resulting vector is a properly normalized
+ * probability vector is the caller's problem.
+ *
+ * <esl_vec_FExp()> does the same, for a log probability vector
+ * of floats.
+ */
+void
+esl_vec_DExp(double *vec, int n)
+{
+ int x;
+ for (x = 0; x < n; x++) vec[x] = exp(vec[x]);
+}
+void
+esl_vec_FExp(float *vec, int n)
+{
+ int x;
+ for (x = 0; x < n; x++) vec[x] = expf(vec[x]);
+}
+
+/* Function: esl_vec_DLogSum()
+ * Synopsis: Given log-p-vector, return log of sum of probabilities.
+ *
+ * Purpose: <vec> is a log probability vector; return the log of the scalar sum
+ * of the probabilities in <vec>. That is, the <n> elements in <vec>
+ * are log probabilities, but the summation is done in probability
+ * space, by exponentiating each of the <n> values in the vector,
+ * summing, and returning the log of the sum.
+ *
+ * That is: return $\log \sum_i e^{v_i}$.
+ *
+ * The trick is to do this without numerical underflow or overflow.
+ *
+ * <esl_vec_FLogSum()> does the same, for a log probability vector
+ * of floats.
+ */
+double
+esl_vec_DLogSum(double *vec, int n)
+{
+ int x;
+ double max, sum;
+
+ max = esl_vec_DMax(vec, n);
+ if (max == eslINFINITY) return eslINFINITY; /* avoid inf-inf below! */
+ sum = 0.0;
+ for (x = 0; x < n; x++)
+ if (vec[x] > max - 50.)
+ sum += exp(vec[x] - max);
+ sum = log(sum) + max;
+ return sum;
+}
+float
+esl_vec_FLogSum(float *vec, int n)
+{
+ int x;
+ float max, sum;
+
+ max = esl_vec_FMax(vec, n);
+ sum = 0.0;
+ for (x = 0; x < n; x++)
+ if (vec[x] > max - 50.)
+ sum += expf(vec[x] - max);
+ sum = logf(sum) + max;
+ return sum;
+}
+
+
+/* Function: esl_vec_DLogNorm()
+ * Synopsis: Normalize a log p-vector, make it a p-vector.
+ * Incept: SRE, Thu Apr 7 17:45:39 2005 [St. Louis]
+ *
+ * Purpose: Given an unnormalized log probability vector <vec>
+ * of length <n>, normalize it and make it a
+ * probability vector.
+ *
+ * <esl_vec_FLogNorm()> does the same, but for a vector
+ * of floats instead of doubles.
+ *
+ * Returns: (void); <vec> is changed in place.
+ */
+void
+esl_vec_DLogNorm(double *vec, int n)
+{
+ double denom;
+
+ denom = esl_vec_DLogSum(vec, n);
+ esl_vec_DIncrement(vec, n, -1.*denom);
+ esl_vec_DExp (vec, n);
+ esl_vec_DNorm(vec, n);
+}
+void
+esl_vec_FLogNorm(float *vec, int n)
+{
+ float denom;
+
+ denom = esl_vec_FLogSum(vec, n);
+ esl_vec_FIncrement(vec, n, -1.*denom);
+ esl_vec_FExp (vec, n);
+ esl_vec_FNorm(vec, n);
+}
+
+
+/* Function: esl_vec_DCDF()
+ * Synopsis: Calculate cumulative distribution for a discrete prob vector
+ * Incept: SRE, Wed Jan 12 09:09:42 2011 [Janelia]
+ *
+ * Purpose: Given a probability vector <p> of length <n>,
+ * calculates its cumulate distribution function
+ * and puts in in caller-allocated space <cdf>.
+ * Caller must have allocated <cdf> for at least
+ * <n> elements.
+ *
+ * By definition, <cdf[0] == p[0]>, and <cdf[n-1]> ought to
+ * be 1.0; however, numerical roundoff error must be tolerated
+ * in the sum. If caller isn't sure about <p>'s provenance,
+ * it may want to check that <cdf[n-1]> is tolerably close
+ * to 1.0 (see <esl_DCompare()>).
+ *
+ * It is ok for <cdf> to be the same space as <p>
+ * (<esl_vec_DCDF(p, n, p)> is fine); that is, <p> can be
+ * overwritten by <cdf>.
+ *
+ * Args: p - input probability vector p[0..n-1]
+ * n - number of elements in p
+ * cdf - RETURN: cumulative distribution for p, in caller-allocated space
+ *
+ * Returns: (void).
+ */
+void
+esl_vec_DCDF(double *p, int n, double *cdf)
+{
+ int i;
+
+ cdf[0] = p[0];
+ for (i = 1; i < n; i++)
+ cdf[i] = p[i] + cdf[i-1];
+}
+void
+esl_vec_FCDF(float *p, int n, float *cdf)
+{
+ int i;
+
+ cdf[0] = p[0];
+ for (i = 1; i < n; i++)
+ cdf[i] = p[i] + cdf[i-1];
+}
+
+
+
+/* Function: esl_vec_DValidate()
+ * Synopsis: Verifies that vector is p-vector.
+ * Incept: ER, Tue Dec 5 09:38:54 EST 2006 [janelia]
+ *
+ * Purpose: Validate a probability vector <vec> of length <n>.
+ * Each element has to be between 0 and 1, and
+ * the sum of all elements has to be 1.
+ *
+ * Args: v - p vector to validate.
+ * n - dimensionality of v
+ * tol - convergence criterion applied to sum of v
+ * errbuf - NULL, or a failure message buffer allocated
+ * for at least <eslERRBUFSIZE> chars.
+ *
+ * Returns: <eslOK> on success, or <eslFAIL> on validation failure.
+ * Upon failure, if caller provided a non-<NULL> <errbuf>,
+ * an informative message is left there.
+ */
+int
+esl_vec_DValidate(double *vec, int n, double tol, char *errbuf)
+{
+ int status;
+ int x;
+ double sum = 0.;
+
+ if (errbuf) *errbuf = 0;
+ if (n == 0) return eslOK;
+
+ for (x = 0; x < n; x++) {
+ if (vec[x] < 0.0 || vec[x] > 1.0)
+ ESL_XFAIL(eslFAIL, errbuf, "value %d is not a probability between 0..1", x);
+ sum += vec[x];
+ }
+
+ if (fabs(sum - 1.0) > tol)
+ ESL_XFAIL(eslFAIL, errbuf, "vector does not sum to 1.0");
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+int
+esl_vec_FValidate(float *vec, int n, float tol, char *errbuf)
+{
+ int status;
+ int x;
+ float sum = 0.;
+
+ if (errbuf) *errbuf = 0;
+ if (n == 0) return eslOK;
+
+ for (x = 0; x < n; x++) {
+ if (vec[x] < 0.0 || vec[x] > 1.0)
+ ESL_XFAIL(eslFAIL, errbuf, "value %d is not a probability between 0..1", x);
+ sum += vec[x];
+ }
+
+ if (fabs(sum - 1.0) > tol)
+ ESL_XFAIL(eslFAIL, errbuf, "vector does not sum to 1.0");
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: esl_vec_DLogValidate()
+ * Synopsis: Verify that vector is a log-p-vector.
+ * Incept: ER, Tue Dec 5 09:46:51 EST 2006 [janelia]
+ *
+ * Purpose: Validate a log probability vector <vec> of length <n>.
+ * The exp of each element has to be between 0 and 1, and
+ * the sum of all elements has to be 1.
+ *
+ * Args: v - log p vector to validate.
+ * n - dimensionality of v
+ * tol - convergence criterion applied to sum of exp v
+ * errbuf - NULL, or a failure message buffer allocated
+ * for at least p7_ERRBUFSIZE chars.
+ *
+ * Returns: <eslOK> on success, or <eslFAIL> on failure; upon failure,
+ * if caller provided a non-<NULL> <errbuf>, an informative
+ * message is left there.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_vec_DLogValidate(double *vec, int n, double tol, char *errbuf)
+{
+ int status;
+ double *expvec = NULL;
+
+ if (errbuf) *errbuf = 0;
+ if (n == 0) return eslOK;
+
+ ESL_ALLOC(expvec, sizeof(double)*n);
+ esl_vec_DCopy(vec, n, expvec);
+ esl_vec_DExp(expvec, n);
+ if ((status = esl_vec_DValidate(expvec, n, tol, errbuf)) != eslOK) goto ERROR;
+ free(expvec);
+ return eslOK;
+
+ ERROR:
+ if (expvec != NULL) free(expvec);
+ return status;
+}
+int
+esl_vec_FLogValidate(float *vec, int n, float tol, char *errbuf)
+{
+ int status;
+ float *expvec = NULL;
+
+ if (errbuf) *errbuf = 0;
+ if (n == 0) return eslOK;
+
+ ESL_ALLOC(expvec, sizeof(float)*n);
+ esl_vec_FCopy(vec, n, expvec);
+ esl_vec_FExp(expvec, n);
+ if ((status = esl_vec_FValidate(expvec, n, tol, errbuf)) != eslOK) goto ERROR;
+ free(expvec);
+ return eslOK;
+
+ ERROR:
+ if (expvec != NULL) free(expvec);
+ return eslOK;
+}
+
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+
+/* Function: esl_vec_DShuffle()
+ * Synopsis: Shuffle a vector, in place.
+ *
+ * Purpose: Shuffle a vector <v> of <n> items, using the
+ * random number generator <r>.
+ */
+int
+esl_vec_DShuffle(ESL_RANDOMNESS *r, double *v, int n)
+{
+ double swap;
+ int pos;
+ for ( ; n > 1; n--)
+ {
+ pos = esl_rnd_Roll(r, n);
+ swap = v[pos];
+ v[pos] = v[n-1];
+ v[n-1] = swap;
+ }
+ return eslOK;
+}
+int
+esl_vec_FShuffle(ESL_RANDOMNESS *r, float *v, int n)
+{
+ float swap;
+ int pos;
+ for ( ; n > 1; n--)
+ {
+ pos = esl_rnd_Roll(r, n);
+ swap = v[pos];
+ v[pos] = v[n-1];
+ v[n-1] = swap;
+ }
+ return eslOK;
+}
+int
+esl_vec_IShuffle(ESL_RANDOMNESS *r, int *v, int n)
+{
+ int swap;
+ int pos;
+ for ( ; n > 1; n--)
+ {
+ pos = esl_rnd_Roll(r, n);
+ swap = v[pos];
+ v[pos] = v[n-1];
+ v[n-1] = swap;
+ }
+ return eslOK;
+}
+#endif /*eslAUGMENT_RANDOM*/
+
+
+/*****************************************************************
+ * 2. Unit tests
+ *****************************************************************/
+#ifdef eslVECTOROPS_TESTDRIVE
+static void
+utest_pvectors(void)
+{
+ char *msg = "pvector unit test failed";
+ double p1[4] = { 0.25, 0.25, 0.25, 0.25 };
+ double p2[4];
+ double p3[4];
+ float p1f[4];
+ float p2f[4] = { 0.0, 0.5, 0.5, 0.0 };
+ float p3f[4];
+ int n = 4;
+ double result;
+
+ esl_vec_D2F(p1, n, p1f);
+ esl_vec_F2D(p2f, n, p2);
+
+ if (esl_vec_DValidate(p1, n, 1e-12, NULL) != eslOK) esl_fatal(msg);
+ if (esl_vec_FValidate(p1f, n, 1e-7, NULL) != eslOK) esl_fatal(msg);
+
+ result = esl_vec_DEntropy(p1, n); if (esl_DCompare(2.0, result, 1e-9) != eslOK) esl_fatal(msg);
+ result = esl_vec_FEntropy(p1f, n); if (esl_DCompare(2.0, result, 1e-9) != eslOK) esl_fatal(msg);
+ result = esl_vec_DEntropy(p2, n); if (esl_DCompare(1.0, result, 1e-9) != eslOK) esl_fatal(msg);
+ result = esl_vec_FEntropy(p2f, n); if (esl_DCompare(1.0, result, 1e-9) != eslOK) esl_fatal(msg);
+
+ result = esl_vec_DRelEntropy(p2, p1, n); if (esl_DCompare(1.0, result, 1e-9) != eslOK) esl_fatal(msg);
+ result = esl_vec_FRelEntropy(p2f, p1f, n); if (esl_DCompare(1.0, result, 1e-9) != eslOK) esl_fatal(msg);
+
+ result = esl_vec_DRelEntropy(p1, p2, n); if (result != eslINFINITY) esl_fatal(msg);
+ result = esl_vec_FRelEntropy(p1f, p2f, n); if (result != eslINFINITY) esl_fatal(msg);
+
+ esl_vec_DLog(p2, n);
+ if (esl_vec_DLogValidate(p2, n, 1e-12, NULL) != eslOK) esl_fatal(msg);
+ esl_vec_DExp(p2, n);
+ if (p2[0] != 0.) esl_fatal(msg);
+
+ esl_vec_FLog(p2f, n);
+ if (esl_vec_FLogValidate(p2f, n, 1e-7, NULL) != eslOK) esl_fatal(msg);
+ esl_vec_FExp(p2f, n);
+ if (p2f[0] != 0.) esl_fatal(msg);
+
+ esl_vec_DCopy(p2, n, p3);
+ esl_vec_DScale(p3, n, 10.);
+ esl_vec_DNorm(p3, n);
+ if (esl_vec_DCompare(p2, p3, n, 1e-12) != eslOK) esl_fatal(msg);
+
+ esl_vec_DLog(p3, n);
+ result = esl_vec_DLogSum(p3, n); if (esl_DCompare(0.0, result, 1e-12) != eslOK) esl_fatal(msg);
+ esl_vec_DIncrement(p3, n, 2.0);
+ esl_vec_DLogNorm(p3, n);
+ if (esl_vec_DCompare(p2, p3, n, 1e-12) != eslOK) esl_fatal(msg);
+
+ esl_vec_FCopy(p2f, n, p3f);
+ esl_vec_FScale(p3f, n, 10.);
+ esl_vec_FNorm(p3f, n);
+ if (esl_vec_FCompare(p2f, p3f, n, 1e-7) != eslOK) esl_fatal(msg);
+
+ esl_vec_FLog(p3f, n);
+ result = esl_vec_FLogSum(p3f, n); if (esl_DCompare(0.0, result, 1e-7) != eslOK) esl_fatal(msg);
+ esl_vec_FIncrement(p3f, n, 2.0);
+ esl_vec_FLogNorm(p3f, n);
+ if (esl_vec_FCompare(p2f, p3f, n, 1e-7) != eslOK) esl_fatal(msg);
+
+ return;
+}
+#endif /*eslVECTOROPS_TESTDRIVE*/
+
+
+/*****************************************************************
+ * 3. Test driver
+ *****************************************************************/
+
+/* gcc -g -Wall -o test -I. -L. -DeslVECTOROPS_TESTDRIVE esl_vectorops.c -leasel -lm
+ */
+#ifdef eslVECTOROPS_TESTDRIVE
+#include "easel.h"
+#include "esl_vectorops.h"
+
+int main(void)
+{
+ utest_pvectors();
+ return 0;
+}
+#endif /*eslVECTOROPS_TESTDRIVE*/
+
+/*****************************************************************
+ * 4. Examples
+ *****************************************************************/
+
+#ifdef eslVECTOROPS_EXAMPLE
+/*::cexcerpt::vectorops_example::begin::*/
+/* gcc -g -Wall -o example -I. -DeslVECTOROPS_EXAMPLE esl_vectorops.c easel.c -lm */
+#include "easel.h"
+#include "esl_vectorops.h"
+
+int main(void)
+{
+ double *p;
+ char labels[] = "ACGT";
+ int n = 4;
+
+ p = malloc(sizeof(double) * n);
+ esl_vec_DSet(p, n, 1.0);
+ esl_vec_DNorm(p, n);
+ esl_vec_DDump(stdout, p, n, labels);
+ free(p);
+ return 0;
+}
+/*::cexcerpt::vectorops_example::end::*/
+#endif /*eslVECTOROPS_EXAMPLE*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_vectorops.h b/esl_vectorops.h
new file mode 100644
index 0000000..a0d3403
--- /dev/null
+++ b/esl_vectorops.h
@@ -0,0 +1,128 @@
+/* Vector operations.
+ */
+#ifndef eslVECTOROPS_INCLUDED
+#define eslVECTOROPS_INCLUDED
+
+extern void esl_vec_DSet(double *vec, int n, double value);
+extern void esl_vec_FSet(float *vec, int n, float value);
+extern void esl_vec_ISet(int *vec, int n, int value);
+
+extern void esl_vec_DScale(double *vec, int n, double scale);
+extern void esl_vec_FScale(float *vec, int n, float scale);
+extern void esl_vec_IScale(int *vec, int n, int scale);
+
+extern void esl_vec_DIncrement(double *v, int n, double x);
+extern void esl_vec_FIncrement(float *v, int n, float x);
+extern void esl_vec_IIncrement(int *v, int n, int x);
+
+extern double esl_vec_DSum(double *vec, int n);
+extern float esl_vec_FSum(float *vec, int n);
+extern int esl_vec_ISum(int *vec, int n);
+
+extern void esl_vec_DAdd(double *vec1, const double *vec2, int n);
+extern void esl_vec_FAdd(float *vec1, const float *vec2, int n);
+extern void esl_vec_IAdd(int *vec1, const int *vec2, int n);
+
+extern void esl_vec_DAddScaled(double *vec1, double *vec2, double a, int n);
+extern void esl_vec_FAddScaled(float *vec1, float *vec2, float a, int n);
+extern void esl_vec_IAddScaled(int *vec1, int *vec2, int a, int n);
+
+extern void esl_vec_DCopy(const double *src, const int n, double *dest);
+extern void esl_vec_FCopy(const float *src, const int n, float *dest);
+extern void esl_vec_ICopy(const int *src, const int n, int *dest);
+
+extern int esl_vec_DCompare(const double *vec1, const double *vec2, int n, double tol);
+extern int esl_vec_FCompare(const float *vec1, const float *vec2, int n, float tol);
+extern int esl_vec_ICompare(const int *vec1, const int *vec2, int n);
+
+extern void esl_vec_DSwap(double *vec1, double *vec2, int n);
+extern void esl_vec_FSwap(float *vec1, float *vec2, int n);
+extern void esl_vec_ISwap(int *vec1, int *vec2, int n);
+
+extern void esl_vec_DReverse(double *vec, double *rev, int n);
+extern void esl_vec_FReverse(float *vec, float *rev, int n);
+extern void esl_vec_IReverse(int *vec, int *rev, int n);
+extern void esl_vec_CReverse(char *vec, char *rev, int n);
+
+extern double esl_vec_DDot(double *vec1, double *vec2, int n);
+extern float esl_vec_FDot(float *vec1, float *vec2, int n);
+extern int esl_vec_IDot(int *vec1, int *vec2, int n);
+
+extern double esl_vec_DMax(const double *vec, int n);
+extern float esl_vec_FMax(const float *vec, int n);
+extern int esl_vec_IMax(const int *vec, int n);
+
+extern double esl_vec_DMin(const double *vec, int n);
+extern float esl_vec_FMin(const float *vec, int n);
+extern int esl_vec_IMin(const int *vec, int n);
+
+extern int esl_vec_DArgMax(const double *vec, int n);
+extern int esl_vec_FArgMax(const float *vec, int n);
+extern int esl_vec_IArgMax(const int *vec, int n);
+
+extern int esl_vec_DArgMin(const double *vec, int n);
+extern int esl_vec_FArgMin(const float *vec, int n);
+extern int esl_vec_IArgMin(const int *vec, int n);
+
+extern void esl_vec_DSortIncreasing(double *vec, int n);
+extern void esl_vec_FSortIncreasing(float *vec, int n);
+extern void esl_vec_ISortIncreasing(int *vec, int n);
+
+extern void esl_vec_DSortDecreasing(double *vec, int n);
+extern void esl_vec_FSortDecreasing(float *vec, int n);
+extern void esl_vec_ISortDecreasing(int *vec, int n);
+
+extern int esl_vec_DDump(FILE *ofp, double *v, int n, char *label);
+extern int esl_vec_FDump(FILE *ofp, float *v, int n, char *label);
+extern int esl_vec_IDump(FILE *ofp, int *v, int n, char *label);
+
+extern void esl_vec_D2F(double *src, int n, float *dst);
+extern void esl_vec_F2D(float *src, int n, double *dst);
+extern void esl_vec_I2F(int *src, int n, float *dst);
+extern void esl_vec_I2D(int *src, int n, double *dst);
+
+extern void esl_vec_DNorm(double *vec, int n);
+extern void esl_vec_FNorm(float *vec, int n);
+
+extern void esl_vec_DLog(double *vec, int n);
+extern void esl_vec_FLog(float *vec, int n);
+
+extern double esl_vec_DEntropy(const double *p, int n);
+extern float esl_vec_FEntropy(const float *p, int n);
+
+extern double esl_vec_DRelEntropy(const double *p, const double *f, int n);
+extern float esl_vec_FRelEntropy(const float *p, const float *f, int n);
+
+extern void esl_vec_DExp(double *vec, int n);
+extern void esl_vec_FExp(float *vec, int n);
+
+extern double esl_vec_DLogSum(double *vec, int n);
+extern float esl_vec_FLogSum(float *vec, int n);
+
+extern void esl_vec_DLogNorm(double *vec, int n);
+extern void esl_vec_FLogNorm(float *vec, int n);
+
+extern void esl_vec_DCDF(double *p, int n, double *cdf);
+extern void esl_vec_FCDF(float *p, int n, float *cdf);
+
+extern int esl_vec_DValidate(double *vec, int n, double tol, char *errbuf);
+extern int esl_vec_FValidate(float *vec, int n, float tol, char *errbuf);
+
+extern int esl_vec_DLogValidate(double *vec, int n, double tol, char *errbuf);
+extern int esl_vec_FLogValidate(float *vec, int n, float tol, char *errbuf);
+
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+extern int esl_vec_DShuffle(ESL_RANDOMNESS *r, double *v, int n);
+extern int esl_vec_FShuffle(ESL_RANDOMNESS *r, float *v, int n);
+extern int esl_vec_IShuffle(ESL_RANDOMNESS *r, int *v, int n);
+#endif
+
+#endif /* eslVECTOROPS_INCLUDED */
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_vectorops.tex b/esl_vectorops.tex
new file mode 100644
index 0000000..473a3fe
--- /dev/null
+++ b/esl_vectorops.tex
@@ -0,0 +1,55 @@
+
+The \eslmod{vectorops} module contains routines for simple operations
+on vectors.
+
+Different functions allow an operation to be performed in vectors
+containing elements of different scalar types (double, float,
+integer). The appropriate routine is prefixed with D, F, or I. For
+example, \ccode{esl\_vec\_DSet()} is the Set routine for a vector of
+doubles; \ccode{esl\_vec\_ISet()} is for integers.
+
+Table~\ref{tbl:vectorops_api} lists the functions in the
+\eslmod{vectorops} API.
+
+\begin{table}[bp]
+\begin{center}
+\begin{tabular}{ll}
+ \multicolumn{2}{c}{\textbf{All vectors}}\\
+\ccode{esl\_vec\_\{D,F,I\}Set()} & Set all items in vector to scalar value.\\
+\ccode{esl\_vec\_\{D,F,I\}Scale()} & Multiply all items in vector by scalar.\\
+\ccode{esl\_vec\_\{D,F,I\}Increment()} & Add a scalar to all items in vector.\\
+\ccode{esl\_vec\_\{D,F,I\}Sum()} & Return scalar sum of values in vector.\\
+\ccode{esl\_vec\_\{D,F,I\}Add()} & Add vec2 to vec1.\\
+\ccode{esl\_vec\_\{D,F,I\}AddScaled()} & Scale vec2 and add it to vec1.\\
+\ccode{esl\_vec\_\{D,F,I\}Copy()} & Set vec1 to be same as vec2. \\
+\ccode{esl\_vec\_\{D,F,I\}Compare()} & Compare vec1 to vec2 for equality. \\
+\ccode{esl\_vec\_\{D,F,I\}Swap()} & Swap vec1 and vec2. \\
+\ccode{esl\_vec\_\{D,F,I\}Dot()} & Return dot product of two vectors.\\
+\ccode{esl\_vec\_\{D,F,I\}Max()} & Return value of maximum element in vector.\\
+\ccode{esl\_vec\_\{D,F,I\}Min()} & Return value of minimum element in vector.\\
+\ccode{esl\_vec\_\{D,F,I\}ArgMax()} & Return index of maximum element in vector.\\
+\ccode{esl\_vec\_\{D,F,I\}ArgMin()} & Return index of minimum element in vector.\\
+\ccode{esl\_vec\_\{D,F,I\}SortIncreasing()}& Sort vector from smallest to largest.\\
+\ccode{esl\_vec\_\{D,F,I\}SortDecreasing()}& Sort vector from largest to smallest.\\
+\ccode{esl\_vec\_\{D,F,I\}Dump()} & Output vector to a stream as text.\\
+ \multicolumn{2}{c}{\textbf{Type conversions}}\\
+\ccode{esl\_vec\_\{D,I\}2F()} & Convert to single precision floats. \\
+\ccode{esl\_vec\_\{F,I\}2D()} & Convert to double precision floats. \\
+ \multicolumn{2}{c}{\textbf{Probability vectors}}\\
+\ccode{esl\_vec\_\{D,F\}Norm()} & Normalize a probability vector of length n.\\
+\ccode{esl\_vec\_\{D,F\}Log()} & Convert all items in vec to log probabilities. \\
+\ccode{esl\_vec\_\{D,F\}Entropy()} & Return Shannon entropy of probability vector $p$, in bits\\
+\ccode{esl\_vec\_\{D,F\}RelEntropy()} & Return relative entropy $D(p \parallel q)$ of $p,q$, in bits\\
+\ccode{esl\_vec\_\{D,F\}Validate()} & Verify that vector sums to one.\\
+ \multicolumn{2}{c}{\textbf{Log probability vectors}}\\
+\ccode{esl\_vec\_\{D,F\}Exp()} & Convert log p's back to probabilities\\
+\ccode{esl\_vec\_\{D,F\}LogSum()} & Given vector of log p's; return log of summed p's.\\
+\ccode{esl\_vec\_\{D,F\}LogNorm()} & Normalize a log p vector, making it a prob vector. \\
+\ccode{esl\_vec\_\{D,F\}LogValidate()} & Verifies that vector sums to one (in prob space). \\
+
+\end{tabular}
+\end{center}
+\caption{The \eslmod{vectorops} API.}
+\label{tbl:vectorops_api}
+\end{table}
+
diff --git a/esl_vmx.c b/esl_vmx.c
new file mode 100644
index 0000000..04c1c8f
--- /dev/null
+++ b/esl_vmx.c
@@ -0,0 +1,568 @@
+/* Vectorized routines for PowerPC, using Altivec/VMX.
+ *
+ * Table of contents
+ * 1. SIMD logf(), expf()
+ * 2. Miscellaneous convenience functions.
+ * 3. Benchmark
+ * 4. Unit tests
+ * 5. Test driver
+ * 6. Example
+ * 7. Copyright and license
+ *
+ *****************************************************************
+ * Credits:
+ *
+ * The logf() and expf() routines are derivatives of routines by
+ * Julien Pommier [http://gruntthepeon.free.fr/ssemath/]. Those
+ * routines were in turn based on serial implementations in the Cephes
+ * math library by Stephen Moshier [Moshier89;
+ * http://www.moshier.net/#Cephes]. Thanks and credit to both Moshier
+ * and Pommier for their clear code. Additional copyright and license
+ * information is appended at the end of the file.
+ */
+#include "esl_config.h"
+#ifdef HAVE_VMX
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#ifndef __APPLE_ALTIVEC__
+#include <altivec.h>
+#endif
+
+#include "easel.h"
+#include "esl_vmx.h"
+
+
+/*****************************************************************
+ * 1. VMX SIMD logf(), expf()
+ *****************************************************************/
+
+/* As of Dec 2007, I am unaware of any plans for Intel/AMD to release
+ * SSE intrinsics for logf(), expf(), or other special functions.
+ *
+ * I need them, and the code below should suffice. If you know of
+ * better ways to compute these functions, please let me know.
+ */
+
+/* Function: esl_vmx_logf()
+ * Synopsis: <r[z] = log x[z]>
+ *
+ * Purpose: Given a vector <x> containing four floats, returns a
+ * vector <r> in which each element <r[z] = logf(x[z])>.
+ *
+ * Valid in the domain $x_z > 0$ for normalized IEEE754
+ * $x_z$.
+ *
+ * For <x> $< 0$, including -0, returns <NaN>. For <x> $==
+ * 0$ or subnormal <x>, returns <-inf>. For <x = inf>,
+ * returns <inf>. For <x = NaN>, returns <NaN>. For
+ * subnormal <x>, returns <-inf>.
+ *
+ * Xref: J2/71.
+ *
+ * Note: Derived from SSE2 implementation which was
+ * Derived from an SSE1 implementation by Julian
+ * Pommier. Converted to SSE2 and added handling
+ * of IEEE754 specials.
+ */
+vector float
+esl_vmx_logf(vector float x)
+{
+ static vector float cephesv_1 = { 7.0376836292E-2f, -1.1514610310E-1f, 1.1676998740E-1f, -1.2420140846E-1f };
+ static vector float cephesv_2 = { 1.4249322787E-1f, -1.6668057665E-1f, 2.0000714765E-1f, -2.4999993993E-1f };
+ static vector float cephesv_3 = { 3.3333331174E-1f, 0.0f, 0.0f, 0.0f };
+
+ static vector float constv = { 0.707106781186547524f, -2.12194440e-4f, 0.5f, 0.693359375f };
+
+ vector float onev = (vector float) {1.0, 1.0, 1.0, 1.0}; /* all elem = 1.0 */
+ vector signed int ei;
+ vector float e;
+ vector bool int invalid_mask, zero_mask, inf_mask; /* masks used to handle special IEEE754 inputs */
+ vector bool int mask;
+ vector float origx;
+ vector float tmp;
+ vector float y;
+ vector float z;
+
+ vector float zerov = (vector float) vec_splat_u32(0);
+ vector signed int infExpv = { 255, 255, 255, 255 };
+
+ /* first, split x apart: x = frexpf(x, &e); */
+ ei = vec_sr((vector signed int) x, ((vector unsigned int) {23, 23, 23, 23}));
+ /* shift right 23: IEEE754 floats: ei = biased exponents */
+ invalid_mask = vec_cmple(x, zerov); /* mask any elem that's negative; these become NaN */
+ zero_mask = vec_cmpeq(ei,(vector signed int) zerov); /* mask any elem zero or subnormal; these become -inf */
+ inf_mask = vec_cmpeq(ei, infExpv); /* mask any elem +inf or NaN; these stay +inf or NaN */
+ origx = x; /* store original x, used for log(inf) = inf, log(NaN) = NaN */
+
+ x = vec_and(x, (vector float) ((vector unsigned int) {~0x7f800000, ~0x7f800000, ~0x7f800000, ~0x7f800000}));
+ /* x now the stored 23 bits of the 24-bit significand */
+ x = vec_or (x, vec_splat(constv, 2)); /* sets hidden bit b[0] */
+
+ ei = vec_sub(ei, ((vector signed int) {126, 126, 126, 126})); /* -127 (ei now signed base-2 exponent); then +1 */
+ e = vec_ctf(ei, 0);
+
+ /* now, calculate the log */
+ mask = vec_cmplt(x, vec_splat(constv, 0)); /* avoid conditional branches. */
+ tmp = vec_and(x, (vector float) mask); /* tmp contains x values < 0.707, else 0 */
+ x = vec_sub(x, onev);
+ e = vec_sub(e, vec_and(onev, (vector float) mask));
+ x = vec_add(x, tmp);
+ z = vec_madd(x, x, zerov);
+
+ y = vec_splat(cephesv_1, 0);
+ y = vec_madd(y, x, vec_splat(cephesv_1, 1));
+ y = vec_madd(y, x, vec_splat(cephesv_1, 2));
+ y = vec_madd(y, x, vec_splat(cephesv_1, 3));
+ y = vec_madd(y, x, vec_splat(cephesv_2, 0));
+ y = vec_madd(y, x, vec_splat(cephesv_2, 1));
+ y = vec_madd(y, x, vec_splat(cephesv_2, 2));
+ y = vec_madd(y, x, vec_splat(cephesv_2, 3));
+ y = vec_madd(y, x, vec_splat(cephesv_3, 0));
+ y = vec_madd(y, x, zerov);
+ y = vec_madd(y, z, zerov);
+
+ tmp = vec_madd(e, vec_splat(constv, 1), zerov);
+ y = vec_add(y, tmp);
+
+ tmp = vec_madd(z, vec_splat(constv, 2), zerov);
+ y = vec_sub(y, tmp);
+
+ x = vec_add(x, y);
+ x = vec_madd(e, vec_splat(constv, 3), x);
+
+ /* IEEE754 cleanup: */
+ x = vec_or(x, (vector float) invalid_mask); /* log(x<0, including -0) = NaN */
+ x = vec_sel(x, ((vector float) {-eslINFINITY, -eslINFINITY, -eslINFINITY, -eslINFINITY}), zero_mask); /* x zero or subnormal = -inf */
+ x = vec_sel(x, origx, inf_mask); /* log(inf)=inf; log(NaN) = NaN */
+ return x;
+}
+
+/* Function: esl_vmx_expf()
+ * Synopsis: <r[z] = exp x[z]>
+ *
+ * Purpose: Given a vector <x> containing four floats, returns a
+ * vector <r> in which each element <r[z] = logf(x[z])>.
+ *
+ * Valid for all IEEE754 floats $x_z$.
+ *
+ * Xref: J2/71
+ *
+ * Note: Derived from SSE2 implementation which was
+ * Derived from an SSE1 implementation by Julian
+ * Pommier. Converted to SSE2.
+ */
+vector float
+esl_vmx_expf(vector float x)
+{
+ static vector float cephesv_p1 = { 1.9875691500E-4f, 1.3981999507E-3f, 8.3334519073E-3f, 4.1665795894E-2f };
+ static vector float cephesv_p2 = { 1.6666665459E-1f, 5.0000001201E-1f, 0.693359375f, -2.12194440E-4f };
+
+ static vector float maxlogfv = { 88.72283905206835f, 88.72283905206835f, 88.72283905206835f, 88.72283905206835f }; /* log(2^128) */
+ static vector float minlogfv = { -103.27892990343185f, -103.27892990343185f, -103.27892990343185f, -103.27892990343185f }; /* log(2^-149) */
+
+ vector signed int k;
+ vector bool int minmask, maxmask;
+ vector float tmp, fx, y, z;
+
+ vector float zerov = (vector float) vec_splat_u32(0);
+
+ /* handle out-of-range and special conditions */
+ maxmask = vec_cmpgt(x, maxlogfv);
+ minmask = vec_cmple(x, minlogfv);
+
+ /* range reduction: exp(x) = 2^k e^f = exp(f + k log 2); k = floorf(0.5 + x / log2): */
+ fx = vec_madd(x, ((vector float) {eslCONST_LOG2R, eslCONST_LOG2R, eslCONST_LOG2R, eslCONST_LOG2R}), zerov);
+ fx = vec_add(fx, ((vector float) {0.5, 0.5, 0.5, 0.5}));
+
+ /* floorf() with VMX: */
+ fx = vec_floor(fx);
+ k = vec_cts(fx, 0);
+
+ /* polynomial approx for e^f for f in range [-0.5, 0.5] */
+ tmp = vec_madd(fx, vec_splat(cephesv_p2, 2), zerov);
+ z = vec_madd(fx, vec_splat(cephesv_p2, 3), zerov);
+ x = vec_sub(x, tmp);
+ x = vec_sub(x, z);
+ z = vec_madd(x, x, zerov);
+
+ y = vec_splat(cephesv_p1, 0);
+ y = vec_madd(y, x, vec_splat(cephesv_p1, 1));
+ y = vec_madd(y, x, vec_splat(cephesv_p1, 2));
+ y = vec_madd(y, x, vec_splat(cephesv_p1, 3));
+ y = vec_madd(y, x, vec_splat(cephesv_p2, 0));
+ y = vec_madd(y, x, vec_splat(cephesv_p2, 1));
+ y = vec_madd(y, z, x);
+ y = vec_add(y, ((vector float) {1.0, 1.0, 1.0, 1.0}));
+
+ /* build 2^k by hand, by creating a IEEE754 float */
+ k = vec_add(k, ((vector signed int) {127, 127, 127, 127}));
+ k = vec_sl(k, ((vector unsigned int) {23, 23, 23, 23}));
+ fx = (vector float) k;
+
+
+ /* put 2^k e^f together (fx = 2^k, y = e^f) and we're done */
+ y = vec_madd(y, fx, zerov);
+
+ /* special/range cleanup */
+ y = vec_sel(y, ((vector float) {eslINFINITY, eslINFINITY, eslINFINITY, eslINFINITY}), maxmask); /* exp(x) = inf for x > log(2^128) */
+ y = vec_sel(y, zerov, minmask); /* exp(x) = 0 for x < log(2^-149) */
+ return y;
+}
+
+
+/*****************************************************************
+ * 2. Miscellaneous convenience functions
+ *****************************************************************/
+void
+esl_vmx_dump_vecfloat(FILE *fp, vector float v)
+{
+ float *p = (float *)&v;
+ printf("[%13.8g, %13.8g, %13.8g, %13.8g]", p[0], p[1], p[2], p[3]);
+}
+
+
+/*****************************************************************
+ * 3. Benchmark
+ *****************************************************************/
+#ifdef eslVMX_BENCHMARK
+
+/* gcc -maltivec -O3 -o vmx_benchmark -I . -L . -DeslVMX_BENCHMARK -DHAVE_VMX esl_vmx.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_stopwatch.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-N", eslARG_INT,"10000000", NULL, NULL, NULL, NULL, NULL, "number of trials", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "benchmark driver for sse module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_STOPWATCH *w = esl_stopwatch_Create();
+ int N = esl_opt_GetInteger(go, "-N");
+ float origx = 2.0;
+ float x = origx;
+ vector float xv = { 2.0f, 2.0f, 2.0f, 2.0f };
+ int i;
+
+ /* First, serial time. */
+ esl_stopwatch_Start(w);
+ for (i = 0; i < N; i++) { x = logf(x); x = expf(x); }
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "# serial CPU time: ");
+
+ /* Vector time */
+ esl_stopwatch_Start(w);
+ for (i = 0; i < N; i++) { xv = esl_vmx_logf(xv); xv = esl_vmx_expf(xv); }
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "# vector CPU time: ");
+
+ /* If you don't do something with x and xv, the compiler may optimize them away */
+ printf("%g => many scalar logf,expf cycles => %g\n", origx, N, x);
+ printf("%g => many vector logf,expf cycles => ", origx, N); esl_vmx_dump_vecfloat(stdout, xv); printf("\n");
+
+ esl_stopwatch_Destroy(w);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+#endif /*eslVMX_BENCHMARK*/
+
+
+/*****************************************************************
+ * 4. Unit tests
+ *****************************************************************/
+#ifdef eslVMX_TESTDRIVE
+
+#include "esl_getopts.h"
+#include "esl_random.h"
+
+/* utest_logf(): Test range/domain of logf */
+static void
+utest_logf(ESL_GETOPTS *go)
+{
+ vector float x; /* test input */
+ union { vector float v; float x[4]; } r; /* test output */
+
+ /* Test IEEE754 specials:
+ * log(-inf) = NaN log(x<0) = NaN log(-0) = NaN
+ * log(0) = -inf log(inf) = inf log(NaN) = NaN
+ */
+ x = (vector float) {-eslINFINITY, -1.0, -0.0, 0.0};
+ r.v = esl_vmx_logf(x);
+ if (esl_opt_GetBoolean(go, "-v")) {
+ printf("logf");
+ esl_vmx_dump_vecfloat(stdout, x); printf(" ==> ");
+ esl_vmx_dump_vecfloat(stdout, r.v); printf("\n");
+ }
+ if (! isnan(r.x[0])) esl_fatal("logf(-inf) should be NaN");
+ if (! isnan(r.x[1])) esl_fatal("logf(-1) should be NaN");
+ if (! isnan(r.x[2])) esl_fatal("logf(-0) should be NaN");
+ if (isinf(r.x[3]) != -1) esl_fatal("logf(0) should be -inf");
+
+ x = (vector float) {eslINFINITY, eslNaN, FLT_MIN, FLT_MAX};
+ r.v = esl_vmx_logf(x);
+ if (esl_opt_GetBoolean(go, "-v")) {
+ printf("logf");
+ esl_vmx_dump_vecfloat(stdout, x); printf(" ==> ");
+ esl_vmx_dump_vecfloat(stdout, r.v); printf("\n");
+ }
+ if (isinf(r.x[0]) != 1) esl_fatal("logf(inf) should be inf");
+ if (! isnan(r.x[1])) esl_fatal("logf(NaN) should be NaN");
+
+}
+
+/* utest_expf(): Test range/domain of expf */
+static void
+utest_expf(ESL_GETOPTS *go)
+{
+ vector float x; /* test input */
+ union { vector float v; float x[4]; } r; /* test output */
+
+ /* exp(-inf) = 0 exp(-0) = 1 exp(0) = 1 exp(inf) = inf exp(NaN) = NaN */
+ x = (vector float) {-eslINFINITY, -0.0, 0.0, eslINFINITY};
+ r.v = esl_vmx_expf(x);
+ if (esl_opt_GetBoolean(go, "-v")) {
+ printf("expf");
+ esl_vmx_dump_vecfloat(stdout, x); printf(" ==> ");
+ esl_vmx_dump_vecfloat(stdout, r.v); printf("\n");
+ }
+ if (r.x[0] != 0.0f) esl_fatal("expf(-inf) should be 0");
+ if (isinf(r.x[3]) != 1) esl_fatal("expf(inf) should be inf");
+
+ /* exp(NaN) = NaN exp(large) = inf exp(-large) = 0 exp(1) = exp(1) */
+ x = (vector float) {eslNaN, 666.0, -666.0, 1.0};
+ r.v = esl_vmx_expf(x);
+ if (esl_opt_GetBoolean(go, "-v")) {
+ printf("expf");
+ esl_vmx_dump_vecfloat(stdout, x); printf(" ==> ");
+ esl_vmx_dump_vecfloat(stdout, r.v); printf("\n");
+ }
+ if (! isnan(r.x[0])) esl_fatal("expf(NaN) should be NaN");
+ if (isinf(r.x[1]) != 1) esl_fatal("expf(large x) should be inf");
+ if (r.x[2] != 0.0f) esl_fatal("expf(-large x) should be 0");
+
+}
+
+/* utest_odds(): test accuracy of logf, expf on odds ratios,
+ * our main intended use.
+ */
+static void
+utest_odds(ESL_GETOPTS *go, ESL_RANDOMNESS *r)
+{
+ int N = esl_opt_GetInteger(go, "-N");
+ int verbose = esl_opt_GetBoolean(go, "-v");
+ int very_verbose = esl_opt_GetBoolean(go, "--vv");
+ int i;
+ float p1, p2, odds;
+ union { vector float v; float x[4]; } r1;
+ union { vector float v; float x[4]; } r2;
+ float scalar_r1, scalar_r2;
+ double err1, maxerr1 = 0.0, avgerr1 = 0.0; /* errors on logf() */
+ double err2, maxerr2 = 0.0, avgerr2 = 0.0; /* errors on expf() */
+
+ for (i = 0; i < N; i++)
+ {
+ p1 = esl_rnd_UniformPositive(r);
+ p2 = esl_rnd_UniformPositive(r);
+ odds = p1 / p2;
+
+ if (odds == 0.0) esl_fatal("whoa, odds ratio can't be 0!\n");
+
+ r1.v = esl_vmx_logf((vector float) {odds}); /* r1.x[z] = log(p1/p2) */
+ scalar_r1 = logf(odds);
+
+ err1 = (r1.x[0] == 0. && scalar_r1 == 0.) ? 0.0 : 2 * fabs(r1.x[0] - scalar_r1) / fabs(r1.x[0] + scalar_r1);
+ if (err1 > maxerr1) maxerr1 = err1;
+ avgerr1 += err1 / (float) N;
+ if (isnan(avgerr1)) esl_fatal("whoa, what?\n");
+
+ r2.v = esl_vmx_expf(r1.v); /* and back to odds */
+ scalar_r2 = expf(r1.x[0]);
+
+ err2 = (r2.x[0] == 0. && scalar_r2 == 0.) ? 0.0 : 2 * fabs(r2.x[0] - scalar_r2) / fabs(r2.x[0] + scalar_r2);
+ if (err2 > maxerr2) maxerr2 = err2;
+ avgerr2 += err2 / (float) N;
+
+ if (very_verbose)
+ printf("%13.7g %13.7g %13.7g %13.7g %13.7g %13.7g %13.7g\n", odds, scalar_r1, r1.x[0], scalar_r2, r2.x[0], err1, err2);
+ }
+
+ if (avgerr1 > 1e-8) esl_fatal("average error on logf() is intolerable\n");
+ if (maxerr1 > 1e-6) esl_fatal("maximum error on logf() is intolerable\n");
+ if (avgerr2 > 1e-8) esl_fatal("average error on expf() is intolerable\n");
+ if (maxerr2 > 1e-6) esl_fatal("maximum error on expf() is intolerable\n");
+
+ if (verbose) {
+ printf("Average [max] logf() relative error in %d odds trials: %13.8g [%13.8g]\n", N, avgerr1, maxerr1);
+ printf("Average [max] expf() relative error in %d odds trials: %13.8g [%13.8g]\n", N, avgerr2, maxerr2);
+ printf("(random seed : %ld)\n", esl_randomness_GetSeed(r));
+ }
+}
+#endif /*eslVMX_TESTDRIVE*/
+
+
+
+
+/*****************************************************************
+ * 5. Test driver
+ *****************************************************************/
+
+#ifdef eslVMX_TESTDRIVE
+/* gcc -g -Wall -maltivec -o vmx_utest -I. -L. -DeslVMX_TESTDRIVE esl_vmx.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_vmx.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-N", eslARG_INT, "10000", NULL, NULL, NULL, NULL, NULL, "number of random test points", 0 },
+ { "-s", eslARG_INT, "42", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { "-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "be verbose: show test report", 0 },
+ { "--vv", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "be very verbose: show individual test samples", 0 },
+
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for vmx module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+
+ utest_logf(go);
+ utest_expf(go);
+ utest_odds(go, r);
+
+ esl_randomness_Destroy(r);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+#endif /* eslVMX_TESTDRIVE*/
+
+
+
+
+/*****************************************************************
+ * 6. Example
+ *****************************************************************/
+
+#ifdef eslVMX_EXAMPLE
+/*::cexcerpt::vmx_example::begin::*/
+/* gcc -msse2 -g -Wall -o vmx_example -I. -L. -DeslVMX_EXAMPLE esl_vmx.c -leasel -lm
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_vmx.h"
+
+int
+main(int argc, char **argv)
+{
+ float x; /* scalar input */
+ vector float xv; /* input vector */
+ union { vector float v; float x[4]; } rv; /* result vector*/
+
+ x = 2.0;
+ xv = (vector float) {x};
+ rv.v = esl_vmx_logf(xv);
+ printf("logf(%f) = %f\n", x, rv.x[0]);
+
+ rv.v = esl_vmx_expf(xv);
+ printf("expf(%f) = %f\n", x, rv.x[0]);
+
+ return 0;
+}
+/*::cexcerpt::vmx_example::end::*/
+#endif /*eslVMX_EXAMPLE*/
+#endif /*HAVE_VMX*/
+
+#ifndef HAVE_VMX
+
+/* If we don't have VMX compiled in, provide some nothingness to:
+ * a. prevent Mac OS/X ranlib from bitching about .o file that "has no symbols"
+ * b. prevent compiler from bitching about "empty compilation unit"
+ * c. automatically pass the automated tests.
+ */
+#include "easel.h"
+
+void esl_vmx_DoAbsolutelyNothing(void) { return; }
+#if defined eslVMX_TESTDRIVE || defined eslVMX_EXAMPLE || eslVMX_BENCHMARK
+int main(void) { return 0; }
+#endif
+#endif
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
+/* Additionally, esl_sse_logf() and esl_sse_expf() are
+ * Copyright (C) 2007 Julien Pommier
+ * Copyright (C) 1992 Stephen Moshier
+ *
+ * These functions derived from zlib-licensed routines by
+ * Julien Pommier, http://gruntthepeon.free.fr/ssemath/. The
+ * zlib license:
+ */
+
+/* Copyright (C) 2007 Julien Pommier
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* In turn, Pommier had derived the logf() and expf() functions from
+ * serial versions in the Cephes math library. According to its
+ * readme, Cephes is "copyrighted by the author" and "may be used
+ * freely but it comes with no support or guarantee." Cephes is
+ * available in NETLIB [http://www.netlib.org/cephes/]. NETLIB is
+ * widely considered to be a free scientific code repository, hough
+ * the copyright and license status of many parts, including Cephes,
+ * is not well defined in legal terms. We hereby note this, and have
+ * attached Moshier's copyright.
+ */
diff --git a/esl_vmx.h b/esl_vmx.h
new file mode 100644
index 0000000..516d39e
--- /dev/null
+++ b/esl_vmx.h
@@ -0,0 +1,171 @@
+#ifdef HAVE_VMX
+/* Vectorized routines for PowerPC, using Altivec.
+ *
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslVMX_INCLUDED
+#define eslVMX_INCLUDED
+
+#include "easel.h"
+
+#include <stdio.h>
+#ifndef __APPLE_ALTIVEC__
+#include <altivec.h>
+#endif
+
+extern vector float esl_vmx_logf(vector float x);
+extern vector float esl_vmx_expf(vector float x);
+extern void esl_vmx_dump_vecfloat(FILE *fp, vector float v);
+
+/* Function: esl_vmx_set_float()
+ * Synopsis: Fills float vector with x.
+ *
+ * Purpose: Sets all elements in the vector <float> to x.
+ */
+static inline vector float
+esl_vmx_set_float(float x)
+{
+ vector float v;
+ vector unsigned char p;
+
+ v = vec_lde(0, &x);
+ p = vec_lvsl(0, &x);
+ v = vec_perm(v, v, p);
+ v = vec_splat(v, 0);
+ return v;
+}
+
+/* Function: esl_vmx_set_s16()
+ * Synopsis: Fills short vector with x.
+ *
+ * Purpose: Sets all elements in the vector <signed short> to x.
+ */
+static inline vector signed short
+esl_vmx_set_s16(signed short x)
+{
+ vector signed short v;
+ vector unsigned char p;
+
+ v = vec_lde(0, &x);
+ p = vec_lvsl(0, &x);
+ v = vec_perm(v, v, p);
+ v = vec_splat(v, 0);
+ return v;
+}
+
+/* Function: esl_vmx_set_u8()
+ * Synopsis: Fills byte vector with x.
+ *
+ * Purpose: Sets all elements in the vector <unsigned char> to x.
+ */
+static inline vector unsigned char
+esl_vmx_set_u8(unsigned char x)
+{
+ vector unsigned char v;
+ vector unsigned char p;
+
+ v = vec_lde(0, &x);
+ p = vec_lvsl(0, &x);
+ v = vec_perm(v, v, p);
+ v = vec_splat(v, 0);
+ return v;
+}
+
+/* Function: esl_vmx_hsum_float()
+ * Synopsis: Returns sum of all floats.
+ *
+ * Purpose: Resturns the sum of all elements in the vector <float>.
+ */
+static inline float
+esl_vmx_hsum_float(vector float v)
+{
+ float f;
+
+ v = vec_add(v, vec_sld(v, v, 4));
+ v = vec_add(v, vec_sld(v, v, 8));
+ vec_ste(v, 0, &f);
+
+ return f;
+}
+
+/* Function: esl_vmx_hsum_s16()
+ * Synopsis: Returns sum of all shorts.
+ *
+ * Purpose: Resturns the sum of all elements in the vector <signed short>.
+ */
+static inline signed short
+esl_vmx_hsum_s16(vector signed short v)
+{
+ signed short s;
+
+ v = vec_add(v, vec_sld(v, v, 2));
+ v = vec_add(v, vec_sld(v, v, 4));
+ v = vec_add(v, vec_sld(v, v, 8));
+ vec_ste(v, 0, &s);
+
+ return s;
+}
+
+/* Function: esl_vmx_hmax_float()
+ * Synopsis: Returns max of all floats.
+ *
+ * Purpose: Resturns the maximum element in the vector <float>.
+ */
+static inline float
+esl_vmx_hmax_float(vector float v)
+{
+ float f;
+
+ v = vec_max(v, vec_sld(v, v, 4));
+ v = vec_max(v, vec_sld(v, v, 8));
+ vec_ste(v, 0, &f);
+
+ return f;
+}
+
+/* Function: esl_vmx_hmax_s16()
+ * Synopsis: Returns max of all shorts.
+ *
+ * Purpose: Resturns the maximum element in the vector <signed short>.
+ */
+static inline signed short
+esl_vmx_hmax_s16(vector signed short v)
+{
+ signed short s;
+
+ v = vec_max(v, vec_sld(v, v, 2));
+ v = vec_max(v, vec_sld(v, v, 4));
+ v = vec_max(v, vec_sld(v, v, 8));
+ vec_ste(v, 0, &s);
+
+ return s;
+}
+
+/* Function: esl_vmx_hmax_u8()
+ * Synopsis: Returns max of all bytes.
+ *
+ * Purpose: Resturns the maximum element in the vector <unsigned char>.
+ */
+static inline unsigned char
+esl_vmx_hmax_u8(vector unsigned char v)
+{
+ unsigned char s;
+
+ v = vec_max(v, vec_sld(v, v, 1));
+ v = vec_max(v, vec_sld(v, v, 2));
+ v = vec_max(v, vec_sld(v, v, 4));
+ v = vec_max(v, vec_sld(v, v, 8));
+ vec_ste(v, 0, &s);
+
+ return s;
+}
+
+
+#endif /*eslVMX_INCLUDED*/
+#endif /*HAVE_VMX*/
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
diff --git a/esl_weibull.c b/esl_weibull.c
new file mode 100644
index 0000000..f47c2eb
--- /dev/null
+++ b/esl_weibull.c
@@ -0,0 +1,743 @@
+/* Statistical routines for Weibull distributions.
+ *
+ * Contents:
+ * 1. Routines for evaluating densities and distributions.
+ * 2. Generic API routines, for general interface w/ histogram module
+ * 3. Dumping plots to files
+ * 4. Sampling (augmentation: random)
+ * 5. ML fitting to complete data (augmentation: minimizer)
+ * 6. ML fitting to binned data (augmentation: histogram, minimizer)
+ * 7. Test driver
+ * 8. Example
+ * 9. Copyright and licence information.
+ *
+ * To-do:
+ * - Fit*() functions should return eslEINVAL on n=0, eslENORESULT
+ * on failure due to small n. Compare esl_gumbel. xref J12/93.
+ * SRE, Wed Nov 27 11:13:48 2013
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_stats.h"
+#include "esl_vectorops.h"
+#include "esl_weibull.h"
+
+#ifdef eslAUGMENT_RANDOM
+#include "esl_random.h"
+#endif
+#ifdef eslAUGMENT_HISTOGRAM
+#include "esl_histogram.h"
+#endif
+#ifdef eslAUGMENT_MINIMIZER
+#include "esl_minimizer.h"
+#endif
+
+
+/****************************************************************************
+ * 1. Routines for evaluating densities and distributions
+ ****************************************************************************/
+/* mu <= x < infinity
+ * However, x=mu can be a problem:
+ * PDF-> 0 if tau > 1, infinity if tau < 1.
+ *
+ * lambda > 0
+ * tau > 0 [fat tail when tau < 1; inverse GEV when tau > 1;
+ * exponential when tau=1]
+ */
+
+
+/* Function: esl_wei_pdf()
+ *
+ * Purpose: Calculates the Weibull pdf $P(X=x)$, given quantile <x>,
+ * offset <mu>, and parameters <lambda> and <tau>.
+ */
+double
+esl_wei_pdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x-mu);
+ double val;
+
+ if (x < mu) return 0.;
+ if (x == mu) {
+ if (tau < 1.) return eslINFINITY;
+ else if (tau > 1.) return 0.;
+ else if (tau == 1.) return lambda;
+ }
+
+ val = lambda * tau *
+ exp((tau-1)*log(y)) *
+ exp(- exp(tau * log(y)));
+ return val;
+}
+
+/* Function: esl_wei_logpdf()
+ *
+ * Purpose: Calculates the log probability density function for the
+ * Weibull, $\log P(X=x)$, given quantile <x>,
+ * offset <mu>, and parameters <lambda> and <tau>.
+ */
+double
+esl_wei_logpdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda * (x-mu);
+ double val;
+
+ if (x < mu) return -eslINFINITY;
+ if (x == mu) {
+ if (tau < 1.) return eslINFINITY; /* technically; but approaches it slowly*/
+ else if (tau > 1.) return -eslINFINITY; /* same as above, also a slow approach */
+ else if (tau == 1.) return log(lambda); /* special case, exponential */
+ }
+
+ val = log(tau) + tau*log(lambda) + (tau-1)*log(x-mu) - exp(tau * log(y));
+ return val;
+}
+
+/* Function: esl_wei_cdf()
+ *
+ * Purpose: Calculates the cumulative distribution function for the
+ * Weibull, $P(X \leq x)$, given quantile <x>,
+ * offset <mu>, and parameters <lambda> and <tau>.
+ */
+double
+esl_wei_cdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda*(x-mu);
+ double tly = tau * log(y);
+
+ if (x <= mu) return 0.0;
+ else if (fabs(tly) < eslSMALLX1) return exp(tly);
+ else return 1 - exp(-exp(tly));
+}
+
+/* Function: esl_wei_logcdf()
+ *
+ * Purpose: Calculates the log of the cumulative distribution function for a
+ * Weibull, $P(X \leq x)$, given quantile <x>,
+ * offset <mu>, and parameters <lambda> and <tau>.
+ */
+double
+esl_wei_logcdf(double x, double mu, double lambda, double tau)
+{
+ double y = lambda*(x-mu);
+ double tly = tau * log(y);
+
+ if (x <= mu) return -eslINFINITY;
+
+ if (fabs(tly) < eslSMALLX1) return tly;
+ else if (fabs(exp(-exp(tly))) < eslSMALLX1) return -exp(-exp(tly));
+ else return log(1 - exp(-exp(tly)));
+}
+
+
+/* Function: esl_wei_surv()
+ *
+ * Purpose: Calculates the survivor function, $P(X>x)$ (that is, 1-CDF,
+ * the right tail probability mass) for a Weibull
+ * distribution, given quantile <x>, offset <mu>, and parameters
+ * <lambda> and <tau>.
+ */
+double
+esl_wei_surv(double x, double mu, double lambda, double tau)
+{
+ double y = lambda*(x-mu);
+ double tly = tau * log(y);
+
+ if (x <= mu) return 1.0;
+
+ return exp(-exp(tly));
+}
+
+/* Function: esl_wei_logsurv()
+ *
+ * Purpose: Calculates the log survivor function, $\log P(X>x)$ (that is,
+ * log(1-CDF), the right tail log probability mass) for a
+ * Weibull distribution, given quantile <x>, offset <mu>,
+ * and parameters <lambda> and <tau>.
+ */
+double
+esl_wei_logsurv(double x, double mu, double lambda, double tau)
+{
+ double y = lambda*(x-mu);
+ double tly = tau * log(y);
+
+ if (x <= mu) return 0.0;
+
+ return -exp(tly);
+}
+
+/* Function: esl_wei_invcdf()
+ *
+ * Purpose: Calculates the inverse CDF for a Weibull distribution
+ * with parameters <mu>, <lambda>, and <tau>, returning
+ * the quantile <x> at which the CDF is <p>, for $0<p<1$.
+ */
+double
+esl_wei_invcdf(double p, double mu, double lambda, double tau)
+{
+ return mu + 1/lambda * exp(1/tau * log(-log((1.-p))));
+}
+/*-------------------- end densities & distributions ------------------------*/
+
+
+
+
+/****************************************************************************
+ * 2. Generic API routines: for general interface w/ histogram module
+ ****************************************************************************/
+
+/* Function: esl_wei_generic_pdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_wei_pdf()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_wei_generic_pdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_wei_pdf(x, p[0], p[1], p[2]);
+}
+
+/* Function: esl_wei_generic_cdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_wei_cdf()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_wei_generic_cdf(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_wei_cdf(x, p[0], p[1], p[2]);
+}
+
+/* Function: esl_wei_generic_surv()
+ *
+ * Purpose: Generic-API wrapper around <esl_wei_surv()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_wei_generic_surv(double x, void *params)
+{
+ double *p = (double *) params;
+ return esl_wei_surv(x, p[0], p[1], p[2]);
+}
+
+/* Function: esl_wei_generic_invcdf()
+ *
+ * Purpose: Generic-API wrapper around <esl_wei_invcdf()>, taking
+ * a void ptr to a double array containing $\mu$, $\lambda$,
+ * $\tau$ parameters.
+ */
+double
+esl_wei_generic_invcdf(double p, void *params)
+{
+ double *v = (double *) params;
+ return esl_wei_invcdf(p, v[0], v[1], v[2]);
+}
+/*------------------------ end generic API ---------------------------------*/
+
+
+
+/****************************************************************************
+ * 3. Dumping plots for files
+ ****************************************************************************/
+
+/* Function: esl_wei_Plot()
+ *
+ * Purpose: Plot some Weibull function <func> (for instance, <esl_wei_pdf()>)
+ * for Weibull parameters <mu>, <lambda>, and <tau>, for a range of
+ * quantiles x from <xmin> to <xmax> in steps of <xstep>;
+ * output to an open stream <fp> in xmgrace XY input format.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEWRITE> on any system write error, such as filled disk.
+ */
+int
+esl_wei_Plot(FILE *fp, double mu, double lambda, double tau,
+ double (*func)(double x, double mu, double lambda, double tau),
+ double xmin, double xmax, double xstep)
+{
+ double x;
+ for (x = xmin; x <= xmax; x += xstep)
+ if (x > mu || tau >= 1.) /* don't try to plot at mu where pdf blows up */
+ if (fprintf(fp, "%f\t%g\n", x, (*func)(x, mu, lambda, tau)) < 0) ESL_EXCEPTION_SYS(eslEWRITE, "weibull plot write failed");
+ if (fprintf(fp, "&\n") < 0) ESL_EXCEPTION_SYS(eslEWRITE, "weibull plot write failed");
+ return eslOK;
+}
+/*-------------------- end plot dumping routines ---------------------------*/
+
+
+
+
+
+/****************************************************************************
+ * 4. Sampling (augmentation: random)
+ ****************************************************************************/
+#ifdef eslAUGMENT_RANDOM
+
+/* Function: esl_wei_Sample()
+ *
+ * Purpose: Sample a Weibull random variate,
+ * by the transformation method.
+ */
+double
+esl_wei_Sample(ESL_RANDOMNESS *r, double mu, double lambda, double tau)
+{
+ double p;
+ p = esl_rnd_UniformPositive(r);
+ return esl_wei_invcdf(p, mu, lambda, tau);
+}
+#endif /*eslAUGMENT_RANDOM*/
+/*--------------------------- end sampling ---------------------------------*/
+
+
+/****************************************************************************
+ * 5. ML fitting to complete data (augmentation: minimizer)
+ ****************************************************************************/
+#ifdef eslAUGMENT_MINIMIZER
+/* Easel's conjugate gradient descent code allows a single void ptr to
+ * point to any necessary fixed data, so we put everything into one
+ * structure:
+ */
+struct wei_data {
+ double *x; /* data: n observed samples */
+ int n; /* number of observed samples */
+ double mu; /* mu is considered to be known, not fitted */
+};
+
+/* wei_func():
+ * Returns the negative log likelihood of a complete data sample,
+ * in the API of the conjugate gradient descent optimizer in esl_minimizer.
+ */
+static double
+wei_func(double *p, int nparam, void *dptr)
+{
+ double lambda, tau;
+ struct wei_data *data;
+ double logL;
+ int i;
+
+ /* Unpack what the optimizer gave us.
+ */
+ lambda = exp(p[0]); /* see below for c.o.v. notes */
+ tau = exp(p[1]);
+ data = (struct wei_data *) dptr;
+
+ logL = 0.;
+ for (i = 0; i < data->n; i++)
+ {
+ if (tau < 1. && data->x[i] == data->mu) continue; /* hack: disallow infinity */
+ logL += esl_wei_logpdf(data->x[i], data->mu, lambda, tau);
+ }
+ return -logL; /* goal: minimize NLL */
+}
+
+/* Function: esl_wei_FitComplete()
+ *
+ * Purpose: Given an array of <n> samples <x[0]..x[n-1>, fit
+ * them to a stretched exponential distribution starting
+ * at lower bound <mu> (all $x_i > \mu$), and
+ * return maximum likelihood parameters <ret_lambda>
+ * and <ret_tau>.
+ *
+ * Args: x - complete GEV-distributed data [0..n-1]
+ * n - number of samples in <x>
+ * ret_mu - RETURN: lower bound of the distribution (all x_i >= mu)
+ * ret_lambda - RETURN: maximum likelihood estimate of lambda
+ * ret_tau - RETURN: maximum likelihood estimate of tau
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslENOHALT> if the fit doesn't converge.
+ *
+ * Xref: STL9/136-137
+ */
+int
+esl_wei_FitComplete(double *x, int n, double *ret_mu,
+ double *ret_lambda, double *ret_tau)
+{
+ struct wei_data data;
+ double p[2]; /* parameter vector */
+ double u[2]; /* max initial step size vector */
+ double wrk[8]; /* 4 tmp vectors of length 2 */
+ double mean;
+ double mu, lambda, tau; /* initial param guesses */
+ double tol = 1e-6; /* convergence criterion for CG */
+ double fx; /* f(x) at minimum; currently unused */
+ int status;
+
+ /* Make a good initial guess, based on exponential fit;
+ * set an arbitrary tau.
+ */
+ mu = esl_vec_DMin(x, n);
+ esl_stats_DMean(x, n, &mean, NULL);
+ lambda = 1 / (mean - mu);
+ tau = 0.9;
+
+ /* Load the data structure
+ */
+ data.x = x;
+ data.n = n;
+ data.mu = mu;
+
+ /* Change of variables;
+ * lambda > 0, so c.o.v. lambda = exp^w, w = log(lambda);
+ * tau > 0, same c.o.v.
+ */
+ p[0] = log(lambda);
+ p[1] = log(tau);
+
+ u[0] = 1.0;
+ u[1] = 1.0;
+
+ /* pass problem to the optimizer
+ */
+ status = esl_min_ConjugateGradientDescent(p, u, 2,
+ &wei_func, NULL,
+ (void *)(&data),
+ tol, wrk, &fx);
+ *ret_mu = mu;
+ *ret_lambda = exp(p[0]);
+ *ret_tau = exp(p[1]);
+ return status;
+}
+#endif /*eslAUGMENT_MINIMIZER*/
+
+/*****************************************************************
+ * 6. ML fitting to binned data (augmentation: histogram, minimizer)
+ *****************************************************************/
+
+#ifdef eslAUGMENT_HISTOGRAM
+#ifdef eslAUGMENT_MINIMIZER
+struct wei_binned_data {
+ ESL_HISTOGRAM *h; /* contains the binned observed data */
+ double mu; /* mu is considered to be known, not fitted */
+};
+
+/* wei_binned_func():
+ * Returns the negative log likelihood of a binned data sample,
+ * in the API of the conjugate gradient descent optimizer in esl_minimizer.
+ */
+static double
+wei_binned_func(double *p, int nparam, void *dptr)
+{
+ struct wei_binned_data *data = (struct wei_binned_data *) dptr;
+ ESL_HISTOGRAM *h = data->h;
+ double lambda, tau;
+ double logL;
+ double ai,bi;
+ int i;
+ double tmp;
+
+ /* Unpack what the optimizer gave us.
+ */
+ lambda = exp(p[0]); /* see below for c.o.v. notes */
+ tau = exp(p[1]);
+
+ logL = 0.;
+ for (i = h->cmin; i <= h->imax; i++)
+ {
+ if (h->obs[i] == 0) continue;
+
+ ai = esl_histogram_Bin2LBound(h,i);
+ bi = esl_histogram_Bin2UBound(h,i);
+ if (ai < data->mu) ai = data->mu;
+
+ tmp = esl_wei_cdf(bi, data->mu, lambda, tau) -
+ esl_wei_cdf(ai, data->mu, lambda, tau);
+
+ /* for cdf~1.0, numerical roundoff error can create tmp<0 by a
+ * teensy amount; tolerate that, but catch anything worse */
+ ESL_DASSERT1( (tmp + 1e-7 > 0.));
+ if (tmp <= 0.) return eslINFINITY;
+
+ logL += h->obs[i] * log(tmp);
+ }
+ return -logL; /* goal: minimize NLL */
+}
+
+/* Function: esl_wei_FitCompleteBinned()
+ *
+ * Purpose: Given a histogram <g> with binned observations, where each
+ * bin i holds some number of observed samples x with values from
+ * lower bound l to upper bound u (that is, $l < x \leq u$), and
+ * <mu>, the known offset (minimum value) of the distribution;
+ * return maximum likelihood parameters <ret_lambda>
+ * and <ret_tau>.
+ *
+ * Args: x - complete GEV-distributed data [0..n-1]
+ * n - number of samples in <x>
+ * ret_mu - lower bound of the distribution (all x_i > mu)
+ * ret_lambda - RETURN: maximum likelihood estimate of lambda
+ * ret_tau - RETURN: maximum likelihood estimate of tau
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslENOHALT> if the fit doesn't converge.
+ *
+ * Xref: STL9/136-137
+ */
+int
+esl_wei_FitCompleteBinned(ESL_HISTOGRAM *h, double *ret_mu,
+ double *ret_lambda, double *ret_tau)
+{
+ struct wei_binned_data data;
+ double p[2]; /* parameter vector */
+ double u[2]; /* max initial step size vector */
+ double wrk[8]; /* 4 tmp vectors of length 2 */
+ double mean;
+ double mu, lambda, tau; /* initial param guesses */
+ double tol = 1e-6; /* convergence criterion for CG */
+ double fx; /* f(x) at minimum; currently unused */
+ int status;
+ int i;
+ double ai;
+
+ /* Set the fixed mu.
+ * Make a good initial guess of lambda, based on exponential fit.
+ * Choose an arbitrary tau.
+ */
+ if (h->is_tailfit) mu = h->phi; /* all x > mu in this case */
+ else if (h->is_rounded) mu = esl_histogram_Bin2LBound(h, h->imin);
+ else mu = h->xmin;
+
+ mean = 0.;
+ for (i = h->cmin; i <= h->imax; i++)
+ {
+ ai = esl_histogram_Bin2LBound(h, i);
+ ai += 0.5*h->w; /* midpoint in bin */
+ mean += (double)h->obs[i] * ai;
+ }
+ mean /= h->No;
+ lambda = 1 / (mean - mu);
+
+ tau = 0.9;
+
+ /* load the data structure */
+ data.h = h;
+ data.mu = mu;
+
+ /* Change of variables;
+ * lambda > 0, so c.o.v. lambda = exp^w, w = log(lambda);
+ * tau > 0, same c.o.v.
+ */
+ p[0] = log(lambda);
+ p[1] = log(tau);
+
+ u[0] = 1.0;
+ u[1] = 1.0;
+
+ /* pass problem to the optimizer
+ */
+ status = esl_min_ConjugateGradientDescent(p, u, 2,
+ &wei_binned_func, NULL,
+ (void *)(&data),
+ tol, wrk, &fx);
+ *ret_mu = mu;
+ *ret_lambda = exp(p[0]);
+ *ret_tau = exp(p[1]);
+ return status;
+}
+#endif /*eslAUGMENT_HISTOGRAM*/
+#endif /*eslAUGMENT_MINIMIZER*/
+/*--------------------------- end fitting ----------------------------------*/
+
+
+
+
+/****************************************************************************
+ * 7. Test driver
+ ****************************************************************************/
+#ifdef eslWEIBULL_TESTDRIVE
+/* Compile:
+ gcc -g -Wall -I. -I ~/src/easel -L ~/src/easel -o test -DeslWEIBULL_TESTDRIVE\
+ esl_weibull.c -leasel -lm
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_weibull.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-l", eslARG_REAL, "1.0", NULL, NULL, NULL, NULL, NULL, "set slope of sampled variates (lambda parameter) to <x> ", 0 },
+ { "-m", eslARG_REAL, "10.0", NULL, NULL, NULL, NULL, NULL, "set location of sampled variates (mu parameter) to <x>", 0 },
+ { "-n", eslARG_INT, "10000", NULL, NULL, NULL, NULL, NULL, "set # of sampled variates to <n>", 0 },
+ { "-o", eslARG_OUTFILE, NULL, NULL, NULL, NULL, NULL, NULL, "output histogram to file <f>", 0 },
+ { "-s", eslARG_INT, "0", NULL, NULL, NULL, NULL, NULL, "set random number seed to <n>", 0 },
+ { "-t", eslARG_REAL, "0.7", NULL, NULL, NULL, NULL, NULL, "set shape of sampled variates (tau parameter) to <x>", 0 },
+ { "-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "be more verbose in output", 0 },
+ { "-w", eslARG_REAL, "0.1", NULL, NULL, NULL, NULL, NULL, "set width of histogram bins to <x>", 0 },
+ { "--cdf", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "dump plot of cumulative distribution", 0 },
+ { "--logcdf", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "dump plot of log cumulative distribution", 0 },
+ { "--pdf", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "dump plot of probability density", 0 },
+ { "--logpdf", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "dump plot of log probability density", 0 },
+ { "--surv", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "dump plot of survival P(s>x)", 0 },
+ { "--logsurv", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "dump plot of log survival, log(P(s>x))", 0 },
+ { "--xL", eslARG_REAL, NULL, NULL, NULL, NULL, NULL, NULL, "set minimum x-axis value on dumped plots to <x>", 0 },
+ { "--xH", eslARG_REAL, NULL, NULL, NULL, NULL, NULL, NULL, "set maximum x-axis value on dumped plots to <x>", 0 },
+ { "--xS", eslARG_REAL, NULL, NULL, NULL, NULL, NULL, NULL, "set x-axis increment value on dumped plots to <x>", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options]";
+static char banner[] = "test driver for Easel's Weibull distribution module";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage);
+ ESL_RANDOMNESS *rng = esl_randomness_Create(esl_opt_GetInteger(go, "-s"));
+ double mu = esl_opt_GetReal (go, "-m");
+ double lambda = esl_opt_GetReal (go, "-l");
+ double tau = esl_opt_GetReal (go, "-t");
+ int n = esl_opt_GetInteger(go, "-n");
+ double binwidth = esl_opt_GetReal (go, "-w");
+ int plot_cdf = esl_opt_GetBoolean(go, "--cdf");
+ int plot_logcdf = esl_opt_GetBoolean(go, "--logcdf");
+ int plot_pdf = esl_opt_GetBoolean(go, "--pdf");
+ int plot_logpdf = esl_opt_GetBoolean(go, "--logpdf");
+ int plot_surv = esl_opt_GetBoolean(go, "--surv");
+ int plot_logsurv = esl_opt_GetBoolean(go, "--logsurv");
+ int be_verbose = esl_opt_GetBoolean(go, "-v");
+ char *plotfile = esl_opt_GetString (go, "-o");
+ ESL_HISTOGRAM *h = NULL;
+ int xmin_set = esl_opt_IsOn(go, "--xL");
+ double xmin = xmin_set ? esl_opt_GetReal(go, "--xL") : mu;
+ int xmax_set = esl_opt_IsOn(go, "--xH");
+ double xmax = xmax_set ? esl_opt_GetReal(go, "--xH") : mu+40*(1./lambda);
+ int xstep_set = esl_opt_IsOn(go, "--xH");
+ double xstep = xstep_set ? esl_opt_GetReal(go, "--xS") : 0.1;
+ FILE *pfp = stdout;
+ double emu, elambda, etau;
+ int i;
+ double x;
+ double *data;
+ int ndata;
+
+ fprintf(stderr, "## %s\n", argv[0]);
+ fprintf(stderr, "# rng seed = %" PRIu32 "\n", esl_randomness_GetSeed(rng));
+
+ if (be_verbose) printf("Parametric: mu = %f lambda = %f tau = %f\n", mu, lambda, tau);
+
+ h = esl_histogram_CreateFull(mu, 100., binwidth);
+ if (plotfile && (pfp = fopen(plotfile, "w")) == NULL) ESL_EXCEPTION(eslFAIL, "Failed to open plotfile");
+
+ for (i = 0; i < n; i++)
+ {
+ x = esl_wei_Sample(rng, mu, lambda, tau);
+ esl_histogram_Add(h, x);
+ }
+ esl_histogram_GetData(h, &data, &ndata);
+
+ esl_wei_FitComplete(data, ndata, &emu, &elambda, &etau);
+ if (be_verbose) printf("Complete data fit: mu = %f lambda = %f tau = %f\n", emu, elambda, etau);
+ if (fabs( (emu-mu)/mu ) > 0.01) ESL_EXCEPTION(eslFAIL, "Error in (complete) fitted mu > 1%\n");
+ if (fabs( (elambda-lambda)/lambda ) > 0.10) ESL_EXCEPTION(eslFAIL, "Error in (complete) fitted lambda > 10%\n");
+ if (fabs( (etau-tau)/tau ) > 0.10) ESL_EXCEPTION(eslFAIL, "Error in (complete) fitted tau > 10%\n");
+
+ esl_wei_FitCompleteBinned(h, &emu, &elambda, &etau);
+ if (be_verbose) printf("Binned data fit: mu = %f lambda = %f tau = %f\n", emu, elambda, etau);
+ if (fabs( (emu-mu)/mu ) > 0.01) ESL_EXCEPTION(eslFAIL, "Error in (binned) fitted mu > 1%\n");
+ if (fabs( (elambda-lambda)/lambda ) > 0.10) ESL_EXCEPTION(eslFAIL, "Error in (binned) fitted lambda > 10%\n");
+ if (fabs( (etau-tau)/tau ) > 0.10) ESL_EXCEPTION(eslFAIL, "Error in (binned) fitted lambda > 10%\n");
+
+ if (plot_pdf) esl_wei_Plot(pfp, mu, lambda, tau, &esl_wei_pdf, xmin, xmax, xstep);
+ if (plot_logpdf) esl_wei_Plot(pfp, mu, lambda, tau, &esl_wei_logpdf, xmin, xmax, xstep);
+ if (plot_cdf) esl_wei_Plot(pfp, mu, lambda, tau, &esl_wei_cdf, xmin, xmax, xstep);
+ if (plot_logcdf) esl_wei_Plot(pfp, mu, lambda, tau, &esl_wei_logcdf, xmin, xmax, xstep);
+ if (plot_surv) esl_wei_Plot(pfp, mu, lambda, tau, &esl_wei_surv, xmin, xmax, xstep);
+ if (plot_logsurv) esl_wei_Plot(pfp, mu, lambda, tau, &esl_wei_logsurv, xmin, xmax, xstep);
+
+ if (plotfile) fclose(pfp);
+ esl_histogram_Destroy(h);
+ esl_randomness_Destroy(rng);
+ esl_getopts_Destroy(go);
+
+ fprintf(stderr, "# status = ok\n");
+ return 0;
+}
+#endif /*eslWEIBULL_TESTDRIVE*/
+
+/****************************************************************************
+ * 8. Example
+ ****************************************************************************/
+#ifdef eslWEIBULL_EXAMPLE
+/*::cexcerpt::wei_example::begin::*/
+/* compile:
+ gcc -g -Wall -I. -o example -DeslWEIBULL_EXAMPLE\
+ -DeslAUGMENT_HISTOGRAM -DeslAUGMENT_RANDOM -DeslAUGMENT_MINIMIZER\
+ esl_weibull.c esl_histogram.c esl_random.c esl_minimizer.c\
+ esl_stats.c esl_vectorops.c easel.c -lm
+ * run: ./example
+ */
+#include <stdio.h>
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_histogram.h"
+#include "esl_weibull.h"
+
+int
+main(int argc, char **argv)
+{
+ double mu = -2.1;
+ double lambda = 1.0;
+ double tau = 0.8;
+ ESL_HISTOGRAM *h = esl_histogram_CreateFull(mu, 100., 0.1);
+ ESL_RANDOMNESS *r = esl_randomness_Create(0);
+ int n = 10000;
+ double emu, elambda, etau;
+ double *data;
+ int ndata;
+ double x;
+ int i;
+
+ for (i = 0; i < n; i++)
+ {
+ x = esl_wei_Sample(r, mu, lambda, tau);
+ esl_histogram_Add(h, x);
+ }
+ esl_histogram_GetData(h, &data, &ndata);
+
+ /* Plot the empirical (sampled) and expected survivals */
+ esl_histogram_PlotSurvival(stdout, h);
+ esl_wei_Plot(stdout, mu, lambda, tau,
+ &esl_wei_surv, h->xmin, h->xmax, 0.1);
+
+ /* ML fit to complete data, and plot fitted survival curve */
+ esl_wei_FitComplete(data, ndata, &emu, &elambda, &etau);
+ esl_wei_Plot(stdout, emu, elambda, etau,
+ &esl_wei_surv, h->xmin, h->xmax, 0.1);
+
+ /* ML fit to binned data, plot fitted survival curve */
+ esl_wei_FitCompleteBinned(h, &emu, &elambda, &etau);
+ esl_wei_Plot(stdout, emu, elambda, etau,
+ &esl_wei_surv, h->xmin, h->xmax, 0.1);
+
+ esl_randomness_Destroy(r);
+ esl_histogram_Destroy(h);
+ return 0;
+}
+/*::cexcerpt::wei_example::end::*/
+#endif /*eslWEIBULL_EXAMPLE*/
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_weibull.h b/esl_weibull.h
new file mode 100644
index 0000000..b149dca
--- /dev/null
+++ b/esl_weibull.h
@@ -0,0 +1,53 @@
+/* Weibull distributions.
+ *
+ * SRE, Tue Aug 9 10:48:35 2005 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslWEIBULL_INCLUDED
+#define eslWEIBULL_INCLUDED
+
+#ifdef eslAUGMENT_RANDOM
+#include <esl_random.h>
+#endif
+
+#ifdef eslAUGMENT_HISTOGRAM
+#include <esl_histogram.h>
+#endif
+
+extern double esl_wei_pdf (double x, double mu, double lambda, double tau);
+extern double esl_wei_logpdf (double x, double mu, double lambda, double tau);
+extern double esl_wei_cdf (double x, double mu, double lambda, double tau);
+extern double esl_wei_logcdf (double x, double mu, double lambda, double tau);
+extern double esl_wei_surv (double x, double mu, double lambda, double tau);
+extern double esl_wei_logsurv(double x, double mu, double lambda, double tau);
+extern double esl_wei_invcdf (double p, double mu, double lambda, double tau);
+
+extern double esl_wei_generic_pdf (double x, void *params);
+extern double esl_wei_generic_cdf (double x, void *params);
+extern double esl_wei_generic_surv (double x, void *params);
+extern double esl_wei_generic_invcdf(double p, void *params);
+
+extern int esl_wei_Plot(FILE *fp, double mu, double lambda, double tau,
+ double (*func)(double x, double mu, double lambda, double tau),
+ double xmin, double xmax, double xstep);
+
+
+#ifdef eslAUGMENT_RANDOM
+extern double esl_wei_Sample(ESL_RANDOMNESS *r, double mu, double lambda, double tau);
+#endif
+
+#ifdef eslAUGMENT_MINIMIZER
+extern int esl_wei_FitComplete(double *x, int n, double *ret_mu,
+ double *ret_lambda, double *ret_tau);
+#ifdef eslAUGMENT_HISTOGRAM
+extern int esl_wei_FitCompleteBinned(ESL_HISTOGRAM *h, double *ret_mu,
+ double *ret_lambda, double *ret_tau);
+#endif /*eslAUGMENT_HISTOGRAM*/
+#endif /*eslAUGMENT_MINIMIZER*/
+
+
+#endif /*eslWEIBULL_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_weibull.tex b/esl_weibull.tex
new file mode 100644
index 0000000..4b435a7
--- /dev/null
+++ b/esl_weibull.tex
@@ -0,0 +1,47 @@
+
+The Weibull distribution may be useful for fitting fat-tailed
+empirical distributions.
+
+In the literature, the Weibull is sometimes called a ``stretched
+exponential'' distribution when its shape parameter $\tau$ is less
+than 1. ``Stretched exponential'' distributions in the literature are
+either Weibull (PDF $ = \lambda \tau (\lambda x)^\tau exp\left[-
+(\lambda x)^tau \right]$ or a more simple PDF $\propto exp\left[-
+{\lambda(x-\mu)}^tau \right]$. Easel treats the latter form in the
+\eslmod{stretchexp} module.
+
+\subsection{Weibull densities}
+
+The probability density function (PDF) is:
+
+\begin{equation}
+P(X=x) = \lambda \tau [\lambda(x - \mu)]^{\tau-1} e^{- [\lambda(x-\mu)]^{\tau}}
+\label{eqn:weibull_pdf}
+\end{equation}
+
+The cumulative distribution function (CDF) is:
+
+\begin{equation}
+P(X \leq x) = 1 - e^{- [\lambda(x-\mu)]^{\tau}}
+\label{eqn:weibull_cdf}
+\end{equation}
+
+Variate $x$ ranges $\mu \leq x < \infty$. (However, for $\tau < 1$,
+the PDF goes to infinity at $x=\mu$, so evaluating at $x=\mu$ may not
+be desired.)
+
+Location parameter $\mu$ is unconstrained, $-\infty < \mu <
+\infty$. (Weibull distributions are usually represented without an
+explicit location parameter, implicitly assuming $\mu = 0$.)
+
+Scale parameter $\lambda$ is nonnegative, $\lambda >
+0$. (Alteratively, Weibull distributions are also sometimes
+represented with a scale parameter $b = \frac{1}{\lambda}$.)
+
+Shape parameter $\tau$ is nonnegative, $\tau > 0$.
+
+
+
+
+
+
diff --git a/esl_workqueue.c b/esl_workqueue.c
new file mode 100644
index 0000000..24cb40f
--- /dev/null
+++ b/esl_workqueue.c
@@ -0,0 +1,564 @@
+/* Threaded work queue.
+ *
+ * Contents:
+ * 1. Work queue routines
+ * 2. Examples.
+ * 3. Copyright and license.
+ *
+ */
+#include "esl_config.h"
+
+#ifdef HAVE_PTHREAD
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "easel.h"
+#include "esl_workqueue.h"
+
+/*****************************************************************
+ *# 1. Work queue routines
+ *****************************************************************/
+
+/* Function: esl_workqueue_Create()
+ * Synopsis: Create a work queue object.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Creates an <ESL_WORK_QUEUE> object of <size>. The
+ * queues are used to handle objects <void *> that
+ * are ready to be processed and that have been
+ * processed by worker threads.
+ *
+ * Returns: ptr to the new <ESL_WORK_QUEUE> object.
+ *
+ * Throws: <eslESYS> on allocation or initialization failure.
+ */
+ESL_WORK_QUEUE *
+esl_workqueue_Create(int size)
+{
+ int i;
+ int status;
+ ESL_WORK_QUEUE *queue = NULL;
+
+ ESL_ALLOC(queue, sizeof(ESL_WORK_QUEUE));
+
+ queue->readerQueue = NULL;
+ queue->readerQueueCnt = 0;
+ queue->readerQueueHead = 0;
+
+ queue->workerQueue = NULL;
+ queue->workerQueueCnt = 0;
+ queue->workerQueueHead = 0;
+
+ queue->queueSize = size;
+ queue->pendingWorkers = 0;
+
+ if (pthread_mutex_init(&queue->queueMutex, NULL) != 0) ESL_XEXCEPTION(eslESYS, "mutex init failed");
+
+ if (pthread_cond_init(&queue->readerQueueCond, NULL) != 0) ESL_XEXCEPTION(eslESYS, "cond reader init failed");
+ if (pthread_cond_init(&queue->workerQueueCond, NULL) != 0) ESL_XEXCEPTION(eslESYS, "cond worker init failed");
+
+ ESL_ALLOC(queue->readerQueue, sizeof(void *) * size);
+ ESL_ALLOC(queue->workerQueue, sizeof(void *) * size);
+
+ for (i = 0; i < queue->queueSize; ++i)
+ {
+ queue->readerQueue[i] = NULL;
+ queue->workerQueue[i] = NULL;
+ }
+
+ return queue;
+
+ ERROR:
+ esl_workqueue_Destroy(queue);
+ return NULL;
+}
+
+/* Function: esl_workqueue_Destroy()
+ * Synopsis: Destroys an <ESL_WORK_QUEUE> object.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Frees an <ESL_WORK_QUEUE> object.
+ *
+ * The calling routine is responsible for freeing the
+ * memory of the actual queued objects.
+ *
+ * Returns: void
+ */
+void
+esl_workqueue_Destroy(ESL_WORK_QUEUE *queue)
+{
+ if (queue == NULL) return;
+
+ pthread_mutex_destroy (&queue->queueMutex);
+ pthread_cond_destroy (&queue->readerQueueCond);
+ pthread_cond_destroy (&queue->workerQueueCond);
+
+ if (queue->readerQueue != NULL) free(queue->readerQueue);
+ if (queue->workerQueue != NULL) free(queue->workerQueue);
+
+ free(queue);
+}
+
+/* Function: esl_workqueue_Init()
+ * Synopsis: Adds a queued object to the producers list.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Added a work object <void> to the producers list checking for
+ * any errors.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> if thread synchronization fails somewhere.
+ * <eslEINVAL> if something's wrong with <queue> or <ptr>.
+ */
+int esl_workqueue_Init(ESL_WORK_QUEUE *queue, void *ptr)
+{
+ int cnt;
+ int inx;
+
+ int queueSize;
+
+ if (queue == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid queue object");
+ if (ptr == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid reader object");
+
+ if (pthread_mutex_lock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex lock failed");
+
+ queueSize = queue->queueSize;
+
+ /* check to make sure we won't overflow */
+ cnt = queue->readerQueueCnt;
+ if (cnt >= queueSize) ESL_EXCEPTION(eslEINVAL, "Reader queue overflow");
+
+ inx = (queue->readerQueueHead + cnt) % queueSize;
+ queue->readerQueue[inx] = ptr;
+
+ ++queue->readerQueueCnt;
+ if (cnt == 0)
+ {
+ if (pthread_cond_signal (&queue->readerQueueCond) != 0) ESL_EXCEPTION(eslESYS, "cond signal failed");
+ }
+
+ if (pthread_mutex_unlock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex unlock failed");
+
+ return eslOK;
+}
+
+/* Function: esl_workqueue_Remove()
+ * Synopsis: Removes a queued object from the producers list.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Removes a queued object from the producers list.
+ *
+ * A object <void> that has already been consumed by a worker
+ * is removed the the producers list. If there are no empty
+ * objects, a <obj> is set to NULL.
+ *
+ * The pointer to the object is returned in the obj arguement.
+ *
+ * Returns: <eslOK> on success.
+ * <eslEOD> if no objects are in the queue.
+ *
+ * Throws: <eslESYS> if thread synchronization fails somewhere.
+ * <eslEINVAL> if something's wrong with <queue>.
+ */
+int
+esl_workqueue_Remove(ESL_WORK_QUEUE *queue, void **obj)
+{
+ int inx;
+ int status = eslEOD;
+
+ if (obj == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid object pointer");
+ if (queue == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid queue object");
+
+ if (pthread_mutex_lock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex lock failed");
+
+ /* check if there are any items on the readers list */
+ *obj = NULL;
+ if (queue->readerQueueCnt > 0)
+ {
+ inx = (queue->readerQueueHead + queue->readerQueueCnt) % queue->queueSize;
+ *obj = queue->readerQueue[inx];
+ queue->readerQueue[inx] = NULL;
+ --queue->readerQueueCnt;
+ status = eslOK;
+ }
+
+ if (pthread_mutex_unlock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex unlock failed");
+
+ return status;
+}
+
+/* Function: esl_workqueue_Complete()
+ * Synopsis: Signals the end of the queue.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Signal the end of the queue. If there are any threads
+ * waiting on an object, signal them to wake up and complete
+ * their processing.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> if thread synchronization fails somewhere.
+ * <eslEINVAL> if something's wrong with <queue>.
+ */
+int
+esl_workqueue_Complete(ESL_WORK_QUEUE *queue)
+{
+ if (queue == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid queue object");
+ if (pthread_mutex_lock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex lock failed");
+
+ if (queue->pendingWorkers != 0)
+ {
+ if (pthread_cond_broadcast (&queue->workerQueueCond) != 0) ESL_EXCEPTION(eslESYS, "broadcast failed");
+ }
+
+ if (pthread_mutex_unlock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex unlock failed");
+
+ return eslOK;
+}
+
+/* Function: esl_workqueue_Reset()
+ * Synopsis: Reset the queue for another run.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Reset the queue for another run. This is done by moving
+ * all the queued object to the reader's list (i.e. producer).
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> if thread synchronization fails somewhere.
+ * <eslEINVAL> if something's wrong with <queue>.
+ */
+int
+esl_workqueue_Reset(ESL_WORK_QUEUE *queue)
+{
+ int inx;
+ int queueSize;
+
+ if (queue == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid queue object");
+ if (pthread_mutex_lock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex lock failed");
+
+ queueSize = queue->queueSize;
+
+ /* move all buffers back to the reader queue */
+ while (queue->workerQueueCnt > 0)
+ {
+ inx = (queue->readerQueueHead + queue->readerQueueCnt) % queueSize;
+ queue->readerQueue[inx] = queue->workerQueue[queue->workerQueueHead];
+ ++queue->readerQueueCnt;
+
+ queue->workerQueue[queue->workerQueueHead] = NULL;
+ queue->workerQueueHead = (queue->workerQueueHead + 1) % queueSize;
+ --queue->workerQueueCnt;
+ }
+
+ queue->pendingWorkers = 0;
+
+ if (pthread_mutex_unlock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex unlock failed");
+
+ return eslOK;
+}
+
+/* Function: esl_workqueue_ReaderUpdate()
+ * Synopsis: Producer routine.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: The producer (i.e. Reader) places an object, that is
+ * ready to be processed by a worker on the consumers
+ * (i.e. Workers) work queue.
+ *
+ * If the <in> object is not null, it is placed on the
+ * workers queue. If there are any workers waiting for
+ * an object, they are signaled to wake up.
+ *
+ * If the reader routine has supplied an <out> pointer,
+ * an object that has already been processed by a worker,
+ * is placed in <out> so the object can be made ready
+ * for another worker thread.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> if thread synchronization fails somewhere.
+ * <eslEINVAL> if something's wrong with <queue>.
+ */
+int esl_workqueue_ReaderUpdate(ESL_WORK_QUEUE *queue, void *in, void **out)
+{
+ int inx;
+ int queueSize;
+
+ if (queue == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid queue object");
+ if (pthread_mutex_lock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex lock failed");
+
+ queueSize = queue->queueSize;
+
+ /* check if the caller is queuing up an item */
+ if (in != NULL)
+ {
+
+ /* check to make sure we don't overflow */
+ if (queue->workerQueueCnt >= queueSize) ESL_EXCEPTION(eslEINVAL, "Work queue overflow");
+
+ inx = (queue->workerQueueHead + queue->workerQueueCnt) % queueSize;
+ queue->workerQueue[inx] = in;
+ ++queue->workerQueueCnt;
+
+ if (queue->pendingWorkers != 0)
+ {
+ if (pthread_cond_broadcast (&queue->workerQueueCond) != 0) ESL_EXCEPTION(eslESYS, "broadcast failed");
+ }
+ }
+
+ /* check if the caller is waiting for a queued item */
+ if (out != NULL)
+ {
+
+ /* wait for a processed buffers to be returned */
+ while (queue->readerQueueCnt == 0)
+ {
+ if (pthread_cond_wait (&queue->readerQueueCond, &queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "cond wait failed");
+ }
+
+ inx = queue->readerQueueHead;
+ *out = queue->readerQueue[inx];
+ queue->readerQueue[inx] = NULL;
+ queue->readerQueueHead = (queue->readerQueueHead + 1) % queueSize;
+ --queue->readerQueueCnt;
+ }
+
+ if (pthread_mutex_unlock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex unlock failed");
+
+ return eslOK;
+}
+
+/* Function: esl_workqueue_WorkerUpdate()
+ * Synopsis: Consumer routine.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: The consumer (i.e. Worker) places an object that has
+ * been processed on the producers (i.e. Readers) queue.
+ *
+ * If the <in> object is not null, it is placed on the
+ * readers queue. If the reader is waiting for an object,
+ * it is signaled it to wake up.
+ *
+ * If the worker routine has supplied an <out> pointer,
+ * an object that is ready for processing by a worker,
+ * is placed in <out> so the worker thread can continue.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslESYS> if thread synchronization fails somewhere.
+ * <eslEINVAL> if something's wrong with <queue>.
+ */
+int esl_workqueue_WorkerUpdate(ESL_WORK_QUEUE *queue, void *in, void **out)
+{
+ int cnt;
+ int inx;
+ int queueSize;
+ int status;
+
+ if (queue == NULL) ESL_XEXCEPTION(eslEINVAL, "Invalid queue object");
+ if (pthread_mutex_lock (&queue->queueMutex) != 0) ESL_XEXCEPTION(eslESYS, "mutex lock failed");
+
+ queueSize = queue->queueSize;
+
+ /* check if the caller is queuing up an item */
+ if (in != NULL)
+ {
+
+ /* check to make sure we don't overflow */
+ if (queue->readerQueueCnt >= queueSize) ESL_XEXCEPTION(eslEINVAL, "Reader queue overflow");
+
+ inx = (queue->readerQueueHead + queue->readerQueueCnt) % queueSize;
+ queue->readerQueue[inx] = in;
+ cnt = queue->readerQueueCnt++;
+ if (cnt == 0)
+ {
+ if (pthread_cond_signal (&queue->readerQueueCond) != 0) ESL_XEXCEPTION(eslESYS, "cond signal failed");
+ }
+ }
+
+ /* check if the caller is waiting for a queued item */
+ if (out != NULL)
+ {
+
+ if (queue->workerQueueCnt == 0)
+ {
+ /* wait for a processed buffers to be returned */
+ ++queue->pendingWorkers;
+ while (queue->workerQueueCnt == 0)
+ {
+ if (pthread_cond_wait (&queue->workerQueueCond, &queue->queueMutex) != 0) ESL_XEXCEPTION(eslESYS, "cond wait failed");
+ }
+ --queue->pendingWorkers;
+ }
+
+ inx = queue->workerQueueHead;
+ *out = queue->workerQueue[inx];
+ queue->workerQueue[inx] = NULL;
+ queue->workerQueueHead = (queue->workerQueueHead + 1) % queueSize;
+ --queue->workerQueueCnt;
+ }
+
+ if (pthread_mutex_unlock (&queue->queueMutex) != 0) ESL_XEXCEPTION(eslESYS, "mutex unlock failed");
+ return eslOK;
+
+ ERROR:
+ if (out) *out = NULL;
+ return status;
+}
+
+/* Function: esl_workqueue_Dump()
+ * Synopsis: Print the contents of the queues.
+ * Incept: MSF, Thu Jun 18 11:51:39 2009
+ *
+ * Purpose: Print the contents of the queues and their pointers.
+ *
+ * Returns: <eslOK> on success.
+ */
+int esl_workqueue_Dump(ESL_WORK_QUEUE *queue)
+{
+ int i;
+
+ if (queue == NULL) ESL_EXCEPTION(eslEINVAL, "Invalid queue object");
+ if (pthread_mutex_lock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex lock failed");
+
+ printf ("Reader head: %2d count: %2d\n", queue->readerQueueHead, queue->readerQueueCnt);
+ printf ("Worker head: %2d count: %2d\n", queue->workerQueueHead, queue->workerQueueCnt);
+ for (i = 0; i < queue->queueSize; ++i)
+ {
+ printf (" %2d: %p %p\n", i, queue->readerQueue[i], queue->workerQueue[i]);
+ }
+ printf ("Pending: %2d\n\n", queue->pendingWorkers);
+
+ if (pthread_mutex_unlock (&queue->queueMutex) != 0) ESL_EXCEPTION(eslESYS, "mutex unlock failed");
+
+ return eslOK;
+}
+
+/*****************************************************************
+ * 2. Example
+ *****************************************************************/
+
+#ifdef eslWORKQUEUE_EXAMPLE
+#include "easel.h"
+#include "esl_threads.h"
+#include "esl_workqueue.h"
+
+typedef struct {
+ char id;
+ ESL_WORK_QUEUE *queue;
+} WORK_INFO;
+
+/* gcc --std=gnu99 -g -Wall -pthread -o esl_workqueue_example -I. -DeslWORKQUEUE_EXAMPLE esl_workqueue.c easel.c */
+static void
+worker_thread(void *data)
+{
+ ESL_THREADS *thr = (ESL_THREADS *) data;
+ WORK_INFO *info = NULL;
+ int idx;
+
+ int *obj;
+
+ esl_threads_Started(thr, &idx);
+
+ info = (WORK_INFO *) esl_threads_GetData(thr, idx);
+ printf("THREAD %c: ready\n", info->id);
+
+ esl_workqueue_WorkerUpdate(info->queue, NULL, (void *) &obj);
+ while (*obj > 0)
+ {
+ printf("THREAD %c: processing %d\n", info->id, *obj);
+ esl_workqueue_WorkerUpdate(info->queue, obj, (void *) &obj);
+ }
+
+ printf("THREAD %c: done\n", info->id);
+
+ esl_threads_Finished(thr, idx);
+ return;
+}
+
+int
+main(void)
+{
+ int i;
+ int ncpu = 4;
+ int iter = 25;
+ WORK_INFO *worker = NULL;
+
+ ESL_THREADS *thr = NULL;
+ ESL_WORK_QUEUE *queue = NULL;
+
+ int *objs = NULL;
+ int *obj;
+
+ objs = malloc(sizeof(int) * ncpu * 2);
+ worker = malloc(sizeof(WORK_INFO) * ncpu);
+
+ thr = esl_threads_Create(&worker_thread);
+
+ /* Create a work queue that is able to hold two items per thread.
+ * The idea is that while one object is being processed by a
+ * worker thread, another item is being readied. So, when the
+ * worker thread has completed processing its current object,
+ * its next object to processes is hopefully waiting.
+ */
+ queue = esl_workqueue_Create(ncpu * 2);
+ for (i = 0; i < ncpu * 2; i++)
+ {
+ objs[i] = 0;
+ esl_workqueue_Init(queue, &objs[i]);
+ }
+
+ for (i = 0; i < ncpu; i++)
+ {
+ worker[i].id = 'A' + i;
+ worker[i].queue = queue;
+ esl_threads_AddThread(thr, (void *) &worker[i]);
+ }
+
+ esl_threads_WaitForStart (thr);
+
+ /* For N number of iterations, get an object that has been
+ * processed, i.e. on the readers input queue and place it
+ * on the ready queue.
+ */
+ esl_workqueue_ReaderUpdate(queue, NULL, (void **) &obj);
+ for (i = 1; i <= iter; ++i)
+ {
+ *obj = i;
+ printf("Item %d is ready to be processed\n", *obj);
+ esl_workqueue_ReaderUpdate(queue, obj, (void **) &obj);
+ }
+
+ /* put zeros on the queues to signal the worker that we are done */
+ for (i = 0; i < ncpu; ++i)
+ {
+ *obj = 0;
+ esl_workqueue_ReaderUpdate(queue, obj, (void **) &obj);
+ }
+
+ /* The worker threads now run their work. */
+ esl_threads_WaitForFinish(thr);
+ esl_threads_Destroy(thr);
+
+ esl_workqueue_Destroy(queue);
+
+ free(worker);
+ free(objs);
+
+ return eslOK;
+}
+#endif /*eslWORKQUEUE_EXAMPLE*/
+#endif /* HAVE_PTHREAD */
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
diff --git a/esl_workqueue.h b/esl_workqueue.h
new file mode 100644
index 0000000..a90caf2
--- /dev/null
+++ b/esl_workqueue.h
@@ -0,0 +1,44 @@
+/* Simple threaded work queue using POSIX threads.
+ *
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslWORKQUEUE_INCLUDED
+#define eslWORKQUEUE_INCLUDED
+
+typedef struct {
+ pthread_mutex_t queueMutex; /* mutex for queue serialization */
+ pthread_cond_t readerQueueCond; /* condition variable used to wake up the producer */
+ pthread_cond_t workerQueueCond; /* condition variable used to wake up the consumers */
+
+ void **readerQueue; /* list of objects the the workers have completed */
+ int readerQueueCnt; /* number of objects in the queue */
+ int readerQueueHead; /* first object in the queue */
+
+ void **workerQueue; /* list of objects ready to be processed by worker threads */
+ int workerQueueCnt; /* number of objects in the queue */
+ int workerQueueHead; /* first object in the queue */
+
+ int queueSize; /* max number of items a queue will hold */
+ int pendingWorkers; /* number of consumers waiting for work */
+} ESL_WORK_QUEUE;
+
+extern ESL_WORK_QUEUE *esl_workqueue_Create(int size);
+extern void esl_workqueue_Destroy(ESL_WORK_QUEUE *queue);
+
+extern int esl_workqueue_Init (ESL_WORK_QUEUE *queue, void *ptr);
+extern int esl_workqueue_Complete(ESL_WORK_QUEUE *queue);
+extern int esl_workqueue_Reset (ESL_WORK_QUEUE *queue);
+
+extern int esl_workqueue_Remove(ESL_WORK_QUEUE *queue, void **obj);
+
+extern int esl_workqueue_ReaderUpdate(ESL_WORK_QUEUE *queue, void *in, void **out);
+extern int esl_workqueue_WorkerUpdate(ESL_WORK_QUEUE *queue, void *in, void **out);
+
+extern int esl_workqueue_Dump(ESL_WORK_QUEUE *queue);
+
+#endif /*eslWORKQUEUE_INCLUDED*/
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_wuss.c b/esl_wuss.c
new file mode 100644
index 0000000..55ae24c
--- /dev/null
+++ b/esl_wuss.c
@@ -0,0 +1,872 @@
+/* RNA secondary structure markup in WUSS notation.
+ *
+ * <> : base pairs in stem-loops, i.e. <<<___>>>
+ * () : base pairs in helices enclosing multifurcation of all <> stems
+ * [] : base pairs in helices enclosing multifurc of at least one () helix
+ * {} : base pairs in helices enclosing even deeper multifurcations
+ *
+ * _ : (i.e. underscore) nucleotide in a hairpin loop
+ * - : (i.e. dash) nucleotide in a bulge or interior loop
+ * , : nucleotide in a multifurcation loop (mnemonic: "stem1, stem2," )
+ * : : nucleotide in external single strand
+ *
+ * Aa : (and Bb, Cc, etc) pseudoknotted base pairs, upper case on left, lower case on right.
+ *
+ * and in alignments of a seq to an RNA structure profile, as in Infernal:
+ * . : insertion relative to a known consensus structure
+ * ~ : nucleotide is unaligned to a structure profile, because of local structure alignment
+ *
+ */
+#include "esl_config.h"
+
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#include "esl_stack.h"
+#include "esl_vectorops.h"
+#include "esl_wuss.h"
+
+/* Function: esl_wuss2ct()
+ * Incept: SRE, Tue Feb 15 08:44:54 2005 [St. Louis]
+ *
+ * Purpose: Given a secondary structure string <ss>, <0..len-1>,
+ * in WUSS notation, convert it to a CT array, <1..len>,
+ * in <ct>. Caller provides a <ct> allocated for at least
+ * <len+1> ints. <ct[i]> is the position that residue i
+ * base pairs to, or 0 if i is unpaired. <ct[0]> is undefined
+ * (but if you care: it is set to 0).
+ *
+ * WUSS notation is interpreted loosely here, as input
+ * WUSS. Any matching bracket pair or upper/lower case
+ * alphabetic pair is interpreted as a base pair; any other
+ * WUSS annotation is interpreted as unpaired.
+ *
+ * Returns: <eslOK> on success. Returns <eslESYNTAX> if the WUSS
+ * string isn't valid.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ */
+int
+esl_wuss2ct(char *ss, int len, int *ct)
+{
+ ESL_STACK *pda[27]; /* 1 secondary structure + up to 26 levels of pk's */
+ int i;
+ int pos, pair;
+ int status; /* success or failure return status */
+
+ /* Initialization: always initialize the main pda (0);
+ * we'll init the pk pda's on demand.
+ */
+ for (i = 1; i <= 26; i++) pda[i] = NULL;
+ if ((pda[0] = esl_stack_ICreate()) == NULL) goto FINISH;
+
+ for (pos = 0; pos <= len; pos++) ct[pos] = 0;
+
+ for (pos = 1; pos <= len; pos++)
+ {
+ if (!isprint((int) ss[pos-1])) /* armor against garbage */
+ { status = eslESYNTAX; goto FINISH; }
+
+ /* left side of a pair: push position onto stack 0 (pos = 1..L) */
+ else if (ss[pos-1] == '<' ||
+ ss[pos-1] == '(' ||
+ ss[pos-1] == '[' ||
+ ss[pos-1] == '{')
+ {
+ if ((status = esl_stack_IPush(pda[0], pos)) != eslOK) goto FINISH;
+ }
+
+ /* right side of a pair; resolve pair; check for agreement */
+ else if (ss[pos-1] == '>' ||
+ ss[pos-1] == ')' ||
+ ss[pos-1] == ']' ||
+ ss[pos-1] == '}')
+ {
+ if (esl_stack_IPop(pda[0], &pair) == eslEOD)
+ { status = eslESYNTAX; goto FINISH;} /* no closing bracket */
+ else if ((ss[pair-1] == '<' && ss[pos-1] != '>') ||
+ (ss[pair-1] == '(' && ss[pos-1] != ')') ||
+ (ss[pair-1] == '[' && ss[pos-1] != ']') ||
+ (ss[pair-1] == '{' && ss[pos-1] != '}'))
+ { status = eslESYNTAX; goto FINISH; } /* brackets don't match */
+ else
+ {
+ ct[pos] = pair;
+ ct[pair] = pos;
+ }
+ }
+ /* same stuff for pseudoknots */
+ else if (isupper((int) ss[pos-1]))
+ {
+ /* Create the PK stacks on demand.
+ */
+ i = ss[pos-1] - 'A' + 1;
+ if (pda[i] == NULL)
+ if ((pda[i] = esl_stack_ICreate()) == NULL)
+ { status = eslEMEM; goto FINISH; }
+
+ if ((status = esl_stack_IPush(pda[i], pos)) != eslOK) goto FINISH;
+ }
+ else if (islower((int) ss[pos-1]))
+ {
+ i = ss[pos-1] - 'a' + 1;
+ if (pda[i] == NULL ||
+ esl_stack_IPop(pda[i], &pair) == eslEOD)
+ { status = eslESYNTAX; goto FINISH;}
+ else
+ {
+ ct[pos] = pair;
+ ct[pair] = pos;
+ }
+ }
+ else if (strchr(":,_-.~", ss[pos-1]) == NULL)
+ { status = eslESYNTAX; goto FINISH; } /* bogus character */
+ }
+ status = eslOK;
+
+ FINISH:
+ for (i = 0; i <= 26; i++)
+ if (pda[i] != NULL)
+ { /* nothing should be left on stacks */
+ if (esl_stack_ObjectCount(pda[i]) != 0)
+ status = eslESYNTAX;
+ esl_stack_Destroy(pda[i]);
+ }
+ return status;
+}
+
+
+/* Function: esl_ct2wuss()
+ * Incept: SRE, Wed Feb 16 11:22:53 2005 [St. Louis]
+ *
+ * Purpose: Convert a CT array <ct> for <n> residues (1..n) to a WUSS
+ * format string <ss>. <ss> must be allocated for at least
+ * n+1 chars (+1 for the terminal NUL).
+ *
+ * ER, Sat Aug 18 13:22:03 EDT 2012
+ * esl\_ct2wuss() extended to deal with pseudoknots structures.
+ * Pseudoknots are annotated as AA...aa, BB...bb,..., ZZ..zz.
+ * Attemting to convert a <ct> that requires more letters
+ * than [A-Z] will return an <eslEINVAL> error.
+ *
+ * Attempting to convert a <ct> that involves triplet interactions
+ * will return an <eslEINVAL> error.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEINCONCEIVABLE> on internal failure.
+ */
+int
+esl_ct2wuss(int *ct, int n, char *ss)
+{
+ int rb[26]; /* array that delimits the right bound of a pseudoknot character */
+ ESL_STACK *pda = NULL; /* stack for "main" secondary structure */
+ ESL_STACK *auxpk = NULL; /* aux stack for pseudoknot */
+ ESL_STACK *auxss = NULL; /* aux stack for single stranded */
+ int *cct = NULL; /* copy of ct vector */
+ int nfaces; /* number of faces in a cWW structure */
+ int minface; /* max depth of faces in a cWW structure */
+ int leftbound, rightbound; /* left and right bound to find basepairs belonging to a given pseudoknot */
+ int xpk = 0; /* number of pseudoknot chararactes used */
+ int npk = 0; /* number of pseudoknots */
+ int npairs = 0; /* total number of basepairs */
+ int npairs_reached = 0; /* number of basepairs found so far */
+ int found_partner; /* true if we've found left partner of a given base in stack pda */
+ int i,j,k; /* sequence indices */
+ int x; /* index for pseudoknot characters */
+ int status = eslEMEM; /* exit status 'til proven otherwise */
+
+ /* total number of basepairs */
+ for (j = 1; j <= n; j ++) { if (ct[j] > 0 && j < ct[j]) npairs ++; }
+
+ /* Copy of ct; if a pseudoknotted structure, cct will be modified later.
+ */
+ ESL_ALLOC(cct, sizeof(int)*(n+1));
+ esl_vec_ICopy(ct, (n+1), cct);
+
+ /* Initialize rightbounds for all 26 pseudoknot indices */
+ for (x = 0; x < 26; x ++) rb[x] = -1;
+
+ /* init ss[] to single stranded */
+ for (j = 0; j < n; j ++) { ss[j] = ':'; }
+ ss[n] = '\0';
+
+ /* Initialization*/
+ if ((pda = esl_stack_ICreate()) == NULL) goto FINISH;
+ if ((auxpk = esl_stack_ICreate()) == NULL) goto FINISH;
+ if ((auxss = esl_stack_ICreate()) == NULL) goto FINISH;
+
+ for (j = 1; j <= n; j++)
+ {
+ if (cct[j] == 0) /* unpaired: push j. */
+ {
+ if (esl_stack_IPush(pda, j) != eslOK) goto FINISH;
+ }
+ else if (cct[j] > j) /* left side of a bp: push j. */
+ {
+ if (esl_stack_IPush(pda, j) != eslOK) goto FINISH;
+ }
+ else /* right side of a bp; main routine: fingh the left partner */
+ {
+ found_partner = FALSE;
+ /* Pop back until we find the left partner of j;
+ * In case this is not a nested structure, finding
+ * the left partner of j will require to put bases
+ * aside into stack auxpk.
+ *
+ * After we find the left partner of j,
+ * store single stranded residues in auxss;
+ * keep track of #faces and the maximum face depth.
+ */
+ nfaces = 0;
+ minface = -1;
+
+ while (esl_stack_ObjectCount(pda))
+ {
+ if (esl_stack_IPop(pda, &i) != eslOK) goto FINISH;
+
+ if (i < 0) /* a face counter */
+ {
+ nfaces++;
+ if (i < minface) minface = i;
+ }
+
+ else if (cct[i] == j) /* we found the i,j pair. */
+ {
+ found_partner = TRUE;
+ npairs_reached ++;
+ /* Now we know i,j pair; and we know how many faces are
+ * above them; and we know the max depth of those faces.
+ * That's enough to label the pair in WUSS notation.
+ * if nfaces == 0, minface is -1; <> a closing bp of a hairpin.
+ * if nfaces == 1, inherit minface, we're continuing a stem.
+ * if nfaces > 1, bump minface in depth; we're closing a bifurc.
+ */
+ if (nfaces > 1 && minface > -4) minface--;
+ switch (minface) {
+ case -1: ss[i-1] = '<'; ss[j-1] = '>'; break;
+ case -2: ss[i-1] = '('; ss[j-1] = ')'; break;
+ case -3: ss[i-1] = '['; ss[j-1] = ']'; break;
+ case -4: ss[i-1] = '{'; ss[j-1] = '}'; break;
+ default:
+ esl_stack_Destroy(pda); esl_stack_Destroy(auxpk); esl_stack_Destroy(auxss); free(cct);
+ ESL_EXCEPTION(eslEINCONCEIVABLE, "no such face code");
+ }
+ if (esl_stack_IPush(pda, minface) != eslOK) goto FINISH;
+
+ /* Now, aux contains all the unpaired residues we need to label,
+ * according to the # of faces "above" them:
+ * nfaces = 0: hairpin loop
+ * nfaces = 1: bulge or interior loop
+ * nfaces > 1: multifurc
+ */
+ while (esl_stack_IPop(auxss, &i) == eslOK)
+ {
+ switch (nfaces) {
+
+ case 0: ss[i-1] = '_'; break;
+ case 1: ss[i-1] = '-'; break;
+ default: ss[i-1] = ','; break; /* nfaces > 1 */
+ }
+ }
+ break;
+ }
+
+ else if (cct[i] == 0)
+ {
+ /* add to auxss only if originally sigle stranded */
+ if (ct[i] == 0) { if (esl_stack_IPush(auxss, i) != eslOK) goto FINISH; }
+ }
+
+ else /* cct[i]>0, != j: i is paired, but not to j: pseudoknot! */
+ {
+ /* i is in the way to find j's left partner.
+ * Move i to stack auxpk; resolve pseudoknot(s) after we've found partern for j.
+ */
+ if (esl_stack_IPush(auxpk, i) != eslOK) goto FINISH;
+ }
+ }
+
+ if (!found_partner) {
+ esl_stack_Destroy(pda); esl_stack_Destroy(auxpk); esl_stack_Destroy(auxss); free(cct);
+ ESL_EXCEPTION(eslEINVAL, "Cannot find left partner (%d) of base %d. Likely a triplet", ct[j], j);
+ }
+ } /* finished finding the left partner of j */
+
+ /* After we've found the left partner of j, resolve pks found along the way.
+ * Then, remove the pseudoknotted based from cct so we can find the rest of the structure.
+ */
+ if (esl_stack_ObjectCount(auxpk)) {
+
+ /* init for first pseudoknot */
+ leftbound = cct[j];
+ rightbound = leftbound + 1;
+ xpk = -1; /* start with 'A' if possible again */
+
+ while (esl_stack_IPop(auxpk, &i) == eslOK) {
+
+ for (k = rightbound-1; k > leftbound; k --)
+ {
+ if (cct[k] == 0) { continue; }
+ else if (cct[k] > rightbound) { continue; }
+ else if (cct[k] == i) { break; } /* i continues the given pseudoknot */
+ else { k = leftbound; break; } /* a new pseudoknot */
+ }
+
+ if (k == leftbound) /* a new pseudoknot */
+ {
+ npk ++;
+ xpk ++;
+ /* figure out if we can use this alphabet index, or bump it up if necessary */
+ while (i < rb[xpk]) { xpk ++; }
+
+ leftbound = (rightbound < cct[i])? rightbound : cct[j];
+ rightbound = cct[i];
+ }
+
+ npairs_reached ++;
+ if (xpk+(int)('a') <= (int)('z')) {
+
+ /* update the rightbound of this pk index if necessary */
+ if (cct[i] > rb[xpk]) rb[xpk] = cct[i];
+
+ /* Add pk indices for this basepair */
+ ss[i-1] = (char)(xpk+(int)('A'));
+ ss[cct[i]-1] = (char)(xpk+(int)('a'));
+
+ /* remove pseudoknotted pair from cct */
+ cct[i] = 0;
+ cct[ct[i]] = 0;
+ }
+ else ESL_EXCEPTION(eslEINVAL, "Don't have enough letters to describe all different pseudoknots.");
+
+ }
+ } /* while there is something in auxpk stack */
+
+ } /* finished loop over j: end position on seq, 1..n*/
+
+ status = eslOK;
+
+ ERROR:
+ FINISH:
+ if (npairs != npairs_reached)
+ ESL_EXCEPTION(eslFAIL, "found %d out of %d pairs.", npairs_reached, npairs);
+ if (pda != NULL) esl_stack_Destroy(pda);
+ if (auxpk != NULL) esl_stack_Destroy(auxpk);
+ if (auxss != NULL) esl_stack_Destroy(auxss);
+ if (cct != NULL) free(cct);
+ return status;
+}
+
+/* Function: esl_ct2simplewuss()
+ * Incept: ER, Wed Aug 22 13:31:54 EDT 2012 [Janelia]
+ *
+ * Purpose: Convert a CT array <ct> for <n> residues (1..n) to a simple WUSS
+ * format string <ss>. <ss> must be allocated for at least
+ * n+1 chars (+1 for the terminal NUL).
+ *
+ * This function can be used with the <ct> of a secondary
+ * structure including arbitrary pseudoknots, or for the
+ * <ct> or a tertiary structure (say cWH, tWH, cSS,... H bonds).
+ *
+ * The string <ss> has basepairs annotated as <>, Aa, Bb, ..., Zz;
+ * unpaired bases are annotated as '.'.
+ *
+ * Attemting to convert a <ct> that requires more letters
+ * than [A-Z] will return an <eslEINVAL> error.
+ *
+ * Attempting to convert a <ct> that involves triplet interactions
+ * will return an <eslEINVAL> error.
+ *
+ * Returns: <eslOK> on success.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEINCONCEIVABLE> on internal failure.
+ */
+int
+esl_ct2simplewuss(int *ct, int n, char *ss)
+{
+ int rb[26]; /* array that delimits the right bound of a pseudoknot character */
+ ESL_STACK *pda = NULL; /* stack for "main" secondary structure */
+ ESL_STACK *auxpk = NULL; /* aux stack for pseudoknot */
+ int *cct = NULL; /* copy of ct vector */
+ int leftbound, rightbound; /* left and right bound to find basepairs belonging to a given pseudoknot */
+ int xpk = 0; /* number of pseudoknot chararactes used */
+ int npk = 0; /* number of pseudoknots */
+ int npairs = 0; /* total number of basepairs */
+ int npairs_reached = 0; /* number of basepairs found so far */
+ int found_partner; /* true if we've found left partner of a given base in stack pda */
+ int i,j,k; /* sequence indices */
+ int x; /* index for pseudoknot characters */
+ int status = eslEMEM; /* exit status 'til proven otherwise */
+
+ /* total number of basepairs */
+ for (j = 1; j <= n; j ++) { if (ct[j] > 0 && j < ct[j]) npairs ++; }
+
+ /* Copy of ct; if a pseudoknotted structure, cct will be modified later.
+ */
+ ESL_ALLOC(cct, sizeof(int)*(n+1));
+ esl_vec_ICopy(ct, (n+1), cct);
+
+ /* Initialize rightbounds for all 26 pseudoknot indices */
+ for (x = 0; x < 26; x ++) rb[x] = -1;
+
+ /* init ss[] to single stranded */
+ for (j = 0; j < n; j ++) { ss[j] = '.'; }
+ ss[n] = '\0';
+
+ /* Initialization*/
+ if ((pda = esl_stack_ICreate()) == NULL) goto FINISH;
+ if ((auxpk = esl_stack_ICreate()) == NULL) goto FINISH;
+
+ for (j = 1; j <= n; j++)
+ {
+ if (cct[j] == 0) /* unpaired: push j. */
+ {
+ if (esl_stack_IPush(pda, j) != eslOK) goto FINISH;
+ }
+ else if (cct[j] > j) /* left side of a bp: push j. */
+ {
+ if (esl_stack_IPush(pda, j) != eslOK) goto FINISH;
+ }
+ else /* right side of a bp; main routine: fingh the left partner */
+ {
+ found_partner = FALSE;
+
+ /* Pop back until we find the left partner of j;
+ * In case this is not a nested structure, finding
+ * the left partner of j will require to put bases
+ * aside into stack auxpk.
+ */
+ while (esl_stack_ObjectCount(pda))
+ {
+ if (esl_stack_IPop(pda, &i) != eslOK) goto FINISH;
+
+ if (cct[i] == j) /* we found the i,j pair. */
+ {
+ found_partner = TRUE;
+ npairs_reached ++;
+
+ ss[i-1] = '<';
+ ss[j-1] = '>';
+ break;
+ }
+
+ else if (cct[i] == 0)
+ {
+ if (ct[i] == 0) ss[i-1] = '.';
+ }
+
+ else /* cct[i]>0, != j: i is paired, but not to j: pseudoknot! */
+ {
+ /* i is in the way to find j's left partner.
+ * Move i to stack auxpk; resolve pseudoknot(s) after we've found partern for j.
+ */
+ if (esl_stack_IPush(auxpk, i) != eslOK) goto FINISH;
+ }
+ }
+
+ if (!found_partner) {
+ esl_stack_Destroy(pda); esl_stack_Destroy(auxpk); free(cct);
+ ESL_EXCEPTION(eslEINVAL, "Cannot find left partner (%d) of base %d. Likely a triplet", ct[j], j);
+ }
+ } /* finished finding the left partner of j */
+
+ /* After we've found the left partner of j, resolve pks found along the way.
+ * Then, remove the pseudoknotted based from cct so we can find the rest of the structure.
+ */
+ if (esl_stack_ObjectCount(auxpk)) {
+
+ /* init for first pseudoknot */
+ leftbound = cct[j];
+ rightbound = leftbound + 1;
+ xpk = -1; /* start with 'A' if possible again */
+
+ while (esl_stack_IPop(auxpk, &i) == eslOK) {
+
+ for (k = rightbound-1; k > leftbound; k --)
+ {
+ if (cct[k] == 0) { continue; }
+ else if (cct[k] > rightbound) { continue; }
+ else if (cct[k] == i) { break; } /* i continues the given pseudoknot */
+ else { k = leftbound; break; } /* a new pseudoknot */
+ }
+
+ if (k == leftbound) /* a new pseudoknot */
+ {
+ npk ++;
+ xpk ++;
+ /* figure out if we can use this alphabet index, or bump it up if necessary */
+ while (i < rb[xpk]) { xpk ++; }
+
+ leftbound = (rightbound < cct[i])? rightbound : cct[j];
+ rightbound = cct[i];
+ }
+
+ npairs_reached ++;
+ if (xpk+(int)('a') <= (int)('z')) {
+
+ /* update the rightbound of this pk index if necessary */
+ if (cct[i] > rb[xpk]) rb[xpk] = cct[i];
+
+ /* Add pk indices for this basepair */
+ ss[i-1] = (char)(xpk+(int)('A'));
+ ss[cct[i]-1] = (char)(xpk+(int)('a'));
+
+ /* remove pseudoknotted pair from cct */
+ cct[i] = 0;
+ cct[ct[i]] = 0;
+ }
+ else ESL_EXCEPTION(eslEINVAL, "Don't have enough letters to describe all different pseudoknots.");
+
+ }
+ } /* while there is something in auxpk stack */
+
+ } /* finished loop over j: end position on seq, 1..n*/
+
+ status = eslOK;
+
+ ERROR:
+ FINISH:
+ if (npairs != npairs_reached)
+ ESL_EXCEPTION(eslFAIL, "found %d out of %d pairs.", npairs_reached, npairs);
+ if (pda != NULL) esl_stack_Destroy(pda);
+ if (auxpk != NULL) esl_stack_Destroy(auxpk);
+ if (cct != NULL) free(cct);
+ return status;
+}
+
+/* Function: esl_wuss2kh()
+ * Incept: SRE, Tue Feb 15 10:05:35 2005 [St. Louis]
+ *
+ * Purpose: Converts a secondary structure string <ss> in
+ * WUSS notation back to old KHS format in <kh>.
+ * <kh> must be allocated for at least as much
+ * space as <ss>. <kh> may be the same as <ss>,
+ * in which case the conversion is done in-place.
+ *
+ * Note: Left bp chars are converted to > (left base of base pairs)
+ * Right bp chars are converted to < (right base of base pairs)
+ * Characters _-,:~ are converted to . (unpaired bases)
+ * Character . is untouched (unpaired)
+ * Everything else is untouched, including any pseudoknot notation.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_wuss2kh(char *ss, char *kh)
+{
+ while (*ss != '\0')
+ {
+ if (*ss == '<') *kh = '>';
+ else if (*ss == '(') *kh = '>';
+ else if (*ss == '[') *kh = '>';
+ else if (*ss == '{') *kh = '>';
+ else if (*ss == '>') *kh = '<';
+ else if (*ss == ')') *kh = '<';
+ else if (*ss == ']') *kh = '<';
+ else if (*ss == '}') *kh = '<';
+ else if (*ss == '_') *kh = '.';
+ else if (*ss == '-') *kh = '.';
+ else if (*ss == ',') *kh = '.';
+ else if (*ss == ':') *kh = '.';
+ else if (*ss == '~') *kh = '.';
+ else *kh = *ss;
+ ss++;
+ kh++;
+ }
+ *kh = '\0';
+ return eslOK;
+}
+
+
+/* Function: esl_kh2wuss()
+ * Incept: SRE, Tue Feb 15 10:10:40 2005 [St. Louis]
+ *
+ * Purpose: Converts an old format secondary structure string <kh>
+ * to shorthand WUSS format <ss>. <ss> must be allocated at least
+ * as large as <kh>. <ss> can be identical to <kh>, in which
+ * case the conversion is done in-place.
+ *
+ * Note: Character > is converted to < (left base of base pairs)
+ * Character < is converted to > (right base of base pairs)
+ * A space is converted to . (just in case)
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_kh2wuss(char *kh, char *ss)
+{
+ while (*kh != '\0')
+ {
+ if (*kh == '>') *ss = '<';
+ else if (*kh == '<') *ss = '>';
+ else if (*kh == ' ') *ss = '.';
+ else *ss = *kh;
+ kh++;
+ ss++;
+ }
+ *ss = '\0';
+ return eslOK;
+}
+
+
+/* Function: esl_wuss_full()
+ * Incept: SRE, Mon Feb 28 09:44:40 2005 [St. Louis]
+ *
+ * Purpose: Given a simple ("input") WUSS format annotation string <oldss>,
+ * convert it to full ("output") WUSS format in <newss>.
+ * <newss> must be allocated by the caller to be at least as
+ * long as <oldss>. <oldss> and <newss> can be the same,
+ * to convert a secondary structure string in place.
+ *
+ * Pseudoknot annotation is preserved, if <oldss> had it.
+ *
+ * Returns: <eslSYNTAX> if <oldss> isn't in valid WUSS format.
+ *
+ * Throws: <eslEMEM> on allocation failure.
+ * <eslEINCONCEIVABLE> on internal error that can't happen.
+ */
+int
+esl_wuss_full(char *oldss, char *newss)
+{
+ char *tmp = NULL;
+ int *ct = NULL;
+ int n;
+ int i;
+ int status;
+
+ /* We can use the ct2wuss algorithm to generate a full WUSS string -
+ * convert to ct, then back to WUSS. ct2wuss doesn't deal with pk's
+ * though, and we want to propagate pk annotation if it's there. So
+ * we need two workspaces: ct array, and a temporary ss string that
+ * we use to hold non-pk annotation. As a final step, we overlay
+ * the pk annotation from the original oldss annotation.
+ */
+ n = strlen(oldss);
+ ESL_ALLOC(ct, sizeof(int) * (n+1));
+ ESL_ALLOC(tmp, sizeof(char) * (n+1));
+
+ esl_wuss_nopseudo(oldss, tmp);/* tmp = nonpseudoknotted oldss */
+
+ status = esl_wuss2ct(tmp, n, ct); /* ct = oldss in ct format, no pks */
+ if (status != eslOK) goto ERROR;
+
+ status = esl_ct2wuss(ct, n, tmp); /* now tmp is a full WUSS string */
+ if (status == eslEINVAL) { status = eslEINCONCEIVABLE; goto ERROR; }/* we're sure, no pk's */
+ else if (status != eslOK) goto ERROR; /* EMEM, EINCONCEIVABLE */
+
+ for (i = 0; i < n; i++)
+ if (isalpha(oldss[i])) newss[i] = oldss[i]; /* transfer pk annotation */
+ else newss[i] = tmp[i]; /* transfer new WUSS */
+
+ free(ct);
+ free(tmp);
+ return eslOK;
+
+ ERROR:
+ free(ct);
+ free(tmp);
+ return status;
+}
+
+
+
+/* Function: esl_wuss_nopseudo()
+ * Incept: SRE, Tue Feb 15 11:02:43 2005 [St. Louis]
+ *
+ * Purpose: Given a WUSS format annotation string <ss1>,
+ * removes all pseudoknot annotation to create a new
+ * WUSS string <ss2> that contains only a "canonical"
+ * (nonpseudoknotted) structure. <ss2> must be allocated to
+ * be at least as large as <ss1>. <ss1> and <ss2>
+ * may be the same, in which case the conversion is
+ * done in place. Pseudoknot annotation in <ss1> is
+ * simply replaced by <.> in <ss2>; the resulting
+ * <ss2> WUSS string is therefore in valid simplified format,
+ * but may not be valid full format WUSS.
+ *
+ * Returns: <eslOK>.
+ */
+int
+esl_wuss_nopseudo(char *ss1, char *ss2)
+{
+ while (*ss1 != '\0')
+ {
+ if (isalpha(*ss1)) *ss2 = '.';
+ else *ss2 = *ss1;
+ ss1++;
+ ss2++;
+ }
+ *ss2 = '\0';
+ return eslOK;
+}
+
+
+/* Function: esl_wuss_reverse()
+ * Synopsis: "Reverse complement" a WUSS annotation
+ * Incept: SRE, Wed Feb 10 12:46:51 2016 [JB251 BOS-MCO]
+ *
+ * Purpose: If we need to reverse complement a structure-annotated RNA
+ * sequence, we need to "reverse complement" the WUSS
+ * annotation string. Reverse complement the annotation string
+ * <ss> into caller-provided space <new>. To revcomp an annotation
+ * in place, use <esl_wuss_reverse(ss, ss)>.
+ *
+ * Old SELEX files use a different structure annotation
+ * format, with angle brackets pointing the opposite
+ * direction: \ccode{><} for a base pair. As a convenient
+ * side effect, <esl_wuss_reverse()> will also reverse
+ * complement SELEX annotation lines.
+ *
+ * Returns: <eslOK> on success.
+ */
+int
+esl_wuss_reverse(char *ss, char *new)
+{
+ int i, n;
+
+ /* first, "complement" the annotation */
+ for (i = 0; ss[i] != '\0'; i++)
+ {
+ if (isupper(ss[i])) new[i] = tolower(ss[i]);
+ else if (islower(ss[i])) new[i] = toupper(ss[i]);
+ else {
+ switch (ss[i]) {
+ case '<': new[i] = '>'; break;
+ case '>': new[i] = '<'; break;
+ case '(': new[i] = ')'; break;
+ case ')': new[i] = '('; break;
+ case '[': new[i] = ']'; break;
+ case ']': new[i] = '['; break;
+ case '{': new[i] = '}'; break;
+ case '}': new[i] = '{'; break;
+ default: new[i] = ss[i]; break;
+ }
+ }
+ }
+ n = i;
+ /* Then, reverse it in place. */
+ for (i = 0; i < n/2; i++)
+ ESL_SWAP(new[i], new[n-i-1], char);
+
+ return eslOK;
+}
+
+
+#ifdef eslWUSS_TESTDRIVE
+/* gcc -g -Wall -o testwuss -I. -DeslWUSS_TESTDRIVE esl_wuss.c esl_random.c esl_stack.c esl_vectorops.c easel.c
+ * ./testwuss
+ */
+
+#include <stdlib.h>
+
+#include "easel.h"
+#include "esl_random.h"
+#include "esl_stack.h"
+#include "esl_vectorops.h"
+#include "esl_wuss.h"
+
+int
+main(int argc, char **argv)
+{
+ /* The example is E. coli RNase P, w/ and w/o pks.
+ * J Brown figure 10.3.00 shows 1 too many bp for pk stem A.
+ */
+ char ss[] = "\
+{{{{{{{{{{{{{{{{{{,<<<<<<<<<<<<<-<<<<<____>>>>>>>>>->>>>>>>>\
+>,,,,AAA-AAAAA[[[[---BBBB-[[[[[<<<<<_____>>>>><<<<____>>>->(\
+(---(((((,,,,,,,,,,,,<<<<<--<<<<<<<<____>>>>>->>>>>>-->>,,,,\
+,,,<<<<<<_______>>>>>><<<<<<<<<____>>>->>>>>->,,)))--))))]]]\
+]]]]]],,,<<<<------<<<<<<----<<<<<_bbbb>>>>>>>>>>>----->>>>,\
+,,,,,<<<<<<<<____>>>>>>>>,,,,,,,,,,}}}}}}}----------aaaaaaaa\
+-}-}}}}}}}}}}::::";
+ char ss_nopk[] = "\
+{{{{{{{{{{{{{{{{{{,<<<<<<<<<<<<<-<<<<<____>>>>>>>>>->>>>>>>>\
+>,,,,,,,,,,,,,[[[[--------[[[[[<<<<<_____>>>>><<<<____>>>->(\
+(---(((((,,,,,,,,,,,,<<<<<--<<<<<<<<____>>>>>->>>>>>-->>,,,,\
+,,,<<<<<<_______>>>>>><<<<<<<<<____>>>->>>>>->,,)))--))))]]]\
+]]]]]],,,<<<<------<<<<<<----<<<<<_____>>>>>>>>>>>----->>>>,\
+,,,,,<<<<<<<<____>>>>>>>>,,,,,,,,,,}}}}}}}------------------\
+-}-}}}}}}}}}}::::";
+ int len;
+ int *ct1 = NULL;
+ int *ct2 = NULL;
+ char *ss2 = NULL;
+ char *ss3 = NULL;
+ int i;
+ int nbp, nbp_true, npk;
+ int status;
+
+ len = strlen(ss);
+ ESL_ALLOC(ct1, sizeof(int) * (len+1));
+ ESL_ALLOC(ct2, sizeof(int) * (len+1));
+ ESL_ALLOC(ss2, sizeof(char) * (len+1));
+ ESL_ALLOC(ss3, sizeof(char) * (len+1));
+ nbp_true = npk = 0;
+ for (i = 0; i < len; i++)
+ {
+ if (strchr("{[(<", ss[i]) != NULL)
+ nbp_true++;
+ if (isupper(ss[i]))
+ npk++;
+ }
+
+ if (esl_wuss2ct(ss, len, ct1) != eslOK) abort();
+ nbp = 0;
+ for (i = 1; i <= len; i++)
+ if (ct1[i] > i) nbp++;
+ if (nbp != nbp_true + npk) abort();
+
+ if (esl_wuss2kh(ss, ss) != eslOK) abort();
+ if (esl_kh2wuss(ss, ss) != eslOK) abort();
+ if (esl_wuss2ct(ss, len, ct2) != eslOK) abort();
+ for (i = 1; i <= len; i++)
+ if (ct1[i] != ct2[i]) abort();
+
+ /* test of pseudoknots */
+ if (esl_ct2wuss(ct1, len, ss2) != eslOK) abort();
+ if (esl_wuss2ct(ss2, len, ct2) != eslOK) abort();
+ for (i = 1; i <= len; i++)
+ if (ct1[i] != ct2[i]) abort();
+
+ if (esl_ct2simplewuss(ct1, len, ss2) != eslOK) abort();
+ if (esl_wuss2ct(ss2, len, ct2) != eslOK) abort();
+ for (i = 1; i <= len; i++)
+ if (ct1[i] != ct2[i]) abort();
+
+ if (esl_wuss_nopseudo(ss, ss) != eslOK) abort();
+ if (esl_wuss2ct(ss, len, ct1) != eslOK) abort();
+ if (esl_wuss2ct(ss_nopk, len, ct2) != eslOK) abort();
+ for (i = 1; i <= len; i++)
+ if (ct1[i] != ct2[i]) abort();
+
+ if (esl_wuss2ct(ss_nopk, len, ct1) != eslOK) abort();
+ if (esl_ct2wuss(ct1, len, ss3) != eslOK) abort();
+ if (strcmp(ss_nopk, ss3) != 0) abort();
+
+ free(ct1);
+ free(ct2);
+ free(ss2);
+ free(ss3);
+ return 0;
+
+ ERROR:
+ free(ct1);
+ free(ct2);
+ free(ss2);
+ free(ss3);
+ return status;
+}
+#endif /*eslWUSS_TESTDRIVE*/
+
+
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
diff --git a/esl_wuss.h b/esl_wuss.h
new file mode 100644
index 0000000..310b699
--- /dev/null
+++ b/esl_wuss.h
@@ -0,0 +1,19 @@
+/* RNA secondary structure markup in WUSS notation.
+ *
+ */
+#ifndef eslWUSS_INCLUDED
+#define eslWUSS_INCLUDED
+
+extern int esl_wuss2ct(char *ss, int len, int *ct);
+extern int esl_ct2wuss(int *ct, int n, char *ss);
+extern int esl_ct2simplewuss(int *ct, int n, char *ss);
+extern int esl_wuss2kh(char *ss, char *kh);
+extern int esl_kh2wuss(char *kh, char *ss);
+extern int esl_wuss_full(char *oldss, char *newss);
+extern int esl_wuss_nopseudo(char *ss1, char *ss2);
+extern int esl_wuss_reverse(char *ss, char *new);
+
+#endif /*eslWUSS_INCLUDED*/
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/esl_wuss.tex b/esl_wuss.tex
new file mode 100644
index 0000000..5dcda77
--- /dev/null
+++ b/esl_wuss.tex
@@ -0,0 +1,34 @@
+
+The wuss module implements routines for using WUSS notation to
+represent RNA secondary structures.
+
+The API provides the following converters:
+
+\begin{tabular}{ll}
+\ccode{esl\_wuss2ct()} & Convert WUSS string to Zuker CT array. \\
+\ccode{esl\_ct2wuss()} & Convert CT array (no pk's) to WUSS string. \\
+\ccode{esl\_wuss2kh()} & Convert WUSS string to old format (Konings/Hogeweg).\\
+\ccode{esl\_kh2wuss()} & Convert old format to WUSS string.\\
+\ccode{esl\_wuss\_full()}& Convert simple WUSS to full (output) WUSS.\\
+\ccode{esl\_wuss\_nopseudo()} & Crudely remove pseudoknot annotation from WUSS string.\\
+\end{tabular}
+
+WUSS notation is defined later in the Formats section of this
+document.
+
+So-called ``old'' (KH) format (old because COVE used it, whereas
+Infernal uses WUSS) for a secondary structure annotation string used
+\ccode{><} pairs to annotate base pairs, as in \ccode{>>>....<<<} for
+a three-base stem with a four-base single stranded loop.
+
+A CT array is a \ccode{1..n} array for a sequence of length \ccode{n},
+where \ccode{ct[i]} is either an index \ccode {1..n} of a position
+that residue \ccode{i} base pairs to, or 0 if \ccode{i} is unpaired.
+
+
+
+
+
+
+
+
diff --git a/formats/BLOSUM62 b/formats/BLOSUM62
new file mode 100644
index 0000000..205f139
--- /dev/null
+++ b/formats/BLOSUM62
@@ -0,0 +1,31 @@
+# Matrix made by matblas from blosum62.iij
+# * column uses minimum score
+# BLOSUM Clustered Scoring Matrix in 1/2 Bit Units
+# Blocks Database = /data/blocks_5.0/blocks.dat
+# Cluster Percentage: >= 62
+# Entropy = 0.6979, Expected = -0.5209
+ A R N D C Q E G H I L K M F P S T W Y V B Z X *
+A 4 -1 -2 -2 0 -1 -1 0 -2 -1 -1 -1 -1 -2 -1 1 0 -3 -2 0 -2 -1 0 -4
+R -1 5 0 -2 -3 1 0 -2 0 -3 -2 2 -1 -3 -2 -1 -1 -3 -2 -3 -1 0 -1 -4
+N -2 0 6 1 -3 0 0 0 1 -3 -3 0 -2 -3 -2 1 0 -4 -2 -3 3 0 -1 -4
+D -2 -2 1 6 -3 0 2 -1 -1 -3 -4 -1 -3 -3 -1 0 -1 -4 -3 -3 4 1 -1 -4
+C 0 -3 -3 -3 9 -3 -4 -3 -3 -1 -1 -3 -1 -2 -3 -1 -1 -2 -2 -1 -3 -3 -2 -4
+Q -1 1 0 0 -3 5 2 -2 0 -3 -2 1 0 -3 -1 0 -1 -2 -1 -2 0 3 -1 -4
+E -1 0 0 2 -4 2 5 -2 0 -3 -3 1 -2 -3 -1 0 -1 -3 -2 -2 1 4 -1 -4
+G 0 -2 0 -1 -3 -2 -2 6 -2 -4 -4 -2 -3 -3 -2 0 -2 -2 -3 -3 -1 -2 -1 -4
+H -2 0 1 -1 -3 0 0 -2 8 -3 -3 -1 -2 -1 -2 -1 -2 -2 2 -3 0 0 -1 -4
+I -1 -3 -3 -3 -1 -3 -3 -4 -3 4 2 -3 1 0 -3 -2 -1 -3 -1 3 -3 -3 -1 -4
+L -1 -2 -3 -4 -1 -2 -3 -4 -3 2 4 -2 2 0 -3 -2 -1 -2 -1 1 -4 -3 -1 -4
+K -1 2 0 -1 -3 1 1 -2 -1 -3 -2 5 -1 -3 -1 0 -1 -3 -2 -2 0 1 -1 -4
+M -1 -1 -2 -3 -1 0 -2 -3 -2 1 2 -1 5 0 -2 -1 -1 -1 -1 1 -3 -1 -1 -4
+F -2 -3 -3 -3 -2 -3 -3 -3 -1 0 0 -3 0 6 -4 -2 -2 1 3 -1 -3 -3 -1 -4
+P -1 -2 -2 -1 -3 -1 -1 -2 -2 -3 -3 -1 -2 -4 7 -1 -1 -4 -3 -2 -2 -1 -2 -4
+S 1 -1 1 0 -1 0 0 0 -1 -2 -2 0 -1 -2 -1 4 1 -3 -2 -2 0 0 0 -4
+T 0 -1 0 -1 -1 -1 -1 -2 -2 -1 -1 -1 -1 -2 -1 1 5 -2 -2 0 -1 -1 0 -4
+W -3 -3 -4 -4 -2 -2 -3 -2 -2 -3 -2 -3 -1 1 -4 -3 -2 11 2 -3 -4 -3 -2 -4
+Y -2 -2 -2 -3 -2 -1 -2 -3 2 -1 -1 -2 -1 3 -3 -2 -2 2 7 -1 -3 -2 -1 -4
+V 0 -3 -3 -3 -1 -2 -2 -3 -3 3 1 -2 1 -1 -2 -2 0 -3 -1 4 -3 -2 -1 -4
+B -2 -1 3 4 -3 0 1 -1 0 -3 -4 0 -3 -3 -2 0 -1 -4 -3 -3 4 1 -1 -4
+Z -1 0 0 1 -3 3 4 -2 0 -3 -3 1 -1 -3 -1 0 -1 -3 -2 -2 1 4 -1 -4
+X 0 -1 -1 -1 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 0 0 -2 -1 -1 -1 -1 -1 -4
+* -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 1
diff --git a/formats/embl b/formats/embl
new file mode 100644
index 0000000..63c3220
--- /dev/null
+++ b/formats/embl
@@ -0,0 +1,118 @@
+ID X06347; SV 1; linear; mRNA; STD; HUM; 1209 BP.
+XX
+AC X06347;
+XX
+DT 19-OCT-1988 (Rel. 18, Created)
+DT 12-SEP-1993 (Rel. 36, Last updated, Version 2)
+XX
+DE Human mRNA for U1 small nuclear RNP-specific A protein
+XX
+KW U1 snRNP-specific protein A.
+XX
+OS Homo sapiens (human)
+OC Eukaryota; Metazoa; Chordata; Craniata; Vertebrata; Euteleostomi; Mammalia;
+OC Eutheria; Euarchontoglires; Primates; Haplorrhini; Catarrhini; Hominidae;
+OC Homo.
+XX
+RN [1]
+RP 1-1209
+RX PUBMED; 2962859.
+RA Sillekens P.T.G., Habets W.J., Beijer R.P., van Venrooij W.J.;
+RT "cDNA cloning of the human U1 snRNA-associated A protein: extensive
+RT homology between U1 and U2 snRNP-specific proteins";
+RL EMBO J. 6(12):3841-3848(1987).
+XX
+DR ASTD; TRAN00000054082.
+DR H-InvDB; HIT000321180.
+DR RFAM; RF00460; U1A_PIE.
+XX
+CC Data kindly reviewed (07-NOV-1988) by VAN VENROOIJ W.J.
+XX
+FH Key Location/Qualifiers
+FH
+FT source 1..1209
+FT /organism="Homo sapiens"
+FT /mol_type="mRNA"
+FT /clone_lib="lambda gt11"
+FT /clone="pHA-1, pHA-2, pHA-3, pHA-4"
+FT /tissue_type="teratocarcinoma."
+FT /db_xref="taxon:9606"
+FT CDS 126..974
+FT /note="A protein (AA 1-282)"
+FT /db_xref="GDB:120380"
+FT /db_xref="GOA:P09012"
+FT /db_xref="HGNC:11151"
+FT /db_xref="InterPro:IPR000504"
+FT /db_xref="InterPro:IPR012677"
+FT /db_xref="PDB:1AUD"
+FT /db_xref="PDB:1CX0"
+FT /db_xref="PDB:1DRZ"
+FT /db_xref="PDB:1DZ5"
+FT /db_xref="PDB:1FHT"
+FT /db_xref="PDB:1M5K"
+FT /db_xref="PDB:1M5O"
+FT /db_xref="PDB:1M5P"
+FT /db_xref="PDB:1M5V"
+FT /db_xref="PDB:1NU4"
+FT /db_xref="PDB:1OIA"
+FT /db_xref="PDB:1SJ3"
+FT /db_xref="PDB:1SJ4"
+FT /db_xref="PDB:1SJF"
+FT /db_xref="PDB:1U6B"
+FT /db_xref="PDB:1URN"
+FT /db_xref="PDB:1VBX"
+FT /db_xref="PDB:1VBY"
+FT /db_xref="PDB:1VBZ"
+FT /db_xref="PDB:1VC0"
+FT /db_xref="PDB:1VC5"
+FT /db_xref="PDB:1VC6"
+FT /db_xref="PDB:1VC7"
+FT /db_xref="PDB:1ZZN"
+FT /db_xref="PDB:2A3J"
+FT /db_xref="PDB:2NZ4"
+FT /db_xref="PDB:2OIH"
+FT /db_xref="PDB:2OJ3"
+FT /db_xref="PDB:2U1A"
+FT /db_xref="PDB:3BO2"
+FT /db_xref="PDB:3BO3"
+FT /db_xref="PDB:3BO4"
+FT /db_xref="PDB:3CUL"
+FT /db_xref="PDB:3CUN"
+FT /db_xref="PDB:3EGZ"
+FT /db_xref="PDB:3UTR"
+FT /db_xref="UniProtKB/Swiss-Prot:P09012"
+FT /protein_id="CAA29653.1"
+FT /translation="MAVPETRPNHTIYINNLNEKIKKDELKKSLYAIFSQFGQILDILV
+FT SRSLKMRGQAFVIFKEVSSATNALRSMQGFPFYDKPMRIQYAKTDSDIIAKMKGTFVER
+FT DRKREKRKPKSQETPATKKAVQGGGATPVVGAVQGPVPGMPPMTQAPRIMHHMPGQPPY
+FT MPPPGMIPPPGLAPGQIPPGAMPPQQLMPGQMPPAQPLSENPPNHILFLTNLPEETNEL
+FT MLSMLFNQFPGFKEVRLVPGRHDIAFVEFDNEVQAGAARDALQGFKITQNNAMKISFAK
+FT K"
+FT misc_feature 279..302
+FT /note="RNP consensus sequence"
+FT misc_feature 1162..1167
+FT /note="polyA signal"
+XX
+SQ Sequence 1209 BP; 269 A; 380 C; 307 G; 253 T; 0 other;
+ gaattcctga cttccttttc ggaggaagat ccttgagcag ccgacgttgg gacaaaggat 60
+ ttggagaaac ccagggctaa agtcacgttt ttcctccttt aagacttacc tcaacacttc 120
+ actccatggc agttcccgag acccgcccta accacactat ttatatcaac aacctcaatg 180
+ agaagatcaa gaaggatgag ctaaaaaagt ccctgtacgc catcttctcc cagtttggcc 240
+ agatcctgga tatcctggta tcacggagcc tgaagatgag gggccaggcc tttgtcatct 300
+ tcaaggaggt cagcagcgcc accaacgccc tgcgctccat gcagggtttc cctttctatg 360
+ acaaacctat gcgtatccag tatgccaaga ccgactcaga tatcattgcc aagatgaaag 420
+ gcaccttcgt ggagcgggac cgcaagcggg agaagaggaa gcccaagagc caggagaccc 480
+ cggccaccaa gaaggctgtg caaggcgggg gagccacccc cgtggtgggg gctgtccagg 540
+ ggcctgtccc gggcatgccg ccgatgactc aggcgccccg cattatgcac cacatgccgg 600
+ gccagccgcc ctacatgccg ccccctggta tgatcccccc gccaggcctt gcacctggcc 660
+ agatcccacc aggggccatg cccccgcagc agcttatgcc aggacagatg ccccctgccc 720
+ agcctctttc tgagaatcca ccgaatcaca tcttgttcct caccaacctg ccagaggaga 780
+ ccaacgagct catgctgtcc atgcttttca atcagttccc tggcttcaag gaggtccgtc 840
+ tggtacccgg gcggcatgac atcgccttcg tggagtttga caatgaggta caggcagggg 900
+ cagctcgcga tgccctgcag ggctttaaga tcacgcagaa caacgccatg aagatctcct 960
+ ttgccaagaa gtagcacctt ttccccccat gcctgcccct tcccctgttc tggggccacc 1020
+ cctttccccc ttggctcagc cccctgaagg taagtccccc cttgggggcc ttcttggagc 1080
+ cgtgtgtgag tgagtggtcg ccacacagca ttgtacccag agtctgtccc cagacattgc 1140
+ acctggcgct gttaggccgg aattaaagtg gctttttgag gtttggtttt tcacaaaaaa 1200
+ aaggaattc 1209
+//
diff --git a/formats/fasta b/formats/fasta
new file mode 100644
index 0000000..208bc66
--- /dev/null
+++ b/formats/fasta
@@ -0,0 +1,13 @@
+>SNRPA_DROME U1 small nuclear ribonucleoprotein A (U1 snRNP protein A) (U1-A) (Sex determination protein snf).
+MEMLPNQTIYINNLNEKIKKEELKKSLYAIFSQFGQILDIVALKTLKMRG
+QAFVIFKEIGSASNALRTMQGFPFYDKPMQIAYSKSDSDIVAKIKGTFKE
+RPKKVKPPKPAPGTDEKKDKKKKPSSAENSNPNAQTEQPPNQILFLTNLP
+EETNEMMLSMLFNQFPGFKEVRLVPNRHDIAFVEFTTELQSNAAKEALQG
+FKITPTHAMKITFAKK
+>SNRPA_HUMAN U1 small nuclear ribonucleoprotein A (U1 snRNP protein A) (U1A protein) (U1-A).
+AVPETRPNHTIYINNLNEKIKKDELKKSLYAIFSQFGQILDILVSRSLKM
+RGQAFVIFKEVSSATNALRSMQGFPFYDKPMRIQYAKTDSDIIAKMKGTF
+VERDRKREKRKPKSQETPATKKAVQGGGATPVVGAVQGPVPGMPPMTQAP
+RIMHHMPGQPPYMPPPGMIPPPGLAPGQIPPGAMPPQQLMPGQMPPAQPL
+SENPPNHILFLTNLPEETNELMLSMLFNQFPGFKEVRLVPGRHDIAFVEF
+DNEVQAGAARDALQGFKITQNNAMKISFAKK
diff --git a/formats/fasta.2 b/formats/fasta.2
new file mode 100644
index 0000000..1df9a4e
--- /dev/null
+++ b/formats/fasta.2
@@ -0,0 +1,19 @@
+
+
+>SNRPA_DROME U1 small nuclear ribonucleoprotein A (U1 snRNP protein A) (U1-A) (Sex determination protein snf).
+MEMLPNQTIYINNLNEKIKKEELKKSLYAIFSQFGQILDIVALKTLKMRG
+QAFVIFKEIGSASNALRTMQGFPFYDKPMQIAYSKSDSDIVAKIKGTFKE
+RPKKVKPPKPAPGTDEKKDKKKKPSSAENSNPNAQTEQPPNQILFLTNLP
+EETNEMMLSMLFNQFPGFKEVRLVPNRHDIAFVEFTTELQSNAAKEALQG
+FKITPTHAMKITFAKK
+
+
+>SNRPA_HUMAN U1 small nuclear ribonucleoprotein A (U1 snRNP protein A) (U1A protein) (U1-A).
+AVPETRPNHTIYINNLNEKIKKDELKKSLYAIFSQFGQILDILVSRSLKM
+RGQAFVIFKEVSSATNALRSMQGFPFYDKPMRIQYAKTDSDIIAKMKGTF
+VERDRKREKRKPKSQETPATKKAVQGGGATPVVGAVQGPVPGMPPMTQAP
+RIMHHMPGQPPYMPPPGMIPPPGLAPGQIPPGAMPPQQLMPGQMPPAQPL
+SENPPNHILFLTNLPEETNELMLSMLFNQFPGFKEVRLVPGRHDIAFVEF
+DNEVQAGAARDALQGFKITQNNAMKISFAKK
+
+
diff --git a/formats/fasta.bad.1 b/formats/fasta.bad.1
new file mode 100644
index 0000000..31b18c1
--- /dev/null
+++ b/formats/fasta.bad.1
@@ -0,0 +1,2 @@
+>what happens with a bad character?
+ACGT1ACGT
diff --git a/formats/fasta.bad.2 b/formats/fasta.bad.2
new file mode 100644
index 0000000..3990c99
--- /dev/null
+++ b/formats/fasta.bad.2
@@ -0,0 +1 @@
+>truncated_nam
\ No newline at end of file
diff --git a/formats/fasta.bad.3 b/formats/fasta.bad.3
new file mode 100644
index 0000000..40846a2
--- /dev/null
+++ b/formats/fasta.bad.3
@@ -0,0 +1 @@
+>truncated in descripti
\ No newline at end of file
diff --git a/formats/fasta.odd.1 b/formats/fasta.odd.1
new file mode 100644
index 0000000..956cb58
--- /dev/null
+++ b/formats/fasta.odd.1
@@ -0,0 +1,2 @@
+>what happens with empty sequences?
+>we should accept them.
diff --git a/formats/genbank b/formats/genbank
new file mode 100644
index 0000000..c2358e2
--- /dev/null
+++ b/formats/genbank
@@ -0,0 +1,55 @@
+GBSMP.SEQ Genetic Sequence Data Bank
+ 15 December 1992
+
+ GenBank Flat File Release 74.0
+
+ Structural RNA Sequences
+
+ 2 loci, 236 bases, from 2 reported sequences
+
+LOCUS AAURRA 118 bp ss-rRNA RNA 16-JUN-1986
+DEFINITION A.auricula-judae (mushroom) 5S ribosomal RNA.
+ACCESSION K03160
+VERSION K03160.1 GI:173593
+KEYWORDS 5S ribosomal RNA; ribosomal RNA.
+SOURCE A.auricula-judae (mushroom) ribosomal RNA.
+ ORGANISM Auricularia auricula-judae
+ Eukaryota; Fungi; Eumycota; Basidiomycotina; Phragmobasidiomycetes;
+ Heterobasidiomycetidae; Auriculariales; Auriculariaceae.
+REFERENCE 1 (bases 1 to 118)
+ AUTHORS Huysmans,E., Dams,E., Vandenberghe,A. and De Wachter,R.
+ TITLE The nucleotide sequences of the 5S rRNAs of four mushrooms and
+ their use in studying the phylogenetic position of basidiomycetes
+ among the eukaryotes
+ JOURNAL Nucleic Acids Res. 11, 2871-2880 (1983)
+FEATURES Location/Qualifiers
+ rRNA 1..118
+ /note="5S ribosomal RNA"
+BASE COUNT 27 a 34 c 34 g 23 t
+ORIGIN 5' end of mature rRNA.
+ 1 atccacggcc ataggactct gaaagcactg catcccgtcc gatctgcaaa gttaaccaga
+ 61 gtaccgccca gttagtacca cggtggggga ccacgcggga atcctgggtg ctgtggtt
+//
+LOCUS ABCRRAA 118 bp ss-rRNA RNA 15-SEP-1990
+DEFINITION Acetobacter sp. (strain MB 58) 5S ribosomal RNA, complete sequence.
+ACCESSION M34766
+VERSION M34766.1 GI:173603
+KEYWORDS 5S ribosomal RNA.
+SOURCE Acetobacter sp. (strain MB 58) rRNA.
+ ORGANISM Acetobacter sp.
+ Prokaryotae; Gracilicutes; Scotobacteria; Aerobic rods and cocci;
+ Azotobacteraceae.
+REFERENCE 1 (bases 1 to 118)
+ AUTHORS Bulygina,E.S., Galchenko,V.F., Govorukhina,N.I., Netrusov,A.I.,
+ Nikitin,D.I., Trotsenko,Y.A. and Chumakov,K.M.
+ TITLE Taxonomic studies of methylotrophic bacteria by 5S ribosomal RNA
+ sequencing
+ JOURNAL J. Gen. Microbiol. 136, 441-446 (1990)
+FEATURES Location/Qualifiers
+ rRNA 1..118
+ /note="5S ribosomal RNA"
+BASE COUNT 27 a 40 c 32 g 17 t 2 others
+ORIGIN
+ 1 gatctggtgg ccatggcggg agcaaatcag ccgatcccat cccgaactcg gccgtcaaat
+ 61 gccccagcgc ccatgatact ctgcctcaag gcacggaaaa gtcggtcgcc gccagayy
+//
diff --git a/formats/genbank.2 b/formats/genbank.2
new file mode 100644
index 0000000..cada00c
--- /dev/null
+++ b/formats/genbank.2
@@ -0,0 +1,52 @@
+
+
+
+LOCUS AAURRA 118 bp ss-rRNA RNA 16-JUN-1986
+DEFINITION A.auricula-judae (mushroom) 5S ribosomal RNA.
+ACCESSION K03160
+VERSION K03160.1 GI:173593
+KEYWORDS 5S ribosomal RNA; ribosomal RNA.
+SOURCE A.auricula-judae (mushroom) ribosomal RNA.
+ ORGANISM Auricularia auricula-judae
+ Eukaryota; Fungi; Eumycota; Basidiomycotina; Phragmobasidiomycetes;
+ Heterobasidiomycetidae; Auriculariales; Auriculariaceae.
+REFERENCE 1 (bases 1 to 118)
+ AUTHORS Huysmans,E., Dams,E., Vandenberghe,A. and De Wachter,R.
+ TITLE The nucleotide sequences of the 5S rRNAs of four mushrooms and
+ their use in studying the phylogenetic position of basidiomycetes
+ among the eukaryotes
+ JOURNAL Nucleic Acids Res. 11, 2871-2880 (1983)
+FEATURES Location/Qualifiers
+ rRNA 1..118
+ /note="5S ribosomal RNA"
+BASE COUNT 27 a 34 c 34 g 23 t
+ORIGIN 5' end of mature rRNA.
+ 1 atccacggcc ataggactct gaaagcactg catcccgtcc gatctgcaaa gttaaccaga
+ 61 gtaccgccca gttagtacca cggtggggga ccacgcggga atcctgggtg ctgtggtt
+//
+LOCUS ABCRRAA 118 bp ss-rRNA RNA 15-SEP-1990
+DEFINITION Acetobacter sp. (strain MB 58) 5S ribosomal RNA, complete sequence.
+ACCESSION M34766
+VERSION M34766.1 GI:173603
+KEYWORDS 5S ribosomal RNA.
+SOURCE Acetobacter sp. (strain MB 58) rRNA.
+ ORGANISM Acetobacter sp.
+ Prokaryotae; Gracilicutes; Scotobacteria; Aerobic rods and cocci;
+ Azotobacteraceae.
+REFERENCE 1 (bases 1 to 118)
+ AUTHORS Bulygina,E.S., Galchenko,V.F., Govorukhina,N.I., Netrusov,A.I.,
+ Nikitin,D.I., Trotsenko,Y.A. and Chumakov,K.M.
+ TITLE Taxonomic studies of methylotrophic bacteria by 5S ribosomal RNA
+ sequencing
+ JOURNAL J. Gen. Microbiol. 136, 441-446 (1990)
+FEATURES Location/Qualifiers
+ rRNA 1..118
+ /note="5S ribosomal RNA"
+BASE COUNT 27 a 40 c 32 g 17 t 2 others
+ORIGIN
+ 1 gatctggtgg ccatggcggg agcaaatcag ccgatcccat cccgaactcg gccgtcaaat
+ 61 gccccagcgc ccatgatact ctgcctcaag gcacggaaaa gtcggtcgcc gccagayy
+//
+
+
+
diff --git a/formats/genbank.bad.1 b/formats/genbank.bad.1
new file mode 100644
index 0000000..614b962
--- /dev/null
+++ b/formats/genbank.bad.1
@@ -0,0 +1,55 @@
+GBSMP.SEQ Genetic Sequence Data Bank
+ 15 December 1992
+
+ GenBank Flat File Release 74.0
+
+ Structural RNA Sequences
+
+ 2 loci, 236 bases, from 2 reported sequences
+
+LOCUS AAURRA 118 bp ss-rRNA RNA 16-JUN-1986
+DEFINITION A.auricula-judae (mushroom) 5S ribosomal RNA.
+ACCESSION K03160
+VERSION K03160.1 GI:173593
+KEYWORDS 5S ribosomal RNA; ribosomal RNA.
+SOURCE A.auricula-judae (mushroom) ribosomal RNA.
+ ORGANISM Auricularia auricula-judae
+ Eukaryota; Fungi; Eumycota; Basidiomycotina; Phragmobasidiomycetes;
+ Heterobasidiomycetidae; Auriculariales; Auriculariaceae.
+REFERENCE 1 (bases 1 to 118)
+ AUTHORS Huysmans,E., Dams,E., Vandenberghe,A. and De Wachter,R.
+ TITLE The nucleotide sequences of the 5S rRNAs of four mushrooms and
+ their use in studying the phylogenetic position of basidiomycetes
+ among the eukaryotes
+ JOURNAL Nucleic Acids Res. 11, 2871-2880 (1983)
+FEATURES Location/Qualifiers
+ rRNA 1..118
+ /note="5S ribosomal RNA"
+BASE COUNT 27 a 34 c 34 g 23 t
+ORIGIN 5' end of mature rRNA.
+ 1 atccacggcc ataggactct gaaagcactg catcccgtcc gatctgcaaa gttaaccaga%
+ 61 gtaccgccca gttagtacca cggtggggga ccacgcggga atcctgggtg ctgtggtt
+//
+LOCUS ABCRRAA 118 bp ss-rRNA RNA 15-SEP-1990
+DEFINITION Acetobacter sp. (strain MB 58) 5S ribosomal RNA, complete sequence.
+ACCESSION M34766
+VERSION M34766.1 GI:173603
+KEYWORDS 5S ribosomal RNA.
+SOURCE Acetobacter sp. (strain MB 58) rRNA.
+ ORGANISM Acetobacter sp.
+ Prokaryotae; Gracilicutes; Scotobacteria; Aerobic rods and cocci;
+ Azotobacteraceae.
+REFERENCE 1 (bases 1 to 118)
+ AUTHORS Bulygina,E.S., Galchenko,V.F., Govorukhina,N.I., Netrusov,A.I.,
+ Nikitin,D.I., Trotsenko,Y.A. and Chumakov,K.M.
+ TITLE Taxonomic studies of methylotrophic bacteria by 5S ribosomal RNA
+ sequencing
+ JOURNAL J. Gen. Microbiol. 136, 441-446 (1990)
+FEATURES Location/Qualifiers
+ rRNA 1..118
+ /note="5S ribosomal RNA"
+BASE COUNT 27 a 40 c 32 g 17 t 2 others
+ORIGIN
+ 1 gatctggtgg ccatggcggg agcaaatcag ccgatcccat cccgaactcg gccgtcaaat
+ 61 gccccagcgc ccatgatact ctgcctcaag gcacggaaaa gtcggtcgcc gccagayy
+//
diff --git a/formats/stockholm.1 b/formats/stockholm.1
new file mode 100644
index 0000000..4083022
--- /dev/null
+++ b/formats/stockholm.1
@@ -0,0 +1,5 @@
+# STOCKHOLM 1.0
+
+seq1 GAATTC
+seq2 GAATTC
+//
diff --git a/formats/uniprot b/formats/uniprot
new file mode 100644
index 0000000..4c0d566
--- /dev/null
+++ b/formats/uniprot
@@ -0,0 +1,192 @@
+ID SNRPA_DROME Reviewed; 216 AA.
+AC P43332; Q9W4D7;
+DT 01-NOV-1995, integrated into UniProtKB/Swiss-Prot.
+DT 01-NOV-1995, sequence version 1.
+DT 15-DEC-2009, entry version 91.
+DE RecName: Full=U1 small nuclear ribonucleoprotein A;
+DE Short=U1 snRNP protein A;
+DE Short=U1-A;
+DE AltName: Full=Sex determination protein snf;
+GN Name=snf; Synonyms=D25, fs(1)1621, liz; ORFNames=CG4528;
+OS Drosophila melanogaster (Fruit fly).
+OC Eukaryota; Metazoa; Arthropoda; Hexapoda; Insecta; Pterygota;
+OC Neoptera; Endopterygota; Diptera; Brachycera; Muscomorpha;
+OC Ephydroidea; Drosophilidae; Drosophila; Sophophora.
+OX NCBI_TaxID=7227;
+RN [1]
+RP NUCLEOTIDE SEQUENCE [MRNA].
+RX MEDLINE=92350664; PubMed=1386424; DOI=10.1093/nar/20.14.3645;
+RA Harper D.S., Fresco L.D., Keene J.D.;
+RT "RNA binding specificity of a Drosophila snRNP protein that shares
+RT sequence homology with mammalian U1-A and U2-B' proteins.";
+RL Nucleic Acids Res. 20:3645-3650(1992).
+RN [2]
+RP NUCLEOTIDE SEQUENCE [GENOMIC DNA / MRNA].
+RC STRAIN=Oregon-R;
+RX MEDLINE=95011590; PubMed=7926776;
+RA Flickinger T.W., Salz H.K.;
+RT "The Drosophila sex determination gene snf encodes a nuclear protein
+RT with sequence and functional similarity to the mammalian U1A snRNP
+RT protein.";
+RL Genes Dev. 8:914-925(1994).
+RN [3]
+RP NUCLEOTIDE SEQUENCE [LARGE SCALE GENOMIC DNA].
+RC STRAIN=Berkeley;
+RX MEDLINE=20196006; PubMed=10731132; DOI=10.1126/science.287.5461.2185;
+RA Adams M.D., Celniker S.E., Holt R.A., Evans C.A., Gocayne J.D.,
+RA Amanatides P.G., Scherer S.E., Li P.W., Hoskins R.A., Galle R.F.,
+RA George R.A., Lewis S.E., Richards S., Ashburner M., Henderson S.N.,
+RA Sutton G.G., Wortman J.R., Yandell M.D., Zhang Q., Chen L.X.,
+RA Brandon R.C., Rogers Y.-H.C., Blazej R.G., Champe M., Pfeiffer B.D.,
+RA Wan K.H., Doyle C., Baxter E.G., Helt G., Nelson C.R., Miklos G.L.G.,
+RA Abril J.F., Agbayani A., An H.-J., Andrews-Pfannkoch C., Baldwin D.,
+RA Ballew R.M., Basu A., Baxendale J., Bayraktaroglu L., Beasley E.M.,
+RA Beeson K.Y., Benos P.V., Berman B.P., Bhandari D., Bolshakov S.,
+RA Borkova D., Botchan M.R., Bouck J., Brokstein P., Brottier P.,
+RA Burtis K.C., Busam D.A., Butler H., Cadieu E., Center A., Chandra I.,
+RA Cherry J.M., Cawley S., Dahlke C., Davenport L.B., Davies P.,
+RA de Pablos B., Delcher A., Deng Z., Mays A.D., Dew I., Dietz S.M.,
+RA Dodson K., Doup L.E., Downes M., Dugan-Rocha S., Dunkov B.C., Dunn P.,
+RA Durbin K.J., Evangelista C.C., Ferraz C., Ferriera S., Fleischmann W.,
+RA Fosler C., Gabrielian A.E., Garg N.S., Gelbart W.M., Glasser K.,
+RA Glodek A., Gong F., Gorrell J.H., Gu Z., Guan P., Harris M.,
+RA Harris N.L., Harvey D.A., Heiman T.J., Hernandez J.R., Houck J.,
+RA Hostin D., Houston K.A., Howland T.J., Wei M.-H., Ibegwam C.,
+RA Jalali M., Kalush F., Karpen G.H., Ke Z., Kennison J.A., Ketchum K.A.,
+RA Kimmel B.E., Kodira C.D., Kraft C.L., Kravitz S., Kulp D., Lai Z.,
+RA Lasko P., Lei Y., Levitsky A.A., Li J.H., Li Z., Liang Y., Lin X.,
+RA Liu X., Mattei B., McIntosh T.C., McLeod M.P., McPherson D.,
+RA Merkulov G., Milshina N.V., Mobarry C., Morris J., Moshrefi A.,
+RA Mount S.M., Moy M., Murphy B., Murphy L., Muzny D.M., Nelson D.L.,
+RA Nelson D.R., Nelson K.A., Nixon K., Nusskern D.R., Pacleb J.M.,
+RA Palazzolo M., Pittman G.S., Pan S., Pollard J., Puri V., Reese M.G.,
+RA Reinert K., Remington K., Saunders R.D.C., Scheeler F., Shen H.,
+RA Shue B.C., Siden-Kiamos I., Simpson M., Skupski M.P., Smith T.J.,
+RA Spier E., Spradling A.C., Stapleton M., Strong R., Sun E.,
+RA Svirskas R., Tector C., Turner R., Venter E., Wang A.H., Wang X.,
+RA Wang Z.-Y., Wassarman D.A., Weinstock G.M., Weissenbach J.,
+RA Williams S.M., Woodage T., Worley K.C., Wu D., Yang S., Yao Q.A.,
+RA Ye J., Yeh R.-F., Zaveri J.S., Zhan M., Zhang G., Zhao Q., Zheng L.,
+RA Zheng X.H., Zhong F.N., Zhong W., Zhou X., Zhu S.C., Zhu X.,
+RA Smith H.O., Gibbs R.A., Myers E.W., Rubin G.M., Venter J.C.;
+RT "The genome sequence of Drosophila melanogaster.";
+RL Science 287:2185-2195(2000).
+RN [4]
+RP GENOME REANNOTATION.
+RX MEDLINE=22426069; PubMed=12537572;
+RA Misra S., Crosby M.A., Mungall C.J., Matthews B.B., Campbell K.S.,
+RA Hradecky P., Huang Y., Kaminker J.S., Millburn G.H., Prochnik S.E.,
+RA Smith C.D., Tupy J.L., Whitfield E.J., Bayraktaroglu L., Berman B.P.,
+RA Bettencourt B.R., Celniker S.E., de Grey A.D.N.J., Drysdale R.A.,
+RA Harris N.L., Richter J., Russo S., Schroeder A.J., Shu S.Q.,
+RA Stapleton M., Yamada C., Ashburner M., Gelbart W.M., Rubin G.M.,
+RA Lewis S.E.;
+RT "Annotation of the Drosophila melanogaster euchromatic genome: a
+RT systematic review.";
+RL Genome Biol. 3:RESEARCH0083.1-RESEARCH0083.22(2002).
+RN [5]
+RP NUCLEOTIDE SEQUENCE [LARGE SCALE MRNA].
+RC STRAIN=Berkeley;
+RX MEDLINE=22426066; PubMed=12537569;
+RA Stapleton M., Carlson J.W., Brokstein P., Yu C., Champe M.,
+RA George R.A., Guarin H., Kronmiller B., Pacleb J.M., Park S., Wan K.H.,
+RA Rubin G.M., Celniker S.E.;
+RT "A Drosophila full-length cDNA resource.";
+RL Genome Biol. 3:RESEARCH0080.1-RESEARCH0080.8(2002).
+CC -!- FUNCTION: Binds stem loop II of U1 snRNA. It is the first snRNP to
+CC interact with pre-mRNA. This interaction is required for the
+CC subsequent binding of U2 snRNP and the U4/U6/U5 tri-snRNP (By
+CC similarity). Plays a role in regulating sex-lethal splicing.
+CC -!- SUBUNIT: Belongs to the spliceosome where it is associated with
+CC snRNP U1.
+CC -!- INTERACTION:
+CC Q9V3N8:CG4103; NbExp=1; IntAct=EBI-174177, EBI-131989;
+CC -!- SUBCELLULAR LOCATION: Nucleus.
+CC -!- SIMILARITY: Belongs to the RRM U1 A/B'' family.
+CC -!- SIMILARITY: Contains 2 RRM (RNA recognition motif) domains.
+CC -----------------------------------------------------------------------
+CC Copyrighted by the UniProt Consortium, see http://www.uniprot.org/terms
+CC Distributed under the Creative Commons Attribution-NoDerivs License
+CC -----------------------------------------------------------------------
+DR EMBL; M89775; AAA28441.1; -; mRNA.
+DR EMBL; L29521; AAA28903.1; -; Genomic_DNA.
+DR EMBL; AE014298; AAF46017.1; -; Genomic_DNA.
+DR EMBL; AY061491; AAL29039.1; -; mRNA.
+DR PIR; A54279; A54279.
+DR RefSeq; NP_511045.1; -.
+DR UniGene; Dm.2625; -.
+DR PDB; 2AYM; NMR; -; A=134-216.
+DR PDB; 2B0G; NMR; -; A=134-216.
+DR PDB; 2K3K; NMR; -; A=1-104.
+DR PDBsum; 2AYM; -.
+DR PDBsum; 2B0G; -.
+DR PDBsum; 2K3K; -.
+DR SMR; P43332; 1-104.
+DR DIP; DIP-23676N; -.
+DR IntAct; P43332; 3.
+DR STRING; P43332; -.
+DR PRIDE; P43332; -.
+DR Ensembl; FBtr0070748; FBpp0070716; FBgn0003449; Drosophila melanogaster.
+DR GeneID; 31442; -.
+DR KEGG; dme:Dmel_CG4528; -.
+DR NMPDR; fig|7227.3.peg.16553; -.
+DR CTD; 31442; -.
+DR FlyBase; FBgn0003449; snf.
+DR InParanoid; P43332; -.
+DR OMA; RSLHMIF; -.
+DR OrthoDB; EOG9NKC31; -.
+DR BioCyc; DMEL-XXX-02:DMEL-XXX-02-000654-MON; -.
+DR NextBio; 773664; -.
+DR Bgee; P43332; -.
+DR GermOnline; CG4528; Drosophila melanogaster.
+DR GO; GO:0043234; C:protein complex; IPI:FlyBase.
+DR GO; GO:0030532; C:small nuclear ribonucleoprotein complex; IDA:FlyBase.
+DR GO; GO:0005681; C:spliceosomal complex; IEA:UniProtKB-KW.
+DR GO; GO:0000166; F:nucleotide binding; IEA:InterPro.
+DR GO; GO:0005515; F:protein binding; IPI:IntAct.
+DR GO; GO:0003723; F:RNA binding; IEA:UniProtKB-KW.
+DR GO; GO:0019099; P:female germ-line sex determination; NAS:FlyBase.
+DR GO; GO:0006397; P:mRNA processing; IEA:UniProtKB-KW.
+DR GO; GO:0048477; P:oogenesis; IMP:FlyBase.
+DR GO; GO:0007539; P:primary sex determination, soma; NAS:FlyBase.
+DR GO; GO:0000381; P:regulation of alternative nuclear mRNA spli...; IMP:FlyBase.
+DR GO; GO:0008380; P:RNA splicing; TAS:FlyBase.
+DR InterPro; IPR012677; a_b_plait_nuc_bd.
+DR InterPro; IPR000504; RRM_RNP1.
+DR Gene3D; G3DSA:3.30.70.330; a_b_plait_nuc_bd; 2.
+DR Pfam; PF00076; RRM_1; 2.
+DR SMART; SM00360; RRM; 2.
+DR PROSITE; PS50102; RRM; 2.
+PE 1: Evidence at protein level;
+KW 3D-structure; Complete proteome; mRNA processing; mRNA splicing;
+KW Nucleus; Repeat; Ribonucleoprotein; RNA-binding; Spliceosome.
+FT CHAIN 1 216 U1 small nuclear ribonucleoprotein A.
+FT /FTId=PRO_0000081890.
+FT DOMAIN 7 86 RRM 1.
+FT DOMAIN 142 216 RRM 2.
+FT VARIANT 49 49 R -> H (in allele SNF1621; sterile).
+FT STRAND 7 11
+FT HELIX 20 30
+FT HELIX 31 34
+FT STRAND 37 41
+FT HELIX 46 48
+FT STRAND 52 58
+FT HELIX 59 69
+FT STRAND 73 78
+FT STRAND 81 87
+FT HELIX 88 95
+FT TURN 97 99
+FT STRAND 142 148
+FT HELIX 155 162
+FT STRAND 168 173
+FT TURN 175 177
+FT STRAND 179 186
+FT HELIX 188 198
+FT STRAND 201 204
+FT STRAND 208 213
+SQ SEQUENCE 216 AA; 24547 MW; 5B736FFE36523373 CRC64;
+ MEMLPNQTIY INNLNEKIKK EELKKSLYAI FSQFGQILDI VALKTLKMRG QAFVIFKEIG
+ SASNALRTMQ GFPFYDKPMQ IAYSKSDSDI VAKIKGTFKE RPKKVKPPKP APGTDEKKDK
+ KKKPSSAENS NPNAQTEQPP NQILFLTNLP EETNEMMLSM LFNQFPGFKE VRLVPNRHDI
+ AFVEFTTELQ SNAAKEALQG FKITPTHAMK ITFAKK
+//
diff --git a/formats/wag.dat b/formats/wag.dat
new file mode 100644
index 0000000..01e185e
--- /dev/null
+++ b/formats/wag.dat
@@ -0,0 +1,43 @@
+0.551571
+0.509848 0.635346
+0.738998 0.147304 5.429420
+1.027040 0.528191 0.265256 0.0302949
+0.908598 3.035500 1.543640 0.616783 0.0988179
+1.582850 0.439157 0.947198 6.174160 0.021352 5.469470
+1.416720 0.584665 1.125560 0.865584 0.306674 0.330052 0.567717
+0.316954 2.137150 3.956290 0.930676 0.248972 4.294110 0.570025 0.249410
+0.193335 0.186979 0.554236 0.039437 0.170135 0.113917 0.127395 0.0304501 0.138190
+0.397915 0.497671 0.131528 0.0848047 0.384287 0.869489 0.154263 0.0613037 0.499462 3.170970
+0.906265 5.351420 3.012010 0.479855 0.0740339 3.894900 2.584430 0.373558 0.890432 0.323832 0.257555
+0.893496 0.683162 0.198221 0.103754 0.390482 1.545260 0.315124 0.174100 0.404141 4.257460 4.854020 0.934276
+0.210494 0.102711 0.0961621 0.0467304 0.398020 0.0999208 0.0811339 0.049931 0.679371 1.059470 2.115170 0.088836 1.190630
+1.438550 0.679489 0.195081 0.423984 0.109404 0.933372 0.682355 0.243570 0.696198 0.0999288 0.415844 0.556896 0.171329 0.161444
+3.370790 1.224190 3.974230 1.071760 1.407660 1.028870 0.704939 1.341820 0.740169 0.319440 0.344739 0.967130 0.493905 0.545931 1.613280
+2.121110 0.554413 2.030060 0.374866 0.512984 0.857928 0.822765 0.225833 0.473307 1.458160 0.326622 1.386980 1.516120 0.171903 0.795384 4.378020
+0.113133 1.163920 0.0719167 0.129767 0.717070 0.215737 0.156557 0.336983 0.262569 0.212483 0.665309 0.137505 0.515706 1.529640 0.139405 0.523742 0.110864
+0.240735 0.381533 1.086000 0.325711 0.543833 0.227710 0.196303 0.103604 3.873440 0.420170 0.398618 0.133264 0.428437 6.454280 0.216046 0.786993 0.291148 2.485390
+2.006010 0.251849 0.196246 0.152335 1.002140 0.301281 0.588731 0.187247 0.118358 7.821300 1.800340 0.305434 2.058450 0.649892 0.314887 0.232739 1.388230 0.365369 0.314730
+
+0.0866279 0.043972 0.0390894 0.0570451 0.0193078 0.0367281 0.0580589 0.0832518 0.0244313 0.048466 0.086209 0.0620286 0.0195027 0.0384319 0.0457631 0.0695179 0.0610127 0.0143859 0.0352742 0.0708956
+
+
+ A R N D C Q E G H I L K M F P S T W Y V
+Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val
+
+
+ Symmetrical part of the WAG rate matrix and aa frequencies,
+estimated from 3905 globular protein amino acid sequences forming 182
+protein families.
+ The first part above indicates the symmetric 'exchangeability'
+parameters, where s_ij = s_ji. The s_ij above are not scaled, but the
+PAML package will perform this scaling.
+ The second part gives the amino acid frequencies (pi_i)
+estimated from the 3905 sequences. The net replacement rate from i to
+j is Q_ij = s_ij*pi_j.
+ Prepared by Simon Whelan and Nick Goldman, December 2000.
+
+Citation:
+Whelan, S. and N. Goldman. 2001. A general empirical model of
+ protein evolution derived from multiple protein families using
+ a maximum likelihood approach. Molecular Biology and
+ Evolution 18:691-699.
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..f5061e7
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,295 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2003-09-24.23
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=
+transform_arg=
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+
+usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
+ or: $0 -d DIR1 DIR2...
+
+In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
+In the second, create the directory path DIR.
+
+Options:
+-b=TRANSFORMBASENAME
+-c copy source (using $cpprog) instead of moving (using $mvprog).
+-d create directories instead of installing files.
+-g GROUP $chgrp installed files to GROUP.
+-m MODE $chmod installed files to MODE.
+-o USER $chown installed files to USER.
+-s strip installed files (using $stripprog).
+-t=TRANSFORM
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ -c) instcmd=$cpprog
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit 0;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit 0;;
+
+ *) if test -z "$src"; then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if test -z "$src"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+fi
+
+# Protect names starting with `-'.
+case $src in
+ -*) src=./$src ;;
+esac
+
+if test -n "$dir_arg"; then
+ dst=$src
+ src=
+
+ if test -d "$dst"; then
+ instcmd=:
+ chmodcmd=
+ else
+ instcmd=$mkdirprog
+ fi
+else
+ # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ dst=$dst/`basename "$src"`
+ fi
+fi
+
+# This sed command emulates the dirname command.
+dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+
+# Skip lots of stat calls in the usual case.
+if test ! -d "$dstdir"; then
+ defaultIFS='
+ '
+ IFS="${IFS-$defaultIFS}"
+
+ oIFS=$IFS
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+ IFS=$oIFS
+
+ pathcomp=
+
+ while test $# -ne 0 ; do
+ pathcomp=$pathcomp$1
+ shift
+ test -d "$pathcomp" || $mkdirprog "$pathcomp"
+ pathcomp=$pathcomp/
+ done
+fi
+
+if test -n "$dir_arg"; then
+ $doit $instcmd "$dst" \
+ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+else
+ # If we're going to rename the final executable, determine the name now.
+ if test -z "$transformarg"; then
+ dstfile=`basename "$dst"`
+ else
+ dstfile=`basename "$dst" $transformbasename \
+ | sed $transformarg`$transformbasename
+ fi
+
+ # don't allow the sed command to completely eliminate the filename.
+ test -z "$dstfile" && dstfile=`basename "$dst"`
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Move or copy the file name to the temp name
+ $doit $instcmd "$src" "$dsttmp" &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $instcmd $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+ # Now remove or move aside any old file at destination location. We
+ # try this two ways since rm can't unlink itself on some systems and
+ # the destination file might be busy for other reasons. In this case,
+ # the final cleanup might fail but the new file should still install
+ # successfully.
+ {
+ if test -f "$dstdir/$dstfile"; then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+ || {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+fi &&
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+ (exit 0); exit
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/interface_gsl.c b/interface_gsl.c
new file mode 100644
index 0000000..bda7c3a
--- /dev/null
+++ b/interface_gsl.c
@@ -0,0 +1,60 @@
+/* Easel's interfaces to the GNU Scientific Library
+ */
+#ifdef HAVE_LIBGSL
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include "easel/easel.h"
+#include "easel/dmatrix.h"
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_eigen.h>
+
+int
+esl_GSL_MatrixInversion(ESL_DMATRIX *A, ESL_DMATRIX **ret_Ai)
+{
+ ESL_DMATRIX *Ai; /* RETURN: A^{-1} */
+ gsl_matrix_view Av; /* gsl view of matrix A */
+ gsl_matrix *LU; /* LU decomposition of A */
+ gsl_matrix *Aiv; /* gsl version of A^{-1} */
+ gsl_permutation *permute;
+ int signum;
+ int i,j;
+
+ Ai = esl_dmx_Alloc(A->n, A->m);
+
+ /* Invert U to get Ui, using LU decomposition.
+ */
+ Av = gsl_matrix_view_array(A->mx[0], A->n, A->n);
+ LU = gsl_matrix_alloc(A->n, A->n);
+ Aiv = gsl_matrix_alloc(A->n, A->n); /* U^{-1}: inverse of U */
+ permute = gsl_permutation_alloc(A->n);
+ gsl_matrix_memcpy(LU, &Av.matrix);
+
+ if (gsl_linalg_LU_decomp(LU, permute, &signum) != 0) ESL_EXCEPTION(eslEUNKNOWN, "gsl failed");
+ if (gsl_linalg_LU_invert(LU, permute, Aiv) != 0) ESL_EXCEPTION(eslEUNKNOWN, "gsl failed");
+
+ gsl_matrix_free(LU);
+ gsl_permutation_free(permute);
+
+ /* recover the matrix from gsl.
+ */
+ for (i = 0; i < A->n; i++)
+ for (j = 0; j < A->n; j++)
+ Ai->mx[i][j] = gsl_matrix_get(Aiv, i, j);
+ gsl_matrix_free(Aiv);
+
+ ret->Ai = Ai;
+ return eslOK;
+}
+
+#endif /*HAVE_LIBGSL*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
diff --git a/interface_gsl.h b/interface_gsl.h
new file mode 100644
index 0000000..1cb68b2
--- /dev/null
+++ b/interface_gsl.h
@@ -0,0 +1,24 @@
+#ifdef HAVE_LIBGSL
+/* interface_gsl.h
+ * Easel's interfaces to the GNU Scientific Library
+ *
+ * SRE, Tue Jul 13 15:36:48 2004
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslINTERFACE_GSL_INCLUDED
+#define eslINTERFACE_GSL_INCLUDED
+
+#include <stdlib.h>
+#include <easel/easel.h>
+#include <easel/dmatrix.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_eigen.h>
+
+extern int esl_GSL_MatrixInversion(ESL_DMATRIX *A, ESL_DMATRIX **ret_Ai);
+
+
+#endif /*eslINTERFACE_GSL_INCLUDED*/
+#endif /*HAVE_LIBGSL*/
diff --git a/interface_lapack.c b/interface_lapack.c
new file mode 100644
index 0000000..5fad42f
--- /dev/null
+++ b/interface_lapack.c
@@ -0,0 +1,91 @@
+/* Interface with the LAPACK (Fortran77) numerical library.
+ */
+#ifdef HAVE_LIBLAPACK
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include "easel/easel.h"
+#include "easel/dmatrix.h"
+#include "easel/interface_lapack.h"
+
+/* A: nxn real matrix
+ * ret_Er: RETURN: vector of eigenvalues, real part, allocated 0..n-1
+ * ret_Ei: RETURN: vector of eigenvalues, imaginary part, allocated 0..n-1
+ * ret_VL: RETURN: left eigenvectors
+ * ret_VR: RETURN: right eigenvectors
+ */
+int
+esl_lapack_dgeev(ESL_DMATRIX *A, double **ret_Er, double **ret_Ei, ESL_DMATRIX **ret_VL, ESL_DMATRIX **ret_VR)
+{
+ double *Er = NULL;
+ double *Ei = NULL;
+ ESL_DMATRIX *VL = NULL;
+ ESL_DMATRIX *VR = NULL;
+ double *work = NULL;
+ char jobvl, jobvr;
+ int lda;
+ int ldvl, ldvr;
+ int lwork;
+ int info;
+ int status;
+
+ if ((VL = esl_dmatrix_Create(A->n,A->n)) == NULL) { status = eslEMEM; goto ERROR; }
+ if ((VR = esl_dmatrix_Create(A->n,A->n)) == NULL) { status = eslEMEM; goto ERROR; }
+ ESL_ALLOC(Er, sizeof(double) * A->n);
+ ESL_ALLOC(Ei, sizeof(double) * A->n);
+ ESL_ALLOC(work, sizeof(double) * 4 * A->n);
+
+ jobvl = (ret_VL == NULL) ? 'N' : 'V'; /* do we want left eigenvectors? */
+ jobvr = (ret_VR == NULL) ? 'N' : 'V'; /* do we want right eigenvectors? */
+ lda = A->n;
+ ldvl = A->n;
+ ldvr = A->n;
+ lwork = 4*A->n;
+
+ /* Fortran convention is colxrow, not rowxcol; so transpose
+ * A before passing it to a Fortran routine.
+ */
+ esl_dmx_Transpose(A);
+
+ /* The actual Fortran77 interface call to LAPACK.
+ * All args must be passed by reference.
+ * Fortran 2D arrays are 1D: so pass the A[0] part of a DSMX.
+ */
+ dgeev_(&jobvl, &jobvr, &(A->n), A->mx[0], &lda, Er, Ei, VL->mx[0], &ldvl, VR->mx[0], &ldvr, work, &lwork, &info);
+
+ /* Now, VL, VR are transposed (col x row), so transpose them back to
+ * C convention.
+ */
+ esl_dmx_Transpose(VL);
+ esl_dmx_Transpose(VR);
+
+ if (ret_VL != NULL) *ret_VL = VL; else esl_dmatrix_Destroy(VL);
+ if (ret_VR != NULL) *ret_VR = VR; else esl_dmatrix_Destroy(VR);
+ if (ret_Er != NULL) *ret_Er = Er; else free(Er);
+ if (ret_Ei != NULL) *ret_Ei = Ei; else free(Ei);
+ free(work);
+ return eslOK;
+
+ ERROR:
+ if (ret_VL != NULL) *ret_VL = NULL;
+ if (ret_VR != NULL) *ret_VR = NULL;
+ if (ret_Er != NULL) *ret_Er = NULL;
+ if (ret_Ei != NULL) *ret_Ei = NULL;
+ if (VL != NULL) free(VL);
+ if (VR != NULL) free(VR);
+ if (Er != NULL) free(Er);
+ if (Ei != NULL) free(Ei);
+ if (work != NULL) free(work);
+ return status;
+}
+
+
+#endif /*HAVE_LIBLAPACK*/
+
+/*****************************************************************
+ * @LICENSE@
+ *
+ * SVN $Id$
+ * SVN $URL$
+ *****************************************************************/
+
diff --git a/interface_lapack.h b/interface_lapack.h
new file mode 100644
index 0000000..152f34e
--- /dev/null
+++ b/interface_lapack.h
@@ -0,0 +1,24 @@
+#ifdef HAVE_LIBLAPACK
+/* interface_lapack.h
+ *
+ * SRE, Tue Jul 13 15:11:51 2004 [St. Louis]
+ * SVN $Id$
+ * SVN $URL$
+ */
+#ifndef eslINTERFACE_LAPACK_INCLUDED
+#define eslINTERFACE_LAPACK_INCLUDED
+
+/* This is the C interface to the Fortran77 dgeev routine,
+ * provided by the LAPACK library:
+ */
+extern void dgeev_(char *jobvl, char *jobvr, int *n, double *a,
+ int *lda, double *wr, double *wi, double *vl,
+ int *ldvl, double *vr, int *ldvr,
+ double *work, int *lwork, int *info);
+
+/* and this is our C interface to the lapack call:
+ */
+extern int esl_lapack_dgeev(ESL_DMATRIX *A, double **ret_Er, double **ret_Ei, ESL_DMATRIX **ret_VL, ESL_DMATRIX **ret_VR);
+
+#endif /*eslINTERFACE_LAPACK_INCLUDED*/
+#endif /*HAVE_LIBLAPACK*/
diff --git a/makeTAGS.sh b/makeTAGS.sh
new file mode 100755
index 0000000..e9e03b0
--- /dev/null
+++ b/makeTAGS.sh
@@ -0,0 +1,15 @@
+#! /bin/sh
+etags configure.ac
+etags -a INSTALL
+etags -a LICENSE
+
+
+# Recursively add all .c, .h, .pl, *.tex, *.man
+find . -name "*.c" -print -or -name "*.h" -print | xargs etags -a
+find . -name "*.pl" -print -or -name "*.pm" -print | xargs etags -a
+find . -name "*.sh" -print | xargs etags -a
+find . -name "*.tex" -print | xargs etags -a
+find . -name "*.man" -print | xargs etags -a
+find . -name "*.in" -print | xargs etags -a
+find . -name "*.sqc" -print | xargs etags -a
+find . -name "*README" -print | xargs etags -a
diff --git a/miniapps/Makefile.in b/miniapps/Makefile.in
new file mode 100644
index 0000000..071b2ec
--- /dev/null
+++ b/miniapps/Makefile.in
@@ -0,0 +1,152 @@
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+SHELL = /bin/sh
+
+# Package information
+#
+PACKAGE = @PACKAGE_NAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+BASENAME = @PACKAGE_TARNAME@
+RELEASE = @EASEL_VERSION@
+RELEASEDATE = "@EASEL_DATE@"
+COPYRIGHT = "@EASEL_COPYRIGHT@"
+LICENSELINE = "@EASEL_LICENSE@"
+
+## Installation targets
+#
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+mandir = @mandir@
+docdir = @docdir@
+pdfdir = @pdfdir@
+mandir = @mandir@
+man1dir = ${mandir}/man1
+man1ext = .1
+
+INSTALL = @INSTALL@
+
+## your compiler and compiler flags.
+#
+CC = @CC@
+CFLAGS = @CFLAGS@ @PTHREAD_CFLAGS@ @PIC_FLAGS@
+SIMDFLAGS = @SIMD_CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+DEFS = @DEFS@
+LIBS = -leasel @LIBGSL@ @LIBS@ @PTHREAD_LIBS@ -lm
+
+## list of the miniapps to compile.
+#
+PROGS = esl-afetch\
+ esl-alimanip\
+ esl-alimap\
+ esl-alimask\
+ esl-alimerge\
+ esl-alipid\
+ esl-alirev\
+ esl-alistat\
+ esl-cluster\
+ esl-compalign\
+ esl-compstruct\
+ esl-construct\
+ esl-histplot\
+ esl-mask\
+ esl-reformat\
+ esl-selectn\
+ esl-seqrange\
+ esl-seqstat\
+ esl-sfetch\
+ esl-shuffle\
+ esl-ssdraw\
+ esl-translate\
+ esl-weight
+
+PROGOBJS =\
+ esl-afetch.o\
+ esl-alimanip.o\
+ esl-alimap.o\
+ esl-alimask.o\
+ esl-alimerge.o\
+ esl-alipid.o\
+ esl-alirev.o\
+ esl-alistat.o\
+ esl-cluster.o\
+ esl-compalign.o\
+ esl-compstruct.o\
+ esl-construct.o\
+ esl-histplot.o\
+ esl-mask.o\
+ esl-reformat.o\
+ esl-selectn.o\
+ esl-seqrange.o\
+ esl-seqstat.o\
+ esl-sfetch.o\
+ esl-shuffle.o\
+ esl-ssdraw.o\
+ esl-translate.o\
+ esl-weight.o
+
+
+# beautification magic stolen from git
+#
+QUIET_SUBDIR0 = +${MAKE} -C #space separator after -c
+QUIET_SUBDIR1 =
+ifndef V
+ QUIET_CC = @echo ' ' CC $@;
+ QUIET_GEN = @echo ' ' GEN $@;
+ QUIET_AR = @echo ' ' AR $@;
+ QUIET_SUBDIR0 = + at subdir=
+ QUIET_SUBDIR1 = ; echo ' ' SUBDIR $$subdir; \
+ ${MAKE} -C $$subdir
+endif
+
+
+.PHONY: all dev tests check install uninstall clean distclean
+
+all: ${PROGS}
+dev: ${PROGS}
+tests: ${PROGS}
+check: ${PROGS}
+
+${PROGS}: @EXEC_DEPENDENCY@ ../libeasel.a
+ ${QUIET_GEN}${CC} ${CFLAGS} ${SIMDFLAGS} ${DEFS} ${LDFLAGS} -L.. -o $@ $@.o ${LIBS}
+
+${PROGOBJS}: ../libeasel.a
+
+.c.o: ../libeasel.a
+ ${QUIET_CC}${CC} ${CFLAGS} ${SIMDFLAGS} ${DEFS} -I. -I.. -I${srcdir} -I${srcdir}/.. -o $@ -c $<
+
+install:
+ for file in ${PROGS}; do \
+ ${INSTALL} -m 0755 $$file ${DESTDIR}${bindir}/ ;\
+ done
+
+uninstall:
+ for file in $(PROGS); do \
+ rm ${DESTDIR}${bindir}/$$file ;\
+ done
+
+clean:
+ -rm -f ${PROGS}
+ -rm -f *.o *~
+ -rm -f *.gcno *.gcda *.gcov
+ -rm -f TAGS
+ for prog in ${PROGS}; do\
+ if test -d $$prog.dSYM; then rm -rf $$prog.dSYM; fi;\
+ done
+
+
+distclean: clean
+ -rm -f ${PROGS}
+ -rm Makefile
+
+
+################################################################
+# @LICENSE@
+################################################################
diff --git a/miniapps/esl-afetch.c b/miniapps/esl-afetch.c
new file mode 100644
index 0000000..6059c06
--- /dev/null
+++ b/miniapps/esl-afetch.c
@@ -0,0 +1,373 @@
+/* Fetch an MSA from a multi-MSA database (such as Pfam or Rfam).
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_fileparser.h"
+#include "esl_keyhash.h"
+#include "esl_mem.h"
+#include "esl_ssi.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+
+
+static char banner[] = "retrieve multiple sequence alignment(s) from a file";
+static char usage1[] = "[options] <msafile> <name> (retrieves one alignment named <name>)";
+static char usage2[] = "[options] -f <msafile> <namefile> (retrieves all alignments named in <namefile>)";
+static char usage3[] = "[options] --index <msafile> (indexes <msafile>)";
+
+static void
+cmdline_failure(char *argv0, char *format, ...)
+{
+ va_list argp;
+
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ esl_usage(stdout, argv0, usage1);
+ esl_usage(stdout, argv0, usage2);
+ esl_usage(stdout, argv0, usage3);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv0);
+ exit(1);
+}
+
+static void
+cmdline_help(char *argv0, ESL_GETOPTS *go)
+{
+ esl_banner(stdout, argv0, banner);
+ esl_usage (stdout, argv0, usage1);
+ esl_usage (stdout, argv0, usage2);
+ esl_usage (stdout, argv0, usage3);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80);
+ exit(0);
+}
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; show brief info on version and usage", 0 },
+ { "-f", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL,"--index", "second cmdline arg is a file of names to retrieve", 0 },
+ { "-o", eslARG_OUTFILE, FALSE, NULL, NULL, NULL, NULL,"-O,--index", "output alignments to file <f> instead of stdout", 0 },
+ { "-O", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL,"-o,-f,--index","output alignment to file named <key>", 0 },
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "specify that <msafile> is in format <s>", 0 },
+ { "--outformat",eslARG_STRING,"Stockholm", NULL, NULL, NULL, NULL, "--index", "output fetched alignment(s) in format <s>", 0 },
+ { "--index", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "index the <msafile>, creating <msafile>.ssi", 0 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+static void create_ssi_index(ESL_GETOPTS *go, ESL_MSAFILE *afp);
+static void multifetch(ESL_GETOPTS *go, FILE *ofp, int outfmt, char *keyfile, ESL_MSAFILE *afp);
+static void onefetch (ESL_GETOPTS *go, FILE *ofp, int outfmt, char *key, ESL_MSAFILE *afp);
+static void regurgitate_one_stockholm_entry(FILE *ofp, ESL_MSAFILE *afp);
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ char *alifile = NULL; /* alignment file name */
+ int infmt = eslMSAFILE_UNKNOWN; /* format code for alifile */
+ int outfmt = eslMSAFILE_UNKNOWN; /* output format for fetched msa's */
+ ESL_MSAFILE *afp = NULL; /* open alignment file */
+ FILE *ofp = NULL; /* output stream for alignments */
+ int status; /* easel return code */
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) cmdline_failure(argv[0], "Failed to parse command line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) cmdline_failure(argv[0], "Error in configuration: %s\n", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") ) cmdline_help (argv[0], go);
+ if (esl_opt_ArgNumber(go) < 1) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+
+ if (esl_opt_IsOn(go, "--informat")) {
+ infmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--informat"));
+ if (infmt == eslMSAFILE_UNKNOWN) esl_fatal("%s is not a valid input alignment file format for --informat", esl_opt_GetString(go, "--informat"));
+ }
+
+ outfmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--outformat"));
+ if (outfmt == eslMSAFILE_UNKNOWN) esl_fatal("%s is not a valid output alignment file format for --outformat", esl_opt_GetString(go, "--outformat"));
+
+ alifile = esl_opt_GetArg(go, 1);
+
+ /* Open the alignment file. */
+ if ( (status = esl_msafile_Open(NULL, alifile, NULL, infmt, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+ /* Open the SSI index, if any */
+ if (! esl_opt_GetBoolean(go, "--index"))
+ {
+ if (afp->bf->mode_is == eslBUFFER_FILE ||
+ afp->bf->mode_is == eslBUFFER_ALLFILE ||
+ afp->bf->mode_is == eslBUFFER_MMAP)
+ {
+ char *ssifile = NULL;
+ esl_sprintf(&ssifile, "%s.ssi", afp->bf->filename);
+
+ status = esl_ssi_Open(ssifile, &(afp->ssi));
+ if (status == eslERANGE ) esl_fatal("SSI index %s has 64-bit offsets; this system doesn't support them", ssifile);
+ else if (status == eslEFORMAT) esl_fatal("SSI index %s has an unrecognized format. Try recreating, w/ esl-afetch --index", ssifile);
+ else if (status == eslENOTFOUND) afp->ssi = NULL;
+ else if (status != eslOK) esl_fatal("SSI index %s: open failed, error code %d\n", ssifile, status);
+
+ free(ssifile);
+ }
+ }
+
+ /* Open the output file, if any
+ */
+ if (esl_opt_GetBoolean(go, "-O"))
+ {
+ if ((ofp = fopen(esl_opt_GetArg(go, 2), "w")) == NULL)
+ esl_fatal("Failed to open output file %s\n", esl_opt_GetArg(go, 2));
+ }
+ else if (esl_opt_GetString(go, "-o") != NULL)
+ {
+ if ((ofp = fopen(esl_opt_GetString(go, "-o"), "w")) == NULL)
+ esl_fatal("Failed to open output file %s\n", esl_opt_GetString(go, "-o"));
+ }
+ else ofp = stdout;
+
+ /* Hand off control flow as appropriate */
+ if (esl_opt_GetBoolean(go, "--index"))
+ {
+ if (esl_opt_ArgNumber(go) != 1) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+ create_ssi_index(go, afp);
+ }
+ else if (esl_opt_GetBoolean(go, "-f"))
+ {
+ if (esl_opt_ArgNumber(go) != 2) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+ multifetch(go, ofp, outfmt, esl_opt_GetArg(go, 2), afp);
+ }
+ else
+ {
+ if (esl_opt_ArgNumber(go) != 2) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+ onefetch(go, ofp, outfmt, esl_opt_GetArg(go, 2), afp);
+ if (ofp != stdout) printf("\n\nRetrieved alignment %s.\n", esl_opt_GetArg(go, 2));
+ }
+
+ esl_msafile_Close(afp);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+
+
+/* Create an SSI index file for open MSA file <afp>.
+ * Both name and accession of MSAs are stored as keys.
+ */
+static void
+create_ssi_index(ESL_GETOPTS *go, ESL_MSAFILE *afp)
+{
+ ESL_NEWSSI *ns = NULL;
+ ESL_MSA *msa = NULL;
+ int nali = 0;
+ char *ssifile = NULL;
+ uint16_t fh;
+ int status;
+
+ if (afp->bf->mode_is != eslBUFFER_FILE &&
+ afp->bf->mode_is != eslBUFFER_ALLFILE &&
+ afp->bf->mode_is != eslBUFFER_MMAP)
+ esl_fatal("<msafile> must be a regular file to be SSI indexed");
+
+ esl_sprintf(&ssifile, "%s.ssi", afp->bf->filename);
+
+ status = esl_newssi_Open(ssifile, FALSE, &ns);
+ if (status == eslENOTFOUND) esl_fatal("failed to open SSI index %s", ssifile);
+ else if (status == eslEOVERWRITE) esl_fatal("SSI index %s already exists; delete or rename it", ssifile);
+ else if (status != eslOK) esl_fatal("failed to create a new SSI index");
+
+ if (esl_newssi_AddFile(ns, afp->bf->filename, afp->format, &fh) != eslOK)
+ esl_fatal("Failed to add MSA file %s to new SSI index\n", afp->bf->filename);
+
+ printf("Working... ");
+ fflush(stdout);
+
+ while ((status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+
+ nali++;
+
+ if (! msa->name)
+ esl_fatal("Every alignment in file must have a name to be indexed. Failed to find name of alignment #%d\n", nali);
+
+ if (esl_newssi_AddKey(ns, msa->name, fh, msa->offset, 0, 0) != eslOK)
+ esl_fatal("Failed to add key %s to SSI index", msa->name);
+
+ if (msa->acc && esl_newssi_AddAlias(ns, msa->acc, msa->name) != eslOK)
+ esl_fatal("Failed to add secondary key %s to SSI index", msa->acc);
+
+ esl_msa_Destroy(msa);
+ }
+
+ if (esl_newssi_Write(ns) != eslOK)
+ esl_fatal("Failed to write keys to ssi file %s\n", ssifile);
+
+ printf("done.\n");
+
+ if (ns->nsecondary) printf("Indexed %d alignments (%ld names and %ld accessions).\n", nali, (long) ns->nprimary, (long) ns->nsecondary);
+ else printf("Indexed %d alignments (%ld names).\n", nali, (long) ns->nprimary);
+ printf("SSI index written to file %s\n", ssifile);
+
+ free(ssifile);
+ esl_newssi_Close(ns);
+ return;
+}
+
+/* multifetch:
+ * given a file containing lines with one name or key per line;
+ * parse the file line-by-line;
+ * if we have an SSI index available, retrieve the MSAs by key
+ * as we see each line;
+ * else, without an SSI index, store the keys in a hash, then
+ * read the entire MSA file in a single pass, outputting MSAs
+ * that are in our keylist.
+ *
+ * Note that with an SSI index, you get the MSAs in the order they
+ * appear in the <keyfile>, but without an SSI index, you get MSAs in
+ * the order they occur in the MSA file.
+ */
+static void
+multifetch(ESL_GETOPTS *go, FILE *ofp, int outfmt, char *keyfile, ESL_MSAFILE *afp)
+{
+ ESL_KEYHASH *keys = esl_keyhash_Create();
+ ESL_FILEPARSER *efp = NULL;
+ ESL_MSA *msa = NULL;
+ int nali = 0;
+ char *key;
+ int keylen;
+ int keyidx;
+ int status;
+
+ if (esl_fileparser_Open(keyfile, NULL, &efp) != eslOK)
+ esl_fatal("Failed to open key file %s\n", keyfile);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ while (esl_fileparser_NextLine(efp) == eslOK)
+ {
+ if (esl_fileparser_GetTokenOnLine(efp, &key, &keylen) != eslOK)
+ esl_fatal("Failed to read MSA name on line %d of file %s\n", efp->linenumber, keyfile);
+
+ status = esl_keyhash_Store(keys, key, keylen, &keyidx);
+ if (status == eslEDUP) esl_fatal("MSA key %s occurs more than once in file %s\n", key, keyfile);
+
+ if (afp->ssi) { onefetch(go, ofp, outfmt, key, afp); nali++; }
+
+ }
+
+ if (! afp->ssi)
+ {
+ while ((status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+ nali++;
+
+ if (msa->name == NULL)
+ esl_fatal("Every alignment in file must have a name to be retrievable. Failed to find name of alignment #%d\n", nali);
+
+ if ( (esl_keyhash_Lookup(keys, msa->name, -1, NULL) == eslOK) ||
+ (msa->acc != NULL && esl_keyhash_Lookup(keys, msa->acc, -1, NULL) == eslOK))
+ esl_msafile_Write(ofp, msa, outfmt);
+
+ esl_msa_Destroy(msa);
+ }
+ }
+
+ if (ofp != stdout) printf("\nRetrieved %d alignments.\n", nali);
+ esl_keyhash_Destroy(keys);
+ esl_fileparser_Close(efp);
+ return;
+}
+
+
+/* onefetch():
+ * Given one <key> (an MSA name or accession), retrieve the corresponding MSA.
+ * In SSI mode, we can do this quickly by positioning the file, then regurgitating
+ * every line until the end-of-alignment marker; we don't even have to parse.
+ * Without an SSI index, we have to parse the MSAs sequentially 'til we find
+ * the one we're after.
+ */
+static void
+onefetch(ESL_GETOPTS *go, FILE *ofp, int outfmt, char *key, ESL_MSAFILE *afp)
+{
+ ESL_MSA *msa = NULL;
+ int nali = 1;
+ int status;
+
+ if (afp->ssi)
+ {
+ status = esl_msafile_PositionByKey(afp, key);
+ if (status == eslENOTFOUND) esl_fatal("MSA %s not found in SSI index for file %s\n", key, afp->bf->filename);
+ else if (status == eslEFORMAT) esl_fatal("Failed to parse SSI index for %s\n", afp->bf->filename);
+ else if (status != eslOK) esl_fatal("Failed to look up location of MSA %s in SSI index of file %s\n", key, afp->bf->filename);
+
+ if ( (afp->format == eslMSAFILE_STOCKHOLM && outfmt == eslMSAFILE_STOCKHOLM) ||
+ (afp->format == eslMSAFILE_PFAM && outfmt == eslMSAFILE_PFAM))
+ {
+ regurgitate_one_stockholm_entry(ofp, afp);
+ }
+ else
+ {
+ if ((status = esl_msafile_Read(afp, &msa)) != eslOK)
+ esl_msafile_ReadFailure(afp, status);
+
+ esl_msafile_Write(ofp, msa, outfmt);
+ esl_msa_Destroy(msa);
+ }
+ }
+ else
+ { /* without an index, we have to brute-force search the file */
+ while ((status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+ if (! msa->name)
+ esl_fatal("Every alignment in file must have a name to be retrievable. Failed to find name of alignment #%d\n", nali);
+
+ if (strcmp(key, msa->name) == 0 || (msa->acc != NULL && strcmp(key, msa->acc) == 0))
+ break;
+
+ nali++;
+ esl_msa_Destroy(msa);
+ }
+
+ if (! msa) esl_fatal("Failed to find alignment %s\n", key);
+
+ esl_msafile_Write(ofp, msa, outfmt);
+ esl_msa_Destroy(msa);
+ }
+}
+
+
+/* regurgitate_one_stockholm_entry()
+ * Read and output an alignment line-by-line without parsing it, stopping when
+ * we reach the end-of-alignment marker.
+ */
+static void
+regurgitate_one_stockholm_entry(FILE *ofp, ESL_MSAFILE *afp)
+{
+ char *p;
+ esl_pos_t n;
+ int status;
+
+ while ( (status = esl_msafile_GetLine(afp, &p, &n)) == eslOK)
+ {
+ fwrite(p, sizeof(char), n, ofp);
+ fputs("\n", ofp);
+ if (esl_memstrpfx(p, n, "//")) break;
+ }
+ if (status == eslEOF) esl_fatal("Reached end of file before finding // termination line for alignment");
+ else if (status != eslOK) esl_fatal("Failure in reading alignment line by line");
+}
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/miniapps/esl-afetch.itest.pl b/miniapps/esl-afetch.itest.pl
new file mode 100755
index 0000000..18c536f
--- /dev/null
+++ b/miniapps/esl-afetch.itest.pl
@@ -0,0 +1,147 @@
+#! /usr/bin/perl
+
+# Testing the esl-afetch miniapp
+#
+# Usage: ./esl-afetch.itest.pl <esl-afetch binary> <tmpfile prefix>
+# Example: ./esl-afetch.itest.pl ./esl-afetch foo
+#
+# SRE, Fri Nov 11 09:16:49 2011
+# SVN $Id$
+
+$esl_afetch = shift;
+$tmppfx = shift;
+
+if (! -x "$esl_afetch") { die "FAIL: didn't find esl-afetch binary $esl_afetch"; }
+
+# Existence of a previous .ssi index will screw up this test.
+if ( -e "$tmppfx.sto.ssi") { unlink "$tmppfx.sto.ssi"; }
+
+open(TESTALI, ">$tmppfx.sto") || die "FAIL: couldn't open $tmppfx.sto for writing test ali file";
+print TESTALI << "EOF";
+# STOCKHOLM 1.0
+#=GF ID foo
+#=GF AC XX00001.1
+seq1 AAAAAAAAAACCCCCCCCCC
+seq2 AAAAAAAAAACCCCCCCCCC
+//
+# STOCKHOLM 1.0
+#=GF ID bar
+#=GF AC XX00002.2
+seq3 DDDDDDDDDDEEEEEEEEEE
+seq4 DDDDDDDDDDEEEEEEEEEE
+//
+# STOCKHOLM 1.0
+#=GF ID $tmppfx.name
+seq3 XXXXXXXXXXXXXXXXXXXX
+seq4 XXXXXXXXXXXXXXXXXXXX
+//
+# STOCKHOLM 1.0
+#=GF ID baz
+#=GF AC XX00003.3
+seq5 FFFFFFFFFFGGGGGGGGGG
+seq6 FFFFFFFFFFGGGGGGGGGG
+//
+EOF
+close TESTFILE;
+
+
+open(TESTLIST, ">$tmppfx.list") || die "FAIL: couldn't open $tmppfx.list for writing test name list";
+print TESTLIST << "EOF";
+baz
+foo
+EOF
+close TESTLIST;
+
+
+
+
+# First, test without an SSI index...
+#
+ at output = `$esl_afetch $tmppfx.sto baz`;
+if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+if ($output[1] !~ /^#=GF ID baz$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($output[6] !~ /^\/\/$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($#output != 6) { die "FAIL: esl-afetch fetched incorrectly"; }
+
+ at output = `$esl_afetch $tmppfx.sto XX00003.3`;
+if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+if ($output[1] !~ /^#=GF ID baz$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($output[6] !~ /^\/\/$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($#output != 6) { die "FAIL: esl-afetch fetched incorrectly"; }
+
+# Without SSI, when fetching from a list, MSAs are in order of .sto file, not .list file
+ at output = `$esl_afetch -f $tmppfx.sto $tmppfx.list`;
+if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+if ($output[1] !~ /^#=GF ID foo$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($output[8] !~ /^#=GF ID baz$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($#output != 13) { die "FAIL: esl-afetch fetched incorrectly"; }
+
+ at output = `$esl_afetch -O $tmppfx.sto $tmppfx.name`; if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+ at output = `$esl_afetch $tmppfx.sto $tmppfx.name > $tmppfx.tmp`; if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+system "diff $tmppfx.name $tmppfx.tmp > /dev/null 2>&1"; if ($? != 0) { die "FAIL: esl-afetch bad diff"; }
+
+ at output = `$esl_afetch -f -o $tmppfx.tmp $tmppfx.sto $tmppfx.list`; if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+ at output = `$esl_afetch -f $tmppfx.sto $tmppfx.list > $tmppfx.tmp2`; if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+system "diff $tmppfx.tmp $tmppfx.tmp2 > /dev/null 2>&1"; if ($? != 0) { die "FAIL: esl-afetch bad diff"; }
+
+ at output = `$esl_afetch --informat stockholm $tmppfx.sto baz`;
+if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+
+ at output = `$esl_afetch --outformat clustal $tmppfx.sto XX00003.3`;
+if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+if ($output[0] !~ /^CLUSTAL/) { die "FAIL: esl-afetch fetched incorrectly"; }
+
+
+# Now index it
+#
+ at output = `$esl_afetch --index $tmppfx.sto`;
+if ($? != 0) { die "FAIL: esl-afetch indexing failed, returned nonzero"; }
+
+# Now repeat the tests. They'll use the SSI index now.
+# We have a couple of ways to tell that the SSI index is being used.
+# One is that with SSI and -f, MSAs come in order of list file, not sto file.
+# Another is that with SSI, the alignment is fetched verbatim (line spacing the same),
+# so the test alignments are fetched with no blank line between #=GF AC line and first seq.
+ at output = `$esl_afetch $tmppfx.sto baz`;
+if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+if ($output[1] !~ /^#=GF ID baz$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($output[5] !~ /^\/\/$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($#output != 5) { die "FAIL: esl-afetch fetched incorrectly"; }
+
+ at output = `$esl_afetch $tmppfx.sto XX00003.3`;
+if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+if ($output[1] !~ /^#=GF ID baz$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($output[5] !~ /^\/\/$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($#output != 5) { die "FAIL: esl-afetch fetched incorrectly"; }
+
+# With SSI, when fetching from a list, MSAs are in order of .list file, not .sto file
+ at output = `$esl_afetch -f $tmppfx.sto $tmppfx.list`;
+if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+if ($output[1] !~ /^#=GF ID baz$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($output[7] !~ /^#=GF ID foo$/) { die "FAIL: esl-afetch fetched incorrectly"; }
+if ($#output != 11) { die "FAIL: esl-afetch fetched incorrectly"; }
+
+ at output = `$esl_afetch -O $tmppfx.sto $tmppfx.name`; if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+ at output = `$esl_afetch $tmppfx.sto $tmppfx.name > $tmppfx.tmp`; if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+system "diff $tmppfx.name $tmppfx.tmp > /dev/null 2>&1"; if ($? != 0) { die "FAIL: esl-afetch bad diff"; }
+
+ at output = `$esl_afetch -f -o $tmppfx.tmp $tmppfx.sto $tmppfx.list`; if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+ at output = `$esl_afetch -f $tmppfx.sto $tmppfx.list > $tmppfx.tmp2`; if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+system "diff $tmppfx.tmp $tmppfx.tmp2 > /dev/null 2>&1"; if ($? != 0) { die "FAIL: esl-afetch bad diff"; }
+
+ at output = `$esl_afetch --informat stockholm $tmppfx.sto baz`;
+if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+
+ at output = `$esl_afetch --outformat clustal $tmppfx.sto XX00003.3`;
+if ($? != 0) { die "FAIL: esl-afetch failed, returned nonzero"; }
+if ($output[0] !~ /^CLUSTAL/) { die "FAIL: esl-afetch fetched incorrectly"; }
+
+
+print "ok\n";
+unlink "$tmppfx.sto";
+unlink "$tmppfx.sto.ssi";
+unlink "$tmppfx.tmp";
+unlink "$tmppfx.tmp2";
+unlink "$tmppfx.name";
+unlink "$tmppfx.list";
+exit 0;
diff --git a/miniapps/esl-afetch.man b/miniapps/esl-afetch.man
new file mode 100644
index 0000000..69ae8a3
--- /dev/null
+++ b/miniapps/esl-afetch.man
@@ -0,0 +1,128 @@
+.TH "esl-afetch" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-afetch - retrieve alignments from a multi-MSA database
+
+.SH SYNOPSIS
+
+.TP
+Single MSA retrieval:
+.B esl-afetch
+.I [options]
+.I msafile
+.I key
+
+.TP
+Multiple MSA retrieval:
+.B esl-afetch -f
+.I [options]
+.I msafile
+.I keyfile
+
+.TP
+Indexing an MSA file for retrieval:
+.B esl-afetch --index
+.I msafile
+
+
+.SH DESCRIPTION
+
+.B esl-afetch
+retrieves the alignment named
+.I key
+from an alignment database in file
+.I msafile.
+The
+.I msafile
+is a "multiple multiple alignment" file in Stockholm (e.g. native
+Pfam or Rfam) format.
+The
+.I key
+is either the name (ID) of the alignment, or its accession
+number (AC).
+
+.PP
+Alternatively,
+.B esl-afetch -f
+provides the ability to fetch many alignments at once.
+The
+.I -f
+option has it interpret the second argument as a <keyfile>, a
+file consisting of one name or accession per line.
+
+.PP
+The
+.I msafile
+should first be SSI indexed with
+.B esl-afetch --index
+for efficient retrieval. An SSI index is
+not required, but without one alignment retrieval may
+be painfully slow.
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.B -f
+Interpret the second argument as a
+.I keyfile
+instead of as just one
+.I key.
+The
+.I keyfile
+contains one name or accession per line.
+This option doesn't work with the
+.B --index
+option.
+
+
+.TP
+.BI -o " <f>"
+Output retrieved alignments to a file
+.I <f>
+instead of to
+.I stdout.
+
+.TP
+.BI -O
+Output retrieved alignment to a file named
+.I <key>.
+This is a convenience for saving some typing:
+instead of
+.B esl-afetch -o RRM_1 msafile RRM_1
+you can just type
+.B esl-afetch -O msafile RRM_1.
+The
+.B -O
+option only works if you're retrieving a
+single alignment; it is incompatible with
+.B -f.
+
+.TP
+.B --index
+Instead of retrieving a
+.I key,
+the special command
+.B esl-afetch --index
+.I msafile
+produces an SSI index of the names and accessions
+of the alignments in
+the
+.I msafile.
+Indexing should be done once on the
+.I msafile
+to prepare it for all future fetches.
+
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-alimanip.c b/miniapps/esl-alimanip.c
new file mode 100644
index 0000000..2cb86f4
--- /dev/null
+++ b/miniapps/esl-alimanip.c
@@ -0,0 +1,3328 @@
+/* Manipulate a multiple sequence alignment in various ways.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <math.h>
+#include <limits.h>
+
+#include "easel.h"
+#include "esl_distance.h"
+#include "esl_dmatrix.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_keyhash.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile2.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_stack.h"
+#include "esl_tree.h"
+#include "esl_vectorops.h"
+#include "esl_wuss.h"
+
+static char banner[] = "manipulate a multiple sequence alignment";
+static char usage[] = "[options] <msafile>";
+
+#define CLUSTOPTS "--cn-id,--cs-id,--cx-id,--cn-ins,--cs-ins,--cx-ins" /* Exclusive choice for clustering */
+#define CHOOSESEQOPTS "--seq-k,--seq-r,--seq-ins,--reorder" /* Exclusive choice for choosing which seqs to keep/remove */
+#define INCOMPATWITHSMALLOPTS "--rffract,--lnfract,--lxfract,--lmin,--lmax,--detrunc,--k-reorder,--seq-ins,--seq-ni,--seq-xi,--trim,--minpp,--t-keeprf,--tree,--reorder,--mask2rf,--m-keeprf,--num-all,--num-rf,--rm-gc,--sindi,--post2pp" /* Options incompatible with --small (all opts except --seq-k,--seq-r,--informat,--outformat,--rna,--dna,--amino */
+
+static int write_rf_gapthresh(const ESL_GETOPTS *go, char *errbuf, ESL_MSA *msa, float gapthresh);
+static int write_rf_given_alen(ESL_MSA *msa, char *errbuf, int *i_am_rf, int do_keep_rf_chars, char *amask, int amask_len);
+static int write_rf_given_rflen(ESL_MSA *msa, char *errbuf, int *i_am_rf, int do_keep_rf_chars, char *mask_for_rf, int mask_for_rf_len);
+static int individualize_consensus(const ESL_GETOPTS *go, char *errbuf, ESL_MSA *msa);
+static int read_sqfile(ESL_SQFILE *sqfp, const ESL_ALPHABET *abc, int nseq, ESL_SQ ***ret_sq);
+static int trim_msa(ESL_MSA *msa, ESL_SQ **sq, int do_keeprf, char *errbuf);
+static int prune_msa_based_on_posteriors(ESL_MSA *msa, float min_pp, char *errbuf);
+static int get_pp_idx(ESL_ALPHABET *abc, char ppchar);
+static int get_tree_order(ESL_TREE *T, char *errbuf, int **ret_order);
+static int reorder_msa(ESL_MSA *msa, int *order, char *errbuf);
+static int read_mask_file(char *filename, char *errbuf, char **ret_mask, int *ret_mask_len);
+static int expand_msa2mask(char *errbuf, ESL_MSA *msa1, char *xmask, ESL_MSA **newmsa1);
+static int add_gap_columns_to_msa(char *errbuf, ESL_MSA *msa, int *toadd, ESL_MSA **ret_msa, int do_treat_as_rf_gap);
+static int msa_median_length(ESL_MSA *msa);
+static int msa_remove_seqs_below_minlen(ESL_MSA *msa, float minlen, int *i_am_rf, ESL_MSA **ret_new_msa);
+static int msa_remove_seqs_above_maxlen(ESL_MSA *msa, float maxlen, ESL_MSA **ret_new_msa);
+static int msa_remove_truncated_seqs(ESL_MSA *msa, char *errbuf, int ntrunc, int *i_am_rf, ESL_MSA **ret_new_msa);
+static int msa_remove_seqs_with_ambiguities(ESL_MSA *msa, int max_nambig, ESL_MSA **ret_new_msa);
+static int number_columns(ESL_MSA *msa, int do_all, int *i_am_rf, char *errbuf);
+static char digit_to_char(int digit);
+static int int_ndigits(int i);
+static char get_char_digit_x_from_int(int i, int place);
+static int read_seq_name_file(char *filename, char *errbuf, char ***ret_seqlist, int *ret_seqlist_n);
+static int msa_keep_or_remove_seqs(ESL_MSA *msa, char *errbuf, char **seqlist, int seqlist_n, int do_keep, int do_reorder, int nali, ESL_MSA **ret_new_msa);
+static int insert_x_pair_shared(ESL_MSA *msa, int *i_am_rf, int i, int j, int cfirst, int clast, double *opt_pshared, int *opt_nshared, int *opt_nins);
+static int insert_x_pair_shared_length(ESL_MSA *msa, int *i_am_rf, int i, int j, int cfirst, int clast, double *opt_pshared, double *opt_nshared, int *opt_nins);
+static int insert_x_diffmx(const ESL_GETOPTS *go, char *errbuf, ESL_MSA *msa, int rflen, int *i_am_rf, int do_length_weight, int do_only_internal_inserts, ESL_DMATRIX **ret_D);
+static int MSADivide(ESL_MSA *mmsa, ESL_DMATRIX *D, int do_mindiff, int do_nc, int do_nsize, float mindiff, int target_nc, int target_nsize, int *ret_num_msa, ESL_MSA ***ret_cmsa, int *ret_xsize, char *errbuf);
+static int select_node(ESL_TREE *T, double *diff, double mindiff, int **ret_clust, int *ret_nc, int *ret_xsize, int *ret_best, char *errbuf);
+static float find_mindiff(ESL_TREE *T, double *diff, int do_nsize, int target, int **ret_clust, int *ret_nc, int *ret_xsize, int *ret_best, float *ret_mindiff, char *errbuf);
+static int determine_first_last_consensus_columns(ESL_MSA *msa, char *errbuf, int *i_am_rf, int rflen, int **ret_fA, int **ret_lA);
+static int dst_nongap_XPairId(const ESL_ALPHABET *abc, const ESL_DSQ *ax1, const ESL_DSQ *ax2, double *opt_distance, int *opt_nid, int *opt_n);
+static int dst_nongap_XDiffMx(const ESL_ALPHABET *abc, ESL_DSQ **ax, int N, ESL_DMATRIX **ret_D);
+static int find_seqs_with_given_insert(ESL_MSA *msa, int *i_am_rf, char *errbuf, int target, int min, int max, int **ret_useme);
+static int minorize_msa(const ESL_GETOPTS *go, ESL_MSA *msa, char *errbuf, FILE *fp, char *tag, int outfmt);
+static int remove_gc_markup(ESL_MSA *msa, char *errbuf, char *tag);
+static int cp_and_add_gaps_to_aseq(char *new_aseq, char *orig_aseq, int alen, int *toadd, int nnew, char gapchar);
+static int map_rfpos_to_apos(ESL_MSA *msa, ESL_ALPHABET *abc, char *errbuf, int **ret_i_am_rf, int **ret_rf2a_map, int *ret_rflen);
+static int convert_post_to_pp(ESL_MSA *msa, char *errbuf, int nali);
+static int compare_ints(const void *el1, const void *el2);
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-o", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "output the alignment to file <f>, not stdout", 1 },
+ { "--informat", eslARG_STRING,NULL, NULL, NULL, NULL,NULL, NULL, "specify that input file is in format <s>", 1 },
+ { "--outformat", eslARG_STRING,NULL, NULL, NULL, NULL,NULL,NULL, "specify that output format be <s>", 1 },
+ { "--devhelp", eslARG_NONE, NULL, NULL, NULL, NULL,NULL, NULL, "show list of undocumented developer options", 1 },
+ /* options for removing/trimming/reordering sequences */
+ { "--lnfract", eslARG_REAL, NULL, NULL, "0<=x<=2", NULL,NULL, CHOOSESEQOPTS, "remove sequences w/length < <x> fraction of median length", 2 },
+ { "--lxfract", eslARG_REAL, NULL, NULL, "0<=x<=3", NULL,NULL, CHOOSESEQOPTS, "remove sequences w/length > <x> fraction of median length", 2 },
+ { "--lmin", eslARG_INT, NULL, NULL, "n>0", NULL,NULL, CHOOSESEQOPTS, "remove sequences w/length < <n> residues", 2 },
+ { "--lmax", eslARG_INT, NULL, NULL, "n>0", NULL,NULL, CHOOSESEQOPTS, "remove sequences w/length > <n> residues", 2 },
+ { "--rffract", eslARG_REAL, NULL, NULL, "0<=x<=1", NULL,NULL, CHOOSESEQOPTS, "remove seqs w/nongap RF len < <x> fraction of aln nongap RF len", 2 },
+ { "--detrunc", eslARG_INT, NULL, NULL, "n>0", NULL,NULL, CHOOSESEQOPTS, "remove seqs w/gaps in >= <n> 5' or 3'-most nongap #=GC RF cols", 2 },
+ { "--xambig", eslARG_INT, NULL, NULL, "n>=0", NULL,NULL, CHOOSESEQOPTS, "remove sequences with >= <n> ambiguous residues", 2 },
+ { "--seq-r", eslARG_INFILE,NULL, NULL, NULL, NULL,NULL, CHOOSESEQOPTS, "remove sequences with names listed in file <f>", 2 },
+ { "--seq-k", eslARG_INFILE,NULL, NULL, NULL, NULL,NULL, CHOOSESEQOPTS, "remove all seqs *except* those listed in <f>", 2 },
+ { "--small", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, INCOMPATWITHSMALLOPTS, "w/--seq-r or --seq-k use minimal RAM (no seq reordering)", 2 },
+ { "--k-reorder", eslARG_NONE, NULL, NULL, NULL, NULL,"--seq-k", INCOMPATWITHSMALLOPTS, "with --seq-k <f>, reorder sequences to order in <f>", 2 },
+ { "--seq-ins", eslARG_INT, NULL, NULL, NULL, NULL,NULL, CHOOSESEQOPTS, "keep only seqs w/an insert after nongap RF col <n>", 2 },
+ { "--seq-ni", eslARG_INT, "1", NULL, "n>0", NULL,"--seq-ins", NULL, "w/--seq-ins require at least <n> residue insertions", 2 },
+ { "--seq-xi", eslARG_INT,"1000000",NULL, "n>0", NULL,"--seq-ins", NULL, "w/--seq-ins require at most <n> residue insertions", 2 },
+ { "--trim", eslARG_INFILE, NULL, NULL, NULL, NULL,NULL, NULL, "trim aligned seqs in <msafile> to subseqs in <f>", 2 },
+ { "--t-keeprf", eslARG_NONE, NULL, NULL, NULL, NULL,"--trim", NULL, "w/--trim keep GC RF annotation in msa, if it exists", 2 },
+ { "--minpp", eslARG_REAL, NULL, NULL, "0<x<=0.95",NULL,NULL,NULL, "replace residues with posterior probabilities < <x> with gaps", 2 },
+ { "--tree", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, CHOOSESEQOPTS, "reorder MSA to tree order following SLC, save Newick tree to <f>", 2 },
+ { "--reorder", eslARG_INFILE, NULL, NULL, NULL, NULL,NULL, CHOOSESEQOPTS, "reorder seqs to the order listed in <f>, all seqs must be listed", 2 },
+ /* options for adding/removing alignment annotation */
+ { "--mask2rf", eslARG_INFILE, FALSE,NULL, NULL, NULL,NULL, NULL, "set #=GC RF as x=1, gap=0 from 1/0s in 1-line <f>", 3 },
+ { "--m-keeprf", eslARG_NONE, FALSE, NULL, NULL, NULL,"--mask2rf", NULL, "with --mask2rf, do not overwrite nongap RF characters with 'x'", 3 },
+ { "--num-all", eslARG_NONE, NULL, NULL, NULL, NULL,NULL, NULL, "add annotation numbering all columns", 3 },
+ { "--num-rf", eslARG_NONE, NULL, NULL, NULL, NULL,NULL, NULL, "add annotation numbering the nongap RF columns", 3 },
+ { "--rm-gc", eslARG_STRING,NULL, NULL, NULL, NULL,NULL, "--mask2rf", "remove GC <s> markup, <s> must be RF|SS_cons|SA_cons|PP_cons", 3 },
+ { "--sindi", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "annotate individual secondary structures by imposing consensus", 3 },
+ { "--post2pp", eslARG_NONE, NULL, NULL, NULL, NULL,NULL, NULL, "convert infernal 0.72-1.0.2 POST posterior prob annotation to PP", 3 },
+ /* options for specifying the alphabet */
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--dna,--rna", "<msafile> contains protein alignments", 4 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--amino,--rna", "<msafile> contains DNA alignments", 4 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--amino,--dna", "<msafile> contains RNA alignments", 4 },
+
+ /* All options below are developer options, only shown if --devhelp invoked */
+ { "--xmask", eslARG_INFILE, NULL, NULL, NULL, NULL,NULL, NULL, "for each 0 column in <f>, add a 100% gap column to <msafile>", 101 },
+ { "--cn-id", eslARG_INT, NULL, NULL, "n>0", NULL,NULL, CLUSTOPTS, "split MSA into <n> clusters based on sequence identity", 101 },
+ { "--cs-id", eslARG_INT, NULL, NULL, "n>0", NULL,NULL, CLUSTOPTS, "split MSA into clusters on id s.t max cluster has <n> seqs", 101 },
+ { "--cx-id", eslARG_REAL, NULL, NULL, "0.<x<1.",NULL,NULL, CLUSTOPTS, "split MSA into clusters s.t. no seq b/t 2 clusters > <x> seq id", 101 },
+ { "--cn-ins", eslARG_INT, NULL, NULL, "n>0", NULL,NULL, CLUSTOPTS, "split MSA into <n> clusters based on insert similarity", 101 },
+ { "--cs-ins", eslARG_INT, NULL, NULL, "n>0", NULL,NULL, CLUSTOPTS, "split MSA into clusters on inserts s.t. max cluster has <n> seqs", 101 },
+ { "--cx-ins", eslARG_REAL, NULL, NULL, "0.<x<1.",NULL,NULL, CLUSTOPTS, "split MSA into clusters s.t. no seq b/t 2 clusters > <x> ins id", 101 },
+ { "--c-nmin", eslARG_INT, NULL, NULL, "n>0", NULL,NULL, NULL, "only keep the cluster(s) with number of seqs > <n>", 101 },
+ { "--c-mx", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "output identity matrix to file <f>", 101 },
+ { "-M", eslARG_STRING,NULL, NULL, NULL, NULL,NULL, "--seq-r,--seq-k", "use #=GS tag <s> to define minor alignments, and output them", 101 },
+ { "--M-rf", eslARG_NONE, NULL, NULL, NULL, NULL,"-M", NULL, "w/-M, impose major #=GC RF onto all minor alns", 101 },
+ { "--M-gapt", eslARG_REAL, "0.5", NULL, "0<=x<=1", NULL,"-M", NULL, "w/-M, fraction of gaps allowed in nongap RF columns", 101 },
+
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ ESL_ALPHABET *abc = NULL; /* biological alphabet */
+ char *alifile = NULL; /* alignment file name */
+ int infmt = eslMSAFILE_UNKNOWN; /* format code for alifile */
+ int outfmt = eslMSAFILE_UNKNOWN; /* format code for output ali */
+ int i; /* counter */
+ ESL_MSAFILE *afp = NULL; /* open ali file, normal interface */
+ ESL_MSAFILE2 *afp2 = NULL; /* open ali file, legacy small-mem interface */
+ ESL_MSA *msa = NULL; /* one multiple sequence alignment */
+ int status; /* easel return code */
+ int nali; /* number of alignments read */
+ FILE *ofp; /* output file (default is stdout) */
+ char errbuf[eslERRBUFSIZE];
+ int median; /* median length seq in msa */
+ float minlen; /* min length seq we'll keep */
+ float maxlen; /* max length seq we'll keep */
+ ESL_MSA *new_msa; /* a new MSA object created from the msa we read from a file */
+
+ /* variables related to --seq-k and --seq-r and --reorder */
+ char **seqlist = NULL; /* list of sequences to keep in msa */
+ int seqlist_n; /* number of sequences in seqlist */
+ int n; /* counter over seqnames */
+ int *useme = NULL; /* useme[0..n..msa->nseq-1] TRUE to keep seq n, FALSE not to */
+
+ /* variables related to --trim */
+ ESL_SQ **trim_sq = NULL; /* unaligned sequences read from a file */
+
+ /* --trim related vars */
+ ESL_SQFILE *trimfp = NULL; /* sequence file with subsequences for --trim */
+
+ /* --mask2rf */
+ char *mask_for_rf = NULL;
+ int mask_for_rf_len = -1;
+ /* --xmask */
+ char *xmask = NULL;
+ int xmask_len = -1;
+ /* RF related variables */
+ int *i_am_rf = NULL; /* [0..i..msa->alen-1]: TRUE if pos i is non-gap RF posn, if msa->rf == NULL remains NULL */
+ int *rf2a_map = NULL; /* [0..rfpos..rflen-1] = apos,
+ * apos is the alignment position (0..msa->alen-1) that
+ * is non-gap RF position rfpos+1 (for rfpos in 0..rflen-1) */
+ int rflen = -1; /* nongap RF length */
+
+ /* options related to --tree */
+ ESL_TREE *T = NULL; /* the tree, created by Single-Linkage Clustering */
+ ESL_DMATRIX *D = NULL; /* the distance matrix */
+ int *order; /* order of sequences in new, reordered msa */
+
+ /* options related the 'in development '--c*' options */
+ int do_id_cluster = FALSE; /* TRUE if --cn-id, --cs-id, or --cx-id */
+ int do_insert_cluster = FALSE; /* TRUE if --cn-ins, --cs-ins, or --cx-ins */
+ int do_ctarget_nc, do_ctarget_nsize, do_cmindiff, nmsa, m, nc, nsize, xsize, nmin;
+ float mindiff;
+ ESL_MSA **cmsa; /* the new msa's created by clustering seqs in the main msa */
+ ESL_MSA *rfmsa; /* the new msa, but with gap RF columns removed */
+ FILE *mxfp = NULL;
+ int j;
+
+ /* --iinfo, --iplot, --gplot --rinfo, --dinfo related vars */
+ double **abc_ct = NULL; /* [0..msa->alen-1][0..abc->K], count of each residue at each position, over all sequences, missing and nonresidues are *not counted* */
+ int **pp_ct = NULL; /* [0..msa->alen-1][0..11], count of reach posterior probability (PP) code, over all sequences, gap is 11 */
+ FILE *treefp = NULL; /* output file for --tree */
+
+ /* options related to --small */
+ ESL_KEYHASH *seqname_keyhash; /* keyhash of sequence names listed in list file <f>, with <f> from --seq-k <f> --seq-r <f> */
+ int nseq_read = 0; /* number of sequences read from current alignment */
+ int nseq_regurged = 0; /* number of sequences regurgitated from current alignment */
+
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "--devhelp") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts("\nwhere basic options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ puts("\noptions for removing/reordering/trimming sequences:");
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80);
+ puts("\noptions for adding/removing alignment annotation:");
+ esl_opt_DisplayHelp(stdout, go, 3, 2, 80);
+ puts("\noptions for specifying bio alphabet:");
+ esl_opt_DisplayHelp(stdout, go, 4, 2, 80);
+ puts("\nundocumented, experimental developer options:");
+ esl_opt_DisplayHelp(stdout, go, 101, 2, 80);
+ exit(0);
+ }
+ if (esl_opt_GetBoolean(go, "-h") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts("\nwhere basic options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ puts("\noptions for removing/reordering/trimming sequences:");
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80);
+ puts("\noptions for adding/removing alignment annotation:");
+ esl_opt_DisplayHelp(stdout, go, 3, 2, 80);
+ puts("\noptions for specifying bio alphabet:");
+ esl_opt_DisplayHelp(stdout, go, 4, 2, 80);
+ exit(0);
+ }
+
+ if (esl_opt_ArgNumber(go) != 1)
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ /* Check for incompatible options that aren't simple to check with esl_getopts */
+ /* --small requires either --seq-k or --seq-r */
+ if (esl_opt_GetBoolean(go, "--small") && (! esl_opt_IsOn(go, "--seq-k")) && (! esl_opt_IsOn(go, "--seq-r"))) {
+ esl_fatal("--small requires either --seq-k or --seq-r");
+ }
+
+ alifile = esl_opt_GetArg(go, 1);
+
+ /* get informat and outformat */
+ if (esl_opt_GetBoolean(go, "--small"))
+ {
+ infmt = eslMSAFILE_PFAM;
+ outfmt = eslMSAFILE_PFAM;
+ }
+ else
+ {
+ outfmt = eslMSAFILE_STOCKHOLM;
+ }
+
+ if (esl_opt_IsOn(go, "--informat"))
+ {
+ infmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--informat"));
+ if (infmt == eslMSAFILE_UNKNOWN)
+ esl_fatal("%s is not a valid input sequence file format for --informat", esl_opt_GetString(go, "--informat"));
+ if (esl_opt_GetBoolean(go, "--small") && infmt != eslMSAFILE_PFAM)
+ esl_fatal("--small requires (and defaults to) pfam format\ncan't set --informat %s\n", esl_opt_GetString(go, "--informat"));
+ }
+
+ if (esl_opt_IsOn(go, "--outformat"))
+ {
+ outfmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--outformat"));
+ if (outfmt == eslMSAFILE_UNKNOWN)
+ esl_fatal("%s is not a valid input sequence file format for --outformat", esl_opt_GetString(go, "--outformat"));
+ if (esl_opt_GetBoolean(go, "--small") && outfmt != eslMSAFILE_PFAM)
+ esl_fatal("--small requires (and defaults to) pfam format\ncan't set --outformat %s\n", esl_opt_GetString(go, "--outformat"));
+ }
+
+ /***************************************************************
+ * Open the MSA file; determine alphabet; set for digital input
+ ****************************************************************/
+
+ if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--small")) esl_fatal("Must specify an alphabet (--amino, --dna, --rna) to use --small");
+
+ if (esl_opt_GetBoolean(go, "--small"))
+ {
+ status = esl_msafile2_OpenDigital(abc, alifile, NULL, &afp2);
+ if (status == eslENOTFOUND) esl_fatal("Alignment file %s doesn't exist or is not readable\n", alifile);
+ else if (status != eslOK) esl_fatal("Alignment file %s open failed with error %d\n", alifile, status);
+ }
+ else
+ {
+ if ( (status = esl_msafile_Open(&abc, alifile, NULL, infmt, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+ infmt = afp->format;
+ }
+
+ /* Check for incompatible options that require Stockholm/Pfam as input or output format */
+ if((esl_opt_IsOn(go, "--mask2rf")) && (outfmt != eslMSAFILE_STOCKHOLM) && (outfmt != eslMSAFILE_PFAM)) esl_fatal("with --mask2rf, the the output format must be stockholm/pfam format");
+ if((esl_opt_IsOn(go, "--rm-gc")) && (outfmt != eslMSAFILE_STOCKHOLM) && (outfmt != eslMSAFILE_PFAM)) esl_fatal("with --rm-gc, the the output format must be stockholm/pfam format");
+ if((esl_opt_IsOn(go, "--post2pp")) && (outfmt != eslMSAFILE_STOCKHOLM) && (outfmt != eslMSAFILE_PFAM)) esl_fatal("with --post2pp, the the output format must be stockholm/pfam format");
+ if((esl_opt_IsOn(go, "--num-all")) && (outfmt != eslMSAFILE_STOCKHOLM) && (outfmt != eslMSAFILE_PFAM)) esl_fatal("with --num-all, the the output format must be stockholm/pfam format");
+ if((esl_opt_IsOn(go, "--num-rf")) && (outfmt != eslMSAFILE_STOCKHOLM) && (outfmt != eslMSAFILE_PFAM)) esl_fatal("with --num-rf, the the output format must be stockholm/pfam format");
+
+ if((esl_opt_IsOn(go, "--seq-ins")) && (infmt != eslMSAFILE_STOCKHOLM) && (infmt != eslMSAFILE_PFAM)) esl_fatal("with --seq-ins, the alignment file must be in stockholm/pfam format");
+ if((esl_opt_IsOn(go, "--cn-id")) && (infmt != eslMSAFILE_STOCKHOLM) && (infmt != eslMSAFILE_PFAM)) esl_fatal("with --cn-id, the alignment file must be in stockholm/pfam format");
+ if((esl_opt_IsOn(go, "--cs-id")) && (infmt != eslMSAFILE_STOCKHOLM) && (infmt != eslMSAFILE_PFAM)) esl_fatal("with --cs-id, the alignment file must be in stockholm/pfam format");
+ if((esl_opt_IsOn(go, "--cx-id")) && (infmt != eslMSAFILE_STOCKHOLM) && (infmt != eslMSAFILE_PFAM)) esl_fatal("with --cx-id, the alignment file must be in stockholm/pfam format");
+ if((esl_opt_IsOn(go, "--cn-ins")) && (infmt != eslMSAFILE_STOCKHOLM) && (infmt != eslMSAFILE_PFAM)) esl_fatal("with --cn-ins, the alignment file must be in stockholm/pfam format");
+ if((esl_opt_IsOn(go, "--cs-ins")) && (infmt != eslMSAFILE_STOCKHOLM) && (infmt != eslMSAFILE_PFAM)) esl_fatal("with --cs-ins, the alignment file must be in stockholm/pfam format");
+ if((esl_opt_IsOn(go, "--cx-ins")) && (infmt != eslMSAFILE_STOCKHOLM) && (infmt != eslMSAFILE_PFAM)) esl_fatal("with --cx-ins, the alignment file must be in stockholm/pfam format");
+
+ /* open output file */
+ if (esl_opt_GetString(go, "-o") != NULL) {
+ if ((ofp = fopen(esl_opt_GetString(go, "-o"), "w")) == NULL)
+ esl_fatal("Failed to open -o output file %s\n", esl_opt_GetString(go, "-o"));
+ } else ofp = stdout;
+
+ do_id_cluster = ((esl_opt_IsOn(go, "--cn-id")) || (esl_opt_IsOn(go, "--cs-id")) || (esl_opt_IsOn(go, "--cx-id"))) ? TRUE : FALSE;
+ do_insert_cluster = ((esl_opt_IsOn(go, "--cn-ins")) || (esl_opt_IsOn(go, "--cs-ins")) || (esl_opt_IsOn(go, "--cx-ins")))? TRUE : FALSE;
+
+ /****************************
+ * Read optional input files
+ ****************************/
+ /* read --mask2rf file, if nec */
+ if(esl_opt_GetString(go, "--mask2rf") != NULL) {
+ if((status = read_mask_file(esl_opt_GetString(go, "--mask2rf"), errbuf, &mask_for_rf, &mask_for_rf_len)) != eslOK)
+ esl_fatal(errbuf);
+ }
+ /* read --xmask file, if nec */
+ if(esl_opt_GetString(go, "--xmask") != NULL) {
+ if((status = read_mask_file(esl_opt_GetString(go, "--xmask"), errbuf, &xmask, &xmask_len)) != eslOK)
+ esl_fatal(errbuf);
+ }
+
+ /****************************
+ * Open optional output files
+ ****************************/
+
+ if( esl_opt_IsOn(go, "--tree")) {
+ if ((treefp = fopen(esl_opt_GetString(go, "--tree"), "w")) == NULL)
+ esl_fatal("Failed to open --tree output file %s\n", esl_opt_GetString(go, "--tree"));
+ }
+ if( esl_opt_IsOn(go, "--c-mx")) {
+ if ((mxfp = fopen(esl_opt_GetString(go, "--c-mx"), "w")) == NULL)
+ esl_fatal("Failed to open --c-mx output file %s\n", esl_opt_GetString(go, "--c-mx"));
+ }
+
+ /*******************************************************************
+ * Open and read list file, if nec (--seq-k, --seq-r or --reorder) *
+ *******************************************************************/
+ if ( esl_opt_IsOn(go, "--seq-k") || esl_opt_IsOn(go, "--seq-r") || esl_opt_IsOn(go, "--reorder")) {
+ if( esl_opt_IsOn(go, "--seq-k")) {
+ if((status = read_seq_name_file(esl_opt_GetString(go, "--seq-k"), errbuf, &seqlist, &seqlist_n)) != eslOK) esl_fatal(errbuf);
+ }
+ else if( esl_opt_IsOn(go, "--reorder")) {
+ if((status = read_seq_name_file(esl_opt_GetString(go, "--reorder"), errbuf, &seqlist, &seqlist_n)) != eslOK) esl_fatal(errbuf);
+ }
+ else { /* --seq-r enabled */
+ if((status = read_seq_name_file(esl_opt_GetString(go, "--seq-r"), errbuf, &seqlist, &seqlist_n)) != eslOK) esl_fatal(errbuf);
+ }
+ }
+
+ /*************************************************************
+ * Read MSAs one at a time, manipulate them, then output them
+ *************************************************************/
+
+ nali = 0;
+ if (! esl_opt_GetBoolean(go, "--small")) {
+ while ((status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+ nali++;
+
+ /* if RF exists, get i_am_rf array[0..alen] which tells us which positions are non-gap RF positions
+ * and rf2a_map, a map of non-gap RF positions to overall alignment positions */
+ if(msa->rf != NULL) {
+ if((status = map_rfpos_to_apos(msa, abc, errbuf, &i_am_rf, &rf2a_map, &rflen)) != eslOK) esl_fatal(errbuf);
+ }
+
+ /********************************************************************
+ * Remove sequences based on an input list file (--seq-k or --seq-r)
+ ********************************************************************/
+ /* Handle the --seq-k and --seq-r options if enabled, all subsequent manipulations will omit any seqs removed here.
+ * We've already read list file <f>, seqlist holds the seqlist_n sequences read from <f>
+ * (<f> from either --seq-k <f>, --seq-r <f>, --reorder <f>)
+ */
+ if ( esl_opt_IsOn(go, "--seq-k") || esl_opt_IsOn(go, "--seq-r") || esl_opt_IsOn(go, "--reorder")) {
+ if((afp->format != eslMSAFILE_STOCKHOLM) && (afp->format != eslMSAFILE_PFAM)) {
+ esl_fatal("--seq-k, --seq-r, --reorder only work on Stockholm formatted alignments");
+ }
+ if( esl_opt_IsOn(go, "--seq-k")) {
+ if((status = msa_keep_or_remove_seqs(msa, errbuf, seqlist, seqlist_n, TRUE, (esl_opt_GetBoolean(go, "--k-reorder")), nali, &new_msa)) != eslOK) esl_fatal(errbuf);
+ /* new_msa is msa but only with seqs listed in --seq-k <f> file */
+ }
+ else if( esl_opt_IsOn(go, "--reorder")) {
+ if(seqlist_n != msa->nseq) esl_fatal("With --reorder <f>, <f> contains %d names, but alignment %d has %d seqs (all seqs must be listed in <f>)", seqlist_n, nali, msa->nseq);
+ if((status = msa_keep_or_remove_seqs(msa, errbuf, seqlist, seqlist_n, TRUE, TRUE, nali, &new_msa)) != eslOK) esl_fatal(errbuf);
+ /* new_msa is msa but only with seqs listed in --seq-k <f> file */
+ }
+ else { /* --seq-r enabled */
+ if((status = msa_keep_or_remove_seqs(msa, errbuf, seqlist, seqlist_n, FALSE, TRUE, nali, &new_msa)) != eslOK) esl_fatal(errbuf);
+ /* new_msa is msa but without seqs listed in --seq-r <f> file */
+ }
+ esl_msa_Destroy(msa);
+ msa = new_msa;
+ }
+
+ /*************************************************************
+ * Remove sequences based on length or number of ambiguities *
+ *************************************************************/
+ /* The --lnfract,--lxfract,--lmin,--lmax,--detrunc,--xambig options.
+ * we do each separately, removing seqs for each as we go.
+ * They can be used in combination.
+ */
+ if (esl_opt_IsOn(go, "--lnfract")) {
+ median = msa_median_length(msa);
+ minlen = esl_opt_GetReal(go, "--lnfract") * (float) median;
+ msa_remove_seqs_below_minlen(msa, minlen, NULL, &new_msa); /* NULL: do not consider only nongap RF positions */
+ /* new_msa is msa without seqs below minlen, swap ptrs */
+ esl_msa_Destroy(msa);
+ msa = new_msa;
+ new_msa = NULL;
+ }
+ if (esl_opt_IsOn(go, "--lxfract")) {
+ median = msa_median_length(msa);
+ maxlen = esl_opt_GetReal(go, "--lxfract") * (float) median;
+ msa_remove_seqs_above_maxlen(msa, maxlen, &new_msa);
+ /* new_msa is msa without seqs above maxlen, swap ptrs */
+ esl_msa_Destroy(msa);
+ msa = new_msa;
+ new_msa = NULL;
+ }
+ if (esl_opt_IsOn(go, "--lmin")) {
+ minlen = esl_opt_GetInteger(go, "--lmin");
+ msa_remove_seqs_below_minlen(msa, minlen, NULL, &new_msa); /* NULL: do not consider only nongap RF positions */
+ /* new_msa is msa without seqs below minlen, swap ptrs */
+ esl_msa_Destroy(msa);
+ msa = new_msa;
+ new_msa = NULL;
+ }
+ if (esl_opt_IsOn(go, "--lmax")) {
+ maxlen = esl_opt_GetInteger(go, "--lmax");
+ msa_remove_seqs_above_maxlen(msa, maxlen, &new_msa);
+ /* new_msa is msa without seqs below maxlen, swap ptrs */
+ esl_msa_Destroy(msa);
+ msa = new_msa;
+ new_msa = NULL;
+ }
+ if (esl_opt_IsOn(go, "--rffract")) {
+ /* determine nongap RF length */
+ if(msa->rf == NULL) esl_fatal("with --rffract, alignment(s) must have RF annotation, alignment %d does not", nali);
+ minlen = rflen * esl_opt_GetReal(go, "--rffract");
+ msa_remove_seqs_below_minlen(msa, minlen, i_am_rf, &new_msa);
+ /* new_msa is msa without seqs below minlen, swap ptrs */
+ esl_msa_Destroy(msa);
+ msa = new_msa;
+ new_msa = NULL;
+ }
+ if( esl_opt_IsOn(go, "--detrunc")) {
+ if((status = msa_remove_truncated_seqs(msa, errbuf, esl_opt_GetInteger(go, "--detrunc"), i_am_rf, &new_msa)) != eslOK) esl_fatal(errbuf);
+ /* new_msa is msa without seqs below minlen, swap ptrs */
+ esl_msa_Destroy(msa);
+ msa = new_msa;
+ new_msa = NULL;
+ }
+ if( esl_opt_IsOn(go, "--xambig")) {
+ if((status = msa_remove_seqs_with_ambiguities(msa, esl_opt_GetInteger(go, "--xambig"), &new_msa)) != eslOK) esl_fatal(errbuf);
+ /* new_msa is msa without seqs with > <n> (from --xambig <n>) ambiguities, swap ptrs */
+ esl_msa_Destroy(msa);
+ msa = new_msa;
+ new_msa = NULL;
+ }
+
+ /*********************************************************
+ * Remove sequences based on a specific insert (--seq-ins)
+ *********************************************************/
+ if( esl_opt_IsOn(go, "--seq-ins")) {
+ if((status = find_seqs_with_given_insert(msa, i_am_rf, errbuf, esl_opt_GetInteger(go, "--seq-ins"), esl_opt_GetInteger(go, "--seq-ni"), esl_opt_GetInteger(go, "--seq-xi"), &useme)) != eslOK) esl_fatal(errbuf);
+ if(esl_vec_ISum(useme, msa->nseq) == 0) esl_fatal("No sequences satisfy the --seq-ins option.");
+ if((status = esl_msa_SequenceSubset(msa, useme, &new_msa)) != eslOK) esl_fatal(errbuf);
+ /* new_msa is msa but without seqs that do not have an insert of length <a>..<b> (from --seq-ni <a> and --seq-xi <b>) after consensus column <n> from --seq-ins <n> file */
+ esl_msa_Destroy(msa);
+ msa = new_msa;
+ new_msa = NULL;
+ }
+
+ /******************
+ * Trim sequences *
+ ******************/
+ if(esl_opt_GetString(go, "--trim") != NULL) {
+ if(nali > 1) { esl_fatal("--trim only works if the alignment file has a single alignment"); }
+ status = esl_sqfile_Open(esl_opt_GetString(go, "--trim"), eslSQFILE_UNKNOWN, NULL, &(trimfp));
+ if (status == eslENOTFOUND) esl_fatal("File %s doesn't exist or is not readable\n", esl_opt_GetString(go, "--trim"));
+ else if (status == eslEFORMAT) esl_fatal("Couldn't determine format of sequence file %s\n", esl_opt_GetString(go, "--trim"));
+ else if (status == eslEINVAL) esl_fatal("Can't autodetect stdin or .gz.");
+ else if (status != eslOK) esl_fatal("Sequence file open failed with error %d\n", status);
+ /* read the sequences */
+ read_sqfile(trimfp, msa->abc, msa->nseq, &trim_sq); /* dies on failure */
+ /* trim the msa */
+ if((status = trim_msa(msa, trim_sq, esl_opt_GetBoolean(go, "--t-keeprf"), errbuf)) != eslOK) esl_fatal(errbuf);
+ for(i = 0; i < msa->nseq; i++) esl_sq_Destroy(trim_sq[i]);
+ free(trim_sq);
+ trim_sq = NULL;
+ }
+
+ /*****************************************************
+ * Replace residues with PP values less than minimum *
+ *****************************************************/
+ if(esl_opt_IsOn(go, "--minpp")) {
+ if(msa->pp == NULL) esl_fatal("--minpp requires all alignments have posterior probability annotation, %d does not\n", nali);
+ if((status = prune_msa_based_on_posteriors(msa, esl_opt_GetReal(go, "--minpp"), errbuf)) != eslOK) esl_fatal(errbuf);
+ }
+
+ /**********************************************
+ * Reorder sequences to tree order, if --tree *
+ **********************************************/
+ /* handle the --tree option, if enabled */
+ if( esl_opt_IsOn(go, "--tree")) {
+ /* Create distance matrix and infer tree by single linkage clustering */
+ esl_dst_XDiffMx(msa->abc, msa->ax, msa->nseq, &D);
+ esl_tree_SingleLinkage(D, &T);
+ esl_tree_SetTaxaParents(T);
+ esl_tree_SetTaxonlabels(T, msa->sqname);
+ if((status = esl_tree_Validate(T, errbuf)) != eslOK) esl_fatal(errbuf);
+
+ esl_tree_WriteNewick(treefp, T);
+
+ /* Get new order for seqs in the MSA based on the tree */
+ if((status = get_tree_order(T, errbuf, &order)) != eslOK) esl_fatal(errbuf);
+
+ /*for(i = 0; i < msa->nseq; i++) printf("new MSA idx: %3d | orig MSA idx: %3d\n", i, order[i]);*/
+ esl_tree_Destroy(T);
+ esl_dmatrix_Destroy(D);
+ T = NULL;
+ D = NULL;
+ if((status = reorder_msa(msa, order, errbuf)) != eslOK) esl_fatal(errbuf);
+ free(order);
+ }
+
+ /******************************************
+ * Modify/add annotation in the alignment *
+ ******************************************/
+ /* Convert POST annotation (infernal 0.72-1.0) to PP, if nec */
+ /* Remove GC annotation, if nec */
+ if( esl_opt_IsOn(go, "--rm-gc")) {
+ if((status = remove_gc_markup(msa, errbuf, esl_opt_GetString(go, "--rm-gc")) != eslOK)) esl_fatal(errbuf);
+ }
+ /* Rewrite RF annotation based on a mask, if nec */
+ if(mask_for_rf != NULL) { /* --mask2rf enabled */
+ if(msa->rf != NULL && mask_for_rf_len == rflen) { /* mask corresponds to RF len */
+ if((status = write_rf_given_rflen(msa, errbuf, i_am_rf, esl_opt_GetBoolean(go, "--m-keeprf"), mask_for_rf, mask_for_rf_len)) != eslOK) esl_fatal(errbuf);
+ }
+ else if(mask_for_rf_len == msa->alen) {
+ if((status = write_rf_given_alen(msa, errbuf, i_am_rf, esl_opt_GetBoolean(go, "--m-keeprf"), mask_for_rf, mask_for_rf_len)) != eslOK) esl_fatal(errbuf);
+ }
+ else {
+ if(msa->rf != NULL) esl_fatal("msa %d, alignment length is %d, nongap RF length is %d, --mask2rf mask length is neither (%d)", msa->alen, rflen);
+ else esl_fatal("msa %d, alignment length is %d (no RF annotation), --mask2rf mask length is neither (%d)", msa->alen, rflen);
+ }
+ }
+ /* Add annotation numbering the nongap RF columns, if nec */
+ if( esl_opt_IsOn(go, "--num-rf")) {
+ if(msa->rf == NULL) esl_fatal("--num-rf requires all alignments have #=GC RF annotation, but alignment %d does not", nali);
+ if((status = number_columns(msa, FALSE, i_am_rf, errbuf) != eslOK)) esl_fatal(errbuf);
+ }
+ /* Add annotation numbering all columns, if nec */
+ if( esl_opt_IsOn(go, "--num-all")) {
+ if((status = number_columns(msa, TRUE, i_am_rf, errbuf) != eslOK)) esl_fatal(errbuf);
+ }
+ /* Convert POST to PP annotation, if nec */
+ if(esl_opt_GetBoolean(go, "--post2pp")) {
+ if(msa->pp != NULL) esl_fatal("--post2pp enabled but alignment %d already has PP annotation.\n", nali);
+ if((status = convert_post_to_pp(msa, errbuf, nali)) != eslOK) esl_fatal(errbuf);
+ }
+ /* Impose consensus structure to get individual secondary structures, if nec */
+ if(esl_opt_GetBoolean(go, "--sindi")) {
+ if((status = individualize_consensus(go, errbuf, msa) != eslOK)) esl_fatal(errbuf);
+ }
+
+ /****************************************************
+ * Handle 'in development' options, that are undocumented
+ * (only visible from the command line with --devhelp)
+ * These are even less stable than the other options.
+ ***************************************************/
+ /* --xmask option: expand the alignment to fit lanemask in xmask <f>, number of TOTAL msa columns must equal number of 1s in <f>. */
+ if(xmask != NULL) {
+ if((status = expand_msa2mask(errbuf, msa, xmask, &new_msa)) != eslOK) esl_fatal(errbuf);
+ esl_msa_Destroy(msa);
+ msa = new_msa;
+ }
+
+ /*******************************************************
+ * Handle the 'in development' cluster options. (--c-*)
+ * (these should probably go into a different miniapp eventually)
+ *******************************************************/
+ if(do_id_cluster || do_insert_cluster) {
+ if(msa->rf == NULL) esl_fatal("--c* options require #=GC RF annotation marking consensus columns.");
+ if(do_id_cluster) {
+ if(msa->rf == NULL) esl_fatal("Error, --cn-id, --cs-id and --cx-id require all alignments have #=GC RF anntotation, aln %d does not.", nali);
+ /* create distance matrix and infer tree by single linkage clustering */
+ /* first, remove all non-consensus columns */
+ rfmsa = esl_msa_Clone(msa);
+ if((status = esl_msa_ColumnSubset(rfmsa, errbuf, i_am_rf)) != eslOK) esl_fatal(errbuf);
+ dst_nongap_XDiffMx(rfmsa->abc, rfmsa->ax, rfmsa->nseq, &D);
+ esl_msa_Destroy(rfmsa);
+ rfmsa = NULL;
+ do_ctarget_nc = esl_opt_IsOn(go, "--cn-id");
+ do_ctarget_nsize = esl_opt_IsOn(go, "--cs-id");
+ do_cmindiff = esl_opt_IsOn(go, "--cx-id");
+ nc = esl_opt_IsOn(go, "--cn-id") ? esl_opt_GetInteger(go, "--cn-id") : 0;
+ nsize = esl_opt_IsOn(go, "--cs-id") ? esl_opt_GetInteger(go, "--cs-id") : 0;
+ mindiff = esl_opt_IsOn(go, "--cx-id") ? 1. - esl_opt_GetReal(go, "--cx-id") : 0;
+ }
+ else { /* do_insert_cluster, create insert distance matrix and infer tree by SLC */
+ if(msa->rf == NULL) esl_fatal("Error, --cn-ins, --cs-ins and --cx-ins require all alignments have #=GC RF anntotation, aln %d does not.", nali);
+ if((status = insert_x_diffmx(go, errbuf, msa, rflen, i_am_rf, TRUE, TRUE, &D)) != eslOK) esl_fatal(errbuf);
+ do_ctarget_nc = esl_opt_IsOn(go, "--cn-ins");
+ do_ctarget_nsize = esl_opt_IsOn(go, "--cs-ins");
+ do_cmindiff = esl_opt_IsOn(go, "--cx-ins");
+ nc = esl_opt_IsOn(go, "--cn-ins") ? esl_opt_GetInteger(go, "--cn-ins") : 0;
+ nsize = esl_opt_IsOn(go, "--cs-ins") ? esl_opt_GetInteger(go, "--cs-ins") : 0;
+ mindiff = esl_opt_IsOn(go, "--cx-ins") ? 1. - esl_opt_GetReal(go, "--cx-ins") : 0;
+ }
+ /* print out the id matrix if nec */
+ if( esl_opt_IsOn(go, "--c-mx")) {
+ for(i = 0; i < msa->nseq; i++) {
+ for(j = 0; j < msa->nseq; j++) {
+ fprintf(mxfp, "%5d %5d %-30s %-30s %.5f\n", i, j, msa->sqname[i], msa->sqname[j], 1. - D->mx[i][j]);
+ }
+ }
+ fclose(mxfp);
+ }
+ if((status = MSADivide(msa, D, do_cmindiff, do_ctarget_nc, do_ctarget_nsize, mindiff, nc, nsize, &nmsa, &cmsa, &xsize, errbuf)) != eslOK) esl_fatal(errbuf);
+ esl_msa_Destroy(msa);
+ msa = NULL;
+ nmin = esl_opt_IsOn(go, "--c-nmin") ? esl_opt_GetInteger(go, "--c-nmin") : 1;
+ for(m = 0; m < nmsa; m++) {
+ if(cmsa[m]->nseq >= nmin) {
+ status = esl_msafile_Write(ofp, cmsa[m], outfmt);
+ if (status == eslEMEM) esl_fatal("Memory error when outputting alignment\n");
+ else if (status != eslOK) esl_fatal("Writing alignment file failed with error %d\n", status);
+ }
+ esl_msa_Destroy(cmsa[m]);
+ }
+ free(cmsa);
+ }
+ else if ( esl_opt_IsOn(go, "--c-mx")) esl_fatal("--c-mx option requires at least one of: --cn-id, --cs-id, --cx-id, --cn-ins, --cs-ins, --cx-ins");
+ /*******************************
+ * End of cluster option block
+ *******************************/
+
+ /* handle the *in development* -M option, if enabled */
+ if( esl_opt_IsOn(go, "-M")) {
+ if((status = minorize_msa(go, msa, errbuf, ofp, esl_opt_GetString(go, "-M"), outfmt) != eslOK)) esl_fatal(errbuf);
+ }
+
+ /********************
+ * Output alignment *
+ ********************/
+ if(! esl_opt_IsOn(go, "-M")) { /* if -M, we already output the alignments in minorize_msa() */
+ status = esl_msafile_Write(ofp, msa, outfmt);
+ if (status == eslEMEM) esl_fatal("Memory error when outputting alignment\n");
+ else if (status != eslOK) esl_fatal("Writing alignment file failed with error %d\n", status);
+ }
+
+ /* Clean up for this msa */
+ if(msa != NULL) { esl_msa_Destroy(msa); msa = NULL; }
+ if(abc_ct != NULL) { esl_Free2D((void **) abc_ct, msa->alen); abc_ct = NULL; }
+ if(pp_ct != NULL) { esl_Free2D((void **) pp_ct, msa->alen); pp_ct = NULL; }
+ if(i_am_rf != NULL) { free(i_am_rf); i_am_rf = NULL; }
+ if(rf2a_map != NULL) { free(rf2a_map); rf2a_map = NULL; }
+ } /* end loop over msa's */
+ if (nali == 0) esl_fatal("No alignments found in file %s\n", alifile);
+ } /* end of 'if (! esl_opt_IsOn(go, "--small"))' */
+
+ else
+ { /* --small enabled */
+ /* First, a paranoid check first, the following should never be false based on earlier checks */
+ if((! esl_opt_IsOn(go, "--seq-r")) && (! esl_opt_IsOn(go, "--seq-k"))) esl_fatal("--small requires either --seq-r or --seq-k");
+ /* We've already read list file <f>, seqlist holds the seqlist_n sequences read from <f> (<f> from either --seq-k <f> or --seq-r <f>) */
+ seqname_keyhash = esl_keyhash_Create();
+ for (n = 0; n < seqlist_n; n++)
+ {
+ status = esl_keyhash_Store(seqname_keyhash, seqlist[n], -1, NULL);
+ if(status == eslEDUP) { esl_fatal("Error sequence %s listed twice in a input list file.", seqlist[n]); }
+ else if (status != eslOK) { esl_fatal("Error adding sequence %s to keyhash", seqlist[n]); }
+ }
+
+ while ((status = esl_msafile2_RegurgitatePfam(afp2, ofp,
+ -1, -1, -1, -1, /* don't care about max width of fields */
+ TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, /* regurgitate all non-seq info */
+ esl_opt_IsOn(go, "--seq-k") ? seqname_keyhash : NULL, /* if --seq-k <f> keep seqs from list file <f> */
+ esl_opt_IsOn(go, "--seq-r") ? seqname_keyhash : NULL, /* if --seq-r <f> remove seqs from list file <f> */
+ NULL, NULL, -1, '.', &nseq_read, &nseq_regurged)) == eslOK)
+ {
+ nali++;
+ if (esl_opt_IsOn(go, "--seq-k") && (nseq_regurged != seqlist_n))
+ esl_fatal("Error, in alignment %d, did not find %d of the sequences listed in %s", nali, (seqlist_n - nseq_regurged), esl_opt_GetString(go, "--seq-k"));
+ else if (esl_opt_IsOn(go, "--seq-r") && ((nseq_read - nseq_regurged) != seqlist_n))
+ esl_fatal("Error, in alignment %d, did not find %d of the sequences listed in %s", nali, (seqlist_n - (nseq_read - nseq_regurged)), esl_opt_GetString(go, "--seq-r"));
+ }
+ }
+
+ /* Cleanup, normal return
+ */
+ if(seqlist != NULL) {
+ for(n = 0; n < seqlist_n; n++) if(seqlist[n] != NULL) free(seqlist[n]);
+ free(seqlist);
+ }
+
+ if(esl_opt_IsOn(go, "-o")) {
+ fclose(ofp);
+ if(nali > 1) printf("# %d alignments saved to file %s.\n", nali, esl_opt_GetString(go, "-o"));
+ else printf("# Alignment saved to file %s.\n", esl_opt_GetString(go, "-o"));
+ }
+ if(treefp != NULL) {
+ fclose(treefp);
+ printf("# Tree(s) saved in Newick format to file %s.\n", esl_opt_GetString(go, "--tree"));
+ }
+ if(mxfp != NULL) {
+ fclose(mxfp);
+ printf("# Distance matri{x,ces} saved to file %s.\n", esl_opt_GetString(go, "--c-mx"));
+ }
+
+ if (esl_opt_GetBoolean(go, "--small")) esl_msafile2_Close(afp2);
+ else esl_msafile_Close(afp);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+
+ return 0;
+}
+
+
+/* write_rf_given_alen
+ *
+ * Given an MSA and a char string of 1s and 0s (a lanemask) of length
+ * msa->alen, write/rewrite RF positions as 'x' (non-gap) for 1, '.' (gap) for 0.
+ * If RF already exists AND do_keep_rf_chars == TRUE, do not modify non-gap RF columns
+ * if they are within mask ('1').
+ */
+static int
+write_rf_given_alen(ESL_MSA *msa, char *errbuf, int *i_am_rf, int do_keep_rf_chars, char *amask, int amask_len)
+{
+ int status;
+ int64_t apos;
+
+ /* contract check, rfgiven_mask must be exact length of msa */
+ if(amask == NULL) ESL_FAIL(eslEINVAL, errbuf, "--mask2rf mask is NULL in write_rf_given, this shouldn't happen.\n");
+ if(amask_len != (int) strlen(amask)) { ESL_FAIL(eslEINVAL, errbuf, "write_rf_given_alen(), passed in mask len (%d) is not equal to actual mask length (%d)\n", amask_len, (int) strlen(amask)); }
+ if(amask_len != msa->alen)
+ ESL_FAIL(eslEINVAL, errbuf, "--mask2rf mask length: %d is not equal to the MSA length (%" PRId64 ")\n",
+ amask_len, msa->alen);
+ if(msa->rf == NULL) {
+ ESL_ALLOC(msa->rf, sizeof(char) * (msa->alen+1));
+ for (apos = 1; apos <= msa->alen; apos++) msa->rf[(apos-1)] = '.';
+ }
+
+ for (apos = 1; apos <= msa->alen; apos++) {
+ if (amask[(apos-1)] == '0') msa->rf[(apos-1)] = '.';
+ else if(amask[(apos-1)] == '1') {
+ if((! do_keep_rf_chars) || (i_am_rf == NULL) || (! i_am_rf[(apos-1)])) msa->rf[(apos-1)] = 'x'; /* else, msa has RF nongap char there already, leave it alone */
+ }
+ else ESL_FAIL(eslEINVAL, errbuf, "--mask2rf mask char number %" PRId64 " is not a 1 nor a 0, but a %c\n", apos, amask[(apos-1)]);
+ }
+
+ msa->rf[msa->alen] = '\0';
+ return eslOK;
+ ERROR:
+ return status;
+}
+
+/* write_rf_given_rflen
+ *
+ * Given an MSA and a char string of 1s and 0s (a lanemask) that is
+ * the same length as the non-gap RF annotation in msa, rewrite msa
+ * RF based as 'x' (non-gap) for 1, '.' (gap) for 0. 1s indicate which
+ * non-gap RF columns to keep as 'x', and 0s indicate which non-gap
+ * RF columns to make gaps '.'.
+ * If RF already exists, do not modify non-gap RF columns if they are
+ * within mask ('1').
+ */
+static int
+write_rf_given_rflen(ESL_MSA *msa, char *errbuf, int *i_am_rf, int do_keep_rf_chars, char *mask_for_rf, int mask_for_rf_len)
+{
+ int64_t apos, rfpos;
+
+ /* contract check, mask must be exact length of msa */
+ if(mask_for_rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "--mask2rf mask is NULL in write_rf_given, this shouldn't happen.\n");
+ if(msa->rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "--mask2rf mask requires RF annotation in MSA (try -g)\n");
+ if(mask_for_rf_len != (int) strlen(mask_for_rf)) { ESL_FAIL(eslEINVAL, errbuf, "write_rf_given_rflen(), passed in mask len (%d) is not equal to actual mask length (%d).\n", mask_for_rf_len, (int) strlen(mask_for_rf)); }
+
+ rfpos = 0;
+ for (apos = 1; apos <= msa->alen; apos++) {
+ if(! esl_abc_CIsGap(msa->abc, msa->rf[(apos-1)])) {
+ rfpos++;
+ if (mask_for_rf[(rfpos-1)] == '0') msa->rf[(apos-1)] = '.';
+ else if(mask_for_rf[(rfpos-1)] == '1') {
+ if((! do_keep_rf_chars) || (i_am_rf == NULL) || (! i_am_rf[(apos-1)])) msa->rf[(apos-1)] = 'x'; /* else, msa has RF nongap char there already, leave it alone */
+ }
+ }
+ else msa->rf[(apos-1)] = '.';
+ }
+ if(rfpos != mask_for_rf_len) { ESL_FAIL(eslEINVAL, errbuf, "write_rf_given_rflen(), RF non-gap length (consensus length) (%" PRId64 ") is not equal to mask length (%d)\n", rfpos, mask_for_rf_len); }
+
+ msa->rf[msa->alen] = '\0';
+ return eslOK;
+}
+
+/* individualize_consensus
+ *
+ * Given an MSA with a consensus structure impose it to create
+ * individual secondary structures. Simple rule, for consensus
+ * bp i,j if seq positions i and j are both non-gaps seq i,j are
+ * paired, if >= 1 is a gap, they're not paired.
+ */
+static int
+individualize_consensus(const ESL_GETOPTS *go, char *errbuf, ESL_MSA *msa)
+{
+ int64_t apos;
+ int i;
+ int *cct = NULL; /* 0..alen-1 base pair partners array for consensus */
+ int *ct = NULL; /* 0..alen-1 base pair partners array for current sequence */
+ char *ss = NULL; /* individual secondary structure we've built */
+ char *ss_cons_nopseudo = NULL; /* no-pseudoknot version of consensus structure */
+ int status;
+
+ if(msa->ss_cons == NULL) ESL_FAIL(eslEINVAL, errbuf, "--sindi requires MSA to have consensus structure annotation.\n");
+ if(! (msa->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINVAL, errbuf, "individualize_consensus() MSA is not digitized.\n");
+
+ ESL_ALLOC(cct, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(ct, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(ss, sizeof(char) * (msa->alen+1));
+ ESL_ALLOC(ss_cons_nopseudo, sizeof(char) * (msa->alen+1));
+
+ esl_wuss_nopseudo(msa->ss_cons, ss_cons_nopseudo);
+ if (esl_wuss2ct(ss_cons_nopseudo, msa->alen, cct) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "Consensus structure string is inconsistent.");
+
+ /* go through each position of each sequence,
+ if it's a gap and it is part of a base pair, remove that base pair */
+ for (i = 0; i < msa->nseq; i++)
+ {
+ esl_vec_ICopy(cct, (msa->alen+1), ct);
+ for (apos = 1; apos <= msa->alen; apos++)
+ if (esl_abc_XIsGap(msa->abc, msa->ax[i][apos]))
+ {
+ if (ct[apos] != 0) ct[ct[apos]] = 0;
+ ct[apos] = 0;
+ }
+ /* convert to WUSS SS string and append to MSA */
+ if (esl_ct2wuss(ct, msa->alen, ss) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "Unexpected error converting de-knotted bp ct array to wuss notation.");
+ esl_msa_AppendGR(msa, "SS", i, ss);
+ }
+ free(cct);
+ free(ct);
+ free(ss);
+ free(ss_cons_nopseudo);
+ return eslOK;
+
+ ERROR:
+ if (cct) free(cct);
+ if (ct) free(ct);
+ if (ss) free(ss);
+ if (ss_cons_nopseudo) free(ss_cons_nopseudo);
+ return status;
+}
+
+
+/* map_rfpos_to_apos
+ *
+ * Given an MSA, determine the alignment position of each
+ * non-gap RF (reference) position. The abc is only necessary
+ * for defining gap characters.
+ *
+ * rf2a_map[0..rfpos..rflen-1] = apos, apos is the alignment position (0..msa->alen-1) that
+ * is non-gap RF position rfpos+1 (for rfpos in 0..rflen-1)
+ */
+static int map_rfpos_to_apos(ESL_MSA *msa, ESL_ALPHABET *abc, char *errbuf, int **ret_i_am_rf, int **ret_rf2a_map, int *ret_rflen)
+{
+ int status;
+ int rflen = 0;
+ int *rf2a_map = NULL;
+ int *i_am_rf = NULL;
+ int rfpos = 0;
+ int apos = 0;
+
+ /* contract check */
+ if(msa->rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "Error, trying to map RF positions to alignment positions, but msa->rf is NULL.");
+
+ /* count non-gap RF columns */
+ for(apos = 0; apos < msa->alen; apos++) {
+ if((! esl_abc_CIsGap(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsMissing(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsNonresidue(abc, msa->rf[apos])))
+ {
+ rflen++;
+ /* I don't use esl_abc_CIsResidue() b/c that would return FALSE for 'x' with RNA and DNA */
+ }
+ }
+ /* build map */
+ ESL_ALLOC(i_am_rf, sizeof(int) * msa->alen);
+ ESL_ALLOC(rf2a_map, sizeof(int) * rflen);
+ for(apos = 0; apos < msa->alen; apos++) {
+ if((! esl_abc_CIsGap(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsMissing(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsNonresidue(abc, msa->rf[apos]))) {
+ i_am_rf[apos] = TRUE;
+ rf2a_map[rfpos++] = apos;
+ }
+ else {
+ i_am_rf[apos] = FALSE;
+ }
+ }
+ *ret_i_am_rf = i_am_rf;
+ *ret_rf2a_map = rf2a_map;
+ *ret_rflen = rflen;
+ return eslOK;
+
+ ERROR:
+ if(i_am_rf != NULL) free(i_am_rf);
+ if(rf2a_map != NULL) free(rf2a_map);
+ ESL_FAIL(status, errbuf, "Error, out of memory while mapping RF positions to alignment positions.");
+}
+
+
+/* read_sqfile
+ *
+ * Read all seqs in a sequence file and return them. Originally
+ * written for --trim option.
+ */
+static int read_sqfile(ESL_SQFILE *sqfp, const ESL_ALPHABET *abc, int nseq, ESL_SQ ***ret_sq)
+{
+ int status;
+ ESL_SQ **sq;
+ int i;
+
+ /* get seqs from sqfile */
+ ESL_ALLOC(sq, sizeof(ESL_SQ *) * (nseq + 1)); /* +1 for the last guy we allocate but don't use */
+ i = 0;
+ sq[i] = esl_sq_CreateDigital(abc);
+ while ((status = esl_sqio_Read(sqfp, sq[i])) == eslOK) {
+ i++;
+ if(i > nseq) esl_fatal("With --trim, sequence file must have same number seqs as in <msafile>\n");
+ sq[i] = esl_sq_CreateDigital(abc);
+ }
+ if (i != nseq) esl_fatal("With --trim, sequence file must have same number seqs as in <msafile>\n");
+ /* status should be eslEOF on normal end; if it isn't, deal w/ error */
+ esl_sq_Destroy(sq[i]); /* destroy final allocated but unused seq */
+
+ if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s):\n%s\n",
+ sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected error %d reading sequence file %s",
+ status, sqfp->filename);
+ esl_sqfile_Close(sqfp);
+ *ret_sq = sq;
+
+ return eslOK;
+
+ ERROR:
+ esl_fatal("Memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* trim_msa
+ *
+ * Given an MSA and unaligned 'trimmed' versions (subsequences) of all seqs in that MSA,
+ * replace all chars that have been trimmed away (not in subsequences) with gaps in the MSA.
+ *
+ * We remove all GR and GC markup from the msa, except for possibly #=GC RF if <do_keeprf>
+ * is TRUE, else we remove that too.
+ */
+static int trim_msa(ESL_MSA *msa, ESL_SQ **sq, int do_keeprf, char *errbuf)
+{
+ int status;
+ int i, r;
+ int apos, uapos;
+ int astart, aend;
+ int uastart, uaend;
+ char *offset;
+ char *aseq;
+ char *uaseq;
+ char *uasubseq;
+ int *a2ua_map;
+ int *ua2a_map;
+ int ualen;
+
+ if(! (msa->flags & eslMSA_DIGITAL))
+ ESL_FAIL(eslEINVAL, errbuf, "in trim_msa(), msa must be digitized.");
+
+ ESL_ALLOC(aseq, sizeof(char) * (msa->alen+1));
+
+ for(i = 0; i < msa->nseq; i++)
+ {
+ if (sq[i]->dsq == NULL) ESL_FAIL(eslEINVAL, errbuf, "in trim_msa(), sq's must be digitized.");
+ if (sq[i]->n == 0) ESL_FAIL(eslEINVAL, errbuf, "in trim_msa(), sq[%d] is zero-length\n", i);
+
+ ESL_ALLOC(a2ua_map, sizeof(int) * (msa->alen+1));
+ esl_vec_ISet(a2ua_map, (msa->alen+1), -1);
+ uapos = apos = 1;
+ while(apos <= msa->alen)
+ {
+ while(apos <= msa->alen && esl_abc_XIsGap(msa->abc, msa->ax[i][apos])) apos++;
+ if(apos <= msa->alen) a2ua_map[apos] = uapos++;
+ apos++;
+ }
+ ualen = uapos;
+ ESL_ALLOC(ua2a_map, sizeof(int) * (ualen+1));
+ ua2a_map[0] = -1;
+ for(apos = 1; apos <= msa->alen; apos++)
+ if(a2ua_map[apos] != -1)
+ ua2a_map[a2ua_map[apos]] = apos;
+
+ ESL_ALLOC(uasubseq, sizeof(char) * (sq[i]->n+1));
+ esl_abc_Textize(msa->abc, sq[i]->dsq, sq[i]->n, uasubseq);
+ esl_abc_Textize(msa->abc, msa->ax[i], msa->alen, aseq);
+
+ esl_strdup(aseq, -1, &(uaseq));
+ esl_strdealign(uaseq, uaseq, "-_.~", NULL);
+ offset = strstr(uaseq, uasubseq); /* we'll replace the first occurence of uasubseq in uaseq */
+ if(offset == NULL) ESL_FAIL(eslEINVAL, errbuf, "in trim_msa(), sq[%d] is not a subseq of msa seq %d\n", i, i);
+ uastart = offset - uaseq + 1;
+ uaend = uastart + strlen(uasubseq) - 1;
+ astart = ua2a_map[uastart];
+ aend = ua2a_map[uaend];
+ free(ua2a_map);
+ free(a2ua_map);
+
+ for(apos = 1; apos < astart; apos++) msa->ax[i][apos] = msa->abc->K; /* make it a gap */
+ for(apos = aend + 1; apos <= msa->alen; apos++) msa->ax[i][apos] = msa->abc->K; /* make it a gap */
+ free(uaseq);
+ free(uasubseq);
+ }
+
+ /* Free all per-column annotation that might now be invalid */
+ if(! do_keeprf && msa->rf != NULL) { free(msa->rf); msa->rf = NULL; }
+ if(msa->ss_cons != NULL) { free(msa->ss_cons); msa->ss_cons = NULL; }
+ if(msa->sa_cons != NULL) { free(msa->sa_cons); msa->sa_cons = NULL; }
+ if(msa->pp_cons != NULL) { free(msa->pp_cons); msa->pp_cons = NULL; }
+
+ /* Free all per-residue annotation (alternatively, we could just add gaps to the gaps we've created by
+ * trimming, but this would cause problems for SS annotation, for example. */
+ if(msa->ss != NULL) {
+ for(i = 0; i < msa->nseq; i++) if(msa->ss[i] != NULL) { free(msa->ss[i]); }
+ free(msa->ss);
+ msa->ss = NULL;
+ }
+ if(msa->sa != NULL) {
+ for(i = 0; i < msa->nseq; i++) if(msa->sa[i] != NULL) { free(msa->sa[i]); }
+ free(msa->sa);
+ msa->sa = NULL;
+ }
+ if(msa->pp != NULL) {
+ for(i = 0; i < msa->nseq; i++) if(msa->pp[i] != NULL) { free(msa->pp[i]); }
+ free(msa->pp);
+ msa->pp = NULL;
+ }
+ if(msa->ngr > 0) {
+ for(r = 0; r < msa->ngr; r++) {
+ for(i = 0; i < msa->nseq; i++) if(msa->gr[r][i] != NULL) { free(msa->gr[r][i]); }
+ free(msa->gr[r]);
+ }
+ if(msa->gr_idx != NULL) { esl_keyhash_Destroy(msa->gr_idx); msa->gr_idx = NULL; }
+ msa->gr_idx = NULL;
+ free(msa->gr);
+ msa->gr = NULL;
+ msa->ngr = 0;
+ }
+
+ free(aseq);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* prune_msa_based_on_posteriors
+ *
+ * Given an MSA and a minimum posterior probability (PP) <min_pp>
+ * value to keep, replace all residues that have posterior
+ * probabilities < <min_pp> with gaps. The PP values for these
+ * residues are replaced with gaps as well.
+ *
+ * We remove all GF, GS, GR and GC markup from the msa, except for GR
+ * PP annotation and parsed GC annotation, like SS_cons, RF, SA_cons
+ * and PP_cons.
+ */
+static int prune_msa_based_on_posteriors(ESL_MSA *msa, float min_pp, char *errbuf)
+{
+ double ppminA[11]; /* values of the 11 possible nongap PP values, '0'-'9' and '*', hardcoded here */
+ float max_pp; /* max allowable min_pp value */
+ int i, r; /* counters */
+ int min_ppidx; /* index in ppminA[] corresponding to minimum allowed PP */
+ int apos;
+ int ppidx;
+
+ ppminA[0] = 0.00;
+ ppminA[1] = 0.05;
+ ppminA[2] = 0.15;
+ ppminA[3] = 0.25;
+ ppminA[4] = 0.35;
+ ppminA[5] = 0.45;
+ ppminA[6] = 0.55;
+ ppminA[7] = 0.65;
+ ppminA[8] = 0.75;
+ ppminA[9] = 0.85;
+ ppminA[10] = 0.95;
+ max_pp = 0.95;
+
+ if(! (msa->flags & eslMSA_DIGITAL))
+ ESL_FAIL(eslEINVAL, errbuf, "in prune_msa_based_on_posteriors(), msa must be digitized.");
+ if(msa->pp == NULL)
+ ESL_FAIL(eslEINVAL, errbuf, "in prune_msa_based_on_posteriors(), msa has no PP annotation.");
+
+ /* determine the index in ppminA of the minimum allowed PP */
+ min_ppidx = 0;
+ /* special case, check to see if max possible min_pp was passed in, this is 0.95 */
+ if(esl_FCompare(min_pp, max_pp, eslSMALLX1) == eslOK) {
+ min_ppidx = 10;
+ }
+ else if(min_pp > max_pp) {
+ ESL_FAIL(eslERANGE, errbuf, "in prune_msa_based_on_posteriors(), min_pp (%f) is too large (max allowed is %f)\n", min_pp, max_pp);
+ }
+ else {
+ while((min_ppidx < 10) && (min_pp > ppminA[min_ppidx])) {
+ min_ppidx++;
+ }
+ }
+
+ /* replace all PP values less than our minimum, and their associated residues, with gaps */
+ for(i = 0; i < msa->nseq; i++) {
+ /* rename the sequence */
+ if(msa->pp[i] != NULL) {
+ for(apos = 1; apos <= msa->alen; apos++) {
+ /* be wary off the off-by-one b/t msa->ax and msa->pp */
+ if(! esl_abc_CIsGap(msa->abc, msa->pp[i][apos-1])) {
+ ppidx = get_pp_idx(msa->abc, msa->pp[i][apos-1]);
+ if(ppidx < min_ppidx) { /* not a gap, and less than our minimum */
+ msa->ax[i][apos] = msa->abc->K; /* make this residue a gap */
+ msa->pp[i][apos-1] = '.'; /* make the PP for this residue a gap */
+ }
+ }
+ }
+ }
+ }
+
+ /* Free annotation in MSA because we can't be sure any of it is
+ * valid anymore -- we've removed residues from the sequences (!)
+ */
+
+ /* Free all per-file (GF) annotation */
+ for(r = 0; r < msa->ngf; r++) {
+ if(msa->gf[r] != NULL) free(msa->gf[r]);
+ if(msa->gf_tag[r] != NULL) free(msa->gf_tag[r]);
+ }
+ if(msa->gf != NULL) { free(msa->gf); msa->gf = NULL; }
+ if(msa->gf_tag != NULL) { free(msa->gf_tag); msa->gf_tag = NULL; }
+ msa->ngf = 0;
+
+ /* Free all per-column (GC) annotation that might now be invalid,
+ * we leave the parsed GC annotation, like SS_cons
+ */
+ for(r = 0; r < msa->ngc; r++) {
+ if(msa->gc[r] != NULL) free(msa->gc[r]);
+ if(msa->gc_tag[r] != NULL) free(msa->gc_tag[r]);
+ }
+ if(msa->gc != NULL) { free(msa->gc); msa->gc = NULL; }
+ if(msa->gc_tag != NULL) { free(msa->gc_tag); msa->gc_tag = NULL; }
+ if(msa->gc_idx != NULL) { esl_keyhash_Destroy(msa->gc_idx); msa->gc_idx = NULL; }
+ msa->ngc = 0;
+
+ /* Free all per-sequence (GS) annotation */
+ for(r = 0; r < msa->ngc; i++) {
+ if(msa->gs[r] != NULL) {
+ for(i = 0; i < msa->nseq; i++) {
+ free(msa->gs[r][i]);
+ }
+ free(msa->gs[r]);
+ }
+ if(msa->gc_tag[r] != NULL) free(msa->gc_tag[r]);
+ }
+ if(msa->gs != NULL) { free(msa->gs); msa->gs = NULL; }
+ if(msa->gs_tag != NULL) { free(msa->gs_tag); msa->gs_tag = NULL; }
+ if(msa->gs_idx != NULL) { esl_keyhash_Destroy(msa->gs_idx); msa->gs_idx = NULL; }
+ msa->ngs = 0;
+
+ /* Free all per-residue (GR) annotation (except PP) */
+ if(msa->ss != NULL) {
+ for(i = 0; i < msa->nseq; i++) if(msa->ss[i] != NULL) { free(msa->ss[i]); }
+ free(msa->ss);
+ msa->ss = NULL;
+ }
+ if(msa->sa != NULL) {
+ for(i = 0; i < msa->nseq; i++) if(msa->sa[i] != NULL) { free(msa->sa[i]); }
+ free(msa->sa);
+ msa->sa = NULL;
+ }
+ if(msa->ngr > 0) {
+ for(r = 0; r < msa->ngr; r++) {
+ for(i = 0; i < msa->nseq; i++) if(msa->gr[r][i] != NULL) { free(msa->gr[r][i]); }
+ free(msa->gr[r]);
+ }
+ if(msa->gr_idx != NULL) { esl_keyhash_Destroy(msa->gr_idx); msa->gr_idx = NULL; }
+ msa->gr_idx = NULL;
+ free(msa->gr);
+ msa->gr = NULL;
+ msa->ngr = 0;
+ }
+
+ return eslOK;
+}
+
+/* get_pp_idx
+ *
+ * Given a #=GR PP or #=GC PP_cons character, return the appropriate index
+ * in a pp_ct[] vector.
+ * '0' return 0;
+ * '1' return 1;
+ * '2' return 2;
+ * '3' return 3;
+ * '4' return 4;
+ * '5' return 5;
+ * '6' return 6;
+ * '7' return 7;
+ * '8' return 8;
+ * '9' return 9;
+ * '*' return 10;
+ * gap return 11;
+ *
+ * Anything else (including missing or nonresidue) return -1;
+ *
+ * This mapping of PP chars to return values should probably be
+ * stored in some internal map structure somewhere.
+ */
+static int get_pp_idx(ESL_ALPHABET *abc, char ppchar)
+{
+ if(esl_abc_CIsGap(abc, ppchar)) return 11;
+ if(ppchar == '*') return 10;
+ if(ppchar == '9') return 9;
+ if(ppchar == '8') return 8;
+ if(ppchar == '7') return 7;
+ if(ppchar == '6') return 6;
+ if(ppchar == '5') return 5;
+ if(ppchar == '4') return 4;
+ if(ppchar == '3') return 3;
+ if(ppchar == '2') return 2;
+ if(ppchar == '1') return 1;
+ if(ppchar == '0') return 0;
+ return -1;
+}
+
+/* get_tree_order
+ *
+ * Given a tree, determine the branching order of the sequences
+ * it represents by traversing it preorder.
+ */
+static int get_tree_order(ESL_TREE *T, char *errbuf, int **ret_order)
+{
+ int status;
+ int opos = 0;
+ int nd;
+ int *order;
+ ESL_STACK *pda;
+ ESL_ALLOC(order, sizeof(int) * T->N);
+
+ opos = 0;
+ pda = esl_stack_ICreate();
+ esl_stack_IPush(pda, T->right[0]);
+ esl_stack_IPush(pda, T->left[0]);
+ while (esl_stack_IPop(pda, &nd) != eslEOD)
+ {
+ if (nd > 0) { /* a node */
+ esl_stack_IPush(pda, T->right[nd]); /* index for right child */
+ esl_stack_IPush(pda, T->left[nd]); /* index for left child */
+ }
+ else /* nd <= 0, a child */
+ order[opos++] = nd * -1;
+ }
+ *ret_order = order;
+ esl_stack_Destroy(pda);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* reorder_msa
+ *
+ * Given an array specifying a new order for the sequences in
+ * the MSA, reorder it by swapping pointers.
+ */
+static int
+reorder_msa(ESL_MSA *msa, int *order, char *errbuf)
+{
+ int status;
+ char **tmp;
+ ESL_ALLOC(tmp, sizeof(char *) * msa->nseq);
+ int i, a;
+
+ /* contract check */
+ /* 'order' must be have nseq elements, elements must be in range [0..nseq-1], no duplicates */
+ int *covered;
+ ESL_ALLOC(covered, sizeof(int) * msa->nseq);
+ esl_vec_ISet(covered, msa->nseq, 0);
+ for(i = 0; i < msa->nseq; i++) {
+ /* printf("order[i:%4d]: %4d\n", i, order[i]);
+ printf("covered[order[i:%4d]]: %4d\n", i, covered[order[i]]);
+ */
+ if(covered[order[i]]) ESL_FAIL(eslEINVAL, errbuf, "reorder_msa() order array has duplicate entries for i: %d\n", i);
+ covered[order[i]] = 1;
+ }
+ free(covered);
+
+ /* swap aseq or ax (one or the other must be non-NULL) */
+ if(msa->flags & eslMSA_DIGITAL) { /* digital MSA */
+ ESL_DSQ **tmp_dsq;
+ ESL_ALLOC(tmp_dsq, sizeof(ESL_DSQ *) * msa->nseq);
+ for(i = 0; i < msa->nseq; i++) tmp_dsq[i] = msa->ax[i];
+ for(i = 0; i < msa->nseq; i++) msa->ax[i] = tmp_dsq[order[i]];
+ free(tmp_dsq);
+ }
+ else { /* text MSA */
+ for(i = 0; i < msa->nseq; i++) tmp[i] = msa->aseq[i];
+ for(i = 0; i < msa->nseq; i++) msa->aseq[i] = tmp[order[i]];
+ }
+
+ /* swap sqnames (mandatory) */
+ for(i = 0; i < msa->nseq; i++) tmp[i] = msa->sqname[i];
+ for(i = 0; i < msa->nseq; i++) msa->sqname[i] = tmp[order[i]];
+
+ /* swap sqacc, if they exist */
+ if(msa->sqacc != NULL) {
+ for(i = 0; i < msa->nseq; i++) tmp[i] = msa->sqacc[i];
+ for(i = 0; i < msa->nseq; i++) msa->sqacc[i] = tmp[order[i]];
+ }
+
+ /* swap sqdesc, if they exist */
+ if(msa->sqdesc != NULL) {
+ for(i = 0; i < msa->nseq; i++) tmp[i] = msa->sqdesc[i];
+ for(i = 0; i < msa->nseq; i++) msa->sqdesc[i] = tmp[order[i]];
+ }
+
+ /* swap ss, if they exist */
+ if(msa->ss != NULL) {
+ for(i = 0; i < msa->nseq; i++) tmp[i] = msa->ss[i];
+ for(i = 0; i < msa->nseq; i++) msa->ss[i] = tmp[order[i]];
+ }
+
+ /* swap sa, if they exist */
+ if(msa->sa != NULL) {
+ for(i = 0; i < msa->nseq; i++) tmp[i] = msa->sa[i];
+ for(i = 0; i < msa->nseq; i++) msa->sa[i] = tmp[order[i]];
+ }
+
+ /* swap pp, if they exist */
+ if(msa->pp != NULL) {
+ for(i = 0; i < msa->nseq; i++) tmp[i] = msa->pp[i];
+ for(i = 0; i < msa->nseq; i++) msa->pp[i] = tmp[order[i]];
+ }
+
+ /* swap gs annotation, if it exists */
+ for(a = 0; a < msa->ngs; a++) {
+ for(i = 0; i < msa->nseq; i++) tmp[i] = msa->gs[a][i];
+ for(i = 0; i < msa->nseq; i++) msa->gs[a][i] = tmp[order[i]];
+ }
+
+ /* swap gr annotation, if it exists */
+ for(a = 0; a < msa->ngr; a++) {
+ for(i = 0; i < msa->nseq; i++) tmp[i] = msa->gr[a][i];
+ for(i = 0; i < msa->nseq; i++) msa->gr[a][i] = tmp[order[i]];
+ }
+ free(tmp);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* read_mask_file
+ *
+ * Given an open file pointer, read the first token of the
+ * file and return it as *ret_mask. It must contain only
+ * '0' or '1' characters.
+ *
+ * Returns: eslOK on success.
+ */
+int
+read_mask_file(char *filename, char *errbuf, char **ret_mask, int *ret_mask_len)
+{
+ int status;
+ ESL_FILEPARSER *efp;
+ char *tok;
+ char *mask;
+ int toklen;
+ int n;
+
+ if (esl_fileparser_Open(filename, NULL, &efp) != eslOK) ESL_FAIL(eslFAIL, errbuf, "failed to open %s in read_mask_file\n", filename);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(eslFAIL, errbuf, "failed to read a single token from %s\n", filename);
+
+ ESL_ALLOC(mask, sizeof(char) * (toklen+1));
+ for(n = 0; n < toklen; n++) {
+ if((tok[n] == '0') || (tok[n] == '1')) {
+ mask[n] = tok[n];
+ }
+ else { ESL_FAIL(eslFAIL, errbuf, "read a non-0 and non-1 character (%c) in the mask file %s\n", tok[n], filename); }
+ }
+ mask[n] = '\0';
+
+ *ret_mask = mask;
+ *ret_mask_len = n;
+ esl_fileparser_Close(efp);
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+
+/* expand_msa2mask
+ *
+ * Given an MSA <msa> and a lanemask <xmask> with exactly msa->alen 1s in it.
+ * Add 100% gap columns in between each column as dictated by <xmask>.
+ *
+ * For example if lanemask is 100101, msa->alen is 3, we add 2 100% gap
+ * columns after column 1, and 1 100% gap column after column 2, to make
+ * the msa length = length(xmask) = 6.
+ */
+static int
+expand_msa2mask(char *errbuf, ESL_MSA *msa, char *xmask, ESL_MSA **newmsa)
+{
+ int status;
+ int mpos;
+ int masklen;
+ int *nzeroesA;
+ int nones = 0;
+
+ if(xmask == NULL) ESL_FAIL(eslEINVAL, errbuf, "expand_msa2mask(), xmask is NULL.");
+
+ masklen = strlen(xmask);
+ /* count 1s in xmask */
+ for (mpos = 0; mpos < masklen; mpos++) {
+ if (xmask[mpos] == '1') nones++;
+ else if(xmask[mpos] == '0') ; /* do nothing */
+ else ESL_FAIL(eslEINVAL, errbuf, "--xmask mask char number %d is not a 1 nor a 0, but a %c\n", mpos+1, xmask[mpos]);
+ }
+ if(nones != msa->alen) ESL_FAIL(eslEINVAL, errbuf, "expand_msa2mask(), number of 1s in --xmask file: %d != msa->alen: %" PRId64 ", they must be equal.", nones, msa->alen);
+
+ /* determine number of 0s after each consensus column */
+ nones = 0;
+ ESL_ALLOC(nzeroesA, sizeof(int) * (masklen+1));
+ esl_vec_ISet(nzeroesA, (masklen+1), 0);
+ for (mpos = 0; mpos < masklen; mpos++) {
+ if (xmask[mpos] == '1') nones++;
+ else if(xmask[mpos] == '0') nzeroesA[nones]++;
+ else ESL_FAIL(eslEINVAL, errbuf, "--xmask mask char number %d is not a 1 nor a 0, but a %c\n", mpos+1, xmask[mpos]);
+ }
+
+ /*int i;
+ for (i = 0; i <= nones; i++) {
+ printf("nzeroes[%3d]: %3d\n", i, nzeroesA[i]);
+ }*/
+
+ /* add the 100% gap columns */
+ if((status = add_gap_columns_to_msa(errbuf, msa, nzeroesA, newmsa, TRUE)) != eslOK) return status ;
+ /* new alen should equal masklen */
+ if((*newmsa)->alen != masklen) ESL_FAIL(eslEINVAL, errbuf, "expand_msa2mask(), new msa->alen: (%" PRId64 ") != length of mask (%d), this shouldn't happen.", (*newmsa)->alen, masklen);
+ free(nzeroesA);
+
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* Function: msa_median_length()
+ *
+ * Purpose: Returns the median (unaligned) length of
+ * the sequences in an alignment.
+ */
+static int
+msa_median_length(ESL_MSA *msa)
+{
+ int status;
+ int *len;
+ int i;
+ int median;
+ ESL_SQ *sq;
+ sq = esl_sq_CreateDigital(msa->abc);
+
+ ESL_ALLOC(len, sizeof(int) * msa->nseq);
+ for (i = 0; i < msa->nseq; i++) {
+ esl_sq_GetFromMSA(msa, i, sq);
+ len[i] = sq->n;
+ esl_sq_Reuse(sq);
+ /* printf("i: %d len: %d\n", i, len[i]);*/
+ }
+
+ qsort(len, msa->nseq, sizeof(int), compare_ints);
+
+ /* for (i = 0; i < msa->nseq; i++) {
+ printf("i: %d len: %d\n", i, len[i]);
+ }
+ */
+
+ median = len[msa->nseq / 2];
+ free(len);
+
+ esl_sq_Destroy(sq);
+ return median;
+
+ ERROR:
+ esl_fatal("msa_median_length() memory allocation error.");
+ return 0.; /* NEVERREACHED */
+}
+
+
+/* Function: msa_remove_seqs_below_minlen()
+ *
+ * Purpose: Remove sequences in MSA whose dealigned length is less than a minimum length.
+ * If <i_am_rf> is non-NULL, only consider positions that are nongap RF.
+ */
+static int
+msa_remove_seqs_below_minlen(ESL_MSA *msa, float minlen, int *i_am_rf, ESL_MSA **ret_new_msa)
+{
+ int status;
+ int *useme; /* [0..msa->nseq-1]: 1 to keep sequence, 0 to remove it */
+ int i, apos; /* sequence index, alignment position */
+ int64_t len; /* length of current sequence, either nongap length (if i_am_rf == NULL) or nongap RF length (if i_am_rf != NULL) */
+
+ ESL_MSA *new_msa;
+ ESL_SQ *sq;
+ sq = esl_sq_CreateDigital(msa->abc);
+
+ ESL_ALLOC(useme, sizeof(int) * msa->nseq);
+ for (i = 0; i < msa->nseq; i++) {
+ if(i_am_rf != NULL) {
+ len = 0;
+ for(apos = 1; apos <= msa->alen; apos++) {
+ if(i_am_rf[(apos-1)] && (! esl_abc_XIsGap(msa->abc, msa->ax[i][apos]))) len++;
+ }
+ }
+ else { /* i_am_rf is NULL, consider the entire sequence */
+ esl_sq_GetFromMSA(msa, i, sq);
+ len = sq->n;
+ esl_sq_Reuse(sq);
+ }
+ useme[i] = ((float) len >= minlen) ? TRUE : FALSE;
+ /*printf("useme[i:%d]: %d (len: %" PRId64 ", minlen: %.2f)\n", i, useme[i], len, minlen);*/
+ }
+
+ if(esl_vec_ISum(useme, msa->nseq) == 0) esl_fatal("No sequences at or above minimum allowed length.");
+ if((status = esl_msa_SequenceSubset(msa, useme, &new_msa)) != eslOK) esl_fatal("esl_msa_SequenceSubset() had a problem.");
+ free(useme);
+ esl_sq_Destroy(sq);
+ *ret_new_msa = new_msa;
+ return eslOK;
+
+ ERROR:
+ esl_fatal("msa_remove_seqs_below_minlen() memory allocation error.");
+ return eslOK; /* NEVERREACHED */
+}
+
+
+/* Function: msa_remove_seqs_above_maxlen()
+ *
+ * Purpose: Remove sequences in MSA whose dealigned length is more than a maximum length.
+ */
+static int
+msa_remove_seqs_above_maxlen(ESL_MSA *msa, float maxlen, ESL_MSA **ret_new_msa)
+{
+ int status;
+ int *useme;
+ int i;
+
+ ESL_MSA *new_msa;
+ ESL_SQ *sq;
+ sq = esl_sq_CreateDigital(msa->abc);
+
+ ESL_ALLOC(useme, sizeof(int) * msa->nseq);
+ for (i = 0; i < msa->nseq; i++) {
+ esl_sq_GetFromMSA(msa, i, sq);
+ useme[i] = ((float) sq->n <= maxlen) ? TRUE : FALSE;
+ /*printf("useme[i:%d]: %d\n", i, useme[i]);*/
+ esl_sq_Reuse(sq);
+ }
+
+ if(esl_vec_ISum(useme, msa->nseq) == 0) esl_fatal("No sequences are less than maximum allowed length.");
+ if((status = esl_msa_SequenceSubset(msa, useme, &new_msa)) != eslOK) esl_fatal("esl_msa_SequenceSubset() had a problem.");
+ free(useme);
+ esl_sq_Destroy(sq);
+ *ret_new_msa = new_msa;
+ return eslOK;
+
+ ERROR:
+ esl_fatal("msa_remove_seqs_above_maxlen() memory allocation error.");
+ return eslOK; /* NEVERREACHED */
+}
+
+/* Function: msa_remove_truncated_seqs()
+ *
+ * Purpose: Remove sequences in MSA that have all gaps in the first <ntrunc> 5' leading
+ * non-gap RF columns OR the last <ntrunc> 3' leading non-gap RF columns
+ */
+static int
+msa_remove_truncated_seqs(ESL_MSA *msa, char *errbuf, int ntrunc, int *i_am_rf, ESL_MSA **ret_new_msa)
+{
+ int status;
+ int *useme;
+ int i;
+ int leading_okay, trailing_okay;
+ int apos, rfpos_ct;
+ int nused = 0;
+ ESL_MSA *new_msa;
+
+ /* contract check */
+ if(! (msa->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINVAL, errbuf, "in msa_remove_truncated_seqs(), msa must be digitized.");
+ if(msa->rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "No #=GC RF markup in alignment, it is needed for --detrunc.");
+ if(i_am_rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "internal error, msa_remove_truncated_seq() i_am_rf is NULL.");
+
+ ESL_ALLOC(useme, sizeof(int) * msa->nseq);
+
+ for(i = 0; i < msa->nseq; i++) {
+ /* if ALL of the first 5' <ntrunc> non-gap RF columns are gaps in this seq, we'll remove it */
+ leading_okay = FALSE;
+ rfpos_ct = 0;
+ apos = 1;
+ while(!leading_okay && (rfpos_ct < ntrunc) && (apos <= msa->alen)) {
+ if(i_am_rf[(apos-1)]) {
+ rfpos_ct++;
+ if(! esl_abc_XIsGap(msa->abc, msa->ax[i][apos])) leading_okay = TRUE;
+ }
+ apos++;
+ }
+
+ trailing_okay = FALSE;
+ rfpos_ct = 0;
+ apos = msa->alen;
+ while(!trailing_okay && (rfpos_ct < ntrunc) && (apos >= 1)) {
+ if(i_am_rf[(apos-1)]) {
+ rfpos_ct++;
+ if(! esl_abc_XIsGap(msa->abc, msa->ax[i][apos])) trailing_okay = TRUE;
+ }
+ apos--;
+ }
+ useme[i] = (leading_okay && trailing_okay) ? TRUE : FALSE;
+ if(useme[i]) nused++;
+ }
+ if(nused == 0) ESL_FAIL(eslEINVAL, errbuf, "--detrunc removed ALL sequences!");
+ if((status = esl_msa_SequenceSubset(msa, useme, &new_msa)) != eslOK) esl_fatal("esl_msa_SequenceSubset() had a problem.");
+ free(useme);
+ *ret_new_msa = new_msa;
+ return eslOK;
+
+ ERROR:
+ ESL_FAIL(status, errbuf, "msa_remove_truncated_seqs(): memory allocation error.");
+ return eslOK; /* NEVERREACHED */
+}
+
+
+/* Function: msa_remove_seqs_with_ambiguities()
+ *
+ * Purpose: Remove sequences in MSA that have more than <max_nambig> ambiguous residues.
+ */
+static int
+msa_remove_seqs_with_ambiguities(ESL_MSA *msa, int max_nambig, ESL_MSA **ret_new_msa)
+{
+ int status;
+ int *useme;
+ int i, j;
+ int nambig;
+
+ ESL_MSA *new_msa;
+ ESL_SQ *sq;
+ sq = esl_sq_CreateDigital(msa->abc);
+
+ ESL_ALLOC(useme, sizeof(int) * msa->nseq);
+ for (i = 0; i < msa->nseq; i++) {
+ esl_sq_GetFromMSA(msa, i, sq);
+ nambig = 0;
+ for (j = 1; sq->dsq[j] != eslDSQ_SENTINEL; j++) {
+ if (esl_abc_XIsDegenerate(sq->abc, sq->dsq[j])) nambig++;
+ }
+ useme[i] = (nambig > max_nambig) ? FALSE : TRUE;
+ esl_sq_Reuse(sq);
+ }
+
+ if((status = esl_msa_SequenceSubset(msa, useme, &new_msa)) != eslOK) esl_fatal("esl_msa_SequenceSubset() had a problem.");
+ free(useme);
+ esl_sq_Destroy(sq);
+ *ret_new_msa = new_msa;
+ return eslOK;
+
+ ERROR:
+ esl_fatal("msa_remove_seqs_above_maxlen() memory allocation error.");
+ return eslOK; /* NEVERREACHED */
+}
+
+/* number_columns
+ *
+ * Add annotation to an MSA numbering the columns, either all
+ * the columns (if <do_all>) or just non-gap #=GC RF columns.
+ * If do_all is FALSE, i_am_rf must be non-NULL.
+ */
+static int
+number_columns(ESL_MSA *msa, int do_all, int *i_am_rf, char *errbuf)
+{
+ int status;
+ int i;
+ char *numstring;
+ char *tag;
+ int alen_ndigits;
+ int tagwidth;
+ int a,b,apos;
+ int bmin;
+ int pos2print;
+ int tagidx;
+
+ /* contract check */
+ if(!do_all && i_am_rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "number_columns() called but MSA has no #=GC RF annotation.");
+
+ alen_ndigits = int_ndigits(msa->alen);
+ tagwidth = do_all ? (3+alen_ndigits) : (5+alen_ndigits); /* "COL.X" or RFCOL.X" */
+
+ ESL_ALLOC(tag, sizeof(char) * (tagwidth+1));
+ ESL_ALLOC(numstring, sizeof(char) * (msa->alen+1));
+ numstring[msa->alen] = '\0';
+ tag[tagwidth] = '\0';
+ if(do_all) {
+ bmin = 3;
+ tag[0] = 'C';
+ tag[1] = 'O';
+ tag[2] = 'L';
+ }
+ else {
+ bmin = 5;
+ tag[0] = 'R';
+ tag[1] = 'F';
+ tag[2] = 'C';
+ tag[3] = 'O';
+ tag[4] = 'L';
+ }
+
+ for(a = 0; a < alen_ndigits; a++) {
+ for(b = 0; b < alen_ndigits; b++) tag[b+bmin] = (a == b) ? 'X' : '.';
+ pos2print = 1;
+ for(apos = 1; apos <= msa->alen; apos++) {
+ if(!do_all && (! i_am_rf[(apos-1)])) numstring[(apos-1)] = '.';
+ else numstring[(apos-1)] = get_char_digit_x_from_int(pos2print++, (alen_ndigits-a));
+ /*printf("called get_char_digit_x_from_int(%d, %d)\n",apos, (alen_ndigits-a));*/
+ }
+ /* If the tag already exists, free it's associated markup string. This is an awful hack. */
+ for (tagidx = 0; tagidx < msa->ngc; tagidx++)
+ if (strcmp(msa->gc_tag[tagidx], tag) == 0) break;
+ if(tagidx != msa->ngc) { /* tag exists */
+ free(msa->gc[tagidx]);
+ msa->gc[tagidx] = NULL;
+ }
+
+ esl_msa_AppendGC(msa, tag, numstring);
+ }
+
+ ESL_ALLOC(numstring, sizeof(char) * (msa->alen + 1));
+ for(i = 0; i < msa->alen; i++) {
+ numstring[i] = digit_to_char(i);
+ }
+ numstring[msa->alen] = '\0';
+ free(numstring);
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+
+/* digit_to_char
+ *
+ * Given a digit (0-9) return the character reprentation of it.
+ * There must be a better way to do this; oh well.
+ */
+static char
+digit_to_char(int digit)
+{
+ if(digit == 0) return '0';
+ if(digit == 1) return '1';
+ if(digit == 2) return '2';
+ if(digit == 3) return '3';
+ if(digit == 4) return '4';
+ if(digit == 5) return '5';
+ if(digit == 6) return '6';
+ if(digit == 7) return '7';
+ if(digit == 8) return '8';
+ if(digit == 9) return '9';
+ else return '?';
+}
+
+/* Function: int_ndigits
+ * Returns: The number of digits in <i>.
+ */
+static int
+int_ndigits(int i)
+{
+ int n = 0;
+ while(i > 0) { i/=10; n++; }
+ return n;
+}
+
+/* get_char_digit_x_from_int
+ *
+ * Given two integers <i> and <place> return the
+ * character version of the <place>'th digit in <i>.
+ * Example <i> = 14378 <place> = 4 would return 7.
+ */
+static char
+get_char_digit_x_from_int(int i, int place)
+{
+ int n,a,divisor;
+ n = int_ndigits(i);
+
+ if(n < place) return digit_to_char(0);
+
+ divisor = 1;
+ for(a = 0; a < (place-1); a++) divisor *= 10;
+ /* subtract leading digits before the one we care about */
+ i %= (divisor*10);
+ return digit_to_char (i / divisor);
+}
+
+/* Function: read_seq_name_file
+ * Date: EPN, Thu Jun 5 13:21:36 2008
+ *
+ * Read a file listing sequence names to remove or keep.
+ * Store sequences in *ret_seqlist and return it.
+ * Each white-space delimited token is considered a
+ * different sequence name. No checking is done in this
+ * function, but rather in subsequent functions.
+ *
+ * Returns eslOK on success.
+ */
+int
+read_seq_name_file(char *filename, char *errbuf, char ***ret_seqlist, int *ret_seqlist_n)
+{
+ int status;
+ ESL_FILEPARSER *efp;
+ char *tok;
+ int toklen;
+ int nalloc = 10;
+ int chunksize = 10;
+ char **seqlist = NULL;
+ int n = 0;
+ int i;
+ void *tmp;
+
+ ESL_ALLOC(seqlist, sizeof(char *) * nalloc);
+ if (esl_fileparser_Open(filename, NULL, &efp) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "failed to open %s in read_seq_name_file\n", filename);
+
+ while((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslEOF) {
+ if(n == nalloc) { nalloc += chunksize; ESL_RALLOC(seqlist, tmp, sizeof(char *) * nalloc); }
+ if((status = esl_strdup(tok, -1, &(seqlist[n++]))) != eslOK) ESL_FAIL(status, errbuf, "error in esl_strdup.");
+ }
+ esl_fileparser_Close(efp);
+ *ret_seqlist = seqlist;
+ *ret_seqlist_n = n;
+ return eslOK;
+
+ ERROR:
+ if(seqlist != NULL) {
+ for(i = 0; i < n; i++) free(seqlist[i]);
+ free(seqlist);
+ }
+ return status;
+}
+
+
+/* Function: msa_keep_or_remove_seqs()
+ *
+ * Purpose: Given a list of <seqlist_n> sequences in <seqlist>, either remove those
+ * sequences from msa, or remove all other sequences besides those from msa.
+ * Create and return the new msa with only the specified seqs in <ret_new_msa>.
+ *
+ * Returns: eslOK on success, eslEINVAL if a sequence name in seqlist does not exist in the msa.
+ *
+ */
+static int
+msa_keep_or_remove_seqs(ESL_MSA *msa, char *errbuf, char **seqlist, int seqlist_n, int do_keep, int do_reorder, int nali, ESL_MSA **ret_new_msa)
+{
+ int status;
+ int *useme;
+ int i, ip, n;
+ int *order_all, *order_new;
+
+ ESL_MSA *new_msa;
+ if(msa->index == NULL) ESL_FAIL(eslEINVAL, errbuf, "ERROR, msa->index is NULL!");
+
+ ESL_ALLOC(useme, sizeof(int) * msa->nseq);
+ ESL_ALLOC(order_all, sizeof(int) * msa->nseq);
+ ESL_ALLOC(order_new, sizeof(int) * seqlist_n);
+ esl_vec_ISet(order_all, msa->nseq, -1);
+
+ if(do_keep) esl_vec_ISet(useme, msa->nseq, FALSE);
+ else esl_vec_ISet(useme, msa->nseq, TRUE);
+
+ for(n = 0; n < seqlist_n; n++) {
+ if((status = esl_keyhash_Lookup(msa->index, seqlist[n], -1, &i)) == eslENOTFOUND)
+ ESL_FAIL(status, errbuf, "Error sequence %s does not exist in alignment %d", seqlist[n], nali);
+ useme[i] = do_keep ? TRUE : FALSE;
+ if(order_all[i] != -1) ESL_FAIL(eslEINVAL, errbuf, "ERROR sequence %s listed twice in a input list file.", seqlist[n]);
+ order_all[i] = n;
+ }
+
+ if(esl_vec_ISum(useme, msa->nseq) == 0) esl_fatal("No sequences remaining in the alignment!.");
+ if((status = esl_msa_SequenceSubset(msa, useme, &new_msa)) != eslOK) esl_fatal("esl_msa_SequenceSubset() had a problem.");
+ /* if do_keep, reorder to order of names in the list file */
+ if(do_keep && do_reorder) {
+ ip = 0;
+ for(i = 0; i < msa->nseq; i++) {
+ if(order_all[i] != -1) order_new[order_all[i]] = ip++;
+ }
+ if((status = reorder_msa(new_msa, order_new, errbuf)) != eslOK) return status;
+ }
+
+ free(useme);
+ free(order_all);
+ free(order_new);
+ *ret_new_msa = new_msa;
+ return eslOK;
+
+ ERROR:
+ esl_fatal("msa_keep_or_remove_seqs() memory allocation error.");
+ return eslOK; /* NEVERREACHED */
+}
+
+/* Function: insert_x_pair_shared()
+ * Synopsis: Calculate the fraction of inserts shared between of two aligned digital seqs.
+ * Incept: EPN, Wed Jun 25 10:33:23 2008
+ *
+ * Purpose: Returns the fraction of the total
+ * number of inserts in both sequences that are shared.
+ * An 'insert' is present in sequence s for consensus column
+ * (non-gap RF column) c if at least 1 residue exists between
+ * consensus column c and c+1. If sequence t also has an insert
+ * between c and c+1, they share that insert. If that were the
+ * only insert in either of the two sequences, then they would
+ * share 1.0 fraction of inserts.
+ *
+ * Args: msa - MSA, digitized, with RF annotation
+ * i_am_rf - [0..msa->alen-1], TRUE if apos is a nongap RF column, FALSE if not
+ * i - index of seq 1
+ * j - indes of seq 2
+ * cfirst - first consensus position to consider
+ * clast - last consensus position to consider
+ * opt_pshared - optRETURN: pairwise insert identity, 0<=x<=1
+ * opt_nshared - optRETURN: # of inserts shared
+ * opt_nins - optRETURN: nins
+ *
+ * Returns: <eslOK> on success. <opt_distance>, <opt_nid>, <opt_n>
+ * contain the answers, for any of these that were passed
+ * non-<NULL> pointers.
+ *
+ * Throws: <eslEINVAL> if the strings are different lengths (not aligned).
+ */
+int
+insert_x_pair_shared(ESL_MSA *msa, int *i_am_rf, int i, int j, int cfirst, int clast, double *opt_pshared, int *opt_nshared, int *opt_nins)
+{
+ int shared; /* total shared inserts */
+ int nins; /* number of inserts in either sequence */
+ int apos; /* position in aligned seqs */
+ int rfpos;
+ int insi, insj;
+ int seen_insert = FALSE;
+ shared = nins = 0;
+
+ rfpos = 0;
+ for(apos = 1; apos <= msa->alen; apos++)
+ {
+ if(! esl_abc_CIsGap(msa->abc, msa->rf[(apos-1)])) {
+ rfpos++;
+ seen_insert = FALSE;
+ }
+ else { /* not a consensus column, an insert column */
+ insi = (! esl_abc_XIsGap(msa->abc, msa->ax[i][apos]));
+ insj = (! esl_abc_XIsGap(msa->abc, msa->ax[j][apos]));
+ if(rfpos >= cfirst && rfpos <= clast) {
+ if(insi && insj && !seen_insert) shared++;
+ if((insi || insj) && !seen_insert) { nins++; seen_insert = TRUE; }
+ }
+ }
+ }
+ /*if (opt_pshared != NULL) *opt_pshared = ( nins==0 ? 0. : (double) shared / (double) nins );*/
+ if (opt_pshared != NULL) *opt_pshared = ( nins==0 ? 1. : (double) shared / (double) nins );
+ if (opt_nshared != NULL) *opt_nshared = shared;
+ if (opt_nins != NULL) *opt_nins = nins;
+ return eslOK;
+}
+
+
+/* Function: insert_x_pair_shared_length()
+ * Synopsis: Calculate the fraction of inserts shared between of two aligned digital seqs,
+ * weighted by the length of the inserts.
+ * Incept: EPN, Wed Jun 25 10:33:23 2008
+ *
+ * Purpose: Returns the weighted fraction of the total
+ * number of inserts in both sequences that are shared.
+ *
+ * Args: msa - MSA, digitized, with RF annotation
+ * i - index of seq 1
+ * j - indes of seq 2
+ * cfirst - first consensus position to consider
+ * clast - last consensus position to consider
+ * opt_pshared - optRETURN: pairwise insert identity, 0<=x<=1
+ * opt_nshared - optRETURN: weighted # inserts shared
+ * opt_nins - optRETURN: nins, number of columns with an insert
+ *
+ * Returns: <eslOK> on success. <opt_distance>, <opt_nid>, <opt_n>
+ * contain the answers, for any of these that were passed
+ * non-<NULL> pointers.
+ *
+ * Throws: <eslEINVAL> if the strings are different lengths (not aligned).
+ */
+int
+insert_x_pair_shared_length(ESL_MSA *msa, int *i_am_rf, int i, int j, int cfirst, int clast, double *opt_pshared, double *opt_nshared, int *opt_nins)
+{
+ double shared; /* weighted shared inserts */
+ int nins; /* number of inserts in either sequence */
+ int apos; /* position in aligned seqs */
+ int rfpos;
+ int leni, lenj;
+ shared = nins = leni = lenj = 0;
+
+ rfpos = 0;
+ for(apos = 1; apos <= msa->alen; apos++)
+ {
+ if(i_am_rf[(apos-1)]) {
+ rfpos++;
+ if(rfpos >= cfirst && rfpos <= clast) {
+ if((leni + lenj) > 0) {
+ nins++;
+ if(leni >= lenj) shared += (double) lenj / (double) leni;
+ else shared += (double) leni / (double) lenj;
+ }
+ leni = lenj = 0;
+ }
+ }
+ else { /* not a consensus column, an insert column */
+ if(! esl_abc_XIsGap(msa->abc, msa->ax[i][apos])) leni++;
+ if(! esl_abc_XIsGap(msa->abc, msa->ax[j][apos])) lenj++;
+ }
+ }
+ /*if (opt_pshared != NULL) *opt_pshared = ( nins==0 ? 0. : (double) shared / (double) nins );*/
+ if (opt_pshared != NULL) *opt_pshared = ( nins==0 ? 1. : (double) shared / (double) nins );
+ if (opt_nshared != NULL) *opt_nshared = shared;
+ if (opt_nins != NULL) *opt_nins = nins;
+ return eslOK;
+}
+
+/* Function: insert_x_diffmx()
+ * Synopsis: NxN insert difference matrix for N aligned digital seqs.
+ * Incept: EPN, Wed Jun 25 10:25:01 2008
+ *
+ * Purpose: For each pair of sequences calculates the fraction of number
+ * of inserts that are different between the two sequences.
+ * An 'insert' is present in sequence s for consensus column
+ * (non-gap RF column) c if at least 1 residue exists between
+ * consensus column c and c+1. If sequence t also has an insert
+ * between c and c+1, they share that insert. If that were the
+ * only insert in either of the two sequences, then they would
+ * share 1.0 fractional insert id, and 1.0 - 1.0 = 0.0 fractional
+ * insert difference, thus the insert diff mx entry between
+ * seq s and t would be 0.0.
+ *
+ * Args: go - command-line options
+ * errbuf - for printing error messages
+ * msa - aligned dsq's, [0..N-1][1..alen]
+ * do_length_weight - weight insert similarity by length of inserts
+ * do_only_internal_inserts - TRUE to only count inserts that are at positions
+ * internal to both seq i, j (don't count those truncated off in either seq)
+ * ret_D - RETURN: NxN matrix of fractional differences
+ *
+ * Returns: <eslOK> on success, and <ret_D> contains the difference
+ * matrix; caller is obligated to free <D> with
+ * <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <eslEINVAL> if a seq has a different
+ * length than others. On failure, <ret_D> is returned <NULL>
+ * and state of inputs is unchanged.
+ */
+int
+insert_x_diffmx(const ESL_GETOPTS *go, char *errbuf, ESL_MSA *msa, int rflen, int *i_am_rf, int do_length_weight, int do_only_internal_inserts, ESL_DMATRIX **ret_D)
+{
+ int status;
+ ESL_DMATRIX *D = NULL;
+ int i,j;
+ int N = msa->nseq;
+ int nshared;
+ double nshared_len;
+ int nins;
+ int *firstA, *lastA; /* [0..i..nseq-1] first and last consensus column occupied by seq i, only used if do_only_internal_inserts == TRUE */
+ int ifirst, ilast, jfirst, jlast;
+
+ if(msa->rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "No #=GC RF markup in alignment.");
+ if(! (msa->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINVAL, errbuf, "insert_x_diffmx() MSA is not digitized.\n");
+
+ if (( D = esl_dmatrix_Create(N,N) ) == NULL) esl_fatal(errbuf);
+ if ((status = determine_first_last_consensus_columns(msa, errbuf, i_am_rf, rflen, &firstA, &lastA)) != eslOK) return status;
+
+ /* TEMP for (i = 0; i < N; i++) printf("i: %4d %4d %4d\n", i, firstA[i], lastA[i]); */
+
+ for (i = 0; i < N; i++)
+ {
+ D->mx[i][i] = 0.;
+ ifirst = do_only_internal_inserts ? firstA[i] : 0;
+ ilast = do_only_internal_inserts ? lastA[i] : rflen;
+ for (j = i+1; j < N; j++)
+ {
+ jfirst = do_only_internal_inserts ? firstA[j] : 0;
+ jlast = do_only_internal_inserts ? lastA[j] : rflen;
+ if(do_length_weight) {
+ status = insert_x_pair_shared_length(msa, i_am_rf, i, j, ESL_MAX(ifirst, jfirst), ESL_MIN(ilast, jlast), &(D->mx[i][j]), &nshared_len, &nins);
+ /* if(esl_opt_GetBoolean(go, "--verbose")) printf("D %4d %4d %.3f %8.3f of %4d\n", i, j, 1. - D->mx[i][j], nshared_len, nins); */
+ }
+ else {
+ status = insert_x_pair_shared(msa, i_am_rf, i, j, ESL_MAX(ifirst, jfirst), ESL_MIN(ilast, jlast), &(D->mx[i][j]), &nshared, &nins);
+ /* if(esl_opt_GetBoolean(go, "--verbose")) printf("D %4d %4d %.3f %4d of %4d\n", i, j, 1. - D->mx[i][j], nshared, nins); */
+ }
+ D->mx[i][j] = 1. - D->mx[i][j]; /* convert from id to distance */
+ if (status != eslOK) ESL_XEXCEPTION(status, "Pairwise insert identity calculation failed at seqs %d,%d\n", i,j);
+ D->mx[j][i] = D->mx[i][j];
+ }
+ /* if(esl_opt_GetBoolean(go, "--verbose")) printf("\n"); */
+ }
+ if (ret_D != NULL) *ret_D = D; else esl_dmatrix_Destroy(D);
+ return eslOK;
+
+ ERROR:
+ if (D != NULL) esl_dmatrix_Destroy(D);
+ if (ret_D != NULL) *ret_D = NULL;
+ return status;
+}
+
+/* Function: MSADivide()
+ * From Infernal's cmbuild.c
+ * EPN, Wed Mar 21 17:26:39 2007
+ *
+ * Purpose: Given an MSA and a distance matrix, divide the MSA it into
+ * multiple MSAs, each with a different cluster of the original
+ * sequences. Where clusters are defined by single linkage
+ * clustering based on the distance matrix.
+ *
+ * Different modes:
+ *
+ * 1. if(do_mindiff): define clusters
+ * such that we maximize the number of clusters while
+ * satisfying: minimum fractional difference b/t any
+ * 2 seqs in different clusters >= 'mindiff'.
+ * The contract states that mindiff > 0. in this case.
+ *
+ * 2. if(do_nc): define clusters
+ * such that we have exactly 'target_nc' clusters by
+ * searching for the 'mindiff' that gives exactly
+ * 'target_nc' clusters. (We guarantee we can do this
+ * by rounding 'diff' fractional difference values b/t
+ * seqs to nearest 0.001).
+ *
+ * 3. if(do_nsize): define clusters
+ * such that we have 1 cluster that has at least nsize
+ * sequences in it by searching for the 'mindiff' that
+ * achieves that.
+ *
+ * Args:
+ * ESL_MSA *mmsa - the master MSA, we cluster the seqs in this guy
+ * and build a new MSA from each cluster
+ * ESL_DMATRIX *D; - the distance matrix
+ * int do_mindiff - TRUE (mode 1): satisfy clusters are at least mindiff different
+ * int do_nc - TRUE (mode 2): set mindiff such that we get exactly target_nc clusters
+ * int do_nsize - TRUE (mode 3): set mindiff such that we get 1 cluster with nsize seqs
+ * float mindiff - the minimum fractional difference allowed between 2 seqs of different clusters
+ * (0. indicates mode 2 or 3)
+ * int target_nc - if(do_nc) number of clusters to define, else irrelevant
+ * int target_nsize - if(do_nsize) min size of largets cluster, else irrelevant
+ * int *ret_num_msa - number of MSAs in ret_MSA
+ * ESL_MSA ***ret_cmsa - new MSAs, one for each cluster
+ * ESL_MSA *ret_xsize - max size of a cluster
+ * char *errbuf - buffer for error messages
+ *
+ * Return: ret_cmsa (alloc'ed here) and ret_num_msa
+ */
+int
+MSADivide(ESL_MSA *mmsa, ESL_DMATRIX *D, int do_mindiff, int do_nc, int do_nsize, float mindiff, int target_nc,
+ int target_nsize, int *ret_num_msa, ESL_MSA ***ret_cmsa, int *ret_xsize, char *errbuf)
+{
+ int status; /* Easel status code */
+ ESL_MSA **cmsa = NULL;/* the new MSAs we're creating from clusters of seqs in mmsa */
+ int i; /* counter over sequences */
+ int m; /* counter over new MSAs */
+ int n; /* counter over tree nodes */
+ ESL_TREE *T = NULL;/* the tree, created by Single-Linkage Clustering */
+ double *diff = NULL; /* [0..T->N-2], diff[n]= min distance between any leaf in right and
+ * left subtree of node n of tree T */
+ double *minld = NULL;/* [0..T->N-2], min dist from node to any taxa in left subtree */
+ double *minrd = NULL;/* [0..T->N-2], min dist from node to any taxa in right subtree */
+ int nc; /* number of clusters/MSAs */
+ int *clust = NULL;/* [0..T->N-1], cluster number (0..nc-1) this seq is in */
+ int *csize = NULL;/* [0..nc-1], size of each cluster */
+ int **useme = NULL;/* [0.m.nc-1][0.i.N] TRUE to use seq i in new MSA m, FALSE not to */
+ int best; /* 'best' node, returned by select_node() */
+ int xsize; /* size of cluster under 'best' node (largest cluster) */
+
+ /* Contract check */
+ if((do_nc + do_mindiff + do_nsize) != 1) ESL_FAIL(eslEINCOMPAT, errbuf, "MSADivide() exactly 1 of do_nc, do_mindiff, do_nsize must be TRUE.");
+ if( do_nc && target_nc == 0) ESL_FAIL(eslEINCOMPAT, errbuf, "MSADivide() target_nc is 0 but do_nc is TRUE!");
+ if( do_nsize && target_nsize == 0) ESL_FAIL(eslEINCOMPAT, errbuf, "MSADivide() target_nsize is 0 but do_nsize is TRUE!");
+ if( do_mindiff && mindiff <= 0.) ESL_FAIL(eslEINCOMPAT, errbuf, "MSADivide() mindiff is <= 0. but do_mindiff is TRUE!");
+ if( do_mindiff && target_nc != 0) ESL_FAIL(eslEINCOMPAT, errbuf, "MSADivide() do_mindiff is TRUE, but target_nc != 0");
+ if( do_mindiff && target_nsize != 0) ESL_FAIL(eslEINCOMPAT, errbuf, "MSADivide() do_mindiff is TRUE, but target_nsize != 0");
+ /* mmsa must be digital */
+ if(!(mmsa->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINCOMPAT, errbuf, "MSADivide() MSA is not digital.");
+
+ if(do_nc || do_nsize) mindiff = 0.;
+
+ /* Infer tree by single linkage clustering given the distance matrix */
+ if((status = esl_tree_SingleLinkage(D, &T)) != eslOK) ESL_FAIL(status, errbuf, "esl_tree_SingleLinkage() error, status: %d", status);
+ if((status = esl_tree_SetTaxaParents(T)) != eslOK) ESL_FAIL(status, errbuf, "esl_tree_SetTaxaParentse() error, status: %d", status);
+ /*esl_tree_WriteNewick(stdout, T);*/
+ if((status = esl_tree_Validate(T, errbuf) != eslOK)) return status;
+
+ /* determine the diff values:
+ * (use: n_child > n, unless n's children are taxa)
+ * diff[n] is minimum distance between any taxa (leaf) in left subtree of
+ * n to any taxa in right subtree of n.
+ */
+ ESL_ALLOC(diff, (sizeof(double) * (T->N - 1))); /* one for each node */
+ ESL_ALLOC(minld, (sizeof(double) * (T->N - 1)));
+ ESL_ALLOC(minrd, (sizeof(double) * (T->N - 1)));
+ for (n = (T->N-2); n >= 0; n--) {
+ minld[n] = T->ld[n] + ((T->left[n] > 0) ? (minld[T->left[n]]) : 0);
+ minrd[n] = T->rd[n] + ((T->right[n] > 0) ? (minrd[T->right[n]]) : 0);
+ diff[n] = minld[n] + minrd[n];
+ diff[n] *= 1000.;
+ diff[n] = (float) ((int) diff[n]);
+ diff[n] /= 1000.;
+ /*printf("diff[n:%d]: %f\n", n, diff[n]);*/
+ }
+ free(minld); minld = NULL;
+ free(minrd); minrd = NULL;
+ /*for (n = 0; n < (T->N-1); n++)
+ printf("diff[n:%d]: %f\n", n, diff[n]);
+ for (n = 0; n < (T->N-1); n++)
+ printf("left[n:%d]: %d right[n:%d]: %d\n", n, T->left[n], n, T->right[n]);*/
+
+ if(do_mindiff) { /* Mode 1 */
+ /* Define clusters that are at least mindiff different
+ * from each other. */
+ if((status = select_node(T, diff, mindiff, &clust, &nc, &xsize, &best, errbuf)) != eslOK) return status;
+ printf("# Alignment split into %d clusters\n", nc);
+ printf("# Maximum identity b/t any 2 seqs in different clusters: %.2f\n", (1.-mindiff));
+ printf("# Largest cluster contains %d sequences.\n", xsize);
+ printf("#\n");
+ }
+ else if (do_nc) { /* Mode 2, do_nc == TRUE, mindiff was set to 0.0 above */
+ /* Find the minimum fractional difference (mindiff) that
+ * gives exactly target_nc clusters, also define clusters
+ * based on that mindiff, this is all done with find_mindiff(),
+ * which does a binary search for mindiff, we're guaranteed to
+ * find exactly target_nc clusters b/c diff values are rounded
+ * to nearest 0.001. */
+ if(target_nc > (T->N)) target_nc = T->N; /* max num clusters is num seqs */
+ if((status = find_mindiff(T, diff, FALSE, target_nc, &clust, &nc, &xsize, &best, &mindiff, errbuf)) != eslOK) return status;
+ printf("# Alignment split into %d clusters.\n", nc);
+ printf("# Maximum identity b/t any 2 seqs in different clusters: %.2f\n", (1.-mindiff));
+ printf("# Largest cluster contains %d sequences.\n", xsize);
+ printf("#\n");
+ }
+ else { /* Mode 3, do_nsize == TRUE, mindiff was set to 0.0 above */
+ /* Find the minimum fractional difference (mindiff) that
+ * gives 1 cluster with size of at least <target_nsize> sequences
+ * based on that mindiff, this is all done with find_mindiff(),
+ * which does a binary search for mindiff.
+ */
+ if(target_nsize > (T->N)) target_nsize = T->N; /* max num clusters is num seqs */
+ if((status = find_mindiff(T, diff, TRUE, target_nsize, &clust, &nc, &xsize, &best, &mindiff, errbuf)) != eslOK) return status;
+ printf("# Alignment split into %d clusters.\n", nc);
+ printf("# Largets cluster contains %d sequences.\n", xsize);
+ printf("# Maximum identity b/t any 2 seqs in different clusters: %.2f\n", (1.-mindiff));
+ printf("#\n");
+ }
+ /* Determine the size of each cluster */
+ ESL_ALLOC(csize, (sizeof(int) * (nc)));
+ esl_vec_ISet(csize, nc, 0);
+ for(i = 0; i < mmsa->nseq; i++)
+ csize[clust[i]]++;
+
+ /* Create one new MSA for each cluster,
+ * if(do_orig): keep the original MSA as cmsa[nc] */
+ ESL_ALLOC(cmsa, (sizeof(ESL_MSA *) * (nc)));
+ for(m = 0; m < nc; m++) cmsa[m] = NULL;
+
+ ESL_ALLOC(useme, (sizeof(int *) * (nc+1)));
+ for(m = 0; m <= nc; m++) {
+ ESL_ALLOC(useme[m], (sizeof(int)) * mmsa->nseq);
+ if(m < nc) esl_vec_ISet(useme[m], mmsa->nseq, FALSE);
+ else esl_vec_ISet(useme[m], mmsa->nseq, TRUE); /* keep all seqs in cmsa[nc]*/
+ }
+
+ for(i = 0; i < mmsa->nseq; i++)
+ if(clust[i] != -1)
+ useme[clust[i]][i] = TRUE;
+ printf("# idx nseq\n");
+ printf("# ---- ------\n");
+ for(m = 0; m < nc; m++) {
+ if(esl_vec_ISum(useme[m], mmsa->nseq) == 0) esl_fatal("No sequences in cluster %d\n");
+ if((status = esl_msa_SequenceSubset(mmsa, useme[m], &(cmsa[m]))) != eslOK) ESL_FAIL(status, errbuf, "MSADivide(), esl_msa_SequenceSubset error, status: %d.", status);
+ printf(" %4d %6d\n", m+1, cmsa[m]->nseq);
+ free(useme[m]);
+ }
+ printf("\n");
+
+ free(useme[nc]);
+ free(useme);
+
+ *ret_num_msa = nc;
+ *ret_cmsa = cmsa;
+ *ret_xsize = xsize;
+
+ esl_tree_Destroy(T);
+ free(diff);
+ diff = NULL;
+
+ if(clust != NULL) free(clust);
+ if(csize != NULL) free(csize);
+ return eslOK;
+
+ ERROR:
+ if(diff != NULL) free(diff);
+ if(minld != NULL) free(minld);
+ if(minrd != NULL) free(minrd);
+ if(clust != NULL) free(clust);
+ if(csize != NULL) free(csize);
+ if(cmsa != NULL) {
+ for(m = 0; m < nc; m++)
+ if(cmsa[m] != NULL) esl_msa_Destroy(cmsa[m]);
+ free(cmsa);
+ }
+ return status;
+}
+
+/* Function: select_node()
+ * EPN, Fri Mar 23 08:48:37 2007
+ * Adapted from SRE's select_node() in maketestset.c originally written
+ * for the PROFMARK HMMER benchmark.
+ *
+ *
+ * Purpose: Define clusters of the taxa (seqs) in the tree such
+ * that minimum disparity b/t any 2 seqs in different
+ * clusters is greater than <mindiff> and the number of
+ * clusters is maximized. <ret_best> is the index of the node
+ * of the tree under which the largest cluster belongs.
+ * <ret_nc> is the number of clusters after clustering,
+ * <ret_clust> is an array [0..T->N-1] specifying which
+ * cluster each taxa belongs to.
+ *
+ * For high disparities, this cluster may contain all
+ * the sequences, and we'll return the root node (0).
+ *
+ * Args:
+ * ESL_TREE *T - the tree
+ * double *diff - [0..T->N-2]: for each node of the tree, the minimum
+ * distance (sum of branch lengths) from any taxa (leaf)
+ * in left subtree to any taxa in right subtree.
+ * double mindiff - (see description above)
+ * int **ret_clust- [0..T->N-1] cluster number this seq is in, alloc'ed, filled here
+ * int *ret_nc - number of clusters
+ * int *ret_xsize- size of largest cluster
+ * int *ret_best - RETURN: index of node of tree under which largest cluster belongs (see Purpose).
+ * char *errbuf - buffer for error messages
+ *
+ * Returns: node index (as explained in Purpose)
+ */
+static int
+select_node(ESL_TREE *T, double *diff, double mindiff, int **ret_clust, int *ret_nc, int *ret_xsize, int *ret_best, char *errbuf)
+{
+ int status; /* Easel status code */
+ ESL_STACK *ns1; /* stack for traversing tree */
+ ESL_STACK *ns2; /* another stack for traversing tree */
+ int c; /* counter for clusters */
+ int best; /* index of current best node */
+ int maxsize; /* size of cluster for best node */
+ int n, np; /* counters over tree nodes */
+ int *clust; /* [1..T->N-1] cluster number this seq is in */
+
+ /*printf("in selec_node mindiff: %f T->N: %d\n", mindiff, T->N);*/
+ /* set tree cladesizes if not already set */
+ if(T->cladesize == NULL)
+ if((status = esl_tree_SetCladesizes(T)) != eslOK) ESL_FAIL(status, errbuf, "select_node(), esl_tree_SetCladeSizes error, status: %d.", status);
+
+ ESL_ALLOC(clust, (sizeof(int) * T->N));
+ esl_vec_ISet(clust, T->N, 0);
+
+ if((ns1 = esl_stack_ICreate()) == NULL) ESL_FAIL(status, errbuf, "select_node(), failed to create a stack, probably out of memory, status: %d.", status);
+ if((ns2 = esl_stack_ICreate()) == NULL) ESL_FAIL(status, errbuf, "select_node(), failed to create a stack, probably out of memory, status: %d.", status);
+
+ /* push root on stack to start */
+ if((status = esl_stack_IPush(ns1, 0)) != eslOK) ESL_FAIL(status, errbuf, "select_node(), failed to push onto a stack, probably out of memory, status: %d.", status);
+ maxsize = 0;
+ best = 0;
+ c = 0;
+ while (esl_stack_IPop(ns1, &n) != eslEOD) {
+ if ((n == 0 || diff[T->parent[n]] > mindiff) &&
+ diff[n] <= mindiff) { /* we're at a cluster */
+ if (T->cladesize[n] > maxsize) {
+ maxsize = T->cladesize[n];
+ best = n;
+ }
+ /* determine all taxa in the clade rooted at n*/
+ esl_stack_IPush(ns2, n);
+ while (esl_stack_IPop(ns2, &np) != eslEOD) {
+ /*printf("np: %d T->left[np]: %d\n", np, T->left[np]);*/
+ if(T->left[np] <= 0) clust[(-1*T->left[np])] = c;
+ else { if((status = esl_stack_IPush(ns2, T->left[np])) != eslOK) ESL_FAIL(status, errbuf, "select_node(), failed to push onto a stack, probably out of memory, status: %d.", status); }
+ if(T->right[np] <= 0) clust[(-1*T->right[np])] = c;
+ else { if((status = esl_stack_IPush(ns2, T->right[np])) != eslOK) ESL_FAIL(status, errbuf, "select_node(), failed to push onto a stack, probably out of memory, status: %d.", status); }
+ }
+ c++;
+ }
+ else { /* we're not a cluster, keep traversing */
+ /*printf("n: %d T->left[n]: %d\n", n, T->left[n]);*/
+ if(T->left[n] <= 0) clust[(-1*T->left[n])] = c++; /* single seq with its own cluster */
+ else { if((status = esl_stack_IPush(ns1, T->left[n])) != eslOK) ESL_FAIL(status, errbuf, "select_node(), failed to push onto a stack, probably out of memory, status: %d.", status); }
+ if(T->right[n] <= 0) clust[(-1*T->right[n])] = c++; /* single seq with its own cluster */
+ else { if((status = esl_stack_IPush(ns1, T->right[n])) != eslOK) ESL_FAIL(status, errbuf, "select_node(), failed to push onto a stack, probably out of memory, status: %d.", status); }
+ }
+ }
+ esl_stack_Destroy(ns1);
+ esl_stack_Destroy(ns2);
+ *ret_nc = c;
+ *ret_clust = clust;
+ *ret_xsize = maxsize;
+ *ret_best = best;
+ /*printf("nc: %d(%d) best: %d maxsize: %d nc: %d mindiff: %.3f\n\n", *ret_nc, c, best, maxsize, c, mindiff);
+ for(n = 0; n < T->N; n++) printf("clust[%d]: %d\n", n, clust[n]);*/
+ return eslOK;
+
+ ERROR:
+ if(clust != NULL) free(clust);
+ ESL_FAIL(status, errbuf, "select_node(), memory allocation error, status: %d.", status);
+}
+
+
+/* Function: find_mindiff()
+ * EPN, Fri Mar 23 18:59:42 2007
+ *
+ * Purpose: Given a tree resulting from single linkage clustering,
+ * find the min fractional difference (mindiff) that when used to
+ * define clusters (such that no seq in cluster A is less
+ * than mindiff different than any seq in cluster B),
+ * gives either (A) (if(do_nc)) number of clusters >= target or
+ * (B) (if(do_nsize)) >= 1 cluster with >= target sequences
+ *
+ * Args:
+ * ESL_TREE *T - the tree
+ * double *diff - [0..T->N-2]: for each node of the tree, the minimum
+ * distance (sum of branch lengths) from any taxa (leaf)
+ * in left subtree to any taxa in right subtree.
+ * int do_nsize - TRUE to find mindiff that gives >= 1 cluster with <target> seqs
+ * FALSE to find mindiff that gives <target> clusters
+ * int target - number of clusters (! if(do_nsize)) we want, or min size of
+ * biggest cluster (if(do_nsize))
+ * int **ret_clust- [0..T->N-1] cluster number this seq is in, alloc'ed, filled here
+ * int *ret_nc - number of clusters
+ * int *ret_xsize- size of largest cluster
+ * int *ret_best - cluster idx of largest cluster
+ * int *ret_mindiff - mindiff that achieves target
+ * char *errbuf - buffer for error messages
+ *
+ * Returns: fractional difference (as explained in Purpose)
+ */
+static float
+find_mindiff(ESL_TREE *T, double *diff, int do_nsize, int target, int **ret_clust, int *ret_nc, int *ret_xsize, int *ret_best, float *ret_mindiff, char *errbuf)
+{
+ int status;
+ float high_diff = 1.0;
+ float low_diff = 0.0;
+ int high = 0;
+ int low = 0;
+ float mindiff = 0.5;
+ int curr_nc = -1;
+ int curr_xsize = -1;
+ int curr = -1;
+ int curr_best = -1;
+ int keep_going = TRUE;
+ float thresh = 0.001;
+ int *clust = NULL;
+
+ /* Contract check */
+ if(target > T->N) ESL_FAIL(eslEINCOMPAT, errbuf, "find_mindiff(), desired target is greater than number of seqs in the tree");
+
+ while(keep_going) {
+ if(clust != NULL) free(clust);
+ if((status = select_node(T, diff, mindiff, &clust, &curr_nc, &curr_xsize, &curr_best, errbuf)) != eslOK) return status;
+ curr = do_nsize ? curr_xsize : curr_nc;
+ if(((!do_nsize) && (curr < target)) || ((do_nsize) && (curr >= target))) {
+ high_diff = mindiff;
+ high = curr;
+ /*printf("LOWER curr: %d mindiff: %f low: %f (%d) high: %f (%d)\n", curr, mindiff, low_diff, low, high_diff, high);*/
+ mindiff -= (mindiff - low_diff) / 2.;
+ if((fabs(high_diff-0.) < thresh) && (fabs(low-0.) < thresh)) keep_going = FALSE;
+ /* stop, high and low have converged at 0. */
+ }
+ else {/* if(do_nsize) curr_nc > target_nc, else if(!do_nsize) curr_nc >= target_nc */
+ low_diff = mindiff;
+ low = curr;
+ /*printf("GREATER curr: %d mindiff: %f low: %f (%d) high: %f (%d)\n", curr, mindiff, low_diff, low, high_diff, high);*/
+ mindiff += (high_diff - mindiff) / 2.;
+ if(fabs(high_diff-low_diff) < thresh) keep_going = FALSE; /* stop, high and low have converged */
+ }
+ }
+ if(do_nsize) {
+ if(curr < target) { /* we couldn't reach our target in search due to precision */
+ if(high >= target) { /* we could reach it at high */
+ mindiff = high_diff;
+ if((status = select_node(T, diff, mindiff, &clust, &curr_nc, &curr_xsize, &curr_best, errbuf)) != eslOK) return status;
+ }
+ else { /* we couldn't reach our threshold, this shouldn't happen */
+ ESL_FAIL(eslEINVAL, errbuf,"Error in find_mindiff(), even with mindiff of %.5f can't produce cluster of size: %d\n", mindiff, target);
+ }
+ }
+ }
+ else { /* ! do_nsize, trying to achieve <target> clusters */
+ /* it's possible we can't reach our target, if so, set mindiff as minimum value that gives
+ * less than target clusters. */
+ if(curr != target) {
+ /*printf("targ: %d curr: %d low: %d (%f) high: %d (%f)\n", target, curr, low, low_diff, high, high_diff);*/
+ if(high < target) {
+ mindiff = high;
+ if((status = select_node(T, diff, mindiff, &clust, &curr_nc, &curr_xsize, &curr_best, errbuf)) != eslOK) return status;
+ }
+ else
+ while(high > target) {
+ high += thresh;
+ if(high > 1.0) ESL_FAIL(eslEINCONCEIVABLE, errbuf, "find_mindiff(), mindiff has risen above 1.0");
+ mindiff = high;
+ if((status = select_node(T, diff, mindiff, &clust, &curr_nc, &curr_xsize, &curr_best, errbuf)) != eslOK) return status;
+ high = curr_nc;
+ }
+ }
+ }
+ /*printf("FINAL mindiff: %f\n", mindiff); */
+ *ret_nc = curr_nc;
+ *ret_clust = clust;
+ *ret_xsize = curr_xsize;
+ *ret_best = curr_best;
+ *ret_mindiff = mindiff;
+
+ return eslOK;
+}
+
+
+/* determine_first_last_consensus_columns
+ *
+ * Given an MSA, determine the first and last consensus columns
+ * occupied by each sequence
+ */
+static int determine_first_last_consensus_columns(ESL_MSA *msa, char *errbuf, int *i_am_rf, int rflen, int **ret_fA, int **ret_lA)
+{
+ int status;
+ int *fA = NULL;
+ int *lA = NULL;
+ int rfpos = 0;
+ int apos = 0;
+ int i;
+
+ /* contract check */
+ if(msa->rf == NULL) { status = eslEINVAL; goto ERROR; }
+
+ /* determine the first and last occupied consensus position in each sequence */
+ ESL_ALLOC(fA, sizeof(int) * msa->nseq);
+ ESL_ALLOC(lA, sizeof(int) * msa->nseq);
+
+ esl_vec_ISet(lA, msa->nseq, 0);
+ esl_vec_ISet(fA, msa->nseq, rflen);
+ /* this could be way more efficient */
+ for(i = 0; i < msa->nseq; i++) {
+ rfpos = 0;
+ for(apos = 0; apos < msa->alen; apos++) {
+ if(i_am_rf[apos]) { /* apos is a consensus position */
+ rfpos++;
+ if(! esl_abc_XIsGap(msa->abc, msa->ax[i][(apos+1)])) { /* rfpos for seq i is not a gap */
+ fA[i] = ESL_MIN(fA[i], rfpos);
+ lA[i] = ESL_MAX(lA[i], rfpos);
+ }
+ }
+ }
+ }
+ *ret_fA = fA;
+ *ret_lA = lA;
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "determine_first_last_consensus_columns(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* Function: dst_nongap_XPairId()
+ * Synopsis: Pairwise identity of two aligned digital seqs.
+ * Differs from esl_dst_XPairId() in that denominator is
+ * seq identity is number of columns that are non-gap in both
+ * sequences (instead of length of the shorter of the two seqs).
+ *
+ * Incept: EPN, Fri Jun 27 15:07:44 2008
+ *
+ * Args: abc - digital alphabet in use
+ * ax1 - aligned digital seq 1
+ * ax2 - aligned digital seq 2
+ * opt_pid - optRETURN: pairwise identity, 0<=x<=1
+ * opt_nid - optRETURN: # of identities
+ * opt_n - optRETURN: denominator MIN(len1,len2)
+ *
+ * Returns: <eslOK> on success. <opt_distance>, <opt_nid>, <opt_n>
+ * contain the answers, for any of these that were passed
+ * non-<NULL> pointers.
+ *
+ * Throws: <eslEINVAL> if the strings are different lengths (not aligned).
+ */
+int
+dst_nongap_XPairId(const ESL_ALPHABET *abc, const ESL_DSQ *ax1, const ESL_DSQ *ax2,
+ double *opt_distance, int *opt_nid, int *opt_n)
+{
+ int status;
+ int idents; /* total identical positions */
+ int len; /* number of nongap colns in both seqs */
+ int i; /* position in aligned seqs */
+
+ idents = len = 0;
+ for (i = 1; ax1[i] != eslDSQ_SENTINEL && ax2[i] != eslDSQ_SENTINEL; i++)
+ {
+ if (esl_abc_XIsCanonical(abc, ax1[i]) && esl_abc_XIsCanonical(abc, ax2[i])) {
+ len++;
+ if(ax1[i] == ax2[i]) idents++;
+ }
+ }
+
+ if (ax1[i] != eslDSQ_SENTINEL || ax2[i] != eslDSQ_SENTINEL)
+ ESL_XEXCEPTION(eslEINVAL, "strings not same length, not aligned");
+
+ if (opt_distance != NULL) *opt_distance = ( len==0 ? 0. : (double) idents / (double) len );
+ if (opt_nid != NULL) *opt_nid = idents;
+ if (opt_n != NULL) *opt_n = len;
+ return eslOK;
+
+ ERROR:
+ if (opt_distance != NULL) *opt_distance = 0.;
+ if (opt_nid != NULL) *opt_nid = 0;
+ if (opt_n != NULL) *opt_n = 0;
+ return status;
+}
+
+
+/* Function: dst_nongap_XDiffMx()
+ * Synopsis: NxN difference matrix for N aligned digital seqs.
+ * Differs from esl_dst_XDiffMx() in that denominator for
+ * seq identity is number of columns that are non-gap in both
+ * sequences (instead of length of the shorter of the two seqs).
+ *
+ * Incept: EPN, Fri Jun 27 15:10:53 2008
+ *
+ * Args: abc - digital alphabet in use
+ * ax - aligned dsq's, [0..N-1][1..alen]
+ * N - number of aligned sequences
+ * ret_D - RETURN: NxN matrix of fractional differences
+ *
+ * Returns: <eslOK> on success, and <ret_D> contains the difference
+ * matrix; caller is obligated to free <D> with
+ * <esl_dmatrix_Destroy()>.
+ *
+ * Throws: <eslEINVAL> if a seq has a different
+ * length than others. On failure, <ret_D> is returned <NULL>
+ * and state of inputs is unchanged.
+ */
+int
+dst_nongap_XDiffMx(const ESL_ALPHABET *abc, ESL_DSQ **ax, int N, ESL_DMATRIX **ret_D)
+{
+ ESL_DMATRIX *D = NULL;
+ int i,j;
+ int status;
+
+ if (( D = esl_dmatrix_Create(N,N) ) == NULL) { status = eslEMEM; goto ERROR; }
+
+ for (i = 0; i < N; i++)
+ {
+ D->mx[i][i] = 0.;
+ for (j = i+1; j < N; j++)
+ {
+ status = dst_nongap_XPairId(abc, ax[i], ax[j], &(D->mx[i][j]), NULL, NULL);
+ if (status != eslOK) ESL_XEXCEPTION(status, "Pairwise identity calculation failed at seqs %d,%d\n", i,j);
+ D->mx[i][j] = 1.0 - D->mx[i][j];
+ D->mx[j][i] = D->mx[i][j];
+ }
+ }
+ if (ret_D != NULL) *ret_D = D; else esl_dmatrix_Destroy(D);
+ return eslOK;
+
+ ERROR:
+ if (D != NULL) esl_dmatrix_Destroy(D);
+ if (ret_D != NULL) *ret_D = NULL;
+ return status;
+}
+
+/* find_seqs_with_given_insert
+ *
+ * Given an MSA with RF annotation, determine which sequences have inserts after column <target>
+ * of at least size <min> and at most size <max>. Fill an array <useme> of size msa->nseq with
+ * TRUE seq i has the insert, FALSE if it doesn't.
+ */
+static int find_seqs_with_given_insert(ESL_MSA *msa, int *i_am_rf, char *errbuf, int target, int min, int max, int **ret_useme)
+{
+ int status;
+ int apos, rfpos, clen;
+ int **ict;
+ int *useme;
+ int i;
+
+ /* contract check */
+ if(! (msa->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINVAL, errbuf, "in find_seqs_with_given_insert(), msa must be digitized.");
+ if(msa->rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "No #=GC RF markup in alignment, it is needed for --seq-ins.");
+
+ ESL_ALLOC(useme,sizeof(int) * (msa->nseq));
+ ESL_ALLOC(ict, sizeof(int *) * (msa->alen+2));
+ for(i = 0; i <= msa->alen; i++)
+ {
+ ESL_ALLOC(ict[i], sizeof(int) * (msa->nseq));
+ esl_vec_ISet(ict[i], (msa->nseq), 0);
+ }
+
+ rfpos = 0;
+ for(apos = 1; apos <= msa->alen; apos++)
+ {
+ if(i_am_rf[apos-1]) {
+ rfpos++;
+ }
+ else
+ for(i = 0; i < msa->nseq; i++)
+ if(! esl_abc_XIsGap(msa->abc, msa->ax[i][apos])) {
+ ict[rfpos][i]++;
+ }
+ }
+ clen = rfpos;
+ if(target > clen) ESL_FAIL(eslEINVAL, errbuf, "--seq-ins <n> enabled with <n> = %d, but non-gap RF length of alignment is only %d columns.", target, clen);
+
+ for(i = 0; i < msa->nseq; i++) {
+ /* printf("ict[target:%d][i:%d]: %d, min: %d max: %d\n", target, i, ict[target][i], min, max); */
+ useme[i] = ((ict[target][i] >= min) && (ict[target][i] <= max)) ? TRUE : FALSE;
+ }
+
+ *ret_useme = useme;
+ for(i = 0; i <= msa->alen; i++)
+ free(ict[i]);
+ free(ict);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* minorize_msa()
+ *
+ * Given an MSA with #=GS <seq name> <<tag>> <minor set name>, make a new msa that
+ * includes all seqs that have the same <minor set name> #=GS annotation for the
+ * same <<tag>> (string value of <tag> is set at command line and passed into
+ * this function)
+ * Also set the #=GC RF markup for each minor subset as either:
+ * (A) the #=GF <x> <y> with <x> equal to <minor set name> and <y>
+ * as the RF line.
+ *
+ * or, if no such #=GF markup exists define the consensus with the
+ * gap fraction rule, any column with <= <x> (from --gapthresh <x>)
+ * gaps becomes an 'x' in the RF seq, all other columns are '.'.
+ */
+static int
+minorize_msa(const ESL_GETOPTS *go, ESL_MSA *msa, char *errbuf, FILE *fp, char *tag, int outfmt)
+{
+ int status;
+ int *useme = NULL;
+ int nalloc = 1;
+ int nmin = 0;
+ int *which_minor = NULL; /* [0..i..msa->nseq-1] which minor subset each sequence belongs to, -1 if none */
+ char **minorA = NULL; /* [0..m..nmin-1] ptr to minor subset name in #=GS markup, only a ptr, don't free the char strings */
+ int f, g, i, m, mt;
+ int gt = -1;
+ void *tmp;
+ char *rf;
+ int apos;
+ int ip;
+ int *order;
+ ESL_MSA **minor_msaA;
+
+ /* contract check */
+ if(msa->rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "-M requires #=GC RF markup in alignment.");
+ if(msa->gs == NULL) ESL_FAIL(eslEINVAL, errbuf, "-M requires #=GS markup in alignment denoting minor subsets.");
+
+ /* determine which tag matches <tag> */
+ for(g = 0; g < msa->ngs; g++) {
+ if(strcmp(msa->gs_tag[g], tag) == 0) {
+ gt = g;
+ break;
+ }
+ }
+ if(gt == -1) ESL_FAIL(eslEINVAL, errbuf, "No #=GS markup has tag: %s\n", tag);
+
+ /* determine which minor set each seq belongs to, reallocate minorA as we go and see new minor subsets */
+ ESL_ALLOC(which_minor, sizeof(int) * msa->nseq);
+ ESL_ALLOC(minorA, sizeof(char *) * nalloc);
+ esl_vec_ISet(which_minor, msa->nseq, -1);
+
+ for(i = 0; i < msa->nseq; i++) {
+ if(msa->gs[gt][i] != NULL) {
+ mt = -1;
+ for(m = 0; m < nmin; m++) {
+ if(strcmp(minorA[m], msa->gs[gt][i]) == 0) {
+ mt = m;
+ break;
+ }
+ }
+ if(mt == -1) {
+ if((nmin+1) == nalloc) {
+ nalloc++;
+ ESL_RALLOC(minorA, tmp, sizeof(char *) * nalloc);
+ }
+ minorA[nmin] = msa->gs[gt][i];
+ mt = nmin++;
+ }
+ which_minor[i] = mt;
+ }
+ }
+ for(i = 0; i < msa->nseq; i++) if(which_minor[i] == -1) ESL_FAIL(eslEINVAL, errbuf, "-M requires ALL sequences have #=GS markup with user supplied tag %s. Seq %d (%s) has none.\n", esl_opt_GetString(go, "-M"), i, msa->sqname[i]);
+
+ /* Now make the minor alignments by keeping only the relevant subset of seqs.
+ * We do not call esl_msa_MinimGaps() b/c we want the alignment length to be
+ * identical b/t all minor msas, and the RF also so cmalign knows how to
+ * map the minor alignments to the major alignment */
+ ESL_ALLOC(minor_msaA, sizeof(ESL_MSA *) * nmin);
+ ESL_ALLOC(useme, sizeof(int) * msa->nseq);
+ for(m = 0; m < nmin; m++) {
+ for(i = 0; i < msa->nseq; i++) useme[i] = (which_minor[i] == m) ? TRUE : FALSE;
+ if(esl_vec_ISum(useme, msa->nseq) == 0) esl_fatal("No sequences selected for minor MSA!\n");
+ if((status = esl_msa_SequenceSubset(msa, useme, &(minor_msaA[m]))) != eslOK) ESL_FAIL(status, errbuf, "Error taking subset for minor subset %d with name: %s\n", m, minorA[m]);
+
+ /* set name */
+ esl_msa_SetName(minor_msaA[m], minorA[m], -1);
+
+ /* unless --M-rf free RF annotation and set new annotation (--M-rf tells us to keep the initial RF annotation for all minor alignments */
+ if(! esl_opt_GetBoolean(go, "--M-rf")) {
+ if(minor_msaA[m]->rf == NULL) ESL_FAIL(eslEINCOMPAT, errbuf, "Error creating minor alignment %d, RF is NULL.", m);
+ free(minor_msaA[m]->rf);
+ minor_msaA[m]->rf = NULL;
+ /* Check if we have #=GF markup denoting the RF line for each minor subset */
+ rf = NULL;
+ for(f = 0; f < msa->ngf; f++)
+ if(strcmp(minorA[m], msa->gf_tag[f]) == 0) { rf = msa->gf[f]; break; }
+ if(rf != NULL) { /* ensure the RF annotation is the length of the alignment */
+ if(strlen(rf) != msa->alen) ESL_FAIL(eslEINCOMPAT, errbuf, "'#=GF %s <RF sequence>' markup is of length %d but it must be equal to aln length (%" PRId64 ").", msa->gf_tag[f], (int) strlen(rf), msa->alen);
+ if((status = esl_strdup(rf, msa->alen, &(minor_msaA[m]->rf))) != eslOK) ESL_FAIL(status, errbuf, "Error duplicating RF for minor alignment %d\n", m);
+ /* make sure minor_msaA[m]->rf does not have any non-gap columns where msa->rf has a gap (cmalign -M demands all minor consensus columns are also major consensus columns) */
+ for (apos = 0; apos < minor_msaA[m]->alen; apos++) {
+ if (! (esl_abc_CIsGap(minor_msaA[m]->abc, minor_msaA[m]->rf[apos]))) {
+ if (esl_abc_CIsGap(msa->abc, msa->rf[apos])) ESL_FAIL(eslEINCOMPAT, errbuf, "'#=GF %s <RF sequence>' markup has a non-gap (%c char) at aln position %d, but the major alignment has a gap there! cmalign will choke on this.\n", msa->gf_tag[f], minor_msaA[m]->rf[(apos-1)], apos);
+ }
+ }
+ }
+ else { /* no #=GF markup denoting RF line for alignment m existed in the input file, define it based on gaps */
+ if((status = write_rf_gapthresh(go, errbuf, minor_msaA[m], esl_opt_GetReal(go, "--M-gapt"))) != eslOK) return status;
+ /* careful, remember with cmalign -M, the minor alignments can only have training alignment column c defined as a consensus column
+ * if it is also consensus in the major alignment, so we have to remove any minor_msaA[m]->rf 'x' columns that are gaps in <msa>
+ */
+ for (apos = 0; apos < minor_msaA[m]->alen; apos++)
+ if (esl_abc_CIsGap(msa->abc, msa->rf[apos])) minor_msaA[m]->rf[apos] = '.';
+ }
+ }
+ }
+
+ /* Print out the alignments, first major, then minors */
+ /* first, reorder major alignment so that it contains the minor alignment seqs in order */
+ ip = 0;
+ ESL_ALLOC(order, sizeof(int) * msa->nseq);
+ for(m = 0; m < nmin; m++) {
+ for(i = 0; i < msa->nseq; i++) {
+ if(which_minor[i] == m) order[i] = ip++;
+ }
+ }
+ if((status = reorder_msa(msa, order, errbuf)) != eslOK) return status;
+
+ esl_msafile_Write(fp, msa, outfmt);
+ for(m = 0; m < nmin; m++) {
+ esl_msafile_Write(fp, minor_msaA[m], outfmt);
+ esl_msa_Destroy(minor_msaA[m]);
+ }
+ free(minor_msaA);
+
+ free(order);
+ free(useme);
+ free(which_minor);
+ free(minorA);
+ return eslOK;
+
+ ERROR:
+ if(which_minor != NULL) free(which_minor);
+ if(minorA != NULL) free(minorA);
+ if(useme != NULL) free(useme);
+ return eslEMEM;
+}
+
+
+/* remove_gc_markup()
+ *
+ * Given a GC tag <tag>, remove that markup from an MSA.
+ * Return eslEINVAL if <tag> does not exist.
+ */
+static int
+remove_gc_markup(ESL_MSA *msa, char *errbuf, char *tag)
+{
+ int does_not_exist = FALSE;
+
+ /* Currently, we can only handle removal of parsed GC markup, RF, SS_cons, SA_cons, PP_cons
+ * (the main reason is b/c I didn't know how to deal with possibility of the ESL_KEYHASH in msa->gc_idx).
+ */
+ if (strcmp(tag, "RF") == 0) {
+ if (msa->rf == NULL) does_not_exist = TRUE;
+ else { free(msa->rf); msa->rf = NULL; }
+ }
+ else if(strcmp(tag, "SS_cons") == 0) {
+ if (msa->ss_cons == NULL) does_not_exist = TRUE;
+ else { free(msa->ss_cons); msa->ss_cons = NULL; }
+ }
+ else if (strcmp(tag, "SA_cons") == 0) {
+ if (msa->sa_cons == NULL) does_not_exist = TRUE;
+ else { free(msa->sa_cons); msa->sa_cons = NULL; }
+ }
+ else if (strcmp(tag, "PP_cons") == 0) {
+ if (msa->pp_cons == NULL) does_not_exist = TRUE;
+ else { free(msa->pp_cons); msa->pp_cons = NULL; }
+ }
+ else {
+ ESL_FAIL(eslEINVAL, errbuf, "--rm-gc <s> only works if <s> is \'RF\', \'SS_cons\', \'SA_cons\', or \'PP_cons\'");
+ }
+ if(does_not_exist) {
+ ESL_FAIL(eslEINVAL, errbuf, "--rm-gc %s enabled but %s GC markup exists in the MSA.", tag, tag);
+ }
+ return eslOK;
+}
+
+
+/* add_gap_columns_to_msa
+ *
+ * Given an MSA and an array specifying a number
+ * of all gap columns to add after each column,
+ * add them. Reallocate all arrays as necessary.
+ * if(do_treat_as_rf_gap) make new column a gap
+ * in the RF line, else make it an 'x'.
+ *
+ * toadd is numbered 1..alen.
+ */
+static int
+add_gap_columns_to_msa(char *errbuf, ESL_MSA *msa, int *toadd, ESL_MSA **ret_msa, int do_treat_as_rf_gap)
+{
+ int status;
+ int i,j;
+ int apos;
+ int nnew = 0;
+ ESL_ALPHABET *abc;
+ char *newstr;
+ /* contract check */
+ if(! (msa->flags & eslMSA_DIGITAL))
+ ESL_FAIL(eslEINVAL, errbuf, "in add_gap_columns_to_msa(), msa must be digitized.");
+ for(apos = 0; apos <= msa->alen; apos++)
+ nnew += toadd[apos];
+
+ /* Textize the alignment */
+ abc = msa->abc;
+ esl_msa_Textize(msa);
+
+ ESL_MSA *newmsa;
+ /*printf("msa->nseq: %d\n", msa->nseq);
+ printf("msa->alen: %d\n", msa->alen);*/
+ newmsa = esl_msa_Create(msa->nseq, (msa->alen+nnew));
+
+ /* Copy and add gaps to all valid data that is [0..(alen-1)] or [1..alen] */
+ if(msa->ss_cons != NULL)
+ {
+ ESL_ALLOC(newmsa->ss_cons, sizeof(char) * (msa->alen+nnew+1));
+ if((status = cp_and_add_gaps_to_aseq(newmsa->ss_cons, msa->ss_cons, msa->alen, toadd, nnew, '.') != eslOK)) goto ERROR;
+ }
+ if(msa->sa_cons != NULL)
+ {
+ ESL_ALLOC(newmsa->sa_cons, sizeof(char) * (msa->alen+nnew+1));
+ if((status = cp_and_add_gaps_to_aseq(newmsa->sa_cons, msa->sa_cons, msa->alen, toadd, nnew, '.') != eslOK)) goto ERROR;
+ }
+ if(msa->pp_cons != NULL)
+ {
+ ESL_ALLOC(newmsa->pp_cons, sizeof(char) * (msa->alen+nnew+1));
+ if((status = cp_and_add_gaps_to_aseq(newmsa->pp_cons, msa->pp_cons, msa->alen, toadd, nnew, '.') != eslOK)) goto ERROR;
+ }
+ if(msa->rf != NULL)
+ {
+ ESL_ALLOC(newmsa->rf, sizeof(char) * (msa->alen+nnew+1));
+ if(do_treat_as_rf_gap)
+ {
+ if((status = cp_and_add_gaps_to_aseq(newmsa->rf, msa->rf, msa->alen, toadd, nnew, '.') != eslOK)) goto ERROR;
+ }
+ else if((status = cp_and_add_gaps_to_aseq(newmsa->rf, msa->rf, msa->alen, toadd, nnew, 'x') != eslOK)) goto ERROR;
+ }
+
+ if(msa->ss != NULL)
+ {
+ ESL_ALLOC(newmsa->ss, sizeof(char *) * msa->nseq);
+ for(i = 0; i < msa->nseq; i++)
+ {
+ if(msa->ss[i] != NULL)
+ {
+ ESL_ALLOC(newmsa->ss[i], sizeof(char) * (msa->alen+nnew+1));
+ if((status = cp_and_add_gaps_to_aseq(newmsa->ss[i], msa->ss[i], msa->alen, toadd, nnew, '.') != eslOK)) goto ERROR;
+ }
+ }
+ }
+
+ if(msa->sa != NULL)
+ {
+ ESL_ALLOC(newmsa->sa, sizeof(char *) * msa->nseq);
+ for(i = 0; i < msa->nseq; i++)
+ {
+ if(msa->sa[i] != NULL)
+ {
+ ESL_ALLOC(newmsa->sa[i], sizeof(char) * (msa->alen+nnew+1));
+ if((status = cp_and_add_gaps_to_aseq(newmsa->sa[i], msa->sa[i], msa->alen, toadd, nnew, '.') != eslOK)) goto ERROR;
+ }
+ }
+ }
+
+ if(msa->pp != NULL)
+ {
+ ESL_ALLOC(newmsa->pp, sizeof(char *) * msa->nseq);
+ for(i = 0; i < msa->nseq; i++)
+ {
+ if(msa->pp[i] != NULL)
+ {
+ ESL_ALLOC(newmsa->pp[i], sizeof(char) * (msa->alen+nnew+1));
+ if((status = cp_and_add_gaps_to_aseq(newmsa->pp[i], msa->pp[i], msa->alen, toadd, nnew, '.') != eslOK)) goto ERROR;
+ }
+ }
+ }
+
+ if(msa->ncomment > 0)
+ {
+ for(j = 0; j < msa->ncomment; j++)
+ {
+ if(msa->comment[j] != NULL)
+ esl_msa_AddComment(newmsa, msa->comment[j], -1);
+ }
+ }
+
+ if(msa->ngf > 0)
+ {
+ for(i = 0; i < msa->ngf; i++)
+ if(msa->gf[i] != NULL)
+ esl_msa_AddGF(newmsa, msa->gf_tag[i], -1, msa->gf[i], -1);
+ }
+
+ if(msa->ngs > 0)
+ {
+ for(j = 0; j < msa->ngs; j++)
+ {
+ for(i = 0; i < msa->nseq; i++)
+ if(msa->gs[j][i] != NULL)
+ esl_msa_AddGS(newmsa, msa->gs_tag[j], -1, i, msa->gs[j][i], -1);
+ }
+ }
+
+ if(msa->ngc > 0)
+ {
+ for(i = 0; i < msa->ngc; i++)
+ {
+ if(msa->gc[i] != NULL)
+ {
+ ESL_ALLOC(newstr, sizeof(char) * (msa->alen+nnew+1));
+ if((status = cp_and_add_gaps_to_aseq(newstr, msa->gc[i], msa->alen, toadd, nnew, '.') != eslOK)) goto ERROR;
+ esl_msa_AppendGC(newmsa, msa->gc_tag[i], newstr);
+ free(newstr);
+ }
+ }
+ }
+
+ if(msa->gr != NULL)
+ {
+ for(j = 0; j < msa->ngr; j++)
+ {
+ for(i = 0; i < msa->nseq; i++)
+ {
+ if(msa->gr[j][i] != NULL)
+ {
+ ESL_ALLOC(newstr, sizeof(char) * (msa->alen+nnew+1));
+ if((status = cp_and_add_gaps_to_aseq(newstr, msa->gr[j][i], msa->alen, toadd, nnew, '.') != eslOK)) goto ERROR;
+ esl_msa_AppendGR(newmsa, msa->gr_tag[j], i, newstr);
+ free(newstr);
+ }
+ }
+ }
+ }
+
+ /* copy the aseqs, free as we go to save memory */
+ for(i = 0; i < msa->nseq; i++)
+ {
+ esl_strdup(msa->sqname[i], -1, &(newmsa->sqname[i]));
+ if((status = cp_and_add_gaps_to_aseq(newmsa->aseq[i], msa->aseq[i], msa->alen, toadd, nnew, '.') != eslOK)) goto ERROR;
+ free(msa->aseq[i]);
+ msa->aseq[i] = NULL;
+ }
+ newmsa->abc = abc;
+ esl_msa_Digitize(newmsa->abc, newmsa, NULL);
+ esl_msa_Destroy(msa);
+ *ret_msa = newmsa;
+
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/*cp_and_add_gaps_to_aseq
+ *
+ * Given an aligned [0..alen-1] original text string,
+ * add toadd[apos-1] gaps after each residue.
+ * new_aseq must be already allocated.
+ *
+ * toadd is numbered 1..alen.
+ */
+static int cp_and_add_gaps_to_aseq(char *new_aseq, char *orig_aseq, int alen, int *toadd, int nnew, char gapchar)
+{
+ int orig_apos = 0;
+ int new_apos = 0;
+ int i;
+
+ for(i = 0; i < toadd[0]; i++)
+ new_aseq[new_apos++] = gapchar;
+ for(orig_apos = 0; orig_apos < alen; orig_apos++)
+ {
+ new_aseq[new_apos++] = orig_aseq[orig_apos];
+ for(i = 0; i < toadd[(orig_apos+1)]; i++)
+ new_aseq[new_apos++] = gapchar;
+ }
+ new_aseq[new_apos] = '\0';
+ return eslOK;
+}
+
+
+/* Function: convert_post_to_pp()
+ *
+ * Purpose: Convert 'POST' annotation in an MSA (from Infernal 0.72-1.0)
+ * to 'PP' annotation in place. <nali> is provided only so that
+ * we can provide it in an error message if nec.
+ *
+ */
+static int
+convert_post_to_pp(ESL_MSA *msa, char *errbuf, int nali)
+{
+ int status;
+ int ridx1, ridx2, ndigits;
+ int r,i,apos;
+ int ir2;
+
+ /* Find out which #=GR line is the POST, Post, or post line (if more than one exist, last one is chosen) */
+ ridx1 = -1;
+ ridx2 = -1;
+ ndigits = 0;
+ for (r = 0; r < msa->ngr; r++) {
+ if (strcmp(msa->gr_tag[r], "POST") == 0) { ridx1 = r; ndigits = 1; }
+ if (strcmp(msa->gr_tag[r], "Post") == 0) { ridx1 = r; ndigits = 1; }
+ if (strcmp(msa->gr_tag[r], "post") == 0) { ridx1 = r; ndigits = 1; }
+ if (strcmp(msa->gr_tag[r], "POSTX.") == 0) { ridx1 = r; ndigits = 1; }
+ if (strcmp(msa->gr_tag[r], "POST.X") == 0) { ridx2 = r; ndigits = 2; }
+ }
+ if(ndigits == 0) {
+ ESL_FAIL(eslEINVAL, errbuf, "--post2pp requires \"#=GR POST\", \"#=GR Post\", \"#=GR post\", \"#=GR POSTX.\", or \"#=GR POSTX.\" and \"#=GR POST.X\" annotation, it's missing from alignment %d\n", nali);
+ }
+ if(ndigits == 2 && ridx1 == -1) {
+ ESL_FAIL(eslEINVAL, errbuf, "found \"#=GR POST.X\" annotation but not \"#=GR POSTX.\" in alignment %d.\n", nali);
+ }
+ /* make sure that the POST annotation is the only GR annotation we have,
+ * this should be the case if alignment was created with infernal's cmalign
+ * v0.72-v1.0.2, which is the only type of alignments that should have POST
+ * annotation */
+ if((ndigits == 1 && msa->ngr != 1) || (ndigits == 2 && msa->ngr != 2))
+ ESL_FAIL(eslEINVAL, errbuf, "additional \"#=GR\" annotation exists besides posteriors, alignment wasn't created by cmalign v0.72-v1.0.2");
+
+ ESL_ALLOC(msa->pp, sizeof(char *) * msa->nseq);
+ for(i = 0; i < msa->nseq; i++) {
+ ESL_ALLOC(msa->pp[i], sizeof(char) * (msa->alen+1));
+ }
+ if(ndigits == 1) { /* easy case, just copy the annotation */
+ for(i = 0; i < msa->nseq; i++) {
+ esl_strdup(msa->gr[ridx1][i], msa->alen, &(msa->pp[i]));
+ free(msa->gr[ridx1][i]);
+ }
+ free(msa->gr[ridx1]);
+ }
+ else { /* ndigits == 2 */
+ for(i = 0; i < msa->nseq; i++) {
+ for(apos = 0; apos < msa->alen; apos++) {
+ if(esl_abc_CIsGap(msa->abc, msa->gr[ridx1][i][apos])) {
+ if(! esl_abc_CIsGap(msa->abc, msa->gr[ridx2][i][apos])) ESL_FAIL(eslEINVAL, errbuf, "reading post annotation for seq: %d aln column: %d, post 'tens' value gap but post 'ones' value is gap.\n", i, apos);
+ msa->pp[i][apos] = '.';
+ }
+ else if(msa->gr[ridx1][i][apos] == '*') {
+ if(msa->gr[ridx2][i][apos] != '*') ESL_FAIL(eslEINVAL, errbuf, "reading post annotation for aln %d, seq: %d aln column: %d, post 'tens' value '*' but post 'ones' value != '*'.\n", nali, i, apos);
+ msa->pp[i][apos] = '*';
+ }
+ else {
+ ir2 = (int) (msa->gr[ridx2][i][apos] - '0');
+ if(ir2 >= 5) { /* round up, being careful to round 95 and above to '*' */
+ msa->pp[i][apos] = (msa->gr[ridx1][i][apos] == '9') ? '*' : msa->gr[ridx1][i][apos] + 1;
+ }
+ else {
+ msa->pp[i][apos] = msa->gr[ridx1][i][apos];
+ }
+ }
+ }
+ free(msa->gr[ridx1][i]);
+ free(msa->gr[ridx2][i]);
+ }
+ free(msa->gr[ridx1]);
+ free(msa->gr[ridx2]);
+ }
+ /* done filling msa->pp, now free gr annotation, we know from check above
+ * the msa's GR annotation only consists of the posterior annotation, so
+ * we can safely remove GR altogether (without worrying about reordering other GRs) */
+ free(msa->gr);
+ msa->gr = NULL;
+ msa->ngr = 0;
+ /* gr_idx will no longer be valid so we destroy it,
+ * we could recreate it, but it's only used for parsing anyhow */
+ if(msa->gr_idx != NULL) { esl_keyhash_Destroy(msa->gr_idx); msa->gr_idx = NULL; }
+ msa->gr_idx = NULL;
+
+ return eslOK;
+
+ ERROR:
+ esl_fatal("convert_post_to_pp(), memory allocation error.");
+ return eslOK; /* NEVERREACHED */
+}
+
+/* write_rf_gapthresh
+ *
+ * Given an MSA write/rewrite RF based on fraction
+ * of gaps in each column. If fraction < gapthresh RF is an 'x',
+ * otherwise it's a '.' (gap).
+ */
+static int
+write_rf_gapthresh(const ESL_GETOPTS *go, char *errbuf, ESL_MSA *msa, float gapthresh)
+{
+ int status;
+ int64_t apos;
+ int64_t gaps;
+ int i;
+ int nrf = 0;
+
+ if(msa->rf == NULL) {
+ ESL_ALLOC(msa->rf, sizeof(char) * (msa->alen+1));
+ }
+ /* set as all gaps */
+ for (apos = 1; apos <= msa->alen; apos++) msa->rf[(apos-1)] = '.';
+
+ for (apos = 1; apos <= msa->alen; apos++) {
+ for (gaps = 0, i = 0; i < msa->nseq; i++) {
+ if (esl_abc_XIsGap(msa->abc, msa->ax[i][apos])) gaps++;
+ }
+ if((double) gaps / (double) msa->nseq < gapthresh) { /* column passes gap threshold */
+ nrf++;
+ msa->rf[(apos-1)] = 'x';
+ }
+ else { /* column fails the gap threshold */
+ msa->rf[(apos-1)] = '.';
+ }
+ }
+ msa->rf[msa->alen] = '\0';
+
+ return eslOK;
+ ERROR:
+ return status;
+}
+
+/* Function: compare_ints()
+ *
+ * Purpose: Comparison function for qsort(). Used
+ * by msa_median_length().
+ *
+ * Return 1 if el1 > el2, -1 if el1 < el2 and 0 if el1 == el2.
+ * This will result in a sorted list with smallest
+ * element as the first element, largest as the last.
+ */
+int
+compare_ints(const void *el1, const void *el2)
+{
+ if ((* ((int *) el1)) > (* ((int *) el2))) return 1;
+ else if ((* ((int *) el1)) < (* ((int *) el2))) return -1;
+ return 0;
+}
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/miniapps/esl-alimanip.itest.pl b/miniapps/esl-alimanip.itest.pl
new file mode 100755
index 0000000..c2b3717
--- /dev/null
+++ b/miniapps/esl-alimanip.itest.pl
@@ -0,0 +1,354 @@
+#! /usr/bin/perl
+
+# Integrated test of the esl-alimanip miniapp.
+#
+# Usage: ./esl-alimanip.itest.pl <esl-alimanip binary> <tmpfile prefix>
+# Example: ./esl-alimanip.itest.pl ./esl-alimanip foo
+#
+# EPN, Tue Feb 2 13:19:44 2010
+
+$eslalimanip= shift;
+$tmppfx = shift;
+
+if (! -x "$eslalimanip") { die "FAIL: didn't find esl-alimanip binary $eslalimanip"; }
+
+# <[miniapps]> esl-seqstat --rna -a foo.stk
+#= seq1 29
+#= seq2 31
+#= seq3 20
+
+open(ALIFILE, ">$tmppfx.stk") || die "FAIL: couldn't open $tmppfx.stk for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+seq1 aaAAAA..AAAA...Cc.cCCCCCC.C..GGGGGgggg
+#=GR seq1 PP 5789**..**88...*9.9****88.7..776543210
+seq2 ..AAAAa.AAAAaacCcccCCCCCCcCccGGGGG....
+#=GR seq2 PP ..********************************....
+seq3 ..AAAA..AAAA...C...CCCCCC.C..GGGG-....
+#=GR seq3 PP ..5555..4*44...3...888888.8..8899.....
+#=GC SS_cons ...............<...<<<<......>>>>>....
+#=GC PP_cons ..789*..8877...8...****99.8..99998....
+#=GC RF ..AAAA..AAAA...C...CCCCCC.c..GGGGG....
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.stk2") || die "FAIL: couldn't open $tmppfx.stk2 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+seq1 aaAANA..AAAA...Cc.cCCCCCC.C..GGGGGgggg
+#=GR seq1 PP 5789**..**88...*9.9****88.7..776543210
+seq2 ..AARAa.AAAAaacCcccCCCCCCcCccGGGGG....
+#=GR seq2 PP ..********************************....
+seq3 ..AAAA..AAAA...C...CCCCCC.C..GGGG-....
+#=GR seq3 PP ..5555..4*44...3...888888.8..8899.....
+#=GC SS_cons ...............<...<<<<......>>>>>....
+#=GC PP_cons ..789*..8877...8...****99.8..99998....
+#=GC RF ..AAAA..AAAA...C...CCCCCC.c..GGGGG....
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.post.stk") || die "FAIL: couldn't open $tmppfx.oldp.stk for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+seq1 aaAAAA..AAAA...Cc.cCCCCCC.C..GGGGGgggg
+#=GR seq1 POSTX. 5789**..**88...*9.9****88.7..776543210
+#=GR seq1 POST.X 3717**..**71...*2.3****34.5..239189922
+seq2 ..AAAAa.AAAAaacCcccCCCCCCcCccGGGGG....
+#=GR seq2 POSTX. ..********************************....
+#=GR seq2 POST.X ..********************************....
+seq3 ..AAAA..AAAA...C...CCCCCC.C..GGGG-....
+#=GR seq3 POSTX. ..5555..4*44...3...888888.8..8899.....
+#=GR seq3 POST.X ..4567..3*99...1...788882.1..0815.....
+#=GC SS_cons ...............<...<<<<......>>>>>....
+#=GC RF ..AAAA..AAAA...C...CCCCCC.c..GGGGG....
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.afa") || die "FAIL: couldn't open $tmppfx.afa for writing alifile";
+print ALIFILE << "EOF";
+>seq1
+aaAAAA..AAAA...Cc.cCCCCCC.C..GGGGGgggg
+>seq2
+..AAAAa.AAAAaacCcccCCCCCCcCccGGGGG....
+>seq3
+..AAAA..AAAA...C...CCCCCC.C..GGGG-....
+EOF
+close ALIFILE;
+
+open(LISTFILE, ">$tmppfx.list") || die "FAIL: couldn't open $tmppfx.stk for writing alifile";
+print LISTFILE << "EOF";
+seq1
+seq2
+EOF
+close LISTFILE;
+
+open(LISTFILE, ">$tmppfx.list2") || die "FAIL: couldn't open $tmppfx.stk for writing alifile";
+print LISTFILE << "EOF";
+seq3
+seq2
+seq1
+EOF
+close LISTFILE;
+
+open(SEQFILE, ">$tmppfx.trim.fa") || die "FAIL: couldn't open $tmppfx.trim.fa for writing alifile";
+print SEQFILE << "EOF";
+>seq1
+ccCCCCCCCGGGGGg
+>seq2
+CCCCcCccGG
+>seq3
+AACCCCCCCCG
+EOF
+close SEQFILE;
+
+open(MASKFILE, ">$tmppfx.rfmask") || die "FAIL: couldn't open $tmppfx.trim.fa for writing alifile";
+print MASKFILE << "EOF";
+011011110101110110101
+EOF
+close MASKFILE;
+
+open(MASKFILE, ">$tmppfx.amask") || die "FAIL: couldn't open $tmppfx.trim.fa for writing alifile";
+print MASKFILE << "EOF";
+01011011011010111011111101010010001100
+EOF
+close MASKFILE;
+
+$output = `$eslalimanip -h`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly"; }
+if ($output !~ /Usage: esl-alimanip/) { die "FAIL: help output not right"; }
+
+$output = `$eslalimanip --devhelp`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly"; }
+if ($output !~ /Usage: esl-alimanip/) { die "FAIL: devhelp output not right"; }
+
+
+$output = `$eslalimanip --rna $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /\#=GR seq1 PP 5789\*\*..\*\*88...\*9.9\*\*\*\*88.7..776543210/) { die "FAIL: alignment manipulated incorrectly"; }
+
+system("$eslalimanip -o $tmppfx.o.stk --rna $tmppfx.stk > /dev/null");
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+$output = `cat $tmppfx.o.stk`;
+if ($output !~ /\#=GR seq1 PP 5789\*\*..\*\*88...\*9.9\*\*\*\*88.7..776543210/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --dna $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /\#=GR seq1 PP 5789\*\*..\*\*88...\*9.9\*\*\*\*88.7..776543210/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --amino $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /\#=GR seq1 PP 5789\*\*..\*\*88...\*9.9\*\*\*\*88.7..776543210/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --informat stockholm $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /\#=GR seq1 PP 5789\*\*..\*\*88...\*9.9\*\*\*\*88.7..776543210/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --informat pfam $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /\#=GR seq1 PP 5789\*\*..\*\*88...\*9.9\*\*\*\*88.7..776543210/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --informat afa $tmppfx.afa 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /--AAAA--AAAA---C---CCCCCC-C--GGGG-----/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --outformat afa $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /AAAAAA--AAAA---CC-CCCCCCC-C--GGGGGGGGG/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --outformat psiblast $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /aaAAAA--AAAA---Cc-cCCCCCC-C--GGGGGgggg/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --outformat a2m $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /aaAAAAAAAACccCCCCCCCGGGGGgggg/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --lnfract 0.9 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --lnfract 0.9 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq3
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --lxfract 1.02 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq2
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --lmin 30 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq1 and seq3
+if ($output =~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --lmax 29 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq2
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --rffract 0.953 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq3
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --detrunc 1 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq3
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --xambig 0 $tmppfx.stk2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq1 and seq2
+if ($output =~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --seq-k $tmppfx.list $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq3
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --seq-k $tmppfx.list --informat pfam --small $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq3
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --k-reorder --seq-k $tmppfx.list $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq3
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --seq-r $tmppfx.list $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq1 and seq2
+if ($output =~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --seq-r $tmppfx.list --informat pfam --small $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should remove seq1 and seq2
+if ($output =~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --seq-ins 9 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should keep seq1 and seq 2
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --seq-ins 9 --seq-ni 3 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should keep only seq2
+if ($output =~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --seq-ins 9 --seq-xi 2 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should only keep seq1
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output =~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --trim $tmppfx.trim.fa $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /seq1\s+----------------C-CCCCCCC-C--GGGGGG---/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq3\s+----------AA---C---CCCCCC-C--G--------/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --minpp 0.9 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /seq1\s+----AA--AA-----C---CCCC---------------/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq3\s+---------A----------------------------/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --reorder $tmppfx.list2 $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+# should keep all seqs
+if ($output !~ /seq1/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq2/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /seq3/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --mask2rf $tmppfx.rfmask $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /#=GC RF ...xx...xxxx.......x.xxx..x..x.x.x..../) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --m-keeprf --mask2rf $tmppfx.rfmask $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /#=GC RF ...AA...AAAA.......C.CCC..c..G.G.G..../) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --mask2rf $tmppfx.amask $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /#=GC RF .x.xx.xx.xx.x.xxx.xxxxxx.x.x..x...xx../) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --m-keeprf --mask2rf $tmppfx.amask $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /#=GC RF .x.AA.xx.AA.x.xCx.xCCCCC.x.x..G...xx../) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --num-all $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /#=GC COLX. 00000000011111111112222222222333333333/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /#=GC COL.X 12345678901234567890123456789012345678/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --num-rf $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output !~ /#=GC RFCOLX. ..0000..0000...0...111111.1..11122..../) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /#=GC RFCOL.X ..1234..5678...9...012345.6..78901..../) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --rm-gc RF $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output =~ /#=GC RF/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --rm-gc SS_cons $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output =~ /#=GC SS_cons/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --rm-gc PP_cons $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly";}
+if ($output =~ /#=GC PP_cons/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --sindi $tmppfx.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly"; }
+if ($output !~ /#=GR seq1 SS :::::::::::::::<---<<<<______>>>>>::::/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /#=GR seq3 SS :::::::::::::::::::<<<<______>>>>:::::/) { die "FAIL: alignment manipulated incorrectly"; }
+
+$output = `$eslalimanip --rna --post2pp $tmppfx.post.stk 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimanip failed unexpectedly"; }
+if ($output !~ /#=GR seq1 PP 588\*\*\*..\*\*98...\*9.9\*\*\*\*88.8..777554310/) { die "FAIL: alignment manipulated incorrectly"; }
+if ($output !~ /#=GR seq3 PP ..5666..4\*55...3...999998.8..899\*...../) { die "FAIL: alignment manipulated incorrectly"; }
+
+print "ok\n";
+unlink "$tmppfx.stk";
+unlink "$tmppfx.stk2";
+unlink "$tmppfx.o.stk";
+unlink "$tmppfx.post.stk";
+unlink "$tmppfx.afa";
+unlink "$tmppfx.list";
+unlink "$tmppfx.list2";
+unlink "$tmppfx.trim.fa";
+unlink "$tmppfx.rfmask";
+unlink "$tmppfx.amask";
+exit 0;
diff --git a/miniapps/esl-alimanip.man b/miniapps/esl-alimanip.man
new file mode 100644
index 0000000..a5bb6c9
--- /dev/null
+++ b/miniapps/esl-alimanip.man
@@ -0,0 +1,344 @@
+.TH "esl-alimanip" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-alimanip - manipulate a multiple sequence alignment
+
+.SH SYNOPSIS
+
+.B esl-alimanip
+.I [options]
+.I msafile
+
+.SH DESCRIPTION
+
+.pp
+.B esl-alimanip
+can manipulate the multiple sequence alignment(s) in
+.I msafile
+in various ways. Options exist to remove
+specific sequences, reorder sequences, designate reference columns
+using Stockholm "#=GC RF" markup, and add annotation that numbers
+columns.
+
+The alignments can be of protein or DNA/RNA sequences. All alignments
+in the same
+.I msafile
+must be either protein or DNA/RNA. The alphabet will be autodetected
+unless one of the options
+.I --amino,
+.I --dna,
+or
+.I --rna
+are given.
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.BI -o " <f>"
+Save the resulting, modified alignment in Stockholm format to a file
+.I <f>.
+The default is to write it to standard output.
+
+.TP
+.BI --informat " <s>"
+Specify that the input alignment be format
+.I <s>.
+At preset, the only valid choices for
+.I <s>
+are: 'stockholm', 'pfam', and 'afa'. 'pfam' is a special
+case of Stockholm format in which each sequence is placed on a single
+line, instead of being interleaved; 'afa' is aligned FASTA. By default
+alignments are assumed to be in Stockholm format (either interleaved
+or Pfam).
+
+.TP
+.BI --outformat " <s>"
+Specify that the output alignment be format
+.I <s>.
+Choices for
+.I <s>
+are: 'stockholm', 'pfam', 'a2m', 'psiblast', 'afa'.
+By default the alignment is output in interleaved Stockholm format.
+
+.TP
+.B --devhelp
+Print help, as with
+.B "-h",
+but also include undocumented developer options. These options are not
+listed below, are under development or experimental, and are not
+guaranteed to even work correctly. Use developer options at your own
+risk. The only resources for understanding what they actually do are
+the brief one-line description printed when
+.B "--devhelp"
+is enabled, and the source code.
+
+.SH EXPERT OPTIONS
+
+.TP
+.BI --lnfract " <x>"
+Remove any sequences with length less than
+.I <x>
+fraction the length of the median length sequence in the alignment.
+
+.TP
+.BI --lxfract " <x>"
+Remove any sequences with length more than
+.I <x>
+fraction the length of the median length sequence in the alignment.
+
+.TP
+.BI --lmin " <n>"
+Remove any sequences with length less than
+.I <n>
+residues.
+
+.TP
+.BI --lmax " <n>"
+Remove any sequences with length more than
+.I <n>
+residues.
+
+.TP
+.BI --rfnfract " <x>"
+Remove any sequences with nongap RF length less than
+.I <x>
+fraction the nongap RF length of the alignment.
+
+.TP
+.BI --detrunc " <n>"
+Remove any sequences that have all gaps in the first
+.I <n>
+non-gap #=GC RF columns or the last
+.I <n>
+non-gap #=GC RF columns.
+
+.TP
+.BI --xambig " <n>"
+Remove any sequences that has more than
+.I <n>
+ambiguous (degenerate) residues.
+
+.TP
+.BI --seq-r " <f>"
+Remove any sequences with names listed in file
+.I <f>.
+Sequence names listed in
+.I <f>
+can be separated by tabs, new lines, or spaces.
+The file must be in Stockholm format for this option to work.
+
+.TP
+.BI --seq-k " <f>"
+Keep only sequences with names listed in file
+.I <f>.
+Sequence names listed in
+.I <f>
+can be separated by tabs, new lines, or spaces.
+By default, the kept sequences will remain in the original order
+they appeared in
+.I msafile,
+but the order from
+.I <f>
+will be used if the
+.B --k-reorder
+option is enabled.
+The file must be in Stockholm format for this option to work.
+
+.TP
+.BI --small
+With
+.B --seq-k
+or
+.B --seq-r,
+operate in small memory mode.
+The alignment(s) will not be stored in memory, thus
+.B --seq-k
+and
+.B --seq-r
+will be able to work on very large alignments regardless
+of the amount of available RAM.
+The alignment file must be in Pfam
+format and
+.BI --informat " pfam"
+and one of
+.B --amino,
+.B --dna,
+or
+.B --rna
+must be given as well.
+
+.TP
+.BI --k-reorder
+With
+.BI --seq-k " <f>",
+reorder the kept sequences in the output alignment to the order
+from the list file
+.I <f>.
+
+.TP
+.BI --seq-ins " <n>"
+Keep only sequences that have at least 1 inserted residue after
+nongap RF position
+.I <n>.
+
+.TP
+.BI --seq-ni " <n>"
+With
+.B --seq-ins
+require at least
+.I <n>
+inserted residues in a sequence for it to be kept.
+
+.TP
+.BI --seq-xi " <n>"
+With
+.B --seq-ins
+allow at most
+.I <n>
+inserted residues in a sequence for it to be kept.
+
+.TP
+.BI --trim " <f>"
+File
+.I <f>
+is an unaligned FASTA file containing truncated versions of each
+sequence in the
+.I msafile.
+Trim the sequences in the alignment to match their truncated versions
+in
+.I <f>.
+If the alignment output format is Stockholm (the default output
+format), all per-column (GC) and per-residue (GR) annotation will be
+removed from the alignment when
+.B --trim
+is used. However, if
+.B --t-keeprf
+is also used, the reference annotation (GC RF) will be kept.
+
+.TP
+.B --t-keeprf
+Specify that the 'trimmed' alignment maintain the original
+reference (GC RF) annotation. Only works in combination with
+.B --trim.
+
+.TP
+.BI --minpp " <x>"
+Replace all residues in the alignments for which the posterior
+probability annotation (#=GR PP) is less than
+.I <x>
+with gaps. The PP annotation for these residues is also converted to
+gaps.
+.I <x>
+must be greater than 0.0 and less than or equal to 0.95.
+
+.TP
+.BI --tree " <f>"
+Reorder sequences by tree order.
+Perform single linkage clustering on the sequences in the alignment
+based on sequence identity given the alignment to define a 'tree'
+of the sequences. The sequences in the alignment are reordered
+according to the tree, which groups similar sequences together. The
+tree is output in Newick format to
+.I <f>.
+
+.TP
+.BI --reorder " <f>"
+Reorder sequences to the order listed in file
+.I <f>.
+Each sequence in the alignment must be listed in
+.I <f>.
+Use
+.B --k-reorder
+to reorder only a subset of sequences to a subset alignment file.
+The file must be in Stockholm format for this option to work.
+
+.TP
+.BI --mask2rf " <f>"
+Read in the 'mask' file
+.I <f>
+and use it to define new #=GC RF annotation for the
+alignment.
+.I <f>
+must be a single line, with exactly
+.I <alen>
+or
+.I <rflen>
+characters, either the full alignment length or the number of nongap #=GC RF characters, respectively.
+Each character must be either a '1'
+or a '0'. The new #=GC RF markup will contain an 'x' for each column
+that is a '1' in lane mask file, and a '.' for each column that is a '0'.
+If the mask is of length
+.I <rflen>
+then it is interpreted as applying to only nongap RF characters in the
+existing RF annotation, all gap RF characters will remain gaps and
+nongap RF characters will be redefined as above.
+
+.TP
+.BI --m-keeprf
+With
+.B --mask2rf,
+do not overwrite existing nongap RF characters that are included by
+the input mask as 'x', leave them as the character they are.
+
+.TP
+.BI --num-all
+Add annotation to the alignment numbering all of the columns in the
+alignment.
+
+.TP
+.BI --num-rf
+Add annotation to the alignment numbering the non-gap (non '.') #=GC
+RF columns of the alignment.
+
+.TP
+.BI --rm-gc " <s>"
+Remove certain types of #=GC annotation from the alignment.
+.I "<s>"
+must be either "RF", "SS_cons", "SA_cons", or "PP_cons",
+at present.
+
+.TP
+.BI --sindi
+Annotate individual secondary structures for each sequence by imposing
+the consensus secondary structure defined by the #=GC SS_cons
+annotation.
+
+.TP
+.BI --post2pp
+Update Infernal's cmalign 0.72-1.0.2 posterior probability "POST"
+annotation to "PP" annotation, which is read by other miniapps,
+including
+.B esl-alimask
+and
+.B esl-alistat.
+
+.TP
+.B --amino
+Assert that the
+.I msafile
+contains protein sequences.
+
+.TP
+.B --dna
+Assert that the
+.I msafile
+contains DNA sequences.
+
+.TP
+.B --rna
+Assert that the
+.I msafile
+contains RNA sequences.
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-alimap.c b/miniapps/esl-alimap.c
new file mode 100644
index 0000000..936e2ea
--- /dev/null
+++ b/miniapps/esl-alimap.c
@@ -0,0 +1,687 @@
+/* Map two multiple sequence alignments to each other.
+ *
+ * EPN, Tue Sep 23 13:39:03 2008
+ * SVN $Id: esl-alimanip.c 270 2008-06-19 20:45:47Z nawrockie $
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <math.h>
+#include <limits.h>
+
+#include "easel.h"
+#include "esl_distance.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_distance.h"
+#include "esl_dmatrix.h"
+#include "esl_vectorops.h"
+#include "esl_stack.h"
+#include "esl_tree.h"
+#include "esl_wuss.h"
+
+static char banner[] = "map two alignments to each other";
+static char usage[] = "[options] <msafile1> <msafile2>\n\
+<msafile1> and <msafile2> must be in Stockholm format.";
+
+#define NCHOICES 3
+#define DIAG 0
+#define VERT 1
+#define HORZ 2
+
+static int map_msas(const ESL_GETOPTS *go, char *errbuf, ESL_MSA *msa1, ESL_MSA *msa2, int **ret_msa1_to_msa2_map);
+static int map_sub_msas(const ESL_GETOPTS *go, char *errbuf, ESL_MSA *msa1, ESL_MSA *msa2, char **ret_msa1_to_msa2_mask);
+static int map_rfpos_to_apos(ESL_MSA *msa, int **ret_rf2a_map, int **ret_a2rf_map, int *ret_rflen);
+static int map2masks(const ESL_GETOPTS *go, char *errbuf, int alen1, int alen2, int *a2rf_map1, int *a2rf_map2, int *rf2a_map1, int *rf2a_map2, int rflen1, int rflen2, int *msa1_to_msa2_map);
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-q", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "be quiet, don't print mapping of each column", 1 },
+ { "--mask-a2a", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "mask to <f>:'1'=msa1 aln col x maps msa2 aln col", 1 },
+ { "--mask-a2rf", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "mask to <f>:'1'=msa1 aln col x maps msa2 nongap RF col", 1 },
+ { "--mask-rf2a", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "mask to <f>:'1'=msa1 nongap RF col x maps msa2 aln col", 1 },
+ { "--mask-rf2rf",eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "mask to <f>:'1'=msa1 nongap RF col x maps msa2 nongap RF col", 1 },
+ { "--submap", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "<msafile2> is subaln of <msafile1>, output mask to <f>", 1 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--dna,--rna", "<msafile{1,2}> contain protein alignments", 1 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--amino,--rna", "<msafile{1,2}> contain DNA alignments", 1 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--amino,--dna", "<msafile{1,2}> contain RNA alignments", 1 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ ESL_ALPHABET *abc = NULL; /* biological alphabet */
+ char *alifile1= NULL; /* alignment 1 file name */
+ char *alifile2= NULL; /* alignment 2 file name */
+ int fmt; /* format code for alifiles */
+ ESL_MSAFILE *afp1 = NULL; /* open alignment file 1 */
+ ESL_MSAFILE *afp2 = NULL; /* open alignment file 2 */
+ ESL_MSA *msa1 = NULL; /* multiple sequence alignment 1 */
+ ESL_MSA *msa2 = NULL; /* multiple sequence alignment 2 */
+ int status; /* easel return code */
+ char errbuf[eslERRBUFSIZE*4];
+
+ int *msa1_to_msa2_map; /* map from <msafile1> to <msafile2> */
+ char *sub_msa1_to_msa2_mask; /* with --sub the map from <msafile1> to <msafile2> in mask form */
+ FILE *subfp = NULL;
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts("\nwhere basic options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ exit(0);
+ }
+
+ if (esl_opt_ArgNumber(go) != 2)
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ alifile1 = esl_opt_GetArg(go, 1);
+ alifile2 = esl_opt_GetArg(go, 2);
+
+ fmt = eslMSAFILE_STOCKHOLM;
+
+ /***********************************************
+ * Open the MSA files
+ ***********************************************/
+
+ if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+
+ if ( (status = esl_msafile_Open(&abc, alifile1, NULL, fmt, NULL, &afp1)) != eslOK) esl_msafile_OpenFailure(afp1, status);
+ if ( (status = esl_msafile_Open(&abc, alifile2, NULL, fmt, NULL, &afp2)) != eslOK) esl_msafile_OpenFailure(afp2, status);
+
+ /******************************************************************
+ * Read first alignment from each file, we only use the first one
+ ******************************************************************/
+
+ if ((status = esl_msafile_Read(afp1, &msa1)) != eslOK) esl_msafile_ReadFailure(afp1, status);
+ if ((status = esl_msafile_Read(afp2, &msa2)) != eslOK) esl_msafile_ReadFailure(afp2, status);
+
+ /* map the alignments in msa1 and msa2 */
+ if(! esl_opt_IsOn(go, "--submap")) {
+ if((status = map_msas(go, errbuf, msa1, msa2, &msa1_to_msa2_map)) != eslOK) goto ERROR;
+ free(msa1_to_msa2_map);
+ }
+
+ /* --submap: if nec, map <msafile1> to a subset of it's own columns in <msafile2> */
+ else { /* --submap was enabled */
+ if ((subfp = fopen(esl_opt_GetString(go, "--submap"), "w")) == NULL)
+ ESL_FAIL(eslFAIL, errbuf, "Failed to open --submap output file %s\n", esl_opt_GetString(go, "--submap"));
+ if((status = map_sub_msas(go, errbuf, msa1, msa2, &sub_msa1_to_msa2_mask)) != eslOK) goto ERROR;
+ fprintf(subfp, "%s\n", sub_msa1_to_msa2_mask);
+ fclose(subfp);
+ subfp = NULL;
+ printf("# Mask of 1/0s with 1 indicating aln column in %s maps to a column in %s saved to file %s.\n", alifile1, alifile2, esl_opt_GetString(go, "--submap"));
+ free(sub_msa1_to_msa2_mask);
+ }
+
+ /* Cleanup, normal return
+ */
+ esl_msafile_Close(afp1);
+ esl_msafile_Close(afp2);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ esl_msa_Destroy(msa1);
+ esl_msa_Destroy(msa2);
+ return 0;
+
+ ERROR:
+ if (afp1) esl_msafile_Close(afp1);
+ if (afp2) esl_msafile_Close(afp2);
+ if (go) esl_getopts_Destroy(go);
+ if (msa1) esl_msa_Destroy(msa1);
+ if (msa2) esl_msa_Destroy(msa2);
+ if (subfp) fclose(subfp);
+ esl_fatal(errbuf);
+ return 1; /* never reached */
+}
+
+
+/* map_msas
+ *
+ * Align msa1 and msa2.
+ * For each column in msa1, determine the corresponding column
+ * in msa2. This implementation requires:
+ * - msa1 and msa2 contain exactly the same sequences in the same order
+ * Note: the seqs in msa1 and msa2 do not have to have the same names.
+ *
+ * Uses a DP algorithm similar to Needleman-Wunsch, but that's aligning
+ * two alignment columns at a time instead of two residues.
+ */
+static int
+map_msas(const ESL_GETOPTS *go, char *errbuf, ESL_MSA *msa1, ESL_MSA *msa2, int **ret_msa1_to_msa2_map)
+{
+ int status;
+ int **one2two; /* [0..c..rflen1][0..a..alen2] number of residues from non-gap RF column c of msa1
+ * aligned in column a of msa 2 */
+ int *rf2a_map1 = NULL; /* msa1 map of reference columns (non-gap RF residues) to alignment columns, NULL if msa1->rf == NULL */
+ int *rf2a_map2 = NULL; /* msa2 map of reference columns (non-gap RF residues) to alignment columns, NULL if msa2->rf == NULL */
+ int *a2rf_map1 = NULL; /* msa1 map of alignment columns to reference columns, NULL if msa1->rf == NULL */
+ int *a2rf_map2 = NULL; /* msa2 map of alignment columns to reference columns, NULL if msa2->rf == NULL */
+ int apos1, apos2; /* counters over alignment position in msa1, msa2 respectively */
+ int alen1, alen2; /* alignment lengths */
+ int rfpos1, rfpos2; /* counters over reference positions */
+ int rflen1, rflen2; /* reference (non-gap RF) lengths */
+ int **mx; /* [0..c..rflen1][0..a..alen2] dp matrix, score of max scoring aln
+ * from 1..c in msa1 and 1..a in msa 2 */
+ int **tb; /* [0..c..rflen1][0..a..alen2] traceback ptrs, 0 for diagonal, 1 for vertical */
+ char *seq1, *seq2; /* temporary strings for ensuring dealigned sequences in msa1 and msa2 are identical */
+ int64_t len1, len2; /* length of seq1, seq2 */
+ int isgap1, isgap2; /* is this residue a gap in msa1, msa2? */
+ int i; /* counter over sequences */
+ int *res1_per_apos; /* [0..apos..alen1] number of residues in column apos of msa1 */
+ int sc; /* max score of full path (alignment) through dp mx */
+ int tb_sc; /* score of traceback, should equal sc */
+ int *one2two_map; /* [0..a..alen1] the alignment, msa2 column that column apos1 in msa1 maps to */
+ int total_res = 0; /* total number of residues in msa1 */
+ float coverage; /* fraction of total_res that are within mapped msa2 columns from one2two_map,
+ * this is tb_sc / total_res */
+ int total_cres1=0; /* total number of residues in reference positions in msa1 */
+ int covered_cres1 = 0; /* number of residues in reference positions in msa1 that also appear in the corresponding
+ * mapped column of msa2
+ */
+ int be_quiet = esl_opt_GetBoolean(go, "-q");
+ int *choices;
+ int i_choice;
+
+ /* contract check */
+ if(! (msa1->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINVAL, errbuf, "in map_msas() msa1 (%s) not digitized.\n", esl_opt_GetArg(go, 1));
+ if(! (msa2->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINVAL, errbuf, "in map_msas() msa2 (%s) not digitized.\n", esl_opt_GetArg(go, 2));
+ alen1 = msa1->alen;
+ alen2 = msa2->alen;
+
+ /* Map msa1 (reference) columns to alignment positions */
+ rflen1 = rflen2 = 0;
+ if(msa1->rf != NULL) if((status = map_rfpos_to_apos(msa1, &rf2a_map1, &a2rf_map1, &rflen1)) != eslOK) goto ERROR;
+ if(msa2->rf != NULL) if((status = map_rfpos_to_apos(msa2, &rf2a_map2, &a2rf_map2, &rflen2)) != eslOK) goto ERROR;
+ if(! be_quiet) {
+ printf("# %-25s alignment length: %d\n", esl_opt_GetArg(go, 1), alen1);
+ printf("# %-25s alignment length: %d\n", esl_opt_GetArg(go, 2), alen2);
+ }
+ /* collect counts in one2two[i][j]: number of sequences for which residue aligned in msa1 non-gap column i
+ * is aligned in msa2 alignment column j.
+ */
+ ESL_ALLOC(seq1, sizeof(char) * (alen1+1));
+ ESL_ALLOC(seq2, sizeof(char) * (alen2+1));
+ ESL_ALLOC(one2two, sizeof(int *) * (alen1+1));
+ for(apos1 = 0; apos1 <= alen1; apos1++) {
+ ESL_ALLOC(one2two[apos1], sizeof(int) * (alen2+1));
+ esl_vec_ISet(one2two[apos1], (alen2+1), 0);
+ }
+
+ total_res = 0;
+ for(i = 0; i < msa1->nseq; i++) {
+ /* ensure raw (unaligned) seq i in the 2 msas is the same */
+ esl_abc_Textize(msa1->abc, msa1->ax[i], alen1, seq1);
+ esl_abc_Textize(msa1->abc, msa2->ax[i], alen2, seq2); /* note: msa*1*->abc used on purpose, allows DNA/RNA to peacefully coexist in this func */
+ esl_strdealign(seq1, seq1, "-_.~", &len1);
+ esl_strdealign(seq2, seq2, "-_.~", &len2);
+
+ if(len1 != len2) {
+ ESL_FAIL(eslEINVAL, errbuf, "unaligned seq number %d (msa1: %s, msa2: %s) differs in length %s (%" PRId64 ") and %s (%" PRId64 "), those files must contain identical raw seqs\n",
+ i, msa1->sqname[i], msa2->sqname[i], esl_opt_GetArg(go, 1), len1, esl_opt_GetArg(go, 2), len2);
+ }
+ if(strncmp(seq1, seq2, len1) != 0) ESL_FAIL(eslEINVAL, errbuf, "unaligned seq number %d differs between %s and %s, those files must contain identical raw seqs\n", i, esl_opt_GetArg(go, 1), esl_opt_GetArg(go, 2));
+ total_res += len1;
+
+ apos1 = apos2 = 1;
+ while((apos1 <= alen1) || (apos2 <= alen2)) {
+ isgap1 = esl_abc_XIsGap(msa1->abc, msa1->ax[i][apos1]);
+ isgap2 = esl_abc_XIsGap(msa2->abc, msa2->ax[i][apos2]);
+ if ( isgap1 && isgap2) { apos1++; apos2++; }
+ else if ( isgap1 && !isgap2) { apos1++; }
+ else if (!isgap1 && isgap2) { apos2++; }
+ else if ( msa1->ax[i][apos1] == msa2->ax[i][apos2]) {
+ one2two[apos1++][apos2++]++;
+ /* two2one[apos2][apos1]++; */
+ }
+ }
+ }
+
+ /******************************************************************
+ * DP alignment of msa1 to msa2
+ * dp matrix: mx[apos1][apos2] apos1=1..msa->alen1, apos2=1..alen2 (apos1=0 || apos2=0 is invalid)
+ * mx[apos1][apos2] = score of maximal alignment for apos1=1..apos1, apos2'=1..apos2 INCLUDING
+ * apos1 and apos2. Score is number of residues from msa1 columns
+ * 1..apos1 that exist in their respective aligned columns in msa2 (the growing
+ * maximally scoring alignment).
+ */
+
+ /******************************************************************
+ * initialization
+ */
+ ESL_ALLOC(mx, sizeof(int *) * (alen1+1));
+ ESL_ALLOC(tb, sizeof(int *) * (alen1+1));
+ for(apos1 = 0; apos1 <= alen1; apos1++) {
+ ESL_ALLOC(mx[apos1], sizeof(int) * (alen2+1));
+ ESL_ALLOC(tb[apos1], sizeof(int) * (alen2+1));
+ esl_vec_ISet(mx[apos1], (alen2+1), 0);
+ esl_vec_ISet(tb[apos1], (alen2+1), -2); /* -2 is a bogus value, if we see it during traceback, there's a problem */
+ tb[apos1][0] = HORZ; /* special case, if we hit apos2==0 and apos1 > 0, we have to do HORZ moves until apos1==1 */
+ }
+ esl_vec_ISet(tb[0], (alen2+1), VERT); /* special case, if we hit apos1==0 and apos2 > 0, we have to do VERT moves until apos2==1 */
+ tb[0][0] = -2; /* all alignments must end here */
+
+ ESL_ALLOC(res1_per_apos, sizeof(int) * (alen1+1));
+ esl_vec_ISet(res1_per_apos, (alen1+1), 0);
+ mx[0][0] = 0;
+ tb[0][0] = -1; /* last cell, special value */
+
+ /*****************************************************************
+ * recursion
+ */
+ ESL_ALLOC(choices, sizeof(int) * NCHOICES);
+ for(apos1 = 1; apos1 <= alen1; apos1++) {
+ for(apos2 = 1; apos2 <= alen2; apos2++) {
+ choices[DIAG] = mx[(apos1-1)][(apos2-1)] + one2two[apos1][apos2];
+ choices[VERT] = mx[ apos1 ][(apos2-1)];
+ choices[HORZ] = mx[(apos1-1)][ apos2 ];
+ i_choice = esl_vec_IArgMax(choices, NCHOICES);
+ mx[apos1][apos2] = choices[i_choice];
+ tb[apos1][apos2] = i_choice;
+ res1_per_apos[apos1] += one2two[apos1][apos2];
+ /*printf("mx[%3d][%3d]: %5d (%d)\n", apos1, apos2, mx[apos1][apos2], tb[apos1][apos2]);*/
+ }
+ }
+ free(choices);
+
+ total_cres1 = 0;
+ if(rf2a_map1 != NULL) {
+ for(rfpos1 = 1; rfpos1 <= rflen1; rfpos1++) total_cres1 += res1_per_apos[rf2a_map1[rfpos1]];
+ }
+
+ /*****************************************************************
+ * traceback
+ */
+
+ sc = mx[alen1][alen2];
+ if(!be_quiet) {
+ /* printf("score %d\n", sc);*/
+ if(a2rf_map1 != NULL && a2rf_map2 != NULL) {
+ printf("# %12s %12s %22s\n", " msa 1 ", " msa 2 ", "");
+ printf("# %12s %12s %22s\n", "------------", "------------", "");
+ printf("# %5s %5s %5s %5s %22s\n", "rfpos", "apos", "rfpos", "apos", " num common residues");
+ printf("# %5s %5s %5s %5s %22s\n", "-----", "-----", "-----", "-----", "---------------------");
+ }
+ else if(a2rf_map1 != NULL) {
+ printf("# %12s %5s %22s\n", " msa 1 ", "msa 2", "");
+ printf("# %12s %5s %22s\n", "------------", "-----", "");
+ printf("# %5s %5s %5s %22s\n", "rfpos", "apos", "apos", " num common residues");
+ printf("# %5s %5s %5s %22s\n", "-----", "-----", "-----", "---------------------");
+ }
+ else if (a2rf_map2 != NULL) {
+ printf("# %5s %12s %22s\n", "msa 1", " msa 2 ", "");
+ printf("# %5s %12s %22s\n", "-----", "------------", "");
+ printf("# %5s %5s %5s %22s\n", "apos", "rfpos", "apos", " num common residues");
+ printf("# %5s %5s %5s %22s\n", "-----", "-----", "-----", "---------------------");
+ }
+ else {
+ printf("# %5s %5s %22s\n", "msa 1", "msa 2", "");
+ printf("# %5s %5s %22s\n", "-----", "-----", "");
+ printf("# %5s %5s %22s\n", "apos", "apos", " num common residues");
+ printf("# %5s %5s %22s\n", "-----", "-----", "---------------------");
+ }
+ }
+
+ /* traceback, and build one2two_map[] */
+ apos1 = alen1;
+ apos2 = alen2;
+ tb_sc = 0;
+ covered_cres1 = 0;
+ ESL_ALLOC(one2two_map, sizeof(int) * (alen1+1));
+ esl_vec_ISet(one2two_map, (alen1+1), 0);
+ one2two_map[0] = -1; /* invalid */
+
+ while(tb[apos1][apos2] != -1) {
+ if(tb[apos1][apos2] == DIAG) { /* diagonal move */
+ rfpos1 = (a2rf_map1 == NULL) ? -1 : a2rf_map1[apos1];
+ rfpos2 = (a2rf_map2 == NULL) ? -1 : a2rf_map2[apos2];
+ if(!be_quiet) {
+ if(a2rf_map1 != NULL && a2rf_map2 != NULL) {
+ if(rfpos1 == -1 && rfpos2 == -1) {
+ printf(" %5s %5d --> %5s %5d %5d / %5d (%.4f)\n", "-", apos1, "-", apos2, one2two[apos1][apos2], res1_per_apos[apos1], (res1_per_apos[apos1] == 0) ? 0.0000 : ((float) one2two[apos1][apos2] / (float) res1_per_apos[apos1]));
+ }
+ else if (rfpos1 == -1) {
+ printf(" %5s %5d --> %5d %5d %5d / %5d (%.4f)\n", "-", apos1, rfpos2, apos2, one2two[apos1][apos2], res1_per_apos[apos1], (res1_per_apos[apos1] == 0) ? 0.0000 : ((float) one2two[apos1][apos2] / (float) res1_per_apos[apos1]));
+ }
+ else if (rfpos2 == -1) {
+ printf(" %5d %5d --> %5s %5d %5d / %5d (%.4f)\n", rfpos1, apos1, "-", apos2, one2two[apos1][apos2], res1_per_apos[apos1], (res1_per_apos[apos1] == 0) ? 0.0000 : ((float) one2two[apos1][apos2] / (float) res1_per_apos[apos1]));
+ }
+ else {
+ printf(" %5d %5d --> %5d %5d %5d / %5d (%.4f)\n", rfpos1, apos1, rfpos2, apos2, one2two[apos1][apos2], res1_per_apos[apos1], (res1_per_apos[apos1] == 0) ? 0.0000 : ((float) one2two[apos1][apos2] / (float) res1_per_apos[apos1]));
+ }
+ }
+ else if(a2rf_map1 != NULL) {
+ if (rfpos1 == -1) {
+ printf(" %5s %5d --> %5d %5d / %5d (%.4f)\n", "-", apos1, apos2, one2two[apos1][apos2], res1_per_apos[apos1], (res1_per_apos[apos1] == 0) ? 0.0000 : ((float) one2two[apos1][apos2] / (float) res1_per_apos[apos1]));
+ }
+ else {
+ printf(" %5d %5d --> %5d %5d / %5d (%.4f)\n", rfpos1, apos1, apos2, one2two[apos1][apos2], res1_per_apos[apos1], (res1_per_apos[apos1] == 0) ? 0.0000 : ((float) one2two[apos1][apos2] / (float) res1_per_apos[apos1]));
+ }
+ }
+ else if (a2rf_map2 != NULL) {
+ if (rfpos2 == -1) {
+ printf(" %5d --> %5s %5d %5d / %5d (%.4f)\n", apos1, "-", apos2, one2two[apos1][apos2], res1_per_apos[apos1], (res1_per_apos[apos1] == 0) ? 0.0000 : ((float) one2two[apos1][apos2] / (float) res1_per_apos[apos1]));
+ }
+ else {
+ printf(" %5d --> %5d %5d %5d / %5d (%.4f)\n", apos1, rfpos2, apos2, one2two[apos1][apos2], res1_per_apos[apos1], (res1_per_apos[apos1] == 0) ? 0.0000 : ((float) one2two[apos1][apos2] / (float) res1_per_apos[apos1]));
+ }
+ }
+ else {
+ printf(" %5d --> %5d %5d / %5d (%.4f)\n", apos1, apos2, one2two[apos1][apos2], res1_per_apos[apos1], (res1_per_apos[apos1] == 0) ? 0.0000 : ((float) one2two[apos1][apos2] / (float) res1_per_apos[apos1]));
+ }
+ }
+ tb_sc += one2two[apos1][apos2];
+ one2two_map[apos1] = apos2;
+ if(rfpos1 > 0) covered_cres1 += one2two[apos1][apos2]; /* apos1 is a rfpos */
+ apos1--; apos2--;
+ }
+ else if(tb[apos1][apos2] == VERT) {
+ apos2--; /* vertical move */
+ }
+ else if(tb[apos1][apos2] == HORZ) {
+ apos1--; /* horizontal move */
+ }
+ else if(tb[apos1][apos2] != -1) /* shouldn't happen */
+ ESL_FAIL(eslEINVAL, errbuf, "in dp traceback, tb[apos1: %d][apos2: %d] %d\n", apos1, apos2, tb[apos1][apos2]);
+ }
+ /* done DP code
+ **********************************/
+
+ if(!be_quiet) printf("# Total trace back sc: %d\n", tb_sc);
+ if(tb_sc != sc) ESL_FAIL(eslEINVAL, errbuf, "in dp traceback, tb_sc (%d) != sc (%d)\n", tb_sc, sc);
+ coverage = (float) tb_sc / (float) total_res;
+ printf("# Coverage: %6d / %6d (%.4f)\n# Coverage is fraction of residues from %s in optimally mapped columns in %s\n", tb_sc, total_res, coverage, esl_opt_GetArg(go, 1), esl_opt_GetArg(go, 2));
+ if(total_cres1 > 0) printf("# RF coverage: %6d / %6d (%.4f)\n# RF coverage is fraction of non-gap RF residues from %s in optimally mapped columns in %s\n", covered_cres1, total_cres1, (float) covered_cres1 / (float) total_cres1, esl_opt_GetArg(go, 1), esl_opt_GetArg(go, 2));
+ /* print masks if nec */
+ if((status = map2masks(go, errbuf, alen1, alen2, a2rf_map1, a2rf_map2, rf2a_map1, rf2a_map2, rflen1, rflen2, one2two_map)) != eslOK) return status;
+
+ /* clean up and return */
+ for(apos1 = 0; apos1 <= alen1; apos1++) {
+ free(mx[apos1]);
+ free(tb[apos1]);
+ }
+ free(mx);
+ free(tb);
+
+ for(apos1 = 0; apos1 <= alen1; apos1++) free(one2two[apos1]);
+ free(one2two);
+ free(res1_per_apos);
+ if(rf2a_map1 != NULL) free(rf2a_map1);
+ if(rf2a_map2 != NULL) free(rf2a_map2);
+ if(a2rf_map1 != NULL) free(a2rf_map1);
+ if(a2rf_map2 != NULL) free(a2rf_map2);
+
+ free(seq1);
+ free(seq2);
+ *ret_msa1_to_msa2_map = one2two_map;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* map_sub_msas
+ *
+ * msa1 and msa2 contain the same named sequences, msa1 contains a superset
+ * of the columns in msa2. Determine which of the msa1 columns the msa2
+ * columns correspond to.
+ */
+static int
+map_sub_msas(const ESL_GETOPTS *go, char *errbuf, ESL_MSA *msa1, ESL_MSA *msa2, char **ret_msa1_to_msa2_mask)
+{
+ int status;
+ int apos1, apos2; /* counters over alignment position in msa1, msa2 respectively */
+ int i;
+ int *msa1_to_msa2_map; /* [0..apos1..msa1->alen] msa2 alignment position that apos1 corresponds to */
+ char *mask;
+
+ /* contract check */
+ if(! (msa1->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINVAL, errbuf, "in map_sub_msas() msa1 (%s) not digitized.\n", esl_opt_GetArg(go, 1));
+ if(! (msa2->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINVAL, errbuf, "in map_sub_msas() msa2 (%s) not digitized.\n", esl_opt_GetString(go, "--submap"));
+ if(msa1->alen <= msa2->alen) ESL_FAIL(eslEINVAL, errbuf, "in map_sub_msas() alignment length for msa1 (%" PRId64 "d) <= length for msa2 (%" PRId64 ")\n", msa1->alen, msa2->alen);
+
+ ESL_ALLOC(mask, sizeof(char) * (msa1->alen+1));
+ for(apos1 = 0; apos1 < msa1->alen; apos1++) mask[apos1] = '0';
+ mask[msa1->alen] = '\0';
+
+ ESL_ALLOC(msa1_to_msa2_map, sizeof(int) * (msa1->alen+1));
+ esl_vec_ISet(msa1_to_msa2_map, (msa1->alen+1), -1);
+
+ /* both alignments must have same 'named' sequences in same order */
+ if(msa1->nseq != msa2->nseq) ESL_FAIL(eslEINVAL, errbuf, "in map_sub_msas() msa1 has %d sequences, msa2 has %d sequences\n", msa1->nseq, msa2->nseq);
+ for(i = 0; i < msa1->nseq; i++) {
+ if(strcmp(msa1->sqname[i], msa2->sqname[i]) != 0) ESL_FAIL(eslEINVAL, errbuf, "in map_sub_msas() msa1 seq %d is named %s, msa2 seq %d is named %s\n", i, msa1->sqname[i], i, msa2->sqname[i]);
+ }
+
+ apos1 = 1;
+ apos2 = 1;
+ while((apos2 <= msa2->alen) || (apos1 <= msa1->alen)) { /* determine which apos1 (alignment column in msa1), apos2 (alignment column in msa2) corresponds to */
+ for(i = 0; i < msa1->nseq; i++) {
+ if(msa1->ax[i][apos1] != msa2->ax[i][apos2]) {
+ apos1++;
+ break; /* try next apos1 */
+ }
+ }
+ if(i == msa1->nseq) { /* found a match */
+ msa1_to_msa2_map[apos1] = apos2;
+ mask[(apos1-1)] = '1';
+ apos1++;
+ apos2++;
+ }
+ }
+ if((apos1 != (msa1->alen+1)) || (apos2 != (msa2->alen+1))) ESL_FAIL(eslEINVAL, errbuf, "in map_sub_msas(), failure mapping alignments, end of loop apos1-1 = %d (msa1->alen: %" PRId64 ") and apos2-1 = %d (msa2->alen: %" PRId64 ")\n", apos1-1, msa1->alen, apos2-1, msa2->alen);
+
+ free(msa1_to_msa2_map);
+ *ret_msa1_to_msa2_mask = mask;
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* map_rfpos_to_apos
+ *
+ * Given an MSA, determine the alignment position each
+ * reference position refers to.
+ */
+static int map_rfpos_to_apos(ESL_MSA *msa, int **ret_rf2a_map, int **ret_a2rf_map, int *ret_rflen)
+{
+ int status;
+ int rflen = 0;
+ int *rf2a_map = NULL;
+ int *a2rf_map = NULL;
+ int rfpos = 0;
+ int apos = 0;
+ /* contract check */
+ if(msa->rf == NULL) { status = eslEINVAL; goto ERROR; }
+
+ /* count reference columns */
+ for(apos = 1; apos <= msa->alen; apos++)
+ if((! esl_abc_CIsGap(msa->abc, msa->rf[(apos-1)])) &&
+ (! esl_abc_CIsMissing(msa->abc, msa->rf[(apos-1)])) &&
+ (! esl_abc_CIsNonresidue(msa->abc, msa->rf[(apos-1)]))) rflen++;
+
+ /* build maps */
+ ESL_ALLOC(rf2a_map, sizeof(int) * (rflen+1));
+ ESL_ALLOC(a2rf_map, sizeof(int) * (msa->alen+1));
+ esl_vec_ISet(a2rf_map, msa->alen+1, -1);
+ rf2a_map[0] = -1;
+ for(apos = 1; apos <= msa->alen; apos++) {
+ if((! esl_abc_CIsGap(msa->abc, msa->rf[(apos-1)])) &&
+ (! esl_abc_CIsMissing(msa->abc, msa->rf[(apos-1)])) &&
+ (! esl_abc_CIsNonresidue(msa->abc, msa->rf[(apos-1)]))) {
+ rf2a_map[++rfpos] = apos;
+ a2rf_map[apos] = rfpos;
+ }
+ /* else a2rf_map[apos] remains -1 as it was initialized */
+ }
+
+
+ if(ret_rf2a_map != NULL) *ret_rf2a_map = rf2a_map;
+ else free(rf2a_map);
+ if(ret_a2rf_map != NULL) *ret_a2rf_map = a2rf_map;
+ else free(a2rf_map);
+ if(ret_rflen != NULL) *ret_rflen = rflen;
+ return eslOK;
+
+ ERROR:
+ if(rf2a_map != NULL) free(rf2a_map);
+ if(a2rf_map != NULL) free(a2rf_map);
+ return status;
+}
+
+/* map2masks
+ *
+ * Given a map of alignment columns in msa1 to alignment columns
+ * to msa2, construct and output masks as per command-line options.
+ *
+ * Args: msa1_to_msa2_map: [1..apos..msa1->alen]: '0': msa1 apos maps to a gap in msa2 (doesn't map to any column in msa2)
+ * 'x': msa1 apos maps to posn x in msa2 (x>0)
+ */
+static int
+map2masks(const ESL_GETOPTS *go, char *errbuf, int alen1, int alen2, int *a2rf_map1, int *a2rf_map2, int *rf2a_map1, int *rf2a_map2, int rflen1, int rflen2, int *msa1_to_msa2_map)
+{
+ int status;
+ int apos1, apos2; /* counters over alignment position in msa1, msa2 respectively */
+ int rfpos1, rfpos2; /* counters over reference positions */
+ int num_ones; /* number of 1s in current mask */
+ int num_zeroes; /* number of 0s in current mask */
+ FILE *fp;
+ char *mask = NULL;
+
+ if(esl_opt_GetString(go, "--mask-a2a")) {
+ if ((fp = fopen(esl_opt_GetString(go, "--mask-a2a"), "w")) == NULL)
+ ESL_FAIL(eslFAIL, errbuf, "Failed to open --mask-a2a mask output file %s", esl_opt_GetString(go, "--mask-a2a"));
+ /* construct mask as follows:
+ * mask[0..apos1..alen1-1] = '1' if column apos1+1 maps to an alignment column of msa2
+ * = '0' if column apos1+1 maps to a gap in msa2 (doesn't map to any column in msa2)
+ */
+ ESL_ALLOC(mask, sizeof(char) * (alen1+1));
+ num_ones = num_zeroes = 0;
+ for(apos1 = 1; apos1 <= alen1; apos1++) {
+ if(msa1_to_msa2_map[apos1] == 0) { mask[(apos1-1)] = '0'; num_zeroes++; }
+ else { mask[(apos1-1)] = '1'; num_ones++; }
+ }
+ mask[alen1] = '\0';
+ fprintf(fp, "%s\n", mask);
+ free(mask);
+ fclose(fp);
+ printf("# Mask of 1/0s with 1 indicating aln column in %s maps to aln column in %s saved to file %s.\n# (Length: %d; '1's: %d; '0's: %d)\n", esl_opt_GetArg(go, 1), esl_opt_GetArg(go, 2), esl_opt_GetString(go, "--mask-a2a"), (num_ones+num_zeroes), num_ones, num_zeroes);
+ }
+
+ if(esl_opt_GetString(go, "--mask-a2rf")) {
+ if (a2rf_map2 == NULL) ESL_FAIL(eslFAIL, errbuf, "with --mask-a2rf, <msafile2> %s must have #=GC RF annotation, but it doesn't.", esl_opt_GetArg(go, 2));
+ if ((fp = fopen(esl_opt_GetString(go, "--mask-a2rf"), "w")) == NULL)
+ ESL_FAIL(eslFAIL, errbuf, "Failed to open --mask-a2rf mask output file %s\n", esl_opt_GetString(go, "--mask-a2rf"));
+ /* construct mask as follows:
+ * mask[0..apos1..alen1-1] = '1' if column apos1+1 maps to a reference column (non-gap in RF) of msa2
+ * = '0' if column apos1+1 maps to a gap (doesn't map to any column in msa2) or an insert (gap in RF) in msa2
+ */
+ ESL_ALLOC(mask, sizeof(char) * (alen1+1));
+ num_ones = num_zeroes = 0;
+ for(apos1 = 1; apos1 <= alen1; apos1++) {
+ apos2 = msa1_to_msa2_map[apos1];
+ if(apos2 == 0) { mask[(apos1-1)] = '0'; num_zeroes++; } /* apos1 doesn't map to any column in msa2 */
+ else {
+ rfpos2 = a2rf_map2[apos2];
+ if(rfpos2 <= 0) { mask[(apos1-1)] = '0'; num_zeroes++; } /* apos1 maps to a gap RF (insert) in msa2 */
+ else { mask[(apos1-1)] = '1'; num_ones++; } /* apos1 maps to a non-gap RF (reference) column in msa2 */
+ }
+ }
+ mask[alen1] = '\0';
+ fprintf(fp, "%s\n", mask);
+ free(mask);
+ fclose(fp);
+ printf("# Mask of 1/0s with 1 indicating aln column in %s maps to reference (non-gap RF) column in %s saved to file %s.\n# (Length: %d; '1's: %d; '0's: %d)\n", esl_opt_GetArg(go, 1), esl_opt_GetArg(go, 2), esl_opt_GetString(go, "--mask-a2rf"), (num_ones+num_zeroes), num_ones, num_zeroes);
+ }
+
+ if(esl_opt_GetString(go, "--mask-rf2a")) {
+ if (a2rf_map1 == NULL) ESL_FAIL(eslFAIL, errbuf, "with --mask-rf2a, <msafile1> %s must have #=GC RF annotation, but it doesn't.", esl_opt_GetArg(go, 1));
+ if ((fp = fopen(esl_opt_GetString(go, "--mask-rf2a"), "w")) == NULL)
+ ESL_FAIL(eslFAIL, errbuf, "Failed to open --mask-rf2a mask output file %s\n", esl_opt_GetString(go, "--mask-rf2a"));
+ /* construct mask as follows:
+ * mask[0..rfpos1..rflen-1] = '1' if non-gap RF msa1 column rfpos1+1 maps to an alignment column of msa2
+ * = '0' if non-gap RF msa1 column rfpos1+1 maps to a gap in msa2 (doesn't map to any column in msa2)
+ */
+ ESL_ALLOC(mask, sizeof(char) * (rflen1+1));
+ num_ones = num_zeroes = 0;
+ for(rfpos1 = 1; rfpos1 <= rflen1; rfpos1++) {
+ apos1 = rf2a_map1[rfpos1];
+ apos2 = msa1_to_msa2_map[apos1];
+ if(apos2 == 0) { mask[(rfpos1-1)] = '0'; num_zeroes++; }
+ else { mask[(rfpos1-1)] = '1'; num_ones++; }
+ }
+ mask[rflen1] = '\0';
+ fprintf(fp, "%s\n", mask);
+ free(mask);
+ fclose(fp);
+ printf("# Mask of 1/0s with 1 indicating reference (non-gap RF) column in %s maps to aln column in %s saved to file %s.\n# (Length: %d; '1's: %d; '0's: %d)\n", esl_opt_GetArg(go, 1), esl_opt_GetArg(go, 2), esl_opt_GetString(go, "--mask-rf2a"), (num_ones+num_zeroes), num_ones, num_zeroes);
+ }
+
+ if(esl_opt_GetString(go, "--mask-rf2rf")) {
+ if (a2rf_map1 == NULL) ESL_FAIL(eslFAIL, errbuf, "with --mask-rf2rf, <msafile1> %s must have #=GC RF annotation, but it doesn't.", esl_opt_GetArg(go, 1));
+ if (a2rf_map2 == NULL) ESL_FAIL(eslFAIL, errbuf, "with --mask-rf2rf, <msafile2> %s must have #=GC RF annotation, but it doesn't.", esl_opt_GetArg(go, 2));
+ if ((fp = fopen(esl_opt_GetString(go, "--mask-rf2rf"), "w")) == NULL)
+ ESL_FAIL(eslFAIL, errbuf, "Failed to open --mask-rf2rf mask output file %s\n", esl_opt_GetString(go, "--mask-rf2rf"));
+ /* construct mask as follows:
+ * mask[0..apos1..alen-1] = '1' if column apos1+1 maps to a reference column (non-gap in RF) of msa2
+ * = '0' if column apos1+1 maps to a gap (doesn't map to any column in msa2) or an insert (gap in RF) in msa2
+ */
+ ESL_ALLOC(mask, sizeof(char) * (alen1+1));
+ num_ones = num_zeroes = 0;
+ for(rfpos1 = 1; rfpos1 <= rflen1; rfpos1++) {
+ apos1 = rf2a_map1[rfpos1];
+ apos2 = msa1_to_msa2_map[apos1];
+ if(apos2 == 0) { mask[(rfpos1-1)] = '0'; num_zeroes++; } /* rfpos1 doesn't map to any column in msa2 */
+ else {
+ rfpos2 = a2rf_map2[apos2];
+ if(rfpos2 <= 0) { mask[(rfpos1-1)] = '0'; num_zeroes++; } /* rfpos1 maps to a gap RF (insert) in msa2 */
+ else { mask[(rfpos1-1)] = '1'; num_ones++; } /* rfpos1 maps to a non-gap RF (reference) column in msa2 */
+ }
+ }
+ mask[rflen1] = '\0';
+ fprintf(fp, "%s\n", mask);
+ free(mask);
+ fclose(fp);
+ printf("# Mask of 1/0s with 1 indicating reference (non-gap RF) column in %s maps to reference (non-gap RF) column in %s saved to file %s.\n# (Length: %d; '1's: %d; '0's: %d)\n", esl_opt_GetArg(go, 1), esl_opt_GetArg(go, 2), esl_opt_GetString(go, "--mask-rf2rf"), (num_ones+num_zeroes), num_ones, num_zeroes);
+ }
+ return eslOK;
+
+ ERROR:
+ ESL_FAIL(eslEMEM, errbuf, "map2masks(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
diff --git a/miniapps/esl-alimap.itest.pl b/miniapps/esl-alimap.itest.pl
new file mode 100755
index 0000000..19e4363
--- /dev/null
+++ b/miniapps/esl-alimap.itest.pl
@@ -0,0 +1,143 @@
+#! /usr/bin/perl
+
+# Integrated test of the esl-alimap miniapp.
+#
+# Usage: ./esl-alimap.itest.pl <esl-alimap binary> <tmpfile prefix>
+# Example: ./esl-alimap.itest.pl ./esl-alimap foo
+#
+# EPN, Tue Feb 2 13:19:44 2010
+
+$eslalimap= shift;
+$tmppfx = shift;
+
+if (! -x "$eslalimap") { die "FAIL: didn't find esl-alimap binary $eslalimap"; }
+
+open(ALIFILE, ">$tmppfx.1") || die "FAIL: couldn't open $tmppfx.1 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+simpex-17 --AGA-CUUCGG---GCUCG-UAACAG
+#=GR simpex-17 PP ..885.*****9...9****.******
+simpex-39 aaAAUACGUCGGCUG-AAUCACCAGUA
+#=GR simpex-39 PP ***************.67776899999
+simpex-82 --ACGUUUUG-GAACGGG-U-CCA-CC
+#=GR simpex-82 PP ..****9998.88**888.5.898.9*
+#=GC SS_cons ..::<<<____>->>-<<-<.___>>>
+#=GC RF ..AAgaCUUCGGAucgggCg.AcAccc
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.2") || die "FAIL: couldn't open $tmppfx.2 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+simpex-17 ---AGACUUCGGG---CUCGUAACAG
+#=GR simpex-17 PP ...69*****775...4466777888
+simpex-39 aaAAUACGUCGGCUGAAUCACCAGUA
+#=GR simpex-39 PP **************************
+simpex-82 --ACGUUUUG-GAACGGGUC-C-ACC
+#=GR simpex-82 PP ..99998886.777755544.2.358
+#=GC SS_cons ..::::::::::::::::::::::::
+#=GC RF ..AAgACUUCGGAucggGCaAcAuUc
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.3") || die "FAIL: couldn't open $tmppfx.2 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+simpex-17 ---AGACUUCGGG---CUCGUAACAG
+#=GR simpex-17 PP ...69*****775...4466777888
+simpex-39 aaAAUACGUCGGCUGAAUCACCAGUA
+#=GR simpex-39 PP **************************
+simpex-82 --ACGUUUUG-GAACGGGUC-C-ACC
+#=GR simpex-82 PP ..99998886.777755544.2.358
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.4") || die "FAIL: couldn't open $tmppfx.3 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+test1 ..AA..AA..AAA
+test2 ..CC.gCC..CCC
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.5") || die "FAIL: couldn't open $tmppfx.4 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+test1 AAAAAAA
+test2 CCCCCCC
+//
+EOF
+close ALIFILE;
+
+
+open(MASKFILE, ">$tmppfx.mask") || die "FAIL: couldn't open $tmppfx.mask for writing alifile";
+print MASKFILE << "EOF";
+110111011011101110011101
+EOF
+close MASKFILE;
+
+$output = `$eslalimap -h`;
+if ($? != 0) { die "FAIL: esl-alimap failed unexpectedly"; }
+if ($output !~ /Usage: esl-alimap/) { die "FAIL: help output not right"; }
+
+$output = `$eslalimap $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimap failed unexpectedly"; }
+if ($output !~ /20 23 --> 20 22 3 \/ 3 \(1.0\d+\)/) { die "FAIL: alignments mapped incorrectly"; }
+if ($output !~ /\# Coverage: 56 \/ 67 \(0.83\d+\)/) { die "FAIL: alignments mapped incorrectly"; }
+
+$output = `$eslalimap --dna $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimap failed unexpectedly"; }
+if ($output !~ /20 23 --> 20 22 3 \/ 3 \(1.0\d+\)/) { die "FAIL: alignments mapped incorrectly"; }
+if ($output !~ /\# Coverage: 56 \/ 67 \(0.83\d+\)/) { die "FAIL: alignments mapped incorrectly"; }
+
+$output = `$eslalimap $tmppfx.1 $tmppfx.3 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimap failed unexpectedly"; }
+if ($output !~ /20 23 --> 22 3 \/ 3 \(1.0\d+\)/) { die "FAIL: alignments mapped incorrectly"; }
+if ($output !~ /\# Coverage: 56 \/ 67 \(0.83\d+\)/) { die "FAIL: alignments mapped incorrectly"; }
+
+system("$eslalimap --mask-a2a $tmppfx.a2a --mask-a2rf $tmppfx.a2rf --mask-rf2a $tmppfx.rf2a --mask-rf2rf $tmppfx.rf2rf $tmppfx.1 $tmppfx.2 > /dev/null");
+if ($? != 0) { die "FAIL: esl-alimap failed unexpectedly"; }
+$output = `cat $tmppfx.a2a`;
+if ($output !~ /111111111111111111011111111/) { die "FAIL: alignments mapped incorrectly."; }
+
+$output = `cat $tmppfx.a2rf`;
+if ($output !~ /001111111111111111011111111/) { die "FAIL: alignments mapped incorrectly."; }
+
+$output = `cat $tmppfx.rf2a`;
+if ($output !~ /111111111111111101111111/) { die "FAIL: alignments mapped incorrectly."; }
+
+$output = `cat $tmppfx.rf2rf`;
+if ($output !~ /111111111111111101111111/) { die "FAIL: alignments mapped incorrectly."; }
+
+system("$eslalimap --rna --submap $tmppfx.submask $tmppfx.4 $tmppfx.5 > /dev/null");
+if ($? != 0) { die "FAIL: esl-alimap failed unexpectedly"; }
+$output = `cat $tmppfx.submask`;
+if ($output !~ /0011001100111/) { die "FAIL: alignments mapped incorrectly"; }
+
+print "ok\n";
+unlink "$tmppfx.1";
+unlink "$tmppfx.2";
+unlink "$tmppfx.3";
+unlink "$tmppfx.4";
+unlink "$tmppfx.5";
+unlink "$tmppfx.a2a";
+unlink "$tmppfx.a2rf";
+unlink "$tmppfx.rf2a";
+unlink "$tmppfx.rf2rf";
+unlink "$tmppfx.submask";
+unlink "$tmppfx.mask";
+exit 0;
diff --git a/miniapps/esl-alimap.man b/miniapps/esl-alimap.man
new file mode 100644
index 0000000..37a6871
--- /dev/null
+++ b/miniapps/esl-alimap.man
@@ -0,0 +1,193 @@
+.TH "esl-alimap" 1 "@EASEL_DATE@" "Easel @PACKAGE_VERSION@" "Easel miniapps"
+
+.SH NAME
+.TP
+esl-alimap - map two alignments to each other
+
+.SH SYNOPSIS
+.B esl-alimap
+.I [options]
+.I msafile1
+.I msafile2
+
+.SH DESCRIPTION
+
+.I esl-alimap
+is a highly specialized application that determines the optimal
+alignment mapping of columns between two alignments of the same
+sequences. An alignment mapping defines for each column in alignment 1
+a matching column in alignment 2. The number of residues in the
+aligned sequences that are in common between the two matched columns
+are considered 'shared' by those two columns.
+
+For example, if the nth residue of sequence i occurs in alignment 1
+column x and alignment 2 column y, then only a mapping of alignment
+1 and 2 that includes column x mapping to column y would correctly map
+and share the residue.
+
+The optimal mapping of the two alignments is the mapping which
+maximizes the sum of shared residues between all pairs of matching
+columns. The fraction of total residues that are shared is reported as
+the coverage in the
+.B esl-alimap
+output.
+
+Only the first alignments in
+.I msafile1
+and
+.I msafile2
+will be mapped to each other. If the files contain more than one
+alignment, all alignments after the first will be ignored.
+
+The two alignments (one from each file) must contain exactly the same
+sequences (if they were unaligned, they'd be identical) in precisely
+the same order. They must also be in Stockholm format.
+
+The output of
+.B esl-alimap
+differs depending on whether one or both of the alignments
+contain reference (#=GC RF) annotation. If so, the
+coverage for residues from nongap RF positions will be reported
+separately from the total coverage.
+
+.B esl-alimap
+uses a dynamic programming algorithm to compute the optimal
+mapping. The algorithm is similar to the Needleman-Wunsch-Sellers
+algorithm but the scores used at each step of the recursion are not
+residue-residue comparison scores but rather the number of residues
+shared between two columns.
+
+The
+.BI --mask-a2a " <f>",
+.BI --mask-a2rf " <f>",
+.BI --mask-rf2a " <f>",
+and
+.BI --mask-rf2rf " <f>"
+options create 'mask' files that pertain to the optimal mapping in
+slightly different ways. A mask file consists of a single line, of
+only '0' and '1' characters. These denote which positions of the
+alignment from
+.B msafile1
+map to positions of the alignment from
+.B msafile2
+as described below for each of the four respective masking options.
+These masks can be used to extract only those columns of the
+.B msafile1
+alignment
+that optimally map to columns of the
+.B msafile2
+alignment
+using the
+.B esl-alimask
+miniapp. To extract the corresponding set of columns
+from
+.I msafile2
+(that optimally map to columns of the alignment from
+.B msafile1),
+it is necessary to rerun the program with the order of the two
+msafiles reversed, save new masks, and use
+.B esl-alimask
+again.
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options.
+
+.TP
+.B -q
+Be quiet; don't print information the optimal mapping of each column,
+only report coverage and potentially save masks to optional output files.
+
+.TP
+.BI --mask-a2a " <f>"
+Save a mask of '0's and '1's to file
+.I <f>.
+A '1' at position x means that position x of the alignment from
+.B msafile1
+maps to an alignment position in the alignment from
+.B msafile2
+in the optimal map.
+
+.TP
+.BI --mask-a2rf " <f>"
+Save a mask of '0's and '1's to file
+.I <f>.
+A '1' at position x means that position x of the alignment from
+.B msafile1
+maps to a nongap RF position in the alignment from
+.B msafile2
+in the optimal map.
+
+.TP
+.BI --mask-rf2a " <f>"
+Save a mask of '0's and '1's to file
+.I <f>.
+A '1' at position x means that nongap RF position x of the alignment from
+.B msafile1
+maps to an alignment position in the alignment from
+.B msafile2
+in the optimal map.
+
+.TP
+.BI --mask-rf2rf " <f>"
+Save a mask of '0's and '1's to file
+.I <f>.
+A '1' at position x means that nongap RF position x of the alignment from
+.B msafile1
+maps to a nongap RF position in the alignment from
+.B msafile2
+in the optimal map.
+
+.TP
+.BI --submap " <f>"
+Specify that all of the columns from the alignment from
+.B msafile1
+exist identically (contain the same residues from all sequences) in
+the alignment from
+.B msafile2.
+This makes the task of mapping trivial.
+However, not all columns of
+.B msafile1
+must exist in
+.B msafile2.
+Save the mask to file
+.I <f>.
+A '1' at position x of the mask means that position x of the alignment from
+.B msafile1
+is the same as position y of
+.B msafile2,
+where y is the number of '1's that occur at positions <= x in the mask.
+
+.TP
+.B --amino
+Assert that
+.I trusted_file
+and
+.I test_file
+contain protein sequences.
+
+.TP
+.B --dna
+Assert that
+.I trusted_file
+and
+.I test_file
+contain DNA sequences.
+
+.TP
+.B --rna
+Assert that the
+.I trusted_file
+and
+.I test_file
+contain RNA sequences.
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-alimask.c b/miniapps/esl-alimask.c
new file mode 100644
index 0000000..4daf0de
--- /dev/null
+++ b/miniapps/esl-alimask.c
@@ -0,0 +1,1212 @@
+/* Remove columns from a multiple sequence alignment.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile2.h"
+#include "esl_regexp.h"
+#include "esl_stopwatch.h"
+#include "esl_vectorops.h"
+
+static char banner[] = "remove columns from a multiple sequence alignment";
+static char usage1[] = "[options] <msafile> <maskfile> (use mask from maskfile)";
+static char usage2[] = "[options] -t <msafile> <coords> (truncate alignment to coords)";
+static char usage3[] = "[options] -g <msafile> (use gap frequencies in aln)";
+static char usage4[] = "[options] -p <msafile> (use post probs (PP) in aln)";
+static char usage5[] = "[options] --rf-is-mask <msafile> (use #=GC RF in aln as mask)";
+
+static int read_mask_file(char *filename, char *errbuf, int **ret_useme, int *ret_mlen);
+static int map_rfpos_to_apos(ESL_MSA *msa, ESL_ALPHABET *abc, char *errbuf, int **i_am_rf, int **ret_rf2a_map, int *ret_rflen);
+static int expand_rf_useme_to_alen(int *useme_rf, int *rf2a_map, int rflen, int alen, char *errbuf, int *useme_a);
+static int count_gaps_in_msa(ESL_MSA *msa, ESL_ALPHABET *abc, int *countme, char *errbuf, double **ret_gap_ct);
+static int count_postprobs_in_msa(ESL_MSA *msa, ESL_ALPHABET *abc, int *countme, char *errbuf, double ***ret_pp_ct);
+static int mask_based_on_gapfreq(double *gap_ct, int64_t alen, int nseq, float gapthresh, int *i_am_eligible, char *errbuf, int **ret_useme);
+static int get_pp_idx(ESL_ALPHABET *abc, char ppchar);
+static int mask_based_on_postprobs(double **pp_ct, int64_t alen, int nseq, float pthresh, float pfract, int do_pavg, float pavg_min, int do_ppcons, float ppcons_min, char *pp_cons, ESL_ALPHABET *abc, int *i_am_eligible, int allgapok, char *errbuf, int **ret_useme);
+static int output_mask(char *filename, int *useme, int *i_am_eligible, int64_t alen, char *errbuf);
+static int determine_nkept_rf(int *useme, int *i_am_rf, int64_t len);
+static int parse_coord_string(const char *cstring, uint32_t *ret_start, uint32_t *ret_end);
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-o", eslARG_OUTFILE, NULL, NULL, NULL, NULL, NULL, NULL, "output the final alignment to file <f>, not stdout", 1 },
+ { "-q", eslARG_NONE, FALSE, NULL, NULL, NULL, "-o", NULL, "be quiet; w/-o, don't print mask info to stdout", 1 },
+ { "--small", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use minimal RAM (RAM usage will be independent of aln size)", 1 },
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "specify that input file is in format <s>", 1 },
+ { "--outformat", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "specify that output aln be format <s>", 1 },
+ { "--fmask-rf", eslARG_OUTFILE, NULL, NULL, NULL, NULL, NULL, NULL, "output final mask of non-gap RF len to file <f>", 1 },
+ { "--fmask-all", eslARG_OUTFILE, NULL, NULL, NULL, NULL, NULL, NULL, "output final mask of full aln len to file <f>", 1 },
+
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--dna,--rna", "<msafile> contains protein alignments", 2 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--amino,--rna","<msafile> contains DNA alignments", 2 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--amino,--dna","<msafile> contains RNA alignments", 2 },
+
+ { "--t-rf", eslARG_NONE, NULL, NULL, NULL, NULL, "-t", NULL, "<coords> string corresponds to non-gap RF positions", 3 },
+ { "--t-rmins", eslARG_NONE, NULL, NULL, NULL, NULL, "-t", NULL, "remove all gap RF positions within <coords>", 3 },
+
+ { "--gapthresh", eslARG_REAL, "0.5", NULL, "0<=x<=1", NULL, "-g", NULL, "only keep columns with <= <x> fraction of gaps in them", 4 },
+ { "--gmask-rf", eslARG_OUTFILE, NULL, NULL, NULL, NULL, "-g", NULL, "output gap-based 0/1 mask of non-gap RF len to file <f>", 4 },
+ { "--gmask-all", eslARG_OUTFILE, NULL, NULL, NULL, NULL, "-g", NULL, "output gap-based 0/1 mask of full aln len to file <f>", 4 },
+
+ { "--pfract", eslARG_REAL, "0.95", NULL, "0<=x<=1", NULL, "-p", NULL, "keep cols w/<x> fraction of seqs w/PP >= --pthresh", 5 },
+ { "--pthresh", eslARG_REAL, "0.95", NULL, "0<=x<=1", NULL, "-p", NULL, "set post prob threshold for --pfract as <x>", 5 },
+ { "--pavg", eslARG_REAL, NULL, NULL, "0<=x<=1", NULL, "-p", "--pfract,--pthresh", "keep cols with average post prob >= <x>", 5 },
+ { "--ppcons", eslARG_REAL, NULL, NULL, "0<=x<=1", NULL, "-p", "--keepins,--pavg,--pfract,--pthresh", "keep cols with PP_cons value >= <x>", 5 },
+ { "--pallgapok", eslARG_NONE, NULL, NULL, FALSE, NULL, "-p", NULL, "keep 100% gap columns (by default, they're removed w/-p)", 5 },
+ { "--pmask-rf", eslARG_OUTFILE, NULL, NULL, NULL, NULL, "-p", NULL, "output PP-based 0/1 mask of non-gap RF len to file <f>", 5 },
+ { "--pmask-all", eslARG_OUTFILE, NULL, NULL, NULL, NULL, "-p", NULL, "output PP-based 0/1 mask of full aln len to file <f>", 5 },
+
+ { "--keepins", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "if msa has RF annotation, allow gap-RF columns to possibly survive",6 },
+
+
+ /* undocumented as options, because they're documented as alternative invocations: */
+ { "-t", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-g,-p,--rf-is-mask", "", 99 },
+ { "-g", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "mask based on gap frequency in the alignment", 99 },
+ { "-p", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "mask based on posterior probability annotation in the alignment", 99 },
+ { "--rf-is-mask", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-t,-g,-p,--keepins","remove a column if and only if it is a gap in the RF annotation", 99 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ ESL_ALPHABET *abc = NULL; /* biological alphabet */
+ char *alifile = NULL; /* alignment file name */
+ int infmt = eslMSAFILE_UNKNOWN; /* format code for alifile */
+ int outfmt = eslMSAFILE_UNKNOWN; /* format code for output ali */
+ ESL_MSAFILE *afp = NULL; /* open alignment file normal version */
+ ESL_MSAFILE2 *afp2 = NULL; /* open alignment file: legacy small-mem version */
+ FILE *ofp; /* output file (default is stdout) */
+ ESL_MSA *msa = NULL; /* one multiple sequence alignment */
+ int status; /* easel return code */
+ int do_rfonly = FALSE; /* TRUE if we'll automatically remove all gap RF columns */
+ int nseq = 0; /* num seqs in alignment */
+ char errbuf[eslERRBUFSIZE]; /* buffer for error messages */
+ int rflen = 0; /* non-gap RF length */
+ int nkept = 0; /* number of columns not removed for current mask */
+ int nkept_rf = 0; /* number of non-gap RF columns not removed for current mask */
+ int be_verbose = FALSE; /* will we print info on masking to stdout? */
+ int apos = 0; /* alignment position */
+ int *i_am_rf = NULL; /* [0..i..msa->alen-1]: TRUE if pos i is non-gap RF posn, if msa->rf == NULL remains NULL */
+ int *i_am_eligible = NULL; /* [0..i..msa->alen-1]: TRUE if we'll consider keeping posn i in our final masks, FALSE if not,
+ * used to automatically remove all non-gap RF columns if msa->RF != NULL && --keepins NOT enabled */
+ int *rf2a_map = NULL; /* [0..rfpos..rflen-1] = apos,
+ * apos is the alignment position (0..msa->alen-1) that
+ * is non-gap RF position rfpos+1 (for rfpos in 0..rflen-1) */
+ int *useme_final = NULL; /* final mask, [0..i..msa->alen-1] TRUE to keep apos i, FALSE not to */
+ ESL_STOPWATCH *w = NULL; /* for timing the masking, only used if -o enabled */
+ int64_t orig_alen = 0; /* alignment length of input alignment (pre-masked) */
+
+ /* variables related to default mode, reading mask from a maskfile */
+ char *maskfile = NULL; /* mask file name */
+ int do_maskfile; /* TRUE if neither -p nor -g are enabled, and we have 2 command-line args */
+ int file_mlen = 0; /* if do_maskfile, length of mask from maskfile, msa->alen or rflen */
+ double **pp_ct = NULL; /* [0..msa->alen-1][0..11] number of each PP value at each aln position */
+ int *useme_mfile = NULL; /* useme deduced from mask from maskfile,
+ * [0..i..file_mlen-1] TRUE to keep apos or rfpos i, FALSE not to */
+
+ /* variables related to truncation mode (-t) */
+ int do_truncate; /* TRUE if -t enabled */
+ uint32_t tstart, tend; /* with -t, start and end position of aln region to keep, parsed from 2nd cmdline arg (<coords> : <start>..<end>) */
+
+ /* variables related to gap frequency mode (-g) */
+ int do_gapthresh; /* TRUE if -g enabled */
+ double **abc_ct = NULL; /* [0..msa->alen-1][0..abc->K] number of each resiude at each position (abc->K is gap) */
+ double *gap_ct = NULL; /* [0..msa->alen-1] number of gaps at each position */
+ int *useme_g = NULL; /* [0..i..msa->alen-1] TRUE to keep apos i based on gapfreq, FALSE not to */
+
+ /* variables related to postprob mode (-p) */
+ int do_postprob; /* TRUE if -p enabled */
+ int do_pavg; /* TRUE if --pavg enabled */
+ int do_ppcons; /* TRUE if --ppcons enabled */
+ float pavg_min; /* <x> from --pavg <x>, if enabled, 0., otherwise */
+ float ppcons_min; /* <x> from --ppcons <x>, if enabled, 0., otherwise */
+ int *useme_pp = NULL; /* [0..i..msa->alen-1] TRUE to keep apos i based on postprobs, FALSE not to */
+
+ /* variables related to RF mode (--rf-is-mask) */
+ int do_rf_is_mask = FALSE; /* TRUE if --rf-is-mask, RF annotation is the mask, all gap RF columns removed, others kept */
+
+ /* variables related to small memory mode (--small) */
+ int do_small; /* TRUE if --small, operate in special small memory mode, aln seq data is not stored */
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage1);
+ esl_usage(stdout, argv[0], usage2);
+ esl_usage(stdout, argv[0], usage3);
+ esl_usage(stdout, argv[0], usage4);
+ esl_usage(stdout, argv[0], usage5);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage1);
+ esl_usage (stdout, argv[0], usage2);
+ esl_usage (stdout, argv[0], usage3);
+ esl_usage (stdout, argv[0], usage4);
+ esl_usage (stdout, argv[0], usage5);
+ puts("\n Only one usage listed above can be used per execution with the exception of");
+ puts(" -p and -g, which can be used in combination with each other.\n");
+ puts(" With -t, <coords> is a string that specifies positive integer start and end");
+ puts(" coordinates seperated by any nonnumeric, nonspace character(s).");
+ puts(" For example, \"23..100\" or \"23/100\" or \"23-100\" all specify that columns");
+ puts(" 23 to 100 be kept and all other columns be removed. Additionally, to retrieve");
+ puts(" all columns from a position to the end, omit the end coord; \"23:\" will work.");
+ puts(" With -t and --t-rf, coordinates are interpreted as non-gap positions in the");
+ puts(" reference (\"#=GC RF\") annotation.\n");
+ puts(" With --rf-is-mask, all columns that are not gaps in the reference annotation");
+ puts(" will be kept and all other columns will be removed.");
+ puts("\n other options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ puts("\n options for specifying alphabet in <msafile>, one is required w/--small:");
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80);
+ puts("\n options related to truncating the alignment (require -t):");
+ esl_opt_DisplayHelp(stdout, go, 3, 2, 80);
+ puts("\n options for masking based on gap frequencies (require -g):");
+ esl_opt_DisplayHelp(stdout, go, 4, 2, 80);
+ puts("\n options for masking based on posterior probabilities (require -p):");
+ esl_opt_DisplayHelp(stdout, go, 5, 2, 80);
+ puts("\n options that modify masking behavior when -g and/or -p are used:");
+ esl_opt_DisplayHelp(stdout, go, 6, 2, 80);
+ exit(0);
+ }
+
+ /* Check that we have the correct number of command line args,
+ * in English: if (NOT 2 cmdline args and none of --rf-is-mask,-p,-g)
+ * AND NOT -p and 1 cmdline arg
+ * AND NOT -g and 1 cmdline arg
+ * AND NOT --rf-is-mask and 1 cmdline arg)
+ * then ERROR due to incorrect usage.
+ */
+ if ((! (((! esl_opt_GetBoolean(go, "--rf-is-mask")) && (! esl_opt_GetBoolean(go, "-p")) && (! esl_opt_GetBoolean(go, "-g"))) && esl_opt_ArgNumber(go) == 2)) && /* it is not the case that (none of --rf-is-mask,-p,-g) and 2 cmdline args */
+ (! ((esl_opt_GetBoolean(go, "-g")) && (esl_opt_ArgNumber(go) == 1))) && /* not -g and 1 arg */
+ (! ((esl_opt_GetBoolean(go, "-p")) && (esl_opt_ArgNumber(go) == 1))) && /* not -p and 1 arg */
+ (! ((esl_opt_GetBoolean(go, "--rf-is-mask")) && (esl_opt_ArgNumber(go) == 1)))) /* not --rf-is-mask and 1 arg */
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage1);
+ esl_usage(stdout, argv[0], usage2);
+ esl_usage(stdout, argv[0], usage3);
+ esl_usage(stdout, argv[0], usage4);
+ esl_usage(stdout, argv[0], usage5);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+ else
+
+ alifile = esl_opt_GetArg(go, 1);
+
+ /*******************************************************************************
+ * Determine the type of masking we'll do:
+ * 1. do_maskfile: read mask from file, if none of -p,-g,-t,--rf-is-mask enabled
+ * 2. do_truncate: truncate alignment between coords from 2nd cmdline arg, if -t
+ * 3. do_postprob: use posterior probabilities in aln to create mask, if -p
+ * 4. do_gapthresh: use gap frequency in aln to create mask, if -g
+ * 5. do_rf_is_mask: mask solely based on RF annotation, if --rf-is-mask
+ *
+ * We can combine 3 and 4, but 1 and 2 and 5 are exclusive. Exclusivity of 1 is enforced by
+ * if statement above that checks number of command line args. Exclusivity of 2 and 5
+ * is enforced by esl_getopts.
+ *******************************************************************************/
+
+ do_maskfile = do_truncate = do_postprob = do_gapthresh = do_rf_is_mask = FALSE; /* until proven otherwise */
+ if(esl_opt_ArgNumber(go) == 2) {
+ if(esl_opt_GetBoolean(go, "-t")) {
+ do_truncate = TRUE;
+ /* we parse 2nd cmdline arg later */
+ }
+ else {
+ do_maskfile = TRUE;
+ maskfile = esl_opt_GetArg(go, 2);
+ }
+ }
+ else { /* 1 cmdline arg (when we checked for correct usage above, we verified either 1 or 2 cmdline args)*/
+ do_rf_is_mask = esl_opt_GetBoolean(go, "--rf-is-mask");
+ do_postprob = esl_opt_GetBoolean(go, "-p");
+ do_gapthresh = esl_opt_GetBoolean(go, "-g");
+ }
+
+ /* check for incompatible options that I don't know how to enforce with esl_getopts */
+ /* --keepins only makes sense with -p or -g */
+ if(esl_opt_GetBoolean(go, "--keepins") && (! do_postprob) && (! do_gapthresh))
+ esl_fatal("--keepins only makes sense in combination with -p and/or -g");
+
+ /* will we be verbose? */
+ be_verbose = (esl_opt_IsOn(go, "-o") && (! esl_opt_GetBoolean(go, "-q"))) ? TRUE : FALSE;
+
+ /* will we operate in small memory mode? */
+ do_small = (esl_opt_GetBoolean(go, "--small")) ? TRUE : FALSE;
+
+ /* determine input/output formats */
+ if (esl_opt_IsOn(go, "--informat")) {
+ infmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--informat"));
+ if (infmt == eslMSAFILE_UNKNOWN) esl_fatal("%s is not a valid input sequence file format for --informat", esl_opt_GetString(go, "--informat"));
+ if (do_small && infmt != eslMSAFILE_PFAM) esl_fatal("small memory mode requires Pfam formatted alignments");
+ }
+ if (esl_opt_IsOn(go, "--outformat")) {
+ outfmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--outformat"));
+ if (outfmt == eslMSAFILE_UNKNOWN) esl_fatal("%s is not a valid input sequence file format for --outformat", esl_opt_GetString(go, "--outformat"));
+ if (do_small && outfmt != eslMSAFILE_PFAM) esl_fatal("we can only output Pfam formatted alignments in small memory mode");
+ }
+ else outfmt = eslMSAFILE_STOCKHOLM;
+
+ if (do_small) { /* defaults change if we're in small memory mode,
+ note we checked --informat and --outformat compatibility with do_small in two if statements above */
+ infmt = eslMSAFILE_PFAM; /* this must be true, else we can't do small memory mode */
+ outfmt = eslMSAFILE_PFAM;
+ }
+
+ /* open output file */
+ if (esl_opt_GetString(go, "-o") != NULL) {
+ if ((ofp = fopen(esl_opt_GetString(go, "-o"), "w")) == NULL)
+ esl_fatal("Failed to open -o output file %s\n", esl_opt_GetString(go, "-o"));
+ /* create and start stopwatch */
+ w = esl_stopwatch_Create();
+ esl_stopwatch_Start(w);
+ } else ofp = stdout;
+
+ /****************************************
+ * Open the MSA file; determine alphabet
+ ****************************************/
+
+ /* abc handling is weird. We only use alphabet to define gap characters in this miniapp
+ * unless do_small is TRUE. msa's are actually read in text mode. Thus if do_small is FALSE,
+ * eslRNA suffices for anything. If do_small is TRUE, we need the alphabet so we
+ * require --amino,--dna, or --rna below.
+ */
+ if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (do_small) esl_fatal("With --small, the alphabet must be specified with --amino, --rna, or --dna.");
+ else abc = esl_alphabet_Create(eslRNA); /* alphabet is only used to define gap characters, so (in this miniapp) we're okay specifying RNA for any alignment (even non-RNA ones) */
+
+ if (do_small)
+ {
+ status = esl_msafile2_Open(alifile, NULL, &afp2);
+ if (status == eslENOTFOUND) esl_fatal("Alignment file %s doesn't exist or is not readable\n", alifile);
+ else if (status != eslOK) esl_fatal("Alignment file open failed with error %d\n", status);
+ }
+ else
+ {
+ status = esl_msafile_Open(NULL, alifile, NULL, infmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+ }
+
+ /* If nec, read mask from the mask file */
+ if (do_maskfile) if((status = read_mask_file(maskfile, errbuf, &useme_mfile, &file_mlen)) != eslOK) esl_fatal(errbuf);
+
+ /************************************************************************************
+ * Read the first MSA in the file (we only mask first aln) and verify we can mask it.
+ ************************************************************************************/
+
+ if (do_small)
+ {
+ status = esl_msafile2_ReadInfoPfam(afp2, NULL, abc, -1, NULL, NULL, &msa, &nseq, &orig_alen, NULL, NULL, NULL, NULL, NULL,
+ (do_gapthresh) ? &abc_ct : NULL,
+ (do_postprob) ? &pp_ct : NULL,
+ NULL, NULL, NULL); /* we don't want bp_ct, srfpos_ct nor erfpos_ct */
+ if (status == eslEFORMAT) esl_fatal("Alignment file parse error:\n%s\n", afp2->errbuf);
+ else if (status == eslEINVAL) esl_fatal("Alignment file parse error:\n%s\n", afp2->errbuf);
+ else if (status != eslOK) esl_fatal("Alignment file read failed with error code %d\n%s", status, afp);
+
+ msa->alen = orig_alen; /* for convenience, but be careful, the msa doesn't actually have any aseq or ax */
+ }
+ else
+ {
+ status = esl_msafile_Read(afp, &msa); /* if ! do_small, we read full aln into memory */
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ orig_alen = msa->alen;
+ if(do_postprob && msa->pp == NULL && (! esl_opt_IsOn(go, "--ppcons"))) esl_fatal("-p was enabled, but the MSA has no posterior probability (#=GR PP) annotation.");
+ }
+
+ /* Allocate and initialize i_am_eligible array, which defines which
+ * positions we'll consider keeping. If msa->rf == NULL or --keepins
+ * enabled, this will be all positions, else it will only be non-gap
+ * RF positions.
+ */
+ ESL_ALLOC(i_am_eligible, sizeof(int) * (int) msa->alen);
+ esl_vec_ISet(i_am_eligible, (int) msa->alen, TRUE); /* default to all positions, this is overwritten just below if nec */
+
+ /* if RF exists, get i_am_rf array[0..alen] which tells us which positions are non-gap RF positions
+ * and rf2a_map, a map of non-gap RF positions to overall alignment positions */
+ if(msa->rf != NULL) {
+ if((status = map_rfpos_to_apos(msa, abc, errbuf, &i_am_rf, &rf2a_map, &rflen)) != eslOK) esl_fatal(errbuf);
+ if(! esl_opt_GetBoolean(go, "--keepins")) { /* we'll only consider keeping non-gap RF columns */
+ esl_vec_ICopy(i_am_rf, (int) msa->alen, i_am_eligible);
+ }
+ }
+ else { /* RF doesn't exist, make sure no options that require RF annotation were enabled */
+ if(esl_opt_IsOn(go, "--pmask-rf")) esl_fatal("Error, --pmask-rf enabled, but alignment does not have RF annotation.");
+ if(esl_opt_IsOn(go, "--gmask-rf")) esl_fatal("Error, --gmask-rf enabled, but alignment does not have RF annotation.");
+ if(esl_opt_IsOn(go, "--fmask-rf")) esl_fatal("Error, --fmask-rf enabled, but alignment does not have RF annotation.");
+ if(esl_opt_GetBoolean(go, "--rf-is-mask")) esl_fatal("Error, --rf-is-mask enabled but msa does not have RF annotation.");
+ if(esl_opt_GetBoolean(go, "--keepins")) esl_fatal("Error, --keepins enabled but msa does not have RF annotation.");
+ if(esl_opt_GetBoolean(go, "--t-rmins")) esl_fatal("Error, --t-rmins enabled but msa does not have RF annotation.");
+ }
+
+ /* make sure we have pp_cons if --ppcons enabled */
+ if(esl_opt_IsOn(go, "--ppcons") && msa->pp_cons == NULL) esl_fatal("--ppcons was enabled, but the MSA has no consensus posterior probability (#=GC PP_cons) annotation.");
+
+
+ /* Determine value of do_rfonly, if TRUE, we'll automatically remove all non-gap RF columns,
+ * if(do_maskfile): if mlen (length of mask from file) == rflen, do_rfonly set to TRUE
+ * if(do_truncate): if msa->rf != NULL and --t-rmins enabled, then do_rfonly set to TRUE
+ * else : if msa->rf != NULL and --keepins not enabled, then do_rfonly set to TRUE
+ */
+ do_rfonly = FALSE; /* until proven otherwise */
+ if(do_maskfile) {
+ if(msa->rf == NULL) {
+ if((int) msa->alen != file_mlen) esl_fatal("Error, mask length (%d) not equal to alignment length (%d), and alignment has no #=GC RF annotation.", file_mlen, msa->alen);
+ }
+ else { /* msa->rf != NULL */
+ if(((int) msa->alen != file_mlen) && (rflen != file_mlen)) esl_fatal("Error, mask length (%d) not equal to alignment length (%d), and alignment has no #=GC RF annotation.", file_mlen, msa->alen);
+ if(rflen == file_mlen) do_rfonly = TRUE;
+ }
+ }
+ else if(do_truncate) {
+ if(msa->rf != NULL && esl_opt_GetBoolean(go, "--t-rmins")) do_rfonly = TRUE;
+ /* Note: we verified that --t-rmins was not enabled if msa->rf == NULL immediately after reading the msa above */
+ }
+ else if(do_rf_is_mask) {
+ do_rfonly = TRUE;
+ }
+ else { /* ! do_maskfile && ! do_truncate && ! do_rf_is_mask */
+ if(msa->rf != NULL && (! esl_opt_GetBoolean(go, "--keepins"))) do_rfonly = TRUE;
+ }
+
+ /****************************************************************
+ * Prepare for masking. This is done differently for each mode. *
+ ****************************************************************/
+ ESL_ALLOC(useme_final, sizeof(int) * msa->alen);
+ if(be_verbose) {
+ fprintf(stdout, "# %19s %7s %7s %16s %16s %13s\n", "", "", "", "all columns", "non-gap RF colns","");
+ fprintf(stdout, "# %19s %7s %7s %16s %16s %13s\n", "", "", "", "----------------", "----------------","");
+ fprintf(stdout, "# %19s %7s %7s %7s %7s %7s %7s %13s\n", "", "", "non-gap", "num", "num", "num", "num", "gap RF colns");
+ fprintf(stdout, "# %-19s %7s %7s %7s %7s %7s %7s %13s\n","mask mode", "aln len", "RF len", "kept", "removed", "kept", "removed", "auto removed?");
+ fprintf(stdout, "# %19s %7s %7s %7s %7s %7s %7s %13s\n", "-------------------", "-------", "-------", "-------", "-------", "-------", "-------", "-------------");
+ }
+
+ if(do_maskfile) {
+ if(do_rfonly) {
+ if((status = expand_rf_useme_to_alen(useme_mfile, rf2a_map, rflen, msa->alen, errbuf, useme_final)) != eslOK) esl_fatal(errbuf);
+ }
+ else { /* ! do_rfonly, copy useme_mfile to useme_final (we could do this differently...) */
+ esl_vec_ICopy(useme_mfile, msa->alen, useme_final);
+ }
+ if(be_verbose) {
+ nkept = esl_vec_ISum(useme_final, (int) msa->alen);
+ if(msa->rf == NULL) fprintf(stdout, " %-19s %7" PRId64 " %7s %7d %7d %7s %7s %13s\n", "maskfile", msa->alen, "-", nkept, (int) msa->alen - nkept, "-", "-", "-");
+ else {
+ nkept_rf = (do_rfonly) ? nkept: determine_nkept_rf(useme_final, i_am_rf, msa->alen);
+ fprintf(stdout, " %-19s %7" PRId64 " %7d %7d %7d %7d %7d %13s\n", "maskfile", msa->alen, rflen, nkept, (int) msa->alen - nkept, nkept_rf, rflen - nkept_rf, do_rfonly ? "yes" : "no");
+ }
+ }
+ }
+ if(do_truncate) {
+ parse_coord_string(esl_opt_GetArg(go, 2), &tstart, &tend); /* this dies with esl_fatal() if 2nd cmdline arg is invalid */
+ /* remember: user provided coords are 1..alen or 1..rflen, whereas all internal arrays use 0..alen-1 and 0..rflen-1 */
+ if(esl_opt_GetBoolean(go, "--t-rf")) {
+ /* convert start and end positions read from <coords> 2nd cmdline arg from rf positions to full alignment positions */
+ if(tstart > rflen) esl_fatal("with -t and --t-rf, start coordinate value %d exceeds non-gap RF length of %d", tstart, rflen);
+ if(tend > rflen) esl_fatal("with -t and --t-rf, end coordinate value %d exceeds non-gap RF length of %d", tend, rflen);
+ tstart = rf2a_map[(tstart-1)] + 1;
+ if(tend == 0) tend = (int) msa->alen; /* careful, don't set it to rflen and then convert with the map, you'll lose the inserts after the final non-gap RF posn */
+ else tend = rf2a_map[(tend-1)] + 1;
+ }
+ else {
+ if(tstart > msa->alen) esl_fatal("with -t, start coordinate value %d exceeds alignment length of %" PRId64, tstart, msa->alen);
+ if(tend > msa->alen) esl_fatal("with -t, end coordinate value %d exceeds alignment length of %" PRId64, tend, msa->alen);
+ if(tend == 0) tend = (int) msa->alen;
+ }
+ /* create the truncation mask */
+ for(apos = 0; apos < (tstart-1); apos++) useme_final[apos] = FALSE;
+ for(apos = (tstart-1); apos < tend; apos++) useme_final[apos] = do_rfonly ? i_am_rf[apos] : TRUE; /* only keep non-gap RF positions if do_rfonly */
+ for(apos = tend; apos < msa->alen; apos++) useme_final[apos] = FALSE;
+ if(be_verbose) {
+ nkept = esl_vec_ISum(useme_final, (int) msa->alen);
+ if(msa->rf == NULL) fprintf(stdout, " %-19s %7" PRId64 " %7s %7d %7d %7s %7s %13s\n", "truncation", msa->alen, "-", nkept, (int) msa->alen - nkept, "-", "-", "-");
+ else {
+ nkept_rf = (do_rfonly) ? nkept: determine_nkept_rf(useme_final, i_am_rf, msa->alen);
+ fprintf(stdout, " %-19s %7" PRId64 " %7d %7d %7d %7d %7d %13s\n", "truncation", msa->alen, rflen, nkept, (int) msa->alen - nkept, nkept_rf, rflen - nkept_rf, do_rfonly ? "yes" : "no");
+ }
+ }
+ }
+ if(do_gapthresh) {
+ if(! do_small) {
+ if((status = count_gaps_in_msa(msa, abc, i_am_eligible, errbuf, &gap_ct)) != eslOK) esl_fatal(errbuf);
+ }
+ else {
+ ESL_ALLOC(gap_ct, sizeof(double) * msa->alen);
+ for(apos = 0; apos < msa->alen; apos++) gap_ct[apos] = abc_ct[apos][abc->K];
+ }
+ if((status = mask_based_on_gapfreq(gap_ct, msa->alen, (do_small) ? nseq : msa->nseq, esl_opt_GetReal(go, "--gapthresh"), i_am_eligible, errbuf, &useme_g)) != eslOK) esl_fatal(errbuf);
+ if(be_verbose) {
+ nkept = esl_vec_ISum(useme_g, (int) msa->alen);
+ if(msa->rf == NULL) fprintf(stdout, " %-19s %7" PRId64 " %7s %7d %7d %7s %7s %13s\n", "gapfreq", msa->alen, "-", nkept, (int) msa->alen - nkept, "-", "-", "-");
+ else {
+ nkept_rf = (do_rfonly) ? nkept: determine_nkept_rf(useme_g, i_am_rf, msa->alen);
+ fprintf(stdout, " %-19s %7" PRId64 " %7d %7d %7d %7d %7d %13s\n", "gapfreq", msa->alen, rflen, nkept, (int) msa->alen - nkept, nkept_rf, rflen - nkept_rf, do_rfonly ? "yes" : "no");
+ }
+ }
+ }
+ if(do_postprob) {
+ if(! do_small) {
+ if((status = count_postprobs_in_msa(msa, abc, i_am_eligible, errbuf, &pp_ct)) != eslOK) esl_fatal(errbuf);
+ }
+ do_pavg = esl_opt_IsOn(go, "--pavg");
+ pavg_min = do_pavg ? esl_opt_GetReal(go, "--pavg") : 0.; /* if ! do_pavg, pavg_min is irrelevant */
+ do_ppcons = esl_opt_IsOn(go, "--ppcons");
+ ppcons_min = do_ppcons ? esl_opt_GetReal(go, "--ppcons") : 0.; /* if ! do_ppcons, ppcons_min is irrelevant */
+ if((status = mask_based_on_postprobs(pp_ct, msa->alen, (do_small) ? nseq : msa->nseq, esl_opt_GetReal(go, "--pthresh"), esl_opt_GetReal(go, "--pfract"), do_pavg, pavg_min, do_ppcons, ppcons_min, msa->pp_cons, abc, i_am_eligible, esl_opt_GetBoolean(go, "--pallgapok"), errbuf, &useme_pp)) != eslOK) esl_fatal(errbuf);
+ if(be_verbose) {
+ nkept = esl_vec_ISum(useme_pp, (int) msa->alen);
+ if(msa->rf == NULL) fprintf(stdout, " %-19s %7" PRId64 " %7s %7d %7d %7s %7s %13s\n", "postprobs", msa->alen, "-", nkept, (int) msa->alen - nkept, "-", "-", "-");
+ else {
+ nkept_rf = (do_rfonly) ? nkept: determine_nkept_rf(useme_pp, i_am_rf, msa->alen);
+ fprintf(stdout, " %-19s %7" PRId64 " %7d %7d %7d %7d %7d %13s\n", "postprobs", msa->alen, rflen, nkept, (int) msa->alen - nkept, nkept_rf, rflen - nkept_rf, do_rfonly ? "yes" : "no");
+ }
+ }
+ }
+ if(do_rf_is_mask) {
+ for(apos = 0; apos < msa->alen; apos++) useme_final[apos] = i_am_rf[apos];
+ if(be_verbose) fprintf(stdout, " %-19s %7" PRId64 " %7d %7d %7d %7d %7d %13s\n", "RF", msa->alen, rflen, rflen, (int) msa->alen - rflen, rflen, 0, "yes");
+ }
+
+ /*********************************************************************************
+ * Determine final mask if -p, -g or both were enabled (else we already have it) *
+ *********************************************************************************/
+ /* combine pp and gap mask if -p and -g */
+ if(do_gapthresh && do_postprob) {
+ for(apos = 0; apos < msa->alen; apos++)
+ useme_final[apos] = (useme_g[apos] && useme_pp[apos]) ? TRUE : FALSE;
+ if(be_verbose) {
+ nkept = esl_vec_ISum(useme_final, (int) msa->alen);
+ if(msa->rf == NULL) fprintf(stdout, " %-19s %7" PRId64 " %7s %7d %7d %7s %7s %13s\n", "gapfreq&postprobs", msa->alen, "-", nkept, (int) msa->alen - nkept, "-", "-", "-");
+ else {
+ nkept_rf = (do_rfonly) ? nkept: determine_nkept_rf(useme_final, i_am_rf, msa->alen);
+ fprintf(stdout, " %-19s %7" PRId64 " %7d %7d %7d %7d %7d %13s\n", "gapfreq&postprobs", msa->alen, rflen, nkept, (int) msa->alen - nkept, nkept_rf, rflen - nkept_rf, do_rfonly ? "yes" : "no");
+ }
+ }
+ }
+ else if(do_gapthresh) {
+ esl_vec_ICopy(useme_g, msa->alen, useme_final);
+ }
+ else if(do_postprob) {
+ esl_vec_ICopy(useme_pp, msa->alen, useme_final);
+ }
+ /* else (do_maskfile || do_rf_is_mask || do_truncate) we set useme_final above */
+
+ /************************************************
+ * Unless --small enabled, mask the alignment *
+ ************************************************/
+ if(! do_small) {
+ if (abc && (abc->type == eslRNA || abc->type == eslDNA) &&
+ (status = esl_msa_RemoveBrokenBasepairs(msa, errbuf, useme_final)) != eslOK) esl_fatal(errbuf);
+ if ((status = esl_msa_ColumnSubset (msa, errbuf, useme_final)) != eslOK) esl_fatal(errbuf);
+ } /* else we'll do it as we regurgitate it upon rereading below */
+
+ /************************
+ * Output the alignment *
+ ************************/
+ if (! do_small)
+ {
+ esl_msafile_Write(ofp, msa, outfmt);
+ }
+ else {
+ /* do_small==TRUE, we don't have the full msa stored,
+ * we must regurgitate it, removing unwanted columns as we do.
+ * First, close then reopen alifile so we can reread (first) alignment (no esl_msafile_Position() exists yet)
+ */
+ esl_msafile2_Close(afp2);
+ status = esl_msafile2_OpenDigital(abc, alifile, NULL, &afp2); /* this should work b/c it did on the first pass */
+ if (status == eslENOTFOUND) esl_fatal("Second pass: alignment file %s doesn't exist or is not readable\n", alifile);
+ else if (status == eslEFORMAT) esl_fatal("Second pass: couldn't determine format of alignment %s\n", alifile);
+ else if (status != eslOK) esl_fatal("Second pass: alignment file open failed with error %d\n");
+ status = esl_msafile2_RegurgitatePfam(afp2, ofp,
+ -1, -1, -1, -1, /* max width of seq names, gf,gc,gr tags unknown, we'll use margin length from file */
+ TRUE, /* regurgitate stockholm header ? */
+ TRUE, /* regurgitate // trailer ? */
+ TRUE, /* regurgitate blank lines */
+ TRUE, /* regurgitate comments */
+ TRUE, /* regurgitate GF ? */
+ TRUE, /* regurgitate GS ? */
+ TRUE, /* regurgitate GC ? */
+ TRUE, /* regurgitate GR ? */
+ TRUE, /* regurgitate aseq ? */
+ NULL, /* regurgitate all seqs, not a subset */
+ NULL, /* regurgitate all seqs, not a subset */
+ useme_final, /* which columns to keep */
+ NULL, /* we're not adding any columns */
+ msa->alen, /* expected length, not strictly necessary */
+ '.', /* gapchar, irrelevant in this context */
+ NULL, /* don't return num seqs read */
+ NULL); /* don't return num seqs regurgitated */
+ if(status == eslEOF) esl_fatal("Second pass, unable to reread alignment");
+ if(status != eslOK) esl_fatal("Second pass, error rereading alignment");
+ }
+ if(be_verbose) fprintf(stdout, "#\n");
+
+ /**************************************************************************************************************
+ * Output masks, if nec (we already checked above that msa->rf != NULL If any --*mask-rf options are enabled) *
+ **************************************************************************************************************/
+ if(esl_opt_IsOn(go, "--pmask-rf")) {
+ if((status = output_mask(esl_opt_GetString(go, "--pmask-rf"), useme_pp, i_am_rf, orig_alen, errbuf)) != eslOK) esl_fatal(errbuf);
+ if(be_verbose) fprintf(stdout, "# Posterior probability mask of non-gap RF length (%d) saved to file %s.\n", rflen, esl_opt_GetString(go, "--pmask-rf"));
+ }
+ if(esl_opt_IsOn(go, "--pmask-all")) {
+ if((status = output_mask(esl_opt_GetString(go, "--pmask-all"), useme_pp, NULL, orig_alen, errbuf)) != eslOK) esl_fatal(errbuf);
+ if(be_verbose) fprintf(stdout, "# Posterior probability mask of full alignment length (%d) saved to file %s.\n", (int) orig_alen, esl_opt_GetString(go, "--pmask-all"));
+ }
+ if(esl_opt_IsOn(go, "--gmask-rf")) {
+ if((status = output_mask(esl_opt_GetString(go, "--gmask-rf"), useme_g, i_am_rf, orig_alen, errbuf)) != eslOK) esl_fatal(errbuf);
+ if(be_verbose) fprintf(stdout, "# Gap frequency mask of non-gap RF length (%d) saved to file %s.\n", rflen, esl_opt_GetString(go, "--gmask-rf"));
+ }
+ if(esl_opt_IsOn(go, "--gmask-all")) {
+ if((status = output_mask(esl_opt_GetString(go, "--gmask-all"), useme_g, NULL, orig_alen, errbuf)) != eslOK) esl_fatal(errbuf);
+ if(be_verbose) fprintf(stdout, "# Gap frequency mask of full alignment length (%d) saved to file %s.\n", (int) orig_alen, esl_opt_GetString(go, "--gmask-all"));
+ }
+ if(esl_opt_IsOn(go, "--fmask-rf")) {
+ if((status = output_mask(esl_opt_GetString(go, "--fmask-rf"), useme_final, i_am_rf, orig_alen, errbuf)) != eslOK) esl_fatal(errbuf);
+ if(be_verbose) fprintf(stdout, "# Final mask of non-gap RF length (%d) saved to file %s.\n", rflen, esl_opt_GetString(go, "--fmask-rf"));
+ }
+ if(esl_opt_IsOn(go, "--fmask-all")) {
+ if((status = output_mask(esl_opt_GetString(go, "--fmask-all"), useme_final, NULL, orig_alen, errbuf)) != eslOK) esl_fatal(errbuf);
+ if(be_verbose) fprintf(stdout, "# Final mask of full alignment length (%d) saved to file %s.\n", (int) orig_alen, esl_opt_GetString(go, "--fmask-all"));
+ }
+ if(esl_opt_GetString(go, "-o") != NULL) {
+ fclose(ofp);
+ if(be_verbose) fprintf(stdout, "# Masked alignment saved to file %s.\n", esl_opt_GetString(go, "-o"));
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "# CPU time: ");
+ }
+
+ /* Clean up, normal return */
+ if (rf2a_map) free(rf2a_map);
+ if (useme_mfile) free(useme_mfile);
+ if (useme_g) free(useme_g);
+ if (useme_pp) free(useme_pp);
+ if (useme_final) free(useme_final);
+ if (i_am_rf) free(i_am_rf);
+ if (i_am_eligible) free(i_am_eligible);
+ if (pp_ct) esl_Free2D((void **) pp_ct, orig_alen);
+ if (abc_ct) esl_Free2D((void **) abc_ct, orig_alen);
+ if (gap_ct) free(gap_ct);
+ if (msa) esl_msa_Destroy(msa);
+ if (abc) esl_alphabet_Destroy(abc);
+ if (w) esl_stopwatch_Destroy(w);
+ if (afp) esl_msafile_Close(afp);
+ if (afp2) esl_msafile2_Close(afp2);
+ esl_getopts_Destroy(go);
+ return 0;
+
+ ERROR:
+ esl_fatal("Memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+/* read_mask_file
+ *
+ * Given the name of a mask file with 1 mask in it,
+ * read it, fill <useme> and return.
+ *
+ * mlen length of the mask
+ * useme[0..i..mlen-1]: '1' if we should keep column i, '0' if not.
+ *
+ * useme is allocated here, and must be freed by caller.
+ *
+ * The mask must only contain '0' or '1' characters.
+ * Lines prefixed with '#' are comment lines, and ignored.
+ * All whitespace (including newlines) is ignored.
+ *
+ * Returns: eslOK on success and <ret_useme> is set as <useme>.
+ * <ret_masklen> is set as <masklen>.
+ * eslEINVAL if a non-0/1 character read
+ */
+int
+read_mask_file(char *filename, char *errbuf, int **ret_useme, int *ret_mlen)
+{
+ int status;
+ ESL_FILEPARSER *efp;
+ char *tok;
+ int *useme = NULL;
+ int toklen;
+ int mlen = 0;
+ int i;
+ void *tmp;
+
+ if (esl_fileparser_Open(filename, NULL, &efp) != eslOK) ESL_FAIL(eslFAIL, errbuf, "failed to open %s in read_mask_file\n", filename);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ while ((status = esl_fileparser_GetToken(efp, &tok, &toklen)) == eslOK) {
+ if(mlen == 0) ESL_ALLOC (useme, sizeof(int) * toklen);
+ else ESL_RALLOC(useme, tmp, sizeof(int) * (mlen+toklen));
+ for(i = 0; i < toklen; i++) {
+ if(tok[i] == '0') useme[mlen+i] = FALSE;
+ else if(tok[i] == '1') useme[mlen+i] = TRUE;
+ else ESL_FAIL(eslEINVAL, errbuf, "Mask character number %d is neither a '0', nor a '1' but a (%c). The mask must be only 1s and 0s.", mlen+i+1, tok[i]);
+ }
+ mlen += toklen;
+ }
+
+ *ret_useme = useme;
+ *ret_mlen = mlen;
+ esl_fileparser_Close(efp);
+ return eslOK;
+
+ ERROR:
+ if(useme != NULL) free(useme);
+ ESL_FAIL(status, errbuf, "Ran out of memory while reading the mask file.");
+ return status; /* NEVERREACHED */
+}
+
+/* map_rfpos_to_apos
+ *
+ * Given an MSA, determine the alignment position of each
+ * non-gap RF (reference) position. The abc is only necessary
+ * for defining gap characters.
+ *
+ * rf2a_map[0..rfpos..rflen-1] = apos, apos is the alignment position (0..msa->alen-1) that
+ * is non-gap RF position rfpos+1 (for rfpos in 0..rflen-1)
+ */
+static int map_rfpos_to_apos(ESL_MSA *msa, ESL_ALPHABET *abc, char *errbuf, int **ret_i_am_rf, int **ret_rf2a_map, int *ret_rflen)
+{
+ int status;
+ int rflen = 0;
+ int *rf2a_map = NULL;
+ int *i_am_rf = NULL;
+ int rfpos = 0;
+ int apos = 0;
+
+ /* contract check */
+ if(msa->rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "Error, trying to map RF positions to alignment positions, but msa->rf is NULL.");
+
+ /* count non-gap RF columns */
+ for(apos = 0; apos < msa->alen; apos++) {
+ if((! esl_abc_CIsGap(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsMissing(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsNonresidue(abc, msa->rf[apos])))
+ {
+ rflen++;
+ /* I don't use esl_abc_CIsResidue() b/c that would return FALSE for 'x' with RNA and DNA */
+ }
+ }
+ /* build map */
+ ESL_ALLOC(i_am_rf, sizeof(int) * msa->alen);
+ ESL_ALLOC(rf2a_map, sizeof(int) * rflen);
+ for(apos = 0; apos < msa->alen; apos++) {
+ if((! esl_abc_CIsGap(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsMissing(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsNonresidue(abc, msa->rf[apos]))) {
+ i_am_rf[apos] = TRUE;
+ rf2a_map[rfpos++] = apos;
+ }
+ else {
+ i_am_rf[apos] = FALSE;
+ }
+ }
+ *ret_i_am_rf = i_am_rf;
+ *ret_rf2a_map = rf2a_map;
+ *ret_rflen = rflen;
+ return eslOK;
+
+ ERROR:
+ if(i_am_rf != NULL) free(i_am_rf);
+ if(rf2a_map != NULL) free(rf2a_map);
+ ESL_FAIL(status, errbuf, "Error, out of memory while mapping RF positions to alignment positions.");
+}
+
+/* expand_rf_useme_to_alen
+ *
+ * Given a <useme_rf> array that corresponds to rflen (non-gap RF)
+ * length of an msa, expand it to msa->alen using the map <rf2a_map>
+ * from RF positions to alignment positions and overwrite the
+ * <useme_a> array as the alen expanded array.
+ *
+ * If we encounter an error, we return non-eslOK status and
+ * and fill errbuf with error message.
+ */
+static int expand_rf_useme_to_alen(int *useme_rf, int *rf2a_map, int rflen, int alen, char *errbuf, int *useme_a)
+{
+ int rfpos = 0;
+
+ /* initialize */
+ esl_vec_ISet(useme_a, alen, FALSE);
+
+ for(rfpos = 0; rfpos < rflen; rfpos++) {
+ if(rf2a_map[rfpos] > (alen-1)) ESL_FAIL(eslEINVAL, errbuf, "Error in expand_rf_useme_to_alen(), rf2a_map[rfpos:%d] = %d, but alen is %d.", rfpos, rf2a_map[rfpos], alen);
+ useme_a[rf2a_map[rfpos]] = useme_rf[rfpos];
+ }
+
+ return eslOK;
+}
+
+/* count_gaps_in_msa()
+ *
+ * Given an msa, fill gap_ct[apos] with the number of gaps in position
+ * apos, for all positions apos=0..msa->alen-1. Return gap_ct as
+ * <ret_gap_ct>. <countme>[0..apos..msa->alen-1] = TRUE if we should
+ * count for position apos, FALSE if we shouldn't (leave ngap[apos] =
+ * 0). (countme allows us to not waste time counting gaps in columns
+ * that we will automatically remove, for example those that are
+ * gaps in the RF annotation).
+ *
+ * If we encounter an error, we return non-eslOK status and and fill
+ * errbuf with error message.
+ *
+ * Returns eslOK upon success, and points <ret_useme> at useme, caller
+ * must free it.
+ */
+static int count_gaps_in_msa(ESL_MSA *msa, ESL_ALPHABET *abc, int *countme, char *errbuf, double **ret_gap_ct)
+{
+ int status;
+ double *gap_ct = NULL;
+ int apos, i;
+
+ /* contract check, msa should be in text mode */
+ if(msa->flags & eslMSA_DIGITAL) ESL_FAIL(eslEINVAL, errbuf, "count_gaps_in_msa() contract violation, MSA is digitized");
+
+ ESL_ALLOC(gap_ct, sizeof(double) * msa->alen);
+ esl_vec_DSet(gap_ct, msa->alen, 0.);
+
+ for(apos = 0; apos < (int) msa->alen; apos++) {
+ if(countme[apos]) {
+ for(i = 0; i < msa->nseq; i++) {
+ if(esl_abc_CIsGap(abc, msa->aseq[i][apos])) gap_ct[apos] += 1.0;
+ }
+ }
+ }
+ *ret_gap_ct = gap_ct;
+ return eslOK;
+
+ ERROR:
+ if(gap_ct != NULL) free(gap_ct);
+ ESL_FAIL(status, errbuf, "Error, out of memory while counting gaps in the msa.");
+ return status; /* NEVERREACHED */
+}
+
+/* mask_based_on_gapfreq()
+ *
+ * Determine which columns to include/exclude based on frequency of
+ * gaps. Gap counts per-position are provided in <gap_ct>.
+ * If posn x gap freq is <= <gapthresh>, we set useme[x] to TRUE
+ * (we'll keep x), else we set useme[x] to FALSE (we won't keep x).
+ * <i_am_rf>[0..alen-1] defines which columns are eligible for
+ * being used, if <i_am_rf[x]> useme[x] is set as FALSE,
+ * regardless of gap frequency.
+ *
+ * If we encounter an error, we return non-eslOK status and
+ * and fill errbuf with error message.
+ *
+ * Returns eslOK upon success, and points <ret_useme> at useme,
+ * caller must free it.
+ */
+static int mask_based_on_gapfreq(double *gap_ct, int64_t alen, int nseq, float gapthresh, int *i_am_eligible, char *errbuf, int **ret_useme)
+{
+ int status;
+ int *useme = NULL;
+ int apos;
+ float gapfreq;
+
+ /* contract check */
+ if(i_am_eligible == NULL) ESL_FAIL(eslEINVAL, errbuf, "mask_based_on_gapthresh() contract violation, i_am_eligible is NULL");
+
+ /* allocate */
+ ESL_ALLOC(useme, sizeof(int) * alen);
+
+ for(apos = 0; apos < alen; apos++) {
+ if(i_am_eligible[apos]) {
+ gapfreq = gap_ct[apos] / (float) nseq;
+ useme[apos] = gapthresh < gapfreq ? FALSE : TRUE; /* should I be worried about imprecision? 0.5 compared to 0.5? */
+ /* printf("apos: %d gapfreq: %.3f\n", apos, gapfreq); */
+ }
+ else useme[apos] = FALSE;
+ }
+
+ *ret_useme = useme;
+ return eslOK;
+
+ ERROR:
+ if(useme != NULL) free(useme);
+ ESL_FAIL(status, errbuf, "Error, out of memory while masking based on gaps.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* get_pp_idx
+ *
+ * Given a #=GR PP or #=GC PP_cons character, return the appropriate index
+ * in a pp_ct[] vector.
+ * '0' return 0;
+ * '1' return 1;
+ * '2' return 2;
+ * '3' return 3;
+ * '4' return 4;
+ * '5' return 5;
+ * '6' return 6;
+ * '7' return 7;
+ * '8' return 8;
+ * '9' return 9;
+ * '*' return 10;
+ * gap return 11;
+ *
+ * Anything else (including missing or nonresidue) return -1;
+ *
+ * This mapping of PP chars to return values should probably be
+ * stored in some internal map structure somewhere, instead of
+ * only existing in this function as used by esl_msafile2_ReadInfoPfam().
+ */
+static int get_pp_idx(ESL_ALPHABET *abc, char ppchar)
+{
+ if(esl_abc_CIsGap(abc, ppchar)) return 11;
+ if(ppchar == '*') return 10;
+ if(ppchar == '9') return 9;
+ if(ppchar == '8') return 8;
+ if(ppchar == '7') return 7;
+ if(ppchar == '6') return 6;
+ if(ppchar == '5') return 5;
+ if(ppchar == '4') return 4;
+ if(ppchar == '3') return 3;
+ if(ppchar == '2') return 2;
+ if(ppchar == '1') return 1;
+ if(ppchar == '0') return 0;
+ return -1;
+}
+
+/* count_postprobs_in_msa()
+ *
+ * Given an msa, fill nppA[apos] with the number of each possible
+ * posterior probability value in position apos, for all positions
+ * apos=0..msa->alen-1. Return nppA as <ret_nppA>.
+ * <countme>[0..apos..msa->alen-1] = TRUE if we should
+ * count for position apos, FALSE if we shouldn't (leave npp[apos][] =
+ * 0). (countme allows us to not waste time counting pps in columns
+ * that we will automatically remove, for example those that are
+ * gaps in the RF annotation).
+ *
+ * Possible PP values are: '0','1','2','3','4','5','6','7','8','9',
+ * '*','.','-','_'. Final 3 are gaps, and are treated identically.
+ *
+ * If we encounter an error, we return non-eslOK status and and fill
+ * errbuf with error message.
+ *
+ * Returns eslOK upon success, and points <ret_useme> at useme, caller
+ * must free it.
+ */
+static int count_postprobs_in_msa(ESL_MSA *msa, ESL_ALPHABET *abc, int *countme, char *errbuf, double ***ret_pp_ct)
+{
+ int status;
+ double **pp_ct = NULL;
+ int apos, i;
+ int nppvals = 12; /* '0-9', '*' and gap */
+ int ppidx;
+
+ /* contract check, msa should be in text mode */
+ if(msa->flags & eslMSA_DIGITAL) ESL_FAIL(eslEINVAL, errbuf, "count_postprobs_in_msa() contract violation, MSA is digitized");
+ if(msa->pp == NULL) ESL_FAIL(eslEINVAL, errbuf, "count_postprobs_in_msa() contract violation, msa->pp is NULL");
+
+ ESL_ALLOC(pp_ct, sizeof(double *) * msa->alen);
+ for(apos = 0; apos < msa->alen; apos++) {
+ ESL_ALLOC(pp_ct[apos], sizeof(double) * nppvals);
+ esl_vec_DSet(pp_ct[apos], nppvals, 0.);
+ }
+
+ for(apos = 0; apos < (int) msa->alen; apos++) {
+ if(countme[apos]) {
+ for(i = 0; i < msa->nseq; i++) {
+ if(msa->pp[i] == NULL) {
+ ESL_FAIL(eslEINVAL, errbuf, "some but not all sequences have PP annotation in msa, seq %d does not.\n", (i+1));
+ }
+ ppidx = get_pp_idx(abc, msa->pp[i][apos]);
+ if(ppidx == 11) { /* special, gap idx */
+ /* make sure the corresponding residue is also a gap */
+ if(! esl_abc_CIsGap(abc, msa->aseq[i][apos])) ESL_FAIL(eslEINVAL, errbuf, "post prob annotation for seq: %d aln column: %d is a gap (%c), but seq res is not: (%c)", i, apos, msa->pp[i][apos], msa->aseq[i][apos]);
+ }
+ pp_ct[apos][ppidx] += 1.;
+ }
+ }
+ }
+ *ret_pp_ct = pp_ct;
+ return eslOK;
+
+ ERROR:
+ if(pp_ct != NULL) {
+ for(apos = 0; apos < msa->alen; apos++) {
+ if(pp_ct[apos] != NULL) free(pp_ct[apos]);
+ }
+ free(pp_ct);
+ }
+ ESL_FAIL(status, errbuf, "Error, out of memory while counting post probs in the msa.");
+ return status; /* NEVERREACHED */
+}
+
+/* mask_based_on_postprobs()
+ *
+ * Determine which columns to include/exclude based on frequency of
+ * post probs. Post prob counts per-position are provided in <pp_ct>.
+ *
+ * If (do_pavg == FALSE && do_ppcons == FALSE):
+ * If more than <pfract> fraction of the non-gap residues in posn apos
+ * are annotated with a post prob equal to or better than <pthresh>,
+ * we set useme[apos] to TRUE (we'll keep apos), else we set useme[apos]
+ * to FALSE (we won't keep apos).
+ *
+ * If (do_pavg == TRUE):
+ * If average post prob in posn apos is equal to or better than <pavg_min>
+ * we set useme[apos] to TRUE, else we set useme[apos] to FALSE.
+ *
+ * If (do_ppcons == TRUE):
+ * If PP_cons post prob (from ppcons) in posn apos is equal to or better than
+ * <ppcons_min> we set useme[apos] to TRUE, else we set useme[apos] to FALSE.
+ *
+ * Note: either do_avg OR do_ppcons OR neither must be TRUE. Enforced by contract.
+ *
+ * <i_am_eligible>[0..alen-1] defines which columns are eligible for being
+ * used, if <i_am_eligible[apos]> useme[apos] is set as FALSE, regardless of pp
+ * frequency.
+ *
+ * Finally, unless <allgapok==TRUE> remove any column that contains all gaps,
+ * i.e. that contains 0 aligned residues.
+ *
+ * If we encounter an error, we return non-eslOK status and
+ * and fill errbuf with error message.
+ *
+ * Returns eslOK upon success, and points <ret_useme> at useme,
+ * caller must free it.
+ */
+static int mask_based_on_postprobs(double **pp_ct, int64_t alen, int nseq, float pthresh, float pfract, int do_pavg, float pavg_min, int do_ppcons, float ppcons_min, char *pp_cons, ESL_ALPHABET *abc, int *i_am_eligible, int allgapok, char *errbuf, int **ret_useme)
+{
+ int status;
+ int *useme = NULL;
+ int apos;
+ float ppfreq;
+ double nnongap;
+ int nppvals = 12; /* '0-9', '*' and gap */
+ int ppidx_thresh;
+ int ppidx = 0;
+ double ppcount = 0.;
+ double ppsum = 0.;
+ double pavg;
+ double ppminA[11];
+ double ppavgA[11];
+
+ ppminA[0] = 0.00;
+ ppminA[1] = 0.05;
+ ppminA[2] = 0.15;
+ ppminA[3] = 0.25;
+ ppminA[4] = 0.35;
+ ppminA[5] = 0.45;
+ ppminA[6] = 0.55;
+ ppminA[7] = 0.65;
+ ppminA[8] = 0.75;
+ ppminA[9] = 0.85;
+ ppminA[10] = 0.95;
+
+ ppavgA[0] = 0.025;
+ ppavgA[1] = 0.10;
+ ppavgA[2] = 0.20;
+ ppavgA[3] = 0.30;
+ ppavgA[4] = 0.40;
+ ppavgA[5] = 0.50;
+ ppavgA[6] = 0.60;
+ ppavgA[7] = 0.70;
+ ppavgA[8] = 0.80;
+ ppavgA[9] = 0.90;
+ ppavgA[10] = 0.975;
+
+ /* contract check */
+ if(i_am_eligible == NULL) ESL_FAIL(eslEINVAL, errbuf, "mask_based_on_postprobs() contract violation, i_am_eligible is NULL");
+ if(do_pavg == TRUE && do_ppcons == TRUE) ESL_FAIL(eslEINVAL, errbuf, "mask_based_on_postprobs() contract violation, do_pavg and do_ppcons are both TRUE");
+ if(do_ppcons == TRUE && pp_cons == NULL) ESL_FAIL(eslEINVAL, errbuf, "mask_based_on_postprobs() contract violation, do_ppcons is TRUE, but ppcons string is NULL");
+
+ /* allocate */
+ ESL_ALLOC(useme, sizeof(int) * alen);
+
+ if((! do_pavg) && (! do_ppcons)) {
+ /* determine which pp_ct idx is the minimum we'll accept */
+ ppidx = 0;
+ while(ppidx < 10) {
+ if((esl_FCompare(pthresh, ppminA[ppidx], eslSMALLX1) == eslOK) || pthresh < ppminA[ppidx]) break;
+ ppidx++;
+ }
+ ppidx_thresh = ppidx;
+ }
+
+ for(apos = 0; apos < alen; apos++) {
+ ppcount = 0.;
+ ppsum = 0.;
+ if(i_am_eligible[apos]) { /* consider this position */
+ nnongap = esl_vec_DSum(pp_ct[apos], nppvals) - pp_ct[apos][11];
+ if(esl_FCompare(nnongap, 0., eslSMALLX1) == eslOK) { /* effectively 0.0 */
+ useme[apos] = allgapok ? TRUE : FALSE;
+ }
+ else {
+ if(do_pavg) {
+ for(ppidx = 0; ppidx < 11; ppidx++) {
+ ppsum += pp_ct[apos][ppidx] * ppavgA[ppidx]; /* Note: PP value is considered average of range, not minimum ('9' == 0.90 (0.95-0.85/2) */
+ /* printf("apos: %d pp_idx: %d ct: %d sum: %.3f\n", apos, ppidx, pp_ct[apos][ppidx], ppsum);*/
+ }
+ pavg = ppsum / nnongap;
+ useme[apos] = pavg < pavg_min? FALSE : TRUE; /* should I be worried about imprecision? 0.5 compared to 0.5? */
+ /* printf("pavg: %.3f nnongap: %d useme[apos:%d]: %d pavg_min: %.3f\n", pavg, nnongap, apos, useme[apos], pavg_min);*/
+ }
+ else if(do_ppcons) {
+ ppidx = get_pp_idx(abc, pp_cons[apos]);
+ if(ppidx == -1) ESL_FAIL(eslEFORMAT, errbuf, "bad #=GC PP_cons char: %c at position %d", pp_cons[apos], apos+1);
+ if(ppidx != 11) {
+ useme[apos] = ((esl_FCompare(ppcons_min, ppminA[ppidx], eslSMALLX1) == eslOK) || ppminA[ppidx] > ppcons_min) ? TRUE : FALSE;
+ /* printf("ppcons[%4d]: %c ppidx: %2d useme %d ppcons_min: %.3f\n", apos, pp_cons[apos], ppidx, useme[apos], ppcons_min); */
+ }
+ else useme[apos] = FALSE; /* ppidx == 11, gap */
+ }
+ else { /* ! do_pavg and ! do_ppcons */
+ for(ppidx = 10; ppidx >= ppidx_thresh; ppidx--) {
+ ppcount += pp_ct[apos][ppidx];
+ }
+ ppfreq = ppcount / nnongap;
+ useme[apos] = (ppfreq < pfract) ? FALSE : TRUE; /* should I be worried about imprecision? 0.5 compared to 0.5? */
+ /* printf("apos: %4d nnongap: %6d ppfreq: %.3f pfract %.3f useme: %d ppidx_thresh: %d\n", apos, nnongap, ppfreq, pfract, useme[apos], ppidx_thresh); */
+ }
+ }
+ } /* end of if(i_am_eligible[apos]) */
+ else useme[apos] = FALSE;
+ }
+
+ *ret_useme = useme;
+ return eslOK;
+
+ ERROR:
+ if(useme != NULL) free(useme);
+ ESL_FAIL(status, errbuf, "Error, out of memory while masking based on postprobs.");
+ return status; /* NEVERREACHED */
+}
+
+/* output_mask
+ *
+ * Given a useme[0..apos..alen-1] array where useme[apos] = TRUE if we
+ * should keep apos TRUE, and FALSE if not, output a mask of '1's and
+ * '0's to the file <filename>. The mask is a string of exactly <alen>
+ * length with a '1' for each apos to keep, and a '0' for each apos we
+ * won't keep.
+ *
+ * If <i_am_eligible> is non-NULL, only output '1's or '0's for positions
+ * for which <i_am_eligible>[apos] is TRUE. This allows us to output
+ * masks that are only the length of the non-gap RF annotation in the file.
+ *
+ * If we encounter an error, we return non-eslOK status and and fill
+ * errbuf with error message.
+ *
+ * Returns eslOK upon success.
+ */
+static int
+output_mask(char *filename, int *useme, int *i_am_eligible, int64_t alen, char *errbuf)
+{
+ int status;
+ FILE *ofp;
+ int apos;
+ char *mask = NULL;
+ int64_t mlen;
+ int mpos;
+
+ if(useme == NULL) ESL_FAIL(eslEINVAL, errbuf, "Error, trying to output a mask but useme is NULL.");
+
+ /* determine length of mask */
+ if(i_am_eligible == NULL) mlen = alen;
+ else mlen = esl_vec_ISum(i_am_eligible, (int) alen); /* relies on TRUE being equal to 1 */
+
+ ESL_ALLOC(mask, sizeof(char) * (mlen+1));
+
+ mpos = 0;
+ for (apos = 0; apos < alen; apos++) {
+ if(i_am_eligible == NULL) {
+ mask[mpos++] = useme[apos] ? '1' : '0';
+ }
+ else if(i_am_eligible[apos]) {
+ mask[mpos++] = useme[apos] ? '1' : '0';
+ }
+ }
+ mask[mlen] = '\0';
+
+ if ((ofp = fopen(filename, "w")) == NULL) ESL_FAIL(eslFAIL, errbuf, "Failed to open output file %s\n", filename);
+ fprintf(ofp, "%s\n", mask);
+
+ free(mask);
+ fclose(ofp);
+ return eslOK;
+
+ ERROR:
+ ESL_FAIL(status, errbuf, "Memory allocation error while outputting mask.");
+ return status; /* NEVERREACHED */
+}
+
+/* determine_nkept_rf()
+ *
+ * Determine number of alignment positions to be kept (useme[apos]==TRUE)
+ * are non-gap RF positions using useme[] and i_am_rf[], both of length
+ * <alen>. Return that number.
+ */
+static int
+determine_nkept_rf(int *useme, int *i_am_rf, int64_t len)
+{
+ int nkept_rf = 0;
+ int apos;
+ for(apos = 0; apos < len; apos++) {
+ if(useme[apos] && i_am_rf[apos]) nkept_rf++;
+ }
+ return nkept_rf;
+}
+
+static int
+parse_coord_string(const char *cstring, uint32_t *ret_start, uint32_t *ret_end)
+{
+ ESL_REGEXP *re = esl_regexp_Create();
+ char tok1[32];
+ char tok2[32];
+ uint32_t start, end;
+
+ if (esl_regexp_Match(re, "^(\\d+)\\D+(\\d*)$", cstring) != eslOK) esl_fatal("with -t, 2nd cmdline arg must be coords <from>..<to>; %s not recognized", cstring);
+ if (esl_regexp_SubmatchCopy(re, 1, tok1, 32) != eslOK) esl_fatal("Failed to find <from> coord in %s", cstring);
+ if (esl_regexp_SubmatchCopy(re, 2, tok2, 32) != eslOK) esl_fatal("Failed to find <to> coord in %s", cstring);
+
+ /* Check for invalid values for start and end. Note that regexp matching enforced that tok1 and tok2 are both >= 0 */
+ start = atol(tok1);
+ if(start == 0) esl_fatal("with -t, coordinates must be positive integers <from>..<to>, <from> coordinate read as '0'");
+ if(tok2[0] == '\0') { /* special case: user provided something like "100:", keep positions 100 until end of alignment */
+ end = 0;
+ }
+ else {
+ end = atol(tok2);
+ if(end <= 0) esl_fatal("with -t, coordinates must be positive integers <from>..<to>, <to> coordinate read as '0'");
+ if(start > end) esl_fatal("with -t, 2nd cmdline arg <coords> must equal <from>..<to>, with <from> <= <to>");
+ }
+
+ *ret_start = start;
+ *ret_end = end;
+
+ esl_regexp_Destroy(re);
+ return eslOK;
+}
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/miniapps/esl-alimask.itest.pl b/miniapps/esl-alimask.itest.pl
new file mode 100755
index 0000000..deee0fb
--- /dev/null
+++ b/miniapps/esl-alimask.itest.pl
@@ -0,0 +1,322 @@
+#! /usr/bin/perl
+
+# Integrated test of esl-alimask miniapp.
+#
+# Usage: ./esl-alimask.itest.pl <esl-alimask binary> <tmpfile prefix>
+# Example: ./esl-alimask.itest.pl ./esl-alimask foo
+#
+# EPN, Wed Nov 25 11:23:55 2009
+
+$eslalimask = shift;
+$tmppfx = shift;
+
+if (! -x "$eslalimask") { die "FAIL: didn't find esl-alimask binary $eslalimask"; }
+
+open(ALIFILE, ">$tmppfx.stk") || die "FAIL: couldn't open $tmppfx.stk for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+
+seq1 aaAAAA..AAAA...Cc.cCCCCCC.C..GGGGGgggg
+#=GR seq1 PP 5789**..**88...*9.9****88.7..776543210
+seq2 ..AAAAa.AAAAaacCcccCCCCCCcCccGGGGG....
+#=GR seq2 PP ..********************************....
+seq3 ..AAAA..AAAA...C...CCCCCC.C..GGGG-....
+#=GR seq3 PP ..5555..4*44...3...888888.8..8899.....
+#=GC SS_cons ...............<...<<<<......>>>>>....
+#=GC PP_cons ..789*..8877...8...****99.8..99998....
+#=GC RF ..AAAA..AAAA...C...CCCCCC.c..GGGGG....
+//
+EOF
+close ALIFILE;
+
+open(NORFALIFILE, ">$tmppfx.norf.stk") || die "FAIL: couldn't open $tmppfx.stk for writing no RF alifile";
+print NORFALIFILE << "EOF";
+# STOCKHOLM 1.0
+
+seq1 aaAAAA..AAAA...Cc.cCCCCCC.C..GGGGGgggg
+#=GR seq1 PP 5789**..**88...*9.9****88.7..776543210
+seq2 ..AAAAa.AAAAaacCcccCCCCCCcCccGGGGG....
+#=GR seq2 PP ..********************************....
+seq3 ..AAAA..AAAA...C...CCCCCC.C..GGGG-....
+#=GR seq3 PP ..5555..4*44...3...888888.8..8899.....
+//
+EOF
+close NORFALIFILE;
+
+open(FULLMASKFILE, ">$tmppfx.fullmask") || die "FAIL: couldn't open $tmppfx.2 for writing full maskfile";
+print FULLMASKFILE << "EOF";
+#this is a full aln length mask file
+1010111011
+1110101101
+#in the middle
+1101101111
+01101010
+EOF
+close FULLMASKFILE;
+
+open(RFMASKFILE, ">$tmppfx.rfmask") || die "FAIL: couldn't open $tmppfx.rfmask for writing RF maskfile";
+print RFMASKFILE << "EOF";
+#this is an RF length mask file
+001110101110110111101
+EOF
+close RFMASKFILE;
+
+# Note: Not nearly all possible option combinations are tried, but each option is tested
+# in at least one context, usually what I think to be the most common context.
+#
+# We do 4 runs of all tests, each pairwise combination of with and without RF annotation
+# in alifile and with and without --small.
+
+$afileA[0] = "$tmppfx.stk";
+$afileA[1] = "$tmppfx.stk";
+$afileA[2] = "$tmppfx.norf.stk";
+$afileA[3] = "$tmppfx.norf.stk";
+
+$smallA[0] = "";
+$smallA[1] = "--small";
+$smallA[2] = "";
+$smallA[3] = "--small";
+
+$have_rfA[0] = 1;
+$have_rfA[1] = 1;
+$have_rfA[2] = 0;
+$have_rfA[3] = 0;
+
+$output = `$eslalimask -h`;
+if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly"; }
+if ($output !~ /Usage: esl-alimask/) { die "FAIL: help output not right"; }
+
+for($pass = 0; $pass < 4; $pass++) {
+ $pass2write = $pass+1;
+
+ $output = `$eslalimask $smallA[$pass] --rna $afileA[$pass] $tmppfx.fullmask 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /aAAA\.AAAA\.\.c\.CCCCCC\.\.GGGgg/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\.555\.4\*44\.\.\.\.888888\.\.899\.\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($have_rfA[$pass]) {
+ if ($output !~ /:::::::::::::<<_______>>::/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ if($have_rfA[$pass]) {
+ $output = `$eslalimask $smallA[$pass] --dna $afileA[$pass] $tmppfx.rfmask 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /AAAACCCCCCGGGG/) { die "FAIL: alignment masked incorrectly"; }
+ if ($output !~ /5544388888889\./) { die "FAIL: alignment masked incorrectly"; }
+ if ($output !~ /::::<\-<<__>\->>/) { die "FAIL: alignment masked incorrectly"; }
+ }
+ system("$eslalimask $smallA[$pass] --amino -o $tmppfx.out $afileA[$pass] $tmppfx.fullmask > /dev/null");
+ $output = `cat $tmppfx.out`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /aAAA\.AAAA\.\.c\.CCCCCC\.\.GGGgg/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\.555\.4\*44\.\.\.\.888888\.\.899\.\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($have_rfA[$pass]) {
+ if ($output !~ /.............<<<.....>>>../) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ system("$eslalimask $smallA[$pass] --rna -q -o $tmppfx.out $afileA[$pass] $tmppfx.fullmask > /dev/null");
+ $output = `cat $tmppfx.out`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /aAAA\.AAAA\.\.c\.CCCCCC\.\.GGGgg/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\.555\.4\*44\.\.\.\.888888\.\.899\.\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($have_rfA[$pass]) {
+ if ($output !~ /:::::::::::::<<_______>>::/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] --amino --informat pfam $afileA[$pass] $tmppfx.fullmask 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /aAAA\.AAAA\.\.c\.CCCCCC\.\.GGGgg/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\.555\.4\*44\.\.\.\.888888\.\.899\.\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($have_rfA[$pass]) {
+ if ($output !~ /.............<<<.....>>>../) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] --rna --outformat pfam $afileA[$pass] $tmppfx.fullmask 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /aAAA\.AAAA\.\.c\.CCCCCC\.\.GGGgg/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\.555\.4\*44\.\.\.\.888888\.\.899\.\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($have_rfA[$pass]) {
+ if ($output !~ /:::::::::::::<<_______>>::/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ if($smallA[$pass] eq "") {
+ $output = `$eslalimask $smallA[$pass] --rna --outformat a2m $afileA[$pass] $tmppfx.fullmask 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if($have_rfA[$pass]) {
+ if ($output !~ /aAAAAAAAcCCCCCCGGGgg/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /AAAAAAAACCCCCCCGGGGG/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] --rna --outformat psiblast $afileA[$pass] $tmppfx.fullmask 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if($have_rfA[$pass]) {
+ if ($output !~ /aAAA\-AAAA\-\-c\-CCCCCC\-\-GGGgg/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /AAAA\-AAAA\-\-C\-CCCCCC\-\-GGGGG/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] --rna --outformat afa $afileA[$pass] $tmppfx.fullmask 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /aAAA\.AAAA\.\.c\.CCCCCC\.\.GGGgg/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] --rna -t $afileA[$pass] 12-23 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /A\.\.\.Cc\.cCCCC/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /4\.\.\.3\.\.\.8888/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($have_rfA[$pass]) {
+ if ($output !~ /\s+::::::::::::\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ if ($have_rfA[$pass]) {
+ $output = `$eslalimask $smallA[$pass] --rna -t --t-rf $afileA[$pass] 18: 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /GGGGgggg/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /76543210/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+::::::::\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ if ($have_rfA[$pass]) {
+ $output = `$eslalimask $smallA[$pass] --rna -t --t-rmins --t-rf $afileA[$pass] 18: 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /GGGG/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /7654/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+::::\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ if ($have_rfA[$pass]) {
+ $output = `$eslalimask $smallA[$pass] --rna -t --t-rmins --t-rf $afileA[$pass] 18: 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /GGGG/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /7654/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+::::\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] --rna -g $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($have_rfA[$pass]) {
+ if ($output !~ /AAAAAAAACCCCCCCCGGGGG/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /55554\*44388888888899\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /::::::::<<<<<___>>>>>/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /AAAAAAAAC\.\.CCCCCCCGGGG\-/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /55554\*443\.\.88888888899\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ if ($have_rfA[$pass]) {
+ $output = `$eslalimask $smallA[$pass] --rna -g --keepins $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /AAAAAAAACccCCCCCCCGGGGG/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /55554\*443..88888888899*/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /::::::::<\-\-<<<<___>>>>>/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ if ($have_rfA[$pass]) {
+ $output = `$eslalimask $smallA[$pass] --rna -g --keepins --gapthresh 0.3 $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /AAAAAAAACCCCCCCCGGGG/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /55554\*44388888888899/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /:::::::::<<<<___>>>>/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ if ($have_rfA[$pass]) {
+ $output = `$eslalimask $smallA[$pass] --rna -g --keepins --gapthresh 0.7 $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /\.\.AAAAaAAAAaacCcccCCCCCCcCccGGGGG\.\.\.\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\.\.5555.4\*44\.\.\.3\.\.\.888888\.8\.\.8899\.\.\.\.\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /::::::::::::::<\-\-\-<<<<______>>>>>::::/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ if ($have_rfA[$pass]) {
+ $output = `$eslalimask $smallA[$pass] --rna -g --keepins --gapthresh 0.7 $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /\.\.AAAAaAAAAaacCcccCCCCCCcCccGGGGG\.\.\.\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\.\.5555.4\*44\.\.\.3\.\.\.888888\.8\.\.8899\.\.\.\.\./) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /::::::::::::::<\-\-\-<<<<______>>>>>::::/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] --gmask-all $tmppfx.gmaskall --rna -g --gapthresh 0.7 $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ $output = `cat $tmppfx.gmaskall`;
+ if ($have_rfA[$pass]) {
+ if ($output !~ /00111100111100010001111110100111110000/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ $output = `$eslalimask $smallA[$pass] --gmask-rf $tmppfx.gmaskrf --rna -g --gapthresh 0.7 $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ $output = `cat $tmppfx.gmaskrf`;
+ if ($output !~ /111111111111111111111/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /11111110111111111111111111111111111111/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] -p --rna $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($have_rfA[$pass]) {
+ if ($output !~ /\s+A\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+8\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+\:\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /\s+a\.Aaaccccc\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+\*\*\*\*\*\*\*\*\*\*\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] --pavg 0.73 -p --rna $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($have_rfA[$pass]) {
+ if ($output !~ /\s+AAAAAACCCCCCCCGGGG\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+55554\*388888888899\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+:::::::<<<<___>>>>\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /\s+AAAAa\.AAaacCcccCCCCCCcCccGGGG\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+5555\.\.4\*\.\.\.3\.\.\.888888\.8\.\.8899\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ if ($have_rfA[$pass]) {
+ $output = `$eslalimask $smallA[$pass] --ppcons 0.85 -p --rna $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($output !~ /\s+AACCCCCCGGGG\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+9\*\*\*\*\*999999\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] --pthresh 0.85 --pfract 0.5 --rna -p $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ if ($have_rfA[$pass]) {
+ if ($output !~ /\s+AAAAACCCCCGG\-\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+5554\*3888899\.\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /\s+AAA\.\.AA\.\.\.Cc\.cCCCC\.\.\.GGG\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ if ($output !~ /\s+555\.\.4\*\.\.\.3\.\.\.8888\.\.\.99\.\s+/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalimask $smallA[$pass] --pmask-all $tmppfx.pmaskall --rna -p --pthresh 0.75 --pfract 0.7 $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ $output = `cat $tmppfx.pmaskall`;
+ if ($have_rfA[$pass]) {
+ if ($output !~ /00000000010000000001111110000000000000/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ $output = `$eslalimask $smallA[$pass] --pmask-rf $tmppfx.pmaskrf --rna -p --pthresh 0.75 --pfract 0.7 $afileA[$pass] 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alimask failed unexpectedly on pass $pass2write"; }
+ $output = `cat $tmppfx.pmaskrf`;
+ if ($output !~ /000001000111111000000/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /00000011010011101111111111011000000000/) { die "FAIL: alignment masked incorrectly on pass $pass2write"; }
+ }
+}
+
+print "ok\n";
+unlink "$tmppfx.stk";
+unlink "$tmppfx.norf.stk";
+unlink "$tmppfx.fullmask";
+unlink "$tmppfx.rfmask";
+unlink "$tmppfx.gmaskrf";
+unlink "$tmppfx.gmaskall";
+unlink "$tmppfx.pmaskrf";
+unlink "$tmppfx.pmaskall";
+unlink "$tmppfx.out";
+exit 0;
diff --git a/miniapps/esl-alimask.man b/miniapps/esl-alimask.man
new file mode 100644
index 0000000..6db488f
--- /dev/null
+++ b/miniapps/esl-alimask.man
@@ -0,0 +1,580 @@
+.TH "esl-alimask" 1 "@EASEL_DATE@" "Easel @PACKAGE_VERSION@" "Easel miniapps"
+
+.SH NAME
+.TP
+esl-alimask - remove columns from a multiple sequence alignment
+
+.SH SYNOPSIS
+
+.TP
+Remove columns based on a mask in an input file:
+.B esl-alimask
+.I [options]
+.I msafile
+.I maskfile
+
+.TP
+Remove a contiguous set of columns at the start and end of an alignment:
+.B esl-alimask -t
+.I [options]
+.I msafile
+.I coords
+
+.TP
+Remove columns based on their frequency of gaps:
+.B esl-alimask -g
+.I [options]
+.I msafile
+
+.TP
+Remove columns based on their posterior probability annotation:
+.B esl-alimask -p
+.I [options]
+.I msafile
+
+.TP
+Only remove columns that are gaps in the RF annotation:
+.B esl-alimask --rf-is-mask
+.I [options]
+.I msafile
+
+.TP
+The
+.B -g
+and
+.B -p
+options may be used in combination.
+
+.SH DESCRIPTION
+
+.B esl-alimask
+reads a single input alignment, removes some columns from it
+(i.e. masks it), and outputs the masked alignment.
+
+.B esl-alimask
+can be run in several different modes.
+
+.B esl-alimask
+runs in "mask file mode" by default when two
+command-line arguments
+.I (msafile
+and
+.I maskfile)
+are supplied. In this mode, a bit-vector mask in the
+.I maskfile
+defines which columns to keep/remove. The mask is a string that may
+only contain the characters '0' and '1'. A '0' at position x of the
+mask indicates that column x is excluded by the mask and should be
+removed during masking. A '1' at position x of the mask indicates
+that column x is included by the mask and should not be removed during
+masking. All lines in the
+.I maskfile
+that begin with '#' are considered comment lines and are ignored. All
+non-whitespace characters in non-comment lines are considered to be
+part of the mask. The length of the mask must equal either the total
+number of columns in the (first) alignment in
+.I msafile,
+or the number of columns that are not gaps in the RF annotation of that
+alignment. The latter case is only valid if
+.I msafile
+is in Stockholm format and contains '#=GC RF' annotation.
+If the mask length is equal to the non-gap RF length, all gap
+RF columns will automatically be removed.
+
+.B esl-alimask
+runs in "truncation mode" if the
+.B -t
+option is used along with two command line arguments
+.I (msafile
+and
+.I coords
+). In this mode,
+the alignment will be truncated by removing a contiguous set of
+columns from the beginning and end of the alignment. The second
+command line argument is the
+.I coords
+string, that specifies what range of columns to keep in the
+alignment, all columns outside of this range will be removed.
+The
+.I coords
+string consists of start and end coordinates separated
+by any nonnumeric, nonwhitespace character or characters you like; for
+example,
+.I 23..100
+,
+.I 23/100
+, or
+.I 23-100
+all work. To keep all alignment columns beginning at 23 until the
+end of the alignment, you
+can omit the
+.I end
+; for example,
+.I 23:
+would work.
+If the
+.B --t-rf
+option is used in combination with
+.B -t,
+the coordinates in
+.I coords
+are interpreted as non-gap RF column coordinates. For example,
+with
+.B --t-rf,
+a
+.I coords
+string of
+.I 23-100
+would remove all columns before the 23rd non-gap residue in
+the "#=GC RF" annotation and after the 100th non-gap RF residue.
+
+.B esl-alimask
+runs in "RF mask" mode if the
+.B --rf-is-mask
+option is enabled. In this mode, the alignment must be in Stockholm
+format and contain '#=GC RF' annotation.
+.B esl-alimask
+will simply remove all columns that are gaps in the RF annotation.
+
+.B esl-alimask
+runs in "gap frequency mode" if
+.B -g
+is enabled. In this mode columns for which greater than
+.I <f>
+fraction of the aligned sequences have gap residues will be removed.
+By default,
+.I <f>
+is 0.5, but this value can be changed to
+.I <f>
+with the
+.BI --gapthresh " <f>"
+option. In this mode, if the alignment is in Stockholm format and
+has RF annotation, then all columns that are gaps in the RF annotation
+will automatically be removed, unless
+.B --saveins
+is enabled.
+
+.B esl-alimask
+runs in "posterior probability mode" if
+.B -p
+is enabled. In this mode, masking is based on posterior probability annotation,
+and the input alignment must be in Stockholm format and contain '#=GR
+PP' (posterior probability) annotation for all sequences. As a special
+case, if
+.B -p
+is used in combination with
+.B --ppcons,
+then the input alignment need not have '#=GR PP' annotation, but must
+contain '#=GC PP_cons' (posterior probability consensus) annotation.
+
+Characters in Stockholm alignment posterior probability annotation
+(both '#=GR PP' and '#=GC PP_cons') can have 12 possible values: the
+ten digits '0-9', '*', and '.'. If '.', the position must correspond to
+a gap in the sequence (for '#=GR PP') or in the RF annotation (for '#=GC
+PP_cons'). A value of '0' indicates a posterior probability of
+between 0.0 and 0.05, '1' indicates between 0.05 and 0.15, '2'
+indicates between 0.15 and 0.25 and so on up to '9' which indicates
+between 0.85 and 0.95. A value of '*' indicates a posterior
+probability of between 0.95 and 1.0. Higher posterior probabilities
+correspond to greater confidence that the aligned residue belongs
+where it appears in the alignment.
+
+When
+.B -p
+is enabled with
+.BI --ppcons " <x>",
+columns which have a consensus posterior probability of less than
+.I <x>
+will be removed during masking, and all other columns will not be removed.
+
+When
+.B -p
+is enabled without
+.B --ppcons,
+the number of each possible PP value in each column is counted.
+If
+.I <x>
+fraction of the sequences that contain aligned residues (i.e. do not
+contain gaps) in a column have a posterior probability
+greater than or equal to
+.I <y>,
+then that column will not be removed during masking. All columns that
+do not meet this criterion will be removed. By default, the values of both
+.I <x>
+and
+.I <y>
+are 0.95, but they can be changed with the
+.BI --pfract " <x>"
+and
+.BI --pthresh " <y>"
+options, respectively.
+
+In posterior probability mode, all columns that have 0 residues
+(i.e. that are 100% gaps) will be automatically removed, unless the
+.B --pallgapok
+option is enabled, in which case such columns will not be removed.
+
+Importantly, during posterior probability masking, unless
+.B --pavg
+is used, PP annotation
+values are always considered to be the minimum numerical value in
+their corresponding range. For example, a PP '9' character is converted
+to a numerical posterior probability of 0.85. If
+.B --pavg
+is used, PP annotation values are considered to be the average
+numerical value in their range. For example, a PP '9' character is
+converted to a numerical posterior probability of 0.90.
+
+In posterior probability mode, if the alignment is in Stockholm format and
+has RF annotation, then all columns that are gaps in the RF annotation
+will automatically be removed, unless
+.B --saveins
+is enabled.
+
+A single run of
+.B esl-alimask
+can perform both gap frequency-based masking and posterior
+probability-based masking if both the
+.B -g
+and
+.B -p
+options are enabled. In this case, a gap frequency-based mask and a
+posterior probability-based mask are independently computed. These
+two masks are combined to create the final mask using a logical 'and'
+operation. Any column that is to be removed by either the gap or PP
+mask will be removed by the final mask.
+
+With the
+.B --small
+option,
+.B esl-alimask
+will operate in memory saving mode and the required RAM for the masking
+will be minimal (usually less than a Mb) and independent of the
+alignment size. To use
+.B --small,
+the alignment alphabet must be specified with either
+.B --amino,
+.B --dna,
+or
+.B --rna,
+and the alignment must be in Pfam format (non-interleaved, 1
+line/sequence Stockholm format). Pfam format is the default output
+format of INFERNAL's
+.B cmalign
+program. Without
+.B --small
+the required RAM will be equal to roughly the size of the first input
+alignment (the size of the alignment file itself if it only contains
+one alignment).
+
+.SH OUTPUT
+
+By default,
+.B esl-alimask
+will print only the masked alignment to stdout and then exit.
+If the
+.BI -o " <f>"
+option is used, the alignment will be saved to file
+.I <f>
+, and information on the number of columns kept and removed will be
+printed to stdout. If
+.B -q
+is used in combination with
+.B -o,
+nothing is printed to stdout.
+
+The mask(s) computed by
+.B esl-alimask
+when the
+.B -t
+,
+.B -p
+,
+.B -g
+,
+or
+.B --rf-is-mask
+options are used can be saved to output files using the options
+.BI --fmask-rf " <f>",
+.BI --fmask-all " <f>",
+.BI --gmask-rf " <f>",
+.BI --gmask-all " <f>",
+.BI --pmask-rf " <f>",
+and
+.BI --pmask-all " <f>".
+In all cases,
+.I <f>
+will contain a single line, a bit vector of length
+.B n,
+where
+.B n
+is the either the total number of columns in the alignment (for the
+options suffixed with 'all') or the number of non-gap columns in the
+RF annotation (for the options suffixed with 'rf'). The mask will be a
+string of '0' and '1' characters: a '0' at position x in the mask
+indicates column x was removed (excluded) by the mask, and a '1' at
+position x indicates column x was kept (included) by the mask. For
+the 'rf' suffixed options, the mask only applies to non-gap RF
+columns. The options beginning with 'f' will save the 'final' mask
+used to keep/remove columns from the alignment. The options beginning
+with 'g' save the masks based on gap frequency and require
+.B -g.
+The options beginning with 'p' save the masks based on posterior
+probabilities and require
+.B -p.
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.BI -o " <f>"
+Output the final, masked alignment to file
+.I <f>
+instead of to
+.I stdout.
+When this option is used, information about the number of columns
+kept/removed is printed to stdout.
+
+.TP
+.B -q
+Be quiet; do not print anything to stdout.
+This option can only be used in combination with the
+.B -o
+option.
+
+.TP
+.B --small
+Operate in memory saving mode. Required RAM will be independent of the
+size of the input alignment to mask, instead of roughly the size of the
+input alignment. When enabled, the alignment must be in
+Pfam Stockholm (non-interleaved 1 line/seq) format (see
+esl-reformat) and the output alignment will be in Pfam format.
+
+.TP
+.BI --informat "<s> "
+Specify that the input alignment be format
+.I <s>.
+Choices for
+.I <s>
+are: 'stockholm', 'pfam', 'a2m', 'psiblast', 'afa'. 'pfam' is a special
+case of Stockholm format in which each sequence is placed on a single
+line, instead of being interleaved; 'afa' is aligned FASTA. By default
+alignments are assumed to be in Stockholm format (either interleaved
+or Pfam), unless
+.B --small
+is enabled, in which case alignments are assumed to be in
+Pfam format.
+
+.TP
+.BI --outformat " <s>"
+Specify that the output alignment be format
+.I <s>.
+Choices for
+.I <s>
+are: 'stockholm', 'pfam', 'a2m', 'psiblast', 'afa'.
+By default the alignment is output in interleaved Stockholm format unless
+.B --small
+is enabled, in which case the alignment is output in Pfam format.
+
+.TP
+.BI --fmask-rf " <f>"
+Save the non-gap RF-length final mask used to mask the alignment
+to file
+.I <f>.
+The input alignment must be in Stockholm format and contain '#=GC RF'
+annotation for this option to be valid. See the OUTPUT section above for
+more details on output mask files.
+
+.TP
+.BI --fmask-all " <f>"
+Save the full alignment-length final mask used to mask the alignment
+to file
+.I <f>.
+See the OUTPUT section above for more details on output mask files.
+
+.TP
+.B --amino
+Specify that the input alignment is a protein alignment.
+By default,
+.B esl-alimask
+will try to autodetect the alphabet, but if the alignment is
+sufficiently small it may be ambiguous. This option defines the
+alphabet as protein. Importantly, if
+.B --small
+is enabled, the alphabet must be specified with either
+.B --amino,
+.B --dna,
+or
+.B --rna.
+
+.TP
+.B --dna
+Specify that the input alignment is a DNA alignment.
+
+.TP
+.B --rna
+Specify that the input alignment is an RNA alignment.
+
+.TP
+.B --t-rf
+With -t, specify that the start and end coordinates defined in
+the second command line argument
+.I coords
+correspond to non-gap RF coordinates. To use this option, the
+alignment must be in Stockholm format and have "#=GC RF"
+annotation. See the DESCRIPTION section for an example of using the
+.B --t-rf
+option.
+
+.TP
+.B --t-rmins
+With -t, specify that all columns that are gaps in the reference (RF)
+annotation in between the specified start and end coordinates be
+removed. By default, these columns will be kept.
+To use this option, the alignment must be in Stockholm format and
+have "#=GC RF" annotation.
+
+.TP
+.BI --gapthresh " <x>"
+With -g, specify that a column is kept (included by mask) if no more
+than
+.I <f>
+fraction of sequences in the alignment have a gap ('.', '-', or '_')
+at that position. All other columns are removed (excluded by mask).
+By default,
+.I <x>
+is 0.5.
+
+.TP
+.BI --gmask-rf " <f>"
+Save the non-gap RF-length gap frequency-based mask used to mask the alignment
+to file
+.I <f>.
+The input alignment must be in Stockholm format and contain '#=GC RF'
+annotation for this option to be valid. See the OUTPUT section above for
+more details on output mask files.
+
+.TP
+.BI --gmask-all " <f>"
+Save the full alignment-length gap frequency-based mask used to mask the alignment
+to file
+.I <f>.
+See the OUTPUT section above for more details on output mask files.
+
+
+.TP
+.BI --pfract " <x>"
+With -p, specify that a column is kept (included by mask) if the
+fraction of sequences with a non-gap residue in that column with a
+posterior probability of at least
+.I <y>
+(from
+.BI --pthresh " <y>"
+) is
+.I <x>
+or greater. All other columns are removed (excluded by mask)
+By default
+.I <x>
+is 0.95.
+
+.TP
+.BI --pthresh " <y>"
+With -p, specify that a column is kept (included by mask) if
+.I <x>
+(from
+.BI --pfract " <x>"
+)
+fraction of sequences with a non-gap residue in that column have a
+posterior probability of at least
+.I <y>.
+All other columns are removed (excluded by mask).
+By default
+.I <y>
+is 0.95. See the DESCRIPTION section for more on
+posterior probability (PP) masking.
+Due to the granularity of the PP annotation, different
+.I <y>
+values within a range covered by a single PP character will be
+have the same effect on masking. For example, using
+.BI --pthresh " 0.86"
+will have the same effect as using
+.BI --pthresh " 0.94".
+
+.TP
+.BI --pavg " <x>"
+With -p, specify that a column is kept (included by mask) if
+the average posterior probability of non-gap residues in that column
+is at least
+.I <x>.
+See the DESCRIPTION section for more on
+posterior probability (PP) masking.
+
+.TP
+.BI --ppcons " <x>"
+With -p, use the '#=GC PP_cons' annotation to define which columns to
+keep/remove. A column is kept (included by mask) if the PP_cons value
+for that column is
+.I <x>
+or greater. Otherwise it is removed.
+
+.TP
+.B --pallgapok
+With -p, do not automatically remove any columns that are 100% gaps
+(i.e. contain 0 aligned residues). By default, such columns will be
+removed.
+
+.TP
+.BI --pmask-rf " <f>"
+Save the non-gap RF-length posterior probability-based mask used to mask the alignment
+to file
+.I <f>.
+The input alignment must be in Stockholm format and contain '#=GC RF'
+annotation for this option to be valid. See the OUTPUT section above for
+more details on output mask files.
+
+.TP
+.BI --pmask-all " <f>"
+Save the full alignment-length posterior probability-based mask used to mask the alignment
+to file
+.I <f>.
+See the OUTPUT section above for more details on output mask files.
+
+
+.TP
+.B --keepins
+If
+.B -p
+and/or
+.B -g
+is enabled and the alignment is in Stockholm or Pfam format and has '#=GC RF'
+annotation, then allow columns that are gaps in the RF annotation to
+possibly be kept. By default, all gap RF columns would be removed
+automatically, but with this option enabled gap and non-gap RF columns
+are treated identically.
+To automatically remove all gap RF columns when using a
+.I maskfile
+, then define the mask in
+.I maskfile
+as having length equal to the non-gap RF length in the alignment.
+To automatically remove all gap RF columns when using
+.B -t,
+use the
+.B --t-rmins
+option.
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
+
+
+
+
+
diff --git a/miniapps/esl-alimerge.c b/miniapps/esl-alimerge.c
new file mode 100644
index 0000000..51d70cb
--- /dev/null
+++ b/miniapps/esl-alimerge.c
@@ -0,0 +1,1810 @@
+/* Merge alignments into a single alignment based on their reference (RF) annotation.
+ *
+ * Special care is taken to be consistent with missing data '~'
+ * annotation in two different contexts.
+ *
+ * First, from Infernal 1.1rc2 and later cmalign and cmsearch -A
+ * output alignments: '~' can occur in GC RF and SS_cons
+ * annotation. The '~' after a given nongap/nonmissing RF position x
+ * (and before nongap/nonmissing RF position x+1) must all occur 5' of
+ * all inserted positions (gap: '.') that occur between x and x+1.
+ *
+ * Second, from HMMER3, hmmbuild reads and writes '~' in sequences to
+ * mark the ends of fragments. Any fragment must begin and end with a
+ * contiguous string of 1 or more '~'. '~' characters are not allowed
+ * within sequences anywhere except within these leading and trailing
+ * contiguous stretches.
+ *
+ * esl-alimerge will accept as input and produce as output alignments
+ * that are consistent with both of these conventions.
+ *
+ * EPN, Fri Nov 20 16:28:59 2009
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_distance.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile2.h"
+#include "esl_sqio.h"
+#include "esl_stopwatch.h"
+#include "esl_vectorops.h"
+
+static char banner[] = "merge alignments based on their reference (RF) annotation";
+static char usage1[] = "[options] <alignment file 1> <alignment file 2>";
+static char usage2[] = "[options] --list <file listing n > 1 ali files to merge>\n\
+\n\
+ Input alignments must be in Stockholm or Pfam format.\n\
+ Ouput format choices\n\
+ --------------------\n\
+ stockholm [default]\n\
+ pfam\n\
+ a2m\n\
+ psiblast\n\
+ afa";
+
+static void read_list_file(char *listfile, char ***ret_alifile_list, int *ret_nalifile);
+static int update_maxgap_and_maxmis(ESL_MSA *msa, char *errbuf, int clen, int64_t alen, int *maxgap, int *maxmis);
+static int validate_and_copy_msa_annotation(const ESL_GETOPTS *go, int outfmt, ESL_MSA *mmsa, ESL_MSA **msaA, int clen, int nmsa, int alen_merged, int *maxgap, int *maxmis, char *errbuf);
+static int add_msa(ESL_MSA *mmsa, char *errbuf, ESL_MSA *msa_to_add, int *maxgap, int *maxmis, int clen, int alen_merged);
+static int inflate_string_with_gaps_and_missing(char *src_str, int64_t src_len, int64_t dst_len, int *ngapA, char gapchar, int *nmisA, char mischar, char **ret_dst_str);
+static int inflate_seq_with_gaps(const ESL_ALPHABET *abc, char *src_str, int64_t src_len, int64_t dst_len, int *ngapA, char gapchar, char **ret_dst_str);
+static int validate_no_nongaps_in_rf_gaps(const ESL_ALPHABET *abc, char *rf_str, char *other_str, int64_t len);
+static int determine_gap_columns_to_add(ESL_MSA *msa, int *maxgap, int *maxmis, int clen, int **ret_ngapA, int **ret_nmisA, int **ret_neitherA, char *errbuf);
+static void write_pfam_msa_top(FILE *fp, ESL_MSA *msa);
+static void write_pfam_msa_gc(FILE *fp, ESL_MSA *msa, int maxwidth);
+static int64_t maxwidth(char **s, int n);
+static int rfchar_is_nongap_nonmissing(const ESL_ALPHABET *abc, char rfchar);
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "--list", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "command-line argument is a file that lists ali files to merge", 99 },
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-o", eslARG_OUTFILE, NULL, NULL, NULL, NULL,NULL, NULL, "output the final alignment to file <f>, not stdout", 1 },
+ { "-v", eslARG_NONE, FALSE, NULL, NULL, NULL,"-o", NULL, "print info on merge to stdout; requires -o", 1 },
+ { "--small", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "use minimal RAM (RAM usage will be independent of aln sizes)", 1 },
+ { "--rfonly", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "remove all columns that are gaps in GC RF annotation", 1 },
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL,NULL, NULL, "NOT YET DISPLAYED", 99 },
+ { "--outformat",eslARG_STRING, FALSE, NULL, NULL, NULL,NULL, NULL, "specify that output aln be format <s> (see choices above)", 1 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--amino,--rna", "alignments to merge are RNA alignments", 1 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--amino,--rna", "alignments to merge are DNA alignments", 1 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--dna,--rna", "alignments to merge are protein alignments", 1 },
+ { "--stall", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "arrest after start: for debugging under gdb", 99 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+int
+main(int argc, char **argv)
+{
+ int status; /* easel return code */
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ ESL_ALPHABET *abc = NULL; /* biological alphabet */
+ char *msafile1 = NULL; /* msa file 1 (stays NULL if --list) */
+ char *msafile2 = NULL; /* msa file 2 (stays NULL if --list) */
+ char *listfile = NULL; /* list file name (stays NULL unless --list) */
+ int infmt = eslMSAFILE_UNKNOWN; /* format code for input alifiles */
+ int outfmt = eslMSAFILE_UNKNOWN; /* format code for output ali */
+ ESL_MSAFILE *afp = NULL; /* open alignment file, normal interface */
+ ESL_MSAFILE2 *afp2 = NULL; /* open alignment file, small-mem interface */
+ FILE *ofp; /* output file (default is stdout) */
+ char **alifile_list = NULL; /* list of alignment files to merge */
+ int nalifile; /* size of alifile_list */
+ int do_stall; /* used to stall when debugging */
+ int fi; /* counter over alignment files */
+ int ai, ai2; /* counters over alignments */
+ int nali_tot; /* number of alignments in all files */
+ int *nali_per_file = NULL; /* [0..nalifile-1] number of alignments per file */
+ int nseq_tot; /* number of sequences in all alignments */
+ int nseq_cur; /* number of sequences in current alignment */
+ int64_t alen_cur; /* length of current alignment */
+ int64_t *alenA = NULL; /* [0..nali_tot-1] alignment length of input msas (even after
+ * potentially removingeinserts (--rfonly)) */
+ ESL_MSA **msaA = NULL; /* [0..nali_tot-1] all msas read from all files */
+ int *maxgap = NULL; /* [0..cpos..cm->clen+1] max number of gap columns
+ * before each consensus position in all alignments */
+ int *maxmis = NULL; /* [0..cpos..cm->clen+1] max number of missing data columns
+ * before each consensus position in all alignments */
+ int nalloc = 0; /* current size of msaA */
+ int chunksize = 10; /* size to increase nalloc by when realloc'ing */
+ void *tmp; /* for ESL_RALLOC() */
+ int clen; /* consensus length (non-gap #=GC RF length) of all alignments */
+ int cur_clen; /* consensus length (non-gap #=GC RF length) of current alignments */
+ int apos; /* alignment position */
+ ESL_MSA *mmsa = NULL; /* the merged alignment created by merging all alignments in msaA */
+ int alen_mmsa; /* number of columns in merged MSA */
+ char errbuf[eslERRBUFSIZE]; /* buffer for error messages */
+ char *tmpstr; /* used if -v, for printing file names */
+ int **usemeA = NULL; /* [0..nali_tot-1][0..alen] used only if --rfonly enabled, for removing gap RF columns */
+ ESL_STOPWATCH *w = NULL; /* for timing the merge, only used if -o enabled */
+ int do_small; /* TRUE if --small, operate in special small memory mode, aln seq data is not stored */
+ int do_rfonly; /* TRUE if --rfonly, output only non-gap RF columns (remove all insert columns) */
+ int *ngapA = NULL; /* [0..alen] number of insert gap columns to add after each alignment column when merging */
+ int *nmisA = NULL; /* [0..alen] number of missing data ('~') gap columns to add after each alignment column when merging */
+ int *neitherA = NULL; /* [0..apos..alen] = ngapA[apos] + nmisA[apos] */
+
+ /* output formatting, only relevant if -v */
+ char *namedashes = NULL; /* string of dashes, an underline */
+ int ni; /* counter */
+ int namewidth; /* max width of file name */
+ int tmp_len; /* current width of merged aln */
+
+ /* variables only used in small mode (--small) */
+ int ngs_cur; /* number of GS lines in current alignment (only used if do_small) */
+ int gs_exists = FALSE; /* set to TRUE if do_small and any input aln has >= 1 GS line */
+ int maxname, maxgf, maxgc, maxgr; /* max length of seqname, GF tag, GC tag, GR tag in all input alignments */
+ int maxname_cur, maxgf_cur, maxgc_cur, maxgr_cur; /* max length of seqname, GF tag, GC tag, GR tag in current input alignment */
+ int margin; /* total margin length for output msa */
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage1);
+ esl_usage(stdout, argv[0], usage2);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage1);
+ esl_usage (stdout, argv[0], usage2);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ exit(0);
+ }
+
+ if(((! esl_opt_GetBoolean(go, "--list")) && (esl_opt_ArgNumber(go) != 2)) ||
+ (( esl_opt_GetBoolean(go, "--list")) && (esl_opt_ArgNumber(go) != 1)))
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage1);
+ esl_usage(stdout, argv[0], usage2);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if(esl_opt_GetBoolean(go, "--list")) {
+ listfile = esl_opt_GetArg(go, 1);
+ }
+ else {
+ msafile1 = esl_opt_GetArg(go, 1);
+ msafile2 = esl_opt_GetArg(go, 2);
+ }
+
+ do_small = (esl_opt_IsOn(go, "--small")) ? TRUE : FALSE;
+ do_rfonly = (esl_opt_IsOn(go, "--rfonly")) ? TRUE : FALSE;
+
+ /* open output file */
+ if (esl_opt_GetString(go, "-o") != NULL) {
+ if ((ofp = fopen(esl_opt_GetString(go, "-o"), "w")) == NULL)
+ esl_fatal("Failed to open -o output file %s\n", esl_opt_GetString(go, "-o"));
+ } else ofp = stdout;
+
+ if (esl_opt_IsOn(go, "--informat")) {
+ infmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--informat"));
+ if (infmt == eslMSAFILE_UNKNOWN) esl_fatal("%s is not a valid input sequence file format for --informat", esl_opt_GetString(go, "--informat"));
+ if (do_small && infmt != eslMSAFILE_PFAM) esl_fatal("small memory mode requires Pfam formatted alignments");
+ }
+ if (esl_opt_IsOn(go, "--outformat")) {
+ outfmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--outformat"));
+ if (outfmt == eslMSAFILE_UNKNOWN) esl_fatal("%s is not a valid input sequence file format for --outformat", esl_opt_GetString(go, "--outformat"));
+ if (do_small && outfmt != eslMSAFILE_PFAM) esl_fatal("we can only output Pfam formatted alignments in small memory mode");
+ }
+ else outfmt = eslMSAFILE_STOCKHOLM;
+
+ if (do_small) {
+ infmt = eslMSAFILE_PFAM; /* this must be true, else we can't do small memory mode */
+ outfmt = eslMSAFILE_PFAM;
+ }
+
+ do_stall = esl_opt_GetBoolean(go, "--stall"); /* a stall point for attaching gdb */
+ while (do_stall);
+
+ /* determine file names to merge */
+ if(listfile != NULL) { /* read list file */
+ read_list_file(listfile, &alifile_list, &nalifile);
+ if(nalifile == 0) esl_fatal("Failed to read a single alignment file name from %s\n", listfile);
+ }
+ else { /* we're merging two alignment files from command-line */
+ nalifile = 2;
+ ESL_ALLOC(alifile_list, sizeof(char *) * nalifile);
+ if((status = esl_strdup(msafile1, -1, &(alifile_list[0]))) != eslOK) esl_fatal("Error storing alignment file name %s, error status: %d\n", msafile1, status);
+ if((status = esl_strdup(msafile2, -1, &(alifile_list[1]))) != eslOK) esl_fatal("Error storing alignment file name %s, error status: %d\n", msafile2, status);
+ }
+
+ /* create and start stopwatch */
+ if(ofp != stdout) {
+ w = esl_stopwatch_Create();
+ esl_stopwatch_Start(w);
+ }
+
+ if(esl_opt_GetBoolean(go, "-v")) {
+ /* determine the longest file name in alifile_list */
+ namewidth = 9; /* length of 'file name' */
+ for(fi = 0; fi < nalifile; fi++) {
+ if((status = esl_FileTail(alifile_list[fi], FALSE, &tmpstr)) != eslOK) esl_fatal("Memory allocation error.");
+ namewidth = ESL_MAX(namewidth, strlen(tmpstr));
+ free(tmpstr);
+ }
+
+ ESL_ALLOC(namedashes, sizeof(char) * (namewidth+1));
+ namedashes[namewidth] = '\0';
+ for(ni = 0; ni < namewidth; ni++) namedashes[ni] = '-';
+ fprintf(stdout, "# Reading %d alignment files...\n", nalifile);
+ fprintf(stdout, "#\n");
+ fprintf(stdout, "# %7s %-*s %7s %9s %9s %13s %8s\n", "", namewidth,"", "", "", "", "", "ncols");
+ fprintf(stdout, "# %7s %-*s %7s %9s %9s %13s %8s\n", "file #", namewidth,"file name", "ali #", "#seq/ali", "ncols/ali", "# seq total", "required");
+ fprintf(stdout, "# %7s %*s %7s %9s %9s %13s %8s\n", "-------", namewidth, namedashes, "-------", "---------", "---------", "-------------", "--------");
+ }
+
+ /* Allocate and initialize */
+ nalloc = chunksize;
+ ESL_ALLOC(msaA, sizeof(ESL_MSA *) * nalloc);
+ ESL_ALLOC(alenA, sizeof(int64_t) * nalloc);
+ if(do_rfonly) ESL_ALLOC(usemeA, sizeof(int *) * nalloc);
+
+ /* abc handling is weird. We only use alphabet to define gap characters in this miniapp.
+ * msa's are actually read in text mode. Thus eslRNA suffices for anything.
+ */
+ if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (do_small) abc = esl_alphabet_Create(eslRNA); /* alphabet is only used to define gap characters, so (in this miniapp) we're okay specifying RNA for any alignment (even non-RNA ones) */
+ else abc = esl_alphabet_Create(eslRNA); /* ditto */
+
+ /****************************************************************
+ * Read alignments one at a time, storing them all, separately *
+ ****************************************************************/
+
+ ai = 0;
+ nseq_tot = 0;
+ maxname = maxgf = maxgc = maxgr = 0;
+ ESL_ALLOC(nali_per_file, sizeof(int) * nalifile);
+ esl_vec_ISet(nali_per_file, nalifile, 0);
+
+ for (fi = 0; fi < nalifile; fi++) {
+
+ if (do_small)
+ {
+ status = esl_msafile2_Open(alifile_list[fi], NULL, &afp2);
+ if (status == eslENOTFOUND) esl_fatal("Alignment file %s doesn't exist or is not readable\n", alifile_list[fi]);
+ else if (status != eslOK) esl_fatal("Alignment file %s open failed with error %d\n", alifile_list[fi], status);
+ }
+ else
+ {
+ status = esl_msafile_Open(NULL, alifile_list[fi], NULL, infmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+ }
+
+
+ /* while loop: while we have an alignment in current alignment file, (statement looks weird b/c we use a different function if --small) */
+ while((status = (do_small) ?
+ esl_msafile2_ReadInfoPfam(afp2, NULL, NULL, -1, NULL,NULL, &(msaA[ai]), &nseq_cur, &alen_cur, &ngs_cur, &maxname_cur, &maxgf_cur, &maxgc_cur, &maxgr_cur, NULL, NULL, NULL, NULL, NULL) :
+ esl_msafile_Read (afp, &(msaA[ai]))) == eslOK) {
+
+ if(msaA[ai]->rf == NULL) esl_fatal("Error, all alignments must have #=GC RF annotation; alignment %d of file %d does not (%s)\n", nali_per_file[fi], (fi+1), alifile_list[fi]);
+ msaA[ai]->abc = abc; /* msa's are read in text mode, so this is (currently) only used to define gap characters, it doesn't even have to be the correct alphabet. if --small, this is set as RNA regardless of input */
+
+ if (do_small) {
+ maxname = ESL_MAX(maxname, maxname_cur);
+ maxgf = ESL_MAX(maxgf, maxgf_cur);
+ maxgc = ESL_MAX(maxgc, maxgc_cur);
+ maxgr = ESL_MAX(maxgr, maxgr_cur);
+ msaA[ai]->alen = alen_cur;
+ if(ngs_cur > 0) gs_exists = TRUE;
+ }
+ else {
+ nseq_cur = msaA[ai]->nseq;
+ }
+ alenA[ai] = msaA[ai]->alen; /* impt if --small and --rfonly, to remember total width of aln to expect in second pass */
+ nali_per_file[fi]++;
+ nseq_tot += nseq_cur;
+
+ /* reallocate per-alignment data, if nec */
+ if((ai+1) == nalloc) {
+ nalloc += chunksize;
+ ESL_RALLOC(msaA, tmp, sizeof(ESL_MSA *) * nalloc);
+ ESL_RALLOC(alenA, tmp, sizeof(int64_t) * nalloc);
+ for(ai2 = ai+1; ai2 < nalloc; ai2++) { msaA[ai2] = NULL; }
+ if(do_rfonly) {
+ ESL_RALLOC(usemeA, tmp, sizeof(int *) * nalloc);
+ for(ai2 = ai+1; ai2 < nalloc; ai2++) { usemeA[ai2] = NULL; }
+ }
+ }
+
+ /* either store consensus (non-gap RF) length (if first aln), or verify it is what we expect */
+ cur_clen = 0;
+ for(apos = 0; apos < (int) msaA[ai]->alen; apos++) {
+ if(rfchar_is_nongap_nonmissing(msaA[ai]->abc, msaA[ai]->rf[apos])) cur_clen++;
+ }
+ if(ai == 0) { /* first alignment, store clen, allocate maxgap, maxmis */
+ clen = cur_clen;
+ ESL_ALLOC(maxgap, sizeof(int) * (clen+1));
+ esl_vec_ISet(maxgap, (clen+1), 0);
+ ESL_ALLOC(maxmis, sizeof(int) * (clen+1));
+ esl_vec_ISet(maxmis, (clen+1), 0); /* these will all stay 0 unless we see '~' in the alignments */
+ }
+ else if(cur_clen != clen) {
+ esl_fatal("Error, all alignments must have identical non-gap #=GC RF lengths; expected (RF length of first ali read): %d,\nalignment %d of file %d length is %d (%s))\n", clen, nali_per_file[fi], (fi+1), cur_clen, alifile_list[fi]);
+ }
+
+
+ if(do_rfonly) {
+ /* Remove all columns that are gaps/missing data in the RF annotation, we keep an array of usemes,
+ * one per aln, in case of --small, so we know useme upon second pass of alignment files */
+ ESL_ALLOC(usemeA[ai], sizeof(int) * (msaA[ai]->alen));
+ for(apos = 0; apos < msaA[ai]->alen; apos++) { usemeA[ai][apos] = (rfchar_is_nongap_nonmissing(abc, msaA[ai]->rf[apos])) ? TRUE : FALSE; }
+ if((status = esl_msa_ColumnSubset(msaA[ai], errbuf, usemeA[ai])) != eslOK) {
+ esl_fatal("status code: %d removing gap RF columns for msa %d from file %s:\n%s", status, (ai+1), alifile_list[fi], errbuf);
+ }
+ }
+ else { /* --rfonly not enabled, determine max number inserts between each position */
+ /* update_maxgap_and_maxmis checks to make sure the msa follows our rule for missing data and gaps:
+ * for all positions x..y b/t any two adjacent nongap RF positions (x-1 and y+1 are nongap RF positions)
+ * all missing data columns '~' must come before all gap positions ('.', '-', or '_')
+ */
+ if((status = update_maxgap_and_maxmis(msaA[ai], errbuf, clen, msaA[ai]->alen, maxgap, maxmis)) != eslOK) esl_fatal(errbuf);
+ }
+ if(esl_opt_GetBoolean(go, "-v")) {
+ if((status = esl_FileTail(alifile_list[fi], FALSE, &tmpstr)) != eslOK) esl_fatal("Memory allocation error.");
+ tmp_len = clen + esl_vec_ISum(maxgap, clen+1) + esl_vec_ISum(maxmis, clen+1);
+ fprintf(stdout, " %7d %-*s %7d %9d %9" PRId64 " %13d %8d\n", (fi+1), namewidth, tmpstr, (ai+1), nseq_cur, msaA[ai]->alen, nseq_tot, tmp_len);
+ free(tmpstr);
+ }
+ ai++;
+ } /* end of while esl_msafile_Read() loop */
+
+ if (do_small)
+ {
+ if (status == eslEFORMAT) esl_fatal("Alignment file %s, parse error:\n%s\n", alifile_list[fi], afp2->errbuf);
+ else if (status == eslEINVAL) esl_fatal("Alignment file %s, parse error:\n%s\n", alifile_list[fi], afp2->errbuf);
+ else if (status != eslEOF) esl_fatal("Alignment file %s, read failed with error code %d\n", alifile_list[fi], status);
+ }
+ else if (status != eslEOF) esl_msafile_ReadFailure(afp, status);
+
+ if(nali_per_file[fi] == 0) esl_fatal("Failed to read any alignments from file %s\n", alifile_list[fi]);
+
+ if (do_small) esl_msafile2_Close(afp2);
+ else esl_msafile_Close(afp);
+ } /* end of for (fi=0; fi < nalifile; fi++) */
+ nali_tot = ai;
+
+ /*********************************************
+ * Merge all alignments into the merged MSA *
+ *********************************************/
+
+ /* We allocate space for all sequences, but leave sequences as NULL (nseq = -1).
+ * If (do_small) we didn't store the sequences on the first pass through the
+ * alignment files, and we'll never allocate space for the sequences in mmsa,
+ * we'll just output them as we reread them on another pass through the
+ * individual alignments. If we read >= 1 GS line in any of the input alignments,
+ * we need to do an additional pass through the files, outputting only GS
+ * data. Then, in a final (3rd) pass we'll output aligned data.
+ *
+ * if (!do_small), we have the sequences in memory, we'll copy these
+ * to the merged alignment, freeing them in the orignal msaA alignments
+ * as we go so we never need to allocate the full mmsa while we still have
+ * the individual msas (in msaA[]) in memory.
+ */
+ mmsa = esl_msa_Create(nseq_tot, -1);
+ alen_mmsa = clen + esl_vec_ISum(maxgap, clen+1) + esl_vec_ISum(maxmis, clen+1);
+
+ /* Determine what annotation from the input alignments
+ * we will include in the merged MSA.
+ * See comments in header of validate_and_copy_msa_annotation()
+ * for rules on what we include.
+ */
+ if((status = validate_and_copy_msa_annotation(go, outfmt, mmsa, msaA, nali_tot, clen, alen_mmsa, maxgap, maxmis, errbuf)) != eslOK)
+ esl_fatal("Error while checking and copying individual MSA annotation to merged MSA:%s\n", errbuf);
+
+ if (do_small) {
+ /* Small memory mode, do up to 2 more passes through the input alignments:
+ * pass 2 will output only GS data at top of output alignment file (only performed if >= 1 GS line read in input files
+ * pass 3 will output all aligned data at to output alignment file (always performed)
+ */
+
+ /* output header, comments, and #=GF data */
+ write_pfam_msa_top(ofp, mmsa);
+
+ if(ofp != stdout) {
+ if(esl_opt_GetBoolean(go, "-v")) { fprintf(stdout, "#\n"); }
+ fprintf(stdout, "# Outputting merged alignment to file %s ... ", esl_opt_GetString(go, "-o"));
+ fflush(stdout);
+ }
+
+ /* if there was any GS annotation in any of the individual alignments,
+ * do second pass through alignment files, outputting GS annotation as we go. */
+ if(gs_exists) {
+ ai = 0;
+ for(fi = 0; fi < nalifile; fi++) {
+ /* we're in small memory mode... */
+ status = esl_msafile2_Open(alifile_list[fi], NULL, &afp2); /* this should work b/c it did on the first pass */
+ if (status == eslENOTFOUND) esl_fatal("Second pass, alignment file %s doesn't exist or is not readable\n", alifile_list[fi]);
+ else if (status == eslEFORMAT) esl_fatal("Second pass, couldn't determine format of alignment %s\n", alifile_list[fi]);
+ else if (status != eslOK) esl_fatal("Second pass, alignment file %s open failed with error %d\n", alifile_list[fi], status);
+
+ for(ai2 = 0; ai2 < nali_per_file[fi]; ai2++) {
+ status = esl_msafile2_RegurgitatePfam(afp2, ofp,
+ maxname, maxgf, maxgc, maxgr, /* max width of a seq name, gf tag, gc tag, gr tag (irrelevant here) */
+ FALSE, /* regurgitate stockholm header ? */
+ FALSE, /* regurgitate // trailer ? */
+ FALSE, /* regurgitate blank lines */
+ FALSE, /* regurgitate comments */
+ FALSE, /* regurgitate GF ? */
+ TRUE, /* regurgitate GS ? */
+ FALSE, /* regurgitate GC ? */
+ FALSE, /* regurgitate GR ? */
+ FALSE, /* regurgitate aseq ? */
+ NULL, /* regurgitate all seqs, not a subset */
+ NULL, /* regurgitate all seqs, not a subset */
+ NULL, /* we're not keeping a subset of columns */
+ NULL, /* we're not adding all gap columns */
+ alenA[ai], /* alignment length, as we read it in first pass (inserts may have been removed since then) */
+ '.', /* gap char, irrelevant */
+ NULL, /* don't return num seqs read */
+ NULL); /* don't return num seqs regurgitated */
+ if(status == eslEOF) esl_fatal("Second pass, error out of alignments too soon, when trying to read aln %d of file %s", ai2, alifile_list[fi]);
+ if(status != eslOK) esl_fatal("Second pass, error reading alignment %d of file %s: %s", ai2, alifile_list[fi], afp2->errbuf);
+ ai++;
+ fflush(ofp);
+ }
+ esl_msafile2_Close(afp2);
+ }
+ fprintf(ofp, "\n"); /* a single blank line to separate GS annotation from aligned data */
+ }
+
+ /* do another (either second or third) pass through alignment files, outputting aligned sequence data (and GR) as we go */
+ ai = 0;
+ for(fi = 0; fi < nalifile; fi++) {
+ status = esl_msafile2_Open(alifile_list[fi], NULL, &afp2); /* this should work b/c it did on the first pass */
+ if (status == eslENOTFOUND) esl_fatal("Second pass, alignment file %s doesn't exist or is not readable\n", alifile_list[fi]);
+ else if (status == eslEFORMAT) esl_fatal("Second pass, couldn't determine format of alignment %s\n", alifile_list[fi]);
+ else if (status != eslOK) esl_fatal("Second pass, alignment file %s open failed with error %d\n", alifile_list[fi], status);
+
+ for(ai2 = 0; ai2 < nali_per_file[fi]; ai2++) {
+ /* determine how many all gap columns to insert after each alignment position
+ * of the child msa when copying it to the merged msa */
+ if(! do_rfonly) {
+ if((status = determine_gap_columns_to_add(msaA[ai], maxgap, maxmis, clen, &(ngapA), &(nmisA), &(neitherA), errbuf)) != eslOK)
+ esl_fatal("error determining number of all gap columns to add to alignment %d of file %s", ai2, alifile_list[fi]);
+ }
+ status = esl_msafile2_RegurgitatePfam(afp2, ofp,
+ maxname, maxgf, maxgc, maxgr, /* max width of a seq name, gf tag, gc tag, gr tag */
+ FALSE, /* regurgitate stockholm header ? */
+ FALSE, /* regurgitate // trailer ? */
+ FALSE, /* regurgitate blank lines */
+ FALSE, /* regurgitate comments */
+ FALSE, /* regurgitate GF ? */
+ FALSE, /* regurgitate GS ? */
+ FALSE, /* regurgitate GC ? */
+ TRUE, /* regurgitate GR ? */
+ TRUE, /* regurgitate aseq ? */
+ NULL, /* regurgitate all seqs, not a subset */
+ NULL, /* regurgitate all seqs, not a subset */
+ (do_rfonly) ? usemeA[ai] : NULL,
+ (do_rfonly) ? NULL : neitherA,
+ alenA[ai], /* alignment length, as we read it in first pass (inserts may have been removed since then) */
+ '.',
+ NULL, /* don't return num seqs read */
+ NULL); /* don't return num seqs regurgitated */
+
+ if(status == eslEOF) esl_fatal("Second pass, error out of alignments too soon, when trying to read aln %d of file %s", ai2, alifile_list[fi]);
+ if(status != eslOK) esl_fatal("Second pass, error reading alignment %d of file %s: %s", ai2, alifile_list[fi], afp2->errbuf);
+ free(ngapA);
+ free(nmisA);
+ free(neitherA);
+ esl_msa_Destroy(msaA[ai]);
+ msaA[ai] = NULL;
+ ai++;
+ fflush(ofp);
+ }
+ esl_msafile2_Close(afp2);
+ }
+ /* finally, write GC annotation and '//' line */
+ margin = maxname + 1;
+ if (maxgc > 0 && maxgc+6 > margin) margin = maxgc+6;
+ if (maxgr > 0 && maxname+maxgr+7 > margin) margin = maxname+maxgr+7;
+ write_pfam_msa_gc(ofp, mmsa, margin);
+ } /* end of if(do_small) */
+
+ else { /* ! do_small: for each input alignment in msaA[], add all aligned data to mmsa, then free it */
+ if(esl_opt_GetBoolean(go, "-v")) { fprintf(stdout, "#\n# Merging alignments ... "); fflush(stdout); }
+ for(ai = 0; ai < nali_tot; ai++) {
+ if((status = add_msa(mmsa, errbuf, msaA[ai], maxgap, maxmis, clen, alen_mmsa)) != eslOK)
+ esl_fatal("Error, merging alignment %d of %d:\n%s.", (ai+1), nali_tot, errbuf);
+ esl_msa_Destroy(msaA[ai]); /* note: the aligned sequences will have already been freed in add_msa() */
+ msaA[ai] = NULL;
+ }
+ if(esl_opt_GetBoolean(go, "-v")) { fprintf(stdout, "done.\n#\n"); fflush(stdout); }
+ mmsa->alen = alen_mmsa; /* it was -1, b/c we filled in each seq as we marched through each msaA[] alignment */
+ if(ofp != stdout) { fprintf(stdout, "# Saving alignment to file %s ... ", esl_opt_GetString(go, "-o")); }
+ status = esl_msafile_Write(ofp, mmsa, outfmt);
+ if(status != eslOK) esl_fatal("Error, during alignment output; status code: %d\n", status);
+ }
+ if(ofp != stdout) {
+ fflush(stdout);
+ fclose(ofp);
+ fprintf(stdout, "done\n#\n");
+ fflush(stdout);
+ esl_stopwatch_Stop(w);
+ esl_stopwatch_Display(stdout, w, "# CPU time: ");
+ }
+
+ /* clean up and exit */
+ if(alifile_list != NULL) {
+ for(fi = 0; fi < nalifile; fi++) {
+ if(alifile_list[fi] != NULL) free(alifile_list[fi]);
+ }
+ free(alifile_list);
+ }
+ if(usemeA != NULL) {
+ for(ai = 0; ai < nali_tot; ai++) {
+ free(usemeA[ai]);
+ }
+ free(usemeA);
+ }
+
+ if(nali_per_file != NULL) free(nali_per_file);
+ if(alenA != NULL) free(alenA);
+ if(namedashes != NULL) free(namedashes);
+ if(msaA != NULL) free(msaA);
+ if(maxgap != NULL) free(maxgap);
+ if(maxmis != NULL) free(maxmis);
+ if(mmsa != NULL) esl_msa_Destroy(mmsa);
+ if(abc != NULL) esl_alphabet_Destroy(abc);
+ if(w != NULL) esl_stopwatch_Destroy(w);
+ esl_getopts_Destroy(go);
+ return 0;
+
+ ERROR:
+ esl_fatal("Out of memory. Reformat to Pfam with esl-reformat and try esl-alimerge --small.");
+ return eslEMEM; /*NEVERREACHED*/
+}
+
+/* Function: read_list_file
+ * Date: EPN, Fri Nov 20 16:41:32 2009
+ *
+ * Read a file listing alignment files to merge.
+ * Store file names in *ret_alifile_list and return it,
+ * return number of files in ret_nalifile and return it.
+ * Each white-space delimited token is considered a
+ * different alignment name.
+ *
+ * Dies if we encounter an error.
+ *
+ * Returns: void.
+ */
+void
+read_list_file(char *listfile, char ***ret_alifile_list, int *ret_nalifile)
+{
+ int status;
+ ESL_FILEPARSER *efp;
+ char *tok;
+ int nalloc = 10;
+ int chunksize = 10;
+ char **alifile_list = NULL;
+ int n = 0;
+ void *tmp;
+
+ ESL_ALLOC(alifile_list, sizeof(char *) * nalloc);
+ status = esl_fileparser_Open(listfile, NULL, &efp);
+ if (status == eslENOTFOUND) esl_fatal("List file %s does not exist or is not readable\n", listfile);
+ else if(status == eslEMEM) esl_fatal("Ran out of memory when opening list file %s\n", listfile);
+ else if(status != eslOK) esl_fatal("Error opening list file %s\n", listfile);
+
+ esl_fileparser_SetCommentChar(efp, '#');
+ while((status = esl_fileparser_GetToken(efp, &tok, NULL)) != eslEOF) {
+ if(n == nalloc) { nalloc += chunksize; ESL_RALLOC(alifile_list, tmp, sizeof(char *) * nalloc); }
+ if((status = esl_strdup(tok, -1, &(alifile_list[n++]))) != eslOK) {
+ esl_fatal("Error storing alignment file name while reading list file %s, error status: %d\n", listfile, status);
+ }
+ }
+ esl_fileparser_Close(efp);
+ *ret_alifile_list = alifile_list;
+ *ret_nalifile = n;
+
+ return;
+
+ ERROR:
+ esl_fatal("Out of memory.");
+ return; /*NOTREACHED*/
+}
+
+
+/* Function: update_maxgap_and_maxmis
+ * Date: EPN, Sun Nov 22 09:40:48 2009
+ * (stolen from Infernal's cmalign.c)
+ *
+ * Update maxgap[] and maxmis[], arrays that keeps track of the max
+ * number of gap columns and missing data columns ('~' gap #=GC RF)
+ * columns before each cpos (consensus (non-gap #=GC RF) column)
+ *
+ * We require that all missing columns between cpos x and x+1 occur before
+ * all gap columns between cpos x and x+1.
+ *
+ * Consensus columns are index [0..cpos..clen].
+ *
+ * max{gap,mis}[0] is number of gap/missing columns before 1st cpos.
+ * max{gap,mis}[clen-1] is number of gap/missing columns before final cpos.
+ * max{gap,mis}[clen] is number of gap/missing columns after final cpos.
+ *
+ * Returns: eslOK on success.
+ * eslEINVAL if msa->rf is NULL, nongap RF length is not clen of
+ * for any two cpos x and x+1, a gap column precedes a
+ * missing data column.
+ *
+ */
+int
+update_maxgap_and_maxmis(ESL_MSA *msa, char *errbuf, int clen, int64_t alen, int *maxgap, int *maxmis)
+{
+ int apos;
+ int cpos = 0;
+ int ngap = 0;
+ int nmis = 0;
+
+ for(apos = 0; apos < alen; apos++) {
+ if(esl_abc_CIsGap(msa->abc, msa->rf[apos])) {
+ ngap++;
+ }
+ else if (esl_abc_CIsMissing(msa->abc, msa->rf[apos])) {
+ nmis++;
+ if(ngap > 0) ESL_FAIL(eslEINVAL, errbuf, "after nongap RF pos %d, %d gap columns precede a missing data column (none should)", cpos, ngap);
+ }
+ else {
+ maxgap[cpos] = ESL_MAX(maxgap[cpos], ngap);
+ maxmis[cpos] = ESL_MAX(maxmis[cpos], nmis);
+ cpos++;
+ ngap = 0;
+ nmis = 0;
+ }
+ }
+
+ /* update final value, max{ins,el}[clen+1], the number of inserts
+ * after the final consensus position */
+ maxgap[cpos] = ESL_MAX(maxgap[cpos], ngap);
+ maxmis[cpos] = ESL_MAX(maxmis[cpos], nmis);
+ if(cpos != clen) ESL_FAIL(eslEINVAL, errbuf, "second pass expected clen (%d) not equal to actual clen (%d).\n", clen, cpos);
+
+ return eslOK;
+}
+
+/* Function: validate_and_copy_msa_annotation
+ * Date: EPN, Tue Nov 24 05:35:50 2009
+ *
+ * Decide what individual MSA annotation from
+ * the input alignments in msaA[], if any, will be
+ * included in the merged alignment (mmsa) and
+ * add that info to it.
+ *
+ * Rules for what to include in mmsa:
+ *
+ * We include name,desc,acc,author annotation in merged alignment
+ * if it is identical in all msaA[] input alignments.
+ *
+ * We include comments and per-file (GF) annotation if they
+ * are present and identical in all input msaA[] alignments.
+ *
+ * We include per-column (GC) annotation if it is present and
+ * identical *with-respect-to* #=GC RF annotation AND all
+ * the annotation in gap #=GC RF columns in all msaA[] are gaps
+ * ('.'). This also pertains to the following parsed per-column
+ * annotation: ss_cons, sa_cons, pp_cons, and rf. With rf,
+ * de-gapped rf annotation must be identical in all input
+ * alignments period, if it is not we'll die with an error message.
+ *
+ * Per-sequence information and per-residue information is always
+ * included in merged alignment. This is done by add_msa() function.
+ *
+ * Returns: eslOK on success.
+ * eslEINCONCEIVABLE if input/msa is corrupt in some way (example: ngf>0 but gf_tag[0] == NULL)
+ * eslEMEM on memory error
+ * if !eslOK, errbuf is filled before return
+ */
+int
+validate_and_copy_msa_annotation(const ESL_GETOPTS *go, int outfmt, ESL_MSA *mmsa, ESL_MSA **msaA, int nmsa, int clen, int alen_merged, int *maxgap, int *maxmis, char *errbuf)
+{
+ int status;
+ int j; /* counter over alignment annotations */
+ int j2; /* counter over alignment annotations */
+ int ai; /* counter over alignments */
+ char *dealigned = NULL; /* a temporary, dealigned string */
+ char *dealigned2 = NULL; /* another temporary, dealigned string */
+ char *gapped_out = NULL; /* a temporary string with gaps added to fit into merged aln */
+ int *ngapA = NULL; /* [0..alen] number of insert gap columns to add after each alignment column when merging */
+ int *nmisA = NULL; /* [0..alen] number of missing data ('~') gap columns to add after each alignment column when merging */
+ int *neitherA = NULL; /* [0..apos..alen] = ngapA[apos] + nmisA[apos] */
+ int do_add;
+ int found_tag;
+ int be_verbose = FALSE;
+
+ /* we only print info about annotation if -v AND we'll actually
+ * output it (as stockholm or pfam)
+ * (we actually don't even need to be in this function if we're
+ * not output in stockholm or pfam...)
+ */
+ if((esl_opt_GetBoolean(go, "-v")) &&
+ (outfmt == eslMSAFILE_STOCKHOLM || outfmt == eslMSAFILE_PFAM))
+ { be_verbose = TRUE; }
+
+ if(be_verbose) fprintf(stdout, "#\n");
+
+ if(nmsa == 0) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "in validate_and_copy_msa_annotation(): zero child alignments.");
+
+ /* First, determine how many all gap columns to insert after each alignment position
+ * of the first child msa, so we can (possibly) gap out GC,SS_cons,SA_cons,PP_cons annotation
+ * to appropriate length when adding it to the merged MSA. */
+ if((status = determine_gap_columns_to_add(msaA[0], maxgap, maxmis, clen, &(ngapA), &(nmisA), &(neitherA), errbuf)) != eslOK)
+ return status;
+
+ /* Note: esl_strcmp() can handle NULL strings (they are not identical to non-NULL strings) */
+
+ /*********************************************************************/
+ /* Check if name annotation is identical in all alignments */
+ do_add = TRUE; /* until proven otherwise */
+ if(msaA[0]->name != NULL) {
+ for(ai = 1; ai < nmsa; ai++) {
+ if(esl_strcmp(msaA[0]->name, msaA[ai]->name) != 0) { do_add = FALSE; break; }
+ }
+ if(do_add) {
+ if(be_verbose) fprintf(stdout, "# Identical name annotation from all alignments transferred to merged alignment.\n");
+ if((status = esl_strdup(msaA[0]->name, -1, &(mmsa->name))) != eslOK) goto ERROR;
+ }
+ else if(be_verbose) fprintf(stdout, "# Name annotation is not identical in all alignments; not included in merged alignment.\n");
+ }
+ else if(be_verbose) fprintf(stdout, "# Name annotation absent from (at least) first alignment; not included in merged alignment.\n");
+
+ /*********************************************************************/
+ /* Check if description annotation is identical in all alignments */
+ do_add = TRUE; /* until proven otherwise */
+ if(msaA[0]->desc != NULL) {
+ for(ai = 1; ai < nmsa; ai++) {
+ if(esl_strcmp(msaA[0]->desc, msaA[ai]->desc) != 0) { do_add = FALSE; break; }
+ }
+ if(do_add) {
+ if(be_verbose) fprintf(stdout, "# Identical description annotation from all alignments transferred to merged alignment.\n");
+ if((status = esl_strdup(msaA[0]->desc, -1, &(mmsa->desc))) != eslOK) goto ERROR;
+ }
+ else if(be_verbose) fprintf(stdout, "# Description annotation is not identical in all alignments; not included in merged alignment.\n");
+ }
+ else if(be_verbose) fprintf(stdout, "# Description annotation absent from (at least) first alignment; not included in merged alignment.\n");
+
+ /*********************************************************************/
+ /* Check if accession annotation is identical in all alignments */
+ do_add = TRUE; /* until proven otherwise */
+ if(msaA[0]->acc != NULL) {
+ for(ai = 1; ai < nmsa; ai++) {
+ if(esl_strcmp(msaA[0]->acc, msaA[ai]->acc) != 0) { do_add = FALSE; break; }
+ }
+ if(do_add) {
+ if(be_verbose) fprintf(stdout, "# Identical accession annotation from all alignments transferred to merged alignment.\n");
+ if((status = esl_strdup(msaA[0]->acc, -1, &(mmsa->acc))) != eslOK) goto ERROR;
+ }
+ else if(be_verbose) fprintf(stdout, "# Accession annotation is not identical in all alignments; not included in merged alignment.\n");
+ }
+ else if(be_verbose) fprintf(stdout, "# Accession annotation absent from (at least) first alignment; not included in merged alignment.\n");
+
+ /*********************************************************************/
+ /* Check if author annotation is identical in all alignments */
+ do_add = TRUE; /* until proven otherwise */
+ if(msaA[0]->au != NULL) {
+ for(ai = 1; ai < nmsa; ai++) {
+ if(esl_strcmp(msaA[0]->au, msaA[ai]->au) != 0) { do_add = FALSE; break; }
+ }
+ if(do_add) {
+ if(be_verbose) fprintf(stdout, "# Identical author annotation from all alignments transferred to merged alignment.\n");
+ if((status = esl_strdup(msaA[0]->au, -1, &(mmsa->au))) != eslOK) goto ERROR;
+ }
+ else if(be_verbose) fprintf(stdout, "# Author annotation is not identical in all alignments; not included in merged alignment.\n");
+ }
+ else if(be_verbose) fprintf(stdout, "# Author annotation absent from (at least) first alignment; not included in merged alignment.\n");
+
+ /*********************************************************************/
+ /* Check per-file (GF) annotation, must be present and identical in all msaA[] alignments to be included */
+ if(msaA[0]->ngf > 0) {
+ for(j = 0; j < msaA[0]->ngf; j++) {
+ do_add = TRUE; /* until proven otherwise */
+ /* verify that what we think is true is true */
+ if(msaA[0]->gf_tag[j] == NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpectedly, GF tag %d of msaA[0] is NULL, but msaA[0]->ngf is %d.\n", j, msaA[0]->ngf);
+ if(msaA[0]->gf[j] == NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpectedly, GF annotation %d of msaA[0] is NULL, but msaA[0]->ngf is %d.\n", j, msaA[0]->ngf);
+ for(ai = 1; ai < nmsa; ai++) {
+ found_tag = FALSE;
+ for(j2 = 0; j2 < msaA[ai]->ngf; j2++) {
+ if(esl_strcmp(msaA[0]->gf_tag[j], msaA[ai]->gf_tag[j2]) == 0) {
+ found_tag = TRUE;
+ if(esl_strcmp(msaA[0]->gf[j], msaA[ai]->gf_tag[j2]) != 0) {
+ do_add = FALSE;
+ }
+ break; /* if we found a match, do_add remains TRUE */
+ }
+ }
+ if(found_tag && do_add) {
+ if(be_verbose) fprintf(stdout, "# Identical GF tag %s annotation from all alignments transferred to merged alignment.\n", msaA[0]->gf_tag[j]);
+ if((status = esl_msa_AddGF(mmsa, msaA[0]->gf_tag[j], -1, msaA[0]->gf[j], -1)) != eslOK) goto ERROR;
+ }
+ else {
+ if(be_verbose) fprintf(stdout, "# GF tag %s annotation from first alignment absent from >= 1 other alignments; not included in merged alignment.\n", msaA[0]->gf_tag[j]);
+ }
+ }
+ }
+ }
+ else if(be_verbose) fprintf(stdout, "# Unparsed GF annotation absent from (at least) first alignment; not included in merged alignment.\n");
+
+ /*********************************************************************/
+ /* Check comments, all must be identically ordered and identical in all msaA[] aligments to include them */
+ if(msaA[0]->ncomment > 0) {
+ do_add = TRUE; /* until proven otherwise */
+ /* make sure all alignments have same number of comments */
+ for(ai = 1; ai < nmsa; ai++) {
+ if(msaA[ai]->ncomment != msaA[0]->ncomment) {
+ do_add = FALSE;
+ break;
+ }
+ }
+ if(do_add) {
+ /* make sure all alignments have identical comments */
+ for(j = 0; j < msaA[0]->ncomment; j++) {
+ /* verify that what we think is true is true */
+ if(msaA[0]->comment[j] == NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpectedly, comment %d of msaA[0] is NULL, but msaA[0]->ncomment is %d.\n", j, msaA[0]->ncomment);
+ for(ai = 1; ai < nmsa; ai++) {
+ if(esl_strcmp(msaA[0]->comment[j], msaA[ai]->comment[j]) != 0) { /* comment doesn't match */
+ do_add = FALSE;
+ break;
+ }
+ }
+ }
+ }
+ if(do_add) {
+ for(j = 0; j < msaA[0]->ncomment; j++) {
+ if((status = esl_msa_AddComment(mmsa, msaA[0]->comment[j], -1))!= eslOK) goto ERROR;
+ }
+ if(be_verbose) fprintf(stdout, "# All alignments have identical comments in the same order. These were transferred to merged alignment.\n");
+ }
+ else {
+ if(be_verbose) fprintf(stdout, "# Comments are not identical in all alignments; not included in merged alignment.\n");
+ }
+ }
+ else if(be_verbose) fprintf(stdout, "# No comments in (at least) first alignment; not included in merged alignment.\n");
+
+ /*********************************************************************/
+ /* Check unparsed per-column (GC) annotation, it must include all gaps in gap RF columns and
+ * be identical once gap RF columns are removed in all msaA[] alignments to be included. */
+
+ if(msaA[0]->ngc > 0) {
+ for(j = 0; j < msaA[0]->ngc; j++) {
+ do_add = TRUE; /* until proven otherwise */
+ /* verify that what we think is true is true */
+ if(msaA[0]->gc_tag[j] == NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpectedly, GC tag %d of msaA[0] is NULL, but msaA[0]->ngf is %d.\n", j, msaA[0]->ngc);
+ if(msaA[0]->gc[j] == NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpectedly, GC annotation %d of msaA[0] is NULL, but msaA[0]->ngf is %d.\n", j, msaA[0]->ngc);
+
+ /* ensure it does not have non-gaps in gap RF columns */
+ if(validate_no_nongaps_in_rf_gaps(msaA[0]->abc, msaA[0]->rf, msaA[0]->gc[j], msaA[0]->alen)) { /* returns TRUE if gc[j] has 0 non-gap characters in gap columns of RF annotation */
+ /* dealign gc line */
+ if((status = esl_strdup(msaA[0]->gc[j], msaA[0]->alen, &(dealigned))) != eslOK) goto ERROR;
+ if((status = esl_strdealign(dealigned, msaA[0]->rf, "-_.~", NULL)) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpected error dealigning GC tag %s of msaA[0]", msaA[0]->gc_tag[j]);
+
+ for(ai = 1; ai < nmsa; ai++) {
+ found_tag = FALSE;
+ for(j2 = 0; j2 < msaA[ai]->ngc; j2++) {
+ if(esl_strcmp(msaA[0]->gc_tag[j], msaA[ai]->gc_tag[j2]) == 0) {
+ found_tag = TRUE;
+ /* ensure it does not have non-gaps in gap RF columns */
+ if(validate_no_nongaps_in_rf_gaps(msaA[ai]->abc, msaA[ai]->rf, msaA[ai]->gc[j2], msaA[ai]->alen)) { /* returns TRUE if gc[j2] has 0 non-gap characters in gap columns of RF annotation */
+ /* dealign */
+ if((status = esl_strdup(msaA[ai]->gc[j2], msaA[ai]->alen, &(dealigned2))) != eslOK) goto ERROR;
+ if((status = esl_strdealign(dealigned2, msaA[ai]->rf, "-_.~", NULL)) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpected error dealigning GC tag %s of msaA[%d]", msaA[ai]->gc_tag[j2], ai);
+ /* check identity */
+ if(esl_strcmp(dealigned, dealigned2) != 0) { do_add = FALSE; }
+ free(dealigned2);
+ dealigned2 = NULL;
+ break; /* if we matched, do_add remains TRUE */
+ }
+ }
+ }
+ } /* end of (for(ai = 1...)) */
+ if(dealigned != NULL) { free(dealigned); dealigned = NULL; }
+ if(found_tag && do_add) {
+ /* gap out the the GC annotation to fit in merged alignment */
+ if((status = inflate_string_with_gaps_and_missing(msaA[0]->gc[j], msaA[0]->alen, alen_merged, neitherA, '.', NULL, '~', &(gapped_out))) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "Error adding gaps to create GC tag %s annotation for merged alignment.", msaA[0]->gc_tag[j]);
+ if((status = esl_msa_AppendGC(mmsa, msaA[0]->gc_tag[j], gapped_out)) != eslOK) goto ERROR;
+ free(gapped_out);
+ gapped_out = NULL;
+ if(be_verbose) fprintf(stdout, "# Identical GC tag %s annotation from all alignments transferred to merged alignment.\n", msaA[0]->gc_tag[j]);
+ }
+ else {
+ if(be_verbose) fprintf(stdout, "# GC tag %s annotation from first alignment absent from or different in >= 1 other alignments; not included in merged alignment.\n", msaA[0]->gc_tag[j]);
+ }
+ }
+ } /* end of for(j = 0 j < msaA[0]->ngc... */
+ } /* end of if(msaA[0]->ngc > 0) */
+ else if(be_verbose) fprintf(stdout, "# Unparsed GC annotation absent from (at least) first alignment; not included in merged alignment.\n");
+
+ /*********************************************************************/
+ /* Check ss_cons: it must include all gaps in gap RF columns and be identical once gap RF columns are removed in all
+ * msaA[] alignments to be included. (Same requirements as unparsed GC annotation, so code block below is analogous to one above). */
+ if(msaA[0]->ss_cons != NULL) {
+ do_add = TRUE; /* until proven otherwise */
+ /* ensure it does not have non-gaps in gap RF columns */
+ if(validate_no_nongaps_in_rf_gaps(msaA[0]->abc, msaA[0]->rf, msaA[0]->ss_cons, msaA[0]->alen)) { /* returns TRUE if ss_cons has 0 non-gap characters in gap columns of RF annotation */
+ /* dealign ss_cons */
+ if((status = esl_strdup(msaA[0]->ss_cons, msaA[0]->alen, &(dealigned))) != eslOK) goto ERROR;
+ if((status = esl_strdealign(dealigned, msaA[0]->rf, "-_.~", NULL)) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpected error dealigning ss_cons of msaA[0]");
+ for(ai = 1; ai < nmsa; ai++) {
+ if(msaA[ai]->ss_cons == NULL) {
+ do_add = FALSE;
+ break;
+ }
+ /* ss_cons != NULL, ensure it does not have non-gaps in gap RF columns */
+ if(validate_no_nongaps_in_rf_gaps(msaA[ai]->abc, msaA[ai]->rf, msaA[ai]->ss_cons, msaA[ai]->alen)) { /* returns TRUE if ss_cons has 0 non-gap characters in gap columns of RF annotation */
+ /* dealign */
+ if((status = esl_strdup(msaA[ai]->ss_cons, msaA[ai]->alen, &(dealigned2))) != eslOK) goto ERROR;
+ if((status = esl_strdealign(dealigned2, msaA[ai]->rf, "-_.~", NULL)) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpected error dealigning ss_cons of msaA[%d]", ai);
+ /* check identity */
+ if(esl_strcmp(dealigned, dealigned2) != 0) { do_add = FALSE; }
+ free(dealigned2);
+ dealigned2 = NULL;
+ break; /* if we matched, do_add remains TRUE */
+ }
+ } /* end of (for(ai = 1...)) */
+ if(dealigned != NULL) { free(dealigned); dealigned = NULL; }
+ if(do_add) {
+ /* gap out the the ss_cons to fit in merged alignment,
+ * as a special case, we use '~' in SS_cons as we add missing data and gaps
+ * like we do in RF (for all other annotation we only add gaps) */
+ if((status = inflate_string_with_gaps_and_missing(msaA[0]->ss_cons, msaA[0]->alen, alen_merged, ngapA, '.', nmisA, '~', &(gapped_out))) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "Error adding gaps to create SS_cons annotation for merged alignment.");
+ if(mmsa->ss_cons != NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "Error adding SS_cons to merged alignment, it is already non-NULL.");
+ if((status = esl_strdup(gapped_out, alen_merged, &(mmsa->ss_cons))) != eslOK) goto ERROR;
+ free(gapped_out);
+ gapped_out = NULL;
+ if(be_verbose) fprintf(stdout, "# Identical SS_cons annotation from all alignments transferred to merged alignment.\n");
+ }
+ else {
+ if(be_verbose) fprintf(stdout, "# SS_cons annotation from first alignment absent from or different in >= 1 other alignments; not included in merged alignment.\n");
+ }
+ }
+ } /* end of if(msaA[0]->ss_cons != NULL) */
+ else if(be_verbose) fprintf(stdout, "# SS_cons annotation absent from (at least) first alignment; not included in merged alignment.\n");
+
+ /*********************************************************************/
+ /* Check sa_cons: it must include all gaps in gap RF columns and be identical once gap RF columns are removed in all
+ * msaA[] alignments to be included. (Same requirements as unparsed GC annotation, so code block below is analogous to one above). */
+ if(msaA[0]->sa_cons != NULL) {
+ do_add = TRUE; /* until proven otherwise */
+ /* ensure it does not have non-gaps in gap RF columns */
+ if(validate_no_nongaps_in_rf_gaps(msaA[0]->abc, msaA[0]->rf, msaA[0]->sa_cons, msaA[0]->alen)) { /* returns TRUE if sa_cons has 0 non-gap characters in gap columns of RF annotation */
+ /* dealign sa_cons */
+ if((status = esl_strdup(msaA[0]->sa_cons, msaA[0]->alen, &(dealigned))) != eslOK) goto ERROR;
+ if((status = esl_strdealign(dealigned, msaA[0]->rf, "-_.~", NULL)) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpected error dealigning sa_cons of msaA[0]");
+ for(ai = 1; ai < nmsa; ai++) {
+ if(msaA[ai]->sa_cons == NULL) {
+ do_add = FALSE;
+ break;
+ }
+ /* sa_cons != NULL, ensure it does not have non-gaps in gap RF columns */
+ if(validate_no_nongaps_in_rf_gaps(msaA[ai]->abc, msaA[ai]->rf, msaA[ai]->sa_cons, msaA[ai]->alen)) { /* returns TRUE if sa_cons has 0 non-gap characters in gap columns of RF annotation */
+ /* dealign */
+ if((status = esl_strdup(msaA[ai]->sa_cons, msaA[ai]->alen, &(dealigned2))) != eslOK) goto ERROR;
+ if((status = esl_strdealign(dealigned2, msaA[ai]->rf, "-_.~", NULL)) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpected error dealigning sa_cons of msaA[%d]", ai);
+ /* check identity */
+ if(esl_strcmp(dealigned, dealigned2) != 0) { do_add = FALSE; }
+ free(dealigned2);
+ dealigned2 = NULL;
+ break; /* if we matched, do_add remains TRUE */
+ }
+ } /* end of (for(ai = 1...)) */
+ if(dealigned != NULL) { free(dealigned); dealigned = NULL; }
+ if(do_add) {
+ /* gap out the the sa_cons to fit in merged alignment */
+ if((status = inflate_string_with_gaps_and_missing(msaA[0]->sa_cons, msaA[0]->alen, alen_merged, neitherA, '.', NULL, '~', &(gapped_out))) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "Error adding gaps to create SA_cons annotation for merged alignment.");
+ if(mmsa->sa_cons != NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "Error adding SA_cons to merged alignment, it is already non-NULL.");
+ if((status = esl_strdup(gapped_out, alen_merged, &(mmsa->sa_cons))) != eslOK) goto ERROR;
+ free(gapped_out);
+ gapped_out = NULL;
+ if(be_verbose) fprintf(stdout, "# Identical SA_cons annotation from all alignments transferred to merged alignment.\n");
+ }
+ else {
+ if(be_verbose) fprintf(stdout, "# SA_cons annotation from first alignment absent from or different in >= 1 other alignments; not included in merged alignment.\n");
+ }
+ }
+ } /* end of if(msaA[0]->sa_cons != NULL) */
+ else if(be_verbose) fprintf(stdout, "# SA_cons annotation absent from (at least) first alignment; not included in merged alignment.\n");
+
+ /*********************************************************************/
+ /* Check pp_cons: it must include all gaps in gap RF columns and be identical once gap RF columns are removed in all
+ * msaA[] alignments to be included. (Same requirements as unparsed GC annotation, so code block below is analogous to one above). */
+ if(msaA[0]->pp_cons != NULL) {
+ do_add = TRUE; /* until proven otherwise */
+ /* ensure it does not have non-gaps in gap RF columns */
+ if(validate_no_nongaps_in_rf_gaps(msaA[0]->abc, msaA[0]->rf, msaA[0]->pp_cons, msaA[0]->alen)) { /* returns TRUE if pp_cons has 0 non-gap characters in gap columns of RF annotation */
+ /* dealign pp_cons */
+ if((status = esl_strdup(msaA[0]->pp_cons, msaA[0]->alen, &(dealigned))) != eslOK) goto ERROR;
+ if((status = esl_strdealign(dealigned, msaA[0]->rf, "-_.~", NULL)) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpected error dealigning pp_cons of msaA[0]");
+ for(ai = 1; ai < nmsa; ai++) {
+ if(msaA[ai]->pp_cons == NULL) {
+ do_add = FALSE;
+ break;
+ }
+ /* pp_cons != NULL, ensure it does not have non-gaps in gap RF columns */
+ if(validate_no_nongaps_in_rf_gaps(msaA[ai]->abc, msaA[ai]->rf, msaA[ai]->pp_cons, msaA[ai]->alen)) { /* returns TRUE if pp_cons has 0 non-gap characters in gap columns of RF annotation */
+ /* dealign */
+ if((status = esl_strdup(msaA[ai]->pp_cons, msaA[ai]->alen, &(dealigned2))) != eslOK) goto ERROR;
+ if((status = esl_strdealign(dealigned2, msaA[ai]->rf, "-_.~", NULL)) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpected error dealigning pp_cons of msaA[%d]", ai);
+ /* check identity */
+ if(esl_strcmp(dealigned, dealigned2) != 0) { do_add = FALSE; }
+ free(dealigned2);
+ dealigned2 = NULL;
+ break; /* if we matched, do_add remains TRUE */
+ }
+ } /* end of (for(ai = 1...)) */
+ if(dealigned != NULL) { free(dealigned); dealigned = NULL; }
+ if(do_add) {
+ /* gap out the the pp_cons to fit in merged alignment */
+ if((status = inflate_string_with_gaps_and_missing(msaA[0]->pp_cons, msaA[0]->alen, alen_merged, neitherA, '.', NULL, '~', &(gapped_out))) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "Error adding gaps to create PP_cons annotation for merged alignment.");
+ if(mmsa->pp_cons != NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "Error adding PP_cons to merged alignment, it is already non-NULL.");
+ if((status = esl_strdup(gapped_out, alen_merged, &(mmsa->pp_cons))) != eslOK) goto ERROR;
+ free(gapped_out);
+ gapped_out = NULL;
+ if(be_verbose) fprintf(stdout, "# Identical PP_cons annotation from all alignments transferred to merged alignment.\n");
+ }
+ else {
+ if(be_verbose) fprintf(stdout, "# PP_cons annotation from first alignment absent from or different in >= 1 other alignments; not included in merged alignment.\n");
+ }
+ }
+ } /* end of if(msaA[0]->pp_cons != NULL) */
+ else if(be_verbose) fprintf(stdout, "# PP_cons annotation absent from (at least) first alignment; not included in merged alignment.\n");
+
+ /*********************************************************************/
+ /* Finally, validate that RF annotation is identical in all alignments after removing gaps. */
+
+ if(msaA[0]->rf == NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "All alignments must have #= GC RF annotation.");
+ /* dealign rf */
+ if((status = esl_strdup(msaA[0]->rf, msaA[0]->alen, &(dealigned))) != eslOK) goto ERROR;
+ if((status = esl_strdealign(dealigned, dealigned, "-_.~", NULL)) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpected error dealigning RF of msaA[0]");
+ for(ai = 1; ai < nmsa; ai++) {
+ if(msaA[ai]->rf == NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "All alignments must have #= GC RF annotation.");
+ /* dealign */
+ if((status = esl_strdup(msaA[ai]->rf, msaA[ai]->alen, &(dealigned2))) != eslOK) goto ERROR;
+ if((status = esl_strdealign(dealigned2, dealigned2, "-_.~", NULL)) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "unexpected error dealigning RF of msaA[%d]", ai);
+ /* check identity */
+ if(esl_strcmp(dealigned, dealigned2) != 0) {
+ printf("%s\n%s\n", dealigned, dealigned2);
+ ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "All alignments must have identical #=GC RF annotation, once gaps (\".\",\"-\",\"_\") are removed.\nAlignment %d de-gapped RF annotation differs from that of alignment 1.\n%s\n%s", ai+1, dealigned, dealigned2);
+ }
+ if(dealigned2 != NULL) { free(dealigned2); dealigned2 = NULL; }
+ }
+ if(dealigned != NULL) { free(dealigned); dealigned = NULL; }
+ /* gap out the the RF to fit in merged alignment */
+ if((status = inflate_string_with_gaps_and_missing(msaA[0]->rf, msaA[0]->alen, alen_merged, ngapA, '.', nmisA, '~', &(gapped_out))) != eslOK) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "Error adding gaps to create RF annotation for merged alignment.");
+ if(mmsa->rf != NULL) ESL_XFAIL(eslEINCONCEIVABLE, errbuf, "Error adding RF to merged alignment, it is already non-NULL.");
+ if((status = esl_strdup(gapped_out, alen_merged, &(mmsa->rf))) != eslOK) goto ERROR;
+ free(gapped_out);
+ gapped_out = NULL;
+ if(be_verbose) fprintf(stdout, "# Identical RF annotation from all alignments transferred to merged alignment.\n");
+
+ if(dealigned != NULL) free(dealigned);
+ if(dealigned2 != NULL) free(dealigned2);
+ if(gapped_out != NULL) free(gapped_out);
+ if(ngapA != NULL) free(ngapA);
+ if(nmisA != NULL) free(nmisA);
+ if(neitherA != NULL) free(neitherA);
+ return eslOK;
+
+ ERROR:
+ if(dealigned != NULL) free(dealigned);
+ if(dealigned2 != NULL) free(dealigned2);
+ if(gapped_out != NULL) free(gapped_out);
+ if(ngapA != NULL) free(ngapA);
+ if(nmisA != NULL) free(nmisA);
+ if(neitherA != NULL) free(neitherA);
+ return status;
+}
+
+/* Function: add_msa
+ * Date: EPN, Mon Nov 23 05:54:37 2009
+ *
+ * Add a "child" MSA we read from a file to the merged
+ * MSA - the merged alignment that we'll eventually
+ * output. We free each string in the child as soon
+ * as we've added it to the merged, to save memory.
+ *
+ * We add all sequence data (aseq), and per sequence
+ * annotation, including sqname, sqdesc, sqacc, pp, ss,
+ * sa, as well as non-parsed GS and GR annotation.
+ *
+ * <maxgap>[0..clen] is an array specifying the
+ * number of inserted columns necessary between
+ * each consensus position.
+ *
+ * max{gap,mis}[0] is number of gaps/missing columns before 1st cpos.
+ * max{gap,mis}[clen-1] is number of gaps/missing columns before final cpos.
+ * max{gap,mis}[clen] is number of gaps/missing columns after final cpos.
+ *
+ * <alen_merged> is the number of columns in the merged
+ * alignment. This is the non-gap RF length plus the
+ * sum of the maxgap vector.
+ *
+ * Returns: eslOK on success.
+ * eslEMEM on memory allocation failure.
+ */
+int
+add_msa(ESL_MSA *mmsa, char *errbuf, ESL_MSA *msa_to_add, int *maxgap, int *maxmis, int clen, int alen_merged)
+{
+ int status;
+ int i; /* counter over sequences in msa_to_add */
+ int j; /* counter over alignment annotations */
+ int mi; /* counter over sequences in mmsa */
+ void *tmp; /* for reallocations */
+ char *tmpstr; /* used for copying GR annotation */
+ int nseq_existing; /* number of sequences already added to mmsa, by previous calls of this function */
+ int *ngapA = NULL; /* [0..alen] number of insert gap columns to add after each alignment column when merging */
+ int *nmisA = NULL; /* [0..alen] number of missing data ('~') gap columns to add after each alignment column when merging */
+ int *neitherA = NULL; /* [0..apos..alen] = ngapA[apos] + nmisA[apos] */
+
+ nseq_existing = mmsa->nseq;
+
+ /* determine how many all gap columns to insert after each alignment position
+ * of the child msa when copying it to the merged msa */
+ if((status = determine_gap_columns_to_add(msa_to_add, maxgap, maxmis, clen, &(ngapA), &(nmisA), &(neitherA), errbuf)) != eslOK)
+ return status;
+
+ /* Append msa_to_add's sequence data and per-sequence annotation to mmsa after adding necessary gaps */
+ /* sequence names and aligned sequence data (digitized) */
+ for(i = 0, mi = nseq_existing; i < msa_to_add->nseq; i++, mi++) {
+ esl_strdup(msa_to_add->sqname[i], -1, &(mmsa->sqname[mi]));
+
+ status = inflate_seq_with_gaps(msa_to_add->abc, msa_to_add->aseq[i], msa_to_add->alen, alen_merged, neitherA, '.', &(mmsa->aseq[mi]));
+ if (status == eslEMEM) ESL_XFAIL(status, errbuf, "Out of memory adding sequence %s", mmsa->sqname[mi]);
+ else if(status != eslOK) ESL_XFAIL(status, errbuf, "Found internal missing data symbols in seq: %s", mmsa->sqname[mi]);
+ free(msa_to_add->aseq[i]); /* free immediately */
+ msa_to_add->aseq[i] = NULL;
+ }
+
+ /* parsed annotation that is optional */
+ /* sqacc */
+ if(msa_to_add->sqacc != NULL) {
+ if(mmsa->sqacc == NULL) { /* allocate for all sequences, even ones added in previous calls to add_msa() */
+ ESL_ALLOC(mmsa->sqacc, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ for(mi = 0; mi < nseq_existing; mi++) { mmsa->sqacc[mi] = NULL; }
+ }
+ else { /* reallocate; to add space for new seqs */
+ ESL_RALLOC(mmsa->sqacc, tmp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ }
+ for(i = 0, mi = nseq_existing; i < msa_to_add->nseq; i++, mi++) {
+ if(msa_to_add->sqacc[i] != NULL) {
+ if((status = esl_strdup(msa_to_add->sqacc[i], -1, &(mmsa->sqacc[mi]))) != eslOK)
+ ESL_XFAIL(status, errbuf, "Memory allocation error when copying sequence accession number %d.\n", i+1);
+ free(msa_to_add->sqacc[i]); /* free immediately */
+ msa_to_add->sqacc[i] = NULL;
+ }
+ else {
+ mmsa->sqacc[mi] = NULL;
+ }
+ }
+ } /* end of if(msa_to_add->sqacc != NULL */
+ else if(mmsa->sqacc != NULL) {
+ /* msa_to_add->sqacc == NULL, but mmsa->sqacc != NULL, reallocate mmsa->sqacc, and set new ones to NULL */
+ ESL_RALLOC(mmsa->sqacc, tmp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ for(mi = nseq_existing; mi < nseq_existing + msa_to_add->nseq; mi++) {
+ mmsa->sqacc[mi] = NULL;
+ }
+ }
+
+ /* sqdesc */
+ if(msa_to_add->sqdesc != NULL) {
+ if(mmsa->sqdesc == NULL) { /* allocate for all sequences, even ones added in previous calls to add_msa() */
+ ESL_ALLOC(mmsa->sqdesc, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ for(mi = 0; mi < nseq_existing; mi++) { mmsa->sqdesc[mi] = NULL; }
+ }
+ else { /* reallocate; to add space for new seqs */
+ ESL_RALLOC(mmsa->sqdesc, tmp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ }
+ for(i = 0, mi = nseq_existing; i < msa_to_add->nseq; i++, mi++) {
+ if(msa_to_add->sqdesc[i] != NULL) {
+ if((status = esl_strdup(msa_to_add->sqdesc[i], -1, &(mmsa->sqdesc[mi]))) != eslOK)
+ ESL_XFAIL(status, errbuf, "Memory allocation error when copying sequence description number %d.\n", i+1);
+ free(msa_to_add->sqdesc[i]); /* free immediately */
+ msa_to_add->sqdesc[i] = NULL;
+ }
+ else {
+ mmsa->sqdesc[mi] = NULL;
+ }
+ }
+ } /* end of if(msa_to_add->sqdesc != NULL */
+ else if(mmsa->sqdesc != NULL) {
+ /* msa_to_add->sqdesc == NULL, but mmsa->sqdesc != NULL, reallocate mmsa->sqdesc, and set new ones to NULL */
+ ESL_RALLOC(mmsa->sqdesc, tmp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ for(mi = nseq_existing; mi < nseq_existing + msa_to_add->nseq; mi++) {
+ mmsa->sqdesc[mi] = NULL;
+ }
+ }
+
+ /* per-seq posterior probabilities */
+ if(msa_to_add->pp != NULL) {
+ if(mmsa->pp == NULL) { /* allocate for all sequences, even ones added in previous calls to add_msa() */
+ ESL_ALLOC(mmsa->pp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ for(mi = 0; mi < nseq_existing; mi++) { mmsa->pp[mi] = NULL; }
+ }
+ else { /* reallocate; to add space for new seqs */
+ ESL_RALLOC(mmsa->pp, tmp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ }
+ for(i = 0, mi = nseq_existing; i < msa_to_add->nseq; i++, mi++) {
+ if(msa_to_add->pp[i] != NULL) {
+ if((status = inflate_string_with_gaps_and_missing(msa_to_add->pp[i], msa_to_add->alen, alen_merged, neitherA, '.', NULL, '~', &(mmsa->pp[mi]))) != eslOK)
+ ESL_XFAIL(status, errbuf, "Memory allocation error when copying sequence number %d posterior probabilities.\n", i+1);
+ free(msa_to_add->pp[i]); /* free immediately */
+ msa_to_add->pp[i] = NULL;
+ }
+ else {
+ mmsa->pp[mi] = NULL;
+ }
+ }
+ } /* end of if(msa_to_add->pp != NULL */
+ else if(mmsa->pp != NULL) {
+ /* msa_to_add->pp == NULL, but mmsa->pp != NULL, reallocate mmsa->pp, and set new ones to NULL */
+ ESL_RALLOC(mmsa->pp, tmp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ for(mi = nseq_existing; mi < nseq_existing + msa_to_add->nseq; mi++) {
+ mmsa->pp[mi] = NULL;
+ }
+ }
+
+ /* per-seq secondary structure */
+ if(msa_to_add->ss != NULL) {
+ if(mmsa->ss == NULL) { /* allocate for all sequences, even ones added in previous calls to add_msa() */
+ ESL_ALLOC(mmsa->ss, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ for(mi = 0; mi < nseq_existing; mi++) { mmsa->ss[mi] = NULL; }
+ }
+ else { /* reallocate; to add space for new seqs */
+ ESL_RALLOC(mmsa->ss, tmp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ }
+ for(i = 0, mi = nseq_existing; i < msa_to_add->nseq; i++, mi++) {
+ if(msa_to_add->ss[i] != NULL) {
+ if((status = inflate_string_with_gaps_and_missing(msa_to_add->ss[i], msa_to_add->alen, alen_merged, neitherA, '.', NULL, '~', &(mmsa->ss[mi]))) != eslOK)
+ ESL_XFAIL(status, errbuf, "Memory allocation error when copying sequence number %d secondary structure.\n", i+1);
+ free(msa_to_add->ss[i]); /* free immediately */
+ msa_to_add->ss[i] = NULL;
+ }
+ else {
+ mmsa->ss[mi] = NULL;
+ }
+ }
+ } /* end of if(msa_to_add->ss != NULL */
+ else if(mmsa->ss != NULL) {
+ /* msa_to_add->ss == NULL, but mmsa->ss != NULL, reallocate mmsa->ss, and set new ones to NULL */
+ ESL_RALLOC(mmsa->ss, tmp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ for(mi = nseq_existing; mi < nseq_existing + msa_to_add->nseq; mi++) {
+ mmsa->ss[mi] = NULL;
+ }
+ }
+
+ /* per-seq surface accessibility */
+ if(msa_to_add->sa != NULL) {
+ if(mmsa->sa == NULL) { /* allocate for all sequences, even ones added in previous calls to add_msa() */
+ ESL_ALLOC(mmsa->sa, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ for(mi = 0; mi < nseq_existing; mi++) { mmsa->sa[mi] = NULL; }
+ }
+ else { /* reallocate; to add space for new seqs */
+ ESL_RALLOC(mmsa->sa, tmp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ }
+ for(i = 0, mi = nseq_existing; i < msa_to_add->nseq; i++, mi++) {
+ if(msa_to_add->sa[i] != NULL) {
+ if((status = inflate_string_with_gaps_and_missing(msa_to_add->sa[i], msa_to_add->alen, alen_merged, neitherA, '.', NULL, '~', &(mmsa->sa[mi]))) != eslOK)
+ ESL_XFAIL(status, errbuf, "Memory allocation error when copying sequence number %d surface accessibility.\n", i+1);
+ free(msa_to_add->sa[i]); /* free immediately */
+ msa_to_add->sa[i] = NULL;
+ }
+ else {
+ mmsa->sa[mi] = NULL;
+ }
+ }
+ } /* end of if(msa_to_add->sa != NULL */
+ else if(mmsa->sa != NULL) {
+ /* msa_to_add->sa == NULL, but mmsa->sa != NULL, reallocate mmsa->sa, and set new ones to NULL */
+ ESL_RALLOC(mmsa->sa, tmp, sizeof(char *) * (nseq_existing + msa_to_add->nseq));
+ for(mi = nseq_existing; mi < nseq_existing + msa_to_add->nseq; mi++) {
+ mmsa->sa[mi] = NULL;
+ }
+ }
+
+ /* Unparsed per-sequence (GS) annotation */
+ if(msa_to_add->ngs > 0) {
+ for(j = 0; j < msa_to_add->ngs; j++) {
+ for(i = 0, mi = nseq_existing; i < msa_to_add->nseq; i++, mi++) {
+ if(msa_to_add->gs[j][i] != NULL)
+ if((status =esl_msa_AddGS(mmsa, msa_to_add->gs_tag[j], -1, mi, msa_to_add->gs[j][i], -1)) != eslOK)
+ ESL_XFAIL(status, errbuf, "Memory allocation error when copying sequence number %d GS annotation.\n", i+1);
+ }
+ free(msa_to_add->gs[j][i]); /* free immediately */
+ msa_to_add->gs[j][i] = NULL;
+ }
+ }
+ /* caller will free the rest of gs via esl_msa_Destroy() */
+
+ /* unparsed per-residue (GR) annotation */
+ if(msa_to_add->gr != NULL) {
+ for(j = 0; j < msa_to_add->ngr; j++) {
+ for(i = 0, mi = nseq_existing; i < msa_to_add->nseq; i++, mi++) {
+ if(msa_to_add->gr[j][i] != NULL) {
+ if((status = inflate_string_with_gaps_and_missing(msa_to_add->gr[j][i], msa_to_add->alen, alen_merged, neitherA, '.', NULL, '~', &(tmpstr))) != eslOK)
+ ESL_XFAIL(status, errbuf, "Memory allocation error when copying sequence number %d GR annotation.\n", i+1);
+ if((status = esl_msa_AppendGR(mmsa, msa_to_add->gr_tag[j], mi, tmpstr)) != eslOK)
+ ESL_XFAIL(status, errbuf, "Memory allocation error when copying sequence number %d GR annotation.\n", i+1);
+ free(tmpstr);
+ free(msa_to_add->gr[j][i]); /* free immediately */
+ msa_to_add->gr[j][i] = NULL;
+ }
+ }
+ }
+ }
+ /* caller will free the rest of gr in esl_msa_Destroy() */
+
+ /* msa_to_add should be destroyed by caller */
+
+ /* update nseq in mmsa */
+ mmsa->nseq += msa_to_add->nseq;
+
+ if(ngapA != NULL) free(ngapA);
+ if(nmisA != NULL) free(nmisA);
+ if(neitherA != NULL) free(neitherA);
+ return eslOK;
+
+ ERROR:
+ if(ngapA != NULL) free(ngapA);
+ if(nmisA != NULL) free(nmisA);
+ if(neitherA != NULL) free(neitherA);
+ return status;
+}
+
+/* inflate_string_with_gaps_and_missing
+ *
+ * Given a string, create a new one that is a copy of it,
+ * but with missing data and gaps added before each position (apos)
+ * as specified by n{gap,mis}A[0..apos..len]. <gapchar> and <mischar>
+ * specify the gap character and missing data character. Either
+ * ngapA or nmisA can be either be NULL, if so they're treated as if
+ * they're all zeroes (no gaps/missing data will be added anywhere).
+ *
+ * n{gap,mis}A[0] - number of gaps/missing to add before first posn
+ * n{gap,mis}A[apos] - number of gaps/missing to add before posn apos
+ * n{gap,mis}A[src_len] - number of gaps/missing to add after final posn
+ *
+ * By convention, missing data symbols are always put before gap symbols
+ * when more than 1 of each are to be placed after the some nongap RF position.
+ *
+ * ret_str is allocated here.
+ *
+ * Returns eslOK on success.
+ * eslEMEM on memory error.
+ */
+int
+inflate_string_with_gaps_and_missing(char *src_str, int64_t src_len, int64_t dst_len, int *ngapA, char gapchar, int *nmisA, char mischar, char **ret_dst_str)
+{
+ int status;
+ int src_apos = 0;
+ int dst_apos = 0;
+ int i;
+ char *dst_str;
+
+ ESL_ALLOC(dst_str, sizeof(char) * (dst_len+1));
+ dst_str[dst_len] = '\0';
+
+ /* add gaps before first position */
+ if(nmisA) for(i = 0; i < nmisA[0]; i++) dst_str[dst_apos++] = mischar;
+ if(ngapA) for(i = 0; i < ngapA[0]; i++) dst_str[dst_apos++] = gapchar;
+
+ /* add gaps after every position */
+ for(src_apos = 0; src_apos < src_len; src_apos++) {
+ dst_str[dst_apos++] = src_str[src_apos];
+ if(nmisA) for(i = 0; i < nmisA[(src_apos+1)]; i++) dst_str[dst_apos++] = mischar;
+ if(ngapA) for(i = 0; i < ngapA[(src_apos+1)]; i++) dst_str[dst_apos++] = gapchar;
+ }
+
+ *ret_dst_str = dst_str;
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+
+/* inflate_seq_with_gaps()
+ *
+ * Given an aligned sequence, create a new one that is a copy of it,
+ * but with gaps added before each position (apos) as specified by
+ * ngapA[0..apos..len]. <gapchar> specifies the gap character.
+ *
+ * This function follows the HMMER3 convention of using '~' to mark
+ * fragment sequences. If a sequence is a fragment, the first and final
+ * string of gaps (contiguous gaps) will be marked as '~'. That is,
+ * the 1st column will necessarily be a '~' and the last will be a '~'.
+ * This function takes care to add '~' as gap characters in fragments,
+ * where appropriate, to follow HMMER3 convention.
+ *
+ * This function is importantly different from inflate_string_with_gaps_and_missing()
+ * in that it does not allow internal '~' missing data characters to
+ * be added (which are dictated by nmisA[] in inflate_string_with_gaps_and_missing())
+ * Those '~' are possible in Infernal output alignments only in
+ * #=GC RF and #=GC SS_cons alignment.
+ *
+ * It only adds '~' as necessary to the beginning and ends of fragments.
+ *
+ * ngapA[0] - number of gaps/missing to add before first posn
+ * ngapA[apos] - number of gaps/missing to add before posn apos
+ * ngapA[src_len] - number of gaps/missing to add after final posn
+ *
+ * ret_str is allocated here.
+ *
+ * Returns eslOK on success.
+ * eslEMEM on memory error.
+ * eslEINVAL if sequence (src_str) has an internal missing
+ * data symbol that violates HMMER3 convention.
+ */
+int
+inflate_seq_with_gaps(const ESL_ALPHABET *abc, char *src_str, int64_t src_len, int64_t dst_len, int *ngapA, char gapchar, char **ret_dst_str)
+{
+ int status;
+ int src_apos = 0;
+ int dst_apos = 0;
+ int src_flpos = 0; /* position of rightmost '~' in contiguous string that begins at position 0 */
+ int src_frpos = 0; /* position of leftmost '~' in contiguous string that ends at position src_len-1 */
+ int i;
+ char *dst_str;
+ char char2add;
+ int i_am_fragment = FALSE;
+
+ ESL_ALLOC(dst_str, sizeof(char) * (dst_len+1));
+ dst_str[dst_len] = '\0';
+
+ /* determine if sequence is a fragment, and determine src_flpos and src_frpos */
+ src_flpos = 0;
+ while(src_flpos < src_len && esl_abc_CIsMissing(abc, src_str[src_flpos])) { src_flpos++; }
+ src_flpos--; /* we overshot by 1 */
+ /* src_flpos is now rightmost '~' in stretch of '~' that begin at position 0, so
+ * it's -1 if sequence is not a fragment (there are no leading '~' in src_str)
+ */
+
+ src_frpos = src_len-1;
+ while(src_frpos > -1 && esl_abc_CIsMissing(abc, src_str[src_frpos])) { src_frpos--; }
+ src_frpos++; /* we overshot by 1 */
+ /* src_frpos is now leftmost '~' in stretch of '~' that end at position src_len-1, so
+ * it's src_len if sequence is not a fragment (there are no trailing '~' in src_str)
+ */
+ i_am_fragment = (src_flpos != -1 || src_frpos != src_len) ? TRUE : FALSE;
+
+ /* Now verify that we don't have any internal '~' characters */
+ for(src_apos = src_flpos+1; src_apos <= src_frpos-1; src_apos++) {
+ if(esl_abc_CIsMissing(abc, src_str[src_apos])) return eslEINVAL;
+ }
+
+ /* add gaps before first position */
+ src_apos = 0;
+ if(i_am_fragment) {
+ char2add = ((src_flpos >= src_apos) || (src_frpos <= src_apos)) ? esl_abc_CGetMissing(abc) : gapchar;
+ }
+ else {
+ char2add = gapchar;
+ }
+ if(ngapA) for(i = 0; i < ngapA[0]; i++) dst_str[dst_apos++] = char2add;
+
+ /* add gaps or missing character after every position */
+ for(src_apos = 0; src_apos < src_len; src_apos++) {
+ dst_str[dst_apos++] = src_str[src_apos];
+ if(i_am_fragment) {
+ char2add = ((src_flpos >= src_apos) || (src_frpos <= src_apos)) ? esl_abc_CGetMissing(abc) : gapchar;
+ }
+ else {
+ char2add = gapchar;
+ }
+ for(i = 0; i < ngapA[(src_apos+1)]; i++) dst_str[dst_apos++] = char2add;
+ }
+
+ *ret_dst_str = dst_str;
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+
+/* validate_no_nongaps_in_rf_gaps
+ *
+ * Given an RF string with gaps defined as by alphabet <abc>
+ * and another string of same length. Make sure none of the
+ * positions that are gaps in the RF string are non-gaps in the
+ * other string. Return TRUE if none are. Return FALSE if at
+ * least one is.
+ *
+ * Returns TRUE if 0 characters in <other_str> in same position
+ * as a gap in <rf_str> are non-gaps. FALSE otherwise.
+ */
+int
+validate_no_nongaps_in_rf_gaps(const ESL_ALPHABET *abc, char *rf_str, char *other_str, int64_t len)
+{
+ int64_t i;
+ for(i = 0; i < len; i++) {
+ if((! rfchar_is_nongap_nonmissing(abc, rf_str[i])) && (rfchar_is_nongap_nonmissing(abc, other_str[i]))) return FALSE;
+ }
+ return TRUE;
+}
+
+/* determine_gap_columns_to_add
+ * (stolen and slightly modified from Infernal 1.1rc1's cmalign.c)
+ *
+ * Given <maxgap> and <maxmis>, two arrays of the number of gap RF
+ * positions and '~' RF (missing data) after each non-gap RF
+ * (consensus) position in the eventual final merged alignment,
+ * calculate how many inserts and missing data inserts
+ * we need to add at each position of <msa> to expand it out to the
+ * appropriate size of the eventual merged alignment.
+ *
+ * max{gap,mis}[0] is number of gaps/missing before 1st cpos in merged aln
+ * max{gap,mis}[cpos] is number of gaps/missing after cpos in merged aln
+ * for cpos = 1..clen
+ * clen is the number of non-gap RF positions in msa (and in eventual merged msa).
+ *
+ * We allocate fill and return ret_ngapA[0..msa->alen], ret_nmisA[0..msa->alen],
+ * and ret_neitherA[0..msa->alen] here.
+ *
+ * ret_n{gap,mis}gapA[0] is number of gaps/missing to add before 1st position of msa
+ * ret_n{gap,mis}gapA[apos] is number of gaps/missing to add after alignment position apos
+ * for apos = 1..msa->alen
+ *
+ * ret_neitherA[apos] = ngapA[apos] + nmisA[apos]
+ *
+ * This is similar to the esl_msa.c helper function of the same name,
+ * but that function does not bother with missing data '~'.
+ *
+ * Returns eslOK on success.
+ * eslEMEM on memory alloaction error
+ * eslEINVAL if gaps occur before missing data b/t any two nongap RF posns
+ * eslERANGE if a value exceeds what we expected (based on earlier
+ * checks before this function was entered).
+ * if !eslOK, errbuf if filled.
+ */
+int
+determine_gap_columns_to_add(ESL_MSA *msa, int *maxgap, int *maxmis, int clen, int **ret_ngapA, int **ret_nmisA, int **ret_neitherA, char *errbuf)
+{
+ int status;
+ int apos;
+ int prv_cpos = 0; /* alignment position corresponding to consensus position cpos-1 */
+ int cpos = 0;
+ int ngap = 0;
+ int nmis = 0;
+ int *ngapA = NULL;
+ int *nmisA = NULL;
+ int *neitherA = NULL;
+
+ /* contract check */
+ if(maxmis[0] != 0) ESL_FAIL(eslEINVAL, errbuf, "missing characters exist prior to first cpos, this shouldn't happen.\n");
+
+ ESL_ALLOC(ngapA, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(nmisA, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(neitherA, sizeof(int) * (msa->alen+1));
+ esl_vec_ISet(ngapA, (msa->alen+1), 0);
+ esl_vec_ISet(nmisA, (msa->alen+1), 0);
+ esl_vec_ISet(neitherA, (msa->alen+1), 0);
+
+ for(apos = 0; apos < msa->alen; apos++) {
+ if(esl_abc_CIsMissing(msa->abc, msa->rf[apos])) {
+ nmis++;
+ if(ngap > 0) ESL_FAIL(eslEINVAL, errbuf, "after nongap RF pos %d, %d gap columns precede a missing data column (none should)", cpos, ngap);
+ }
+ else if(esl_abc_CIsGap(msa->abc, msa->rf[apos])) {
+ ngap++;
+ }
+ else { /* a consensus position */
+ /* a few sanity checks */
+ if(ngap > maxgap[cpos]) ESL_FAIL(eslEINCONCEIVABLE, errbuf, "%d inserts before cpos %d greater than max expected (%d).\n", ngap, cpos, maxgap[cpos]);
+ if(nmis > maxmis[cpos]) ESL_FAIL(eslEINCONCEIVABLE, errbuf, "%d EL inserts before cpos %d greater than max expected (%d).\n", nmis, cpos, maxmis[cpos]);
+
+ if (cpos == 0) {
+ /* gaps and/or missing data before first consensus position: flush right */
+ if(maxgap[cpos] > 0 && maxmis[cpos] == 0) { /* most common case */
+ ngapA[prv_cpos] = maxgap[cpos] - ngap; /* flush right gaps (no missing) */
+ }
+ else if(maxgap[cpos] == 0 && maxmis[cpos] > 0) {
+ nmisA[prv_cpos] = maxmis[cpos] - nmis; /* flush right missing (no gaps) */
+ }
+ else if(maxgap[cpos] > 0 && maxmis[cpos] > 0) {
+ /* missing data (ELs) is always 5' of gaps */
+ nmisA[prv_cpos] = maxmis[cpos] - nmis; /* flush right */
+ ngapA[prv_cpos+nmis] = maxgap[cpos] - ngap; /* flush right, after missing */
+ }
+ }
+ else {
+ /* gaps and/missing data after interior consensus position (i.e. not before 1st cpos or after last)
+ * Determine where to place inserts and/or missing data.
+ * Handle each of 4 possibilities separately, note that if
+ * maxgap[cpos] == 0 then ngap == 0, and if maxmis[cpos] == 0 then nmis == 0 (see sanity check above).
+ */
+ if(maxgap[cpos] > 0 && maxmis[cpos] == 0) { /* most common case */
+ ngapA[prv_cpos + 1 + (ngap/2)] = maxgap[cpos] - ngap; /* internal cpos: split */
+ }
+ else if(maxgap[cpos] == 0 && maxmis[cpos] > 0) {
+ nmisA[prv_cpos + 1 + (nmis/2)] = maxmis[cpos] - nmis; /* internal cpos: split */
+ }
+ else if(maxgap[cpos] > 0 && maxmis[cpos] > 0) {
+ /* missing data is always 5' of gaps */
+ nmisA[prv_cpos + 1 + (nmis/2)] = maxmis[cpos] - nmis; /* internal cpos: split */
+ ngapA[prv_cpos + 1 + nmis + (ngap/2)] = maxgap[cpos] - ngap; /* internal cpos: split */
+ }
+ /* final case is if (maxgap[cpos] == 0 && maxmis[cpos] == 0)
+ * in this case we do nothing.
+ */
+ }
+ cpos++;
+ prv_cpos = apos;
+ ngap = 0;
+ nmis = 0;
+ }
+ }
+ /* deal with gaps and missing data after final consensus position */
+
+ /* first, validate that clen is what it should be */
+ if(cpos != clen) {
+ if(ngapA != NULL) free(ngapA);
+ if(nmisA != NULL) free(nmisA);
+ if(neitherA != NULL) free(neitherA);
+ ESL_FAIL(eslEINCONCEIVABLE, errbuf, "consensus length (%d) is not the expected length (%d).", cpos, clen);
+ }
+
+ if(maxgap[cpos] > 0 && maxmis[cpos] == 0) { /* most common case */
+ ngapA[prv_cpos + 1 + ngap] = maxgap[cpos] - ngap; /* flush left gaps (no missing) */
+ }
+ else if(maxgap[cpos] == 0 && maxmis[cpos] > 0) {
+ nmisA[prv_cpos + 1 + nmis] = maxmis[cpos] - nmis; /* flush left missing (no gaps) */
+ }
+ else if(maxgap[cpos] > 0 && maxmis[cpos] > 0) {
+ /* missing data (ELs) is always 5' of gaps */
+ nmisA[prv_cpos + 1 + nmis] = maxmis[cpos] - nmis; /* flush left */
+ ngapA[prv_cpos + 1 + nmis + ngap] = maxgap[cpos] - ngap; /* flush left, after missing */
+ }
+
+ /* determine neitherA[], the number of gaps due to either inserts or missing data after each apos */
+ for(apos = 0; apos <= msa->alen; apos++) {
+ neitherA[apos] = ngapA[apos] + nmisA[apos];
+ }
+
+ *ret_ngapA = ngapA;
+ *ret_nmisA = nmisA;
+ *ret_neitherA = neitherA;
+
+ return eslOK;
+
+ ERROR:
+ if(ngapA != NULL) free(ngapA);
+ if(nmisA != NULL) free(nmisA);
+ if(neitherA != NULL) free(neitherA);
+ ESL_FAIL(status, errbuf, "Memory allocation error.");
+ return status; /*NEVERREACHED*/
+}
+
+/* write_pfam_msa_top
+ *
+ * Highly specialized function for printing out the 'top' of a
+ * Stockholm alignment file, i.e. the Stockholm header line, comments
+ * and GF annotation to an msa file. This function is necessary when
+ * printing the merged alignment file in small memory mode (when
+ * --small enabled). <msa> is an alignment with no sequence
+ * information (no aseq, ax, GS, or GR data).
+ */
+void
+write_pfam_msa_top(FILE *fp, ESL_MSA *msa)
+{
+ int i, maxgf;
+
+ /* rest of code in this function was stolen verbatim from actually_write_stockholm in esl_msa.c */
+
+ /* Magic Stockholm header
+ */
+ fprintf(fp, "# STOCKHOLM 1.0\n");
+
+ /* Free text comments
+ */
+ for (i = 0; i < msa->ncomment; i++)
+ fprintf(fp, "# %s\n", msa->comment[i]);
+ if (msa->ncomment > 0) fprintf(fp, "\n");
+
+ maxgf = maxwidth(msa->gf_tag, msa->ngf);
+ if (maxgf < 2) maxgf = 2;
+
+ /* GF section: per-file annotation
+ */
+ if (msa->name != NULL) fprintf(fp, "#=GF %-*s %s\n", maxgf, "ID", msa->name);
+ if (msa->acc != NULL) fprintf(fp, "#=GF %-*s %s\n", maxgf, "AC", msa->acc);
+ if (msa->desc != NULL) fprintf(fp, "#=GF %-*s %s\n", maxgf, "DE", msa->desc);
+ if (msa->au != NULL) fprintf(fp, "#=GF %-*s %s\n", maxgf, "AU", msa->au);
+
+ /* Thresholds are hacky. Pfam has two. Rfam has one.
+ */
+ if (msa->cutset[eslMSA_GA1] && msa->cutset[eslMSA_GA2])
+ fprintf(fp, "#=GF %-*s %.1f %.1f\n",
+ maxgf, "GA", msa->cutoff[eslMSA_GA1], msa->cutoff[eslMSA_GA2]);
+ else if (msa->cutset[eslMSA_GA1])
+ fprintf(fp, "#=GF %-*s %.1f\n",
+ maxgf, "GA", msa->cutoff[eslMSA_GA1]);
+
+ if (msa->cutset[eslMSA_NC1] && msa->cutset[eslMSA_NC2])
+ fprintf(fp, "#=GF %-*s %.1f %.1f\n",
+ maxgf, "NC", msa->cutoff[eslMSA_NC1], msa->cutoff[eslMSA_NC2]);
+ else if (msa->cutset[eslMSA_NC1])
+ fprintf(fp, "#=GF %-*s %.1f\n",
+ maxgf, "NC", msa->cutoff[eslMSA_NC1]);
+
+ if (msa->cutset[eslMSA_TC1] && msa->cutset[eslMSA_TC2])
+ fprintf(fp, "#=GF %-*s %.1f %.1f\n",
+ maxgf, "TC", msa->cutoff[eslMSA_TC1], msa->cutoff[eslMSA_TC2]);
+ else if (msa->cutset[eslMSA_TC1])
+ fprintf(fp, "#=GF %-*s %.1f\n",
+ maxgf, "TC", msa->cutoff[eslMSA_TC1]);
+
+ for (i = 0; i < msa->ngf; i++)
+ fprintf(fp, "#=GF %-*s %s\n", maxgf, msa->gf_tag[i], msa->gf[i]);
+ fprintf(fp, "\n");
+
+ return;
+}
+
+/* write_pfam_msa_gc
+ *
+ * Highly specialized function for printing out the GC annotation to a
+ * Pfam Stockholm alignment file (1 line/seq). This function is
+ * necessary when printing the merged alignment file in small memory
+ * mode (when --small enabled). <msa> is an alignment with no sequence
+ * information (no aseq, ax, GS, nor GR data).
+ */
+void
+write_pfam_msa_gc(FILE *fp, ESL_MSA *msa, int margin)
+{
+ int i;
+ if (msa->ss_cons != NULL) { fprintf(fp, "#=GC %-*s %s\n", margin-6, "SS_cons", msa->ss_cons); }
+ if (msa->sa_cons != NULL) { fprintf(fp, "#=GC %-*s %s\n", margin-6, "SA_cons", msa->sa_cons); }
+ if (msa->pp_cons != NULL) { fprintf(fp, "#=GC %-*s %s\n", margin-6, "PP_cons", msa->pp_cons); }
+ if (msa->rf != NULL) { fprintf(fp, "#=GC %-*s %s\n", margin-6, "RF", msa->rf); }
+ for (i = 0; i < msa->ngc; i++) { fprintf(fp, "#=GC %-*s %s\n", margin-6, msa->gc_tag[i], msa->gc[i]); }
+ fprintf(fp, "//\n");
+}
+
+/* maxwidth()
+ * Return the length of the longest string in
+ * an array of strings.
+ */
+static int64_t
+maxwidth(char **s, int n)
+{
+ int64_t max,len;
+ int i;
+
+ max = 0;
+ for (i = 0; i < n; i++)
+ if (s[i] != NULL)
+ {
+ len = strlen(s[i]);
+ if (len > max) max = len;
+ }
+ return max;
+}
+
+/* rfchar_is_nongap_nonmissing()
+ * Return FALSE if a character from RF annotation is
+ * a gap or a missing character, else return TRUE.
+ */
+static int
+rfchar_is_nongap_nonmissing(const ESL_ALPHABET *abc, char rfchar) {
+ if(esl_abc_CIsGap (abc, rfchar)) return FALSE;
+ if(esl_abc_CIsMissing(abc, rfchar)) return FALSE;
+ return TRUE;
+}
diff --git a/miniapps/esl-alimerge.itest.pl b/miniapps/esl-alimerge.itest.pl
new file mode 100755
index 0000000..2bfa00a
--- /dev/null
+++ b/miniapps/esl-alimerge.itest.pl
@@ -0,0 +1,211 @@
+#! /usr/bin/perl
+
+# Integrated test of esl-alimerge miniapp.
+#
+# Usage: ./esl-alimerge.itest.pl <esl-alimerge binary> <tmpfile prefix>
+# Example: ./esl-alimerge.itest.pl ./esl-alimerge foo
+#
+# EPN, Wed Nov 25 11:23:55 2009
+
+$eslalimerge = shift;
+$tmppfx = shift;
+
+if (! -x "$eslalimerge") { die "FAIL: didn't find esl-alimerge binary $eslalimerge"; }
+
+open(ALIFILE, ">$tmppfx.1") || die "FAIL: couldn't open $tmppfx.1 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+seq1 aaAAAA.AAAA...Cc.cCCCCCC.C..GGGGGgggg
+seq2 ..AAAAaAAAAaacCcccCCCCCCcCccGGGGG....
+#=GC RF ..AAAA.AAAA...C...CCCCCC.c..GGGGG....
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.2") || die "FAIL: couldn't open $tmppfx.2 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GS seq3 DE sequence 3 is the best!
+seq3 AAAAA..AAA.....CCC..CCCC....c..G..GG..GG.
+seq4 AAAAAaaAAAaccccC-CccCCCCccccccgGggGGggGGg
+#=GC RF AAAAA..AAA.....CCC..CCCC~...c..G..GG..GG.
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.3") || die "FAIL: couldn't open $tmppfx.3 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GS seq5 DE kachow
+seq5 AAAAA..AAA.....CCC..CCCC....c..G..GG..GG.
+seq6 AAAAAaaAAAaccccC-CccCCCCccccccgGggGGggGGg
+#=GC RF AAAAA..AAA.....CCC..CCCC~~..c..G..GG..GG.
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.4") || die "FAIL: couldn't open $tmppfx.4 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GS seq5 DE kachow
+seq5 ~~~AAAAA..AAA.....CCC..CCCC....c..G..GG..GG~~~~
+seq6 ...AAAAAaaAAAaccccC-CccCCCCccccccgGggGGggGGgggg
+#=GC RF ...AAAAA..AAA.....CCC..CCCC~~..c..G..GG..GG....
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.5") || die "FAIL: couldn't open $tmppfx.5 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+seq7 ~CAAAA..AAA.....CCC..CCCC....c..G..GG..GC~
+seq8 .CAAAAaaAAAaccccC-CccCCCCccccccgGggGGggGGg
+#=GC RF .AAAAA..AAA.....CCC..CCCC~~..c..G..GG..GG.
+//
+EOF
+close ALIFILE;
+
+open(LISTFILE, ">$tmppfx.list") || die "FAIL: couldn't open $tmppfx.list for writing list file";
+print LISTFILE "$tmppfx.2\n";
+print LISTFILE "$tmppfx.1\n";
+print LISTFILE "$tmppfx.3\n";
+close LISTFILE;
+
+$output = `$eslalimerge -h`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /Usage: esl-alimerge/) { die "FAIL: help output not right"; }
+
+$output = `$eslalimerge --rna $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --dna $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --amino $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --rna --list $tmppfx.list 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccc\.cccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+system("$eslalimerge --rna -o $tmppfx.out $tmppfx.1 $tmppfx.2 > /dev/null");
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+$output = `cat $tmppfx.out`;
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+system("$eslalimerge --rna -v -o $tmppfx.out $tmppfx.1 $tmppfx.2 > /dev/null");
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+# don't worry about checking verbose output printed to stdout
+$output = `cat $tmppfx.out`;
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+$output = `cat $tmppfx.out`;
+
+$output = `$eslalimerge --rna --outformat pfam $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --rna --outformat a2m $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /aaAAAAAAAACccCCCCCCCGGGGGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /AAAAAaaAAAaccccC-CccCCCCccccCcgGggGGggGGg/) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --rna --outformat psiblast $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /aaAAAA-A--AAA-----Cc-cCC--CCCC----C--G--GG--GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /--AAAA-AaaAAAaccccC----CccCCCCccccCcgGggGGggGGg---/) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --rna --outformat afa $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --rna --rfonly $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /AAAAAAAACCCCCCCCGGGGG/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /AAAAAAAAC\-CCCCCcGGGGG/) { die "FAIL: alignments merged incorrectly"; }
+
+# test that hmmer3 fragment annotation is correctly handled (this WILL NOT WORK currently with --small!)
+$output = `$eslalimerge --rna $tmppfx.4 $tmppfx.5 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /~~~CAAAA..AAA.....CCC..CCCC....c..G..GG..GC~~~/) { die "FAIL: alignments merged incorrectly"; }
+
+# repeat all the same tests (except a2m and psiblast output) but now in small memory mode
+$output = `$eslalimerge --small --rna $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --small --dna $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --small --amino $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --small --rna --list $tmppfx.list 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccc\.cccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+system("$eslalimerge --small --rna -o $tmppfx.out $tmppfx.1 $tmppfx.2 > /dev/null");
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+$output = `cat $tmppfx.out`;
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+system("$eslalimerge --small --rna -v -o $tmppfx.out $tmppfx.1 $tmppfx.2 > /dev/null");
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+# don't worry about checking verbose output printed to stdout
+$output = `cat $tmppfx.out`;
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+$output = `cat $tmppfx.out`;
+
+$output = `$eslalimerge --small --rna --outformat pfam $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /aaAAAA\.A\.\.AAA\.\.\.\.\.Cc\.cCC\.\.CCCC\.\.\.\.C\.\.G\.\.GG\.\.GGgggg/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /\.\.AAAA\.AaaAAAaccccC\.\.\.\-CccCCCCccccccgGggGGggGGg\.\.\./) { die "FAIL: alignments merged incorrectly"; }
+
+$output = `$eslalimerge --small --rna --rfonly $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-alimerge failed unexpectedly"; }
+if ($output !~ /sequence 3 is the best/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /AAAAAAAACCCCCCCCGGGGG/) { die "FAIL: alignments merged incorrectly"; }
+if ($output !~ /AAAAAAAAC\-CCCCCcGGGGG/) { die "FAIL: alignments merged incorrectly"; }
+
+
+print "ok\n";
+unlink "$tmppfx.1";
+unlink "$tmppfx.2";
+unlink "$tmppfx.3";
+unlink "$tmppfx.4";
+unlink "$tmppfx.5";
+unlink "$tmppfx.list";
+unlink "$tmppfx.out";
+exit 0;
diff --git a/miniapps/esl-alimerge.man b/miniapps/esl-alimerge.man
new file mode 100644
index 0000000..b664d59
--- /dev/null
+++ b/miniapps/esl-alimerge.man
@@ -0,0 +1,179 @@
+.TH "esl-alimerge" 1 "@EASEL_DATE@" "Easel @PACKAGE_VERSION@" "Easel miniapps"
+
+.SH NAME
+.TP
+esl-alimerge - merge alignments based on their reference (RF) annotation
+
+.SH SYNOPSIS
+
+.TP
+Merge two alignment files:
+.B esl-alimerge
+.I [options]
+.I alifile1
+.I alifile2
+
+.TP
+Merge many alignment files listed in a file:
+.B esl-alimerge --list
+.I [options]
+.I listfile
+
+.SH DESCRIPTION
+
+.B esl-alimerge
+reads more than one input alignments, merges them into a single
+alignment and outputs it.
+
+The input alignments must all be in Stockholm format. All alignments
+must have reference ('#=GC RF') annotation. Further, the RF annotation
+must be identical in all alignments once gap characters in the RF
+annotation ('.','-','_') have been removed. This requirement allows
+alignments with different numbers of total columns to be merged
+together based on consistent RF annotation, such as alignments created
+by successive runs of the
+.B cmalign
+program of the INFERNAL package using the same CM. Columns which have
+a gap character in the RF annotation are called 'insert' columns.
+
+All sequence data in all input alignments will be included in the
+output alignment regardless of the output format (see
+.B --outformat
+option below). However, sequences in the merged alignment will usually
+contain more gaps ('.') than they did in their respective input
+alignments. This is because
+.B esl-alimerge
+must add 100% gap columns to each individual input alignment so that
+insert columns in the other input alignments can be accomodated in the
+merged alignment.
+
+If the output format is Stockholm or Pfam, annotation will be
+transferred from the input alignments to the merged alignment as
+follows. All per-sequence ('#=GS') and per-residue ('#=GR') annotation
+is transferred. Per-file ('#=GF') annotation is transferred if it is
+present and identical in all alignments. Per-column ('#=GC') annotation is
+transferred if it is present and identical in all alignments once all
+insert positions have been removed
+.B and
+the '#=GC' annotation includes zero non-gap characters in insert
+columns.
+
+With the
+.BI --list " <f>"
+option,
+.I <f>
+is a file listing alignment files to merge. In the list file, blank
+lines and lines that start with '#' (comments) are ignored. Each data
+line contains a single word: the name of an alignment file to be
+merged. All alignments in each file will be merged.
+
+With the
+.B --small
+option,
+.B esl-alimerge
+will operate in memory saving mode and the required RAM for the merge
+will be minimal (should be only a few Mb) and independent of the
+alignment sizes. To use
+.B --small,
+all alignments must be in Pfam format (non-interleaved, 1
+line/sequence Stockholm format). You can reformat alignments to Pfam
+using the
+.B esl-reformat
+Easel miniapp. Without
+.B --small
+the required RAM will be equal to roughly the size of the final merged
+alignment file which will necessarily be at least the summed size of
+all of the input alignment files to be merged and sometimes several
+times larger. If you're merging large alignments or you're
+experiencing very slow performance of
+.B esl-alimerge,
+try reformatting to Pfam and using
+.B --small.
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.BI -o " <f>"
+Output merged alignment to file
+.I <f>
+instead of to
+.I stdout.
+
+.TP
+.B -v
+Be verbose; print information on the size of the alignments being merged,
+and the annotation transferred to the merged alignment to
+.I stdout.
+This option can only be used in combination with the
+.B -o
+option (so that the printed info doesn't corrupt the output alignment
+file).
+
+.TP
+.B --small
+Operate in memory saving mode. Required RAM will be independent of the
+sizes of the alignments to merge, instead of roughly the size of the
+eventual merged alignment. When enabled, all alignments must be in
+Pfam Stockholm (non-interleaved 1 line/seq) format (see
+esl-reformat) and the output alignment will be in Pfam format.
+
+.TP
+.B --rfonly
+Only include columns that are not gaps in the GC RF annotation in the
+merged alignment.
+
+.TP
+.BI --outformat "<s> "
+Specify that the output alignment be format
+.I <s>.
+Choices for
+.I <s>
+are: 'stockholm', 'pfam', 'a2m', 'psiblast', 'afa'. By default
+alignments are output in Stockholm format. 'pfam' is a special case of
+Stockholm format in which each sequence is placed on a single line,
+nstead of being interleaved; 'afa' is aligned FASTA.
+
+.TP
+.BI --rna
+Specify that the input alignments are RNA alignments. By default
+.B esl-alimerge
+will try to autodetect the alphabet, but if the alignment is sufficiently
+small it may be ambiguous. This option defines the alphabet as RNA.
+
+.TP
+.BI --dna
+Specify that the input alignments are DNA alignments.
+
+.TP
+.BI --amino
+Specify that the input alignments are protein alignments.
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/miniapps/esl-alipid.c b/miniapps/esl-alipid.c
new file mode 100644
index 0000000..bb503b6
--- /dev/null
+++ b/miniapps/esl-alipid.c
@@ -0,0 +1,92 @@
+/* Calculates pairwise %id for all aligned sequence pairs in MSA
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_distance.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "--informat", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "specify the input MSA file is in format <s>", 0 },
+ { "--outformat", eslARG_STRING, "Clustal", NULL, NULL, NULL, NULL, NULL, "write the output MSA in format <s>", 0 },
+ { "--noheader", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "no header", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use DNA alphabet", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use RNA alphabet", 0 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use protein alphabet", 0 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+static char banner[] = "calculate pairwise %id for each seq pair in an MSA";
+static char usage[] = "[options] <msafile>";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *msafile = esl_opt_GetArg(go, 1);
+ ESL_ALPHABET *abc = NULL;
+ int infmt = eslMSAFILE_UNKNOWN;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ FILE *ofp = stdout;
+ int nali = 0;
+ int namewidth;
+ double pid;
+ double pmatch;
+ int nid, n;
+ int nmatch, m;
+ int i,j;
+ int header = TRUE;
+ int status;
+
+ /* allow user to assert the input MSA alphabet */
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+
+ if (esl_opt_GetBoolean(go, "--noheader")) header = FALSE;
+
+ /* allow user to assert the input MSA format */
+ if (esl_opt_IsOn(go, "--informat") &&
+ (infmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--informat"))) == eslMSAFILE_UNKNOWN)
+ esl_fatal("%s is not a valid MSA file format for --informat", esl_opt_GetString(go, "--informat"));
+
+ /* digital open */
+ if ( ( status = esl_msafile_Open(&abc, msafile, NULL, infmt, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+ if (header) fprintf(ofp, "# seqname1 seqname2 %%id nid denomid %%match nmatch denommatch\n");
+ while ((status = esl_msafile_Read(afp, &msa)) == eslOK)
+ {
+ nali++;
+
+ namewidth = esl_str_GetMaxWidth(msa->sqname, msa->nseq);
+
+ for (i = 0; i < msa->nseq; i++)
+ for (j = i+1; j < msa->nseq; j++)
+ {
+ esl_dst_XPairId (abc, msa->ax[i], msa->ax[j], &pid, &nid, &n);
+ esl_dst_XPairMatch(abc, msa->ax[i], msa->ax[j], &pmatch, &nmatch, &m);
+ fprintf(ofp, "%-*s %-*s %6.2f %6d %6d %6.2f %6d %6d\n", namewidth, msa->sqname[i], namewidth, msa->sqname[j], pid*100.0, nid, n, pmatch*100.0, nmatch, m);
+ }
+
+ esl_msa_Destroy(msa);
+ }
+ if (nali == 0 || status != eslEOF) esl_msafile_ReadFailure(afp, status);
+
+ esl_msafile_Close(afp);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/miniapps/esl-alipid.man b/miniapps/esl-alipid.man
new file mode 100644
index 0000000..d7f8407
--- /dev/null
+++ b/miniapps/esl-alipid.man
@@ -0,0 +1,106 @@
+.TH "esl-alipid" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-alipid - calculate pairwise percent identities for all sequence pairs in an MSA
+
+.SH SYNOPSIS
+
+.B esl-alipid
+.I [options]
+.I msafile
+
+.SH DESCRIPTION
+
+.pp
+.B esl-alistat
+calculates the pairwise percent identity of each sequence pair in
+in the MSA(s) in
+.I msafile.
+For each sequence pair, it outputs a line of
+.I <sqname1> <sqname2> <pid> <nid> <n>
+where
+.I <pid>
+is the percent identity,
+.I <nid>
+is the number of identical aligned pairs,
+and
+.I <n>
+is the denominator used for the calculation: the
+shorter of the two (unaligned) sequence lengths.
+
+.pp
+If
+.I msafile
+is - (a single dash), alignment input is read from
+.I stdin.
+
+.pp
+The
+.I msafile
+may be in any of several formats.
+The format is autodetected by default.
+See the
+.B --informat
+option to assert an input format.
+
+.pp
+The
+.I msafile
+must contain either protein or DNA/RNA sequences.
+The nucleic or amino alphabet will be autodetected by default.
+See the
+.B --amino,
+.B --dna,
+or
+.B --rna
+options to assert an alphabet.
+
+.pp
+Only canonical residues are counted toward
+.I <nid>
+and
+.I <n>.
+Degenerate residue codes are not counted.
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.BI --informat " <s>"
+Specify that the input alignment is in
+.I <s>
+format. Valid format strings include
+"stockholm", "pfam", "a2m", "phylip", "phylips",
+"psiblast", "selex", "afa", "clustal", and "clustallike".
+
+.TP
+.B --amino
+Assert that the
+.I msafile
+contains protein sequences.
+
+.TP
+.B --dna
+Assert that the
+.I msafile
+contains DNA sequences.
+
+.TP
+.B --rna
+Assert that the
+.I msafile
+contains RNA sequences.
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
+
diff --git a/miniapps/esl-alirev.c b/miniapps/esl-alirev.c
new file mode 100644
index 0000000..e3e5d38
--- /dev/null
+++ b/miniapps/esl-alirev.c
@@ -0,0 +1,87 @@
+
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_vectorops.h"
+
+#include <stdio.h>
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "--informat", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "specify the input MSA file is in format <s>", 0 },
+ { "--outformat", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "write the output MSA in format <s>", 0 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use DNA alphabet", 0 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use RNA alphabet", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msafile>";
+static char banner[] = "reverse complement multiple sequence alignment(s)";
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage);
+ char *msafile = esl_opt_GetArg(go, 1);
+ int infmt = eslMSAFILE_UNKNOWN;
+ int outfmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int nali = 0;
+ int status;
+
+ /* Alphabet specification from cmdline? */
+ if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+
+ /* MSA input file format from cmdline? */
+ if (esl_opt_IsOn(go, "--informat") &&
+ (infmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--informat"))) == eslMSAFILE_UNKNOWN)
+ esl_fatal("Your --informat, %s, is not a recognized multiple alignment file format",
+ esl_opt_GetString(go, "--informat"));
+
+ /* Open in digital mode. Autoguess alphabet, format if we haven't set them already. */
+ if (( status = esl_msafile_Open(&abc, msafile, NULL, infmt, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+ /* Reverse complementation only makes sense for alphabets that have abc->complement set */
+ if (! abc->complement)
+ esl_fatal("File %s appears to use the %s alphabet.\nThat alphabet cannot be reverse complemented.\n",
+ msafile, esl_abc_DecodeType(abc->type));
+
+ /* Set the output format, if requested.
+ * By default, write in the same format we read in.
+ * Remember, it's afp->format that gets set; infmt was only a hint.
+ */
+ if ( esl_opt_IsOn(go, "--outformat") )
+ {
+ outfmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--outformat"));
+ if (outfmt == eslMSAFILE_UNKNOWN)
+ esl_fatal("Your --outformat, %s, is not a recognized multiple alignment file format.\n",
+ esl_opt_GetString(go, "--outformat"));
+ }
+ else outfmt = afp->format;
+
+ /* Here we go. */
+ while ((status = esl_msafile_Read(afp, &msa)) == eslOK)
+ {
+ nali++;
+
+ status = esl_msa_ReverseComplement(msa);
+
+ esl_msafile_Write(stdout, msa, outfmt);
+
+ esl_msa_Destroy(msa);
+ }
+ if (nali == 0) esl_fatal("No alignments found in input file %s\n", msafile);
+ if (status != eslEOF) esl_msafile_ReadFailure(afp, status);
+
+ esl_msafile_Close(afp);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ return 0;
+}
diff --git a/miniapps/esl-alirev.man b/miniapps/esl-alirev.man
new file mode 100644
index 0000000..1d138f2
--- /dev/null
+++ b/miniapps/esl-alirev.man
@@ -0,0 +1,127 @@
+.TH "esl-alirev" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-alirev - reverse complement a multiple alignment
+
+
+.SH SYNOPSIS
+
+.B esl-alirev
+.I [options]
+.I msafile
+
+
+.SH DESCRIPTION
+
+.pp
+.B esl-alirev
+reads the multiple alignment in
+.I msafile
+and outputs its reverse complement to
+.I stdout.
+
+.pp
+An example of where you might need to do this is when you've
+downloaded a chunk of multiway genomic alignment from one of the
+genome browsers, but your RNA of interest is on the opposite strand.
+
+.pp
+Any per-column and per-residue annotation lines are reversed as well,
+including Stockholm format and old SELEX format annotations.
+Annotations that Easel recognizes as secondary structure annotation (a
+consensus structure line, individual secondary structure lines) will
+be "reverse complemented" to preserve proper bracketing orders: for
+example, ...<<<...>>> is reverse complemented to <<<...>>>..., not
+simply reversed to >>>...<<<..., which would be wrong.
+
+.pp
+If
+.I msafile
+is - (a single dash), alignment input is read from
+.I stdin.
+
+.pp
+The
+.I msafile
+may be in any of several formats.
+The format is autodetected by default.
+See the
+.B --informat
+option to assert an input format.
+
+.pp
+By default the output alignment is written in the same format as the
+input alignment. See the
+.B --outformat
+option to use a different output format.
+
+.pp
+Because the alignment is parsed into Easel's digital internal
+representation, the output alignment may differ in certain details
+from the original alignment; these details should be inconsequential
+but may catch your eye. One is that if you have a reference annotation
+line, Easel's output will put consensus residues in upper case,
+nonconsensus (inserted) residues in lower case. Another is that the
+headers for some formats, such as Clustal format, are written with an
+arbitrary version number -- so you may find yourself revcomping an
+alignment in "MUSCLE (3.7) multiple sequence alignment" format and it
+could come out claiming to be a "CLUSTAL 2.1 multiple sequence
+alignment", just because Easel writes all of its Clustal format
+alignment files with that header.
+
+.pp
+The
+.I msafile
+must contain nucleic acid sequences (DNA or RNA).
+The alphabet will be autodetected by default.
+See the
+.B --dna
+or
+.B --rna
+options to assert an alphabet.
+
+
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.BI --informat " <s>"
+Specify that the input alignment is in
+.I <s>
+format. Valid format strings include
+"stockholm", "pfam", "a2m", "phylip", "phylips",
+"psiblast", "selex", "afa", "clustal", and "clustallike".
+
+.TP
+.BI --outformat " <s>"
+Write the output alignment in
+.I <s>
+format. Valid format strings include
+"stockholm", "pfam", "a2m", "phylip", "phylips",
+"psiblast", "selex", "afa", "clustal", and "clustallike".
+
+.TP
+.B --dna
+Assert that the
+.I msafile
+contains DNA sequences.
+
+.TP
+.B --rna
+Assert that the
+.I msafile
+contains RNA sequences.
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-alistat.c b/miniapps/esl-alistat.c
new file mode 100644
index 0000000..70a33e9
--- /dev/null
+++ b/miniapps/esl-alistat.c
@@ -0,0 +1,1153 @@
+/* Show statistics about a multiple sequence alignment file or MSA database.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile2.h"
+#include "esl_distance.h"
+#include "esl_vectorops.h"
+#include "esl_wuss.h"
+
+static char banner[] = "show summary statistics for a multiple sequence alignment file";
+static char usage[] = "[options] <msafile>";
+
+static int dump_infocontent_info(FILE *fp, ESL_ALPHABET *abc, double **abc_ct, int use_weights, int nali, int64_t alen, int nseq, int *i_am_rf, char *msa_name, char *alifile, char *errbuf);
+static int dump_residue_info(FILE *fp, ESL_ALPHABET *abc, double **abc_ct, int use_weights, int nali, int64_t alen, int nseq, int *i_am_rf, char *msa_name, char *alifile, char *errbuf);
+static int dump_posterior_column_info(FILE *fp, double **pp_ct, int use_weights, int nali, int64_t alen, int nseq, int *i_am_rf, char *msa_name, char *alifile, char *errbuf);
+static int dump_posterior_sequence_info(FILE *fp, ESL_MSA *msa, int nali, char *alifile, char *errbuf);
+static int dump_insert_info(FILE *fp, ESL_MSA *msa, int use_weights, int nali, int *i_am_rf, char *alifile, char *errbuf);
+static int dump_column_residue_counts(FILE *fp, ESL_ALPHABET *abc, double **abc_ct, int do_ambig, int use_weights, int nali, int64_t alen, int nseq, char *msa_name, char *alifile, char *errbuf);
+static int dump_basepair_counts(FILE *fp, ESL_MSA *msa, ESL_ALPHABET *abc, double ***bp_ct, int use_weights, int nali, int nseq, char *msa_name, char *alifile, char *errbuf);
+static int map_rfpos_to_apos(ESL_MSA *msa, ESL_ALPHABET *abc, char *errbuf, int64_t alen, int **ret_i_am_rf, int **ret_rf2a_map, int *ret_rflen);
+static int get_pp_idx(ESL_ALPHABET *abc, char ppchar);
+static int count_msa(ESL_MSA *msa, char *errbuf, int nali, int no_ambig, int use_weights, double ***ret_abc_ct, double ****ret_bp_ct, double ***ret_pp_ct);
+static int check_msa_weights(ESL_MSA *msa);
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-1", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "use tabular output, one line per alignment", 1 },
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL,NULL, NULL, "specify that input file is in format <s>", 1 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--dna,--rna", "<msafile> contains protein alignments", 1 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--amino,--rna", "<msafile> contains DNA alignments", 1 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--amino,--dna", "<msafile> contains RNA alignments", 1 },
+ { "--small", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "use minimal RAM (RAM usage will be independent of aln size)", 2 },
+ /* options for optional output files */
+ { "--list", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "output list of sequence names in alignment(s) to file <f>", 3 },
+ { "--icinfo", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "print info on information content alignment column", 3 },
+ { "--rinfo", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "print info on # of non-gap residues in each column to <f>", 3 },
+ { "--pcinfo", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "print per-column posterior probability info to <f>", 3 },
+ { "--psinfo", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, "--small", "print per-sequence posterior probability info to <f>", 3 },
+ { "--iinfo", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, "--small", "print info on # of insertions b/t all non-gap RF cols to <f>", 3 },
+ { "--cinfo", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "print per-column residue counts to <f>", 3 },
+ { "--noambig", eslARG_NONE, NULL, NULL, NULL, NULL,NULL, "--small", "with --cinfo, do not count ambiguous residues", 3 },
+ { "--bpinfo", eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, "--small", "print per-column base-pair counts to <f>", 3 },
+ { "--weight", eslARG_NONE, NULL, NULL, NULL, NULL,NULL, "--small", "with --*info files, weight counts using WT annotation from msa", 3 },
+ { "--stall", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "arrest after start: for debugging under gdb", 99 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ ESL_ALPHABET *abc = NULL; /* biological alphabet */
+ char *alifile = NULL; /* alignment file name */
+ int fmt = eslMSAFILE_UNKNOWN; /* format code for alifile */
+ ESL_MSAFILE *afp = NULL; /* open msa file */
+ ESL_MSAFILE2 *old_afp = NULL; /* open msa file, legacy (--small) */
+ ESL_MSA *msa = NULL; /* one multiple sequence alignment */
+ int nali; /* number of alignments read */
+ int i; /* counter over seqs */
+ int64_t alen; /* alignment length */
+ int nseq; /* number of sequences in the msa */
+ int64_t rlen; /* a raw (unaligned) seq length */
+ int64_t small, large; /* smallest, largest sequence */
+ int64_t nres; /* total # of residues in msa */
+ double avgid; /* average fractional pair id */
+ int max_comparisons; /* maximum # comparisons for avg id */
+ int do_stall; /* used to stall when debugging */
+ double **abc_ct = NULL; /* [0..msa->alen-1][0..abc->K] number of each residue at each position (abc->K is gap) */
+ double ***bp_ct = NULL; /* [0..msa->alen-1][0..abc->Kp-1][0..abc->Kp-1] per (non-pknotted) consensus basepair *
+ * count of each possible basepair over all seqs basepairs are indexed by 'i' the minimum *
+ * of 'i:j' for a pair between i and j, where i < j. */
+ double **pp_ct = NULL; /* [0..msa->alen-1][0..11], count of each posterior probability (PP) code, over all sequences, gap is 11 */
+ int *i_am_rf = NULL; /* [0..i..msa->alen-1]: TRUE if pos i is non-gap RF posn, if msa->rf == NULL remains NULL */
+ int *rf2a_map = NULL; /* [0..rfpos..rflen-1] = apos,
+ * apos is the alignment position (0..msa->alen-1) that
+ * is non-gap RF position rfpos+1 (for rfpos in 0..rflen-1) */
+ int rflen = -1; /* nongap RF length */
+ char errbuf[eslERRBUFSIZE];
+ int status; /* easel return code */
+
+ /* optional output files */
+ FILE *iinfofp = NULL; /* output file for --iinfo */
+ FILE *pcinfofp = NULL; /* output file for --pcinfo */
+ FILE *psinfofp = NULL; /* output file for --psinfo */
+ FILE *rinfofp = NULL; /* output file for --rinfo */
+ FILE *icinfofp = NULL; /* output file for --icinfo */
+ FILE *listfp = NULL; /* output file for --list */
+ FILE *cinfofp = NULL; /* output file for --cinfo */
+ FILE *bpinfofp = NULL; /* output file for --bpinfo */
+ int use_weights; /* TRUE if --weight, reported weighted counts (using msa->wgt) to all output files */
+ int weights_exist; /* TRUE if at least one msa->wgt value differs from 1.0, FALSE if not (or if msa->wgt==NULL) */
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ puts("\n small memory mode, requires --amino,--dna, or --rna and --informat pfam:");
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80);
+ puts("\n optional output files:");
+ esl_opt_DisplayHelp(stdout, go, 3, 2, 80);
+ exit(0);
+ }
+
+ if (esl_opt_ArgNumber(go) != 1)
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ alifile = esl_opt_GetArg(go, 1);
+
+ if (esl_opt_IsOn(go, "--informat") &&
+ (fmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--informat"))) == eslMSAFILE_UNKNOWN)
+ esl_fatal("%s is not a valid input sequence file format for --informat", esl_opt_GetString(go, "--informat"));
+
+ if (esl_opt_GetBoolean(go, "--small") && fmt != eslMSAFILE_PFAM) esl_fatal("--small requires --informat pfam\n");
+
+ max_comparisons = 1000;
+
+ do_stall = esl_opt_GetBoolean(go, "--stall"); /* a stall point for attaching gdb */
+ while (do_stall);
+
+ /***********************************************
+ * Open the MSA file; determine alphabet; set for digital input
+ ***********************************************/
+
+ if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+
+ /* We'd like to get rid of the legacy msafile interface, but it
+ * includes small memory functionality for Pfam format which we have
+ * to replace first. For now, use both interfaces, new and legacy
+ */
+ if ( esl_opt_GetBoolean(go, "--small") )
+ {
+ if (! abc) esl_fatal("--small requires one of --amino, --dna, --rna be specified.");
+
+ status = esl_msafile2_OpenDigital(abc, alifile, NULL, &old_afp);
+ if (status == eslENOTFOUND) esl_fatal("Alignment file %s doesn't exist or is not readable\n", alifile);
+ else if (status == eslEFORMAT) esl_fatal("Couldn't determine format of alignment %s\n", alifile);
+ else if (status != eslOK) esl_fatal("Alignment file open failed with error %d\n", status);
+ }
+ else
+ {
+ if ( (status = esl_msafile_Open(&abc, alifile, NULL, fmt, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+ }
+
+ /**************************************
+ * Open optional output files, as nec *
+ **************************************/
+ /* determine name for first list file, if nec */
+ if( esl_opt_IsOn(go, "--list")) {
+ if ((listfp = fopen(esl_opt_GetString(go, "--list"), "w")) == NULL)
+ esl_fatal("Failed to open --list output file %s\n", esl_opt_GetString(go, "--list"));
+ }
+ if( esl_opt_IsOn(go, "--icinfo")) {
+ if ((icinfofp = fopen(esl_opt_GetString(go, "--icinfo"), "w")) == NULL)
+ esl_fatal("Failed to open --icinfo output file %s\n", esl_opt_GetString(go, "--icinfo"));
+ }
+ if( esl_opt_IsOn(go, "--rinfo")) {
+ if ((rinfofp = fopen(esl_opt_GetString(go, "--rinfo"), "w")) == NULL)
+ esl_fatal("Failed to open --rinfo output file %s\n", esl_opt_GetString(go, "--rinfo"));
+ }
+ if( esl_opt_IsOn(go, "--pcinfo")) {
+ if ((pcinfofp = fopen(esl_opt_GetString(go, "--pcinfo"), "w")) == NULL)
+ esl_fatal("Failed to open --pcinfo output file %s\n", esl_opt_GetString(go, "--pcinfo"));
+ }
+ if( esl_opt_IsOn(go, "--psinfo")) {
+ if ((psinfofp = fopen(esl_opt_GetString(go, "--psinfo"), "w")) == NULL)
+ esl_fatal("Failed to open --psinfo output file %s\n", esl_opt_GetString(go, "--psinfo"));
+ }
+ if( esl_opt_IsOn(go, "--iinfo")) {
+ if ((iinfofp = fopen(esl_opt_GetString(go, "--iinfo"), "w")) == NULL)
+ esl_fatal("Failed to open --iinfo output file %s\n", esl_opt_GetString(go, "--iinfo"));
+ }
+ if( esl_opt_IsOn(go, "--cinfo")) {
+ if ((cinfofp = fopen(esl_opt_GetString(go, "--cinfo"), "w")) == NULL)
+ esl_fatal("Failed to open --cinfo output file %s\n", esl_opt_GetString(go, "--cinfo"));
+ }
+ if( esl_opt_IsOn(go, "--bpinfo")) {
+ if ((bpinfofp = fopen(esl_opt_GetString(go, "--bpinfo"), "w")) == NULL)
+ esl_fatal("Failed to open --bpinfo output file %s\n", esl_opt_GetString(go, "--bpinfo"));
+ }
+
+ /***********************************************
+ * Read MSAs one at a time.
+ ***********************************************/
+
+ if (esl_opt_GetBoolean(go, "-1")) {
+ puts("#");
+ if(! esl_opt_GetBoolean(go, "--small")) {
+ printf("# %-4s %-20s %10s %7s %7s %12s %6s %6s %10s %3s\n", "idx", "name", "format", "nseq", "alen", "nres", "small", "large", "avlen", "%id");
+ printf("# %-4s %-20s %10s %7s %7s %12s %6s %6s %10s %3s\n", "----", "--------------------", "----------", "-------", "-------", "------------", "------", "------", "----------", "---");
+ }
+ else {
+ printf("# %-4s %-20s %10s %7s %7s %12s %10s\n", "idx", "name", "format", "nseq", "alen", "nres", "avlen");
+ printf("# %-4s %-20s %10s %7s %7s %12s %10s\n", "----", "--------------------", "----------", "-------", "-------", "------------", "----------");
+ }
+ }
+
+ nali = 0;
+
+ fmt = (esl_opt_GetBoolean(go, "--small") ? old_afp->format : afp->format);
+
+ while ( (status = ( esl_opt_GetBoolean(go, "--small") ?
+ esl_msafile2_ReadInfoPfam(old_afp, listfp, abc, -1, NULL, NULL, &msa, &nseq, &alen, NULL, NULL, NULL, NULL, NULL, &abc_ct, &pp_ct, NULL, NULL, NULL) :
+ esl_msafile_Read (afp, &msa))) == eslOK)
+ {
+ nali++;
+ nres = 0;
+
+ if (! esl_opt_GetBoolean(go, "--small")) {
+ nseq = msa->nseq;
+ alen = msa->alen;
+ small = large = -1;
+ for (i = 0; i < msa->nseq; i++)
+ {
+ rlen = esl_abc_dsqrlen(msa->abc, msa->ax[i]);
+ nres += rlen;
+ if (small == -1 || rlen < small) small = rlen;
+ if (large == -1 || rlen > large) large = rlen;
+ }
+
+ esl_dst_XAverageId(abc, msa->ax, msa->nseq, max_comparisons, &avgid);
+ }
+ else { /* --small invoked */
+ for(i = 0; i < alen; i++) nres += (int) esl_vec_DSum(abc_ct[i], abc->K);
+ }
+
+ if (esl_opt_GetBoolean(go, "-1"))
+ {
+ printf("%-6d %-20s %10s %7d %7" PRId64 " %12" PRId64,
+ nali,
+ msa->name,
+ esl_msafile_DecodeFormat(fmt),
+ nseq,
+ alen,
+ nres);
+ if (! esl_opt_GetBoolean(go, "--small")) {
+ printf(" %6" PRId64 " %6" PRId64 " %10.1f %3.0f\n",
+ small,
+ large,
+ (double) nres / (double) msa->nseq,
+ 100.*avgid);
+ }
+ else {
+ printf(" %10.1f\n", (double) nres / (double) nseq);
+ }
+ }
+ else
+ {
+ printf("Alignment number: %d\n", nali);
+ if (msa->name != NULL)
+ printf("Alignment name: %s\n", msa->name);
+ printf("Format: %s\n", esl_msafile_DecodeFormat(fmt));
+ printf("Number of sequences: %d\n", nseq);
+ printf("Alignment length: %" PRId64 "\n", alen);
+ printf("Total # residues: %" PRId64 "\n", nres);
+ if(! esl_opt_GetBoolean(go, "--small")) {
+ printf("Smallest: %" PRId64 "\n", small);
+ printf("Largest: %" PRId64 "\n", large);
+ }
+ printf("Average length: %.1f\n", (double) nres / (double) nseq);
+ if(! esl_opt_GetBoolean(go, "--small")) {
+ printf("Average identity: %.0f%%\n", 100.*avgid);
+ }
+ printf("//\n");
+ }
+
+ /* Dump data to optional output files, if nec */
+ if(esl_opt_IsOn(go, "--list")) {
+ if(! esl_opt_GetBoolean(go, "--small")) {
+ /* only print sequence name to list file if ! --small, else we already have in esl_msafile2_ReadInfoPfam() */
+ for(i = 0; i < msa->nseq; i++) fprintf(listfp, "%s\n", msa->sqname[i]);
+ }
+ }
+
+ /* if RF exists, get i_am_rf array[0..alen] which tells us which positions are non-gap RF positions
+ * and rf2a_map, a map of non-gap RF positions to overall alignment positions */
+ if(msa->rf != NULL) {
+ if((status = map_rfpos_to_apos(msa, abc, errbuf, alen, &i_am_rf, &rf2a_map, &rflen)) != eslOK) esl_fatal(errbuf);
+ }
+ else i_am_rf = NULL;
+
+ weights_exist = check_msa_weights(msa);
+ use_weights = (weights_exist && esl_opt_GetBoolean(go, "--weight")) ? TRUE : FALSE;
+
+ if( (! esl_opt_GetBoolean(go, "--small")) &&
+ (esl_opt_IsOn(go, "--icinfo") || esl_opt_IsOn(go, "--rinfo") || esl_opt_IsOn(go, "--pcinfo") ||
+ esl_opt_IsOn(go, "--cinfo") || esl_opt_IsOn(go, "--bpinfo"))) {
+ /* collect counts of each residue and PPs (if they exist) from the msa */
+ if(esl_opt_GetBoolean(go, "--weight") && msa->wgt == NULL) esl_fatal("--weight requires all alignments have #=GS WT annotation, but aln %d does not", nali);
+ if((status = count_msa(msa, errbuf, nali,
+ esl_opt_GetBoolean(go, "--noambig"), /* ignore ambiguous residues? */
+ esl_opt_GetBoolean(go, "--weight"), /* use msa->wgt sequence weights? */
+ &abc_ct,
+ ((bpinfofp != NULL && msa->ss_cons != NULL) ? &bp_ct : NULL), /* get basepair counts? */
+ (msa->pp != NULL ? &pp_ct : NULL))) /* get PP counts? */
+ != eslOK) esl_fatal(errbuf);
+ }
+
+ if( esl_opt_IsOn(go, "--icinfo")) {
+ if((status = dump_infocontent_info(icinfofp, abc, abc_ct, use_weights, nali, alen, nseq, i_am_rf, msa->name, alifile, errbuf) != eslOK)) esl_fatal(errbuf);
+ }
+ if( esl_opt_IsOn(go, "--rinfo")) {
+ if((status = dump_residue_info(rinfofp, abc, abc_ct, use_weights, nali, alen, nseq, i_am_rf, msa->name, alifile, errbuf) != eslOK)) esl_fatal(errbuf);
+ }
+ if(esl_opt_IsOn(go, "--pcinfo")) {
+ if(pp_ct == NULL) esl_fatal("Error: --pcinfo requires all alignments have #=GR PP annotation, but alignment %d does not", nali);
+ if((status = dump_posterior_column_info(pcinfofp, pp_ct, use_weights, nali, alen, nseq, i_am_rf, msa->name, alifile, errbuf) != eslOK)) esl_fatal(errbuf);
+ }
+ if(esl_opt_IsOn(go, "--psinfo")) {
+ if(msa->pp == NULL) esl_fatal("Error: --psinfo requires all alignments have #=GR PP annotation, but alignment %d does not", nali);
+ if((status = dump_posterior_sequence_info(psinfofp, msa, nali, alifile, errbuf) != eslOK)) esl_fatal(errbuf);
+ }
+ if( esl_opt_IsOn(go, "--iinfo")) {
+ if(msa->rf == NULL) esl_fatal("--iinfo requires all alignments have #=GC RF annotation, but alignment %d does not", nali);
+ if(esl_opt_GetBoolean(go, "--weight") && msa->wgt == NULL) esl_fatal("--weight requires all alignments have #=GS WT annotation, but aln %d does not", nali);
+ if((status = dump_insert_info(iinfofp, msa, use_weights, nali, i_am_rf, alifile, errbuf) != eslOK)) esl_fatal(errbuf);
+ }
+ if( esl_opt_IsOn(go, "--cinfo")) {
+ if((status = dump_column_residue_counts(cinfofp, abc, abc_ct, esl_opt_GetBoolean(go, "--noambig"), use_weights, nali, alen, nseq, msa->name, alifile, errbuf) != eslOK)) esl_fatal(errbuf);
+ }
+ if( esl_opt_IsOn(go, "--bpinfo")) {
+ if(msa->ss_cons == NULL) esl_fatal("--bpinfo requires all alignments have #=GC SS_cons annotation, but alignment %d does not", nali);
+ if((status = dump_basepair_counts(bpinfofp, msa, abc, bp_ct, use_weights, nali, nseq, msa->name, alifile, errbuf) != eslOK)) esl_fatal(errbuf);
+ }
+
+ esl_msa_Destroy(msa);
+ if(abc_ct != NULL) { esl_Free2D((void **) abc_ct, alen); abc_ct = NULL; }
+ if(bp_ct != NULL) { esl_Free3D((void ***) bp_ct, alen, abc->Kp); bp_ct = NULL; }
+ if(pp_ct != NULL) { esl_Free2D((void **) pp_ct, alen); pp_ct = NULL; }
+ if(i_am_rf != NULL) { free(i_am_rf); i_am_rf = NULL; }
+ if(rf2a_map != NULL) { free(rf2a_map); rf2a_map = NULL; }
+ }
+
+ /* If an msa read failed, we've dropped out to here with an informative status code.
+ * we have to handle failures from new vs. legacy msa parsing differently
+ */
+ if (esl_opt_GetBoolean(go, "--small"))
+ {
+ if (status == eslEFORMAT) esl_fatal("Alignment file parse error, line %d of file %s:\n%s\nOffending line is:\n%s\n", old_afp->linenumber, old_afp->fname, old_afp->errbuf, old_afp->buf);
+ else if (status != eslEOF) esl_fatal("Alignment file read failed with error code %d\n", status);
+ else if (nali == 0) esl_fatal("No alignments found in file %s\n", alifile);
+ }
+ else
+ {
+ if (nali == 0 || status != eslEOF) esl_msafile_ReadFailure(afp, status);
+ }
+
+ /* Cleanup, normal return
+ */
+ if(listfp != NULL) {
+ fclose(listfp);
+ printf("# List of sequences in %d alignment(s) saved to file %s\n", nali, esl_opt_GetString(go, "--list"));
+ }
+ if(icinfofp != NULL) {
+ fclose(icinfofp);
+ printf("# Information content data saved to file %s.\n", esl_opt_GetString(go, "--icinfo"));
+ }
+ if(rinfofp != NULL) {
+ fclose(rinfofp);
+ printf("# Residue data saved to file %s.\n", esl_opt_GetString(go, "--rinfo"));
+ }
+ if(pcinfofp != NULL) {
+ fclose(pcinfofp);
+ printf("# Per-column posterior probability data saved to file %s.\n", esl_opt_GetString(go, "--pcinfo"));
+ }
+ if(psinfofp != NULL) {
+ fclose(psinfofp);
+ printf("# Per-sequence posterior probability data saved to file %s.\n", esl_opt_GetString(go, "--psinfo"));
+ }
+ if(iinfofp != NULL) {
+ printf("# Insert data saved to file %s.\n", esl_opt_GetString(go, "--iinfo"));
+ fclose(iinfofp);
+ }
+ if(cinfofp != NULL) {
+ printf("# Per-column counts data saved to file %s.\n", esl_opt_GetString(go, "--cinfo"));
+ fclose(cinfofp);
+ }
+ if(bpinfofp != NULL) {
+ printf("# Per-column basepair counts data saved to file %s.\n", esl_opt_GetString(go, "--bpinfo"));
+ fclose(bpinfofp);
+ }
+
+
+ if (afp) esl_msafile_Close(afp);
+ if (old_afp) esl_msafile2_Close(old_afp);
+ esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+/* count_msa()
+ *
+ * Given an msa, count residues, and optionally base pairs and
+ * posterior probabilities per column and store them in <ret_abc_ct>
+ * and <ret_pp_ct>.
+ *
+ * <ret_abc_ct> [0..apos..alen-1][0..abc->K]:
+ * - per position count of each symbol in alphabet over all seqs.
+ *
+ * <ret_bp_ct> [0..apos..alen-1][0..abc->Kp-1][0..abc->Kp-1]
+ * - per (non-pknotted) consensus basepair count of each possible basepair
+ * over all seqs basepairs are indexed by 'i' the minimum of 'i:j' for a
+ * pair between i and j, where i < j. Note that non-canonicals and
+ * gaps and the like are all stored independently.
+ *
+ * <ret_pp_ct> [0..apos..alen-1][0..11]
+ * - per position count of each posterior probability code over all seqs.
+ *
+ * A 'gap' has a looser definition than in esl_abc here, esl_abc's gap,
+ * missing residues and nonresidues are all considered 'gaps' here.
+ *
+ * If we encounter an error, we return non-eslOK status and fill
+ * errbuf with error message.
+ *
+ * Returns eslOK upon success.
+ */
+static int count_msa(ESL_MSA *msa, char *errbuf, int nali, int no_ambig, int use_weights, double ***ret_abc_ct, double ****ret_bp_ct, double ***ret_pp_ct)
+{
+ int status;
+ double **abc_ct = NULL;
+ double ***bp_ct = NULL;
+ int apos, rpos, i, x;
+ int nppvals = 12; /* '0'-'9' = 0-9, '*' = 10, gap = '11' */
+ double **pp_ct = NULL; /* [0..alen-1][0..nppvals-1] per position count of each possible PP char over all seqs */
+ int ppidx;
+ /* variables related to getting bp counts */
+ int *ct = NULL; /* 0..alen-1 base pair partners array for current sequence */
+ char *ss_nopseudo = NULL; /* no-pseudoknot version of structure */
+ double seqwt; /* weight of current sequence, always 1.0 if !use_weights */
+
+ if(! (msa->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINVAL, errbuf, "count_msa() contract violation, MSA is not digitized");
+ if(use_weights && msa->wgt == NULL) ESL_FAIL(eslEINCOMPAT, errbuf, "count_msa(): use_weights==TRUE but msa->wgt == NULL");
+
+ /* allocate pp_ct array, if nec */
+ if(ret_pp_ct != NULL) {
+ if(msa->pp == NULL) ESL_FAIL(eslEINVAL, errbuf, "count_msa() ret_pp_ct != NULL, but msa->pp is NULL");
+ ESL_ALLOC(pp_ct, sizeof(double *) * msa->alen);
+ for(apos = 0; apos < msa->alen; apos++) {
+ ESL_ALLOC(pp_ct[apos], sizeof(double) * nppvals);
+ esl_vec_DSet(pp_ct[apos], nppvals, 0.);
+ }
+ }
+
+ /* allocate and initialize bp_ct, if nec */
+ if(ret_bp_ct != NULL) {
+ ESL_ALLOC(bp_ct, sizeof(double **) * msa->alen);
+ /* get ct array which defines the consensus base pairs */
+ ESL_ALLOC(ct, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(ss_nopseudo, sizeof(char) * (msa->alen+1));
+ esl_wuss_nopseudo(msa->ss_cons, ss_nopseudo);
+ if ((status = esl_wuss2ct(ss_nopseudo, msa->alen, ct)) != eslOK) ESL_XFAIL(status, errbuf, "Consensus structure string is inconsistent.");
+ for(apos = 0; apos < msa->alen; apos++) {
+ /* careful ct is indexed 1..alen, not 0..alen-1 */
+ if(ct[(apos+1)] > (apos+1)) { /* apos+1 is an 'i' in an i:j pair, where i < j */
+ ESL_ALLOC(bp_ct[apos], sizeof(double *) * (msa->abc->Kp));
+ for(x = 0; x < msa->abc->Kp; x++) {
+ ESL_ALLOC(bp_ct[apos][x], sizeof(double) * (msa->abc->Kp));
+ esl_vec_DSet(bp_ct[apos][x], msa->abc->Kp, 0.);
+ }
+ }
+ else { /* apos+1 is not an 'i' in an i:j pair, where i < j, set to NULL */
+ bp_ct[apos] = NULL;
+ }
+ }
+ }
+
+ ESL_ALLOC(abc_ct, sizeof(double *) * msa->alen);
+ for(apos = 0; apos < msa->alen; apos++) {
+ ESL_ALLOC(abc_ct[apos], sizeof(double) * (msa->abc->K+1));
+ esl_vec_DSet(abc_ct[apos], (msa->abc->K+1), 0.);
+ }
+
+ for(i = 0; i < msa->nseq; i++) {
+ seqwt = use_weights ? msa->wgt[i] : 1.0;
+
+ for(apos = 0; apos < msa->alen; apos++) { /* update appropriate abc count, careful, ax ranges from 1..msa->alen (but abc_ct is 0..msa->alen-1) */
+ if((! no_ambig) || (! esl_abc_XIsDegenerate(msa->abc, msa->ax[i][apos+1]))) { /* skip ambiguities (degenerate residues) if no_ambig is TRUE */
+ if((status = esl_abc_DCount(msa->abc, abc_ct[apos], msa->ax[i][apos+1], seqwt)) != eslOK) ESL_XFAIL(status, errbuf, "problem counting residue %d of seq %d", apos, i);
+ }
+ }
+
+ /* get bp counts, if nec */
+ if(bp_ct != NULL) {
+ for(apos = 0; apos < msa->alen; apos++) { /* update appropriate abc count, careful, ax ranges from 1..msa->alen (but abc_ct is 0..msa->alen-1) */
+ if(bp_ct[apos] != NULL) { /* our flag for whether position (apos+1) is an 'i' in an i:j pair where i < j */
+ rpos = ct[apos+1] - 1; /* ct is indexed 1..alen */
+ bp_ct[apos][msa->ax[i][apos+1]][msa->ax[i][rpos+1]] += seqwt;
+ }
+ }
+ }
+
+ /* get PP counts, if nec */
+ if(pp_ct != NULL) {
+ if(msa->pp[i] != NULL) {
+ for(apos = 0; apos < msa->alen; apos++) {
+ if((! no_ambig) || (! esl_abc_XIsDegenerate(msa->abc, msa->ax[i][apos+1]))) { /* skip ambiguities (degenerate residues) if no_ambig is TRUE */
+ if((ppidx = get_pp_idx(msa->abc, msa->pp[i][apos])) == -1) ESL_XFAIL(eslEFORMAT, errbuf, "bad #=GR PP char: %c", msa->pp[i][apos]);
+ pp_ct[apos][ppidx] += seqwt;
+ }
+ }
+ }
+ }
+ }
+
+ *ret_abc_ct = abc_ct;
+ if (ret_bp_ct) *ret_bp_ct = bp_ct; /* we only allocated bp_ct if ret_bp_ct != NULL */
+ if (ret_pp_ct) *ret_pp_ct = pp_ct; /* we only allocated pp_ct if ret_pp_ct != NULL */
+
+ if (ss_nopseudo) free(ss_nopseudo);
+ if (ct) free(ct);
+ return eslOK;
+
+ ERROR:
+ if (abc_ct) esl_Free2D((void **) abc_ct, msa->alen);
+ if (bp_ct) esl_Free3D((void ***) bp_ct, msa->alen, msa->abc->Kp);
+ if (pp_ct) esl_Free2D((void **) pp_ct, msa->alen);
+ if (ss_nopseudo) free(ss_nopseudo);
+ if (ct) free(ct);
+
+ *ret_abc_ct = NULL;
+ if (ret_bp_ct) *ret_bp_ct = NULL;
+ if (ret_pp_ct) *ret_pp_ct = NULL;
+ return status;
+}
+
+
+/* get_pp_idx
+ *
+ * Given a #=GR PP or #=GC PP_cons character, return the appropriate index
+ * in a pp_ct[] vector.
+ * '0' return 0;
+ * '1' return 1;
+ * '2' return 2;
+ * '3' return 3;
+ * '4' return 4;
+ * '5' return 5;
+ * '6' return 6;
+ * '7' return 7;
+ * '8' return 8;
+ * '9' return 9;
+ * '*' return 10;
+ * gap return 11;
+ *
+ * Anything else (including missing or nonresidue) return -1;
+ */
+static int get_pp_idx(ESL_ALPHABET *abc, char ppchar)
+{
+ if(esl_abc_CIsGap(abc, ppchar)) return 11;
+ if(ppchar == '*') return 10;
+ if(ppchar == '9') return 9;
+ if(ppchar == '8') return 8;
+ if(ppchar == '7') return 7;
+ if(ppchar == '6') return 6;
+ if(ppchar == '5') return 5;
+ if(ppchar == '4') return 4;
+ if(ppchar == '3') return 3;
+ if(ppchar == '2') return 2;
+ if(ppchar == '1') return 1;
+ if(ppchar == '0') return 0;
+ return -1;
+}
+
+
+/* dump_infocontent_info
+ *
+ * Given an MSA with RF annotation, dump information content per column data to
+ * an open output file.
+ */
+static int dump_infocontent_info(FILE *fp, ESL_ALPHABET *abc, double **abc_ct, int use_weights, int nali, int64_t alen, int nseq, int *i_am_rf, char *msa_name, char *alifile, char *errbuf)
+{
+ int status;
+ int apos, rfpos;
+ double bg_ent;
+ double *bg = NULL;
+ double *abc_freq = NULL;
+ double nnongap;
+
+ ESL_ALLOC(bg, sizeof(double) * abc->K);
+ esl_vec_DSet(bg, abc->K, 1./(abc->K));
+ bg_ent = esl_vec_DEntropy(bg, abc->K);
+ free(bg);
+
+ ESL_ALLOC(abc_freq, sizeof(double) * abc->K);
+
+
+ fprintf(fp, "# Information content per column (bits):\n");
+ fprintf(fp, "# Alignment file: %s\n", alifile);
+ fprintf(fp, "# Alignment idx: %d\n", nali);
+ if(msa_name != NULL) { fprintf(fp, "# Alignment name: %s\n", msa_name); }
+ fprintf(fp, "# Number of sequences: %d\n", nseq);
+ if(use_weights) { fprintf(fp, "# IMPORTANT: Counts are weighted based on sequence weights in alignment file.\n"); }
+ else { fprintf(fp, "# Sequence weights from alignment were ignored (if they existed).\n"); }
+ fprintf(fp, "#\n");
+
+ if(i_am_rf != NULL) {
+ fprintf(fp, "# %7s %7s %10s %10s\n", "rfpos", "alnpos", "freqnongap", "info(bits)");
+ fprintf(fp, "# %7s %7s %10s %10s\n", "-------", "-------", "----------", "----------");
+ }
+ else {
+ fprintf(fp, "# %7s %10s %10s\n", "alnpos", "freqnongap", "info(bits)");
+ fprintf(fp, "# %7s %10s %10s\n", "-------", "----------", "----------");
+ }
+
+ rfpos = 0;
+ for(apos = 0; apos < alen; apos++) {
+ if(i_am_rf != NULL) {
+ if(i_am_rf[apos]) {
+ fprintf(fp, " %7d", rfpos+1);
+ rfpos++;
+ }
+ else {
+ fprintf(fp, " %7s", "-");
+ }
+ }
+ nnongap = esl_vec_DSum(abc_ct[apos], abc->K);
+ esl_vec_DCopy(abc_ct[apos], abc->K, abc_freq);
+ esl_vec_DNorm(abc_freq, abc->K);
+ fprintf(fp, " %7d %10.8f %10.8f\n", apos+1,
+ nnongap / (nnongap + abc_ct[apos][abc->K]),
+ (bg_ent - esl_vec_DEntropy(abc_freq, abc->K)));
+ }
+ fprintf(fp, "//\n");
+
+ if(abc_freq != NULL) free(abc_freq);
+
+ return eslOK;
+
+ ERROR:
+ ESL_FAIL(eslEINVAL, errbuf, "out of memory");
+ return status; /* NEVERREACHED */
+}
+
+
+/* dump_residue_info
+ *
+ * Given an MSA, print out the number of sequences with
+ * a non-gap residue in each column of the alignment.
+ */
+static int dump_residue_info(FILE *fp, ESL_ALPHABET *abc, double **abc_ct, int use_weights, int nali, int64_t alen, int nseq, int *i_am_rf, char *msa_name, char *alifile, char *errbuf)
+{
+ int apos, rfpos;
+ double rct, gct;
+
+ fprintf(fp, "# Insert information:\n");
+ fprintf(fp, "# Alignment file: %s\n", alifile);
+ fprintf(fp, "# Alignment idx: %d\n", nali);
+ if(msa_name != NULL) { fprintf(fp, "# Alignment name: %s\n", msa_name); }
+ fprintf(fp, "# Number of sequences: %d\n", nseq);
+ if(use_weights) { fprintf(fp, "# IMPORTANT: Counts are weighted based on sequence weights in alignment file.\n"); }
+ else { fprintf(fp, "# Sequence weights from alignment were ignored (if they existed).\n"); }
+ fprintf(fp, "#\n");
+ if(i_am_rf != NULL) {
+ fprintf(fp, "# %7s %7s %10s %8s %10s %8s\n", "rfpos", "alnpos", "numres", "freqres", "numgap", "freqgap");
+ fprintf(fp, "# %7s %7s %10s %8s %10s %8s\n", "-------", "-------", "----------", "--------", "----------", "--------");
+ }
+ else {
+ fprintf(fp, "# %7s %10s %8s %10s %8s\n", "alnpos", "numres", "freqres", "numgap", "freqgap");
+ fprintf(fp, "# %7s %10s %8s %10s %8s\n", "-------", "----------", "--------", "----------", "--------");
+ }
+
+ rfpos = 0;
+ for(apos = 0; apos < alen; apos++) {
+ rct = esl_vec_DSum(abc_ct[apos], abc->K);
+ gct = abc_ct[apos][abc->K];
+ if(i_am_rf != NULL) {
+ if(i_am_rf[apos]) {
+ fprintf(fp, " %7d", rfpos+1);
+ rfpos++;
+ }
+ else {
+ fprintf(fp, " %7s", "-");
+ }
+ }
+ fprintf(fp, " %7d %10.1f %8.6f %10.1f %8.6f\n", apos+1, rct, rct / (float) nseq, gct, gct / (float) nseq);
+ }
+ fprintf(fp, "//\n");
+
+ return eslOK;
+}
+
+/* dump_posterior_column_info
+ *
+ * Dump per-column posterior probability data to a file.
+ *
+ */
+static int dump_posterior_column_info(FILE *fp, double **pp_ct, int use_weights, int nali, int64_t alen, int nseq, int *i_am_rf, char *msa_name, char *alifile, char *errbuf)
+{
+ int p,apos; /* counters over sequences, columns of MSA */
+ int nppvals = 12;
+ int rfpos;
+ double nnongap;
+ double sum;
+ float ppavgA[11];
+ char ppstring[12] = "0123456789*.";
+
+ ppavgA[0] = 0.025;
+ ppavgA[1] = 0.10;
+ ppavgA[2] = 0.20;
+ ppavgA[3] = 0.30;
+ ppavgA[4] = 0.40;
+ ppavgA[5] = 0.50;
+ ppavgA[6] = 0.60;
+ ppavgA[7] = 0.70;
+ ppavgA[8] = 0.80;
+ ppavgA[9] = 0.90;
+ ppavgA[10] = 0.975;
+
+ fprintf(fp, "# Posterior probability stats per column:\n");
+ fprintf(fp, "# Alignment file: %s\n", alifile);
+ fprintf(fp, "# Alignment idx: %d\n", nali);
+ if(msa_name != NULL) { fprintf(fp, "# Alignment name: %s\n", msa_name); }
+ fprintf(fp, "# Number of sequences: %d\n", nseq);
+ if(use_weights) { fprintf(fp, "# IMPORTANT: Counts are weighted based on sequence weights in alignment file.\n"); }
+ else { fprintf(fp, "# Sequence weights from alignment were ignored (if they existed).\n"); }
+ fprintf(fp, "#\n");
+
+ fprintf(fp, "# %6s", "alnpos");
+ if(i_am_rf != NULL) fprintf(fp, " %6s", "rfpos");
+ fprintf(fp, " %9s", "nnongap");
+ for(p = 0; p < nppvals; p++) {
+ fprintf(fp, " %9c", ppstring[p]);
+ }
+ fprintf(fp, " %9s\n", "avgPP");
+
+ fprintf(fp, "# %6s %6s %9s", "------", "------", "---------");
+ for(p = 0; p < nppvals; p++) {
+ fprintf(fp, " %9s", "---------");
+ }
+ fprintf(fp, " %9s\n", "---------");
+
+ rfpos = 1;
+ for(apos = 0; apos < alen; apos++) {
+ sum = 0;
+ fprintf(fp, " %6d", apos+1);
+ if(i_am_rf != NULL) {
+ if(i_am_rf[apos]) fprintf(fp, " %6d", rfpos++);
+ else fprintf(fp, " %6s", "-");
+ }
+ nnongap = esl_vec_DSum(pp_ct[apos], 11);
+ fprintf(fp, " %9.1f", nnongap);
+ for(p = 0; p < nppvals; p++) {
+ fprintf(fp, " %9.1f", pp_ct[apos][p]);
+ if(p <= 10) sum += pp_ct[apos][p] * ppavgA[p];
+ }
+ fprintf(fp, " %.5f\n", sum / nnongap);
+ }
+ fprintf(fp, "//\n");
+
+ return eslOK;
+}
+
+
+/* dump_posterior_sequence_info
+ *
+ * Dump per-sequence posterior probability data to a file.
+ *
+ */
+static int dump_posterior_sequence_info(FILE *fp, ESL_MSA *msa, int nali, char *alifile, char *errbuf)
+{
+ int i,p,apos; /* counters over sequences, columns of MSA */
+ int ppidx;
+ int nppvals = 12;
+ int nnongap;
+ double sum;
+ float ppavgA[11];
+ char ppstring[12] = "0123456789*.";
+ int seq_pp_ct[12];
+
+ ppavgA[0] = 0.025;
+ ppavgA[1] = 0.10;
+ ppavgA[2] = 0.20;
+ ppavgA[3] = 0.30;
+ ppavgA[4] = 0.40;
+ ppavgA[5] = 0.50;
+ ppavgA[6] = 0.60;
+ ppavgA[7] = 0.70;
+ ppavgA[8] = 0.80;
+ ppavgA[9] = 0.90;
+ ppavgA[10] = 0.975;
+
+ fprintf(fp, "# Posterior probability stats per sequence:\n");
+ fprintf(fp, "# Alignment file: %s\n", alifile);
+ fprintf(fp, "# Alignment idx: %d\n", nali);
+ if(msa->name != NULL) { fprintf(fp, "# Alignment name: %s\n", msa->name); }
+ fprintf(fp, "# Number of sequences: %d\n", msa->nseq);
+ fprintf(fp, "# %7s %-40s %7s", "seqidx", "seqname", "nnongap");
+ for(p = 0; p < nppvals-1; p++) { /* don't include gaps in per-sequence output */
+ fprintf(fp, " %7c", ppstring[p]);
+ }
+ fprintf(fp, " %7s\n", "avgPP");
+
+ fprintf(fp, "# %7s %40s %7s", "-------", "----------------------------------------", "-------");
+ for(p = 0; p < nppvals-1; p++) { /* don't include gaps in per-sequence output */
+ fprintf(fp, " %7s", "-------");
+ }
+ fprintf(fp, " %7s\n", "-------");
+
+ for(i = 0; i < msa->nseq; i++) {
+ if(msa->pp[i] != NULL) {
+ fprintf(fp, " %7d %-40s", i+1, msa->sqname[i]);
+ sum = 0.;
+ esl_vec_ISet(seq_pp_ct, nppvals, 0);
+ for(apos = 0; apos < msa->alen; apos++) {
+ if((ppidx = get_pp_idx(msa->abc, msa->pp[i][apos])) == -1) ESL_FAIL(eslEFORMAT, errbuf, "bad #=GR PP char: %c", msa->pp[i][apos]);
+ seq_pp_ct[ppidx]++;
+ }
+ nnongap = esl_vec_ISum(seq_pp_ct, 11);
+ fprintf(fp, " %7d", nnongap);
+ for(p = 0; p < nppvals-1; p++) { /* don't include gaps in per-sequence output */
+ fprintf(fp, " %7d", seq_pp_ct[p]);
+ if(p <= 10) sum += (float) seq_pp_ct[p] * ppavgA[p];
+ }
+ fprintf(fp, " %.5f\n", sum / (float) nnongap);
+ }
+ }
+ fprintf(fp, "//\n");
+
+ return eslOK;
+}
+
+
+/* dump_insert_info
+ *
+ * Given an MSA with RF annotation, print out information about how many 'insertions' come
+ * after each non-gap RF column (consensus column).
+ */
+static int dump_insert_info(FILE *fp, ESL_MSA *msa, int use_weights, int nali, int *i_am_rf, char *alifile, char *errbuf)
+{
+ double **ict = NULL;
+ double *total_ict = NULL;
+ int apos, rfpos;
+ int i;
+ int rflen;
+ double seqwt; /* weight of current sequence */
+ double nseq;
+ int status;
+
+ /* contract checks */
+ if (! (msa->flags & eslMSA_DIGITAL)) ESL_FAIL(eslEINVAL, errbuf, "in dump_insert_info(), msa must be digitized.");
+ if (msa->rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "No #=GC RF markup in alignment, it is needed for --iinfo.");
+ if (i_am_rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "internal error, dump_insert_info() i_am_rf is NULL.");
+ if (use_weights && msa->wgt == NULL) ESL_FAIL(eslEINCOMPAT, errbuf, "dump_insert_info(): use_weights==TRUE but msa->wgt == NULL");
+
+ ESL_ALLOC(total_ict, sizeof(double) * (msa->alen+2));
+ esl_vec_DSet(total_ict, (msa->alen+2), 0.);
+
+ ESL_ALLOC(ict, sizeof(double *) * (msa->alen+2));
+ for (i = 0; i <= msa->alen; i++) ict[i] = NULL;
+
+ for (i = 0; i <= msa->alen; i++)
+ {
+ ESL_ALLOC(ict[i], sizeof(double) * (msa->nseq));
+ esl_vec_DSet(ict[i], (msa->nseq), 0.);
+ }
+
+ fprintf(fp, "# Insert information:\n");
+ fprintf(fp, "# Alignment file: %s\n", alifile);
+ fprintf(fp, "# Alignment idx: %d\n", nali);
+ if (msa->name) { fprintf(fp, "# Alignment name: %s\n", msa->name); }
+ fprintf(fp, "# rfpos is the nongap RF position after which insertions occur\n");
+ fprintf(fp, "# An rfpos of '0' indicates insertions before the first nongap RF position\n");
+ fprintf(fp, "# Number of sequences: %d\n", msa->nseq);
+ if (use_weights) { fprintf(fp, "# IMPORTANT: Counts are weighted based on sequence weights in alignment file.\n"); }
+ else { fprintf(fp, "# Sequence weights from alignment were ignored (if they existed).\n"); }
+ fprintf(fp, "#\n");
+
+ fprintf(fp, "# %8s %10s %8s %8s\n", "rfpos", "nseq w/ins", "freq ins", "avg len");
+ fprintf(fp, "# %8s %10s %8s %8s\n", "--------", "----------", "--------", "--------");
+
+ rflen = 0;
+ for(apos = 1; apos <= msa->alen; apos++)
+ if (i_am_rf[apos-1]) rflen++;
+
+ rfpos = 0;
+ for (apos = 1; apos <= msa->alen; apos++)
+ {
+ if (i_am_rf[apos-1]) rfpos++;
+ else {
+ for(i = 0; i < msa->nseq; i++) {
+ seqwt = use_weights ? msa->wgt[i] : 1.0;
+ if(esl_abc_XIsResidue(msa->abc, msa->ax[i][apos])) {
+ ict[rfpos][i]++;
+ total_ict[rfpos] += seqwt;
+ }
+ }
+ }
+ }
+ rflen = rfpos;
+
+ for(rfpos = 0; rfpos <= rflen; rfpos++)
+ {
+ nseq = 0.;
+ for(i = 0; i < msa->nseq; i++) {
+ if(ict[rfpos][i] >= 1) {
+ seqwt = use_weights ? msa->wgt[i] : 1.0;
+ nseq += seqwt;
+ }
+ }
+ if(nseq > 0.)
+ fprintf(fp, " %8d %10.1f %8.6f %8.3f\n", rfpos, nseq, nseq / (float) msa->nseq, ((float) total_ict[rfpos] / (float) nseq));
+ }
+ fprintf(fp, "//\n");
+
+ for(i = 0; i <= msa->alen; i++) free(ict[i]);
+ free(ict);
+ free(total_ict);
+ return eslOK;
+
+ ERROR:
+ if (ict) {
+ for (i = 0; i <= msa->alen; i++)
+ if (ict[i]) free(ict[i]);
+ free(ict);
+ }
+ if (total_ict) free(total_ict);
+ return status;
+}
+
+/* dump_column_residue_counts
+ *
+ * Dump per-column residue counts from abc_ct[][] to
+ * an open output file.
+ *
+ * abc_ct: [0..msa->alen-1][0..abc->K] number of each residue at each position (abc->K is gap)
+ */
+static int dump_column_residue_counts(FILE *fp, ESL_ALPHABET *abc, double **abc_ct, int no_ambig, int use_weights, int nali, int64_t alen, int nseq, char *msa_name, char *alifile, char *errbuf)
+{
+ int apos;
+ int i;
+
+ fprintf(fp, "# Per column residue counts:\n");
+ fprintf(fp, "# Alignment file: %s\n", alifile);
+ fprintf(fp, "# Alignment idx: %d\n", nali);
+ if(msa_name != NULL) { fprintf(fp, "# Alignment name: %s\n", msa_name); }
+ fprintf(fp, "# Number of sequences: %d\n", nseq);
+ if(no_ambig) {
+ fprintf(fp, "# Ambiguous residues were not counted.\n");
+ }
+ else {
+ if(abc->type == eslRNA) fprintf(fp, "# Ambiguities were averaged (e.g. 1 'N' = 0.25 'A', 0.25 'C', 0.25 'G' and 0.25 'U')\n");
+ if(abc->type == eslDNA) fprintf(fp, "# Ambiguities were averaged (e.g. 1 'N' = 0.25 'A', 0.25 'C', 0.25 'G' and 0.25 'T')\n");
+ if(abc->type == eslAMINO) fprintf(fp, "# Ambiguities were averaged (e.g. 1 'X' = 0.05 each for all 20 amino acids\n");
+ }
+ if(use_weights) { fprintf(fp, "# IMPORTANT: Counts are weighted based on sequence weights in alignment file.\n"); }
+ else { fprintf(fp, "# Sequence weights from alignment were ignored (if they existed).\n"); }
+ fprintf(fp, "#\n");
+
+ fprintf(fp, "# %7s", "alnpos");
+ for(i = 0; i < abc->K; i++) fprintf(fp, " %c ", abc->sym[i]);
+ fprintf(fp, "\n");
+
+ fprintf(fp, "# %7s", "-------");
+ for(i = 0; i < abc->K; i++) fprintf(fp, " %7s", "-------");
+ fprintf(fp, "\n");
+
+ for(apos = 0; apos < alen; apos++) {
+ fprintf(fp, " %7d", apos+1);
+ for(i = 0; i < abc->K; i++) fprintf(fp, " %7.1f", abc_ct[apos][i]);
+ fprintf(fp, "\n");
+ }
+ fprintf(fp, "//\n");
+
+ return eslOK;
+
+}
+
+/* dump_basepair_counts
+ *
+ * Dump per-basepaired-column basepair counts from bp_ct[][][] to
+ * an open output file. Only pairs involving canonical residues
+ * are printed. (i.e. for RNA: AA,AC,AG,AU, CA,CC,CG,CU, GA,GC,GG,GU,
+ * UA,UC,UG,UU).
+ *
+ * <bp_ct> [0..apos..alen-1][0..abc->Kp-1][0..abc->Kp-1]
+ * - per (non-pknotted) consensus basepair count of each possible basepair
+ * over all seqs basepairs are indexed by 'i' the minimum of 'i:j' for a
+ * pair between i and j, where i < j. Note that non-canonicals and
+ * gaps and the like are all stored independently.
+ */
+static int dump_basepair_counts(FILE *fp, ESL_MSA *msa, ESL_ALPHABET *abc, double ***bp_ct, int use_weights, int nali, int nseq, char *msa_name, char *alifile, char *errbuf)
+{
+ int status;
+ int apos, rpos;
+ int i, j;
+
+ int *ct = NULL; /* 0..msa->alen-1 base pair partners array for current sequence */
+ char *ss_nopseudo = NULL; /* no-pseudoknot version of structure */
+
+ /* get ct array which defines the consensus base pairs */
+ ESL_ALLOC(ct, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(ss_nopseudo, sizeof(char) * (msa->alen+1));
+ esl_wuss_nopseudo(msa->ss_cons, ss_nopseudo);
+ if ((status = esl_wuss2ct(ss_nopseudo, msa->alen, ct)) != eslOK) ESL_FAIL(status, errbuf, "Consensus structure string is inconsistent.");
+
+ fprintf(fp, "# Per-column basepair counts:\n");
+ fprintf(fp, "# Alignment file: %s\n", alifile);
+ fprintf(fp, "# Alignment idx: %d\n", nali);
+ if(msa_name != NULL) { fprintf(fp, "# Alignment name: %s\n", msa_name); }
+ fprintf(fp, "# Number of sequences: %d\n", nseq);
+ fprintf(fp, "# Only basepairs involving two canonical (non-degenerate) residues were counted.\n");
+ if(use_weights) { fprintf(fp, "# IMPORTANT: Counts are weighted based on sequence weights in alignment file.\n"); }
+ else { fprintf(fp, "# Sequence weights from alignment were ignored (if they existed).\n"); }
+ fprintf(fp, "#\n");
+
+ fprintf(fp, "# %7s %7s", "lpos", "rpos");
+ for(i = 0; i < abc->K; i++) {
+ for(j = 0; j < abc->K; j++) {
+ fprintf(fp, " %c%c ", abc->sym[i], abc->sym[j]);
+ }
+ }
+ fprintf(fp, "\n");
+
+ fprintf(fp, "# %7s %7s", "-------", "-------");
+ for(i = 0; i < abc->K; i++) {
+ for(j = 0; j < abc->K; j++) {
+ fprintf(fp, " %6s", "------");
+ }
+ }
+ fprintf(fp, "\n");
+
+ for(apos = 0; apos < msa->alen; apos++) {
+ if(bp_ct[apos] != NULL) {
+ rpos = ct[(apos+1)];
+ fprintf(fp, " %7d %7d", apos+1, rpos);
+ for(i = 0; i < abc->K; i++) {
+ for(j = 0; j < abc->K; j++) {
+ fprintf(fp, " %6d", (int) bp_ct[apos][i][j]);
+ }
+ }
+ fprintf(fp, "\n");
+ }
+ }
+ fprintf(fp, "//\n");
+
+ if(ss_nopseudo != NULL) free(ss_nopseudo);
+ if(ct != NULL) free(ct);
+ return eslOK;
+
+ ERROR:
+ if(ss_nopseudo != NULL) free(ss_nopseudo);
+ if(ct != NULL) free(ct);
+ ESL_FAIL(status, errbuf, "Error, out of memory while dumping basepair info");
+}
+
+/* map_rfpos_to_apos
+ *
+ * Given an MSA, determine the alignment position of each
+ * non-gap RF (reference) position. The abc is only necessary
+ * for defining gap characters.
+ *
+ * rf2a_map[0..rfpos..rflen-1] = apos, apos is the alignment position (0..msa->alen-1) that
+ * is non-gap RF position rfpos+1 (for rfpos in 0..rflen-1)
+ */
+static int map_rfpos_to_apos(ESL_MSA *msa, ESL_ALPHABET *abc, char *errbuf, int64_t alen, int **ret_i_am_rf, int **ret_rf2a_map, int *ret_rflen)
+{
+ int status;
+ int rflen = 0;
+ int *rf2a_map = NULL;
+ int *i_am_rf = NULL;
+ int rfpos = 0;
+ int apos = 0;
+
+ /* contract check */
+ if(msa->rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "Error, trying to map RF positions to alignment positions, but msa->rf is NULL.");
+
+ /* count non-gap RF columns */
+ for(apos = 0; apos < alen; apos++) {
+ if((! esl_abc_CIsGap(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsMissing(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsNonresidue(abc, msa->rf[apos])))
+ {
+ rflen++;
+ /* I don't use esl_abc_CIsResidue() b/c that would return FALSE for 'x' with RNA and DNA */
+ }
+ }
+ /* build map */
+ ESL_ALLOC(i_am_rf, sizeof(int) * alen);
+ ESL_ALLOC(rf2a_map, sizeof(int) * rflen);
+ for(apos = 0; apos < alen; apos++) {
+ if((! esl_abc_CIsGap(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsMissing(abc, msa->rf[apos])) &&
+ (! esl_abc_CIsNonresidue(abc, msa->rf[apos]))) {
+ i_am_rf[apos] = TRUE;
+ rf2a_map[rfpos++] = apos;
+ }
+ else {
+ i_am_rf[apos] = FALSE;
+ }
+ }
+ *ret_i_am_rf = i_am_rf;
+ *ret_rf2a_map = rf2a_map;
+ *ret_rflen = rflen;
+ return eslOK;
+
+ ERROR:
+ if(i_am_rf != NULL) free(i_am_rf);
+ if(rf2a_map != NULL) free(rf2a_map);
+ ESL_FAIL(status, errbuf, "Error, out of memory while mapping RF positions to alignment positions.");
+}
+
+/* check_msa_weights
+ *
+ * Given an MSA, check if it has any weight that is
+ * different from 1.0. If yes return TRUE, if not
+ * return FALSE. If it does not have weights return
+ * FALSE.
+ */
+static int check_msa_weights(ESL_MSA *msa)
+{
+ int i;
+
+ if(msa->wgt == NULL) return FALSE;
+ for(i = 0; i < msa->nseq; i++) {
+ if (esl_FCompare(msa->wgt[i], 1.0, eslSMALLX1) != eslOK) return TRUE;
+ }
+ return FALSE;
+}
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/miniapps/esl-alistat.itest.pl b/miniapps/esl-alistat.itest.pl
new file mode 100755
index 0000000..c59da9a
--- /dev/null
+++ b/miniapps/esl-alistat.itest.pl
@@ -0,0 +1,233 @@
+#! /usr/bin/perl
+
+# Integrated test of the esl-alistat miniapp.
+#
+# Usage: ./esl-alistat.itest.pl <esl-alistat binary> <tmpfile prefix>
+# Example: ./esl-alistat.itest.pl ./esl-alistat foo
+#
+# EPN, Tue Feb 2 13:19:44 2010
+
+$eslalistat= shift;
+$tmppfx = shift;
+
+if (! -x "$eslalistat") { die "FAIL: didn't find esl-alistat binary $eslalistat"; }
+
+open(ALIFILE, ">$tmppfx.stk") || die "FAIL: couldn't open $tmppfx.stk for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+seq1 aaAAAA..AAAA...Cc.cCCCCCC.C..GGGGGgggg
+#=GR seq1 PP 5789**..**88...*9.9****88.7..776543210
+seq2 ..AAAAa.AAAAaacCcccCCCCCCcCccGGGGG....
+#=GR seq2 PP ..********************************....
+seq3 ..AAAA..AAAA...C...CCCCCC.C..GGGG-....
+#=GR seq3 PP ..5555..4*44...3...888888.8..8899.....
+#=GC SS_cons ...............<...<<<<......>>>>>....
+#=GC PP_cons ..789*..8877...8...****99.8..99998....
+#=GC RF ..AAAA..AAAA...C...CCCCCC.c..GGGGG....
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.dbl.stk") || die "FAIL: couldn't open $tmppfx.stk for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GS seq1 WT 1.5
+#=GS seq2 WT 1.0
+#=GS seq3 WT 0.5
+seq1 aaAAAA..AAAA...Cc.cCCCCCC.C..GGGGGgggg
+#=GR seq1 PP 5789**..**88...*9.9****88.7..776543210
+seq2 ..AAAAa.AAAAaacCcccCCCCCCcCccGGGGG....
+#=GR seq2 PP ..********************************....
+seq3 ..AAAA..AAAA...C...CCCCCC.C..GGGG-....
+#=GR seq3 PP ..5555..4*44...3...888888.8..8899.....
+#=GC SS_cons ...............<...<<<<......>>>>>....
+#=GC PP_cons ..789*..8877...8...****99.8..99998....
+#=GC RF ..AAAA..AAAA...C...CCCCCC.c..GGGGG....
+//
+# STOCKHOLM 1.0
+seq1 aaA
+#=GR seq1 PP 578
+seq2 ..A
+#=GR seq2 PP ..*
+#=GC SS_cons ...
+#=GC RF ..A
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.afa") || die "FAIL: couldn't open $tmppfx.afa for writing alifile";
+print ALIFILE << "EOF";
+>seq1
+aaAAAA..AAAA...Cc.cCCCCCC.C..GGGGGgggg
+>seq2
+..AAAAa.AAAAaacCcccCCCCCCcCccGGGGG....
+>seq3
+..AAAA..AAAA...C...CCCCCC.C..GGGG-....
+EOF
+close ALIFILE;
+
+$output = `$eslalistat -h`;
+if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly"; }
+if ($output !~ /Usage: esl-alistat/) { die "FAIL: help output not right"; }
+
+# We do 2 runs of most tests, with and without --small
+$smallA[0] = "";
+$smallA[1] = "--small --informat pfam";
+
+for($pass = 0; $pass < 2; $pass++) {
+ $pass2write = $pass+1;
+
+ $output = `$eslalistat $smallA[$pass] --rna $tmppfx.stk 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ if ($output !~ /Alignment length: 38/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average length: 26.7/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($pass == 0) {
+ if ($output !~ /Format: Stockholm/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average identity: 93\%/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /Format: Pfam/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalistat $smallA[$pass] --dna $tmppfx.stk 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ if ($output !~ /Alignment length: 38/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average length: 26.7/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($pass == 0) {
+ if ($output !~ /Format: Stockholm/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average identity: 93\%/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /Format: Pfam/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalistat $smallA[$pass] --amino $tmppfx.stk 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ if ($output !~ /Alignment length: 38/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average length: 26.7/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($pass == 0) {
+ if ($output !~ /Format: Stockholm/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average identity: 93\%/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /Format: Pfam/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+
+ if($pass == 0) {
+ $output = `$eslalistat $smallA[$pass] --informat afa --rna $tmppfx.afa 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ if ($output !~ /Format: aligned FASTA/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Alignment length: 38/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average length: 26.7/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average identity: 93\%/) { die "FAIL: alignments compared incorrectly on pass $pass2write"; }
+ }
+
+ $output = `$eslalistat $smallA[$pass] -1 --rna $tmppfx.stk 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ if ($pass == 0) {
+ if ($output !~ /Stockholm 3 38 80 20 31 26.7 93/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /Pfam 3 38 80 26.7/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+
+ # test a file with 2 alignments
+ $output = `$eslalistat $smallA[$pass] --rna $tmppfx.dbl.stk 2>&1`;
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ if ($output !~ /Alignment length: 38/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average length: 26.7/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Alignment number: 2/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average length: 2.0/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($pass == 0) {
+ if ($output !~ /Format: Stockholm/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if ($output !~ /Average identity: 93\%/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+ else {
+ if ($output !~ /Format: Pfam/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+
+ # test output file options
+ system("$eslalistat --icinfo $tmppfx.ic $smallA[$pass] --rna $tmppfx.dbl.stk > /dev/null");
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ $output = `cat $tmppfx.ic`;
+ if($output !~ /5 9 1.0\d+ 2.0\d+/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if($output !~ /\# Alignment idx: 2/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+
+ system("$eslalistat --rinfo $tmppfx.r $smallA[$pass] --rna $tmppfx.dbl.stk > /dev/null");
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ $output = `cat $tmppfx.r`;
+ if($output !~ /21 34 2.0 0.66\d+ 1.0 0.33\d+/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if($output !~ /\# Alignment idx: 2/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+
+ system("$eslalistat --pcinfo $tmppfx.pc $smallA[$pass] --rna $tmppfx.dbl.stk > /dev/null");
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ $output = `cat $tmppfx.pc`;
+ if($output !~ /31\s+18\s+3.0\s+0.0\s+0.0\s+0.0\s+0.0\s+0.0\s+0.0\s+0.0\s+1.0\s+1.0\s+0.0\s+1.0\s+0.0\s+0.82\d+/) {
+ die "FAIL: alignment statistics calculated incorrectly on pass $pass2write";
+ }
+ if($output !~ /\# Alignment idx: 2/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+
+ system("$eslalistat --list $tmppfx.list $smallA[$pass] --rna $tmppfx.dbl.stk > /dev/null");
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ $output = `cat $tmppfx.list`;
+ if($output !~ /seq2.+seq2/s) { die "FAIL: alignment lists created incorrectly on pass $pass2write"; }
+ if($output !~ /seq3/) { die "FAIL: alignment lists created incorrectly on pass $pass2write"; }
+
+ if($pass == 0) { # these are incompatible with --small
+ system("$eslalistat --psinfo $tmppfx.ps $smallA[$pass] --rna $tmppfx.dbl.stk > /dev/null");
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /seq3 20 0 0 0 1 3 4 0 0 9 2 1 0.67\d+/) {
+ die "FAIL: alignment statistics calculated incorrectly on pass $pass2write";
+ }
+ if($output !~ /seq2 1 0 0 0 0 0 0 0 0 0 0 1 0.97\d+/) {
+ die "FAIL: alignment statistics calculated incorrectly on pass $pass2write";
+ }
+
+ system("$eslalistat --iinfo $tmppfx.i $smallA[$pass] --rna $tmppfx.dbl.stk > /dev/null");
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ $output = `cat $tmppfx.i`;
+ if($output !~ /16\s+1.0\s+0.33\d+\s+2.0/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if($output !~ /\# Alignment idx: 2/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+
+ system("$eslalistat --cinfo $tmppfx.c --noambig $smallA[$pass] --rna $tmppfx.dbl.stk > /dev/null");
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ $output = `cat $tmppfx.c`;
+ if($output !~ /3\s+3\.\d+\s+0\.\d+\s+0\.\d+\s+0/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if($output !~ /\# Alignment idx: 2/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+
+ system("$eslalistat --bpinfo $tmppfx.bp $smallA[$pass] --rna $tmppfx.dbl.stk > /dev/null");
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ $output = `cat $tmppfx.bp`;
+ if($output !~ /16\s+34\s+0\s+0\s+0\s+0\s+0\s+0\s+2\s+0\s+0\s+0\s+0\s+0\s+0\s+0\s+0\s+0\s+/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if($output !~ /\# Alignment idx: 2/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+
+ system("$eslalistat --weight --cinfo $tmppfx.c $smallA[$pass] --rna $tmppfx.dbl.stk > /dev/null");
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ $output = `cat $tmppfx.c`;
+ if($output !~ /2\s+1\.5\s+0\.\d+\s+0\.\d+\s+0/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if($output !~ /\# Alignment idx: 2/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ }
+
+ system("$eslalistat --cinfo $tmppfx.c $smallA[$pass] --rna $tmppfx.dbl.stk > /dev/null");
+ if ($? != 0) { die "FAIL: esl-alistat failed unexpectedly";}
+ $output = `cat $tmppfx.c`;
+ if($output !~ /3\s+3\.\d+\s+0\.\d+\s+0\.\d+\s+0/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+ if($output !~ /\# Alignment idx: 2/) { die "FAIL: alignment statistics calculated incorrectly on pass $pass2write"; }
+
+}
+
+
+print "ok\n";
+unlink "$tmppfx.stk";
+unlink "$tmppfx.afa";
+unlink "$tmppfx.dbl.stk";
+unlink "$tmppfx.i";
+unlink "$tmppfx.ic";
+unlink "$tmppfx.list";
+unlink "$tmppfx.pc";
+unlink "$tmppfx.ps";
+unlink "$tmppfx.r";
+unlink "$tmppfx.c";
+unlink "$tmppfx.bp";
+exit 0;
diff --git a/miniapps/esl-alistat.man b/miniapps/esl-alistat.man
new file mode 100644
index 0000000..3ea0b15
--- /dev/null
+++ b/miniapps/esl-alistat.man
@@ -0,0 +1,234 @@
+.TH "esl-alistat" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-alistat - summarize a multiple sequence alignment file
+
+.SH SYNOPSIS
+
+.B esl-alistat
+.I [options]
+.I msafile
+
+.SH DESCRIPTION
+
+.pp
+.B esl-alistat
+summarizes the contents of the multiple sequence alignment(s) in
+.I msafile,
+such as the alignment name, format, alignment length (number of
+aligned columns), number of sequences, average pairwise % identity,
+and mean, smallest, and largest raw (unaligned) lengths of the
+sequences.
+
+If
+.I msafile
+is - (a single dash),
+multiple alignment input is read from
+.I stdin.
+
+The alignments can be of protein or DNA/RNA sequences. All alignments
+in the same
+.I msafile
+must be either protein or DNA/RNA. The alphabet will be autodetected
+unless one of the options
+.I --amino,
+.I --dna,
+or
+.I --rna
+are given. These options may be useful in automated
+pipelines to make
+.B esl-alistat
+more robust; alphabet autodetection is not infallible.
+
+The
+.B --list,
+.B --icinfo,
+.B --rinfo,
+.B --pcinfo,
+.B --psinfo,
+.B --cinfo,
+.B --bpinfo,
+and
+.B --iinfo,
+options allow dumping various statistics on the alignment to optional
+output files as described for each of those options below.
+
+The
+.B --small
+option allows summarizing alignments without storing them in memory
+and can be useful for large alignment files with sizes that approach
+or exceed the amount of available RAM. When
+.B --small
+is used,
+.B esl-alistat
+will print fewer statistics on the alignment, omitting data on the
+smallest and largest sequences and the average identity of the
+alignment.
+.B --small
+only works on Pfam formatted alignments (a special type of
+non-interleaved Stockholm alignment in which each sequence occurs on a
+single line) and
+.BI --informat " pfam"
+must be given with
+.B --small.
+Further, when
+.B --small
+is used, the alphabet must be specified with
+.I --amino,
+.I --dna,
+or
+.I --rna.
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.B -1
+Use a tabular output format with one line of statistics per alignment
+in
+.I msafile.
+This is most useful when
+.I msafile
+contains many different alignments (such as a Pfam database in
+Stockholm format).
+
+
+.SH EXPERT OPTIONS
+
+.TP
+.BI --informat " <s>"
+Specify that the input alignment is in
+.I <s>
+format. At present, valid formats are limited to
+Stockholm, Pfam, and AFA (aligned FASTA).
+
+.TP
+.B --amino
+Assert that the
+.I msafile
+contains protein sequences.
+
+.TP
+.B --dna
+Assert that the
+.I msafile
+contains DNA sequences.
+
+.TP
+.B --rna
+Assert that the
+.I msafile
+contains RNA sequences.
+
+.TP
+.B --small
+Operate in small memory mode for Pfam formatted alignments.
+.BI --informat " pfam"
+and one of
+.B --amino,
+.B --dna,
+or
+.B --rna
+must be given as well.
+
+.TP
+.BI --list " <f>"
+List the names of all sequences in all alignments in
+.B msafile
+to file
+.I <f>.
+Each sequence name is written on its own line.
+
+.TP
+.BI --icinfo " <f>"
+Dump the information content per position in tabular format to file
+.I <f>.
+Lines prefixed with "#" are comment lines, which explain the
+meanings of each of the tab-delimited fields.
+
+.TP
+.BI --rinfo " <f>"
+Dump information on the frequency of gaps versus nongap residues per position in tabular format to file
+.I <f>.
+Lines prefixed with "#" are comment lines, which explain the
+meanings of each of the tab-delimited fields.
+
+.TP
+.BI --pcinfo " <f>"
+Dump per column information on posterior probabilities in tabular format to file
+.I <f>.
+Lines prefixed with "#" are comment lines, which explain the
+meanings of each of the tab-delimited fields.
+
+.TP
+.BI --psinfo " <f>"
+Dump per sequence information on posterior probabilities in tabular format to file
+.I <f>.
+Lines prefixed with "#" are comment lines, which explain the
+meanings of each of the tab-delimited fields.
+
+.TP
+.BI --iinfo " <f>"
+Dump information on inserted residues in tabular format to file
+.I <f>.
+Insert columns of the alignment are those that are gaps in the
+reference (#=GC RF) annotation. This option only works if the input
+file is in Stockholm format with reference annotation.
+Lines prefixed with "#" are comment lines, which explain the
+meanings of each of the tab-delimited fields.
+
+.TP
+.BI --cinfo " <f>"
+Dump per-column residue counts to file
+.I <f>.
+If used in combination with
+.B --noambig
+ambiguous (degenerate) residues will be ignored and not
+counted. Otherwise, they will be marginalized. For example, in an RNA
+sequence file, a 'N' will be counted as 0.25 'A', 0.25 'C', 0.25 'G',
+and 0.25 'U'.
+
+.TP
+.B --noambig
+With
+.B --cinfo,
+do not count ambiguous (degenerate) residues.
+
+.TP
+.B --bpinfo
+Dump per-column basepair counts to file
+.I <f>.
+Counts appear for each basepair in the consensus secondary structure (annotated as
+"#=GC SS_cons"). Only basepairs from sequences for which both paired positions are
+canonical residues will be counted. That is, any basepair that is a gap
+or an ambiguous (degenerate) residue at either position of the pair is
+ignored and not counted.
+
+
+.TP
+.B --weight
+With
+.B --icinfo, --rinfo, --pcinfo, --iinfo, --cinfo
+and
+.B --bpinfo,
+weight counts based on #=GS WT annotation in the input
+.B msafile.
+A residue or basepair from a sequence with a weight of
+.I x
+will be considered
+.I x
+counts.
+By default, raw, unweighted counts are reported; corresponding to each
+sequence having an equal weight of 1.
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-cluster.c b/miniapps/esl-cluster.c
new file mode 100644
index 0000000..aab8653
--- /dev/null
+++ b/miniapps/esl-cluster.c
@@ -0,0 +1,212 @@
+/* Clusters tabular data.
+ *
+ * SRE, Mon Nov 3 13:43:29 2008 [Janelia]
+ * SVN $Id$
+ */
+
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_keyhash.h"
+#include "esl_stack.h"
+#include "esl_tree.h"
+#include "esl_vectorops.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "show brief help on version and usage", 0 },
+ { "-q", eslARG_INT, "8", NULL, "n>0", NULL,NULL, NULL, "field to read as query name, 1..n", 0 },
+ { "-t", eslARG_INT, "5", NULL, "n>0", NULL,NULL, NULL, "field to read as target name, 1..n", 0 },
+ { "-v", eslARG_INT, "1", NULL, "n>0", NULL,NULL, NULL, "field to read as distance value, 1..n", 0 },
+ { "-x", eslARG_REAL, "1e-4", NULL, "x>0", NULL,NULL, NULL, "clustering threshold", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <keyfile> <tabfile>";
+static char banner[] = "clusters tabular data file";
+
+
+static void read_keyfile (ESL_GETOPTS *go, char *keyfile, ESL_KEYHASH *kh);
+static void read_tabfile (ESL_GETOPTS *go, char *tabfile, ESL_KEYHASH *kh, ESL_DMATRIX *D);
+static void output_clusters(ESL_GETOPTS *go, ESL_TREE *T, ESL_KEYHASH *kh);
+
+static void
+cmdline_failure(char *argv0, ESL_GETOPTS *go, char *format, ...)
+{
+ va_list argp;
+
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ esl_usage(stdout, argv0, usage);
+ puts("\n options:");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80);
+ /* printf("\nTo see more help on available options, do %s -h\n\n", argv0); */
+ exit(1);
+}
+
+static void
+cmdline_help(char *argv0, ESL_GETOPTS *go)
+{
+ esl_banner(stdout, argv0, banner);
+ esl_usage (stdout, argv0, usage);
+ puts("\n options:");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80);
+ exit(0);
+}
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL;
+ char *keyfile = NULL;
+ char *tabfile = NULL;
+ ESL_KEYHASH *kh = esl_keyhash_Create();
+ int nkeys = 0;
+ ESL_DMATRIX *D = NULL;
+ ESL_TREE *T = NULL;
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) cmdline_failure(argv[0], go, "Failed to parse command line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) cmdline_failure(argv[0], go, "Error in app configuration: %s\n", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") ) cmdline_help (argv[0], go);
+ if (esl_opt_ArgNumber(go) != 2) cmdline_failure(argv[0], go, "Incorrect number of command line arguments.\n");
+ keyfile = esl_opt_GetArg(go, 1);
+ tabfile = esl_opt_GetArg(go, 2);
+
+ read_keyfile(go, keyfile, kh);
+ nkeys = esl_keyhash_GetNumber(kh);
+
+ D = esl_dmatrix_Create(nkeys, nkeys);
+ read_tabfile(go, tabfile, kh, D);
+
+ esl_tree_SingleLinkage(D, &T);
+
+ //esl_tree_WriteNewick(stdout, T);
+ output_clusters(go, T, kh);
+
+
+ esl_tree_Destroy(T);
+ esl_dmatrix_Destroy(D);
+ esl_keyhash_Destroy(kh);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+
+static void
+read_keyfile(ESL_GETOPTS *go, char *keyfile, ESL_KEYHASH *kh)
+{
+ ESL_FILEPARSER *efp = NULL;
+ int nline = 0;
+ char *tok = NULL;
+ int toklen;
+ int status;
+
+ if (esl_fileparser_Open(keyfile, NULL, &efp) != eslOK) esl_fatal("File open failed");
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ while (esl_fileparser_NextLine(efp) == eslOK)
+ {
+ nline++;
+ if (esl_fileparser_GetTokenOnLine(efp, &tok, &toklen) != eslOK) esl_fatal("No token found on line %d", nline);
+
+ status = esl_keyhash_Store(kh, tok, toklen, NULL);
+ if (status == eslEDUP) esl_fatal("Saw key %s twice: keys must be unique", tok);
+ else if (status != eslOK) esl_fatal("unknown error in storing key %s\n", tok);
+ }
+
+ esl_fileparser_Close(efp);
+}
+
+static void
+read_tabfile(ESL_GETOPTS *go, char *tabfile, ESL_KEYHASH *kh, ESL_DMATRIX *D)
+{
+ ESL_FILEPARSER *efp = NULL;
+ int nline = 0;
+ int vfield = esl_opt_GetInteger(go, "-v");
+ int qfield = esl_opt_GetInteger(go, "-q");
+ int tfield = esl_opt_GetInteger(go, "-t");
+ char *tok;
+ int toklen;
+ int ntok;
+ double value;
+ int qidx, tidx;
+
+ if (esl_fileparser_Open(tabfile, NULL, &efp) != eslOK) esl_fatal("File open failed");
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ esl_dmatrix_Set(D, eslINFINITY);
+
+ while (esl_fileparser_NextLine(efp) == eslOK)
+ {
+ nline++;
+ ntok = 0;
+ qidx = tidx = -1;
+ value = eslNaN;
+ while (esl_fileparser_GetTokenOnLine(efp, &tok, &toklen) == eslOK)
+ {
+ ntok++;
+ if (ntok == vfield) value = atof(tok);
+ if (ntok == qfield && esl_keyhash_Lookup(kh, tok, toklen, &qidx) != eslOK) esl_fatal("failed to find query key %s", tok);
+ if (ntok == tfield && esl_keyhash_Lookup(kh, tok, toklen, &tidx) != eslOK) esl_fatal("failed to find target key %s", tok);
+ }
+ if (qidx == -1) esl_fatal("Failed to find query name on line %d (looking for field %d)\n", nline, qfield);
+ if (tidx == -1) esl_fatal("Failed to find target name on line %d (looking for field %d)\n", nline, tfield);
+ if (isnan(value)) esl_fatal("Failed to find value on line %d (looking for field %d)\n", nline, vfield);
+
+ D->mx[qidx][tidx] = value;
+ if (D->mx[tidx][qidx] == eslINFINITY) D->mx[tidx][qidx] = value;
+ }
+
+ esl_fileparser_Close(efp);
+}
+
+
+void
+output_clusters(ESL_GETOPTS *go, ESL_TREE *T, ESL_KEYHASH *kh)
+{
+ ESL_STACK *ns = esl_stack_ICreate();
+ ESL_STACK *s2 = esl_stack_ICreate();
+ double threshold = esl_opt_GetReal(go, "-x");
+ int v,v2;
+ int nc = 0;
+
+ esl_stack_IPush(ns, 0);
+ while (esl_stack_IPop(ns, &v) == eslOK)
+ {
+ /* v may only be an internal node. */
+ if (T->ld[v] < threshold)
+ {
+ nc++;
+ printf("Cluster %d: %g\n", nc, T->ld[v]);
+ esl_stack_IPush(s2, T->right[v]);
+ esl_stack_IPush(s2, T->left[v]);
+ while (esl_stack_IPop(s2, &v2) == eslOK)
+ {
+ if (v2 <= 0)
+ printf("= %s \t%d\t%g\n", esl_keyhash_Get(kh, -v2), nc, T->ld[v]);
+ else
+ {
+ esl_stack_IPush(s2, T->right[v2]);
+ esl_stack_IPush(s2, T->left[v2]);
+ }
+ }
+ printf("\n\n");
+ continue;
+ }
+
+ if (T->right[v] > 0) esl_stack_IPush(ns, T->right[v]); else printf("Singleton:\n= %s\t%c\t%c\n\n", esl_keyhash_Get(kh, -T->right[v]), '-', '-');
+ if (T->left[v] > 0) esl_stack_IPush(ns, T->left[v]); else printf("Singleton:\n= %s\t%c\t%c\n\n", esl_keyhash_Get(kh, -T->left[v]), '-', '-');
+
+ }
+
+ esl_stack_Destroy(ns);
+ esl_stack_Destroy(s2);
+}
diff --git a/miniapps/esl-compalign.c b/miniapps/esl-compalign.c
new file mode 100644
index 0000000..1f9b616
--- /dev/null
+++ b/miniapps/esl-compalign.c
@@ -0,0 +1,581 @@
+/* esl-compalign - compare two multiple sequence alignments
+ *
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_sq.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_vectorops.h"
+#include "esl_wuss.h"
+
+static char banner[] = "compare two multiple sequence alignments";
+
+static char usage[] = "\
+[-options] <trusted file> <test file>\n\
+ Both files must be in Stockholm format with #=GC RF markup.\n\
+ Sequences must occur in the same order in the two files.\n\
+ Number of non-gap characters in #=GC RF markup must be identical.\n\
+ Note: accuracy is computed differently than in Squid\'s compalign.\n\
+ See the manual page for details on how accuracy is computed.";
+
+static int get_pp_idx(ESL_ALPHABET *abc, char ppchar);
+static int read_mask_file(char *filename, char *errbuf, char **ret_mask, int *ret_masklen);
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-c", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "print per column statistics instead of per sequence stats", 1 },
+ { "-p", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "print stats on accuracy versus posterior probability (PP)", 1 },
+ { "--p-mask", eslARG_OUTFILE,NULL, NULL, NULL, NULL,"-p", NULL, "with -p, only consider columns within mask ('1' columns) in <f>",1 },
+ { "--c2dfile", eslARG_OUTFILE,NULL, NULL, NULL, NULL,"-c", NULL, "print per column stats to esl-ssdraw --dfile file <f>", 1 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--dna,--rna", "<msafile> contains protein alignments", 2 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--amino,--rna", "<msafile> contains DNA alignments", 2 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--amino,--dna", "<msafile> contains RNA alignments", 2 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go; /* application configuration */
+ int kstatus, tstatus;/* return code from Easel routine */
+ int fmt; /* expected format of kfile, tfile */
+ char *kfile, *tfile; /* known, test structure file */
+ ESL_MSAFILE *kfp, *tfp; /* open kfile, tfile */
+ ESL_MSA *ka, *ta; /* known, trusted alignment */
+ int64_t klen, tlen; /* lengths of dealigned seqs */
+ int i; /* counter over sequences */
+ int apos; /* counter over alignment columns */
+ int rfpos; /* counter over consensus (non-gap RF) columns */
+ int is_rfpos; /* TRUE if current apos is a consensus pos, FALSE if not */
+ int uapos; /* counter over unaligned residue positions */
+ int nali; /* number of alignment we're on in each file */
+
+ int **kp; /* [0..i..nseq-1][1..r..sq->n] = x known non-gap RF position of residue r in sequence i */
+ int **tp; /* [0..i..nseq-1][1..r..sq->n] = x predicted non-gap RF position of residue r in sequence i */
+ /* for both kp and pp, if x <= 0, residue r for seq i is not aligned to a non-gap RF position, but rather as an 'insert'
+ * after non-gap RF position (x * -1)
+ */
+ int *km_pos; /* [0..rflen] = x, in known aln, number of residues aligned to non-gap RF column x; special case: mct[0] = 0 */
+ int *ki_pos; /* [0..rflen] = x, in known aln, number of residues inserted after non-gap RF column x */
+ int *tm_pos; /* [0..rflen] = x, in predicted aln, number of residues aligned to non-gap RF column x; special case: mct[0] = 0 */
+ int *ti_pos; /* [0..rflen] = x, in predicted aln, number of residues inserted after non-gap RF column x */
+ int *cor_tm_pos; /* [0..rflen] = x, in predicted aln, number of correctly predicted residues aligned to non-gap RF column x; special case: mct[0] = 0 */
+ int *cor_ti_pos; /* [0..rflen] = x, in predicted aln, number of correctly predicted residues inserted after non-gap RF column x */
+
+ int *km_seq; /* [0..i..nseq-1] = x, in known aln, number of residues aligned to non-gap RF columns in seq i; */
+ int *ki_seq; /* [0..i..nseq-1] = x, in known aln, number of residues inserted in seq i */
+ int *tm_seq; /* [0..i..nseq-1] = x, in predicted aln, number of residues aligned to non-gap RF columns in seq i; */
+ int *ti_seq; /* [0..i..nseq-1] = x, in predicted aln, number of residues inserted in seq i */
+ int *cor_tm_seq; /* [0..i..nseq-1] = x, in predicted aln, number of correctly predicted residues aligned to non-gap RF columns in seq i */
+ int *cor_ti_seq; /* [0..i..nseq-1] = x, in predicted aln, number of correctly predicted residues inserted in seq i */
+
+ int *seqlen; /* [0..i..nseq-1] = x, unaligned seq i has length x */
+ ESL_ALPHABET *abc = NULL; /* alphabet for all alignments */
+ int rflen, t_rflen; /* non-gap RF length (consensus lengths) */
+ int status;
+ char *namedashes;
+ int ni;
+ int namewidth = 8; /* length of 'seq name' */
+ int cor_tm, cor_ti, km, ki; /* correct predicted match, correct predicted insert, total match, total insert */
+ char *mask = NULL;
+ int masklen;
+ ESL_DSQ *ks;
+ ESL_DSQ *ts;
+ FILE *dfp = NULL; /* for --c2dfile */
+
+ /* variables needed for -p and related options */
+ int do_post = FALSE; /* TRUE if -p enabled */
+ int do_post_for_this_rfpos = FALSE; /* set for each consensus position, always TRUE unless --mask-p2xm */
+ int p; /* counter over integerized posteriors */
+ int *ptm = NULL; /* [0..p..10] number of total matches with posterior value p (10="*")*/
+ int *pti = NULL; /* [0..p..10] number of total inserts with posterior value p */
+ int *cor_ptm = NULL; /* [0..p..10] number of correct matches with posterior value p */
+ int *cor_pti = NULL; /* [0..p..10] number of correct inserts with posterior value p */
+ int npostvals = 11; /* number of posterior values 0-9, * */
+ int ppidx; /* index of PP */
+ char ppchars[11] = "0123456789*";
+ int cm_cor_ptm, cm_cor_pti, cm_ptm, cm_pti, cm_incor_ptm, cm_incor_pti; /* cumulative counts of posteriors */
+ // int tot_cor_ptm, tot_cor_pti, tot_ptm, tot_pti; /* total counts of posteriors */
+ // int tot_incor_ptm,tot_incor_pti; // SRE: commented out; don't seem to be used; need to silence compiler warning
+ char errbuf[eslERRBUFSIZE];
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80);
+ exit(EXIT_SUCCESS);
+ }
+
+ if (esl_opt_ArgNumber(go) != 2)
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ kfile = esl_opt_GetArg(go, 1);
+ tfile = esl_opt_GetArg(go, 2);
+
+ fmt = eslMSAFILE_STOCKHOLM;
+
+ /***********************************************
+ * Open the two Stockholm files.
+ ***********************************************/
+
+ if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+
+ if ( (kstatus = esl_msafile_Open(&abc, kfile, NULL, fmt, NULL, &kfp)) != eslOK) esl_msafile_OpenFailure(kfp, kstatus);
+ if ( (tstatus = esl_msafile_Open(&abc, tfile, NULL, fmt, NULL, &tfp)) != eslOK) esl_msafile_OpenFailure(tfp, tstatus);
+
+ do_post = esl_opt_GetBoolean(go, "-p");
+
+ /* read the mask file if --p-mask is enabled */
+ if(! esl_opt_IsDefault(go, "--p-mask")) {
+ if((status = read_mask_file(esl_opt_GetString(go, "--p-mask"), errbuf, &mask, &masklen)) != eslOK) esl_fatal(errbuf);
+ }
+ /* open the c2dfile for output, if nec */
+ if (esl_opt_IsOn(go, "--c2dfile")) {
+ if ((dfp = fopen(esl_opt_GetString(go, "--c2dfile"), "w")) == NULL) esl_fatal("Failed to open --c2dfile output file %s\n", esl_opt_GetString(go, "--c2dfile"));
+ }
+
+ /***********************************************
+ * Do alignment comparisons, one seq at a time;
+ * this means looping over all seqs in all alignments.
+ ***********************************************/
+ nali = 0;
+ while ( (kstatus = esl_msafile_Read(kfp, &ka)) != eslEOF)
+ {
+ if ( kstatus != eslOK) esl_msafile_ReadFailure(kfp, kstatus);
+ if ( (tstatus = esl_msafile_Read(tfp, &ta)) != eslOK) esl_msafile_ReadFailure(tfp, tstatus);
+
+ nali++;
+ if((nali > 1) && (esl_opt_IsOn(go, "--c2dfile"))) esl_fatal("--c2dfile is only meant for msafiles with single alignments");
+
+ /* Sanity check on alignment
+ */
+ if (ka->nseq != ta->nseq)
+ esl_fatal("trusted, test alignments don't have same seq #\n");
+ if (ka->rf == NULL)
+ esl_fatal("trusted alignment has no reference annotation\n");
+ if (ta->rf == NULL)
+ esl_fatal("test alignment has no reference annotation\n");
+
+ /* make sure the sequences are all identical */
+ ESL_ALLOC(seqlen, sizeof(int) * ka->nseq);
+ for(i = 0; i < ka->nseq; i++) {
+ if(strcmp(ka->sqname[i], ta->sqname[i]) != 0) esl_fatal("sequence %d of trusted alignment %s has different name than seq %d of predicted alignment %s\n", (i+1), ka->sqname[i], (i+1), ta->sqname[i]);
+ ESL_ALLOC(ks, sizeof(ESL_DSQ) * (ka->alen+2));
+ memcpy(ks, ka->ax[i], (ka->alen+2) * sizeof(ESL_DSQ));
+ esl_abc_XDealign(ka->abc, ks, ka->ax[i], &klen);
+
+ ESL_ALLOC(ts, sizeof(ESL_DSQ) * (ta->alen+2));
+ memcpy(ts, ta->ax[i], (ta->alen+2) * sizeof(ESL_DSQ));
+ esl_abc_XDealign(ta->abc, ts, ta->ax[i], &tlen);
+
+ if (tlen != klen)
+ esl_fatal("dealigned sequence mismatch, seq %d, when dealigned, is %d residues in the known alignment, but %d residues in the trusted alignment.", (i+1), klen, tlen);
+
+ if (memcmp(ks, ts, sizeof(ESL_DSQ) * klen) != 0)
+ esl_fatal("dealigned sequence mismatch, seq %d %s, when dealigned, are not identical.", (i+1), ka->sqname[i]);
+
+ seqlen[i] = tlen;
+ free(ks);
+ free(ts);
+ }
+
+ /* determine non-gap RF length */
+ rflen = 0;
+ for(apos = 1; apos <= ka->alen; apos++) {
+ if((! esl_abc_CIsGap (ka->abc, ka->rf[apos-1])) &&
+ (! esl_abc_CIsMissing(ka->abc, ka->rf[apos-1]))) rflen++;
+ }
+ t_rflen = 0;
+ for(apos = 1; apos <= ta->alen; apos++) {
+ if((! esl_abc_CIsGap (ta->abc, ta->rf[apos-1])) &&
+ (! esl_abc_CIsMissing (ta->abc, ta->rf[apos-1]))) t_rflen++;
+ }
+ if(t_rflen != rflen) esl_fatal("Trusted alignment non-gap RF length (%d) != predicted alignment non-gap RF length (%d).\n", rflen, t_rflen);
+
+ /* if -p, make sure the test alignment has posterior probabilities, and allocate our counters for correct/incorrect per post value */
+ if(do_post) {
+ if(! esl_opt_IsDefault(go, "--p-mask")) {
+ if(masklen != rflen) {
+ esl_fatal("Length of mask in %s (%d) not equal to non-gap RF len of alignments (%d)\n", esl_opt_GetString(go, "--p-mask"), masklen, rflen);
+ }
+ }
+ if(ta->pp == NULL) esl_fatal("-p requires \"#=GR PP\" annotation in the test alignment, but none exists");
+ ESL_ALLOC(ptm, sizeof(int) * npostvals);
+ ESL_ALLOC(pti, sizeof(int) * npostvals);
+ ESL_ALLOC(cor_ptm, sizeof(int) * npostvals);
+ ESL_ALLOC(cor_pti, sizeof(int) * npostvals);
+ esl_vec_ISet(ptm, npostvals, 0);
+ esl_vec_ISet(pti, npostvals, 0);
+ esl_vec_ISet(cor_ptm, npostvals, 0);
+ esl_vec_ISet(cor_pti, npostvals, 0);
+ }
+
+ /* allocate and initialize our counters */
+ ESL_ALLOC(kp, sizeof(int *) * ka->nseq);
+ ESL_ALLOC(tp, sizeof(int *) * ta->nseq);
+ for(i = 0; i < ka->nseq; i++) {
+ ESL_ALLOC(kp[i], sizeof(int) * (seqlen[i]+1));
+ ESL_ALLOC(tp[i], sizeof(int) * (seqlen[i]+1));
+ esl_vec_ISet(kp[i], seqlen[i]+1, -987654321);
+ esl_vec_ISet(tp[i], seqlen[i]+1, -987654321);
+ }
+
+ ESL_ALLOC(km_pos, sizeof(int) * (rflen+1));
+ ESL_ALLOC(ki_pos, sizeof(int) * (rflen+1));
+ ESL_ALLOC(tm_pos, sizeof(int) * (rflen+1));
+ ESL_ALLOC(ti_pos, sizeof(int) * (rflen+1));
+ ESL_ALLOC(cor_tm_pos, sizeof(int) * (rflen+1));
+ ESL_ALLOC(cor_ti_pos, sizeof(int) * (rflen+1));
+ esl_vec_ISet(km_pos, rflen+1, 0);
+ esl_vec_ISet(ki_pos, rflen+1, 0);
+ esl_vec_ISet(tm_pos, rflen+1, 0);
+ esl_vec_ISet(ti_pos, rflen+1, 0);
+ esl_vec_ISet(cor_tm_pos, rflen+1, 0);
+ esl_vec_ISet(cor_ti_pos, rflen+1, 0);
+
+ ESL_ALLOC(km_seq, sizeof(int) * ka->nseq);
+ ESL_ALLOC(ki_seq, sizeof(int) * ka->nseq);
+ ESL_ALLOC(tm_seq, sizeof(int) * ka->nseq);
+ ESL_ALLOC(ti_seq, sizeof(int) * ka->nseq);
+ ESL_ALLOC(cor_tm_seq, sizeof(int) * ka->nseq);
+ ESL_ALLOC(cor_ti_seq, sizeof(int) * ka->nseq);
+ esl_vec_ISet(km_seq, ka->nseq, 0);
+ esl_vec_ISet(ki_seq, ka->nseq, 0);
+ esl_vec_ISet(tm_seq, ka->nseq, 0);
+ esl_vec_ISet(ti_seq, ka->nseq, 0);
+ esl_vec_ISet(cor_tm_seq, ka->nseq, 0);
+ esl_vec_ISet(cor_ti_seq, ka->nseq, 0);
+
+ /* determine non-gap RF location of each residue in known alignment */
+ for(i = 0; i < ka->nseq; i++) {
+ uapos = rfpos = 0;
+ for(apos = 1; apos <= ka->alen; apos++) {
+ is_rfpos = FALSE;
+ if((! esl_abc_CIsGap (ka->abc, ka->rf[apos-1])) &&
+ (! esl_abc_CIsMissing (ka->abc, ka->rf[apos-1]))) {
+ rfpos++; is_rfpos = TRUE;
+ }
+ if(esl_abc_XIsResidue(ka->abc, ka->ax[i][apos])) {
+ uapos++;
+ kp[i][uapos] = (is_rfpos) ? rfpos : (-1 * rfpos);
+ if(is_rfpos) { km_pos[rfpos]++; km_seq[i]++; }
+ else { ki_pos[rfpos]++; ki_seq[i]++; }
+ }
+ }
+ }
+
+ /* determine non-gap RF location of each residue in predicted alignment */
+ for(i = 0; i < ta->nseq; i++) {
+ uapos = rfpos = 0;
+ for(apos = 1; apos <= ta->alen; apos++) {
+ is_rfpos = FALSE;
+ if((! esl_abc_CIsGap (abc, ta->rf[apos-1])) &&
+ (! esl_abc_CIsMissing (abc, ta->rf[apos-1]))) {
+ rfpos++; is_rfpos = TRUE;
+ if(do_post) {
+ do_post_for_this_rfpos = (mask != NULL && mask[rfpos-1] == '0') ? FALSE : TRUE;
+ }
+ }
+ if(esl_abc_XIsResidue(ta->abc, ta->ax[i][apos])) {
+ uapos++;
+ tp[i][uapos] = (is_rfpos) ? rfpos : (-1 * rfpos);
+ if(do_post) {
+ if(esl_abc_CIsGap(abc, ta->pp[i][(apos-1)])) esl_fatal("gap PP value for nongap residue: ali: %d seq: %d apos: %d\n", nali, i, apos);
+ ppidx = get_pp_idx(abc, ta->pp[i][(apos-1)]);
+ if(ppidx == -1) esl_fatal("unrecognized PP value (%c) for nongap residue: ali: %d seq: %d apos: %d\n", ta->pp[i][(apos-1)], nali, i, apos);
+ }
+ if(is_rfpos) {
+ tm_pos[rfpos]++; tm_seq[i]++;
+ if(do_post_for_this_rfpos) ptm[ppidx]++;
+ }
+ else {
+ ti_pos[rfpos]++; ti_seq[i]++;
+ if(do_post) pti[ppidx]++;
+ }
+ if(kp[i][uapos] == tp[i][uapos]) { /* correctly predicted this residue */
+ if(is_rfpos) {
+ cor_tm_seq[i]++; cor_tm_pos[rfpos]++;
+ if(do_post_for_this_rfpos) cor_ptm[ppidx]++;
+ }
+ else {
+ cor_ti_seq[i]++; cor_ti_pos[rfpos]++;
+ if(do_post) cor_pti[ppidx]++;
+ }
+ }
+ }
+ }
+ }
+ if((! (esl_opt_GetBoolean(go, "-c"))) && (! esl_opt_GetBoolean(go, "-p"))) {
+ /* print per sequence statistics */
+ /* determine the longest name in msa */
+ for(ni = 0; ni < ka->nseq; ni++) namewidth = ESL_MAX(namewidth, strlen(ka->sqname[ni]));
+ ESL_ALLOC(namedashes, sizeof(char) * namewidth+1);
+ namedashes[namewidth] = '\0';
+ for(ni = 0; ni < namewidth; ni++) namedashes[ni] = '-';
+
+ printf("# %-*s %6s %28s %28s %28s\n", namewidth, "seq name", "len", "match columns", "insert columns", "all columns");
+ printf("# %-*s %6s %28s %28s %28s\n", namewidth, namedashes, "------", "----------------------------", "----------------------------", "----------------------------");
+ for(i = 0; i < ta->nseq; i++) {
+ printf(" %-*s %6d %8d / %8d (%.3f) %8d / %8d (%.3f) %8d / %8d (%.3f)\n", namewidth, ka->sqname[i], seqlen[i],
+ cor_tm_seq[i], km_seq[i], (km_seq[i] == 0) ? 0. : ((float) cor_tm_seq[i] / (float) km_seq[i]),
+ cor_ti_seq[i], ki_seq[i], (ki_seq[i] == 0) ? 0. : ((float) cor_ti_seq[i] / (float) ki_seq[i]),
+ (cor_tm_seq[i] + cor_ti_seq[i]), (km_seq[i] + ki_seq[i]), ((float) (cor_tm_seq[i] + cor_ti_seq[i]) / ((float) km_seq[i] + ki_seq[i])));
+ }
+ cor_tm = esl_vec_ISum(cor_tm_seq, ka->nseq);
+ cor_ti = esl_vec_ISum(cor_ti_seq, ka->nseq);
+ km = esl_vec_ISum(km_seq, ka->nseq);
+ ki = esl_vec_ISum(ki_seq, ka->nseq);
+
+ printf("# %-*s %6s %28s %28s %28s\n", namewidth, namedashes, "-----", "----------------------------", "----------------------------", "----------------------------");
+ printf("# %-*s %6s %8d / %8d (%.3f) %8d / %8d (%.3f) %8d / %8d (%.3f)\n",
+ namewidth, "*all*", "-",
+ cor_tm, km, ((float) cor_tm / (float) km),
+ cor_ti, ki, ((float) cor_ti / (float) ki),
+ (cor_tm+cor_ti), (km+ki), (((float) (cor_tm + cor_ti))/ ((float) (km + ki))));
+ free(namedashes);
+ for(i = 0; i < ka->nseq; i++) {
+ free(kp[i]);
+ free(tp[i]);
+ }
+ }
+ else if(esl_opt_GetBoolean(go, "-c")) { /* print per column statistics */
+ printf("# %5s %20s %20s %20s\n", "rfpos", "match", "insert", "both");
+ printf("# %5s %20s %20s %20s\n", "-----", "--------------------", "--------------------", "--------------------");
+ for(rfpos = 0; rfpos <= rflen; rfpos++) {
+ printf(" %5d %4d / %4d (%.3f) %4d / %4d (%.3f) %4d / %4d (%.3f)\n", rfpos,
+
+ cor_tm_pos[rfpos], km_pos[rfpos], (km_pos[rfpos] == 0) ? 0. : ((float) cor_tm_pos[rfpos] / (float) km_pos[rfpos]),
+ cor_ti_pos[rfpos], ki_pos[rfpos], (ki_pos[rfpos] == 0) ? 0. : ((float) cor_ti_pos[rfpos] / (float) ki_pos[rfpos]),
+ (cor_tm_pos[rfpos] + cor_ti_pos[rfpos]), (km_pos[rfpos] + ki_pos[rfpos]), ((float) (cor_tm_pos[rfpos] + cor_ti_pos[rfpos]) / ((float) km_pos[rfpos] + ki_pos[rfpos])));
+ }
+ }
+ else if(do_post) { /* do posterior output */
+ if(mask == NULL) {
+ printf("# %2s %29s %29s\n", "", " match columns ", " insert columns ");
+ printf("# %2s %29s %29s\n", "", "-----------------------------", "-----------------------------") ;
+ printf("# %2s %8s %8s %9s %8s %8s %9s\n", "PP", "ncorrect", "ntotal", "fractcor", "ncorrect", "ntotal", "fractcor");
+ printf("# %2s %8s %8s %9s %8s %8s %9s\n", "--", "--------", "--------", "---------", "--------", "--------", "---------");
+ }
+ else {
+ printf("# %2s %29s %29s\n", "", " match columns within mask ", " insert columns ");
+ printf("# %2s %29s %29s\n", "", "-----------------------------", "-----------------------------") ;
+ printf("# %2s %8s %8s %9s %8s %8s %9s\n", "PP", "ncorrect", "ntotal", "fractcor", "ncorrect", "ntotal", "fractcor");
+ printf("# %2s %8s %8s %9s %8s %8s %9s\n", "--", "--------", "--------", "---------", "--------", "--------", "---------");
+ }
+ cm_ptm = cm_pti = cm_cor_ptm = cm_cor_pti = cm_incor_ptm = cm_incor_pti = 0;
+ //tot_ptm = esl_vec_ISum(ptm, npostvals);
+ //tot_pti = esl_vec_ISum(pti, npostvals);
+ //tot_cor_ptm = esl_vec_ISum(cor_ptm, npostvals);
+ //tot_cor_pti = esl_vec_ISum(cor_pti, npostvals);
+ //tot_incor_ptm = tot_ptm - tot_cor_ptm;
+ //tot_incor_pti = tot_pti - tot_cor_pti;
+ for(p = (npostvals-1); p >= 0; p--) {
+ cm_cor_ptm += cor_ptm[p];
+ cm_cor_pti += cor_pti[p];
+ cm_ptm += ptm[p];
+ cm_pti += pti[p];
+ cm_incor_ptm += ptm[p] - cor_ptm[p];
+ cm_incor_pti += pti[p] - cor_pti[p];
+ printf(" %2c %8d / %8d (%.5f) %8d / %8d (%.5f)\n",
+ ppchars[p], cor_ptm[p], ptm[p],
+ (ptm[p] == 0) ? 0. : (float) cor_ptm[p] / (float) ptm[p],
+ cor_pti[p], pti[p],
+ (pti[p] == 0) ? 0. : (float) cor_pti[p] / (float) pti[p]);
+ }
+ }
+
+ /* handle --c2dfile */
+ if (dfp != NULL) {
+ /* match stats, 4 fields, CMYK color values */
+ for(rfpos = 1; rfpos <= rflen; rfpos++) {
+ if(km_pos[rfpos] == 0) { /* special case, no known alignment residues, a blank position */
+ fprintf(dfp, "%.3f %.3f %.3f %.3f\n", 0., 0., 0., 0.);
+ }
+ else {
+ fprintf(dfp, "%.3f %.3f %.3f %.3f\n",
+ 0., /* cyan */
+ 1. - ((float) cor_tm_pos[rfpos] / (float) km_pos[rfpos]), /* magenta, fraction incorrect */
+ 1. - ((float) km_pos[rfpos] / ta->nseq), /* yellow, 1 - fraction of seqs with residue in column */
+ 0.);
+ }
+ }
+ fprintf(dfp, "//\n");
+ /* insert stats, 4 fields, CMYK color values */
+ rfpos = 0; /* special case, combine insert posn 0 and 1 together */
+ if(ki_pos[rfpos] == 0) { /* special case, no known alignment residues, a blank position */
+ fprintf(dfp, "%.3f %.3f %.3f %.3f\n", 0., 0., 0., 0.);
+ }
+ else {
+ fprintf(dfp, "%.3f %.3f %.3f %.3f\n",
+ 0., /* cyan */
+ 1. - ((float) (cor_ti_pos[0] + cor_ti_pos[1]) / ((float) (ki_pos[0] + ki_pos[1]))), /* magenta, fraction correct */
+ 0.,
+ 0.);
+ }
+ /* insert stats posn 2..rflen */
+ for(rfpos = 2; rfpos <= rflen; rfpos++) {
+ if(ki_pos[rfpos] == 0) { /* special case, no known alignment residues, a blank position */
+ fprintf(dfp, "%.3f %.3f %.3f %.3f\n", 0., 0., 0., 0.);
+ }
+ else {
+ fprintf(dfp, "%.3f %.3f %.3f %.3f\n",
+ 0., /* cyan */
+ 1. - ((float) cor_ti_pos[rfpos] / (float) ki_pos[rfpos]), /* magenta, fraction correct */
+ 0.,
+ 0.);
+ }
+ }
+ fprintf(dfp, "//\n");
+ }
+
+ if(ptm != NULL) free(ptm);
+ if(pti != NULL) free(pti);
+ if(cor_ptm != NULL) free(cor_ptm);
+ if(cor_ptm != NULL) free(cor_pti);
+ free(kp);
+ free(tp);
+ free(km_seq);
+ free(ki_seq);
+ free(tm_seq);
+ free(ti_seq);
+ free(cor_tm_seq);
+ free(cor_ti_seq);
+ free(km_pos);
+ free(ki_pos);
+ free(tm_pos);
+ free(ti_pos);
+ free(cor_tm_pos);
+ free(cor_ti_pos);
+ free(seqlen);
+ esl_msa_Destroy(ka);
+ esl_msa_Destroy(ta);
+ }
+
+ if(mask != NULL) free(mask);
+ if(dfp != NULL) {
+ fclose(dfp);
+ printf("# Draw file of per-column stats saved to file: %s\n", esl_opt_GetString(go, "--c2dfile"));
+ }
+
+ if(abc) esl_alphabet_Destroy(abc);
+ esl_getopts_Destroy(go);
+ esl_msafile_Close(tfp);
+ esl_msafile_Close(kfp);
+ return 0;
+
+ ERROR:
+ return status;
+}
+
+/* get_pp_idx
+ *
+ * Given a #=GR PP or #=GC PP_cons character, return the appropriate index
+ * in a pp_ct[] vector.
+ * '0' return 0;
+ * '1' return 1;
+ * '2' return 2;
+ * '3' return 3;
+ * '4' return 4;
+ * '5' return 5;
+ * '6' return 6;
+ * '7' return 7;
+ * '8' return 8;
+ * '9' return 9;
+ * '*' return 10;
+ * gap return 11;
+ *
+ * Anything else (including missing or nonresidue) return -1;
+ */
+static int get_pp_idx(ESL_ALPHABET *abc, char ppchar)
+{
+ if(ppchar == '*') return 10;
+ if(ppchar == '9') return 9;
+ if(ppchar == '8') return 8;
+ if(ppchar == '7') return 7;
+ if(ppchar == '6') return 6;
+ if(ppchar == '5') return 5;
+ if(ppchar == '4') return 4;
+ if(ppchar == '3') return 3;
+ if(ppchar == '2') return 2;
+ if(ppchar == '1') return 1;
+ if(ppchar == '0') return 0;
+ return -1;
+}
+
+
+/* read_mask_file
+ *
+ * Given an open file pointer, read the first token of the
+ * file and return it as *ret_mask. It must contain only
+ * '0' or '1' characters.
+ *
+ * Returns: eslOK on success.
+ */
+int
+read_mask_file(char *filename, char *errbuf, char **ret_mask, int *ret_mask_len)
+{
+ ESL_FILEPARSER *efp = NULL;
+ char *mask = NULL;
+ char *tok;
+ int toklen;
+ int n;
+ int status;
+
+
+ if (esl_fileparser_Open(filename, NULL, &efp) != eslOK) ESL_XFAIL(eslFAIL, errbuf, "failed to open %s in read_mask_file\n", filename);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_XFAIL(eslFAIL, errbuf, "failed to read a single token from %s\n", filename);
+
+ ESL_ALLOC(mask, sizeof(char) * (toklen+1));
+ for(n = 0; n < toklen; n++) {
+ if((tok[n] == '0') || (tok[n] == '1')) {
+ mask[n] = tok[n];
+ }
+ else { ESL_XFAIL(eslFAIL, errbuf, "read a non-0 and non-1 character (%c) in the mask file %s\n", tok[n], filename); }
+ }
+ mask[n] = '\0';
+
+ *ret_mask = mask;
+ *ret_mask_len = n;
+ esl_fileparser_Close(efp);
+ return eslOK;
+
+ ERROR:
+ if (efp) esl_fileparser_Close(efp);
+ if (mask) free(mask);
+ return status;
+}
diff --git a/miniapps/esl-compalign.itest.pl b/miniapps/esl-compalign.itest.pl
new file mode 100755
index 0000000..daf1c93
--- /dev/null
+++ b/miniapps/esl-compalign.itest.pl
@@ -0,0 +1,110 @@
+#! /usr/bin/perl
+
+# Integrated test of the esl-compalign miniapp.
+#
+# Usage: ./esl-compalign.itest.pl <esl-compalign binary> <tmpfile prefix>
+# Example: ./esl-compalign.itest.pl ./esl-compalign foo
+#
+# EPN, Tue Feb 2 13:19:44 2010
+
+$eslcompalign= shift;
+$tmppfx = shift;
+
+if (! -x "$eslcompalign") { die "FAIL: didn't find esl-compalign binary $eslcompalign"; }
+
+open(ALIFILE, ">$tmppfx.1") || die "FAIL: couldn't open $tmppfx.1 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+simpex-17 --AGA-CUUCGG---GCUCG-UAACAG
+#=GR simpex-17 PP ..885.*****9...9****.******
+simpex-39 aaAAUACGUCGGCUG-AAUCACCAGUA
+#=GR simpex-39 PP ***************.67776899999
+simpex-82 --ACGUUUUG-GAACGGG-U-CCA-CC
+#=GR simpex-82 PP ..****9998.88**888.5.898.9*
+#=GC SS_cons ..::<<<____>->>-<<-<.___>>>
+#=GC RF ..AAgaCUUCGGAucgggCg.AcAccc
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.2") || die "FAIL: couldn't open $tmppfx.2 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+simpex-17 ---AGACUUCGGG---CUCGUAACAG
+#=GR simpex-17 PP ...69*****775...4466777888
+simpex-39 aaAAUACGUCGGCUGAAUCACCAGUA
+#=GR simpex-39 PP **************************
+simpex-82 --ACGUUUUG-GAACGGGUC-C-ACC
+#=GR simpex-82 PP ..99998886.777755544.2.358
+#=GC SS_cons ..::::::::::::::::::::::::
+#=GC RF ..AAgACUUCGGAucggGCaAcAuUc
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.3") || die "FAIL: couldn't open $tmppfx.3 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+simpex-17 ~~~AGACUUCGGG---CUCGUAACAG
+#=GR simpex-17 PP ...69*****775...4466777888
+simpex-39 aaAAUACGUCGGCUGAAUCACCAGUA
+#=GR simpex-39 PP **************************
+simpex-82 --ACGUUUUG-GAACGGGUC-C-ACC
+#=GR simpex-82 PP ..99998886.777755544.2.358
+#=GC SS_cons ..::::::::::::::::::::::::
+#=GC RF ..AAgACUUCGGAucggGCaAcAuUc
+//
+EOF
+close ALIFILE;
+
+open(MASKFILE, ">$tmppfx.mask") || die "FAIL: couldn't open $tmppfx.mask for writing alifile";
+print MASKFILE << "EOF";
+110111011011101110011101
+EOF
+close MASKFILE;
+
+$output = `$eslcompalign -h`;
+if ($? != 0) { die "FAIL: esl-compalign failed unexpectedly"; }
+if ($output !~ /Usage: esl-compalign/) { die "FAIL: help output not right"; }
+
+$output = `$eslcompalign --rna $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-compalign failed unexpectedly";}
+if ($output !~ /simpex-17 20 16 \/ 20 \(0.80\d+\) 0 \/ 0 \(0.000\) 16 \/ 20 \(0.80\d+\)/) { die "FAIL: alignments compared incorrectly"; }
+if ($output !~ /\# \*all\* - 53 \/ 64 \(0.82\d+\) 2 \/ 3 \(0.66\d+\) 55 \/ 67 \(0.82\d+\)/) { die "FAIL: alignments compared incorrectly"; }
+
+$output = `$eslcompalign -c $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-compalign failed unexpectedly"; }
+if ($output !~ /18 1 \/ 3 \(0.33\d+\) 0 \/ 1 \(0.00\d+\) 1 \/ 4 \(0.25\d+\)/) { die "FAIL: alignments compared incorrectly."; }
+
+$output = `$eslcompalign -p $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-compalign failed unexpectedly"; }
+if ($output !~ /\* 23 \/ 29 \(0.79\d+\) 2 \/ 2 \(1.0\d+\)/) { die "FAIL: alignments compared incorrectly."; }
+
+$output = `$eslcompalign --p-mask $tmppfx.mask -p $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-compalign failed unexpectedly"; }
+if ($output !~ /\* 17 \/ 21 \(0.80\d+\) 2 \/ 2 \(1.00\d+\)/) { die "FAIL: alignments compared incorrectly."; }
+
+system("$eslcompalign -c --c2dfile $tmppfx.dfile $tmppfx.1 $tmppfx.2 > /dev/null");
+if ($? != 0) { die "FAIL: esl-compalign failed unexpectedly"; }
+$output = `cat $tmppfx.dfile`;
+if ($output !~ /^0.000 0.33\d+ 0.000 0.000/) { die "FAIL: alignments compared incorrectly."; }
+
+#Test that esl-compalign can handle '~' characters annotating fragments, a la hmmbuild -O in hmmer3.
+$output = `$eslcompalign --rna $tmppfx.1 $tmppfx.3 2>&1`;
+if ($? != 0) { die "FAIL: esl-compalign failed unexpectedly";}
+if ($output !~ /simpex-17 20 16 \/ 20 \(0.80\d+\) 0 \/ 0 \(0.000\) 16 \/ 20 \(0.80\d+\)/) { die "FAIL: alignments compared incorrectly"; }
+if ($output !~ /\# \*all\* - 53 \/ 64 \(0.82\d+\) 2 \/ 3 \(0.66\d+\) 55 \/ 67 \(0.82\d+\)/) { die "FAIL: alignments compared incorrectly"; }
+
+print "ok\n";
+unlink "$tmppfx.1";
+unlink "$tmppfx.2";
+unlink "$tmppfx.3";
+unlink "$tmppfx.dfile";
+unlink "$tmppfx.mask";
+exit 0;
diff --git a/miniapps/esl-compalign.man b/miniapps/esl-compalign.man
new file mode 100644
index 0000000..a1a6dce
--- /dev/null
+++ b/miniapps/esl-compalign.man
@@ -0,0 +1,147 @@
+.TH "esl-compalign" 1 "@EASEL_DATE@" "Easel @PACKAGE_VERSION@" "Easel miniapps"
+
+.SH NAME
+.TP
+esl-compalign - compare two multiple sequence alignments
+
+
+
+.SH SYNOPSIS
+.B esl-compalign
+.I [options]
+.I trusted_file
+.I test_file
+
+
+
+.SH DESCRIPTION
+
+.I esl-compalign
+evaluates the accuracy of a predicted multiple sequence alignment with
+respect to a trusted alignment of the same sequences.
+
+The
+.I trusted_file
+and
+.I test_file
+must contain the same number of alignments. Each predicted alignment in the
+.I test_file
+will be compared against a single trusted alignment from the
+.I trusted_file.
+The first alignments in each file correspond to each other and will be
+compared, the second alignment in each file correspond to each other
+and will be compared, and so on. Each corresponding pair of
+alignments must contain the same sequences (i.e. if they were
+unaligned they would be identical) in the same order in both
+files. Further, both alignment files must be in Stockholm format and
+contain 'reference' annotation, which appears as "#=GC RF" per-column
+markup for each alignment. The number of nongap (non '.' characters)
+in the reference (RF) annotation must be identical between all
+corresponding alignments in the two files.
+
+.I esl-compalign
+reads an alignment from each file, and compares them based on
+their 'reference' annotation. The number of correctly predicted
+residues for each sequence is computed as follows. A residue that is
+in the Nth nongap RF column in the trusted alignment must also appear
+in the Nth nongap RF column in the predicted alignment to be counted
+as 'correct', otherwise it is 'incorrect'. A residue that appears in a
+gap RF column in the trusted alignment between nongap RF columns N and
+N+1 must also appear in a nongap RF column in the predicted alignment
+between nongap RF columns N and N+1 to be counted as 'correct',
+otherwise it is incorrect.
+
+The default output of
+.B esl-compalign
+lists each sequence and the number of correctly and incorrectly
+predicted residues for that sequence. These counts are broken down
+into counts for residues in the predicted alignments that occur
+in 'match' columns and 'insert' columns. A 'match' column is one for
+which the RF annotation does not contain a gap. An 'insert' column is
+one for which the RF annotation does contain a gap.
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options.
+
+.TP
+.B -c
+Print per-column statistics instead of per-sequence statistics.
+
+.TP
+.B -p
+Print statistics on accuracy versus posterior probability values. The
+.I test_file
+must be annotated with posterior probabilities (#=GR PP) for this
+option to work.
+
+.SH EXPERT OPTIONS
+
+.TP
+.BI --p-mask " <f>"
+This option may only be used in combination with the
+.B -p
+option. Read a "mask" from file
+.I <f>.
+The mask file must consist of a single line, of only '0' and '1'
+characters. There must be exactly RFLEN characters where RFLEN is the
+number of nongap characters in the RF annotation of all alignments in
+both
+.I trusted_file
+and
+.I test_file.
+Positions of the mask that are '1' characters indicate that the
+corresponding nongap RF position is included by the mask. The
+posterior probability accuracy statistics for match columns will only
+pertain to positions that are included by the mask, those that are
+excluded will be ignored from the accuracy calculation.
+
+.BI --c2dfile " <f>"
+Save a 'draw file' to file
+.I <f>
+which can be read into the
+.B esl-ssdraw
+miniapp. This draw file will define two postscript pages for
+.B esl-ssdraw.
+The first page will depict the frequency of errors per match position and
+frequency of gaps per match position, indicated by magenta and yellow,
+respectively. The darker magenta, the more errors and the darker
+yellow, the more gaps. The second page will depict the frequency of
+errors in insert positions in shades of magenta, the darker the
+magenta the more errors in inserts after each position. See
+.B esl-ssdraw
+documentation for more information on these diagrams.
+
+.TP
+.B --amino
+Assert that
+.I trusted_file
+and
+.I test_file
+contain protein sequences.
+
+.TP
+.B --dna
+Assert that
+.I trusted_file
+and
+.I test_file
+contain DNA sequences.
+
+.TP
+.B --rna
+Assert that the
+.I trusted_file
+and
+.I test_file
+contain RNA sequences.
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-compstruct.c b/miniapps/esl-compstruct.c
new file mode 100644
index 0000000..4d96ea3
--- /dev/null
+++ b/miniapps/esl-compstruct.c
@@ -0,0 +1,337 @@
+/* esl-compstruct - calculate accuracy of RNA secondary structure predictions
+ */
+#include "esl_config.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_sq.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_wuss.h"
+
+static char banner[] = "calculate accuracy of RNA secondary structure predictions";
+
+static char usage[] = "\
+[-options] <trusted file> <test file>\n\
+ Both files must be in Stockholm format with secondary structure markup.\n\
+ Sequences must occur in the same order in the two files.\n\
+ The markup must be in WUSS notation.\n\
+\n";
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; show brief info on version and usage", 0 },
+ { "-m", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use Mathews'relaxed criterion for correctness; allow +/-1 slip", 0 },
+ { "-p", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "count pseudoknotted base pairs", 0 },
+ { "--quiet", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "suppress verbose header", 0 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go; /* application configuration */
+ int kstatus, tstatus;/* return code from Easel routine */
+ int fmt; /* expected format of kfile, tfile */
+ char *kfile, *tfile; /* known, test structure file */
+ ESL_MSAFILE *kfp, *tfp; /* open kfile, tfile */
+ ESL_MSA *ka, *ta; /* known, trusted alignment */
+ int64_t klen, tlen; /* lengths of dealigned seqs */
+ int *kct, *tct; /* known, test CT rep of structure */
+ int i; /* counter over sequences */
+ int pos; /* counter over residues */
+
+ int nseq; /* total number of sequences in the files */
+ int nseq_rejected; /* total number of sequences rejected */
+
+ int kpairs; /* count of base pairs in trusted structure */
+ int tpairs; /* count of base pairs in test structure */
+ int kcorrect; /* # bp in known structure correctly predicted */
+ int tcorrect; /* # bp in test structure that are true */
+
+ int tot_kpairs; /* total bp in all known structures */
+ int tot_tpairs; /* total bp in all predicted structures */
+ int tot_kcorrect; /* total correct bp in all known structures */
+ int tot_tcorrect; /* total true pairs in all test structures */
+ int tot_positions; /* total # of bases */
+
+ int status;
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80);
+ exit(EXIT_SUCCESS);
+ }
+
+ if (esl_opt_ArgNumber(go) != 2)
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ kfile = esl_opt_GetArg(go, 1);
+ tfile = esl_opt_GetArg(go, 2);
+
+ if (! esl_opt_GetBoolean(go, "--quiet"))
+ esl_banner(stdout, argv[0], banner);
+
+ fmt = eslMSAFILE_STOCKHOLM;
+
+ /***********************************************
+ * Open the two Stockholm files.
+ ***********************************************/
+
+ if ( (status = esl_msafile_Open(NULL, kfile, NULL, fmt, NULL, &kfp)) != eslOK) esl_msafile_OpenFailure(kfp, status);
+ if ( (status = esl_msafile_Open(NULL, tfile, NULL, fmt, NULL, &tfp)) != eslOK) esl_msafile_OpenFailure(tfp, status);
+
+ /***********************************************
+ * Do structure comparisons, one seq at a time;
+ * this means looping over all seqs in all alignments.
+ ***********************************************/
+
+ tot_kpairs = tot_kcorrect = 0;
+ tot_tpairs = tot_tcorrect = 0;
+ nseq = nseq_rejected = 0;
+ tot_positions = 0;
+
+ printf("%20s %17s %17s\n", "", "[sensitivity]", "[PPV]");
+
+ while ( (kstatus = esl_msafile_Read(kfp, &ka)) != eslEOF)
+ {
+ if ( kstatus != eslOK) esl_msafile_ReadFailure(kfp, kstatus);
+ if ( (tstatus = esl_msafile_Read(tfp, &ta)) != eslOK) esl_msafile_ReadFailure(tfp, tstatus);
+
+ /* Sanity check on alignment
+ */
+ if (ka->nseq != ta->nseq) esl_fatal("trusted, test alignments don't have same seq #\n");
+ if (ka->ss == NULL) esl_fatal("trusted alignment has no secondary structure annotation\n");
+ if (ta->ss == NULL) esl_fatal("test alignment has no secondary structure annotation\n");
+
+ for (i = 0; i < ka->nseq; i++)
+ {
+ nseq++;
+ printf("%-20s ", ka->sqname[i]);
+
+ /* Sanity checks on seqs to compare, plus conversion
+ * to dealigned ct arrays ready for comparison.
+ */
+ if (ta->ss[i] == NULL)
+ {
+ printf("[REJECTED: no predicted structure]\n");
+ nseq_rejected++;
+ continue;
+ }
+ if (ka->ss[i] == NULL)
+ {
+ printf("[REJECTED: no trusted structure]\n");
+ nseq_rejected++;
+ continue;
+ }
+ if (strcmp(ka->sqname[i], ta->sqname[i]) != 0)
+ {
+ printf("[REJECTED: test seq name is %s]\n", ta->sqname[i]);
+ nseq_rejected++;
+ continue;
+ }
+
+ esl_strdealign(ka->ss[i], ka->aseq[i], "-_.~", NULL);
+ esl_strdealign(ka->aseq[i], ka->aseq[i], "-_.~", &klen);
+
+ esl_strdealign(ta->ss[i], ta->aseq[i], "-_.~", NULL);
+ esl_strdealign(ta->aseq[i], ta->aseq[i], "-_.~", &tlen);
+
+ if (klen != tlen)
+ {
+ printf("[REJECTED: seq lengths not identical]\n");
+ nseq_rejected++;
+ continue;
+ }
+
+ /* not counting pseudoknots? suppress them in the ss strings*/
+ if (! esl_opt_GetBoolean(go, "-p"))
+ {
+ esl_wuss_nopseudo(ka->ss[i], ka->ss[i]);
+ esl_wuss_nopseudo(ta->ss[i], ta->ss[i]);
+ }
+
+ ESL_ALLOC(kct, sizeof(int) * (klen+1));
+ ESL_ALLOC(tct, sizeof(int) * (tlen+1));
+ if (esl_wuss2ct(ka->ss[i], klen, kct) != eslOK)
+ {
+ printf("[REJECTED: bad trusted structure]\n");
+ nseq_rejected++;
+ continue;
+ }
+ if (esl_wuss2ct(ta->ss[i], tlen, tct) != eslOK)
+ {
+ printf("[REJECTED: bad test structure]\n");
+ nseq_rejected++;
+ continue;
+ }
+
+ /* OK, we're all set up with kct (trusted) and tct (predicted)
+ * CT arrays, and we're about to count up our correctly predicted
+ * pairs. A brief digression/commentary first. We have to
+ * define what you mean by a "correctly predicted" base
+ * pair.
+ *
+ * Our default criterion is simple and strict: the known base pair
+ * must be exactly present in the prediction; kct[pos] == tct[pos]
+ * where kct[pos] > 0.
+ *
+ * Dave Mathews [MathewsTurner99] uses a more relaxed
+ * criterion that allows a little helix slippage in the prediction.
+ * For a known pair (i,j), he considers the prediction to be correct
+ * if the prediction contains a base pair (i,j), (i+1,j), (i-1,j),
+ * (i,j+1), or (i,j-1).
+ *
+ * A problem that arises here is that the mapping of known
+ * to predicted base pairs is not one-to-one under Mathews'
+ * rule: a single predicted pair can cause two known pairs
+ * to be considered to be "correctly predicted". You'd sort
+ * of like to run some sort of maximum matching algorithm to
+ * assign a one-to-one correspondence between known and
+ * predicted pairs. It does not appear that Mathews does this,
+ * though.
+ *
+ * And for us, the problem becomes a little worse. Mathews only
+ * tabulates "correct" base pairs (our "sensitivity"), and
+ * does not run a calculation of how many predicted pairs
+ * are true (our "specificity", or positive predictive
+ * value).
+ *
+ * So: when we implement the Mathews rule, we do it the most
+ * simple and obvious way. We apply his correctness rule in
+ * both directions. A known pair i,j is considered to be
+ * correctly predicted if the prediction contains any one of
+ * the pairs (i,j), (i+1,j), (i-1,j), (i,j+1), or (i,j-1), for
+ * the purposes of sensitivity. Conversely, a predicted pair
+ * i,j is considered to be correct if the known structure
+ * contains any one of the pairs (i,j), (i+1,j), (i-1,j),
+ * (i,j+1), or (i,j-1), for the purposes of PPV. That is, we
+ * do not worry at all about establishing an optimal
+ * one-to-one mapping between known and predicted pairs. I
+ * think that this is likelyto reflect Mathews' own
+ * implementation, but have not verified this.
+ */
+ tpairs = tcorrect = 0; /* predicted "test" structure */
+ kpairs = kcorrect = 0; /* trusted "known" structure */
+ for (pos = 1; pos <= klen; pos++)
+ {
+ /* sensitivity; looking from the known (trusted) structure's
+ * base pairs.
+ */
+ if (kct[pos] > pos) /* trusted bp between (pos, kct[pos]) */
+ {
+ kpairs++; /* don't doublecount */
+
+ if (esl_opt_GetBoolean(go, "-m")) { /* mathews' version */
+ if (tct[pos] == kct[pos] || /* i,j */
+ (pos > 1 && tct[pos-1] == kct[pos]) || /* i-1, j */
+ (pos < klen && tct[pos+1] == kct[pos]) || /* i+1, j */
+ (tct[pos]> 0 && tct[pos] == kct[pos]-1) || /* i, j-1 */
+ (tct[pos]> 0 && tct[pos] == kct[pos]+1)) /* i, j+1 */
+ kcorrect++;
+ } else {
+ if (tct[pos] == kct[pos]) kcorrect++;
+ }
+ }
+
+ /* PPV/specificity; looking from the test (predicted) structure's
+ * base pairs.
+ */
+ if (tct[pos] > pos) /* predicted base pair (pos, tct[pos]) */
+ {
+ tpairs++;
+
+ if (esl_opt_GetBoolean(go, "-m")) { /* mathews' version */
+ if (kct[pos] == tct[pos] || /* i,j */
+ (pos > 1 && kct[pos-1] == tct[pos]) || /* i-1, j */
+ (pos < tlen && kct[pos+1] == tct[pos]) || /* i+1, j */
+ (kct[pos]> 0 && kct[pos] == tct[pos]-1) || /* i, j-1 */
+ (kct[pos]> 0 && kct[pos] == tct[pos]+1)) /* i, j+1 */
+ tcorrect++;
+ } else {
+ if (kct[pos] == tct[pos]) tcorrect++;
+ }
+ }
+ }
+
+ /* side note: under the default rule, tcorrect==kcorrect,
+ * because there's a one-to-one mapping of known to predicted
+ * pairs; but this is not necessarily the case for the relaxed
+ * Mathews rule.
+ */
+ tot_tpairs += tpairs;
+ tot_tcorrect += tcorrect;
+ tot_kpairs += kpairs;
+ tot_kcorrect += kcorrect;
+ tot_positions += klen;
+
+ /* print out per sequence info */
+ printf(" == %5d %5d %5.2f%% %5d %5d %5.2f%%\n",
+ kcorrect, kpairs, 100. * (float) kcorrect/ (float) kpairs,
+ tcorrect, tpairs, 100. * (float) tcorrect/ (float) tpairs);
+
+ free(tct);
+ free(kct);
+ }
+ esl_msa_Destroy(ka);
+ esl_msa_Destroy(ta);
+ }
+
+ /* Print the final summary:
+ */
+ puts("\n");
+ if (nseq_rejected > 0) {
+ printf("%d total sequences; %d counted towards comparison; %d rejected\n",
+ nseq, nseq-nseq_rejected, nseq_rejected);
+ printf("(grep \"REJECTED\" in the output to identify the problems)\n\n");
+ }
+
+ printf("Overall prediction accuracy (%d sequences, %d positions)\n",
+ nseq - nseq_rejected, tot_positions);
+ printf(" %d/%d trusted pairs predicted (%.2f%% sensitivity)\n",
+ tot_kcorrect, tot_kpairs,
+ 100. * (float) tot_kcorrect/ (float) tot_kpairs);
+ printf(" %d/%d predicted pairs correct (%.2f%% PPV)\n",
+ tot_tcorrect, tot_tpairs,
+ 100. * (float) tot_tcorrect/ (float) tot_tpairs);
+ puts("");
+
+ esl_getopts_Destroy(go);
+ esl_msafile_Close(tfp);
+ esl_msafile_Close(kfp);
+ return 0;
+
+ ERROR:
+ return status;
+}
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/miniapps/esl-compstruct.man b/miniapps/esl-compstruct.man
new file mode 100644
index 0000000..9263e0a
--- /dev/null
+++ b/miniapps/esl-compstruct.man
@@ -0,0 +1,122 @@
+.TH "esl-compstruct" 1 "@EASEL_DATE@" "Easel @PACKAGE_VERSION@" "Easel miniapps"
+
+.SH NAME
+.TP
+esl-compstruct - calculate accuracy of RNA secondary structure predictions
+
+
+
+.SH SYNOPSIS
+.B esl-compstruct
+.I [options]
+.I trusted_file
+.I test_file
+
+
+
+
+.SH DESCRIPTION
+
+.I esl-compstruct
+evaluates the accuracy of RNA secondary structure predictions
+on a per-base-pair basis.
+The
+.I trusted_file
+contains one or more sequences with trusted (known) RNA
+secondary structure annotation. The
+.I test_file
+contains the same sequences, in the same order, with
+predicted RNA secondary structure annotation.
+.I esl-compstruct
+reads the structures and compares them,
+and calculates both the sensitivity (the number
+of true base pairs that are correctly predicted)
+and the positive predictive value (PPV;
+the number of predicted base pairs that are true).
+Results are reported for each individual sequence,
+and in summary for all sequences together.
+
+.PP
+Both files must contain secondary structure annotation in
+WUSS notation. Only SELEX and Stockholm formats support
+structure markup at present.
+
+.PP
+The default definition of a correctly predicted base pair
+is that a true pair (i,j) must exactly match a predicted
+pair (i,j).
+
+.PP
+Mathews and colleagues (Mathews et al., JMB 288:911-940, 1999) use a
+more relaxed definition. Mathews defines "correct" as follows: a true
+pair (i,j) is correctly predicted if any of the following pairs are
+predicted: (i,j), (i+1,j), (i-1,j), (i,j+1), or (i,j-1). This rule
+allows for "slipped helices" off by one base. The
+.B -m
+option activates this rule for both sensitivity and for
+specificity. For specificity, the rule is reversed: predicted pair
+(i,j) is considered to be true if the true structure contains one of
+the five pairs (i,j), (i+1,j), (i-1,j), (i,j+1), or (i,j-1).
+
+
+
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.B -m
+Use the Mathews relaxed accuracy rule (see above), instead
+of requiring exact prediction of base pairs.
+
+.TP
+.B -p
+Count pseudoknotted base pairs towards the accuracy, in either trusted
+or predicted structures. By default, pseudoknots are ignored.
+.IP
+Normally, only the
+.I trusted_file
+would have pseudoknot annotation, since most RNA secondary structure
+prediction programs do not predict pseudoknots. Using the
+.B -p
+option allows you to penalize the prediction program for not
+predicting known pseudoknots. In a case where both the
+.I trusted_file
+and the
+.I test_file
+have pseudoknot annotation, the
+.B -p
+option lets you count pseudoknots in evaluating
+the prediction accuracy. Beware, however, the case where you
+use a pseudoknot-capable prediction program to generate the
+.I test_file,
+but the
+.I trusted_file
+does not have pseudoknot annotation; in this case,
+.B -p
+will penalize any predicted pseudoknots when it calculates
+specificity, even if they're right, because they don't appear in the
+trusted annotation. This is probably not what you'd want to do.
+
+
+
+.SH EXPERT OPTIONS
+
+.TP
+.B --quiet
+Don't print any verbose header information. (Used by regression test
+scripts, for example, to suppress version/date information.)
+
+
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-construct.c b/miniapps/esl-construct.c
new file mode 100644
index 0000000..4fb1921
--- /dev/null
+++ b/miniapps/esl-construct.c
@@ -0,0 +1,709 @@
+/* Construct consensus secondary structures from individually annotated
+ * secondary structures
+ *
+ * EPN, Mon May 11 06:49:37 2009
+ * SVN $Id: esl-alimanip.c 270 2008-06-19 20:45:47Z nawrockie $
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <math.h>
+#include <limits.h>
+
+#include "easel.h"
+#include "esl_distance.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_msa.h"
+#include "esl_distance.h"
+#include "esl_dmatrix.h"
+#include "esl_vectorops.h"
+#include "esl_stack.h"
+#include "esl_tree.h"
+#include "esl_wuss.h"
+
+#define CONSOPTS "-x,--ffreq,--fmin,-r,-c,--indi" /* exclusive options for defining a new consensus structure */
+
+static char banner[] = "describe or create a consensus secondary structure";
+static char usage[] = "[options] <msafile>\n\
+<msafile> must contain RNA or DNA sequences and be in Stockholm format.";
+
+static int get_gaps_per_column(ESL_MSA *msa, int **ret_ngaps);
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "help; show brief info on version and usage", 1},
+ { "-a", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, CONSOPTS, "print info on all conflicting bps in individual structures", 1},
+ { "-v", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL,NULL, "be verbose", 1 },
+ /* options for defining new consensus structures */
+ { "-x", eslARG_NONE, NULL, NULL, NULL, NULL, "-o", CONSOPTS, "set SS_cons as max set of non-conflicting bps from indi SSs", 2 },
+ { "-r", eslARG_NONE, NULL, NULL, NULL, NULL, "-o", CONSOPTS, "remove SS_cons basepairs that conflicts with > 0 indi SS", 2 },
+ { "-c", eslARG_NONE, NULL, NULL, NULL, NULL, "-o", CONSOPTS, "set SS_cons as indi SS with max bps consistent with SS_cons", 2 },
+ { "--rfc", eslARG_NONE, NULL, NULL, NULL, NULL, "-c", NULL, "with -c, set RF annotation as seq SS_cons structure comes from", 2},
+ { "--indi", eslARG_STRING, NULL, NULL, NULL, NULL, "-o", CONSOPTS, "define SS_cons as individual SS for sequence <x>", 2 },
+ { "--rfindi", eslARG_NONE, NULL, NULL, NULL, NULL, "--indi",NULL, "with --indi <x>, define RF annotation as <x>", 2 },
+ { "--ffreq", eslARG_REAL, NULL, NULL,"0.<=x<=1", NULL,"-o", CONSOPTS, "aln cols i:j become SS_cons bps if paired in > <x> indi SS", 2},
+ { "--fmin", eslARG_NONE, NULL, NULL, NULL, NULL, "-o", CONSOPTS, "same as --ffreq but find min <x> that gives consistent SS_cons", 2},
+ { "-o", eslARG_OUTFILE,NULL, NULL, NULL, NULL, NULL, "-a", "output a new alignment to file <f>", 2 },
+ { "--pfam", eslARG_NONE, FALSE, NULL, NULL, NULL, "-o", NULL, "output alignment in Pfam (non-interleaved, 1 line/seq) format", 2 },
+ /* options for listing sequences based on structural properties */
+ { "-l", eslARG_OUTFILE,NULL, NULL, NULL, NULL, NULL, NULL, "list seqs w/> 0 indi bp that conflicts w/a SS_cons bp to file <f>", 3},
+ { "--lmax", eslARG_INT, "0", NULL, "n>=0", NULL, NULL, NULL, "with -l, change maximum allowed conflicts of 0 to <x>", 3},
+ /* options for specifying alphabet */
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--rna", "<msafile> contain DNA alignments", 4 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--dna", "<msafile> contain RNA alignments", 4 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ ESL_ALPHABET *abc = NULL; /* biological alphabet */
+ char *alifile = NULL; /* alignment file name */
+ int fmt; /* format code for alifiles */
+ ESL_MSAFILE *afp = NULL; /* open alignment file */
+ ESL_MSA *msa = NULL; /* multiple sequence alignment */
+ int status; /* easel return code */
+
+ int do_info = TRUE; /* TRUE if -i */
+ int do_max = FALSE; /* TRUE if -x */
+ int do_ffreq = FALSE; /* TRUE if --ffreq */
+ int do_fmin = FALSE; /* TRUE if --fmin */
+ float fthresh = 0.; /* <x> from -f <x> */
+ int do_remove_bps = FALSE; /* TRUE if -r */
+ int do_consistent = FALSE; /* TRUE if -c */
+ int do_indi2cons = FALSE; /* TRUE if --indi <x> */
+ int have_cons; /* TRUE if first alignment has consensus sequence */
+ int do_newcons = FALSE; /* TRUE if we're creating a new consensus structure
+ * and outputing a new alignment (if -x -f -c or --indi)
+ */
+ int do_a = FALSE; /* TRUE if -a */
+ char *indi; /* for <x> from --indi <x> */
+ int nindi_read; /* number of individual sequence SS lines we've read for current alignment */
+
+ int a; /* counter over seqs */
+ int i, i2; /* counter over residues */
+ int j, j2; /* counter over residues */
+ int nali; /* counter over alignments */
+ int **bp = NULL; /* bp[i][j] is number of individual bps exist between aln cols i and j */
+ int *cur_ct = NULL; /* ct array of basepairs for current sequence */
+ int *cons_ct = NULL; /* ct array of basepairs for SS_cons being created */
+ int *xcons_ct = NULL; /* ct array of basepairs for existing SS_cons */
+ int *ngaps = NULL; /* number of gaps in each alignment position */
+ FILE *ofp; /* output file (default is stdout) */
+ int be_verbose = FALSE; /* TRUE to print extra info */
+ int seqthresh; /* sequence number threshold for defining a bp as consensus (int) ((fthresh * nseq) + 0.5)*/
+ char *sscons = NULL; /* the new SS_cons line */
+ FILE *lfp = NULL; /* file to list sequences with conflicting bps to */
+ int nlist = 0; /* number of sequences listed to list file */
+ int *nconflictsA; /* number of conflicting bps in seq a's individual structure annotation */
+ int nconflicts_total = 0; /* total number of conflicts */
+ int nconflicts_list = 0; /* total number of conflicts in sequences listed to file <x> from -l <x> */
+ int noverlaps_total = 0; /* total number of overlaps */
+ int nconsistent_total = 0; /* total number of consistent bps */
+ int nbps_total = 0; /* total number of bps */
+ int *nconsistentA; /* number of consistent bps in seq a's individual structure annotation */
+ int *noverlapsA; /* number of bps in seq a's indi structure that overlap with consensus structure */
+ int *nbpsA; /* number of bps in seq a's indi structure that overlap with consensus structure */
+ int ncons_bps = 0; /* number of bps in consensus structure */
+ int max_noverlaps_aidx;
+ int max_nconsistent_aidx;
+ int max_nbps_aidx;
+ int *removebp; /* removebp[i] is TRUE remove consensus bp [i]:xcons_ct[i] */
+ int *has_conflict;
+ int *nmates_l2r; /* half matrix, nmate_l2r[i] = <x>, i < nmate_l2r[i], there are <x> different right mates j for i */
+ int *nmates_r2l; /* half matrix, nmate_r2l[j] = <x>, j < nmate_r2l[j], there are <x> different left mates i for j */
+
+ int lmax; /* with -l, maximum number of conflicts to allow */
+ int namewidth = 18; /* length of 'SS_cons(consensus)' */
+ char *namedashes = NULL; /* to store underline for seq name */
+
+ /* --fmin related variables */
+ int nbps = 0;
+ int prev_nbps = -1;
+ float fmin;
+ int inconsistent_flag;
+ int pknot_flag;
+ int k,l;
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts("\nwhere basic options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ puts("\noptions for defining a new consensus structure (all of these require -o):");
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80);
+ puts("\noptions for listing sequences based on structure:");
+ esl_opt_DisplayHelp(stdout, go, 3, 2, 80);
+ exit(0);
+ }
+
+ if (esl_opt_ArgNumber(go) != 1)
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ alifile = esl_opt_GetArg(go, 1);
+
+ fmt = eslMSAFILE_STOCKHOLM;
+
+ /***********************************************
+ * Open the MSA file; determine alphabet; set for digital input
+ ***********************************************/
+
+ if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+
+ if ( (status = esl_msafile_Open(&abc, alifile, NULL, fmt, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+ /* open output file */
+ if (esl_opt_GetString(go, "-o") != NULL) {
+ if ((ofp = fopen(esl_opt_GetString(go, "-o"), "w")) == NULL)
+ esl_fatal("Failed to open -o output file %s\n", esl_opt_GetString(go, "-o"));
+ } else ofp = NULL;
+ if (esl_opt_GetString(go, "-l") != NULL) {
+ if ((lfp = fopen(esl_opt_GetString(go, "-l"), "w")) == NULL)
+ esl_fatal("Failed to open -l output file %s\n", esl_opt_GetString(go, "-l"));
+ }
+
+ /* determine if we're creating a structure */
+ do_max = esl_opt_GetBoolean(go, "-x");
+
+ if(!(esl_opt_IsDefault(go, "--ffreq"))) {
+ do_ffreq = TRUE;
+ fthresh = esl_opt_GetReal(go, "--ffreq");
+ }
+ if(!(esl_opt_IsDefault(go, "--fmin"))) {
+ do_fmin = TRUE;
+ }
+ do_remove_bps = esl_opt_GetBoolean(go, "-r");
+ do_consistent = esl_opt_GetBoolean(go, "-c");
+ if(!(esl_opt_IsDefault(go, "--indi"))) {
+ do_indi2cons = TRUE;
+ }
+ if(do_max || do_ffreq || do_fmin || do_remove_bps || do_consistent || do_indi2cons) {
+ do_newcons = TRUE;
+ }
+ do_a = esl_opt_GetBoolean(go, "-a");
+ if(do_a || do_max || do_ffreq || do_fmin || do_remove_bps || do_consistent || do_indi2cons) {
+ do_info = FALSE;
+ }
+
+ /***********************************************
+ * Read MSAs one at a time.
+ ***********************************************/
+ nali = 0;
+ have_cons = FALSE;
+ lmax = esl_opt_GetInteger(go, "--lmax");
+ if(esl_opt_GetBoolean(go, "-v")) be_verbose = TRUE;
+
+ while ((status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+ nali++;
+
+ /* determine max length name */
+ namewidth = 18; /* length of 'SS_cons(consensus)' */
+ for(i = 0; i < msa->nseq; i++) namewidth = ESL_MAX(namewidth, strlen(msa->sqname[i]));
+ if(namedashes != NULL) { free(namedashes); }
+ ESL_ALLOC(namedashes, sizeof(char) * namewidth+1);
+ namedashes[namewidth] = '\0';
+ for(i = 0; i < namewidth; i++) namedashes[i] = '-';
+
+ ESL_ALLOC(sscons, sizeof(char) * (msa->alen+1));
+ ESL_ALLOC(cur_ct, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(cons_ct, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(xcons_ct, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(bp, sizeof(int *) * (msa->alen+1));
+ ESL_ALLOC(removebp, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(has_conflict, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(nmates_l2r, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(nmates_r2l, sizeof(int) * (msa->alen+1));
+ esl_vec_ISet(cur_ct, (msa->alen+1), 0);
+ esl_vec_ISet(cons_ct, (msa->alen+1), 0);
+ esl_vec_ISet(xcons_ct, (msa->alen+1), 0);
+ esl_vec_ISet(removebp, (msa->alen+1), FALSE);
+ esl_vec_ISet(has_conflict, (msa->alen+1), FALSE);
+ esl_vec_ISet(nmates_l2r, (msa->alen+1), 0);
+ esl_vec_ISet(nmates_r2l, (msa->alen+1), 0);
+
+ ESL_ALLOC(nconflictsA, sizeof(int) * msa->nseq);
+ ESL_ALLOC(noverlapsA, sizeof(int) * msa->nseq);
+ ESL_ALLOC(nconsistentA, sizeof(int) * msa->nseq);
+ ESL_ALLOC(nbpsA, sizeof(int) * msa->nseq);
+ esl_vec_ISet(nconflictsA, msa->nseq, 0);
+ esl_vec_ISet(noverlapsA, msa->nseq, 0);
+ esl_vec_ISet(nconsistentA, msa->nseq, 0);
+ esl_vec_ISet(nbpsA, msa->nseq, 0);
+
+ max_noverlaps_aidx = max_nconsistent_aidx = max_nbps_aidx = 0;
+ nconsistent_total = nbps_total = noverlaps_total = nconflicts_total = nconflicts_list = 0;
+ for(i = 1; i <= msa->alen; i++) {
+ ESL_ALLOC(bp[i], sizeof(int) * (msa->alen+1));
+ esl_vec_ISet(bp[i], (msa->alen+1), 0);
+ }
+
+ /* make sure we have ss_cons and indi ss if we need it */
+ if(msa->ss_cons == NULL && do_remove_bps) esl_fatal("-r requires all alignments have SS_cons annotation, alignment %d does not.", nali);
+ if(msa->ss == NULL && do_max) esl_fatal("-x requires all alignments have individual SS annotation, alignment %d does not.", nali);
+ if(msa->ss == NULL && do_consistent) esl_fatal("-c requires all alignments have individual SS annotation, alignment %d does not.", nali);
+ if(msa->ss == NULL && do_indi2cons) esl_fatal("--indi requires all alignments have individual SS annotation, alignment %d does not.", nali);
+ if(msa->ss == NULL && do_ffreq) esl_fatal("--ffreq requires all alignments have individual SS annotation, alignment %d does not.", nali);
+ if(msa->ss == NULL && do_fmin) esl_fatal("--fmin requires all alignments have individual SS annotation, alignment %d does not.", nali);
+
+ if(msa->ss_cons != NULL) {
+ if((status = esl_wuss2ct(msa->ss_cons, msa->alen, xcons_ct)) != eslOK) {
+ esl_fatal("Existing SS_cons for alignment %d is invalid.", nali);
+ }
+ ncons_bps = 0;
+ for(i = 1; i <= msa->alen; i++)
+ if(xcons_ct[i] != 0 && i < xcons_ct[i])
+ ncons_bps++;
+
+ if(nali > 1 && !have_cons)
+ esl_fatal("the first aln has SS_cons but aln %d lacks it, if one has it, they all must.", nali);
+ if(nali == 1) have_cons = TRUE;
+ }
+ else if (lfp != NULL) {
+ esl_fatal("the -l option requires existing SS_cons annotation, aln %d lacks it.", nali);
+ }
+ else if (do_remove_bps) {
+ esl_fatal("the -r option requires existing SS_cons annotation, aln %d lacks it.", nali);
+ }
+ else if (do_consistent) {
+ esl_fatal("the -c option requires existing SS_cons annotation, aln %d lacks it.", nali);
+ }
+ else {
+ if(nali > 1 && have_cons)
+ esl_fatal("the first aln does not have SS_cons but aln %d does, if one has it, they all must.", nali);
+ }
+
+ if(do_info) {
+ printf("# Per-sequence basepair information:\n");
+ printf("# Alignment file: %s\n", alifile);
+ printf("# Alignment idx: %d\n", nali);
+ if(msa->name != NULL) { printf("# Alignment name: %s\n", msa->name); }
+ if(have_cons) {
+ printf("#\n");
+ printf("# indibp: number of basepairs in the individual sequence SS annotation\n");
+ printf("# ovrlap: number of indibp basepairs that also exist as consensus basepairs\n");
+ printf("# cnsist: number of indibp basepairs that do not conflict with any consensus basepairs\n");
+ printf("# cnflct: number of indibp basepairs that conflict with >= 1 consensus basepairs\n");
+ printf("#\n");
+ printf("# A conflict exists between two basepairs in different structures, one between columns i and j\n");
+ printf("# and the other between columns k and l, if (i == k and j != l) or (j == l and i != k).\n");
+ printf("#\n");
+ printf("# %-*s %6s %6s %6s %6s\n", namewidth, "seqname", "indibp", "ovrlap", "cnsist", "cnflct");
+ printf("# %-*s %6s %6s %6s %6s\n", namewidth, namedashes, "------", "------", "-----", "------");
+ }
+ else {
+ printf("# %-*s %6s\n", namewidth, "seqname", "nbp");
+ printf("# %-*s %6s\n", namewidth, namedashes, "------");
+ }
+ }
+
+ nindi_read = 0;
+ for (a = 0; a < msa->nseq; a++) {
+ if(msa->ss != NULL && msa->ss[a] != NULL) {
+ if((status = esl_wuss2ct(msa->ss[a], msa->alen, cur_ct)) != eslOK) {
+ esl_fatal("SS annotation for sequence %d, aln %d is invalid.\n", (a+1), nali);
+ }
+ nindi_read++;
+ for(i = 1; i <= msa->alen; i++) {
+ if(i < cur_ct[i]) {
+ bp[i][cur_ct[i]]++;
+ if(bp[i][cur_ct[i]] == 1) {
+ nmates_l2r[i]++;
+ nmates_r2l[cur_ct[i]]++;
+ }
+ }
+ }
+
+ for(i = 1; i <= msa->alen; i++) {
+ if(cur_ct[i] != 0 && i < cur_ct[i]) {
+ if(xcons_ct[i] == cur_ct[i]) noverlapsA[a]++;
+ if((xcons_ct[i] != 0) && (xcons_ct[i] != cur_ct[i])) {
+ if(be_verbose) { printf("ali: %2d seq %3d (%s) bp %4d:%4d conflicts with consensus bp %4d:%4d\n", nali, a, msa->sqname[a], i, cur_ct[i], i, xcons_ct[i]); }
+ nconflictsA[a]++;
+ /* indi bp i:cur_ct[i] conflicts with i:xcons_ct[i] */
+ removebp[i] = TRUE;
+ removebp[xcons_ct[i]] = TRUE;
+ }
+ else if((xcons_ct[cur_ct[i]] != 0) && (xcons_ct[cur_ct[i]] != i) && (cur_ct[xcons_ct[cur_ct[i]]] == 0)) {
+ if(be_verbose) { printf("ali: %2d seq %3d (%s) bp %4d:%4d conflicts with consensus bp %4d:%4d\n", nali, a, msa->sqname[a], xcons_ct[i], cur_ct[xcons_ct[i]], xcons_ct[cur_ct[i]], cur_ct[i]); }
+ nconflictsA[a]++;
+ /* indi bp i:cur_ct[i] conflicts with xcons_ct[cur_ct[i]]:cur_ct[i] */
+ removebp[cur_ct[i]] = TRUE;
+ removebp[xcons_ct[cur_ct[i]]] = TRUE;
+ }
+ else nconsistentA[a]++;
+ }
+ }
+ if(nconflictsA[a] > lmax) {
+ if(lfp != NULL) fprintf(lfp, "%s\n", msa->sqname[a]);
+ nconflicts_list += nconflictsA[a];
+ nlist++;
+ }
+ nbpsA[a] = nconflictsA[a] + nconsistentA[a];
+ nconflicts_total += nconflictsA[a];
+ nconsistent_total += nconsistentA[a];
+ noverlaps_total += noverlapsA[a];
+ nbps_total += nbpsA[a];
+
+ if(do_info && have_cons) printf(" %-*s %6d %6d %6d %6d\n", namewidth, msa->sqname[a], nbpsA[a], noverlapsA[a], nconsistentA[a], nconflictsA[a]);
+ if(do_info && !have_cons) printf(" %-*s %6d\n", namewidth, msa->sqname[a], nbpsA[a]);
+ if(nbpsA[a] > nbpsA[max_nbps_aidx]) max_nbps_aidx = a;
+ if((noverlapsA[a] > noverlapsA[max_noverlaps_aidx]) || ((noverlapsA[a] == noverlapsA[max_noverlaps_aidx]) && (nbpsA[a] > nbpsA[max_noverlaps_aidx]))) max_noverlaps_aidx = a;
+ if((nconsistentA[a] > nconsistentA[max_nconsistent_aidx]) || ((nconsistentA[a] == nconsistentA[max_nconsistent_aidx]) && (nbpsA[a] > nbpsA[max_nconsistent_aidx]))) max_nconsistent_aidx = a;
+ }
+ else if(do_newcons || esl_opt_GetBoolean(go, "-a")) { esl_fatal("No SS annotation for sequence %d, aln %d.\n", (a+1), nali); }
+ }
+
+ if(do_info && have_cons) {
+ if(nindi_read > 0) printf("\n");
+ printf(" %-*s %6d %6d %6d %6d\n", namewidth, "SS_cons(consensus)", ncons_bps, ncons_bps, ncons_bps, 0);
+ if(nindi_read > 0) {
+ printf("\n# %6d/%6d (%.3f) overlap\n", noverlaps_total, nbps_total, nbps_total > 0 ? (float) noverlaps_total / (float) nbps_total : 0.);
+ printf("# %6d/%6d (%.3f) consistent\n", nconsistent_total, nbps_total, nbps_total > 0 ? (float) nconsistent_total / (float) nbps_total: 0.);
+ printf("# %6d/%6d (%.3f) conflict\n", nconflicts_total, nbps_total, nbps_total > 0 ? (float) nconflicts_total / (float) nbps_total: 0.);
+ }
+ else {
+ printf("# No sequences in the alignment have GR SS annotation.\n");
+ }
+ }
+
+ if(lfp != NULL) {
+ printf("# %d/%d sequences with %.3f individual bps on avg that conflict with SS_cons written to %s\n", nlist, msa->nseq, (float) nconflicts_list / (float) nlist, esl_opt_GetString(go, "-l"));
+ }
+
+ /* determine number of gaps per alignment column */
+ if((status = get_gaps_per_column(msa, &ngaps)) != eslOK) goto ERROR;
+
+ /* -x: determine max bp structure OR
+ * -a: list all conflicts in individual structures */
+ if(do_max || do_a) {
+ for(i = 1; i <= msa->alen; i++) {
+ if(nmates_l2r[i] > 1) {/* list the conflicts */
+ has_conflict[i] = TRUE;
+ for(j = 1; j <= msa->alen; j++) {
+ if(bp[i][j] > 0) {
+ if(do_a) printf("More than 1 right mates for left mate %4d %4d:%4d bp exists in %4d/%4d seqs (%.3f)\n", i, i, j, bp[i][j], msa->nseq - ngaps[i], (float) bp[i][j] / (float) (msa->nseq - ngaps[i]));
+ has_conflict[j] = TRUE;
+ }
+ }
+ }
+ }
+ for(i = 1; i <= msa->alen; i++) {
+ if(nmates_r2l[i] > 1) {/* list the conflicts */
+ has_conflict[i] = TRUE;
+ for(j = 1; j <= msa->alen; j++) {
+ if(bp[j][i] > 0) {
+ if(do_a) printf("More than 1 left mates for right mate %4d %4d:%4d bp exists in %4d/%4d seqs (%.3f)\n", i, j, i, bp[j][i], msa->nseq - ngaps[i], (float) bp[j][i] / (float) (msa->nseq - ngaps[i]));
+ has_conflict[j] = TRUE;
+ }
+ }
+ }
+ }
+ for(i = 1; i <= msa->alen; i++) {
+ /*printf("conflict[%4d]: %d\n", i, has_conflict[i]);*/
+ if(nmates_l2r[i] == 1 && (!(has_conflict[i]))) {
+ j = i+1;
+ while(bp[i][j] == 0) j++;
+ cons_ct[i] = j;
+ cons_ct[j] = i;
+ }
+ }
+
+ /* remove pseudoknotted bps greedily */
+ for(i = 1; i <= msa->alen; i++) {
+ j = cons_ct[i];
+ if(j != 0 && i < j) {
+ for(i2 = i+1; i2 <= msa->alen; i2++) {
+ j2 = cons_ct[i2];
+ if(j2 != 0 && i2 < j2) {
+ if((i2 < j) && (j < j2)) {
+ /*printf("KNOT %4d:%4d (%4d) %4d:%4d (%4d)\n", i, j, bp[i][j], i2, j2, bp[i2][j2]);*/
+ /* note: remove both if they have equal number of sequences */
+ if(bp[i][j] <= bp[i2][j2]) {
+ /*printf("rm %4d:%4d\n", i, j);*/
+ cons_ct[cons_ct[i]] = 0;
+ cons_ct[i] = 0;
+ }
+ if(bp[i][j] >= bp[i2][j2]) {
+ /*printf("rm %4d:%4d\n", i2, j2);*/
+ cons_ct[cons_ct[i2]] = 0;
+ cons_ct[i2] = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /***************************************/
+ /*PARANOID, second check for knots
+ for(i = 1; i <= msa->alen; i++) {
+ j = cons_ct[i];
+ if(j != 0 && i < j) {
+ printf("BP: %4d:%4d\n", i, j);
+ for(i2 = 1; i2 <= msa->alen; i2++) {
+ j2 = cons_ct[i2];
+ if(j2 != 0 && i2 < j2) {
+ if((i2 < j) && (j < j2)) {
+ if((i < i2)) {
+ printf("KNOT %4d:%4d (%4d) %4d:%4d (%4d)\n", i, j, bp[i][j], i2, j2, bp[i2][j2]);
+ }
+ }
+ }
+ }
+ }
+ }
+ ******************************************/
+
+ /***************************************/
+ /*PARANOID, check cons_ct for consistency
+ for(i = 1; i <= msa->alen; i++) {
+ if(cons_ct[i] != 0) {
+ if(cons_ct[cons_ct[i]] != i) { printf("ERROR: i: %4d cons_ct[i]: %4d cons_ct[cons_ct[i]]: %4d\n", i, cons_ct[i], cons_ct[cons_ct[i]]); }
+ }
+ }
+ */
+ /*PARANOID, write out SS_cons
+ for(i = 1; i <= msa->alen; i++) {
+ if(i < cons_ct[i]) printf("<");
+ else if(cons_ct[i] != 0) { printf(">"); }
+ else printf(".");
+ }
+ printf("\n");
+ */
+ /***************************************/
+
+ /* textize alignment */
+ if((status = esl_msa_Textize(msa)) != eslOK) esl_fatal("ERROR textizing alignment %d\n", nali);
+
+ /* --fmin */
+ if(do_fmin) {
+ /* define ss_cons */
+ prev_nbps = -1;
+ fthresh = 0.99;
+ inconsistent_flag = pknot_flag = FALSE;
+ printf("# Defining consensus structure:\n");
+ printf("# indi SS basepair aln columns i:j (from at least 1 indi SS) will become consensus basepair\n");
+ printf("# if > <x> individual SS contain i:j as a pair\n");
+ printf("# We'll search for minimal <x> that gives a consistent consensus structure.\n");
+ printf("# A consistent structure has each position involved in 0 or 1 basepairs.\n");
+ printf("#\n");
+ printf("# Alignment file: %s\n", alifile);
+ printf("# Alignment idx: %d\n", nali);
+ printf("# Number of seqs: %d\n", msa->nseq);
+ printf("#\n");
+ printf("# %5s %23s %6s\n", "<x>", "nseq-required-with-bp", "numbps");
+ printf("# %5s %23s %6s\n", "-----", "-----------------------", "------");
+ while(fthresh >= 0.00 && (inconsistent_flag == FALSE) && (pknot_flag == FALSE)) {
+ nbps = 0;
+ seqthresh = (int) (fthresh * msa->nseq);
+ /*printf("fthresh: %f seqthresh: %d nseq: %d\n", fthresh, seqthresh, msa->nseq);*/
+ esl_vec_ISet(cons_ct, msa->alen+1, 0);
+ for(i = 1; i <= msa->alen; i++) {
+ for(j = i+1; j <= msa->alen; j++) {
+ if(bp[i][j] > seqthresh) {
+ if(cons_ct[i] != 0 || cons_ct[j] != 0) {
+ inconsistent_flag = TRUE;
+ }
+ /* check for pseudoknots */
+ for(k = i+1; k < j; k++) {
+ l = cons_ct[k];
+ if((k < l) && (l > j)) {
+ pknot_flag = TRUE;
+ }
+ if((k > l) && (l != 0) && (l < i)) {
+ pknot_flag = TRUE;
+ }
+ }
+ cons_ct[i] = j;
+ cons_ct[j] = i;
+ nbps++;
+ }
+ }
+ }
+ if(inconsistent_flag)
+ printf(" %.3f %23d %s\n", fthresh, seqthresh+1, "inconsistent");
+ else if(pknot_flag)
+ printf(" %.3f %23d %s\n", fthresh, seqthresh+1, "pseudoknotted");
+ else {
+ if(nbps != prev_nbps) {
+ printf(" %.3f %23d %6d\n", fthresh, seqthresh+1, nbps);
+ }
+ fmin = fthresh;
+ }
+ fthresh -= 0.01;
+ prev_nbps = nbps;
+ }
+ fthresh = fmin;
+ esl_vec_ISet(cons_ct, msa->alen+1, 0);
+ }
+
+ /* --ffreq: determine structure by defining consensus bps that occur in <x> fraction of indi structures */
+ if(do_ffreq || do_fmin) {
+ if(do_fmin) { printf("#\n# <x> determined to be %.3f\n", fthresh); }
+ if(do_ffreq) {
+ printf("# Defining consensus structure:\n");
+ printf("# indi SS basepair aln columns i:j (from at least 1 indi SS) will become consensus basepair\n");
+ printf("# if > %f individual SS contain i:j as a pair\n", fthresh);
+ }
+ esl_vec_ISet(cons_ct, msa->alen+1, 0);
+ /* define ss_cons */
+ seqthresh = (int) (fthresh * msa->nseq);
+ /*printf("fthresh: %f seqthresh: %d nseq: %d\n", fthresh, seqthresh, msa->nseq);*/
+ for(i = 1; i <= msa->alen; i++) {
+ for(j = i+1; j <= msa->alen; j++) {
+ if(bp[i][j] > seqthresh) {
+ if(cons_ct[i] != 0) {
+ esl_fatal("ERROR, two base pairs including position %d satisfy threshold (%d:%d and %d:%d)!\n", i, i, cons_ct[i], i, j);
+ }
+ if(cons_ct[j] != 0) {
+ esl_fatal("ERROR, two base pairs including position %d satisfy threshold (%d:%d and %d:%d)!\n", j, j, cons_ct[j], i, j);
+ }
+ cons_ct[i] = j;
+ cons_ct[j] = i;
+ }
+ }
+ }
+ }
+
+ /* -r: redefine consensus struct by removing any bps that conflict with individual structures */
+ if(do_remove_bps) {
+ for(i = 1; i <= msa->alen; i++) {
+ if(!(removebp[i])) {
+ cons_ct[i] = xcons_ct[i];
+ cons_ct[cons_ct[i]] = i;
+ }
+ else {
+ printf("# Removing consensus bp: %d:%d\n", i, xcons_ct[i]);
+ cons_ct[xcons_ct[i]] = 0;
+ cons_ct[i] = 0;
+ }
+ }
+ }
+
+ /* -c: define consensus structure as indi sequence with highest number of consistent bps with structure OR */
+ /* --indi: define consensus structure as indi sequence <x> from --indi <x> */
+ if(do_consistent || do_indi2cons) {
+ if(do_indi2cons) {
+ indi = esl_opt_GetString(go, "--indi");
+ for(a = 0; a < msa->nseq; a++) {
+ if(strcmp(indi, msa->sqname[a]) == 0) break;
+ }
+ if(a == msa->nseq) esl_fatal("ERROR, could not find a sequence named %s in the alignment.\n", indi);
+ }
+ else { /* do_consistent */
+ a = max_nconsistent_aidx;
+ }
+ if(msa->ss == NULL || msa->ss[a] == NULL) esl_fatal("ERROR, no individual SS annotation for %s in the alignment.\n", msa->sqname[a]);
+ if((status = esl_wuss2ct(msa->ss[a], msa->alen, cons_ct)) != eslOK) {
+ esl_fatal("Second pass... SS annotation for sequence %d, aln %d is invalid.\n", (a), nali);
+ }
+ printf("# Defined new SS_cons as SS annotation for %s (%d basepairs)\n", msa->sqname[a], nbpsA[a]);
+ if(esl_opt_GetBoolean(go, "--rfc") || esl_opt_GetBoolean(go, "--rfindi")) {
+ if(msa->rf != NULL) { free(msa->rf); msa->rf = NULL; }
+ if((status = esl_strcat(&(msa->rf), -1, msa->aseq[a], msa->alen)) != eslOK) goto ERROR;
+ printf("# Defined new RF as %s sequence\n", msa->sqname[a]);
+ }
+ }
+
+ /* write out alignment with new SS_cons */
+ if(do_newcons) {
+ if((status = esl_ct2wuss(cons_ct, msa->alen, sscons)) != eslOK) goto ERROR;
+ if(msa->ss_cons != NULL) { free(msa->ss_cons); msa->ss_cons = NULL; }
+ if((status = esl_strcat(&(msa->ss_cons), -1, sscons, msa->alen)) != eslOK) goto ERROR;
+ status = esl_msafile_Write(ofp, msa, (esl_opt_GetBoolean(go, "--pfam") ? eslMSAFILE_PFAM : eslMSAFILE_STOCKHOLM));
+ if (status == eslEMEM) esl_fatal("Memory error when outputting alignment\n");
+ else if (status != eslOK) esl_fatal("Writing alignment file failed with error %d\n", status);
+ }
+
+ free(sscons);
+ free(cur_ct);
+ free(cons_ct);
+ free(xcons_ct);
+ for(i = 1; i <= msa->alen; i++) free(bp[i]);
+ free(bp);
+ esl_msa_Destroy(msa);
+ }
+ if (nali == 0) esl_fatal("No alignments found in file %s\n", alifile);
+
+ /* Cleanup, normal return
+ */
+ if(lfp != NULL) fclose(lfp);
+ if(ofp != NULL) {
+ printf("# Alignment(s) saved to file %s\n", esl_opt_GetString(go, "-o"));
+ fclose(ofp);
+ }
+ esl_msafile_Close(afp);
+ esl_getopts_Destroy(go);
+ return 0;
+
+ ERROR:
+ if(afp) esl_msafile_Close(afp);
+ if(go) esl_getopts_Destroy(go);
+ if(msa) esl_msa_Destroy(msa);
+ if(lfp) fclose(lfp);
+ if(ofp) fclose(ofp);
+ esl_fatal("ERROR\n");
+ return 1;
+
+}
+
+
+/* get_gaps_per_column
+ *
+ * Given an MSA, determine the number of gaps per
+ * column, and return a newly allocated array with this
+ * into in *ret_ngaps.
+ */
+static int get_gaps_per_column(ESL_MSA *msa, int **ret_ngaps)
+{
+ int status;
+ int i, apos;
+ int *ngaps = NULL;
+ /* contract check */
+ if(! (msa->flags & eslMSA_DIGITAL)) { status = eslEINVAL; goto ERROR; }
+
+ ESL_ALLOC(ngaps, sizeof(int) * (msa->alen+1));
+ esl_vec_ISet(ngaps, msa->alen+1, 0);
+ for(i = 0; i < msa->nseq; i++) {
+ for(apos = 1; apos <= msa->alen; apos++)
+ ngaps[apos] += esl_abc_XIsGap(msa->abc, msa->ax[i][apos]);
+ }
+ *ret_ngaps = ngaps;
+ return eslOK;
+
+ ERROR:
+ if(ngaps != NULL) free(ngaps);
+ return status;
+}
diff --git a/miniapps/esl-construct.itest.pl b/miniapps/esl-construct.itest.pl
new file mode 100755
index 0000000..6ef157b
--- /dev/null
+++ b/miniapps/esl-construct.itest.pl
@@ -0,0 +1,160 @@
+#! /usr/bin/perl
+
+# Integrated test of the esl-construct miniapp.
+#
+# Usage: ./esl-construct.itest.pl <esl-construct binary> <tmpfile prefix>
+# Example: ./esl-construct.itest.pl ./esl-construct foo
+#
+# EPN, Tue Feb 2 13:19:44 2010
+
+$eslconstruct= shift;
+$tmppfx = shift;
+
+if (! -x "$eslconstruct") { die "FAIL: didn't find esl-construct binary $eslconstruct"; }
+
+open(ALIFILE, ">$tmppfx.1") || die "FAIL: couldn't open $tmppfx.1 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+simpex-1 --AGA-CUUCG-GUCGCUCG-UAACAG
+#=GR simpex-1 SS ..:<<-<____->>>-<<-<.___>>>
+simpex-2 aaAAUACGUCGGCUG-AAUACCCAGUA
+#=GR simpex-2 SS ..::<<<____>->>--<-.<___>>:
+simpex-3 --ACGUUUUG-GAACGGG-U-CCAACC
+#=GR simpex-3 SS ..::<<<____>->>-<<-<.___>>>
+#=GC SS_cons ..::<<<____>->>-<<-<.___>>>
+#=GC RF ..AAgaCUUCGGAucgggCg.AcAccc
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.2") || die "FAIL: couldn't open $tmppfx.1 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+simpex-1 --AGA-CUUCG-GUCGCUCG-UAACAG
+simpex-2 aaAAUACGUCGGCUG-AAUACCCAGUA
+simpex-3 --ACGUUUUG-GAACGGG-U-CCAACC
+#=GC SS_cons ..::<<<____>->>-<<-<.___>>>
+#=GC RF ..AAgaCUUCGGAucgggCg.AcAccc
+//
+EOF
+close ALIFILE;
+
+open(ALIFILE, ">$tmppfx.3") || die "FAIL: couldn't open $tmppfx.1 for writing alifile";
+print ALIFILE << "EOF";
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+simpex-1 --AGA-CUUCG-GUCGCUCG-UAACAG
+#=GR simpex-1 SS ..:<<-<____->>>-<<-<.___>>>
+simpex-2 aaAAUACGUCGGCUG-AAUACCCAGUA
+#=GR simpex-2 SS ..::<<<____>->>--<-.<___>>:
+simpex-3 --ACGUUUUG-GAACGGG-U-CCAACC
+#=GR simpex-3 SS ..::<<<____>->>-<<-<.___>>>
+//
+EOF
+close ALIFILE;
+
+$output = `$eslconstruct -h`;
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+if ($output !~ /Usage: esl-construct/) { die "FAIL: help output not right"; }
+
+$output = `$eslconstruct $tmppfx.1 2>&1`;
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+if ($output !~ / simpex-2 5 4 4 1/) { die "FAIL: structure stats calculated incorrectly"; }
+if ($output !~ /SS\_cons\(consensus\) 6 6 6 0/) { die "FAIL: structure stats calculated incorrectly"; }
+if ($output !~ /13\/ 17 \(0.765\) overlap/) { die "FAIL: structure stats calculated incorrectly"; }
+
+$output = `$eslconstruct $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+if ($output !~ /SS\_cons\(consensus\) 6 6 6 0/) { die "FAIL: structure stats calculated incorrectly"; }
+
+$output = `$eslconstruct $tmppfx.3 3>&1`;
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+if ($output !~ /simpex-2 5/) { die "FAIL: structure stats calculated incorrectly"; }
+
+
+$output = `$eslconstruct -a $tmppfx.1 2>&1`;
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+if ($output !~ /More than 1 right mates for left mate 7 7: 12 bp exists in 2\/ 3 seqs/) { die "FAIL: structure stats calculated incorrectly"; }
+if ($output !~ /More than 1 right mates for left mate 7 7: 13 bp exists in 1\/ 3 seqs/) { die "FAIL: structure stats calculated incorrectly"; }
+if ($output !~ /More than 1 left mates for right mate 25 20: 25 bp exists in 2\/ 3 seqs/) { die "FAIL: structure stats calculated incorrectly"; }
+if ($output !~ /More than 1 left mates for right mate 25 21: 25 bp exists in 1\/ 3 seqs/) { die "FAIL: structure stats calculated incorrectly"; }
+
+$output = `$eslconstruct -v $tmppfx.1 2>&1`;
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+if ($output !~ / simpex-2 5 4 4 1/) { die "FAIL: structure stats calculated incorrectly"; }
+if ($output !~ /SS\_cons\(consensus\) 6 6 6 0/) { die "FAIL: structure stats calculated incorrectly"; }
+if ($output !~ /13\/ 17 \(0.76\d+\) overlap/) { die "FAIL: structure stats calculated incorrectly"; }
+if ($output !~ /ali: 1 seq 0 \(simpex-1\) bp 5: 14 conflicts with consensus bp 5: 15/) { die "FAIL: structure stats calculated incorrectly"; }
+
+
+system("$eslconstruct -o $tmppfx.stk -x $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.stk`;
+if ($output !~ /\#=GC SS_cons ::::::::::::::::<<_______>>/) { die "FAIL: consensus structure calculated incorrectly"; }
+
+system("$eslconstruct -o $tmppfx.stk -r $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.stk`;
+if ($output !~ /\#=GC SS_cons :::::<_______>::<<_______>>/) { die "FAIL: consensus structure calculated incorrectly"; }
+
+system("$eslconstruct -o $tmppfx.stk -c $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.stk`;
+if ($output !~ /#=GC SS_cons ::::<<<____>->>:<<-<____>>>/) { die "FAIL: consensus stucture calculated incorrectly"; }
+
+system("$eslconstruct -o $tmppfx.stk -c --rfc $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.stk`;
+if ($output !~ /#=GC SS_cons ::::<<<____>->>:<<-<____>>>/) { die "FAIL: consensus stucture calculated incorrectly"; }
+if ($output !~ /#=GC RF --ACGUUUUG-GAACGGG-U-CCAACC/) { die "FAIL: consensus stucture calculated incorrectly"; }
+
+system("$eslconstruct -o $tmppfx.stk --indi simpex-2 $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.stk`;
+if ($output !~ /\#=GC SS_cons ::::<<<____>->>::<--<___>>:/) { die "FAIL: consensus stucture calculated incorrectly"; }
+
+system("$eslconstruct -o $tmppfx.stk --indi simpex-2 --rfindi $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.stk`;
+if ($output !~ /\#=GC SS_cons ::::<<<____>->>::<--<___>>:/) { die "FAIL: consensus stucture calculated incorrectly"; }
+if ($output !~ /\#=GC RF AAAAUACGUCGGCUG-AAUACCCAGUA/) { die "FAIL: consensus stucture calculated incorrectly"; }
+
+system("$eslconstruct -o $tmppfx.stk --ffreq 0.6 $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.stk`;
+if ($output !~ /#=GC SS_cons ::::<<<____>->>:<<-<____>>>/) { die "FAIL: consensus stucture calculated incorrectly"; }
+
+system("$eslconstruct -o $tmppfx.stk --ffreq 0.7 $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.stk`;
+if ($output !~ /#=GC SS_cons :::::::::::::::::<_______>:/) { die "FAIL: consensus stucture calculated incorrectly"; }
+
+system("$eslconstruct -o $tmppfx.stk --fmin $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.stk`;
+if ($output !~ /#=GC SS_cons ::::<<<____>->>:<<-<____>>>/) { die "FAIL: consensus stucture calculated incorrectly"; }
+
+system("$eslconstruct -l $tmppfx.list -o $tmppfx.stk --fmin $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.list`;
+if ($output !~ /simpex-1/) { die "FAIL: consensus stucture calculated incorrectly"; }
+if ($output !~ /simpex-2/) { die "FAIL: consensus stucture calculated incorrectly"; }
+
+system("$eslconstruct --lmax 1 -l $tmppfx.list -o $tmppfx.stk --fmin $tmppfx.1 > /dev/null");
+if ($? != 0) { die "FAIL: esl-construct failed unexpectedly"; }
+$output = `cat $tmppfx.list`;
+if ($output !~ /simpex-1/) { die "FAIL: consensus stucture calculated incorrectly"; }
+if ($output =~ /simpex-2/) { die "FAIL: consensus stucture calculated incorrectly"; }
+
+print "ok\n";
+unlink "$tmppfx.1";
+unlink "$tmppfx.2";
+unlink "$tmppfx.3";
+unlink "$tmppfx.stk";
+unlink "$tmppfx.list";
+exit 0;
diff --git a/miniapps/esl-construct.man b/miniapps/esl-construct.man
new file mode 100644
index 0000000..0be2436
--- /dev/null
+++ b/miniapps/esl-construct.man
@@ -0,0 +1,179 @@
+.TH "esl-construct" 1 "@EASEL_DATE@" "Easel @PACKAGE_VERSION@" "Easel miniapps"
+
+.SH NAME
+.TP
+esl-construct - describe or create a consensus secondary structure
+
+.SH SYNOPSIS
+.B esl-construct
+.I [options]
+.I msafile
+
+.SH DESCRIPTION
+
+.B esl-construct
+reports information on existing consensus secondary structure annotation
+of an alignment or derives new consensus secondary structures based on
+structure annotation for individual aligned sequences.
+
+.PP
+The alignment file must contain either individual sequence secondary
+structure annotation (Stockholm #=GR SS), consensus secondary
+structure annotation (Stockohlm #=GC SS_cons), or both. All structure
+annotation must be in WUSS notation (Vienna dot paranetheses notation will be
+correctly interpreted). At present, the alignment file must be in
+Stockholm format and contain RNA or DNA sequences.
+
+.PP
+By default,
+.B esl-construct
+generates lists the sequences in the alignment that have structure
+annotation and the number of basepairs in those structures. If the
+alignment also contains consensus structure annotation, the default output
+will list how many of the individual basepairs overlap with the
+consensus basepairs and how many conflict with a consensus basepair.
+
+.PP
+For the purposes of this miniapp, a basepair 'conflict' exists between
+two basepairs in different structures, one between columns i and j and
+the other between columns k and l, if (i == k and j != l) or (j == l
+and i != k).
+
+.PP
+.B esl-construct
+can also be used to derive a new consensus structure based on
+structure annotation for individual sequences in the alignment by
+using any of the following options:
+.B -x,
+.B -r,
+.B -c,
+.BI --indi " <s>",
+.BI --ffreq " <x>",
+.B --fmin.
+These are described below. All of these options require the
+.BI -o " <f>"
+option be used as well to specify that a new alignment file
+.I <f>
+be created. Differences between the new alignment(s) and the input
+alignment(s) will be limited to the the consensus secondary structure (#=GC
+SS_cons) annotation and possibly reference (#=GC RF) annotation.
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.B -a
+List all alignment positions that are involved in at least one
+conflicting basepair in at least one sequence to the screen, and then
+exit.
+
+.TP
+.B -v
+Be verbose; with no other options, list individual sequence basepair
+conflicts as well as summary statistics.
+
+.TP
+.B -x
+Compute a new consensus structure as the maximally sized set of
+basepairs (greatest number of basepairs) chosen from all individual
+structures that contains 0 conflicts. Output the alignment with the
+new SS_cons annotation. This option must be used in combination with
+the
+.B -o
+option.
+
+.TP
+.B -r
+Remove any consensus basepairs that conflict with >= 1 individual
+basepair and output the alignment with the new SS_cons annotation.
+This option must be used in combination with the
+.B -o
+option.
+
+.TP
+.B -c
+Define a new consensus secondary structure as the individual structure
+annotation that has the maximum number of consistent basepairs with
+the existing consensus secondary structure annotation.
+This option must be used in combination with the
+.B -o
+option.
+
+.TP
+.B --rfc
+With
+.B -c,
+set the reference annotation (#=GC RF) as the sequence whose
+individual structure becomes the consensus structure.
+
+.TP
+.BI --indi " <s>"
+Define a new consensus secondary structure as the individual structure
+annotation from sequence named
+.I <s>.
+This option must be used in combination with
+the
+.B -o
+option.
+
+.TP
+.B --rfindi
+With
+.BI --indi " <s>",
+set the reference annotation (#=GC RF) as the sequence named
+.B <s>.
+
+.TP
+.BI --ffreq " <x>"
+Define a new consensus structure as the set of basepairs between
+columns i:j that are paired in more than
+.I <x>
+fraction of the individual sequence structures.
+This option must be used in combination with
+the
+.B -o
+option.
+
+.TP
+.B --fmin
+Same as
+.BI --ffreq " <x>"
+except find the maximal
+.I <x>
+that gives a consistent consensus structure. A consistent structure
+has each base (alignment position) as a member of at most 1 basepair.
+
+.TP
+.BI -o " <s>",
+Output the alignment(s) with new consensus structure annotation to file
+.I <f>.
+
+.TP
+.B --pfam
+With -o, specify that the alignment output format be Pfam format, a
+special type of non-interleaved Stockholm on which each sequence
+appears on a single line.
+
+.TP
+.BI -l " <f>"
+Create a new file
+.I <f>
+that lists the sequences that have at least one
+basepair that conflicts with a consensus basepair.
+
+.TP
+.BI --lmax " <n>"
+With -l, only list sequences that have more than
+.I <n>
+basepairs that conflict with the consensus structure to the list file.
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-histplot.c b/miniapps/esl-histplot.c
new file mode 100644
index 0000000..0b92c71
--- /dev/null
+++ b/miniapps/esl-histplot.c
@@ -0,0 +1,284 @@
+/* esl-histplot - collate data into a histogram and output xmgrace datafile.
+ *
+ * SRE, Tue Feb 21 14:18:05 2006
+ * SVN $Id$
+ */
+
+/* Wish list
+ * - segfaults if you feed it nonnumeric data
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_histogram.h"
+#include "esl_exponential.h"
+#include "esl_gev.h"
+#include "esl_gumbel.h"
+#include "esl_normal.h"
+#include "esl_stats.h"
+
+static char banner[] = "collate a data histogram, output xmgrace datafile";
+
+static char usage[] = "[-options] <datafile>";
+
+static ESL_OPTIONS options[] = {
+ /* name type default env rng togs reqs inc help docgrp */
+ {"-h", eslARG_NONE, FALSE,NULL,NULL, NULL,NULL,NULL,"show help and usage", 1 },
+ {"-o", eslARG_OUTFILE, NULL,NULL,NULL, NULL,NULL,NULL,"output file for plot (default is stdout)", 1 },
+
+ {"-b", eslARG_NONE, FALSE,NULL,NULL, NULL,NULL,NULL,"input file is binary, array of doubles", 2 },
+ {"-f", eslARG_INT, "1",NULL,"n>0",NULL,NULL,"-b","which field to read on text line (1..n)", 2 },
+
+ {"-w", eslARG_REAL, "1.0",NULL,NULL, NULL,NULL,NULL,"bin size for histogram", 3 },
+ {"--min", eslARG_REAL, "-100.",NULL,NULL, NULL,NULL,NULL,"initial lower bound of histogram", 3 },
+ {"--max", eslARG_REAL, "100.",NULL,NULL, NULL,NULL,NULL,"initial upper bound of histogram", 3 },
+ {"--surv", eslARG_NONE, FALSE,NULL,NULL, NULL,NULL,NULL,"output survival plot, not histogram", 3 },
+
+ {"--gumbel", eslARG_NONE, FALSE, NULL,NULL, NULL,NULL,NULL,"fit data to a Gumbel distribution", 4 },
+ {"--exptail", eslARG_NONE, FALSE, NULL,NULL, NULL,NULL,NULL,"fit tail to an exponential distribution", 4 },
+ {"--gev", eslARG_NONE, FALSE, NULL,NULL, NULL,NULL,NULL,"fit data to a generalized EVD (Frechet or Weibull)", 4 },
+ {"--normal", eslARG_NONE, FALSE, NULL,NULL, NULL,NULL,NULL,"fit data to a normal (Gaussian) distribution", 4 },
+ {"--trunc", eslARG_REAL, NULL, NULL,NULL, NULL,"--gumbel",NULL,"with --gumbel, specify data are truncated, min value is <x>", 4 },
+ {"--gumloc", eslARG_NONE, FALSE, NULL,NULL, NULL,NULL,NULL,"fit data to a Gumbel distribution w/ known lambda", 4 },
+ {"--exptailloc",eslARG_NONE, FALSE, NULL,NULL, NULL,NULL,NULL,"fit tail to an exponential tail w/ known lambda", 4 },
+ {"--showgum", eslARG_NONE, FALSE, NULL,NULL, NULL,"--mu",NULL,"plot a known Gumbel for comparison", 4 },
+ {"--showexp", eslARG_NONE, FALSE, NULL,NULL, NULL,"--mu",NULL,"plot a known exponential tail for comparison", 4 },
+ {"--showgev", eslARG_NONE, FALSE, NULL,NULL, NULL,"--mu",NULL,"plot a known GEV for comparison", 4 },
+ {"--alpha", eslARG_REAL, "0.0", NULL,NULL, NULL,NULL,NULL,"set known alpha (GEV shape parameter)", 4 },
+ {"--lambda", eslARG_REAL,"0.693", NULL,NULL, NULL,NULL,NULL,"set known lambda", 4 },
+ {"--mu", eslARG_REAL, "0.0", NULL,NULL, NULL,NULL,NULL,"set known mu", 4 },
+ {"-t", eslARG_REAL, "0.01", NULL,NULL, NULL,NULL,NULL,"set tail mass to fit to", 4 },
+ { 0,0,0,0,0,0,0,0,0,0},
+};
+
+
+int
+main(int argc, char **argv)
+{
+ ESL_HISTOGRAM *h; /* full histogram w/ collated values */
+ ESL_GETOPTS *go; /* application configuration */
+ char *datafile; /* input data; "-" means stdin */
+ FILE *ifp; /* input stream */
+ double x; /* value of field, after conversion to double */
+
+ int which_field; /* which field to use as data, 1..nf (default 1)*/
+ char *outfile; /* output xmgrace xy data file */
+ FILE *ofp; /* output data stream */
+ double hmin; /* initial histogram lower bound */
+ double hmax; /* initial histogram upper bound */
+ double hbinsize; /* histogram's bin size */
+
+ double *xv;
+ int n;
+ double params[3]; /* mu, lambda, alpha */
+ double lambda;
+ double mu;
+ double alpha;
+ double tailp;
+
+ /*****************************************************************
+ * Parse the command line
+ *****************************************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h")) {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts("\nGeneral options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80); /* 1= group; 2 = indentation; 80=textwidth*/
+ puts("\nOptions that control how to read the input file:");
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80); /* 2= group; 2 = indentation; 80=textwidth*/
+ puts("\nOptions that control how to display the output XY file:");
+ esl_opt_DisplayHelp(stdout, go, 3, 2, 80); /* 3= group; 2 = indentation; 80=textwidth*/
+ puts("\nOptional ML fitting or plotting of distributions for comparison:");
+ esl_opt_DisplayHelp(stdout, go, 4, 2, 80); /* 4= group; 2 = indentation; 80=textwidth*/
+ return eslOK;
+ }
+ which_field = esl_opt_GetInteger(go, "-f");
+ outfile = esl_opt_GetString (go, "-o");
+ tailp = esl_opt_GetReal (go, "-t");
+ hbinsize = esl_opt_GetReal (go, "-w");
+ hmin = esl_opt_GetReal (go, "--min");
+ hmax = esl_opt_GetReal (go, "--max");
+ lambda = esl_opt_GetReal (go, "--lambda");
+ mu = esl_opt_GetReal (go, "--mu");
+ alpha = esl_opt_GetReal (go, "--alpha");
+
+ ESL_DASSERT1(( which_field >= 1 ));
+
+ if (esl_opt_ArgNumber(go) != 1)
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ datafile = esl_opt_GetArg(go, 1);
+
+ /*****************************************************************
+ * Open the input and output datafiles, and init the histogram.
+ *****************************************************************/
+
+ if (strcmp(datafile, "-") == 0) ifp = stdin;
+ else {
+ ifp = fopen(datafile, "rb");
+ if (ifp == NULL) esl_fatal("Failed to open input data file %s\n", datafile);
+ }
+
+ if (outfile == NULL) ofp = stdout;
+ else {
+ ofp = fopen(outfile, "w");
+ if (ofp == NULL) esl_fatal("Failed to open output xmgrace data file %s\n", outfile);
+ }
+
+ h = esl_histogram_CreateFull(hmin,hmax,hbinsize);
+ if (h == NULL) esl_fatal("Failed to create histogram");
+
+
+ /*****************************************************************
+ * Collect the data
+ *****************************************************************/
+
+ if (esl_opt_GetBoolean(go, "-b"))
+ {
+ while (fread(&x, sizeof(double), 1, ifp) == 1)
+ esl_histogram_Add(h, x);
+ }
+ else
+ {
+ char *buf; /* ptr to line buffer, for esl_fgets() */
+ int nbuf; /* allocated line lengths, for esl_fgets() */
+ char *s; /* ptr to line, for esl_strtok() */
+ char *tok; /* ptr to a data field on the line */
+ int i; /* counter over fields */
+
+ buf = NULL;
+ nbuf = 0;
+ while (esl_fgets(&buf, &nbuf, ifp) == eslOK)
+ {
+ s = buf;
+ for (i = 0; i < which_field; i++)
+ {
+ esl_strtok(&s, " \t\n", &tok);
+ if (tok == NULL) break;
+ }
+ if (tok != NULL) {
+ x = atof(tok);
+ esl_histogram_Add(h, x);
+ }
+ }
+ free(buf);
+ }
+
+ /*****************************************************************
+ * Optionally, fit the data
+ *****************************************************************/
+
+ if (esl_opt_GetBoolean(go, "--gumbel"))
+ {
+ esl_histogram_GetData(h, &xv, &n);
+ if(! esl_opt_IsDefault(go, "--trunc")) {
+ if (esl_gumbel_FitTruncated(xv, n, esl_opt_GetReal(go, "--trunc"), &(params[0]), &(params[1])) != eslOK)
+ esl_fatal("gumbel truncated fit failed");
+ } else {
+ if (esl_gumbel_FitComplete(xv, n, &(params[0]), &(params[1])) != eslOK)
+ esl_fatal("gumbel complete fit failed");
+ }
+ esl_histogram_SetExpect(h, &esl_gumbel_generic_cdf, ¶ms);
+
+ printf("# Gumbel fit: mu = %f lambda = %f\n", params[0], params[1]);
+ }
+ else if (esl_opt_GetBoolean(go, "--gumloc"))
+ {
+ params[1] = lambda;
+ esl_histogram_GetData(h, &xv, &n);
+ if (esl_gumbel_FitCompleteLoc(xv, n, params[1], &(params[0])) != eslOK)
+ esl_fatal("gumbel location-only complete fit failed");
+ esl_histogram_SetExpect(h, &esl_gumbel_generic_cdf, ¶ms);
+
+ printf("# Gumbel fit with forced lambda = %f: mu = %f\n", params[1], params[0]);
+ }
+ else if (esl_opt_GetBoolean(go, "--exptail"))
+ {
+ esl_histogram_GetTailByMass(h, tailp, &xv, &n, NULL);
+ if (esl_exp_FitComplete(xv, n, &(params[0]), &(params[1])) != eslOK)
+ esl_fatal("exponential complete fit failed");
+ esl_histogram_SetExpectedTail(h, params[0], tailp, &esl_exp_generic_cdf, ¶ms);
+
+ printf("# Exponential fit to %.2f%% tail: lambda = %f\n", tailp*100.0, params[1]);
+ }
+ else if (esl_opt_GetBoolean(go, "--exptailloc"))
+ {
+ params[1] = lambda;
+ esl_histogram_GetTailByMass(h, tailp, &xv, &n, NULL);
+ params[0] = xv[0]; /* might be able to do better than minimum score, but this'll do */
+ esl_histogram_SetExpectedTail(h, params[0], tailp, &esl_exp_generic_cdf, ¶ms);
+ }
+ else if (esl_opt_GetBoolean(go, "--gev"))
+ {
+ esl_histogram_GetData(h, &xv, &n);
+ if (esl_gev_FitComplete(xv, n, &(params[0]), &(params[1]), &(params[2])) != eslOK)
+ esl_fatal("generalized EVD complete data fit failed");
+ esl_histogram_SetExpect(h, &esl_gev_generic_cdf, ¶ms);
+
+ printf("# generalized EVD fit: mu = %f lambda = %f alpha = %f\n", params[0], params[1], params[2]);
+ }
+ else if (esl_opt_GetBoolean(go, "--normal"))
+ {
+ esl_histogram_GetData(h, &xv, &n);
+ esl_stats_DMean(xv, n, &(params[0]), &(params[1])); // params[1] is now the variance...
+ params[1] = sqrt(params[1]); // ... and now the std deviation.
+ esl_histogram_SetExpect(h, &esl_normal_generic_cdf, ¶ms);
+ }
+ else if (esl_opt_GetBoolean(go, "--showgum"))
+ {
+ params[0] = mu;
+ params[1] = lambda;
+ esl_histogram_SetExpect(h, &esl_gumbel_generic_cdf, ¶ms);
+ }
+ else if (esl_opt_GetBoolean(go, "--showexp"))
+ {
+ params[0] = mu;
+ params[1] = lambda;
+ esl_histogram_SetExpectedTail(h, mu, tailp, &esl_exp_generic_cdf, ¶ms);
+ }
+ else if (esl_opt_GetBoolean(go, "--showgev"))
+ {
+ params[0] = mu;
+ params[1] = lambda;
+ params[2] = alpha;
+ esl_histogram_SetExpect(h, &esl_gev_generic_cdf, ¶ms);
+ }
+
+ /*****************************************************************
+ * Output
+ *****************************************************************/
+ if (esl_opt_GetBoolean(go, "--surv")) esl_histogram_PlotSurvival(ofp, h);
+ else esl_histogram_Plot(ofp, h);
+
+
+ /*****************************************************************
+ * Cleanup
+ *****************************************************************/
+
+ if (outfile != NULL) fclose(ofp);
+ if (strcmp(datafile, "-") != 0) fclose(ifp);
+ esl_histogram_Destroy(h);
+ esl_getopts_Destroy(go);
+ return 0;
+}
diff --git a/miniapps/esl-histplot.man b/miniapps/esl-histplot.man
new file mode 100644
index 0000000..63018b3
--- /dev/null
+++ b/miniapps/esl-histplot.man
@@ -0,0 +1,80 @@
+.TH "esl-histplot" 1 "@EASEL_DATE@" "Easel @PACKAGE_VERSION@" "Easel miniapps"
+
+.SH NAME
+.TP
+esl-histplot - collate data histogram, output xmgrace datafile
+
+.SH SYNOPSIS
+.B esl-histplot
+.I [options]
+.I datafile
+
+
+.SH DESCRIPTION
+
+.B esl-histplot
+summarizes numerical data in the input file
+.I datafile.
+
+.pp
+One real-numbered value is taken from each line of the input file.
+Each line is split into whitespace-delimited fields, and one field
+is converted to data. By default this is the first field; this can be
+changed by the
+.I -f
+option.
+
+.pp
+Default output is a survival plot (Prob(value > x)) in xmgrace XY data
+format, to
+.B stdout.
+Output may be directed to a file with the
+.I -o
+option.
+
+.pp
+If
+.I datafile
+is "-", input lines are read from
+.B stdin
+instead of opening a file.
+
+
+
+
+.SH OPTIONS
+
+.TP
+.BI -f " <n>"
+Read data from whitespace-delimited field
+.I <n>
+on each line, instead of the first field.
+Fields are numbered starting from 1.
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.BI -o " <f>"
+Send output to file
+.I <f>
+instead of stdout.
+
+
+
+
+
+.SH EXPERT OPTIONS
+
+None.
+
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-mask.c b/miniapps/esl-mask.c
new file mode 100644
index 0000000..960b0e4
--- /dev/null
+++ b/miniapps/esl-mask.c
@@ -0,0 +1,225 @@
+/* Mask sequences in a sequence flatfile.
+ *
+ * SRE, Sat Oct 31 09:58:56 2009 [Janelia]
+ * SVN $Id$
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "easel.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+static char banner[] = "mask sequences in a sequence file";
+static char usage[] = "[options] <sqfile> <maskfile>";
+
+static void
+cmdline_failure(char *argv0, char *format, ...)
+{
+ va_list argp;
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ esl_usage(stdout, argv0, usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv0);
+ exit(1);
+}
+
+static void
+cmdline_help(char *argv0, ESL_GETOPTS *go)
+{
+ esl_banner(stdout, argv0, banner);
+ esl_usage (stdout, argv0, usage);
+
+ puts("\n where general options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+
+ puts("");
+ puts("The <seqfile> is a sequence file in any accepted format, such as FASTA.");
+ puts("It may be indexed (see esl-sfetch --index) for faster performance.");
+ puts("");
+ puts("The <maskfile> is a space-delimited file; each data line with 3 columns:");
+ puts(" field 1: <seqname> to fetch from <sqfile>");
+ puts(" field 2: <start> coordinate for mask operation, 1..n");
+ puts(" field 3: <end> coordinate for mask operation, 1..n");
+ puts("Lines starting with # are comments, and ignored.)");
+ puts("");
+ exit(0);
+}
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-o", eslARG_OUTFILE,FALSE, NULL, NULL, NULL, NULL, NULL, "output masked sequences to file <f> instead of stdout", 1 },
+ { "-r", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "reverse: mask exclusive of <start>..<end>, not inclusive", 1 },
+ { "-R", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "random access: fetch seqs from ssi-indexed <sqfile>", 1 },
+ { "-l", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-m", "convert masked residues to lower case", 1 },
+ { "-m", eslARG_CHAR, NULL, NULL, NULL, NULL, NULL, "-l", "convert masked residues to character <c>", 1 },
+ { "-x", eslARG_INT, NULL, NULL, NULL, NULL, NULL, NULL, "mask additional <n> residues beyond <start>,<end>", 1 },
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "specify that input file is in format <s>", 1 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ char *seqfile = NULL; /* sequence file name */
+ char *maskfile = NULL; /* mask coordinate file name */
+ int infmt = eslSQFILE_UNKNOWN; /* format code for seqfile */
+ int outfmt = eslSQFILE_FASTA; /* format code for output seqs */
+ ESL_SQFILE *sqfp = NULL; /* open sequence file */
+ ESL_FILEPARSER *maskefp = NULL; /* open mask coord file */
+ FILE *ofp = NULL; /* output stream for masked seqs */
+ char *source = NULL; /* name of current seq to mask */
+ char *p1, *p2; /* pointers used in parsing */
+ int64_t start, end; /* start, end coord for masking */
+ int64_t i, j, pos; /* coords in a sequence */
+ int64_t overmask; /* # of extra residues to mask */
+ ESL_SQ *sq = esl_sq_Create(); /* current sequence */
+ int do_fetching;
+ int do_lowercase;
+ int maskchar;
+ int status; /* easel return code */
+
+
+ /****************************************************************************
+ * Parse command line
+ ****************************************************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) cmdline_failure(argv[0], "Failed to parse command line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) cmdline_failure(argv[0], "Error in configuration: %s\n", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") ) cmdline_help (argv[0], go);
+ if (esl_opt_ArgNumber(go) != 2) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+
+ do_fetching = esl_opt_GetBoolean(go, "-R");
+ do_lowercase = esl_opt_GetBoolean(go, "-l");
+ overmask = (esl_opt_IsOn(go, "-x") ? esl_opt_GetInteger(go, "-x") : 0);
+ maskchar = (esl_opt_IsOn(go, "-m") ? esl_opt_GetChar(go, "-m") : 'X');
+
+ seqfile = esl_opt_GetArg(go, 1);
+ maskfile = esl_opt_GetArg(go, 2);
+
+ /* Open the <seqfile>: text mode, not digital */
+ if (esl_opt_GetString(go, "--informat") != NULL) {
+ infmt = esl_sqio_EncodeFormat(esl_opt_GetString(go, "--informat"));
+ if (infmt == eslSQFILE_UNKNOWN) cmdline_failure(argv[0], "%s is not a valid input sequence file format for --informat");
+ }
+ status = esl_sqfile_Open(seqfile, infmt, NULL, &sqfp);
+ if (status == eslENOTFOUND) cmdline_failure(argv[0], "Sequence file %s not found.\n", seqfile);
+ else if (status == eslEFORMAT) cmdline_failure(argv[0], "Format of file %s unrecognized.\n", seqfile);
+ else if (status == eslEINVAL) cmdline_failure(argv[0], "Can't autodetect stdin or .gz.\n");
+ else if (status != eslOK) cmdline_failure(argv[0], "Open failed, code %d.\n", status);
+
+ if (do_fetching && sqfp->data.ascii.ssi == NULL)
+ cmdline_failure(argv[0], "-R option (random access/fetching) requires %s to be SSI indexed\n", seqfile);
+
+ /* Open the <maskfile> */
+ if (esl_fileparser_Open(maskfile, NULL, &maskefp) != eslOK)
+ cmdline_failure(argv[0], "Failed to open mask coordinate file %s\n", maskfile);
+ esl_fileparser_SetCommentChar(maskefp, '#');
+
+ /* Open the output file, if any */
+ if (esl_opt_GetString(go, "-o") != NULL)
+ {
+ if ((ofp = fopen(esl_opt_GetString(go, "-o"), "w")) == NULL)
+ cmdline_failure(argv[0], "Failed to open output file %s\n", esl_opt_GetString(go, "-o"));
+ }
+ else ofp = stdout;
+
+
+ /****************************************************************************
+ * Main loop over lines in <maskfile>
+ ****************************************************************************/
+
+ /* Read one data line at a time from the <maskfile>;
+ * parse into data fields <seqname> <start> <end>
+ */
+ while (esl_fileparser_NextLine(maskefp) == eslOK)
+ {
+ /* First field is sequence name */
+ if (esl_fileparser_GetTokenOnLine(maskefp, &source, NULL) != eslOK)
+ esl_fatal("Failed to read source seq name on line %d of file %s\n", maskefp->linenumber, maskfile);
+
+ /* Get the sequence */
+ if (do_fetching)
+ { /* If the <seqfile> is SSI indexed, try to reposition it and read <source> seq by random access */
+ status = esl_sqio_Fetch(sqfp, source, sq);
+ if (status == eslENOTFOUND) esl_fatal("seq %s not found in SSI index for file %s\n", source, sqfp->filename);
+ else if (status == eslEINVAL) esl_fatal("No SSI index or can't reposition in file %s\n", sqfp->filename);
+ else if (status == eslEFORMAT) esl_fatal("Parse failed:\n%s\n", esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslOK) esl_fatal("Unexpected failure in fetching %s from file %s\n", source, sqfp->filename);
+ }
+ else
+ { /* else, assume we're reading sequentially; <sqfile> and <maskfile> have seqs in same order */
+ status = esl_sqio_Read(sqfp, sq);
+ if (status == eslEOF) esl_fatal("File %s ended prematurely; didn't find %s\n", sqfp->filename, source);
+ else if (status == eslEFORMAT) esl_fatal("Parse failed:\n%s\n", esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslOK) esl_fatal("Unexpected error reading sequence file %s\n", sqfp->filename);
+
+ if ((strcmp(sq->name, source) != 0) && (strcmp(sq->acc, source) != 0))
+ esl_fatal("Sequences in <sqfile> and <maskfile> aren't in same order; try -R");
+ }
+
+ /* If we're masking by lowercase, first make sure everything's uppercase */
+ if (do_lowercase)
+ for (pos = 0; pos < sq->n; pos++)
+ if (isalpha(sq->seq[pos]))
+ sq->seq[pos] = toupper(sq->seq[pos]);
+
+ /* Next two fields are <start>, <end> for the masking */
+ /* possible future extension: wrap loop around this, enable multiple masked regions */
+ if (esl_fileparser_GetTokenOnLine(maskefp, &p1, NULL) != eslOK)
+ esl_fatal("Failed to read start coord on line %d of file %s\n", maskefp->linenumber, maskfile);
+ start = strtoll(p1, &p2, 0) - 1;
+
+ if (esl_fileparser_GetTokenOnLine(maskefp, &p2, NULL) != eslOK)
+ esl_fatal("Failed to read end coord on line %d of file %s\n", maskefp->linenumber, maskfile);
+ end = strtoll(p2, &p1, 0) - 1;
+
+ /* Do the masking */
+ if (esl_opt_GetBoolean(go, "-r")) /* Reverse masking */
+ { /* leave start..end unmasked; mask prefix 0..start-1, end+1..L-1 */
+ i = 0;
+ j = ESL_MIN(sq->n-1, start - 1 + overmask);
+ for (pos = i; pos <= j; pos++)
+ if (isalpha(sq->seq[pos]))
+ sq->seq[pos] = (do_lowercase ? tolower(sq->seq[pos]) : maskchar);
+
+ i = ESL_MAX(0, end + 1 - overmask);
+ j = sq->n-1;
+ for (pos = i; pos <= j; pos++)
+ if (isalpha(sq->seq[pos]))
+ sq->seq[pos] = (do_lowercase ? tolower(sq->seq[pos]) : maskchar);
+ }
+ else
+ { /* normal: mask start..end */
+ i = ESL_MAX(0, start - overmask);
+ j = ESL_MIN(sq->n-1, end + overmask);
+ for (pos = i; pos <= j; pos++)
+ if (isalpha(sq->seq[pos]))
+ sq->seq[pos] = (do_lowercase ? tolower(sq->seq[pos]) : maskchar);
+ }
+
+ esl_sqio_Write(ofp, sq, outfmt, FALSE);
+ esl_sq_Reuse(sq);
+ }
+
+ esl_sq_Destroy(sq);
+ esl_fileparser_Close(maskefp);
+ esl_sqfile_Close(sqfp);
+ esl_getopts_Destroy(go);
+ if (ofp != stdout) fclose(ofp);
+ return 0;
+}
+
+
+
diff --git a/miniapps/esl-mask.itest.pl b/miniapps/esl-mask.itest.pl
new file mode 100755
index 0000000..02b47e8
--- /dev/null
+++ b/miniapps/esl-mask.itest.pl
@@ -0,0 +1,93 @@
+#! /usr/bin/perl
+
+# Integrated test of esl-mask miniapp.
+#
+# Usage: ./esl-mask.itest.pl <esl-mask binary> <tmpfile prefix>
+# Example: ./esl-mask.itest.pl ./esl-mask foo
+#
+# SRE, Sun Nov 1 09:26:45 2009 [Casa de Gatos]
+# SVN $Id$
+
+$eslmask = shift;
+$tmppfx = shift;
+
+if (! -x "$eslmask") { die "FAIL: didn't find esl-mask binary $eslmask"; }
+
+open(SQFILE, ">$tmppfx.1") || die "FAIL: couldn't open $tmppfx.1 for writing seqfile";
+print SQFILE << "EOF";
+>seq1
+aaAAAAAAAABBBBBBBBbbCCCCCCCCcc
+>seq2
+ddDDD
+EEEee
+FFFff
+EOF
+close SQFILE;
+
+open(MASKFILE, ">$tmppfx.2") || die "FAIL: couldn't open $tmppfx.2 for writing maskfile";
+print MASKFILE << "EOF";
+seq1 11 20
+seq2 6 10
+EOF
+close MASKFILE;
+
+$output = `$eslmask -h`;
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+if ($output !~ /Usage: esl-mask/) { die "FAIL: help output not right"; }
+
+$output = `$eslmask $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+if ($output !~ /aaAAAAAAAAXXXXXXXXXXCCCCCCCCcc/) { die "FAIL: seq masked incorrectly"; }
+if ($output !~ /ddDDDXXXXXFFFff/) { die "FAIL: seq masked incorrectly"; }
+
+$output = `$eslmask -r $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+if ($output !~ /XXXXXXXXXXBBBBBBBBbbXXXXXXXXXX/) { die "FAIL: seq masked incorrectly"; }
+if ($output !~ /XXXXXEEEeeXXXXX/) { die "FAIL: seq masked incorrectly"; }
+
+system("$eslmask -o $tmppfx.out $tmppfx.1 $tmppfx.2 2>&1");
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+$output = `cat $tmppfx.out`;
+if ($output !~ /aaAAAAAAAAXXXXXXXXXXCCCCCCCCcc/) { die "FAIL: seq masked incorrectly"; }
+if ($output !~ /ddDDDXXXXXFFFff/) { die "FAIL: seq masked incorrectly"; }
+
+$output = `$eslmask -l $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+if ($output !~ /AAAAAAAAAAbbbbbbbbbbCCCCCCCCCC/) { die "FAIL: seq masked incorrectly"; }
+if ($output !~ /DDDDDeeeeeFFFFF/) { die "FAIL: seq masked incorrectly"; }
+
+$output = `$eslmask -lr $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+if ($output !~ /aaaaaaaaaaBBBBBBBBBBcccccccccc/) { die "FAIL: seq masked incorrectly"; }
+if ($output !~ /dddddEEEEEfffff/) { die "FAIL: seq masked incorrectly"; }
+
+$output = `$eslmask -m N $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+if ($output !~ /aaAAAAAAAANNNNNNNNNNCCCCCCCCcc/) { die "FAIL: seq masked incorrectly"; }
+if ($output !~ /ddDDDNNNNNFFFff/) { die "FAIL: seq masked incorrectly"; }
+
+$output = `$eslmask -x 2 $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+if ($output !~ /aaAAAAAAXXXXXXXXXXXXXXCCCCCCcc/) { die "FAIL: seq masked incorrectly"; }
+if ($output !~ /ddDXXXXXXXXXFff/) { die "FAIL: seq masked incorrectly"; }
+
+$output = `$eslmask -x 7 $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+if ($output !~ /aaAXXXXXXXXXXXXXXXXXXXXXXXXCcc/) { die "FAIL: seq masked incorrectly"; }
+if ($output !~ /XXXXXXXXXXXXXXX/) { die "FAIL: seq masked incorrectly"; }
+
+$output = `$eslmask -rx 2 $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+if ($output !~ /XXXXXXXXXXXXBBBBBBXXXXXXXXXXXX/) { die "FAIL: seq masked incorrectly"; }
+if ($output !~ /XXXXXXXEXXXXXXX/) { die "FAIL: seq masked incorrectly"; }
+
+$output = `$eslmask -rx 7 $tmppfx.1 $tmppfx.2 2>&1`;
+if ($? != 0) { die "FAIL: esl-mask failed unexpectedly"; }
+if ($output !~ /XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/) { die "FAIL: seq masked incorrectly"; }
+if ($output !~ /XXXXXXXXXXXXXXX/) { die "FAIL: seq masked incorrectly"; }
+
+print "ok\n";
+unlink "$tmppfx.1";
+unlink "$tmppfx.2";
+unlink "$tmppfx.out";
+exit 0;
diff --git a/miniapps/esl-mask.man b/miniapps/esl-mask.man
new file mode 100644
index 0000000..34be425
--- /dev/null
+++ b/miniapps/esl-mask.man
@@ -0,0 +1,173 @@
+.TH "esl-mask" 1 "@EASEL_DATE@" "Easel @PACKAGE_VERSION@" "Easel miniapps"
+
+.SH NAME
+.TP
+esl-mask - mask sequence residues with X's (or other characters)
+
+.SH SYNOPSIS
+.B esl-mask
+.I [options]
+.I seqfile
+.I maskfile
+
+
+.SH DESCRIPTION
+
+.B esl-mask
+reads lines from
+.I maskfile
+that give start/end coordinates for
+regions in each sequence in
+.I seqfile,
+masks these residues (changes
+them to X's), and outputs the masked sequence.
+
+The
+.I maskfile
+is a space-delimited file. Blank lines and lines that start with '#'
+(comments) are ignored. Each data line contains at least three
+fields:
+.I seqname,
+.I start,
+and
+.I end.
+The
+.I seqname
+is the name of a sequence in the
+.I seqfile,
+and
+.I start
+and
+.I end
+are coordinates defining a region in that sequence.
+The coordinates are indexed <1..L> with respect to a
+sequence of length <L>.
+
+By default, the sequence names must appear in exactly the same order
+and number as the sequences in the
+.I seqfile.
+This is easy to enforce, because the format of
+.I maskfile
+is also legal as a list of names for
+.B esl-sfetch,
+so you can always fetch a temporary sequence file with
+.B esl-sfetch
+and pipe that to
+.B esl-mask.
+(Alternatively, see the
+.B -R
+option for fetching from an SSI-indexed
+.I seqfile.)
+
+The default is to mask the region indicated by
+.I <start>..<end>.
+Alternatively, everything but this region can be masked;
+see the
+.B -r
+reverse masking option.
+
+The default is to mask residues by converting them to X's.
+Any other masking character can be chosen (see
+.B -m
+option),
+or alternatively, masked residues can be lowercased (see
+.B -l
+option).
+
+The
+.I seqfile
+can be in any sequence file format that Easel reads, such as FASTA
+format. The format will be autodetected. Alternatively, for increased reliability,
+you can specify the input format; see the
+.B --informat
+option.
+
+
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.B -l
+Lowercase; mask by converting masked characters to lower case and
+unmasked characters to upper case.
+
+.TP
+.BI -m " <c>"
+Mask by converting masked residues to
+.I <c>
+instead of the default X.
+
+.TP
+.BI -o " <f>"
+Send output to file
+.I <f>
+instead of stdout.
+
+.TP
+.B -r
+Reverse mask; mask everything outside the region
+.I start..end,
+as opposed to the default of masking that region.
+
+.TP
+.B -R
+Random access;
+fetch sequences from
+.I <seqfile>
+rather than requiring that sequence names in
+.I <maskfile>
+and
+.I <seqfile>
+come in exactly the same order and number. The
+.I <seqfile> must be SSI indexed (see
+.B esl-sfetch --index.)
+
+.TP
+.BI -x " <n>"
+Extend all masked regions by up to <n> residues on each side.
+For normal masking, this means masking
+.I <start>-<n>..<end>+<n>.
+For reverse masking, this means masking
+.I 1..<start>-1+<n>
+and
+.I <end>+1-<n>..L
+in a srquence of length L.
+
+
+.TP
+.BI --informat " <s>"
+Specify that the sequence file is in format
+.I <s>,
+rather than allowing the program to autodetect
+the file format.
+
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/miniapps/esl-reformat.c b/miniapps/esl-reformat.c
new file mode 100644
index 0000000..8e81b5d
--- /dev/null
+++ b/miniapps/esl-reformat.c
@@ -0,0 +1,948 @@
+/* Convert between sequence file formats
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_mem.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_wuss.h"
+
+static char banner[] = "convert between sequence file formats";
+
+static char usage[] = "[-options] <format> <seqfile>\n\
+ Output format choices: Unaligned Aligned \n\
+ ----------- ------- \n\
+ fasta a2m \n\
+ hmmpgmd afa \n\
+ clustal \n\
+ clustallike\n\
+ pfam \n\
+ phylip \n\
+ phylips \n\
+ psiblast \n\
+ selex \n\
+ stockholm \n\
+\n";
+
+#define INCOMPATWITHSMALLOPT "--mingap,--nogap,--ignore,--acceptx"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incompat help docgroup */
+ { "-d", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-r", "convert to DNA alphabet (U->T)", 0 },
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; print brief info on version and usage", 0 },
+ { "-l", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-u", "convert to lower case", 0 },
+ { "-n", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-x", "remove DNA IUPAC codes; convert ambig chars to N", 0 },
+ { "-o", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "send output to file <f>, not stdout", 0 },
+ { "-r", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-d", "convert to RNA alphabet (T->U)", 0 },
+ { "-u", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-l", "convert to upper case", 0 },
+ { "-x", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-n", "convert non-IUPAC chars (e.g. X) in DNA to N", 0 },
+ { "--gapsym", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, "--mingap,--nogap", "convert all gaps to character <s>", 0 },
+ { "--informat", eslARG_STRING, NULL, NULL, NULL, NULL, NULL, NULL, "input sequence file is in format <s>", 0 },
+ { "--mingap", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--nogap", "remove columns containing all gaps (seqfile=MSA)", 0 },
+ { "--keeprf", eslARG_NONE, FALSE, NULL, NULL, NULL, "--mingap", NULL, "with --mingap, keep all nongap #=GC RF columns", 0 },
+ { "--nogap", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--mingap,--gapsym", "remove columns containing any gaps (seqfile=MSA)", 0 },
+ { "--wussify", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--dewuss,--fullwuss", "convert old RNA structure markup lines to WUSS", 0 },
+ { "--dewuss", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--wussify,--fullwuss","convert WUSS RNA structure markup to old format", 0 },
+ { "--fullwuss", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--wussify,--dewuss", "convert simple WUSS notation to full (output) WUSS", 0 },
+ { "--ignore", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "ignore input seq characters listed in string <s>", 0 },
+ { "--acceptx", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "accept input seq chars in string <s> as X", 0 },
+ { "--rename", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "rename and number each sequence <s>.<n>", 0 },
+ { "--replace", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "<s> = <s1>:<s2> replace characters in <s1> with those in <s2>", 0},
+ { "--small", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, INCOMPATWITHSMALLOPT, "use minimal RAM, input must be pfam, output must be afa or pfam",0 },
+ { "--id_map", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "if format is hmmpgmd, put the id map into file <s>", 0 },
+ { 0,0,0,0,0,0,0,0 },
+};
+
+static void symconvert(char *s, char *oldsyms, char *newsyms);
+static void regurgitate_pfam_as_afa(ESL_MSAFILE *afp, FILE *ofp, char *alifile, char *gapsym, int force_lower, int force_upper,
+ int force_rna, int force_dna, int iupac_to_n, int x_is_bad, char *rename, char *rfrom,
+ char *rto, int *ret_reached_eof);
+static int regurgitate_pfam_as_pfam(ESL_MSAFILE *afp, FILE *ofp, char *gapsym, int force_lower, int force_upper, int force_rna,
+ int force_dna, int iupac_to_n, int x_is_bad, int wussify, int dewuss, int fullwuss,
+ char *rfrom, char *rto);
+static int parse_replace_string(const char *rstring, char **ret_from, char **ret_to);
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go; /* application configuration */
+ char *infile; /* name of input sequence file */
+ int infmt = eslSQFILE_UNKNOWN; /* input format as a code; eslSQFILE_FASTA */
+ int outfmt = eslSQFILE_UNKNOWN; /* output format as a code */
+ int status; /* return code from an Easel call */
+ FILE *ofp; /* output stream */
+
+
+ char *outfile; /* output file, or NULL */
+ int force_rna; /* TRUE to force RNA alphabet */
+ int force_dna; /* TRUE to force DNA alphabet */
+ int force_lower; /* TRUE to force lower case */
+ int force_upper; /* TRUE to force upper case */
+ int iupac_to_n; /* TRUE to convert ambiguities all to N's */
+ int x_is_bad; /* TRUE to convert X to N */
+ int do_mingap; /* TRUE to remove cols containing all gaps */
+ int do_nogap; /* TRUE to remove cols containing any gaps */
+ char *gapsym; /* NULL if unset; else, char for gaps */
+ int wussify; /* TRUE to convert old KH SS markup to WUSS */
+ int dewuss; /* TRUE to convert WUSS back to old KH */
+ int fullwuss; /* TRUE to convert simple WUSS to full WUSS */
+ char *rename; /* if non-NULL rename seqs to <s>.<n> */
+ int do_small; /* TRUE to operate in small memory mode */
+ int do_fixbps; /* TRUE to assume SS/SS_cons are for WUSS RNA*/
+ char *rstring; /* <s> from --replace <s> */
+ char *rfrom, *rto; /* <s1> and <s2> from --replace <s>=<s1>:<s2>*/
+ int reached_eof; /* reached EOF? used only in small mem mode */
+ int idx; /* counter over sequences */
+ int nali; /* number of alignments read */
+ char errbuf[eslERRBUFSIZE]; /* for error messages */
+
+
+
+ /*****************************************************************
+ * Parse the command line
+ *****************************************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h"))
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts(" where options are:\n");
+ esl_opt_DisplayHelp(stdout, go, 0, 2, 80); /* 0= group; 2 = indentation; 80=textwidth*/
+ exit(0);
+ }
+
+ if (esl_opt_ArgNumber(go) != 2)
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ outfmt = esl_sqio_EncodeFormat(esl_opt_GetArg(go, 1));
+ if (outfmt == eslSQFILE_UNKNOWN)
+ esl_fatal("%s is not a recognized output seqfile format\n", esl_opt_GetArg(go, 1));
+
+ infile = esl_opt_GetArg(go, 2);
+
+ if (esl_opt_IsOn(go, "--informat") &&
+ (infmt = esl_sqio_EncodeFormat(esl_opt_GetString( go, "--informat"))) == eslSQFILE_UNKNOWN)
+ esl_fatal("%s is not a recognized input seqfile format\n", esl_opt_GetString(go, "--informat"));
+
+ force_dna = esl_opt_GetBoolean(go, "-d");
+ force_lower = esl_opt_GetBoolean(go, "-l");
+ iupac_to_n = esl_opt_GetBoolean(go, "-n");
+ outfile = esl_opt_GetString (go, "-o");
+ force_rna = esl_opt_GetBoolean(go, "-r");
+ force_upper = esl_opt_GetBoolean(go, "-u");
+ x_is_bad = esl_opt_GetBoolean(go, "-x");
+ gapsym = esl_opt_GetString( go, "--gapsym");
+ do_mingap = esl_opt_GetBoolean(go, "--mingap");
+ do_nogap = esl_opt_GetBoolean(go, "--nogap");
+ wussify = esl_opt_GetBoolean(go, "--wussify");
+ dewuss = esl_opt_GetBoolean(go, "--dewuss");
+ fullwuss = esl_opt_GetBoolean(go, "--fullwuss");
+ rename = esl_opt_GetString (go, "--rename");
+ do_small = esl_opt_GetBoolean(go, "--small");
+ rstring = esl_opt_GetString( go, "--replace");
+ do_fixbps = (force_rna || force_dna || wussify || dewuss || fullwuss) ? TRUE : FALSE;
+
+ /* if --small, make sure infmt == pfam and (outfmt == afa || outfmt == pfam) */
+ if(do_small && (infmt != eslMSAFILE_PFAM || (outfmt != eslMSAFILE_AFA && outfmt != eslMSAFILE_PFAM)))
+ esl_fatal("--small requires '--informat pfam' and output format of either 'afa' or 'pfam'");
+
+ if (gapsym != NULL && strlen(gapsym) != 1)
+ esl_fatal("Argument to --gapsym must be a single character.");
+
+ if (outfile == NULL) ofp = stdout;
+ else if ((ofp = fopen(outfile, "w")) == NULL)
+ esl_fatal("Failed to open output file %s\n", outfile);
+
+ if (rstring == NULL) {
+ rfrom = NULL;
+ rto = NULL;
+ }
+ else {
+ if((status = parse_replace_string(rstring, &rfrom, &rto)) != eslOK) esl_fatal("Out of memory");
+ }
+
+ /***********************************************
+ * Reformat the file, printing to stdout.
+ ***********************************************/
+
+ /* If the output format is an alignment, then the input format
+ * has to be an alignment.
+ */
+ if (esl_sqio_IsAlignment(outfmt))
+ {
+ ESL_MSAFILE *afp;
+ ESL_MSA *msa;
+
+ status = esl_msafile_Open(NULL, infile, NULL, infmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+
+ if ( esl_opt_IsOn(go, "--ignore")) esl_fatal("The --ignore option is unimplemented for alignment reformatting.");
+ if ( esl_opt_IsOn(go, "--acceptx")) esl_fatal("The --acceptx option is unimplemented for alignment reformatting.");
+
+ nali = 0;
+
+ if (do_small) {
+ if(infmt == eslMSAFILE_PFAM && outfmt == eslMSAFILE_AFA) {
+ if (afp->bf->mode_is == eslBUFFER_STREAM) esl_fatal("--small with afa out format and stdin input is unimplemented.");
+ regurgitate_pfam_as_afa(afp, ofp, infile, gapsym, force_lower, force_upper, force_rna, force_dna, iupac_to_n, x_is_bad, rename, rfrom, rto, &reached_eof);
+ if(! reached_eof) esl_fatal("Input file contains >1 alignments, but afa formatted output file can only contain 1");
+ }
+ else if (infmt == eslMSAFILE_PFAM && outfmt == eslMSAFILE_PFAM) {
+ if(rename != NULL) esl_fatal("--rename is unimplemented for combination of --small and output format pfam");
+ while((status = regurgitate_pfam_as_pfam(afp, ofp, gapsym, force_lower, force_upper, force_rna, force_dna, iupac_to_n, x_is_bad, wussify, dewuss, fullwuss, rfrom, rto)) != eslEOF) {
+ if (status == eslEFORMAT) esl_fatal("--small alignment file parse error:\n%s\n", afp->errmsg);
+ else if (status == eslEINVAL) esl_fatal("--small alignment file parse error:\n%s\n", afp->errmsg);
+ else if (status != eslOK) esl_fatal("--small alignment file read failed with error code %d\n", status);
+ }
+ esl_msafile_Close(afp);
+ }
+ else { /* do_small enabled, but neither (infmt==pfam && outfmt=afa) nor (infmt==pfam && outfmt==pfam) */
+ esl_fatal("--small requires '--informat pfam' and output format of either 'afa' or 'pfam'");
+ }
+ }
+ else { /* normal mode, --small not enabled */
+ while ((status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+ nali++;
+
+ if (nali > 1 && ! esl_msafile_IsMultiRecord(outfmt))
+ esl_fatal("Input file contains >1 alignments, but %s formatted output file can only contain 1", esl_msafile_DecodeFormat(outfmt));
+
+ if (do_mingap) if((status = esl_msa_MinimGapsText(msa, errbuf, "-_.~", esl_opt_GetBoolean(go, "--keeprf"), do_fixbps)) != eslOK) esl_fatal(errbuf);
+ if (do_nogap) if((status = esl_msa_NoGapsText (msa, errbuf, "-_.~", do_fixbps)) != eslOK) esl_fatal(errbuf);
+ if (rfrom) esl_msa_SymConvert(msa, rfrom, rto);
+ if (gapsym) esl_msa_SymConvert(msa, "-_.", gapsym);
+ if (force_lower) esl_msa_SymConvert(msa,
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ "abcdefghijklmnopqrstuvwxyz");
+ if (force_upper) esl_msa_SymConvert(msa,
+ "abcdefghijklmnopqrstuvwxyz",
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+ if (force_rna) esl_msa_SymConvert(msa, "Tt", "Uu");
+ if (force_dna) esl_msa_SymConvert(msa, "Uu", "Tt");
+ if (iupac_to_n) esl_msa_SymConvert(msa,
+ "RYMKSWHBVDrymkswhbvd",
+ "NNNNNNNNNNnnnnnnnnnn");
+ if (x_is_bad) esl_msa_SymConvert(msa, "Xx", "Nn");
+
+ if (rename)
+ {
+ for (idx = 0; idx < msa->nseq; idx++)
+ esl_msa_FormatSeqName(msa, idx, "%s.%d", rename, idx+1);
+ }
+
+ if (wussify)
+ {
+ if (msa->ss_cons) esl_kh2wuss(msa->ss_cons, msa->ss_cons);
+ if (msa->ss)
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (msa->ss[idx]) esl_kh2wuss(msa->ss[idx], msa->ss[idx]);
+ }
+
+ if (dewuss)
+ {
+ if (msa->ss_cons) esl_wuss2kh(msa->ss_cons, msa->ss_cons);
+ if (msa->ss)
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (msa->ss[idx]) esl_wuss2kh(msa->ss[idx], msa->ss[idx]);
+ }
+
+ if (fullwuss)
+ {
+ if (msa->ss_cons != NULL)
+ {
+ status = esl_wuss_full(msa->ss_cons, msa->ss_cons);
+ if (status == eslESYNTAX) esl_fatal("Bad consensus SS: not in WUSS format\n");
+ else if (status != eslOK) esl_fatal("Conversion of SS_cons failed, code %d\n", status);
+ }
+ if (msa->ss != NULL)
+ for (idx = 0; idx < msa->nseq; idx++)
+ if (msa->ss[idx] != NULL)
+ {
+ status = esl_wuss_full(msa->ss[idx], msa->ss[idx]);
+ if (status == eslESYNTAX) esl_fatal("Bad SS for %s: not in WUSS format\n", msa->sqname[idx]);
+ else if (status != eslOK) esl_fatal("Conversion of SS for %s failed, code %d\n", msa->sqname[idx], status);
+ }
+ }
+
+ esl_msafile_Write(ofp, msa, outfmt);
+ esl_msa_Destroy(msa);
+ }
+ }
+ esl_msafile_Close(afp);
+ } /* end of alignment->alignment conversion */
+ else
+ { /* else: conversion to unaligned file formats */
+ ESL_SQFILE *sqfp; /* open input sequence file */
+ ESL_SQ *sq; /* an input sequence */
+ char *mapfile; /* file name into which an hmmpgmd map file should be written */
+ FILE *mapfp; /* output stream for the map file */
+
+ status = esl_sqfile_Open(infile, infmt, NULL, &sqfp);
+ if (status == eslENOTFOUND)
+ esl_fatal("Couldn't open seqfile %s\n", infile);
+ else if (status == eslEFORMAT)
+ esl_fatal("Couldn't determine format of seqfile %s\n", infile);
+ else if (status == eslEINVAL)
+ esl_fatal("Can't autodetect format of stdin or .gz; use --informat\n");
+ else if (status != eslOK)
+ esl_fatal("Open of seqfile %s failed, code %d\n", infile, status);
+
+ if ( esl_opt_IsOn(go, "--ignore")) esl_sqio_Ignore (sqfp, esl_opt_GetString(go, "--ignore"));
+ if ( esl_opt_IsOn(go, "--acceptx")) esl_sqio_AcceptAs(sqfp, esl_opt_GetString(go, "--acceptx"), 'X');
+
+ sq = esl_sq_Create();
+
+ if ( outfmt == eslSQFILE_HMMPGMD ) {
+ int64_t res_cnt = 0;
+ char timestamp[32];
+ time_t date;
+
+ //will need to make two passes through the file, one to get sequence count, one to convert sequences
+ if (! esl_sqfile_IsRewindable(sqfp))
+ esl_fatal("Target sequence file %s isn't rewindable; can't produce a file in hmmpgmd format", infile);
+
+
+ //pick map file name, and open the file
+ if (esl_opt_IsUsed(go, "--id_map")) {
+ mapfile = esl_opt_GetString( go, "--id_map");
+ } else {
+ esl_strdup(infile, -1, &mapfile); // there will be an infile, because stdin was restricted above
+ esl_strcat(&mapfile, -1, ".map", 4);
+ }
+ if ((mapfp = fopen(mapfile, "w")) == NULL)
+ esl_fatal("Failed to open map output file %s\n", mapfile);
+
+ //get counts, and write out the map file
+ idx = 0;
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK) {
+ res_cnt += sq->n;
+ esl_sq_Reuse(sq);
+ idx++;
+ }
+
+ /* status should be eslEOF on normal end; if it isn't, deal w/ error */
+ if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s):\n%s\n",
+ sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected error %d reading sequence file %s",
+ status, sqfp->filename);
+
+ /* Print the first line of the hmmpgmd format, which contains database information.
+ * #<res_count> <seq_count> <db_count> <db_sequences_1> <db_sequences_before_removing_duplicates_1> <db_sequences_2> <db_sequences_before_removing_duplicates_2> ... <date_stamp>
+ * It shoves all sequences into a single database, #1.
+ */
+ date = time(NULL);
+ ctime_r(&date, timestamp);
+ fprintf(mapfp, "%d\n", idx);
+ fprintf(ofp, "#%" PRId64 " %d %d %d %d %s", res_cnt, idx, 1, idx, idx, timestamp);
+
+ esl_sqfile_Position(sqfp, 0);
+ }
+
+
+ idx = 0;
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ if (rfrom!=NULL) symconvert(sq->seq, rfrom, rto);
+ if (force_lower) symconvert(sq->seq,
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ "abcdefghijklmnopqrstuvwxyz");
+ if (force_upper) symconvert(sq->seq,
+ "abcdefghijklmnopqrstuvwxyz",
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+ if (force_rna) symconvert(sq->seq, "Tt", "Uu");
+ if (force_dna) symconvert(sq->seq, "Uu", "Tt");
+ if (iupac_to_n) symconvert(sq->seq,
+ "RYMKSWHBVDrymkswhbvd",
+ "NNNNNNNNNNnnnnnnnnnn");
+ if (x_is_bad) symconvert(sq->seq, "Xx", "Nn");
+
+ if (wussify && sq->ss != NULL) esl_kh2wuss(sq->ss, sq->ss);
+ if (dewuss && sq->ss != NULL) esl_wuss2kh(sq->ss, sq->ss);
+
+ if (fullwuss && sq->ss != NULL)
+ {
+ status = esl_wuss_full(sq->ss, sq->ss);
+ if (status == eslESYNTAX)
+ esl_fatal("Bad SS for %s: not in WUSS format\n", sq->name);
+ else if (status != eslOK)
+ esl_fatal("Conversion of SS for %s failed, code %d\n",
+ sq->name, status);
+ }
+
+ if ( outfmt == eslSQFILE_HMMPGMD ) {
+ fprintf(mapfp, "%d %s %s\n", idx+1, sq->name?sq->name:"", sq->desc?sq->desc:"");
+ esl_sq_FormatName(sq, "%d 1", idx+1);
+ esl_sq_FormatDesc(sq, "");
+ } else {
+ if (rename) esl_sq_FormatName(sq, "%s.%d", rename, idx+1);
+ }
+ esl_sqio_Write(ofp, sq, outfmt, FALSE);
+ esl_sq_Reuse(sq);
+ idx++;
+ }
+ /* status should be eslEOF on normal end; if it isn't, deal w/ error */
+ if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s):\n%s\n",
+ sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected error %d reading sequence file %s",
+ status, sqfp->filename);
+
+ if ( outfmt == eslSQFILE_HMMPGMD )
+ fclose(mapfp);
+
+ esl_sq_Destroy(sq);
+ esl_sqfile_Close(sqfp);
+ } /* end of unaligned seq conversion */
+
+ if (ofp != stdout) fclose(ofp);
+ esl_getopts_Destroy(go);
+
+ if(rfrom != NULL) free(rfrom);
+ if(rto != NULL) free(rto);
+
+ exit(0);
+}
+
+/* symconvert()
+ *
+ * single seq version of esl_msa_SymConvert(); see
+ * documentation there.
+ *
+ * no reason yet to include in sqio API, but that may change.
+ *
+ * inefficient to use this for upper/lower case conversion,
+ * prob by an order of magnitude (because of the strchr() call,
+ * which could be replaced by a range test), but I bet it's
+ * unnoticeable.
+ */
+static void
+symconvert(char *s, char *oldsyms, char *newsyms)
+{
+ int pos;
+ char *sptr;
+ int special;
+
+ special = (strlen(newsyms) == 1 ? TRUE : FALSE);
+
+ for (pos = 0; s[pos] != '\0'; pos++)
+ if ((sptr = strchr(oldsyms, s[pos])) != NULL)
+ s[pos] = (special ? *newsyms : newsyms[sptr-oldsyms]);
+}
+
+
+
+/* regurgitate_pfam_as_afa()
+ *
+ * Given an open Pfam formatted msafile, read the next alignment and
+ * regurgitate it in aligned FASTA (AFA) format without storing
+ * it in a esl_msa data structure.
+ *
+ * We need to do two passes through the file because in Pfam
+ * sequence accessions (#=GS <seqname> AC) and sequence descriptions
+ * (#=GS <seqname> DE) appear altogether before any aligned sequence
+ * data, while in AFA they appear on the same line as the sequence
+ * name (accession, then description).
+ *
+ * Example:
+ * # STOCKHOLM 1.0
+ * #=GS tRNA1 AC RF00005-1
+ * #=GS tRNA2 AC RF00005-2
+ * #=GS tRNA1 DE first tRNA
+ * #=GS tRNA2 DE second tRNA
+ *
+ * tRNA1 GCGGAUUUAGCUCAGUUGGG.AGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCA
+ * tRNA2 UCCGAUAUAGUGUAAC.GGCUAUCACAUCACGCUUUCACCGUGGAGA.CCGGGGUUCGACUCCCCGUAUCGGAG
+ *
+ * converts to AFA:
+ * >tRNA1 RF00005-1 first tRNA
+ * GCGGAUUUAGCUCAGUUGGG.AGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAU
+ * CCACAGAAUUCGCA
+ * >tRNA2 RF00005-2 second tRNA
+ * UCCGAUAUAGUGUAAC.GGCUAUCACAUCACGCUUUCACCGUGGAGA.CCGGGGUUCGAC
+ * UCCCCGUAUCGGAG
+ *
+ * In the first pass, output the sequence names and accessions we find
+ * as '#=GS <seqname> AC' lines in the Pfam alignment to an accession
+ * tmpfile, and output sequence names and descriptions we find as
+ * as '#=GS <seqname> DE' lines in the Pfam alignment to a description
+ * tmpfile.
+ *
+ * In the second pass, rewind all (up to 3) files: <ac_tmpfile>,
+ * <de_tmpfile> and the Pfam alignment file and start reading them
+ * again. As we're reading them, output the accessions, descriptions
+ * and aligned sequence data in the proper order to an aligned FASTA
+ * file.
+ *
+ * Set <ret_reached_eof> as TRUE if the alignment read and reformatted
+ * appears to be the only one remaining in afp. Set <ret_reached_eof>
+ * as FALSE if afp appears to include at least one more alignment.
+ *
+ * Returns void. Dies upon any input error.
+ */
+static void
+regurgitate_pfam_as_afa(ESL_MSAFILE *afp, FILE *ofp, char *alifile, char *gapsym, int force_lower, int force_upper, int force_rna, int force_dna, int iupac_to_n, int x_is_bad, char *rename, char *rfrom, char *rto, int *ret_reached_eof)
+{
+ char *p = NULL;
+ esl_pos_t n = 0;
+ esl_pos_t gslen, seqnamelen, taglen;
+ char *seqname = NULL;
+ char *first_seqname = NULL;
+ char *tag = NULL;
+ char *gs = NULL;
+ int nseq_read = 0;
+ int reached_eof;
+ /* variables related to reading accessions */
+ char ac_tmpfile[16] = "esltmpXXXXXX";
+ FILE *ac_fp = NULL; /* file ptr for accession tmpfile */
+ char *ac_buf = NULL; /* buffer for line input w/ sre_fgets() */
+ int ac_buflen = 0; /* current allocated length for buf */
+ char *ac_s = NULL;
+ char *ac_seqname = NULL;
+ char *ac = NULL;
+ int have_ac = FALSE;
+ /* variables related to reading descriptions */
+ char de_tmpfile[16] = "esltmpXXXXXX";
+ FILE *de_fp = NULL; /* file ptr for description tmpfile */
+ char *de_buf = NULL; /* buffer for line input w/ sre_fgets() */
+ int de_buflen = 0; /* current allocated length for buf */
+ char *de_s = NULL;
+ char *de_seqname = NULL;
+ char *de = NULL;
+ int have_de = FALSE;
+ /* variables related to printing out sequences */
+ char *aseq = NULL;
+ esl_pos_t aseqlen = 0;
+ int64_t apos;
+ char aseqbuf[61];
+ int cpl = 60; /* number of residues per afa seq line */
+ int acpl; /* actual number of character per line */
+ int status;
+
+ afp->errmsg[0] = '\0';
+
+ /**************************************************************************************************
+ * First pass, go through each line of the Pfam file and output all GS DE and AC annotation to tmpfiles
+ **************************************************************************************************/
+
+ /* Check the magic Stockholm header line, allowing blank lines */
+ do {
+ status = esl_msafile_GetLine(afp, &p, &n);
+ if (status == eslEOF) return;
+ else if (status != eslOK) esl_fatal("small mem parse error. problem reading line %d of msafile", (int) afp->linenumber);
+ } while (esl_memspn(afp->line, afp->n, " \t") == afp->n || /* skip blank lines */
+ (esl_memstrpfx(afp->line, afp->n, "#") /* and skip comment lines */
+ && ! esl_memstrpfx(afp->line, afp->n, "# STOCKHOLM"))); /* but stop on Stockholm header */
+
+ if (! esl_memstrpfx(afp->line, afp->n, "# STOCKHOLM 1.")) esl_fatal("small mem parse failed (line %d): missing \"# STOCKHOLM\" header", (int) afp->linenumber);
+
+ while ((status = esl_msafile_GetLine(afp, &p, &n)) == eslOK)
+ {
+ while (n && ( *p == ' ' || *p == '\t')) { p++; n--; } /* skip leading whitespace */
+
+ if (esl_memstrpfx(p, n, "#=GS"))
+ { /* only lines we need to check are AC and DE lines, we don't even check other lines for validity */
+ if (esl_memtok(&p, &n, " \t", &gs, &gslen) != eslOK) esl_fatal("small mem parse failed (line %d) in a way that can't happen", (int) afp->linenumber);
+ if (esl_memtok(&p, &n, " \t", &seqname, &seqnamelen) != eslOK) esl_fatal("small mem parse failed (line %d): #=GS line missing <seqname>, <tag>, annotation", (int) afp->linenumber);
+ if (esl_memtok(&p, &n, " \t", &tag, &taglen) != eslOK) esl_fatal("small mem parse failed (line %d): #=GS line missing <tag>, annotation", (int) afp->linenumber);
+ if (! esl_memstrcmp(gs, gslen, "#=GS")) esl_fatal("small mem parse failed (line %d): faux #=GS line?", (int) afp->linenumber);
+
+ if (esl_memstrcmp(tag, taglen, "AC"))
+ {
+ if (! ac_fp && esl_tmpfile(ac_tmpfile, &ac_fp) != eslOK) esl_fatal("small mem parse failed, unable to open accession tmpfile");
+ fprintf(ac_fp, "%.*s %.*s\n", (int) seqnamelen, seqname, (int) n, p); // cppcheck thinks ac_fp is a "possible null pointer deference"; I think it's wrong.
+ }
+ if (esl_memstrcmp(tag, taglen, "DE"))
+ {
+ if (! de_fp && esl_tmpfile(de_tmpfile, &de_fp) != eslOK) esl_fatal("small mem parse failed, unable to open description tmpfile");
+ fprintf(de_fp, "%.*s %.*s\n", (int) seqnamelen, seqname, (int) n, p); // cppcheck thinks de_fp is a "possible null pointer deference"; I think it's wrong.
+ }
+ }
+ else if (esl_memstrpfx(p, n, "//")) break;
+ }
+ if (status == eslEOF) esl_fatal("small mem parse failed (line %d): missing // terminator", (int) afp->linenumber);
+ else if (status != eslOK) esl_fatal("small mem parse failed (line %d) with code %d", (int) afp->linenumber, status);
+
+ /* The regurgitate_*() functions are limited, and only deal with single-record Pfam files.
+ * If there appears to be more data in the file, drop the reached_eof flag.
+ */
+ while ((status = esl_msafile_GetLine(afp, &p, &n)) == eslOK)
+ {
+ while (n && ( *p == ' ' || *p == '\t')) { p++; n--; } /* skip leading whitespace */
+ if (esl_memstrpfx(p, n, "# STOCKHOLM 1.")) break;
+ if (n && ! esl_memstrpfx(p, n, "#")) esl_fatal("small mem parse failed (line %d): unexpected data", (int) afp->linenumber);
+ }
+ if (status == eslOK) reached_eof = FALSE;
+ else if (status == eslEOF) reached_eof = TRUE;
+ else esl_fatal("--small parse error. problem reading line %d of msafile", (int) afp->linenumber);
+
+ /*****************************************************************
+ * Pass 1 complete; rewind (close/reopen) all files
+ *****************************************************************/
+
+ esl_msafile_Close(afp);
+ if ((status = esl_msafile_Open(NULL, alifile, NULL, eslMSAFILE_PFAM, NULL, &afp)) != eslOK)
+ esl_fatal("--small, second pass, unable to open file %s for reading", alifile);
+
+ if (ac_fp) { /* open the tmpfile with the seq accessions */
+ rewind(ac_fp);
+ if((status = esl_fgets(&(ac_buf), &(ac_buflen), ac_fp)) != eslOK) esl_fatal("--small accession tmpfile parse failed");
+ ac_s = ac_buf;
+ if (esl_strtok_adv(&ac_s, " \t\n\r", &ac_seqname, NULL, NULL) != eslOK) esl_fatal("--small accession tmpfile parse failed");
+ if (esl_strtok_adv(&ac_s, "\n\r", &ac, NULL, NULL) != eslOK) esl_fatal("--small accession tmpfile parse failed");
+ }
+ if (de_fp) { /* open the tmpfile with the seq descriptions */
+ rewind(de_fp);
+ if((status = esl_fgets(&(de_buf), &(de_buflen), de_fp)) != eslOK) esl_fatal("--small description tmpfile parse failed");
+ de_s = de_buf;
+ if (esl_strtok_adv(&de_s, " \t\n\r", &de_seqname, NULL, NULL) != eslOK) esl_fatal("--small description tmpfile parse failed");
+ if (esl_strtok_adv(&de_s, "\n\r", &de, NULL, NULL) != eslOK) esl_fatal("--small description tmpfile parse failed");
+ }
+
+ /******************************************************************************************
+ * Pass 2, step through files, outputting appropriately
+ ******************************************************************************************/
+
+ do {
+ status = esl_msafile_GetLine(afp, &p, &n);
+ if (status == eslEOF) return;
+ else if (status != eslOK) esl_fatal("small mem parse pass 2 error. problem reading line %d of msafile", (int) afp->linenumber);
+ } while (esl_memspn(afp->line, afp->n, " \t") == afp->n || /* skip blank lines */
+ (esl_memstrpfx(afp->line, afp->n, "#") /* and skip comment lines */
+ && ! esl_memstrpfx(afp->line, afp->n, "# STOCKHOLM"))); /* but stop on Stockholm header */
+
+ if (! esl_memstrpfx(afp->line, afp->n, "# STOCKHOLM 1.")) esl_fatal("small mem parse pass 2 failed (line %d): missing \"# STOCKHOLM\" header", (int) afp->linenumber);
+
+ while ((status = esl_msafile_GetLine(afp, &p, &n)) == eslOK)
+ {
+ while (n && ( *p == ' ' || *p == '\t')) { p++; n--; } /* skip leading whitespace */
+
+ if (!n || *p == '#') continue; /* skip blank lines, comments */
+ else if (esl_memstrpfx(p, n, "//")) break; /* end of alignment: end of record */
+ else
+ { /* sequence line. parse line into temporary strings */
+ if (esl_memtok(&p, &n, " \t", &seqname, &seqnamelen) != eslOK) esl_fatal("small mem parse pass 2 failed (line %d): no seq name", (int) afp->linenumber);
+ if (esl_memtok(&p, &n, " \t", &aseq, &aseqlen) != eslOK) esl_fatal("small mem parse pass 2 failed (line %d): no aseq", (int) afp->linenumber);
+
+ /* make sure we haven't just read a second line of the first sequence in file (we must be in Pfam 1 line/seq file) */
+ if (nseq_read == 0) { if ((status = esl_memstrdup(seqname, seqnamelen, &(first_seqname))) != eslOK) esl_fatal("small mem parse failed: unable to copy seqname"); }
+ else if (esl_memstrcmp(seqname, seqnamelen, first_seqname)) esl_fatal("--small parse pass 2 failed (line %d): two seqs named %s. Alignment appears to be in interleaved Stockholm (not Pfam) format.", (int) afp->linenumber, seqname);
+ nseq_read++;
+
+ /* determine if we have an accession and/or description for this sequence */
+ have_de = have_ac = FALSE;
+ if (ac_seqname && (esl_memstrcmp(seqname, seqnamelen, ac_seqname))) have_ac = TRUE;
+ if (de_seqname && (esl_memstrcmp(seqname, seqnamelen, de_seqname))) have_de = TRUE;
+
+ if (rename) fprintf(ofp, ">%s.%d%s%s%s%s\n", rename, nseq_read, (have_ac ? " " : "") , (have_ac ? ac : ""), (have_de ? " " : "") , (have_de ? de : ""));
+ else fprintf(ofp, ">%.*s%s%s%s%s\n", (int) seqnamelen, seqname, (have_ac ? " " : "") , (have_ac ? ac : ""), (have_de ? " " : "") , (have_de ? de : ""));
+
+ /* load next ac, de */
+ if (have_ac) {
+ status = esl_fgets(&(ac_buf), &(ac_buflen), ac_fp);
+ if (status == eslEOF) ac_seqname = NULL;
+ else if (status == eslOK) {
+ ac_s = ac_buf;
+ if (esl_strtok_adv(&ac_s, " \t\n\r", &ac_seqname, NULL, NULL) != eslOK) esl_fatal("--small accession tmpfile parse failed");
+ if (esl_strtok_adv(&ac_s, "\n\r", &ac, NULL, NULL) != eslOK) esl_fatal("--small accession tmpfile parse failed");
+ }
+ }
+ if (have_de) {
+ status = esl_fgets(&(de_buf), &(de_buflen), de_fp);
+ if(status == eslEOF) de_seqname = NULL;
+ else if (status == eslOK) {
+ de_s = de_buf;
+ if (esl_strtok_adv(&de_s, " \t\n\r", &de_seqname, NULL, NULL) != eslOK) esl_fatal("--small description tmpfile parse failed");
+ if (esl_strtok_adv(&de_s, "\n\r", &de, NULL, NULL) != eslOK) esl_fatal("--small description tmpfile parse failed");
+ }
+ }
+
+ /* now print sequence, after converting symbols as nec */
+ /* remember, aseq itself is part of an ESL_BUFFER and you
+ can't write to it, so symconverts have to be on the
+ copy */
+ for (apos = 0; apos < aseqlen; apos += cpl)
+ {
+ acpl = (aseqlen - apos > cpl ? cpl : aseqlen - apos);
+ strncpy(aseqbuf, aseq + apos, acpl);
+ aseqbuf[acpl] = '\0';
+
+ if (rfrom) symconvert(aseqbuf, rfrom, rto);
+ if (gapsym) symconvert(aseqbuf, "-_.", gapsym);
+ if (force_lower) symconvert(aseqbuf,
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ "abcdefghijklmnopqrstuvwxyz");
+ if (force_upper) symconvert(aseqbuf,
+ "abcdefghijklmnopqrstuvwxyz",
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+ if (force_rna) symconvert(aseqbuf, "Tt", "Uu");
+ if (force_dna) symconvert(aseqbuf, "Uu", "Tt");
+ if (iupac_to_n) symconvert(aseqbuf,
+ "RYMKSWHBVDrymkswhbvd",
+ "NNNNNNNNNNnnnnnnnnnn");
+ if (x_is_bad) symconvert(aseqbuf, "Xx", "Nn");
+
+ fprintf(ofp, "%s\n", aseqbuf);
+ }
+ }
+ }
+ /* If we saw a normal // end, we would've successfully read a line,
+ * so when we get here, status (from the line read) should be eslOK.
+ */
+ if (status != eslOK) esl_fatal("--small parse pass 2 failed (line %d): didn't find // at end of alignment", (int) afp->linenumber);
+ if (ac_seqname) esl_fatal("--small parse pass 2 failed, sequence %s with #=GS AC line does not exist in alignment or is in different order.", ac_seqname);
+ if (de_seqname) esl_fatal("--small parse pass 2 failed, sequence %s with #=GS DE line does not exist in alignment or is in different order.", de_seqname);
+
+ if (ac_fp) fclose(ac_fp);
+ if (de_fp) fclose(de_fp);
+ esl_msafile_Close(afp);
+
+ if (first_seqname) free(first_seqname);
+ if (ac_buf) free(ac_buf);
+ if (de_buf) free(de_buf);
+
+ *ret_reached_eof = reached_eof;
+ return;
+}
+
+/* regurgitate_pfam_as_pfam()
+ *
+ * Given an open Pfam formatted msafile, read the next alignment and
+ * regurgitate it, after modifying it as necessary (change dna to rna,
+ * wussify SS, etc) in Pfam format.
+ *
+ * Returns <eslOK> on success.
+ * Returns <eslEOF> if there are no more alignments in <afp>.
+ * Returns <eslEFORMAT> if parse fails because of a file format
+ * problem, in which case afp->errmsg is set to contain a formatted
+ * message that indicates the cause of the problem.
+ */
+static int
+regurgitate_pfam_as_pfam(ESL_MSAFILE *afp, FILE *ofp, char *gapsym, int force_lower, int force_upper, int force_rna, int force_dna, int iupac_to_n, int x_is_bad, int wussify, int dewuss, int fullwuss, char *rfrom, char *rto)
+{
+ char *p;
+ esl_pos_t n;
+ char *first_seqname = NULL;
+ char *gx = NULL;
+ char *seqname = NULL;
+ char *tag = NULL;
+ char *text = NULL;
+ esl_pos_t gxlen, namelen, taglen, textlen;
+ int nseq_read = 0;
+ int parse_gc_and_gr;
+ int flushpoint = 10000;
+ int exp_alen = -1;
+ char *buf = NULL;
+ esl_pos_t pos, pos2;
+ int status;
+
+
+ parse_gc_and_gr = (wussify || dewuss || fullwuss) ? TRUE : FALSE; /* should we parse out GR/GC lines and check if they're SS lines? */
+ afp->errmsg[0] = '\0';
+
+ /* Check the magic Stockholm header line.
+ * We have to skip blank lines here, else we perceive
+ * trailing blank lines in a file as a format error when
+ * reading in multi-record mode.
+ */
+ /* Check the magic Stockholm header line, allowing blank lines */
+ do {
+ status = esl_msafile_GetLine(afp, &p, &n);
+ if (status == eslEOF) return eslEOF;
+ else if (status != eslOK) esl_fatal("small mem parse error. problem reading line %d of msafile", (int) afp->linenumber);
+ fprintf(ofp, "%.*s\n", (int) afp->n, afp->line);
+ } while (esl_memspn(afp->line, afp->n, " \t") == afp->n || /* skip blank lines */
+ (esl_memstrpfx(afp->line, afp->n, "#") /* and skip comment lines */
+ && ! esl_memstrpfx(afp->line, afp->n, "# STOCKHOLM"))); /* but stop on Stockholm header */
+
+ if (! esl_memstrpfx(afp->line, afp->n, "# STOCKHOLM 1.")) esl_fatal("small mem parse failed (line %d): missing \"# STOCKHOLM\" header", (int) afp->linenumber);
+
+ /* Read the alignment file one line at a time. */
+ while ((status = esl_msafile_GetLine(afp, &p, &n)) == eslOK)
+ {
+ if ((int) afp->linenumber % flushpoint == 0) fflush(ofp);
+ while (n && ( *p == ' ' || *p == '\t')) { p++; n--; } /* skip leading whitespace */
+
+ if (!n) fprintf(ofp, "\n");
+ else if (esl_memstrpfx(p, n, "//")) { fprintf(ofp, "//\n"); break; } /* normal way out */
+ else if (*p == '#')
+ {
+ if (parse_gc_and_gr && esl_memstrpfx(p, n, "#=GC"))
+ { /* parse line into temporary strings */
+ if (esl_memtok(&p, &n, " \t", &gx, &gxlen) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "small mem parse failed (line %d): bad #=GC line", (int) afp->linenumber);
+ if (esl_memtok(&p, &n, " \t", &tag, &taglen) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "small mem parse failed (line %d): bad #=GC line", (int) afp->linenumber);
+ if (esl_memtok(&p, &n, " \t", &text, &textlen) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "small mem parse failed (line %d): bad #=GC line", (int) afp->linenumber);
+ pos = text - afp->line; /* pos: position of first aligned char on line; total width of annotation tag w/spaces */
+
+ /* verify alignment length */
+ if (exp_alen == -1) exp_alen = textlen;
+ else if (exp_alen != textlen) ESL_XFAIL(eslEFORMAT, afp->errmsg, "small mem parse failed (line %d): bad #=GC line, len %d, expected %d", (int) afp->linenumber, (int) textlen, (int) exp_alen);
+
+ /* we need to make a writable string copy of the annotation, to edit it */
+ ESL_REALLOC(buf, sizeof(char) * (textlen+1));
+ esl_memstrcpy(text, textlen, buf);
+
+ if (esl_memstrcmp(tag, taglen, "SS_cons"))
+ {
+ if (wussify) esl_kh2wuss(buf, buf);
+ else if (dewuss) esl_wuss2kh(buf, buf);
+ else if (fullwuss)
+ {
+ status = esl_wuss_full(buf, buf);
+ if (status == eslESYNTAX) esl_fatal("Bad SS_cons line: not in WUSS format, alifile line: %d", (int) afp->linenumber);
+ else if (status != eslOK) esl_fatal("Conversion of SS_cons line failed, code %d, alifile line: %d", status, (int) afp->linenumber);
+ }
+ }
+ fprintf(ofp, "#=GC %.*s%*s%s\n", (int) taglen, tag, (int) (pos-taglen-5), "", buf);
+ }
+ else if (parse_gc_and_gr && esl_memstrpfx(p, n, "#=GR") == 0)
+ {
+ /* parse line into temporary strings */
+ if (esl_memtok(&p, &n, " \t", &gx, &gxlen) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "--small parse failed (line %d): bad #=GR line", (int) afp->linenumber);
+ if (esl_memtok(&p, &n, " \t", &seqname, &namelen) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "--small parse failed (line %d): bad #=GR line", (int) afp->linenumber);
+ if (esl_memtok(&p, &n, " \t", &tag, &taglen) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "--small parse failed (line %d): bad #=GR line", (int) afp->linenumber);
+ pos = tag - afp->line;
+ if (esl_memtok(&p, &n, " \t", &text, &textlen) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "--small parse failed (line %d): bad #=GR line", (int) afp->linenumber);
+ pos2 = text - afp->line;
+
+ /* we need to make a writable string copy of the annotation, to edit it */
+ ESL_REALLOC(buf, sizeof(char) * (textlen+1));
+ esl_memstrcpy(text, textlen, buf);
+
+ /* verify alignment length */
+ if (exp_alen == -1) exp_alen = textlen;
+ else if (exp_alen != textlen) ESL_XFAIL(eslEFORMAT, afp->errmsg, "small mem parse failed (line %d): bad seq line, len %d, expected %d", (int) afp->linenumber, (int) textlen, (int) exp_alen);
+
+ if (esl_memstrcmp(tag, taglen, "SS") == 0)
+ {
+ if (wussify) esl_kh2wuss(buf, buf);
+ else if (dewuss) esl_wuss2kh(buf, buf);
+ else if (fullwuss) {
+ status = esl_wuss_full(buf, buf);
+ if (status == eslESYNTAX) esl_fatal("Bad SS line: not in WUSS format, alifile line: %d", (int) afp->linenumber);
+ else if (status != eslOK) esl_fatal("Conversion of SS line failed, code %d, alifile line: %d", status, (int) afp->linenumber);
+ }
+ }
+
+ fprintf(ofp, "#=GR %.*s%*s%.*s%*s%s\n", (int) namelen, seqname, (int) (pos-namelen-5), "", (int) taglen, tag, (int) (pos2-pos-taglen), "", buf);
+ }
+ else { /* '#' prefixed line that is not #=GR (or it is #=GR and wussify,dewuss,fullwuss are all FALSE) */
+ fprintf(ofp, "%.*s\n", (int) afp->n, afp->line); /* print the line */
+ }
+ } /* end of 'if (*s == '#')' */
+ else
+ { /* sequence line */
+ if (esl_memtok(&p, &n, " \t", &seqname, &namelen) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "--small parse failed (line %d): bad sequence line", (int) afp->linenumber);
+ if (esl_memtok(&p, &n, " \t", &text, &textlen) != eslOK) ESL_XFAIL(eslEFORMAT, afp->errmsg, "--small parse failed (line %d): bad sequence line", (int) afp->linenumber);
+ pos = text - afp->line;
+
+ /* verify alignment length */
+ if (exp_alen == -1) exp_alen = textlen;
+ else if(exp_alen != textlen) ESL_XFAIL(eslEFORMAT, afp->errmsg, "small mem parse failed (line %d): bad seq line, len %d, expected %d", (int) afp->linenumber, (int) textlen, (int) exp_alen);
+
+ /* make sure we haven't just read a second line of the first sequence in file (we must be in Pfam 1 line/seq file) */
+ if (nseq_read == 0) { if ((status = esl_memstrdup(seqname, namelen, &(first_seqname))) != eslOK) goto ERROR; }
+ else if (esl_memstrcmp(seqname, namelen, first_seqname)) { ESL_XFAIL(eslEFORMAT, afp->errmsg, "parse failed (line %d): two seqs named %s. Alignment appears to be in Stockholm format. Reformat to Pfam with esl-reformat.", (int) afp->linenumber, seqname); }
+ nseq_read++;
+
+ /* we need to make a writable string copy of the annotation, to edit it */
+ ESL_REALLOC(buf, sizeof(char) * (textlen+1));
+ esl_memstrcpy(text, textlen, buf);
+
+ /* make adjustments as necessary */
+ if (rfrom) symconvert(buf, rfrom, rto);
+ if (gapsym) symconvert(buf, "-_.", gapsym);
+ if (force_lower) symconvert(buf,
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ "abcdefghijklmnopqrstuvwxyz");
+ if (force_upper) symconvert(buf,
+ "abcdefghijklmnopqrstuvwxyz",
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+ if (force_rna) symconvert(buf, "Tt", "Uu");
+ if (force_dna) symconvert(buf, "Uu", "Tt");
+ if (iupac_to_n) symconvert(buf,
+ "RYMKSWHBVDrymkswhbvd",
+ "NNNNNNNNNNnnnnnnnnnn");
+ if (x_is_bad) symconvert(buf, "Xx", "Nn");
+ /* print it out */
+ fprintf(ofp, "%.*s%*s%s\n", (int) namelen, seqname, (int) (pos-namelen), "", buf);
+ }
+ }
+
+ /* If we saw a normal // end, we would've successfully read a line,
+ * so when we get here, status (from the line read) should be eslOK.
+ */
+ if (status != eslOK) esl_fatal("--small parse failed (line %d): didn't find // at end of alignment", (int) afp->linenumber);
+ if (first_seqname) free(first_seqname);
+ if (buf) free(buf);
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+static int
+parse_replace_string(const char *rstring, char **ret_from, char **ret_to)
+{
+ int status;
+ int rlen, mid, i;
+ int is_valid = FALSE;
+ char *from = NULL;
+ char *to = NULL;
+
+ /* Note: we could use ESL_REGEXP but then multiple ':'s in rstring could cause problems */
+ rlen = strlen(rstring);
+ /* check validity of rstring: must be "<s1>:<s2>" with len(<s1>)==len(<s2>) */
+ if((rlen % 2) != 0) { /* odd num chars, good */
+ mid = rlen / 2;
+ if(rstring[mid] == ':') { /* middle character is ':', good */
+ ESL_ALLOC(from, sizeof(char) * (mid+1));
+ ESL_ALLOC(to, sizeof(char) * (mid+1));
+ for(i = 0; i < mid; i++) from[i] = rstring[i];
+ for(i = mid+1; i < rlen; i++) to[i-(mid+1)] = rstring[i];
+ from[mid] = '\0';
+ to[mid] = '\0';
+ is_valid = TRUE;
+ }
+ }
+ if(! is_valid) esl_fatal("--replace takes arg of <s1>:<s2> with len(<s1>) == len(<s2>); %s not recognized", rstring);
+ *ret_from = from;
+ *ret_to = to;
+
+ return eslOK;
+
+ ERROR:
+ if(from != NULL) free(from);
+ if(to != NULL) free(to);
+ return status;
+}
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
+
diff --git a/miniapps/esl-reformat.man b/miniapps/esl-reformat.man
new file mode 100644
index 0000000..d9863a2
--- /dev/null
+++ b/miniapps/esl-reformat.man
@@ -0,0 +1,224 @@
+.TH "esl-reformat" 1 "@EASEL_DATE@" "Easel @PACKAGE_VERSION@" "Easel miniapps"
+
+.SH NAME
+.TP
+esl-reformat - convert sequence file formats
+
+.SH SYNOPSIS
+.B esl-reformat
+.I [options]
+.I format
+.I seqfile
+
+
+.SH DESCRIPTION
+
+.B esl-reformat
+reads the sequence file
+.I seqfile
+in any supported format, reformats it
+into a new format specified by
+.I format,
+then outputs the reformatted text.
+
+.pp
+The
+.I format
+argument must (case-insensitively) match a supported sequence file format:
+currently, limited to
+.I fasta,
+.I stockholm,
+.I pfam,
+or
+.I afa
+(aligned fasta).
+
+.pp
+Unaligned format files cannot be reformatted to
+aligned formats.
+However, aligned formats can be reformatted
+to unaligned formats - gap characters are
+simply stripped out.
+
+.SH OPTIONS
+
+.TP
+.B -d
+DNA; convert U's to T's, to make sure a nucleic acid
+sequence is shown as DNA not RNA. See
+.B -r.
+
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+
+.TP
+.B -l
+Lowercase; convert all sequence residues to lower case.
+See
+.B -u.
+
+
+.TP
+.B -n
+For DNA/RNA sequences, converts any character that's not unambiguous
+RNA/DNA (e.g. ACGTU/acgtu) to an N. Used to convert IUPAC ambiguity
+codes to N's, for software that can't handle all IUPAC codes (some
+public RNA folding codes, for example). If the file is an alignment,
+gap characters are also left unchanged. If sequences are not
+nucleic acid sequences, this option will corrupt the data in
+a predictable fashion.
+
+
+.TP
+.BI -o " <f>"
+Send output to file
+.I <f>
+instead of stdout.
+
+
+.TP
+.B -r
+RNA; convert T's to U's, to make sure a nucleic acid
+sequence is shown as RNA not DNA. See
+.B -d.
+
+
+.TP
+.B -u
+Uppercase; convert all sequence residues to upper case.
+See
+.B -l.
+
+
+.TP
+.B -x
+For DNA sequences, convert non-IUPAC characters (such as X's) to N's.
+This is for compatibility with benighted people who insist on using X
+instead of the IUPAC ambiguity character N. (X is for ambiguity
+in an amino acid residue).
+.IP
+Warning: like the
+.B -n
+option, the code doesn't check that you are actually giving it DNA. It
+simply literally just converts non-IUPAC DNA symbols to N. So if you
+accidentally give it protein sequence, it will happily convert most
+every amino acid residue to an N.
+
+
+
+
+.SH EXPERT OPTIONS
+
+
+.TP
+.BI --gapsym " <c>"
+Convert all gap characters to
+.I <c>.
+Used to prepare alignment files for programs with strict
+requirements for gap symbols. Only makes sense if
+the input
+.I seqfile
+is an alignment.
+
+.TP
+.BI --informat " <s>"
+Specify that the sequence file is in format
+.I <s>,
+rather than allowing the program to autodetect
+the file format.
+
+
+.TP
+.B --mingap
+If
+.I seqfile
+is an alignment, remove any columns that contain 100% gap or missing
+data characters, minimizing the overall length of the alignment.
+(Often useful if you've extracted a subset of aligned sequences from a
+larger alignment.)
+
+.TP
+.B --keeprf
+When used in combination with
+.B --mingap,
+never remove a column that is not a gap in the reference (#=GC RF)
+annotation, even if the column contains 100% gap characters in
+all aligned sequences. By default with
+.B --mingap,
+nongap RF columns that are 100% gaps in all sequences are removed.
+
+.TP
+.B --nogap
+Remove any aligned columns that contain any gap or missing data
+symbols at all. Useful as a prelude to phylogenetic analyses, where
+you only want to analyze columns containing 100% residues, so you want
+to strip out any columns with gaps in them. Only makes sense if the
+file is an alignment file.
+
+.TP
+.B --wussify
+Convert RNA secondary structure annotation strings (both consensus
+and individual) from old "KHS" format, ><, to the new WUSS notation,
+<>. If the notation is already in WUSS format, this option will screw it
+up, without warning. Only SELEX and Stockholm format files have
+secondary structure markup at present.
+
+.TP
+.B --dewuss
+Convert RNA secondary structure annotation strings from the new
+WUSS notation, <>, back to the old KHS format, ><. If the annotation
+is already in KHS, this option will corrupt it, without warning.
+Only SELEX and Stockholm format files have secondary structure
+markup.
+
+.TP
+.B --fullwuss
+Convert RNA secondary structure annotation strings from simple
+(input) WUSS notation to full (output) WUSS notation.
+
+.TP
+.BI --replace " <s>"
+.I <s>
+must be in the format
+.I <s1>:<s2>
+with equal numbers of characters in
+.I <s1>
+and
+.I <s2>
+separated by a ":" symbol. Each character from
+.I <s1>
+in the input file will be replaced by its counterpart (at the same
+position) from
+.I <s2>.
+Note that special characters in
+.I <s>
+(such as "~") may need to be prefixed by
+a "\\" character.
+
+.TP
+.B --small
+Operate in small memory mode for input alignment files in
+Pfam format. If not used, each alignment is stored in memory so the
+required memory will be roughly the size of the largest alignment
+in the input file. With
+.B --small,
+input alignments are not stored in memory.
+This option only works in combination with
+.BI --informat " pfam"
+and output format
+.I pfam
+or
+.I afa.
+
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-selectn.c b/miniapps/esl-selectn.c
new file mode 100644
index 0000000..91e3a9d
--- /dev/null
+++ b/miniapps/esl-selectn.c
@@ -0,0 +1,117 @@
+/* Select <m> random lines from a file and print them.
+ *
+ * Uses a reservoir sample - O(m) in space, single pass on the input,
+ * never reads the entire input into memory.
+ *
+ * SRE, Fri Jun 13 08:17:53 2008 [Janelia]
+ * SVN $Id$
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_random.h"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 1 },
+ { "--seed", eslARG_INT, "0", NULL, NULL, NULL, NULL, NULL, "set random number generator's seed to <n>", 1 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <n> <file>";
+static char banner[] = "select n lines randomly from a file";
+
+static void
+cmdline_failure(char *argv0, char *format, ...)
+{
+ va_list argp;
+
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ esl_usage(stdout, argv0, usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv0);
+ exit(1);
+}
+
+static void
+cmdline_help(char *argv0, ESL_GETOPTS *go)
+{
+ esl_banner(stdout, argv0, banner);
+ esl_usage (stdout, argv0, usage);
+ puts("\n where general options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ exit(0);
+}
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL;
+ ESL_RANDOMNESS *rng = NULL;
+ char *filename = NULL;
+ FILE *fp = NULL;
+ int m = 0; /* number of lines to sample */
+ char **larr = NULL; /* sampled line ptr array, [0..m-1] */
+ char *buf = NULL;
+ int buflen = 0;
+ int n; /* number of lines read so far */
+ int r; /* random #, 0..n-1 */
+ int i;
+
+ /* Parse command line */
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) cmdline_failure(argv[0], "Failed to parse command line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) cmdline_failure(argv[0], "Error in app configuration: %s\n", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") ) cmdline_help(argv[0], go);
+ if (esl_opt_ArgNumber(go) != 2) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+
+ m = atoi(esl_opt_GetArg(go, 1));
+ filename = esl_opt_GetArg(go, 2);
+ rng = esl_randomness_Create(esl_opt_GetInteger(go, "--seed"));
+
+ if ((larr = malloc(sizeof(char *) * m)) == NULL) esl_fatal("allocation failed");
+ for (i = 0; i < m; i++) larr[i] = NULL;
+
+ if (strcmp(filename, "-") == 0) fp = stdin;
+ else {
+ if ((fp = fopen(filename, "r")) == NULL) esl_fatal("Failed to open file %s\n", filename);
+ }
+
+ n = 0;
+ while (esl_fgets(&buf, &buflen, fp) == eslOK)
+ {
+ n++;
+ if (n <= m) {
+ larr[n-1] = buf;
+ buf = NULL;
+ buflen = 0;
+ } else {
+ r = esl_rnd_Roll(rng, n);
+ if (r < m) {
+ free(larr[r]);
+ larr[r] = buf;
+ buf = NULL;
+ buflen = 0;
+ }
+ }
+ }
+
+ for (i = 0; i < m; i++) printf("%s", larr[i]);
+
+ if (fp != stdin) fclose(fp);
+ for (i = 0; i < m; i++) free(larr[i]);
+ free(larr);
+ if (buf) free(buf);
+ esl_randomness_Destroy(rng);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/miniapps/esl-selectn.man b/miniapps/esl-selectn.man
new file mode 100644
index 0000000..1f43735
--- /dev/null
+++ b/miniapps/esl-selectn.man
@@ -0,0 +1,76 @@
+.TH "esl-selectn" 1 "@EASEL_DATE@" "Easel @PACKAGE_VERSION@" "Easel miniapps"
+
+.SH NAME
+.TP
+esl-selectn - select random subset of lines from file
+
+.SH SYNOPSIS
+.B esl-selectn
+.I [options]
+.I nlines
+.I filename
+
+
+.SH DESCRIPTION
+
+.pp
+.B esl-selectn
+selects
+.I nlines
+lines at random from file
+.I filename
+and outputs them on
+.I stdout.
+
+.pp
+If
+.I filename
+is - (a single dash),
+input is read from
+.I stdin.
+
+.pp
+Uses a reservoir sampling algorithm, which is efficient: requires only a single pass through
+.I filename,
+and memory storage proportional to
+.I nlines
+(and importantly, not to the size of
+.I filename
+itself).
+.B esl-selectn
+can therefore be used to create large scale statistical sampling
+experiments, especially in combination with other
+.I Easel
+miniapplications.
+
+
+.SH OPTIONS
+
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+
+.TP
+.BI --seed " <d>"
+Set the random number seed to
+.I <d>,
+an integer greater than 0.
+The default is to use the current value of
+.I time().
+(As the return value of
+.I time()
+is likely to be in units of seconds,
+two calls to
+.B esl-selectn
+within the same second will generate exactly the
+same sample; this may not be what you want.)
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-seqrange.c b/miniapps/esl-seqrange.c
new file mode 100644
index 0000000..201fe48
--- /dev/null
+++ b/miniapps/esl-seqrange.c
@@ -0,0 +1,165 @@
+/* Determine range of sequences for one of many parallel processes.
+ *
+ * EPN, Wed Mar 24 07:23:27 2010
+ * SVN $Id: esl-sfetch.c 480 2010-01-06 00:05:59Z farrarm $
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_fileparser.h"
+#include "esl_keyhash.h"
+#include "esl_regexp.h"
+#include "esl_ssi.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+static char banner[] = "determine range of sequences for one of many parallel processes";
+static char usage[] = "[options] <sqfile> <procidx> <nproc>";
+
+static void
+cmdline_failure(char *argv0, char *format, ...)
+{
+ va_list argp;
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ esl_usage(stdout, argv0, usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv0);
+ exit(1);
+}
+
+static void
+cmdline_help(char *argv0, ESL_GETOPTS *go)
+{
+ esl_banner(stdout, argv0, banner);
+ esl_usage (stdout, argv0, usage);
+ puts("\n where general options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ exit(0);
+}
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "specify that input file is in format <s>", 1 },
+
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+static void range_by_seqnum(ESL_SQFILE *sqfp, int nproc, int64_t **ret_final_sqidx);
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ char *seqfile = NULL; /* sequence file name */
+ int infmt = eslSQFILE_UNKNOWN; /* format code for seqfile */
+ ESL_SQFILE *sqfp = NULL; /* open sequence file */
+ int status; /* easel return code */
+ int procidx; /* processor index we want range for */
+ int nproc; /* total number processors (>= procidx) */
+ int64_t *final_sqidx; /* [0..p..nproc-1] index (in sqfp) of final seq for proc p+1,
+ * sequence index ranges 1..nseq_total */
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) cmdline_failure(argv[0], "Failed to parse command line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) cmdline_failure(argv[0], "Error in configuration: %s\n", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") ) cmdline_help (argv[0], go);
+ if (esl_opt_ArgNumber(go) != 3) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+
+ seqfile = esl_opt_GetArg(go, 1);
+ procidx = atoi(esl_opt_GetArg(go, 2));
+ nproc = atoi(esl_opt_GetArg(go, 3));
+
+ /* Validate command line args */
+ if(procidx > nproc) cmdline_failure(argv[0], "<procidx> must be less than or equal to <nproc>\n");
+ if(procidx < 1) cmdline_failure(argv[0], "minimum allowed value for <procidx> is 1\n");
+ if(nproc < 1) cmdline_failure(argv[0], "minimum allowed value for <nproc> is 1\n");
+
+ /* Open the sequence file */
+ if (esl_opt_GetString(go, "--informat") != NULL) {
+ infmt = esl_sqio_EncodeFormat(esl_opt_GetString(go, "--informat"));
+ if (infmt == eslSQFILE_UNKNOWN) esl_fatal("%s is not a valid input sequence file format for --informat");
+ }
+ status = esl_sqfile_Open(seqfile, infmt, NULL, &sqfp);
+ if (status == eslENOTFOUND) cmdline_failure(argv[0], "Sequence file %s not found.\n", seqfile);
+ else if (status == eslEFORMAT) cmdline_failure(argv[0], "Format of file %s unrecognized.\n", seqfile);
+ else if (status == eslEINVAL) cmdline_failure(argv[0], "Can't autodetect stdin or .gz.\n");
+ else if (status != eslOK) cmdline_failure(argv[0], "Open failed, code %d.\n", status);
+
+ /* Exit if seqfile is an alignment, is gzipped or is piped from stdin, we can't handle this */
+ if (sqfp->data.ascii.do_gzip) cmdline_failure(argv[0], "Can't determine seq range for a .gz compressed file\n");
+ if (sqfp->data.ascii.do_stdin) cmdline_failure(argv[0], "Can't determine seq range for a standard input pipe\n");
+ if (esl_sqio_IsAlignment(sqfp->format)) cmdline_failure(argv[0], "Can't determine seq range for an alignment file\n");
+
+ /* Open the SSI index for retrieval, it is required */
+ status = esl_sqfile_OpenSSI(sqfp, NULL);
+ if (status == eslEFORMAT) cmdline_failure(argv[0], "SSI index is in incorrect format\n");
+ else if (status == eslERANGE) cmdline_failure(argv[0], "SSI index is in 64-bit format and we can't read it\n");
+ else if (status != eslOK) cmdline_failure(argv[0], "Failed to open SSI index\n");
+
+ /* Verify that we have more processors than sequences */
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+ if(ascii->ssi->nprimary < nproc) cmdline_failure(argv[0], "Fewer sequences than processors (<nproc>); %d < %d\n", ascii->ssi->nprimary, nproc);
+
+ /* Determine the range for all <nproc> processors */
+ range_by_seqnum(sqfp, nproc, &(final_sqidx));
+
+ /* Output range for desired nproc to stdout */
+ printf("%" PRId64 "-%" PRId64 "\n", (procidx == 1) ? 1 : final_sqidx[procidx-2]+1, final_sqidx[procidx-1]); /* careful: final_sqidx runs 0..nproc-1 */
+
+ free(final_sqidx);
+ esl_sqfile_Close(sqfp);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+
+/* Determine seq range for <nproc> processors with goal of putting an identical
+ * number of sequences (or as close to identical as possible) in each chunk,
+ * one chunk per processor.
+ */
+static void
+range_by_seqnum(ESL_SQFILE *sqfp, int nproc, int64_t **ret_final_sqidx)
+{
+ int status;
+ int64_t *final_sqidx; /* [0..p..nproc-1] index (in sqfp) of final seq for proc p+1
+ * sequence index ranges 1..nseq_total */
+ int p; /* counter over processes */
+ int64_t nseq_per_proc; /* num seqs per processor for even split */
+ int64_t nseq_total; /* total number of sequences in sqfp */
+ int64_t remainder; /* num extra seqs after even split across all procs */
+ int64_t nseq_used; /* running total of nseqs on all procs */
+ ESL_SQASCII_DATA *ascii = &sqfp->data.ascii;
+
+ ESL_ALLOC(final_sqidx, sizeof(int64_t) * nproc);
+
+ nseq_total = ascii->ssi->nprimary;
+
+ nseq_per_proc = (int) (nseq_total / nproc);
+ remainder = nseq_total - (nseq_per_proc * nproc);
+ nseq_used = 0;
+ for(p = 0; p < nproc; p++) {
+ nseq_used += nseq_per_proc;
+ if(p < remainder) nseq_used++;
+ final_sqidx[p] = nseq_used;
+ }
+ if(nseq_used != nseq_total) esl_fatal("Unable to split up sequences properly, coding error");
+
+ *ret_final_sqidx = final_sqidx;
+
+ return;
+
+ ERROR:
+ esl_fatal("Out of memory");
+ return; /* NEVERREACHED */
+}
diff --git a/miniapps/esl-seqrange.itest.pl b/miniapps/esl-seqrange.itest.pl
new file mode 100755
index 0000000..080ddcc
--- /dev/null
+++ b/miniapps/esl-seqrange.itest.pl
@@ -0,0 +1,143 @@
+#! /usr/bin/perl
+
+# Integrated test of the esl-seqrange miniapp.
+#
+# Usage: ./esl-seqrange.itest.pl <esl-seqrange binary> <esl-sfetch binary> <tmpfile prefix>
+# Example: ./esl-seqrange.itest.pl ./esl-seqrange ./esl-sfetch foo
+#
+# EPN, Wed Mar 24 10:19:28 2010
+
+$eslseqrange = shift;
+$eslsfetch = shift;
+$tmppfx = shift;
+
+if (! -x "$eslseqrange") { die "FAIL: didn't find esl-seqrange binary $eslseqrange"; }
+if (! -x "$eslsfetch") { die "FAIL: didn't find esl-sfetch binary $eslsfetch"; }
+
+open(SEQFILE, ">$tmppfx.fa") || die "FAIL: couldn't open $tmppfx.fa for writing seqfile";
+print SEQFILE << "EOF";
+>random0
+CUGCUUCGCA
+>random1
+GAGUACGUGG
+>random2
+GCUACCCUAA
+>random3
+GGUAACCUAA
+>random4
+AUUAGGGCAU
+>random5
+CCGACUUUAG
+>random6
+ACCAUUUACA
+>random7
+GACUAGAAAC
+>random8
+AUGUAGAGUA
+>random9
+CGCAGCCGGC
+>random10
+CAGAACUUCG
+>random11
+GAGGUCAGGC
+>random12
+UCACUUGUCG
+>random13
+ACCGGGGAUG
+>random14
+CGAUUUUCGG
+>random15
+CUGGUCCUGG
+>random16
+AUGUGAAGAC
+>random17
+AAUGAAGGUU
+>random18
+UGCUCCGGCG
+>random19
+CGCGACAUGG
+>random20
+AAAGCGACCG
+>random21
+UCCUGUAAGC
+>random22
+CGUUUCAUGG
+>random23
+GCAAAACGGC
+>random24
+GUCGCAUAUU
+>random25
+GGCUAACAUC
+>random26
+CUUGGUCUGC
+>random27
+CCCAGAGUGU
+>random28
+GUGUGCGCGU
+>random29
+ACGGCACCAA
+>random30
+GGGCAGUGCG
+EOF
+close SEQFILE;
+
+$output = `$eslseqrange -h`;
+if ($? != 0) { die "FAIL: esl-seqrange failed unexpectedly"; }
+if ($output !~ /Usage: esl-seqrange/) { die "FAIL: help output not right"; }
+
+# index the file first! we need an index
+if(-e "$tmppfx.fa.ssi") { unlink "$tmppfx.fa.ssi"; } # erase the index if it exists
+$output = `$eslsfetch --index $tmppfx.fa 2>&1`;
+if ($? != 0) { die "FAIL: esl-sfetch --index failed unexpectedly"; }
+
+$output = `$eslseqrange $tmppfx.fa 1 31 2>&1`;
+if ($? != 0) { die "FAIL: esl-seqrange failed unexpectedly"; }
+if ($output !~ /1-1/) { die "FAIL: seq range calculated incorrectly"; }
+
+
+$output = `$eslseqrange $tmppfx.fa 1 31 2>&1`;
+if ($? != 0) { die "FAIL: esl-seqrange failed unexpectedly"; }
+if ($output !~ /1-1/) { die "FAIL: seq range calculated incorrectly"; }
+
+$output = `$eslseqrange $tmppfx.fa 17 31 2>&1`;
+if ($? != 0) { die "FAIL: esl-seqrange failed unexpectedly"; }
+if ($output !~ /17-17/) { die "FAIL: seq range calculated incorrectly"; }
+
+$output = `$eslseqrange $tmppfx.fa 1 13 2>&1`;
+if ($? != 0) { die "FAIL: esl-seqrange failed unexpectedly"; }
+if ($output !~ /1-3/) { die "FAIL: seq range calculated incorrectly"; }
+
+$output = `$eslseqrange $tmppfx.fa 1 3 2>&1`;
+if ($? != 0) { die "FAIL: esl-seqrange failed unexpectedly"; }
+if ($output !~ /1-11/) { die "FAIL: seq range calculated incorrectly"; }
+
+$output = `$eslseqrange $tmppfx.fa 2 3 2>&1`;
+if ($? != 0) { die "FAIL: esl-seqrange failed unexpectedly"; }
+if ($output !~ /12-21/) { die "FAIL: seq range calculated incorrectly"; }
+
+$output = `$eslseqrange $tmppfx.fa 3 3 2>&1`;
+if ($? != 0) { die "FAIL: esl-seqrange failed unexpectedly"; }
+if ($output !~ /22-31/) { die "FAIL: seq range calculated incorrectly"; }
+
+# test --informat
+$output = `$eslseqrange --informat fasta $tmppfx.fa 3 3 2>&1`;
+if ($? != 0) { die "FAIL: esl-seqrange failed unexpectedly"; }
+if ($output !~ /22-31/) { die "FAIL: seq range calculated incorrectly"; }
+
+# test cases we expect to fail
+$output = `$eslseqrange $tmppfx.fa 1 32 2>&1`;
+if ($? == 0) { die "FAIL: esl-seqrange did not fail when expected"; }
+
+$output = `$eslseqrange $tmppfx.fa 31 1 2>&1`;
+if ($? == 0) { die "FAIL: esl-seqrange did not fail when expected"; }
+
+$output = `$eslseqrange $tmppfx.fa -1 1 2>&1`;
+if ($? == 0) { die "FAIL: esl-seqrange did not fail when expected"; }
+
+$output = `$eslseqrange $tmppfx.fa 1 -1 2>&1`;
+if ($? == 0) { die "FAIL: esl-seqrange did not fail when expected"; }
+
+print "ok\n";
+unlink "$tmppfx.fa";
+unlink "$tmppfx.fa.ssi";
+exit 0;
diff --git a/miniapps/esl-seqrange.man b/miniapps/esl-seqrange.man
new file mode 100644
index 0000000..c563a4d
--- /dev/null
+++ b/miniapps/esl-seqrange.man
@@ -0,0 +1,67 @@
+.TH "esl-seqrange" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-seqrange - determine a range of sequences for one of many parallel processes.
+
+.SH SYNOPSIS
+
+.TP
+.B esl-sfetch
+.I [options]
+.I seqfile
+.I procidx
+.I nproc
+
+.SH DESCRIPTION
+
+.pp
+.B esl-seqrange
+reads an indexed
+.I seqfile
+and determines the range of sequence indices in that file that process
+number
+.I procidx
+out of
+.I nproc
+total processes should operate on during a parallel processing of
+.I seqfile.
+
+.pp
+The
+.I seqfile
+must be indexed first using
+.B esl-sfetch --index <seqfile>.
+This creates an SSI index file
+.I <seqfile>.ssi.
+An SSI file is required in order for
+.B esl-seqrange
+to work.
+
+Sequence index ranges are calculated using a simple rule: the number
+of sequences for each process should be identical, or as close as
+possible to identical, across all processes. The lengths of the sequences
+are not considered (even though they probably should be).
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.BI --informat " <s>"
+Specify that the sequence file is in format
+.I <s>,
+where
+.I <s>
+may be FASTA, GenBank, EMBL, UniProt, or DDBJ. This string
+is case-insensitive ("genbank" or "GenBank" both work, for example).
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-seqstat.c b/miniapps/esl-seqstat.c
new file mode 100644
index 0000000..9665ef5
--- /dev/null
+++ b/miniapps/esl-seqstat.c
@@ -0,0 +1,258 @@
+/* Simple statistics on a sequence file
+ *
+ * SRE, Sun Feb 24 15:33:53 2008 [UA5315 to St. Louis]
+ * SVN $Id$
+ * from squid's seqstat (1994)
+ *
+ * Wish list:
+ * - add an option for printing sequence names only.
+ * This would facilitate using esl-seqstat in incantations (with
+ * esl-selectn and esl-sfetch) to extract subsets of sequences
+ * from a large file.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+
+#include "easel.h"
+#include "esl_composition.h"
+#include "esl_getopts.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_vectorops.h"
+
+static char banner[] = "show simple statistics on a sequence file";
+static char usage1[] = " [options] <seqfile>";
+
+static void show_overall_composition(const ESL_ALPHABET *abc, const double *monoc_all, int64_t nres);
+
+#define ALPH_OPTS "--rna,--dna,--amino" /* toggle group, alphabet type options */
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-a", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "report per-sequence info line, not just a summary", 1 },
+ { "-c", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "count and report residue composition", 1 },
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "specify that input file is in format <s>", 1 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, ALPH_OPTS, "specify that <seqfile> contains RNA sequence", 1 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, ALPH_OPTS, "specify that <seqfile> contains DNA sequence", 1 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, ALPH_OPTS, "specify that <seqfile> contains protein sequence", 1 },
+ { "--comptbl", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "alternative output: a table of residue compositions per seq", 1 },
+ { "--stall", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "arrest after start: for debugging under gdb", 99 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+static void
+cmdline_failure(char *argv0, char *format, ...)
+{
+ va_list argp;
+
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ esl_usage(stdout, argv0, usage1);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv0);
+ exit(1);
+}
+
+static void
+cmdline_help(char *argv0, ESL_GETOPTS *go)
+{
+ esl_banner(stdout, argv0, banner);
+ esl_usage (stdout, argv0, usage1);
+ puts("\n where general options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ exit(0);
+}
+
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL;
+ char *seqfile = NULL;
+ ESL_SQFILE *sqfp = NULL;
+ int infmt = eslSQFILE_UNKNOWN;
+ int alphatype = eslUNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_SQ *sq = NULL;
+ int64_t nseq = 0;
+ int64_t nres = 0;
+ int64_t small = 0;
+ int64_t large = 0;
+ double *monoc = NULL; /* monoresidue composition per sequence */
+ double *monoc_all = NULL; /* monoresidue composition over all seqs */
+ int do_comp = FALSE;
+ int do_comptbl = FALSE;
+ int status = eslOK;
+ int wstatus;
+ int i, x;
+ int do_stall; /* used to stall when debugging */
+
+
+ /* Parse command line */
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) cmdline_failure(argv[0], "Failed to parse command line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) cmdline_failure(argv[0], "Error in app configuration: %s\n", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") ) cmdline_help(argv[0], go);
+ if (esl_opt_ArgNumber(go) != 1) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+
+ seqfile = esl_opt_GetArg(go, 1);
+ do_comp = esl_opt_GetBoolean(go, "-c");
+ do_comptbl = esl_opt_GetBoolean(go, "--comptbl");
+
+ if (esl_opt_GetString(go, "--informat") != NULL) {
+ infmt = esl_sqio_EncodeFormat(esl_opt_GetString(go, "--informat"));
+ if (infmt == eslSQFILE_UNKNOWN) esl_fatal("%s is not a valid input sequence file format for --informat");
+ }
+
+ do_stall = esl_opt_GetBoolean(go, "--stall"); /* a stall point for attaching gdb */
+ while (do_stall);
+
+ /* open input file */
+ status = esl_sqfile_Open(seqfile, infmt, NULL, &sqfp);
+ if (status == eslENOTFOUND) esl_fatal("No such file %s", seqfile);
+ else if (status == eslEFORMAT) esl_fatal("Format of seqfile %s unrecognized.", seqfile);
+ else if (status != eslOK) esl_fatal("Open failed, code %d.", status);
+
+ if (esl_opt_GetBoolean(go, "--rna")) alphatype = eslRNA;
+ else if (esl_opt_GetBoolean(go, "--dna")) alphatype = eslDNA;
+ else if (esl_opt_GetBoolean(go, "--amino")) alphatype = eslAMINO;
+ else {
+ status = esl_sqfile_GuessAlphabet(sqfp, &alphatype);
+ if (status == eslENOALPHABET) esl_fatal("Couldn't guess alphabet from first sequence in %s", seqfile);
+ else if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s):\n%s\n",
+ sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (status == eslENODATA) esl_fatal("Sequence file %s contains no data?", seqfile);
+ else if (status != eslOK) esl_fatal("Failed to guess alphabet (error code %d)\n", status);
+ }
+ abc = esl_alphabet_Create(alphatype);
+ sq = esl_sq_CreateDigital(abc);
+ esl_sqfile_SetDigital(sqfp, abc);
+
+ if (do_comp || do_comptbl) {
+ ESL_ALLOC(monoc, (abc->Kp) * sizeof(double));
+ ESL_ALLOC(monoc_all, (abc->Kp) * sizeof(double));
+ esl_vec_DSet(monoc_all, abc->Kp, 0.0);
+ esl_vec_DSet(monoc, abc->Kp, 0.0);
+ }
+
+ /* Output header, if any */
+ if (do_comptbl) {
+ printf("#%-29s %6s", " Sequence name", "Length");
+ for (x = 0; x < abc->K; x++) printf(" %c", (char) abc->sym[x]);
+ fputc('\n', stdout);
+ printf("#%-29s %6s", "-----------------------------", "------");
+ for (x = 0; x < abc->K; x++) printf(" %6s", "------");
+ fputc('\n', stdout);
+ }
+
+ while ((wstatus = esl_sqio_ReadWindow(sqfp, 0, 4096, sq)) != eslEOF)
+ {
+ if (wstatus == eslOK)
+ {
+ if (do_comp || do_comptbl)
+ for (i = 1; i <= sq->n; i++)
+ monoc[sq->dsq[i]]++;
+ }
+ else if (wstatus == eslEOD)
+ {
+ if (nseq == 0) { small = large = sq->L; }
+ else {
+ small = ESL_MIN(small, sq->L);
+ large = ESL_MAX(large, sq->L);
+ }
+
+ if (!do_comptbl && esl_opt_GetBoolean(go, "-a")) {
+ printf("= %-25s %8" PRId64 " %s\n", sq->name, sq->L, (sq->desc != NULL) ? sq->desc : "");
+ }
+
+ if (do_comptbl) {
+ printf("%-30s %6" PRId64, sq->name, sq->L);
+ for (x = 0; x < abc->K; x++) printf(" %6.0f", monoc[x]);
+ fputc('\n', stdout);
+ }
+
+ nres += sq->L;
+ nseq++;
+ esl_sq_Reuse(sq);
+ if (do_comp || do_comptbl) {
+ esl_vec_DAdd(monoc_all, monoc, abc->Kp);
+ esl_vec_DSet(monoc, abc->Kp, 0.0);
+ }
+ }
+ else if (wstatus == eslEFORMAT) esl_fatal("Parse failed (sequence file %s):\n%s\n",
+ sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else esl_fatal("Unexpected error %d reading sequence file %s",
+ wstatus, sqfp->filename);
+ }
+
+ if (! do_comptbl)
+ {
+ printf("Format: %s\n", esl_sqio_DecodeFormat(sqfp->format));
+ printf("Alphabet type: %s\n", esl_abc_DecodeType(abc->type));
+ printf("Number of sequences: %" PRId64 "\n", nseq);
+ printf("Total # residues: %" PRId64 "\n", nres);
+ printf("Smallest: %" PRId64 "\n", small);
+ printf("Largest: %" PRId64 "\n", large);
+ printf("Average length: %.1f\n", (float) nres / (float) nseq);
+
+ if (do_comp) show_overall_composition(abc, monoc_all, nres);
+ }
+
+ if (monoc) free(monoc);
+ if (monoc_all) free(monoc_all);
+ esl_alphabet_Destroy(abc);
+ esl_sq_Destroy(sq);
+ esl_sqfile_Close(sqfp);
+ esl_getopts_Destroy(go);
+ return 0;
+
+ ERROR:
+ return status;
+}
+
+
+static void
+show_overall_composition(const ESL_ALPHABET *abc, const double *monoc_all, int64_t nres)
+{
+ double *iid_bg = NULL;;
+ int x;
+ int status;
+
+ printf("\nResidue composition:\n");
+
+ if (abc->type == eslAMINO)
+ {
+ ESL_DASSERT1(( abc->K == 20 )); // esl_composition_*() functions assume this
+ ESL_ALLOC(iid_bg, sizeof(double) * abc->K);
+ esl_composition_SW50(iid_bg);
+
+ for (x = 0; x < abc->K; x++)
+ printf("residue: %c %10.0f %6.4f %8.4f\n",
+ abc->sym[x], monoc_all[x], monoc_all[x] / (double) nres,
+ log((monoc_all[x] / (double) nres) / iid_bg[x]) * eslCONST_LOG2R);
+ for ( ; x < abc->Kp; x++)
+ if (monoc_all[x] > 0)
+ printf("residue: %c %10.0f %6.4f\n",
+ abc->sym[x], monoc_all[x], monoc_all[x] / (double) nres);
+ free(iid_bg);
+ }
+ else
+ {
+ for (x = 0; x < abc->Kp; x++)
+ if (x < abc->K || monoc_all[x] > 0)
+ printf("residue: %c %10.0f %.4f\n", abc->sym[x], monoc_all[x], monoc_all[x] / (double) nres);
+ }
+
+ return;
+
+ ERROR:
+ if (iid_bg) free(iid_bg);
+ return;
+}
+
+
diff --git a/miniapps/esl-seqstat.man b/miniapps/esl-seqstat.man
new file mode 100644
index 0000000..df2150a
--- /dev/null
+++ b/miniapps/esl-seqstat.man
@@ -0,0 +1,113 @@
+.TH "esl-seqstat" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-seqstat - summarize contents of a sequence file
+
+.SH SYNOPSIS
+
+.B esl-seqstat
+.I [options]
+.I seqfile
+
+.SH DESCRIPTION
+
+.pp
+.B esl-seqstat
+summarizes the contents of the
+.I seqfile.
+It prints the format, alphabet type, number of sequences, total number
+of residues, and the mean, smallest, and largest sequence length.
+
+.pp
+If
+.I seqfile
+is - (a single dash),
+sequence input is read from
+.I stdin.
+
+.pp
+The sequence file may be in any of several different common unaligned
+sequence formats including FASTA, GenBank, EMBL, UniProt, or DDBJ. It
+may also be an alignment file, in Stockholm format for example. By
+default the file format is autodetected. The
+.I --informat <s>
+option allows you to specify the format and override
+autodetection. This
+option may be useful for making
+.B esl-seqstat
+more robust, because format autodetection may fail on unusual files.
+
+.pp
+The sequences can be of protein or DNA/RNA sequences. All sequences
+in the same
+.I seqfile
+must be either protein or DNA/RNA. The alphabet will be autodetected
+unless one of the options
+.I --amino,
+.I --dna,
+or
+.I --rna
+are given. These options may be useful in automated
+pipelines to make
+.B esl-alistat
+more robust; alphabet autodetection is not infallible.
+
+
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.B -a
+Additionally show a summary statistic line showing the name, length,
+and description of each individual sequence. Each of these lines is
+prefixed by an = character, in order to allow these lines to be easily
+grepped out of the output.
+
+.TP
+.B -c
+Additionally print the residue composition of the sequence file.
+
+
+
+.SH EXPERT OPTIONS
+
+.TP
+.BI --informat " <s>"
+Specify that the sequence file is in format
+.I <s>,
+where
+.I <s>
+may be FASTA, GenBank, EMBL, UniProt, DDBJ, or Stockholm. This string
+is case-insensitive ("genbank" or "GenBank" both work, for example).
+
+.TP
+.B --amino
+Assert that the
+.I seqfile
+contains protein sequences.
+
+.TP
+.B --dna
+Assert that the
+.I seqfile
+contains DNA sequences.
+
+.TP
+.B --rna
+Assert that the
+.I seqfile
+contains RNA sequences.
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
+
diff --git a/miniapps/esl-sfetch.c b/miniapps/esl-sfetch.c
new file mode 100644
index 0000000..f355458
--- /dev/null
+++ b/miniapps/esl-sfetch.c
@@ -0,0 +1,489 @@
+/* Fetch a sequence (or part of one) from a sequence flatfile.
+ *
+ * From squid's sfetch and ffetch
+ * SRE, Mon Mar 31 16:12:50 2008 [Janelia]
+ * SVN $Id$
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_fileparser.h"
+#include "esl_keyhash.h"
+#include "esl_regexp.h"
+#include "esl_ssi.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+
+static char banner[] = "retrieve sequence(s) from a file";
+static char usage1[] = "[options] <sqfile> <name> (one seq named <name>)";
+static char usage2[] = "[options] -f <sqfile> <namefile> (all seqs in <namefile>)";
+static char usage3[] = "[options] --index <sqfile> (index <sqfile>)";
+
+static void
+cmdline_failure(char *argv0, char *format, ...)
+{
+ va_list argp;
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ esl_usage(stdout, argv0, usage1);
+ esl_usage(stdout, argv0, usage2);
+ esl_usage(stdout, argv0, usage3);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv0);
+ exit(1);
+}
+
+static void
+cmdline_help(char *argv0, ESL_GETOPTS *go)
+{
+ esl_banner(stdout, argv0, banner);
+ esl_usage (stdout, argv0, usage1);
+ esl_usage (stdout, argv0, usage2);
+ esl_usage (stdout, argv0, usage3);
+ puts("\n where general options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ puts("\n Options for retrieving subsequences:");
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80);
+ puts("\n On command line, subseq coords are separated by any nonnumeric, nonspace character(s).");
+ puts(" for example, -c 23..100 or -c 23/100 or -c 23-100 all work.\n");
+ puts(" Additionally, to retrieve a suffix to the end, omit the end coord or set it to zero; -c 23.. ");
+ puts(" will work, as will -c 23..0\n");
+ puts(" By default, the subseq will be named <source name>/<from>-<to>. To assign a name of");
+ puts(" your choice, use -n <newname>.\n");
+ puts(" In retrieving subsequences listed in a file (-C -f, or just -Cf), each line of the file");
+ puts(" is in GDF format: <newname> <from> <to> <source seqname>, space/tab delimited.\n");
+ puts(" When <start> coordinate is greater than <end>, for DNA or RNA, the reverse complement is");
+ puts(" retrieved; in protein sequence, this is an error. The -r option is another way to revcomp.");
+ puts("\n other options:");
+ esl_opt_DisplayHelp(stdout, go, 3, 2, 80);
+ exit(0);
+}
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-o", eslARG_OUTFILE,FALSE, NULL, NULL, NULL, NULL, "-O,--index", "output sequences to file <f> instead of stdout", 1 },
+ { "-O", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-o,-f,--index", "output sequence to file named <key>", 1 },
+ { "-n", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, "-f,--index", "rename the sequence <s>", 1 },
+ { "-r", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--index", "reverse complement the seq(s)", 1 },
+
+
+ { "-c", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, "-f,--index", "retrieve subsequence coords <from>..<to>", 2 },
+ { "-C", eslARG_NONE, FALSE, NULL, NULL, NULL, "-f", "--index", "<namefile> in <f> contains subseq coords too", 2 },
+
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "specify that input file is in format <s>", 3 },
+
+ /* undocumented as options, because they're documented as alternative invocations: */
+ { "-f", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "--index", "second cmdline arg is a file of names to retrieve", 99 },
+ { "--index", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "index <sqfile>, creating <sqfile>.ssi", 99 },
+
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+static void create_ssi_index(ESL_GETOPTS *go, ESL_SQFILE *sqfp);
+static void multifetch(ESL_GETOPTS *go, FILE *ofp, char *keyfile, ESL_SQFILE *sqfp);
+static void onefetch(ESL_GETOPTS *go, FILE *ofp, char *key, ESL_SQFILE *sqfp);
+static void multifetch_subseq(ESL_GETOPTS *go, FILE *ofp, char *keyfile, ESL_SQFILE *sqfp);
+static void onefetch_subseq(ESL_GETOPTS *go, FILE *ofp, ESL_SQFILE *sqfp, char *newname,
+ char *key, uint32_t given_start, uint32_t given_end);
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ char *seqfile = NULL; /* sequence file name */
+ int infmt = eslSQFILE_UNKNOWN; /* format code for seqfile */
+ ESL_SQFILE *sqfp = NULL; /* open sequence file */
+ FILE *ofp = NULL; /* output stream for sequences */
+ int status; /* easel return code */
+
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) cmdline_failure(argv[0], "Failed to parse command line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) cmdline_failure(argv[0], "Error in configuration: %s\n", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") ) cmdline_help (argv[0], go);
+ if (esl_opt_ArgNumber(go) < 1) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+
+ /* Open the sequence file */
+ seqfile = esl_opt_GetArg(go, 1);
+ if (esl_opt_GetString(go, "--informat") != NULL) {
+ infmt = esl_sqio_EncodeFormat(esl_opt_GetString(go, "--informat"));
+ if (infmt == eslSQFILE_UNKNOWN) esl_fatal("%s is not a valid input sequence file format for --informat", esl_opt_GetString(go, "--informat"));
+ }
+ status = esl_sqfile_Open(seqfile, infmt, NULL, &sqfp);
+ if (status == eslENOTFOUND) cmdline_failure(argv[0], "Sequence file %s not found.\n", seqfile);
+ else if (status == eslEFORMAT) cmdline_failure(argv[0], "Format of file %s unrecognized.\n", seqfile);
+ else if (status == eslEINVAL) cmdline_failure(argv[0], "Can't autodetect stdin or .gz.\n");
+ else if (status != eslOK) cmdline_failure(argv[0], "Open failed, code %d.\n", status);
+
+ /* Open the output file, if any */
+ if (esl_opt_GetBoolean(go, "-O"))
+ {
+ if ((ofp = fopen(esl_opt_GetArg(go, 2), "w")) == NULL)
+ cmdline_failure(argv[0], "Failed to open output file %s\n", esl_opt_GetArg(go, 2));
+ }
+ else if (esl_opt_GetString(go, "-o") != NULL)
+ {
+ if ((ofp = fopen(esl_opt_GetString(go, "-o"), "w")) == NULL)
+ cmdline_failure(argv[0], "Failed to open output file %s\n", esl_opt_GetString(go, "-o"));
+ }
+ else ofp = stdout;
+
+ /* Indexing mode */
+ if (esl_opt_GetBoolean(go, "--index"))
+ {
+ if (esl_opt_ArgNumber(go) != 1) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+ if (sqfp->data.ascii.do_gzip) cmdline_failure(argv[0], "Can't index a .gz compressed file");
+ if (sqfp->data.ascii.do_stdin) cmdline_failure(argv[0], "Can't index a standard input pipe");
+
+ create_ssi_index(go, sqfp);
+ }
+
+ /* List retrieval mode */
+ else if (esl_opt_GetBoolean(go, "-f"))
+ {
+ if (esl_opt_ArgNumber(go) != 2) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+
+ /* Open the SSI index for retrieval */
+ if (! sqfp->data.ascii.do_gzip && ! sqfp->data.ascii.do_stdin && ! esl_sqio_IsAlignment(sqfp->format))
+ {
+ status = esl_sqfile_OpenSSI(sqfp, NULL);
+ if (status == eslEFORMAT) cmdline_failure(argv[0], "SSI index is in incorrect format\n");
+ else if (status == eslERANGE) cmdline_failure(argv[0], "SSI index is in 64-bit format and we can't read it\n");
+ else if (status != eslOK) cmdline_failure(argv[0], "Failed to open SSI index\n");
+ }
+
+ if (esl_opt_GetBoolean(go, "-C")) multifetch_subseq(go, ofp, esl_opt_GetArg(go, 2), sqfp);
+ else multifetch (go, ofp, esl_opt_GetArg(go, 2), sqfp);
+ }
+
+ /* Single sequence retrieval mode */
+ else
+ {
+ if (esl_opt_ArgNumber(go) != 2) cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+ char *key = esl_opt_GetArg(go, 2);
+ char *cstring = esl_opt_GetString(go, "-c");
+ char *newname = esl_opt_GetString(go, "-n");
+
+ /* Open the SSI index for retrieval */
+ if (! sqfp->data.ascii.do_gzip && ! sqfp->data.ascii.do_stdin && ! esl_sqio_IsAlignment(sqfp->format))
+ {
+ status = esl_sqfile_OpenSSI(sqfp, NULL);
+ if (status == eslEFORMAT) cmdline_failure(argv[0], "SSI index is in incorrect format\n");
+ else if (status == eslERANGE) cmdline_failure(argv[0], "SSI index is in 64-bit format and we can't read it\n");
+ else if (status != eslOK) cmdline_failure(argv[0], "Failed to open SSI index\n");
+ }
+
+ /* -c: subsequence retrieval; else full sequence retrieval */
+ if (cstring != NULL)
+ {
+ uint32_t start, end;
+
+ status = esl_regexp_ParseCoordString(cstring, &start, &end);
+ if (status == eslESYNTAX) esl_fatal("-c takes arg of subseq coords <from>..<to>; %s not recognized", cstring);
+ if (status == eslFAIL) esl_fatal("Failed to find <from> or <to> coord in %s", cstring);
+
+ onefetch_subseq(go, ofp, sqfp, newname, key, start, end);
+ if (ofp != stdout) printf("\n\nRetrieved subsequence %s/%d-%d.\n", key, start, end);
+ }
+ else
+ {
+ onefetch(go, ofp, esl_opt_GetArg(go, 2), sqfp);
+ if (ofp != stdout) printf("\n\nRetrieved sequence %s.\n", esl_opt_GetArg(go, 2));
+ }
+ }
+
+ esl_sqfile_Close(sqfp);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+
+/* Create an SSI index file for open sequence file <sqfp>.
+ * Both name and accession of sequences are stored as keys.
+ */
+static void
+create_ssi_index(ESL_GETOPTS *go, ESL_SQFILE *sqfp)
+{
+ ESL_NEWSSI *ns = NULL;
+ ESL_SQ *sq = esl_sq_Create();
+ int nseq = 0;
+ char *ssifile = NULL;
+ uint16_t fh;
+ int status;
+
+ esl_strdup(sqfp->filename, -1, &ssifile);
+ esl_strcat(&ssifile, -1, ".ssi", 4);
+ status = esl_newssi_Open(ssifile, TRUE, &ns); /* TRUE is for allowing overwrite. */
+ if (status == eslENOTFOUND) esl_fatal("failed to open SSI index %s", ssifile);
+ else if (status == eslEOVERWRITE) esl_fatal("SSI index %s already exists; delete or rename it", ssifile); /* won't happen, see TRUE above... */
+ else if (status != eslOK) esl_fatal("failed to create a new SSI index");
+
+ if (esl_newssi_AddFile(ns, sqfp->filename, sqfp->format, &fh) != eslOK)
+ esl_fatal("Failed to add sequence file %s to new SSI index\n", sqfp->filename);
+
+ printf("Creating SSI index for %s... ", sqfp->filename);
+ fflush(stdout);
+
+ while ((status = esl_sqio_ReadInfo(sqfp, sq)) == eslOK)
+ {
+ nseq++;
+ if (sq->name == NULL) esl_fatal("Every sequence must have a name to be indexed. Failed to find name of seq #%d\n", nseq);
+
+ if (esl_newssi_AddKey(ns, sq->name, fh, sq->roff, sq->doff, sq->L) != eslOK)
+ esl_fatal("Failed to add key %s to SSI index", sq->name);
+
+ if (sq->acc[0] != '\0') {
+ if (esl_newssi_AddAlias(ns, sq->acc, sq->name) != eslOK)
+ esl_fatal("Failed to add secondary key %s to SSI index", sq->acc);
+ }
+ esl_sq_Reuse(sq);
+ }
+ if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s):\n%s\n",
+ sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected error %d reading sequence file %s",
+ status, sqfp->filename);
+
+ /* Determine if the file was suitable for fast subseq lookup. */
+ if (sqfp->data.ascii.bpl > 0 && sqfp->data.ascii.rpl > 0) {
+ if ((status = esl_newssi_SetSubseq(ns, fh, sqfp->data.ascii.bpl, sqfp->data.ascii.rpl)) != eslOK)
+ esl_fatal("Failed to set %s for fast subseq lookup.");
+ }
+
+ /* Save the SSI file to disk */
+ if (esl_newssi_Write(ns) != eslOK) esl_fatal("Failed to write keys to ssi file %s\n", ssifile);
+
+ /* Done - output and exit. */
+ printf("done.\n");
+ if (ns->nsecondary > 0)
+ printf("Indexed %d sequences (%ld names and %ld accessions).\n", nseq, (long) ns->nprimary, (long) ns->nsecondary);
+ else
+ printf("Indexed %d sequences (%ld names).\n", nseq, (long) ns->nprimary);
+ printf("SSI index written to file %s\n", ssifile);
+
+ free(ssifile);
+ esl_sq_Destroy(sq);
+ esl_newssi_Close(ns);
+ return;
+}
+
+/* multifetch:
+ * given a file containing lines with one name or key per line;
+ * parse the file line-by-line;
+ * if we have an SSI index available, retrieve the seqs by key
+ * as we see each line;
+ * else, without an SSI index, store the keys in a hash, then
+ * read the entire seq file in a single pass, outputting seqs
+ * that are in our keylist.
+ *
+ * Note that with an SSI index, you get the seqs in the order they
+ * appear in the <keyfile>, but without an SSI index, you get seqs in
+ * the order they occur in the seq file.
+ */
+static void
+multifetch(ESL_GETOPTS *go, FILE *ofp, char *keyfile, ESL_SQFILE *sqfp)
+{
+ ESL_KEYHASH *keys = esl_keyhash_Create();
+ ESL_FILEPARSER *efp = NULL;
+ int nseq = 0;
+ int nkeys = 0;
+ char *key;
+ int keylen;
+ int keyidx;
+ int status;
+
+
+ if (esl_fileparser_Open(keyfile, NULL, &efp) != eslOK) esl_fatal("Failed to open key file %s\n", keyfile);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ while (esl_fileparser_NextLine(efp) == eslOK)
+ {
+ if (esl_fileparser_GetTokenOnLine(efp, &key, &keylen) != eslOK)
+ esl_fatal("Failed to read seq name on line %d of file %s\n", efp->linenumber, keyfile);
+
+ status = esl_keyhash_Store(keys, key, keylen, &keyidx);
+ if (status == eslEDUP) esl_fatal("seq key %s occurs more than once in file %s\n", key, keyfile);
+
+ /* if we have an SSI index, just fetch them as we go. */
+ if (sqfp->data.ascii.ssi != NULL) { onefetch(go, ofp, key, sqfp); nseq++; }
+ nkeys++;
+ }
+
+ /* If we don't have an SSI index, we haven't fetched anything yet; do it now. */
+ if (sqfp->data.ascii.ssi == NULL)
+ {
+ ESL_SQ *sq = esl_sq_Create();
+
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ if ( (sq->name[0] != '\0' && esl_keyhash_Lookup(keys, sq->name, -1, NULL) == eslOK) ||
+ (sq->acc[0] != '\0' && esl_keyhash_Lookup(keys, sq->acc, -1, NULL) == eslOK))
+ {
+ if (esl_opt_GetBoolean(go, "-r") )
+ if (esl_sq_ReverseComplement(sq) != eslOK)
+ esl_fatal("Failed to reverse complement %s\n", sq->name);
+ esl_sqio_Write(ofp, sq, eslSQFILE_FASTA, FALSE);
+ nseq++;
+ }
+ esl_sq_Reuse(sq);
+ }
+ if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s):\n%s\n",
+ sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected error %d reading sequence file %s",
+ status, sqfp->filename);
+ esl_sq_Destroy(sq);
+ }
+
+ if (nkeys != nseq) esl_fatal("Tried to retrieve %d keys, but only retrieved %d sequences\n", nkeys, nseq);
+
+ if (ofp != stdout) printf("\nRetrieved %d sequences.\n", nseq);
+
+ esl_keyhash_Destroy(keys);
+ esl_fileparser_Close(efp);
+ return;
+}
+
+
+
+/* onefetch():
+ * Given one <key> (a seq name or accession), retrieve the corresponding sequence.
+ * In SSI mode, we can do this quickly by positioning the file, then regurgitating
+ * every line until the end-of-record marker; we don't even have to parse.
+ * Without an SSI index, we have to parse the file sequentially 'til we find
+ * the one we're after.
+ */
+static void
+onefetch(ESL_GETOPTS *go, FILE *ofp, char *key, ESL_SQFILE *sqfp)
+{
+ ESL_SQ *sq = esl_sq_Create();
+ int do_revcomp = esl_opt_GetBoolean(go, "-r");
+ char *newname = esl_opt_GetString(go, "-n");
+ int status;
+
+ /* Try to position the file at the desired sequence with SSI. */
+ if (sqfp->data.ascii.ssi != NULL)
+ {
+ status = esl_sqfile_PositionByKey(sqfp, key);
+ if (status == eslENOTFOUND) esl_fatal("seq %s not found in SSI index for file %s\n", key, sqfp->filename);
+ else if (status == eslEFORMAT) esl_fatal("Failed to parse SSI index for %s\n", sqfp->filename);
+ else if (status != eslOK) esl_fatal("Failed to look up location of seq %s in SSI index of file %s\n", key, sqfp->filename);
+
+ status = esl_sqio_Read(sqfp, sq);
+ if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s):\n%s\n",
+ sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (status == eslEOF) esl_fatal("Unexpected EOF reading sequence file %s",
+ status, sqfp->filename);
+ else if (status != eslOK) esl_fatal("Unexpected error %d reading sequence file %s",
+ status, sqfp->filename);
+
+ if (strcmp(key, sq->name) != 0 && strcmp(key, sq->acc) != 0)
+ esl_fatal("whoa, internal error; found the wrong sequence %s, not %s", sq->name, key);
+ }
+ else
+ { /* Else, we have to read the whole damn file sequentially until we find the seq */
+ while ((status = esl_sqio_Read(sqfp, sq)) != eslEOF) {
+ if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s):\n%s\n",
+ sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslOK) esl_fatal("Unexpected error %d reading sequence file %s",
+ status, sqfp->filename);
+
+ if (strcmp(key, sq->name) == 0 || strcmp(key, sq->acc) == 0) break;
+ esl_sq_Reuse(sq);
+ }
+ if (status == eslEOF) esl_fatal("Failed to find sequence %s in file %s\n", key, sqfp->filename);
+
+ }
+
+ if (do_revcomp == FALSE && newname == NULL && ! esl_sqio_IsAlignment(sqfp->format))
+ { /* If we're not manipulating the sequence in any way, and it's not from an alignment file, we can Echo() it. */
+ if (esl_sqio_Echo(sqfp, sq, ofp) != eslOK) esl_fatal("Echo failed: %s\n", esl_sqfile_GetErrorBuf(sqfp));
+ }
+ else
+ { /* Otherwise we Write() the parsed version. */
+ if (do_revcomp && esl_sq_ReverseComplement(sq) != eslOK) esl_fatal("Failed to reverse complement %s; is it a protein?\n", sq->name);
+ if (newname != NULL) esl_sq_SetName(sq, newname);
+ esl_sqio_Write(ofp, sq, eslSQFILE_FASTA, FALSE);
+ }
+
+ esl_sq_Destroy(sq);
+}
+
+static void
+multifetch_subseq(ESL_GETOPTS *go, FILE *ofp, char *gdffile, ESL_SQFILE *sqfp)
+{
+ ESL_FILEPARSER *efp = NULL;
+ char *newname;
+ char *s;
+ int n1, n2;
+ int start, end;
+ char *source;
+
+ if (esl_fileparser_Open(gdffile, NULL, &efp) != eslOK) esl_fatal("Failed to open key file %s\n", gdffile);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ while (esl_fileparser_NextLine(efp) == eslOK)
+ {
+ if (esl_fileparser_GetTokenOnLine(efp, &newname, &n1) != eslOK)
+ esl_fatal("Failed to read subseq name on line %d of file %s\n", efp->linenumber, gdffile);
+
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) != eslOK)
+ esl_fatal("Failed to read start coord on line %d of file %s\n", efp->linenumber, gdffile);
+ start = atoi(s);
+ if(start <= 0)
+ esl_fatal("Read invalid start coord %d on line %d of file %s (must be positive integer)\n", start, efp->linenumber, gdffile);
+
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) != eslOK)
+ esl_fatal("Failed to read end coord on line %d of file %s\n", efp->linenumber, gdffile);
+ end = atoi(s);
+ if(end < 0)
+ esl_fatal("Read invalid end coord %d on line %d of file %s (must be positive integer, or 0 for full length)\n", end, efp->linenumber, gdffile);
+
+ if (esl_fileparser_GetTokenOnLine(efp, &source, &n2) != eslOK)
+ esl_fatal("Failed to read source seq name on line %d of file %s\n", efp->linenumber, gdffile);
+
+ onefetch_subseq(go, ofp, sqfp, newname, source, start, end);
+ }
+ esl_fileparser_Close(efp);
+}
+
+static void
+onefetch_subseq(ESL_GETOPTS *go, FILE *ofp, ESL_SQFILE *sqfp, char *newname, char *key, uint32_t given_start, uint32_t given_end)
+{
+ int start, end;
+ int do_revcomp;
+ ESL_SQ *sq = esl_sq_Create();
+
+ if (sqfp->data.ascii.ssi == NULL) esl_fatal("no ssi index");
+
+ /* reverse complement indicated by coords. */
+ /* -c 52: would be 52,0, so watch out for given_end = 0 case */
+ if (given_end != 0 && given_start > given_end)
+ { start = given_end; end = given_start; do_revcomp = TRUE; }
+ else
+ { start = given_start; end = given_end; do_revcomp = FALSE; }
+
+ if (esl_sqio_FetchSubseq(sqfp, key, start, end, sq) != eslOK) esl_fatal(esl_sqfile_GetErrorBuf(sqfp));
+
+ if (newname != NULL) esl_sq_SetName(sq, newname);
+ else esl_sq_FormatName(sq, "%s/%d-%d", key, given_start, (given_end == 0) ? sq->L : given_end);
+
+ /* Two ways we might have been asked to revcomp: by coord, or by -r option */
+ /* (If both happen, they'll cancel each other out) */
+ if (do_revcomp)
+ if (esl_sq_ReverseComplement(sq) != eslOK) esl_fatal("Failed to reverse complement %s; is it a protein?\n", sq->name);
+ if (esl_opt_GetBoolean(go, "-r"))
+ if (esl_sq_ReverseComplement(sq) != eslOK) esl_fatal("Failed to reverse complement %s; is it a protein?\n", sq->name);
+
+ esl_sqio_Write(ofp, sq, eslSQFILE_FASTA, FALSE);
+ esl_sq_Destroy(sq);
+}
+
+
diff --git a/miniapps/esl-sfetch.man b/miniapps/esl-sfetch.man
new file mode 100644
index 0000000..054af71
--- /dev/null
+++ b/miniapps/esl-sfetch.man
@@ -0,0 +1,290 @@
+.TH "esl-sfetch" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-sfetch - retrieve (sub-)sequences from a sequence file
+
+.SH SYNOPSIS
+
+.TP
+Single sequence retrieval:
+.B esl-sfetch
+.I [options]
+.I seqfile
+.I key
+
+.TP
+Single subsequence retrieval:
+.B esl-sfetch -c
+.I <from>..<to>
+.I seqfile
+.I key
+
+.TP
+Multiple sequence retrieval:
+.B esl-sfetch -f
+.I [options]
+.I seqfile
+.I keyfile
+
+.TP
+Multiple subsequence retrieval:
+.B esl-sfetch -Cf
+.I [options]
+.I seqfile
+.I subseq-coord-file
+
+.TP
+Indexing a sequence file for retrieval:
+.B esl-afetch --index
+.I msafile
+
+
+.SH DESCRIPTION
+
+.pp
+.B esl-sfetch
+retrieves one or more sequences or subsequences from
+.I seqfile.
+
+.pp
+The
+.I seqfile
+should be indexed first using
+.B esl-sfetch --index <seqfile>.
+This creates an SSI index file
+.I <seqfile>.ssi.
+An SSI file is not necessary, but it greatly accelerates
+retrieval.
+
+.pp
+To retrieve a single complete sequence, do
+.B esl-sfetch <seqfile> <key>
+where
+.I key
+is the name or accession of the desired sequence.
+
+.pp
+To retrieve a single subsequence rather than a complete
+sequence, use the
+.I -c start-end
+option to provide start and end coordinates. The start
+and end coordinates are provided as one string, separated
+by any nonnumeric, nonwhitespace character or characters you like;
+for example,
+.I -c 23..100
+,
+.I -c 23/100
+, or
+.I -c 23-100
+all work. To retrieve a suffix of a subsequence, you
+can omit the
+.I end
+; for example,
+.I -c 23:
+would work.
+
+.pp
+To retrieve more than one complete sequence at once, you may use the
+.I -f
+option, and the second command line argument will specify the
+name of a
+.I keyfile
+that contains a list of names or accessions, one per line; the first
+whitespace-delimited field on each line of this file is parsed as the
+name/accession.
+
+.pp
+To retrieve more than one subsequence at once, use the
+.I -C
+option in addition to
+.I -f
+, and now the second argument is parsed as a list of subsequence
+coordinate lines, with each line containing at least four
+whitespace-delimited fields:
+.I new_name
+.I from
+.I to
+.I name/accession.
+For each such line, sequence
+.I name/accession
+is found, a subsequence
+.I from..to is extracted,
+and the subsequence is renamed
+.I new_name
+before being output.
+
+
+.pp
+In DNA/RNA files, you may extract (sub-)sequences in reverse complement
+orientation in two different ways: either by providing a
+.I from
+coordinate that is greater than
+.I to,
+or by providing the
+.I -r
+option.
+
+.pp
+The sequence file may be in any of several different common unaligned
+sequence formats including FASTA, GenBank, EMBL, UniProt, or DDBJ. It
+may also be an alignment file, in Stockholm format for example. By
+default the file format is autodetected. The
+.I --informat <s>
+option allows you to specify the format and override
+autodetection. This
+option may be useful for making
+.B esl-sfetch
+more robust, because format autodetection may fail on unusual files.
+
+.pp
+When the
+.I -f
+option is used to do multiple (sub-)sequence retrieval, the file
+argument may be - (a single dash), in which case the list of
+names/accessions (or subsequence coordinate lines) is read from
+standard input. However, because a standard input stream can't be SSI indexed,
+(sub-)sequence retrieval from
+.I stdin
+may be slow.
+
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.BI -c " <coords>"
+Retrieve a subsequence with start and end coordinates specified by the
+.I <coords>
+string. This string consists of start
+and end coordinates separated
+by any nonnumeric, nonwhitespace character or characters you like;
+for example,
+.I -c 23..100
+,
+.I -c 23/100
+, or
+.I -c 23-100
+all work. To retrieve a suffix of a subsequence, you
+can omit the
+.I end
+; for example,
+.I -c 23:
+would work.
+To specify reverse complement (for DNA/RNA sequence),
+specify
+.I <from>
+greater than
+.I <to>;
+for example,
+.I -c 100..23
+retrieves the reverse complement strand from 100 to 23.
+
+.TP
+.B -f
+Interpret the second argument as a
+.I keyfile
+instead of as just one
+.I key.
+The first whitespace-limited field on each line of
+.I keyfile
+is interpreted as a name or accession to be fetched.
+This option doesn't work with the
+.B --index
+option. Any other fields on a line after the first one are
+ignored. Blank lines and lines beginning with # are ignored.
+
+.TP
+.BI -o " <f>"
+Output retrieved sequences to a file
+.I <f>
+instead of to
+.I stdout.
+
+
+.TP
+.BI -n " <s>"
+Rename the retrieved (sub-)sequence
+.I <s>.
+This is incompatible with the
+.I -f
+option.
+
+.TP
+.B -r
+Reverse complement the retrieved (sub-)sequence. This only works for
+DNA/RNA sequences.
+
+.TP
+.B -C
+Multiple subsequence retrieval mode, with
+.I -f
+option (required). Specifies that the second command line argument
+is to be parsed as a subsequence coordinate file, consisting of
+lines containing four whitespace-delimited fields:
+.I new_name
+.I from
+.I to
+.I name/accession.
+For each such line, sequence
+.I name/accession
+is found, a subsequence
+.I from..to is extracted,
+and the subsequence is renamed
+.I new_name
+before being output.
+Any other fields after the first four are ignored. Blank lines
+and lines beginning in # are ignored.
+
+
+.TP
+.B -O
+Output retrieved sequence to a file named
+.I <key>.
+This is a convenience for saving some typing:
+instead of
+.B esl-sfetch -o SRPA_HUMAN swissprot SRPA_HUMAN
+you can just type
+.B esl-sfetch -O swissprot SRPA_HUMAN.
+The
+.B -O
+option only works if you're retrieving a
+single alignment; it is incompatible with
+.B -f.
+
+.TP
+.B --index
+Instead of retrieving a
+.I key,
+the special command
+.B esl-afetch --index
+.I msafile
+produces an SSI index of the names and accessions
+of the alignments in
+the
+.I msafile.
+Indexing should be done once on the
+.I msafile
+to prepare it for all future fetches.
+
+.SH EXPERT OPTIONS
+
+.TP
+.BI --informat " <s>"
+Specify that the sequence file is in format
+.I <s>,
+where
+.I <s>
+may be FASTA, GenBank, EMBL, UniProt, DDBJ, or Stockholm. This string
+is case-insensitive ("genbank" or "GenBank" both work, for example).
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-shuffle.c b/miniapps/esl-shuffle.c
new file mode 100644
index 0000000..5cc93c4
--- /dev/null
+++ b/miniapps/esl-shuffle.c
@@ -0,0 +1,394 @@
+/* Shuffling or generating random sequences.
+ *
+ * SRE, Wed Jan 16 15:30:05 2008 [UA5230 to New York]
+ * SVN $Id$
+ * from squid's shuffle (1995)
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_composition.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msashuffle.h"
+#include "esl_random.h"
+#include "esl_randomseq.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_vectorops.h"
+
+static char banner[] = "shuffling or generating random sequences";
+static char usage1[] = " [options] <seqfile> (shuffles individual sequences)";
+static char usage2[] = "-A [options] <msafile> (shuffles alignment columnwise)";
+static char usage3[] = "-Q [options] <qrnafile> (shuffles QRNA pairwise alignments)";
+static char usage4[] = "-G [options] (generates random sequences)";
+
+
+#define MODE_OPTS "-S,-A,-G,-Q" /* toggle group, modes (seqfile, msafile, none) */
+#define SHUF_OPTS "-m,-d,-k,-0,-1,-r,-w" /* toggle group, seq shuffling options */
+#define ALPH_OPTS "--rna,--dna,--amino" /* toggle group, alphabet type options */
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-o", eslARG_OUTFILE, NULL, NULL, NULL, NULL, NULL, NULL, "direct output data to file <f>", 1 },
+ { "-N", eslARG_INT, "1", NULL,"n>0", NULL, NULL, NULL, "generate <n> samples (per input seq/msa)", 1 },
+ { "-L", eslARG_INT, "0", NULL,"n>=0", NULL, NULL, NULL, "truncate outputs to length <n>", 1 },
+
+ /* Options for shuffling/generating based on input sequences */
+ { "-m", eslARG_NONE,"default", NULL, NULL, SHUF_OPTS, "-S", NULL, "shuffle preserving monoresidue composition", 2 },
+ { "-d", eslARG_NONE, FALSE, NULL, NULL, SHUF_OPTS, "-S", NULL, "shuffle preserving mono- and di-residue composition", 2 },
+ { "-k", eslARG_INT, FALSE, NULL,"n>0", SHUF_OPTS, "-S", NULL, "shuffle nonoverlapping <n>-mers", 2 },
+ { "-0", eslARG_NONE, FALSE, NULL, NULL, SHUF_OPTS, "-S", NULL, "generate with 0th order Markov properties per input", 2 },
+ { "-1", eslARG_NONE, FALSE, NULL, NULL, SHUF_OPTS, "-S", NULL, "generate with 1st order Markov properties per input", 2 },
+ { "-r", eslARG_NONE, FALSE, NULL, NULL, SHUF_OPTS, "-S", NULL, "reverse each input", 2 },
+ { "-w", eslARG_INT, FALSE, NULL,"n>0", SHUF_OPTS, "-S", NULL, "regionally shuffle inputs in window size <n>", 2 },
+
+ /* Options for shuffling multiple alignments column-wise */
+ { "-b", eslARG_NONE, FALSE, NULL, NULL, NULL, "-A", NULL, "take bootstrapping samples", 3 },
+
+ /* Options for generating sequences de novo */
+ { "--rna", eslARG_NONE,"default", NULL, NULL, ALPH_OPTS, "-G", NULL, "generate RNA sequence", 4 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, ALPH_OPTS, "-G", NULL, "generate DNA sequence", 4 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, ALPH_OPTS, "-G", NULL, "generate protein sequence", 4 },
+
+ /* Other "expert" options */
+ { "--seed", eslARG_INT, "0", NULL,"n>=0", NULL, NULL, NULL, "set random number generator's seed to <n>", 5 },
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "specify that input file is in format <s>", 5 },
+
+ /* "undocumented" options (these are documented w/ command line usage, and implemented as options) */
+ { "-S", eslARG_NONE,"default", NULL, NULL, MODE_OPTS, NULL, NULL, "shuffle individual input sequences", 99 },
+ { "-A", eslARG_NONE, FALSE, NULL, NULL, MODE_OPTS, NULL, NULL, "input is an <msafile> to be shuffled by columns", 99 },
+ { "-G", eslARG_NONE, FALSE, NULL, NULL, MODE_OPTS, "-L", NULL, "generate de novo (the following options are valid)", 99 },
+ { "-Q", eslARG_NONE, FALSE, NULL, NULL, MODE_OPTS, NULL, NULL, "shuffle input QRNA FASTA file", 99 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+
+static void
+cmdline_failure(char *argv0, char *format, ...)
+{
+ va_list argp;
+
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ esl_usage(stdout, argv0, usage1);
+ esl_usage(stdout, argv0, usage2);
+ esl_usage(stdout, argv0, usage3);
+ esl_usage(stdout, argv0, usage4);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv0);
+ exit(1);
+}
+
+static void
+cmdline_help(char *argv0, ESL_GETOPTS *go)
+{
+ esl_banner(stdout, argv0, banner);
+ esl_usage (stdout, argv0, usage1);
+ esl_usage (stdout, argv0, usage2);
+ esl_usage (stdout, argv0, usage3);
+ esl_usage (stdout, argv0, usage4);
+ puts("\n where general options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ puts("\n options for shuffling input sequences (default mode):");
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80);
+ puts("\n options for generating sequences de novo (w/ -G option):");
+ esl_opt_DisplayHelp(stdout, go, 4, 2, 80);
+ puts("\n other infrequently used options:");
+ esl_opt_DisplayHelp(stdout, go, 5, 2, 80);
+ exit(0);
+}
+
+
+/* msa_shuffling()
+ *
+ * Shuffling multiple sequence alignments
+ */
+static int
+msa_shuffling(ESL_GETOPTS *go, ESL_RANDOMNESS *r, FILE *ofp, int outfmt)
+{
+ char *msafile = esl_opt_GetArg(go, 1);
+ int infmt = eslMSAFILE_UNKNOWN;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ ESL_MSA *shuf = NULL;
+ int N = esl_opt_GetInteger(go, "-N");
+ int i;
+ int status;
+
+ if ( (status = esl_msafile_Open(NULL, msafile, NULL, infmt, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+ while ((status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ shuf = esl_msa_Clone(msa);
+
+ for (i = 0; i < N; i++)
+ {
+ if (esl_opt_GetBoolean(go, "--boot")) esl_msashuffle_Bootstrap(r, msa, shuf);
+ else esl_msashuffle_Shuffle (r, msa, shuf);
+
+ /* Set the name of the shuffled alignment */
+ if (msa->name != NULL) {
+ if (esl_opt_GetBoolean(go, "--boot")) {
+ if (N > 1) esl_msa_FormatName(shuf, "%s-sample-%d", msa->name, i);
+ else esl_msa_FormatName(shuf, "%s-sample", msa->name);
+ } else {
+ if (N > 1) esl_msa_FormatName(shuf, "%s-shuffle-%d", msa->name, i);
+ else esl_msa_FormatName(shuf, "%s-shuffle", msa->name);
+ }
+ } else {
+ if (esl_opt_GetBoolean(go, "--boot")) {
+ if (N > 1) esl_msa_FormatName(shuf, "sample-%d", i);
+ else esl_msa_FormatName(shuf, "sample");
+ } else {
+ if (N > 1) esl_msa_FormatName(shuf, "shuffle-%d", i);
+ else esl_msa_FormatName(shuf, "shuffle");
+ }
+ }
+
+ esl_msafile_Write(ofp, shuf, afp->format);
+ }
+
+ esl_msa_Destroy(shuf);
+ esl_msa_Destroy(msa);
+ }
+
+ esl_msafile_Close(afp);
+ return eslOK;
+}
+
+
+/* seq_generation()
+ *
+ * Generating sequences.
+ */
+static int
+seq_generation(ESL_GETOPTS *go, ESL_RANDOMNESS *r, FILE *ofp, int outfmt)
+{
+ ESL_ALPHABET *abc = NULL;
+ ESL_SQ *sq = NULL;
+ double *fq = NULL;
+ int alphatype = eslUNKNOWN; // static checkers can't see that 1 of --rna, --dna, --amino must be true
+ int N = esl_opt_GetInteger(go, "-N");
+ int L = esl_opt_GetInteger(go, "-L");
+ int i;
+ int status;
+
+ if (L <= 0) esl_fatal("To generate sequences, set -L option (length of generated seqs) > 0 ");
+ if (esl_opt_GetBoolean(go, "--rna")) alphatype = eslRNA;
+ if (esl_opt_GetBoolean(go, "--dna")) alphatype = eslDNA;
+ if (esl_opt_GetBoolean(go, "--amino")) alphatype = eslAMINO;
+ abc = esl_alphabet_Create(alphatype);
+ sq = esl_sq_CreateDigital(abc);
+ esl_sq_GrowTo(sq, L);
+
+ /* Pick the iid frequency distribution to use */
+ ESL_ALLOC(fq, sizeof(double) * abc->K);
+ switch (alphatype) {
+ case eslRNA:
+ case eslDNA: esl_vec_DSet(fq, 4, 0.25); break;
+ case eslAMINO: esl_composition_SW34(fq); break;
+ default: esl_vec_DSet(fq, abc->K, 1.0 / (double) abc->K); break;
+ }
+
+ /* generate */
+ for (i = 0; i < N; i++)
+ {
+ esl_rsq_xIID(r, fq, abc->K, L, sq->dsq);
+ if (N > 1) esl_sq_FormatName(sq, "random%d", i);
+ else esl_sq_SetName(sq, "random");
+ sq->n = L;
+ esl_sqio_Write(ofp, sq, outfmt, FALSE);
+ }
+
+ free(fq);
+ esl_alphabet_Destroy(abc);
+ esl_sq_Destroy(sq);
+ return eslOK;
+
+ ERROR:
+ if (fq != NULL) free(fq);
+ esl_alphabet_Destroy(abc);
+ esl_sq_Destroy(sq);
+ return status;
+}
+
+
+/* seq_shuffling()
+ * SRE, Tue Jan 22 08:35:51 2008 [Market Street Cafe, Leesburg]
+ *
+ * Shuffling of input sequences.
+ *
+ * Fixed-length (L>0) vs. full-length (L=0) modes handled differently.
+ * In fixed-length mode:
+ * <shuff->seq> only needs to be allocated once, for L
+ * <targ> is an allocated copy of a random subseq of length L
+ * sequences < L residues long can't be shuffled
+ * In full-length mode:
+ * <shuff->seq> is grown to length <sq->n> for each input seq
+ * <targ> just points to <sq->seq>
+ */
+static int
+seq_shuffling(ESL_GETOPTS *go, ESL_RANDOMNESS *r, FILE *ofp, int outfmt)
+{
+ char *seqfile = esl_opt_GetArg(go, 1);
+ int infmt = eslSQFILE_UNKNOWN;
+ ESL_SQFILE *sqfp = NULL;
+ ESL_SQ *sq = esl_sq_Create();
+ ESL_SQ *shuff = esl_sq_Create();
+ char *targ = NULL;
+ int N = esl_opt_GetInteger(go, "-N");
+ int L = esl_opt_GetInteger(go, "-L"); /* L>0 means select random fixed-len subseqs */
+ int kmers = 0;
+ int i;
+ int status;
+
+ if (esl_opt_GetString(go, "--informat") != NULL) {
+ infmt = esl_sqio_EncodeFormat(esl_opt_GetString(go, "--informat"));
+ if (infmt == eslSQFILE_UNKNOWN) esl_fatal("%s is not a valid input sequence file format for --informat");
+ }
+
+ if (esl_opt_IsOn(go, "-k")) kmers = esl_opt_GetInteger(go, "-k");
+
+
+ status = esl_sqfile_Open(seqfile, infmt, NULL, &sqfp);
+ if (status == eslENOTFOUND) esl_fatal("No such file %s", seqfile);
+ else if (status == eslEFORMAT) esl_fatal("Format of seqfile %s unrecognized.", seqfile);
+ else if (status == eslEINVAL) esl_fatal("Can't autodetect stdin or .gz.");
+ else if (status != eslOK) esl_fatal("Open failed, code %d.", status);
+
+ if (L>0) {
+ esl_sq_GrowTo(shuff, L);
+ shuff->n = L;
+ ESL_ALLOC(targ, sizeof(char) * (L+1));
+ }
+
+ while ((status = esl_sqio_Read(sqfp, sq)) == eslOK)
+ {
+ if (L == 0) { /* shuffling entire sequence */
+ esl_sq_GrowTo(shuff, sq->n); /* make sure shuff can hold sq */
+ shuff->n = sq->n;
+ targ = sq->seq;
+ } else {
+ if (sq->n < L) continue; /* reject seqs < L long */
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ if (L > 0) { /* fixed-len mode: copy a random subseq */
+ int pos = esl_rnd_Roll(r, sq->n - L + 1);
+ strncpy(targ, sq->seq + pos, L);
+ targ[L] = '\0';
+ }
+
+ /* Do the requested kind of shuffling */
+ if (esl_opt_GetBoolean(go, "-m")) esl_rsq_CShuffle (r, targ, shuff->seq); /* monoresidue shuffling */
+ else if (esl_opt_GetBoolean(go, "-d")) esl_rsq_CShuffleDP (r, targ, shuff->seq); /* diresidue shuffling */
+ else if (esl_opt_IsOn (go, "-k")) esl_rsq_CShuffleKmers(r, targ, kmers, shuff->seq); /* diresidue shuffling */
+ else if (esl_opt_GetBoolean(go, "-0")) esl_rsq_CMarkov0 (r, targ, shuff->seq); /* 0th order Markov */
+ else if (esl_opt_GetBoolean(go, "-1")) esl_rsq_CMarkov1 (r, targ, shuff->seq); /* 1st order Markov */
+ else if (esl_opt_GetBoolean(go, "-r")) esl_rsq_CReverse ( targ, shuff->seq); /* reverse */
+ else if (esl_opt_IsOn (go, "-w")) { /* regionally shuffle */
+ int W= esl_opt_GetInteger(go, "-w"); esl_rsq_CShuffleWindows(r, targ, W, shuff->seq);
+ }
+
+ /* Set the name of the shuffled sequence */
+ if (N > 1) esl_sq_FormatName(shuff, "%s-shuffled-%d", sq->name, i);
+ else esl_sq_FormatName(shuff, "%s-shuffled", sq->name);
+
+ /* Output the resulting sequence */
+ esl_sqio_Write(ofp, shuff, outfmt, FALSE);
+
+ /* don't need to reuse the shuffled sequence: we will use exactly the same memory */
+ }
+ esl_sq_Reuse(sq);
+ }
+ if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s):\n%s\n",
+ sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected error %d reading sequence file %s",
+ status, sqfp->filename);
+
+ if (L>0) free(targ);
+ esl_sq_Destroy(shuff);
+ esl_sq_Destroy(sq);
+ esl_sqfile_Close(sqfp);
+ return eslOK;
+
+ ERROR:
+ if (targ != NULL) free(targ);
+ esl_sq_Destroy(shuff);
+ esl_sq_Destroy(sq);
+ esl_sqfile_Close(sqfp);
+ return status;
+}
+
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ ESL_RANDOMNESS *r = NULL; /* random number generator */
+ FILE *ofp = NULL; /* data output stream */
+ int outfmt = eslSQFILE_FASTA;
+
+ /* Parse command line */
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK)
+ cmdline_failure(argv[0], "Failed to parse command line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK)
+ cmdline_failure(argv[0], "Error in app configuration: %s\n", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") )
+ cmdline_help(argv[0], go);
+
+ /* Open the output data file, if any */
+ if (esl_opt_GetString(go, "-o") != NULL)
+ {
+ if ((ofp = fopen(esl_opt_GetString(go, "-o"), "w")) == NULL)
+ esl_fatal("Failed to open output file %s\n", esl_opt_GetString(go, "-o"));
+ }
+ else ofp = stdout;
+
+ /* Initialize */
+ r = esl_randomness_Create(esl_opt_GetInteger(go, "--seed"));
+
+ /* Hand off execution to one of the three modes */
+ if (esl_opt_GetBoolean(go, "-A")) /* Alignment shuffling */
+ {
+ if (esl_opt_ArgNumber(go) != 1)
+ cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+
+ msa_shuffling(go, r, ofp, outfmt);
+ }
+ else if (esl_opt_GetBoolean(go, "-G")) /* Sequence generation */
+ {
+ if (esl_opt_ArgNumber(go) != 0)
+ cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+
+ seq_generation(go, r, ofp, outfmt);
+ }
+ else if (esl_opt_GetBoolean(go, "-S")) /* Sequence shuffling */
+ {
+ if (esl_opt_ArgNumber(go) != 1)
+ cmdline_failure(argv[0], "Incorrect number of command line arguments.\n");
+
+ seq_shuffling(go, r, ofp, outfmt);
+ }
+
+ if (esl_opt_GetString(go, "-o") != NULL) fclose(ofp);
+ esl_randomness_Destroy(r);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/miniapps/esl-shuffle.itest.pl b/miniapps/esl-shuffle.itest.pl
new file mode 100755
index 0000000..0c8e568
--- /dev/null
+++ b/miniapps/esl-shuffle.itest.pl
@@ -0,0 +1,54 @@
+#! /usr/bin/perl
+
+# Integrated test of esl-shuffle miniapp
+#
+# Usage: ./esl-shuffle.itest.pl <esl-shuffle binary> <tmpfile prefix>
+# Example: ./esl-shuffle.itest.pl ./esl-shuffle foo
+#
+# SRE, Tue Nov 10 17:27:22 2009
+# SVN $Id$
+
+$eslshuffle = shift;
+$tmppfx = shift;
+
+if (! -x "$eslshuffle") { die "FAIL: didn't find esl-shuffle binary $eslshuffle"; }
+
+open(TESTFILE, ">$tmppfx.fa") || die "FAIL: couldn't open $tmppfx.fa for writing test seqfile";
+print TESTFILE << "EOF";
+>seq1
+ACDEFGHIKLMNPQRSTVWY
+>seq2
+ACACACACACACACACACAC
+>seq3
+WYWYWYWYWYWYWYWYWYWY
+EOF
+close TESTFILE;
+
+# Use of --seed makes shuffled outputs reproducible, regressable.
+# Until you change the RNG again, anyway. If you do that, all these
+# regressions need to change.
+#
+ at output = `$eslshuffle --seed 42 $tmppfx.fa`;
+if ($? != 0) { die "FAIL: esl-shuffle failed unexpectedly"; }
+if ($output[0] !~ /^>seq1-shuffled$/) { die "FAIL: shuffle output is incorrect"; }
+if ($output[1] !~ /^TIGEYHFWCKVSALQNPDRM$/) { die "FAIL: shuffle output is incorrect"; }
+if ($output[2] !~ /^>seq2-shuffled$/) { die "FAIL: shuffle output is incorrect"; }
+if ($output[3] !~ /^CACAAAACCCACCAACAACC$/) { die "FAIL: shuffle output is incorrect"; }
+if ($output[4] !~ /^>seq3-shuffled$/) { die "FAIL: shuffle output is incorrect"; }
+if ($output[5] !~ /^WWYYWWYWWYYWYYWYYWYW$/) { die "FAIL: shuffle output is incorrect"; }
+
+
+# We had bugs in the -N option at one point. This test exercises the
+# bugs.
+#
+ at output = `$eslshuffle --seed 42 -N 2 $tmppfx.fa`;
+if ($? != 0) { die "FAIL: esl-shuffle failed unexpectedly"; }
+if ($output[2] !~ /^>seq1-shuffled-1$/) { die "FAIL: shuffle output is incorrect"; }
+if ($output[3] !~ /^NTEPDRFIQYKLCMWVHAGS$/) { die "FAIL: shuffle output is incorrect"; }
+
+
+
+
+print "ok\n";
+unlink "$tmppfx.fa";
+exit 0;
diff --git a/miniapps/esl-shuffle.man b/miniapps/esl-shuffle.man
new file mode 100644
index 0000000..15ecca7
--- /dev/null
+++ b/miniapps/esl-shuffle.man
@@ -0,0 +1,231 @@
+.TH "esl-shuffle" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-shuffle - shuffling sequences or generating random ones
+
+.SH SYNOPSIS
+
+.TP
+Shuffling individual sequences:
+.B esl-shuffle
+.I [options]
+.I seqfile
+
+.TP
+Generating random sequences:
+.B esl-shuffle -G
+.I [options]
+
+.TP
+Shuffling multiple sequence alignments columnwise:
+.B esl-shuffle -A
+.I [options]
+.I msafile
+
+.TP
+Shuffling QRNA pairwise alignment input files:
+.B esl-shuffle -Q
+.I [options]
+.I qrna-alignment-file
+
+.SH DESCRIPTION
+
+.pp
+.B esl-shuffle
+is capable of four different modes of operation.
+
+.pp
+By default,
+.B esl-shuffle
+reads individual sequences from
+.I seqfile
+, shuffles them, and outputs the shuffled sequence.
+By default, shuffling is done by preserving monoresidue
+composition; other options are listed below.
+
+.pp
+With the
+.I -G
+option,
+.B esl-shuffle
+generates some number of random sequences of some length in
+some alphabet. The
+.I -N
+option controls the number (default is 1), the
+.I -L
+option controls the length (default is 0),
+and the
+.I --amino,
+.I --dna,
+and
+.I --rna
+options control the alphabet.
+
+.pp
+With the
+.I -A
+option,
+.B esl-shuffle
+reads one or more multiple alignments from
+.I <msafile>
+and shuffles them columnwise.
+
+
+.pp
+Finally, the
+.I -Q
+option is for shuffling pairwise alignments in QRNA input files. A
+QRNA input file is a quasi-FASTA file, where each successive pair of
+sequences is interpreted as a pairwise alignment; sequences may
+contain gap characters (period, dash, or underscore: .-_) and these
+pairs of sequences must have exactly the same aligned length.
+
+.pp
+An unaligned sequence file to be shuffled may be in any of several
+different common unaligned sequence formats including FASTA, GenBank,
+EMBL, UniProt, or DDBJ; alignment files are also valid, in which case
+individual unaligned sequences are sequentially plucked from the
+alignment. By default the file format is autodetected. The
+.I --informat <s>
+option allows you to specify the format and override
+autodetection. This
+option may be useful for making
+.B esl-shuffle
+more robust, because format autodetection may fail on unusual files.
+
+.SH GENERAL OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.BI -o " <f>"
+Direct output to a file named
+.I <f>
+rather than to stdout.
+
+.TP
+.BI -N " <n>"
+Generate
+.I <n>
+sequences, or
+.I <n>
+perform independent shuffles per input sequence or alignment.
+
+.TP
+.BI -L " <n>"
+Generate sequences of length
+.I <n>,
+or truncate output shuffled sequences or alignments to a length of
+.I <n>.
+
+
+
+
+.SH SEQUENCE SHUFFLING OPTIONS
+
+These options only apply in default (sequence shuffling) mode. They
+are mutually exclusive.
+
+.TP
+.B -m
+Monoresidue shuffling (the default): preserve monoresidue composition exactly.
+Uses the so-called Fisher/Yates algorithm (Knuth's "Algorithm P").
+
+.TP
+.B -d
+Diresidue shuffling; preserve diresidue composition exactly. Uses the
+Altschul/Erickson algorithm (Altschul and Erickson, 1986). A more
+efficient algorithm (Kandel and Winkler 1996) is known but has not yet
+been implemented in Easel.
+
+.TP
+.B -0
+0th order Markov generation: generate a sequence of the same length
+with the same 0th order Markov frequencies. Such a sequence will
+approximately preserve the monoresidue composition of the input.
+
+.TP
+.B -1
+1st order Markov generation: generate a sequence of the same length
+with the same 1st order Markov frequencies. Such a sequence will
+approximately preserve the diresidue composition of the input.
+
+.TP
+.B -r
+Reversal; reverse each input.
+
+.TP
+.BI -w " <n>"
+Regionally shuffle the input in nonoverlapping windows of size
+.I <n>
+residues, preserving exact monoresidue composition in each window.
+
+
+
+.SH MULTIPLE ALIGNMENT SHUFFLING OPTIONS
+
+.TP
+.B -b
+Sample columns with replacement, in order to generate a
+bootstrap-resampled alignment dataset.
+
+
+.SH SEQUENCE GENERATION OPTIONS
+
+One of these must be selected.
+
+.TP
+.B --amino
+Generate amino acid sequences.
+
+.TP
+.B --dna
+Generate DNA sequences.
+
+.TP
+.B --rna
+Generate RNA sequences (the default).
+
+
+
+.SH EXPERT OPTIONS
+
+.TP
+.BI --informat " <s>"
+Specify that the sequence file is in format
+.I <s>,
+where
+.I <s>
+may be FASTA, GenBank, EMBL, UniProt, DDBJ, or Stockholm. This string
+is case-insensitive ("genbank" or "GenBank" both work, for example).
+
+.TP
+.BI --seed " <n>"
+Specify the seed for the random number generator, where the seed
+.I <n>
+is an integer greater than zero. This can be used to make the results
+of
+.B esl-shuffle
+reproducible. The default is to choose the random number generator
+seed by calling
+.B time().
+Note that because
+.B time()
+likely returns the time in units of seconds,
+two calls to
+.B esl-shuffle
+within the same second will use the same seed and generate
+identical random number sequences; you may want to avoid this.
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
+
diff --git a/miniapps/esl-ssdraw.c b/miniapps/esl-ssdraw.c
new file mode 100644
index 0000000..1396af8
--- /dev/null
+++ b/miniapps/esl-ssdraw.c
@@ -0,0 +1,7485 @@
+/* Draw secondary structure diagrams given a postscript SS template.
+ * Initial development of this program was for SSU rRNA structures
+ * with templates derived from Gutell's CRW (Comparative RNA Website,
+ * http://www.rna.ccbb.utexas.edu/).
+ *
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <math.h>
+#include <time.h>
+
+#include "easel.h"
+#include "esl_distance.h"
+#include "esl_dmatrix.h"
+#include "esl_fileparser.h"
+#include "esl_getopts.h"
+#include "esl_keyhash.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msafile2.h"
+#include "esl_sq.h"
+#include "esl_sqio.h"
+#include "esl_stack.h"
+#include "esl_tree.h"
+#include "esl_vectorops.h"
+#include "esl_wuss.h"
+
+#define SSDRAWINFINITY 987654321
+#define ERRBUFSIZE 1024
+#define MAXMBWITHOUTFORCE 100
+
+#define ALIMODE 0
+#define INDIMODE 1
+#define SIMPLEMASKMODE 2
+#define INFILEMODE 3
+
+/* CMYK colors, a 4 value array defines a color with values 0..1,
+ * [0] is cyan value, [1] is magenta, [2] is yellow, [3] is black */
+#define NCMYK 4
+#define ICYAN 0
+#define IMGTA 1
+#define IYELW 2
+#define IBLCK 3
+
+/* indices and sizes for hard-coded color schemes */
+#define NSCHEMES 7
+
+#define RB_11_RH_SCHEME 0 /* RainBow, 11 colors, Red High, blue low */
+#define RB_11_RL_SCHEME 1 /* RainBow, 11 colors, Red Low, blue high */
+#define RB_6_RH_SCHEME 2 /* RainBow, 6 colors, Red High, blue low */
+#define RB_6_RL_SCHEME 3 /* RainBow, 6 colors, Red Low, blue high */
+#define RB_5_RH_SCHEME 4 /* RainBow, 5 colors, Red High, teal low */
+#define RB_5_RL_SCHEME 5 /* RainBow, 5 colors, Red low, teal high */
+#define RB_W5_OH_SCHEME 6 /* RainBow with white, 5 colors, orange high, teal low, white lowest */
+
+#define NRB_11_RH_SCHEME 11
+#define NRB_11_RL_SCHEME 11
+#define NRB_6_RH_SCHEME 6
+#define NRB_6_RL_SCHEME 6
+#define NRB_5_RH_SCHEME 5
+#define NRB_5_RL_SCHEME 5
+#define NRB_W5_OH_SCHEME 5
+
+/* the actual CMYK color values for the scheme colors (_C = cyan, _M = magenta, _Y = yellow, _K = black) */
+
+/* the 11-color rainbow scheme */
+#define RED2BLUE_1_OF_11_C 0.00
+#define RED2BLUE_1_OF_11_M 0.94
+#define RED2BLUE_1_OF_11_Y 1.00
+#define RED2BLUE_1_OF_11_K 0.00
+
+#define RED2BLUE_2_OF_11_C 0.00
+#define RED2BLUE_2_OF_11_M 0.84
+#define RED2BLUE_2_OF_11_Y 1.00
+#define RED2BLUE_2_OF_11_K 0.00
+
+#define RED2BLUE_3_OF_11_C 0.00
+#define RED2BLUE_3_OF_11_M 0.63
+#define RED2BLUE_3_OF_11_Y 1.00
+#define RED2BLUE_3_OF_11_K 0.00
+
+#define RED2BLUE_4_OF_11_C 0.00
+#define RED2BLUE_4_OF_11_M 0.42
+#define RED2BLUE_4_OF_11_Y 1.00
+#define RED2BLUE_4_OF_11_K 0.00
+
+#define RED2BLUE_5_OF_11_C 0.00
+#define RED2BLUE_5_OF_11_M 0.21
+#define RED2BLUE_5_OF_11_Y 1.00
+#define RED2BLUE_5_OF_11_K 0.00
+
+#define RED2BLUE_6_OF_11_C 0.00
+#define RED2BLUE_6_OF_11_M 0.00
+#define RED2BLUE_6_OF_11_Y 1.00
+#define RED2BLUE_6_OF_11_K 0.00
+
+#define RED2BLUE_7_OF_11_C 0.42
+#define RED2BLUE_7_OF_11_M 0.00
+#define RED2BLUE_7_OF_11_Y 1.00
+#define RED2BLUE_7_OF_11_K 0.00
+
+#define RED2BLUE_8_OF_11_C 0.61
+#define RED2BLUE_8_OF_11_M 0.00
+#define RED2BLUE_8_OF_11_Y 0.56
+#define RED2BLUE_8_OF_11_K 0.22
+
+#define RED2BLUE_9_OF_11_C 0.50
+#define RED2BLUE_9_OF_11_M 0.00
+#define RED2BLUE_9_OF_11_Y 0.00
+#define RED2BLUE_9_OF_11_K 0.50
+
+#define RED2BLUE_10_OF_11_C 0.78
+#define RED2BLUE_10_OF_11_M 0.56
+#define RED2BLUE_10_OF_11_Y 0.00
+#define RED2BLUE_10_OF_11_K 0.22
+
+#define RED2BLUE_11_OF_11_C 0.92
+#define RED2BLUE_11_OF_11_M 0.84
+#define RED2BLUE_11_OF_11_Y 0.00
+#define RED2BLUE_11_OF_11_K 0.08
+
+
+/* the 6-color rainbow scheme */
+/* red */
+#define RED2BLUE_1_OF_6_C 0.00
+#define RED2BLUE_1_OF_6_M 0.94
+#define RED2BLUE_1_OF_6_Y 1.00
+#define RED2BLUE_1_OF_6_K 0.00
+
+/* orange-ish */
+#define RED2BLUE_2_OF_6_C 0.00
+#define RED2BLUE_2_OF_6_M 0.63
+#define RED2BLUE_2_OF_6_Y 1.00
+#define RED2BLUE_2_OF_6_K 0.00
+
+/* gold-ish */
+#define RED2BLUE_3_OF_6_C 0.00
+#define RED2BLUE_3_OF_6_M 0.21
+#define RED2BLUE_3_OF_6_Y 1.00
+#define RED2BLUE_3_OF_6_K 0.00
+
+/* light-green-ish */
+#define RED2BLUE_4_OF_6_C 0.42
+#define RED2BLUE_4_OF_6_M 0.00
+#define RED2BLUE_4_OF_6_Y 1.00
+#define RED2BLUE_4_OF_6_K 0.00
+
+/* teal-ish */
+#define RED2BLUE_5_OF_6_C 0.50
+#define RED2BLUE_5_OF_6_M 0.00
+#define RED2BLUE_5_OF_6_Y 0.00
+#define RED2BLUE_5_OF_6_K 0.50
+
+/* blue */
+#define RED2BLUE_6_OF_6_C 0.92
+#define RED2BLUE_6_OF_6_M 0.84
+#define RED2BLUE_6_OF_6_Y 0.00
+#define RED2BLUE_6_OF_6_K 0.08
+
+
+/* single colors for one-cell legends */
+#define NOC 17
+#define CYANOC 0
+#define MAGENTAOC 1
+#define YELLOWOC 2
+#define BLACKOC 3
+#define WHITEOC 4
+#define LIGHTGREYOC 5
+#define GREYOC 6
+#define DARKGREYOC 7
+#define REDOC 8
+#define ORANGEOC 9
+#define TEALOC 10
+#define LIGHTGREENOC 11
+#define GREENOC 12
+#define DARKGREENOC 13
+#define LIGHTPURPLEOC 14
+#define PURPLEOC 15
+#define DARKPURPLEOC 16
+
+/* the actual CMYK color values for the single colors (_C = cyan, _M = magenta, _Y = yellow, _K = black) */
+#define CYAN_C 1.0
+#define CYAN_M 0.0
+#define CYAN_Y 0.0
+#define CYAN_K 0.0
+
+#define MAGENTA_C 0.0
+#define MAGENTA_M 1.0
+#define MAGENTA_Y 0.0
+#define MAGENTA_K 0.0
+
+#define YELLOW_C 0.0
+#define YELLOW_M 0.0
+#define YELLOW_Y 1.0
+#define YELLOW_K 0.0
+
+#define BLACK_C 0.0
+#define BLACK_M 0.0
+#define BLACK_Y 0.0
+#define BLACK_K 1.0
+
+#define WHITE_C 0.0
+#define WHITE_M 0.0
+#define WHITE_Y 0.0
+#define WHITE_K 0.0
+
+#define LIGHTGREY_C 0.0
+#define LIGHTGREY_M 0.0
+#define LIGHTGREY_Y 0.0
+#define LIGHTGREY_K 0.2
+
+#define GREY_C 0.0
+#define GREY_M 0.0
+#define GREY_Y 0.0
+#define GREY_K 0.5
+
+#define DARKGREY_C 0.0
+#define DARKGREY_M 0.0
+#define DARKGREY_Y 0.0
+#define DARKGREY_K 0.75
+
+#define RED_C 0.0
+#define RED_M 1.0
+#define RED_Y 1.0
+#define RED_K 0.0
+
+#define ORANGE_C 0.0
+#define ORANGE_M 0.5
+#define ORANGE_Y 1.0
+#define ORANGE_K 0.0
+
+#define TEAL_C 0.5
+#define TEAL_M 0.0
+#define TEAL_Y 0.0
+#define TEAL_K 0.5
+
+#define LIGHTGREEN_C 0.5
+#define LIGHTGREEN_M 0.0
+#define LIGHTGREEN_Y 0.5
+#define LIGHTGREEN_K 0.0
+
+#define GREEN_C 1.0
+#define GREEN_M 0.0
+#define GREEN_Y 1.0
+#define GREEN_K 0.0
+
+#define DARKGREEN_C 1.0
+#define DARKGREEN_M 0.5
+#define DARKGREEN_Y 1.0
+#define DARKGREEN_K 0.0
+
+#define LIGHTPURPLE_C 0.3
+#define LIGHTPURPLE_M 0.6
+#define LIGHTPURPLE_Y 0.0
+#define LIGHTPURPLE_K 0.0
+
+#define PURPLE_C 0.5
+#define PURPLE_M 1.0
+#define PURPLE_Y 0.0
+#define PURPLE_K 0.0
+
+#define DARKPURPLE_C 1.0
+#define DARKPURPLE_M 1.0
+#define DARKPURPLE_Y 0.0
+#define DARKPURPLE_K 0.0
+
+/* hard-coded values for the legends */
+#define LEG_NBOXES 11
+#define LEG_MINFONTSIZE 10
+#define SPECIAL_FONT "Courier-BoldOblique"
+#define LEG_FONT "Courier-Bold"
+#define LEG_EXTRA_COLUMNS 12 /* how many extra columns we need for printing stats in the legend */
+#define COURIER_HEIGHT_WIDTH_RATIO 1.65
+#define LEG_EXTRA_TEXT_FONT "Helvetica"
+
+/* fonts and other sizes */
+#define DEFAULT_FONT "Courier-Bold"
+#define FOOTER_FONT "Helvetica"
+#define NUCLEOTIDES_FONT "Courier-Bold" /* NOTE: THIS MUST BE Courier-Bold or Courier, the offsets for drawing cells (CELL_{X,Y}OFFSET_FRACTION)
+ * and placing nucleotides (NUCLEOTIDE_{X,Y}OFFSET_FRACTION_LOWERCASE_GJPQY) depend on it */
+/*#define NUCLEOTIDES_FONT "Monaco-Bold"*/
+#define POSNTEXT_FONT "Helvetica"
+#define NUCLEOTIDES_FONTSIZE 8.
+#define POSNTEXT_FONTSIZE 8.
+#define LEG_FONTSIZE_UNSCALED 8
+#define LEG_EXTRA_TEXT_FONTSIZE_UNSCALED 8
+#define HEADER_FONTSIZE_UNSCALED 12
+#define HEADER_MODELNAME_MAXCHARS 20
+#define TICKS_LINEWIDTH 2.
+#define BP_LINEWIDTH 1.
+#define CELLSIZE 8. /* default size of a cell, a single position in the structure diagram */
+#define CELLSIZE_INT 8 /* default size of a cell, a single position in the structure diagram */
+/* NOTE, *OFFSET_FRACTION* constants below depend on NUCLEOTIDES_FONT being either "Courier-Bold" or "Courier" */
+#define CELL_XOFFSET_FRACTION 0.2
+#define CELL_YOFFSET_FRACTION 0.2
+#define LOWERCASE_LOW_HANGING_CHARS "gjpqy"
+#define NUCLEOTIDE_YOFFSET_FRACTION_LOWERCASE_LOW_HANGING_CHARS 0.1875
+
+/* postscript info */
+#define POSTSCRIPT_PAGEWIDTH 612.
+#define POSTSCRIPT_PAGEHEIGHT 792.
+#define PAGE_TOPBUF 30. /* 30 blank pts required at top */
+#define PAGE_SIDEBUF 32. /* 32 blank pts required at sides */
+#define PAGE_BOTBUF 30. /* 30 blank pts required at bot */
+
+/* cell outline info */
+#define OUTLINE_LINEWIDTH_CELL_FRACTION_MIN 0.04
+#define OUTLINE_LINEWIDTH_CELL_FRACTION_MAX 0.16
+#define NOUTLINETYPES 2
+#define OUTLINE_NONE_IDX 0
+#define OUTLINE_MIN_IDX 1
+#define OUTLINE_MAX_IDX 2
+#define OUTLINE_PROCEDURE "box"
+
+/* one cell color legends, special values */
+#define OCCL_BLANK_COUNT -1
+
+/* Structure: scheme_color_legend
+ * Incept: EPN, Thu Jun 25 20:20:38 2009
+ *
+ * Parameters describing a one-dimensional legend of colors
+ * from a preset scheme for use in a SSPostscript_t data structure.
+ */
+typedef struct scheme_color_legend_s {
+ int scheme; /* preset color scheme index */
+ int nbins; /* number of colors (bins) in this scheme */
+ char *text1; /* first line of text for legend, a single string */
+ char *text2; /* second line of text for legend, a single string */
+ float *limits; /* [nbins+1] limits for each bin, limits[0] is min value we would expect to see, limits[nbins] is max */
+ int *counts; /* [nbins] number of cells we've painted each color */
+ int *counts_masked; /* [nbins] number of cells within mask ('1's) that we've painted each color */
+ int ints_only_flag; /* TRUE if possible values are only integers, legend values will be drawn differently in this case */
+ int low_inclusive; /* TRUE if bin 0 is inclusive of limits[0], FALSE if not */
+ int high_inclusive; /* TRUE if bin[nbins-1] is inclusive of max value, FALSE if not */
+ int use_mask; /* TRUE to use ps->mask if it is available to draw masked positions differently, FALSE not to */
+} SchemeColorLegend_t;
+
+/* Structure: onecell_color_legend
+ * Incept: EPN, Tue Sep 30 13:06:15 2008
+ *
+ * Parameters describing a single colored cell legend for a
+ * SSPostscript_t data structure.
+ */
+typedef struct onecell_color_legend_s {
+ float col[NCMYK]; /* [CMYK] color value for the cell */
+ char *text; /* description text for legend */
+ char *celltext; /* colored text to use instead of a block, if NULL a colored block will be used */
+ char *procname; /* name of a procedure for drawing the block, if NULL a colored block will be used */
+ /* NOTE only one of celltext or procname can be non-NULL */
+ float *procstack; /* array of <nprocstack> stack elements for the procedure */
+ int nprocstack; /* num els in <procstack> */
+ int nres; /* number of nucleotides colored by the color in col[NCMYK] */
+ int nres_masked; /* number of nucleotides within a mask colored by the color in col[NCMYK] */
+ int do_separator; /* TRUE to draw a separator line below this one cell color legend, FALSE not to */
+ int do_no_vspace; /* when printing one cell, legend, don't add any vertical space after it, usually this is FALSE */
+} OneCellColorLegend_t;
+
+/* Structure: text_legend
+ * Incept: EPN, Mon Apr 19 07:11:44 2010
+ *
+ * Parameters describing a text section of a legend for a
+ * SSPostscript_t data structure.
+ */
+typedef struct text_legend_s {
+ char **text_per_line; /* description text for legend */
+ int nlines; /* colored text to use instead of a block, if NULL a colored block will be used */
+ int do_separator; /* TRUE to draw a separator line below this text section, FALSE not to */
+} TextLegend_t;
+
+/* Structure: ss_postscript
+ * Incept: EPN, Mon Jun 23 15:50:30 2008
+ *
+ * A clumsy data structure for storing the information that will
+ * become a postscript secondary structure diagram based on a
+ * template created by Robin Gutell and colleagues.
+ *
+ */
+typedef struct ss_postscript_s {
+ int npage; /* number of pages in eventual postscript */
+ char *modelname; /* name of model, read from template file */
+ int *modeA; /* [0..npage-1] page mode, ALIMODE, INDIMODE, or SIMPLEMASKMODE */
+ char **descA; /* [0..npage-1] description for each page */
+ int desc_max_chars; /* max num characters for a page description */
+ float headerx; /* x coordinate (bottom left corner) of header area */
+ float headery; /* y coordinate (bottom left corner) of header area */
+ float headerx_charsize;/* size of a character in x-dimension in the header */
+ float headery_charsize;/* size of a character in y-dimension in the header */
+ float headerx_desc; /* x coordinate (bottom left corner) of header area */
+ int leg_posn; /* consensus position for placing legend, read from template */
+ int leg_cellsize; /* size of a cell in the legend, (ex. 24 for SSU models) */
+ float leg_rhs_space;/* extra space to leave to the right of the legend */
+ float legx_offset; /* offset in x coordinate for placing legend, legx will be ps->rxA[leg_posn-1] + legx_offset */
+ float legy_offset; /* offset in y coordinate for placing legend, legy will be ps->ryA[leg_posn-1] + legy_offset */
+ float legx; /* x coordinate (top left corner) of legend area */
+ float legy; /* y coordinate (top left corner) of legend area */
+ float cur_legy; /* y coordinate of current line in legend */
+ float legx_charsize;/* size of a character in x-dimension in the legend */
+ float legy_charsize;/* size of a character in y-dimension in the legend */
+ int legx_max_chars; /* max num nucleotides in x direction we can print in legend before running off page */
+ int legy_max_chars; /* max num nucleotides in y direction we can print in legend before running off page */
+ int legx_stats; /* x position for printing stats in the legend */
+ float pagex_max; /* max x position on page */
+ float pagey_max; /* max y position on page */
+ float scale; /* scale parameter, read from template file */
+ char **regurgA; /* [0..nregurg-1][] lines from the template file to regurgitate, these are unchanged. */
+ int nregurg; /* number of lines (char *'s) in the regurg_textAA 2D array */
+ char **posntextA; /* [0..i..nposntext-1] string for element i of position text, read from template */
+ float *posntextxA; /* [0..i..nposntext-1] x value for posntextA[i] */
+ float *posntextyA; /* [0..i..nposntext-1] y value for posntextA[i] */
+ int nposntext; /* number of elements in posntextx and posntexty */
+ float *ticksx1A; /* [0..nticks-1] x begin value for ticks */
+ float *ticksx2A; /* [0..nticks-1] x end value for ticks */
+ float *ticksy1A; /* [0..nticks-1] y begin value for ticks */
+ float *ticksy2A; /* [0..nticks-1] x end value for ticks */
+ int nticks; /* number of ticks */
+ float *bpx1A; /* [0..nbp-1] x begin value for bp connect line */
+ float *bpx2A; /* [0..nbp-1] x end value for bp connect line */
+ float *bpy1A; /* [0..nbp-1] y begin value for bp connect line */
+ float *bpy2A; /* [0..nbp-1] x end value for bp connect line */
+ int nbp; /* number of bp */
+ float *rxA; /* [0..rflen-1] x coordinate for each nucleotide in the eventual postscript */
+ float *ryA; /* [0..rflen-1] y coordinate for each nucleotide in the eventual postscript */
+ int rflen; /* the number of nucleotides in the template file */
+ char **rAA; /* [0..npage-1][0..rflen-1] nucleotide character in the eventual postscript */
+ float ***rcolAAA; /* [0..npage-1][0..rflen-1][0..3] color for nucleotide on page p, position c, CMYK in the eventual postscript */
+ float ***bcolAAA; /* [0..npage-1][0..rflen-1][0..3] color for block on page p, position c, CMYK in the eventual postscript */
+ char **otypeAA; /* [0..npage-1][0..rflen-1] outline type on page p, position c in the eventual postscript
+ * '0' '1' or '2', OUTLINE_MIN_IDX, OUTLINE_MID_IDX, OUTLINE_MAX_IDX, respectively */
+ OneCellColorLegend_t ***occlAAA;/* [0..npage-1][0..l..nocclA[p]] ptr to one cell color legend l for page p */
+ int *nocclA; /* [0..npage-1] number of one cell color legends for each page */
+ SchemeColorLegend_t **sclAA;/* [0..npage-1] ptr to scheme color legend l for page p, NULL if none */
+ TextLegend_t ***tlAAA;/* [0..npage-1][0..l..ntlA[p]] ptr to text legend l for page p */
+ int *ntlA; /* [0..npage-1] number of text legends for page p, NULL if none */
+ char *mask; /* mask for this postscript, columns which are '0' get drawn differently */
+ int nalloc; /* number of elements to add to arrays when reallocating */
+ int msa_nseq; /* number of sequences in the msa, impt b/c msa->nseq will be 0 if --small */
+ char *msa_cseq_maj;/* [0..rfpos..ps->rflen-1]: consensus sequence for the msa, determined using majority rule */
+ char *msa_cseq_amb;/* [0..rfpos..ps->rflen-1]: different consensus sequence for the msa, least ambiguous
+ * nt per nongap RF position that represents >= esl_opt_GetReal(go, --athresh) fraction of
+ * nongap nucleotides at position rfpos */
+ int *msa_ct; /* [1..ps->rflen] CT array for msa this postscript corresponds to,
+ * msa_ct[i] is the position that consensus nucleotide i base pairs to, or 0 if i is unpaired. */
+ int msa_nbp; /* number of bps read from current MSA (in msa_ct), should equal nbp, but only if bps read from template file */
+ int *msa_rf2a_map;/* [0..ps->rflen-1] = apos, apos is the alignment position (0..msa->alen-1) that is non-gap RF position rfpos (for rfpos in 0..rflen-1) */
+ int *msa_a2rf_map;/* [0..ps->msa->alen-1] = rfpos, rfpos is the non-gap RF position (0..ps->rflen) that is alignment position apos (for apos in 0..ps->msa_alen-1) */
+ int *uaseqlenA; /* [0..ps->msa->nseq-1] unaligned sequence length for all sequences in the MSA, only computed if --indi */
+ int *seqidxA; /* [0..ps->npage-1] the sequence index in the MSA each page corresponds to, only valid if --indi */
+ ESL_MSA *msa; /* pointer to MSA this object corresponds to */
+ const ESL_ALPHABET *abc; /* ptr to alphabet used to decipher gap chars (msa itself is text mode) */
+} SSPostscript_t;
+
+static SSPostscript_t *create_sspostscript(const ESL_GETOPTS *go);
+static int setup_sspostscript(SSPostscript_t *ps, char *errbuf);
+static OneCellColorLegend_t *create_onecell_colorlegend(float *cmykA, int nres, int nres_masked, int do_separator, int do_no_vspace);
+static SchemeColorLegend_t *create_scheme_colorlegend(int scheme, int ncols, float *limits, int ints_only_flag, int low_inclusive, int high_inclusive, int use_mask);
+static TextLegend_t *create_text_legend(int nlines, char **text_per_line, int do_separator);
+static TextLegend_t *create_text_legend_for_consensus_sequence(const ESL_GETOPTS *go, int do_separator);
+static int add_text_to_scheme_colorlegend(SSPostscript_t *ps, SchemeColorLegend_t *scl, char *text, int legx_max_chars, char *errbuf);
+static int add_text_to_onecell_colorlegend(SSPostscript_t *ps, OneCellColorLegend_t *occl, char *text, int legx_max_chars, char *errbuf);
+static int add_celltext_to_onecell_colorlegend(SSPostscript_t *ps, OneCellColorLegend_t *occl, char *celltext, char *errbuf);
+static int add_procedure_to_onecell_colorlegend(SSPostscript_t *ps, OneCellColorLegend_t *occl, char *procname, float *procstack, int nprocstack, char *errbuf);
+static int add_page_desc_to_sspostscript(SSPostscript_t *ps, int page, char *text, char *errbuf);
+static int add_diffmask_page_desc_to_sspostscript(SSPostscript_t *ps, int page, char *mask_file, char *maskdiff_file, char *errbuf);
+static int draw_sspostscript(FILE *fp, const ESL_GETOPTS *go, char *errbuf, char *command, char *date, float ***hc_scheme, SSPostscript_t *ps);
+static int draw_legend_column_headers(FILE *fp, SSPostscript_t *ps, int pagenum, char *errbuf);
+static int draw_onecell_colorlegend(FILE *fp, OneCellColorLegend_t *occl, SSPostscript_t *ps, int occl_idx, int pagenum);
+static int draw_scheme_colorlegend(const ESL_GETOPTS *go, FILE *fp, SchemeColorLegend_t *scl, float **hc_scheme, SSPostscript_t *ps, int pagenum);
+static void free_sspostscript(SSPostscript_t *ps);
+static int add_pages_sspostscript(SSPostscript_t *ps, int ntoadd, int page_mode);
+static int parse_template_file(char *filename, const ESL_GETOPTS *go, char *errbuf, int msa_rflen, SSPostscript_t **ret_ps);
+static int parse_template_page(ESL_FILEPARSER *efp, const ESL_GETOPTS *go, char *errbuf, SSPostscript_t **ret_ps);
+static int parse_modelname_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps);
+static int parse_legend_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps);
+static int parse_scale_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps);
+static int parse_ignore_section(ESL_FILEPARSER *efp, char *errbuf, int *ret_read_showpage);
+static int parse_regurgitate_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps);
+static int parse_text_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps);
+static int parse_lines_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps);
+static int validate_justread_sspostscript(SSPostscript_t *ps, char *errbuf);
+static int validate_and_update_sspostscript_given_msa(const ESL_GETOPTS *go, const ESL_ALPHABET *abc, SSPostscript_t *ps, ESL_MSA *msa, int msa_nseq, char *errbuf);
+static int read_mask_file(char *filename, char *errbuf, char **ret_mask, int *ret_masklen, int *ret_mask_has_internal_zeroes);
+static void PairCount(const ESL_ALPHABET *abc, double *counters, ESL_DSQ syml, ESL_DSQ symr, double wt);
+static int get_command(const ESL_GETOPTS *go, char *errbuf, char **ret_command);
+static int get_date(char *errbuf, char **ret_date);
+static int set_scheme_values(char *errbuf, float *vec, int ncolvals, float **scheme, float val, SchemeColorLegend_t *scl, int within_mask, int *ret_bi);
+static int set_onecell_values(char *errbuf, float *vec, int ncolvals, float *onecolor);
+static int add_mask_to_ss_postscript(SSPostscript_t *ps, char *mask);
+static int draw_masked_block(FILE *fp, float x, float y, float *colvec, int do_circle_mask, int do_square_mask, int do_x_mask, int do_border, float cellsize);
+static int draw_header_and_footer(FILE *fp, const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, int page, int pageidx2print);
+static void get_insert_info_from_msa(const ESL_ALPHABET *abc, ESL_MSA *msa, int rflen, int **ret_nseq_with_ins_ct, int **ret_nins_ct, int ***ret_per_seq_ins_ct);
+static void get_insert_info_from_abc_ct(double **abc_ct, ESL_ALPHABET *abc, char *msa_rf, int64_t msa_alen, int rflen, int **ret_nseq_with_ins_ct, int **ret_nins_ct);
+static void get_insert_info_from_ifile(char *ifile, int rflen, int msa_nseq, ESL_KEYHASH *useme_keyhash, int **ret_nseq_with_ins_ct, int **ret_nins_ct, int ***ret_per_seq_ins_ct, int **ret_soff_ct, int **ret_eoff_ct);
+static int count_msa(const ESL_ALPHABET *abc, ESL_MSA *msa, char *errbuf, double ***ret_abc_ct, double ****ret_bp_ct, double ***ret_pp_ct, int **ret_spos_ct, int **ret_epos_ct);
+static int get_consensus_seqs_from_abc_ct(const ESL_GETOPTS *go,SSPostscript_t *ps, char *errbuf, double **abc_ct, ESL_ALPHABET *abc, int64_t msa_alen);
+static int infocontent_sspostscript(const ESL_GETOPTS *go, ESL_ALPHABET *abc, char *errbuf, SSPostscript_t *ps, double **abc_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int hc_onecell_idx, FILE *tabfp);
+static int mutual_information_sspostscript(const ESL_GETOPTS *go, ESL_ALPHABET *abc, char *errbuf, SSPostscript_t *ps, double ***bp_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int ss_idx, int zerores_idx, FILE *tabfp);
+static int delete_sspostscript(const ESL_GETOPTS *go, ESL_ALPHABET *abc, char *errbuf, SSPostscript_t *ps, double **abc_ct, int *span_ct, int msa_nseq, int do_all, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int hc_zerodel_idx, int hc_fewdel_idx, FILE *tabfp);
+static int avg_posteriors_sspostscript(const ESL_GETOPTS *go, ESL_ALPHABET *abc, char *errbuf, SSPostscript_t *ps, double **pp_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int hc_onecell_idx, FILE *tabfp);
+static int insertfreq_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, int *nseq_with_ins_ct, int *span_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int hc_zeroins_idx, int hc_fewins_idx, FILE *tabfp);
+static int insertavglen_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, int *nseq_with_ins_ct, int *nins_ct, int *span_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int hc_zeroins_idx, FILE *tabfp);
+static int span_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, int *span_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int zercov_idx, int maxcov_idx, FILE *tabfp);
+static int individuals_sspostscript(const ESL_GETOPTS *go, ESL_ALPHABET *abc, char *errbuf, SSPostscript_t *ps, double **abc_ct, ESL_MSA *msa, int **per_seq_ins_ct, int do_prob, int do_rescol, float ***hc_scheme, int hc_scheme_idx_s, int hc_scheme_idx_p, int hc_nbins_s, int hc_nbins_p, float **hc_onecell, int extdel_idx_s, int wcbp_idx_s, int gubp_idx_s, int ncbp_idx_s, int dgbp_idx_s, int hgbp_idx_s, int gap_idx_p, FILE *tabfp);
+static int cons_seq_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, float **hc_onecell, int wcbp_idx_s, int gubp_idx_s, int ncbp_idx_s, int dgbp_idx_s, int hgbp_idx_s);
+static int rf_seq_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, ESL_MSA *msa, int do_rescol, float **hc_onecell, int wcbp_idx_s, int gubp_idx_s, int ncbp_idx_s);
+static int colormask_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, ESL_MSA *msa, float **hc_onecell, int incmask_idx, int excmask_idx);
+static int diffmask_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, ESL_MSA *msa, char *mask2, float **hc_onecell, int incboth_idx, int inc1_idx, int inc2_idx, int excboth_idx);
+static int drawfile2sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, float ***hc_scheme, int hc_scheme_idx, int hc_nbins);
+static int expertfile2sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps);
+static int get_pp_idx(const ESL_ALPHABET *abc, char ppchar);
+static int get_span_ct(int *msa_rf2a_map, int64_t alen, int rflen, int nseq, int *spos_ct, int *epos_ct, int *srfoff_ct, int *erfoff_ct, int **ret_span_ct);
+static int is_watson_crick_bp(char i, char j);
+static int is_gu_or_ug_bp(char i, char j);
+static int compare_two_cmyk_colors(float acol_C, float acol_M, float acol_Y, float acol_K, float bcol_C, float bcol_M, float bcol_Y, float bcol_K);
+static void define_outline_procedure(FILE *fp);
+
+static char banner[] = "draw postscript secondary structure diagrams";
+static char usage[] = "[options] <msafile> <SS postscript template> <output postscript file name>\n\
+The <msafile> must be in Stockholm format.";
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range togs reqs incomp help docgroup */
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "help; show brief info on version and usage", 1 },
+ { "-d", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw default set of alignment summary diagrams", 1 },
+ { "--mask", eslARG_INFILE, NULL, NULL, NULL, NULL,NULL, NULL, "for all diagrams, mark masked ('0') columns from mask in <f>", 1 },
+ { "--small", eslARG_NONE, NULL, NULL, NULL, NULL,NULL, NULL, "operate in small memory mode (aln must be 1 line/seq Pfam format)", 1 },
+
+ { "--cons", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw diagram showing the alignment's consensus sequence", 2 },
+ { "--info", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw information content diagram", 2 },
+ { "--mutinfo",eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw base pair mutual information diagram", 2 },
+ { "--ifreq", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw insert frequency diagram", 2 },
+ { "--iavglen",eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw average insert length diagram", 2 },
+ { "--dall", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw delete diagram w/all deletions (incl. terminal deletes)", 2 },
+ { "--prob", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw average posterior probability diagram", 2 },
+ { "--span", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw diagram showing fraction of seqs that span each posn", 2 },
+ { "--rf", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw diagram showing reference (#=GC RF) sequence", 2 },
+ { "--dint", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "draw delete diagram w/only internal (non-terminal) deletions", 2 },
+ { "--tabfile",eslARG_OUTFILE,NULL, NULL, NULL, NULL,NULL, NULL, "output per position data in tabular format to file <f>", 2 },
+
+ { "--indi", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, "--small", "draw diagrams for individual sequences in the alignment", 3 },
+ { "-f", eslARG_NONE, FALSE, NULL, NULL, NULL,"--indi", NULL, "force; w/--indi draw all seqs, even if predicted output >100 Mb", 3 },
+
+ { "--no-pp", eslARG_NONE, FALSE, NULL, NULL, NULL,"--indi", NULL, "with --indi, do not draw indi posterior probability diagrams", 9 },
+ { "--no-bp", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "do not color nucleotides based on basepair type", 9 },
+ { "--no-ol", eslARG_NONE, FALSE, NULL, NULL, NULL,"--indi", NULL, "w/--indi, do not outline nts that are not most common nt", 9 },
+ { "--no-ntpp", eslARG_NONE, FALSE, NULL, NULL, NULL,"--indi", "--no-pp", "w/--indi, do not draw nts on individual post prob diagrams", 9 },
+
+ { "--no-cnt", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "do not draw consensus nts on alignment summary diagrams", 7 },
+ { "--cthresh",eslARG_REAL, "0.75", NULL,"0<x<=1.0", NULL,NULL, "--no-cnt", "capitalize cons nts occuring in >= <x> fraction of seqs", 7 },
+ { "--cambig", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, "--no-cnt", "allow ambiguous nts in consensus sequence", 7 },
+ { "--athresh",eslARG_REAL, "0.9", NULL,"0<x<=1.0", NULL,"--cambig",NULL, "w/--cambig, cons nt must represent >= <x> fraction of seqs", 7 },
+
+ { "--mask-u", eslARG_NONE, FALSE, NULL, NULL, NULL,"--mask", "--mask-x","with --mask, mark masked columns as squares", 4 },
+ { "--mask-x", eslARG_NONE, FALSE, NULL, NULL, NULL,"--mask", "--mask-u","with --mask, mark masked columns as x's", 4 },
+ { "--mask-a", eslARG_NONE, FALSE, NULL, NULL, NULL,"--mask", NULL, "with --mask-u or --mask-x, draw alternative mask style", 4 },
+
+ { "--mask-col", eslARG_NONE, NULL,NULL, NULL, NULL,"--mask", NULL, "w/--mask draw two color diagram denoting masked columns", 5 },
+ { "--mask-diff",eslARG_INFILE,NULL,NULL, NULL, NULL,"--mask", NULL, "with --mask <f1>, compare mask in <f1> to mask in <f>", 5 },
+
+ { "--dfile", eslARG_INFILE, NULL,NULL, NULL, NULL,NULL, NULL, "read 'draw file' specifying >=1 diagrams", 6 },
+ { "--efile", eslARG_INFILE, NULL,NULL, NULL, NULL,NULL, NULL, "read 'expert draw file' specifying >=1 diagrams", 6 },
+ { "--ifile", eslARG_INFILE, NULL,NULL, NULL, NULL,NULL, NULL, "read insert information from cmalign insert file <f>", 6 },
+
+ { "--no-leg", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "do not draw legend", 8 },
+ { "--no-head",eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "do not draw header", 8 },
+ { "--no-foot",eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "do not draw footer", 8 },
+ { 0,0,0,0,0,0,0,0,0,0 },
+};
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL; /* application configuration */
+ ESL_ALPHABET *abc = NULL; /* biological alphabet */
+ char *alifile = NULL; /* alignment file name */
+ char *outfile = NULL; /* output ps file name */
+ char *templatefile = NULL; /* template file, specifying >= 1 SS diagrams
+ * (each must have a unique consensus length) */
+ int fmt; /* format code for alifile */
+ ESL_MSAFILE *afp = NULL; /* open alignment file, normal interface */
+ ESL_MSAFILE2 *afp2 = NULL; /* open alignment file, legacy small-memory interface */
+ ESL_MSA *msa = NULL; /* one multiple sequence alignment */
+ int status; /* easel return code */
+ int rflen; /* non-gap RF (consensus) length of each alignment */
+ int apos; /* counter over alignment positions */
+ char errbuf[ERRBUFSIZE]; /* for printing error messages */
+ FILE *ofp = NULL; /* output file for postscript */
+ FILE *tabfp = NULL; /* output file for text data, only set to non-null if --tabfile enabled */
+ SSPostscript_t *ps = NULL; /* the postscript data structure we create */
+ int *hc_nbins = NULL; /* hard-coded number of bins (colors) for each possible scheme */
+ float ***hc_scheme = NULL; /* colors for each pre-defined scheme */
+ float **hc_onecell = NULL; /* single colors used for binary color schemes */
+ int z; /* counter */
+ char *command = NULL; /* string for printing command to stdout */
+ char *date = NULL; /* date command was executed */
+ char *mask = NULL; /* first mask we'll use, string of '0's and '1's */
+ int masklen; /* length of mask */
+ char *mask2 = NULL; /* second mask we'll use, string of '0's and '1's */
+ int mask2len; /* length of second mask */
+ int mask_has_internal_zeroes = FALSE; /* does mask have any '0's with at least '1' on both sides? */
+ int mask2_has_internal_zeroes = FALSE; /* does mask have any '0's with at least '1' on both sides? */
+ /* counts of relevant values from the msa */
+ int *nseq_with_ins_ct = NULL; /* [0..ps->rflen] number of sequences with >=1 insert after each consensus position, only used if --ifreq */
+ int *nins_ct = NULL; /* [0..ps->rflen] total number of inserted nucleotides (over all seqs) after each consensus position, only used if --ifreq */
+ int **per_seq_ins_ct = NULL; /* [0..msa->nseq-1][0..ps->rflen] for each sequence, the number of inserts after each consensus position */
+ double **abc_ct = NULL; /* [0..msa->alen-1][0..abc->K], count of each nucleotide at each position, over all sequences, missing and nonnucleotides are *not counted* */
+ double ***bp_ct = NULL; /* [0..msa->alen-1][0..abc->Kp][0..abc->Kp], count of each possible base pair at each position, over all sequences, missing and nonnucleotides are *not counted*
+ base pairs are indexed by 'i' for a base pair between positions i and j, where i < j. */
+ double **pp_ct = NULL; /* [0..msa->alen-1][0..11], count of reach posterior probability (PP) code, over all sequences, gap is 11 */
+ int *spos_ct = NULL; /* [0..msa->alen-1] per position count of first non-gap position, over all seqs */
+ int *epos_ct = NULL; /* [0..msa->alen-1] per position count of final non-gap position, over all seqs */
+ int *srfoff_ct = NULL; /* [0..rfpos..rflen-1], correction for spos_ct for rfpos, derived from ifile, only used if msa has had all insert columns removed */
+ int *erfoff_ct = NULL; /* [0..rfpos..rflen-1], correction for epos_ct for rfpos, derived from ifile, only used if msa has had all insert columns removed */
+ int *span_ct = NULL; /* [0..rfpos..rflen-1], number of sequences that 'span' position rfpos */
+ int64_t msa_alen; /* msa->alen */
+ int msa_nseq; /* msa->nseq */
+ /* variables related to small memory mode */
+ int do_small = TRUE; /* TRUE to operate in small memory mode, FALSE not to */
+ /* variables storing which pages to print */
+ int do_default_set = TRUE; /* TRUE if no options telling specifying what pages to draw were selected */
+ int do_cons = FALSE;
+ int do_rf = FALSE;
+ int do_info = FALSE;
+ int do_mutinfo = FALSE;
+ int do_ifreq = FALSE;
+ int do_iavglen = FALSE;
+ int do_dall = FALSE;
+ int do_dint = FALSE;
+ int do_prob = FALSE;
+ int do_span = FALSE;
+ int do_indi = FALSE;
+ int do_maskcol = FALSE;
+ int do_maskdiff = FALSE;
+ int do_dfile = FALSE;
+ int do_efile = FALSE;
+ int need_span_ct = FALSE; /* TRUE if span_ct must be calculated (if do_dint || do_ifreq || do_iavglen || do_span) */
+ int tmp_Mb = 0;
+ int predicted_Mb = 0; /* predicted size of the output file, calced if --indi */
+ /***********************************************
+ * Parse command line
+ ***********************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts("\n where basic options are:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ puts("\noptions for alignment summary diagrams (incompatible with --indi):");
+ esl_opt_DisplayHelp(stdout, go, 2, 2, 80);
+ puts("\noptions for drawing individual sequences (require --indi):");
+ esl_opt_DisplayHelp(stdout, go, 3, 2, 80);
+ puts("\noptions for omitting parts of the diagram:");
+ esl_opt_DisplayHelp(stdout, go, 8, 2, 80);
+ puts("\noptions for drawing simple two color diagrams of masks:");
+ esl_opt_DisplayHelp(stdout, go, 5, 2, 80);
+ puts("\nexpert options for controlling individual seq diagrams (require --indi):");
+ esl_opt_DisplayHelp(stdout, go, 9, 2, 80);
+ puts("\nexpert options related to consensus sequence definition:");
+ esl_opt_DisplayHelp(stdout, go, 7, 2, 80);
+ puts("\nexpert options controlling style of masked positions:");
+ esl_opt_DisplayHelp(stdout, go, 4, 2, 80);
+ puts("\nexpert options related to input files:");
+ esl_opt_DisplayHelp(stdout, go, 6, 2, 80);
+ exit(0);
+ }
+
+ if (esl_opt_ArgNumber(go) != 3)
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ /* Check for incompatible options that aren't simple to check with esl_getopts */
+ /* --mask-a requires either --mask-x or --mask-u */
+ if (esl_opt_IsOn(go, "--mask-a") && (! esl_opt_IsOn(go, "--mask-u")) && (! esl_opt_IsOn(go, "--mask-x"))) {
+ esl_fatal("--mask-a requires either --mask-u or mask-x");
+ }
+
+ alifile = esl_opt_GetArg(go, 1);
+ templatefile = esl_opt_GetArg(go, 2);
+ outfile = esl_opt_GetArg(go, 3);
+
+ if((status = get_command(go, errbuf, &command)) != eslOK) esl_fatal(errbuf);
+ if((status = get_date(errbuf, &date)) != eslOK) esl_fatal(errbuf);
+
+ /****************/
+ /* Premlinaries */
+ /****************/
+ /* allocate and fill predefined one-cell colors, these are hardcoded */
+ ESL_ALLOC(hc_onecell, sizeof(float *) * NOC);
+ for(z = 0; z < NOC; z++) hc_onecell[z] = NULL;
+ for(z = 0; z < NOC; z++) { ESL_ALLOC(hc_onecell[z], sizeof(float) * NCMYK); }
+
+ hc_onecell[CYANOC][ICYAN] = CYAN_C;
+ hc_onecell[CYANOC][IMGTA] = CYAN_M;
+ hc_onecell[CYANOC][IYELW] = CYAN_Y;
+ hc_onecell[CYANOC][IBLCK] = CYAN_K;
+
+ hc_onecell[MAGENTAOC][ICYAN] = MAGENTA_C;
+ hc_onecell[MAGENTAOC][IMGTA] = MAGENTA_M;
+ hc_onecell[MAGENTAOC][IYELW] = MAGENTA_Y;
+ hc_onecell[MAGENTAOC][IBLCK] = MAGENTA_K;
+
+ hc_onecell[YELLOWOC][ICYAN] = YELLOW_C;
+ hc_onecell[YELLOWOC][IMGTA] = YELLOW_M;
+ hc_onecell[YELLOWOC][IYELW] = YELLOW_Y;
+ hc_onecell[YELLOWOC][IBLCK] = YELLOW_K;
+
+ hc_onecell[BLACKOC][ICYAN] = BLACK_C;
+ hc_onecell[BLACKOC][IMGTA] = BLACK_M;
+ hc_onecell[BLACKOC][IYELW] = BLACK_Y;
+ hc_onecell[BLACKOC][IBLCK] = BLACK_K;
+
+ hc_onecell[WHITEOC][ICYAN] = WHITE_C;
+ hc_onecell[WHITEOC][IMGTA] = WHITE_M;
+ hc_onecell[WHITEOC][IYELW] = WHITE_Y;
+ hc_onecell[WHITEOC][IBLCK] = WHITE_K;
+
+ hc_onecell[LIGHTGREYOC][ICYAN] = LIGHTGREY_C;
+ hc_onecell[LIGHTGREYOC][IMGTA] = LIGHTGREY_M;
+ hc_onecell[LIGHTGREYOC][IYELW] = LIGHTGREY_Y;
+ hc_onecell[LIGHTGREYOC][IBLCK] = LIGHTGREY_K;
+
+ hc_onecell[GREYOC][ICYAN] = GREY_C;
+ hc_onecell[GREYOC][IMGTA] = GREY_M;
+ hc_onecell[GREYOC][IYELW] = GREY_Y;
+ hc_onecell[GREYOC][IBLCK] = GREY_K;
+
+ hc_onecell[DARKGREYOC][ICYAN] = DARKGREY_C;
+ hc_onecell[DARKGREYOC][IMGTA] = DARKGREY_M;
+ hc_onecell[DARKGREYOC][IYELW] = DARKGREY_Y;
+ hc_onecell[DARKGREYOC][IBLCK] = DARKGREY_K;
+
+ hc_onecell[REDOC][ICYAN] = RED_C;
+ hc_onecell[REDOC][IMGTA] = RED_M;
+ hc_onecell[REDOC][IYELW] = RED_Y;
+ hc_onecell[REDOC][IBLCK] = RED_K;
+
+ hc_onecell[ORANGEOC][ICYAN] = ORANGE_C;
+ hc_onecell[ORANGEOC][IMGTA] = ORANGE_M;
+ hc_onecell[ORANGEOC][IYELW] = ORANGE_Y;
+ hc_onecell[ORANGEOC][IBLCK] = ORANGE_K;
+
+ hc_onecell[TEALOC][ICYAN] = TEAL_C;
+ hc_onecell[TEALOC][IMGTA] = TEAL_M;
+ hc_onecell[TEALOC][IYELW] = TEAL_Y;
+ hc_onecell[TEALOC][IBLCK] = TEAL_K;
+
+ hc_onecell[LIGHTGREENOC][ICYAN] = LIGHTGREEN_C;
+ hc_onecell[LIGHTGREENOC][IMGTA] = LIGHTGREEN_M;
+ hc_onecell[LIGHTGREENOC][IYELW] = LIGHTGREEN_Y;
+ hc_onecell[LIGHTGREENOC][IBLCK] = LIGHTGREEN_K;
+
+ hc_onecell[GREENOC][ICYAN] = GREEN_C;
+ hc_onecell[GREENOC][IMGTA] = GREEN_M;
+ hc_onecell[GREENOC][IYELW] = GREEN_Y;
+ hc_onecell[GREENOC][IBLCK] = GREEN_K;
+
+ hc_onecell[DARKGREENOC][ICYAN] = DARKGREEN_C;
+ hc_onecell[DARKGREENOC][IMGTA] = DARKGREEN_M;
+ hc_onecell[DARKGREENOC][IYELW] = DARKGREEN_Y;
+ hc_onecell[DARKGREENOC][IBLCK] = DARKGREEN_K;
+
+ hc_onecell[LIGHTPURPLEOC][ICYAN] = LIGHTPURPLE_C;
+ hc_onecell[LIGHTPURPLEOC][IMGTA] = LIGHTPURPLE_M;
+ hc_onecell[LIGHTPURPLEOC][IYELW] = LIGHTPURPLE_Y;
+ hc_onecell[LIGHTPURPLEOC][IBLCK] = LIGHTPURPLE_K;
+
+ hc_onecell[PURPLEOC][ICYAN] = PURPLE_C;
+ hc_onecell[PURPLEOC][IMGTA] = PURPLE_M;
+ hc_onecell[PURPLEOC][IYELW] = PURPLE_Y;
+ hc_onecell[PURPLEOC][IBLCK] = PURPLE_K;
+
+ hc_onecell[DARKPURPLEOC][ICYAN] = DARKPURPLE_C;
+ hc_onecell[DARKPURPLEOC][IMGTA] = DARKPURPLE_M;
+ hc_onecell[DARKPURPLEOC][IYELW] = DARKPURPLE_Y;
+ hc_onecell[DARKPURPLEOC][IBLCK] = DARKPURPLE_K;
+
+ /***********************************/
+ /* allocate and fill predefined color schemes, these are hardcoded */
+ ESL_ALLOC(hc_scheme, sizeof(float **) * NSCHEMES);
+ for (z = 0; z < NSCHEMES; z++) hc_scheme[z] = NULL;
+
+ ESL_ALLOC(hc_nbins, sizeof(int) * NSCHEMES);
+ hc_nbins[RB_11_RH_SCHEME] = NRB_11_RH_SCHEME;
+ hc_nbins[RB_11_RL_SCHEME] = NRB_11_RL_SCHEME;
+ hc_nbins[RB_6_RH_SCHEME] = NRB_6_RH_SCHEME;
+ hc_nbins[RB_6_RL_SCHEME] = NRB_6_RL_SCHEME;
+ hc_nbins[RB_5_RH_SCHEME] = NRB_5_RH_SCHEME;
+ hc_nbins[RB_5_RL_SCHEME] = NRB_5_RL_SCHEME;
+ hc_nbins[RB_W5_OH_SCHEME] = NRB_W5_OH_SCHEME;
+
+ /* RB_11_RH_SCHEME RainBow, 11 colors, Red High, blue low */
+ ESL_ALLOC(hc_scheme[RB_11_RH_SCHEME], sizeof(float *) * NRB_11_RH_SCHEME);
+ for(z = 0; z < NRB_11_RH_SCHEME; z++) hc_scheme[RB_11_RH_SCHEME][z] = NULL;
+ for(z = 0; z < NRB_11_RH_SCHEME; z++) { ESL_ALLOC(hc_scheme[RB_11_RH_SCHEME][z], sizeof(float) * NCMYK); }
+
+ /* RB_11_RL_SCHEME RainBow, 11 colors, Red Low, blue high */
+ ESL_ALLOC(hc_scheme[RB_11_RL_SCHEME], sizeof(float *) * NRB_11_RL_SCHEME);
+ for(z = 0; z < NRB_11_RL_SCHEME; z++) hc_scheme[RB_11_RL_SCHEME][z] = NULL;
+ for(z = 0; z < NRB_11_RL_SCHEME; z++) { ESL_ALLOC(hc_scheme[RB_11_RL_SCHEME][z], sizeof(float) * NCMYK); }
+
+ /* RB_6_RH_SCHEME RainBow, 6 colors, Red High, blue low */
+ ESL_ALLOC(hc_scheme[RB_6_RH_SCHEME], sizeof(float *) * NRB_6_RH_SCHEME);
+ for(z = 0; z < NRB_6_RH_SCHEME; z++) hc_scheme[RB_6_RH_SCHEME][z] = NULL;
+ for(z = 0; z < NRB_6_RH_SCHEME; z++) { ESL_ALLOC(hc_scheme[RB_6_RH_SCHEME][z], sizeof(float) * NCMYK); }
+
+ /* RB_6_RL_SCHEME RainBow, 6 colors, Red Low, blue high */
+ ESL_ALLOC(hc_scheme[RB_6_RL_SCHEME], sizeof(float *) * NRB_6_RL_SCHEME);
+ for(z = 0; z < NRB_6_RL_SCHEME; z++) hc_scheme[RB_6_RL_SCHEME][z] = NULL;
+ for(z = 0; z < NRB_6_RL_SCHEME; z++) { ESL_ALLOC(hc_scheme[RB_6_RL_SCHEME][z], sizeof(float) * NCMYK); }
+
+ /* RB_5_RH_SCHEME RainBow, 5 colors, Red High, blue low */
+ ESL_ALLOC(hc_scheme[RB_5_RH_SCHEME], sizeof(float *) * NRB_5_RH_SCHEME);
+ for(z = 0; z < NRB_5_RH_SCHEME; z++) hc_scheme[RB_5_RH_SCHEME][z] = NULL;
+ for(z = 0; z < NRB_5_RH_SCHEME; z++) { ESL_ALLOC(hc_scheme[RB_5_RH_SCHEME][z], sizeof(float) * NCMYK); }
+
+ /* RB_5_RL_SCHEME RainBow, 5 colors, Red Low, blue high */
+ ESL_ALLOC(hc_scheme[RB_5_RL_SCHEME], sizeof(float *) * NRB_5_RL_SCHEME);
+ for(z = 0; z < NRB_5_RL_SCHEME; z++) hc_scheme[RB_5_RL_SCHEME][z] = NULL;
+ for(z = 0; z < NRB_5_RL_SCHEME; z++) { ESL_ALLOC(hc_scheme[RB_5_RL_SCHEME][z], sizeof(float) * NCMYK); }
+
+ /* RB_W5_OH_SCHEME RainBow with white, 5 colors, Orange High, teal low, white lowest */
+ ESL_ALLOC(hc_scheme[RB_W5_OH_SCHEME], sizeof(float *) * NRB_W5_OH_SCHEME);
+ for(z = 0; z < NRB_W5_OH_SCHEME; z++) hc_scheme[RB_W5_OH_SCHEME][z] = NULL;
+ for(z = 0; z < NRB_W5_OH_SCHEME; z++) { ESL_ALLOC(hc_scheme[RB_W5_OH_SCHEME][z], sizeof(float) * NCMYK); }
+
+ /***********************************/
+ /* fill scheme colors */
+
+ /* the 5 and 6 color rainbow schemes (the 5 color schemes are identical to the 6 color ones, they just omit blue */
+ hc_scheme[RB_6_RL_SCHEME][0][ICYAN] = hc_scheme[RB_6_RH_SCHEME][5][ICYAN] = hc_scheme[RB_5_RL_SCHEME][0][ICYAN] = hc_scheme[RB_5_RL_SCHEME][4][ICYAN] = RED2BLUE_1_OF_6_C;
+ hc_scheme[RB_6_RL_SCHEME][0][IMGTA] = hc_scheme[RB_6_RH_SCHEME][5][IMGTA] = hc_scheme[RB_5_RL_SCHEME][0][IMGTA] = hc_scheme[RB_5_RL_SCHEME][4][IMGTA] = RED2BLUE_1_OF_6_M;
+ hc_scheme[RB_6_RL_SCHEME][0][IYELW] = hc_scheme[RB_6_RH_SCHEME][5][IYELW] = hc_scheme[RB_5_RL_SCHEME][0][IYELW] = hc_scheme[RB_5_RL_SCHEME][4][IYELW] = RED2BLUE_1_OF_6_Y;
+ hc_scheme[RB_6_RL_SCHEME][0][IBLCK] = hc_scheme[RB_6_RH_SCHEME][5][IBLCK] = hc_scheme[RB_5_RL_SCHEME][0][IBLCK] = hc_scheme[RB_5_RL_SCHEME][4][IBLCK] = RED2BLUE_1_OF_6_K;
+
+ hc_scheme[RB_6_RL_SCHEME][1][ICYAN] = hc_scheme[RB_6_RH_SCHEME][4][ICYAN] = hc_scheme[RB_5_RL_SCHEME][1][ICYAN] = hc_scheme[RB_5_RL_SCHEME][3][ICYAN] = RED2BLUE_2_OF_6_C;
+ hc_scheme[RB_6_RL_SCHEME][1][IMGTA] = hc_scheme[RB_6_RH_SCHEME][4][IMGTA] = hc_scheme[RB_5_RL_SCHEME][1][IMGTA] = hc_scheme[RB_5_RL_SCHEME][3][IMGTA] = RED2BLUE_2_OF_6_M;
+ hc_scheme[RB_6_RL_SCHEME][1][IYELW] = hc_scheme[RB_6_RH_SCHEME][4][IYELW] = hc_scheme[RB_5_RL_SCHEME][1][IYELW] = hc_scheme[RB_5_RL_SCHEME][3][IYELW] = RED2BLUE_2_OF_6_Y;
+ hc_scheme[RB_6_RL_SCHEME][1][IBLCK] = hc_scheme[RB_6_RH_SCHEME][4][IBLCK] = hc_scheme[RB_5_RL_SCHEME][1][IBLCK] = hc_scheme[RB_5_RL_SCHEME][3][IBLCK] = RED2BLUE_2_OF_6_K;
+
+ hc_scheme[RB_6_RL_SCHEME][2][ICYAN] = hc_scheme[RB_6_RH_SCHEME][3][ICYAN] = hc_scheme[RB_5_RL_SCHEME][2][ICYAN] = RED2BLUE_3_OF_6_C;
+ hc_scheme[RB_6_RL_SCHEME][2][IMGTA] = hc_scheme[RB_6_RH_SCHEME][3][IMGTA] = hc_scheme[RB_5_RL_SCHEME][2][IMGTA] = RED2BLUE_3_OF_6_M;
+ hc_scheme[RB_6_RL_SCHEME][2][IYELW] = hc_scheme[RB_6_RH_SCHEME][3][IYELW] = hc_scheme[RB_5_RL_SCHEME][2][IYELW] = RED2BLUE_3_OF_6_Y;
+ hc_scheme[RB_6_RL_SCHEME][2][IBLCK] = hc_scheme[RB_6_RH_SCHEME][3][IBLCK] = hc_scheme[RB_5_RL_SCHEME][2][IBLCK] = RED2BLUE_3_OF_6_K;
+
+ hc_scheme[RB_6_RL_SCHEME][3][ICYAN] = hc_scheme[RB_6_RH_SCHEME][2][ICYAN] = hc_scheme[RB_5_RL_SCHEME][3][ICYAN] = hc_scheme[RB_5_RL_SCHEME][1][ICYAN] = RED2BLUE_4_OF_6_C;
+ hc_scheme[RB_6_RL_SCHEME][3][IMGTA] = hc_scheme[RB_6_RH_SCHEME][2][IMGTA] = hc_scheme[RB_5_RL_SCHEME][3][IMGTA] = hc_scheme[RB_5_RL_SCHEME][1][IMGTA] = RED2BLUE_4_OF_6_M;
+ hc_scheme[RB_6_RL_SCHEME][3][IYELW] = hc_scheme[RB_6_RH_SCHEME][2][IYELW] = hc_scheme[RB_5_RL_SCHEME][3][IYELW] = hc_scheme[RB_5_RL_SCHEME][1][IYELW] = RED2BLUE_4_OF_6_Y;
+ hc_scheme[RB_6_RL_SCHEME][3][IBLCK] = hc_scheme[RB_6_RH_SCHEME][2][IBLCK] = hc_scheme[RB_5_RL_SCHEME][3][IBLCK] = hc_scheme[RB_5_RL_SCHEME][1][IBLCK] = RED2BLUE_4_OF_6_K;
+
+ hc_scheme[RB_6_RL_SCHEME][4][ICYAN] = hc_scheme[RB_6_RH_SCHEME][1][ICYAN] = hc_scheme[RB_5_RL_SCHEME][4][ICYAN] = hc_scheme[RB_5_RL_SCHEME][0][ICYAN] = RED2BLUE_5_OF_6_C;
+ hc_scheme[RB_6_RL_SCHEME][4][IMGTA] = hc_scheme[RB_6_RH_SCHEME][1][IMGTA] = hc_scheme[RB_5_RL_SCHEME][4][IMGTA] = hc_scheme[RB_5_RL_SCHEME][0][IMGTA] = RED2BLUE_5_OF_6_M;
+ hc_scheme[RB_6_RL_SCHEME][4][IYELW] = hc_scheme[RB_6_RH_SCHEME][1][IYELW] = hc_scheme[RB_5_RL_SCHEME][4][IYELW] = hc_scheme[RB_5_RL_SCHEME][0][IYELW] = RED2BLUE_5_OF_6_Y;
+ hc_scheme[RB_6_RL_SCHEME][4][IBLCK] = hc_scheme[RB_6_RH_SCHEME][1][IBLCK] = hc_scheme[RB_5_RL_SCHEME][4][IBLCK] = hc_scheme[RB_5_RL_SCHEME][0][IBLCK] = RED2BLUE_5_OF_6_K;
+
+ hc_scheme[RB_6_RL_SCHEME][5][ICYAN] = hc_scheme[RB_6_RH_SCHEME][0][ICYAN] = RED2BLUE_6_OF_6_C;
+ hc_scheme[RB_6_RL_SCHEME][5][IMGTA] = hc_scheme[RB_6_RH_SCHEME][0][IMGTA] = RED2BLUE_6_OF_6_M;
+ hc_scheme[RB_6_RL_SCHEME][5][IYELW] = hc_scheme[RB_6_RH_SCHEME][0][IYELW] = RED2BLUE_6_OF_6_Y;
+ hc_scheme[RB_6_RL_SCHEME][5][IBLCK] = hc_scheme[RB_6_RH_SCHEME][0][IBLCK] = RED2BLUE_6_OF_6_K;
+
+ /* the special 4 color, plus white color scheme */
+ hc_scheme[RB_W5_OH_SCHEME][0][ICYAN] = WHITE_C;
+ hc_scheme[RB_W5_OH_SCHEME][0][IMGTA] = WHITE_M;
+ hc_scheme[RB_W5_OH_SCHEME][0][IYELW] = WHITE_Y;
+ hc_scheme[RB_W5_OH_SCHEME][0][IBLCK] = WHITE_K;
+
+ hc_scheme[RB_W5_OH_SCHEME][1][ICYAN] = RED2BLUE_5_OF_6_C;
+ hc_scheme[RB_W5_OH_SCHEME][1][IMGTA] = RED2BLUE_5_OF_6_M;
+ hc_scheme[RB_W5_OH_SCHEME][1][IYELW] = RED2BLUE_5_OF_6_Y;
+ hc_scheme[RB_W5_OH_SCHEME][1][IBLCK] = RED2BLUE_5_OF_6_K;
+
+ hc_scheme[RB_W5_OH_SCHEME][2][ICYAN] = RED2BLUE_4_OF_6_C;
+ hc_scheme[RB_W5_OH_SCHEME][2][IMGTA] = RED2BLUE_4_OF_6_M;
+ hc_scheme[RB_W5_OH_SCHEME][2][IYELW] = RED2BLUE_4_OF_6_Y;
+ hc_scheme[RB_W5_OH_SCHEME][2][IBLCK] = RED2BLUE_4_OF_6_K;
+
+ hc_scheme[RB_W5_OH_SCHEME][3][ICYAN] = RED2BLUE_3_OF_6_C;
+ hc_scheme[RB_W5_OH_SCHEME][3][IMGTA] = RED2BLUE_3_OF_6_M;
+ hc_scheme[RB_W5_OH_SCHEME][3][IYELW] = RED2BLUE_3_OF_6_Y;
+ hc_scheme[RB_W5_OH_SCHEME][3][IBLCK] = RED2BLUE_3_OF_6_K;
+
+ hc_scheme[RB_W5_OH_SCHEME][4][ICYAN] = RED2BLUE_2_OF_6_C;
+ hc_scheme[RB_W5_OH_SCHEME][4][IMGTA] = RED2BLUE_2_OF_6_M;
+ hc_scheme[RB_W5_OH_SCHEME][4][IYELW] = RED2BLUE_2_OF_6_Y;
+ hc_scheme[RB_W5_OH_SCHEME][4][IBLCK] = RED2BLUE_2_OF_6_K;
+
+ /* the 11 color rainbow schemes */
+ hc_scheme[RB_11_RL_SCHEME][0][ICYAN] = hc_scheme[RB_11_RH_SCHEME][10][ICYAN] = RED2BLUE_1_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][0][IMGTA] = hc_scheme[RB_11_RH_SCHEME][10][IMGTA] = RED2BLUE_1_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][0][IYELW] = hc_scheme[RB_11_RH_SCHEME][10][IYELW] = RED2BLUE_1_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][0][IBLCK] = hc_scheme[RB_11_RH_SCHEME][10][IBLCK] = RED2BLUE_1_OF_11_K;
+
+ hc_scheme[RB_11_RL_SCHEME][1][ICYAN] = hc_scheme[RB_11_RH_SCHEME][9][ICYAN] = RED2BLUE_2_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][1][IMGTA] = hc_scheme[RB_11_RH_SCHEME][9][IMGTA] = RED2BLUE_2_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][1][IYELW] = hc_scheme[RB_11_RH_SCHEME][9][IYELW] = RED2BLUE_2_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][1][IBLCK] = hc_scheme[RB_11_RH_SCHEME][9][IBLCK] = RED2BLUE_2_OF_11_K;
+
+ hc_scheme[RB_11_RL_SCHEME][2][ICYAN] = hc_scheme[RB_11_RH_SCHEME][8][ICYAN] = RED2BLUE_3_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][2][IMGTA] = hc_scheme[RB_11_RH_SCHEME][8][IMGTA] = RED2BLUE_3_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][2][IYELW] = hc_scheme[RB_11_RH_SCHEME][8][IYELW] = RED2BLUE_3_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][2][IBLCK] = hc_scheme[RB_11_RH_SCHEME][8][IBLCK] = RED2BLUE_3_OF_11_K;
+
+ hc_scheme[RB_11_RL_SCHEME][3][ICYAN] = hc_scheme[RB_11_RH_SCHEME][7][ICYAN] = RED2BLUE_4_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][3][IMGTA] = hc_scheme[RB_11_RH_SCHEME][7][IMGTA] = RED2BLUE_4_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][3][IYELW] = hc_scheme[RB_11_RH_SCHEME][7][IYELW] = RED2BLUE_4_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][3][IBLCK] = hc_scheme[RB_11_RH_SCHEME][7][IBLCK] = RED2BLUE_4_OF_11_K;
+
+ hc_scheme[RB_11_RL_SCHEME][4][ICYAN] = hc_scheme[RB_11_RH_SCHEME][6][ICYAN] = RED2BLUE_5_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][4][IMGTA] = hc_scheme[RB_11_RH_SCHEME][6][IMGTA] = RED2BLUE_5_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][4][IYELW] = hc_scheme[RB_11_RH_SCHEME][6][IYELW] = RED2BLUE_5_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][4][IBLCK] = hc_scheme[RB_11_RH_SCHEME][6][IBLCK] = RED2BLUE_5_OF_11_K;
+
+ hc_scheme[RB_11_RL_SCHEME][5][ICYAN] = hc_scheme[RB_11_RH_SCHEME][5][ICYAN] = RED2BLUE_6_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][5][IMGTA] = hc_scheme[RB_11_RH_SCHEME][5][IMGTA] = RED2BLUE_6_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][5][IYELW] = hc_scheme[RB_11_RH_SCHEME][5][IYELW] = RED2BLUE_6_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][5][IBLCK] = hc_scheme[RB_11_RH_SCHEME][5][IBLCK] = RED2BLUE_6_OF_11_K;
+
+ hc_scheme[RB_11_RL_SCHEME][6][ICYAN] = hc_scheme[RB_11_RH_SCHEME][4][ICYAN] = RED2BLUE_7_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][6][IMGTA] = hc_scheme[RB_11_RH_SCHEME][4][IMGTA] = RED2BLUE_7_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][6][IYELW] = hc_scheme[RB_11_RH_SCHEME][4][IYELW] = RED2BLUE_7_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][6][IBLCK] = hc_scheme[RB_11_RH_SCHEME][4][IBLCK] = RED2BLUE_7_OF_11_K;
+
+ hc_scheme[RB_11_RL_SCHEME][7][ICYAN] = hc_scheme[RB_11_RH_SCHEME][3][ICYAN] = RED2BLUE_8_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][7][IMGTA] = hc_scheme[RB_11_RH_SCHEME][3][IMGTA] = RED2BLUE_8_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][7][IYELW] = hc_scheme[RB_11_RH_SCHEME][3][IYELW] = RED2BLUE_8_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][7][IBLCK] = hc_scheme[RB_11_RH_SCHEME][3][IBLCK] = RED2BLUE_8_OF_11_K;
+
+ hc_scheme[RB_11_RL_SCHEME][8][ICYAN] = hc_scheme[RB_11_RH_SCHEME][2][ICYAN] = RED2BLUE_9_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][8][IMGTA] = hc_scheme[RB_11_RH_SCHEME][2][IMGTA] = RED2BLUE_9_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][8][IYELW] = hc_scheme[RB_11_RH_SCHEME][2][IYELW] = RED2BLUE_9_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][8][IBLCK] = hc_scheme[RB_11_RH_SCHEME][2][IBLCK] = RED2BLUE_9_OF_11_K;
+
+ hc_scheme[RB_11_RL_SCHEME][9][ICYAN] = hc_scheme[RB_11_RH_SCHEME][1][ICYAN] = RED2BLUE_10_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][9][IMGTA] = hc_scheme[RB_11_RH_SCHEME][1][IMGTA] = RED2BLUE_10_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][9][IYELW] = hc_scheme[RB_11_RH_SCHEME][1][IYELW] = RED2BLUE_10_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][9][IBLCK] = hc_scheme[RB_11_RH_SCHEME][1][IBLCK] = RED2BLUE_10_OF_11_K;
+
+ hc_scheme[RB_11_RL_SCHEME][10][ICYAN] = hc_scheme[RB_11_RH_SCHEME][0][ICYAN] = RED2BLUE_11_OF_11_C;
+ hc_scheme[RB_11_RL_SCHEME][10][IMGTA] = hc_scheme[RB_11_RH_SCHEME][0][IMGTA] = RED2BLUE_11_OF_11_M;
+ hc_scheme[RB_11_RL_SCHEME][10][IYELW] = hc_scheme[RB_11_RH_SCHEME][0][IYELW] = RED2BLUE_11_OF_11_Y;
+ hc_scheme[RB_11_RL_SCHEME][10][IBLCK] = hc_scheme[RB_11_RH_SCHEME][0][IBLCK] = RED2BLUE_11_OF_11_K;
+
+ /*****************************************
+ * Open the MSA file; determine alphabet;
+ *****************************************/
+
+ do_small = esl_opt_GetBoolean(go, "--small") ? TRUE : FALSE;
+ fmt = do_small ? eslMSAFILE_PFAM : eslMSAFILE_STOCKHOLM;
+ abc = esl_alphabet_Create(eslRNA); /* Assert RNA alphabet */
+
+ /* <abc> is only used for gap counting, I believe
+ * alignments are opened in TEXT mode.
+ */
+
+ if (do_small)
+ {
+ status = esl_msafile2_Open(alifile, NULL, &afp2);
+ if (status == eslENOTFOUND) esl_fatal("Alignment file %s doesn't exist or is not readable\n", alifile);
+ else if (status != eslOK) esl_fatal("Alignment file open failed with error %d\n", status);
+ }
+ else
+ {
+ status = esl_msafile_Open(NULL, alifile, NULL, fmt, NULL, &afp);
+ if (status != eslOK) esl_msafile_OpenFailure(afp, status);
+ }
+
+ /* Read the mask files, if nec */
+ if(esl_opt_IsOn(go, "--mask")) {
+ if((status = read_mask_file(esl_opt_GetString(go, "--mask"), errbuf, &mask, &masklen, &mask_has_internal_zeroes)) != eslOK) esl_fatal(errbuf);
+ }
+ if(esl_opt_IsOn(go, "--mask-diff")) {
+ if((status = read_mask_file(esl_opt_GetString(go, "--mask-diff"), errbuf, &mask2, &mask2len, &mask2_has_internal_zeroes)) != eslOK) esl_fatal(errbuf);
+ if(masklen != mask2len) esl_fatal("Mask in %f length (%d) differs from mask in %f (%d)!", esl_opt_GetString(go, "--mask"), masklen, esl_opt_GetString(go, "--mask-diff"), mask2len);
+ }
+
+ /* Open output files, if necessary */
+ if (esl_opt_IsOn(go, "--tabfile")) {
+ if((tabfp = fopen(esl_opt_GetString(go, "--tabfile"), "w")) == NULL) esl_fatal("Failed to open output file %s\n", esl_opt_GetString(go, "--tabfile"));
+ }
+
+ /**********************
+ * Read the alignment *
+ **********************/
+ if (do_small)
+ {
+ status = esl_msafile2_ReadInfoPfam(afp2, NULL, abc, -1, NULL, NULL, &msa, &msa_nseq, &msa_alen, NULL, NULL, NULL, NULL, NULL, &abc_ct, &pp_ct, NULL, NULL, NULL);
+ if (status == eslEFORMAT) esl_fatal("Alignment file parse error:\n%s\n", afp2->errbuf);
+ else if (status == eslEINVAL) esl_fatal("Alignment file parse error:\n%s\n", afp2->errbuf);
+ else if (status == eslEOF) esl_fatal("No alignments found in file %s\n", alifile);
+ else if (status != eslOK) esl_fatal("Alignment file read failed with error code %d\n%s", status, afp2);
+
+ msa->alen = msa_alen;
+ }
+ else
+ {
+ status = esl_msafile_Read(afp, &msa); /* if ! do_small, we read full aln into memory */
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ msa_nseq = msa->nseq;
+ msa_alen = msa->alen;
+ }
+
+ if(msa->rf == NULL) esl_fatal("First MSA in %s does not have RF annotation.", alifile);
+
+ /* determine non-gap RF length (consensus length) */
+ rflen = 0;
+ for(apos = 0; apos < msa->alen; apos++) {
+ if(esl_abc_CIsResidue(abc, msa->rf[apos])) {
+ rflen++;
+ }
+ }
+ /* We've read the alignment, now read the template postscript file (we do this second b/c the RF len of the alignment tells us which postscript template to use) */
+ if((status = parse_template_file(templatefile, go, errbuf, rflen, &ps) != eslOK)) esl_fatal(errbuf);
+
+
+ /**************************************************************************************************************
+ * Now that we have the msa and know what template we're using, determine what type of pages we'll be drawing *
+ **************************************************************************************************************/
+ /* do_default_set: this is TRUE if either -d is enabled AND/OR zero of:
+ * {--info, --mutinfo, --ifreq, --iavglen, --dall, --dint, --span, --mask-col, --mask-diff,
+ * --dfile, --efile, --cons, --prob, --rf, --indi} are enabled.
+ * When do_default_set is TRUE, we draw cons, info, mutinfo, ifreq, iavglen, dall, and prob
+ * (if the alignment has posterior probabilities).
+ *
+ * Careful: this block assumes that all boolean options are OFF (FALSE) by default */
+ do_default_set = TRUE;
+ if(esl_opt_GetBoolean(go, "--info")) { do_info = TRUE; do_default_set = FALSE; }
+ if(esl_opt_GetBoolean(go, "--mutinfo")) { do_mutinfo = TRUE; do_default_set = FALSE; }
+ if(esl_opt_GetBoolean(go, "--ifreq")) { do_ifreq = TRUE; do_default_set = FALSE; }
+ if(esl_opt_GetBoolean(go, "--iavglen")) { do_iavglen = TRUE; do_default_set = FALSE; }
+ if(esl_opt_GetBoolean(go, "--dall")) { do_dall = TRUE; do_default_set = FALSE; }
+ if(esl_opt_GetBoolean(go, "--dint")) { do_dint = TRUE; do_default_set = FALSE; }
+ if(esl_opt_GetBoolean(go, "--prob")) { do_prob = TRUE; do_default_set = FALSE; }
+ if(esl_opt_GetBoolean(go, "--span")) { do_span = TRUE; do_default_set = FALSE; }
+ if(esl_opt_GetBoolean(go, "--mask-col")) { do_maskcol = TRUE; do_default_set = FALSE; }
+ if(esl_opt_IsOn (go, "--mask-diff")) { do_maskdiff = TRUE; do_default_set = FALSE; }
+ if(esl_opt_IsOn (go, "--dfile")) { do_dfile = TRUE; do_default_set = FALSE; }
+ if(esl_opt_IsOn (go, "--efile")) { do_efile = TRUE; do_default_set = FALSE; }
+ if(esl_opt_GetBoolean(go, "--cons")) { do_cons = TRUE; do_default_set = FALSE; }
+ if(esl_opt_GetBoolean(go, "--rf")) {
+ if(msa->rf == NULL) esl_fatal("--rf selected by msa does not have #=GC RF annotation");
+ do_rf = TRUE;
+ do_default_set = FALSE;
+ }
+ if(esl_opt_GetBoolean(go, "--indi")) {
+ do_indi = TRUE;
+ do_default_set = FALSE;
+ /* Predict size of indi output file, based on two data points:
+ * 2000 page tRNA rflen=71 is 35 Mb, 2000 page archaeal SSU rflen 1508 is 560 Mb,
+ * =~ 0.0002 Mb per page per rfpos */
+ predicted_Mb = (int) (ps->rflen * 0.0002 * msa_nseq);
+ if(! esl_opt_GetBoolean(go, "--no-pp")) predicted_Mb *= 2;
+ /* round to nearest 10 Mb */
+ tmp_Mb = 10; while(tmp_Mb < predicted_Mb) tmp_Mb += 10;
+ predicted_Mb = tmp_Mb;
+ if(predicted_Mb > MAXMBWITHOUTFORCE && (! esl_opt_GetBoolean(go, "-f"))) {
+ esl_fatal("WARNING: drawing individual seqs and msa has %d seqs in it,\noutput postcript file will be large (~%d Mb).\nUse -f to override this warning and do it anyway.", msa_nseq, predicted_Mb);
+ }
+ }
+ /* if -d: if we've made do_default_set as FALSE, we set it back to TRUE */
+ if(esl_opt_GetBoolean(go, "-d")) do_default_set = TRUE;
+ if(do_default_set) { /* set default pages */
+ do_cons = do_info = do_mutinfo = do_ifreq = do_iavglen = do_dall = TRUE;
+ if((do_small && pp_ct != NULL) || (msa->pp != NULL)) do_prob = TRUE;
+ }
+ /* determine if tabfile was incorrectly used */
+ if(tabfp != NULL &&
+ do_info == FALSE && do_mutinfo == FALSE && do_ifreq == FALSE && do_prob == FALSE &&
+ do_iavglen == FALSE && do_dall == FALSE && do_dint == FALSE && do_span == FALSE && do_indi == FALSE) {
+ esl_fatal("--tabfile only makes sense w/0 other options, or with >= 1 of --info,--mutinfo,--ifreq,--iavglen,--prob,--dall,--dint,--span,--indi");
+ }
+ need_span_ct = (do_dint || do_span || do_ifreq || do_iavglen) ? TRUE : FALSE;
+
+ if(do_small && (do_dint || do_span || do_ifreq || do_iavglen || do_mutinfo)) {
+ /* If we're in small mem mode, now that we know msa->rf and msa->ss_cons,
+ * we do a second read of the msa to get bpct, spos_ct and epos_ct,
+ * but only if we need them (if --span, --dint, or --mutinfo).
+ * To do this, we close the alifile and reopen it, so we can read the 1st
+ * alignment again.
+ */
+ esl_msafile2_Close(afp2);
+ status = esl_msafile2_Open(alifile, NULL, &afp2);
+ if (status == eslENOTFOUND) esl_fatal("2nd pass, alignment file %s doesn't exist or is not readable\n", alifile);
+ else if (status == eslEFORMAT) esl_fatal("2nd pass, couldn't determine format of alignment %s\n", alifile);
+ else if (status != eslOK) esl_fatal("2nd pass, alignment file open failed with error %d\n", status);
+
+ status = esl_msafile2_ReadInfoPfam(afp2, NULL, abc, msa_alen, msa->rf, msa->ss_cons, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &bp_ct, &spos_ct, &epos_ct);
+ if (status == eslEFORMAT) esl_fatal("2nd pass, Alignment file parse error:\n%s\n", afp2->errbuf);
+ else if (status == eslEINVAL) esl_fatal("2nd pass, Alignment file parse error:\n%s\n", afp2->errbuf);
+ else if (status == eslEOF) esl_fatal("2nd pass, No alignments found in file %s\n", alifile);
+ else if (status != eslOK) esl_fatal("2nd pass, Alignment file read failed with error code %d\n", status);
+ }
+
+ /* if we get here, the postscript file has been successfully read; now we open the output file */
+ if(ofp == NULL) {
+ /* open postscript output file for writing */
+ if ((ofp = fopen(outfile, "w")) == NULL)
+ esl_fatal("Failed to open output postscript file %s\n", esl_opt_GetArg(go, 2));
+ }
+
+ /* determine position for header and legend */
+ if((status = setup_sspostscript(ps, errbuf) != eslOK)) esl_fatal(errbuf);
+ if(ps->rflen == 0) esl_fatal("MSA has consensus (non-gap RF) length of %d which != template file consensus length of %d.", rflen, ps->rflen);
+ if(rflen != ps->rflen) esl_fatal("MSA has consensus (non-gap RF) length of %d which != template file consensus length of %d.", rflen, ps->rflen);
+
+ /* add the mask if there is one */
+ if(mask != NULL) add_mask_to_ss_postscript(ps, mask);
+ if(mask != NULL && ps->rflen != masklen) esl_fatal("MSA has consensus (non-gap RF) length of %d which != lane mask length of %d from mask file %s.", rflen, masklen, esl_opt_GetString(go, "--mask"));
+
+ if ((status = validate_and_update_sspostscript_given_msa(go, abc, ps, msa, msa_nseq, errbuf)) != eslOK) esl_fatal(errbuf);
+
+ /* get the information we need from the alignment */
+ if(! do_small) { /* derive counts from the msa for postscript diagrams, we do this our functions for drawing diagrams work in small mem or big mem mode */
+ if((status = count_msa(abc, msa, errbuf, &(abc_ct), &(bp_ct), (do_prob ? &(pp_ct) : NULL), &(spos_ct), &(epos_ct))) != eslOK) esl_fatal(errbuf);
+ }
+ if (esl_opt_GetBoolean(go, "--prob") && pp_ct == NULL) esl_fatal("--prob requires all sequences have PP annotation");
+
+ /* read the insert file, if nec, we have to do this before we determine the span count in case inserts have been removed from the msa,
+ * in which case the spos_ct and epos_ct's from either count_msa or esl_msafile2_ReadInfoPfam() could be slightly incorrect, we'll use
+ * srfoff_ct and erfoff_ct from get_insert_info_from_ifile() to correct them when we derive span_ct from spos_ct and epos_ct together in get_span_ct(). */
+ if(esl_opt_IsOn(go, "--ifile")) {
+ get_insert_info_from_ifile((esl_opt_GetString(go, "--ifile")), ps->rflen, msa_nseq, NULL, &(nseq_with_ins_ct), &(nins_ct), NULL, &srfoff_ct, &erfoff_ct); /* dies with esl_fatal() upon an error */
+ }
+ /* determine span count */
+ if(need_span_ct) {
+ if((status = get_span_ct(ps->msa_rf2a_map, msa_alen, ps->rflen, msa_nseq, spos_ct, epos_ct, srfoff_ct, erfoff_ct, &span_ct)) != eslOK) esl_fatal("Out of memory, getting span_ct array.");
+ }
+ /* determine consensus sequence */
+ if((status = get_consensus_seqs_from_abc_ct(go, ps, errbuf, abc_ct, abc, msa_alen)) != eslOK) esl_fatal(errbuf);
+
+ /* step through each type of page, creating it if nec */
+ if(do_cons) {
+ /* this will work in either small memory or normal memory mode */
+ if((status = cons_seq_sspostscript(go, errbuf, ps, hc_onecell,
+ BLACKOC, /* one-cell legend, watson-crick bp color */
+ GREENOC, /* one-cell legend, G-U or U-G bp color */
+ REDOC, /* one-cell legend, color for noncanonical bps */
+ LIGHTPURPLEOC, /* one-cell legend, internal double-gap bp color */
+ LIGHTPURPLEOC)) != eslOK) /* one-cell legend, internal half-gap bp color, only relevant if do_rescol == TRUE */
+ esl_fatal(errbuf);
+ }
+
+ if(do_rf) {
+ /* this will work in either small memory or normal memory mode */
+ if((status = rf_seq_sspostscript(go, errbuf, ps, msa, (! esl_opt_GetBoolean(go, "--no-bp")), hc_onecell,
+ BLACKOC, /* one-cell legend, watson-crick bp color, only relevant if do_rescol == TRUE */
+ GREENOC, /* one-cell legend, G-U or U-G bp color, only relevant if do_rescol == TRUE */
+ REDOC)) != eslOK) /* one-cell legend, color for noncanonical bps */
+ esl_fatal(errbuf);
+ }
+
+ if(do_info) {
+ if((status = infocontent_sspostscript(go, abc, errbuf, ps, abc_ct, msa_nseq, hc_scheme, RB_6_RL_SCHEME, hc_nbins[RB_6_RL_SCHEME], hc_onecell, LIGHTGREYOC, tabfp)) != eslOK) esl_fatal(errbuf);
+ }
+
+ if(do_mutinfo) { /* mutual info page */
+ if((status = mutual_information_sspostscript(go, abc, errbuf, ps, bp_ct, msa_nseq, hc_scheme, RB_6_RH_SCHEME, hc_nbins[RB_6_RH_SCHEME], hc_onecell, GREYOC, LIGHTGREYOC, tabfp)) != eslOK) esl_fatal(errbuf);
+ }
+
+ if(do_ifreq || do_iavglen) { /* insert frequency page */
+ /* first, determine number of sequences with inserts after each position, 3 different ways depending on command line options */
+ if(esl_opt_IsOn(go, "--ifile")) { /* read the insert file from cmalign */
+ /* we've already read the ifile above, and filled nseq_with_ins_ct, but we check here */
+ if(nseq_with_ins_ct == NULL) esl_fatal("Internal error, --ifile selected, but not read");
+ }
+ else if (do_small) { /* use abc_ct to derive nseq_with_ins_ct */
+ get_insert_info_from_abc_ct(abc_ct, abc, msa->rf, msa_alen, ps->rflen, &(nseq_with_ins_ct), &(nins_ct)); /* dies with esl_fatal() upon an error */
+ }
+ else {
+ get_insert_info_from_msa(abc, msa, ps->rflen, &(nseq_with_ins_ct), &(nins_ct), NULL); /* dies with esl_fatal() upon an error */
+ }
+ /* now draw the insert diagram */
+ if(do_ifreq) {
+ if((status = insertfreq_sspostscript(go, errbuf, ps, nseq_with_ins_ct, span_ct, msa_nseq, hc_scheme, RB_6_RH_SCHEME, hc_nbins[RB_6_RH_SCHEME], hc_onecell, LIGHTGREYOC, GREYOC, tabfp)) != eslOK) esl_fatal(errbuf);
+ }
+ if(do_iavglen) {
+ if((status = insertavglen_sspostscript(go, errbuf, ps, nseq_with_ins_ct, nins_ct, span_ct, msa_nseq, hc_scheme, RB_6_RH_SCHEME, hc_nbins[RB_6_RH_SCHEME], hc_onecell, LIGHTGREYOC, tabfp)) != eslOK) esl_fatal(errbuf);
+ }
+ }
+
+ if(do_dall) { /* make a new postscript page marking all deletes */
+ if((status = delete_sspostscript(go, abc, errbuf, ps, abc_ct, span_ct, msa_nseq, TRUE, hc_scheme, RB_6_RH_SCHEME, hc_nbins[RB_6_RH_SCHEME], hc_onecell, LIGHTGREYOC, DARKGREYOC, tabfp)) != eslOK) esl_fatal(errbuf);
+ }
+
+ if(do_dint) { /* internal deletes */
+ if((status = delete_sspostscript(go, abc, errbuf, ps, abc_ct, span_ct, msa_nseq, FALSE, hc_scheme, RB_6_RH_SCHEME, hc_nbins[RB_6_RH_SCHEME], hc_onecell, LIGHTGREYOC, DARKGREYOC, tabfp)) != eslOK) esl_fatal(errbuf);
+ }
+
+ if(do_prob && pp_ct != NULL) { /* avg post prob */
+ if((status = avg_posteriors_sspostscript(go, abc, errbuf, ps, pp_ct, msa_nseq, hc_scheme, RB_6_RL_SCHEME, hc_nbins[RB_6_RL_SCHEME], hc_onecell, LIGHTGREYOC, tabfp)) != eslOK) esl_fatal(errbuf);
+ }
+
+ if(do_span) { /* span */
+ if((status = span_sspostscript(go, errbuf, ps, span_ct, msa_nseq, hc_scheme, RB_6_RL_SCHEME, hc_nbins[RB_6_RL_SCHEME], hc_onecell, LIGHTGREYOC, BLACKOC, tabfp)) != eslOK) esl_fatal(errbuf);
+ }
+
+ if(do_maskcol) {
+ /* Paint positions excluded by the mask magenta, unless the mask has zero internal exclusions.
+ * Such a mask is a 'truncating' mask, that excludes only a 5' contiguous set of columns, and a 3' contiguous set of columns, in this case paint excluded positions light grey. */
+ if((status = colormask_sspostscript(go, errbuf, ps, msa, hc_onecell, BLACKOC, (mask_has_internal_zeroes ? MAGENTAOC : LIGHTGREYOC))) != eslOK) esl_fatal(errbuf);
+ }
+
+ if(do_maskdiff) {
+ if((status = diffmask_sspostscript(go, errbuf, ps, msa, mask2, hc_onecell, BLACKOC, CYANOC, MAGENTAOC, LIGHTGREYOC)) != eslOK) esl_fatal(errbuf);
+ }
+
+ if(do_dfile) {
+ if((status = drawfile2sspostscript(go, errbuf, ps, hc_scheme, RB_6_RH_SCHEME, hc_nbins[RB_6_RH_SCHEME])) != eslOK) esl_fatal(errbuf);
+ }
+
+ if(do_efile) {
+ if((status = expertfile2sspostscript(go, errbuf, ps)) != eslOK) esl_fatal(errbuf);
+ }
+
+ if(do_indi) { /* we're printing all individual seqs */
+ /* get insert info we'll use in individuals_sspostscript() */
+ if(esl_opt_IsOn(go, "--ifile")) { /* read the insert file from cmalign, with info from all seqs */
+ get_insert_info_from_ifile((esl_opt_GetString(go, "--ifile")), ps->rflen, msa_nseq, NULL, NULL, NULL, &(per_seq_ins_ct), NULL, NULL); /* dies with esl_fatal() upon an error */
+ }
+ else {
+ get_insert_info_from_msa(abc, msa, ps->rflen, NULL, NULL, &per_seq_ins_ct); /* dies with esl_fatal() upon an error */
+ }
+ /* we have msa and per_seq_ins_ct for all possible combos of --small and --ifile,
+ * draw the individual sequence pages */
+ if((status = individuals_sspostscript(go, abc, errbuf, ps, abc_ct,
+ msa, per_seq_ins_ct,
+ ((! esl_opt_GetBoolean(go, "--no-pp")) && (msa->pp != NULL)), /* do_prob? draw pp pages? */
+ (! esl_opt_GetBoolean(go, "--no-bp")), /* do_rescol: paint nucleotides different colors based on basepair type? */
+ hc_scheme, RB_W5_OH_SCHEME, RB_6_RL_SCHEME, hc_nbins[RB_W5_OH_SCHEME], hc_nbins[RB_6_RL_SCHEME], hc_onecell,
+ LIGHTGREYOC, /* one-cell legend, 5'/3' flush color */
+ BLACKOC, /* one-cell legend, watson-crick bp color, only relevant if do_rescol == TRUE */
+ GREENOC, /* one-cell legend, G-U or U-G bp color, only relevant if do_rescol == TRUE */
+ REDOC, /* one-cell legend, non-canonical bp color, only relevant if do_rescol == TRUE */
+ LIGHTPURPLEOC, /* one-cell legend, internal double-gap bp color, only relevant if do_rescol == TRUE */
+ LIGHTPURPLEOC, /* one-cell legend, internal half-gap bp color, only relevant if do_rescol == TRUE */
+ LIGHTGREYOC, /* one-cell legend, color for gap in post prob pages */
+ tabfp)) != eslOK)
+ esl_fatal(errbuf);
+ }
+ if((status = draw_sspostscript(ofp, go, errbuf, command, date, hc_scheme, ps)) != eslOK) esl_fatal(errbuf);
+ free(command);
+ fclose(ofp);
+ printf("# %d page postscript saved to file %s.\n", ps->npage, outfile);
+
+ /* Cleanup, normal return
+ */
+ if(tabfp != NULL) {
+ fclose(tabfp);
+ if(do_indi && (do_info || do_mutinfo || do_ifreq || do_iavglen || do_dall || do_dint || do_prob || do_span)) {
+ printf("# Per-position and per-sequence data saved to tab-delimited text file %s.\n", esl_opt_GetString(go, "--tabfile"));
+ }
+ else if (do_indi) {
+ printf("# Per-sequence data saved to tab-delimited text file %s.\n", esl_opt_GetString(go, "--tabfile"));
+ }
+ else {
+ printf("# Per-position data saved to tab-delimited text file %s.\n", esl_opt_GetString(go, "--tabfile"));
+ }
+ }
+
+ if(abc_ct != NULL) esl_Free2D((void **) abc_ct, msa->alen);
+ if(pp_ct != NULL) esl_Free2D((void **) pp_ct, msa->alen);
+ if(bp_ct != NULL) esl_Free3D((void ***) bp_ct, msa->alen, abc->Kp);
+ if(spos_ct != NULL) free(spos_ct);
+ if(epos_ct != NULL) free(epos_ct);
+ if(srfoff_ct != NULL) free(srfoff_ct);
+ if(erfoff_ct != NULL) free(erfoff_ct);
+ if(span_ct != NULL) free(span_ct);
+ if(nseq_with_ins_ct != NULL) free(nseq_with_ins_ct);
+ if(per_seq_ins_ct != NULL) esl_Free2D((void **) per_seq_ins_ct, msa_nseq);
+ if(mask != NULL) free(mask);
+ if(date != NULL) free(date);
+ free_sspostscript(ps);
+ esl_alphabet_Destroy(abc);
+ if (afp) esl_msafile_Close(afp);
+ if (afp2) esl_msafile2_Close(afp2);
+ esl_getopts_Destroy(go);
+ free(hc_nbins);
+ for(z = 0; z < NOC; z++) free(hc_onecell[z]);
+ free(hc_onecell);
+ for(z = 0; z < NRB_11_RH_SCHEME; z++) free(hc_scheme[RB_11_RH_SCHEME][z]);
+ for(z = 0; z < NRB_11_RL_SCHEME; z++) free(hc_scheme[RB_11_RL_SCHEME][z]);
+ for(z = 0; z < NRB_6_RH_SCHEME; z++) free(hc_scheme[RB_6_RH_SCHEME][z]);
+ for(z = 0; z < NRB_6_RL_SCHEME; z++) free(hc_scheme[RB_6_RL_SCHEME][z]);
+ for(z = 0; z < NRB_5_RH_SCHEME; z++) free(hc_scheme[RB_5_RH_SCHEME][z]);
+ for(z = 0; z < NRB_5_RL_SCHEME; z++) free(hc_scheme[RB_5_RL_SCHEME][z]);
+ for(z = 0; z < NRB_W5_OH_SCHEME; z++) free(hc_scheme[RB_W5_OH_SCHEME][z]);
+ for(z = 0; z < NSCHEMES; z++) { free(hc_scheme[z]); }
+ free(hc_scheme);
+ if(msa != NULL) esl_msa_Destroy(msa);
+ return 0;
+
+ ERROR:
+ esl_fatal("Memory allocation error in main().");
+ return eslFAIL;/* silence compiler warning about void return*/
+}
+
+/* Function: create_sspostscript()
+ *
+ * Purpose: Create and initialize a SS postscript data structure.
+ * Return: ps
+ */
+static SSPostscript_t *
+create_sspostscript(const ESL_GETOPTS *go)
+{
+ int status;
+ SSPostscript_t *ps;
+
+ ESL_ALLOC(ps, sizeof(SSPostscript_t));
+
+ ps->npage = 0;
+ ps->modelname = NULL;
+ ps->modeA = NULL;
+ ps->descA = NULL;
+ ps->headerx = 0.;
+ ps->headery = 0.;
+ ps->headerx_desc = 0.;
+ ps->headerx_charsize = 0.;
+ ps->headery_charsize = 0.;
+ ps->desc_max_chars = 0;
+ ps->leg_posn = -1;
+ ps->leg_cellsize = -1;
+ ps->leg_rhs_space = 0.;
+ ps->legx_offset = 0.;
+ ps->legy_offset = 0.;
+ ps->legx = 0.;
+ ps->legy = 0.;
+ ps->cur_legy = 0.;
+ ps->legx_charsize = 0.;
+ ps->legy_charsize = 0.;
+ ps->legx_max_chars = 0;
+ ps->legx_stats = 0.;
+ ps->pagex_max = 0.;
+ ps->pagey_max = 0.;
+ ps->scale = -1.; /* we'll check if this is still negative after reading the template file, if so it's an error */
+ ps->regurgA = NULL;
+ ps->nregurg = 0;
+ ps->posntextA = NULL;
+ ps->posntextxA = ps->posntextyA = NULL;
+ ps->nposntext = 0;
+ ps->ticksx1A = ps->ticksx2A = ps->ticksy1A = ps->ticksy2A = NULL;
+ ps->nticks = 0;
+ ps->bpx1A = ps->bpx2A = ps->bpy1A = ps->bpy2A = NULL;
+ ps->nbp = 0;
+ ps->rxA = ps->ryA = NULL;
+ ps->rflen = 0;
+ ps->rAA = NULL;
+ ps->rcolAAA = NULL;
+ ps->bcolAAA = NULL;
+ ps->otypeAA = NULL;
+ ps->occlAAA = NULL;
+ ps->nocclA = NULL;
+ ps->sclAA = NULL;
+ ps->tlAAA = NULL;
+ ps->ntlA = NULL;
+ ps->mask = NULL;
+ ps->nalloc = 50;
+ ps->msa_cseq_maj = NULL;
+ ps->msa_cseq_amb = NULL;
+ ps->msa_ct = NULL;
+ ps->msa_nbp = 0;
+ ps->msa_rf2a_map = NULL;
+ ps->msa_a2rf_map = NULL;
+ ps->uaseqlenA = NULL;
+ ps->seqidxA = NULL;
+ ps->msa = NULL;
+ ps->abc = NULL;
+ return ps;
+
+ ERROR: esl_fatal("create_sspostscript(): memory allocation error.");
+ return NULL; /* NEVERREACHED */
+}
+
+/* Function: setup_sspostscript()
+ *
+ * Purpose: Determine positions for header and legend in a SSPostscript_t()
+ * Return: eslOK
+ */
+static int
+setup_sspostscript(SSPostscript_t *ps, char *errbuf)
+{
+ float xroom, yroom;
+ float header_max_chars;
+
+ if(ps->rflen == 0) ESL_FAIL(eslEINVAL, errbuf, "Failed to ready any nucleotides in template file.");
+
+ /* set up legx, legy, this is a hack (takes advantage of position of 3' nucleotide in all SSU models) */
+ ps->legx = ps->rxA[ps->leg_posn-1] + ps->legx_offset;
+ ps->legy = ps->ryA[ps->leg_posn-1] + ps->legy_offset;
+ ps->cur_legy = ps->legy;
+
+ ps->pagex_max = POSTSCRIPT_PAGEWIDTH / ps->scale;
+ ps->pagey_max = POSTSCRIPT_PAGEHEIGHT / ps->scale;
+
+ ps->headerx = 0. + PAGE_SIDEBUF;
+ ps->headery = ps->pagey_max - PAGE_TOPBUF - ((HEADER_FONTSIZE_UNSCALED) / ps->scale);
+
+ /* determine max number of nucleotides we can print before we run off the page in the legend section */
+ ps->legx_charsize = (LEG_FONTSIZE_UNSCALED / COURIER_HEIGHT_WIDTH_RATIO) / ps->scale;
+ ps->legy_charsize = (LEG_FONTSIZE_UNSCALED) / ps->scale;
+ xroom = ps->pagex_max - ps->legx - (ps->leg_cellsize - ps->legx_charsize);
+ yroom = ps->pagey_max - ps->legy - (ps->leg_cellsize - ps->legy_charsize);
+ ps->legx_max_chars = (int) (xroom / ps->legx_charsize);
+ ps->legy_max_chars = (int) (yroom / ps->legy_charsize);
+ ps->legx_stats = ps->pagex_max - PAGE_SIDEBUF - ps->leg_rhs_space - (LEG_EXTRA_COLUMNS * ps->legx_charsize);
+
+ /* determine max size of description that will fit in header */
+ //header_fontwidth = (HEADER_FONTSIZE_UNSCALED / COURIER_HEIGHT_WIDTH_RATIO) / ps->scale; // SRE: appears to be unused.
+ ps->headerx_charsize = (HEADER_FONTSIZE_UNSCALED / COURIER_HEIGHT_WIDTH_RATIO) / ps->scale;
+ header_max_chars = (int) ((ps->pagex_max - 2*PAGE_SIDEBUF) / ps->headerx_charsize);
+ ps->headery_charsize = (HEADER_FONTSIZE_UNSCALED) / ps->scale;
+ ps->desc_max_chars = header_max_chars - (HEADER_MODELNAME_MAXCHARS + 6 + 6 + 8 +2); /*6,6,8 for #pos,#bps,#seq plus 2 spaces each, plus 2 for after name */
+ ps->headerx_desc = ps->pagex_max - PAGE_SIDEBUF - (ps->desc_max_chars * ps->headerx_charsize);
+
+ return eslOK;
+}
+
+/* Function: free_sspostscript()
+ *
+ * Purpose: Free a SS postscript data structure.
+ * Return: (void)
+ */
+static void
+free_sspostscript(SSPostscript_t *ps)
+{
+ int i, p, c, l, l2;
+
+ if(ps->modelname != NULL) free(ps->modelname);
+
+ if(ps->modeA != NULL) free(ps->modeA);
+
+ if(ps->descA != NULL) {
+ for(i = 0; i < ps->npage; i++) {
+ if(ps->descA[i] != NULL) {
+ free(ps->descA[i]);
+ }
+ }
+ free(ps->descA);
+ }
+
+ if(ps->regurgA != NULL) {
+ for(i = 0; i < ps->nregurg; i++) {
+ if(ps->regurgA[i] != NULL) {
+ free(ps->regurgA[i]);
+ }
+ }
+ free(ps->regurgA);
+ }
+
+ if(ps->posntextA != NULL) {
+ for(i = 0; i < ps->nposntext; i++) free(ps->posntextA[i]);
+ free(ps->posntextA);
+ }
+ if(ps->posntextxA != NULL) free(ps->posntextxA);
+ if(ps->posntextyA != NULL) free(ps->posntextyA);
+ if(ps->ticksx1A != NULL) free(ps->ticksx1A);
+ if(ps->ticksy1A != NULL) free(ps->ticksy1A);
+ if(ps->ticksx2A != NULL) free(ps->ticksx2A);
+ if(ps->ticksy2A != NULL) free(ps->ticksy2A);
+ if(ps->bpx1A != NULL) free(ps->bpx1A);
+ if(ps->bpy1A != NULL) free(ps->bpy1A);
+ if(ps->bpx2A != NULL) free(ps->bpx2A);
+ if(ps->bpy2A != NULL) free(ps->bpy2A);
+ if(ps->rxA != NULL) free(ps->rxA);
+ if(ps->ryA != NULL) free(ps->ryA);
+
+ if(ps->rAA != NULL) {
+ for(p = 0; p < ps->npage; p++)
+ if(ps->rAA[p] != NULL) free(ps->rAA[p]);
+ free(ps->rAA);
+ }
+
+ if(ps->rcolAAA != NULL) {
+ for(p = 0; p < ps->npage; p++) {
+ if(ps->rcolAAA[p] != NULL) {
+ for(c = 0; c < ps->rflen; c++) free(ps->rcolAAA[p][c]);
+ free(ps->rcolAAA[p]);
+ }
+ }
+ free(ps->rcolAAA);
+ }
+
+ if(ps->bcolAAA != NULL) {
+ for(p = 0; p < ps->npage; p++) {
+ if(ps->bcolAAA[p] != NULL) {
+ for(c = 0; c < ps->rflen; c++) free(ps->bcolAAA[p][c]);
+ free(ps->bcolAAA[p]);
+ }
+ }
+ free(ps->bcolAAA);
+ }
+
+ if(ps->otypeAA != NULL) {
+ for(p = 0; p < ps->npage; p++) {
+ if(ps->otypeAA[p] != NULL) {
+ free(ps->otypeAA[p]);
+ }
+ }
+ free(ps->otypeAA);
+ }
+
+ if(ps->occlAAA != NULL) {
+ for(p = 0; p < ps->npage; p++) {
+ if(ps->occlAAA[p] != NULL) {
+ for(l = 0; l < ps->nocclA[p]; l++) {
+ if(ps->occlAAA[p][l]->text != NULL) free(ps->occlAAA[p][l]->text);
+ if(ps->occlAAA[p][l]->celltext != NULL) free(ps->occlAAA[p][l]->celltext);
+ if(ps->occlAAA[p][l]->procname != NULL) free(ps->occlAAA[p][l]->procname);
+ if(ps->occlAAA[p][l]->procstack != NULL) free(ps->occlAAA[p][l]->procstack);
+ free(ps->occlAAA[p][l]); /* the rest is statically allocated memory */
+ }
+ free(ps->occlAAA[p]);
+ }
+ }
+ free(ps->occlAAA);
+ }
+
+ if(ps->sclAA != NULL) {
+ for(p = 0; p < ps->npage; p++) {
+ if(ps->sclAA[p] != NULL) {
+ if(ps->sclAA[p]->limits != NULL) free(ps->sclAA[p]->limits);
+ if(ps->sclAA[p]->counts != NULL) free(ps->sclAA[p]->counts);
+ if(ps->sclAA[p]->counts_masked != NULL) free(ps->sclAA[p]->counts_masked);
+ if(ps->sclAA[p]->text1 != NULL) free(ps->sclAA[p]->text1);
+ if(ps->sclAA[p]->text2 != NULL) free(ps->sclAA[p]->text2);
+ free(ps->sclAA[p]); /* statically allocated memory */
+ }
+ }
+ free(ps->sclAA);
+ }
+
+ if(ps->tlAAA != NULL) {
+ for(p = 0; p < ps->npage; p++) {
+ if(ps->tlAAA[p] != NULL) {
+ for(l = 0; l < ps->ntlA[p]; l++) {
+ for(l2 = 0; l2 < ps->tlAAA[p][l]->nlines; l2++) {
+ free(ps->tlAAA[p][l]->text_per_line[l2]);
+ }
+ free(ps->tlAAA[p][l]); /* the rest is statically allocated memory */
+ }
+ free(ps->tlAAA[p]);
+ }
+ }
+ free(ps->tlAAA);
+ }
+
+ if(ps->ntlA != NULL) free(ps->ntlA);
+ if(ps->nocclA != NULL) free(ps->nocclA);
+ if(ps->msa_cseq_maj != NULL) free(ps->msa_cseq_maj);
+ if(ps->msa_cseq_amb != NULL) free(ps->msa_cseq_amb);
+ if(ps->msa_ct != NULL) free(ps->msa_ct);
+ if(ps->msa_rf2a_map != NULL) free(ps->msa_rf2a_map);
+ if(ps->msa_a2rf_map != NULL) free(ps->msa_a2rf_map);
+ if(ps->mask != NULL) free(ps->mask);
+ if(ps->seqidxA != NULL) free(ps->seqidxA);
+ if(ps->uaseqlenA != NULL) free(ps->uaseqlenA);
+
+ free(ps);
+ return;
+}
+
+/* Function: create_onecell_colorlegend()
+ *
+ * Purpose: Create and initialize a one cell color legend data structure.
+ * As a special case, pass nres as OCCL_BLANK_COUNT if you don't
+ * want a count printed for this one cell.
+ * Return: occl
+ */
+static OneCellColorLegend_t *
+create_onecell_colorlegend(float *col, int nres, int nres_masked, int do_separator, int do_no_vspace)
+{
+ int status;
+ OneCellColorLegend_t *occl;
+
+ ESL_ALLOC(occl, sizeof(OneCellColorLegend_t));
+
+ /* initialize */
+ esl_vec_FSet(occl->col, NCMYK, 0.);
+ occl->text = NULL;
+ occl->celltext = NULL;
+ occl->procname = NULL;
+ occl->procstack = NULL;
+ occl->nprocstack = 0;
+
+ /* set caller specified values */
+ esl_vec_FCopy(col, NCMYK, occl->col);
+
+ occl->nres = nres;
+ occl->nres_masked = nres_masked;
+ occl->do_separator = do_separator;
+ occl->do_no_vspace = do_no_vspace;
+
+ return occl;
+
+ ERROR: esl_fatal("create_onecell_colorlegend(): memory allocation error.");
+ return NULL; /* NEVERREACHED */
+}
+
+
+
+/* Function: create_onecell_colorlegend()
+ *
+ * Purpose: Create and initialize a one cell color legend data structure.
+ * Return: occl
+ */
+static TextLegend_t *
+create_text_legend(int nlines, char **text_per_line, int do_separator)
+{
+ int status;
+ TextLegend_t *tl;
+ int i;
+
+ ESL_ALLOC(tl, sizeof(TextLegend_t));
+
+ /* initialize */
+ tl->text_per_line = NULL;
+
+ /* set caller specified values */
+ tl->nlines = nlines;
+ tl->do_separator = do_separator;
+ ESL_ALLOC(tl->text_per_line, sizeof(char *) * nlines);
+ for(i = 0; i < nlines; i++) {
+ if((status = esl_strdup(text_per_line[i], -1, &(tl->text_per_line[i]))) != eslOK) esl_fatal("create_text_legend(), error copying text");
+ }
+
+ return tl;
+
+ ERROR: esl_fatal("create_text_legend(): memory allocation error.");
+ return NULL; /* NEVERREACHED */
+}
+
+
+/* Function: create_text_legend_for_consensus_sequence()
+ *
+ * Purpose: Create text explaining how a consensus sequence is calculated
+ * for the legend, and return it in the form of a TextLegend_t
+ * object.
+ *
+ * Return: tl
+ */
+static TextLegend_t *
+create_text_legend_for_consensus_sequence(const ESL_GETOPTS *go, int do_separator)
+{
+ int status;
+ TextLegend_t *tl;
+ int i;
+ int nlines;
+ char **text;
+
+ if(esl_opt_GetBoolean(go, "--cambig")) {
+ nlines = 5;
+ ESL_ALLOC(text, sizeof(char *) * nlines);
+ for(i = 0; i < nlines; i++) { text[i] = NULL; }
+ if((status = esl_strcat(&(text[0]), -1, "Consensus nucleotides (nt) are displayed, calculated", -1)) != eslOK) esl_fatal("create_text_legend_for_consensus_sequence(), error copying text");
+ ESL_ALLOC(text[1], sizeof(char) * (strlen("as the least ambiguous nt that represents >= 1.00") + 1));
+ sprintf(text[1], "as the least ambiguous nt that represents >= %0.2f", esl_opt_GetReal(go, "--athresh"));
+ if((status = esl_strcat(&(text[2]), -1, "of all non-gap nts at each position.", -1)) != eslOK) esl_fatal("create_text_legend_for_consensus_sequence(), error copying text");
+ if((status = esl_strcat(&(text[3]), -1, "K=G|U, M=A|C, R=A|G, S=C|G, Y=C|U, W=A|U", -1)) != eslOK) esl_fatal("create_text_legend_for_consensus_sequence(), error copying text");
+ if((status = esl_strcat(&(text[4]), -1, "B=C|G|U, D=A|G|U, H=A|C|U, V=A|C|G, N=A|C|G|U", -1)) != eslOK) esl_fatal("create_text_legend_for_consensus_sequence(), error copying text");
+ }
+ else { /* --cambig not enabled, majority rule was used */
+ nlines = 4;
+ ESL_ALLOC(text, sizeof(char *) * nlines);
+ for(i = 0; i < nlines; i++) { text[i] = NULL; }
+ if((status = esl_strcat(&(text[0]), -1, "Consensus nucleotides (nt) are displayed, defined", -1)) != eslOK) esl_fatal("create_text_legend_for_consensus_sequence(), error copying text");
+ if((status = esl_strcat(&(text[1]), -1, "as the most frequent nt at each position.", -1)) != eslOK) esl_fatal("create_text_legend_for_consensus_sequence(), error copying text");
+ ESL_ALLOC(text[2], sizeof(char) * (strlen("Capitalized nts occur in >= 1.00 fraction of sequences") + 1));
+ sprintf(text[2], "Capitalized nts occur in >= %0.2f fraction of sequences", esl_opt_GetReal(go, "--cthresh"));
+ if((status = esl_strcat(&(text[3]), -1, "that do not have a gap at the position.", -1)) != eslOK) esl_fatal("create_text_legend_for_consensus_sequence(), error copying text");
+ }
+
+ tl = create_text_legend(nlines, text, do_separator);
+ for(i = 0; i < nlines; i++) {
+ free(text[i]);
+ }
+ free(text);
+ return tl;
+
+ ERROR: esl_fatal("create_text_legend(): memory allocation error.");
+ return NULL; /* NEVERREACHED */
+}
+
+
+/* Function: create_scheme_colorlegend()
+ *
+ * Purpose: Create and initialize a scheme color legend data structure.
+ * Return: scl
+ */
+static SchemeColorLegend_t *
+create_scheme_colorlegend(int scheme, int nbins, float *limits, int ints_only_flag, int low_inclusive, int high_inclusive, int use_mask)
+{
+ int status;
+ SchemeColorLegend_t *scl;
+ int i;
+ int *counts;
+ int *counts_masked;
+ ESL_ALLOC(scl, sizeof(SchemeColorLegend_t));
+
+ /* initialize */
+ scl->text1 = NULL;
+ scl->text2 = NULL;
+
+ /* set caller specified values */
+ scl->scheme = scheme;
+ scl->nbins = nbins;
+ ESL_ALLOC(scl->limits, sizeof(float) * (nbins+1));
+ for(i = 0; i <= nbins; i++) { scl->limits[i] = limits[i]; }
+
+ ESL_ALLOC(counts, sizeof(int) * nbins);
+ ESL_ALLOC(counts_masked, sizeof(int) * nbins);
+ esl_vec_ISet(counts, nbins, 0);
+ esl_vec_ISet(counts_masked, nbins, 0);
+ scl->counts = counts;
+ scl->counts_masked = counts_masked;
+ scl->ints_only_flag = ints_only_flag;
+ scl->low_inclusive = low_inclusive;
+ scl->high_inclusive = high_inclusive;
+ scl->use_mask = use_mask;
+ return scl;
+
+ ERROR: esl_fatal("create_scheme_colorlegend(): memory allocation error.");
+ return NULL; /* NEVERREACHED */
+}
+
+/* Function: add_text_to_scheme_colorlegend()
+ *
+ * Purpose: Add text to an existing scheme color legend data structure.
+ * Throws: Exception if the text is too long.
+ */
+int
+add_text_to_scheme_colorlegend(SSPostscript_t *ps, SchemeColorLegend_t *scl, char *text, int legx_max_chars, char *errbuf)
+{
+ int status;
+ int i, idx;
+ int max_chars_per_line;
+
+ if(scl->text1 != NULL) esl_fatal("add_text_to_scheme_colorlegend(), text already exists!\n");
+ if(scl->text2 != NULL) esl_fatal("add_text_to_scheme_colorlegend(), text already exists!\n");
+ if(text == NULL) esl_fatal("add_text_to_scheme_colorlegend(), passed in text is NULL!\n");
+
+ max_chars_per_line = ps->legx_max_chars -
+ ((int) ps->leg_rhs_space / ps->legx_charsize) -
+ ((int) (PAGE_SIDEBUF / ps->legx_charsize)) -
+ LEG_EXTRA_COLUMNS - 2;
+ if(((int) strlen(text)) <= max_chars_per_line) {
+ /* case 1, entire text can fit in one line */
+ if((status = esl_strdup(text, -1, &(scl->text1))) != eslOK) esl_fatal("add_text_to_scheme_colorlegend(), error copying text");
+ return eslOK;
+ }
+ else if(((int) strlen(text)) > ((2 * max_chars_per_line) - 6)) {
+ /* case 2, entire text can't even fit in two lines,
+ * (this is inexact doesn't account for size of words which is an issue b/c we break at newline,
+ * this is why I have the extra '- 6');
+ */
+ ESL_FAIL(eslEINVAL, errbuf, "add_text_to_scheme_colorlegend(), text is %d chars, max allowed is %d (%s)\n", (int) strlen(text), ((2 * max_chars_per_line) - 6), text);
+ }
+ else { /* split it up into two lines */
+ idx = max_chars_per_line - 1;
+ while(text[idx] != ' ') {
+ idx--;
+ if(idx < 0) ESL_FAIL(eslEINVAL, errbuf, "add_text_to_scheme_colorlegend(), couldn't find a breakpoint for splitting the string (%s)\n", text);
+ }
+ /* copy first string into text1 */
+ ESL_ALLOC(scl->text1, sizeof(char) * (idx+1));
+ for(i = 0; i < idx; i++) scl->text1[i] = text[i];
+ scl->text1[idx] = '\0';
+
+ /* copy remainder into text2 */
+ int len = (int) strlen(text);
+ idx++;
+ ESL_ALLOC(scl->text2, sizeof(char) * (len - idx+1));
+ for(i = idx; i < len; i++) scl->text2[i-idx] = text[i];
+ scl->text2[len-idx] = '\0';
+ }
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "Error adding text to scheme_colorlegend probably out of memory");
+}
+
+
+/* Function: add_text_to_onecell_colorlegend()
+ *
+ * Purpose: Add text to an existing one cell color legend data structure.
+ * Throws: Exception if the text is too long.
+ */
+int
+add_text_to_onecell_colorlegend(SSPostscript_t *ps, OneCellColorLegend_t *occl, char *text, int legx_max_chars, char *errbuf)
+{
+ int status;
+ int max_chars_per_line;
+ if(occl->text != NULL) esl_fatal("add_text_to_onecell_colorlegend(), text description already exists!\n");
+ if(text == NULL) esl_fatal("add_text_to_onecell_colorlegend(), passed in text is NULL!\n");
+
+ max_chars_per_line = legx_max_chars - LEG_EXTRA_COLUMNS - 2 - ((int) (((float) ps->leg_cellsize * 1.5) / ps->legx_charsize));
+ /*printf("max: %d cur: %d text: %s\n", max_chars_per_line, (int) strlen(text), text);*/
+ if(((int) strlen(text)) > (max_chars_per_line)) {
+ ESL_FAIL(eslEINVAL, errbuf, "add_text_to_onecell_colorlegend(), text is %d chars, max allowed is %d (%s)\n", (int) strlen(text), max_chars_per_line, text);
+ }
+ if((status = esl_strdup(text, -1, &(occl->text))) != eslOK) esl_fatal("add_text_to_onecell_colorlegend(), error copying text");
+ return eslOK;
+}
+
+/* Function: add_celltext_to_onecell_colorlegend()
+ *
+ * Purpose: Add cell text to an existing one cell color legend data structure.
+ */
+int
+add_celltext_to_onecell_colorlegend(SSPostscript_t *ps, OneCellColorLegend_t *occl, char *celltext, char *errbuf)
+{
+ int status;
+ if(occl->celltext != NULL) esl_fatal("add_celltext_to_onecell_colorlegend(), cell text already exists!\n");
+ if(celltext == NULL) esl_fatal("add_celltext_to_onecell_colorlegend(), passed in celltext is NULL!\n");
+
+ if((status = esl_strdup(celltext, -1, &(occl->celltext))) != eslOK) esl_fatal("add_celltext_to_onecell_colorlegend(), error copying text");
+
+ return eslOK;
+}
+
+/* Function: add_procedure_to_onecell_colorlegend()
+ *
+ * Purpose: Add procedure for drawing one cell to an existing one cell color legend data structure.
+ */
+int
+add_procedure_to_onecell_colorlegend(SSPostscript_t *ps, OneCellColorLegend_t *occl, char *procname, float *procstack, int nprocstack, char *errbuf)
+{
+ int status;
+ int i;
+
+ if(occl->celltext != NULL) esl_fatal("add_procedure_to_onecell_colorlegend(), cell text already exists!\n");
+ if(occl->procname != NULL) esl_fatal("add_procedure_to_onecell_colorlegend(), procedure text already exists!\n");
+ if(occl->procstack != NULL) esl_fatal("add_procedure_to_onecell_colorlegend(), procedure stack already exists!\n");
+ if(procname == NULL) esl_fatal("add_procedure_to_onecell_colorlegend(), passed in procname is NULL!\n");
+ if(procstack == NULL) esl_fatal("add_procedure_to_onecell_colorlegend(), passed in procstack is NULL!\n");
+
+ if((status = esl_strdup(procname, -1, &(occl->procname))) != eslOK) esl_fatal("add_procedure_to_onecell_colorlegend(), error copying text");
+ ESL_ALLOC(occl->procstack, sizeof(float) * nprocstack);
+ for(i = 0; i < nprocstack; i++) occl->procstack[i] = procstack[i];
+ occl->nprocstack = nprocstack;
+
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+/* Function: add_page_desc_to_sspostscript()
+ *
+ * Purpose: Add text describing a particular page of a postscript object.
+ * Throws: Exception if the text is too long.
+ */
+int
+add_page_desc_to_sspostscript(SSPostscript_t *ps, int page, char *text, char *errbuf)
+{
+ int status;
+ int i, j;
+ int max_both_lines;
+
+ if(ps->descA[page] != NULL) ESL_FAIL(eslEINVAL, errbuf, "add_page_desc_to_sspostscript(), description for page %d already exists!\n", page);
+ if(text == NULL) ESL_FAIL(eslEINVAL, errbuf, "add_page_desc_to_sspostscript(), passed in text is NULL!\n");
+
+ max_both_lines =(2. * ps->desc_max_chars);
+ if(ps->modeA[page] == INDIMODE || ps->modeA[page] == SIMPLEMASKMODE)
+ max_both_lines--; /* b/c we have to add a '-' to split up the larger strings onto 2 lines */
+
+ /* check to see if we can fit the text onto two lines of max width ps->desc_max_chars */
+ int textlen = (int) strlen(text);
+ if(textlen <= ps->desc_max_chars) { /* fine, this will fit on one line */
+ if((status = esl_strdup(text, -1, &(ps->descA[page]))) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "add_page_desc_to_sspostscript(), error copying text");
+ }
+ else if (textlen <= max_both_lines) {
+ if(ps->modeA[page] == ALIMODE) {
+ /* maybe fine, make sure there's a break point (space ' ') that will break this string into two strings of length <= ps->desc_max_chars */
+ i = ps->desc_max_chars;
+ while(text[i] != ' ' && text[i] != '-') {
+ i--;
+ if(i < 0) ESL_FAIL(eslEINVAL, errbuf, "add_page_desc_to_sspostscript(), first word of text (%s) is more than max allowed of %d chars", text, ps->desc_max_chars);
+ }
+ /* found last space before max width, make sure it breaks the line up into two chunks of valid size */
+ if((textlen - (i+1)) <= ps->desc_max_chars) { /* we're good */
+ if((status = esl_strdup(text, -1, &(ps->descA[page]))) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "add_page_desc_to_sspostscript(), error copying text");
+ ps->descA[page][i] = '\n'; /* so we can remember where the break is */
+ }
+ else ESL_FAIL(eslEINVAL, errbuf, "add_page_desc_to_sspostscript(), couldn't find (' ') for splitting text into two chunks (%s)", text);
+ }
+ else { /* INDIMODE or SIMPLEMASKMODE, sequence/mask name bigger than 1 line, but not 2, we put a '-' in it at the end of line 1 and add a '\n' so we remember where it was */
+ ESL_ALLOC(ps->descA[page], sizeof(char) * (textlen + 3)); /* +3 so we have space for the extra '-' and '\n' */
+ for(i = 0; i < ps->desc_max_chars; i++) ps->descA[page][i] = text[i];
+ i = ps->desc_max_chars;
+ ps->descA[page][i] = '-';
+ i++;
+ ps->descA[page][i] = '\n';
+ for(i = ps->desc_max_chars; i < textlen; i++) ps->descA[page][i+2] = text[i];
+ ps->descA[page][textlen+2] = '\0';
+ }
+ }
+ else /* the text won't fit on two lines */
+ if(ps->modeA[page] != INDIMODE) { /* not fine, this won't fit on two lines */
+ ESL_FAIL(eslEINVAL, errbuf, "add_page_desc_to_sspostscript(), text is %d chars, max allowed is %d (%s)\n", textlen, max_both_lines, text);
+ }
+ else { /* INDIMODE or SIMPLEMASKMODE, sequence/mask name exceeds max, we put a '-' in it at the end of line 1 and truncate it */
+ ESL_ALLOC(ps->descA[page], sizeof(char) * (max_both_lines + 2)); /* +2 so we have space for the extra '\n' (which we won't print), and the '\0' */
+ /* first look to see if there's a space before desc_max_chars, this will never happen for a seq name, but may for a mask description */
+ j = ps->desc_max_chars;
+ while(text[j] != ' ' && j > 0) {
+ j--;
+ }
+ if(j == 0) { j = ps->desc_max_chars; } /* no space */
+ for(i = 0; i < j; i++) ps->descA[page][i] = text[i];
+ i = j;
+ if(j == ps->desc_max_chars && text[j] != ' ') {
+ ps->descA[page][i] = '-';
+ }
+ i++;
+ ps->descA[page][i] = '\n';
+ for(i = j; i < j + ps->desc_max_chars; i++) ps->descA[page][i+2] = text[i];
+ ps->descA[page][i+2] = '\0';
+ }
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "add_page_desc_to_sspostscript() error, probably out of memory.");
+}
+
+
+/* Function: add_diffmask_page_desc_to_sspostscript()
+ *
+ * Purpose: Add text describing a diff mask page of a postscript object.
+ * Throws: Exception if the text is too long.
+ */
+int
+add_diffmask_page_desc_to_sspostscript(SSPostscript_t *ps, int page, char *mask_file, char *maskdiff_file, char *errbuf)
+{
+ int status;
+ int i;
+ char *mask1desc = NULL;
+ char *mask2desc = NULL;
+ int len2copy;
+ int mask_file_len;
+ int maskdiff_file_len;
+ void *tmp;
+
+ if(ps->mask == NULL) ESL_FAIL(eslEINVAL, errbuf, "add_diffmask_page_desc_to_sspostscript(), ps->mask is NULL\n");
+ if(ps->descA[page] != NULL) ESL_FAIL(eslEINVAL, errbuf, "add_diffmask_page_desc_to_sspostscript(), description for page %d already exists!\n", page);
+ if(maskdiff_file == NULL) ESL_FAIL(eslEINVAL, errbuf, "add_diffmask_page_desc_to_sspostscript(), passed in maskdiff_file is NULL!\n");
+
+ /* check to see if we can fit the text onto two lines of max width ps->desc_max_chars */
+ mask_file_len = (int) strlen(ps->mask);
+ maskdiff_file_len = (int) strlen(maskdiff_file);
+ if((status = esl_strcat(&(mask1desc), -1, "mask 1: ", -1)) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "add_diffmask_page_desc_to_sspostscript(), error copying text");
+ if((mask_file_len + 8) <= ps->desc_max_chars) { /* this will fit on one line */
+ if((status = esl_strcat(&(mask1desc), -1, mask_file, -1)) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "add_diffmask_page_desc_to_sspostscript(), error copying text");
+ }
+ else { /* won't fit on one line, include as much as we can */
+ len2copy = ps->desc_max_chars - 8 - 3; /* 8 is for "mask 1: " at beginning, 3 is for "..." at end */
+ ESL_RALLOC(mask1desc, tmp, sizeof(char) * ps->desc_max_chars+1);
+ for(i = 0; i < len2copy; i++) {
+ mask1desc[8+i] = mask_file[i];
+ }
+ mask1desc[8+len2copy] = '.';
+ mask1desc[8+len2copy+1] = '.';
+ mask1desc[8+len2copy+2] = '.';
+ mask1desc[8+len2copy+3] = '\0';
+ }
+
+ /* repeat for mask 2 */
+ if((status = esl_strcat(&(mask2desc), -1, "mask 2: ", -1)) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "add_diffmask_page_desc_to_sspostscript(), error copying text");
+ if((maskdiff_file_len + 8) <= ps->desc_max_chars) { /* this will fit on one line */
+ if((status = esl_strcat(&(mask2desc), -1, maskdiff_file, -1)) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "add_diffmask_page_desc_to_sspostscript(), error copying text");
+ }
+ else { /* won't fit on one line, include as much as we can */
+ len2copy = ps->desc_max_chars - 8 - 3; /* 8 is for "mask 1: " at beginning, 3 is for "..." at end */
+ ESL_RALLOC(mask2desc, tmp, sizeof(char) * ps->desc_max_chars+1);
+ for(i = 0; i < len2copy; i++) {
+ mask2desc[8+i] = maskdiff_file[i];
+ }
+ mask2desc[8+len2copy] = '.';
+ mask2desc[8+len2copy+1] = '.';
+ mask2desc[8+len2copy+2] = '.';
+ mask2desc[8+len2copy+3] = '\0';
+ }
+
+ /* concatenate them in ps->descA[page] */
+ if((status = esl_strcat(&(ps->descA[page]), -1, mask1desc, -1)) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "add_diffmask_page_desc_to_sspostscript(), error copying text");
+ if((status = esl_strcat(&(ps->descA[page]), -1, "\n", -1)) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "add_diffmask_page_desc_to_sspostscript(), error copying text");
+ if((status = esl_strcat(&(ps->descA[page]), -1, mask2desc, -1)) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "add_diffmask_page_desc_to_sspostscript(), error copying text");
+
+ free(mask1desc);
+ free(mask2desc);
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "add_page_desc_to_sspostscript() error, probably out of memory.");
+}
+
+/* Function: add_mask_to_sspostscript
+ *
+ * Purpose: Add a mask to a sspostscript object.
+ */
+int
+add_mask_to_ss_postscript(SSPostscript_t *ps, char *mask)
+{
+ int status;
+ if(ps->mask != NULL) { esl_fatal("add_mask_to_ss_postscript(), mask is non-null!\n"); }
+ if(mask == NULL) esl_fatal("add_mask_to_ss_postscript(), passed in mask is NULL!\n");
+ if((status = esl_strdup(mask, -1, &(ps->mask))) != eslOK) esl_fatal("add_mask_to_ss_postscript(), error copying mask");
+ return eslOK;
+}
+
+
+/* Function: draw_legend_column_headers()
+ *
+ * Purpose: Draw the legend column headers.
+ * Return: eslOK
+ */
+static int
+draw_legend_column_headers(FILE *fp, SSPostscript_t *ps, int pagenum, char *errbuf)
+{
+ int status;
+ int i;
+ float x, y;
+ // float legend_fontsize;
+ char *cur_string;
+ int cur_width = 0;
+
+ //legend_fontsize = LEG_FONTSIZE_UNSCALED / ps->scale;
+
+ x = ps->legx;
+ y = ps->cur_legy;
+ if(ps->mask != NULL && ps->modeA[pagenum] == ALIMODE) {
+ y -= 1.25 * (float) ps->leg_cellsize;
+ }
+ /*fprintf(fp, "/%s findfont %f scalefont setfont\n", SPECIAL_FONT, legend_fontsize);*/
+ fprintf(fp, "%% begin legend column headers\n");
+ fprintf(fp, "(%s) %.2f %.2f moveto show\n", "LEGEND", x, (y + ((float) ps->leg_cellsize * .25)));
+ /*fprintf(fp, "/%s findfont %f scalefont setfont\n", LEG_FONT, legend_fontsize);*/
+
+ x = ps->legx_stats;
+ y = ps->cur_legy;
+ cur_width = ps->legx_max_chars -
+ ((int) ps->leg_rhs_space / ps->legx_charsize) -
+ ((int) (PAGE_SIDEBUF / ps->legx_charsize)) -
+ LEG_EXTRA_COLUMNS - 2;
+
+ ESL_ALLOC(cur_string, sizeof(char) * (cur_width+1));
+ for(i = 0; i < cur_width; i++) cur_string[i] = '-';
+ cur_string[cur_width] = '\0';
+
+ if(ps->mask != NULL && ps->modeA[pagenum] == ALIMODE) {
+ fprintf(fp, "(%4s %4s) %.2f %.2f moveto show\n", "", "incl", x, (y + ((float) ps->leg_cellsize * .25)));
+ y -= 0.625 * (float) ps->leg_cellsize;
+ fprintf(fp, "(%4s %4s) %.2f %.2f moveto show\n", "", " by ", x, (y + ((float) ps->leg_cellsize * .25)));
+ y -= 0.625 * (float) ps->leg_cellsize;
+ fprintf(fp, "(%4s %4s) %.2f %.2f moveto show\n", "all", "mask", x, (y + ((float) ps->leg_cellsize * .25)));
+ y -= 0.625 * (float) ps->leg_cellsize;
+ fprintf(fp, "(%s) %.2f %.2f moveto show\n", cur_string, ps->legx, (y + ((float) ps->leg_cellsize * .25)));
+ fprintf(fp, "(---- ----) %.2f %.2f moveto show\n", x, (y + ((float) ps->leg_cellsize * .25)));
+ }
+ else {
+ fprintf(fp, "(%5s) %.2f %.2f moveto show\n", "count", x, (y + ((float) ps->leg_cellsize * .25)));
+ y -= 0.625 * (float) ps->leg_cellsize;
+ fprintf(fp, "(%s) %.2f %.2f moveto show\n", cur_string, ps->legx, (y + ((float) ps->leg_cellsize * .25)));
+ fprintf(fp, "(-----) %.2f %.2f moveto show\n", x, (y + ((float) ps->leg_cellsize * .25)));
+ }
+ ps->cur_legy = y - (1.0 * (float) ps->leg_cellsize);
+
+ fprintf(fp, "%% end legend column headers\n\n");
+ free(cur_string);
+
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "ERROR drawing legend column headers, probably out of memory.");
+}
+
+/* Function: draw_onecell_colorlegend()
+ *
+ * Purpose: Print a one cell color legend to an open file.
+ * Return: eslOK, dies if we run out of memory.
+ */
+static int
+draw_onecell_colorlegend(FILE *fp, OneCellColorLegend_t *occl, SSPostscript_t *ps, int occl_idx, int pagenum)
+{
+ int status;
+ float x, y;
+ int cp, i;
+ float fontsize;
+ char *cur_string;
+ int cur_width = 0;
+
+ /* object is valid, print it */
+ x = ps->legx;
+ y = ps->cur_legy;
+
+ /* print cell */
+ fprintf(fp, "%% begin one cell color legend\n");
+ if(occl->celltext == NULL && occl->procname == NULL) { /* print a colored block as the cell */
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", x, y);
+ fprintf(fp, " 0 %.3f rlineto %.3f 0 rlineto 0 %.3f rlineto closepath\n", (float) ps->leg_cellsize, (float) ps->leg_cellsize, (-1 * (float) ps->leg_cellsize));
+ fprintf(fp, " ");
+ for(cp = 0; cp < NCMYK; cp++) fprintf(fp, "%.2f ", occl->col[cp]);
+ fprintf(fp, "setcmykcolor\n");
+ fprintf(fp, " fill\n");
+
+ /* draw a small box outlining the colored block we just drew */
+ /*fprintf(fp, "%.2f setlinewidth\n", (ps->leg_cellsize / 24.));
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", x, y);
+ fprintf(fp, " 0 %.3f rlineto %.3f 0 rlineto 0 %.3f rlineto closepath\n", (float) ps->leg_cellsize, (float) ps->leg_cellsize, (-1 * (float) ps->leg_cellsize));
+ fprintf(fp, " ");
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", 0., 0., 0., 1.);
+ fprintf(fp, " stroke\n");*/
+ }
+ else if (occl->procname != NULL) {
+ fprintf(fp, "%.2f %.2f ", x, y);
+ for(i = 0; i < occl->nprocstack; i++) { fprintf(fp, "%.2f ", occl->procstack[i]); }
+ fprintf(fp, "%s\n", occl->procname);
+ }
+ else if (occl->celltext != NULL){
+ /* fontsize = (float) ps->leg_cellsize / strlen(occl->celltext); */
+ fontsize = (float) ps->leg_cellsize / 2;
+ fprintf(fp, "/%s findfont %f scalefont setfont\n", NUCLEOTIDES_FONT, fontsize);
+ for(cp = 0; cp < NCMYK; cp++) fprintf(fp, "%.2f ", occl->col[cp]);
+ fprintf(fp, "setcmykcolor\n");
+ fprintf(fp, "(%s) %.2f %.2f moveto show\n", occl->celltext, x, y + ((float) ps->leg_cellsize * 0.25));
+ }
+ if(occl->celltext == NULL || (strlen(occl->celltext) > 0)) {
+ /* if we printed a block or text, modify x, so text for the legend is indented appropriately */
+ x += (float) ps->leg_cellsize * 1.5;
+ }
+ fontsize = LEG_FONTSIZE_UNSCALED / ps->scale;
+
+ /* print text for this legend */
+ if(occl->text != NULL) {
+ /* back to black */
+ fprintf(fp, " 0.00 0.00 0.00 1.00 setcmykcolor\n");
+ fprintf(fp, "/%s findfont %f scalefont setfont\n", LEG_FONT, fontsize);
+ fprintf(fp, "(%s) %.2f %.2f moveto show\n", occl->text, x, y + ((float) ps->leg_cellsize * 0.25));
+
+ /* print stats */
+ if(occl->nres != OCCL_BLANK_COUNT) {
+ x = ps->legx_stats;
+ if(ps->mask != NULL && ps->modeA[pagenum] == ALIMODE) {
+ fprintf(fp, "(%4d %4d) %.2f %.2f moveto show\n", occl->nres, occl->nres_masked, x, y + ((float) ps->leg_cellsize * 0.25));
+ }
+ else {
+ fprintf(fp, "(%5d) %.2f %.2f moveto show\n", occl->nres, x, y + ((float) ps->leg_cellsize * 0.25));
+ }
+ }
+ }
+
+ /* reset color to black */
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", 0., 0., 0., 1.);
+
+ if(occl->do_separator) {
+ cur_width = ps->legx_max_chars -
+ ((int) ps->leg_rhs_space / ps->legx_charsize) -
+ ((int) (PAGE_SIDEBUF / ps->legx_charsize)) -
+ LEG_EXTRA_COLUMNS - 2;
+ ESL_ALLOC(cur_string, sizeof(char) * (cur_width+1));
+ for(i = 0; i < cur_width; i++) cur_string[i] = '-';
+ cur_string[cur_width] = '\0';
+ fprintf(fp, "(%s) %.2f %.2f moveto show\n", cur_string, ps->legx, (y - ((float) ps->leg_cellsize * 0.5)));
+ fprintf(fp, "(-----) %.2f %.2f moveto show\n", (float) ps->legx_stats, (y - ((float) ps->leg_cellsize * 0.5)));
+ y -= (float) ps->leg_cellsize * 0.5;
+ free(cur_string);
+ }
+
+ /* y -= (float) ps->leg_cellsize * 1.5; */
+ if(occl->do_no_vspace) { y -= (float) (ps->leg_cellsize / COURIER_HEIGHT_WIDTH_RATIO) * 1.25; }
+ else { y -= (float) ps->leg_cellsize * 1.25; }
+ ps->cur_legy = y;
+
+
+ fprintf(fp, "%% end one cell color legend\n\n");
+ return eslOK;
+
+ ERROR: esl_fatal("ERROR drawing one cell legend, probably out of memory.");
+ return eslEMEM; /* never reached */
+}
+
+
+/* Function: draw_scheme_colorlegend()
+ *
+ * Purpose: Print a scheme color legend to an open file.
+ * Return: eslOK
+ */
+static int
+draw_scheme_colorlegend(const ESL_GETOPTS *go, FILE *fp, SchemeColorLegend_t *scl, float **hc_scheme, SSPostscript_t *ps, int pagenum)
+{
+ float x, y;
+ int cp;
+ int c,i,n1s;
+ float fontsize;
+ int do_circle_mask, do_square_mask, do_x_mask, do_border;
+ int do_mask;
+ float old_x;
+
+ do_mask = ((ps->mask != NULL) && (scl->use_mask)) ? TRUE : FALSE;
+ do_border = (!esl_opt_GetBoolean(go, "--mask-a"));
+ do_circle_mask = do_square_mask = do_x_mask = FALSE;
+ if(esl_opt_GetBoolean(go, "--mask-u")) { do_square_mask = TRUE; }
+ else if(esl_opt_GetBoolean(go, "--mask-x")) { do_x_mask = TRUE; }
+ else do_circle_mask = TRUE;
+
+ x = ps->legx;
+ y = ps->cur_legy;
+ //y = ps->legy - (ps->nocclA[pagenum] * ((float) ps->leg_cellsize * 1.5));
+ fontsize = LEG_FONTSIZE_UNSCALED / ps->scale;
+ fprintf(fp, "%% begin color scheme legend\n");
+ fprintf(fp, "/%s findfont %f scalefont setfont\n", LEG_FONT, fontsize);
+ fprintf(fp, " 0.00 0.00 0.00 1.00 setcmykcolor\n");
+
+ float colvec[NCMYK];
+ colvec[0] = colvec[1] = colvec[2] = 0.;
+ colvec[3] = 1.0;
+ if(do_mask) { /* print cells showing difference between masked and unmasked */
+ /*x -= (float) ps->leg_cellsize;*/
+ /*y -= (float) ps->leg_cellsize;*/
+ fprintf(fp, "%.1f setlinewidth\n", (float) ps->leg_cellsize/4.);
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", x, y);
+ fprintf(fp, " 0 %.3f rlineto %.3f 0 rlineto 0 %.3f rlineto closepath\n", (float) ps->leg_cellsize, (float) ps->leg_cellsize, (-1 * (float) ps->leg_cellsize));
+ fprintf(fp, " ");
+ for(cp = 0; cp < NCMYK; cp++) {
+ fprintf(fp, "%.2f ", colvec[cp]);
+ }
+ fprintf(fp, "setcmykcolor\n");
+ fprintf(fp, " fill\n");
+
+ /* print label */
+ x += (float) ps->leg_cellsize * 1.5;
+ y += (float) ps->leg_cellsize * 0.625;
+ fprintf(fp, "(included by mask) %.2f %.2f moveto show\n", x, y);
+ y -= (float) ps->leg_cellsize * 0.625;
+ fprintf(fp, "((all colors)) %.2f %.2f moveto show\n", x, y);
+ x -= (float) ps->leg_cellsize * 1.5;
+
+ /* print stats for included by mask */
+ old_x = x;
+ n1s = 0;
+ for(i = 0; i < ps->rflen; i++) if(ps->mask[i] == '1') n1s++;
+ x = ps->legx_stats;
+ y += (float) ps->leg_cellsize * 0.3125;
+ fprintf(fp, "(%4d %4d) %.2f %.2f moveto show\n", n1s, n1s, x, y);
+ y -= (float) ps->leg_cellsize * 0.3125;
+
+ x = old_x;
+ y -= (float) ps->leg_cellsize * 1.5;
+ draw_masked_block(fp, x, y, colvec, do_circle_mask, do_square_mask, do_x_mask, do_border, (float) ps->leg_cellsize);
+
+ x += (float) ps->leg_cellsize * 1.5;
+ y += (float) ps->leg_cellsize * 0.625;
+ fprintf(fp, "(excluded by mask) %.2f %.2f moveto show\n", x, y);
+ y -= (float) ps->leg_cellsize * 0.625;
+ fprintf(fp, "((all colors)) %.2f %.2f moveto show\n", x, y);
+
+ /* print stats for excluded by mask */
+ x = ps->legx_stats;
+ y += (float) ps->leg_cellsize * 0.3125;
+ fprintf(fp, "(%4d %4d) %.2f %.2f moveto show\n", ps->rflen-n1s, 0, x, y);
+
+ y -= (float) ps->leg_cellsize * 1.8125;
+ x = ps->legx;
+ }
+
+ /* print text for this legend */
+ if(scl->text1 != NULL) {
+ if(scl->text2 == NULL) {
+ fprintf(fp, "(%s:) %.2f %.2f moveto show\n", scl->text1, x, (y + ((float) ps->leg_cellsize * .25)));
+ }
+ else {
+ fprintf(fp, "(%s) %.2f %.2f moveto show\n", scl->text1, x, (y + ((float) ps->leg_cellsize * .25)));
+ y -= (float) ps->leg_cellsize * 0.625;
+ fprintf(fp, "(%s:) %.2f %.2f moveto show\n", scl->text2, x, (y + ((float) ps->leg_cellsize * .25)));
+ }
+ }
+ y -= (float) ps->leg_cellsize;
+
+ /* print scheme color cells and labels next to them */
+ for(c = 0; c < scl->nbins; c++) {
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", x, y);
+ fprintf(fp, " 0 %.3f rlineto %.3f 0 rlineto 0 %.3f rlineto closepath\n", (float) ps->leg_cellsize, (float) ps->leg_cellsize, (-1 * (float) ps->leg_cellsize));
+ fprintf(fp, " ");
+ for(cp = 0; cp < NCMYK; cp++) {
+ fprintf(fp, "%.2f ", hc_scheme[c][cp]);
+ }
+ fprintf(fp, "setcmykcolor\n");
+ fprintf(fp, " fill\n");
+
+ /* draw a small box outlining the colored block we just drew */
+ /*fprintf(fp, "%.2f setlinewidth\n", (ps->leg_cellsize / 24.));
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", x, y);
+ fprintf(fp, " 0 %.3f rlineto %.3f 0 rlineto 0 %.3f rlineto closepath\n", (float) ps->leg_cellsize, (float) ps->leg_cellsize, (-1 * (float) ps->leg_cellsize));
+ fprintf(fp, " ");
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", 0., 0., 0., 1.);
+ fprintf(fp, " stroke\n");*/
+
+ /* print label */
+ x += (float) ps->leg_cellsize * 1.5;
+ y += (float) ps->leg_cellsize * 0.25;
+ fprintf(fp, " 0.00 0.00 0.00 1.00 setcmykcolor\n");
+ if(esl_FCompare(scl->limits[c+1], SSDRAWINFINITY, eslSMALLX1) == eslOK) { /* max value is infinity, special case */
+ if(c != scl->nbins-1) esl_fatal("ERROR when drawing color legend, limits[%d] is INFINITY, but this is reserved only for the max limit", c+1);
+ if(scl->ints_only_flag) fprintf(fp, "(>=%d) %.2f %.2f moveto show\n", (int) scl->limits[c], x, y);
+ else fprintf(fp, "(>=%3.f) %.2f %.2f moveto show\n", scl->limits[c], x, y);
+ }
+ else if(scl->ints_only_flag) {
+ if(c == scl->nbins-1) {
+ fprintf(fp, "(\\[%d-%d\\]) %.2f %.2f moveto show\n", (int) scl->limits[c], (int) scl->limits[c+1], x, y);
+ }
+ else if(esl_FCompare(scl->limits[c], scl->limits[c+1]-1, eslSMALLX1) == eslOK) { /* next limit is exactly 1 plus cur limit, don't do range, define single int */
+ if(compare_two_cmyk_colors(hc_scheme[c][ICYAN], hc_scheme[c][IMGTA], hc_scheme[c][IYELW], hc_scheme[c][IBLCK], WHITE_C, WHITE_M, WHITE_Y, WHITE_K)) {
+ /* color is white and won't show up on our white background, so we explicitly state (blank) next to it's color value */
+ fprintf(fp, "(\\(blank\\) %d) %.2f %.2f moveto show\n", (int) scl->limits[c], x, y);
+ }
+ else {
+ fprintf(fp, "(%d) %.2f %.2f moveto show\n", (int) scl->limits[c], x, y);
+ }
+ }
+ else {
+ fprintf(fp, "(\\[%d-%d\\]) %.2f %.2f moveto show\n", (int) scl->limits[c], (int) scl->limits[c+1]-1, x, y);
+ }
+ }
+ else {
+ if(c == scl->nbins-1) fprintf(fp, "(\\[%.3f-%.3f\\%c) %.2f %.2f moveto show\n", scl->limits[c], scl->limits[c+1], (scl->high_inclusive ? ']' : ')'), x, y);
+ else if(c == 0) fprintf(fp, "(\\%c%.3f-%.3f\\)) %.2f %.2f moveto show\n", (scl->low_inclusive ? '[' : '('), scl->limits[c], scl->limits[c+1], x, y);
+ else fprintf(fp, "(\\[%.3f-%.3f\\)) %.2f %.2f moveto show\n", scl->limits[c], scl->limits[c+1], x, y);
+ }
+ /* print stats */
+ old_x = x;
+ x = ps->legx_stats;
+ if(do_mask) {
+ fprintf(fp, "(%4d %4d) %.2f %.2f moveto show\n", scl->counts[c], scl->counts_masked[c], x, y);
+ }
+ else {
+ fprintf(fp, "(%5d) %.2f %.2f moveto show\n", scl->counts[c], x, y);
+ }
+
+ x = old_x - (float) ps->leg_cellsize * 1.5;
+ y -= (float) ps->leg_cellsize * 0.25;
+ y -= (float) ps->leg_cellsize;
+ }
+
+ /* reset color to black */
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", 0., 0., 0., 1.);
+ fprintf(fp, "%% end color scheme legend\n\n");
+
+ ps->cur_legy = y;
+ return eslOK;
+}
+
+
+/* Function: draw_text_section_in_legend()
+ *
+ * Purpose: Print a text section in the legend section.
+ * Return: eslOK, dies if we run out of memory.
+ */
+static int
+draw_text_section_in_legend(FILE *fp, TextLegend_t *tl, SSPostscript_t *ps, int tl_idx, int pagenum)
+{
+ int status;
+ float x, y;
+ int i;
+ float fontsize;
+ char *cur_string;
+ int cur_width = 0;
+
+ x = ps->legx;
+ y = ps->cur_legy;
+
+ /* print cell */
+ fprintf(fp, "%% begin text legend\n");
+ fontsize = LEG_EXTRA_TEXT_FONTSIZE_UNSCALED / ps->scale;
+ /* print text for this legend */
+
+ /* back to black */
+ fprintf(fp, " 0.00 0.00 0.00 1.00 setcmykcolor\n");
+ fprintf(fp, "/%s findfont %f scalefont setfont\n", LEG_EXTRA_TEXT_FONT, fontsize);
+ for(i = 0; i < tl->nlines; i++) {
+ fprintf(fp, "(%s) %.2f %.2f moveto show\n", tl->text_per_line[i], x, y);
+ y -= (float) fontsize * 1.25;
+ }
+ if(tl->do_separator) {
+ cur_width = ps->legx_max_chars - ((int) (PAGE_SIDEBUF / ps->legx_charsize)) - LEG_EXTRA_COLUMNS - 2;
+ ESL_ALLOC(cur_string, sizeof(char) * (cur_width+1));
+ for(i = 0; i < cur_width; i++) cur_string[i] = '-';
+ cur_string[cur_width] = '\0';
+ fprintf(fp, "(%s) %.2f %.2f moveto show\n", cur_string, ps->legx, (y - ((float) ps->leg_cellsize * 0.5)));
+ fprintf(fp, "(-----) %.2f %.2f moveto show\n", (float) ps->legx_stats, (y - ((float) ps->leg_cellsize * 0.5)));
+ y -= (float) ps->leg_cellsize * 0.5;
+ free(cur_string);
+ }
+ ps->cur_legy = y - (1.0 * (float) ps->leg_cellsize);
+
+ fprintf(fp, "%% end text legend\n\n");
+ return eslOK;
+
+ ERROR: esl_fatal("ERROR drawing text legend, probably out of memory.");
+ return eslEMEM; /* never reached */
+}
+
+/* Function: draw_sspostscript()
+ *
+ * Purpose: Print a SS postscript data structure.
+ * Return: eslOK on success;
+ * eslEINCOMPAT if ps->npage == 0
+ */
+static int
+draw_sspostscript(FILE *fp, const ESL_GETOPTS *go, char *errbuf, char *command, char *date, float ***hc_scheme, SSPostscript_t *ps)
+{
+ int status;
+ int p, pi, i, c, l;
+ int do_circle_mask, do_square_mask, do_x_mask, do_border;
+ int *page_orderA;
+
+ if(ps->modelname == NULL) ESL_FAIL(eslEINVAL, errbuf, "Error, failed to read modelname from template file.");
+
+ do_border = (!esl_opt_GetBoolean(go, "--mask-a"));
+ do_circle_mask = do_square_mask = do_x_mask = FALSE;
+ if(esl_opt_GetBoolean(go, "--mask-u")) { do_square_mask = TRUE; }
+ else if(esl_opt_GetBoolean(go, "--mask-x")) { do_x_mask = TRUE; }
+ else do_circle_mask = TRUE;
+
+ if(ps->npage == 0) ESL_FAIL(eslEINCOMPAT, errbuf, "draw_sspostscript, ps->npage == 0\n");
+
+ /* determine print order of pages, currently this is just 0..npage-1 */
+ ESL_ALLOC(page_orderA, sizeof(int) * ps->npage);
+ for(pi = 0; pi < ps->npage; pi++) page_orderA[pi] = pi;
+
+ /* define procedures */
+ fprintf(fp, "%% ------------------------------------------------------------\n");
+ fprintf(fp, "%% Procedure definitions\n");
+ define_outline_procedure(fp);
+ fprintf(fp, "%% ------------------------------------------------------------\n");
+
+ /* draw the pages */
+ for(pi = 0; pi < ps->npage; pi++) {
+ p = page_orderA[pi];
+ ps->cur_legy = ps->legy;
+
+ /* print postscript comment header, only visible if viewed in text mode */
+ fprintf(fp, "%% ------------------------------------------------------------\n");
+ fprintf(fp, "%% Postscript file created by esl-ssdraw (page %d of %d)\n", pi+1, ps->npage);
+ fprintf(fp, "%% ------------------------------------------------------------\n");
+ fprintf(fp, "%% msafile: %s (%d seqs)\n", esl_opt_GetArg(go, 1), ps->msa_nseq);
+ fprintf(fp, "%% templatefile: %s\n", esl_opt_GetArg(go, 2));
+ fprintf(fp, "%% modelname: %s\n", ps->modelname);
+ fprintf(fp, "%% consensus-len: %d\n", ps->rflen);
+ if(esl_opt_IsOn(go, "--mask")) {
+ fprintf(fp, "%% maskfile: %s\n", esl_opt_GetString(go, "--mask"));
+ }
+ if(esl_opt_IsOn(go, "--mask-diff")) {
+ fprintf(fp, "%% difffile: %s\n", esl_opt_GetString(go, "--mask-diff"));
+ }
+ if(esl_opt_IsOn(go, "--dfile")) {
+ fprintf(fp, "%% dfile: %s\n", esl_opt_GetString(go, "--dfile"));
+ }
+ if(esl_opt_IsOn(go, "--efile")) {
+ fprintf(fp, "%% efile: %s\n", esl_opt_GetString(go, "--efile"));
+ }
+ if(esl_opt_IsOn(go, "--ifile")) {
+ fprintf(fp, "%% ifile: %s\n", esl_opt_GetString(go, "--ifile"));
+ }
+ fprintf(fp, "%%\n");
+
+ /* scale section */
+ fprintf(fp, "%.2f %.2f scale\n\n", ps->scale, ps->scale);
+
+ /* header section */
+ if((status = draw_header_and_footer(fp, go, errbuf, ps, p, pi+1)) != eslOK) return status;
+
+ /* regurgitated section */
+ if(ps->regurgA != NULL) {
+ fprintf(fp, "%% begin regurgitate\n");
+ for(i = 0; i < ps->nregurg; i++)
+ fprintf(fp, "%s", ps->regurgA[i]);
+ fprintf(fp, "%% end regurgitate\n\n");
+ }
+
+ /* 'text positiontext' section */
+ for(i = 0; i < ps->nposntext; i++) {
+ if(i == 0) {
+ fprintf(fp, "%% begin text positiontext\n");
+ fprintf(fp, "/%s findfont %.2f scalefont setfont\n", POSNTEXT_FONT, POSNTEXT_FONTSIZE);
+ fprintf(fp, "0.00 0.00 0.00 1.00 setcmykcolor\n"); /* black */
+ }
+ fprintf(fp, "%s %.2f %.2f moveto show\n", ps->posntextA[i], ps->posntextxA[i], ps->posntextyA[i]);
+ if(i == (ps->nposntext-1)) {
+ fprintf(fp, "%% end text positiontext\n\n");
+ }
+ }
+
+ /* 'lines bpconnects' section */
+ for(i = 0; i < ps->nbp; i++) {
+ if(i == 0) {
+ fprintf(fp, "%% begin lines bpconnects\n");
+ fprintf(fp, "%.2f setlinewidth\n", BP_LINEWIDTH);
+ fprintf(fp, "0.00 0.00 0.00 1.00 setcmykcolor\n"); /* black */
+ }
+ fprintf(fp, "%.2f %.2f %.2f %.2f newpath moveto lineto stroke\n", ps->bpx1A[i], ps->bpy1A[i], ps->bpx2A[i], ps->bpy2A[i]);
+ if(i == (ps->nbp-1)) {
+ fprintf(fp, "%% end lines bpconnects\n\n");
+ }
+ }
+
+ /* print out remainder of the page */
+ /* fprintf(fp, "%% begin ignore\n"); */
+ fprintf(fp, "0.00 0.00 0.00 1.00 setcmykcolor\n"); /* set to black */
+ fprintf(fp, "/%s findfont %f scalefont setfont\n\n", LEG_FONT, LEG_FONTSIZE_UNSCALED / ps->scale);
+
+ /* draw legend headers, if we have a legend (only legend text doesn't require legend headers) */
+ if((ps->nocclA[p] > 0) || (ps->sclAA != NULL && ps->sclAA[p] != NULL)) {
+ if(! (esl_opt_GetBoolean(go, "--no-leg"))) {
+ if((status = draw_legend_column_headers(fp, ps, p, errbuf)) != eslOK) return status;
+ }
+ }
+
+ /* print one cell color legends, if any */
+ if(ps->occlAAA != NULL && ps->occlAAA[p] != NULL) {
+ for(l = 0; l < ps->nocclA[p]; l++) {
+ if(! (esl_opt_GetBoolean(go, "--no-leg"))) {
+ draw_onecell_colorlegend(fp, ps->occlAAA[p][l], ps, l, p);
+ }
+ }
+ }
+ /* print scheme color legends, if any */
+ if(ps->sclAA != NULL && ps->sclAA[p] != NULL) {
+ if(! (esl_opt_GetBoolean(go, "--no-leg"))) {
+ draw_scheme_colorlegend(go, fp, ps->sclAA[p], hc_scheme[ps->sclAA[p]->scheme], ps, p);
+ }
+ }
+ /* print text legends, if any */
+ if(ps->tlAAA != NULL && ps->tlAAA[p] != NULL) {
+ for(l = 0; l < ps->ntlA[p]; l++) {
+ if(! (esl_opt_GetBoolean(go, "--no-leg"))) {
+ draw_text_section_in_legend(fp, ps->tlAAA[p][l], ps, l, p);
+ }
+ }
+ }
+
+ if(ps->bcolAAA != NULL && ps->bcolAAA[p] != NULL) {
+ fprintf(fp, "%% begin colored positions\n");
+ if(ps->mask != NULL && ps->modeA[p] != SIMPLEMASKMODE && ps->modeA[p] != INDIMODE) {
+ fprintf(fp, "2.0 setlinewidth\n");
+ if(do_border && do_x_mask) { fprintf(fp, "1.0 setlinewidth\n"); }
+ if(do_border && do_square_mask) { fprintf(fp, "2.0 setlinewidth\n"); }
+ if(do_border && do_circle_mask) { fprintf(fp, "2.5 setlinewidth\n"); }
+ for(c = 0; c < ps->rflen; c++) {
+ fprintf(fp, "%snucleotide %d\n", "%", c+1);
+ if(ps->mask[c] == '0') {
+ draw_masked_block(fp, ps->rxA[c]-1., ps->ryA[c]-1., ps->bcolAAA[p][c], do_circle_mask, do_square_mask, do_x_mask, do_border, CELLSIZE);
+ }
+ else { /* cell is within mask, ps->mask[c] == '1' */
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", ps->rxA[c] - (CELLSIZE * CELL_XOFFSET_FRACTION), ps->ryA[c] - (CELLSIZE * CELL_YOFFSET_FRACTION));
+ fprintf(fp, " 0 %d rlineto %d 0 rlineto 0 %d rlineto closepath\n", CELLSIZE_INT, CELLSIZE_INT, -1 * CELLSIZE_INT);
+ fprintf(fp, " %.2f %.2f %.2f %.2f setcmykcolor\n", ps->bcolAAA[p][c][0], ps->bcolAAA[p][c][1], ps->bcolAAA[p][c][2], ps->bcolAAA[p][c][3]);
+ fprintf(fp, " fill\n");
+ }
+ }
+ fprintf(fp, "1.00 setlinewidth\n");
+ }
+ else { /* no mask, all cells are printed the same */
+ for(c = 0; c < ps->rflen; c++) {
+ fprintf(fp, "%snucleotide %d\n", "%", c+1);
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", ps->rxA[c] - (CELLSIZE * CELL_XOFFSET_FRACTION), ps->ryA[c] - (CELLSIZE * CELL_YOFFSET_FRACTION));
+ fprintf(fp, " 0 %d rlineto %d 0 rlineto 0 %d rlineto closepath\n", CELLSIZE_INT, CELLSIZE_INT, -1 * CELLSIZE_INT);
+ fprintf(fp, " %.2f %.2f %.2f %.2f setcmykcolor\n", ps->bcolAAA[p][c][0], ps->bcolAAA[p][c][1], ps->bcolAAA[p][c][2], ps->bcolAAA[p][c][3]);
+ fprintf(fp, " fill\n");
+ }
+ }
+ /* back to black */
+ fprintf(fp, " 0.00 0.00 0.00 1.00 setcmykcolor\n");
+ fprintf(fp, "%% end colored positions\n\n");
+ }
+
+ if(ps->rAA[p] != NULL) {
+ fprintf(fp, "/%s findfont %f scalefont setfont\n", NUCLEOTIDES_FONT, NUCLEOTIDES_FONTSIZE);
+ fprintf(fp, " 0.00 0.00 0.00 1.00 setcmykcolor\n"); /* reset color as black */
+ fprintf(fp, "%% begin text nucleotides\n");
+ if(ps->rcolAAA[p] != NULL) {
+ for(c = 0; c < ps->rflen; c++) {
+ fprintf(fp, " %.2f %.2f %.2f %.2f setcmykcolor ", ps->rcolAAA[p][c][0], ps->rcolAAA[p][c][1], ps->rcolAAA[p][c][2], ps->rcolAAA[p][c][3]);
+ if(strchr(LOWERCASE_LOW_HANGING_CHARS, ps->rAA[p][c]) != NULL) {
+ fprintf(fp, "(%c) %.2f %.2f moveto show", ps->rAA[p][c], ps->rxA[c], ps->ryA[c] + (CELLSIZE * NUCLEOTIDE_YOFFSET_FRACTION_LOWERCASE_LOW_HANGING_CHARS));
+ /* handle lowercase low hanging chars ("gjpqy") nucleotides special, so they're centered in the box! */
+ }
+ else if(ps->rAA[p][c] != ' ') {
+ fprintf(fp, "(%c) %.2f %.2f moveto show", ps->rAA[p][c], ps->rxA[c], ps->ryA[c]);
+ }
+ fprintf(fp, "\n");
+ }
+ }
+ else { /* ps->rcolAAA[p] is NULL */
+ for(c = 0; c < ps->rflen; c++) {
+ if(strchr(LOWERCASE_LOW_HANGING_CHARS, ps->rAA[p][c]) != NULL) {
+ fprintf(fp, "(%c) %.2f %.2f moveto show", ps->rAA[p][c], ps->rxA[c], ps->ryA[c] + (CELLSIZE * NUCLEOTIDE_YOFFSET_FRACTION_LOWERCASE_LOW_HANGING_CHARS));
+ /* handle lowercase low hanging chars ("gjpqy") nucleotides special, so they're centered in the box! */
+ }
+ else if(ps->rAA[p][c] != ' ') {
+ fprintf(fp, "(%c) %.2f %.2f moveto show", ps->rAA[p][c], ps->rxA[c], ps->ryA[c]);
+ }
+ fprintf(fp, "\n");
+ }
+ }
+ fprintf(fp, "%% end text nucleotides\n");
+ fprintf(fp, " 0.000 0.000 0.000 1.000 setcmykcolor\n"); /* reset color as black */
+ }
+
+ if(ps->otypeAA != NULL && ps->otypeAA[p] != NULL) {
+ fprintf(fp, "%% begin outlines\n");
+ for(c = 0; c < ps->rflen; c++) {
+ if(ps->otypeAA[p][c] != OUTLINE_NONE_IDX) {
+ /* push x and y and cellsize onto stack */
+ fprintf(fp, "%.2f %.2f %.2f",
+ ps->rxA[c] - (CELLSIZE * CELL_XOFFSET_FRACTION),
+ ps->ryA[c] - (CELLSIZE * CELL_YOFFSET_FRACTION),
+ CELLSIZE);
+ if(ps->otypeAA[p][c] == OUTLINE_MIN_IDX) {
+ fprintf(fp, " %.2f %s\n",
+ OUTLINE_LINEWIDTH_CELL_FRACTION_MIN * CELLSIZE,
+ OUTLINE_PROCEDURE);
+ }
+ else if(ps->otypeAA[p][c] == OUTLINE_MAX_IDX) {
+ fprintf(fp, " %.2f %s\n",
+ OUTLINE_LINEWIDTH_CELL_FRACTION_MAX * CELLSIZE,
+ OUTLINE_PROCEDURE);
+ }
+ }
+ }
+ fprintf(fp, "%% end outlines\n");
+ fprintf(fp, " 0.000 0.000 0.000 1.000 setcmykcolor\n"); /* reset color as black */
+ }
+
+ /* 'lines positionsticks' section, drawn last so they're not buried beneath other objects */
+ for(i = 0; i < ps->nticks; i++) {
+ if(i == 0) {
+ fprintf(fp, "%% begin lines positionticks\n");
+ fprintf(fp, "%.2f setlinewidth\n", TICKS_LINEWIDTH);
+ fprintf(fp, "0.00 0.00 0.00 1.00 setcmykcolor\n"); /* black */
+ }
+ fprintf(fp, "%.2f %.2f %.2f %.2f newpath moveto lineto stroke\n", ps->ticksx1A[i], ps->ticksy1A[i], ps->ticksx2A[i], ps->ticksy2A[i]);
+ if(i == (ps->nticks-1)) {
+ fprintf(fp, "%% end lines positionticks\n\n");
+ }
+ }
+
+ fprintf(fp, "showpage\n\n");
+ /* fprintf(fp, "%% end ignore\n\n"); */
+ }
+ free(page_orderA);
+ return eslOK;
+
+ ERROR: ESL_FAIL(eslEINVAL, errbuf, "draw_sspostscript() error, probably out of memory.");
+}
+
+
+/* parse_template_file
+ *
+ * Read secondary structure templates from a postscript
+ * template file derived from the Gutell CRW website until
+ * the one that corresponds to our alignment is found,
+ * (defined as the first template structure that has the
+ * same consensus length as the passed in <msa_rflen>)
+ * or we run out structure templates. This function
+ * repeatedly calls parse_template() which actually parses
+ * the templates.
+ *
+ * If we run out of structure templates of anything is
+ * invalid in any of the templates in the file, we
+ * return a non-eslOK status code to caller and fill
+ * errbuf with the error message.
+ *
+ * Returns: eslOK on success.
+ */
+int
+parse_template_file(char *filename, const ESL_GETOPTS *go, char *errbuf, int msa_rflen, SSPostscript_t **ret_ps)
+{
+ int status;
+ ESL_FILEPARSER *efp;
+ SSPostscript_t *ps;
+ int found_match = FALSE;
+
+ if (esl_fileparser_Open(filename, NULL, &efp) != eslOK) esl_fatal("ERROR, failed to open template file %s in parse_template_file\n", filename);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ status = eslOK;
+ while((found_match == FALSE) && (status == eslOK)) {
+ status = parse_template_page(efp, go, errbuf, &ps);
+ if((status != eslOK) && (status != eslEOF)) {
+ esl_fileparser_Close(efp);
+ return status;
+ }
+ if(ps->rflen == msa_rflen) { found_match = TRUE; }
+ else { free_sspostscript(ps); }
+ }
+ if(found_match == FALSE) {
+ esl_fileparser_Close(efp);
+ esl_fatal("ERROR, did not find template structure to match alignment consensus length of %d in:\n%s\n", msa_rflen, filename);
+ }
+
+ /* if we get here, we've found a match */
+
+ /* validate the template we just read */
+ if((status = validate_justread_sspostscript(ps, errbuf)) != eslOK) return status;
+
+ esl_fileparser_Close(efp);
+ *ret_ps = ps;
+
+ return eslOK;
+}
+
+
+/* parse_template_page
+ *
+ * Read a single secondary structure template page for a
+ * single CM from a postscript template file derived from the
+ * Gutell CRW website. This function is called repeatedly
+ * on the same file to read multiple structure templates.
+ * The logic is to keep reading until we find one with the
+ * same consensus length as our input alignment.
+ *
+ * The structure template is read in sections.
+ * Each section begins with a line like this:
+ * % begin <type1> <type2>
+ *
+ * list of valid tokens for <type1>:
+ * modelname
+ * legcoords
+ * scale
+ * regurgitate
+ * ignore
+ * lines
+ * text
+ *
+ * if <type1> is lines or text, then <type2> is read,
+ * valid tokens for <type2> if <type1> is 'text'
+ * positiontext
+ * nucleotides
+ *
+ * valid tokens for <type2> if <type1> is 'lines'
+ * positionticks
+ * bpconnects
+ *
+ * The 'regurgitate' lines are stored, but never changed.
+ * The 'ignore' lines are not even stored.
+ * All other <type1> lines are stored in data structures that
+ * can be manipulated (though not all are at this point).
+ *
+ * If anything is invalid, we return a non-eslOK status code
+ * to caller.
+ *
+ * Returns: eslOK on success.
+ */
+int
+parse_template_page(ESL_FILEPARSER *efp, const ESL_GETOPTS *go, char *errbuf, SSPostscript_t **ret_ps)
+{
+ int status;
+ char *tok;
+ int toklen;
+ SSPostscript_t *ps = NULL;
+ int read_showpage = FALSE;
+ int reached_eof = FALSE;
+
+ /* Create the postscript object */
+ ps = create_sspostscript(go);
+
+ while ((read_showpage == FALSE) && ((status = esl_fileparser_GetToken(efp, &tok, &toklen)) == eslOK)) {
+ if(strcmp(tok, "%") == 0) {
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) == eslOK) {
+ if(strcmp(tok, "begin") == 0) {
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) == eslOK) {
+ if(strcmp(tok, "modelname") == 0) {
+ if((status = parse_modelname_section(efp, errbuf, ps)) != eslOK) return status;
+ }
+ else if(strcmp(tok, "legend") == 0) {
+ /*printf("parsing legend\n");*/
+ if((status = parse_legend_section(efp, errbuf, ps)) != eslOK) return status;
+ }
+ else if(strcmp(tok, "scale") == 0) {
+ /*printf("parsing scale\n");*/
+ if((status = parse_scale_section(efp, errbuf, ps)) != eslOK) return status;
+ }
+ else if(strcmp(tok, "ignore") == 0) {
+ /*printf("parsing ignore\n");*/
+ if((status = parse_ignore_section(efp, errbuf, &read_showpage)) != eslOK) return status;
+ }
+ else if(strcmp(tok, "regurgitate") == 0) {
+ /*printf("parsing regurgitate\n");*/
+ if((status = parse_regurgitate_section(efp, errbuf, ps)) != eslOK) return status;
+ }
+ else if(strcmp(tok, "text") == 0) {
+ /*printf("parsing text\n");*/
+ if((status = parse_text_section(efp, errbuf, ps)) != eslOK) return status;
+ }
+ else if(strcmp(tok, "lines") == 0) {
+ /*printf("parsing lines\n");*/
+ if((status = parse_lines_section(efp, errbuf, ps)) != eslOK) return status;
+ }
+ else {
+ ESL_FAIL(eslEINVAL, errbuf, "parse_template_page(), error, unknown section type %s.", tok);
+ }
+ }
+ else {
+ ESL_FAIL(eslEINVAL, errbuf, "parse_template_page(), error last read line number %d.", efp->linenumber);
+ }
+ }
+ else {
+ ESL_FAIL(eslEINVAL, errbuf, "parse_template_page(), expected line beginning with %%%% begin, but read tok: %s instead of begin, last read line number %d.", tok, efp->linenumber);
+ }
+ }
+ else {
+ ESL_FAIL(eslEINVAL, errbuf, "parse_template_page(), ran out of tokens early, error last read line number %d.", efp->linenumber);
+ }
+ }
+ else {
+ ESL_FAIL(eslEINVAL, errbuf, "parse_template_page(), expected line beginning with %%%%, read tok: %s, last read line number %d.", tok, efp->linenumber);
+ }
+ }
+ if(read_showpage == FALSE && status != eslEOF) {
+ ESL_FAIL(status, errbuf, "parse_template_page(), error, ran out of tokens, but not at end of file?, last read line number %d.", efp->linenumber);
+ }
+ if(status == eslEOF) reached_eof = TRUE;
+
+ *ret_ps = ps;
+
+ if(reached_eof) return eslEOF;
+ else return eslOK;
+}
+
+/* parse_modelname_section
+ *
+ * Parse the modelname section of a template postscript file.
+ * If anything is invalid, we return a non-eslOK status code
+ * to caller.
+ *
+ * Returns: eslOK on success.
+ */
+int
+parse_modelname_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps)
+{
+ int status;
+ char *tok;
+ int toklen;
+ char *curstr = NULL;
+ int curlen = 0;
+ int ntok = 0;
+ /* this section should be exactly 3 lines, one of which we've already read,
+ * here's an example, next token should be the first 0.65
+ * % begin modelname
+ * % archaea
+ * % end scale
+ */
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing modelname section, reading token 1 of 3");
+ if (strcmp(tok, "%") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing modelname section, middle line token 1 should be a percent sign but it's %s", tok);
+ /* read remainder of line, this is the model name */
+ while ((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) == eslOK) {
+ if(ntok > 0) {
+ if((status = esl_strcat(&curstr, curlen, " ", 1)) != eslOK) ESL_FAIL(status, errbuf, "parse_modelname_section(), error parsing model name.");
+ curlen += 1;
+ }
+ if((status = esl_strcat(&curstr, curlen, tok, toklen)) != eslOK) ESL_FAIL(status, errbuf, "parse_modelname_section(), error parsing model name.");
+ curlen += toklen;
+ ntok++;
+ }
+ ESL_ALLOC(ps->modelname, sizeof(char) * (curlen+1));
+ strcpy(ps->modelname, curstr);
+
+ /* next line should be '% end modelname' */
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing modelname section, reading end line token 1 of 3");
+ if (strcmp(tok, "%") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing modelname section, end line token 1 of 3 should be a percent sign but it's %s", tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing modelname section, reading end line token 2 of 3");
+ if (strcmp(tok, "end") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing modelname section, end line token 2 of 3 should be 'end' but it's %s", tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing modelname section, reading end line token 3 of 3");
+ if (strcmp(tok, "modelname") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing modelname section, end line token 3 of 3 should be 'modelname' but it's %s", tok);
+
+ if(curstr != NULL) free(curstr);
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "Error, parsing modelname section, memory error?");
+}
+
+/* parse_legend_section
+ *
+ * Parse the legend (legend coordinates) section of a template postscript file.
+ * If anything is invalid, we return a non-eslOK status code
+ * to caller.
+ *
+ * Returns: eslOK on success.
+ */
+int
+parse_legend_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps)
+{
+ int status;
+ char *tok;
+ int toklen;
+
+ /* this section should be exactly 3 lines, one of which we've already read,
+ * five tokens of the middle line are <rfpos> <x_offset> <y_offset> <leg_cellsize> <leg_right_buffer>
+ * this tells us to put the top-left corner of the legend at
+ * ps->legx[rfpos] + x_offset, ps->legy[rfpos] + y_offset,
+ * and have the RHS of the buffer end <space_right_of_leg> points before the RHS of the page
+ * cellsize is the size of the cells in the legend
+ * here's an example, first token we'll read should be '%', followed by '1508'
+ * % begin legend
+ * % 1508 24. -24. 12 0.
+ * % end legend
+ */
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing legend section, reading token 1 of 6");
+ if (strcmp(tok, "%") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing legend section, middle line token 1 should be a percent sign but it's %s", tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing legend section, reading token 2 of 6");
+ ps->leg_posn = atoi(tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing legend section, reading token 3 of 6");
+ ps->legx_offset = atof(tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing legend section, reading token 4 of 6");
+ ps->legy_offset = atof(tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing legend section, reading token 5 of 6");
+ ps->leg_cellsize = atoi(tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing legend section, reading token 6 of 6");
+ ps->leg_rhs_space = atof(tok);
+
+ /* read '% end legend' line */
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing legend section, reading token 3 of 3");
+ if (strcmp(tok, "%") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing legend section, end line token 1 of 3 should be a percent sign but it's %s", tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing legend section, reading end line token 2 of 3");
+ if (strcmp(tok, "end") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing legend section, end line token 2 of 3 should be 'end' but it's %s", tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing legend section, reading end line token 3 of 3");
+ if (strcmp(tok, "legend") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing legend section, end line token 3 of 3 should be 'legend' but it's %s", tok);
+
+ return eslOK;
+}
+
+/* parse_scale_section
+ *
+ * Parse the scale section of a template postscript file.
+ * If anything is invalid, we return a non-eslOK status code
+ * to caller.
+ *
+ * Returns: eslOK on success.
+ */
+int
+parse_scale_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps)
+{
+ int status;
+ char *tok;
+ int toklen;
+
+ /* this section should be exactly 3 lines, one of which we've already read,
+ * here's an example, next token should be the first 0.65
+ * % begin scale
+ * 0.65 0.65 scale
+ * % end scale
+ */
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing scale section, reading token 1 of 3");
+ ps->scale = atof(tok);
+ if(ps->scale < 0.) ESL_FAIL(status, errbuf, "Error, parsing scale section, scale must be positive real number, read %s\n", tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing scale section, reading token 2 of 3");
+ if(esl_FCompare(ps->scale, atof(tok), eslSMALLX1) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing scale section, x and y scales are not equal %.2f != %.2f", ps->scale, atof(tok));
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing scale section, reading token 3 of 3");
+ if (strcmp(tok, "scale") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing scale section, token 3 of 3 should be 'scale' but it's %s", tok);
+
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing scale section, reading end line token 1 of 3");
+ if (strcmp(tok, "%") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing scale section, end line token 1 of 3 should be a percent sign but it's %s", tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing scale section, reading end line token 2 of 3");
+ if (strcmp(tok, "end") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing scale section, end line token 2 of 3 should be 'end' but it's %s", tok);
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing scale section, reading end line token 3 of 3");
+ if (strcmp(tok, "scale") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing scale section, end line token 3 of 3 should be 'scale' but it's %s", tok);
+
+ return eslOK;
+}
+
+
+/* parse_ignore_section
+ *
+ * Parse an ignore section of a template postscript file.
+ * We ignore this data. This function's purpose is to read
+ * tokens until we see the "% end ignore" line signalling
+ * the end of the ignore section.
+ *
+ * As a special case, if any line iss a single token, 'showpage', we
+ * set *ret_read_showpage as TRUE upon return. This signals to caller
+ * that the current page is finished.
+ *
+ * Returns: eslOK on success.
+ */
+int
+parse_ignore_section(ESL_FILEPARSER *efp, char *errbuf, int *ret_read_showpage)
+{
+ int status;
+ char *tok;
+ int keep_reading = TRUE;
+ int read_showpage = FALSE;
+
+ while((keep_reading) && (status = esl_fileparser_NextLine(efp) == eslOK)) {
+ /* we're going to keep reading until we've read the line that is '% end ignore', 3 tokens, '%', then 'end', then 'ignore' */
+ if(((status = esl_fileparser_GetToken(efp, &tok, NULL)) == eslOK) && (strcmp(tok, "%") == 0)) { /* first token is '%' */
+ if(((status = esl_fileparser_GetToken(efp, &tok, NULL)) == eslOK) && (strcmp(tok, "end") == 0)) { /* second token is 'end' */
+ if(((status = esl_fileparser_GetToken(efp, &tok, NULL)) == eslOK) && (strcmp(tok, "ignore") == 0)) { /* final token is 'end' */
+ keep_reading = FALSE;
+ status = eslOK;
+ }
+ }
+ }
+ else if(strcmp(tok, "showpage") == 0) { /* first token is 'showpage' */
+ read_showpage = TRUE;
+ }
+ }
+ if(status == eslEOF) ESL_FAIL(status, errbuf, "Error, parsing ignore section, finished file looking for '%%%% end ignore' line");
+ if(status != eslOK) ESL_FAIL(status, errbuf, "Error, parsing ignore section, last line number read %d", efp->linenumber);
+
+ *ret_read_showpage = read_showpage;
+ return eslOK;
+}
+
+
+/* parse_regurgitate_section
+ *
+ * Parse a regurgitate section of a template postscript file.
+ * If anything is invalid, we return a non-eslOK status code
+ * to caller.
+ *
+ * Returns: eslOK on success.
+ */
+int
+parse_regurgitate_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps)
+{
+ int status;
+ char *tok;
+ int toklen;
+ int seen_end = FALSE;
+ char *curstr = NULL;
+ char *newstr;
+ int nalloc = ps->nregurg;
+ int curlen;
+ void *tmp;
+ int ntok = 0;
+
+ while (((status = esl_fileparser_NextLine(efp)) == eslOK) && (!seen_end))
+ {
+ curlen = ntok = 0;
+ while ((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) == eslOK) {
+ if (strcmp(tok, "%") == 0) { /* should be the end, make sure it's properly formatted */
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing regurgitate section, read %%%% prefixed line without ' end regurgitate' after it");
+ if (strcmp(tok, "end") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing regurgitate section, read %%%% prefixed line without ' end regurgitate' after it");
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing regurgitate section, read %%%% prefixed line without ' end regurgitate' after it");
+ if (strcmp(tok, "regurgitate") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing regurgitate section, read %%%% prefixed line without ' end regurgitate' after it");
+ seen_end = TRUE;
+ break;
+ }
+ else {
+ if(ntok > 0) {
+ if((status = esl_strcat(&curstr, curlen, " ", 1)) != eslOK) ESL_FAIL(status, errbuf, "parse_regurgitate_section(), error (2).");
+ curlen += 1;
+ }
+ if((status = esl_strcat(&curstr, curlen, tok, toklen)) != eslOK) ESL_FAIL(status, errbuf, "parse_regurgitate_section(), error (1).");
+ curlen += toklen;
+ ntok++;
+ }
+ }
+ if(seen_end) break;
+ if((status = esl_strcat(&curstr, curlen, "\n", 1)) != eslOK) ESL_FAIL(status, errbuf, "parse_regurgitate_section(), error (3).");
+ curlen += 1;
+ ESL_ALLOC(newstr, sizeof(char) * (curlen+1));
+ strcpy(newstr, curstr);
+ if(ps->nregurg == nalloc) {
+ nalloc += ps->nalloc; ESL_RALLOC(ps->regurgA, tmp, sizeof(char *) * nalloc);
+ }
+ ps->regurgA[ps->nregurg++] = newstr;
+ free(curstr);
+ curstr = NULL;
+ }
+ if(status == eslEOF) ESL_FAIL(status, errbuf, "Error, parsing regurgitate section, finished file looking for '%%%% end regurgitate' line");
+ if(status != eslOK) ESL_FAIL(status, errbuf, "Error, parsing regurgitate section, last line number read %d", efp->linenumber);
+
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "Memory error parsing regurgitate section");
+}
+
+
+/* parse_text_section
+ *
+ * Parse a text section of a template postscript file.
+ * If anything is invalid, we return a non-eslOK status code
+ * to caller.
+ *
+ * Returns: eslOK on success.
+ */
+int
+parse_text_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps)
+{
+ int status;
+ char *tok;
+ int toklen;
+ int seen_end = FALSE;
+ int nalloc;
+ void *tmp;
+ int do_posntext = FALSE;
+ int do_nucleotides = FALSE;
+ int i;
+
+ /* find out which section we're in, 'posntext' or 'nucleotides' */
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing text section, last line %d\n", efp->linenumber);
+ if (strcmp(tok, "positiontext") == 0) { do_posntext = TRUE; nalloc = ps->nposntext; }
+ else if (strcmp(tok, "nucleotides") == 0) { do_nucleotides = TRUE; nalloc = ps->rflen; }
+
+ /* Parse each line. example line:
+ * (G) 168.00 392.00 moveto show
+ */
+ while (((status = esl_fileparser_NextLine(efp)) == eslOK) && (!seen_end))
+ {
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing text section, each non-comment line should be 5-tokens ending with 'show'");
+ if (tok[0] == '%') { /* comment line, could be the end, check if it's '% end text {positiontext,nucleotides}', if not, ignore it */
+ if(strcmp(tok, "%") == 0) { /* first token is '%', keep checking */
+ if(((status = esl_fileparser_GetToken(efp, &tok, &toklen)) == eslOK) && (strcmp(tok, "end") == 0)) { /* second token is 'end', keep checking */
+ if(((status = esl_fileparser_GetToken(efp, &tok, &toklen)) == eslOK) && (strcmp(tok, "text") == 0)) { /* third token is 'end', keep checking */
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) == eslOK) { /* has a fourth token, keep checking */
+ if(do_posntext && strcmp(tok, "positiontext") == 0) seen_end = TRUE;
+ if(do_nucleotides && strcmp(tok, "nucleotides") == 0) seen_end = TRUE;
+ }
+ }
+ }
+ }
+ }
+ else {
+ /* we're reading a non-comment line, tok is the string, if do_posntext, we store it, else we discard it */
+ if(do_posntext) {
+ if(ps->nposntext == nalloc) {
+ ESL_RALLOC(ps->posntextA, tmp, sizeof(char *) * (nalloc + ps->nalloc));
+ ESL_RALLOC(ps->posntextxA, tmp, sizeof(float) * (nalloc + ps->nalloc));
+ ESL_RALLOC(ps->posntextyA, tmp, sizeof(float) * (nalloc + ps->nalloc));
+ for(i = nalloc; i < nalloc + ps->nalloc; i++) ps->posntextA[i] = NULL;
+ nalloc += ps->nalloc;
+ }
+ if((status = esl_strdup(tok, -1, &(ps->posntextA[ps->nposntext]))) != eslOK) goto ERROR;
+ }
+ if(do_nucleotides && ps->rflen == nalloc) {
+ ESL_RALLOC(ps->rxA, tmp, sizeof(float) * (nalloc + ps->nalloc));
+ ESL_RALLOC(ps->ryA, tmp, sizeof(float) * (nalloc + ps->nalloc));
+ nalloc += ps->nalloc;
+ }
+
+ /* get x */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing text section, each non-comment line should be 5 tokens ending with 'show'");
+ if(do_posntext) ps->posntextxA[ps->nposntext] = atof(tok);
+ if(do_nucleotides) ps->rxA[ps->rflen] = atof(tok);
+ /* get y */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing text section, each non-comment line should be 5 tokens ending with 'show'");
+ if(do_posntext) ps->posntextyA[ps->nposntext] = atof(tok);
+ if(do_nucleotides) ps->ryA[ps->rflen] = atof(tok);
+
+ /* verify moveto */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing text section, each non-comment line should be 5 tokens ending with 'show'");
+ if (strcmp(tok, "moveto") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing text main section, fourth token should be 'moveto', line %d", efp->linenumber);
+ /* verify show */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing text section, each non-comment line should be 5 tokens ending with 'show'");
+ if (strcmp(tok, "show") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing text main section, fifth token should be 'show', line %d", efp->linenumber);
+
+ if(do_posntext) ps->nposntext++;
+ if(do_nucleotides) ps->rflen++;
+ }
+ }
+ if(!seen_end) {
+ if(do_posntext) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing text positiontext section, didn't see '%%%% end text positiontext' line: %d\n", efp->linenumber);
+ if(do_nucleotides) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing text positiontext section, didn't see '%%%% end text nucleotides' line: %d\n", efp->linenumber);
+ }
+ if(status == eslEOF && do_posntext)
+ ESL_FAIL(status, errbuf, "Error, parsing text section, finished file looking for '%%%% end text positiontext' line");
+ if(status == eslEOF && do_nucleotides)
+ ESL_FAIL(status, errbuf, "Error, parsing text section, finished file looking for '%%%% end text nucleotides' line");
+ if(status != eslOK) ESL_FAIL(status, errbuf, "Error, parsing text section, last line number read %d", efp->linenumber);
+
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "Memory error parsing text section");
+}
+
+/* parse_lines_section
+ *
+ * Parse a lines section of a template postscript file.
+ * If anything is invalid, we return a non-eslOK status code
+ * to caller.
+ *
+ * Returns: eslOK on success.
+ */
+int
+parse_lines_section(ESL_FILEPARSER *efp, char *errbuf, SSPostscript_t *ps)
+{
+ int status;
+ char *tok;
+ int toklen;
+ int seen_end = FALSE;
+ int nalloc;
+ void *tmp;
+ int do_ticks = FALSE;
+ int do_bpconnects = FALSE;
+
+ /* find out which section we're in, 'positionticks' or 'bpconnects' */
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines section, last line %d\n", efp->linenumber);
+ if (strcmp(tok, "positionticks") == 0) { do_ticks = TRUE; nalloc = ps->nticks; }
+ else if (strcmp(tok, "bpconnects") == 0) { do_bpconnects = TRUE; nalloc = ps->nbp; }
+ else ESL_FAIL(status, errbuf, "Error, parsing lines section unrecognized type: %s ('bpconnects' or 'positionticks' expected)\n", tok);
+
+ /* Parse each line. example line:
+ * 151.82 331.76 148.86 338.65 newpath moveto lineto stroke
+ */
+ while (((status = esl_fileparser_NextLine(efp)) == eslOK) && (!seen_end))
+ {
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines main section should include 5-tokens ending with 'show'");
+ if (strcmp(tok, "%") == 0) { /* should be the end, make sure it's properly formatted */
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines section, read %%%% prefixed line without ' end lines' after it");
+ if (strcmp(tok, "end") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing lines section, read %%%% prefixed line without ' end lines' after it");
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines section, read %%%% prefixed line without ' end lines' after it");
+ if (strcmp(tok, "lines") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing lines section, read %%%% prefixed line without ' end lines' after it");
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines section, read %%%% prefixed line without ' end lines' after it");
+ if(do_ticks) {
+ if (strcmp(tok, "positionticks") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing lines section, read %%%% prefixed line without ' end lines positionticks' after it");
+ }
+ if(do_bpconnects) {
+ if (strcmp(tok, "bpconnects") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing lines section, read %%%% prefixed line without ' end lines bpconnects' after it");
+ }
+ seen_end = TRUE;
+ break;
+ }
+ /* if we get here, we haven't seen the end, we're reading a normal line, tok is the first x coord, we record this */
+ /* first we expand our arrays if nec */
+ if(do_ticks && ps->nticks == nalloc) {
+ nalloc += ps->nalloc;
+ ESL_RALLOC(ps->ticksx1A, tmp, sizeof(float) * nalloc);
+ ESL_RALLOC(ps->ticksy1A, tmp, sizeof(float) * nalloc);
+ ESL_RALLOC(ps->ticksx2A, tmp, sizeof(float) * nalloc);
+ ESL_RALLOC(ps->ticksy2A, tmp, sizeof(float) * nalloc);
+ }
+ if(do_bpconnects && ps->nbp == nalloc) {
+ nalloc += ps->nalloc;
+ ESL_RALLOC(ps->bpx1A, tmp, sizeof(float) * nalloc);
+ ESL_RALLOC(ps->bpy1A, tmp, sizeof(float) * nalloc);
+ ESL_RALLOC(ps->bpx2A, tmp, sizeof(float) * nalloc);
+ ESL_RALLOC(ps->bpy2A, tmp, sizeof(float) * nalloc);
+ }
+ /* store x1 */
+ if(do_ticks) ps->ticksx1A[ps->nticks] = atof(tok);
+ if(do_bpconnects) ps->bpx1A[ps->nbp] = atof(tok);
+ /* get y1 */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines main section should include 8-tokens ending with 'stroke'");
+ if(do_ticks) ps->ticksy1A[ps->nticks] = atof(tok);
+ if(do_bpconnects) ps->bpy1A[ps->nbp] = atof(tok);
+ /* get x2 */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines main section should include 8-tokens ending with 'stroke'");
+ if(do_ticks) ps->ticksx2A[ps->nticks] = atof(tok);
+ if(do_bpconnects) ps->bpx2A[ps->nbp] = atof(tok);
+ /* get y2 */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines main section should include 8-tokens ending with 'stroke'");
+ if(do_ticks) ps->ticksy2A[ps->nticks] = atof(tok);
+ if(do_bpconnects) ps->bpy2A[ps->nbp] = atof(tok);
+
+ /* verify newpath */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines main section should include 8-tokens ending with 'stroke'");
+ if (strcmp(tok, "newpath") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing lines main section, fifth token should be 'newpath', line %d", efp->linenumber);
+ /* verify moveto */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines main section should include 8-tokens ending with 'stroke'");
+ if (strcmp(tok, "moveto") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing lines main section, sixth token should be 'moveto', line %d", efp->linenumber);
+ /* verify lineto */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines main section should include 8-tokens ending with 'stroke'");
+ if (strcmp(tok, "lineto") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing lines main section, seventh token should be 'lineto', line %d", efp->linenumber);
+ /* verify stroke */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, &toklen)) != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines main section should include 8-tokens ending with 'stroke'");
+ if (strcmp(tok, "stroke") != 0) ESL_FAIL(eslEINVAL, errbuf, "Error, parsing lines main section, eigth token should be 'stroke', line %d", efp->linenumber);
+
+ if(do_ticks) ps->nticks++;
+ if(do_bpconnects) ps->nbp++;
+ }
+ if(!seen_end) ESL_FAIL(status, errbuf, "Error, parsing lines section, didn't see end! line: %d\n", efp->linenumber);
+ if(status == eslEOF && do_ticks)
+ ESL_FAIL(status, errbuf, "Error, parsing lines section, finished file looking for '%%%% end lines positionticks' line");
+ if(status == eslEOF && do_bpconnects)
+ ESL_FAIL(status, errbuf, "Error, parsing lines section, finished file looking for '%%%% end lines bpconnects' line");
+
+ if(status != eslOK) ESL_FAIL(status, errbuf, "Error, parsing lines section, last line number read %d", efp->linenumber);
+
+ return eslOK;
+ ERROR: ESL_FAIL(status, errbuf, "Memory error parsing lines section");
+}
+
+/* Function: individuals_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with info for individual seqs and
+ * possibly their posteriors in the MSA.
+ * Return: eslOK on success.
+ *
+ * per_seq_ins_ct - [0..i..msa->nseq-1][0..rfpos..rflen] number of inserts
+ * insert after each nongap RF position per sequence.
+ * If rfpos == 0: # inserts BEFORE first position.
+ * If rfpos == n: # inserts after position rfpos n
+ * This is off-by-one with respect to msa->rf for example,
+ * msa->rf[n] is the 'n-1'th nucleotide of the RF annotation.
+ */
+static int
+individuals_sspostscript(const ESL_GETOPTS *go, ESL_ALPHABET *abc, char *errbuf, SSPostscript_t *ps, double **abc_ct, ESL_MSA *msa, int **per_seq_ins_ct,
+ int do_prob, int do_rescol, float ***hc_scheme, int hc_scheme_idx_s, int hc_scheme_idx_p,
+ int hc_nbins_s, int hc_nbins_p, float **hc_onecell, int extdel_idx_s, int wcbp_idx_s, int gubp_idx_s,
+ int ncbp_idx_s, int dgbp_idx_s, int hgbp_idx_s, int gap_idx_p, FILE *tabfp)
+{
+ int status;
+ int p, i, pp, ai;
+ int rfpos, apos, lpos, rpos, lrfpos, rrfpos;
+ int orig_npage = ps->npage;
+ int new_npage;
+
+ /* variables for the sequence pages */
+ int nextdel_s = 0; /* number of external deletes (3' and 5' flush deletes) */
+ int nwc_s = 0; /* number of Watson/Crick (A:U,U:A,C:G,G:C) basepairs */
+ int ngu_s = 0; /* number of G:U,U:G basepairs (2 * num G-U,U-G bps) */
+ int nnc_s = 0; /* number of non-canonical basepairs (A:A,A:C,A:G,C:A,C:C,C:U,G:A,G:G,U:C,U:U) */
+ int ndgi_s = 0; /* number of internal double-gap basepairs */
+ int nhgi_s = 0; /* number of internal half-gap basepairs */
+ int ndge_s = 0; /* number of external double-gap basepairs */
+ int nhge_s = 0; /* number of external half-gap basepairs */
+ float *limits_s; /* [nbins+1] limits for each bin, limits[0] is min value we would expect to see, limits[nbins] is max */
+ int nins_s; /* number of inserts after the current rfpos for current sequence */
+ int spos, epos; /* first/final nongap position for cur sequence */
+ int apos_is_internal; /* is apos within spos..epos?, if not it's an external deletion */
+ int lpos_is_internal; /* is lpos within spos..epos?, if not it's an external deletion */
+ int rpos_is_internal; /* is rpos within spos..epos?, if not it's an external deletion */
+ int namewidth; /* length in chars of longest seq name we'll print */
+ char *namedashes = NULL;
+ int ni;
+ double cur_cfreq;
+ int noutline_min = 0; /* number of positions with minimal outline */
+ int noutline_max = 0; /* number of positions with maximal outline */
+ int noutline_bp_good = 0; /* number of WC/GU basepairs that have left and/or right half outlined, consensus is WC/GU */
+ int noutline_bp_bad = 0; /* number of NC basepairs that have left and/or right half outlined, consensus is WC/GU */
+ int maj_bp_is_wc_or_gu; /* TRUE if current consensus bp is a watson-crick of GU in majority consensus sequence */
+ float *stack; /* postscript stack for outline procedure */
+
+ /* variables for the postprob pages */
+ int ngap_p = 0;
+ int ngap_masked_p = 0;
+ float *limits_p;
+ int within_mask;
+ float ppavgA[11];
+ int ppidx;
+ int do_prob_res = FALSE; /* set to TRUE if --no-ntpp is NOT enabled */
+ int do_outline = FALSE; /* set to TRUE if --no-nt is NOT enabled */
+ int noccl; /* number of one-cell color legends depends on value of do_prob_res and do_ouline */
+
+ /* contract check */
+ if(do_prob) {
+ if(msa->pp == NULL) ESL_FAIL(eslEINVAL, errbuf, "internal error, individuals_sspostscript() do_prob == TRUE, msa->pp == FALSE");
+ for(i = 0; i < msa->nseq; i++) {
+ if(msa->pp[i] == NULL)
+ ESL_FAIL(eslEINVAL, errbuf, "with --indi, either all or none of the selected sequences must have PP annotation, seq %d does not", i);
+ }
+ do_prob_res = (! esl_opt_GetBoolean(go, "--no-ntpp"));
+ }
+ do_outline = (! esl_opt_GetBoolean(go, "--no-ol"));
+
+ /* PP values, hard coded */
+ ppavgA[0] = 0.025;
+ ppavgA[1] = 0.10;
+ ppavgA[2] = 0.20;
+ ppavgA[3] = 0.30;
+ ppavgA[4] = 0.40;
+ ppavgA[5] = 0.50;
+ ppavgA[6] = 0.60;
+ ppavgA[7] = 0.70;
+ ppavgA[8] = 0.80;
+ ppavgA[9] = 0.90;
+ ppavgA[10] = 0.975;
+
+ /* determine number of pages we'll add */
+ new_npage = do_prob ? msa->nseq*2 : msa->nseq;
+ if((status = add_pages_sspostscript(ps, new_npage, INDIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ /* add the pages carefully, we allocate posterior pages and seq pages differently */
+ for(p = orig_npage; p < ps->npage; p++) {
+ /* allocate seq page */
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * (ps->rflen+1));
+ if(do_rescol) ESL_ALLOC(ps->rcolAAA[p], sizeof(float *) * ps->rflen);
+ if(do_outline) {
+ ESL_ALLOC(ps->otypeAA[p], sizeof(char) * ps->rflen);
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) ps->otypeAA[p][rfpos] = OUTLINE_NONE_IDX;
+ }
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->sclAA[p], sizeof(SchemeColorLegend_t) * 1);
+ noccl = 2;
+ if (do_rescol) noccl += 5;
+ if (do_outline) noccl += 7;
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * noccl);
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ if(do_rescol) ESL_ALLOC(ps->rcolAAA[p][rfpos], sizeof(float) * NCMYK); /* CMYK colors */
+ ESL_ALLOC(ps->bcolAAA[p][rfpos], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+
+ if(do_prob) {
+ /* allocate postprob page */
+ p++;
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * (ps->rflen+1));
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->sclAA[p], sizeof(SchemeColorLegend_t) * 1);
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * 1);
+ if(do_prob_res) ESL_ALLOC(ps->rcolAAA[p], sizeof(float *) * ps->rflen);
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ ESL_ALLOC(ps->bcolAAA[p][rfpos], sizeof(float) * NCMYK); /* CMYK colors */
+ if(do_prob_res) ESL_ALLOC(ps->rcolAAA[p][rfpos], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ }
+
+ /* setup seq limits */
+ ESL_ALLOC(limits_s, sizeof(float) * (hc_nbins_s+1));
+ limits_s[0] = 0;
+ limits_s[1] = 1;
+ limits_s[2] = 2;
+ limits_s[3] = 5;
+ limits_s[4] = 10;
+ limits_s[5] = SSDRAWINFINITY;
+
+ /* setup pp limits */
+ ESL_ALLOC(limits_p, sizeof(float) * (hc_nbins_p+1));
+ limits_p[0] = 0.0;
+ limits_p[1] = 0.35;
+ limits_p[2] = 0.55;
+ limits_p[3] = 0.75;
+ limits_p[4] = 0.85;
+ limits_p[5] = 0.95;
+ limits_p[6] = 1.00;
+
+ /* allocate the uaseqlenA data structure to store unaligned seq lengths */
+ if(ps->uaseqlenA != NULL) { free(ps->uaseqlenA); ps->uaseqlenA = NULL; }
+ ESL_ALLOC(ps->uaseqlenA, sizeof(int) * msa->nseq);
+ esl_vec_ISet(ps->uaseqlenA, msa->nseq, 0);
+
+ if(tabfp != NULL) {
+ /* determine max length of a name */
+ namewidth = 8; /* length of 'seq name' */
+ for(i = 0; i < msa->nseq; i++) {
+ namewidth = ESL_MAX(namewidth, strlen(msa->sqname[i]));
+ }
+ ESL_ALLOC(namedashes, sizeof(char) * namewidth+1);
+ namedashes[namewidth] = '\0';
+ for(ni = 0; ni < namewidth; ni++) namedashes[ni] = '-';
+ fprintf(tabfp, "# -----------------------\n");
+ fprintf(tabfp, "# Per-sequence statistics\n");
+ fprintf(tabfp, "# -----------------------\n");
+ fprintf(tabfp, "# This section includes %d non #-prefixed lines, one for each sequence\n", ps->rflen);
+ fprintf(tabfp, "# printed to the output postscript file.\n");
+ fprintf(tabfp, "# Each line includes %d tokens, separated by whitespace:\n", do_outline ? 15 : 11);
+ fprintf(tabfp, "# \ttoken 1: 'perseq' (tag defining line type to ease parsing)\n");
+ fprintf(tabfp, "# \ttoken 2: sequence name\n");
+ fprintf(tabfp, "# \ttoken 3: spos: aligned position of first (5'-most) nongap nucleotide in sequence\n");
+ fprintf(tabfp, "# \ttoken 4: epos: aligned position of final (3'-most) nongap nucleotide in sequence\n");
+ fprintf(tabfp, "# \ttoken 5: number of Watson-Crick basepairs (A-U, C-G, G-C, or U-A) in the sequence\n");
+ fprintf(tabfp, "# \ttoken 6: number of G-U or U-G basepairs in the sequence\n");
+ fprintf(tabfp, "# \ttoken 7: number of non-canonical basepairs (A-A, A-C, A-G, C-A, C-C, C-U, G-A, G-G, U-C, U-U) in the sequence\n");
+ fprintf(tabfp, "# \ttoken 8: number of internal half-gap basepairs in the sequence\n");
+ fprintf(tabfp, "# \ttoken 9: number of internal double-gap basepairs in the sequence\n");
+ fprintf(tabfp, "# \ttoken 10: number of external half-gap basepairs in the sequence\n");
+ fprintf(tabfp, "# \ttoken 11: number of external double-gap basepairs in the sequence\n");
+ if(do_outline) {
+ fprintf(tabfp, "# \ttoken 12: number of nt changes relative to majority rule consensus sequence\n");
+ fprintf(tabfp, "# \ttoken 13: subset of token 12 for which consensus nt occurs in > 0.75 of nongap sequences\n");
+ fprintf(tabfp, "# \ttoken 14: number of internal basepairs in seq that differ from majority rule consensus basepair\n");
+ fprintf(tabfp, "# \t *and* consensus bp is Watson-Crick, G-U or U-G\n");
+ fprintf(tabfp, "# \ttoken 15: subset of token 14 which are Watson-Crick, G-U or U-G in seq\n");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Alignment length: %" PRId64 " (this is max possible value for tokens 3 and 4)\n", msa->alen);
+ fprintf(tabfp, "# Number of consensus basepairs: %d (this is max possible value for tokens 5-11)\n", ps->nbp);
+ fprintf(tabfp, "# A basepair between positions i and j for sequence s is a half-gap basepair if s has\n");
+ fprintf(tabfp, "# a gap at either position i or j, but not both. It is a double-gap basepair if it has\n");
+ fprintf(tabfp, "# a gap at both positions i and j.\n");
+ fprintf(tabfp, "# A basepair between i:j is 'internal' for sequence s if if spos <= i and epos >= j.\n");
+ fprintf(tabfp, "# Otherwise, basepair i:j is 'external' for sequence s.\n");
+ fprintf(tabfp, "# All basepairs that are nongaps in both i and j are necessarily internal.\n");
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# %6s %-*s %4s %4s %4s %4s %4s %4s %4s %4s %4s", "type", namewidth, "seq name", "spos", "epos", "nwc", "ngu", "nnc", "nhgi", "ndgi", "nhge", "ndge");
+ if(do_outline) { fprintf(tabfp, " %4s %4s %5s %5s", "ndf", "nrdf", "nbpdf", "nbpcp"); }
+ fprintf(tabfp, "\n");
+ fprintf(tabfp, "# %6s %-*s %4s %4s %4s %4s %4s %4s %4s %4s %4s", "------", namewidth, namedashes, "----", "----", "----", "----", "----", "----", "----", "----", "----");
+ if(do_outline) { fprintf(tabfp, " %4s %4s %5s %5s", "----", "----", "-----", "-----"); }
+ fprintf(tabfp, "\n");
+ }
+
+ /* Step through each seq, first fill seq page, then possibly postprob page */
+ ai = 0;
+ pp = orig_npage-1;
+ for(i = 0; i < msa->nseq; i++) {
+ /**************************
+ * Draw the sequence page *
+ **************************/
+ pp++;
+ spos = epos = -1;
+ /* determine first and final non-gap position */
+ for(apos = 0; apos < msa->alen; apos++) { /* find first non-gap RF position */
+ if((! esl_abc_CIsGap(abc, msa->aseq[i][apos]))) {
+ spos = apos;
+ break;
+ }
+ }
+ for(apos = msa->alen-1; apos >= 0; apos--) {
+ if((! esl_abc_CIsGap(abc, msa->aseq[i][apos]))) {
+ epos = apos;
+ break;
+ }
+ }
+ ps->sclAA[pp] = create_scheme_colorlegend(hc_scheme_idx_s, hc_nbins_s, limits_s, TRUE, TRUE, TRUE, FALSE);
+ /* init one cell legend counters */
+ nextdel_s = nwc_s = ngu_s = nnc_s = ndgi_s = nhgi_s = ndge_s = nhge_s = noutline_min = noutline_max = noutline_bp_good = noutline_bp_bad = 0;
+ ai++;
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ apos = ps->msa_rf2a_map[rfpos];
+ nins_s = per_seq_ins_ct[i][rfpos+1];
+ apos_is_internal = TRUE; /* set to FALSE below if apos < spos || apos > epos */
+
+ if(! esl_abc_CIsGap(abc, msa->aseq[i][apos])) ps->uaseqlenA[i]++;
+ ps->uaseqlenA[i] += nins_s;
+ ps->rAA[pp][rfpos] = msa->aseq[i][apos];
+ if(do_outline) {
+ if((! esl_abc_CIsGap(abc, msa->aseq[i][apos])) && /* aseq is not a gap at this posn */
+ (esl_abc_CIsCanonical(abc, ps->msa_cseq_maj[rfpos])) && /* cseq is canonical at this posn */
+ (toupper(msa->aseq[i][apos]) != toupper(ps->msa_cseq_maj[rfpos]))) { /* aseq != cseq at this posn */
+ cur_cfreq = abc_ct[apos][esl_abc_DigitizeSymbol(abc, toupper(ps->msa_cseq_maj[rfpos]))] /
+ esl_vec_DSum(abc_ct[apos], abc->K);
+ if(cur_cfreq > 0.75) { ps->otypeAA[pp][rfpos] = OUTLINE_MAX_IDX; noutline_max++; }
+ else { ps->otypeAA[pp][rfpos] = OUTLINE_MIN_IDX; noutline_min++; }
+ }
+ }
+ /* printf("ps->rAA[%3d][%4d]: %c\n", pp, rfpos, ps->rAA[pp][rfpos]); */
+ if((spos != -1 && epos != -1) && /* this should always be true, unless seq has length 0! */
+ (apos < spos || apos > epos)) {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[extdel_idx_s])) != eslOK) return status;
+ nextdel_s++;
+ apos_is_internal = FALSE;
+ }
+ else { /* color insert value */
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_scheme[hc_scheme_idx_s], nins_s, ps->sclAA[pp], TRUE, NULL)) != eslOK) return status;
+ }
+ if(do_rescol || tabfp != NULL) {
+ if(ps->msa_ct[(rfpos+1)] == 0) {
+ if(do_rescol) {
+ /* single-stranded nucleotide or gap, draw same color as Watson-Cricks */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[wcbp_idx_s])) != eslOK) return status;
+ }
+ }
+ else { /* consensus basepaired nucleotide */
+ lpos = apos;
+ rpos = ps->msa_rf2a_map[ps->msa_ct[rfpos+1]-1];
+ lrfpos = rfpos;
+ rrfpos = ps->msa_ct[rfpos+1]-1;
+ maj_bp_is_wc_or_gu = ((is_watson_crick_bp(ps->msa_cseq_maj[lrfpos], ps->msa_cseq_maj[rrfpos]))
+ || (is_gu_or_ug_bp(ps->msa_cseq_maj[lrfpos], ps->msa_cseq_maj[rrfpos]))) ? TRUE : FALSE;
+ lpos_is_internal = apos_is_internal;
+ rpos_is_internal = TRUE; /* we set to FALSE below if nec */
+ if((spos != -1 && epos != -1) && /* this should always be true, unless seq has length 0! */
+ (rpos < spos || rpos > epos)) {
+ rpos_is_internal = FALSE;
+ }
+ if(lpos_is_internal && rpos_is_internal) { /* BP is either Watson-Crick, G:U/U:G, non-canonical, internal double-gap bp or internal half-gap bp */
+ if(is_watson_crick_bp(msa->aseq[i][lpos], msa->aseq[i][rpos])) { /* watson-crick */
+ if(do_rescol) {
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[wcbp_idx_s])) != eslOK) return status;
+ }
+ if(lpos < rpos) nwc_s++;
+ if(do_outline && (lpos > rpos) && maj_bp_is_wc_or_gu) {
+ /* check if this seq has a different WC or GU bp than the majority consensus */
+ if((ps->otypeAA[pp][lrfpos] != OUTLINE_NONE_IDX) ||
+ (ps->otypeAA[pp][rrfpos] != OUTLINE_NONE_IDX)) {
+ noutline_bp_good++;
+ }
+ }
+ }
+ else if(is_gu_or_ug_bp(msa->aseq[i][lpos], msa->aseq[i][rpos])) { /* G:U or U:G */
+ if(do_rescol) {
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[gubp_idx_s])) != eslOK) return status;
+ }
+ if(lpos < rpos) ngu_s++;
+ if(do_outline && (lpos > rpos) && maj_bp_is_wc_or_gu) {
+ if((ps->otypeAA[pp][lrfpos] != OUTLINE_NONE_IDX) ||
+ (ps->otypeAA[pp][rrfpos] != OUTLINE_NONE_IDX)) {
+ noutline_bp_good++;
+ }
+ }
+ }
+ else if ((! esl_abc_CIsResidue(abc, msa->aseq[i][lpos])) && (! esl_abc_CIsResidue(abc, msa->aseq[i][rpos]))) { /* internal double-gap basepair */
+ if(do_rescol) {
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[dgbp_idx_s])) != eslOK) return status;
+ }
+ if(lpos < rpos) ndgi_s++;
+ if(do_outline && (lpos > rpos) && maj_bp_is_wc_or_gu) {
+ if((ps->otypeAA[pp][lrfpos] != OUTLINE_NONE_IDX) ||
+ (ps->otypeAA[pp][rrfpos] != OUTLINE_NONE_IDX)) {
+ noutline_bp_bad++;
+ }
+ }
+ }
+ else if ((! esl_abc_CIsResidue(abc, msa->aseq[i][lpos])) || (! esl_abc_CIsResidue(abc, msa->aseq[i][rpos]))) { /* internal half-gap basepair */
+ if(do_rescol) {
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[hgbp_idx_s])) != eslOK) return status;
+ }
+ if(lpos < rpos) nhgi_s++;
+ if(do_outline && (lpos > rpos) && maj_bp_is_wc_or_gu) {
+ if((ps->otypeAA[pp][lrfpos] != OUTLINE_NONE_IDX) ||
+ (ps->otypeAA[pp][rrfpos] != OUTLINE_NONE_IDX)) {
+ noutline_bp_bad++;
+ }
+ }
+ }
+ else { /* non-canonical */
+ if(do_rescol) {
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[ncbp_idx_s])) != eslOK) return status;
+ }
+ if(lpos < rpos) nnc_s++;
+ if(do_outline && (lpos > rpos) && maj_bp_is_wc_or_gu) {
+ if((ps->otypeAA[pp][lrfpos] != OUTLINE_NONE_IDX) ||
+ (ps->otypeAA[pp][rrfpos] != OUTLINE_NONE_IDX)) {
+ noutline_bp_bad++;
+ }
+ }
+ }
+ } /* end of (if(lpos_is_internal && rpos_is_internal)) */
+ else { /* we'll draw this nucleotide as black */
+ if ((! esl_abc_CIsResidue(abc, msa->aseq[i][lpos])) && (! esl_abc_CIsResidue(abc, msa->aseq[i][rpos]))) { /* external double-gap basepair */
+ ndge_s++;
+ }
+ if ((! esl_abc_CIsResidue(abc, msa->aseq[i][lpos])) || (! esl_abc_CIsResidue(abc, msa->aseq[i][rpos]))) { /* external half-gap basepair */
+ nhge_s++;
+ }
+ if(do_rescol) {
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[BLACKOC])) != eslOK) return status;
+ }
+ }
+ }
+ }
+ }
+ ps->rAA[pp][ps->rflen] = '\0';
+ ps->seqidxA[pp] = i;
+ ps->nocclA[pp] = 0;
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, " perseq %-*s %4d %4d %4d %4d %4d %4d %4d %4d %4d", namewidth, msa->sqname[i], spos+1, epos+1, nwc_s, ngu_s, nnc_s, nhgi_s, ndgi_s, nhge_s, ndge_s);
+ if(do_outline) {
+ fprintf(tabfp, " %4d %4d %5d %5d", noutline_min + noutline_max, noutline_max, noutline_bp_good + noutline_bp_bad, noutline_bp_good);
+ }
+ fprintf(tabfp, "\n");
+ }
+
+ /* if nec, add one-cell color legends for different bp types */
+ if(do_rescol) {
+ /* add one-cell color legend for watson-crick basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[wcbp_idx_s], nwc_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "Watson-Crick basepair (WC bp)", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "C-G", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add one-cell color legend for G-U, U-G basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[gubp_idx_s], ngu_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "G-U or U-G bp", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "G-U", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add one-cell color legend for non-canonical basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[ncbp_idx_s], nnc_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "non-canonical bp", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "A-A", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add one-cell color legend for internal half-gap basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[hgbp_idx_s], nhgi_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "internal half-gap bp", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "A--", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add one-cell color legend for internal double-gap basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[dgbp_idx_s], ndgi_s, OCCL_BLANK_COUNT, TRUE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "internal double-gap bp", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "---", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+ }
+
+ /* if nec, add one page cell legend for the two outline types */
+ if(do_outline) {
+ /* add a psuedo-one-cell color legends, the explanatory text for outlines: */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[BLACKOC], OCCL_BLANK_COUNT, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "Positions != to most common nt x:", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* allocate our stack for the procedure */
+ ESL_ALLOC(stack, sizeof(float) * 2);
+ stack[0] = ps->leg_cellsize;
+ stack[1] = ps->leg_cellsize * OUTLINE_LINEWIDTH_CELL_FRACTION_MIN;
+ /* add one-cell color legend for minimal outline */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[BLACKOC], noutline_min, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "!= x and freq(x) < 0.75", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_procedure_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], OUTLINE_PROCEDURE, stack, 2, errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ stack[1] = ps->leg_cellsize * OUTLINE_LINEWIDTH_CELL_FRACTION_MAX;
+ /* add one-cell color legend for maximal outline */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[BLACKOC], noutline_max, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "!= x and freq(x) >= 0.75", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_procedure_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], OUTLINE_PROCEDURE, stack, 2, errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add a psuedo-one-cell color legends, the explanatory text for outline basepairs: */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[BLACKOC], OCCL_BLANK_COUNT, OCCL_BLANK_COUNT, FALSE, TRUE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "Number of bps != most common bp a:b", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add a psuedo-one-cell color legends, the explanatory text for outline basepairs: */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[BLACKOC], OCCL_BLANK_COUNT, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "and a:b is Watson-Crick, GU or UG:", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[BLACKOC], noutline_bp_good, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], " Watson-Crick, GU or UG but != a:b", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[BLACKOC], noutline_bp_bad, OCCL_BLANK_COUNT, TRUE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], " non-canonical or w/gap and != a:b", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+ }
+
+ /* add description to ps */
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], "# inserted nucleotides after each consensus position", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_page_desc_to_sspostscript(ps, pp, msa->sqname[i], errbuf)) != eslOK) return status;
+ /* done with seq page */
+
+ /* add one-cell color legend for external gaps (deletes) */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[extdel_idx_s], nextdel_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "5'/3'-flush gaps", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /***************************************
+ * Draw the posterior probability page *
+ ***************************************/
+ if(do_prob) { /* contract checked that msa->pp[i] is non-NULL */
+ pp++;
+
+ ps->sclAA[pp] = create_scheme_colorlegend(hc_scheme_idx_p, hc_nbins_p, limits_p, FALSE, TRUE, TRUE, FALSE);
+ ngap_p = 0;
+ ngap_masked_p = (ps->mask == NULL) ? -1 : 0;
+
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ apos = ps->msa_rf2a_map[rfpos];
+ if(do_prob_res) {
+ ps->rAA[pp][rfpos] = msa->aseq[i][apos];
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ else {
+ ps->rAA[pp][rfpos] = ' '; /* no need to add color to a ' ' */
+ }
+ if(! esl_abc_CIsGap(abc, msa->aseq[i][apos])) {
+ if((ppidx = get_pp_idx(abc, msa->pp[i][apos])) == -1) ESL_FAIL(eslEFORMAT, errbuf, "bad #=GR PP char: %c", msa->pp[i][apos]);
+ if(ppidx == 11) ESL_FAIL(eslEFORMAT, errbuf, "nongap nucleotide: %c, annotated with gap #=GR PP char: %c", msa->aseq[i][apos], msa->pp[i][apos]);
+ within_mask = (ps->mask != NULL && ps->mask[rfpos] == '1') ? TRUE : FALSE;
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_scheme[hc_scheme_idx_p], ppavgA[ppidx], ps->sclAA[pp], within_mask, NULL)) != eslOK) return status;
+ }
+ else {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[gap_idx_p])) != eslOK) return status;
+ ngap_p++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') ngap_masked_p++;
+ }
+ }
+
+ /* add one-cell color legend */
+ ps->occlAAA[pp][0] = create_onecell_colorlegend(hc_onecell[gap_idx_p], ngap_p, ngap_masked_p, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "gap", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ ps->nocclA[pp] = 1;
+
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], "posterior probability \\(alignment confidence\\)", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ ps->seqidxA[pp] = i;
+ if((status = add_page_desc_to_sspostscript(ps, pp, msa->sqname[i], errbuf)) != eslOK) return status;
+
+ ps->rAA[pp][ps->rflen] = '\0';
+ }
+ } /* end of for(i = 0; i < msa->nseq; i++) */
+ free(limits_s);
+ free(limits_p);
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "individuals_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* Function: cons_seq_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with 1 new page, the consensus sequence.
+ * Return: eslOK on success.
+ */
+static int
+cons_seq_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps,
+ float **hc_onecell, int wcbp_idx_s, int gubp_idx_s, int ncbp_idx_s, int dgbp_idx_s, int hgbp_idx_s)
+{
+ int status;
+ int p, pp;
+ int rfpos, lpos, rpos;
+ int orig_npage = ps->npage;
+ int nwc_s; /* number of watson-crick bps */
+ int ngu_s; /* number of GU/UG bps */
+ int nnc_s; /* number of noncanonical bps */
+ int ndgi_s = 0; /* number of internal double-gap basepairs */
+ int nhgi_s = 0; /* number of internal half-gap basepairs */
+ int spos, epos; /* first/final nongap position for consensus sequence */
+ int lpos_is_internal; /* is lpos within spos..epos?, if not it's an external deletion */
+ int rpos_is_internal; /* is rpos within spos..epos?, if not it's an external deletion */
+ int lpos_is_gap; /* is lpos a gap */
+ int rpos_is_gap; /* is rpos a gap */
+
+ nwc_s = ngu_s = nnc_s = ndgi_s = nhgi_s = 0;
+
+ if((status = add_pages_sspostscript(ps, 1, INDIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ ESL_ALLOC(ps->tlAAA[p], sizeof(TextLegend_t *) * 1);
+ }
+
+ /* fill ps->rAA with nucleotides and gaps for RF sequence */
+ pp = orig_npage;
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ ps->rAA[pp][rfpos] = esl_opt_GetBoolean(go, "--cambig") ? ps->msa_cseq_amb[rfpos] : ps->msa_cseq_maj[rfpos];
+ }
+
+ if((! esl_opt_GetBoolean(go, "--cambig")) && (! esl_opt_GetBoolean(go, "--no-bp"))) {
+ spos = epos = -1;
+ /* determine first and final non-gap position */
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) { /* find first non-gap RF position */
+ if(! esl_abc_CIsGap(ps->abc, ps->msa_cseq_maj[rfpos])) {
+ spos = rfpos;
+ break;
+ }
+ }
+ for(rfpos = ps->rflen-1; rfpos >= 0; rfpos--) {
+ if(! esl_abc_CIsGap(ps->abc, ps->msa_cseq_maj[rfpos])) {
+ epos = rfpos;
+ break;
+ }
+ }
+
+ ESL_ALLOC(ps->rcolAAA[pp], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->occlAAA[pp], sizeof(OneCellColorLegend_t *) * 5);
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ ESL_ALLOC(ps->rcolAAA[pp][rfpos], sizeof(float) * NCMYK); /* CMYK colors */
+ if(ps->msa_ct[(rfpos+1)] == 0) { /* single stranded */
+ /* single-stranded nucleotide or gap, draw same color as Watson-Cricks */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[wcbp_idx_s])) != eslOK) return status;
+ }
+ else { /* basepair, either watson-crick, GU/UG, or non-canonical */
+ lpos = rfpos;
+ rpos = ps->msa_ct[rfpos+1]-1;
+ lpos_is_internal = ((lpos < spos) || (lpos > epos)) ? FALSE : TRUE;
+ rpos_is_internal = ((rpos < spos) || (rpos > epos)) ? FALSE : TRUE;
+ lpos_is_gap = esl_abc_CIsGap(ps->abc, ps->msa_cseq_maj[lpos]) ? TRUE : FALSE;
+ rpos_is_gap = esl_abc_CIsGap(ps->abc, ps->msa_cseq_maj[rpos]) ? TRUE : FALSE;
+ if(lpos_is_internal && rpos_is_internal) { /* BP is either Watson-Crick, G:U/U:G, non-canonical, internal double-gap bp or internal half-gap bp */
+ if(is_watson_crick_bp(ps->msa_cseq_maj[lpos], ps->msa_cseq_maj[rpos])) { /* watson-crick */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[wcbp_idx_s])) != eslOK) return status;
+ if(lpos < rpos) nwc_s++;
+ }
+ else if(is_gu_or_ug_bp(ps->msa_cseq_maj[lpos], ps->msa_cseq_maj[rpos])) { /* G:U or U:G */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[gubp_idx_s])) != eslOK) return status;
+ if(lpos < rpos) ngu_s++;
+ }
+ else if (lpos_is_gap && rpos_is_gap) { /* internal double-gap basepair */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[dgbp_idx_s])) != eslOK) return status;
+ if(lpos < rpos) ndgi_s++;
+ }
+ else if (lpos_is_gap || rpos_is_gap) { /* internal double-gap basepair */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[hgbp_idx_s])) != eslOK) return status;
+ if(lpos < rpos) nhgi_s++;
+ }
+ else { /* non-canonical */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[ncbp_idx_s])) != eslOK) return status;
+ if(lpos < rpos) nnc_s++;
+ }
+ } /* end of (if(lpos_is_internal && rpos_is_internal)) */
+ else {
+ /* either the left half of the bp is before the first nongap nt,
+ * or the right half of the bp is after the final nongap nt,
+ * for both cases, draw the nt as black, and don't count it as
+ * any type of basepair
+ */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[BLACKOC])) != eslOK) return status;
+ }
+ }
+ }
+
+ /* add one-cell color legend for watson-crick basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[wcbp_idx_s], nwc_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "Watson-Crick basepair (bp)", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "C-G", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add one-cell color legend for G-U, U-G basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[gubp_idx_s], ngu_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "G-U or U-G bp", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "G-U", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add one-cell color legend for non-canonical basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[ncbp_idx_s], nnc_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "non-canonical bp", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "A-A", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add one-cell color legend for internal half-gap basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[hgbp_idx_s], nhgi_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "internal half-gap bp", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "A--", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add one-cell color legend for internal double-gap basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[dgbp_idx_s], ndgi_s, OCCL_BLANK_COUNT, TRUE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "internal double-gap bp", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "---", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+ }
+
+ /* add description to ps */
+ if((status = add_page_desc_to_sspostscript(ps, pp, "alignment consensus sequence", errbuf)) != eslOK) return status;
+
+ /* add text legend explaining how consensus nucleotides are determined */
+ ps->tlAAA[pp][0] = create_text_legend_for_consensus_sequence(go, FALSE);
+ ps->ntlA[pp] = 1;
+
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "cons_seq_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* Function: rf_seq_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with 1 new page, the RF sequence.
+ * Return: eslOK on success.
+ */
+static int
+rf_seq_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, ESL_MSA *msa, int do_rescol,
+ float **hc_onecell, int wcbp_idx_s, int gubp_idx_s, int ncbp_idx_s)
+{
+ int status;
+ int p, pp;
+ int rfpos, apos, lpos, rpos;
+ int orig_npage = ps->npage;
+ int seen_canonical = FALSE;
+ int nwc_s; /* number of watson-crick bps */
+ int ngu_s; /* number of GU/UG bps */
+ int nnc_s; /* number of noncanonical bps */
+
+ nwc_s = ngu_s = nnc_s = 0;
+
+ if((status = add_pages_sspostscript(ps, 1, INDIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ }
+
+ /* fill ps->rAA with nucleotides and gaps for RF sequence */
+ pp = orig_npage;
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ apos = ps->msa_rf2a_map[rfpos];
+ if(esl_abc_CIsCanonical(ps->abc, msa->rf[apos])) seen_canonical = TRUE;
+ ps->rAA[pp][rfpos] = msa->rf[apos];
+ }
+ /* if seen_canonical is still FALSE, the reference sequences is probably all 'x's, so we don't color by bp type */
+
+ if(do_rescol && seen_canonical) { /* determine color for the nucleotide, depends if it is single-stranded or basepaired */
+ ESL_ALLOC(ps->rcolAAA[pp], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->occlAAA[pp], sizeof(OneCellColorLegend_t *) * 3);
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ ESL_ALLOC(ps->rcolAAA[pp][rfpos], sizeof(float) * NCMYK); /* CMYK colors */
+ apos = ps->msa_rf2a_map[rfpos];
+ if(ps->msa_ct[(rfpos+1)] == 0) { /* single stranded */
+ /* single-stranded nucleotide or gap, draw same color as Watson-Cricks */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[wcbp_idx_s])) != eslOK) return status;
+ }
+ else { /* basepair, either watson-crick, GU/UG, or non-canonical */
+ lpos = apos;
+ rpos = ps->msa_rf2a_map[ps->msa_ct[rfpos+1]-1];
+ if(is_watson_crick_bp(msa->rf[lpos], msa->rf[rpos])) { /* watson-crick */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[wcbp_idx_s])) != eslOK) return status;
+ if(lpos < rpos) nwc_s++;
+ }
+ else if(is_gu_or_ug_bp(msa->rf[lpos], msa->rf[rpos])) { /* G:U or U:G */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[gubp_idx_s])) != eslOK) return status;
+ if(lpos < rpos) ngu_s++;
+ }
+ else { /* non-canonical */
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[ncbp_idx_s])) != eslOK) return status;
+ if(lpos < rpos) nnc_s++;
+ }
+ }
+ }
+
+ /* add one-cell color legend for watson-crick basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[wcbp_idx_s], nwc_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "Watson-Crick basepair (bp)", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "C-G", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add one-cell color legend for G-U, U-G basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[gubp_idx_s], ngu_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "G-U or U-G bp", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "G-U", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+
+ /* add one-cell color legend for non-canonical basepairs */
+ ps->occlAAA[pp][ps->nocclA[pp]] = create_onecell_colorlegend(hc_onecell[ncbp_idx_s], nnc_s, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend (ps, ps->occlAAA[pp][ps->nocclA[pp]], "non-canonical bp", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_celltext_to_onecell_colorlegend(ps, ps->occlAAA[pp][ps->nocclA[pp]], "A-A", errbuf)) != eslOK) return status;
+ ps->nocclA[pp]++;
+ }
+
+ /* add description to ps */
+ if((status = add_page_desc_to_sspostscript(ps, pp, "*REFERENCE* (\"#=GC RF\")", errbuf)) != eslOK) return status;
+
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "rf_seq_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+/* count_msa()
+ *
+ * Given an msa, count nucleotides, post probs, basepairs, and consensus start and end
+ * positions and store them in <ret_abc_ct>, <ret_pp_ct>, <ret_bp_ct>,
+ * <ret_spos_ct>, and <ret_epos_ct>.
+ *
+ * <ret_abc_ct> [0..apos..alen-1][0..abc->K]:
+ * - per position count of each symbol in alphabet over all seqs.
+ *
+ * <ret_bp_ct> [0..apos..alen-1][0..abc->Kp-1][0..abc->Kp-1]
+ * - per (non-pknotted) consensus basepair count of each possible basepair
+ * over all seqs basepairs are indexed by 'i' the minimum of 'i:j' for a
+ * pair between i and j, where i < j. Note that non-canonicals and
+ * gaps and the like are all stored independently.
+ *
+ * <ret_pp_ct> [0..apos..alen-1][0..10]
+ * - per position count of each posterior probability code over all seqs.
+ *
+ * <ret_spos_ct> [0..apos..alen-1]
+ * - per position count of first nongap position over all seqs.
+ *
+ * <ret_epos_ct> [0..apos..alen-1]
+ * - per position count of final nongap position over all seqs.
+ *
+ * A 'gap' has a looser defintion than in esl_abc here, esl_abc's gap,
+ * missing nucleotides and nonnucleotides are all considered 'gaps' here.
+ *
+ * If we encounter an error, we return non-eslOK status and fill
+ * errbuf with error message.
+ *
+ * Returns eslOK upon success.
+ */
+int count_msa(const ESL_ALPHABET *abc, ESL_MSA *msa, char *errbuf, double ***ret_abc_ct, double ****ret_bp_ct, double ***ret_pp_ct, int **ret_spos_ct, int **ret_epos_ct)
+{
+ int status;
+ double **abc_ct = NULL;
+ double ***bp_ct = NULL;
+ int *spos_ct = NULL;
+ int *epos_ct = NULL;
+ int apos, i, j, x, epos;
+ ESL_DSQ *tmp_dsq = NULL;
+ int seen_start = FALSE;
+ /* variables related to getting bp counts */
+ int *ct = NULL; /* 0..alen-1 base pair partners array for current sequence */
+ char *ss_nopseudo = NULL; /* no-pseudoknot version of structure */
+ int nppvals = 12; /* '0'-'9' = 0-9, '*' = 10, gap = '11' */
+ double **pp_ct = NULL; /* [0..alen-1][0..nppvals-1] per position count of each possible PP char over all seqs */
+ int ppidx;
+
+ /* contract check, msa should be in text mode and have ss_cons */
+ if(msa->flags & eslMSA_DIGITAL) ESL_FAIL(eslEINVAL, errbuf, "count_msa() contract violation, MSA is digitized");
+ if(msa->ss_cons == NULL) ESL_FAIL(eslEINVAL, errbuf, "the alignment lacks SS_cons annotation");
+
+ /* allocate pp_ct array, if nec */
+ if(ret_pp_ct != NULL && msa->pp != NULL) {
+ ESL_ALLOC(pp_ct, sizeof(double *) * msa->alen);
+ for(apos = 0; apos < msa->alen; apos++) {
+ ESL_ALLOC(pp_ct[apos], sizeof(double) * nppvals);
+ esl_vec_DSet(pp_ct[apos], nppvals, 0.);
+ }
+ }
+
+ /* get ct array which defines the consensus base pairs */
+ ESL_ALLOC(ct, sizeof(int) * (msa->alen+1));
+ ESL_ALLOC(ss_nopseudo, sizeof(char) * (msa->alen+1));
+ esl_wuss_nopseudo(msa->ss_cons, ss_nopseudo);
+ if ((status = esl_wuss2ct(ss_nopseudo, msa->alen, ct)) != eslOK) ESL_FAIL(status, errbuf, "Consensus structure string is inconsistent.");
+
+ ESL_ALLOC(tmp_dsq, (msa->alen+2) * sizeof(ESL_DSQ));
+ ESL_ALLOC(abc_ct, sizeof(double *) * msa->alen);
+ ESL_ALLOC(bp_ct, sizeof(double **) * msa->alen);
+ for(apos = 0; apos < msa->alen; apos++) {
+ ESL_ALLOC(abc_ct[apos], sizeof(double) * (abc->K+1));
+ esl_vec_DSet(abc_ct[apos], (abc->K+1), 0.);
+ /* careful ct is indexed 1..alen, not 0..alen-1 */
+ if(ct[(apos+1)] > (apos+1)) { /* apos+1 is an 'i' in an i:j pair, where i < j */
+ ESL_ALLOC(bp_ct[apos], sizeof(double *) * (abc->Kp));
+ for(x = 0; x < abc->Kp; x++) {
+ ESL_ALLOC(bp_ct[apos][x], sizeof(double) * (abc->Kp));
+ esl_vec_DSet(bp_ct[apos][x], abc->Kp, 0.);
+ }
+ }
+ else { /* apos+1 is not an 'i' in an i:j pair, where i < j, set to NULL */
+ bp_ct[apos] = NULL;
+ }
+ }
+ ESL_ALLOC(spos_ct, sizeof(int) * msa->alen);
+ ESL_ALLOC(epos_ct, sizeof(int) * msa->alen);
+ esl_vec_ISet(spos_ct, msa->alen, 0);
+ esl_vec_ISet(epos_ct, msa->alen, 0);
+
+ for(i = 0; i < msa->nseq; i++) {
+ seen_start = FALSE;
+ epos = 0; // all seqs should have at least one residue, so we only need to initialize epos to make static analyzers happy.
+ if((status = esl_abc_Digitize(abc, msa->aseq[i], tmp_dsq)) != eslOK) ESL_FAIL(status, errbuf, "problem digitizing sequence %d", i);
+ for(apos = 0; apos < msa->alen; apos++) { /* update appropriate abc count, careful, tmp_dsq ranges from 1..msa->alen (not 0..msa->alen-1) */
+ if((status = esl_abc_DCount(abc, abc_ct[apos], tmp_dsq[apos+1], 1.0)) != eslOK) ESL_FAIL(status, errbuf, "problem counting nucleotide %d of seq %d", apos, i);
+ if(! esl_abc_XIsGap(abc, tmp_dsq[apos+1])) {
+ if(! seen_start) {
+ spos_ct[apos]++;
+ seen_start = TRUE;
+ }
+ epos = apos; // as noted above: must get called at least once per seq.
+ }
+ /* get bp count, if nec */
+ if(bp_ct[apos] != NULL) { /* our flag for whether position (apos+1) is an 'i' in an i:j pair where i < j */
+ j = ct[apos+1] - 1; /* ct is indexed 1..alen */
+ bp_ct[apos][tmp_dsq[(apos+1)]][tmp_dsq[(j+1)]]++;
+ }
+ }
+ epos_ct[epos]++;
+ /* get PP counts, if nec */
+ if(ret_pp_ct != NULL) {
+ if(msa->pp[i] == NULL) ESL_FAIL(eslEINVAL, errbuf, "--prob requires all sequences in the alignment have PP, seq %d does not.", i+1);
+ for(apos = 0; apos < msa->alen; apos++) { /* update appropriate pp count, careful, tmp_dsq ranges from 1..msa->alen (not 0..msa->alen-1) */
+ if((ppidx = get_pp_idx(abc, msa->pp[i][apos])) == -1) ESL_FAIL(eslEFORMAT, errbuf, "bad #=GR PP char: %c", msa->pp[i][apos]);
+ pp_ct[apos][ppidx] += 1.;
+ }
+ }
+ }
+
+ *ret_abc_ct = abc_ct;
+ *ret_bp_ct = bp_ct;
+ *ret_spos_ct = spos_ct;
+ *ret_epos_ct = epos_ct;
+ if(ret_pp_ct != NULL) *ret_pp_ct = pp_ct; /* we only allocated pp_ct if ret_pp_ct != NULL */
+
+ if(tmp_dsq != NULL) free(tmp_dsq);
+ if(ss_nopseudo != NULL) free(ss_nopseudo);
+ if(ct != NULL) free(ct);
+ return eslOK;
+
+ ERROR:
+ if(abc_ct != NULL) esl_Free2D((void **) abc_ct, msa->alen);
+ if(pp_ct != NULL) esl_Free2D((void **) pp_ct, msa->alen);
+ if(bp_ct != NULL) esl_Free3D((void ***) bp_ct, msa->alen, abc->Kp);
+ if(spos_ct != NULL) free(spos_ct);
+ if(epos_ct != NULL) free(epos_ct);
+ if(tmp_dsq != NULL) free(tmp_dsq);
+ ESL_FAIL(status, errbuf, "Error, out of memory while counting important values in the msa.");
+ return status; /* NEVERREACHED */
+}
+
+/* Function: infocontent_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with 1 new page, colored squares indicating
+ * the information content of each consensus column.
+ *
+ * Return: eslOK on success.
+ */
+static int
+infocontent_sspostscript(const ESL_GETOPTS *go, ESL_ALPHABET *abc, char *errbuf, SSPostscript_t *ps, double **abc_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int hc_onecell_idx, FILE *tabfp)
+{
+ int status;
+ int p, pp, c;
+ int rfpos, apos;
+ int orig_npage = ps->npage;
+ double *tmp_obs = NULL;
+ double *ent = NULL;
+ double *bg = NULL;
+ float *limits = NULL;
+ int zero_obs;
+ int nonecell = 0;
+ int nonecell_masked = 0;
+ int within_mask;
+ int bi; /* bin index for current position */
+ int l;
+
+ if((status = add_pages_sspostscript(ps, 1, ALIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->sclAA[p], sizeof(SchemeColorLegend_t) * 1);
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * 1);
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ ESL_ALLOC(ps->rcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->tlAAA[p], sizeof(TextLegend_t *) * 1);
+ }
+ for(c = 0; c < ps->rflen; c++) {
+ ESL_ALLOC(ps->bcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ }
+
+ ESL_ALLOC(ent, sizeof(double) * ps->rflen);
+ ESL_ALLOC(bg, sizeof(double) * abc->K);
+ esl_vec_DSet(bg, abc->K, 1./(abc->K));
+ ESL_ALLOC(tmp_obs, sizeof(double) * abc->K);
+ esl_vec_DSet(tmp_obs, abc->K, 0.);
+
+ pp = orig_npage;
+
+ /* add color legend */
+ ESL_ALLOC(limits, sizeof(float) * (hc_nbins+1));
+ limits[0] = 0.0;
+ limits[1] = 0.4;
+ limits[2] = 0.8;
+ limits[3] = 1.2;
+ limits[4] = 1.6;
+ limits[5] = 1.99;
+ limits[6] = 2.00;
+ ps->sclAA[pp] = create_scheme_colorlegend(hc_scheme_idx, hc_nbins, limits, FALSE, TRUE, TRUE, TRUE);
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, "# ------------------------\n");
+ fprintf(tabfp, "# Information content data\n");
+ fprintf(tabfp, "# ------------------------\n");
+ fprintf(tabfp, "# This section includes %d non #-prefixed lines, one for each consensus position\n", ps->rflen);
+ fprintf(tabfp, "# in the alignment and corresponding template.\n");
+ fprintf(tabfp, "# Each line includes %d tokens, separated by whitespace:\n", ps->mask == NULL ? 5 : 6);
+ fprintf(tabfp, "# \ttoken 1: 'infocontent' (tag defining line type to ease parsing)\n");
+ fprintf(tabfp, "# \ttoken 2: consensus position (starting at 1)\n");
+ fprintf(tabfp, "# \ttoken 3: information content for position (bits)\n");
+ fprintf(tabfp, "# \ttoken 4: number of non-gap nucleotides in position (max possible is %d (num seqs in aln))\n", msa_nseq);
+ fprintf(tabfp, "# \ttoken 5: bin index this positions falls in (see bin values below)\n");
+ if(ps->mask != NULL) {
+ fprintf(tabfp, "# \ttoken 6: '1' if position is included by mask, '0' if not\n");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Information content is calculated as 2.0 - H, where\n");
+ fprintf(tabfp, "# H = - \\sum_x p_x \\log_2 p_x, for x in {A, C, G, U}\n");
+ fprintf(tabfp, "# p_x is the frequency of x for *non-gap* nucleotides at the position.\n");
+ fprintf(tabfp, "# For example, p_A in a column that includes 4 As, 3 Cs, 2 Gs, 1 U and 5 gaps\n");
+ fprintf(tabfp, "# would be 4/10 = 0.4.\n");
+ fprintf(tabfp, "# Maximum possible value for token 3 is %d, the number of sequences in the file.\n", msa_nseq);
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Value ranges for bins:\n");
+ fprintf(tabfp, "# \tbin 0: special case, 0 non-gap nucleotides in this position\n");
+ for(l = 0; l < hc_nbins; l++) {
+ fprintf(tabfp, "# \tbin %2d: [%.3f-%.3f%s information per position (bits)\n", l+1, limits[l], limits[l+1], (l == hc_nbins-1) ? "]" : ")");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# %11s %6s %8s %10s %3s", "type", "cpos", "info", "nongap", "bin");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "mask");
+ fprintf(tabfp, "\n");
+ fprintf(tabfp, "# %11s %6s %8s %10s %3s", "-----------", "------", "--------", "----------", "---");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "----");
+ fprintf(tabfp, "\n");
+ }
+
+ if(ps->mask == NULL) nonecell_masked = -1; /* special flag */
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ apos = ps->msa_rf2a_map[rfpos];
+ esl_vec_DCopy(abc_ct[apos], abc->K, tmp_obs); /* only copy first abc->K values, don't copy gaps */
+ zero_obs = (esl_DCompare(esl_vec_DSum(tmp_obs, abc->K), 0., eslSMALLX1) == eslOK) ? TRUE : FALSE;
+ esl_vec_DNorm(tmp_obs, abc->K);
+ ent[rfpos] = esl_vec_DEntropy(bg, abc->K) - esl_vec_DEntropy(tmp_obs, abc->K);
+
+ if(zero_obs) {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[hc_onecell_idx])) != eslOK) return status;
+ nonecell++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') nonecell_masked++;
+ bi = -1;
+ }
+ else {
+ within_mask = (ps->mask != NULL && ps->mask[rfpos] == '1') ? TRUE : FALSE;
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_scheme[hc_scheme_idx], ent[rfpos], ps->sclAA[pp], within_mask, &bi)) != eslOK) return status;
+ }
+
+ /* fill in info for the consensus nucleotide */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ if(ps->mask == NULL || ps->mask[rfpos] == '1') {
+ ps->rAA[pp][rfpos] = esl_opt_GetBoolean(go, "--cambig") ? ps->msa_cseq_amb[rfpos] : ps->msa_cseq_maj[rfpos];
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ else { /* position is a '0' in the mask, leave it blank (' ') */
+ ps->rAA[pp][rfpos] = ' ';
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ }
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, " infocontent %6d %8.5f %10d %3d", rfpos+1, ent[rfpos], (int) esl_vec_DSum(abc_ct[apos], abc->K), bi+1);
+ if(ps->mask != NULL) fprintf(tabfp, " %4d", ps->mask[rfpos] == '1' ? 1 : 0);
+ fprintf(tabfp, "\n");
+ }
+ }
+
+ /* add one-cell color legend */
+ ps->occlAAA[pp][0] = create_onecell_colorlegend(hc_onecell[hc_onecell_idx], nonecell, nonecell_masked, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "100% gaps", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ ps->nocclA[pp] = 1;
+
+ /* add text to legend */
+ /*sprintf(text, "information content (bits) (total: %.2f bits)", esl_vec_DSum(ent, ps->rflen));*/
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], "information content (bits)", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ /* add the consensus nucleotide explanation text section to the legend */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ps->tlAAA[pp][0] = create_text_legend_for_consensus_sequence(go, FALSE);
+ ps->ntlA[pp] = 1;
+ }
+
+ /* add description to ps */
+ if((status = add_page_desc_to_sspostscript(ps, pp, "information content per position", errbuf)) != eslOK) return status;
+
+ free(ent);
+ free(tmp_obs);
+ free(bg);
+ free(limits);
+
+ if(tabfp != NULL) fprintf(tabfp, "//\n");
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "infocontent_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+/* Function: delete_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with a new page w/colored squares indicating
+ * the number of sequences with gaps (deletions) at each consensus column.
+ * If do_all is TRUE the page shows all deletions. If false only 'internal' deletions,
+ * those that come after the first occupied consensus column of each sequence and
+ * before the final occupied consensus column for each sequence, are shown.
+ *
+ * Return: eslOK on success.
+ */
+static int
+delete_sspostscript(const ESL_GETOPTS *go, ESL_ALPHABET *abc, char *errbuf, SSPostscript_t *ps, double **abc_ct, int *span_ct, int msa_nseq, int do_all, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int hc_zerodel_idx, int hc_fewdel_idx, FILE *tabfp)
+{
+ int status;
+ int p, pp, c, l, bi;
+ int rfpos, apos;
+ int orig_npage = ps->npage;
+ double dfreq;
+ int nzerodel = 0;
+ int nzerodel_masked = 0;
+ int nfewdel = 0;
+ int nfewdel_masked = 0;
+ int within_mask;
+ float *limits = NULL;
+ float fewdel_thresh;
+ float n_ext_del; /* msa_nseq - span_ct[rfpos], number of external deletions */
+ if(ps->mask == NULL) {
+ nzerodel_masked = -1; /* special flag */
+ nfewdel_masked = -1; /* special flag */
+ }
+
+ if((status = add_pages_sspostscript(ps, 1, ALIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->sclAA[p], sizeof(SchemeColorLegend_t) * 1);
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * 2);
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ ESL_ALLOC(ps->rcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->tlAAA[p], sizeof(TextLegend_t *) * 1);
+ }
+ for(c = 0; c < ps->rflen; c++) {
+ ESL_ALLOC(ps->bcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ }
+
+ pp = orig_npage;
+
+ /* add color legend */
+ ESL_ALLOC(limits, sizeof(float) * (hc_nbins+1));
+ fewdel_thresh = 0.001; /* positions with delete freq < this value will be painted specially (dark grey) */
+ limits[0] = fewdel_thresh;
+ limits[1] = 0.05;
+ limits[2] = 0.20;
+ limits[3] = 0.35;
+ limits[4] = 0.50;
+ limits[5] = 0.75;
+ limits[6] = 1.00;
+ ps->sclAA[pp] = create_scheme_colorlegend(hc_scheme_idx, hc_nbins, limits, FALSE, FALSE, TRUE, TRUE);
+
+ if(tabfp != NULL) {
+ if(do_all) {
+ fprintf(tabfp, "# -----------\n");
+ fprintf(tabfp, "# Delete data\n");
+ fprintf(tabfp, "# -----------\n");
+ fprintf(tabfp, "# This section includes %d non #-prefixed lines, one for each consensus position\n", ps->rflen);
+ fprintf(tabfp, "# in the alignment and corresponding template.\n");
+ fprintf(tabfp, "# Each line includes %d tokens, separated by whitespace:\n", ps->mask == NULL ? 4 : 5);
+ fprintf(tabfp, "# \ttoken 1: 'deleteall' (tag defining line type to ease parsing)\n");
+ fprintf(tabfp, "# \ttoken 2: consensus position (starting at 1)\n");
+ fprintf(tabfp, "# \ttoken 3: frequency of deletions (gaps) for position\n");
+ fprintf(tabfp, "# \ttoken 4: bin index this positions falls in (see bin values below)\n");
+ if(ps->mask != NULL) {
+ fprintf(tabfp, "# \ttoken 5: '1' if position is included by mask, '0' if not\n");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# A sequence s has a 'delete' at consensus position x if position\n");
+ fprintf(tabfp, "# x is a gap for aligned sequence s.\n");
+ fprintf(tabfp, "# Total number of sequences in the alignment is %d\n", msa_nseq);
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Value ranges for bins:\n");
+ fprintf(tabfp, "# \tbin 0: special case, 0 sequences have a delete at position\n");
+ fprintf(tabfp, "# \tbin 1: special case, < %.5f fraction of sequences have internal deletes at position\n", fewdel_thresh);
+ for(l = 0; l < hc_nbins; l++) {
+ fprintf(tabfp, "# \tbin %2d: [%.3f-%.3f%s frequency of deletes per position\n", l+2, limits[l], limits[l+1], (l == hc_nbins-1) ? "]" : ")");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# %9s %6s %8s %3s", "type", "cpos", "dfreq", "bin");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "mask");
+ fprintf(tabfp, "\n");
+ fprintf(tabfp, "# %9s %6s %8s %3s", "---------", "------", "--------", "---");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "----");
+ fprintf(tabfp, "\n");
+ }
+ else { /* ! do_all (internal deletes only) */
+ fprintf(tabfp, "# --------------------\n");
+ fprintf(tabfp, "# Internal delete data\n");
+ fprintf(tabfp, "# --------------------\n");
+ fprintf(tabfp, "# This section includes %d non #-prefixed lines, one for each consensus position\n", ps->rflen);
+ fprintf(tabfp, "# in the alignment and corresponding template.\n");
+ fprintf(tabfp, "# Each line includes %d tokens, separated by whitespace:\n", ps->mask == NULL ? 5 : 6);
+ fprintf(tabfp, "# \ttoken 1: 'deleteint' (tag defining line type to ease parsing)\n");
+ fprintf(tabfp, "# \ttoken 2: consensus position (starting at 1)\n");
+ fprintf(tabfp, "# \ttoken 3: frequency of internal deletions (gaps) for position\n");
+ fprintf(tabfp, "# \ttoken 4: number of sequences that span (begin at or prior to and end at or after) position (max is %d)\n", msa_nseq);
+ fprintf(tabfp, "# \ttoken 5: bin index this positions falls in (see bin values below)\n");
+ if(ps->mask != NULL) fprintf(tabfp, "# \ttoken 6: '1' if position is included by mask, '0' if not\n");
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# A sequence s has an 'internal delete' at consensus position 'x' that is actual alignment position 'a' if\n");
+ fprintf(tabfp, "# x is a gap for aligned sequence s, and s has at least one non-gap nucleotide aligned to a position 'b' <= 'a'\n");
+ fprintf(tabfp, "# and at least one non-gap nucleotide aligned to a position 'c' >= 'a'\n");
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Value ranges for bins:\n");
+ fprintf(tabfp, "# \tbin 0: special case, 0 sequences have an internal delete at position\n");
+ fprintf(tabfp, "# \tbin 1: special case, < %.5f fraction of sequences have internal deletes at position\n", fewdel_thresh);
+ for(l = 0; l < hc_nbins; l++) {
+ fprintf(tabfp, "# \tbin %2d: [%.3f-%.3f%s frequency of internal deletes per position\n", l+2, limits[l], limits[l+1], (l == hc_nbins-1) ? "]" : ")");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# %9s %6s %8s %10s %3s", "type", "cpos", "dfreq", "nspan", "bin");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "mask");
+ fprintf(tabfp, "\n");
+ fprintf(tabfp, "# %9s %6s %8s %10s %3s", "---------", "------", "--------", "----------", "---");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "----");
+ fprintf(tabfp, "\n");
+ }
+ }
+
+ /* draw delete page */
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ apos = ps->msa_rf2a_map[rfpos];
+ n_ext_del = do_all ? -1. : (float) (msa_nseq - span_ct[rfpos]); /* num external deletes is num seqs minus number of seqs that 'span' apos, see function header comments for explanation */
+ if((( do_all) && ( abc_ct[apos][abc->K] < eslSMALLX1)) || /* abc_ct[apos][abc->K] == 0 */
+ ((!do_all) && ((abc_ct[apos][abc->K] - n_ext_del) < eslSMALLX1))) { /* abc_ct[apos][abc->K] == n_ext_del (all deletes are external) */
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[hc_zerodel_idx])) != eslOK) return status;
+ nzerodel++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') nzerodel_masked++;
+ bi = -2; /* special case */
+ dfreq = 0.;
+ }
+ else {
+ within_mask = (ps->mask != NULL && ps->mask[rfpos] == '1') ? TRUE : FALSE;
+ dfreq = do_all ?
+ ( abc_ct[apos][abc->K] / (float) msa_nseq) :
+ ((abc_ct[apos][abc->K] - n_ext_del) / (float) msa_nseq);
+ /* printf("do_all: %d rfpos: %d dfreq: %.2f\n", do_all, rfpos, dfreq); */
+ if (dfreq < fewdel_thresh) {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[hc_fewdel_idx])) != eslOK) return status;
+ nfewdel++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') nfewdel_masked++;
+ bi = -1; /* special case */
+ }
+ else {
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_scheme[hc_scheme_idx], dfreq, ps->sclAA[pp], within_mask, &bi)) != eslOK) return status;
+ }
+ }
+ /* fill in info for the consensus nucleotide */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ if(ps->mask == NULL || ps->mask[rfpos] == '1') {
+ ps->rAA[pp][rfpos] = esl_opt_GetBoolean(go, "--cambig") ? ps->msa_cseq_amb[rfpos] : ps->msa_cseq_maj[rfpos];
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ else { /* position is a '0' in the mask, leave it blank (' ') */
+ ps->rAA[pp][rfpos] = ' ';
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ }
+
+ if(tabfp != NULL) {
+ if(do_all) fprintf(tabfp, " deleteall %6d %8.5f %3d", rfpos+1, dfreq, bi+2);
+ else fprintf(tabfp, " deleteint %6d %8.5f %10d %3d", rfpos+1, dfreq, span_ct[rfpos], bi+2);
+ if(ps->mask != NULL) fprintf(tabfp, " %4d", ps->mask[rfpos] == '1' ? 1 : 0);
+ fprintf(tabfp, "\n");
+ }
+ }
+
+ /* add one-cell color legend */
+ ps->occlAAA[pp][0] = create_onecell_colorlegend(hc_onecell[hc_zerodel_idx], nzerodel, nzerodel_masked, FALSE, FALSE);
+ ps->occlAAA[pp][1] = create_onecell_colorlegend(hc_onecell[hc_fewdel_idx], nfewdel, nfewdel_masked, FALSE, FALSE);
+ ps->nocclA[pp] = 2;
+
+ if(do_all) {
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "zero deletions", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][1], "< 0.001 seqs have delete", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ }
+ else {
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "zero internal deletions", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][1], "< 0.001 seqs have delete", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ }
+
+ /* add color legend and description */
+ if(do_all) {
+ /*sprintf(text, "fraction seqs w/deletes ('-'=0 deletes; avg/seq: %.2f)", (float) esl_vec_ISum(dct, ps->rflen) / (float) msa_nseq);*/
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], "fraction of seqs with deletes", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_page_desc_to_sspostscript(ps, ps->npage-1, "frequency of deletions at each position", errbuf)) != eslOK) return status;
+ }
+ else { /* !do_all, only internal deletes counted */
+ /*sprintf(text, "fraction seqs w/internal deletes ('-'=0; avg/seq: %.2f)", (float) esl_vec_ISum(dct_internal, ps->rflen) / (float) msa_nseq);*/
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], "fraction of seqs w/internal deletions", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_page_desc_to_sspostscript(ps, ps->npage-1, "frequency of internal deletions in each position", errbuf)) != eslOK) return status;
+ }
+
+ /* add the consensus nucleotide explanation text section to the legend */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ps->tlAAA[pp][0] = create_text_legend_for_consensus_sequence(go, FALSE);
+ ps->ntlA[pp] = 1;
+ }
+
+ free(limits);
+
+ if(tabfp != NULL) fprintf(tabfp, "//\n");
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "delete_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+/* Function: insertfreq_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with 1 new page, with colors
+ * indicating the fraction of seqs with inserts after each
+ * position.
+ *
+ * Return: eslOK on success.
+ */
+static int
+insertfreq_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, int *nseq_with_ins_ct, int *span_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int hc_zeroins_idx, int hc_fewins_idx, FILE *tabfp)
+{
+ int status;
+ int p, pp, c, l;
+ int rfpos;
+ int orig_npage = ps->npage;
+ //int apos;
+ int nzeroins = 0;
+ int nzeroins_masked = 0;
+ int nfewins = 0;
+ int nfewins_masked = 0;
+ float *limits;
+ int within_mask;
+ float ifreq;
+ int bi;
+ float fewins_thresh;
+
+ if(ps->mask == NULL) {
+ nzeroins_masked = -1; /* special flag */
+ nfewins_masked = -1; /* special flag */
+ }
+
+ if((status = add_pages_sspostscript(ps, 1, ALIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->sclAA[p], sizeof(SchemeColorLegend_t) * 1);
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * 2);
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ ESL_ALLOC(ps->rcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->tlAAA[p], sizeof(TextLegend_t *) * 1);
+ }
+ for(c = 0; c < ps->rflen; c++) {
+ ESL_ALLOC(ps->bcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ }
+ pp = orig_npage;
+
+ /* add color legend */
+ ESL_ALLOC(limits, sizeof(float) * (hc_nbins+1));
+ fewins_thresh = 0.001;
+ limits[0] = fewins_thresh;
+ limits[1] = 0.01;
+ limits[2] = 0.05;
+ limits[3] = 0.10;
+ limits[4] = 0.20;
+ limits[5] = 0.50;
+ limits[6] = 1.00;
+ ps->sclAA[pp] = create_scheme_colorlegend(hc_scheme_idx, hc_nbins, limits, FALSE, FALSE, TRUE, TRUE);
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, "# ---------------------\n");
+ fprintf(tabfp, "# Insert frequency data\n");
+ fprintf(tabfp, "# ---------------------\n");
+ fprintf(tabfp, "# This section includes %d non #-prefixed lines, one for each possible insert position\n", ps->rflen+1);
+ fprintf(tabfp, "# after each of the %d consensus positions and one more for inserts prior to the first consensus position.\n", ps->rflen);
+ fprintf(tabfp, "# Each line includes %d tokens, separated by whitespace:\n", ps->mask == NULL ? 5 : 6);
+ fprintf(tabfp, "# \ttoken 1: 'insertfreq' (tag defining line type to ease parsing)\n");
+ fprintf(tabfp, "# \ttoken 2: consensus position <cpos> after which inserts occur ('0' == before posn 1)\n");
+ fprintf(tabfp, "# \ttoken 3: fraction of sequences that span <cpos> (see defn of span below) with >= 1 inserted nucleotides after position\n");
+ fprintf(tabfp, "# \ttoken 4: number of sequences that span (begin at or prior to and end at or after) position (max is %d)\n", msa_nseq);
+ fprintf(tabfp, "# \ttoken 5: bin index this positions falls in (see bin values below)\n");
+ if(ps->mask != NULL) {
+ fprintf(tabfp, "# \ttoken 6: '1' if position is included by mask, '0' if not\n");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Total number of sequences in the alignment is %d\n", msa_nseq);
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# A sequence s spans consensus position 'x' that is actual alignment position 'a' if s has\n");
+ fprintf(tabfp, "# at least one non-gap nucleotide aligned to a position 'b' <= 'a' and\n");
+ fprintf(tabfp, "# at least one non-gap nucleotide aligned to a position 'c' >= 'a'\n");
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Value ranges for bins:\n");
+ fprintf(tabfp, "# \tbin -1: special case, reserved for inserts before position 1,\n");
+ fprintf(tabfp, "# \t these are NOT SHOWN in the postscript diagram (!)\n");
+ fprintf(tabfp, "# \tbin 0: special case, 0 sequences have inserts after this position\n");
+ fprintf(tabfp, "# \tbin 1: special case, < %.5f fraction of sequences have inserts after this position\n", fewins_thresh);
+ for(l = 0; l < hc_nbins; l++) {
+ fprintf(tabfp, "# \tbin %2d: [%.3f-%.3f%s fraction of sequences with >= 1 inserts after each position\n", l+2, limits[l], limits[l+1], (l == hc_nbins-1) ? "]" : ")");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# %10s %6s %8s %10s %3s", "type", "cpos", "ifreq", "nspan", "bin");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "mask");
+ fprintf(tabfp, "\n");
+ fprintf(tabfp, "# %10s %6s %8s %10s %3s", "----------", "------", "--------", "----------", "---");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "----");
+ fprintf(tabfp, "\n");
+ }
+
+ /* print info on inserts before rfpos 1 to tabfile, if nec */
+ if(tabfp != NULL) {
+ //apos = ps->msa_rf2a_map[0];
+ if(nseq_with_ins_ct[0] > span_ct[0]) ESL_FAIL(eslERANGE, errbuf, "drawing insert page, rfpos: 0 nseq_with_ins_ct (%d) exceeds span_ct (%d)", nseq_with_ins_ct[0], span_ct[0]);
+ ifreq = (float) nseq_with_ins_ct[0] / (float) span_ct[0];
+ fprintf(tabfp, " insertfreq %6d %8.5f %10d %3d", 0, ifreq, span_ct[0], -1);
+ if(ps->mask != NULL) fprintf(tabfp, " %4d", 0);
+ fprintf(tabfp, "\n");
+ }
+
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ //apos = ps->msa_rf2a_map[rfpos];
+ if(nseq_with_ins_ct[rfpos+1] > span_ct[rfpos]) ESL_FAIL(eslERANGE, errbuf, "drawing insert page, rfpos: %d nseq_with_ins_ct (%d) exceeds span_ct (%d)", rfpos, nseq_with_ins_ct[rfpos+1], span_ct[rfpos]);
+ ifreq = (float) nseq_with_ins_ct[rfpos+1] / (float) span_ct[rfpos]; /* note we don't need to add one to span_ct, it is [0..rflen-1] */
+ if(nseq_with_ins_ct[(rfpos+1)] == 0) { /* careful, nseq_with_ins_ct goes from 1..rflen, its off-by-one with other arrays */
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[hc_zeroins_idx])) != eslOK) return status;
+ nzeroins++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') nzeroins_masked++;
+ bi = -2; /* special case */
+ }
+ else if (ifreq < fewins_thresh) {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[hc_fewins_idx])) != eslOK) return status;
+ nfewins++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') nfewins_masked++;
+ bi = -1; /* special case */
+ }
+ else {
+ within_mask = (ps->mask != NULL && ps->mask[rfpos] == '1') ? TRUE : FALSE;
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_scheme[hc_scheme_idx], ifreq, ps->sclAA[pp], within_mask, &bi)) != eslOK) return status;
+ }
+ /* printf("rfpos: %5d ifreq: %.3f\n", rfpos, ifreq); */
+
+ /* fill in info for the consensus nucleotide */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ if(ps->mask == NULL || ps->mask[rfpos] == '1') {
+ ps->rAA[pp][rfpos] = esl_opt_GetBoolean(go, "--cambig") ? ps->msa_cseq_amb[rfpos] : ps->msa_cseq_maj[rfpos];
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ else { /* position is a '0' in the mask, leave it blank (' ') */
+ ps->rAA[pp][rfpos] = ' ';
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ }
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, " insertfreq %6d %8.5f %10d %3d", rfpos+1, ifreq, span_ct[rfpos], bi+1);
+ if(ps->mask != NULL) fprintf(tabfp, " %4d", ps->mask[rfpos] == '1' ? 1 : 0);
+ fprintf(tabfp, "\n");
+ }
+ }
+
+ /* add one-cell color legend */
+ ps->occlAAA[pp][0] = create_onecell_colorlegend(hc_onecell[hc_zeroins_idx], nzeroins, nzeroins_masked, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "zero insertions", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ ps->occlAAA[pp][1] = create_onecell_colorlegend(hc_onecell[hc_fewins_idx], nfewins, nfewins_masked, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][1], "< 0.001 seqs have insert", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ ps->nocclA[pp] = 2;
+
+ /* add color legend */
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], "fraction of seqs w/insertions", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_page_desc_to_sspostscript(ps, ps->npage-1, "frequency of insertions after each position", errbuf)) != eslOK) return status;
+
+ /* add the consensus nucleotide explanation text section to the legend */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ps->tlAAA[pp][0] = create_text_legend_for_consensus_sequence(go, FALSE);
+ ps->ntlA[pp] = 1;
+ }
+
+ free(limits);
+
+ if(tabfp != NULL) fprintf(tabfp, "//\n");
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "insertfreq_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* Function: insertavglen_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with 1 new page, with colors
+ * indicating the average length of inserts after each
+ * position.
+ *
+ * Return: eslOK on success.
+ */
+static int
+insertavglen_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, int *nseq_with_ins_ct, int *nins_ct, int *span_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int hc_zeroins_idx, FILE *tabfp)
+{
+ int status;
+ int p, pp, c, l;
+ int rfpos;
+ int orig_npage = ps->npage;
+ //int apos;
+ int nzeroins = 0;
+ int nzeroins_masked = 0;
+ float *limits;
+ int within_mask;
+ float ifreq;
+ float iavglen;
+ int bi;
+
+ if(ps->mask == NULL) nzeroins_masked = -1; /* special flag */
+
+ if((status = add_pages_sspostscript(ps, 1, ALIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->sclAA[p], sizeof(SchemeColorLegend_t) * 1);
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * 1);
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ ESL_ALLOC(ps->rcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->tlAAA[p], sizeof(TextLegend_t *) * 1);
+ }
+ for(c = 0; c < ps->rflen; c++) {
+ ESL_ALLOC(ps->bcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ }
+ pp = orig_npage;
+
+ /* add color legend */
+ ESL_ALLOC(limits, sizeof(float) * (hc_nbins+1));
+ limits[0] = 1.00;
+ limits[1] = 1.01;
+ limits[2] = 1.50;
+ limits[3] = 3.00;
+ limits[4] = 4.00;
+ limits[5] = 10.00;
+ limits[6] = SSDRAWINFINITY;
+ ps->sclAA[pp] = create_scheme_colorlegend(hc_scheme_idx, hc_nbins, limits, FALSE, TRUE, FALSE, TRUE);
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, "# --------------------------\n");
+ fprintf(tabfp, "# Average insert length data\n");
+ fprintf(tabfp, "# --------------------------\n");
+ fprintf(tabfp, "# This section includes %d non #-prefixed lines, one for each possible insert position\n", ps->rflen+1);
+ fprintf(tabfp, "# after each of the %d consensus positions and one more for inserts prior to the first consensus position.\n", ps->rflen);
+ fprintf(tabfp, "# Each line includes %d tokens, separated by whitespace:\n", ps->mask == NULL ? 5 : 6);
+ fprintf(tabfp, "# \ttoken 1: 'insertlen' (tag defining line type to ease parsing)\n");
+ fprintf(tabfp, "# \ttoken 2: consensus position <cpos> after which inserts occur ('0' == before posn 1)\n");
+ fprintf(tabfp, "# \ttoken 3: average number of inserted nucleotides after each position for those seqs with >=1 inserted nucleotides)\n");
+ fprintf(tabfp, "# \ttoken 4: fraction of sequences that span <cpos> (see defn of span below) with >= 1 inserted nucleotides after position\n");
+ fprintf(tabfp, "# \ttoken 5: number of sequences that span (begin at or prior to and end at or after) position (max is %d)\n", msa_nseq);
+ fprintf(tabfp, "# \ttoken 6: bin index this positions falls in (see bin values below)\n");
+ if(ps->mask != NULL) {
+ fprintf(tabfp, "# \ttoken 7: '1' if position is included by mask, '0' if not\n");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Total number of sequences in the alignment is %d\n", msa_nseq);
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# A sequence s spans consensus position 'x' that is actual alignment position 'a' if s has\n");
+ fprintf(tabfp, "# at least one non-gap nucleotide aligned to a position 'b' <= 'a' and\n");
+ fprintf(tabfp, "# at least one non-gap nucleotide aligned to a position 'c' >= 'a'\n");
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Value ranges for bins:\n");
+ fprintf(tabfp, "# \tbin -1: special case, reserved for inserts before position 1,\n");
+ fprintf(tabfp, "# \t these are NOT SHOWN in the postscript diagram (!)\n");
+ fprintf(tabfp, "# \tbin 0: special case, 0 sequences have inserts after this position\n");
+ for(l = 0; l < hc_nbins; l++) {
+ fprintf(tabfp, "# \tbin %2d: [%.3f-%.3f%s average insert length after each position\n", l+1, limits[l], limits[l+1], (l == hc_nbins-1) ? "]" : ")");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# %12s %6s %8s %8s %10s %3s", "type", "cpos", "iavglen", "ifreq", "nspan", "bin");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "mask");
+ fprintf(tabfp, "\n");
+ fprintf(tabfp, "# %12s %6s %8s %8s %10s %3s", "------------", "------", "--------", "--------", "----------", "---");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "----");
+ fprintf(tabfp, "\n");
+ }
+
+ /* print info on inserts before rfpos 1 to tabfile, if nec */
+ if(tabfp != NULL) {
+ //apos = ps->msa_rf2a_map[0];
+ if(nseq_with_ins_ct[0] > span_ct[0]) ESL_FAIL(eslERANGE, errbuf, "drawing insert page, rfpos: 0 nseq_with_ins_ct (%d) exceeds span_ct (%d)", nseq_with_ins_ct[0], span_ct[0]);
+ ifreq = (span_ct[0] == 0) ? 0. : (float) nseq_with_ins_ct[0] / (float) span_ct[0];
+ iavglen = (nseq_with_ins_ct[0] == 0) ? 0. : (float) nins_ct[0] / (float) nseq_with_ins_ct[0];
+ fprintf(tabfp, " insertavglen %6d %8.4f %8.5f %10d %3d", 0, iavglen, ifreq, span_ct[0], -1);
+ if(ps->mask != NULL) fprintf(tabfp, " %4d", 0);
+ fprintf(tabfp, "\n");
+ }
+
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ //apos = ps->msa_rf2a_map[rfpos];
+ if(nseq_with_ins_ct[rfpos+1] > span_ct[rfpos]) ESL_FAIL(eslERANGE, errbuf, "drawing insert page, rfpos: %d nseq_with_ins_ct (%d) exceeds span_ct (%d)", rfpos, nseq_with_ins_ct[rfpos+1], span_ct[rfpos]);
+ ifreq = (span_ct[rfpos] == 0) ? 0. : (float) nseq_with_ins_ct[rfpos+1] / (float) span_ct[rfpos];
+ iavglen = (nseq_with_ins_ct[rfpos+1] == 0) ? 0. : (float) nins_ct[rfpos+1] / (float) nseq_with_ins_ct[rfpos+1];
+ /* printf("rfpos: %5d ifreq: %.3f iavglen: %.3f nins: %10d nseq: %10d\n", rfpos, ifreq, iavglen, nins_ct[rfpos+1], nseq_with_ins_ct[rfpos+1]); */
+ if(nseq_with_ins_ct[(rfpos+1)] == 0) { /* careful, nseq_with_ins_ct goes from 1..rflen, its off-by-one with other arrays */
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[hc_zeroins_idx])) != eslOK) return status;
+ nzeroins++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') nzeroins_masked++;
+ bi = -1; /* special case */
+ }
+ else {
+ within_mask = (ps->mask != NULL && ps->mask[rfpos] == '1') ? TRUE : FALSE;
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_scheme[hc_scheme_idx], iavglen, ps->sclAA[pp], within_mask, &bi)) != eslOK) return status;
+ }
+
+ /* fill in info for the consensus nucleotide */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ if(ps->mask == NULL || ps->mask[rfpos] == '1') {
+ ps->rAA[pp][rfpos] = esl_opt_GetBoolean(go, "--cambig") ? ps->msa_cseq_amb[rfpos] : ps->msa_cseq_maj[rfpos];
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ else { /* position is a '0' in the mask, leave it blank (' ') */
+ ps->rAA[pp][rfpos] = ' ';
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ }
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, " insertavglen %6d %8.4f %8.5f %10d %3d", rfpos+1, iavglen, ifreq, span_ct[rfpos], bi+1);
+ if(ps->mask != NULL) fprintf(tabfp, " %4d", ps->mask[rfpos] == '1' ? 1 : 0);
+ fprintf(tabfp, "\n");
+ }
+ }
+
+ /* add one-cell color legend */
+ ps->occlAAA[pp][0] = create_onecell_colorlegend(hc_onecell[hc_zeroins_idx], nzeroins, nzeroins_masked, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "zero insertions", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ ps->nocclA[pp] = 1;
+
+ /* add color legend */
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], "average insertion length", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_page_desc_to_sspostscript(ps, ps->npage-1, "average insertion length after each position", errbuf)) != eslOK) return status;
+
+ /* add the consensus nucleotide explanation text section to the legend */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ps->tlAAA[pp][0] = create_text_legend_for_consensus_sequence(go, FALSE);
+ ps->ntlA[pp] = 1;
+ }
+
+ free(limits);
+
+ if(tabfp != NULL) fprintf(tabfp, "//\n");
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "insertavglen_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* Function: span_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with 1 new page, with colors
+ * indicating the fraction of seqs that 'span' each consensus
+ * position. A consensus position cpos is spanned by a sequence x if
+ * if at least 1 nucleotide in x is aligned to a consensus position <= cpos
+ * *and* at least 1 nucleotide in x is aligned to a consensus position >= cpos.
+ *
+ * Return: eslOK on success.
+ */
+static int
+span_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, int *span_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int zerocov_idx, int maxcov_idx, FILE *tabfp)
+{
+ int status;
+ int p, pp, c, l;
+ int rfpos;
+ int orig_npage = ps->npage;
+ int nzerocov = 0;
+ int nzerocov_masked = 0;
+ int nmaxcov = 0;
+ int nmaxcov_masked = 0;
+ float *limits;
+ int within_mask;
+ float cfract;
+ int bi;
+
+ if(ps->mask == NULL) nzerocov_masked = nmaxcov_masked = -1; /* special flag */
+
+ if((status = add_pages_sspostscript(ps, 1, ALIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->sclAA[p], sizeof(SchemeColorLegend_t) * 1);
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * 2);
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ ESL_ALLOC(ps->rcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->tlAAA[p], sizeof(TextLegend_t *) * 1);
+ }
+ for(c = 0; c < ps->rflen; c++) {
+ ESL_ALLOC(ps->bcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ }
+
+ pp = orig_npage;
+
+ /* add color legend */
+ ESL_ALLOC(limits, sizeof(float) * (hc_nbins+1));
+ limits[0] = 0.0;
+ limits[1] = 0.167;
+ limits[2] = 0.333;
+ limits[3] = 0.500;
+ limits[4] = 0.667;
+ limits[5] = 0.833;
+ limits[6] = 1.00;
+ ps->sclAA[pp] = create_scheme_colorlegend(hc_scheme_idx, hc_nbins, limits, FALSE, FALSE, FALSE, TRUE);
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, "# ---------\n");
+ fprintf(tabfp, "# Span data\n");
+ fprintf(tabfp, "# ---------\n");
+ fprintf(tabfp, "# This section includes %d non #-prefixed lines, one for each consensus position\n", ps->rflen);
+ fprintf(tabfp, "# in the alignment and corresponding template.\n");
+ fprintf(tabfp, "# Each line includes %d tokens, separated by whitespace:\n", ps->mask == NULL ? 4 : 5);
+ fprintf(tabfp, "# \ttoken 1: 'span' (tag defining line type to ease parsing)\n");
+ fprintf(tabfp, "# \ttoken 2: consensus position (starting at 1)\n");
+ fprintf(tabfp, "# \ttoken 3: fraction of sequences that 'span' position\n");
+ fprintf(tabfp, "# \ttoken 4: bin index this positions falls in (see bin values below)\n");
+ if(ps->mask != NULL) {
+ fprintf(tabfp, "# \ttoken 5: '1' if position is included by mask, '0' if not\n");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# A sequence s spans consensus position 'x' that is actual alignment position 'a' if s has\n");
+ fprintf(tabfp, "# at least one non-gap nucleotide aligned to a position 'b' <= 'a' and\n");
+ fprintf(tabfp, "# at least one non-gap nucleotide aligned to a position 'c' >= 'a'\n");
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Value ranges for bins:\n");
+ fprintf(tabfp, "# \tbin 0: special case, 0 sequences span this position\n");
+ fprintf(tabfp, "# \tbin 1: special case, all %d sequences span this position\n", msa_nseq);
+ for(l = 0; l < hc_nbins; l++) {
+ fprintf(tabfp, "# \tbin %2d: [%.3f-%.3f%s fraction of sequences that span each position\n", l+2, limits[l], limits[l+1], (l == hc_nbins-1) ? "]" : ")");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# %4s %6s %8s %3s", "type", "cpos", "span", "bin");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "mask");
+ fprintf(tabfp, "\n");
+ fprintf(tabfp, "# %4s %6s %8s %3s", "----", "------", "--------", "---");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "----");
+ fprintf(tabfp, "\n");
+ }
+
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ if(span_ct[rfpos] == 0) {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[zerocov_idx])) != eslOK) return status;
+ nzerocov++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') nzerocov_masked++;
+ cfract = 0.;
+ bi = -2;
+ }
+ else if(span_ct[rfpos] == msa_nseq) {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[maxcov_idx])) != eslOK) return status;
+ nmaxcov++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') nmaxcov_masked++;
+ cfract = 1.;
+ bi = -1;
+ }
+ else {
+ within_mask = (ps->mask != NULL && ps->mask[rfpos] == '1') ? TRUE : FALSE;
+ cfract = (float) span_ct[rfpos] / (float) msa_nseq;
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_scheme[hc_scheme_idx], cfract, ps->sclAA[pp], within_mask, &bi)) != eslOK) return status;
+ }
+
+ /* fill in info for the consensus nucleotide */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ if(ps->mask == NULL || ps->mask[rfpos] == '1') {
+ ps->rAA[pp][rfpos] = esl_opt_GetBoolean(go, "--cambig") ? ps->msa_cseq_amb[rfpos] : ps->msa_cseq_maj[rfpos];
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ else { /* position is a '0' in the mask, leave it blank (' ') */
+ ps->rAA[pp][rfpos] = ' ';
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ }
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, " span %6d %8.5f %3d", rfpos+1, cfract, bi+2);
+ if(ps->mask != NULL) fprintf(tabfp, " %4d", ps->mask[rfpos] == '1' ? 1 : 0);
+ fprintf(tabfp, "\n");
+ }
+ }
+
+ /* add one-cell color legend for zero span positions */
+ ps->occlAAA[pp][0] = create_onecell_colorlegend(hc_onecell[zerocov_idx], nzerocov, nzerocov_masked, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "no sequences span", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ /* add one-cell color legend for maximum span positions */
+ ps->occlAAA[pp][1] = create_onecell_colorlegend(hc_onecell[maxcov_idx], nmaxcov, nmaxcov_masked, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][1], "100% of seqs span", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ ps->nocclA[pp] = 2;
+
+ /* add color legend */
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], "fraction of seqs that span each position", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_page_desc_to_sspostscript(ps, ps->npage-1, "fraction of sequences that span each position", errbuf)) != eslOK) return status;
+
+ /* add the consensus nucleotide explanation text section to the legend */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ps->tlAAA[pp][0] = create_text_legend_for_consensus_sequence(go, FALSE);
+ ps->ntlA[pp] = 1;
+ }
+
+ free(limits);
+
+ if(tabfp != NULL) fprintf(tabfp, "//\n");
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "span_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* Function: avg_posteriors_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with info average posterior probabilities in the MSA.
+ * Return: eslOK on success.
+ */
+static int
+avg_posteriors_sspostscript(const ESL_GETOPTS *go, ESL_ALPHABET *abc, char *errbuf, SSPostscript_t *ps, double **pp_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int hc_onecell_idx, FILE *tabfp)
+{
+ int status;
+ int p;
+ int rfpos;
+ int pp;
+ float *limits; /* bin limits for the color scheme */
+ int nonecell_allgap = 0;
+ int nonecell_allgap_masked = 0;
+ int within_mask;
+ int orig_npage = ps->npage;
+ float ppavgA[11];
+ int l;
+ int apos;
+ double nnongap;
+ double ppsum;
+ int ppidx;
+ double ppavg;
+ int bi;
+
+ ppavgA[0] = 0.025;
+ ppavgA[1] = 0.10;
+ ppavgA[2] = 0.20;
+ ppavgA[3] = 0.30;
+ ppavgA[4] = 0.40;
+ ppavgA[5] = 0.50;
+ ppavgA[6] = 0.60;
+ ppavgA[7] = 0.70;
+ ppavgA[8] = 0.80;
+ ppavgA[9] = 0.90;
+ ppavgA[10] = 0.975;
+
+ if(ps->mask == NULL) { nonecell_allgap_masked = -1; } /* special flag */
+
+ if((status = add_pages_sspostscript(ps, 1, ALIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->sclAA[p], sizeof(SchemeColorLegend_t) * 1);
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * 1);
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ ESL_ALLOC(ps->rcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->tlAAA[p], sizeof(TextLegend_t *) * 1);
+ }
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ ESL_ALLOC(ps->bcolAAA[p][rfpos], sizeof(float) * NCMYK); /* CMYK colors */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rcolAAA[p][rfpos], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ }
+
+ ESL_ALLOC(limits, sizeof(float) * (hc_nbins+1));
+ limits[0] = 0.0;
+ limits[1] = 0.70;
+ limits[2] = 0.80;
+ limits[3] = 0.85;
+ limits[4] = 0.90;
+ limits[5] = 0.95;
+ limits[6] = 1.00;
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, "# ----------------------------------\n");
+ fprintf(tabfp, "# Average posterior probability data\n");
+ fprintf(tabfp, "# ----------------------------------\n");
+ fprintf(tabfp, "# This section includes %d non #-prefixed lines, one for each consensus position\n", ps->rflen);
+ fprintf(tabfp, "# in the alignment and corresponding template.\n");
+ fprintf(tabfp, "# Each line includes %d tokens, separated by whitespace:\n", ps->mask == NULL ? 5 : 6);
+ fprintf(tabfp, "# \ttoken 1: 'avgpostprob' (tag defining line type to ease parsing)\n");
+ fprintf(tabfp, "# \ttoken 2: consensus position (starting at 1)\n");
+ fprintf(tabfp, "# \ttoken 3: average posterior probability of non-gap nucleotides for position\n");
+ fprintf(tabfp, "# \ttoken 4: number of non-gap nucleotides in position (max possible is %d (num seqs in aln))\n", msa_nseq);
+ fprintf(tabfp, "# \ttoken 5: bin index this positions falls in (see bin values below)\n");
+ if(ps->mask != NULL) fprintf(tabfp, "# \ttoken 6: '1' if position is included by mask, '0' if not\n");
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Posterior probability (PP) values in the alignment file can have 12 possible values,\n");
+ fprintf(tabfp, "# the average per position is calculated by defining each as the average of its range given\n");
+ fprintf(tabfp, "# below. (For example, a '8' which indicates PP between 0.75 and 0.85 is treated as 0.8).\n");
+ fprintf(tabfp, "# \t'.': gap, corresponds to a gap in the sequence (not counted)\n");
+ fprintf(tabfp, "# \t'0': posterior probability of between 0.00 and 0.05\n");
+ fprintf(tabfp, "# \t'1': posterior probability of between 0.05 and 0.15\n");
+ fprintf(tabfp, "# \t'2': posterior probability of between 0.15 and 0.25\n");
+ fprintf(tabfp, "# \t'3': posterior probability of between 0.25 and 0.35\n");
+ fprintf(tabfp, "# \t'4': posterior probability of between 0.35 and 0.45\n");
+ fprintf(tabfp, "# \t'5': posterior probability of between 0.45 and 0.55\n");
+ fprintf(tabfp, "# \t'6': posterior probability of between 0.55 and 0.65\n");
+ fprintf(tabfp, "# \t'7': posterior probability of between 0.65 and 0.75\n");
+ fprintf(tabfp, "# \t'8': posterior probability of between 0.75 and 0.85\n");
+ fprintf(tabfp, "# \t'9': posterior probability of between 0.85 and 0.95\n");
+ fprintf(tabfp, "# \t'*': posterior probability of between 0.95 and 1.00\n");
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Value ranges for bins:\n");
+ fprintf(tabfp, "# \tbin 0: special case, 0 sequences have a non-gap nucleotide at position\n");
+ for(l = 0; l < hc_nbins; l++) {
+ fprintf(tabfp, "# \tbin %2d: [%.3f-%.3f%s average posterior probability per position\n", l+1, limits[l], limits[l+1], (l == hc_nbins-1) ? "]" : ")");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# %11s %6s %8s %10s %3s", "type", "cpos", "avgpp", "nongap", "bin");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "mask");
+ fprintf(tabfp, "\n");
+ fprintf(tabfp, "# %11s %6s %8s %10s %3s", "-----------", "------", "--------", "----------", "---");
+ if(ps->mask != NULL) fprintf(tabfp, " %4s", "----");
+ fprintf(tabfp, "\n");
+ }
+
+ /* step through each sequence and each column, collecting stats */
+ pp = orig_npage;
+ ps->sclAA[pp] = create_scheme_colorlegend(hc_scheme_idx, hc_nbins, limits, FALSE, TRUE, TRUE, TRUE);
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ apos = ps->msa_rf2a_map[rfpos];
+ nnongap = esl_vec_DSum(pp_ct[apos], 11);
+ if(esl_FCompare(nnongap, 0., eslSMALLX1) == eslOK) { /* effectively 0.0, all gaps */
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[hc_onecell_idx])) != eslOK) return status;
+ nonecell_allgap++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') nonecell_allgap_masked++;
+ bi = -1;
+ ppavg = 0.;
+ }
+ else { /* at least 1 non-gap nucleotide in this position */
+ if(esl_FCompare(nnongap, pp_ct[apos][10], eslSMALLX1)) { /* all nongap nucleotides have highest possible posterior probability */
+ }
+ else {
+ }
+ ppsum = 0.;
+ for(ppidx = 0; ppidx < 11; ppidx++) {
+ ppsum += pp_ct[apos][ppidx] * ppavgA[ppidx]; /* Note: PP value is considered average of range, not minimum ('9' == 0.90 (0.95-0.85/2) */
+ }
+ ppavg = ppsum / nnongap;
+ within_mask = (ps->mask != NULL && ps->mask[rfpos] == '1') ? TRUE : FALSE;
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_scheme[hc_scheme_idx], ppavg, ps->sclAA[pp], within_mask, &bi)) != eslOK) return status;
+ }
+
+ /* fill in info for the consensus nucleotide */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ if(ps->mask == NULL || ps->mask[rfpos] == '1') {
+ ps->rAA[pp][rfpos] = esl_opt_GetBoolean(go, "--cambig") ? ps->msa_cseq_amb[rfpos] : ps->msa_cseq_maj[rfpos];
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ else { /* position is a '0' in the mask, leave it blank (' ') */
+ ps->rAA[pp][rfpos] = ' ';
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ }
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, " avgpostprob %6d %8.5f %10d %3d", rfpos+1, ppavg, (int) nnongap, bi+1);
+ if(ps->mask != NULL) fprintf(tabfp, " %4d", ps->mask[rfpos] == '1' ? 1 : 0);
+ fprintf(tabfp, "\n");
+ }
+ }
+
+ /* add one-cell color legend for all gap positions */
+ ps->occlAAA[pp][0] = create_onecell_colorlegend(hc_onecell[hc_onecell_idx], nonecell_allgap, nonecell_allgap_masked, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "100% gaps", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ ps->nocclA[pp] = 1;
+
+ /* add color legend */
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], "average posterior probability \\(confidence\\)", ps->legx_max_chars,errbuf)) != eslOK) return status;
+
+ /* add the consensus nucleotide explanation text section to the legend */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ps->tlAAA[pp][0] = create_text_legend_for_consensus_sequence(go, FALSE);
+ ps->ntlA[pp] = 1;
+ }
+
+ /* add description to ps */
+ if((status = add_page_desc_to_sspostscript(ps, pp, "average posterior probability per position", errbuf)) != eslOK) return status;
+
+ free(limits);
+
+ if(tabfp != NULL) fprintf(tabfp, "//\n");
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+
+/* Function: colormask_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with 1 new page based on a lanemask, each column
+ * is either black (if included, a '1' in the mask) or pink (not included, a '0' in the
+ * mask.
+ *
+ * Return: eslOK on success.
+ */
+static int
+colormask_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, ESL_MSA *msa, float **hc_onecell, int incmask_idx, int excmask_idx)
+{
+ int status;
+ int p, pp, c;
+ int cpos;
+ int orig_npage = ps->npage;
+ int ncols_inside_mask = 0;
+ int ncols_outside_mask = 0;
+ char *mask_desc = NULL;
+ char *mask_file = NULL;
+
+ if(ps->mask == NULL) ESL_FAIL(eslEINVAL, errbuf, "ps->mask is null when trying to draw maskcol page");
+ if((status = add_pages_sspostscript(ps, 1, SIMPLEMASKMODE)) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * 2);
+ for(c = 0; c < ps->rflen; c++) {
+ ESL_ALLOC(ps->bcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ pp = orig_npage;
+
+ for(cpos = 0; cpos < ps->rflen; cpos++) {
+ if(ps->mask[cpos] == '1') { /* included */
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][cpos], NCMYK, hc_onecell[incmask_idx])) != eslOK) return status;
+ ncols_inside_mask++;
+ }
+ else if(ps->mask[cpos] == '0') {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][cpos], NCMYK, hc_onecell[excmask_idx])) != eslOK) return status;
+ ncols_outside_mask++;
+ }
+ else ESL_FAIL(eslEINVAL, errbuf, "--mask mask char number %d is not a 1 nor a 0, but a %c\n", cpos, ps->mask[cpos]);
+ ps->rAA[pp][cpos] = ' ';
+ }
+
+ /* add color legend */
+ ps->occlAAA[pp][0] = create_onecell_colorlegend(hc_onecell[incmask_idx], ncols_inside_mask, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "columns included by mask", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ ps->occlAAA[pp][1] = create_onecell_colorlegend(hc_onecell[excmask_idx], ncols_outside_mask, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][1], "columns excluded by mask", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ if((status = esl_strcat(&(mask_desc), -1, "mask file: ", -1)) != eslOK) ESL_FAIL(status, errbuf, "error copying mask file name string");;
+ if((status = esl_FileTail(esl_opt_GetString(go, "--mask"), FALSE, &mask_file)) != eslOK) ESL_FAIL(status, errbuf, "error copying mask file name string (probably out of memory).");
+ if((strlen(mask_file) + strlen(mask_desc)) > (ps->desc_max_chars*2 - 2)) { /* desc would be too long, shorten mask_file so desc is legal */
+ /* the -5 below is so we can add '...' to end */
+ if((status = esl_strcat(&(mask_desc), -1, mask_file, ((ps->desc_max_chars*2) - strlen(mask_desc) - 5))) != eslOK) ESL_FAIL(status, errbuf, "error copying mask file name string");
+ if((status = esl_strcat(&(mask_desc), -1, "...", 3)) != eslOK) ESL_FAIL(status, errbuf, "error copying mask file name string");
+ }
+ else { /* desc will not be too long */
+ if((status = esl_strcat(&(mask_desc), -1, mask_file, -1)) != eslOK) ESL_FAIL(status, errbuf, "error copying mask file name string");
+ }
+ free(mask_file);
+ if((status = add_page_desc_to_sspostscript(ps, pp, mask_desc, errbuf)) != eslOK) return status;
+
+ ps->nocclA[pp] = 2;
+
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "colormask_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* Function: diffmask_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with 1 new page based on a comparison between
+ * two masks one in ps->mask the other in <mask2>, each position becomes
+ * one of four colors, one for each of the four possible combinations of 0 and 1.
+ *
+ * Return: eslOK on success.
+ */
+static int
+diffmask_sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, ESL_MSA *msa, char *mask2, float **hc_onecell, int incboth_idx, int inc1_idx, int inc2_idx, int excboth_idx)
+{
+ int status;
+ int p, pp, c;
+ int cpos;
+ int orig_npage = ps->npage;
+ int ncols_in_both = 0;
+ int ncols_out_both = 0;
+ int ncols_in_1_out_2 = 0;
+ int ncols_out_1_in_2 = 0;
+
+ if(ps->mask == NULL) ESL_FAIL(eslEINVAL, errbuf, "ps->mask is null when trying to draw maskdiff page");
+ if((status = add_pages_sspostscript(ps, 1, SIMPLEMASKMODE)) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * 4);
+ for(c = 0; c < ps->rflen; c++) {
+ ESL_ALLOC(ps->bcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ pp = orig_npage;
+
+ for(cpos = 0; cpos < ps->rflen; cpos++) {
+ if(ps->mask[cpos] == '1' && mask2[cpos] == '1') {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][cpos], NCMYK, hc_onecell[incboth_idx])) != eslOK) return status;
+ ncols_in_both++;
+ }
+ else if(ps->mask[cpos] == '1' && mask2[cpos] == '0') {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][cpos], NCMYK, hc_onecell[inc1_idx])) != eslOK) return status;
+ ncols_in_1_out_2++;
+ }
+ else if(ps->mask[cpos] == '0' && mask2[cpos] == '1') {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][cpos], NCMYK, hc_onecell[inc2_idx])) != eslOK) return status;
+ ncols_out_1_in_2++;
+ }
+ else if(ps->mask[cpos] == '0' && mask2[cpos] == '0') {
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][cpos], NCMYK, hc_onecell[excboth_idx])) != eslOK) return status;
+ ncols_out_both++;
+ }
+ else if(ps->mask[cpos] != '0' && ps->mask[cpos] != '1') ESL_FAIL(eslEINVAL, errbuf, "--mask-col char number %d is not a 1 nor a 0, but a %c\n", cpos, ps->mask[cpos]);
+ else if(mask2[cpos] != '0' && mask2[cpos] != '1') ESL_FAIL(eslEINVAL, errbuf, "--mask-diff char number %d is not a 1 nor a 0, but a %c\n", cpos, mask2[cpos]);
+ ps->rAA[pp][cpos] = ' ';
+ }
+
+ /* add color legend */
+ ps->occlAAA[pp][0] = create_onecell_colorlegend(hc_onecell[incboth_idx], ncols_in_both, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "included by both masks", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ ps->occlAAA[pp][1] = create_onecell_colorlegend(hc_onecell[inc1_idx], ncols_in_1_out_2, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][1], "incl mask 1, excl mask 2", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ ps->occlAAA[pp][2] = create_onecell_colorlegend(hc_onecell[inc2_idx], ncols_out_1_in_2, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][2], "excl mask 1, incl mask 1", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ ps->occlAAA[pp][3] = create_onecell_colorlegend(hc_onecell[excboth_idx], ncols_out_both, OCCL_BLANK_COUNT, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][3], "excluded by both masks", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ ps->nocclA[pp] = 4;
+
+ if((status = add_diffmask_page_desc_to_sspostscript(ps, pp, esl_opt_GetString(go, "--mask"), esl_opt_GetString(go, "--mask-diff"), errbuf)) != eslOK) return status;
+
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "diffmask_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+/* Function: add_pages_sspostscript()
+ *
+ * Purpose: Add and initialize blank pages to a postscript object.
+ */
+int
+add_pages_sspostscript(SSPostscript_t *ps, int ntoadd, int page_mode)
+{
+ int status;
+ void *tmp;
+ int p;
+
+ if(ps->npage == 0) {
+ assert(ps->rAA == NULL);
+ assert(ps->bcolAAA == NULL);
+ ESL_ALLOC(ps->rAA, sizeof(char *) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->rcolAAA, sizeof(float **) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->bcolAAA, sizeof(float **) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->otypeAA, sizeof(char *) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->occlAAA, sizeof(OneCellColorLegend_t **) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->nocclA, sizeof(int) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->tlAAA, sizeof(TextLegend_t **) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->ntlA, sizeof(int) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->sclAA, sizeof(SchemeColorLegend_t *) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->descA, sizeof(char *) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->modeA, sizeof(int) * (ps->npage + ntoadd));
+ ESL_ALLOC(ps->seqidxA, sizeof(int) * (ps->npage + ntoadd));
+ }
+ else {
+ assert(ps->rAA != NULL);
+ assert(ps->bcolAAA != NULL);
+ assert(ps->rcolAAA != NULL);
+ ESL_RALLOC(ps->rAA, tmp, sizeof(char *) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->rcolAAA,tmp, sizeof(float **) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->bcolAAA,tmp, sizeof(float **) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->otypeAA,tmp, sizeof(char *) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->occlAAA,tmp, sizeof(OneCellColorLegend_t ***) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->nocclA, tmp, sizeof(int) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->tlAAA, tmp, sizeof(TextLegend_t ***) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->ntlA, tmp, sizeof(int) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->sclAA, tmp, sizeof(SchemeColorLegend_t **) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->descA, tmp, sizeof(char *) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->modeA, tmp, sizeof(int) * (ps->npage + ntoadd));
+ ESL_RALLOC(ps->seqidxA,tmp, sizeof(int) * (ps->npage + ntoadd));
+ }
+ for(p = ps->npage; p < (ps->npage + ntoadd); p++) {
+ ps->rAA[p] = NULL;
+ ps->rcolAAA[p] = NULL;
+ ps->bcolAAA[p] = NULL;
+ ps->otypeAA[p] = NULL;
+ ps->occlAAA[p] = NULL;
+ ps->nocclA[p] = 0;
+ ps->tlAAA[p] = NULL;
+ ps->ntlA[p] = 0;
+ ps->sclAA[p] = NULL;
+ ps->descA[p] = NULL;
+ ps->modeA[p] = page_mode;
+ ps->seqidxA[p] = -1;
+ }
+ ps->npage += ntoadd;
+
+ return eslOK;
+
+ ERROR:
+ return status;
+}
+
+/* read_mask_file
+ *
+ * Given an open file pointer, read the first token of the
+ * file and return it as *ret_mask. Also return length of
+ * mask in *ret_masklen, and a flag indicating whether or
+ * not the mask has any internal zeroes in *ret_mask_has_internal_zeroes.
+ * An internal '0' is one that occurs between at least one
+ * 5' and one 3' '1'
+ *
+ * Returns: eslOK on success.
+ */
+int
+read_mask_file(char *filename, char *errbuf, char **ret_mask, int *ret_masklen, int *ret_mask_has_internal_zeroes)
+{
+ int status;
+ ESL_FILEPARSER *efp;
+ char *tok;
+ char *mask;
+ int toklen;
+ int n;
+ /* for determining if we have internal zeroes */
+ int seen_1 = FALSE; /* becomes TRUE when we see first (5'-most) '1' */
+ int seen_1_then_0 = FALSE; /* becomes TRUE when we see first (5'-most) '0' that is 3' of first '1' */
+ int seen_1_then_0_then_1 = FALSE; /* becomes TRUE when we see first (5'-most) '1' that is 3' of first '0' that is 3' of first '1' */
+
+ if (esl_fileparser_Open(filename, NULL, &efp) != eslOK) ESL_FAIL(eslFAIL, errbuf, "failed to open %s in read_mask_file\n", filename);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ if((status = esl_fileparser_GetToken(efp, &tok, &toklen)) != eslOK) ESL_FAIL(eslFAIL, errbuf, "failed to read a single token from %s\n", filename);
+
+ ESL_ALLOC(mask, sizeof(char) * (toklen+1));
+
+ for(n = 0; n < toklen; n++) {
+ mask[n] = tok[n];
+ if(mask[n] == '0') {
+ if((seen_1) && (!seen_1_then_0)) { seen_1_then_0 = TRUE; }
+ }
+ else if (mask[n] == '1') {
+ if(!seen_1) { seen_1 = TRUE; }
+ if((seen_1) && (seen_1_then_0) && (!seen_1_then_0_then_1)) { seen_1_then_0_then_1 = TRUE; }
+ }
+ else { ESL_FAIL(eslEINVAL, errbuf, "character %d of mask file is invalid: %c (must be a '1' or a '0')\n", n, mask[n]); }
+
+ mask[n] = tok[n];
+ }
+ mask[n] = '\0';
+
+ *ret_mask = mask;
+ *ret_masklen= toklen;
+ *ret_mask_has_internal_zeroes = seen_1_then_0_then_1;
+
+ esl_fileparser_Close(efp);
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+
+/* Function: mutual_information_sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with 1 new page, colored squares indicating
+ * the mutual information of each base paired consensus column.
+ * mutual information is the extra information gained from modelling
+ * the pair together (info of vector of bps, size 16) versus separately (sum
+ * of info of the two independent vector of singlets, size 4).
+ *
+ * Return: eslOK on success.
+ */
+static int
+mutual_information_sspostscript(const ESL_GETOPTS *go, ESL_ALPHABET *abc, char *errbuf, SSPostscript_t *ps, double ***bp_ct, int msa_nseq, float ***hc_scheme, int hc_scheme_idx, int hc_nbins, float **hc_onecell, int ss_idx, int zerores_idx, FILE *tabfp)
+{
+ int status;
+ int p, pp, c, i;
+ int rfpos, apos;
+ int orig_npage = ps->npage;
+ double *bg, *bg_pair;
+ double bg_ent, bg_pair_ent;
+ double *obs_left, *obs_right, *obs_pair;
+ double ent_left, ent_right, ent_pair;
+ int j;
+ ESL_DSQ lres;
+ ESL_DSQ rres;
+ double nres;
+ int nss = 0;
+ int nzerores = 0;
+ int nss_masked = 0;
+ int nzerores_masked = 0;
+ int i_within_mask, j_within_mask;
+ int i_bi, j_bi;
+ float *limits;
+ int l;
+ int idx =1;
+
+ if(ps->mask == NULL) nss_masked = nzerores_masked = -1; /* special flag */
+ if((status = add_pages_sspostscript(ps, 1, ALIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = orig_npage; p < ps->npage; p++) {
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->sclAA[p], sizeof(SchemeColorLegend_t) * 1);
+ ESL_ALLOC(ps->occlAAA[p], sizeof(OneCellColorLegend_t *) * 2);
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * ps->rflen);
+ ESL_ALLOC(ps->rcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->tlAAA[p], sizeof(TextLegend_t *) * 1);
+ }
+ for(c = 0; c < ps->rflen; c++) {
+ ESL_ALLOC(ps->bcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ESL_ALLOC(ps->rcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ }
+ pp = orig_npage;
+
+ /* add color legend */
+ ESL_ALLOC(limits, sizeof(float) * (hc_nbins+1));
+ limits[0] = 0.0;
+ limits[1] = 0.167;
+ limits[2] = 0.333;
+ limits[3] = 0.500;
+ limits[4] = 0.667;
+ limits[5] = 0.833;
+ limits[6] = 1.000;
+ ps->sclAA[pp] = create_scheme_colorlegend(hc_scheme_idx, hc_nbins, limits, FALSE, TRUE, TRUE, TRUE);
+
+ if(tabfp != NULL) {
+ fprintf(tabfp, "# -----------------------\n");
+ fprintf(tabfp, "# Mutual information data\n");
+ fprintf(tabfp, "# -----------------------\n");
+ fprintf(tabfp, "# This section includes %d non #-prefixed lines, one for each consensus position\n", ps->rflen);
+ fprintf(tabfp, "# in the alignment and corresponding template.\n");
+ fprintf(tabfp, "# Each line includes %d tokens, separated by whitespace:\n", ps->mask == NULL ? 9 : 11);
+ fprintf(tabfp, "# \ttoken 1: 'mutualinfo' (tag defining line type to ease parsing)\n");
+ fprintf(tabfp, "# \ttoken 2: base pair index\n");
+ fprintf(tabfp, "# \ttoken 3: 5' consensus position of base pair (starting at 1)\n");
+ fprintf(tabfp, "# \ttoken 4: 3' consensus position of base pair (starting at 1)\n");
+ fprintf(tabfp, "# \ttoken 5: sequence information content at 5' position (bits)\n");
+ fprintf(tabfp, "# \ttoken 6: sequence information content at 3' position (bits)\n");
+ fprintf(tabfp, "# \ttoken 7: mutual information of the base pair (bits)\n");
+ fprintf(tabfp, "# \ttoken 8: number of sequences with non-gap at 5' and 3' posn (max possible is %d)\n", msa_nseq);
+ fprintf(tabfp, "# \ttoken 8: number of sequences with non-gap at 5' and 3' position\n");
+ fprintf(tabfp, "# \ttoken 9: bin index this positions falls in (see bin values below).\n");
+ if(ps->mask != NULL) {
+ fprintf(tabfp, "# \ttoken 10: '1' if 5' position is included by mask, '0' if not\n");
+ fprintf(tabfp, "# \ttoken 11: '1' if 3' position is included by mask, '0' if not\n");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# Information content is calculated as 2.0 - H, where\n");
+ fprintf(tabfp, "# H = - \\sum_x p_x \\log_2 p_x, for x in {A, C, G, U}\n");
+ fprintf(tabfp, "# p_x is the frequency of x for *non-gap* nucleotides at the position.\n");
+ fprintf(tabfp, "# Only nucleotides for sequences which have a non-gap nucleotide at both\n");
+ fprintf(tabfp, "# the 5' and 3' positions of the pair are counted.\n");
+ fprintf(tabfp, "# Mutual information is calculated as\n");
+ fprintf(tabfp, "# \\sum_{x,y} p_{x,y} \\log_2 ((p_x * p_y) / p_{x,y}\n");
+ fprintf(tabfp, "# Value ranges for bins:\n");
+ fprintf(tabfp, "# \tbin 0: special case, 0 sequences have non-gaps at both 5' and 3' position of pair\n");
+ for(l = 0; l < hc_nbins; l++) {
+ fprintf(tabfp, "# \tbin %2d: [%.3f-%.3f%s mutual information per position (bits)\n", l+1, limits[l], limits[l+1], (l == hc_nbins-1) ? "]" : ")");
+ }
+ fprintf(tabfp, "#\n");
+ fprintf(tabfp, "# %10s %4s %5s %5s %8s %8s %9s %10s %3s", "type", "idx", "5'pos", "3'pos", "5'info", "3'info", "mutinfo/2", "nongap", "bin");
+ if(ps->mask != NULL) fprintf(tabfp, " %6s %6s", "5'mask", "3'mask");
+ fprintf(tabfp, "\n");
+ fprintf(tabfp, "# %10s %4s %5s %5s %8s %8s %9s %10s %3s", "----------", "----", "-----", "-----", "--------", "--------", "---------", "----------", "---");
+ if(ps->mask != NULL) fprintf(tabfp, " %6s %6s", "------", "------");
+ fprintf(tabfp, "\n");
+ }
+
+ /* determine background entropy */
+ ESL_ALLOC(bg, sizeof(double) * abc->K);
+ ESL_ALLOC(bg_pair, sizeof(double) * abc->K*abc->K);
+ esl_vec_DSet(bg, abc->K, 1./(abc->K));
+ esl_vec_DSet(bg_pair, abc->K*abc->K, 1./(abc->K*abc->K));
+ bg_pair_ent = esl_vec_DEntropy(bg_pair, abc->K*abc->K);
+ bg_ent = esl_vec_DEntropy(bg, abc->K);
+ free(bg);
+ free(bg_pair);
+
+ ESL_ALLOC(obs_left, sizeof(double) * (abc->K));
+ ESL_ALLOC(obs_right, sizeof(double) * (abc->K));
+ ESL_ALLOC(obs_pair, sizeof(double) * (abc->K*abc->K));
+
+ /* get observed nucleotides and base pairs at each rfpos */
+ for(rfpos = 0; rfpos < ps->rflen; rfpos++) {
+ esl_vec_DSet(obs_left, abc->K, 0.);
+ esl_vec_DSet(obs_right, abc->K, 0.);
+ esl_vec_DSet(obs_pair, abc->K*abc->K, 0.);
+ i = rfpos;
+ nres = 0.;
+ apos = ps->msa_rf2a_map[rfpos];
+ /* check if we're base paired */
+ if(ps->msa_ct[rfpos+1] != 0) {
+ /* printf("msa_ct rfpos+1: %d %d\n", rfpos+1, ps->msa_ct[rfpos+1]); */
+ if(ps->msa_ct[rfpos+1] > (rfpos+1)) { /* rfpos is left half of base pair */
+ /* add up contributions of all possible base pairs,
+ * we have to be careful to skip nucleotides that are gaps, missing or nonnucleotides in
+ * EITHER left or right half of the bp.
+ * We use the raw counts from msa_count() as the wt, (bp_ct[apos][lres][rres]) */
+ j = ps->msa_ct[i+1] - 1;
+ for(lres = 0; lres < abc->K; lres++) {
+ for(rres = 0; rres < abc->K; rres++) {
+ /* printf("apos: %d rfpos: %d lres: %d rres: %d bp_ct[][][]: %.5f\n", apos, rfpos, lres, rres, bp_ct[apos][lres][rres]);*/
+ esl_abc_DCount(abc, obs_left, lres, bp_ct[apos][lres][rres]);
+ esl_abc_DCount(abc, obs_right, rres, bp_ct[apos][lres][rres]);
+ PairCount(abc, obs_pair, lres, rres, bp_ct[apos][lres][rres]);
+ nres += bp_ct[apos][lres][rres];
+ }
+ }
+ for(lres = abc->K+1; lres < abc->Kp-2; lres++) { /* do all degenerates and 'any' (N) */
+ for(rres = abc->K+1; rres < abc->Kp-2; rres++) { /* do all degenerates and 'any' (N) */
+ esl_abc_DCount(abc, obs_left, lres, bp_ct[apos][lres][rres]);
+ esl_abc_DCount(abc, obs_right, rres, bp_ct[apos][lres][rres]);
+ PairCount(abc, obs_pair, lres, rres, bp_ct[apos][lres][rres]);
+ nres += bp_ct[apos][lres][rres];
+ }
+ }
+ /* esl_vec_DDump(stdout, obs_left, abc->K, NULL);
+ esl_vec_DDump(stdout, obs_right, abc->K, NULL);
+ esl_vec_DDump(stdout, obs_pair, abc->K*abc->K, NULL);
+ */
+ esl_vec_DNorm(obs_left, abc->K);
+ esl_vec_DNorm(obs_right, abc->K);
+ esl_vec_DNorm(obs_pair, abc->K*abc->K);
+ ent_left = bg_ent - esl_vec_DEntropy(obs_left, abc->K);
+ ent_right = bg_ent - esl_vec_DEntropy(obs_right, abc->K);
+ ent_pair = bg_pair_ent - esl_vec_DEntropy(obs_pair, abc->K*abc->K);
+ /* printf("lpos: %5d rpos: %5d entP: %8.3f entL: %8.3f entR: %8.3f nres: %.2f ", i+1, j+1, ent_pair, ent_left, ent_right, nres); */
+ ent_pair -= ent_left + ent_right;
+ ent_pair /= 2.;
+ /* printf("Final: %8.3f\n", ent_pair); */
+
+ /* To verify that the ent_pair is mutual information, calculated a different way, uncomment the following block */
+ /* double mi = 0;
+ for(lres = 0; lres < abc->K; lres++) {
+ for(rres = 0; rres < abc->K; rres++) {
+ if(obs_pair[lres*abc->K+rres] > eslSMALLX1) {
+ mi += obs_pair[lres*abc->K+rres] * (1.44269504 * log((obs_pair[lres*abc->K+rres])/(obs_left[lres] * obs_right[rres])));
+ printf("mi: %.2f obs_left %.2f obs_right: %.2f obs_pair %.2f \n", mi, obs_left[lres], obs_right[rres], obs_pair[lres*abc->K+rres]);
+ }
+ }
+ }
+ printf("MI/2: %.2f EP: %.2f %.2f\n", mi/2., ent_pair, (mi/2.) - ent_pair);
+ */
+
+ if(ent_pair < (-1. * eslSMALLX1)) {
+ ESL_FAIL(eslEINCONCEIVABLE, errbuf, "pair information < 0.: %f (lpos: %d rpos: %d)\n", ent_pair, i, j);
+ }
+ if(esl_DCompare(nres, 0., eslSMALLX1) == eslOK) { /* nres is 0 */
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][i], NCMYK, hc_onecell[zerores_idx])) != eslOK) return status;
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][j], NCMYK, hc_onecell[zerores_idx])) != eslOK) return status;
+ nzerores += 2;
+ if(ps->mask != NULL && ps->mask[i] == '1') nzerores_masked++;
+ if(ps->mask != NULL && ps->mask[j] == '1') nzerores_masked++;
+ if(tabfp != NULL) {
+ fprintf(tabfp, " mutualinfo %4d %5d %5d %8.5f %8.5f %9.5f %10d %3d", idx++, i+1, j+1, 0., 0., 0., 0, 0);
+ if(ps->mask != NULL) fprintf(tabfp, " %6d %6d", ((ps->mask == NULL || ps->mask[i] == '1') ? 1 : 0), ((ps->mask == NULL || ps->mask[j] == '1') ? 1 : 0));
+ fprintf(tabfp, "\n");
+ }
+ }
+ else {
+ i_within_mask = (ps->mask != NULL && ps->mask[i] == '1') ? TRUE : FALSE;
+ j_within_mask = (ps->mask != NULL && ps->mask[j] == '1') ? TRUE : FALSE;
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][i], NCMYK, hc_scheme[hc_scheme_idx], ent_pair, ps->sclAA[pp], i_within_mask, &i_bi)) != eslOK) return status;
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][j], NCMYK, hc_scheme[hc_scheme_idx], ent_pair, ps->sclAA[pp], j_within_mask, &j_bi)) != eslOK) return status;
+ if(tabfp != NULL) {
+ fprintf(tabfp, " mutualinfo %4d %5d %5d %8.5f %8.5f %9.5f %10d %3d",
+ idx++, i+1, j+1,
+ ent_left,
+ ent_right,
+ ent_pair,
+ (int) nres,
+ i_bi+1);
+ if(ps->mask != NULL) fprintf(tabfp, " %6d %6d", ((ps->mask == NULL || ps->mask[i] == '1') ? 1 : 0), ((ps->mask == NULL || ps->mask[j] == '1') ? 1 : 0));
+ fprintf(tabfp, "\n");
+ }
+ }
+ } /* end of if(ps->msa_ct[rfpos+1] > (rfpos+1)) { */
+ }
+ else { /* single stranded, paint grey */
+ nss++;
+ if(ps->mask != NULL && ps->mask[rfpos] == '1') nss_masked++;
+ if((status = set_onecell_values(errbuf, ps->bcolAAA[pp][rfpos], NCMYK, hc_onecell[ss_idx])) != eslOK) return status;
+ }
+ /* fill in info for the consensus nucleotide */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ if(ps->mask == NULL || ps->mask[rfpos] == '1') {
+ ps->rAA[pp][rfpos] = esl_opt_GetBoolean(go, "--cambig") ? ps->msa_cseq_amb[rfpos] : ps->msa_cseq_maj[rfpos];
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ else { /* position is a '0' in the mask, leave it blank (' ') */
+ ps->rAA[pp][rfpos] = ' ';
+ if((status = set_onecell_values(errbuf, ps->rcolAAA[pp][rfpos], NCMYK, hc_onecell[WHITEOC])) != eslOK) return status;
+ }
+ }
+ }
+
+ /* add text to the one cell legend */
+ ps->occlAAA[pp][0] = create_onecell_colorlegend(hc_onecell[ss_idx], nss, nss_masked, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][0], "single-stranded", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ /* add text to the second one cell legend */
+ ps->occlAAA[pp][1] = create_onecell_colorlegend(hc_onecell[zerores_idx], nzerores, nzerores_masked, FALSE, FALSE);
+ if((status = add_text_to_onecell_colorlegend(ps, ps->occlAAA[pp][1], "0 complete basepairs", ps->legx_max_chars, errbuf)) != eslOK) return status;
+ ps->nocclA[pp] = 2;
+
+ /* add text to the scheme legend */
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], "mutual information per position (bits)", ps->legx_max_chars, errbuf)) != eslOK) return status;
+
+ /* add the consensus nucleotide explanation text section to the legend */
+ if(! esl_opt_GetBoolean(go, "--no-cnt")) {
+ ps->tlAAA[pp][0] = create_text_legend_for_consensus_sequence(go, FALSE);
+ ps->ntlA[pp] = 1;
+ }
+
+ /* add description to ps */
+ if((status = add_page_desc_to_sspostscript(ps, pp, "mutual information per basepaired position", errbuf)) != eslOK) return status;
+
+ free(limits);
+ free(obs_left);
+ free(obs_right);
+ free(obs_pair);
+
+ if(tabfp != NULL) fprintf(tabfp, "//\n");
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "mutual_information_sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+/* Function: PairCount()
+ * Date: SRE, Tue Aug 1 10:34:20 2000 [St. Louis]
+ *
+ * Purpose: Given a possibly degenerate symbol code for left
+ * and right symbols in a pair, increment a symbol
+ * counter array appropriately.
+ *
+ * Args: abc - pointer to the internal alphabet
+ * counters - vector to count into [0..abc->K^2-1]
+ * syml - index of left symbol [0..abc->sym_iupac-1]
+ * symr - index of right symbol [0..abc->sym_iupac-1]
+ * wt - weight to use for the count (often 1.0).
+ *
+ * Returns: void
+ */
+static void
+PairCount(const ESL_ALPHABET *abc, double *counters, ESL_DSQ syml, ESL_DSQ symr, double wt)
+{
+ int status;
+ if (syml < abc->K && symr < abc->K) {
+ counters[(int) (syml * abc->K + symr)] += wt;
+ return;
+ }
+ else {
+ int l,r;
+ double *left = NULL;
+ double *right = NULL;
+ ESL_ALLOC(left, sizeof(double) * abc->K);
+ ESL_ALLOC(right, sizeof(double) * abc->K);
+
+ esl_vec_DSet(left, abc->K, 0.);
+ esl_vec_DSet(right, abc->K, 0.);
+ esl_abc_DCount(abc, left, syml, 1.0);
+ esl_abc_DCount(abc, right, symr, 1.0);
+
+ for (l = 0; l < abc->K; l++)
+ for (r = 0; r < abc->K; r++)
+ counters[l*abc->K +r] += left[l] * right[r] * wt;
+ free(left);
+ free(right);
+ }
+ return;
+
+ ERROR:
+ esl_fatal("Memory error");
+}
+
+/* Function: get_command
+ * Date: EPN, Fri Jan 25 13:56:10 2008
+ *
+ * Purpose: Return the command used to call esl-ssdraw
+ * in <ret_command>.
+ *
+ * Returns: eslOK on success; eslEMEM on allocation failure.
+ */
+static int
+get_command(const ESL_GETOPTS *go, char *errbuf, char **ret_command)
+{
+ int status;
+ int i;
+ char *command = NULL;
+
+ for (i = 0; i < go->argc; i++) { /* copy all command line options and args */
+ if((status = esl_strcat(&(command), -1, go->argv[i], -1)) != eslOK) goto ERROR;
+ if(i < (go->argc-1)) if((status = esl_strcat(&(command), -1, " ", 1)) != eslOK) goto ERROR;
+ }
+ *ret_command = command;
+
+ return eslOK;
+
+ ERROR:
+ ESL_FAIL(status, errbuf, "get_command(): memory allocation error.");
+ return status;
+}
+
+/* Function: get_date
+ * Date: EPN, Fri Jan 25 13:59:22 2008
+ *
+ * Purpose: Return a string that gives the current date.
+ *
+ * Returns: eslOK on success; eslEMEM on allocation failure.
+ */
+static int
+get_date(char *errbuf, char **ret_date)
+{
+ int status;
+ time_t date = time(NULL);
+ char *sdate = NULL;
+
+ if((status = esl_strdup(ctime(&date), -1, &sdate)) != eslOK) goto ERROR;
+ esl_strchop(sdate, -1); /* doesn't return anything but eslOK */
+
+ *ret_date = sdate;
+ return eslOK;
+
+ ERROR:
+ ESL_FAIL(status, errbuf, "get_date() error status: %d, probably out of memory.", status);
+ return status;
+}
+
+/* Function: set_scheme_values()
+ *
+ * Purpose: Set color values from a predefined scheme given min, max,
+ * value and number of colors.
+ */
+static int
+set_scheme_values(char *errbuf, float *vec, int ncolvals, float **scheme, float val, SchemeColorLegend_t *scl, int within_mask, int *ret_bi)
+{
+ float min, max;
+ int ci, bi;
+ min = scl->limits[0];
+ max = scl->limits[scl->nbins];
+ if((min-val) > eslSMALLX1) { ESL_FAIL(eslEINVAL, errbuf, "set_scheme_values(), val: %.4f < min: %.4f\n", val, min); }
+ if((val-max) > eslSMALLX1) { ESL_FAIL(eslEINVAL, errbuf, "set_scheme_values(), val: %.4f > max: %.4f\n", val, max); }
+
+ bi = 0;
+ while((bi < (scl->nbins-1)) &&
+ ((val > scl->limits[bi+1]) || /* val exceeds limits[bi+1] OR */
+ (esl_FCompare(val, scl->limits[bi+1], eslSMALLX1) == eslOK))) { /* val equals limits[bi+1] */
+ bi++;
+ }
+ /* printf("%.3f %d (%.3f)\n", val, bi, scl->limits[bi+1]); */
+ scl->counts[bi]++;
+ if(within_mask) scl->counts_masked[bi]++;
+ for(ci = 0; ci < ncolvals; ci++) {
+ vec[ci] = scheme[bi][ci];
+ }
+
+ if(ret_bi != NULL) *ret_bi = bi;
+ return eslOK;
+}
+
+/* Function: set_onecell_values()
+ *
+ * Purpose: Set color values as a predefined single
+ * color.
+ */
+static int
+set_onecell_values(char *errbuf, float *vec, int ncolvals, float *onecolor)
+{
+ int ci;
+ for(ci = 0; ci < ncolvals; ci++) { vec[ci] = onecolor[ci]; }
+ return eslOK;
+}
+
+
+
+/* Function: draw_masked_block()
+ *
+ * Purpose: Given coords, color, and mask style options draw a masked block.
+ */
+static int
+draw_masked_block(FILE *fp, float x, float y, float *colvec, int do_circle_mask, int do_square_mask, int do_x_mask, int do_border, float cellsize)
+{
+ if (do_circle_mask) {
+ if(do_border) {
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f %.1f 0 360 arc closepath\n", x + (cellsize/2.), y + (cellsize/2.), cellsize * (3./8.));
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", colvec[0], colvec[1], colvec[2], colvec[3]);
+ fprintf(fp, " stroke\n");
+ }
+ else {
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f %.1f 0 360 arc closepath\n", x + (cellsize/2.), y + (cellsize/2.), cellsize * (3./8.));
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", colvec[0], colvec[1], colvec[2], colvec[3]);
+ fprintf(fp, " fill\n");
+ }
+ }
+ else if(do_square_mask) {
+ if(do_border) {
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", x +1., y +1.);
+ fprintf(fp, " 0 %.1f rlineto %.1f 0 rlineto 0 -%.1f rlineto closepath\n", cellsize*0.75, cellsize*0.75, cellsize*0.75);
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", colvec[0], colvec[1], colvec[2], colvec[3]);
+ fprintf(fp, " stroke\n");
+ }
+ else {
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", x + 1.5, y + 1.5);
+ fprintf(fp, " 0 %.1f rlineto %.1f 0 rlineto 0 -%.1f rlineto closepath\n", cellsize*(5./8.), cellsize*(5./8.), cellsize*(5./8.));
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", colvec[0], colvec[1], colvec[2], colvec[3]);
+ fprintf(fp, " fill\n");
+ }
+ }
+ else if (do_x_mask) {
+ if(do_border) {
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", x, y);
+ fprintf(fp, " 0 %.1f rlineto %.1f 0 rlineto 0 -%.1f rlineto closepath\n", cellsize, cellsize, cellsize);
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", colvec[0], colvec[1], colvec[2], colvec[3]);
+ fprintf(fp, " fill\n");
+
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", 0., 0., 0., 0.);
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", x, y);
+ fprintf(fp, " %.1f %.1f rlineto closepath\n", cellsize, cellsize);
+ fprintf(fp, " stroke\n");
+ fprintf(fp, " %.2f %.2f moveto", x + cellsize, y);
+ fprintf(fp, " -%.1f %.1f rlineto closepath\n", cellsize, cellsize);
+ fprintf(fp, " stroke\n");
+ }
+ else {
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.4f %.4f %.4f %.4f setcmykcolor\n", colvec[0], colvec[1], colvec[2], colvec[3]);
+ fprintf(fp, " %.2f %.2f moveto", x, y);
+ fprintf(fp, " %.1f %.1f rlineto closepath\n", cellsize, cellsize);
+ fprintf(fp, " stroke\n");
+ fprintf(fp, "newpath\n");
+ fprintf(fp, " %.2f %.2f moveto", x + cellsize, y);
+ fprintf(fp, " -%.1f %.1f rlineto closepath\n", cellsize, cellsize);
+ fprintf(fp, " stroke\n");
+ }
+ }
+ return eslOK;
+}
+
+/* Function: validate_justread_sspostscript()
+ *
+ * Purpose: Validate a sspostscript just created by parsing
+ * a template file. Nothing fancy here, just make
+ * sure all we've written everything we expect.
+ */
+static int
+validate_justread_sspostscript(SSPostscript_t *ps, char *errbuf)
+{
+ if(ps->modelname == NULL) ESL_FAIL(eslEINVAL, errbuf, "Error, failed to read modelname from template file.");
+ if(ps->nbp == 0) ESL_FAIL(eslEINVAL, errbuf, "Error, failed to read 'lines bpconnects' section from template file.");
+ if(ps->scale < 0) ESL_FAIL(eslEINVAL, errbuf, "Error, failed to read scale from template file.");
+ if(ps->rflen == 0) ESL_FAIL(eslEINVAL, errbuf, "Error, failed to read 'text nucleotides' section from template file.");
+ if(ps->leg_posn == -1) ESL_FAIL(eslEINVAL, errbuf, "Error, failed to read 'legend' section from template file.");
+ if(ps->leg_cellsize == -1) ESL_FAIL(eslEINVAL, errbuf, "Error, failed to read 'legend' section from template file.");
+
+ /* Stuff we don't currently require, but we may want to eventually */
+ /*if(ps->nposntext == 0) ESL_FAIL(eslEINVAL, errbuf, "validate_justread_sspostscript(), failed to read 'text positiontext' section from template file.");*/
+ /*if(ps->nticks == 0) ESL_FAIL(eslEINVAL, errbuf, "validate_justread_sspostscript(), failed to read 'lines positionticks' section from template file.");*/
+ /*if(ps->nbp == 0) ESL_FAIL(eslEINVAL, errbuf, "validate_justread_sspostscript(), failed to read 'lines bpconnects' section from template file.");*/
+
+ return eslOK;
+}
+
+
+/* Function: validate_and_update_sspostscript_given_msa()
+ *
+ * Purpose: Validate that a sspostscript works with a MSA.
+ */
+static int
+validate_and_update_sspostscript_given_msa(const ESL_GETOPTS *go, const ESL_ALPHABET *abc, SSPostscript_t *ps, ESL_MSA *msa, int msa_nseq, char *errbuf)
+{
+ int status;
+ int *msa_ct;
+ int msa_nbp = 0;
+ int *tmp_ct;
+ int apos, rfpos_i, rfpos_j, rfpos;
+ int *rf2a_map = NULL;
+ int *a2rf_map = NULL;
+ int rflen = 0;
+
+ ps->msa = msa;
+ ps->abc = abc;
+
+ /* contract check */
+ if(msa->rf == NULL) ESL_FAIL(eslEINVAL, errbuf, "Error, msa does not have RF annotation.");
+ if(msa->ss_cons == NULL) ESL_FAIL(eslEINVAL, errbuf, "Error, msa does not have SS_cons annotation.");
+
+ /* count non-gap RF columns */
+ for(apos = 0; apos < msa->alen; apos++) {
+ if(esl_abc_CIsResidue(abc, msa->rf[apos]))
+ rflen++;
+ }
+ if(ps->rflen != rflen) ESL_FAIL(eslEINVAL, errbuf, "validate_and_update_sspostscript_given_msa(), expected consensus length of %d in MSA, but read %d\n", ps->rflen, rflen);
+
+ /* build map of non-gap RF positions to alignment positions and vice versa */
+ ESL_ALLOC(rf2a_map, sizeof(int) * rflen);
+ ESL_ALLOC(a2rf_map, sizeof(int) * msa->alen);
+ esl_vec_ISet(a2rf_map, msa->alen, -1);
+ rfpos = 0;
+ for(apos = 0; apos < msa->alen; apos++) {
+ if(esl_abc_CIsResidue(abc, msa->rf[apos])) {
+ rf2a_map[rfpos] = apos;
+ a2rf_map[apos] = rfpos;
+ rfpos++;
+ }
+ }
+
+ /* get the CT array for this msa */
+ ESL_ALLOC(tmp_ct, sizeof(int) * (msa->alen+1));
+ if (esl_wuss2ct(msa->ss_cons, msa->alen, tmp_ct) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "Problem getting ct from SS_cons, does first alignment of MSA file have SS_cons annotation?");
+
+ ESL_ALLOC(msa_ct, sizeof(int) * (rflen+1));
+ esl_vec_ISet(msa_ct, rflen+1, 0);
+
+ /* convert tmp_ct which is in alignment coords [1..alen] to non-gap RF coords [1..rflen]*/
+ for(apos = 0; apos < msa->alen; apos++) {
+ if(tmp_ct[apos+1] > (apos+1)) {
+ rfpos_i = a2rf_map[apos];
+ rfpos_j = a2rf_map[tmp_ct[apos+1]-1];
+ if(rfpos_i != -1 && rfpos_j != -1) { /* a consensus basepair */
+ msa_ct[rfpos_i+1] = rfpos_j+1;
+ msa_ct[rfpos_j+1] = rfpos_i+1;
+ msa_nbp++;
+ }
+ }
+ }
+ free(tmp_ct);
+ if(ps->nbp != 0 && ps->nbp != msa_nbp) ESL_FAIL(eslEINVAL, errbuf, "validate_and_update_sspostscript_given_msa(), expected %d basepairs in MSA's SS_cons, but read %d\n", ps->nbp, msa_nbp);
+
+ /* for(rfpos = 0; rfpos < rflen; rfpos++) printf("ct %5d %5d\n", rfpos, msa_ct[rfpos+1]-1); */
+
+ if(ps->msa_ct != NULL) { free(ps->msa_ct); ps->msa_ct = NULL;}
+ if(ps->msa_rf2a_map != NULL) { free(ps->msa_rf2a_map); ps->msa_rf2a_map = NULL; }
+ if(ps->msa_a2rf_map != NULL) { free(ps->msa_a2rf_map); ps->msa_a2rf_map = NULL; }
+ ps->msa_ct = msa_ct;
+ ps->msa_nbp = msa_nbp;
+ ps->msa_ct = msa_ct;
+ ps->msa_rf2a_map = rf2a_map;
+ ps->msa_a2rf_map = a2rf_map;
+ ps->msa_nseq = msa_nseq;
+
+ return eslOK;
+
+ ERROR:
+ ESL_FAIL(status, errbuf, "validate_and_update_sspostscript_given_msa(), error status %d, probably out of memory.\n", status);
+ return status;
+}
+
+
+/* Function: draw_header_and_footer()
+ *
+ * Purpose: Draw header for a page
+ */
+static int
+draw_header_and_footer(FILE *fp, const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, int page, int pageidx2print)
+{
+ int status;
+ int i, split_idx;
+ float x, y;
+ float header_fontsize;
+ int model_width, desc_width, desc_column_width;
+ char *model_dashes, *desc_dashes, *desc2print;
+ char *desc_string = NULL;
+ float xmodel;
+ char *model2print = NULL;
+ float footer_fontsize, footerx_charsize;
+
+ header_fontsize = HEADER_FONTSIZE_UNSCALED / ps->scale;
+
+ fprintf(fp, "%% begin header section\n");
+ fprintf(fp, "/%s findfont %.2f scalefont setfont\n", DEFAULT_FONT, header_fontsize);
+ fprintf(fp, "0.00 0.00 0.00 1.00 setcmykcolor\n"); /* black */
+
+ if(! (esl_opt_GetBoolean(go, "--no-head"))) {
+ model_width = ESL_MAX(strlen("model"), (int) strlen(ps->modelname));
+ if(model_width > HEADER_MODELNAME_MAXCHARS) {
+ ESL_ALLOC(model2print, sizeof(char) * (HEADER_MODELNAME_MAXCHARS+1));
+ for(i = 0; i < (HEADER_MODELNAME_MAXCHARS-3); i++) model2print[i] = ps->modelname[i];
+ model2print[HEADER_MODELNAME_MAXCHARS-3] = '.';
+ model2print[HEADER_MODELNAME_MAXCHARS-2] = '.';
+ model2print[HEADER_MODELNAME_MAXCHARS-1] = '.';
+ model2print[HEADER_MODELNAME_MAXCHARS] = '\0';
+ }
+ else {
+ if((status = esl_strdup(ps->modelname, -1, &(model2print))) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "draw_header_and_footer(), error copying modelname");
+ }
+
+ model_width = ESL_MIN(model_width, HEADER_MODELNAME_MAXCHARS);
+ ESL_ALLOC(model_dashes, sizeof(char) * (model_width+1));
+ for(i = 0; i < model_width; i++) model_dashes[i] = '-';
+ model_dashes[model_width] = '\0';
+
+ if(ps->modeA[page] == ALIMODE || ps->modeA[page] == SIMPLEMASKMODE) {
+ if((status = esl_strdup("description", -1, &(desc_string))) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "draw_header_and_footer(), error copying description");
+ }
+ else if(ps->modeA[page] == INDIMODE) {
+ if((status = esl_strdup("sequence name", -1, &(desc_string))) != eslOK) ESL_FAIL(eslEINVAL, errbuf, "draw_header_and_footer(), error copying description");
+ }
+
+ xmodel = ps->headerx_desc - (ps->headerx_charsize * (model_width + 6 + 6 + 8 + 2)); /*6,6,8 for #pos,#bps,#seq|seqlen) plus 2 spaces each, first 2 for 2 spaces before desc*/
+ x = xmodel;
+ y = ps->headery;
+
+ fprintf(fp, "(%-*s %4s %4s) %.2f %.2f moveto show\n", model_width, "model", "#pos", "#bps", x, y);
+ y -= header_fontsize * 0.75;
+ fprintf(fp, "(%-*s %4s %4s) %.2f %.2f moveto show\n", model_width, model_dashes, "----", "----", x, y);
+ y -= header_fontsize * 0.75;
+ fprintf(fp, "(%-*s %4d %4d) %.2f %.2f moveto show\n", model_width, model2print, ps->rflen, ps->msa_nbp, x, y);
+ free(model_dashes);
+ x += (model_width + 6 + 6 +2) * ps->headerx_charsize;
+
+ if(ps->modeA[page] == ALIMODE) {
+ y+= header_fontsize * 1.5;
+ fprintf(fp, "(%6s) %.2f %.2f moveto show\n", "#seqs", x, y);
+ y -= header_fontsize * 0.75;
+ fprintf(fp, "(%6s) %.2f %.2f moveto show\n", "------", x, y);
+ y -= header_fontsize * 0.75;
+ fprintf(fp, "(%6d) %.2f %.2f moveto show", ps->msa_nseq, x, y);
+ }
+ else if(ps->modeA[page] == INDIMODE && (ps->seqidxA[page] != -1)) { /* ps->seqidxA[page] == -1 if we're printing the consensus sequence */
+ y+= header_fontsize * 1.5;
+ fprintf(fp, "(%6s) %.2f %.2f moveto show\n", "seqlen", x, y);
+ y -= header_fontsize * 0.75;
+ fprintf(fp, "(%6s) %.2f %.2f moveto show\n", "------", x, y);
+ y -= header_fontsize * 0.75;
+ fprintf(fp, "(%6d) %.2f %.2f moveto show", ps->uaseqlenA[ps->seqidxA[page]], x, y);
+ }
+
+ if(ps->descA[page] != NULL) {
+ x = ps->headerx_desc;
+ y += 2. * header_fontsize * 0.75;
+ desc_width = ESL_MAX((int) strlen(desc_string), (int) strlen(ps->descA[page]));
+ if(desc_width > ps->desc_max_chars) {
+ /* split into two lines, the add_page_desc_to_sspostscript() function added a '\n' where the split should be */
+ i = 0;
+ while(ps->descA[page][i] != '\n') {
+ i++;
+ if(i >= desc_width) ESL_FAIL(eslEINVAL, errbuf, "drawing header, failed to find split point from add_page_desc_to_() in two-line description (%s)", ps->descA[page]);
+ }
+ split_idx = i;
+ desc_column_width = split_idx;
+ }
+ else desc_column_width = desc_width;
+
+ ESL_ALLOC(desc_dashes, sizeof(char) * (desc_column_width+1));
+ for(i = 0; i < desc_column_width; i++) desc_dashes[i] = '-';
+ desc_dashes[desc_column_width] = '\0';
+
+ fprintf(fp, "(%-*s) %.2f %.2f moveto show\n", desc_column_width, desc_string, x, y);
+ y -= header_fontsize * 0.75;
+ free(desc_string);
+ fprintf(fp, "(%-*s) %.2f %.2f moveto show\n", desc_column_width, desc_dashes, x, y);
+ y -= header_fontsize * 0.75;
+ free(desc_dashes);
+
+ if(desc_width > ps->desc_max_chars) {
+ ESL_ALLOC(desc2print, sizeof(char) * (split_idx+1));
+ for(i = 0; i < split_idx; i++) desc2print[i] = ps->descA[page][i];
+ desc2print[split_idx] = '\0';
+ fprintf(fp, "(%-*s) %.2f %.2f moveto show\n", desc_column_width, desc2print, x, y);
+ free(desc2print);
+
+ x = ps->headerx_desc;
+ y-= ps->headery_charsize * 1;
+ ESL_ALLOC(desc2print, sizeof(char) * ((desc_width - split_idx) -1+1));
+ for(i = split_idx+1; i < desc_width; i++) desc2print[(i-(split_idx+1))] = ps->descA[page][i];
+ desc2print[(desc_width-(split_idx+1))] = '\0';
+ fprintf(fp, "(%-*s) %.2f %.2f moveto show\n", desc_column_width, desc2print, x, y);
+ free(desc2print);
+ }
+ else {
+ fprintf(fp, "(%-*s) %.2f %.2f moveto show\n", desc_width, ps->descA[page], x, y);
+ }
+ }
+ /* masked row of header goes here if desired */
+ }
+ fprintf(fp, "%% end header section\n\n");
+
+ /* draw footer */
+ footer_fontsize = LEG_FONTSIZE_UNSCALED / ps->scale;
+ footerx_charsize = ps->legx_charsize;
+
+ if(! (esl_opt_GetBoolean(go, "--no-foot"))) {
+ fprintf(fp, "%% begin footer section\n");
+ fprintf(fp, "/%s findfont %.2f scalefont setfont\n", FOOTER_FONT, footer_fontsize);
+ /* draw alignment file name in lower left hand corner */
+ if(ps->mask != NULL) {
+ if(esl_opt_GetString(go, "--mask-diff") != NULL) {
+ fprintf(fp, "(alignment file: %s; mask 1 file: %s; mask 2 file: %s;) %.2f %.2f moveto show\n", esl_opt_GetArg(go, 1), esl_opt_GetString(go, "--mask"), esl_opt_GetString(go, "--mask-diff"), PAGE_SIDEBUF, PAGE_BOTBUF);
+ }
+ else {
+ fprintf(fp, "(alignment file: %s; mask file: %s;) %.2f %.2f moveto show\n", esl_opt_GetArg(go, 1), esl_opt_GetString(go, "--mask"), PAGE_SIDEBUF, PAGE_BOTBUF);
+ }
+ }
+ else {
+ fprintf(fp, "(alignment file: %s) %.2f %.2f moveto show\n", esl_opt_GetArg(go, 1), PAGE_SIDEBUF, PAGE_BOTBUF);
+ }
+
+ /* put page number */
+ /* determine ndigits */
+ int tmp, ndigits;
+ tmp = pageidx2print;
+ ndigits = 1;
+ while(tmp >= 10) { tmp /= 10; ndigits++; }
+ x = ps->pagex_max - (PAGE_SIDEBUF) - (footerx_charsize * (5 + ndigits));
+ fprintf(fp, "(page %d) %.2f %.2f moveto show\n", pageidx2print, x, PAGE_BOTBUF);
+
+ /* fprintf(fp, "(Created by \'esl-ssdraw\'. Copyright (C) 2010 Howard Hughes Medical Institute.) %.2f %.2f moveto show \n", PAGE_SIDEBUF , PAGE_BOTBUF); */
+ fprintf(fp, "%% end footer section\n\n");
+ }
+
+ if(model2print != NULL) free(model2print);
+ return eslOK;
+
+ ERROR: ESL_FAIL(eslEINVAL, errbuf, "draw_header_and_footer(), memory error.");
+}
+
+/* Function: get_insert_info_from_msa
+ * Date: EPN, Fri Dec 4 13:52:53 2009
+ *
+ * Read an MSA with #=GC RF annotation defining
+ * consensus columns and count how many insertions
+ * occur after each consensus column for each sequence.
+ *
+ * msa - the alignment
+ * rflen - expected nongap RF length (consensus length)
+ * ret_nseq_with_ins_ct - [0..rflen] number of sequences with >= 1
+ * insert after each position. NULL if unwanted.
+ * ret_nins_ct - [0..rflen] total number of inserted nucleotides
+ * after each position. NULL if unwanted.
+ * ret_per_seq_ins_ct - [0..i..msa->nseq-1][0..rflen] number of inserts
+ * insert after each position per sequence. NULL if unwanted.
+ *
+ * Returns void. Dies with an informative error message upon an error.
+ */
+void
+get_insert_info_from_msa(const ESL_ALPHABET *abc, ESL_MSA *msa, int rflen, int **ret_nseq_with_ins_ct, int **ret_nins_ct, int ***ret_per_seq_ins_ct)
+{
+ int status;
+ int i;
+ int *nseq_with_ins_ct = NULL;
+ int *nins_ct = NULL;
+ int **per_seq_ins_ct = NULL;
+ int rfpos, apos;
+
+ /* contract check */
+ if(msa->rf == NULL) esl_fatal("Error in get_insert_info_from_msa(), msa->rf is NULL.");
+
+ /* allocate and initialize */
+ ESL_ALLOC(nseq_with_ins_ct, sizeof(int) * (rflen+1));
+ esl_vec_ISet(nseq_with_ins_ct, rflen+1, 0);
+ ESL_ALLOC(nins_ct, sizeof(int) * (rflen+1));
+ esl_vec_ISet(nins_ct, rflen+1, 0);
+ ESL_ALLOC(per_seq_ins_ct, sizeof(int *) * (msa->nseq));
+ for(i = 0; i < msa->nseq; i++) {
+ ESL_ALLOC(per_seq_ins_ct[i], sizeof(int) * (rflen+1));
+ esl_vec_ISet(per_seq_ins_ct[i], (rflen+1), 0);
+ }
+
+ /* fill per_seq_ins_ct, nseq_with_ins_ct */
+ rfpos = 0;
+ for(apos = 0; apos < msa->alen; apos++) {
+ if(esl_abc_CIsResidue(abc, msa->rf[apos])) {
+ rfpos++;
+ if(rfpos > rflen) esl_fatal("Error in get_insert_info_from_msa(), expected consensus length (%d) is incorrect.");
+ }
+ else {
+ for(i = 0; i < msa->nseq; i++) {
+ if(! esl_abc_CIsGap(abc, msa->aseq[i][apos])) {
+ per_seq_ins_ct[i][rfpos]++;
+ nins_ct[rfpos]++;
+ if(per_seq_ins_ct[i][rfpos] == 1) nseq_with_ins_ct[rfpos]++;
+ }
+ }
+ }
+ }
+
+ if(ret_nseq_with_ins_ct != NULL) *ret_nseq_with_ins_ct = nseq_with_ins_ct;
+ else free(nseq_with_ins_ct);
+ if(ret_nins_ct != NULL) *ret_nins_ct = nins_ct;
+ else free(nins_ct);
+ if(ret_per_seq_ins_ct != NULL) *ret_per_seq_ins_ct = per_seq_ins_ct;
+ else esl_Free2D((void **) per_seq_ins_ct, msa->nseq);
+
+ return;
+
+ ERROR:
+ esl_fatal("Error in get_insert_info_from_msa(), memory allocation error.");
+ return; /* NEVERREACHED */
+}
+
+
+/* Function: get_insert_info_from_ifile
+ * Date: EPN, Fri Dec 4 14:49:12 2009
+ *
+ * Read a file output from Infernal's cmalign
+ * when run with '--matchonly --ifile <f>' and
+ * fill *ret_ict[0..rflen][0..msa->nseq-1] number
+ * of inserts after each consensus position for
+ * each sequence.
+ *
+ * We also keep track of cases where a count of
+ * the first and final nongap positions of all sequence
+ * per column would be incorrect IF the msa were
+ * to have all insert columns removed. These corrections
+ * are stored and returned in srfoff_ct and erfoff_ct
+ * as explained below.
+ *
+ * Format of an insert file (from the commented header of an ifile):
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * This file includes 2+<nseq> non-'#' pre-fixed lines per model used for alignment,
+ * where <nseq> is the number of sequences in the target file.
+ * The first non-'#' prefixed line per model includes 2 tokens, separated by a single space (' '):
+ * The first token is the model name and the second is the consensus length of the model (<clen>).
+ * The following <nseq> lines include (4+3*<n>) whitespace delimited tokens per line.
+ * The format for these <nseq> lines is:
+ * <seqname> <seqlen> <spos> <epos> <c_1> <u_1> <i_1> <c_2> <u_2> <i_2> .... <c_x> <u_x> <i_x> .... <c_n> <u_n> <i_n>
+ * indicating <seqname> has >= 1 inserted nucleotides after <n> different consensus positions,
+ * <seqname> is the name of the sequence
+ * <seqlen> is the unaligned length of the sequence
+ * <spos> is the first (5'-most) consensus position filled by a nongap for this sequence (-1 if 0 nongap consensus posns)
+ * <epos> is the final (3'-most) consensus position filled by a nongap for this sequence (-1 if 0 nongap consensus posns)
+ * <seqlen> is the unaligned length of the sequence
+ * <c_x> is a consensus position (between 1 and <clen>; if 0 inserts occur before 1st consensus posn)
+ * <u_x> is the *unaligned* position (b/t 1 and <seqlen>) in <seqname> of the first inserted nucleotide after <c_x>.
+ * <i_x> is the number of inserted nucleotides after position <c_x> for <seqname>.
+ * Lines for sequences with 0 inserted nucleotides will include only <seqname> <seqlen>.
+ * The final non-'#' prefixed line per model includes only '//', indicating the end of info for a model.
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * Example:
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * tRNA 71
+ * tRNA-1 67 1 71 17 15 1
+ * tRNA-2 71 1 71 20 20 1
+ * tRNA-3 70 1 71 45 41 3 46 44 1
+ * tRNA-4 71 1 71
+ * tRNA-5 69 1 71 46 44 1
+ * tRNA-6 70 1 71
+ * tRNA-7 67 1 71
+ * tRNA-8 71 1 71 17 16 1
+ * tRNA-9 67 1 71
+ * tRNA-10 73 1 71 45 44 4
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * ifile - name of ifile
+ * rflen - expected nongap RF length (consensus length)
+ * msa_nseq - expected number of sequences
+ * useme_keyhash - keyhash with names of sequences for which we will store insert info
+ * if NULL, we store insert info for all seqs.
+ * ret_nseq_with_ins_ct - [0..rflen] number of sequences with >= 1 inserts
+ * after each RF position.
+ * Note [0] is before first posn, [1] is after first posn, [rflen] is after last one
+ * ret_nins_ct - [0..rflen] total number of inserted nucleotides (over all seqs) after each RF position.
+ * Note [0] is before first posn, [1] is after first posn, [rflen] is after last one
+ * ret_per_seq_ins_ct - [0..i..msa->nseq-1][0..rflen number of inserts
+ * after each position for each sequence.
+ * Filled here.
+ *
+ * ret_srfoff_ct - [0..rfpos..rflen-1] count adjustment to make to a spos_ct[rfpos] if it
+ * were obtained from an alignment with inserts removed, this value is <a>+<b>,
+ * where <a> is : -1 times the number of sequences that have their first nongap
+ * RF position as rfpos, but include an insert before an rfpos2 < rfpos.
+ * and <b> is : +1 times the number of sequences that have their first nongap
+ * RF position as rfpos3, but have an insert before rfpos < rfpos3.
+ * We can only determine these cases when we read the ifile, since the
+ * msa has had inserts removed.
+ * NOTE a nasty off-by-one: RF (consensus) positions in the ifile are indexed 1..rflen
+ *
+ * ret_erfoff_ct - [0..rfpos..rflen-1] count adjustment to make to a epos_ct[rfpos] if it
+ * were obtained from an alignment with inserts removed, this value is <a>+<b>,
+ * where <a> is : -1 times the number of sequences that have their final nongap
+ * RF position as rfpos, but include an insert after an rfpos2 > rfpos.
+ * and <b> is : +1 times the number of sequences that have their final nongap
+ * RF position as rfpos3, but have an insert after rfpos > rfpos3.
+ * We can only determine these cases when we read the ifile, since the
+ * msa has had inserts removed.
+ * NOTE a nasty off-by-one: RF (consensus) positions in the ifile are indexed 1..rflen
+ *
+ * Returns void. Dies with an informative error message on an error.
+ */
+void
+get_insert_info_from_ifile(char *ifile, int rflen, int msa_nseq, ESL_KEYHASH *useme_keyhash, int **ret_nseq_with_ins_ct, int **ret_nins_ct, int ***ret_per_seq_ins_ct, int **ret_srfoff_ct, int **ret_erfoff_ct)
+{
+ int status;
+ ESL_FILEPARSER *efp;
+ char *tok;
+ int nseq_read = 0;
+ int nseq_stored = 0;
+ int **per_seq_ins_ct = NULL;
+ int *nins_ct = NULL;
+ int *nseq_with_ins_ct = NULL;
+ int nins;
+ int i;
+ int rfpos; /* current nongap RF position */
+ int uapos; /* unaligned position for current sequence */
+
+ int seen_model_name_line = FALSE;
+ int seen_end_of_model_line = FALSE;
+ int nseq2store; /* number of seqs we'll store insert info on */
+ int seqlen; /* sequence length for current sequence, read from ifile */
+ int spos; /* first (5'-most) nongap consensus position for current sequence, read from ifile */
+ int epos; /* final (3'-most) nongap consensus position for current sequence, read from ifile */
+ int *srfoff_ct = NULL; /* [0..rfpos..rflen-1] correction for spos_ct[rfpos], add this value to spos_ct
+ * to correct the miscounting that occurs if the msa has had all inserts removed, but
+ * an insert file with insert info has been supplied and is read in this function */
+ int *erfoff_ct = NULL; /* [0..rfpos..rflen-1] correction for epos_ct[rfpos] (analagous to srfoff_ct) */
+ int already_handled_special_spos = FALSE;
+ int prv_e_increment, prv_e_decrement;
+
+ if (esl_fileparser_Open(ifile, NULL, &efp) != eslOK) esl_fatal("Error: failed to open insert file %s\n", ifile);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ /* determine how many sequences we'll be storing info for */
+ nseq2store = (useme_keyhash == NULL) ? msa_nseq : esl_keyhash_GetNumber(useme_keyhash);
+
+ /* allocate and initialize */
+ ESL_ALLOC(nseq_with_ins_ct, sizeof(int) * (rflen+1));
+ esl_vec_ISet(nseq_with_ins_ct, rflen+1, 0);
+
+ ESL_ALLOC(nins_ct, sizeof(int) * (rflen+1));
+ esl_vec_ISet(nins_ct, rflen+1, 0);
+
+ if(ret_srfoff_ct != NULL) {
+ ESL_ALLOC(srfoff_ct, sizeof(int) * rflen);
+ esl_vec_ISet(srfoff_ct, rflen, 0);
+ }
+ if(ret_erfoff_ct != NULL) {
+ ESL_ALLOC(erfoff_ct, sizeof(int) * rflen);
+ esl_vec_ISet(erfoff_ct, rflen, 0);
+ }
+ if(ret_per_seq_ins_ct != NULL) {
+ ESL_ALLOC(per_seq_ins_ct, sizeof(int *) * (nseq2store));
+ for(i = 0; i < nseq2store; i++) {
+ ESL_ALLOC(per_seq_ins_ct[i], sizeof(int) * (rflen+1));
+ esl_vec_ISet(per_seq_ins_ct[i], (rflen+1), 0);
+ }
+ }
+
+ /* Read the file, verify that it contains the correct number of sequences and the
+ * consensus length(s) listed in the file agrees with expected rflen.
+ * Special care is taken to allow concatenated ifiles, so we may see more than
+ * one // lines, but the total number of seqs should match what we expect.
+ */
+ i = 0;
+ while (esl_fileparser_NextLine(efp) == eslOK) {
+ if (esl_fileparser_GetTokenOnLine(efp, &tok, NULL) != eslOK) {
+ if(seen_model_name_line) esl_fatal("Error reading insert file, failed to read seq name on line %d of file %s\n", efp->linenumber, ifile);
+ else esl_fatal("Error reading insert file, failed to read model name on line %d of file %s\n", efp->linenumber, ifile);
+ }
+ if(! seen_model_name_line) { /* this should be a special line, 2 tokens: <cmname> <rflen>, verify that <rflen> is what we expect */
+ seen_model_name_line = TRUE;
+ seen_end_of_model_line = FALSE;
+ if (esl_fileparser_GetTokenOnLine(efp, &tok, NULL) != eslOK) {
+ esl_fatal("Error reading insert file, failed to read consensus length on line %d of file %s\n", efp->linenumber, ifile);
+ }
+ if(rflen != atoi(tok)) {
+ esl_fatal("Error reading insert file, read consensus length of %d on line %d of file %s, but expected length %d\n", atoi(tok), efp->linenumber, ifile, rflen);
+ }
+ }
+ else if (strncmp(tok, "//", 2) == 0) { /* end of data for an ifile, but we may have concatenated them, so we keep going */
+ seen_model_name_line = FALSE;
+ seen_end_of_model_line = TRUE;
+ }
+ else { /* should be a seq line with 1+3*n tokens, <seqlen> <rfpos_0> <uapos_0> <nins_0> ... <rfpos_n> <uapos_n> <nins_n>, n can be 0 */
+ /* determine if we're using this sequence */
+ i++;
+ if(useme_keyhash == NULL || (esl_keyhash_Lookup(useme_keyhash, tok, -1, NULL) == eslOK)) {
+ already_handled_special_spos = FALSE; /* initialize */
+ prv_e_decrement = prv_e_increment = -1; /* initialize */
+
+ if(esl_fileparser_GetTokenOnLine(efp, &tok, NULL) != eslOK) esl_fatal("Error reading insert file, failed to read unaligned length for sequence on line %d of file %s.\n", efp->linenumber, ifile);
+ seqlen = atoi(tok);
+
+ if(esl_fileparser_GetTokenOnLine(efp, &tok, NULL) != eslOK) esl_fatal("Error reading insert file, failed to read first nongap consensus position for sequence on line %d of file %s.\n", efp->linenumber, ifile);
+ spos = atoi(tok);
+ if(spos > rflen) esl_fatal("Error reading insert file, read spos of %d that exceeds expected consensus length %d on line %d of file %s.\n", spos, rflen, efp->linenumber, ifile);
+
+ if(esl_fileparser_GetTokenOnLine(efp, &tok, NULL) != eslOK) esl_fatal("Error reading insert file, failed to read final nongap consensus position for sequence on line %d of file %s.\n", efp->linenumber, ifile);
+ epos = atoi(tok);
+ if(epos > rflen) esl_fatal("Error reading insert file, read epos of %d that exceeds expected consensus length %d on line %d of file %s.\n", epos, rflen, efp->linenumber, ifile);
+
+ if(spos == -1 && epos != -1) esl_fatal("insert file is corrupt, spos is -1 but epos is not -1, on line %d\n", efp->linenumber);
+ if(spos != -1 && epos == -1) esl_fatal("insert file is corrupt, spos is not -1 but epos is -1, on line %d\n", efp->linenumber);
+
+ while(esl_fileparser_GetTokenOnLine(efp, &tok, NULL) == eslOK) {
+ /* rfpos */
+ rfpos = atoi(tok);
+ if(rfpos > rflen) esl_fatal("Error reading insert file, read insert info for position %d that exceeds expected consensus length %d on line %d of file %s.\n", rfpos, rflen, efp->linenumber, ifile);
+
+ /* uapos */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, NULL)) != eslOK) esl_fatal("Error reading insert file, didn't read unaligned sequence position for rfpos %d on line %d of file %s.\n", rfpos, efp->linenumber, ifile);
+ uapos = atoi(tok);
+ if(uapos > seqlen) esl_fatal("Error reading insert file, read insert info for position %d that exceeds expected sequence length %d on line %d of file %s.\n", rfpos, seqlen, efp->linenumber, ifile);
+
+ /* nins */
+ if((status = esl_fileparser_GetTokenOnLine(efp, &tok, NULL)) != eslOK) esl_fatal("Error reading insert file, didn't read number of inserts for position %d on line %d of file %s.\n", rfpos, efp->linenumber, ifile);
+ nins = atoi(tok);
+ nins_ct[rfpos] += nins;
+ if(per_seq_ins_ct != NULL) per_seq_ins_ct[nseq_stored][rfpos] = nins;
+ if(nins > 0) nseq_with_ins_ct[rfpos]++; /* nins should always be > 0, but why not check? */
+
+ /* check for special cases where a spos_ct and epos_ct read from a de-inserted msa would be incorrect */
+ if(spos != -1) {
+ /* Note, if spos == -1 (then epos also == -1, we checked above), then there are 0 nongap consensus positions for
+ * this sequence, and the spos and epos counts were never incremented for this sequence, so they don't need to be corrected. */
+
+ /* First check if this insert is before spos-1 */
+ if(srfoff_ct != NULL) {
+ if((rfpos < (spos-1)) && (! already_handled_special_spos)) { /* we've got an insert *after* a position rfpos < (spos-1) for minimal rfpos */
+ /* Any function that counted the first RF position for this sequence if inserts were
+ * removed thought it was spos, but an insert exists after rfpos<(spos-1), which means there
+ * was an insert after rfpos, then a gap in at least 1 consensus position before the
+ * first nongap consensus nucleotide at cpos.
+ * NOTE a nasty off-by-one: RF (consensus) positions in the ifile are indexed 1..rflen, whereas srfoff_ct is 0..rflen-1 */
+ srfoff_ct[(spos-1)]--; /* this position was overcounted */
+ srfoff_ct[(rfpos-1)+1]++; /* this position was undercounted, we do +1 because insert occured after rfpos */
+ /* printf("decremented srfoff_ct[%d] for seq %d\n", spos-1, i);
+ printf("incremented srfoff_ct[%d] for seq %d\n", rfpos-1+1, i);
+ */
+ already_handled_special_spos = TRUE; /* if another rfpos is less than (spos-1) we don't care, we already fixed s_rfoff_ct */
+ }
+ }
+
+ /* Now check if this insert is after epos */
+ if(erfoff_ct != NULL) {
+ if(rfpos > epos) { /* we've got an insert *after* a position rfpos > epos */
+ /* Any function that counted the final RF position for this sequence if inserts were
+ * removed thought it was epos, but an insert exists after rfpos>epos, which means there
+ * was a gap in at least one consensus position cpos > epos (cpos <= rfpos) and then inserts
+ * after rfpos.
+ * NOTE a nasty off-by-one: RF (consensus) positions in the ifile are indexed 1..rflen, whereas srfoff_ct is 0..rflen-1 */
+ erfoff_ct[(epos-1)]--; /* this position was overcounted */
+ erfoff_ct[(rfpos-1)]++; /* this position was undercounted */
+
+ /* BUT, be careful, we could have already entered this 'if' for this sequence, if so we need to negate
+ * the previous time we incremented and decremented.
+ * NOTE this case and corresponding code only applies to epos (not spos) b/c with spos
+ * its the first case only that we want to handle (which is why we use the already_handled_special_spos FLAG) */
+ if(prv_e_decrement != -1 && prv_e_increment != -1) {
+ erfoff_ct[prv_e_increment]--; /* undo increment with a decrement */
+ erfoff_ct[prv_e_decrement]++; /* undo decrement with an increment */
+ prv_e_decrement = (epos-1);
+ prv_e_increment = (rfpos-1);
+ }
+ }
+ }
+ }
+ }
+ nseq_stored++;
+ }
+ nseq_read++;
+ if(nseq_read > msa_nseq) esl_fatal("Error reading insert file, read info for more sequences than expected (%d) at line %d of file %s.", msa_nseq, efp->linenumber, ifile);
+ }
+ }
+ esl_fileparser_Close(efp);
+
+ /* end of file, make sure we read a '//' at the end of it */
+ if(! seen_end_of_model_line) esl_fatal("Error reading insert file, didn't read the special '//' line at the end of file %s.\n", rfpos, efp->linenumber, ifile);
+
+ /* if useme_keyhash != NULL, make sure we read all the seqs we wanted to */
+ if((useme_keyhash != NULL) && (nseq_stored != nseq2store)) {
+ esl_fatal("Error reading insert file, wanted to read insert info on %d seqs, but only found %d of them in the insert file %s\n", nseq2store, nseq_stored, ifile);
+ }
+ if(nseq_read != msa_nseq) esl_fatal("Error reading insert file, expected to read info on %d seqs, but only found %d in the insert file %s\n", msa_nseq, nseq_read, ifile);
+
+ if (ret_nins_ct != NULL) *ret_nins_ct = nins_ct;
+ else free(nins_ct);
+ if (ret_nseq_with_ins_ct != NULL) *ret_nseq_with_ins_ct = nseq_with_ins_ct;
+ else free(nseq_with_ins_ct);
+ if (ret_srfoff_ct != NULL) *ret_srfoff_ct = srfoff_ct;
+ else if (srfoff_ct != NULL) free(srfoff_ct);
+ if (ret_erfoff_ct != NULL) *ret_erfoff_ct = erfoff_ct;
+ else if (erfoff_ct != NULL) free(erfoff_ct);
+ if (ret_per_seq_ins_ct != NULL) *ret_per_seq_ins_ct = per_seq_ins_ct;
+ else if (per_seq_ins_ct != NULL) esl_Free2D((void **) per_seq_ins_ct, msa_nseq);
+
+ return;
+
+ ERROR:
+ esl_fatal("Memory allocation error while reading insert file %s.", ifile);
+ return;; /* NEVERREACHED */
+}
+
+/* Function: get_insert_info_from_abc_ct
+ * Date: EPN, Tue Jan 19 09:32:30 2010
+ *
+ * Given an abc_ct array:
+ * [0..apos..alen-1][0..abc->K]: per position count of
+ * each symbol in alphabet over all seqs.
+ *
+ * Determine the number of sequences with >= 1 inserted
+ * nucleotides after each RF position.
+ *
+ * IMPORTANT NOTE: This is done based on the assumption that inserts
+ * have been systematically placed in the MSA by a program like
+ * Infernal or HMMER and that the maximum number of nongap nucleotides in
+ * any insert position after rfpos is the number of sequences with >=1
+ * insert nucleotides after rfpos. However, if the alignments were not
+ * generated from HMMER nor Infernal, or have been modified, the
+ * inserts may not follow this rule (the rule, in other words is that
+ * there is always 1 insert column after each nongap RF position rfpos
+ * that includes a nucleotide from all sequences that have >= 1 inserted
+ * nucleotides after rfpos).
+ *
+ * abc_ct - [0..apos..msa_alen-1][0..abc->K] count of each nucleotide in each position
+ * abc - the alphabet
+ * msa_rf - msa->rf, the reference annotation
+ * msa->alen - length of alignment
+ * rflen - expected nongap RF length (consensus length)
+ * ret_nseq_with_ins_ct - [0..rflen] number of sequences with >= 1
+ * insert after each position. NULL if unwanted.
+ * ret_nins_ct - [0..rflen] total number of inserted nucleotides (over
+ * all sequences after each position. NULL if unwanted.
+ *
+ * Returns void. Dies with an informative error message upon an error.
+ */
+void
+get_insert_info_from_abc_ct(double **abc_ct, ESL_ALPHABET *abc, char *msa_rf, int64_t msa_alen, int rflen, int **ret_nseq_with_ins_ct, int **ret_nins_ct)
+{
+ int status;
+ int *nins_ct;
+ int *nseq_with_ins_ct;
+ int nins, nmaxins;
+ int rfpos, apos;
+
+ /* allocate and initialize */
+ ESL_ALLOC(nseq_with_ins_ct, sizeof(int) * (rflen+1));
+ esl_vec_ISet(nseq_with_ins_ct, rflen+1, 0);
+ ESL_ALLOC(nins_ct, sizeof(int) * (rflen+1));
+ esl_vec_ISet(nins_ct, rflen+1, 0);
+
+ nmaxins = 0;
+ rfpos = 0;
+ for(apos = 0; apos < msa_alen; apos++) {
+ if(esl_abc_CIsResidue(abc, msa_rf[apos])) {
+ nseq_with_ins_ct[rfpos] = nmaxins;
+ nmaxins = 0;
+ rfpos++;
+ if(rfpos > rflen) esl_fatal("Error in get_insert_info_from_abc_ct(), expected consensus length (%d) is incorrect.");
+ }
+ else {
+ nins = (int) esl_vec_DSum(abc_ct[apos], abc->K);
+ nins_ct[rfpos] += nins;
+ nmaxins = ESL_MAX(nmaxins, nins);
+ }
+ }
+ /* get max_nseq with inserts after the final position */
+ nseq_with_ins_ct[rfpos] = nmaxins;
+
+ if(ret_nins_ct != NULL) *ret_nins_ct = nins_ct;
+ else free(nins_ct);
+ if(ret_nseq_with_ins_ct != NULL) *ret_nseq_with_ins_ct = nseq_with_ins_ct;
+ else free(nseq_with_ins_ct);
+
+ return;
+
+ ERROR:
+ esl_fatal("Error in get_insert_info_from_abc_ct(), memory allocation error.");
+ return; /* NEVERREACHED */
+}
+
+/* get_pp_idx
+ *
+ * Given a #=GR PP or #=GC PP_cons character, return the appropriate index
+ * in a pp_ct[] vector.
+ * '0' return 0;
+ * '1' return 1;
+ * '2' return 2;
+ * '3' return 3;
+ * '4' return 4;
+ * '5' return 5;
+ * '6' return 6;
+ * '7' return 7;
+ * '8' return 8;
+ * '9' return 9;
+ * '*' return 10;
+ * gap return 11;
+ *
+ * Anything else (including missing or nonnucleotide) return -1;
+ */
+int
+get_pp_idx(const ESL_ALPHABET *abc, char ppchar)
+{
+ if(esl_abc_CIsGap(abc, ppchar)) return 11;
+ if(ppchar == '*') return 10;
+ if(ppchar == '9') return 9;
+ if(ppchar == '8') return 8;
+ if(ppchar == '7') return 7;
+ if(ppchar == '6') return 6;
+ if(ppchar == '5') return 5;
+ if(ppchar == '4') return 4;
+ if(ppchar == '3') return 3;
+ if(ppchar == '2') return 2;
+ if(ppchar == '1') return 1;
+ if(ppchar == '0') return 0;
+ return -1;
+}
+
+/* spos_and_epos2span_ct
+ *
+ * Given two arrays, spos_ct[0..apos..alen-1] and epos_ct[0..apos..alen-1],
+ * specifying the number of sequences for which the first and last non-gap
+ * position is apos, calculate the number of sequences that 'span' each RF
+ * position. A sequence spans position rfpos which is actually alignment
+ * position apos, it has at least one nongap nucleotide in a position x <= apos,
+ * and at least one nucleotide in a position y, y >= apos.
+ *
+ * As a special case, if alen == rflen and srfoff_ct != NULL and erfoff_ct != NULL,
+ * then we've read an insert file (with --ifile) which has given us information
+ * that we'll use to update spos_ct and epos_ct. In this case, the inserts
+ * have been removed from the alignment but it is possible that spos_ct and
+ * epos_ct have miscounted some positions (see get_insert_info_from_ifile()
+ * for more info).
+ *
+ * span_ct: [0..rfpos..ps->msa->rflen-1] number of sequences that 'span' each position rfpos
+ * have >= 1 nucleotide at a position apos before rf2a_map[rfpos] and >= 1 nucleotide at
+ * any position apos >= rf2a_map[rfpos],
+ */
+int
+get_span_ct(int *msa_rf2a_map, int64_t alen, int rflen, int nseq, int *spos_ct, int *epos_ct, int *srfoff_ct, int *erfoff_ct, int **ret_span_ct)
+{
+ int status;
+ int *nseq_start_after_rfpos = NULL;
+ int *nseq_end_before_rfpos = NULL;
+ int *span_ct = NULL;
+ int rfpos;
+ int do_correction;
+ int apos, nxt_apos, prv_apos;
+
+ ESL_ALLOC(span_ct, sizeof(int) * rflen);
+ ESL_ALLOC(nseq_start_after_rfpos, sizeof(int) * rflen);
+ ESL_ALLOC(nseq_end_before_rfpos, sizeof(int) * rflen);
+
+ esl_vec_ISet(nseq_start_after_rfpos, rflen, 0);
+ esl_vec_ISet(nseq_end_before_rfpos, rflen, 0);
+
+ /* check for special case, when we need to update spos_ct and epos_ct */
+ if(srfoff_ct != NULL && erfoff_ct == NULL) esl_fatal("Internal error, get_span_ct: srfoff_ct != NULL and erfoff_ct == NULL");
+ if(srfoff_ct == NULL && erfoff_ct != NULL) esl_fatal("Internal error, get_span_ct: srfoff_ct == NULL and erfoff_ct != NULL");
+
+ /* determine if we should correct spos_ct and epos_ct using srfoff_ct and erfoff_ct */
+ do_correction = (alen == rflen && srfoff_ct != NULL) ? TRUE : FALSE;
+
+ /* NOTE: if alen == rflen spos_ct and epos_ct have length rflen, just like srfoff_ct and erfoff_ct */
+
+ /* first count number of seqs that start after each position */
+ nseq_start_after_rfpos[rflen-1] = 0; /* initialize */
+ nxt_apos = (int) alen - 1;
+ for(rfpos = rflen-2; rfpos >= 0; rfpos--) {
+ for(apos = nxt_apos; apos > msa_rf2a_map[rfpos]; apos--) {
+ nseq_start_after_rfpos[rfpos] += spos_ct[apos];
+ if(do_correction) nseq_start_after_rfpos[rfpos] += srfoff_ct[apos];
+ }
+ nseq_start_after_rfpos[rfpos] += nseq_start_after_rfpos[rfpos+1];
+ nxt_apos = msa_rf2a_map[rfpos];
+ }
+
+ /* count number of seqs that end before each position */
+ nseq_end_before_rfpos[0] = 0; /* initialize */
+ prv_apos = 0;
+ for(rfpos = 1; rfpos < rflen; rfpos++) {
+ for(apos = prv_apos; apos < msa_rf2a_map[rfpos]; apos++) {
+ nseq_end_before_rfpos[rfpos] += epos_ct[apos];
+ if(do_correction) nseq_end_before_rfpos[rfpos] += erfoff_ct[apos];
+ }
+ nseq_end_before_rfpos[rfpos] += nseq_end_before_rfpos[rfpos-1];
+ prv_apos = msa_rf2a_map[rfpos];
+ }
+
+ /* We now know how many seqs start after each rfpos (a = nseq_start_after_rfpos[rfpos]) and
+ * how many seqs end before each rfpos (b = nseq_end_before_rfpos[rfpos])
+ * so c = [nseq-(a+b)] seqs span rfpos (b/c they don't start after it AND don't end before it).
+ *
+ * Note: this is really confusing to me, but I've convinced myself it's true, and I think
+ * it is only true because we know each sequence's end position must be >= its start position
+ */
+ for(rfpos = 0; rfpos < rflen; rfpos++) {
+ span_ct[rfpos] = nseq - (nseq_start_after_rfpos[rfpos] + nseq_end_before_rfpos[rfpos]);
+ /*printf("span_ct[rfpos: %d]: %d after: %d before: %d nseq: %d\n", rfpos, span_ct[rfpos], nseq_start_after_rfpos[rfpos], nseq_end_before_rfpos[rfpos], nseq);*/
+ }
+
+ *ret_span_ct = span_ct;
+ free(nseq_start_after_rfpos);
+ free(nseq_end_before_rfpos);
+ return eslOK;
+
+ ERROR:
+ return eslEMEM;
+}
+
+
+/* Function: drawfile2sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with >= 1 new page(s), with colors described
+ * in an input 'draw' file, with >= 1 sets of <x> lines of data, each set
+ * is separated by a line with only "//". <x> must be equal to the consensus
+ * ps->rflen. Each line contains a single real number between 0 and 1,
+ * these are converted into 1 of 6 CMYK colors based on their values, using
+ * the same color scheme used for frequency of inserts.
+ *
+ * Return: eslOK on success.
+ */
+static int
+drawfile2sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps, float ***hc_scheme, int hc_scheme_idx, int hc_nbins)
+{
+ int status;
+ int p, pp;
+ int rfpos, c;
+ int orig_npage = ps->npage;
+ ESL_FILEPARSER *efp;
+ char *s;
+ char *dfile = esl_opt_GetString(go, "--dfile");
+ float *limits;
+ float value;
+ int l;
+ int bi, within_mask;
+ char *desc = NULL;
+ char *legheader = NULL;
+
+ /* allocate for limits, but don't fill it yet */
+ ESL_ALLOC(limits, sizeof(float) * (hc_nbins+1));
+
+ if (esl_fileparser_Open(dfile, NULL, &efp) != eslOK) ESL_FAIL(eslFAIL, errbuf, "failed to open %s in draw_file2sspostscript\n", dfile);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ pp = orig_npage - 1;
+
+ /* Format of dfile:
+ * For each page:
+ * line 1: description of page (max is ps->desc_max_chars*2 chars)
+ * line 2: header for legend (max is ps->legx_max_chars chars)
+ * line 3: limits for color bins, must be 7 tokens, all numbers, each greater than the last
+ * lines 4-N: single tokens, numerical values for each position, N is CLEN-3.
+ * line N+1: single token, only:"//\n" signifying end of page.
+ *
+ * '#' prefixed lines are considered comments and skipped.
+ *
+ * Example:
+ */
+
+ rfpos = -1;
+ while (esl_fileparser_NextLine(efp) == eslOK)
+ {
+ if(rfpos == -1) { /* new page, first add a new page */
+ /* next 3 lines must be a specific format */
+ /* first line is description */
+ if(desc != NULL) { free(desc); desc = NULL; }
+ while((status = esl_fileparser_GetTokenOnLine(efp, &s, NULL)) == eslOK) {
+ if((status = esl_strcat(&desc, -1, s, -1)) != eslOK) esl_fatal("Out of memory");
+ if((status = esl_strcat(&desc, -1, " ", -1)) != eslOK) esl_fatal("Out of memory");
+ }
+ if(strlen(desc) > (ps->desc_max_chars*2.)) esl_fatal("Error reading --dfile, description length (%d) exceeds max allowed (%d)", strlen(desc), (ps->desc_max_chars*2));
+ if(esl_fileparser_NextLine(efp) != eslOK) esl_fatal("Error reading --dfile, expected legend header line at line %d\n", efp->linenumber);
+
+ /* second line is legend header */
+ if(legheader != NULL) { free(legheader); legheader = NULL; }
+ while((status = esl_fileparser_GetTokenOnLine(efp, &s, NULL)) == eslOK) {
+ if((status = esl_strcat(&legheader, -1, s, -1)) != eslOK) esl_fatal("Out of memory");
+ if((status = esl_strcat(&legheader, -1, " ", -1)) != eslOK) esl_fatal("Out of memory");
+ }
+ if(strlen(legheader) > ps->legx_max_chars) esl_fatal("Error reading --dfile, legend header length (%d) exceeds max allowed (%d)", strlen(legheader), ps->legx_max_chars);
+ if(esl_fileparser_NextLine(efp) != eslOK) esl_fatal("Error reading --dfile, expected limits line at line %d\n", efp->linenumber);
+
+ /* third line is bin limits for the colors, must be 7 numbers, we read them as floats */
+ for(l = 0; l < hc_nbins+1; l++) {
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) != eslOK) esl_fatal("Error reading --dfile, expected limits line at line %d to have %d limits (numbers) in increasing order, it doesn't", efp->linenumber, hc_nbins+1);
+ limits[l] = atof(s);
+ if(l > 0 && limits[l] < limits[l-1]) esl_fatal("Error reading --dfile, expected limits line at line %d with %d limits (numbers) in increasing order", efp->linenumber, hc_nbins+1);
+ }
+ rfpos++; /* rfpos will now be 0 */
+ }
+ else if(rfpos == (ps->rflen)) { /* end of page, should be a single token, a "\\" on this line */
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) != eslOK)
+ esl_fatal("Failed to read a final token at the end of description of page %d on line %d of drawfile %s\n", (pp - orig_npage + 1), efp->linenumber, dfile);
+ if (strcmp(s, "//") != 0)
+ esl_fatal("Failed to read a final \"//\" token (read %s) at the end of description of draw page %d on line %d of drawfile %s\n", s, (pp - orig_npage + 1), efp->linenumber, dfile);
+ rfpos = -1;
+ /* add color legend */
+ if((status = add_text_to_scheme_colorlegend(ps, ps->sclAA[pp], legheader, ps->legx_max_chars, errbuf)) != eslOK) return status;
+ if((status = add_page_desc_to_sspostscript(ps, ps->npage-1, desc, errbuf)) != eslOK) return status;
+ }
+ else { /* a normal line, should either contain a single float or the \\ marking end of this page */
+ rfpos++;
+ if(rfpos == 1) { /* add a new page, (we now have limits for legend, from if(rfpos == -1) loop above) */
+ if((status = add_pages_sspostscript(ps, 1, ALIMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+ for(p = (ps->npage-1); p < ps->npage; p++) {
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ ESL_ALLOC(ps->sclAA[p], sizeof(SchemeColorLegend_t) * 1);
+ for(c = 0; c < ps->rflen; c++) {
+ ESL_ALLOC(ps->bcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ pp++; /* if first page, pp == orig_npage now */
+ ps->sclAA[pp] = create_scheme_colorlegend(hc_scheme_idx, hc_nbins, limits, FALSE, TRUE, TRUE, TRUE);
+ }
+ /* now parse the line, it should have a single number, a numerical value for a position */
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) != eslOK) esl_fatal("Failed to read value for position %d for page %d on line %d of dfile\n", rfpos, (pp - orig_npage + 1), efp->linenumber);
+ value = atof(s);
+ if(value < limits[0] || value > limits[hc_nbins]) esl_fatal("--dfile value %.4f out of allowed range [%.3f-%.3f] on line %d\n", value, limits[0], limits[hc_nbins], efp->linenumber, dfile);
+ within_mask = (ps->mask != NULL && ps->mask[rfpos-1] == '1') ? TRUE : FALSE;
+ if((status = set_scheme_values(errbuf, ps->bcolAAA[pp][rfpos-1], NCMYK, hc_scheme[hc_scheme_idx], value, ps->sclAA[pp], within_mask, &bi)) != eslOK) return status;
+ }
+ }
+ if(pp == (orig_npage - 1)) { /* no new pages were read, this is an error */
+ esl_fatal("Failed to read a single page from drawfile %s\n", dfile);
+ }
+ esl_fileparser_Close(efp);
+
+ free(limits);
+ if(desc != NULL) { free(desc); desc = NULL; }
+ if(legheader != NULL) { free(legheader); legheader = NULL; }
+
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "drawfile2sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* Function: expertfile2sspostscript()
+ *
+ * Purpose: Fill a postscript data structure with >= 1 new page(s), with colors described
+ * in an input 'expert draw' file, with >= 1 sets of <x> lines of data, each set
+ * is separated by a line with only "//". <x> must be equal to the consensus
+ * ps->rflen. Each line has at least 4 floats explaining
+ * the CMYK values for the color to use at each position of the SS diagram,
+ * and optionally contains an extra single character which is the nucleotide
+ * to put at that position.
+ *
+ * Return: eslOK on success.
+ */
+static int
+expertfile2sspostscript(const ESL_GETOPTS *go, char *errbuf, SSPostscript_t *ps)
+{
+ int status;
+ int p, pp;
+ int cpos, c;
+ int orig_npage = ps->npage;
+ ESL_FILEPARSER *efp;
+ char *s;
+ char *efile = esl_opt_GetString(go, "--efile");
+
+ if (esl_fileparser_Open(efile, NULL, &efp) != eslOK) ESL_FAIL(eslFAIL, errbuf, "failed to open %s in draw_file2sspostscript\n", efile);
+ esl_fileparser_SetCommentChar(efp, '#');
+
+ pp = orig_npage - 1;
+ cpos = 0;
+
+ while (esl_fileparser_NextLine(efp) == eslOK)
+ {
+ /* example line without nucleotide markup:
+ * 0.000 0.000 0.000 0.500
+ *
+ * example line with nucleotide markup:
+ * 0.000 0.000 0.000 0.500 A
+ */
+
+ cpos++;
+ if(cpos == 1) { /* add a new page */
+ if((status = add_pages_sspostscript(ps, 1, SIMPLEMASKMODE)) != eslOK) ESL_FAIL(status, errbuf, "memory error adding pages to the postscript object.");
+
+ for(p = (ps->npage-1); p < ps->npage; p++) {
+ ESL_ALLOC(ps->rAA[p], sizeof(char) * (ps->rflen+1));
+ ESL_ALLOC(ps->bcolAAA[p], sizeof(float *) * ps->rflen);
+ for(c = 0; c < ps->rflen; c++) {
+ ESL_ALLOC(ps->bcolAAA[p][c], sizeof(float) * NCMYK); /* CMYK colors */
+ }
+ }
+ pp++; /* if first page, pp == orig_npage now */
+ }
+ if(cpos == (ps->rflen+1)) { /* should be a single token, a "\\" on this line */
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) != eslOK)
+ esl_fatal("Failed to read a final token at the end of description of draw page %d on line %d of expertfile %s\n", (pp - orig_npage + 1), efp->linenumber, efile);
+ if (strcmp(s, "//") != 0)
+ esl_fatal("Failed to read a final \"//\" token (read %s) at the end of description of draw page %d on line %d of expertfile %s\n", s, (pp - orig_npage + 1), efp->linenumber, efile);
+ cpos = 0;
+ }
+ else {
+ /* get C value */
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) != eslOK)
+ esl_fatal("Failed to read C of CMYK value on line %d of expertfile %s\n", efp->linenumber, efile);
+ ps->bcolAAA[pp][(cpos-1)][0] = atof(s);
+
+ /* get M value */
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) != eslOK)
+ esl_fatal("Failed to read M of CMYK value on line %d of expertfile %s\n", efp->linenumber, efile);
+ ps->bcolAAA[pp][(cpos-1)][1] = atof(s);
+
+ /* get Y value */
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) != eslOK)
+ esl_fatal("Failed to read Y of CMYK value on line %d of expertfile %s\n", efp->linenumber, efile);
+ ps->bcolAAA[pp][(cpos-1)][2] = atof(s);
+
+ /* get K value */
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) != eslOK)
+ esl_fatal("Failed to read K of CMYK value on line %d of expertfile %s\n", efp->linenumber, efile);
+ ps->bcolAAA[pp][(cpos-1)][3] = atof(s);
+
+ /* optionally read a nucleotide value */
+ if (esl_fileparser_GetTokenOnLine(efp, &s, NULL) == eslOK) {
+ if(((int) strlen(s)) != 1) esl_fatal("Read multi-character string (%s) for consensus nucleotide %d on line %d of expertfile %s\n", s, cpos, efp->linenumber, efile);
+ ps->rAA[pp][(cpos-1)] = s[0];
+ }
+ else ps->rAA[pp][(cpos-1)] = ' ';
+ }
+ }
+ if(pp == (orig_npage - 1)) { /* no new pages were read, this is an error */
+ esl_fatal("Failed to read a single page from expertfile %s\n", efile);
+ }
+
+ esl_fileparser_Close(efp);
+ return eslOK;
+
+ ERROR: ESL_FAIL(status, errbuf, "expertfile2sspostscript(): memory allocation error.");
+ return status; /* NEVERREACHED */
+}
+
+
+/* is_watson_crick_bp(i,j): return TRUE if i,j form a watson crick bp, FALSE if not
+ * is_gu_or_ug_bp(i,j): return TRUE if i,j form a G-U or U-G bp, FALSE if not
+ */
+static int
+is_watson_crick_bp(char i, char j)
+{
+ switch (toupper(i)) {
+ case 'A':
+ switch (toupper(j)) {
+ case 'U': return TRUE; break;
+ case 'T': return TRUE; break;
+ default: break;
+ }
+ break;
+ case 'C':
+ switch (toupper(j)) {
+ case 'G': return TRUE; break;
+ default: break;
+ }
+ break;
+ case 'G':
+ switch (toupper(j)) {
+ case 'C': return TRUE; break;
+ default: break;
+ }
+ break;
+ case 'U':
+ switch (toupper(j)) {
+ case 'A': return TRUE; break;
+ default: break;
+ }
+ break;
+ case 'T':
+ switch (toupper(j)) {
+ case 'A': return TRUE; break;
+ default: break;
+ }
+ break;
+ default: break;
+ }
+
+ return FALSE;
+}
+
+static int
+is_gu_or_ug_bp(char i, char j)
+{
+ switch (toupper(i)) {
+ case 'G':
+ switch (toupper(j)) {
+ case 'U': return TRUE; break;
+ case 'T': return TRUE; break;
+ default: break;
+ }
+ break;
+ case 'U':
+ switch (toupper(j)) {
+ case 'G': return TRUE; break;
+ default: break;
+ }
+ break;
+ case 'T':
+ switch (toupper(j)) {
+ case 'G': return TRUE; break;
+ default: break;
+ }
+ break;
+ default: break;
+ }
+
+ return FALSE;
+}
+
+/* Function: get_consensus_seqs_from_abc_ct()
+ * Date: EPN, Wed Apr 7 07:39:57 2010
+ *
+ * Given an abc_ct array:
+ * [0..apos..alen-1][0..abc->K]: per position count of
+ * each symbol in alphabet over all seqs.
+ *
+ * Determine the consensus sequence for the msa that abc_ct
+ * corresponds to, one nucleotide per nongap RF position, the
+ * most informative IUPAC nucleotide (including ambiguous nucleotides)
+ * that represents >= <x> fraction of the sequences in the msa
+ * that have a nongap at that position.
+ *
+ * Alternatively, if --majrule is enabled, define consensus nucleotide
+ * as the most common nucleotide at each position. Uppercase
+ * if frequency >= 0.5 of nongap nts, else it is lowercase.
+ *
+ * ps - the postscript object
+ * errbuf - informative error message, returned upon failure
+ * abc_ct - count of nucleotides per alignment position (see above)
+ * abc - the alphabet
+ * cthresh - consensus nucleotide must explain >= <cthresh> fraction
+ * of nucleotides in msa (ex: if cthresh = 0.8, and
+ * A=0.6, C=0.01, G=0.25, U=0.14, consensus nucleotide = R (A|G))
+ * ret_cseq - RETURN: the consensus sequence [0..rflen-1]
+ *
+ * Returns eslOK on success.
+ */
+typedef struct nt2sort_s {
+ double ntfreq; /* frequency of this nucleotide */
+ int ntidx; /* index of this nucleotide in alphabet (ex: 1 for 'C' in eslRNA) */
+} nt2sort_t;
+
+
+int compare_by_ntfreq(const void *a_void, const void *b_void) {
+ nt2sort_t *a, *b;
+ a = (nt2sort_t *) a_void;
+ b = (nt2sort_t *) b_void;
+ if (a->ntfreq > b->ntfreq) return -1;
+ else if (a->ntfreq < b->ntfreq) return 1;
+ else return 0;
+}
+
+/* Function: get_consensus_nucleotide()
+ * Date: EPN, Wed Apr 7 07:39:57 2010
+ *
+ * Given a useme array:
+ * [0..i..abc->K]: TRUE if nucleotide i is used, FALSE if not
+ * Return the consensus nucleotide - the least ambiguous iupac
+ * nucleotide that represents all TRUEs. For ex: [1,0,1,0] --> R
+ * If <do_dna> is TRUE, return 'T' instead of 'U' when appropriate.
+ *
+ * Returns the consensus nucleotide.
+ *
+ * Degeneracies:
+ * R = A|G
+ * Y = C|U
+ * M = A|C
+ * K = G|U
+ * S = C|G
+ * W = A|U
+ * H = A|C|U
+ * B = C|G|U
+ * V = A|C|G
+ * D = A|G|U
+ */
+int get_consensus_nucleotide(int *useme, int K)
+{
+ /* You brute! */
+ if((! useme[0]) && (! useme[1]) && (! useme[2]) && ( useme[3])) { return 'U'; } /* 0001 */
+ if((! useme[0]) && (! useme[1]) && ( useme[2]) && (! useme[3])) { return 'G'; } /* 0010 */
+ if((! useme[0]) && ( useme[1]) && (! useme[2]) && (! useme[3])) { return 'C'; } /* 0100 */
+ if(( useme[0]) && (! useme[1]) && (! useme[2]) && (! useme[3])) { return 'A'; } /* 1000 */
+
+ if(( useme[0]) && ( useme[1]) && ( useme[2]) && ( useme[3])) { return 'N'; } /* 1111 */
+
+ if((! useme[0]) && ( useme[1]) && ( useme[2]) && ( useme[3])) { return 'B'; } /* 0111 */
+ if(( useme[0]) && (! useme[1]) && ( useme[2]) && ( useme[3])) { return 'D'; } /* 1011 */
+ if(( useme[0]) && ( useme[1]) && ( useme[2]) && (! useme[3])) { return 'V'; } /* 1110 */
+ if(( useme[0]) && ( useme[1]) && (! useme[2]) && ( useme[3])) { return 'H'; } /* 1101 */
+
+ if((! useme[0]) && (! useme[1]) && ( useme[2]) && ( useme[3])) { return 'K'; } /* 0011 */
+ if((! useme[0]) && ( useme[1]) && ( useme[2]) && (! useme[3])) { return 'S'; } /* 0110 */
+ if(( useme[0]) && ( useme[1]) && (! useme[2]) && (! useme[3])) { return 'M'; } /* 1100 */
+ if((! useme[0]) && ( useme[1]) && (! useme[2]) && ( useme[3])) { return 'Y'; } /* 0101 */
+ if(( useme[0]) && (! useme[1]) && (! useme[2]) && ( useme[3])) { return 'W'; } /* 1001 */
+ if(( useme[0]) && (! useme[1]) && ( useme[2]) && (! useme[3])) { return 'R'; } /* 1010 */
+
+ if((! useme[0]) && (! useme[1]) && (! useme[2]) && (! useme[3])) { return '-'; } /* 0000 */
+ esl_fatal("coding error in consensus_nucleotide");
+ return ' '; /* NEVERREACHED */
+}
+
+int
+get_consensus_seqs_from_abc_ct(const ESL_GETOPTS *go, SSPostscript_t *ps, char *errbuf, double **abc_ct, ESL_ALPHABET *abc, int64_t msa_alen)
+{
+ int status; /* the Easel return status */
+ char *cseq_maj = NULL; /* the consensus sequence string based on majority rule that we're building */
+ char *cseq_amb = NULL; /* the consensus sequence string including ambiguities that we're building */
+ int rfpos, apos; /* counter over nongap RF, alignment positions */
+ float nongap_freq; /* for current position, fraction of nongap nucleotides from abc_ct */
+ float covered; /* fraction of nongap nucleotides currently covered while
+ * calculating the consensus nucleotide */
+ int *nt_is_used; /* [0..a..abc->K-1] TRUE if nucleotide a is included for
+ * current consensus nucleotide, FALSE if not */
+ nt2sort_t *sorted_ntfreq; /* [0..abc->K-1] sorted array of nt2sort structures */
+ int sorted_idx; /* index in sorted_ntfreq */
+ int a; /* counter over nucleotides in abc */
+ float cthresh = esl_opt_GetReal(go, "--cthresh");
+ float athresh = esl_opt_GetReal(go, "--athresh");
+
+ /* allocate and initialize */
+ ESL_ALLOC(cseq_maj, sizeof(char) * (ps->rflen+1));
+ ESL_ALLOC(cseq_amb, sizeof(char) * (ps->rflen+1));
+ cseq_maj[ps->rflen] = '\0';
+ cseq_amb[ps->rflen] = '\0';
+ ESL_ALLOC(sorted_ntfreq, sizeof(nt2sort_t) * (abc->K));
+ ESL_ALLOC(nt_is_used, sizeof(int) * (abc->K));
+
+ rfpos = 0;
+ for(apos = 0; apos < msa_alen; apos++) {
+ if(esl_abc_CIsResidue(abc, ps->msa->rf[apos])) {
+ nongap_freq = esl_vec_DSum(abc_ct[apos], abc->K);
+ if(esl_DCompare(nongap_freq, 0., eslSMALLX1) == eslOK) { /* all nucleotides are gaps */
+ cseq_maj[rfpos] = cseq_amb[rfpos] = '-';
+ }
+ else { /* at least one sequence has a nongap at rfpos, calculate the consensus nucleotide */
+ for(a = 0; a < abc->K; a++) {
+ sorted_ntfreq[a].ntfreq = abc_ct[apos][a] / nongap_freq;
+ sorted_ntfreq[a].ntidx = a;
+ }
+ /* quicksort */
+ qsort(sorted_ntfreq, abc->K, sizeof(nt2sort_t), compare_by_ntfreq);
+ covered = 0.;
+ esl_vec_ISet(nt_is_used, abc->K, FALSE);
+ sorted_idx = 0;
+ /* determine majority rule nucleotide */
+ cseq_maj[rfpos] = (sorted_ntfreq[sorted_idx].ntfreq >= cthresh) ?
+ toupper(abc->sym[sorted_ntfreq[sorted_idx].ntidx]) :
+ tolower(abc->sym[sorted_ntfreq[sorted_idx].ntidx]);
+ /* determine ambiguous nucleotide that covers > --athresh fraction of seqs */
+ while(covered < athresh) {
+ nt_is_used[sorted_ntfreq[sorted_idx].ntidx] = TRUE;
+ covered += sorted_ntfreq[sorted_idx].ntfreq;
+ /*printf("RF: %4d SIDX: %d AIDX: %d FREQ: %.3f COVERED: %.3f\n",
+ rfpos, sorted_idx,
+ sorted_ntfreq[sorted_idx].ntidx,
+ sorted_ntfreq[sorted_idx].ntfreq,
+ covered);*/
+ sorted_idx++;
+ }
+ cseq_amb[rfpos] = get_consensus_nucleotide(nt_is_used, abc->K);
+ }
+ rfpos++;
+ }
+ }
+ /* printf("\n"); */
+ ps->msa_cseq_maj = cseq_maj;
+ ps->msa_cseq_amb = cseq_amb;
+
+ free(sorted_ntfreq);
+ free(nt_is_used);
+
+ return eslOK;
+
+ ERROR:
+ ESL_FAIL(eslEMEM, errbuf, "Ran out of memory in get_consensus_seqs_from_abc_ct.");
+ return eslEMEM; /* NEVERREACHED */
+}
+
+/* Function: compare_two_cmyk_colors()
+ * Date: EPN, Fri Apr 23 05:47:54 2010
+ *
+ * Given four CMYK values defining a color <a>
+ * and four CMYK values defining a color <b>, check if
+ * <a> and <b> are the same color. Return TRUE if they
+ * are and FALSE if not.
+ *
+ * acol_C - first CMYK value for color <a> (Cyan)
+ * acol_M - second CMYK value for color <a> (Magenta)
+ * acol_Y - third CMYK value for color <a> (Yellow)
+ * acol_K - fourth CMYK value for color <a> (Key)
+ * bcol_C - first CMYK value for color <b> (Cyan)
+ * bcol_M - second CMYK value for color <b> (Magenta)
+ * bcol_Y - third CMYK value for color <b> (Yellow)
+ * bcol_K - fourth CMYK value for color <b> (Key)
+ *
+ * Returns TRUE if colors a and b are identical, FALSE if not.
+ */
+int compare_two_cmyk_colors(float acol_C, float acol_M, float acol_Y, float acol_K, float bcol_C, float bcol_M, float bcol_Y, float bcol_K)
+{
+ if(esl_FCompare(acol_C, bcol_C, eslSMALLX1) != eslOK) return FALSE;
+ if(esl_FCompare(acol_M, bcol_M, eslSMALLX1) != eslOK) return FALSE;
+ if(esl_FCompare(acol_Y, bcol_Y, eslSMALLX1) != eslOK) return FALSE;
+ if(esl_FCompare(acol_K, bcol_K, eslSMALLX1) != eslOK) return FALSE;
+ return TRUE;
+}
+
+
+/* Function: define_outline_procedures()
+ * Date: EPN, Sun May 2 10:36:32 2010
+ *
+ * Given an open output postscript file, define
+ * the three procedures for drawing outlines of
+ * cells.
+ *
+ * Returns void.
+ */
+void define_outline_procedure(FILE *fp)
+{
+ fprintf(fp, "\n/%s %% stack: x y cellsize linewidth (empty)\n", OUTLINE_PROCEDURE);
+ fprintf(fp, "{\n");;
+ fprintf(fp, " 0. 0. 0. 1. setcmykcolor\n");/* set linewidth as top value on stack */
+ fprintf(fp, " setlinewidth\n"); /* set linewidth as top value on stack */
+ fprintf(fp, " /cellsize exch def\n"); /* push /cellsize onto stack, invert top 2 els, and define cellsize */
+ fprintf(fp, " newpath moveto\n"); /* move to x, y, which are now on top of stack */
+ fprintf(fp, " currentlinewidth 2. div currentlinewidth 2. div rmoveto\n");
+ fprintf(fp, " 0 cellsize currentlinewidth sub rlineto\n");
+ fprintf(fp, " cellsize currentlinewidth sub 0 rlineto\n");
+ fprintf(fp, " 0 cellsize currentlinewidth sub -1 mul rlineto\n");
+ fprintf(fp, " closepath stroke\n");
+ fprintf(fp, "} def\n\n");
+
+ /* Old definitions, kept here for reference, note these only work with OUTLINE_LINEWIDTH of 1.0 */
+ /*
+
+ //printing basic box outline
+ fprintf(fp, "\n/%s %% stack: x y => ---\n", OUTLINE_MAX_PROCEDURE);
+ fprintf(fp, "{ %.2f setlinewidth\n", OUTLINE_LINEWIDTH_MAX);
+ fprintf(fp, " newpath moveto\n");
+ fprintf(fp, " %.2f %.2f rmoveto\n",
+ OUTLINE_LINEWIDTH_MAX / 2., OUTLINE_LINEWIDTH_MAX / 2.);
+ fprintf(fp, " 0 %.2f rlineto %.2f 0 rlineto 0 %.2f rlineto\n",
+ CELLSIZE - OUTLINE_LINEWIDTH_MAX, CELLSIZE - OUTLINE_LINEWIDTH_MAX, -1 * (CELLSIZE - OUTLINE_LINEWIDTH_MAX));
+ fprintf(fp, " closepath gsave stroke grestore \n");
+ fprintf(fp, "} def\n\n");
+
+ //printing a double-line outline
+ fprintf(fp, "\n/%s %% stack: x y => ---\n", OUTLINE_MAX_PROCEDURE);
+ fprintf(fp, "{ %s\n", OUTLINE_MIN_PROCEDURE);
+ fprintf(fp, " %.2f %.2f rmoveto\n",
+ OUTLINE_LINEWIDTH * 2., OUTLINE_LINEWIDTH * 2.);
+ fprintf(fp, " 0 %.2f rlineto %.2f 0 rlineto 0 %.2f rlineto\n",
+ CELLSIZE - (5. * OUTLINE_LINEWIDTH), CELLSIZE - (5. * OUTLINE_LINEWIDTH), -1 * (CELLSIZE - (5. * OUTLINE_LINEWIDTH)));
+ fprintf(fp, " closepath gsave stroke grestore \n");
+ fprintf(fp, "} def\n\n");
+
+ //drawing corners only for the outline
+ fprintf(fp, "\n/outlinemin %% stack: x y => ---\n");
+ fprintf(fp, "{ newpath moveto\n");
+ fprintf(fp, " %.2f 0 rmoveto 0 %.2f rlineto closepath gsave stroke\n",
+ OUTLINE_LINEWIDTH/2, CELLSIZE / 4.);
+ fprintf(fp, " grestore 0 %.2f rmoveto 0 %.2f rlineto closepath gsave stroke\n",
+ 3 * CELLSIZE / 4., CELLSIZE / 4. );
+
+ fprintf(fp, " grestore %.2f %.2f rmoveto %.2f 0 rlineto closepath gsave stroke\n",
+ -1 * OUTLINE_LINEWIDTH / 2., 3 * OUTLINE_LINEWIDTH / 2., CELLSIZE / 4.);
+ fprintf(fp, " grestore %.2f 0 rmoveto %.2f 0 rlineto closepath gsave stroke\n",
+ 3 * CELLSIZE / 4., CELLSIZE / 4. );
+
+ fprintf(fp, " grestore %.2f %.2f rmoveto 0 %.2f rlineto closepath gsave stroke\n",
+ 3 * OUTLINE_LINEWIDTH / 2., -3 * OUTLINE_LINEWIDTH/2, CELLSIZE / 4.);
+ fprintf(fp, " grestore 0 %.2f rmoveto 0 %.2f rlineto closepath gsave stroke\n",
+ -3 * CELLSIZE / 4., CELLSIZE / 4.);
+
+ fprintf(fp, " grestore %.2f %.2f rmoveto %.2f 0 rlineto closepath gsave stroke\n",
+ -3 * OUTLINE_LINEWIDTH / 2., OUTLINE_LINEWIDTH / 2., CELLSIZE / 4.);
+ fprintf(fp, " grestore %.2f 0 rmoveto %.2f 0 rlineto closepath gsave stroke\n",
+ -3 * CELLSIZE / 4., CELLSIZE / 4.);
+ fprintf(fp, "} def\n");
+
+ //drawing corners plus a dash in the middle of each side for the outline
+ fprintf(fp, "/outlinemid %% stack: x y => ---\n");
+ fprintf(fp, "{ \n");
+ fprintf(fp, " outlinemin\n");
+ fprintf(fp, " grestore %.2f %.2f rmoveto 0 %.2f rlineto closepath gsave stroke\n",
+ OUTLINE_LINEWIDTH / 2., CELLSIZE / 4. + OUTLINE_LINEWIDTH / 2., CELLSIZE / 4.);
+ fprintf(fp, " grestore %.2f %.2f rmoveto 0 %.2f rlineto closepath gsave stroke\n",
+ CELLSIZE / 4. + OUTLINE_LINEWIDTH / 2., CELLSIZE / 2. + OUTLINE_LINEWIDTH / 2., CELLSIZE / 4.);
+ fprintf(fp, " grestore %.2f %.2f rmoveto 0 %.2f rlineto closepath gsave stroke\n",
+ CELLSIZE / 2. + OUTLINE_LINEWIDTH / 2., -1 * (CELLSIZE / 2. + OUTLINE_LINEWIDTH / 2.), CELLSIZE / 4.);
+ fprintf(fp, " grestore %.2f %.2f rmoveto 0 %.2f rlineto closepath gsave stroke\n",
+ -1 * (CELLSIZE / 2. + OUTLINE_LINEWIDTH / 2.), -1 * CELLSIZE / 4. + OUTLINE_LINEWIDTH / 2., CELLSIZE / 4.);
+ fprintf(fp, " gsave\n");
+ fprintf(fp, "} def\n");
+ */
+ return;
+}
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/miniapps/esl-ssdraw.itest.pl b/miniapps/esl-ssdraw.itest.pl
new file mode 100755
index 0000000..459b89e
--- /dev/null
+++ b/miniapps/esl-ssdraw.itest.pl
@@ -0,0 +1,644 @@
+#! /usr/bin/perl
+
+# Integrated test of the esl-ssdraw miniapp.
+#
+# Usage: ./esl-ssdraw.itest.pl <esl-ssdraw binary> <postscript template file> <alignment file> <tmpfile prefix>
+# Example: ./esl-ssdraw.itest.pl ./esl-ssdraw ../testsuite/trna-ssdraw.ps ../testsuite/trna-5.stk foo
+#
+# EPN, Tue Feb 9 12:22:29 2010
+
+$eslssdraw = shift;
+$templatefile = shift;
+$alifile = shift;
+$tmppfx = shift;
+
+if (! -x "$eslssdraw") { die "FAIL: didn't find esl-ssdraw binary $eslssdraw"; }
+
+open(MASKFILE, ">$tmppfx.mask1") || die "FAIL: couldn't open $tmppfx.mask1 for writing maskfile";
+print MASKFILE << "EOF";
+10010110101101111111111010101111111010101011010001100010101110101010101
+EOF
+close MASKFILE;
+
+open(MASKFILE, ">$tmppfx.mask2") || die "FAIL: couldn't open $tmppfx.mask2 for writing maskfile";
+print MASKFILE << "EOF";
+11011011111110101011111111111010101010100000000001001010011101010101010
+EOF
+close MASKFILE;
+
+open(IFILE, ">$tmppfx.ifile") || die "FAIL: couldn't open $tmppfx.ifile for writing insert file";
+print IFILE << "EOF";
+tRNA 71
+tRNA1 73 1 71 16 17 1 45 47 1
+tRNA2 72 1 71 19 20 1
+tRNA3 72 1 71 19 20 1
+tRNA4 72 1 71 45 46 1
+tRNA5 64 5 71 16 13 1 45 43 1
+//
+EOF
+close IFILE;
+
+open(DFILE, ">$tmppfx.dfile") || die "FAIL: couldn't open $tmppfx.efile for writing draw file";
+print DFILE << "EOF";
+Example of using --dfile to specify colors
+These numbers mean what?
+0.0 0.6 0.7 0.8 0.9 0.95 1.0
+0.560
+0.730
+0.210
+0.120
+0.910
+1.000
+0.000
+0.302
+0.121
+1.000
+0.998
+0.353
+0.5
+0.342
+0.560
+0.730
+0.210
+0.120
+0.910
+1.000
+0.000
+0.302
+0.121
+1.000
+0.998
+0.353
+0.5
+0.342
+0.560
+0.730
+0.210
+0.120
+0.910
+1.000
+0.000
+0.302
+0.121
+1.000
+0.998
+0.353
+0.5
+0.342
+0.560
+0.730
+0.210
+0.120
+0.910
+1.000
+0.000
+0.302
+0.121
+1.000
+0.998
+0.353
+0.5
+0.342
+0.560
+0.730
+0.210
+0.120
+0.910
+1.000
+0.000
+0.302
+0.121
+1.000
+0.998
+0.353
+0.5
+0.342
+0.342
+//
+Another example of using --dfile to specify colors
+Meaning is unknown
+0.0 0.1 0.2 0.3 0.4 0.5 1.0
+0.560
+0.730
+0.210
+0.120
+0.910
+1.000
+0.000
+0.302
+0.121
+1.000
+0.998
+0.353
+0.5
+0.342
+0.560
+0.730
+0.210
+0.120
+0.910
+1.000
+0.000
+0.302
+0.121
+1.000
+0.998
+0.353
+0.5
+0.342
+0.560
+0.730
+0.210
+0.120
+0.910
+1.000
+0.000
+0.302
+0.121
+1.000
+0.998
+0.353
+0.5
+0.342
+0.560
+0.730
+0.210
+0.120
+0.910
+1.000
+0.000
+0.302
+0.121
+1.000
+0.998
+0.353
+0.5
+0.342
+0.560
+0.730
+0.210
+0.120
+0.910
+1.000
+0.000
+0.302
+0.121
+1.000
+0.998
+0.353
+0.5
+0.342
+0.342
+//
+EOF
+close DFILE;
+
+open(EFILE, ">$tmppfx.efile") || die "FAIL: couldn't open $tmppfx.efile for writing draw file";
+print EFILE << "EOF";
+0.228 0.636 0.044 0.680
+0.470 0.564 0.932 0.933
+0.034 0.171 0.204 0.137
+0.471 0.725 0.013 0.246
+0.414 0.111 0.478 0.329
+0.947 0.110 0.870 0.230
+0.789 0.964 0.649 0.174
+0.991 0.362 0.028 0.634
+0.977 0.838 0.265 0.046
+0.024 0.806 0.148 0.647
+0.235 0.891 0.594 0.694
+0.799 0.366 0.073 0.013
+0.914 0.393 0.793 0.826
+0.054 0.786 0.486 0.386
+0.794 0.360 0.061 0.304
+0.070 0.866 0.646 0.961
+0.217 0.462 0.220 0.608
+0.446 0.715 0.516 0.287
+0.546 0.924 0.456 0.468
+0.438 0.035 0.613 0.031
+0.321 0.437 0.935 0.336
+0.101 0.275 0.089 0.410
+0.714 0.681 0.622 0.676
+0.315 0.079 0.850 0.917
+0.524 0.897 0.908 0.902
+0.460 0.826 0.039 0.979
+0.041 0.130 0.599 0.122
+0.181 0.234 0.813 0.157
+0.514 0.145 0.386 0.801
+0.183 0.929 0.161 0.588
+0.852 0.746 0.189 0.836
+0.455 0.580 0.439 0.373
+0.473 0.212 0.655 0.536
+0.678 0.744 0.434 0.793
+0.844 0.816 0.646 0.459
+0.806 0.807 0.002 0.304
+0.395 0.972 0.800 0.119
+0.981 0.492 0.752 0.463
+0.926 0.327 0.066 0.099
+0.029 0.252 0.846 0.134
+0.571 0.306 0.698 0.213
+0.711 0.470 0.680 0.522
+0.639 0.930 0.336 0.968
+0.839 0.824 0.118 0.877
+0.399 0.449 0.675 0.740
+0.105 0.341 0.014 0.971
+0.965 0.277 0.691 0.732
+0.198 0.648 0.903 0.804
+0.958 0.939 0.561 0.028
+0.359 0.665 0.162 0.298
+0.581 0.260 0.237 0.773
+0.042 0.540 0.410 0.190
+0.013 0.841 0.068 0.796
+0.763 0.904 0.601 0.677
+0.849 0.928 0.010 0.797
+0.517 0.658 0.094 0.870
+0.378 0.132 0.736 0.559
+0.385 0.358 0.951 0.566
+0.100 0.141 0.397 0.492
+0.091 0.913 0.870 0.351
+0.819 0.429 0.862 0.267
+0.263 0.777 0.427 0.602
+0.005 0.225 0.023 0.157
+0.154 0.009 0.800 0.514
+0.915 0.456 0.162 0.235
+0.374 0.595 0.678 0.901
+0.099 0.163 0.410 0.515
+0.969 0.191 0.912 0.117
+0.557 0.919 0.084 0.690
+0.846 0.032 0.300 0.158
+0.736 0.131 0.007 0.138
+//
+0.0 0.0 0.0 0.0 T
+0.0 0.0 0.0 0.0 h
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 a
+0.0 0.0 0.0 0.0 t
+0.0 0.0 0.0 0.0 R
+0.0 0.0 0.0 0.0 N
+0.0 0.0 0.0 0.0 A
+0.0 0.0 0.0 0.0 T
+0.0 0.0 0.0 0.0 h
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 a
+0.0 0.0 0.0 0.0 t
+0.0 0.0 0.0 0.0 R
+0.0 0.0 0.0 0.0 N
+0.0 0.0 0.0 0.0 A
+0.0 0.0 0.0 0.0 T
+0.0 0.0 0.0 0.0 h
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 a
+0.0 0.0 0.0 0.0 t
+0.0 0.0 0.0 0.0 R
+0.0 0.0 0.0 0.0 N
+0.0 0.0 0.0 0.0 A
+0.0 0.0 0.0 0.0 T
+0.0 0.0 0.0 0.0 h
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 a
+0.0 0.0 0.0 0.0 t
+0.0 0.0 0.0 0.0 R
+0.0 0.0 0.0 0.0 N
+0.0 0.0 0.0 0.0 A
+0.0 0.0 0.0 0.0 T
+0.0 0.0 0.0 0.0 h
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 a
+0.0 0.0 0.0 0.0 t
+0.0 0.0 0.0 0.0 R
+0.0 0.0 0.0 0.0 N
+0.0 0.0 0.0 0.0 A
+0.0 0.0 0.0 0.0 T
+0.0 0.0 0.0 0.0 h
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 a
+0.0 0.0 0.0 0.0 t
+0.0 0.0 0.0 0.0 R
+0.0 0.0 0.0 0.0 N
+0.0 0.0 0.0 0.0 A
+0.0 0.0 0.0 0.0 T
+0.0 0.0 0.0 0.0 h
+0.0 0.0 0.0 0.0 i
+0.0 0.0 0.0 0.0 s
+0.0 0.0 0.0 0.0 i
+//
+EOF
+close EFILE;
+
+$output = `$eslssdraw -h`;
+if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly"; }
+if ($output !~ /Usage: esl-ssdraw/) { die "FAIL: help output not right"; }
+
+# We do 2 runs of most tests, with and without --small
+$smallA[0] = "";
+$smallA[1] = "--small ";
+
+# Note: these tests are less rigorous than similar ones for other miniapps because esl-ssdraw
+# creates a postscript file and to test that it was created properly we'd really want to open
+# it in a postscript viewer and look at it. Since we can't do that easily in an automated way,
+# I simply check the postscript file for text that I know should be there.
+
+for($pass = 0; $pass < 2; $pass++) {
+ $pass2write = $pass+1;
+
+ system("$eslssdraw $smallA[$pass] $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(\\\[0.800-1.200\\\)\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\%nucleotide 9\nnewpath\n.+0.00\d* 0.21\d* 1.00\d* 0.00\d* setcmykcolor/s) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] -d $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(\\\[0.800-1.200\\\)\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\%nucleotide 9\nnewpath\n.+0.00\d* 0.21\d* 1.00\d* 0.00\d* setcmykcolor/s) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --prob $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(\\\[0.900-0.950\\\)\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\%nucleotide 18\nnewpath\n.+0.50\d* 0.00\d* 0.00\d* 0.50\d* setcmykcolor/s) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --ifreq $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(\\\[0.500-1.000\\\]\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\%nucleotide 19\nnewpath\n.+0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.00\d* 0.63\d* 1.00\d* 0.00\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --iavglen $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(>= 10\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ if($output !~ /\%nucleotide 19\nnewpath\n.+moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.92\d* 0.84\d* 0.00\d* 0.08\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --dall $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(zero deletions\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\%nucleotide 1\nnewpath\n.+moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.42\d* 0.00\d* 1.00\d* 0.00\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --dint $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(zero internal deletions\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\%nucleotide 1\nnewpath\n.+moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.00\d* 0.00\d* 0.00\d* 0.20\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --mutinfo $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(0 complete basepairs\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\%nucleotide 61\nnewpath\n.+moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.42\d* 0.00\d* 1.00\d* 0.00\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --span $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(no sequences span\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\%nucleotide 2\nnewpath\n.+0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.50\d* 0.00\d* 0.00\d* 0.50\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --span $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(tRNA 71 21\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\(no sequences span\)/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ if($output !~ /\%nucleotide 2\nnewpath\n.+moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.50\d* 0.00\d* 0.00\d* 0.50\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --info --prob --ifreq --dall --dint --mutinfo --span --tabfile $tmppfx.tab $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /setcmykcolor \(g\).+moveto show/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+ $output = `cat $tmppfx.tab`;
+ if($output !~ /Information content data/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /Mutual information data/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /Insert frequency data/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /Delete data/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /Internal delete data/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /Average posterior probability data/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /Span data/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /infocontent 7 1.27\d+ 5 4/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /mutualinfo 16 30 38 0.47\d* 0.47\d* 0.76\d* 5 5/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /insertfreq 45 0.60000 5 6/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /deleteall 67 0.20\d* 4/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /deleteint 67 0.00\d* 4 0/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /avgpostprob 19 0.88\d* 5 4/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+ if($output !~ /span 67 0.80\d* 6/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --rf $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\(\*REFERENCE\* \(\"#=GC RF\"\)\) 212.49 418.24 moveto show/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(a\) 110.00 332.00 moveto show/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ if($pass == 0) {
+ system("$eslssdraw $smallA[$pass] --indi $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ # should include tRNA2, tRNA3, and tRNA5 only
+ if($output !~ /tRNA1/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA2/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA3/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA4/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA5/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\%nucleotide 19\nnewpath\n 108.40 306.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.50\d* 0.00\d* 0.00\d* 0.50\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(A\) 180.00 392.00 moveto show/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\%nucleotide 19\nnewpath\n 108.40 306.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.00\d* 0.21\d* 1.00\d* 0.00\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ }
+
+ system("$eslssdraw $smallA[$pass] --mask-col --mask $tmppfx.mask1 $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\%nucleotide 3\nnewpath\n 166.40 374.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.00\d* 1.00\d* 0.00\d* 0.00\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --mask-diff $tmppfx.mask2 --mask-col --mask $tmppfx.mask1 $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\%nucleotide 3\nnewpath\n 166.40 374.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.00\d* 0.00\d* 0.00\d* 0.20\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --mask-diff $tmppfx.mask2 --mask-col --mask $tmppfx.mask1 $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\%nucleotide 3\nnewpath\n 166.40 374.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.00\d* 0.00\d* 0.00\d* 0.20\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --no-leg $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output =~ /\(LEGEND\) 134.00 216.00 moveto show/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --no-head $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output =~ /\(tRNA 71 21\) 96.98 418.24 moveto show/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --no-foot $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output =~ /\(Created by 'esl-ssdraw'. Copyright \(C\) 2010 Howard Hughes Medical Institute.\) 12.00 12.00 moveto show/) { die "FAIL: postscript diagram drawn incorrectly on pass $pass2write"; }
+
+ # --small is incompatible with --indi:
+ if($pass == 0) {
+ system("$eslssdraw $smallA[$pass] --no-pp --indi $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ # should include tRNA2, tRNA3, and tRNA5 only
+ if($output !~ /tRNA1/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA2/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA3/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA4/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA5/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\%nucleotide 19\nnewpath\n 108.40 306.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.50\d* 0.00\d* 0.00\d* 0.50\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(A\) 180.00 392.00 moveto show/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output =~ /\%nucleotide 19\nnewpath\n 108.40 306.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.92\d* 0.84\d* 0.00\d* 0.08\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(Watson-Crick/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(Positions !=/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --no-bp --indi $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ # should include tRNA2, tRNA3, and tRNA5 only
+ if($output !~ /tRNA1/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA2/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA3/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA4/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA5/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\%nucleotide 19\nnewpath\n 108.40 306.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.50\d* 0.00\d* 0.00\d* 0.50\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(A\) 180.00 392.00 moveto show/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\%nucleotide 19\nnewpath\n 108.40 306.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.92\d* 0.84\d* 0.00\d* 0.08\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output =~ /\(Watson-Crick/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(Positions !=/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --no-ol --indi $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ # should include tRNA2, tRNA3, and tRNA5 only
+ if($output !~ /tRNA1/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA2/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA3/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA4/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA5/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\%nucleotide 19\nnewpath\n 108.40 306.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.50\d* 0.00\d* 0.00\d* 0.50\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(A\) 180.00 392.00 moveto show/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\%nucleotide 19\nnewpath\n 108.40 306.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.92\d* 0.84\d* 0.00\d* 0.08\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(Watson-Crick/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output =~ /\(Positions !=/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ # NOTE: for --no-ntpp we don't actually check that residues are not drawn on PP diagrams
+ system("$eslssdraw $smallA[$pass] --no-ntpp --indi $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ # should include tRNA2, tRNA3, and tRNA5 only
+ if($output !~ /tRNA1/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA2/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA3/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA4/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /tRNA5/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\%nucleotide 19\nnewpath\n 108.40 306.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.50\d* 0.00\d* 0.00\d* 0.50\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(A\) 180.00 392.00 moveto show/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\%nucleotide 19\nnewpath\n 108.40 306.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.92\d* 0.84\d* 0.00\d* 0.08\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(Watson-Crick/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ if($output !~ /\(Positions !=/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+ }
+
+ system("$eslssdraw $smallA[$pass] --no-cnt --info $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output =~ /setcmykcolor (g)\s+168\.\d+\s+392\.\d+\s+moveto show/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --cthresh 0.4 --info $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output =~ /setcmykcolor (G)\s+168\.\d+\s+392\.\d+\s+moveto show/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --cambig --info $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output =~ /setcmykcolor (K)\s+168\.\d+\s+392\.\d+\s+moveto show/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --cambig --cthresh 0.4 --info $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output =~ /setcmykcolor (C)\s+168\.\d+\s+376\.\d+\s+moveto show/) { die "FAIL: tab file incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --mask $tmppfx.mask1 $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\%nucleotide 3\nnewpath\n 171.00 379.00 3.0 0 360 arc closepath\n 0.0\d*0 0.63\d* 1.0\d*0 0.0\d*0 setcmykcolor\n stroke/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --mask-x --mask $tmppfx.mask1 $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /stroke\n 175.00 375.00 moveto -8.0 8.0 rlineto closepath/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --mask-u --mask $tmppfx.mask1 $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\%nucleotide 3\nnewpath\n 168.00 376.00 moveto 0 6.0 rlineto 6.0 0 rlineto 0 -6.0 rlineto closepath\n 0.00\d* 0.63\d* 1.00\d* 0.00\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --mask-a --mask-x --mask $tmppfx.mask1 $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /%nucleotide 3\nnewpath\n 0.00\d* 0.63\d* 1.00\d* 0.00\d* setcmykcolor\n 167.00 375.00 moveto 8.0 8.0 rlineto closepath\n stroke/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --mask-a --mask-u --mask $tmppfx.mask1 $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\%nucleotide 3\nnewpath\n 168.50 376.50 moveto 0 5.0 rlineto 5.0 0 rlineto 0 -5.0 rlineto closepath\n 0.00\d* 0.63\d* 1.00\d* 0.00\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --dfile $tmppfx.dfile $alifile $templatefile $tmppfx.ps > /dev/null");
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /%nucleotide 3\nnewpath\n 166.40 374.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.92\d* 0.84\d* 0.00\d* 0.08\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --mask $tmppfx.mask1 --dfile $tmppfx.dfile $alifile $templatefile $tmppfx.ps > /dev/null");
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /%nucleotide 3\nnewpath\n 171.00 379.00 3.0 0 360 arc closepath\n 0.9200 0.8400 0.00\d* 0.0800 setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --efile $tmppfx.efile $alifile $templatefile $tmppfx.ps > /dev/null");
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\%nucleotide 3\nnewpath\n 166.40 374.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.03 0.17 0.20 0.14 setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+
+ system("$eslssdraw $smallA[$pass] --ifreq --ifile $tmppfx.ifile $alifile $templatefile $tmppfx.ps > /dev/null");
+ if ($? != 0) { die "FAIL: esl-ssdraw failed unexpectedly on pass $pass2write";}
+ $output = `cat $tmppfx.ps`;
+ if($output !~ /\%nucleotide 45\nnewpath\n 198.40 312.40 moveto 0 8 rlineto 8 0 rlineto 0 -8 rlineto closepath\n 0.00\d* 0.94\d* 1.00\d* 0.00\d* setcmykcolor/) { die "FAIL: postscript diagram drawn incorrectly written on pass $pass2write"; }
+}
+
+print "ok\n";
+
+unlink "$tmppfx.mask1";
+unlink "$tmppfx.mask2";
+unlink "$tmppfx.ifile";
+unlink "$tmppfx.dfile";
+unlink "$tmppfx.efile";
+unlink "$tmppfx.ps";
+unlink "$tmppfx.tab";
+unlink "$tmppfx.stk";
+
+
+exit 0;
diff --git a/miniapps/esl-ssdraw.man b/miniapps/esl-ssdraw.man
new file mode 100644
index 0000000..a11cf10
--- /dev/null
+++ b/miniapps/esl-ssdraw.man
@@ -0,0 +1,830 @@
+.TH "esl-ssdraw" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-ssdraw - create postscript secondary structure diagrams
+
+.SH SYNOPSIS
+
+.B esl-ssdraw
+.I [options]
+.I msafile
+.I postscript_template
+.I postscript_output_file
+
+.SH DESCRIPTION
+
+.pp
+.B esl-ssdraw
+reads an existing template consensus secondary structure diagram from
+.I postscript_template
+and creates new postscript diagrams including the template structure
+but with positions colored differently based on alignment statistics
+such as frequency of gaps per position, average posterior probability
+per position or information content per position. Additionally, all
+or some of the aligned sequences can be drawn separately, with
+nucleotides or posterior probabilities mapped onto the corresponding
+positions of the consensus structure.
+
+The alignment must be in Stockholm format with per-column reference
+annotation (#=GC RF). The sequences in the alignment must be RNA or
+DNA sequences. The
+.B postscript_template
+file must contain one page that includes <rflen> consensus nucleotides
+(positions), where <rflen> is the number of nongap characters in the
+reference (RF) annotation of the first alignment in
+.B msafile.
+The specific format required in the
+.B postscript_template
+is described below in the INPUT section.
+Postscript diagrams will only be created for the first alignment in
+.B msafile.
+
+.SH OUTPUT
+
+By default (if run with zero command line options),
+.B esl-ssdraw
+will create a six or seven page
+.I postscript_output_file,
+with each page displaying a different alignment statistic. These pages display
+the alignment consensus sequence, information content per position,
+mutual information per position, frequency of inserts per position,
+average length of inserts per position, frequency of
+deletions (gaps) per position, and average posterior probability per
+position (if posterior probabilites exist in the alignment)
+If
+.B -d
+is enabled, all of these pages plus additional ones, such as
+individual sequences (see discussion of
+.B.--indi
+below) will be drawn.
+These pages can be selected to be drawn individually by using
+the command line options
+.B --cons,
+.B --info,
+.B --mutinfo,
+.B --ifreq,
+.B --iavglen,
+.B --dall,
+and
+.B --prob.
+The calculation of the statistics for each of these options is
+discussed below in the description for each option.
+Importantly, only so-called 'consensus' positions of the alignment
+will be drawn. A consensus position is one that is a nongap nucleotide in
+the 'reference' annotation of the Stockholm alignment (#=GC RF) read
+from
+.B msafile.
+
+By default, a consensus sequence for the input alignment will be
+calculated and displayed on the alignment statistic diagrams. The
+consensus sequence is defined as the most common nucleotide at each
+consensus position of the alignment. The consensus sequence will not
+be displayed if the
+.B --no-cnt
+option is used. The
+.B --cthresh,
+.B --cambig,
+and
+.B --athresh
+options affect the definition of the consensus sequence as
+explained below in the descriptions for those options.
+
+If the
+.BI --tabfile " <f>"
+option is used, a tab-delimited text file
+.I <f>
+will be created that includes per-position lists of the numerical
+values for each of the calculated statistics that were drawn to
+.B postscript_output_file.
+Comment lines in
+.I <f>
+are prefixed with a '#' character and explain the meaning of
+each of the tab-delimited columns and how each of the statistics was
+calculated.
+
+If
+.B --indi
+is used,
+.B esl-ssdraw
+will create diagrams showing each sequence in the alignment on a
+separate page, with aligned nucleotides in their corresponding
+position in the structure diagram. By default, basepaired nucleotides
+will be colored based on their basepair type: either Watson-Crick
+(A:U, U:A, C:G, or G:C), G:U or U:G, or non-canonical (the other ten
+possible basepairs). This coloring can be turned off with the
+.B --no-bp
+option.
+Also by default, nucleotides that differ from the most common
+nucleotide at each aligned consensus position will be outlined. If
+the most common nucleotide occurs in more than 75% of sequences that
+do not have a gap at that position, the outline will be
+bold. Outlining can be turned off with the
+.B --no-ol
+option.
+
+.PP
+With
+.B --indi,
+if the alignment
+contains posterior probability annotation (#=GR PP), the
+.B postscript_output_file
+will contain an additional page for each sequence drawn with positions
+colored by the posterior probability of each aligned nucleotide.
+No posterior probability pages will be drawn if the
+.B --no-pp
+option is used.
+
+.B esl-ssdraw
+can also be used to draw 'mask' diagrams which color positions of the
+structure one of two colors depending on if they are included or
+excluded by a mask. This is enabled with the
+.BI --mask-col " <f>"
+option.
+.I <f>
+must contain a single line of <rflen> characters, where <rflen> is the
+the number of nongap RF characters in the alignment. The line must
+contain only '0' and '1' characters. A '0' at position <x> of the
+string indicates position <x> is excluded from the mask, and a '1'
+indicates position <x> is included by the mask.
+A page comparing the overlap of the
+.I <f>
+mask from
+.BI --mask-col
+and another mask in
+.I <f2>
+will be created if the
+.BI --mask-diff " <f2>"
+option is used.
+
+If the
+.BI --mask " <f>"
+option is used, positions excluded by the mask in
+.I <f>
+will be drawn differently (as open circles by default) than positions
+included by the mask. The style of the masked positions can be
+modified with the
+.B --mask-u,
+.B --mask-x,
+and
+.B --mask-a options.
+
+Finally, two different types of input files can be used to customize
+output diagrams using the
+.B --dfile
+and
+.B --efile
+options, as described below.
+
+.SH INPUT
+
+The
+.B postscript_template_file
+is a postscript file that must be in a very specific format in order for
+.B esl-ssdraw
+to work. The specifics of the format, described below, are likely to change in future
+versions of
+.B esl-ssdraw.
+The
+.B postscript_output_file
+files generated by
+.B esl-ssdraw
+will not be valid
+.B postscript_template_file
+format (i.e. an output file from
+.B esl-ssdraw
+cannot be used as an
+.B postscript_template_file
+in a subsequent run of the program).
+
+An example
+.B postscript_template_file
+('trna-ssdraw.ps') is included with the Easel distribution in
+the 'testsuite/' subdirectory of the top-level 'easel' directory.
+
+The
+.B postscript_template_file
+is a valid postscript file. It includes postscript commands for
+drawing a secondary structure. The commands specify x and y
+coordinates for placing each nucleotide on the page. The
+.B postscript_template_file
+might also contain commands for drawing lines connecting basepaired
+positions and tick marks indicating every tenth position, though these
+are not required, as explained below.
+
+If you are unfamiliar with the postscript language, it may be useful
+for you to know that a postscript page is, by default, 612 points wide
+and 792 points tall.
+The (0,0) coordinate of a postscript
+file is at the bottom left corner of the page, (0,792) is the top left,
+(612,0) is the bottom right, and (612,792) is the top right.
+.B esl-ssdraw
+uses 8 point by 8 point cells for drawing positions of the consensus
+secondary structure. The 'scale' section of the
+.B postscript_template_file
+allows for different 'zoom levels', as described below.
+Also, it is important to know that postscript lines beginning with '%'
+are considered comments and do not include postscript commands.
+
+An
+.B esl-ssdraw
+.B postscript_template_file
+contains n >= 1 pages, each specifying a consensus secondary structure
+diagram. Each page is delimited by a 'showpage' line in an 'ignore'
+section (as described below).
+.B esl-ssdraw
+will read all pages of the
+.B postscript_template_file
+and then choose the appropriate one that corresponds with the
+alignment in
+.B msafile
+based on the consensus (nongap RF) length of the alignment.
+For an alignment of consensus length <rflen>, the first
+page of
+.B postscript_template_file
+that has a structure diagram with consensus length <rflen> will be used
+as the template structure for the alignment.
+
+Each page of
+.B postscript_template_file
+contains blocks of text organized into seven different possible
+sections. Each section must begin with a single line '% begin
+<sectionname>' and end with a single line '% end <sectionname>' and
+have n >= 1 lines in between. On the begin and end lines, there must
+be at least one space between the '%' and the 'begin'
+or 'end'. <sectionname> must be one of the
+following: 'modelname', 'legend', 'scale', 'regurgitate', 'ignore', 'text
+positiontext', 'text nucleotides', 'lines positionticks', or 'lines
+bpconnects'. The n >=1 lines in between the begin and end lines of
+each section must be in a specific format that differs for each
+section as described below.
+
+Importantly, each page must end with an 'ignore' section that includes
+a single line 'showpage' between the begin and end lines. This
+lets
+.B esl-ssdraw
+know that a page has ended and another might follow.
+
+Each page of a
+.B postscript_template_file
+must include a single 'modelname' section.
+This section must include exactly one line in between its
+begin and end lines. This line must begin with a '%' character
+followed by a single space. The remainder of the line will be parsed
+as the model name and will appear on each page of
+.B postscript_output_file
+in the header section. If the name is more than 16 characters, it will
+be truncated in the output.
+
+Each page of a
+.B postscript_template_file
+must include a single 'legend' section. This section must include
+exactly one line in between its begin and end lines. This line must be
+formatted as '% <d1> <f1> <f2> <d2> <f3>', where <d1> is an integer
+specifying the consensus position with relation to which the legend
+will be placed; <f1> and <f2> specify the x and y axis offsets for the
+top left corner of the legend relative to the x and y position of
+consensus position <d1>; <d2> specifies the size of a cell in the
+legend and <f3> specifies how many extra points should be between the
+right hand edge of the legend and the end of the page. the offset of
+the right hand end of the legend . For example, the line '% 34
+-40. -30. 12 0.' specfies that the legend be placed 40 points to the left
+and 30 points below the 34th consensus position, that cells
+appearing in the legend be squares of size 12 points by 12 points, and
+that the right hand side of the legend flush against the right hand
+edge of the printable page.
+
+Each page of a
+.B postscript_template_file
+must include a single 'scale' section. This section must include
+exactly one line in between its begin and end lines. This line must be
+formatted as '<f1> <f2> scale', where <f1> and <f2> are both positive
+real numbers that are identical, for example '1.7 1.7 scale' is valid,
+but '1.7 2.7 scale' is not. This line is a valid postscript command
+which specifies the scale or zoom level on the pages in the output. If
+<f1> and <f2> are '1.0' the default scale is used for which the total
+size of the page is 612 points wide and 792 points tall. A scale of
+2.0 will reduce this to 306 points wide by 396 points tall. A scale of
+0.5 will increase it to 1224 points wide by 1584 points tall. A single
+cell corresponding to one position of the secondary structure is 8
+points by 8 points. For larger RNAs, a scale of less than 1.0 is
+appropriate (for example, SSU rRNA models (about 1500 nt) use a scale
+of about 0.6), and for smaller RNAs, a scale of more than 1.0 might be
+desirable (tRNA (about 70 nt) uses a scale of 1.7). The best way to
+determine the exact scale to use is trial and error.
+
+Each page of a
+.B postscript_template_file
+can include n >= 0 'regurgitate' sections.
+These sections can include any number of lines.
+The text in this section will not be parsed by
+.B esl-ssdraw
+but will be included in each page of
+.B postscript_output_file.
+The format of the lines in this section must therefore be valid
+postscript commands. An example of content that might be in a
+regurgitate section are commands to draw lines and text annotating the
+anticodon on a tRNA secondary structure diagram.
+
+Each page of a
+.B postscript_template_file
+must include at least 1 'ignore' section.
+One of these sections must include a single line that
+reads 'showpage'. This section should be placed at the end of each
+page of the template file.
+Other ignore sections can include any number of lines.
+The text in these section will not be parsed by
+.B esl-ssdraw
+nor will it be included in each page of
+.B postscript_output_file.
+An ignore section can contain comments or postscript commands that
+draw features of the
+.B postscript_template_file
+that are
+unwanted in the
+.B postscript_output_file.
+
+Each page of a
+.B postscript_template_file
+must include a single 'text nucleotides' section. This section must
+include exactly <rflen> lines, indicating that the consensus secondary
+structure has exactly <rflen> nucleotide positions. Each line must be of
+the format '(<c>) <x> <y> moveto show' where <c> is a nucleotide (this
+can be any character actually), and <x> and <y> are the coordinates
+specifying the location of the nucleotide on the page, they should be
+positive real numbers. The best way to determine what these
+coordinates should be is manually by trial and error, by inspecting
+the resulting structure as you add each nucleotide. Note that
+.B esl-ssdraw
+will color an 8 point by 8 point cell for each position, so nucleotides
+should be placed about 8 points apart from each other.
+
+Each page of a
+.B postscript_template_file
+may or may not include a single 'text positiontext' section. This section
+can include n >= 1 lines, each specifying text to be placed next to
+specific positions of the structure, for example, to number them.
+Each line must be of
+the format '(<s>) <x> <y> moveto show' where <s> is a string of text
+to place at coordinates (<x>,<y>) of the postscript page.
+Currently, the best way to determine what these coordinates is
+manually by trial
+and error, by inspecting the resulting diagram as you add
+each line.
+
+Each page of a
+.B postscript_template_file
+may or may not include a single 'lines positionticks' section. This section
+can include n >= 1 lines, each specifying the location of a tick mark
+on the diagram. Each line must be of
+the format '<x1> <y1> <x2> <y2> moveto show'. A tick mark (line of
+width 2.0) will be drawn from point (<x1>,<y1>) to point (<x2>,<y2>)
+on each page of
+.B postscript_output_file.
+Currently, the best way to determine what these coordinates should be
+is manually by trial and error, by inspecting the resulting diagram as
+you add each line.
+
+Each page of a
+.B postscript_template_file
+may or may not include a single 'lines bpconnects' section. This section
+must include <nbp> lines, where <nbp> is the number of basepairs in
+the consensus structure of the input
+.B msafile
+annotated as #=GC SS_cons. Each line should connect two basepaired
+positions in the consensus structure diagram.
+Each line must be of
+the format '<x1> <y1> <x2> <y2> moveto show'. A line
+will be drawn from point (<x1>,<y1>) to point (<x2>,<y2>)
+on each page of
+.B postscript_output_file.
+Currently, the best way to determine what these coordinates should be
+is manually by trial and error, by inspecting the resulting diagram as
+you add each line.
+
+.SH REQUIRED MEMORY
+
+The memory required by
+.B esl-ssdraw
+will be equal to roughly the larger of 2 Mb and
+the size of the first alignment in
+.B msafile.
+If the
+.B --small
+option is used, the memory required will be independent of the
+alignment size. To use
+.B --small
+the alignment must be in Pfam format, a non-interleaved (1 line/seq)
+version of Stockholm format.
+
+If the
+.B --indi
+option is used,
+the required memory may exceed the
+size of the alignment by up to ten-fold, and the output
+.B postscript_output_file
+may be up to 50 times larger than the
+.B msafile.
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.B -d
+Draw the default set of alignment summary diagrams: consensus
+sequence, information content, mutual information, insert frequency,
+average insert length, deletion frequency, and average posterior
+probability (if posterior probability annotation exists in the
+alignment). These diagrams are also drawn by default (if zero command line
+options are used), but using the
+.B -d
+option allows the user to add additional pages, such as individual
+aligned sequences with
+.B --indi.
+
+.TP
+.BI --mask " <f>"
+Read the mask from file
+.I <f>,
+and draw positions differently in
+.B postscript_output_file
+depending on whether they are included or excluded by the mask.
+.I <f>
+must contain a single line of length <rflen> with only '0' and '1'
+characters. <rflen> is the number of nongap characters in the
+reference (#=GC RF) annotation of the first alignment in
+.B msafile
+A '0' at position <x> of the mask indicates position <x> is excluded
+by the mask, and a '1' indicates that position <x> is included by the mask.
+
+.TP
+.B --small
+Operate in memory saving mode. Without
+.B --indi,
+required RAM will be independent of the
+size of the alignment in
+.B msafile.
+With
+.B --indi,
+the required RAM will be roughly ten times the size of the alignment
+in
+.B msafile.
+For
+.B --small
+to work, the alignment must be in
+Pfam Stockholm (non-interleaved 1 line/seq) format.
+
+.TP
+.B --rf
+Add a page to
+.B postscript_output_file
+showing the reference sequence from the #=GC RF annotation in
+.B msafile.
+By default, basepaired nucleotides will be colored based on what type of
+basepair they are. To turn this off, use
+.B --no-bp.
+This page is drawn by default (if zero command-line options are used).
+
+.TP
+.B --info
+Add a page to
+.B postscript_output_file
+with consensus (nongap RF) positions colored based on their
+information content from the alignment.
+Information content is calculated as 2.0 - H, where H = sum_x p_x
+log_2 p_x for x in {A,C,G,U}.
+This page is drawn by default (if zero command-line options are used).
+
+.TP
+.B --mutinfo
+Add a page to
+.B postscript_output_file
+with basepaired consensus (nongap RF) positions colored based on the
+amount of mutual information they have in the alignment. Mutual
+information is sum_{x,y} p_{x,y} log_2 ((p_x * p_y) / p_{x,y}, where x
+and y are the four possible bases A,C,G,U. p_x is the fractions of
+aligned sequences that have nucleotide x of in the left half (5' half) of
+the basepair. p_y is the fraction of aligned sequences that have
+nucleotide y in the position corresponding to the right half (3' half) of
+the basepair. And p_{x,y} is the fraction of aligned sequences that
+have basepair x:y. For all p_x, p_y and p{x,y} only sequences that
+that have a nongap nucleotide at both the left and right half of the
+basepair are counted.
+This page is drawn by default (if zero command-line options are used).
+
+.TP
+.B --ifreq
+Add a page to
+.B postscript_output_file
+with each consensus (nongap RF) position colored based on the fraction of
+sequences that span each position that have at least 1 inserted
+nucleotide after the position.
+A sequence s spans consensus position x that is actual alignment
+position a if s has at least one nongap nucleotide aligned to a position
+b <= a and at least one nongap nucleotide aligned to a consensus position
+c >= a. This page is drawn by default (if zero command-line options
+are used).
+
+.TP
+.B --iavglen
+Add a page to
+.B postscript_output_file
+with each consensus (nongap RF) position colored based on average
+length of insertions that occur after it. The average is calculated as
+the total number of inserted nucleotides after position x, divided by the
+number of sequences that have at least 1 inserted nucleotide after
+position x (so the minimum possible average insert length is 1.0).
+
+.TP
+.B --dall
+Add a page to
+.B postscript_output_file
+with each consensus (nongap RF) position colored based on the fraction of
+sequences that have a gap (delete) at the position.
+This page is drawn by default (if zero command-line options are used).
+
+.TP
+.B --dint
+Add a page to
+.B postscript_output_file
+with each consensus (nongap RF) position colored based on the fraction of
+sequences that have an internal gap (delete) at the position. An
+internal gap in a sequence is one that occurs after (5' of) the
+sequence's first aligned nucleotide and after
+(3' of) the sequence's final aligned nucleotide.
+This page is drawn by default (if zero command-line options are used).
+
+.TP
+.B --prob
+Add a page to
+.B postscript_output_file
+with positions colored based on average posterior probability (PP). The alignment
+must contain #=GR PP annotation for all sequences. PP annotation is
+converted to numerical PP values as follows: '*' = 0.975, '9' =
+0.90, '8' = 0.80, '7' = 0.70, '6' = 0.60, '5' = 0.50, '4' = 0.40, '3'
+= 0.30, '2' = 0.20, '1' = 0.10, '0' = 0.025.
+This page is drawn by default (if zero command-line options are used).
+
+.TP
+.B --span
+Add a page to
+.B postscript_output_file
+with consensus (nongap RF) positions colored based on the
+fraction of sequences that 'span' the position.
+A sequence s spans consensus position x that is actual alignment
+position a if s has at least one nongap nucleotide aligned to a position
+b <= a and at least one nongap nucleotide aligned to a consensus position
+c >= a. This page is drawn by default (if zero command-line options
+are used).
+
+.SH OPTIONS FOR DRAWING INDIVIDUAL ALIGNED SEQUENCES
+
+.TP
+.B --indi
+Add a page displaying the aligned nucleotides in their corresponding
+consensus positions of the structure diagram for each aligned
+sequence in the alignment.
+By default, basepaired nucleotides will be colored based on what type of
+basepair they are. To turn this off, use
+.B --no-bp.
+If posterior probability information (#=GR
+PP) exists in the alignment, one additional page per sequence will be
+drawn displaying the posterior probabilities.
+
+.TP
+.B -f
+With
+.B --indi,
+force
+.B esl-ssdraw
+to create a diagram, even if it is predicted to be large (> 100 Mb).
+By default, if the predicted size exceeds 100 Mb,
+.B esl-ssdraw
+will fail with a warning.
+
+.SH OPTIONS FOR OMITTING PARTS OF THE DIAGRAMS
+
+.TP
+.BI --no-leg
+Omit the legend on all pages of
+.B postscript_output_file.
+
+.TP
+.BI --no-head
+Omit the header on all pages of
+.B postscript_output_file.
+
+.TP
+.BI --no-foot
+Omit the footer on all pages of
+.B postscript_output_file.
+
+.SH OPTIONS FOR SIMPLE TWO-COLOR MASK DIAGRAMS
+
+.TP
+.B --mask-col
+With
+.B --mask,
+.B postscript_output_file
+will contain exactly 1 page showing positions included by the mask as
+black squares, and positions excluded as pink squares.
+
+.TP
+.BI --mask-diff " <f>"
+With
+.BI --mask " <f2>"
+and
+.B mask-col,
+.B postscript_output_file
+will contain one additional page comparing the mask from
+.I <f>
+and the mask from
+.I <f2>.
+Positions will be colored based on whether they are included by one
+mask and not the other, excluded by both masks, and included by both
+masks.
+
+.SH EXPERT OPTIONS FOR CONTROLLING INDIVIDUAL SEQUENCE DIAGRAMS
+
+.TP
+.B --no-pp
+When used in combination with
+.B --indi,
+do not draw posterior probability structure diagrams for each
+sequence, even if the alignment has PP annotation.
+
+.TP
+.B --no-bp
+Do not color basepaired nucleotides based on their basepair type.
+
+.TP
+.B --no-ol
+When used in combination with
+.B --indi,
+do not outline nucleotides that differ from the majority rule
+consensus nucleotide given the alignment.
+
+.TP
+.B --no-ntpp
+When used in combination with
+.B --indi,
+do not draw nucleotides on the individual sequence posterior
+probability diagrams.
+
+.SH EXPERT OPTIONS RELATED TO CONSENSUS SEQUENCE DEFINITION
+
+.TP
+.B --no-cnt
+Do not draw consensus nucleotides on alignment statistic diagrams (such as
+information content diagrams). By default, the consensus nucleotide is
+defined as the most frequent nucleotide in the alignment at the
+corresponding position. Consensus nucleotides that occur in at least
+.I <x>
+fraction of the aligned sequences (that do not contain a gap at the
+position) are capitalized. By default
+.I <x>
+is 0.75, but can be changed with the
+.BI --cthresh " <x>"
+option.
+
+.TP
+.BI --cthresh " <x>"
+Specify the threshold for capitalizing consensus nucleotides defined by
+the majority rule (i.e. when
+.B --cambig
+is not enabled) as
+.I <x>.
+
+.TP
+.B --cambig
+Change how consensus nucleotides are calculated from majority rule to
+the least ambiguous IUPAC nucleotide that represents at least
+.I <x>
+fraction of the nongap nucleotides at each consensus position.
+By default
+.I <x>
+is 0.9, but can be changed with the
+.BI --athresh " <x>"
+option.
+
+.TP
+.BI --athresh " <x>"
+With
+.B --cambig,
+specify the threshold for defining consensus nucleotides
+is the least ambiguous IUPAC nucleotide that represents at least
+.I <x>
+fraction of the nongap nucleotides at each position.
+
+.SH EXPERT OPTIONS CONTROLLING STYLE OF MASKING POSITIONS
+
+.TP
+.B --mask-u
+With
+.B --mask,
+change the style of masked columns to squares.
+
+.TP
+.B --mask-x
+With
+.B --mask,
+change the style of masked columns to 'x's
+
+.TP
+.B --mask-a
+With
+.B --mask
+and
+.B --mask-u
+or
+.B --mask-x
+draw the alternative style of square or 'x' masks
+
+.SH EXPERT OPTIONS RELATED TO INPUT FILES
+
+.TP
+.BI --dfile " <f>"
+Read the 'draw file'
+.I <f>
+which specifies numerical values for each consensus position in one or
+more postscript pages. For each page, the draw file must include
+<rflen>+3 lines (<rflen> is defined in the DESCRIPTION section). The first three lines are special. The following
+<rflen> 'value lines' each must contain a single number, the numerical
+value for the corresponding position. The first of the three special
+lines defines the 'description' for the page. This should be text that
+describes what the numerical values refer to for the page. The maximum
+allowable length is roughly 50 characters (the exact maximum
+length depends on the template file and the program will report an
+informative error message upon execution if it is exceeded). The
+second special line defines the 'legend header' line that which will
+appear immediately above the legend. It has a maximum allowable length
+of about 30 characters. The third special line per page must contain
+exactly 7 numbers, which must be in increasing order, each separated
+by a space.
+These numbers
+define the numerical ranges for the six different colors used to draw
+the consensus positions on the page.
+The first number defines the minimum value for the first color
+(blue) and must be less than or equal to the minimum
+value from the value lines. The second number defines the minimum
+value for the second color (turquoise). The third, fourth, fifth and
+sixth numbers define the minimum values for the third, fourth, fifth
+and sixth colors (light green, yellow, orange, red), and the seventh
+final number defines the maximum value for red and must be equal to
+or greater than the maximum value from the value lines.
+After the <rflen> value lines, there must exist a special line with
+only '//', signifying the end of a page.
+The draw file
+.I <f>
+must end with this special '//' line, even if it only includes a
+single page. A draw file specifying <n> pages should include exactly
+<n> * (<rflen> + 4) lines.
+
+.TP
+.BI --efile " <f>"
+Read the 'expert draw file'
+.I <f>
+which specifies the colors and nucleotides to draw on each consensus
+position in one or more postscript pages. Unlike with the
+.B --dfile
+option, no legend will be drawn when
+.B --efile
+is used.
+For each page, the draw file must include <rflen> lines, each with four
+or five tab-delimited tokens. The first four tokens on line <x>
+specify the color to paint position <x> and must be real numbers
+between 0 and 1. The four numbers specify the cyan, magenta, yellow
+and black values, respectively, in the CMYK color scheme for the
+postscript file. The fifth token on line <x> specifies which nucleotide
+to write on position <x> (on top of the colored background). If the
+fifth token does not exist, no nucleotide will be written.
+After the <rflen> lines, there must exist a special line with
+only '//', signifying the end of a page.
+The expert draw file
+.I <f>
+must end with this special '//' line, even if it only includes a
+single page. A expert draw file specifying <n> pages should include exactly
+<n> * (<rflen> + 1) lines.
+
+.TP
+.BI --ifile " <f>"
+Read insert information from the file
+.I <f>,
+which may have been created with INFERNAL's
+.B cmalign
+program. The insert information in
+.B msafile
+will be ignored and the information from
+.I <f>
+will supersede it. Inserts are columns that are gaps in the reference
+(#=GC RF) annotation.
+
+.SH AUTHOR
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
diff --git a/miniapps/esl-translate.c b/miniapps/esl-translate.c
new file mode 100644
index 0000000..b1b3e74
--- /dev/null
+++ b/miniapps/esl-translate.c
@@ -0,0 +1,215 @@
+/* Translate DNA sequence into six frames, into individual ORFs.
+ *
+ */
+#include "esl_config.h"
+
+#include "easel.h"
+#include "esl_alphabet.h"
+#include "esl_gencode.h"
+#include "esl_getopts.h"
+
+
+/*****************************************************************
+ * 1. Main loop for reading complete sequences with ReadSeq()
+ *****************************************************************/
+
+static int
+do_by_sequences(ESL_GENCODE *gcode, ESL_GENCODE_WORKSTATE *wrk, ESL_SQFILE *sqfp)
+{
+ ESL_SQ *sq = esl_sq_CreateDigital(gcode->nt_abc);
+ int status;
+
+ while (( status = esl_sqio_Read(sqfp, sq )) == eslOK)
+ {
+ if (sq->n < 3) continue;
+
+ if (wrk->do_watson) {
+ esl_gencode_ProcessStart(gcode, wrk, sq);
+ esl_gencode_ProcessPiece(gcode, wrk, sq);
+ esl_gencode_ProcessEnd(wrk, sq);
+ }
+
+ if (wrk->do_crick) {
+ esl_sq_ReverseComplement(sq);
+ esl_gencode_ProcessStart(gcode, wrk, sq);
+ esl_gencode_ProcessPiece(gcode, wrk, sq);
+ esl_gencode_ProcessEnd(wrk, sq);
+ }
+
+ esl_sq_Reuse(sq);
+ }
+ if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s)\n%s\n",
+ sqfp->filename, sqfp->get_error(sqfp));
+ else if (status != eslEOF) esl_fatal("Unexpected error %d reading sequence file %s",
+ status, sqfp->filename);
+
+ esl_sq_Destroy(sq);
+ return eslOK;
+}
+
+
+static int
+do_by_windows(ESL_GENCODE *gcode, ESL_GENCODE_WORKSTATE *wrk, ESL_SQFILE *sqfp)
+{
+ ESL_SQ *sq = esl_sq_CreateDigital(gcode->nt_abc);
+ int windowsize = 4092; // can be any value, but a multiple of 3 makes most sense. windowsize can be +/-; + means reading top strand; - means bottom strand.
+ int contextsize = 2; // contextsize (adjacent window overlap) must be 2, or translation won't work properly.
+ int wstatus;
+
+ ESL_DASSERT1(( windowsize % 3 == 0 ));
+
+ while (( wstatus = esl_sqio_ReadWindow(sqfp, contextsize, windowsize, sq)) != eslEOF)
+ {
+ if (wstatus == eslEOD)
+ {
+ if ( (windowsize > 0 && wrk->do_watson) || (windowsize < 0 && wrk->do_crick))
+ esl_gencode_ProcessEnd(wrk, sq);
+
+ if (windowsize > 0 && ! wrk->do_crick) { esl_sq_Reuse(sq); continue; } // Don't switch to revcomp if we don't need do. Allows -W --watson to work on nonrewindable streams
+ if (windowsize < 0) esl_sq_Reuse(sq); // Do not Reuse the sq on the switch from watson to crick; ReadWindow needs sq->L
+ windowsize = -windowsize; // switch to other strand.
+ continue;
+ }
+ else if (wstatus == eslEFORMAT) esl_fatal("Parsing failed in sequence file %s:\n%s", sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (wstatus == eslEINVAL) esl_fatal("Invalid residue(s) found in sequence file %s\n%s", sqfp->filename, esl_sqfile_GetErrorBuf(sqfp));
+ else if (wstatus != eslOK) esl_fatal("Unexpected error %d reading sequence file %s", wstatus, sqfp->filename);
+
+ /* If we're the first window in this input DNA sequence
+ * (or the first window in its revcomp), then initialize.
+ * sq->C is the actual context overlap; 0=1st window; 2 (i.e. C)= subsequent.
+ */
+ if (sq->C == 0)
+ {
+ if (sq->n < 3) continue; // DNA sequence too short; skip it, don't even bother to revcomp, go to next sequence.
+ if ( (windowsize > 0 && wrk->do_watson) || (windowsize < 0 && wrk->do_crick))
+ esl_gencode_ProcessStart(gcode, wrk, sq);
+ }
+
+ if ( (windowsize > 0 && wrk->do_watson) || (windowsize < 0 && wrk->do_crick))
+ esl_gencode_ProcessPiece(gcode, wrk, sq);
+ }
+ esl_sq_Destroy(sq);
+ return eslOK;
+}
+
+
+/*****************************************************************
+ * x. main() for the esl-translate program
+ *****************************************************************/
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "show brief help on version and usage", 0 },
+ { "-c", eslARG_INT, "1", NULL, NULL, NULL, NULL, NULL, "use alt genetic code of NCBI transl table <n>", 0 },
+ { "-l", eslARG_INT, "20", NULL, NULL, NULL, NULL, NULL, "minimum ORF length", 0 },
+ { "-m", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-M", "ORFs must initiate with AUG only", 0 },
+ { "-M", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, "-m", "ORFs must start with allowed initiation codon", 0 },
+ { "-W", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "use windowed, memory-efficient seq reading", 0 },
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL, NULL, NULL, "specify that input file is in format <s>", 0 },
+ { "--watson", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "only translate top strand", 0 },
+ { "--crick", eslARG_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, "only translate bottom strand", 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <seqfile>";
+static char banner[] = "six-frame translation of nucleic acid seq to ORFs";
+
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL;
+ ESL_ALPHABET *nt_abc = esl_alphabet_Create(eslDNA);
+ ESL_ALPHABET *aa_abc = esl_alphabet_Create(eslAMINO);
+ ESL_GENCODE *gcode = NULL;
+ ESL_GENCODE_WORKSTATE *wrk = NULL;
+ char *seqfile = NULL;
+ int informat = eslSQFILE_UNKNOWN;
+ ESL_SQFILE *sqfp = NULL;
+ int status;
+
+ /*****************************************************************
+ * command line parsing
+ *****************************************************************/
+
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK ||
+ esl_opt_VerifyConfig(go) != eslOK)
+ {
+ printf("Failed to parse command line: %s\n", go->errbuf);
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ if (esl_opt_GetBoolean(go, "-h") )
+ {
+ esl_banner(stdout, argv[0], banner);
+ esl_usage (stdout, argv[0], usage);
+ puts("\n where options are:");
+ esl_opt_DisplayHelp(stdout, go, /*docgroup=*/0, /*indent=*/2, /*textwidth=*/80);
+
+ puts("\nAvailable NCBI genetic code tables (for -c <id>):");
+ esl_gencode_DumpAltCodeTable(stdout);
+
+ exit(0);
+ }
+
+ if (esl_opt_ArgNumber(go) != 1)
+ {
+ printf("Incorrect number of command line arguments.\n");
+ esl_usage(stdout, argv[0], usage);
+ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]);
+ exit(1);
+ }
+
+ seqfile = esl_opt_GetArg(go, 1);
+
+ if (esl_opt_IsOn(go, "--informat") &&
+ (informat = esl_sqio_EncodeFormat(esl_opt_GetString(go, "--informat"))) == eslMSAFILE_UNKNOWN)
+ esl_fatal("%s is not a valid input sequence file format for --informat", esl_opt_GetString(go, "--informat"));
+
+ status = esl_sqfile_OpenDigital(nt_abc, seqfile, informat, /*env=*/NULL, &sqfp);
+ if (status == eslENOTFOUND) esl_fatal("Failed to find (or open) sequence file %s", seqfile);
+ else if (status == eslEFORMAT) esl_fatal("Failed to recognize format of sequence file %s", seqfile);
+ else if (status != eslOK) esl_fatal("Failure in opening sequence file %s; code %d", seqfile, status);
+
+ /* A limitation. The esl_sqio_ReadWindow() interface needs to use SSI positioning
+ * to read reverse complement, and that doesn't work on nonrewindable streams.
+ */
+ if ( esl_opt_GetBoolean(go, "-W") && ! esl_sqfile_IsRewindable(sqfp) && ! esl_opt_GetBoolean(go, "--watson"))
+ esl_fatal("esl-translate can't read reverse complement from a nonrewindable stream (stdin pipe, .gz file, etc).");
+
+ /* Set up the genetic code. Default = NCBI 1, the standard code; allow ORFs to start at any aa
+ */
+ gcode = esl_gencode_Create(nt_abc, aa_abc);
+ esl_gencode_Set(gcode, esl_opt_GetInteger(go, "-c")); // default = 1, the standard genetic code
+
+ if (esl_opt_GetBoolean(go, "-m")) esl_gencode_SetInitiatorOnlyAUG(gcode);
+ else if (! esl_opt_GetBoolean(go, "-M")) esl_gencode_SetInitiatorAny(gcode); // note this is the default, if neither -m or -M are set
+
+
+ /* Set up the workstate structure, which contains both stateful
+ * info about our position in <sqfp> and the DNA <sq>, as well as
+ * one-time config info from options
+ */
+ wrk = esl_gencode_WorkstateCreate(go, gcode);
+
+
+ /* The two styles of main processing loop:
+ */
+ if (esl_opt_GetBoolean(go, "-W")) do_by_windows(gcode, wrk, sqfp);
+ else do_by_sequences(gcode, wrk, sqfp);
+
+
+ esl_gencode_WorkstateDestroy(wrk);
+ esl_sqfile_Close(sqfp);
+ esl_gencode_Destroy(gcode);
+ esl_alphabet_Destroy(aa_abc);
+ esl_alphabet_Destroy(nt_abc);
+ esl_getopts_Destroy(go);
+ return 0;
+}
+
+
+
+
diff --git a/miniapps/esl-translate.itest.pl b/miniapps/esl-translate.itest.pl
new file mode 100755
index 0000000..39a65e3
--- /dev/null
+++ b/miniapps/esl-translate.itest.pl
@@ -0,0 +1,149 @@
+#! /usr/bin/perl
+
+BEGIN {
+ $builddir = shift;
+ $srcdir = shift;
+ $tmppfx = shift;
+}
+
+if (! -x "$builddir/miniapps/esl-translate") { die "FAIL: didn't find esl-translate program in $builddir/miniapps"; }
+if (! -x "$builddir/miniapps/esl-reformat") { die "FAIL: didn't find esl-reformat program in $builddir/miniapps"; }
+if (! -x "$builddir/miniapps/esl-shuffle") { die "FAIL: didn't find esl-shuffle program in $builddir/miniapps"; }
+if (! -x "$builddir/miniapps/esl-sfetch") { die "FAIL: didn't find esl-shuffle program in $builddir/miniapps"; }
+
+# Test the genetic code is correct, including spot checks of some alternative codes
+#
+# The reformatting to pfam format is solely to get the seq all on one line, simplifying parsing
+#
+open(TESTFILE,">$tmppfx.fa") || die "FAIL: couldn't open $tmppfx.fa for writing translation_test seqfile";
+print TESTFILE << "EOF";
+>translation_test
+TTGATAATG
+AAAAACAAGAATACAACCACGACTAGAAGCAGGAGTATAATCATGATT
+CAACACCAGCATCCACCCCCGCCTCGACGCCGGCGTCTACTCCTGCTT
+GAAGACGAGGATGCAGCCGCGGCTGGAGGCGGGGGTGTAGTCGTGGTT
+TACTATTCATCCTCGTCTTGCTGGTGTTTATTCTTGTTTTGATAATAG
+EOF
+close TESTFILE;
+
+$output = `$builddir/miniapps/esl-translate -l 60 $tmppfx.fa | $builddir/miniapps/esl-reformat pfam -`;
+if ($output !~ / coords=1\.\.192\s+length=64\s+frame=1/) { die "FAIL: standard genetic code mistranslated? unexpected desc line"; }
+if ($output !~ /orf1\s+LIMKNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLF\s+/) { die "FAIL: standard genetic code mistranslated"; }
+
+$output = `$builddir/miniapps/esl-translate -c 3 -l 60 $tmppfx.fa | $builddir/miniapps/esl-reformat pfam -`;
+if ($output !~ / coords=1\.\.195\s+length=65\s+frame=1/) { die "FAIL: yeast mito genetic code mistranslated? unexpected desc line"; }
+if ($output !~ /orf1\s+LMMKNKNTTTTRSRSMIMIQHQHPPPPRRRRTTTTEDEDAAAAGGGGVVVVYYSSSSCWCLFLFW\s+/) { die "FAIL: yeast mito genetic code mistranslated"; }
+
+$output = `$builddir/miniapps/esl-translate -c 14 -l 60 $tmppfx.fa | $builddir/miniapps/esl-reformat pfam -`;
+if ($output !~ / coords=1\.\.198\s+length=66\s+frame=1/) { die "FAIL: alt flatworm genetic code mistranslated? unexpected desc line"; }
+if ($output !~ /orf1\s+LIMNNKNTTTTSSSSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLFWY\s+/) { die "FAIL: alt flatworm genetic code mistranslated"; }
+
+# Use initiators, -M option.
+# Code 1 uses UUG (also CUG, AUG). Code 3 uses AUA (also AUG). Code 14, only AUG.
+# Initiator is always M.
+$output = `$builddir/miniapps/esl-translate -M -l 60 $tmppfx.fa | $builddir/miniapps/esl-reformat pfam -`;
+if ($output !~ / coords=1\.\.192\s+length=64\s+frame=1/) { die "FAIL: standard genetic code initiators mishandled w/ -M? unexpected desc line"; }
+if ($output !~ /orf1\s+MIMKNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLF\s+/) { die "FAIL: standard genetic code initiators mishandled w/ -M"; }
+
+$output = `$builddir/miniapps/esl-translate -M -c 3 -l 60 $tmppfx.fa | $builddir/miniapps/esl-reformat pfam -`;
+if ($output !~ / coords=4\.\.195\s+length=64\s+frame=1/) { die "FAIL: yeast mito genetic code initiators mishandled w/ -M? unexpected desc line"; }
+if ($output !~ /orf1\s+MMKNKNTTTTRSRSMIMIQHQHPPPPRRRRTTTTEDEDAAAAGGGGVVVVYYSSSSCWCLFLFW\s+/) { die "FAIL: yeast mito genetic code initiators mishandled w/ -M"; }
+
+$output = `$builddir/miniapps/esl-translate -M -c 14 -l 60 $tmppfx.fa | $builddir/miniapps/esl-reformat pfam -`;
+if ($output !~ / coords=7\.\.198\s+length=64\s+frame=1/) { die "FAIL: alt flatworm genetic code initiators mishandled w/ -M? unexpected desc line"; }
+if ($output !~ /orf1\s+MNNKNTTTTSSSSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLFWY\s+/) { die "FAIL: alt flatworm genetic code initiators mishandled w/ -M"; }
+
+# Use only AUG initiator, -m option.
+$output = `$builddir/miniapps/esl-translate -m -l 60 $tmppfx.fa | $builddir/miniapps/esl-reformat pfam -`;
+if ($output !~ / coords=7\.\.192\s+length=62\s+frame=1/) { die "FAIL: standard genetic code AUG starts mishandled w/ -m? unexpected desc line"; }
+if ($output !~ /orf1\s+MKNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLF\s+/) { die "FAIL: standard genetic code AUG starts mishandled w/ -m"; }
+
+$output = `$builddir/miniapps/esl-translate -m -c 3 -l 60 $tmppfx.fa | $builddir/miniapps/esl-reformat pfam -`;
+if ($output !~ / coords=7\.\.195\s+length=63\s+frame=1/) { die "FAIL: yeast mito genetic code AUG starts mishandled w/ -m? unexpected desc line"; }
+if ($output !~ /orf1\s+MKNKNTTTTRSRSMIMIQHQHPPPPRRRRTTTTEDEDAAAAGGGGVVVVYYSSSSCWCLFLFW\s+/) { die "FAIL: yeast mito genetic code AUG starts mishandled w/ -m"; }
+
+$output = `$builddir/miniapps/esl-translate -m -c 14 -l 60 $tmppfx.fa | $builddir/miniapps/esl-reformat pfam -`;
+if ($output !~ / coords=7\.\.198\s+length=64\s+frame=1/) { die "FAIL: alt flatworm genetic code AUG starts mishandled w/ -m? unexpected desc line"; }
+if ($output !~ /orf1\s+MNNKNTTTTSSSSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLFWY\s+/) { die "FAIL: alt flatworm genetic code AUG starts mishandled w/ -m"; }
+
+
+# Now test ambiguous translation, using a second contrived sequence.
+# The test includes an ambiguous stop (UAA|UAG) which should correctly decode to *.
+# Also includes an ambig initiator HUG=AUG|CUG|UUG, which should decode to M with -M;
+# NNN, though, can't initiate (because it's consistent with a stop too).
+#
+# The test seq is short enough that we don't need to reformat to pfam, which
+# is essential, because the test seq translates to other peptides in other frames,
+# whereas above we could make it translate to a single seq.
+#
+open(TESTFILE,">$tmppfx.fa") || die "FAIL: couldn't open $tmppfx.fa for writing ambig_test seqfile";
+print TESTFILE << "EOF";
+>ambig_test
+NNNHUGUUYUURUCNUAYUGYCUNCCNCAYCARCGNAUHACNAAYAARAGYAGRGUNGCNGAYGARGGN
+YUUYCUYAUYGUUAR
+EOF
+close TESTFILE;
+
+$output = `$builddir/miniapps/esl-translate -l 25 --watson $tmppfx.fa`;
+if ($output !~ / coords=4\.\.81\s+length=26\s+frame=1/) { die "FAIL: ambiguity codes mishandled by translation - unexpected desc line"; }
+if ($output !~ /\s+XFLSYCLPHQRITNKSRVADEGXXXX\s+/) { die "FAIL: ambiguity codes mishandled by translation"; }
+
+$output = `$builddir/miniapps/esl-translate -M -l 25 --watson $tmppfx.fa`;
+if ($output !~ / coords=4\.\.81\s+length=26\s+frame=1/) { die "FAIL: ambiguity codes mishandled by translation - unexpected desc line"; }
+if ($output !~ /\s+MFLSYCLPHQRITNKSRVADEGXXXX\s+/) { die "FAIL: ambiguity codes mishandled by translation"; }
+
+
+# Generate a couple of large-ish random sequences, larger than the window size.
+# Default ReadSeq vs. -W ReadWindow should give the same answer.
+# Do more than one seq, to test that we can do that.
+#
+system("$builddir/miniapps/esl-shuffle -G --dna -N 2 -L 10000 > $tmppfx.fa");
+$out1 = `$builddir/miniapps/esl-translate $tmppfx.fa`;
+$out2 = `$builddir/miniapps/esl-translate -W $tmppfx.fa`;;
+if ($out1 ne $out2) { die "FAIL: default vs. windowed (-W) give different results"; }
+
+
+
+# Using those same large sequences, test coords.
+#
+system("$builddir/miniapps/esl-sfetch --index $tmppfx.fa > /dev/null");
+ at output = `$builddir/miniapps/esl-translate -l 100 $tmppfx.fa`;
+foreach $line (@output)
+{
+ if ($line =~ /^>(orf\d+)\s+source=(\S+)\s+coords=(\d+)\.\.(\d+)\s+length=(\d+)\s+frame=(\d+)/)
+ {
+ $orfname = $1;
+ $source = $2;
+ $start = $3;
+ $end = $4;
+ $aalen = $5;
+ $frame = $6;
+
+ if ($end > $start)
+ {
+ if ($end - $start + 1 != $aalen * 3) { die "FAIL: $start..$end is not a multiple of 3"; }
+ if ($start >= 4) { $start -= 3; $has_leading_stop = 1; } else { $has_leading_stop = 0; }
+ if ($end <= 9997) { $end += 3; $has_trailing_stop = 1; } else { $has_trailing_stop = 0; }
+ $ntlen = $end - $start + 1;
+ }
+ else
+ {
+ if ($start - $end + 1 != $aalen * 3) { die "FAIL: $start..$end is not a multiple of 3"; }
+ if ($end >= 4) { $end -= 3; $has_trailing_stop = 1; } else { $has_trailing_stop = 0; }
+ if ($start <= 9997) { $start += 3; $has_leading_stop = 1; } else { $has_leading_stop = 0; }
+ $ntlen = $start - $end + 1;
+ }
+
+ $out2 = `$builddir/miniapps/esl-sfetch -c $start..$end $tmppfx.fa $source | $builddir/miniapps/esl-translate -l $aalen -`;
+ if ($has_leading_stop) { $expected_start = 4; } else { $expected_start = 1; }
+ if ($has_trailing_stop) { $expected_end = $ntlen - 3; } else { $expected_end = $ntlen; }
+ if ( $out2 !~ /^>orf\d+ source=.+ coords=$expected_start..$expected_end length=$aalen frame=1/)
+ { die "FAIL: fetched & translated seq not identical to original translation - coord problem?"; }
+ }
+
+}
+
+print "ok\n";
+unlink "$tmppfx.fa";
+unlink "$tmppfx.fa.ssi";
+exit 0;
diff --git a/miniapps/esl-translate.man b/miniapps/esl-translate.man
new file mode 100644
index 0000000..4a5c897
--- /dev/null
+++ b/miniapps/esl-translate.man
@@ -0,0 +1,293 @@
+.TH "esl-translate" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-translate - translate DNA sequence in six frames into individual ORFs
+
+.SH SYNOPSIS
+.B esl-translate
+.I [options]
+.I seqfile
+
+
+.SH DESCRIPTION
+
+.pp
+Given a
+.I seqfile
+containing DNA or RNA sequences,
+.B esl-translate
+outputs a six-frame translation of them as individual open reading
+frames in FASTA format.
+
+.pp
+By default, only open reading frames greater than 20aa are reported.
+This minimum ORF length can be changed with the
+.I -l
+option.
+
+.pp
+By default, no specific initiation codon is required, and any amino acid can start an open reading frame.
+This is because
+.I esl-translate
+may be used on sequence fragments, eukaryotic genes with introns, or other
+cases where we
+do not want to assume that ORFs are complete coding regions.
+This behavior can be changed. With the
+.I -m
+option, ORFs start with an initiator AUG Met. With the
+.I -M
+option, ORFs start with any of the initiation codons allowed by the
+genetic code. For example, the "standard" code (NCBI transl_table 1)
+allows AUG, CUG, and UUG as initiators. When
+.I -m
+or
+.I -M
+are used, an initiator is always translated to Met (even if the initiator
+is something like UUG or CUG that doesn't encode Met as an elongator).
+
+.pp
+If
+.I seqfile
+is - (a single dash), input is read from the stdin pipe. This
+(combined
+with the output being a standard FASTA file) allows
+.B esl-translate
+to be used in command line incantations.
+If
+.I seqfile
+ends in .gz, it is assumed to be a gzip-compressed file, and
+Easel will try to read it as a stream from
+.B gunzip -c.
+
+
+
+.SH OUTPUT FORMAT
+
+.pp
+
+
+The output FASTA name/description line contains information about the
+source and coordinates of each ORF. Each ORF is named
+.B orf1,
+etc., with numbering starting from 1, in order of their start position
+on the top strand followed by the bottom strand. The rest of the
+FASTA name/desc line contains 4 additional fields, followed by the
+description of the source sequence:
+
+.TP
+.B source=<s>
+<s> is the name of the source DNA/RNA sequence.
+
+.TP
+.B coords=<start>..<end>
+Coords, 1..L, for the translated ORF in a source DNA sequence of
+length L. If start is greater than end, the ORF is on the bottom
+(reverse complement) strand. The start is the first nucleotide of the
+first codon; the end is the last nucleotide of the last codon. The
+stop codon is not included in the coordinates (unlike in CDS
+annotation in GenBank, for example.)
+
+.TP
+.B length=<n>
+Length of the ORF in amino acids.
+
+.TP
+.B frame=<n>
+Which frame the ORF is in. Frames 1..3 are the top strand; 4..6 are the
+bottom strand. Frame 1 starts at nucleotide 1. Frame 4 starts at
+nucleotide L.
+
+
+
+.SH ALTERNATIVE GENETIC CODES
+
+.pp
+By default, the "standard" genetic code is used (NCBI transl_table 1).
+Any NCBI genetic code transl_table can be selected with the
+.I -c
+option, as follows:
+
+.TP
+.B 1
+Standard
+.TP
+.B 2
+Vertebrate mitochondrial
+.TP
+.B 3
+Yeast mitochondrial
+.TP
+.B 4
+Mold, protozoan, coelenterate mitochondrial; Mycoplasma/Spiroplasma
+.TP
+.B 5
+Invertebrate mitochondrial
+.TP
+.B 6
+Ciliate, dasycladacean, Hexamita nuclear
+.TP
+.B 9
+Echinoderm and flatworm mitochondrial
+.TP
+.B 10
+Euplotid nuclear
+.TP
+.B 11
+Bacterial, archaeal; and plant plastid
+.TP
+.B 12
+Alternative yeast
+.TP
+.B 13
+Ascidian mitochondrial
+.TP
+.B 14
+Alternative flatworm mitochondrial
+.TP
+.B 16
+Chlorophycean mitochondrial
+.TP
+.B 21
+Trematode mitochondrial
+.TP
+.B 22
+Scenedesmus obliquus mitochondrial
+.TP
+.B 23
+Thraustochytrium mitochondrial
+.TP
+.B 24
+Pterobranchia mitochondrial
+.TP
+.B 25
+Candidate Division SR1 and Gracilibacteria
+
+
+.PP
+As of this writing, more information about the genetic codes in the
+NCBI translation tables is at
+.I http://www.ncbi.nlm.nih.gov/Taxonomy/
+at a link titled
+.I Genetic codes.
+
+.SH IUPAC DEGENERACY CODES IN DNA
+
+.pp
+DNA sequences may contain IUPAC degeneracy codes, such as N, R, Y,
+etc. If all codons consistent with a degenerate codon translate to the
+same amino acid (or to a stop), that translation is done; otherwise,
+the codon is translated as X (even if one or more compatible codons
+are stops). For example, in the standard code, UAR translates to *
+(stop), GGN translates to G (glycine), NNN translates to X, and UGR
+translates to X (it could be either a UGA stop or a UGG Trp).
+
+.pp
+Degenerate initiation codons are handled essentially the same. If all
+codons consistent with the degenerate codon are legal initiators, then
+the codon is allowed to initiate a new ORF. Stop codons are never
+a legal initiator (not only with
+.I -m
+or
+.I -M
+but also with the default of allowing any amino acid to initiate),
+so degenerate codons consistent with a stop cannot be initiators.
+For example, NNN cannot initiate an ORF, nor can UGR -- even
+though they translate to X. This means that we don't translate
+long stretches of N's as long ORFs of X's, which is probably a
+feature, given the prevalence of artificial runs of N's in genome
+sequence assemblies.
+
+.pp
+Degenerate DNA codons are not translated to degenerate amino acids
+other than X, even when that is possible. For example, SAR and MUH
+are decoded as X, not Z (Q|E) and J (I|L). The extra complexity
+needed for a degenerate to degenerate translation doesn't seem worthwhile.
+
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help. Includes version number and summary of all options.
+Also includes a list of the available
+NCBI transl_tables and their numerical codes, for the
+.I -c
+option.
+
+.TP
+.BI -c " <id>"
+Choose alternative genetic code
+.I <id>
+where
+.I <id>
+is the numerical code of one of the NCBI transl_tables.
+
+.TP
+.BI -l " <n>"
+Set the minimum reported ORF length to
+.I <n>
+aa.
+
+.TP
+.B -m
+Require ORFs to start with an initiator codon AUG (Met).
+
+.TP
+.B -M
+Require ORFs to start with an initiator codon, as specified by the
+allowed initiator codons in the NCBI transl_table. In the default
+Standard code, AUG, CUG, and UUG are allowed as initiators. An
+initiation codon is always translated as Met, even if it does not
+normally encode Met as an elongator.
+
+.TP
+.B -W
+Use a memory-efficient windowed sequence reader.
+The default is to read entire DNA sequences into memory, which
+may become memory limited for some very large eukaryotic chromosomes.
+The windowed reader cannot
+reverse complement a nonrewindable input stream, so
+either
+.I <seqfile>
+must be a file,
+or you must use
+.I --watson
+to limit translation to the top strand.
+
+
+.TP
+.BI --informat " <s>"
+Assert that the input
+.I <seqfile>
+is in
+.I <s>
+format. Valid formats include
+FASTA, GenBank, EMBL, Uniprot, DDBJ, Stockholm, Clustal, and Phylip.
+.I <s>
+is case-insensitive but must be a complete format name; for example,
+.BI --informat " fasta"
+or
+.BI --informat " embl"
+work.
+
+.TP
+.B --watson
+Only translate the top strand.
+
+.TP
+.B --crick
+Only translate the bottom strand.
+
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
+
+
+
+
+
diff --git a/miniapps/esl-weight.c b/miniapps/esl-weight.c
new file mode 100644
index 0000000..ecbe6a4
--- /dev/null
+++ b/miniapps/esl-weight.c
@@ -0,0 +1,139 @@
+/* Assigns sequence weights to an MSA.
+ */
+#include "esl_config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "easel.h"
+#include "esl_getopts.h"
+#include "esl_msa.h"
+#include "esl_msafile.h"
+#include "esl_msaweight.h"
+#include "esl_random.h"
+
+#define WGTOPTS "-g,-p,-b,-f"
+
+static ESL_OPTIONS options[] = {
+ /* name type default env range toggles reqs incomp help docgroup*/
+ { "-h", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL, NULL, "show brief help on version and usage", 1 },
+ { "-g", eslARG_NONE,"default",NULL, NULL,WGTOPTS,NULL, NULL, "Gerstein/Sonnhammer/Chothia tree weights", 1 },
+ { "-p", eslARG_NONE, FALSE, NULL, NULL,WGTOPTS,NULL, NULL, "Henikoff position-based weights", 1 },
+ { "-b", eslARG_NONE, FALSE, NULL, NULL,WGTOPTS,NULL, NULL, "Henikoff simple filter weights", 1 },
+ { "-f", eslARG_NONE, FALSE, NULL, NULL,WGTOPTS,NULL, NULL, "filter out seqs by fractional identity", 1 },
+ { "-o", eslARG_OUTFILE, NULL, NULL, NULL, NULL,NULL, NULL, "send output to file <f>, not stdout", 1 },
+ { "--id", eslARG_REAL, "0.62", NULL,"0<=x<=1", NULL,"-b", NULL, "for -b: set identity cutoff", 1 },
+ { "--idf", eslARG_REAL, "0.80", NULL,"0<=x<=1", NULL,"-f", NULL, "for -f: set identity cutoff", 1 },
+ { "--informat", eslARG_STRING, FALSE, NULL, NULL, NULL,NULL, NULL, "specify that input file is in format <s>", 1 },
+ { "--amino", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--dna,--rna", "<msa file> contains protein alignments", 1 },
+ { "--dna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--amino,--rna", "<msa file> contains DNA alignments", 1 },
+ { "--rna", eslARG_NONE, FALSE, NULL, NULL, NULL,NULL,"--amino,--dna", "<msa file> contains RNA alignments", 1 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+};
+static char usage[] = "[-options] <msa file>";
+static char banner[] = "calculate sequence weights for an alignment";
+
+static void
+cmdline_failure(char *argv0, ESL_GETOPTS *go, char *format, ...)
+{
+ va_list argp;
+
+ va_start(argp, format);
+ vfprintf(stderr, format, argp);
+ va_end(argp);
+ esl_usage(stdout, argv0, usage);
+ puts("\n options:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ /* printf("\nTo see more help on available options, do %s -h\n\n", argv0); */
+ exit(1);
+}
+
+static void
+cmdline_help(char *argv0, ESL_GETOPTS *go)
+{
+ esl_banner(stdout, argv0, banner);
+ esl_usage (stdout, argv0, usage);
+ puts("\n options:");
+ esl_opt_DisplayHelp(stdout, go, 1, 2, 80);
+ exit(0);
+}
+
+int
+main(int argc, char **argv)
+{
+ ESL_GETOPTS *go = NULL;
+ char *msafile = NULL;
+ int fmt = eslMSAFILE_UNKNOWN;
+ ESL_ALPHABET *abc = NULL;
+ ESL_MSAFILE *afp = NULL;
+ ESL_MSA *msa = NULL;
+ int status;
+ FILE *ofp; /* output stream */
+
+ /* Parse command line */
+ go = esl_getopts_Create(options);
+ if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK) cmdline_failure(argv[0], go, "Failed to parse command line: %s\n", go->errbuf);
+ if (esl_opt_VerifyConfig(go) != eslOK) cmdline_failure(argv[0], go, "Error in app configuration: %s\n", go->errbuf);
+ if (esl_opt_GetBoolean(go, "-h") ) cmdline_help (argv[0], go);
+ if (esl_opt_ArgNumber(go) != 1) cmdline_failure(argv[0], go, "Incorrect number of command line arguments.\n");
+ msafile = esl_opt_GetArg(go, 1);
+
+ if (esl_opt_IsOn(go, "--informat")) {
+ fmt = esl_msafile_EncodeFormat(esl_opt_GetString(go, "--informat"));
+ if (fmt == eslMSAFILE_UNKNOWN) esl_fatal("%s is not a valid input sequence file format for --informat", esl_opt_GetString(go, "--informat"));
+ }
+
+ ofp = (esl_opt_GetString (go, "-o") == NULL ? stdout : fopen(esl_opt_GetString(go, "-o"), "w"));
+ if (! ofp) esl_fatal("Failed to open output file %s\n", esl_opt_GetString(go, "-o"));
+
+ if (esl_opt_GetBoolean(go, "--amino")) abc = esl_alphabet_Create(eslAMINO);
+ else if (esl_opt_GetBoolean(go, "--dna")) abc = esl_alphabet_Create(eslDNA);
+ else if (esl_opt_GetBoolean(go, "--rna")) abc = esl_alphabet_Create(eslRNA);
+
+ if ((status = esl_msafile_Open(&abc, msafile, NULL, fmt, NULL, &afp)) != eslOK)
+ esl_msafile_OpenFailure(afp, status);
+
+
+ while ((status = esl_msafile_Read(afp, &msa)) != eslEOF)
+ {
+ if (status != eslOK) esl_msafile_ReadFailure(afp, status);
+
+ if (esl_opt_GetBoolean(go, "-f"))
+ {
+ ESL_MSA *fmsa;
+ status = esl_msaweight_IDFilter(msa, esl_opt_GetReal(go, "--idf"), &fmsa);
+ esl_msafile_Write(ofp, fmsa, eslMSAFILE_STOCKHOLM);
+ if (fmsa != NULL) esl_msa_Destroy(fmsa);
+ }
+ else if (esl_opt_GetBoolean(go, "-g"))
+ {
+ status = esl_msaweight_GSC(msa);
+ esl_msafile_Write(ofp, msa, eslMSAFILE_STOCKHOLM);
+ }
+ else if (esl_opt_GetBoolean(go, "-p"))
+ {
+ status = esl_msaweight_PB(msa);
+ esl_msafile_Write(ofp, msa, eslMSAFILE_STOCKHOLM);
+ }
+ else if (esl_opt_GetBoolean(go, "-b"))
+ {
+ status = esl_msaweight_BLOSUM(msa, esl_opt_GetReal(go, "--id"));
+ esl_msafile_Write(ofp, msa, eslMSAFILE_STOCKHOLM);
+ }
+ else esl_fatal("internal error: no weighting algorithm selected");
+ if (status != eslOK) esl_fatal("Failed to calculate weights for msa %s", msa->name);
+
+ esl_msa_Destroy(msa);
+ }
+
+ esl_alphabet_Destroy(abc);
+ esl_msafile_Close(afp);
+ if (ofp != stdout) fclose(ofp);
+ esl_getopts_Destroy(go);
+ exit(0);
+}
+
+/*****************************************************************
+ * @LICENSE@
+ *****************************************************************/
diff --git a/miniapps/esl-weight.man b/miniapps/esl-weight.man
new file mode 100644
index 0000000..395098e
--- /dev/null
+++ b/miniapps/esl-weight.man
@@ -0,0 +1,111 @@
+.TH "esl-weight" 1 "@RELEASEDATE@" "@PACKAGE@ @RELEASE@" "@PACKAGE@ Manual"
+
+.SH NAME
+.TP
+esl-weight - calculate sequence weights in MSA(s)
+
+.SH SYNOPSIS
+
+.B esl-weight
+.I [options]
+.I msafile
+
+.SH DESCRIPTION
+
+.pp
+.B esl-weight
+calculates individual sequence weights for each alignment in
+.I msafile,
+and outputs a new
+multiple sequence alignment file in Stockholm format with
+the weights annotated in Stockholm-format
+.I #=GS <seqname> WT <weight>
+lines.
+The default weighting algorithm is the Gerstein/Sonnhammer/Chothia
+algorithm.
+
+.pp
+If
+.I msafile
+is - (a single dash),
+MSA input is read from
+.I stdin.
+
+
+
+.pp
+The sequences can be of protein or DNA/RNA sequences. All sequences
+in the same
+.I seqfile
+must be either protein or DNA/RNA. The alphabet will be autodetected
+unless one of the options
+.I --amino,
+.I --dna,
+or
+.I --rna
+are given. These options may be useful in automated
+pipelines to make
+.B esl-weight
+more robust; alphabet autodetection is not infallible.
+
+
+
+.SH OPTIONS
+
+.TP
+.B -h
+Print brief help; includes version number and summary of
+all options, including expert options.
+
+.TP
+.B -g
+Use the Gerstein/Sonnhammer/Chothia weighting algorithm; this is the
+default.
+
+.TP
+.B -p
+Use the Henikoff position-based weighting algorithm.
+
+.TP
+.B -b
+"BLOSUM weights": use approximately the same rule used in constructing
+the BLOSUM score matrices. This involves single-linkage clustering at
+some fractional identity threshold (default 0.62; see
+.I --id
+option), then for each cluster, splitting a total weight of one
+uniformly amongst all sequences in the cluster.
+
+.SH EXPERT OPTIONS
+
+.TP
+.BI --id " <x>"
+Sets the fractional identity threshold used by the BLOSUM weighting
+rule (option
+.I -b
+; required), to a number 0<=x<=1. Default is 0.62.
+
+.TP
+.B --amino
+Assert that the
+.I msafile
+contains protein sequences.
+
+.TP
+.B --dna
+Assert that the
+.I msafile
+contains DNA sequences.
+
+.TP
+.B --rna
+Assert that the
+.I msafile
+contains RNA sequences.
+
+.SH AUTHOR
+
+Easel and its documentation are @EASEL_COPYRIGHT at .
+ at EASEL_LICENSE@.
+See COPYING in the source code distribution for more details.
+The Easel home page is: @EASEL_URL@
+
diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in
new file mode 100644
index 0000000..2392c41
--- /dev/null
+++ b/testsuite/Makefile.in
@@ -0,0 +1,70 @@
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@ @top_srcdir@
+SHELL = /bin/sh
+
+CC = @CC@
+CFLAGS = @CFLAGS@ @PTHREAD_CFLAGS@ @PIC_FLAGS@
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+SIMDFLAGS = @SIMD_CFLAGS@
+DEFS = @DEFS@
+LIBS = @LIBGSL@ @LIBS@ -lm
+MPILIBS = @MPILIBS@
+
+SQCLEVEL = 2
+
+QUIET_SUBDIR0 = +${MAKE} -C #space separator after -c
+QUIET_SUBDIR1 =
+ifndef V
+ QUIET_CC = @echo ' ' CC $@;
+ QUIET_GEN = @echo ' ' GEN $@;
+ QUIET_AR = @echo ' ' AR $@;
+ QUIET_SUBDIR0 = + at subdir=
+ QUIET_SUBDIR1 = ; echo ' ' SUBDIR $$subdir; \
+ ${MAKE} -C $$subdir
+endif
+
+.PHONY: check dcheck clean distclean
+
+check:
+ @echo
+ @echo Running Easel test suite...
+ @echo
+ @${srcdir}/../devkit/sqc ${SQCLEVEL} ${srcdir}/testsuite.sqc .. ${srcdir}/..
+
+dcheck:
+ @echo Running developer testsuite...
+ @echo -n Compiling for unit tests and valgrind tests...
+ @(cd ..; make clean > /dev/null; testsuite/${top_srcdir}/configure --enable-debugging >/dev/null; make dev > /dev/null)
+ @echo done.
+ @echo -n Running unit tests...
+ @${srcdir}/../devkit/sqc ${SQCLEVEL} ${srcdir}/testsuite.sqc .. ${srcdir}/.. > utest.report
+ @echo done. [See utest.report]
+ @echo -n Looking for memory leaks...
+ @${srcdir}/valgrind_report.pl .. ${srcdir}/.. > valgrind.report
+ @echo done. [See valgrind.report]
+ @echo -n Recompiling for coverage tests...
+ @(cd ..; make clean > /dev/null; testsuite/${top_srcdir}/configure --enable-gcov > /dev/null; make tests > /dev/null)
+ @echo done.
+ @echo -n Measuring test code coverage...
+ @${top_srcdir}/testsuite/coverage_report.pl .. ${top_srcdir} > coverage.report
+ @echo done. [See coverage.report]
+ @cat coverage.report valgrind.report utest.report > dcheck.report
+ @echo
+ @echo Finished developer testsuite.
+ @echo For a complete report, see dcheck.report.
+
+clean:
+ -rm -f *.gcno *.gcda *.gcov
+ -rm -f esltmp??????
+ -rm -f *.o *~
+ -rm -f ${PROGS}
+
+distclean: clean
+ -rm -f coverage.report valgrind.report utest.report
+ rm Makefile
+
+################################################################
+# @LICENSE@
+################################################################
\ No newline at end of file
diff --git a/testsuite/coverage_report.pl b/testsuite/coverage_report.pl
new file mode 100755
index 0000000..69c1a19
--- /dev/null
+++ b/testsuite/coverage_report.pl
@@ -0,0 +1,134 @@
+#! /usr/bin/perl
+
+# Measures testsuite coverage (as percentage of source lines),
+# using gcov.
+#
+# Assumes you've already compiled the library, with test drivers only.
+#
+# Usage:
+# coverage_report.pl <top_builddir> <top_srcdir>
+#
+# Example usage, in a single directory (source and build):
+# ./configure --enable-gcov
+# make tests
+# testsuite/coverage_report.pl . .
+#
+# Example usage, in separate build dir
+# mkdir build_dir
+# cd build_dir
+# ../configure --enable-gcov
+# make tests
+# ../testsuite/coverage_report.pl . ..
+#
+#
+# It has to be 'make tests', not 'make dev'. The _utest driver must be
+# the last executable compiled for each module .c file, or gcov will
+# bitch about stamp mismatch between .gcno, .gcda files. (When you
+# build esl_foo_utest, it generates a .gcno file for esl_foo.c. When
+# you run esl_foo_utest, it generates a .gcda file for esl_foo.c. If
+# you build esl_foo_example before you run esl_foo_utest, you get a
+# mismatch.)
+#
+# It assumes you have 'sloccount' installed, so it can count
+# ANSI C lines in files with no test driver. If you don't, use
+# ./coverage_report.pl -s
+
+
+use Getopt::Std;
+use File::Basename;
+$have_sloccount = 1;
+getopts('s');
+if ($opt_s) { $have_sloccount = 0; }
+
+if ($#ARGV+1 != 2) { die("Usage: coverage_report.pl <top_builddir> <top_srcdir>"); }
+$top_builddir = shift;
+$top_srcdir = shift;
+
+
+printf("Code coverage test for Easel, using gcov:\n\n");
+
+ at modules = <$top_srcdir/esl_*.c>;
+unshift(@modules, "$top_srcdir/easel.c");
+
+$nmodules = 0;
+$npresent = 0;
+$ncompiled = 0;
+$nsuccess = 0;
+$nlines = 0;
+$nlines_covered = 0;
+foreach $module (@modules) {
+ $basecfile = fileparse($module);
+ $nmodules++;
+
+ # create the eslDMATRIX_TESTDRIVE flag and dmatrix_utest program name from esl_dmatrix.c
+ if ($basecfile =~ /^(esl_)?(\S+).c/) {
+ $pfx = $1;
+ $base = $2;
+ $progname = $pfx.$base."_utest";
+ $base =~ tr/a-z/A-Z/;
+ $flag = "esl".$base."_TESTDRIVE";
+ }
+ printf("%-28s ", $basecfile);
+
+ # one way to fail: there isn't a test driver at all
+ `grep $flag $module`;
+ if ($? != 0) { printf("%40s[NO DRIVER]\n", ""); push @nodriverlist, $module; next; }
+ $npresent++;
+
+ # or: there's a test driver but it wasn't compiled. Sometimes normal, such as esl_mpi_utest on non-MPI
+ if (! -x "$top_builddir/$progname") { printf("%40s[UTEST NOT COMPILED]\n", ""); next; };
+ $ncompiled++;
+
+ `$top_builddir/$progname >& /dev/null`;
+ if ($? != 0) { printf("%40s[UTEST FAILED ]\n", ""); next; };
+ $nsuccess++;
+
+ $output = `(cd $top_builddir; gcov $basecfile)`;
+ if ($output =~ /File.*$basecfile.*\nLines executed:\s*(\d+\.\d+)% of\s+(\d+)/) {
+ $pct_cvg = $1;
+ $nlines += $2;
+ $nlines_covered += $1*$2/100;
+ printf("%6.2f%% ", $pct_cvg);
+ $nbar = int($pct_cvg * 20 / 100);
+ for ($i = 0; $i < $nbar; $i++) { printf("*"); }
+ printf("\n");
+ }
+ else { die "failed to parse gcov output";}
+}
+
+if ($have_sloccount) {
+ foreach $badmodule (@nodriverlist) {
+ $output = `sloccount $badmodule`;
+ if ($output =~ /ansic:\s+(\d+)/) { $nlines_nodrivers += $1; }
+ else { die("failed to parse sloccount output"); }
+ }
+}
+
+printf("\nOf %d total modules in Easel:\n", $nmodules);
+if ($npresent != $nmodules) {
+ printf(" - %d have test drivers, %d do not\n", $npresent, $nmodules-$npresent);
+} else {
+ printf(" - All %d have test drivers\n", $npresent);
+}
+if ($ncompiled != $npresent) {
+ printf(" - %d compiled, %d did not\n", $ncompiled, $npresent-$ncompiled);
+} else {
+ printf(" - All %d compiled\n", $ncompiled);
+}
+if ($nsuccess != $ncompiled) {
+ printf(" - %d ran successfully, %d did not\n", $nsuccess, $ncompiled-$nsuccess);
+} else {
+ printf(" - All %d ran successfully\n", $nsuccess);
+}
+
+print "\n";
+ printf("Total coverage (of modules with test drivers): %.2f%%\n", 100.*$nlines_covered / $nlines);
+if ($have_sloccount) {
+ printf("Total coverage (including modules without drivers yet): %.2f%%\n", 100.*$nlines_covered / ($nlines+$nlines_nodrivers));
+}
+
+
+
+#
+# SRE, Thu Mar 1 19:22:57 2007 (Janelia)
+# SVN $Id$
diff --git a/testsuite/e2.sh b/testsuite/e2.sh
new file mode 100755
index 0000000..005ed41
--- /dev/null
+++ b/testsuite/e2.sh
@@ -0,0 +1,37 @@
+#! /bin/sh
+
+# Usage: ./e2.sh <esl-seqstat> <stockholm file>
+# Example: ./e2.sh ../miniapps/esl-seqstat ../formats/stockholm.1
+#
+# This tests that % cat foo.sto | esl-seqstat -
+# produces an error message: Format of seqfile - unrecognized.
+# whereas % cat foo.sto | esl-seqstat --informat stockholm -
+# succeeds
+
+prog=$1
+alifile=$2
+
+output=`cat $alifile | $prog - 2>&1 | head -n 1 | grep -c "^Format of seqfile - unrecognized."`
+if test "$output" = 0
+then
+ echo "FAIL"
+ exit 1
+fi
+
+output=`cat $alifile | $prog --informat stockholm - 2>&1`
+if test $? -gt 0
+then
+ echo "FAIL"
+ exit 1
+fi
+
+
+echo "ok"
+exit 0
+
+
+
+
+
+
+
diff --git a/testsuite/i1-degen-residues.pl b/testsuite/i1-degen-residues.pl
new file mode 100755
index 0000000..eb3c5ac
--- /dev/null
+++ b/testsuite/i1-degen-residues.pl
@@ -0,0 +1,99 @@
+#! /usr/bin/perl
+
+# Integration tests of reading all valid protein sequence residue characters.
+#
+# Usage: ./i1-degen-residues.pl <top_builddir> <top_srcdir> <tmpfile prefix>
+# Example: ./i1-degen-residues.pl .. .. foo
+#
+# SRE, Tue Feb 2 13:09:58 2010 [Janelia]
+# SVN $Id$
+
+$top_builddir = shift;
+$top_srcdir = shift;
+$tmppfx = shift;
+
+# Make sure that any files/executables we need to access are present.
+if (! -x "$top_builddir/miniapps/esl-reformat") { die "FAIL: esl-reformat not found in $top_builddir/miniapps\n"; }
+if (! -x "$top_builddir/miniapps/esl-shuffle") { die "FAIL: esl-shuffle not found in $top_builddir/miniapps\n"; }
+if (! -x "$top_builddir/miniapps/esl-sfetch") { die "FAIL: esl-sfetch not found in $top_builddir/miniapps\n"; }
+if (! -x "$top_builddir/miniapps/esl-seqstat") { die "FAIL: esl-seqstat not found in $top_builddir/miniapps\n"; }
+
+$reformat = "$top_builddir/miniapps/esl-reformat";
+$shuffle = "$top_builddir/miniapps/esl-shuffle";
+$sfetch = "$top_builddir/miniapps/esl-sfetch";
+$seqstat = "$top_builddir/miniapps/esl-seqstat";
+
+# Create test amino acid and sequence files.
+if (! open(DNAFP, ">$tmppfx.dna")) { print "FAIL: couldn't open $tmppfx.dna for writing"; exit 1; }
+if (! open(AAFP, ">$tmppfx.aa")) { print "FAIL: couldn't open $tmppfx.aa for writing"; exit 1; }
+if (! open(BADFP, ">$tmppfx.bad")) { print "FAIL: couldn't open $tmppfx.bad for writing"; exit 1; }
+
+print AAFP <<"EOF";
+>test
+ACDEFGHIKLMNPQRSTVWYBJZOUX*acdefghiklmnpqrstvwybjzoux
+EOF
+
+print DNAFP <<"EOF";
+>test
+ACGTRYMKSWHBVDN*acgtrymkswhbvdn*
+EOF
+
+print BADFP <<"EOF";
+>test
+ACGTRYMKSWHBVDN%acgtrymkswhbvdn%
+EOF
+
+# esl-reformat tests
+system("$reformat fasta $tmppfx.dna > $tmppfx.out 2>&1"); if ($? != 0) { print "FAIL: reformat failed on .dna test\n"; exit 1; }
+system("diff $tmppfx.dna $tmppfx.out > /dev/null 2>&1"); if ($? != 0) { print "FAIL: reformat changed .dna test\n"; exit 1; }
+
+system("$reformat fasta $tmppfx.aa > $tmppfx.out 2>&1"); if ($? != 0) { print "FAIL: reformat failed on .aa test\n"; exit 1; }
+system("diff $tmppfx.aa $tmppfx.out > /dev/null 2>&1"); if ($? != 0) { print "FAIL: reformat changed .aa test\n"; exit 1; }
+
+$output = `$reformat fasta $tmppfx.bad 2>&1`; if ($? == 0) { print "FAIL: reformat should have failed on .bad test\n"; exit 1; }
+if (! $output =~ /Illegal character %/) { print "FAIL: reformat should have found illegal % in .bad test\n"; exit 1; }
+
+# esl-seqstat tests
+$output = `$seqstat --dna $tmppfx.dna 2>&1`; if ($? != 0) { print "FAIL: seqstat failed on .dna test\n"; exit 1; }
+($n) = $output =~ /Total # residues:\s+(\d+)/; if ($n != 32) { print "FAIL: seqstat sees wrong residue count ($n) in .dna test\n"; exit 1; }
+
+$output = `$seqstat $tmppfx.aa 2>&1`; if ($? != 0) { print "FAIL: seqstat failed on .aa test\n"; exit 1; }
+($n) = $output =~ /Total # residues:\s+(\d+)/; if ($n != 53) { print "FAIL: seqstat sees wrong residue count ($n) in .aa test\n"; exit 1; }
+
+$output = `$seqstat $tmppfx.bad 2>&1`; if ($? == 0) { print "FAIL: seqstat should have failed on .bad test\n"; exit 1; }
+
+# esl-shuffle tests
+system("$shuffle $tmppfx.dna > $tmppfx.out 2>&1"); if ($? != 0) { print "FAIL: shuffle failed on .dna test\n"; exit 1; }
+system("$seqstat --dna -c $tmppfx.out > $tmppfx.out2 2>&1"); if ($? != 0) { print "FAIL: seqstat -c failed on shuffled .dna\n"; exit 1; }
+system("$seqstat --dna -c $tmppfx.dna > $tmppfx.out3 2>&1"); if ($? != 0) { print "FAIL: seqstat -c failed on .dna test\n"; exit 1; }
+system("diff $tmppfx.out2 $tmppfx.out3 > /dev/null 2>&1"); if ($? != 0) { print "FAIL: shuffle changed .dna composition\n"; exit 1; }
+
+system("$shuffle $tmppfx.aa > $tmppfx.out 2>&1"); if ($? != 0) { print "FAIL: shuffle failed on .aa test\n"; exit 1; }
+system("$seqstat -c $tmppfx.out > $tmppfx.out2 2>&1"); if ($? != 0) { print "FAIL: seqstat -c failed on shuffled .aa\n"; exit 1; }
+system("$seqstat -c $tmppfx.aa > $tmppfx.out3 2>&1"); if ($? != 0) { print "FAIL: seqstat -c failed on .aa test\n"; exit 1; }
+system("diff $tmppfx.out2 $tmppfx.out3 > /dev/null 2>&1"); if ($? != 0) { print "FAIL: shuffle changed .aa composition\n"; exit 1; }
+
+$output = `$shuffle $tmppfx.bad 2>&1`; if ($? == 0) { print "FAIL: shuffle should have failed on .bad test\n"; exit 1; }
+
+# esl-sfetch tests
+system("$sfetch --index $tmppfx.aa >/dev/null 2>&1"); if ($? != 0) { print "FAIL: sfetch --index failed on .aa test\n"; exit 1; }
+$output = `$sfetch -c 27..27 $tmppfx.aa test 2>&1 | grep -v "^>"`; if ($? != 0) { print "FAIL: sfetch failed on .aa test\n"; exit 1; }
+if (! $output =~ /^\*/) { print "FAIL: sfetch didn't retrieve * on .aa test ($output)\n"; exit 1; }
+
+system("$sfetch --index $tmppfx.dna >/dev/null 2>&1"); if ($? != 0) { print "FAIL: sfetch --index failed on .dna test\n"; exit 1; }
+$output = `$sfetch -c 16..16 $tmppfx.aa test 2>&1 | grep -v "^>"`; if ($? != 0) { print "FAIL: sfetch failed on .dna test\n"; exit 1; }
+if (! $output =~ /^\*/) { print "FAIL: sfetch didn't retrieve * on .dna test ($output)\n"; exit 1; }
+
+$output = `$sfetch --index $tmppfx.bad 2>&1`; if ($? == 0) { print "FAIL: sfetch --index should have failed on .bad test\n"; exit 1; }
+
+print "ok\n";
+unlink "$tmppfx.dna";
+unlink "$tmppfx.dna.ssi";
+unlink "$tmppfx.aa";
+unlink "$tmppfx.aa.ssi";
+unlink "$tmppfx.bad";
+unlink "$tmppfx.bad.ssi";
+unlink "$tmppfx.out";
+unlink "$tmppfx.out2";
+unlink "$tmppfx.out3";
+exit 0;
diff --git a/testsuite/i2-ncbi-indices.pl b/testsuite/i2-ncbi-indices.pl
new file mode 100755
index 0000000..392b62a
--- /dev/null
+++ b/testsuite/i2-ncbi-indices.pl
@@ -0,0 +1,147 @@
+#! /usr/bin/perl
+
+# Testing that we can read FASTA files, even if they have NCBI
+# formatted BLAST databases in the same directory.
+#
+# (This failed in Jan 2010 because the embryonic NCBI db parser
+# automatically opened the NCBI files instead of the FASTA file,
+# but did not have an implementation of esl_sqio_ReadWindow().)
+#
+# Usage: ./i2-ncbi-indices <top_builddir> <top_srcdir> <tmpfile prefix>
+# Example: ./i2-ncbi-indices . . tmp
+#
+# SRE, Tue Feb 2 12:43:04 2010 [Janelia]
+# SVN $Id$
+#
+
+
+# This idiom (as opposed to just "use foo;") allows you to gracefully
+# catch the case of a missing Perl module:
+eval "use MIME::Base64 ()";
+$have_base64 = 1 unless $@;
+if (! $have_base64) { die "FAIL: MIME:Base64 perl module required for this test\n"; }
+
+$top_builddir = shift;
+$top_srcdir = shift;
+$tmppfx = shift;
+
+# Make sure that any files/executables we need to access are present.
+if (! -x "$top_builddir/miniapps/esl-seqstat") { die "FAIL: esl-seqstat not found in $top_builddir/miniapps\n"; }
+
+
+# Generate the test files. See notes below, at the function.
+&write_testfiles($tmppfx);
+
+# The bug we're catching is that esl-seqstat would fail because
+# esl_sqio_ReadWindow() returned eslEUNIMPLEMENTED.
+#
+$output = `$top_builddir/miniapps/esl-seqstat -a $tmppfx.fa 2>&1`;
+if ($? != 0) { die "FAIL: esl-seqstat fails to read BLAST-formatted FASTA file\n"; }
+
+
+# We could check more (like whether the output was what we expected)
+# but that's all we need for the bug in question.
+
+print "ok\n";
+unlink "$tmppfx.fa";
+unlink "$tmppfx.fa.phr";
+unlink "$tmppfx.fa.pin";
+unlink "$tmppfx.fa.psq";
+exit 0;
+
+
+
+# We want to test NCBI BLAST data formats, without requiring that the
+# user has "formatdb" installed.
+#
+# So we want to carry a payload of premade files; but the files are
+# binary.
+#
+# So we carry them base64-encoded, and decode them into tmp files.
+#
+# The test files were created by
+# % esl-shuffle -G --amino -L 60 -N 10 > test.fa
+# % formatdb -i test.fa
+# % base64 test.fa.phr
+# % base64 test.fa.pin
+# % base64 test.fa.psq
+#
+sub
+write_testfiles
+{
+ local($pfx) = @_;
+
+$fafile = ">random0\
+LFGSQIVARDDPSSVLRDIGGSVRPRNEICKIKQKEGQNGLNHDPVKNTWEDESKKQAFA\
+>random1\
+EIARLAAQLRETPAEKAIADIYLEDCLDFIAVTSFTATSDPLEGAGGWEKVNREAPFESA\
+>random2\
+IVLNNSVDYYIPSIHTAFNGLVLPGSKVPVSFFQQPGSLLTNATILGFDLLDLAVAEGLL\
+>random3\
+LSMKVPRFGKNKREDNLQLRLGPPKYPSWNAMVRAHASKFYAVNRGVFIGSLPIQFVEKR\
+>random4\
+VKLTTGAKVLDLTFYHYCEAAISDQMLQATLNQAIGHNARETILTSAQQLDPAYRSDQVW\
+>random5\
+LLFEQVLSFDHGEYRAHGLQRTLRQVLILIAALMVLPEQTKTGDLSPACKLANATVSGKL\
+>random6\
+LERDNAAGMIALASNSEFNIEGCQKYGSKGGLESQGKMKITNQYTSEIDVYERPENVLGF\
+>random7\
+MEAPAWDTPGLGASFQASDEAPPELSLTLHNNPQVAMRKKVVRVSALTLTRPRHLLIMFA\
+>random8\
+SSLNCLQMGLPRRLQWADDPDSDNTAPNAPLVSFKNVHMVLAEEFEGYRIAIVVSYPFDR\
+>random9\
+KKQVADVLELVIEGENQRSMVVLPTGKRFEIESAWGVGRPFPSTQGLIMNLYMAKDRAAT\
+";
+
+$phr_encoded = "\
+MIAwgKCAGgdyYW5kb20wAAChgDCAqoAwgKCAGglCTF9PUkRfSUQAAKGAoIACAQAAAAAAAAAAAAAA\
+AACigAIBAAAAAAAAADCAMICggBoHcmFuZG9tMQAAoYAwgKqAMICggBoJQkxfT1JEX0lEAAChgKCA\
+AgEBAAAAAAAAAAAAAAAAooACAQAAAAAAAAAwgDCAoIAaB3JhbmRvbTIAAKGAMICqgDCAoIAaCUJM\
+X09SRF9JRAAAoYCggAIBAgAAAAAAAAAAAAAAAKKAAgEAAAAAAAAAMIAwgKCAGgdyYW5kb20zAACh\
+gDCAqoAwgKCAGglCTF9PUkRfSUQAAKGAoIACAQMAAAAAAAAAAAAAAACigAIBAAAAAAAAADCAMICg\
+gBoHcmFuZG9tNAAAoYAwgKqAMICggBoJQkxfT1JEX0lEAAChgKCAAgEEAAAAAAAAAAAAAAAAooAC\
+AQAAAAAAAAAwgDCAoIAaB3JhbmRvbTUAAKGAMICqgDCAoIAaCUJMX09SRF9JRAAAoYCggAIBBQAA\
+AAAAAAAAAAAAAKKAAgEAAAAAAAAAMIAwgKCAGgdyYW5kb202AAChgDCAqoAwgKCAGglCTF9PUkRf\
+SUQAAKGAoIACAQYAAAAAAAAAAAAAAACigAIBAAAAAAAAADCAMICggBoHcmFuZG9tNwAAoYAwgKqA\
+MICggBoJQkxfT1JEX0lEAAChgKCAAgEHAAAAAAAAAAAAAAAAooACAQAAAAAAAAAwgDCAoIAaB3Jh\
+bmRvbTgAAKGAMICqgDCAoIAaCUJMX09SRF9JRAAAoYCggAIBCAAAAAAAAAAAAAAAAKKAAgEAAAAA\
+AAAAMIAwgKCAGgdyYW5kb205AAChgDCAqoAwgKCAGglCTF9PUkRfSUQAAKGAoIACAQkAAAAAAAAA\
+AAAAAACigAIBAAAAAAAAAA==";
+
+$pin_encoded = "\
+AAAABAAAAAEAAAAHdGVzdC5mYQAAABlGZWIgMiwgMjAxMCAxMToxMyBBTQAAAAAAAAAAClgCAAAA\
+AAAAAAAAPAAAAAAAAABGAAAAjAAAANIAAAEYAAABXgAAAaQAAAHqAAACMAAAAnYAAAK8AAAAAQAA\
+AD4AAAB7AAAAuAAAAPUAAAEyAAABbwAAAawAAAHpAAACJgAAAmM=";
+
+$psq_encoded = "\
+AAsGBxEPCRMBEAQEDhEREwsQBAkHBxETEA4QDQUJAwoJCg8KBQcPDQcLDQgEDhMKDRIUBQQFEQoK\
+DwEGAQAFCQEQCwEBDwsQBRIOAQUKAQkBBAkWCwUEAwsEBgkBExIRBhIBEhEEDgsFBwEHBxQFChMN\
+EAUBDgYFEQEACRMLDQ0REwQWFgkOEQkIEgEGDQcLEwsOBxEKEw4TEQYGDw8OBxELCxINARIJCwcG\
+BAsLBAsBEwEFBwsLAAsRDAoTDhAGBwoNChAFBA0LDwsQCwcODgoWDhEUDQEMExABCAERCgYWARMN\
+EAcTBgkHEQsOCQ8GEwUKEAATCgsSEgcBChMLBAsSBhYIFgMFAQEJEQQPDAsPARILDQ8BCQcIDQEQ\
+BRIJCxIRAQ8PCwQOARYQEQQPExQACwsGBQ8TCxEGBAgHBRYQAQgHCw8QEgsQDxMLCQsJAQELDBML\
+DgUPEgoSBwQLEQ4BAwoLAQ0BEhMRBwoLAAsFEAQNAQEHDAkBCwERDREFBg0JBQcDDwoWBxEKBwcL\
+BREPBwoMCgkSDQ8WEhEFCQQTFgUQDgUNEwsHBgAMBQEOARQEEg4HCwcBEQYPAREEBQEODgULEQsS\
+CwgNDQ4PEwEMEAoKExMQExEBCxILEhAOEAgLCwkMBgEAERELDQMLDwwHCw4QEAsPFAEEBA4EEQQN\
+EgEODQEOCxMRBgoNEwgMEwsBBQUGBQcWEAkBCRMTERYOBgQQAAoKDxMBBBMLBQsTCQUHBQ0PEBEM\
+ExMLDhIHChAGBQkFEQEUBxMHEA4GDhESDwcLCQwNCxYMAQoEEAEBEgA=";
+
+open(FAFILE, ">$pfx.fa") || die;
+print FAFILE $fafile;
+close (FAFILE);
+
+open(PHRFILE, ">$pfx.fa.phr");
+print PHRFILE MIME::Base64::decode_base64($phr_encoded);
+close PHRFILE;
+
+open(PINFILE, ">$pfx.fa.pin");
+print PINFILE MIME::Base64::decode_base64($pin_encoded);
+close PINFILE;
+
+open(PSQFILE, ">$pfx.fa.psq");
+print PSQFILE MIME::Base64::decode_base64($psq_encoded);
+close PSQFILE;
+}
+
+
+
diff --git a/testsuite/i3-blank-gf.pl b/testsuite/i3-blank-gf.pl
new file mode 100755
index 0000000..831dcde
--- /dev/null
+++ b/testsuite/i3-blank-gf.pl
@@ -0,0 +1,95 @@
+#! /usr/bin/perl
+
+# Bug #e5: blank text line following #=GF <tag> handled improperly.
+#
+# Easel was allowing blank text, because we want to allow blank #=GF CC
+# lines for line spacing in human-readable comments.
+#
+# Problem is that then blank DE or AC lines are also accepted. HMMER
+# then propagates blank DESC or ACC lines to its save files. But HMMER
+# save file parser strictly requires DESC <s> or ACC <s>.
+#
+# SRE, Tue Jul 13 10:46:02 2010
+# SVN $Id$
+
+BEGIN {
+ $builddir = shift;
+ $srcdir = shift;
+ $tmppfx = shift;
+}
+
+# Verify that we have all the executables we need for the test.
+if (! -x "$builddir/miniapps/esl-reformat") { die "FAIL: didn't find esl-reformat binary in $builddir/miniapps\n"; }
+
+
+# Create four test files
+# .sto1: AC, DE followed by spaces; invalid format
+# .sto2: AC, DE followed by \n; invalid format
+# .sto3, CC followed by spaces; valid format
+# .sto4, CC followed by \n; valid format
+
+open(MSA1, ">$tmppfx.sto1") || die "FAIL: couldn't create $tmppfx.sto1\n";
+print MSA1 << "EOF";
+# STOCKHOLM 1.0
+#=GF AC
+#=GF DE
+
+seq1 ACGTACGTACGT
+seq2 ACGTACGTACGT
+//
+EOF
+close MSA1;
+
+open(MSA2, ">$tmppfx.sto2") || die "FAIL: couldn't create $tmppfx.sto2\n";
+print MSA2 << "EOF";
+# STOCKHOLM 1.0
+#=GF AC
+#=GF DE
+
+seq1 ACGTACGTACGT
+seq2 ACGTACGTACGT
+//
+EOF
+close MSA2;
+
+open(MSA3, ">$tmppfx.sto3") || die "FAIL: couldn't create $tmppfx.sto3\n";
+print MSA3 << "EOF";
+# STOCKHOLM 1.0
+#=GF CC
+
+seq1 ACGTACGTACGT
+seq2 ACGTACGTACGT
+//
+EOF
+close MSA3;
+
+open(MSA4, ">$tmppfx.sto4") || die "FAIL: couldn't create $tmppfx.sto4\n";
+print MSA4 << "EOF";
+# STOCKHOLM 1.0
+#=GF CC
+
+seq1 ACGTACGTACGT
+seq2 ACGTACGTACGT
+//
+EOF
+close MSA4;
+
+
+$output = `$builddir/miniapps/esl-reformat stockholm $tmppfx.sto1 2>&1`;
+if ($? == 0) { die "FAIL: blank AC,DE lines should be invalid Stockholm format (bug #e5) (1)\n"; }
+
+$output = `$builddir/miniapps/esl-reformat stockholm $tmppfx.sto2 2>&1`;
+if ($? == 0) { die "FAIL: blank AC,DE lines should be invalid Stockholm format (bug #e5) (2)\n"; }
+
+$output = `$builddir/miniapps/esl-reformat stockholm $tmppfx.sto3`;
+if ($? != 0) { die "FAIL: blank CC line should be valid Stockholm format (1)\n"; }
+if ($output !~ /#=GF CC/) { die "FAIL: blank CC line did not propagate\n"; }
+
+$output = `$builddir/miniapps/esl-reformat stockholm $tmppfx.sto4`;
+if ($? != 0) { die "FAIL: blank CC line should be valid Stockholm format (2)\n"; }
+if ($output !~ /#=GF CC/) { die "FAIL: blank CC line did not propagate\n"; }
+
+print "ok\n";
+unlink <$tmppfx.sto*>;
+exit 0;
+
diff --git a/testsuite/testsuite.sqc b/testsuite/testsuite.sqc
new file mode 100644
index 0000000..5eeb897
--- /dev/null
+++ b/testsuite/testsuite.sqc
@@ -0,0 +1,151 @@
+# Easel's test suite, in sqc command format
+
+#################################################################
+# Test drivers for each module.
+################################################################
+
+1 exercise alphabet-utest @esl_alphabet_utest@
+1 exercise buffer-utest @esl_buffer_utest@
+1 exercise cluster-utest @esl_cluster_utest@
+1 exercise dirichlet-utest @esl_dirichlet_utest@
+1 exercise distance-utest @esl_distance_utest@
+1 exercise dmatrix-utest @esl_dmatrix_utest@
+1 exercise dsqdata-utest @esl_dsqdata_utest@
+1 exercise easel-utest @easel_utest@
+1 exercise exponential-utest @esl_exponential_utest@
+1 exercise fileparser-utest @esl_fileparser_utest@
+1 exercise gamma-utest @esl_gamma_utest@
+1 exercise gencode-utest @esl_gencode_utest@
+1 exercise getopts-utest @esl_getopts_utest@
+1 exercise gumbel-utest @esl_gumbel_utest@
+1 exercise heap-utest @esl_heap_utest@
+1 exercise histogram-utest @esl_histogram_utest@
+1 exercise hyperexp-utest @esl_hyperexp_utest@
+1 exercise keyhash-utest @esl_keyhash_utest@
+1 exercise mem-utest @esl_mem_utest@
+1 exercise msa-utest @esl_msa_utest@
+1 exercise msacluster-utest @esl_msacluster_utest@
+1 exercise msafile @esl_msafile_utest@
+1 exercise msafile2 @esl_msafile2_utest@
+1 exercise msafile-a2m @esl_msafile_a2m_utest@
+1 exercise msafile-afa @esl_msafile_afa_utest@
+1 exercise msafile-clustal @esl_msafile_clustal_utest@
+1 exercise msafile-phylip @esl_msafile_phylip_utest@
+1 exercise msafile-psiblast @esl_msafile_psiblast_utest@
+1 exercise msafile-selex @esl_msafile_selex_utest@
+1 exercise msafile-stockholm @esl_msafile_stockholm_utest@
+1 exercise msaweight-utest @esl_msaweight_utest@
+1 exercise normal-utest @esl_normal_utest@
+1 exercise random-utest @esl_random_utest@
+1 exercise randomseq-utest @esl_randomseq_utest@
+1 exercise ratematrix-utest @esl_ratematrix_utest@
+1 exercise recorder-utest @esl_recorder_utest@
+1 exercise regexp-utest @esl_regexp_utest@
+1 exercise rootfinder-utest @esl_rootfinder_utest@
+1 exercise scorematrix-utest @esl_scorematrix_utest@
+1 exercise sq-utest @esl_sq_utest@
+1 exercise sqio-utest @esl_sqio_utest@
+1 exercise sse-utest @esl_sse_utest@
+1 exercise ssi-utest @esl_ssi_utest@
+1 exercise stack-utest @esl_stack_utest@
+1 exercise stats-utest @esl_stats_utest@
+1 exercise stretchexp-utest @esl_stretchexp_utest@
+1 exercise tree-utest @esl_tree_utest@
+1 exercise vectorops-utest @esl_vectorops_utest@
+1 exercise weibull-utest @esl_weibull_utest@
+1 exercise wuss-utest @esl_wuss_utest@
+
+1 exercise e2 !testsuite/e2.sh! @miniapps/esl-seqstat@ !formats/stockholm.1!
+
+1 exercise degen-residues !testsuite/i1-degen-residues.pl! @@ !! %TESTPFX%
+1 exercise ncbi-indices !testsuite/i2-ncbi-indices.pl! @@ !! %TESTPFX%
+1 exercise blank-gf !testsuite/i3-blank-gf.pl! @@ !! %TESTPFX%
+
+1 exercise esl-translate !miniapps/esl-translate.itest.pl! @@ !! %TESTPFX%
+
+1 exercise esl-afetch !miniapps/esl-afetch.itest.pl! @miniapps/esl-afetch@ %TESTPFX%
+1 exercise esl-alimanip !miniapps/esl-alimanip.itest.pl! @miniapps/esl-alimanip@ %TESTPFX%
+1 exercise esl-alimap !miniapps/esl-alimap.itest.pl! @miniapps/esl-alimap@ %TESTPFX%
+1 exercise esl-alimask !miniapps/esl-alimask.itest.pl! @miniapps/esl-alimask@ %TESTPFX%
+1 exercise esl-alimerge !miniapps/esl-alimerge.itest.pl! @miniapps/esl-alimerge@ %TESTPFX%
+1 exercise esl-alistat !miniapps/esl-alistat.itest.pl! @miniapps/esl-alistat@ %TESTPFX%
+1 exercise esl-compalign !miniapps/esl-compalign.itest.pl! @miniapps/esl-compalign@ %TESTPFX%
+1 exercise esl-construct !miniapps/esl-construct.itest.pl! @miniapps/esl-construct@ %TESTPFX%
+1 exercise esl-mask !miniapps/esl-mask.itest.pl! @miniapps/esl-mask@ %TESTPFX%
+1 exercise esl-seqrange !miniapps/esl-seqrange.itest.pl! @miniapps/esl-seqrange@ @miniapps/esl-sfetch@ %TESTPFX%
+1 exercise esl-shuffle !miniapps/esl-shuffle.itest.pl! @miniapps/esl-shuffle@ %TESTPFX%
+1 exercise esl-ssdraw !miniapps/esl-ssdraw.itest.pl! @miniapps/esl-ssdraw@ !testsuite/trna-ssdraw.ps! !testsuite/trna-5.stk! %TESTPFX%
+
+
+# Still to do:
+# gev
+# minimizer
+# mixgev
+# mpi
+# paml
+# swat
+# interface_gsl
+# interface_lapack
+
+################################################################
+# valgrind tests (optional. 'export SQC_VALGRIND=1; make SQCLEVEL=3 check'
+################################################################
+
+3 valgrind alphabet-utest @esl_alphabet_utest@
+3 valgrind cluster-utest @esl_cluster_utest@
+3 valgrind dirichlet-utest @esl_dirichlet_utest@
+3 valgrind distance-utest @esl_distance_utest@
+3 valgrind dmatrix-utest @esl_dmatrix_utest@
+3 valgrind easel-utest @easel_utest@
+3 valgrind exponential-utest @esl_exponential_utest@
+3 valgrind fileparser-utest @esl_fileparser_utest@
+3 valgrind gamma-utest @esl_gamma_utest@
+3 valgrind getopts-utest @esl_getopts_utest@
+3 valgrind gumbel-utest @esl_gumbel_utest@
+3 valgrind histogram-utest @esl_histogram_utest@
+3 valgrind hyperexp-utest @esl_hyperexp_utest@
+3 valgrind keyhash-utest @esl_keyhash_utest@
+3 valgrind mem-utest @esl_mem_utest@
+3 valgrind msa-utest @esl_msa_utest@
+3 valgrind msafile @esl_msafile_utest@
+3 valgrind msafile2 @esl_msafile2_utest@
+3 valgrind msafile-a2m @esl_msafile_a2m_utest@
+3 valgrind msafile-afa @esl_msafile_afa_utest@
+3 valgrind msafile-clustal @esl_msafile_clustal_utest@
+3 valgrind msafile-phylip @esl_msafile_phylip_utest@
+3 valgrind msafile-psiblast @esl_msafile_psiblast_utest@
+3 valgrind msafile-selex @esl_msafile_selex_utest@
+3 valgrind msafile-stockholm @esl_msafile_stockholm_utest@
+3 valgrind msacluster-utest @esl_msacluster_utest@
+3 valgrind msaweight-utest @esl_msaweight_utest@
+3 valgrind normal-utest @esl_normal_utest@
+3 valgrind random-utest @esl_random_utest@
+3 valgrind randomseq-utest @esl_randomseq_utest@
+3 valgrind ratematrix-utest @esl_ratematrix_utest@
+3 valgrind recorder-utest @esl_recorder_utest@
+3 valgrind regexp-utest @esl_regexp_utest@
+3 valgrind rootfinder-utest @esl_rootfinder_utest@
+3 valgrind scorematrix-utest @esl_scorematrix_utest@
+3 valgrind sq-utest @esl_sq_utest@
+3 valgrind sqio-utest @esl_sqio_utest@
+3 valgrind sse-utest @esl_sse_utest@
+3 valgrind ssi-utest @esl_ssi_utest@
+3 valgrind stack-utest @esl_stack_utest@
+3 valgrind stats-utest @esl_stats_utest@
+3 valgrind stretchexp-utest @esl_stretchexp_utest@
+3 valgrind tree-utest @esl_tree_utest@
+3 valgrind vectorops-utest @esl_vectorops_utest@
+3 valgrind weibull-utest @esl_weibull_utest@
+3 valgrind wuss-utest @esl_wuss_utest@
+
+### esl_buffer_utest exercises valgrind bug #258294 on OSX
+### still open in valgrind 3.6.1 (Feb 2011)
+### reinstate the test when valgrind updates
+# 3 valgrind buffer-utest @esl_buffer_utest@
+
+
+################################################################
+# SVN $URL$
+# SVN $Id: testsuite.sqc 714 2011-07-29 21:26:26Z eddys $
+################################################################
+
diff --git a/testsuite/trna-5.stk b/testsuite/trna-5.stk
new file mode 100644
index 0000000..eba1682
--- /dev/null
+++ b/testsuite/trna-5.stk
@@ -0,0 +1,16 @@
+# STOCKHOLM 1.0
+#=GF AU Infernal 0.1
+
+tRNA1 GCGGAUUUAGCUCAGUuGGG.AGAGCGCCAGACUGAAGAUCUGGAGGuCCUGUGUUCGAUCCACAGAAUUCGCA
+#=GR tRNA1 PP ****************9887.*****************************************************
+tRNA2 UCCGAUAUAGUGUAAC.GGCuAUCACAUCACGCUUUCACCGUGGAGA.CCGGGGUUCGACUCCCCGUAUCGGAG
+#=GR tRNA2 PP ****************.8888**************************.**************************
+tRNA3 UCCGUGAUAGUUUAAU.GGUcAGAAUGGGCGCUUGUCGCGUGCCAGA.UCGGGGUUCAAUUCCCCGUCGCGGAG
+#=GR tRNA3 PP ****************.******************************.**************************
+tRNA4 GCUCGUAUGGCGCAGU.GGU.AGCGCAGCAGAUUGCAAAUCUGUUGGuCCUUAGUUCGAUCCUGAGUGCGAGCU
+#=GR tRNA4 PP ****************.***.*****************************************************
+tRNA5 ....ACAUGGCGCAGUuGGU.AGCGCGCUUCCCUUGCAAGGAAGAGGuCAUCGGUUCGAUUCCGGUUGC.....
+#=GR tRNA5 PP ....****************.************************************************.....
+#=GC SS_cons (((((((,,<<<<___.___._>>>>,<<<<<_______>>>>>,,,.,<<<<<_______>>>>>))))))):
+#=GC RF gccccugUAGcucAaU.GGU.AgagCauuggaCUuuuAAuccaaagg.ugugGGUUCgAaUCCcaccaggggcA
+//
diff --git a/testsuite/trna-ssdraw.ps b/testsuite/trna-ssdraw.ps
new file mode 100644
index 0000000..6919503
--- /dev/null
+++ b/testsuite/trna-ssdraw.ps
@@ -0,0 +1,181 @@
+% begin ignore
+%
+% trna-ssdraw.ps:
+% An esl-ssdraw postscript template file for drawing
+% tRNA secondary structure diagrams. The input alignment
+% must be of consensus length (nongap RF length) of 71.
+% This corresponds to the Rfam 9.1 RF00005 tRNA model
+% (http://rfam.sanger.ac.uk/). That is, this template
+% file can be used with alignments generated by Infernal's
+% 'cmalign' program using the Rfam 9.1 tRNA CM.
+%
+% setup defaults
+/Helvetica findfont 8.00 scalefont setfont
+0.00 0.00 0.00 1.00 setcmykcolor
+1.00 setlinewidth
+% end ignore
+
+% begin modelname
+% tRNA
+% end modelname
+
+% begin legend
+% 34 -80. -30. 10 0.
+% end legend
+
+% begin scale
+1.7 1.7 scale
+% end scale
+
+% begin regurgitate
+/Helvetica findfont 6.00 scalefont setfont
+0.00 0.00 0.00 1.00 setcmykcolor
+(5') 164.00 400.00 moveto show
+(3') 192.00 408.00 moveto show
+1.00 setlinewidth
+0.00 0.00 0.00 1.00 setcmykcolor
+165.50 238.00 188.50 238.00 newpath moveto lineto stroke
+166.00 244.00 166.00 238.00 newpath moveto lineto stroke
+188.00 244.00 188.00 238.00 newpath moveto lineto stroke
+(anticodon) 164.25 230.00 moveto show
+% end regurgitate
+
+% begin ignore
+% reset 8.0 fontsize
+/Helvetica findfont 8.00 scalefont setfont
+% end ignore
+
+% begin text positiontext
+(20) 124.00 297.00 moveto show
+(40) 194.50 287.00 moveto show
+(60) 211.00 354.00 moveto show
+% end text positiontext
+
+% begin lines positionticks
+151.82 331.76 148.86 338.65 newpath moveto lineto stroke
+122.05 310.19 124.69 303.17 newpath moveto lineto stroke
+168.09 273.73 160.81 275.55 newpath moveto lineto stroke
+186.00 289.00 193.50 289.00 newpath moveto lineto stroke
+215.00 326.00 215.00 318.50 newpath moveto lineto stroke
+215.00 344.00 215.00 351.50 newpath moveto lineto stroke
+185.91 394.27 193.19 392.45 newpath moveto lineto stroke
+% end lines positionticks
+
+% begin ignore
+% set color to grey for bpconnect lines
+0.00 0.00 0.00 0.50 setcmykcolor
+% end ignore
+
+% begin lines bpconnects
+179.00 394.00 175.00 394.00 newpath moveto lineto stroke
+179.00 386.00 175.00 386.00 newpath moveto lineto stroke
+179.00 378.00 175.00 378.00 newpath moveto lineto stroke
+179.00 370.00 175.00 370.00 newpath moveto lineto stroke
+179.00 362.00 175.00 362.00 newpath moveto lineto stroke
+179.00 354.00 175.00 354.00 newpath moveto lineto stroke
+179.00 346.00 175.00 346.00 newpath moveto lineto stroke
+153.00 321.00 153.00 325.00 newpath moveto lineto stroke
+145.00 321.00 145.00 325.00 newpath moveto lineto stroke
+137.00 321.00 137.00 325.00 newpath moveto lineto stroke
+129.00 321.00 129.00 325.00 newpath moveto lineto stroke
+179.00 304.00 175.00 304.00 newpath moveto lineto stroke
+179.00 296.00 175.00 296.00 newpath moveto lineto stroke
+179.00 288.00 175.00 288.00 newpath moveto lineto stroke
+179.00 280.00 175.00 280.00 newpath moveto lineto stroke
+179.00 272.00 175.00 272.00 newpath moveto lineto stroke
+191.00 337.00 191.00 333.00 newpath moveto lineto stroke
+199.00 337.00 199.00 333.00 newpath moveto lineto stroke
+207.00 337.00 207.00 333.00 newpath moveto lineto stroke
+215.00 337.00 215.00 333.00 newpath moveto lineto stroke
+223.00 337.00 223.00 333.00 newpath moveto lineto stroke
+% end lines bpconnects
+
+% begin ignore
+% reset color to black
+0.00 0.00 0.00 1.00 setcmykcolor
+% end ignore
+
+% begin text nucleotides
+(G) 168.00 392.00 moveto show
+(C) 168.00 384.00 moveto show
+(G) 168.00 376.00 moveto show
+(G) 168.00 368.00 moveto show
+(A) 168.00 360.00 moveto show
+(U) 168.00 352.00 moveto show
+(U) 168.00 344.00 moveto show
+(U) 162.00 338.00 moveto show
+(A) 156.00 332.00 moveto show
+% nucleotide 10 on next line
+(G) 150.00 326.00 moveto show
+(C) 142.00 326.00 moveto show
+(U) 134.00 326.00 moveto show
+(C) 126.00 326.00 moveto show
+(A) 118.00 330.00 moveto show
+(G) 110.00 332.00 moveto show
+(U) 102.00 328.00 moveto show
+(U) 99.00 320.00 moveto show
+(G) 102.00 312.00 moveto show
+(G) 110.00 308.00 moveto show
+% nucleotide 20 on next line
+(A) 118.00 310.00 moveto show
+(G) 126.00 314.00 moveto show
+(A) 134.00 314.00 moveto show
+(G) 142.00 314.00 moveto show
+(C) 150.00 314.00 moveto show
+(G) 159.00 308.00 moveto show
+(C) 168.00 302.00 moveto show
+(C) 168.00 294.00 moveto show
+(A) 168.00 286.00 moveto show
+(G) 168.00 278.00 moveto show
+% nucleotide 30 on next line
+(A) 168.00 270.00 moveto show
+(C) 164.00 262.00 moveto show
+(U) 162.00 254.00 moveto show
+(G) 166.00 246.00 moveto show
+(A) 174.00 243.00 moveto show
+(A) 182.00 246.00 moveto show
+(G) 186.00 254.00 moveto show
+(A) 184.00 262.00 moveto show
+(U) 180.00 270.00 moveto show
+(C) 180.00 278.00 moveto show
+% nucleotide 40 on next line
+(U) 180.00 286.00 moveto show
+(G) 180.00 294.00 moveto show
+(G) 180.00 302.00 moveto show
+(A) 188.00 306.00 moveto show
+(G) 196.00 306.00 moveto show
+(U) 200.00 314.00 moveto show
+(U) 192.00 318.00 moveto show
+(C) 188.00 326.00 moveto show
+(U) 196.00 326.00 moveto show
+(G) 204.00 326.00 moveto show
+% nucleotide 50 on next line
+(U) 212.00 326.00 moveto show
+(G) 220.00 326.00 moveto show
+(U) 228.00 322.00 moveto show
+(U) 236.00 320.00 moveto show
+(C) 244.00 324.00 moveto show
+(G) 247.00 332.00 moveto show
+(A) 244.00 340.00 moveto show
+(U) 236.00 344.00 moveto show
+(C) 228.00 342.00 moveto show
+(C) 220.00 338.00 moveto show
+% nucleotide 60 on next line
+(A) 212.00 338.00 moveto show
+(C) 204.00 338.00 moveto show
+(A) 196.00 338.00 moveto show
+(G) 188.00 338.00 moveto show
+(A) 180.00 344.00 moveto show
+(A) 180.00 352.00 moveto show
+(U) 180.00 360.00 moveto show
+(U) 180.00 368.00 moveto show
+(C) 180.00 376.00 moveto show
+(G) 180.00 384.00 moveto show
+% nucleotide 70 on next line
+(C) 180.00 392.00 moveto show
+(A) 184.00 400.00 moveto show
+% end text nucleotides
+
+% begin ignore
+showpage
+% end ignore
diff --git a/testsuite/valgrind_report.pl b/testsuite/valgrind_report.pl
new file mode 100755
index 0000000..ac4100e
--- /dev/null
+++ b/testsuite/valgrind_report.pl
@@ -0,0 +1,107 @@
+#! /usr/bin/perl
+
+# Run the testsuite under Valgrind, to check for memory leakage.
+#
+# First you have to do a 'make dev' or 'make check', or equiv;
+# all the unit test drivers need to be compiled and present.
+#
+# Usage:
+# valgrind_report.pl <top_builddir> <top_srcdir>
+#
+# Example, in a single directory (source+build):
+# ./configure --enable-debugging
+# make dev
+# testsuite/valgrind_report.pl . .
+#
+# Example, in separate build dir:
+# mkdir build_dir
+# cd build_dir
+# ../configure --enable-debugging
+# make dev
+# ../testsuite/valgrind_report.pl . ..
+#
+
+use File::Basename;
+
+if ($#ARGV+1 != 2) { die("Usage: valgrind_report.pl <top_builddir> <top_srcdir>"); }
+$top_builddir = shift;
+$top_srcdir = shift;
+
+printf("Memory leak testing for Easel, using valgrind:\n\n");
+
+ at modules = <$top_srcdir/esl_*.c>;
+unshift(@modules, "$top_srcdir/easel.c");
+
+$nmodules = 0;
+$npresent = 0;
+$ncompiled = 0;
+$nsuccess = 0;
+$nleaking = 0;
+foreach $module (@modules) {
+ $basecfile = fileparse($module);
+ $nmodules++;
+
+ # create the eslDMATRIX_TESTDRIVE flag and esl_dmatrix_utest program name from esl_dmatrix.c
+ if ($basecfile =~ /^(esl_)?(\S+).c/) {
+ $pfx = $1;
+ $base = $2;
+ $progname = $pfx.$base."_utest";
+ $base =~ tr/a-z/A-Z/;
+ $flag = "esl".$base."_TESTDRIVE";
+ }
+
+ printf("%-28s ", $basecfile);
+
+ # one way to fail: there isn't a test driver at all
+ `grep $flag $module`;
+ if ($? != 0) { printf(" [NO DRIVER]\n"); next; }
+ $npresent++;
+
+ # Some unit tests aren't compiled.
+ # That can be normal: for example, esl_mpi_utest on a non-MPI system
+ if (! -x "$top_builddir/$progname") { printf(" [UTEST NOT COMPILED]\n"); next; }
+ $ncompiled++;
+
+ $output = `valgrind $top_builddir/$progname 2>&1`;
+ if ($? != 0) { printf(" [VALGRIND FAILED]\n"); next; };
+ $nsuccess++;
+
+ if ($output =~ / definitely lost: (\S+) bytes in (\S+) blocks/)
+ {
+ if ($1 > 0) {
+ $nleaking++;
+ print("[LEAK DETECTED ]\n");
+ } else {
+ print("ok.\n");
+ }
+ } else { print "<< problem parsing valgrind output >>\n"; }
+}
+
+printf("\nOf %d total modules in Easel:\n", $nmodules);
+if ($npresent != $nmodules) {
+ printf(" - %d have test drivers written, %d do not\n", $npresent, $nmodules-$npresent);
+} else {
+ printf(" - All %d have test drivers written\n", $npresent);
+}
+if ($ncompiled != $npresent) {
+ printf(" - %d test drivers were found compiled; %d were not\n", $ncompiled, $npresent-$ncompiled);
+} else {
+ printf(" - All %d test drivers were found compiled\n", $ncompiled);
+}
+if ($nsuccess != $ncompiled) {
+ printf(" - %d ran successfully, %d did not\n", $nsuccess, $ncompiled-$nsuccess);
+} else {
+ printf(" - All %d ran successfully\n", $nsuccess);
+}
+
+print "\n";
+if ($nleaking == 0) {
+ printf("None of %d modules with running test drivers show memory leaks\n", $nsuccess);
+} else {
+ printf("%d of %d modules with running test drivers are leaking.\n", $nleaking, $nsuccess);
+}
+
+
+# SRE, Fri Mar 2 08:37:48 2007 [Janelia]
+# SVN $Id$
+# SVN $URL$
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/easel.git
More information about the debian-med-commit
mailing list